diff --git a/.changeset/better-shrimps-beam.md b/.changeset/better-shrimps-beam.md new file mode 100644 index 0000000000..a9371547dc --- /dev/null +++ b/.changeset/better-shrimps-beam.md @@ -0,0 +1,7 @@ +--- +'@skeletonlabs/skeleton-common': minor +'@skeletonlabs/skeleton-svelte': minor +'@skeletonlabs/skeleton-react': minor +--- + +feat: tooltip diff --git a/.changeset/calm-rooms-marry.md b/.changeset/calm-rooms-marry.md new file mode 100644 index 0000000000..fdc322ce78 --- /dev/null +++ b/.changeset/calm-rooms-marry.md @@ -0,0 +1,7 @@ +--- +'@skeletonlabs/skeleton-common': minor +'@skeletonlabs/skeleton-svelte': minor +'@skeletonlabs/skeleton-react': minor +--- + +feat: dialog diff --git a/.changeset/clear-places-shout.md b/.changeset/clear-places-shout.md new file mode 100644 index 0000000000..79eb30a2ed --- /dev/null +++ b/.changeset/clear-places-shout.md @@ -0,0 +1,7 @@ +--- +'@skeletonlabs/skeleton-common': minor +'@skeletonlabs/skeleton-svelte': minor +'@skeletonlabs/skeleton-react': minor +--- + +feat: toast diff --git a/.changeset/config.json b/.changeset/config.json new file mode 100644 index 0000000000..f09698799d --- /dev/null +++ b/.changeset/config.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://unpkg.com/@changesets/config@3.1.0/schema.json", + "changelog": ["@svitejs/changesets-changelog-github.amrom.workers.devpact", { "repo": "skeletonlabs/skeleton" }], + "commit": false, + "fixed": [], + "prettier": false, + "linked": [], + "access": "public", + "baseBranch": "main", + "updateInternalDependencies": "patch", + "privatePackages": { + "tag": false, + "version": false + } +} diff --git a/.changeset/dry-coats-return.md b/.changeset/dry-coats-return.md new file mode 100644 index 0000000000..6935bee642 --- /dev/null +++ b/.changeset/dry-coats-return.md @@ -0,0 +1,7 @@ +--- +'@skeletonlabs/skeleton-common': minor +'@skeletonlabs/skeleton-svelte': minor +'@skeletonlabs/skeleton-react': minor +--- + +feat: tabs diff --git a/.changeset/eleven-comics-tease.md b/.changeset/eleven-comics-tease.md new file mode 100644 index 0000000000..320c978cee --- /dev/null +++ b/.changeset/eleven-comics-tease.md @@ -0,0 +1,6 @@ +--- +'@skeletonlabs/skeleton-svelte': minor +'@skeletonlabs/skeleton-react': minor +--- + +feat: portal diff --git a/.changeset/evil-hands-obey.md b/.changeset/evil-hands-obey.md new file mode 100644 index 0000000000..58e670efa8 --- /dev/null +++ b/.changeset/evil-hands-obey.md @@ -0,0 +1,8 @@ +--- +'@skeletonlabs/skeleton-common': minor +'@skeletonlabs/skeleton-svelte': minor +'@skeletonlabs/skeleton-react': minor +'@skeletonlabs/skeleton': patch +--- + +feat: progress-linear diff --git a/.changeset/five-snakes-love.md b/.changeset/five-snakes-love.md new file mode 100644 index 0000000000..a77e644e97 --- /dev/null +++ b/.changeset/five-snakes-love.md @@ -0,0 +1,7 @@ +--- +'@skeletonlabs/skeleton-common': minor +'@skeletonlabs/skeleton-svelte': minor +'@skeletonlabs/skeleton-react': minor +--- + +feat: combobox diff --git a/.changeset/forty-badgers-clap.md b/.changeset/forty-badgers-clap.md new file mode 100644 index 0000000000..d6b3dd7fcf --- /dev/null +++ b/.changeset/forty-badgers-clap.md @@ -0,0 +1,6 @@ +--- +'@skeletonlabs/skeleton-svelte': minor +'@skeletonlabs/skeleton-react': minor +--- + +feat: Use classes inside `@skeletonlabs/skeleton-common` to dedupe tailwind classes diff --git a/.changeset/great-eagles-glow.md b/.changeset/great-eagles-glow.md new file mode 100644 index 0000000000..0a5d6134a3 --- /dev/null +++ b/.changeset/great-eagles-glow.md @@ -0,0 +1,7 @@ +--- +'@skeletonlabs/skeleton-common': minor +'@skeletonlabs/skeleton-svelte': minor +'@skeletonlabs/skeleton-react': minor +--- + +feat: tags input diff --git a/.changeset/hot-beers-think.md b/.changeset/hot-beers-think.md new file mode 100644 index 0000000000..c8cdf2a8f0 --- /dev/null +++ b/.changeset/hot-beers-think.md @@ -0,0 +1,7 @@ +--- +'@skeletonlabs/skeleton-common': minor +'@skeletonlabs/skeleton-svelte': minor +'@skeletonlabs/skeleton-react': minor +--- + +feat: switch diff --git a/.changeset/kind-feet-serve.md b/.changeset/kind-feet-serve.md new file mode 100644 index 0000000000..0438f233d7 --- /dev/null +++ b/.changeset/kind-feet-serve.md @@ -0,0 +1,8 @@ +--- +'@skeletonlabs/skeleton-common': major +'@skeletonlabs/skeleton-svelte': major +'@skeletonlabs/skeleton-react': major +'@skeletonlabs/skeleton': major +--- + +feat: v4 preperation diff --git a/.changeset/legal-suits-write.md b/.changeset/legal-suits-write.md new file mode 100644 index 0000000000..2331d3b1b0 --- /dev/null +++ b/.changeset/legal-suits-write.md @@ -0,0 +1,7 @@ +--- +'@skeletonlabs/skeleton-common': minor +'@skeletonlabs/skeleton-svelte': minor +'@skeletonlabs/skeleton-react': minor +--- + +feat: rating-group diff --git a/.changeset/little-files-notice.md b/.changeset/little-files-notice.md new file mode 100644 index 0000000000..62ef27b127 --- /dev/null +++ b/.changeset/little-files-notice.md @@ -0,0 +1,5 @@ +--- +'@skeletonlabs/skeleton': minor +--- + +feat: Add framework package `@source` rules to remove the need for users to explicitely add these diff --git a/.changeset/major-trains-enter.md b/.changeset/major-trains-enter.md new file mode 100644 index 0000000000..0252eab5ed --- /dev/null +++ b/.changeset/major-trains-enter.md @@ -0,0 +1,7 @@ +--- +'@skeletonlabs/skeleton-common': minor +'@skeletonlabs/skeleton-svelte': minor +'@skeletonlabs/skeleton-react': minor +--- + +feat: popover diff --git a/.changeset/mean-nights-repeat.md b/.changeset/mean-nights-repeat.md new file mode 100644 index 0000000000..8e4be07654 --- /dev/null +++ b/.changeset/mean-nights-repeat.md @@ -0,0 +1,7 @@ +--- +'@skeletonlabs/skeleton-common': minor +'@skeletonlabs/skeleton-react': minor +'@skeletonlabs/skeleton-svelte': minor +--- + +feat: slider diff --git a/.changeset/neat-clubs-agree.md b/.changeset/neat-clubs-agree.md new file mode 100644 index 0000000000..4b812ae985 --- /dev/null +++ b/.changeset/neat-clubs-agree.md @@ -0,0 +1,6 @@ +--- +'@skeletonlabs/skeleton-svelte': patch +'@skeletonlabs/skeleton-react': patch +--- + +fix: override skeleton specific attributes diff --git a/.changeset/orange-towns-teach.md b/.changeset/orange-towns-teach.md new file mode 100644 index 0000000000..0804444d83 --- /dev/null +++ b/.changeset/orange-towns-teach.md @@ -0,0 +1,5 @@ +--- +'@skeletonlabs/skeleton': minor +--- + +feat: merge optional `preset` styles into core diff --git a/.changeset/pre.json b/.changeset/pre.json new file mode 100644 index 0000000000..f72e719cd3 --- /dev/null +++ b/.changeset/pre.json @@ -0,0 +1,44 @@ +{ + "mode": "pre", + "tag": "next", + "initialVersions": { + "skeleton": "1.0.0", + "@skeletonlabs/skeleton": "3.2.0", + "@skeletonlabs/skeleton-common": "0.0.1", + "@skeletonlabs/skeleton-react": "1.4.0", + "@skeletonlabs/skeleton-svelte": "1.5.1", + "@skeletonlabs/playground-skeleton-react": "0.0.1", + "@skeletonlabs/playground-skeleton-svelte": "0.0.1", + "@skeletonlabs/skeleton.dev": "0.0.1", + "@skeletonlabs/themes.skeleton.dev": "0.0.1" + }, + "changesets": [ + "better-shrimps-beam", + "calm-rooms-marry", + "clear-places-shout", + "dry-coats-return", + "eleven-comics-tease", + "evil-hands-obey", + "five-snakes-love", + "forty-badgers-clap", + "great-eagles-glow", + "hot-beers-think", + "kind-feet-serve", + "legal-suits-write", + "little-files-notice", + "major-trains-enter", + "mean-nights-repeat", + "neat-clubs-agree", + "orange-towns-teach", + "pretty-words-agree", + "purple-tigers-happen", + "quiet-bars-lay", + "silly-bottles-hope", + "slick-breads-wink", + "small-words-drum", + "strong-hotels-care", + "tidy-peaches-know", + "violet-signs-dream", + "yellow-jokes-walk" + ] +} diff --git a/.changeset/pretty-words-agree.md b/.changeset/pretty-words-agree.md new file mode 100644 index 0000000000..868f6b4c5f --- /dev/null +++ b/.changeset/pretty-words-agree.md @@ -0,0 +1,7 @@ +--- +'@skeletonlabs/skeleton-common': minor +'@skeletonlabs/skeleton-svelte': minor +'@skeletonlabs/skeleton-react': minor +--- + +feat: app-bar diff --git a/.changeset/purple-tigers-happen.md b/.changeset/purple-tigers-happen.md new file mode 100644 index 0000000000..e780a0db98 --- /dev/null +++ b/.changeset/purple-tigers-happen.md @@ -0,0 +1,5 @@ +--- +'skeleton': patch +--- + +perf: Reduce overhead in v3 module migrations diff --git a/.changeset/quiet-bars-lay.md b/.changeset/quiet-bars-lay.md new file mode 100644 index 0000000000..0d5e974d19 --- /dev/null +++ b/.changeset/quiet-bars-lay.md @@ -0,0 +1,7 @@ +--- +'@skeletonlabs/skeleton-common': minor +'@skeletonlabs/skeleton-svelte': minor +'@skeletonlabs/skeleton-react': minor +--- + +feat: segmented control diff --git a/.changeset/silly-bottles-hope.md b/.changeset/silly-bottles-hope.md new file mode 100644 index 0000000000..79b74a0819 --- /dev/null +++ b/.changeset/silly-bottles-hope.md @@ -0,0 +1,7 @@ +--- +'@skeletonlabs/skeleton-common': minor +'@skeletonlabs/skeleton-svelte': minor +'@skeletonlabs/skeleton-react': minor +--- + +feat: file-upload diff --git a/.changeset/slick-breads-wink.md b/.changeset/slick-breads-wink.md new file mode 100644 index 0000000000..f2cfc0dd67 --- /dev/null +++ b/.changeset/slick-breads-wink.md @@ -0,0 +1,5 @@ +--- +'@skeletonlabs/skeleton': patch +--- + +fix: replace `all` with dedicated transition properties on `btn` utility diff --git a/.changeset/small-words-drum.md b/.changeset/small-words-drum.md new file mode 100644 index 0000000000..cb0deb3170 --- /dev/null +++ b/.changeset/small-words-drum.md @@ -0,0 +1,5 @@ +--- +'@skeletonlabs/skeleton-common': patch +--- + +feat: init diff --git a/.changeset/strong-hotels-care.md b/.changeset/strong-hotels-care.md new file mode 100644 index 0000000000..c415b5d526 --- /dev/null +++ b/.changeset/strong-hotels-care.md @@ -0,0 +1,9 @@ +--- +'skeleton': patch +'@skeletonlabs/skeleton': patch +'@skeletonlabs/skeleton-common': patch +'@skeletonlabs/skeleton-react': patch +'@skeletonlabs/skeleton-svelte': patch +--- + +chore: trusted publishing diff --git a/.changeset/tidy-peaches-know.md b/.changeset/tidy-peaches-know.md new file mode 100644 index 0000000000..ce762fc65f --- /dev/null +++ b/.changeset/tidy-peaches-know.md @@ -0,0 +1,8 @@ +--- +'@skeletonlabs/skeleton-svelte': patch +'@skeletonlabs/skeleton-react': patch +'@skeletonlabs/skeleton': patch +'skeleton': patch +--- + +chore: update readme diff --git a/.changeset/violet-signs-dream.md b/.changeset/violet-signs-dream.md new file mode 100644 index 0000000000..777d292baa --- /dev/null +++ b/.changeset/violet-signs-dream.md @@ -0,0 +1,5 @@ +--- +'@skeletonlabs/skeleton-svelte': patch +--- + +fix: dependency range diff --git a/.changeset/yellow-jokes-walk.md b/.changeset/yellow-jokes-walk.md new file mode 100644 index 0000000000..9734df3447 --- /dev/null +++ b/.changeset/yellow-jokes-walk.md @@ -0,0 +1,5 @@ +--- +'@skeletonlabs/skeleton': patch +--- + +fix: disable hover styles for `btn` when `disabled` diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000000..d029f52fc6 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,8 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_style = tab +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/.eslintrc.cjs b/.eslintrc.cjs deleted file mode 100644 index 3ccf435f02..0000000000 --- a/.eslintrc.cjs +++ /dev/null @@ -1,20 +0,0 @@ -module.exports = { - root: true, - parser: '@typescript-eslint/parser', - extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'prettier'], - plugins: ['svelte3', '@typescript-eslint'], - ignorePatterns: ['*.cjs'], - overrides: [{ files: ['*.svelte'], processor: 'svelte3/svelte3' }], - settings: { - 'svelte3/typescript': () => require('typescript') - }, - parserOptions: { - sourceType: 'module', - ecmaVersion: 2020 - }, - env: { - browser: true, - es2017: true, - node: true - } -}; diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 6959736dca..295485d0cc 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,9 +1,9 @@ # These are supported funding model platforms -github: [Brain-Bones] -patreon: # Replace with a single Patreon username +github: [skeletonlabs] +patreon: 'user?u=83786276' # Replace with a single Patreon username open_collective: # Replace with a single Open Collective username -ko_fi: # Replace with a single Ko-fi username +ko_fi: skeletonlabs # Replace with a single Ko-fi username tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry liberapay: # Replace with a single Liberapay username diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index cca678e070..3b7320fc2b 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -1,30 +1,59 @@ name: 🐞 Bug -description: File a bug/issue -title: "" +description: Report an issue or bug labels: [bug] +type: Bug body: -- type: textarea - attributes: - label: Current Behavior - description: A description of what you're experiencing. - validations: - required: false -- type: textarea - attributes: - label: Steps To Reproduce - description: Steps to reproduce the behavior. - placeholder: | - 1. Using this component... - 2. With these properties... - 3. Click '...' - 4. See error... - validations: - required: false -- type: textarea - attributes: - label: Anything else? - description: | - Links? References? Anything that will give us more context about the issue you are encountering! - Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in. - validations: - required: false \ No newline at end of file + - type: textarea + attributes: + label: Current Behavior + description: A description of what you're experiencing. + validations: + required: false + - type: textarea + attributes: + label: Expected Behavior + description: How do you think should it behave. + validations: + required: false + - type: textarea + attributes: + label: Steps To Reproduce + description: Describe how to reproduce the issue. + placeholder: | + 1. Using this component... + 2. With these properties... + 3. Click '...' + 4. See error... + validations: + required: false + - type: input + id: reproduction + attributes: + label: Link to Reproduction / Stackblitz + - type: textarea + attributes: + label: Environment Information + description: Relevant information about your environment. Use `npx envinfo --system --npmPackages "@skeletonlabs/*" --binaries --browsers` to get this information. + placeholder: | + System: + OS: Windows 11 10.0.26100 + CPU: (12) x64 12th Gen Intel(R) Core(TM) i5-12400 + Memory: 4.72 GB / 15.78 GB + Binaries: + Node: 22.11.0 - C:\Program Files\nodejs\node.EXE + Yarn: 1.22.19 - ~\AppData\Roaming\npm\yarn.CMD + npm: 10.2.0 - C:\Program Files\nodejs\npm.CMD + pnpm: 9.6.0 - ~\AppData\Local\pnpm\pnpm.CMD + Browsers: + Edge: Chromium (130.0.2849.46) + Internet Explorer: 11.0.26100.1882 + npmPackages: + @skeletonlabs/skeleton: ^3.0.0-next.10 => 3.0.0-next.10 + @skeletonlabs/skeleton-react: ^1.0.0-next.13 => 1.0.0-next.13 + - type: textarea + attributes: + label: More Information + description: | + Provide relevant links or additional information. + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 9150f0fc25..8341c1e7fd 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,8 +1,11 @@ blank_issues_enabled: true contact_links: + - name: Having problems with the Skeleton CLI? + url: https://github.com/skeletonlabs/skeleton/issues/new?template=bug_report.yml + about: Please report issues using the bug report template. - name: Get support on Discord - url: https://discord.com/channels/1003691521280856084/1003691521721245792 - about: Get help from the maintainers on Discord + url: https://discord.com/channels/1003691521280856084/1151213014721241128 + about: Get help from the maintainers on Discord. - name: Ask a question, give feedback, share your project - url: https://github.com/Brain-Bones/skeleton/discussions - about: Connect with other community members with GitHub discussions + url: https://github.com/skeletonlabs/skeleton/discussions + about: Connect with other community members with GitHub discussions. diff --git a/.github/ISSUE_TEMPLATE/docs_issue.yml b/.github/ISSUE_TEMPLATE/docs_issue.yml index 4d6b408f85..90f72d4828 100644 --- a/.github/ISSUE_TEMPLATE/docs_issue.yml +++ b/.github/ISSUE_TEMPLATE/docs_issue.yml @@ -1,23 +1,13 @@ name: 📗 Report Docs Issue -description: See a typo? Outdated or incorrect information? Let us know! -title: "<title>" +description: Use this to report a typo or incorrect information. labels: [documentation] +type: Task body: -- type: markdown - attributes: - value: Sometimes something slips through the cracks, and the documentation is not quite right. Thanks for letting us know! -- type: input - id: link - attributes: - label: Link to the Page -- type: textarea - id: quote - attributes: - label: Describe the Issue -- type: dropdown - id: participate - attributes: - label: Are you able to create a Pull Request with the fix? - options: - - 'Yes' - - 'No' + - type: input + id: link + attributes: + label: Link to the Page + - type: textarea + id: quote + attributes: + label: Describe the Issue (screenshots encouraged!) diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index a627c0ecc7..ea1e5a0b64 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -1,11 +1,12 @@ name: 🛠️ Request New Feature -description: Let us know what we should add. -labels: 'feature-request' +description: Let us know what you would like to see added. +labels: ['feature request'] +type: Feature body: - type: textarea id: description attributes: - label: Describe what feature you'd like. Pseudo-code, mockups, or screenshots of similar solutions are encouraged! + label: Describe the feature in detail (code, mocks, or screenshots encouraged) - type: dropdown id: category attributes: @@ -19,4 +20,4 @@ body: - type: textarea id: references attributes: - label: Any links to similar examples or other references we should review? + label: Provide relevant links or additional information. diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index f8527cddba..6cdaa7da2e 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,14 +1,28 @@ -## Before submitting the PR: -- [ ] Does your PR reference an issue? If not, please [chat to the team on Discord](https://discord.gg/EXqV7W8MtY) or [GitHub](https://github.com/Brain-Bones/skeleton/discussions) before submission. -- [ ] Did you you update and run tests before submission using `npm run test`? -- [ ] Does your branch follow our [naming convention](https://skeleton.brainandbonesllc.com/docs/contributions)? If not, please amend the branch name using `branch -m new-branch-name` -- [ ] Did you update documentation related to your new feature or changes? +## Linked Issue -## What does your PR address? +Closes #{issueNumber} -Please briefly describe your changes here. +## Description -### Tips -- Tap "convert to draft" to indicate this is work in progress. -- Link to an issue using the verbiage [Fixes #XX](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue#linking-a-pull-request-to-an-issue-using-a-keyword) -- Linked issues will auto-close when the PR is merged. \ No newline at end of file +{description} + +## Checklist + +Please read and apply all [contribution requirements](https://skeleton.dev/docs/resources/contribute/). + +- [ ] Your branch should be prefixed with: `docs/`, `feature/`, `chore/`, `bugfix/` +- [ ] Contributions should target the `main` branch +- [ ] Documentation should be updated to describe all relevant changes +- [ ] Run `pnpm check` in the root of the monorepo +- [ ] Run `pnpm format` in the root of the monorepo +- [ ] Run `pnpm lint` in the root of the monorepo +- [ ] Run `pnpm test` in the root of the monorepo +- [ ] If you modify `/package` projects, please supply a Changeset + +## Changesets + +[View our documentation](https://skeleton.dev/docs/resources/contribute/get-started#changesets) to learn more about [Changesets](https://github.com/changesets/changesets). To create a Changeset: + +1. Navigate to the root of the monorepo in your terminal +2. Run `pnpm changeset` and follow the prompts +3. Commit and push the changeset before flagging your PR review for review. diff --git a/.github/workflows/build-publish.yml b/.github/workflows/build-publish.yml new file mode 100644 index 0000000000..08b253fe78 --- /dev/null +++ b/.github/workflows/build-publish.yml @@ -0,0 +1,38 @@ +name: Publish Skeleton + +on: + push: + branches: + - main + +concurrency: ${{ github.workflow }}-${{ github.ref }} + +jobs: + release: + permissions: + contents: write + pull-requests: write + id-token: write + name: Build & Publish + if: github.repository == 'skeletonlabs/skeleton' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + with: + fetch-depth: 0 + - uses: pnpm/action-setup@v4 + - uses: actions/setup-node@v5 + with: + node-version: 22 + cache: pnpm + - run: npm install -g npm@latest + - name: Install dependencies + run: pnpm install + - name: Create Release Pull Request or Publish + id: changesets + uses: changesets/action@v1 + with: + version: pnpm changeset:version + publish: pnpm changeset:publish + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/code-quality.yml b/.github/workflows/code-quality.yml new file mode 100644 index 0000000000..b77bd607c9 --- /dev/null +++ b/.github/workflows/code-quality.yml @@ -0,0 +1,62 @@ +name: Code Quality + +on: + push: + branches: + - main + - v3 + pull_request: + +concurrency: + group: ${{ github.workflow }}-${{ github.event.number || github.sha }} + cancel-in-progress: true + +jobs: + format: + name: Format + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + - uses: pnpm/action-setup@v4 + - uses: actions/setup-node@v5 + with: + node-version: 22 + cache: pnpm + - run: pnpm install + - run: pnpm format:check + lint: + name: Lint + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + - uses: pnpm/action-setup@v4 + - uses: actions/setup-node@v5 + with: + node-version: 22 + cache: pnpm + - run: pnpm install + - run: pnpm lint:check + check: + name: Check + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + - uses: pnpm/action-setup@v4 + - uses: actions/setup-node@v5 + with: + node-version: 22 + cache: pnpm + - run: pnpm install + - run: pnpm check + test: + name: Test + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + - uses: pnpm/action-setup@v4 + - uses: actions/setup-node@v5 + with: + node-version: 22 + cache: pnpm + - run: pnpm install + - run: pnpm test diff --git a/.gitignore b/.gitignore index 69e7f1bfad..b1477992c8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,11 +1,28 @@ +# build output +out/ +dist/ +.vercel/ + +# generated +.astro/ +.svelte-kit/ +.next/ +next-env.d.ts +sites/skeleton.dev/src/content/types/*/*.json +**/pagefind + +# dependencies +node_modules/ + +# macOS-specific files .DS_Store -node_modules -/build -/.svelte-kit -/package -.env -.env.* -!.env.example -/coverage -pnpm-lock.yaml -.vscode \ No newline at end of file + +# build artifacts +**/vite.config.js.timestamp-* +**/vite.config.ts.timestamp-* + +# misc +.idea/ +.temp/ +*.tgz +.vscode/launch.json diff --git a/.oxlintrc.json b/.oxlintrc.json new file mode 100644 index 0000000000..05ebc7c6f2 --- /dev/null +++ b/.oxlintrc.json @@ -0,0 +1,15 @@ +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "plugins": ["typescript", "unicorn", "react", "react-perf", "oxc", "import"], + "categories": { + "correctness": "error" + }, + "overrides": [ + { + "files": ["*.svelte"], + "rules": { + "no-unassigned-vars": "off" + } + } + ] +} diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index e523a8ce4a..0000000000 --- a/.prettierrc +++ /dev/null @@ -1,6 +0,0 @@ -{ - "useTabs": true, - "singleQuote": true, - "trailingComma": "none", - "printWidth": 200 -} diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000000..bc0507f0e5 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,11 @@ +{ + "recommendations": [ + "astro-build.astro-vscode", + "unifiedjs.vscode-mdx", + "bradlc.vscode-tailwindcss", + "svelte.svelte-vscode", + "esbenp.prettier-vscode", + "oxc.oxc-vscode", + "antfu.pnpm-catalog-lens" + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000..c319095798 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,22 @@ +{ + "prettier.enable": true, + "editor.formatOnSave": true, + "editor.defaultFormatter": "esbenp.prettier-vscode", + "oxc.enable": true, + "editor.codeActionsOnSave": { + "source.fixAll.oxc": "always" + }, + "svelte.enable-ts-plugin": true, + "editor.quickSuggestions": { + "strings": "on" + }, + "files.associations": { + "*.css": "tailwindcss" + }, + "tailwindCSS.includeLanguages": { + "html": "html", + "javascript": "javascript", + "typescript": "javascript", + "css": "css" + } +} diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000000..adae00623b --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,3 @@ +This repository is governed by the Skeleton Code of Conduct. + +https://github.com/skeletonlabs/community/blob/main/CODE_OF_CONDUCT.md diff --git a/LICENSE b/LICENSE index 21eb74f48d..943c0c129f 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2022 Brain & Bones, LLC +Copyright (c) 2023 Skeleton Labs, LLC Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 13ea2d79a7..7901bf62b1 100644 --- a/README.md +++ b/README.md @@ -1,51 +1,39 @@ -[![npm version](https://img.shields.io/npm/v/@brainandbones/skeleton?logo=npm&color=cb3837)](https://www.npmjs.com/package/@brainandbones/skeleton) -[![Chat](https://img.shields.io/discord/1003691521280856084?label=chat&logo=discord&color=7289da)](https://discord.gg/EXqV7W8MtY) -[![Twitter Follow](https://img.shields.io/twitter/follow/SkeletonUI?style=social)](https://twitter.com/SkeletonUI) -[![license](https://img.shields.io/badge/license-MIT-%23bada55)](https://github.com/Brain-Bones/skeleton/blob/master/LICENSE) - -# Skeleton - -https://skeleton.brainandbonesllc.com/ - -A fully featured Svelte UI component library. Skeleton allows you to build fast and responsive web interfaces using Svelte + Tailwind. +[![Skeleton](https://i.imgur.com/3YVHkcc.png)](https://www.skeleton.dev/) -## Sponsorship - -- [Github Sponsors](https://github.com/sponsors/Brain-Bones) - -## Useful Links +[![npm version](https://img.shields.io/npm/v/@skeletonlabs/skeleton?logo=npm&color=cb3837&label=skeleton)](https://www.npmjs.com/package/@skeletonlabs/skeleton) +[![npm version](https://img.shields.io/npm/v/@skeletonlabs/skeleton-react?logo=npm&color=cb3837&label=skeleton-react)](https://www.npmjs.com/package/@skeletonlabs/skeleton-react) +[![npm version](https://img.shields.io/npm/v/@skeletonlabs/skeleton-svelte?logo=npm&color=cb3837&label=skeleton-svelte)](https://www.npmjs.com/package/@skeletonlabs/skeleton-svelte) +[![Chat](https://img.shields.io/discord/1003691521280856084?label=chat&logo=discord&color=7289da)](https://discord.gg/EXqV7W8MtY) +[![license](https://img.shields.io/badge/license-MIT-%23bada55)](https://github.com/skeletonlabs/skeleton/blob/master/LICENSE) -- [Documentation](https://skeleton.brainandbonesllc.com/) -- [Contribution Guide](https://skeleton.brainandbonesllc.com/docs/contributions) -- [Report Issues](https://github.com/Brain-Bones/skeleton/issues) +Skeleton is an adaptive design system aimed at extending [Tailwind](https://tailwindcss.com/). Providing an opinionated solutions for themes, colors, typography, and more. Including easy to use components for your favorite web frameworks. -## Community +- [Documentation](https://skeleton.dev/) +- [Theme Generator](https://themes.skeleton.dev/themes/create) -- [Join the Discord](https://discord.gg/EXqV7W8MtY) -- [Follow on Twitter](https://twitter.com/SkeletonUI) +## 👋 Community -## Development +- [GitHub](https://github.com/skeletonlabs/skeleton) +- [Discord](https://discord.gg/EXqV7W8MtY) +- [Bluesky](https://bsky.app/profile/skeleton.dev) +- [YouTube](https://www.youtube.com/@skeletonlabs) -### Contributions +## 👍 Sponsor Us -Please read the [contribution guide](https://skeleton.brainandbonesllc.com/docs/contributions) before you begin. Pull requests are highly encouraged. [Pick an open issue](https://github.com/Brain-Bones/skeleton/issues) and help us out! +- [GitHub Sponsors](https://github.com/sponsors/skeletonlabs) +- [Ko-Fi](https://ko-fi.com/skeletonlabs) +- [Patreon](https://patreon.com/user?u=83786276) -### Install +## 🤝 Get Support -- Clone the Skeleton project to your local machine. -- Install dependencies with `npm install` -- Switch to the Dev branch: `git checkout dev` -- Create a new feature branch based on Dev: `git checkout -b {branchName}` -- Start a dev server: - - `npm run dev` - start server - - `npm run dev -- --open` - start and open new browser window -- Make changes, then submit a pull request when ready. +- [Reach out on Discord](https://discord.gg/EXqV7W8MtY) +- [Submit a GitHub Issue](https://github.com/skeletonlabs/skeleton/issues/new/choose) +- [Start a GitHub Discussion](https://github.com/skeletonlabs/skeleton/discussions) -## Core Maintainers +## 🛠️ Contribute -- [Chris Simmons](https://github.com/endigo9740) -- [Thomas Jespersen](https://github.com/thomasbjespersen) +We have provided a detailed [contribution guide](https://www.skeleton.dev/docs/resources/contribute) to help you get started. ---- +## Maintainers -Founded by [Brain & Bones, LLC](https://www.brainandbonesllc.com/). +Skeleton was created by [Chris Simmons](https://github.com/endigo9740) (@endigo9740) and is maintained by [Skeleton Labs](https://www.skeletonlabs.co/) and the [open source community](https://github.com/skeletonlabs/skeleton/graphs/contributors). diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index b432af4512..0000000000 --- a/package-lock.json +++ /dev/null @@ -1,8987 +0,0 @@ -{ - "name": "@brainandbones/skeleton", - "version": "0.41.49", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "@brainandbones/skeleton", - "version": "0.41.49", - "devDependencies": { - "@bobthered/tailwindcss-palette-generator": "^3.0.0", - "@sveltejs/adapter-auto": "1.0.0-next.79", - "@sveltejs/adapter-static": "1.0.0-next.43", - "@sveltejs/kit": "1.0.0-next.493", - "@sveltejs/package": "1.0.0-next.5", - "@tailwindcss/forms": "^0.5.3", - "@testing-library/dom": "^8.18.1", - "@testing-library/svelte": "^3.2.1", - "@typescript-eslint/eslint-plugin": "^5.38.0", - "@typescript-eslint/parser": "^5.38.0", - "autoprefixer": "^10.4.12", - "c8": "^7.12.0", - "eslint": "^8.23.1", - "eslint-config-prettier": "^8.5.0", - "eslint-plugin-svelte3": "^4.0.0", - "highlight.js": "^11.6.0", - "jsdom": "^20.0.0", - "postcss": "^8.4.16", - "postcss-load-config": "^4.0.1", - "prettier": "^2.7.1", - "prettier-plugin-svelte": "^2.7.0", - "svelte": "^3.50.1", - "svelte-check": "^2.9.0", - "svelte-preprocess": "^4.10.7", - "svelte2tsx": "^0.5.18", - "tailwindcss": "^3.1.8", - "tslib": "^2.4.0", - "typescript": "^4.8.3", - "vite": "^3.1.3", - "vitest": "^0.23.4" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/runtime": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz", - "integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==", - "dev": true, - "dependencies": { - "regenerator-runtime": "^0.13.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "node_modules/@bobthered/tailwindcss-palette-generator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@bobthered/tailwindcss-palette-generator/-/tailwindcss-palette-generator-3.0.0.tgz", - "integrity": "sha512-CgiMCyTnY0Q9wmaB110Fe3coXgFcA8OH0oW/TAGzwhMJ2SbnOJA93XqdVgiWcUcV1ZHRmlnMPwhASlokxmAxow==", - "dev": true - }, - "node_modules/@cloudflare/workers-types": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-3.16.0.tgz", - "integrity": "sha512-gaBUSaKS65mN3iKZEgichbXYEmAa/pXkc5Gbt+1BptYphdGkj09ggdsiE4w8g0F/uI1g36QaTKrzVnBAWMipvQ==", - "dev": true - }, - "node_modules/@esbuild/android-arm": { - "version": "0.15.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.9.tgz", - "integrity": "sha512-VZPy/ETF3fBG5PiinIkA0W/tlsvlEgJccyN2DzWZEl0DlVKRbu91PvY2D6Lxgluj4w9QtYHjOWjAT44C+oQ+EQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.15.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.9.tgz", - "integrity": "sha512-O+NfmkfRrb3uSsTa4jE3WApidSe3N5++fyOVGP1SmMZi4A3BZELkhUUvj5hwmMuNdlpzAZ8iAPz2vmcR7DCFQA==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.2.tgz", - "integrity": "sha512-AXYd23w1S/bv3fTs3Lz0vjiYemS08jWkI3hYyS9I1ry+0f+Yjs1wm+sU0BS8qDOPrBIkp4qHYC16I8uVtpLajQ==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.15.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.5.tgz", - "integrity": "sha512-XVVDtp+dVvRxMoxSiSfasYaG02VEe1qH5cKgMQJWhol6HwzbcqoCMJi8dAGoYAO57jhUyhI6cWuRiTcRaDaYug==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/gitignore-to-minimatch": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", - "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "node_modules/@iarna/toml": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", - "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==", - "dev": true - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@mapbox/node-pre-gyp": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz", - "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==", - "dev": true, - "dependencies": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@polka/url": { - "version": "1.0.0-next.21", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", - "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==", - "dev": true - }, - "node_modules/@rollup/pluginutils": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", - "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", - "dev": true, - "dependencies": { - "estree-walker": "^2.0.1", - "picomatch": "^2.2.2" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/@sveltejs/adapter-auto": { - "version": "1.0.0-next.79", - "resolved": "https://registry.npmjs.org/@sveltejs/adapter-auto/-/adapter-auto-1.0.0-next.79.tgz", - "integrity": "sha512-CyoL9MGBj0s2uPfTsrfSrsP9Kmj3h/Cnw4lHbXf58n0zsK2RizT+vMuMuadLVQwFJOcMtr3+6pL2BQGfqbUA5Q==", - "dev": true, - "dependencies": { - "@sveltejs/adapter-cloudflare": "1.0.0-next.37", - "@sveltejs/adapter-netlify": "1.0.0-next.78", - "@sveltejs/adapter-vercel": "1.0.0-next.77" - } - }, - "node_modules/@sveltejs/adapter-cloudflare": { - "version": "1.0.0-next.37", - "resolved": "https://registry.npmjs.org/@sveltejs/adapter-cloudflare/-/adapter-cloudflare-1.0.0-next.37.tgz", - "integrity": "sha512-Y/k+VSw0e+IH2rPGMW6td+8WkTDwoWvsdv7NVbxCXzl+VGCODDYfZ5msPxpFHLeGmRxB9wSvNmU4PDsmyGmO8Q==", - "dev": true, - "dependencies": { - "@cloudflare/workers-types": "^3.14.0", - "esbuild": "^0.15.7", - "worktop": "0.8.0-next.14" - } - }, - "node_modules/@sveltejs/adapter-netlify": { - "version": "1.0.0-next.78", - "resolved": "https://registry.npmjs.org/@sveltejs/adapter-netlify/-/adapter-netlify-1.0.0-next.78.tgz", - "integrity": "sha512-Yyn/j/0QcLK3Db442ducLUZmyvkO74j7Gdcwu9xN0fQN3kBlCJP9Itx5o4SySrPFGc4Q8cLJ5ELNg+mWduLBAA==", - "dev": true, - "dependencies": { - "@iarna/toml": "^2.2.5", - "esbuild": "^0.15.7", - "set-cookie-parser": "^2.4.8" - } - }, - "node_modules/@sveltejs/adapter-static": { - "version": "1.0.0-next.43", - "resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-1.0.0-next.43.tgz", - "integrity": "sha512-PAgSp1GA8HkYE4p30/sBvJme2nefhcTBJafqQdMNoUksWZF2WzuL8OEO8wa9ndE6cghcGk3j6Ve0Oskg/wtTOw==", - "dev": true - }, - "node_modules/@sveltejs/adapter-vercel": { - "version": "1.0.0-next.77", - "resolved": "https://registry.npmjs.org/@sveltejs/adapter-vercel/-/adapter-vercel-1.0.0-next.77.tgz", - "integrity": "sha512-r4MqtP+lzx83HfcvI8PU0Yxzmxt6WQq9nzZETLboJouJzhSBUFIN5RmNZfEn6nNIlUwZbGQUEK/FxsRnnxI/Ig==", - "dev": true, - "dependencies": { - "@vercel/nft": "^0.22.0", - "esbuild": "^0.15.7" - } - }, - "node_modules/@sveltejs/kit": { - "version": "1.0.0-next.493", - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.0.0-next.493.tgz", - "integrity": "sha512-q46RfW92UBtcWoVPnFtDpaRNRmXrkbuHIePUf0sDItTbXfON29LPblK4LMqyet0ntBW519KZYCc5xH/iGEpKEw==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@sveltejs/vite-plugin-svelte": "^1.0.5", - "@types/cookie": "^0.5.1", - "cookie": "^0.5.0", - "devalue": "^3.1.2", - "kleur": "^4.1.4", - "magic-string": "^0.26.2", - "mime": "^3.0.0", - "node-fetch": "^3.2.4", - "sade": "^1.8.1", - "set-cookie-parser": "^2.4.8", - "sirv": "^2.0.2", - "tiny-glob": "^0.2.9", - "undici": "^5.8.1" - }, - "bin": { - "svelte-kit": "svelte-kit.js" - }, - "engines": { - "node": ">=16.14" - }, - "peerDependencies": { - "svelte": "^3.44.0", - "vite": "^3.1.0" - } - }, - "node_modules/@sveltejs/package": { - "version": "1.0.0-next.5", - "resolved": "https://registry.npmjs.org/@sveltejs/package/-/package-1.0.0-next.5.tgz", - "integrity": "sha512-cXH8ESgZ5wSPspqsuIpz0hupz+gZlX9SfVV6FdwzY2A/dzKsTXUJKOjSd7hkjr69sBMyQRLfnk9eEaTG1EXGFA==", - "dev": true, - "dependencies": { - "chokidar": "^3.5.3", - "kleur": "^4.1.4", - "sade": "^1.8.1", - "svelte2tsx": "~0.5.10" - }, - "bin": { - "svelte-package": "svelte-package.js" - }, - "engines": { - "node": ">=16.14" - }, - "peerDependencies": { - "svelte": "^3.44.0" - } - }, - "node_modules/@sveltejs/vite-plugin-svelte": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.0.8.tgz", - "integrity": "sha512-1xkVTB4pm6zuign858FzVYE9Fdw9MQBOlxrdd85STV0NvTDmcofcRpcrK+zcIyT8SZ2dseHLu8hvDwzssF6RfA==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^4.2.1", - "debug": "^4.3.4", - "deepmerge": "^4.2.2", - "kleur": "^4.1.5", - "magic-string": "^0.26.3", - "svelte-hmr": "^0.15.0" - }, - "engines": { - "node": "^14.18.0 || >= 16" - }, - "peerDependencies": { - "diff-match-patch": "^1.0.5", - "svelte": "^3.44.0", - "vite": "^3.0.0" - }, - "peerDependenciesMeta": { - "diff-match-patch": { - "optional": true - } - } - }, - "node_modules/@tailwindcss/forms": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.3.tgz", - "integrity": "sha512-y5mb86JUoiUgBjY/o6FJSFZSEttfb3Q5gllE4xoKjAAD+vBrnIhE4dViwUuow3va8mpH4s9jyUbUbrRGoRdc2Q==", - "dev": true, - "dependencies": { - "mini-svg-data-uri": "^1.2.3" - }, - "peerDependencies": { - "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1" - } - }, - "node_modules/@testing-library/dom": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.18.1.tgz", - "integrity": "sha512-oEvsm2B/WtcHKE+IcEeeCqNU/ltFGaVyGbpcm4g/2ytuT49jrlH9x5qRKL/H3A6yfM4YAbSbC0ceT5+9CEXnLg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^4.2.0", - "aria-query": "^5.0.0", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.4.4", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@testing-library/svelte": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@testing-library/svelte/-/svelte-3.2.1.tgz", - "integrity": "sha512-qP5nMAx78zt+a3y9Sws9BNQYP30cOQ/LXDYuAj7wNtw86b7AtB7TFAz6/Av9hFsW3IJHPBBIGff6utVNyq+F1g==", - "dev": true, - "dependencies": { - "@testing-library/dom": "^8.1.0" - }, - "engines": { - "node": ">= 10" - }, - "peerDependencies": { - "svelte": "3.x" - } - }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@types/aria-query": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==", - "dev": true - }, - "node_modules/@types/chai": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.3.tgz", - "integrity": "sha512-hC7OMnszpxhZPduX+m+nrx+uFoLkWOMiR4oa/AZF3MuSETYTZmFfJAHqZEM8MVlvfG7BEUcgvtwoCTxBp6hm3g==", - "dev": true - }, - "node_modules/@types/chai-subset": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", - "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", - "dev": true, - "dependencies": { - "@types/chai": "*" - } - }, - "node_modules/@types/cookie": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.5.1.tgz", - "integrity": "sha512-COUnqfB2+ckwXXSFInsFdOAWQzCCx+a5hq2ruyj+Vjund94RJQd4LG2u9hnvJrTgunKAaax7ancBYlDrNYxA0g==", - "dev": true - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "node_modules/@types/node": { - "version": "18.7.20", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.20.tgz", - "integrity": "sha512-adzY4vLLr5Uivmx8+zfSJ5fbdgKxX8UMtjtl+17n0B1q1Nz8JEmE151vefMdpD+1gyh+77weN4qEhej/O7budQ==", - "dev": true - }, - "node_modules/@types/pug": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.6.tgz", - "integrity": "sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==", - "dev": true - }, - "node_modules/@types/sass": { - "version": "1.43.1", - "resolved": "https://registry.npmjs.org/@types/sass/-/sass-1.43.1.tgz", - "integrity": "sha512-BPdoIt1lfJ6B7rw35ncdwBZrAssjcwzI5LByIrYs+tpXlj/CAkuVdRsgZDdP4lq5EjyWzwxZCqAoFyHKFwp32g==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.38.0.tgz", - "integrity": "sha512-GgHi/GNuUbTOeoJiEANi0oI6fF3gBQc3bGFYj40nnAPCbhrtEDf2rjBmefFadweBmO1Du1YovHeDP2h5JLhtTQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.38.0", - "@typescript-eslint/type-utils": "5.38.0", - "@typescript-eslint/utils": "5.38.0", - "debug": "^4.3.4", - "ignore": "^5.2.0", - "regexpp": "^3.2.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.38.0.tgz", - "integrity": "sha512-/F63giJGLDr0ms1Cr8utDAxP2SPiglaD6V+pCOcG35P2jCqdfR7uuEhz1GIC3oy4hkUF8xA1XSXmd9hOh/a5EA==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.38.0", - "@typescript-eslint/types": "5.38.0", - "@typescript-eslint/typescript-estree": "5.38.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.38.0.tgz", - "integrity": "sha512-ByhHIuNyKD9giwkkLqzezZ9y5bALW8VNY6xXcP+VxoH4JBDKjU5WNnsiD4HJdglHECdV+lyaxhvQjTUbRboiTA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.38.0", - "@typescript-eslint/visitor-keys": "5.38.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.38.0.tgz", - "integrity": "sha512-iZq5USgybUcj/lfnbuelJ0j3K9dbs1I3RICAJY9NZZpDgBYXmuUlYQGzftpQA9wC8cKgtS6DASTvF3HrXwwozA==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "5.38.0", - "@typescript-eslint/utils": "5.38.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.38.0.tgz", - "integrity": "sha512-HHu4yMjJ7i3Cb+8NUuRCdOGu2VMkfmKyIJsOr9PfkBVYLYrtMCK/Ap50Rpov+iKpxDTfnqvDbuPLgBE5FwUNfA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.38.0.tgz", - "integrity": "sha512-6P0RuphkR+UuV7Avv7MU3hFoWaGcrgOdi8eTe1NwhMp2/GjUJoODBTRWzlHpZh6lFOaPmSvgxGlROa0Sg5Zbyg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.38.0", - "@typescript-eslint/visitor-keys": "5.38.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.38.0.tgz", - "integrity": "sha512-6sdeYaBgk9Fh7N2unEXGz+D+som2QCQGPAf1SxrkEr+Z32gMreQ0rparXTNGRRfYUWk/JzbGdcM8NSSd6oqnTA==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.38.0", - "@typescript-eslint/types": "5.38.0", - "@typescript-eslint/typescript-estree": "5.38.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.38.0.tgz", - "integrity": "sha512-MxnrdIyArnTi+XyFLR+kt/uNAcdOnmT+879os7qDRI+EYySR4crXJq9BXPfRzzLGq0wgxkwidrCJ9WCAoacm1w==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.38.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@vercel/nft": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-0.22.1.tgz", - "integrity": "sha512-lYYZIoxRurqDOSoVIdBicGnpUIpfyaS5qVjdPq+EfI285WqtZK3NK/dyCkiyBul+X2U2OEhRyeMdXPCHGJbohw==", - "dev": true, - "dependencies": { - "@mapbox/node-pre-gyp": "^1.0.5", - "acorn": "^8.6.0", - "async-sema": "^3.1.1", - "bindings": "^1.4.0", - "estree-walker": "2.0.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.2", - "node-gyp-build": "^4.2.2", - "resolve-from": "^5.0.0", - "rollup-pluginutils": "^2.8.2" - }, - "bin": { - "nft": "out/cli.js" - } - }, - "node_modules/abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "dev": true - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dev": true, - "dependencies": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, - "node_modules/acorn-globals/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-node": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", - "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", - "dev": true, - "dependencies": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" - } - }, - "node_modules/acorn-node/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true - }, - "node_modules/are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "dev": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/aria-query": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.0.2.tgz", - "integrity": "sha512-eigU3vhqSO+Z8BKDnVLN/ompjhf3pYzecKXz8+whRy+9gZu8n1TCGfwzQUUPnqdHl9ax1Hr9031orZ+UOEYr7Q==", - "dev": true, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/async-sema": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/async-sema/-/async-sema-3.1.1.tgz", - "integrity": "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==", - "dev": true - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "node_modules/autoprefixer": { - "version": "10.4.12", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.12.tgz", - "integrity": "sha512-WrCGV9/b97Pa+jtwf5UGaRjgQIg7OK3D06GnoYoZNcG1Xb8Gt3EfuKjlhh9i/VtT16g6PYjZ69jdJ2g8FxSC4Q==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - } - ], - "dependencies": { - "browserslist": "^4.21.4", - "caniuse-lite": "^1.0.30001407", - "fraction.js": "^4.2.0", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "node_modules/browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/c8": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/c8/-/c8-7.12.0.tgz", - "integrity": "sha512-CtgQrHOkyxr5koX1wEUmN/5cfDa2ckbHRA4Gy5LAL0zaCFtVWJS5++n+w4/sr2GWGerBxgTjpKeDclk/Qk6W/A==", - "dev": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@istanbuljs/schema": "^0.1.3", - "find-up": "^5.0.0", - "foreground-child": "^2.0.0", - "istanbul-lib-coverage": "^3.2.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-reports": "^3.1.4", - "rimraf": "^3.0.2", - "test-exclude": "^6.0.0", - "v8-to-istanbul": "^9.0.0", - "yargs": "^16.2.0", - "yargs-parser": "^20.2.9" - }, - "bin": { - "c8": "bin/c8.js" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001411", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001411.tgz", - "integrity": "sha512-HPnJKESKuhKpHvMY1/ux7J3nG7xG8jRuL4lbyCjDRm0doTNV91tcRk60xrP7Ym9DtJH/yuqntDWBJCqpXB4b7g==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ] - }, - "node_modules/chai": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", - "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", - "dev": true, - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true, - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "dev": true - }, - "node_modules/convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/convert-source-map/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", - "dev": true - }, - "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "dependencies": { - "cssom": "~0.3.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - }, - "node_modules/data-uri-to-buffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz", - "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==", - "dev": true, - "engines": { - "node": ">= 12" - } - }, - "node_modules/data-urls": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", - "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", - "dev": true, - "dependencies": { - "abab": "^2.0.6", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decimal.js": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.1.tgz", - "integrity": "sha512-F29o+vci4DodHYT9UrR5IEbfBw9pE5eSapIJdTqXK5+6hq+t8VRxwQyKlW2i+KDKFkkJQRvFyI/QXD83h8LyQw==", - "dev": true - }, - "node_modules/dedent-js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dedent-js/-/dedent-js-1.0.1.tgz", - "integrity": "sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==", - "dev": true - }, - "node_modules/deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "dev": true, - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==", - "dev": true - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true - }, - "node_modules/detect-indent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", - "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/detective": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", - "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", - "dev": true, - "dependencies": { - "acorn-node": "^1.8.2", - "defined": "^1.0.0", - "minimist": "^1.2.6" - }, - "bin": { - "detective": "bin/detective.js" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/devalue": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/devalue/-/devalue-3.1.3.tgz", - "integrity": "sha512-9KO89Cb+qjzf2CqdrH+NuLaqdk9GhDP5EhR4zlkR51dvuIaiqtlkDkGzLMShDemwUy21raSMdu+kpX8Enw3yGQ==", - "dev": true - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-accessibility-api": { - "version": "0.5.14", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.14.tgz", - "integrity": "sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg==", - "dev": true - }, - "node_modules/domexception": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", - "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", - "dev": true, - "dependencies": { - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.261", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.261.tgz", - "integrity": "sha512-fVXliNUGJ7XUVJSAasPseBbVgJIeyw5M1xIkgXdTSRjlmCqBbiSTsEdLOCJS31Fc8B7CaloQ/BFAg8By3ODLdg==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/entities": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", - "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/es6-promise": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", - "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", - "dev": true - }, - "node_modules/esbuild": { - "version": "0.15.9", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.9.tgz", - "integrity": "sha512-OnYr1rkMVxtmMHIAKZLMcEUlJmqcbxBz9QoBU8G9v455na0fuzlT/GLu6l+SRghrk0Mm2fSSciMmzV43Q8e0Gg==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.15.9", - "@esbuild/linux-loong64": "0.15.9", - "esbuild-android-64": "0.15.9", - "esbuild-android-arm64": "0.15.9", - "esbuild-darwin-64": "0.15.9", - "esbuild-darwin-arm64": "0.15.9", - "esbuild-freebsd-64": "0.15.9", - "esbuild-freebsd-arm64": "0.15.9", - "esbuild-linux-32": "0.15.9", - "esbuild-linux-64": "0.15.9", - "esbuild-linux-arm": "0.15.9", - "esbuild-linux-arm64": "0.15.9", - "esbuild-linux-mips64le": "0.15.9", - "esbuild-linux-ppc64le": "0.15.9", - "esbuild-linux-riscv64": "0.15.9", - "esbuild-linux-s390x": "0.15.9", - "esbuild-netbsd-64": "0.15.9", - "esbuild-openbsd-64": "0.15.9", - "esbuild-sunos-64": "0.15.9", - "esbuild-windows-32": "0.15.9", - "esbuild-windows-64": "0.15.9", - "esbuild-windows-arm64": "0.15.9" - } - }, - "node_modules/esbuild-android-64": { - "version": "0.15.9", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.9.tgz", - "integrity": "sha512-HQCX7FJn9T4kxZQkhPjNZC7tBWZqJvhlLHPU2SFzrQB/7nDXjmTIFpFTjt7Bd1uFpeXmuwf5h5fZm+x/hLnhbw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-android-arm64": { - "version": "0.15.9", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.9.tgz", - "integrity": "sha512-E6zbLfqbFVCNEKircSHnPiSTsm3fCRxeIMPfrkS33tFjIAoXtwegQfVZqMGR0FlsvVxp2NEDOUz+WW48COCjSg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-64": { - "version": "0.15.9", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.9.tgz", - "integrity": "sha512-gI7dClcDN/HHVacZhTmGjl0/TWZcGuKJ0I7/xDGJwRQQn7aafZGtvagOFNmuOq+OBFPhlPv1T6JElOXb0unkSQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-arm64": { - "version": "0.15.9", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.9.tgz", - "integrity": "sha512-VZIMlcRN29yg/sv7DsDwN+OeufCcoTNaTl3Vnav7dL/nvsApD7uvhVRbgyMzv0zU/PP0xRhhIpTyc7lxEzHGSw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-64": { - "version": "0.15.9", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.9.tgz", - "integrity": "sha512-uM4z5bTvuAXqPxrI204txhlsPIolQPWRMLenvGuCPZTnnGlCMF2QLs0Plcm26gcskhxewYo9LkkmYSS5Czrb5A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-arm64": { - "version": "0.15.9", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.9.tgz", - "integrity": "sha512-HHDjT3O5gWzicGdgJ5yokZVN9K9KG05SnERwl9nBYZaCjcCgj/sX8Ps1jvoFSfNCO04JSsHSOWo4qvxFuj8FoA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-32": { - "version": "0.15.9", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.9.tgz", - "integrity": "sha512-AQIdE8FugGt1DkcekKi5ycI46QZpGJ/wqcMr7w6YUmOmp2ohQ8eO4sKUsOxNOvYL7hGEVwkndSyszR6HpVHLFg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-64": { - "version": "0.15.9", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.9.tgz", - "integrity": "sha512-4RXjae7g6Qs7StZyiYyXTZXBlfODhb1aBVAjd+ANuPmMhWthQilWo7rFHwJwL7DQu1Fjej2sODAVwLbcIVsAYQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm": { - "version": "0.15.9", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.9.tgz", - "integrity": "sha512-3Zf2GVGUOI7XwChH3qrnTOSqfV1V4CAc/7zLVm4lO6JT6wbJrTgEYCCiNSzziSju+J9Jhf9YGWk/26quWPC6yQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm64": { - "version": "0.15.9", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.9.tgz", - "integrity": "sha512-a+bTtxJmYmk9d+s2W4/R1SYKDDAldOKmWjWP0BnrWtDbvUBNOm++du0ysPju4mZVoEFgS1yLNW+VXnG/4FNwdQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-mips64le": { - "version": "0.15.9", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.9.tgz", - "integrity": "sha512-Zn9HSylDp89y+TRREMDoGrc3Z4Hs5u56ozZLQCiZAUx2+HdbbXbWdjmw3FdTJ/i7t5Cew6/Q+6kfO3KCcFGlyw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-ppc64le": { - "version": "0.15.9", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.9.tgz", - "integrity": "sha512-OEiOxNAMH9ENFYqRsWUj3CWyN3V8P3ZXyfNAtX5rlCEC/ERXrCEFCJji/1F6POzsXAzxvUJrTSTCy7G6BhA6Fw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-riscv64": { - "version": "0.15.9", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.9.tgz", - "integrity": "sha512-ukm4KsC3QRausEFjzTsOZ/qqazw0YvJsKmfoZZm9QW27OHjk2XKSQGGvx8gIEswft/Sadp03/VZvAaqv5AIwNA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-s390x": { - "version": "0.15.9", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.9.tgz", - "integrity": "sha512-uDOQEH55wQ6ahcIKzQr3VyjGc6Po/xblLGLoUk3fVL1qjlZAibtQr6XRfy5wPJLu/M2o0vQKLq4lyJ2r1tWKcw==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-netbsd-64": { - "version": "0.15.9", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.9.tgz", - "integrity": "sha512-yWgxaYTQz+TqX80wXRq6xAtb7GSBAp6gqLKfOdANg9qEmAI1Bxn04IrQr0Mzm4AhxvGKoHzjHjMgXbCCSSDxcw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-openbsd-64": { - "version": "0.15.9", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.9.tgz", - "integrity": "sha512-JmS18acQl4iSAjrEha1MfEmUMN4FcnnrtTaJ7Qg0tDCOcgpPPQRLGsZqhes0vmx8VA6IqRyScqXvaL7+Q0Uf3A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-sunos-64": { - "version": "0.15.9", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.9.tgz", - "integrity": "sha512-UKynGSWpzkPmXW3D2UMOD9BZPIuRaSqphxSCwScfEE05Be3KAmvjsBhht1fLzKpiFVJb0BYMd4jEbWMyJ/z1hQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-32": { - "version": "0.15.9", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.9.tgz", - "integrity": "sha512-aqXvu4/W9XyTVqO/hw3rNxKE1TcZiEYHPsXM9LwYmKSX9/hjvfIJzXwQBlPcJ/QOxedfoMVH0YnhhQ9Ffb0RGA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-64": { - "version": "0.15.9", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.9.tgz", - "integrity": "sha512-zm7h91WUmlS4idMtjvCrEeNhlH7+TNOmqw5dJPJZrgFaxoFyqYG6CKDpdFCQXdyKpD5yvzaQBOMVTCBVKGZDEg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-arm64": { - "version": "0.15.9", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.9.tgz", - "integrity": "sha512-yQEVIv27oauAtvtuhJVfSNMztJJX47ismRS6Sv2QMVV9RM+6xjbMWuuwM2nxr5A2/gj/mu2z9YlQxiwoFRCfZA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", - "dev": true, - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/escodegen/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/eslint": { - "version": "8.24.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.24.0.tgz", - "integrity": "sha512-dWFaPhGhTAiPcCgm3f6LI2MBWbogMnTJzFBbhXVRQDJPkr9pGZvVjlVfXd+vyDcWPA2Ic9L2AXPIQM0+vk/cSQ==", - "dev": true, - "dependencies": { - "@eslint/eslintrc": "^1.3.2", - "@humanwhocodes/config-array": "^0.10.5", - "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", - "@humanwhocodes/module-importer": "^1.0.1", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.1", - "globals": "^13.15.0", - "globby": "^11.1.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-sdsl": "^4.1.4", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-prettier": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", - "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-svelte3": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-svelte3/-/eslint-plugin-svelte3-4.0.0.tgz", - "integrity": "sha512-OIx9lgaNzD02+MDFNLw0GEUbuovNcglg+wnd/UY0fbZmlQSz7GlQiQ1f+yX0XvC07XPcDOnFcichqI3xCwp71g==", - "dev": true, - "peerDependencies": { - "eslint": ">=8.0.0", - "svelte": "^3.2.0" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/espree": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", - "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", - "dev": true, - "dependencies": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fetch-blob": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "paypal", - "url": "https://paypal.me/jimmywarting" - } - ], - "dependencies": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" - }, - "engines": { - "node": "^12.20 || >= 14.13" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "node_modules/foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", - "dev": true, - "dependencies": { - "fetch-blob": "^3.1.2" - }, - "engines": { - "node": ">=12.20.0" - } - }, - "node_modules/fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", - "dev": true, - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://www.patreon.com/infusion" - } - }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "dev": true, - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globalyzer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", - "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==", - "dev": true - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globrex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", - "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", - "dev": true - }, - "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "dev": true - }, - "node_modules/highlight.js": { - "version": "11.6.0", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.6.0.tgz", - "integrity": "sha512-ig1eqDzJaB0pqEvlPVIpSSyMaO92bH1N2rJpLMN/nX396wTpDA4Eq0uK+7I/2XG17pFaaKE0kjV/XPeGt7Evjw==", - "dev": true, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/html-encoding-sniffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", - "dev": true, - "dependencies": { - "whatwg-encoding": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/js-sdsl": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.4.tgz", - "integrity": "sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw==", - "dev": true - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsdom": { - "version": "20.0.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.0.tgz", - "integrity": "sha512-x4a6CKCgx00uCmP+QakBDFXwjAJ69IkkIWHmtmjd3wvXPcdOS44hfX2vqkOQrVrq8l9DhNNADZRXaCEWvgXtVA==", - "dev": true, - "dependencies": { - "abab": "^2.0.6", - "acorn": "^8.7.1", - "acorn-globals": "^6.0.0", - "cssom": "^0.5.0", - "cssstyle": "^2.3.0", - "data-urls": "^3.0.2", - "decimal.js": "^10.3.1", - "domexception": "^4.0.0", - "escodegen": "^2.0.0", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.1", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "^7.0.0", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^3.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^2.0.0", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0", - "ws": "^8.8.0", - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lilconfig": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", - "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/local-pkg": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.2.tgz", - "integrity": "sha512-mlERgSPrbxU3BP4qBqAvvwlgW4MTg78iwJdGGnv7kibKjWcJksrG3t6LB5lXI93wXRDvG4NpUgJFmTG4T6rdrg==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/loupe": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", - "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.0" - } - }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/lz-string": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", - "integrity": "sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ==", - "dev": true, - "bin": { - "lz-string": "bin/bin.js" - } - }, - "node_modules/magic-string": { - "version": "0.26.4", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.4.tgz", - "integrity": "sha512-e5uXtVJ22aEpK9u1+eQf0fSxHeqwyV19K+uGnlROCxUhzwRip9tBsaMViK/0vC3viyPd5Gtucp3UmEp/Q2cPTQ==", - "dev": true, - "dependencies": { - "sourcemap-codec": "^1.4.8" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/mini-svg-data-uri": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", - "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", - "dev": true, - "bin": { - "mini-svg-data-uri": "cli.js" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "node_modules/minipass": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz", - "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/mrmime": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", - "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], - "engines": { - "node": ">=10.5.0" - } - }, - "node_modules/node-fetch": { - "version": "3.2.10", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.2.10.tgz", - "integrity": "sha512-MhuzNwdURnZ1Cp4XTazr69K0BTizsBroX7Zx3UgDSVcZYKF/6p0CBe4EUb/hLqmzVhl0UpYfgRljQ4yxE+iCxA==", - "dev": true, - "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" - } - }, - "node_modules/node-gyp-build": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", - "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==", - "dev": true, - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", - "dev": true - }, - "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dev": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "dev": true, - "dependencies": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "node_modules/nwsapi": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.2.tgz", - "integrity": "sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==", - "dev": true - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse5": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.1.tgz", - "integrity": "sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==", - "dev": true, - "dependencies": { - "entities": "^4.4.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dev": true, - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss": { - "version": "8.4.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", - "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - } - ], - "dependencies": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-import": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", - "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", - "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", - "dev": true, - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.3.3" - } - }, - "node_modules/postcss-load-config": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", - "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", - "dev": true, - "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^2.1.1" - }, - "engines": { - "node": ">= 14" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-nested": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", - "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.6" - }, - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-plugin-svelte": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-2.7.0.tgz", - "integrity": "sha512-fQhhZICprZot2IqEyoiUYLTRdumULGRvw0o4dzl5jt0jfzVWdGqeYW27QTWAeXhoupEZJULmNoH3ueJwUWFLIA==", - "dev": true, - "peerDependencies": { - "prettier": "^1.16.4 || ^2.0.0", - "svelte": "^3.2.0" - } - }, - "node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", - "dev": true - }, - "node_modules/regexparam": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexparam/-/regexparam-2.0.1.tgz", - "integrity": "sha512-zRgSaYemnNYxUv+/5SeoHI0eJIgTL/A2pUtXUPLHQxUldagouJ9p+K6IbIZ/JiQuCEv2E2B1O11SjVQy3aMCkw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "2.78.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.78.1.tgz", - "integrity": "sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=10.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/rollup-pluginutils": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", - "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", - "dev": true, - "dependencies": { - "estree-walker": "^0.6.1" - } - }, - "node_modules/rollup-pluginutils/node_modules/estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", - "dev": true - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/sade": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", - "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", - "dev": true, - "dependencies": { - "mri": "^1.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/sander": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz", - "integrity": "sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==", - "dev": true, - "dependencies": { - "es6-promise": "^3.1.2", - "graceful-fs": "^4.1.3", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.2" - } - }, - "node_modules/sander/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "dev": true, - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=v12.22.7" - } - }, - "node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "node_modules/set-cookie-parser": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.5.1.tgz", - "integrity": "sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ==", - "dev": true - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/sirv": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.2.tgz", - "integrity": "sha512-4Qog6aE29nIjAOKe/wowFTxOdmbEZKb+3tsLljaBRzJwtqto0BChD2zzH0LhgCSXiI+V7X+Y45v14wBZQ1TK3w==", - "dev": true, - "dependencies": { - "@polka/url": "^1.0.0-next.20", - "mrmime": "^1.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/sorcery": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.10.0.tgz", - "integrity": "sha512-R5ocFmKZQFfSTstfOtHjJuAwbpGyf9qjQa1egyhvXSbM7emjrtLXtGdZsDJDABC85YBfVvrOiGWKSYXPKdvP1g==", - "dev": true, - "dependencies": { - "buffer-crc32": "^0.2.5", - "minimist": "^1.2.0", - "sander": "^0.5.0", - "sourcemap-codec": "^1.3.0" - }, - "bin": { - "sorcery": "bin/index.js" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-literal": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-0.4.2.tgz", - "integrity": "sha512-pv48ybn4iE1O9RLgCAN0iU4Xv7RlBTiit6DKmMiErbs9x1wH6vXBs45tWc0H5wUIF6TLTrKweqkmYF/iraQKNw==", - "dev": true, - "dependencies": { - "acorn": "^8.8.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/svelte": { - "version": "3.50.1", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.50.1.tgz", - "integrity": "sha512-bS4odcsdj5D5jEg6riZuMg5NKelzPtmsCbD9RG+8umU03TeNkdWnP6pqbCm0s8UQNBkqk29w/Bdubn3C+HWSwA==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/svelte-check": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-2.9.0.tgz", - "integrity": "sha512-9AVrtP7WbfDgCdqTZNPdj5CCCy1OrYMxFVWAWzNw7fl93c9klFJFtqzVXa6fovfQ050CcpUyJE2dPFL9TFAREw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.9", - "chokidar": "^3.4.1", - "fast-glob": "^3.2.7", - "import-fresh": "^3.2.1", - "picocolors": "^1.0.0", - "sade": "^1.7.4", - "svelte-preprocess": "^4.0.0", - "typescript": "*" - }, - "bin": { - "svelte-check": "bin/svelte-check" - }, - "peerDependencies": { - "svelte": "^3.24.0" - } - }, - "node_modules/svelte-hmr": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.0.tgz", - "integrity": "sha512-Aw21SsyoohyVn4yiKXWPNCSW2DQNH/76kvUnE9kpt4h9hcg9tfyQc6xshx9hzgMfGF0kVx0EGD8oBMWSnATeOg==", - "dev": true, - "engines": { - "node": "^12.20 || ^14.13.1 || >= 16" - }, - "peerDependencies": { - "svelte": ">=3.19.0" - } - }, - "node_modules/svelte-preprocess": { - "version": "4.10.7", - "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-4.10.7.tgz", - "integrity": "sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@types/pug": "^2.0.4", - "@types/sass": "^1.16.0", - "detect-indent": "^6.0.0", - "magic-string": "^0.25.7", - "sorcery": "^0.10.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">= 9.11.2" - }, - "peerDependencies": { - "@babel/core": "^7.10.2", - "coffeescript": "^2.5.1", - "less": "^3.11.3 || ^4.0.0", - "postcss": "^7 || ^8", - "postcss-load-config": "^2.1.0 || ^3.0.0 || ^4.0.0", - "pug": "^3.0.0", - "sass": "^1.26.8", - "stylus": "^0.55.0", - "sugarss": "^2.0.0", - "svelte": "^3.23.0", - "typescript": "^3.9.5 || ^4.0.0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "coffeescript": { - "optional": true - }, - "less": { - "optional": true - }, - "node-sass": { - "optional": true - }, - "postcss": { - "optional": true - }, - "postcss-load-config": { - "optional": true - }, - "pug": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "typescript": { - "optional": true - } - } - }, - "node_modules/svelte-preprocess/node_modules/magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "dev": true, - "dependencies": { - "sourcemap-codec": "^1.4.8" - } - }, - "node_modules/svelte2tsx": { - "version": "0.5.18", - "resolved": "https://registry.npmjs.org/svelte2tsx/-/svelte2tsx-0.5.18.tgz", - "integrity": "sha512-yhfEv1xvTYJZR/6Abygw09IH7uhAprKbar6Vk/YsfJyNcz4PQc/EHlG0LJbsm+FW8Us6ihZ9KJC4u+FnNW99lg==", - "dev": true, - "dependencies": { - "dedent-js": "^1.0.1", - "pascal-case": "^3.1.1" - }, - "peerDependencies": { - "svelte": "^3.24", - "typescript": "^4.1.2" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "node_modules/tailwindcss": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.1.8.tgz", - "integrity": "sha512-YSneUCZSFDYMwk+TGq8qYFdCA3yfBRdBlS7txSq0LUmzyeqRe3a8fBQzbz9M3WS/iFT4BNf/nmw9mEzrnSaC0g==", - "dev": true, - "dependencies": { - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "color-name": "^1.1.4", - "detective": "^5.2.1", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.2.11", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "lilconfig": "^2.0.6", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.14", - "postcss-import": "^14.1.0", - "postcss-js": "^4.0.0", - "postcss-load-config": "^3.1.4", - "postcss-nested": "5.0.6", - "postcss-selector-parser": "^6.0.10", - "postcss-value-parser": "^4.2.0", - "quick-lru": "^5.1.1", - "resolve": "^1.22.1" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=12.13.0" - }, - "peerDependencies": { - "postcss": "^8.0.9" - } - }, - "node_modules/tailwindcss/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/tailwindcss/node_modules/postcss-load-config": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", - "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", - "dev": true, - "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^1.10.2" - }, - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/tailwindcss/node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", - "dev": true, - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/tar/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/tiny-glob": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", - "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", - "dev": true, - "dependencies": { - "globalyzer": "0.1.0", - "globrex": "^0.1.2" - } - }, - "node_modules/tinybench": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.1.5.tgz", - "integrity": "sha512-ak+PZZEuH3mw6CCFOgf5S90YH0MARnZNhxjhjguAmoJimEMAJuNip/rJRd6/wyylHItomVpKTzZk9zrhTrQCoQ==", - "dev": true - }, - "node_modules/tinypool": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.3.0.tgz", - "integrity": "sha512-NX5KeqHOBZU6Bc0xj9Vr5Szbb1j8tUHIeD18s41aDJaPeC5QTdEhK0SpdpUrZlj2nv5cctNcSjaKNanXlfcVEQ==", - "dev": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-1.0.2.tgz", - "integrity": "sha512-bSGlgwLBYf7PnUsQ6WOc6SJ3pGOcd+d8AA6EUnLDDM0kWEstC1JIlSZA3UNliDXhd9ABoS7hiRBDCu+XP/sf1Q==", - "dev": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/totalist": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.0.tgz", - "integrity": "sha512-eM+pCBxXO/njtF7vdFsHuqb+ElbxqtI4r5EAvk6grfAFyJ6IvWlSkfZ5T9ozC6xWw3Fj1fGoSmrl0gUs46JVIw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/tough-cookie": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz", - "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==", - "dev": true, - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", - "dev": true, - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz", - "integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/undici": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.10.0.tgz", - "integrity": "sha512-c8HsD3IbwmjjbLvoZuRI26TZic+TSEe8FPMLLOkN1AfYRhdjnKBU6yL+IwcSCbdZiX4e5t0lfMDLDCqj4Sq70g==", - "dev": true, - "engines": { - "node": ">=12.18" - } - }, - "node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz", - "integrity": "sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist-lint": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/v8-to-istanbul": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", - "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/vite": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-3.1.3.tgz", - "integrity": "sha512-/3XWiktaopByM5bd8dqvHxRt5EEgRikevnnrpND0gRfNkrMrPaGGexhtLCzv15RcCMtV2CLw+BPas8YFeSG0KA==", - "dev": true, - "dependencies": { - "esbuild": "^0.15.6", - "postcss": "^8.4.16", - "resolve": "^1.22.1", - "rollup": "~2.78.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "less": "*", - "sass": "*", - "stylus": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "less": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vitest": { - "version": "0.23.4", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.23.4.tgz", - "integrity": "sha512-iukBNWqQAv8EKDBUNntspLp9SfpaVFbmzmM0sNcnTxASQZMzRw3PsM6DMlsHiI+I6GeO5/sYDg3ecpC+SNFLrQ==", - "dev": true, - "dependencies": { - "@types/chai": "^4.3.3", - "@types/chai-subset": "^1.3.3", - "@types/node": "*", - "chai": "^4.3.6", - "debug": "^4.3.4", - "local-pkg": "^0.4.2", - "strip-literal": "^0.4.1", - "tinybench": "^2.1.5", - "tinypool": "^0.3.0", - "tinyspy": "^1.0.2", - "vite": "^2.9.12 || ^3.0.0-0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": ">=v14.16.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@vitest/browser": "*", - "@vitest/ui": "*", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "node_modules/w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dev": true, - "dependencies": { - "browser-process-hrtime": "^1.0.0" - } - }, - "node_modules/w3c-xmlserializer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz", - "integrity": "sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==", - "dev": true, - "dependencies": { - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/web-streams-polyfill": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", - "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", - "dev": true, - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", - "dev": true, - "dependencies": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/worktop": { - "version": "0.8.0-next.14", - "resolved": "https://registry.npmjs.org/worktop/-/worktop-0.8.0-next.14.tgz", - "integrity": "sha512-RZgqHu1w/JcUdWOE/BUEAzarrUUHh39eWkLdX8XpA6MfgLJF6X5Vl26CV7/wcm4O/UpZvHMGJUtB9eYTqDjc9g==", - "dev": true, - "dependencies": { - "mrmime": "^1.0.0", - "regexparam": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/ws": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.9.0.tgz", - "integrity": "sha512-Ja7nszREasGaYUYCI2k4lCKIRTt+y7XuqVoHR44YpI49TtryyqbqvDMn5eqfW7e6HzTukDRIsXqzVHScqRcafg==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xml-name-validator": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yaml": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.1.1.tgz", - "integrity": "sha512-o96x3OPo8GjWeSLF+wOAbrPfhFOGY0W00GNaxCDv+9hkcDJEnev1yh8S7pgHF0ik6zc8sQLuL8hjHjJULZp8bw==", - "dev": true, - "engines": { - "node": ">= 14" - } - }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/runtime": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz", - "integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "@bobthered/tailwindcss-palette-generator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@bobthered/tailwindcss-palette-generator/-/tailwindcss-palette-generator-3.0.0.tgz", - "integrity": "sha512-CgiMCyTnY0Q9wmaB110Fe3coXgFcA8OH0oW/TAGzwhMJ2SbnOJA93XqdVgiWcUcV1ZHRmlnMPwhASlokxmAxow==", - "dev": true - }, - "@cloudflare/workers-types": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-3.16.0.tgz", - "integrity": "sha512-gaBUSaKS65mN3iKZEgichbXYEmAa/pXkc5Gbt+1BptYphdGkj09ggdsiE4w8g0F/uI1g36QaTKrzVnBAWMipvQ==", - "dev": true - }, - "@esbuild/android-arm": { - "version": "0.15.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.9.tgz", - "integrity": "sha512-VZPy/ETF3fBG5PiinIkA0W/tlsvlEgJccyN2DzWZEl0DlVKRbu91PvY2D6Lxgluj4w9QtYHjOWjAT44C+oQ+EQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.15.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.9.tgz", - "integrity": "sha512-O+NfmkfRrb3uSsTa4jE3WApidSe3N5++fyOVGP1SmMZi4A3BZELkhUUvj5hwmMuNdlpzAZ8iAPz2vmcR7DCFQA==", - "dev": true, - "optional": true - }, - "@eslint/eslintrc": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.2.tgz", - "integrity": "sha512-AXYd23w1S/bv3fTs3Lz0vjiYemS08jWkI3hYyS9I1ry+0f+Yjs1wm+sU0BS8qDOPrBIkp4qHYC16I8uVtpLajQ==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.15.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - } - }, - "@humanwhocodes/config-array": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.5.tgz", - "integrity": "sha512-XVVDtp+dVvRxMoxSiSfasYaG02VEe1qH5cKgMQJWhol6HwzbcqoCMJi8dAGoYAO57jhUyhI6cWuRiTcRaDaYug==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - } - }, - "@humanwhocodes/gitignore-to-minimatch": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", - "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", - "dev": true - }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@iarna/toml": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", - "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==", - "dev": true - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@mapbox/node-pre-gyp": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz", - "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==", - "dev": true, - "requires": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "dependencies": { - "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - } - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@polka/url": { - "version": "1.0.0-next.21", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", - "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==", - "dev": true - }, - "@rollup/pluginutils": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", - "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", - "dev": true, - "requires": { - "estree-walker": "^2.0.1", - "picomatch": "^2.2.2" - } - }, - "@sveltejs/adapter-auto": { - "version": "1.0.0-next.79", - "resolved": "https://registry.npmjs.org/@sveltejs/adapter-auto/-/adapter-auto-1.0.0-next.79.tgz", - "integrity": "sha512-CyoL9MGBj0s2uPfTsrfSrsP9Kmj3h/Cnw4lHbXf58n0zsK2RizT+vMuMuadLVQwFJOcMtr3+6pL2BQGfqbUA5Q==", - "dev": true, - "requires": { - "@sveltejs/adapter-cloudflare": "1.0.0-next.37", - "@sveltejs/adapter-netlify": "1.0.0-next.78", - "@sveltejs/adapter-vercel": "1.0.0-next.77" - } - }, - "@sveltejs/adapter-cloudflare": { - "version": "1.0.0-next.37", - "resolved": "https://registry.npmjs.org/@sveltejs/adapter-cloudflare/-/adapter-cloudflare-1.0.0-next.37.tgz", - "integrity": "sha512-Y/k+VSw0e+IH2rPGMW6td+8WkTDwoWvsdv7NVbxCXzl+VGCODDYfZ5msPxpFHLeGmRxB9wSvNmU4PDsmyGmO8Q==", - "dev": true, - "requires": { - "@cloudflare/workers-types": "^3.14.0", - "esbuild": "^0.15.7", - "worktop": "0.8.0-next.14" - } - }, - "@sveltejs/adapter-netlify": { - "version": "1.0.0-next.78", - "resolved": "https://registry.npmjs.org/@sveltejs/adapter-netlify/-/adapter-netlify-1.0.0-next.78.tgz", - "integrity": "sha512-Yyn/j/0QcLK3Db442ducLUZmyvkO74j7Gdcwu9xN0fQN3kBlCJP9Itx5o4SySrPFGc4Q8cLJ5ELNg+mWduLBAA==", - "dev": true, - "requires": { - "@iarna/toml": "^2.2.5", - "esbuild": "^0.15.7", - "set-cookie-parser": "^2.4.8" - } - }, - "@sveltejs/adapter-static": { - "version": "1.0.0-next.43", - "resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-1.0.0-next.43.tgz", - "integrity": "sha512-PAgSp1GA8HkYE4p30/sBvJme2nefhcTBJafqQdMNoUksWZF2WzuL8OEO8wa9ndE6cghcGk3j6Ve0Oskg/wtTOw==", - "dev": true - }, - "@sveltejs/adapter-vercel": { - "version": "1.0.0-next.77", - "resolved": "https://registry.npmjs.org/@sveltejs/adapter-vercel/-/adapter-vercel-1.0.0-next.77.tgz", - "integrity": "sha512-r4MqtP+lzx83HfcvI8PU0Yxzmxt6WQq9nzZETLboJouJzhSBUFIN5RmNZfEn6nNIlUwZbGQUEK/FxsRnnxI/Ig==", - "dev": true, - "requires": { - "@vercel/nft": "^0.22.0", - "esbuild": "^0.15.7" - } - }, - "@sveltejs/kit": { - "version": "1.0.0-next.493", - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.0.0-next.493.tgz", - "integrity": "sha512-q46RfW92UBtcWoVPnFtDpaRNRmXrkbuHIePUf0sDItTbXfON29LPblK4LMqyet0ntBW519KZYCc5xH/iGEpKEw==", - "dev": true, - "requires": { - "@sveltejs/vite-plugin-svelte": "^1.0.5", - "@types/cookie": "^0.5.1", - "cookie": "^0.5.0", - "devalue": "^3.1.2", - "kleur": "^4.1.4", - "magic-string": "^0.26.2", - "mime": "^3.0.0", - "node-fetch": "^3.2.4", - "sade": "^1.8.1", - "set-cookie-parser": "^2.4.8", - "sirv": "^2.0.2", - "tiny-glob": "^0.2.9", - "undici": "^5.8.1" - } - }, - "@sveltejs/package": { - "version": "1.0.0-next.5", - "resolved": "https://registry.npmjs.org/@sveltejs/package/-/package-1.0.0-next.5.tgz", - "integrity": "sha512-cXH8ESgZ5wSPspqsuIpz0hupz+gZlX9SfVV6FdwzY2A/dzKsTXUJKOjSd7hkjr69sBMyQRLfnk9eEaTG1EXGFA==", - "dev": true, - "requires": { - "chokidar": "^3.5.3", - "kleur": "^4.1.4", - "sade": "^1.8.1", - "svelte2tsx": "~0.5.10" - } - }, - "@sveltejs/vite-plugin-svelte": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.0.8.tgz", - "integrity": "sha512-1xkVTB4pm6zuign858FzVYE9Fdw9MQBOlxrdd85STV0NvTDmcofcRpcrK+zcIyT8SZ2dseHLu8hvDwzssF6RfA==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^4.2.1", - "debug": "^4.3.4", - "deepmerge": "^4.2.2", - "kleur": "^4.1.5", - "magic-string": "^0.26.3", - "svelte-hmr": "^0.15.0" - } - }, - "@tailwindcss/forms": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.3.tgz", - "integrity": "sha512-y5mb86JUoiUgBjY/o6FJSFZSEttfb3Q5gllE4xoKjAAD+vBrnIhE4dViwUuow3va8mpH4s9jyUbUbrRGoRdc2Q==", - "dev": true, - "requires": { - "mini-svg-data-uri": "^1.2.3" - } - }, - "@testing-library/dom": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.18.1.tgz", - "integrity": "sha512-oEvsm2B/WtcHKE+IcEeeCqNU/ltFGaVyGbpcm4g/2ytuT49jrlH9x5qRKL/H3A6yfM4YAbSbC0ceT5+9CEXnLg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^4.2.0", - "aria-query": "^5.0.0", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.4.4", - "pretty-format": "^27.0.2" - } - }, - "@testing-library/svelte": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@testing-library/svelte/-/svelte-3.2.1.tgz", - "integrity": "sha512-qP5nMAx78zt+a3y9Sws9BNQYP30cOQ/LXDYuAj7wNtw86b7AtB7TFAz6/Av9hFsW3IJHPBBIGff6utVNyq+F1g==", - "dev": true, - "requires": { - "@testing-library/dom": "^8.1.0" - } - }, - "@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true - }, - "@types/aria-query": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==", - "dev": true - }, - "@types/chai": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.3.tgz", - "integrity": "sha512-hC7OMnszpxhZPduX+m+nrx+uFoLkWOMiR4oa/AZF3MuSETYTZmFfJAHqZEM8MVlvfG7BEUcgvtwoCTxBp6hm3g==", - "dev": true - }, - "@types/chai-subset": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", - "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", - "dev": true, - "requires": { - "@types/chai": "*" - } - }, - "@types/cookie": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.5.1.tgz", - "integrity": "sha512-COUnqfB2+ckwXXSFInsFdOAWQzCCx+a5hq2ruyj+Vjund94RJQd4LG2u9hnvJrTgunKAaax7ancBYlDrNYxA0g==", - "dev": true - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "@types/node": { - "version": "18.7.20", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.20.tgz", - "integrity": "sha512-adzY4vLLr5Uivmx8+zfSJ5fbdgKxX8UMtjtl+17n0B1q1Nz8JEmE151vefMdpD+1gyh+77weN4qEhej/O7budQ==", - "dev": true - }, - "@types/pug": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.6.tgz", - "integrity": "sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==", - "dev": true - }, - "@types/sass": { - "version": "1.43.1", - "resolved": "https://registry.npmjs.org/@types/sass/-/sass-1.43.1.tgz", - "integrity": "sha512-BPdoIt1lfJ6B7rw35ncdwBZrAssjcwzI5LByIrYs+tpXlj/CAkuVdRsgZDdP4lq5EjyWzwxZCqAoFyHKFwp32g==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@typescript-eslint/eslint-plugin": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.38.0.tgz", - "integrity": "sha512-GgHi/GNuUbTOeoJiEANi0oI6fF3gBQc3bGFYj40nnAPCbhrtEDf2rjBmefFadweBmO1Du1YovHeDP2h5JLhtTQ==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.38.0", - "@typescript-eslint/type-utils": "5.38.0", - "@typescript-eslint/utils": "5.38.0", - "debug": "^4.3.4", - "ignore": "^5.2.0", - "regexpp": "^3.2.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/parser": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.38.0.tgz", - "integrity": "sha512-/F63giJGLDr0ms1Cr8utDAxP2SPiglaD6V+pCOcG35P2jCqdfR7uuEhz1GIC3oy4hkUF8xA1XSXmd9hOh/a5EA==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.38.0", - "@typescript-eslint/types": "5.38.0", - "@typescript-eslint/typescript-estree": "5.38.0", - "debug": "^4.3.4" - } - }, - "@typescript-eslint/scope-manager": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.38.0.tgz", - "integrity": "sha512-ByhHIuNyKD9giwkkLqzezZ9y5bALW8VNY6xXcP+VxoH4JBDKjU5WNnsiD4HJdglHECdV+lyaxhvQjTUbRboiTA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.38.0", - "@typescript-eslint/visitor-keys": "5.38.0" - } - }, - "@typescript-eslint/type-utils": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.38.0.tgz", - "integrity": "sha512-iZq5USgybUcj/lfnbuelJ0j3K9dbs1I3RICAJY9NZZpDgBYXmuUlYQGzftpQA9wC8cKgtS6DASTvF3HrXwwozA==", - "dev": true, - "requires": { - "@typescript-eslint/typescript-estree": "5.38.0", - "@typescript-eslint/utils": "5.38.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/types": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.38.0.tgz", - "integrity": "sha512-HHu4yMjJ7i3Cb+8NUuRCdOGu2VMkfmKyIJsOr9PfkBVYLYrtMCK/Ap50Rpov+iKpxDTfnqvDbuPLgBE5FwUNfA==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.38.0.tgz", - "integrity": "sha512-6P0RuphkR+UuV7Avv7MU3hFoWaGcrgOdi8eTe1NwhMp2/GjUJoODBTRWzlHpZh6lFOaPmSvgxGlROa0Sg5Zbyg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.38.0", - "@typescript-eslint/visitor-keys": "5.38.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/utils": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.38.0.tgz", - "integrity": "sha512-6sdeYaBgk9Fh7N2unEXGz+D+som2QCQGPAf1SxrkEr+Z32gMreQ0rparXTNGRRfYUWk/JzbGdcM8NSSd6oqnTA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.38.0", - "@typescript-eslint/types": "5.38.0", - "@typescript-eslint/typescript-estree": "5.38.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.38.0.tgz", - "integrity": "sha512-MxnrdIyArnTi+XyFLR+kt/uNAcdOnmT+879os7qDRI+EYySR4crXJq9BXPfRzzLGq0wgxkwidrCJ9WCAoacm1w==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.38.0", - "eslint-visitor-keys": "^3.3.0" - } - }, - "@vercel/nft": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-0.22.1.tgz", - "integrity": "sha512-lYYZIoxRurqDOSoVIdBicGnpUIpfyaS5qVjdPq+EfI285WqtZK3NK/dyCkiyBul+X2U2OEhRyeMdXPCHGJbohw==", - "dev": true, - "requires": { - "@mapbox/node-pre-gyp": "^1.0.5", - "acorn": "^8.6.0", - "async-sema": "^3.1.1", - "bindings": "^1.4.0", - "estree-walker": "2.0.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.2", - "node-gyp-build": "^4.2.2", - "resolve-from": "^5.0.0", - "rollup-pluginutils": "^2.8.2" - } - }, - "abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "dev": true - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "dev": true - }, - "acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - } - } - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "acorn-node": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", - "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", - "dev": true, - "requires": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - } - } - }, - "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true - }, - "are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - } - }, - "arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "aria-query": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.0.2.tgz", - "integrity": "sha512-eigU3vhqSO+Z8BKDnVLN/ompjhf3pYzecKXz8+whRy+9gZu8n1TCGfwzQUUPnqdHl9ax1Hr9031orZ+UOEYr7Q==", - "dev": true - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true - }, - "async-sema": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/async-sema/-/async-sema-3.1.1.tgz", - "integrity": "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "autoprefixer": { - "version": "10.4.12", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.12.tgz", - "integrity": "sha512-WrCGV9/b97Pa+jtwf5UGaRjgQIg7OK3D06GnoYoZNcG1Xb8Gt3EfuKjlhh9i/VtT16g6PYjZ69jdJ2g8FxSC4Q==", - "dev": true, - "requires": { - "browserslist": "^4.21.4", - "caniuse-lite": "^1.0.30001407", - "fraction.js": "^4.2.0", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" - } - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true - }, - "c8": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/c8/-/c8-7.12.0.tgz", - "integrity": "sha512-CtgQrHOkyxr5koX1wEUmN/5cfDa2ckbHRA4Gy5LAL0zaCFtVWJS5++n+w4/sr2GWGerBxgTjpKeDclk/Qk6W/A==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@istanbuljs/schema": "^0.1.3", - "find-up": "^5.0.0", - "foreground-child": "^2.0.0", - "istanbul-lib-coverage": "^3.2.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-reports": "^3.1.4", - "rimraf": "^3.0.2", - "test-exclude": "^6.0.0", - "v8-to-istanbul": "^9.0.0", - "yargs": "^16.2.0", - "yargs-parser": "^20.2.9" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001411", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001411.tgz", - "integrity": "sha512-HPnJKESKuhKpHvMY1/ux7J3nG7xG8jRuL4lbyCjDRm0doTNV91tcRk60xrP7Ym9DtJH/yuqntDWBJCqpXB4b7g==", - "dev": true - }, - "chai": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", - "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", - "dev": true, - "requires": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", - "dev": true - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "dev": true - }, - "convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "cssom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", - "dev": true - }, - "cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "requires": { - "cssom": "~0.3.6" - }, - "dependencies": { - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - } - } - }, - "data-uri-to-buffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz", - "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==", - "dev": true - }, - "data-urls": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", - "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", - "dev": true, - "requires": { - "abab": "^2.0.6", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "decimal.js": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.1.tgz", - "integrity": "sha512-F29o+vci4DodHYT9UrR5IEbfBw9pE5eSapIJdTqXK5+6hq+t8VRxwQyKlW2i+KDKFkkJQRvFyI/QXD83h8LyQw==", - "dev": true - }, - "dedent-js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dedent-js/-/dedent-js-1.0.1.tgz", - "integrity": "sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==", - "dev": true - }, - "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "dev": true, - "requires": { - "type-detect": "^4.0.0" - } - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true - }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==", - "dev": true - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true - }, - "detect-indent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", - "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", - "dev": true - }, - "detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", - "dev": true - }, - "detective": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", - "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", - "dev": true, - "requires": { - "acorn-node": "^1.8.2", - "defined": "^1.0.0", - "minimist": "^1.2.6" - } - }, - "devalue": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/devalue/-/devalue-3.1.3.tgz", - "integrity": "sha512-9KO89Cb+qjzf2CqdrH+NuLaqdk9GhDP5EhR4zlkR51dvuIaiqtlkDkGzLMShDemwUy21raSMdu+kpX8Enw3yGQ==", - "dev": true - }, - "didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dom-accessibility-api": { - "version": "0.5.14", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.14.tgz", - "integrity": "sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg==", - "dev": true - }, - "domexception": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", - "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", - "dev": true, - "requires": { - "webidl-conversions": "^7.0.0" - } - }, - "electron-to-chromium": { - "version": "1.4.261", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.261.tgz", - "integrity": "sha512-fVXliNUGJ7XUVJSAasPseBbVgJIeyw5M1xIkgXdTSRjlmCqBbiSTsEdLOCJS31Fc8B7CaloQ/BFAg8By3ODLdg==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "entities": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", - "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", - "dev": true - }, - "es6-promise": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", - "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", - "dev": true - }, - "esbuild": { - "version": "0.15.9", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.9.tgz", - "integrity": "sha512-OnYr1rkMVxtmMHIAKZLMcEUlJmqcbxBz9QoBU8G9v455na0fuzlT/GLu6l+SRghrk0Mm2fSSciMmzV43Q8e0Gg==", - "dev": true, - "requires": { - "@esbuild/android-arm": "0.15.9", - "@esbuild/linux-loong64": "0.15.9", - "esbuild-android-64": "0.15.9", - "esbuild-android-arm64": "0.15.9", - "esbuild-darwin-64": "0.15.9", - "esbuild-darwin-arm64": "0.15.9", - "esbuild-freebsd-64": "0.15.9", - "esbuild-freebsd-arm64": "0.15.9", - "esbuild-linux-32": "0.15.9", - "esbuild-linux-64": "0.15.9", - "esbuild-linux-arm": "0.15.9", - "esbuild-linux-arm64": "0.15.9", - "esbuild-linux-mips64le": "0.15.9", - "esbuild-linux-ppc64le": "0.15.9", - "esbuild-linux-riscv64": "0.15.9", - "esbuild-linux-s390x": "0.15.9", - "esbuild-netbsd-64": "0.15.9", - "esbuild-openbsd-64": "0.15.9", - "esbuild-sunos-64": "0.15.9", - "esbuild-windows-32": "0.15.9", - "esbuild-windows-64": "0.15.9", - "esbuild-windows-arm64": "0.15.9" - } - }, - "esbuild-android-64": { - "version": "0.15.9", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.9.tgz", - "integrity": "sha512-HQCX7FJn9T4kxZQkhPjNZC7tBWZqJvhlLHPU2SFzrQB/7nDXjmTIFpFTjt7Bd1uFpeXmuwf5h5fZm+x/hLnhbw==", - "dev": true, - "optional": true - }, - "esbuild-android-arm64": { - "version": "0.15.9", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.9.tgz", - "integrity": "sha512-E6zbLfqbFVCNEKircSHnPiSTsm3fCRxeIMPfrkS33tFjIAoXtwegQfVZqMGR0FlsvVxp2NEDOUz+WW48COCjSg==", - "dev": true, - "optional": true - }, - "esbuild-darwin-64": { - "version": "0.15.9", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.9.tgz", - "integrity": "sha512-gI7dClcDN/HHVacZhTmGjl0/TWZcGuKJ0I7/xDGJwRQQn7aafZGtvagOFNmuOq+OBFPhlPv1T6JElOXb0unkSQ==", - "dev": true, - "optional": true - }, - "esbuild-darwin-arm64": { - "version": "0.15.9", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.9.tgz", - "integrity": "sha512-VZIMlcRN29yg/sv7DsDwN+OeufCcoTNaTl3Vnav7dL/nvsApD7uvhVRbgyMzv0zU/PP0xRhhIpTyc7lxEzHGSw==", - "dev": true, - "optional": true - }, - "esbuild-freebsd-64": { - "version": "0.15.9", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.9.tgz", - "integrity": "sha512-uM4z5bTvuAXqPxrI204txhlsPIolQPWRMLenvGuCPZTnnGlCMF2QLs0Plcm26gcskhxewYo9LkkmYSS5Czrb5A==", - "dev": true, - "optional": true - }, - "esbuild-freebsd-arm64": { - "version": "0.15.9", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.9.tgz", - "integrity": "sha512-HHDjT3O5gWzicGdgJ5yokZVN9K9KG05SnERwl9nBYZaCjcCgj/sX8Ps1jvoFSfNCO04JSsHSOWo4qvxFuj8FoA==", - "dev": true, - "optional": true - }, - "esbuild-linux-32": { - "version": "0.15.9", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.9.tgz", - "integrity": "sha512-AQIdE8FugGt1DkcekKi5ycI46QZpGJ/wqcMr7w6YUmOmp2ohQ8eO4sKUsOxNOvYL7hGEVwkndSyszR6HpVHLFg==", - "dev": true, - "optional": true - }, - "esbuild-linux-64": { - "version": "0.15.9", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.9.tgz", - "integrity": "sha512-4RXjae7g6Qs7StZyiYyXTZXBlfODhb1aBVAjd+ANuPmMhWthQilWo7rFHwJwL7DQu1Fjej2sODAVwLbcIVsAYQ==", - "dev": true, - "optional": true - }, - "esbuild-linux-arm": { - "version": "0.15.9", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.9.tgz", - "integrity": "sha512-3Zf2GVGUOI7XwChH3qrnTOSqfV1V4CAc/7zLVm4lO6JT6wbJrTgEYCCiNSzziSju+J9Jhf9YGWk/26quWPC6yQ==", - "dev": true, - "optional": true - }, - "esbuild-linux-arm64": { - "version": "0.15.9", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.9.tgz", - "integrity": "sha512-a+bTtxJmYmk9d+s2W4/R1SYKDDAldOKmWjWP0BnrWtDbvUBNOm++du0ysPju4mZVoEFgS1yLNW+VXnG/4FNwdQ==", - "dev": true, - "optional": true - }, - "esbuild-linux-mips64le": { - "version": "0.15.9", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.9.tgz", - "integrity": "sha512-Zn9HSylDp89y+TRREMDoGrc3Z4Hs5u56ozZLQCiZAUx2+HdbbXbWdjmw3FdTJ/i7t5Cew6/Q+6kfO3KCcFGlyw==", - "dev": true, - "optional": true - }, - "esbuild-linux-ppc64le": { - "version": "0.15.9", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.9.tgz", - "integrity": "sha512-OEiOxNAMH9ENFYqRsWUj3CWyN3V8P3ZXyfNAtX5rlCEC/ERXrCEFCJji/1F6POzsXAzxvUJrTSTCy7G6BhA6Fw==", - "dev": true, - "optional": true - }, - "esbuild-linux-riscv64": { - "version": "0.15.9", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.9.tgz", - "integrity": "sha512-ukm4KsC3QRausEFjzTsOZ/qqazw0YvJsKmfoZZm9QW27OHjk2XKSQGGvx8gIEswft/Sadp03/VZvAaqv5AIwNA==", - "dev": true, - "optional": true - }, - "esbuild-linux-s390x": { - "version": "0.15.9", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.9.tgz", - "integrity": "sha512-uDOQEH55wQ6ahcIKzQr3VyjGc6Po/xblLGLoUk3fVL1qjlZAibtQr6XRfy5wPJLu/M2o0vQKLq4lyJ2r1tWKcw==", - "dev": true, - "optional": true - }, - "esbuild-netbsd-64": { - "version": "0.15.9", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.9.tgz", - "integrity": "sha512-yWgxaYTQz+TqX80wXRq6xAtb7GSBAp6gqLKfOdANg9qEmAI1Bxn04IrQr0Mzm4AhxvGKoHzjHjMgXbCCSSDxcw==", - "dev": true, - "optional": true - }, - "esbuild-openbsd-64": { - "version": "0.15.9", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.9.tgz", - "integrity": "sha512-JmS18acQl4iSAjrEha1MfEmUMN4FcnnrtTaJ7Qg0tDCOcgpPPQRLGsZqhes0vmx8VA6IqRyScqXvaL7+Q0Uf3A==", - "dev": true, - "optional": true - }, - "esbuild-sunos-64": { - "version": "0.15.9", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.9.tgz", - "integrity": "sha512-UKynGSWpzkPmXW3D2UMOD9BZPIuRaSqphxSCwScfEE05Be3KAmvjsBhht1fLzKpiFVJb0BYMd4jEbWMyJ/z1hQ==", - "dev": true, - "optional": true - }, - "esbuild-windows-32": { - "version": "0.15.9", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.9.tgz", - "integrity": "sha512-aqXvu4/W9XyTVqO/hw3rNxKE1TcZiEYHPsXM9LwYmKSX9/hjvfIJzXwQBlPcJ/QOxedfoMVH0YnhhQ9Ffb0RGA==", - "dev": true, - "optional": true - }, - "esbuild-windows-64": { - "version": "0.15.9", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.9.tgz", - "integrity": "sha512-zm7h91WUmlS4idMtjvCrEeNhlH7+TNOmqw5dJPJZrgFaxoFyqYG6CKDpdFCQXdyKpD5yvzaQBOMVTCBVKGZDEg==", - "dev": true, - "optional": true - }, - "esbuild-windows-arm64": { - "version": "0.15.9", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.9.tgz", - "integrity": "sha512-yQEVIv27oauAtvtuhJVfSNMztJJX47ismRS6Sv2QMVV9RM+6xjbMWuuwM2nxr5A2/gj/mu2z9YlQxiwoFRCfZA==", - "dev": true, - "optional": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", - "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - } - } - }, - "eslint": { - "version": "8.24.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.24.0.tgz", - "integrity": "sha512-dWFaPhGhTAiPcCgm3f6LI2MBWbogMnTJzFBbhXVRQDJPkr9pGZvVjlVfXd+vyDcWPA2Ic9L2AXPIQM0+vk/cSQ==", - "dev": true, - "requires": { - "@eslint/eslintrc": "^1.3.2", - "@humanwhocodes/config-array": "^0.10.5", - "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", - "@humanwhocodes/module-importer": "^1.0.1", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.1", - "globals": "^13.15.0", - "globby": "^11.1.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-sdsl": "^4.1.4", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, - "dependencies": { - "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - } - } - }, - "eslint-config-prettier": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", - "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", - "dev": true, - "requires": {} - }, - "eslint-plugin-svelte3": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-svelte3/-/eslint-plugin-svelte3-4.0.0.tgz", - "integrity": "sha512-OIx9lgaNzD02+MDFNLw0GEUbuovNcglg+wnd/UY0fbZmlQSz7GlQiQ1f+yX0XvC07XPcDOnFcichqI3xCwp71g==", - "dev": true, - "requires": {} - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true - }, - "espree": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", - "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", - "dev": true, - "requires": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fetch-blob": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", - "dev": true, - "requires": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - } - }, - "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", - "dev": true, - "requires": { - "fetch-blob": "^3.1.2" - } - }, - "fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", - "dev": true - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "dev": true, - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", - "dev": true - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globalyzer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", - "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==", - "dev": true - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "globrex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", - "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", - "dev": true - }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "dev": true - }, - "highlight.js": { - "version": "11.6.0", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.6.0.tgz", - "integrity": "sha512-ig1eqDzJaB0pqEvlPVIpSSyMaO92bH1N2rJpLMN/nX396wTpDA4Eq0uK+7I/2XG17pFaaKE0kjV/XPeGt7Evjw==", - "dev": true - }, - "html-encoding-sniffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", - "dev": true, - "requires": { - "whatwg-encoding": "^2.0.0" - } - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "requires": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - } - }, - "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - } - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - } - }, - "istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "js-sdsl": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.4.tgz", - "integrity": "sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "jsdom": { - "version": "20.0.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.0.tgz", - "integrity": "sha512-x4a6CKCgx00uCmP+QakBDFXwjAJ69IkkIWHmtmjd3wvXPcdOS44hfX2vqkOQrVrq8l9DhNNADZRXaCEWvgXtVA==", - "dev": true, - "requires": { - "abab": "^2.0.6", - "acorn": "^8.7.1", - "acorn-globals": "^6.0.0", - "cssom": "^0.5.0", - "cssstyle": "^2.3.0", - "data-urls": "^3.0.2", - "decimal.js": "^10.3.1", - "domexception": "^4.0.0", - "escodegen": "^2.0.0", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.1", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "^7.0.0", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^3.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^2.0.0", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0", - "ws": "^8.8.0", - "xml-name-validator": "^4.0.0" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "dev": true - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lilconfig": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", - "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", - "dev": true - }, - "local-pkg": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.2.tgz", - "integrity": "sha512-mlERgSPrbxU3BP4qBqAvvwlgW4MTg78iwJdGGnv7kibKjWcJksrG3t6LB5lXI93wXRDvG4NpUgJFmTG4T6rdrg==", - "dev": true - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "loupe": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", - "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==", - "dev": true, - "requires": { - "get-func-name": "^2.0.0" - } - }, - "lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, - "requires": { - "tslib": "^2.0.3" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "lz-string": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", - "integrity": "sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ==", - "dev": true - }, - "magic-string": { - "version": "0.26.4", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.4.tgz", - "integrity": "sha512-e5uXtVJ22aEpK9u1+eQf0fSxHeqwyV19K+uGnlROCxUhzwRip9tBsaMViK/0vC3viyPd5Gtucp3UmEp/Q2cPTQ==", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.8" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "dev": true - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "requires": { - "mime-db": "1.52.0" - } - }, - "min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true - }, - "mini-svg-data-uri": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", - "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "minipass": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz", - "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - } - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "requires": { - "minimist": "^1.2.6" - } - }, - "mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "dev": true - }, - "mrmime": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", - "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, - "requires": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "dev": true - }, - "node-fetch": { - "version": "3.2.10", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.2.10.tgz", - "integrity": "sha512-MhuzNwdURnZ1Cp4XTazr69K0BTizsBroX7Zx3UgDSVcZYKF/6p0CBe4EUb/hLqmzVhl0UpYfgRljQ4yxE+iCxA==", - "dev": true, - "requires": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - } - }, - "node-gyp-build": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", - "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==", - "dev": true - }, - "node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", - "dev": true - }, - "nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true - }, - "npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "dev": true, - "requires": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "nwsapi": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.2.tgz", - "integrity": "sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true - }, - "object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse5": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.1.tgz", - "integrity": "sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==", - "dev": true, - "requires": { - "entities": "^4.4.0" - } - }, - "pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dev": true, - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true - }, - "postcss": { - "version": "8.4.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", - "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==", - "dev": true, - "requires": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - } - }, - "postcss-import": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", - "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - } - }, - "postcss-js": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", - "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", - "dev": true, - "requires": { - "camelcase-css": "^2.0.1" - } - }, - "postcss-load-config": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", - "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", - "dev": true, - "requires": { - "lilconfig": "^2.0.5", - "yaml": "^2.1.1" - } - }, - "postcss-nested": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", - "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.6" - } - }, - "postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", - "dev": true - }, - "prettier-plugin-svelte": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-2.7.0.tgz", - "integrity": "sha512-fQhhZICprZot2IqEyoiUYLTRdumULGRvw0o4dzl5jt0jfzVWdGqeYW27QTWAeXhoupEZJULmNoH3ueJwUWFLIA==", - "dev": true, - "requires": {} - }, - "pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - } - } - }, - "psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true - }, - "react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true - }, - "read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, - "requires": { - "pify": "^2.3.0" - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", - "dev": true - }, - "regexparam": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexparam/-/regexparam-2.0.1.tgz", - "integrity": "sha512-zRgSaYemnNYxUv+/5SeoHI0eJIgTL/A2pUtXUPLHQxUldagouJ9p+K6IbIZ/JiQuCEv2E2B1O11SjVQy3aMCkw==", - "dev": true - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "rollup": { - "version": "2.78.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.78.1.tgz", - "integrity": "sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==", - "dev": true, - "requires": { - "fsevents": "~2.3.2" - } - }, - "rollup-pluginutils": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", - "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", - "dev": true, - "requires": { - "estree-walker": "^0.6.1" - }, - "dependencies": { - "estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", - "dev": true - } - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "sade": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", - "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", - "dev": true, - "requires": { - "mri": "^1.1.0" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sander": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz", - "integrity": "sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==", - "dev": true, - "requires": { - "es6-promise": "^3.1.2", - "graceful-fs": "^4.1.3", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.2" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "dev": true, - "requires": { - "xmlchars": "^2.2.0" - } - }, - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "set-cookie-parser": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.5.1.tgz", - "integrity": "sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "sirv": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.2.tgz", - "integrity": "sha512-4Qog6aE29nIjAOKe/wowFTxOdmbEZKb+3tsLljaBRzJwtqto0BChD2zzH0LhgCSXiI+V7X+Y45v14wBZQ1TK3w==", - "dev": true, - "requires": { - "@polka/url": "^1.0.0-next.20", - "mrmime": "^1.0.0", - "totalist": "^3.0.0" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "sorcery": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.10.0.tgz", - "integrity": "sha512-R5ocFmKZQFfSTstfOtHjJuAwbpGyf9qjQa1egyhvXSbM7emjrtLXtGdZsDJDABC85YBfVvrOiGWKSYXPKdvP1g==", - "dev": true, - "requires": { - "buffer-crc32": "^0.2.5", - "minimist": "^1.2.0", - "sander": "^0.5.0", - "sourcemap-codec": "^1.3.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true - }, - "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true - }, - "sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "requires": { - "min-indent": "^1.0.0" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "strip-literal": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-0.4.2.tgz", - "integrity": "sha512-pv48ybn4iE1O9RLgCAN0iU4Xv7RlBTiit6DKmMiErbs9x1wH6vXBs45tWc0H5wUIF6TLTrKweqkmYF/iraQKNw==", - "dev": true, - "requires": { - "acorn": "^8.8.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "svelte": { - "version": "3.50.1", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.50.1.tgz", - "integrity": "sha512-bS4odcsdj5D5jEg6riZuMg5NKelzPtmsCbD9RG+8umU03TeNkdWnP6pqbCm0s8UQNBkqk29w/Bdubn3C+HWSwA==", - "dev": true - }, - "svelte-check": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-2.9.0.tgz", - "integrity": "sha512-9AVrtP7WbfDgCdqTZNPdj5CCCy1OrYMxFVWAWzNw7fl93c9klFJFtqzVXa6fovfQ050CcpUyJE2dPFL9TFAREw==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.9", - "chokidar": "^3.4.1", - "fast-glob": "^3.2.7", - "import-fresh": "^3.2.1", - "picocolors": "^1.0.0", - "sade": "^1.7.4", - "svelte-preprocess": "^4.0.0", - "typescript": "*" - } - }, - "svelte-hmr": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.0.tgz", - "integrity": "sha512-Aw21SsyoohyVn4yiKXWPNCSW2DQNH/76kvUnE9kpt4h9hcg9tfyQc6xshx9hzgMfGF0kVx0EGD8oBMWSnATeOg==", - "dev": true, - "requires": {} - }, - "svelte-preprocess": { - "version": "4.10.7", - "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-4.10.7.tgz", - "integrity": "sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==", - "dev": true, - "requires": { - "@types/pug": "^2.0.4", - "@types/sass": "^1.16.0", - "detect-indent": "^6.0.0", - "magic-string": "^0.25.7", - "sorcery": "^0.10.0", - "strip-indent": "^3.0.0" - }, - "dependencies": { - "magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.8" - } - } - } - }, - "svelte2tsx": { - "version": "0.5.18", - "resolved": "https://registry.npmjs.org/svelte2tsx/-/svelte2tsx-0.5.18.tgz", - "integrity": "sha512-yhfEv1xvTYJZR/6Abygw09IH7uhAprKbar6Vk/YsfJyNcz4PQc/EHlG0LJbsm+FW8Us6ihZ9KJC4u+FnNW99lg==", - "dev": true, - "requires": { - "dedent-js": "^1.0.1", - "pascal-case": "^3.1.1" - } - }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "tailwindcss": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.1.8.tgz", - "integrity": "sha512-YSneUCZSFDYMwk+TGq8qYFdCA3yfBRdBlS7txSq0LUmzyeqRe3a8fBQzbz9M3WS/iFT4BNf/nmw9mEzrnSaC0g==", - "dev": true, - "requires": { - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "color-name": "^1.1.4", - "detective": "^5.2.1", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.2.11", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "lilconfig": "^2.0.6", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.14", - "postcss-import": "^14.1.0", - "postcss-js": "^4.0.0", - "postcss-load-config": "^3.1.4", - "postcss-nested": "5.0.6", - "postcss-selector-parser": "^6.0.10", - "postcss-value-parser": "^4.2.0", - "quick-lru": "^5.1.1", - "resolve": "^1.22.1" - }, - "dependencies": { - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "postcss-load-config": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", - "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", - "dev": true, - "requires": { - "lilconfig": "^2.0.5", - "yaml": "^1.10.2" - } - }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true - } - } - }, - "tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", - "dev": true, - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - } - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "tiny-glob": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", - "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", - "dev": true, - "requires": { - "globalyzer": "0.1.0", - "globrex": "^0.1.2" - } - }, - "tinybench": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.1.5.tgz", - "integrity": "sha512-ak+PZZEuH3mw6CCFOgf5S90YH0MARnZNhxjhjguAmoJimEMAJuNip/rJRd6/wyylHItomVpKTzZk9zrhTrQCoQ==", - "dev": true - }, - "tinypool": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.3.0.tgz", - "integrity": "sha512-NX5KeqHOBZU6Bc0xj9Vr5Szbb1j8tUHIeD18s41aDJaPeC5QTdEhK0SpdpUrZlj2nv5cctNcSjaKNanXlfcVEQ==", - "dev": true - }, - "tinyspy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-1.0.2.tgz", - "integrity": "sha512-bSGlgwLBYf7PnUsQ6WOc6SJ3pGOcd+d8AA6EUnLDDM0kWEstC1JIlSZA3UNliDXhd9ABoS7hiRBDCu+XP/sf1Q==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "totalist": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.0.tgz", - "integrity": "sha512-eM+pCBxXO/njtF7vdFsHuqb+ElbxqtI4r5EAvk6grfAFyJ6IvWlSkfZ5T9ozC6xWw3Fj1fGoSmrl0gUs46JVIw==", - "dev": true - }, - "tough-cookie": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz", - "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==", - "dev": true, - "requires": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - } - }, - "tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", - "dev": true, - "requires": { - "punycode": "^2.1.1" - } - }, - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "typescript": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz", - "integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==", - "dev": true - }, - "undici": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.10.0.tgz", - "integrity": "sha512-c8HsD3IbwmjjbLvoZuRI26TZic+TSEe8FPMLLOkN1AfYRhdjnKBU6yL+IwcSCbdZiX4e5t0lfMDLDCqj4Sq70g==", - "dev": true - }, - "universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true - }, - "update-browserslist-db": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz", - "integrity": "sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==", - "dev": true, - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "v8-to-istanbul": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", - "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" - } - }, - "vite": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-3.1.3.tgz", - "integrity": "sha512-/3XWiktaopByM5bd8dqvHxRt5EEgRikevnnrpND0gRfNkrMrPaGGexhtLCzv15RcCMtV2CLw+BPas8YFeSG0KA==", - "dev": true, - "requires": { - "esbuild": "^0.15.6", - "fsevents": "~2.3.2", - "postcss": "^8.4.16", - "resolve": "^1.22.1", - "rollup": "~2.78.0" - } - }, - "vitest": { - "version": "0.23.4", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.23.4.tgz", - "integrity": "sha512-iukBNWqQAv8EKDBUNntspLp9SfpaVFbmzmM0sNcnTxASQZMzRw3PsM6DMlsHiI+I6GeO5/sYDg3ecpC+SNFLrQ==", - "dev": true, - "requires": { - "@types/chai": "^4.3.3", - "@types/chai-subset": "^1.3.3", - "@types/node": "*", - "chai": "^4.3.6", - "debug": "^4.3.4", - "local-pkg": "^0.4.2", - "strip-literal": "^0.4.1", - "tinybench": "^2.1.5", - "tinypool": "^0.3.0", - "tinyspy": "^1.0.2", - "vite": "^2.9.12 || ^3.0.0-0" - } - }, - "w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dev": true, - "requires": { - "browser-process-hrtime": "^1.0.0" - } - }, - "w3c-xmlserializer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz", - "integrity": "sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==", - "dev": true, - "requires": { - "xml-name-validator": "^4.0.0" - } - }, - "web-streams-polyfill": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", - "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", - "dev": true - }, - "webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true - }, - "whatwg-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", - "dev": true, - "requires": { - "iconv-lite": "0.6.3" - } - }, - "whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", - "dev": true - }, - "whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", - "dev": true, - "requires": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "worktop": { - "version": "0.8.0-next.14", - "resolved": "https://registry.npmjs.org/worktop/-/worktop-0.8.0-next.14.tgz", - "integrity": "sha512-RZgqHu1w/JcUdWOE/BUEAzarrUUHh39eWkLdX8XpA6MfgLJF6X5Vl26CV7/wcm4O/UpZvHMGJUtB9eYTqDjc9g==", - "dev": true, - "requires": { - "mrmime": "^1.0.0", - "regexparam": "^2.0.0" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "ws": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.9.0.tgz", - "integrity": "sha512-Ja7nszREasGaYUYCI2k4lCKIRTt+y7XuqVoHR44YpI49TtryyqbqvDMn5eqfW7e6HzTukDRIsXqzVHScqRcafg==", - "dev": true, - "requires": {} - }, - "xml-name-validator": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", - "dev": true - }, - "xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yaml": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.1.1.tgz", - "integrity": "sha512-o96x3OPo8GjWeSLF+wOAbrPfhFOGY0W00GNaxCDv+9hkcDJEnev1yh8S7pgHF0ik6zc8sQLuL8hjHjJULZp8bw==", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - } - } -} diff --git a/package.json b/package.json index 869d0e529f..1d18196be6 100644 --- a/package.json +++ b/package.json @@ -1,54 +1,38 @@ { - "name": "@brainandbones/skeleton", - "version": "0.50.6", - "description": "A SvelteKit component library.", - "author": "endigo9740 <csimmons@brainandbonesllc.com>", + "name": "@skeletonlabs/monorepo", + "private": true, + "type": "module", "scripts": { - "dev": "vite dev", - "build": "vite build", - "package": "svelte-kit sync && svelte-package", - "patch-package": "npm version patch && svelte-kit package", - "publish": "npm publish ./package", - "preview": "vite preview", - "check": "svelte-check --tsconfig ./tsconfig.json", - "check:watch": "svelte-check --tsconfig ./tsconfig.json --watch", - "lint": "prettier --ignore-path .gitignore --check --plugin-search-dir=. . && eslint --ignore-path .gitignore .", - "format": "prettier --ignore-path .gitignore --write --plugin-search-dir=. .", - "test": "vitest", - "coverage": "vitest run --coverage" + "dev": "pnpm --parallel dev", + "dev:docs": "pnpm --parallel --filter @skeletonlabs/skeleton --filter @skeletonlabs/skeleton-svelte --filter @skeletonlabs/skeleton-react --filter @skeletonlabs/skeleton-common --filter @skeletonlabs/skeleton.dev dev", + "dev:themes": "pnpm --parallel --filter @skeletonlabs/skeleton --filter @skeletonlabs/skeleton-themes dev", + "dev:svelte": "pnpm --parallel --filter @skeletonlabs/skeleton --filter @skeletonlabs/skeleton-svelte --filter @skeletonlabs/skeleton-common --filter @skeletonlabs/playground-skeleton-svelte dev", + "dev:react": "pnpm --parallel --filter @skeletonlabs/skeleton --filter @skeletonlabs/skeleton-react --filter @skeletonlabs/skeleton-common --filter @skeletonlabs/playground-skeleton-react dev", + "build": "pnpm --recursive --aggregate-output --reporter=append-only build", + "test": "pnpm --recursive -aggregate-output --reporter=append-only --parallel test", + "check": "pnpm --recursive -aggregate-output --reporter=append-only --parallel check", + "format": "prettier . --cache --write --list-different", + "format:check": "prettier . --cache --check", + "lint": "oxlint . --type-aware --fix", + "lint:check": "oxlint . --type-aware", + "changeset:publish": "changeset publish", + "changeset:version": "changeset version && pnpm format", + "postinstall": "pnpm --silent --recursive --parallel sync" }, "devDependencies": { - "@bobthered/tailwindcss-palette-generator": "^3.0.0", - "@sveltejs/adapter-auto": "1.0.0-next.79", - "@sveltejs/adapter-static": "1.0.0-next.43", - "@sveltejs/kit": "1.0.0-next.493", - "@sveltejs/package": "1.0.0-next.5", - "@tailwindcss/forms": "^0.5.3", - "@testing-library/dom": "^8.18.1", - "@testing-library/svelte": "^3.2.1", - "@typescript-eslint/eslint-plugin": "^5.38.0", - "@typescript-eslint/parser": "^5.38.0", - "autoprefixer": "^10.4.12", - "c8": "^7.12.0", - "eslint": "^8.23.1", - "eslint-config-prettier": "^8.5.0", - "eslint-plugin-svelte3": "^4.0.0", - "highlight.js": "^11.6.0", - "jsdom": "^20.0.0", - "postcss": "^8.4.16", - "postcss-load-config": "^4.0.1", - "prettier": "^2.7.1", - "prettier-plugin-svelte": "^2.7.0", - "svelte": "^3.50.1", - "svelte-check": "^2.9.0", - "svelte-preprocess": "^4.10.7", - "svelte2tsx": "^0.5.18", - "tailwindcss": "^3.1.8", - "tslib": "^2.4.0", - "typescript": "^4.8.3", - "vite": "^3.1.3", - "vitest": "^0.23.4" + "@changesets/cli": "catalog:", + "@svitejs/changesets-changelog-github.amrom.workers.devpact": "catalog:", + "@trivago/prettier-plugin-sort-imports": "catalog:", + "oxlint": "catalog:", + "oxlint-tsgolint": "catalog:", + "prettier": "catalog:", + "prettier-plugin-astro": "catalog:", + "prettier-plugin-svelte": "catalog:", + "prettier-plugin-tailwindcss": "catalog:" }, - "type": "module", - "types": "index.d.ts" -} \ No newline at end of file + "engines": { + "node": ">=22.18.0", + "pnpm": ">=10.15.0" + }, + "packageManager": "pnpm@10.16.1" +} diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md new file mode 100644 index 0000000000..a26c47cff2 --- /dev/null +++ b/packages/cli/CHANGELOG.md @@ -0,0 +1,299 @@ +# skeleton + +## 1.0.1-next.2 + +### Patch Changes + +- chore: update readme ([#3805](https://github.com/skeletonlabs/skeleton/pull/3805)) + +## 1.0.1-next.1 + +### Patch Changes + +- chore: trusted publishing ([#3792](https://github.com/skeletonlabs/skeleton/pull/3792)) + +## 1.0.1-next.0 + +### Patch Changes + +- perf: Reduce overhead in v3 module migrations ([#3777](https://github.com/skeletonlabs/skeleton/pull/3777)) + +## 1.0.0 + +### Major Changes + +- feat: 1.0 ([#3503](https://github.com/skeletonlabs/skeleton/pull/3503)) + +## 0.1.0 + +### Minor Changes + +- feat: add `skeleton` to bin paths ([#3500](https://github.com/skeletonlabs/skeleton/pull/3500)) + +## 0.0.5 + +### Patch Changes + +- fix: Simplify `script` parsing in Svelte modules ([#3451](https://github.com/skeletonlabs/skeleton/pull/3451)) + +## 0.0.4 + +### Patch Changes + +- fix: app.css being transformed twice ([#3392](https://github.com/skeletonlabs/skeleton/pull/3392)) + +## 0.0.3 + +### Patch Changes + +- fix: write to file using utf-8 ([#3390](https://github.com/skeletonlabs/skeleton/pull/3390)) + +## 0.0.2 + +### Patch Changes + +- fix: Correct the glob matcher for sourcefiles in the `skeleton-3` migration ([#3388](https://github.com/skeletonlabs/skeleton/pull/3388)) + +## 0.0.1 + +### Patch Changes + +- Feature: The `class:` directive will also be transformed when they're not also an identifier. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- Bugfix: transformations on the package.json now preserve the original indentation. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- Bugfix: `cwd` was wrongly interpeted. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- Bugfix (migrate/skeleton-3): Perserve non-skeleton imports and identifiers. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- Feature: `app.html` is now transformed. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- Feature: Svelte template code is now included when migrating svelte code. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- Feature: Better error handling is now in place. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- Bugfix (migrate/skeleton-3): Export mappings are safely accessed. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- Feature (migrate/skeleton-3): Installing dependencies shows actual spinner. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- Feature: Svelte `<script>` tags are transformed. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- Initial release. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- Feature (migrate/skeleton-3): Tailwind V4 support. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- bugfix: Add `@source` when component library is present ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- Feature: tailwind.config transformation also include skeleton configuration. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- Feature: `<packagemanager> install` is now ran at the end of the migration. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- Bugfix (migrate/skeleton-3): Renaming components no longer includes a bug that could cause invalid components to be produced in bigger components ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- Bugfix (migrate/skeleton-3): Correctly handle conflicting renames/imports. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- bugfix: Append `dist` to the Skeleton `@source` path as workaround for https://github.com/tailwindlabs/tailwindcss/issues/16038 ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- Feature: Rename all components imports and usages. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- Feature (migrate/skeleton-3): All removed and renamed exports are now migrated. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- Bugfix (migrate/skeleton-3): Selecting a single folder would cause 0 files to be globbed. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- Chore (migrate/skeleton-3): Simpler method of preserving quotes in Svelte template. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- Bugfix (migrate/skeleton-3): Special characters like `\n`, `\t`, etc. are no longer literally interpreted. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- Bugfix (migrate/skeleton-3): Empty strings no longer crash the `transformSvelte` function ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- Bugfix (migrate/skeleton-3): Partially reverts the previous change to `hasRange` and checks for empty strings instead as it's more consistent in the cases where we're preserving quotes. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- Bugfix: Add `bin` back to package.json ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- Feature (migrate/skeleton-3): Skeleton classes `@apply` rules in stylesheets (.{css,pcss,postcss}, <style></style>) are now transformed. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- bugfix: Theme import is correctly migrated ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- Feature: TS/JS modules are transformed. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- Bugfix (migrate/skeleton-3): Switch from `property in object` to `Object.hasOwn` so inherited properties aren't included. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- Feature: Source file directories are now prompted instead of being assumed. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- Bugfix (migrate/skeleton-3): Additionally check if range actually has characters (start < end). ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- Bugfix: Fixed longstanding bug of svelte files not being transformed properly. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- Feature (migrate/skeleton-3): `TabGroup` is now renamed to `Tabs` ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- Feature: Name, description and version are now pulled from the `package.json`. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- Feature (migrate/skeleton-3): All file transformations are batched to write to disk at the end of the migration, this will prevent any files being written to disk if any of the file transformations fail. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- Bugfix (migrate/skeleton-3): Remove `fixUnusedIdentifiers` calls to reduce migration noise. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- Bugfix: Unused identifiers like imports are removed after tranformation. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- Feature: Removed components have their imports removed. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +## 0.0.1-next.20 + +### Patch Changes + +- bugfix: Append `dist` to the Skeleton `@source` path as workaround for https://github.com/tailwindlabs/tailwindcss/issues/16038 ([#3307](https://github.com/skeletonlabs/skeleton/pull/3307)) + +## 0.0.1-next.19 + +### Patch Changes + +- bugfix: Add `@source` when component library is present ([#3262](https://github.com/skeletonlabs/skeleton/pull/3262)) + +- bugfix: Theme import is correctly migrated ([#3253](https://github.com/skeletonlabs/skeleton/pull/3253)) + +## 0.0.1-next.18 + +### Patch Changes + +- Feature (migrate/skeleton-3): Tailwind V4 support. ([#3231](https://github.com/skeletonlabs/skeleton/pull/3231)) + +- Feature (migrate/skeleton-3): Skeleton classes `@apply` rules in stylesheets (.{css,pcss,postcss}, <style></style>) are now transformed. ([#3231](https://github.com/skeletonlabs/skeleton/pull/3231)) + +## 0.0.1-next.17 + +### Patch Changes + +- Feature (migrate/skeleton-3): Installing dependencies shows actual spinner. ([#3150](https://github.com/skeletonlabs/skeleton/pull/3150)) + +## 0.0.1-next.16 + +### Patch Changes + +- Bugfix (migrate/skeleton-3): Perserve non-skeleton imports and identifiers. ([#3148](https://github.com/skeletonlabs/skeleton/pull/3148)) + +## 0.0.1-next.15 + +### Patch Changes + +- Bugfix (migrate/skeleton-3): Export mappings are safely accessed. ([#3146](https://github.com/skeletonlabs/skeleton/pull/3146)) + +## 0.0.1-next.14 + +### Patch Changes + +- Bugfix (migrate/skeleton-3): Correctly handle conflicting renames/imports. ([#3144](https://github.com/skeletonlabs/skeleton/pull/3144)) + +## 0.0.1-next.13 + +### Patch Changes + +- Feature (migrate/skeleton-3): All removed and renamed exports are now migrated. ([#3139](https://github.com/skeletonlabs/skeleton/pull/3139)) + +## 0.0.1-next.12 + +### Patch Changes + +- Chore (migrate/skeleton-3): Simpler method of preserving quotes in Svelte template. ([#3132](https://github.com/skeletonlabs/skeleton/pull/3132)) + +## 0.0.1-next.11 + +### Patch Changes + +- Bugfix (migrate/skeleton-3): Special characters like `\n`, `\t`, etc. are no longer literally interpreted. ([#3130](https://github.com/skeletonlabs/skeleton/pull/3130)) + +## 0.0.1-next.10 + +### Patch Changes + +- Bugfix (migrate/skeleton-3): Switch from `property in object` to `Object.hasOwn` so inherited properties aren't included. ([#3127](https://github.com/skeletonlabs/skeleton/pull/3127)) + +## 0.0.1-next.9 + +### Patch Changes + +- Bugfix (migrate/skeleton-3): Partially reverts the previous change to `hasRange` and checks for empty strings instead as it's more consistent in the cases where we're preserving quotes. ([#3125](https://github.com/skeletonlabs/skeleton/pull/3125)) + +## 0.0.1-next.8 + +### Patch Changes + +- Bugfix (migrate/skeleton-3): Selecting a single folder would cause 0 files to be globbed. ([#3123](https://github.com/skeletonlabs/skeleton/pull/3123)) + +- Bugfix (migrate/skeleton-3): Additionally check if range actually has characters (start < end). ([#3123](https://github.com/skeletonlabs/skeleton/pull/3123)) + +## 0.0.1-next.7 + +### Patch Changes + +- Feature: Name, description and version are now pulled from the `package.json`. ([#3116](https://github.com/skeletonlabs/skeleton/pull/3116)) + +- Bugfix (migrate/skeleton-3): Remove `fixUnusedIdentifiers` calls to reduce migration noise. ([#3119](https://github.com/skeletonlabs/skeleton/pull/3119)) + +## 0.0.1-next.6 + +### Patch Changes + +- Bugfix (migrate/skeleton-3): Renaming components no longer includes a bug that could cause invalid components to be produced in bigger components ([#3110](https://github.com/skeletonlabs/skeleton/pull/3110)) + +- Bugfix (migrate/skeleton-3): Empty strings no longer crash the `transformSvelte` function ([#3110](https://github.com/skeletonlabs/skeleton/pull/3110)) + +- Bugfix: Fixed longstanding bug of svelte files not being transformed properly. ([#3110](https://github.com/skeletonlabs/skeleton/pull/3110)) + +- Feature (migrate/skeleton-3): `TabGroup` is now renamed to `Tabs` ([#3110](https://github.com/skeletonlabs/skeleton/pull/3110)) + +- Feature (migrate/skeleton-3): All file transformations are batched to write to disk at the end of the migration, this will prevent any files being written to disk if any of the file transformations fail. ([#3110](https://github.com/skeletonlabs/skeleton/pull/3110)) + +## 0.0.1-next.5 + +### Patch Changes + +- Feature: The `class:` directive will also be transformed when they're not also an identifier. ([#3107](https://github.com/skeletonlabs/skeleton/pull/3107)) + +- Bugfix: transformations on the package.json now preserve the original indentation. ([#3107](https://github.com/skeletonlabs/skeleton/pull/3107)) + +- Feature: `app.html` is now transformed. ([#3107](https://github.com/skeletonlabs/skeleton/pull/3107)) + +- Feature: Better error handling is now in place. ([#3107](https://github.com/skeletonlabs/skeleton/pull/3107)) + +- Feature: `<packagemanager> install` is now ran at the end of the migration. ([#3107](https://github.com/skeletonlabs/skeleton/pull/3107)) + +- Feature: Rename all components imports and usages. ([#3107](https://github.com/skeletonlabs/skeleton/pull/3107)) + +- Feature: Removed components have their imports removed. ([#3107](https://github.com/skeletonlabs/skeleton/pull/3107)) + +## 0.0.1-next.4 + +### Patch Changes + +- Feature: Svelte template code is now included when migrating svelte code. ([#3105](https://github.com/skeletonlabs/skeleton/pull/3105)) + +- Bugfix: Unused identifiers like imports are removed after tranformation. ([#3105](https://github.com/skeletonlabs/skeleton/pull/3105)) + +## 0.0.1-next.3 + +### Patch Changes + +- Bugfix: Add `bin` back to package.json ([#3103](https://github.com/skeletonlabs/skeleton/pull/3103)) + +## 0.0.1-next.2 + +### Patch Changes + +- Feature: Svelte `<script>` tags are transformed. ([#3091](https://github.com/skeletonlabs/skeleton/pull/3091)) + +- Feature: tailwind.config transformation also include skeleton configuration. ([#3091](https://github.com/skeletonlabs/skeleton/pull/3091)) + +- Feature: TS/JS modules are transformed. ([#3091](https://github.com/skeletonlabs/skeleton/pull/3091)) + +- Feature: Source file directories are now prompted instead of being assumed. ([#3091](https://github.com/skeletonlabs/skeleton/pull/3091)) + +## 0.0.1-next.1 + +### Patch Changes + +- Bugfix: `cwd` was wrongly interpeted. ([#3088](https://github.com/skeletonlabs/skeleton/pull/3088)) + +## 0.0.1-next.0 + +### Patch Changes + +- Initial release. ([#2972](https://github.com/skeletonlabs/skeleton/pull/2972)) diff --git a/packages/cli/README.md b/packages/cli/README.md new file mode 100644 index 0000000000..31688f47e3 --- /dev/null +++ b/packages/cli/README.md @@ -0,0 +1,11 @@ +# Skeleton CLI + +## Installation + +```bash +pnpm add skeleton +``` + +## Documentation + +Explore the full documentation at [skeleton.dev](https://skeleton.dev/). diff --git a/packages/cli/package.json b/packages/cli/package.json new file mode 100644 index 0000000000..84d7832230 --- /dev/null +++ b/packages/cli/package.json @@ -0,0 +1,57 @@ +{ + "name": "skeleton", + "description": "The CLI for Skeleton related tooling.", + "version": "1.0.1-next.2", + "repository": { + "type": "git", + "url": "git+https://github.com/skeletonlabs/skeleton.git", + "directory": "packages/cli" + }, + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js" + } + }, + "bin": "./dist/index.js", + "files": [ + "dist" + ], + "sideEffects": false, + "scripts": { + "dev": "tsdown --watch", + "build": "tsdown", + "test": "vitest run", + "check": "tsc", + "sync": "pnpm build" + }, + "devDependencies": { + "@types/estree": "catalog:", + "@types/node": "catalog:", + "@types/semver": "catalog:", + "tsdown": "catalog:", + "type-fest": "catalog:", + "typescript": "catalog:", + "vite": "catalog:", + "vitest": "catalog:" + }, + "dependencies": { + "@clack/prompts": "catalog:", + "colorette": "catalog:", + "commander": "catalog:", + "detect-indent": "catalog:", + "latest-version": "catalog:", + "magic-string": "catalog:", + "nanoid": "catalog:", + "node-html-parser": "catalog:", + "package-manager-detector": "catalog:", + "postcss": "catalog:", + "semver": "catalog:", + "svelte": "catalog:", + "tinyglobby": "catalog:", + "ts-morph": "catalog:", + "zimmerframe": "catalog:" + }, + "license": "MIT", + "type": "module" +} diff --git a/packages/cli/src/commands/migrate/index.ts b/packages/cli/src/commands/migrate/index.ts new file mode 100644 index 0000000000..8b6e6c00cb --- /dev/null +++ b/packages/cli/src/commands/migrate/index.ts @@ -0,0 +1,18 @@ +import skeleton3 from './migrations/skeleton-3'; +import { Argument, Command, Option } from 'commander'; + +interface MigrateOptions { + cwd?: string; +} +const MIGRATIONS = { + 'skeleton-3': skeleton3, +} as const; + +const migrate = new Command('migrate') + .description('Run a migration') + .addArgument(new Argument('<migration>', 'The migration to run').choices(Object.keys(MIGRATIONS))) + .addOption(new Option('--cwd <cwd>', 'The directory to run the migration in')) + .action((migration: keyof typeof MIGRATIONS, options: MigrateOptions) => MIGRATIONS[migration](options)); + +export type { MigrateOptions }; +export { migrate }; diff --git a/packages/cli/src/commands/migrate/migrations/skeleton-3/index.ts b/packages/cli/src/commands/migrate/migrations/skeleton-3/index.ts new file mode 100644 index 0000000000..8791906a6b --- /dev/null +++ b/packages/cli/src/commands/migrate/migrations/skeleton-3/index.ts @@ -0,0 +1,188 @@ +import type { MigrateOptions } from '../..'; +import { cli } from '../../../..'; +import { installDependencies } from '../../../../utility/install-dependencies'; +import { transformAppCss } from './transformers/transform-app.css'; +import { transformAppHtml } from './transformers/transform-app.html'; +import { transformModule } from './transformers/transform-module'; +import { transformPackageJson } from './transformers/transform-package.json'; +import { transformStyleSheet } from './transformers/transform-stylesheet'; +import { transformSvelte } from './transformers/transform-svelte'; +import { FALLBACK_THEME } from './utility/constants'; +import { THEME_MAPPINGS } from './utility/theme-mappings'; +import type { Theme } from './utility/types'; +import { isCancel, log, multiselect, spinner } from '@clack/prompts'; +import getLatestVersion from 'latest-version'; +import { readFile, writeFile } from 'node:fs/promises'; +import { extname } from 'node:path'; +import { glob } from 'tinyglobby'; + +interface FileMigration { + path: string; + content: string; +} + +export default async function (options: MigrateOptions) { + const cwd = options.cwd ?? process.cwd(); + const migrations: FileMigration[] = []; + + // Find all required files + const packageJson = { + name: 'package.json', + paths: await glob('package.json', { cwd }), + }; + const appHtml = { + name: 'src/app.html', + paths: await glob('src/app.html', { cwd }), + }; + const appCss = { + name: 'src/app.css', + paths: await glob('src/app.css', { cwd }), + }; + + // Validate file existence + for (const file of [packageJson, appHtml, appCss]) { + if (file.paths.length === 0) { + cli.error(`"${file.name}" not found in directory "${cwd}".`); + } + if (file.paths.length > 1) { + cli.error(`Multiple "${file.name}" entries found in directory: "${cwd}", please ensure there is only one`); + } + } + + // Get source folders + const availableSourceFolders = await glob('*', { + cwd: cwd, + onlyDirectories: true, + ignore: ['node_modules'], + }); + const sourceFolders = await multiselect({ + message: 'What folders make use of Skeleton? (classes, imports, etc.)', + options: availableSourceFolders.map((folder) => ({ label: folder, value: folder })), + initialValues: availableSourceFolders, + }); + + if (isCancel(sourceFolders)) { + cli.error('Migration canceled, nothing written to disk'); + return; + } + + // Migrate package.json + const packageSpinner = spinner(); + packageSpinner.start(`Migrating ${packageJson.name}...`); + try { + const packageJsonCode = await readFile(packageJson.paths.at(0)!, 'utf8'); + const skeletonVersion = await getLatestVersion('@skeletonlabs/skeleton', { version: '>=3.0.0-0 <4.0.0' }); + const skeletonSvelteVersion = await getLatestVersion('@skeletonlabs/skeleton-svelte', { version: '>=1.0.0-0 <2.0.0' }); + const transformedPackageJson = transformPackageJson(packageJsonCode, skeletonVersion, skeletonSvelteVersion); + migrations.push({ path: packageJson.paths.at(0)!, content: transformedPackageJson.code }); + packageSpinner.stop(`Successfully migrated ${packageJson.name}!`); + } catch (error) { + packageSpinner.stop(`Failed to migrate ${packageJson.name}: ${error instanceof Error ? error.message : 'Unknown error'}`, 1); + cli.error('Migration canceled, nothing written to disk'); + } + + // Migrate app.html + let theme: Theme | undefined; + const appHtmlSpinner = spinner(); + appHtmlSpinner.start(`Migrating ${appHtml.name}...`); + try { + const appHtmlCode = await readFile(appHtml.paths.at(0)!, 'utf8'); + const transformedAppHtml = transformAppHtml(appHtmlCode); + if (transformedAppHtml.meta.theme && Object.hasOwn(THEME_MAPPINGS, transformedAppHtml.meta.theme.value)) { + theme = THEME_MAPPINGS[transformedAppHtml.meta.theme.value]; + } else if (transformedAppHtml.meta.theme) { + theme = transformedAppHtml.meta.theme; + } else { + theme = FALLBACK_THEME; + } + migrations.push({ path: appHtml.paths.at(0)!, content: transformedAppHtml.code }); + appHtmlSpinner.stop(`Successfully migrated ${appHtml.name}!`); + } catch (error) { + appHtmlSpinner.stop(`Failed to migrate ${appHtml.name}: ${error instanceof Error ? error.message : 'Unknown error'}`, 1); + cli.error('Migration canceled, nothing written to disk'); + } + + // Migrate app.css + const appCssSpinner = spinner(); + appCssSpinner.start(`Migrating ${appCss.name}...`); + try { + const appCssCode = await readFile(appCss.paths.at(0)!, 'utf8'); + const transformedAppCss = transformAppCss(appCssCode, theme ?? FALLBACK_THEME); + migrations.push({ path: appCss.paths.at(0)!, content: transformedAppCss.code }); + appCssSpinner.stop(`Successfully migrated ${appCss.name}!`); + } catch (error) { + appCssSpinner.stop(`Failed to migrate ${appCss.name}: ${error instanceof Error ? error.message : 'Unknown error'}`, 1); + cli.error('Migration canceled, nothing written to disk'); + } + + // Migrate source files + if (sourceFolders.length > 0) { + const sourceFiles = await glob( + sourceFolders.map((folder) => `${folder}**/*.{svelte,js,mjs,ts,mts,css,pcss,postcss}`), + { + cwd: cwd, + ignore: ['node_modules', 'src/app.css'], + }, + ); + const sourceFilesSpinner = spinner(); + sourceFilesSpinner.start(`Migrating source files...`); + for (const sourceFile of sourceFiles) { + sourceFilesSpinner.message(`Migrating ${sourceFile}...`); + const extension = extname(sourceFile); + try { + const code = await readFile(sourceFile, 'utf8'); + switch (extension) { + case '.svelte': { + const transformedSvelte = transformSvelte(code); + migrations.push({ path: sourceFile, content: transformedSvelte.code }); + break; + } + case '.js': + case '.mjs': + case '.ts': + case '.mts': { + const transformedModule = transformModule(code); + migrations.push({ path: sourceFile, content: transformedModule.code }); + break; + } + case '.css': + case '.pcss': + case '.postcss': { + const transformedStyleSheet = transformStyleSheet(code); + migrations.push({ path: sourceFile, content: transformedStyleSheet.code }); + break; + } + } + sourceFilesSpinner.message(`Successfully migrated ${sourceFile}!`); + } catch (error) { + sourceFilesSpinner.stop(`Failed to migrate ${sourceFile}: ${error instanceof Error ? error.message : 'Unknown error'}`, 1); + cli.error('Migration canceled, nothing written to disk'); + } + } + sourceFilesSpinner.stop('Successfully migrated all source files!'); + } + + // Write all migrations to disk + const writeSpinner = spinner(); + writeSpinner.start('Applying all migrations...'); + try { + await Promise.all(migrations.map(({ path, content }) => writeFile(path, content))); + writeSpinner.stop('Successfully applied all migrations!'); + } catch (error) { + writeSpinner.stop(`Failed to apply migrations: ${error instanceof Error ? error.message.replace('\n', ' ') : 'Unknown error'}`, 1); + cli.error('Migration canceled'); + } + + // Install dependencies + const installDependenciesSpinner = spinner(); + installDependenciesSpinner.start('Updating dependencies...'); + try { + await installDependencies(cwd); + installDependenciesSpinner.stop('Successfully updated dependencies!'); + } catch (error) { + installDependenciesSpinner.stop(`Failed to update dependencies: ${error instanceof Error ? error.message : 'Unknown error'}`, 1); + cli.error('Migration canceled'); + return; + } + log.info('Migration complete! Visit https://skeleton.dev for more information.'); +} diff --git a/packages/cli/src/commands/migrate/migrations/skeleton-3/transformers/transform-app.css.ts b/packages/cli/src/commands/migrate/migrations/skeleton-3/transformers/transform-app.css.ts new file mode 100644 index 0000000000..5d7a3bfc5b --- /dev/null +++ b/packages/cli/src/commands/migrate/migrations/skeleton-3/transformers/transform-app.css.ts @@ -0,0 +1,58 @@ +import type { Theme } from '../utility/types'; +import { transformStyleSheet } from './transform-stylesheet'; +import { atRule, comment, parse } from 'postcss'; +import type { AtRule, Node, Root } from 'postcss'; + +function getTailwindImport(root: Root) { + let tailwindImport: AtRule | undefined; + root.walkAtRules('import', (atRule) => { + if (atRule.params.includes('tailwindcss')) { + tailwindImport = atRule; + } + }); + return tailwindImport; +} + +function transformAppCss(code: string, theme: Theme) { + code = transformStyleSheet(code).code; + const root = parse(code); + const nodes: Node[] = []; + nodes.push( + atRule({ + name: 'import', + params: '"@skeletonlabs/skeleton"', + }), + ); + nodes.push( + atRule({ + name: 'import', + params: '"@skeletonlabs/skeleton/optional/presets"', + }), + ); + switch (theme.type) { + case 'preset': { + nodes.push( + atRule({ + name: 'import', + params: `"@skeletonlabs/skeleton/themes/${theme.value}"`, + }), + ); + break; + } + case 'custom': { + nodes.push(comment({ text: `Add your theme import for your theme: "${theme.value}" here` })); + break; + } + } + const tailwindImport = getTailwindImport(root); + if (tailwindImport) { + root.insertAfter(tailwindImport, nodes); + } else { + root.prepend(nodes); + } + return { + code: root.toString(), + }; +} + +export { transformAppCss }; diff --git a/packages/cli/src/commands/migrate/migrations/skeleton-3/transformers/transform-app.html.ts b/packages/cli/src/commands/migrate/migrations/skeleton-3/transformers/transform-app.html.ts new file mode 100644 index 0000000000..781516a3bb --- /dev/null +++ b/packages/cli/src/commands/migrate/migrations/skeleton-3/transformers/transform-app.html.ts @@ -0,0 +1,45 @@ +import { THEME_MAPPINGS } from '../utility/theme-mappings'; +import { parse } from 'node-html-parser'; + +function transformAppHtml(code: string) { + const parsed = parse(code); + const html = parsed.querySelector('html'); + const body = parsed.querySelector('body'); + if (!(html && body)) { + return { + code: code, + meta: { + theme: undefined, + }, + }; + } + const theme = body.getAttribute('data-theme'); + if (!theme) { + return { + code: code, + meta: { + theme: undefined, + }, + }; + } + let type: 'preset' | 'custom'; + body.removeAttribute('data-theme'); + if (Object.hasOwn(THEME_MAPPINGS, theme)) { + html.setAttribute('data-theme', THEME_MAPPINGS[theme]!.value); + type = 'preset'; + } else { + html.setAttribute('data-theme', theme); + type = 'custom'; + } + return { + code: parsed.toString(), + meta: { + theme: { + value: theme, + type: type, + }, + }, + }; +} + +export { transformAppHtml }; diff --git a/packages/cli/src/commands/migrate/migrations/skeleton-3/transformers/transform-classes.ts b/packages/cli/src/commands/migrate/migrations/skeleton-3/transformers/transform-classes.ts new file mode 100644 index 0000000000..2f50f73876 --- /dev/null +++ b/packages/cli/src/commands/migrate/migrations/skeleton-3/transformers/transform-classes.ts @@ -0,0 +1,224 @@ +const COLOR_PAIRING_REGEXES = [ + { + find: /(\w+)-50-900-token\b/g, + replace: '$1-50-950', + }, + { + find: /(\w+)-100-800-token\b/g, + replace: '$1-100-900', + }, + { + find: /(\w+)-200-700-token\b/g, + replace: '$1-200-800', + }, + { + find: /(\w+)-300-600-token\b/g, + replace: '$1-300-700', + }, + { + find: /(\w+)-400-500-token\b/g, + replace: '$1-500', + }, + { + find: /(\w+)-900-50-token\b/g, + replace: '$1-950-50', + }, + { + find: /(\w+)-800-100-token\b/g, + replace: '$1-900-100', + }, + { + find: /(\w+)-700-200-token\b/g, + replace: '$1-800-200', + }, + { + find: /(\w+)-600-300-token\b/g, + replace: '$1-700-300', + }, + { + find: /(\w+)-500-400-token\b/g, + replace: '$1-600-400', + }, +]; + +const BACKGROUND_REGEXES = [ + { + find: /bg-(\w+)-backdrop-token\b/g, + replace: 'bg-$1-50/50 dark:bg-$1-950/50', + }, + { + find: /bg-(\w+)-hover-token\b/g, + replace: 'preset-tonal-$1', + }, + { + find: /bg-(\w+)-active-token\b/g, + replace: 'preset-filled-$1-500', + }, +]; + +const BORDER_RADIUS_REGEXES = [ + { + find: /rounded-token\b/g, + replace: 'rounded-base', + }, + { + find: /rounded-(tl|tr|bl|br)-token\b/g, + replace: 'rounded-$1-base', + }, + { + find: /rounded-container-token\b/g, + replace: 'rounded-container', + }, + { + find: /rounded-(tl|tr|bl|br)-container-token\b/g, + replace: 'rounded-$1-container', + }, +]; + +const BORDER_RING_REGEXES = [ + { + find: /border-token\b/g, + replace: 'border', + }, + { + find: /border-(\w+)-(\d+)-(\d+)-token\b/g, + replace: 'border-$1-$2-$3', + }, + { + find: /ring-token\b/g, + replace: 'ring', + }, + { + find: /ring-(\w+)-(\d+)-(\d+)-token\b/g, + replace: 'ring-$1-$2-$3', + }, +]; + +const TEXT_REGEXES = [ + { + find: /font-headings-token\b/g, + replace: 'heading-font-family', + }, + { + find: /font-token\b/g, + replace: 'base-font-family', + }, + { + find: /text-token\b/g, + replace: 'base-font-color', + }, + { + find: /text-on-(\w+)-token\b/g, + replace: 'text-$1-contrast-500', + }, + { + find: /text-(\w+)-([^-]+)-([^-]+)-token\b/g, + replace: 'text-$1-$2-$3', + }, +]; + +const DECORATION_ACCENT_REGEXES = [ + { + find: /decoration-(\w+)-([^-]+)-([^-]+)-token\b/g, + replace: 'decoration-$1-$2-$3', + }, + { + find: /accent-(\w+)-token\b/g, + replace: 'accent-$1-500', + }, +]; + +const PRESET_REGEXES = [ + { + find: /variant-filled-(\w+)\b/g, + replace: 'preset-filled-$1-500', + }, + { + find: /variant-filled\b/g, + replace: 'preset-filled', + }, + { + find: /variant-ghost-(\w+)\b/g, + replace: 'preset-tonal-$1 border border-$1-500', + }, + { + find: /variant-ghost\b/g, + replace: 'preset-tonal border border-surface-500', + }, + { + find: /variant-soft-(\w+)\b/g, + replace: 'preset-tonal-$1', + }, + { + find: /variant-soft\b/g, + replace: 'preset-tonal', + }, + { + find: /variant-ringed-(\w+)\b/g, + replace: 'preset-outlined-$1-500', + }, + { + find: /variant-ringed\b/g, + replace: 'preset-outlined', + }, + { + find: /variant-glass-(\w+)\b/g, + replace: 'preset-tonal-$1', + }, + { + find: /variant-glass\b/g, + replace: 'preset-tonal', + }, + { + find: /variant-gradient-(\w+)-(\w+)\b/g, + replace: 'from-$1-500 to-$2-500', + }, +]; + +const TAILWIND_COMPONENT_REGEXES = [ + /** + * Disabled until further discussion + * @see https://github.com/skeletonlabs/skeleton/pull/2972#discussion_r1857260763 + */ + // { + // find: /\bcard\b(?!.*bg-)/g, + // replace: 'card bg-surface-100-900-token' + // }, + { + find: /btn-xl\b/g, + replace: 'btn-lg', + }, + { + find: /btn-icon-xl\b/g, + replace: 'btn-icon-lg', + }, + { + find: /btn-group\b/g, + replace: '', + }, + { + find: /table-hover\b/g, + replace: '', + }, +]; + +const CLASS_REGEXES = [ + ...COLOR_PAIRING_REGEXES, + ...BACKGROUND_REGEXES, + ...BORDER_RADIUS_REGEXES, + ...BORDER_RING_REGEXES, + ...TEXT_REGEXES, + ...DECORATION_ACCENT_REGEXES, + ...PRESET_REGEXES, + ...TAILWIND_COMPONENT_REGEXES, +]; + +function transformClasses(code: string) { + return { + code: CLASS_REGEXES.reduce((result, migration) => { + return result.replace(migration.find, migration.replace); + }, code), + }; +} + +export { transformClasses }; diff --git a/packages/cli/src/commands/migrate/migrations/skeleton-3/transformers/transform-module.ts b/packages/cli/src/commands/migrate/migrations/skeleton-3/transformers/transform-module.ts new file mode 100644 index 0000000000..2418478554 --- /dev/null +++ b/packages/cli/src/commands/migrate/migrations/skeleton-3/transformers/transform-module.ts @@ -0,0 +1,76 @@ +import { addNamedImport } from '../../../../../utility/ts-morph/add-named-import'; +import { parseSourceFile } from '../../../../../utility/ts-morph/parse-source-file'; +import { EXPORT_MAPPINGS } from '../utility/export-mappings'; +import { transformClasses } from './transform-classes'; +import { Node } from 'ts-morph'; + +function transformModule(code: string) { + const file = parseSourceFile(code); + const skeletonImports: string[] = []; + file.forEachDescendant((node) => { + if (Node.isImportDeclaration(node)) { + const moduleSpecifier = node.getModuleSpecifier(); + if (moduleSpecifier.getLiteralText() === '@skeletonlabs/skeleton') { + node.setModuleSpecifier('@skeletonlabs/skeleton-svelte'); + } + } + if ( + Node.isImportSpecifier(node) && + node.getImportDeclaration().getModuleSpecifier().getLiteralText() === '@skeletonlabs/skeleton-svelte' + ) { + const name = node.getName(); + if (Object.hasOwn(EXPORT_MAPPINGS, name)) { + const exportMapping = EXPORT_MAPPINGS[name]; + switch (exportMapping?.namedImport.type) { + case 'renamed': { + if (exportMapping.namedImport.value.match(/^[A-Za-z]+\.[A-Za-z]+$/)) { + break; + } + node.remove(); + addNamedImport(file, '@skeletonlabs/skeleton-svelte', exportMapping.namedImport.value); + break; + } + case 'removed': { + const parent = node.getImportDeclaration(); + if (parent.getNamedImports().length === 1 && !parent.getDefaultImport() && !parent.getNamespaceImport()) { + parent.remove(); + } else { + node.remove(); + } + break; + } + } + skeletonImports.push(name); + } + } + }); + file.forEachDescendant((node) => { + if (!node.wasForgotten() && Node.isIdentifier(node) && !Node.isImportSpecifier(node.getParent())) { + const name = node.getText(); + if (Object.hasOwn(EXPORT_MAPPINGS, name) && skeletonImports.includes(name)) { + const exportMapping = EXPORT_MAPPINGS[name]; + if (exportMapping?.identifier.type === 'renamed') { + const updated = exportMapping.identifier.value; + if (updated !== node.getText()) { + node.replaceWithText(updated); + } + } + } + } + if (!node.wasForgotten() && Node.isStringLiteral(node) && !Node.isImportDeclaration(node.getParent())) { + const transformed = transformClasses(node.getText()).code; + if (transformed !== node.getText()) { + node.replaceWithText(transformed); + } + } + }); + + return { + code: file.getFullText(), + meta: { + skeletonImports: skeletonImports, + }, + }; +} + +export { transformModule }; diff --git a/packages/cli/src/commands/migrate/migrations/skeleton-3/transformers/transform-package.json.ts b/packages/cli/src/commands/migrate/migrations/skeleton-3/transformers/transform-package.json.ts new file mode 100644 index 0000000000..b07ce4389b --- /dev/null +++ b/packages/cli/src/commands/migrate/migrations/skeleton-3/transformers/transform-package.json.ts @@ -0,0 +1,33 @@ +import { sortPropertiesAlphabetically } from '../../../../../utility/sort-properties-alphabetically.js'; +import detectIndent from 'detect-indent'; +import { coerce, lt } from 'semver'; +import type { PackageJson } from 'type-fest'; + +function transformPackageJson(code: string, skeletonVersion: string, skeletonSvelteVersion: string) { + let isUsingComponents = false; + const pkg = JSON.parse(code) as PackageJson; + for (const field of ['dependencies', 'devDependencies'] as const) { + if (!pkg[field]) { + continue; + } + const coerced = coerce(pkg[field]['@skeletonlabs/skeleton']); + if (coerced && lt(coerced.version, '3.0.0')) { + isUsingComponents = true; + delete pkg[field]['@skeletonlabs/skeleton']; + pkg[field]['@skeletonlabs/skeleton-svelte'] = `^${skeletonSvelteVersion}`; + } + if (pkg[field]['@skeletonlabs/tw-plugin']) { + delete pkg[field]['@skeletonlabs/tw-plugin']; + pkg[field]['@skeletonlabs/skeleton'] = `^${skeletonVersion}`; + } + pkg[field] = sortPropertiesAlphabetically(pkg[field] as Record<string, string>); + } + return { + code: JSON.stringify(pkg, undefined, detectIndent(code).indent || '\t'), + meta: { + isUsingComponents: isUsingComponents, + }, + }; +} + +export { transformPackageJson }; diff --git a/packages/cli/src/commands/migrate/migrations/skeleton-3/transformers/transform-stylesheet.ts b/packages/cli/src/commands/migrate/migrations/skeleton-3/transformers/transform-stylesheet.ts new file mode 100644 index 0000000000..2a4b3b88f7 --- /dev/null +++ b/packages/cli/src/commands/migrate/migrations/skeleton-3/transformers/transform-stylesheet.ts @@ -0,0 +1,15 @@ +import { transformClasses } from './transform-classes'; +import { parse } from 'postcss'; + +function transformStyleSheet(code: string) { + const parsed = parse(code); + parsed.walkAtRules('apply', (atRule) => { + atRule.params = transformClasses(atRule.params).code; + }); + + return { + code: parsed.toString(), + }; +} + +export { transformStyleSheet }; diff --git a/packages/cli/src/commands/migrate/migrations/skeleton-3/transformers/transform-svelte.ts b/packages/cli/src/commands/migrate/migrations/skeleton-3/transformers/transform-svelte.ts new file mode 100644 index 0000000000..fdd0b22c8f --- /dev/null +++ b/packages/cli/src/commands/migrate/migrations/skeleton-3/transformers/transform-svelte.ts @@ -0,0 +1,118 @@ +import { EXPORT_MAPPINGS } from '../utility/export-mappings'; +import { transformClasses } from './transform-classes'; +import { transformModule } from './transform-module'; +import { transformStyleSheet } from './transform-stylesheet'; +import type { Node } from 'estree'; +import MagicString from 'magic-string'; +import { parse } from 'svelte/compiler'; +import type { AST } from 'svelte/compiler'; +import { walk } from 'zimmerframe'; + +function renameComponent(s: MagicString, node: AST.Component, name: string) { + const adjustedStart = node.start + 1; + s.update(adjustedStart, adjustedStart + node.name.length, name); + const componentString = s.original.slice(node.start, node.end); + const indexOfNonSelfClosingTag = componentString.lastIndexOf('</'); + if (indexOfNonSelfClosingTag === -1 || node.start + indexOfNonSelfClosingTag > node.end) { + return; + } + s.update(node.start + indexOfNonSelfClosingTag + 2, node.start + indexOfNonSelfClosingTag + 2 + node.name.length, name); +} + +function transformScript(s: MagicString, script: AST.Script | null) { + if ( + !script || + !( + 'start' in script.content && + typeof script.content.start === 'number' && + 'end' in script.content && + typeof script.content.end === 'number' + ) + ) { + return { + meta: { + skeletonImports: [], + }, + }; + } + const content = s.original.slice(script.content.start, script.content.end); + const transformed = transformModule(content); + s.overwrite(script.content.start, script.content.end, transformed.code); + return { + meta: transformed.meta, + }; +} + +function transformCss(s: MagicString, css: AST.CSS.StyleSheet | null) { + if (!css) { + return; + } + const transformed = transformStyleSheet(s.original.slice(css.content.start, css.content.end)); + s.overwrite(css.content.start, css.content.end, transformed.code); +} + +function hasRange(node: Node | AST.SvelteNode): node is (Node | AST.SvelteNode) & { start: number; end: number } { + return 'start' in node && 'end' in node && typeof node.start === 'number' && typeof node.end === 'number'; +} + +function transformFragment(s: MagicString, fragment: AST.Fragment, skeletonImports: string[]) { + walk( + fragment as AST.SvelteNode, + {}, + { + Literal(node, ctx) { + const parent = ctx.path.at(-1); + if (typeof node.raw === 'string' && node.raw !== '' && !(parent && parent.type === 'ImportDeclaration') && hasRange(node)) { + s.update(node.start, node.end, transformClasses(node.raw).code); + } + ctx.next(); + }, + Text(node, ctx) { + if (node.data !== '' && hasRange(node)) { + s.update(node.start, node.end, transformClasses(node.data).code); + } + ctx.next(); + }, + ClassDirective(node, ctx) { + if ( + !(node.expression.type === 'Identifier' && !('loc' in node.expression) && node.name === node.expression.name) && + hasRange(node) + ) { + const adjustedStart = node.start + 'class:'.length; + s.update(adjustedStart, adjustedStart + node.name.length, transformClasses(node.name).code); + } + ctx.next(); + }, + Component(node, ctx) { + if (Object.hasOwn(EXPORT_MAPPINGS, node.name) && skeletonImports.includes(node.name)) { + const exportMapping = EXPORT_MAPPINGS[node.name]; + if (exportMapping?.identifier.type === 'renamed' && hasRange(node)) { + renameComponent(s, node, exportMapping.identifier.value); + } + } + ctx.next(); + }, + }, + ); + return { + code: s.toString(), + }; +} + +function transformSvelte(code: string) { + const s = new MagicString(code); + const root = parse(code, { + modern: true, + }); + const skeletonImports = [ + ...transformScript(s, root.module).meta.skeletonImports, + ...transformScript(s, root.instance).meta.skeletonImports, + ]; + transformFragment(s, root.fragment, skeletonImports); + transformCss(s, root.css); + return { + code: s.toString(), + }; +} + +export { transformSvelte }; diff --git a/packages/cli/src/commands/migrate/migrations/skeleton-3/utility/constants.ts b/packages/cli/src/commands/migrate/migrations/skeleton-3/utility/constants.ts new file mode 100644 index 0000000000..7f8b85c484 --- /dev/null +++ b/packages/cli/src/commands/migrate/migrations/skeleton-3/utility/constants.ts @@ -0,0 +1,8 @@ +import type { Theme } from './types'; + +const FALLBACK_THEME: Theme = { + type: 'preset', + value: 'cerberus', +}; + +export { FALLBACK_THEME }; diff --git a/packages/cli/src/commands/migrate/migrations/skeleton-3/utility/export-mappings.ts b/packages/cli/src/commands/migrate/migrations/skeleton-3/utility/export-mappings.ts new file mode 100644 index 0000000000..829b5e075f --- /dev/null +++ b/packages/cli/src/commands/migrate/migrations/skeleton-3/utility/export-mappings.ts @@ -0,0 +1,409 @@ +interface Renamed { + type: 'renamed'; + value: string; +} + +interface Removed { + type: 'removed'; +} + +const EXPORT_MAPPINGS: Record< + string, + { + namedImport: Renamed | Removed; + identifier: Renamed | Removed; + } +> = { + AccordionItem: { + namedImport: { + type: 'renamed', + value: 'Accordion', + }, + identifier: { + type: 'renamed', + value: 'Accordion.Item', + }, + }, + AppShell: { + namedImport: { + type: 'removed', + }, + identifier: { + type: 'removed', + }, + }, + Apollo: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + AppRailAnchor: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + Autocomplete: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + BlueNight: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + CodeBlock: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + ConicGradient: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + Drawer: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + Emerald: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + GreenFall: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + LightSwitch: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + ListBox: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + ListBoxItem: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + Modal: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + Noir: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + NoirLight: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + RecursiveTreeView: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + RecursiveTreeViewItem: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + Rustic: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + Step: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + Stepper: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + Summer84: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + Table: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + TableOfContents: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + TreeView: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + TreeViewItem: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + XPro: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + autoModeWatcher: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + clipboard: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + filter: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + focusTrap: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + getDrawerStore: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + getModalStore: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + getModeAutoPrefers: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + getModeOsPrefers: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + getModeUserPrefers: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + getToastStore: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + initializeStores: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + localStorageStore: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + modeCurrent: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + modeOsPrefers: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + modeUserPrefers: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + popup: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + prefersReducedMotionStore: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + setInitialClassState: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + setModeCurrent: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + setModeUserPrefers: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + storeHighlightJs: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + storePopup: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + tableMapperValues: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + tableSourceMapper: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + tableSourceValues: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + tocCrawler: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + tocStore: { + namedImport: { type: 'removed' }, + identifier: { type: 'removed' }, + }, + AppRail: { + namedImport: { + type: 'renamed', + value: 'Navigation', + }, + identifier: { + type: 'renamed', + value: 'Navigation', + }, + }, + AppRailTile: { + namedImport: { + type: 'renamed', + value: 'Navigation', + }, + identifier: { + type: 'renamed', + value: 'Navigation.Tile', + }, + }, + FileButton: { + namedImport: { + type: 'renamed', + value: 'FileUpload', + }, + identifier: { + type: 'renamed', + value: 'FileUpload', + }, + }, + FileDropzone: { + namedImport: { + type: 'renamed', + value: 'FileUpload', + }, + identifier: { + type: 'renamed', + value: 'FileUpload', + }, + }, + InputChip: { + namedImport: { + type: 'renamed', + value: 'TagsInput', + }, + identifier: { + type: 'renamed', + value: 'TagsInput', + }, + }, + Paginator: { + namedImport: { + type: 'renamed', + value: 'Pagination', + }, + identifier: { + type: 'renamed', + value: 'Pagination', + }, + }, + ProgressBar: { + namedImport: { + type: 'renamed', + value: 'Progress', + }, + identifier: { + type: 'renamed', + value: 'Progress', + }, + }, + ProgressRadial: { + namedImport: { + type: 'renamed', + value: 'ProgressRing', + }, + identifier: { + type: 'renamed', + value: 'ProgressRing', + }, + }, + RadioGroup: { + namedImport: { + type: 'renamed', + value: 'Segment', + }, + identifier: { + type: 'renamed', + value: 'Segment', + }, + }, + RadioItem: { + namedImport: { + type: 'renamed', + value: 'Segment', + }, + identifier: { + type: 'renamed', + value: 'Segment.Item', + }, + }, + RangeSlider: { + namedImport: { + type: 'renamed', + value: 'Slider', + }, + identifier: { + type: 'renamed', + value: 'Slider', + }, + }, + Ratings: { + namedImport: { + type: 'renamed', + value: 'Rating', + }, + identifier: { + type: 'renamed', + value: 'Rating', + }, + }, + SlideToggle: { + namedImport: { + type: 'renamed', + value: 'Switch', + }, + identifier: { + type: 'renamed', + value: 'Switch', + }, + }, + TabAnchor: { + namedImport: { + type: 'renamed', + value: 'Tabs', + }, + identifier: { + type: 'renamed', + value: 'Tabs.Control', + }, + }, + TabGroup: { + namedImport: { + type: 'renamed', + value: 'Tabs', + }, + identifier: { + type: 'renamed', + value: 'Tabs', + }, + }, + Toast: { + namedImport: { + type: 'renamed', + value: 'ToastProvider', + }, + identifier: { + type: 'renamed', + value: 'ToastProvider', + }, + }, +}; + +export { EXPORT_MAPPINGS }; diff --git a/packages/cli/src/commands/migrate/migrations/skeleton-3/utility/theme-mappings.ts b/packages/cli/src/commands/migrate/migrations/skeleton-3/utility/theme-mappings.ts new file mode 100644 index 0000000000..0fbc5c9c88 --- /dev/null +++ b/packages/cli/src/commands/migrate/migrations/skeleton-3/utility/theme-mappings.ts @@ -0,0 +1,16 @@ +import type { Theme } from './types'; + +const THEME_MAPPINGS: Record<string, Theme> = { + skeleton: { type: 'preset', value: 'legacy' }, + 'gold-nouveau': { type: 'preset', value: 'nouveau' }, + wintry: { type: 'preset', value: 'wintry' }, + modern: { type: 'preset', value: 'modern' }, + rocket: { type: 'preset', value: 'rocket' }, + seafoam: { type: 'preset', value: 'seafoam' }, + vintage: { type: 'preset', value: 'vintage' }, + sahara: { type: 'preset', value: 'sahara' }, + hamlindigo: { type: 'preset', value: 'hamlindigo' }, + crimson: { type: 'preset', value: 'crimson' }, +}; + +export { THEME_MAPPINGS }; diff --git a/packages/cli/src/commands/migrate/migrations/skeleton-3/utility/types.ts b/packages/cli/src/commands/migrate/migrations/skeleton-3/utility/types.ts new file mode 100644 index 0000000000..b2bf8160af --- /dev/null +++ b/packages/cli/src/commands/migrate/migrations/skeleton-3/utility/types.ts @@ -0,0 +1,6 @@ +interface Theme { + type: 'preset' | 'custom'; + value: string; +} + +export type { Theme }; diff --git a/packages/cli/src/index.ts b/packages/cli/src/index.ts new file mode 100644 index 0000000000..321e6a95e8 --- /dev/null +++ b/packages/cli/src/index.ts @@ -0,0 +1,39 @@ +#!/usr/bin/env node +import { migrate } from './commands/migrate'; +import { getOurPackageJson } from './utility/get-our-package-json'; +import { intro, log, outro } from '@clack/prompts'; +import { bgBlueBright, bgGreenBright, black, dim, red } from 'colorette'; +import { Command } from 'commander'; + +const pkg = await getOurPackageJson(); + +const cli = new Command() + .name(pkg.name) + .description(pkg.description) + .version(pkg.version) + .addCommand(migrate) + .copyInheritedSettings(migrate) + .configureOutput({ + writeOut: log.info, + writeErr(str) { + outro(red(str.replace('\n', ' '))); + process.exit(1); + }, + }) + .hook('preAction', (_, ctx) => { + const args = ctx.args.join(' '); + log.message(dim(`Running "${`${ctx.name()}${args ? ` ${args}` : ''}`}"...`)); + }); + +async function main() { + intro(bgBlueBright(black(' Welcome to the Skeleton CLI 💀 '))); + if (process.argv.length === 2) { + cli.error('error: no command provided'); + } + await cli.parseAsync(process.argv); + outro(bgGreenBright(black(' All Done! '))); +} + +await main(); + +export { cli }; diff --git a/packages/cli/src/utility/get-our-package-json.ts b/packages/cli/src/utility/get-our-package-json.ts new file mode 100644 index 0000000000..4e83437891 --- /dev/null +++ b/packages/cli/src/utility/get-our-package-json.ts @@ -0,0 +1,12 @@ +import { readFile } from 'node:fs/promises'; +import { dirname, join } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import type { PackageJson } from 'type-fest'; + +async function getOurPackageJson(): Promise<Required<PackageJson>> { + const packageJsonPath = join(dirname(fileURLToPath(import.meta.url)), '../package.json'); + const content = await readFile(packageJsonPath, 'utf8'); + return JSON.parse(content); +} + +export { getOurPackageJson }; diff --git a/packages/cli/src/utility/install-dependencies.ts b/packages/cli/src/utility/install-dependencies.ts new file mode 100644 index 0000000000..78c6c35f31 --- /dev/null +++ b/packages/cli/src/utility/install-dependencies.ts @@ -0,0 +1,20 @@ +import child_process from 'node:child_process'; +import { promisify } from 'node:util'; +import { detect, resolveCommand } from 'package-manager-detector'; + +const exec = promisify(child_process.exec); + +async function installDependencies(cwd = process.cwd()) { + const pm = await detect({ + cwd: cwd, + }); + const resolvedCommand = resolveCommand(pm?.agent ?? 'npm', 'install', []); + if (!resolvedCommand) { + throw new Error('Could not resolve package manager command.'); + } + return exec(`${resolvedCommand.command} ${resolvedCommand.args.join(' ')}`, { + cwd: cwd, + }); +} + +export { installDependencies }; diff --git a/packages/cli/src/utility/sort-properties-alphabetically.ts b/packages/cli/src/utility/sort-properties-alphabetically.ts new file mode 100644 index 0000000000..b9716463b3 --- /dev/null +++ b/packages/cli/src/utility/sort-properties-alphabetically.ts @@ -0,0 +1,10 @@ +function sortPropertiesAlphabetically(object: Record<string, string>) { + const orderedObject: Record<string, string> = {}; + const sortedEntries = Object.entries(object).sort(([a], [b]) => a.localeCompare(b)); + for (const [key, value] of sortedEntries) { + orderedObject[key] = value; + } + return orderedObject; +} + +export { sortPropertiesAlphabetically }; diff --git a/packages/cli/src/utility/ts-morph/add-named-import.ts b/packages/cli/src/utility/ts-morph/add-named-import.ts new file mode 100644 index 0000000000..9fecc1f34a --- /dev/null +++ b/packages/cli/src/utility/ts-morph/add-named-import.ts @@ -0,0 +1,20 @@ +import type { SourceFile } from 'ts-morph'; + +function addNamedImport(file: SourceFile, specifier: string, name: string) { + const existingImportDeclaration = file.getImportDeclaration((importDeclaration) => { + const moduleSpecifier = importDeclaration.getModuleSpecifier().getLiteralText(); + return moduleSpecifier === specifier; + }); + if (existingImportDeclaration) { + if (!existingImportDeclaration.getNamedImports().some((namedImport) => namedImport.getName() === name)) { + existingImportDeclaration.addNamedImport(name); + } + } else { + file.addImportDeclaration({ + moduleSpecifier: specifier, + namedImports: [name], + }); + } +} + +export { addNamedImport }; diff --git a/packages/cli/src/utility/ts-morph/get-default-export-object.ts b/packages/cli/src/utility/ts-morph/get-default-export-object.ts new file mode 100644 index 0000000000..f627aa0aa0 --- /dev/null +++ b/packages/cli/src/utility/ts-morph/get-default-export-object.ts @@ -0,0 +1,26 @@ +import type { SourceFile } from 'ts-morph'; +import { SyntaxKind } from 'ts-morph'; + +function getDefaultExportObject(sourceFile: SourceFile) { + const exportAssignment = sourceFile.getFirstDescendantByKind(SyntaxKind.ExportAssignment); + if (!exportAssignment) { + return; + } + const exportExpression = exportAssignment.getExpression(); + const objectLiteralExpression = exportAssignment.getFirstDescendantByKind(SyntaxKind.ObjectLiteralExpression); + if (objectLiteralExpression) { + return objectLiteralExpression; + } + if (exportExpression.isKind(SyntaxKind.Identifier)) { + const definition = exportExpression.getDefinitionNodes()[0]; + if (definition?.isKind(SyntaxKind.VariableDeclaration)) { + const objectLiteralExpression = definition.getFirstDescendantByKind(SyntaxKind.ObjectLiteralExpression); + if (objectLiteralExpression) { + return objectLiteralExpression; + } + } + } + return; +} + +export { getDefaultExportObject }; diff --git a/packages/cli/src/utility/ts-morph/parse-source-file.ts b/packages/cli/src/utility/ts-morph/parse-source-file.ts new file mode 100644 index 0000000000..760a5c9264 --- /dev/null +++ b/packages/cli/src/utility/ts-morph/parse-source-file.ts @@ -0,0 +1,15 @@ +import { nanoid } from 'nanoid'; +import { Project } from 'ts-morph'; + +const project = new Project({ + useInMemoryFileSystem: true, + skipAddingFilesFromTsConfig: true, + skipFileDependencyResolution: true, + skipLoadingLibFiles: true, +}); + +function parseSourceFile(code: string) { + return project.createSourceFile(`${nanoid()}.ts`, code); +} + +export { parseSourceFile }; diff --git a/packages/cli/test/migrate/skeleton-3/classes.test.ts b/packages/cli/test/migrate/skeleton-3/classes.test.ts new file mode 100644 index 0000000000..f00544e012 --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/classes.test.ts @@ -0,0 +1,260 @@ +import { transformClasses } from '../../../src/commands/migrate/migrations/skeleton-3/transformers/transform-classes.js'; +import { describe, expect, it } from 'vitest'; + +describe('transformClasses', () => { + const COLORS = ['primary', 'secondary', 'tertiary', 'success', 'warning', 'error', 'surface']; + const COLOR_PROPERTIES = ['bg', 'ring', 'border', 'text']; + const V2_PAIRINGS = ['50-900', '100-800', '200-700', '300-600', '400-500', '500-400', '600-300', '700-200', '800-100', '900-50']; + const V3_PAIRINGS = ['50-950', '100-900', '200-800', '300-700', '500', '600-400', '700-300', '800-200', '900-100', '950-50']; + const CORNERS = ['tl', 'tr', 'bl', 'br']; + describe('color pairings', () => { + const createColorPairingMappings = () => + COLOR_PROPERTIES.flatMap((property) => + COLORS.flatMap((color) => + V2_PAIRINGS.map((v2Pairing, index) => ({ + v2: `${property}-${color}-${v2Pairing}-token`, + v3: `${property}-${color}-${V3_PAIRINGS[index]}`, + })), + ), + ); + for (const { v2, v3 } of createColorPairingMappings()) { + it(`transforms ${v2}`, () => { + expect(transformClasses(v2).code).toBe(v3); + }); + } + }); + describe('backgrounds', () => { + const createBackgroundMappings = () => [ + // Backdrop mappings + ...COLORS.map((color) => ({ + v2: `bg-${color}-backdrop-token`, + v3: `bg-${color}-50/50 dark:bg-${color}-950/50`, + })), + // Hover mappings + ...COLORS.map((color) => ({ + v2: `bg-${color}-hover-token`, + v3: `preset-tonal-${color}`, + })), + // Active mappings + ...COLORS.map((color) => ({ + v2: `bg-${color}-active-token`, + v3: `preset-filled-${color}-500`, + })), + ]; + for (const { v2, v3 } of createBackgroundMappings()) { + it(`transforms ${v2}`, () => { + expect(transformClasses(v2).code).toBe(v3); + }); + } + }); + describe('border radius', () => { + const createBorderRadiusMappings = () => [ + { + v2: 'rounded-token', + v3: 'rounded-base', + }, + { + v2: 'rounded-container-token', + v3: 'rounded-container', + }, + ...CORNERS.flatMap((corner) => [ + { + v2: `rounded-${corner}-token`, + v3: `rounded-${corner}-base`, + }, + { + v2: `rounded-${corner}-container-token`, + v3: `rounded-${corner}-container`, + }, + ]), + ]; + for (const { v2, v3 } of createBorderRadiusMappings()) { + it(`transforms ${v2}`, () => { + expect(transformClasses(v2).code).toBe(v3); + }); + } + }); + describe('borders', () => { + const createBorderMappings = () => [ + { + v2: 'border-token', + v3: 'border', + }, + ...COLORS.flatMap((color) => + V2_PAIRINGS.map((v2Pairing, index) => ({ + v2: `border-${color}-${v2Pairing}-token`, + v3: `border-${color}-${V3_PAIRINGS[index]}`, + })), + ), + ]; + for (const { v2, v3 } of createBorderMappings()) { + it(`transforms ${v2}`, () => { + expect(transformClasses(v2).code).toBe(v3); + }); + } + }); + describe('rings', () => { + const createRingMappings = () => [ + { + v2: 'ring-token', + v3: 'ring', + }, + ...COLORS.flatMap((color) => + V2_PAIRINGS.map((v2Pairing, index) => ({ + v2: `ring-${color}-${v2Pairing}-token`, + v3: `ring-${color}-${V3_PAIRINGS[index]}`, + })), + ), + ]; + for (const { v2, v3 } of createRingMappings()) { + it(`transforms ${v2}`, () => { + expect(transformClasses(v2).code).toBe(v3); + }); + } + }); + describe('text', () => { + const createTextMappings = () => [ + // Font tokens + { + v2: 'font-token', + v3: 'base-font-family', + }, + { + v2: 'font-headings-token', + v3: 'heading-font-family', + }, + // Text color tokens + { + v2: 'text-token', + v3: 'base-font-color', + }, + // Text on color contrast tokens + ...COLORS.map((color) => ({ + v2: `text-on-${color}-token`, + v3: `text-${color}-contrast-500`, + })), + // Text color pairings + ...COLORS.flatMap((color) => + V2_PAIRINGS.map((v2Pairing, index) => ({ + v2: `text-${color}-${v2Pairing}-token`, + v3: `text-${color}-${V3_PAIRINGS[index]}`, + })), + ), + ]; + for (const { v2, v3 } of createTextMappings()) { + it(`transforms ${v2}`, () => { + expect(transformClasses(v2).code).toBe(v3); + }); + } + }); + describe('text decoration', () => { + const createDecorationMappings = () => + COLORS.flatMap((color) => + V2_PAIRINGS.map((v2Pairing, index) => ({ + v2: `decoration-${color}-${v2Pairing}-token`, + v3: `decoration-${color}-${V3_PAIRINGS[index]}`, + })), + ); + + for (const { v2, v3 } of createDecorationMappings()) { + it(`transforms ${v2}`, () => { + expect(transformClasses(v2).code).toBe(v3); + }); + } + }); + describe('accent', () => { + const createAccentMappings = () => + COLORS.map((color) => ({ + v2: `accent-${color}-token`, + v3: `accent-${color}-500`, + })); + + for (const { v2, v3 } of createAccentMappings()) { + it(`transforms ${v2}`, () => { + expect(transformClasses(v2).code).toBe(v3); + }); + } + }); + describe('presets', () => { + const createPresetMappings = () => [ + { + v2: 'variant-filled', + v3: 'preset-filled', + }, + ...COLORS.map((color) => ({ + v2: `variant-filled-${color}`, + v3: `preset-filled-${color}-500`, + })), + { + v2: 'variant-ghost', + v3: 'preset-tonal border border-surface-500', + }, + ...COLORS.map((color) => ({ + v2: `variant-ghost-${color}`, + v3: `preset-tonal-${color} border border-${color}-500`, + })), + { + v2: 'variant-soft', + v3: 'preset-tonal', + }, + ...COLORS.map((color) => ({ + v2: `variant-soft-${color}`, + v3: `preset-tonal-${color}`, + })), + { + v2: 'variant-ringed', + v3: 'preset-outlined', + }, + ...COLORS.map((color) => ({ + v2: `variant-ringed-${color}`, + v3: `preset-outlined-${color}-500`, + })), + { + v2: 'variant-glass', + v3: 'preset-tonal', + }, + ...COLORS.map((color) => ({ + v2: `variant-glass-${color}`, + v3: `preset-tonal-${color}`, + })), + ]; + for (const { v2, v3 } of createPresetMappings()) { + it(`transforms ${v2}`, () => { + expect(transformClasses(v2).code).toBe(v3); + }); + } + }); + describe('tailwind components', () => { + const createTailwindMappings = () => [ + /** + * Disabled until further discussion + * @see https://github.com/skeletonlabs/skeleton/pull/2972#discussion_r1857260763 + */ + // { + // v2: 'card', + // v3: 'card bg-surface-100-900-token' + // }, + { + v2: 'btn-xl', + v3: 'btn-lg', + }, + { + v2: 'btn-icon-xl', + v3: 'btn-icon-lg', + }, + { + v2: 'btn-group', + v3: '', + }, + { + v2: 'table-hover', + v3: '', + }, + ]; + for (const { v2, v3 } of createTailwindMappings()) { + it(`transforms ${v2}`, () => { + expect(transformClasses(v2).code).toBe(v3); + }); + } + }); +}); diff --git a/packages/cli/test/migrate/skeleton-3/samples.test.ts b/packages/cli/test/migrate/skeleton-3/samples.test.ts new file mode 100644 index 0000000000..53a1e30ee5 --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples.test.ts @@ -0,0 +1,79 @@ +import { transformAppCss } from '../../../src/commands/migrate/migrations/skeleton-3/transformers/transform-app.css.js'; +import { transformAppHtml } from '../../../src/commands/migrate/migrations/skeleton-3/transformers/transform-app.html.js'; +import { transformModule } from '../../../src/commands/migrate/migrations/skeleton-3/transformers/transform-module.js'; +import { transformPackageJson } from '../../../src/commands/migrate/migrations/skeleton-3/transformers/transform-package.json.js'; +import { transformStyleSheet } from '../../../src/commands/migrate/migrations/skeleton-3/transformers/transform-stylesheet.js'; +import { transformSvelte } from '../../../src/commands/migrate/migrations/skeleton-3/transformers/transform-svelte.js'; +import { FALLBACK_THEME } from '../../../src/commands/migrate/migrations/skeleton-3/utility/constants.js'; +import { readFile } from 'node:fs/promises'; +import { fileURLToPath, resolve } from 'node:url'; +import { describe, expect, test } from 'vitest'; + +const TRANSFORMER_MAP = { + svelte: transformSvelte, + module: transformModule, + stylesheet: transformStyleSheet, + 'app.html': transformAppHtml, + 'app.css': transformAppCss, + 'package.json': transformPackageJson, +}; + +function getResult(code: string, transformer: keyof typeof TRANSFORMER_MAP) { + switch (transformer) { + case 'svelte': + case 'module': + case 'stylesheet': + case 'app.html': { + return TRANSFORMER_MAP[transformer](code).code; + } + case 'app.css': { + return TRANSFORMER_MAP[transformer](code, FALLBACK_THEME).code; + } + case 'package.json': { + return TRANSFORMER_MAP[transformer](code, '3.0.0', '1.0.0').code; + } + } +} + +function clean(code: string) { + return code.trim().replace(/\r\n|\r|\n/g, '\n'); +} + +const samples = import.meta.glob('./samples/**/*', { + query: '?raw', +}); + +const testCases = Object.keys(samples).reduce( + (acc, path) => { + const pathParts = path.split('/'); + const transformer = pathParts[2]; + const testName = pathParts[3]; + const fileType = pathParts[4]; + if (!transformer || !testName || !fileType || !(transformer in TRANSFORMER_MAP) || !['input', 'output'].includes(fileType)) { + return acc; + } + acc[transformer] = acc[transformer] || {}; + acc[transformer][testName] = acc[transformer][testName] || { input: '', output: '' }; + acc[transformer][testName][fileType as 'input' | 'output'] = path; + return acc; + }, + {} as Record<string, Record<string, { input: string; output: string }>>, +); + +describe('samples', () => { + for (const [transformerName, tests] of Object.entries(testCases)) { + describe(transformerName, () => { + for (const [testName, { input: inputPath, output: outputPath }] of Object.entries(tests)) { + if (!inputPath || !outputPath) { + continue; + } + test(testName, async () => { + const input = await readFile(resolve(fileURLToPath(import.meta.url), inputPath), 'utf8'); + const actual = getResult(input, transformerName as keyof typeof TRANSFORMER_MAP); + const expected = await readFile(resolve(fileURLToPath(import.meta.url), outputPath), 'utf8'); + expect(clean(actual)).toBe(clean(expected)); + }); + } + }); + } +}); diff --git a/packages/cli/test/migrate/skeleton-3/samples/app.css/add-import/input b/packages/cli/test/migrate/skeleton-3/samples/app.css/add-import/input new file mode 100644 index 0000000000..a461c505f1 --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples/app.css/add-import/input @@ -0,0 +1 @@ +@import "tailwindcss"; \ No newline at end of file diff --git a/packages/cli/test/migrate/skeleton-3/samples/app.css/add-import/output b/packages/cli/test/migrate/skeleton-3/samples/app.css/add-import/output new file mode 100644 index 0000000000..ba97b6fcc2 --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples/app.css/add-import/output @@ -0,0 +1,4 @@ +@import "tailwindcss"; +@import "@skeletonlabs/skeleton"; +@import "@skeletonlabs/skeleton/optional/presets"; +@import "@skeletonlabs/skeleton/themes/cerberus"; diff --git a/packages/cli/test/migrate/skeleton-3/samples/app.css/classes-in-at-apply/input b/packages/cli/test/migrate/skeleton-3/samples/app.css/classes-in-at-apply/input new file mode 100644 index 0000000000..1ca56f58f1 --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples/app.css/classes-in-at-apply/input @@ -0,0 +1,3 @@ +.foo { + @apply rounded-token; +} \ No newline at end of file diff --git a/packages/cli/test/migrate/skeleton-3/samples/app.css/classes-in-at-apply/output b/packages/cli/test/migrate/skeleton-3/samples/app.css/classes-in-at-apply/output new file mode 100644 index 0000000000..8f685af5fa --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples/app.css/classes-in-at-apply/output @@ -0,0 +1,6 @@ +@import "@skeletonlabs/skeleton"; +@import "@skeletonlabs/skeleton/optional/presets"; +@import "@skeletonlabs/skeleton/themes/cerberus"; +.foo { + @apply rounded-base; +} \ No newline at end of file diff --git a/packages/cli/test/migrate/skeleton-3/samples/app.html/custom-data-theme/input b/packages/cli/test/migrate/skeleton-3/samples/app.html/custom-data-theme/input new file mode 100644 index 0000000000..d1ca1aa022 --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples/app.html/custom-data-theme/input @@ -0,0 +1,5 @@ +<!DOCTYPE html> +<html> + <head></head> + <body data-theme="custom"></body> +</html> diff --git a/packages/cli/test/migrate/skeleton-3/samples/app.html/custom-data-theme/output b/packages/cli/test/migrate/skeleton-3/samples/app.html/custom-data-theme/output new file mode 100644 index 0000000000..1a90eca4b6 --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples/app.html/custom-data-theme/output @@ -0,0 +1,5 @@ +<!DOCTYPE html> +<html data-theme="custom"> + <head></head> + <body></body> +</html> diff --git a/packages/cli/test/migrate/skeleton-3/samples/app.html/skeleton-data-theme/input b/packages/cli/test/migrate/skeleton-3/samples/app.html/skeleton-data-theme/input new file mode 100644 index 0000000000..4afde68374 --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples/app.html/skeleton-data-theme/input @@ -0,0 +1,5 @@ +<!DOCTYPE html> +<html> + <head></head> + <body data-theme="skeleton"></body> +</html> diff --git a/packages/cli/test/migrate/skeleton-3/samples/app.html/skeleton-data-theme/output b/packages/cli/test/migrate/skeleton-3/samples/app.html/skeleton-data-theme/output new file mode 100644 index 0000000000..9f6154453b --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples/app.html/skeleton-data-theme/output @@ -0,0 +1,5 @@ +<!DOCTYPE html> +<html data-theme="legacy"> + <head></head> + <body></body> +</html> diff --git a/packages/cli/test/migrate/skeleton-3/samples/module/classes-in-identifiers/input b/packages/cli/test/migrate/skeleton-3/samples/module/classes-in-identifiers/input new file mode 100644 index 0000000000..cf37896dae --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples/module/classes-in-identifiers/input @@ -0,0 +1 @@ +const foo = 'rounded-token'; diff --git a/packages/cli/test/migrate/skeleton-3/samples/module/classes-in-identifiers/output b/packages/cli/test/migrate/skeleton-3/samples/module/classes-in-identifiers/output new file mode 100644 index 0000000000..0735bb56ee --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples/module/classes-in-identifiers/output @@ -0,0 +1 @@ +const foo = 'rounded-base'; diff --git a/packages/cli/test/migrate/skeleton-3/samples/module/keep-non-skeleton-identifiers/input b/packages/cli/test/migrate/skeleton-3/samples/module/keep-non-skeleton-identifiers/input new file mode 100644 index 0000000000..011b5f5a01 --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples/module/keep-non-skeleton-identifiers/input @@ -0,0 +1,3 @@ +import { AccordionItem } from '@skeletonlabs/not-skeleton'; + +AccordionItem; diff --git a/packages/cli/test/migrate/skeleton-3/samples/module/keep-non-skeleton-identifiers/output b/packages/cli/test/migrate/skeleton-3/samples/module/keep-non-skeleton-identifiers/output new file mode 100644 index 0000000000..011b5f5a01 --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples/module/keep-non-skeleton-identifiers/output @@ -0,0 +1,3 @@ +import { AccordionItem } from '@skeletonlabs/not-skeleton'; + +AccordionItem; diff --git a/packages/cli/test/migrate/skeleton-3/samples/module/keep-non-skeleton-imports/input b/packages/cli/test/migrate/skeleton-3/samples/module/keep-non-skeleton-imports/input new file mode 100644 index 0000000000..b37f19d4c8 --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples/module/keep-non-skeleton-imports/input @@ -0,0 +1,2 @@ +import { AppShell } from '@skeletonlabs/not-skeleton'; + diff --git a/packages/cli/test/migrate/skeleton-3/samples/module/keep-non-skeleton-imports/output b/packages/cli/test/migrate/skeleton-3/samples/module/keep-non-skeleton-imports/output new file mode 100644 index 0000000000..7cbd793e30 --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples/module/keep-non-skeleton-imports/output @@ -0,0 +1 @@ +import { AppShell } from '@skeletonlabs/not-skeleton'; diff --git a/packages/cli/test/migrate/skeleton-3/samples/module/remove-import-keep-default/input b/packages/cli/test/migrate/skeleton-3/samples/module/remove-import-keep-default/input new file mode 100644 index 0000000000..e65828861e --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples/module/remove-import-keep-default/input @@ -0,0 +1 @@ +import Foo, { Apollo } from "@skeletonlabs/skeleton"; \ No newline at end of file diff --git a/packages/cli/test/migrate/skeleton-3/samples/module/remove-import-keep-default/output b/packages/cli/test/migrate/skeleton-3/samples/module/remove-import-keep-default/output new file mode 100644 index 0000000000..c060edcd2f --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples/module/remove-import-keep-default/output @@ -0,0 +1 @@ +import Foo from "@skeletonlabs/skeleton-svelte"; \ No newline at end of file diff --git a/packages/cli/test/migrate/skeleton-3/samples/module/remove-import-keep-named-imports/input b/packages/cli/test/migrate/skeleton-3/samples/module/remove-import-keep-named-imports/input new file mode 100644 index 0000000000..ad2f9df51c --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples/module/remove-import-keep-named-imports/input @@ -0,0 +1 @@ +import { Foo, Apollo } from "@skeletonlabs/skeleton"; \ No newline at end of file diff --git a/packages/cli/test/migrate/skeleton-3/samples/module/remove-import-keep-named-imports/output b/packages/cli/test/migrate/skeleton-3/samples/module/remove-import-keep-named-imports/output new file mode 100644 index 0000000000..c3f18afccf --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples/module/remove-import-keep-named-imports/output @@ -0,0 +1 @@ +import { Foo } from "@skeletonlabs/skeleton-svelte"; \ No newline at end of file diff --git a/packages/cli/test/migrate/skeleton-3/samples/module/remove-import/input b/packages/cli/test/migrate/skeleton-3/samples/module/remove-import/input new file mode 100644 index 0000000000..3070c688ce --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples/module/remove-import/input @@ -0,0 +1,56 @@ +import { + Apollo, + AppRailAnchor, + AppShell, + Autocomplete, + BlueNight, + CodeBlock, + ConicGradient, + Drawer, + Emerald, + GreenFall, + LightSwitch, + ListBox, + ListBoxItem, + Modal, + Noir, + NoirLight, + RecursiveTreeView, + RecursiveTreeViewItem, + Rustic, + Step, + Stepper, + Summer84, + Table, + TableOfContents, + TreeView, + TreeViewItem, + XPro, + autoModeWatcher, + clipboard, + filter, + focusTrap, + getDrawerStore, + getModalStore, + getModeAutoPrefers, + getModeOsPrefers, + getModeUserPrefers, + getToastStore, + initializeStores, + localStorageStore, + modeCurrent, + modeOsPrefers, + modeUserPrefers, + popup, + prefersReducedMotionStore, + setInitialClassState, + setModeCurrent, + setModeUserPrefers, + storeHighlightJs, + storePopup, + tableMapperValues, + tableSourceMapper, + tableSourceValues, + tocCrawler, + tocStore +} from "@skeletonlabs/skeleton"; \ No newline at end of file diff --git a/packages/cli/test/migrate/skeleton-3/samples/module/remove-import/output b/packages/cli/test/migrate/skeleton-3/samples/module/remove-import/output new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/cli/test/migrate/skeleton-3/samples/module/rename-import/input b/packages/cli/test/migrate/skeleton-3/samples/module/rename-import/input new file mode 100644 index 0000000000..bb450b4b26 --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples/module/rename-import/input @@ -0,0 +1 @@ +import { Accordion, AccordionItem, AppRail, FileButton, FileDropzone, InputChip, Paginator, ProgressBar, ProgressRadial, RadioGroup, RangeSlider, SlideToggle, TabGroup } from "@skeletonlabs/skeleton"; diff --git a/packages/cli/test/migrate/skeleton-3/samples/module/rename-import/output b/packages/cli/test/migrate/skeleton-3/samples/module/rename-import/output new file mode 100644 index 0000000000..c9f6dcfb55 --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples/module/rename-import/output @@ -0,0 +1 @@ +import { Accordion, Navigation, FileUpload, TagsInput, Pagination, Progress, ProgressRing, Segment, Slider, Switch, Tabs } from "@skeletonlabs/skeleton-svelte"; diff --git a/packages/cli/test/migrate/skeleton-3/samples/module/special-characters/input b/packages/cli/test/migrate/skeleton-3/samples/module/special-characters/input new file mode 100644 index 0000000000..622632a9b3 --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples/module/special-characters/input @@ -0,0 +1,19 @@ +let str1 = "\n"; +let str2 = "\r"; +let str3 = "\t"; +let str4 = "\b"; +let str5 = "\f"; +let str6 = "\v"; +let str7 = "\'"; +let str8 = "\""; +let str9 = "\\"; +let str10 = "\0"; +let str11 = "\ufeff"; +let str12 = "\u2028"; +let str13 = "\u2029"; +let str14 = "Hello\nWorld\t!"; +let str15 = "Path\\to\\file"; +let str16 = "Quote\"s\'here"; +let str17 = "\x1b[31m"; +let str18 = `Template +literal`; diff --git a/packages/cli/test/migrate/skeleton-3/samples/module/special-characters/output b/packages/cli/test/migrate/skeleton-3/samples/module/special-characters/output new file mode 100644 index 0000000000..622632a9b3 --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples/module/special-characters/output @@ -0,0 +1,19 @@ +let str1 = "\n"; +let str2 = "\r"; +let str3 = "\t"; +let str4 = "\b"; +let str5 = "\f"; +let str6 = "\v"; +let str7 = "\'"; +let str8 = "\""; +let str9 = "\\"; +let str10 = "\0"; +let str11 = "\ufeff"; +let str12 = "\u2028"; +let str13 = "\u2029"; +let str14 = "Hello\nWorld\t!"; +let str15 = "Path\\to\\file"; +let str16 = "Quote\"s\'here"; +let str17 = "\x1b[31m"; +let str18 = `Template +literal`; diff --git a/packages/cli/test/migrate/skeleton-3/samples/package.json/update-skeleton-and-tw-plugin/input b/packages/cli/test/migrate/skeleton-3/samples/package.json/update-skeleton-and-tw-plugin/input new file mode 100644 index 0000000000..6f6fa5e67d --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples/package.json/update-skeleton-and-tw-plugin/input @@ -0,0 +1,6 @@ +{ + "dependencies": { + "@skeletonlabs/tw-plugin": "^1.0.0", + "@skeletonlabs/skeleton": "^2.0.0" + } +} diff --git a/packages/cli/test/migrate/skeleton-3/samples/package.json/update-skeleton-and-tw-plugin/output b/packages/cli/test/migrate/skeleton-3/samples/package.json/update-skeleton-and-tw-plugin/output new file mode 100644 index 0000000000..ecb6c038bf --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples/package.json/update-skeleton-and-tw-plugin/output @@ -0,0 +1,6 @@ +{ + "dependencies": { + "@skeletonlabs/skeleton": "^3.0.0", + "@skeletonlabs/skeleton-svelte": "^1.0.0" + } +} diff --git a/packages/cli/test/migrate/skeleton-3/samples/package.json/update-skeleton/input b/packages/cli/test/migrate/skeleton-3/samples/package.json/update-skeleton/input new file mode 100644 index 0000000000..ecfce78d81 --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples/package.json/update-skeleton/input @@ -0,0 +1,5 @@ +{ + "dependencies": { + "@skeletonlabs/skeleton": "^2.0.0" + } +} diff --git a/packages/cli/test/migrate/skeleton-3/samples/package.json/update-skeleton/output b/packages/cli/test/migrate/skeleton-3/samples/package.json/update-skeleton/output new file mode 100644 index 0000000000..a80d7d0647 --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples/package.json/update-skeleton/output @@ -0,0 +1,5 @@ +{ + "dependencies": { + "@skeletonlabs/skeleton-svelte": "^1.0.0" + } +} diff --git a/packages/cli/test/migrate/skeleton-3/samples/package.json/update-tw-plugin/input b/packages/cli/test/migrate/skeleton-3/samples/package.json/update-tw-plugin/input new file mode 100644 index 0000000000..d2775bff43 --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples/package.json/update-tw-plugin/input @@ -0,0 +1,5 @@ +{ + "dependencies": { + "@skeletonlabs/tw-plugin": "^1.0.0" + } +} diff --git a/packages/cli/test/migrate/skeleton-3/samples/package.json/update-tw-plugin/output b/packages/cli/test/migrate/skeleton-3/samples/package.json/update-tw-plugin/output new file mode 100644 index 0000000000..637ae61254 --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples/package.json/update-tw-plugin/output @@ -0,0 +1,5 @@ +{ + "dependencies": { + "@skeletonlabs/skeleton": "^3.0.0" + } +} diff --git a/packages/cli/test/migrate/skeleton-3/samples/stylesheet/classes-in-at-apply/input b/packages/cli/test/migrate/skeleton-3/samples/stylesheet/classes-in-at-apply/input new file mode 100644 index 0000000000..d2ce0122d3 --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples/stylesheet/classes-in-at-apply/input @@ -0,0 +1,3 @@ +.foo { + @apply rounded-token; +} diff --git a/packages/cli/test/migrate/skeleton-3/samples/stylesheet/classes-in-at-apply/output b/packages/cli/test/migrate/skeleton-3/samples/stylesheet/classes-in-at-apply/output new file mode 100644 index 0000000000..139490e20c --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples/stylesheet/classes-in-at-apply/output @@ -0,0 +1,3 @@ +.foo { + @apply rounded-base; +} diff --git a/packages/cli/test/migrate/skeleton-3/samples/svelte/classes-in-at-apply/input b/packages/cli/test/migrate/skeleton-3/samples/svelte/classes-in-at-apply/input new file mode 100644 index 0000000000..e99fcff773 --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples/svelte/classes-in-at-apply/input @@ -0,0 +1,5 @@ +<style lang="postcss"> + .foo { + @apply rounded-token; + } +</style> diff --git a/packages/cli/test/migrate/skeleton-3/samples/svelte/classes-in-at-apply/output b/packages/cli/test/migrate/skeleton-3/samples/svelte/classes-in-at-apply/output new file mode 100644 index 0000000000..daae49f2e8 --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples/svelte/classes-in-at-apply/output @@ -0,0 +1,5 @@ +<style lang="postcss"> + .foo { + @apply rounded-base; + } +</style> diff --git a/packages/cli/test/migrate/skeleton-3/samples/svelte/classes-in-attribute/input b/packages/cli/test/migrate/skeleton-3/samples/svelte/classes-in-attribute/input new file mode 100644 index 0000000000..8ea1ca3ed0 --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples/svelte/classes-in-attribute/input @@ -0,0 +1 @@ +<div class="rounded-token"></div> \ No newline at end of file diff --git a/packages/cli/test/migrate/skeleton-3/samples/svelte/classes-in-attribute/output b/packages/cli/test/migrate/skeleton-3/samples/svelte/classes-in-attribute/output new file mode 100644 index 0000000000..178031ef9e --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples/svelte/classes-in-attribute/output @@ -0,0 +1 @@ +<div class="rounded-base"></div> diff --git a/packages/cli/test/migrate/skeleton-3/samples/svelte/classes-in-class-directive-with-identifier/input b/packages/cli/test/migrate/skeleton-3/samples/svelte/classes-in-class-directive-with-identifier/input new file mode 100644 index 0000000000..1495c82150 --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples/svelte/classes-in-class-directive-with-identifier/input @@ -0,0 +1,5 @@ +<script> + const foo = true; +</script> + +<div class:rounded-token="{foo}"></div> diff --git a/packages/cli/test/migrate/skeleton-3/samples/svelte/classes-in-class-directive-with-identifier/output b/packages/cli/test/migrate/skeleton-3/samples/svelte/classes-in-class-directive-with-identifier/output new file mode 100644 index 0000000000..f4e13d296b --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples/svelte/classes-in-class-directive-with-identifier/output @@ -0,0 +1,5 @@ +<script> + const foo = true; +</script> + +<div class:rounded-base="{foo}"></div> diff --git a/packages/cli/test/migrate/skeleton-3/samples/svelte/classes-in-class-directive-with-literal/input b/packages/cli/test/migrate/skeleton-3/samples/svelte/classes-in-class-directive-with-literal/input new file mode 100644 index 0000000000..b39732b649 --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples/svelte/classes-in-class-directive-with-literal/input @@ -0,0 +1 @@ +<div class:rounded-token="{true}"></div> diff --git a/packages/cli/test/migrate/skeleton-3/samples/svelte/classes-in-class-directive-with-literal/output b/packages/cli/test/migrate/skeleton-3/samples/svelte/classes-in-class-directive-with-literal/output new file mode 100644 index 0000000000..f93c8ebe14 --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples/svelte/classes-in-class-directive-with-literal/output @@ -0,0 +1 @@ +<div class:rounded-base="{true}"></div> diff --git a/packages/cli/test/migrate/skeleton-3/samples/svelte/classes-in-class-directive/input b/packages/cli/test/migrate/skeleton-3/samples/svelte/classes-in-class-directive/input new file mode 100644 index 0000000000..856a360a89 --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples/svelte/classes-in-class-directive/input @@ -0,0 +1 @@ +<div class:rounded-token></div> \ No newline at end of file diff --git a/packages/cli/test/migrate/skeleton-3/samples/svelte/classes-in-class-directive/output b/packages/cli/test/migrate/skeleton-3/samples/svelte/classes-in-class-directive/output new file mode 100644 index 0000000000..856a360a89 --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples/svelte/classes-in-class-directive/output @@ -0,0 +1 @@ +<div class:rounded-token></div> \ No newline at end of file diff --git a/packages/cli/test/migrate/skeleton-3/samples/svelte/classes-in-expression-attribute/input b/packages/cli/test/migrate/skeleton-3/samples/svelte/classes-in-expression-attribute/input new file mode 100644 index 0000000000..09d1115db4 --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples/svelte/classes-in-expression-attribute/input @@ -0,0 +1 @@ +<div class={"rounded-token"}></div> \ No newline at end of file diff --git a/packages/cli/test/migrate/skeleton-3/samples/svelte/classes-in-expression-attribute/output b/packages/cli/test/migrate/skeleton-3/samples/svelte/classes-in-expression-attribute/output new file mode 100644 index 0000000000..0357d6a785 --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples/svelte/classes-in-expression-attribute/output @@ -0,0 +1 @@ +<div class={"rounded-base"}></div> \ No newline at end of file diff --git a/packages/cli/test/migrate/skeleton-3/samples/svelte/classes-in-literal/input b/packages/cli/test/migrate/skeleton-3/samples/svelte/classes-in-literal/input new file mode 100644 index 0000000000..27097cb492 --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples/svelte/classes-in-literal/input @@ -0,0 +1,3 @@ +<script> + const foo = 'rounded-token'; +</script> diff --git a/packages/cli/test/migrate/skeleton-3/samples/svelte/classes-in-literal/output b/packages/cli/test/migrate/skeleton-3/samples/svelte/classes-in-literal/output new file mode 100644 index 0000000000..bf3a12f9b7 --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples/svelte/classes-in-literal/output @@ -0,0 +1,3 @@ +<script> + const foo = 'rounded-base'; +</script> diff --git a/packages/cli/test/migrate/skeleton-3/samples/svelte/empty-strings/input b/packages/cli/test/migrate/skeleton-3/samples/svelte/empty-strings/input new file mode 100644 index 0000000000..202c9afaff --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples/svelte/empty-strings/input @@ -0,0 +1,7 @@ +<script> + let foo = ""; +</script> + +<div class=""></div> +<div class={""}></div> +<div class="{""}"></div> diff --git a/packages/cli/test/migrate/skeleton-3/samples/svelte/empty-strings/output b/packages/cli/test/migrate/skeleton-3/samples/svelte/empty-strings/output new file mode 100644 index 0000000000..202c9afaff --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples/svelte/empty-strings/output @@ -0,0 +1,7 @@ +<script> + let foo = ""; +</script> + +<div class=""></div> +<div class={""}></div> +<div class="{""}"></div> diff --git a/packages/cli/test/migrate/skeleton-3/samples/svelte/keep-non-skeleton-components/input b/packages/cli/test/migrate/skeleton-3/samples/svelte/keep-non-skeleton-components/input new file mode 100644 index 0000000000..33901a79e0 --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples/svelte/keep-non-skeleton-components/input @@ -0,0 +1,5 @@ +<script> + import { AccordionItem } from '@skeletonlabs/not-skeleton'; +</script> + +<AccordionItem /> diff --git a/packages/cli/test/migrate/skeleton-3/samples/svelte/keep-non-skeleton-components/output b/packages/cli/test/migrate/skeleton-3/samples/svelte/keep-non-skeleton-components/output new file mode 100644 index 0000000000..33901a79e0 --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples/svelte/keep-non-skeleton-components/output @@ -0,0 +1,5 @@ +<script> + import { AccordionItem } from '@skeletonlabs/not-skeleton'; +</script> + +<AccordionItem /> diff --git a/packages/cli/test/migrate/skeleton-3/samples/svelte/rename-components/input b/packages/cli/test/migrate/skeleton-3/samples/svelte/rename-components/input new file mode 100644 index 0000000000..2293869ceb --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples/svelte/rename-components/input @@ -0,0 +1,38 @@ +<script> + import { AccordionItem, AppRail, AppRailTile, FileButton, FileDropzone, InputChip, Paginator, ProgressBar, ProgressRadial, RadioGroup, RadioItem, RangeSlider, Ratings, SlideToggle, TabGroup, TabAnchor, Toast } from "@skeletonlabs/skeleton"; +</script> + +<AccordionItem /> +<AccordionItem></AccordionItem> +<AppRail /> +<AppRail></AppRail> +<AppRailTile /> +<AppRailTile></AppRailTile> +<FileButton /> +<FileButton></FileButton> +<FileDropzone /> +<FileDropzone></FileDropzone> +<InputChip /> +<InputChip></InputChip> +<Paginator /> +<Paginator></Paginator> +<ProgressBar /> +<ProgressBar></ProgressBar> +<ProgressRadial /> +<ProgressRadial></ProgressRadial> +<RadioGroup /> +<RadioGroup></RadioGroup> +<RadioItem /> +<RadioItem></RadioItem> +<RangeSlider /> +<RangeSlider></RangeSlider> +<Ratings /> +<Ratings></Ratings> +<SlideToggle /> +<SlideToggle></SlideToggle> +<TabGroup /> +<TabGroup></TabGroup> +<TabAnchor /> +<TabAnchor></TabAnchor> +<Toast /> +<Toast></Toast> diff --git a/packages/cli/test/migrate/skeleton-3/samples/svelte/rename-components/output b/packages/cli/test/migrate/skeleton-3/samples/svelte/rename-components/output new file mode 100644 index 0000000000..fffade9bec --- /dev/null +++ b/packages/cli/test/migrate/skeleton-3/samples/svelte/rename-components/output @@ -0,0 +1,38 @@ +<script> + import { Accordion, Navigation, FileUpload, TagsInput, Pagination, Progress, ProgressRing, Segment, Slider, Rating, Switch, Tabs, ToastProvider } from "@skeletonlabs/skeleton-svelte"; +</script> + +<Accordion.Item /> +<Accordion.Item></Accordion.Item> +<Navigation /> +<Navigation></Navigation> +<Navigation.Tile /> +<Navigation.Tile></Navigation.Tile> +<FileUpload /> +<FileUpload></FileUpload> +<FileUpload /> +<FileUpload></FileUpload> +<TagsInput /> +<TagsInput></TagsInput> +<Pagination /> +<Pagination></Pagination> +<Progress /> +<Progress></Progress> +<ProgressRing /> +<ProgressRing></ProgressRing> +<Segment /> +<Segment></Segment> +<Segment.Item /> +<Segment.Item></Segment.Item> +<Slider /> +<Slider></Slider> +<Rating /> +<Rating></Rating> +<Switch /> +<Switch></Switch> +<Tabs /> +<Tabs></Tabs> +<Tabs.Control /> +<Tabs.Control></Tabs.Control> +<ToastProvider /> +<ToastProvider></ToastProvider> diff --git a/packages/cli/tsconfig.json b/packages/cli/tsconfig.json new file mode 100644 index 0000000000..1e825abc08 --- /dev/null +++ b/packages/cli/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "skipLibCheck": true, + "target": "es2022", + "allowJs": true, + "resolveJsonModule": true, + "moduleDetection": "force", + "isolatedModules": true, + "verbatimModuleSyntax": true, + "strict": true, + "noUncheckedIndexedAccess": true, + "noImplicitOverride": true, + "declaration": true, + "declarationMap": true, + "module": "preserve", + "noEmit": true, + "lib": ["es2022"], + "types": ["vite/client"] + }, + "include": ["src", "test"] +} diff --git a/packages/cli/tsdown.config.ts b/packages/cli/tsdown.config.ts new file mode 100644 index 0000000000..b325153042 --- /dev/null +++ b/packages/cli/tsdown.config.ts @@ -0,0 +1,5 @@ +import { defineConfig } from 'tsdown'; + +export default defineConfig({ + logLevel: 'silent', +}); diff --git a/packages/skeleton-common/CHANGELOG.md b/packages/skeleton-common/CHANGELOG.md new file mode 100644 index 0000000000..50345711d5 --- /dev/null +++ b/packages/skeleton-common/CHANGELOG.md @@ -0,0 +1,83 @@ +# @skeletonlabs/skeleton-common + +## 1.0.0-next.11 + +### Minor Changes + +- feat: combobox ([#3702](https://github.com/skeletonlabs/skeleton/pull/3702)) + +- feat: slider ([#3771](https://github.com/skeletonlabs/skeleton/pull/3771)) + +## 1.0.0-next.10 + +### Patch Changes + +- chore: trusted publishing ([#3792](https://github.com/skeletonlabs/skeleton/pull/3792)) + +## 1.0.0-next.9 + +### Minor Changes + +- feat: app-bar ([#3783](https://github.com/skeletonlabs/skeleton/pull/3783)) + +## 1.0.0-next.8 + +### Minor Changes + +- feat: segmented control ([#3758](https://github.com/skeletonlabs/skeleton/pull/3758)) + +## 1.0.0-next.7 + +### Minor Changes + +- feat: dialog ([#3700](https://github.com/skeletonlabs/skeleton/pull/3700)) + +## 1.0.0-next.6 + +### Minor Changes + +- feat: tooltip ([#3697](https://github.com/skeletonlabs/skeleton/pull/3697)) + +- feat: tags input ([#3740](https://github.com/skeletonlabs/skeleton/pull/3740)) + +- feat: popover ([#3696](https://github.com/skeletonlabs/skeleton/pull/3696)) + +## 1.0.0-next.5 + +### Minor Changes + +- feat: file-upload ([#3693](https://github.com/skeletonlabs/skeleton/pull/3693)) + +## 1.0.0-next.4 + +### Minor Changes + +- feat: toast ([#3704](https://github.com/skeletonlabs/skeleton/pull/3704)) + +- feat: switch ([#3695](https://github.com/skeletonlabs/skeleton/pull/3695)) + +## 1.0.0-next.3 + +### Minor Changes + +- feat: progress-linear ([#3694](https://github.com/skeletonlabs/skeleton/pull/3694)) + +## 1.0.0-next.2 + +### Minor Changes + +- feat: tabs ([#3679](https://github.com/skeletonlabs/skeleton/pull/3679)) + +- feat: rating-group ([#3681](https://github.com/skeletonlabs/skeleton/pull/3681)) + +## 1.0.0-next.1 + +### Major Changes + +- feat: v4 preperation ([#3662](https://github.com/skeletonlabs/skeleton/pull/3662)) + +## 0.0.1-next.0 + +### Patch Changes + +- feat: init ([#3659](https://github.com/skeletonlabs/skeleton/pull/3659)) diff --git a/packages/skeleton-common/README.md b/packages/skeleton-common/README.md new file mode 100644 index 0000000000..e8e8d83273 --- /dev/null +++ b/packages/skeleton-common/README.md @@ -0,0 +1,11 @@ +# Skeleton Common + +## Installation + +```bash +pnpm add @skeletonlabs/skeleton-common +``` + +## Documentation + +Explore the full documentation at [skeleton.dev](https://skeleton.dev/). diff --git a/packages/skeleton-common/package.json b/packages/skeleton-common/package.json new file mode 100644 index 0000000000..a91942a7b9 --- /dev/null +++ b/packages/skeleton-common/package.json @@ -0,0 +1,37 @@ +{ + "name": "@skeletonlabs/skeleton-common", + "version": "1.0.0-next.11", + "description": "The common package for Skeleton.", + "author": "endigo9740 <chris@skeletonlabs.dev>", + "repository": { + "type": "git", + "url": "git+https://github.com/skeletonlabs/skeleton.git", + "directory": "packages/skeleton-common" + }, + "scripts": { + "dev": "tsdown --watch", + "build": "tsdown", + "check": "tsc", + "sync": "pnpm build" + }, + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js", + "style": "./dist/index.css" + } + }, + "files": [ + "dist" + ], + "sideEffects": false, + "devDependencies": { + "@skeletonlabs/skeleton": "workspace:*", + "tsdown": "catalog:", + "typescript": "catalog:", + "unplugin-macros": "catalog:", + "unplugin-raw": "catalog:" + }, + "license": "MIT", + "type": "module" +} diff --git a/packages/skeleton-common/src/classes/accordion.ts b/packages/skeleton-common/src/classes/accordion.ts new file mode 100644 index 0000000000..8828aa1c65 --- /dev/null +++ b/packages/skeleton-common/src/classes/accordion.ts @@ -0,0 +1,10 @@ +import { defineSkeletonClasses } from '../internal/define-skeleton-classes' with { type: 'macro' }; + +export const classesAccordion = defineSkeletonClasses({ + root: 'w-full grid gap-2', + content: 'py-2 px-4', + heading: '', + trigger: 'w-full grid items-center gap-4 py-2 px-4 rounded-base text-left hover:preset-tonal-primary', + item: 'grid gap-2', + indicator: '', +}); diff --git a/packages/skeleton-common/src/classes/app-bar.ts b/packages/skeleton-common/src/classes/app-bar.ts new file mode 100644 index 0000000000..10b35e6793 --- /dev/null +++ b/packages/skeleton-common/src/classes/app-bar.ts @@ -0,0 +1,9 @@ +import { defineSkeletonClasses } from '../internal/define-skeleton-classes' with { type: 'macro' }; + +export const classesAppBar = defineSkeletonClasses({ + root: 'w-full bg-surface-100-900 p-4 space-y-4', + toolbar: 'grid items-center justify-between gap-4', + lead: '', + headline: '', + trail: 'flex gap-2', +}); diff --git a/packages/skeleton-common/src/classes/avatar.ts b/packages/skeleton-common/src/classes/avatar.ts new file mode 100644 index 0000000000..8bef60c218 --- /dev/null +++ b/packages/skeleton-common/src/classes/avatar.ts @@ -0,0 +1,7 @@ +import { defineSkeletonClasses } from '../internal/define-skeleton-classes' with { type: 'macro' }; + +export const classesAvatar = defineSkeletonClasses({ + root: 'isolate bg-surface-400-600 size-16 rounded-full overflow-hidden', + image: 'w-full object-cover', + fallback: 'size-full flex justify-center items-center', +}); diff --git a/packages/skeleton-common/src/classes/combobox.ts b/packages/skeleton-common/src/classes/combobox.ts new file mode 100644 index 0000000000..641417a148 --- /dev/null +++ b/packages/skeleton-common/src/classes/combobox.ts @@ -0,0 +1,20 @@ +import { defineSkeletonClasses } from '../internal/define-skeleton-classes.js' with { type: 'macro' }; + +export const classesCombobox = defineSkeletonClasses({ + root: 'w-full space-y-1', + label: 'label-text', + control: 'relative', + input: 'input', + trigger: 'btn-icon btn-icon-sm preset-tonal absolute right-1 top-1/2 -translate-y-1/2', + positioner: '', + content: 'card bg-surface-50-950 border border-surface-200-800 p-2 space-y-2', + itemGroup: '', + itemGroupLabel: 'text-surface-600-400 text-xs px-2 py-1', + item: [ + 'flex justify-between items-center px-2 py-1 rounded cursor-pointer', + 'data-highlighted:outline-2 data-highlighted:outline-offset-1 data-highlighted:outline-surface-950-50', + 'data-disabled:pointer-events-none data-disabled:opacity-50', + ], + itemText: '', + itemIndicator: '', +}); diff --git a/packages/skeleton-common/src/classes/dialog.ts b/packages/skeleton-common/src/classes/dialog.ts new file mode 100644 index 0000000000..8d389ff9de --- /dev/null +++ b/packages/skeleton-common/src/classes/dialog.ts @@ -0,0 +1,11 @@ +import { defineSkeletonClasses } from '../internal/define-skeleton-classes.js' with { type: 'macro' }; + +export const classesDialog = defineSkeletonClasses({ + trigger: '', + backdrop: '', + positioner: '', + content: '', + title: '', + description: '', + closeTrigger: '', +}); diff --git a/packages/skeleton-common/src/classes/file-upload.ts b/packages/skeleton-common/src/classes/file-upload.ts new file mode 100644 index 0000000000..5d7a94999d --- /dev/null +++ b/packages/skeleton-common/src/classes/file-upload.ts @@ -0,0 +1,15 @@ +import { defineSkeletonClasses } from '../internal/define-skeleton-classes' with { type: 'macro' }; + +export const classesFileUpload = defineSkeletonClasses({ + root: ['space-y-1 data-disabled:disabled'], + dropzone: [ + 'card px-4 py-10 border border-dashed border-surface-200-800 flex flex-col justify-center items-center gap-2 data-dragging:preset-tonal', + ], + hiddenInput: '', + trigger: 'btn preset-filled', + itemGroup: 'flex flex-col gap-2', + item: 'grid grid-cols-[auto_1fr_auto] rtl:grid-cols-[1fr_auto_auto] gap-4 items-center preset-tonal px-4 py-2 rounded', + itemName: 'text-sm', + itemSizeText: 'text-xs opacity-60', + itemDeleteTrigger: 'btn-icon', +}); diff --git a/packages/skeleton-common/src/classes/popover.ts b/packages/skeleton-common/src/classes/popover.ts new file mode 100644 index 0000000000..cea573128a --- /dev/null +++ b/packages/skeleton-common/src/classes/popover.ts @@ -0,0 +1,12 @@ +import { defineSkeletonClasses } from '../internal/define-skeleton-classes.js' with { type: 'macro' }; + +export const classesPopover = defineSkeletonClasses({ + trigger: '', + positioner: '', + content: '', + arrow: '', + arrowTip: '', + title: '', + description: '', + closeTrigger: '', +}); diff --git a/packages/skeleton-common/src/classes/progress-linear.ts b/packages/skeleton-common/src/classes/progress-linear.ts new file mode 100644 index 0000000000..b0115350f2 --- /dev/null +++ b/packages/skeleton-common/src/classes/progress-linear.ts @@ -0,0 +1,29 @@ +import { defineSkeletonClasses } from '../internal/define-skeleton-classes.js' with { type: 'macro' }; + +export const classesProgressLinear = defineSkeletonClasses({ + root: [ + // Common + 'items-center justify-center gap-2', + // Horizontal Orientation + 'data-[orientation=horizontal]:flex data-[orientation=horizontal]:flex-row data-[orientation=horizontal]:w-full', + // Vertical Orientation + 'data-[orientation=vertical]:inline-flex data-[orientation=vertical]:flex-col', + ], + label: 'label-text whitespace-nowrap', + track: [ + // Common + 'bg-surface-200-800 rounded-base overflow-hidden', + // Horizontal Orientation + 'data-[orientation=horizontal]:w-full data-[orientation=horizontal]:h-2', + // Vertical Orientation + 'data-[orientation=vertical]:w-2 data-[orientation=vertical]:h-[100px]', + ], + range: [ + // Common + 'h-full bg-surface-950-50 rounded-base', + // Horizontal Orientation + 'data-[orientation=horizontal]:transition-[width] data-[orientation=horizontal]:data-[state=indeterminate]:animate-progress-indeterminate-horz', + // Vertical Orientation + 'data-[orientation=vertical]:transition-[height] data-[orientation=vertical]:data-[state=indeterminate]:animate-progress-indeterminate-vert', + ], +}); diff --git a/packages/skeleton-common/src/classes/rating-group.ts b/packages/skeleton-common/src/classes/rating-group.ts new file mode 100644 index 0000000000..a41fffeb7d --- /dev/null +++ b/packages/skeleton-common/src/classes/rating-group.ts @@ -0,0 +1,9 @@ +import { defineSkeletonClasses } from '../internal/define-skeleton-classes' with { type: 'macro' }; + +export const classesRatingGroup = defineSkeletonClasses({ + root: 'flex flex-col gap-1', + label: 'label-text', + control: 'flex gap-2 data-disabled:cursor-not-allowed data-disabled:opacity-50', + item: '', + hiddenInput: '', +}); diff --git a/packages/skeleton-common/src/classes/segmented-control.ts b/packages/skeleton-common/src/classes/segmented-control.ts new file mode 100644 index 0000000000..8196fd85e3 --- /dev/null +++ b/packages/skeleton-common/src/classes/segmented-control.ts @@ -0,0 +1,17 @@ +import { defineSkeletonClasses } from '../internal/define-skeleton-classes.js' with { type: 'macro' }; + +export const classesSegmentedControl = defineSkeletonClasses({ + root: [ + 'inline-flex preset-outlined-surface-200-800 p-2 gap-2 rounded', + 'data-[orientation=horizontal]:flex-row data-[orientation=vertical]:flex-col', + ], + indicator: 'top-(--top) left-(--left) w-(--width) h-(--height) preset-filled rounded data-disabled:opacity-50', + item: [ + 'btn cursor-pointer z-10', + 'data-focus-visible:outline-2 data-focus-visible:outline-offset-1 data-focus-visible:outline-surface-950-50', + 'data-readonly:pointer-events-none', + 'data-disabled:pointer-events-none data-disabled:opacity-50', + ], + itemText: ['transition-colors', 'data-[state=checked]:text-surface-contrast-950 data-[state=checked]:dark:text-surface-contrast-50 '], + itemHiddenInput: '', +}); diff --git a/packages/skeleton-common/src/classes/slider.ts b/packages/skeleton-common/src/classes/slider.ts new file mode 100644 index 0000000000..d094b0fd93 --- /dev/null +++ b/packages/skeleton-common/src/classes/slider.ts @@ -0,0 +1,17 @@ +import { defineSkeletonClasses } from '../internal/define-skeleton-classes.js' with { type: 'macro' }; + +export const classesSlider = defineSkeletonClasses({ + root: 'space-y-3', + label: 'label-text', + valueText: '', + control: ['flex items-center', 'data-disabled:opacity-50'], + track: 'bg-surface-200-800 rounded-base h-2 overflow-hidden flex-1', + range: 'bg-surface-950-50 h-full', + thumb: [ + 'size-5 bg-surface-50-950 ring-inset ring-2 ring-surface-950-50 rounded-full', + 'focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-surface-950-50', + ], + hiddenInput: '', + markerGroup: '', + marker: 'text-xs text-surface-600-400', +}); diff --git a/packages/skeleton-common/src/classes/switch.ts b/packages/skeleton-common/src/classes/switch.ts new file mode 100644 index 0000000000..6e8bd984b5 --- /dev/null +++ b/packages/skeleton-common/src/classes/switch.ts @@ -0,0 +1,18 @@ +import { defineSkeletonClasses } from '../internal/define-skeleton-classes.js' with { type: 'macro' }; + +export const classesSwitch = defineSkeletonClasses({ + root: [ + 'cursor-pointer data-disabled:cursor-not-allowed data-disabled:opacity-50 inline-flex gap-2 items-center rounded', + 'data-focus-visible:outline-2 data-focus-visible:outline-offset-1 data-focus-visible:outline-surface-950-50', + ], + control: [ + 'block preset-filled-surface-200-800 h-6 w-10 p-0.5 rounded-full flex justify-start', + 'data-[state=checked]:preset-filled-primary-500', + ], + thumb: [ + 'rounded-full block preset-filled-surface-50-950 h-full aspect-square transition-transform grid place-items-center', + 'data-[state=checked]:bg-surface-950-50 data-[state=checked]:translate-x-4 rtl:data-[state=checked]:-translate-x-4', + ], + label: 'label-text', + hiddenInput: '', +}); diff --git a/packages/skeleton-common/src/classes/tabs.ts b/packages/skeleton-common/src/classes/tabs.ts new file mode 100644 index 0000000000..d4e1b2a130 --- /dev/null +++ b/packages/skeleton-common/src/classes/tabs.ts @@ -0,0 +1,17 @@ +import { defineSkeletonClasses } from '../internal/define-skeleton-classes' with { type: 'macro' }; + +export const classesTabs = defineSkeletonClasses({ + root: ['flex', 'data-[orientation=horizontal]:flex-col data-[orientation=vertical]:flex-row'], + list: [ + 'relative flex gap-2 border-surface-200-800', + 'data-[orientation=horizontal]:pb-2 data-[orientation=horizontal]:mb-4 data-[orientation=horizontal]:flex-row data-[orientation=horizontal]:border-b', + 'data-[orientation=vertical]:pe-2 data-[orientation=vertical]:me-4 data-[orientation=vertical]:flex-col data-[orientation=vertical]:border-e', + ], + trigger: ['btn hover:preset-tonal-primary', 'data-disabled:opacity-50'], + indicator: [ + 'bg-surface-950-50', + 'data-[orientation=horizontal]:w-(--width) data-[orientation=horizontal]:h-0.5 data-[orientation=horizontal]:bottom-0', + 'data-[orientation=vertical]:w-0.5 data-[orientation=vertical]:h-(--height) data-[orientation=vertical]:end-0', + ], + content: '', +}); diff --git a/packages/skeleton-common/src/classes/tags-input.ts b/packages/skeleton-common/src/classes/tags-input.ts new file mode 100644 index 0000000000..613348ad98 --- /dev/null +++ b/packages/skeleton-common/src/classes/tags-input.ts @@ -0,0 +1,15 @@ +import { defineSkeletonClasses } from '../internal/define-skeleton-classes' with { type: 'macro' }; + +export const classesTagsInput = defineSkeletonClasses({ + root: 'w-full space-y-2 gap-2', + label: 'label-text', + control: 'input flex flex-wrap gap-2 p-2', + item: '', + itemPreview: ['chip flex gap-0 p-0 preset-filled hover:brightness-100 w-fit', 'data-highlighted:ring data-highlighted:ring-primary-500'], + itemText: 'leading-none px-2 py-1', + itemDeleteTrigger: 'hover:preset-tonal px-2 py-1', + itemInput: 'input text-xs', + input: 'input-ghost', + clearTrigger: 'btn btn-sm preset-tonal hover:preset-filled-error-500', + hiddenInput: '', +}); diff --git a/packages/skeleton-common/src/classes/toast.ts b/packages/skeleton-common/src/classes/toast.ts new file mode 100644 index 0000000000..78577faf6a --- /dev/null +++ b/packages/skeleton-common/src/classes/toast.ts @@ -0,0 +1,17 @@ +import { defineSkeletonClasses } from '../internal/define-skeleton-classes' with { type: 'macro' }; + +export const classesToast = defineSkeletonClasses({ + root: [ + 'card p-3 w-full md:w-md ring flex items-center gap-2', + 'data-[type=info]:preset-filled-surface-50-950 data-[type=info]:ring-surface-200-800', + 'data-[type=success]:preset-filled-success-500', + 'data-[type=warning]:preset-filled-warning-500', + 'data-[type=error]:preset-filled-error-500', + ], + group: '', + message: 'flex-1', + title: 'font-medium text-sm', + description: 'text-sm', + actionTrigger: 'btn preset-filled', + closeTrigger: 'btn-icon hover:preset-tonal', +}); diff --git a/packages/skeleton-common/src/classes/tooltip.ts b/packages/skeleton-common/src/classes/tooltip.ts new file mode 100644 index 0000000000..907bb57197 --- /dev/null +++ b/packages/skeleton-common/src/classes/tooltip.ts @@ -0,0 +1,9 @@ +import { defineSkeletonClasses } from '../internal/define-skeleton-classes' with { type: 'macro' }; + +export const classesTooltip = defineSkeletonClasses({ + trigger: '', + positioner: '', + content: '', + arrow: '', + arrowTip: '', +}); diff --git a/packages/skeleton-common/src/index.css b/packages/skeleton-common/src/index.css new file mode 100644 index 0000000000..c4785a3451 --- /dev/null +++ b/packages/skeleton-common/src/index.css @@ -0,0 +1 @@ +@source './'; diff --git a/packages/skeleton-common/src/index.ts b/packages/skeleton-common/src/index.ts new file mode 100644 index 0000000000..05ab9d4aad --- /dev/null +++ b/packages/skeleton-common/src/index.ts @@ -0,0 +1,17 @@ +export * from './classes/accordion'; +export * from './classes/app-bar'; +export * from './classes/avatar'; +export * from './classes/combobox'; +export * from './classes/dialog'; +export * from './classes/file-upload'; +export * from './classes/popover'; +export * from './classes/progress-linear'; +export * from './classes/rating-group'; +export * from './classes/segmented-control'; +export * from './classes/slider'; +export * from './classes/switch'; +export * from './classes/tabs'; +export * from './classes/tags-input'; +export * from './classes/toast'; +export * from './classes/tooltip'; +export * from './themes'; diff --git a/packages/skeleton-common/src/internal/define-skeleton-classes.ts b/packages/skeleton-common/src/internal/define-skeleton-classes.ts new file mode 100644 index 0000000000..7412e1e7b9 --- /dev/null +++ b/packages/skeleton-common/src/internal/define-skeleton-classes.ts @@ -0,0 +1,22 @@ +export function defineSkeletonClasses<T extends Record<string, string | string[]>>(anatomy: T) { + const PREFIX = 'skb:'; + const ESCAPE_PREFIX = 'not-skb:'; + + return Object.fromEntries( + Object.entries(anatomy).map(([key, value]) => { + const normalized = Array.isArray(value) ? value.join(' ') : value; + const transformed = normalized + .split(' ') + .filter((cls) => cls.length > 0) + .map((cls) => { + if (cls.startsWith(ESCAPE_PREFIX)) { + return cls.slice(ESCAPE_PREFIX.length); + } + return `${PREFIX}${cls}`; + }) + .join(' '); + + return [key, transformed]; + }), + ) as { [K in keyof T]: string }; +} diff --git a/packages/skeleton-common/src/themes.ts b/packages/skeleton-common/src/themes.ts new file mode 100644 index 0000000000..1ef19c8916 --- /dev/null +++ b/packages/skeleton-common/src/themes.ts @@ -0,0 +1,143 @@ +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-nocheck +import catppuccin from '@skeletonlabs/skeleton/themes/catppuccin?raw'; +import cerberus from '@skeletonlabs/skeleton/themes/cerberus?raw'; +import concord from '@skeletonlabs/skeleton/themes/concord?raw'; +import crimson from '@skeletonlabs/skeleton/themes/crimson?raw'; +import fennec from '@skeletonlabs/skeleton/themes/fennec?raw'; +import hamlindigo from '@skeletonlabs/skeleton/themes/hamlindigo?raw'; +import legacy from '@skeletonlabs/skeleton/themes/legacy?raw'; +import mint from '@skeletonlabs/skeleton/themes/mint?raw'; +import modern from '@skeletonlabs/skeleton/themes/modern?raw'; +import mona from '@skeletonlabs/skeleton/themes/mona?raw'; +import nosh from '@skeletonlabs/skeleton/themes/nosh?raw'; +import nouveau from '@skeletonlabs/skeleton/themes/nouveau?raw'; +import pine from '@skeletonlabs/skeleton/themes/pine?raw'; +import reign from '@skeletonlabs/skeleton/themes/reign?raw'; +import rocket from '@skeletonlabs/skeleton/themes/rocket?raw'; +import rose from '@skeletonlabs/skeleton/themes/rose?raw'; +import sahara from '@skeletonlabs/skeleton/themes/sahara?raw'; +import seafoam from '@skeletonlabs/skeleton/themes/seafoam?raw'; +import terminus from '@skeletonlabs/skeleton/themes/terminus?raw'; +import vintage from '@skeletonlabs/skeleton/themes/vintage?raw'; +import vox from '@skeletonlabs/skeleton/themes/vox?raw'; +import wintry from '@skeletonlabs/skeleton/themes/wintry?raw'; + +export interface Theme { + name: string; + css: string; + emoji: string; +} + +export const themes: Theme[] = [ + { + name: 'catppuccin', + css: catppuccin, + emoji: '🐈', + }, + { + name: 'cerberus', + css: cerberus, + emoji: '🐺', + }, + { + name: 'concord', + css: concord, + emoji: '🤖', + }, + { + name: 'crimson', + css: crimson, + emoji: '🔴', + }, + { + name: 'fennec', + css: fennec, + emoji: '🦊', + }, + { + name: 'hamlindigo', + css: hamlindigo, + emoji: '👔', + }, + { + name: 'legacy', + css: legacy, + emoji: '💀', + }, + { + name: 'mint', + css: mint, + emoji: '🍃', + }, + { + name: 'modern', + css: modern, + emoji: '🌸', + }, + { + name: 'mona', + css: mona, + emoji: '🐙', + }, + { + name: 'nosh', + css: nosh, + emoji: '🥙', + }, + { + name: 'nouveau', + css: nouveau, + emoji: '👑', + }, + { + name: 'pine', + css: pine, + emoji: '🌲', + }, + { + name: 'reign', + css: reign, + emoji: '📒', + }, + { + name: 'rocket', + css: rocket, + emoji: '🚀', + }, + { + name: 'rose', + css: rose, + emoji: '🌷', + }, + { + name: 'sahara', + css: sahara, + emoji: '🏜️', + }, + { + name: 'seafoam', + css: seafoam, + emoji: '🧜‍♀️', + }, + { + name: 'terminus', + css: terminus, + emoji: '🌑', + }, + { + name: 'vintage', + css: vintage, + emoji: '📺', + }, + { + name: 'vox', + css: vox, + emoji: '👾', + }, + { + name: 'wintry', + css: wintry, + emoji: '🌨️', + }, +]; diff --git a/packages/skeleton-common/tsconfig.json b/packages/skeleton-common/tsconfig.json new file mode 100644 index 0000000000..9830951a7f --- /dev/null +++ b/packages/skeleton-common/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "skipLibCheck": true, + "target": "es2022", + "allowJs": true, + "resolveJsonModule": true, + "moduleDetection": "force", + "isolatedModules": true, + "verbatimModuleSyntax": true, + "strict": true, + "noUncheckedIndexedAccess": true, + "noImplicitOverride": true, + "declaration": true, + "declarationMap": true, + "module": "preserve", + "noEmit": true, + "lib": ["es2022", "dom", "dom.iterable"] + }, + "include": ["src"] +} diff --git a/packages/skeleton-common/tsdown.config.ts b/packages/skeleton-common/tsdown.config.ts new file mode 100644 index 0000000000..28ea4caf9d --- /dev/null +++ b/packages/skeleton-common/tsdown.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from 'tsdown'; +import Macros from 'unplugin-macros/rolldown'; +import Raw from 'unplugin-raw/rolldown'; + +export default defineConfig({ + logLevel: 'silent', + unbundle: true, + copy: ['src/index.css'], + plugins: [Raw(), Macros()], +}); diff --git a/packages/skeleton-react/CHANGELOG.md b/packages/skeleton-react/CHANGELOG.md new file mode 100644 index 0000000000..fc5dd3ef43 --- /dev/null +++ b/packages/skeleton-react/CHANGELOG.md @@ -0,0 +1,490 @@ +# @skeletonlabs/skeleton-react + +## 2.0.0-next.14 + +### Minor Changes + +- feat: portal ([#3812](https://github.com/skeletonlabs/skeleton/pull/3812)) + +## 2.0.0-next.13 + +### Patch Changes + +- chore: update readme ([#3805](https://github.com/skeletonlabs/skeleton/pull/3805)) + +- Updated dependencies []: + - @skeletonlabs/skeleton-common@1.0.0-next.11 + +## 2.0.0-next.12 + +### Patch Changes + +- fix: override skeleton specific attributes ([#3803](https://github.com/skeletonlabs/skeleton/pull/3803)) + +## 2.0.0-next.11 + +### Minor Changes + +- feat: combobox ([#3702](https://github.com/skeletonlabs/skeleton/pull/3702)) + +- feat: slider ([#3771](https://github.com/skeletonlabs/skeleton/pull/3771)) + +### Patch Changes + +- Updated dependencies [[`09bf2b2`](https://github.com/skeletonlabs/skeleton/commit/09bf2b20dbbfed53af7c31281da21cc5790d87c9), [`fc27770`](https://github.com/skeletonlabs/skeleton/commit/fc27770b37fc2b224444b220020c2141f9fe2da0)]: + - @skeletonlabs/skeleton-common@1.0.0-next.11 + +## 2.0.0-next.10 + +### Patch Changes + +- chore: trusted publishing ([#3792](https://github.com/skeletonlabs/skeleton/pull/3792)) + +- Updated dependencies [[`6e68a49`](https://github.com/skeletonlabs/skeleton/commit/6e68a493da7aaf9b416b0e3c5d4b2570cf0039c4)]: + - @skeletonlabs/skeleton-common@1.0.0-next.10 + +## 2.0.0-next.9 + +### Minor Changes + +- feat: app-bar ([#3783](https://github.com/skeletonlabs/skeleton/pull/3783)) + +### Patch Changes + +- Updated dependencies [[`24526af`](https://github.com/skeletonlabs/skeleton/commit/24526affc00c70b08af0ba1299c82ba64ec9d58a)]: + - @skeletonlabs/skeleton-common@1.0.0-next.9 + +## 2.0.0-next.8 + +### Minor Changes + +- feat: segmented control ([#3758](https://github.com/skeletonlabs/skeleton/pull/3758)) + +### Patch Changes + +- Updated dependencies [[`aa6392e`](https://github.com/skeletonlabs/skeleton/commit/aa6392efb829ea01b1466b5c6a623adf05f96f4e)]: + - @skeletonlabs/skeleton-common@1.0.0-next.8 + +## 2.0.0-next.7 + +### Minor Changes + +- feat: dialog ([#3700](https://github.com/skeletonlabs/skeleton/pull/3700)) + +### Patch Changes + +- Updated dependencies [[`890c826`](https://github.com/skeletonlabs/skeleton/commit/890c8260f4d561a99e07440cfce3ef7a9b88e0ed)]: + - @skeletonlabs/skeleton-common@1.0.0-next.7 + +## 2.0.0-next.6 + +### Minor Changes + +- feat: tooltip ([#3697](https://github.com/skeletonlabs/skeleton/pull/3697)) + +- feat: tags input ([#3740](https://github.com/skeletonlabs/skeleton/pull/3740)) + +- feat: popover ([#3696](https://github.com/skeletonlabs/skeleton/pull/3696)) + +### Patch Changes + +- Updated dependencies [[`997c17f`](https://github.com/skeletonlabs/skeleton/commit/997c17ff6dd29328753f9381154e80853792ec3e), [`19bd792`](https://github.com/skeletonlabs/skeleton/commit/19bd79224a599cc05df7122b9279d88736c8e4c4), [`247fe15`](https://github.com/skeletonlabs/skeleton/commit/247fe154b55ec86b37b12b10771ba0403b488053)]: + - @skeletonlabs/skeleton-common@1.0.0-next.6 + +## 2.0.0-next.5 + +### Minor Changes + +- feat: file-upload ([#3693](https://github.com/skeletonlabs/skeleton/pull/3693)) + +### Patch Changes + +- Updated dependencies [[`1d8a151`](https://github.com/skeletonlabs/skeleton/commit/1d8a15137c79c293674fd70794f69a2fe6cd18a4)]: + - @skeletonlabs/skeleton-common@1.0.0-next.5 + +## 2.0.0-next.4 + +### Minor Changes + +- feat: toast ([#3704](https://github.com/skeletonlabs/skeleton/pull/3704)) + +- feat: switch ([#3695](https://github.com/skeletonlabs/skeleton/pull/3695)) + +### Patch Changes + +- Updated dependencies [[`dff68d8`](https://github.com/skeletonlabs/skeleton/commit/dff68d8f824ddb1aef820e75ab3bdebe06546e07), [`3776570`](https://github.com/skeletonlabs/skeleton/commit/3776570c21d060a653bdde8a164e95e8aecdbaab)]: + - @skeletonlabs/skeleton-common@1.0.0-next.4 + +## 2.0.0-next.3 + +### Minor Changes + +- feat: progress-linear ([#3694](https://github.com/skeletonlabs/skeleton/pull/3694)) + +### Patch Changes + +- Updated dependencies [[`a9c651a`](https://github.com/skeletonlabs/skeleton/commit/a9c651adac035dc4613f0118bca05f0cfb0b22b5)]: + - @skeletonlabs/skeleton-common@1.0.0-next.3 + +## 2.0.0-next.2 + +### Minor Changes + +- feat: tabs ([#3679](https://github.com/skeletonlabs/skeleton/pull/3679)) + +- feat: rating-group ([#3681](https://github.com/skeletonlabs/skeleton/pull/3681)) + +### Patch Changes + +- Updated dependencies [[`f272f42`](https://github.com/skeletonlabs/skeleton/commit/f272f42ae2a92648d275618089a5c41aaf4efe13), [`5d517a8`](https://github.com/skeletonlabs/skeleton/commit/5d517a840ac27bea4d5fd2fd2b150abf779075b0)]: + - @skeletonlabs/skeleton-common@1.0.0-next.2 + +## 2.0.0-next.1 + +### Major Changes + +- feat: v4 preperation ([#3662](https://github.com/skeletonlabs/skeleton/pull/3662)) + +### Patch Changes + +- Updated dependencies [[`770431d`](https://github.com/skeletonlabs/skeleton/commit/770431da15a354c66ef69cc0df5049e893147e2f)]: + - @skeletonlabs/skeleton-common@1.0.0-next.1 + +## 1.5.0-next.0 + +### Minor Changes + +- feat: Use classes inside `@skeletonlabs/skeleton-common` to dedupe tailwind classes ([#3656](https://github.com/skeletonlabs/skeleton/pull/3656)) + +### Patch Changes + +- Updated dependencies [[`d65abd7`](https://github.com/skeletonlabs/skeleton/commit/d65abd7c5bd9e694aeeaa3b54310971e63e8de50)]: + - @skeletonlabs/skeleton-common@0.0.1-next.0 + +## 1.4.0 + +### Minor Changes + +- feat: add overhauled components ([#3491](https://github.com/skeletonlabs/skeleton/pull/3491)) + +## 1.3.0 + +### Minor Changes + +- feature: Added `aria-label` and `title` props for icon buttons implemented within the Svelte and React Toast components. ([#3619](https://github.com/skeletonlabs/skeleton/pull/3619)) + +- feature: Avatar compnonent now supports additional `initials` configuration ([#3627](https://github.com/skeletonlabs/skeleton/pull/3627)) + +## 1.2.4 + +### Patch Changes + +- chore: Update zag dependencies ([#3612](https://github.com/skeletonlabs/skeleton/pull/3612)) + +## 1.2.3 + +### Patch Changes + +- chore: Remove aria role tooltip from AppBar component ([#3590](https://github.com/skeletonlabs/skeleton/pull/3590)) + +## 1.2.2 + +### Patch Changes + +- Segment/Pagination: move default border padding to padding prop ([#3554](https://github.com/skeletonlabs/skeleton/pull/3554)) + +## 1.2.1 + +### Patch Changes + +- fix: respect closable toast option ([#3507](https://github.com/skeletonlabs/skeleton/pull/3507)) + +## 1.2.0 + +### Minor Changes + +- feat: add hidden input for TagsInput ([#3487](https://github.com/skeletonlabs/skeleton/pull/3487)) + +## 1.1.0 + +### Minor Changes + +- feat: Removed Toast integration in favor of first-party Toast component. ([#3440](https://github.com/skeletonlabs/skeleton/pull/3440)) + +### Patch Changes + +- fix: Update Zag to 1.7.0 ([#3476](https://github.com/skeletonlabs/skeleton/pull/3476)) + +## 1.0.0 + +### Minor Changes + +- feat: Navigation - manually handle `selected` state of NavTile ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- Feature: Added the Switch component. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- - chore: Svelte Accordion and Nav components now use dot notation syntax ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + - Tab components overhauled to bring consistency between Svelte and React implementations + - Tabs.Item component removed + - Tabs.Panels (plural) component added + +- feature: Added the Navigation Rail, Bar, and Tile components ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- chore: Migrated Nav, Segment Control, and Switch component APIs to match new conventions ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- feature: Improvements to the File Upload component ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- feature: Added Segment Control component ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- feature: Added the ProgressRing component ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- feature: Added the FileUpload component ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- feature: Added Tags Input component ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- feature: Added the Slider component ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- chore: Updated to the latest dependencies ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- feature: Added the Ratings component ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- All Skeleton components have been updated to integrate Zag.js. This contains a number of breaking component API changes. Updates all documentation. And includes new CSS animations in the Tailwind plugin. ([More Information](https://github.com/skeletonlabs/skeleton/discussions/2784)) ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- feat: Zag 1.0 ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- feature: Added the Pagination component ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +### Patch Changes + +- bugfix: Reinstate Pagination `count` prop. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- bugfix: Minor bugfix to progressRing indeterminate class logic ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- bugfix: Resolved Pagination alternative mode page count issue ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- chore: Standarize use of Use Client directive in all components. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- chore: Updated peer dependencies to support React 19 ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- feature: Add `showFirstLastButtons` prop to Pagination to enable toggling first and last buttons. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- feature: Add option to set `aria-labelledby` for Segment component ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- chore: Modified default styles based on theme gen improvements ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- chore: Improved Ratings component default half star SVG ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- bugfix: progress ring safari 100% ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- chore: the React `<Nav>` component renamed `<Navigation>` to be uniform with other frameworks ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- chore: Moved Prettier and ESLint to repo root, updated formatting, and rectified linting issues ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- bugfix: Rename `TagsInput` inconsistent prop names: `inputEdit` or `tagEdit` to `tagEditInput` ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- chore: Remove `reactCompose` utility, added `$lib` alias path. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- chore: Move `react` and `react-dom` to `peerDependencies` ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- Resolved regressions in the following test cases: progress ring, ratings, segment control, switch, and tabs ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- chore: Remove extra height class from NavBar ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- bugfix: Make use of `useId` on Navigation component to set default `id` for Tiles if user had not defined it explicitly ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- chore: ProgressRing component no longer has a label by default, but can be enabled with `showLabel` prop. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- Resolved regressions in the following test cases: accordion, appbar, avatar, navigation, and progress components ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- chore: Improved focus states for Switch and Slider components. Minor style improvements to the Ratings label text. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- chore: Removed `filter` prop and moved `style` prop to parent element ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- Implement `style` prop for Avatar component. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- bugfix: empty padding when switch has no children ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- chore: Improved global and per component focus state styles ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- chore: Style improvements for Buttons, Badges, Chips, and Form elements ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- bugfix: Set unique `key` properly for React's Rating component ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- chore: Added `@skeletonlabs/skeleton` as a peer-dependency ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- Updated dependencies [[`fafffd7`](https://github.com/skeletonlabs/skeleton/commit/fafffd7bfd58554218ea823fe7b585e092a56c00), [`fafffd7`](https://github.com/skeletonlabs/skeleton/commit/fafffd7bfd58554218ea823fe7b585e092a56c00), [`fafffd7`](https://github.com/skeletonlabs/skeleton/commit/fafffd7bfd58554218ea823fe7b585e092a56c00), [`fafffd7`](https://github.com/skeletonlabs/skeleton/commit/fafffd7bfd58554218ea823fe7b585e092a56c00), [`fafffd7`](https://github.com/skeletonlabs/skeleton/commit/fafffd7bfd58554218ea823fe7b585e092a56c00), [`fafffd7`](https://github.com/skeletonlabs/skeleton/commit/fafffd7bfd58554218ea823fe7b585e092a56c00), [`fafffd7`](https://github.com/skeletonlabs/skeleton/commit/fafffd7bfd58554218ea823fe7b585e092a56c00), [`fafffd7`](https://github.com/skeletonlabs/skeleton/commit/fafffd7bfd58554218ea823fe7b585e092a56c00), [`fafffd7`](https://github.com/skeletonlabs/skeleton/commit/fafffd7bfd58554218ea823fe7b585e092a56c00), [`fafffd7`](https://github.com/skeletonlabs/skeleton/commit/fafffd7bfd58554218ea823fe7b585e092a56c00), [`fafffd7`](https://github.com/skeletonlabs/skeleton/commit/fafffd7bfd58554218ea823fe7b585e092a56c00), [`fafffd7`](https://github.com/skeletonlabs/skeleton/commit/fafffd7bfd58554218ea823fe7b585e092a56c00), [`fafffd7`](https://github.com/skeletonlabs/skeleton/commit/fafffd7bfd58554218ea823fe7b585e092a56c00), [`fafffd7`](https://github.com/skeletonlabs/skeleton/commit/fafffd7bfd58554218ea823fe7b585e092a56c00), [`fafffd7`](https://github.com/skeletonlabs/skeleton/commit/fafffd7bfd58554218ea823fe7b585e092a56c00), [`fafffd7`](https://github.com/skeletonlabs/skeleton/commit/fafffd7bfd58554218ea823fe7b585e092a56c00)]: + - @skeletonlabs/skeleton@3.0.0 + +## 1.0.0-next.17 + +### Patch Changes + +- bugfix: progress ring safari 100% ([#3360](https://github.com/skeletonlabs/skeleton/pull/3360)) + +- bugfix: Rename `TagsInput` inconsistent prop names: `inputEdit` or `tagEdit` to `tagEditInput` ([#3298](https://github.com/skeletonlabs/skeleton/pull/3298)) + +- chore: Removed `filter` prop and moved `style` prop to parent element ([#3344](https://github.com/skeletonlabs/skeleton/pull/3344)) + +- chore: Style improvements for Buttons, Badges, Chips, and Form elements ([#3345](https://github.com/skeletonlabs/skeleton/pull/3345)) + +- chore: Added `@skeletonlabs/skeleton` as a peer-dependency ([#3351](https://github.com/skeletonlabs/skeleton/pull/3351)) + +- Updated dependencies [[`73a4e9f`](https://github.com/skeletonlabs/skeleton/commit/73a4e9f69b47f5684162adcaada6d460a5b73ca7), [`f427d83`](https://github.com/skeletonlabs/skeleton/commit/f427d83302826a238c43439fc67be4837d76b846), [`3af054d`](https://github.com/skeletonlabs/skeleton/commit/3af054dfb9f88b28694c2bf7630a3a40449a844c)]: + - @skeletonlabs/skeleton@3.0.0-next.13 + +## 1.0.0-next.16 + +### Minor Changes + +- feat: Zag 1.0 ([#3257](https://github.com/skeletonlabs/skeleton/pull/3257)) + +## 1.0.0-next.15 + +### Minor Changes + +- feat: Navigation - manually handle `selected` state of NavTile ([#3228](https://github.com/skeletonlabs/skeleton/pull/3228)) + +## 1.0.0-next.14 + +### Patch Changes + +- bugfix: Make use of `useId` on Navigation component to set default `id` for Tiles if user had not defined it explicitly ([#3097](https://github.com/skeletonlabs/skeleton/pull/3097)) + +- Implement `style` prop for Avatar component. ([#3117](https://github.com/skeletonlabs/skeleton/pull/3117)) + +## 1.0.0-next.13 + +### Patch Changes + +- chore: Remove extra height class from NavBar ([#3074](https://github.com/skeletonlabs/skeleton/pull/3074)) + +## 1.0.0-next.12 + +### Patch Changes + +- bugfix: Reinstate Pagination `count` prop. ([#3026](https://github.com/skeletonlabs/skeleton/pull/3026)) + +- chore: Updated peer dependencies to support React 19 ([#3038](https://github.com/skeletonlabs/skeleton/pull/3038)) + +- feature: Add option to set `aria-labelledby` for Segment component ([#3034](https://github.com/skeletonlabs/skeleton/pull/3034)) + +- chore: Improved Ratings component default half star SVG ([#3048](https://github.com/skeletonlabs/skeleton/pull/3048)) + +- chore: Improved focus states for Switch and Slider components. Minor style improvements to the Ratings label text. ([#3045](https://github.com/skeletonlabs/skeleton/pull/3045)) + +- bugfix: empty padding when switch has no children ([#3024](https://github.com/skeletonlabs/skeleton/pull/3024)) + +- bugfix: Set unique `key` properly for React's Rating component ([#3043](https://github.com/skeletonlabs/skeleton/pull/3043)) + +## 1.0.0-next.11 + +### Patch Changes + +- feature: Add `showFirstLastButtons` prop to Pagination to enable toggling first and last buttons. ([#3007](https://github.com/skeletonlabs/skeleton/pull/3007)) + +- chore: the React `<Nav>` component renamed `<Navigation>` to be uniform with other frameworks ([#3004](https://github.com/skeletonlabs/skeleton/pull/3004)) + +- chore: ProgressRing component no longer has a label by default, but can be enabled with `showLabel` prop. ([#2996](https://github.com/skeletonlabs/skeleton/pull/2996)) + +## 1.0.0-next.10 + +### Patch Changes + +- bugfix: Minor bugfix to progressRing indeterminate class logic ([#2968](https://github.com/skeletonlabs/skeleton/pull/2968)) + +- bugfix: Resolved Pagination alternative mode page count issue ([#2956](https://github.com/skeletonlabs/skeleton/pull/2956)) + +## 1.0.0-next.9 + +### Minor Changes + +- chore: Updated to the latest dependencies ([#2892](https://github.com/skeletonlabs/skeleton/pull/2892)) + +### Patch Changes + +- chore: Standardize use of Use Client directive in all components. ([#2927](https://github.com/skeletonlabs/skeleton/pull/2927)) + +## 1.0.0-next.8 + +### Patch Changes + +- chore: Modified default styles based on theme gen improvements ([#2852](https://github.com/skeletonlabs/skeleton/pull/2852)) + +## 1.0.0-next.7 + +### Minor Changes + +- feature: Improvements to the File Upload component ([#2843](https://github.com/skeletonlabs/skeleton/pull/2843)) + +- feature: Added Tags Input component ([#2828](https://github.com/skeletonlabs/skeleton/pull/2828)) + +- feature: Added the Pagination component ([#2841](https://github.com/skeletonlabs/skeleton/pull/2841)) + +## 1.0.0-next.6 + +### Minor Changes + +- feature: Added the FileUpload component ([#2838](https://github.com/skeletonlabs/skeleton/pull/2838)) + +- Added the Slider component ([#2834](https://github.com/skeletonlabs/skeleton/pull/2834)) + +### Patch Changes + +- chore: Move `react` and `react-dom` to `peerDependencies` ([#2830](https://github.com/skeletonlabs/skeleton/pull/2830)) + +- chore: Improved global and per component focus state styles ([#2825](https://github.com/skeletonlabs/skeleton/pull/2825)) + +## 1.0.0-next.5 + +### Patch Changes + +- Resolved regressions in the following test cases: progress ring, ratings, segment control, switch, and tabs ([#2814](https://github.com/skeletonlabs/skeleton/pull/2814)) + +- Resolved regressions in the following test cases: accordion, appbar, avatar, navigation, and progress components ([#2813](https://github.com/skeletonlabs/skeleton/pull/2813)) + +## 1.0.0-next.4 + +### Minor Changes + +- All Skeleton components have been updated to integrate Zag.js. This contains a number of breaking component API changes. Updates all documentation. And includes new CSS animations in the Tailwind plugin. ([More Information](https://github.com/skeletonlabs/skeleton/discussions/2784)) ([#2778](https://github.com/skeletonlabs/skeleton/pull/2778)) + +## 1.0.0-next.3 + +### Minor Changes + +- - chore: Svelte Accordion and Nav components now use dot notation syntax ([#2748](https://github.com/skeletonlabs/skeleton/pull/2748)) + - Tab components overhauled to bring consistency between Svelte and React implementations + - Tabs.Item component removed + - Tabs.Panels (plural) component added + +- chore: Migrated Nav, Segment Control, and Switch component APIs to match new conventions ([#2758](https://github.com/skeletonlabs/skeleton/pull/2758)) + +- feature: Added Segment Control component ([#2744](https://github.com/skeletonlabs/skeleton/pull/2744)) + +### Patch Changes + +- Chore: Moved Prettier and ESLint to repo root, updated formatting, and rectified linting issues ([#2723](https://github.com/skeletonlabs/skeleton/pull/2723)) + +- chore: Remove `reactCompose` utility, added `$lib` alias path. ([#2734](https://github.com/skeletonlabs/skeleton/pull/2734)) + +## 1.0.0-next.2 + +### Minor Changes + +- feature: Added the Navigation Rail, Bar, and Tile components ([#2721](https://github.com/skeletonlabs/skeleton/pull/2721)) + +- feature: Added the ProgressRing component ([#2709](https://github.com/skeletonlabs/skeleton/pull/2709)) + +- feature: Added the Ratings component ([#2721](https://github.com/skeletonlabs/skeleton/pull/2721)) + +## 1.0.0-next.1 + +### Minor Changes + +- Feature: Added the Switch component. ([#2698](https://github.com/skeletonlabs/skeleton/pull/2698)) + +## 1.0.0-next.0 + +### Major Changes + +- Enter pre-release mode ([#2668](https://github.com/skeletonlabs/skeleton/pull/2668)) diff --git a/packages/skeleton-react/README.md b/packages/skeleton-react/README.md new file mode 100644 index 0000000000..9072b33182 --- /dev/null +++ b/packages/skeleton-react/README.md @@ -0,0 +1,11 @@ +# Skeleton React + +## Installation + +```bash +pnpm add @skeletonlabs/skeleton-react +``` + +## Documentation + +Explore the full documentation at [skeleton.dev](https://skeleton.dev/). diff --git a/packages/skeleton-react/package.json b/packages/skeleton-react/package.json new file mode 100644 index 0000000000..074a6c6efb --- /dev/null +++ b/packages/skeleton-react/package.json @@ -0,0 +1,69 @@ +{ + "name": "@skeletonlabs/skeleton-react", + "version": "2.0.0-next.14", + "description": "The React package for Skeleton.", + "author": "endigo9740 <chris@skeletonlabs.dev>", + "repository": { + "type": "git", + "url": "git+https://github.com/skeletonlabs/skeleton.git", + "directory": "packages/skeleton-react" + }, + "scripts": { + "dev": "tsdown --watch", + "build": "tsdown", + "test": "vitest run", + "check": "tsc", + "sync": "pnpm build" + }, + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js", + "style": "./dist/index.css" + } + }, + "files": [ + "dist" + ], + "sideEffects": false, + "dependencies": { + "@skeletonlabs/skeleton-common": "workspace:*", + "@zag-js/accordion": "catalog:", + "@zag-js/avatar": "catalog:", + "@zag-js/collection": "catalog:", + "@zag-js/combobox": "catalog:", + "@zag-js/dialog": "catalog:", + "@zag-js/file-upload": "catalog:", + "@zag-js/popover": "catalog:", + "@zag-js/progress": "catalog:", + "@zag-js/radio-group": "catalog:", + "@zag-js/rating-group": "catalog:", + "@zag-js/react": "catalog:", + "@zag-js/slider": "catalog:", + "@zag-js/switch": "catalog:", + "@zag-js/tabs": "catalog:", + "@zag-js/tags-input": "catalog:", + "@zag-js/toast": "catalog:", + "@zag-js/tooltip": "catalog:" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "devDependencies": { + "@testing-library/jest-dom": "catalog:", + "@testing-library/react": "catalog:", + "@types/react": "catalog:", + "@types/react-dom": "catalog:", + "@vitejs/plugin-react": "catalog:", + "jsdom": "catalog:", + "react": "catalog:", + "react-dom": "catalog:", + "tsdown": "catalog:", + "typescript": "catalog:", + "vite": "catalog:", + "vitest": "catalog:" + }, + "license": "MIT", + "type": "module" +} diff --git a/packages/skeleton-react/src/components/accordion/anatomy/item-content.tsx b/packages/skeleton-react/src/components/accordion/anatomy/item-content.tsx new file mode 100644 index 0000000000..dace8aa43b --- /dev/null +++ b/packages/skeleton-react/src/components/accordion/anatomy/item-content.tsx @@ -0,0 +1,27 @@ +import { ItemContext } from '../modules/item-context.js'; +import { RootContext } from '../modules/root-context.js'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesAccordion } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; +import type { PropsWithChildren } from 'react'; + +export interface AccordionItemContentProps extends PropsWithChildren, PropsWithElement<'div'>, HTMLAttributes<'div'> {} + +export default function ItemContent(props: AccordionItemContentProps) { + const accordion = use(RootContext); + const itemProps = use(ItemContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + accordion.getItemContentProps(itemProps), + { + className: classesAccordion.content, + }, + rest, + ); + + return element ? element(attributes) : <div {...attributes}>{children}</div>; +} diff --git a/packages/skeleton-react/src/components/accordion/anatomy/item-heading.tsx b/packages/skeleton-react/src/components/accordion/anatomy/item-heading.tsx new file mode 100644 index 0000000000..4c27576635 --- /dev/null +++ b/packages/skeleton-react/src/components/accordion/anatomy/item-heading.tsx @@ -0,0 +1,29 @@ +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesAccordion } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import type { JSX, PropsWithChildren } from 'react'; + +export interface AccordionItemHeadingProps extends PropsWithChildren, PropsWithElement<'h3'>, HTMLAttributes<'h3'> { + /** + * The level of the heading. + * + * @default 3 + */ + level?: 1 | 2 | 3 | 4 | 5 | 6; +} + +export default function ItemHeading(props: AccordionItemHeadingProps) { + const { level = 3, element, children, ...rest } = props; + + const Tag: keyof JSX.IntrinsicElements = `h${level}`; + + const attributes = mergeProps( + { + className: classesAccordion.heading, + }, + rest, + ); + + return element ? element(attributes) : <Tag {...attributes}>{children}</Tag>; +} diff --git a/packages/skeleton-react/src/components/accordion/anatomy/item-indicator.tsx b/packages/skeleton-react/src/components/accordion/anatomy/item-indicator.tsx new file mode 100644 index 0000000000..8abed57e2f --- /dev/null +++ b/packages/skeleton-react/src/components/accordion/anatomy/item-indicator.tsx @@ -0,0 +1,27 @@ +import { ItemContext } from '../modules/item-context'; +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesAccordion } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; +import type { PropsWithChildren } from 'react'; + +export interface AccordionItemIndicatorProps extends PropsWithChildren, PropsWithElement<'div'>, HTMLAttributes<'div'> {} + +export default function ItemIndicator(props: AccordionItemIndicatorProps) { + const accordion = use(RootContext); + const itemProps = use(ItemContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + accordion.getItemIndicatorProps(itemProps), + { + className: classesAccordion.indicator, + }, + rest, + ); + + return element ? element(attributes) : <div {...attributes}>{children}</div>; +} diff --git a/packages/skeleton-react/src/components/accordion/anatomy/item-trigger.tsx b/packages/skeleton-react/src/components/accordion/anatomy/item-trigger.tsx new file mode 100644 index 0000000000..28f5051845 --- /dev/null +++ b/packages/skeleton-react/src/components/accordion/anatomy/item-trigger.tsx @@ -0,0 +1,27 @@ +import { ItemContext } from '../modules/item-context'; +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesAccordion } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; +import type { PropsWithChildren } from 'react'; + +export interface AccordionItemTriggerProps extends PropsWithChildren, PropsWithElement<'button'>, HTMLAttributes<'button'> {} + +export default function ItemTrigger(props: AccordionItemTriggerProps) { + const accordion = use(RootContext); + const itemProps = use(ItemContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + accordion.getItemTriggerProps(itemProps), + { + className: classesAccordion.trigger, + }, + rest, + ); + + return element ? element(attributes) : <button {...attributes}>{children}</button>; +} diff --git a/packages/skeleton-react/src/components/accordion/anatomy/item.tsx b/packages/skeleton-react/src/components/accordion/anatomy/item.tsx new file mode 100644 index 0000000000..c6dd0c86eb --- /dev/null +++ b/packages/skeleton-react/src/components/accordion/anatomy/item.tsx @@ -0,0 +1,31 @@ +import { ItemContext } from '../modules/item-context'; +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesAccordion } from '@skeletonlabs/skeleton-common'; +import { splitItemProps } from '@zag-js/accordion'; +import type { ItemProps } from '@zag-js/accordion'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; +import type { PropsWithChildren } from 'react'; + +export interface AccordionItemProps extends ItemProps, PropsWithChildren, PropsWithElement<'div'>, HTMLAttributes<'div'> {} + +export default function Item(props: AccordionItemProps) { + const accordion = use(RootContext); + + const [itemProps, componentProps] = splitItemProps(props); + const { element, children, ...rest } = componentProps; + + const attributes = mergeProps( + accordion.getItemProps(itemProps), + { + className: classesAccordion.item, + }, + rest, + ); + + return ( + <ItemContext.Provider value={itemProps}>{element ? element(attributes) : <div {...attributes}>{children}</div>}</ItemContext.Provider> + ); +} diff --git a/packages/skeleton-react/src/components/accordion/anatomy/root-context.tsx b/packages/skeleton-react/src/components/accordion/anatomy/root-context.tsx new file mode 100644 index 0000000000..37496a1a25 --- /dev/null +++ b/packages/skeleton-react/src/components/accordion/anatomy/root-context.tsx @@ -0,0 +1,16 @@ +import type { useAccordion } from '../modules/provider'; +import { RootContext as RootContext_ } from '../modules/root-context'; +import { use } from 'react'; +import type { ReactNode } from 'react'; + +export interface AccordionRootContextProps { + children: (accordion: ReturnType<typeof useAccordion>) => ReactNode; +} + +export default function RootContext(props: AccordionRootContextProps) { + const accordion = use(RootContext_); + + const { children } = props; + + return children(accordion); +} diff --git a/packages/skeleton-react/src/components/accordion/anatomy/root-provider.tsx b/packages/skeleton-react/src/components/accordion/anatomy/root-provider.tsx new file mode 100644 index 0000000000..cce04e768b --- /dev/null +++ b/packages/skeleton-react/src/components/accordion/anatomy/root-provider.tsx @@ -0,0 +1,26 @@ +import type { useAccordion } from '../modules/provider'; +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesAccordion } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; + +export interface AccordionRootProviderProps extends PropsWithElement<'div'>, HTMLAttributes<'div', 'id' | 'dir' | 'defaultValue'> { + value: ReturnType<typeof useAccordion>; +} + +export default function RootProvider(props: AccordionRootProviderProps) { + const { element, children, value: accordion, ...rest } = props; + + const attributes = mergeProps( + accordion.getRootProps(), + { + className: classesAccordion.root, + }, + rest, + ); + + return ( + <RootContext.Provider value={accordion}>{element ? element(attributes) : <div {...attributes}>{children}</div>}</RootContext.Provider> + ); +} diff --git a/packages/skeleton-react/src/components/accordion/anatomy/root.tsx b/packages/skeleton-react/src/components/accordion/anatomy/root.tsx new file mode 100644 index 0000000000..a482c01d6a --- /dev/null +++ b/packages/skeleton-react/src/components/accordion/anatomy/root.tsx @@ -0,0 +1,32 @@ +import { useAccordion } from '../modules/provider'; +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesAccordion } from '@skeletonlabs/skeleton-common'; +import { splitProps } from '@zag-js/accordion'; +import type { Props } from '@zag-js/accordion'; +import { mergeProps } from '@zag-js/react'; + +export interface AccordionRootProps + extends Omit<Props, 'id'>, + PropsWithElement<'div'>, + HTMLAttributes<'div', 'id' | 'dir' | 'defaultValue'> {} + +export default function Root(props: AccordionRootProps) { + const [accordionProps, componentProps] = splitProps(props); + const { element, children, ...rest } = componentProps; + + const accordion = useAccordion(accordionProps); + + const attributes = mergeProps( + accordion.getRootProps(), + { + className: classesAccordion.root, + }, + rest, + ); + + return ( + <RootContext.Provider value={accordion}>{element ? element(attributes) : <div {...attributes}>{children}</div>}</RootContext.Provider> + ); +} diff --git a/packages/skeleton-react/src/components/accordion/index.ts b/packages/skeleton-react/src/components/accordion/index.ts new file mode 100644 index 0000000000..3099f4818e --- /dev/null +++ b/packages/skeleton-react/src/components/accordion/index.ts @@ -0,0 +1,10 @@ +export type { AccordionItemContentProps } from './anatomy/item-content'; +export type { AccordionItemHeadingProps } from './anatomy/item-heading'; +export type { AccordionItemIndicatorProps } from './anatomy/item-indicator'; +export type { AccordionItemProps } from './anatomy/item'; +export type { AccordionRootProps } from './anatomy/root'; +export type { AccordionRootContextProps } from './anatomy/root-context'; +export type { AccordionRootProviderProps } from './anatomy/root-provider'; +export type { AccordionItemTriggerProps } from './anatomy/item-trigger'; +export { Accordion } from './modules/anatomy'; +export { useAccordion } from './modules/provider'; diff --git a/packages/skeleton-react/src/components/accordion/modules/anatomy.ts b/packages/skeleton-react/src/components/accordion/modules/anatomy.ts new file mode 100644 index 0000000000..e4af2ecb40 --- /dev/null +++ b/packages/skeleton-react/src/components/accordion/modules/anatomy.ts @@ -0,0 +1,18 @@ +import Item from '../anatomy/item'; +import ItemContent from '../anatomy/item-content'; +import ItemHeading from '../anatomy/item-heading'; +import ItemIndicator from '../anatomy/item-indicator'; +import ItemTrigger from '../anatomy/item-trigger'; +import Root from '../anatomy/root'; +import RootContext from '../anatomy/root-context'; +import RootProvider from '../anatomy/root-provider'; + +export const Accordion = Object.assign(Root, { + Provider: RootProvider, + Context: RootContext, + Item: Item, + ItemHeading: ItemHeading, + ItemTrigger: ItemTrigger, + ItemIndicator: ItemIndicator, + ItemContent: ItemContent, +}); diff --git a/packages/skeleton-react/src/components/accordion/modules/item-context.ts b/packages/skeleton-react/src/components/accordion/modules/item-context.ts new file mode 100644 index 0000000000..7c58bb7270 --- /dev/null +++ b/packages/skeleton-react/src/components/accordion/modules/item-context.ts @@ -0,0 +1,4 @@ +import { createContext } from '@/internal/create-context'; +import type { ItemProps } from '@zag-js/accordion'; + +export const ItemContext = createContext<ItemProps>(); diff --git a/packages/skeleton-react/src/components/accordion/modules/provider.ts b/packages/skeleton-react/src/components/accordion/modules/provider.ts new file mode 100644 index 0000000000..6a78c1a8c7 --- /dev/null +++ b/packages/skeleton-react/src/components/accordion/modules/provider.ts @@ -0,0 +1,12 @@ +import { connect, machine } from '@zag-js/accordion'; +import type { Api, Props } from '@zag-js/accordion'; +import { normalizeProps, useMachine, type PropTypes } from '@zag-js/react'; +import { useId } from 'react'; + +export function useAccordion(props: Omit<Props, 'id'> = {}): Api<PropTypes> { + const service = useMachine(machine, { + id: useId(), + ...props, + }); + return connect(service, normalizeProps); +} diff --git a/packages/skeleton-react/src/components/accordion/modules/root-context.ts b/packages/skeleton-react/src/components/accordion/modules/root-context.ts new file mode 100644 index 0000000000..ecb876c779 --- /dev/null +++ b/packages/skeleton-react/src/components/accordion/modules/root-context.ts @@ -0,0 +1,4 @@ +import { useAccordion } from './provider'; +import { createContext } from '@/internal/create-context'; + +export const RootContext = createContext<ReturnType<typeof useAccordion>>(); diff --git a/packages/skeleton-react/src/components/app-bar/anatomy/headline.tsx b/packages/skeleton-react/src/components/app-bar/anatomy/headline.tsx new file mode 100644 index 0000000000..cafa710666 --- /dev/null +++ b/packages/skeleton-react/src/components/app-bar/anatomy/headline.tsx @@ -0,0 +1,19 @@ +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesAppBar } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; + +export interface AppBarHeadlineProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} + +export default function AppBarHeadline(props: AppBarHeadlineProps) { + const { element, children, ...rest } = props; + + const attributes = mergeProps( + { + className: classesAppBar.headline, + }, + rest, + ); + + return element ? element(attributes) : <div {...attributes}>{children}</div>; +} diff --git a/packages/skeleton-react/src/components/app-bar/anatomy/lead.tsx b/packages/skeleton-react/src/components/app-bar/anatomy/lead.tsx new file mode 100644 index 0000000000..fb026098f1 --- /dev/null +++ b/packages/skeleton-react/src/components/app-bar/anatomy/lead.tsx @@ -0,0 +1,19 @@ +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesAppBar } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; + +export interface AppBarLeadProps extends PropsWithElement<'nav'>, HTMLAttributes<'nav'> {} + +export default function AppBarLead(props: AppBarLeadProps) { + const { element, children, ...rest } = props; + + const attributes = mergeProps( + { + className: classesAppBar.lead, + }, + rest, + ); + + return element ? element(attributes) : <nav {...attributes}>{children}</nav>; +} diff --git a/packages/skeleton-react/src/components/app-bar/anatomy/root.tsx b/packages/skeleton-react/src/components/app-bar/anatomy/root.tsx new file mode 100644 index 0000000000..90de2ac89a --- /dev/null +++ b/packages/skeleton-react/src/components/app-bar/anatomy/root.tsx @@ -0,0 +1,19 @@ +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesAppBar } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; + +export interface AppBarRootProps extends PropsWithElement<'header'>, HTMLAttributes<'header'> {} + +export default function AppBarRoot(props: AppBarRootProps) { + const { element, children, ...rest } = props; + + const attributes = mergeProps( + { + className: classesAppBar.root, + }, + rest, + ); + + return element ? element(attributes) : <header {...attributes}>{children}</header>; +} diff --git a/packages/skeleton-react/src/components/app-bar/anatomy/toolbar.tsx b/packages/skeleton-react/src/components/app-bar/anatomy/toolbar.tsx new file mode 100644 index 0000000000..cda82e103f --- /dev/null +++ b/packages/skeleton-react/src/components/app-bar/anatomy/toolbar.tsx @@ -0,0 +1,19 @@ +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesAppBar } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; + +export interface AppBarToolbarProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} + +export default function AppBarToolbar(props: AppBarToolbarProps) { + const { element, children, ...rest } = props; + + const attributes = mergeProps( + { + className: classesAppBar.toolbar, + }, + rest, + ); + + return element ? element(attributes) : <div {...attributes}>{children}</div>; +} diff --git a/packages/skeleton-react/src/components/app-bar/anatomy/trail.tsx b/packages/skeleton-react/src/components/app-bar/anatomy/trail.tsx new file mode 100644 index 0000000000..78cdcba4e0 --- /dev/null +++ b/packages/skeleton-react/src/components/app-bar/anatomy/trail.tsx @@ -0,0 +1,19 @@ +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesAppBar } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; + +export interface AppBarTrailProps extends PropsWithElement<'nav'>, HTMLAttributes<'nav'> {} + +export default function AppBarTrail(props: AppBarTrailProps) { + const { element, children, ...rest } = props; + + const attributes = mergeProps( + { + className: classesAppBar.trail, + }, + rest, + ); + + return element ? element(attributes) : <nav {...attributes}>{children}</nav>; +} diff --git a/packages/skeleton-react/src/components/app-bar/index.ts b/packages/skeleton-react/src/components/app-bar/index.ts new file mode 100644 index 0000000000..ee894f0a7b --- /dev/null +++ b/packages/skeleton-react/src/components/app-bar/index.ts @@ -0,0 +1,6 @@ +export type { AppBarRootProps } from './anatomy/root'; +export type { AppBarToolbarProps } from './anatomy/toolbar'; +export type { AppBarLeadProps } from './anatomy/lead'; +export type { AppBarHeadlineProps } from './anatomy/headline'; +export type { AppBarTrailProps } from './anatomy/trail'; +export { AppBar } from './modules/anatomy'; diff --git a/packages/skeleton-react/src/components/app-bar/modules/anatomy.ts b/packages/skeleton-react/src/components/app-bar/modules/anatomy.ts new file mode 100644 index 0000000000..ed9dcdeef5 --- /dev/null +++ b/packages/skeleton-react/src/components/app-bar/modules/anatomy.ts @@ -0,0 +1,12 @@ +import Headline from '../anatomy/headline'; +import Lead from '../anatomy/lead'; +import Root from '../anatomy/root'; +import Toolbar from '../anatomy/toolbar'; +import Trail from '../anatomy/trail'; + +export const AppBar = Object.assign(Root, { + Toolbar: Toolbar, + Lead: Lead, + Headline: Headline, + Trail: Trail, +}); diff --git a/packages/skeleton-react/src/components/avatar/anatomy/fallback.tsx b/packages/skeleton-react/src/components/avatar/anatomy/fallback.tsx new file mode 100644 index 0000000000..f47161dbe9 --- /dev/null +++ b/packages/skeleton-react/src/components/avatar/anatomy/fallback.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesAvatar } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface AvatarFallbackProps extends PropsWithElement<'span'>, HTMLAttributes<'span'> {} + +export default function Fallback(props: AvatarFallbackProps) { + const avatar = use(RootContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + avatar.getFallbackProps(), + { + className: classesAvatar.fallback, + }, + rest, + ); + + return element ? element(attributes) : <span {...attributes}>{children}</span>; +} diff --git a/packages/skeleton-react/src/components/avatar/anatomy/image.tsx b/packages/skeleton-react/src/components/avatar/anatomy/image.tsx new file mode 100644 index 0000000000..3bb1b6783c --- /dev/null +++ b/packages/skeleton-react/src/components/avatar/anatomy/image.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesAvatar } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface AvatarImageProps extends PropsWithElement<'img'>, HTMLAttributes<'img', 'children'> {} + +export default function Image(props: AvatarImageProps) { + const avatar = use(RootContext); + + const { element, ...rest } = props; + + const attributes = mergeProps( + avatar.getImageProps(), + { + className: classesAvatar.image, + }, + rest, + ); + + return element ? element(attributes) : <img {...attributes} />; +} diff --git a/packages/skeleton-react/src/components/avatar/anatomy/root-context.tsx b/packages/skeleton-react/src/components/avatar/anatomy/root-context.tsx new file mode 100644 index 0000000000..cfbaae6edb --- /dev/null +++ b/packages/skeleton-react/src/components/avatar/anatomy/root-context.tsx @@ -0,0 +1,16 @@ +import type { useAvatar } from '../modules/provider'; +import { RootContext as RootContext_ } from '../modules/root-context'; +import { use } from 'react'; +import type { ReactNode } from 'react'; + +export interface AvatarRootContextProps { + children: (avatar: ReturnType<typeof useAvatar>) => ReactNode; +} + +export default function RootContext(props: AvatarRootContextProps) { + const avatar = use(RootContext_); + + const { children } = props; + + return children(avatar); +} diff --git a/packages/skeleton-react/src/components/avatar/anatomy/root-provider.tsx b/packages/skeleton-react/src/components/avatar/anatomy/root-provider.tsx new file mode 100644 index 0000000000..013f1b81e6 --- /dev/null +++ b/packages/skeleton-react/src/components/avatar/anatomy/root-provider.tsx @@ -0,0 +1,26 @@ +import type { useAvatar } from '../modules/provider'; +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesAvatar } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; + +export interface AvatarRootProviderProps extends PropsWithElement<'div'>, HTMLAttributes<'div', 'id' | 'dir'> { + value: ReturnType<typeof useAvatar>; +} + +export default function AvatarRootProvider(props: AvatarRootProviderProps) { + const { element, children, value: avatar, ...rest } = props; + + const attributes = mergeProps( + avatar.getRootProps(), + { + className: classesAvatar.root, + }, + rest, + ); + + return ( + <RootContext.Provider value={avatar}>{element ? element(attributes) : <div {...attributes}>{children}</div>}</RootContext.Provider> + ); +} diff --git a/packages/skeleton-react/src/components/avatar/anatomy/root.tsx b/packages/skeleton-react/src/components/avatar/anatomy/root.tsx new file mode 100644 index 0000000000..c2cf6abd7b --- /dev/null +++ b/packages/skeleton-react/src/components/avatar/anatomy/root.tsx @@ -0,0 +1,29 @@ +import { useAvatar } from '../modules/provider'; +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesAvatar } from '@skeletonlabs/skeleton-common'; +import { splitProps } from '@zag-js/avatar'; +import type { Props } from '@zag-js/avatar'; +import { mergeProps } from '@zag-js/react'; + +export interface AvatarRootProps extends Omit<Props, 'id'>, PropsWithElement<'div'>, HTMLAttributes<'div', 'id' | 'dir'> {} + +export default function AvatarRoot(props: AvatarRootProps) { + const [avatarProps, componentProps] = splitProps(props); + const { element, children, ...rest } = componentProps; + + const avatar = useAvatar(avatarProps); + + const attributes = mergeProps( + avatar.getRootProps(), + { + className: classesAvatar.root, + }, + rest, + ); + + return ( + <RootContext.Provider value={avatar}>{element ? element(attributes) : <div {...attributes}>{children}</div>}</RootContext.Provider> + ); +} diff --git a/packages/skeleton-react/src/components/avatar/index.ts b/packages/skeleton-react/src/components/avatar/index.ts new file mode 100644 index 0000000000..fc1868e48a --- /dev/null +++ b/packages/skeleton-react/src/components/avatar/index.ts @@ -0,0 +1,7 @@ +export type { AvatarFallbackProps } from './anatomy/fallback'; +export type { AvatarImageProps } from './anatomy/image'; +export type { AvatarRootProps } from './anatomy/root'; +export type { AvatarRootContextProps } from './anatomy/root-context'; +export type { AvatarRootProviderProps } from './anatomy/root-provider'; +export { Avatar } from './modules/anatomy'; +export { useAvatar } from './modules/provider'; diff --git a/packages/skeleton-react/src/components/avatar/modules/anatomy.ts b/packages/skeleton-react/src/components/avatar/modules/anatomy.ts new file mode 100644 index 0000000000..06ce0a5608 --- /dev/null +++ b/packages/skeleton-react/src/components/avatar/modules/anatomy.ts @@ -0,0 +1,12 @@ +import Fallback from '../anatomy/fallback'; +import Image from '../anatomy/image'; +import Root from '../anatomy/root'; +import RootContext from '../anatomy/root-context'; +import RootProvider from '../anatomy/root-provider'; + +export const Avatar = Object.assign(Root, { + Provider: RootProvider, + Context: RootContext, + Image: Image, + Fallback: Fallback, +}); diff --git a/packages/skeleton-react/src/components/avatar/modules/provider.ts b/packages/skeleton-react/src/components/avatar/modules/provider.ts new file mode 100644 index 0000000000..526e980af6 --- /dev/null +++ b/packages/skeleton-react/src/components/avatar/modules/provider.ts @@ -0,0 +1,12 @@ +import { connect, machine } from '@zag-js/avatar'; +import type { Api, Props } from '@zag-js/avatar'; +import { normalizeProps, useMachine, type PropTypes } from '@zag-js/react'; +import { useId } from 'react'; + +export function useAvatar(props: Omit<Props, 'id'> = {}): Api<PropTypes> { + const service = useMachine(machine, { + id: useId(), + ...props, + }); + return connect(service, normalizeProps); +} diff --git a/packages/skeleton-react/src/components/avatar/modules/root-context.ts b/packages/skeleton-react/src/components/avatar/modules/root-context.ts new file mode 100644 index 0000000000..4cd8a2cbd9 --- /dev/null +++ b/packages/skeleton-react/src/components/avatar/modules/root-context.ts @@ -0,0 +1,4 @@ +import type { useAvatar } from './provider'; +import { createContext } from '@/internal/create-context'; + +export const RootContext = createContext<ReturnType<typeof useAvatar>>(); diff --git a/packages/skeleton-react/src/components/combobox/anatomy/content.tsx b/packages/skeleton-react/src/components/combobox/anatomy/content.tsx new file mode 100644 index 0000000000..7dfad7df48 --- /dev/null +++ b/packages/skeleton-react/src/components/combobox/anatomy/content.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesCombobox } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface ComboboxContentProps extends PropsWithElement<'ul'>, HTMLAttributes<'ul'> {} + +export default function Content(props: ComboboxContentProps) { + const combobox = use(RootContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + combobox.getContentProps(), + { + className: classesCombobox.content, + }, + rest, + ); + + return element ? element(attributes) : <ul {...attributes}>{children}</ul>; +} diff --git a/packages/skeleton-react/src/components/combobox/anatomy/control.tsx b/packages/skeleton-react/src/components/combobox/anatomy/control.tsx new file mode 100644 index 0000000000..5b250aa94b --- /dev/null +++ b/packages/skeleton-react/src/components/combobox/anatomy/control.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesCombobox } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface ComboboxControlProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} + +export default function Control(props: ComboboxControlProps) { + const combobox = use(RootContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + combobox.getControlProps(), + { + className: classesCombobox.control, + }, + rest, + ); + + return element ? element(attributes) : <div {...attributes}>{children}</div>; +} diff --git a/packages/skeleton-react/src/components/combobox/anatomy/input.tsx b/packages/skeleton-react/src/components/combobox/anatomy/input.tsx new file mode 100644 index 0000000000..2908dcedf2 --- /dev/null +++ b/packages/skeleton-react/src/components/combobox/anatomy/input.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesCombobox } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface ComboboxInputProps extends PropsWithElement<'input'>, Omit<HTMLAttributes<'input'>, 'children'> {} + +export default function Input(props: ComboboxInputProps) { + const combobox = use(RootContext); + + const { element, ...rest } = props; + + const attributes = mergeProps( + combobox.getInputProps(), + { + className: classesCombobox.input, + }, + rest, + ); + + return element ? element(attributes) : <input {...attributes} />; +} diff --git a/packages/skeleton-react/src/components/combobox/anatomy/item-group-label.tsx b/packages/skeleton-react/src/components/combobox/anatomy/item-group-label.tsx new file mode 100644 index 0000000000..5f91af2514 --- /dev/null +++ b/packages/skeleton-react/src/components/combobox/anatomy/item-group-label.tsx @@ -0,0 +1,31 @@ +import { ItemGroupContext } from '../modules/item-group-context'; +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesCombobox } from '@skeletonlabs/skeleton-common'; +import { type ItemGroupLabelProps, splitItemGroupLabelProps } from '@zag-js/combobox'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface ComboboxItemGroupLabelProps extends Omit<ItemGroupLabelProps, 'htmlFor'>, PropsWithElement<'div'>, HTMLAttributes<'div'> {} + +export default function ItemGroupLabel(props: ComboboxItemGroupLabelProps) { + const combobox = use(RootContext); + const itemGroupProps = use(ItemGroupContext); + + const [itemGroupLabelProps, componentProps] = splitItemGroupLabelProps({ + htmlFor: itemGroupProps.id, + ...props, + }); + const { element, children, ...rest } = componentProps; + + const attributes = mergeProps( + combobox.getItemGroupLabelProps(itemGroupLabelProps), + { + className: classesCombobox.itemGroupLabel, + }, + rest, + ); + + return element ? element(attributes) : <div {...attributes}>{children}</div>; +} diff --git a/packages/skeleton-react/src/components/combobox/anatomy/item-group.tsx b/packages/skeleton-react/src/components/combobox/anatomy/item-group.tsx new file mode 100644 index 0000000000..a10a34e1b4 --- /dev/null +++ b/packages/skeleton-react/src/components/combobox/anatomy/item-group.tsx @@ -0,0 +1,34 @@ +import { ItemGroupContext } from '../modules/item-group-context'; +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesCombobox } from '@skeletonlabs/skeleton-common'; +import { type ItemGroupProps, splitItemGroupProps } from '@zag-js/combobox'; +import { mergeProps } from '@zag-js/react'; +import { use, useId } from 'react'; + +export interface ComboboxItemGroupProps extends Omit<ItemGroupProps, 'id'>, PropsWithElement<'div'>, Omit<HTMLAttributes<'div'>, 'id'> {} + +export default function ItemGroup(props: ComboboxItemGroupProps) { + const combobox = use(RootContext); + + const [itemGroupProps, componentProps] = splitItemGroupProps({ + id: useId(), + ...props, + }); + const { element, children, ...rest } = componentProps; + + const attributes = mergeProps( + combobox.getItemGroupProps(itemGroupProps), + { + className: classesCombobox.itemGroup, + }, + rest, + ); + + return ( + <ItemGroupContext.Provider value={itemGroupProps}> + {element ? element(attributes) : <div {...attributes}>{children}</div>} + </ItemGroupContext.Provider> + ); +} diff --git a/packages/skeleton-react/src/components/combobox/anatomy/item-indicator.tsx b/packages/skeleton-react/src/components/combobox/anatomy/item-indicator.tsx new file mode 100644 index 0000000000..8af58f2a38 --- /dev/null +++ b/packages/skeleton-react/src/components/combobox/anatomy/item-indicator.tsx @@ -0,0 +1,27 @@ +import { ItemContext } from '../modules/item-context'; +import { RootContext } from '../modules/root-context'; +import Check from '@/internal/components/check'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesCombobox } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface ComboboxItemIndicatorProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} + +export default function ItemIndicator(props: ComboboxItemIndicatorProps) { + const combobox = use(RootContext); + const itemProps = use(ItemContext); + + const { element, children = <Check className="size-4" />, ...rest } = props; + + const attributes = mergeProps( + combobox.getItemIndicatorProps(itemProps), + { + className: classesCombobox.itemIndicator, + }, + rest, + ); + + return element ? element(attributes) : <div {...attributes}>{children}</div>; +} diff --git a/packages/skeleton-react/src/components/combobox/anatomy/item-text.tsx b/packages/skeleton-react/src/components/combobox/anatomy/item-text.tsx new file mode 100644 index 0000000000..2dffce4a33 --- /dev/null +++ b/packages/skeleton-react/src/components/combobox/anatomy/item-text.tsx @@ -0,0 +1,26 @@ +import { ItemContext } from '../modules/item-context'; +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesCombobox } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface ComboboxItemTextProps extends PropsWithElement<'span'>, HTMLAttributes<'span'> {} + +export default function ItemText(props: ComboboxItemTextProps) { + const combobox = use(RootContext); + const itemProps = use(ItemContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + combobox.getItemTextProps(itemProps), + { + className: classesCombobox.itemText, + }, + rest, + ); + + return element ? element(attributes) : <span {...attributes}>{children}</span>; +} diff --git a/packages/skeleton-react/src/components/combobox/anatomy/item.tsx b/packages/skeleton-react/src/components/combobox/anatomy/item.tsx new file mode 100644 index 0000000000..7ab19b279b --- /dev/null +++ b/packages/skeleton-react/src/components/combobox/anatomy/item.tsx @@ -0,0 +1,29 @@ +import { ItemContext } from '../modules/item-context'; +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesCombobox } from '@skeletonlabs/skeleton-common'; +import { type ItemProps, splitItemProps } from '@zag-js/combobox'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface ComboboxItemProps extends ItemProps, PropsWithElement<'li'>, HTMLAttributes<'li'> {} + +export default function Item(props: ComboboxItemProps) { + const combobox = use(RootContext); + + const [itemProps, componentProps] = splitItemProps(props); + const { element, children, ...rest } = componentProps; + + const attributes = mergeProps( + combobox.getItemProps(itemProps), + { + className: classesCombobox.item, + }, + rest, + ); + + return ( + <ItemContext.Provider value={itemProps}>{element ? element(attributes) : <li {...attributes}>{children}</li>}</ItemContext.Provider> + ); +} diff --git a/packages/skeleton-react/src/components/combobox/anatomy/label.tsx b/packages/skeleton-react/src/components/combobox/anatomy/label.tsx new file mode 100644 index 0000000000..2a51bbda79 --- /dev/null +++ b/packages/skeleton-react/src/components/combobox/anatomy/label.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesCombobox } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface ComboboxLabelProps extends PropsWithElement<'label'>, HTMLAttributes<'label'> {} + +export default function Label(props: ComboboxLabelProps) { + const combobox = use(RootContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + combobox.getLabelProps(), + { + className: classesCombobox.label, + }, + rest, + ); + + return element ? element(attributes) : <label {...attributes}>{children}</label>; +} diff --git a/packages/skeleton-react/src/components/combobox/anatomy/positioner.tsx b/packages/skeleton-react/src/components/combobox/anatomy/positioner.tsx new file mode 100644 index 0000000000..9b25d07cb9 --- /dev/null +++ b/packages/skeleton-react/src/components/combobox/anatomy/positioner.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesCombobox } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface ComboboxPositionerProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} + +export default function Positioner(props: ComboboxPositionerProps) { + const combobox = use(RootContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + combobox.getPositionerProps(), + { + className: classesCombobox.positioner, + }, + rest, + ); + + return element ? element(attributes) : <div {...attributes}>{children}</div>; +} diff --git a/packages/skeleton-react/src/components/combobox/anatomy/root-context.tsx b/packages/skeleton-react/src/components/combobox/anatomy/root-context.tsx new file mode 100644 index 0000000000..a2ccff6f83 --- /dev/null +++ b/packages/skeleton-react/src/components/combobox/anatomy/root-context.tsx @@ -0,0 +1,15 @@ +import type { useCombobox } from '../modules/provider'; +import { RootContext as RootContext_ } from '../modules/root-context'; +import { type ReactNode, use } from 'react'; + +export interface ComboboxRootContextProps { + children: (combobox: ReturnType<typeof useCombobox>) => ReactNode; +} + +export default function RootContext(props: ComboboxRootContextProps) { + const combobox = use(RootContext_); + + const { children } = props; + + return children(combobox); +} diff --git a/packages/skeleton-react/src/components/combobox/anatomy/root-provider.tsx b/packages/skeleton-react/src/components/combobox/anatomy/root-provider.tsx new file mode 100644 index 0000000000..2241fd0042 --- /dev/null +++ b/packages/skeleton-react/src/components/combobox/anatomy/root-provider.tsx @@ -0,0 +1,28 @@ +import { useCombobox } from '../modules/provider'; +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesCombobox } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; + +export interface ComboboxRootProviderProps + extends PropsWithElement<'div'>, + HTMLAttributes<'div', 'id' | 'dir' | 'defaultValue' | 'onSelect'> { + value: ReturnType<typeof useCombobox>; +} + +export default function RootProvider(props: ComboboxRootProviderProps) { + const { element, children, value: combobox, ...rest } = props; + + const attributes = mergeProps( + combobox.getRootProps(), + { + className: classesCombobox.root, + }, + rest, + ); + + return ( + <RootContext.Provider value={combobox}>{element ? element(attributes) : <div {...attributes}>{children}</div>}</RootContext.Provider> + ); +} diff --git a/packages/skeleton-react/src/components/combobox/anatomy/root.tsx b/packages/skeleton-react/src/components/combobox/anatomy/root.tsx new file mode 100644 index 0000000000..619dd9706d --- /dev/null +++ b/packages/skeleton-react/src/components/combobox/anatomy/root.tsx @@ -0,0 +1,31 @@ +import { useCombobox } from '../modules/provider'; +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesCombobox } from '@skeletonlabs/skeleton-common'; +import { type Props, splitProps } from '@zag-js/combobox'; +import { mergeProps } from '@zag-js/react'; + +export interface ComboboxRootProps + extends Omit<Props, 'id'>, + PropsWithElement<'div'>, + HTMLAttributes<'div', 'id' | 'dir' | 'defaultValue' | 'onSelect'> {} + +export default function Root(props: ComboboxRootProps) { + const [comboboxProps, componentProps] = splitProps(props); + const { element, children, ...rest } = componentProps; + + const combobox = useCombobox(comboboxProps); + + const attributes = mergeProps( + combobox.getRootProps(), + { + className: classesCombobox.root, + }, + rest, + ); + + return ( + <RootContext.Provider value={combobox}>{element ? element(attributes) : <div {...attributes}>{children}</div>}</RootContext.Provider> + ); +} diff --git a/packages/skeleton-react/src/components/combobox/anatomy/trigger.tsx b/packages/skeleton-react/src/components/combobox/anatomy/trigger.tsx new file mode 100644 index 0000000000..85e3a042de --- /dev/null +++ b/packages/skeleton-react/src/components/combobox/anatomy/trigger.tsx @@ -0,0 +1,25 @@ +import { RootContext } from '../modules/root-context'; +import ChevronDownIcon from '@/internal/components/chevron-down'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesCombobox } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface ComboboxTriggerProps extends PropsWithElement<'button'>, HTMLAttributes<'button'> {} + +export default function Trigger(props: ComboboxTriggerProps) { + const combobox = use(RootContext); + + const { element, children = <ChevronDownIcon />, ...rest } = props; + + const attributes = mergeProps( + combobox.getTriggerProps(), + { + className: classesCombobox.trigger, + }, + rest, + ); + + return element ? element(attributes) : <button {...attributes}>{children}</button>; +} diff --git a/packages/skeleton-react/src/components/combobox/index.ts b/packages/skeleton-react/src/components/combobox/index.ts new file mode 100644 index 0000000000..3203a4c7d5 --- /dev/null +++ b/packages/skeleton-react/src/components/combobox/index.ts @@ -0,0 +1,16 @@ +export type { ComboboxContentProps } from './anatomy/content'; +export type { ComboboxControlProps } from './anatomy/control'; +export type { ComboboxInputProps } from './anatomy/input'; +export type { ComboboxItemProps } from './anatomy/item'; +export type { ComboboxItemGroupProps } from './anatomy/item-group'; +export type { ComboboxItemGroupLabelProps } from './anatomy/item-group-label'; +export type { ComboboxItemIndicatorProps } from './anatomy/item-indicator'; +export type { ComboboxItemTextProps } from './anatomy/item-text'; +export type { ComboboxLabelProps } from './anatomy/label'; +export type { ComboboxPositionerProps } from './anatomy/positioner'; +export type { ComboboxRootProps } from './anatomy/root'; +export type { ComboboxRootContextProps } from './anatomy/root-context'; +export type { ComboboxRootProviderProps } from './anatomy/root-provider'; +export type { ComboboxTriggerProps } from './anatomy/trigger'; +export { Combobox } from './modules/anatomy'; +export { useCombobox } from './modules/provider'; diff --git a/packages/skeleton-react/src/components/combobox/modules/anatomy.ts b/packages/skeleton-react/src/components/combobox/modules/anatomy.ts new file mode 100644 index 0000000000..35d19afd86 --- /dev/null +++ b/packages/skeleton-react/src/components/combobox/modules/anatomy.ts @@ -0,0 +1,30 @@ +import Content from '../anatomy/content'; +import Control from '../anatomy/control'; +import Input from '../anatomy/input'; +import Item from '../anatomy/item'; +import ItemGroup from '../anatomy/item-group'; +import ItemGroupLabel from '../anatomy/item-group-label'; +import ItemIndicator from '../anatomy/item-indicator'; +import ItemText from '../anatomy/item-text'; +import Label from '../anatomy/label'; +import Positioner from '../anatomy/positioner'; +import Root from '../anatomy/root'; +import RootContext from '../anatomy/root-context'; +import RootProvider from '../anatomy/root-provider'; +import Trigger from '../anatomy/trigger'; + +export const Combobox = Object.assign(Root, { + Provider: RootProvider, + Context: RootContext, + Label: Label, + Control: Control, + Input: Input, + Trigger: Trigger, + Positioner: Positioner, + Content: Content, + ItemGroup: ItemGroup, + ItemGroupLabel: ItemGroupLabel, + Item: Item, + ItemText: ItemText, + ItemIndicator: ItemIndicator, +}); diff --git a/packages/skeleton-react/src/components/combobox/modules/item-context.ts b/packages/skeleton-react/src/components/combobox/modules/item-context.ts new file mode 100644 index 0000000000..38bf7e2d16 --- /dev/null +++ b/packages/skeleton-react/src/components/combobox/modules/item-context.ts @@ -0,0 +1,4 @@ +import { createContext } from '@/internal/create-context'; +import type { ItemProps } from '@zag-js/combobox'; + +export const ItemContext = createContext<ItemProps>(); diff --git a/packages/skeleton-react/src/components/combobox/modules/item-group-context.ts b/packages/skeleton-react/src/components/combobox/modules/item-group-context.ts new file mode 100644 index 0000000000..60774fe83a --- /dev/null +++ b/packages/skeleton-react/src/components/combobox/modules/item-group-context.ts @@ -0,0 +1,4 @@ +import { createContext } from '@/internal/create-context'; +import type { ItemGroupProps } from '@zag-js/combobox'; + +export const ItemGroupContext = createContext<ItemGroupProps>(); diff --git a/packages/skeleton-react/src/components/combobox/modules/provider.ts b/packages/skeleton-react/src/components/combobox/modules/provider.ts new file mode 100644 index 0000000000..006765b0cc --- /dev/null +++ b/packages/skeleton-react/src/components/combobox/modules/provider.ts @@ -0,0 +1,11 @@ +import { type Api, connect, machine, type Props } from '@zag-js/combobox'; +import { normalizeProps, useMachine, type PropTypes } from '@zag-js/react'; +import { useId } from 'react'; + +export function useCombobox(props: Omit<Props, 'id'> = {}): Api<PropTypes> { + const service = useMachine(machine, { + id: useId(), + ...props, + }); + return connect(service, normalizeProps); +} diff --git a/packages/skeleton-react/src/components/combobox/modules/root-context.ts b/packages/skeleton-react/src/components/combobox/modules/root-context.ts new file mode 100644 index 0000000000..7a16e75c48 --- /dev/null +++ b/packages/skeleton-react/src/components/combobox/modules/root-context.ts @@ -0,0 +1,4 @@ +import type { useCombobox } from './provider'; +import { createContext } from '@/internal/create-context'; + +export const RootContext = createContext<ReturnType<typeof useCombobox>>(); diff --git a/packages/skeleton-react/src/components/dialog/anatomy/backdrop.tsx b/packages/skeleton-react/src/components/dialog/anatomy/backdrop.tsx new file mode 100644 index 0000000000..6f79755078 --- /dev/null +++ b/packages/skeleton-react/src/components/dialog/anatomy/backdrop.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesDialog } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface DialogBackdropProps extends PropsWithElement<'div'>, HTMLAttributes<'div', 'children'> {} + +export default function Backdrop(props: DialogBackdropProps) { + const dialog = use(RootContext); + + const { element, ...rest } = props; + + const attributes = mergeProps( + dialog.getBackdropProps(), + { + className: classesDialog.backdrop, + }, + rest, + ); + + return element ? element(attributes) : <div {...attributes} />; +} diff --git a/packages/skeleton-react/src/components/dialog/anatomy/close-trigger.tsx b/packages/skeleton-react/src/components/dialog/anatomy/close-trigger.tsx new file mode 100644 index 0000000000..3fdee912ce --- /dev/null +++ b/packages/skeleton-react/src/components/dialog/anatomy/close-trigger.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesDialog } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface DialogCloseTriggerProps extends PropsWithElement<'button'>, HTMLAttributes<'button'> {} + +export default function CloseTrigger(props: DialogCloseTriggerProps) { + const dialog = use(RootContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + dialog.getCloseTriggerProps(), + { + className: classesDialog.closeTrigger, + }, + rest, + ); + + return element ? element(attributes) : <button {...attributes}>{children}</button>; +} diff --git a/packages/skeleton-react/src/components/dialog/anatomy/content.tsx b/packages/skeleton-react/src/components/dialog/anatomy/content.tsx new file mode 100644 index 0000000000..9d0f40654a --- /dev/null +++ b/packages/skeleton-react/src/components/dialog/anatomy/content.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesDialog } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface DialogContentProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} + +export default function Content(props: DialogContentProps) { + const dialog = use(RootContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + dialog.getContentProps(), + { + className: classesDialog.content, + }, + rest, + ); + + return element ? element(attributes) : <div {...attributes}>{children}</div>; +} diff --git a/packages/skeleton-react/src/components/dialog/anatomy/description.tsx b/packages/skeleton-react/src/components/dialog/anatomy/description.tsx new file mode 100644 index 0000000000..c2e0152117 --- /dev/null +++ b/packages/skeleton-react/src/components/dialog/anatomy/description.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesDialog } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface DialogDescriptionProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} + +export default function Description(props: DialogDescriptionProps) { + const dialog = use(RootContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + dialog.getDescriptionProps(), + { + className: classesDialog.description, + }, + rest, + ); + + return element ? element(attributes) : <div {...attributes}>{children}</div>; +} diff --git a/packages/skeleton-react/src/components/dialog/anatomy/positioner.tsx b/packages/skeleton-react/src/components/dialog/anatomy/positioner.tsx new file mode 100644 index 0000000000..093ebe80ee --- /dev/null +++ b/packages/skeleton-react/src/components/dialog/anatomy/positioner.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesDialog } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface DialogPositionerProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} + +export default function Positioner(props: DialogPositionerProps) { + const dialog = use(RootContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + dialog.getPositionerProps(), + { + className: classesDialog.positioner, + }, + rest, + ); + + return element ? element(attributes) : <div {...attributes}>{children}</div>; +} diff --git a/packages/skeleton-react/src/components/dialog/anatomy/root-context.tsx b/packages/skeleton-react/src/components/dialog/anatomy/root-context.tsx new file mode 100644 index 0000000000..6440bc4796 --- /dev/null +++ b/packages/skeleton-react/src/components/dialog/anatomy/root-context.tsx @@ -0,0 +1,15 @@ +import type { useDialog } from '../modules/provider'; +import { RootContext as RootContext_ } from '../modules/root-context'; +import { type ReactNode, use } from 'react'; + +export interface DialogRootContextProps { + children: (dialog: ReturnType<typeof useDialog>) => ReactNode; +} + +export default function RootContext(props: DialogRootContextProps) { + const dialog = use(RootContext_); + + const { children } = props; + + return children(dialog); +} diff --git a/packages/skeleton-react/src/components/dialog/anatomy/root-provider.tsx b/packages/skeleton-react/src/components/dialog/anatomy/root-provider.tsx new file mode 100644 index 0000000000..18f9ff8045 --- /dev/null +++ b/packages/skeleton-react/src/components/dialog/anatomy/root-provider.tsx @@ -0,0 +1,13 @@ +import type { useDialog } from '../modules/provider'; +import { RootContext } from '../modules/root-context'; +import type { PropsWithChildren } from 'react'; + +export interface DialogRootProviderProps extends PropsWithChildren { + value: ReturnType<typeof useDialog>; +} + +export default function RootProvider(props: DialogRootProviderProps) { + const { children, value: dialog } = props; + + return <RootContext.Provider value={dialog}>{children}</RootContext.Provider>; +} diff --git a/packages/skeleton-react/src/components/dialog/anatomy/root.tsx b/packages/skeleton-react/src/components/dialog/anatomy/root.tsx new file mode 100644 index 0000000000..b7ebb3ec4e --- /dev/null +++ b/packages/skeleton-react/src/components/dialog/anatomy/root.tsx @@ -0,0 +1,15 @@ +import { useDialog } from '../modules/provider'; +import { RootContext } from '../modules/root-context'; +import { type Props, splitProps } from '@zag-js/dialog'; +import { type PropsWithChildren } from 'react'; + +export interface DialogRootProps extends PropsWithChildren, Omit<Props, 'id'> {} + +export default function Root(props: DialogRootProps) { + const [dialogProps, componentProps] = splitProps(props); + const { children } = componentProps; + + const dialog = useDialog(dialogProps); + + return <RootContext.Provider value={dialog}>{children}</RootContext.Provider>; +} diff --git a/packages/skeleton-react/src/components/dialog/anatomy/title.tsx b/packages/skeleton-react/src/components/dialog/anatomy/title.tsx new file mode 100644 index 0000000000..fd8cbc3fab --- /dev/null +++ b/packages/skeleton-react/src/components/dialog/anatomy/title.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesDialog } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface DialogTitleProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} + +export default function Title(props: DialogTitleProps) { + const dialog = use(RootContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + dialog.getTitleProps(), + { + className: classesDialog.title, + }, + rest, + ); + + return element ? element(attributes) : <div {...attributes}>{children}</div>; +} diff --git a/packages/skeleton-react/src/components/dialog/anatomy/trigger.tsx b/packages/skeleton-react/src/components/dialog/anatomy/trigger.tsx new file mode 100644 index 0000000000..dc9e60e2cd --- /dev/null +++ b/packages/skeleton-react/src/components/dialog/anatomy/trigger.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesDialog } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface DialogTriggerProps extends PropsWithElement<'button'>, HTMLAttributes<'button'> {} + +export default function Trigger(props: DialogTriggerProps) { + const dialog = use(RootContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + dialog.getTriggerProps(), + { + className: classesDialog.trigger, + }, + rest, + ); + + return element ? element(attributes) : <button {...attributes}>{children}</button>; +} diff --git a/packages/skeleton-react/src/components/dialog/index.ts b/packages/skeleton-react/src/components/dialog/index.ts new file mode 100644 index 0000000000..4b43ab71aa --- /dev/null +++ b/packages/skeleton-react/src/components/dialog/index.ts @@ -0,0 +1,12 @@ +export type { DialogBackdropProps } from './anatomy/backdrop'; +export type { DialogCloseTriggerProps } from './anatomy/close-trigger'; +export type { DialogContentProps } from './anatomy/content'; +export type { DialogDescriptionProps } from './anatomy/description'; +export type { DialogPositionerProps } from './anatomy/positioner'; +export type { DialogRootProps } from './anatomy/root'; +export type { DialogRootContextProps } from './anatomy/root-context'; +export type { DialogRootProviderProps } from './anatomy/root-provider'; +export type { DialogTitleProps } from './anatomy/title'; +export type { DialogTriggerProps } from './anatomy/trigger'; +export { Dialog } from './modules/anatomy'; +export { useDialog } from './modules/provider'; diff --git a/packages/skeleton-react/src/components/dialog/modules/anatomy.ts b/packages/skeleton-react/src/components/dialog/modules/anatomy.ts new file mode 100644 index 0000000000..92b65f1b4d --- /dev/null +++ b/packages/skeleton-react/src/components/dialog/modules/anatomy.ts @@ -0,0 +1,22 @@ +import Backdrop from '../anatomy/backdrop'; +import CloseTrigger from '../anatomy/close-trigger'; +import Content from '../anatomy/content'; +import Description from '../anatomy/description'; +import Positioner from '../anatomy/positioner'; +import Root from '../anatomy/root'; +import RootContext from '../anatomy/root-context'; +import RootProvider from '../anatomy/root-provider'; +import Title from '../anatomy/title'; +import Trigger from '../anatomy/trigger'; + +export const Dialog = Object.assign(Root, { + Provider: RootProvider, + Context: RootContext, + Trigger: Trigger, + Backdrop: Backdrop, + Positioner: Positioner, + Content: Content, + Title: Title, + Description: Description, + CloseTrigger: CloseTrigger, +}); diff --git a/packages/skeleton-react/src/components/dialog/modules/provider.ts b/packages/skeleton-react/src/components/dialog/modules/provider.ts new file mode 100644 index 0000000000..97b9075182 --- /dev/null +++ b/packages/skeleton-react/src/components/dialog/modules/provider.ts @@ -0,0 +1,11 @@ +import { type Api, connect, machine, type Props } from '@zag-js/dialog'; +import { normalizeProps, useMachine, type PropTypes } from '@zag-js/react'; +import { useId } from 'react'; + +export function useDialog(props: Omit<Props, 'id'> = {}): Api<PropTypes> { + const service = useMachine(machine, { + id: useId(), + ...props, + }); + return connect(service, normalizeProps); +} diff --git a/packages/skeleton-react/src/components/dialog/modules/root-context.ts b/packages/skeleton-react/src/components/dialog/modules/root-context.ts new file mode 100644 index 0000000000..a3edd51fea --- /dev/null +++ b/packages/skeleton-react/src/components/dialog/modules/root-context.ts @@ -0,0 +1,4 @@ +import type { useDialog } from './provider'; +import { createContext } from '@/internal/create-context'; + +export const RootContext = createContext<ReturnType<typeof useDialog>>(); diff --git a/packages/skeleton-react/src/components/file-upload/anatomy/dropzone.tsx b/packages/skeleton-react/src/components/file-upload/anatomy/dropzone.tsx new file mode 100644 index 0000000000..558b4753f0 --- /dev/null +++ b/packages/skeleton-react/src/components/file-upload/anatomy/dropzone.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesFileUpload } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface FileUploadDropzoneProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} + +export default function Dropzone(props: FileUploadDropzoneProps) { + const fileUpload = use(RootContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + fileUpload.getDropzoneProps(), + { + className: classesFileUpload.dropzone, + }, + rest, + ); + + return element ? element(attributes) : <div {...attributes}>{children}</div>; +} diff --git a/packages/skeleton-react/src/components/file-upload/anatomy/hidden-input.tsx b/packages/skeleton-react/src/components/file-upload/anatomy/hidden-input.tsx new file mode 100644 index 0000000000..8561c3c00c --- /dev/null +++ b/packages/skeleton-react/src/components/file-upload/anatomy/hidden-input.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesFileUpload } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface FileUploadHiddenInputProps extends PropsWithElement<'input'>, Omit<HTMLAttributes<'input'>, 'children'> {} + +export default function HiddenInput(props: FileUploadHiddenInputProps) { + const fileUpload = use(RootContext); + + const { element, ...rest } = props; + + const attributes = mergeProps( + fileUpload.getHiddenInputProps(), + { + className: classesFileUpload.hiddenInput, + }, + rest, + ); + + return element ? element(attributes) : <input {...attributes} />; +} diff --git a/packages/skeleton-react/src/components/file-upload/anatomy/item-delete-trigger.tsx b/packages/skeleton-react/src/components/file-upload/anatomy/item-delete-trigger.tsx new file mode 100644 index 0000000000..57c905e3ea --- /dev/null +++ b/packages/skeleton-react/src/components/file-upload/anatomy/item-delete-trigger.tsx @@ -0,0 +1,26 @@ +import { ItemContext } from '../modules/item-context'; +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesFileUpload } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface FileUploadItemDeleteTriggerProps extends PropsWithElement<'button'>, HTMLAttributes<'button'> {} + +export default function ItemDeleteTrigger(props: FileUploadItemDeleteTriggerProps) { + const fileUpload = use(RootContext); + const itemProps = use(ItemContext); + + const { element, children = <>×</>, ...rest } = props; + + const attributes = mergeProps( + fileUpload.getItemDeleteTriggerProps(itemProps), + { + className: classesFileUpload.itemDeleteTrigger, + }, + rest, + ); + + return element ? element(attributes) : <button {...attributes}>{children}</button>; +} diff --git a/packages/skeleton-react/src/components/file-upload/anatomy/item-group.tsx b/packages/skeleton-react/src/components/file-upload/anatomy/item-group.tsx new file mode 100644 index 0000000000..05fc9fd8ad --- /dev/null +++ b/packages/skeleton-react/src/components/file-upload/anatomy/item-group.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesFileUpload } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface FileUploadItemGroupProps extends PropsWithElement<'ul'>, HTMLAttributes<'ul'> {} + +export default function ItemGroup(props: FileUploadItemGroupProps) { + const fileUpload = use(RootContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + fileUpload.getItemGroupProps(), + { + className: classesFileUpload.itemGroup, + }, + rest, + ); + + return element ? element(attributes) : <ul {...attributes}>{children}</ul>; +} diff --git a/packages/skeleton-react/src/components/file-upload/anatomy/item-name.tsx b/packages/skeleton-react/src/components/file-upload/anatomy/item-name.tsx new file mode 100644 index 0000000000..dcb8024d5c --- /dev/null +++ b/packages/skeleton-react/src/components/file-upload/anatomy/item-name.tsx @@ -0,0 +1,26 @@ +import { ItemContext } from '../modules/item-context'; +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesFileUpload } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface FileUploadItemNameProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} + +export default function ItemName(props: FileUploadItemNameProps) { + const fileUpload = use(RootContext); + const itemProps = use(ItemContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + fileUpload.getItemNameProps(itemProps), + { + className: classesFileUpload.itemName, + }, + rest, + ); + + return element ? element(attributes) : <div {...attributes}>{children}</div>; +} diff --git a/packages/skeleton-react/src/components/file-upload/anatomy/item-size-text.tsx b/packages/skeleton-react/src/components/file-upload/anatomy/item-size-text.tsx new file mode 100644 index 0000000000..6a827ca68a --- /dev/null +++ b/packages/skeleton-react/src/components/file-upload/anatomy/item-size-text.tsx @@ -0,0 +1,26 @@ +import { ItemContext } from '../modules/item-context'; +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesFileUpload } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface FileUploadItemSizeTextProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} + +export default function ItemSizeText(props: FileUploadItemSizeTextProps) { + const fileUpload = use(RootContext); + const itemProps = use(ItemContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + fileUpload.getItemSizeTextProps(itemProps), + { + className: classesFileUpload.itemSizeText, + }, + rest, + ); + + return element ? element(attributes) : <div {...attributes}>{children}</div>; +} diff --git a/packages/skeleton-react/src/components/file-upload/anatomy/item.tsx b/packages/skeleton-react/src/components/file-upload/anatomy/item.tsx new file mode 100644 index 0000000000..56b202ce86 --- /dev/null +++ b/packages/skeleton-react/src/components/file-upload/anatomy/item.tsx @@ -0,0 +1,30 @@ +import { ItemContext } from '../modules/item-context'; +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesFileUpload } from '@skeletonlabs/skeleton-common'; +import { splitItemProps } from '@zag-js/file-upload'; +import type { ItemProps } from '@zag-js/file-upload'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface FileUploadItemProps extends ItemProps, PropsWithElement<'li'>, HTMLAttributes<'li'> {} + +export default function Item(props: FileUploadItemProps) { + const fileUpload = use(RootContext); + + const [itemProps, componentProps] = splitItemProps(props); + const { element, children, ...rest } = componentProps; + + const attributes = mergeProps( + fileUpload.getItemProps(itemProps), + { + className: classesFileUpload.item, + }, + rest, + ); + + return ( + <ItemContext.Provider value={itemProps}>{element ? element(attributes) : <li {...attributes}>{children}</li>}</ItemContext.Provider> + ); +} diff --git a/packages/skeleton-react/src/components/file-upload/anatomy/root-context.tsx b/packages/skeleton-react/src/components/file-upload/anatomy/root-context.tsx new file mode 100644 index 0000000000..a88746c758 --- /dev/null +++ b/packages/skeleton-react/src/components/file-upload/anatomy/root-context.tsx @@ -0,0 +1,16 @@ +import type { useFileUpload } from '../modules/provider'; +import { RootContext as RootContext_ } from '../modules/root-context'; +import { use } from 'react'; +import type { ReactNode } from 'react'; + +export interface FileUploadRootContextProps { + children: (fileUpload: ReturnType<typeof useFileUpload>) => ReactNode; +} + +export default function RootContext(props: FileUploadRootContextProps) { + const fileUpload = use(RootContext_); + + const { children } = props; + + return children(fileUpload); +} diff --git a/packages/skeleton-react/src/components/file-upload/anatomy/root-provider.tsx b/packages/skeleton-react/src/components/file-upload/anatomy/root-provider.tsx new file mode 100644 index 0000000000..a73aeb9e8a --- /dev/null +++ b/packages/skeleton-react/src/components/file-upload/anatomy/root-provider.tsx @@ -0,0 +1,26 @@ +import type { useFileUpload } from '../modules/provider'; +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesFileUpload } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; + +export interface FileUploadRootProviderProps extends PropsWithElement<'div'>, Omit<HTMLAttributes<'div'>, 'id' | 'dir'> { + value: ReturnType<typeof useFileUpload>; +} + +export default function RootProvider(props: FileUploadRootProviderProps) { + const { element, children, value: fileUpload, ...rest } = props; + + const attributes = mergeProps( + fileUpload.getRootProps(), + { + className: classesFileUpload.root, + }, + rest, + ); + + return ( + <RootContext.Provider value={fileUpload}>{element ? element(attributes) : <div {...attributes}>{children}</div>}</RootContext.Provider> + ); +} diff --git a/packages/skeleton-react/src/components/file-upload/anatomy/root.tsx b/packages/skeleton-react/src/components/file-upload/anatomy/root.tsx new file mode 100644 index 0000000000..f148516284 --- /dev/null +++ b/packages/skeleton-react/src/components/file-upload/anatomy/root.tsx @@ -0,0 +1,29 @@ +import { useFileUpload } from '../modules/provider'; +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesFileUpload } from '@skeletonlabs/skeleton-common'; +import { splitProps } from '@zag-js/file-upload'; +import type { Props } from '@zag-js/file-upload'; +import { mergeProps } from '@zag-js/react'; + +export interface FileUploadRootProps extends Omit<Props, 'id'>, PropsWithElement<'div'>, Omit<HTMLAttributes<'div'>, 'id' | 'dir'> {} + +export default function Root(props: FileUploadRootProps) { + const [fileUploadProps, componentProps] = splitProps(props); + const { element, children, ...rest } = componentProps; + + const fileUpload = useFileUpload(fileUploadProps); + + const attributes = mergeProps( + fileUpload.getRootProps(), + { + className: classesFileUpload.root, + }, + rest, + ); + + return ( + <RootContext.Provider value={fileUpload}>{element ? element(attributes) : <div {...attributes}>{children}</div>}</RootContext.Provider> + ); +} diff --git a/packages/skeleton-react/src/components/file-upload/anatomy/trigger.tsx b/packages/skeleton-react/src/components/file-upload/anatomy/trigger.tsx new file mode 100644 index 0000000000..b08ea8a5bd --- /dev/null +++ b/packages/skeleton-react/src/components/file-upload/anatomy/trigger.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesFileUpload } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface FileUploadTriggerProps extends PropsWithElement<'button'>, HTMLAttributes<'button'> {} + +export default function Trigger(props: FileUploadTriggerProps) { + const fileUpload = use(RootContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + fileUpload.getTriggerProps(), + { + className: classesFileUpload.trigger, + }, + rest, + ); + + return element ? element(attributes) : <button {...attributes}>{children}</button>; +} diff --git a/packages/skeleton-react/src/components/file-upload/index.ts b/packages/skeleton-react/src/components/file-upload/index.ts new file mode 100644 index 0000000000..06485334db --- /dev/null +++ b/packages/skeleton-react/src/components/file-upload/index.ts @@ -0,0 +1,13 @@ +export type { FileUploadDropzoneProps } from './anatomy/dropzone'; +export type { FileUploadHiddenInputProps } from './anatomy/hidden-input'; +export type { FileUploadItemProps } from './anatomy/item'; +export type { FileUploadItemDeleteTriggerProps } from './anatomy/item-delete-trigger'; +export type { FileUploadItemGroupProps } from './anatomy/item-group'; +export type { FileUploadItemNameProps } from './anatomy/item-name'; +export type { FileUploadItemSizeTextProps } from './anatomy/item-size-text'; +export type { FileUploadRootProps } from './anatomy/root'; +export type { FileUploadRootContextProps } from './anatomy/root-context'; +export type { FileUploadRootProviderProps } from './anatomy/root-provider'; +export type { FileUploadTriggerProps } from './anatomy/trigger'; +export { FileUpload } from './modules/anatomy'; +export { useFileUpload } from './modules/provider'; diff --git a/packages/skeleton-react/src/components/file-upload/modules/anatomy.ts b/packages/skeleton-react/src/components/file-upload/modules/anatomy.ts new file mode 100644 index 0000000000..ba9d8441c8 --- /dev/null +++ b/packages/skeleton-react/src/components/file-upload/modules/anatomy.ts @@ -0,0 +1,24 @@ +import Dropzone from '../anatomy/dropzone'; +import HiddenInput from '../anatomy/hidden-input'; +import Item from '../anatomy/item'; +import ItemDeleteTrigger from '../anatomy/item-delete-trigger'; +import ItemGroup from '../anatomy/item-group'; +import ItemName from '../anatomy/item-name'; +import ItemSizeText from '../anatomy/item-size-text'; +import Root from '../anatomy/root'; +import RootContext from '../anatomy/root-context'; +import RootProvider from '../anatomy/root-provider'; +import Trigger from '../anatomy/trigger'; + +export const FileUpload = Object.assign(Root, { + Provider: RootProvider, + Context: RootContext, + Dropzone: Dropzone, + Trigger: Trigger, + HiddenInput: HiddenInput, + ItemGroup: ItemGroup, + Item: Item, + ItemName: ItemName, + ItemSizeText: ItemSizeText, + ItemDeleteTrigger: ItemDeleteTrigger, +}); diff --git a/packages/skeleton-react/src/components/file-upload/modules/item-context.ts b/packages/skeleton-react/src/components/file-upload/modules/item-context.ts new file mode 100644 index 0000000000..a82b070c2b --- /dev/null +++ b/packages/skeleton-react/src/components/file-upload/modules/item-context.ts @@ -0,0 +1,4 @@ +import { createContext } from '@/internal/create-context'; +import type { ItemProps } from '@zag-js/file-upload'; + +export const ItemContext = createContext<ItemProps>(); diff --git a/packages/skeleton-react/src/components/file-upload/modules/provider.ts b/packages/skeleton-react/src/components/file-upload/modules/provider.ts new file mode 100644 index 0000000000..3edc4b2bde --- /dev/null +++ b/packages/skeleton-react/src/components/file-upload/modules/provider.ts @@ -0,0 +1,12 @@ +import { connect, machine } from '@zag-js/file-upload'; +import type { Api, Props } from '@zag-js/file-upload'; +import { normalizeProps, useMachine, type PropTypes } from '@zag-js/react'; +import { useId } from 'react'; + +export function useFileUpload(props: Omit<Props, 'id'> = {}): Api<PropTypes> { + const service = useMachine(machine, { + id: useId(), + ...props, + }); + return connect(service, normalizeProps); +} diff --git a/packages/skeleton-react/src/components/file-upload/modules/root-context.ts b/packages/skeleton-react/src/components/file-upload/modules/root-context.ts new file mode 100644 index 0000000000..d2c9c8c4f6 --- /dev/null +++ b/packages/skeleton-react/src/components/file-upload/modules/root-context.ts @@ -0,0 +1,4 @@ +import type { useFileUpload } from './provider'; +import { createContext } from '@/internal/create-context'; + +export const RootContext = createContext<ReturnType<typeof useFileUpload>>(); diff --git a/packages/skeleton-react/src/components/popover/anatomy/arrow-tip.tsx b/packages/skeleton-react/src/components/popover/anatomy/arrow-tip.tsx new file mode 100644 index 0000000000..a380c05d70 --- /dev/null +++ b/packages/skeleton-react/src/components/popover/anatomy/arrow-tip.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesPopover } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface PopoverArrowTipProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} + +export default function ArrowTip(props: PopoverArrowTipProps) { + const popover = use(RootContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + popover.getArrowTipProps(), + { + className: classesPopover.arrowTip, + }, + rest, + ); + + return element ? element(attributes) : <div {...attributes}>{children}</div>; +} diff --git a/packages/skeleton-react/src/components/popover/anatomy/arrow.tsx b/packages/skeleton-react/src/components/popover/anatomy/arrow.tsx new file mode 100644 index 0000000000..ea93ab733e --- /dev/null +++ b/packages/skeleton-react/src/components/popover/anatomy/arrow.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesPopover } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface PopoverArrowProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} + +export default function Arrow(props: PopoverArrowProps) { + const popover = use(RootContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + popover.getArrowProps(), + { + className: classesPopover.arrow, + }, + rest, + ); + + return element ? element(attributes) : <div {...attributes}>{children}</div>; +} diff --git a/packages/skeleton-react/src/components/popover/anatomy/close-trigger.tsx b/packages/skeleton-react/src/components/popover/anatomy/close-trigger.tsx new file mode 100644 index 0000000000..77089a96ec --- /dev/null +++ b/packages/skeleton-react/src/components/popover/anatomy/close-trigger.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesPopover } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface PopoverCloseTriggerProps extends PropsWithElement<'button'>, HTMLAttributes<'button'> {} + +export default function CloseTrigger(props: PopoverCloseTriggerProps) { + const popover = use(RootContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + popover.getCloseTriggerProps(), + { + className: classesPopover.closeTrigger, + }, + rest, + ); + + return element ? element(attributes) : <button {...attributes}>{children}</button>; +} diff --git a/packages/skeleton-react/src/components/popover/anatomy/content.tsx b/packages/skeleton-react/src/components/popover/anatomy/content.tsx new file mode 100644 index 0000000000..a888c063b4 --- /dev/null +++ b/packages/skeleton-react/src/components/popover/anatomy/content.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesPopover } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface PopoverContentProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} + +export default function Content(props: PopoverContentProps) { + const popover = use(RootContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + popover.getContentProps(), + { + className: classesPopover.content, + }, + rest, + ); + + return element ? element(attributes) : <div {...attributes}>{children}</div>; +} diff --git a/packages/skeleton-react/src/components/popover/anatomy/description.tsx b/packages/skeleton-react/src/components/popover/anatomy/description.tsx new file mode 100644 index 0000000000..9fde0ae652 --- /dev/null +++ b/packages/skeleton-react/src/components/popover/anatomy/description.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesPopover } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface PopoverDescriptionProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} + +export default function Description(props: PopoverDescriptionProps) { + const popover = use(RootContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + popover.getDescriptionProps(), + { + className: classesPopover.description, + }, + rest, + ); + + return element ? element(attributes) : <div {...attributes}>{children}</div>; +} diff --git a/packages/skeleton-react/src/components/popover/anatomy/positioner.tsx b/packages/skeleton-react/src/components/popover/anatomy/positioner.tsx new file mode 100644 index 0000000000..ce85473125 --- /dev/null +++ b/packages/skeleton-react/src/components/popover/anatomy/positioner.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesPopover } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface PopoverPositionerProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} + +export default function Positioner(props: PopoverPositionerProps) { + const popover = use(RootContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + popover.getPositionerProps(), + { + className: classesPopover.positioner, + }, + rest, + ); + + return element ? element(attributes) : <div {...attributes}>{children}</div>; +} diff --git a/packages/skeleton-react/src/components/popover/anatomy/root-context.tsx b/packages/skeleton-react/src/components/popover/anatomy/root-context.tsx new file mode 100644 index 0000000000..c4d4f44af3 --- /dev/null +++ b/packages/skeleton-react/src/components/popover/anatomy/root-context.tsx @@ -0,0 +1,15 @@ +import type { usePopover } from '../modules/provider'; +import { RootContext as RootContext_ } from '../modules/root-context'; +import { type ReactNode, use } from 'react'; + +export interface PopoverRootContextProps { + children: (popover: ReturnType<typeof usePopover>) => ReactNode; +} + +export default function RootContext(props: PopoverRootContextProps) { + const popover = use(RootContext_); + + const { children } = props; + + return children(popover); +} diff --git a/packages/skeleton-react/src/components/popover/anatomy/root-provider.tsx b/packages/skeleton-react/src/components/popover/anatomy/root-provider.tsx new file mode 100644 index 0000000000..c10ffdbdb7 --- /dev/null +++ b/packages/skeleton-react/src/components/popover/anatomy/root-provider.tsx @@ -0,0 +1,13 @@ +import type { usePopover } from '../modules/provider'; +import { RootContext } from '../modules/root-context'; +import type { PropsWithChildren } from 'react'; + +export interface PopoverRootProviderProps extends PropsWithChildren { + value: ReturnType<typeof usePopover>; +} + +export default function RootProvider(props: PopoverRootProviderProps) { + const { children, value: popover } = props; + + return <RootContext.Provider value={popover}>{children}</RootContext.Provider>; +} diff --git a/packages/skeleton-react/src/components/popover/anatomy/root.tsx b/packages/skeleton-react/src/components/popover/anatomy/root.tsx new file mode 100644 index 0000000000..912d37f087 --- /dev/null +++ b/packages/skeleton-react/src/components/popover/anatomy/root.tsx @@ -0,0 +1,15 @@ +import { usePopover } from '../modules/provider'; +import { RootContext } from '../modules/root-context'; +import { type Props, splitProps } from '@zag-js/popover'; +import { type PropsWithChildren } from 'react'; + +export interface PopoverRootProps extends PropsWithChildren, Omit<Props, 'id'> {} + +export default function Root(props: PopoverRootProps) { + const [popoverProps, componentProps] = splitProps(props); + const { children } = componentProps; + + const popover = usePopover(popoverProps); + + return <RootContext.Provider value={popover}>{children}</RootContext.Provider>; +} diff --git a/packages/skeleton-react/src/components/popover/anatomy/title.tsx b/packages/skeleton-react/src/components/popover/anatomy/title.tsx new file mode 100644 index 0000000000..719066cb1c --- /dev/null +++ b/packages/skeleton-react/src/components/popover/anatomy/title.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesPopover } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface PopoverTitleProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} + +export default function Title(props: PopoverTitleProps) { + const popover = use(RootContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + popover.getTitleProps(), + { + className: classesPopover.title, + }, + rest, + ); + + return element ? element(attributes) : <div {...attributes}>{children}</div>; +} diff --git a/packages/skeleton-react/src/components/popover/anatomy/trigger.tsx b/packages/skeleton-react/src/components/popover/anatomy/trigger.tsx new file mode 100644 index 0000000000..880a371d56 --- /dev/null +++ b/packages/skeleton-react/src/components/popover/anatomy/trigger.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesPopover } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { type PropsWithChildren, use } from 'react'; + +export interface PopoverTriggerProps extends PropsWithChildren, PropsWithElement<'button'>, HTMLAttributes<'button'> {} + +export default function Trigger(props: PopoverTriggerProps) { + const popover = use(RootContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + popover.getTriggerProps(), + { + className: classesPopover.trigger, + }, + rest, + ); + + return element ? element(attributes) : <button {...attributes}>{children}</button>; +} diff --git a/packages/skeleton-react/src/components/popover/index.ts b/packages/skeleton-react/src/components/popover/index.ts new file mode 100644 index 0000000000..a9346acac4 --- /dev/null +++ b/packages/skeleton-react/src/components/popover/index.ts @@ -0,0 +1,11 @@ +export type { PopoverCloseTriggerProps } from './anatomy/close-trigger'; +export type { PopoverContentProps } from './anatomy/content'; +export type { PopoverDescriptionProps } from './anatomy/description'; +export type { PopoverPositionerProps } from './anatomy/positioner'; +export type { PopoverRootProps } from './anatomy/root'; +export type { PopoverRootContextProps } from './anatomy/root-context'; +export type { PopoverRootProviderProps } from './anatomy/root-provider'; +export type { PopoverTitleProps } from './anatomy/title'; +export type { PopoverTriggerProps } from './anatomy/trigger'; +export { Popover } from './modules/anatomy'; +export { usePopover } from './modules/provider'; diff --git a/packages/skeleton-react/src/components/popover/modules/anatomy.ts b/packages/skeleton-react/src/components/popover/modules/anatomy.ts new file mode 100644 index 0000000000..9aa0faeca7 --- /dev/null +++ b/packages/skeleton-react/src/components/popover/modules/anatomy.ts @@ -0,0 +1,24 @@ +import Arrow from '../anatomy/arrow'; +import ArrowTip from '../anatomy/arrow-tip'; +import CloseTrigger from '../anatomy/close-trigger'; +import Content from '../anatomy/content'; +import Description from '../anatomy/description'; +import Positioner from '../anatomy/positioner'; +import Root from '../anatomy/root'; +import RootContext from '../anatomy/root-context'; +import RootProvider from '../anatomy/root-provider'; +import Title from '../anatomy/title'; +import Trigger from '../anatomy/trigger'; + +export const Popover = Object.assign(Root, { + Provider: RootProvider, + Context: RootContext, + Trigger: Trigger, + Positioner: Positioner, + Content: Content, + Arrow: Arrow, + ArrowTip: ArrowTip, + Title: Title, + Description: Description, + CloseTrigger: CloseTrigger, +}); diff --git a/packages/skeleton-react/src/components/popover/modules/provider.ts b/packages/skeleton-react/src/components/popover/modules/provider.ts new file mode 100644 index 0000000000..7b06bf58cc --- /dev/null +++ b/packages/skeleton-react/src/components/popover/modules/provider.ts @@ -0,0 +1,11 @@ +import { type Api, connect, machine, type Props } from '@zag-js/popover'; +import { normalizeProps, useMachine, type PropTypes } from '@zag-js/react'; +import { useId } from 'react'; + +export function usePopover(props: Omit<Props, 'id'> = {}): Api<PropTypes> { + const service = useMachine(machine, { + id: useId(), + ...props, + }); + return connect(service, normalizeProps); +} diff --git a/packages/skeleton-react/src/components/popover/modules/root-context.ts b/packages/skeleton-react/src/components/popover/modules/root-context.ts new file mode 100644 index 0000000000..37bea00681 --- /dev/null +++ b/packages/skeleton-react/src/components/popover/modules/root-context.ts @@ -0,0 +1,4 @@ +import type { usePopover } from './provider'; +import { createContext } from '@/internal/create-context'; + +export const RootContext = createContext<ReturnType<typeof usePopover>>(); diff --git a/packages/skeleton-react/src/components/portal/anatomy/root.tsx b/packages/skeleton-react/src/components/portal/anatomy/root.tsx new file mode 100644 index 0000000000..190d3294c0 --- /dev/null +++ b/packages/skeleton-react/src/components/portal/anatomy/root.tsx @@ -0,0 +1,25 @@ +import { Children, type PropsWithChildren } from 'react'; +import { createPortal } from 'react-dom'; + +export interface PortalRootProps extends Required<PropsWithChildren> { + /** + * If true, the portal functionality is disabled and children are rendered in place. + * + * @default false + */ + disabled?: boolean; + /** + * The HTML element to which the portal content will be appended. + * + * @default document.body + */ + target?: HTMLElement; +} + +export default function Root(props: PortalRootProps) { + const { children, disabled = false, target = typeof window === 'undefined' ? undefined : document.body } = props; + if (disabled || !target) { + return <>{children}</>; + } + return <>{Children.map(children, (child) => createPortal(child, target))}</>; +} diff --git a/packages/skeleton-react/src/components/portal/index.ts b/packages/skeleton-react/src/components/portal/index.ts new file mode 100644 index 0000000000..53109c81df --- /dev/null +++ b/packages/skeleton-react/src/components/portal/index.ts @@ -0,0 +1,2 @@ +export { Portal } from './modules/anatomy'; +export type { PortalRootProps } from './anatomy/root'; diff --git a/packages/skeleton-react/src/components/portal/modules/anatomy.ts b/packages/skeleton-react/src/components/portal/modules/anatomy.ts new file mode 100644 index 0000000000..aca76655c2 --- /dev/null +++ b/packages/skeleton-react/src/components/portal/modules/anatomy.ts @@ -0,0 +1,3 @@ +import Root from '../anatomy/root'; + +export const Portal = Root; diff --git a/packages/skeleton-react/src/components/progress-linear/anatomy/label.tsx b/packages/skeleton-react/src/components/progress-linear/anatomy/label.tsx new file mode 100644 index 0000000000..89a675ca5b --- /dev/null +++ b/packages/skeleton-react/src/components/progress-linear/anatomy/label.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesProgressLinear } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface ProgressLinearLabelProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} + +export default function Label(props: ProgressLinearLabelProps) { + const progressLinear = use(RootContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + progressLinear.getLabelProps(), + { + className: classesProgressLinear.label, + }, + rest, + ); + + return element ? element(attributes) : <div {...attributes}>{children}</div>; +} diff --git a/packages/skeleton-react/src/components/progress-linear/anatomy/range.tsx b/packages/skeleton-react/src/components/progress-linear/anatomy/range.tsx new file mode 100644 index 0000000000..9cfcb9f918 --- /dev/null +++ b/packages/skeleton-react/src/components/progress-linear/anatomy/range.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesProgressLinear } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface ProgressLinearRangeProps extends PropsWithElement<'div'>, HTMLAttributes<'div', 'children'> {} + +export default function Range(props: ProgressLinearRangeProps) { + const progressLinear = use(RootContext); + + const { element, ...rest } = props; + + const attributes = mergeProps( + progressLinear.getRangeProps(), + { + className: classesProgressLinear.range, + }, + rest, + ); + + return element ? element(attributes) : <div {...attributes} />; +} diff --git a/packages/skeleton-react/src/components/progress-linear/anatomy/root-context.tsx b/packages/skeleton-react/src/components/progress-linear/anatomy/root-context.tsx new file mode 100644 index 0000000000..c1c8d29d20 --- /dev/null +++ b/packages/skeleton-react/src/components/progress-linear/anatomy/root-context.tsx @@ -0,0 +1,16 @@ +import type { useProgressLinear } from '../modules/provider'; +import { RootContext as RootContext_ } from '../modules/root-context'; +import { use } from 'react'; +import type { ReactNode } from 'react'; + +export interface ProgressLinearRootContextProps { + children: (progressLinear: ReturnType<typeof useProgressLinear>) => ReactNode; +} + +export default function RootContext(props: ProgressLinearRootContextProps) { + const progressLinear = use(RootContext_); + + const { children } = props; + + return children(progressLinear); +} diff --git a/packages/skeleton-react/src/components/progress-linear/anatomy/root-provider.tsx b/packages/skeleton-react/src/components/progress-linear/anatomy/root-provider.tsx new file mode 100644 index 0000000000..1a165a237e --- /dev/null +++ b/packages/skeleton-react/src/components/progress-linear/anatomy/root-provider.tsx @@ -0,0 +1,28 @@ +import type { useProgressLinear } from '../modules/provider'; +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesProgressLinear } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; + +export interface ProgressLinearRootProviderProps extends PropsWithElement<'div'>, HTMLAttributes<'div', 'id' | 'dir' | 'defaultValue'> { + value: ReturnType<typeof useProgressLinear>; +} + +export default function RootProvider(props: ProgressLinearRootProviderProps) { + const { element, children, value: progressLinear, ...rest } = props; + + const attributes = mergeProps( + progressLinear.getRootProps(), + { + className: classesProgressLinear.root, + }, + rest, + ); + + return ( + <RootContext.Provider value={progressLinear}> + {element ? element(attributes) : <div {...attributes}>{children}</div>} + </RootContext.Provider> + ); +} diff --git a/packages/skeleton-react/src/components/progress-linear/anatomy/root.tsx b/packages/skeleton-react/src/components/progress-linear/anatomy/root.tsx new file mode 100644 index 0000000000..ec4128244a --- /dev/null +++ b/packages/skeleton-react/src/components/progress-linear/anatomy/root.tsx @@ -0,0 +1,34 @@ +import { useProgressLinear } from '../modules/provider'; +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesProgressLinear } from '@skeletonlabs/skeleton-common'; +import { splitProps } from '@zag-js/progress'; +import type { Props } from '@zag-js/progress'; +import { mergeProps } from '@zag-js/react'; + +export interface ProgressLinearRootProps + extends Omit<Props, 'id'>, + PropsWithElement<'div'>, + HTMLAttributes<'div', 'id' | 'dir' | 'defaultValue'> {} + +export default function Root(props: ProgressLinearRootProps) { + const [progressLinearProps, componentProps] = splitProps(props); + const { element, children, ...rest } = componentProps; + + const progressLinear = useProgressLinear(progressLinearProps); + + const attributes = mergeProps( + progressLinear.getRootProps(), + { + className: classesProgressLinear.root, + }, + rest, + ); + + return ( + <RootContext.Provider value={progressLinear}> + {element ? element(attributes) : <div {...attributes}>{children}</div>} + </RootContext.Provider> + ); +} diff --git a/packages/skeleton-react/src/components/progress-linear/anatomy/track.tsx b/packages/skeleton-react/src/components/progress-linear/anatomy/track.tsx new file mode 100644 index 0000000000..ab360a5367 --- /dev/null +++ b/packages/skeleton-react/src/components/progress-linear/anatomy/track.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesProgressLinear } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface ProgressLinearTrackProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} + +export default function Track(props: ProgressLinearTrackProps) { + const progressLinear = use(RootContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + progressLinear.getTrackProps(), + { + className: classesProgressLinear.track, + }, + rest, + ); + + return element ? element(attributes) : <div {...attributes}>{children}</div>; +} diff --git a/packages/skeleton-react/src/components/progress-linear/index.ts b/packages/skeleton-react/src/components/progress-linear/index.ts new file mode 100644 index 0000000000..64ded78953 --- /dev/null +++ b/packages/skeleton-react/src/components/progress-linear/index.ts @@ -0,0 +1,8 @@ +export type { ProgressLinearLabelProps } from './anatomy/label'; +export type { ProgressLinearRangeProps } from './anatomy/range'; +export type { ProgressLinearRootProps } from './anatomy/root'; +export type { ProgressLinearRootContextProps } from './anatomy/root-context'; +export type { ProgressLinearRootProviderProps } from './anatomy/root-provider'; +export type { ProgressLinearTrackProps } from './anatomy/track'; +export { ProgressLinear } from './modules/anatomy'; +export { useProgressLinear } from './modules/provider'; diff --git a/packages/skeleton-react/src/components/progress-linear/modules/anatomy.ts b/packages/skeleton-react/src/components/progress-linear/modules/anatomy.ts new file mode 100644 index 0000000000..766220c0ff --- /dev/null +++ b/packages/skeleton-react/src/components/progress-linear/modules/anatomy.ts @@ -0,0 +1,14 @@ +import Label from '../anatomy/label'; +import Range from '../anatomy/range'; +import Root from '../anatomy/root'; +import RootContext from '../anatomy/root-context'; +import RootProvider from '../anatomy/root-provider'; +import Track from '../anatomy/track'; + +export const ProgressLinear = Object.assign(Root, { + Provider: RootProvider, + Context: RootContext, + Label: Label, + Track: Track, + Range: Range, +}); diff --git a/packages/skeleton-react/src/components/progress-linear/modules/provider.ts b/packages/skeleton-react/src/components/progress-linear/modules/provider.ts new file mode 100644 index 0000000000..0574f04a04 --- /dev/null +++ b/packages/skeleton-react/src/components/progress-linear/modules/provider.ts @@ -0,0 +1,12 @@ +import { connect, machine } from '@zag-js/progress'; +import type { Api, Props } from '@zag-js/progress'; +import { normalizeProps, useMachine, type PropTypes } from '@zag-js/react'; +import { useId } from 'react'; + +export function useProgressLinear(props: Omit<Props, 'id'> = {}): Api<PropTypes> { + const service = useMachine(machine, { + id: useId(), + ...props, + }); + return connect(service, normalizeProps); +} diff --git a/packages/skeleton-react/src/components/progress-linear/modules/root-context.ts b/packages/skeleton-react/src/components/progress-linear/modules/root-context.ts new file mode 100644 index 0000000000..5a9642cbca --- /dev/null +++ b/packages/skeleton-react/src/components/progress-linear/modules/root-context.ts @@ -0,0 +1,4 @@ +import type { useProgressLinear } from './provider'; +import { createContext } from '@/internal/create-context'; + +export const RootContext = createContext<ReturnType<typeof useProgressLinear>>(); diff --git a/packages/skeleton-react/src/components/rating-group/anatomy/control.tsx b/packages/skeleton-react/src/components/rating-group/anatomy/control.tsx new file mode 100644 index 0000000000..6c8f675a6c --- /dev/null +++ b/packages/skeleton-react/src/components/rating-group/anatomy/control.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesRatingGroup } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface RatingGroupControlProps extends PropsWithElement<'div'>, HTMLAttributes<'div', 'id' | 'dir'> {} + +export default function Control(props: RatingGroupControlProps) { + const ratingGroup = use(RootContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + ratingGroup.getControlProps(), + { + className: classesRatingGroup.control, + }, + rest, + ); + + return element ? element(attributes) : <div {...attributes}>{children}</div>; +} diff --git a/packages/skeleton-react/src/components/rating-group/anatomy/hidden-input.tsx b/packages/skeleton-react/src/components/rating-group/anatomy/hidden-input.tsx new file mode 100644 index 0000000000..127c358c8d --- /dev/null +++ b/packages/skeleton-react/src/components/rating-group/anatomy/hidden-input.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesRatingGroup } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface RatingGroupHiddenInputProps extends PropsWithElement<'input'>, HTMLAttributes<'input', 'id' | 'dir' | 'children'> {} + +export default function HiddenInput(props: RatingGroupHiddenInputProps) { + const ratingGroup = use(RootContext); + + const { element, ...rest } = props; + + const attributes = mergeProps( + ratingGroup.getHiddenInputProps(), + { + className: classesRatingGroup.hiddenInput, + }, + rest, + ); + + return element ? element(attributes) : <input {...attributes} />; +} diff --git a/packages/skeleton-react/src/components/rating-group/anatomy/item.tsx b/packages/skeleton-react/src/components/rating-group/anatomy/item.tsx new file mode 100644 index 0000000000..5b13cfaabc --- /dev/null +++ b/packages/skeleton-react/src/components/rating-group/anatomy/item.tsx @@ -0,0 +1,56 @@ +import { RootContext } from '../modules/root-context'; +import StarEmpty from '@/internal/components/star-empty'; +import StarFull from '@/internal/components/star-full'; +import StarHalf from '@/internal/components/star-half'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesRatingGroup } from '@skeletonlabs/skeleton-common'; +import { splitItemProps } from '@zag-js/rating-group'; +import type { ItemProps } from '@zag-js/rating-group'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; +import type { ReactNode } from 'react'; + +export interface RatingGroupItemProps extends ItemProps, PropsWithElement<'span'>, HTMLAttributes<'span', 'id' | 'dir'> { + /** + * The content to render when the item is in the empty state. + * + * @default StarEmpty (SVG) + */ + empty?: ReactNode; + /** + * The content to render when the item is in the half state. + * + * @default StarHalf (SVG) + */ + half?: ReactNode; + /** + * The content to render when the item is in the full state. + * + * @default StarFull (SVG) + */ + full?: ReactNode; +} + +export default function Item(props: RatingGroupItemProps) { + const ratingGroup = use(RootContext); + + const [itemProps, componentProps] = splitItemProps(props); + const { element, children, empty = <StarEmpty />, half = <StarHalf />, full = <StarFull />, ...rest } = componentProps; + + const itemState = ratingGroup.getItemState(itemProps); + + const attributes = mergeProps( + ratingGroup.getItemProps(itemProps), + { + className: classesRatingGroup.item, + }, + rest, + ); + + return element ? ( + element(attributes) + ) : ( + <div {...attributes}>{children ? children : !itemState.highlighted ? empty : itemState.half ? half : full}</div> + ); +} diff --git a/packages/skeleton-react/src/components/rating-group/anatomy/label.tsx b/packages/skeleton-react/src/components/rating-group/anatomy/label.tsx new file mode 100644 index 0000000000..d6d996448a --- /dev/null +++ b/packages/skeleton-react/src/components/rating-group/anatomy/label.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesRatingGroup } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface RatingGroupLabelProps extends PropsWithElement<'label'>, HTMLAttributes<'label', 'id' | 'dir'> {} + +export default function Label(props: RatingGroupLabelProps) { + const ratingGroup = use(RootContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + ratingGroup.getLabelProps(), + { + className: classesRatingGroup.label, + }, + rest, + ); + + return element ? element(attributes) : <label {...attributes}>{children}</label>; +} diff --git a/packages/skeleton-react/src/components/rating-group/anatomy/root-context.tsx b/packages/skeleton-react/src/components/rating-group/anatomy/root-context.tsx new file mode 100644 index 0000000000..2627491bed --- /dev/null +++ b/packages/skeleton-react/src/components/rating-group/anatomy/root-context.tsx @@ -0,0 +1,16 @@ +import type { useRatingGroup } from '../modules/provider'; +import { RootContext as RootContext_ } from '../modules/root-context'; +import { use } from 'react'; +import type { ReactNode } from 'react'; + +export interface RatingGroupRootContextProps { + children: (ratingGroup: ReturnType<typeof useRatingGroup>) => ReactNode; +} + +export default function RootContext(props: RatingGroupRootContextProps) { + const ratingGroup = use(RootContext_); + + const { children } = props; + + return children(ratingGroup); +} diff --git a/packages/skeleton-react/src/components/rating-group/anatomy/root-provider.tsx b/packages/skeleton-react/src/components/rating-group/anatomy/root-provider.tsx new file mode 100644 index 0000000000..9cdd31ea1d --- /dev/null +++ b/packages/skeleton-react/src/components/rating-group/anatomy/root-provider.tsx @@ -0,0 +1,26 @@ +import type { useRatingGroup } from '../modules/provider'; +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesRatingGroup } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; + +export interface RatingGroupRootProviderProps extends PropsWithElement<'div'>, HTMLAttributes<'div', 'id' | 'dir' | 'defaultValue'> { + value: ReturnType<typeof useRatingGroup>; +} + +export default function RootProvider(props: RatingGroupRootProviderProps) { + const { element, children, value: ratingGroup, ...rest } = props; + + const attributes = mergeProps( + ratingGroup.getRootProps(), + { + className: classesRatingGroup.root, + }, + rest, + ); + + return ( + <RootContext.Provider value={ratingGroup}>{element ? element(attributes) : <div {...attributes}>{children}</div>}</RootContext.Provider> + ); +} diff --git a/packages/skeleton-react/src/components/rating-group/anatomy/root.tsx b/packages/skeleton-react/src/components/rating-group/anatomy/root.tsx new file mode 100644 index 0000000000..b0cf5c78c3 --- /dev/null +++ b/packages/skeleton-react/src/components/rating-group/anatomy/root.tsx @@ -0,0 +1,32 @@ +import { useRatingGroup } from '../modules/provider'; +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesRatingGroup } from '@skeletonlabs/skeleton-common'; +import { splitProps } from '@zag-js/rating-group'; +import type { Props } from '@zag-js/rating-group'; +import { mergeProps } from '@zag-js/react'; + +export interface RatingGroupRootProps + extends Omit<Props, 'id'>, + PropsWithElement<'div'>, + HTMLAttributes<'div', 'id' | 'dir' | 'defaultValue'> {} + +export default function Root(props: RatingGroupRootProps) { + const [ratingGroupProps, componentProps] = splitProps(props); + const { element, children, ...rest } = componentProps; + + const ratingGroup = useRatingGroup(ratingGroupProps); + + const attributes = mergeProps( + ratingGroup.getRootProps(), + { + className: classesRatingGroup.root, + }, + rest, + ); + + return ( + <RootContext.Provider value={ratingGroup}>{element ? element(attributes) : <div {...attributes}>{children}</div>}</RootContext.Provider> + ); +} diff --git a/packages/skeleton-react/src/components/rating-group/index.ts b/packages/skeleton-react/src/components/rating-group/index.ts new file mode 100644 index 0000000000..6712bc06f6 --- /dev/null +++ b/packages/skeleton-react/src/components/rating-group/index.ts @@ -0,0 +1,9 @@ +export type { RatingGroupControlProps } from './anatomy/control'; +export type { RatingGroupHiddenInputProps } from './anatomy/hidden-input'; +export type { RatingGroupItemProps } from './anatomy/item'; +export type { RatingGroupLabelProps } from './anatomy/label'; +export type { RatingGroupRootProps } from './anatomy/root'; +export type { RatingGroupRootContextProps } from './anatomy/root-context'; +export type { RatingGroupRootProviderProps } from './anatomy/root-provider'; +export { RatingGroup } from './modules/anatomy'; +export { useRatingGroup } from './modules/provider'; diff --git a/packages/skeleton-react/src/components/rating-group/modules/anatomy.ts b/packages/skeleton-react/src/components/rating-group/modules/anatomy.ts new file mode 100644 index 0000000000..2f985c191f --- /dev/null +++ b/packages/skeleton-react/src/components/rating-group/modules/anatomy.ts @@ -0,0 +1,18 @@ +import Control from '../anatomy/control'; +import HiddenInput from '../anatomy/hidden-input'; +import Item from '../anatomy/item'; +import Label from '../anatomy/label'; +import Root from '../anatomy/root'; +import RootContext from '../anatomy/root-context'; +import RootProvider from '../anatomy/root-provider'; + +const RatingGroup = Object.assign(Root, { + Provider: RootProvider, + Context: RootContext, + Label: Label, + Control: Control, + Item: Item, + HiddenInput: HiddenInput, +}); + +export { RatingGroup }; diff --git a/packages/skeleton-react/src/components/rating-group/modules/provider.ts b/packages/skeleton-react/src/components/rating-group/modules/provider.ts new file mode 100644 index 0000000000..fdeeff151c --- /dev/null +++ b/packages/skeleton-react/src/components/rating-group/modules/provider.ts @@ -0,0 +1,12 @@ +import { connect, machine } from '@zag-js/rating-group'; +import type { Api, Props } from '@zag-js/rating-group'; +import { normalizeProps, useMachine, type PropTypes } from '@zag-js/react'; +import { useId } from 'react'; + +export function useRatingGroup(props: Omit<Props, 'id'> = {}): Api<PropTypes> { + const service = useMachine(machine, { + id: useId(), + ...props, + }); + return connect(service, normalizeProps); +} diff --git a/packages/skeleton-react/src/components/rating-group/modules/root-context.ts b/packages/skeleton-react/src/components/rating-group/modules/root-context.ts new file mode 100644 index 0000000000..5bc66297e6 --- /dev/null +++ b/packages/skeleton-react/src/components/rating-group/modules/root-context.ts @@ -0,0 +1,4 @@ +import type { useRatingGroup } from './provider'; +import { createContext } from '@/internal/create-context'; + +export const RootContext = createContext<ReturnType<typeof useRatingGroup>>(); diff --git a/packages/skeleton-react/src/components/segmented-control/anatomy/indicator.tsx b/packages/skeleton-react/src/components/segmented-control/anatomy/indicator.tsx new file mode 100644 index 0000000000..4dcc5e7640 --- /dev/null +++ b/packages/skeleton-react/src/components/segmented-control/anatomy/indicator.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesSegmentedControl } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface SegmentedControlIndicatorProps extends PropsWithElement<'div'>, HTMLAttributes<'div', 'children'> {} + +export default function Indicator(props: SegmentedControlIndicatorProps) { + const segmentedControl = use(RootContext); + + const { element, ...rest } = props; + + const attributes = mergeProps( + segmentedControl.getIndicatorProps(), + { + className: classesSegmentedControl.indicator, + }, + rest, + ); + + return element ? element(attributes) : <div {...attributes} />; +} diff --git a/packages/skeleton-react/src/components/segmented-control/anatomy/item-hidden-input.tsx b/packages/skeleton-react/src/components/segmented-control/anatomy/item-hidden-input.tsx new file mode 100644 index 0000000000..56de208418 --- /dev/null +++ b/packages/skeleton-react/src/components/segmented-control/anatomy/item-hidden-input.tsx @@ -0,0 +1,26 @@ +import { ItemContext } from '../modules/item-context'; +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesSegmentedControl } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface SegmentedControlItemHiddenInputProps extends PropsWithElement<'input'>, HTMLAttributes<'input', 'children'> {} + +export default function ItemHiddenInput(props: SegmentedControlItemHiddenInputProps) { + const segmentedControl = use(RootContext); + const itemProps = use(ItemContext); + + const { element, ...rest } = props; + + const attributes = mergeProps( + segmentedControl.getItemHiddenInputProps(itemProps), + { + className: classesSegmentedControl.itemHiddenInput, + }, + rest, + ); + + return element ? element(attributes) : <input {...attributes} />; +} diff --git a/packages/skeleton-react/src/components/segmented-control/anatomy/item-text.tsx b/packages/skeleton-react/src/components/segmented-control/anatomy/item-text.tsx new file mode 100644 index 0000000000..7768d8989d --- /dev/null +++ b/packages/skeleton-react/src/components/segmented-control/anatomy/item-text.tsx @@ -0,0 +1,26 @@ +import { ItemContext } from '../modules/item-context'; +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesSegmentedControl } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface SegmentedControlItemTextProps extends PropsWithElement<'span'>, HTMLAttributes<'span'> {} + +export default function ItemText(props: SegmentedControlItemTextProps) { + const segmentedControl = use(RootContext); + const itemProps = use(ItemContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + segmentedControl.getItemTextProps(itemProps), + { + className: classesSegmentedControl.itemText, + }, + rest, + ); + + return element ? element(attributes) : <span {...attributes}>{children}</span>; +} diff --git a/packages/skeleton-react/src/components/segmented-control/anatomy/item.tsx b/packages/skeleton-react/src/components/segmented-control/anatomy/item.tsx new file mode 100644 index 0000000000..5f95d70748 --- /dev/null +++ b/packages/skeleton-react/src/components/segmented-control/anatomy/item.tsx @@ -0,0 +1,31 @@ +import { ItemContext } from '../modules/item-context'; +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesSegmentedControl } from '@skeletonlabs/skeleton-common'; +import { splitItemProps, type ItemProps } from '@zag-js/radio-group'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface SegmentedControlItemProps extends ItemProps, PropsWithElement<'label'>, HTMLAttributes<'label'> {} + +export default function Item(props: SegmentedControlItemProps) { + const segmentedControl = use(RootContext); + + const [itemProps, componentProps] = splitItemProps(props); + const { element, children, ...rest } = componentProps; + + const attributes = mergeProps( + segmentedControl.getItemProps(itemProps), + { + className: classesSegmentedControl.item, + }, + rest, + ); + + return ( + <ItemContext.Provider value={itemProps}> + {element ? element(attributes) : <label {...attributes}>{children}</label>} + </ItemContext.Provider> + ); +} diff --git a/packages/skeleton-react/src/components/segmented-control/anatomy/root-context.tsx b/packages/skeleton-react/src/components/segmented-control/anatomy/root-context.tsx new file mode 100644 index 0000000000..363b763d54 --- /dev/null +++ b/packages/skeleton-react/src/components/segmented-control/anatomy/root-context.tsx @@ -0,0 +1,16 @@ +import type { useSegmentedControl } from '../modules/provider'; +import { RootContext as RootContext_ } from '../modules/root-context'; +import { use } from 'react'; +import type { ReactNode } from 'react'; + +export interface SegmentedControlRootContextProps { + children: (ratingGroup: ReturnType<typeof useSegmentedControl>) => ReactNode; +} + +export default function RootContext(props: SegmentedControlRootContextProps) { + const segmentedControl = use(RootContext_); + + const { children } = props; + + return children(segmentedControl); +} diff --git a/packages/skeleton-react/src/components/segmented-control/anatomy/root-provider.tsx b/packages/skeleton-react/src/components/segmented-control/anatomy/root-provider.tsx new file mode 100644 index 0000000000..6330d8f496 --- /dev/null +++ b/packages/skeleton-react/src/components/segmented-control/anatomy/root-provider.tsx @@ -0,0 +1,28 @@ +import type { useSegmentedControl } from '../modules/provider'; +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesSegmentedControl } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; + +export interface SegmentedControlRootProviderProps extends PropsWithElement<'div'>, HTMLAttributes<'div', 'id' | 'dir' | 'defaultValue'> { + value: ReturnType<typeof useSegmentedControl>; +} + +export default function RootProvider(props: SegmentedControlRootProviderProps) { + const { element, children, value: segmentedControl, ...rest } = props; + + const attributes = mergeProps( + segmentedControl.getRootProps(), + { + className: classesSegmentedControl.root, + }, + rest, + ); + + return ( + <RootContext.Provider value={segmentedControl}> + {element ? element(attributes) : <div {...attributes}>{children}</div>} + </RootContext.Provider> + ); +} diff --git a/packages/skeleton-react/src/components/segmented-control/anatomy/root.tsx b/packages/skeleton-react/src/components/segmented-control/anatomy/root.tsx new file mode 100644 index 0000000000..2ef38dcea1 --- /dev/null +++ b/packages/skeleton-react/src/components/segmented-control/anatomy/root.tsx @@ -0,0 +1,34 @@ +import { useSegmentedControl } from '../modules/provider'; +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesSegmentedControl } from '@skeletonlabs/skeleton-common'; +import { splitProps } from '@zag-js/radio-group'; +import type { Props } from '@zag-js/radio-group'; +import { mergeProps } from '@zag-js/react'; + +export interface SegmentedControlRootProps + extends Omit<Props, 'id'>, + PropsWithElement<'div'>, + HTMLAttributes<'div', 'id' | 'dir' | 'defaultValue'> {} + +export default function Root(props: SegmentedControlRootProps) { + const [segmentedControlProps, componentProps] = splitProps(props); + const { element, children, ...rest } = componentProps; + + const segmentedControl = useSegmentedControl(segmentedControlProps); + + const attributes = mergeProps( + segmentedControl.getRootProps(), + { + className: classesSegmentedControl.root, + }, + rest, + ); + + return ( + <RootContext.Provider value={segmentedControl}> + {element ? element(attributes) : <div {...attributes}>{children}</div>} + </RootContext.Provider> + ); +} diff --git a/packages/skeleton-react/src/components/segmented-control/index.ts b/packages/skeleton-react/src/components/segmented-control/index.ts new file mode 100644 index 0000000000..27e2eb8fd1 --- /dev/null +++ b/packages/skeleton-react/src/components/segmented-control/index.ts @@ -0,0 +1,9 @@ +export { SegmentedControl } from './modules/anatomy'; +export { useSegmentedControl } from './modules/provider'; +export type { SegmentedControlRootProps } from './anatomy/root'; +export type { SegmentedControlRootContextProps } from './anatomy/root-context'; +export type { SegmentedControlRootProviderProps } from './anatomy/root-provider'; +export type { SegmentedControlIndicatorProps } from './anatomy/indicator'; +export type { SegmentedControlItemProps } from './anatomy/item'; +export type { SegmentedControlItemTextProps } from './anatomy/item-text'; +export type { SegmentedControlItemHiddenInputProps } from './anatomy/item-hidden-input'; diff --git a/packages/skeleton-react/src/components/segmented-control/modules/anatomy.ts b/packages/skeleton-react/src/components/segmented-control/modules/anatomy.ts new file mode 100644 index 0000000000..834642e16f --- /dev/null +++ b/packages/skeleton-react/src/components/segmented-control/modules/anatomy.ts @@ -0,0 +1,16 @@ +import Indicator from '../anatomy/indicator'; +import Item from '../anatomy/item'; +import ItemHiddenInput from '../anatomy/item-hidden-input'; +import ItemText from '../anatomy/item-text'; +import Root from '../anatomy/root'; +import RootContext from '../anatomy/root-context'; +import RootProvider from '../anatomy/root-provider'; + +export const SegmentedControl = Object.assign(Root, { + Provider: RootProvider, + Context: RootContext, + Indicator: Indicator, + Item: Item, + ItemText: ItemText, + ItemHiddenInput: ItemHiddenInput, +}); diff --git a/packages/skeleton-react/src/components/segmented-control/modules/item-context.ts b/packages/skeleton-react/src/components/segmented-control/modules/item-context.ts new file mode 100644 index 0000000000..f4f734410b --- /dev/null +++ b/packages/skeleton-react/src/components/segmented-control/modules/item-context.ts @@ -0,0 +1,4 @@ +import { createContext } from '@/internal/create-context'; +import type { ItemProps } from '@zag-js/radio-group'; + +export const ItemContext = createContext<ItemProps>(); diff --git a/packages/skeleton-react/src/components/segmented-control/modules/provider.ts b/packages/skeleton-react/src/components/segmented-control/modules/provider.ts new file mode 100644 index 0000000000..bcc307b942 --- /dev/null +++ b/packages/skeleton-react/src/components/segmented-control/modules/provider.ts @@ -0,0 +1,13 @@ +import { connect, machine } from '@zag-js/radio-group'; +import type { Api, Props } from '@zag-js/radio-group'; +import { normalizeProps, useMachine, type PropTypes } from '@zag-js/react'; +import { useId } from 'react'; + +export function useSegmentedControl(props: Omit<Props, 'id'> = {}): Api<PropTypes> { + const service = useMachine(machine, { + id: useId(), + orientation: 'horizontal', + ...props, + }); + return connect(service, normalizeProps); +} diff --git a/packages/skeleton-react/src/components/segmented-control/modules/root-context.ts b/packages/skeleton-react/src/components/segmented-control/modules/root-context.ts new file mode 100644 index 0000000000..5afd012109 --- /dev/null +++ b/packages/skeleton-react/src/components/segmented-control/modules/root-context.ts @@ -0,0 +1,4 @@ +import type { useSegmentedControl } from './provider'; +import { createContext } from '@/internal/create-context'; + +export const RootContext = createContext<ReturnType<typeof useSegmentedControl>>(); diff --git a/packages/skeleton-react/src/components/slider/anatomy/control.tsx b/packages/skeleton-react/src/components/slider/anatomy/control.tsx new file mode 100644 index 0000000000..1bea03cd59 --- /dev/null +++ b/packages/skeleton-react/src/components/slider/anatomy/control.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesSlider } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface SliderControlProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} + +export default function Control(props: SliderControlProps) { + const slider = use(RootContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + slider.getControlProps(), + { + className: classesSlider.control, + }, + rest, + ); + + return element ? element(attributes) : <div {...attributes}>{children}</div>; +} diff --git a/packages/skeleton-react/src/components/slider/anatomy/hidden-input.tsx b/packages/skeleton-react/src/components/slider/anatomy/hidden-input.tsx new file mode 100644 index 0000000000..ad09fe3dcc --- /dev/null +++ b/packages/skeleton-react/src/components/slider/anatomy/hidden-input.tsx @@ -0,0 +1,26 @@ +import { RootContext } from '../modules/root-context'; +import { ThumbContext } from '../modules/thumb-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesSlider } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface SliderHiddenInputProps extends PropsWithElement<'input'>, HTMLAttributes<'input', 'children'> {} + +export default function HiddenInput(props: SliderHiddenInputProps) { + const slider = use(RootContext); + const thumbProps = use(ThumbContext); + + const { element, ...rest } = props; + + const attributes = mergeProps( + slider.getHiddenInputProps(thumbProps), + { + className: classesSlider.hiddenInput, + }, + rest, + ); + + return element ? element(attributes) : <input {...attributes} />; +} diff --git a/packages/skeleton-react/src/components/slider/anatomy/label.tsx b/packages/skeleton-react/src/components/slider/anatomy/label.tsx new file mode 100644 index 0000000000..0c2daff5a9 --- /dev/null +++ b/packages/skeleton-react/src/components/slider/anatomy/label.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesSlider } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface SliderLabelProps extends PropsWithElement<'label'>, HTMLAttributes<'label'> {} + +export default function Label(props: SliderLabelProps) { + const slider = use(RootContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + slider.getLabelProps(), + { + className: classesSlider.label, + }, + rest, + ); + + return element ? element(attributes) : <label {...attributes}>{children}</label>; +} diff --git a/packages/skeleton-react/src/components/slider/anatomy/marker-group.tsx b/packages/skeleton-react/src/components/slider/anatomy/marker-group.tsx new file mode 100644 index 0000000000..3622b90b2f --- /dev/null +++ b/packages/skeleton-react/src/components/slider/anatomy/marker-group.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesSlider } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface SliderMarkerGroupProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} + +export default function MarkerGroup(props: SliderMarkerGroupProps) { + const slider = use(RootContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + slider.getMarkerGroupProps(), + { + className: classesSlider.markerGroup, + }, + rest, + ); + + return element ? element(attributes) : <div {...attributes}>{children}</div>; +} diff --git a/packages/skeleton-react/src/components/slider/anatomy/marker.tsx b/packages/skeleton-react/src/components/slider/anatomy/marker.tsx new file mode 100644 index 0000000000..cdaa62b8ee --- /dev/null +++ b/packages/skeleton-react/src/components/slider/anatomy/marker.tsx @@ -0,0 +1,26 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesSlider } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import type { MarkerProps } from '@zag-js/slider'; +import { use } from 'react'; + +export interface SliderMarkerProps extends MarkerProps, PropsWithElement<'div'>, HTMLAttributes<'div'> {} + +export default function Marker(props: SliderMarkerProps) { + const slider = use(RootContext); + + // TODO: Split `markerProps` from `props` using the missing `splitMarkerProps` function: https://github.com/chakra-ui/zag/issues/2725 + const { element, children, value, ...rest } = props; + + const attributes = mergeProps( + slider.getMarkerProps({ value }), + { + className: classesSlider.marker, + }, + rest, + ); + + return element ? element(attributes) : <div {...attributes}>{children ?? value}</div>; +} diff --git a/packages/skeleton-react/src/components/slider/anatomy/range.tsx b/packages/skeleton-react/src/components/slider/anatomy/range.tsx new file mode 100644 index 0000000000..12467333e5 --- /dev/null +++ b/packages/skeleton-react/src/components/slider/anatomy/range.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesSlider } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface SliderRangeProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} + +export default function Range(props: SliderRangeProps) { + const slider = use(RootContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + slider.getRangeProps(), + { + className: classesSlider.range, + }, + rest, + ); + + return element ? element(attributes) : <div {...attributes}>{children}</div>; +} diff --git a/packages/skeleton-react/src/components/slider/anatomy/root-context.tsx b/packages/skeleton-react/src/components/slider/anatomy/root-context.tsx new file mode 100644 index 0000000000..e96edbfa0c --- /dev/null +++ b/packages/skeleton-react/src/components/slider/anatomy/root-context.tsx @@ -0,0 +1,16 @@ +import type { useSlider } from '../modules/provider'; +import { RootContext as RootContext_ } from '../modules/root-context'; +import { use } from 'react'; +import type { ReactNode } from 'react'; + +export interface SliderRootContextProps { + children: (slider: ReturnType<typeof useSlider>) => ReactNode; +} + +export default function RootContext(props: SliderRootContextProps) { + const slider = use(RootContext_); + + const { children } = props; + + return children(slider); +} diff --git a/packages/skeleton-react/src/components/slider/anatomy/root-provider.tsx b/packages/skeleton-react/src/components/slider/anatomy/root-provider.tsx new file mode 100644 index 0000000000..ce5aed4831 --- /dev/null +++ b/packages/skeleton-react/src/components/slider/anatomy/root-provider.tsx @@ -0,0 +1,26 @@ +import type { useSlider } from '../modules/provider'; +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesSlider } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; + +export interface SliderRootProviderProps extends PropsWithElement<'div'>, HTMLAttributes<'div', 'id' | 'dir'> { + value: ReturnType<typeof useSlider>; +} + +export default function SliderRootProvider(props: SliderRootProviderProps) { + const { element, children, value: slider, ...rest } = props; + + const attributes = mergeProps( + slider.getRootProps(), + { + className: classesSlider.root, + }, + rest, + ); + + return ( + <RootContext.Provider value={slider}>{element ? element(attributes) : <div {...attributes}>{children}</div>}</RootContext.Provider> + ); +} diff --git a/packages/skeleton-react/src/components/slider/anatomy/root.tsx b/packages/skeleton-react/src/components/slider/anatomy/root.tsx new file mode 100644 index 0000000000..3e26ccced8 --- /dev/null +++ b/packages/skeleton-react/src/components/slider/anatomy/root.tsx @@ -0,0 +1,32 @@ +import { useSlider } from '../modules/provider'; +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesSlider } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { splitProps } from '@zag-js/slider'; +import type { Props } from '@zag-js/slider'; + +export interface SliderRootProps + extends Omit<Props, 'id'>, + PropsWithElement<'div'>, + HTMLAttributes<'div', 'id' | 'dir' | 'defaultValue' | 'aria-label' | 'aria-labelledby'> {} + +export default function SliderRoot(props: SliderRootProps) { + const [sliderProps, componentProps] = splitProps(props); + const { element, children, ...rest } = componentProps; + + const slider = useSlider(sliderProps); + + const attributes = mergeProps( + slider.getRootProps(), + { + className: classesSlider.root, + }, + rest, + ); + + return ( + <RootContext.Provider value={slider}>{element ? element(attributes) : <div {...attributes}>{children}</div>}</RootContext.Provider> + ); +} diff --git a/packages/skeleton-react/src/components/slider/anatomy/thumb.tsx b/packages/skeleton-react/src/components/slider/anatomy/thumb.tsx new file mode 100644 index 0000000000..d667584580 --- /dev/null +++ b/packages/skeleton-react/src/components/slider/anatomy/thumb.tsx @@ -0,0 +1,31 @@ +import { RootContext } from '../modules/root-context'; +import { ThumbContext } from '../modules/thumb-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesSlider } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { splitThumbProps, type ThumbProps } from '@zag-js/slider'; +import { use } from 'react'; + +export interface SliderThumbProps extends ThumbProps, PropsWithElement<'div'>, HTMLAttributes<'div'> {} + +export default function Thumb(props: SliderThumbProps) { + const slider = use(RootContext); + + const [thumbProps, componentProps] = splitThumbProps(props); + const { element, children, ...rest } = componentProps; + + const attributes = mergeProps( + slider.getThumbProps(thumbProps), + { + className: classesSlider.thumb, + }, + rest, + ); + + return ( + <ThumbContext.Provider value={thumbProps}> + {element ? element(attributes) : <div {...attributes}>{children}</div>} + </ThumbContext.Provider> + ); +} diff --git a/packages/skeleton-react/src/components/slider/anatomy/track.tsx b/packages/skeleton-react/src/components/slider/anatomy/track.tsx new file mode 100644 index 0000000000..9a2ae314fe --- /dev/null +++ b/packages/skeleton-react/src/components/slider/anatomy/track.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesSlider } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface SliderTrackProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} + +export default function Track(props: SliderTrackProps) { + const slider = use(RootContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + slider.getTrackProps(), + { + className: classesSlider.track, + }, + rest, + ); + + return element ? element(attributes) : <div {...attributes}>{children}</div>; +} diff --git a/packages/skeleton-react/src/components/slider/anatomy/value-text.tsx b/packages/skeleton-react/src/components/slider/anatomy/value-text.tsx new file mode 100644 index 0000000000..a017dec2b3 --- /dev/null +++ b/packages/skeleton-react/src/components/slider/anatomy/value-text.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesSlider } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface SliderValueTextProps extends PropsWithElement<'output'>, HTMLAttributes<'output'> {} + +export default function ValueText(props: SliderValueTextProps) { + const slider = use(RootContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + slider.getValueTextProps(), + { + className: classesSlider.valueText, + }, + rest, + ); + + return element ? element(attributes) : <output {...attributes}>{children}</output>; +} diff --git a/packages/skeleton-react/src/components/slider/index.ts b/packages/skeleton-react/src/components/slider/index.ts new file mode 100644 index 0000000000..231a21dc63 --- /dev/null +++ b/packages/skeleton-react/src/components/slider/index.ts @@ -0,0 +1,14 @@ +export { Slider } from './modules/anatomy'; +export { useSlider } from './modules/provider'; +export type { SliderRootProps } from './anatomy/root'; +export type { SliderRootProviderProps } from './anatomy/root-provider'; +export type { SliderRootContextProps } from './anatomy/root-context'; +export type { SliderTrackProps } from './anatomy/track'; +export type { SliderThumbProps } from './anatomy/thumb'; +export type { SliderHiddenInputProps } from './anatomy/hidden-input'; +export type { SliderRangeProps } from './anatomy/range'; +export type { SliderLabelProps } from './anatomy/label'; +export type { SliderValueTextProps } from './anatomy/value-text'; +export type { SliderControlProps } from './anatomy/control'; +export type { SliderMarkerGroupProps } from './anatomy/marker-group'; +export type { SliderMarkerProps } from './anatomy/marker'; diff --git a/packages/skeleton-react/src/components/slider/modules/anatomy.ts b/packages/skeleton-react/src/components/slider/modules/anatomy.ts new file mode 100644 index 0000000000..2c4d1bf72d --- /dev/null +++ b/packages/skeleton-react/src/components/slider/modules/anatomy.ts @@ -0,0 +1,26 @@ +import Control from '../anatomy/control'; +import HiddenInput from '../anatomy/hidden-input'; +import Label from '../anatomy/label'; +import Marker from '../anatomy/marker'; +import MarkerGroup from '../anatomy/marker-group'; +import Range from '../anatomy/range'; +import Root from '../anatomy/root'; +import RootContext from '../anatomy/root-context'; +import RootProvider from '../anatomy/root-provider'; +import Thumb from '../anatomy/thumb'; +import Track from '../anatomy/track'; +import ValueText from '../anatomy/value-text'; + +export const Slider = Object.assign(Root, { + Provider: RootProvider, + Context: RootContext, + Label: Label, + ValueText: ValueText, + Control: Control, + Track: Track, + Range: Range, + Thumb: Thumb, + HiddenInput: HiddenInput, + MarkerGroup: MarkerGroup, + Marker: Marker, +}); diff --git a/packages/skeleton-react/src/components/slider/modules/provider.ts b/packages/skeleton-react/src/components/slider/modules/provider.ts new file mode 100644 index 0000000000..3bf2fa6bf3 --- /dev/null +++ b/packages/skeleton-react/src/components/slider/modules/provider.ts @@ -0,0 +1,12 @@ +import { normalizeProps, useMachine, type PropTypes } from '@zag-js/react'; +import { connect, machine } from '@zag-js/slider'; +import type { Api, Props } from '@zag-js/slider'; +import { useId } from 'react'; + +export function useSlider(props: Omit<Props, 'id'> = {}): Api<PropTypes> { + const service = useMachine(machine, { + id: useId(), + ...props, + }); + return connect(service, normalizeProps); +} diff --git a/packages/skeleton-react/src/components/slider/modules/root-context.ts b/packages/skeleton-react/src/components/slider/modules/root-context.ts new file mode 100644 index 0000000000..46982e80f3 --- /dev/null +++ b/packages/skeleton-react/src/components/slider/modules/root-context.ts @@ -0,0 +1,4 @@ +import type { useSlider } from './provider'; +import { createContext } from '@/internal/create-context'; + +export const RootContext = createContext<ReturnType<typeof useSlider>>(); diff --git a/packages/skeleton-react/src/components/slider/modules/thumb-context.ts b/packages/skeleton-react/src/components/slider/modules/thumb-context.ts new file mode 100644 index 0000000000..a8d3acd0f2 --- /dev/null +++ b/packages/skeleton-react/src/components/slider/modules/thumb-context.ts @@ -0,0 +1,4 @@ +import { createContext } from '@/internal/create-context'; +import type { ThumbProps } from '@zag-js/slider'; + +export const ThumbContext = createContext<ThumbProps>(); diff --git a/packages/skeleton-react/src/components/switch/anatomy/control.tsx b/packages/skeleton-react/src/components/switch/anatomy/control.tsx new file mode 100644 index 0000000000..8f8d0f13fb --- /dev/null +++ b/packages/skeleton-react/src/components/switch/anatomy/control.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesSwitch } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface SwitchControlProps extends PropsWithElement<'span'>, HTMLAttributes<'span'> {} + +export default function Control(props: SwitchControlProps) { + const switch_ = use(RootContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + switch_.getControlProps(), + { + className: classesSwitch.control, + }, + rest, + ); + + return element ? element(attributes) : <span {...attributes}>{children}</span>; +} diff --git a/packages/skeleton-react/src/components/switch/anatomy/hidden-input.tsx b/packages/skeleton-react/src/components/switch/anatomy/hidden-input.tsx new file mode 100644 index 0000000000..f55b8917c9 --- /dev/null +++ b/packages/skeleton-react/src/components/switch/anatomy/hidden-input.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesSwitch } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface SwitchHiddenInputProps extends PropsWithElement<'input'>, HTMLAttributes<'input', 'children'> {} + +export default function HiddenInput(props: SwitchHiddenInputProps) { + const switch_ = use(RootContext); + + const { element, ...rest } = props; + + const attributes = mergeProps( + switch_.getHiddenInputProps(), + { + className: classesSwitch.hiddenInput, + }, + rest, + ); + + return element ? element(attributes) : <input {...attributes} />; +} diff --git a/packages/skeleton-react/src/components/switch/anatomy/label.tsx b/packages/skeleton-react/src/components/switch/anatomy/label.tsx new file mode 100644 index 0000000000..4878a5a164 --- /dev/null +++ b/packages/skeleton-react/src/components/switch/anatomy/label.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesSwitch } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface SwitchLabelProps extends PropsWithElement<'span'>, HTMLAttributes<'span'> {} + +export default function Label(props: SwitchLabelProps) { + const switch_ = use(RootContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + switch_.getLabelProps(), + { + className: classesSwitch.label, + }, + rest, + ); + + return element ? element(attributes) : <span {...attributes}>{children}</span>; +} diff --git a/packages/skeleton-react/src/components/switch/anatomy/root-context.tsx b/packages/skeleton-react/src/components/switch/anatomy/root-context.tsx new file mode 100644 index 0000000000..ef7e4f299c --- /dev/null +++ b/packages/skeleton-react/src/components/switch/anatomy/root-context.tsx @@ -0,0 +1,16 @@ +import type { useSwitch } from '../modules/provider'; +import { RootContext as RootContext_ } from '../modules/root-context'; +import { use } from 'react'; +import type { ReactNode } from 'react'; + +export interface SwitchRootContextProps { + children: (switch_: ReturnType<typeof useSwitch>) => ReactNode; +} + +export default function RootContext(props: SwitchRootContextProps) { + const switch_ = use(RootContext_); + + const { children } = props; + + return children(switch_); +} diff --git a/packages/skeleton-react/src/components/switch/anatomy/root-provider.tsx b/packages/skeleton-react/src/components/switch/anatomy/root-provider.tsx new file mode 100644 index 0000000000..84a56a69f6 --- /dev/null +++ b/packages/skeleton-react/src/components/switch/anatomy/root-provider.tsx @@ -0,0 +1,26 @@ +import type { useSwitch } from '../modules/provider'; +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesSwitch } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; + +export interface SwitchRootProviderProps extends PropsWithElement<'label'>, HTMLAttributes<'label', 'id' | 'dir'> { + value: ReturnType<typeof useSwitch>; +} + +export default function RootProvider(props: SwitchRootProviderProps) { + const { element, children, value: switch_, ...rest } = props; + + const attributes = mergeProps( + switch_.getRootProps(), + { + className: classesSwitch.root, + }, + rest, + ); + + return ( + <RootContext.Provider value={switch_}>{element ? element(attributes) : <label {...attributes}>{children}</label>}</RootContext.Provider> + ); +} diff --git a/packages/skeleton-react/src/components/switch/anatomy/root.tsx b/packages/skeleton-react/src/components/switch/anatomy/root.tsx new file mode 100644 index 0000000000..cfd03884f3 --- /dev/null +++ b/packages/skeleton-react/src/components/switch/anatomy/root.tsx @@ -0,0 +1,29 @@ +import { useSwitch } from '../modules/provider'; +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesSwitch } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { splitProps } from '@zag-js/switch'; +import type { Props } from '@zag-js/switch'; + +export interface SwitchRootProps extends Omit<Props, 'id'>, PropsWithElement<'label'>, HTMLAttributes<'label', 'id' | 'dir'> {} + +export default function Root(props: SwitchRootProps) { + const [switchProps, componentProps] = splitProps(props); + const { element, children, ...rest } = componentProps; + + const switch_ = useSwitch(switchProps); + + const attributes = mergeProps( + switch_.getRootProps(), + { + className: classesSwitch.root, + }, + rest, + ); + + return ( + <RootContext.Provider value={switch_}>{element ? element(attributes) : <label {...attributes}>{children}</label>}</RootContext.Provider> + ); +} diff --git a/packages/skeleton-react/src/components/switch/anatomy/thumb.tsx b/packages/skeleton-react/src/components/switch/anatomy/thumb.tsx new file mode 100644 index 0000000000..6299a59cbc --- /dev/null +++ b/packages/skeleton-react/src/components/switch/anatomy/thumb.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesSwitch } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface SwitchThumbProps extends PropsWithElement<'span'>, HTMLAttributes<'span'> {} + +export default function Thumb(props: SwitchThumbProps) { + const switch_ = use(RootContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + switch_.getThumbProps(), + { + className: classesSwitch.thumb, + }, + rest, + ); + + return element ? element(attributes) : <span {...attributes}>{children}</span>; +} diff --git a/packages/skeleton-react/src/components/switch/index.ts b/packages/skeleton-react/src/components/switch/index.ts new file mode 100644 index 0000000000..c901509333 --- /dev/null +++ b/packages/skeleton-react/src/components/switch/index.ts @@ -0,0 +1,8 @@ +export type { SwitchControlProps } from './anatomy/control'; +export type { SwitchHiddenInputProps } from './anatomy/hidden-input'; +export type { SwitchLabelProps } from './anatomy/label'; +export type { SwitchRootContextProps } from './anatomy/root-context'; +export type { SwitchRootProviderProps } from './anatomy/root-provider'; +export type { SwitchThumbProps } from './anatomy/thumb'; +export { Switch } from './modules/anatomy'; +export { useSwitch } from './modules/provider'; diff --git a/packages/skeleton-react/src/components/switch/modules/anatomy.ts b/packages/skeleton-react/src/components/switch/modules/anatomy.ts new file mode 100644 index 0000000000..33241cdf53 --- /dev/null +++ b/packages/skeleton-react/src/components/switch/modules/anatomy.ts @@ -0,0 +1,16 @@ +import Control from '../anatomy/control'; +import HiddenInput from '../anatomy/hidden-input'; +import Label from '../anatomy/label'; +import Root from '../anatomy/root'; +import RootContext from '../anatomy/root-context'; +import RootProvider from '../anatomy/root-provider'; +import Thumb from '../anatomy/thumb'; + +export const Switch = Object.assign(Root, { + Provider: RootProvider, + Context: RootContext, + Control: Control, + Thumb: Thumb, + Label: Label, + HiddenInput: HiddenInput, +}); diff --git a/packages/skeleton-react/src/components/switch/modules/provider.ts b/packages/skeleton-react/src/components/switch/modules/provider.ts new file mode 100644 index 0000000000..b4580d47a7 --- /dev/null +++ b/packages/skeleton-react/src/components/switch/modules/provider.ts @@ -0,0 +1,12 @@ +import { normalizeProps, useMachine, type PropTypes } from '@zag-js/react'; +import { connect, machine } from '@zag-js/switch'; +import type { Api, Props } from '@zag-js/switch'; +import { useId } from 'react'; + +export function useSwitch(props: Omit<Props, 'id'> = {}): Api<PropTypes> { + const service = useMachine(machine, { + id: useId(), + ...props, + }); + return connect(service, normalizeProps); +} diff --git a/packages/skeleton-react/src/components/switch/modules/root-context.ts b/packages/skeleton-react/src/components/switch/modules/root-context.ts new file mode 100644 index 0000000000..53f89f7c2c --- /dev/null +++ b/packages/skeleton-react/src/components/switch/modules/root-context.ts @@ -0,0 +1,4 @@ +import type { useSwitch } from './provider'; +import { createContext } from '@/internal/create-context'; + +export const RootContext = createContext<ReturnType<typeof useSwitch>>(); diff --git a/packages/skeleton-react/src/components/tabs/anatomy/content.tsx b/packages/skeleton-react/src/components/tabs/anatomy/content.tsx new file mode 100644 index 0000000000..572d48c566 --- /dev/null +++ b/packages/skeleton-react/src/components/tabs/anatomy/content.tsx @@ -0,0 +1,27 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesTabs } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { splitContentProps } from '@zag-js/tabs'; +import type { ContentProps } from '@zag-js/tabs'; +import { use } from 'react'; + +export interface TabsContentProps extends ContentProps, PropsWithElement<'div'>, HTMLAttributes<'div'> {} + +export default function Content(props: TabsContentProps) { + const tabs = use(RootContext); + + const [contentProps, componentProps] = splitContentProps(props); + const { element, children, ...rest } = componentProps; + + const attributes = mergeProps( + tabs.getContentProps(contentProps), + { + className: classesTabs.content, + }, + rest, + ); + + return element ? element(attributes) : <div {...attributes}>{children}</div>; +} diff --git a/packages/skeleton-react/src/components/tabs/anatomy/indicator.tsx b/packages/skeleton-react/src/components/tabs/anatomy/indicator.tsx new file mode 100644 index 0000000000..0ba6c9e936 --- /dev/null +++ b/packages/skeleton-react/src/components/tabs/anatomy/indicator.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesTabs } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface TabsIndicatorProps extends PropsWithElement<'div'>, HTMLAttributes<'div', 'children'> {} + +export default function Indicator(props: TabsIndicatorProps) { + const tabs = use(RootContext); + + const { element, ...rest } = props; + + const attributes = mergeProps( + tabs.getIndicatorProps(), + { + className: classesTabs.indicator, + }, + rest, + ); + + return element ? element(attributes) : <div {...attributes} />; +} diff --git a/packages/skeleton-react/src/components/tabs/anatomy/list.tsx b/packages/skeleton-react/src/components/tabs/anatomy/list.tsx new file mode 100644 index 0000000000..56e6ac34e5 --- /dev/null +++ b/packages/skeleton-react/src/components/tabs/anatomy/list.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesTabs } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface TabsListProps extends PropsWithElement<'div'>, HTMLAttributes<'div', 'id' | 'dir'> {} + +export default function List(props: TabsListProps) { + const tabs = use(RootContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + tabs.getListProps(), + { + className: classesTabs.list, + }, + rest, + ); + + return element ? element(attributes) : <div {...attributes}>{children}</div>; +} diff --git a/packages/skeleton-react/src/components/tabs/anatomy/root-context.tsx b/packages/skeleton-react/src/components/tabs/anatomy/root-context.tsx new file mode 100644 index 0000000000..ea17868945 --- /dev/null +++ b/packages/skeleton-react/src/components/tabs/anatomy/root-context.tsx @@ -0,0 +1,16 @@ +import type { useTabs } from '../modules/provider'; +import { RootContext as RootContext_ } from '../modules/root-context'; +import { use } from 'react'; +import type { ReactNode } from 'react'; + +export interface TabsRootContextProps { + children: (tabs: ReturnType<typeof useTabs>) => ReactNode; +} + +export default function RootContext(props: TabsRootContextProps) { + const tabs = use(RootContext_); + + const { children } = props; + + return children(tabs); +} diff --git a/packages/skeleton-react/src/components/tabs/anatomy/root-provider.tsx b/packages/skeleton-react/src/components/tabs/anatomy/root-provider.tsx new file mode 100644 index 0000000000..d3357f2704 --- /dev/null +++ b/packages/skeleton-react/src/components/tabs/anatomy/root-provider.tsx @@ -0,0 +1,24 @@ +import type { useTabs } from '../modules/provider'; +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesTabs } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; + +export interface TabsRootProviderProps extends PropsWithElement<'div'>, HTMLAttributes<'div', 'id' | 'dir' | 'defaultValue'> { + value: ReturnType<typeof useTabs>; +} + +export default function RootProvider(props: TabsRootProviderProps) { + const { element, children, value: tabs, ...rest } = props; + + const attributes = mergeProps( + tabs.getRootProps(), + { + className: classesTabs.root, + }, + rest, + ); + + return <RootContext.Provider value={tabs}>{element ? element(attributes) : <div {...attributes}>{children}</div>}</RootContext.Provider>; +} diff --git a/packages/skeleton-react/src/components/tabs/anatomy/root.tsx b/packages/skeleton-react/src/components/tabs/anatomy/root.tsx new file mode 100644 index 0000000000..338e23bfd2 --- /dev/null +++ b/packages/skeleton-react/src/components/tabs/anatomy/root.tsx @@ -0,0 +1,27 @@ +import { useTabs } from '../modules/provider'; +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesTabs } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { splitProps } from '@zag-js/tabs'; +import type { Props } from '@zag-js/tabs'; + +export interface TabsRootProps extends Omit<Props, 'id'>, PropsWithElement<'div'>, HTMLAttributes<'div', 'id' | 'dir' | 'defaultValue'> {} + +export default function Root(props: TabsRootProps) { + const [tabsProps, componentProps] = splitProps(props); + const { element, children, ...rest } = componentProps; + + const tabs = useTabs(tabsProps); + + const attributes = mergeProps( + tabs.getRootProps(), + { + className: classesTabs.root, + }, + rest, + ); + + return <RootContext.Provider value={tabs}>{element ? element(attributes) : <div {...attributes}>{children}</div>}</RootContext.Provider>; +} diff --git a/packages/skeleton-react/src/components/tabs/anatomy/trigger.tsx b/packages/skeleton-react/src/components/tabs/anatomy/trigger.tsx new file mode 100644 index 0000000000..e102fa0ef8 --- /dev/null +++ b/packages/skeleton-react/src/components/tabs/anatomy/trigger.tsx @@ -0,0 +1,27 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesTabs } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { splitTriggerProps } from '@zag-js/tabs'; +import type { TriggerProps } from '@zag-js/tabs'; +import { use } from 'react'; + +export interface TabsTriggerProps extends TriggerProps, PropsWithElement<'button'>, HTMLAttributes<'button', 'value'> {} + +export default function Trigger(props: TabsTriggerProps) { + const tabs = use(RootContext); + + const [triggerProps, componentProps] = splitTriggerProps(props); + const { element, children, ...rest } = componentProps; + + const attributes = mergeProps( + tabs.getTriggerProps(triggerProps), + { + className: classesTabs.trigger, + }, + rest, + ); + + return element ? element(attributes) : <button {...attributes}>{children}</button>; +} diff --git a/packages/skeleton-react/src/components/tabs/index.ts b/packages/skeleton-react/src/components/tabs/index.ts new file mode 100644 index 0000000000..c9c9dfd49b --- /dev/null +++ b/packages/skeleton-react/src/components/tabs/index.ts @@ -0,0 +1,9 @@ +export type { TabsContentProps } from './anatomy/content'; +export type { TabsIndicatorProps } from './anatomy/indicator'; +export type { TabsListProps } from './anatomy/list'; +export type { TabsRootProps } from './anatomy/root'; +export type { TabsRootContextProps } from './anatomy/root-context'; +export type { TabsRootProviderProps } from './anatomy/root-provider'; +export type { TabsTriggerProps } from './anatomy/trigger'; +export { Tabs } from './modules/anatomy'; +export { useTabs } from './modules/provider'; diff --git a/packages/skeleton-react/src/components/tabs/modules/anatomy.ts b/packages/skeleton-react/src/components/tabs/modules/anatomy.ts new file mode 100644 index 0000000000..67febd2ff5 --- /dev/null +++ b/packages/skeleton-react/src/components/tabs/modules/anatomy.ts @@ -0,0 +1,16 @@ +import Content from '../anatomy/content'; +import Indicator from '../anatomy/indicator'; +import List from '../anatomy/list'; +import Root from '../anatomy/root'; +import RootContext from '../anatomy/root-context'; +import RootProvider from '../anatomy/root-provider'; +import Trigger from '../anatomy/trigger'; + +export const Tabs = Object.assign(Root, { + Provider: RootProvider, + Context: RootContext, + List: List, + Trigger: Trigger, + Indicator: Indicator, + Content: Content, +}); diff --git a/packages/skeleton-react/src/components/tabs/modules/provider.ts b/packages/skeleton-react/src/components/tabs/modules/provider.ts new file mode 100644 index 0000000000..430dcc6ae2 --- /dev/null +++ b/packages/skeleton-react/src/components/tabs/modules/provider.ts @@ -0,0 +1,12 @@ +import { normalizeProps, useMachine, type PropTypes } from '@zag-js/react'; +import { connect, machine } from '@zag-js/tabs'; +import type { Api, Props } from '@zag-js/tabs'; +import { useId } from 'react'; + +export function useTabs(props: Omit<Props, 'id'> = {}): Api<PropTypes> { + const service = useMachine(machine, { + id: useId(), + ...props, + }); + return connect(service, normalizeProps); +} diff --git a/packages/skeleton-react/src/components/tabs/modules/root-context.ts b/packages/skeleton-react/src/components/tabs/modules/root-context.ts new file mode 100644 index 0000000000..56202964fc --- /dev/null +++ b/packages/skeleton-react/src/components/tabs/modules/root-context.ts @@ -0,0 +1,4 @@ +import type { useTabs } from './provider'; +import { createContext } from '@/internal/create-context'; + +export const RootContext = createContext<ReturnType<typeof useTabs>>(); diff --git a/packages/skeleton-react/src/components/tags-input/anatomy/clear-trigger.tsx b/packages/skeleton-react/src/components/tags-input/anatomy/clear-trigger.tsx new file mode 100644 index 0000000000..c5b796edd8 --- /dev/null +++ b/packages/skeleton-react/src/components/tags-input/anatomy/clear-trigger.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesTagsInput } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface TagsInputClearTriggerProps extends PropsWithElement<'button'>, HTMLAttributes<'button'> {} + +export default function ClearTrigger(props: TagsInputClearTriggerProps) { + const tagsInput = use(RootContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + tagsInput.getClearTriggerProps(), + { + className: classesTagsInput.clearTrigger, + }, + rest, + ); + + return element ? element(attributes) : <button {...attributes}>{children}</button>; +} diff --git a/packages/skeleton-react/src/components/tags-input/anatomy/control.tsx b/packages/skeleton-react/src/components/tags-input/anatomy/control.tsx new file mode 100644 index 0000000000..a3171000a0 --- /dev/null +++ b/packages/skeleton-react/src/components/tags-input/anatomy/control.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesTagsInput } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface TagsInputControlProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} + +export default function Control(props: TagsInputControlProps) { + const tagsInput = use(RootContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + tagsInput.getControlProps(), + { + className: classesTagsInput.control, + }, + rest, + ); + + return element ? element(attributes) : <div {...attributes}>{children}</div>; +} diff --git a/packages/skeleton-react/src/components/tags-input/anatomy/hidden-input.tsx b/packages/skeleton-react/src/components/tags-input/anatomy/hidden-input.tsx new file mode 100644 index 0000000000..cba712ead0 --- /dev/null +++ b/packages/skeleton-react/src/components/tags-input/anatomy/hidden-input.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesTagsInput } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface TagsInputHiddenInputProps extends PropsWithElement<'input'>, HTMLAttributes<'input', 'children'> {} + +export default function HiddenInput(props: TagsInputHiddenInputProps) { + const tagsInput = use(RootContext); + + const { element, ...rest } = props; + + const attributes = mergeProps( + tagsInput.getHiddenInputProps(), + { + className: classesTagsInput.hiddenInput, + }, + rest, + ); + + return element ? element(attributes) : <input {...attributes} />; +} diff --git a/packages/skeleton-react/src/components/tags-input/anatomy/input.tsx b/packages/skeleton-react/src/components/tags-input/anatomy/input.tsx new file mode 100644 index 0000000000..993bc68439 --- /dev/null +++ b/packages/skeleton-react/src/components/tags-input/anatomy/input.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesTagsInput } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface TagsInputInputProps extends PropsWithElement<'input'>, HTMLAttributes<'input', 'children'> {} + +export default function Input(props: TagsInputInputProps) { + const tagsInput = use(RootContext); + + const { element, ...rest } = props; + + const attributes = mergeProps( + tagsInput.getInputProps(), + { + className: classesTagsInput.input, + }, + rest, + ); + + return element ? element(attributes) : <input {...attributes} />; +} diff --git a/packages/skeleton-react/src/components/tags-input/anatomy/item-delete-trigger.tsx b/packages/skeleton-react/src/components/tags-input/anatomy/item-delete-trigger.tsx new file mode 100644 index 0000000000..deca41857e --- /dev/null +++ b/packages/skeleton-react/src/components/tags-input/anatomy/item-delete-trigger.tsx @@ -0,0 +1,26 @@ +import { ItemContext } from '../modules/item-context'; +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesTagsInput } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface TagsInputItemDeleteTriggerProps extends PropsWithElement<'button'>, HTMLAttributes<'button'> {} + +export default function ItemDeleteTrigger(props: TagsInputItemDeleteTriggerProps) { + const tagsInput = use(RootContext); + const itemProps = use(ItemContext); + + const { element, children = <>×</>, ...rest } = props; + + const attributes = mergeProps( + tagsInput.getItemDeleteTriggerProps(itemProps), + { + className: classesTagsInput.itemDeleteTrigger, + }, + rest, + ); + + return element ? element(attributes) : <button {...attributes}>{children}</button>; +} diff --git a/packages/skeleton-react/src/components/tags-input/anatomy/item-input.tsx b/packages/skeleton-react/src/components/tags-input/anatomy/item-input.tsx new file mode 100644 index 0000000000..7e604ad1a1 --- /dev/null +++ b/packages/skeleton-react/src/components/tags-input/anatomy/item-input.tsx @@ -0,0 +1,26 @@ +import { ItemContext } from '../modules/item-context'; +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesTagsInput } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface TagsInputItemInputProps extends PropsWithElement<'input'>, HTMLAttributes<'input', 'children'> {} + +export default function ItemInput(props: TagsInputItemInputProps) { + const tagsInput = use(RootContext); + const itemProps = use(ItemContext); + + const { element, ...rest } = props; + + const attributes = mergeProps( + tagsInput.getItemInputProps(itemProps), + { + className: classesTagsInput.itemInput, + }, + rest, + ); + + return element ? element(attributes) : <input {...attributes} />; +} diff --git a/packages/skeleton-react/src/components/tags-input/anatomy/item-preview.tsx b/packages/skeleton-react/src/components/tags-input/anatomy/item-preview.tsx new file mode 100644 index 0000000000..bda63a0e18 --- /dev/null +++ b/packages/skeleton-react/src/components/tags-input/anatomy/item-preview.tsx @@ -0,0 +1,26 @@ +import { ItemContext } from '../modules/item-context'; +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesTagsInput } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface TagsInputItemPreviewProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} + +export default function ItemPreview(props: TagsInputItemPreviewProps) { + const tagsInput = use(RootContext); + const itemProps = use(ItemContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + tagsInput.getItemPreviewProps(itemProps), + { + className: classesTagsInput.itemPreview, + }, + rest, + ); + + return element ? element(attributes) : <div {...attributes}>{children}</div>; +} diff --git a/packages/skeleton-react/src/components/tags-input/anatomy/item-text.tsx b/packages/skeleton-react/src/components/tags-input/anatomy/item-text.tsx new file mode 100644 index 0000000000..91b3ad6d64 --- /dev/null +++ b/packages/skeleton-react/src/components/tags-input/anatomy/item-text.tsx @@ -0,0 +1,26 @@ +import { ItemContext } from '../modules/item-context'; +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesTagsInput } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface TagsInputItemTextProps extends PropsWithElement<'span'>, HTMLAttributes<'span'> {} + +export default function ItemText(props: TagsInputItemTextProps) { + const tagsInput = use(RootContext); + const itemProps = use(ItemContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + tagsInput.getItemTextProps(itemProps), + { + className: classesTagsInput.itemText, + }, + rest, + ); + + return element ? element(attributes) : <span {...attributes}>{children}</span>; +} diff --git a/packages/skeleton-react/src/components/tags-input/anatomy/item.tsx b/packages/skeleton-react/src/components/tags-input/anatomy/item.tsx new file mode 100644 index 0000000000..d78d93b594 --- /dev/null +++ b/packages/skeleton-react/src/components/tags-input/anatomy/item.tsx @@ -0,0 +1,29 @@ +import { ItemContext } from '../modules/item-context'; +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesTagsInput } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { type ItemProps, splitItemProps } from '@zag-js/tags-input'; +import { use } from 'react'; + +export interface TagsInputItemProps extends ItemProps, PropsWithElement<'span'>, HTMLAttributes<'span'> {} + +export default function Item(props: TagsInputItemProps) { + const tagsInput = use(RootContext); + + const [itemProps, componentProps] = splitItemProps(props); + const { element, children, ...rest } = componentProps; + + const attributes = mergeProps( + tagsInput.getItemProps(itemProps), + { + className: classesTagsInput.item, + }, + rest, + ); + + return ( + <ItemContext.Provider value={itemProps}>{element ? element(attributes) : <span {...attributes}>{children}</span>}</ItemContext.Provider> + ); +} diff --git a/packages/skeleton-react/src/components/tags-input/anatomy/label.tsx b/packages/skeleton-react/src/components/tags-input/anatomy/label.tsx new file mode 100644 index 0000000000..b9b5503954 --- /dev/null +++ b/packages/skeleton-react/src/components/tags-input/anatomy/label.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesTagsInput } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface TagsInputLabelProps extends PropsWithElement<'label'>, HTMLAttributes<'label'> {} + +export default function Label(props: TagsInputLabelProps) { + const tagsInput = use(RootContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + tagsInput.getLabelProps(), + { + className: classesTagsInput.label, + }, + rest, + ); + + return element ? element(attributes) : <label {...attributes}>{children}</label>; +} diff --git a/packages/skeleton-react/src/components/tags-input/anatomy/root-context.tsx b/packages/skeleton-react/src/components/tags-input/anatomy/root-context.tsx new file mode 100644 index 0000000000..6058c991e7 --- /dev/null +++ b/packages/skeleton-react/src/components/tags-input/anatomy/root-context.tsx @@ -0,0 +1,15 @@ +import type { useTagsInput } from '../modules/provider'; +import { RootContext as RootContext_ } from '../modules/root-context'; +import { type ReactNode, use } from 'react'; + +export interface TagsInputRootContextProps { + children: (tagsInput: ReturnType<typeof useTagsInput>) => ReactNode; +} + +export default function RootContext(props: TagsInputRootContextProps) { + const tagsInput = use(RootContext_); + + const { children } = props; + + return children(tagsInput); +} diff --git a/packages/skeleton-react/src/components/tags-input/anatomy/root-provider.tsx b/packages/skeleton-react/src/components/tags-input/anatomy/root-provider.tsx new file mode 100644 index 0000000000..be28571f19 --- /dev/null +++ b/packages/skeleton-react/src/components/tags-input/anatomy/root-provider.tsx @@ -0,0 +1,26 @@ +import type { useTagsInput } from '../modules/provider'; +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesTagsInput } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; + +export interface TagsInputRootProviderProps extends PropsWithElement<'div'>, HTMLAttributes<'div', 'id' | 'dir'> { + value: ReturnType<typeof useTagsInput>; +} + +export default function RootProvider(props: TagsInputRootProviderProps) { + const { element, children, value: tagsInput, ...rest } = props; + + const attributes = mergeProps( + tagsInput.getRootProps(), + { + className: classesTagsInput.root, + }, + rest, + ); + + return ( + <RootContext.Provider value={tagsInput}>{element ? element(attributes) : <div {...attributes}>{children}</div>}</RootContext.Provider> + ); +} diff --git a/packages/skeleton-react/src/components/tags-input/anatomy/root.tsx b/packages/skeleton-react/src/components/tags-input/anatomy/root.tsx new file mode 100644 index 0000000000..ee251b9ff0 --- /dev/null +++ b/packages/skeleton-react/src/components/tags-input/anatomy/root.tsx @@ -0,0 +1,31 @@ +import { useTagsInput } from '../modules/provider'; +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesTagsInput } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { type Props, splitProps } from '@zag-js/tags-input'; + +export interface TagsInputRootProps + extends Omit<Props, 'id'>, + PropsWithElement<'div'>, + HTMLAttributes<'div', 'id' | 'dir' | 'defaultValue'> {} + +export default function Root(props: TagsInputRootProps) { + const [tagsInputProps, componentProps] = splitProps(props); + const { element, children, ...rest } = componentProps; + + const tagsInput = useTagsInput(tagsInputProps); + + const attributes = mergeProps( + tagsInput.getRootProps(), + { + className: classesTagsInput.root, + }, + rest, + ); + + return ( + <RootContext.Provider value={tagsInput}>{element ? element(attributes) : <div {...attributes}>{children}</div>}</RootContext.Provider> + ); +} diff --git a/packages/skeleton-react/src/components/tags-input/index.ts b/packages/skeleton-react/src/components/tags-input/index.ts new file mode 100644 index 0000000000..5f434b99af --- /dev/null +++ b/packages/skeleton-react/src/components/tags-input/index.ts @@ -0,0 +1,15 @@ +export type { TagsInputClearTriggerProps } from './anatomy/clear-trigger'; +export type { TagsInputControlProps } from './anatomy/control'; +export type { TagsInputHiddenInputProps } from './anatomy/hidden-input'; +export type { TagsInputInputProps } from './anatomy/input'; +export type { TagsInputItemProps } from './anatomy/item'; +export type { TagsInputItemDeleteTriggerProps } from './anatomy/item-delete-trigger'; +export type { TagsInputItemInputProps } from './anatomy/item-input'; +export type { TagsInputItemPreviewProps } from './anatomy/item-preview'; +export type { TagsInputItemTextProps } from './anatomy/item-text'; +export type { TagsInputLabelProps } from './anatomy/label'; +export type { TagsInputRootProps } from './anatomy/root'; +export type { TagsInputRootContextProps } from './anatomy/root-context'; +export type { TagsInputRootProviderProps } from './anatomy/root-provider'; +export { TagsInput } from './modules/anatomy'; +export { useTagsInput } from './modules/provider'; diff --git a/packages/skeleton-react/src/components/tags-input/modules/anatomy.ts b/packages/skeleton-react/src/components/tags-input/modules/anatomy.ts new file mode 100644 index 0000000000..94e50545fa --- /dev/null +++ b/packages/skeleton-react/src/components/tags-input/modules/anatomy.ts @@ -0,0 +1,28 @@ +import ClearTrigger from '../anatomy/clear-trigger'; +import Control from '../anatomy/control'; +import HiddenInput from '../anatomy/hidden-input'; +import Input from '../anatomy/input'; +import Item from '../anatomy/item'; +import ItemDeleteTrigger from '../anatomy/item-delete-trigger'; +import ItemInput from '../anatomy/item-input'; +import ItemPreview from '../anatomy/item-preview'; +import ItemText from '../anatomy/item-text'; +import Label from '../anatomy/label'; +import Root from '../anatomy/root'; +import RootContext from '../anatomy/root-context'; +import RootProvider from '../anatomy/root-provider'; + +export const TagsInput = Object.assign(Root, { + Provider: RootProvider, + Context: RootContext, + Label: Label, + Control: Control, + Item: Item, + ItemPreview: ItemPreview, + ItemText: ItemText, + ItemDeleteTrigger: ItemDeleteTrigger, + ItemInput: ItemInput, + Input: Input, + ClearTrigger: ClearTrigger, + HiddenInput: HiddenInput, +}); diff --git a/packages/skeleton-react/src/components/tags-input/modules/item-context.ts b/packages/skeleton-react/src/components/tags-input/modules/item-context.ts new file mode 100644 index 0000000000..c37012bff4 --- /dev/null +++ b/packages/skeleton-react/src/components/tags-input/modules/item-context.ts @@ -0,0 +1,4 @@ +import { createContext } from '@/internal/create-context'; +import type { ItemProps } from '@zag-js/tags-input'; + +export const ItemContext = createContext<ItemProps>(); diff --git a/packages/skeleton-react/src/components/tags-input/modules/provider.ts b/packages/skeleton-react/src/components/tags-input/modules/provider.ts new file mode 100644 index 0000000000..dd55ad0354 --- /dev/null +++ b/packages/skeleton-react/src/components/tags-input/modules/provider.ts @@ -0,0 +1,11 @@ +import { normalizeProps, useMachine, type PropTypes } from '@zag-js/react'; +import { type Api, connect, machine, type Props } from '@zag-js/tags-input'; +import { useId } from 'react'; + +export function useTagsInput(props: Omit<Props, 'id'> = {}): Api<PropTypes> { + const service = useMachine(machine, { + id: useId(), + ...props, + }); + return connect(service, normalizeProps); +} diff --git a/packages/skeleton-react/src/components/tags-input/modules/root-context.ts b/packages/skeleton-react/src/components/tags-input/modules/root-context.ts new file mode 100644 index 0000000000..cebf624877 --- /dev/null +++ b/packages/skeleton-react/src/components/tags-input/modules/root-context.ts @@ -0,0 +1,4 @@ +import type { useTagsInput } from './provider'; +import { createContext } from '@/internal/create-context'; + +export const RootContext = createContext<ReturnType<typeof useTagsInput>>(); diff --git a/packages/skeleton-react/src/components/toast/anatomy/action-trigger.tsx b/packages/skeleton-react/src/components/toast/anatomy/action-trigger.tsx new file mode 100644 index 0000000000..dfc0d87f02 --- /dev/null +++ b/packages/skeleton-react/src/components/toast/anatomy/action-trigger.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context.js'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesToast } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface ToastActionTriggerProps extends PropsWithElement<'button'>, HTMLAttributes<'button'> {} + +export default function ActionTrigger(props: ToastActionTriggerProps) { + const toast = use(RootContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + toast.getActionTriggerProps(), + { + className: classesToast.actionTrigger, + }, + rest, + ); + + return element ? element(attributes) : <button {...attributes}>{children}</button>; +} diff --git a/packages/skeleton-react/src/components/toast/anatomy/close-trigger.tsx b/packages/skeleton-react/src/components/toast/anatomy/close-trigger.tsx new file mode 100644 index 0000000000..c9053905ab --- /dev/null +++ b/packages/skeleton-react/src/components/toast/anatomy/close-trigger.tsx @@ -0,0 +1,25 @@ +import { RootContext } from '../modules/root-context.js'; +import X from '@/internal/components/x'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesToast } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface ToastCloseTriggerProps extends PropsWithElement<'button'>, HTMLAttributes<'button'> {} + +export default function CloseTrigger(props: ToastCloseTriggerProps) { + const toast = use(RootContext); + + const { element, children = <X />, ...rest } = props; + + const attributes = mergeProps( + toast.getCloseTriggerProps(), + { + className: classesToast.closeTrigger, + }, + rest, + ); + + return element ? element(attributes) : <button {...attributes}>{children}</button>; +} diff --git a/packages/skeleton-react/src/components/toast/anatomy/description.tsx b/packages/skeleton-react/src/components/toast/anatomy/description.tsx new file mode 100644 index 0000000000..8c1717f0cc --- /dev/null +++ b/packages/skeleton-react/src/components/toast/anatomy/description.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesToast } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface ToastDescriptionProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} + +export default function Description(props: ToastDescriptionProps) { + const toast = use(RootContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + toast.getDescriptionProps(), + { + className: classesToast.description, + }, + rest, + ); + + return element ? element(attributes) : <div {...attributes}>{children}</div>; +} diff --git a/packages/skeleton-react/src/components/toast/anatomy/group.tsx b/packages/skeleton-react/src/components/toast/anatomy/group.tsx new file mode 100644 index 0000000000..44a40ca9f6 --- /dev/null +++ b/packages/skeleton-react/src/components/toast/anatomy/group.tsx @@ -0,0 +1,38 @@ +import { GroupContext } from '../modules/group-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesToast } from '@skeletonlabs/skeleton-common'; +import { mergeProps, normalizeProps, useMachine } from '@zag-js/react'; +import { group } from '@zag-js/toast'; +import type { Props, Store } from '@zag-js/toast'; +import type { JSX } from 'react'; +import { useId } from 'react'; + +export interface ToastGroupProps extends PropsWithElement<'div'>, HTMLAttributes<'div', 'id' | 'dir' | 'children'> { + toaster: Store; + children?: (toast: Props) => JSX.Element | null; +} + +export default function Group(props: ToastGroupProps) { + const { element, children, toaster, ...rest } = props; + + const service = useMachine(group.machine, { + id: useId(), + store: toaster, + }); + const api = group.connect(service, normalizeProps); + + const attributes = mergeProps( + api.getGroupProps(), + { + className: classesToast.group, + }, + rest, + ); + + return ( + <GroupContext.Provider value={service}> + {element ? element(attributes) : <div {...attributes}>{api.getToasts().map((toast) => children?.(toast))}</div>} + </GroupContext.Provider> + ); +} diff --git a/packages/skeleton-react/src/components/toast/anatomy/message.tsx b/packages/skeleton-react/src/components/toast/anatomy/message.tsx new file mode 100644 index 0000000000..db675a8a68 --- /dev/null +++ b/packages/skeleton-react/src/components/toast/anatomy/message.tsx @@ -0,0 +1,19 @@ +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesToast } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; + +export interface ToastMessageProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} + +export default function Message(props: ToastMessageProps) { + const { element, children, ...rest } = props; + + const attributes = mergeProps( + { + className: classesToast.message, + }, + rest, + ); + + return element ? element(attributes) : <div {...attributes}>{children}</div>; +} diff --git a/packages/skeleton-react/src/components/toast/anatomy/root-context.tsx b/packages/skeleton-react/src/components/toast/anatomy/root-context.tsx new file mode 100644 index 0000000000..c58d847478 --- /dev/null +++ b/packages/skeleton-react/src/components/toast/anatomy/root-context.tsx @@ -0,0 +1,17 @@ +import { RootContext as RootContext_ } from '../modules/root-context'; +import type { PropTypes } from '@zag-js/react'; +import type { Api } from '@zag-js/toast'; +import { use } from 'react'; +import type { ReactNode } from 'react'; + +export interface ToastRootContextProps { + children: (toast: Api<PropTypes>) => ReactNode; +} + +export default function RootContext(props: ToastRootContextProps) { + const toast = use(RootContext_); + + const { children } = props; + + return children(toast); +} diff --git a/packages/skeleton-react/src/components/toast/anatomy/root.tsx b/packages/skeleton-react/src/components/toast/anatomy/root.tsx new file mode 100644 index 0000000000..035408ef32 --- /dev/null +++ b/packages/skeleton-react/src/components/toast/anatomy/root.tsx @@ -0,0 +1,68 @@ +import { GroupContext } from '../modules/group-context'; +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesToast } from '@skeletonlabs/skeleton-common'; +import { mergeProps, normalizeProps, useMachine } from '@zag-js/react'; +import { connect, machine } from '@zag-js/toast'; +import type { Options } from '@zag-js/toast'; +import { use, useId } from 'react'; + +export interface ToastRootProps extends PropsWithElement<'div'>, HTMLAttributes<'div', 'id' | 'dir'> { + toast: Omit<Options, 'id' | 'parent'>; +} + +export default function Root(props: ToastRootProps) { + const group = use(GroupContext); + + const { element, children, toast: toastProps, ...rest } = props; + + const service = useMachine(machine, { + id: useId(), + parent: group, + ...toastProps, + }); + const toast = connect(service, normalizeProps); + + const attributes = mergeProps( + toast.getRootProps(), + { + className: classesToast.root, + }, + rest, + ); + + return ( + <> + <RootContext.Provider value={toast}> + <div {...toast.getGhostBeforeProps()} /> + {element ? element(attributes) : <div {...attributes}>{children}</div>} + <div {...toast.getGhostAfterProps()} /> + </RootContext.Provider> + <style>{` + [data-part='root'] { + translate: var(--x) var(--y); + scale: var(--scale); + z-index: var(--z-index); + height: var(--height); + opacity: var(--opacity); + will-change: translate, opacity, scale; + } + [data-part='root'] { + transition: + translate 400ms, + scale 400ms, + opacity 400ms; + transition-timing-function: cubic-bezier(0.21, 1.02, 0.73, 1); + } + [data-part='root'][data-state='closed'] { + transition: + translate 400ms, + scale 400ms, + opacity 200ms; + transition-timing-function: cubic-bezier(0.06, 0.71, 0.55, 1); + } + `}</style> + </> + ); +} diff --git a/packages/skeleton-react/src/components/toast/anatomy/title.tsx b/packages/skeleton-react/src/components/toast/anatomy/title.tsx new file mode 100644 index 0000000000..eafcf260f1 --- /dev/null +++ b/packages/skeleton-react/src/components/toast/anatomy/title.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesToast } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface ToastTitleProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} + +export default function Title(props: ToastTitleProps) { + const toast = use(RootContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + toast.getTitleProps(), + { + className: classesToast.title, + }, + rest, + ); + + return element ? element(attributes) : <div {...attributes}>{children}</div>; +} diff --git a/packages/skeleton-react/src/components/toast/index.ts b/packages/skeleton-react/src/components/toast/index.ts new file mode 100644 index 0000000000..c7a1617738 --- /dev/null +++ b/packages/skeleton-react/src/components/toast/index.ts @@ -0,0 +1,9 @@ +export type { ToastCloseTriggerProps } from './anatomy/close-trigger'; +export type { ToastDescriptionProps } from './anatomy/description'; +export type { ToastGroupProps } from './anatomy/group'; +export type { ToastMessageProps } from './anatomy/message'; +export type { ToastRootProps } from './anatomy/root'; +export type { ToastRootContextProps } from './anatomy/root-context'; +export type { ToastTitleProps } from './anatomy/title'; +export { Toast } from './modules/anatomy'; +export { createStore as createToaster } from '@zag-js/toast'; diff --git a/packages/skeleton-react/src/components/toast/modules/anatomy.ts b/packages/skeleton-react/src/components/toast/modules/anatomy.ts new file mode 100644 index 0000000000..1cccf66e7b --- /dev/null +++ b/packages/skeleton-react/src/components/toast/modules/anatomy.ts @@ -0,0 +1,18 @@ +import ActionTrigger from '../anatomy/action-trigger'; +import CloseTrigger from '../anatomy/close-trigger'; +import Description from '../anatomy/description'; +import Group from '../anatomy/group'; +import Message from '../anatomy/message'; +import Root from '../anatomy/root'; +import RootContext from '../anatomy/root-context'; +import Title from '../anatomy/title'; + +export const Toast = Object.assign(Root, { + Context: RootContext, + Group: Group, + Message: Message, + Title: Title, + Description: Description, + ActionTrigger: ActionTrigger, + CloseTrigger: CloseTrigger, +}); diff --git a/packages/skeleton-react/src/components/toast/modules/group-context.ts b/packages/skeleton-react/src/components/toast/modules/group-context.ts new file mode 100644 index 0000000000..7bc06aa7d6 --- /dev/null +++ b/packages/skeleton-react/src/components/toast/modules/group-context.ts @@ -0,0 +1,4 @@ +import { createContext } from '@/internal/create-context'; +import type { GroupService } from '@zag-js/toast'; + +export const GroupContext = createContext<GroupService>(); diff --git a/packages/skeleton-react/src/components/toast/modules/root-context.ts b/packages/skeleton-react/src/components/toast/modules/root-context.ts new file mode 100644 index 0000000000..9c724793dd --- /dev/null +++ b/packages/skeleton-react/src/components/toast/modules/root-context.ts @@ -0,0 +1,5 @@ +import { createContext } from '@/internal/create-context'; +import type { PropTypes } from '@zag-js/react'; +import type { Api } from '@zag-js/toast'; + +export const RootContext = createContext<Api<PropTypes>>(); diff --git a/packages/skeleton-react/src/components/tooltip/anatomy/arrow-tip.tsx b/packages/skeleton-react/src/components/tooltip/anatomy/arrow-tip.tsx new file mode 100644 index 0000000000..b225402fbe --- /dev/null +++ b/packages/skeleton-react/src/components/tooltip/anatomy/arrow-tip.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesTooltip } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface TooltipArrowTipProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} + +export default function ArrowTip(props: TooltipArrowTipProps) { + const tooltip = use(RootContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + tooltip.getArrowTipProps(), + { + className: classesTooltip.arrowTip, + }, + rest, + ); + + return element ? element(attributes) : <div {...attributes}>{children}</div>; +} diff --git a/packages/skeleton-react/src/components/tooltip/anatomy/arrow.tsx b/packages/skeleton-react/src/components/tooltip/anatomy/arrow.tsx new file mode 100644 index 0000000000..2c9d98c42e --- /dev/null +++ b/packages/skeleton-react/src/components/tooltip/anatomy/arrow.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesTooltip } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface TooltipArrowProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} + +export default function Arrow(props: TooltipArrowProps) { + const tooltip = use(RootContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + tooltip.getArrowProps(), + { + className: classesTooltip.arrow, + }, + rest, + ); + + return element ? element(attributes) : <div {...attributes}>{children}</div>; +} diff --git a/packages/skeleton-react/src/components/tooltip/anatomy/content.tsx b/packages/skeleton-react/src/components/tooltip/anatomy/content.tsx new file mode 100644 index 0000000000..73b6af47e7 --- /dev/null +++ b/packages/skeleton-react/src/components/tooltip/anatomy/content.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesTooltip } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface TooltipContentProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} + +export default function Content(props: TooltipContentProps) { + const tooltip = use(RootContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + tooltip.getContentProps(), + { + className: classesTooltip.content, + }, + rest, + ); + + return element ? element(attributes) : <div {...attributes}>{children}</div>; +} diff --git a/packages/skeleton-react/src/components/tooltip/anatomy/positioner.tsx b/packages/skeleton-react/src/components/tooltip/anatomy/positioner.tsx new file mode 100644 index 0000000000..3f4448fd91 --- /dev/null +++ b/packages/skeleton-react/src/components/tooltip/anatomy/positioner.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesTooltip } from '@skeletonlabs/skeleton-common'; +import { mergeProps, Portal } from '@zag-js/react'; +import { use } from 'react'; + +export interface TooltipPositionerProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} + +export default function Positioner(props: TooltipPositionerProps) { + const tooltip = use(RootContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + tooltip.getPositionerProps(), + { + className: classesTooltip.positioner, + }, + rest, + ); + + return <Portal>{element ? element(attributes) : <div {...attributes}>{children}</div>}</Portal>; +} diff --git a/packages/skeleton-react/src/components/tooltip/anatomy/root-context.tsx b/packages/skeleton-react/src/components/tooltip/anatomy/root-context.tsx new file mode 100644 index 0000000000..1ba8026d53 --- /dev/null +++ b/packages/skeleton-react/src/components/tooltip/anatomy/root-context.tsx @@ -0,0 +1,15 @@ +import type { useTooltip } from '../modules/provider'; +import { RootContext as RootContext_ } from '../modules/root-context'; +import { type ReactNode, use } from 'react'; + +export interface TooltipRootContextProps { + children: (tooltip: ReturnType<typeof useTooltip>) => ReactNode; +} + +export default function RootContext(props: TooltipRootContextProps) { + const tooltip = use(RootContext_); + + const { children } = props; + + return children(tooltip); +} diff --git a/packages/skeleton-react/src/components/tooltip/anatomy/root-provider.tsx b/packages/skeleton-react/src/components/tooltip/anatomy/root-provider.tsx new file mode 100644 index 0000000000..dd7aa7f82f --- /dev/null +++ b/packages/skeleton-react/src/components/tooltip/anatomy/root-provider.tsx @@ -0,0 +1,13 @@ +import type { useTooltip } from '../modules/provider'; +import { RootContext } from '../modules/root-context'; +import type { PropsWithChildren } from 'react'; + +export interface TooltipRootProviderProps extends PropsWithChildren { + value: ReturnType<typeof useTooltip>; +} + +export default function RootProvider(props: TooltipRootProviderProps) { + const { children, value: tooltip } = props; + + return <RootContext.Provider value={tooltip}>{children}</RootContext.Provider>; +} diff --git a/packages/skeleton-react/src/components/tooltip/anatomy/root.tsx b/packages/skeleton-react/src/components/tooltip/anatomy/root.tsx new file mode 100644 index 0000000000..582d08b73b --- /dev/null +++ b/packages/skeleton-react/src/components/tooltip/anatomy/root.tsx @@ -0,0 +1,15 @@ +import { useTooltip } from '../modules/provider'; +import { RootContext } from '../modules/root-context'; +import { type Props, splitProps } from '@zag-js/tooltip'; +import type { PropsWithChildren } from 'react'; + +export interface TooltipRootProps extends PropsWithChildren, Omit<Props, 'id'> {} + +export default function Root(props: TooltipRootProps) { + const [tooltipProps, componentProps] = splitProps(props); + const { children } = componentProps; + + const tooltip = useTooltip(tooltipProps); + + return <RootContext.Provider value={tooltip}>{children}</RootContext.Provider>; +} diff --git a/packages/skeleton-react/src/components/tooltip/anatomy/trigger.tsx b/packages/skeleton-react/src/components/tooltip/anatomy/trigger.tsx new file mode 100644 index 0000000000..3264291076 --- /dev/null +++ b/packages/skeleton-react/src/components/tooltip/anatomy/trigger.tsx @@ -0,0 +1,24 @@ +import { RootContext } from '../modules/root-context'; +import type { HTMLAttributes } from '@/internal/html-attributes'; +import type { PropsWithElement } from '@/internal/props-with-element'; +import { classesTooltip } from '@skeletonlabs/skeleton-common'; +import { mergeProps } from '@zag-js/react'; +import { use } from 'react'; + +export interface TooltipTriggerProps extends PropsWithElement<'button'>, HTMLAttributes<'button'> {} + +export default function Trigger(props: TooltipTriggerProps) { + const tooltip = use(RootContext); + + const { element, children, ...rest } = props; + + const attributes = mergeProps( + tooltip.getTriggerProps(), + { + className: classesTooltip.trigger, + }, + rest, + ); + + return element ? element(attributes) : <button {...attributes}>{children}</button>; +} diff --git a/packages/skeleton-react/src/components/tooltip/index.ts b/packages/skeleton-react/src/components/tooltip/index.ts new file mode 100644 index 0000000000..c58aa52126 --- /dev/null +++ b/packages/skeleton-react/src/components/tooltip/index.ts @@ -0,0 +1,10 @@ +export type { TooltipArrowProps } from './anatomy/arrow'; +export type { TooltipArrowTipProps } from './anatomy/arrow-tip'; +export type { TooltipContentProps } from './anatomy/content'; +export type { TooltipPositionerProps } from './anatomy/positioner'; +export type { TooltipRootProps } from './anatomy/root'; +export type { TooltipRootContextProps } from './anatomy/root-context'; +export type { TooltipRootProviderProps } from './anatomy/root-provider'; +export type { TooltipTriggerProps } from './anatomy/trigger'; +export { Tooltip } from './modules/anatomy'; +export { useTooltip } from './modules/provider'; diff --git a/packages/skeleton-react/src/components/tooltip/modules/anatomy.ts b/packages/skeleton-react/src/components/tooltip/modules/anatomy.ts new file mode 100644 index 0000000000..89cbba49c3 --- /dev/null +++ b/packages/skeleton-react/src/components/tooltip/modules/anatomy.ts @@ -0,0 +1,18 @@ +import Arrow from '../anatomy/arrow'; +import ArrowTip from '../anatomy/arrow-tip'; +import Content from '../anatomy/content'; +import Positioner from '../anatomy/positioner'; +import Root from '../anatomy/root'; +import RootContext from '../anatomy/root-context'; +import RootProvider from '../anatomy/root-provider'; +import Trigger from '../anatomy/trigger'; + +export const Tooltip = Object.assign(Root, { + Provider: RootProvider, + Context: RootContext, + Trigger: Trigger, + Positioner: Positioner, + Content: Content, + Arrow: Arrow, + ArrowTip: ArrowTip, +}); diff --git a/packages/skeleton-react/src/components/tooltip/modules/provider.ts b/packages/skeleton-react/src/components/tooltip/modules/provider.ts new file mode 100644 index 0000000000..3876ac8b3c --- /dev/null +++ b/packages/skeleton-react/src/components/tooltip/modules/provider.ts @@ -0,0 +1,11 @@ +import { normalizeProps, useMachine, type PropTypes } from '@zag-js/react'; +import { type Api, connect, machine, type Props } from '@zag-js/tooltip'; +import { useId } from 'react'; + +export function useTooltip(props: Omit<Props, 'id'> = {}): Api<PropTypes> { + const service = useMachine(machine, { + id: useId(), + ...props, + }); + return connect(service, normalizeProps); +} diff --git a/packages/skeleton-react/src/components/tooltip/modules/root-context.ts b/packages/skeleton-react/src/components/tooltip/modules/root-context.ts new file mode 100644 index 0000000000..25e6a79914 --- /dev/null +++ b/packages/skeleton-react/src/components/tooltip/modules/root-context.ts @@ -0,0 +1,4 @@ +import type { useTooltip } from './provider'; +import { createContext } from '@/internal/create-context'; + +export const RootContext = createContext<ReturnType<typeof useTooltip>>(); diff --git a/packages/skeleton-react/src/hooks/use-list-collection.ts b/packages/skeleton-react/src/hooks/use-list-collection.ts new file mode 100644 index 0000000000..7db88eb170 --- /dev/null +++ b/packages/skeleton-react/src/hooks/use-list-collection.ts @@ -0,0 +1,5 @@ +import { type CollectionItem, type CollectionOptions, ListCollection } from '@zag-js/collection'; + +export function useListCollection<T extends CollectionItem = CollectionItem>(options: CollectionOptions<T>) { + return new ListCollection(options); +} diff --git a/packages/skeleton-react/src/index.css b/packages/skeleton-react/src/index.css new file mode 100644 index 0000000000..8a219bdce5 --- /dev/null +++ b/packages/skeleton-react/src/index.css @@ -0,0 +1,2 @@ +@import '@skeletonlabs/skeleton-common'; +@source './'; diff --git a/packages/skeleton-react/src/index.ts b/packages/skeleton-react/src/index.ts new file mode 100644 index 0000000000..39eb29e61d --- /dev/null +++ b/packages/skeleton-react/src/index.ts @@ -0,0 +1,19 @@ +export * from './components/accordion/index'; +export * from './components/app-bar/index'; +export * from './components/avatar/index'; +export * from './components/combobox/index'; +export * from './components/dialog/index'; +export * from './components/file-upload/index'; +export * from './components/popover/index'; +export * from './components/portal/index'; +export * from './components/progress-linear/index'; +export * from './components/rating-group/index'; +export * from './components/segmented-control/index'; +export * from './components/slider/index'; +export * from './components/switch/index'; +export * from './components/tabs/index'; +export * from './components/tags-input/index'; +export * from './components/toast/index'; +export * from './components/tooltip/index'; + +export * from './hooks/use-list-collection'; diff --git a/packages/skeleton-react/src/internal/components/check.tsx b/packages/skeleton-react/src/internal/components/check.tsx new file mode 100644 index 0000000000..58fae450e3 --- /dev/null +++ b/packages/skeleton-react/src/internal/components/check.tsx @@ -0,0 +1,27 @@ +import type { HTMLAttributes } from '../html-attributes'; +import { mergeProps } from '@zag-js/react'; + +export type CheckProps = HTMLAttributes<'svg', 'children'>; + +export default function Check(props: CheckProps) { + const { ...rest } = props; + const attributes = mergeProps( + { + xmlns: 'http://www.w3.org/2000/svg', + width: '24', + height: '24', + viewBox: '0 0 24 24', + fill: 'none', + stroke: 'currentColor', + strokeWidth: '2', + strokeLinecap: 'round', + strokeLinejoin: 'round', + }, + rest, + ); + return ( + <svg {...attributes}> + <path d="M20 6 9 17l-5-5" /> + </svg> + ); +} diff --git a/packages/skeleton-react/src/internal/components/chevron-down.tsx b/packages/skeleton-react/src/internal/components/chevron-down.tsx new file mode 100644 index 0000000000..e56db67d5c --- /dev/null +++ b/packages/skeleton-react/src/internal/components/chevron-down.tsx @@ -0,0 +1,17 @@ +export default function ChevronDown() { + return ( + <svg + xmlns="http://www.w3.org/2000/svg" + width="24" + height="24" + viewBox="0 0 24 24" + fill="none" + stroke="currentColor" + strokeWidth="2" + strokeLinecap="round" + strokeLinejoin="round" + > + <path d="m6 9 6 6 6-6" /> + </svg> + ); +} diff --git a/packages/skeleton-react/src/internal/components/star-empty.tsx b/packages/skeleton-react/src/internal/components/star-empty.tsx new file mode 100644 index 0000000000..8370269c51 --- /dev/null +++ b/packages/skeleton-react/src/internal/components/star-empty.tsx @@ -0,0 +1,16 @@ +export default function StarEmpty() { + return ( + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="24" width="24" fill="none" stroke="currentColor" strokeWidth="1.5"> + <path + strokeLinecap="round" + strokeLinejoin="round" + d="M11.48 3.499a.562.562 0 0 1 1.04 0l2.125 5.111a.563.563 0 0 0 .475.345 + l5.518.442c.499.04.701.663.321.988l-4.204 3.602a.563.563 0 0 0-.182.557 + l1.285 5.385a.562.562 0 0 1-.84.61l-4.725-2.885a.562.562 0 0 0-.586 0 + L6.982 20.54a.562.562 0 0 1-.84-.61l1.285-5.386a.562.562 0 0 0-.182-.557 + l-4.204-3.602a.562.562 0 0 1 .321-.988l5.518-.442a.563.563 0 0 0 .475-.345 + L11.48 3.5Z" + /> + </svg> + ); +} diff --git a/packages/skeleton-react/src/internal/components/star-full.tsx b/packages/skeleton-react/src/internal/components/star-full.tsx new file mode 100644 index 0000000000..2cee6970f0 --- /dev/null +++ b/packages/skeleton-react/src/internal/components/star-full.tsx @@ -0,0 +1,16 @@ +export default function StarFull() { + return ( + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="24" width="24" fill="currentColor"> + <path + fillRule="evenodd" + clipRule="evenodd" + d="M10.788 3.21c.448-1.077 1.976-1.077 2.424 0l2.082 5.006 + 5.404.434c1.164.093 1.636 1.545.749 2.305l-4.117 3.527 + 1.257 5.273c.271 1.136-.964 2.033-1.96 1.425L12 18.354 + 7.373 21.18c-.996.608-2.231-.29-1.96-1.425l1.257-5.273 + -4.117-3.527c-.887-.76-.415-2.212.749-2.305l5.404-.434 + 2.082-5.005Z" + /> + </svg> + ); +} diff --git a/packages/skeleton-react/src/internal/components/star-half.tsx b/packages/skeleton-react/src/internal/components/star-half.tsx new file mode 100644 index 0000000000..5958301cb0 --- /dev/null +++ b/packages/skeleton-react/src/internal/components/star-half.tsx @@ -0,0 +1,23 @@ +export default function StarHalf() { + return ( + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="24" width="24" fill="none" stroke="currentColor" strokeWidth="1.5"> + <defs> + <linearGradient id="half-fill" x1="0%" y1="0%" x2="100%" y2="0%"> + <stop offset="50%" stopColor="currentColor" /> + <stop offset="50%" stopColor="transparent" /> + </linearGradient> + </defs> + <path + fill="url(#half-fill)" + strokeLinecap="round" + strokeLinejoin="round" + d="M11.48 3.499a.562.562 0 0 1 1.04 0l2.125 5.111a.563.563 0 0 0 .475.345 + l5.518.442c.499.04.701.663.321.988l-4.204 3.602a.563.563 0 0 0-.182.557 + l1.285 5.385a.562.562 0 0 1-.84.61l-4.725-2.885a.562.562 0 0 0-.586 0 + L6.982 20.54a.562.562 0 0 1-.84-.61l1.285-5.386a.562.562 0 0 0-.182-.557 + l-4.204-3.602a.562.562 0 0 1 .321-.988l5.518-.442a.563.563 0 0 0 .475-.345 + L11.48 3.5Z" + /> + </svg> + ); +} diff --git a/packages/skeleton-react/src/internal/components/x.tsx b/packages/skeleton-react/src/internal/components/x.tsx new file mode 100644 index 0000000000..aa20194918 --- /dev/null +++ b/packages/skeleton-react/src/internal/components/x.tsx @@ -0,0 +1,28 @@ +import type { HTMLAttributes } from '../html-attributes'; +import { mergeProps } from '@zag-js/react'; + +export type XProps = HTMLAttributes<'svg', 'children'>; + +export default function X(props: XProps) { + const { ...rest } = props; + const attributes = mergeProps( + { + xmlns: 'http://www.w3.org/2000/svg', + width: '24', + height: '24', + viewBox: '0 0 24 24', + fill: 'none', + stroke: 'currentColor', + strokeWidth: '2', + strokeLinecap: 'round', + strokeLinejoin: 'round', + }, + rest, + ); + return ( + <svg {...attributes}> + <path d="M18 6 6 18" /> + <path d="m6 6 12 12" /> + </svg> + ); +} diff --git a/packages/skeleton-react/src/internal/create-context.ts b/packages/skeleton-react/src/internal/create-context.ts new file mode 100644 index 0000000000..2674f6ab4c --- /dev/null +++ b/packages/skeleton-react/src/internal/create-context.ts @@ -0,0 +1,5 @@ +import { createContext as createContextReact } from 'react'; + +export function createContext<T>() { + return createContextReact<T>(undefined!); +} diff --git a/packages/skeleton-react/src/internal/html-attributes.ts b/packages/skeleton-react/src/internal/html-attributes.ts new file mode 100644 index 0000000000..ba821f9770 --- /dev/null +++ b/packages/skeleton-react/src/internal/html-attributes.ts @@ -0,0 +1,3 @@ +import type { ComponentProps, JSX } from 'react'; + +export type HTMLAttributes<T extends keyof JSX.IntrinsicElements, U extends keyof ComponentProps<T> = never> = Omit<ComponentProps<T>, U>; diff --git a/packages/skeleton-react/src/internal/props-with-element.ts b/packages/skeleton-react/src/internal/props-with-element.ts new file mode 100644 index 0000000000..0c83bee2d5 --- /dev/null +++ b/packages/skeleton-react/src/internal/props-with-element.ts @@ -0,0 +1,9 @@ +import type { HTMLAttributes } from './html-attributes'; +import type { JSX } from 'react'; + +export interface PropsWithElement<T extends keyof JSX.IntrinsicElements> { + /** + * Render the element yourself + */ + element?: (attributes: HTMLAttributes<T>) => JSX.Element; +} diff --git a/packages/skeleton-react/test/components/accordion/index.test.tsx b/packages/skeleton-react/test/components/accordion/index.test.tsx new file mode 100644 index 0000000000..4971661c06 --- /dev/null +++ b/packages/skeleton-react/test/components/accordion/index.test.tsx @@ -0,0 +1,47 @@ +import Test from './test'; +import { render, screen } from '@testing-library/react'; +import { describe, expect, it } from 'vitest'; + +describe('Accordion', () => { + describe('Root', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('root')).toBeInTheDocument(); + }); + }); + + describe('Item', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('item')).toBeInTheDocument(); + }); + }); + + describe('ItemHeading', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('item-heading')).toBeInTheDocument(); + }); + }); + + describe('ItemTrigger', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('item-trigger')).toBeInTheDocument(); + }); + }); + + describe('ItemIndicator', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('item-indicator')).toBeInTheDocument(); + }); + }); + + describe('ItemContent', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('item-content')).toBeInTheDocument(); + }); + }); +}); diff --git a/packages/skeleton-react/test/components/accordion/test.tsx b/packages/skeleton-react/test/components/accordion/test.tsx new file mode 100644 index 0000000000..e9b3b4a5a6 --- /dev/null +++ b/packages/skeleton-react/test/components/accordion/test.tsx @@ -0,0 +1,15 @@ +import { Accordion } from '@/index'; + +export default function Test() { + return ( + <Accordion data-testid="root"> + <Accordion.Item value="item" data-testid="item"> + <Accordion.ItemHeading data-testid="item-heading"> + <Accordion.ItemTrigger data-testid="item-trigger" /> + <Accordion.ItemIndicator data-testid="item-indicator" /> + <Accordion.ItemContent data-testid="item-content" /> + </Accordion.ItemHeading> + </Accordion.Item> + </Accordion> + ); +} diff --git a/packages/skeleton-react/test/components/app-bar/index.test.tsx b/packages/skeleton-react/test/components/app-bar/index.test.tsx new file mode 100644 index 0000000000..66c92cc5c1 --- /dev/null +++ b/packages/skeleton-react/test/components/app-bar/index.test.tsx @@ -0,0 +1,40 @@ +import Test from './test'; +import { render, screen } from '@testing-library/react'; +import { describe, expect, it } from 'vitest'; + +describe('AppBar', () => { + describe('Root', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('root')).toBeInTheDocument(); + }); + }); + + describe('Toolbar', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('toolbar')).toBeInTheDocument(); + }); + }); + + describe('Lead', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('lead')).toBeInTheDocument(); + }); + }); + + describe('Headline', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('headline')).toBeInTheDocument(); + }); + }); + + describe('Trail', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('trail')).toBeInTheDocument(); + }); + }); +}); diff --git a/packages/skeleton-react/test/components/app-bar/test.tsx b/packages/skeleton-react/test/components/app-bar/test.tsx new file mode 100644 index 0000000000..fa6c139c7b --- /dev/null +++ b/packages/skeleton-react/test/components/app-bar/test.tsx @@ -0,0 +1,13 @@ +import { AppBar } from '@/index'; + +export default function Test() { + return ( + <AppBar data-testid="root"> + <AppBar.Toolbar data-testid="toolbar"> + <AppBar.Lead data-testid="lead" /> + <AppBar.Headline data-testid="headline" /> + <AppBar.Trail data-testid="trail" /> + </AppBar.Toolbar> + </AppBar> + ); +} diff --git a/packages/skeleton-react/test/components/avatar/index.test.tsx b/packages/skeleton-react/test/components/avatar/index.test.tsx new file mode 100644 index 0000000000..297ebfbf19 --- /dev/null +++ b/packages/skeleton-react/test/components/avatar/index.test.tsx @@ -0,0 +1,26 @@ +import Test from './test'; +import { render, screen } from '@testing-library/react'; +import { describe, expect, it } from 'vitest'; + +describe('Avatar', () => { + describe('Root', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('root')).toBeInTheDocument(); + }); + }); + + describe('Image', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('image')).toBeInTheDocument(); + }); + }); + + describe('Fallback', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('fallback')).toBeInTheDocument(); + }); + }); +}); diff --git a/packages/skeleton-react/test/components/avatar/test.tsx b/packages/skeleton-react/test/components/avatar/test.tsx new file mode 100644 index 0000000000..7234463cf2 --- /dev/null +++ b/packages/skeleton-react/test/components/avatar/test.tsx @@ -0,0 +1,10 @@ +import { Avatar } from '@/index'; + +export default function Test() { + return ( + <Avatar data-testid="root"> + <Avatar.Image data-testid="image" src="https://picsum.photos/100/100" /> + <Avatar.Fallback data-testid="fallback">SK</Avatar.Fallback> + </Avatar> + ); +} diff --git a/packages/skeleton-react/test/components/combobox/index.test.tsx b/packages/skeleton-react/test/components/combobox/index.test.tsx new file mode 100644 index 0000000000..922a2aae1d --- /dev/null +++ b/packages/skeleton-react/test/components/combobox/index.test.tsx @@ -0,0 +1,89 @@ +import Test from './test'; +import { render, screen } from '@testing-library/react'; +import { describe, expect, it } from 'vitest'; + +describe('Combobox', () => { + describe('Root', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('root')).toBeInTheDocument(); + }); + }); + + describe('Label', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('label')).toBeInTheDocument(); + }); + }); + + describe('Control', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('control')).toBeInTheDocument(); + }); + }); + + describe('Input', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('input')).toBeInTheDocument(); + }); + }); + + describe('Trigger', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('trigger')).toBeInTheDocument(); + }); + }); + + describe('Positioner', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('positioner')).toBeInTheDocument(); + }); + }); + + describe('Content', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('content')).toBeInTheDocument(); + }); + }); + + describe('item group', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('item-group')).toBeInTheDocument(); + }); + }); + + describe('item group label', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('item-group-label')).toBeInTheDocument(); + }); + }); + + describe('Item', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('item')).toBeInTheDocument(); + }); + }); + + describe('item text', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('item-text')).toBeInTheDocument(); + }); + }); + + describe('item indicator', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('item-indicator')).toBeInTheDocument(); + }); + }); +}); diff --git a/packages/skeleton-react/test/components/combobox/test.tsx b/packages/skeleton-react/test/components/combobox/test.tsx new file mode 100644 index 0000000000..daf22460b6 --- /dev/null +++ b/packages/skeleton-react/test/components/combobox/test.tsx @@ -0,0 +1,24 @@ +import { Combobox } from '@/index'; + +export default function Test() { + return ( + <Combobox data-testid="root"> + <Combobox.Label data-testid="label" /> + <Combobox.Control data-testid="control"> + <Combobox.Input data-testid="input" /> + <Combobox.Trigger data-testid="trigger" /> + </Combobox.Control> + <Combobox.Positioner data-testid="positioner"> + <Combobox.Content data-testid="content"> + <Combobox.ItemGroup data-testid="item-group"> + <Combobox.ItemGroupLabel data-testid="item-group-label" /> + <Combobox.Item item="item" data-testid="item"> + <Combobox.ItemText data-testid="item-text" /> + <Combobox.ItemIndicator data-testid="item-indicator" /> + </Combobox.Item> + </Combobox.ItemGroup> + </Combobox.Content> + </Combobox.Positioner> + </Combobox> + ); +} diff --git a/packages/skeleton-react/test/components/dialog/index.test.tsx b/packages/skeleton-react/test/components/dialog/index.test.tsx new file mode 100644 index 0000000000..98c62463b8 --- /dev/null +++ b/packages/skeleton-react/test/components/dialog/index.test.tsx @@ -0,0 +1,48 @@ +import Test from './test'; +import { render, screen } from '@testing-library/react'; +import { describe, expect, it } from 'vitest'; + +describe('Dialog', () => { + describe('Trigger', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('trigger')).toBeInTheDocument(); + }); + }); + describe('Backdrop', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('backdrop')).toBeInTheDocument(); + }); + }); + describe('Positioner', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('positioner')).toBeInTheDocument(); + }); + }); + describe('Content', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('content')).toBeInTheDocument(); + }); + }); + describe('Title', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('title')).toBeInTheDocument(); + }); + }); + describe('Description', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('description')).toBeInTheDocument(); + }); + }); + describe('CloseTrigger', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('close-trigger')).toBeInTheDocument(); + }); + }); +}); diff --git a/packages/skeleton-react/test/components/dialog/test.tsx b/packages/skeleton-react/test/components/dialog/test.tsx new file mode 100644 index 0000000000..1e082b48f2 --- /dev/null +++ b/packages/skeleton-react/test/components/dialog/test.tsx @@ -0,0 +1,17 @@ +import { Dialog } from '@/index'; + +export default function Test() { + return ( + <Dialog> + <Dialog.Trigger data-testid="trigger" /> + <Dialog.Backdrop data-testid="backdrop" /> + <Dialog.Positioner data-testid="positioner"> + <Dialog.Content data-testid="content"> + <Dialog.Title data-testid="title" /> + <Dialog.Description data-testid="description" /> + <Dialog.CloseTrigger data-testid="close-trigger" /> + </Dialog.Content> + </Dialog.Positioner> + </Dialog> + ); +} diff --git a/packages/skeleton-react/test/components/file-upload/index.test.tsx b/packages/skeleton-react/test/components/file-upload/index.test.tsx new file mode 100644 index 0000000000..53008266dd --- /dev/null +++ b/packages/skeleton-react/test/components/file-upload/index.test.tsx @@ -0,0 +1,68 @@ +import Test from './test'; +import { render, screen } from '@testing-library/react'; +import { describe, expect, it } from 'vitest'; + +describe('FileUpload', () => { + describe('Root', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('root')).toBeInTheDocument(); + }); + }); + + describe('Dropzone', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('dropzone')).toBeInTheDocument(); + }); + }); + + describe('Trigger', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('trigger')).toBeInTheDocument(); + }); + }); + + describe('ItemGroup', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('item-group')).toBeInTheDocument(); + }); + }); + + describe('Item', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('item')).toBeInTheDocument(); + }); + }); + + describe('ItemName', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('item-name')).toBeInTheDocument(); + }); + }); + + describe('ItemSizeText', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('item-size-text')).toBeInTheDocument(); + }); + }); + + describe('ItemDeleteTrigger', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('item-delete-trigger')).toBeInTheDocument(); + }); + }); + + describe('HiddenInput', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('hidden-input')).toBeInTheDocument(); + }); + }); +}); diff --git a/packages/skeleton-react/test/components/file-upload/test.tsx b/packages/skeleton-react/test/components/file-upload/test.tsx new file mode 100644 index 0000000000..8324513aca --- /dev/null +++ b/packages/skeleton-react/test/components/file-upload/test.tsx @@ -0,0 +1,19 @@ +import { FileUpload } from '@/index'; + +export default function Test() { + return ( + <FileUpload data-testid="root"> + <FileUpload.Dropzone data-testid="dropzone"> + <FileUpload.Trigger data-testid="trigger" /> + <FileUpload.HiddenInput data-testid="hidden-input" /> + </FileUpload.Dropzone> + <FileUpload.ItemGroup data-testid="item-group"> + <FileUpload.Item file={new File(['test'], 'test.txt')} data-testid="item"> + <FileUpload.ItemName data-testid="item-name" /> + <FileUpload.ItemSizeText data-testid="item-size-text" /> + <FileUpload.ItemDeleteTrigger data-testid="item-delete-trigger" /> + </FileUpload.Item> + </FileUpload.ItemGroup> + </FileUpload> + ); +} diff --git a/packages/skeleton-react/test/components/popover/index.test.tsx b/packages/skeleton-react/test/components/popover/index.test.tsx new file mode 100644 index 0000000000..5aae93a26a --- /dev/null +++ b/packages/skeleton-react/test/components/popover/index.test.tsx @@ -0,0 +1,54 @@ +import Test from './test'; +import { render, screen } from '@testing-library/react'; +import { describe, expect, it } from 'vitest'; + +describe('Popover', () => { + describe('Trigger', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('trigger')).toBeInTheDocument(); + }); + }); + describe('Positioner', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('positioner')).toBeInTheDocument(); + }); + }); + describe('Content', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('content')).toBeInTheDocument(); + }); + }); + describe('Arrow', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('arrow')).toBeInTheDocument(); + }); + }); + describe('arrow tip', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('arrow-tip')).toBeInTheDocument(); + }); + }); + describe('Title', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('title')).toBeInTheDocument(); + }); + }); + describe('Description', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('description')).toBeInTheDocument(); + }); + }); + describe('close trigger', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('close-trigger')).toBeInTheDocument(); + }); + }); +}); diff --git a/packages/skeleton-react/test/components/popover/test.tsx b/packages/skeleton-react/test/components/popover/test.tsx new file mode 100644 index 0000000000..efa139f448 --- /dev/null +++ b/packages/skeleton-react/test/components/popover/test.tsx @@ -0,0 +1,19 @@ +import { Popover } from '@/index'; + +export default function Test() { + return ( + <Popover> + <Popover.Trigger data-testid="trigger" /> + <Popover.Positioner data-testid="positioner"> + <Popover.Content data-testid="content"> + <Popover.Arrow data-testid="arrow"> + <Popover.ArrowTip data-testid="arrow-tip" /> + </Popover.Arrow> + <Popover.Title data-testid="title" /> + <Popover.Description data-testid="description" /> + <Popover.CloseTrigger data-testid="close-trigger" /> + </Popover.Content> + </Popover.Positioner> + </Popover> + ); +} diff --git a/packages/skeleton-react/test/components/progress-linear/index.test.tsx b/packages/skeleton-react/test/components/progress-linear/index.test.tsx new file mode 100644 index 0000000000..536bfa4249 --- /dev/null +++ b/packages/skeleton-react/test/components/progress-linear/index.test.tsx @@ -0,0 +1,33 @@ +import Test from './test'; +import { render, screen } from '@testing-library/react'; +import { describe, expect, it } from 'vitest'; + +describe('ProgressLinear', () => { + describe('Root', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('root')).toBeInTheDocument(); + }); + }); + + describe('Label', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('label')).toBeInTheDocument(); + }); + }); + + describe('Track', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('track')).toBeInTheDocument(); + }); + }); + + describe('Range', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('range')).toBeInTheDocument(); + }); + }); +}); diff --git a/packages/skeleton-react/test/components/progress-linear/test.tsx b/packages/skeleton-react/test/components/progress-linear/test.tsx new file mode 100644 index 0000000000..4e814506c5 --- /dev/null +++ b/packages/skeleton-react/test/components/progress-linear/test.tsx @@ -0,0 +1,12 @@ +import { ProgressLinear } from '@/index'; + +export default function Test() { + return ( + <ProgressLinear data-testid="root"> + <ProgressLinear.Label data-testid="label" /> + <ProgressLinear.Track data-testid="track"> + <ProgressLinear.Range data-testid="range" /> + </ProgressLinear.Track> + </ProgressLinear> + ); +} diff --git a/packages/skeleton-react/test/components/rating-group/index.test.tsx b/packages/skeleton-react/test/components/rating-group/index.test.tsx new file mode 100644 index 0000000000..3e0f7af35a --- /dev/null +++ b/packages/skeleton-react/test/components/rating-group/index.test.tsx @@ -0,0 +1,42 @@ +import Test from './test'; +import { render, screen } from '@testing-library/react'; +import { describe, expect, it } from 'vitest'; + +describe('RatingGroup', () => { + describe('Root', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('root')).toBeInTheDocument(); + }); + }); + + describe('Label', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('label')).toBeInTheDocument(); + }); + }); + + describe('Control', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('control')).toBeInTheDocument(); + }); + }); + + describe('Items', () => { + it('renders all items', () => { + render(<Test />); + expect(screen.getByTestId('item-1')).toBeInTheDocument(); + expect(screen.getByTestId('item-2')).toBeInTheDocument(); + expect(screen.getByTestId('item-3')).toBeInTheDocument(); + }); + }); + + describe('HiddenInput', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('hidden-input')).toBeInTheDocument(); + }); + }); +}); diff --git a/packages/skeleton-react/test/components/rating-group/test.tsx b/packages/skeleton-react/test/components/rating-group/test.tsx new file mode 100644 index 0000000000..feb9e8553c --- /dev/null +++ b/packages/skeleton-react/test/components/rating-group/test.tsx @@ -0,0 +1,21 @@ +import { RatingGroup } from '@/index'; + +export default function Test() { + return ( + <RatingGroup count={3} data-testid="root"> + <RatingGroup.Label data-testid="label">Label</RatingGroup.Label> + <RatingGroup.Control data-testid="control"> + <RatingGroup.Context> + {(ratingGroup) => + ratingGroup.items.map((index) => ( + <RatingGroup.Item key={index} index={index} data-testid={`item-${index}`}> + Item {index} + </RatingGroup.Item> + )) + } + </RatingGroup.Context> + </RatingGroup.Control> + <RatingGroup.HiddenInput data-testid="hidden-input" /> + </RatingGroup> + ); +} diff --git a/packages/skeleton-react/test/components/segmented-control/index.test.tsx b/packages/skeleton-react/test/components/segmented-control/index.test.tsx new file mode 100644 index 0000000000..ddf42b9636 --- /dev/null +++ b/packages/skeleton-react/test/components/segmented-control/index.test.tsx @@ -0,0 +1,40 @@ +import Test from './test'; +import { render, screen } from '@testing-library/react'; +import { describe, expect, it } from 'vitest'; + +describe('SegmentedControl', () => { + describe('Root', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('root')).toBeInTheDocument(); + }); + }); + + describe('Indicator', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('indicator')).toBeInTheDocument(); + }); + }); + + describe('Item', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('item')).toBeInTheDocument(); + }); + }); + + describe('item text', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('item-text')).toBeInTheDocument(); + }); + }); + + describe('item hidden input', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('item-hidden-input')).toBeInTheDocument(); + }); + }); +}); diff --git a/packages/skeleton-react/test/components/segmented-control/test.tsx b/packages/skeleton-react/test/components/segmented-control/test.tsx new file mode 100644 index 0000000000..cccef3d3ca --- /dev/null +++ b/packages/skeleton-react/test/components/segmented-control/test.tsx @@ -0,0 +1,13 @@ +import { SegmentedControl } from '@/index'; + +export default function Test() { + return ( + <SegmentedControl data-testid="root"> + <SegmentedControl.Indicator data-testid="indicator" /> + <SegmentedControl.Item value="item-1" data-testid="item"> + <SegmentedControl.ItemText data-testid="item-text" /> + <SegmentedControl.ItemHiddenInput data-testid="item-hidden-input" /> + </SegmentedControl.Item> + </SegmentedControl> + ); +} diff --git a/packages/skeleton-react/test/components/slider/index.test.tsx b/packages/skeleton-react/test/components/slider/index.test.tsx new file mode 100644 index 0000000000..482e397c0c --- /dev/null +++ b/packages/skeleton-react/test/components/slider/index.test.tsx @@ -0,0 +1,75 @@ +import Test from './test'; +import { render, screen } from '@testing-library/react'; +import { describe, expect, it } from 'vitest'; + +describe('Slider', () => { + describe('Root', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('root')).toBeInTheDocument(); + }); + }); + + describe('Label', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('label')).toBeInTheDocument(); + }); + }); + + describe('value text', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('value-text')).toBeInTheDocument(); + }); + }); + + describe('Control', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('control')).toBeInTheDocument(); + }); + }); + + describe('Track', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('track')).toBeInTheDocument(); + }); + }); + + describe('Range', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('range')).toBeInTheDocument(); + }); + }); + + describe('Thumb', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('thumb')).toBeInTheDocument(); + }); + }); + + describe('hidden input', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('hidden-input')).toBeInTheDocument(); + }); + }); + + describe('marker group', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('marker-group')).toBeInTheDocument(); + }); + }); + + describe('Marker', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('marker')).toBeInTheDocument(); + }); + }); +}); diff --git a/packages/skeleton-react/test/components/slider/test.tsx b/packages/skeleton-react/test/components/slider/test.tsx new file mode 100644 index 0000000000..7c1829e9b1 --- /dev/null +++ b/packages/skeleton-react/test/components/slider/test.tsx @@ -0,0 +1,21 @@ +import { Slider } from '@/index'; + +export default function Test() { + return ( + <Slider data-testid="root"> + <Slider.Label data-testid="label" /> + <Slider.ValueText data-testid="value-text" /> + <Slider.Control data-testid="control"> + <Slider.Track data-testid="track"> + <Slider.Range data-testid="range" /> + </Slider.Track> + <Slider.Thumb index={0} data-testid="thumb"> + <Slider.HiddenInput data-testid="hidden-input" /> + </Slider.Thumb> + </Slider.Control> + <Slider.MarkerGroup data-testid="marker-group"> + <Slider.Marker value={0} data-testid="marker" /> + </Slider.MarkerGroup> + </Slider> + ); +} diff --git a/packages/skeleton-react/test/components/switch/index.test.tsx b/packages/skeleton-react/test/components/switch/index.test.tsx new file mode 100644 index 0000000000..82270948ea --- /dev/null +++ b/packages/skeleton-react/test/components/switch/index.test.tsx @@ -0,0 +1,40 @@ +import Test from './test'; +import { render, screen } from '@testing-library/react'; +import { describe, expect, it } from 'vitest'; + +describe('Switch', () => { + describe('Root', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('root')).toBeInTheDocument(); + }); + }); + + describe('hidden input', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('hidden-input')).toBeInTheDocument(); + }); + }); + + describe('Control', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('control')).toBeInTheDocument(); + }); + }); + + describe('Thumb', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('thumb')).toBeInTheDocument(); + }); + }); + + describe('Label', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('label')).toBeInTheDocument(); + }); + }); +}); diff --git a/packages/skeleton-react/test/components/switch/test.tsx b/packages/skeleton-react/test/components/switch/test.tsx new file mode 100644 index 0000000000..3e6bfdb41e --- /dev/null +++ b/packages/skeleton-react/test/components/switch/test.tsx @@ -0,0 +1,13 @@ +import { Switch } from '@/index'; + +export default function Test() { + return ( + <Switch data-testid="root"> + <Switch.HiddenInput data-testid="hidden-input" /> + <Switch.Control data-testid="control"> + <Switch.Thumb data-testid="thumb" /> + </Switch.Control> + <Switch.Label data-testid="label" /> + </Switch> + ); +} diff --git a/packages/skeleton-react/test/components/tabs/index.test.tsx b/packages/skeleton-react/test/components/tabs/index.test.tsx new file mode 100644 index 0000000000..6e9959394f --- /dev/null +++ b/packages/skeleton-react/test/components/tabs/index.test.tsx @@ -0,0 +1,40 @@ +import Test from './test'; +import { render, screen } from '@testing-library/react'; +import { describe, expect, it } from 'vitest'; + +describe('Tabs', () => { + describe('Root', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('root')).toBeInTheDocument(); + }); + }); + + describe('List', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('list')).toBeInTheDocument(); + }); + }); + + describe('Trigger', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('trigger')).toBeInTheDocument(); + }); + }); + + describe('Indicator', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('indicator')).toBeInTheDocument(); + }); + }); + + describe('Content', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('content')).toBeInTheDocument(); + }); + }); +}); diff --git a/packages/skeleton-react/test/components/tabs/test.tsx b/packages/skeleton-react/test/components/tabs/test.tsx new file mode 100644 index 0000000000..69894f07e2 --- /dev/null +++ b/packages/skeleton-react/test/components/tabs/test.tsx @@ -0,0 +1,13 @@ +import { Tabs } from '@/index'; + +export default function Test() { + return ( + <Tabs defaultValue="tab-1" data-testid="root"> + <Tabs.List data-testid="list"> + <Tabs.Trigger value="tab" data-testid="trigger" /> + <Tabs.Indicator data-testid="indicator" /> + </Tabs.List> + <Tabs.Content value="tab" data-testid="content" /> + </Tabs> + ); +} diff --git a/packages/skeleton-react/test/components/tags-input/index.test.tsx b/packages/skeleton-react/test/components/tags-input/index.test.tsx new file mode 100644 index 0000000000..93c9e7b39e --- /dev/null +++ b/packages/skeleton-react/test/components/tags-input/index.test.tsx @@ -0,0 +1,82 @@ +import Test from './test'; +import { render, screen } from '@testing-library/react'; +import { describe, expect, it } from 'vitest'; + +describe('TagsInput', () => { + describe('Root', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('root')).toBeInTheDocument(); + }); + }); + + describe('Label', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('label')).toBeInTheDocument(); + }); + }); + + describe('Control', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('control')).toBeInTheDocument(); + }); + }); + + describe('Item', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('item')).toBeInTheDocument(); + }); + }); + + describe('item preview', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('item-preview')).toBeInTheDocument(); + }); + }); + + describe('item text', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('item-text')).toBeInTheDocument(); + }); + }); + + describe('item delete trigger', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('item-delete-trigger')).toBeInTheDocument(); + }); + }); + + describe('item input', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('item-input')).toBeInTheDocument(); + }); + }); + + describe('Input', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('input')).toBeInTheDocument(); + }); + }); + + describe('clear trigger', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('clear-trigger')).toBeInTheDocument(); + }); + }); + + describe('hidden input', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('hidden-input')).toBeInTheDocument(); + }); + }); +}); diff --git a/packages/skeleton-react/test/components/tags-input/test.tsx b/packages/skeleton-react/test/components/tags-input/test.tsx new file mode 100644 index 0000000000..b6f82d6b02 --- /dev/null +++ b/packages/skeleton-react/test/components/tags-input/test.tsx @@ -0,0 +1,21 @@ +import { TagsInput } from '@/index'; + +export default function Test() { + return ( + <TagsInput data-testid="root"> + <TagsInput.Label data-testid="label" /> + <TagsInput.Control data-testid="control"> + <TagsInput.Item index={1} value="test" data-testid="item"> + <TagsInput.ItemPreview data-testid="item-preview"> + <TagsInput.ItemText data-testid="item-text" /> + <TagsInput.ItemDeleteTrigger data-testid="item-delete-trigger" /> + </TagsInput.ItemPreview> + <TagsInput.ItemInput data-testid="item-input" /> + </TagsInput.Item> + </TagsInput.Control> + <TagsInput.Input data-testid="input" /> + <TagsInput.ClearTrigger data-testid="clear-trigger" /> + <TagsInput.HiddenInput data-testid="hidden-input" /> + </TagsInput> + ); +} diff --git a/packages/skeleton-react/test/components/toast/index.test.tsx b/packages/skeleton-react/test/components/toast/index.test.tsx new file mode 100644 index 0000000000..b54cbc58b2 --- /dev/null +++ b/packages/skeleton-react/test/components/toast/index.test.tsx @@ -0,0 +1,57 @@ +import Test from './test'; +import { render, screen, waitFor } from '@testing-library/react'; +import { describe, expect, it } from 'vitest'; + +describe('Toast', () => { + describe('Group', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('group')).toBeInTheDocument(); + }); + }); + + describe.skip('root', () => { + it('renders', async () => { + render(<Test />); + await waitFor(() => { + expect(screen.getByTestId('root')).toBeInTheDocument(); + }); + }); + }); + + describe.skip('title', () => { + it('renders', async () => { + render(<Test />); + await waitFor(() => { + expect(screen.getByTestId('title')).toBeInTheDocument(); + }); + }); + }); + + describe.skip('description', () => { + it('renders', async () => { + render(<Test />); + await waitFor(() => { + expect(screen.getByTestId('description')).toBeInTheDocument(); + }); + }); + }); + + describe.skip('action trigger', () => { + it('renders', async () => { + render(<Test />); + await waitFor(() => { + expect(screen.getByTestId('action-trigger')).toBeInTheDocument(); + }); + }); + }); + + describe.skip('close trigger', () => { + it('renders', async () => { + render(<Test />); + await waitFor(() => { + expect(screen.getByTestId('close-trigger')).toBeInTheDocument(); + }); + }); + }); +}); diff --git a/packages/skeleton-react/test/components/toast/test.tsx b/packages/skeleton-react/test/components/toast/test.tsx new file mode 100644 index 0000000000..eadde8e1f1 --- /dev/null +++ b/packages/skeleton-react/test/components/toast/test.tsx @@ -0,0 +1,21 @@ +import { Toast, createToaster } from '@/index'; +import { useEffect } from 'react'; + +export default function Test() { + const toaster = createToaster({}); + useEffect(() => { + toaster.create({}); + }); + return ( + <Toast.Group toaster={toaster} data-testid="group"> + {(toast) => ( + <Toast key={toast.id} toast={toast} data-testid="root"> + <Toast.Title data-testid="title" /> + <Toast.Description data-testid="description" /> + <Toast.ActionTrigger data-testid="action-trigger" /> + <Toast.CloseTrigger data-testid="close-trigger" /> + </Toast> + )} + </Toast.Group> + ); +} diff --git a/packages/skeleton-react/test/components/tooltip/index.test.tsx b/packages/skeleton-react/test/components/tooltip/index.test.tsx new file mode 100644 index 0000000000..40da5281ff --- /dev/null +++ b/packages/skeleton-react/test/components/tooltip/index.test.tsx @@ -0,0 +1,30 @@ +import Test from './test'; +import { render, screen } from '@testing-library/react'; +import { describe, expect, it } from 'vitest'; + +describe('Tooltip', () => { + describe('Trigger', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('trigger')).toBeInTheDocument(); + }); + }); + describe('Positioner', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('positioner')).toBeInTheDocument(); + }); + }); + describe('Arrow', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('arrow')).toBeInTheDocument(); + }); + }); + describe('arrow tip', () => { + it('renders', () => { + render(<Test />); + expect(screen.getByTestId('arrow-tip')).toBeInTheDocument(); + }); + }); +}); diff --git a/packages/skeleton-react/test/components/tooltip/test.tsx b/packages/skeleton-react/test/components/tooltip/test.tsx new file mode 100644 index 0000000000..f875db2dd8 --- /dev/null +++ b/packages/skeleton-react/test/components/tooltip/test.tsx @@ -0,0 +1,16 @@ +import { Tooltip } from '@/index'; + +export default function Test() { + return ( + <Tooltip> + <Tooltip.Trigger data-testid="trigger" /> + <Tooltip.Positioner data-testid="positioner"> + <Tooltip.Content> + <Tooltip.Arrow data-testid="arrow"> + <Tooltip.ArrowTip data-testid="arrow-tip" /> + </Tooltip.Arrow> + </Tooltip.Content> + </Tooltip.Positioner> + </Tooltip> + ); +} diff --git a/packages/skeleton-react/test/setup.ts b/packages/skeleton-react/test/setup.ts new file mode 100644 index 0000000000..5c459ba8a7 --- /dev/null +++ b/packages/skeleton-react/test/setup.ts @@ -0,0 +1,11 @@ +import '@testing-library/jest-dom/vitest'; +import { vi } from 'vitest'; + +vi.stubGlobal( + 'ResizeObserver', + vi.fn(() => ({ + observe: vi.fn(), + unobserve: vi.fn(), + disconnect: vi.fn(), + })), +); diff --git a/packages/skeleton-react/tsconfig.json b/packages/skeleton-react/tsconfig.json new file mode 100644 index 0000000000..7ab656250f --- /dev/null +++ b/packages/skeleton-react/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "skipLibCheck": true, + "target": "es2022", + "allowJs": true, + "resolveJsonModule": true, + "moduleDetection": "force", + "isolatedModules": true, + "verbatimModuleSyntax": true, + "strict": true, + "noUncheckedIndexedAccess": true, + "noImplicitOverride": true, + "declaration": true, + "declarationMap": true, + "module": "preserve", + "noEmit": true, + "lib": ["es2022", "dom", "dom.iterable"], + "jsx": "react-jsx", + "jsxImportSource": "react", + "types": ["@testing-library/jest-dom/vitest"], + "paths": { + "@/*": ["./src/*"] + } + }, + "include": ["src", "test"] +} diff --git a/packages/skeleton-react/tsdown.config.ts b/packages/skeleton-react/tsdown.config.ts new file mode 100644 index 0000000000..a29dc27bfe --- /dev/null +++ b/packages/skeleton-react/tsdown.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'tsdown'; + +export default defineConfig({ + logLevel: 'silent', + copy: ['src/index.css'], + unbundle: true, +}); diff --git a/packages/skeleton-react/vite.config.ts b/packages/skeleton-react/vite.config.ts new file mode 100644 index 0000000000..2e3a4a0955 --- /dev/null +++ b/packages/skeleton-react/vite.config.ts @@ -0,0 +1,17 @@ +import react from '@vitejs/plugin-react'; +import { resolve } from 'node:path'; +import { defineConfig } from 'vite'; + +export default defineConfig({ + plugins: [react()], + resolve: { + alias: { + '@': resolve(__dirname, 'src'), + }, + }, + test: { + setupFiles: './test/setup.ts', + globals: true, + environment: 'jsdom', + }, +}); diff --git a/packages/skeleton-svelte/CHANGELOG.md b/packages/skeleton-svelte/CHANGELOG.md new file mode 100644 index 0000000000..b589cb6315 --- /dev/null +++ b/packages/skeleton-svelte/CHANGELOG.md @@ -0,0 +1,628 @@ +# @skeletonlabs/skeleton-svelte + +## 2.0.0-next.15 + +### Minor Changes + +- feat: portal ([#3812](https://github.com/skeletonlabs/skeleton/pull/3812)) + +## 2.0.0-next.14 + +### Patch Changes + +- chore: update readme ([#3805](https://github.com/skeletonlabs/skeleton/pull/3805)) + +- Updated dependencies []: + - @skeletonlabs/skeleton-common@1.0.0-next.11 + +## 2.0.0-next.13 + +### Patch Changes + +- fix: override skeleton specific attributes ([#3803](https://github.com/skeletonlabs/skeleton/pull/3803)) + +## 2.0.0-next.12 + +### Minor Changes + +- feat: combobox ([#3702](https://github.com/skeletonlabs/skeleton/pull/3702)) + +- feat: slider ([#3771](https://github.com/skeletonlabs/skeleton/pull/3771)) + +### Patch Changes + +- Updated dependencies [[`09bf2b2`](https://github.com/skeletonlabs/skeleton/commit/09bf2b20dbbfed53af7c31281da21cc5790d87c9), [`fc27770`](https://github.com/skeletonlabs/skeleton/commit/fc27770b37fc2b224444b220020c2141f9fe2da0)]: + - @skeletonlabs/skeleton-common@1.0.0-next.11 + +## 2.0.0-next.11 + +### Patch Changes + +- chore: trusted publishing ([#3792](https://github.com/skeletonlabs/skeleton/pull/3792)) + +- Updated dependencies [[`6e68a49`](https://github.com/skeletonlabs/skeleton/commit/6e68a493da7aaf9b416b0e3c5d4b2570cf0039c4)]: + - @skeletonlabs/skeleton-common@1.0.0-next.10 + +## 2.0.0-next.10 + +### Minor Changes + +- feat: app-bar ([#3783](https://github.com/skeletonlabs/skeleton/pull/3783)) + +### Patch Changes + +- Updated dependencies [[`24526af`](https://github.com/skeletonlabs/skeleton/commit/24526affc00c70b08af0ba1299c82ba64ec9d58a)]: + - @skeletonlabs/skeleton-common@1.0.0-next.9 + +## 2.0.0-next.9 + +### Minor Changes + +- feat: segmented control ([#3758](https://github.com/skeletonlabs/skeleton/pull/3758)) + +### Patch Changes + +- Updated dependencies [[`aa6392e`](https://github.com/skeletonlabs/skeleton/commit/aa6392efb829ea01b1466b5c6a623adf05f96f4e)]: + - @skeletonlabs/skeleton-common@1.0.0-next.8 + +## 2.0.0-next.8 + +### Minor Changes + +- feat: dialog ([#3700](https://github.com/skeletonlabs/skeleton/pull/3700)) + +### Patch Changes + +- Updated dependencies [[`890c826`](https://github.com/skeletonlabs/skeleton/commit/890c8260f4d561a99e07440cfce3ef7a9b88e0ed)]: + - @skeletonlabs/skeleton-common@1.0.0-next.7 + +## 2.0.0-next.7 + +### Minor Changes + +- feat: tooltip ([#3697](https://github.com/skeletonlabs/skeleton/pull/3697)) + +- feat: tags input ([#3740](https://github.com/skeletonlabs/skeleton/pull/3740)) + +- feat: popover ([#3696](https://github.com/skeletonlabs/skeleton/pull/3696)) + +### Patch Changes + +- Updated dependencies [[`997c17f`](https://github.com/skeletonlabs/skeleton/commit/997c17ff6dd29328753f9381154e80853792ec3e), [`19bd792`](https://github.com/skeletonlabs/skeleton/commit/19bd79224a599cc05df7122b9279d88736c8e4c4), [`247fe15`](https://github.com/skeletonlabs/skeleton/commit/247fe154b55ec86b37b12b10771ba0403b488053)]: + - @skeletonlabs/skeleton-common@1.0.0-next.6 + +## 2.0.0-next.6 + +### Minor Changes + +- feat: file-upload ([#3693](https://github.com/skeletonlabs/skeleton/pull/3693)) + +### Patch Changes + +- Updated dependencies [[`1d8a151`](https://github.com/skeletonlabs/skeleton/commit/1d8a15137c79c293674fd70794f69a2fe6cd18a4)]: + - @skeletonlabs/skeleton-common@1.0.0-next.5 + +## 2.0.0-next.5 + +### Patch Changes + +- fix: dependency range ([#3742](https://github.com/skeletonlabs/skeleton/pull/3742)) + +## 2.0.0-next.4 + +### Minor Changes + +- feat: toast ([#3704](https://github.com/skeletonlabs/skeleton/pull/3704)) + +- feat: switch ([#3695](https://github.com/skeletonlabs/skeleton/pull/3695)) + +### Patch Changes + +- Updated dependencies [[`dff68d8`](https://github.com/skeletonlabs/skeleton/commit/dff68d8f824ddb1aef820e75ab3bdebe06546e07), [`3776570`](https://github.com/skeletonlabs/skeleton/commit/3776570c21d060a653bdde8a164e95e8aecdbaab)]: + - @skeletonlabs/skeleton-common@1.0.0-next.4 + +## 2.0.0-next.3 + +### Minor Changes + +- feat: progress-linear ([#3694](https://github.com/skeletonlabs/skeleton/pull/3694)) + +### Patch Changes + +- Updated dependencies [[`a9c651a`](https://github.com/skeletonlabs/skeleton/commit/a9c651adac035dc4613f0118bca05f0cfb0b22b5)]: + - @skeletonlabs/skeleton-common@1.0.0-next.3 + +## 2.0.0-next.2 + +### Minor Changes + +- feat: tabs ([#3679](https://github.com/skeletonlabs/skeleton/pull/3679)) + +- feat: rating-group ([#3681](https://github.com/skeletonlabs/skeleton/pull/3681)) + +### Patch Changes + +- Updated dependencies [[`f272f42`](https://github.com/skeletonlabs/skeleton/commit/f272f42ae2a92648d275618089a5c41aaf4efe13), [`5d517a8`](https://github.com/skeletonlabs/skeleton/commit/5d517a840ac27bea4d5fd2fd2b150abf779075b0)]: + - @skeletonlabs/skeleton-common@1.0.0-next.2 + +## 2.0.0-next.1 + +### Major Changes + +- feat: v4 preperation ([#3662](https://github.com/skeletonlabs/skeleton/pull/3662)) + +### Patch Changes + +- Updated dependencies [[`770431d`](https://github.com/skeletonlabs/skeleton/commit/770431da15a354c66ef69cc0df5049e893147e2f)]: + - @skeletonlabs/skeleton-common@1.0.0-next.1 + +## 1.6.0-next.0 + +### Minor Changes + +- feat: Use classes inside `@skeletonlabs/skeleton-common` to dedupe tailwind classes ([#3656](https://github.com/skeletonlabs/skeleton/pull/3656)) + +### Patch Changes + +- Updated dependencies [[`d65abd7`](https://github.com/skeletonlabs/skeleton/commit/d65abd7c5bd9e694aeeaa3b54310971e63e8de50)]: + - @skeletonlabs/skeleton-common@0.0.1-next.0 + +## 1.5.1 + +### Patch Changes + +- chore: Ensure Comboxbox data is reactive, enable custom filtering, and set max content height ([#3615](https://github.com/skeletonlabs/skeleton/pull/3615)) + +## 1.5.0 + +### Minor Changes + +- feat: add overhauled components ([#3491](https://github.com/skeletonlabs/skeleton/pull/3491)) + +## 1.4.0 + +### Minor Changes + +- feature: Added `aria-label` and `title` props for icon buttons implemented within the Svelte and React Toast components. ([#3619](https://github.com/skeletonlabs/skeleton/pull/3619)) + +- feature: Avatar compnonent now supports additional `initials` configuration ([#3627](https://github.com/skeletonlabs/skeleton/pull/3627)) + +## 1.3.1 + +### Patch Changes + +- chore: Update zag dependencies ([#3612](https://github.com/skeletonlabs/skeleton/pull/3612)) + +## 1.3.0 + +### Minor Changes + +- bugfix: resolves issues with Svelte Tooltip and Popover arrow style props ([#3601](https://github.com/skeletonlabs/skeleton/pull/3601)) + +## 1.2.4 + +### Patch Changes + +- Bugfix: z-index of tooltip was not working when an arrow element was present. ([#3562](https://github.com/skeletonlabs/skeleton/pull/3562)) + +- chore: Remove aria role tooltip from AppBar component ([#3590](https://github.com/skeletonlabs/skeleton/pull/3590)) + +- bugfix: Resolve issue in Popover, Tooltip, and Modal types for missing import. ([#3584](https://github.com/skeletonlabs/skeleton/pull/3584)) + +## 1.2.3 + +### Patch Changes + +- Segment/Pagination: move default border padding to padding prop ([#3554](https://github.com/skeletonlabs/skeleton/pull/3554)) + +## 1.2.2 + +### Patch Changes + +- bugfix: Fix Combobox collection not updating on input ([#3542](https://github.com/skeletonlabs/skeleton/pull/3542)) + +## 1.2.1 + +### Patch Changes + +- fix: respect closable toast option ([#3507](https://github.com/skeletonlabs/skeleton/pull/3507)) + +## 1.2.0 + +### Minor Changes + +- feat: add hidden input for TagsInput ([#3487](https://github.com/skeletonlabs/skeleton/pull/3487)) + +## 1.1.0 + +### Minor Changes + +- feat: Removed Toast integration in favor of first-party Toast component. ([#3440](https://github.com/skeletonlabs/skeleton/pull/3440)) + +### Patch Changes + +- fix(FileUpload): Change `#each` key from `file.name` to `file` (Prevents name conflicts). ([#3475](https://github.com/skeletonlabs/skeleton/pull/3475)) + +- fix: Update Zag to 1.7.0 ([#3476](https://github.com/skeletonlabs/skeleton/pull/3476)) + +## 1.0.0 + +### Minor Changes + +- feat: Navigation - manually handle `selected` state of NavTile ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- feature: Implemented the Svelte components for Popover, Tooltip, Combobox, and Modal. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- Feature: Added the Switch component. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- - chore: Svelte Accordion and Nav components now use dot notation syntax ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + - Tab components overhauled to bring consistency between Svelte and React implementations + - Tabs.Item component removed + - Tabs.Panels (plural) component added + +- feature: Added the Navigation Rail, Bar, and Tile components ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- feature: Added the Svelte Toast component ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- chore: Migrated Nav, Segment Control, and Switch component APIs to match new conventions ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- feature: Improvements to the File Upload component ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- feature: Added Segment Control component ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- feature: Added the ProgressRing component ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- feature: Added the FileUpload component ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- feature: Added Tags Input component ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- feature: Added the Slider component ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- chore: Updated to the latest dependencies ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- feature: Added the Ratings component ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- All Skeleton components have been updated to integrate Zag.js. This contains a number of breaking component API changes. Updates all documentation. And includes new CSS animations in the Tailwind plugin. ([More Information](https://github.com/skeletonlabs/skeleton/discussions/2784)) ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- feat: Zag 1.0 ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- feature: Added the Pagination component ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +### Patch Changes + +- feat: set trigger button type to `button` for **Tooltip**, **Popover** and **Modal** ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- bugfix: Reinstate Pagination `count` prop. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- feat: Implement `arrow` for Tooltip ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- bugfix: Resolved Pagination alternative mode page count issue ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- feat: Implement `aria-label` for triggers ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- feat: renamed `positionerZIndex` to `zIndex` and used CSS values instead of Tailwind classes for **Popover**, **Modal**, **Tooltip** and **Combobox** ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- feature: Add `showFirstLastButtons` prop to Pagination to enable toggling first and last buttons. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- bugfix: Call custom event handlers provided in ZagJs's internal handlers ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- chore: Remove redundant null checks for triggers ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- bugfix: prevent internal overwrite of `ComboBox` `onInputValueChange`. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- feature: Add option to set `aria-labelledby` for Segment component ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- chore: Modified default styles based on theme gen improvements ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- chore: Update Svelte peer dependency to 5.20.0 or higher because we rely on `$props.id` (which was released in 5.20.0) ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- Only render `<button>` when `trigger` snippet is defined. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- chore: Improved Ratings component default half star SVG ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- feat: Implement `disabled` for Modal, Tooltip, Popover and Combobox ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- chore: Added base style prop classes to Svelte Popover, Tooltip, and Modal components ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- bugfix: Set button type to `button` for Svelte's Combobox options ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- bugfix: Adjust Svelte Switch to allow for `bind:checked` and `onCheckedChange` at the same time. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- chore: Implemented Svelte test specs for all components ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- chore: Updated to the latest Svelte 5 RC peer depedency ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- bugfix: progress ring safari 100% ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- bugfix: resolved Svelte Pagination component reactivity issues ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- feat: provide `item` snippet for Combobox ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- feat: Make Svelte Slider marker snippet take the marker value as argument to enable marker customization ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- bugfix: Fixed reactivity issues within the Navigation related components ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- chore: Added positioner and z-index style props to the Svelte Popover, Tooltip, Combobox, and Modal components ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- `onOpenChange` will no longer be internally overriden and thus fix `bind:open` when used in conjunction with `onOpenChange`. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- docs: update `trigger` props description for _Popover_, _Modal_ and _Tooltip_ ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- chore: Disabled the unsupported Svelte Combobox multiple property ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- chore: Moved Prettier and ESLint to repo root, updated formatting, and rectified linting issues ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- Renamed Nav component to Navigation to conform to our naming convention across packages ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- bugfix: Rename `TagsInput` inconsistent prop names: `inputEdit` or `tagEdit` to `tagEditInput` ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- bugfix: only render button wrapping around `trigger` if the snippet was provided ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- chore: Remove extra height class from NavBar ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- chore: Remove `$effect` in `Segment.svelte` component that was emitting execessive logs ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- bugfix: Make use of `useId` on Navigation component to set default `id` for Tiles if user had not defined it explicitly ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- chore: ProgressRing component no longer has a label by default, but can be enabled with `showLabel` prop. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- feat: Implements trigger event props for Svelte's _Popover_, _Modal_, _Combobox_ and _Tooltip_. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- bugfix: Resolve Zag dependency error ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- chore: Improved focus states for Switch and Slider components. Minor style improvements to the Ratings label text. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- chore: Removed `filter` prop and moved `style` prop to parent element ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- Implement `style` prop for Avatar component. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- Bugfix: `bind:pageSize` now correctly updates in combination with `onPageSizeChange` handler. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- bugfix: empty padding when switch has no children ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- chore: Improved global and per component focus state styles ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- chore: Style improvements for Buttons, Badges, Chips, and Form elements ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- chore: Added `@skeletonlabs/skeleton` as a peer-dependency ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- Updated dependencies [[`fafffd7`](https://github.com/skeletonlabs/skeleton/commit/fafffd7bfd58554218ea823fe7b585e092a56c00), [`fafffd7`](https://github.com/skeletonlabs/skeleton/commit/fafffd7bfd58554218ea823fe7b585e092a56c00), [`fafffd7`](https://github.com/skeletonlabs/skeleton/commit/fafffd7bfd58554218ea823fe7b585e092a56c00), [`fafffd7`](https://github.com/skeletonlabs/skeleton/commit/fafffd7bfd58554218ea823fe7b585e092a56c00), [`fafffd7`](https://github.com/skeletonlabs/skeleton/commit/fafffd7bfd58554218ea823fe7b585e092a56c00), [`fafffd7`](https://github.com/skeletonlabs/skeleton/commit/fafffd7bfd58554218ea823fe7b585e092a56c00), [`fafffd7`](https://github.com/skeletonlabs/skeleton/commit/fafffd7bfd58554218ea823fe7b585e092a56c00), [`fafffd7`](https://github.com/skeletonlabs/skeleton/commit/fafffd7bfd58554218ea823fe7b585e092a56c00), [`fafffd7`](https://github.com/skeletonlabs/skeleton/commit/fafffd7bfd58554218ea823fe7b585e092a56c00), [`fafffd7`](https://github.com/skeletonlabs/skeleton/commit/fafffd7bfd58554218ea823fe7b585e092a56c00), [`fafffd7`](https://github.com/skeletonlabs/skeleton/commit/fafffd7bfd58554218ea823fe7b585e092a56c00), [`fafffd7`](https://github.com/skeletonlabs/skeleton/commit/fafffd7bfd58554218ea823fe7b585e092a56c00), [`fafffd7`](https://github.com/skeletonlabs/skeleton/commit/fafffd7bfd58554218ea823fe7b585e092a56c00), [`fafffd7`](https://github.com/skeletonlabs/skeleton/commit/fafffd7bfd58554218ea823fe7b585e092a56c00), [`fafffd7`](https://github.com/skeletonlabs/skeleton/commit/fafffd7bfd58554218ea823fe7b585e092a56c00), [`fafffd7`](https://github.com/skeletonlabs/skeleton/commit/fafffd7bfd58554218ea823fe7b585e092a56c00)]: + - @skeletonlabs/skeleton@3.0.0 + +## 1.0.0-next.22 + +### Patch Changes + +- bugfix: prevent internal overwrite of `ComboBox` `onInputValueChange`. ([#3327](https://github.com/skeletonlabs/skeleton/pull/3327)) + +- chore: Update Svelte peer dependency to 5.20.0 or higher because we rely on `$props.id` (which was released in 5.20.0) ([#3311](https://github.com/skeletonlabs/skeleton/pull/3311)) + +- bugfix: progress ring safari 100% ([#3360](https://github.com/skeletonlabs/skeleton/pull/3360)) + +- feat: provide `item` snippet for Combobox ([#3348](https://github.com/skeletonlabs/skeleton/pull/3348)) + +- bugfix: Rename `TagsInput` inconsistent prop names: `inputEdit` or `tagEdit` to `tagEditInput` ([#3298](https://github.com/skeletonlabs/skeleton/pull/3298)) + +- chore: Removed `filter` prop and moved `style` prop to parent element ([#3344](https://github.com/skeletonlabs/skeleton/pull/3344)) + +- chore: Style improvements for Buttons, Badges, Chips, and Form elements ([#3345](https://github.com/skeletonlabs/skeleton/pull/3345)) + +- chore: Added `@skeletonlabs/skeleton` as a peer-dependency ([#3351](https://github.com/skeletonlabs/skeleton/pull/3351)) + +- Updated dependencies [[`73a4e9f`](https://github.com/skeletonlabs/skeleton/commit/73a4e9f69b47f5684162adcaada6d460a5b73ca7), [`f427d83`](https://github.com/skeletonlabs/skeleton/commit/f427d83302826a238c43439fc67be4837d76b846), [`3af054d`](https://github.com/skeletonlabs/skeleton/commit/3af054dfb9f88b28694c2bf7630a3a40449a844c)]: + - @skeletonlabs/skeleton@3.0.0-next.13 + +## 1.0.0-next.21 + +### Minor Changes + +- feat: Zag 1.0 ([#3257](https://github.com/skeletonlabs/skeleton/pull/3257)) + +## 1.0.0-next.20 + +### Minor Changes + +- feat: Navigation - manually handle `selected` state of NavTile ([#3228](https://github.com/skeletonlabs/skeleton/pull/3228)) + +### Patch Changes + +- feat: Implement `aria-label` for triggers ([#3243](https://github.com/skeletonlabs/skeleton/pull/3243)) + +- chore: Remove redundant null checks for triggers ([#3226](https://github.com/skeletonlabs/skeleton/pull/3226)) + +- bugfix: only render button wrapping around `trigger` if the snippet was provided ([#3223](https://github.com/skeletonlabs/skeleton/pull/3223)) + +## 1.0.0-next.19 + +### Patch Changes + +- feat: set trigger button type to `button` for **Tooltip**, **Popover** and **Modal** ([#3208](https://github.com/skeletonlabs/skeleton/pull/3208)) + +- feat: Implement `arrow` for Tooltip ([#3185](https://github.com/skeletonlabs/skeleton/pull/3185)) + +- feat: renamed `positionerZIndex` to `zIndex` and used CSS values instead of Tailwind classes for **Popover**, **Modal**, **Tooltip** and **Combobox** ([#3210](https://github.com/skeletonlabs/skeleton/pull/3210)) + +- feat: Implement `disabled` for Modal, Tooltip, Popover and Combobox ([#3186](https://github.com/skeletonlabs/skeleton/pull/3186)) + +- feat: Make Svelte Slider marker snippet take the marker value as argument to enable marker customization ([#3205](https://github.com/skeletonlabs/skeleton/pull/3205)) + +## 1.0.0-next.18 + +### Patch Changes + +- bugfix: Call custom event handlers provided in ZagJs's internal handlers ([#3157](https://github.com/skeletonlabs/skeleton/pull/3157)) + +- bugfix: Make use of `useId` on Navigation component to set default `id` for Tiles if user had not defined it explicitly ([#3097](https://github.com/skeletonlabs/skeleton/pull/3097)) + +- Implement `style` prop for Avatar component. ([#3117](https://github.com/skeletonlabs/skeleton/pull/3117)) + +- Bugfix: `bind:pageSize` now correctly updates in combination with `onPageSizeChange` handler. ([#3157](https://github.com/skeletonlabs/skeleton/pull/3157)) + +## 1.0.0-next.17 + +### Patch Changes + +- chore: Remove extra height class from NavBar ([#3074](https://github.com/skeletonlabs/skeleton/pull/3074)) + +## 1.0.0-next.16 + +### Patch Changes + +- bugfix: Reinstate Pagination `count` prop. ([#3026](https://github.com/skeletonlabs/skeleton/pull/3026)) + +- feature: Add option to set `aria-labelledby` for Segment component ([#3034](https://github.com/skeletonlabs/skeleton/pull/3034)) + +- chore: Improved Ratings component default half star SVG ([#3048](https://github.com/skeletonlabs/skeleton/pull/3048)) + +- chore: Added base style prop classes to Svelte Popover, Tooltip, and Modal components ([#3031](https://github.com/skeletonlabs/skeleton/pull/3031)) + +- chore: Added positioner and z-index style props to the Svelte Popover, Tooltip, Combobox, and Modal components ([#3029](https://github.com/skeletonlabs/skeleton/pull/3029)) + +- docs: update `trigger` props description for _Popover_, _Modal_ and _Tooltip_ ([#3046](https://github.com/skeletonlabs/skeleton/pull/3046)) + +- chore: Disabled the unsupported Svelte Combobox multiple property ([#3033](https://github.com/skeletonlabs/skeleton/pull/3033)) + +- feat: Implements trigger event props for Svelte's _Popover_, _Modal_, _Combobox_ and _Tooltip_. ([#3053](https://github.com/skeletonlabs/skeleton/pull/3053)) + +- chore: Improved focus states for Switch and Slider components. Minor style improvements to the Ratings label text. ([#3045](https://github.com/skeletonlabs/skeleton/pull/3045)) + +- bugfix: empty padding when switch has no children ([#3024](https://github.com/skeletonlabs/skeleton/pull/3024)) + +## 1.0.0-next.15 + +### Patch Changes + +- feature: Add `showFirstLastButtons` prop to Pagination to enable toggling first and last buttons. ([#3007](https://github.com/skeletonlabs/skeleton/pull/3007)) + +- bugfix: Set button type to `button` for Svelte's Combobox options ([#2998](https://github.com/skeletonlabs/skeleton/pull/2998)) + +- chore: ProgressRing component no longer has a label by default, but can be enabled with `showLabel` prop. ([#2996](https://github.com/skeletonlabs/skeleton/pull/2996)) + +## 1.0.0-next.14 + +### Patch Changes + +- bugfix: Resolved Pagination alternative mode page count issue ([#2956](https://github.com/skeletonlabs/skeleton/pull/2956)) + +- bugfix: Adjust Svelte Switch to allow for `bind:checked` and `onCheckedChange` at the same time. ([#2967](https://github.com/skeletonlabs/skeleton/pull/2967)) + +- chore: Implemented Svelte test specs for all components ([#2968](https://github.com/skeletonlabs/skeleton/pull/2968)) + +- bugfix: resolved Svelte Pagination component reactivity issues ([#2956](https://github.com/skeletonlabs/skeleton/pull/2956)) + +- `onOpenChange` will no longer be internally overriden and thus fix `bind:open` when used in conjunction with `onOpenChange`. ([#2970](https://github.com/skeletonlabs/skeleton/pull/2970)) + +## 1.0.0-next.13 + +### Patch Changes + +- Only render `<button>` when `trigger` snippet is defined. ([#2947](https://github.com/skeletonlabs/skeleton/pull/2947)) + +- Renamed Nav component to Navigation to conform to our naming convention across packages ([#2928](https://github.com/skeletonlabs/skeleton/pull/2928)) + +## 1.0.0-next.12 + +### Minor Changes + +- feature: Added the Svelte Toast component ([#2922](https://github.com/skeletonlabs/skeleton/pull/2922)) + +- chore: Updated to the latest dependencies ([#2892](https://github.com/skeletonlabs/skeleton/pull/2892)) + +## 1.0.0-next.11 + +### Minor Changes + +- feature: Implemented the Svelte components for Popover, Tooltip, Combobox, and Modal. ([#2872](https://github.com/skeletonlabs/skeleton/pull/2872)) + +## 1.0.0-next.10 + +### Patch Changes + +- chore: Modified default styles based on theme gen improvements ([#2852](https://github.com/skeletonlabs/skeleton/pull/2852)) + +## 1.0.0-next.9 + +### Patch Changes + +- chore: Remove `$effect` in `Segment.svelte` component that was emitting execessive logs ([#2858](https://github.com/skeletonlabs/skeleton/pull/2858)) + +## 1.0.0-next.8 + +### Minor Changes + +- feature: Improvements to the File Upload component ([#2843](https://github.com/skeletonlabs/skeleton/pull/2843)) + +- feature: Added Tags Input component ([#2828](https://github.com/skeletonlabs/skeleton/pull/2828)) + +- feature: Added the Pagination component ([#2841](https://github.com/skeletonlabs/skeleton/pull/2841)) + +## 1.0.0-next.7 + +### Minor Changes + +- feature: Added the FileUpload component ([#2838](https://github.com/skeletonlabs/skeleton/pull/2838)) + +- Added the Slider component ([#2834](https://github.com/skeletonlabs/skeleton/pull/2834)) + +### Patch Changes + +- chore: Improved global and per component focus state styles ([#2825](https://github.com/skeletonlabs/skeleton/pull/2825)) + +## 1.0.0-next.6 + +### Patch Changes + +- bugfix: Resolve Zag dependency error ([`561a72b8`](https://github.com/skeletonlabs/skeleton/commit/561a72b8c38c28c1da37d51b562574686660e445)) + +## 1.0.0-next.5 + +### Minor Changes + +- All Skeleton components have been updated to integrate Zag.js. This contains a number of breaking component API changes. Updates all documentation. And includes new CSS animations in the Tailwind plugin. ([More Information](https://github.com/skeletonlabs/skeleton/discussions/2784)) ([#2778](https://github.com/skeletonlabs/skeleton/pull/2778)) + +## 1.0.0-next.4 + +### Minor Changes + +- - chore: Svelte Accordion and Nav components now use dot notation syntax ([#2748](https://github.com/skeletonlabs/skeleton/pull/2748)) + - Tab components overhauled to bring consistency between Svelte and React implementations + - Tabs.Item component removed + - Tabs.Panels (plural) component added + +- chore: Migrated Nav, Segment Control, and Switch component APIs to match new conventions ([#2758](https://github.com/skeletonlabs/skeleton/pull/2758)) + +- feature: Added Segment Control component ([#2744](https://github.com/skeletonlabs/skeleton/pull/2744)) + +### Patch Changes + +- Fixed reactivity issues within the Navigation related components ([#2750](https://github.com/skeletonlabs/skeleton/pull/2750)) + +- Chore: Moved Prettier and ESLint to repo root, updated formatting, and rectified linting issues ([#2723](https://github.com/skeletonlabs/skeleton/pull/2723)) + +## 1.0.0-next.3 + +### Minor Changes + +- feature: Added the Navigation Rail, Bar, and Tile components ([#2721](https://github.com/skeletonlabs/skeleton/pull/2721)) + +- feature: Added the ProgressRing component ([#2709](https://github.com/skeletonlabs/skeleton/pull/2709)) + +- feature: Added the Ratings component ([#2721](https://github.com/skeletonlabs/skeleton/pull/2721)) + +## 1.0.0-next.2 + +### Minor Changes + +- Feature: Added the Switch component. ([#2698](https://github.com/skeletonlabs/skeleton/pull/2698)) + +## 1.0.0-next.1 + +### Patch Changes + +- chore: Updated to the latest Svelte 5 RC peer depedency ([#2679](https://github.com/skeletonlabs/skeleton/pull/2679)) + +## 1.0.0-next.0 + +### Major Changes + +- Enter pre-release mode ([#2668](https://github.com/skeletonlabs/skeleton/pull/2668)) diff --git a/packages/skeleton-svelte/README.md b/packages/skeleton-svelte/README.md new file mode 100644 index 0000000000..51c34055f0 --- /dev/null +++ b/packages/skeleton-svelte/README.md @@ -0,0 +1,11 @@ +# Skeleton Svelte + +## Installation + +```bash +pnpm add @skeletonlabs/skeleton-svelte +``` + +## Documentation + +Explore the full documentation at [skeleton.dev](https://skeleton.dev/). diff --git a/packages/skeleton-svelte/package.json b/packages/skeleton-svelte/package.json new file mode 100644 index 0000000000..26686bf132 --- /dev/null +++ b/packages/skeleton-svelte/package.json @@ -0,0 +1,71 @@ +{ + "name": "@skeletonlabs/skeleton-svelte", + "version": "2.0.0-next.15", + "description": "The Svelte package for Skeleton.", + "author": "endigo9740 <chris@skeletonlabs.dev>", + "repository": { + "type": "git", + "url": "git+https://github.com/skeletonlabs/skeleton.git", + "directory": "packages/skeleton-svelte" + }, + "scripts": { + "dev": "svelte-package --input src --output dist --watch", + "build": "svelte-package --input src --output dist", + "test": "vitest run", + "check": "svelte-check", + "sync": "svelte-kit sync && pnpm build" + }, + "exports": { + ".": { + "types": "./dist/index.d.ts", + "style": "./dist/index.css", + "svelte": "./dist/index.js", + "default": "./dist/index.js" + } + }, + "files": [ + "dist" + ], + "sideEffects": false, + "dependencies": { + "@skeletonlabs/skeleton-common": "workspace:*", + "@zag-js/accordion": "catalog:", + "@zag-js/avatar": "catalog:", + "@zag-js/collection": "catalog:", + "@zag-js/combobox": "catalog:", + "@zag-js/dialog": "catalog:", + "@zag-js/file-upload": "catalog:", + "@zag-js/popover": "catalog:", + "@zag-js/progress": "catalog:", + "@zag-js/rating-group": "catalog:", + "@zag-js/slider": "catalog:", + "@zag-js/radio-group": "catalog:", + "@zag-js/svelte": "catalog:", + "@zag-js/switch": "catalog:", + "@zag-js/tabs": "catalog:", + "@zag-js/tags-input": "catalog:", + "@zag-js/toast": "catalog:", + "@zag-js/tooltip": "catalog:" + }, + "peerDependencies": { + "svelte": "^5.29.0" + }, + "devDependencies": { + "@skeletonlabs/skeleton": "workspace:*", + "@sveltejs/kit": "catalog:", + "@sveltejs/package": "catalog:", + "@sveltejs/vite-plugin-svelte": "catalog:", + "@testing-library/jest-dom": "catalog:", + "@testing-library/svelte": "catalog:", + "jsdom": "catalog:", + "publint": "catalog:", + "svelte": "catalog:", + "svelte-check": "catalog:", + "tslib": "catalog:", + "typescript": "catalog:", + "vite": "catalog:", + "vitest": "catalog:" + }, + "license": "MIT", + "type": "module" +} diff --git a/packages/skeleton-svelte/src/components/accordion/anatomy/item-content.svelte b/packages/skeleton-svelte/src/components/accordion/anatomy/item-content.svelte new file mode 100644 index 0000000000..3313f33fea --- /dev/null +++ b/packages/skeleton-svelte/src/components/accordion/anatomy/item-content.svelte @@ -0,0 +1,38 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface AccordionItemContentProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} +</script> + +<script lang="ts"> + import { ItemContext } from '../modules/item-context'; + import { RootContext } from '../modules/root-context'; + import { classesAccordion } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: AccordionItemContentProps = $props(); + + const accordion = RootContext.consume(); + const itemProps = ItemContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + accordion().getItemContentProps(itemProps()), + { + class: classesAccordion.content, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/accordion/anatomy/item-heading.svelte b/packages/skeleton-svelte/src/components/accordion/anatomy/item-heading.svelte new file mode 100644 index 0000000000..77d2946432 --- /dev/null +++ b/packages/skeleton-svelte/src/components/accordion/anatomy/item-heading.svelte @@ -0,0 +1,40 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface AccordionItemHeadingProps extends PropsWithElement<'h3'>, HTMLAttributes<'h3'> { + /** + * The level of the heading. + * + * @default 3 + */ + level?: 1 | 2 | 3 | 4 | 5 | 6; + } +</script> + +<script lang="ts"> + import { classesAccordion } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: AccordionItemHeadingProps = $props(); + const { level = 3, element, children, ...rest } = $derived(props); + + const tag = $derived(`h${level}`); + + const attributes = $derived( + mergeProps( + { + class: classesAccordion.heading, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <svelte:element this={tag} {...attributes}> + {@render children?.()} + </svelte:element> +{/if} diff --git a/packages/skeleton-svelte/src/components/accordion/anatomy/item-indicator.svelte b/packages/skeleton-svelte/src/components/accordion/anatomy/item-indicator.svelte new file mode 100644 index 0000000000..49e3a4c486 --- /dev/null +++ b/packages/skeleton-svelte/src/components/accordion/anatomy/item-indicator.svelte @@ -0,0 +1,38 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface AccordionItemIndicatorProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} +</script> + +<script lang="ts"> + import { ItemContext } from '../modules/item-context'; + import { RootContext } from '../modules/root-context'; + import { classesAccordion } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: AccordionItemIndicatorProps = $props(); + + const accordion = RootContext.consume(); + const itemProps = ItemContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + accordion().getItemIndicatorProps(itemProps()), + { + class: classesAccordion.indicator, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/accordion/anatomy/item-trigger.svelte b/packages/skeleton-svelte/src/components/accordion/anatomy/item-trigger.svelte new file mode 100644 index 0000000000..7f99b51b12 --- /dev/null +++ b/packages/skeleton-svelte/src/components/accordion/anatomy/item-trigger.svelte @@ -0,0 +1,38 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface AccordionItemTriggerProps extends PropsWithElement<'button'>, HTMLAttributes<'button'> {} +</script> + +<script lang="ts"> + import { ItemContext } from '../modules/item-context'; + import { RootContext } from '../modules/root-context'; + import { classesAccordion } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: AccordionItemTriggerProps = $props(); + + const accordion = RootContext.consume(); + const itemProps = ItemContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + accordion().getItemTriggerProps(itemProps()), + { + class: classesAccordion.trigger, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <button {...attributes}> + {@render children?.()} + </button> +{/if} diff --git a/packages/skeleton-svelte/src/components/accordion/anatomy/item.svelte b/packages/skeleton-svelte/src/components/accordion/anatomy/item.svelte new file mode 100644 index 0000000000..a4e8f4ee46 --- /dev/null +++ b/packages/skeleton-svelte/src/components/accordion/anatomy/item.svelte @@ -0,0 +1,42 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + import type { ItemProps } from '@zag-js/accordion'; + + export interface AccordionItemProps extends ItemProps, PropsWithElement<'div'>, HTMLAttributes<'div'> {} +</script> + +<script lang="ts"> + import { ItemContext } from '../modules/item-context'; + import { RootContext } from '../modules/root-context'; + import { classesAccordion } from '@skeletonlabs/skeleton-common'; + import { splitItemProps } from '@zag-js/accordion'; + import { mergeProps } from '@zag-js/svelte'; + + const props: AccordionItemProps = $props(); + + const accordion = RootContext.consume(); + + const [itemProps, componentProps] = $derived(splitItemProps(props)); + const { element, children, ...rest } = $derived(componentProps); + + const attributes = $derived( + mergeProps( + accordion().getItemProps(itemProps), + { + class: classesAccordion.item, + }, + rest, + ), + ); + + ItemContext.provide(() => itemProps); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/accordion/anatomy/root-context.svelte b/packages/skeleton-svelte/src/components/accordion/anatomy/root-context.svelte new file mode 100644 index 0000000000..a5c936c9c3 --- /dev/null +++ b/packages/skeleton-svelte/src/components/accordion/anatomy/root-context.svelte @@ -0,0 +1,20 @@ +<script lang="ts" module> + import type { useAccordion } from '../modules/provider.svelte'; + import type { Snippet } from 'svelte'; + + export interface AccordionRootContextProps { + children: Snippet<[ReturnType<typeof useAccordion>]>; + } +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + + const props: AccordionRootContextProps = $props(); + + const accordion = RootContext.consume(); + + const { children } = $derived(props); +</script> + +{@render children(accordion)} diff --git a/packages/skeleton-svelte/src/components/accordion/anatomy/root-provider.svelte b/packages/skeleton-svelte/src/components/accordion/anatomy/root-provider.svelte new file mode 100644 index 0000000000..24414ed881 --- /dev/null +++ b/packages/skeleton-svelte/src/components/accordion/anatomy/root-provider.svelte @@ -0,0 +1,39 @@ +<script lang="ts" module> + import type { useAccordion } from '../modules/provider.svelte'; + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface AccordionRootProviderProps extends PropsWithElement<'div'>, HTMLAttributes<'div', 'id' | 'dir'> { + value: ReturnType<typeof useAccordion>; + } +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesAccordion } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: AccordionRootProviderProps = $props(); + + const { element, children, value: accordion, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + accordion().getRootProps(), + { + class: classesAccordion.root, + }, + rest, + ), + ); + + RootContext.provide(() => accordion()); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/accordion/anatomy/root.svelte b/packages/skeleton-svelte/src/components/accordion/anatomy/root.svelte new file mode 100644 index 0000000000..1e6d1e217d --- /dev/null +++ b/packages/skeleton-svelte/src/components/accordion/anatomy/root.svelte @@ -0,0 +1,46 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + import type { Props } from '@zag-js/accordion'; + + export interface AccordionRootProps extends Omit<Props, 'id'>, PropsWithElement<'div'>, HTMLAttributes<'div', 'id' | 'dir'> {} +</script> + +<script lang="ts"> + import { useAccordion } from '../modules/provider.svelte'; + import { RootContext } from '../modules/root-context'; + import { classesAccordion } from '@skeletonlabs/skeleton-common'; + import { splitProps } from '@zag-js/accordion'; + import { mergeProps } from '@zag-js/svelte'; + + const props: AccordionRootProps = $props(); + + const [accordionProps, componentProps] = $derived(splitProps(props)); + const { element, children, ...rest } = $derived(componentProps); + + const id = $props.id(); + const accordion = useAccordion(() => ({ + id: id, + ...accordionProps, + })); + + const attributes = $derived( + mergeProps( + accordion().getRootProps(), + { + class: classesAccordion.root, + }, + rest, + ), + ); + + RootContext.provide(() => accordion()); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/accordion/index.ts b/packages/skeleton-svelte/src/components/accordion/index.ts new file mode 100644 index 0000000000..f7360be39d --- /dev/null +++ b/packages/skeleton-svelte/src/components/accordion/index.ts @@ -0,0 +1,10 @@ +export type { AccordionItemContentProps } from './anatomy/item-content.svelte'; +export type { AccordionItemHeadingProps } from './anatomy/item-heading.svelte'; +export type { AccordionItemIndicatorProps } from './anatomy/item-indicator.svelte'; +export type { AccordionItemProps } from './anatomy/item.svelte'; +export type { AccordionRootProps } from './anatomy/root.svelte'; +export type { AccordionRootContextProps } from './anatomy/root-context.svelte'; +export type { AccordionRootProviderProps } from './anatomy/root-provider.svelte'; +export type { AccordionItemTriggerProps } from './anatomy/item-trigger.svelte'; +export { Accordion } from './modules/anatomy'; +export { useAccordion } from './modules/provider.svelte'; diff --git a/packages/skeleton-svelte/src/components/accordion/modules/anatomy.ts b/packages/skeleton-svelte/src/components/accordion/modules/anatomy.ts new file mode 100644 index 0000000000..845fc8aa90 --- /dev/null +++ b/packages/skeleton-svelte/src/components/accordion/modules/anatomy.ts @@ -0,0 +1,18 @@ +import ItemContent from '../anatomy/item-content.svelte'; +import ItemHeading from '../anatomy/item-heading.svelte'; +import ItemIndicator from '../anatomy/item-indicator.svelte'; +import ItemTrigger from '../anatomy/item-trigger.svelte'; +import Item from '../anatomy/item.svelte'; +import RootContext from '../anatomy/root-context.svelte'; +import RootProvider from '../anatomy/root-provider.svelte'; +import Root from '../anatomy/root.svelte'; + +export const Accordion = Object.assign(Root, { + Provider: RootProvider, + Context: RootContext, + Item: Item, + ItemHeading: ItemHeading, + ItemTrigger: ItemTrigger, + ItemIndicator: ItemIndicator, + ItemContent: ItemContent, +}); diff --git a/packages/skeleton-svelte/src/components/accordion/modules/item-context.ts b/packages/skeleton-svelte/src/components/accordion/modules/item-context.ts new file mode 100644 index 0000000000..f93dab5adf --- /dev/null +++ b/packages/skeleton-svelte/src/components/accordion/modules/item-context.ts @@ -0,0 +1,4 @@ +import { createContext } from '@/internal/create-context'; +import type { ItemProps } from '@zag-js/accordion'; + +export const ItemContext = createContext<() => ItemProps>(); diff --git a/packages/skeleton-svelte/src/components/accordion/modules/provider.svelte.ts b/packages/skeleton-svelte/src/components/accordion/modules/provider.svelte.ts new file mode 100644 index 0000000000..00ba76050c --- /dev/null +++ b/packages/skeleton-svelte/src/components/accordion/modules/provider.svelte.ts @@ -0,0 +1,9 @@ +import { connect, machine } from '@zag-js/accordion'; +import type { Api, Props } from '@zag-js/accordion'; +import { normalizeProps, useMachine, type PropTypes } from '@zag-js/svelte'; + +export function useAccordion(props: Props | (() => Props)): () => Api<PropTypes> { + const service = useMachine(machine, props); + const accordion = $derived(connect(service, normalizeProps)); + return () => accordion; +} diff --git a/packages/skeleton-svelte/src/components/accordion/modules/root-context.ts b/packages/skeleton-svelte/src/components/accordion/modules/root-context.ts new file mode 100644 index 0000000000..3af1ae3a9c --- /dev/null +++ b/packages/skeleton-svelte/src/components/accordion/modules/root-context.ts @@ -0,0 +1,4 @@ +import type { useAccordion } from './provider.svelte'; +import { createContext } from '@/internal/create-context'; + +export const RootContext = createContext<ReturnType<typeof useAccordion>>(); diff --git a/packages/skeleton-svelte/src/components/app-bar/anatomy/headline.svelte b/packages/skeleton-svelte/src/components/app-bar/anatomy/headline.svelte new file mode 100644 index 0000000000..7c8b3a14ba --- /dev/null +++ b/packages/skeleton-svelte/src/components/app-bar/anatomy/headline.svelte @@ -0,0 +1,32 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface AppBarHeadlineProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} +</script> + +<script lang="ts"> + import { classesAppBar } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: AppBarHeadlineProps = $props(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + { + class: classesAppBar.headline, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/app-bar/anatomy/lead.svelte b/packages/skeleton-svelte/src/components/app-bar/anatomy/lead.svelte new file mode 100644 index 0000000000..7d244ee939 --- /dev/null +++ b/packages/skeleton-svelte/src/components/app-bar/anatomy/lead.svelte @@ -0,0 +1,32 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface AppBarLeadProps extends PropsWithElement<'nav'>, HTMLAttributes<'nav'> {} +</script> + +<script lang="ts"> + import { classesAppBar } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: AppBarLeadProps = $props(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + { + class: classesAppBar.lead, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <nav {...attributes}> + {@render children?.()} + </nav> +{/if} diff --git a/packages/skeleton-svelte/src/components/app-bar/anatomy/root.svelte b/packages/skeleton-svelte/src/components/app-bar/anatomy/root.svelte new file mode 100644 index 0000000000..3157ebae8c --- /dev/null +++ b/packages/skeleton-svelte/src/components/app-bar/anatomy/root.svelte @@ -0,0 +1,32 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface AppBarRootProps extends PropsWithElement<'header'>, HTMLAttributes<'header'> {} +</script> + +<script lang="ts"> + import { classesAppBar } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: AppBarRootProps = $props(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + { + class: classesAppBar.root, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <header {...attributes}> + {@render children?.()} + </header> +{/if} diff --git a/packages/skeleton-svelte/src/components/app-bar/anatomy/toolbar.svelte b/packages/skeleton-svelte/src/components/app-bar/anatomy/toolbar.svelte new file mode 100644 index 0000000000..7e69e730b8 --- /dev/null +++ b/packages/skeleton-svelte/src/components/app-bar/anatomy/toolbar.svelte @@ -0,0 +1,32 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface AppBarToolbarProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} +</script> + +<script lang="ts"> + import { classesAppBar } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: AppBarToolbarProps = $props(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + { + class: classesAppBar.toolbar, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/app-bar/anatomy/trail.svelte b/packages/skeleton-svelte/src/components/app-bar/anatomy/trail.svelte new file mode 100644 index 0000000000..f99068857a --- /dev/null +++ b/packages/skeleton-svelte/src/components/app-bar/anatomy/trail.svelte @@ -0,0 +1,32 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface AppBarTrailProps extends PropsWithElement<'nav'>, HTMLAttributes<'nav'> {} +</script> + +<script lang="ts"> + import { classesAppBar } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: AppBarTrailProps = $props(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + { + class: classesAppBar.trail, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <nav {...attributes}> + {@render children?.()} + </nav> +{/if} diff --git a/packages/skeleton-svelte/src/components/app-bar/index.ts b/packages/skeleton-svelte/src/components/app-bar/index.ts new file mode 100644 index 0000000000..465ab917ae --- /dev/null +++ b/packages/skeleton-svelte/src/components/app-bar/index.ts @@ -0,0 +1,6 @@ +export type { AppBarRootProps } from './anatomy/root.svelte'; +export type { AppBarToolbarProps } from './anatomy/toolbar.svelte'; +export type { AppBarLeadProps } from './anatomy/lead.svelte'; +export type { AppBarHeadlineProps } from './anatomy/headline.svelte'; +export type { AppBarTrailProps } from './anatomy/trail.svelte'; +export { AppBar } from './modules/anatomy'; diff --git a/packages/skeleton-svelte/src/components/app-bar/modules/anatomy.ts b/packages/skeleton-svelte/src/components/app-bar/modules/anatomy.ts new file mode 100644 index 0000000000..8702a425f4 --- /dev/null +++ b/packages/skeleton-svelte/src/components/app-bar/modules/anatomy.ts @@ -0,0 +1,12 @@ +import Headline from '../anatomy/headline.svelte'; +import Lead from '../anatomy/lead.svelte'; +import Root from '../anatomy/root.svelte'; +import Toolbar from '../anatomy/toolbar.svelte'; +import Trail from '../anatomy/trail.svelte'; + +export const AppBar = Object.assign(Root, { + Toolbar: Toolbar, + Lead: Lead, + Headline: Headline, + Trail: Trail, +}); diff --git a/packages/skeleton-svelte/src/components/avatar/anatomy/fallback.svelte b/packages/skeleton-svelte/src/components/avatar/anatomy/fallback.svelte new file mode 100644 index 0000000000..11430a4485 --- /dev/null +++ b/packages/skeleton-svelte/src/components/avatar/anatomy/fallback.svelte @@ -0,0 +1,36 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface AvatarFallbackProps extends PropsWithElement<'span'>, HTMLAttributes<'span'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesAvatar } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: AvatarFallbackProps = $props(); + + const avatar = RootContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + avatar().getFallbackProps(), + { + class: classesAvatar.fallback, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <span {...attributes}> + {@render children?.()} + </span> +{/if} diff --git a/packages/skeleton-svelte/src/components/avatar/anatomy/image.svelte b/packages/skeleton-svelte/src/components/avatar/anatomy/image.svelte new file mode 100644 index 0000000000..d17bd9a486 --- /dev/null +++ b/packages/skeleton-svelte/src/components/avatar/anatomy/image.svelte @@ -0,0 +1,34 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface AvatarImageProps extends PropsWithElement<'img'>, HTMLAttributes<'img'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesAvatar } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: AvatarImageProps = $props(); + + const avatar = RootContext.consume(); + + const { element, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + avatar().getImageProps(), + { + class: classesAvatar.image, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <img {...attributes} /> +{/if} diff --git a/packages/skeleton-svelte/src/components/avatar/anatomy/root-context.svelte b/packages/skeleton-svelte/src/components/avatar/anatomy/root-context.svelte new file mode 100644 index 0000000000..2a56ccb11f --- /dev/null +++ b/packages/skeleton-svelte/src/components/avatar/anatomy/root-context.svelte @@ -0,0 +1,20 @@ +<script lang="ts" module> + import type { useAvatar } from '../modules/provider.svelte'; + import type { Snippet } from 'svelte'; + + export interface AvatarRootContextProps { + children: Snippet<[ReturnType<typeof useAvatar>]>; + } +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + + const props: AvatarRootContextProps = $props(); + + const avatar = RootContext.consume(); + + const { children } = $derived(props); +</script> + +{@render children(avatar)} diff --git a/packages/skeleton-svelte/src/components/avatar/anatomy/root-provider.svelte b/packages/skeleton-svelte/src/components/avatar/anatomy/root-provider.svelte new file mode 100644 index 0000000000..67c5c317be --- /dev/null +++ b/packages/skeleton-svelte/src/components/avatar/anatomy/root-provider.svelte @@ -0,0 +1,39 @@ +<script lang="ts" module> + import type { useAvatar } from '../modules/provider.svelte'; + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface AvatarRootProviderProps extends PropsWithElement<'div'>, HTMLAttributes<'div', 'id' | 'dir'> { + value: ReturnType<typeof useAvatar>; + } +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesAvatar } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: AvatarRootProviderProps = $props(); + + const { element, children, value: avatar, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + avatar().getRootProps(), + { + class: classesAvatar.root, + }, + rest, + ), + ); + + RootContext.provide(() => avatar()); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/avatar/anatomy/root.svelte b/packages/skeleton-svelte/src/components/avatar/anatomy/root.svelte new file mode 100644 index 0000000000..4a62e697da --- /dev/null +++ b/packages/skeleton-svelte/src/components/avatar/anatomy/root.svelte @@ -0,0 +1,46 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + import type { Props } from '@zag-js/avatar'; + + export interface AvatarRootProps extends Omit<Props, 'id'>, PropsWithElement<'div'>, HTMLAttributes<'div', 'id' | 'dir'> {} +</script> + +<script lang="ts"> + import { useAvatar } from '../modules/provider.svelte'; + import { RootContext } from '../modules/root-context'; + import { classesAvatar } from '@skeletonlabs/skeleton-common'; + import { splitProps } from '@zag-js/avatar'; + import { mergeProps } from '@zag-js/svelte'; + + const props: AvatarRootProps = $props(); + + const [avatarProps, componentProps] = $derived(splitProps(props)); + const { element, children, ...rest } = $derived(componentProps); + + const id = $props.id(); + const avatar = useAvatar(() => ({ + id: id, + ...avatarProps, + })); + + const attributes = $derived( + mergeProps( + avatar().getRootProps(), + { + class: classesAvatar.root, + }, + rest, + ), + ); + + RootContext.provide(() => avatar()); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/avatar/index.ts b/packages/skeleton-svelte/src/components/avatar/index.ts new file mode 100644 index 0000000000..bdfcf8cc1c --- /dev/null +++ b/packages/skeleton-svelte/src/components/avatar/index.ts @@ -0,0 +1,7 @@ +export type { AvatarFallbackProps } from './anatomy/fallback.svelte'; +export type { AvatarImageProps } from './anatomy/image.svelte'; +export type { AvatarRootProps } from './anatomy/root.svelte'; +export type { AvatarRootContextProps } from './anatomy/root-context.svelte'; +export type { AvatarRootProviderProps } from './anatomy/root-provider.svelte'; +export { Avatar } from './modules/anatomy'; +export { useAvatar } from './modules/provider.svelte'; diff --git a/packages/skeleton-svelte/src/components/avatar/modules/anatomy.ts b/packages/skeleton-svelte/src/components/avatar/modules/anatomy.ts new file mode 100644 index 0000000000..a70b3bde5c --- /dev/null +++ b/packages/skeleton-svelte/src/components/avatar/modules/anatomy.ts @@ -0,0 +1,12 @@ +import Fallback from '../anatomy/fallback.svelte'; +import Image from '../anatomy/image.svelte'; +import RootContext from '../anatomy/root-context.svelte'; +import RootProvider from '../anatomy/root-provider.svelte'; +import Root from '../anatomy/root.svelte'; + +export const Avatar = Object.assign(Root, { + Provider: RootProvider, + Context: RootContext, + Image: Image, + Fallback: Fallback, +}); diff --git a/packages/skeleton-svelte/src/components/avatar/modules/provider.svelte.ts b/packages/skeleton-svelte/src/components/avatar/modules/provider.svelte.ts new file mode 100644 index 0000000000..42463ee765 --- /dev/null +++ b/packages/skeleton-svelte/src/components/avatar/modules/provider.svelte.ts @@ -0,0 +1,9 @@ +import { connect, machine } from '@zag-js/avatar'; +import type { Api, Props } from '@zag-js/avatar'; +import { normalizeProps, useMachine, type PropTypes } from '@zag-js/svelte'; + +export function useAvatar(props: Props | (() => Props)): () => Api<PropTypes> { + const service = useMachine(machine, props); + const avatar = $derived(connect(service, normalizeProps)); + return () => avatar; +} diff --git a/packages/skeleton-svelte/src/components/avatar/modules/root-context.ts b/packages/skeleton-svelte/src/components/avatar/modules/root-context.ts new file mode 100644 index 0000000000..96736eceae --- /dev/null +++ b/packages/skeleton-svelte/src/components/avatar/modules/root-context.ts @@ -0,0 +1,4 @@ +import type { useAvatar } from './provider.svelte'; +import { createContext } from '@/internal/create-context'; + +export const RootContext = createContext<ReturnType<typeof useAvatar>>(); diff --git a/packages/skeleton-svelte/src/components/combobox/anatomy/content.svelte b/packages/skeleton-svelte/src/components/combobox/anatomy/content.svelte new file mode 100644 index 0000000000..58191be476 --- /dev/null +++ b/packages/skeleton-svelte/src/components/combobox/anatomy/content.svelte @@ -0,0 +1,36 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface ComboboxContentProps extends PropsWithElement<'ul'>, HTMLAttributes<'ul'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesCombobox } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: ComboboxContentProps = $props(); + + const combobox = RootContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + combobox().getContentProps(), + { + class: classesCombobox.content, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <ul {...attributes}> + {@render children?.()} + </ul> +{/if} diff --git a/packages/skeleton-svelte/src/components/combobox/anatomy/control.svelte b/packages/skeleton-svelte/src/components/combobox/anatomy/control.svelte new file mode 100644 index 0000000000..bdf5862952 --- /dev/null +++ b/packages/skeleton-svelte/src/components/combobox/anatomy/control.svelte @@ -0,0 +1,36 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface ComboboxControlProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesCombobox } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: ComboboxControlProps = $props(); + + const combobox = RootContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + combobox().getControlProps(), + { + class: classesCombobox.control, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/combobox/anatomy/input.svelte b/packages/skeleton-svelte/src/components/combobox/anatomy/input.svelte new file mode 100644 index 0000000000..20be1d6a6a --- /dev/null +++ b/packages/skeleton-svelte/src/components/combobox/anatomy/input.svelte @@ -0,0 +1,34 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface ComboboxInputProps extends PropsWithElement<'input'>, HTMLAttributes<'input'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesCombobox } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: ComboboxInputProps = $props(); + + const combobox = RootContext.consume(); + + const { element, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + combobox().getInputProps(), + { + class: classesCombobox.input, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <input {...attributes} /> +{/if} diff --git a/packages/skeleton-svelte/src/components/combobox/anatomy/item-group-label.svelte b/packages/skeleton-svelte/src/components/combobox/anatomy/item-group-label.svelte new file mode 100644 index 0000000000..7e1a2eb5d3 --- /dev/null +++ b/packages/skeleton-svelte/src/components/combobox/anatomy/item-group-label.svelte @@ -0,0 +1,48 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface ComboboxItemGroupLabelProps + extends Omit<ItemGroupLabelProps, 'htmlFor'>, + PropsWithElement<'div'>, + HTMLAttributes<'div'> {} +</script> + +<script lang="ts"> + import { ItemGroupContext } from '../modules/item-group-context'; + import { RootContext } from '../modules/root-context'; + import { classesCombobox } from '@skeletonlabs/skeleton-common'; + import { type ItemGroupLabelProps, splitItemGroupLabelProps } from '@zag-js/combobox'; + import { mergeProps } from '@zag-js/svelte'; + + const props: ComboboxItemGroupLabelProps = $props(); + + const combobox = RootContext.consume(); + const itemGroupProps = ItemGroupContext.consume(); + + const [itemGroupLabelProps] = $derived( + splitItemGroupLabelProps({ + htmlFor: itemGroupProps().id, + ...props, + }), + ); + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + combobox().getItemGroupLabelProps(itemGroupLabelProps), + { + class: classesCombobox.itemGroupLabel, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/combobox/anatomy/item-group.svelte b/packages/skeleton-svelte/src/components/combobox/anatomy/item-group.svelte new file mode 100644 index 0000000000..11be6f85b6 --- /dev/null +++ b/packages/skeleton-svelte/src/components/combobox/anatomy/item-group.svelte @@ -0,0 +1,48 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + import type { ItemGroupProps } from '@zag-js/combobox'; + + export interface ComboboxItemGroupProps extends Omit<ItemGroupProps, 'id'>, PropsWithElement<'div'>, HTMLAttributes<'div', 'id'> {} +</script> + +<script lang="ts"> + import { ItemGroupContext } from '../modules/item-group-context'; + import { RootContext } from '../modules/root-context'; + import { classesCombobox } from '@skeletonlabs/skeleton-common'; + import { splitItemGroupProps } from '@zag-js/combobox'; + import { mergeProps } from '@zag-js/svelte'; + + const props: ComboboxItemGroupProps = $props(); + + const combobox = RootContext.consume(); + + const id = $props.id(); + const [itemGroupProps, componentProps] = $derived( + splitItemGroupProps({ + id: id, + ...props, + }), + ); + const { element, children, ...rest } = $derived(componentProps); + + const attributes = $derived( + mergeProps( + combobox().getItemGroupProps(itemGroupProps), + { + class: classesCombobox.itemGroup, + }, + rest, + ), + ); + + ItemGroupContext.provide(() => itemGroupProps); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/combobox/anatomy/item-indicator.svelte b/packages/skeleton-svelte/src/components/combobox/anatomy/item-indicator.svelte new file mode 100644 index 0000000000..c85a5ece45 --- /dev/null +++ b/packages/skeleton-svelte/src/components/combobox/anatomy/item-indicator.svelte @@ -0,0 +1,43 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface ComboboxItemIndicatorProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} +</script> + +<script lang="ts"> + import { ItemContext } from '../modules/item-context'; + import { RootContext } from '../modules/root-context'; + import Check from '@/internal/components/check.svelte'; + import { classesCombobox } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: ComboboxItemIndicatorProps = $props(); + + const combobox = RootContext.consume(); + const itemProps = ItemContext.consume(); + + const { element, children = check, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + combobox().getItemIndicatorProps(itemProps()), + { + class: classesCombobox.itemIndicator, + }, + rest, + ), + ); +</script> + +{#snippet check()} + <Check class="size-4" /> +{/snippet} + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/combobox/anatomy/item-text.svelte b/packages/skeleton-svelte/src/components/combobox/anatomy/item-text.svelte new file mode 100644 index 0000000000..21ac4b857b --- /dev/null +++ b/packages/skeleton-svelte/src/components/combobox/anatomy/item-text.svelte @@ -0,0 +1,38 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface ComboboxItemTextProps extends PropsWithElement<'span'>, HTMLAttributes<'span'> {} +</script> + +<script lang="ts"> + import { ItemContext } from '../modules/item-context'; + import { RootContext } from '../modules/root-context'; + import { classesCombobox } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: ComboboxItemTextProps = $props(); + + const combobox = RootContext.consume(); + const itemProps = ItemContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + combobox().getItemTextProps(itemProps()), + { + class: classesCombobox.itemText, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <span {...attributes}> + {@render children?.()} + </span> +{/if} diff --git a/packages/skeleton-svelte/src/components/combobox/anatomy/item.svelte b/packages/skeleton-svelte/src/components/combobox/anatomy/item.svelte new file mode 100644 index 0000000000..2572ee0c0a --- /dev/null +++ b/packages/skeleton-svelte/src/components/combobox/anatomy/item.svelte @@ -0,0 +1,42 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + import type { ItemProps } from '@zag-js/combobox'; + + export interface ComboboxItemProps extends Omit<ItemProps, 'id'>, PropsWithElement<'li'>, HTMLAttributes<'li', 'value'> {} +</script> + +<script lang="ts"> + import { ItemContext } from '../modules/item-context'; + import { RootContext } from '../modules/root-context'; + import { classesCombobox } from '@skeletonlabs/skeleton-common'; + import { splitItemProps } from '@zag-js/combobox'; + import { mergeProps } from '@zag-js/svelte'; + + const props: ComboboxItemProps = $props(); + + const combobox = RootContext.consume(); + + const [itemProps, componentProps] = $derived(splitItemProps(props)); + const { element, children, ...rest } = $derived(componentProps); + + const attributes = $derived( + mergeProps( + combobox().getItemProps(itemProps), + { + class: classesCombobox.item, + }, + rest, + ), + ); + + ItemContext.provide(() => itemProps); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <li {...attributes}> + {@render children?.()} + </li> +{/if} diff --git a/packages/skeleton-svelte/src/components/combobox/anatomy/label.svelte b/packages/skeleton-svelte/src/components/combobox/anatomy/label.svelte new file mode 100644 index 0000000000..13656729cd --- /dev/null +++ b/packages/skeleton-svelte/src/components/combobox/anatomy/label.svelte @@ -0,0 +1,36 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface ComboboxLabelProps extends PropsWithElement<'label'>, HTMLAttributes<'label'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesCombobox } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: ComboboxLabelProps = $props(); + + const combobox = RootContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + combobox().getLabelProps(), + { + class: classesCombobox.label, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <label {...attributes}> + {@render children?.()} + </label> +{/if} diff --git a/packages/skeleton-svelte/src/components/combobox/anatomy/positioner.svelte b/packages/skeleton-svelte/src/components/combobox/anatomy/positioner.svelte new file mode 100644 index 0000000000..3c74162a02 --- /dev/null +++ b/packages/skeleton-svelte/src/components/combobox/anatomy/positioner.svelte @@ -0,0 +1,36 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface ComboboxPositionerProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesCombobox } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: ComboboxPositionerProps = $props(); + + const combobox = RootContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + combobox().getPositionerProps(), + { + class: classesCombobox.positioner, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/combobox/anatomy/root-context.svelte b/packages/skeleton-svelte/src/components/combobox/anatomy/root-context.svelte new file mode 100644 index 0000000000..9e903149c3 --- /dev/null +++ b/packages/skeleton-svelte/src/components/combobox/anatomy/root-context.svelte @@ -0,0 +1,20 @@ +<script lang="ts" module> + import type { useCombobox } from '../modules/provider.svelte'; + import type { Snippet } from 'svelte'; + + export interface ComboboxRootContextProps { + children: Snippet<[ReturnType<typeof useCombobox>]>; + } +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + + const props: ComboboxRootContextProps = $props(); + + const combobox = RootContext.consume(); + + const { children } = $derived(props); +</script> + +{@render children(combobox)} diff --git a/packages/skeleton-svelte/src/components/combobox/anatomy/root-provider.svelte b/packages/skeleton-svelte/src/components/combobox/anatomy/root-provider.svelte new file mode 100644 index 0000000000..99cc57d46e --- /dev/null +++ b/packages/skeleton-svelte/src/components/combobox/anatomy/root-provider.svelte @@ -0,0 +1,39 @@ +<script lang="ts" module> + import type { useCombobox } from '../modules/provider.svelte'; + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface ComboboxRootProviderProps extends PropsWithElement<'div'>, HTMLAttributes<'div', 'id' | 'dir' | 'placeholder'> { + value: ReturnType<typeof useCombobox>; + } +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesCombobox } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: ComboboxRootProviderProps = $props(); + + const { element, children, value: combobox, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + combobox().getRootProps(), + { + class: classesCombobox.root, + }, + rest, + ), + ); + + RootContext.provide(() => combobox()); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/combobox/anatomy/root.svelte b/packages/skeleton-svelte/src/components/combobox/anatomy/root.svelte new file mode 100644 index 0000000000..2e58b2c835 --- /dev/null +++ b/packages/skeleton-svelte/src/components/combobox/anatomy/root.svelte @@ -0,0 +1,48 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + import type { Props } from '@zag-js/combobox'; + + export interface ComboboxRootProps + extends Omit<Props, 'id'>, + PropsWithElement<'div'>, + HTMLAttributes<'div', 'id' | 'dir' | 'placeholder'> {} +</script> + +<script lang="ts"> + import { useCombobox } from '../modules/provider.svelte'; + import { RootContext } from '../modules/root-context'; + import { classesCombobox } from '@skeletonlabs/skeleton-common'; + import { splitProps } from '@zag-js/combobox'; + import { mergeProps } from '@zag-js/svelte'; + + const props: ComboboxRootProps = $props(); + const [comboboxProps, componentProps] = $derived(splitProps(props)); + const { element, children, ...rest } = $derived(componentProps); + + const id = $props.id(); + const combobox = useCombobox(() => ({ + id: id, + ...comboboxProps, + })); + + const attributes = $derived( + mergeProps( + combobox().getRootProps(), + { + class: classesCombobox.root, + }, + rest, + ), + ); + + RootContext.provide(() => combobox()); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/combobox/anatomy/trigger.svelte b/packages/skeleton-svelte/src/components/combobox/anatomy/trigger.svelte new file mode 100644 index 0000000000..56fbff53bc --- /dev/null +++ b/packages/skeleton-svelte/src/components/combobox/anatomy/trigger.svelte @@ -0,0 +1,41 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface ComboboxTriggerProps extends PropsWithElement<'button'>, HTMLAttributes<'button'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import ChevronDownIcon from '@/internal/components/chevron-down.svelte'; + import { classesCombobox } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: ComboboxTriggerProps = $props(); + + const combobox = RootContext.consume(); + + const { element, children = chevronDown, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + combobox().getTriggerProps(), + { + class: classesCombobox.trigger, + }, + rest, + ), + ); +</script> + +{#snippet chevronDown()} + <ChevronDownIcon /> +{/snippet} + +{#if element} + {@render element(attributes)} +{:else} + <button {...attributes}> + {@render children?.()} + </button> +{/if} diff --git a/packages/skeleton-svelte/src/components/combobox/index.ts b/packages/skeleton-svelte/src/components/combobox/index.ts new file mode 100644 index 0000000000..796d742554 --- /dev/null +++ b/packages/skeleton-svelte/src/components/combobox/index.ts @@ -0,0 +1,16 @@ +export type { ComboboxContentProps } from './anatomy/content.svelte'; +export type { ComboboxControlProps } from './anatomy/control.svelte'; +export type { ComboboxInputProps } from './anatomy/input.svelte'; +export type { ComboboxItemProps } from './anatomy/item.svelte'; +export type { ComboboxItemGroupProps } from './anatomy/item-group.svelte'; +export type { ComboboxItemGroupLabelProps } from './anatomy/item-group-label.svelte'; +export type { ComboboxItemIndicatorProps } from './anatomy/item-indicator.svelte'; +export type { ComboboxItemTextProps } from './anatomy/item-text.svelte'; +export type { ComboboxLabelProps } from './anatomy/label.svelte'; +export type { ComboboxPositionerProps } from './anatomy/positioner.svelte'; +export type { ComboboxRootProps } from './anatomy/root.svelte'; +export type { ComboboxRootContextProps } from './anatomy/root-context.svelte'; +export type { ComboboxRootProviderProps } from './anatomy/root-provider.svelte'; +export type { ComboboxTriggerProps } from './anatomy/trigger.svelte'; +export { Combobox } from './modules/anatomy'; +export { useCombobox } from './modules/provider.svelte'; diff --git a/packages/skeleton-svelte/src/components/combobox/modules/anatomy.ts b/packages/skeleton-svelte/src/components/combobox/modules/anatomy.ts new file mode 100644 index 0000000000..b273127cf0 --- /dev/null +++ b/packages/skeleton-svelte/src/components/combobox/modules/anatomy.ts @@ -0,0 +1,30 @@ +import Content from '../anatomy/content.svelte'; +import Control from '../anatomy/control.svelte'; +import Input from '../anatomy/input.svelte'; +import ItemGroupLabel from '../anatomy/item-group-label.svelte'; +import ItemGroup from '../anatomy/item-group.svelte'; +import ItemIndicator from '../anatomy/item-indicator.svelte'; +import ItemText from '../anatomy/item-text.svelte'; +import Item from '../anatomy/item.svelte'; +import Label from '../anatomy/label.svelte'; +import Positioner from '../anatomy/positioner.svelte'; +import RootContext from '../anatomy/root-context.svelte'; +import RootProvider from '../anatomy/root-provider.svelte'; +import Root from '../anatomy/root.svelte'; +import Trigger from '../anatomy/trigger.svelte'; + +export const Combobox = Object.assign(Root, { + Provider: RootProvider, + Context: RootContext, + Label: Label, + Control: Control, + Input: Input, + Trigger: Trigger, + Positioner: Positioner, + Content: Content, + ItemGroup: ItemGroup, + ItemGroupLabel: ItemGroupLabel, + Item: Item, + ItemText: ItemText, + ItemIndicator: ItemIndicator, +}); diff --git a/packages/skeleton-svelte/src/components/combobox/modules/item-context.ts b/packages/skeleton-svelte/src/components/combobox/modules/item-context.ts new file mode 100644 index 0000000000..f93ca5fcfc --- /dev/null +++ b/packages/skeleton-svelte/src/components/combobox/modules/item-context.ts @@ -0,0 +1,4 @@ +import { createContext } from '@/internal/create-context'; +import type { ItemProps } from '@zag-js/combobox'; + +export const ItemContext = createContext<() => ItemProps>(); diff --git a/packages/skeleton-svelte/src/components/combobox/modules/item-group-context.ts b/packages/skeleton-svelte/src/components/combobox/modules/item-group-context.ts new file mode 100644 index 0000000000..993813a0f7 --- /dev/null +++ b/packages/skeleton-svelte/src/components/combobox/modules/item-group-context.ts @@ -0,0 +1,4 @@ +import { createContext } from '@/internal/create-context'; +import type { ItemGroupProps } from '@zag-js/combobox'; + +export const ItemGroupContext = createContext<() => ItemGroupProps>(); diff --git a/packages/skeleton-svelte/src/components/combobox/modules/provider.svelte.ts b/packages/skeleton-svelte/src/components/combobox/modules/provider.svelte.ts new file mode 100644 index 0000000000..d46a7dac85 --- /dev/null +++ b/packages/skeleton-svelte/src/components/combobox/modules/provider.svelte.ts @@ -0,0 +1,8 @@ +import { type Api, connect, machine, type Props } from '@zag-js/combobox'; +import { normalizeProps, useMachine, type PropTypes } from '@zag-js/svelte'; + +export function useCombobox(props: Props | (() => Props)): () => Api<PropTypes> { + const service = useMachine(machine, props); + const combobox = $derived(connect(service, normalizeProps)); + return () => combobox; +} diff --git a/packages/skeleton-svelte/src/components/combobox/modules/root-context.ts b/packages/skeleton-svelte/src/components/combobox/modules/root-context.ts new file mode 100644 index 0000000000..2b08dd603d --- /dev/null +++ b/packages/skeleton-svelte/src/components/combobox/modules/root-context.ts @@ -0,0 +1,4 @@ +import type { useCombobox } from './provider.svelte'; +import { createContext } from '@/internal/create-context'; + +export const RootContext = createContext<ReturnType<typeof useCombobox>>(); diff --git a/packages/skeleton-svelte/src/components/dialog/anatomy/backdrop.svelte b/packages/skeleton-svelte/src/components/dialog/anatomy/backdrop.svelte new file mode 100644 index 0000000000..af3773c2a2 --- /dev/null +++ b/packages/skeleton-svelte/src/components/dialog/anatomy/backdrop.svelte @@ -0,0 +1,34 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface DialogBackdropProps extends PropsWithElement<'div'>, HTMLAttributes<'div', 'children'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesDialog } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: DialogBackdropProps = $props(); + + const dialog = RootContext.consume(); + + const { element, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + dialog().getBackdropProps(), + { + class: classesDialog.backdrop, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}></div> +{/if} diff --git a/packages/skeleton-svelte/src/components/dialog/anatomy/close-trigger.svelte b/packages/skeleton-svelte/src/components/dialog/anatomy/close-trigger.svelte new file mode 100644 index 0000000000..f49b3e77fb --- /dev/null +++ b/packages/skeleton-svelte/src/components/dialog/anatomy/close-trigger.svelte @@ -0,0 +1,36 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface DialogCloseTriggerProps extends PropsWithElement<'button'>, HTMLAttributes<'button'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesDialog } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: DialogCloseTriggerProps = $props(); + + const dialog = RootContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + dialog().getCloseTriggerProps(), + { + class: classesDialog.closeTrigger, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <button {...attributes}> + {@render children?.()} + </button> +{/if} diff --git a/packages/skeleton-svelte/src/components/dialog/anatomy/content.svelte b/packages/skeleton-svelte/src/components/dialog/anatomy/content.svelte new file mode 100644 index 0000000000..74e2011f9d --- /dev/null +++ b/packages/skeleton-svelte/src/components/dialog/anatomy/content.svelte @@ -0,0 +1,36 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface DialogContentProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesDialog } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: DialogContentProps = $props(); + + const dialog = RootContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + dialog().getContentProps(), + { + class: classesDialog.content, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/dialog/anatomy/description.svelte b/packages/skeleton-svelte/src/components/dialog/anatomy/description.svelte new file mode 100644 index 0000000000..e641245780 --- /dev/null +++ b/packages/skeleton-svelte/src/components/dialog/anatomy/description.svelte @@ -0,0 +1,36 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface DialogDescriptionProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesDialog } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: DialogDescriptionProps = $props(); + + const dialog = RootContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + dialog().getDescriptionProps(), + { + class: classesDialog.description, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/dialog/anatomy/positioner.svelte b/packages/skeleton-svelte/src/components/dialog/anatomy/positioner.svelte new file mode 100644 index 0000000000..9437de363f --- /dev/null +++ b/packages/skeleton-svelte/src/components/dialog/anatomy/positioner.svelte @@ -0,0 +1,36 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface DialogPositionerProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesDialog } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: DialogPositionerProps = $props(); + + const dialog = RootContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + dialog().getPositionerProps(), + { + class: classesDialog.positioner, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/dialog/anatomy/root-context.svelte b/packages/skeleton-svelte/src/components/dialog/anatomy/root-context.svelte new file mode 100644 index 0000000000..a0bd6feea4 --- /dev/null +++ b/packages/skeleton-svelte/src/components/dialog/anatomy/root-context.svelte @@ -0,0 +1,20 @@ +<script lang="ts" module> + import type { useDialog } from '../modules/provider.svelte'; + import type { Snippet } from 'svelte'; + + export interface DialogRootContextProps { + children: Snippet<[ReturnType<typeof useDialog>]>; + } +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + + const props: DialogRootContextProps = $props(); + + const dialog = RootContext.consume(); + + const { children } = $derived(props); +</script> + +{@render children(dialog)} diff --git a/packages/skeleton-svelte/src/components/dialog/anatomy/root-provider.svelte b/packages/skeleton-svelte/src/components/dialog/anatomy/root-provider.svelte new file mode 100644 index 0000000000..ba728030bd --- /dev/null +++ b/packages/skeleton-svelte/src/components/dialog/anatomy/root-provider.svelte @@ -0,0 +1,20 @@ +<script lang="ts" module> + import type { useDialog } from '../modules/provider.svelte'; + import type { PropsWithChildren } from '@/internal/props-with-children'; + + export interface DialogRootProviderProps extends PropsWithChildren { + value: ReturnType<typeof useDialog>; + } +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + + const props: DialogRootProviderProps = $props(); + + const { children, value: dialog } = $derived(props); + + RootContext.provide(() => dialog()); +</script> + +{@render children?.()} diff --git a/packages/skeleton-svelte/src/components/dialog/anatomy/root.svelte b/packages/skeleton-svelte/src/components/dialog/anatomy/root.svelte new file mode 100644 index 0000000000..2d11b749b3 --- /dev/null +++ b/packages/skeleton-svelte/src/components/dialog/anatomy/root.svelte @@ -0,0 +1,27 @@ +<script lang="ts" module> + import type { PropsWithChildren } from '@/internal/props-with-children'; + import type { Props } from '@zag-js/dialog'; + + export interface DialogRootProps extends Omit<Props, 'id'>, PropsWithChildren {} +</script> + +<script lang="ts"> + import { useDialog } from '../modules/provider.svelte'; + import { RootContext } from '../modules/root-context'; + import { splitProps } from '@zag-js/dialog'; + + const props: DialogRootProps = $props(); + + const [machineProps, componentProps] = $derived(splitProps(props)); + const { children } = $derived(componentProps); + + const id = $props.id(); + const dialog = useDialog(() => ({ + id: id, + ...machineProps, + })); + + RootContext.provide(() => dialog()); +</script> + +{@render children?.()} diff --git a/packages/skeleton-svelte/src/components/dialog/anatomy/title.svelte b/packages/skeleton-svelte/src/components/dialog/anatomy/title.svelte new file mode 100644 index 0000000000..ef2a9a4c18 --- /dev/null +++ b/packages/skeleton-svelte/src/components/dialog/anatomy/title.svelte @@ -0,0 +1,36 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface DialogTitleProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesDialog } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: DialogTitleProps = $props(); + + const dialog = RootContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + dialog().getTitleProps(), + { + class: classesDialog.title, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/dialog/anatomy/trigger.svelte b/packages/skeleton-svelte/src/components/dialog/anatomy/trigger.svelte new file mode 100644 index 0000000000..51a333d72e --- /dev/null +++ b/packages/skeleton-svelte/src/components/dialog/anatomy/trigger.svelte @@ -0,0 +1,36 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface DialogTriggerProps extends PropsWithElement<'button'>, HTMLAttributes<'button'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesDialog } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: DialogTriggerProps = $props(); + + const dialog = RootContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + dialog().getTriggerProps(), + { + class: classesDialog.trigger, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <button {...attributes}> + {@render children?.()} + </button> +{/if} diff --git a/packages/skeleton-svelte/src/components/dialog/index.ts b/packages/skeleton-svelte/src/components/dialog/index.ts new file mode 100644 index 0000000000..625ae3542d --- /dev/null +++ b/packages/skeleton-svelte/src/components/dialog/index.ts @@ -0,0 +1,12 @@ +export type { DialogBackdropProps } from './anatomy/backdrop.svelte'; +export type { DialogCloseTriggerProps } from './anatomy/close-trigger.svelte'; +export type { DialogContentProps } from './anatomy/content.svelte'; +export type { DialogDescriptionProps } from './anatomy/description.svelte'; +export type { DialogPositionerProps } from './anatomy/positioner.svelte'; +export type { DialogRootProps } from './anatomy/root.svelte'; +export type { DialogRootContextProps } from './anatomy/root-context.svelte'; +export type { DialogRootProviderProps } from './anatomy/root-provider.svelte'; +export type { DialogTitleProps } from './anatomy/title.svelte'; +export type { DialogTriggerProps } from './anatomy/trigger.svelte'; +export { Dialog } from './modules/anatomy'; +export { useDialog } from './modules/provider.svelte'; diff --git a/packages/skeleton-svelte/src/components/dialog/modules/anatomy.ts b/packages/skeleton-svelte/src/components/dialog/modules/anatomy.ts new file mode 100644 index 0000000000..b3a814736b --- /dev/null +++ b/packages/skeleton-svelte/src/components/dialog/modules/anatomy.ts @@ -0,0 +1,22 @@ +import Backdrop from '../anatomy/backdrop.svelte'; +import CloseTrigger from '../anatomy/close-trigger.svelte'; +import Content from '../anatomy/content.svelte'; +import Description from '../anatomy/description.svelte'; +import Positioner from '../anatomy/positioner.svelte'; +import RootContext from '../anatomy/root-context.svelte'; +import RootProvider from '../anatomy/root-provider.svelte'; +import Root from '../anatomy/root.svelte'; +import Title from '../anatomy/title.svelte'; +import Trigger from '../anatomy/trigger.svelte'; + +export const Dialog = Object.assign(Root, { + Provider: RootProvider, + Context: RootContext, + Trigger: Trigger, + Backdrop: Backdrop, + Positioner: Positioner, + Content: Content, + Title: Title, + Description: Description, + CloseTrigger: CloseTrigger, +}); diff --git a/packages/skeleton-svelte/src/components/dialog/modules/provider.svelte.ts b/packages/skeleton-svelte/src/components/dialog/modules/provider.svelte.ts new file mode 100644 index 0000000000..e75db5743d --- /dev/null +++ b/packages/skeleton-svelte/src/components/dialog/modules/provider.svelte.ts @@ -0,0 +1,8 @@ +import { type Api, connect, machine, type Props } from '@zag-js/dialog'; +import { normalizeProps, useMachine, type PropTypes } from '@zag-js/svelte'; + +export function useDialog(props: Props | (() => Props)): () => Api<PropTypes> { + const service = useMachine(machine, props); + const dialog = $derived(connect(service, normalizeProps)); + return () => dialog; +} diff --git a/packages/skeleton-svelte/src/components/dialog/modules/root-context.ts b/packages/skeleton-svelte/src/components/dialog/modules/root-context.ts new file mode 100644 index 0000000000..8559171354 --- /dev/null +++ b/packages/skeleton-svelte/src/components/dialog/modules/root-context.ts @@ -0,0 +1,4 @@ +import type { useDialog } from './provider.svelte'; +import { createContext } from '@/internal/create-context'; + +export const RootContext = createContext<ReturnType<typeof useDialog>>(); diff --git a/packages/skeleton-svelte/src/components/file-upload/anatomy/dropzone.svelte b/packages/skeleton-svelte/src/components/file-upload/anatomy/dropzone.svelte new file mode 100644 index 0000000000..27415610c6 --- /dev/null +++ b/packages/skeleton-svelte/src/components/file-upload/anatomy/dropzone.svelte @@ -0,0 +1,37 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + import type { DropzoneProps } from '@zag-js/file-upload'; + + export interface FileUploadDropzoneProps extends DropzoneProps, PropsWithElement<'div'>, HTMLAttributes<'div'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesFileUpload } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: FileUploadDropzoneProps = $props(); + + const fileUpload = RootContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + fileUpload().getDropzoneProps(props), + { + class: classesFileUpload.dropzone, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/file-upload/anatomy/hidden-input.svelte b/packages/skeleton-svelte/src/components/file-upload/anatomy/hidden-input.svelte new file mode 100644 index 0000000000..a747e0d655 --- /dev/null +++ b/packages/skeleton-svelte/src/components/file-upload/anatomy/hidden-input.svelte @@ -0,0 +1,34 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface FileUploadHiddenInputProps extends PropsWithElement<'input'>, HTMLAttributes<'input', 'children'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesFileUpload } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: FileUploadHiddenInputProps = $props(); + + const fileUpload = RootContext.consume(); + + const { element, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + fileUpload().getHiddenInputProps(), + { + class: classesFileUpload.hiddenInput, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <input {...attributes} /> +{/if} diff --git a/packages/skeleton-svelte/src/components/file-upload/anatomy/item-delete-trigger.svelte b/packages/skeleton-svelte/src/components/file-upload/anatomy/item-delete-trigger.svelte new file mode 100644 index 0000000000..5f6a9eb7b0 --- /dev/null +++ b/packages/skeleton-svelte/src/components/file-upload/anatomy/item-delete-trigger.svelte @@ -0,0 +1,42 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface FileUploadItemDeleteTriggerProps extends PropsWithElement<'button'>, HTMLAttributes<'button'> {} +</script> + +<script lang="ts"> + import { ItemContext } from '../modules/item-context'; + import { RootContext } from '../modules/root-context'; + import { classesFileUpload } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: FileUploadItemDeleteTriggerProps = $props(); + + const fileUpload = RootContext.consume(); + const itemProps = ItemContext.consume(); + + const { element, children = times, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + fileUpload().getItemDeleteTriggerProps(itemProps()), + { + class: classesFileUpload.itemDeleteTrigger, + }, + rest, + ), + ); +</script> + +{#snippet times()} + × +{/snippet} + +{#if element} + {@render element(attributes)} +{:else} + <button {...attributes}> + {@render children?.()} + </button> +{/if} diff --git a/packages/skeleton-svelte/src/components/file-upload/anatomy/item-group.svelte b/packages/skeleton-svelte/src/components/file-upload/anatomy/item-group.svelte new file mode 100644 index 0000000000..31c62b2c38 --- /dev/null +++ b/packages/skeleton-svelte/src/components/file-upload/anatomy/item-group.svelte @@ -0,0 +1,36 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface FileUploadItemGroupProps extends PropsWithElement<'ul'>, HTMLAttributes<'ul'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesFileUpload } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: FileUploadItemGroupProps = $props(); + + const fileUpload = RootContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + fileUpload().getItemGroupProps(), + { + class: classesFileUpload.itemGroup, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <ul {...attributes}> + {@render children?.()} + </ul> +{/if} diff --git a/packages/skeleton-svelte/src/components/file-upload/anatomy/item-name.svelte b/packages/skeleton-svelte/src/components/file-upload/anatomy/item-name.svelte new file mode 100644 index 0000000000..1ef44b4b62 --- /dev/null +++ b/packages/skeleton-svelte/src/components/file-upload/anatomy/item-name.svelte @@ -0,0 +1,38 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface FileUploadItemNameProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} +</script> + +<script lang="ts"> + import { ItemContext } from '../modules/item-context'; + import { RootContext } from '../modules/root-context'; + import { classesFileUpload } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: FileUploadItemNameProps = $props(); + + const fileUpload = RootContext.consume(); + const itemProps = ItemContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + fileUpload().getItemNameProps(itemProps()), + { + class: classesFileUpload.itemName, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/file-upload/anatomy/item-size-text.svelte b/packages/skeleton-svelte/src/components/file-upload/anatomy/item-size-text.svelte new file mode 100644 index 0000000000..ca18ec73d3 --- /dev/null +++ b/packages/skeleton-svelte/src/components/file-upload/anatomy/item-size-text.svelte @@ -0,0 +1,38 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface FileUploadItemSizeTextProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} +</script> + +<script lang="ts"> + import { ItemContext } from '../modules/item-context'; + import { RootContext } from '../modules/root-context'; + import { classesFileUpload } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: FileUploadItemSizeTextProps = $props(); + + const fileUpload = RootContext.consume(); + const itemProps = ItemContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + fileUpload().getItemSizeTextProps(itemProps()), + { + class: classesFileUpload.itemSizeText, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/file-upload/anatomy/item.svelte b/packages/skeleton-svelte/src/components/file-upload/anatomy/item.svelte new file mode 100644 index 0000000000..9c38b92070 --- /dev/null +++ b/packages/skeleton-svelte/src/components/file-upload/anatomy/item.svelte @@ -0,0 +1,42 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + import { splitItemProps } from '@zag-js/file-upload'; + import type { ItemProps } from '@zag-js/file-upload'; + + export interface FileUploadItemProps extends ItemProps, PropsWithElement<'li'>, HTMLAttributes<'li'> {} +</script> + +<script lang="ts"> + import { ItemContext } from '../modules/item-context'; + import { RootContext } from '../modules/root-context'; + import { classesFileUpload } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: FileUploadItemProps = $props(); + + const fileUpload = RootContext.consume(); + + const [itemProps, componentProps] = $derived(splitItemProps(props)); + const { element, children, ...rest } = $derived(componentProps); + + const attributes = $derived( + mergeProps( + fileUpload().getItemProps(itemProps), + { + class: classesFileUpload.item, + }, + rest, + ), + ); + + ItemContext.provide(() => itemProps); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <li {...attributes}> + {@render children?.()} + </li> +{/if} diff --git a/packages/skeleton-svelte/src/components/file-upload/anatomy/root-context.svelte b/packages/skeleton-svelte/src/components/file-upload/anatomy/root-context.svelte new file mode 100644 index 0000000000..5ea98d2ede --- /dev/null +++ b/packages/skeleton-svelte/src/components/file-upload/anatomy/root-context.svelte @@ -0,0 +1,20 @@ +<script lang="ts" module> + import type { Snippet } from 'svelte'; + + export interface FileUploadRootContextProps { + children: Snippet<[ReturnType<typeof useFileUpload>]>; + } +</script> + +<script lang="ts"> + import type { useFileUpload } from '../modules/provider.svelte'; + import { RootContext } from '../modules/root-context'; + + const props: FileUploadRootContextProps = $props(); + + const fileUpload = RootContext.consume(); + + const { children } = $derived(props); +</script> + +{@render children(fileUpload)} diff --git a/packages/skeleton-svelte/src/components/file-upload/anatomy/root-provider.svelte b/packages/skeleton-svelte/src/components/file-upload/anatomy/root-provider.svelte new file mode 100644 index 0000000000..14b8f1efba --- /dev/null +++ b/packages/skeleton-svelte/src/components/file-upload/anatomy/root-provider.svelte @@ -0,0 +1,39 @@ +<script lang="ts" module> + import type { useFileUpload } from '../modules/provider.svelte'; + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface FileUploadRootProviderProps extends PropsWithElement<'div'>, Omit<HTMLAttributes<'div'>, 'id' | 'dir'> { + value: ReturnType<typeof useFileUpload>; + } +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesFileUpload } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: FileUploadRootProviderProps = $props(); + + const { element, children, value: fileUpload, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + fileUpload().getRootProps(), + { + class: classesFileUpload.root, + }, + rest, + ), + ); + + RootContext.provide(() => fileUpload()); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/file-upload/anatomy/root.svelte b/packages/skeleton-svelte/src/components/file-upload/anatomy/root.svelte new file mode 100644 index 0000000000..a039c2efc0 --- /dev/null +++ b/packages/skeleton-svelte/src/components/file-upload/anatomy/root.svelte @@ -0,0 +1,46 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + import type { Props } from '@zag-js/file-upload'; + + export interface FileUploadRootProps extends Omit<Props, 'id'>, PropsWithElement<'div'>, HTMLAttributes<'div', 'id' | 'dir'> {} +</script> + +<script lang="ts"> + import { useFileUpload } from '../modules/provider.svelte'; + import { RootContext } from '../modules/root-context'; + import { classesFileUpload } from '@skeletonlabs/skeleton-common'; + import { splitProps } from '@zag-js/file-upload'; + import { mergeProps } from '@zag-js/svelte'; + + const props: FileUploadRootProps = $props(); + + const [machineProps, componentProps] = $derived(splitProps(props)); + const { element, children, ...rest } = $derived(componentProps); + + const id = $props.id(); + const fileUpload = useFileUpload(() => ({ + id: id, + ...machineProps, + })); + + const attributes = $derived( + mergeProps( + fileUpload().getRootProps(), + { + class: classesFileUpload.root, + }, + rest, + ), + ); + + RootContext.provide(() => fileUpload()); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/file-upload/anatomy/trigger.svelte b/packages/skeleton-svelte/src/components/file-upload/anatomy/trigger.svelte new file mode 100644 index 0000000000..0aee131122 --- /dev/null +++ b/packages/skeleton-svelte/src/components/file-upload/anatomy/trigger.svelte @@ -0,0 +1,36 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface FileUploadTriggerProps extends PropsWithElement<'button'>, HTMLAttributes<'button'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesFileUpload } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: FileUploadTriggerProps = $props(); + + const fileUpload = RootContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + fileUpload().getTriggerProps(), + { + class: classesFileUpload.trigger, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <button {...attributes}> + {@render children?.()} + </button> +{/if} diff --git a/packages/skeleton-svelte/src/components/file-upload/index.ts b/packages/skeleton-svelte/src/components/file-upload/index.ts new file mode 100644 index 0000000000..2403e7d886 --- /dev/null +++ b/packages/skeleton-svelte/src/components/file-upload/index.ts @@ -0,0 +1,11 @@ +export type { FileUploadDropzoneProps } from './anatomy/dropzone.svelte'; +export type { FileUploadItemProps } from './anatomy/item.svelte'; +export type { FileUploadItemDeleteTriggerProps } from './anatomy/item-delete-trigger.svelte'; +export type { FileUploadItemGroupProps } from './anatomy/item-group.svelte'; +export type { FileUploadItemNameProps } from './anatomy/item-name.svelte'; +export type { FileUploadRootProps } from './anatomy/root.svelte'; +export type { FileUploadRootContextProps } from './anatomy/root-context.svelte'; +export type { FileUploadRootProviderProps } from './anatomy/root-provider.svelte'; +export type { FileUploadTriggerProps } from './anatomy/trigger.svelte'; +export { FileUpload } from './modules/anatomy'; +export { useFileUpload } from './modules/provider.svelte'; diff --git a/packages/skeleton-svelte/src/components/file-upload/modules/anatomy.ts b/packages/skeleton-svelte/src/components/file-upload/modules/anatomy.ts new file mode 100644 index 0000000000..cdccfb77ea --- /dev/null +++ b/packages/skeleton-svelte/src/components/file-upload/modules/anatomy.ts @@ -0,0 +1,24 @@ +import Dropzone from '../anatomy/dropzone.svelte'; +import HiddenInput from '../anatomy/hidden-input.svelte'; +import ItemDeleteTrigger from '../anatomy/item-delete-trigger.svelte'; +import ItemGroup from '../anatomy/item-group.svelte'; +import ItemName from '../anatomy/item-name.svelte'; +import ItemSizeText from '../anatomy/item-size-text.svelte'; +import Item from '../anatomy/item.svelte'; +import RootContext from '../anatomy/root-context.svelte'; +import RootProvider from '../anatomy/root-provider.svelte'; +import Root from '../anatomy/root.svelte'; +import Trigger from '../anatomy/trigger.svelte'; + +export const FileUpload = Object.assign(Root, { + Provider: RootProvider, + Context: RootContext, + Dropzone: Dropzone, + Trigger: Trigger, + HiddenInput: HiddenInput, + ItemGroup: ItemGroup, + Item: Item, + ItemName: ItemName, + ItemSizeText: ItemSizeText, + ItemDeleteTrigger: ItemDeleteTrigger, +}); diff --git a/packages/skeleton-svelte/src/components/file-upload/modules/item-context.ts b/packages/skeleton-svelte/src/components/file-upload/modules/item-context.ts new file mode 100644 index 0000000000..5130e6eec2 --- /dev/null +++ b/packages/skeleton-svelte/src/components/file-upload/modules/item-context.ts @@ -0,0 +1,4 @@ +import { createContext } from '@/internal/create-context'; +import type { ItemProps } from '@zag-js/file-upload'; + +export const ItemContext = createContext<() => ItemProps>(); diff --git a/packages/skeleton-svelte/src/components/file-upload/modules/provider.svelte.ts b/packages/skeleton-svelte/src/components/file-upload/modules/provider.svelte.ts new file mode 100644 index 0000000000..b6b847b0c2 --- /dev/null +++ b/packages/skeleton-svelte/src/components/file-upload/modules/provider.svelte.ts @@ -0,0 +1,9 @@ +import { connect, machine } from '@zag-js/file-upload'; +import type { Api, Props } from '@zag-js/file-upload'; +import { normalizeProps, useMachine, type PropTypes } from '@zag-js/svelte'; + +export function useFileUpload(props: Props | (() => Props)): () => Api<PropTypes> { + const service = useMachine(machine, props); + const fileUpload = $derived(connect(service, normalizeProps)); + return () => fileUpload; +} diff --git a/packages/skeleton-svelte/src/components/file-upload/modules/root-context.ts b/packages/skeleton-svelte/src/components/file-upload/modules/root-context.ts new file mode 100644 index 0000000000..6ed24da10c --- /dev/null +++ b/packages/skeleton-svelte/src/components/file-upload/modules/root-context.ts @@ -0,0 +1,4 @@ +import type { useFileUpload } from './provider.svelte'; +import { createContext } from '@/internal/create-context'; + +export const RootContext = createContext<ReturnType<typeof useFileUpload>>(); diff --git a/packages/skeleton-svelte/src/components/popover/anatomy/arrow-tip.svelte b/packages/skeleton-svelte/src/components/popover/anatomy/arrow-tip.svelte new file mode 100644 index 0000000000..9965822e19 --- /dev/null +++ b/packages/skeleton-svelte/src/components/popover/anatomy/arrow-tip.svelte @@ -0,0 +1,36 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface PopoverArrowTipProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} +</script> + +<script lang="ts"> + import { PopoverRootContext } from '../modules/root-context'; + import { classesPopover } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: PopoverArrowTipProps = $props(); + + const popover = PopoverRootContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + popover().getArrowTipProps(), + { + class: classesPopover.arrowTip, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/popover/anatomy/arrow.svelte b/packages/skeleton-svelte/src/components/popover/anatomy/arrow.svelte new file mode 100644 index 0000000000..45afd68926 --- /dev/null +++ b/packages/skeleton-svelte/src/components/popover/anatomy/arrow.svelte @@ -0,0 +1,36 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface PopoverArrowProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} +</script> + +<script lang="ts"> + import { PopoverRootContext } from '../modules/root-context'; + import { classesPopover } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: PopoverArrowProps = $props(); + + const popover = PopoverRootContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + popover().getArrowProps(), + { + class: classesPopover.arrow, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/popover/anatomy/close-trigger.svelte b/packages/skeleton-svelte/src/components/popover/anatomy/close-trigger.svelte new file mode 100644 index 0000000000..5b56d72fbc --- /dev/null +++ b/packages/skeleton-svelte/src/components/popover/anatomy/close-trigger.svelte @@ -0,0 +1,36 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface PopoverCloseTriggerProps extends PropsWithElement<'button'>, HTMLAttributes<'button'> {} +</script> + +<script lang="ts"> + import { PopoverRootContext } from '../modules/root-context'; + import { classesPopover } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: PopoverCloseTriggerProps = $props(); + + const popover = PopoverRootContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + popover().getCloseTriggerProps(), + { + class: classesPopover.closeTrigger, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <button {...attributes}> + {@render children?.()} + </button> +{/if} diff --git a/packages/skeleton-svelte/src/components/popover/anatomy/content.svelte b/packages/skeleton-svelte/src/components/popover/anatomy/content.svelte new file mode 100644 index 0000000000..0aa2db2c93 --- /dev/null +++ b/packages/skeleton-svelte/src/components/popover/anatomy/content.svelte @@ -0,0 +1,36 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface PopoverContentProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} +</script> + +<script lang="ts"> + import { PopoverRootContext } from '../modules/root-context'; + import { classesPopover } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: PopoverContentProps = $props(); + + const popover = PopoverRootContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + popover().getContentProps(), + { + class: classesPopover.content, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/popover/anatomy/description.svelte b/packages/skeleton-svelte/src/components/popover/anatomy/description.svelte new file mode 100644 index 0000000000..d2ccb74c39 --- /dev/null +++ b/packages/skeleton-svelte/src/components/popover/anatomy/description.svelte @@ -0,0 +1,36 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface PopoverDescriptionProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} +</script> + +<script lang="ts"> + import { PopoverRootContext } from '../modules/root-context'; + import { classesPopover } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: PopoverDescriptionProps = $props(); + + const popover = PopoverRootContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + popover().getDescriptionProps(), + { + class: classesPopover.description, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/popover/anatomy/positioner.svelte b/packages/skeleton-svelte/src/components/popover/anatomy/positioner.svelte new file mode 100644 index 0000000000..876e8056db --- /dev/null +++ b/packages/skeleton-svelte/src/components/popover/anatomy/positioner.svelte @@ -0,0 +1,36 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface PopoverPositionerProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} +</script> + +<script lang="ts"> + import { PopoverRootContext } from '../modules/root-context'; + import { classesPopover } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: PopoverPositionerProps = $props(); + + const popover = PopoverRootContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + popover().getPositionerProps(), + { + class: classesPopover.positioner, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/popover/anatomy/root-context.svelte b/packages/skeleton-svelte/src/components/popover/anatomy/root-context.svelte new file mode 100644 index 0000000000..8a0fdfeb75 --- /dev/null +++ b/packages/skeleton-svelte/src/components/popover/anatomy/root-context.svelte @@ -0,0 +1,20 @@ +<script lang="ts" module> + import type { usePopover } from '../modules/provider.svelte'; + import type { Snippet } from 'svelte'; + + export interface PopoverRootContextProps { + children: Snippet<[ReturnType<typeof usePopover>]>; + } +</script> + +<script lang="ts"> + import { PopoverRootContext } from '../modules/root-context'; + + const props: PopoverRootContextProps = $props(); + + const popover = PopoverRootContext.consume(); + + const { children } = $derived(props); +</script> + +{@render children(popover)} diff --git a/packages/skeleton-svelte/src/components/popover/anatomy/root-provider.svelte b/packages/skeleton-svelte/src/components/popover/anatomy/root-provider.svelte new file mode 100644 index 0000000000..ee6a5c954f --- /dev/null +++ b/packages/skeleton-svelte/src/components/popover/anatomy/root-provider.svelte @@ -0,0 +1,20 @@ +<script lang="ts" module> + import type { usePopover } from '../modules/provider.svelte'; + import type { PropsWithChildren } from '@/internal/props-with-children'; + + export interface PopoverRootProviderProps extends PropsWithChildren { + value: ReturnType<typeof usePopover>; + } +</script> + +<script lang="ts"> + import { PopoverRootContext } from '../modules/root-context'; + + const props: PopoverRootProviderProps = $props(); + + const { children, value: popover } = $derived(props); + + PopoverRootContext.provide(() => popover()); +</script> + +{@render children?.()} diff --git a/packages/skeleton-svelte/src/components/popover/anatomy/root.svelte b/packages/skeleton-svelte/src/components/popover/anatomy/root.svelte new file mode 100644 index 0000000000..03971fd5ae --- /dev/null +++ b/packages/skeleton-svelte/src/components/popover/anatomy/root.svelte @@ -0,0 +1,27 @@ +<script lang="ts" module> + import type { PropsWithChildren } from '@/internal/props-with-children'; + import type { Props } from '@zag-js/popover'; + + export interface PopoverRootProps extends Omit<Props, 'id'>, PropsWithChildren {} +</script> + +<script lang="ts"> + import { usePopover } from '../modules/provider.svelte'; + import { PopoverRootContext } from '../modules/root-context'; + import { splitProps } from '@zag-js/popover'; + + const props: PopoverRootProps = $props(); + + const [machineProps, componentProps] = $derived(splitProps(props)); + const { children } = $derived(componentProps); + + const id = $props.id(); + const popover = usePopover(() => ({ + id: id, + ...machineProps, + })); + + PopoverRootContext.provide(() => popover()); +</script> + +{@render children?.()} diff --git a/packages/skeleton-svelte/src/components/popover/anatomy/title.svelte b/packages/skeleton-svelte/src/components/popover/anatomy/title.svelte new file mode 100644 index 0000000000..7436e228ea --- /dev/null +++ b/packages/skeleton-svelte/src/components/popover/anatomy/title.svelte @@ -0,0 +1,36 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface PopoverTitleProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} +</script> + +<script lang="ts"> + import { PopoverRootContext } from '../modules/root-context'; + import { classesPopover } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: PopoverTitleProps = $props(); + + const popover = PopoverRootContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + popover().getTitleProps(), + { + class: classesPopover.title, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/popover/anatomy/trigger.svelte b/packages/skeleton-svelte/src/components/popover/anatomy/trigger.svelte new file mode 100644 index 0000000000..dedc8414a2 --- /dev/null +++ b/packages/skeleton-svelte/src/components/popover/anatomy/trigger.svelte @@ -0,0 +1,36 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface PopoverTriggerProps extends PropsWithElement<'button'>, HTMLAttributes<'button'> {} +</script> + +<script lang="ts"> + import { PopoverRootContext } from '../modules/root-context'; + import { classesPopover } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: PopoverTriggerProps = $props(); + + const popover = PopoverRootContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + popover().getTriggerProps(), + { + class: classesPopover.trigger, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <button {...attributes}> + {@render children?.()} + </button> +{/if} diff --git a/packages/skeleton-svelte/src/components/popover/index.ts b/packages/skeleton-svelte/src/components/popover/index.ts new file mode 100644 index 0000000000..6697f2997b --- /dev/null +++ b/packages/skeleton-svelte/src/components/popover/index.ts @@ -0,0 +1,11 @@ +export type { PopoverCloseTriggerProps } from './anatomy/close-trigger.svelte'; +export type { PopoverContentProps } from './anatomy/content.svelte'; +export type { PopoverDescriptionProps } from './anatomy/description.svelte'; +export type { PopoverPositionerProps } from './anatomy/positioner.svelte'; +export type { PopoverRootProps } from './anatomy/root.svelte'; +export type { PopoverRootContextProps } from './anatomy/root-context.svelte'; +export type { PopoverRootProviderProps } from './anatomy/root-provider.svelte'; +export type { PopoverTitleProps } from './anatomy/title.svelte'; +export type { PopoverTriggerProps } from './anatomy/trigger.svelte'; +export { Popover } from './modules/anatomy'; +export { usePopover } from './modules/provider.svelte'; diff --git a/packages/skeleton-svelte/src/components/popover/modules/anatomy.ts b/packages/skeleton-svelte/src/components/popover/modules/anatomy.ts new file mode 100644 index 0000000000..2dc9c30a8a --- /dev/null +++ b/packages/skeleton-svelte/src/components/popover/modules/anatomy.ts @@ -0,0 +1,24 @@ +import ArrowTip from '../anatomy/arrow-tip.svelte'; +import Arrow from '../anatomy/arrow.svelte'; +import CloseTrigger from '../anatomy/close-trigger.svelte'; +import Content from '../anatomy/content.svelte'; +import Description from '../anatomy/description.svelte'; +import Positioner from '../anatomy/positioner.svelte'; +import RootContext from '../anatomy/root-context.svelte'; +import RootProvider from '../anatomy/root-provider.svelte'; +import Root from '../anatomy/root.svelte'; +import Title from '../anatomy/title.svelte'; +import Trigger from '../anatomy/trigger.svelte'; + +export const Popover = Object.assign(Root, { + Provider: RootProvider, + Context: RootContext, + Trigger: Trigger, + Positioner: Positioner, + Content: Content, + Arrow: Arrow, + ArrowTip: ArrowTip, + Title: Title, + Description: Description, + CloseTrigger: CloseTrigger, +}); diff --git a/packages/skeleton-svelte/src/components/popover/modules/provider.svelte.ts b/packages/skeleton-svelte/src/components/popover/modules/provider.svelte.ts new file mode 100644 index 0000000000..2fda8545f4 --- /dev/null +++ b/packages/skeleton-svelte/src/components/popover/modules/provider.svelte.ts @@ -0,0 +1,8 @@ +import { type Api, connect, machine, type Props } from '@zag-js/popover'; +import { normalizeProps, useMachine, type PropTypes } from '@zag-js/svelte'; + +export function usePopover(props: Props | (() => Props)): () => Api<PropTypes> { + const service = useMachine(machine, props); + const popover = $derived(connect(service, normalizeProps)); + return () => popover; +} diff --git a/packages/skeleton-svelte/src/components/popover/modules/root-context.ts b/packages/skeleton-svelte/src/components/popover/modules/root-context.ts new file mode 100644 index 0000000000..2d8d8c128e --- /dev/null +++ b/packages/skeleton-svelte/src/components/popover/modules/root-context.ts @@ -0,0 +1,4 @@ +import type { usePopover } from './provider.svelte'; +import { createContext } from '@/internal/create-context'; + +export const PopoverRootContext = createContext<ReturnType<typeof usePopover>>(); diff --git a/packages/skeleton-svelte/src/components/portal/anatomy/root.svelte b/packages/skeleton-svelte/src/components/portal/anatomy/root.svelte new file mode 100644 index 0000000000..507aabc8e9 --- /dev/null +++ b/packages/skeleton-svelte/src/components/portal/anatomy/root.svelte @@ -0,0 +1,43 @@ +<script lang="ts" module> + import type { PropsWithChildren } from '@/internal/props-with-children'; + + export interface PortalRootProps extends Required<PropsWithChildren> { + /** + * If true, the portal functionality is disabled and children are rendered in place. + * + * @default false + */ + disabled?: boolean; + /** + * The HTML element to which the portal content will be appended. + * + * @default document.body + */ + target?: HTMLElement; + } +</script> + +<script lang="ts"> + import { getAllContexts, mount, unmount } from 'svelte'; + + const props: PortalRootProps = $props(); + + const context = getAllContexts(); + + const { children, disabled = false, target = typeof window === 'undefined' ? undefined : document.body } = $derived(props); + + $effect(() => { + if (disabled || !target) { + return; + } + const instance = mount(children, { + target: target, + context: context, + }); + return () => unmount(instance); + }); +</script> + +{#if disabled || !target} + {@render children()} +{/if} diff --git a/packages/skeleton-svelte/src/components/portal/index.ts b/packages/skeleton-svelte/src/components/portal/index.ts new file mode 100644 index 0000000000..cca9104932 --- /dev/null +++ b/packages/skeleton-svelte/src/components/portal/index.ts @@ -0,0 +1,2 @@ +export { Portal } from './modules/anatomy'; +export type { PortalRootProps } from './anatomy/root.svelte'; diff --git a/packages/skeleton-svelte/src/components/portal/modules/anatomy.ts b/packages/skeleton-svelte/src/components/portal/modules/anatomy.ts new file mode 100644 index 0000000000..e85fcaa87a --- /dev/null +++ b/packages/skeleton-svelte/src/components/portal/modules/anatomy.ts @@ -0,0 +1,3 @@ +import Root from '../anatomy/root.svelte'; + +export const Portal = Root; diff --git a/packages/skeleton-svelte/src/components/progress-linear/anatomy/label.svelte b/packages/skeleton-svelte/src/components/progress-linear/anatomy/label.svelte new file mode 100644 index 0000000000..ad08580a6c --- /dev/null +++ b/packages/skeleton-svelte/src/components/progress-linear/anatomy/label.svelte @@ -0,0 +1,36 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface ProgressLinearLabelProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesProgressLinear } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: ProgressLinearLabelProps = $props(); + + const progressLinear = RootContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + progressLinear().getLabelProps(), + { + class: classesProgressLinear.label, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/progress-linear/anatomy/range.svelte b/packages/skeleton-svelte/src/components/progress-linear/anatomy/range.svelte new file mode 100644 index 0000000000..63f7175ed9 --- /dev/null +++ b/packages/skeleton-svelte/src/components/progress-linear/anatomy/range.svelte @@ -0,0 +1,36 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface ProgressLinearRangeProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesProgressLinear } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: ProgressLinearRangeProps = $props(); + + const progressLinear = RootContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + progressLinear().getRangeProps(), + { + class: classesProgressLinear.range, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/progress-linear/anatomy/root-context.svelte b/packages/skeleton-svelte/src/components/progress-linear/anatomy/root-context.svelte new file mode 100644 index 0000000000..c8f6285d8e --- /dev/null +++ b/packages/skeleton-svelte/src/components/progress-linear/anatomy/root-context.svelte @@ -0,0 +1,20 @@ +<script lang="ts" module> + import type { useProgressLinear } from '../modules/provider.svelte'; + import type { Snippet } from 'svelte'; + + export interface ProgressLinearRootContextProps { + children: Snippet<[ReturnType<typeof useProgressLinear>]>; + } +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + + const props: ProgressLinearRootContextProps = $props(); + + const progressLinear = RootContext.consume(); + + const { children } = $derived(props); +</script> + +{@render children(progressLinear)} diff --git a/packages/skeleton-svelte/src/components/progress-linear/anatomy/root-provider.svelte b/packages/skeleton-svelte/src/components/progress-linear/anatomy/root-provider.svelte new file mode 100644 index 0000000000..4ccad0814e --- /dev/null +++ b/packages/skeleton-svelte/src/components/progress-linear/anatomy/root-provider.svelte @@ -0,0 +1,39 @@ +<script lang="ts" module> + import type { useProgressLinear } from '../modules/provider.svelte'; + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface ProgressLinearRootProviderProps extends PropsWithElement<'div'>, HTMLAttributes<'div', 'id' | 'dir'> { + value: ReturnType<typeof useProgressLinear>; + } +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesProgressLinear } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: ProgressLinearRootProviderProps = $props(); + + const { element, children, value: progressLinear, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + progressLinear().getRootProps(), + { + class: classesProgressLinear.root, + }, + rest, + ), + ); + + RootContext.provide(() => progressLinear()); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/progress-linear/anatomy/root.svelte b/packages/skeleton-svelte/src/components/progress-linear/anatomy/root.svelte new file mode 100644 index 0000000000..f48e4feab0 --- /dev/null +++ b/packages/skeleton-svelte/src/components/progress-linear/anatomy/root.svelte @@ -0,0 +1,46 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + import type { Props } from '@zag-js/progress'; + + export interface ProgressLinearRootProps extends Omit<Props, 'id'>, PropsWithElement<'div'>, HTMLAttributes<'div', 'id' | 'dir'> {} +</script> + +<script lang="ts"> + import { useProgressLinear } from '../modules/provider.svelte'; + import { RootContext } from '../modules/root-context'; + import { classesProgressLinear } from '@skeletonlabs/skeleton-common'; + import { splitProps } from '@zag-js/progress'; + import { mergeProps } from '@zag-js/svelte'; + + const props: ProgressLinearRootProps = $props(); + + const [progressLinearProps, componentProps] = $derived(splitProps(props)); + const { element, children, ...rest } = $derived(componentProps); + + const id = $props.id(); + const avatar = useProgressLinear(() => ({ + id, + ...progressLinearProps, + })); + + const attributes = $derived( + mergeProps( + avatar().getRootProps(), + { + class: classesProgressLinear.root, + }, + rest, + ), + ); + + RootContext.provide(() => avatar()); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/progress-linear/anatomy/track.svelte b/packages/skeleton-svelte/src/components/progress-linear/anatomy/track.svelte new file mode 100644 index 0000000000..eec9ac9689 --- /dev/null +++ b/packages/skeleton-svelte/src/components/progress-linear/anatomy/track.svelte @@ -0,0 +1,36 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface ProgressLinearTrackProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesProgressLinear } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: ProgressLinearTrackProps = $props(); + + const progressLinear = RootContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + progressLinear().getTrackProps(), + { + class: classesProgressLinear.track, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/progress-linear/index.ts b/packages/skeleton-svelte/src/components/progress-linear/index.ts new file mode 100644 index 0000000000..995736c0d6 --- /dev/null +++ b/packages/skeleton-svelte/src/components/progress-linear/index.ts @@ -0,0 +1,8 @@ +export type { ProgressLinearLabelProps } from './anatomy/label.svelte'; +export type { ProgressLinearRangeProps } from './anatomy/range.svelte'; +export type { ProgressLinearRootProps } from './anatomy/root.svelte'; +export type { ProgressLinearRootContextProps } from './anatomy/root-context.svelte'; +export type { ProgressLinearRootProviderProps } from './anatomy/root-provider.svelte'; +export type { ProgressLinearTrackProps } from './anatomy/track.svelte'; +export { ProgressLinear } from './modules/anatomy'; +export { useProgressLinear } from './modules/provider.svelte'; diff --git a/packages/skeleton-svelte/src/components/progress-linear/modules/anatomy.ts b/packages/skeleton-svelte/src/components/progress-linear/modules/anatomy.ts new file mode 100644 index 0000000000..0054249fbf --- /dev/null +++ b/packages/skeleton-svelte/src/components/progress-linear/modules/anatomy.ts @@ -0,0 +1,14 @@ +import Label from '../anatomy/label.svelte'; +import Range from '../anatomy/range.svelte'; +import RootContext from '../anatomy/root-context.svelte'; +import RootProvider from '../anatomy/root-provider.svelte'; +import Root from '../anatomy/root.svelte'; +import Track from '../anatomy/track.svelte'; + +export const ProgressLinear = Object.assign(Root, { + Provider: RootProvider, + Context: RootContext, + Label: Label, + Track: Track, + Range: Range, +}); diff --git a/packages/skeleton-svelte/src/components/progress-linear/modules/provider.svelte.ts b/packages/skeleton-svelte/src/components/progress-linear/modules/provider.svelte.ts new file mode 100644 index 0000000000..291c3b1992 --- /dev/null +++ b/packages/skeleton-svelte/src/components/progress-linear/modules/provider.svelte.ts @@ -0,0 +1,9 @@ +import { connect, machine } from '@zag-js/progress'; +import type { Api, Props } from '@zag-js/progress'; +import { normalizeProps, useMachine, type PropTypes } from '@zag-js/svelte'; + +export function useProgressLinear(props: Props | (() => Props)): () => Api<PropTypes> { + const service = useMachine(machine, props); + const progressLinear = $derived(connect(service, normalizeProps)); + return () => progressLinear; +} diff --git a/packages/skeleton-svelte/src/components/progress-linear/modules/root-context.ts b/packages/skeleton-svelte/src/components/progress-linear/modules/root-context.ts new file mode 100644 index 0000000000..b5e07556c0 --- /dev/null +++ b/packages/skeleton-svelte/src/components/progress-linear/modules/root-context.ts @@ -0,0 +1,4 @@ +import type { useProgressLinear } from './provider.svelte'; +import { createContext } from '@/internal/create-context.js'; + +export const RootContext = createContext<ReturnType<typeof useProgressLinear>>(); diff --git a/packages/skeleton-svelte/src/components/rating-group/anatomy/control.svelte b/packages/skeleton-svelte/src/components/rating-group/anatomy/control.svelte new file mode 100644 index 0000000000..e9467e5f89 --- /dev/null +++ b/packages/skeleton-svelte/src/components/rating-group/anatomy/control.svelte @@ -0,0 +1,36 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface RatingGroupControlProps extends PropsWithElement<'div'>, HTMLAttributes<'div', 'id' | 'dir'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesRatingGroup } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: RatingGroupControlProps = $props(); + + const ratingGroup = RootContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + ratingGroup().getControlProps(), + { + class: classesRatingGroup.control, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/rating-group/anatomy/hidden-input.svelte b/packages/skeleton-svelte/src/components/rating-group/anatomy/hidden-input.svelte new file mode 100644 index 0000000000..16af24accf --- /dev/null +++ b/packages/skeleton-svelte/src/components/rating-group/anatomy/hidden-input.svelte @@ -0,0 +1,34 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface RatingGroupHiddenInputProps extends PropsWithElement<'input'>, HTMLAttributes<'input'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesRatingGroup } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: RatingGroupHiddenInputProps = $props(); + + const ratingGroup = RootContext.consume(); + + const { element, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + ratingGroup().getHiddenInputProps(), + { + class: classesRatingGroup.hiddenInput, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <input {...attributes} /> +{/if} diff --git a/packages/skeleton-svelte/src/components/rating-group/anatomy/item.svelte b/packages/skeleton-svelte/src/components/rating-group/anatomy/item.svelte new file mode 100644 index 0000000000..3a2a6b8e3c --- /dev/null +++ b/packages/skeleton-svelte/src/components/rating-group/anatomy/item.svelte @@ -0,0 +1,84 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + import type { ItemProps } from '@zag-js/rating-group'; + + export interface RatingGroupItemProps extends ItemProps, PropsWithElement<'span'>, HTMLAttributes<'span', 'id' | 'dir'> { + /** + * The content to render when the item is in the empty state. + * + * @default StarEmpty (SVG) + */ + empty?: Snippet; + /** + * The content to render when the item is in the half state. + * + * @default StarHalf (SVG) + */ + half?: Snippet; + /** + * The content to render when the item is in the full state. + * + * @default StarFull (SVG) + */ + full?: Snippet; + } +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import StarEmpty from '@/internal/components/star-empty.svelte'; + import StarFull from '@/internal/components/star-full.svelte'; + import StarHalf from '@/internal/components/star-half.svelte'; + import { classesRatingGroup } from '@skeletonlabs/skeleton-common'; + import { splitItemProps } from '@zag-js/rating-group'; + import { mergeProps } from '@zag-js/svelte'; + import type { Snippet } from 'svelte'; + + const props: RatingGroupItemProps = $props(); + + const ratingGroup = RootContext.consume(); + + const [itemProps, componentProps] = $derived(splitItemProps(props)); + const { element, children, empty = starEmpty, half = starHalf, full = starFull, ...rest } = $derived(componentProps); + + const itemState = $derived(ratingGroup().getItemState(itemProps)); + + const attributes = $derived( + mergeProps( + ratingGroup().getItemProps(itemProps), + { + class: classesRatingGroup.item, + }, + rest, + ), + ); +</script> + +{#snippet starEmpty()} + <StarEmpty /> +{/snippet} + +{#snippet starHalf()} + <StarHalf /> +{/snippet} + +{#snippet starFull()} + <StarFull /> +{/snippet} + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {#if children} + {@render children()} + {:else if !itemState.highlighted} + {@render empty?.()} + {:else if itemState.half} + {@render half?.()} + {:else} + {@render full?.()} + {/if} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/rating-group/anatomy/label.svelte b/packages/skeleton-svelte/src/components/rating-group/anatomy/label.svelte new file mode 100644 index 0000000000..75a68435b1 --- /dev/null +++ b/packages/skeleton-svelte/src/components/rating-group/anatomy/label.svelte @@ -0,0 +1,36 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface RatingGroupLabelProps extends PropsWithElement<'label'>, HTMLAttributes<'label', 'id' | 'dir'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesRatingGroup } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: RatingGroupLabelProps = $props(); + + const ratingGroup = RootContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + ratingGroup().getControlProps(), + { + class: classesRatingGroup.label, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <label {...attributes}> + {@render children?.()} + </label> +{/if} diff --git a/packages/skeleton-svelte/src/components/rating-group/anatomy/root-context.svelte b/packages/skeleton-svelte/src/components/rating-group/anatomy/root-context.svelte new file mode 100644 index 0000000000..b9fffd8f81 --- /dev/null +++ b/packages/skeleton-svelte/src/components/rating-group/anatomy/root-context.svelte @@ -0,0 +1,20 @@ +<script lang="ts" module> + import type { useRatingGroup } from '../modules/provider.svelte'; + import type { Snippet } from 'svelte'; + + export interface RatingGroupRootContextProps { + children: Snippet<[ReturnType<typeof useRatingGroup>]>; + } +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + + const props: RatingGroupRootContextProps = $props(); + + const ratingGroup = RootContext.consume(); + + const { children } = $derived(props); +</script> + +{@render children(ratingGroup)} diff --git a/packages/skeleton-svelte/src/components/rating-group/anatomy/root-provider.svelte b/packages/skeleton-svelte/src/components/rating-group/anatomy/root-provider.svelte new file mode 100644 index 0000000000..adb6675949 --- /dev/null +++ b/packages/skeleton-svelte/src/components/rating-group/anatomy/root-provider.svelte @@ -0,0 +1,39 @@ +<script lang="ts" module> + import type { useRatingGroup } from '../modules/provider.svelte'; + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface RatingGroupRootProviderProps extends PropsWithElement<'div'>, HTMLAttributes<'div', 'id' | 'dir'> { + value: ReturnType<typeof useRatingGroup>; + } +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesRatingGroup } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: RatingGroupRootProviderProps = $props(); + + const { element, children, value: ratingGroup, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + ratingGroup().getRootProps(), + { + class: classesRatingGroup.root, + }, + rest, + ), + ); + + RootContext.provide(() => ratingGroup()); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/rating-group/anatomy/root.svelte b/packages/skeleton-svelte/src/components/rating-group/anatomy/root.svelte new file mode 100644 index 0000000000..2d14c94fbd --- /dev/null +++ b/packages/skeleton-svelte/src/components/rating-group/anatomy/root.svelte @@ -0,0 +1,46 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + import type { Props } from '@zag-js/rating-group'; + + export interface RatingGroupRootProps extends Omit<Props, 'id'>, PropsWithElement<'div'>, HTMLAttributes<'div', 'id' | 'dir'> {} +</script> + +<script lang="ts"> + import { useRatingGroup } from '../modules/provider.svelte'; + import { RootContext } from '../modules/root-context'; + import { classesRatingGroup } from '@skeletonlabs/skeleton-common'; + import { splitProps } from '@zag-js/rating-group'; + import { mergeProps } from '@zag-js/svelte'; + + const props: RatingGroupRootProps = $props(); + + const [ratingGroupProps, componentProps] = $derived(splitProps(props)); + const { element, children, ...rest } = $derived(componentProps); + + const id = $props.id(); + const ratingGroup = useRatingGroup(() => ({ + id: id, + ...ratingGroupProps, + })); + + const attributes = $derived( + mergeProps( + ratingGroup().getRootProps(), + { + class: classesRatingGroup.root, + }, + rest, + ), + ); + + RootContext.provide(() => ratingGroup()); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/rating-group/index.ts b/packages/skeleton-svelte/src/components/rating-group/index.ts new file mode 100644 index 0000000000..a5c47e514d --- /dev/null +++ b/packages/skeleton-svelte/src/components/rating-group/index.ts @@ -0,0 +1,9 @@ +export type { RatingGroupControlProps } from './anatomy/control.svelte'; +export type { RatingGroupHiddenInputProps } from './anatomy/hidden-input.svelte'; +export type { RatingGroupItemProps } from './anatomy/item.svelte'; +export type { RatingGroupLabelProps } from './anatomy/label.svelte'; +export type { RatingGroupRootProps } from './anatomy/root.svelte'; +export type { RatingGroupRootContextProps } from './anatomy/root-context.svelte'; +export type { RatingGroupRootProviderProps } from './anatomy/root-provider.svelte'; +export { RatingGroup } from './modules/anatomy'; +export { useRatingGroup } from './modules/provider.svelte'; diff --git a/packages/skeleton-svelte/src/components/rating-group/modules/anatomy.ts b/packages/skeleton-svelte/src/components/rating-group/modules/anatomy.ts new file mode 100644 index 0000000000..7c7090e1b4 --- /dev/null +++ b/packages/skeleton-svelte/src/components/rating-group/modules/anatomy.ts @@ -0,0 +1,16 @@ +import Control from '../anatomy/control.svelte'; +import HiddenInput from '../anatomy/hidden-input.svelte'; +import Item from '../anatomy/item.svelte'; +import Label from '../anatomy/label.svelte'; +import RootContext from '../anatomy/root-context.svelte'; +import RootProvider from '../anatomy/root-provider.svelte'; +import Root from '../anatomy/root.svelte'; + +export const RatingGroup = Object.assign(Root, { + Provider: RootProvider, + Context: RootContext, + Label: Label, + Control: Control, + Item: Item, + HiddenInput: HiddenInput, +}); diff --git a/packages/skeleton-svelte/src/components/rating-group/modules/provider.svelte.ts b/packages/skeleton-svelte/src/components/rating-group/modules/provider.svelte.ts new file mode 100644 index 0000000000..0c8a4c79e0 --- /dev/null +++ b/packages/skeleton-svelte/src/components/rating-group/modules/provider.svelte.ts @@ -0,0 +1,9 @@ +import { connect, machine } from '@zag-js/rating-group'; +import type { Api, Props } from '@zag-js/rating-group'; +import { normalizeProps, useMachine, type PropTypes } from '@zag-js/svelte'; + +export function useRatingGroup(props: Props | (() => Props)): () => Api<PropTypes> { + const service = useMachine(machine, props); + const ratingGroup = $derived(connect(service, normalizeProps)); + return () => ratingGroup; +} diff --git a/packages/skeleton-svelte/src/components/rating-group/modules/root-context.ts b/packages/skeleton-svelte/src/components/rating-group/modules/root-context.ts new file mode 100644 index 0000000000..b4cc9994e0 --- /dev/null +++ b/packages/skeleton-svelte/src/components/rating-group/modules/root-context.ts @@ -0,0 +1,4 @@ +import type { useRatingGroup } from './provider.svelte'; +import { createContext } from '@/internal/create-context'; + +export const RootContext = createContext<ReturnType<typeof useRatingGroup>>(); diff --git a/packages/skeleton-svelte/src/components/segmented-control/anatomy/indicator.svelte b/packages/skeleton-svelte/src/components/segmented-control/anatomy/indicator.svelte new file mode 100644 index 0000000000..2286a6ac11 --- /dev/null +++ b/packages/skeleton-svelte/src/components/segmented-control/anatomy/indicator.svelte @@ -0,0 +1,34 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface SegmentedControlIndicatorProps extends PropsWithElement<'div'>, HTMLAttributes<'div', 'children'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesSegmentedControl } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: SegmentedControlIndicatorProps = $props(); + + const segmentedControl = RootContext.consume(); + + const { element, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + segmentedControl().getIndicatorProps(), + { + class: classesSegmentedControl.indicator, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}></div> +{/if} diff --git a/packages/skeleton-svelte/src/components/segmented-control/anatomy/item-hidden-input.svelte b/packages/skeleton-svelte/src/components/segmented-control/anatomy/item-hidden-input.svelte new file mode 100644 index 0000000000..0befb9fd26 --- /dev/null +++ b/packages/skeleton-svelte/src/components/segmented-control/anatomy/item-hidden-input.svelte @@ -0,0 +1,36 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface SegmentedControlItemHiddenInputProps extends PropsWithElement<'input'>, HTMLAttributes<'input', 'children'> {} +</script> + +<script lang="ts"> + import { ItemContext } from '../modules/item-context'; + import { RootContext } from '../modules/root-context'; + import { classesSegmentedControl } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: SegmentedControlItemHiddenInputProps = $props(); + + const segmentedcontrol = RootContext.consume(); + const itemProps = ItemContext.consume(); + + const { element, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + segmentedcontrol().getItemHiddenInputProps(itemProps()), + { + class: classesSegmentedControl.itemHiddenInput, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <input {...attributes} /> +{/if} diff --git a/packages/skeleton-svelte/src/components/segmented-control/anatomy/item-text.svelte b/packages/skeleton-svelte/src/components/segmented-control/anatomy/item-text.svelte new file mode 100644 index 0000000000..cc0c09cfd0 --- /dev/null +++ b/packages/skeleton-svelte/src/components/segmented-control/anatomy/item-text.svelte @@ -0,0 +1,38 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface SegmentedControlItemTextProps extends PropsWithElement<'span'>, HTMLAttributes<'span'> {} +</script> + +<script lang="ts"> + import { ItemContext } from '../modules/item-context'; + import { RootContext } from '../modules/root-context'; + import { classesSegmentedControl } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: SegmentedControlItemTextProps = $props(); + + const segmentedcontrol = RootContext.consume(); + const itemProps = ItemContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + segmentedcontrol().getItemTextProps(itemProps()), + { + class: classesSegmentedControl.itemText, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <span {...attributes}> + {@render children?.()} + </span> +{/if} diff --git a/packages/skeleton-svelte/src/components/segmented-control/anatomy/item.svelte b/packages/skeleton-svelte/src/components/segmented-control/anatomy/item.svelte new file mode 100644 index 0000000000..f94869a239 --- /dev/null +++ b/packages/skeleton-svelte/src/components/segmented-control/anatomy/item.svelte @@ -0,0 +1,42 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + import type { ItemProps } from '@zag-js/radio-group'; + + export interface SegmentedControlItemProps extends ItemProps, PropsWithElement<'label'>, HTMLAttributes<'label'> {} +</script> + +<script lang="ts"> + import { ItemContext } from '../modules/item-context'; + import { RootContext } from '../modules/root-context'; + import { classesSegmentedControl } from '@skeletonlabs/skeleton-common'; + import { splitItemProps } from '@zag-js/radio-group'; + import { mergeProps } from '@zag-js/svelte'; + + const props: SegmentedControlItemProps = $props(); + + const segmentedControl = RootContext.consume(); + + const [itemProps, componentProps] = $derived(splitItemProps(props)); + const { element, children, ...rest } = $derived(componentProps); + + const attributes = $derived( + mergeProps( + segmentedControl().getItemProps(itemProps), + { + class: classesSegmentedControl.item, + }, + rest, + ), + ); + + ItemContext.provide(() => itemProps); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <label {...attributes}> + {@render children?.()} + </label> +{/if} diff --git a/packages/skeleton-svelte/src/components/segmented-control/anatomy/root-context.svelte b/packages/skeleton-svelte/src/components/segmented-control/anatomy/root-context.svelte new file mode 100644 index 0000000000..23fb8b4e3d --- /dev/null +++ b/packages/skeleton-svelte/src/components/segmented-control/anatomy/root-context.svelte @@ -0,0 +1,20 @@ +<script lang="ts" module> + import type { useSegmentedControl } from '../modules/provider.svelte'; + import type { Snippet } from 'svelte'; + + export interface SegmentedControlRootContextProps { + children: Snippet<[ReturnType<typeof useSegmentedControl>]>; + } +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + + const props: SegmentedControlRootContextProps = $props(); + + const segmentedControl = RootContext.consume(); + + const { children } = $derived(props); +</script> + +{@render children(segmentedControl)} diff --git a/packages/skeleton-svelte/src/components/segmented-control/anatomy/root-provider.svelte b/packages/skeleton-svelte/src/components/segmented-control/anatomy/root-provider.svelte new file mode 100644 index 0000000000..583bb2a87c --- /dev/null +++ b/packages/skeleton-svelte/src/components/segmented-control/anatomy/root-provider.svelte @@ -0,0 +1,39 @@ +<script lang="ts" module> + import type { useSegmentedControl } from '../modules/provider.svelte'; + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface SegmentedControlRootProviderProps extends PropsWithElement<'div'>, HTMLAttributes<'div', 'id' | 'dir'> { + value: ReturnType<typeof useSegmentedControl>; + } +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesSegmentedControl } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: SegmentedControlRootProviderProps = $props(); + + const { element, children, value: segmentedControl, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + segmentedControl().getRootProps(), + { + class: classesSegmentedControl.root, + }, + rest, + ), + ); + + RootContext.provide(() => segmentedControl()); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/segmented-control/anatomy/root.svelte b/packages/skeleton-svelte/src/components/segmented-control/anatomy/root.svelte new file mode 100644 index 0000000000..8515bcf612 --- /dev/null +++ b/packages/skeleton-svelte/src/components/segmented-control/anatomy/root.svelte @@ -0,0 +1,46 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + import type { Props } from '@zag-js/radio-group'; + + export interface SegmentedControlRootProps extends Omit<Props, 'id'>, PropsWithElement<'div'>, HTMLAttributes<'div', 'id' | 'dir'> {} +</script> + +<script lang="ts"> + import { useSegmentedControl } from '../modules/provider.svelte'; + import { RootContext } from '../modules/root-context'; + import { classesSegmentedControl } from '@skeletonlabs/skeleton-common'; + import { splitProps } from '@zag-js/radio-group'; + import { mergeProps } from '@zag-js/svelte'; + + const props: SegmentedControlRootProps = $props(); + + const [segmentedControlProps, componentProps] = $derived(splitProps(props)); + const { element, children, ...rest } = $derived(componentProps); + + const id = $props.id(); + const segmentedControl = useSegmentedControl(() => ({ + id: id, + ...segmentedControlProps, + })); + + const attributes = $derived( + mergeProps( + segmentedControl().getRootProps(), + { + class: classesSegmentedControl.root, + }, + rest, + ), + ); + + RootContext.provide(() => segmentedControl()); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/segmented-control/index.ts b/packages/skeleton-svelte/src/components/segmented-control/index.ts new file mode 100644 index 0000000000..07180bc6ac --- /dev/null +++ b/packages/skeleton-svelte/src/components/segmented-control/index.ts @@ -0,0 +1,9 @@ +export { SegmentedControl } from './modules/anatomy'; +export { useSegmentedControl } from './modules/provider.svelte'; +export type { SegmentedControlRootProps } from './anatomy/root.svelte'; +export type { SegmentedControlRootContextProps } from './anatomy/root-context.svelte'; +export type { SegmentedControlRootProviderProps } from './anatomy/root-provider.svelte'; +export type { SegmentedControlIndicatorProps } from './anatomy/indicator.svelte'; +export type { SegmentedControlItemProps } from './anatomy/item.svelte'; +export type { SegmentedControlItemTextProps } from './anatomy/item-text.svelte'; +export type { SegmentedControlItemHiddenInputProps } from './anatomy/item-hidden-input.svelte'; diff --git a/packages/skeleton-svelte/src/components/segmented-control/modules/anatomy.ts b/packages/skeleton-svelte/src/components/segmented-control/modules/anatomy.ts new file mode 100644 index 0000000000..b0a81fde0e --- /dev/null +++ b/packages/skeleton-svelte/src/components/segmented-control/modules/anatomy.ts @@ -0,0 +1,16 @@ +import Indicator from '../anatomy/indicator.svelte'; +import ItemHiddenInput from '../anatomy/item-hidden-input.svelte'; +import ItemText from '../anatomy/item-text.svelte'; +import Item from '../anatomy/item.svelte'; +import RootContext from '../anatomy/root-context.svelte'; +import RootProvider from '../anatomy/root-provider.svelte'; +import Root from '../anatomy/root.svelte'; + +export const SegmentedControl = Object.assign(Root, { + Provider: RootProvider, + Context: RootContext, + Indicator: Indicator, + Item: Item, + ItemText: ItemText, + ItemHiddenInput: ItemHiddenInput, +}); diff --git a/packages/skeleton-svelte/src/components/segmented-control/modules/item-context.ts b/packages/skeleton-svelte/src/components/segmented-control/modules/item-context.ts new file mode 100644 index 0000000000..f31a15bf05 --- /dev/null +++ b/packages/skeleton-svelte/src/components/segmented-control/modules/item-context.ts @@ -0,0 +1,4 @@ +import { createContext } from '@/internal/create-context'; +import type { ItemProps } from '@zag-js/radio-group'; + +export const ItemContext = createContext<() => ItemProps>(); diff --git a/packages/skeleton-svelte/src/components/segmented-control/modules/provider.svelte.ts b/packages/skeleton-svelte/src/components/segmented-control/modules/provider.svelte.ts new file mode 100644 index 0000000000..1747e3b418 --- /dev/null +++ b/packages/skeleton-svelte/src/components/segmented-control/modules/provider.svelte.ts @@ -0,0 +1,12 @@ +import { connect, machine } from '@zag-js/radio-group'; +import type { Api, Props } from '@zag-js/radio-group'; +import { normalizeProps, useMachine, type PropTypes } from '@zag-js/svelte'; + +export function useSegmentedControl(props: Props | (() => Props)): () => Api<PropTypes> { + const service = useMachine(machine, { + orientation: 'horizontal', + ...(typeof props === 'function' ? props() : props), + }); + const segmentedControl = connect(service, normalizeProps); + return () => segmentedControl; +} diff --git a/packages/skeleton-svelte/src/components/segmented-control/modules/root-context.ts b/packages/skeleton-svelte/src/components/segmented-control/modules/root-context.ts new file mode 100644 index 0000000000..16682e6f89 --- /dev/null +++ b/packages/skeleton-svelte/src/components/segmented-control/modules/root-context.ts @@ -0,0 +1,4 @@ +import type { useSegmentedControl } from './provider.svelte'; +import { createContext } from '@/internal/create-context'; + +export const RootContext = createContext<ReturnType<typeof useSegmentedControl>>(); diff --git a/packages/skeleton-svelte/src/components/slider/anatomy/control.svelte b/packages/skeleton-svelte/src/components/slider/anatomy/control.svelte new file mode 100644 index 0000000000..d4402cc712 --- /dev/null +++ b/packages/skeleton-svelte/src/components/slider/anatomy/control.svelte @@ -0,0 +1,36 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface SliderControlProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesSlider } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: SliderControlProps = $props(); + + const slider = RootContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + slider().getControlProps(), + { + class: classesSlider.control, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/slider/anatomy/hidden-input.svelte b/packages/skeleton-svelte/src/components/slider/anatomy/hidden-input.svelte new file mode 100644 index 0000000000..6b8284a578 --- /dev/null +++ b/packages/skeleton-svelte/src/components/slider/anatomy/hidden-input.svelte @@ -0,0 +1,36 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface SliderHiddenInputProps extends PropsWithElement<'input'>, HTMLAttributes<'input', 'children'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { ThumbContext } from '../modules/thumb-context'; + import { classesSlider } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: SliderHiddenInputProps = $props(); + + const slider = RootContext.consume(); + const thumbProps = ThumbContext.consume(); + + const { element, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + slider().getHiddenInputProps(thumbProps()), + { + class: classesSlider.hiddenInput, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <input {...attributes} /> +{/if} diff --git a/packages/skeleton-svelte/src/components/slider/anatomy/label.svelte b/packages/skeleton-svelte/src/components/slider/anatomy/label.svelte new file mode 100644 index 0000000000..792d5bd87c --- /dev/null +++ b/packages/skeleton-svelte/src/components/slider/anatomy/label.svelte @@ -0,0 +1,36 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface SliderLabelProps extends PropsWithElement<'label'>, HTMLAttributes<'label'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesSlider } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: SliderLabelProps = $props(); + + const slider = RootContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + slider().getLabelProps(), + { + class: classesSlider.label, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <label {...attributes}> + {@render children?.()} + </label> +{/if} diff --git a/packages/skeleton-svelte/src/components/slider/anatomy/marker-group.svelte b/packages/skeleton-svelte/src/components/slider/anatomy/marker-group.svelte new file mode 100644 index 0000000000..b513c318dd --- /dev/null +++ b/packages/skeleton-svelte/src/components/slider/anatomy/marker-group.svelte @@ -0,0 +1,36 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface SliderMarkerGroupProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesSlider } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: SliderMarkerGroupProps = $props(); + + const slider = RootContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + slider().getMarkerGroupProps(), + { + class: classesSlider.markerGroup, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/slider/anatomy/marker.svelte b/packages/skeleton-svelte/src/components/slider/anatomy/marker.svelte new file mode 100644 index 0000000000..288e4ef0f0 --- /dev/null +++ b/packages/skeleton-svelte/src/components/slider/anatomy/marker.svelte @@ -0,0 +1,41 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + import type { MarkerProps } from '@zag-js/slider'; + + export interface SliderMarkerProps extends MarkerProps, PropsWithElement<'div'>, HTMLAttributes<'div'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesSlider } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: SliderMarkerProps = $props(); + + const slider = RootContext.consume(); + + const { element, children, value, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + slider().getMarkerProps({ value }), + { + class: classesSlider.marker, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {#if children} + {@render children()} + {:else} + {value} + {/if} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/slider/anatomy/range.svelte b/packages/skeleton-svelte/src/components/slider/anatomy/range.svelte new file mode 100644 index 0000000000..0c94abd66f --- /dev/null +++ b/packages/skeleton-svelte/src/components/slider/anatomy/range.svelte @@ -0,0 +1,36 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface SliderRangeProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesSlider } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: SliderRangeProps = $props(); + + const slider = RootContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + slider().getRangeProps(), + { + class: classesSlider.range, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/slider/anatomy/root-context.svelte b/packages/skeleton-svelte/src/components/slider/anatomy/root-context.svelte new file mode 100644 index 0000000000..5751507335 --- /dev/null +++ b/packages/skeleton-svelte/src/components/slider/anatomy/root-context.svelte @@ -0,0 +1,20 @@ +<script lang="ts" module> + import type { useSlider } from '../modules/provider.svelte'; + import type { Snippet } from 'svelte'; + + export interface SliderRootContextProps { + children: Snippet<[ReturnType<typeof useSlider>]>; + } +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + + const props: SliderRootContextProps = $props(); + + const slider = RootContext.consume(); + + const { children } = $derived(props); +</script> + +{@render children(slider)} diff --git a/packages/skeleton-svelte/src/components/slider/anatomy/root-provider.svelte b/packages/skeleton-svelte/src/components/slider/anatomy/root-provider.svelte new file mode 100644 index 0000000000..ff643fa2a5 --- /dev/null +++ b/packages/skeleton-svelte/src/components/slider/anatomy/root-provider.svelte @@ -0,0 +1,39 @@ +<script lang="ts" module> + import type { useSlider } from '../modules/provider.svelte'; + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface SliderRootProviderProps extends PropsWithElement<'div'>, HTMLAttributes<'div', 'id' | 'dir'> { + value: ReturnType<typeof useSlider>; + } +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesSlider } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: SliderRootProviderProps = $props(); + + const { element, children, value: slider, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + slider().getRootProps(), + { + class: classesSlider.root, + }, + rest, + ), + ); + + RootContext.provide(() => slider()); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/slider/anatomy/root.svelte b/packages/skeleton-svelte/src/components/slider/anatomy/root.svelte new file mode 100644 index 0000000000..10304665eb --- /dev/null +++ b/packages/skeleton-svelte/src/components/slider/anatomy/root.svelte @@ -0,0 +1,49 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + import type { Props } from '@zag-js/slider'; + + export interface SliderRootProps + extends Omit<Props, 'id'>, + PropsWithElement<'div'>, + HTMLAttributes<'div', 'id' | 'dir' | 'aria-label' | 'aria-labelledby'> {} +</script> + +<script lang="ts"> + import { useSlider } from '../modules/provider.svelte'; + import { RootContext } from '../modules/root-context'; + import { classesSlider } from '@skeletonlabs/skeleton-common'; + import { splitProps } from '@zag-js/slider'; + import { mergeProps } from '@zag-js/svelte'; + + const props: SliderRootProps = $props(); + + const [sliderProps, componentProps] = $derived(splitProps(props)); + const { element, children, ...rest } = $derived(componentProps); + + const id = $props.id(); + const slider = useSlider(() => ({ + id: id, + ...sliderProps, + })); + + const attributes = $derived( + mergeProps( + slider().getRootProps(), + { + class: classesSlider.root, + }, + rest, + ), + ); + + RootContext.provide(() => slider()); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/slider/anatomy/thumb.svelte b/packages/skeleton-svelte/src/components/slider/anatomy/thumb.svelte new file mode 100644 index 0000000000..b9178a7386 --- /dev/null +++ b/packages/skeleton-svelte/src/components/slider/anatomy/thumb.svelte @@ -0,0 +1,41 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + import { splitThumbProps, type ThumbProps } from '@zag-js/slider'; + + export interface SliderThumbProps extends ThumbProps, PropsWithElement<'div'>, HTMLAttributes<'div'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { ThumbContext } from '../modules/thumb-context'; + import { classesSlider } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: SliderThumbProps = $props(); + + const slider = RootContext.consume(); + + const [thumbProps, componentProps] = $derived(splitThumbProps(props)); + const { element, children, ...rest } = $derived(componentProps); + + const attributes = $derived( + mergeProps( + slider().getThumbProps(thumbProps), + { + class: classesSlider.thumb, + }, + rest, + ), + ); + + ThumbContext.provide(() => thumbProps); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/slider/anatomy/track.svelte b/packages/skeleton-svelte/src/components/slider/anatomy/track.svelte new file mode 100644 index 0000000000..b2b14d6cad --- /dev/null +++ b/packages/skeleton-svelte/src/components/slider/anatomy/track.svelte @@ -0,0 +1,36 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface SliderTrackProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesSlider } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: SliderTrackProps = $props(); + + const slider = RootContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + slider().getTrackProps(), + { + class: classesSlider.track, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/slider/anatomy/value-text.svelte b/packages/skeleton-svelte/src/components/slider/anatomy/value-text.svelte new file mode 100644 index 0000000000..3396b33dac --- /dev/null +++ b/packages/skeleton-svelte/src/components/slider/anatomy/value-text.svelte @@ -0,0 +1,36 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface SliderValueTextProps extends PropsWithElement<'output'>, HTMLAttributes<'output'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesSlider } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: SliderValueTextProps = $props(); + + const slider = RootContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + slider().getValueTextProps(), + { + class: classesSlider.valueText, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <output {...attributes}> + {@render children?.()} + </output> +{/if} diff --git a/packages/skeleton-svelte/src/components/slider/index.ts b/packages/skeleton-svelte/src/components/slider/index.ts new file mode 100644 index 0000000000..70e0644212 --- /dev/null +++ b/packages/skeleton-svelte/src/components/slider/index.ts @@ -0,0 +1,14 @@ +export { Slider } from './modules/anatomy'; +export { useSlider } from './modules/provider.svelte'; +export type { SliderRootProps } from './anatomy/root.svelte'; +export type { SliderRootProviderProps } from './anatomy/root-provider.svelte'; +export type { SliderRootContextProps } from './anatomy/root-context.svelte'; +export type { SliderTrackProps } from './anatomy/track.svelte'; +export type { SliderThumbProps } from './anatomy/thumb.svelte'; +export type { SliderHiddenInputProps } from './anatomy/hidden-input.svelte'; +export type { SliderRangeProps } from './anatomy/range.svelte'; +export type { SliderLabelProps } from './anatomy/label.svelte'; +export type { SliderValueTextProps } from './anatomy/value-text.svelte'; +export type { SliderControlProps } from './anatomy/control.svelte'; +export type { SliderMarkerGroupProps } from './anatomy/marker-group.svelte'; +export type { SliderMarkerProps } from './anatomy/marker.svelte'; diff --git a/packages/skeleton-svelte/src/components/slider/modules/anatomy.ts b/packages/skeleton-svelte/src/components/slider/modules/anatomy.ts new file mode 100644 index 0000000000..1cab54ff6a --- /dev/null +++ b/packages/skeleton-svelte/src/components/slider/modules/anatomy.ts @@ -0,0 +1,26 @@ +import Control from '../anatomy/control.svelte'; +import HiddenInput from '../anatomy/hidden-input.svelte'; +import Label from '../anatomy/label.svelte'; +import MarkerGroup from '../anatomy/marker-group.svelte'; +import Marker from '../anatomy/marker.svelte'; +import Range from '../anatomy/range.svelte'; +import RootContext from '../anatomy/root-context.svelte'; +import RootProvider from '../anatomy/root-provider.svelte'; +import Root from '../anatomy/root.svelte'; +import Thumb from '../anatomy/thumb.svelte'; +import Track from '../anatomy/track.svelte'; +import ValueText from '../anatomy/value-text.svelte'; + +export const Slider = Object.assign(Root, { + Provider: RootProvider, + Context: RootContext, + Label: Label, + ValueText: ValueText, + Control: Control, + Track: Track, + Range: Range, + Thumb: Thumb, + HiddenInput: HiddenInput, + MarkerGroup: MarkerGroup, + Marker: Marker, +}); diff --git a/packages/skeleton-svelte/src/components/slider/modules/provider.svelte.ts b/packages/skeleton-svelte/src/components/slider/modules/provider.svelte.ts new file mode 100644 index 0000000000..ed2d13ee28 --- /dev/null +++ b/packages/skeleton-svelte/src/components/slider/modules/provider.svelte.ts @@ -0,0 +1,9 @@ +import { connect, machine } from '@zag-js/slider'; +import type { Api, Props } from '@zag-js/slider'; +import { normalizeProps, useMachine, type PropTypes } from '@zag-js/svelte'; + +export function useSlider(props: Props | (() => Props)): () => Api<PropTypes> { + const service = useMachine(machine, props); + const slider = $derived(connect(service, normalizeProps)); + return () => slider; +} diff --git a/packages/skeleton-svelte/src/components/slider/modules/root-context.ts b/packages/skeleton-svelte/src/components/slider/modules/root-context.ts new file mode 100644 index 0000000000..19ce8972c1 --- /dev/null +++ b/packages/skeleton-svelte/src/components/slider/modules/root-context.ts @@ -0,0 +1,4 @@ +import type { useSlider } from './provider.svelte'; +import { createContext } from '@/internal/create-context'; + +export const RootContext = createContext<ReturnType<typeof useSlider>>(); diff --git a/packages/skeleton-svelte/src/components/slider/modules/thumb-context.ts b/packages/skeleton-svelte/src/components/slider/modules/thumb-context.ts new file mode 100644 index 0000000000..d51c3408c9 --- /dev/null +++ b/packages/skeleton-svelte/src/components/slider/modules/thumb-context.ts @@ -0,0 +1,4 @@ +import { createContext } from '@/internal/create-context'; +import type { ThumbProps } from '@zag-js/slider'; + +export const ThumbContext = createContext<() => ThumbProps>(); diff --git a/packages/skeleton-svelte/src/components/switch/anatomy/control.svelte b/packages/skeleton-svelte/src/components/switch/anatomy/control.svelte new file mode 100644 index 0000000000..2044570e66 --- /dev/null +++ b/packages/skeleton-svelte/src/components/switch/anatomy/control.svelte @@ -0,0 +1,36 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface SwitchControlProps extends PropsWithElement<'span'>, HTMLAttributes<'span'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesSwitch } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: SwitchControlProps = $props(); + + const switch_ = RootContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + switch_().getControlProps(), + { + class: classesSwitch.control, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <span {...attributes}> + {@render children?.()} + </span> +{/if} diff --git a/packages/skeleton-svelte/src/components/switch/anatomy/hidden-input.svelte b/packages/skeleton-svelte/src/components/switch/anatomy/hidden-input.svelte new file mode 100644 index 0000000000..58b162c529 --- /dev/null +++ b/packages/skeleton-svelte/src/components/switch/anatomy/hidden-input.svelte @@ -0,0 +1,34 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface SwitchHiddenInputProps extends PropsWithElement<'input'>, HTMLAttributes<'input', 'children'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesSwitch } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: SwitchHiddenInputProps = $props(); + + const switch_ = RootContext.consume(); + + const { element, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + switch_().getHiddenInputProps(), + { + class: classesSwitch.hiddenInput, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <input {...attributes} /> +{/if} diff --git a/packages/skeleton-svelte/src/components/switch/anatomy/label.svelte b/packages/skeleton-svelte/src/components/switch/anatomy/label.svelte new file mode 100644 index 0000000000..c104499d37 --- /dev/null +++ b/packages/skeleton-svelte/src/components/switch/anatomy/label.svelte @@ -0,0 +1,36 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface SwitchLabelProps extends PropsWithElement<'span'>, HTMLAttributes<'span'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesSwitch } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: SwitchLabelProps = $props(); + + const switch_ = RootContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + switch_().getLabelProps(), + { + class: classesSwitch.label, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <span {...attributes}> + {@render children?.()} + </span> +{/if} diff --git a/packages/skeleton-svelte/src/components/switch/anatomy/root-context.svelte b/packages/skeleton-svelte/src/components/switch/anatomy/root-context.svelte new file mode 100644 index 0000000000..d634ac2a04 --- /dev/null +++ b/packages/skeleton-svelte/src/components/switch/anatomy/root-context.svelte @@ -0,0 +1,20 @@ +<script lang="ts" module> + import type { useSwitch } from '../modules/provider.svelte'; + import type { Snippet } from 'svelte'; + + export interface SwitchRootContextProps { + children: Snippet<[ReturnType<typeof useSwitch>]>; + } +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + + const props: SwitchRootContextProps = $props(); + + const switch_ = RootContext.consume(); + + const { children } = $derived(props); +</script> + +{@render children(switch_)} diff --git a/packages/skeleton-svelte/src/components/switch/anatomy/root-provider.svelte b/packages/skeleton-svelte/src/components/switch/anatomy/root-provider.svelte new file mode 100644 index 0000000000..b4dd1d7385 --- /dev/null +++ b/packages/skeleton-svelte/src/components/switch/anatomy/root-provider.svelte @@ -0,0 +1,39 @@ +<script lang="ts" module> + import type { useSwitch } from '../modules/provider.svelte'; + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface SwitchRootProviderProps extends PropsWithElement<'label'>, HTMLAttributes<'label', 'id' | 'dir' | 'form'> { + value: ReturnType<typeof useSwitch>; + } +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesSwitch } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: SwitchRootProviderProps = $props(); + + const { element, children, value: switch_, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + switch_().getRootProps(), + { + class: classesSwitch.root, + }, + rest, + ), + ); + + RootContext.provide(() => switch_()); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <label {...attributes}> + {@render children?.()} + </label> +{/if} diff --git a/packages/skeleton-svelte/src/components/switch/anatomy/root.svelte b/packages/skeleton-svelte/src/components/switch/anatomy/root.svelte new file mode 100644 index 0000000000..2c49b2e202 --- /dev/null +++ b/packages/skeleton-svelte/src/components/switch/anatomy/root.svelte @@ -0,0 +1,46 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + import type { Props } from '@zag-js/switch'; + + export interface SwitchRootProps extends Omit<Props, 'id'>, PropsWithElement<'label'>, HTMLAttributes<'label', 'id' | 'dir' | 'form'> {} +</script> + +<script lang="ts"> + import { useSwitch } from '../modules/provider.svelte'; + import { RootContext } from '../modules/root-context'; + import { classesSwitch } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + import { splitProps } from '@zag-js/switch'; + + const props: SwitchRootProps = $props(); + + const [switchProps, componentProps] = $derived(splitProps(props)); + const { element, children, ...rest } = $derived(componentProps); + + const id = $props.id(); + const switch_ = useSwitch(() => ({ + id: id, + ...switchProps, + })); + + const attributes = $derived( + mergeProps( + switch_().getRootProps(), + { + class: classesSwitch.root, + }, + rest, + ), + ); + + RootContext.provide(() => switch_()); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <label {...attributes}> + {@render children?.()} + </label> +{/if} diff --git a/packages/skeleton-svelte/src/components/switch/anatomy/thumb.svelte b/packages/skeleton-svelte/src/components/switch/anatomy/thumb.svelte new file mode 100644 index 0000000000..57ce647344 --- /dev/null +++ b/packages/skeleton-svelte/src/components/switch/anatomy/thumb.svelte @@ -0,0 +1,36 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface SwitchThumbProps extends PropsWithElement<'span'>, HTMLAttributes<'span'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesSwitch } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: SwitchThumbProps = $props(); + + const switch_ = RootContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + switch_().getThumbProps(), + { + class: classesSwitch.thumb, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <span {...attributes}> + {@render children?.()} + </span> +{/if} diff --git a/packages/skeleton-svelte/src/components/switch/index.ts b/packages/skeleton-svelte/src/components/switch/index.ts new file mode 100644 index 0000000000..8eadb4b7dc --- /dev/null +++ b/packages/skeleton-svelte/src/components/switch/index.ts @@ -0,0 +1,9 @@ +export type { SwitchControlProps } from './anatomy/control.svelte'; +export type { SwitchHiddenInputProps } from './anatomy/hidden-input.svelte'; +export type { SwitchLabelProps } from './anatomy/label.svelte'; +export type { SwitchRootProps } from './anatomy/root.svelte'; +export type { SwitchRootContextProps } from './anatomy/root-context.svelte'; +export type { SwitchRootProviderProps } from './anatomy/root-provider.svelte'; +export type { SwitchThumbProps } from './anatomy/thumb.svelte'; +export { Switch } from './modules/anatomy'; +export { useSwitch } from './modules/provider.svelte'; diff --git a/packages/skeleton-svelte/src/components/switch/modules/anatomy.ts b/packages/skeleton-svelte/src/components/switch/modules/anatomy.ts new file mode 100644 index 0000000000..efed80c27a --- /dev/null +++ b/packages/skeleton-svelte/src/components/switch/modules/anatomy.ts @@ -0,0 +1,16 @@ +import Control from '../anatomy/control.svelte'; +import HiddenInput from '../anatomy/hidden-input.svelte'; +import Label from '../anatomy/label.svelte'; +import RootContext from '../anatomy/root-context.svelte'; +import RootProvider from '../anatomy/root-provider.svelte'; +import Root from '../anatomy/root.svelte'; +import Thumb from '../anatomy/thumb.svelte'; + +export const Switch = Object.assign(Root, { + Provider: RootProvider, + Context: RootContext, + Control: Control, + Thumb: Thumb, + Label: Label, + HiddenInput: HiddenInput, +}); diff --git a/packages/skeleton-svelte/src/components/switch/modules/provider.svelte.ts b/packages/skeleton-svelte/src/components/switch/modules/provider.svelte.ts new file mode 100644 index 0000000000..9aef692201 --- /dev/null +++ b/packages/skeleton-svelte/src/components/switch/modules/provider.svelte.ts @@ -0,0 +1,9 @@ +import { normalizeProps, useMachine, type PropTypes } from '@zag-js/svelte'; +import { connect, machine } from '@zag-js/switch'; +import type { Api, Props } from '@zag-js/switch'; + +export function useSwitch(props: Props | (() => Props)): () => Api<PropTypes> { + const service = useMachine(machine, props); + const switch_ = $derived(connect(service, normalizeProps)); + return () => switch_; +} diff --git a/packages/skeleton-svelte/src/components/switch/modules/root-context.ts b/packages/skeleton-svelte/src/components/switch/modules/root-context.ts new file mode 100644 index 0000000000..8d38515992 --- /dev/null +++ b/packages/skeleton-svelte/src/components/switch/modules/root-context.ts @@ -0,0 +1,4 @@ +import type { useSwitch } from './provider.svelte'; +import { createContext } from '@/internal/create-context'; + +export const RootContext = createContext<ReturnType<typeof useSwitch>>(); diff --git a/packages/skeleton-svelte/src/components/tabs/anatomy/content.svelte b/packages/skeleton-svelte/src/components/tabs/anatomy/content.svelte new file mode 100644 index 0000000000..fb4e530641 --- /dev/null +++ b/packages/skeleton-svelte/src/components/tabs/anatomy/content.svelte @@ -0,0 +1,39 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + import type { ContentProps } from '@zag-js/tabs'; + + export interface TabsContentProps extends ContentProps, PropsWithElement<'div'>, HTMLAttributes<'div'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesTabs } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + import { splitContentProps } from '@zag-js/tabs'; + + const props: TabsContentProps = $props(); + + const tabs = RootContext.consume(); + + const [contentProps, componentProps] = $derived(splitContentProps(props)); + const { element, children, ...rest } = $derived(componentProps); + + const attributes = $derived( + mergeProps( + tabs().getContentProps(contentProps), + { + class: classesTabs.content, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/tabs/anatomy/indicator.svelte b/packages/skeleton-svelte/src/components/tabs/anatomy/indicator.svelte new file mode 100644 index 0000000000..96940f38d9 --- /dev/null +++ b/packages/skeleton-svelte/src/components/tabs/anatomy/indicator.svelte @@ -0,0 +1,34 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface TabsIndicatorProps extends PropsWithElement<'div'>, HTMLAttributes<'div', 'children'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesTabs } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: TabsIndicatorProps = $props(); + + const tabs = RootContext.consume(); + + const { element, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + tabs().getIndicatorProps(), + { + class: classesTabs.indicator, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}></div> +{/if} diff --git a/packages/skeleton-svelte/src/components/tabs/anatomy/list.svelte b/packages/skeleton-svelte/src/components/tabs/anatomy/list.svelte new file mode 100644 index 0000000000..3465eb506b --- /dev/null +++ b/packages/skeleton-svelte/src/components/tabs/anatomy/list.svelte @@ -0,0 +1,36 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface TabsListProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesTabs } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: TabsListProps = $props(); + + const tabs = RootContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + tabs().getListProps(), + { + class: classesTabs.list, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/tabs/anatomy/root-context.svelte b/packages/skeleton-svelte/src/components/tabs/anatomy/root-context.svelte new file mode 100644 index 0000000000..f64bbcfff4 --- /dev/null +++ b/packages/skeleton-svelte/src/components/tabs/anatomy/root-context.svelte @@ -0,0 +1,20 @@ +<script lang="ts" module> + import type { useTabs } from '../modules/provider.svelte'; + import type { Snippet } from 'svelte'; + + export interface TabsRootContextProps { + children: Snippet<[ReturnType<typeof useTabs>]>; + } +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + + const props: TabsRootContextProps = $props(); + + const tabs = RootContext.consume(); + + const { children } = $derived(props); +</script> + +{@render children(tabs)} diff --git a/packages/skeleton-svelte/src/components/tabs/anatomy/root-provider.svelte b/packages/skeleton-svelte/src/components/tabs/anatomy/root-provider.svelte new file mode 100644 index 0000000000..b2caa1f971 --- /dev/null +++ b/packages/skeleton-svelte/src/components/tabs/anatomy/root-provider.svelte @@ -0,0 +1,38 @@ +<script lang="ts" module> + import type { useTabs } from '../modules/provider.svelte'; + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface TabsRootProviderProps extends PropsWithElement<'div'>, HTMLAttributes<'div', 'id' | 'dir'> { + value: ReturnType<typeof useTabs>; + } +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesTabs } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: TabsRootProviderProps = $props(); + const { element, children, value: tabs, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + tabs().getRootProps(), + { + class: classesTabs.root, + }, + rest, + ), + ); + + RootContext.provide(() => tabs()); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/tabs/anatomy/root.svelte b/packages/skeleton-svelte/src/components/tabs/anatomy/root.svelte new file mode 100644 index 0000000000..cfbfa469bb --- /dev/null +++ b/packages/skeleton-svelte/src/components/tabs/anatomy/root.svelte @@ -0,0 +1,45 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + import type { Props } from '@zag-js/tabs'; + + export interface TabsRootProps extends Omit<Props, 'id'>, PropsWithElement<'div'>, HTMLAttributes<'div', 'id' | 'dir'> {} +</script> + +<script lang="ts"> + import { useTabs } from '../modules/provider.svelte'; + import { RootContext } from '../modules/root-context'; + import { classesTabs } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + import { splitProps } from '@zag-js/tabs'; + + const props: TabsRootProps = $props(); + const [tabsProps, componentProps] = $derived(splitProps(props)); + const { element, children, ...rest } = $derived(componentProps); + + const id = $props.id(); + const tabs = useTabs(() => ({ + id: id, + ...tabsProps, + })); + + const attributes = $derived( + mergeProps( + tabs().getRootProps(), + { + class: classesTabs.root, + }, + rest, + ), + ); + + RootContext.provide(() => tabs()); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/tabs/anatomy/trigger.svelte b/packages/skeleton-svelte/src/components/tabs/anatomy/trigger.svelte new file mode 100644 index 0000000000..1d3be97a1d --- /dev/null +++ b/packages/skeleton-svelte/src/components/tabs/anatomy/trigger.svelte @@ -0,0 +1,39 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + import type { TriggerProps } from '@zag-js/tabs'; + + export interface TabsTriggerProps extends TriggerProps, PropsWithElement<'button'>, HTMLAttributes<'button', 'value' | 'disabled'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesTabs } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + import { splitTriggerProps } from '@zag-js/tabs'; + + const props: TabsTriggerProps = $props(); + + const tabs = RootContext.consume(); + + const [triggerProps, componentProps] = $derived(splitTriggerProps(props)); + const { element, children, ...rest } = $derived(componentProps); + + const attributes = $derived( + mergeProps( + tabs().getTriggerProps(triggerProps), + { + class: classesTabs.trigger, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <button {...attributes}> + {@render children?.()} + </button> +{/if} diff --git a/packages/skeleton-svelte/src/components/tabs/index.ts b/packages/skeleton-svelte/src/components/tabs/index.ts new file mode 100644 index 0000000000..bb6e0bcda2 --- /dev/null +++ b/packages/skeleton-svelte/src/components/tabs/index.ts @@ -0,0 +1,9 @@ +export type { TabsContentProps } from './anatomy/content.svelte'; +export type { TabsIndicatorProps } from './anatomy/indicator.svelte'; +export type { TabsListProps } from './anatomy/list.svelte'; +export type { TabsRootProps } from './anatomy/root.svelte'; +export type { TabsRootContextProps } from './anatomy/root-context.svelte'; +export type { TabsRootProviderProps } from './anatomy/root-provider.svelte'; +export type { TabsTriggerProps } from './anatomy/trigger.svelte'; +export { Tabs } from './modules/anatomy'; +export { useTabs } from './modules/provider.svelte'; diff --git a/packages/skeleton-svelte/src/components/tabs/modules/anatomy.ts b/packages/skeleton-svelte/src/components/tabs/modules/anatomy.ts new file mode 100644 index 0000000000..485d92233d --- /dev/null +++ b/packages/skeleton-svelte/src/components/tabs/modules/anatomy.ts @@ -0,0 +1,16 @@ +import Content from '../anatomy/content.svelte'; +import Indicator from '../anatomy/indicator.svelte'; +import List from '../anatomy/list.svelte'; +import RootContext from '../anatomy/root-context.svelte'; +import RootProvider from '../anatomy/root-provider.svelte'; +import Root from '../anatomy/root.svelte'; +import Trigger from '../anatomy/trigger.svelte'; + +export const Tabs = Object.assign(Root, { + Provider: RootProvider, + Context: RootContext, + List: List, + Trigger: Trigger, + Indicator: Indicator, + Content: Content, +}); diff --git a/packages/skeleton-svelte/src/components/tabs/modules/provider.svelte.ts b/packages/skeleton-svelte/src/components/tabs/modules/provider.svelte.ts new file mode 100644 index 0000000000..674cbaaf0e --- /dev/null +++ b/packages/skeleton-svelte/src/components/tabs/modules/provider.svelte.ts @@ -0,0 +1,9 @@ +import { normalizeProps, useMachine, type PropTypes } from '@zag-js/svelte'; +import { connect, machine } from '@zag-js/tabs'; +import type { Api, Props } from '@zag-js/tabs'; + +export function useTabs(props: Props | (() => Props)): () => Api<PropTypes> { + const service = useMachine(machine, props); + const tabs = $derived(connect(service, normalizeProps)); + return () => tabs; +} diff --git a/packages/skeleton-svelte/src/components/tabs/modules/root-context.ts b/packages/skeleton-svelte/src/components/tabs/modules/root-context.ts new file mode 100644 index 0000000000..62ba0242b4 --- /dev/null +++ b/packages/skeleton-svelte/src/components/tabs/modules/root-context.ts @@ -0,0 +1,4 @@ +import type { useTabs } from './provider.svelte'; +import { createContext } from '@/internal/create-context'; + +export const RootContext = createContext<ReturnType<typeof useTabs>>(); diff --git a/packages/skeleton-svelte/src/components/tags-input/anatomy/clear-trigger.svelte b/packages/skeleton-svelte/src/components/tags-input/anatomy/clear-trigger.svelte new file mode 100644 index 0000000000..2d4e91c50d --- /dev/null +++ b/packages/skeleton-svelte/src/components/tags-input/anatomy/clear-trigger.svelte @@ -0,0 +1,36 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface TagsInputClearTriggerProps extends PropsWithElement<'button'>, HTMLAttributes<'button'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesTagsInput } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: TagsInputClearTriggerProps = $props(); + + const tagsInput = RootContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + tagsInput().getClearTriggerProps(), + { + class: classesTagsInput.clearTrigger, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <button {...attributes}> + {@render children?.()} + </button> +{/if} diff --git a/packages/skeleton-svelte/src/components/tags-input/anatomy/control.svelte b/packages/skeleton-svelte/src/components/tags-input/anatomy/control.svelte new file mode 100644 index 0000000000..ffaf9bf719 --- /dev/null +++ b/packages/skeleton-svelte/src/components/tags-input/anatomy/control.svelte @@ -0,0 +1,36 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface TagsInputControlProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesTagsInput } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: TagsInputControlProps = $props(); + + const tagsInput = RootContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + tagsInput().getControlProps(), + { + class: classesTagsInput.control, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/tags-input/anatomy/hidden-input.svelte b/packages/skeleton-svelte/src/components/tags-input/anatomy/hidden-input.svelte new file mode 100644 index 0000000000..ce0165f9bc --- /dev/null +++ b/packages/skeleton-svelte/src/components/tags-input/anatomy/hidden-input.svelte @@ -0,0 +1,34 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface TagsInputHiddenInputProps extends PropsWithElement<'input'>, HTMLAttributes<'input', 'children'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesTagsInput } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: TagsInputHiddenInputProps = $props(); + + const tagsInput = RootContext.consume(); + + const { element, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + tagsInput().getHiddenInputProps(), + { + class: classesTagsInput.hiddenInput, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <input {...attributes} /> +{/if} diff --git a/packages/skeleton-svelte/src/components/tags-input/anatomy/input.svelte b/packages/skeleton-svelte/src/components/tags-input/anatomy/input.svelte new file mode 100644 index 0000000000..bd680eb5e7 --- /dev/null +++ b/packages/skeleton-svelte/src/components/tags-input/anatomy/input.svelte @@ -0,0 +1,34 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface TagsInputInputProps extends PropsWithElement<'input'>, HTMLAttributes<'input', 'children'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesTagsInput } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: TagsInputInputProps = $props(); + + const tagsInput = RootContext.consume(); + + const { element, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + tagsInput().getInputProps(), + { + class: classesTagsInput.input, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <input {...attributes} /> +{/if} diff --git a/packages/skeleton-svelte/src/components/tags-input/anatomy/item-delete-trigger.svelte b/packages/skeleton-svelte/src/components/tags-input/anatomy/item-delete-trigger.svelte new file mode 100644 index 0000000000..55f73f41dd --- /dev/null +++ b/packages/skeleton-svelte/src/components/tags-input/anatomy/item-delete-trigger.svelte @@ -0,0 +1,42 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface TagsInputItemDeleteTriggerProps extends PropsWithElement<'button'>, HTMLAttributes<'button'> {} +</script> + +<script lang="ts"> + import { ItemContext } from '../modules/item-context'; + import { RootContext } from '../modules/root-context'; + import { classesTagsInput } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: TagsInputItemDeleteTriggerProps = $props(); + + const tagsInput = RootContext.consume(); + const itemProps = ItemContext.consume(); + + const { element, children = times, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + tagsInput().getItemDeleteTriggerProps(itemProps()), + { + class: classesTagsInput.itemDeleteTrigger, + }, + rest, + ), + ); +</script> + +{#snippet times()} + × +{/snippet} + +{#if element} + {@render element(attributes)} +{:else} + <button {...attributes}> + {@render children()} + </button> +{/if} diff --git a/packages/skeleton-svelte/src/components/tags-input/anatomy/item-input.svelte b/packages/skeleton-svelte/src/components/tags-input/anatomy/item-input.svelte new file mode 100644 index 0000000000..da1d5ea362 --- /dev/null +++ b/packages/skeleton-svelte/src/components/tags-input/anatomy/item-input.svelte @@ -0,0 +1,36 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface TagsInputItemInputProps extends PropsWithElement<'input'>, HTMLAttributes<'input', 'children'> {} +</script> + +<script lang="ts"> + import { ItemContext } from '../modules/item-context'; + import { RootContext } from '../modules/root-context'; + import { classesTagsInput } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: TagsInputItemInputProps = $props(); + + const tagsInput = RootContext.consume(); + const itemProps = ItemContext.consume(); + + const { element, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + tagsInput().getItemInputProps(itemProps()), + { + class: classesTagsInput.itemInput, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <input {...attributes} /> +{/if} diff --git a/packages/skeleton-svelte/src/components/tags-input/anatomy/item-preview.svelte b/packages/skeleton-svelte/src/components/tags-input/anatomy/item-preview.svelte new file mode 100644 index 0000000000..f615d7bf52 --- /dev/null +++ b/packages/skeleton-svelte/src/components/tags-input/anatomy/item-preview.svelte @@ -0,0 +1,38 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface TagsInputItemPreviewProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} +</script> + +<script lang="ts"> + import { ItemContext } from '../modules/item-context'; + import { RootContext } from '../modules/root-context'; + import { classesTagsInput } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: TagsInputItemPreviewProps = $props(); + + const tagsInput = RootContext.consume(); + const itemProps = ItemContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + tagsInput().getItemPreviewProps(itemProps()), + { + class: classesTagsInput.itemPreview, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/tags-input/anatomy/item-text.svelte b/packages/skeleton-svelte/src/components/tags-input/anatomy/item-text.svelte new file mode 100644 index 0000000000..64f7ec777d --- /dev/null +++ b/packages/skeleton-svelte/src/components/tags-input/anatomy/item-text.svelte @@ -0,0 +1,38 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface TagsInputItemTextProps extends PropsWithElement<'span'>, HTMLAttributes<'span'> {} +</script> + +<script lang="ts"> + import { ItemContext } from '../modules/item-context'; + import { RootContext } from '../modules/root-context'; + import { classesTagsInput } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: TagsInputItemTextProps = $props(); + + const tagsInput = RootContext.consume(); + const itemProps = ItemContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + tagsInput().getItemTextProps(itemProps()), + { + class: classesTagsInput.itemText, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <span {...attributes}> + {@render children?.()} + </span> +{/if} diff --git a/packages/skeleton-svelte/src/components/tags-input/anatomy/item.svelte b/packages/skeleton-svelte/src/components/tags-input/anatomy/item.svelte new file mode 100644 index 0000000000..b4c1843cf9 --- /dev/null +++ b/packages/skeleton-svelte/src/components/tags-input/anatomy/item.svelte @@ -0,0 +1,42 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + import type { ItemProps } from '@zag-js/tags-input'; + + export interface TagsInputItemProps extends ItemProps, PropsWithElement<'span'>, HTMLAttributes<'span'> {} +</script> + +<script lang="ts"> + import { ItemContext } from '../modules/item-context'; + import { RootContext } from '../modules/root-context'; + import { classesTagsInput } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + import { splitItemProps } from '@zag-js/tags-input'; + + const props: TagsInputItemProps = $props(); + + const tagsInput = RootContext.consume(); + + const [itemProps, componentProps] = $derived(splitItemProps(props)); + const { element, children, ...rest } = $derived(componentProps); + + const attributes = $derived( + mergeProps( + tagsInput().getItemProps(itemProps), + { + class: classesTagsInput.item, + }, + rest, + ), + ); + + ItemContext.provide(() => itemProps); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <span {...attributes}> + {@render children?.()} + </span> +{/if} diff --git a/packages/skeleton-svelte/src/components/tags-input/anatomy/label.svelte b/packages/skeleton-svelte/src/components/tags-input/anatomy/label.svelte new file mode 100644 index 0000000000..cb2a15111c --- /dev/null +++ b/packages/skeleton-svelte/src/components/tags-input/anatomy/label.svelte @@ -0,0 +1,36 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface TagsInputLabelProps extends PropsWithElement<'label'>, HTMLAttributes<'label'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesTagsInput } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: TagsInputLabelProps = $props(); + + const tagsInput = RootContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + tagsInput().getLabelProps(), + { + class: classesTagsInput.label, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <label {...attributes}> + {@render children?.()} + </label> +{/if} diff --git a/packages/skeleton-svelte/src/components/tags-input/anatomy/root-context.svelte b/packages/skeleton-svelte/src/components/tags-input/anatomy/root-context.svelte new file mode 100644 index 0000000000..5317cad438 --- /dev/null +++ b/packages/skeleton-svelte/src/components/tags-input/anatomy/root-context.svelte @@ -0,0 +1,20 @@ +<script lang="ts" module> + import type { useTagsInput } from '../modules/provider.svelte'; + import type { Snippet } from 'svelte'; + + export interface TagsInputRootContextProps { + children: Snippet<[ReturnType<typeof useTagsInput>]>; + } +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + + const props: TagsInputRootContextProps = $props(); + + const tagsInput = RootContext.consume(); + + const { children } = $derived(props); +</script> + +{@render children(tagsInput)} diff --git a/packages/skeleton-svelte/src/components/tags-input/anatomy/root-provider.svelte b/packages/skeleton-svelte/src/components/tags-input/anatomy/root-provider.svelte new file mode 100644 index 0000000000..8c65b76246 --- /dev/null +++ b/packages/skeleton-svelte/src/components/tags-input/anatomy/root-provider.svelte @@ -0,0 +1,38 @@ +<script lang="ts" module> + import type { useTagsInput } from '../modules/provider.svelte'; + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface TagsInputRootProviderProps extends PropsWithElement<'div'>, HTMLAttributes<'div', 'id' | 'dir'> { + value: ReturnType<typeof useTagsInput>; + } +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesTagsInput } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: TagsInputRootProviderProps = $props(); + const { element, children, value: tagsInput, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + tagsInput().getRootProps(), + { + class: classesTagsInput.root, + }, + rest, + ), + ); + + RootContext.provide(() => tagsInput()); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/tags-input/anatomy/root.svelte b/packages/skeleton-svelte/src/components/tags-input/anatomy/root.svelte new file mode 100644 index 0000000000..b8d0477d09 --- /dev/null +++ b/packages/skeleton-svelte/src/components/tags-input/anatomy/root.svelte @@ -0,0 +1,45 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + import type { Props } from '@zag-js/tags-input'; + + export interface TagsInputRootProps extends Omit<Props, 'id'>, PropsWithElement<'div'>, HTMLAttributes<'div', 'id' | 'dir'> {} +</script> + +<script lang="ts"> + import { useTagsInput } from '../modules/provider.svelte'; + import { RootContext } from '../modules/root-context'; + import { classesTagsInput } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + import { splitProps } from '@zag-js/tags-input'; + + const props: TagsInputRootProps = $props(); + const [tagsInputProps, componentProps] = $derived(splitProps(props)); + const { element, children, ...rest } = $derived(componentProps); + + const id = $props.id(); + const tagsInput = useTagsInput(() => ({ + id: id, + ...tagsInputProps, + })); + + const attributes = $derived( + mergeProps( + tagsInput().getRootProps(), + { + class: classesTagsInput.root, + }, + rest, + ), + ); + + RootContext.provide(() => tagsInput()); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/tags-input/index.ts b/packages/skeleton-svelte/src/components/tags-input/index.ts new file mode 100644 index 0000000000..2b4fca5d66 --- /dev/null +++ b/packages/skeleton-svelte/src/components/tags-input/index.ts @@ -0,0 +1,15 @@ +export type { TagsInputClearTriggerProps } from './anatomy/clear-trigger.svelte'; +export type { TagsInputControlProps } from './anatomy/control.svelte'; +export type { TagsInputHiddenInputProps } from './anatomy/hidden-input.svelte'; +export type { TagsInputInputProps } from './anatomy/input.svelte'; +export type { TagsInputItemProps } from './anatomy/item.svelte'; +export type { TagsInputItemDeleteTriggerProps } from './anatomy/item-delete-trigger.svelte'; +export type { TagsInputItemInputProps } from './anatomy/item-input.svelte'; +export type { TagsInputItemPreviewProps } from './anatomy/item-preview.svelte'; +export type { TagsInputItemTextProps } from './anatomy/item-text.svelte'; +export type { TagsInputLabelProps } from './anatomy/label.svelte'; +export type { TagsInputRootProps } from './anatomy/root.svelte'; +export type { TagsInputRootContextProps } from './anatomy/root-context.svelte'; +export type { TagsInputRootProviderProps } from './anatomy/root-provider.svelte'; +export { TagsInput } from './modules/anatomy'; +export { useTagsInput } from './modules/provider.svelte'; diff --git a/packages/skeleton-svelte/src/components/tags-input/modules/anatomy.ts b/packages/skeleton-svelte/src/components/tags-input/modules/anatomy.ts new file mode 100644 index 0000000000..e4a52caef0 --- /dev/null +++ b/packages/skeleton-svelte/src/components/tags-input/modules/anatomy.ts @@ -0,0 +1,28 @@ +import ClearTrigger from '../anatomy/clear-trigger.svelte'; +import Control from '../anatomy/control.svelte'; +import HiddenInput from '../anatomy/hidden-input.svelte'; +import Input from '../anatomy/input.svelte'; +import ItemDeleteTrigger from '../anatomy/item-delete-trigger.svelte'; +import ItemInput from '../anatomy/item-input.svelte'; +import ItemPreview from '../anatomy/item-preview.svelte'; +import ItemText from '../anatomy/item-text.svelte'; +import Item from '../anatomy/item.svelte'; +import Label from '../anatomy/label.svelte'; +import RootContext from '../anatomy/root-context.svelte'; +import RootProvider from '../anatomy/root-provider.svelte'; +import Root from '../anatomy/root.svelte'; + +export const TagsInput = Object.assign(Root, { + Provider: RootProvider, + Context: RootContext, + Label: Label, + Control: Control, + Item: Item, + ItemPreview: ItemPreview, + ItemText: ItemText, + ItemDeleteTrigger: ItemDeleteTrigger, + ItemInput: ItemInput, + Input: Input, + ClearTrigger: ClearTrigger, + HiddenInput: HiddenInput, +}); diff --git a/packages/skeleton-svelte/src/components/tags-input/modules/item-context.ts b/packages/skeleton-svelte/src/components/tags-input/modules/item-context.ts new file mode 100644 index 0000000000..2a31bbdd37 --- /dev/null +++ b/packages/skeleton-svelte/src/components/tags-input/modules/item-context.ts @@ -0,0 +1,4 @@ +import { createContext } from '@/internal/create-context'; +import type { ItemProps } from '@zag-js/tags-input'; + +export const ItemContext = createContext<() => ItemProps>(); diff --git a/packages/skeleton-svelte/src/components/tags-input/modules/provider.svelte.ts b/packages/skeleton-svelte/src/components/tags-input/modules/provider.svelte.ts new file mode 100644 index 0000000000..15c01acd9e --- /dev/null +++ b/packages/skeleton-svelte/src/components/tags-input/modules/provider.svelte.ts @@ -0,0 +1,8 @@ +import { normalizeProps, useMachine, type PropTypes } from '@zag-js/svelte'; +import { type Api, connect, machine, type Props } from '@zag-js/tags-input'; + +export function useTagsInput(props: Props | (() => Props)): () => Api<PropTypes> { + const service = useMachine(machine, props); + const tagsInput = $derived(connect(service, normalizeProps)); + return () => tagsInput; +} diff --git a/packages/skeleton-svelte/src/components/tags-input/modules/root-context.ts b/packages/skeleton-svelte/src/components/tags-input/modules/root-context.ts new file mode 100644 index 0000000000..4d5c451aec --- /dev/null +++ b/packages/skeleton-svelte/src/components/tags-input/modules/root-context.ts @@ -0,0 +1,4 @@ +import type { useTagsInput } from './provider.svelte'; +import { createContext } from '@/internal/create-context'; + +export const RootContext = createContext<ReturnType<typeof useTagsInput>>(); diff --git a/packages/skeleton-svelte/src/components/toast/anatomy/action-trigger.svelte b/packages/skeleton-svelte/src/components/toast/anatomy/action-trigger.svelte new file mode 100644 index 0000000000..4ebd70e4e3 --- /dev/null +++ b/packages/skeleton-svelte/src/components/toast/anatomy/action-trigger.svelte @@ -0,0 +1,36 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface ToastActionTriggerProps extends PropsWithElement<'button'>, HTMLAttributes<'button'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesToast } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: ToastActionTriggerProps = $props(); + + const toast = RootContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + toast().getActionTriggerProps(), + { + class: classesToast.actionTrigger, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <button {...attributes}> + {@render children?.()} + </button> +{/if} diff --git a/packages/skeleton-svelte/src/components/toast/anatomy/close-trigger.svelte b/packages/skeleton-svelte/src/components/toast/anatomy/close-trigger.svelte new file mode 100644 index 0000000000..5dc8001f9a --- /dev/null +++ b/packages/skeleton-svelte/src/components/toast/anatomy/close-trigger.svelte @@ -0,0 +1,41 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface ToastCloseTriggerProps extends PropsWithElement<'button'>, HTMLAttributes<'button'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import X from '@/internal/components/x.svelte'; + import { classesToast } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: ToastCloseTriggerProps = $props(); + + const toast = RootContext.consume(); + + const { element, children = x, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + toast().getCloseTriggerProps(), + { + class: classesToast.closeTrigger, + }, + rest, + ), + ); +</script> + +{#snippet x()} + <X /> +{/snippet} + +{#if element} + {@render element(attributes)} +{:else} + <button {...attributes}> + {@render children?.()} + </button> +{/if} diff --git a/packages/skeleton-svelte/src/components/toast/anatomy/description.svelte b/packages/skeleton-svelte/src/components/toast/anatomy/description.svelte new file mode 100644 index 0000000000..fe33480e85 --- /dev/null +++ b/packages/skeleton-svelte/src/components/toast/anatomy/description.svelte @@ -0,0 +1,36 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface ToastDescriptionProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesToast } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: ToastDescriptionProps = $props(); + + const toast = RootContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + toast().getDescriptionProps(), + { + class: classesToast.description, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/toast/anatomy/group.svelte b/packages/skeleton-svelte/src/components/toast/anatomy/group.svelte new file mode 100644 index 0000000000..a98744783b --- /dev/null +++ b/packages/skeleton-svelte/src/components/toast/anatomy/group.svelte @@ -0,0 +1,51 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + import type { Props, Store } from '@zag-js/toast'; + import type { Snippet } from 'svelte'; + + export interface ToastGroupProps extends PropsWithElement<'div'>, HTMLAttributes<'div', 'id' | 'dir' | 'children'> { + toaster: Store; + children?: Snippet<[Props]>; + } +</script> + +<script lang="ts"> + import { GroupContext } from '../modules/group-context'; + import { classesToast } from '@skeletonlabs/skeleton-common'; + import { mergeProps, normalizeProps, useMachine } from '@zag-js/svelte'; + import { group } from '@zag-js/toast'; + + const props: ToastGroupProps = $props(); + + const { element, children, toaster, ...rest } = $derived(props); + + const id = $props.id(); + const service = useMachine(group.machine, () => ({ + id: id, + store: toaster, + })); + const api = $derived(group.connect(service, normalizeProps)); + + const attributes = $derived( + mergeProps( + api.getGroupProps(), + { + class: classesToast.group, + }, + rest, + ), + ); + + GroupContext.provide(() => service); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {#each api.getToasts() as toast (toast.id)} + {@render children?.(toast)} + {/each} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/toast/anatomy/message.svelte b/packages/skeleton-svelte/src/components/toast/anatomy/message.svelte new file mode 100644 index 0000000000..9d63c159b6 --- /dev/null +++ b/packages/skeleton-svelte/src/components/toast/anatomy/message.svelte @@ -0,0 +1,32 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface ToastMessageProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} +</script> + +<script lang="ts"> + import { classesToast } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: ToastMessageProps = $props(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + { + class: classesToast.message, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/toast/anatomy/root-context.svelte b/packages/skeleton-svelte/src/components/toast/anatomy/root-context.svelte new file mode 100644 index 0000000000..2c6f6275e6 --- /dev/null +++ b/packages/skeleton-svelte/src/components/toast/anatomy/root-context.svelte @@ -0,0 +1,21 @@ +<script lang="ts" module> + import type { PropTypes } from '@zag-js/svelte'; + import type { Api } from '@zag-js/toast'; + import type { Snippet } from 'svelte'; + + export interface ToastRootContextProps { + children: Snippet<[() => Api<PropTypes>]>; + } +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + + const props: ToastRootContextProps = $props(); + + const toast = RootContext.consume(); + + const { children } = $derived(props); +</script> + +{@render children(toast)} diff --git a/packages/skeleton-svelte/src/components/toast/anatomy/root.svelte b/packages/skeleton-svelte/src/components/toast/anatomy/root.svelte new file mode 100644 index 0000000000..9b8602eec6 --- /dev/null +++ b/packages/skeleton-svelte/src/components/toast/anatomy/root.svelte @@ -0,0 +1,78 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + import type { Options } from '@zag-js/toast'; + + export interface ToastRootProps extends PropsWithElement<'div'>, HTMLAttributes<'div', 'id' | 'dir'> { + toast: Options; + } +</script> + +<script lang="ts"> + import { GroupContext } from '../modules/group-context'; + import { RootContext } from '../modules/root-context'; + import { classesToast } from '@skeletonlabs/skeleton-common'; + import { mergeProps, normalizeProps, useMachine } from '@zag-js/svelte'; + import { connect, machine } from '@zag-js/toast'; + + const props: ToastRootProps = $props(); + + const group = GroupContext.consume(); + + const { element, children, toast: toastProps, ...rest } = $derived(props); + + const id = $props.id(); + const service = useMachine(machine, () => ({ + id: id, + parent: group(), + ...toastProps, + })); + const toast = $derived(connect(service, normalizeProps)); + + const attributes = $derived( + mergeProps( + toast.getRootProps(), + { + class: classesToast.root, + }, + rest, + ), + ); + + RootContext.provide(() => toast); +</script> + +<div {...toast.getGhostBeforeProps()}></div> +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} +<div {...toast.getGhostAfterProps()}></div> + +<style> + [data-part='root'] { + translate: var(--x) var(--y); + scale: var(--scale); + z-index: var(--z-index); + height: var(--height); + opacity: var(--opacity); + will-change: translate, opacity, scale; + } + [data-part='root'] { + transition: + translate 400ms, + scale 400ms, + opacity 400ms; + transition-timing-function: cubic-bezier(0.21, 1.02, 0.73, 1); + } + [data-part='root'][data-state='closed'] { + transition: + translate 400ms, + scale 400ms, + opacity 200ms; + transition-timing-function: cubic-bezier(0.06, 0.71, 0.55, 1); + } +</style> diff --git a/packages/skeleton-svelte/src/components/toast/anatomy/title.svelte b/packages/skeleton-svelte/src/components/toast/anatomy/title.svelte new file mode 100644 index 0000000000..bb7fd76165 --- /dev/null +++ b/packages/skeleton-svelte/src/components/toast/anatomy/title.svelte @@ -0,0 +1,36 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface ToastTitleProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesToast } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: ToastTitleProps = $props(); + + const toast = RootContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + toast().getTitleProps(), + { + class: classesToast.title, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/toast/index.ts b/packages/skeleton-svelte/src/components/toast/index.ts new file mode 100644 index 0000000000..a263b60b67 --- /dev/null +++ b/packages/skeleton-svelte/src/components/toast/index.ts @@ -0,0 +1,9 @@ +export type { ToastCloseTriggerProps } from './anatomy/close-trigger.svelte'; +export type { ToastDescriptionProps } from './anatomy/description.svelte'; +export type { ToastGroupProps } from './anatomy/group.svelte'; +export type { ToastMessageProps } from './anatomy/message.svelte'; +export type { ToastRootProps } from './anatomy/root.svelte'; +export type { ToastRootContextProps } from './anatomy/root-context.svelte'; +export type { ToastTitleProps } from './anatomy/title.svelte'; +export { Toast } from './modules/anatomy'; +export { createStore as createToaster } from '@zag-js/toast'; diff --git a/packages/skeleton-svelte/src/components/toast/modules/anatomy.ts b/packages/skeleton-svelte/src/components/toast/modules/anatomy.ts new file mode 100644 index 0000000000..d9f6642dbe --- /dev/null +++ b/packages/skeleton-svelte/src/components/toast/modules/anatomy.ts @@ -0,0 +1,18 @@ +import ActionTrigger from '../anatomy/action-trigger.svelte'; +import CloseTrigger from '../anatomy/close-trigger.svelte'; +import Description from '../anatomy/description.svelte'; +import Group from '../anatomy/group.svelte'; +import Message from '../anatomy/message.svelte'; +import RootContext from '../anatomy/root-context.svelte'; +import Root from '../anatomy/root.svelte'; +import Title from '../anatomy/title.svelte'; + +export const Toast = Object.assign(Root, { + Context: RootContext, + Group: Group, + Message: Message, + Title: Title, + Description: Description, + ActionTrigger: ActionTrigger, + CloseTrigger: CloseTrigger, +}); diff --git a/packages/skeleton-svelte/src/components/toast/modules/group-context.ts b/packages/skeleton-svelte/src/components/toast/modules/group-context.ts new file mode 100644 index 0000000000..f3d6121e4e --- /dev/null +++ b/packages/skeleton-svelte/src/components/toast/modules/group-context.ts @@ -0,0 +1,4 @@ +import { createContext } from '@/internal/create-context'; +import type { GroupService } from '@zag-js/toast'; + +export const GroupContext = createContext<() => GroupService>(); diff --git a/packages/skeleton-svelte/src/components/toast/modules/root-context.ts b/packages/skeleton-svelte/src/components/toast/modules/root-context.ts new file mode 100644 index 0000000000..0a9163bce9 --- /dev/null +++ b/packages/skeleton-svelte/src/components/toast/modules/root-context.ts @@ -0,0 +1,5 @@ +import { createContext } from '@/internal/create-context'; +import type { PropTypes } from '@zag-js/svelte'; +import type { Api } from '@zag-js/toast'; + +export const RootContext = createContext<() => Api<PropTypes>>(); diff --git a/packages/skeleton-svelte/src/components/tooltip/anatomy/arrow-tip.svelte b/packages/skeleton-svelte/src/components/tooltip/anatomy/arrow-tip.svelte new file mode 100644 index 0000000000..903e50ba68 --- /dev/null +++ b/packages/skeleton-svelte/src/components/tooltip/anatomy/arrow-tip.svelte @@ -0,0 +1,36 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface TooltipArrowTipProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesTooltip } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: TooltipArrowTipProps = $props(); + + const tooltip = RootContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + tooltip().getArrowTipProps(), + { + class: classesTooltip.arrowTip, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/tooltip/anatomy/arrow.svelte b/packages/skeleton-svelte/src/components/tooltip/anatomy/arrow.svelte new file mode 100644 index 0000000000..5182fc6038 --- /dev/null +++ b/packages/skeleton-svelte/src/components/tooltip/anatomy/arrow.svelte @@ -0,0 +1,36 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface TooltipArrowProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesTooltip } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: TooltipArrowProps = $props(); + + const tooltip = RootContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + tooltip().getArrowProps(), + { + class: classesTooltip.arrow, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/tooltip/anatomy/content.svelte b/packages/skeleton-svelte/src/components/tooltip/anatomy/content.svelte new file mode 100644 index 0000000000..2eed13ced5 --- /dev/null +++ b/packages/skeleton-svelte/src/components/tooltip/anatomy/content.svelte @@ -0,0 +1,36 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface TooltipContentProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesTooltip } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: TooltipContentProps = $props(); + + const tooltip = RootContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + tooltip().getContentProps(), + { + class: classesTooltip.content, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/tooltip/anatomy/positioner.svelte b/packages/skeleton-svelte/src/components/tooltip/anatomy/positioner.svelte new file mode 100644 index 0000000000..8913588015 --- /dev/null +++ b/packages/skeleton-svelte/src/components/tooltip/anatomy/positioner.svelte @@ -0,0 +1,38 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface TooltipPositionerProps extends PropsWithElement<'div'>, HTMLAttributes<'div'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesTooltip } from '@skeletonlabs/skeleton-common'; + import { mergeProps, portal } from '@zag-js/svelte'; + import { createAttachmentKey, fromAction } from 'svelte/attachments'; + + const props: TooltipPositionerProps = $props(); + + const tooltip = RootContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + tooltip().getPositionerProps(), + { + class: classesTooltip.positioner, + [createAttachmentKey()]: fromAction(portal, () => undefined), + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <div {...attributes}> + {@render children?.()} + </div> +{/if} diff --git a/packages/skeleton-svelte/src/components/tooltip/anatomy/root-context.svelte b/packages/skeleton-svelte/src/components/tooltip/anatomy/root-context.svelte new file mode 100644 index 0000000000..dfa5fdc6b0 --- /dev/null +++ b/packages/skeleton-svelte/src/components/tooltip/anatomy/root-context.svelte @@ -0,0 +1,20 @@ +<script lang="ts" module> + import type { useTooltip } from '../modules/provider.svelte'; + import type { Snippet } from 'svelte'; + + export interface TooltipRootContextProps { + children: Snippet<[ReturnType<typeof useTooltip>]>; + } +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + + const props: TooltipRootContextProps = $props(); + + const tooltip = RootContext.consume(); + + const { children } = $derived(props); +</script> + +{@render children(tooltip)} diff --git a/packages/skeleton-svelte/src/components/tooltip/anatomy/root-provider.svelte b/packages/skeleton-svelte/src/components/tooltip/anatomy/root-provider.svelte new file mode 100644 index 0000000000..6c6edbb65e --- /dev/null +++ b/packages/skeleton-svelte/src/components/tooltip/anatomy/root-provider.svelte @@ -0,0 +1,20 @@ +<script lang="ts" module> + import type { PropsWithChildren } from '@/internal/props-with-children'; + + export interface TooltipRootProviderProps extends PropsWithChildren { + value: ReturnType<typeof useTooltip>; + } +</script> + +<script lang="ts"> + import { useTooltip } from '../modules/provider.svelte'; + import { RootContext } from '../modules/root-context'; + + const props: TooltipRootProviderProps = $props(); + + const { children, value: tooltip } = $derived(props); + + RootContext.provide(() => tooltip()); +</script> + +{@render children?.()} diff --git a/packages/skeleton-svelte/src/components/tooltip/anatomy/root.svelte b/packages/skeleton-svelte/src/components/tooltip/anatomy/root.svelte new file mode 100644 index 0000000000..b4370dcba7 --- /dev/null +++ b/packages/skeleton-svelte/src/components/tooltip/anatomy/root.svelte @@ -0,0 +1,27 @@ +<script lang="ts" module> + import type { PropsWithChildren } from '@/internal/props-with-children'; + import type { Props } from '@zag-js/tooltip'; + + export interface TooltipRootProps extends Omit<Props, 'id'>, PropsWithChildren {} +</script> + +<script lang="ts"> + import { useTooltip } from '../modules/provider.svelte'; + import { RootContext } from '../modules/root-context'; + import { splitProps } from '@zag-js/tooltip'; + + const props: TooltipRootProps = $props(); + + const [tooltipProps, componentProps] = $derived(splitProps(props)); + const { children } = $derived(componentProps); + + const id = $props.id(); + const tooltip = useTooltip(() => ({ + id: id, + ...tooltipProps, + })); + + RootContext.provide(() => tooltip()); +</script> + +{@render children?.()} diff --git a/packages/skeleton-svelte/src/components/tooltip/anatomy/trigger.svelte b/packages/skeleton-svelte/src/components/tooltip/anatomy/trigger.svelte new file mode 100644 index 0000000000..03f792012e --- /dev/null +++ b/packages/skeleton-svelte/src/components/tooltip/anatomy/trigger.svelte @@ -0,0 +1,36 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '@/internal/html-attributes'; + import type { PropsWithElement } from '@/internal/props-with-element'; + + export interface TooltipTriggerProps extends PropsWithElement<'button'>, HTMLAttributes<'button'> {} +</script> + +<script lang="ts"> + import { RootContext } from '../modules/root-context'; + import { classesTooltip } from '@skeletonlabs/skeleton-common'; + import { mergeProps } from '@zag-js/svelte'; + + const props: TooltipTriggerProps = $props(); + + const tooltip = RootContext.consume(); + + const { element, children, ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + tooltip().getTriggerProps(), + { + class: classesTooltip.trigger, + }, + rest, + ), + ); +</script> + +{#if element} + {@render element(attributes)} +{:else} + <button {...attributes}> + {@render children?.()} + </button> +{/if} diff --git a/packages/skeleton-svelte/src/components/tooltip/index.ts b/packages/skeleton-svelte/src/components/tooltip/index.ts new file mode 100644 index 0000000000..388a79e69b --- /dev/null +++ b/packages/skeleton-svelte/src/components/tooltip/index.ts @@ -0,0 +1,10 @@ +export type { TooltipArrowProps } from './anatomy/arrow.svelte'; +export type { TooltipArrowTipProps } from './anatomy/arrow-tip.svelte'; +export type { TooltipContentProps } from './anatomy/content.svelte'; +export type { TooltipPositionerProps } from './anatomy/positioner.svelte'; +export type { TooltipRootProps } from './anatomy/root.svelte'; +export type { TooltipRootContextProps } from './anatomy/root-context.svelte'; +export type { TooltipRootProviderProps } from './anatomy/root-provider.svelte'; +export type { TooltipTriggerProps } from './anatomy/trigger.svelte'; +export { Tooltip } from './modules/anatomy'; +export { useTooltip } from './modules/provider.svelte'; diff --git a/packages/skeleton-svelte/src/components/tooltip/modules/anatomy.ts b/packages/skeleton-svelte/src/components/tooltip/modules/anatomy.ts new file mode 100644 index 0000000000..c63aea20ee --- /dev/null +++ b/packages/skeleton-svelte/src/components/tooltip/modules/anatomy.ts @@ -0,0 +1,18 @@ +import ArrowTip from '../anatomy/arrow-tip.svelte'; +import Arrow from '../anatomy/arrow.svelte'; +import Content from '../anatomy/content.svelte'; +import Positioner from '../anatomy/positioner.svelte'; +import RootContext from '../anatomy/root-context.svelte'; +import RootProvider from '../anatomy/root-provider.svelte'; +import Root from '../anatomy/root.svelte'; +import Trigger from '../anatomy/trigger.svelte'; + +export const Tooltip = Object.assign(Root, { + Provider: RootProvider, + Context: RootContext, + Trigger: Trigger, + Positioner: Positioner, + Content: Content, + Arrow: Arrow, + ArrowTip: ArrowTip, +}); diff --git a/packages/skeleton-svelte/src/components/tooltip/modules/provider.svelte.ts b/packages/skeleton-svelte/src/components/tooltip/modules/provider.svelte.ts new file mode 100644 index 0000000000..15a24a8863 --- /dev/null +++ b/packages/skeleton-svelte/src/components/tooltip/modules/provider.svelte.ts @@ -0,0 +1,8 @@ +import { normalizeProps, useMachine, type PropTypes } from '@zag-js/svelte'; +import { type Api, connect, machine, type Props } from '@zag-js/tooltip'; + +export function useTooltip(props: Props | (() => Props)): () => Api<PropTypes> { + const service = useMachine(machine, props); + const tooltip = $derived(connect(service, normalizeProps)); + return () => tooltip; +} diff --git a/packages/skeleton-svelte/src/components/tooltip/modules/root-context.ts b/packages/skeleton-svelte/src/components/tooltip/modules/root-context.ts new file mode 100644 index 0000000000..9ab41c24e0 --- /dev/null +++ b/packages/skeleton-svelte/src/components/tooltip/modules/root-context.ts @@ -0,0 +1,4 @@ +import type { useTooltip } from './provider.svelte'; +import { createContext } from '@/internal/create-context'; + +export const RootContext = createContext<ReturnType<typeof useTooltip>>(); diff --git a/packages/skeleton-svelte/src/hooks/use-list-collection.ts b/packages/skeleton-svelte/src/hooks/use-list-collection.ts new file mode 100644 index 0000000000..7db88eb170 --- /dev/null +++ b/packages/skeleton-svelte/src/hooks/use-list-collection.ts @@ -0,0 +1,5 @@ +import { type CollectionItem, type CollectionOptions, ListCollection } from '@zag-js/collection'; + +export function useListCollection<T extends CollectionItem = CollectionItem>(options: CollectionOptions<T>) { + return new ListCollection(options); +} diff --git a/packages/skeleton-svelte/src/index.css b/packages/skeleton-svelte/src/index.css new file mode 100644 index 0000000000..8a219bdce5 --- /dev/null +++ b/packages/skeleton-svelte/src/index.css @@ -0,0 +1,2 @@ +@import '@skeletonlabs/skeleton-common'; +@source './'; diff --git a/packages/skeleton-svelte/src/index.ts b/packages/skeleton-svelte/src/index.ts new file mode 100644 index 0000000000..39eb29e61d --- /dev/null +++ b/packages/skeleton-svelte/src/index.ts @@ -0,0 +1,19 @@ +export * from './components/accordion/index'; +export * from './components/app-bar/index'; +export * from './components/avatar/index'; +export * from './components/combobox/index'; +export * from './components/dialog/index'; +export * from './components/file-upload/index'; +export * from './components/popover/index'; +export * from './components/portal/index'; +export * from './components/progress-linear/index'; +export * from './components/rating-group/index'; +export * from './components/segmented-control/index'; +export * from './components/slider/index'; +export * from './components/switch/index'; +export * from './components/tabs/index'; +export * from './components/tags-input/index'; +export * from './components/toast/index'; +export * from './components/tooltip/index'; + +export * from './hooks/use-list-collection'; diff --git a/packages/skeleton-svelte/src/internal/components/check.svelte b/packages/skeleton-svelte/src/internal/components/check.svelte new file mode 100644 index 0000000000..a5e459197e --- /dev/null +++ b/packages/skeleton-svelte/src/internal/components/check.svelte @@ -0,0 +1,33 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '../html-attributes'; + import { mergeProps } from '@zag-js/svelte'; + + export type CheckProps = HTMLAttributes<'svg', 'children'>; +</script> + +<script lang="ts"> + const props: CheckProps = $props(); + + const { ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + { + xmlns: 'http://www.w3.org/2000/svg', + width: '24', + height: '24', + viewBox: '0 0 24 24', + fill: 'none', + stroke: 'currentColor', + 'stroke-width': '2', + 'stroke-linecap': 'round', + 'stroke-linejoin': 'round', + }, + rest, + ), + ); +</script> + +<svg {...attributes}> + <path d="M20 6 9 17l-5-5" /> +</svg> diff --git a/packages/skeleton-svelte/src/internal/components/chevron-down.svelte b/packages/skeleton-svelte/src/internal/components/chevron-down.svelte new file mode 100644 index 0000000000..00bdac1eea --- /dev/null +++ b/packages/skeleton-svelte/src/internal/components/chevron-down.svelte @@ -0,0 +1,18 @@ +<script lang="ts"> + let { ...restAttrs } = $props(); +</script> + +<svg + xmlns="http://www.w3.org/2000/svg" + width="24" + height="24" + viewBox="0 0 24 24" + fill="none" + stroke="currentColor" + stroke-width="2" + stroke-linecap="round" + stroke-linejoin="round" + {...restAttrs} +> + <path d="m6 9 6 6 6-6" /> +</svg> diff --git a/packages/skeleton-svelte/src/internal/components/star-empty.svelte b/packages/skeleton-svelte/src/internal/components/star-empty.svelte new file mode 100644 index 0000000000..7c27812df9 --- /dev/null +++ b/packages/skeleton-svelte/src/internal/components/star-empty.svelte @@ -0,0 +1,12 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="24" width="24" fill="none" stroke="currentColor" stroke-width="1.5"> + <path + stroke-linecap="round" + stroke-linejoin="round" + d="M11.48 3.499a.562.562 0 0 1 1.04 0l2.125 5.111a.563.563 0 0 0 .475.345 + l5.518.442c.499.04.701.663.321.988l-4.204 3.602a.563.563 0 0 0-.182.557 + l1.285 5.385a.562.562 0 0 1-.84.61l-4.725-2.885a.562.562 0 0 0-.586 0 + L6.982 20.54a.562.562 0 0 1-.84-.61l1.285-5.386a.562.562 0 0 0-.182-.557 + l-4.204-3.602a.562.562 0 0 1 .321-.988l5.518-.442a.563.563 0 0 0 .475-.345 + L11.48 3.5Z" + /> +</svg> diff --git a/packages/skeleton-svelte/src/internal/components/star-full.svelte b/packages/skeleton-svelte/src/internal/components/star-full.svelte new file mode 100644 index 0000000000..510fa46ebf --- /dev/null +++ b/packages/skeleton-svelte/src/internal/components/star-full.svelte @@ -0,0 +1,12 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="24" width="24" fill="currentColor"> + <path + fill-rule="evenodd" + clip-rule="evenodd" + d="M10.788 3.21c.448-1.077 1.976-1.077 2.424 0l2.082 5.006 + 5.404.434c1.164.093 1.636 1.545.749 2.305l-4.117 3.527 + 1.257 5.273c.271 1.136-.964 2.033-1.96 1.425L12 18.354 + 7.373 21.18c-.996.608-2.231-.29-1.96-1.425l1.257-5.273 + -4.117-3.527c-.887-.76-.415-2.212.749-2.305l5.404-.434 + 2.082-5.005Z" + /> +</svg> diff --git a/packages/skeleton-svelte/src/internal/components/star-half.svelte b/packages/skeleton-svelte/src/internal/components/star-half.svelte new file mode 100644 index 0000000000..ebea748c6f --- /dev/null +++ b/packages/skeleton-svelte/src/internal/components/star-half.svelte @@ -0,0 +1,19 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" height="24" width="24" fill="none" stroke="currentColor" stroke-width="1.5"> + <defs> + <linearGradient id="half-fill" x1="0%" y1="0%" x2="100%" y2="0%"> + <stop offset="50%" stop-color="currentColor" /> + <stop offset="50%" stop-color="transparent" /> + </linearGradient> + </defs> + <path + fill="url(#half-fill)" + stroke-linecap="round" + stroke-linejoin="round" + d="M11.48 3.499a.562.562 0 0 1 1.04 0l2.125 5.111a.563.563 0 0 0 .475.345 + l5.518.442c.499.04.701.663.321.988l-4.204 3.602a.563.563 0 0 0-.182.557 + l1.285 5.385a.562.562 0 0 1-.84.61l-4.725-2.885a.562.562 0 0 0-.586 0 + L6.982 20.54a.562.562 0 0 1-.84-.61l1.285-5.386a.562.562 0 0 0-.182-.557 + l-4.204-3.602a.562.562 0 0 1 .321-.988l5.518-.442a.563.563 0 0 0 .475-.345 + L11.48 3.5Z" + /> +</svg> diff --git a/packages/skeleton-svelte/src/internal/components/x.svelte b/packages/skeleton-svelte/src/internal/components/x.svelte new file mode 100644 index 0000000000..43a47931ec --- /dev/null +++ b/packages/skeleton-svelte/src/internal/components/x.svelte @@ -0,0 +1,34 @@ +<script lang="ts" module> + import type { HTMLAttributes } from '../html-attributes'; + import { mergeProps } from '@zag-js/svelte'; + + export type XProps = HTMLAttributes<'svg', 'children'>; +</script> + +<script lang="ts"> + const props: XProps = $props(); + + const { ...rest } = $derived(props); + + const attributes = $derived( + mergeProps( + { + xmlns: 'http://www.w3.org/2000/svg', + width: '24', + height: '24', + viewBox: '0 0 24 24', + fill: 'none', + stroke: 'currentColor', + 'stroke-width': '2', + 'stroke-linecap': 'round', + 'stroke-linejoin': 'round', + }, + rest, + ), + ); +</script> + +<svg {...attributes}> + <path d="M18 6 6 18" /> + <path d="m6 6 12 12" /> +</svg> diff --git a/packages/skeleton-svelte/src/internal/create-context.ts b/packages/skeleton-svelte/src/internal/create-context.ts new file mode 100644 index 0000000000..8513c79d28 --- /dev/null +++ b/packages/skeleton-svelte/src/internal/create-context.ts @@ -0,0 +1,14 @@ +import { getContext, setContext } from 'svelte'; + +export function createContext<T>() { + const key = Symbol(); + return { + key: key, + consume() { + return getContext<T>(key); + }, + provide(value: T) { + return setContext(key, value); + }, + }; +} diff --git a/packages/skeleton-svelte/src/internal/html-attributes.ts b/packages/skeleton-svelte/src/internal/html-attributes.ts new file mode 100644 index 0000000000..2b8ff1eabf --- /dev/null +++ b/packages/skeleton-svelte/src/internal/html-attributes.ts @@ -0,0 +1,6 @@ +import type { SvelteHTMLElements } from 'svelte/elements'; + +export type HTMLAttributes<T extends keyof SvelteHTMLElements, U extends keyof SvelteHTMLElements[T] = never> = Omit< + SvelteHTMLElements[T], + U +>; diff --git a/packages/skeleton-svelte/src/internal/props-with-children.ts b/packages/skeleton-svelte/src/internal/props-with-children.ts new file mode 100644 index 0000000000..bf62d5316d --- /dev/null +++ b/packages/skeleton-svelte/src/internal/props-with-children.ts @@ -0,0 +1,10 @@ +import type { Snippet } from 'svelte'; + +interface PropsWithChildren<T extends unknown[] = []> { + /** + * The default slot content to be rendered within the component. + */ + children?: Snippet<T>; +} + +export type { PropsWithChildren }; diff --git a/packages/skeleton-svelte/src/internal/props-with-element.ts b/packages/skeleton-svelte/src/internal/props-with-element.ts new file mode 100644 index 0000000000..db6563eba8 --- /dev/null +++ b/packages/skeleton-svelte/src/internal/props-with-element.ts @@ -0,0 +1,12 @@ +import type { HTMLAttributes } from './html-attributes'; +import type { Snippet } from 'svelte'; +import type { SvelteHTMLElements } from 'svelte/elements'; + +interface PropsWithElement<T extends keyof SvelteHTMLElements> { + /** + * Render the element yourself + */ + element?: Snippet<[HTMLAttributes<T>]>; +} + +export type { PropsWithElement }; diff --git a/packages/skeleton-svelte/svelte.config.js b/packages/skeleton-svelte/svelte.config.js new file mode 100644 index 0000000000..0695aa0282 --- /dev/null +++ b/packages/skeleton-svelte/svelte.config.js @@ -0,0 +1,13 @@ +import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; + +/** @type {import('@sveltejs/kit').Config} */ +const config = { + preprocess: vitePreprocess(), + kit: { + alias: { + '@/': './src/', + }, + }, +}; + +export default config; diff --git a/packages/skeleton-svelte/test/components/accordion/index.test.ts b/packages/skeleton-svelte/test/components/accordion/index.test.ts new file mode 100644 index 0000000000..e30669c211 --- /dev/null +++ b/packages/skeleton-svelte/test/components/accordion/index.test.ts @@ -0,0 +1,40 @@ +import Test from './test.svelte'; +import { render, screen } from '@testing-library/svelte'; +import { describe, expect, it } from 'vitest'; + +describe('Accordion', () => { + describe('Root', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('root')).toBeInTheDocument(); + }); + }); + + describe('Item', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('item')).toBeInTheDocument(); + }); + }); + + describe('ItemHeading', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('item-heading')).toBeInTheDocument(); + }); + }); + + describe('ItemTrigger', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('item-trigger')).toBeInTheDocument(); + }); + }); + + describe('ItemContent', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('item-content')).toBeInTheDocument(); + }); + }); +}); diff --git a/packages/skeleton-svelte/test/components/accordion/test.svelte b/packages/skeleton-svelte/test/components/accordion/test.svelte new file mode 100644 index 0000000000..287d7b45b7 --- /dev/null +++ b/packages/skeleton-svelte/test/components/accordion/test.svelte @@ -0,0 +1,13 @@ +<script lang="ts"> + import { Accordion } from '@/index'; +</script> + +<Accordion data-testid="root"> + <Accordion.Item value="item" data-testid="item"> + <Accordion.ItemHeading data-testid="item-heading"> + <Accordion.ItemTrigger data-testid="item-trigger" /> + <Accordion.ItemIndicator data-testid="item-indicator" /> + <Accordion.ItemContent data-testid="item-content" /> + </Accordion.ItemHeading> + </Accordion.Item> +</Accordion> diff --git a/packages/skeleton-svelte/test/components/app-bar/index.test.ts b/packages/skeleton-svelte/test/components/app-bar/index.test.ts new file mode 100644 index 0000000000..49485c6c0c --- /dev/null +++ b/packages/skeleton-svelte/test/components/app-bar/index.test.ts @@ -0,0 +1,40 @@ +import Test from './test.svelte'; +import { render, screen } from '@testing-library/svelte'; +import { describe, expect, it } from 'vitest'; + +describe('AppBar', () => { + describe('Root', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('root')).toBeInTheDocument(); + }); + }); + + describe('Toolbar', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('toolbar')).toBeInTheDocument(); + }); + }); + + describe('Lead', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('lead')).toBeInTheDocument(); + }); + }); + + describe('Headline', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('headline')).toBeInTheDocument(); + }); + }); + + describe('Trail', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('trail')).toBeInTheDocument(); + }); + }); +}); diff --git a/packages/skeleton-svelte/test/components/app-bar/test.svelte b/packages/skeleton-svelte/test/components/app-bar/test.svelte new file mode 100644 index 0000000000..63153c4d92 --- /dev/null +++ b/packages/skeleton-svelte/test/components/app-bar/test.svelte @@ -0,0 +1,11 @@ +<script lang="ts"> + import { AppBar } from '@/index'; +</script> + +<AppBar data-testid="root"> + <AppBar.Toolbar data-testid="toolbar"> + <AppBar.Lead data-testid="lead" /> + <AppBar.Headline data-testid="headline" /> + <AppBar.Trail data-testid="trail" /> + </AppBar.Toolbar> +</AppBar> diff --git a/packages/skeleton-svelte/test/components/avatar/index.test.ts b/packages/skeleton-svelte/test/components/avatar/index.test.ts new file mode 100644 index 0000000000..66b62d2ed6 --- /dev/null +++ b/packages/skeleton-svelte/test/components/avatar/index.test.ts @@ -0,0 +1,26 @@ +import Test from './test.svelte'; +import { render, screen } from '@testing-library/svelte'; +import { describe, expect, it } from 'vitest'; + +describe('Avatar', () => { + describe('Root', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('root')).toBeInTheDocument(); + }); + }); + + describe('Image', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('image')).toBeInTheDocument(); + }); + }); + + describe('Fallback', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('fallback')).toBeInTheDocument(); + }); + }); +}); diff --git a/packages/skeleton-svelte/test/components/avatar/test.svelte b/packages/skeleton-svelte/test/components/avatar/test.svelte new file mode 100644 index 0000000000..6e1f68cb52 --- /dev/null +++ b/packages/skeleton-svelte/test/components/avatar/test.svelte @@ -0,0 +1,8 @@ +<script lang="ts"> + import { Avatar } from '@/index'; +</script> + +<Avatar data-testid="root"> + <Avatar.Image data-testid="image" src="https://picsum.photos/100/100" /> + <Avatar.Fallback data-testid="fallback">SK</Avatar.Fallback> +</Avatar> diff --git a/packages/skeleton-svelte/test/components/combobox/index.test.ts b/packages/skeleton-svelte/test/components/combobox/index.test.ts new file mode 100644 index 0000000000..8deaaa98dd --- /dev/null +++ b/packages/skeleton-svelte/test/components/combobox/index.test.ts @@ -0,0 +1,89 @@ +import Test from './test.svelte'; +import { render, screen } from '@testing-library/svelte'; +import { describe, expect, it } from 'vitest'; + +describe('Combobox', () => { + describe('Root', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('root')).toBeInTheDocument(); + }); + }); + + describe('Label', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('label')).toBeInTheDocument(); + }); + }); + + describe('Control', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('control')).toBeInTheDocument(); + }); + }); + + describe('Input', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('input')).toBeInTheDocument(); + }); + }); + + describe('Trigger', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('trigger')).toBeInTheDocument(); + }); + }); + + describe('Positioner', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('positioner')).toBeInTheDocument(); + }); + }); + + describe('Content', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('content')).toBeInTheDocument(); + }); + }); + + describe('item group', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('item-group')).toBeInTheDocument(); + }); + }); + + describe('item group label', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('item-group-label')).toBeInTheDocument(); + }); + }); + + describe('Item', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('item')).toBeInTheDocument(); + }); + }); + + describe('item text', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('item-text')).toBeInTheDocument(); + }); + }); + + describe('item indicator', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('item-indicator')).toBeInTheDocument(); + }); + }); +}); diff --git a/packages/skeleton-svelte/test/components/combobox/test.svelte b/packages/skeleton-svelte/test/components/combobox/test.svelte new file mode 100644 index 0000000000..3645c54824 --- /dev/null +++ b/packages/skeleton-svelte/test/components/combobox/test.svelte @@ -0,0 +1,22 @@ +<script lang="ts"> + import { Combobox } from '@/index'; +</script> + +<Combobox data-testid="root"> + <Combobox.Label data-testid="label" /> + <Combobox.Control data-testid="control"> + <Combobox.Input data-testid="input" /> + <Combobox.Trigger data-testid="trigger" /> + </Combobox.Control> + <Combobox.Positioner data-testid="positioner"> + <Combobox.Content data-testid="content"> + <Combobox.ItemGroup data-testid="item-group"> + <Combobox.ItemGroupLabel data-testid="item-group-label" /> + <Combobox.Item item="item" data-testid="item"> + <Combobox.ItemText data-testid="item-text">Item</Combobox.ItemText> + <Combobox.ItemIndicator data-testid="item-indicator" /> + </Combobox.Item> + </Combobox.ItemGroup> + </Combobox.Content> + </Combobox.Positioner> +</Combobox> diff --git a/packages/skeleton-svelte/test/components/dialog/index.test.ts b/packages/skeleton-svelte/test/components/dialog/index.test.ts new file mode 100644 index 0000000000..078117d85e --- /dev/null +++ b/packages/skeleton-svelte/test/components/dialog/index.test.ts @@ -0,0 +1,48 @@ +import Test from './test.svelte'; +import { render, screen } from '@testing-library/svelte'; +import { describe, expect, it } from 'vitest'; + +describe('Dialog', () => { + describe('Trigger', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('trigger')).toBeInTheDocument(); + }); + }); + describe('Backdrop', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('backdrop')).toBeInTheDocument(); + }); + }); + describe('Positioner', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('positioner')).toBeInTheDocument(); + }); + }); + describe('Content', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('content')).toBeInTheDocument(); + }); + }); + describe('Title', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('title')).toBeInTheDocument(); + }); + }); + describe('Description', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('description')).toBeInTheDocument(); + }); + }); + describe('CloseTrigger', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('close-trigger')).toBeInTheDocument(); + }); + }); +}); diff --git a/packages/skeleton-svelte/test/components/dialog/test.svelte b/packages/skeleton-svelte/test/components/dialog/test.svelte new file mode 100644 index 0000000000..d7fe796422 --- /dev/null +++ b/packages/skeleton-svelte/test/components/dialog/test.svelte @@ -0,0 +1,15 @@ +<script lang="ts"> + import { Dialog } from '@/index'; +</script> + +<Dialog> + <Dialog.Trigger data-testid="trigger" /> + <Dialog.Backdrop data-testid="backdrop" /> + <Dialog.Positioner data-testid="positioner"> + <Dialog.Content data-testid="content"> + <Dialog.Title data-testid="title" /> + <Dialog.Description data-testid="description" /> + <Dialog.CloseTrigger data-testid="close-trigger" /> + </Dialog.Content> + </Dialog.Positioner> +</Dialog> diff --git a/packages/skeleton-svelte/test/components/file-upload/index.test.ts b/packages/skeleton-svelte/test/components/file-upload/index.test.ts new file mode 100644 index 0000000000..27a505a6ab --- /dev/null +++ b/packages/skeleton-svelte/test/components/file-upload/index.test.ts @@ -0,0 +1,68 @@ +import Test from './test.svelte'; +import { render, screen } from '@testing-library/svelte'; +import { describe, expect, it } from 'vitest'; + +describe('FileUpload', () => { + describe('Root', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('root')).toBeInTheDocument(); + }); + }); + + describe('Dropzone', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('dropzone')).toBeInTheDocument(); + }); + }); + + describe('Trigger', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('trigger')).toBeInTheDocument(); + }); + }); + + describe('ItemGroup', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('item-group')).toBeInTheDocument(); + }); + }); + + describe('Item', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('item')).toBeInTheDocument(); + }); + }); + + describe('ItemName', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('item-name')).toBeInTheDocument(); + }); + }); + + describe('ItemSizeText', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('item-size-text')).toBeInTheDocument(); + }); + }); + + describe('ItemDeleteTrigger', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('item-delete-trigger')).toBeInTheDocument(); + }); + }); + + describe('HiddenInput', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('hidden-input')).toBeInTheDocument(); + }); + }); +}); diff --git a/packages/skeleton-svelte/test/components/file-upload/test.svelte b/packages/skeleton-svelte/test/components/file-upload/test.svelte new file mode 100644 index 0000000000..40bc8254a1 --- /dev/null +++ b/packages/skeleton-svelte/test/components/file-upload/test.svelte @@ -0,0 +1,17 @@ +<script lang="ts"> + import { FileUpload } from '@/index'; +</script> + +<FileUpload data-testid="root"> + <FileUpload.Dropzone data-testid="dropzone"> + <FileUpload.Trigger data-testid="trigger" /> + <FileUpload.HiddenInput data-testid="hidden-input" /> + </FileUpload.Dropzone> + <FileUpload.ItemGroup data-testid="item-group"> + <FileUpload.Item file={new File(['test'], 'test.txt', { type: 'text/plain' })} data-testid="item"> + <FileUpload.ItemName data-testid="item-name" /> + <FileUpload.ItemSizeText data-testid="item-size-text" /> + <FileUpload.ItemDeleteTrigger data-testid="item-delete-trigger" /> + </FileUpload.Item> + </FileUpload.ItemGroup> +</FileUpload> diff --git a/packages/skeleton-svelte/test/components/popover/index.test.ts b/packages/skeleton-svelte/test/components/popover/index.test.ts new file mode 100644 index 0000000000..78116519d8 --- /dev/null +++ b/packages/skeleton-svelte/test/components/popover/index.test.ts @@ -0,0 +1,54 @@ +import Test from './test.svelte'; +import { render, screen } from '@testing-library/svelte'; +import { describe, expect, it } from 'vitest'; + +describe('Popover', () => { + describe('Trigger', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('trigger')).toBeInTheDocument(); + }); + }); + describe('Positioner', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('positioner')).toBeInTheDocument(); + }); + }); + describe('Content', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('content')).toBeInTheDocument(); + }); + }); + describe('Arrow', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('arrow')).toBeInTheDocument(); + }); + }); + describe('arrow tip', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('arrow-tip')).toBeInTheDocument(); + }); + }); + describe('Title', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('title')).toBeInTheDocument(); + }); + }); + describe('Description', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('description')).toBeInTheDocument(); + }); + }); + describe('close trigger', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('close-trigger')).toBeInTheDocument(); + }); + }); +}); diff --git a/packages/skeleton-svelte/test/components/popover/test.svelte b/packages/skeleton-svelte/test/components/popover/test.svelte new file mode 100644 index 0000000000..1b8c224fe3 --- /dev/null +++ b/packages/skeleton-svelte/test/components/popover/test.svelte @@ -0,0 +1,17 @@ +<script lang="ts"> + import { Popover } from '@/index'; +</script> + +<Popover> + <Popover.Trigger data-testid="trigger" /> + <Popover.Positioner data-testid="positioner"> + <Popover.Content data-testid="content"> + <Popover.Arrow data-testid="arrow"> + <Popover.ArrowTip data-testid="arrow-tip" /> + </Popover.Arrow> + <Popover.Title data-testid="title" /> + <Popover.Description data-testid="description" /> + <Popover.CloseTrigger data-testid="close-trigger" /> + </Popover.Content> + </Popover.Positioner> +</Popover> diff --git a/packages/skeleton-svelte/test/components/progress-linear/index.test.ts b/packages/skeleton-svelte/test/components/progress-linear/index.test.ts new file mode 100644 index 0000000000..ad8e15c987 --- /dev/null +++ b/packages/skeleton-svelte/test/components/progress-linear/index.test.ts @@ -0,0 +1,33 @@ +import Test from './test.svelte'; +import { render, screen } from '@testing-library/svelte'; +import { describe, expect, it } from 'vitest'; + +describe('ProgressLinear', () => { + describe('Root', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('root')).toBeInTheDocument(); + }); + }); + + describe('Label', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('label')).toBeInTheDocument(); + }); + }); + + describe('Track', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('track')).toBeInTheDocument(); + }); + }); + + describe('Range', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('range')).toBeInTheDocument(); + }); + }); +}); diff --git a/packages/skeleton-svelte/test/components/progress-linear/test.svelte b/packages/skeleton-svelte/test/components/progress-linear/test.svelte new file mode 100644 index 0000000000..b32853029c --- /dev/null +++ b/packages/skeleton-svelte/test/components/progress-linear/test.svelte @@ -0,0 +1,10 @@ +<script lang="ts"> + import { ProgressLinear } from '@/index'; +</script> + +<ProgressLinear data-testid="root"> + <ProgressLinear.Label data-testid="label" /> + <ProgressLinear.Track data-testid="track"> + <ProgressLinear.Range data-testid="range" /> + </ProgressLinear.Track> +</ProgressLinear> diff --git a/packages/skeleton-svelte/test/components/rating-group/index.test.ts b/packages/skeleton-svelte/test/components/rating-group/index.test.ts new file mode 100644 index 0000000000..49aa9be2b5 --- /dev/null +++ b/packages/skeleton-svelte/test/components/rating-group/index.test.ts @@ -0,0 +1,42 @@ +import Test from './test.svelte'; +import { render, screen } from '@testing-library/svelte'; +import { describe, expect, it } from 'vitest'; + +describe('RatingGroup', () => { + describe('Root', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('root')).toBeInTheDocument(); + }); + }); + + describe('Label', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('label')).toBeInTheDocument(); + }); + }); + + describe('Control', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('control')).toBeInTheDocument(); + }); + }); + + describe('Items', () => { + it('renders all items', () => { + render(Test); + expect(screen.getByTestId('item-1')).toBeInTheDocument(); + expect(screen.getByTestId('item-2')).toBeInTheDocument(); + expect(screen.getByTestId('item-3')).toBeInTheDocument(); + }); + }); + + describe('HiddenInput', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('hidden-input')).toBeInTheDocument(); + }); + }); +}); diff --git a/packages/skeleton-svelte/test/components/rating-group/test.svelte b/packages/skeleton-svelte/test/components/rating-group/test.svelte new file mode 100644 index 0000000000..c29a5324c1 --- /dev/null +++ b/packages/skeleton-svelte/test/components/rating-group/test.svelte @@ -0,0 +1,17 @@ +<script lang="ts"> + import { RatingGroup } from '@/index'; +</script> + +<RatingGroup count={3} data-testid="root"> + <RatingGroup.Label data-testid="label">Label</RatingGroup.Label> + <RatingGroup.Control data-testid="control"> + <RatingGroup.Context> + {#snippet children(ratingGroup)} + {#each ratingGroup().items as index (index)} + <RatingGroup.Item data-testid="item-{index}" {index} /> + {/each} + {/snippet} + </RatingGroup.Context> + </RatingGroup.Control> + <RatingGroup.HiddenInput data-testid="hidden-input" /> +</RatingGroup> diff --git a/packages/skeleton-svelte/test/components/segmented-control/index.test.ts b/packages/skeleton-svelte/test/components/segmented-control/index.test.ts new file mode 100644 index 0000000000..c32abe6bd0 --- /dev/null +++ b/packages/skeleton-svelte/test/components/segmented-control/index.test.ts @@ -0,0 +1,40 @@ +import Test from './test.svelte'; +import { render, screen } from '@testing-library/svelte'; +import { describe, expect, it } from 'vitest'; + +describe('SegmentedControl', () => { + describe('Root', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('root')).toBeInTheDocument(); + }); + }); + + describe('Indicator', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('indicator')).toBeInTheDocument(); + }); + }); + + describe('Item', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('item')).toBeInTheDocument(); + }); + }); + + describe('item text', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('item-text')).toBeInTheDocument(); + }); + }); + + describe('item hidden input', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('item-hidden-input')).toBeInTheDocument(); + }); + }); +}); diff --git a/packages/skeleton-svelte/test/components/segmented-control/test.svelte b/packages/skeleton-svelte/test/components/segmented-control/test.svelte new file mode 100644 index 0000000000..d6c8d84ed3 --- /dev/null +++ b/packages/skeleton-svelte/test/components/segmented-control/test.svelte @@ -0,0 +1,11 @@ +<script lang="ts"> + import { SegmentedControl } from '@/index'; +</script> + +<SegmentedControl data-testid="root"> + <SegmentedControl.Indicator data-testid="indicator" /> + <SegmentedControl.Item value="item-1" data-testid="item"> + <SegmentedControl.ItemText data-testid="item-text" /> + <SegmentedControl.ItemHiddenInput data-testid="item-hidden-input" /> + </SegmentedControl.Item> +</SegmentedControl> diff --git a/packages/skeleton-svelte/test/components/slider/index.test.tsx b/packages/skeleton-svelte/test/components/slider/index.test.tsx new file mode 100644 index 0000000000..2a1d6c725f --- /dev/null +++ b/packages/skeleton-svelte/test/components/slider/index.test.tsx @@ -0,0 +1,75 @@ +import Test from './test.svelte'; +import { render, screen } from '@testing-library/svelte'; +import { describe, expect, it } from 'vitest'; + +describe('Slider', () => { + describe('Root', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('root')).toBeInTheDocument(); + }); + }); + + describe('Label', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('label')).toBeInTheDocument(); + }); + }); + + describe('value text', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('value-text')).toBeInTheDocument(); + }); + }); + + describe('Control', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('control')).toBeInTheDocument(); + }); + }); + + describe('Track', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('track')).toBeInTheDocument(); + }); + }); + + describe('Range', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('range')).toBeInTheDocument(); + }); + }); + + describe('Thumb', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('thumb')).toBeInTheDocument(); + }); + }); + + describe('hidden input', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('hidden-input')).toBeInTheDocument(); + }); + }); + + describe('marker group', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('marker-group')).toBeInTheDocument(); + }); + }); + + describe('Marker', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('marker')).toBeInTheDocument(); + }); + }); +}); diff --git a/packages/skeleton-svelte/test/components/slider/test.svelte b/packages/skeleton-svelte/test/components/slider/test.svelte new file mode 100644 index 0000000000..734b37dde7 --- /dev/null +++ b/packages/skeleton-svelte/test/components/slider/test.svelte @@ -0,0 +1,19 @@ +<script lang="ts"> + import { Slider } from '@skeletonlabs/skeleton-svelte'; +</script> + +<Slider data-testid="root"> + <Slider.Label data-testid="label" /> + <Slider.ValueText data-testid="value-text" /> + <Slider.Control data-testid="control"> + <Slider.Track data-testid="track"> + <Slider.Range data-testid="range" /> + </Slider.Track> + <Slider.Thumb index={0} data-testid="thumb"> + <Slider.HiddenInput data-testid="hidden-input" /> + </Slider.Thumb> + </Slider.Control> + <Slider.MarkerGroup data-testid="marker-group"> + <Slider.Marker value={0} data-testid="marker" /> + </Slider.MarkerGroup> +</Slider> diff --git a/packages/skeleton-svelte/test/components/switch/index.test.ts b/packages/skeleton-svelte/test/components/switch/index.test.ts new file mode 100644 index 0000000000..d3300ec7ba --- /dev/null +++ b/packages/skeleton-svelte/test/components/switch/index.test.ts @@ -0,0 +1,40 @@ +import Test from './test.svelte'; +import { render, screen } from '@testing-library/svelte'; +import { describe, expect, it } from 'vitest'; + +describe('Switch', () => { + describe('Root', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('root')).toBeInTheDocument(); + }); + }); + + describe('hidden input', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('hidden-input')).toBeInTheDocument(); + }); + }); + + describe('Control', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('control')).toBeInTheDocument(); + }); + }); + + describe('Thumb', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('thumb')).toBeInTheDocument(); + }); + }); + + describe('Label', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('label')).toBeInTheDocument(); + }); + }); +}); diff --git a/packages/skeleton-svelte/test/components/switch/test.svelte b/packages/skeleton-svelte/test/components/switch/test.svelte new file mode 100644 index 0000000000..9383da2600 --- /dev/null +++ b/packages/skeleton-svelte/test/components/switch/test.svelte @@ -0,0 +1,11 @@ +<script lang="ts"> + import { Switch } from '@/index'; +</script> + +<Switch data-testid="root"> + <Switch.HiddenInput data-testid="hidden-input" /> + <Switch.Control data-testid="control"> + <Switch.Thumb data-testid="thumb" /> + </Switch.Control> + <Switch.Label data-testid="label" /> +</Switch> diff --git a/packages/skeleton-svelte/test/components/tabs/index.test.ts b/packages/skeleton-svelte/test/components/tabs/index.test.ts new file mode 100644 index 0000000000..1d35847807 --- /dev/null +++ b/packages/skeleton-svelte/test/components/tabs/index.test.ts @@ -0,0 +1,40 @@ +import Test from './test.svelte'; +import { render, screen } from '@testing-library/svelte'; +import { describe, expect, it } from 'vitest'; + +describe('Tabs', () => { + describe('Root', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('root')).toBeInTheDocument(); + }); + }); + + describe('List', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('list')).toBeInTheDocument(); + }); + }); + + describe('Trigger', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('trigger')).toBeInTheDocument(); + }); + }); + + describe('Indicator', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('indicator')).toBeInTheDocument(); + }); + }); + + describe('Content', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('content')).toBeInTheDocument(); + }); + }); +}); diff --git a/packages/skeleton-svelte/test/components/tabs/test.svelte b/packages/skeleton-svelte/test/components/tabs/test.svelte new file mode 100644 index 0000000000..d361dda0c1 --- /dev/null +++ b/packages/skeleton-svelte/test/components/tabs/test.svelte @@ -0,0 +1,11 @@ +<script lang="ts"> + import { Tabs } from '@/index'; +</script> + +<Tabs data-testid="root"> + <Tabs.List data-testid="list"> + <Tabs.Trigger value="tab" data-testid="trigger" /> + <Tabs.Indicator data-testid="indicator" /> + </Tabs.List> + <Tabs.Content value="tab" data-testid="content" /> +</Tabs> diff --git a/packages/skeleton-svelte/test/components/tags-input/index.test.tsx b/packages/skeleton-svelte/test/components/tags-input/index.test.tsx new file mode 100644 index 0000000000..65e7591051 --- /dev/null +++ b/packages/skeleton-svelte/test/components/tags-input/index.test.tsx @@ -0,0 +1,82 @@ +import Test from './test.svelte'; +import { render, screen } from '@testing-library/svelte'; +import { describe, expect, it } from 'vitest'; + +describe('TagsInput', () => { + describe('Root', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('root')).toBeInTheDocument(); + }); + }); + + describe('Label', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('label')).toBeInTheDocument(); + }); + }); + + describe('Control', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('control')).toBeInTheDocument(); + }); + }); + + describe('Item', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('item')).toBeInTheDocument(); + }); + }); + + describe('item preview', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('item-preview')).toBeInTheDocument(); + }); + }); + + describe('item text', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('item-text')).toBeInTheDocument(); + }); + }); + + describe('item delete trigger', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('item-delete-trigger')).toBeInTheDocument(); + }); + }); + + describe('item input', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('item-input')).toBeInTheDocument(); + }); + }); + + describe('Input', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('input')).toBeInTheDocument(); + }); + }); + + describe('clear trigger', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('clear-trigger')).toBeInTheDocument(); + }); + }); + + describe('hidden input', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('hidden-input')).toBeInTheDocument(); + }); + }); +}); diff --git a/packages/skeleton-svelte/test/components/tags-input/test.svelte b/packages/skeleton-svelte/test/components/tags-input/test.svelte new file mode 100644 index 0000000000..5d4360dd5e --- /dev/null +++ b/packages/skeleton-svelte/test/components/tags-input/test.svelte @@ -0,0 +1,19 @@ +<script lang="ts"> + import { TagsInput } from '@/index'; +</script> + +<TagsInput data-testid="root"> + <TagsInput.Label data-testid="label" /> + <TagsInput.Control data-testid="control"> + <TagsInput.Item index={1} value="test" data-testid="item"> + <TagsInput.ItemPreview data-testid="item-preview"> + <TagsInput.ItemText data-testid="item-text" /> + <TagsInput.ItemDeleteTrigger data-testid="item-delete-trigger" /> + </TagsInput.ItemPreview> + <TagsInput.ItemInput data-testid="item-input" /> + </TagsInput.Item> + </TagsInput.Control> + <TagsInput.Input data-testid="input" /> + <TagsInput.ClearTrigger data-testid="clear-trigger" /> + <TagsInput.HiddenInput data-testid="hidden-input" /> +</TagsInput> diff --git a/packages/skeleton-svelte/test/components/toast/index.test.ts b/packages/skeleton-svelte/test/components/toast/index.test.ts new file mode 100644 index 0000000000..0ed4228533 --- /dev/null +++ b/packages/skeleton-svelte/test/components/toast/index.test.ts @@ -0,0 +1,57 @@ +import Test from './test.svelte'; +import { render, screen, waitFor } from '@testing-library/svelte'; +import { describe, expect, it } from 'vitest'; + +describe('Toast', () => { + describe('Group', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('group')).toBeInTheDocument(); + }); + }); + + describe('Root', () => { + it('renders', async () => { + render(Test); + await waitFor(() => { + expect(screen.getByTestId('root')).toBeInTheDocument(); + }); + }); + }); + + describe('Title', () => { + it('renders', async () => { + render(Test); + await waitFor(() => { + expect(screen.getByTestId('title')).toBeInTheDocument(); + }); + }); + }); + + describe('Description', () => { + it('renders', async () => { + render(Test); + await waitFor(() => { + expect(screen.getByTestId('description')).toBeInTheDocument(); + }); + }); + }); + + describe('action trigger', () => { + it('renders', async () => { + render(Test); + await waitFor(() => { + expect(screen.getByTestId('action-trigger')).toBeInTheDocument(); + }); + }); + }); + + describe('close trigger', () => { + it('renders', async () => { + render(Test); + await waitFor(() => { + expect(screen.getByTestId('close-trigger')).toBeInTheDocument(); + }); + }); + }); +}); diff --git a/packages/skeleton-svelte/test/components/toast/test.svelte b/packages/skeleton-svelte/test/components/toast/test.svelte new file mode 100644 index 0000000000..d416418ade --- /dev/null +++ b/packages/skeleton-svelte/test/components/toast/test.svelte @@ -0,0 +1,20 @@ +<script lang="ts"> + import { Toast, createToaster } from '@/index'; + + const toaster = createToaster({}); + + $effect(() => { + toaster.create({}); + }); +</script> + +<Toast.Group {toaster} data-testid="group"> + {#snippet children(toast)} + <Toast {toast} data-testid="root"> + <Toast.Title data-testid="title" /> + <Toast.Description data-testid="description" /> + <Toast.ActionTrigger data-testid="action-trigger" /> + <Toast.CloseTrigger data-testid="close-trigger" /> + </Toast> + {/snippet} +</Toast.Group> diff --git a/packages/skeleton-svelte/test/components/tooltip/index.test.ts b/packages/skeleton-svelte/test/components/tooltip/index.test.ts new file mode 100644 index 0000000000..7bf0487e7d --- /dev/null +++ b/packages/skeleton-svelte/test/components/tooltip/index.test.ts @@ -0,0 +1,30 @@ +import Test from './test.svelte'; +import { render, screen } from '@testing-library/svelte'; +import { describe, expect, it } from 'vitest'; + +describe('Tooltip', () => { + describe('Trigger', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('trigger')).toBeInTheDocument(); + }); + }); + describe('Positioner', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('positioner')).toBeInTheDocument(); + }); + }); + describe('Arrow', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('arrow')).toBeInTheDocument(); + }); + }); + describe('arrow tip', () => { + it('renders', () => { + render(Test); + expect(screen.getByTestId('arrow-tip')).toBeInTheDocument(); + }); + }); +}); diff --git a/packages/skeleton-svelte/test/components/tooltip/test.svelte b/packages/skeleton-svelte/test/components/tooltip/test.svelte new file mode 100644 index 0000000000..12a47e7424 --- /dev/null +++ b/packages/skeleton-svelte/test/components/tooltip/test.svelte @@ -0,0 +1,14 @@ +<script lang="ts"> + import { Tooltip } from '@/index'; +</script> + +<Tooltip> + <Tooltip.Trigger data-testid="trigger" /> + <Tooltip.Positioner data-testid="positioner"> + <Tooltip.Content> + <Tooltip.Arrow data-testid="arrow"> + <Tooltip.ArrowTip data-testid="arrow-tip" /> + </Tooltip.Arrow> + </Tooltip.Content> + </Tooltip.Positioner> +</Tooltip> diff --git a/packages/skeleton-svelte/test/setup.ts b/packages/skeleton-svelte/test/setup.ts new file mode 100644 index 0000000000..5c459ba8a7 --- /dev/null +++ b/packages/skeleton-svelte/test/setup.ts @@ -0,0 +1,11 @@ +import '@testing-library/jest-dom/vitest'; +import { vi } from 'vitest'; + +vi.stubGlobal( + 'ResizeObserver', + vi.fn(() => ({ + observe: vi.fn(), + unobserve: vi.fn(), + disconnect: vi.fn(), + })), +); diff --git a/packages/skeleton-svelte/tsconfig.json b/packages/skeleton-svelte/tsconfig.json new file mode 100644 index 0000000000..9b5bb3253c --- /dev/null +++ b/packages/skeleton-svelte/tsconfig.json @@ -0,0 +1,26 @@ +{ + "extends": "./.svelte-kit/tsconfig.json", + "compilerOptions": { + "esModuleInterop": true, + "skipLibCheck": true, + "target": "es2022", + "allowJs": true, + "resolveJsonModule": true, + "moduleDetection": "force", + "isolatedModules": true, + "verbatimModuleSyntax": true, + "strict": true, + "noUncheckedIndexedAccess": true, + "noImplicitOverride": true, + "declaration": true, + "declarationMap": true, + "module": "preserve", + "noEmit": true, + "lib": ["es2022", "dom", "dom.iterable"], + "types": ["@testing-library/jest-dom/vitest"], + "paths": { + "@/*": ["./src/*"] + } + }, + "include": ["src", "test"] +} diff --git a/packages/skeleton-svelte/vite.config.ts b/packages/skeleton-svelte/vite.config.ts new file mode 100644 index 0000000000..08ecc6242e --- /dev/null +++ b/packages/skeleton-svelte/vite.config.ts @@ -0,0 +1,17 @@ +import { svelte } from '@sveltejs/vite-plugin-svelte'; +import { svelteTesting } from '@testing-library/svelte/vite'; +import { resolve } from 'node:path'; +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + plugins: [svelte(), svelteTesting()], + resolve: { + alias: { + '@': resolve(__dirname, 'src'), + }, + }, + test: { + environment: 'jsdom', + setupFiles: './test/setup.ts', + }, +}); diff --git a/packages/skeleton/CHANGELOG.md b/packages/skeleton/CHANGELOG.md new file mode 100644 index 0000000000..3a9d9a3a11 --- /dev/null +++ b/packages/skeleton/CHANGELOG.md @@ -0,0 +1,247 @@ +# @skeletonlabs/skeleton + +## 4.0.0-next.6 + +### Patch Changes + +- chore: update readme ([#3805](https://github.com/skeletonlabs/skeleton/pull/3805)) + +## 4.0.0-next.5 + +### Patch Changes + +- chore: trusted publishing ([#3792](https://github.com/skeletonlabs/skeleton/pull/3792)) + +## 4.0.0-next.4 + +### Patch Changes + +- fix: replace `all` with dedicated transition properties on `btn` utility ([#3773](https://github.com/skeletonlabs/skeleton/pull/3773)) + +## 4.0.0-next.3 + +### Patch Changes + +- fix: disable hover styles for `btn` when `disabled` ([#3757](https://github.com/skeletonlabs/skeleton/pull/3757)) + +## 4.0.0-next.2 + +### Minor Changes + +- feat: merge optional `preset` styles into core ([#3714](https://github.com/skeletonlabs/skeleton/pull/3714)) + +### Patch Changes + +- feat: progress-linear ([#3694](https://github.com/skeletonlabs/skeleton/pull/3694)) + +## 4.0.0-next.1 + +### Major Changes + +- feat: v4 preperation ([#3662](https://github.com/skeletonlabs/skeleton/pull/3662)) + +## 3.3.0-next.0 + +### Minor Changes + +- feat: Add framework package `@source` rules to remove the need for users to explicitely add these ([#3656](https://github.com/skeletonlabs/skeleton/pull/3656)) + +## 3.2.0 + +### Minor Changes + +- feat: add `skb` (`skeleton-base`) Tailwind variant ([#3491](https://github.com/skeletonlabs/skeleton/pull/3491)) + +## 3.1.8 + +### Patch Changes + +- bugfix: Added missing child border-radii to input group ([#3630](https://github.com/skeletonlabs/skeleton/pull/3630)) + +## 3.1.7 + +### Patch Changes + +- bugfix: Adjust selector for global placeholder styling ([#3608](https://github.com/skeletonlabs/skeleton/pull/3608)) + +## 3.1.6 + +### Patch Changes + +- bugfix: Set universal input placeholder to ensure consistent coloring ([#3606](https://github.com/skeletonlabs/skeleton/pull/3606)) + +## 3.1.5 + +### Patch Changes + +- bugfix: Remove unnecessary loop in `preset.scss` ([#3593](https://github.com/skeletonlabs/skeleton/pull/3593)) + +## 3.1.4 + +### Patch Changes + +- bugfix: Allow thumb to slide full length in range slider for all browsers ([#3566](https://github.com/skeletonlabs/skeleton/pull/3566)) + +## 3.1.3 + +### Patch Changes + +- Remove Color input border in Firefox ([#3530](https://github.com/skeletonlabs/skeleton/pull/3530)) + +## 3.1.2 + +### Patch Changes + +- bugfix: Input Group select updated to match checked state ([#3454](https://github.com/skeletonlabs/skeleton/pull/3454)) + +## 3.1.1 + +### Patch Changes + +- fix: apply card hover style correctly ([#3449](https://github.com/skeletonlabs/skeleton/pull/3449)) + +- bugfix: Adjust Input Group styles to match individual elements ([#3446](https://github.com/skeletonlabs/skeleton/pull/3446)) + +- bugfix: Resolve issue with Select arrows overlapping text ([#3445](https://github.com/skeletonlabs/skeleton/pull/3445)) + +- fix: add missing core utilities ([#3442](https://github.com/skeletonlabs/skeleton/pull/3442)) + +- fix: add back transparency for selection color ([#3433](https://github.com/skeletonlabs/skeleton/pull/3433)) + +- bugfix: Remove redundant styling for selected `option` in `select` elements ([#3422](https://github.com/skeletonlabs/skeleton/pull/3422)) + +## 3.1.0 + +### Minor Changes + +- feat: `mark` utility ([#3408](https://github.com/skeletonlabs/skeleton/pull/3408)) + +## 3.0.0 + +### Minor Changes + +- chore: Updated to the latest dependencies ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- Feature: Added radial and conic gradient support ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +### Patch Changes + +- chore: Restore Button and Chip default hover states ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- chore: Modified default styles based on theme gen improvements ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- bugfix: fix css property typo in form-groups classes ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- bugfix: Resolved a number of small display issues with Input Groups ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- feature: Added a `contentPath` utility function for tailwind content paths ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- Fix conflicting build artifacts ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- chore: Improved button hover state brightness effect ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- bugfix: Resolve an issue causing a white flash when selecting inputs. ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- feat: Tailwind v4 ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- All Skeleton components have been updated to integrate Zag.js. This contains a number of breaking component API changes. Updates all documentation. And includes new CSS animations in the Tailwind plugin. ([More Information](https://github.com/skeletonlabs/skeleton/discussions/2784)) ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- chore: Moved Prettier and ESLint to repo root, updated formatting, and rectified linting issues ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- fix: add `string` type to `contentPath` args ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- chore: Improved global and per component focus state styles ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +- chore: Style improvements for Buttons, Badges, Chips, and Form elements ([#3367](https://github.com/skeletonlabs/skeleton/pull/3367)) + +## 3.0.0-next.13 + +### Patch Changes + +- chore: Restore Button and Chip default hover states ([#3331](https://github.com/skeletonlabs/skeleton/pull/3331)) + +- bugfix: Resolved a number of small display issues with Input Groups ([#3332](https://github.com/skeletonlabs/skeleton/pull/3332)) + +- chore: Style improvements for Buttons, Badges, Chips, and Form elements ([#3345](https://github.com/skeletonlabs/skeleton/pull/3345)) + +## 3.0.0-next.12 + +### Patch Changes + +- bugfix: fix css property typo in form-groups classes ([#3283](https://github.com/skeletonlabs/skeleton/pull/3283)) + +## 3.0.0-next.11 + +### Patch Changes + +- feat: Tailwind v4 ([#3189](https://github.com/skeletonlabs/skeleton/pull/3189)) + +## 3.0.0-next.10 + +### Patch Changes + +- chore: Improved button hover state brightness effect ([#3050](https://github.com/skeletonlabs/skeleton/pull/3050)) + +## 3.0.0-next.9 + +### Patch Changes + +- fix: add `string` type to `contentPath` args ([#2954](https://github.com/skeletonlabs/skeleton/pull/2954)) + +## 3.0.0-next.8 + +### Patch Changes + +- feature: Added a `contentPath` utility function for tailwind content paths ([#2949](https://github.com/skeletonlabs/skeleton/pull/2949)) + +## 3.0.0-next.7 + +### Patch Changes + +- Fix conflicting build artifacts ([#2931](https://github.com/skeletonlabs/skeleton/pull/2931)) + +## 3.0.0-next.6 + +### Minor Changes + +- chore: Updated to the latest dependencies ([#2892](https://github.com/skeletonlabs/skeleton/pull/2892)) + +## 3.0.0-next.5 + +### Patch Changes + +- chore: Modified default styles based on theme gen improvements ([#2852](https://github.com/skeletonlabs/skeleton/pull/2852)) + +## 3.0.0-next.4 + +### Patch Changes + +- chore: Improved global and per component focus state styles ([#2825](https://github.com/skeletonlabs/skeleton/pull/2825)) + +## 3.0.0-next.3 + +### Patch Changes + +- All Skeleton components have been updated to integrate Zag.js. This contains a number of breaking component API changes. Updates all documentation. And includes new CSS animations in the Tailwind plugin. ([More Information](https://github.com/skeletonlabs/skeleton/discussions/2784)) ([#2778](https://github.com/skeletonlabs/skeleton/pull/2778)) + +## 3.0.0-next.2 + +### Patch Changes + +- Chore: Moved Prettier and ESLint to repo root, updated formatting, and rectified linting issues ([#2723](https://github.com/skeletonlabs/skeleton/pull/2723)) + +## 3.0.0-next.1 + +### Minor Changes + +- Feature: Added radial and conic gradient support ([#2694](https://github.com/skeletonlabs/skeleton/pull/2694)) + +### Patch Changes + +- bugfix: Resolve an issue causing a white flash when selecting inputs. ([#2690](https://github.com/skeletonlabs/skeleton/pull/2690)) + +## 3.0.0-next.0 + +### Major Changes + +- Enter pre-release mode ([#2668](https://github.com/skeletonlabs/skeleton/pull/2668)) diff --git a/packages/skeleton/README.md b/packages/skeleton/README.md new file mode 100644 index 0000000000..462b7bdf40 --- /dev/null +++ b/packages/skeleton/README.md @@ -0,0 +1,11 @@ +# Skeleton + +## Installation + +```bash +pnpm add @skeletonlabs/skeleton +``` + +## Documentation + +Explore the full documentation at [skeleton.dev](https://skeleton.dev/). diff --git a/packages/skeleton/package.json b/packages/skeleton/package.json new file mode 100644 index 0000000000..3d793e3d16 --- /dev/null +++ b/packages/skeleton/package.json @@ -0,0 +1,39 @@ +{ + "name": "@skeletonlabs/skeleton", + "version": "4.0.0-next.6", + "description": "The TailwindCSS package for Skeleton.", + "author": "endigo9740 <chris@skeletonlabs.dev>", + "repository": { + "type": "git", + "url": "git+https://github.com/skeletonlabs/skeleton.git", + "directory": "packages/skeleton" + }, + "scripts": { + "dev": "vite build --watch", + "build": "vite build", + "sync": "pnpm build" + }, + "exports": { + ".": { + "style": "./dist/index.css", + "default": "./dist/index.css" + }, + "./themes/*": { + "style": "./dist/themes/*.css", + "default": "./dist/themes/*.css" + } + }, + "files": [ + "dist" + ], + "peerDependencies": { + "tailwindcss": "^4.0.0" + }, + "devDependencies": { + "sass-embedded": "catalog:", + "tinyglobby": "catalog:", + "vite": "catalog:" + }, + "license": "MIT", + "type": "module" +} diff --git a/packages/skeleton/src/base/globals.css b/packages/skeleton/src/base/globals.css new file mode 100644 index 0000000000..f1bb60182a --- /dev/null +++ b/packages/skeleton/src/base/globals.css @@ -0,0 +1,96 @@ +/* Base - Globals */ +/* Global styles that are enabled by default. */ + +@layer base { + :root { + /* Color Scheme --- */ + /* https://tailwindcss.com/docs/color-scheme */ + color-scheme: light; + @variant dark { + color-scheme: dark; + } + + /* Scrollbars --- */ + /* https://developer.mozilla.org/en-US/docs/Web/CSS/scrollbar-color */ + /* https://developer.chrome.com/docs/css-ui/scrollbar-styling */ + scrollbar-color: var(--color-surface-300-700) var(--color-surface-100-900); /* thumb / track */ + scrollbar-width: thin; + } + + html { + /* Mobile Tap Highlight Color (WebKit only) --- */ + /* IMPORTANT: this is useful for mobile accessibility. */ + /* https://developer.mozilla.org/en-US/docs/Web/CSS/-webkit-tap-highlight-color */ + /* -webkit-tap-highlight-color: rgba(128, 128, 128, 0.5); */ + -webkit-tap-highlight-color: color-mix(in oklab, var(--color-primary-500) 30%, transparent); + } + + body { + /* Background */ + background-color: var(--body-background-color); + @variant dark { + background-color: var(--body-background-color-dark); + } + /* Typography */ + color: var(--base-font-color); + font-family: var(--base-font-family); + font-size: var(--base-font-size); + line-height: var(--base-line-height); + font-weight: var(--base-font-weight); + font-style: var(--base-font-style); + letter-spacing: var(--base-letter-spacing); + @variant dark { + color: var(--base-font-color-dark); + } + } + + /* Elements --- */ + + /* https://tailwindcss.com/docs/upgrade-guide#buttons-use-the-default-cursor */ + button:not(:disabled), + [role='button']:not(:disabled) { + cursor: pointer; + } + + /* Form Placeholders --- */ + + .input::placeholder, + .textarea::placeholder, + .ig-input::placeholder, + .ig-textarea::placeholder { + color: var(--color-surface-700-300); + } + + /* Selection --- */ + /* https://developer.mozilla.org/en-US/docs/Web/CSS/::selection */ + + ::selection { + background-color: color-mix(in srgb, var(--color-primary-500) 50%, transparent); + } + + /* States --- */ + + *:disabled, + .disabled { + opacity: 0.5; + & > * { + pointer-events: none; + } + } + + /* Outlines and Focus --- */ + /* + REMINDER: Never disabled focus and outlines + as this would be harmful to accessibility! + Source: http://www.outlinenone.com/ + + EXAMPLE: Set a global focus style. + Apply this in your app's global stylesheet: + :focus { @apply focus:outline-primary-50; } + */ + + /* Component Focus Utility */ + /* .focused { + @apply ring-[2px] ring-surface-950 dark:ring-surface-50 ring-inset; + } */ +} diff --git a/packages/skeleton/src/base/index.css b/packages/skeleton/src/base/index.css new file mode 100644 index 0000000000..5e7b6fa478 --- /dev/null +++ b/packages/skeleton/src/base/index.css @@ -0,0 +1,5 @@ +/* Note that the order of import matters. */ +/* Do not change this unless prompted to. */ + +@import './globals.css'; +@import './theme.scss'; diff --git a/packages/skeleton/src/base/theme.scss b/packages/skeleton/src/base/theme.scss new file mode 100644 index 0000000000..c7d359571f --- /dev/null +++ b/packages/skeleton/src/base/theme.scss @@ -0,0 +1,137 @@ +/* Base - Theme */ +/* Configure the default @theme settings. */ + +@use '../constants.scss'; +@use 'sass:list'; + +@theme { + /* Spacing --- */ + + /* https://tailwindcss.com/docs/functions-and-directives#spacing-function */ + --spacing: 0.25rem; + + /* Typography --- */ + + --text-scaling: 1; + /* --- */ + --base-font-color: inherit; + --base-font-color-dark: inherit; + --base-font-family: inherit; + --base-font-size: inherit; + --base-line-height: inherit; + --base-font-weight: inherit; + --base-font-style: inherit; + --base-letter-spacing: inherit; + /* --- */ + --heading-font-color: inherit; + --heading-font-color-dark: inherit; + --heading-font-family: inherit; + --heading-font-weight: inherit; + --heading-font-style: inherit; + --heading-letter-spacing: inherit; + /* --- */ + --anchor-font-color: inherit; + --anchor-font-color-dark: inherit; + --anchor-font-family: inherit; + --anchor-font-size: inherit; + --anchor-line-height: inherit; + --anchor-font-weight: inherit; + --anchor-font-style: inherit; + --anchor-letter-spacing: inherit; + --anchor-text-decoration: inherit; + --anchor-text-decoration-hover: underline; + --anchor-text-decoration-active: inherit; + --anchor-text-decoration-focus: inherit; + + /* Radius --- */ + + --radius-base: 0.25rem; + --radius-container: 0.25rem; + + /* Edges --- */ + + --default-border-width: 1px; + --default-divide-width: 1px; + --default-ring-width: 1px; + + /* Animations --- */ + + --animate-progress-indeterminate-horz: anim-progress-indeterminate-horz 2s linear infinite; + --animate-progress-indeterminate-vert: anim-progress-indeterminate-vert 2s linear infinite; + --animate-ring-indeterminate: anim-ring-indeterminate 2s linear infinite; + + /* Colors --- */ + + @each $name in constants.$color-names { + @for $i from 1 through list.length(constants.$color-shades) { + $shade: list.nth(constants.$color-shades, $i); + --color-#{$name}-#{$shade}: #{list.nth(constants.$color-ramp, $i)}; + } + + --color-#{$name}-contrast-dark: var(--color-#{$name}-950); + --color-#{$name}-contrast-light: var(--color-#{$name}-50); + + --color-#{$name}-contrast-50: var(--color-#{$name}-contrast-dark); + --color-#{$name}-contrast-100: var(--color-#{$name}-contrast-dark); + --color-#{$name}-contrast-200: var(--color-#{$name}-contrast-dark); + --color-#{$name}-contrast-300: var(--color-#{$name}-contrast-dark); + --color-#{$name}-contrast-400: var(--color-#{$name}-contrast-light); + --color-#{$name}-contrast-500: var(--color-#{$name}-contrast-light); + --color-#{$name}-contrast-600: var(--color-#{$name}-contrast-light); + --color-#{$name}-contrast-700: var(--color-#{$name}-contrast-light); + --color-#{$name}-contrast-800: var(--color-#{$name}-contrast-light); + --color-#{$name}-contrast-900: var(--color-#{$name}-contrast-light); + --color-#{$name}-contrast-950: var(--color-#{$name}-contrast-light); + } +} + +@theme inline { + /* Backgrounds --- */ + + --body-background-color: var(--color-surface-50); + --body-background-color-dark: var(--color-surface-950); + + /* Color Pairings --- */ + /* https://github.com/tailwindlabs/tailwindcss/discussions/16292#discussioncomment-12076534 */ + + @each $name in constants.$color-names { + @each $pairing in constants.$color-pairings { + $light: list.nth($pairing, 1); + $dark: list.nth($pairing, 2); + --color-#{$name}-#{$light}-#{$dark}: light-dark(var(--color-#{$name}-#{$light}), var(--color-#{$name}-#{$dark})); + --color-#{$name}-contrast-#{$light}-#{$dark}: light-dark( + var(--color-#{$name}-contrast-#{$light}), + var(--color-#{$name}-contrast-#{$dark}) + ); + } + } + + /* Typography --- */ + + --text-xs: calc(0.75rem * var(--text-scaling)); + --text-xs--line-height: calc(calc(1 / 0.75) * var(--text-scaling)); + --text-sm: calc(0.875rem * var(--text-scaling)); + --text-sm--line-height: calc(calc(1.25 / 0.875) * var(--text-scaling)); + --text-base: calc(1rem * var(--text-scaling)); + --text-base--line-height: calc(calc(1.5 / 1) * var(--text-scaling)); + --text-lg: calc(1.125rem * var(--text-scaling)); + --text-lg--line-height: calc(calc(1.75 / 1.125) * var(--text-scaling)); + --text-xl: calc(1.25rem * var(--text-scaling)); + --text-xl--line-height: calc(calc(1.75 / 1.25) * var(--text-scaling)); + --text-2xl: calc(1.5rem * var(--text-scaling)); + --text-2xl--line-height: calc(calc(2 / 1.5) * var(--text-scaling)); + --text-3xl: calc(1.875rem * var(--text-scaling)); + --text-3xl--line-height: calc(calc(2.25 / 1.875) * var(--text-scaling)); + --text-4xl: calc(2.25rem * var(--text-scaling)); + --text-4xl--line-height: calc(calc(2.5 / 2.25) * var(--text-scaling)); + --text-5xl: calc(3rem * var(--text-scaling)); + --text-5xl--line-height: calc(1 * var(--text-scaling)); + --text-6xl: calc(3.75rem * var(--text-scaling)); + --text-6xl--line-height: calc(1 * var(--text-scaling)); + --text-7xl: calc(4.5rem * var(--text-scaling)); + --text-7xl--line-height: calc(1 * var(--text-scaling)); + --text-8xl: calc(6rem * var(--text-scaling)); + --text-8xl--line-height: calc(1 * var(--text-scaling)); + --text-9xl: calc(8rem * var(--text-scaling)); + --text-9xl--line-height: calc(1 * var(--text-scaling)); +} diff --git a/packages/skeleton/src/constants.scss b/packages/skeleton/src/constants.scss new file mode 100644 index 0000000000..3c86cffd81 --- /dev/null +++ b/packages/skeleton/src/constants.scss @@ -0,0 +1,47 @@ +// Constants + +/* Colors --- */ + +$color-names: (primary, secondary, tertiary, success, warning, error, surface); +$color-shades: (50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950); +$color-pairings: ((50, 950), (100, 900), (200, 800), (300, 700), (400, 600), (600, 400), (700, 300), (800, 200), (900, 100), (950, 50)); +$color-ramp: ( + oklch(0.985 0 0), + oklch(0.97 0 0), + oklch(0.922 0 0), + oklch(0.87 0 0), + oklch(0.708 0 0), + oklch(0.556 0 0), + oklch(0.439 0 0), + oklch(0.371 0 0), + oklch(0.269 0 0), + oklch(0.205 0 0), + oklch(0.145 0 0) +); + +/* Themes --- */ + +$themes: ( + 'catppuccin', + 'cerberus', + 'concord', + 'fennec', + 'mint', + 'mona', + 'nosh', + 'pine', + 'reign', + 'rose', + 'terminus', + 'vox', + 'crimson', + 'hamlindigo', + 'legacy', + 'modern', + 'nouveau', + 'rocket', + 'sahara', + 'seafoam', + 'vintage', + 'wintry' +); diff --git a/packages/skeleton/src/index.css b/packages/skeleton/src/index.css new file mode 100644 index 0000000000..d7051e5290 --- /dev/null +++ b/packages/skeleton/src/index.css @@ -0,0 +1,7 @@ +/* Note that the order of import matters. */ +/* Do not change this unless prompted to. */ + +@import './base/index.css'; +@import './utilities/index.css'; +@import './variants/index.css'; +@import './keyframes/index.css'; diff --git a/packages/skeleton/src/keyframes/index.css b/packages/skeleton/src/keyframes/index.css new file mode 100644 index 0000000000..dc26058ce6 --- /dev/null +++ b/packages/skeleton/src/keyframes/index.css @@ -0,0 +1,2 @@ +@import './progress-indeterminate.css'; +@import './ring-indeterminate.css'; diff --git a/packages/skeleton/src/keyframes/progress-indeterminate.css b/packages/skeleton/src/keyframes/progress-indeterminate.css new file mode 100644 index 0000000000..dc4105178d --- /dev/null +++ b/packages/skeleton/src/keyframes/progress-indeterminate.css @@ -0,0 +1,22 @@ +/* Components: Keyframe - Progress Indeterminate */ +/* NOTE: only for use in the progress bar functional component. */ + +/* Horizontal */ +@keyframes anim-progress-indeterminate-horz { + from { + transform: translateX(-200%); + } + to { + transform: translateX(200%); + } +} + +/* Vertical */ +@keyframes anim-progress-indeterminate-vert { + from { + transform: translateY(-200%); + } + to { + transform: translateY(200%); + } +} diff --git a/packages/skeleton/src/keyframes/ring-indeterminate.css b/packages/skeleton/src/keyframes/ring-indeterminate.css new file mode 100644 index 0000000000..69202dff29 --- /dev/null +++ b/packages/skeleton/src/keyframes/ring-indeterminate.css @@ -0,0 +1,13 @@ +/* Components: Keyframe - Ring Indeterminate */ +/* NOTE: only for use in the progress ring functional component. */ + +@keyframes anim-ring-indeterminate { + from { + stroke-dasharray: 1, 400; + stroke-dashoffset: 0; + } + to { + stroke-dasharray: 400, 400; + stroke-dashoffset: -140; + } +} diff --git a/packages/skeleton/src/themes/catppuccin.css b/packages/skeleton/src/themes/catppuccin.css new file mode 100644 index 0000000000..50f178dd67 --- /dev/null +++ b/packages/skeleton/src/themes/catppuccin.css @@ -0,0 +1,207 @@ +[data-theme='catppuccin'] { + --text-scaling: 1.067; + --base-font-color: var(--color-surface-700); + --base-font-color-dark: var(--color-surface-50); + --base-font-family: + ui-rounded, 'Hiragino Maru Gothic ProN', Quicksand, Comfortaa, Manjari, 'Arial Rounded MT', 'Arial Rounded MT Bold', Calibri, + source-sans-pro, sans-serif; + --base-font-size: inherit; + --base-line-height: inherit; + --base-font-weight: normal; + --base-font-style: normal; + --base-letter-spacing: 0em; + --heading-font-color: var(--color-tertiary-500); + --heading-font-color-dark: var(--color-secondary-200); + --heading-font-family: Seravek, 'Gill Sans Nova', Ubuntu, Calibri, 'DejaVu Sans', source-sans-pro, sans-serif; + --heading-font-weight: bolder; + --heading-font-style: normal; + --heading-letter-spacing: inherit; + --anchor-font-color: var(--color-secondary-600); + --anchor-font-color-dark: var(--color-tertiary-400); + --anchor-font-family: inherit; + --anchor-font-size: inherit; + --anchor-line-height: inherit; + --anchor-font-weight: normal; + --anchor-font-style: normal; + --anchor-letter-spacing: inherit; + --anchor-text-decoration: none; + --anchor-text-decoration-hover: underline; + --anchor-text-decoration-active: none; + --anchor-text-decoration-focus: none; + --spacing: 0.25rem; + --radius-base: 0.375rem; + --radius-container: 0.75rem; + --default-border-width: 1px; + --default-divide-width: 1px; + --default-ring-width: 1px; + --body-background-color: oklch(1 0 0 / 1); + --body-background-color-dark: var(--color-surface-950); + --color-primary-50: oklch(97.74% 0.02 214.3deg); + --color-primary-100: oklch(91.46% 0.04 259.65deg); + --color-primary-200: oklch(85.14% 0.07 269.1deg); + --color-primary-300: oklch(78.61% 0.11 272.56deg); + --color-primary-400: oklch(72.39% 0.14 273.43deg); + --color-primary-500: oklch(66.37% 0.18 273.14deg); + --color-primary-600: oklch(64.04% 0.16 273.48deg); + --color-primary-700: oklch(61.68% 0.15 273.88deg); + --color-primary-800: oklch(59.39% 0.14 273.4deg); + --color-primary-900: oklch(57.01% 0.12 273.81deg); + --color-primary-950: oklch(54.61% 0.11 274.28deg); + --color-primary-contrast-dark: var(--color-primary-950); + --color-primary-contrast-light: var(--color-primary-50); + --color-primary-contrast-50: var(--color-primary-contrast-dark); + --color-primary-contrast-100: var(--color-primary-contrast-dark); + --color-primary-contrast-200: var(--color-primary-contrast-dark); + --color-primary-contrast-300: var(--color-primary-contrast-dark); + --color-primary-contrast-400: var(--color-primary-contrast-light); + --color-primary-contrast-500: var(--color-primary-contrast-light); + --color-primary-contrast-600: var(--color-primary-contrast-light); + --color-primary-contrast-700: var(--color-primary-contrast-light); + --color-primary-contrast-800: var(--color-primary-contrast-light); + --color-primary-contrast-900: var(--color-primary-contrast-light); + --color-primary-contrast-950: var(--color-primary-contrast-light); + --color-secondary-50: oklch(87% 0.08 336.33deg); + --color-secondary-100: oklch(83.97% 0.09 337.05deg); + --color-secondary-200: oklch(81.04% 0.12 337.14deg); + --color-secondary-300: oklch(77.9% 0.14 337.36deg); + --color-secondary-400: oklch(75.18% 0.16 337.67deg); + --color-secondary-500: oklch(72.56% 0.17 338.45deg); + --color-secondary-600: oklch(66.2% 0.16 338.65deg); + --color-secondary-700: oklch(59.46% 0.14 337.89deg); + --color-secondary-800: oklch(52.76% 0.13 338.06deg); + --color-secondary-900: oklch(45.59% 0.11 336.89deg); + --color-secondary-950: oklch(38.38% 0.09 336.89deg); + --color-secondary-contrast-dark: var(--color-secondary-950); + --color-secondary-contrast-light: var(--color-secondary-50); + --color-secondary-contrast-50: var(--color-secondary-contrast-dark); + --color-secondary-contrast-100: var(--color-secondary-contrast-dark); + --color-secondary-contrast-200: var(--color-secondary-contrast-dark); + --color-secondary-contrast-300: var(--color-secondary-contrast-dark); + --color-secondary-contrast-400: var(--color-secondary-contrast-dark); + --color-secondary-contrast-500: var(--color-secondary-contrast-dark); + --color-secondary-contrast-600: var(--color-secondary-contrast-dark); + --color-secondary-contrast-700: var(--color-secondary-contrast-light); + --color-secondary-contrast-800: var(--color-secondary-contrast-light); + --color-secondary-contrast-900: var(--color-secondary-contrast-light); + --color-secondary-contrast-950: var(--color-secondary-contrast-light); + --color-tertiary-50: oklch(85.85% 0.08 182.73deg); + --color-tertiary-100: oklch(80.64% 0.09 187.1deg); + --color-tertiary-200: oklch(75.45% 0.09 190.89deg); + --color-tertiary-300: oklch(70.29% 0.1 194.31deg); + --color-tertiary-400: oklch(65.21% 0.1 197.6deg); + --color-tertiary-500: oklch(60.23% 0.1 201.09deg); + --color-tertiary-600: oklch(55.35% 0.09 199.86deg); + --color-tertiary-700: oklch(50.38% 0.08 199.41deg); + --color-tertiary-800: oklch(45.28% 0.07 197.54deg); + --color-tertiary-900: oklch(40.06% 0.06 196.51deg); + --color-tertiary-950: oklch(34.66% 0.05 193.09deg); + --color-tertiary-contrast-dark: var(--color-tertiary-950); + --color-tertiary-contrast-light: var(--color-tertiary-50); + --color-tertiary-contrast-50: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-100: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-200: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-300: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-400: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-500: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-600: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-700: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-800: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-900: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-950: var(--color-tertiary-contrast-light); + --color-success-50: oklch(85.77% 0.11 142.7deg); + --color-success-100: oklch(81.17% 0.13 141.58deg); + --color-success-200: oklch(76.3% 0.14 141.25deg); + --color-success-300: oklch(71.74% 0.16 140.63deg); + --color-success-400: oklch(66.94% 0.17 140.57deg); + --color-success-500: oklch(62.5% 0.18 140.44deg); + --color-success-600: oklch(57.91% 0.16 141.06deg); + --color-success-700: oklch(52.95% 0.14 141.78deg); + --color-success-800: oklch(48.17% 0.12 143.12deg); + --color-success-900: oklch(42.98% 0.1 145.05deg); + --color-success-950: oklch(37.98% 0.08 149.06deg); + --color-success-contrast-dark: var(--color-success-950); + --color-success-contrast-light: var(--color-success-50); + --color-success-contrast-50: var(--color-success-contrast-dark); + --color-success-contrast-100: var(--color-success-contrast-dark); + --color-success-contrast-200: var(--color-success-contrast-dark); + --color-success-contrast-300: var(--color-success-contrast-dark); + --color-success-contrast-400: var(--color-success-contrast-dark); + --color-success-contrast-500: var(--color-success-contrast-light); + --color-success-contrast-600: var(--color-success-contrast-light); + --color-success-contrast-700: var(--color-success-contrast-light); + --color-success-contrast-800: var(--color-success-contrast-light); + --color-success-contrast-900: var(--color-success-contrast-light); + --color-success-contrast-950: var(--color-success-contrast-light); + --color-warning-50: oklch(91.93% 0.07 86.52deg); + --color-warning-100: oklch(87.62% 0.09 81.75deg); + --color-warning-200: oklch(83.37% 0.11 78.13deg); + --color-warning-300: oklch(79.3% 0.12 76.32deg); + --color-warning-400: oklch(75.27% 0.14 72.5deg); + --color-warning-500: oklch(71.4% 0.15 67.77deg); + --color-warning-600: oklch(65.9% 0.14 68.59deg); + --color-warning-700: oklch(60.36% 0.12 70.74deg); + --color-warning-800: oklch(54.63% 0.11 72.18deg); + --color-warning-900: oklch(48.86% 0.09 75.69deg); + --color-warning-950: oklch(42.84% 0.07 78.7deg); + --color-warning-contrast-dark: var(--color-warning-950); + --color-warning-contrast-light: var(--color-warning-50); + --color-warning-contrast-50: var(--color-warning-contrast-dark); + --color-warning-contrast-100: var(--color-warning-contrast-dark); + --color-warning-contrast-200: var(--color-warning-contrast-dark); + --color-warning-contrast-300: var(--color-warning-contrast-dark); + --color-warning-contrast-400: var(--color-warning-contrast-dark); + --color-warning-contrast-500: var(--color-warning-contrast-dark); + --color-warning-contrast-600: var(--color-warning-contrast-light); + --color-warning-contrast-700: var(--color-warning-contrast-light); + --color-warning-contrast-800: var(--color-warning-contrast-light); + --color-warning-contrast-900: var(--color-warning-contrast-light); + --color-warning-contrast-950: var(--color-warning-contrast-light); + --color-error-50: oklch(75.56% 0.13 2.78deg); + --color-error-100: oklch(70.33% 0.15 5.3deg); + --color-error-200: oklch(65.61% 0.18 8.14deg); + --color-error-300: oklch(61.35% 0.19 11.81deg); + --color-error-400: oklch(57.87% 0.21 15.53deg); + --color-error-500: oklch(55.05% 0.22 19.81deg); + --color-error-600: oklch(50.89% 0.2 18.37deg); + --color-error-700: oklch(46.85% 0.18 17.05deg); + --color-error-800: oklch(42.66% 0.16 14.84deg); + --color-error-900: oklch(38.58% 0.14 12.55deg); + --color-error-950: oklch(34.34% 0.11 8.3deg); + --color-error-contrast-dark: var(--color-error-950); + --color-error-contrast-light: var(--color-error-50); + --color-error-contrast-50: var(--color-error-contrast-dark); + --color-error-contrast-100: var(--color-error-contrast-dark); + --color-error-contrast-200: var(--color-error-contrast-dark); + --color-error-contrast-300: var(--color-error-contrast-dark); + --color-error-contrast-400: var(--color-error-contrast-dark); + --color-error-contrast-500: var(--color-error-contrast-light); + --color-error-contrast-600: var(--color-error-contrast-light); + --color-error-contrast-700: var(--color-error-contrast-light); + --color-error-contrast-800: var(--color-error-contrast-light); + --color-error-contrast-900: var(--color-error-contrast-light); + --color-error-contrast-950: var(--color-error-contrast-light); + --color-surface-50: oklch(90.6% 0.01 264.54deg); + --color-surface-100: oklch(85.75% 0.01 268.51deg); + --color-surface-200: oklch(80.83% 0.02 271.23deg); + --color-surface-300: oklch(75.6% 0.02 276.28deg); + --color-surface-400: oklch(70.52% 0.02 277.36deg); + --color-surface-500: oklch(65.36% 0.03 278.14deg); + --color-surface-600: oklch(57.72% 0.03 280.5deg); + --color-surface-700: oklch(50.06% 0.03 280.09deg); + --color-surface-800: oklch(41.85% 0.03 282.47deg); + --color-surface-900: oklch(33.48% 0.03 281.97deg); + --color-surface-950: oklch(24.29% 0.03 283.92deg); + --color-surface-contrast-dark: var(--color-surface-950); + --color-surface-contrast-light: var(--color-surface-50); + --color-surface-contrast-50: var(--color-surface-contrast-dark); + --color-surface-contrast-100: var(--color-surface-contrast-dark); + --color-surface-contrast-200: var(--color-surface-contrast-dark); + --color-surface-contrast-300: var(--color-surface-contrast-dark); + --color-surface-contrast-400: var(--color-surface-contrast-dark); + --color-surface-contrast-500: var(--color-surface-contrast-dark); + --color-surface-contrast-600: var(--color-surface-contrast-dark); + --color-surface-contrast-700: var(--color-surface-contrast-light); + --color-surface-contrast-800: var(--color-surface-contrast-light); + --color-surface-contrast-900: var(--color-surface-contrast-light); + --color-surface-contrast-950: var(--color-surface-contrast-light); +} diff --git a/packages/skeleton/src/themes/cerberus.css b/packages/skeleton/src/themes/cerberus.css new file mode 100644 index 0000000000..07fef0bac1 --- /dev/null +++ b/packages/skeleton/src/themes/cerberus.css @@ -0,0 +1,205 @@ +[data-theme='cerberus'] { + --spacing: 0.25rem; + --text-scaling: 1.067; + --base-font-color: var(--color-surface-950); + --base-font-color-dark: var(--color-surface-50); + --base-font-family: system-ui; + --base-font-size: inherit; + --base-line-height: inherit; + --base-font-weight: normal; + --base-font-style: normal; + --base-letter-spacing: 0em; + --heading-font-color: inherit; + --heading-font-color-dark: inherit; + --heading-font-family: inherit; + --heading-font-weight: bold; + --heading-font-style: normal; + --heading-letter-spacing: inherit; + --anchor-font-color: var(--color-primary-500); + --anchor-font-color-dark: var(--color-primary-400); + --anchor-font-family: inherit; + --anchor-font-size: inherit; + --anchor-line-height: inherit; + --anchor-font-weight: inherit; + --anchor-font-style: inherit; + --anchor-letter-spacing: inherit; + --anchor-text-decoration: none; + --anchor-text-decoration-hover: underline; + --anchor-text-decoration-active: none; + --anchor-text-decoration-focus: none; + --body-background-color: var(--color-surface-50); + --body-background-color-dark: var(--color-surface-950); + --radius-base: 0.25rem; + --radius-container: 0.25rem; + --default-border-width: 1px; + --default-divide-width: 1px; + --default-ring-width: 1px; + --color-primary-50: oklch(0.92 0.04 257.51); + --color-primary-100: oklch(0.84 0.08 254.62); + --color-primary-200: oklch(0.77 0.11 254.28); + --color-primary-300: oklch(0.7 0.15 254.36); + --color-primary-400: oklch(0.63 0.19 255.71); + --color-primary-500: oklch(0.57 0.21 258.29); + --color-primary-600: oklch(0.52 0.19 258.15); + --color-primary-700: oklch(0.46 0.17 257.78); + --color-primary-800: oklch(0.4 0.14 257.62); + --color-primary-900: oklch(0.34 0.11 257.14); + --color-primary-950: oklch(0.28 0.08 257.49); + --color-primary-contrast-dark: var(--color-primary-950); + --color-primary-contrast-light: var(--color-primary-50); + --color-primary-contrast-50: var(--color-primary-contrast-dark); + --color-primary-contrast-100: var(--color-primary-contrast-dark); + --color-primary-contrast-200: var(--color-primary-contrast-dark); + --color-primary-contrast-300: var(--color-primary-contrast-dark); + --color-primary-contrast-400: var(--color-primary-contrast-dark); + --color-primary-contrast-500: var(--color-primary-contrast-light); + --color-primary-contrast-600: var(--color-primary-contrast-light); + --color-primary-contrast-700: var(--color-primary-contrast-light); + --color-primary-contrast-800: var(--color-primary-contrast-light); + --color-primary-contrast-900: var(--color-primary-contrast-light); + --color-primary-contrast-950: var(--color-primary-contrast-light); + --color-secondary-50: oklch(0.87 0.05 300.12); + --color-secondary-100: oklch(0.79 0.09 303.55); + --color-secondary-200: oklch(0.7 0.13 304.43); + --color-secondary-300: oklch(0.63 0.17 303.8); + --color-secondary-400: oklch(0.55 0.2 302.74); + --color-secondary-500: oklch(0.49 0.23 300.45); + --color-secondary-600: oklch(0.45 0.21 299.59); + --color-secondary-700: oklch(0.42 0.19 298.25); + --color-secondary-800: oklch(0.38 0.17 296.27); + --color-secondary-900: oklch(0.34 0.15 293.96); + --color-secondary-950: oklch(0.3 0.13 291.15); + --color-secondary-contrast-dark: var(--color-secondary-950); + --color-secondary-contrast-light: var(--color-secondary-50); + --color-secondary-contrast-50: var(--color-secondary-contrast-dark); + --color-secondary-contrast-100: var(--color-secondary-contrast-dark); + --color-secondary-contrast-200: var(--color-secondary-contrast-dark); + --color-secondary-contrast-300: var(--color-secondary-contrast-dark); + --color-secondary-contrast-400: var(--color-secondary-contrast-light); + --color-secondary-contrast-500: var(--color-secondary-contrast-light); + --color-secondary-contrast-600: var(--color-secondary-contrast-light); + --color-secondary-contrast-700: var(--color-secondary-contrast-light); + --color-secondary-contrast-800: var(--color-secondary-contrast-light); + --color-secondary-contrast-900: var(--color-secondary-contrast-light); + --color-secondary-contrast-950: var(--color-secondary-contrast-light); + --color-tertiary-50: oklch(0.91 0.08 328.89); + --color-tertiary-100: oklch(0.83 0.13 339.66); + --color-tertiary-200: oklch(0.76 0.18 345.54); + --color-tertiary-300: oklch(0.7 0.23 350.67); + --color-tertiary-400: oklch(0.66 0.25 355.84); + --color-tertiary-500: oklch(0.65 0.26 2.47); + --color-tertiary-600: oklch(0.59 0.24 1.69); + --color-tertiary-700: oklch(0.54 0.22 0.5); + --color-tertiary-800: oklch(0.48 0.2 359.65); + --color-tertiary-900: oklch(0.43 0.17 357.7); + --color-tertiary-950: oklch(0.37 0.15 355.33); + --color-tertiary-contrast-dark: var(--color-tertiary-950); + --color-tertiary-contrast-light: var(--color-tertiary-50); + --color-tertiary-contrast-50: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-100: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-200: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-300: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-400: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-500: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-600: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-700: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-800: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-900: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-950: var(--color-tertiary-contrast-light); + --color-success-50: oklch(0.94 0.09 178.68); + --color-success-100: oklch(0.92 0.1 178.62); + --color-success-200: oklch(0.89 0.11 177.17); + --color-success-300: oklch(0.87 0.12 176.91); + --color-success-400: oklch(0.85 0.13 175.46); + --color-success-500: oklch(0.83 0.13 174.96); + --color-success-600: oklch(0.73 0.12 175.71); + --color-success-700: oklch(0.62 0.1 176); + --color-success-800: oklch(0.51 0.08 178.29); + --color-success-900: oklch(0.4 0.06 179.75); + --color-success-950: oklch(0.27 0.04 185.3); + --color-success-contrast-dark: var(--color-success-950); + --color-success-contrast-light: var(--color-success-50); + --color-success-contrast-50: var(--color-success-contrast-dark); + --color-success-contrast-100: var(--color-success-contrast-dark); + --color-success-contrast-200: var(--color-success-contrast-dark); + --color-success-contrast-300: var(--color-success-contrast-dark); + --color-success-contrast-400: var(--color-success-contrast-dark); + --color-success-contrast-500: var(--color-success-contrast-dark); + --color-success-contrast-600: var(--color-success-contrast-dark); + --color-success-contrast-700: var(--color-success-contrast-light); + --color-success-contrast-800: var(--color-success-contrast-light); + --color-success-contrast-900: var(--color-success-contrast-light); + --color-success-contrast-950: var(--color-success-contrast-light); + --color-warning-50: oklch(0.96 0.05 84.57); + --color-warning-100: oklch(0.93 0.06 82.17); + --color-warning-200: oklch(0.9 0.08 80.34); + --color-warning-300: oklch(0.88 0.1 80.02); + --color-warning-400: oklch(0.85 0.12 78.36); + --color-warning-500: oklch(0.82 0.14 76.72); + --color-warning-600: oklch(0.76 0.13 72.26); + --color-warning-700: oklch(0.7 0.13 68.1); + --color-warning-800: oklch(0.64 0.13 63.18); + --color-warning-900: oklch(0.58 0.13 57.97); + --color-warning-950: oklch(0.52 0.13 51.44); + --color-warning-contrast-dark: var(--color-warning-950); + --color-warning-contrast-light: var(--color-warning-50); + --color-warning-contrast-50: var(--color-warning-contrast-dark); + --color-warning-contrast-100: var(--color-warning-contrast-dark); + --color-warning-contrast-200: var(--color-warning-contrast-dark); + --color-warning-contrast-300: var(--color-warning-contrast-dark); + --color-warning-contrast-400: var(--color-warning-contrast-dark); + --color-warning-contrast-500: var(--color-warning-contrast-dark); + --color-warning-contrast-600: var(--color-warning-contrast-light); + --color-warning-contrast-700: var(--color-warning-contrast-light); + --color-warning-contrast-800: var(--color-warning-contrast-light); + --color-warning-contrast-900: var(--color-warning-contrast-light); + --color-warning-contrast-950: var(--color-warning-contrast-light); + --color-error-50: oklch(0.9 0.04 14); + --color-error-100: oklch(0.83 0.07 19.8); + --color-error-200: oklch(0.77 0.11 21.97); + --color-error-300: oklch(0.72 0.15 24.89); + --color-error-400: oklch(0.67 0.19 26.71); + --color-error-500: oklch(0.64 0.22 28.71); + --color-error-600: oklch(0.59 0.21 28.53); + --color-error-700: oklch(0.55 0.2 28.58); + --color-error-800: oklch(0.51 0.19 28.72); + --color-error-900: oklch(0.46 0.18 28.88); + --color-error-950: oklch(0.42 0.17 29.23); + --color-error-contrast-dark: var(--color-error-950); + --color-error-contrast-light: var(--color-error-50); + --color-error-contrast-50: var(--color-error-contrast-dark); + --color-error-contrast-100: var(--color-error-contrast-dark); + --color-error-contrast-200: var(--color-error-contrast-dark); + --color-error-contrast-300: var(--color-error-contrast-dark); + --color-error-contrast-400: var(--color-error-contrast-light); + --color-error-contrast-500: var(--color-error-contrast-light); + --color-error-contrast-600: var(--color-error-contrast-light); + --color-error-contrast-700: var(--color-error-contrast-light); + --color-error-contrast-800: var(--color-error-contrast-light); + --color-error-contrast-900: var(--color-error-contrast-light); + --color-error-contrast-950: var(--color-error-contrast-light); + --color-surface-50: oklch(0.99 0 0); + --color-surface-100: oklch(0.91 0 0); + --color-surface-200: oklch(0.81 0 0); + --color-surface-300: oklch(0.72 0 0); + --color-surface-400: oklch(0.62 0 0); + --color-surface-500: oklch(0.51 0 0); + --color-surface-600: oklch(0.45 0 0); + --color-surface-700: oklch(0.39 0 0); + --color-surface-800: oklch(0.32 0 0); + --color-surface-900: oklch(0.25 0 0); + --color-surface-950: oklch(0.18 0 0); + --color-surface-contrast-dark: var(--color-surface-950); + --color-surface-contrast-light: var(--color-surface-50); + --color-surface-contrast-50: var(--color-surface-contrast-dark); + --color-surface-contrast-100: var(--color-surface-contrast-dark); + --color-surface-contrast-200: var(--color-surface-contrast-dark); + --color-surface-contrast-300: var(--color-surface-contrast-dark); + --color-surface-contrast-400: var(--color-surface-contrast-light); + --color-surface-contrast-500: var(--color-surface-contrast-light); + --color-surface-contrast-600: var(--color-surface-contrast-light); + --color-surface-contrast-700: var(--color-surface-contrast-light); + --color-surface-contrast-800: var(--color-surface-contrast-light); + --color-surface-contrast-900: var(--color-surface-contrast-light); + --color-surface-contrast-950: var(--color-surface-contrast-light); +} diff --git a/packages/skeleton/src/themes/concord.css b/packages/skeleton/src/themes/concord.css new file mode 100644 index 0000000000..bffce0d157 --- /dev/null +++ b/packages/skeleton/src/themes/concord.css @@ -0,0 +1,205 @@ +[data-theme='concord'] { + --text-scaling: 1.067; + --base-font-color: var(--color-surface-950); + --base-font-color-dark: var(--color-surface-50); + --base-font-family: system-ui, sans-serif; + --base-font-size: inherit; + --base-line-height: inherit; + --base-font-weight: normal; + --base-font-style: normal; + --base-letter-spacing: 0em; + --heading-font-color: inherit; + --heading-font-color-dark: inherit; + --heading-font-family: Seravek, 'Gill Sans Nova', Ubuntu, Calibri, 'DejaVu Sans', source-sans-pro, sans-serif; + --heading-font-weight: bold; + --heading-font-style: normal; + --heading-letter-spacing: 0.025em; + --anchor-font-color: var(--color-tertiary-600); + --anchor-font-color-dark: var(--color-tertiary-500); + --anchor-font-family: inherit; + --anchor-font-size: inherit; + --anchor-line-height: inherit; + --anchor-font-weight: inherit; + --anchor-font-style: inherit; + --anchor-letter-spacing: inherit; + --anchor-text-decoration: none; + --anchor-text-decoration-hover: underline; + --anchor-text-decoration-active: none; + --anchor-text-decoration-focus: none; + --spacing: 0.25rem; + --radius-base: 0.375rem; + --radius-container: 0.75rem; + --default-border-width: 1px; + --default-divide-width: 1px; + --default-ring-width: 1px; + --body-background-color: oklch(1 0 0 / 1); + --body-background-color-dark: var(--color-surface-900); + --color-primary-50: oklch(93.95% 0.03 275.18deg); + --color-primary-100: oklch(86.47% 0.06 279.05deg); + --color-primary-200: oklch(79.21% 0.1 278.8deg); + --color-primary-300: oklch(71.7% 0.14 277.75deg); + --color-primary-400: oklch(64.67% 0.17 276.05deg); + --color-primary-500: oklch(57.74% 0.21 273.85deg); + --color-primary-600: oklch(54.35% 0.21 273.38deg); + --color-primary-700: oklch(50.71% 0.21 272.98deg); + --color-primary-800: oklch(47.4% 0.21 272.5deg); + --color-primary-900: oklch(43.82% 0.21 271.71deg); + --color-primary-950: oklch(40.56% 0.21 270.51deg); + --color-primary-contrast-dark: var(--color-primary-950); + --color-primary-contrast-light: var(--color-primary-50); + --color-primary-contrast-50: var(--color-primary-contrast-dark); + --color-primary-contrast-100: var(--color-primary-contrast-dark); + --color-primary-contrast-200: var(--color-primary-contrast-dark); + --color-primary-contrast-300: var(--color-primary-contrast-dark); + --color-primary-contrast-400: var(--color-primary-contrast-dark); + --color-primary-contrast-500: var(--color-primary-contrast-light); + --color-primary-contrast-600: var(--color-primary-contrast-light); + --color-primary-contrast-700: var(--color-primary-contrast-light); + --color-primary-contrast-800: var(--color-primary-contrast-light); + --color-primary-contrast-900: var(--color-primary-contrast-light); + --color-primary-contrast-950: var(--color-primary-contrast-light); + --color-secondary-50: oklch(90.16% 0.09 326.33deg); + --color-secondary-100: oklch(80.45% 0.13 345.87deg); + --color-secondary-200: oklch(76.18% 0.15 347.32deg); + --color-secondary-300: oklch(72.33% 0.18 348.51deg); + --color-secondary-400: oklch(68.63% 0.2 350.12deg); + --color-secondary-500: oklch(65.34% 0.22 351.93deg); + --color-secondary-600: oklch(59.91% 0.19 351.97deg); + --color-secondary-700: oklch(54.22% 0.17 351.74deg); + --color-secondary-800: oklch(48.56% 0.15 351.82deg); + --color-secondary-900: oklch(42.61% 0.12 351.59deg); + --color-secondary-950: oklch(35.14% 0.08 349.39deg); + --color-secondary-contrast-dark: oklch(0% 0 none); + --color-secondary-contrast-light: oklch(100% 0 none); + --color-secondary-contrast-50: var(--color-secondary-contrast-dark); + --color-secondary-contrast-100: var(--color-secondary-contrast-dark); + --color-secondary-contrast-200: var(--color-secondary-contrast-dark); + --color-secondary-contrast-300: var(--color-secondary-contrast-dark); + --color-secondary-contrast-400: var(--color-secondary-contrast-dark); + --color-secondary-contrast-500: var(--color-secondary-contrast-dark); + --color-secondary-contrast-600: var(--color-secondary-contrast-light); + --color-secondary-contrast-700: var(--color-secondary-contrast-light); + --color-secondary-contrast-800: var(--color-secondary-contrast-light); + --color-secondary-contrast-900: var(--color-secondary-contrast-light); + --color-secondary-contrast-950: var(--color-secondary-contrast-light); + --color-tertiary-50: oklch(91.25% 0.04 240.67deg); + --color-tertiary-100: oklch(86.76% 0.06 242.35deg); + --color-tertiary-200: oklch(82.16% 0.08 244.56deg); + --color-tertiary-300: oklch(77.89% 0.1 245.19deg); + --color-tertiary-400: oklch(73.54% 0.13 246.82deg); + --color-tertiary-500: oklch(69.62% 0.15 247.99deg); + --color-tertiary-600: oklch(64.73% 0.14 249.06deg); + --color-tertiary-700: oklch(59.52% 0.14 250.8deg); + --color-tertiary-800: oklch(54.41% 0.13 252.03deg); + --color-tertiary-900: oklch(48.99% 0.13 254.06deg); + --color-tertiary-950: oklch(43.68% 0.12 255.66deg); + --color-tertiary-contrast-dark: oklch(0% 0 none); + --color-tertiary-contrast-light: var(--color-tertiary-50); + --color-tertiary-contrast-50: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-100: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-200: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-300: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-400: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-500: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-600: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-700: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-800: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-900: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-950: var(--color-tertiary-contrast-light); + --color-success-50: oklch(97.79% 0.03 166.21deg); + --color-success-100: oklch(94.75% 0.07 158.14deg); + --color-success-200: oklch(92.12% 0.1 155.68deg); + --color-success-300: oklch(89.55% 0.14 153.46deg); + --color-success-400: oklch(87.47% 0.17 151.93deg); + --color-success-500: oklch(85.47% 0.2 150.16deg); + --color-success-600: oklch(78.41% 0.19 149.03deg); + --color-success-700: oklch(71.2% 0.19 147.9deg); + --color-success-800: oklch(63.6% 0.18 146.46deg); + --color-success-900: oklch(56.13% 0.17 145.13deg); + --color-success-950: oklch(48.51% 0.16 143.88deg); + --color-success-contrast-dark: oklch(0% 0 none); + --color-success-contrast-light: var(--color-success-50); + --color-success-contrast-50: var(--color-success-contrast-dark); + --color-success-contrast-100: var(--color-success-contrast-dark); + --color-success-contrast-200: var(--color-success-contrast-dark); + --color-success-contrast-300: var(--color-success-contrast-dark); + --color-success-contrast-400: var(--color-success-contrast-dark); + --color-success-contrast-500: var(--color-success-contrast-dark); + --color-success-contrast-600: var(--color-success-contrast-dark); + --color-success-contrast-700: var(--color-success-contrast-dark); + --color-success-contrast-800: var(--color-success-contrast-dark); + --color-success-contrast-900: var(--color-success-contrast-dark); + --color-success-contrast-950: var(--color-success-contrast-light); + --color-warning-50: oklch(97.17% 0.06 98.57deg); + --color-warning-100: oklch(96.12% 0.08 99.22deg); + --color-warning-200: oklch(95.11% 0.1 99.72deg); + --color-warning-300: oklch(93.9% 0.12 99.83deg); + --color-warning-400: oklch(93% 0.14 99.97deg); + --color-warning-500: oklch(92.18% 0.16 99.86deg); + --color-warning-600: oklch(85.61% 0.15 99.44deg); + --color-warning-700: oklch(78.94% 0.15 98.85deg); + --color-warning-800: oklch(72.12% 0.14 98.13deg); + --color-warning-900: oklch(65.17% 0.13 97.06deg); + --color-warning-950: oklch(58.06% 0.12 95.53deg); + --color-warning-contrast-dark: oklch(0% 0 none); + --color-warning-contrast-light: var(--color-warning-50); + --color-warning-contrast-50: var(--color-warning-contrast-dark); + --color-warning-contrast-100: var(--color-warning-contrast-dark); + --color-warning-contrast-200: var(--color-warning-contrast-dark); + --color-warning-contrast-300: var(--color-warning-contrast-dark); + --color-warning-contrast-400: var(--color-warning-contrast-dark); + --color-warning-contrast-500: var(--color-warning-contrast-dark); + --color-warning-contrast-600: var(--color-warning-contrast-dark); + --color-warning-contrast-700: var(--color-warning-contrast-dark); + --color-warning-contrast-800: var(--color-warning-contrast-dark); + --color-warning-contrast-900: var(--color-warning-contrast-dark); + --color-warning-contrast-950: var(--color-warning-contrast-dark); + --color-error-50: oklch(90.63% 0.05 32.16deg); + --color-error-100: oklch(84.27% 0.08 25.62deg); + --color-error-200: oklch(78.11% 0.11 22.63deg); + --color-error-300: oklch(72.43% 0.15 22.36deg); + --color-error-400: oklch(67.38% 0.18 22.87deg); + --color-error-500: oklch(63.18% 0.21 24.57deg); + --color-error-600: oklch(58.83% 0.2 25.07deg); + --color-error-700: oklch(54.43% 0.19 25.32deg); + --color-error-800: oklch(49.95% 0.17 25.95deg); + --color-error-900: oklch(45.4% 0.16 26.34deg); + --color-error-950: oklch(40.77% 0.15 27.15deg); + --color-error-contrast-dark: oklch(0% 0 none); + --color-error-contrast-light: var(--color-error-50); + --color-error-contrast-50: var(--color-error-contrast-dark); + --color-error-contrast-100: var(--color-error-contrast-dark); + --color-error-contrast-200: var(--color-error-contrast-dark); + --color-error-contrast-300: var(--color-error-contrast-dark); + --color-error-contrast-400: var(--color-error-contrast-dark); + --color-error-contrast-500: var(--color-error-contrast-dark); + --color-error-contrast-600: var(--color-error-contrast-dark); + --color-error-contrast-700: var(--color-error-contrast-light); + --color-error-contrast-800: var(--color-error-contrast-light); + --color-error-contrast-900: var(--color-error-contrast-light); + --color-error-contrast-950: var(--color-error-contrast-light); + --color-surface-50: oklch(97.02% 0 none); + --color-surface-100: oklch(87.97% 0 286.75deg); + --color-surface-200: oklch(78.7% 0.01 286.45deg); + --color-surface-300: oklch(69.23% 0.01 264.57deg); + --color-surface-400: oklch(59.34% 0.01 271.3deg); + --color-surface-500: oklch(49.01% 0.01 274.73deg); + --color-surface-600: oklch(44.29% 0.01 273.19deg); + --color-surface-700: oklch(39.45% 0.01 271.17deg); + --color-surface-800: oklch(34.3% 0.01 285.88deg); + --color-surface-900: oklch(29.11% 0.01 285.87deg); + --color-surface-950: oklch(23.67% 0.01 285.84deg); + --color-surface-contrast-dark: var(--color-surface-950); + --color-surface-contrast-light: var(--color-surface-50); + --color-surface-contrast-50: var(--color-surface-contrast-dark); + --color-surface-contrast-100: var(--color-surface-contrast-dark); + --color-surface-contrast-200: var(--color-surface-contrast-dark); + --color-surface-contrast-300: var(--color-surface-contrast-dark); + --color-surface-contrast-400: var(--color-surface-contrast-light); + --color-surface-contrast-500: var(--color-surface-contrast-light); + --color-surface-contrast-600: var(--color-surface-contrast-light); + --color-surface-contrast-700: var(--color-surface-contrast-light); + --color-surface-contrast-800: var(--color-surface-contrast-light); + --color-surface-contrast-900: var(--color-surface-contrast-light); + --color-surface-contrast-950: var(--color-surface-contrast-light); +} diff --git a/packages/skeleton/src/themes/crimson.css b/packages/skeleton/src/themes/crimson.css new file mode 100644 index 0000000000..5bcf405893 --- /dev/null +++ b/packages/skeleton/src/themes/crimson.css @@ -0,0 +1,205 @@ +[data-theme='crimson'] { + --text-scaling: 1.067; + --base-font-color: var(--color-surface-950); + --base-font-color-dark: var(--color-surface-50); + --base-font-family: Avenir, Montserrat, Corbel, 'URW Gothic', source-sans-pro, sans-serif; + --base-font-size: inherit; + --base-line-height: inherit; + --base-font-weight: normal; + --base-font-style: normal; + --base-letter-spacing: 0em; + --heading-font-color: inherit; + --heading-font-color-dark: inherit; + --heading-font-family: Avenir, Montserrat, Corbel, 'URW Gothic', source-sans-pro, sans-serif; + --heading-font-weight: normal; + --heading-font-style: normal; + --heading-letter-spacing: inherit; + --anchor-font-color: var(--color-primary-500); + --anchor-font-color-dark: var(--color-primary-500); + --anchor-font-family: inherit; + --anchor-font-size: inherit; + --anchor-line-height: inherit; + --anchor-font-weight: inherit; + --anchor-font-style: inherit; + --anchor-letter-spacing: inherit; + --anchor-text-decoration: none; + --anchor-text-decoration-hover: underline; + --anchor-text-decoration-active: none; + --anchor-text-decoration-focus: none; + --spacing: 0.25rem; + --radius-base: 0.375rem; + --radius-container: 0.75rem; + --default-border-width: 1px; + --default-divide-width: 1px; + --default-ring-width: 1px; + --body-background-color: oklch(1 0 0 / 1); + --body-background-color-dark: var(--color-surface-950); + --color-primary-50: oklch(88.86% 0.05 4.44deg); + --color-primary-100: oklch(80.66% 0.09 5.94deg); + --color-primary-200: oklch(72.91% 0.13 8.14deg); + --color-primary-300: oklch(65.86% 0.17 10.24deg); + --color-primary-400: oklch(59.91% 0.2 14.19deg); + --color-primary-500: oklch(55.71% 0.21 19.55deg); + --color-primary-600: oklch(50.91% 0.2 19.59deg); + --color-primary-700: oklch(46.18% 0.18 19.26deg); + --color-primary-800: oklch(41.14% 0.16 19.25deg); + --color-primary-900: oklch(36.08% 0.14 18.61deg); + --color-primary-950: oklch(30.55% 0.12 17.97deg); + --color-primary-contrast-dark: var(--color-primary-950); + --color-primary-contrast-light: var(--color-primary-50); + --color-primary-contrast-50: var(--color-primary-contrast-dark); + --color-primary-contrast-100: var(--color-primary-contrast-dark); + --color-primary-contrast-200: var(--color-primary-contrast-dark); + --color-primary-contrast-300: var(--color-primary-contrast-dark); + --color-primary-contrast-400: var(--color-primary-contrast-dark); + --color-primary-contrast-500: var(--color-primary-contrast-light); + --color-primary-contrast-600: var(--color-primary-contrast-light); + --color-primary-contrast-700: var(--color-primary-contrast-light); + --color-primary-contrast-800: var(--color-primary-contrast-light); + --color-primary-contrast-900: var(--color-primary-contrast-light); + --color-primary-contrast-950: var(--color-primary-contrast-light); + --color-secondary-50: oklch(92.56% 0.03 231.59deg); + --color-secondary-100: oklch(86.02% 0.04 233.6deg); + --color-secondary-200: oklch(79.42% 0.05 234.87deg); + --color-secondary-300: oklch(72.61% 0.07 238deg); + --color-secondary-400: oklch(65.93% 0.08 238.76deg); + --color-secondary-500: oklch(59.26% 0.09 239.95deg); + --color-secondary-600: oklch(54.31% 0.08 239.27deg); + --color-secondary-700: oklch(49.31% 0.08 239.24deg); + --color-secondary-800: oklch(43.86% 0.07 239.73deg); + --color-secondary-900: oklch(38.56% 0.06 239.77deg); + --color-secondary-950: oklch(33.02% 0.05 238.49deg); + --color-secondary-contrast-dark: var(--color-secondary-950); + --color-secondary-contrast-light: var(--color-secondary-50); + --color-secondary-contrast-50: var(--color-secondary-contrast-dark); + --color-secondary-contrast-100: var(--color-secondary-contrast-dark); + --color-secondary-contrast-200: var(--color-secondary-contrast-dark); + --color-secondary-contrast-300: var(--color-secondary-contrast-dark); + --color-secondary-contrast-400: var(--color-secondary-contrast-dark); + --color-secondary-contrast-500: var(--color-secondary-contrast-light); + --color-secondary-contrast-600: var(--color-secondary-contrast-light); + --color-secondary-contrast-700: var(--color-secondary-contrast-light); + --color-secondary-contrast-800: var(--color-secondary-contrast-light); + --color-secondary-contrast-900: var(--color-secondary-contrast-light); + --color-secondary-contrast-950: var(--color-secondary-contrast-light); + --color-tertiary-50: oklch(96.87% 0 18.01deg); + --color-tertiary-100: oklch(95.67% 0 18deg); + --color-tertiary-200: oklch(94.74% 0 49.04deg); + --color-tertiary-300: oklch(91.56% 0 34.58deg); + --color-tertiary-400: oklch(85.05% 0.01 27.4deg); + --color-tertiary-500: oklch(78.4% 0.01 31.17deg); + --color-tertiary-600: oklch(72.57% 0.01 32.61deg); + --color-tertiary-700: oklch(63.56% 0.01 36.62deg); + --color-tertiary-800: oklch(53.99% 0.01 28.97deg); + --color-tertiary-900: oklch(46.84% 0.01 31.17deg); + --color-tertiary-950: oklch(43.57% 0.01 31.17deg); + --color-tertiary-contrast-dark: var(--color-tertiary-950); + --color-tertiary-contrast-light: var(--color-tertiary-50); + --color-tertiary-contrast-50: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-100: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-200: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-300: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-400: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-500: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-600: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-700: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-800: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-900: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-950: var(--color-tertiary-contrast-light); + --color-success-50: oklch(97.91% 0.02 122.93deg); + --color-success-100: oklch(97.16% 0.02 122.74deg); + --color-success-200: oklch(96.6% 0.02 124.19deg); + --color-success-300: oklch(94.25% 0.04 124.61deg); + --color-success-400: oklch(90.14% 0.07 124.95deg); + --color-success-500: oklch(86% 0.1 126.06deg); + --color-success-600: oklch(79.54% 0.09 125.92deg); + --color-success-700: oklch(69.53% 0.08 125.89deg); + --color-success-800: oklch(59.17% 0.06 126.17deg); + --color-success-900: oklch(51.08% 0.05 125.23deg); + --color-success-950: oklch(47.93% 0.05 125.78deg); + --color-success-contrast-dark: var(--color-success-950); + --color-success-contrast-light: var(--color-success-50); + --color-success-contrast-50: var(--color-success-contrast-dark); + --color-success-contrast-100: var(--color-success-contrast-dark); + --color-success-contrast-200: var(--color-success-contrast-dark); + --color-success-contrast-300: var(--color-success-contrast-dark); + --color-success-contrast-400: var(--color-success-contrast-dark); + --color-success-contrast-500: var(--color-success-contrast-dark); + --color-success-contrast-600: var(--color-success-contrast-dark); + --color-success-contrast-700: var(--color-success-contrast-light); + --color-success-contrast-800: var(--color-success-contrast-light); + --color-success-contrast-900: var(--color-success-contrast-light); + --color-success-contrast-950: var(--color-success-contrast-light); + --color-warning-50: oklch(97.3% 0.02 91.54deg); + --color-warning-100: oklch(96.43% 0.03 90.88deg); + --color-warning-200: oklch(95.48% 0.03 92.24deg); + --color-warning-300: oklch(92.83% 0.05 92.14deg); + --color-warning-400: oklch(87.41% 0.09 91.27deg); + --color-warning-500: oklch(82.4% 0.13 90.68deg); + --color-warning-600: oklch(76.24% 0.11 91.06deg); + --color-warning-700: oklch(66.71% 0.1 91.1deg); + --color-warning-800: oklch(56.58% 0.08 90.28deg); + --color-warning-900: oklch(49.1% 0.07 90.52deg); + --color-warning-950: oklch(45.94% 0.07 89.94deg); + --color-warning-contrast-dark: var(--color-warning-950); + --color-warning-contrast-light: var(--color-warning-50); + --color-warning-contrast-50: var(--color-warning-contrast-dark); + --color-warning-contrast-100: var(--color-warning-contrast-dark); + --color-warning-contrast-200: var(--color-warning-contrast-dark); + --color-warning-contrast-300: var(--color-warning-contrast-dark); + --color-warning-contrast-400: var(--color-warning-contrast-dark); + --color-warning-contrast-500: var(--color-warning-contrast-dark); + --color-warning-contrast-600: var(--color-warning-contrast-dark); + --color-warning-contrast-700: var(--color-warning-contrast-light); + --color-warning-contrast-800: var(--color-warning-contrast-light); + --color-warning-contrast-900: var(--color-warning-contrast-light); + --color-warning-contrast-950: var(--color-warning-contrast-light); + --color-error-50: oklch(95.25% 0.01 17.52deg); + --color-error-100: oklch(93.57% 0.02 13.48deg); + --color-error-200: oklch(92.09% 0.02 14.35deg); + --color-error-300: oklch(87.34% 0.04 15.86deg); + --color-error-400: oklch(77.78% 0.07 16.56deg); + --color-error-500: oklch(68.53% 0.1 18.56deg); + --color-error-600: oklch(63.39% 0.1 18.38deg); + --color-error-700: oklch(55.64% 0.08 18.02deg); + --color-error-800: oklch(47.45% 0.07 18.65deg); + --color-error-900: oklch(41.28% 0.06 18.29deg); + --color-error-950: oklch(38.24% 0.06 18.5deg); + --color-error-contrast-dark: var(--color-error-950); + --color-error-contrast-light: var(--color-error-50); + --color-error-contrast-50: var(--color-error-contrast-dark); + --color-error-contrast-100: var(--color-error-contrast-dark); + --color-error-contrast-200: var(--color-error-contrast-dark); + --color-error-contrast-300: var(--color-error-contrast-dark); + --color-error-contrast-400: var(--color-error-contrast-dark); + --color-error-contrast-500: var(--color-error-contrast-dark); + --color-error-contrast-600: var(--color-error-contrast-light); + --color-error-contrast-700: var(--color-error-contrast-light); + --color-error-contrast-800: var(--color-error-contrast-light); + --color-error-contrast-900: var(--color-error-contrast-light); + --color-error-contrast-950: var(--color-error-contrast-light); + --color-surface-50: oklch(90.65% 0 264.68deg); + --color-surface-100: oklch(80.46% 0.01 268.6deg); + --color-surface-200: oklch(69.96% 0.01 271.26deg); + --color-surface-300: oklch(58.9% 0.02 278.84deg); + --color-surface-400: oklch(47.48% 0.03 277.42deg); + --color-surface-500: oklch(35.33% 0.04 275.68deg); + --color-surface-600: oklch(31.82% 0.03 277.05deg); + --color-surface-700: oklch(28.12% 0.03 276.09deg); + --color-surface-800: oklch(24.72% 0.03 274.9deg); + --color-surface-900: oklch(20.75% 0.02 273.29deg); + --color-surface-950: oklch(16.69% 0.02 275.16deg); + --color-surface-contrast-dark: var(--color-surface-950); + --color-surface-contrast-light: var(--color-surface-50); + --color-surface-contrast-50: var(--color-surface-contrast-dark); + --color-surface-contrast-100: var(--color-surface-contrast-dark); + --color-surface-contrast-200: var(--color-surface-contrast-dark); + --color-surface-contrast-300: var(--color-surface-contrast-dark); + --color-surface-contrast-400: var(--color-surface-contrast-light); + --color-surface-contrast-500: var(--color-surface-contrast-light); + --color-surface-contrast-600: var(--color-surface-contrast-light); + --color-surface-contrast-700: var(--color-surface-contrast-light); + --color-surface-contrast-800: var(--color-surface-contrast-light); + --color-surface-contrast-900: var(--color-surface-contrast-light); + --color-surface-contrast-950: var(--color-surface-contrast-light); +} diff --git a/packages/skeleton/src/themes/fennec.css b/packages/skeleton/src/themes/fennec.css new file mode 100644 index 0000000000..0760a52bef --- /dev/null +++ b/packages/skeleton/src/themes/fennec.css @@ -0,0 +1,205 @@ +[data-theme='fennec'] { + --text-scaling: 1.067; + --base-font-color: oklch(0 0 0 / 1); + --base-font-color-dark: oklch(1 0 0 / 1); + --base-font-family: Bahnschrift, 'DIN Alternate', 'Franklin Gothic Medium', 'Nimbus Sans Narrow', sans-serif-condensed, sans-serif; + --base-font-size: 20px; + --base-line-height: inherit; + --base-font-weight: normal; + --base-font-style: normal; + --base-letter-spacing: 0em; + --heading-font-color: oklch(0 0 0 / 1); + --heading-font-color-dark: var(--color-secondary-50); + --heading-font-family: Bahnschrift, 'DIN Alternate', 'Franklin Gothic Medium', 'Nimbus Sans Narrow', sans-serif-condensed, sans-serif; + --heading-font-weight: normal; + --heading-font-style: normal; + --heading-letter-spacing: inherit; + --anchor-font-color: var(--color-primary-600); + --anchor-font-color-dark: var(--color-primary-500); + --anchor-font-family: inherit; + --anchor-font-size: inherit; + --anchor-line-height: inherit; + --anchor-font-weight: inherit; + --anchor-font-style: inherit; + --anchor-letter-spacing: inherit; + --anchor-text-decoration: none; + --anchor-text-decoration-hover: underline; + --anchor-text-decoration-active: none; + --anchor-text-decoration-focus: none; + --spacing: 0.25rem; + --radius-base: 0.375rem; + --radius-container: 0.75rem; + --default-border-width: 1px; + --default-divide-width: 1px; + --default-ring-width: 1px; + --body-background-color: var(--color-surface-50); + --body-background-color-dark: var(--color-surface-950); + --color-primary-50: oklch(92.25% 0.06 81.66deg); + --color-primary-100: oklch(85.91% 0.09 64.53deg); + --color-primary-200: oklch(79.89% 0.12 55.2deg); + --color-primary-300: oklch(74.52% 0.15 48.54deg); + --color-primary-400: oklch(69.73% 0.19 43.57deg); + --color-primary-500: oklch(65.88% 0.21 38.25deg); + --color-primary-600: oklch(60.43% 0.2 37.23deg); + --color-primary-700: oklch(54.87% 0.18 35.55deg); + --color-primary-800: oklch(49.28% 0.16 32.44deg); + --color-primary-900: oklch(43.51% 0.14 27.22deg); + --color-primary-950: oklch(37.65% 0.13 17.8deg); + --color-primary-contrast-dark: var(--color-primary-950); + --color-primary-contrast-light: var(--color-primary-50); + --color-primary-contrast-50: var(--color-primary-contrast-dark); + --color-primary-contrast-100: var(--color-primary-contrast-dark); + --color-primary-contrast-200: var(--color-primary-contrast-dark); + --color-primary-contrast-300: var(--color-primary-contrast-dark); + --color-primary-contrast-400: var(--color-primary-contrast-dark); + --color-primary-contrast-500: var(--color-primary-contrast-dark); + --color-primary-contrast-600: var(--color-primary-contrast-light); + --color-primary-contrast-700: var(--color-primary-contrast-light); + --color-primary-contrast-800: var(--color-primary-contrast-light); + --color-primary-contrast-900: var(--color-primary-contrast-light); + --color-primary-contrast-950: var(--color-primary-contrast-light); + --color-secondary-50: oklch(96.54% 0.03 81.98deg); + --color-secondary-100: oklch(94.74% 0.05 80.07deg); + --color-secondary-200: oklch(92.83% 0.06 76.95deg); + --color-secondary-300: oklch(91.08% 0.07 76.39deg); + --color-secondary-400: oklch(89.23% 0.08 74.52deg); + --color-secondary-500: oklch(87.53% 0.1 74.15deg); + --color-secondary-600: oklch(80.58% 0.09 77.3deg); + --color-secondary-700: oklch(73.29% 0.09 79.53deg); + --color-secondary-800: oklch(66.02% 0.09 83.16deg); + --color-secondary-900: oklch(58.37% 0.09 85.41deg); + --color-secondary-950: oklch(50.7% 0.09 88.6deg); + --color-secondary-contrast-dark: var(--color-secondary-950); + --color-secondary-contrast-light: var(--color-secondary-50); + --color-secondary-contrast-50: var(--color-secondary-contrast-dark); + --color-secondary-contrast-100: var(--color-secondary-contrast-dark); + --color-secondary-contrast-200: var(--color-secondary-contrast-dark); + --color-secondary-contrast-300: var(--color-secondary-contrast-dark); + --color-secondary-contrast-400: var(--color-secondary-contrast-dark); + --color-secondary-contrast-500: var(--color-secondary-contrast-dark); + --color-secondary-contrast-600: var(--color-secondary-contrast-dark); + --color-secondary-contrast-700: var(--color-secondary-contrast-dark); + --color-secondary-contrast-800: var(--color-secondary-contrast-light); + --color-secondary-contrast-900: var(--color-secondary-contrast-light); + --color-secondary-contrast-950: var(--color-secondary-contrast-light); + --color-tertiary-50: oklch(98.4% 0.02 196.71deg); + --color-tertiary-100: oklch(90.49% 0.03 193.88deg); + --color-tertiary-200: oklch(82.5% 0.03 191.69deg); + --color-tertiary-300: oklch(74.23% 0.04 187.98deg); + --color-tertiary-400: oklch(65.86% 0.04 186.58deg); + --color-tertiary-500: oklch(57.22% 0.05 185.36deg); + --color-tertiary-600: oklch(52.67% 0.05 190.18deg); + --color-tertiary-700: oklch(48.08% 0.05 195.73deg); + --color-tertiary-800: oklch(43.11% 0.04 206.69deg); + --color-tertiary-900: oklch(38.3% 0.04 214.6deg); + --color-tertiary-950: oklch(33.3% 0.04 222.81deg); + --color-tertiary-contrast-dark: var(--color-tertiary-950); + --color-tertiary-contrast-light: var(--color-tertiary-50); + --color-tertiary-contrast-50: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-100: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-200: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-300: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-400: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-500: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-600: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-700: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-800: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-900: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-950: var(--color-tertiary-contrast-light); + --color-success-50: oklch(95.79% 0.08 143.23deg); + --color-success-100: oklch(92.5% 0.08 140.83deg); + --color-success-200: oklch(89.2% 0.09 138.94deg); + --color-success-300: oklch(85.57% 0.1 137.46deg); + --color-success-400: oklch(82.23% 0.11 136.3deg); + --color-success-500: oklch(78.89% 0.12 135.4deg); + --color-success-600: oklch(71.38% 0.12 136.02deg); + --color-success-700: oklch(64% 0.12 136.24deg); + --color-success-800: oklch(56.14% 0.12 136.98deg); + --color-success-900: oklch(48.41% 0.12 137.48deg); + --color-success-950: oklch(40.16% 0.12 138.73deg); + --color-success-contrast-dark: var(--color-success-950); + --color-success-contrast-light: var(--color-success-50); + --color-success-contrast-50: var(--color-success-contrast-dark); + --color-success-contrast-100: var(--color-success-contrast-dark); + --color-success-contrast-200: var(--color-success-contrast-dark); + --color-success-contrast-300: var(--color-success-contrast-dark); + --color-success-contrast-400: var(--color-success-contrast-dark); + --color-success-contrast-500: var(--color-success-contrast-dark); + --color-success-contrast-600: var(--color-success-contrast-dark); + --color-success-contrast-700: var(--color-success-contrast-light); + --color-success-contrast-800: var(--color-success-contrast-light); + --color-success-contrast-900: var(--color-success-contrast-light); + --color-success-contrast-950: var(--color-success-contrast-light); + --color-warning-50: oklch(97.85% 0.04 112deg); + --color-warning-100: oklch(94.72% 0.05 108.51deg); + --color-warning-200: oklch(91.68% 0.07 105.81deg); + --color-warning-300: oklch(88.75% 0.09 105.79deg); + --color-warning-400: oklch(85.73% 0.1 104.49deg); + --color-warning-500: oklch(82.64% 0.11 104.07deg); + --color-warning-600: oklch(75.3% 0.11 105.29deg); + --color-warning-700: oklch(67.88% 0.11 106.01deg); + --color-warning-800: oklch(59.97% 0.11 106.68deg); + --color-warning-900: oklch(52.14% 0.1 107.43deg); + --color-warning-950: oklch(43.96% 0.1 108.97deg); + --color-warning-contrast-dark: var(--color-warning-950); + --color-warning-contrast-light: var(--color-warning-50); + --color-warning-contrast-50: var(--color-warning-contrast-dark); + --color-warning-contrast-100: var(--color-warning-contrast-dark); + --color-warning-contrast-200: var(--color-warning-contrast-dark); + --color-warning-contrast-300: var(--color-warning-contrast-dark); + --color-warning-contrast-400: var(--color-warning-contrast-dark); + --color-warning-contrast-500: var(--color-warning-contrast-dark); + --color-warning-contrast-600: var(--color-warning-contrast-dark); + --color-warning-contrast-700: var(--color-warning-contrast-light); + --color-warning-contrast-800: var(--color-warning-contrast-light); + --color-warning-contrast-900: var(--color-warning-contrast-light); + --color-warning-contrast-950: var(--color-warning-contrast-light); + --color-error-50: oklch(100% 0 none); + --color-error-100: oklch(95.28% 0.01 353.31deg); + --color-error-200: oklch(90.63% 0.03 354.64deg); + --color-error-300: oklch(85.89% 0.04 354.79deg); + --color-error-400: oklch(81.25% 0.06 355.68deg); + --color-error-500: oklch(76.52% 0.07 356.13deg); + --color-error-600: oklch(69.28% 0.07 356.69deg); + --color-error-700: oklch(61.71% 0.07 355.57deg); + --color-error-800: oklch(53.97% 0.07 355.81deg); + --color-error-900: oklch(45.95% 0.07 354.89deg); + --color-error-950: oklch(37.81% 0.07 356.1deg); + --color-error-contrast-dark: var(--color-error-950); + --color-error-contrast-light: var(--color-error-50); + --color-error-contrast-50: var(--color-error-contrast-dark); + --color-error-contrast-100: var(--color-error-contrast-dark); + --color-error-contrast-200: var(--color-error-contrast-dark); + --color-error-contrast-300: var(--color-error-contrast-dark); + --color-error-contrast-400: var(--color-error-contrast-dark); + --color-error-contrast-500: var(--color-error-contrast-dark); + --color-error-contrast-600: var(--color-error-contrast-light); + --color-error-contrast-700: var(--color-error-contrast-light); + --color-error-contrast-800: var(--color-error-contrast-light); + --color-error-contrast-900: var(--color-error-contrast-light); + --color-error-contrast-950: var(--color-error-contrast-light); + --color-surface-50: oklch(80.11% 0.01 161.11deg); + --color-surface-100: oklch(73.55% 0.01 164.66deg); + --color-surface-200: oklch(67.01% 0.01 177.02deg); + --color-surface-300: oklch(60.13% 0.01 184.96deg); + --color-surface-400: oklch(53.22% 0.01 196.78deg); + --color-surface-500: oklch(45.9% 0.01 208.66deg); + --color-surface-600: oklch(42.01% 0.01 223.51deg); + --color-surface-700: oklch(38.02% 0.01 239.98deg); + --color-surface-800: oklch(33.97% 0.01 260.72deg); + --color-surface-900: oklch(29.76% 0.01 271.04deg); + --color-surface-950: oklch(25.39% 0.01 279.01deg); + --color-surface-contrast-dark: oklch(0% 0 none); + --color-surface-contrast-light: oklch(100% 0 none); + --color-surface-contrast-50: var(--color-surface-contrast-dark); + --color-surface-contrast-100: var(--color-surface-contrast-dark); + --color-surface-contrast-200: var(--color-surface-contrast-dark); + --color-surface-contrast-300: var(--color-surface-contrast-dark); + --color-surface-contrast-400: var(--color-surface-contrast-light); + --color-surface-contrast-500: var(--color-surface-contrast-light); + --color-surface-contrast-600: var(--color-surface-contrast-light); + --color-surface-contrast-700: var(--color-surface-contrast-light); + --color-surface-contrast-800: var(--color-surface-contrast-light); + --color-surface-contrast-900: var(--color-surface-contrast-light); + --color-surface-contrast-950: var(--color-surface-contrast-light); +} diff --git a/packages/skeleton/src/themes/hamlindigo.css b/packages/skeleton/src/themes/hamlindigo.css new file mode 100644 index 0000000000..a379e3b09a --- /dev/null +++ b/packages/skeleton/src/themes/hamlindigo.css @@ -0,0 +1,205 @@ +[data-theme='hamlindigo'] { + --text-scaling: 1.067; + --base-font-color: var(--color-surface-950); + --base-font-color-dark: var(--color-surface-50); + --base-font-family: Seravek, 'Gill Sans Nova', Ubuntu, Calibri, 'DejaVu Sans', source-sans-pro, sans-serif; + --base-font-size: inherit; + --base-line-height: inherit; + --base-font-weight: normal; + --base-font-style: normal; + --base-letter-spacing: 0em; + --heading-font-color: inherit; + --heading-font-color-dark: inherit; + --heading-font-family: 'Iowan Old Style', 'Palatino Linotype', 'URW Palladio L', P052, serif; + --heading-font-weight: bold; + --heading-font-style: normal; + --heading-letter-spacing: inherit; + --anchor-font-color: var(--color-secondary-500); + --anchor-font-color-dark: var(--color-secondary-500); + --anchor-font-family: inherit; + --anchor-font-size: inherit; + --anchor-line-height: inherit; + --anchor-font-weight: inherit; + --anchor-font-style: inherit; + --anchor-letter-spacing: inherit; + --anchor-text-decoration: none; + --anchor-text-decoration-hover: underline; + --anchor-text-decoration-active: none; + --anchor-text-decoration-focus: none; + --spacing: 0.25rem; + --radius-base: 0.375rem; + --radius-container: 0.75rem; + --default-border-width: 1px; + --default-divide-width: 1px; + --default-ring-width: 1px; + --body-background-color: oklch(1 0 0 / 1); + --body-background-color-dark: var(--color-surface-950); + --color-primary-50: oklch(95.58% 0.02 271.23deg); + --color-primary-100: oklch(92.55% 0.03 269.83deg); + --color-primary-200: oklch(89.45% 0.04 267.68deg); + --color-primary-300: oklch(86.44% 0.05 267.85deg); + --color-primary-400: oklch(83.33% 0.07 266.67deg); + --color-primary-500: oklch(80.28% 0.08 266.51deg); + --color-primary-600: oklch(73.59% 0.07 266.38deg); + --color-primary-700: oklch(66.71% 0.06 265.83deg); + --color-primary-800: oklch(59.46% 0.06 267.04deg); + --color-primary-900: oklch(52.17% 0.05 266.43deg); + --color-primary-950: oklch(44.65% 0.04 266.17deg); + --color-primary-contrast-dark: oklch(0% 0 none); + --color-primary-contrast-light: oklch(100% 0 none); + --color-primary-contrast-50: var(--color-primary-contrast-dark); + --color-primary-contrast-100: var(--color-primary-contrast-dark); + --color-primary-contrast-200: var(--color-primary-contrast-dark); + --color-primary-contrast-300: var(--color-primary-contrast-dark); + --color-primary-contrast-400: var(--color-primary-contrast-dark); + --color-primary-contrast-500: var(--color-primary-contrast-dark); + --color-primary-contrast-600: var(--color-primary-contrast-dark); + --color-primary-contrast-700: var(--color-primary-contrast-dark); + --color-primary-contrast-800: var(--color-primary-contrast-dark); + --color-primary-contrast-900: var(--color-primary-contrast-light); + --color-primary-contrast-950: var(--color-primary-contrast-light); + --color-secondary-50: oklch(97.95% 0.03 90.07deg); + --color-secondary-100: oklch(91.69% 0.04 89.43deg); + --color-secondary-200: oklch(85.37% 0.05 88.52deg); + --color-secondary-300: oklch(78.64% 0.05 87.86deg); + --color-secondary-400: oklch(72.11% 0.06 87.29deg); + --color-secondary-500: oklch(65.46% 0.07 87.04deg); + --color-secondary-600: oklch(59.96% 0.07 87.89deg); + --color-secondary-700: oklch(54.42% 0.06 87.8deg); + --color-secondary-800: oklch(48.66% 0.05 88.52deg); + --color-secondary-900: oklch(42.81% 0.05 88.51deg); + --color-secondary-950: oklch(36.63% 0.04 90.4deg); + --color-secondary-contrast-dark: oklch(0% 0 none); + --color-secondary-contrast-light: oklch(100% 0 none); + --color-secondary-contrast-50: var(--color-secondary-contrast-dark); + --color-secondary-contrast-100: var(--color-secondary-contrast-dark); + --color-secondary-contrast-200: var(--color-secondary-contrast-dark); + --color-secondary-contrast-300: var(--color-secondary-contrast-dark); + --color-secondary-contrast-400: var(--color-secondary-contrast-dark); + --color-secondary-contrast-500: var(--color-secondary-contrast-dark); + --color-secondary-contrast-600: var(--color-secondary-contrast-dark); + --color-secondary-contrast-700: var(--color-secondary-contrast-light); + --color-secondary-contrast-800: var(--color-secondary-contrast-light); + --color-secondary-contrast-900: var(--color-secondary-contrast-light); + --color-secondary-contrast-950: var(--color-secondary-contrast-light); + --color-tertiary-50: oklch(94.45% 0.01 209.68deg); + --color-tertiary-100: oklch(88.45% 0.02 211.7deg); + --color-tertiary-200: oklch(82.64% 0.03 212.03deg); + --color-tertiary-300: oklch(76.45% 0.04 212.28deg); + --color-tertiary-400: oklch(70.54% 0.05 212.56deg); + --color-tertiary-500: oklch(64.32% 0.06 213.24deg); + --color-tertiary-600: oklch(58.99% 0.05 213.74deg); + --color-tertiary-700: oklch(53.49% 0.05 214.01deg); + --color-tertiary-800: oklch(47.86% 0.04 212.78deg); + --color-tertiary-900: oklch(42.04% 0.04 213deg); + --color-tertiary-950: oklch(36.07% 0.03 213.86deg); + --color-tertiary-contrast-dark: oklch(0% 0 none); + --color-tertiary-contrast-light: oklch(100% 0 none); + --color-tertiary-contrast-50: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-100: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-200: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-300: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-400: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-500: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-600: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-700: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-800: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-900: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-950: var(--color-tertiary-contrast-light); + --color-success-50: oklch(94.08% 0.02 181.64deg); + --color-success-100: oklch(87.57% 0.03 178.18deg); + --color-success-200: oklch(81.01% 0.05 176.49deg); + --color-success-300: oklch(74.23% 0.06 174.48deg); + --color-success-400: oklch(67.63% 0.07 173.16deg); + --color-success-500: oklch(61.08% 0.08 171.46deg); + --color-success-600: oklch(55.91% 0.08 172.05deg); + --color-success-700: oklch(50.85% 0.07 170.86deg); + --color-success-800: oklch(45.47% 0.06 171.27deg); + --color-success-900: oklch(40.13% 0.06 169.57deg); + --color-success-950: oklch(34.34% 0.05 170.23deg); + --color-success-contrast-dark: oklch(0% 0 none); + --color-success-contrast-light: oklch(100% 0 none); + --color-success-contrast-50: var(--color-success-contrast-dark); + --color-success-contrast-100: var(--color-success-contrast-dark); + --color-success-contrast-200: var(--color-success-contrast-dark); + --color-success-contrast-300: var(--color-success-contrast-dark); + --color-success-contrast-400: var(--color-success-contrast-dark); + --color-success-contrast-500: var(--color-success-contrast-dark); + --color-success-contrast-600: var(--color-success-contrast-dark); + --color-success-contrast-700: var(--color-success-contrast-light); + --color-success-contrast-800: var(--color-success-contrast-light); + --color-success-contrast-900: var(--color-success-contrast-light); + --color-success-contrast-950: var(--color-success-contrast-light); + --color-warning-50: oklch(94.76% 0.03 86.85deg); + --color-warning-100: oklch(90.85% 0.05 85.13deg); + --color-warning-200: oklch(87.09% 0.07 86.74deg); + --color-warning-300: oklch(83.31% 0.1 85.44deg); + --color-warning-400: oklch(79.71% 0.12 85.54deg); + --color-warning-500: oklch(76.13% 0.13 83.34deg); + --color-warning-600: oklch(69.74% 0.12 83.31deg); + --color-warning-700: oklch(63.21% 0.11 83.28deg); + --color-warning-800: oklch(56.72% 0.1 84.21deg); + --color-warning-900: oklch(49.81% 0.09 84.32deg); + --color-warning-950: oklch(42.66% 0.08 84.47deg); + --color-warning-contrast-dark: oklch(0% 0 none); + --color-warning-contrast-light: oklch(100% 0 none); + --color-warning-contrast-50: var(--color-warning-contrast-dark); + --color-warning-contrast-100: var(--color-warning-contrast-dark); + --color-warning-contrast-200: var(--color-warning-contrast-dark); + --color-warning-contrast-300: var(--color-warning-contrast-dark); + --color-warning-contrast-400: var(--color-warning-contrast-dark); + --color-warning-contrast-500: var(--color-warning-contrast-dark); + --color-warning-contrast-600: var(--color-warning-contrast-dark); + --color-warning-contrast-700: var(--color-warning-contrast-dark); + --color-warning-contrast-800: var(--color-warning-contrast-dark); + --color-warning-contrast-900: var(--color-warning-contrast-light); + --color-warning-contrast-950: var(--color-warning-contrast-light); + --color-error-50: oklch(95.3% 0.02 359.41deg); + --color-error-100: oklch(87.75% 0.03 356.43deg); + --color-error-200: oklch(80.34% 0.04 359.07deg); + --color-error-300: oklch(72.57% 0.06 358.15deg); + --color-error-400: oklch(64.98% 0.07 0.27deg); + --color-error-500: oklch(57.08% 0.09 0.42deg); + --color-error-600: oklch(52.41% 0.08 1.3deg); + --color-error-700: oklch(47.34% 0.07 0.01deg); + --color-error-800: oklch(42.43% 0.06 1.1deg); + --color-error-900: oklch(37.07% 0.06 359.3deg); + --color-error-950: oklch(31.82% 0.05 0.72deg); + --color-error-contrast-dark: oklch(0% 0 none); + --color-error-contrast-light: oklch(100% 0 none); + --color-error-contrast-50: var(--color-error-contrast-dark); + --color-error-contrast-100: var(--color-error-contrast-dark); + --color-error-contrast-200: var(--color-error-contrast-dark); + --color-error-contrast-300: var(--color-error-contrast-dark); + --color-error-contrast-400: var(--color-error-contrast-dark); + --color-error-contrast-500: var(--color-error-contrast-light); + --color-error-contrast-600: var(--color-error-contrast-light); + --color-error-contrast-700: var(--color-error-contrast-light); + --color-error-contrast-800: var(--color-error-contrast-light); + --color-error-contrast-900: var(--color-error-contrast-light); + --color-error-contrast-950: var(--color-error-contrast-light); + --color-surface-50: oklch(93.75% 0.01 273.43deg); + --color-surface-100: oklch(91.84% 0.01 266.73deg); + --color-surface-200: oklch(89.7% 0.02 266.3deg); + --color-surface-300: oklch(83.29% 0.03 268.82deg); + --color-surface-400: oklch(70.33% 0.05 267.74deg); + --color-surface-500: oklch(56.88% 0.07 266.47deg); + --color-surface-600: oklch(52.73% 0.07 266.75deg); + --color-surface-700: oklch(46.53% 0.06 265.38deg); + --color-surface-800: oklch(39.92% 0.05 265.76deg); + --color-surface-900: oklch(35% 0.04 267.12deg); + --color-surface-950: oklch(31.91% 0.04 266.95deg); + --color-surface-contrast-dark: oklch(0% 0 none); + --color-surface-contrast-light: oklch(100% 0 none); + --color-surface-contrast-50: var(--color-surface-contrast-dark); + --color-surface-contrast-100: var(--color-surface-contrast-dark); + --color-surface-contrast-200: var(--color-surface-contrast-dark); + --color-surface-contrast-300: var(--color-surface-contrast-dark); + --color-surface-contrast-400: var(--color-surface-contrast-dark); + --color-surface-contrast-500: var(--color-surface-contrast-light); + --color-surface-contrast-600: var(--color-surface-contrast-light); + --color-surface-contrast-700: var(--color-surface-contrast-light); + --color-surface-contrast-800: var(--color-surface-contrast-light); + --color-surface-contrast-900: var(--color-surface-contrast-light); + --color-surface-contrast-950: var(--color-surface-contrast-light); +} diff --git a/packages/skeleton/src/themes/legacy.css b/packages/skeleton/src/themes/legacy.css new file mode 100644 index 0000000000..1d8a2e6ad2 --- /dev/null +++ b/packages/skeleton/src/themes/legacy.css @@ -0,0 +1,205 @@ +[data-theme='legacy'] { + --text-scaling: 1.067; + --base-font-color: var(--color-surface-950); + --base-font-color-dark: var(--color-surface-50); + --base-font-family: Inter, Roboto, 'Helvetica Neue', 'Arial Nova', 'Nimbus Sans', Arial, sans-serif; + --base-font-size: inherit; + --base-line-height: inherit; + --base-font-weight: normal; + --base-font-style: normal; + --base-letter-spacing: 0em; + --heading-font-color: inherit; + --heading-font-color-dark: inherit; + --heading-font-family: inherit; + --heading-font-weight: bold; + --heading-font-style: normal; + --heading-letter-spacing: inherit; + --anchor-font-color: var(--color-primary-500); + --anchor-font-color-dark: var(--color-primary-500); + --anchor-font-family: inherit; + --anchor-font-size: inherit; + --anchor-line-height: inherit; + --anchor-font-weight: inherit; + --anchor-font-style: inherit; + --anchor-letter-spacing: inherit; + --anchor-text-decoration: none; + --anchor-text-decoration-hover: underline; + --anchor-text-decoration-active: none; + --anchor-text-decoration-focus: none; + --spacing: 0.25rem; + --radius-base: 0.375rem; + --radius-container: 0.75rem; + --default-border-width: 1px; + --default-divide-width: 1px; + --default-ring-width: 1px; + --body-background-color: oklch(1 0 0 / 1); + --body-background-color-dark: var(--color-surface-950); + --color-primary-50: oklch(93.76% 0.05 174.04deg); + --color-primary-100: oklch(88.31% 0.07 172.12deg); + --color-primary-200: oklch(83.12% 0.1 170.96deg); + --color-primary-300: oklch(78.47% 0.12 168.13deg); + --color-primary-400: oklch(73.96% 0.14 165.85deg); + --color-primary-500: oklch(69.84% 0.15 162.21deg); + --color-primary-600: oklch(63.62% 0.14 162.09deg); + --color-primary-700: oklch(57.25% 0.12 161.89deg); + --color-primary-800: oklch(50.43% 0.11 162.71deg); + --color-primary-900: oklch(43.64% 0.09 162.59deg); + --color-primary-950: oklch(36.55% 0.08 162.58deg); + --color-primary-contrast-dark: var(--color-primary-950); + --color-primary-contrast-light: var(--color-primary-50); + --color-primary-contrast-50: var(--color-primary-contrast-dark); + --color-primary-contrast-100: var(--color-primary-contrast-dark); + --color-primary-contrast-200: var(--color-primary-contrast-dark); + --color-primary-contrast-300: var(--color-primary-contrast-dark); + --color-primary-contrast-400: var(--color-primary-contrast-dark); + --color-primary-contrast-500: var(--color-primary-contrast-dark); + --color-primary-contrast-600: var(--color-primary-contrast-dark); + --color-primary-contrast-700: var(--color-primary-contrast-light); + --color-primary-contrast-800: var(--color-primary-contrast-light); + --color-primary-contrast-900: var(--color-primary-contrast-light); + --color-primary-contrast-950: var(--color-primary-contrast-light); + --color-secondary-50: oklch(91.85% 0.03 289.61deg); + --color-secondary-100: oklch(83.36% 0.07 287.46deg); + --color-secondary-200: oklch(74.94% 0.11 286.33deg); + --color-secondary-300: oklch(66.53% 0.15 284.04deg); + --color-secondary-400: oklch(58.49% 0.19 281.34deg); + --color-secondary-500: oklch(51.06% 0.23 276.97deg); + --color-secondary-600: oklch(46.04% 0.21 277.09deg); + --color-secondary-700: oklch(41.03% 0.18 277.06deg); + --color-secondary-800: oklch(35.81% 0.16 277.12deg); + --color-secondary-900: oklch(30.46% 0.13 277.07deg); + --color-secondary-950: oklch(24.69% 0.1 277.33deg); + --color-secondary-contrast-dark: var(--color-secondary-950); + --color-secondary-contrast-light: var(--color-secondary-50); + --color-secondary-contrast-50: var(--color-secondary-contrast-dark); + --color-secondary-contrast-100: var(--color-secondary-contrast-dark); + --color-secondary-contrast-200: var(--color-secondary-contrast-dark); + --color-secondary-contrast-300: var(--color-secondary-contrast-dark); + --color-secondary-contrast-400: var(--color-secondary-contrast-dark); + --color-secondary-contrast-500: var(--color-secondary-contrast-light); + --color-secondary-contrast-600: var(--color-secondary-contrast-light); + --color-secondary-contrast-700: var(--color-secondary-contrast-light); + --color-secondary-contrast-800: var(--color-secondary-contrast-light); + --color-secondary-contrast-900: var(--color-secondary-contrast-light); + --color-secondary-contrast-950: var(--color-secondary-contrast-light); + --color-tertiary-50: oklch(91.76% 0.04 225.29deg); + --color-tertiary-100: oklch(86.44% 0.07 227.24deg); + --color-tertiary-200: oklch(81.31% 0.09 228.59deg); + --color-tertiary-300: oklch(76.77% 0.12 229.92deg); + --color-tertiary-400: oklch(72.38% 0.13 232.91deg); + --color-tertiary-500: oklch(68.47% 0.15 237.31deg); + --color-tertiary-600: oklch(62.85% 0.13 236.83deg); + --color-tertiary-700: oklch(57.1% 0.12 236.22deg); + --color-tertiary-800: oklch(50.99% 0.11 236.75deg); + --color-tertiary-900: oklch(44.91% 0.09 235.85deg); + --color-tertiary-950: oklch(38.6% 0.08 234.47deg); + --color-tertiary-contrast-dark: var(--color-tertiary-950); + --color-tertiary-contrast-light: var(--color-tertiary-50); + --color-tertiary-contrast-50: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-100: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-200: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-300: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-400: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-500: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-600: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-700: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-800: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-900: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-950: var(--color-tertiary-contrast-light); + --color-success-50: oklch(95.13% 0.04 124.07deg); + --color-success-100: oklch(91.13% 0.08 125.02deg); + --color-success-200: oklch(87.3% 0.12 126.12deg); + --color-success-300: oklch(83.56% 0.16 127.53deg); + --color-success-400: oklch(80.09% 0.19 128.96deg); + --color-success-500: oklch(76.81% 0.2 130.85deg); + --color-success-600: oklch(70.29% 0.19 130.77deg); + --color-success-700: oklch(63.6% 0.17 130.68deg); + --color-success-800: oklch(57.06% 0.15 130.45deg); + --color-success-900: oklch(49.99% 0.13 130.26deg); + --color-success-950: oklch(42.66% 0.11 129.96deg); + --color-success-contrast-dark: var(--color-success-950); + --color-success-contrast-light: var(--color-success-50); + --color-success-contrast-50: var(--color-success-contrast-dark); + --color-success-contrast-100: var(--color-success-contrast-dark); + --color-success-contrast-200: var(--color-success-contrast-dark); + --color-success-contrast-300: var(--color-success-contrast-dark); + --color-success-contrast-400: var(--color-success-contrast-dark); + --color-success-contrast-500: var(--color-success-contrast-dark); + --color-success-contrast-600: var(--color-success-contrast-dark); + --color-success-contrast-700: var(--color-success-contrast-light); + --color-success-contrast-800: var(--color-success-contrast-light); + --color-success-contrast-900: var(--color-success-contrast-light); + --color-success-contrast-950: var(--color-success-contrast-light); + --color-warning-50: oklch(94.62% 0.05 92.15deg); + --color-warning-100: oklch(91.23% 0.08 91.79deg); + --color-warning-200: oklch(88.15% 0.12 92.2deg); + --color-warning-300: oklch(85.04% 0.14 91.03deg); + --color-warning-400: oklch(82.3% 0.16 89.59deg); + --color-warning-500: oklch(79.53% 0.16 86.04deg); + --color-warning-600: oklch(73.86% 0.15 86.09deg); + --color-warning-700: oklch(67.97% 0.14 86.63deg); + --color-warning-800: oklch(62.27% 0.13 87.5deg); + --color-warning-900: oklch(56.11% 0.11 88.37deg); + --color-warning-950: oklch(49.89% 0.1 88.83deg); + --color-warning-contrast-dark: var(--color-warning-950); + --color-warning-contrast-light: var(--color-warning-50); + --color-warning-contrast-50: var(--color-warning-contrast-dark); + --color-warning-contrast-100: var(--color-warning-contrast-dark); + --color-warning-contrast-200: var(--color-warning-contrast-dark); + --color-warning-contrast-300: var(--color-warning-contrast-dark); + --color-warning-contrast-400: var(--color-warning-contrast-dark); + --color-warning-contrast-500: var(--color-warning-contrast-dark); + --color-warning-contrast-600: var(--color-warning-contrast-dark); + --color-warning-contrast-700: var(--color-warning-contrast-light); + --color-warning-contrast-800: var(--color-warning-contrast-light); + --color-warning-contrast-900: var(--color-warning-contrast-light); + --color-warning-contrast-950: var(--color-warning-contrast-light); + --color-error-50: oklch(92.23% 0.04 347.14deg); + --color-error-100: oklch(83.76% 0.08 347.97deg); + --color-error-200: oklch(75.58% 0.12 349.14deg); + --color-error-300: oklch(68.16% 0.17 351.73deg); + --color-error-400: oklch(61.78% 0.2 354.34deg); + --color-error-500: oklch(57.22% 0.22 358.61deg); + --color-error-600: oklch(52.66% 0.2 358.6deg); + --color-error-700: oklch(47.87% 0.19 358.39deg); + --color-error-800: oklch(43.13% 0.17 357.83deg); + --color-error-900: oklch(38.06% 0.15 357.41deg); + --color-error-950: oklch(32.89% 0.13 357deg); + --color-error-contrast-dark: var(--color-error-950); + --color-error-contrast-light: var(--color-error-50); + --color-error-contrast-50: var(--color-error-contrast-dark); + --color-error-contrast-100: var(--color-error-contrast-dark); + --color-error-contrast-200: var(--color-error-contrast-dark); + --color-error-contrast-300: var(--color-error-contrast-dark); + --color-error-contrast-400: var(--color-error-contrast-light); + --color-error-contrast-500: var(--color-error-contrast-light); + --color-error-contrast-600: var(--color-error-contrast-light); + --color-error-contrast-700: var(--color-error-contrast-light); + --color-error-contrast-800: var(--color-error-contrast-light); + --color-error-contrast-900: var(--color-error-contrast-light); + --color-error-contrast-950: var(--color-error-contrast-light); + --color-surface-50: oklch(92.32% 0.01 279.78deg); + --color-surface-100: oklch(83.77% 0.02 274.72deg); + --color-surface-200: oklch(75.06% 0.04 273.55deg); + --color-surface-300: oklch(66.32% 0.05 270.91deg); + --color-surface-400: oklch(57.19% 0.07 270.48deg); + --color-surface-500: oklch(47.8% 0.09 269.38deg); + --color-surface-600: oklch(44.12% 0.08 269.69deg); + --color-surface-700: oklch(40.23% 0.07 268.97deg); + --color-surface-800: oklch(36.14% 0.07 270.51deg); + --color-surface-900: oklch(32.03% 0.06 269.71deg); + --color-surface-950: oklch(27.93% 0.05 270.32deg); + --color-surface-contrast-dark: var(--color-surface-950); + --color-surface-contrast-light: var(--color-surface-50); + --color-surface-contrast-50: var(--color-surface-contrast-dark); + --color-surface-contrast-100: var(--color-surface-contrast-dark); + --color-surface-contrast-200: var(--color-surface-contrast-dark); + --color-surface-contrast-300: var(--color-surface-contrast-dark); + --color-surface-contrast-400: var(--color-surface-contrast-light); + --color-surface-contrast-500: var(--color-surface-contrast-light); + --color-surface-contrast-600: var(--color-surface-contrast-light); + --color-surface-contrast-700: var(--color-surface-contrast-light); + --color-surface-contrast-800: var(--color-surface-contrast-light); + --color-surface-contrast-900: var(--color-surface-contrast-light); + --color-surface-contrast-950: var(--color-surface-contrast-light); +} diff --git a/packages/skeleton/src/themes/mint.css b/packages/skeleton/src/themes/mint.css new file mode 100644 index 0000000000..11a599cdf0 --- /dev/null +++ b/packages/skeleton/src/themes/mint.css @@ -0,0 +1,205 @@ +[data-theme='mint'] { + --text-scaling: 1.067; + --base-font-color: var(--color-surface-950); + --base-font-color-dark: var(--color-surface-50); + --base-font-family: system-ui, sans-serif; + --base-font-size: inherit; + --base-line-height: inherit; + --base-font-weight: inherit; + --base-font-style: normal; + --base-letter-spacing: 0em; + --heading-font-color: var(--color-surface-600); + --heading-font-color-dark: inherit; + --heading-font-family: inherit; + --heading-font-weight: normal; + --heading-font-style: normal; + --heading-letter-spacing: inherit; + --anchor-font-color: oklch(1 0 0 / 1); + --anchor-font-color-dark: var(--color-primary-500); + --anchor-font-family: inherit; + --anchor-font-size: inherit; + --anchor-line-height: inherit; + --anchor-font-weight: inherit; + --anchor-font-style: inherit; + --anchor-letter-spacing: inherit; + --anchor-text-decoration: none; + --anchor-text-decoration-hover: underline; + --anchor-text-decoration-active: none; + --anchor-text-decoration-focus: none; + --spacing: 0.25rem; + --radius-base: 0.375rem; + --radius-container: 0.75rem; + --default-border-width: 1px; + --default-divide-width: 1px; + --default-ring-width: 1px; + --body-background-color: var(--color-surface-200); + --body-background-color-dark: var(--color-surface-700); + --color-primary-50: oklch(91.62% 0.05 161.07deg); + --color-primary-100: oklch(89.8% 0.08 156.34deg); + --color-primary-200: oklch(88.07% 0.1 153.27deg); + --color-primary-300: oklch(86.28% 0.13 151.76deg); + --color-primary-400: oklch(84.84% 0.15 150.11deg); + --color-primary-500: oklch(83.57% 0.18 148.98deg); + --color-primary-600: oklch(77.48% 0.16 149.01deg); + --color-primary-700: oklch(71.28% 0.15 148.61deg); + --color-primary-800: oklch(64.67% 0.14 148.69deg); + --color-primary-900: oklch(58.17% 0.13 148.16deg); + --color-primary-950: oklch(51.46% 0.12 148.08deg); + --color-primary-contrast-dark: var(--color-surface-950); + --color-primary-contrast-light: oklch(100% 0 none); + --color-primary-contrast-50: var(--color-primary-contrast-dark); + --color-primary-contrast-100: var(--color-primary-contrast-dark); + --color-primary-contrast-200: var(--color-primary-contrast-dark); + --color-primary-contrast-300: var(--color-primary-contrast-dark); + --color-primary-contrast-400: var(--color-primary-contrast-dark); + --color-primary-contrast-500: var(--color-primary-contrast-dark); + --color-primary-contrast-600: var(--color-primary-contrast-dark); + --color-primary-contrast-700: var(--color-primary-contrast-dark); + --color-primary-contrast-800: var(--color-primary-contrast-dark); + --color-primary-contrast-900: var(--color-primary-contrast-dark); + --color-primary-contrast-950: var(--color-primary-contrast-light); + --color-secondary-50: oklch(88.58% 0.06 292.85deg); + --color-secondary-100: oklch(82.63% 0.09 290.3deg); + --color-secondary-200: oklch(76.51% 0.12 288.83deg); + --color-secondary-300: oklch(70.71% 0.15 287.34deg); + --color-secondary-400: oklch(64.79% 0.18 285.4deg); + --color-secondary-500: oklch(59.27% 0.21 282.75deg); + --color-secondary-600: oklch(53.92% 0.19 281.89deg); + --color-secondary-700: oklch(48.45% 0.18 280.84deg); + --color-secondary-800: oklch(42.99% 0.16 279.84deg); + --color-secondary-900: oklch(37.2% 0.14 278.17deg); + --color-secondary-950: oklch(31.2% 0.13 275.9deg); + --color-secondary-contrast-dark: var(--color-secondary-950); + --color-secondary-contrast-light: var(--color-secondary-50); + --color-secondary-contrast-50: var(--color-secondary-contrast-dark); + --color-secondary-contrast-100: var(--color-secondary-contrast-dark); + --color-secondary-contrast-200: var(--color-secondary-contrast-dark); + --color-secondary-contrast-300: var(--color-secondary-contrast-dark); + --color-secondary-contrast-400: var(--color-secondary-contrast-dark); + --color-secondary-contrast-500: var(--color-secondary-contrast-dark); + --color-secondary-contrast-600: var(--color-secondary-contrast-light); + --color-secondary-contrast-700: var(--color-secondary-contrast-light); + --color-secondary-contrast-800: var(--color-secondary-contrast-light); + --color-secondary-contrast-900: var(--color-secondary-contrast-light); + --color-secondary-contrast-950: var(--color-secondary-contrast-light); + --color-tertiary-50: oklch(83.58% 0.03 322.48deg); + --color-tertiary-100: oklch(76.23% 0.03 322.27deg); + --color-tertiary-200: oklch(68.83% 0.03 322.28deg); + --color-tertiary-300: oklch(60.89% 0.03 322.3deg); + --color-tertiary-400: oklch(53.03% 0.03 322.32deg); + --color-tertiary-500: oklch(44.74% 0.03 322.1deg); + --color-tertiary-600: oklch(41.52% 0.03 321.49deg); + --color-tertiary-700: oklch(38.14% 0.02 317.7deg); + --color-tertiary-800: oklch(34.51% 0.02 319.5deg); + --color-tertiary-900: oklch(30.96% 0.02 313.01deg); + --color-tertiary-950: oklch(27.43% 0.01 308.04deg); + --color-tertiary-contrast-dark: var(--color-tertiary-950); + --color-tertiary-contrast-light: var(--color-tertiary-50); + --color-tertiary-contrast-50: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-100: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-200: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-300: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-400: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-500: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-600: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-700: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-800: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-900: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-950: var(--color-tertiary-contrast-light); + --color-success-50: oklch(95.62% 0.02 226.91deg); + --color-success-100: oklch(92.13% 0.02 209.19deg); + --color-success-200: oklch(88.44% 0.03 203.44deg); + --color-success-300: oklch(84.99% 0.04 199.92deg); + --color-success-400: oklch(81.31% 0.05 197.64deg); + --color-success-500: oklch(77.87% 0.06 194.62deg); + --color-success-600: oklch(70.49% 0.06 194.48deg); + --color-success-700: oklch(62.96% 0.07 194.29deg); + --color-success-800: oklch(54.99% 0.07 194.04deg); + --color-success-900: oklch(47.15% 0.07 193.73deg); + --color-success-950: oklch(39.18% 0.06 193.34deg); + --color-success-contrast-dark: var(--color-success-950); + --color-success-contrast-light: var(--color-success-50); + --color-success-contrast-50: var(--color-success-contrast-dark); + --color-success-contrast-100: var(--color-success-contrast-dark); + --color-success-contrast-200: var(--color-success-contrast-dark); + --color-success-contrast-300: var(--color-success-contrast-dark); + --color-success-contrast-400: var(--color-success-contrast-dark); + --color-success-contrast-500: var(--color-success-contrast-dark); + --color-success-contrast-600: var(--color-success-contrast-dark); + --color-success-contrast-700: var(--color-success-contrast-light); + --color-success-contrast-800: var(--color-success-contrast-light); + --color-success-contrast-900: var(--color-success-contrast-light); + --color-success-contrast-950: var(--color-success-contrast-light); + --color-warning-50: oklch(100% 0 none); + --color-warning-100: oklch(96.72% 0.02 90.5deg); + --color-warning-200: oklch(93.46% 0.04 90.64deg); + --color-warning-300: oklch(90.53% 0.06 90.71deg); + --color-warning-400: oklch(87.31% 0.08 90.69deg); + --color-warning-500: oklch(84.13% 0.09 90.55deg); + --color-warning-600: oklch(75.53% 0.09 91.15deg); + --color-warning-700: oklch(66.8% 0.08 90.77deg); + --color-warning-800: oklch(57.88% 0.07 92.8deg); + --color-warning-900: oklch(48.49% 0.07 92.52deg); + --color-warning-950: oklch(38.5% 0.06 93.74deg); + --color-warning-contrast-dark: var(--color-warning-950); + --color-warning-contrast-light: var(--color-warning-50); + --color-warning-contrast-50: var(--color-warning-contrast-dark); + --color-warning-contrast-100: var(--color-warning-contrast-dark); + --color-warning-contrast-200: var(--color-warning-contrast-dark); + --color-warning-contrast-300: var(--color-warning-contrast-dark); + --color-warning-contrast-400: var(--color-warning-contrast-dark); + --color-warning-contrast-500: var(--color-warning-contrast-dark); + --color-warning-contrast-600: var(--color-warning-contrast-dark); + --color-warning-contrast-700: var(--color-warning-contrast-dark); + --color-warning-contrast-800: var(--color-warning-contrast-light); + --color-warning-contrast-900: var(--color-warning-contrast-light); + --color-warning-contrast-950: var(--color-warning-contrast-light); + --color-error-50: oklch(100% 0 none); + --color-error-100: oklch(93.83% 0.01 0.42deg); + --color-error-200: oklch(87.61% 0.03 0.82deg); + --color-error-300: oklch(81.46% 0.04 0.1deg); + --color-error-400: oklch(75.17% 0.06 1.1deg); + --color-error-500: oklch(68.89% 0.08 2.15deg); + --color-error-600: oklch(61.51% 0.08 1.95deg); + --color-error-700: oklch(53.97% 0.08 0.75deg); + --color-error-800: oklch(46.35% 0.08 1.47deg); + --color-error-900: oklch(38.34% 0.08 0.65deg); + --color-error-950: oklch(30.06% 0.08 1.77deg); + --color-error-contrast-dark: var(--color-error-950); + --color-error-contrast-light: var(--color-error-50); + --color-error-contrast-50: var(--color-error-contrast-dark); + --color-error-contrast-100: var(--color-error-contrast-dark); + --color-error-contrast-200: var(--color-error-contrast-dark); + --color-error-contrast-300: var(--color-error-contrast-dark); + --color-error-contrast-400: var(--color-error-contrast-dark); + --color-error-contrast-500: var(--color-error-contrast-light); + --color-error-contrast-600: var(--color-error-contrast-light); + --color-error-contrast-700: var(--color-error-contrast-light); + --color-error-contrast-800: var(--color-error-contrast-light); + --color-error-contrast-900: var(--color-error-contrast-light); + --color-error-contrast-950: var(--color-error-contrast-light); + --color-surface-50: oklch(89.13% 0.03 155.27deg); + --color-surface-100: oklch(79.9% 0.04 161.15deg); + --color-surface-200: oklch(70.51% 0.04 167.09deg); + --color-surface-300: oklch(60.97% 0.04 169.98deg); + --color-surface-400: oklch(50.97% 0.05 174.26deg); + --color-surface-500: oklch(40.48% 0.05 176.23deg); + --color-surface-600: oklch(37.05% 0.05 176.27deg); + --color-surface-700: oklch(33.3% 0.04 177.78deg); + --color-surface-800: oklch(29.73% 0.04 180.78deg); + --color-surface-900: oklch(25.75% 0.03 184.32deg); + --color-surface-950: oklch(21.88% 0.02 186.33deg); + --color-surface-contrast-dark: var(--color-surface-950); + --color-surface-contrast-light: var(--color-surface-50); + --color-surface-contrast-50: var(--color-surface-contrast-dark); + --color-surface-contrast-100: var(--color-surface-contrast-dark); + --color-surface-contrast-200: var(--color-surface-contrast-dark); + --color-surface-contrast-300: var(--color-surface-contrast-dark); + --color-surface-contrast-400: var(--color-surface-contrast-light); + --color-surface-contrast-500: var(--color-surface-contrast-light); + --color-surface-contrast-600: var(--color-surface-contrast-light); + --color-surface-contrast-700: var(--color-surface-contrast-light); + --color-surface-contrast-800: var(--color-surface-contrast-light); + --color-surface-contrast-900: var(--color-surface-contrast-light); + --color-surface-contrast-950: var(--color-surface-contrast-light); +} diff --git a/packages/skeleton/src/themes/modern.css b/packages/skeleton/src/themes/modern.css new file mode 100644 index 0000000000..e2b43d640b --- /dev/null +++ b/packages/skeleton/src/themes/modern.css @@ -0,0 +1,209 @@ +[data-theme='modern'] { + --text-scaling: 1.067; + --base-font-color: var(--color-surface-950); + --base-font-color-dark: var(--color-surface-50); + --base-font-family: + ui-rounded, 'Hiragino Maru Gothic ProN', Quicksand, Comfortaa, Manjari, 'Arial Rounded MT', 'Arial Rounded MT Bold', Calibri, + source-sans-pro, sans-serif; + --base-font-size: inherit; + --base-line-height: inherit; + --base-font-weight: inherit; + --base-font-style: normal; + --base-letter-spacing: 0em; + --heading-font-color: inherit; + --heading-font-color-dark: inherit; + --heading-font-family: + ui-rounded, 'Hiragino Maru Gothic ProN', Quicksand, Comfortaa, Manjari, 'Arial Rounded MT', 'Arial Rounded MT Bold', Calibri, + source-sans-pro, sans-serif; + --heading-font-weight: bolder; + --heading-font-style: normal; + --heading-letter-spacing: 0.025em; + --anchor-font-color: var(--color-primary-500); + --anchor-font-color-dark: var(--color-primary-500); + --anchor-font-family: inherit; + --anchor-font-size: inherit; + --anchor-line-height: inherit; + --anchor-font-weight: inherit; + --anchor-font-style: inherit; + --anchor-letter-spacing: inherit; + --anchor-text-decoration: none; + --anchor-text-decoration-hover: underline; + --anchor-text-decoration-active: none; + --anchor-text-decoration-focus: none; + --spacing: 0.25rem; + --radius-base: 0.375rem; + --radius-container: 0.75rem; + --default-border-width: 1px; + --default-divide-width: 1px; + --default-ring-width: 1px; + --body-background-color: var(--color-surface-50); + --body-background-color-dark: var(--color-surface-950); + --color-primary-50: oklch(88.26% 0.09 326.3deg); + --color-primary-100: oklch(83.08% 0.11 335.27deg); + --color-primary-200: oklch(78.13% 0.14 341.6deg); + --color-primary-300: oklch(73.41% 0.16 345.81deg); + --color-primary-400: oklch(69.22% 0.19 350.18deg); + --color-primary-500: oklch(65.59% 0.21 354.32deg); + --color-primary-600: oklch(59.29% 0.2 355.45deg); + --color-primary-700: oklch(52.78% 0.18 356.79deg); + --color-primary-800: oklch(46.44% 0.17 358.47deg); + --color-primary-900: oklch(39.72% 0.15 1.05deg); + --color-primary-950: oklch(32.83% 0.13 4.81deg); + --color-primary-contrast-dark: var(--color-primary-950); + --color-primary-contrast-light: var(--color-primary-50); + --color-primary-contrast-50: var(--color-primary-contrast-dark); + --color-primary-contrast-100: var(--color-primary-contrast-dark); + --color-primary-contrast-200: var(--color-primary-contrast-dark); + --color-primary-contrast-300: var(--color-primary-contrast-dark); + --color-primary-contrast-400: var(--color-primary-contrast-dark); + --color-primary-contrast-500: var(--color-primary-contrast-dark); + --color-primary-contrast-600: var(--color-primary-contrast-light); + --color-primary-contrast-700: var(--color-primary-contrast-light); + --color-primary-contrast-800: var(--color-primary-contrast-light); + --color-primary-contrast-900: var(--color-primary-contrast-light); + --color-primary-contrast-950: var(--color-primary-contrast-light); + --color-secondary-50: oklch(88.73% 0.05 226.12deg); + --color-secondary-100: oklch(84.49% 0.07 218.72deg); + --color-secondary-200: oklch(80.77% 0.09 214.75deg); + --color-secondary-300: oklch(77.19% 0.11 213.88deg); + --color-secondary-400: oklch(74.25% 0.12 213.55deg); + --color-secondary-500: oklch(71.48% 0.13 215.21deg); + --color-secondary-600: oklch(64.8% 0.12 216.99deg); + --color-secondary-700: oklch(57.99% 0.1 220deg); + --color-secondary-800: oklch(50.93% 0.09 222.96deg); + --color-secondary-900: oklch(43.67% 0.08 227.87deg); + --color-secondary-950: oklch(36.04% 0.07 233.37deg); + --color-secondary-contrast-dark: var(--color-secondary-950); + --color-secondary-contrast-light: var(--color-secondary-50); + --color-secondary-contrast-50: var(--color-secondary-contrast-dark); + --color-secondary-contrast-100: var(--color-secondary-contrast-dark); + --color-secondary-contrast-200: var(--color-secondary-contrast-dark); + --color-secondary-contrast-300: var(--color-secondary-contrast-dark); + --color-secondary-contrast-400: var(--color-secondary-contrast-dark); + --color-secondary-contrast-500: var(--color-secondary-contrast-dark); + --color-secondary-contrast-600: var(--color-secondary-contrast-dark); + --color-secondary-contrast-700: var(--color-secondary-contrast-light); + --color-secondary-contrast-800: var(--color-secondary-contrast-light); + --color-secondary-contrast-900: var(--color-secondary-contrast-light); + --color-secondary-contrast-950: var(--color-secondary-contrast-light); + --color-tertiary-50: oklch(92.03% 0.08 195.89deg); + --color-tertiary-100: oklch(87.42% 0.09 192.12deg); + --color-tertiary-200: oklch(82.97% 0.1 189.14deg); + --color-tertiary-300: oklch(78.43% 0.11 187.91deg); + --color-tertiary-400: oklch(74.31% 0.12 185.27deg); + --color-tertiary-500: oklch(70.37% 0.12 182.49deg); + --color-tertiary-600: oklch(63.72% 0.11 181.7deg); + --color-tertiary-700: oklch(56.62% 0.1 181.41deg); + --color-tertiary-800: oklch(49.53% 0.09 179.19deg); + --color-tertiary-900: oklch(41.91% 0.08 178.28deg); + --color-tertiary-950: oklch(34.2% 0.06 175.78deg); + --color-tertiary-contrast-dark: var(--color-tertiary-950); + --color-tertiary-contrast-light: var(--color-tertiary-50); + --color-tertiary-contrast-50: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-100: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-200: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-300: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-400: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-500: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-600: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-700: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-800: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-900: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-950: var(--color-tertiary-contrast-light); + --color-success-50: oklch(94.41% 0.13 131.66deg); + --color-success-100: oklch(90.82% 0.15 130.63deg); + --color-success-200: oklch(87.33% 0.17 129.89deg); + --color-success-300: oklch(83.58% 0.19 129.69deg); + --color-success-400: oklch(80.2% 0.2 129.93deg); + --color-success-500: oklch(76.81% 0.2 130.85deg); + --color-success-600: oklch(69.44% 0.19 133.05deg); + --color-success-700: oklch(61.88% 0.18 135.65deg); + --color-success-800: oklch(54.52% 0.17 138.28deg); + --color-success-900: oklch(46.76% 0.15 140.76deg); + --color-success-950: oklch(38.95% 0.13 142.5deg); + --color-success-contrast-dark: var(--color-success-950); + --color-success-contrast-light: var(--color-success-50); + --color-success-contrast-50: var(--color-success-contrast-dark); + --color-success-contrast-100: var(--color-success-contrast-dark); + --color-success-contrast-200: var(--color-success-contrast-dark); + --color-success-contrast-300: var(--color-success-contrast-dark); + --color-success-contrast-400: var(--color-success-contrast-dark); + --color-success-contrast-500: var(--color-success-contrast-dark); + --color-success-contrast-600: var(--color-success-contrast-dark); + --color-success-contrast-700: var(--color-success-contrast-light); + --color-success-contrast-800: var(--color-success-contrast-light); + --color-success-contrast-900: var(--color-success-contrast-light); + --color-success-contrast-950: var(--color-success-contrast-light); + --color-warning-50: oklch(98.55% 0.08 107.73deg); + --color-warning-100: oklch(94.55% 0.1 101.64deg); + --color-warning-200: oklch(90.66% 0.13 97.74deg); + --color-warning-300: oklch(86.6% 0.15 94.45deg); + --color-warning-400: oklch(82.98% 0.16 90.83deg); + --color-warning-500: oklch(79.53% 0.16 86.04deg); + --color-warning-600: oklch(72.24% 0.15 84.37deg); + --color-warning-700: oklch(64.97% 0.13 82.89deg); + --color-warning-800: oklch(57.17% 0.12 80.8deg); + --color-warning-900: oklch(49.43% 0.1 78.1deg); + --color-warning-950: oklch(41.18% 0.09 73.23deg); + --color-warning-contrast-dark: var(--color-warning-950); + --color-warning-contrast-light: var(--color-warning-50); + --color-warning-contrast-50: var(--color-warning-contrast-dark); + --color-warning-contrast-100: var(--color-warning-contrast-dark); + --color-warning-contrast-200: var(--color-warning-contrast-dark); + --color-warning-contrast-300: var(--color-warning-contrast-dark); + --color-warning-contrast-400: var(--color-warning-contrast-dark); + --color-warning-contrast-500: var(--color-warning-contrast-dark); + --color-warning-contrast-600: var(--color-warning-contrast-dark); + --color-warning-contrast-700: var(--color-warning-contrast-light); + --color-warning-contrast-800: var(--color-warning-contrast-light); + --color-warning-contrast-900: var(--color-warning-contrast-light); + --color-warning-contrast-950: var(--color-warning-contrast-light); + --color-error-50: oklch(91.01% 0.05 35.87deg); + --color-error-100: oklch(84.73% 0.08 27.61deg); + --color-error-200: oklch(78.56% 0.11 23.94deg); + --color-error-300: oklch(72.84% 0.15 23.81deg); + --color-error-400: oklch(67.76% 0.18 23.92deg); + --color-error-500: oklch(63.69% 0.21 25.33deg); + --color-error-600: oklch(57.47% 0.19 25.78deg); + --color-error-700: oklch(51.22% 0.18 26.25deg); + --color-error-800: oklch(44.95% 0.16 26.98deg); + --color-error-900: oklch(38.45% 0.15 27.75deg); + --color-error-950: oklch(31.6% 0.13 29.23deg); + --color-error-contrast-dark: var(--color-error-950); + --color-error-contrast-light: var(--color-error-50); + --color-error-contrast-50: var(--color-error-contrast-dark); + --color-error-contrast-100: var(--color-error-contrast-dark); + --color-error-contrast-200: var(--color-error-contrast-dark); + --color-error-contrast-300: var(--color-error-contrast-dark); + --color-error-contrast-400: var(--color-error-contrast-dark); + --color-error-contrast-500: var(--color-error-contrast-dark); + --color-error-contrast-600: var(--color-error-contrast-light); + --color-error-contrast-700: var(--color-error-contrast-light); + --color-error-contrast-800: var(--color-error-contrast-light); + --color-error-contrast-900: var(--color-error-contrast-light); + --color-error-contrast-950: var(--color-error-contrast-light); + --color-surface-50: oklch(91.63% 0.04 285.57deg); + --color-surface-100: oklch(84.95% 0.07 283.9deg); + --color-surface-200: oklch(78.07% 0.1 283.1deg); + --color-surface-300: oklch(71.48% 0.14 281.4deg); + --color-surface-400: oklch(64.79% 0.17 279.71deg); + --color-surface-500: oklch(58.54% 0.2 277.12deg); + --color-surface-600: oklch(53.83% 0.19 276.75deg); + --color-surface-700: oklch(48.9% 0.17 276.96deg); + --color-surface-800: oklch(44.04% 0.15 276.39deg); + --color-surface-900: oklch(38.84% 0.13 276.61deg); + --color-surface-950: oklch(33.59% 0.11 275.82deg); + --color-surface-contrast-dark: var(--color-surface-950); + --color-surface-contrast-light: var(--color-surface-50); + --color-surface-contrast-50: var(--color-surface-contrast-dark); + --color-surface-contrast-100: var(--color-surface-contrast-dark); + --color-surface-contrast-200: var(--color-surface-contrast-dark); + --color-surface-contrast-300: var(--color-surface-contrast-dark); + --color-surface-contrast-400: var(--color-surface-contrast-dark); + --color-surface-contrast-500: var(--color-surface-contrast-light); + --color-surface-contrast-600: var(--color-surface-contrast-light); + --color-surface-contrast-700: var(--color-surface-contrast-light); + --color-surface-contrast-800: var(--color-surface-contrast-light); + --color-surface-contrast-900: var(--color-surface-contrast-light); + --color-surface-contrast-950: var(--color-surface-contrast-light); +} diff --git a/packages/skeleton/src/themes/mona.css b/packages/skeleton/src/themes/mona.css new file mode 100644 index 0000000000..5088db95fb --- /dev/null +++ b/packages/skeleton/src/themes/mona.css @@ -0,0 +1,205 @@ +[data-theme='mona'] { + --text-scaling: 1.067; + --base-font-color: var(--color-surface-950); + --base-font-color-dark: var(--color-surface-50); + --base-font-family: system-ui, sans-serif; + --base-font-size: inherit; + --base-line-height: inherit; + --base-font-weight: normal; + --base-font-style: normal; + --base-letter-spacing: 0em; + --heading-font-color: inherit; + --heading-font-color-dark: inherit; + --heading-font-family: system-ui, sans-serif; + --heading-font-weight: 900; + --heading-font-style: normal; + --heading-letter-spacing: 0.025em; + --anchor-font-color: var(--color-tertiary-800); + --anchor-font-color-dark: var(--color-tertiary-500); + --anchor-font-family: inherit; + --anchor-font-size: inherit; + --anchor-line-height: inherit; + --anchor-font-weight: inherit; + --anchor-font-style: inherit; + --anchor-letter-spacing: inherit; + --anchor-text-decoration: none; + --anchor-text-decoration-hover: underline; + --anchor-text-decoration-active: none; + --anchor-text-decoration-focus: none; + --spacing: 0.25rem; + --radius-base: 0.375rem; + --radius-container: 0.75rem; + --default-border-width: 1px; + --default-divide-width: 1px; + --default-ring-width: 1px; + --body-background-color: oklch(1 0 0 / 1); + --body-background-color-dark: var(--color-surface-950); + --color-primary-50: oklch(95.05% 0.04 325.97deg); + --color-primary-100: oklch(87.17% 0.08 312.56deg); + --color-primary-200: oklch(79.22% 0.11 306.63deg); + --color-primary-300: oklch(71.52% 0.14 302.18deg); + --color-primary-400: oklch(63.71% 0.17 298.81deg); + --color-primary-500: oklch(56.31% 0.21 294.98deg); + --color-primary-600: oklch(51.94% 0.19 295.36deg); + --color-primary-700: oklch(47.6% 0.18 296.3deg); + --color-primary-800: oklch(43.11% 0.16 296.99deg); + --color-primary-900: oklch(38.55% 0.15 298.42deg); + --color-primary-950: oklch(33.76% 0.13 299.57deg); + --color-primary-contrast-dark: var(--color-primary-950); + --color-primary-contrast-light: var(--color-primary-50); + --color-primary-contrast-50: var(--color-primary-contrast-dark); + --color-primary-contrast-100: var(--color-primary-contrast-dark); + --color-primary-contrast-200: var(--color-primary-contrast-dark); + --color-primary-contrast-300: var(--color-primary-contrast-dark); + --color-primary-contrast-400: var(--color-primary-contrast-dark); + --color-primary-contrast-500: var(--color-primary-contrast-light); + --color-primary-contrast-600: var(--color-primary-contrast-light); + --color-primary-contrast-700: var(--color-primary-contrast-light); + --color-primary-contrast-800: var(--color-primary-contrast-light); + --color-primary-contrast-900: var(--color-primary-contrast-light); + --color-primary-contrast-950: var(--color-primary-contrast-light); + --color-secondary-50: oklch(96.29% 0.06 152.54deg); + --color-secondary-100: oklch(89.59% 0.08 152.64deg); + --color-secondary-200: oklch(82.92% 0.1 152.26deg); + --color-secondary-300: oklch(76.12% 0.13 151.01deg); + --color-secondary-400: oklch(69.66% 0.15 149.95deg); + --color-secondary-500: oklch(63.43% 0.16 148.39deg); + --color-secondary-600: oklch(56.69% 0.15 147.49deg); + --color-secondary-700: oklch(49.77% 0.14 146.68deg); + --color-secondary-800: oklch(42.89% 0.12 145.35deg); + --color-secondary-900: oklch(35.44% 0.11 144.15deg); + --color-secondary-950: oklch(27.48% 0.09 142.5deg); + --color-secondary-contrast-dark: var(--color-secondary-950); + --color-secondary-contrast-light: var(--color-secondary-50); + --color-secondary-contrast-50: var(--color-secondary-contrast-dark); + --color-secondary-contrast-100: var(--color-secondary-contrast-dark); + --color-secondary-contrast-200: var(--color-secondary-contrast-dark); + --color-secondary-contrast-300: var(--color-secondary-contrast-dark); + --color-secondary-contrast-400: var(--color-secondary-contrast-dark); + --color-secondary-contrast-500: var(--color-secondary-contrast-dark); + --color-secondary-contrast-600: var(--color-secondary-contrast-light); + --color-secondary-contrast-700: var(--color-secondary-contrast-light); + --color-secondary-contrast-800: var(--color-secondary-contrast-light); + --color-secondary-contrast-900: var(--color-secondary-contrast-light); + --color-secondary-contrast-950: var(--color-secondary-contrast-light); + --color-tertiary-50: oklch(98.82% 0.02 196.78deg); + --color-tertiary-100: oklch(95.16% 0.04 194.35deg); + --color-tertiary-200: oklch(91.49% 0.05 191.9deg); + --color-tertiary-300: oklch(87.79% 0.07 192.55deg); + --color-tertiary-400: oklch(84.34% 0.09 191.01deg); + --color-tertiary-500: oklch(81.11% 0.1 190.5deg); + --color-tertiary-600: oklch(73.06% 0.09 190.03deg); + --color-tertiary-700: oklch(64.52% 0.09 190.37deg); + --color-tertiary-800: oklch(56.06% 0.08 190.76deg); + --color-tertiary-900: oklch(47.02% 0.07 191.19deg); + --color-tertiary-950: oklch(37.93% 0.07 190.27deg); + --color-tertiary-contrast-dark: var(--color-tertiary-950); + --color-tertiary-contrast-light: var(--color-tertiary-50); + --color-tertiary-contrast-50: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-100: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-200: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-300: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-400: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-500: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-600: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-700: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-800: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-900: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-950: var(--color-tertiary-contrast-light); + --color-success-50: oklch(98.55% 0.08 107.73deg); + --color-success-100: oklch(95.53% 0.12 114.55deg); + --color-success-200: oklch(92.68% 0.16 118.32deg); + --color-success-300: oklch(89.72% 0.19 121.19deg); + --color-success-400: oklch(87.23% 0.21 123.72deg); + --color-success-500: oklch(84.91% 0.22 126.38deg); + --color-success-600: oklch(77.65% 0.2 128.27deg); + --color-success-700: oklch(69.99% 0.19 130.26deg); + --color-success-800: oklch(62.38% 0.18 132.95deg); + --color-success-900: oklch(54.4% 0.16 135.57deg); + --color-success-950: oklch(46.52% 0.15 138.52deg); + --color-success-contrast-dark: var(--color-success-950); + --color-success-contrast-light: var(--color-success-50); + --color-success-contrast-50: var(--color-success-contrast-dark); + --color-success-contrast-100: var(--color-success-contrast-dark); + --color-success-contrast-200: var(--color-success-contrast-dark); + --color-success-contrast-300: var(--color-success-contrast-dark); + --color-success-contrast-400: var(--color-success-contrast-dark); + --color-success-contrast-500: var(--color-success-contrast-dark); + --color-success-contrast-600: var(--color-success-contrast-dark); + --color-success-contrast-700: var(--color-success-contrast-dark); + --color-success-contrast-800: var(--color-success-contrast-light); + --color-success-contrast-900: var(--color-success-contrast-light); + --color-success-contrast-950: var(--color-success-contrast-light); + --color-warning-50: oklch(99.2% 0.04 107.08deg); + --color-warning-100: oklch(97.3% 0.06 103.71deg); + --color-warning-200: oklch(95.45% 0.09 102.29deg); + --color-warning-300: oklch(93.55% 0.11 102.15deg); + --color-warning-400: oklch(91.82% 0.13 101.48deg); + --color-warning-500: oklch(90.15% 0.15 100.84deg); + --color-warning-600: oklch(82.74% 0.14 101.41deg); + --color-warning-700: oklch(75.18% 0.14 101.95deg); + --color-warning-800: oklch(67.66% 0.13 103.15deg); + --color-warning-900: oklch(59.72% 0.12 103.74deg); + --color-warning-950: oklch(51.53% 0.11 104.38deg); + --color-warning-contrast-dark: var(--color-warning-950); + --color-warning-contrast-light: var(--color-warning-50); + --color-warning-contrast-50: var(--color-warning-contrast-dark); + --color-warning-contrast-100: var(--color-warning-contrast-dark); + --color-warning-contrast-200: var(--color-warning-contrast-dark); + --color-warning-contrast-300: var(--color-warning-contrast-dark); + --color-warning-contrast-400: var(--color-warning-contrast-dark); + --color-warning-contrast-500: var(--color-warning-contrast-dark); + --color-warning-contrast-600: var(--color-warning-contrast-dark); + --color-warning-contrast-700: var(--color-warning-contrast-dark); + --color-warning-contrast-800: var(--color-warning-contrast-light); + --color-warning-contrast-900: var(--color-warning-contrast-light); + --color-warning-contrast-950: var(--color-warning-contrast-light); + --color-error-50: oklch(92.99% 0.05 74.47deg); + --color-error-100: oklch(87.1% 0.07 52.28deg); + --color-error-200: oklch(81.54% 0.11 42.36deg); + --color-error-300: oklch(76.46% 0.14 38.67deg); + --color-error-400: oklch(71.95% 0.18 35.77deg); + --color-error-500: oklch(68.27% 0.21 34.01deg); + --color-error-600: oklch(62.88% 0.19 33.06deg); + --color-error-700: oklch(57.39% 0.18 31.94deg); + --color-error-800: oklch(51.68% 0.17 29.97deg); + --color-error-900: oklch(45.94% 0.15 28.21deg); + --color-error-950: oklch(40.05% 0.14 26deg); + --color-error-contrast-dark: var(--color-error-950); + --color-error-contrast-light: var(--color-error-50); + --color-error-contrast-50: var(--color-error-contrast-dark); + --color-error-contrast-100: var(--color-error-contrast-dark); + --color-error-contrast-200: var(--color-error-contrast-dark); + --color-error-contrast-300: var(--color-error-contrast-dark); + --color-error-contrast-400: var(--color-error-contrast-dark); + --color-error-contrast-500: var(--color-error-contrast-dark); + --color-error-contrast-600: var(--color-error-contrast-light); + --color-error-contrast-700: var(--color-error-contrast-light); + --color-error-contrast-800: var(--color-error-contrast-light); + --color-error-contrast-900: var(--color-error-contrast-light); + --color-error-contrast-950: var(--color-error-contrast-light); + --color-surface-50: oklch(100% 0 none); + --color-surface-100: oklch(92.83% 0 287.25deg); + --color-surface-200: oklch(85.51% 0 286.73deg); + --color-surface-300: oklch(78.13% 0 228.52deg); + --color-surface-400: oklch(70.47% 0 247.84deg); + --color-surface-500: oklch(62.6% 0.01 258.36deg); + --color-surface-600: oklch(55.34% 0.01 247.95deg); + --color-surface-700: oklch(47.73% 0.01 261.77deg); + --color-surface-800: oklch(39.92% 0.02 255.6deg); + --color-surface-900: oklch(31.6% 0.02 262.55deg); + --color-surface-950: oklch(22.88% 0.03 258.32deg); + --color-surface-contrast-dark: var(--color-surface-950); + --color-surface-contrast-light: var(--color-surface-50); + --color-surface-contrast-50: var(--color-surface-contrast-dark); + --color-surface-contrast-100: var(--color-surface-contrast-dark); + --color-surface-contrast-200: var(--color-surface-contrast-dark); + --color-surface-contrast-300: var(--color-surface-contrast-dark); + --color-surface-contrast-400: var(--color-surface-contrast-dark); + --color-surface-contrast-500: var(--color-surface-contrast-dark); + --color-surface-contrast-600: var(--color-surface-contrast-light); + --color-surface-contrast-700: var(--color-surface-contrast-light); + --color-surface-contrast-800: var(--color-surface-contrast-light); + --color-surface-contrast-900: var(--color-surface-contrast-light); + --color-surface-contrast-950: var(--color-surface-contrast-light); +} diff --git a/packages/skeleton/src/themes/nosh.css b/packages/skeleton/src/themes/nosh.css new file mode 100644 index 0000000000..be32d822e1 --- /dev/null +++ b/packages/skeleton/src/themes/nosh.css @@ -0,0 +1,205 @@ +[data-theme='nosh'] { + --text-scaling: 1.067; + --base-font-color: var(--color-surface-950); + --base-font-color-dark: var(--color-surface-50); + --base-font-family: Avenir, Montserrat, Corbel, 'URW Gothic', source-sans-pro, sans-serif; + --base-font-size: 18px; + --base-line-height: 28px; + --base-font-weight: normal; + --base-font-style: normal; + --base-letter-spacing: 0em; + --heading-font-color: inherit; + --heading-font-color-dark: inherit; + --heading-font-family: Avenir, Montserrat, Corbel, 'URW Gothic', source-sans-pro, sans-serif; + --heading-font-weight: bolder; + --heading-font-style: normal; + --heading-letter-spacing: inherit; + --anchor-font-color: var(--color-primary-600); + --anchor-font-color-dark: var(--color-primary-500); + --anchor-font-family: inherit; + --anchor-font-size: inherit; + --anchor-line-height: inherit; + --anchor-font-weight: inherit; + --anchor-font-style: inherit; + --anchor-letter-spacing: inherit; + --anchor-text-decoration: none; + --anchor-text-decoration-hover: underline; + --anchor-text-decoration-active: none; + --anchor-text-decoration-focus: none; + --spacing: 0.25rem; + --radius-base: 0.375rem; + --radius-container: 0.75rem; + --default-border-width: 1px; + --default-divide-width: 1px; + --default-ring-width: 1px; + --body-background-color: var(--color-surface-50); + --body-background-color-dark: var(--color-surface-950); + --color-primary-50: oklch(89.39% 0.06 29.22deg); + --color-primary-100: oklch(80.54% 0.1 18.64deg); + --color-primary-200: oklch(72.3% 0.14 15.89deg); + --color-primary-300: oklch(64.97% 0.18 16.82deg); + --color-primary-400: oklch(59.5% 0.21 19.82deg); + --color-primary-500: oklch(56.22% 0.23 24.62deg); + --color-primary-600: oklch(52.95% 0.21 24.73deg); + --color-primary-700: oklch(49.83% 0.2 24.69deg); + --color-primary-800: oklch(46.47% 0.19 24.87deg); + --color-primary-900: oklch(43.27% 0.17 24.89deg); + --color-primary-950: oklch(39.81% 0.16 25.23deg); + --color-primary-contrast-dark: var(--color-primary-950); + --color-primary-contrast-light: var(--color-primary-50); + --color-primary-contrast-50: var(--color-primary-contrast-dark); + --color-primary-contrast-100: var(--color-primary-contrast-dark); + --color-primary-contrast-200: var(--color-primary-contrast-dark); + --color-primary-contrast-300: var(--color-primary-contrast-dark); + --color-primary-contrast-400: var(--color-primary-contrast-light); + --color-primary-contrast-500: var(--color-primary-contrast-light); + --color-primary-contrast-600: var(--color-primary-contrast-light); + --color-primary-contrast-700: var(--color-primary-contrast-light); + --color-primary-contrast-800: var(--color-primary-contrast-light); + --color-primary-contrast-900: var(--color-primary-contrast-light); + --color-primary-contrast-950: var(--color-primary-contrast-light); + --color-secondary-50: oklch(96.07% 0.02 22.18deg); + --color-secondary-100: oklch(94.62% 0.02 17.61deg); + --color-secondary-200: oklch(93.33% 0.02 20.8deg); + --color-secondary-300: oklch(91.97% 0.03 17.76deg); + --color-secondary-400: oklch(90.68% 0.03 20.12deg); + --color-secondary-500: oklch(89.23% 0.04 17.93deg); + --color-secondary-600: oklch(81.07% 0.04 12.23deg); + --color-secondary-700: oklch(72.59% 0.05 7.68deg); + --color-secondary-800: oklch(64.01% 0.05 3.25deg); + --color-secondary-900: oklch(55.05% 0.06 0.41deg); + --color-secondary-950: oklch(45.92% 0.06 357.34deg); + --color-secondary-contrast-dark: var(--color-secondary-950); + --color-secondary-contrast-light: var(--color-secondary-50); + --color-secondary-contrast-50: var(--color-secondary-contrast-dark); + --color-secondary-contrast-100: var(--color-secondary-contrast-dark); + --color-secondary-contrast-200: var(--color-secondary-contrast-dark); + --color-secondary-contrast-300: var(--color-secondary-contrast-dark); + --color-secondary-contrast-400: var(--color-secondary-contrast-dark); + --color-secondary-contrast-500: var(--color-secondary-contrast-dark); + --color-secondary-contrast-600: var(--color-secondary-contrast-dark); + --color-secondary-contrast-700: var(--color-secondary-contrast-dark); + --color-secondary-contrast-800: var(--color-secondary-contrast-light); + --color-secondary-contrast-900: var(--color-secondary-contrast-light); + --color-secondary-contrast-950: var(--color-secondary-contrast-light); + --color-tertiary-50: oklch(92.69% 0.02 161.63deg); + --color-tertiary-100: oklch(83.32% 0.03 161.75deg); + --color-tertiary-200: oklch(73.68% 0.03 161.75deg); + --color-tertiary-300: oklch(63.99% 0.03 162.62deg); + --color-tertiary-400: oklch(53.67% 0.04 162.17deg); + --color-tertiary-500: oklch(42.89% 0.04 161.33deg); + --color-tertiary-600: oklch(39.99% 0.04 160.45deg); + --color-tertiary-700: oklch(36.7% 0.03 161.51deg); + --color-tertiary-800: oklch(33.73% 0.02 163.26deg); + --color-tertiary-900: oklch(30.32% 0.01 166.7deg); + --color-tertiary-950: oklch(27.21% 0.01 164.39deg); + --color-tertiary-contrast-dark: var(--color-tertiary-950); + --color-tertiary-contrast-light: var(--color-tertiary-50); + --color-tertiary-contrast-50: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-100: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-200: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-300: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-400: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-500: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-600: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-700: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-800: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-900: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-950: var(--color-tertiary-contrast-light); + --color-success-50: oklch(96.13% 0.03 196.6deg); + --color-success-100: oklch(89.1% 0.04 198.59deg); + --color-success-200: oklch(81.96% 0.04 199.99deg); + --color-success-300: oklch(74.96% 0.05 197.76deg); + --color-success-400: oklch(67.6% 0.06 198.89deg); + --color-success-500: oklch(60.11% 0.06 199.83deg); + --color-success-600: oklch(53.33% 0.06 200.22deg); + --color-success-700: oklch(46.02% 0.05 200.8deg); + --color-success-800: oklch(38.7% 0.05 201.34deg); + --color-success-900: oklch(30.76% 0.04 202.46deg); + --color-success-950: oklch(22.58% 0.04 203.51deg); + --color-success-contrast-dark: var(--color-success-950); + --color-success-contrast-light: var(--color-success-50); + --color-success-contrast-50: var(--color-success-contrast-dark); + --color-success-contrast-100: var(--color-success-contrast-dark); + --color-success-contrast-200: var(--color-success-contrast-dark); + --color-success-contrast-300: var(--color-success-contrast-dark); + --color-success-contrast-400: var(--color-success-contrast-dark); + --color-success-contrast-500: var(--color-success-contrast-dark); + --color-success-contrast-600: var(--color-success-contrast-light); + --color-success-contrast-700: var(--color-success-contrast-light); + --color-success-contrast-800: var(--color-success-contrast-light); + --color-success-contrast-900: var(--color-success-contrast-light); + --color-success-contrast-950: var(--color-success-contrast-light); + --color-warning-50: oklch(99.04% 0.05 107.24deg); + --color-warning-100: oklch(97.19% 0.07 106.86deg); + --color-warning-200: oklch(95.4% 0.1 106.86deg); + --color-warning-300: oklch(93.93% 0.12 107.02deg); + --color-warning-400: oklch(92.26% 0.14 107.14deg); + --color-warning-500: oklch(90.63% 0.16 107.22deg); + --color-warning-600: oklch(82.89% 0.15 105.38deg); + --color-warning-700: oklch(74.97% 0.14 103.12deg); + --color-warning-800: oklch(66.96% 0.13 99.75deg); + --color-warning-900: oklch(58.65% 0.12 95.8deg); + --color-warning-950: oklch(50.09% 0.1 90.18deg); + --color-warning-contrast-dark: var(--color-warning-950); + --color-warning-contrast-light: var(--color-warning-50); + --color-warning-contrast-50: var(--color-warning-contrast-dark); + --color-warning-contrast-100: var(--color-warning-contrast-dark); + --color-warning-contrast-200: var(--color-warning-contrast-dark); + --color-warning-contrast-300: var(--color-warning-contrast-dark); + --color-warning-contrast-400: var(--color-warning-contrast-dark); + --color-warning-contrast-500: var(--color-warning-contrast-dark); + --color-warning-contrast-600: var(--color-warning-contrast-dark); + --color-warning-contrast-700: var(--color-warning-contrast-dark); + --color-warning-contrast-800: var(--color-warning-contrast-light); + --color-warning-contrast-900: var(--color-warning-contrast-light); + --color-warning-contrast-950: var(--color-warning-contrast-light); + --color-error-50: oklch(92.15% 0.04 17.94deg); + --color-error-100: oklch(88.97% 0.06 18.33deg); + --color-error-200: oklch(85.87% 0.08 18.78deg); + --color-error-300: oklch(82.66% 0.1 19.35deg); + --color-error-400: oklch(79.78% 0.12 19.97deg); + --color-error-500: oklch(77.03% 0.14 20.69deg); + --color-error-600: oklch(70.26% 0.13 22.66deg); + --color-error-700: oklch(63.19% 0.13 24.3deg); + --color-error-800: oklch(56.25% 0.12 27.32deg); + --color-error-900: oklch(48.87% 0.12 29.36deg); + --color-error-950: oklch(41.49% 0.11 32.09deg); + --color-error-contrast-dark: var(--color-error-950); + --color-error-contrast-light: var(--color-error-50); + --color-error-contrast-50: var(--color-error-contrast-dark); + --color-error-contrast-100: var(--color-error-contrast-dark); + --color-error-contrast-200: var(--color-error-contrast-dark); + --color-error-contrast-300: var(--color-error-contrast-dark); + --color-error-contrast-400: var(--color-error-contrast-dark); + --color-error-contrast-500: var(--color-error-contrast-dark); + --color-error-contrast-600: var(--color-error-contrast-dark); + --color-error-contrast-700: var(--color-error-contrast-light); + --color-error-contrast-800: var(--color-error-contrast-light); + --color-error-contrast-900: var(--color-error-contrast-light); + --color-error-contrast-950: var(--color-error-contrast-light); + --color-surface-50: oklch(97.61% 0 none); + --color-surface-100: oklch(90.06% 0 none); + --color-surface-200: oklch(82.34% 0 none); + --color-surface-300: oklch(74.44% 0 none); + --color-surface-400: oklch(66.33% 0 none); + --color-surface-500: oklch(57.95% 0 none); + --color-surface-600: oklch(49.62% 0 none); + --color-surface-700: oklch(40.91% 0 none); + --color-surface-800: oklch(32.11% 0 none); + --color-surface-900: oklch(22.21% 0 none); + --color-surface-950: oklch(9.69% 0 none); + --color-surface-contrast-dark: var(--color-surface-950); + --color-surface-contrast-light: var(--color-surface-50); + --color-surface-contrast-50: var(--color-surface-contrast-dark); + --color-surface-contrast-100: var(--color-surface-contrast-dark); + --color-surface-contrast-200: var(--color-surface-contrast-dark); + --color-surface-contrast-300: var(--color-surface-contrast-dark); + --color-surface-contrast-400: var(--color-surface-contrast-dark); + --color-surface-contrast-500: var(--color-surface-contrast-dark); + --color-surface-contrast-600: var(--color-surface-contrast-light); + --color-surface-contrast-700: var(--color-surface-contrast-light); + --color-surface-contrast-800: var(--color-surface-contrast-light); + --color-surface-contrast-900: var(--color-surface-contrast-light); + --color-surface-contrast-950: var(--color-surface-contrast-light); +} diff --git a/packages/skeleton/src/themes/nouveau.css b/packages/skeleton/src/themes/nouveau.css new file mode 100644 index 0000000000..7da8f1f162 --- /dev/null +++ b/packages/skeleton/src/themes/nouveau.css @@ -0,0 +1,205 @@ +[data-theme='nouveau'] { + --text-scaling: 1.067; + --base-font-color: var(--color-surface-950); + --base-font-color-dark: var(--color-surface-50); + --base-font-family: system-ui, sans-serif; + --base-font-size: inherit; + --base-line-height: inherit; + --base-font-weight: normal; + --base-font-style: normal; + --base-letter-spacing: 0em; + --heading-font-color: inherit; + --heading-font-color-dark: inherit; + --heading-font-family: Bahnschrift, 'DIN Alternate', 'Franklin Gothic Medium', 'Nimbus Sans Narrow', sans-serif-condensed, sans-serif; + --heading-font-weight: bold; + --heading-font-style: normal; + --heading-letter-spacing: inherit; + --anchor-font-color: var(--color-tertiary-500); + --anchor-font-color-dark: var(--color-primary-500); + --anchor-font-family: inherit; + --anchor-font-size: inherit; + --anchor-line-height: inherit; + --anchor-font-weight: inherit; + --anchor-font-style: inherit; + --anchor-letter-spacing: inherit; + --anchor-text-decoration: none; + --anchor-text-decoration-hover: underline; + --anchor-text-decoration-active: none; + --anchor-text-decoration-focus: none; + --spacing: 0.25rem; + --radius-base: 0.375rem; + --radius-container: 0.75rem; + --default-border-width: 1px; + --default-divide-width: 1px; + --default-ring-width: 1px; + --body-background-color: var(--color-surface-50); + --body-background-color-dark: var(--color-surface-950); + --color-primary-50: oklch(94.79% 0.06 98.37deg); + --color-primary-100: oklch(92.36% 0.08 97.86deg); + --color-primary-200: oklch(89.92% 0.11 98.16deg); + --color-primary-300: oklch(87.83% 0.13 98.4deg); + --color-primary-400: oklch(85.55% 0.15 98.11deg); + --color-primary-500: oklch(83.44% 0.16 97deg); + --color-primary-600: oklch(76.21% 0.14 96.89deg); + --color-primary-700: oklch(68.8% 0.13 96.75deg); + --color-primary-800: oklch(61.41% 0.12 97.24deg); + --color-primary-900: oklch(53.56% 0.1 97.12deg); + --color-primary-950: oklch(45.41% 0.09 96.95deg); + --color-primary-contrast-dark: var(--color-primary-950); + --color-primary-contrast-light: var(--color-primary-50); + --color-primary-contrast-50: var(--color-primary-contrast-dark); + --color-primary-contrast-100: var(--color-primary-contrast-dark); + --color-primary-contrast-200: var(--color-primary-contrast-dark); + --color-primary-contrast-300: var(--color-primary-contrast-dark); + --color-primary-contrast-400: var(--color-primary-contrast-dark); + --color-primary-contrast-500: var(--color-primary-contrast-dark); + --color-primary-contrast-600: var(--color-primary-contrast-dark); + --color-primary-contrast-700: var(--color-primary-contrast-dark); + --color-primary-contrast-800: var(--color-primary-contrast-light); + --color-primary-contrast-900: var(--color-primary-contrast-light); + --color-primary-contrast-950: var(--color-primary-contrast-light); + --color-secondary-50: oklch(93.03% 0.03 249.76deg); + --color-secondary-100: oklch(85.15% 0.06 250.74deg); + --color-secondary-200: oklch(77.32% 0.1 250.51deg); + --color-secondary-300: oklch(69.88% 0.13 251.69deg); + --color-secondary-400: oklch(62.85% 0.17 253.13deg); + --color-secondary-500: oklch(56.7% 0.19 256.45deg); + --color-secondary-600: oklch(51.95% 0.18 256.27deg); + --color-secondary-700: oklch(47.16% 0.16 256.21deg); + --color-secondary-800: oklch(41.94% 0.14 256.3deg); + --color-secondary-900: oklch(36.87% 0.12 256.18deg); + --color-secondary-950: oklch(31.52% 0.1 255.64deg); + --color-secondary-contrast-dark: var(--color-secondary-950); + --color-secondary-contrast-light: var(--color-secondary-50); + --color-secondary-contrast-50: var(--color-secondary-contrast-dark); + --color-secondary-contrast-100: var(--color-secondary-contrast-dark); + --color-secondary-contrast-200: var(--color-secondary-contrast-dark); + --color-secondary-contrast-300: var(--color-secondary-contrast-dark); + --color-secondary-contrast-400: var(--color-secondary-contrast-dark); + --color-secondary-contrast-500: var(--color-secondary-contrast-light); + --color-secondary-contrast-600: var(--color-secondary-contrast-light); + --color-secondary-contrast-700: var(--color-secondary-contrast-light); + --color-secondary-contrast-800: var(--color-secondary-contrast-light); + --color-secondary-contrast-900: var(--color-secondary-contrast-light); + --color-secondary-contrast-950: var(--color-secondary-contrast-light); + --color-tertiary-50: oklch(94.52% 0.02 289.14deg); + --color-tertiary-100: oklch(88.15% 0.04 288.36deg); + --color-tertiary-200: oklch(81.73% 0.07 287.6deg); + --color-tertiary-300: oklch(75.39% 0.1 287.3deg); + --color-tertiary-400: oklch(68.93% 0.12 286deg); + --color-tertiary-500: oklch(62.5% 0.15 284.38deg); + --color-tertiary-600: oklch(57.45% 0.13 284.41deg); + --color-tertiary-700: oklch(52.34% 0.12 284.35deg); + --color-tertiary-800: oklch(47.04% 0.1 284.37deg); + --color-tertiary-900: oklch(41.65% 0.09 284.25deg); + --color-tertiary-950: oklch(36.03% 0.07 284.21deg); + --color-tertiary-contrast-dark: var(--color-tertiary-950); + --color-tertiary-contrast-light: var(--color-tertiary-50); + --color-tertiary-contrast-50: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-100: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-200: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-300: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-400: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-500: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-600: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-700: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-800: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-900: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-950: var(--color-tertiary-contrast-light); + --color-success-50: oklch(95.77% 0.05 152.69deg); + --color-success-100: oklch(91.59% 0.06 152deg); + --color-success-200: oklch(87.45% 0.08 152.08deg); + --color-success-300: oklch(83.57% 0.09 150.85deg); + --color-success-400: oklch(79.47% 0.11 150.71deg); + --color-success-500: oklch(75.38% 0.12 149.99deg); + --color-success-600: oklch(67.65% 0.11 149.94deg); + --color-success-700: oklch(59.71% 0.09 150.42deg); + --color-success-800: oklch(51.74% 0.08 150.24deg); + --color-success-900: oklch(43.2% 0.06 151.12deg); + --color-success-950: oklch(34.2% 0.04 151.44deg); + --color-success-contrast-dark: var(--color-success-950); + --color-success-contrast-light: var(--color-success-50); + --color-success-contrast-50: var(--color-success-contrast-dark); + --color-success-contrast-100: var(--color-success-contrast-dark); + --color-success-contrast-200: var(--color-success-contrast-dark); + --color-success-contrast-300: var(--color-success-contrast-dark); + --color-success-contrast-400: var(--color-success-contrast-dark); + --color-success-contrast-500: var(--color-success-contrast-dark); + --color-success-contrast-600: var(--color-success-contrast-dark); + --color-success-contrast-700: var(--color-success-contrast-light); + --color-success-contrast-800: var(--color-success-contrast-light); + --color-success-contrast-900: var(--color-success-contrast-light); + --color-success-contrast-950: var(--color-success-contrast-light); + --color-warning-50: oklch(95.02% 0.03 72.47deg); + --color-warning-100: oklch(89.44% 0.06 70.84deg); + --color-warning-200: oklch(84.04% 0.09 69.55deg); + --color-warning-300: oklch(79.06% 0.12 68.37deg); + --color-warning-400: oklch(74.22% 0.15 64.67deg); + --color-warning-500: oklch(69.79% 0.16 58.22deg); + --color-warning-600: oklch(63.66% 0.15 58.47deg); + --color-warning-700: oklch(57.2% 0.13 58.22deg); + --color-warning-800: oklch(50.73% 0.12 58.57deg); + --color-warning-900: oklch(43.87% 0.1 58.37deg); + --color-warning-950: oklch(36.91% 0.09 59.09deg); + --color-warning-contrast-dark: var(--color-warning-950); + --color-warning-contrast-light: var(--color-warning-50); + --color-warning-contrast-50: var(--color-warning-contrast-dark); + --color-warning-contrast-100: var(--color-warning-contrast-dark); + --color-warning-contrast-200: var(--color-warning-contrast-dark); + --color-warning-contrast-300: var(--color-warning-contrast-dark); + --color-warning-contrast-400: var(--color-warning-contrast-dark); + --color-warning-contrast-500: var(--color-warning-contrast-dark); + --color-warning-contrast-600: var(--color-warning-contrast-light); + --color-warning-contrast-700: var(--color-warning-contrast-light); + --color-warning-contrast-800: var(--color-warning-contrast-light); + --color-warning-contrast-900: var(--color-warning-contrast-light); + --color-warning-contrast-950: var(--color-warning-contrast-light); + --color-error-50: oklch(90.76% 0.02 6.73deg); + --color-error-100: oklch(80.16% 0.05 8.37deg); + --color-error-200: oklch(69.58% 0.08 8.86deg); + --color-error-300: oklch(59.33% 0.11 11.88deg); + --color-error-400: oklch(49.64% 0.14 14.93deg); + --color-error-500: oklch(41.76% 0.16 21.54deg); + --color-error-600: oklch(38.3% 0.15 22.05deg); + --color-error-700: oklch(34.55% 0.13 22.55deg); + --color-error-800: oklch(30.9% 0.12 22.63deg); + --color-error-900: oklch(26.83% 0.1 22.98deg); + --color-error-950: oklch(22.71% 0.09 23.71deg); + --color-error-contrast-dark: var(--color-error-950); + --color-error-contrast-light: var(--color-error-50); + --color-error-contrast-50: var(--color-error-contrast-dark); + --color-error-contrast-100: var(--color-error-contrast-dark); + --color-error-contrast-200: var(--color-error-contrast-dark); + --color-error-contrast-300: var(--color-error-contrast-dark); + --color-error-contrast-400: var(--color-error-contrast-light); + --color-error-contrast-500: var(--color-error-contrast-light); + --color-error-contrast-600: var(--color-error-contrast-light); + --color-error-contrast-700: var(--color-error-contrast-light); + --color-error-contrast-800: var(--color-error-contrast-light); + --color-error-contrast-900: var(--color-error-contrast-light); + --color-error-contrast-950: var(--color-error-contrast-light); + --color-surface-50: oklch(98.18% 0.01 308.72deg); + --color-surface-100: oklch(95.48% 0.01 306.17deg); + --color-surface-200: oklch(90.72% 0.03 307.1deg); + --color-surface-300: oklch(83.26% 0.05 307.83deg); + --color-surface-400: oklch(65.99% 0.1 306deg); + --color-surface-500: oklch(49.67% 0.14 304.12deg); + --color-surface-600: oklch(39.43% 0.1 304.38deg); + --color-surface-700: oklch(32.09% 0.08 303.77deg); + --color-surface-800: oklch(23.14% 0.05 304.85deg); + --color-surface-900: oklch(16.6% 0.03 308.28deg); + --color-surface-950: oklch(10.09% 0.05 307.48deg); + --color-surface-contrast-dark: var(--color-surface-950); + --color-surface-contrast-light: var(--color-surface-50); + --color-surface-contrast-50: var(--color-surface-contrast-dark); + --color-surface-contrast-100: var(--color-surface-contrast-dark); + --color-surface-contrast-200: var(--color-surface-contrast-dark); + --color-surface-contrast-300: var(--color-surface-contrast-dark); + --color-surface-contrast-400: var(--color-surface-contrast-dark); + --color-surface-contrast-500: var(--color-surface-contrast-light); + --color-surface-contrast-600: var(--color-surface-contrast-light); + --color-surface-contrast-700: var(--color-surface-contrast-light); + --color-surface-contrast-800: var(--color-surface-contrast-light); + --color-surface-contrast-900: var(--color-surface-contrast-light); + --color-surface-contrast-950: var(--color-surface-contrast-light); +} diff --git a/packages/skeleton/src/themes/pine.css b/packages/skeleton/src/themes/pine.css new file mode 100644 index 0000000000..10c055df3b --- /dev/null +++ b/packages/skeleton/src/themes/pine.css @@ -0,0 +1,205 @@ +[data-theme='pine'] { + --text-scaling: 1.067; + --base-font-color: var(--color-surface-950); + --base-font-color-dark: var(--color-surface-50); + --base-font-family: Superclarendon, 'Bookman Old Style', 'URW Bookman', 'URW Bookman L', 'Georgia Pro', Georgia, serif; + --base-font-size: inherit; + --base-line-height: inherit; + --base-font-weight: normal; + --base-font-style: normal; + --base-letter-spacing: 0em; + --heading-font-color: var(--color-primary-800); + --heading-font-color-dark: var(--color-primary-300); + --heading-font-family: Superclarendon, 'Bookman Old Style', 'URW Bookman', 'URW Bookman L', 'Georgia Pro', Georgia, serif; + --heading-font-weight: inherit; + --heading-font-style: normal; + --heading-letter-spacing: inherit; + --anchor-font-color: var(--color-secondary-400); + --anchor-font-color-dark: var(--color-secondary-100); + --anchor-font-family: inherit; + --anchor-font-size: inherit; + --anchor-line-height: inherit; + --anchor-font-weight: normal; + --anchor-font-style: normal; + --anchor-letter-spacing: inherit; + --anchor-text-decoration: none; + --anchor-text-decoration-hover: underline; + --anchor-text-decoration-active: none; + --anchor-text-decoration-focus: none; + --spacing: 0.25rem; + --radius-base: 0.375rem; + --radius-container: 0.75rem; + --default-border-width: 1px; + --default-divide-width: 1px; + --default-ring-width: 1px; + --body-background-color: var(--color-surface-50); + --body-background-color-dark: var(--color-surface-950); + --color-primary-50: oklch(94% 0.04 73.73deg); + --color-primary-100: oklch(87.73% 0.05 75.59deg); + --color-primary-200: oklch(81.57% 0.06 78.51deg); + --color-primary-300: oklch(75.14% 0.06 78.5deg); + --color-primary-400: oklch(68.79% 0.07 80.12deg); + --color-primary-500: oklch(62.15% 0.08 79.85deg); + --color-primary-600: oklch(57.47% 0.08 80.81deg); + --color-primary-700: oklch(52.58% 0.07 83deg); + --color-primary-800: oklch(47.45% 0.06 83.48deg); + --color-primary-900: oklch(42.32% 0.06 86.84deg); + --color-primary-950: oklch(37.14% 0.05 89.85deg); + --color-primary-contrast-dark: oklch(0% 0 none); + --color-primary-contrast-light: oklch(100% 0 none); + --color-primary-contrast-50: var(--color-primary-contrast-dark); + --color-primary-contrast-100: var(--color-primary-contrast-dark); + --color-primary-contrast-200: var(--color-primary-contrast-dark); + --color-primary-contrast-300: var(--color-primary-contrast-dark); + --color-primary-contrast-400: var(--color-primary-contrast-dark); + --color-primary-contrast-500: var(--color-primary-contrast-light); + --color-primary-contrast-600: var(--color-primary-contrast-light); + --color-primary-contrast-700: var(--color-primary-contrast-light); + --color-primary-contrast-800: var(--color-primary-contrast-light); + --color-primary-contrast-900: var(--color-primary-contrast-light); + --color-primary-contrast-950: var(--color-primary-contrast-light); + --color-secondary-50: oklch(75.37% 0.13 342.36deg); + --color-secondary-100: oklch(67.14% 0.13 343.16deg); + --color-secondary-200: oklch(58.72% 0.12 343.51deg); + --color-secondary-300: oklch(50.03% 0.12 344.44deg); + --color-secondary-400: oklch(41.1% 0.11 345.31deg); + --color-secondary-500: oklch(31.9% 0.11 347.8deg); + --color-secondary-600: oklch(31.08% 0.1 347.17deg); + --color-secondary-700: oklch(30.22% 0.09 347.48deg); + --color-secondary-800: oklch(29.36% 0.09 346.31deg); + --color-secondary-900: oklch(28.52% 0.08 346.67deg); + --color-secondary-950: oklch(27.73% 0.08 345.86deg); + --color-secondary-contrast-dark: oklch(0% 0 none); + --color-secondary-contrast-light: oklch(100% 0 none); + --color-secondary-contrast-50: var(--color-secondary-contrast-dark); + --color-secondary-contrast-100: var(--color-secondary-contrast-dark); + --color-secondary-contrast-200: var(--color-secondary-contrast-dark); + --color-secondary-contrast-300: var(--color-secondary-contrast-light); + --color-secondary-contrast-400: var(--color-secondary-contrast-light); + --color-secondary-contrast-500: var(--color-secondary-contrast-light); + --color-secondary-contrast-600: var(--color-secondary-contrast-light); + --color-secondary-contrast-700: var(--color-secondary-contrast-light); + --color-secondary-contrast-800: var(--color-secondary-contrast-light); + --color-secondary-contrast-900: var(--color-secondary-contrast-light); + --color-secondary-contrast-950: var(--color-secondary-contrast-light); + --color-tertiary-50: oklch(94.34% 0.01 106.56deg); + --color-tertiary-100: oklch(88.02% 0.01 101.97deg); + --color-tertiary-200: oklch(81.69% 0.02 106.7deg); + --color-tertiary-300: oklch(75.14% 0.02 102.87deg); + --color-tertiary-400: oklch(68.54% 0.02 106.87deg); + --color-tertiary-500: oklch(61.68% 0.02 103.61deg); + --color-tertiary-600: oklch(56.31% 0.02 103.04deg); + --color-tertiary-700: oklch(50.78% 0.02 102.71deg); + --color-tertiary-800: oklch(44.79% 0.01 101.04deg); + --color-tertiary-900: oklch(38.91% 0.01 100.24deg); + --color-tertiary-950: oklch(32.82% 0.01 97.56deg); + --color-tertiary-contrast-dark: oklch(0% 0 none); + --color-tertiary-contrast-light: oklch(100% 0 none); + --color-tertiary-contrast-50: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-100: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-200: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-300: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-400: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-500: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-600: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-700: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-800: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-900: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-950: var(--color-tertiary-contrast-light); + --color-success-50: oklch(71.46% 0.07 200.66deg); + --color-success-100: oklch(65.95% 0.07 196.69deg); + --color-success-200: oklch(60.45% 0.08 193.03deg); + --color-success-300: oklch(54.6% 0.08 189.42deg); + --color-success-400: oklch(49.08% 0.08 185.64deg); + --color-success-500: oklch(43.57% 0.08 181.34deg); + --color-success-600: oklch(41.12% 0.07 182.63deg); + --color-success-700: oklch(38.65% 0.06 184.19deg); + --color-success-800: oklch(35.92% 0.05 189.57deg); + --color-success-900: oklch(33.49% 0.05 192.97deg); + --color-success-950: oklch(31.14% 0.03 198.54deg); + --color-success-contrast-dark: oklch(0% 0 none); + --color-success-contrast-light: oklch(100% 0 none); + --color-success-contrast-50: var(--color-success-contrast-dark); + --color-success-contrast-100: var(--color-success-contrast-dark); + --color-success-contrast-200: var(--color-success-contrast-dark); + --color-success-contrast-300: var(--color-success-contrast-light); + --color-success-contrast-400: var(--color-success-contrast-light); + --color-success-contrast-500: var(--color-success-contrast-light); + --color-success-contrast-600: var(--color-success-contrast-light); + --color-success-contrast-700: var(--color-success-contrast-light); + --color-success-contrast-800: var(--color-success-contrast-light); + --color-success-contrast-900: var(--color-success-contrast-light); + --color-success-contrast-950: var(--color-success-contrast-light); + --color-warning-50: oklch(94.82% 0.05 78.84deg); + --color-warning-100: oklch(91.74% 0.07 78.31deg); + --color-warning-200: oklch(88.71% 0.09 78.11deg); + --color-warning-300: oklch(85.87% 0.11 78.6deg); + --color-warning-400: oklch(83.02% 0.13 77.38deg); + --color-warning-500: oklch(80.29% 0.14 75.34deg); + --color-warning-600: oklch(72.04% 0.13 76.24deg); + --color-warning-700: oklch(63.67% 0.11 76.81deg); + --color-warning-800: oklch(54.71% 0.08 77.03deg); + --color-warning-900: oklch(45.73% 0.06 77.56deg); + --color-warning-950: oklch(36.25% 0.03 79.67deg); + --color-warning-contrast-dark: var(--color-warning-950); + --color-warning-contrast-light: var(--color-warning-50); + --color-warning-contrast-50: var(--color-warning-contrast-dark); + --color-warning-contrast-100: var(--color-warning-contrast-dark); + --color-warning-contrast-200: var(--color-warning-contrast-dark); + --color-warning-contrast-300: var(--color-warning-contrast-dark); + --color-warning-contrast-400: var(--color-warning-contrast-dark); + --color-warning-contrast-500: var(--color-warning-contrast-dark); + --color-warning-contrast-600: var(--color-warning-contrast-light); + --color-warning-contrast-700: var(--color-warning-contrast-light); + --color-warning-contrast-800: var(--color-warning-contrast-light); + --color-warning-contrast-900: var(--color-warning-contrast-light); + --color-warning-contrast-950: var(--color-warning-contrast-light); + --color-error-50: oklch(91.32% 0.04 29.94deg); + --color-error-100: oklch(86.37% 0.06 30.9deg); + --color-error-200: oklch(81.27% 0.08 30.47deg); + --color-error-300: oklch(76.57% 0.1 30.38deg); + --color-error-400: oklch(71.68% 0.12 30.54deg); + --color-error-500: oklch(67.12% 0.14 31.43deg); + --color-error-600: oklch(60.43% 0.12 31.18deg); + --color-error-700: oklch(53.38% 0.1 31.65deg); + --color-error-800: oklch(46.09% 0.09 30.35deg); + --color-error-900: oklch(38.52% 0.07 30.88deg); + --color-error-950: oklch(30.76% 0.05 29.92deg); + --color-error-contrast-dark: var(--color-error-950); + --color-error-contrast-light: var(--color-error-50); + --color-error-contrast-50: var(--color-error-contrast-dark); + --color-error-contrast-100: var(--color-error-contrast-dark); + --color-error-contrast-200: var(--color-error-contrast-dark); + --color-error-contrast-300: var(--color-error-contrast-dark); + --color-error-contrast-400: var(--color-error-contrast-dark); + --color-error-contrast-500: var(--color-error-contrast-light); + --color-error-contrast-600: var(--color-error-contrast-light); + --color-error-contrast-700: var(--color-error-contrast-light); + --color-error-contrast-800: var(--color-error-contrast-light); + --color-error-contrast-900: var(--color-error-contrast-light); + --color-error-contrast-950: var(--color-error-contrast-light); + --color-surface-50: oklch(88.66% 0.01 121.61deg); + --color-surface-100: oklch(82.52% 0.02 123.96deg); + --color-surface-200: oklch(76.19% 0.03 127.63deg); + --color-surface-300: oklch(70.02% 0.04 128.16deg); + --color-surface-400: oklch(63.44% 0.04 129.91deg); + --color-surface-500: oklch(56.78% 0.05 130.07deg); + --color-surface-600: oklch(50.82% 0.04 130.16deg); + --color-surface-700: oklch(44.67% 0.04 130.28deg); + --color-surface-800: oklch(38.03% 0.03 129.43deg); + --color-surface-900: oklch(31.37% 0.03 129.41deg); + --color-surface-950: oklch(24.33% 0.02 129.39deg); + --color-surface-contrast-dark: var(--color-surface-950); + --color-surface-contrast-light: var(--color-surface-50); + --color-surface-contrast-50: var(--color-surface-contrast-dark); + --color-surface-contrast-100: var(--color-surface-contrast-dark); + --color-surface-contrast-200: var(--color-surface-contrast-dark); + --color-surface-contrast-300: var(--color-surface-contrast-dark); + --color-surface-contrast-400: var(--color-surface-contrast-light); + --color-surface-contrast-500: var(--color-surface-contrast-light); + --color-surface-contrast-600: var(--color-surface-contrast-light); + --color-surface-contrast-700: var(--color-surface-contrast-light); + --color-surface-contrast-800: var(--color-surface-contrast-light); + --color-surface-contrast-900: var(--color-surface-contrast-light); + --color-surface-contrast-950: var(--color-surface-contrast-light); +} diff --git a/packages/skeleton/src/themes/reign.css b/packages/skeleton/src/themes/reign.css new file mode 100644 index 0000000000..4349569e2a --- /dev/null +++ b/packages/skeleton/src/themes/reign.css @@ -0,0 +1,205 @@ +[data-theme='reign'] { + --text-scaling: 1.067; + --base-font-color: oklch(0 0 0 / 1); + --base-font-color-dark: oklch(1 0 0 / 1); + --base-font-family: Seravek, 'Gill Sans Nova', Ubuntu, Calibri, 'DejaVu Sans', source-sans-pro, sans-serif; + --base-font-size: 18px; + --base-line-height: inherit; + --base-font-weight: lighter; + --base-font-style: normal; + --base-letter-spacing: 0em; + --heading-font-color: inherit; + --heading-font-color-dark: inherit; + --heading-font-family: ui-monospace, 'Cascadia Code', 'Source Code Pro', Menlo, Consolas, 'DejaVu Sans Mono', monospace; + --heading-font-weight: bold; + --heading-font-style: normal; + --heading-letter-spacing: 0.025em; + --anchor-font-color: var(--color-surface-500); + --anchor-font-color-dark: var(--color-primary-500); + --anchor-font-family: inherit; + --anchor-font-size: inherit; + --anchor-line-height: inherit; + --anchor-font-weight: inherit; + --anchor-font-style: inherit; + --anchor-letter-spacing: inherit; + --anchor-text-decoration: underline; + --anchor-text-decoration-hover: underline; + --anchor-text-decoration-active: none; + --anchor-text-decoration-focus: none; + --spacing: 0.25rem; + --radius-base: 0.375rem; + --radius-container: 0.75rem; + --default-border-width: 1px; + --default-divide-width: 1px; + --default-ring-width: 1px; + --body-background-color: var(--color-surface-100); + --body-background-color-dark: var(--color-surface-700); + --color-primary-50: oklch(97.29% 0.11 109.38deg); + --color-primary-100: oklch(96.77% 0.13 109.49deg); + --color-primary-200: oklch(96.22% 0.14 110.06deg); + --color-primary-300: oklch(95.75% 0.15 110.15deg); + --color-primary-400: oklch(95.24% 0.16 110.62deg); + --color-primary-500: oklch(94.82% 0.17 110.7deg); + --color-primary-600: oklch(93.36% 0.17 110.73deg); + --color-primary-700: oklch(91.9% 0.17 110.75deg); + --color-primary-800: oklch(90.51% 0.17 110.41deg); + --color-primary-900: oklch(89.04% 0.16 110.43deg); + --color-primary-950: oklch(87.56% 0.16 110.46deg); + --color-primary-contrast-dark: oklch(0% 0 none); + --color-primary-contrast-light: var(--color-surface-500); + --color-primary-contrast-50: var(--color-primary-contrast-dark); + --color-primary-contrast-100: var(--color-primary-contrast-dark); + --color-primary-contrast-200: var(--color-primary-contrast-dark); + --color-primary-contrast-300: var(--color-primary-contrast-dark); + --color-primary-contrast-400: var(--color-primary-contrast-dark); + --color-primary-contrast-500: var(--color-primary-contrast-dark); + --color-primary-contrast-600: var(--color-primary-contrast-dark); + --color-primary-contrast-700: var(--color-primary-contrast-dark); + --color-primary-contrast-800: var(--color-primary-contrast-light); + --color-primary-contrast-900: var(--color-primary-contrast-light); + --color-primary-contrast-950: var(--color-primary-contrast-light); + --color-secondary-50: oklch(97.29% 0.11 109.38deg); + --color-secondary-100: oklch(96.77% 0.13 109.49deg); + --color-secondary-200: oklch(96.22% 0.14 110.06deg); + --color-secondary-300: oklch(95.75% 0.15 110.15deg); + --color-secondary-400: oklch(95.24% 0.16 110.62deg); + --color-secondary-500: oklch(94.82% 0.17 110.7deg); + --color-secondary-600: oklch(93.36% 0.17 110.73deg); + --color-secondary-700: oklch(91.9% 0.17 110.75deg); + --color-secondary-800: oklch(90.51% 0.17 110.41deg); + --color-secondary-900: oklch(89.04% 0.16 110.43deg); + --color-secondary-950: oklch(87.56% 0.16 110.46deg); + --color-secondary-contrast-dark: oklch(0% 0 none); + --color-secondary-contrast-light: var(--color-surface-500); + --color-secondary-contrast-50: var(--color-secondary-contrast-dark); + --color-secondary-contrast-100: var(--color-secondary-contrast-dark); + --color-secondary-contrast-200: var(--color-secondary-contrast-dark); + --color-secondary-contrast-300: var(--color-secondary-contrast-dark); + --color-secondary-contrast-400: var(--color-secondary-contrast-dark); + --color-secondary-contrast-500: var(--color-secondary-contrast-dark); + --color-secondary-contrast-600: var(--color-secondary-contrast-dark); + --color-secondary-contrast-700: var(--color-secondary-contrast-dark); + --color-secondary-contrast-800: var(--color-secondary-contrast-light); + --color-secondary-contrast-900: var(--color-secondary-contrast-light); + --color-secondary-contrast-950: var(--color-secondary-contrast-light); + --color-tertiary-50: oklch(97.29% 0.11 109.38deg); + --color-tertiary-100: oklch(96.77% 0.13 109.49deg); + --color-tertiary-200: oklch(96.22% 0.14 110.06deg); + --color-tertiary-300: oklch(95.75% 0.15 110.15deg); + --color-tertiary-400: oklch(95.24% 0.16 110.62deg); + --color-tertiary-500: oklch(94.82% 0.17 110.7deg); + --color-tertiary-600: oklch(93.36% 0.17 110.73deg); + --color-tertiary-700: oklch(91.9% 0.17 110.75deg); + --color-tertiary-800: oklch(90.51% 0.17 110.41deg); + --color-tertiary-900: oklch(89.04% 0.16 110.43deg); + --color-tertiary-950: oklch(87.56% 0.16 110.46deg); + --color-tertiary-contrast-dark: oklch(0% 0 none); + --color-tertiary-contrast-light: var(--color-surface-500); + --color-tertiary-contrast-50: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-100: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-200: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-300: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-400: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-500: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-600: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-700: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-800: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-900: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-950: var(--color-tertiary-contrast-light); + --color-success-50: oklch(99.04% 0.05 107.24deg); + --color-success-100: oklch(97.29% 0.08 116.69deg); + --color-success-200: oklch(95.53% 0.11 120.22deg); + --color-success-300: oklch(93.99% 0.14 123.09deg); + --color-success-400: oklch(92.42% 0.17 124.73deg); + --color-success-500: oklch(90.16% 0.17 125.26deg); + --color-success-600: oklch(85.74% 0.17 126.35deg); + --color-success-700: oklch(80.25% 0.15 126.39deg); + --color-success-800: oklch(74.52% 0.13 125.95deg); + --color-success-900: oklch(68.86% 0.11 126.18deg); + --color-success-950: oklch(63.2% 0.08 126.35deg); + --color-success-contrast-dark: oklch(0% 0 none); + --color-success-contrast-light: oklch(100% 0 none); + --color-success-contrast-50: var(--color-success-contrast-dark); + --color-success-contrast-100: var(--color-success-contrast-dark); + --color-success-contrast-200: var(--color-success-contrast-dark); + --color-success-contrast-300: var(--color-success-contrast-dark); + --color-success-contrast-400: var(--color-success-contrast-dark); + --color-success-contrast-500: var(--color-success-contrast-dark); + --color-success-contrast-600: var(--color-success-contrast-dark); + --color-success-contrast-700: var(--color-success-contrast-dark); + --color-success-contrast-800: var(--color-success-contrast-light); + --color-success-contrast-900: var(--color-success-contrast-light); + --color-success-contrast-950: var(--color-success-contrast-light); + --color-warning-50: oklch(95.6% 0.05 86.34deg); + --color-warning-100: oklch(93.97% 0.06 85.5deg); + --color-warning-200: oklch(92.54% 0.07 86.52deg); + --color-warning-300: oklch(90.93% 0.08 85.8deg); + --color-warning-400: oklch(89.52% 0.09 86.44deg); + --color-warning-500: oklch(87.95% 0.1 85.73deg); + --color-warning-600: oklch(86.14% 0.1 85.42deg); + --color-warning-700: oklch(84.5% 0.1 86.27deg); + --color-warning-800: oklch(82.76% 0.1 85.32deg); + --color-warning-900: oklch(81.11% 0.1 86.16deg); + --color-warning-950: oklch(79.26% 0.1 85.84deg); + --color-warning-contrast-dark: oklch(0% 0 none); + --color-warning-contrast-light: oklch(100% 0 none); + --color-warning-contrast-50: var(--color-warning-contrast-dark); + --color-warning-contrast-100: var(--color-warning-contrast-dark); + --color-warning-contrast-200: var(--color-warning-contrast-dark); + --color-warning-contrast-300: var(--color-warning-contrast-dark); + --color-warning-contrast-400: var(--color-warning-contrast-dark); + --color-warning-contrast-500: var(--color-warning-contrast-dark); + --color-warning-contrast-600: var(--color-warning-contrast-light); + --color-warning-contrast-700: var(--color-warning-contrast-light); + --color-warning-contrast-800: var(--color-warning-contrast-light); + --color-warning-contrast-900: var(--color-warning-contrast-light); + --color-warning-contrast-950: var(--color-warning-contrast-light); + --color-error-50: oklch(97.46% 0.01 41.28deg); + --color-error-100: oklch(95.74% 0.02 38.21deg); + --color-error-200: oklch(91.5% 0.04 39.93deg); + --color-error-300: oklch(87.18% 0.06 37.71deg); + --color-error-400: oklch(83.12% 0.08 38.66deg); + --color-error-500: oklch(79.21% 0.1 38.55deg); + --color-error-600: oklch(77.43% 0.1 38.97deg); + --color-error-700: oklch(75.78% 0.09 38.47deg); + --color-error-800: oklch(73.99% 0.09 38.95deg); + --color-error-900: oklch(72.33% 0.08 38.36deg); + --color-error-950: oklch(68.81% 0.08 39.22deg); + --color-error-contrast-dark: oklch(0% 0 none); + --color-error-contrast-light: oklch(100% 0 none); + --color-error-contrast-50: var(--color-error-contrast-dark); + --color-error-contrast-100: var(--color-error-contrast-dark); + --color-error-contrast-200: var(--color-error-contrast-dark); + --color-error-contrast-300: var(--color-error-contrast-dark); + --color-error-contrast-400: var(--color-error-contrast-light); + --color-error-contrast-500: var(--color-error-contrast-light); + --color-error-contrast-600: var(--color-error-contrast-light); + --color-error-contrast-700: var(--color-error-contrast-light); + --color-error-contrast-800: var(--color-error-contrast-light); + --color-error-contrast-900: var(--color-error-contrast-light); + --color-error-contrast-950: var(--color-error-contrast-light); + --color-surface-50: oklch(96.24% 0 164.22deg); + --color-surface-100: oklch(84.03% 0 164.35deg); + --color-surface-200: oklch(71.38% 0 196.53deg); + --color-surface-300: oklch(57.98% 0 286.84deg); + --color-surface-400: oklch(43.93% 0 286.44deg); + --color-surface-500: oklch(28.58% 0 286.27deg); + --color-surface-600: oklch(32.18% 0 286.32deg); + --color-surface-700: oklch(35.65% 0 286.57deg); + --color-surface-800: oklch(39.08% 0 286.62deg); + --color-surface-900: oklch(42.39% 0 none); + --color-surface-950: oklch(45.68% 0 none); + --color-surface-contrast-dark: oklch(0% 0 none); + --color-surface-contrast-light: oklch(100% 0 none); + --color-surface-contrast-50: var(--color-surface-contrast-dark); + --color-surface-contrast-100: var(--color-surface-contrast-dark); + --color-surface-contrast-200: var(--color-surface-contrast-dark); + --color-surface-contrast-300: var(--color-surface-contrast-dark); + --color-surface-contrast-400: var(--color-surface-contrast-light); + --color-surface-contrast-500: var(--color-surface-contrast-light); + --color-surface-contrast-600: var(--color-surface-contrast-light); + --color-surface-contrast-700: var(--color-surface-contrast-light); + --color-surface-contrast-800: var(--color-surface-contrast-light); + --color-surface-contrast-900: var(--color-surface-contrast-light); + --color-surface-contrast-950: var(--color-surface-contrast-light); +} diff --git a/packages/skeleton/src/themes/rocket.css b/packages/skeleton/src/themes/rocket.css new file mode 100644 index 0000000000..1050cd253a --- /dev/null +++ b/packages/skeleton/src/themes/rocket.css @@ -0,0 +1,205 @@ +[data-theme='rocket'] { + --text-scaling: 1.067; + --base-font-color: var(--color-surface-950); + --base-font-color-dark: var(--color-surface-50); + --base-font-family: system-ui, sans-serif; + --base-font-size: inherit; + --base-line-height: inherit; + --base-font-weight: normal; + --base-font-style: normal; + --base-letter-spacing: 0em; + --heading-font-color: inherit; + --heading-font-color-dark: inherit; + --heading-font-family: Bahnschrift, 'DIN Alternate', 'Franklin Gothic Medium', 'Nimbus Sans Narrow', sans-serif-condensed, sans-serif; + --heading-font-weight: lighter; + --heading-font-style: normal; + --heading-letter-spacing: inherit; + --anchor-font-color: var(--color-primary-600); + --anchor-font-color-dark: var(--color-primary-500); + --anchor-font-family: inherit; + --anchor-font-size: inherit; + --anchor-line-height: inherit; + --anchor-font-weight: inherit; + --anchor-font-style: inherit; + --anchor-letter-spacing: inherit; + --anchor-text-decoration: none; + --anchor-text-decoration-hover: underline; + --anchor-text-decoration-active: none; + --anchor-text-decoration-focus: none; + --spacing: 0.25rem; + --radius-base: 0.375rem; + --radius-container: 0.75rem; + --default-border-width: 1px; + --default-divide-width: 1px; + --default-ring-width: 1px; + --body-background-color: oklch(1 0 0 / 1); + --body-background-color-dark: var(--color-surface-950); + --color-primary-50: oklch(95.11% 0.03 211.57deg); + --color-primary-100: oklch(89.65% 0.06 209.91deg); + --color-primary-200: oklch(84.27% 0.08 209.95deg); + --color-primary-300: oklch(79.6% 0.11 210.67deg); + --color-primary-400: oklch(75.13% 0.12 212.31deg); + --color-primary-500: oklch(71.48% 0.13 215.21deg); + --color-primary-600: oklch(64.97% 0.11 214.79deg); + --color-primary-700: oklch(58.04% 0.1 215.21deg); + --color-primary-800: oklch(51.15% 0.09 214.62deg); + --color-primary-900: oklch(43.76% 0.08 215.22deg); + --color-primary-950: oklch(36.34% 0.06 214.48deg); + --color-primary-contrast-dark: var(--color-primary-950); + --color-primary-contrast-light: var(--color-primary-50); + --color-primary-contrast-50: var(--color-primary-contrast-dark); + --color-primary-contrast-100: var(--color-primary-contrast-dark); + --color-primary-contrast-200: var(--color-primary-contrast-dark); + --color-primary-contrast-300: var(--color-primary-contrast-dark); + --color-primary-contrast-400: var(--color-primary-contrast-dark); + --color-primary-contrast-500: var(--color-primary-contrast-dark); + --color-primary-contrast-600: var(--color-primary-contrast-dark); + --color-primary-contrast-700: var(--color-primary-contrast-light); + --color-primary-contrast-800: var(--color-primary-contrast-light); + --color-primary-contrast-900: var(--color-primary-contrast-light); + --color-primary-contrast-950: var(--color-primary-contrast-light); + --color-secondary-50: oklch(90.39% 0.04 262.14deg); + --color-secondary-100: oklch(84.43% 0.07 261.23deg); + --color-secondary-200: oklch(78.58% 0.1 261.05deg); + --color-secondary-300: oklch(72.98% 0.13 259.62deg); + --color-secondary-400: oklch(67.5% 0.16 259.73deg); + --color-secondary-500: oklch(62.31% 0.19 259.81deg); + --color-secondary-600: oklch(56.67% 0.17 259.62deg); + --color-secondary-700: oklch(50.88% 0.15 259.38deg); + --color-secondary-800: oklch(45.27% 0.14 259.05deg); + --color-secondary-900: oklch(39.12% 0.12 258.61deg); + --color-secondary-950: oklch(32.73% 0.1 257.99deg); + --color-secondary-contrast-dark: var(--color-secondary-950); + --color-secondary-contrast-light: var(--color-secondary-50); + --color-secondary-contrast-50: var(--color-secondary-contrast-dark); + --color-secondary-contrast-100: var(--color-secondary-contrast-dark); + --color-secondary-contrast-200: var(--color-secondary-contrast-dark); + --color-secondary-contrast-300: var(--color-secondary-contrast-dark); + --color-secondary-contrast-400: var(--color-secondary-contrast-dark); + --color-secondary-contrast-500: var(--color-secondary-contrast-dark); + --color-secondary-contrast-600: var(--color-secondary-contrast-light); + --color-secondary-contrast-700: var(--color-secondary-contrast-light); + --color-secondary-contrast-800: var(--color-secondary-contrast-light); + --color-secondary-contrast-900: var(--color-secondary-contrast-light); + --color-secondary-contrast-950: var(--color-secondary-contrast-light); + --color-tertiary-50: oklch(90.9% 0.05 308.41deg); + --color-tertiary-100: oklch(84.93% 0.09 307.99deg); + --color-tertiary-200: oklch(78.99% 0.13 306.89deg); + --color-tertiary-300: oklch(73.11% 0.17 306.64deg); + --color-tertiary-400: oklch(67.63% 0.2 305.25deg); + --color-tertiary-500: oklch(62.68% 0.23 303.91deg); + --color-tertiary-600: oklch(57.13% 0.21 304.11deg); + --color-tertiary-700: oklch(51.32% 0.19 303.9deg); + --color-tertiary-800: oklch(45.54% 0.16 304.3deg); + --color-tertiary-900: oklch(39.39% 0.13 304.01deg); + --color-tertiary-950: oklch(33.13% 0.1 304.38deg); + --color-tertiary-contrast-dark: var(--color-tertiary-950); + --color-tertiary-contrast-light: var(--color-tertiary-50); + --color-tertiary-contrast-50: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-100: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-200: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-300: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-400: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-500: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-600: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-700: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-800: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-900: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-950: var(--color-tertiary-contrast-light); + --color-success-50: oklch(95.46% 0.05 135.76deg); + --color-success-100: oklch(90.63% 0.09 136.23deg); + --color-success-200: oklch(86.02% 0.14 136.64deg); + --color-success-300: oklch(81.71% 0.18 137.18deg); + --color-success-400: oklch(77.74% 0.21 138.01deg); + --color-success-500: oklch(74.17% 0.23 139.28deg); + --color-success-600: oklch(67.56% 0.21 139.23deg); + --color-success-700: oklch(61.07% 0.19 139.23deg); + --color-success-800: oklch(54.16% 0.16 139.07deg); + --color-success-900: oklch(47.27% 0.14 139.07deg); + --color-success-950: oklch(39.83% 0.12 139.03deg); + --color-success-contrast-dark: var(--color-success-950); + --color-success-contrast-light: var(--color-success-50); + --color-success-contrast-50: var(--color-success-contrast-dark); + --color-success-contrast-100: var(--color-success-contrast-dark); + --color-success-contrast-200: var(--color-success-contrast-dark); + --color-success-contrast-300: var(--color-success-contrast-dark); + --color-success-contrast-400: var(--color-success-contrast-dark); + --color-success-contrast-500: var(--color-success-contrast-dark); + --color-success-contrast-600: var(--color-success-contrast-dark); + --color-success-contrast-700: var(--color-success-contrast-light); + --color-success-contrast-800: var(--color-success-contrast-light); + --color-success-contrast-900: var(--color-success-contrast-light); + --color-success-contrast-950: var(--color-success-contrast-light); + --color-warning-50: oklch(97.2% 0.03 94.02deg); + --color-warning-100: oklch(94.07% 0.07 92.41deg); + --color-warning-200: oklch(91.26% 0.1 92.56deg); + --color-warning-300: oklch(88.49% 0.13 90.94deg); + --color-warning-400: oklch(85.95% 0.15 90.22deg); + --color-warning-500: oklch(83.38% 0.16 87.97deg); + --color-warning-600: oklch(76.76% 0.15 88.43deg); + --color-warning-700: oklch(70% 0.13 89.01deg); + --color-warning-800: oklch(63.39% 0.12 89.83deg); + --color-warning-900: oklch(56.27% 0.11 90.82deg); + --color-warning-950: oklch(48.93% 0.09 92.19deg); + --color-warning-contrast-dark: var(--color-warning-950); + --color-warning-contrast-light: var(--color-warning-50); + --color-warning-contrast-50: var(--color-warning-contrast-dark); + --color-warning-contrast-100: var(--color-warning-contrast-dark); + --color-warning-contrast-200: var(--color-warning-contrast-dark); + --color-warning-contrast-300: var(--color-warning-contrast-dark); + --color-warning-contrast-400: var(--color-warning-contrast-dark); + --color-warning-contrast-500: var(--color-warning-contrast-dark); + --color-warning-contrast-600: var(--color-warning-contrast-dark); + --color-warning-contrast-700: var(--color-warning-contrast-light); + --color-warning-contrast-800: var(--color-warning-contrast-light); + --color-warning-contrast-900: var(--color-warning-contrast-light); + --color-warning-contrast-950: var(--color-warning-contrast-light); + --color-error-50: oklch(91.53% 0.03 354.83deg); + --color-error-100: oklch(82.96% 0.06 357.86deg); + --color-error-200: oklch(74.51% 0.09 359.04deg); + --color-error-300: oklch(66.39% 0.12 1.65deg); + --color-error-400: oklch(58.7% 0.15 3.98deg); + --color-error-500: oklch(51.95% 0.17 8.24deg); + --color-error-600: oklch(47.94% 0.16 8.02deg); + --color-error-700: oklch(44.05% 0.15 7.39deg); + --color-error-800: oklch(39.86% 0.13 7deg); + --color-error-900: oklch(35.77% 0.12 6.01deg); + --color-error-950: oklch(31.35% 0.1 5.2deg); + --color-error-contrast-dark: var(--color-error-950); + --color-error-contrast-light: var(--color-error-50); + --color-error-contrast-50: var(--color-error-contrast-dark); + --color-error-contrast-100: var(--color-error-contrast-dark); + --color-error-contrast-200: var(--color-error-contrast-dark); + --color-error-contrast-300: var(--color-error-contrast-dark); + --color-error-contrast-400: var(--color-error-contrast-light); + --color-error-contrast-500: var(--color-error-contrast-light); + --color-error-contrast-600: var(--color-error-contrast-light); + --color-error-contrast-700: var(--color-error-contrast-light); + --color-error-contrast-800: var(--color-error-contrast-light); + --color-error-contrast-900: var(--color-error-contrast-light); + --color-error-contrast-950: var(--color-error-contrast-light); + --color-surface-50: oklch(93.67% 0.01 264.6deg); + --color-surface-100: oklch(86.3% 0.01 264.53deg); + --color-surface-200: oklch(78.92% 0.02 256.3deg); + --color-surface-300: oklch(71.27% 0.03 259.82deg); + --color-surface-400: oklch(63.53% 0.03 256.06deg); + --color-surface-500: oklch(55.44% 0.04 257.42deg); + --color-surface-600: oklch(51.28% 0.04 256.82deg); + --color-surface-700: oklch(46.75% 0.03 257.79deg); + --color-surface-800: oklch(42.39% 0.03 257.09deg); + --color-surface-900: oklch(37.62% 0.03 258.36deg); + --color-surface-950: oklch(33.01% 0.03 257.52deg); + --color-surface-contrast-dark: var(--color-surface-950); + --color-surface-contrast-light: var(--color-surface-50); + --color-surface-contrast-50: var(--color-surface-contrast-dark); + --color-surface-contrast-100: var(--color-surface-contrast-dark); + --color-surface-contrast-200: var(--color-surface-contrast-dark); + --color-surface-contrast-300: var(--color-surface-contrast-dark); + --color-surface-contrast-400: var(--color-surface-contrast-dark); + --color-surface-contrast-500: var(--color-surface-contrast-light); + --color-surface-contrast-600: var(--color-surface-contrast-light); + --color-surface-contrast-700: var(--color-surface-contrast-light); + --color-surface-contrast-800: var(--color-surface-contrast-light); + --color-surface-contrast-900: var(--color-surface-contrast-light); + --color-surface-contrast-950: var(--color-surface-contrast-light); +} diff --git a/packages/skeleton/src/themes/rose.css b/packages/skeleton/src/themes/rose.css new file mode 100644 index 0000000000..901e0cd0c1 --- /dev/null +++ b/packages/skeleton/src/themes/rose.css @@ -0,0 +1,205 @@ +[data-theme='rose'] { + --text-scaling: 1.067; + --base-font-color: var(--color-surface-950); + --base-font-color-dark: var(--color-surface-50); + --base-font-family: Seravek, 'Gill Sans Nova', Ubuntu, Calibri, 'DejaVu Sans', source-sans-pro, sans-serif; + --base-font-size: inherit; + --base-line-height: inherit; + --base-font-weight: normal; + --base-font-style: normal; + --base-letter-spacing: 0em; + --heading-font-color: var(--color-secondary-900); + --heading-font-color-dark: var(--color-secondary-100); + --heading-font-family: Seravek, 'Gill Sans Nova', Ubuntu, Calibri, 'DejaVu Sans', source-sans-pro, sans-serif; + --heading-font-weight: normal; + --heading-font-style: normal; + --heading-letter-spacing: 0.025em; + --anchor-font-color: var(--color-primary-700); + --anchor-font-color-dark: var(--color-primary-300); + --anchor-font-family: inherit; + --anchor-font-size: inherit; + --anchor-line-height: inherit; + --anchor-font-weight: normal; + --anchor-font-style: normal; + --anchor-letter-spacing: inherit; + --anchor-text-decoration: none; + --anchor-text-decoration-hover: underline; + --anchor-text-decoration-active: none; + --anchor-text-decoration-focus: none; + --spacing: 0.25rem; + --radius-base: 0.375rem; + --radius-container: 0.75rem; + --default-border-width: 1px; + --default-divide-width: 1px; + --default-ring-width: 1px; + --body-background-color: var(--color-surface-50); + --body-background-color-dark: var(--color-surface-950); + --color-primary-50: oklch(98.84% 0.01 325.87deg); + --color-primary-100: oklch(92.93% 0.03 340.64deg); + --color-primary-200: oklch(87.07% 0.05 342.86deg); + --color-primary-300: oklch(81.16% 0.08 345.32deg); + --color-primary-400: oklch(75.46% 0.1 346.37deg); + --color-primary-500: oklch(69.89% 0.13 348.12deg); + --color-primary-600: oklch(63.65% 0.11 347.4deg); + --color-primary-700: oklch(57.25% 0.1 346.44deg); + --color-primary-800: oklch(50.34% 0.08 345.11deg); + --color-primary-900: oklch(43.55% 0.07 343deg); + --color-primary-950: oklch(36.5% 0.05 339.28deg); + --color-primary-contrast-dark: var(--color-primary-950); + --color-primary-contrast-light: var(--color-primary-50); + --color-primary-contrast-50: var(--color-primary-contrast-dark); + --color-primary-contrast-100: var(--color-primary-contrast-dark); + --color-primary-contrast-200: var(--color-primary-contrast-dark); + --color-primary-contrast-300: var(--color-primary-contrast-dark); + --color-primary-contrast-400: var(--color-primary-contrast-dark); + --color-primary-contrast-500: var(--color-primary-contrast-dark); + --color-primary-contrast-600: var(--color-primary-contrast-light); + --color-primary-contrast-700: var(--color-primary-contrast-light); + --color-primary-contrast-800: var(--color-primary-contrast-light); + --color-primary-contrast-900: var(--color-primary-contrast-light); + --color-primary-contrast-950: var(--color-primary-contrast-light); + --color-secondary-50: oklch(86.05% 0.08 297.02deg); + --color-secondary-100: oklch(77.99% 0.1 289.95deg); + --color-secondary-200: oklch(69.79% 0.13 285.81deg); + --color-secondary-300: oklch(61.82% 0.16 281.24deg); + --color-secondary-400: oklch(53.93% 0.2 277.3deg); + --color-secondary-500: oklch(46.75% 0.22 272.16deg); + --color-secondary-600: oklch(44.25% 0.2 273.25deg); + --color-secondary-700: oklch(41.8% 0.17 274.56deg); + --color-secondary-800: oklch(39.69% 0.14 276.3deg); + --color-secondary-900: oklch(37.44% 0.11 278.16deg); + --color-secondary-950: oklch(35.34% 0.08 280.43deg); + --color-secondary-contrast-dark: var(--color-secondary-950); + --color-secondary-contrast-light: oklch(100% 0 none); + --color-secondary-contrast-50: var(--color-secondary-contrast-dark); + --color-secondary-contrast-100: var(--color-secondary-contrast-dark); + --color-secondary-contrast-200: var(--color-secondary-contrast-dark); + --color-secondary-contrast-300: var(--color-secondary-contrast-dark); + --color-secondary-contrast-400: var(--color-secondary-contrast-dark); + --color-secondary-contrast-500: var(--color-secondary-contrast-light); + --color-secondary-contrast-600: var(--color-secondary-contrast-light); + --color-secondary-contrast-700: var(--color-secondary-contrast-light); + --color-secondary-contrast-800: var(--color-secondary-contrast-light); + --color-secondary-contrast-900: var(--color-secondary-contrast-light); + --color-secondary-contrast-950: var(--color-secondary-contrast-light); + --color-tertiary-50: oklch(91.02% 0.03 283.86deg); + --color-tertiary-100: oklch(88.62% 0.04 287.09deg); + --color-tertiary-200: oklch(85.94% 0.05 289.02deg); + --color-tertiary-300: oklch(83.53% 0.06 290.39deg); + --color-tertiary-400: oklch(80.83% 0.07 291.18deg); + --color-tertiary-500: oklch(78.41% 0.08 291.85deg); + --color-tertiary-600: oklch(70.11% 0.07 291.76deg); + --color-tertiary-700: oklch(61.64% 0.06 289.88deg); + --color-tertiary-800: oklch(52.79% 0.06 289.43deg); + --color-tertiary-900: oklch(43.63% 0.05 285.98deg); + --color-tertiary-950: oklch(33.87% 0.04 284.17deg); + --color-tertiary-contrast-dark: var(--color-tertiary-950); + --color-tertiary-contrast-light: oklch(100% 0 none); + --color-tertiary-contrast-50: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-100: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-200: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-300: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-400: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-500: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-600: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-700: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-800: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-900: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-950: var(--color-tertiary-contrast-light); + --color-success-50: oklch(94.94% 0.03 193.62deg); + --color-success-100: oklch(90.96% 0.03 194.03deg); + --color-success-200: oklch(86.99% 0.04 196.47deg); + --color-success-300: oklch(83.03% 0.04 196.36deg); + --color-success-400: oklch(78.99% 0.05 198.01deg); + --color-success-500: oklch(74.9% 0.05 197.71deg); + --color-success-600: oklch(68.18% 0.04 207.57deg); + --color-success-700: oklch(61.23% 0.04 220.28deg); + --color-success-800: oklch(54.13% 0.04 234.71deg); + --color-success-900: oklch(46.77% 0.04 251.34deg); + --color-success-950: oklch(39.23% 0.04 267.48deg); + --color-success-contrast-dark: var(--color-success-950); + --color-success-contrast-light: oklch(100% 0 none); + --color-success-contrast-50: var(--color-success-contrast-dark); + --color-success-contrast-100: var(--color-success-contrast-dark); + --color-success-contrast-200: var(--color-success-contrast-dark); + --color-success-contrast-300: var(--color-success-contrast-dark); + --color-success-contrast-400: var(--color-success-contrast-dark); + --color-success-contrast-500: var(--color-success-contrast-dark); + --color-success-contrast-600: var(--color-success-contrast-light); + --color-success-contrast-700: var(--color-success-contrast-light); + --color-success-contrast-800: var(--color-success-contrast-light); + --color-success-contrast-900: var(--color-success-contrast-light); + --color-success-contrast-950: var(--color-success-contrast-light); + --color-warning-50: oklch(95.05% 0.04 89.08deg); + --color-warning-100: oklch(93.14% 0.07 89.33deg); + --color-warning-200: oklch(91.3% 0.09 89.53deg); + --color-warning-300: oklch(89.39% 0.12 88.39deg); + --color-warning-400: oklch(87.77% 0.14 87.88deg); + --color-warning-500: oklch(86.28% 0.15 86.64deg); + --color-warning-600: oklch(77.23% 0.13 85.95deg); + --color-warning-700: oklch(67.92% 0.11 84.82deg); + --color-warning-800: oklch(58.62% 0.09 83.05deg); + --color-warning-900: oklch(48.62% 0.06 78.54deg); + --color-warning-950: oklch(38.16% 0.03 62.96deg); + --color-warning-contrast-dark: var(--color-warning-950); + --color-warning-contrast-light: oklch(100% 0 none); + --color-warning-contrast-50: var(--color-warning-contrast-dark); + --color-warning-contrast-100: var(--color-warning-contrast-dark); + --color-warning-contrast-200: var(--color-warning-contrast-dark); + --color-warning-contrast-300: var(--color-warning-contrast-dark); + --color-warning-contrast-400: var(--color-warning-contrast-dark); + --color-warning-contrast-500: var(--color-warning-contrast-dark); + --color-warning-contrast-600: var(--color-warning-contrast-light); + --color-warning-contrast-700: var(--color-warning-contrast-light); + --color-warning-contrast-800: var(--color-warning-contrast-light); + --color-warning-contrast-900: var(--color-warning-contrast-light); + --color-warning-contrast-950: var(--color-warning-contrast-light); + --color-error-50: oklch(85% 0.08 340.19deg); + --color-error-100: oklch(81.23% 0.09 352.41deg); + --color-error-200: oklch(77.38% 0.1 1.51deg); + --color-error-300: oklch(73.88% 0.11 10.23deg); + --color-error-400: oklch(70.25% 0.13 15.98deg); + --color-error-500: oklch(66.92% 0.14 21.65deg); + --color-error-600: oklch(61.21% 0.13 12.87deg); + --color-error-700: oklch(55.42% 0.12 2.77deg); + --color-error-800: oklch(49.6% 0.12 349.78deg); + --color-error-900: oklch(43.73% 0.12 335.83deg); + --color-error-950: oklch(38.01% 0.13 321.16deg); + --color-error-contrast-dark: var(--color-error-950); + --color-error-contrast-light: oklch(100% 0 none); + --color-error-contrast-50: var(--color-error-contrast-dark); + --color-error-contrast-100: var(--color-error-contrast-dark); + --color-error-contrast-200: var(--color-error-contrast-dark); + --color-error-contrast-300: var(--color-error-contrast-dark); + --color-error-contrast-400: var(--color-error-contrast-dark); + --color-error-contrast-500: var(--color-error-contrast-light); + --color-error-contrast-600: var(--color-error-contrast-light); + --color-error-contrast-700: var(--color-error-contrast-light); + --color-error-contrast-800: var(--color-error-contrast-light); + --color-error-contrast-900: var(--color-error-contrast-light); + --color-error-contrast-950: var(--color-error-contrast-light); + --color-surface-50: oklch(96.76% 0.01 318.08deg); + --color-surface-100: oklch(89.43% 0.01 322.48deg); + --color-surface-200: oklch(81.95% 0.02 323.72deg); + --color-surface-300: oklch(74.42% 0.03 325.97deg); + --color-surface-400: oklch(66.63% 0.04 326.1deg); + --color-surface-500: oklch(58.65% 0.06 326.28deg); + --color-surface-600: oklch(52.51% 0.05 324.99deg); + --color-surface-700: oklch(46.18% 0.04 323.16deg); + --color-surface-800: oklch(39.81% 0.03 321.83deg); + --color-surface-900: oklch(33% 0.02 316.85deg); + --color-surface-950: oklch(25.82% 0.01 304.87deg); + --color-surface-contrast-dark: var(--color-surface-950); + --color-surface-contrast-light: var(--color-surface-50); + --color-surface-contrast-50: var(--color-surface-contrast-dark); + --color-surface-contrast-100: var(--color-surface-contrast-dark); + --color-surface-contrast-200: var(--color-surface-contrast-dark); + --color-surface-contrast-300: var(--color-surface-contrast-dark); + --color-surface-contrast-400: var(--color-surface-contrast-dark); + --color-surface-contrast-500: var(--color-surface-contrast-light); + --color-surface-contrast-600: var(--color-surface-contrast-light); + --color-surface-contrast-700: var(--color-surface-contrast-light); + --color-surface-contrast-800: var(--color-surface-contrast-light); + --color-surface-contrast-900: var(--color-surface-contrast-light); + --color-surface-contrast-950: var(--color-surface-contrast-light); +} diff --git a/packages/skeleton/src/themes/sahara.css b/packages/skeleton/src/themes/sahara.css new file mode 100644 index 0000000000..b7e6f9d38d --- /dev/null +++ b/packages/skeleton/src/themes/sahara.css @@ -0,0 +1,205 @@ +[data-theme='sahara'] { + --text-scaling: 1.067; + --base-font-color: var(--color-surface-950); + --base-font-color-dark: var(--color-surface-50); + --base-font-family: Seravek, 'Gill Sans Nova', Ubuntu, Calibri, 'DejaVu Sans', source-sans-pro, sans-serif; + --base-font-size: inherit; + --base-line-height: inherit; + --base-font-weight: normal; + --base-font-style: normal; + --base-letter-spacing: 0.025em; + --heading-font-color: inherit; + --heading-font-color-dark: inherit; + --heading-font-family: Superclarendon, 'Bookman Old Style', 'URW Bookman', 'URW Bookman L', 'Georgia Pro', Georgia, serif; + --heading-font-weight: normal; + --heading-font-style: normal; + --heading-letter-spacing: inherit; + --anchor-font-color: var(--color-tertiary-800); + --anchor-font-color-dark: var(--color-primary-500); + --anchor-font-family: inherit; + --anchor-font-size: inherit; + --anchor-line-height: inherit; + --anchor-font-weight: inherit; + --anchor-font-style: inherit; + --anchor-letter-spacing: inherit; + --anchor-text-decoration: none; + --anchor-text-decoration-hover: underline; + --anchor-text-decoration-active: none; + --anchor-text-decoration-focus: none; + --spacing: 0.25rem; + --radius-base: 0.375rem; + --radius-container: 0.75rem; + --default-border-width: 1px; + --default-divide-width: 1px; + --default-ring-width: 1px; + --body-background-color: var(--color-surface-50); + --body-background-color-dark: var(--color-surface-950); + --color-primary-50: oklch(91.62% 0.04 80.3deg); + --color-primary-100: oklch(88.74% 0.07 80.84deg); + --color-primary-200: oklch(85.97% 0.09 80.37deg); + --color-primary-300: oklch(83.19% 0.11 80.38deg); + --color-primary-400: oklch(80.63% 0.13 78.92deg); + --color-primary-500: oklch(78.19% 0.15 76.87deg); + --color-primary-600: oklch(74.03% 0.14 75.83deg); + --color-primary-700: oklch(69.63% 0.13 73.95deg); + --color-primary-800: oklch(65.34% 0.13 72.73deg); + --color-primary-900: oklch(60.81% 0.12 70.35deg); + --color-primary-950: oklch(56.39% 0.12 68.46deg); + --color-primary-contrast-dark: oklch(0% 0 none); + --color-primary-contrast-light: var(--color-primary-50); + --color-primary-contrast-50: var(--color-primary-contrast-dark); + --color-primary-contrast-100: var(--color-primary-contrast-dark); + --color-primary-contrast-200: var(--color-primary-contrast-dark); + --color-primary-contrast-300: var(--color-primary-contrast-dark); + --color-primary-contrast-400: var(--color-primary-contrast-dark); + --color-primary-contrast-500: var(--color-primary-contrast-dark); + --color-primary-contrast-600: var(--color-primary-contrast-dark); + --color-primary-contrast-700: var(--color-primary-contrast-light); + --color-primary-contrast-800: var(--color-primary-contrast-light); + --color-primary-contrast-900: var(--color-primary-contrast-light); + --color-primary-contrast-950: var(--color-primary-contrast-light); + --color-secondary-50: oklch(92.18% 0.03 194.04deg); + --color-secondary-100: oklch(88.48% 0.05 190.34deg); + --color-secondary-200: oklch(85.19% 0.08 187.46deg); + --color-secondary-300: oklch(81.96% 0.09 186.93deg); + --color-secondary-400: oklch(79.12% 0.11 184.89deg); + --color-secondary-500: oklch(76.32% 0.12 183.49deg); + --color-secondary-600: oklch(70.06% 0.11 183.71deg); + --color-secondary-700: oklch(63.6% 0.1 183.21deg); + --color-secondary-800: oklch(56.77% 0.09 184.29deg); + --color-secondary-900: oklch(49.94% 0.08 183.71deg); + --color-secondary-950: oklch(42.93% 0.07 184.14deg); + --color-secondary-contrast-dark: var(--color-secondary-950); + --color-secondary-contrast-light: var(--color-secondary-50); + --color-secondary-contrast-50: var(--color-secondary-contrast-dark); + --color-secondary-contrast-100: var(--color-secondary-contrast-dark); + --color-secondary-contrast-200: var(--color-secondary-contrast-dark); + --color-secondary-contrast-300: var(--color-secondary-contrast-dark); + --color-secondary-contrast-400: var(--color-secondary-contrast-dark); + --color-secondary-contrast-500: var(--color-secondary-contrast-dark); + --color-secondary-contrast-600: var(--color-secondary-contrast-dark); + --color-secondary-contrast-700: var(--color-secondary-contrast-light); + --color-secondary-contrast-800: var(--color-secondary-contrast-light); + --color-secondary-contrast-900: var(--color-secondary-contrast-light); + --color-secondary-contrast-950: var(--color-secondary-contrast-light); + --color-tertiary-50: oklch(92.13% 0.03 125.15deg); + --color-tertiary-100: oklch(90.83% 0.05 125.1deg); + --color-tertiary-200: oklch(89.46% 0.07 125.79deg); + --color-tertiary-300: oklch(88.21% 0.09 125.93deg); + --color-tertiary-400: oklch(86.91% 0.1 126.5deg); + --color-tertiary-500: oklch(85.72% 0.12 126.76deg); + --color-tertiary-600: oklch(78.44% 0.11 126.76deg); + --color-tertiary-700: oklch(71.21% 0.1 127.12deg); + --color-tertiary-800: oklch(63.6% 0.09 126.32deg); + --color-tertiary-900: oklch(55.96% 0.08 126.72deg); + --color-tertiary-950: oklch(47.78% 0.07 126.72deg); + --color-tertiary-contrast-dark: var(--color-tertiary-950); + --color-tertiary-contrast-light: var(--color-tertiary-50); + --color-tertiary-contrast-50: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-100: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-200: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-300: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-400: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-500: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-600: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-700: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-800: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-900: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-950: var(--color-tertiary-contrast-light); + --color-success-50: oklch(92.63% 0.03 122.63deg); + --color-success-100: oklch(89.09% 0.07 124.91deg); + --color-success-200: oklch(85.69% 0.12 126.01deg); + --color-success-300: oklch(82.52% 0.15 127.33deg); + --color-success-400: oklch(79.55% 0.19 128.82deg); + --color-success-500: oklch(76.81% 0.2 130.85deg); + --color-success-600: oklch(70.53% 0.19 130.9deg); + --color-success-700: oklch(63.85% 0.17 130.77deg); + --color-success-800: oklch(57.25% 0.15 130.83deg); + --color-success-900: oklch(50.18% 0.13 130.59deg); + --color-success-950: oklch(43.13% 0.12 130.51deg); + --color-success-contrast-dark: var(--color-success-950); + --color-success-contrast-light: var(--color-success-50); + --color-success-contrast-50: var(--color-success-contrast-dark); + --color-success-contrast-100: var(--color-success-contrast-dark); + --color-success-contrast-200: var(--color-success-contrast-dark); + --color-success-contrast-300: var(--color-success-contrast-dark); + --color-success-contrast-400: var(--color-success-contrast-dark); + --color-success-contrast-500: var(--color-success-contrast-dark); + --color-success-contrast-600: var(--color-success-contrast-dark); + --color-success-contrast-700: var(--color-success-contrast-light); + --color-success-contrast-800: var(--color-success-contrast-light); + --color-success-contrast-900: var(--color-success-contrast-light); + --color-success-contrast-950: var(--color-success-contrast-light); + --color-warning-50: oklch(93.26% 0.06 94.56deg); + --color-warning-100: oklch(91.02% 0.07 93.19deg); + --color-warning-200: oklch(88.78% 0.09 92.44deg); + --color-warning-300: oklch(86.5% 0.1 92.21deg); + --color-warning-400: oklch(84.33% 0.12 91.47deg); + --color-warning-500: oklch(82.22% 0.13 90.47deg); + --color-warning-600: oklch(75.44% 0.12 90.62deg); + --color-warning-700: oklch(68.29% 0.11 90.16deg); + --color-warning-800: oklch(61.07% 0.1 91.06deg); + --color-warning-900: oklch(53.51% 0.08 90.51deg); + --color-warning-950: oklch(45.9% 0.07 90.82deg); + --color-warning-contrast-dark: var(--color-warning-950); + --color-warning-contrast-light: var(--color-warning-50); + --color-warning-contrast-50: var(--color-warning-contrast-dark); + --color-warning-contrast-100: var(--color-warning-contrast-dark); + --color-warning-contrast-200: var(--color-warning-contrast-dark); + --color-warning-contrast-300: var(--color-warning-contrast-dark); + --color-warning-contrast-400: var(--color-warning-contrast-dark); + --color-warning-contrast-500: var(--color-warning-contrast-dark); + --color-warning-contrast-600: var(--color-warning-contrast-dark); + --color-warning-contrast-700: var(--color-warning-contrast-dark); + --color-warning-contrast-800: var(--color-warning-contrast-light); + --color-warning-contrast-900: var(--color-warning-contrast-light); + --color-warning-contrast-950: var(--color-warning-contrast-light); + --color-error-50: oklch(90.58% 0.04 348.92deg); + --color-error-100: oklch(85.27% 0.06 348.16deg); + --color-error-200: oklch(79.87% 0.09 348.8deg); + --color-error-300: oklch(74.74% 0.12 349.03deg); + --color-error-400: oklch(69.77% 0.15 350.31deg); + --color-error-500: oklch(65.35% 0.17 351.55deg); + --color-error-600: oklch(60.74% 0.17 351.86deg); + --color-error-700: oklch(56.21% 0.16 352.52deg); + --color-error-800: oklch(51.44% 0.15 353.56deg); + --color-error-900: oklch(46.79% 0.15 354.57deg); + --color-error-950: oklch(41.93% 0.14 355.49deg); + --color-error-contrast-dark: var(--color-error-950); + --color-error-contrast-light: var(--color-error-50); + --color-error-contrast-50: var(--color-error-contrast-dark); + --color-error-contrast-100: var(--color-error-contrast-dark); + --color-error-contrast-200: var(--color-error-contrast-dark); + --color-error-contrast-300: var(--color-error-contrast-dark); + --color-error-contrast-400: var(--color-error-contrast-dark); + --color-error-contrast-500: var(--color-error-contrast-dark); + --color-error-contrast-600: var(--color-error-contrast-light); + --color-error-contrast-700: var(--color-error-contrast-light); + --color-error-contrast-800: var(--color-error-contrast-light); + --color-error-contrast-900: var(--color-error-contrast-light); + --color-error-contrast-950: var(--color-error-contrast-light); + --color-surface-50: oklch(94.95% 0.02 2.38deg); + --color-surface-100: oklch(87.73% 0.05 5.32deg); + --color-surface-200: oklch(80.76% 0.08 7.18deg); + --color-surface-300: oklch(73.91% 0.11 9.52deg); + --color-surface-400: oklch(67.64% 0.15 11.53deg); + --color-surface-500: oklch(61.92% 0.17 14.12deg); + --color-surface-600: oklch(56.84% 0.16 14.16deg); + --color-surface-700: oklch(51.79% 0.15 13.98deg); + --color-surface-800: oklch(46.47% 0.13 14.02deg); + --color-surface-900: oklch(41.14% 0.12 13.76deg); + --color-surface-950: oklch(35.48% 0.1 13.78deg); + --color-surface-contrast-dark: var(--color-surface-950); + --color-surface-contrast-light: var(--color-surface-50); + --color-surface-contrast-50: var(--color-surface-contrast-dark); + --color-surface-contrast-100: var(--color-surface-contrast-dark); + --color-surface-contrast-200: var(--color-surface-contrast-dark); + --color-surface-contrast-300: var(--color-surface-contrast-dark); + --color-surface-contrast-400: var(--color-surface-contrast-dark); + --color-surface-contrast-500: var(--color-surface-contrast-light); + --color-surface-contrast-600: var(--color-surface-contrast-light); + --color-surface-contrast-700: var(--color-surface-contrast-light); + --color-surface-contrast-800: var(--color-surface-contrast-light); + --color-surface-contrast-900: var(--color-surface-contrast-light); + --color-surface-contrast-950: var(--color-surface-contrast-light); +} diff --git a/packages/skeleton/src/themes/seafoam.css b/packages/skeleton/src/themes/seafoam.css new file mode 100644 index 0000000000..4b39b705e0 --- /dev/null +++ b/packages/skeleton/src/themes/seafoam.css @@ -0,0 +1,205 @@ +[data-theme='seafoam'] { + --text-scaling: 1.067; + --base-font-color: var(--color-surface-950); + --base-font-color-dark: var(--color-surface-50); + --base-font-family: Inter, Roboto, 'Helvetica Neue', 'Arial Nova', 'Nimbus Sans', Arial, sans-serif; + --base-font-size: inherit; + --base-line-height: inherit; + --base-font-weight: normal; + --base-font-style: normal; + --base-letter-spacing: 0.025em; + --heading-font-color: inherit; + --heading-font-color-dark: inherit; + --heading-font-family: Optima, Candara, 'Noto Sans', source-sans-pro, sans-serif; + --heading-font-weight: bold; + --heading-font-style: normal; + --heading-letter-spacing: inherit; + --anchor-font-color: var(--color-tertiary-500); + --anchor-font-color-dark: var(--color-tertiary-300); + --anchor-font-family: inherit; + --anchor-font-size: inherit; + --anchor-line-height: inherit; + --anchor-font-weight: inherit; + --anchor-font-style: inherit; + --anchor-letter-spacing: inherit; + --anchor-text-decoration: none; + --anchor-text-decoration-hover: underline; + --anchor-text-decoration-active: none; + --anchor-text-decoration-focus: none; + --spacing: 0.25rem; + --radius-base: 0.375rem; + --radius-container: 0.75rem; + --default-border-width: 1px; + --default-divide-width: 1px; + --default-ring-width: 1px; + --body-background-color: var(--color-surface-50); + --body-background-color-dark: var(--color-surface-950); + --color-primary-50: oklch(86.35% 0.04 189.19deg); + --color-primary-100: oklch(85.27% 0.05 188.47deg); + --color-primary-200: oklch(84.01% 0.06 190.5deg); + --color-primary-300: oklch(83.02% 0.06 189.62deg); + --color-primary-400: oklch(81.79% 0.07 191.16deg); + --color-primary-500: oklch(80.78% 0.07 190.34deg); + --color-primary-600: oklch(73.85% 0.07 193.39deg); + --color-primary-700: oklch(67.02% 0.07 195.59deg); + --color-primary-800: oklch(59.83% 0.07 199.41deg); + --color-primary-900: oklch(52.66% 0.06 202.3deg); + --color-primary-950: oklch(45.03% 0.06 207.35deg); + --color-primary-contrast-dark: var(--color-primary-950); + --color-primary-contrast-light: var(--color-primary-50); + --color-primary-contrast-50: var(--color-primary-contrast-dark); + --color-primary-contrast-100: var(--color-primary-contrast-dark); + --color-primary-contrast-200: var(--color-primary-contrast-dark); + --color-primary-contrast-300: var(--color-primary-contrast-dark); + --color-primary-contrast-400: var(--color-primary-contrast-dark); + --color-primary-contrast-500: var(--color-primary-contrast-dark); + --color-primary-contrast-600: var(--color-primary-contrast-dark); + --color-primary-contrast-700: var(--color-primary-contrast-dark); + --color-primary-contrast-800: var(--color-primary-contrast-light); + --color-primary-contrast-900: var(--color-primary-contrast-light); + --color-primary-contrast-950: var(--color-primary-contrast-light); + --color-secondary-50: oklch(91.05% 0.02 272.34deg); + --color-secondary-100: oklch(80.13% 0.03 267.9deg); + --color-secondary-200: oklch(68.96% 0.03 267.84deg); + --color-secondary-300: oklch(57.45% 0.04 263.44deg); + --color-secondary-400: oklch(45.31% 0.05 263.83deg); + --color-secondary-500: oklch(32.36% 0.07 262.2deg); + --color-secondary-600: oklch(30.31% 0.06 260.77deg); + --color-secondary-700: oklch(28.04% 0.07 261.53deg); + --color-secondary-800: oklch(26.03% 0.07 260.64deg); + --color-secondary-900: oklch(23.71% 0.07 261.32deg); + --color-secondary-950: oklch(21.54% 0.07 259.59deg); + --color-secondary-contrast-dark: var(--color-secondary-950); + --color-secondary-contrast-light: var(--color-secondary-50); + --color-secondary-contrast-50: var(--color-secondary-contrast-dark); + --color-secondary-contrast-100: var(--color-secondary-contrast-dark); + --color-secondary-contrast-200: var(--color-secondary-contrast-dark); + --color-secondary-contrast-300: var(--color-secondary-contrast-dark); + --color-secondary-contrast-400: var(--color-secondary-contrast-light); + --color-secondary-contrast-500: var(--color-secondary-contrast-light); + --color-secondary-contrast-600: var(--color-secondary-contrast-light); + --color-secondary-contrast-700: var(--color-secondary-contrast-light); + --color-secondary-contrast-800: var(--color-secondary-contrast-light); + --color-secondary-contrast-900: var(--color-secondary-contrast-light); + --color-secondary-contrast-950: var(--color-secondary-contrast-light); + --color-tertiary-50: oklch(90.76% 0.03 37.85deg); + --color-tertiary-100: oklch(84.09% 0.07 38.61deg); + --color-tertiary-200: oklch(77.78% 0.12 38.08deg); + --color-tertiary-300: oklch(72.57% 0.16 38.08deg); + --color-tertiary-400: oklch(68.22% 0.21 36.8deg); + --color-tertiary-500: oklch(65.36% 0.23 34.04deg); + --color-tertiary-600: oklch(60.2% 0.22 33.84deg); + --color-tertiary-700: oklch(55% 0.2 33.85deg); + --color-tertiary-800: oklch(49.42% 0.18 33.57deg); + --color-tertiary-900: oklch(43.94% 0.16 33.5deg); + --color-tertiary-950: oklch(38.21% 0.14 32.79deg); + --color-tertiary-contrast-dark: var(--color-tertiary-950); + --color-tertiary-contrast-light: var(--color-tertiary-50); + --color-tertiary-contrast-50: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-100: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-200: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-300: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-400: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-500: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-600: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-700: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-800: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-900: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-950: var(--color-tertiary-contrast-light); + --color-success-50: oklch(96.87% 0.04 176.7deg); + --color-success-100: oklch(92.72% 0.07 174.92deg); + --color-success-200: oklch(89.03% 0.11 172.37deg); + --color-success-300: oklch(86.15% 0.14 169.82deg); + --color-success-400: oklch(83.58% 0.16 166.65deg); + --color-success-500: oklch(81.59% 0.18 163.19deg); + --color-success-600: oklch(75.63% 0.16 163.14deg); + --color-success-700: oklch(69.54% 0.15 163.11deg); + --color-success-800: oklch(63.06% 0.13 163.38deg); + --color-success-900: oklch(56.68% 0.12 163.37deg); + --color-success-950: oklch(50.11% 0.11 163.31deg); + --color-success-contrast-dark: var(--color-success-950); + --color-success-contrast-light: var(--color-success-50); + --color-success-contrast-50: var(--color-success-contrast-dark); + --color-success-contrast-100: var(--color-success-contrast-dark); + --color-success-contrast-200: var(--color-success-contrast-dark); + --color-success-contrast-300: var(--color-success-contrast-dark); + --color-success-contrast-400: var(--color-success-contrast-dark); + --color-success-contrast-500: var(--color-success-contrast-dark); + --color-success-contrast-600: var(--color-success-contrast-dark); + --color-success-contrast-700: var(--color-success-contrast-light); + --color-success-contrast-800: var(--color-success-contrast-light); + --color-success-contrast-900: var(--color-success-contrast-light); + --color-success-contrast-950: var(--color-success-contrast-light); + --color-warning-50: oklch(97.91% 0.02 103.36deg); + --color-warning-100: oklch(96.16% 0.05 104.95deg); + --color-warning-200: oklch(94.52% 0.08 105.64deg); + --color-warning-300: oklch(92.87% 0.11 106.76deg); + --color-warning-400: oklch(91.4% 0.14 107.05deg); + --color-warning-500: oklch(90.02% 0.16 107.27deg); + --color-warning-600: oklch(82.57% 0.15 107.06deg); + --color-warning-700: oklch(75.17% 0.13 107.29deg); + --color-warning-800: oklch(67.36% 0.12 107.02deg); + --color-warning-900: oklch(59.55% 0.11 107.31deg); + --color-warning-950: oklch(51.23% 0.09 106.93deg); + --color-warning-contrast-dark: var(--color-warning-950); + --color-warning-contrast-light: var(--color-warning-50); + --color-warning-contrast-50: var(--color-warning-contrast-dark); + --color-warning-contrast-100: var(--color-warning-contrast-dark); + --color-warning-contrast-200: var(--color-warning-contrast-dark); + --color-warning-contrast-300: var(--color-warning-contrast-dark); + --color-warning-contrast-400: var(--color-warning-contrast-dark); + --color-warning-contrast-500: var(--color-warning-contrast-dark); + --color-warning-contrast-600: var(--color-warning-contrast-dark); + --color-warning-contrast-700: var(--color-warning-contrast-dark); + --color-warning-contrast-800: var(--color-warning-contrast-light); + --color-warning-contrast-900: var(--color-warning-contrast-light); + --color-warning-contrast-950: var(--color-warning-contrast-light); + --color-error-50: oklch(91.83% 0.01 17.51deg); + --color-error-100: oklch(84.54% 0.04 17.96deg); + --color-error-200: oklch(77.52% 0.07 18.84deg); + --color-error-300: oklch(70.54% 0.11 20.12deg); + --color-error-400: oklch(64.46% 0.14 21.93deg); + --color-error-500: oklch(59.13% 0.18 24.29deg); + --color-error-600: oklch(54.39% 0.17 24.09deg); + --color-error-700: oklch(49.67% 0.15 24.21deg); + --color-error-800: oklch(44.73% 0.14 24deg); + --color-error-900: oklch(39.78% 0.13 24.16deg); + --color-error-950: oklch(34.58% 0.12 24deg); + --color-error-contrast-dark: var(--color-error-950); + --color-error-contrast-light: var(--color-error-50); + --color-error-contrast-50: var(--color-error-contrast-dark); + --color-error-contrast-100: var(--color-error-contrast-dark); + --color-error-contrast-200: var(--color-error-contrast-dark); + --color-error-contrast-300: var(--color-error-contrast-dark); + --color-error-contrast-400: var(--color-error-contrast-dark); + --color-error-contrast-500: var(--color-error-contrast-light); + --color-error-contrast-600: var(--color-error-contrast-light); + --color-error-contrast-700: var(--color-error-contrast-light); + --color-error-contrast-800: var(--color-error-contrast-light); + --color-error-contrast-900: var(--color-error-contrast-light); + --color-error-contrast-950: var(--color-error-contrast-light); + --color-surface-50: oklch(93.2% 0.04 209.05deg); + --color-surface-100: oklch(85.64% 0.05 200.59deg); + --color-surface-200: oklch(78.32% 0.07 194.64deg); + --color-surface-300: oklch(70.86% 0.08 190.45deg); + --color-surface-400: oklch(63.79% 0.09 186.91deg); + --color-surface-500: oklch(56.76% 0.1 183.91deg); + --color-surface-600: oklch(52.47% 0.09 189.64deg); + --color-surface-700: oklch(48.4% 0.08 196.09deg); + --color-surface-800: oklch(43.99% 0.07 204.9deg); + --color-surface-900: oklch(39.84% 0.06 216.87deg); + --color-surface-950: oklch(35.4% 0.05 234.87deg); + --color-surface-contrast-dark: var(--color-surface-950); + --color-surface-contrast-light: var(--color-surface-50); + --color-surface-contrast-50: var(--color-surface-contrast-dark); + --color-surface-contrast-100: var(--color-surface-contrast-dark); + --color-surface-contrast-200: var(--color-surface-contrast-dark); + --color-surface-contrast-300: var(--color-surface-contrast-dark); + --color-surface-contrast-400: var(--color-surface-contrast-dark); + --color-surface-contrast-500: var(--color-surface-contrast-light); + --color-surface-contrast-600: var(--color-surface-contrast-light); + --color-surface-contrast-700: var(--color-surface-contrast-light); + --color-surface-contrast-800: var(--color-surface-contrast-light); + --color-surface-contrast-900: var(--color-surface-contrast-light); + --color-surface-contrast-950: var(--color-surface-contrast-light); +} diff --git a/packages/skeleton/src/themes/terminus.css b/packages/skeleton/src/themes/terminus.css new file mode 100644 index 0000000000..e62397d5be --- /dev/null +++ b/packages/skeleton/src/themes/terminus.css @@ -0,0 +1,205 @@ +[data-theme='terminus'] { + --text-scaling: 1.067; + --base-font-color: var(--color-surface-950); + --base-font-color-dark: var(--color-surface-50); + --base-font-family: Avenir, Montserrat, Corbel, 'URW Gothic', source-sans-pro, sans-serif; + --base-font-size: inherit; + --base-line-height: inherit; + --base-font-weight: normal; + --base-font-style: normal; + --base-letter-spacing: 0.025em; + --heading-font-color: inherit; + --heading-font-color-dark: inherit; + --heading-font-family: Inter, Roboto, 'Helvetica Neue', 'Arial Nova', 'Nimbus Sans', Arial, sans-serif; + --heading-font-weight: bold; + --heading-font-style: normal; + --heading-letter-spacing: -0.025em; + --anchor-font-color: var(--color-secondary-950); + --anchor-font-color-dark: var(--color-secondary-500); + --anchor-font-family: inherit; + --anchor-font-size: inherit; + --anchor-line-height: inherit; + --anchor-font-weight: inherit; + --anchor-font-style: inherit; + --anchor-letter-spacing: inherit; + --anchor-text-decoration: inherit; + --anchor-text-decoration-hover: underline; + --anchor-text-decoration-active: none; + --anchor-text-decoration-focus: none; + --spacing: 0.25rem; + --radius-base: 0.375rem; + --radius-container: 0.75rem; + --default-border-width: 1px; + --default-divide-width: 1px; + --default-ring-width: 1px; + --body-background-color: var(--color-surface-50); + --body-background-color-dark: var(--color-surface-950); + --color-primary-50: oklch(84.53% 0.06 286.02deg); + --color-primary-100: oklch(75.06% 0.12 292.12deg); + --color-primary-200: oklch(66.15% 0.19 292.78deg); + --color-primary-300: oklch(58.37% 0.24 290.13deg); + --color-primary-400: oklch(52.28% 0.28 285.76deg); + --color-primary-500: oklch(48.65% 0.3 279.02deg); + --color-primary-600: oklch(45.08% 0.27 279.33deg); + --color-primary-700: oklch(41.55% 0.25 279.58deg); + --color-primary-800: oklch(37.87% 0.23 280.01deg); + --color-primary-900: oklch(34.18% 0.21 280.42deg); + --color-primary-950: oklch(30.27% 0.18 281.19deg); + --color-primary-contrast-dark: var(--color-primary-950); + --color-primary-contrast-light: oklch(100% 0 none); + --color-primary-contrast-50: var(--color-primary-contrast-dark); + --color-primary-contrast-100: var(--color-primary-contrast-dark); + --color-primary-contrast-200: var(--color-primary-contrast-dark); + --color-primary-contrast-300: var(--color-primary-contrast-light); + --color-primary-contrast-400: var(--color-primary-contrast-light); + --color-primary-contrast-500: var(--color-primary-contrast-light); + --color-primary-contrast-600: var(--color-primary-contrast-light); + --color-primary-contrast-700: var(--color-primary-contrast-light); + --color-primary-contrast-800: var(--color-primary-contrast-light); + --color-primary-contrast-900: var(--color-primary-contrast-light); + --color-primary-contrast-950: var(--color-primary-contrast-light); + --color-secondary-50: oklch(97.03% 0.04 168.34deg); + --color-secondary-100: oklch(94.88% 0.07 172.64deg); + --color-secondary-200: oklch(93.07% 0.1 174.09deg); + --color-secondary-300: oklch(91.37% 0.13 173.92deg); + --color-secondary-400: oklch(90.21% 0.15 173.28deg); + --color-secondary-500: oklch(89.36% 0.16 171.7deg); + --color-secondary-600: oklch(82.49% 0.15 170.81deg); + --color-secondary-700: oklch(75.2% 0.14 169.64deg); + --color-secondary-800: oklch(68.03% 0.13 168.31deg); + --color-secondary-900: oklch(60.39% 0.12 166.5deg); + --color-secondary-950: oklch(52.82% 0.11 164.37deg); + --color-secondary-contrast-dark: var(--color-secondary-950); + --color-secondary-contrast-light: var(--color-secondary-50); + --color-secondary-contrast-50: var(--color-secondary-contrast-dark); + --color-secondary-contrast-100: var(--color-secondary-contrast-dark); + --color-secondary-contrast-200: var(--color-secondary-contrast-dark); + --color-secondary-contrast-300: var(--color-secondary-contrast-dark); + --color-secondary-contrast-400: var(--color-secondary-contrast-dark); + --color-secondary-contrast-500: var(--color-secondary-contrast-dark); + --color-secondary-contrast-600: var(--color-secondary-contrast-dark); + --color-secondary-contrast-700: var(--color-secondary-contrast-dark); + --color-secondary-contrast-800: var(--color-secondary-contrast-light); + --color-secondary-contrast-900: var(--color-secondary-contrast-light); + --color-secondary-contrast-950: var(--color-secondary-contrast-light); + --color-tertiary-50: oklch(97.55% 0.07 121.8deg); + --color-tertiary-100: oklch(96.1% 0.11 118.94deg); + --color-tertiary-200: oklch(94.64% 0.14 117.3deg); + --color-tertiary-300: oklch(93.45% 0.17 117.34deg); + --color-tertiary-400: oklch(92.25% 0.19 117.1deg); + --color-tertiary-500: oklch(91.3% 0.21 117.7deg); + --color-tertiary-600: oklch(84.07% 0.19 119.05deg); + --color-tertiary-700: oklch(76.47% 0.18 120.36deg); + --color-tertiary-800: oklch(68.85% 0.17 122.6deg); + --color-tertiary-900: oklch(60.86% 0.15 124.63deg); + --color-tertiary-950: oklch(52.88% 0.14 127.42deg); + --color-tertiary-contrast-dark: var(--color-tertiary-950); + --color-tertiary-contrast-light: var(--color-tertiary-50); + --color-tertiary-contrast-50: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-100: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-200: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-300: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-400: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-500: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-600: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-700: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-800: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-900: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-950: var(--color-tertiary-contrast-light); + --color-success-50: oklch(97.74% 0.05 129.02deg); + --color-success-100: oklch(95.69% 0.08 135.46deg); + --color-success-200: oklch(93.77% 0.11 138.2deg); + --color-success-300: oklch(91.83% 0.14 139.3deg); + --color-success-400: oklch(90.21% 0.17 140.23deg); + --color-success-500: oklch(88.75% 0.2 140.81deg); + --color-success-600: oklch(81.22% 0.2 141.41deg); + --color-success-700: oklch(73.66% 0.2 141.78deg); + --color-success-800: oklch(66.03% 0.19 142.29deg); + --color-success-900: oklch(58.42% 0.19 142.45deg); + --color-success-950: oklch(50.8% 0.17 142.5deg); + --color-success-contrast-dark: var(--color-success-950); + --color-success-contrast-light: var(--color-success-50); + --color-success-contrast-50: var(--color-success-contrast-dark); + --color-success-contrast-100: var(--color-success-contrast-dark); + --color-success-contrast-200: var(--color-success-contrast-dark); + --color-success-contrast-300: var(--color-success-contrast-dark); + --color-success-contrast-400: var(--color-success-contrast-dark); + --color-success-contrast-500: var(--color-success-contrast-dark); + --color-success-contrast-600: var(--color-success-contrast-dark); + --color-success-contrast-700: var(--color-success-contrast-dark); + --color-success-contrast-800: var(--color-success-contrast-light); + --color-success-contrast-900: var(--color-success-contrast-light); + --color-success-contrast-950: var(--color-success-contrast-light); + --color-warning-50: oklch(95.31% 0.02 344.31deg); + --color-warning-100: oklch(93.82% 0.03 342.23deg); + --color-warning-200: oklch(92.32% 0.05 342.78deg); + --color-warning-300: oklch(90.79% 0.06 341.45deg); + --color-warning-400: oklch(89.35% 0.07 342.17deg); + --color-warning-500: oklch(87.96% 0.08 341.98deg); + --color-warning-600: oklch(79.99% 0.08 342.02deg); + --color-warning-700: oklch(71.74% 0.08 342.35deg); + --color-warning-800: oklch(63.36% 0.07 341.45deg); + --color-warning-900: oklch(54.59% 0.07 341.87deg); + --color-warning-950: oklch(45.55% 0.07 342.01deg); + --color-warning-contrast-dark: var(--color-warning-950); + --color-warning-contrast-light: var(--color-warning-50); + --color-warning-contrast-50: var(--color-warning-contrast-dark); + --color-warning-contrast-100: var(--color-warning-contrast-dark); + --color-warning-contrast-200: var(--color-warning-contrast-dark); + --color-warning-contrast-300: var(--color-warning-contrast-dark); + --color-warning-contrast-400: var(--color-warning-contrast-dark); + --color-warning-contrast-500: var(--color-warning-contrast-dark); + --color-warning-contrast-600: var(--color-warning-contrast-dark); + --color-warning-contrast-700: var(--color-warning-contrast-dark); + --color-warning-contrast-800: var(--color-warning-contrast-light); + --color-warning-contrast-900: var(--color-warning-contrast-light); + --color-warning-contrast-950: var(--color-warning-contrast-light); + --color-error-50: oklch(91.07% 0.05 44.91deg); + --color-error-100: oklch(84.45% 0.09 41.25deg); + --color-error-200: oklch(78.34% 0.13 39.32deg); + --color-error-300: oklch(72.79% 0.17 38.05deg); + --color-error-400: oklch(68.41% 0.21 36.54deg); + --color-error-500: oklch(65.28% 0.24 33.83deg); + --color-error-600: oklch(61.33% 0.22 33.59deg); + --color-error-700: oklch(57.6% 0.2 33.22deg); + --color-error-800: oklch(53.58% 0.18 31.83deg); + --color-error-900: oklch(49.79% 0.17 29.56deg); + --color-error-950: oklch(45.72% 0.15 25.06deg); + --color-error-contrast-dark: var(--color-error-950); + --color-error-contrast-light: var(--color-error-50); + --color-error-contrast-50: var(--color-error-contrast-dark); + --color-error-contrast-100: var(--color-error-contrast-dark); + --color-error-contrast-200: var(--color-error-contrast-dark); + --color-error-contrast-300: var(--color-error-contrast-dark); + --color-error-contrast-400: var(--color-error-contrast-dark); + --color-error-contrast-500: var(--color-error-contrast-light); + --color-error-contrast-600: var(--color-error-contrast-light); + --color-error-contrast-700: var(--color-error-contrast-light); + --color-error-contrast-800: var(--color-error-contrast-light); + --color-error-contrast-900: var(--color-error-contrast-light); + --color-error-contrast-950: var(--color-error-contrast-light); + --color-surface-50: oklch(99.11% 0 none); + --color-surface-100: oklch(90.97% 0 none); + --color-surface-200: oklch(82.97% 0 none); + --color-surface-300: oklch(74.44% 0 none); + --color-surface-400: oklch(66% 0 none); + --color-surface-500: oklch(56.93% 0 none); + --color-surface-600: oklch(49.97% 0 none); + --color-surface-700: oklch(42.76% 0 none); + --color-surface-800: oklch(35.23% 0 none); + --color-surface-900: oklch(27.27% 0 none); + --color-surface-950: oklch(18.67% 0 none); + --color-surface-contrast-dark: var(--color-surface-950); + --color-surface-contrast-light: var(--color-surface-50); + --color-surface-contrast-50: var(--color-surface-contrast-dark); + --color-surface-contrast-100: var(--color-surface-contrast-dark); + --color-surface-contrast-200: var(--color-surface-contrast-dark); + --color-surface-contrast-300: var(--color-surface-contrast-dark); + --color-surface-contrast-400: var(--color-surface-contrast-dark); + --color-surface-contrast-500: var(--color-surface-contrast-light); + --color-surface-contrast-600: var(--color-surface-contrast-light); + --color-surface-contrast-700: var(--color-surface-contrast-light); + --color-surface-contrast-800: var(--color-surface-contrast-light); + --color-surface-contrast-900: var(--color-surface-contrast-light); + --color-surface-contrast-950: var(--color-surface-contrast-light); +} diff --git a/packages/skeleton/src/themes/vintage.css b/packages/skeleton/src/themes/vintage.css new file mode 100644 index 0000000000..da20562ef0 --- /dev/null +++ b/packages/skeleton/src/themes/vintage.css @@ -0,0 +1,205 @@ +[data-theme='vintage'] { + --text-scaling: 1.067; + --base-font-color: var(--color-surface-950); + --base-font-color-dark: var(--color-surface-50); + --base-font-family: Avenir, Montserrat, Corbel, 'URW Gothic', source-sans-pro, sans-serif; + --base-font-size: inherit; + --base-line-height: inherit; + --base-font-weight: normal; + --base-font-style: normal; + --base-letter-spacing: 0em; + --heading-font-color: var(--color-secondary-950); + --heading-font-color-dark: oklch(1 0 0 / 1); + --heading-font-family: Optima, Candara, 'Noto Sans', source-sans-pro, sans-serif; + --heading-font-weight: bold; + --heading-font-style: normal; + --heading-letter-spacing: inherit; + --anchor-font-color: var(--color-primary-600); + --anchor-font-color-dark: var(--color-primary-500); + --anchor-font-family: inherit; + --anchor-font-size: inherit; + --anchor-line-height: inherit; + --anchor-font-weight: inherit; + --anchor-font-style: inherit; + --anchor-letter-spacing: inherit; + --anchor-text-decoration: none; + --anchor-text-decoration-hover: underline; + --anchor-text-decoration-active: none; + --anchor-text-decoration-focus: none; + --spacing: 0.25rem; + --radius-base: 0.375rem; + --radius-container: 0.75rem; + --default-border-width: 1px; + --default-divide-width: 1px; + --default-ring-width: 1px; + --body-background-color: var(--color-surface-50); + --body-background-color-dark: var(--color-surface-950); + --color-primary-50: oklch(95.02% 0.11 100.34deg); + --color-primary-100: oklch(90.13% 0.12 91.31deg); + --color-primary-200: oklch(85.12% 0.13 82.4deg); + --color-primary-300: oklch(80.35% 0.14 75.05deg); + --color-primary-400: oklch(75.65% 0.15 67.11deg); + --color-primary-500: oklch(71.39% 0.16 59.66deg); + --color-primary-600: oklch(63.94% 0.15 55.68deg); + --color-primary-700: oklch(56.65% 0.14 51.28deg); + --color-primary-800: oklch(48.89% 0.13 46.01deg); + --color-primary-900: oklch(41.32% 0.12 40.46deg); + --color-primary-950: oklch(33.41% 0.12 35.2deg); + --color-primary-contrast-dark: var(--color-primary-950); + --color-primary-contrast-light: var(--color-primary-50); + --color-primary-contrast-50: var(--color-primary-contrast-dark); + --color-primary-contrast-100: var(--color-primary-contrast-dark); + --color-primary-contrast-200: var(--color-primary-contrast-dark); + --color-primary-contrast-300: var(--color-primary-contrast-dark); + --color-primary-contrast-400: var(--color-primary-contrast-dark); + --color-primary-contrast-500: var(--color-primary-contrast-dark); + --color-primary-contrast-600: var(--color-primary-contrast-dark); + --color-primary-contrast-700: var(--color-primary-contrast-light); + --color-primary-contrast-800: var(--color-primary-contrast-light); + --color-primary-contrast-900: var(--color-primary-contrast-light); + --color-primary-contrast-950: var(--color-primary-contrast-light); + --color-secondary-50: oklch(98.29% 0.02 167.04deg); + --color-secondary-100: oklch(94.64% 0.03 161.36deg); + --color-secondary-200: oklch(90.98% 0.05 158.22deg); + --color-secondary-300: oklch(87.56% 0.06 154.22deg); + --color-secondary-400: oklch(83.89% 0.07 153.08deg); + --color-secondary-500: oklch(80.21% 0.08 152.14deg); + --color-secondary-600: oklch(72.77% 0.08 152.75deg); + --color-secondary-700: oklch(65.39% 0.08 153.08deg); + --color-secondary-800: oklch(57.56% 0.08 152.84deg); + --color-secondary-900: oklch(49.78% 0.08 152.82deg); + --color-secondary-950: oklch(41.49% 0.08 152.66deg); + --color-secondary-contrast-dark: var(--color-secondary-950); + --color-secondary-contrast-light: var(--color-secondary-50); + --color-secondary-contrast-50: var(--color-secondary-contrast-dark); + --color-secondary-contrast-100: var(--color-secondary-contrast-dark); + --color-secondary-contrast-200: var(--color-secondary-contrast-dark); + --color-secondary-contrast-300: var(--color-secondary-contrast-dark); + --color-secondary-contrast-400: var(--color-secondary-contrast-dark); + --color-secondary-contrast-500: var(--color-secondary-contrast-dark); + --color-secondary-contrast-600: var(--color-secondary-contrast-dark); + --color-secondary-contrast-700: var(--color-secondary-contrast-light); + --color-secondary-contrast-800: var(--color-secondary-contrast-light); + --color-secondary-contrast-900: var(--color-secondary-contrast-light); + --color-secondary-contrast-950: var(--color-secondary-contrast-light); + --color-tertiary-50: oklch(96.23% 0.03 211.02deg); + --color-tertiary-100: oklch(90.57% 0.06 208.83deg); + --color-tertiary-200: oklch(85.08% 0.09 210.4deg); + --color-tertiary-300: oklch(80.11% 0.11 210.36deg); + --color-tertiary-400: oklch(75.45% 0.12 212.87deg); + --color-tertiary-500: oklch(71.48% 0.13 215.21deg); + --color-tertiary-600: oklch(64.8% 0.12 216.99deg); + --color-tertiary-700: oklch(57.99% 0.1 220deg); + --color-tertiary-800: oklch(50.93% 0.09 222.96deg); + --color-tertiary-900: oklch(43.67% 0.08 227.87deg); + --color-tertiary-950: oklch(36.04% 0.07 233.37deg); + --color-tertiary-contrast-dark: var(--color-tertiary-950); + --color-tertiary-contrast-light: var(--color-tertiary-50); + --color-tertiary-contrast-50: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-100: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-200: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-300: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-400: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-500: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-600: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-700: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-800: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-900: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-950: var(--color-tertiary-contrast-light); + --color-success-50: oklch(99.02% 0.05 107.26deg); + --color-success-100: oklch(94.56% 0.07 120.38deg); + --color-success-200: oklch(90.03% 0.09 126.59deg); + --color-success-300: oklch(85.68% 0.12 131deg); + --color-success-400: oklch(81.26% 0.14 133.59deg); + --color-success-500: oklch(77.09% 0.16 135.74deg); + --color-success-600: oklch(69.58% 0.16 137.26deg); + --color-success-700: oklch(61.89% 0.15 139.14deg); + --color-success-800: oklch(54.4% 0.15 140.58deg); + --color-success-900: oklch(46.54% 0.14 141.99deg); + --color-success-950: oklch(38.63% 0.13 142.5deg); + --color-success-contrast-dark: var(--color-success-950); + --color-success-contrast-light: var(--color-success-50); + --color-success-contrast-50: var(--color-success-contrast-dark); + --color-success-contrast-100: var(--color-success-contrast-dark); + --color-success-contrast-200: var(--color-success-contrast-dark); + --color-success-contrast-300: var(--color-success-contrast-dark); + --color-success-contrast-400: var(--color-success-contrast-dark); + --color-success-contrast-500: var(--color-success-contrast-dark); + --color-success-contrast-600: var(--color-success-contrast-dark); + --color-success-contrast-700: var(--color-success-contrast-light); + --color-success-contrast-800: var(--color-success-contrast-light); + --color-success-contrast-900: var(--color-success-contrast-light); + --color-success-contrast-950: var(--color-success-contrast-light); + --color-warning-50: oklch(98.02% 0.11 108.28deg); + --color-warning-100: oklch(94.96% 0.13 104.16deg); + --color-warning-200: oklch(92.23% 0.14 100.87deg); + --color-warning-300: oklch(89.3% 0.15 97.77deg); + --color-warning-400: oklch(86.71% 0.16 94.79deg); + --color-warning-500: oklch(83.92% 0.17 91.31deg); + --color-warning-600: oklch(75.81% 0.15 88.7deg); + --color-warning-700: oklch(67.4% 0.13 84.01deg); + --color-warning-800: oklch(58.84% 0.12 79.18deg); + --color-warning-900: oklch(49.95% 0.11 70.85deg); + --color-warning-950: oklch(40.82% 0.09 62.01deg); + --color-warning-contrast-dark: var(--color-warning-950); + --color-warning-contrast-light: var(--color-warning-50); + --color-warning-contrast-50: var(--color-warning-contrast-dark); + --color-warning-contrast-100: var(--color-warning-contrast-dark); + --color-warning-contrast-200: var(--color-warning-contrast-dark); + --color-warning-contrast-300: var(--color-warning-contrast-dark); + --color-warning-contrast-400: var(--color-warning-contrast-dark); + --color-warning-contrast-500: var(--color-warning-contrast-dark); + --color-warning-contrast-600: var(--color-warning-contrast-dark); + --color-warning-contrast-700: var(--color-warning-contrast-dark); + --color-warning-contrast-800: var(--color-warning-contrast-light); + --color-warning-contrast-900: var(--color-warning-contrast-light); + --color-warning-contrast-950: var(--color-warning-contrast-light); + --color-error-50: oklch(92.64% 0.04 45.08deg); + --color-error-100: oklch(87.88% 0.05 37.49deg); + --color-error-200: oklch(82.85% 0.06 31.65deg); + --color-error-300: oklch(78.14% 0.08 27.84deg); + --color-error-400: oklch(73.15% 0.09 25.37deg); + --color-error-500: oklch(68.52% 0.11 24.52deg); + --color-error-600: oklch(61.02% 0.11 22.91deg); + --color-error-700: oklch(53.36% 0.11 22.82deg); + --color-error-800: oklch(45.55% 0.11 21.61deg); + --color-error-900: oklch(37.58% 0.11 22.3deg); + --color-error-950: oklch(29.76% 0.1 23.16deg); + --color-error-contrast-dark: var(--color-error-950); + --color-error-contrast-light: var(--color-error-50); + --color-error-contrast-50: var(--color-error-contrast-dark); + --color-error-contrast-100: var(--color-error-contrast-dark); + --color-error-contrast-200: var(--color-error-contrast-dark); + --color-error-contrast-300: var(--color-error-contrast-dark); + --color-error-contrast-400: var(--color-error-contrast-dark); + --color-error-contrast-500: var(--color-error-contrast-dark); + --color-error-contrast-600: var(--color-error-contrast-dark); + --color-error-contrast-700: var(--color-error-contrast-light); + --color-error-contrast-800: var(--color-error-contrast-light); + --color-error-contrast-900: var(--color-error-contrast-light); + --color-error-contrast-950: var(--color-error-contrast-light); + --color-surface-50: oklch(91.65% 0 78.25deg); + --color-surface-100: oklch(81.22% 0.01 75.38deg); + --color-surface-200: oklch(70.23% 0.01 61.43deg); + --color-surface-300: oklch(58.92% 0.01 67.64deg); + --color-surface-400: oklch(46.9% 0.01 58.02deg); + --color-surface-500: oklch(34.32% 0.02 59.12deg); + --color-surface-600: oklch(31.5% 0.01 57.78deg); + --color-surface-700: oklch(28.58% 0.01 62.11deg); + --color-surface-800: oklch(25.73% 0.01 55.81deg); + --color-surface-900: oklch(22.65% 0.01 60.89deg); + --color-surface-950: oklch(19.49% 0.01 59.11deg); + --color-surface-contrast-dark: var(--color-surface-950); + --color-surface-contrast-light: var(--color-surface-50); + --color-surface-contrast-50: var(--color-surface-contrast-dark); + --color-surface-contrast-100: var(--color-surface-contrast-dark); + --color-surface-contrast-200: var(--color-surface-contrast-dark); + --color-surface-contrast-300: var(--color-surface-contrast-dark); + --color-surface-contrast-400: var(--color-surface-contrast-light); + --color-surface-contrast-500: var(--color-surface-contrast-light); + --color-surface-contrast-600: var(--color-surface-contrast-light); + --color-surface-contrast-700: var(--color-surface-contrast-light); + --color-surface-contrast-800: var(--color-surface-contrast-light); + --color-surface-contrast-900: var(--color-surface-contrast-light); + --color-surface-contrast-950: var(--color-surface-contrast-light); +} diff --git a/packages/skeleton/src/themes/vox.css b/packages/skeleton/src/themes/vox.css new file mode 100644 index 0000000000..85efe1fdb6 --- /dev/null +++ b/packages/skeleton/src/themes/vox.css @@ -0,0 +1,205 @@ +[data-theme='vox'] { + --text-scaling: 1.067; + --base-font-color: var(--color-surface-950); + --base-font-color-dark: var(--color-surface-50); + --base-font-family: Seravek, 'Gill Sans Nova', Ubuntu, Calibri, 'DejaVu Sans', source-sans-pro, sans-serif; + --base-font-size: inherit; + --base-line-height: inherit; + --base-font-weight: normal; + --base-font-style: normal; + --base-letter-spacing: 0em; + --heading-font-color: inherit; + --heading-font-color-dark: inherit; + --heading-font-family: Inter, Roboto, 'Helvetica Neue', 'Arial Nova', 'Nimbus Sans', Arial, sans-serif; + --heading-font-weight: 600; + --heading-font-style: normal; + --heading-letter-spacing: 0.025em; + --anchor-font-color: var(--color-tertiary-700); + --anchor-font-color-dark: var(--color-secondary-500); + --anchor-font-family: inherit; + --anchor-font-size: inherit; + --anchor-line-height: inherit; + --anchor-font-weight: inherit; + --anchor-font-style: inherit; + --anchor-letter-spacing: inherit; + --anchor-text-decoration: none; + --anchor-text-decoration-hover: underline; + --anchor-text-decoration-active: none; + --anchor-text-decoration-focus: none; + --spacing: 0.25rem; + --radius-base: 0.375rem; + --radius-container: 0.75rem; + --default-border-width: 1px; + --default-divide-width: 1px; + --default-ring-width: 1px; + --body-background-color: var(--color-surface-50); + --body-background-color-dark: var(--color-surface-950); + --color-primary-50: oklch(96.94% 0.02 50.48deg); + --color-primary-100: oklch(94.06% 0.03 52.35deg); + --color-primary-200: oklch(91.01% 0.05 52.1deg); + --color-primary-300: oklch(88.31% 0.07 51.83deg); + --color-primary-400: oklch(85.37% 0.08 51.51deg); + --color-primary-500: oklch(82.71% 0.1 51.5deg); + --color-primary-600: oklch(76.61% 0.08 51.74deg); + --color-primary-700: oklch(70.5% 0.07 52.37deg); + --color-primary-800: oklch(63.99% 0.05 50.98deg); + --color-primary-900: oklch(57.63% 0.04 51.62deg); + --color-primary-950: oklch(51.06% 0.02 51.7deg); + --color-primary-contrast-dark: var(--color-surface-950); + --color-primary-contrast-light: var(--color-primary-50); + --color-primary-contrast-50: var(--color-primary-contrast-dark); + --color-primary-contrast-100: var(--color-primary-contrast-dark); + --color-primary-contrast-200: var(--color-primary-contrast-dark); + --color-primary-contrast-300: var(--color-primary-contrast-dark); + --color-primary-contrast-400: var(--color-primary-contrast-dark); + --color-primary-contrast-500: var(--color-primary-contrast-dark); + --color-primary-contrast-600: var(--color-primary-contrast-dark); + --color-primary-contrast-700: var(--color-primary-contrast-dark); + --color-primary-contrast-800: var(--color-primary-contrast-dark); + --color-primary-contrast-900: var(--color-primary-contrast-dark); + --color-primary-contrast-950: var(--color-primary-contrast-light); + --color-secondary-50: oklch(99.6% 0.02 106.69deg); + --color-secondary-100: oklch(98.09% 0.05 116.54deg); + --color-secondary-200: oklch(96.57% 0.09 119.76deg); + --color-secondary-300: oklch(95.02% 0.12 120.81deg); + --color-secondary-400: oklch(93.69% 0.15 122.31deg); + --color-secondary-500: oklch(92.54% 0.17 123.36deg); + --color-secondary-600: oklch(86.4% 0.16 123.97deg); + --color-secondary-700: oklch(79.92% 0.16 124.41deg); + --color-secondary-800: oklch(73.61% 0.15 124.75deg); + --color-secondary-900: oklch(66.86% 0.14 125.35deg); + --color-secondary-950: oklch(60.19% 0.13 126.4deg); + --color-secondary-contrast-dark: oklch(0% 0 none); + --color-secondary-contrast-light: var(--color-secondary-50); + --color-secondary-contrast-50: var(--color-secondary-contrast-dark); + --color-secondary-contrast-100: var(--color-secondary-contrast-dark); + --color-secondary-contrast-200: var(--color-secondary-contrast-dark); + --color-secondary-contrast-300: var(--color-secondary-contrast-dark); + --color-secondary-contrast-400: var(--color-secondary-contrast-dark); + --color-secondary-contrast-500: var(--color-secondary-contrast-dark); + --color-secondary-contrast-600: var(--color-secondary-contrast-dark); + --color-secondary-contrast-700: var(--color-secondary-contrast-dark); + --color-secondary-contrast-800: var(--color-secondary-contrast-light); + --color-secondary-contrast-900: var(--color-secondary-contrast-light); + --color-secondary-contrast-950: var(--color-secondary-contrast-light); + --color-tertiary-50: oklch(100% 0 none); + --color-tertiary-100: oklch(96.06% 0.02 300.28deg); + --color-tertiary-200: oklch(92.13% 0.04 299.82deg); + --color-tertiary-300: oklch(88.02% 0.07 299.94deg); + --color-tertiary-400: oklch(84.11% 0.09 299.25deg); + --color-tertiary-500: oklch(80.24% 0.12 298.53deg); + --color-tertiary-600: oklch(73.29% 0.12 297.42deg); + --color-tertiary-700: oklch(66.07% 0.13 296.35deg); + --color-tertiary-800: oklch(58.83% 0.13 294.97deg); + --color-tertiary-900: oklch(51.32% 0.14 293.43deg); + --color-tertiary-950: oklch(43.8% 0.14 291.24deg); + --color-tertiary-contrast-dark: oklch(0% 0 none); + --color-tertiary-contrast-light: var(--color-tertiary-50); + --color-tertiary-contrast-50: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-100: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-200: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-300: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-400: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-500: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-600: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-700: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-800: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-900: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-950: var(--color-tertiary-contrast-light); + --color-success-50: oklch(100% 0 none); + --color-success-100: oklch(98.16% 0.02 173.95deg); + --color-success-200: oklch(96.31% 0.03 174.1deg); + --color-success-300: oklch(94.56% 0.05 171.97deg); + --color-success-400: oklch(92.85% 0.07 171.85deg); + --color-success-500: oklch(91.28% 0.08 171.23deg); + --color-success-600: oklch(83.78% 0.08 171.45deg); + --color-success-700: oklch(76.31% 0.09 171.2deg); + --color-success-800: oklch(68.53% 0.08 172.07deg); + --color-success-900: oklch(60.75% 0.08 171.41deg); + --color-success-950: oklch(52.58% 0.08 170.86deg); + --color-success-contrast-dark: oklch(0% 0 none); + --color-success-contrast-light: var(--color-success-50); + --color-success-contrast-50: var(--color-success-contrast-dark); + --color-success-contrast-100: var(--color-success-contrast-dark); + --color-success-contrast-200: var(--color-success-contrast-dark); + --color-success-contrast-300: var(--color-success-contrast-dark); + --color-success-contrast-400: var(--color-success-contrast-dark); + --color-success-contrast-500: var(--color-success-contrast-dark); + --color-success-contrast-600: var(--color-success-contrast-dark); + --color-success-contrast-700: var(--color-success-contrast-dark); + --color-success-contrast-800: var(--color-success-contrast-light); + --color-success-contrast-900: var(--color-success-contrast-light); + --color-success-contrast-950: var(--color-success-contrast-light); + --color-warning-50: oklch(100% 0 none); + --color-warning-100: oklch(98.93% 0.02 109.78deg); + --color-warning-200: oklch(97.85% 0.04 110.11deg); + --color-warning-300: oklch(96.84% 0.06 110.51deg); + --color-warning-400: oklch(95.83% 0.08 110.87deg); + --color-warning-500: oklch(94.87% 0.1 111.24deg); + --color-warning-600: oklch(87.55% 0.1 112.07deg); + --color-warning-700: oklch(79.86% 0.1 112.34deg); + --color-warning-800: oklch(72.29% 0.1 112.63deg); + --color-warning-900: oklch(64.22% 0.09 113.02deg); + --color-warning-950: oklch(56.15% 0.09 114.2deg); + --color-warning-contrast-dark: oklch(0% 0 none); + --color-warning-contrast-light: var(--color-warning-50); + --color-warning-contrast-50: var(--color-warning-contrast-dark); + --color-warning-contrast-100: var(--color-warning-contrast-dark); + --color-warning-contrast-200: var(--color-warning-contrast-dark); + --color-warning-contrast-300: var(--color-warning-contrast-dark); + --color-warning-contrast-400: var(--color-warning-contrast-dark); + --color-warning-contrast-500: var(--color-warning-contrast-dark); + --color-warning-contrast-600: var(--color-warning-contrast-dark); + --color-warning-contrast-700: var(--color-warning-contrast-dark); + --color-warning-contrast-800: var(--color-warning-contrast-dark); + --color-warning-contrast-900: var(--color-warning-contrast-light); + --color-warning-contrast-950: var(--color-warning-contrast-light); + --color-error-50: oklch(100% 0 none); + --color-error-100: oklch(96.29% 0.02 347.54deg); + --color-error-200: oklch(92.43% 0.04 347.14deg); + --color-error-300: oklch(88.82% 0.06 348.02deg); + --color-error-400: oklch(85.09% 0.08 348.39deg); + --color-error-500: oklch(81.63% 0.1 349.28deg); + --color-error-600: oklch(74.28% 0.1 348.86deg); + --color-error-700: oklch(66.73% 0.1 349.23deg); + --color-error-800: oklch(58.91% 0.1 348.51deg); + --color-error-900: oklch(50.98% 0.1 349.14deg); + --color-error-950: oklch(42.88% 0.1 349.25deg); + --color-error-contrast-dark: oklch(0% 0 none); + --color-error-contrast-light: var(--color-error-50); + --color-error-contrast-50: var(--color-error-contrast-dark); + --color-error-contrast-100: var(--color-error-contrast-dark); + --color-error-contrast-200: var(--color-error-contrast-dark); + --color-error-contrast-300: var(--color-error-contrast-dark); + --color-error-contrast-400: var(--color-error-contrast-dark); + --color-error-contrast-500: var(--color-error-contrast-dark); + --color-error-contrast-600: var(--color-error-contrast-dark); + --color-error-contrast-700: var(--color-error-contrast-light); + --color-error-contrast-800: var(--color-error-contrast-light); + --color-error-contrast-900: var(--color-error-contrast-light); + --color-error-contrast-950: var(--color-error-contrast-light); + --color-surface-50: oklch(92.52% 0.03 294.62deg); + --color-surface-100: oklch(86.55% 0.03 295.73deg); + --color-surface-200: oklch(80.56% 0.04 298.43deg); + --color-surface-300: oklch(74.42% 0.04 298.5deg); + --color-surface-400: oklch(68.2% 0.04 300.46deg); + --color-surface-500: oklch(61.75% 0.05 300.7deg); + --color-surface-600: oklch(56.18% 0.05 300.86deg); + --color-surface-700: oklch(50.43% 0.06 301.43deg); + --color-surface-800: oklch(44.68% 0.06 302.58deg); + --color-surface-900: oklch(38.62% 0.07 302.83deg); + --color-surface-950: oklch(32.44% 0.07 302.21deg); + --color-surface-contrast-dark: var(--color-surface-950); + --color-surface-contrast-light: var(--color-surface-50); + --color-surface-contrast-50: var(--color-surface-contrast-dark); + --color-surface-contrast-100: var(--color-surface-contrast-dark); + --color-surface-contrast-200: var(--color-surface-contrast-dark); + --color-surface-contrast-300: var(--color-surface-contrast-dark); + --color-surface-contrast-400: var(--color-surface-contrast-dark); + --color-surface-contrast-500: var(--color-surface-contrast-dark); + --color-surface-contrast-600: var(--color-surface-contrast-light); + --color-surface-contrast-700: var(--color-surface-contrast-light); + --color-surface-contrast-800: var(--color-surface-contrast-light); + --color-surface-contrast-900: var(--color-surface-contrast-light); + --color-surface-contrast-950: var(--color-surface-contrast-light); +} diff --git a/packages/skeleton/src/themes/wintry.css b/packages/skeleton/src/themes/wintry.css new file mode 100644 index 0000000000..323f423116 --- /dev/null +++ b/packages/skeleton/src/themes/wintry.css @@ -0,0 +1,205 @@ +[data-theme='wintry'] { + --text-scaling: 1.067; + --base-font-color: var(--color-surface-950); + --base-font-color-dark: var(--color-surface-50); + --base-font-family: system-ui, sans-serif; + --base-font-size: inherit; + --base-line-height: inherit; + --base-font-weight: normal; + --base-font-style: normal; + --base-letter-spacing: 0em; + --heading-font-color: inherit; + --heading-font-color-dark: inherit; + --heading-font-family: Inter, Roboto, 'Helvetica Neue', 'Arial Nova', 'Nimbus Sans', Arial, sans-serif; + --heading-font-weight: bold; + --heading-font-style: normal; + --heading-letter-spacing: inherit; + --anchor-font-color: var(--color-primary-500); + --anchor-font-color-dark: var(--color-primary-500); + --anchor-font-family: inherit; + --anchor-font-size: inherit; + --anchor-line-height: inherit; + --anchor-font-weight: inherit; + --anchor-font-style: inherit; + --anchor-letter-spacing: inherit; + --anchor-text-decoration: none; + --anchor-text-decoration-hover: underline; + --anchor-text-decoration-active: none; + --anchor-text-decoration-focus: none; + --spacing: 0.25rem; + --radius-base: 0.375rem; + --radius-container: 0.75rem; + --default-border-width: 1px; + --default-divide-width: 1px; + --default-ring-width: 1px; + --body-background-color: oklch(1 0 0 / 1); + --body-background-color-dark: var(--color-surface-950); + --color-primary-50: oklch(96.19% 0.04 201.62deg); + --color-primary-100: oklch(89.29% 0.06 230.4deg); + --color-primary-200: oklch(82.2% 0.09 245.96deg); + --color-primary-300: oklch(75.45% 0.12 253.41deg); + --color-primary-400: oklch(68.61% 0.15 257.7deg); + --color-primary-500: oklch(62.31% 0.19 259.81deg); + --color-primary-600: oklch(56.01% 0.18 260.79deg); + --color-primary-700: oklch(49.59% 0.18 261.77deg); + --color-primary-800: oklch(43.07% 0.17 262.89deg); + --color-primary-900: oklch(36.42% 0.16 263.66deg); + --color-primary-950: oklch(29.67% 0.16 263.4deg); + --color-primary-contrast-dark: var(--color-primary-950); + --color-primary-contrast-light: var(--color-primary-50); + --color-primary-contrast-50: var(--color-primary-contrast-dark); + --color-primary-contrast-100: var(--color-primary-contrast-dark); + --color-primary-contrast-200: var(--color-primary-contrast-dark); + --color-primary-contrast-300: var(--color-primary-contrast-dark); + --color-primary-contrast-400: var(--color-primary-contrast-dark); + --color-primary-contrast-500: var(--color-primary-contrast-light); + --color-primary-contrast-600: var(--color-primary-contrast-light); + --color-primary-contrast-700: var(--color-primary-contrast-light); + --color-primary-contrast-800: var(--color-primary-contrast-light); + --color-primary-contrast-900: var(--color-primary-contrast-light); + --color-primary-contrast-950: var(--color-primary-contrast-light); + --color-secondary-50: oklch(95.68% 0.06 196.1deg); + --color-secondary-100: oklch(89.83% 0.08 209.36deg); + --color-secondary-200: oklch(84.09% 0.1 217.66deg); + --color-secondary-300: oklch(78.56% 0.12 224.65deg); + --color-secondary-400: oklch(73.31% 0.13 230.6deg); + --color-secondary-500: oklch(68.47% 0.15 237.31deg); + --color-secondary-600: oklch(62% 0.14 240.02deg); + --color-secondary-700: oklch(55.31% 0.13 242.76deg); + --color-secondary-800: oklch(48.5% 0.12 246.43deg); + --color-secondary-900: oklch(41.38% 0.12 250.13deg); + --color-secondary-950: oklch(34.06% 0.11 254.48deg); + --color-secondary-contrast-dark: var(--color-secondary-950); + --color-secondary-contrast-light: var(--color-secondary-50); + --color-secondary-contrast-50: var(--color-secondary-contrast-dark); + --color-secondary-contrast-100: var(--color-secondary-contrast-dark); + --color-secondary-contrast-200: var(--color-secondary-contrast-dark); + --color-secondary-contrast-300: var(--color-secondary-contrast-dark); + --color-secondary-contrast-400: var(--color-secondary-contrast-dark); + --color-secondary-contrast-500: var(--color-secondary-contrast-dark); + --color-secondary-contrast-600: var(--color-secondary-contrast-light); + --color-secondary-contrast-700: var(--color-secondary-contrast-light); + --color-secondary-contrast-800: var(--color-secondary-contrast-light); + --color-secondary-contrast-900: var(--color-secondary-contrast-light); + --color-secondary-contrast-950: var(--color-secondary-contrast-light); + --color-tertiary-50: oklch(92.26% 0.05 306.01deg); + --color-tertiary-100: oklch(86.96% 0.07 296.34deg); + --color-tertiary-200: oklch(81.6% 0.1 290.49deg); + --color-tertiary-300: oklch(76.55% 0.13 286.63deg); + --color-tertiary-400: oklch(71.31% 0.15 283.43deg); + --color-tertiary-500: oklch(66.28% 0.18 280.87deg); + --color-tertiary-600: oklch(58.39% 0.18 282.35deg); + --color-tertiary-700: oklch(50.63% 0.18 283.21deg); + --color-tertiary-800: oklch(42.59% 0.18 283.85deg); + --color-tertiary-900: oklch(34.95% 0.18 283.03deg); + --color-tertiary-950: oklch(27.57% 0.17 280.45deg); + --color-tertiary-contrast-dark: var(--color-tertiary-950); + --color-tertiary-contrast-light: var(--color-tertiary-50); + --color-tertiary-contrast-50: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-100: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-200: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-300: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-400: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-500: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-600: var(--color-tertiary-contrast-dark); + --color-tertiary-contrast-700: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-800: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-900: var(--color-tertiary-contrast-light); + --color-tertiary-contrast-950: var(--color-tertiary-contrast-light); + --color-success-50: oklch(97.96% 0.12 108.35deg); + --color-success-100: oklch(93.56% 0.14 115.38deg); + --color-success-200: oklch(89.31% 0.16 120.22deg); + --color-success-300: oklch(84.86% 0.18 124.21deg); + --color-success-400: oklch(80.8% 0.19 127.53deg); + --color-success-500: oklch(76.81% 0.2 130.85deg); + --color-success-600: oklch(69.44% 0.19 133.05deg); + --color-success-700: oklch(61.88% 0.18 135.65deg); + --color-success-800: oklch(54.52% 0.17 138.28deg); + --color-success-900: oklch(46.76% 0.15 140.76deg); + --color-success-950: oklch(38.95% 0.13 142.5deg); + --color-success-contrast-dark: var(--color-success-950); + --color-success-contrast-light: var(--color-success-50); + --color-success-contrast-50: var(--color-success-contrast-dark); + --color-success-contrast-100: var(--color-success-contrast-dark); + --color-success-contrast-200: var(--color-success-contrast-dark); + --color-success-contrast-300: var(--color-success-contrast-dark); + --color-success-contrast-400: var(--color-success-contrast-dark); + --color-success-contrast-500: var(--color-success-contrast-dark); + --color-success-contrast-600: var(--color-success-contrast-dark); + --color-success-contrast-700: var(--color-success-contrast-light); + --color-success-contrast-800: var(--color-success-contrast-light); + --color-success-contrast-900: var(--color-success-contrast-light); + --color-success-contrast-950: var(--color-success-contrast-light); + --color-warning-50: oklch(97.87% 0.12 108.45deg); + --color-warning-100: oklch(94.1% 0.14 103.73deg); + --color-warning-200: oklch(90.39% 0.15 99.65deg); + --color-warning-300: oklch(86.48% 0.16 95.56deg); + --color-warning-400: oklch(82.95% 0.16 91.25deg); + --color-warning-500: oklch(79.53% 0.16 86.04deg); + --color-warning-600: oklch(70.68% 0.14 85.14deg); + --color-warning-700: oklch(61.76% 0.12 84.62deg); + --color-warning-800: oklch(52.18% 0.1 83.48deg); + --color-warning-900: oklch(42.49% 0.08 81.81deg); + --color-warning-950: oklch(31.98% 0.06 75.91deg); + --color-warning-contrast-dark: var(--color-warning-950); + --color-warning-contrast-light: var(--color-warning-50); + --color-warning-contrast-50: var(--color-warning-contrast-dark); + --color-warning-contrast-100: var(--color-warning-contrast-dark); + --color-warning-contrast-200: var(--color-warning-contrast-dark); + --color-warning-contrast-300: var(--color-warning-contrast-dark); + --color-warning-contrast-400: var(--color-warning-contrast-dark); + --color-warning-contrast-500: var(--color-warning-contrast-dark); + --color-warning-contrast-600: var(--color-warning-contrast-dark); + --color-warning-contrast-700: var(--color-warning-contrast-light); + --color-warning-contrast-800: var(--color-warning-contrast-light); + --color-warning-contrast-900: var(--color-warning-contrast-light); + --color-warning-contrast-950: var(--color-warning-contrast-light); + --color-error-50: oklch(91.14% 0.07 332.14deg); + --color-error-100: oklch(82.94% 0.11 339.91deg); + --color-error-200: oklch(75.2% 0.14 345.21deg); + --color-error-300: oklch(68.13% 0.18 348.96deg); + --color-error-400: oklch(62.02% 0.21 353.41deg); + --color-error-500: oklch(57.22% 0.22 358.61deg); + --color-error-600: oklch(51.7% 0.2 358.74deg); + --color-error-700: oklch(46.21% 0.18 358.64deg); + --color-error-800: oklch(40.37% 0.16 358.83deg); + --color-error-900: oklch(34.48% 0.13 358.66deg); + --color-error-950: oklch(28.04% 0.11 358.71deg); + --color-error-contrast-dark: var(--color-error-950); + --color-error-contrast-light: var(--color-error-50); + --color-error-contrast-50: var(--color-error-contrast-dark); + --color-error-contrast-100: var(--color-error-contrast-dark); + --color-error-contrast-200: var(--color-error-contrast-dark); + --color-error-contrast-300: var(--color-error-contrast-dark); + --color-error-contrast-400: var(--color-error-contrast-dark); + --color-error-contrast-500: var(--color-error-contrast-light); + --color-error-contrast-600: var(--color-error-contrast-light); + --color-error-contrast-700: var(--color-error-contrast-light); + --color-error-contrast-800: var(--color-error-contrast-light); + --color-error-contrast-900: var(--color-error-contrast-light); + --color-error-contrast-950: var(--color-error-contrast-light); + --color-surface-50: oklch(97.59% 0 264.7deg); + --color-surface-100: oklch(88.12% 0.01 261.81deg); + --color-surface-200: oklch(78.51% 0.02 265.97deg); + --color-surface-300: oklch(68.49% 0.03 264.38deg); + --color-surface-400: oklch(58.25% 0.04 265.77deg); + --color-surface-500: oklch(47.47% 0.05 264.53deg); + --color-surface-600: oklch(42.05% 0.05 264.5deg); + --color-surface-700: oklch(36.45% 0.05 264.44deg); + --color-surface-800: oklch(31.02% 0.04 264.35deg); + --color-surface-900: oklch(24.95% 0.04 264.15deg); + --color-surface-950: oklch(18.53% 0.04 263.67deg); + --color-surface-contrast-dark: var(--color-surface-950); + --color-surface-contrast-light: var(--color-surface-50); + --color-surface-contrast-50: var(--color-surface-contrast-dark); + --color-surface-contrast-100: var(--color-surface-contrast-dark); + --color-surface-contrast-200: var(--color-surface-contrast-dark); + --color-surface-contrast-300: var(--color-surface-contrast-dark); + --color-surface-contrast-400: var(--color-surface-contrast-dark); + --color-surface-contrast-500: var(--color-surface-contrast-light); + --color-surface-contrast-600: var(--color-surface-contrast-light); + --color-surface-contrast-700: var(--color-surface-contrast-light); + --color-surface-contrast-800: var(--color-surface-contrast-light); + --color-surface-contrast-900: var(--color-surface-contrast-light); + --color-surface-contrast-950: var(--color-surface-contrast-light); +} diff --git a/packages/skeleton/src/utilities/badges.css b/packages/skeleton/src/utilities/badges.css new file mode 100644 index 0000000000..4a2bb04bda --- /dev/null +++ b/packages/skeleton/src/utilities/badges.css @@ -0,0 +1,42 @@ +/* Components: Badges */ + +@utility badge { + border-radius: var(--radius-base); + + /* Icon Spacing */ + display: inline-flex; + flex-direction: row; + align-items: center; + justify-content: center; + gap: --spacing(2); + + /* Typography */ + text-decoration-line: none; + white-space: nowrap; + + /* Size */ + font-size: var(--text-xs); + line-height: var(--text-xs--line-height); + padding-block: --spacing(1); + padding-inline: --spacing(3); +} + +@utility badge-icon { + box-sizing: content-box; + border-radius: 100%; + + /* Center Icons */ + display: inline-flex; + justify-content: center; + align-items: center; + + /* Typography */ + text-decoration-line: none; + white-space: nowrap; + + /* Size */ + font-size: var(--text-xs); + width: var(--text-xs); + height: var(--text-xs); + padding: --spacing(1.5); +} diff --git a/packages/skeleton/src/utilities/buttons.css b/packages/skeleton/src/utilities/buttons.css new file mode 100644 index 0000000000..2980a3016c --- /dev/null +++ b/packages/skeleton/src/utilities/buttons.css @@ -0,0 +1,141 @@ +/* Components: Buttons */ + +@utility btn { + border-radius: var(--radius-base); + + /* Icon Spacing */ + display: inline-flex; + flex-direction: row; + align-items: center; + justify-content: center; + gap: --spacing(2); + + /* Typography */ + text-decoration-line: none; + white-space: nowrap; + + /* Size */ + font-size: var(--text-base); + line-height: var(--text-base--line-height); + padding-block: --spacing(1); + padding-inline: --spacing(4); + + /* Transitions */ + transition-property: + color, + background-color, + border-color, + outline-color, + text-decoration-color, + fill, + stroke, + --tw-gradient-from, + --tw-gradient-via, + --tw-gradient-to, + opacity, + box-shadow, + transform, + translate, + scale, + rotate, + filter, + -webkit-backdrop-filter, + backdrop-filter, + display, + content-visibility, + overlay, + pointer-events; + transition-timing-function: var(--default-transition-timing-function); + transition-duration: var(--default-transition-duration); + + &:not(:disabled) { + &:hover { + filter: brightness(125%); + @variant dark { + filter: brightness(75%); + } + } + } +} + +@utility btn-icon { + box-sizing: content-box; + border-radius: var(--radius-base); + + /* Center Icons */ + display: inline-flex; + justify-content: center; + align-items: center; + + /* Typography */ + text-decoration-line: none; + white-space: nowrap; + + /* Size */ + font-size: var(--text-base); + width: var(--text-base); + height: var(--text-base); + padding: --spacing(2); + + &:not(:disabled) { + &:hover { + filter: brightness(125%); + @variant dark { + filter: brightness(75%); + } + } + } +} + +/* Sizes --- */ + +/* Button */ +@utility btn-sm { + font-size: var(--text-xs); + line-height: var(--text-xs--line-height); + padding-block: --spacing(1); + padding-inline: --spacing(3); +} +@utility btn-base { + font-size: var(--text-base); + line-height: var(--text-base--line-height); + padding-block: --spacing(1); + padding-inline: --spacing(4); +} +@utility btn-lg { + font-size: var(--text-xl); + line-height: var(--text-xl--line-height); + padding-block: --spacing(2); + padding-inline: --spacing(5); +} + +/* Button Icon */ +@utility btn-icon-sm { + font-size: var(--text-xs); + width: var(--text-xs); + height: var(--text-xs); + padding: --spacing(1.5); +} +@utility btn-icon-base { + font-size: var(--text-base); + width: var(--text-base); + height: var(--text-base); + padding: --spacing(2); +} +@utility btn-icon-lg { + font-size: var(--text-xl); + width: var(--text-xl); + height: var(--text-xl); + padding: --spacing(3); +} + +/* Group --- */ + +@utility btn-group { + border-radius: var(--radius-container); + display: inline-flex; + align-items: center; + gap: --spacing(2); + padding: --spacing(2); + overflow: hidden; +} diff --git a/packages/skeleton/src/utilities/cards.css b/packages/skeleton/src/utilities/cards.css new file mode 100644 index 0000000000..2b6620ff8e --- /dev/null +++ b/packages/skeleton/src/utilities/cards.css @@ -0,0 +1,33 @@ +/* Components: Cards */ + +@utility card { + border-radius: var(--radius-container); + + &a { + /* Transitions (all) */ + transition-property: all; + transition-timing-function: var(--default-transition-timing-function); + transition-duration: var(--default-transition-duration); + + @variant hover { + filter: brightness(95%); + @variant dark { + filter: brightness(110%); + } + } + } +} + +@utility card-hover { + /* Transitions (all) */ + transition-property: all; + transition-timing-function: var(--default-transition-timing-function); + transition-duration: var(--default-transition-duration); + + @variant hover { + filter: brightness(95%); + @variant dark { + filter: brightness(110%); + } + } +} diff --git a/packages/skeleton/src/utilities/chips.css b/packages/skeleton/src/utilities/chips.css new file mode 100644 index 0000000000..e0c007dd13 --- /dev/null +++ b/packages/skeleton/src/utilities/chips.css @@ -0,0 +1,61 @@ +/* Components: Chips */ + +@utility chip { + border-radius: var(--radius-base); + + /* Icon Spacing */ + display: inline-flex; + flex-direction: row; + align-items: center; + justify-content: center; + gap: --spacing(2); + + /* Typography */ + text-decoration-line: none; + white-space: nowrap; + + /* Size */ + font-size: var(--text-xs); + line-height: var(--text-xs--line-height); + padding-block: --spacing(1); + padding-inline: --spacing(3); + + /* Transitions */ + transition-property: all; + transition-timing-function: var(--default-transition-timing-function); + transition-duration: var(--default-transition-duration); + + @variant hover { + filter: brightness(125%); + @variant dark { + filter: brightness(75%); + } + } +} + +@utility chip-icon { + box-sizing: content-box; + border-radius: var(--radius-base); + + /* Center Icons */ + display: inline-flex; + justify-content: center; + align-items: center; + + /* Typography */ + text-decoration-line: none; + white-space: nowrap; + + /* Size */ + font-size: var(--text-xs); + width: var(--text-xs); + height: var(--text-xs); + padding: --spacing(1.5); + + @variant hover { + filter: brightness(125%); + @variant dark { + filter: brightness(75%); + } + } +} diff --git a/packages/skeleton/src/utilities/core.scss b/packages/skeleton/src/utilities/core.scss new file mode 100644 index 0000000000..2ea6f0b55d --- /dev/null +++ b/packages/skeleton/src/utilities/core.scss @@ -0,0 +1,47 @@ +@use 'sass:list'; + +$theme-variables: ( + // Colors + (body-background-color, background-color), + (body-background-color-dark, background-color), + // Base + (base-font-color, color), + (base-font-color-dark, color), + (base-font-family, font-family), + (base-font-size, font-size), + (base-line-height, line-height), + (base-font-weight, font-weight), + (base-font-style, font-style), + (base-letter-spacing, letter-spacing), + // Heading + (heading-font-color, color), + (heading-font-color-dark, color), + (heading-font-family, font-family), + (heading-font-size, font-size), + (heading-line-height, line-height), + (heading-font-weight, font-weight), + (heading-font-style, font-style), + (heading-letter-spacing, letter-spacing), + // Anchor + (anchor-font-color, color), + (anchor-font-color-dark, color), + (anchor-font-family, font-family), + (anchor-font-size, font-size), + (anchor-line-height, line-height), + (anchor-font-weight, font-weight), + (anchor-font-style, font-style), + (anchor-letter-spacing, letter-spacing), + (anchor-text-decoration, text-decoration), + (anchor-text-decoration-active, text-decoration), + (anchor-text-decoration-focus, text-decoration), + (anchor-text-decoration-hover, text-decoration) +); + +@each $variable in $theme-variables { + $name: list.nth($variable, 1); + $property: list.nth($variable, 2); + + @utility #{$name} { + #{$property}: var(--#{$name}); + } +} diff --git a/packages/skeleton/src/utilities/dividers.css b/packages/skeleton/src/utilities/dividers.css new file mode 100644 index 0000000000..50da2afc2d --- /dev/null +++ b/packages/skeleton/src/utilities/dividers.css @@ -0,0 +1,17 @@ +/* Components: Dividers */ + +/* Horizontal Rule */ +@utility hr { + border-color: var(--color-surface-200-800); + border-top-width: 1px; + display: block; + width: 100%; +} + +/* Vertical Rule */ +@utility vr { + border-color: var(--color-surface-200-800); + border-left-width: 1px; + display: inline-block; + height: 100%; +} diff --git a/packages/skeleton/src/utilities/form-core.css b/packages/skeleton/src/utilities/form-core.css new file mode 100644 index 0000000000..58b9c9d239 --- /dev/null +++ b/packages/skeleton/src/utilities/form-core.css @@ -0,0 +1,27 @@ +/* Components: Forms (Core) */ + +@utility fieldset { + display: block; + width: 100%; +} + +@utility legend { + display: block; + width: 100%; +} + +@utility label { + display: block; + width: 100%; + & > * + * { + margin-top: --spacing(1); + } +} + +@utility label-text { + display: block; + font-size: var(--text-xs); + line-height: var(--text-xs--line-height); + font-weight: var(--font-weight-medium); + text-decoration-line: none; +} diff --git a/packages/skeleton/src/utilities/form-groups.css b/packages/skeleton/src/utilities/form-groups.css new file mode 100644 index 0000000000..aa29a8214b --- /dev/null +++ b/packages/skeleton/src/utilities/form-groups.css @@ -0,0 +1,142 @@ +/* Components: Forms > Input Group */ + +@utility input-group { + border-radius: var(--radius-base); + display: grid; + align-items: stretch; + overflow: hidden; + + /* Edges */ + outline-color: transparent; + border-width: 0; + --tw-ring-inset: inset; + --tw-ring-color: var(--color-surface-200-800); + --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 var(--default-ring-width) var(--tw-ring-color, currentColor); + box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); + + /* Child Edges */ + & > :first-child { + border-top-left-radius: var(--radius-base); + border-bottom-left-radius: var(--radius-base); + } + & > :last-child { + border-top-right-radius: var(--radius-base); + border-bottom-right-radius: var(--radius-base); + } + + /* Dividers */ + & > * + * { + border-left-width: 1px !important; + border-color: var(--color-surface-200-800); + } +} + +/* Children: Cell --- */ + +@utility ig-cell { + font-size: var(--text-sm); + display: flex; + justify-content: center; + align-items: center; + padding-inline: --spacing(4); +} + +/* Children: Form Elements --- */ +/* We recreate a subset of form element styles here */ +/* These are purpose-built to work in the group */ + +@utility ig-input { + background-color: transparent; + display: block; + width: 100%; + + /* Size */ + font-size: var(--text-base); + line-height: var(--text-base--line-height); + padding-block: --spacing(1); + padding-inline: --spacing(3); + + /* Edges */ + outline-color: transparent; + border-width: 0; + --tw-ring-inset: inset; + + @variant active { + --tw-ring-color: var(--color-primary-500); + } + @variant focus { + --tw-ring-color: var(--color-primary-500); + } + @variant focus-within { + --tw-ring-color: var(--color-primary-500); + } +} + +@utility ig-select { + background-color: transparent; + display: block; + width: 100%; + + /* Size */ + font-size: var(--text-base); + line-height: var(--text-base--line-height); + padding-block: --spacing(1); + + /* Edges */ + outline-color: transparent; + border-width: 0; + --tw-ring-inset: inset; + + @variant active { + --tw-ring-color: var(--color-primary-500); + } + @variant focus { + --tw-ring-color: var(--color-primary-500); + } + @variant focus-within { + --tw-ring-color: var(--color-primary-500); + } + + /* Option --- */ + + & option { + background-color: var(--color-surface-50-950); + color: var(--color-surface-950-50); + border-radius: var(--radius-base); + font-size: var(--text-base); + line-height: --spacing(9); + height: --spacing(9); + padding: --spacing(2); + } +} + +@utility ig-btn { + /* Icon Spacing */ + display: inline-flex; + flex-direction: row; + align-items: center; + justify-content: center; + gap: --spacing(2); + + /* Typography */ + text-decoration-line: none; + white-space: nowrap; + + /* Size */ + font-size: var(--text-base); + line-height: var(--text-base--line-height); + padding-block: --spacing(1); + padding-inline: --spacing(4); + + /* Transitions */ + transition-property: all; + transition-timing-function: var(--default-transition-timing-function); + transition-duration: var(--default-transition-duration); + + @variant hover { + filter: brightness(125%); + @variant dark { + filter: brightness(75%); + } + } +} diff --git a/packages/skeleton/src/utilities/form-inputs.css b/packages/skeleton/src/utilities/form-inputs.css new file mode 100644 index 0000000000..244d61e23a --- /dev/null +++ b/packages/skeleton/src/utilities/form-inputs.css @@ -0,0 +1,106 @@ +/* Components: Forms > Input */ + +@utility input { + background-color: transparent; + border-radius: var(--radius-base); + display: block; + width: 100%; + + /* Size */ + font-size: var(--text-base); + line-height: var(--text-base--line-height); + padding-block: --spacing(1); + padding-inline: --spacing(3); + + /* Edges */ + outline-color: transparent; + border-width: 0; + --tw-ring-inset: inset; + --tw-ring-color: var(--color-surface-200-800); + --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 var(--default-ring-width) var(--tw-ring-color, currentColor); + box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); + + @variant active { + --tw-ring-color: var(--color-primary-500); + } + @variant focus { + --tw-ring-color: var(--color-primary-500); + } + @variant focus-within { + --tw-ring-color: var(--color-primary-500); + } + + /* File Input --- */ + + &[type='file']::file-selector-button { + cursor: pointer; + border-radius: var(--radius-base); + background-color: var(--color-surface-950-50); + color: var(--color-surface-50-950); + transform: translateY(--spacing(-0.5)); + margin-right: --spacing(2); + text-transform: capitalize; + + /* Size */ + font-size: var(--text-xs); + height: var(--text-xs--line-height); + padding-block: --spacing(0); + padding-inline: --spacing(3); + } + + /* Range Input --- */ + /* https://developer.mozilla.org/en-US/docs/Web/CSS/accent-color */ + + &[type='range'] { + accent-color: var(--color-surface-950-50); + box-shadow: none; + padding-inline: initial; + } + + /* Color Picker Input --- */ + /* https://stackoverflow.com/questions/11167281/webkit-css-to-control-the-box-around-the-color-in-an-inputtype-color */ + + &[type='color'] { + border-radius: var(--radius-base); + width: --spacing(8.5); + height: --spacing(8.5); + padding: 0; + border: none; + outline: none; + -webkit-appearance: none; + } + &[type='color']::-webkit-color-swatch-wrapper { + padding: 0; + } + &[type='color']::-webkit-color-swatch { + border: none; + border-radius: var(--radius-base); + } + &[type='color']::-moz-color-swatch { + border: none; + } + &[type='color']::-moz-color-swatch { + border: none; + } +} + +/* Ghost Input*/ +/* Used for the <TagsInput> component. */ +@utility input-ghost { + padding: 0px; + background-color: transparent; + + border-color: transparent; + outline-color: transparent; + --tw-ring-color: transparent; + + @variant active { + border-color: transparent !important; + } + @variant focus { + border-color: transparent !important; + } + @variant focus-within { + border-color: transparent !important; + } +} diff --git a/packages/skeleton/src/utilities/form-progress.css b/packages/skeleton/src/utilities/form-progress.css new file mode 100644 index 0000000000..f75706b35f --- /dev/null +++ b/packages/skeleton/src/utilities/form-progress.css @@ -0,0 +1,31 @@ +/* Components: Forms > Progress Bar */ + +/* + BROWSER CONSISTENCY WARNING: + Safari ignores most of the styles provided here. +*/ + +@utility progress { + webkit-appearance: none; + -moz-appearance: none; + appearance: none; + + border-radius: var(--radius-base); + background-color: var(--color-surface-200-800); + width: 100%; + height: --spacing(2); + overflow: hidden; + + &::-webkit-progress-bar { + background-color: var(--color-surface-200-800); + } + &::-webkit-progress-value { + background-color: var(--color-surface-950-50); + } + &::-moz-progress-bar { + background-color: var(--color-surface-950-50); + } + &:indeterminate::-moz-progress-bar { + width: 0; + } +} diff --git a/packages/skeleton/src/utilities/form-radios-checks.css b/packages/skeleton/src/utilities/form-radios-checks.css new file mode 100644 index 0000000000..48f0a530a9 --- /dev/null +++ b/packages/skeleton/src/utilities/form-radios-checks.css @@ -0,0 +1,82 @@ +/* Components: Forms > Radio / Checkbox */ + +@utility checkbox { + --tw-ring-color: var(--color-surface-200-800); + + cursor: pointer; + background-color: var(--color-surface-300-700); + border-radius: var(--radius-sm); + height: --spacing(5); + width: --spacing(5); + + @variant focus-within { + --tw-ring-color: var(--color-primary-500); + } + @variant hover { + filter: brightness(105%); + } + @variant focus { + filter: brightness(105%); + } + + &:checked { + background-color: var(--color-primary-500); + + @variant hover { + background-color: var(--color-primary-500); + } + @variant focus { + background-color: var(--color-primary-500); + border: 0; + } + } + + &:indeterminate { + background-color: var(--color-primary-500); + + @variant hover { + background-color: var(--color-primary-500); + } + @variant focus { + background-color: var(--color-primary-500); + border: 0; + } + } +} + +@utility radio { + --tw-ring-color: var(--color-surface-200-800); + + cursor: pointer; + background-color: var(--color-surface-300-700); + border-radius: var(--radius-sm); + height: --spacing(5); + width: --spacing(5); + + /* Base Size --- */ + border-radius: 100%; + height: --spacing(5); + width: --spacing(5); + + @variant focus-within { + --tw-ring-color: var(--color-primary-500); + } + @variant hover { + filter: brightness(105%); + } + @variant focus { + filter: brightness(105%); + } + + &:checked { + background-color: var(--color-primary-500); + + @variant hover { + background-color: var(--color-primary-500); + } + @variant focus { + background-color: var(--color-primary-500); + border: 0; + } + } +} diff --git a/packages/skeleton/src/utilities/form-selects.css b/packages/skeleton/src/utilities/form-selects.css new file mode 100644 index 0000000000..b5241c6621 --- /dev/null +++ b/packages/skeleton/src/utilities/form-selects.css @@ -0,0 +1,100 @@ +/* Components: Forms > Select */ + +/* + BROWSER CONSISTENCY WARNING: + Select (especially Size and Multiple) are notoriously difficult to style + consistently cross-browser, so all styles adhere to progress enhancement. + We've styled this element within the confines of that browser's capabilities. +*/ + +@utility select { + background-color: transparent; + border-radius: var(--radius-base); + display: block; + width: 100%; + + /* Size */ + font-size: var(--text-base); + line-height: var(--text-base--line-height); + padding-block: --spacing(1); + + /* + WARNING + Do not set `padding-inline` or it breaks + the native drop-down arrow for selects. + */ + + /* Edges */ + outline-color: transparent; + border-width: 0; + --tw-ring-inset: inset; + --tw-ring-color: var(--color-surface-200-800); + --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 var(--default-ring-width) var(--tw-ring-color, currentColor); + box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); + + @variant active { + --tw-ring-color: var(--color-primary-500); + } + @variant focus { + --tw-ring-color: var(--color-primary-500); + } + @variant focus-within { + --tw-ring-color: var(--color-primary-500); + } + + /* Multiple & Size --- */ + + & > * + * { + margin-top: --spacing(2); + } + + &[multiple] { + border-radius: var(--radius-container); + padding: --spacing(1); + + & optgroup, + & option { + background-color: transparent; + } + } + + &[size] { + border-radius: var(--radius-container); + padding: --spacing(1); + + & optgroup, + & option { + background-color: transparent; + } + } + + /* Optgroup --- */ + + & optgroup { + background-color: var(--color-surface-50-950); + color: var(--color-surface-950-50); + } + + & optgroup > * + * { + margin-top: --spacing(2); + } + + & optgroup option:first-of-type { + margin-top: --spacing(2); + } + & optgroup option:last-child { + margin-bottom: --spacing(2) !important; + } + + /* Option --- */ + + & option { + background-color: var(--color-surface-50-950); + color: var(--color-surface-950-50); + border-radius: var(--radius-base); + font-size: var(--text-base); + line-height: --spacing(9); + height: --spacing(9); + padding: --spacing(2); + } +} diff --git a/packages/skeleton/src/utilities/form-textareas.css b/packages/skeleton/src/utilities/form-textareas.css new file mode 100644 index 0000000000..8c24cb3d68 --- /dev/null +++ b/packages/skeleton/src/utilities/form-textareas.css @@ -0,0 +1,32 @@ +/* Components: Forms > Textarea */ + +@utility textarea { + background-color: transparent; + border-radius: var(--radius-base); + display: block; + width: 100%; + + /* Size */ + font-size: var(--text-base); + line-height: var(--text-base--line-height); + padding-block: --spacing(1); + padding-inline: --spacing(3); + + /* Edges */ + outline-color: transparent; + border-width: 0; + --tw-ring-inset: inset; + --tw-ring-color: var(--color-surface-200-800); + --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 var(--default-ring-width) var(--tw-ring-color, currentColor); + box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); + + @variant active { + --tw-ring-color: var(--color-primary-500); + } + @variant focus { + --tw-ring-color: var(--color-primary-500); + } + @variant focus-within { + --tw-ring-color: var(--color-primary-500); + } +} diff --git a/packages/skeleton/src/utilities/index.css b/packages/skeleton/src/utilities/index.css new file mode 100644 index 0000000000..23e9edb099 --- /dev/null +++ b/packages/skeleton/src/utilities/index.css @@ -0,0 +1,20 @@ +@import './core.scss'; + +@import './badges.css'; +@import './buttons.css'; +@import './cards.css'; +@import './chips.css'; +@import './dividers.css'; +@import './placeholders.css'; +@import './presets.scss'; +@import './tables.css'; +@import './typography.css'; + +/* Forms */ +@import './form-core.css'; +@import './form-groups.css'; +@import './form-inputs.css'; +@import './form-progress.css'; +@import './form-radios-checks.css'; +@import './form-selects.css'; +@import './form-textareas.css'; diff --git a/packages/skeleton/src/utilities/placeholders.css b/packages/skeleton/src/utilities/placeholders.css new file mode 100644 index 0000000000..ac953fa95e --- /dev/null +++ b/packages/skeleton/src/utilities/placeholders.css @@ -0,0 +1,14 @@ +/* Components: Placeholders */ + +@utility placeholder { + background-color: var(--color-surface-200-800); + border-radius: var(--radius-base); + min-height: --spacing(4); +} + +@utility placeholder-circle { + aspect-ratio: 1 / 1; + background-color: var(--color-surface-200-800); + border-radius: 100%; + min-height: --spacing(5); +} diff --git a/packages/skeleton/src/utilities/presets.scss b/packages/skeleton/src/utilities/presets.scss new file mode 100644 index 0000000000..1ad775c0ed --- /dev/null +++ b/packages/skeleton/src/utilities/presets.scss @@ -0,0 +1,71 @@ +/* Utilities: Presets */ + +@use '../constants.scss'; +@use 'sass:list'; + +/* Filled --- */ + +/* Neutral */ +@utility preset-filled { + background-color: var(--color-surface-950-50); + color: var(--color-surface-50-950); +} + +/* Generated */ +@each $name in constants.$color-names { + /* 500 */ + @utility preset-filled-#{$name}-500 { + background-color: var(--color-#{$name}-500); + color: var(--color-#{$name}-contrast-500); + } + /* Pairings 50-950 */ + @each $pairing in constants.$color-pairings { + $light: list.nth($pairing, 1); + $dark: list.nth($pairing, 2); + @utility preset-filled-#{$name}-#{$light}-#{$dark} { + background-color: var(--color-#{$name}-#{$light}-#{$dark}); + color: var(--color-#{$name}-contrast-#{$light}-#{$dark}); + } + } +} + +/* Tonal --- */ + +/* Neutral */ +@utility preset-tonal { + background-color: color-mix(in oklab, light-dark(var(--color-surface-950), var(--color-surface-50)) 5%, transparent); +} + +/* Generated */ +@each $name in constants.$color-names { + @utility preset-tonal-#{$name} { + background-color: var(--color-#{$name}-50-950); + color: var(--color-#{$name}-950-50); + } +} + +/* Outlined --- */ + +/* Neutral */ +@utility preset-outlined { + border-width: 1px; + border-color: var(--color-surface-950-50); +} + +/* Generated */ +@each $name in constants.$color-names { + /* 500 */ + @utility preset-outlined-#{$name}-500 { + border-width: 1px; + border-color: var(--color-#{$name}-500); + } + /* Pairings 50-950 */ + @each $pairing in constants.$color-pairings { + $light: list.nth($pairing, 1); + $dark: list.nth($pairing, 2); + @utility preset-outlined-#{$name}-#{$light}-#{$dark} { + border-width: 1px; + border-color: var(--color-#{$name}-#{$light}-#{$dark}); + } + } +} diff --git a/packages/skeleton/src/utilities/tables.css b/packages/skeleton/src/utilities/tables.css new file mode 100644 index 0000000000..4f5f8fb58a --- /dev/null +++ b/packages/skeleton/src/utilities/tables.css @@ -0,0 +1,65 @@ +/* Components: Tables */ + +@utility table-wrap { + width: 100%; + overflow: auto; +} + +@utility table { + /* Table --- */ + font-size: var(--text-sm); + line-height: var(--text-sm--line-height); + position: relative; + width: 100%; + + /* Head --- */ + + & thead { + color: var(--color-surface-700-300); + border-bottom-width: 1px; + border-color: var(--color-surface-200-800); + } + + & th { + text-align: left; + font-weight: 400; + } + + /* Body --- */ + + & tbody { + & > :not(:last-child) { + border-color: var(--color-surface-200-800); + } + & > :not(:last-child) { + border-top-width: 0px; + border-bottom-width: 1px; + } + } + + /* Foot --- */ + + & tfoot { + border-top-width: 1px; + border-color: var(--color-surface-200-800); + background-color: var(--color-surface-100-900); + } + + /* Cells */ + + & th { + padding: --spacing(2); + } + + & td { + padding: --spacing(2); + } + + /* Caption */ + + & caption { + color: var(--color-surface-600-400); + font-size: var(--text-xs); + line-height: var(--text-xs--line-height); + } +} diff --git a/packages/skeleton/src/utilities/typography.css b/packages/skeleton/src/utilities/typography.css new file mode 100644 index 0000000000..655b119e0b --- /dev/null +++ b/packages/skeleton/src/utilities/typography.css @@ -0,0 +1,237 @@ +/* Components: Typography */ + +@utility h1 { + color: var(--heading-font-color); + font-family: var(--heading-font-family); + font-weight: var(--heading-font-weight); + font-style: var(--heading-font-style); + letter-spacing: var(--heading-letter-spacing); + + font-size: var(--text-4xl); + line-height: var(--text-4xl--line-height); + + @variant md { + font-size: var(--text-5xl); + line-height: var(--text-5xl--line-height); + } + @variant dark { + color: var(--heading-font-color-dark); + } +} + +@utility h2 { + color: var(--heading-font-color); + font-family: var(--heading-font-family); + font-weight: var(--heading-font-weight); + font-style: var(--heading-font-style); + letter-spacing: var(--heading-letter-spacing); + + font-size: var(--text-3xl); + line-height: var(--text-3xl--line-height); + + @variant md { + font-size: var(--text-4xl); + line-height: var(--text-4xl--line-height); + } + @variant dark { + color: var(--heading-font-color-dark); + } +} + +@utility h3 { + color: var(--heading-font-color); + font-family: var(--heading-font-family); + font-weight: var(--heading-font-weight); + font-style: var(--heading-font-style); + letter-spacing: var(--heading-letter-spacing); + + font-size: var(--text-2xl); + line-height: var(--text-2xl--line-height); + + @variant md { + font-size: var(--text-3xl); + line-height: var(--text-3xl--line-height); + } + @variant dark { + color: var(--heading-font-color-dark); + } +} + +@utility h4 { + color: var(--heading-font-color); + font-family: var(--heading-font-family); + font-weight: var(--heading-font-weight); + font-style: var(--heading-font-style); + letter-spacing: var(--heading-letter-spacing); + + font-size: var(--text-xl); + line-height: var(--text-xl--line-height); + + @variant md { + font-size: var(--text-2xl); + line-height: var(--text-2xl--line-height); + } + + @variant dark { + color: var(--heading-font-color-dark); + } +} + +@utility h5 { + color: var(--heading-font-color); + font-family: var(--heading-font-family); + font-weight: var(--heading-font-weight); + font-style: var(--heading-font-style); + letter-spacing: var(--heading-letter-spacing); + + font-size: var(--text-lg); + line-height: var(--text-lg--line-height); + + @variant md { + font-size: var(--text-xl); + line-height: var(--text-xl--line-height); + } + @variant dark { + color: var(--heading-font-color-dark); + } +} + +@utility h6 { + color: var(--heading-font-color); + font-family: var(--heading-font-family); + font-weight: var(--heading-font-weight); + font-style: var(--heading-font-style); + letter-spacing: var(--heading-letter-spacing); + + font-size: var(--text-base); + line-height: var(--text-base--line-height); + + @variant md { + font-size: var(--text-lg); + line-height: var(--text-lg--line-height); + } + @variant dark { + color: var(--heading-font-color-dark); + } +} + +@utility anchor { + color: var(--anchor-font-color); + font-family: var(--anchor-font-family); + font-size: var(--anchor-font-size); + line-height: var(--anchor-line-height); + font-weight: var(--anchor-font-weight); + font-style: var(--anchor-font-style); + letter-spacing: var(--anchor-letter-spacing); + text-decoration: var(--anchor-text-decoration); + + @variant hover { + text-decoration: var(--anchor-text-decoration-hover); + } + @variant active { + text-decoration: var(--anchor-text-decoration-active); + } + @variant focus { + text-decoration: var(--anchor-text-decoration-focus); + } + @variant dark { + color: var(--anchor-font-color-dark); + } +} + +@utility blockquote { + border-left-width: 3px; + border-left-color: var(--color-primary-500); + padding-left: --spacing(4); + font-style: italic; +} + +@utility kbd { + background-color: var(--color-surface-300-700); + border-width: 1px; + border-color: var(--color-surface-600-400); + border-radius: var(--radius-base); + color: var(--color-surface-contrast-500); + font-family: var(--font-mono); + font-size: var(--text-sm); + white-space: nowrap; + overflow-x: auto; + padding-inline: --spacing(1.5); + padding-block: --spacing(0.25); +} + +@utility pre { + background-color: rgba(0, 0, 0, 0.85); + backdrop-filter: blur(var(--blur-sm)); + border-radius: var(--radius-container); + color: var(--color-white); + font-size: var(--text-xs); + white-space: pre-wrap; + padding: --spacing(4); + overflow-x: auto; +} + +@utility code { + &:not(pre &, .ec-line &) { + background-color: var(--color-primary-100-900); + border-radius: var(--radius-base); + color: var(--color-primary-contrast-50-950); + font-family: var(--font-mono); + font-size: var(--text-xs); + white-space: nowrap; + padding-inline: --spacing(1.5); + padding-block: --spacing(0.75); + overflow-x: auto; + } +} + +/* Insertions / Deletions --- */ +/* https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ins */ +/* https://developer.mozilla.org/en-US/docs/Web/HTML/Element/del */ + +@utility ins { + background-color: var(--color-success-500); + color: var(--color-success-contrast-500); + font-family: var(--font-mono); + position: relative; + display: block; + padding: --spacing(0.5); + padding-left: --spacing(5); + text-decoration: none; + + &::before { + position: absolute; + left: --spacing(1); + font-family: var(--font-mono); + } + &::before { + content: '+'; + } +} + +@utility del { + background-color: var(--color-error-500); + color: var(--color-error-contrast-500); + font-family: var(--font-mono); + position: relative; + display: block; + padding: --spacing(0.5); + padding-left: --spacing(5); + text-decoration: none; + + &::before { + position: absolute; + left: --spacing(1); + font-family: var(--font-mono); + } + &::before { + content: '−'; + } +} + +@utility mark { + color: var(--color-tertiary-contrast-500); + background-color: var(--color-tertiary-500); + border-radius: var(--radius-sm); + padding-inline: --spacing(1); +} diff --git a/packages/skeleton/src/variants/base.css b/packages/skeleton/src/variants/base.css new file mode 100644 index 0000000000..57a1cce525 --- /dev/null +++ b/packages/skeleton/src/variants/base.css @@ -0,0 +1,5 @@ +@custom-variant skb { + @layer base { + @slot; + } +} diff --git a/packages/skeleton/src/variants/index.css b/packages/skeleton/src/variants/index.css new file mode 100644 index 0000000000..08545246db --- /dev/null +++ b/packages/skeleton/src/variants/index.css @@ -0,0 +1,2 @@ +@import './base.css'; +@import './themes.scss'; diff --git a/packages/skeleton/src/variants/themes.scss b/packages/skeleton/src/variants/themes.scss new file mode 100644 index 0000000000..550996a973 --- /dev/null +++ b/packages/skeleton/src/variants/themes.scss @@ -0,0 +1,5 @@ +@use '../constants.scss'; + +@each $theme in constants.$themes { + @custom-variant theme-#{$theme} (&:where([data-theme="#{$theme}"] *)); +} diff --git a/packages/skeleton/vite.config.ts b/packages/skeleton/vite.config.ts new file mode 100644 index 0000000000..23c2656423 --- /dev/null +++ b/packages/skeleton/vite.config.ts @@ -0,0 +1,24 @@ +import { basename, dirname, join } from 'node:path'; +import { glob } from 'tinyglobby'; +import { defineConfig } from 'vite'; + +export default defineConfig({ + logLevel: 'silent', + build: { + cssCodeSplit: true, + cssMinify: false, + emptyOutDir: false, + lib: { + entry: { + ['index']: 'src/index.css', + ...Object.fromEntries( + (await glob('./src/themes/*.{css,scss}')).map((path) => { + const directory = basename(dirname(path)); + const filename = basename(path); + return [join(directory, filename), path]; + }), + ), + }, + }, + }, +}); diff --git a/playgrounds/skeleton-react/README.md b/playgrounds/skeleton-react/README.md new file mode 100644 index 0000000000..e215bc4ccf --- /dev/null +++ b/playgrounds/skeleton-react/README.md @@ -0,0 +1,36 @@ +This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +# or +bun dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. + +This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome! + +## Deploy on Vercel + +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details. diff --git a/playgrounds/skeleton-react/next.config.ts b/playgrounds/skeleton-react/next.config.ts new file mode 100644 index 0000000000..a67a28bdc0 --- /dev/null +++ b/playgrounds/skeleton-react/next.config.ts @@ -0,0 +1,7 @@ +import type { NextConfig } from 'next'; + +const nextConfig: NextConfig = { + /* config options here */ +}; + +export default nextConfig; diff --git a/playgrounds/skeleton-react/package.json b/playgrounds/skeleton-react/package.json new file mode 100644 index 0000000000..beae832cd1 --- /dev/null +++ b/playgrounds/skeleton-react/package.json @@ -0,0 +1,27 @@ +{ + "name": "@skeletonlabs/playground-skeleton-react", + "version": "0.0.1", + "private": true, + "scripts": { + "dev": "next dev --turbopack", + "build": "next build" + }, + "dependencies": { + "@skeletonlabs/skeleton": "workspace:*", + "@skeletonlabs/skeleton-react": "workspace:*", + "@tailwindcss/forms": "catalog:", + "@tailwindcss/postcss": "catalog:", + "lucide-react": "catalog:", + "next": "catalog:", + "postcss": "catalog:", + "react": "catalog:", + "react-dom": "catalog:" + }, + "devDependencies": { + "@types/node": "catalog:", + "@types/react": "catalog:", + "@types/react-dom": "catalog:", + "tailwindcss": "catalog:", + "typescript": "catalog:" + } +} diff --git a/playgrounds/skeleton-react/postcss.config.mjs b/playgrounds/skeleton-react/postcss.config.mjs new file mode 100644 index 0000000000..2c59869459 --- /dev/null +++ b/playgrounds/skeleton-react/postcss.config.mjs @@ -0,0 +1,7 @@ +const config = { + plugins: { + '@tailwindcss/postcss': {}, + }, +}; + +export default config; diff --git a/playgrounds/skeleton-react/public/file.svg b/playgrounds/skeleton-react/public/file.svg new file mode 100644 index 0000000000..004145cddf --- /dev/null +++ b/playgrounds/skeleton-react/public/file.svg @@ -0,0 +1 @@ +<svg fill="none" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="M14.5 13.5V5.41a1 1 0 0 0-.3-.7L9.8.29A1 1 0 0 0 9.08 0H1.5v13.5A2.5 2.5 0 0 0 4 16h8a2.5 2.5 0 0 0 2.5-2.5m-1.5 0v-7H8v-5H3v12a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1M9.5 5V2.12L12.38 5zM5.13 5h-.62v1.25h2.12V5zm-.62 3h7.12v1.25H4.5zm.62 3h-.62v1.25h7.12V11z" clip-rule="evenodd" fill="#666" fill-rule="evenodd"/></svg> \ No newline at end of file diff --git a/playgrounds/skeleton-react/public/globe.svg b/playgrounds/skeleton-react/public/globe.svg new file mode 100644 index 0000000000..567f17b0d7 --- /dev/null +++ b/playgrounds/skeleton-react/public/globe.svg @@ -0,0 +1 @@ +<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><g clip-path="url(#a)"><path fill-rule="evenodd" clip-rule="evenodd" d="M10.27 14.1a6.5 6.5 0 0 0 3.67-3.45q-1.24.21-2.7.34-.31 1.83-.97 3.1M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16m.48-1.52a7 7 0 0 1-.96 0H7.5a4 4 0 0 1-.84-1.32q-.38-.89-.63-2.08a40 40 0 0 0 3.92 0q-.25 1.2-.63 2.08a4 4 0 0 1-.84 1.31zm2.94-4.76q1.66-.15 2.95-.43a7 7 0 0 0 0-2.58q-1.3-.27-2.95-.43a18 18 0 0 1 0 3.44m-1.27-3.54a17 17 0 0 1 0 3.64 39 39 0 0 1-4.3 0 17 17 0 0 1 0-3.64 39 39 0 0 1 4.3 0m1.1-1.17q1.45.13 2.69.34a6.5 6.5 0 0 0-3.67-3.44q.65 1.26.98 3.1M8.48 1.5l.01.02q.41.37.84 1.31.38.89.63 2.08a40 40 0 0 0-3.92 0q.25-1.2.63-2.08a4 4 0 0 1 .85-1.32 7 7 0 0 1 .96 0m-2.75.4a6.5 6.5 0 0 0-3.67 3.44 29 29 0 0 1 2.7-.34q.31-1.83.97-3.1M4.58 6.28q-1.66.16-2.95.43a7 7 0 0 0 0 2.58q1.3.27 2.95.43a18 18 0 0 1 0-3.44m.17 4.71q-1.45-.12-2.69-.34a6.5 6.5 0 0 0 3.67 3.44q-.65-1.27-.98-3.1" fill="#666"/></g><defs><clipPath id="a"><path fill="#fff" d="M0 0h16v16H0z"/></clipPath></defs></svg> \ No newline at end of file diff --git a/playgrounds/skeleton-react/public/next.svg b/playgrounds/skeleton-react/public/next.svg new file mode 100644 index 0000000000..5174b28c56 --- /dev/null +++ b/playgrounds/skeleton-react/public/next.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 394 80"><path fill="#000" d="M262 0h68.5v12.7h-27.2v66.6h-13.6V12.7H262V0ZM149 0v12.7H94v20.4h44.3v12.6H94v21h55v12.6H80.5V0h68.7zm34.3 0h-17.8l63.8 79.4h17.9l-32-39.7 32-39.6h-17.9l-23 28.6-23-28.6zm18.3 56.7-9-11-27.1 33.7h17.8l18.3-22.7z"/><path fill="#000" d="M81 79.3 17 0H0v79.3h13.6V17l50.2 62.3H81Zm252.6-.4c-1 0-1.8-.4-2.5-1s-1.1-1.6-1.1-2.6.3-1.8 1-2.5 1.6-1 2.6-1 1.8.3 2.5 1a3.4 3.4 0 0 1 .6 4.3 3.7 3.7 0 0 1-3 1.8zm23.2-33.5h6v23.3c0 2.1-.4 4-1.3 5.5a9.1 9.1 0 0 1-3.8 3.5c-1.6.8-3.5 1.3-5.7 1.3-2 0-3.7-.4-5.3-1s-2.8-1.8-3.7-3.2c-.9-1.3-1.4-3-1.4-5h6c.1.8.3 1.6.7 2.2s1 1.2 1.6 1.5c.7.4 1.5.5 2.4.5 1 0 1.8-.2 2.4-.6a4 4 0 0 0 1.6-1.8c.3-.8.5-1.8.5-3V45.5zm30.9 9.1a4.4 4.4 0 0 0-2-3.3 7.5 7.5 0 0 0-4.3-1.1c-1.3 0-2.4.2-3.3.5-.9.4-1.6 1-2 1.6a3.5 3.5 0 0 0-.3 4c.3.5.7.9 1.3 1.2l1.8 1 2 .5 3.2.8c1.3.3 2.5.7 3.7 1.2a13 13 0 0 1 3.2 1.8 8.1 8.1 0 0 1 3 6.5c0 2-.5 3.7-1.5 5.1a10 10 0 0 1-4.4 3.5c-1.8.8-4.1 1.2-6.8 1.2-2.6 0-4.9-.4-6.8-1.2-2-.8-3.4-2-4.5-3.5a10 10 0 0 1-1.7-5.6h6a5 5 0 0 0 3.5 4.6c1 .4 2.2.6 3.4.6 1.3 0 2.5-.2 3.5-.6 1-.4 1.8-1 2.4-1.7a4 4 0 0 0 .8-2.4c0-.9-.2-1.6-.7-2.2a11 11 0 0 0-2.1-1.4l-3.2-1-3.8-1c-2.8-.7-5-1.7-6.6-3.2a7.2 7.2 0 0 1-2.4-5.7 8 8 0 0 1 1.7-5 10 10 0 0 1 4.3-3.5c2-.8 4-1.2 6.4-1.2 2.3 0 4.4.4 6.2 1.2 1.8.8 3.2 2 4.3 3.4 1 1.4 1.5 3 1.5 5h-5.8z"/></svg> \ No newline at end of file diff --git a/playgrounds/skeleton-react/public/vercel.svg b/playgrounds/skeleton-react/public/vercel.svg new file mode 100644 index 0000000000..7705396033 --- /dev/null +++ b/playgrounds/skeleton-react/public/vercel.svg @@ -0,0 +1 @@ +<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1155 1000"><path d="m577.3 0 577.4 1000H0z" fill="#fff"/></svg> \ No newline at end of file diff --git a/playgrounds/skeleton-react/public/window.svg b/playgrounds/skeleton-react/public/window.svg new file mode 100644 index 0000000000..b2b2a44f6e --- /dev/null +++ b/playgrounds/skeleton-react/public/window.svg @@ -0,0 +1 @@ +<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path fill-rule="evenodd" clip-rule="evenodd" d="M1.5 2.5h13v10a1 1 0 0 1-1 1h-11a1 1 0 0 1-1-1zM0 1h16v11.5a2.5 2.5 0 0 1-2.5 2.5h-11A2.5 2.5 0 0 1 0 12.5zm3.75 4.5a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5M7 4.75a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0m1.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5" fill="#666"/></svg> \ No newline at end of file diff --git a/playgrounds/skeleton-react/src/app/components/accordion/page.tsx b/playgrounds/skeleton-react/src/app/components/accordion/page.tsx new file mode 100644 index 0000000000..7658b0e60f --- /dev/null +++ b/playgrounds/skeleton-react/src/app/components/accordion/page.tsx @@ -0,0 +1,28 @@ +'use client'; + +import { Accordion } from '@skeletonlabs/skeleton-react'; + +export default function Page() { + return ( + <Accordion> + <Accordion.Item value="item-1"> + <Accordion.ItemHeading> + <Accordion.ItemTrigger>Item 1</Accordion.ItemTrigger> + </Accordion.ItemHeading> + <Accordion.ItemContent>Content 1</Accordion.ItemContent> + </Accordion.Item> + <Accordion.Item value="item-2"> + <Accordion.ItemHeading> + <Accordion.ItemTrigger>Item 2</Accordion.ItemTrigger> + </Accordion.ItemHeading> + <Accordion.ItemContent>Content 2</Accordion.ItemContent> + </Accordion.Item> + <Accordion.Item value="item-3"> + <Accordion.ItemHeading> + <Accordion.ItemTrigger>Item 3</Accordion.ItemTrigger> + </Accordion.ItemHeading> + <Accordion.ItemContent>Content 3</Accordion.ItemContent> + </Accordion.Item> + </Accordion> + ); +} diff --git a/playgrounds/skeleton-react/src/app/components/app-bar/page.tsx b/playgrounds/skeleton-react/src/app/components/app-bar/page.tsx new file mode 100644 index 0000000000..46d3d4711b --- /dev/null +++ b/playgrounds/skeleton-react/src/app/components/app-bar/page.tsx @@ -0,0 +1,94 @@ +'use client'; + +import { AppBar } from '@skeletonlabs/skeleton-react'; +import { CalendarIcon } from 'lucide-react'; +import { CircleUserIcon } from 'lucide-react'; +import { MenuIcon } from 'lucide-react'; +import { SearchIcon } from 'lucide-react'; + +export default function Page() { + return ( + <div className="space-y-10"> + <header> + <h2 className="h2">App Bar</h2> + </header> + <section className="space-y-4"> + <AppBar> + <AppBar.Toolbar className="grid-cols-[auto_1fr_auto]"> + <AppBar.Lead> + <button type="button" className="btn-icon btn-icon-lg hover:preset-tonal"> + <MenuIcon /> + </button> + </AppBar.Lead> + <AppBar.Headline> + <p className="text-2xl">Headline</p> + </AppBar.Headline> + <AppBar.Trail> + <button type="button" className="btn-icon hover:preset-tonal"> + <SearchIcon className="size-6" /> + </button> + <button type="button" className="btn-icon hover:preset-tonal"> + <CalendarIcon className="size-6" /> + </button> + <button type="button" className="btn-icon hover:preset-tonal"> + <CircleUserIcon className="size-6" /> + </button> + </AppBar.Trail> + </AppBar.Toolbar> + </AppBar> + </section> + <section className="space-y-4"> + <h3 className="h3">Centered</h3> + <AppBar> + <AppBar.Toolbar className="grid-cols-[1fr_2fr_1fr]"> + <AppBar.Lead> + <button type="button" className="btn-icon btn-icon-lg hover:preset-tonal"> + <MenuIcon /> + </button> + </AppBar.Lead> + <AppBar.Headline className="flex justify-center"> + <p>Headline</p> + </AppBar.Headline> + <AppBar.Trail className="justify-end"> + <button type="button" className="btn-icon hover:preset-tonal"> + <SearchIcon className="size-6" /> + </button> + <button type="button" className="btn-icon hover:preset-tonal"> + <CalendarIcon className="size-6" /> + </button> + <button type="button" className="btn-icon hover:preset-tonal"> + <CircleUserIcon className="size-6" /> + </button> + </AppBar.Trail> + </AppBar.Toolbar> + </AppBar> + </section> + <section className="space-y-4"> + <h3 className="h3">Extended</h3> + <AppBar> + <AppBar.Toolbar className="grid-cols-[auto_auto]"> + <AppBar.Lead> + <button type="button" className="btn-icon btn-icon-lg hover:preset-tonal"> + <MenuIcon /> + </button> + </AppBar.Lead> + <AppBar.Trail> + <button type="button" className="btn-icon hover:preset-tonal"> + <SearchIcon className="size-6" /> + </button> + <button type="button" className="btn-icon hover:preset-tonal"> + <CalendarIcon className="size-6" /> + </button> + <button type="button" className="btn-icon hover:preset-tonal"> + <CircleUserIcon className="size-6" /> + </button> + </AppBar.Trail> + </AppBar.Toolbar> + <AppBar.Headline> + <h2 className="h2">Headline</h2> + </AppBar.Headline> + </AppBar> + </section> + </div> + ); +} diff --git a/playgrounds/skeleton-react/src/app/components/avatar/page.tsx b/playgrounds/skeleton-react/src/app/components/avatar/page.tsx new file mode 100644 index 0000000000..e226d207f3 --- /dev/null +++ b/playgrounds/skeleton-react/src/app/components/avatar/page.tsx @@ -0,0 +1,12 @@ +'use client'; + +import { Avatar } from '@skeletonlabs/skeleton-react'; + +export default function Page() { + return ( + <Avatar> + <Avatar.Image src="https://picsum.photos/100/100" /> + <Avatar.Fallback>SK</Avatar.Fallback> + </Avatar> + ); +} diff --git a/playgrounds/skeleton-react/src/app/components/combobox/page.tsx b/playgrounds/skeleton-react/src/app/components/combobox/page.tsx new file mode 100644 index 0000000000..9bdbdfdc53 --- /dev/null +++ b/playgrounds/skeleton-react/src/app/components/combobox/page.tsx @@ -0,0 +1,84 @@ +'use client'; + +import { Combobox, type ComboboxRootProps, Portal, useListCollection } from '@skeletonlabs/skeleton-react'; +import { useState } from 'react'; + +const data = [ + { + label: 'Apple', + value: 'apple', + type: 'Fruits', + }, + { + label: 'Banana', + value: 'banana', + type: 'Fruits', + }, + { + label: 'Orange', + value: 'orange', + type: 'Fruits', + }, + { + label: 'Carrot', + value: 'carrot', + type: 'Vegetables', + }, + { + label: 'Broccoli', + value: 'broccoli', + type: 'Vegetables', + }, + { + label: 'Spinach', + value: 'spinach', + type: 'Vegetables', + }, +]; + +export default function Page() { + const [items, setItems] = useState(data); + + const collection = useListCollection({ + items: items, + itemToString: (item) => item.label, + itemToValue: (item) => item.value, + groupBy: (item) => item.type, + }); + + const onOpenChange = () => { + setItems(data); + }; + + const onInputValueChange: ComboboxRootProps['onInputValueChange'] = (event) => { + const filtered = data.filter((item) => item.value.toLowerCase().includes(event.inputValue.toLowerCase())); + setItems(filtered.length > 0 ? filtered : data); + }; + + return ( + <Combobox collection={collection} onOpenChange={onOpenChange} onInputValueChange={onInputValueChange} inputBehavior="autohighlight"> + <Combobox.Label>Label</Combobox.Label> + <Combobox.Control> + <Combobox.Input /> + <Combobox.Trigger /> + </Combobox.Control> + <Portal> + <Combobox.Positioner> + <Combobox.Content> + {collection.group().map(([type, items]) => ( + <Combobox.ItemGroup key={type}> + <Combobox.ItemGroupLabel>{type}</Combobox.ItemGroupLabel> + {items.map((item) => ( + <Combobox.Item key={item.value} item={item}> + <Combobox.ItemText>{item.label}</Combobox.ItemText> + <Combobox.ItemIndicator /> + </Combobox.Item> + ))} + </Combobox.ItemGroup> + ))} + </Combobox.Content> + </Combobox.Positioner> + </Portal> + </Combobox> + ); +} diff --git a/playgrounds/skeleton-react/src/app/components/dialog/page.tsx b/playgrounds/skeleton-react/src/app/components/dialog/page.tsx new file mode 100644 index 0000000000..f82e316b84 --- /dev/null +++ b/playgrounds/skeleton-react/src/app/components/dialog/page.tsx @@ -0,0 +1,21 @@ +'use client'; + +import { Dialog, Portal } from '@skeletonlabs/skeleton-react'; + +export default function Page() { + return ( + <Dialog> + <Dialog.Trigger className="btn preset-filled">Trigger</Dialog.Trigger> + <Portal> + <Dialog.Backdrop className="fixed inset-0 z-50 bg-surface-50-950/50" /> + <Dialog.Positioner className="fixed inset-0 z-50 flex justify-center items-center"> + <Dialog.Content className="card bg-surface-100-900 w-md p-4 space-y-2 shadow-xl"> + <Dialog.Title className="text-2xl font-bold">Hello World</Dialog.Title> + <Dialog.Description>This is an example of a basic dialog.</Dialog.Description> + <Dialog.CloseTrigger className="btn preset-tonal">Close</Dialog.CloseTrigger> + </Dialog.Content> + </Dialog.Positioner> + </Portal> + </Dialog> + ); +} diff --git a/playgrounds/skeleton-react/src/app/components/file-upload/page.tsx b/playgrounds/skeleton-react/src/app/components/file-upload/page.tsx new file mode 100644 index 0000000000..c3ebc91b77 --- /dev/null +++ b/playgrounds/skeleton-react/src/app/components/file-upload/page.tsx @@ -0,0 +1,37 @@ +'use client'; + +import { FileUpload, useFileUpload } from '@skeletonlabs/skeleton-react'; +import { CircleXIcon } from 'lucide-react'; + +export default function Page() { + const fileUpload = useFileUpload(); + + return ( + <> + <FileUpload.Provider value={fileUpload}> + <FileUpload.Dropzone> + <FileUpload.Trigger>Browse Files</FileUpload.Trigger> + <FileUpload.HiddenInput /> + </FileUpload.Dropzone> + <FileUpload.ItemGroup> + <FileUpload.Context> + {(fileUpload) => + fileUpload.acceptedFiles.map((file) => ( + <FileUpload.Item key={file.name} file={file}> + <FileUpload.ItemName>{file.name}</FileUpload.ItemName> + <FileUpload.ItemSizeText>{file.size} bytes</FileUpload.ItemSizeText> + <FileUpload.ItemDeleteTrigger> + <CircleXIcon /> + </FileUpload.ItemDeleteTrigger> + </FileUpload.Item> + )) + } + </FileUpload.Context> + </FileUpload.ItemGroup> + </FileUpload.Provider> + <button className="btn preset-outlined-error-500" onClick={() => fileUpload.clearFiles()}> + Clear Files + </button> + </> + ); +} diff --git a/playgrounds/skeleton-react/src/app/components/popover/page.tsx b/playgrounds/skeleton-react/src/app/components/popover/page.tsx new file mode 100644 index 0000000000..e54e36dc1d --- /dev/null +++ b/playgrounds/skeleton-react/src/app/components/popover/page.tsx @@ -0,0 +1,28 @@ +'use client'; + +import { Popover, Portal } from '@skeletonlabs/skeleton-react'; + +export default function Page() { + return ( + <Popover> + <Popover.Trigger>Open</Popover.Trigger> + <Portal> + <Popover.Positioner> + <Popover.Content> + <Popover.Title>Title</Popover.Title> + <Popover.Description>Description</Popover.Description> + <Popover.CloseTrigger>Close</Popover.CloseTrigger> + <Popover.Arrow + style={{ + ['--arrow-size' as string]: 'calc(var(--spacing) * 2)', + ['--arrow-background' as string]: 'var(--color-surface-100-900)', + }} + > + <Popover.ArrowTip /> + </Popover.Arrow> + </Popover.Content> + </Popover.Positioner> + </Portal> + </Popover> + ); +} diff --git a/playgrounds/skeleton-react/src/app/components/progress-linear/page.tsx b/playgrounds/skeleton-react/src/app/components/progress-linear/page.tsx new file mode 100644 index 0000000000..bf980e8994 --- /dev/null +++ b/playgrounds/skeleton-react/src/app/components/progress-linear/page.tsx @@ -0,0 +1,92 @@ +'use client'; + +import { ProgressLinear } from '@skeletonlabs/skeleton-react'; +import { useState } from 'react'; + +export default function Page() { + const [value, setValue] = useState<number | null>(25); + return ( + <div className="space-y-10"> + <header> + <h2 className="h2">Progress Linear</h2> + </header> + <section className="space-y-4"> + <ProgressLinear value={value} onValueChange={(e) => setValue(e.value)}> + <ProgressLinear.Track> + <ProgressLinear.Range /> + </ProgressLinear.Track> + </ProgressLinear> + </section> + <section className="space-y-4"> + <h2 className="h2">Colors</h2> + <ProgressLinear value={value} onValueChange={(e) => setValue(e.value)}> + <ProgressLinear.Track className="bg-primary-50-950"> + <ProgressLinear.Range className="bg-primary-500" /> + </ProgressLinear.Track> + </ProgressLinear> + <ProgressLinear value={value} onValueChange={(e) => setValue(e.value)}> + <ProgressLinear.Track className="bg-secondary-50-950"> + <ProgressLinear.Range className="bg-secondary-500" /> + </ProgressLinear.Track> + </ProgressLinear> + <ProgressLinear value={value} onValueChange={(e) => setValue(e.value)}> + <ProgressLinear.Track className="bg-tertiary-50-950"> + <ProgressLinear.Range className="bg-tertiary-500" /> + </ProgressLinear.Track> + </ProgressLinear> + </section> + <section className="space-y-4"> + <h2 className="h2">Height</h2> + <ProgressLinear value={value} onValueChange={(e) => setValue(e.value)}> + <ProgressLinear.Track> + <ProgressLinear.Range /> + </ProgressLinear.Track> + </ProgressLinear> + <ProgressLinear value={value} onValueChange={(e) => setValue(e.value)}> + <ProgressLinear.Track className="h-4 rounded-full"> + <ProgressLinear.Range className="rounded-full" /> + </ProgressLinear.Track> + </ProgressLinear> + <ProgressLinear value={value} onValueChange={(e) => setValue(e.value)}> + <ProgressLinear.Track className="h-8 rounded-full"> + <ProgressLinear.Range className="rounded-full" /> + </ProgressLinear.Track> + </ProgressLinear> + </section> + <section className="space-y-4"> + <h3 className="h3">Orientation</h3> + <div className="flex flex-row items-start gap-4"> + <ProgressLinear orientation="vertical" value={value} onValueChange={(e) => setValue(e.value)}> + <ProgressLinear.Label>{value}%</ProgressLinear.Label> + <ProgressLinear.Track> + <ProgressLinear.Range /> + </ProgressLinear.Track> + </ProgressLinear> + <ProgressLinear orientation="vertical" value={undefined}> + <ProgressLinear.Label>null</ProgressLinear.Label> + <ProgressLinear.Track> + <ProgressLinear.Range /> + </ProgressLinear.Track> + </ProgressLinear> + </div> + </section> + <section className="space-y-4"> + <h3 className="h3">Labeled</h3> + <ProgressLinear value={value} onValueChange={(e) => setValue(e.value)}> + <ProgressLinear.Label>{value}%</ProgressLinear.Label> + <ProgressLinear.Track> + <ProgressLinear.Range /> + </ProgressLinear.Track> + </ProgressLinear> + </section> + <section className="space-y-4"> + <h3 className="h3">Indeterminate</h3> + <ProgressLinear value={undefined}> + <ProgressLinear.Track> + <ProgressLinear.Range /> + </ProgressLinear.Track> + </ProgressLinear> + </section> + </div> + ); +} diff --git a/playgrounds/skeleton-react/src/app/components/rating-group/page.tsx b/playgrounds/skeleton-react/src/app/components/rating-group/page.tsx new file mode 100644 index 0000000000..c244c6e64b --- /dev/null +++ b/playgrounds/skeleton-react/src/app/components/rating-group/page.tsx @@ -0,0 +1,16 @@ +'use client'; + +import { RatingGroup } from '@skeletonlabs/skeleton-react'; + +export default function Page() { + return ( + <RatingGroup count={10} allowHalf defaultValue={7.5}> + <RatingGroup.Control> + <RatingGroup.Context> + {(ratingGroup) => ratingGroup.items.map((index) => <RatingGroup.Item key={index} index={index} />)} + </RatingGroup.Context> + </RatingGroup.Control> + <RatingGroup.HiddenInput /> + </RatingGroup> + ); +} diff --git a/playgrounds/skeleton-react/src/app/components/segmented-control/page.tsx b/playgrounds/skeleton-react/src/app/components/segmented-control/page.tsx new file mode 100644 index 0000000000..c2490820e6 --- /dev/null +++ b/playgrounds/skeleton-react/src/app/components/segmented-control/page.tsx @@ -0,0 +1,23 @@ +'use client'; + +import { SegmentedControl } from '@skeletonlabs/skeleton-react'; + +export default function Page() { + return ( + <SegmentedControl defaultValue="item-1"> + <SegmentedControl.Indicator /> + <SegmentedControl.Item value="item-1"> + <SegmentedControl.ItemText>Item 1</SegmentedControl.ItemText> + <SegmentedControl.ItemHiddenInput /> + </SegmentedControl.Item> + <SegmentedControl.Item value="item-2"> + <SegmentedControl.ItemText>Item 2</SegmentedControl.ItemText> + <SegmentedControl.ItemHiddenInput /> + </SegmentedControl.Item> + <SegmentedControl.Item value="item-3"> + <SegmentedControl.ItemText>Item 3</SegmentedControl.ItemText> + <SegmentedControl.ItemHiddenInput /> + </SegmentedControl.Item> + </SegmentedControl> + ); +} diff --git a/playgrounds/skeleton-react/src/app/components/slider/page.tsx b/playgrounds/skeleton-react/src/app/components/slider/page.tsx new file mode 100644 index 0000000000..b3a474bc2a --- /dev/null +++ b/playgrounds/skeleton-react/src/app/components/slider/page.tsx @@ -0,0 +1,27 @@ +'use client'; + +import { Slider } from '@skeletonlabs/skeleton-react'; + +export default function Page() { + return ( + <Slider> + <Slider.Label>Label</Slider.Label> + <Slider.ValueText /> + <Slider.Control> + <Slider.Track> + <Slider.Range /> + </Slider.Track> + <Slider.Thumb index={0}> + <Slider.HiddenInput /> + </Slider.Thumb> + </Slider.Control> + <Slider.MarkerGroup> + <Slider.Marker value={0} /> + <Slider.Marker value={25} /> + <Slider.Marker value={50} /> + <Slider.Marker value={75} /> + <Slider.Marker value={100} /> + </Slider.MarkerGroup> + </Slider> + ); +} diff --git a/playgrounds/skeleton-react/src/app/components/switch/page.tsx b/playgrounds/skeleton-react/src/app/components/switch/page.tsx new file mode 100644 index 0000000000..5d5390d918 --- /dev/null +++ b/playgrounds/skeleton-react/src/app/components/switch/page.tsx @@ -0,0 +1,15 @@ +'use client'; + +import { Switch } from '@skeletonlabs/skeleton-react'; + +export default function Page() { + return ( + <Switch> + <Switch.HiddenInput /> + <Switch.Control> + <Switch.Thumb /> + </Switch.Control> + <Switch.Label>Label</Switch.Label> + </Switch> + ); +} diff --git a/playgrounds/skeleton-react/src/app/components/tabs/page.tsx b/playgrounds/skeleton-react/src/app/components/tabs/page.tsx new file mode 100644 index 0000000000..54a43e5493 --- /dev/null +++ b/playgrounds/skeleton-react/src/app/components/tabs/page.tsx @@ -0,0 +1,19 @@ +'use client'; + +import { Tabs } from '@skeletonlabs/skeleton-react'; + +export default function Page() { + return ( + <Tabs defaultValue="tab-1"> + <Tabs.List> + <Tabs.Trigger value="tab-1">Tab 1</Tabs.Trigger> + <Tabs.Trigger value="tab-2">Tab 2</Tabs.Trigger> + <Tabs.Trigger value="tab-3">Tab 3</Tabs.Trigger> + <Tabs.Indicator /> + </Tabs.List> + <Tabs.Content value="tab-1">Content for Tab 1</Tabs.Content> + <Tabs.Content value="tab-2">Content for Tab 2</Tabs.Content> + <Tabs.Content value="tab-3">Content for Tab 3</Tabs.Content> + </Tabs> + ); +} diff --git a/playgrounds/skeleton-react/src/app/components/tags-input/page.tsx b/playgrounds/skeleton-react/src/app/components/tags-input/page.tsx new file mode 100644 index 0000000000..7e4698f136 --- /dev/null +++ b/playgrounds/skeleton-react/src/app/components/tags-input/page.tsx @@ -0,0 +1,29 @@ +'use client'; + +import { TagsInput } from '@skeletonlabs/skeleton-react'; + +export default function Page() { + return ( + <TagsInput> + <TagsInput.Label>Label</TagsInput.Label> + <TagsInput.Control> + <TagsInput.Context> + {(tagsInput) => + tagsInput.value.map((value, index) => ( + <TagsInput.Item key={index} value={value} index={index}> + <TagsInput.ItemPreview> + <TagsInput.ItemText>{value}</TagsInput.ItemText> + <TagsInput.ItemDeleteTrigger /> + </TagsInput.ItemPreview> + <TagsInput.ItemInput /> + </TagsInput.Item> + )) + } + </TagsInput.Context> + <TagsInput.Input /> + </TagsInput.Control> + <TagsInput.ClearTrigger>Clear All</TagsInput.ClearTrigger> + <TagsInput.HiddenInput /> + </TagsInput> + ); +} diff --git a/playgrounds/skeleton-react/src/app/components/toast/page.tsx b/playgrounds/skeleton-react/src/app/components/toast/page.tsx new file mode 100644 index 0000000000..62f60727c5 --- /dev/null +++ b/playgrounds/skeleton-react/src/app/components/toast/page.tsx @@ -0,0 +1,36 @@ +'use client'; + +import { Toast, createToaster } from '@skeletonlabs/skeleton-react'; + +export default function Page() { + const toaster = createToaster({}); + return ( + <> + <button + className="btn preset-filled" + onClick={() => + toaster.info({ + title: 'Toast', + description: 'This is a toast message.', + action: { label: 'Undo', onClick: () => {} }, + duration: Infinity, + }) + } + > + Toast + </button> + <Toast.Group toaster={toaster}> + {(toast) => ( + <Toast toast={toast} key={toast.id}> + <Toast.Message> + <Toast.Title>{toast.title}</Toast.Title> + <Toast.Description>{toast.description}</Toast.Description> + </Toast.Message> + {toast.action && <Toast.ActionTrigger>{toast.action.label}</Toast.ActionTrigger>} + <Toast.CloseTrigger /> + </Toast> + )} + </Toast.Group> + </> + ); +} diff --git a/playgrounds/skeleton-react/src/app/components/tooltip/page.tsx b/playgrounds/skeleton-react/src/app/components/tooltip/page.tsx new file mode 100644 index 0000000000..72fdc88c88 --- /dev/null +++ b/playgrounds/skeleton-react/src/app/components/tooltip/page.tsx @@ -0,0 +1,26 @@ +'use client'; + +import { Portal, Tooltip } from '@skeletonlabs/skeleton-react'; + +export default function Page() { + return ( + <Tooltip> + <Tooltip.Trigger>Trigger</Tooltip.Trigger> + <Portal> + <Tooltip.Positioner> + <Tooltip.Content> + Content + <Tooltip.Arrow + style={{ + ['--arrow-size' as string]: 'calc(var(--spacing) * 2)', + ['--arrow-background' as string]: 'var(--color-surface-100-900)', + }} + > + <Tooltip.ArrowTip /> + </Tooltip.Arrow> + </Tooltip.Content> + </Tooltip.Positioner> + </Portal> + </Tooltip> + ); +} diff --git a/playgrounds/skeleton-react/src/app/favicon.ico b/playgrounds/skeleton-react/src/app/favicon.ico new file mode 100644 index 0000000000..718d6fea48 Binary files /dev/null and b/playgrounds/skeleton-react/src/app/favicon.ico differ diff --git a/playgrounds/skeleton-react/src/app/globals.css b/playgrounds/skeleton-react/src/app/globals.css new file mode 100644 index 0000000000..00e250ad6c --- /dev/null +++ b/playgrounds/skeleton-react/src/app/globals.css @@ -0,0 +1,13 @@ +@import 'tailwindcss'; +@import '@skeletonlabs/skeleton'; +@import '@skeletonlabs/skeleton/themes/cerberus'; +@import '@skeletonlabs/skeleton-react'; + +@plugin '@tailwindcss/forms'; + +@custom-variant dark (&:where([data-mode="dark"], [data-mode="dark"] *)); + +html, +body { + @apply h-full overflow-hidden; +} diff --git a/playgrounds/skeleton-react/src/app/layout.tsx b/playgrounds/skeleton-react/src/app/layout.tsx new file mode 100644 index 0000000000..3a6935981d --- /dev/null +++ b/playgrounds/skeleton-react/src/app/layout.tsx @@ -0,0 +1,50 @@ +import './globals.css'; +import LightSwitch from './light-switch'; +import { globSync } from 'node:fs'; +import { sep, relative, dirname } from 'node:path'; + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + function capitalize(str: string) { + return str.charAt(0).toUpperCase() + str.slice(1); + } + + const components = globSync('./**/components/*/page.tsx') + .toSorted((a, b) => a.localeCompare(b)) + .map((route) => { + const href = '/' + relative('src/app', dirname(route)).split(sep).join('/'); + const name = href.split('/').pop()!.split('-').map(capitalize).join(' '); + return { href, name }; + }); + return ( + <html lang="en" data-theme="cerberus" suppressHydrationWarning> + <body> + <div className="grid h-screen grid-cols-[320px_minmax(0,_1fr)]"> + <div className="bg-surface-100-900 p-8 flex flex-col gap-8"> + <header className="flex justify-between items-center"> + <a className="inline-block text-sm bg-blue-500 p-2 font-mono font-bold text-white" href="/"> + skeleton-react + </a> + <LightSwitch /> + </header> + <hr className="hr" /> + <div className="flex flex-col gap-4"> + <div className="font-bold">Components</div> + <nav className="text-sm flex flex-col gap-1"> + {components.map((component) => ( + <a key={component.href} className="anchor" href={component.href}> + {component.name} + </a> + ))} + </nav> + </div> + </div> + <main className="overflow-y-auto p-8">{children}</main> + </div> + </body> + </html> + ); +} diff --git a/playgrounds/skeleton-react/src/app/light-switch.tsx b/playgrounds/skeleton-react/src/app/light-switch.tsx new file mode 100644 index 0000000000..6eb62ea27e --- /dev/null +++ b/playgrounds/skeleton-react/src/app/light-switch.tsx @@ -0,0 +1,46 @@ +'use client'; + +import { Switch } from '@skeletonlabs/skeleton-react'; +import { Moon, Sun } from 'lucide-react'; +import { useEffect, useState } from 'react'; + +export default function LightSwitch() { + const [checked, setChecked] = useState(false); + + useEffect(() => { + const mode = localStorage.getItem('mode') || 'light'; + setChecked(mode === 'dark'); + }, []); + + const onCheckedChange = (event: { checked: boolean }) => { + const mode = event.checked ? 'dark' : 'light'; + document.documentElement.setAttribute('data-mode', mode); + localStorage.setItem('mode', mode); + setChecked(event.checked); + }; + + return ( + <> + <script + dangerouslySetInnerHTML={{ + __html: ` + const mode = localStorage.getItem('mode') || 'light'; + document.documentElement.setAttribute('data-mode', mode); + `, + }} + /> + <Switch checked={checked} onCheckedChange={onCheckedChange}> + <Switch.Control> + <Switch.Thumb> + <Switch.Context> + {(switch_) => + switch_.checked ? <Sun className="size-4 stroke-surface-50-950" /> : <Moon className="size-4 stroke-surface-950-50" /> + } + </Switch.Context> + </Switch.Thumb> + </Switch.Control> + <Switch.HiddenInput /> + </Switch> + </> + ); +} diff --git a/playgrounds/skeleton-react/src/app/page.tsx b/playgrounds/skeleton-react/src/app/page.tsx new file mode 100644 index 0000000000..40a8b2ccad --- /dev/null +++ b/playgrounds/skeleton-react/src/app/page.tsx @@ -0,0 +1,11 @@ +export default function Page() { + return ( + <div className="flex h-full w-full items-center justify-center"> + <div className="max-w-[600px] text-balance text-center"> + <p> + This is a sandbox for <code className="code">@skeletonlabs/skeleton-react</code>. Select a feature from the list to preview. + </p> + </div> + </div> + ); +} diff --git a/playgrounds/skeleton-react/tsconfig.json b/playgrounds/skeleton-react/tsconfig.json new file mode 100644 index 0000000000..0e4da271dd --- /dev/null +++ b/playgrounds/skeleton-react/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "target": "ES2017", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./src/*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts", "src/app/components/progress-ring"], + "exclude": ["node_modules"] +} diff --git a/.npmrc b/playgrounds/skeleton-svelte/.npmrc similarity index 100% rename from .npmrc rename to playgrounds/skeleton-svelte/.npmrc diff --git a/playgrounds/skeleton-svelte/package.json b/playgrounds/skeleton-svelte/package.json new file mode 100644 index 0000000000..54b529804b --- /dev/null +++ b/playgrounds/skeleton-svelte/package.json @@ -0,0 +1,25 @@ +{ + "name": "@skeletonlabs/playground-skeleton-svelte", + "version": "0.0.1", + "private": true, + "scripts": { + "dev": "vite dev", + "build": "vite build" + }, + "devDependencies": { + "@lucide/svelte": "catalog:", + "@skeletonlabs/skeleton": "workspace:*", + "@skeletonlabs/skeleton-svelte": "workspace:*", + "@sveltejs/adapter-auto": "catalog:", + "@sveltejs/kit": "catalog:", + "@sveltejs/vite-plugin-svelte": "catalog:", + "@tailwindcss/forms": "catalog:", + "@tailwindcss/vite": "catalog:", + "svelte": "catalog:", + "svelte-check": "catalog:", + "tailwindcss": "catalog:", + "typescript": "catalog:", + "vite": "catalog:" + }, + "type": "module" +} diff --git a/playgrounds/skeleton-svelte/src/app.css b/playgrounds/skeleton-svelte/src/app.css new file mode 100644 index 0000000000..c6d06f585d --- /dev/null +++ b/playgrounds/skeleton-svelte/src/app.css @@ -0,0 +1,13 @@ +@import 'tailwindcss'; +@import '@skeletonlabs/skeleton'; +@import '@skeletonlabs/skeleton/themes/cerberus'; +@import '@skeletonlabs/skeleton-svelte'; + +@plugin "@tailwindcss/forms"; + +@custom-variant dark (&:where([data-mode="dark"], [data-mode="dark"] *)); + +html, +body { + @apply h-full overflow-hidden; +} diff --git a/playgrounds/skeleton-svelte/src/app.d.ts b/playgrounds/skeleton-svelte/src/app.d.ts new file mode 100644 index 0000000000..743f07b2e5 --- /dev/null +++ b/playgrounds/skeleton-svelte/src/app.d.ts @@ -0,0 +1,13 @@ +// See https://kit.svelte.dev/docs/types#app +// for information about these interfaces +declare global { + namespace App { + // interface Error {} + // interface Locals {} + // interface PageData {} + // interface PageState {} + // interface Platform {} + } +} + +export {}; diff --git a/playgrounds/skeleton-svelte/src/app.html b/playgrounds/skeleton-svelte/src/app.html new file mode 100644 index 0000000000..b1014ddfbd --- /dev/null +++ b/playgrounds/skeleton-svelte/src/app.html @@ -0,0 +1,14 @@ +<!doctype html> +<html lang="en" data-theme="cerberus" data-mode="dark"> + <head> + <meta charset="utf-8" /> + <title>skeleton-svelte + + + %sveltekit.head% + + + +
%sveltekit.body%
+ + diff --git a/playgrounds/skeleton-svelte/src/routes/+layout.server.ts b/playgrounds/skeleton-svelte/src/routes/+layout.server.ts new file mode 100644 index 0000000000..f2000b50b8 --- /dev/null +++ b/playgrounds/skeleton-svelte/src/routes/+layout.server.ts @@ -0,0 +1,20 @@ +import { globSync } from 'node:fs'; +import { dirname, relative, sep } from 'node:path'; + +function capitalize(str: string) { + return str.charAt(0).toUpperCase() + str.slice(1); +} + +const components = globSync('./**/components/*/+page.svelte') + .toSorted((a, b) => a.localeCompare(b)) + .map((route) => { + const href = '/' + relative('src/routes', dirname(route)).split(sep).join('/'); + const name = href.split('/').pop()!.split('-').map(capitalize).join(' '); + return { href, name }; + }); + +export function load() { + return { + components, + }; +} diff --git a/playgrounds/skeleton-svelte/src/routes/+layout.svelte b/playgrounds/skeleton-svelte/src/routes/+layout.svelte new file mode 100644 index 0000000000..002c14b89f --- /dev/null +++ b/playgrounds/skeleton-svelte/src/routes/+layout.svelte @@ -0,0 +1,28 @@ + + +
+
+
+ skeleton-svelte + +
+
+
+
Components
+ +
+
+
+ {@render children?.()} +
+
diff --git a/playgrounds/skeleton-svelte/src/routes/+page.svelte b/playgrounds/skeleton-svelte/src/routes/+page.svelte new file mode 100644 index 0000000000..7867169c33 --- /dev/null +++ b/playgrounds/skeleton-svelte/src/routes/+page.svelte @@ -0,0 +1,7 @@ +
+
+

+ This is a sandbox for @skeletonlabs/skeleton-svelte. Select a feature from the list to preview. +

+
+
diff --git a/playgrounds/skeleton-svelte/src/routes/components/accordion/+page.svelte b/playgrounds/skeleton-svelte/src/routes/components/accordion/+page.svelte new file mode 100644 index 0000000000..a7b2c38527 --- /dev/null +++ b/playgrounds/skeleton-svelte/src/routes/components/accordion/+page.svelte @@ -0,0 +1,24 @@ + + + + + + Item 1 + + Content 1 + + + + Item 2 + + Content 2 + + + + Item 3 + + Content 3 + + diff --git a/playgrounds/skeleton-svelte/src/routes/components/app-bar/+page.svelte b/playgrounds/skeleton-svelte/src/routes/components/app-bar/+page.svelte new file mode 100644 index 0000000000..c715658d35 --- /dev/null +++ b/playgrounds/skeleton-svelte/src/routes/components/app-bar/+page.svelte @@ -0,0 +1,66 @@ + + +
+
+

App Bar

+
+
+ + + + + + +

Headline

+
+ + + + + +
+
+
+
+

Centered

+ + + + + + +

Headline

+
+ + + + + +
+
+
+
+

Extended

+ + + + + + + + + + + + +

Headline

+
+
+
+
diff --git a/playgrounds/skeleton-svelte/src/routes/components/avatar/+page.svelte b/playgrounds/skeleton-svelte/src/routes/components/avatar/+page.svelte new file mode 100644 index 0000000000..6c47222acf --- /dev/null +++ b/playgrounds/skeleton-svelte/src/routes/components/avatar/+page.svelte @@ -0,0 +1,8 @@ + + + + + SK + diff --git a/playgrounds/skeleton-svelte/src/routes/components/combobox/+page.svelte b/playgrounds/skeleton-svelte/src/routes/components/combobox/+page.svelte new file mode 100644 index 0000000000..e11f21a313 --- /dev/null +++ b/playgrounds/skeleton-svelte/src/routes/components/combobox/+page.svelte @@ -0,0 +1,81 @@ + + + + Label + + + + + + + + {#each collection.group() as [type, items] (type)} + + {type} + {#each items as item (item.value)} + + {item.label} + + + {/each} + + {/each} + + + + diff --git a/playgrounds/skeleton-svelte/src/routes/components/dialog/+page.svelte b/playgrounds/skeleton-svelte/src/routes/components/dialog/+page.svelte new file mode 100644 index 0000000000..10af9ee741 --- /dev/null +++ b/playgrounds/skeleton-svelte/src/routes/components/dialog/+page.svelte @@ -0,0 +1,17 @@ + + + + Trigger + + + + + Hello World + This is an example of a basic dialog. + Close + + + + diff --git a/playgrounds/skeleton-svelte/src/routes/components/file-upload/+page.svelte b/playgrounds/skeleton-svelte/src/routes/components/file-upload/+page.svelte new file mode 100644 index 0000000000..279768fdff --- /dev/null +++ b/playgrounds/skeleton-svelte/src/routes/components/file-upload/+page.svelte @@ -0,0 +1,29 @@ + + + + +
Select file or drag here.
+ Browse Files + +
+ + + {#snippet children(fileUpload)} + {#each fileUpload().acceptedFiles as file (file.name)} + + {file.name} + {file.size} bytes + + + {/each} + {/snippet} + + +
+ + diff --git a/playgrounds/skeleton-svelte/src/routes/components/popover/+page.svelte b/playgrounds/skeleton-svelte/src/routes/components/popover/+page.svelte new file mode 100644 index 0000000000..cf47c6d431 --- /dev/null +++ b/playgrounds/skeleton-svelte/src/routes/components/popover/+page.svelte @@ -0,0 +1,22 @@ + + + + Trigger + + + + Title + + Lorem ipsum dolor, sit amet consectetur adipisicing elit. Sapiente magni distinctio explicabo quisquam. Rerum impedit culpa + nesciunt enim. + + Close + + + + + + + diff --git a/playgrounds/skeleton-svelte/src/routes/components/progress-linear/+page.svelte b/playgrounds/skeleton-svelte/src/routes/components/progress-linear/+page.svelte new file mode 100644 index 0000000000..903c055345 --- /dev/null +++ b/playgrounds/skeleton-svelte/src/routes/components/progress-linear/+page.svelte @@ -0,0 +1,88 @@ + + +
+
+

Progress Linear

+
+
+ + + + + +
+
+

Colors

+ + + + + + + + + + + + + + + +
+
+

Height

+ + + + + + + + + + + + + + + +
+
+

Orientation

+
+ + {value}% + + + + + + null + + + + +
+
+
+

Labeled

+ + {value}% + + + + +
+
+

Indeterminate

+ + + + + +
+
diff --git a/playgrounds/skeleton-svelte/src/routes/components/rating-group/+page.svelte b/playgrounds/skeleton-svelte/src/routes/components/rating-group/+page.svelte new file mode 100644 index 0000000000..c1918ae1a8 --- /dev/null +++ b/playgrounds/skeleton-svelte/src/routes/components/rating-group/+page.svelte @@ -0,0 +1,16 @@ + + + + + + {#snippet children(ratingGroup)} + {#each ratingGroup().items as index (index)} + + {/each} + {/snippet} + + + + diff --git a/playgrounds/skeleton-svelte/src/routes/components/segmented-control/+page.svelte b/playgrounds/skeleton-svelte/src/routes/components/segmented-control/+page.svelte new file mode 100644 index 0000000000..7713f614a2 --- /dev/null +++ b/playgrounds/skeleton-svelte/src/routes/components/segmented-control/+page.svelte @@ -0,0 +1,19 @@ + + + + + + Item 1 + + + + Item 2 + + + + Item 3 + + + diff --git a/playgrounds/skeleton-svelte/src/routes/components/slider/+page.svelte b/playgrounds/skeleton-svelte/src/routes/components/slider/+page.svelte new file mode 100644 index 0000000000..da8512bc95 --- /dev/null +++ b/playgrounds/skeleton-svelte/src/routes/components/slider/+page.svelte @@ -0,0 +1,28 @@ + + +
+

Above

+ + + Label + + + + + + + + + + + + + + + + + +

Below

+
diff --git a/playgrounds/skeleton-svelte/src/routes/components/switch/+page.svelte b/playgrounds/skeleton-svelte/src/routes/components/switch/+page.svelte new file mode 100644 index 0000000000..2f5c46d5a4 --- /dev/null +++ b/playgrounds/skeleton-svelte/src/routes/components/switch/+page.svelte @@ -0,0 +1,11 @@ + + + + Label + + + + + diff --git a/playgrounds/skeleton-svelte/src/routes/components/tabs/+page.svelte b/playgrounds/skeleton-svelte/src/routes/components/tabs/+page.svelte new file mode 100644 index 0000000000..cac9d7b366 --- /dev/null +++ b/playgrounds/skeleton-svelte/src/routes/components/tabs/+page.svelte @@ -0,0 +1,15 @@ + + + + + Tab 1 + Tab 2 + Tab 3 + + + Content for Tab 1 + Content for Tab 2 + Content for Tab 3 + diff --git a/playgrounds/skeleton-svelte/src/routes/components/tags-input/+page.svelte b/playgrounds/skeleton-svelte/src/routes/components/tags-input/+page.svelte new file mode 100644 index 0000000000..031b4bd8ae --- /dev/null +++ b/playgrounds/skeleton-svelte/src/routes/components/tags-input/+page.svelte @@ -0,0 +1,25 @@ + + + + Label + + + {#snippet children(tagsInput)} + {#each tagsInput().value as value, index (index)} + + + {value} + + + + + {/each} + {/snippet} + + + + Clear All + + diff --git a/playgrounds/skeleton-svelte/src/routes/components/toast/+page.svelte b/playgrounds/skeleton-svelte/src/routes/components/toast/+page.svelte new file mode 100644 index 0000000000..25d0e32142 --- /dev/null +++ b/playgrounds/skeleton-svelte/src/routes/components/toast/+page.svelte @@ -0,0 +1,33 @@ + + + + + + {#snippet children(toast)} + + + {toast.title} + {toast.description} + + {#if toast.action} + {toast.action.label} + {/if} + + + {/snippet} + diff --git a/playgrounds/skeleton-svelte/src/routes/components/tooltip/+page.svelte b/playgrounds/skeleton-svelte/src/routes/components/tooltip/+page.svelte new file mode 100644 index 0000000000..324215cbd2 --- /dev/null +++ b/playgrounds/skeleton-svelte/src/routes/components/tooltip/+page.svelte @@ -0,0 +1,17 @@ + + + + Trigger + + + + Content + + + + + + + diff --git a/playgrounds/skeleton-svelte/src/routes/light-switch.svelte b/playgrounds/skeleton-svelte/src/routes/light-switch.svelte new file mode 100644 index 0000000000..13fcceef74 --- /dev/null +++ b/playgrounds/skeleton-svelte/src/routes/light-switch.svelte @@ -0,0 +1,44 @@ + + + + + + + + + + + {#snippet children(switch_)} + {#if switch_().checked} + + {:else} + + {/if} + {/snippet} + + + + + diff --git a/playgrounds/skeleton-svelte/static/favicon.png b/playgrounds/skeleton-svelte/static/favicon.png new file mode 100644 index 0000000000..825b9e65af Binary files /dev/null and b/playgrounds/skeleton-svelte/static/favicon.png differ diff --git a/playgrounds/skeleton-svelte/svelte.config.js b/playgrounds/skeleton-svelte/svelte.config.js new file mode 100644 index 0000000000..c8b303bb68 --- /dev/null +++ b/playgrounds/skeleton-svelte/svelte.config.js @@ -0,0 +1,12 @@ +import adapter from '@sveltejs/adapter-auto'; +import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; + +/** @type {import('@sveltejs/kit').Config} */ +const config = { + preprocess: vitePreprocess(), + kit: { + adapter: adapter(), + }, +}; + +export default config; diff --git a/playgrounds/skeleton-svelte/tsconfig.json b/playgrounds/skeleton-svelte/tsconfig.json new file mode 100644 index 0000000000..a8f10c8e39 --- /dev/null +++ b/playgrounds/skeleton-svelte/tsconfig.json @@ -0,0 +1,14 @@ +{ + "extends": "./.svelte-kit/tsconfig.json", + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": true, + "strict": true, + "moduleResolution": "bundler" + } +} diff --git a/playgrounds/skeleton-svelte/vite.config.ts b/playgrounds/skeleton-svelte/vite.config.ts new file mode 100644 index 0000000000..da1f9251ee --- /dev/null +++ b/playgrounds/skeleton-svelte/vite.config.ts @@ -0,0 +1,7 @@ +import { sveltekit } from '@sveltejs/kit/vite'; +import tailwindcss from '@tailwindcss/vite'; +import { defineConfig } from 'vite'; + +export default defineConfig({ + plugins: [tailwindcss(), sveltekit()], +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000000..cb9d5ef0ab --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,12083 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +catalogs: + default: + '@astrojs/check': + specifier: 0.9.4 + version: 0.9.4 + '@astrojs/mdx': + specifier: 4.3.4 + version: 4.3.4 + '@astrojs/partytown': + specifier: 2.1.4 + version: 2.1.4 + '@astrojs/react': + specifier: 4.3.0 + version: 4.3.0 + '@astrojs/svelte': + specifier: 7.1.0 + version: 7.1.0 + '@atproto/api': + specifier: 0.16.6 + version: 0.16.6 + '@changesets/cli': + specifier: 2.29.7 + version: 2.29.7 + '@clack/prompts': + specifier: 0.11.0 + version: 0.11.0 + '@floating-ui/react': + specifier: 0.27.16 + version: 0.27.16 + '@lucide/svelte': + specifier: 0.542.0 + version: 0.542.0 + '@nanostores/persistent': + specifier: 1.1.0 + version: 1.1.0 + '@sveltejs/adapter-auto': + specifier: 6.1.0 + version: 6.1.0 + '@sveltejs/adapter-vercel': + specifier: 5.10.2 + version: 5.10.2 + '@sveltejs/kit': + specifier: 2.37.0 + version: 2.37.0 + '@sveltejs/package': + specifier: 2.5.0 + version: 2.5.0 + '@sveltejs/vite-plugin-svelte': + specifier: 6.1.3 + version: 6.1.3 + '@svitejs/changesets-changelog-github.amrom.workers.devpact': + specifier: 1.2.0 + version: 1.2.0 + '@tailwindcss/forms': + specifier: 0.5.10 + version: 0.5.10 + '@tailwindcss/postcss': + specifier: 4.1.12 + version: 4.1.12 + '@tailwindcss/vite': + specifier: 4.1.12 + version: 4.1.12 + '@testing-library/jest-dom': + specifier: 6.8.0 + version: 6.8.0 + '@testing-library/react': + specifier: 16.3.0 + version: 16.3.0 + '@testing-library/svelte': + specifier: 5.2.8 + version: 5.2.8 + '@trivago/prettier-plugin-sort-imports': + specifier: 5.2.2 + version: 5.2.2 + '@types/chroma-js': + specifier: 3.1.1 + version: 3.1.1 + '@types/estree': + specifier: 1.0.8 + version: 1.0.8 + '@types/node': + specifier: 24.4.0 + version: 24.4.0 + '@types/react': + specifier: 19.1.12 + version: 19.1.12 + '@types/react-dom': + specifier: 19.1.9 + version: 19.1.9 + '@types/semver': + specifier: 7.7.0 + version: 7.7.0 + '@vitejs/plugin-react': + specifier: 5.0.2 + version: 5.0.2 + '@zag-js/accordion': + specifier: 1.24.2 + version: 1.24.2 + '@zag-js/avatar': + specifier: 1.24.2 + version: 1.24.2 + '@zag-js/collection': + specifier: 1.24.2 + version: 1.24.2 + '@zag-js/combobox': + specifier: 1.24.2 + version: 1.24.2 + '@zag-js/dialog': + specifier: 1.24.2 + version: 1.24.2 + '@zag-js/file-upload': + specifier: 1.24.2 + version: 1.24.2 + '@zag-js/popover': + specifier: 1.24.2 + version: 1.24.2 + '@zag-js/progress': + specifier: 1.24.2 + version: 1.24.2 + '@zag-js/radio-group': + specifier: 1.24.2 + version: 1.24.2 + '@zag-js/rating-group': + specifier: 1.24.2 + version: 1.24.2 + '@zag-js/react': + specifier: 1.24.2 + version: 1.24.2 + '@zag-js/slider': + specifier: 1.24.2 + version: 1.24.2 + '@zag-js/svelte': + specifier: 1.24.2 + version: 1.24.2 + '@zag-js/switch': + specifier: 1.24.2 + version: 1.24.2 + '@zag-js/tabs': + specifier: 1.24.2 + version: 1.24.2 + '@zag-js/tags-input': + specifier: 1.24.2 + version: 1.24.2 + '@zag-js/toast': + specifier: 1.24.2 + version: 1.24.2 + '@zag-js/tooltip': + specifier: 1.24.2 + version: 1.24.2 + astro: + specifier: 5.13.5 + version: 5.13.5 + astro-auto-import: + specifier: 0.4.4 + version: 0.4.4 + astro-expressive-code: + specifier: 0.41.3 + version: 0.41.3 + astro-icon: + specifier: 1.1.5 + version: 1.1.5 + autoprefixer: + specifier: 10.4.21 + version: 10.4.21 + chroma-js: + specifier: 3.1.2 + version: 3.1.2 + colorette: + specifier: 2.0.20 + version: 2.0.20 + commander: + specifier: 14.0.0 + version: 14.0.0 + detect-indent: + specifier: 7.0.1 + version: 7.0.1 + fuse.js: + specifier: 7.1.0 + version: 7.1.0 + jsdom: + specifier: 26.1.0 + version: 26.1.0 + latest-version: + specifier: 9.0.0 + version: 9.0.0 + lucide-react: + specifier: 0.542.0 + version: 0.542.0 + magic-string: + specifier: 0.30.18 + version: 0.30.18 + nanoid: + specifier: 5.1.5 + version: 5.1.5 + nanostores: + specifier: 1.0.1 + version: 1.0.1 + next: + specifier: 15.5.2 + version: 15.5.2 + node-html-parser: + specifier: 7.0.1 + version: 7.0.1 + octokit: + specifier: 5.0.3 + version: 5.0.3 + oxlint: + specifier: 1.15.0 + version: 1.15.0 + oxlint-tsgolint: + specifier: 0.2.0 + version: 0.2.0 + package-manager-detector: + specifier: 1.3.0 + version: 1.3.0 + pagefind: + specifier: 1.3.0 + version: 1.3.0 + postcss: + specifier: 8.5.6 + version: 8.5.6 + prettier: + specifier: 3.6.2 + version: 3.6.2 + prettier-plugin-astro: + specifier: 0.14.1 + version: 0.14.1 + prettier-plugin-svelte: + specifier: 3.4.0 + version: 3.4.0 + prettier-plugin-tailwindcss: + specifier: 0.6.14 + version: 0.6.14 + publint: + specifier: 0.3.12 + version: 0.3.12 + react: + specifier: 19.1.1 + version: 19.1.1 + react-dom: + specifier: 19.1.1 + version: 19.1.1 + react-hot-toast: + specifier: 2.6.0 + version: 2.6.0 + sass-embedded: + specifier: 1.91.0 + version: 1.91.0 + semver: + specifier: 7.7.2 + version: 7.7.2 + sharp: + specifier: 0.34.3 + version: 0.34.3 + shiki: + specifier: 3.12.0 + version: 3.12.0 + svelte: + specifier: 5.38.6 + version: 5.38.6 + svelte-check: + specifier: 4.3.1 + version: 4.3.1 + tailwindcss: + specifier: 4.1.12 + version: 4.1.12 + tinyglobby: + specifier: 0.2.14 + version: 0.2.14 + ts-morph: + specifier: 26.0.0 + version: 26.0.0 + tsdown: + specifier: 0.14.2 + version: 0.14.2 + tslib: + specifier: 2.8.1 + version: 2.8.1 + tsx: + specifier: 4.20.5 + version: 4.20.5 + type-fest: + specifier: 4.41.0 + version: 4.41.0 + typescript: + specifier: 5.9.2 + version: 5.9.2 + unplugin-macros: + specifier: 0.18.1 + version: 0.18.1 + unplugin-raw: + specifier: 0.6.1 + version: 0.6.1 + vite: + specifier: 7.1.3 + version: 7.1.3 + vite-plugin-pagefind: + specifier: 1.0.7 + version: 1.0.7 + vitest: + specifier: 3.2.4 + version: 3.2.4 + zimmerframe: + specifier: 1.1.2 + version: 1.1.2 + +importers: + .: + devDependencies: + '@changesets/cli': + specifier: 'catalog:' + version: 2.29.7(@types/node@24.5.0) + '@svitejs/changesets-changelog-github.amrom.workers.devpact': + specifier: 'catalog:' + version: 1.2.0 + '@trivago/prettier-plugin-sort-imports': + specifier: 'catalog:' + version: 5.2.2(prettier-plugin-svelte@3.4.0(prettier@3.6.2)(svelte@5.38.6))(prettier@3.6.2)(svelte@5.38.6) + oxlint: + specifier: 'catalog:' + version: 1.15.0(oxlint-tsgolint@0.2.0) + oxlint-tsgolint: + specifier: 'catalog:' + version: 0.2.0 + prettier: + specifier: 'catalog:' + version: 3.6.2 + prettier-plugin-astro: + specifier: 'catalog:' + version: 0.14.1 + prettier-plugin-svelte: + specifier: 'catalog:' + version: 3.4.0(prettier@3.6.2)(svelte@5.38.6) + prettier-plugin-tailwindcss: + specifier: 'catalog:' + version: 0.6.14(@trivago/prettier-plugin-sort-imports@5.2.2(prettier-plugin-svelte@3.4.0(prettier@3.6.2)(svelte@5.38.6))(prettier@3.6.2)(svelte@5.38.6))(prettier-plugin-astro@0.14.1)(prettier-plugin-svelte@3.4.0(prettier@3.6.2)(svelte@5.38.6))(prettier@3.6.2) + + packages/cli: + dependencies: + '@clack/prompts': + specifier: 'catalog:' + version: 0.11.0 + colorette: + specifier: 'catalog:' + version: 2.0.20 + commander: + specifier: 'catalog:' + version: 14.0.0 + detect-indent: + specifier: 'catalog:' + version: 7.0.1 + latest-version: + specifier: 'catalog:' + version: 9.0.0 + magic-string: + specifier: 'catalog:' + version: 0.30.18 + nanoid: + specifier: 'catalog:' + version: 5.1.5 + node-html-parser: + specifier: 'catalog:' + version: 7.0.1 + package-manager-detector: + specifier: 'catalog:' + version: 1.3.0 + postcss: + specifier: 'catalog:' + version: 8.5.6 + semver: + specifier: 'catalog:' + version: 7.7.2 + svelte: + specifier: 'catalog:' + version: 5.38.6 + tinyglobby: + specifier: 'catalog:' + version: 0.2.14 + ts-morph: + specifier: 'catalog:' + version: 26.0.0 + zimmerframe: + specifier: 'catalog:' + version: 1.1.2 + devDependencies: + '@types/estree': + specifier: 'catalog:' + version: 1.0.8 + '@types/node': + specifier: 'catalog:' + version: 24.4.0 + '@types/semver': + specifier: 'catalog:' + version: 7.7.0 + tsdown: + specifier: 'catalog:' + version: 0.14.2(publint@0.3.12)(typescript@5.9.2) + type-fest: + specifier: 'catalog:' + version: 4.41.0 + typescript: + specifier: 'catalog:' + version: 5.9.2 + vite: + specifier: 'catalog:' + version: 7.1.3(@types/node@24.4.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1) + vitest: + specifier: 'catalog:' + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.4.0)(jiti@2.5.1)(jsdom@26.1.0)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1) + + packages/skeleton: + dependencies: + tailwindcss: + specifier: ^4.0.0 + version: 4.1.13 + devDependencies: + sass-embedded: + specifier: 'catalog:' + version: 1.91.0 + tinyglobby: + specifier: 'catalog:' + version: 0.2.14 + vite: + specifier: 'catalog:' + version: 7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1) + + packages/skeleton-common: + devDependencies: + '@skeletonlabs/skeleton': + specifier: workspace:* + version: link:../skeleton + tsdown: + specifier: 'catalog:' + version: 0.14.2(publint@0.3.12)(typescript@5.9.2) + typescript: + specifier: 'catalog:' + version: 5.9.2 + unplugin-macros: + specifier: 'catalog:' + version: 0.18.1(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1) + unplugin-raw: + specifier: 'catalog:' + version: 0.6.1(esbuild@0.25.9) + + packages/skeleton-react: + dependencies: + '@skeletonlabs/skeleton-common': + specifier: workspace:* + version: link:../skeleton-common + '@zag-js/accordion': + specifier: 'catalog:' + version: 1.24.2 + '@zag-js/avatar': + specifier: 'catalog:' + version: 1.24.2 + '@zag-js/collection': + specifier: 'catalog:' + version: 1.24.2 + '@zag-js/combobox': + specifier: 'catalog:' + version: 1.24.2 + '@zag-js/dialog': + specifier: 'catalog:' + version: 1.24.2 + '@zag-js/file-upload': + specifier: 'catalog:' + version: 1.24.2 + '@zag-js/popover': + specifier: 'catalog:' + version: 1.24.2 + '@zag-js/progress': + specifier: 'catalog:' + version: 1.24.2 + '@zag-js/radio-group': + specifier: 'catalog:' + version: 1.24.2 + '@zag-js/rating-group': + specifier: 'catalog:' + version: 1.24.2 + '@zag-js/react': + specifier: 'catalog:' + version: 1.24.2(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@zag-js/slider': + specifier: 'catalog:' + version: 1.24.2 + '@zag-js/switch': + specifier: 'catalog:' + version: 1.24.2 + '@zag-js/tabs': + specifier: 'catalog:' + version: 1.24.2 + '@zag-js/tags-input': + specifier: 'catalog:' + version: 1.24.2 + '@zag-js/toast': + specifier: 'catalog:' + version: 1.24.2 + '@zag-js/tooltip': + specifier: 'catalog:' + version: 1.24.2 + devDependencies: + '@testing-library/jest-dom': + specifier: 'catalog:' + version: 6.8.0 + '@testing-library/react': + specifier: 'catalog:' + version: 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@types/react': + specifier: 'catalog:' + version: 19.1.12 + '@types/react-dom': + specifier: 'catalog:' + version: 19.1.9(@types/react@19.1.12) + '@vitejs/plugin-react': + specifier: 'catalog:' + version: 5.0.2(vite@7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1)) + jsdom: + specifier: 'catalog:' + version: 26.1.0 + react: + specifier: 'catalog:' + version: 19.1.1 + react-dom: + specifier: 'catalog:' + version: 19.1.1(react@19.1.1) + tsdown: + specifier: 'catalog:' + version: 0.14.2(publint@0.3.12)(typescript@5.9.2) + typescript: + specifier: 'catalog:' + version: 5.9.2 + vite: + specifier: 'catalog:' + version: 7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1) + vitest: + specifier: 'catalog:' + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.5.0)(jiti@2.5.1)(jsdom@26.1.0)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1) + + packages/skeleton-svelte: + dependencies: + '@skeletonlabs/skeleton-common': + specifier: workspace:* + version: link:../skeleton-common + '@zag-js/accordion': + specifier: 'catalog:' + version: 1.24.2 + '@zag-js/avatar': + specifier: 'catalog:' + version: 1.24.2 + '@zag-js/collection': + specifier: 'catalog:' + version: 1.24.2 + '@zag-js/combobox': + specifier: 'catalog:' + version: 1.24.2 + '@zag-js/dialog': + specifier: 'catalog:' + version: 1.24.2 + '@zag-js/file-upload': + specifier: 'catalog:' + version: 1.24.2 + '@zag-js/popover': + specifier: 'catalog:' + version: 1.24.2 + '@zag-js/progress': + specifier: 'catalog:' + version: 1.24.2 + '@zag-js/radio-group': + specifier: 'catalog:' + version: 1.24.2 + '@zag-js/rating-group': + specifier: 'catalog:' + version: 1.24.2 + '@zag-js/slider': + specifier: 'catalog:' + version: 1.24.2 + '@zag-js/svelte': + specifier: 'catalog:' + version: 1.24.2(svelte@5.38.6) + '@zag-js/switch': + specifier: 'catalog:' + version: 1.24.2 + '@zag-js/tabs': + specifier: 'catalog:' + version: 1.24.2 + '@zag-js/tags-input': + specifier: 'catalog:' + version: 1.24.2 + '@zag-js/toast': + specifier: 'catalog:' + version: 1.24.2 + '@zag-js/tooltip': + specifier: 'catalog:' + version: 1.24.2 + devDependencies: + '@skeletonlabs/skeleton': + specifier: workspace:* + version: link:../skeleton + '@sveltejs/kit': + specifier: 'catalog:' + version: 2.37.0(@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.6)(vite@7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1)))(svelte@5.38.6)(vite@7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1)) + '@sveltejs/package': + specifier: 'catalog:' + version: 2.5.0(svelte@5.38.6)(typescript@5.9.2) + '@sveltejs/vite-plugin-svelte': + specifier: 'catalog:' + version: 6.1.3(svelte@5.38.6)(vite@7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1)) + '@testing-library/jest-dom': + specifier: 'catalog:' + version: 6.8.0 + '@testing-library/svelte': + specifier: 'catalog:' + version: 5.2.8(svelte@5.38.6)(vite@7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.0)(jiti@2.5.1)(jsdom@26.1.0)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1)) + jsdom: + specifier: 'catalog:' + version: 26.1.0 + publint: + specifier: 'catalog:' + version: 0.3.12 + svelte: + specifier: 'catalog:' + version: 5.38.6 + svelte-check: + specifier: 'catalog:' + version: 4.3.1(picomatch@4.0.3)(svelte@5.38.6)(typescript@5.9.2) + tslib: + specifier: 'catalog:' + version: 2.8.1 + typescript: + specifier: 'catalog:' + version: 5.9.2 + vite: + specifier: 'catalog:' + version: 7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1) + vitest: + specifier: 'catalog:' + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.5.0)(jiti@2.5.1)(jsdom@26.1.0)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1) + + playgrounds/skeleton-react: + dependencies: + '@skeletonlabs/skeleton': + specifier: workspace:* + version: link:../../packages/skeleton + '@skeletonlabs/skeleton-react': + specifier: workspace:* + version: link:../../packages/skeleton-react + '@tailwindcss/forms': + specifier: 'catalog:' + version: 0.5.10(tailwindcss@4.1.12) + '@tailwindcss/postcss': + specifier: 'catalog:' + version: 4.1.12 + lucide-react: + specifier: 'catalog:' + version: 0.542.0(react@19.1.1) + next: + specifier: 'catalog:' + version: 15.5.2(@babel/core@7.28.4)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.91.0) + postcss: + specifier: 'catalog:' + version: 8.5.6 + react: + specifier: 'catalog:' + version: 19.1.1 + react-dom: + specifier: 'catalog:' + version: 19.1.1(react@19.1.1) + devDependencies: + '@types/node': + specifier: 'catalog:' + version: 24.4.0 + '@types/react': + specifier: 'catalog:' + version: 19.1.12 + '@types/react-dom': + specifier: 'catalog:' + version: 19.1.9(@types/react@19.1.12) + tailwindcss: + specifier: 'catalog:' + version: 4.1.12 + typescript: + specifier: 'catalog:' + version: 5.9.2 + + playgrounds/skeleton-svelte: + devDependencies: + '@lucide/svelte': + specifier: 'catalog:' + version: 0.542.0(svelte@5.38.6) + '@skeletonlabs/skeleton': + specifier: workspace:* + version: link:../../packages/skeleton + '@skeletonlabs/skeleton-svelte': + specifier: workspace:* + version: link:../../packages/skeleton-svelte + '@sveltejs/adapter-auto': + specifier: 'catalog:' + version: 6.1.0(@sveltejs/kit@2.37.0(@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.6)(vite@7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1)))(svelte@5.38.6)(vite@7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1))) + '@sveltejs/kit': + specifier: 'catalog:' + version: 2.37.0(@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.6)(vite@7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1)))(svelte@5.38.6)(vite@7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1)) + '@sveltejs/vite-plugin-svelte': + specifier: 'catalog:' + version: 6.1.3(svelte@5.38.6)(vite@7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1)) + '@tailwindcss/forms': + specifier: 'catalog:' + version: 0.5.10(tailwindcss@4.1.12) + '@tailwindcss/vite': + specifier: 'catalog:' + version: 4.1.12(vite@7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1)) + svelte: + specifier: 'catalog:' + version: 5.38.6 + svelte-check: + specifier: 'catalog:' + version: 4.3.1(picomatch@4.0.3)(svelte@5.38.6)(typescript@5.9.2) + tailwindcss: + specifier: 'catalog:' + version: 4.1.12 + typescript: + specifier: 'catalog:' + version: 5.9.2 + vite: + specifier: 'catalog:' + version: 7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1) + + sites/skeleton.dev: + dependencies: + '@astrojs/check': + specifier: 'catalog:' + version: 0.9.4(prettier-plugin-astro@0.14.1)(prettier@3.6.2)(typescript@5.9.2) + '@astrojs/mdx': + specifier: 'catalog:' + version: 4.3.4(astro@5.13.5(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(rollup@4.50.2)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(typescript@5.9.2)(yaml@2.8.1)) + '@astrojs/partytown': + specifier: 'catalog:' + version: 2.1.4 + '@astrojs/react': + specifier: 'catalog:' + version: 4.3.0(@types/node@24.5.0)(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(jiti@2.5.1)(lightningcss@1.30.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1) + '@astrojs/svelte': + specifier: 'catalog:' + version: 7.1.0(@types/node@24.5.0)(astro@5.13.5(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(rollup@4.50.2)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(typescript@5.9.2)(yaml@2.8.1))(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(svelte@5.38.6)(tsx@4.20.5)(typescript@5.9.2)(yaml@2.8.1) + '@atproto/api': + specifier: 'catalog:' + version: 0.16.6 + '@clack/prompts': + specifier: 'catalog:' + version: 0.11.0 + '@floating-ui/react': + specifier: 'catalog:' + version: 0.27.16(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@lucide/svelte': + specifier: 'catalog:' + version: 0.542.0(svelte@5.38.6) + '@nanostores/persistent': + specifier: 'catalog:' + version: 1.1.0(nanostores@1.0.1) + '@skeletonlabs/skeleton': + specifier: workspace:* + version: link:../../packages/skeleton + '@skeletonlabs/skeleton-common': + specifier: workspace:* + version: link:../../packages/skeleton-common + '@skeletonlabs/skeleton-react': + specifier: workspace:* + version: link:../../packages/skeleton-react + '@skeletonlabs/skeleton-svelte': + specifier: workspace:* + version: link:../../packages/skeleton-svelte + '@tailwindcss/forms': + specifier: 'catalog:' + version: 0.5.10(tailwindcss@4.1.12) + '@tailwindcss/vite': + specifier: 'catalog:' + version: 4.1.12(vite@7.1.5(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1)) + astro: + specifier: 'catalog:' + version: 5.13.5(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(rollup@4.50.2)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(typescript@5.9.2)(yaml@2.8.1) + astro-auto-import: + specifier: 'catalog:' + version: 0.4.4(astro@5.13.5(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(rollup@4.50.2)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(typescript@5.9.2)(yaml@2.8.1)) + astro-expressive-code: + specifier: 'catalog:' + version: 0.41.3(astro@5.13.5(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(rollup@4.50.2)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(typescript@5.9.2)(yaml@2.8.1)) + astro-icon: + specifier: 'catalog:' + version: 1.1.5 + fuse.js: + specifier: 'catalog:' + version: 7.1.0 + lucide-react: + specifier: 'catalog:' + version: 0.542.0(react@19.1.1) + nanostores: + specifier: 'catalog:' + version: 1.0.1 + octokit: + specifier: 'catalog:' + version: 5.0.3 + pagefind: + specifier: 'catalog:' + version: 1.3.0 + react: + specifier: 'catalog:' + version: 19.1.1 + react-dom: + specifier: 'catalog:' + version: 19.1.1(react@19.1.1) + react-hot-toast: + specifier: 'catalog:' + version: 2.6.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + sharp: + specifier: 'catalog:' + version: 0.34.3 + svelte: + specifier: 'catalog:' + version: 5.38.6 + svelte-check: + specifier: 'catalog:' + version: 4.3.1(picomatch@4.0.3)(svelte@5.38.6)(typescript@5.9.2) + tailwindcss: + specifier: 'catalog:' + version: 4.1.12 + typescript: + specifier: 'catalog:' + version: 5.9.2 + devDependencies: + '@types/react': + specifier: 'catalog:' + version: 19.1.12 + '@types/react-dom': + specifier: 'catalog:' + version: 19.1.9(@types/react@19.1.12) + colorette: + specifier: 'catalog:' + version: 2.0.20 + next: + specifier: 'catalog:' + version: 15.5.2(@babel/core@7.28.4)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.91.0) + tinyglobby: + specifier: 'catalog:' + version: 0.2.14 + ts-morph: + specifier: 'catalog:' + version: 26.0.0 + tsx: + specifier: 'catalog:' + version: 4.20.5 + vite-plugin-pagefind: + specifier: 'catalog:' + version: 1.0.7(vite@7.1.5(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1)) + + sites/themes.skeleton.dev: + devDependencies: + '@lucide/svelte': + specifier: 'catalog:' + version: 0.542.0(svelte@5.38.6) + '@skeletonlabs/skeleton': + specifier: workspace:* + version: link:../../packages/skeleton + '@skeletonlabs/skeleton-common': + specifier: workspace:* + version: link:../../packages/skeleton-common + '@skeletonlabs/skeleton-svelte': + specifier: workspace:* + version: link:../../packages/skeleton-svelte + '@sveltejs/adapter-vercel': + specifier: 'catalog:' + version: 5.10.2(@sveltejs/kit@2.37.0(@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.6)(vite@7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1)))(svelte@5.38.6)(vite@7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1)))(rollup@4.50.2) + '@sveltejs/kit': + specifier: 'catalog:' + version: 2.37.0(@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.6)(vite@7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1)))(svelte@5.38.6)(vite@7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1)) + '@sveltejs/vite-plugin-svelte': + specifier: 'catalog:' + version: 6.1.3(svelte@5.38.6)(vite@7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1)) + '@tailwindcss/forms': + specifier: 'catalog:' + version: 0.5.10(tailwindcss@4.1.12) + '@tailwindcss/vite': + specifier: 'catalog:' + version: 4.1.12(vite@7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1)) + '@types/chroma-js': + specifier: 'catalog:' + version: 3.1.1 + autoprefixer: + specifier: 'catalog:' + version: 10.4.21(postcss@8.5.6) + chroma-js: + specifier: 'catalog:' + version: 3.1.2 + shiki: + specifier: 'catalog:' + version: 3.12.0 + svelte: + specifier: 'catalog:' + version: 5.38.6 + svelte-check: + specifier: 'catalog:' + version: 4.3.1(picomatch@4.0.3)(svelte@5.38.6)(typescript@5.9.2) + tailwindcss: + specifier: 'catalog:' + version: 4.1.12 + typescript: + specifier: 'catalog:' + version: 5.9.2 + vite: + specifier: 'catalog:' + version: 7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1) + +packages: + '@adobe/css-tools@4.4.4': + resolution: { integrity: sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg== } + + '@alloc/quick-lru@5.2.0': + resolution: { integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== } + engines: { node: '>=10' } + + '@antfu/install-pkg@1.1.0': + resolution: { integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ== } + + '@antfu/utils@8.1.1': + resolution: { integrity: sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ== } + + '@asamuzakjp/css-color@3.2.0': + resolution: { integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw== } + + '@astrojs/check@0.9.4': + resolution: { integrity: sha512-IOheHwCtpUfvogHHsvu0AbeRZEnjJg3MopdLddkJE70mULItS/Vh37BHcI00mcOJcH1vhD3odbpvWokpxam7xA== } + hasBin: true + peerDependencies: + typescript: ^5.0.0 + + '@astrojs/compiler@2.13.0': + resolution: { integrity: sha512-mqVORhUJViA28fwHYaWmsXSzLO9osbdZ5ImUfxBarqsYdMlPbqAqGJCxsNzvppp1BEzc1mJNjOVvQqeDN8Vspw== } + + '@astrojs/internal-helpers@0.7.2': + resolution: { integrity: sha512-KCkCqR3Goym79soqEtbtLzJfqhTWMyVaizUi35FLzgGSzBotSw8DB1qwsu7U96ihOJgYhDk2nVPz+3LnXPeX6g== } + + '@astrojs/language-server@2.15.4': + resolution: { integrity: sha512-JivzASqTPR2bao9BWsSc/woPHH7OGSGc9aMxXL4U6egVTqBycB3ZHdBJPuOCVtcGLrzdWTosAqVPz1BVoxE0+A== } + hasBin: true + peerDependencies: + prettier: ^3.0.0 + prettier-plugin-astro: '>=0.11.0' + peerDependenciesMeta: + prettier: + optional: true + prettier-plugin-astro: + optional: true + + '@astrojs/markdown-remark@6.3.6': + resolution: { integrity: sha512-bwylYktCTsLMVoCOEHbn2GSUA3c5KT/qilekBKA3CBng0bo1TYjNZPr761vxumRk9kJGqTOtU+fgCAp5Vwokug== } + + '@astrojs/mdx@4.3.4': + resolution: { integrity: sha512-Ew3iP+6zuzzJWNEH5Qr1iknrue1heEfgmfuMpuwLaSwqlUiJQ0NDb2oxKosgWU1ROYmVf1H4KCmS6QdMWKyFjw== } + engines: { node: 18.20.8 || ^20.3.0 || >=22.0.0 } + peerDependencies: + astro: ^5.0.0 + + '@astrojs/partytown@2.1.4': + resolution: { integrity: sha512-loUrAu0cGYFDC6dHVRiomdsBJ41VjDYXPA+B3Br51V5hENFgDSOLju86OIj1TvBACcsB22UQV7BlppODDG5gig== } + + '@astrojs/prism@3.3.0': + resolution: { integrity: sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ== } + engines: { node: 18.20.8 || ^20.3.0 || >=22.0.0 } + + '@astrojs/react@4.3.0': + resolution: { integrity: sha512-N02aj52Iezn69qHyx5+XvPqgsPMEnel9mI5JMbGiRMTzzLMuNaxRVoQTaq2024Dpr7BLsxCjqMkNvelqMDhaHA== } + engines: { node: 18.20.8 || ^20.3.0 || >=22.0.0 } + peerDependencies: + '@types/react': ^17.0.50 || ^18.0.21 || ^19.0.0 + '@types/react-dom': ^17.0.17 || ^18.0.6 || ^19.0.0 + react: ^17.0.2 || ^18.0.0 || ^19.0.0 + react-dom: ^17.0.2 || ^18.0.0 || ^19.0.0 + + '@astrojs/svelte@7.1.0': + resolution: { integrity: sha512-nNAO7iFgCZXCN31N4xBSS/k7vZAZxeZ/v8V6VWZOKG47gVlxeAJBHzn2GlXMMVkxIamr6dhrkDrhYFKIPzoGpw== } + engines: { node: 18.20.8 || ^20.3.0 || >=22.0.0 } + peerDependencies: + astro: ^5.0.0 + svelte: ^5.1.16 + typescript: ^5.3.3 + + '@astrojs/telemetry@3.3.0': + resolution: { integrity: sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ== } + engines: { node: 18.20.8 || ^20.3.0 || >=22.0.0 } + + '@astrojs/yaml2ts@0.2.2': + resolution: { integrity: sha512-GOfvSr5Nqy2z5XiwqTouBBpy5FyI6DEe+/g/Mk5am9SjILN1S5fOEvYK0GuWHg98yS/dobP4m8qyqw/URW35fQ== } + + '@atproto/api@0.16.6': + resolution: { integrity: sha512-/ZDWeHNAMmQFicyITAoGCxQujDU+wyzsWjpPnQfVa+ZKMfZEngipMFOr4fBwxHixEFLmuh58+5vJyylAFVrQ4g== } + + '@atproto/common-web@0.4.3': + resolution: { integrity: sha512-nRDINmSe4VycJzPo6fP/hEltBcULFxt9Kw7fQk6405FyAWZiTluYHlXOnU7GkQfeUK44OENG1qFTBcmCJ7e8pg== } + + '@atproto/lexicon@0.5.1': + resolution: { integrity: sha512-y8AEtYmfgVl4fqFxqXAeGvhesiGkxiy3CWoJIfsFDDdTlZUC8DFnZrYhcqkIop3OlCkkljvpSJi1hbeC1tbi8A== } + + '@atproto/syntax@0.4.1': + resolution: { integrity: sha512-CJdImtLAiFO+0z3BWTtxwk6aY5w4t8orHTMVJgkf++QRJWTxPbIFko/0hrkADB7n2EruDxDSeAgfUGehpH6ngw== } + + '@atproto/xrpc@0.7.5': + resolution: { integrity: sha512-MUYNn5d2hv8yVegRL0ccHvTHAVj5JSnW07bkbiaz96UH45lvYNRVwt44z+yYVnb0/mvBzyD3/ZQ55TRGt7fHkA== } + + '@babel/code-frame@7.27.1': + resolution: { integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== } + engines: { node: '>=6.9.0' } + + '@babel/compat-data@7.28.4': + resolution: { integrity: sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw== } + engines: { node: '>=6.9.0' } + + '@babel/core@7.28.4': + resolution: { integrity: sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA== } + engines: { node: '>=6.9.0' } + + '@babel/generator@7.28.3': + resolution: { integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw== } + engines: { node: '>=6.9.0' } + + '@babel/helper-compilation-targets@7.27.2': + resolution: { integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ== } + engines: { node: '>=6.9.0' } + + '@babel/helper-globals@7.28.0': + resolution: { integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw== } + engines: { node: '>=6.9.0' } + + '@babel/helper-module-imports@7.27.1': + resolution: { integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w== } + engines: { node: '>=6.9.0' } + + '@babel/helper-module-transforms@7.28.3': + resolution: { integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw== } + engines: { node: '>=6.9.0' } + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.27.1': + resolution: { integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw== } + engines: { node: '>=6.9.0' } + + '@babel/helper-string-parser@7.27.1': + resolution: { integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== } + engines: { node: '>=6.9.0' } + + '@babel/helper-validator-identifier@7.27.1': + resolution: { integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== } + engines: { node: '>=6.9.0' } + + '@babel/helper-validator-option@7.27.1': + resolution: { integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== } + engines: { node: '>=6.9.0' } + + '@babel/helpers@7.28.4': + resolution: { integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w== } + engines: { node: '>=6.9.0' } + + '@babel/parser@7.28.4': + resolution: { integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg== } + engines: { node: '>=6.0.0' } + hasBin: true + + '@babel/plugin-transform-react-jsx-self@7.27.1': + resolution: { integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw== } + engines: { node: '>=6.9.0' } + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.27.1': + resolution: { integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw== } + engines: { node: '>=6.9.0' } + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime@7.28.4': + resolution: { integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ== } + engines: { node: '>=6.9.0' } + + '@babel/template@7.27.2': + resolution: { integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw== } + engines: { node: '>=6.9.0' } + + '@babel/traverse@7.28.4': + resolution: { integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ== } + engines: { node: '>=6.9.0' } + + '@babel/types@7.28.4': + resolution: { integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q== } + engines: { node: '>=6.9.0' } + + '@bufbuild/protobuf@2.8.0': + resolution: { integrity: sha512-r1/0w5C9dkbcdjyxY8ZHsC5AOWg4Pnzhm2zu7LO4UHSounp2tMm6Y+oioV9zlGbLveE7YaWRDUk48WLxRDgoqg== } + + '@capsizecss/unpack@2.4.0': + resolution: { integrity: sha512-GrSU71meACqcmIUxPYOJvGKF0yryjN/L1aCuE9DViCTJI7bfkjgYDPD1zbNDcINJwSSP6UaBZY9GAbYDO7re0Q== } + + '@changesets/apply-release-plan@7.0.13': + resolution: { integrity: sha512-BIW7bofD2yAWoE8H4V40FikC+1nNFEKBisMECccS16W1rt6qqhNTBDmIw5HaqmMgtLNz9e7oiALiEUuKrQ4oHg== } + + '@changesets/assemble-release-plan@6.0.9': + resolution: { integrity: sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ== } + + '@changesets/changelog-git@0.2.1': + resolution: { integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q== } + + '@changesets/cli@2.29.7': + resolution: { integrity: sha512-R7RqWoaksyyKXbKXBTbT4REdy22yH81mcFK6sWtqSanxUCbUi9Uf+6aqxZtDQouIqPdem2W56CdxXgsxdq7FLQ== } + hasBin: true + + '@changesets/config@3.1.1': + resolution: { integrity: sha512-bd+3Ap2TKXxljCggI0mKPfzCQKeV/TU4yO2h2C6vAihIo8tzseAn2e7klSuiyYYXvgu53zMN1OeYMIQkaQoWnA== } + + '@changesets/errors@0.2.0': + resolution: { integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow== } + + '@changesets/get-dependents-graph@2.1.3': + resolution: { integrity: sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ== } + + '@changesets/get-github-info@0.6.0': + resolution: { integrity: sha512-v/TSnFVXI8vzX9/w3DU2Ol+UlTZcu3m0kXTjTT4KlAdwSvwutcByYwyYn9hwerPWfPkT2JfpoX0KgvCEi8Q/SA== } + + '@changesets/get-release-plan@4.0.13': + resolution: { integrity: sha512-DWG1pus72FcNeXkM12tx+xtExyH/c9I1z+2aXlObH3i9YA7+WZEVaiHzHl03thpvAgWTRaH64MpfHxozfF7Dvg== } + + '@changesets/get-version-range-type@0.4.0': + resolution: { integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ== } + + '@changesets/git@3.0.4': + resolution: { integrity: sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw== } + + '@changesets/logger@0.1.1': + resolution: { integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg== } + + '@changesets/parse@0.4.1': + resolution: { integrity: sha512-iwksMs5Bf/wUItfcg+OXrEpravm5rEd9Bf4oyIPL4kVTmJQ7PNDSd6MDYkpSJR1pn7tz/k8Zf2DhTCqX08Ou+Q== } + + '@changesets/pre@2.0.2': + resolution: { integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug== } + + '@changesets/read@0.6.5': + resolution: { integrity: sha512-UPzNGhsSjHD3Veb0xO/MwvasGe8eMyNrR/sT9gR8Q3DhOQZirgKhhXv/8hVsI0QpPjR004Z9iFxoJU6in3uGMg== } + + '@changesets/should-skip-package@0.1.2': + resolution: { integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw== } + + '@changesets/types@4.1.0': + resolution: { integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw== } + + '@changesets/types@6.1.0': + resolution: { integrity: sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA== } + + '@changesets/write@0.4.0': + resolution: { integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q== } + + '@clack/core@0.5.0': + resolution: { integrity: sha512-p3y0FIOwaYRUPRcMO7+dlmLh8PSRcrjuTndsiA0WAFbWES0mLZlrjVoBRZ9DzkPFJZG6KGkJmoEAY0ZcVWTkow== } + + '@clack/prompts@0.11.0': + resolution: { integrity: sha512-pMN5FcrEw9hUkZA4f+zLlzivQSeQf5dRGJjSUbvVYDLvpKCdQx5OaknvKzgbtXOizhP+SJJJjqEbOe55uKKfAw== } + + '@csstools/color-helpers@5.1.0': + resolution: { integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA== } + engines: { node: '>=18' } + + '@csstools/css-calc@2.1.4': + resolution: { integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ== } + engines: { node: '>=18' } + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-color-parser@3.1.0': + resolution: { integrity: sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA== } + engines: { node: '>=18' } + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-parser-algorithms@3.0.5': + resolution: { integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ== } + engines: { node: '>=18' } + peerDependencies: + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-tokenizer@3.0.4': + resolution: { integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw== } + engines: { node: '>=18' } + + '@ctrl/tinycolor@4.2.0': + resolution: { integrity: sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A== } + engines: { node: '>=14' } + + '@emmetio/abbreviation@2.3.3': + resolution: { integrity: sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA== } + + '@emmetio/css-abbreviation@2.1.8': + resolution: { integrity: sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw== } + + '@emmetio/css-parser@0.4.0': + resolution: { integrity: sha512-z7wkxRSZgrQHXVzObGkXG+Vmj3uRlpM11oCZ9pbaz0nFejvCDmAiNDpY75+wgXOcffKpj4rzGtwGaZxfJKsJxw== } + + '@emmetio/html-matcher@1.3.0': + resolution: { integrity: sha512-NTbsvppE5eVyBMuyGfVu2CRrLvo7J4YHb6t9sBFLyY03WYhXET37qA4zOYUjBWFCRHO7pS1B9khERtY0f5JXPQ== } + + '@emmetio/scanner@1.0.4': + resolution: { integrity: sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA== } + + '@emmetio/stream-reader-utils@0.1.0': + resolution: { integrity: sha512-ZsZ2I9Vzso3Ho/pjZFsmmZ++FWeEd/txqybHTm4OgaZzdS8V9V/YYWQwg5TC38Z7uLWUV1vavpLLbjJtKubR1A== } + + '@emmetio/stream-reader@2.2.0': + resolution: { integrity: sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw== } + + '@emnapi/core@1.5.0': + resolution: { integrity: sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg== } + + '@emnapi/runtime@1.5.0': + resolution: { integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ== } + + '@emnapi/wasi-threads@1.1.0': + resolution: { integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ== } + + '@esbuild/aix-ppc64@0.25.9': + resolution: { integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA== } + engines: { node: '>=18' } + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.9': + resolution: { integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg== } + engines: { node: '>=18' } + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.9': + resolution: { integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ== } + engines: { node: '>=18' } + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.9': + resolution: { integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw== } + engines: { node: '>=18' } + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.9': + resolution: { integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg== } + engines: { node: '>=18' } + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.9': + resolution: { integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ== } + engines: { node: '>=18' } + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.9': + resolution: { integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q== } + engines: { node: '>=18' } + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.9': + resolution: { integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg== } + engines: { node: '>=18' } + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.9': + resolution: { integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw== } + engines: { node: '>=18' } + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.9': + resolution: { integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw== } + engines: { node: '>=18' } + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.9': + resolution: { integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A== } + engines: { node: '>=18' } + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.9': + resolution: { integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ== } + engines: { node: '>=18' } + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.9': + resolution: { integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA== } + engines: { node: '>=18' } + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.9': + resolution: { integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w== } + engines: { node: '>=18' } + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.9': + resolution: { integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg== } + engines: { node: '>=18' } + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.9': + resolution: { integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA== } + engines: { node: '>=18' } + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.9': + resolution: { integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg== } + engines: { node: '>=18' } + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.9': + resolution: { integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q== } + engines: { node: '>=18' } + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.9': + resolution: { integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g== } + engines: { node: '>=18' } + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.9': + resolution: { integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ== } + engines: { node: '>=18' } + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.9': + resolution: { integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA== } + engines: { node: '>=18' } + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.9': + resolution: { integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg== } + engines: { node: '>=18' } + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.9': + resolution: { integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw== } + engines: { node: '>=18' } + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.9': + resolution: { integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ== } + engines: { node: '>=18' } + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.9': + resolution: { integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww== } + engines: { node: '>=18' } + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.9': + resolution: { integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ== } + engines: { node: '>=18' } + cpu: [x64] + os: [win32] + + '@expressive-code/core@0.41.3': + resolution: { integrity: sha512-9qzohqU7O0+JwMEEgQhnBPOw5DtsQRBXhW++5fvEywsuX44vCGGof1SL5OvPElvNgaWZ4pFZAFSlkNOkGyLwSQ== } + + '@expressive-code/plugin-frames@0.41.3': + resolution: { integrity: sha512-rFQtmf/3N2CK3Cq/uERweMTYZnBu+CwxBdHuOftEmfA9iBE7gTVvwpbh82P9ZxkPLvc40UMhYt7uNuAZexycRQ== } + + '@expressive-code/plugin-shiki@0.41.3': + resolution: { integrity: sha512-RlTARoopzhFJIOVHLGvuXJ8DCEme/hjV+ZnRJBIxzxsKVpGPW4Oshqg9xGhWTYdHstTsxO663s0cdBLzZj9TQA== } + + '@expressive-code/plugin-text-markers@0.41.3': + resolution: { integrity: sha512-SN8tkIzDpA0HLAscEYD2IVrfLiid6qEdE9QLlGVSxO1KEw7qYvjpbNBQjUjMr5/jvTJ7ys6zysU2vLPHE0sb2g== } + + '@floating-ui/core@1.7.3': + resolution: { integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w== } + + '@floating-ui/dom@1.7.4': + resolution: { integrity: sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA== } + + '@floating-ui/react-dom@2.1.6': + resolution: { integrity: sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw== } + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/react@0.27.16': + resolution: { integrity: sha512-9O8N4SeG2z++TSM8QA/KTeKFBVCNEz/AGS7gWPJf6KFRzmRWixFRnCnkPHRDwSVZW6QPDO6uT0P2SpWNKCc9/g== } + peerDependencies: + react: '>=17.0.0' + react-dom: '>=17.0.0' + + '@floating-ui/utils@0.2.10': + resolution: { integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ== } + + '@iconify/tools@4.1.3': + resolution: { integrity: sha512-guPw9jvkrCCGFUvPr+NgUcQIpQcIll38NQzUzrEMK/1vrDmeJ9jstsp/Dx5LIP2na9BUBLHKOKXA6cERTpnGFw== } + + '@iconify/types@2.0.0': + resolution: { integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg== } + + '@iconify/utils@2.3.0': + resolution: { integrity: sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA== } + + '@img/sharp-darwin-arm64@0.33.5': + resolution: { integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ== } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-arm64@0.34.3': + resolution: { integrity: sha512-ryFMfvxxpQRsgZJqBd4wsttYQbCxsJksrv9Lw/v798JcQ8+w84mBWuXwl+TT0WJ/WrYOLaYpwQXi3sA9nTIaIg== } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.33.5': + resolution: { integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q== } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [x64] + os: [darwin] + + '@img/sharp-darwin-x64@0.34.3': + resolution: { integrity: sha512-yHpJYynROAj12TA6qil58hmPmAwxKKC7reUqtGLzsOHfP7/rniNGTL8tjWX6L3CTV4+5P4ypcS7Pp+7OB+8ihA== } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.0.4': + resolution: { integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg== } + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.2.0': + resolution: { integrity: sha512-sBZmpwmxqwlqG9ueWFXtockhsxefaV6O84BMOrhtg/YqbTaRdqDE7hxraVE3y6gVM4eExmfzW4a8el9ArLeEiQ== } + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.0.4': + resolution: { integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ== } + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.2.0': + resolution: { integrity: sha512-M64XVuL94OgiNHa5/m2YvEQI5q2cl9d/wk0qFTDVXcYzi43lxuiFTftMR1tOnFQovVXNZJ5TURSDK2pNe9Yzqg== } + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.0.4': + resolution: { integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA== } + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-arm64@1.2.0': + resolution: { integrity: sha512-RXwd0CgG+uPRX5YYrkzKyalt2OJYRiJQ8ED/fi1tq9WQW2jsQIn0tqrlR5l5dr/rjqq6AHAxURhj2DVjyQWSOA== } + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-arm@1.0.5': + resolution: { integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g== } + cpu: [arm] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-arm@1.2.0': + resolution: { integrity: sha512-mWd2uWvDtL/nvIzThLq3fr2nnGfyr/XMXlq8ZJ9WMR6PXijHlC3ksp0IpuhK6bougvQrchUAfzRLnbsen0Cqvw== } + cpu: [arm] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-ppc64@1.2.0': + resolution: { integrity: sha512-Xod/7KaDDHkYu2phxxfeEPXfVXFKx70EAFZ0qyUdOjCcxbjqyJOEUpDe6RIyaunGxT34Anf9ue/wuWOqBW2WcQ== } + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-s390x@1.0.4': + resolution: { integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA== } + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-s390x@1.2.0': + resolution: { integrity: sha512-eMKfzDxLGT8mnmPJTNMcjfO33fLiTDsrMlUVcp6b96ETbnJmd4uvZxVJSKPQfS+odwfVaGifhsB07J1LynFehw== } + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-x64@1.0.4': + resolution: { integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw== } + cpu: [x64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-x64@1.2.0': + resolution: { integrity: sha512-ZW3FPWIc7K1sH9E3nxIGB3y3dZkpJlMnkk7z5tu1nSkBoCgw2nSRTFHI5pB/3CQaJM0pdzMF3paf9ckKMSE9Tg== } + cpu: [x64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + resolution: { integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA== } + cpu: [arm64] + os: [linux] + libc: [musl] + + '@img/sharp-libvips-linuxmusl-arm64@1.2.0': + resolution: { integrity: sha512-UG+LqQJbf5VJ8NWJ5Z3tdIe/HXjuIdo4JeVNADXBFuG7z9zjoegpzzGIyV5zQKi4zaJjnAd2+g2nna8TZvuW9Q== } + cpu: [arm64] + os: [linux] + libc: [musl] + + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + resolution: { integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw== } + cpu: [x64] + os: [linux] + libc: [musl] + + '@img/sharp-libvips-linuxmusl-x64@1.2.0': + resolution: { integrity: sha512-SRYOLR7CXPgNze8akZwjoGBoN1ThNZoqpOgfnOxmWsklTGVfJiGJoC/Lod7aNMGA1jSsKWM1+HRX43OP6p9+6Q== } + cpu: [x64] + os: [linux] + libc: [musl] + + '@img/sharp-linux-arm64@0.33.5': + resolution: { integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA== } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-arm64@0.34.3': + resolution: { integrity: sha512-QdrKe3EvQrqwkDrtuTIjI0bu6YEJHTgEeqdzI3uWJOH6G1O8Nl1iEeVYRGdj1h5I21CqxSvQp1Yv7xeU3ZewbA== } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-arm@0.33.5': + resolution: { integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ== } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [arm] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-arm@0.34.3': + resolution: { integrity: sha512-oBK9l+h6KBN0i3dC8rYntLiVfW8D8wH+NPNT3O/WBHeW0OQWCjfWksLUaPidsrDKpJgXp3G3/hkmhptAW0I3+A== } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [arm] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-ppc64@0.34.3': + resolution: { integrity: sha512-GLtbLQMCNC5nxuImPR2+RgrviwKwVql28FWZIW1zWruy6zLgA5/x2ZXk3mxj58X/tszVF69KK0Is83V8YgWhLA== } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-s390x@0.33.5': + resolution: { integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q== } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-s390x@0.34.3': + resolution: { integrity: sha512-3gahT+A6c4cdc2edhsLHmIOXMb17ltffJlxR0aC2VPZfwKoTGZec6u5GrFgdR7ciJSsHT27BD3TIuGcuRT0KmQ== } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-x64@0.33.5': + resolution: { integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA== } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [x64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-x64@0.34.3': + resolution: { integrity: sha512-8kYso8d806ypnSq3/Ly0QEw90V5ZoHh10yH0HnrzOCr6DKAPI6QVHvwleqMkVQ0m+fc7EH8ah0BB0QPuWY6zJQ== } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [x64] + os: [linux] + libc: [glibc] + + '@img/sharp-linuxmusl-arm64@0.33.5': + resolution: { integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g== } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [arm64] + os: [linux] + libc: [musl] + + '@img/sharp-linuxmusl-arm64@0.34.3': + resolution: { integrity: sha512-vAjbHDlr4izEiXM1OTggpCcPg9tn4YriK5vAjowJsHwdBIdx0fYRsURkxLG2RLm9gyBq66gwtWI8Gx0/ov+JKQ== } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [arm64] + os: [linux] + libc: [musl] + + '@img/sharp-linuxmusl-x64@0.33.5': + resolution: { integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw== } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [x64] + os: [linux] + libc: [musl] + + '@img/sharp-linuxmusl-x64@0.34.3': + resolution: { integrity: sha512-gCWUn9547K5bwvOn9l5XGAEjVTTRji4aPTqLzGXHvIr6bIDZKNTA34seMPgM0WmSf+RYBH411VavCejp3PkOeQ== } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [x64] + os: [linux] + libc: [musl] + + '@img/sharp-wasm32@0.33.5': + resolution: { integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg== } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [wasm32] + + '@img/sharp-wasm32@0.34.3': + resolution: { integrity: sha512-+CyRcpagHMGteySaWos8IbnXcHgfDn7pO2fiC2slJxvNq9gDipYBN42/RagzctVRKgxATmfqOSulgZv5e1RdMg== } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [wasm32] + + '@img/sharp-win32-arm64@0.34.3': + resolution: { integrity: sha512-MjnHPnbqMXNC2UgeLJtX4XqoVHHlZNd+nPt1kRPmj63wURegwBhZlApELdtxM2OIZDRv/DFtLcNhVbd1z8GYXQ== } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [arm64] + os: [win32] + + '@img/sharp-win32-ia32@0.33.5': + resolution: { integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ== } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-ia32@0.34.3': + resolution: { integrity: sha512-xuCdhH44WxuXgOM714hn4amodJMZl3OEvf0GVTm0BEyMeA2to+8HEdRPShH0SLYptJY1uBw+SCFP9WVQi1Q/cw== } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.33.5': + resolution: { integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg== } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [x64] + os: [win32] + + '@img/sharp-win32-x64@0.34.3': + resolution: { integrity: sha512-OWwz05d++TxzLEv4VnsTz5CmZ6mI6S05sfQGEMrNrQcOEERbX46332IvE7pO/EUiw7jUrrS40z/M7kPyjfl04g== } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + cpu: [x64] + os: [win32] + + '@inquirer/external-editor@1.0.2': + resolution: { integrity: sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ== } + engines: { node: '>=18' } + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@isaacs/balanced-match@4.0.1': + resolution: { integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ== } + engines: { node: 20 || >=22 } + + '@isaacs/brace-expansion@5.0.0': + resolution: { integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA== } + engines: { node: 20 || >=22 } + + '@isaacs/cliui@8.0.2': + resolution: { integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== } + engines: { node: '>=12' } + + '@isaacs/fs-minipass@4.0.1': + resolution: { integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w== } + engines: { node: '>=18.0.0' } + + '@jridgewell/gen-mapping@0.3.13': + resolution: { integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA== } + + '@jridgewell/remapping@2.3.5': + resolution: { integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ== } + + '@jridgewell/resolve-uri@3.1.2': + resolution: { integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== } + engines: { node: '>=6.0.0' } + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: { integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== } + + '@jridgewell/trace-mapping@0.3.31': + resolution: { integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw== } + + '@lucide/svelte@0.542.0': + resolution: { integrity: sha512-NuWttxTVfMSURpOxcKiKvoCtma3JtEpcJWzF/0cO69saZfXlv6G8NYAvEEGLmk75YPl+I+ROe+F97WhddM8r2A== } + peerDependencies: + svelte: ^5 + + '@manypkg/find-root@1.1.0': + resolution: { integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA== } + + '@manypkg/get-packages@1.1.3': + resolution: { integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A== } + + '@mapbox/node-pre-gyp@2.0.0': + resolution: { integrity: sha512-llMXd39jtP0HpQLVI37Bf1m2ADlEb35GYSh1SDSLsBhR+5iCxiNGlT31yqbNtVHygHAtMy6dWFERpU2JgufhPg== } + engines: { node: '>=18' } + hasBin: true + + '@mdx-js/mdx@3.1.1': + resolution: { integrity: sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ== } + + '@nanostores/persistent@1.1.0': + resolution: { integrity: sha512-e6vfv7H99VkCfSoNTR/qNVMj6vXwWcsEL+LCQQamej5GK9iDefKxPCJjdOpBi1p4lNCFIQ+9VjYF1spvvc2p6A== } + engines: { node: ^20.0.0 || >=22.0.0 } + peerDependencies: + nanostores: ^0.9.0 || ^0.10.0 || ^0.11.0 || ^1.0.0 + + '@napi-rs/wasm-runtime@1.0.5': + resolution: { integrity: sha512-TBr9Cf9onSAS2LQ2+QHx6XcC6h9+RIzJgbqG3++9TUZSH204AwEy5jg3BTQ0VATsyoGj4ee49tN/y6rvaOOtcg== } + + '@next/env@15.5.2': + resolution: { integrity: sha512-Qe06ew4zt12LeO6N7j8/nULSOe3fMXE4dM6xgpBQNvdzyK1sv5y4oAP3bq4LamrvGCZtmRYnW8URFCeX5nFgGg== } + + '@next/swc-darwin-arm64@15.5.2': + resolution: { integrity: sha512-8bGt577BXGSd4iqFygmzIfTYizHb0LGWqH+qgIF/2EDxS5JsSdERJKA8WgwDyNBZgTIIA4D8qUtoQHmxIIquoQ== } + engines: { node: '>= 10' } + cpu: [arm64] + os: [darwin] + + '@next/swc-darwin-x64@15.5.2': + resolution: { integrity: sha512-2DjnmR6JHK4X+dgTXt5/sOCu/7yPtqpYt8s8hLkHFK3MGkka2snTv3yRMdHvuRtJVkPwCGsvBSwmoQCHatauFQ== } + engines: { node: '>= 10' } + cpu: [x64] + os: [darwin] + + '@next/swc-linux-arm64-gnu@15.5.2': + resolution: { integrity: sha512-3j7SWDBS2Wov/L9q0mFJtEvQ5miIqfO4l7d2m9Mo06ddsgUK8gWfHGgbjdFlCp2Ek7MmMQZSxpGFqcC8zGh2AA== } + engines: { node: '>= 10' } + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@next/swc-linux-arm64-musl@15.5.2': + resolution: { integrity: sha512-s6N8k8dF9YGc5T01UPQ08yxsK6fUow5gG1/axWc1HVVBYQBgOjca4oUZF7s4p+kwhkB1bDSGR8QznWrFZ/Rt5g== } + engines: { node: '>= 10' } + cpu: [arm64] + os: [linux] + libc: [musl] + + '@next/swc-linux-x64-gnu@15.5.2': + resolution: { integrity: sha512-o1RV/KOODQh6dM6ZRJGZbc+MOAHww33Vbs5JC9Mp1gDk8cpEO+cYC/l7rweiEalkSm5/1WGa4zY7xrNwObN4+Q== } + engines: { node: '>= 10' } + cpu: [x64] + os: [linux] + libc: [glibc] + + '@next/swc-linux-x64-musl@15.5.2': + resolution: { integrity: sha512-/VUnh7w8RElYZ0IV83nUcP/J4KJ6LLYliiBIri3p3aW2giF+PAVgZb6mk8jbQSB3WlTai8gEmCAr7kptFa1H6g== } + engines: { node: '>= 10' } + cpu: [x64] + os: [linux] + libc: [musl] + + '@next/swc-win32-arm64-msvc@15.5.2': + resolution: { integrity: sha512-sMPyTvRcNKXseNQ/7qRfVRLa0VhR0esmQ29DD6pqvG71+JdVnESJaHPA8t7bc67KD5spP3+DOCNLhqlEI2ZgQg== } + engines: { node: '>= 10' } + cpu: [arm64] + os: [win32] + + '@next/swc-win32-x64-msvc@15.5.2': + resolution: { integrity: sha512-W5VvyZHnxG/2ukhZF/9Ikdra5fdNftxI6ybeVKYvBPDtyx7x4jPPSNduUkfH5fo3zG0JQ0bPxgy41af2JX5D4Q== } + engines: { node: '>= 10' } + cpu: [x64] + os: [win32] + + '@nodelib/fs.scandir@2.1.5': + resolution: { integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== } + engines: { node: '>= 8' } + + '@nodelib/fs.stat@2.0.5': + resolution: { integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== } + engines: { node: '>= 8' } + + '@nodelib/fs.walk@1.2.8': + resolution: { integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== } + engines: { node: '>= 8' } + + '@octokit/app@16.1.0': + resolution: { integrity: sha512-OdKHnm0CYLk8Setr47CATT4YnRTvWkpTYvE+B/l2B0mjszlfOIit3wqPHVslD2jfc1bD4UbO7Mzh6gjCuMZKsA== } + engines: { node: '>= 20' } + + '@octokit/auth-app@8.1.0': + resolution: { integrity: sha512-6bWhyvLXqCSfHiqlwzn9pScLZ+Qnvh/681GR/UEEPCMIVwfpRDBw0cCzy3/t2Dq8B7W2X/8pBgmw6MOiyE0DXQ== } + engines: { node: '>= 20' } + + '@octokit/auth-oauth-app@9.0.1': + resolution: { integrity: sha512-TthWzYxuHKLAbmxdFZwFlmwVyvynpyPmjwc+2/cI3cvbT7mHtsAW9b1LvQaNnAuWL+pFnqtxdmrU8QpF633i1g== } + engines: { node: '>= 20' } + + '@octokit/auth-oauth-device@8.0.1': + resolution: { integrity: sha512-TOqId/+am5yk9zor0RGibmlqn4V0h8vzjxlw/wYr3qzkQxl8aBPur384D1EyHtqvfz0syeXji4OUvKkHvxk/Gw== } + engines: { node: '>= 20' } + + '@octokit/auth-oauth-user@6.0.0': + resolution: { integrity: sha512-GV9IW134PHsLhtUad21WIeP9mlJ+QNpFd6V9vuPWmaiN25HEJeEQUcS4y5oRuqCm9iWDLtfIs+9K8uczBXKr6A== } + engines: { node: '>= 20' } + + '@octokit/auth-token@6.0.0': + resolution: { integrity: sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w== } + engines: { node: '>= 20' } + + '@octokit/auth-unauthenticated@7.0.1': + resolution: { integrity: sha512-qVq1vdjLLZdE8kH2vDycNNjuJRCD1q2oet1nA/GXWaYlpDxlR7rdVhX/K/oszXslXiQIiqrQf+rdhDlA99JdTQ== } + engines: { node: '>= 20' } + + '@octokit/core@7.0.4': + resolution: { integrity: sha512-jOT8V1Ba5BdC79sKrRWDdMT5l1R+XNHTPR6CPWzUP2EcfAcvIHZWF0eAbmRcpOOP5gVIwnqNg0C4nvh6Abc3OA== } + engines: { node: '>= 20' } + + '@octokit/endpoint@11.0.0': + resolution: { integrity: sha512-hoYicJZaqISMAI3JfaDr1qMNi48OctWuOih1m80bkYow/ayPw6Jj52tqWJ6GEoFTk1gBqfanSoI1iY99Z5+ekQ== } + engines: { node: '>= 20' } + + '@octokit/graphql@9.0.1': + resolution: { integrity: sha512-j1nQNU1ZxNFx2ZtKmL4sMrs4egy5h65OMDmSbVyuCzjOcwsHq6EaYjOTGXPQxgfiN8dJ4CriYHk6zF050WEULg== } + engines: { node: '>= 20' } + + '@octokit/oauth-app@8.0.1': + resolution: { integrity: sha512-QnhMYEQpnYbEPn9cae+wXL2LuPMFglmfeuDJXXsyxIXdoORwkLK8y0cHhd/5du9MbO/zdG/BXixzB7EEwU63eQ== } + engines: { node: '>= 20' } + + '@octokit/oauth-authorization-url@8.0.0': + resolution: { integrity: sha512-7QoLPRh/ssEA/HuHBHdVdSgF8xNLz/Bc5m9fZkArJE5bb6NmVkDm3anKxXPmN1zh6b5WKZPRr3697xKT/yM3qQ== } + engines: { node: '>= 20' } + + '@octokit/oauth-methods@6.0.0': + resolution: { integrity: sha512-Q8nFIagNLIZgM2odAraelMcDssapc+lF+y3OlcIPxyAU+knefO8KmozGqfnma1xegRDP4z5M73ABsamn72bOcA== } + engines: { node: '>= 20' } + + '@octokit/openapi-types@25.1.0': + resolution: { integrity: sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA== } + + '@octokit/openapi-types@26.0.0': + resolution: { integrity: sha512-7AtcfKtpo77j7Ts73b4OWhOZHTKo/gGY8bB3bNBQz4H+GRSWqx2yvj8TXRsbdTE0eRmYmXOEY66jM7mJ7LzfsA== } + + '@octokit/openapi-webhooks-types@12.0.3': + resolution: { integrity: sha512-90MF5LVHjBedwoHyJsgmaFhEN1uzXyBDRLEBe7jlTYx/fEhPAk3P3DAJsfZwC54m8hAIryosJOL+UuZHB3K3yA== } + + '@octokit/plugin-paginate-graphql@6.0.0': + resolution: { integrity: sha512-crfpnIoFiBtRkvPqOyLOsw12XsveYuY2ieP6uYDosoUegBJpSVxGwut9sxUgFFcll3VTOTqpUf8yGd8x1OmAkQ== } + engines: { node: '>= 20' } + peerDependencies: + '@octokit/core': '>=6' + + '@octokit/plugin-paginate-rest@13.1.1': + resolution: { integrity: sha512-q9iQGlZlxAVNRN2jDNskJW/Cafy7/XE52wjZ5TTvyhyOD904Cvx//DNyoO3J/MXJ0ve3rPoNWKEg5iZrisQSuw== } + engines: { node: '>= 20' } + peerDependencies: + '@octokit/core': '>=6' + + '@octokit/plugin-rest-endpoint-methods@16.1.0': + resolution: { integrity: sha512-nCsyiKoGRnhH5LkH8hJEZb9swpqOcsW+VXv1QoyUNQXJeVODG4+xM6UICEqyqe9XFr6LkL8BIiFCPev8zMDXPw== } + engines: { node: '>= 20' } + peerDependencies: + '@octokit/core': '>=6' + + '@octokit/plugin-retry@8.0.1': + resolution: { integrity: sha512-KUoYR77BjF5O3zcwDQHRRZsUvJwepobeqiSSdCJ8lWt27FZExzb0GgVxrhhfuyF6z2B2zpO0hN5pteni1sqWiw== } + engines: { node: '>= 20' } + peerDependencies: + '@octokit/core': '>=7' + + '@octokit/plugin-throttling@11.0.1': + resolution: { integrity: sha512-S+EVhy52D/272L7up58dr3FNSMXWuNZolkL4zMJBNIfIxyZuUcczsQAU4b5w6dewJXnKYVgSHSV5wxitMSW1kw== } + engines: { node: '>= 20' } + peerDependencies: + '@octokit/core': ^7.0.0 + + '@octokit/request-error@7.0.0': + resolution: { integrity: sha512-KRA7VTGdVyJlh0cP5Tf94hTiYVVqmt2f3I6mnimmaVz4UG3gQV/k4mDJlJv3X67iX6rmN7gSHCF8ssqeMnmhZg== } + engines: { node: '>= 20' } + + '@octokit/request@10.0.3': + resolution: { integrity: sha512-V6jhKokg35vk098iBqp2FBKunk3kMTXlmq+PtbV9Gl3TfskWlebSofU9uunVKhUN7xl+0+i5vt0TGTG8/p/7HA== } + engines: { node: '>= 20' } + + '@octokit/types@14.1.0': + resolution: { integrity: sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g== } + + '@octokit/types@15.0.0': + resolution: { integrity: sha512-8o6yDfmoGJUIeR9OfYU0/TUJTnMPG2r68+1yEdUeG2Fdqpj8Qetg0ziKIgcBm0RW/j29H41WP37CYCEhp6GoHQ== } + + '@octokit/webhooks-methods@6.0.0': + resolution: { integrity: sha512-MFlzzoDJVw/GcbfzVC1RLR36QqkTLUf79vLVO3D+xn7r0QgxnFoLZgtrzxiQErAjFUOdH6fas2KeQJ1yr/qaXQ== } + engines: { node: '>= 20' } + + '@octokit/webhooks@14.1.3': + resolution: { integrity: sha512-gcK4FNaROM9NjA0mvyfXl0KPusk7a1BeA8ITlYEZVQCXF5gcETTd4yhAU0Kjzd8mXwYHppzJBWgdBVpIR9wUcQ== } + engines: { node: '>= 20' } + + '@oslojs/encoding@1.1.0': + resolution: { integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ== } + + '@oxc-project/types@0.89.0': + resolution: { integrity: sha512-yuo+ECPIW5Q9mSeNmCDC2im33bfKuwW18mwkaHMQh8KakHYDzj4ci/q7wxf2qS3dMlVVCIyrs3kFtH5LmnlYnw== } + + '@oxlint-tsgolint/darwin-arm64@0.2.0': + resolution: { integrity: sha512-ayJO9SmiJ15oV3+svIw8bqun0ySdjiD7L+ddwNB4vOAgUX/rdX1KTBnDb/ZEk6MOFBnFgbbiEiLRJLlGtuFYVQ== } + cpu: [arm64] + os: [darwin] + + '@oxlint-tsgolint/darwin-x64@0.2.0': + resolution: { integrity: sha512-iCrcjkqqyy3zq+yXOmNsjt/DiSU4u9yJ00hEr4oGSrrk7V0ju6eqrmsh8VGS74YLY3MCskTjeTyVDRR7huc3WQ== } + cpu: [x64] + os: [darwin] + + '@oxlint-tsgolint/linux-arm64@0.2.0': + resolution: { integrity: sha512-Kne4mrJGCZ0O+/ukcvWftCmDAEFUpMQ4q4wZdWVlnmNdTbtICIay3ofk/rzX0QoZmEZh0jy/G7p+5P0t9Bg5Sg== } + cpu: [arm64] + os: [linux] + + '@oxlint-tsgolint/linux-x64@0.2.0': + resolution: { integrity: sha512-DKGFSR71fnExWpJXvN32SqWuEcT1XXeI1CKpO63jgXTAUpVl9H/BXG3+gNptSoZqzqeFTj8jOgiaX6VkOABqGA== } + cpu: [x64] + os: [linux] + + '@oxlint-tsgolint/win32-arm64@0.2.0': + resolution: { integrity: sha512-Grbkva1YH0eTRtv3MkVTFAycVwQSytcl8N52zNs1YresWwOlnNvNZ5EeLIaQaudcxwsbpZWR2Bdsfa467zDJTw== } + cpu: [arm64] + os: [win32] + + '@oxlint-tsgolint/win32-x64@0.2.0': + resolution: { integrity: sha512-asfPqgu7r1H8NmBNxfMpZER6WvrUTH8BDMPIcChBhrUjuSmt4UMyiyul3CEPZLPQcPlaWCeGnConTu3BabK4Fw== } + cpu: [x64] + os: [win32] + + '@oxlint/darwin-arm64@1.15.0': + resolution: { integrity: sha512-fwYg7WDKI6eAErREBGMXkIAOqBuBFN0LWbQJvVNXCGjywGxsisdwkHnNu4UG8IpHo4P71mUxf3l2xm+5Xiy+TA== } + cpu: [arm64] + os: [darwin] + + '@oxlint/darwin-x64@1.15.0': + resolution: { integrity: sha512-RtaAmB6NZZx4hvjCg6w35shzRY5fLclbMsToC92MTZ9lMDF9LotzcbyNHCZ1tvZb1tNPObpIsuX16BFeElF8nw== } + cpu: [x64] + os: [darwin] + + '@oxlint/linux-arm64-gnu@1.15.0': + resolution: { integrity: sha512-8uV0lAbmqp93KTBlJWyCdQWuxTzLn+QrDRidUaCLJjn65uvv8KlRhZJoZoyLh17X6U/cgezYktWTMiMhxX56BA== } + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxlint/linux-arm64-musl@1.15.0': + resolution: { integrity: sha512-/+hTqh1J29+2GitKrWUHIYjQBM1szWSJ1U7OzQlgL+Uvf8jxg4sn1nV79LcPMXhC2t8lZy5EOXOgwIh92DsdhQ== } + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxlint/linux-x64-gnu@1.15.0': + resolution: { integrity: sha512-GzeY3AhUd49yV+/76Gw0pjpwUJwxCkwYAJTNe7fFTdWjEQ6M6g8ZzJg5FKtUvgA5sMgmfzHhvSXxvT57YhcXnA== } + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxlint/linux-x64-musl@1.15.0': + resolution: { integrity: sha512-p/7+juizUOCpGYreFmdfmIOSSSE3+JfsgnXnOHuP8mqlZfiOeXyevyajuXpPNRM60+k0reGvlV7ezp1iFitF7w== } + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxlint/win32-arm64@1.15.0': + resolution: { integrity: sha512-2LaDLOtCMq+lzIQ63Eir3UJV/hQNlw01xtsij2L8sSxt4gA+zWvubOQJQIOPGMDxEKFcWT1lo/6YEXX/sNnZDA== } + cpu: [arm64] + os: [win32] + + '@oxlint/win32-x64@1.15.0': + resolution: { integrity: sha512-+jgRPpZrFIcrNxCVsDIy6HVCRpKVDN0DHD8VJodjrsDv6heqhq/qCTa2IXY3R4glWe1nWQ5JgdFKLn3Bl+aLNg== } + cpu: [x64] + os: [win32] + + '@pagefind/darwin-arm64@1.3.0': + resolution: { integrity: sha512-365BEGl6ChOsauRjyVpBjXybflXAOvoMROw3TucAROHIcdBvXk9/2AmEvGFU0r75+vdQI4LJdJdpH4Y6Yqaj4A== } + cpu: [arm64] + os: [darwin] + + '@pagefind/darwin-x64@1.3.0': + resolution: { integrity: sha512-zlGHA23uuXmS8z3XxEGmbHpWDxXfPZ47QS06tGUq0HDcZjXjXHeLG+cboOy828QIV5FXsm9MjfkP5e4ZNbOkow== } + cpu: [x64] + os: [darwin] + + '@pagefind/linux-arm64@1.3.0': + resolution: { integrity: sha512-8lsxNAiBRUk72JvetSBXs4WRpYrQrVJXjlRRnOL6UCdBN9Nlsz0t7hWstRk36+JqHpGWOKYiuHLzGYqYAqoOnQ== } + cpu: [arm64] + os: [linux] + + '@pagefind/linux-x64@1.3.0': + resolution: { integrity: sha512-hAvqdPJv7A20Ucb6FQGE6jhjqy+vZ6pf+s2tFMNtMBG+fzcdc91uTw7aP/1Vo5plD0dAOHwdxfkyw0ugal4kcQ== } + cpu: [x64] + os: [linux] + + '@pagefind/windows-x64@1.3.0': + resolution: { integrity: sha512-BR1bIRWOMqkf8IoU576YDhij1Wd/Zf2kX/kCI0b2qzCKC8wcc2GQJaaRMCpzvCCrmliO4vtJ6RITp/AnoYUUmQ== } + cpu: [x64] + os: [win32] + + '@parcel/watcher-android-arm64@2.5.1': + resolution: { integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA== } + engines: { node: '>= 10.0.0' } + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.5.1': + resolution: { integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw== } + engines: { node: '>= 10.0.0' } + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.5.1': + resolution: { integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg== } + engines: { node: '>= 10.0.0' } + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.5.1': + resolution: { integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ== } + engines: { node: '>= 10.0.0' } + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.5.1': + resolution: { integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA== } + engines: { node: '>= 10.0.0' } + cpu: [arm] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-arm-musl@2.5.1': + resolution: { integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q== } + engines: { node: '>= 10.0.0' } + cpu: [arm] + os: [linux] + libc: [musl] + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + resolution: { integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w== } + engines: { node: '>= 10.0.0' } + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-arm64-musl@2.5.1': + resolution: { integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg== } + engines: { node: '>= 10.0.0' } + cpu: [arm64] + os: [linux] + libc: [musl] + + '@parcel/watcher-linux-x64-glibc@2.5.1': + resolution: { integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A== } + engines: { node: '>= 10.0.0' } + cpu: [x64] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-x64-musl@2.5.1': + resolution: { integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg== } + engines: { node: '>= 10.0.0' } + cpu: [x64] + os: [linux] + libc: [musl] + + '@parcel/watcher-win32-arm64@2.5.1': + resolution: { integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw== } + engines: { node: '>= 10.0.0' } + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-ia32@2.5.1': + resolution: { integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ== } + engines: { node: '>= 10.0.0' } + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.5.1': + resolution: { integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA== } + engines: { node: '>= 10.0.0' } + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.5.1': + resolution: { integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg== } + engines: { node: '>= 10.0.0' } + + '@pkgjs/parseargs@0.11.0': + resolution: { integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== } + engines: { node: '>=14' } + + '@pnpm/config.env-replace@1.1.0': + resolution: { integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w== } + engines: { node: '>=12.22.0' } + + '@pnpm/network.ca-file@1.0.2': + resolution: { integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA== } + engines: { node: '>=12.22.0' } + + '@pnpm/npm-conf@2.3.1': + resolution: { integrity: sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw== } + engines: { node: '>=12' } + + '@polka/url@1.0.0-next.29': + resolution: { integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww== } + + '@publint/pack@0.1.2': + resolution: { integrity: sha512-S+9ANAvUmjutrshV4jZjaiG8XQyuJIZ8a4utWmN/vW1sgQ9IfBnPndwkmQYw53QmouOIytT874u65HEmu6H5jw== } + engines: { node: '>=18' } + + '@quansync/fs@0.1.5': + resolution: { integrity: sha512-lNS9hL2aS2NZgNW7BBj+6EBl4rOf8l+tQ0eRY6JWCI8jI2kc53gSoqbjojU0OnAWhzoXiOjFyGsHcDGePB3lhA== } + + '@qwik.dev/partytown@0.11.2': + resolution: { integrity: sha512-795y49CqBiKiwKAD+QBZlzlqEK275hVcazZ7wBPSfgC23L+vWuA7PJmMpgxojOucZHzYi5rAAQ+IP1I3BKVZxw== } + engines: { node: '>=18.0.0' } + hasBin: true + + '@rolldown/binding-android-arm64@1.0.0-beta.38': + resolution: { integrity: sha512-AE3HFQrjWCKLFZD1Vpiy+qsqTRwwoil1oM5WsKPSmfQ5fif/A+ZtOZetF32erZdsR7qyvns6qHEteEsF6g6rsQ== } + engines: { node: ^20.19.0 || >=22.12.0 } + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.0.0-beta.38': + resolution: { integrity: sha512-RaoWOKc0rrFsVmKOjQpebMY6c6/I7GR1FBc25v7L/R7NlM0166mUotwGEv7vxu7ruXH4SJcFeVrfADFUUXUmmQ== } + engines: { node: ^20.19.0 || >=22.12.0 } + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.0-beta.38': + resolution: { integrity: sha512-Ymojqc2U35iUc8NFU2XX1WQPfBRRHN6xHcrxAf9WS8BFFBn8pDrH5QPvH1tYs3lDkw6UGGbanr1RGzARqdUp1g== } + engines: { node: ^20.19.0 || >=22.12.0 } + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.0-beta.38': + resolution: { integrity: sha512-0ermTQ//WzSI0nOL3z/LUWMNiE9xeM5cLGxjewPFEexqxV/0uM8/lNp9QageQ8jfc/VO1OURsGw34HYO5PaL8w== } + engines: { node: ^20.19.0 || >=22.12.0 } + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.38': + resolution: { integrity: sha512-GADxzVUTCTp6EWI52831A29Tt7PukFe94nhg/SUsfkI33oTiNQtPxyLIT/3oRegizGuPSZSlrdBurkjDwxyEUQ== } + engines: { node: ^20.19.0 || >=22.12.0 } + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.38': + resolution: { integrity: sha512-SKO7Exl5Yem/OSNoA5uLHzyrptUQ8Hg70kHDxuwEaH0+GUg+SQe9/7PWmc4hFKBMrJGdQtii8WZ0uIz9Dofg5Q== } + engines: { node: ^20.19.0 || >=22.12.0 } + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.38': + resolution: { integrity: sha512-SOo6+WqhXPBaShLxLT0eCgH17d3Yu1lMAe4mFP0M9Bvr/kfMSOPQXuLxBcbBU9IFM9w3N6qP9xWOHO+oUJvi8Q== } + engines: { node: ^20.19.0 || >=22.12.0 } + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.38': + resolution: { integrity: sha512-yvsQ3CyrodOX+lcoi+lejZGCOvJZa9xTsNB8OzpMDmHeZq3QzJfpYjXSAS6vie70fOkLVJb77UqYO193Cl8XBQ== } + engines: { node: ^20.19.0 || >=22.12.0 } + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.38': + resolution: { integrity: sha512-84qzKMwUwikfYeOuJ4Kxm/3z15rt0nFGGQArHYIQQNSTiQdxGHxOkqXtzPFqrVfBJUdxBAf+jYzR1pttFJuWyg== } + engines: { node: ^20.19.0 || >=22.12.0 } + cpu: [x64] + os: [linux] + libc: [musl] + + '@rolldown/binding-openharmony-arm64@1.0.0-beta.38': + resolution: { integrity: sha512-QrNiWlce01DYH0rL8K3yUBu+lNzY+B0DyCbIc2Atan6/S6flxOL0ow5DLQvMamOI/oKhrJ4xG+9MkMb9dDHbLQ== } + engines: { node: ^20.19.0 || >=22.12.0 } + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.38': + resolution: { integrity: sha512-fnLtHyjwEsG4/aNV3Uv3Qd1ZbdH+CopwJNoV0RgBqrcQB8V6/Qdikd5JKvnO23kb3QvIpP+dAMGZMv1c2PJMzw== } + engines: { node: '>=14.0.0' } + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.38': + resolution: { integrity: sha512-19cTfnGedem+RY+znA9J6ARBOCEFD4YSjnx0p5jiTm9tR6pHafRfFIfKlTXhun+NL0WWM/M0eb2IfPPYUa8+wg== } + engines: { node: ^20.19.0 || >=22.12.0 } + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.38': + resolution: { integrity: sha512-HcICm4YzFJZV+fI0O0bFLVVlsWvRNo/AB9EfUXvNYbtAxakCnQZ15oq22deFdz6sfi9Y4/SagH2kPU723dhCFA== } + engines: { node: ^20.19.0 || >=22.12.0 } + cpu: [ia32] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.38': + resolution: { integrity: sha512-4Qx6cgEPXLb0XsCyLoQcUgYBpfL0sjugftob+zhUH0EOk/NVCAIT+h0NJhY+jn7pFpeKxhNMqhvTNx3AesxIAQ== } + engines: { node: ^20.19.0 || >=22.12.0 } + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.0-beta.27': + resolution: { integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA== } + + '@rolldown/pluginutils@1.0.0-beta.34': + resolution: { integrity: sha512-LyAREkZHP5pMom7c24meKmJCdhf2hEyvam2q0unr3or9ydwDL+DJ8chTF6Av/RFPb3rH8UFBdMzO5MxTZW97oA== } + + '@rolldown/pluginutils@1.0.0-beta.38': + resolution: { integrity: sha512-N/ICGKleNhA5nc9XXQG/kkKHJ7S55u0x0XUJbbkmdCnFuoRkM1Il12q9q0eX19+M7KKUEPw/daUPIRnxhcxAIw== } + + '@rollup/pluginutils@5.3.0': + resolution: { integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q== } + engines: { node: '>=14.0.0' } + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.50.2': + resolution: { integrity: sha512-uLN8NAiFVIRKX9ZQha8wy6UUs06UNSZ32xj6giK/rmMXAgKahwExvK6SsmgU5/brh4w/nSgj8e0k3c1HBQpa0A== } + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.50.2': + resolution: { integrity: sha512-oEouqQk2/zxxj22PNcGSskya+3kV0ZKH+nQxuCCOGJ4oTXBdNTbv+f/E3c74cNLeMO1S5wVWacSws10TTSB77g== } + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.50.2': + resolution: { integrity: sha512-OZuTVTpj3CDSIxmPgGH8en/XtirV5nfljHZ3wrNwvgkT5DQLhIKAeuFSiwtbMto6oVexV0k1F1zqURPKf5rI1Q== } + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.50.2': + resolution: { integrity: sha512-Wa/Wn8RFkIkr1vy1k1PB//VYhLnlnn5eaJkfTQKivirOvzu5uVd2It01ukeQstMursuz7S1bU+8WW+1UPXpa8A== } + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.50.2': + resolution: { integrity: sha512-QkzxvH3kYN9J1w7D1A+yIMdI1pPekD+pWx7G5rXgnIlQ1TVYVC6hLl7SOV9pi5q9uIDF9AuIGkuzcbF7+fAhow== } + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.50.2': + resolution: { integrity: sha512-dkYXB0c2XAS3a3jmyDkX4Jk0m7gWLFzq1C3qUnJJ38AyxIF5G/dyS4N9B30nvFseCfgtCEdbYFhk0ChoCGxPog== } + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.50.2': + resolution: { integrity: sha512-9VlPY/BN3AgbukfVHAB8zNFWB/lKEuvzRo1NKev0Po8sYFKx0i+AQlCYftgEjcL43F2h9Ui1ZSdVBc4En/sP2w== } + cpu: [arm] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.50.2': + resolution: { integrity: sha512-+GdKWOvsifaYNlIVf07QYan1J5F141+vGm5/Y8b9uCZnG/nxoGqgCmR24mv0koIWWuqvFYnbURRqw1lv7IBINw== } + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.50.2': + resolution: { integrity: sha512-df0Eou14ojtUdLQdPFnymEQteENwSJAdLf5KCDrmZNsy1c3YaCNaJvYsEUHnrg+/DLBH612/R0xd3dD03uz2dg== } + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.50.2': + resolution: { integrity: sha512-iPeouV0UIDtz8j1YFR4OJ/zf7evjauqv7jQ/EFs0ClIyL+by++hiaDAfFipjOgyz6y6xbDvJuiU4HwpVMpRFDQ== } + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loong64-gnu@4.50.2': + resolution: { integrity: sha512-OL6KaNvBopLlj5fTa5D5bau4W82f+1TyTZRr2BdnfsrnQnmdxh4okMxR2DcDkJuh4KeoQZVuvHvzuD/lyLn2Kw== } + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-ppc64-gnu@4.50.2': + resolution: { integrity: sha512-I21VJl1w6z/K5OTRl6aS9DDsqezEZ/yKpbqlvfHbW0CEF5IL8ATBMuUx6/mp683rKTK8thjs/0BaNrZLXetLag== } + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-gnu@4.50.2': + resolution: { integrity: sha512-Hq6aQJT/qFFHrYMjS20nV+9SKrXL2lvFBENZoKfoTH2kKDOJqff5OSJr4x72ZaG/uUn+XmBnGhfr4lwMRrmqCQ== } + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-musl@4.50.2': + resolution: { integrity: sha512-82rBSEXRv5qtKyr0xZ/YMF531oj2AIpLZkeNYxmKNN6I2sVE9PGegN99tYDLK2fYHJITL1P2Lgb4ZXnv0PjQvw== } + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-s390x-gnu@4.50.2': + resolution: { integrity: sha512-4Q3S3Hy7pC6uaRo9gtXUTJ+EKo9AKs3BXKc2jYypEcMQ49gDPFU2P1ariX9SEtBzE5egIX6fSUmbmGazwBVF9w== } + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.50.2': + resolution: { integrity: sha512-9Jie/At6qk70dNIcopcL4p+1UirusEtznpNtcq/u/C5cC4HBX7qSGsYIcG6bdxj15EYWhHiu02YvmdPzylIZlA== } + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-musl@4.50.2': + resolution: { integrity: sha512-HPNJwxPL3EmhzeAnsWQCM3DcoqOz3/IC6de9rWfGR8ZCuEHETi9km66bH/wG3YH0V3nyzyFEGUZeL5PKyy4xvw== } + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-openharmony-arm64@4.50.2': + resolution: { integrity: sha512-nMKvq6FRHSzYfKLHZ+cChowlEkR2lj/V0jYj9JnGUVPL2/mIeFGmVM2mLaFeNa5Jev7W7TovXqXIG2d39y1KYA== } + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.50.2': + resolution: { integrity: sha512-eFUvvnTYEKeTyHEijQKz81bLrUQOXKZqECeiWH6tb8eXXbZk+CXSG2aFrig2BQ/pjiVRj36zysjgILkqarS2YA== } + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.50.2': + resolution: { integrity: sha512-cBaWmXqyfRhH8zmUxK3d3sAhEWLrtMjWBRwdMMHJIXSjvjLKvv49adxiEz+FJ8AP90apSDDBx2Tyd/WylV6ikA== } + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.50.2': + resolution: { integrity: sha512-APwKy6YUhvZaEoHyM+9xqmTpviEI+9eL7LoCH+aLcvWYHJ663qG5zx7WzWZY+a9qkg5JtzcMyJ9z0WtQBMDmgA== } + cpu: [x64] + os: [win32] + + '@shikijs/core@3.12.0': + resolution: { integrity: sha512-rPfCBd6gHIKBPpf2hKKWn2ISPSrmRKAFi+bYDjvZHpzs3zlksWvEwaF3Z4jnvW+xHxSRef7qDooIJkY0RpA9EA== } + + '@shikijs/core@3.12.2': + resolution: { integrity: sha512-L1Safnhra3tX/oJK5kYHaWmLEBJi1irASwewzY3taX5ibyXyMkkSDZlq01qigjryOBwrXSdFgTiZ3ryzSNeu7Q== } + + '@shikijs/engine-javascript@3.12.0': + resolution: { integrity: sha512-Ni3nm4lnKxyKaDoXQQJYEayX052BL7D0ikU5laHp+ynxPpIF1WIwyhzrMU6WDN7AoAfggVR4Xqx3WN+JTS+BvA== } + + '@shikijs/engine-javascript@3.12.2': + resolution: { integrity: sha512-Nm3/azSsaVS7hk6EwtHEnTythjQfwvrO5tKqMlaH9TwG1P+PNaR8M0EAKZ+GaH2DFwvcr4iSfTveyxMIvXEHMw== } + + '@shikijs/engine-oniguruma@3.12.0': + resolution: { integrity: sha512-IfDl3oXPbJ/Jr2K8mLeQVpnF+FxjAc7ZPDkgr38uEw/Bg3u638neSrpwqOTnTHXt1aU0Fk1/J+/RBdst1kVqLg== } + + '@shikijs/engine-oniguruma@3.12.2': + resolution: { integrity: sha512-hozwnFHsLvujK4/CPVHNo3Bcg2EsnG8krI/ZQ2FlBlCRpPZW4XAEQmEwqegJsypsTAN9ehu2tEYe30lYKSZW/w== } + + '@shikijs/langs@3.12.0': + resolution: { integrity: sha512-HIca0daEySJ8zuy9bdrtcBPhcYBo8wR1dyHk1vKrOuwDsITtZuQeGhEkcEfWc6IDyTcom7LRFCH6P7ljGSCEiQ== } + + '@shikijs/langs@3.12.2': + resolution: { integrity: sha512-bVx5PfuZHDSHoBal+KzJZGheFuyH4qwwcwG/n+MsWno5cTlKmaNtTsGzJpHYQ8YPbB5BdEdKU1rga5/6JGY8ww== } + + '@shikijs/themes@3.12.0': + resolution: { integrity: sha512-/lxvQxSI5s4qZLV/AuFaA4Wt61t/0Oka/P9Lmpr1UV+HydNCczO3DMHOC/CsXCCpbv4Zq8sMD0cDa7mvaVoj0Q== } + + '@shikijs/themes@3.12.2': + resolution: { integrity: sha512-fTR3QAgnwYpfGczpIbzPjlRnxyONJOerguQv1iwpyQZ9QXX4qy/XFQqXlf17XTsorxnHoJGbH/LXBvwtqDsF5A== } + + '@shikijs/types@3.12.0': + resolution: { integrity: sha512-jsFzm8hCeTINC3OCmTZdhR9DOl/foJWplH2Px0bTi4m8z59fnsueLsweX82oGcjRQ7mfQAluQYKGoH2VzsWY4A== } + + '@shikijs/types@3.12.2': + resolution: { integrity: sha512-K5UIBzxCyv0YoxN3LMrKB9zuhp1bV+LgewxuVwHdl4Gz5oePoUFrr9EfgJlGlDeXCU1b/yhdnXeuRvAnz8HN8Q== } + + '@shikijs/vscode-textmate@10.0.2': + resolution: { integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg== } + + '@standard-schema/spec@1.0.0': + resolution: { integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA== } + + '@sveltejs/acorn-typescript@1.0.5': + resolution: { integrity: sha512-IwQk4yfwLdibDlrXVE04jTZYlLnwsTT2PIOQQGNLWfjavGifnk1JD1LcZjZaBTRcxZu2FfPfNLOE04DSu9lqtQ== } + peerDependencies: + acorn: ^8.9.0 + + '@sveltejs/adapter-auto@6.1.0': + resolution: { integrity: sha512-shOuLI5D2s+0zTv2ab5M5PqfknXqWbKi+0UwB9yLTRIdzsK1R93JOO8jNhIYSHdW+IYXIYnLniu+JZqXs7h9Wg== } + peerDependencies: + '@sveltejs/kit': ^2.0.0 + + '@sveltejs/adapter-vercel@5.10.2': + resolution: { integrity: sha512-uWm0jtXbwvXxmELiIXSQ7tcPjlG8roadujxImIxqbKKZ64itZDwTbUsVXYEfUX59LvLjolW9jaODhL6sBTh5NQ== } + peerDependencies: + '@sveltejs/kit': ^2.4.0 + + '@sveltejs/kit@2.37.0': + resolution: { integrity: sha512-xgKtpjQ6Ry4mdShd01ht5AODUsW7+K1iValPDq7QX8zI1hWOKREH9GjG8SRCN5tC4K7UXmMhuQam7gbLByVcnw== } + engines: { node: '>=18.13' } + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.0.0 + '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0 + svelte: ^4.0.0 || ^5.0.0-next.0 + vite: ^5.0.3 || ^6.0.0 || ^7.0.0-beta.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + + '@sveltejs/package@2.5.0': + resolution: { integrity: sha512-qpB91oWEraOXA4l1ldpGtMc/rLCthbf1ACw/1oroKxvT3sd2NXPd/+NLhIk5FCvd0IUSEZGYa86K+D94GWW2Zw== } + engines: { node: ^16.14 || >=18 } + hasBin: true + peerDependencies: + svelte: ^3.44.0 || ^4.0.0 || ^5.0.0-next.1 + + '@sveltejs/vite-plugin-svelte-inspector@4.0.1': + resolution: { integrity: sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw== } + engines: { node: ^18.0.0 || ^20.0.0 || >=22 } + peerDependencies: + '@sveltejs/vite-plugin-svelte': ^5.0.0 + svelte: ^5.0.0 + vite: ^6.0.0 + + '@sveltejs/vite-plugin-svelte-inspector@5.0.1': + resolution: { integrity: sha512-ubWshlMk4bc8mkwWbg6vNvCeT7lGQojE3ijDh3QTR6Zr/R+GXxsGbyH4PExEPpiFmqPhYiVSVmHBjUcVc1JIrA== } + engines: { node: ^20.19 || ^22.12 || >=24 } + peerDependencies: + '@sveltejs/vite-plugin-svelte': ^6.0.0-next.0 + svelte: ^5.0.0 + vite: ^6.3.0 || ^7.0.0 + + '@sveltejs/vite-plugin-svelte@5.1.1': + resolution: { integrity: sha512-Y1Cs7hhTc+a5E9Va/xwKlAJoariQyHY+5zBgCZg4PFWNYQ1nMN9sjK1zhw1gK69DuqVP++sht/1GZg1aRwmAXQ== } + engines: { node: ^18.0.0 || ^20.0.0 || >=22 } + peerDependencies: + svelte: ^5.0.0 + vite: ^6.0.0 + + '@sveltejs/vite-plugin-svelte@6.1.3': + resolution: { integrity: sha512-3pppgIeIZs6nrQLazzKcdnTJ2IWiui/UucEPXKyFG35TKaHQrfkWBnv6hyJcLxFuR90t+LaoecrqTs8rJKWfSQ== } + engines: { node: ^20.19 || ^22.12 || >=24 } + peerDependencies: + svelte: ^5.0.0 + vite: ^6.3.0 || ^7.0.0 + + '@svitejs/changesets-changelog-github.amrom.workers.devpact@1.2.0': + resolution: { integrity: sha512-08eKiDAjj4zLug1taXSIJ0kGL5cawjVCyJkBb6EWSg5fEPX6L+Wtr0CH2If4j5KYylz85iaZiFlUItvgJvll5g== } + engines: { node: ^14.13.1 || ^16.0.0 || >=18 } + + '@swc/helpers@0.5.15': + resolution: { integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g== } + + '@swc/helpers@0.5.17': + resolution: { integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A== } + + '@tailwindcss/forms@0.5.10': + resolution: { integrity: sha512-utI1ONF6uf/pPNO68kmN1b8rEwNXv3czukalo8VtJH8ksIkZXr3Q3VYudZLkCsDd4Wku120uF02hYK25XGPorw== } + peerDependencies: + tailwindcss: '>=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1' + + '@tailwindcss/node@4.1.12': + resolution: { integrity: sha512-3hm9brwvQkZFe++SBt+oLjo4OLDtkvlE8q2WalaD/7QWaeM7KEJbAiY/LJZUaCs7Xa8aUu4xy3uoyX4q54UVdQ== } + + '@tailwindcss/oxide-android-arm64@4.1.12': + resolution: { integrity: sha512-oNY5pq+1gc4T6QVTsZKwZaGpBb2N1H1fsc1GD4o7yinFySqIuRZ2E4NvGasWc6PhYJwGK2+5YT1f9Tp80zUQZQ== } + engines: { node: '>= 10' } + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.1.12': + resolution: { integrity: sha512-cq1qmq2HEtDV9HvZlTtrj671mCdGB93bVY6J29mwCyaMYCP/JaUBXxrQQQm7Qn33AXXASPUb2HFZlWiiHWFytw== } + engines: { node: '>= 10' } + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.1.12': + resolution: { integrity: sha512-6UCsIeFUcBfpangqlXay9Ffty9XhFH1QuUFn0WV83W8lGdX8cD5/+2ONLluALJD5+yJ7k8mVtwy3zMZmzEfbLg== } + engines: { node: '>= 10' } + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.1.12': + resolution: { integrity: sha512-JOH/f7j6+nYXIrHobRYCtoArJdMJh5zy5lr0FV0Qu47MID/vqJAY3r/OElPzx1C/wdT1uS7cPq+xdYYelny1ww== } + engines: { node: '>= 10' } + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.12': + resolution: { integrity: sha512-v4Ghvi9AU1SYgGr3/j38PD8PEe6bRfTnNSUE3YCMIRrrNigCFtHZ2TCm8142X8fcSqHBZBceDx+JlFJEfNg5zQ== } + engines: { node: '>= 10' } + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.12': + resolution: { integrity: sha512-YP5s1LmetL9UsvVAKusHSyPlzSRqYyRB0f+Kl/xcYQSPLEw/BvGfxzbH+ihUciePDjiXwHh+p+qbSP3SlJw+6g== } + engines: { node: '>= 10' } + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@tailwindcss/oxide-linux-arm64-musl@4.1.12': + resolution: { integrity: sha512-V8pAM3s8gsrXcCv6kCHSuwyb/gPsd863iT+v1PGXC4fSL/OJqsKhfK//v8P+w9ThKIoqNbEnsZqNy+WDnwQqCA== } + engines: { node: '>= 10' } + cpu: [arm64] + os: [linux] + libc: [musl] + + '@tailwindcss/oxide-linux-x64-gnu@4.1.12': + resolution: { integrity: sha512-xYfqYLjvm2UQ3TZggTGrwxjYaLB62b1Wiysw/YE3Yqbh86sOMoTn0feF98PonP7LtjsWOWcXEbGqDL7zv0uW8Q== } + engines: { node: '>= 10' } + cpu: [x64] + os: [linux] + libc: [glibc] + + '@tailwindcss/oxide-linux-x64-musl@4.1.12': + resolution: { integrity: sha512-ha0pHPamN+fWZY7GCzz5rKunlv9L5R8kdh+YNvP5awe3LtuXb5nRi/H27GeL2U+TdhDOptU7T6Is7mdwh5Ar3A== } + engines: { node: '>= 10' } + cpu: [x64] + os: [linux] + libc: [musl] + + '@tailwindcss/oxide-wasm32-wasi@4.1.12': + resolution: { integrity: sha512-4tSyu3dW+ktzdEpuk6g49KdEangu3eCYoqPhWNsZgUhyegEda3M9rG0/j1GV/JjVVsj+lG7jWAyrTlLzd/WEBg== } + engines: { node: '>=14.0.0' } + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.12': + resolution: { integrity: sha512-iGLyD/cVP724+FGtMWslhcFyg4xyYyM+5F4hGvKA7eifPkXHRAUDFaimu53fpNg9X8dfP75pXx/zFt/jlNF+lg== } + engines: { node: '>= 10' } + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.1.12': + resolution: { integrity: sha512-NKIh5rzw6CpEodv/++r0hGLlfgT/gFN+5WNdZtvh6wpU2BpGNgdjvj6H2oFc8nCM839QM1YOhjpgbAONUb4IxA== } + engines: { node: '>= 10' } + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.1.12': + resolution: { integrity: sha512-gM5EoKHW/ukmlEtphNwaGx45fGoEmP10v51t9unv55voWh6WrOL19hfuIdo2FjxIaZzw776/BUQg7Pck++cIVw== } + engines: { node: '>= 10' } + + '@tailwindcss/postcss@4.1.12': + resolution: { integrity: sha512-5PpLYhCAwf9SJEeIsSmCDLgyVfdBhdBpzX1OJ87anT9IVR0Z9pjM0FNixCAUAHGnMBGB8K99SwAheXrT0Kh6QQ== } + + '@tailwindcss/vite@4.1.12': + resolution: { integrity: sha512-4pt0AMFDx7gzIrAOIYgYP0KCBuKWqyW8ayrdiLEjoJTT4pKTjrzG/e4uzWtTLDziC+66R9wbUqZBccJalSE5vQ== } + peerDependencies: + vite: ^5.2.0 || ^6 || ^7 + + '@testing-library/dom@10.4.1': + resolution: { integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg== } + engines: { node: '>=18' } + + '@testing-library/jest-dom@6.8.0': + resolution: { integrity: sha512-WgXcWzVM6idy5JaftTVC8Vs83NKRmGJz4Hqs4oyOuO2J4r/y79vvKZsb+CaGyCSEbUPI6OsewfPd0G1A0/TUZQ== } + engines: { node: '>=14', npm: '>=6', yarn: '>=1' } + + '@testing-library/react@16.3.0': + resolution: { integrity: sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw== } + engines: { node: '>=18' } + peerDependencies: + '@testing-library/dom': ^10.0.0 + '@types/react': ^18.0.0 || ^19.0.0 + '@types/react-dom': ^18.0.0 || ^19.0.0 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@testing-library/svelte@5.2.8': + resolution: { integrity: sha512-ucQOtGsJhtawOEtUmbR4rRh53e6RbM1KUluJIXRmh6D4UzxR847iIqqjRtg9mHNFmGQ8Vkam9yVcR5d1mhIHKA== } + engines: { node: '>= 10' } + peerDependencies: + svelte: ^3 || ^4 || ^5 || ^5.0.0-next.0 + vite: '*' + vitest: '*' + peerDependenciesMeta: + vite: + optional: true + vitest: + optional: true + + '@trivago/prettier-plugin-sort-imports@5.2.2': + resolution: { integrity: sha512-fYDQA9e6yTNmA13TLVSA+WMQRc5Bn/c0EUBditUHNfMMxN7M82c38b1kEggVE3pLpZ0FwkwJkUEKMiOi52JXFA== } + engines: { node: '>18.12' } + peerDependencies: + '@vue/compiler-sfc': 3.x + prettier: 2.x - 3.x + prettier-plugin-svelte: 3.x + svelte: 4.x || 5.x + peerDependenciesMeta: + '@vue/compiler-sfc': + optional: true + prettier-plugin-svelte: + optional: true + svelte: + optional: true + + '@trysound/sax@0.2.0': + resolution: { integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== } + engines: { node: '>=10.13.0' } + + '@ts-morph/common@0.27.0': + resolution: { integrity: sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ== } + + '@tybys/wasm-util@0.10.1': + resolution: { integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg== } + + '@types/aria-query@5.0.4': + resolution: { integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw== } + + '@types/aws-lambda@8.10.152': + resolution: { integrity: sha512-soT/c2gYBnT5ygwiHPmd9a1bftj462NWVk2tKCc1PYHSIacB2UwbTS2zYG4jzag1mRDuzg/OjtxQjQ2NKRB6Rw== } + + '@types/babel__core@7.20.5': + resolution: { integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== } + + '@types/babel__generator@7.27.0': + resolution: { integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg== } + + '@types/babel__template@7.4.4': + resolution: { integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== } + + '@types/babel__traverse@7.28.0': + resolution: { integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q== } + + '@types/chai@5.2.2': + resolution: { integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg== } + + '@types/chroma-js@3.1.1': + resolution: { integrity: sha512-SFCr4edNkZ1bGaLzGz7rgR1bRzVX4MmMxwsIa3/Bh6ose8v+hRpneoizHv0KChdjxaXyjRtaMq7sCuZSzPomQA== } + + '@types/cookie@0.6.0': + resolution: { integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA== } + + '@types/debug@4.1.12': + resolution: { integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== } + + '@types/deep-eql@4.0.2': + resolution: { integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw== } + + '@types/estree-jsx@1.0.5': + resolution: { integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg== } + + '@types/estree@1.0.8': + resolution: { integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== } + + '@types/fontkit@2.0.8': + resolution: { integrity: sha512-wN+8bYxIpJf+5oZdrdtaX04qUuWHcKxcDEgRS9Qm9ZClSHjzEn13SxUC+5eRM+4yXIeTYk8mTzLAWGF64847ew== } + + '@types/hast@3.0.4': + resolution: { integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ== } + + '@types/mdast@4.0.4': + resolution: { integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA== } + + '@types/mdx@2.0.13': + resolution: { integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw== } + + '@types/ms@2.1.0': + resolution: { integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA== } + + '@types/nlcst@2.0.3': + resolution: { integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA== } + + '@types/node@12.20.55': + resolution: { integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== } + + '@types/node@18.19.125': + resolution: { integrity: sha512-4TWNu0IxTQcszliYdW2mxrVvhHeERUeDCUwVuvQFn9JCU02kxrUDs8v52yOazPo7wLHKgqEd2FKxlSN6m8Deqg== } + + '@types/node@24.4.0': + resolution: { integrity: sha512-gUuVEAK4/u6F9wRLznPUU4WGUacSEBDPoC2TrBkw3GAnOLHBL45QdfHOXp1kJ4ypBGLxTOB+t7NJLpKoC3gznQ== } + + '@types/node@24.5.0': + resolution: { integrity: sha512-y1dMvuvJspJiPSDZUQ+WMBvF7dpnEqN4x9DDC9ie5Fs/HUZJA3wFp7EhHoVaKX/iI0cRoECV8X2jL8zi0xrHCg== } + + '@types/react-dom@19.1.9': + resolution: { integrity: sha512-qXRuZaOsAdXKFyOhRBg6Lqqc0yay13vN7KrIg4L7N4aaHN68ma9OK3NE1BoDFgFOTfM7zg+3/8+2n8rLUH3OKQ== } + peerDependencies: + '@types/react': ^19.0.0 + + '@types/react@19.1.12': + resolution: { integrity: sha512-cMoR+FoAf/Jyq6+Df2/Z41jISvGZZ2eTlnsaJRptmZ76Caldwy1odD4xTr/gNV9VLj0AWgg/nmkevIyUfIIq5w== } + + '@types/semver@7.7.0': + resolution: { integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA== } + + '@types/tar@6.1.13': + resolution: { integrity: sha512-IznnlmU5f4WcGTh2ltRu/Ijpmk8wiWXfF0VA4s+HPjHZgvFggk1YaIkbo5krX/zUCzWF8N/l4+W/LNxnvAJ8nw== } + + '@types/unist@2.0.11': + resolution: { integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA== } + + '@types/unist@3.0.3': + resolution: { integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q== } + + '@types/yauzl@2.10.3': + resolution: { integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q== } + + '@ungap/structured-clone@1.3.0': + resolution: { integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== } + + '@vercel/nft@0.30.1': + resolution: { integrity: sha512-2mgJZv4AYBFkD/nJ4QmiX5Ymxi+AisPLPcS/KPXVqniyQNqKXX+wjieAbDXQP3HcogfEbpHoRMs49Cd4pfkk8g== } + engines: { node: '>=18' } + hasBin: true + + '@vitejs/plugin-react@4.7.0': + resolution: { integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA== } + engines: { node: ^14.18.0 || >=16.0.0 } + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + + '@vitejs/plugin-react@5.0.2': + resolution: { integrity: sha512-tmyFgixPZCx2+e6VO9TNITWcCQl8+Nl/E8YbAyPVv85QCc7/A3JrdfG2A8gIzvVhWuzMOVrFW1aReaNxrI6tbw== } + engines: { node: ^20.19.0 || >=22.12.0 } + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + + '@vitest/expect@3.2.4': + resolution: { integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig== } + + '@vitest/mocker@3.2.4': + resolution: { integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ== } + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@3.2.4': + resolution: { integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA== } + + '@vitest/runner@3.2.4': + resolution: { integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ== } + + '@vitest/snapshot@3.2.4': + resolution: { integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ== } + + '@vitest/spy@3.2.4': + resolution: { integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw== } + + '@vitest/utils@3.2.4': + resolution: { integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA== } + + '@volar/kit@2.4.23': + resolution: { integrity: sha512-YuUIzo9zwC2IkN7FStIcVl1YS9w5vkSFEZfPvnu0IbIMaR9WHhc9ZxvlT+91vrcSoRY469H2jwbrGqpG7m1KaQ== } + peerDependencies: + typescript: '*' + + '@volar/language-core@2.4.23': + resolution: { integrity: sha512-hEEd5ET/oSmBC6pi1j6NaNYRWoAiDhINbT8rmwtINugR39loROSlufGdYMF9TaKGfz+ViGs1Idi3mAhnuPcoGQ== } + + '@volar/language-server@2.4.23': + resolution: { integrity: sha512-k0iO+tybMGMMyrNdWOxgFkP0XJTdbH0w+WZlM54RzJU3WZSjHEupwL30klpM7ep4FO6qyQa03h+VcGHD4Q8gEg== } + + '@volar/language-service@2.4.23': + resolution: { integrity: sha512-h5mU9DZ/6u3LCB9xomJtorNG6awBNnk9VuCioGsp6UtFiM8amvS5FcsaC3dabdL9zO0z+Gq9vIEMb/5u9K6jGQ== } + + '@volar/source-map@2.4.23': + resolution: { integrity: sha512-Z1Uc8IB57Lm6k7q6KIDu/p+JWtf3xsXJqAX/5r18hYOTpJyBn0KXUR8oTJ4WFYOcDzWC9n3IflGgHowx6U6z9Q== } + + '@volar/typescript@2.4.23': + resolution: { integrity: sha512-lAB5zJghWxVPqfcStmAP1ZqQacMpe90UrP5RJ3arDyrhy4aCUQqmxPPLB2PWDKugvylmO41ljK7vZ+t6INMTag== } + + '@vscode/emmet-helper@2.11.0': + resolution: { integrity: sha512-QLxjQR3imPZPQltfbWRnHU6JecWTF1QSWhx3GAKQpslx7y3Dp6sIIXhKjiUJ/BR9FX8PVthjr9PD6pNwOJfAzw== } + + '@vscode/l10n@0.0.18': + resolution: { integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ== } + + '@zag-js/accordion@1.24.2': + resolution: { integrity: sha512-sGNhbWR85oAiMyQLk+dliRhNQGP59T56M1gAkQ7bwJJZ7l++hFEQpYcr/FbAHJshXWpvUKm0wV18wHR/56Y30w== } + + '@zag-js/anatomy@1.24.2': + resolution: { integrity: sha512-qWmxopxVHMjP9UGoUdxqKtrot8MaU0UvoJWh0O03b9eOPgLwMydkcwuGAc8s3x6GDREu3D3GvcRgrQ5JteITjg== } + + '@zag-js/aria-hidden@1.24.2': + resolution: { integrity: sha512-btbVDdfHq2wcvV2KmpBlkKN+36XIMkXTIy7zvQniBQ/V6X5WGKBaXGvllqrLLaJVU2HmnhM/IYUBQW4H0BLWBA== } + + '@zag-js/auto-resize@1.24.2': + resolution: { integrity: sha512-oOzFY+4mif6PXpVMR+db8+b33C8uplAkiuDwZhNEaQDj97S4kxySlQkFovbmY55DYAlBRguaQKXjn0pboqwIqA== } + + '@zag-js/avatar@1.24.2': + resolution: { integrity: sha512-qSqJQLjscmWCMPosWKoTwSdFL6/hHyLeBAL4iyLcVby5Y7tz4o3u5zjkcLGPoZTH1DxicwEDBaTkONHvMthaLw== } + + '@zag-js/collection@1.24.2': + resolution: { integrity: sha512-vqNnn9nAmz5lz8pHhvjNdCrPHj76aZpoaRFe7DQdcnwlrbNjASUKPiN4lG5ZgspOMnQqZ0teR4fyjaCa+cH+xQ== } + + '@zag-js/combobox@1.24.2': + resolution: { integrity: sha512-o/jkby5ry4IUAm8GT04RbMdd3r8xk7RTAdnNRdvv4R8ZJtaDDL+wJVFq5ITeFhtnvmAl3GD+Isn2kJ3fut0fHQ== } + + '@zag-js/core@1.24.2': + resolution: { integrity: sha512-LBJBNpaEixfIKLjyfcuudTdtnVJmj60iLK9flI3D7BeziU/nGu3CsNxh0miLCR2Sdl7jFEseyGrK7HLhTaRMLw== } + + '@zag-js/dialog@1.24.2': + resolution: { integrity: sha512-70dvyikN/f3qqhI9mGB23oMGeTmjjZmhy5ZXDCwNL1ZmZ0SnGB3QdsHEa/DDyoXC2qSO8XhOUgEp3hNukXujXA== } + + '@zag-js/dismissable@1.24.2': + resolution: { integrity: sha512-POmhCyjm8cRIThuK3icXjt9ic3OrYjN3N0jQ7uT5xAitX5eyGR+Tb7Mdf5J1R6iuX19t0t6ova+h3XIx6YDWHQ== } + + '@zag-js/dom-query@1.24.2': + resolution: { integrity: sha512-CrjxXni9S9sxuz64uveHDGsvXcZPuN8ydg5+UFZh0MTXCCpS2nFdSWJ1ZN4uyak+X0CdyIEvvbzdxmEhBi33dQ== } + + '@zag-js/file-upload@1.24.2': + resolution: { integrity: sha512-hQHTwbAXDYOjLatRDcoLY8nrxDrctiIMWnzQmbz/53PYbfH5i93KGM7SvUwWX1Zvfwp5IVwpkLA7ARWGNqDOUQ== } + + '@zag-js/file-utils@1.24.2': + resolution: { integrity: sha512-feQ9nMOZwuGae2VXyFGbqzb5DEej2Eo498o2KZVHmyA216vVx1ZOQpTsVrrvJV8KRxS6ULoKZNGe5QuHfwBWYg== } + + '@zag-js/focus-trap@1.24.2': + resolution: { integrity: sha512-ztqxOaB7Z8zOZH4HvHnMpKREhrTAcJICRmHgwx1Dfq5SqymlMBnFD0zwS/F0mlbZqzz9eV9yYLAd1Xy54OdeGw== } + + '@zag-js/focus-visible@1.24.2': + resolution: { integrity: sha512-/A8CEy+2w0xCTIbDuCB4nfdBxgVQYP6oaFb1zmYXmf8HWFlSXDxuUXb1oXrA3vaoNG/X8sJJilpacYdV1dVhxg== } + + '@zag-js/i18n-utils@1.24.2': + resolution: { integrity: sha512-4Y9w7WDJpfy17SI3Ey9h3FZ448KsfqmFu7BshsWWCPJTGAPvkomZurpiU6CHc1sk+v2YKvUKqnJ2jj9aUu4PGw== } + + '@zag-js/interact-outside@1.24.2': + resolution: { integrity: sha512-/DH1b58szQgTqz3fL+cbg51X94DohahPkuCgiGs6wdPK3JwMFlPJHkmU3SDUXQJTpwLOsDIqMVq9sO4jo7fiGg== } + + '@zag-js/live-region@1.24.2': + resolution: { integrity: sha512-X5gp7m5/o7VeQ8hI2ffi9nEVkdCDcCw5wtSx9gFww6WeD6HJMkY/4HbTdi7ALvGVg9gNIMr5F9zrrzpvgc9DXg== } + + '@zag-js/popover@1.24.2': + resolution: { integrity: sha512-BBMBxjMTfeDHCg0wg8ohStk6MPTrmCa0PuOSNDeK0Mr/0i0Vv0EjsSiXuu5Wt1LS237XV1BIaLxt322dW+RfVg== } + + '@zag-js/popper@1.24.2': + resolution: { integrity: sha512-rimqYBOcM5Aj0AntZFIS2hXv96/QnVASIhFx4GoaiHd3DxadMdJVZ3EsKC1JSNveFEjS/0z7IuuAATTF5x61kQ== } + + '@zag-js/progress@1.24.2': + resolution: { integrity: sha512-8A8Cy7b+EOYxoR0tVXa0RiNBVNVcVtWP875QrA5D1/Hj4KnAkj3W3Ee5NOicpRKkORCELHRy5fRcDTUzbsjeRQ== } + + '@zag-js/radio-group@1.24.2': + resolution: { integrity: sha512-ffPeO+P4RvNoGoM1ZsBoiIwJ4zKXbhm8QuHMdKRl34A4TzipzHC2ppAq1cIZ7q+ZubefH0QtZbsvmz1pAo0Z3w== } + + '@zag-js/rating-group@1.24.2': + resolution: { integrity: sha512-ZpKayCuPX7ysiZWv+JlNIWnPtflSJlJ5C9lHozTtFqCvyELp5ZAtoO5EQN5cM+aVJe2RNgNsMQf37Fmdv4XaiA== } + + '@zag-js/react@1.24.2': + resolution: { integrity: sha512-s6wV2gzd7AIndJ7rrkka+M3OAuKqUqak3xRj/Q6fZdtq2fBY5n6DupcQLCkFoj6eJhp8LUfFO70D7Z71Jvk57w== } + peerDependencies: + react: '>=18.0.0' + react-dom: '>=18.0.0' + + '@zag-js/remove-scroll@1.24.2': + resolution: { integrity: sha512-PLXXBw3NxVAfm7MbNnM0TVlv70Kn+xYFEbKxUBWhD0d/qoqsKJV/xS7N4yO5QPZg9UgXMvtRDtINGWoJvyuAlw== } + + '@zag-js/slider@1.24.2': + resolution: { integrity: sha512-QxdSIRW96lPT/zJS/1pr2aj1rGujXBZ2ypUyb6JYZizFG55cZtmJqjJaZ81jU251peLuTdhug34C52vAvXyFZA== } + + '@zag-js/store@1.24.2': + resolution: { integrity: sha512-PZViq7LD4y+6iEB/0tvbqywoEccNXGy6jcOGIg5lwdY0CiPulPMeoLFi0+Etx1/Wom398NqlzecPqT4ZbICYMQ== } + + '@zag-js/svelte@1.24.2': + resolution: { integrity: sha512-30zRVZK4E3NCuvgSHu+X9q9Yz6G72B590xaNeJK0BFtY8nLOLu2IKw1WQLR3Bw1hzlGZ/2Zf6MCsDTljw/AkRA== } + peerDependencies: + svelte: '>=5' + + '@zag-js/switch@1.24.2': + resolution: { integrity: sha512-NRyWy43Npzjwc15flHRB6eVqKPeu7uw4pjdfmTjhj87185ZM/VYDEQHC6G+teXvl+4LW19QV9aDcTAzg1g5bbg== } + + '@zag-js/tabs@1.24.2': + resolution: { integrity: sha512-UCVfUSDlIk+EAL0kgDkWZAj55PSRUXVAhuqqlDnB8t3GO9UsvmxG93US7wEQglpYBydyPqUpDpmpNUs16egd/Q== } + + '@zag-js/tags-input@1.24.2': + resolution: { integrity: sha512-zl9DffAvHdTY11Qdm4rowG5TMNLCreJ/dOqj4nTxoLV2xYAzVAgejgxKzv0jbB11/GiuT6omcslVcoCh5w/hRw== } + + '@zag-js/toast@1.24.2': + resolution: { integrity: sha512-mH9iVrAr8asJZNNSWsrCSmtCfzn/aC64fVU610B/pHOiDY6HN0ANYmC+TgSZ29a3Jlts1OTZiKsygWyBuJQ3Og== } + + '@zag-js/tooltip@1.24.2': + resolution: { integrity: sha512-GYjoZkCR9UMPutaJa24LnUrZSWnFfXbuiLoUPlp8Xg+HkVSM25zOe7IgiNgvXqf9shp7dE0AaVnXiuDjjdDm1w== } + + '@zag-js/types@1.24.2': + resolution: { integrity: sha512-sXL8JHx8yrj8qGwCl/EhydaHoCCEfYwbg1rPWcCwqrpkvhic0KEZAJZMUhcU4dLdx+Oajbv2QeFz6Fk5U2Nn5A== } + + '@zag-js/utils@1.24.2': + resolution: { integrity: sha512-3U8aYXjktpDmQV4M7nAOj7E4x1XSifG7PrbHqJbTYRm7/EPbwCQEEDPckkkWBmj4UrvltbkXPi6nzcP4Qpw5bA== } + + abbrev@3.0.1: + resolution: { integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg== } + engines: { node: ^18.17.0 || >=20.5.0 } + + acorn-import-attributes@1.9.5: + resolution: { integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ== } + peerDependencies: + acorn: ^8 + + acorn-jsx@5.3.2: + resolution: { integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== } + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.15.0: + resolution: { integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== } + engines: { node: '>=0.4.0' } + hasBin: true + + agent-base@7.1.4: + resolution: { integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ== } + engines: { node: '>= 14' } + + ajv@8.17.1: + resolution: { integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== } + + ansi-align@3.0.1: + resolution: { integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== } + + ansi-colors@4.1.3: + resolution: { integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== } + engines: { node: '>=6' } + + ansi-regex@5.0.1: + resolution: { integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== } + engines: { node: '>=8' } + + ansi-regex@6.2.2: + resolution: { integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg== } + engines: { node: '>=12' } + + ansi-styles@4.3.0: + resolution: { integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== } + engines: { node: '>=8' } + + ansi-styles@5.2.0: + resolution: { integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== } + engines: { node: '>=10' } + + ansi-styles@6.2.3: + resolution: { integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg== } + engines: { node: '>=12' } + + ansis@4.1.0: + resolution: { integrity: sha512-BGcItUBWSMRgOCe+SVZJ+S7yTRG0eGt9cXAHev72yuGcY23hnLA7Bky5L/xLyPINoSN95geovfBkqoTlNZYa7w== } + engines: { node: '>=14' } + + anymatch@3.1.3: + resolution: { integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== } + engines: { node: '>= 8' } + + argparse@1.0.10: + resolution: { integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== } + + argparse@2.0.1: + resolution: { integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== } + + aria-query@5.3.0: + resolution: { integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== } + + aria-query@5.3.2: + resolution: { integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw== } + engines: { node: '>= 0.4' } + + array-iterate@2.0.1: + resolution: { integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg== } + + array-union@2.1.0: + resolution: { integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== } + engines: { node: '>=8' } + + assertion-error@2.0.1: + resolution: { integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA== } + engines: { node: '>=12' } + + ast-kit@2.1.2: + resolution: { integrity: sha512-cl76xfBQM6pztbrFWRnxbrDm9EOqDr1BF6+qQnnDZG2Co2LjyUktkN9GTJfBAfdae+DbT2nJf2nCGAdDDN7W2g== } + engines: { node: '>=20.18.0' } + + astring@1.9.0: + resolution: { integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg== } + hasBin: true + + astro-auto-import@0.4.4: + resolution: { integrity: sha512-tiYe1hp+VusdiyaD3INgZgbvXEPamDFiURnQR5Niz+E9fWa6IHYjJ99TwGlHh/evfaXE/U/86jp9MRKWTuJU1A== } + engines: { node: '>=16.0.0' } + peerDependencies: + astro: ^2.0.0 || ^3.0.0-beta || ^4.0.0-beta || ^5.0.0-beta + + astro-expressive-code@0.41.3: + resolution: { integrity: sha512-u+zHMqo/QNLE2eqYRCrK3+XMlKakv33Bzuz+56V1gs8H0y6TZ0hIi3VNbIxeTn51NLn+mJfUV/A0kMNfE4rANw== } + peerDependencies: + astro: ^4.0.0-beta || ^5.0.0-beta || ^3.3.0 + + astro-icon@1.1.5: + resolution: { integrity: sha512-CJYS5nWOw9jz4RpGWmzNQY7D0y2ZZacH7atL2K9DeJXJVaz7/5WrxeyIxO8KASk1jCM96Q4LjRx/F3R+InjJrw== } + + astro@5.13.5: + resolution: { integrity: sha512-XmBzkl13XU97+n/QiOM5uXQdAVe0yKt5gO+Wlgc8dHRwHR499qhMQ5sMFckLJweUINLzcNGjP3F5nG4wV8a2XA== } + engines: { node: 18.20.8 || ^20.3.0 || >=22.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0' } + hasBin: true + + async-sema@3.1.1: + resolution: { integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg== } + + asynckit@0.4.0: + resolution: { integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== } + + autoprefixer@10.4.21: + resolution: { integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ== } + engines: { node: ^10 || ^12 || >=14 } + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + await-lock@2.2.2: + resolution: { integrity: sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw== } + + axios@1.12.2: + resolution: { integrity: sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw== } + + axobject-query@4.1.0: + resolution: { integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ== } + engines: { node: '>= 0.4' } + + bail@2.0.2: + resolution: { integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw== } + + balanced-match@1.0.2: + resolution: { integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== } + + base-64@1.0.0: + resolution: { integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg== } + + base64-js@1.5.1: + resolution: { integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== } + + baseline-browser-mapping@2.8.4: + resolution: { integrity: sha512-L+YvJwGAgwJBV1p6ffpSTa2KRc69EeeYGYjRVWKs0GKrK+LON0GC0gV+rKSNtALEDvMDqkvCFq9r1r94/Gjwxw== } + hasBin: true + + bcp-47-match@2.0.3: + resolution: { integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ== } + + before-after-hook@4.0.0: + resolution: { integrity: sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ== } + + better-path-resolve@1.0.0: + resolution: { integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g== } + engines: { node: '>=4' } + + bindings@1.5.0: + resolution: { integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== } + + birpc@2.5.0: + resolution: { integrity: sha512-VSWO/W6nNQdyP520F1mhf+Lc2f8pjGQOtoHHm7Ze8Go1kX7akpVIrtTa0fn+HB0QJEDVacl6aO08YE0PgXfdnQ== } + + blob-to-buffer@1.2.9: + resolution: { integrity: sha512-BF033y5fN6OCofD3vgHmNtwZWRcq9NLyyxyILx9hfMy1sXYy4ojFl765hJ2lP0YaN2fuxPaLO2Vzzoxy0FLFFA== } + + boolbase@1.0.0: + resolution: { integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== } + + bottleneck@2.19.5: + resolution: { integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw== } + + boxen@8.0.1: + resolution: { integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw== } + engines: { node: '>=18' } + + brace-expansion@2.0.2: + resolution: { integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ== } + + braces@3.0.3: + resolution: { integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== } + engines: { node: '>=8' } + + brotli@1.3.3: + resolution: { integrity: sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg== } + + browserslist@4.26.2: + resolution: { integrity: sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A== } + engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } + hasBin: true + + buffer-builder@0.2.0: + resolution: { integrity: sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg== } + + buffer-crc32@0.2.13: + resolution: { integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== } + + cac@6.7.14: + resolution: { integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== } + engines: { node: '>=8' } + + call-bind-apply-helpers@1.0.2: + resolution: { integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== } + engines: { node: '>= 0.4' } + + camelcase@8.0.0: + resolution: { integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA== } + engines: { node: '>=16' } + + caniuse-lite@1.0.30001743: + resolution: { integrity: sha512-e6Ojr7RV14Un7dz6ASD0aZDmQPT/A+eZU+nuTNfjqmRrmkmQlnTNWH0SKmqagx9PeW87UVqapSurtAXifmtdmw== } + + ccount@2.0.1: + resolution: { integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== } + + chai@5.3.3: + resolution: { integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw== } + engines: { node: '>=18' } + + chalk@5.6.2: + resolution: { integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA== } + engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } + + character-entities-html4@2.1.0: + resolution: { integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA== } + + character-entities-legacy@3.0.0: + resolution: { integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ== } + + character-entities@2.0.2: + resolution: { integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== } + + character-reference-invalid@2.0.1: + resolution: { integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw== } + + chardet@2.1.0: + resolution: { integrity: sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA== } + + check-error@2.1.1: + resolution: { integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw== } + engines: { node: '>= 16' } + + cheerio-select@2.1.0: + resolution: { integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g== } + + cheerio@1.0.0: + resolution: { integrity: sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww== } + engines: { node: '>=18.17' } + + chokidar@4.0.3: + resolution: { integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== } + engines: { node: '>= 14.16.0' } + + chownr@2.0.0: + resolution: { integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== } + engines: { node: '>=10' } + + chownr@3.0.0: + resolution: { integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g== } + engines: { node: '>=18' } + + chroma-js@3.1.2: + resolution: { integrity: sha512-IJnETTalXbsLx1eKEgx19d5L6SRM7cH4vINw/99p/M11HCuXGRWL+6YmCm7FWFGIo6dtWuQoQi1dc5yQ7ESIHg== } + + ci-info@3.9.0: + resolution: { integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== } + engines: { node: '>=8' } + + ci-info@4.3.0: + resolution: { integrity: sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ== } + engines: { node: '>=8' } + + cli-boxes@3.0.0: + resolution: { integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g== } + engines: { node: '>=10' } + + client-only@0.0.1: + resolution: { integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== } + + cliui@8.0.1: + resolution: { integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== } + engines: { node: '>=12' } + + clone@2.1.2: + resolution: { integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w== } + engines: { node: '>=0.8' } + + clsx@2.1.1: + resolution: { integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== } + engines: { node: '>=6' } + + code-block-writer@13.0.3: + resolution: { integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg== } + + collapse-white-space@2.1.0: + resolution: { integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw== } + + color-convert@2.0.1: + resolution: { integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== } + engines: { node: '>=7.0.0' } + + color-name@1.1.4: + resolution: { integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== } + + color-string@1.9.1: + resolution: { integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== } + + color@4.2.3: + resolution: { integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== } + engines: { node: '>=12.5.0' } + + colorette@2.0.20: + resolution: { integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== } + + colorjs.io@0.5.2: + resolution: { integrity: sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw== } + + combined-stream@1.0.8: + resolution: { integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== } + engines: { node: '>= 0.8' } + + comma-separated-tokens@2.0.3: + resolution: { integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== } + + commander@14.0.0: + resolution: { integrity: sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA== } + engines: { node: '>=20' } + + commander@7.2.0: + resolution: { integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== } + engines: { node: '>= 10' } + + common-ancestor-path@1.0.1: + resolution: { integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w== } + + confbox@0.1.8: + resolution: { integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w== } + + confbox@0.2.2: + resolution: { integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ== } + + config-chain@1.1.13: + resolution: { integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== } + + consola@3.4.2: + resolution: { integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA== } + engines: { node: ^14.18.0 || >=16.10.0 } + + convert-source-map@2.0.0: + resolution: { integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== } + + cookie-es@1.2.2: + resolution: { integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg== } + + cookie@0.6.0: + resolution: { integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== } + engines: { node: '>= 0.6' } + + cookie@1.0.2: + resolution: { integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA== } + engines: { node: '>=18' } + + cross-fetch@3.2.0: + resolution: { integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q== } + + cross-spawn@7.0.6: + resolution: { integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== } + engines: { node: '>= 8' } + + crossws@0.3.5: + resolution: { integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA== } + + css-select@5.2.2: + resolution: { integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw== } + + css-selector-parser@3.1.3: + resolution: { integrity: sha512-gJMigczVZqYAk0hPVzx/M4Hm1D9QOtqkdQk9005TNzDIUGzo5cnHEDiKUT7jGPximL/oYb+LIitcHFQ4aKupxg== } + + css-tree@2.2.1: + resolution: { integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA== } + engines: { node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0' } + + 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 } + + css-tree@3.1.0: + resolution: { integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w== } + engines: { node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0 } + + css-what@6.2.2: + resolution: { integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA== } + engines: { node: '>= 6' } + + css.escape@1.5.1: + resolution: { integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg== } + + cssesc@3.0.0: + resolution: { integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== } + engines: { node: '>=4' } + hasBin: true + + csso@5.0.5: + resolution: { integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ== } + engines: { node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0' } + + cssstyle@4.6.0: + resolution: { integrity: sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg== } + engines: { node: '>=18' } + + csstype@3.1.3: + resolution: { integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== } + + data-urls@5.0.0: + resolution: { integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg== } + engines: { node: '>=18' } + + dataloader@1.4.0: + resolution: { integrity: sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw== } + + debug@4.4.3: + resolution: { integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== } + engines: { node: '>=6.0' } + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decimal.js@10.6.0: + resolution: { integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg== } + + decode-named-character-reference@1.2.0: + resolution: { integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q== } + + dedent-js@1.0.1: + resolution: { integrity: sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ== } + + deep-eql@5.0.2: + resolution: { integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q== } + engines: { node: '>=6' } + + deep-extend@0.6.0: + resolution: { integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== } + engines: { node: '>=4.0.0' } + + deepmerge@4.3.1: + resolution: { integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== } + engines: { node: '>=0.10.0' } + + defu@6.1.4: + resolution: { integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg== } + + delayed-stream@1.0.0: + resolution: { integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== } + engines: { node: '>=0.4.0' } + + dequal@2.0.3: + resolution: { integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== } + engines: { node: '>=6' } + + destr@2.0.5: + resolution: { integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA== } + + detect-indent@6.1.0: + resolution: { integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== } + engines: { node: '>=8' } + + detect-indent@7.0.1: + resolution: { integrity: sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g== } + engines: { node: '>=12.20' } + + detect-libc@1.0.3: + resolution: { integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== } + engines: { node: '>=0.10' } + hasBin: true + + detect-libc@2.1.0: + resolution: { integrity: sha512-vEtk+OcP7VBRtQZ1EJ3bdgzSfBjgnEalLTp5zjJrS+2Z1w2KZly4SBdac/WDU3hhsNAZ9E8SC96ME4Ey8MZ7cg== } + engines: { node: '>=8' } + + deterministic-object-hash@2.0.2: + resolution: { integrity: sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ== } + engines: { node: '>=18' } + + devalue@5.3.2: + resolution: { integrity: sha512-UDsjUbpQn9kvm68slnrs+mfxwFkIflOhkanmyabZ8zOYk8SMEIbJ3TK+88g70hSIeytu4y18f0z/hYHMTrXIWw== } + + devlop@1.1.0: + resolution: { integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA== } + + dfa@1.2.0: + resolution: { integrity: sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q== } + + diff@5.2.0: + resolution: { integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== } + engines: { node: '>=0.3.1' } + + diff@8.0.2: + resolution: { integrity: sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg== } + engines: { node: '>=0.3.1' } + + dir-glob@3.0.1: + resolution: { integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== } + engines: { node: '>=8' } + + direction@2.0.1: + resolution: { integrity: sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA== } + hasBin: true + + dlv@1.1.3: + resolution: { integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== } + + dom-accessibility-api@0.5.16: + resolution: { integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg== } + + dom-accessibility-api@0.6.3: + resolution: { integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w== } + + dom-serializer@2.0.0: + resolution: { integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== } + + domelementtype@2.3.0: + resolution: { integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== } + + domhandler@5.0.3: + resolution: { integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== } + engines: { node: '>= 4' } + + domutils@3.2.2: + resolution: { integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw== } + + dotenv@16.6.1: + resolution: { integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow== } + engines: { node: '>=12' } + + dset@3.1.4: + resolution: { integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA== } + engines: { node: '>=4' } + + dts-resolver@2.1.2: + resolution: { integrity: sha512-xeXHBQkn2ISSXxbJWD828PFjtyg+/UrMDo7W4Ffcs7+YWCquxU8YjV1KoxuiL+eJ5pg3ll+bC6flVv61L3LKZg== } + engines: { node: '>=20.18.0' } + peerDependencies: + oxc-resolver: '>=11.0.0' + peerDependenciesMeta: + oxc-resolver: + optional: true + + dunder-proto@1.0.1: + resolution: { integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== } + engines: { node: '>= 0.4' } + + eastasianwidth@0.2.0: + resolution: { integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== } + + electron-to-chromium@1.5.218: + resolution: { integrity: sha512-uwwdN0TUHs8u6iRgN8vKeWZMRll4gBkz+QMqdS7DDe49uiK68/UX92lFb61oiFPrpYZNeZIqa4bA7O6Aiasnzg== } + + emmet@2.4.11: + resolution: { integrity: sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ== } + + emoji-regex@10.5.0: + resolution: { integrity: sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg== } + + emoji-regex@8.0.0: + resolution: { integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== } + + emoji-regex@9.2.2: + resolution: { integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== } + + empathic@2.0.0: + resolution: { integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA== } + engines: { node: '>=14' } + + encoding-sniffer@0.2.1: + resolution: { integrity: sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw== } + + end-of-stream@1.4.5: + resolution: { integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg== } + + enhanced-resolve@5.18.3: + resolution: { integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww== } + engines: { node: '>=10.13.0' } + + enquirer@2.4.1: + resolution: { integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== } + engines: { node: '>=8.6' } + + entities@4.5.0: + resolution: { integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== } + engines: { node: '>=0.12' } + + entities@6.0.1: + resolution: { integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g== } + engines: { node: '>=0.12' } + + es-define-property@1.0.1: + resolution: { integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== } + engines: { node: '>= 0.4' } + + es-errors@1.3.0: + resolution: { integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== } + engines: { node: '>= 0.4' } + + es-module-lexer@1.7.0: + resolution: { integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA== } + + es-object-atoms@1.1.1: + resolution: { integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== } + engines: { node: '>= 0.4' } + + es-set-tostringtag@2.1.0: + resolution: { integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== } + engines: { node: '>= 0.4' } + + esast-util-from-estree@2.0.0: + resolution: { integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ== } + + esast-util-from-js@2.0.1: + resolution: { integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw== } + + esbuild@0.25.9: + resolution: { integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g== } + engines: { node: '>=18' } + hasBin: true + + escalade@3.2.0: + resolution: { integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== } + engines: { node: '>=6' } + + escape-string-regexp@5.0.0: + resolution: { integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== } + engines: { node: '>=12' } + + esm-env@1.2.2: + resolution: { integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA== } + + esprima@4.0.1: + resolution: { integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== } + engines: { node: '>=4' } + hasBin: true + + esrap@2.1.0: + resolution: { integrity: sha512-yzmPNpl7TBbMRC5Lj2JlJZNPml0tzqoqP5B1JXycNUwtqma9AKCO0M2wHrdgsHcy1WRW7S9rJknAMtByg3usgA== } + + estree-util-attach-comments@3.0.0: + resolution: { integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw== } + + estree-util-build-jsx@3.0.1: + resolution: { integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ== } + + estree-util-is-identifier-name@3.0.0: + resolution: { integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg== } + + estree-util-scope@1.0.0: + resolution: { integrity: sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ== } + + estree-util-to-js@2.0.0: + resolution: { integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg== } + + estree-util-visit@2.0.0: + resolution: { integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww== } + + estree-walker@2.0.2: + resolution: { integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== } + + estree-walker@3.0.3: + resolution: { integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== } + + eventemitter3@5.0.1: + resolution: { integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== } + + expect-type@1.2.2: + resolution: { integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA== } + engines: { node: '>=12.0.0' } + + expressive-code@0.41.3: + resolution: { integrity: sha512-YLnD62jfgBZYrXIPQcJ0a51Afv9h8VlWqEGK9uU2T5nL/5rb8SnA86+7+mgCZe5D34Tff5RNEA5hjNVJYHzrFg== } + + exsolve@1.0.7: + resolution: { integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw== } + + extend@3.0.2: + resolution: { integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== } + + extendable-error@0.1.7: + resolution: { integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg== } + + extract-zip@2.0.1: + resolution: { integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== } + engines: { node: '>= 10.17.0' } + hasBin: true + + fast-content-type-parse@3.0.0: + resolution: { integrity: sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg== } + + fast-deep-equal@3.1.3: + resolution: { integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== } + + fast-glob@3.3.3: + resolution: { integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== } + engines: { node: '>=8.6.0' } + + fast-uri@3.1.0: + resolution: { integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA== } + + fastq@1.19.1: + resolution: { integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ== } + + fd-slicer@1.1.0: + resolution: { integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== } + + fdir@6.5.0: + resolution: { integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== } + engines: { node: '>=12.0.0' } + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + file-uri-to-path@1.0.0: + resolution: { integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== } + + fill-range@7.1.1: + resolution: { integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== } + engines: { node: '>=8' } + + find-up@4.1.0: + resolution: { integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== } + engines: { node: '>=8' } + + flattie@1.1.1: + resolution: { integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ== } + engines: { node: '>=8' } + + follow-redirects@1.15.11: + resolution: { integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ== } + engines: { node: '>=4.0' } + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + fontace@0.3.0: + resolution: { integrity: sha512-czoqATrcnxgWb/nAkfyIrRp6Q8biYj7nGnL6zfhTcX+JKKpWHFBnb8uNMw/kZr7u++3Y3wYSYoZgHkCcsuBpBg== } + + fontkit@2.0.4: + resolution: { integrity: sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g== } + + foreground-child@3.3.1: + resolution: { integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw== } + engines: { node: '>=14' } + + form-data@4.0.4: + resolution: { integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow== } + engines: { node: '>= 6' } + + fraction.js@4.3.7: + resolution: { integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== } + + fs-extra@7.0.1: + resolution: { integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== } + engines: { node: '>=6 <7 || >=8' } + + fs-extra@8.1.0: + resolution: { integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== } + engines: { node: '>=6 <7 || >=8' } + + fs-minipass@2.1.0: + resolution: { integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== } + engines: { node: '>= 8' } + + fsevents@2.3.3: + resolution: { integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== } + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } + os: [darwin] + + function-bind@1.1.2: + resolution: { integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== } + + fuse.js@7.1.0: + resolution: { integrity: sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ== } + engines: { node: '>=10' } + + gensync@1.0.0-beta.2: + resolution: { integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== } + engines: { node: '>=6.9.0' } + + get-caller-file@2.0.5: + resolution: { integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== } + engines: { node: 6.* || 8.* || >= 10.* } + + get-east-asian-width@1.4.0: + resolution: { integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q== } + engines: { node: '>=18' } + + get-intrinsic@1.3.0: + resolution: { integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== } + engines: { node: '>= 0.4' } + + get-proto@1.0.1: + resolution: { integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== } + engines: { node: '>= 0.4' } + + get-stream@5.2.0: + resolution: { integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== } + engines: { node: '>=8' } + + get-tsconfig@4.10.1: + resolution: { integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ== } + + github-slugger@2.0.0: + resolution: { integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw== } + + glob-parent@5.1.2: + resolution: { integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== } + engines: { node: '>= 6' } + + glob@10.4.5: + resolution: { integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== } + hasBin: true + + globals@15.15.0: + resolution: { integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg== } + engines: { node: '>=18' } + + globby@11.1.0: + resolution: { integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== } + engines: { node: '>=10' } + + goober@2.1.16: + resolution: { integrity: sha512-erjk19y1U33+XAMe1VTvIONHYoSqE4iS7BYUZfHaqeohLmnC0FdxEh7rQU+6MZ4OajItzjZFSRtVANrQwNq6/g== } + peerDependencies: + csstype: ^3.0.10 + + gopd@1.2.0: + resolution: { integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== } + engines: { node: '>= 0.4' } + + graceful-fs@4.2.10: + resolution: { integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== } + + graceful-fs@4.2.11: + resolution: { integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== } + + graphemer@1.4.0: + resolution: { integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== } + + h3@1.15.4: + resolution: { integrity: sha512-z5cFQWDffyOe4vQ9xIqNfCZdV4p//vy6fBnr8Q1AWnVZ0teurKMG66rLj++TKwKPUP3u7iMUvrvKaEUiQw2QWQ== } + + has-flag@4.0.0: + resolution: { integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== } + engines: { node: '>=8' } + + has-symbols@1.1.0: + resolution: { integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== } + engines: { node: '>= 0.4' } + + has-tostringtag@1.0.2: + resolution: { integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== } + engines: { node: '>= 0.4' } + + hasown@2.0.2: + resolution: { integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== } + engines: { node: '>= 0.4' } + + hast-util-from-html@2.0.3: + resolution: { integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw== } + + hast-util-from-parse5@8.0.3: + resolution: { integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg== } + + hast-util-has-property@3.0.0: + resolution: { integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA== } + + hast-util-is-element@3.0.0: + resolution: { integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g== } + + hast-util-parse-selector@4.0.0: + resolution: { integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A== } + + hast-util-raw@9.1.0: + resolution: { integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw== } + + hast-util-select@6.0.4: + resolution: { integrity: sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw== } + + hast-util-to-estree@3.1.3: + resolution: { integrity: sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w== } + + hast-util-to-html@9.0.5: + resolution: { integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw== } + + hast-util-to-jsx-runtime@2.3.6: + resolution: { integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg== } + + hast-util-to-parse5@8.0.0: + resolution: { integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw== } + + hast-util-to-string@3.0.1: + resolution: { integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A== } + + hast-util-to-text@4.0.2: + resolution: { integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A== } + + hast-util-whitespace@3.0.0: + resolution: { integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw== } + + hastscript@9.0.1: + resolution: { integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w== } + + he@1.2.0: + resolution: { integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== } + hasBin: true + + hookable@5.5.3: + resolution: { integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ== } + + html-encoding-sniffer@4.0.0: + resolution: { integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ== } + engines: { node: '>=18' } + + html-escaper@3.0.3: + resolution: { integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ== } + + html-void-elements@3.0.0: + resolution: { integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg== } + + htmlparser2@9.1.0: + resolution: { integrity: sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ== } + + http-cache-semantics@4.2.0: + resolution: { integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ== } + + http-proxy-agent@7.0.2: + resolution: { integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== } + engines: { node: '>= 14' } + + https-proxy-agent@7.0.6: + resolution: { integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw== } + engines: { node: '>= 14' } + + human-id@4.1.1: + resolution: { integrity: sha512-3gKm/gCSUipeLsRYZbbdA1BD83lBoWUkZ7G9VFrhWPAU76KwYo5KR8V28bpoPm/ygy0x5/GCbpRQdY7VLYCoIg== } + hasBin: true + + iconv-lite@0.6.3: + resolution: { integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== } + engines: { node: '>=0.10.0' } + + iconv-lite@0.7.0: + resolution: { integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ== } + engines: { node: '>=0.10.0' } + + ignore@5.3.2: + resolution: { integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== } + engines: { node: '>= 4' } + + immutable@5.1.3: + resolution: { integrity: sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg== } + + import-meta-resolve@4.2.0: + resolution: { integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg== } + + indent-string@4.0.0: + resolution: { integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== } + engines: { node: '>=8' } + + ini@1.3.8: + resolution: { integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== } + + inline-style-parser@0.2.4: + resolution: { integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q== } + + iron-webcrypto@1.2.1: + resolution: { integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg== } + + is-alphabetical@2.0.1: + resolution: { integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ== } + + is-alphanumerical@2.0.1: + resolution: { integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw== } + + is-arrayish@0.3.4: + resolution: { integrity: sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA== } + + is-decimal@2.0.1: + resolution: { integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A== } + + is-docker@3.0.0: + resolution: { integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + hasBin: true + + is-extglob@2.1.1: + resolution: { integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== } + engines: { node: '>=0.10.0' } + + is-fullwidth-code-point@3.0.0: + resolution: { integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== } + engines: { node: '>=8' } + + is-glob@4.0.3: + resolution: { integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== } + engines: { node: '>=0.10.0' } + + is-hexadecimal@2.0.1: + resolution: { integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg== } + + is-inside-container@1.0.0: + resolution: { integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== } + engines: { node: '>=14.16' } + hasBin: true + + is-number@7.0.0: + resolution: { integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== } + engines: { node: '>=0.12.0' } + + is-plain-obj@4.1.0: + resolution: { integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== } + engines: { node: '>=12' } + + is-potential-custom-element-name@1.0.1: + resolution: { integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== } + + is-reference@3.0.3: + resolution: { integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw== } + + is-subdir@1.2.0: + resolution: { integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw== } + engines: { node: '>=4' } + + is-windows@1.0.2: + resolution: { integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== } + engines: { node: '>=0.10.0' } + + is-wsl@3.1.0: + resolution: { integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw== } + engines: { node: '>=16' } + + isexe@2.0.0: + resolution: { integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== } + + iso-datestring-validator@2.2.2: + resolution: { integrity: sha512-yLEMkBbLZTlVQqOnQ4FiMujR6T4DEcCb1xizmvXS+OxuhwcbtynoosRzdMA69zZCShCNAbi+gJ71FxZBBXx1SA== } + + jackspeak@3.4.3: + resolution: { integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== } + + javascript-natural-sort@0.7.1: + resolution: { integrity: sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw== } + + jiti@2.5.1: + resolution: { integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w== } + hasBin: true + + js-tokens@4.0.0: + resolution: { integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== } + + js-tokens@9.0.1: + resolution: { integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ== } + + js-yaml@3.14.1: + resolution: { integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== } + hasBin: true + + js-yaml@4.1.0: + resolution: { integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== } + hasBin: true + + jsdom@26.1.0: + resolution: { integrity: sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg== } + engines: { node: '>=18' } + peerDependencies: + canvas: ^3.0.0 + peerDependenciesMeta: + canvas: + optional: true + + jsesc@3.1.0: + resolution: { integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== } + engines: { node: '>=6' } + hasBin: true + + json-schema-traverse@1.0.0: + resolution: { integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== } + + json5@2.2.3: + resolution: { integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== } + engines: { node: '>=6' } + hasBin: true + + jsonc-parser@2.3.1: + resolution: { integrity: sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg== } + + jsonc-parser@3.3.1: + resolution: { integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ== } + + jsonfile@4.0.0: + resolution: { integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== } + + kleur@3.0.3: + resolution: { integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== } + engines: { node: '>=6' } + + kleur@4.1.5: + resolution: { integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== } + engines: { node: '>=6' } + + kolorist@1.8.0: + resolution: { integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ== } + + ky@1.10.0: + resolution: { integrity: sha512-YRPCzHEWZffbfvmRrfwa+5nwBHwZuYiTrfDX0wuhGBPV0pA/zCqcOq93MDssON/baIkpYbvehIX5aLpMxrRhaA== } + engines: { node: '>=18' } + + latest-version@9.0.0: + resolution: { integrity: sha512-7W0vV3rqv5tokqkBAFV1LbR7HPOWzXQDpDgEuib/aJ1jsZZx6x3c2mBI+TJhJzOhkGeaLbCKEHXEXLfirtG2JA== } + engines: { node: '>=18' } + + lightningcss-darwin-arm64@1.30.1: + resolution: { integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ== } + engines: { node: '>= 12.0.0' } + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.30.1: + resolution: { integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA== } + engines: { node: '>= 12.0.0' } + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.30.1: + resolution: { integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig== } + engines: { node: '>= 12.0.0' } + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.30.1: + resolution: { integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q== } + engines: { node: '>= 12.0.0' } + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.30.1: + resolution: { integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw== } + engines: { node: '>= 12.0.0' } + cpu: [arm64] + os: [linux] + libc: [glibc] + + lightningcss-linux-arm64-musl@1.30.1: + resolution: { integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ== } + engines: { node: '>= 12.0.0' } + cpu: [arm64] + os: [linux] + libc: [musl] + + lightningcss-linux-x64-gnu@1.30.1: + resolution: { integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw== } + engines: { node: '>= 12.0.0' } + cpu: [x64] + os: [linux] + libc: [glibc] + + lightningcss-linux-x64-musl@1.30.1: + resolution: { integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ== } + engines: { node: '>= 12.0.0' } + cpu: [x64] + os: [linux] + libc: [musl] + + lightningcss-win32-arm64-msvc@1.30.1: + resolution: { integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA== } + engines: { node: '>= 12.0.0' } + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.30.1: + resolution: { integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg== } + engines: { node: '>= 12.0.0' } + cpu: [x64] + os: [win32] + + lightningcss@1.30.1: + resolution: { integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg== } + engines: { node: '>= 12.0.0' } + + local-pkg@0.5.1: + resolution: { integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ== } + engines: { node: '>=14' } + + local-pkg@1.1.2: + resolution: { integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A== } + engines: { node: '>=14' } + + locate-character@3.0.0: + resolution: { integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA== } + + locate-path@5.0.0: + resolution: { integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== } + engines: { node: '>=8' } + + lodash.startcase@4.4.0: + resolution: { integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg== } + + lodash@4.17.21: + resolution: { integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== } + + longest-streak@3.1.0: + resolution: { integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== } + + loupe@3.2.1: + resolution: { integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ== } + + lower-case@2.0.2: + resolution: { integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== } + + lru-cache@10.4.3: + resolution: { integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== } + + lru-cache@5.1.1: + resolution: { integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== } + + lucide-react@0.542.0: + resolution: { integrity: sha512-w3hD8/SQB7+lzU2r4VdFyzzOzKnUjTZIF/MQJGSSvni7Llewni4vuViRppfRAa2guOsY5k4jZyxw/i9DQHv+dw== } + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + lz-string@1.5.0: + resolution: { integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== } + hasBin: true + + magic-string-ast@1.0.2: + resolution: { integrity: sha512-8ngQgLhcT0t3YBdn9CGkZqCYlvwW9pm7aWJwd7AxseVWf1RU8ZHCQvG1mt3N5vvUme+pXTcHB8G/7fE666U8Vw== } + engines: { node: '>=20.18.0' } + + magic-string@0.30.18: + resolution: { integrity: sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ== } + + magic-string@0.30.19: + resolution: { integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw== } + + magicast@0.3.5: + resolution: { integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ== } + + markdown-extensions@2.0.0: + resolution: { integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q== } + engines: { node: '>=16' } + + markdown-table@3.0.4: + resolution: { integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw== } + + math-intrinsics@1.1.0: + resolution: { integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== } + engines: { node: '>= 0.4' } + + mdast-util-definitions@6.0.0: + resolution: { integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ== } + + mdast-util-find-and-replace@3.0.2: + resolution: { integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg== } + + mdast-util-from-markdown@2.0.2: + resolution: { integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA== } + + mdast-util-gfm-autolink-literal@2.0.1: + resolution: { integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ== } + + mdast-util-gfm-footnote@2.1.0: + resolution: { integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ== } + + mdast-util-gfm-strikethrough@2.0.0: + resolution: { integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg== } + + mdast-util-gfm-table@2.0.0: + resolution: { integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg== } + + mdast-util-gfm-task-list-item@2.0.0: + resolution: { integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ== } + + mdast-util-gfm@3.1.0: + resolution: { integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ== } + + mdast-util-mdx-expression@2.0.1: + resolution: { integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ== } + + mdast-util-mdx-jsx@3.2.0: + resolution: { integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q== } + + mdast-util-mdx@3.0.0: + resolution: { integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w== } + + mdast-util-mdxjs-esm@2.0.1: + resolution: { integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg== } + + mdast-util-phrasing@4.1.0: + resolution: { integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w== } + + mdast-util-to-hast@13.2.0: + resolution: { integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA== } + + mdast-util-to-markdown@2.1.2: + resolution: { integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA== } + + mdast-util-to-string@4.0.0: + resolution: { integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg== } + + mdn-data@2.0.28: + resolution: { integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g== } + + mdn-data@2.0.30: + resolution: { integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA== } + + mdn-data@2.12.2: + resolution: { integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA== } + + merge2@1.4.1: + resolution: { integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== } + engines: { node: '>= 8' } + + micromark-core-commonmark@2.0.3: + resolution: { integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg== } + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: { integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw== } + + micromark-extension-gfm-footnote@2.1.0: + resolution: { integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw== } + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: { integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw== } + + micromark-extension-gfm-table@2.1.1: + resolution: { integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg== } + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: { integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg== } + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: { integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw== } + + micromark-extension-gfm@3.0.0: + resolution: { integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w== } + + micromark-extension-mdx-expression@3.0.1: + resolution: { integrity: sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q== } + + micromark-extension-mdx-jsx@3.0.2: + resolution: { integrity: sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ== } + + micromark-extension-mdx-md@2.0.0: + resolution: { integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ== } + + micromark-extension-mdxjs-esm@3.0.0: + resolution: { integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A== } + + micromark-extension-mdxjs@3.0.0: + resolution: { integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ== } + + micromark-factory-destination@2.0.1: + resolution: { integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA== } + + micromark-factory-label@2.0.1: + resolution: { integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg== } + + micromark-factory-mdx-expression@2.0.3: + resolution: { integrity: sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ== } + + micromark-factory-space@2.0.1: + resolution: { integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg== } + + micromark-factory-title@2.0.1: + resolution: { integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw== } + + micromark-factory-whitespace@2.0.1: + resolution: { integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ== } + + micromark-util-character@2.1.1: + resolution: { integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q== } + + micromark-util-chunked@2.0.1: + resolution: { integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA== } + + micromark-util-classify-character@2.0.1: + resolution: { integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q== } + + micromark-util-combine-extensions@2.0.1: + resolution: { integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg== } + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: { integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw== } + + micromark-util-decode-string@2.0.1: + resolution: { integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ== } + + micromark-util-encode@2.0.1: + resolution: { integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw== } + + micromark-util-events-to-acorn@2.0.3: + resolution: { integrity: sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg== } + + micromark-util-html-tag-name@2.0.1: + resolution: { integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA== } + + micromark-util-normalize-identifier@2.0.1: + resolution: { integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q== } + + micromark-util-resolve-all@2.0.1: + resolution: { integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg== } + + micromark-util-sanitize-uri@2.0.1: + resolution: { integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ== } + + micromark-util-subtokenize@2.1.0: + resolution: { integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA== } + + micromark-util-symbol@2.0.1: + resolution: { integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q== } + + micromark-util-types@2.0.2: + resolution: { integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA== } + + micromark@4.0.2: + resolution: { integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA== } + + micromatch@4.0.8: + resolution: { integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== } + engines: { node: '>=8.6' } + + mime-db@1.52.0: + resolution: { integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== } + engines: { node: '>= 0.6' } + + mime-types@2.1.35: + resolution: { integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== } + engines: { node: '>= 0.6' } + + min-indent@1.0.1: + resolution: { integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== } + engines: { node: '>=4' } + + mini-svg-data-uri@1.4.4: + resolution: { integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg== } + hasBin: true + + minimatch@10.0.3: + resolution: { integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw== } + engines: { node: 20 || >=22 } + + minimatch@9.0.5: + resolution: { integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== } + engines: { node: '>=16 || 14 >=14.17' } + + minimist@1.2.8: + resolution: { integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== } + + minipass@3.3.6: + resolution: { integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== } + engines: { node: '>=8' } + + minipass@4.2.8: + resolution: { integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ== } + engines: { node: '>=8' } + + minipass@5.0.0: + resolution: { integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== } + engines: { node: '>=8' } + + minipass@7.1.2: + resolution: { integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== } + engines: { node: '>=16 || 14 >=14.17' } + + minizlib@2.1.2: + resolution: { integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== } + engines: { node: '>= 8' } + + minizlib@3.0.2: + resolution: { integrity: sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA== } + engines: { node: '>= 18' } + + mkdirp@1.0.4: + resolution: { integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== } + engines: { node: '>=10' } + hasBin: true + + mkdirp@3.0.1: + resolution: { integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg== } + engines: { node: '>=10' } + hasBin: true + + mlly@1.8.0: + resolution: { integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g== } + + mri@1.2.0: + resolution: { integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== } + engines: { node: '>=4' } + + mrmime@2.0.1: + resolution: { integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ== } + engines: { node: '>=10' } + + ms@2.1.3: + resolution: { integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== } + + muggle-string@0.4.1: + resolution: { integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ== } + + multiformats@9.9.0: + resolution: { integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg== } + + nanoid@3.3.11: + resolution: { integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== } + engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } + hasBin: true + + nanoid@5.1.5: + resolution: { integrity: sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw== } + engines: { node: ^18 || >=20 } + hasBin: true + + nanostores@1.0.1: + resolution: { integrity: sha512-kNZ9xnoJYKg/AfxjrVL4SS0fKX++4awQReGqWnwTRHxeHGZ1FJFVgTqr/eMrNQdp0Tz7M7tG/TDaX8QfHDwVCw== } + engines: { node: ^20.0.0 || >=22.0.0 } + + neotraverse@0.6.18: + resolution: { integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA== } + engines: { node: '>= 10' } + + next@15.5.2: + resolution: { integrity: sha512-H8Otr7abj1glFhbGnvUt3gz++0AF1+QoCXEBmd/6aKbfdFwrn0LpA836Ed5+00va/7HQSDD+mOoVhn3tNy3e/Q== } + engines: { node: ^18.18.0 || ^19.8.0 || >= 20.0.0 } + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.51.1 + babel-plugin-react-compiler: '*' + react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + babel-plugin-react-compiler: + optional: true + sass: + optional: true + + nlcst-to-string@4.0.0: + resolution: { integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA== } + + no-case@3.0.4: + resolution: { integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== } + + node-addon-api@7.1.1: + resolution: { integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ== } + + node-fetch-native@1.6.7: + resolution: { integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q== } + + node-fetch@2.7.0: + resolution: { integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== } + engines: { node: 4.x || >=6.0.0 } + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-gyp-build@4.8.4: + resolution: { integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ== } + hasBin: true + + node-html-parser@7.0.1: + resolution: { integrity: sha512-KGtmPY2kS0thCWGK0VuPyOS+pBKhhe8gXztzA2ilAOhbUbxa9homF1bOyKvhGzMLXUoRds9IOmr/v5lr/lqNmA== } + + node-mock-http@1.0.3: + resolution: { integrity: sha512-jN8dK25fsfnMrVsEhluUTPkBFY+6ybu7jSB1n+ri/vOGjJxU8J9CZhpSGkHXSkFjtUhbmoncG/YG9ta5Ludqog== } + + node-releases@2.0.21: + resolution: { integrity: sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw== } + + nopt@8.1.0: + resolution: { integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A== } + engines: { node: ^18.17.0 || >=20.5.0 } + hasBin: true + + normalize-path@3.0.0: + resolution: { integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== } + engines: { node: '>=0.10.0' } + + normalize-range@0.1.2: + resolution: { integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== } + engines: { node: '>=0.10.0' } + + nth-check@2.1.1: + resolution: { integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== } + + nwsapi@2.2.22: + resolution: { integrity: sha512-ujSMe1OWVn55euT1ihwCI1ZcAaAU3nxUiDwfDQldc51ZXaB9m2AyOn6/jh1BLe2t/G8xd6uKG1UBF2aZJeg2SQ== } + + octokit@5.0.3: + resolution: { integrity: sha512-+bwYsAIRmYv30NTmBysPIlgH23ekVDriB07oRxlPIAH5PI0yTMSxg5i5Xy0OetcnZw+nk/caD4szD7a9YZ3QyQ== } + engines: { node: '>= 20' } + + ofetch@1.4.1: + resolution: { integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw== } + + ohash@2.0.11: + resolution: { integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ== } + + once@1.4.0: + resolution: { integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== } + + oniguruma-parser@0.12.1: + resolution: { integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w== } + + oniguruma-to-es@4.3.3: + resolution: { integrity: sha512-rPiZhzC3wXwE59YQMRDodUwwT9FZ9nNBwQQfsd1wfdtlKEyCdRV0avrTcSZ5xlIvGRVPd/cx6ZN45ECmS39xvg== } + + outdent@0.5.0: + resolution: { integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q== } + + oxlint-tsgolint@0.2.0: + resolution: { integrity: sha512-37Hy+FT1sz8hHUo31JIgFDA8NcFndexrg5okutWRPXNejJwB9hKN+pyInaQQIv4XDsgNcQsSR2VJoq99eaGk9g== } + hasBin: true + + oxlint@1.15.0: + resolution: { integrity: sha512-GZngkdF2FabM0pp0/l5OOhIQg+9L6LmOrmS8V8Vg+Swv9/VLJd/oc/LtAkv4HO45BNWL3EVaXzswI0CmGokVzw== } + engines: { node: '>=8.*' } + hasBin: true + peerDependencies: + oxlint-tsgolint: '>=0.2.0' + peerDependenciesMeta: + oxlint-tsgolint: + optional: true + + p-filter@2.1.0: + resolution: { integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw== } + engines: { node: '>=8' } + + p-limit@2.3.0: + resolution: { integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== } + engines: { node: '>=6' } + + p-limit@6.2.0: + resolution: { integrity: sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA== } + engines: { node: '>=18' } + + p-locate@4.1.0: + resolution: { integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== } + engines: { node: '>=8' } + + p-map@2.1.0: + resolution: { integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== } + engines: { node: '>=6' } + + p-queue@8.1.1: + resolution: { integrity: sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ== } + engines: { node: '>=18' } + + p-timeout@6.1.4: + resolution: { integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg== } + engines: { node: '>=14.16' } + + p-try@2.2.0: + resolution: { integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== } + engines: { node: '>=6' } + + package-json-from-dist@1.0.1: + resolution: { integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== } + + package-json@10.0.1: + resolution: { integrity: sha512-ua1L4OgXSBdsu1FPb7F3tYH0F48a6kxvod4pLUlGY9COeJAJQNX/sNH2IiEmsxw7lqYiAwrdHMjz1FctOsyDQg== } + engines: { node: '>=18' } + + package-manager-detector@0.2.11: + resolution: { integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ== } + + package-manager-detector@1.3.0: + resolution: { integrity: sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ== } + + pagefind@1.3.0: + resolution: { integrity: sha512-8KPLGT5g9s+olKMRTU9LFekLizkVIu9tes90O1/aigJ0T5LmyPqTzGJrETnSw3meSYg58YH7JTzhTTW/3z6VAw== } + hasBin: true + + pako@0.2.9: + resolution: { integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA== } + + parse-entities@4.0.2: + resolution: { integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw== } + + parse-latin@7.0.0: + resolution: { integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ== } + + parse5-htmlparser2-tree-adapter@7.1.0: + resolution: { integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g== } + + parse5-parser-stream@7.1.2: + resolution: { integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow== } + + parse5@7.3.0: + resolution: { integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw== } + + pascal-case@3.1.2: + resolution: { integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== } + + path-browserify@1.0.1: + resolution: { integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== } + + path-exists@4.0.0: + resolution: { integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== } + engines: { node: '>=8' } + + path-key@3.1.1: + resolution: { integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== } + engines: { node: '>=8' } + + path-scurry@1.11.1: + resolution: { integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== } + engines: { node: '>=16 || 14 >=14.18' } + + path-type@4.0.0: + resolution: { integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== } + engines: { node: '>=8' } + + pathe@1.1.2: + resolution: { integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== } + + pathe@2.0.3: + resolution: { integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w== } + + pathval@2.0.1: + resolution: { integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ== } + engines: { node: '>= 14.16' } + + pend@1.2.0: + resolution: { integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== } + + picocolors@1.1.1: + resolution: { integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== } + + picomatch@2.3.1: + resolution: { integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== } + engines: { node: '>=8.6' } + + picomatch@4.0.3: + resolution: { integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== } + engines: { node: '>=12' } + + pify@4.0.1: + resolution: { integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== } + engines: { node: '>=6' } + + pkg-types@1.3.1: + resolution: { integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ== } + + pkg-types@2.3.0: + resolution: { integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig== } + + postcss-nested@6.2.0: + resolution: { integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ== } + engines: { node: '>=12.0' } + peerDependencies: + postcss: ^8.2.14 + + postcss-selector-parser@6.1.2: + resolution: { integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg== } + engines: { node: '>=4' } + + postcss-value-parser@4.2.0: + resolution: { integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== } + + postcss@8.4.31: + resolution: { integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== } + engines: { node: ^10 || ^12 || >=14 } + + postcss@8.5.6: + resolution: { integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== } + engines: { node: ^10 || ^12 || >=14 } + + prettier-plugin-astro@0.14.1: + resolution: { integrity: sha512-RiBETaaP9veVstE4vUwSIcdATj6dKmXljouXc/DDNwBSPTp8FRkLGDSGFClKsAFeeg+13SB0Z1JZvbD76bigJw== } + engines: { node: ^14.15.0 || >=16.0.0 } + + prettier-plugin-svelte@3.4.0: + resolution: { integrity: sha512-pn1ra/0mPObzqoIQn/vUTR3ZZI6UuZ0sHqMK5x2jMLGrs53h0sXhkVuDcrlssHwIMk7FYrMjHBPoUSyyEEDlBQ== } + peerDependencies: + prettier: ^3.0.0 + svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 + + prettier-plugin-tailwindcss@0.6.14: + resolution: { integrity: sha512-pi2e/+ZygeIqntN+vC573BcW5Cve8zUB0SSAGxqpB4f96boZF4M3phPVoOFCeypwkpRYdi7+jQ5YJJUwrkGUAg== } + engines: { node: '>=14.21.3' } + peerDependencies: + '@ianvs/prettier-plugin-sort-imports': '*' + '@prettier/plugin-hermes': '*' + '@prettier/plugin-oxc': '*' + '@prettier/plugin-pug': '*' + '@shopify/prettier-plugin-liquid': '*' + '@trivago/prettier-plugin-sort-imports': '*' + '@zackad/prettier-plugin-twig': '*' + prettier: ^3.0 + prettier-plugin-astro: '*' + prettier-plugin-css-order: '*' + prettier-plugin-import-sort: '*' + prettier-plugin-jsdoc: '*' + prettier-plugin-marko: '*' + prettier-plugin-multiline-arrays: '*' + prettier-plugin-organize-attributes: '*' + prettier-plugin-organize-imports: '*' + prettier-plugin-sort-imports: '*' + prettier-plugin-style-order: '*' + prettier-plugin-svelte: '*' + peerDependenciesMeta: + '@ianvs/prettier-plugin-sort-imports': + optional: true + '@prettier/plugin-hermes': + optional: true + '@prettier/plugin-oxc': + optional: true + '@prettier/plugin-pug': + optional: true + '@shopify/prettier-plugin-liquid': + optional: true + '@trivago/prettier-plugin-sort-imports': + optional: true + '@zackad/prettier-plugin-twig': + optional: true + prettier-plugin-astro: + optional: true + prettier-plugin-css-order: + optional: true + prettier-plugin-import-sort: + optional: true + prettier-plugin-jsdoc: + optional: true + prettier-plugin-marko: + optional: true + prettier-plugin-multiline-arrays: + optional: true + prettier-plugin-organize-attributes: + optional: true + prettier-plugin-organize-imports: + optional: true + prettier-plugin-sort-imports: + optional: true + prettier-plugin-style-order: + optional: true + prettier-plugin-svelte: + optional: true + + prettier@2.8.7: + resolution: { integrity: sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw== } + engines: { node: '>=10.13.0' } + hasBin: true + + prettier@2.8.8: + resolution: { integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== } + engines: { node: '>=10.13.0' } + hasBin: true + + prettier@3.6.2: + resolution: { integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ== } + engines: { node: '>=14' } + hasBin: true + + pretty-format@27.5.1: + resolution: { integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== } + engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + + prismjs@1.30.0: + resolution: { integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw== } + engines: { node: '>=6' } + + prompts@2.4.2: + resolution: { integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== } + engines: { node: '>= 6' } + + property-information@6.5.0: + resolution: { integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig== } + + property-information@7.1.0: + resolution: { integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ== } + + proto-list@1.2.4: + resolution: { integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== } + + proxy-compare@3.0.1: + resolution: { integrity: sha512-V9plBAt3qjMlS1+nC8771KNf6oJ12gExvaxnNzN/9yVRLdTv/lc+oJlnSzrdYDAvBfTStPCoiaCOTmTs0adv7Q== } + + proxy-from-env@1.1.0: + resolution: { integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== } + + publint@0.3.12: + resolution: { integrity: sha512-1w3MMtL9iotBjm1mmXtG3Nk06wnq9UhGNRpQ2j6n1Zq7YAD6gnxMMZMIxlRPAydVjVbjSm+n0lhwqsD1m4LD5w== } + engines: { node: '>=18' } + hasBin: true + + pump@3.0.3: + resolution: { integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA== } + + punycode@2.3.1: + resolution: { integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== } + engines: { node: '>=6' } + + quansync@0.2.11: + resolution: { integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA== } + + queue-microtask@1.2.3: + resolution: { integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== } + + radix3@1.1.2: + resolution: { integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA== } + + rc@1.2.8: + resolution: { integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== } + hasBin: true + + react-dom@19.1.1: + resolution: { integrity: sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw== } + peerDependencies: + react: ^19.1.1 + + react-hot-toast@2.6.0: + resolution: { integrity: sha512-bH+2EBMZ4sdyou/DPrfgIouFpcRLCJ+HoCA32UoAYHn6T3Ur5yfcDCeSr5mwldl6pFOsiocmrXMuoCJ1vV8bWg== } + engines: { node: '>=10' } + peerDependencies: + react: '>=16' + react-dom: '>=16' + + react-is@17.0.2: + resolution: { integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== } + + react-refresh@0.17.0: + resolution: { integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ== } + engines: { node: '>=0.10.0' } + + react@19.1.1: + resolution: { integrity: sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ== } + engines: { node: '>=0.10.0' } + + read-yaml-file@1.1.0: + resolution: { integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA== } + engines: { node: '>=6' } + + readdirp@4.1.2: + resolution: { integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg== } + engines: { node: '>= 14.18.0' } + + recma-build-jsx@1.0.0: + resolution: { integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew== } + + recma-jsx@1.0.1: + resolution: { integrity: sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w== } + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + recma-parse@1.0.0: + resolution: { integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ== } + + recma-stringify@1.0.0: + resolution: { integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g== } + + redent@3.0.0: + resolution: { integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== } + engines: { node: '>=8' } + + regex-recursion@6.0.2: + resolution: { integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg== } + + regex-utilities@2.3.0: + resolution: { integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng== } + + regex@6.0.1: + resolution: { integrity: sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA== } + + registry-auth-token@5.1.0: + resolution: { integrity: sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw== } + engines: { node: '>=14' } + + registry-url@6.0.1: + resolution: { integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q== } + engines: { node: '>=12' } + + rehype-expressive-code@0.41.3: + resolution: { integrity: sha512-8d9Py4c/V6I/Od2VIXFAdpiO2kc0SV2qTJsRAaqSIcM9aruW4ASLNe2kOEo1inXAAkIhpFzAHTc358HKbvpNUg== } + + rehype-parse@9.0.1: + resolution: { integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag== } + + rehype-raw@7.0.0: + resolution: { integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww== } + + rehype-recma@1.0.0: + resolution: { integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw== } + + rehype-stringify@10.0.1: + resolution: { integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA== } + + rehype@13.0.2: + resolution: { integrity: sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A== } + + remark-gfm@4.0.1: + resolution: { integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg== } + + remark-mdx@3.1.1: + resolution: { integrity: sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg== } + + remark-parse@11.0.0: + resolution: { integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA== } + + remark-rehype@11.1.2: + resolution: { integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw== } + + remark-smartypants@3.0.2: + resolution: { integrity: sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA== } + engines: { node: '>=16.0.0' } + + remark-stringify@11.0.0: + resolution: { integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw== } + + request-light@0.5.8: + resolution: { integrity: sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg== } + + request-light@0.7.0: + resolution: { integrity: sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q== } + + require-directory@2.1.1: + resolution: { integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== } + engines: { node: '>=0.10.0' } + + require-from-string@2.0.2: + resolution: { integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== } + engines: { node: '>=0.10.0' } + + resolve-from@5.0.0: + resolution: { integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== } + engines: { node: '>=8' } + + resolve-pkg-maps@1.0.0: + resolution: { integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== } + + restructure@3.0.2: + resolution: { integrity: sha512-gSfoiOEA0VPE6Tukkrr7I0RBdE0s7H1eFCDBk05l1KIQT1UIKNc5JZy6jdyW6eYH3aR3g5b3PuL77rq0hvwtAw== } + + retext-latin@4.0.0: + resolution: { integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA== } + + retext-smartypants@6.2.0: + resolution: { integrity: sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ== } + + retext-stringify@4.0.0: + resolution: { integrity: sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA== } + + retext@9.0.0: + resolution: { integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA== } + + reusify@1.1.0: + resolution: { integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== } + engines: { iojs: '>=1.0.0', node: '>=0.10.0' } + + rolldown-plugin-dts@0.15.10: + resolution: { integrity: sha512-8cPVAVQUo9tYAoEpc3jFV9RxSil13hrRRg8cHC9gLXxRMNtWPc1LNMSDXzjyD+5Vny49sDZH77JlXp/vlc4I3g== } + engines: { node: '>=20.18.0' } + peerDependencies: + '@typescript/native-preview': '>=7.0.0-dev.20250601.1' + rolldown: ^1.0.0-beta.9 + typescript: ^5.0.0 + vue-tsc: ~3.0.3 + peerDependenciesMeta: + '@typescript/native-preview': + optional: true + typescript: + optional: true + vue-tsc: + optional: true + + rolldown@1.0.0-beta.38: + resolution: { integrity: sha512-58frPNX55Je1YsyrtPJv9rOSR3G5efUZpRqok94Efsj0EUa8dnqJV3BldShyI7A+bVPleucOtzXHwVpJRcR0kQ== } + engines: { node: ^20.19.0 || >=22.12.0 } + hasBin: true + + rollup@4.50.2: + resolution: { integrity: sha512-BgLRGy7tNS9H66aIMASq1qSYbAAJV6Z6WR4QYTvj5FgF15rZ/ympT1uixHXwzbZUBDbkvqUI1KR0fH1FhMaQ9w== } + engines: { node: '>=18.0.0', npm: '>=8.0.0' } + hasBin: true + + rrweb-cssom@0.8.0: + resolution: { integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw== } + + run-parallel@1.2.0: + resolution: { integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== } + + rxjs@7.8.2: + resolution: { integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA== } + + s.color@0.0.15: + resolution: { integrity: sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA== } + + sade@1.8.1: + resolution: { integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A== } + engines: { node: '>=6' } + + safer-buffer@2.1.2: + resolution: { integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== } + + sass-embedded-all-unknown@1.91.0: + resolution: { integrity: sha512-AXC1oPqDfLnLtcoxM+XwSnbhcQs0TxAiA5JDEstl6+tt6fhFLKxdyl1Hla39SFtxvMfB2QDUYE3Dmx49O59vYg== } + cpu: ['!arm', '!arm64', '!riscv64', '!x64'] + + sass-embedded-android-arm64@1.91.0: + resolution: { integrity: sha512-I8Eeg2CeVcZIhXcQLNEY6ZBRF0m7jc818/fypwMwvIdbxGWBekTzc3aKHTLhdBpFzGnDIyR4s7oB0/OjIpzD1A== } + engines: { node: '>=14.0.0' } + cpu: [arm64] + os: [android] + + sass-embedded-android-arm@1.91.0: + resolution: { integrity: sha512-DSh1V8TlLIcpklAbn4NINEFs3yD2OzVTbawEXK93IH990upoGNFVNRTstFQ/gcvlbWph3Y3FjAJvo37zUO485A== } + engines: { node: '>=14.0.0' } + cpu: [arm] + os: [android] + + sass-embedded-android-riscv64@1.91.0: + resolution: { integrity: sha512-qmsl1a7IIJL0fCOwzmRB+6nxeJK5m9/W8LReXUrdgyJNH5RyxChDg+wwQPVATFffOuztmWMnlJ5CV2sCLZrXcQ== } + engines: { node: '>=14.0.0' } + cpu: [riscv64] + os: [android] + + sass-embedded-android-x64@1.91.0: + resolution: { integrity: sha512-/wN0HBLATOVSeN3Tzg0yxxNTo1IQvOxxxwFv7Ki/1/UCg2AqZPxTpNoZj/mn8tUPtiVogMGbC8qclYMq1aRZsQ== } + engines: { node: '>=14.0.0' } + cpu: [x64] + os: [android] + + sass-embedded-darwin-arm64@1.91.0: + resolution: { integrity: sha512-gQ6ScInxAN+BDUXy426BSYLRawkmGYlHpQ9i6iOxorr64dtIb3l6eb9YaBV8lPlroUnugylmwN2B3FU9BuPfhA== } + engines: { node: '>=14.0.0' } + cpu: [arm64] + os: [darwin] + + sass-embedded-darwin-x64@1.91.0: + resolution: { integrity: sha512-DSvFMtECL2blYVTFMO5fLeNr5bX437Lrz8R47fdo5438TRyOkSgwKTkECkfh3YbnrL86yJIN2QQlmBMF17Z/iw== } + engines: { node: '>=14.0.0' } + cpu: [x64] + os: [darwin] + + sass-embedded-linux-arm64@1.91.0: + resolution: { integrity: sha512-OnKCabD7f420ZEC/6YI9WhCVGMZF+ybZ5NbAB9SsG1xlxrKbWQ1s7CIl0w/6RDALtJ+Fjn8+mrxsxqakoAkeuA== } + engines: { node: '>=14.0.0' } + cpu: [arm64] + os: [linux] + libc: glibc + + sass-embedded-linux-arm@1.91.0: + resolution: { integrity: sha512-ppAZLp3eZ9oTjYdQDf4nM7EehDpkxq5H1hE8FOrx8LpY7pxn6QF+SRpAbRjdfFChRw0K7vh+IiCnQEMp7uLNAg== } + engines: { node: '>=14.0.0' } + cpu: [arm] + os: [linux] + libc: glibc + + sass-embedded-linux-musl-arm64@1.91.0: + resolution: { integrity: sha512-VfbPpID1C5TT7rukob6CKgefx/TsLE+XZieMNd00hvfJ8XhqPr5DGvSMCNpXlwaedzTirbJu357m+n2PJI9TFQ== } + engines: { node: '>=14.0.0' } + cpu: [arm64] + os: [linux] + libc: musl + + sass-embedded-linux-musl-arm@1.91.0: + resolution: { integrity: sha512-znEsNC2FurPF9+XwQQ6e/fVoic3e5D3/kMB41t/bE8byJVRdaPhkdsszt3pZUE56nNGYoCuieSXUkk7VvyPHsw== } + engines: { node: '>=14.0.0' } + cpu: [arm] + os: [linux] + libc: musl + + sass-embedded-linux-musl-riscv64@1.91.0: + resolution: { integrity: sha512-ZfLGldKEEeZjuljKks835LTq7jDRI3gXsKKXXgZGzN6Yymd4UpBOGWiDQlWsWTvw5UwDU2xfFh0wSXbLGHTjVA== } + engines: { node: '>=14.0.0' } + cpu: [riscv64] + os: [linux] + libc: musl + + sass-embedded-linux-musl-x64@1.91.0: + resolution: { integrity: sha512-4kSiSGPKFMbLvTRbP/ibyiKheOA3fwsJKWU0SOuekSPmybMdrhNkTm0REp6+nehZRE60kC3lXmEV4a7w8Jrwyg== } + engines: { node: '>=14.0.0' } + cpu: [x64] + os: [linux] + libc: musl + + sass-embedded-linux-riscv64@1.91.0: + resolution: { integrity: sha512-Y3Fj94SYYvMX9yo49T78yBgBWXtG3EyYUT5K05XyCYkcdl1mVXJSrEmqmRfe4vQGUCaSe/6s7MmsA9Q+mQez7Q== } + engines: { node: '>=14.0.0' } + cpu: [riscv64] + os: [linux] + libc: glibc + + sass-embedded-linux-x64@1.91.0: + resolution: { integrity: sha512-XwIUaE7pQP/ezS5te80hlyheYiUlo0FolQ0HBtxohpavM+DVX2fjwFm5LOUJHrLAqP+TLBtChfFeLj1Ie4Aenw== } + engines: { node: '>=14.0.0' } + cpu: [x64] + os: [linux] + libc: glibc + + sass-embedded-unknown-all@1.91.0: + resolution: { integrity: sha512-Bj6v7ScQp/HtO91QBy6ood9AArSIN7/RNcT4E7P9QoY3o+e6621Vd28lV81vdepPrt6u6PgJoVKmLNODqB6Q+A== } + os: ['!android', '!darwin', '!linux', '!win32'] + + sass-embedded-win32-arm64@1.91.0: + resolution: { integrity: sha512-yDCwTiPRex03i1yo7LwiAl1YQ21UyfOxPobD7UjI8AE8ZcB0mQ28VVX66lsZ+qm91jfLslNFOFCD4v79xCG9hA== } + engines: { node: '>=14.0.0' } + cpu: [arm64] + os: [win32] + + sass-embedded-win32-x64@1.91.0: + resolution: { integrity: sha512-wiuMz/cx4vsk6rYCnNyoGE5pd73aDJ/zF3qJDose3ZLT1/vV943doJE5pICnS/v5DrUqzV6a1CNq4fN+xeSgFQ== } + engines: { node: '>=14.0.0' } + cpu: [x64] + os: [win32] + + sass-embedded@1.91.0: + resolution: { integrity: sha512-VTckYcH1AglrZ3VpPETilTo3Ef472XKwP13lrNfbOHSR6Eo5p27XTkIi+6lrCbuhBFFGAmy+4BRoLaeFUgn+eg== } + engines: { node: '>=16.0.0' } + hasBin: true + + sass-formatter@0.7.9: + resolution: { integrity: sha512-CWZ8XiSim+fJVG0cFLStwDvft1VI7uvXdCNJYXhDvowiv+DsbD1nXLiQ4zrE5UBvj5DWZJ93cwN0NX5PMsr1Pw== } + + sass@1.91.0: + resolution: { integrity: sha512-aFOZHGf+ur+bp1bCHZ+u8otKGh77ZtmFyXDo4tlYvT7PWql41Kwd8wdkPqhhT+h2879IVblcHFglIMofsFd1EA== } + engines: { node: '>=14.0.0' } + hasBin: true + + saxes@6.0.0: + resolution: { integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== } + engines: { node: '>=v12.22.7' } + + scheduler@0.26.0: + resolution: { integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA== } + + semver@6.3.1: + resolution: { integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== } + hasBin: true + + semver@7.7.2: + resolution: { integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== } + engines: { node: '>=10' } + hasBin: true + + set-cookie-parser@2.7.1: + resolution: { integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ== } + + sharp@0.33.5: + resolution: { integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw== } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + + sharp@0.34.3: + resolution: { integrity: sha512-eX2IQ6nFohW4DbvHIOLRB3MHFpYqaqvXd3Tp5e/T/dSH83fxaNJQRvDMhASmkNTsNTVF2/OOopzRCt7xokgPfg== } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + + shebang-command@2.0.0: + resolution: { integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== } + engines: { node: '>=8' } + + shebang-regex@3.0.0: + resolution: { integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== } + engines: { node: '>=8' } + + shiki@3.12.0: + resolution: { integrity: sha512-E+ke51tciraTHpaXYXfqnPZFSViKHhSQ3fiugThlfs/om/EonlQ0hSldcqgzOWWqX6PcjkKKzFgrjIaiPAXoaA== } + + shiki@3.12.2: + resolution: { integrity: sha512-uIrKI+f9IPz1zDT+GMz+0RjzKJiijVr6WDWm9Pe3NNY6QigKCfifCEv9v9R2mDASKKjzjQ2QpFLcxaR3iHSnMA== } + + siginfo@2.0.0: + resolution: { integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== } + + signal-exit@4.1.0: + resolution: { integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== } + engines: { node: '>=14' } + + simple-swizzle@0.2.4: + resolution: { integrity: sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw== } + + sirv@3.0.2: + resolution: { integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g== } + engines: { node: '>=18' } + + sisteransi@1.0.5: + resolution: { integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== } + + slash@3.0.0: + resolution: { integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== } + engines: { node: '>=8' } + + smol-toml@1.4.2: + resolution: { integrity: sha512-rInDH6lCNiEyn3+hH8KVGFdbjc099j47+OSgbMrfDYX1CmXLfdKd7qi6IfcWj2wFxvSVkuI46M+wPGYfEOEj6g== } + engines: { node: '>= 18' } + + source-map-js@1.2.1: + resolution: { integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== } + engines: { node: '>=0.10.0' } + + source-map@0.7.6: + resolution: { integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ== } + engines: { node: '>= 12' } + + space-separated-tokens@2.0.2: + resolution: { integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== } + + spawndamnit@3.0.1: + resolution: { integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg== } + + sprintf-js@1.0.3: + resolution: { integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== } + + stackback@0.0.2: + resolution: { integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== } + + std-env@3.9.0: + resolution: { integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw== } + + string-width@4.2.3: + resolution: { integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== } + engines: { node: '>=8' } + + string-width@5.1.2: + resolution: { integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== } + engines: { node: '>=12' } + + string-width@7.2.0: + resolution: { integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ== } + engines: { node: '>=18' } + + stringify-entities@4.0.4: + resolution: { integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg== } + + strip-ansi@6.0.1: + resolution: { integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== } + engines: { node: '>=8' } + + strip-ansi@7.1.2: + resolution: { integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA== } + engines: { node: '>=12' } + + strip-bom@3.0.0: + resolution: { integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== } + engines: { node: '>=4' } + + strip-indent@3.0.0: + resolution: { integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== } + engines: { node: '>=8' } + + strip-json-comments@2.0.1: + resolution: { integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== } + engines: { node: '>=0.10.0' } + + strip-literal@3.0.0: + resolution: { integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA== } + + style-to-js@1.1.17: + resolution: { integrity: sha512-xQcBGDxJb6jjFCTzvQtfiPn6YvvP2O8U1MDIPNfJQlWMYfktPy+iGsHE7cssjs7y84d9fQaK4UF3RIJaAHSoYA== } + + style-to-object@1.0.9: + resolution: { integrity: sha512-G4qppLgKu/k6FwRpHiGiKPaPTFcG3g4wNVX/Qsfu+RqQM30E7Tyu/TEgxcL9PNLF5pdRLwQdE3YKKf+KF2Dzlw== } + + styled-jsx@5.1.6: + resolution: { integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA== } + engines: { node: '>= 12.0.0' } + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + + suf-log@2.5.3: + resolution: { integrity: sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow== } + + supports-color@8.1.1: + resolution: { integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== } + engines: { node: '>=10' } + + svelte-check@4.3.1: + resolution: { integrity: sha512-lkh8gff5gpHLjxIV+IaApMxQhTGnir2pNUAqcNgeKkvK5bT/30Ey/nzBxNLDlkztCH4dP7PixkMt9SWEKFPBWg== } + engines: { node: '>= 18.0.0' } + hasBin: true + peerDependencies: + svelte: ^4.0.0 || ^5.0.0-next.0 + typescript: '>=5.0.0' + + svelte2tsx@0.7.43: + resolution: { integrity: sha512-TtxMuk520th4ZEvUQrhbDAyyQ1I+kc5dZCA4ChOLlbVXZfqenrY45iTH27DpLyx/u4STEz8O3hkGm5goTS8JhQ== } + peerDependencies: + svelte: ^3.55 || ^4.0.0-next.0 || ^4.0 || ^5.0.0-next.0 + typescript: ^4.9.4 || ^5.0.0 + + svelte@5.38.6: + resolution: { integrity: sha512-ltBPlkvqk3bgCK7/N323atUpP3O3Y+DrGV4dcULrsSn4fZaaNnOmdplNznwfdWclAgvSr5rxjtzn/zJhRm6TKg== } + engines: { node: '>=18' } + + svgo@3.3.2: + resolution: { integrity: sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw== } + engines: { node: '>=14.0.0' } + hasBin: true + + symbol-tree@3.2.4: + resolution: { integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== } + + sync-child-process@1.0.2: + resolution: { integrity: sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA== } + engines: { node: '>=16.0.0' } + + sync-message-port@1.1.3: + resolution: { integrity: sha512-GTt8rSKje5FilG+wEdfCkOcLL7LWqpMlr2c3LRuKt/YXxcJ52aGSbGBAdI4L3aaqfrBt6y711El53ItyH1NWzg== } + engines: { node: '>=16.0.0' } + + tabbable@6.2.0: + resolution: { integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew== } + + tailwindcss@4.1.12: + resolution: { integrity: sha512-DzFtxOi+7NsFf7DBtI3BJsynR+0Yp6etH+nRPTbpWnS2pZBaSksv/JGctNwSWzbFjp0vxSqknaUylseZqMDGrA== } + + tailwindcss@4.1.13: + resolution: { integrity: sha512-i+zidfmTqtwquj4hMEwdjshYYgMbOrPzb9a0M3ZgNa0JMoZeFC6bxZvO8yr8ozS6ix2SDz0+mvryPeBs2TFE+w== } + + tapable@2.2.3: + resolution: { integrity: sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg== } + engines: { node: '>=6' } + + tar@6.2.1: + resolution: { integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== } + engines: { node: '>=10' } + + tar@7.4.3: + resolution: { integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw== } + engines: { node: '>=18' } + + term-size@2.2.1: + resolution: { integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg== } + engines: { node: '>=8' } + + tiny-inflate@1.0.3: + resolution: { integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw== } + + tinybench@2.9.0: + resolution: { integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg== } + + tinyexec@0.3.2: + resolution: { integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA== } + + tinyexec@1.0.1: + resolution: { integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw== } + + tinyglobby@0.2.14: + resolution: { integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ== } + engines: { node: '>=12.0.0' } + + tinyglobby@0.2.15: + resolution: { integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ== } + engines: { node: '>=12.0.0' } + + tinypool@1.1.1: + resolution: { integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg== } + engines: { node: ^18.0.0 || >=20.0.0 } + + tinyrainbow@2.0.0: + resolution: { integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw== } + engines: { node: '>=14.0.0' } + + tinyspy@4.0.3: + resolution: { integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A== } + engines: { node: '>=14.0.0' } + + tlds@1.260.0: + resolution: { integrity: sha512-78+28EWBhCEE7qlyaHA9OR3IPvbCLiDh3Ckla593TksfFc9vfTsgvH7eS+dr3o9qr31gwGbogcI16yN91PoRjQ== } + hasBin: true + + tldts-core@6.1.86: + resolution: { integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA== } + + tldts@6.1.86: + resolution: { integrity: sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ== } + hasBin: true + + to-regex-range@5.0.1: + resolution: { integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== } + engines: { node: '>=8.0' } + + toad-cache@3.7.0: + resolution: { integrity: sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw== } + engines: { node: '>=12' } + + totalist@3.0.1: + resolution: { integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== } + engines: { node: '>=6' } + + tough-cookie@5.1.2: + resolution: { integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A== } + engines: { node: '>=16' } + + tr46@0.0.3: + resolution: { integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== } + + tr46@5.1.1: + resolution: { integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw== } + engines: { node: '>=18' } + + tree-kill@1.2.2: + resolution: { integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== } + hasBin: true + + trim-lines@3.0.1: + resolution: { integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== } + + trough@2.2.0: + resolution: { integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw== } + + ts-morph@26.0.0: + resolution: { integrity: sha512-ztMO++owQnz8c/gIENcM9XfCEzgoGphTv+nKpYNM1bgsdOVC/jRZuEBf6N+mLLDNg68Kl+GgUZfOySaRiG1/Ug== } + + tsconfck@3.1.6: + resolution: { integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w== } + engines: { node: ^18 || >=20 } + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + tsdown@0.14.2: + resolution: { integrity: sha512-6ThtxVZoTlR5YJov5rYvH8N1+/S/rD/pGfehdCLGznGgbxz+73EASV1tsIIZkLw2n+SXcERqHhcB/OkyxdKv3A== } + engines: { node: '>=20.19.0' } + hasBin: true + peerDependencies: + '@arethetypeswrong/core': ^0.18.1 + publint: ^0.3.0 + typescript: ^5.0.0 + unplugin-lightningcss: ^0.4.0 + unplugin-unused: ^0.5.0 + peerDependenciesMeta: + '@arethetypeswrong/core': + optional: true + publint: + optional: true + typescript: + optional: true + unplugin-lightningcss: + optional: true + unplugin-unused: + optional: true + + tslib@2.8.1: + resolution: { integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== } + + tsx@4.20.5: + resolution: { integrity: sha512-+wKjMNU9w/EaQayHXb7WA7ZaHY6hN8WgfvHNQ3t1PnU91/7O8TcTnIhCDYTZwnt8JsO9IBqZ30Ln1r7pPF52Aw== } + engines: { node: '>=18.0.0' } + hasBin: true + + type-fest@4.41.0: + resolution: { integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA== } + engines: { node: '>=16' } + + typesafe-path@0.2.2: + resolution: { integrity: sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA== } + + typescript-auto-import-cache@0.3.6: + resolution: { integrity: sha512-RpuHXrknHdVdK7wv/8ug3Fr0WNsNi5l5aB8MYYuXhq2UH5lnEB1htJ1smhtD5VeCsGr2p8mUDtd83LCQDFVgjQ== } + + typescript@5.9.2: + resolution: { integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A== } + engines: { node: '>=14.17' } + hasBin: true + + ufo@1.6.1: + resolution: { integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA== } + + uint8arrays@3.0.0: + resolution: { integrity: sha512-HRCx0q6O9Bfbp+HHSfQQKD7wU70+lydKVt4EghkdOvlK/NlrF90z+eXV34mUd48rNvVJXwkrMSPpCATkct8fJA== } + + ultrahtml@1.6.0: + resolution: { integrity: sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw== } + + unconfig@7.3.3: + resolution: { integrity: sha512-QCkQoOnJF8L107gxfHL0uavn7WD9b3dpBcFX6HtfQYmjw2YzWxGuFQ0N0J6tE9oguCBJn9KOvfqYDCMPHIZrBA== } + + uncrypto@0.1.3: + resolution: { integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q== } + + undici-types@5.26.5: + resolution: { integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== } + + undici-types@7.11.0: + resolution: { integrity: sha512-kt1ZriHTi7MU+Z/r9DOdAI3ONdaR3M3csEaRc6ewa4f4dTvX4cQCbJ4NkEn0ohE4hHtq85+PhPSTY+pO/1PwgA== } + + undici-types@7.12.0: + resolution: { integrity: sha512-goOacqME2GYyOZZfb5Lgtu+1IDmAlAEu5xnD3+xTzS10hT0vzpf0SPjkXwAw9Jm+4n/mQGDP3LO8CPbYROeBfQ== } + + undici@6.21.3: + resolution: { integrity: sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw== } + engines: { node: '>=18.17' } + + unicode-properties@1.4.1: + resolution: { integrity: sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg== } + + unicode-trie@2.0.0: + resolution: { integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ== } + + unified@11.0.5: + resolution: { integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA== } + + unifont@0.5.2: + resolution: { integrity: sha512-LzR4WUqzH9ILFvjLAUU7dK3Lnou/qd5kD+IakBtBK4S15/+x2y9VX+DcWQv6s551R6W+vzwgVS6tFg3XggGBgg== } + + unist-util-find-after@5.0.0: + resolution: { integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ== } + + unist-util-is@6.0.0: + resolution: { integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw== } + + unist-util-modify-children@4.0.0: + resolution: { integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw== } + + unist-util-position-from-estree@2.0.0: + resolution: { integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ== } + + unist-util-position@5.0.0: + resolution: { integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA== } + + unist-util-remove-position@5.0.0: + resolution: { integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q== } + + unist-util-stringify-position@4.0.0: + resolution: { integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ== } + + unist-util-visit-children@3.0.0: + resolution: { integrity: sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA== } + + unist-util-visit-parents@6.0.1: + resolution: { integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw== } + + unist-util-visit@5.0.0: + resolution: { integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg== } + + universal-github-app-jwt@2.2.2: + resolution: { integrity: sha512-dcmbeSrOdTnsjGjUfAlqNDJrhxXizjAz94ija9Qw8YkZ1uu0d+GoZzyH+Jb9tIIqvGsadUfwg+22k5aDqqwzbw== } + + universal-user-agent@7.0.3: + resolution: { integrity: sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A== } + + universalify@0.1.2: + resolution: { integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== } + engines: { node: '>= 4.0.0' } + + unplugin-macros@0.18.1: + resolution: { integrity: sha512-/VKnCAazdNwYam2cCtMAZXPdGoY59QywyVLBrIse3a4ywA3Nf6Vl+Qu+vK4avQByS7qCdrDBa5BfPcVF4DC1Tw== } + engines: { node: '>=20.18.0' } + + unplugin-raw@0.6.1: + resolution: { integrity: sha512-hXp1acn3YcqJqljk+6sO7KY0OQtp15gEKdxQ6judFTwu+n/I65CIxj1EnRkCh4rWXKcIBg9XEN7FR+XSVI8fAQ== } + engines: { node: '>=20.18.0' } + peerDependencies: + esbuild: '>=0.25.0' + peerDependenciesMeta: + esbuild: + optional: true + + unplugin-utils@0.2.5: + resolution: { integrity: sha512-gwXJnPRewT4rT7sBi/IvxKTjsms7jX7QIDLOClApuZwR49SXbrB1z2NLUZ+vDHyqCj/n58OzRRqaW+B8OZi8vg== } + engines: { node: '>=18.12.0' } + + unplugin@2.3.10: + resolution: { integrity: sha512-6NCPkv1ClwH+/BGE9QeoTIl09nuiAt0gS28nn1PvYXsGKRwM2TCbFA2QiilmehPDTXIe684k4rZI1yl3A1PCUw== } + engines: { node: '>=18.12.0' } + + unstorage@1.17.1: + resolution: { integrity: sha512-KKGwRTT0iVBCErKemkJCLs7JdxNVfqTPc/85ae1XES0+bsHbc/sFBfVi5kJp156cc51BHinIH2l3k0EZ24vOBQ== } + peerDependencies: + '@azure/app-configuration': ^1.8.0 + '@azure/cosmos': ^4.2.0 + '@azure/data-tables': ^13.3.0 + '@azure/identity': ^4.6.0 + '@azure/keyvault-secrets': ^4.9.0 + '@azure/storage-blob': ^12.26.0 + '@capacitor/preferences': ^6.0.3 || ^7.0.0 + '@deno/kv': '>=0.9.0' + '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0 + '@planetscale/database': ^1.19.0 + '@upstash/redis': ^1.34.3 + '@vercel/blob': '>=0.27.1' + '@vercel/functions': ^2.2.12 || ^3.0.0 + '@vercel/kv': ^1.0.1 + aws4fetch: ^1.0.20 + db0: '>=0.2.1' + idb-keyval: ^6.2.1 + ioredis: ^5.4.2 + uploadthing: ^7.4.4 + peerDependenciesMeta: + '@azure/app-configuration': + optional: true + '@azure/cosmos': + optional: true + '@azure/data-tables': + optional: true + '@azure/identity': + optional: true + '@azure/keyvault-secrets': + optional: true + '@azure/storage-blob': + optional: true + '@capacitor/preferences': + optional: true + '@deno/kv': + optional: true + '@netlify/blobs': + optional: true + '@planetscale/database': + optional: true + '@upstash/redis': + optional: true + '@vercel/blob': + optional: true + '@vercel/functions': + optional: true + '@vercel/kv': + optional: true + aws4fetch: + optional: true + db0: + optional: true + idb-keyval: + optional: true + ioredis: + optional: true + uploadthing: + optional: true + + update-browserslist-db@1.1.3: + resolution: { integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw== } + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + util-deprecate@1.0.2: + resolution: { integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== } + + varint@6.0.0: + resolution: { integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg== } + + vfile-location@5.0.3: + resolution: { integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg== } + + vfile-message@4.0.3: + resolution: { integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw== } + + vfile@6.0.3: + resolution: { integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q== } + + vite-node@3.2.4: + resolution: { integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg== } + engines: { node: ^18.0.0 || ^20.0.0 || >=22.0.0 } + hasBin: true + + vite-plugin-pagefind@1.0.7: + resolution: { integrity: sha512-BTYGhqbEsEBfG7ZIbV41HjKAKGlJcq+h819Lsq+83+bkN5mcrl0YLqbh0fx+tCvmdOZs9rfgMpKoBlyv8pcvfQ== } + peerDependencies: + vite: '>=4.0.0' + + vite@6.3.6: + resolution: { integrity: sha512-0msEVHJEScQbhkbVTb/4iHZdJ6SXp/AvxL2sjwYQFfBqleHtnCqv1J3sa9zbWz/6kW1m9Tfzn92vW+kZ1WV6QA== } + engines: { node: ^18.0.0 || ^20.0.0 || >=22.0.0 } + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vite@7.1.3: + resolution: { integrity: sha512-OOUi5zjkDxYrKhTV3V7iKsoS37VUM7v40+HuwEmcrsf11Cdx9y3DIr2Px6liIcZFwt3XSRpQvFpL3WVy7ApkGw== } + engines: { node: ^20.19.0 || >=22.12.0 } + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vite@7.1.5: + resolution: { integrity: sha512-4cKBO9wR75r0BeIWWWId9XK9Lj6La5X846Zw9dFfzMRw38IlTk2iCcUt6hsyiDRcPidc55ZParFYDXi0nXOeLQ== } + engines: { node: ^20.19.0 || >=22.12.0 } + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitefu@1.1.1: + resolution: { integrity: sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ== } + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0 + peerDependenciesMeta: + vite: + optional: true + + vitest@3.2.4: + resolution: { integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A== } + engines: { node: ^18.0.0 || ^20.0.0 || >=22.0.0 } + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/debug': ^4.1.12 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 3.2.4 + '@vitest/ui': 3.2.4 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/debug': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + volar-service-css@0.0.62: + resolution: { integrity: sha512-JwNyKsH3F8PuzZYuqPf+2e+4CTU8YoyUHEHVnoXNlrLe7wy9U3biomZ56llN69Ris7TTy/+DEX41yVxQpM4qvg== } + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-emmet@0.0.62: + resolution: { integrity: sha512-U4dxWDBWz7Pi4plpbXf4J4Z/ss6kBO3TYrACxWNsE29abu75QzVS0paxDDhI6bhqpbDFXlpsDhZ9aXVFpnfGRQ== } + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-html@0.0.62: + resolution: { integrity: sha512-Zw01aJsZRh4GTGUjveyfEzEqpULQUdQH79KNEiKVYHZyuGtdBRYCHlrus1sueSNMxwwkuF5WnOHfvBzafs8yyQ== } + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-prettier@0.0.62: + resolution: { integrity: sha512-h2yk1RqRTE+vkYZaI9KYuwpDfOQRrTEMvoHol0yW4GFKc75wWQRrb5n/5abDrzMPrkQbSip8JH2AXbvrRtYh4w== } + peerDependencies: + '@volar/language-service': ~2.4.0 + prettier: ^2.2 || ^3.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + prettier: + optional: true + + volar-service-typescript-twoslash-queries@0.0.62: + resolution: { integrity: sha512-KxFt4zydyJYYI0kFAcWPTh4u0Ha36TASPZkAnNY784GtgajerUqM80nX/W1d0wVhmcOFfAxkVsf/Ed+tiYU7ng== } + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-typescript@0.0.62: + resolution: { integrity: sha512-p7MPi71q7KOsH0eAbZwPBiKPp9B2+qrdHAd6VY5oTo9BUXatsOAdakTm9Yf0DUj6uWBAaOT01BSeVOPwucMV1g== } + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-yaml@0.0.62: + resolution: { integrity: sha512-k7gvv7sk3wa+nGll3MaSKyjwQsJjIGCHFjVkl3wjaSP2nouKyn9aokGmqjrl39mi88Oy49giog2GkZH526wjig== } + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + vscode-css-languageservice@6.3.7: + resolution: { integrity: sha512-5TmXHKllPzfkPhW4UE9sODV3E0bIOJPOk+EERKllf2SmAczjfTmYeq5txco+N3jpF8KIZ6loj/JptpHBQuVQRA== } + + vscode-html-languageservice@5.5.1: + resolution: { integrity: sha512-/ZdEtsZ3OiFSyL00kmmu7crFV9KwWR+MgpzjsxO60DQH7sIfHZM892C/E4iDd11EKocr+NYuvOA4Y7uc3QzLEA== } + + vscode-json-languageservice@4.1.8: + resolution: { integrity: sha512-0vSpg6Xd9hfV+eZAaYN63xVVMOTmJ4GgHxXnkLCh+9RsQBkWKIghzLhW2B9ebfG+LQQg8uLtsQ2aUKjTgE+QOg== } + engines: { npm: '>=7.0.0' } + + vscode-jsonrpc@6.0.0: + resolution: { integrity: sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg== } + engines: { node: '>=8.0.0 || >=10.0.0' } + + vscode-jsonrpc@8.2.0: + resolution: { integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA== } + engines: { node: '>=14.0.0' } + + vscode-languageserver-protocol@3.16.0: + resolution: { integrity: sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A== } + + vscode-languageserver-protocol@3.17.5: + resolution: { integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg== } + + vscode-languageserver-textdocument@1.0.12: + resolution: { integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA== } + + vscode-languageserver-types@3.16.0: + resolution: { integrity: sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA== } + + vscode-languageserver-types@3.17.5: + resolution: { integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg== } + + vscode-languageserver@7.0.0: + resolution: { integrity: sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw== } + hasBin: true + + vscode-languageserver@9.0.1: + resolution: { integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g== } + hasBin: true + + vscode-nls@5.2.0: + resolution: { integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng== } + + vscode-uri@3.1.0: + resolution: { integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ== } + + w3c-xmlserializer@5.0.0: + resolution: { integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA== } + engines: { node: '>=18' } + + web-namespaces@2.0.1: + resolution: { integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ== } + + webidl-conversions@3.0.1: + resolution: { integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== } + + webidl-conversions@7.0.0: + resolution: { integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== } + engines: { node: '>=12' } + + webpack-virtual-modules@0.6.2: + resolution: { integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ== } + + whatwg-encoding@3.1.1: + resolution: { integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ== } + engines: { node: '>=18' } + + whatwg-mimetype@4.0.0: + resolution: { integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg== } + engines: { node: '>=18' } + + whatwg-url@14.2.0: + resolution: { integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw== } + engines: { node: '>=18' } + + whatwg-url@5.0.0: + resolution: { integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== } + + which-pm-runs@1.1.0: + resolution: { integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA== } + engines: { node: '>=4' } + + which@2.0.2: + resolution: { integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== } + engines: { node: '>= 8' } + hasBin: true + + why-is-node-running@2.3.0: + resolution: { integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w== } + engines: { node: '>=8' } + hasBin: true + + widest-line@5.0.0: + resolution: { integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA== } + engines: { node: '>=18' } + + wrap-ansi@7.0.0: + resolution: { integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== } + engines: { node: '>=10' } + + wrap-ansi@8.1.0: + resolution: { integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== } + engines: { node: '>=12' } + + wrap-ansi@9.0.2: + resolution: { integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww== } + engines: { node: '>=18' } + + wrappy@1.0.2: + resolution: { integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== } + + ws@8.18.3: + resolution: { integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg== } + engines: { node: '>=10.0.0' } + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xml-name-validator@5.0.0: + resolution: { integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg== } + engines: { node: '>=18' } + + xmlchars@2.2.0: + resolution: { integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== } + + xxhash-wasm@1.1.0: + resolution: { integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA== } + + y18n@5.0.8: + resolution: { integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== } + engines: { node: '>=10' } + + yallist@3.1.1: + resolution: { integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== } + + yallist@4.0.0: + resolution: { integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== } + + yallist@5.0.0: + resolution: { integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw== } + engines: { node: '>=18' } + + yaml-language-server@1.15.0: + resolution: { integrity: sha512-N47AqBDCMQmh6mBLmI6oqxryHRzi33aPFPsJhYy3VTUGCdLHYjGh4FZzpUjRlphaADBBkDmnkM/++KNIOHi5Rw== } + hasBin: true + + yaml@2.2.2: + resolution: { integrity: sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA== } + engines: { node: '>= 14' } + + yaml@2.8.1: + resolution: { integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw== } + engines: { node: '>= 14.6' } + hasBin: true + + yargs-parser@21.1.1: + resolution: { integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== } + engines: { node: '>=12' } + + yargs@17.7.2: + resolution: { integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== } + engines: { node: '>=12' } + + yauzl@2.10.0: + resolution: { integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== } + + yocto-queue@1.2.1: + resolution: { integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg== } + engines: { node: '>=12.20' } + + yocto-spinner@0.2.3: + resolution: { integrity: sha512-sqBChb33loEnkoXte1bLg45bEBsOP9N1kzQh5JZNKj/0rik4zAPTNSAVPj3uQAdc6slYJ0Ksc403G2XgxsJQFQ== } + engines: { node: '>=18.19' } + + yoctocolors@2.1.2: + resolution: { integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug== } + engines: { node: '>=18' } + + zimmerframe@1.1.2: + resolution: { integrity: sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w== } + + zod-to-json-schema@3.24.6: + resolution: { integrity: sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg== } + peerDependencies: + zod: ^3.24.1 + + zod-to-ts@1.2.0: + resolution: { integrity: sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA== } + peerDependencies: + typescript: ^4.9.4 || ^5.0.2 + zod: ^3 + + zod@3.25.76: + resolution: { integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ== } + + zwitch@2.0.4: + resolution: { integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A== } + +snapshots: + '@adobe/css-tools@4.4.4': {} + + '@alloc/quick-lru@5.2.0': {} + + '@antfu/install-pkg@1.1.0': + dependencies: + package-manager-detector: 1.3.0 + tinyexec: 1.0.1 + + '@antfu/utils@8.1.1': {} + + '@asamuzakjp/css-color@3.2.0': + dependencies: + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + lru-cache: 10.4.3 + + '@astrojs/check@0.9.4(prettier-plugin-astro@0.14.1)(prettier@3.6.2)(typescript@5.9.2)': + dependencies: + '@astrojs/language-server': 2.15.4(prettier-plugin-astro@0.14.1)(prettier@3.6.2)(typescript@5.9.2) + chokidar: 4.0.3 + kleur: 4.1.5 + typescript: 5.9.2 + yargs: 17.7.2 + transitivePeerDependencies: + - prettier + - prettier-plugin-astro + + '@astrojs/compiler@2.13.0': {} + + '@astrojs/internal-helpers@0.7.2': {} + + '@astrojs/language-server@2.15.4(prettier-plugin-astro@0.14.1)(prettier@3.6.2)(typescript@5.9.2)': + dependencies: + '@astrojs/compiler': 2.13.0 + '@astrojs/yaml2ts': 0.2.2 + '@jridgewell/sourcemap-codec': 1.5.5 + '@volar/kit': 2.4.23(typescript@5.9.2) + '@volar/language-core': 2.4.23 + '@volar/language-server': 2.4.23 + '@volar/language-service': 2.4.23 + fast-glob: 3.3.3 + muggle-string: 0.4.1 + volar-service-css: 0.0.62(@volar/language-service@2.4.23) + volar-service-emmet: 0.0.62(@volar/language-service@2.4.23) + volar-service-html: 0.0.62(@volar/language-service@2.4.23) + volar-service-prettier: 0.0.62(@volar/language-service@2.4.23)(prettier@3.6.2) + volar-service-typescript: 0.0.62(@volar/language-service@2.4.23) + volar-service-typescript-twoslash-queries: 0.0.62(@volar/language-service@2.4.23) + volar-service-yaml: 0.0.62(@volar/language-service@2.4.23) + vscode-html-languageservice: 5.5.1 + vscode-uri: 3.1.0 + optionalDependencies: + prettier: 3.6.2 + prettier-plugin-astro: 0.14.1 + transitivePeerDependencies: + - typescript + + '@astrojs/markdown-remark@6.3.6': + dependencies: + '@astrojs/internal-helpers': 0.7.2 + '@astrojs/prism': 3.3.0 + github-slugger: 2.0.0 + hast-util-from-html: 2.0.3 + hast-util-to-text: 4.0.2 + import-meta-resolve: 4.2.0 + js-yaml: 4.1.0 + mdast-util-definitions: 6.0.0 + rehype-raw: 7.0.0 + rehype-stringify: 10.0.1 + remark-gfm: 4.0.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + remark-smartypants: 3.0.2 + shiki: 3.12.2 + smol-toml: 1.4.2 + unified: 11.0.5 + unist-util-remove-position: 5.0.0 + unist-util-visit: 5.0.0 + unist-util-visit-parents: 6.0.1 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@astrojs/mdx@4.3.4(astro@5.13.5(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(rollup@4.50.2)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(typescript@5.9.2)(yaml@2.8.1))': + dependencies: + '@astrojs/markdown-remark': 6.3.6 + '@mdx-js/mdx': 3.1.1 + acorn: 8.15.0 + astro: 5.13.5(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(rollup@4.50.2)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(typescript@5.9.2)(yaml@2.8.1) + es-module-lexer: 1.7.0 + estree-util-visit: 2.0.0 + hast-util-to-html: 9.0.5 + kleur: 4.1.5 + rehype-raw: 7.0.0 + remark-gfm: 4.0.1 + remark-smartypants: 3.0.2 + source-map: 0.7.6 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@astrojs/partytown@2.1.4': + dependencies: + '@qwik.dev/partytown': 0.11.2 + mrmime: 2.0.1 + + '@astrojs/prism@3.3.0': + dependencies: + prismjs: 1.30.0 + + '@astrojs/react@4.3.0(@types/node@24.5.0)(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(jiti@2.5.1)(lightningcss@1.30.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1)': + dependencies: + '@types/react': 19.1.12 + '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@vitejs/plugin-react': 4.7.0(vite@6.3.6(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1)) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + ultrahtml: 1.6.0 + vite: 6.3.6(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + '@astrojs/svelte@7.1.0(@types/node@24.5.0)(astro@5.13.5(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(rollup@4.50.2)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(typescript@5.9.2)(yaml@2.8.1))(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(svelte@5.38.6)(tsx@4.20.5)(typescript@5.9.2)(yaml@2.8.1)': + dependencies: + '@sveltejs/vite-plugin-svelte': 5.1.1(svelte@5.38.6)(vite@7.1.5(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1)) + astro: 5.13.5(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(rollup@4.50.2)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(typescript@5.9.2)(yaml@2.8.1) + svelte: 5.38.6 + svelte2tsx: 0.7.43(svelte@5.38.6)(typescript@5.9.2) + typescript: 5.9.2 + vite: 6.3.6(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + '@astrojs/telemetry@3.3.0': + dependencies: + ci-info: 4.3.0 + debug: 4.4.3 + dlv: 1.1.3 + dset: 3.1.4 + is-docker: 3.0.0 + is-wsl: 3.1.0 + which-pm-runs: 1.1.0 + transitivePeerDependencies: + - supports-color + + '@astrojs/yaml2ts@0.2.2': + dependencies: + yaml: 2.8.1 + + '@atproto/api@0.16.6': + dependencies: + '@atproto/common-web': 0.4.3 + '@atproto/lexicon': 0.5.1 + '@atproto/syntax': 0.4.1 + '@atproto/xrpc': 0.7.5 + await-lock: 2.2.2 + multiformats: 9.9.0 + tlds: 1.260.0 + zod: 3.25.76 + + '@atproto/common-web@0.4.3': + dependencies: + graphemer: 1.4.0 + multiformats: 9.9.0 + uint8arrays: 3.0.0 + zod: 3.25.76 + + '@atproto/lexicon@0.5.1': + dependencies: + '@atproto/common-web': 0.4.3 + '@atproto/syntax': 0.4.1 + iso-datestring-validator: 2.2.2 + multiformats: 9.9.0 + zod: 3.25.76 + + '@atproto/syntax@0.4.1': {} + + '@atproto/xrpc@0.7.5': + dependencies: + '@atproto/lexicon': 0.5.1 + zod: 3.25.76 + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.28.4': {} + + '@babel/core@7.28.4': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.4 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.28.3': + dependencies: + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.27.2': + dependencies: + '@babel/compat-data': 7.28.4 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.26.2 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.27.1': {} + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.27.1': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helpers@7.28.4': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.4 + + '@babel/parser@7.28.4': + dependencies: + '@babel/types': 7.28.4 + + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/runtime@7.28.4': {} + + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + + '@babel/traverse@7.28.4': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.4 + '@babel/template': 7.27.2 + '@babel/types': 7.28.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.28.4': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + + '@bufbuild/protobuf@2.8.0': {} + + '@capsizecss/unpack@2.4.0': + dependencies: + blob-to-buffer: 1.2.9 + cross-fetch: 3.2.0 + fontkit: 2.0.4 + transitivePeerDependencies: + - encoding + + '@changesets/apply-release-plan@7.0.13': + dependencies: + '@changesets/config': 3.1.1 + '@changesets/get-version-range-type': 0.4.0 + '@changesets/git': 3.0.4 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + detect-indent: 6.1.0 + fs-extra: 7.0.1 + lodash.startcase: 4.4.0 + outdent: 0.5.0 + prettier: 2.8.8 + resolve-from: 5.0.0 + semver: 7.7.2 + + '@changesets/assemble-release-plan@6.0.9': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + semver: 7.7.2 + + '@changesets/changelog-git@0.2.1': + dependencies: + '@changesets/types': 6.1.0 + + '@changesets/cli@2.29.7(@types/node@24.5.0)': + dependencies: + '@changesets/apply-release-plan': 7.0.13 + '@changesets/assemble-release-plan': 6.0.9 + '@changesets/changelog-git': 0.2.1 + '@changesets/config': 3.1.1 + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/get-release-plan': 4.0.13 + '@changesets/git': 3.0.4 + '@changesets/logger': 0.1.1 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.5 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@changesets/write': 0.4.0 + '@inquirer/external-editor': 1.0.2(@types/node@24.5.0) + '@manypkg/get-packages': 1.1.3 + ansi-colors: 4.1.3 + ci-info: 3.9.0 + enquirer: 2.4.1 + fs-extra: 7.0.1 + mri: 1.2.0 + p-limit: 2.3.0 + package-manager-detector: 0.2.11 + picocolors: 1.1.1 + resolve-from: 5.0.0 + semver: 7.7.2 + spawndamnit: 3.0.1 + term-size: 2.2.1 + transitivePeerDependencies: + - '@types/node' + + '@changesets/config@3.1.1': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/logger': 0.1.1 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + micromatch: 4.0.8 + + '@changesets/errors@0.2.0': + dependencies: + extendable-error: 0.1.7 + + '@changesets/get-dependents-graph@2.1.3': + dependencies: + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + picocolors: 1.1.1 + semver: 7.7.2 + + '@changesets/get-github-info@0.6.0': + dependencies: + dataloader: 1.4.0 + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + '@changesets/get-release-plan@4.0.13': + dependencies: + '@changesets/assemble-release-plan': 6.0.9 + '@changesets/config': 3.1.1 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.5 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/get-version-range-type@0.4.0': {} + + '@changesets/git@3.0.4': + dependencies: + '@changesets/errors': 0.2.0 + '@manypkg/get-packages': 1.1.3 + is-subdir: 1.2.0 + micromatch: 4.0.8 + spawndamnit: 3.0.1 + + '@changesets/logger@0.1.1': + dependencies: + picocolors: 1.1.1 + + '@changesets/parse@0.4.1': + dependencies: + '@changesets/types': 6.1.0 + js-yaml: 3.14.1 + + '@changesets/pre@2.0.2': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + + '@changesets/read@0.6.5': + dependencies: + '@changesets/git': 3.0.4 + '@changesets/logger': 0.1.1 + '@changesets/parse': 0.4.1 + '@changesets/types': 6.1.0 + fs-extra: 7.0.1 + p-filter: 2.1.0 + picocolors: 1.1.1 + + '@changesets/should-skip-package@0.1.2': + dependencies: + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/types@4.1.0': {} + + '@changesets/types@6.1.0': {} + + '@changesets/write@0.4.0': + dependencies: + '@changesets/types': 6.1.0 + fs-extra: 7.0.1 + human-id: 4.1.1 + prettier: 2.8.8 + + '@clack/core@0.5.0': + dependencies: + picocolors: 1.1.1 + sisteransi: 1.0.5 + + '@clack/prompts@0.11.0': + dependencies: + '@clack/core': 0.5.0 + picocolors: 1.1.1 + sisteransi: 1.0.5 + + '@csstools/color-helpers@5.1.0': {} + + '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/color-helpers': 5.1.0 + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-tokenizer@3.0.4': {} + + '@ctrl/tinycolor@4.2.0': {} + + '@emmetio/abbreviation@2.3.3': + dependencies: + '@emmetio/scanner': 1.0.4 + + '@emmetio/css-abbreviation@2.1.8': + dependencies: + '@emmetio/scanner': 1.0.4 + + '@emmetio/css-parser@0.4.0': + dependencies: + '@emmetio/stream-reader': 2.2.0 + '@emmetio/stream-reader-utils': 0.1.0 + + '@emmetio/html-matcher@1.3.0': + dependencies: + '@emmetio/scanner': 1.0.4 + + '@emmetio/scanner@1.0.4': {} + + '@emmetio/stream-reader-utils@0.1.0': {} + + '@emmetio/stream-reader@2.2.0': {} + + '@emnapi/core@1.5.0': + dependencies: + '@emnapi/wasi-threads': 1.1.0 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.5.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.1.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@esbuild/aix-ppc64@0.25.9': + optional: true + + '@esbuild/android-arm64@0.25.9': + optional: true + + '@esbuild/android-arm@0.25.9': + optional: true + + '@esbuild/android-x64@0.25.9': + optional: true + + '@esbuild/darwin-arm64@0.25.9': + optional: true + + '@esbuild/darwin-x64@0.25.9': + optional: true + + '@esbuild/freebsd-arm64@0.25.9': + optional: true + + '@esbuild/freebsd-x64@0.25.9': + optional: true + + '@esbuild/linux-arm64@0.25.9': + optional: true + + '@esbuild/linux-arm@0.25.9': + optional: true + + '@esbuild/linux-ia32@0.25.9': + optional: true + + '@esbuild/linux-loong64@0.25.9': + optional: true + + '@esbuild/linux-mips64el@0.25.9': + optional: true + + '@esbuild/linux-ppc64@0.25.9': + optional: true + + '@esbuild/linux-riscv64@0.25.9': + optional: true + + '@esbuild/linux-s390x@0.25.9': + optional: true + + '@esbuild/linux-x64@0.25.9': + optional: true + + '@esbuild/netbsd-arm64@0.25.9': + optional: true + + '@esbuild/netbsd-x64@0.25.9': + optional: true + + '@esbuild/openbsd-arm64@0.25.9': + optional: true + + '@esbuild/openbsd-x64@0.25.9': + optional: true + + '@esbuild/openharmony-arm64@0.25.9': + optional: true + + '@esbuild/sunos-x64@0.25.9': + optional: true + + '@esbuild/win32-arm64@0.25.9': + optional: true + + '@esbuild/win32-ia32@0.25.9': + optional: true + + '@esbuild/win32-x64@0.25.9': + optional: true + + '@expressive-code/core@0.41.3': + dependencies: + '@ctrl/tinycolor': 4.2.0 + hast-util-select: 6.0.4 + hast-util-to-html: 9.0.5 + hast-util-to-text: 4.0.2 + hastscript: 9.0.1 + postcss: 8.5.6 + postcss-nested: 6.2.0(postcss@8.5.6) + unist-util-visit: 5.0.0 + unist-util-visit-parents: 6.0.1 + + '@expressive-code/plugin-frames@0.41.3': + dependencies: + '@expressive-code/core': 0.41.3 + + '@expressive-code/plugin-shiki@0.41.3': + dependencies: + '@expressive-code/core': 0.41.3 + shiki: 3.12.2 + + '@expressive-code/plugin-text-markers@0.41.3': + dependencies: + '@expressive-code/core': 0.41.3 + + '@floating-ui/core@1.7.3': + dependencies: + '@floating-ui/utils': 0.2.10 + + '@floating-ui/dom@1.7.4': + dependencies: + '@floating-ui/core': 1.7.3 + '@floating-ui/utils': 0.2.10 + + '@floating-ui/react-dom@2.1.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@floating-ui/dom': 1.7.4 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + '@floating-ui/react@0.27.16(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@floating-ui/react-dom': 2.1.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@floating-ui/utils': 0.2.10 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + tabbable: 6.2.0 + + '@floating-ui/utils@0.2.10': {} + + '@iconify/tools@4.1.3': + dependencies: + '@iconify/types': 2.0.0 + '@iconify/utils': 2.3.0 + '@types/tar': 6.1.13 + axios: 1.12.2 + cheerio: 1.0.0 + domhandler: 5.0.3 + extract-zip: 2.0.1 + local-pkg: 0.5.1 + pathe: 1.1.2 + svgo: 3.3.2 + tar: 6.2.1 + transitivePeerDependencies: + - debug + - supports-color + + '@iconify/types@2.0.0': {} + + '@iconify/utils@2.3.0': + dependencies: + '@antfu/install-pkg': 1.1.0 + '@antfu/utils': 8.1.1 + '@iconify/types': 2.0.0 + debug: 4.4.3 + globals: 15.15.0 + kolorist: 1.8.0 + local-pkg: 1.1.2 + mlly: 1.8.0 + transitivePeerDependencies: + - supports-color + + '@img/sharp-darwin-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.0.4 + optional: true + + '@img/sharp-darwin-arm64@0.34.3': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.2.0 + optional: true + + '@img/sharp-darwin-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.0.4 + optional: true + + '@img/sharp-darwin-x64@0.34.3': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.2.0 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-darwin-arm64@1.2.0': + optional: true + + '@img/sharp-libvips-darwin-x64@1.0.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.2.0': + optional: true + + '@img/sharp-libvips-linux-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.2.0': + optional: true + + '@img/sharp-libvips-linux-arm@1.0.5': + optional: true + + '@img/sharp-libvips-linux-arm@1.2.0': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.2.0': + optional: true + + '@img/sharp-libvips-linux-s390x@1.0.4': + optional: true + + '@img/sharp-libvips-linux-s390x@1.2.0': + optional: true + + '@img/sharp-libvips-linux-x64@1.0.4': + optional: true + + '@img/sharp-libvips-linux-x64@1.2.0': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.2.0': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.2.0': + optional: true + + '@img/sharp-linux-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.0.4 + optional: true + + '@img/sharp-linux-arm64@0.34.3': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.2.0 + optional: true + + '@img/sharp-linux-arm@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.0.5 + optional: true + + '@img/sharp-linux-arm@0.34.3': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.2.0 + optional: true + + '@img/sharp-linux-ppc64@0.34.3': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.2.0 + optional: true + + '@img/sharp-linux-s390x@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.0.4 + optional: true + + '@img/sharp-linux-s390x@0.34.3': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.2.0 + optional: true + + '@img/sharp-linux-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.0.4 + optional: true + + '@img/sharp-linux-x64@0.34.3': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.2.0 + optional: true + + '@img/sharp-linuxmusl-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + optional: true + + '@img/sharp-linuxmusl-arm64@0.34.3': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.2.0 + optional: true + + '@img/sharp-linuxmusl-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + optional: true + + '@img/sharp-linuxmusl-x64@0.34.3': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.0 + optional: true + + '@img/sharp-wasm32@0.33.5': + dependencies: + '@emnapi/runtime': 1.5.0 + optional: true + + '@img/sharp-wasm32@0.34.3': + dependencies: + '@emnapi/runtime': 1.5.0 + optional: true + + '@img/sharp-win32-arm64@0.34.3': + optional: true + + '@img/sharp-win32-ia32@0.33.5': + optional: true + + '@img/sharp-win32-ia32@0.34.3': + optional: true + + '@img/sharp-win32-x64@0.33.5': + optional: true + + '@img/sharp-win32-x64@0.34.3': + optional: true + + '@inquirer/external-editor@1.0.2(@types/node@24.5.0)': + dependencies: + chardet: 2.1.0 + iconv-lite: 0.7.0 + optionalDependencies: + '@types/node': 24.5.0 + + '@isaacs/balanced-match@4.0.1': {} + + '@isaacs/brace-expansion@5.0.0': + dependencies: + '@isaacs/balanced-match': 4.0.1 + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.2 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.2 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@lucide/svelte@0.542.0(svelte@5.38.6)': + dependencies: + svelte: 5.38.6 + + '@manypkg/find-root@1.1.0': + dependencies: + '@babel/runtime': 7.28.4 + '@types/node': 12.20.55 + find-up: 4.1.0 + fs-extra: 8.1.0 + + '@manypkg/get-packages@1.1.3': + dependencies: + '@babel/runtime': 7.28.4 + '@changesets/types': 4.1.0 + '@manypkg/find-root': 1.1.0 + fs-extra: 8.1.0 + globby: 11.1.0 + read-yaml-file: 1.1.0 + + '@mapbox/node-pre-gyp@2.0.0': + dependencies: + consola: 3.4.2 + detect-libc: 2.1.0 + https-proxy-agent: 7.0.6 + node-fetch: 2.7.0 + nopt: 8.1.0 + semver: 7.7.2 + tar: 7.4.3 + transitivePeerDependencies: + - encoding + - supports-color + + '@mdx-js/mdx@3.1.1': + dependencies: + '@types/estree': 1.0.8 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdx': 2.0.13 + acorn: 8.15.0 + collapse-white-space: 2.1.0 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-util-scope: 1.0.0 + estree-walker: 3.0.3 + hast-util-to-jsx-runtime: 2.3.6 + markdown-extensions: 2.0.0 + recma-build-jsx: 1.0.0 + recma-jsx: 1.0.1(acorn@8.15.0) + recma-stringify: 1.0.0 + rehype-recma: 1.0.0 + remark-mdx: 3.1.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + source-map: 0.7.6 + unified: 11.0.5 + unist-util-position-from-estree: 2.0.0 + unist-util-stringify-position: 4.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@nanostores/persistent@1.1.0(nanostores@1.0.1)': + dependencies: + nanostores: 1.0.1 + + '@napi-rs/wasm-runtime@1.0.5': + dependencies: + '@emnapi/core': 1.5.0 + '@emnapi/runtime': 1.5.0 + '@tybys/wasm-util': 0.10.1 + optional: true + + '@next/env@15.5.2': {} + + '@next/swc-darwin-arm64@15.5.2': + optional: true + + '@next/swc-darwin-x64@15.5.2': + optional: true + + '@next/swc-linux-arm64-gnu@15.5.2': + optional: true + + '@next/swc-linux-arm64-musl@15.5.2': + optional: true + + '@next/swc-linux-x64-gnu@15.5.2': + optional: true + + '@next/swc-linux-x64-musl@15.5.2': + optional: true + + '@next/swc-win32-arm64-msvc@15.5.2': + optional: true + + '@next/swc-win32-x64-msvc@15.5.2': + optional: true + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + '@octokit/app@16.1.0': + dependencies: + '@octokit/auth-app': 8.1.0 + '@octokit/auth-unauthenticated': 7.0.1 + '@octokit/core': 7.0.4 + '@octokit/oauth-app': 8.0.1 + '@octokit/plugin-paginate-rest': 13.1.1(@octokit/core@7.0.4) + '@octokit/types': 14.1.0 + '@octokit/webhooks': 14.1.3 + + '@octokit/auth-app@8.1.0': + dependencies: + '@octokit/auth-oauth-app': 9.0.1 + '@octokit/auth-oauth-user': 6.0.0 + '@octokit/request': 10.0.3 + '@octokit/request-error': 7.0.0 + '@octokit/types': 14.1.0 + toad-cache: 3.7.0 + universal-github-app-jwt: 2.2.2 + universal-user-agent: 7.0.3 + + '@octokit/auth-oauth-app@9.0.1': + dependencies: + '@octokit/auth-oauth-device': 8.0.1 + '@octokit/auth-oauth-user': 6.0.0 + '@octokit/request': 10.0.3 + '@octokit/types': 14.1.0 + universal-user-agent: 7.0.3 + + '@octokit/auth-oauth-device@8.0.1': + dependencies: + '@octokit/oauth-methods': 6.0.0 + '@octokit/request': 10.0.3 + '@octokit/types': 14.1.0 + universal-user-agent: 7.0.3 + + '@octokit/auth-oauth-user@6.0.0': + dependencies: + '@octokit/auth-oauth-device': 8.0.1 + '@octokit/oauth-methods': 6.0.0 + '@octokit/request': 10.0.3 + '@octokit/types': 14.1.0 + universal-user-agent: 7.0.3 + + '@octokit/auth-token@6.0.0': {} + + '@octokit/auth-unauthenticated@7.0.1': + dependencies: + '@octokit/request-error': 7.0.0 + '@octokit/types': 14.1.0 + + '@octokit/core@7.0.4': + dependencies: + '@octokit/auth-token': 6.0.0 + '@octokit/graphql': 9.0.1 + '@octokit/request': 10.0.3 + '@octokit/request-error': 7.0.0 + '@octokit/types': 15.0.0 + before-after-hook: 4.0.0 + universal-user-agent: 7.0.3 + + '@octokit/endpoint@11.0.0': + dependencies: + '@octokit/types': 14.1.0 + universal-user-agent: 7.0.3 + + '@octokit/graphql@9.0.1': + dependencies: + '@octokit/request': 10.0.3 + '@octokit/types': 14.1.0 + universal-user-agent: 7.0.3 + + '@octokit/oauth-app@8.0.1': + dependencies: + '@octokit/auth-oauth-app': 9.0.1 + '@octokit/auth-oauth-user': 6.0.0 + '@octokit/auth-unauthenticated': 7.0.1 + '@octokit/core': 7.0.4 + '@octokit/oauth-authorization-url': 8.0.0 + '@octokit/oauth-methods': 6.0.0 + '@types/aws-lambda': 8.10.152 + universal-user-agent: 7.0.3 + + '@octokit/oauth-authorization-url@8.0.0': {} + + '@octokit/oauth-methods@6.0.0': + dependencies: + '@octokit/oauth-authorization-url': 8.0.0 + '@octokit/request': 10.0.3 + '@octokit/request-error': 7.0.0 + '@octokit/types': 14.1.0 + + '@octokit/openapi-types@25.1.0': {} + + '@octokit/openapi-types@26.0.0': {} + + '@octokit/openapi-webhooks-types@12.0.3': {} + + '@octokit/plugin-paginate-graphql@6.0.0(@octokit/core@7.0.4)': + dependencies: + '@octokit/core': 7.0.4 + + '@octokit/plugin-paginate-rest@13.1.1(@octokit/core@7.0.4)': + dependencies: + '@octokit/core': 7.0.4 + '@octokit/types': 14.1.0 + + '@octokit/plugin-rest-endpoint-methods@16.1.0(@octokit/core@7.0.4)': + dependencies: + '@octokit/core': 7.0.4 + '@octokit/types': 15.0.0 + + '@octokit/plugin-retry@8.0.1(@octokit/core@7.0.4)': + dependencies: + '@octokit/core': 7.0.4 + '@octokit/request-error': 7.0.0 + '@octokit/types': 14.1.0 + bottleneck: 2.19.5 + + '@octokit/plugin-throttling@11.0.1(@octokit/core@7.0.4)': + dependencies: + '@octokit/core': 7.0.4 + '@octokit/types': 14.1.0 + bottleneck: 2.19.5 + + '@octokit/request-error@7.0.0': + dependencies: + '@octokit/types': 14.1.0 + + '@octokit/request@10.0.3': + dependencies: + '@octokit/endpoint': 11.0.0 + '@octokit/request-error': 7.0.0 + '@octokit/types': 14.1.0 + fast-content-type-parse: 3.0.0 + universal-user-agent: 7.0.3 + + '@octokit/types@14.1.0': + dependencies: + '@octokit/openapi-types': 25.1.0 + + '@octokit/types@15.0.0': + dependencies: + '@octokit/openapi-types': 26.0.0 + + '@octokit/webhooks-methods@6.0.0': {} + + '@octokit/webhooks@14.1.3': + dependencies: + '@octokit/openapi-webhooks-types': 12.0.3 + '@octokit/request-error': 7.0.0 + '@octokit/webhooks-methods': 6.0.0 + + '@oslojs/encoding@1.1.0': {} + + '@oxc-project/types@0.89.0': {} + + '@oxlint-tsgolint/darwin-arm64@0.2.0': + optional: true + + '@oxlint-tsgolint/darwin-x64@0.2.0': + optional: true + + '@oxlint-tsgolint/linux-arm64@0.2.0': + optional: true + + '@oxlint-tsgolint/linux-x64@0.2.0': + optional: true + + '@oxlint-tsgolint/win32-arm64@0.2.0': + optional: true + + '@oxlint-tsgolint/win32-x64@0.2.0': + optional: true + + '@oxlint/darwin-arm64@1.15.0': + optional: true + + '@oxlint/darwin-x64@1.15.0': + optional: true + + '@oxlint/linux-arm64-gnu@1.15.0': + optional: true + + '@oxlint/linux-arm64-musl@1.15.0': + optional: true + + '@oxlint/linux-x64-gnu@1.15.0': + optional: true + + '@oxlint/linux-x64-musl@1.15.0': + optional: true + + '@oxlint/win32-arm64@1.15.0': + optional: true + + '@oxlint/win32-x64@1.15.0': + optional: true + + '@pagefind/darwin-arm64@1.3.0': + optional: true + + '@pagefind/darwin-x64@1.3.0': + optional: true + + '@pagefind/linux-arm64@1.3.0': + optional: true + + '@pagefind/linux-x64@1.3.0': + optional: true + + '@pagefind/windows-x64@1.3.0': + optional: true + + '@parcel/watcher-android-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-x64@2.5.1': + optional: true + + '@parcel/watcher-freebsd-x64@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-musl@2.5.1': + optional: true + + '@parcel/watcher-win32-arm64@2.5.1': + optional: true + + '@parcel/watcher-win32-ia32@2.5.1': + optional: true + + '@parcel/watcher-win32-x64@2.5.1': + optional: true + + '@parcel/watcher@2.5.1': + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.8 + node-addon-api: 7.1.1 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.5.1 + '@parcel/watcher-darwin-arm64': 2.5.1 + '@parcel/watcher-darwin-x64': 2.5.1 + '@parcel/watcher-freebsd-x64': 2.5.1 + '@parcel/watcher-linux-arm-glibc': 2.5.1 + '@parcel/watcher-linux-arm-musl': 2.5.1 + '@parcel/watcher-linux-arm64-glibc': 2.5.1 + '@parcel/watcher-linux-arm64-musl': 2.5.1 + '@parcel/watcher-linux-x64-glibc': 2.5.1 + '@parcel/watcher-linux-x64-musl': 2.5.1 + '@parcel/watcher-win32-arm64': 2.5.1 + '@parcel/watcher-win32-ia32': 2.5.1 + '@parcel/watcher-win32-x64': 2.5.1 + optional: true + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@pnpm/config.env-replace@1.1.0': {} + + '@pnpm/network.ca-file@1.0.2': + dependencies: + graceful-fs: 4.2.10 + + '@pnpm/npm-conf@2.3.1': + dependencies: + '@pnpm/config.env-replace': 1.1.0 + '@pnpm/network.ca-file': 1.0.2 + config-chain: 1.1.13 + + '@polka/url@1.0.0-next.29': {} + + '@publint/pack@0.1.2': {} + + '@quansync/fs@0.1.5': + dependencies: + quansync: 0.2.11 + + '@qwik.dev/partytown@0.11.2': + dependencies: + dotenv: 16.6.1 + + '@rolldown/binding-android-arm64@1.0.0-beta.38': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.0-beta.38': + optional: true + + '@rolldown/binding-darwin-x64@1.0.0-beta.38': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.0-beta.38': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.38': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.38': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.38': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.38': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.38': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.0-beta.38': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.38': + dependencies: + '@napi-rs/wasm-runtime': 1.0.5 + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.38': + optional: true + + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.38': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.38': + optional: true + + '@rolldown/pluginutils@1.0.0-beta.27': {} + + '@rolldown/pluginutils@1.0.0-beta.34': {} + + '@rolldown/pluginutils@1.0.0-beta.38': {} + + '@rollup/pluginutils@5.3.0(rollup@4.50.2)': + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.3 + optionalDependencies: + rollup: 4.50.2 + + '@rollup/rollup-android-arm-eabi@4.50.2': + optional: true + + '@rollup/rollup-android-arm64@4.50.2': + optional: true + + '@rollup/rollup-darwin-arm64@4.50.2': + optional: true + + '@rollup/rollup-darwin-x64@4.50.2': + optional: true + + '@rollup/rollup-freebsd-arm64@4.50.2': + optional: true + + '@rollup/rollup-freebsd-x64@4.50.2': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.50.2': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.50.2': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.50.2': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.50.2': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.50.2': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.50.2': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.50.2': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.50.2': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.50.2': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.50.2': + optional: true + + '@rollup/rollup-linux-x64-musl@4.50.2': + optional: true + + '@rollup/rollup-openharmony-arm64@4.50.2': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.50.2': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.50.2': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.50.2': + optional: true + + '@shikijs/core@3.12.0': + dependencies: + '@shikijs/types': 3.12.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + + '@shikijs/core@3.12.2': + dependencies: + '@shikijs/types': 3.12.2 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + + '@shikijs/engine-javascript@3.12.0': + dependencies: + '@shikijs/types': 3.12.0 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 4.3.3 + + '@shikijs/engine-javascript@3.12.2': + dependencies: + '@shikijs/types': 3.12.2 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 4.3.3 + + '@shikijs/engine-oniguruma@3.12.0': + dependencies: + '@shikijs/types': 3.12.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/engine-oniguruma@3.12.2': + dependencies: + '@shikijs/types': 3.12.2 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@3.12.0': + dependencies: + '@shikijs/types': 3.12.0 + + '@shikijs/langs@3.12.2': + dependencies: + '@shikijs/types': 3.12.2 + + '@shikijs/themes@3.12.0': + dependencies: + '@shikijs/types': 3.12.0 + + '@shikijs/themes@3.12.2': + dependencies: + '@shikijs/types': 3.12.2 + + '@shikijs/types@3.12.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/types@3.12.2': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@10.0.2': {} + + '@standard-schema/spec@1.0.0': {} + + '@sveltejs/acorn-typescript@1.0.5(acorn@8.15.0)': + dependencies: + acorn: 8.15.0 + + '@sveltejs/adapter-auto@6.1.0(@sveltejs/kit@2.37.0(@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.6)(vite@7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1)))(svelte@5.38.6)(vite@7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1)))': + dependencies: + '@sveltejs/kit': 2.37.0(@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.6)(vite@7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1)))(svelte@5.38.6)(vite@7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1)) + + '@sveltejs/adapter-vercel@5.10.2(@sveltejs/kit@2.37.0(@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.6)(vite@7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1)))(svelte@5.38.6)(vite@7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1)))(rollup@4.50.2)': + dependencies: + '@sveltejs/kit': 2.37.0(@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.6)(vite@7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1)))(svelte@5.38.6)(vite@7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1)) + '@vercel/nft': 0.30.1(rollup@4.50.2) + esbuild: 0.25.9 + transitivePeerDependencies: + - encoding + - rollup + - supports-color + + '@sveltejs/kit@2.37.0(@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.6)(vite@7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1)))(svelte@5.38.6)(vite@7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1))': + dependencies: + '@standard-schema/spec': 1.0.0 + '@sveltejs/acorn-typescript': 1.0.5(acorn@8.15.0) + '@sveltejs/vite-plugin-svelte': 6.1.3(svelte@5.38.6)(vite@7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1)) + '@types/cookie': 0.6.0 + acorn: 8.15.0 + cookie: 0.6.0 + devalue: 5.3.2 + esm-env: 1.2.2 + kleur: 4.1.5 + magic-string: 0.30.19 + mrmime: 2.0.1 + sade: 1.8.1 + set-cookie-parser: 2.7.1 + sirv: 3.0.2 + svelte: 5.38.6 + vite: 7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1) + + '@sveltejs/package@2.5.0(svelte@5.38.6)(typescript@5.9.2)': + dependencies: + chokidar: 4.0.3 + kleur: 4.1.5 + sade: 1.8.1 + semver: 7.7.2 + svelte: 5.38.6 + svelte2tsx: 0.7.43(svelte@5.38.6)(typescript@5.9.2) + transitivePeerDependencies: + - typescript + + '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.38.6)(vite@6.3.6(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1)))(svelte@5.38.6)(vite@6.3.6(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1))': + dependencies: + '@sveltejs/vite-plugin-svelte': 5.1.1(svelte@5.38.6)(vite@7.1.5(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1)) + debug: 4.4.3 + svelte: 5.38.6 + vite: 6.3.6(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1) + transitivePeerDependencies: + - supports-color + + '@sveltejs/vite-plugin-svelte-inspector@5.0.1(@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.6)(vite@7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1)))(svelte@5.38.6)(vite@7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1))': + dependencies: + '@sveltejs/vite-plugin-svelte': 6.1.3(svelte@5.38.6)(vite@7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1)) + debug: 4.4.3 + svelte: 5.38.6 + vite: 7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1) + transitivePeerDependencies: + - supports-color + + '@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.38.6)(vite@7.1.5(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1))': + dependencies: + '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.38.6)(vite@6.3.6(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1)))(svelte@5.38.6)(vite@6.3.6(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1)) + debug: 4.4.3 + deepmerge: 4.3.1 + kleur: 4.1.5 + magic-string: 0.30.19 + svelte: 5.38.6 + vite: 7.1.5(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1) + vitefu: 1.1.1(vite@6.3.6(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1)) + transitivePeerDependencies: + - supports-color + + '@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.6)(vite@7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1))': + dependencies: + '@sveltejs/vite-plugin-svelte-inspector': 5.0.1(@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.6)(vite@7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1)))(svelte@5.38.6)(vite@7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1)) + debug: 4.4.3 + deepmerge: 4.3.1 + kleur: 4.1.5 + magic-string: 0.30.19 + svelte: 5.38.6 + vite: 7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1) + vitefu: 1.1.1(vite@7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1)) + transitivePeerDependencies: + - supports-color + + '@svitejs/changesets-changelog-github.amrom.workers.devpact@1.2.0': + dependencies: + '@changesets/get-github-info': 0.6.0 + dotenv: 16.6.1 + transitivePeerDependencies: + - encoding + + '@swc/helpers@0.5.15': + dependencies: + tslib: 2.8.1 + + '@swc/helpers@0.5.17': + dependencies: + tslib: 2.8.1 + + '@tailwindcss/forms@0.5.10(tailwindcss@4.1.12)': + dependencies: + mini-svg-data-uri: 1.4.4 + tailwindcss: 4.1.12 + + '@tailwindcss/node@4.1.12': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.18.3 + jiti: 2.5.1 + lightningcss: 1.30.1 + magic-string: 0.30.19 + source-map-js: 1.2.1 + tailwindcss: 4.1.12 + + '@tailwindcss/oxide-android-arm64@4.1.12': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.1.12': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.1.12': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.1.12': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.12': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.12': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.1.12': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.1.12': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.1.12': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.1.12': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.12': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.1.12': + optional: true + + '@tailwindcss/oxide@4.1.12': + dependencies: + detect-libc: 2.1.0 + tar: 7.4.3 + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.1.12 + '@tailwindcss/oxide-darwin-arm64': 4.1.12 + '@tailwindcss/oxide-darwin-x64': 4.1.12 + '@tailwindcss/oxide-freebsd-x64': 4.1.12 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.12 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.12 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.12 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.12 + '@tailwindcss/oxide-linux-x64-musl': 4.1.12 + '@tailwindcss/oxide-wasm32-wasi': 4.1.12 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.12 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.12 + + '@tailwindcss/postcss@4.1.12': + dependencies: + '@alloc/quick-lru': 5.2.0 + '@tailwindcss/node': 4.1.12 + '@tailwindcss/oxide': 4.1.12 + postcss: 8.5.6 + tailwindcss: 4.1.12 + + '@tailwindcss/vite@4.1.12(vite@7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1))': + dependencies: + '@tailwindcss/node': 4.1.12 + '@tailwindcss/oxide': 4.1.12 + tailwindcss: 4.1.12 + vite: 7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1) + + '@tailwindcss/vite@4.1.12(vite@7.1.5(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1))': + dependencies: + '@tailwindcss/node': 4.1.12 + '@tailwindcss/oxide': 4.1.12 + tailwindcss: 4.1.12 + vite: 7.1.5(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1) + + '@testing-library/dom@10.4.1': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/runtime': 7.28.4 + '@types/aria-query': 5.0.4 + aria-query: 5.3.0 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + picocolors: 1.1.1 + pretty-format: 27.5.1 + + '@testing-library/jest-dom@6.8.0': + dependencies: + '@adobe/css-tools': 4.4.4 + aria-query: 5.3.2 + css.escape: 1.5.1 + dom-accessibility-api: 0.6.3 + picocolors: 1.1.1 + redent: 3.0.0 + + '@testing-library/react@16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@babel/runtime': 7.28.4 + '@testing-library/dom': 10.4.1 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + optionalDependencies: + '@types/react': 19.1.12 + '@types/react-dom': 19.1.9(@types/react@19.1.12) + + '@testing-library/svelte@5.2.8(svelte@5.38.6)(vite@7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.0)(jiti@2.5.1)(jsdom@26.1.0)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1))': + dependencies: + '@testing-library/dom': 10.4.1 + svelte: 5.38.6 + optionalDependencies: + vite: 7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.5.0)(jiti@2.5.1)(jsdom@26.1.0)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1) + + '@trivago/prettier-plugin-sort-imports@5.2.2(prettier-plugin-svelte@3.4.0(prettier@3.6.2)(svelte@5.38.6))(prettier@3.6.2)(svelte@5.38.6)': + dependencies: + '@babel/generator': 7.28.3 + '@babel/parser': 7.28.4 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + javascript-natural-sort: 0.7.1 + lodash: 4.17.21 + prettier: 3.6.2 + optionalDependencies: + prettier-plugin-svelte: 3.4.0(prettier@3.6.2)(svelte@5.38.6) + svelte: 5.38.6 + transitivePeerDependencies: + - supports-color + + '@trysound/sax@0.2.0': {} + + '@ts-morph/common@0.27.0': + dependencies: + fast-glob: 3.3.3 + minimatch: 10.0.3 + path-browserify: 1.0.1 + + '@tybys/wasm-util@0.10.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/aria-query@5.0.4': {} + + '@types/aws-lambda@8.10.152': {} + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + '@types/babel__generator': 7.27.0 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.28.0 + + '@types/babel__generator@7.27.0': + dependencies: + '@babel/types': 7.28.4 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + + '@types/babel__traverse@7.28.0': + dependencies: + '@babel/types': 7.28.4 + + '@types/chai@5.2.2': + dependencies: + '@types/deep-eql': 4.0.2 + + '@types/chroma-js@3.1.1': {} + + '@types/cookie@0.6.0': {} + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 2.1.0 + + '@types/deep-eql@4.0.2': {} + + '@types/estree-jsx@1.0.5': + dependencies: + '@types/estree': 1.0.8 + + '@types/estree@1.0.8': {} + + '@types/fontkit@2.0.8': + dependencies: + '@types/node': 24.5.0 + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/mdx@2.0.13': {} + + '@types/ms@2.1.0': {} + + '@types/nlcst@2.0.3': + dependencies: + '@types/unist': 3.0.3 + + '@types/node@12.20.55': {} + + '@types/node@18.19.125': + dependencies: + undici-types: 5.26.5 + + '@types/node@24.4.0': + dependencies: + undici-types: 7.11.0 + + '@types/node@24.5.0': + dependencies: + undici-types: 7.12.0 + + '@types/react-dom@19.1.9(@types/react@19.1.12)': + dependencies: + '@types/react': 19.1.12 + + '@types/react@19.1.12': + dependencies: + csstype: 3.1.3 + + '@types/semver@7.7.0': {} + + '@types/tar@6.1.13': + dependencies: + '@types/node': 24.5.0 + minipass: 4.2.8 + + '@types/unist@2.0.11': {} + + '@types/unist@3.0.3': {} + + '@types/yauzl@2.10.3': + dependencies: + '@types/node': 24.5.0 + optional: true + + '@ungap/structured-clone@1.3.0': {} + + '@vercel/nft@0.30.1(rollup@4.50.2)': + dependencies: + '@mapbox/node-pre-gyp': 2.0.0 + '@rollup/pluginutils': 5.3.0(rollup@4.50.2) + acorn: 8.15.0 + acorn-import-attributes: 1.9.5(acorn@8.15.0) + async-sema: 3.1.1 + bindings: 1.5.0 + estree-walker: 2.0.2 + glob: 10.4.5 + graceful-fs: 4.2.11 + node-gyp-build: 4.8.4 + picomatch: 4.0.3 + resolve-from: 5.0.0 + transitivePeerDependencies: + - encoding + - rollup + - supports-color + + '@vitejs/plugin-react@4.7.0(vite@6.3.6(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1))': + dependencies: + '@babel/core': 7.28.4 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.4) + '@rolldown/pluginutils': 1.0.0-beta.27 + '@types/babel__core': 7.20.5 + react-refresh: 0.17.0 + vite: 6.3.6(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1) + transitivePeerDependencies: + - supports-color + + '@vitejs/plugin-react@5.0.2(vite@7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1))': + dependencies: + '@babel/core': 7.28.4 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.4) + '@rolldown/pluginutils': 1.0.0-beta.34 + '@types/babel__core': 7.20.5 + react-refresh: 0.17.0 + vite: 7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1) + transitivePeerDependencies: + - supports-color + + '@vitest/expect@3.2.4': + dependencies: + '@types/chai': 5.2.2 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.3.3 + tinyrainbow: 2.0.0 + + '@vitest/mocker@3.2.4(vite@7.1.3(@types/node@24.4.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1))': + dependencies: + '@vitest/spy': 3.2.4 + estree-walker: 3.0.3 + magic-string: 0.30.18 + optionalDependencies: + vite: 7.1.3(@types/node@24.4.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1) + + '@vitest/mocker@3.2.4(vite@7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1))': + dependencies: + '@vitest/spy': 3.2.4 + estree-walker: 3.0.3 + magic-string: 0.30.18 + optionalDependencies: + vite: 7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1) + + '@vitest/pretty-format@3.2.4': + dependencies: + tinyrainbow: 2.0.0 + + '@vitest/runner@3.2.4': + dependencies: + '@vitest/utils': 3.2.4 + pathe: 2.0.3 + strip-literal: 3.0.0 + + '@vitest/snapshot@3.2.4': + dependencies: + '@vitest/pretty-format': 3.2.4 + magic-string: 0.30.18 + pathe: 2.0.3 + + '@vitest/spy@3.2.4': + dependencies: + tinyspy: 4.0.3 + + '@vitest/utils@3.2.4': + dependencies: + '@vitest/pretty-format': 3.2.4 + loupe: 3.2.1 + tinyrainbow: 2.0.0 + + '@volar/kit@2.4.23(typescript@5.9.2)': + dependencies: + '@volar/language-service': 2.4.23 + '@volar/typescript': 2.4.23 + typesafe-path: 0.2.2 + typescript: 5.9.2 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.1.0 + + '@volar/language-core@2.4.23': + dependencies: + '@volar/source-map': 2.4.23 + + '@volar/language-server@2.4.23': + dependencies: + '@volar/language-core': 2.4.23 + '@volar/language-service': 2.4.23 + '@volar/typescript': 2.4.23 + path-browserify: 1.0.1 + request-light: 0.7.0 + vscode-languageserver: 9.0.1 + vscode-languageserver-protocol: 3.17.5 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.1.0 + + '@volar/language-service@2.4.23': + dependencies: + '@volar/language-core': 2.4.23 + vscode-languageserver-protocol: 3.17.5 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.1.0 + + '@volar/source-map@2.4.23': {} + + '@volar/typescript@2.4.23': + dependencies: + '@volar/language-core': 2.4.23 + path-browserify: 1.0.1 + vscode-uri: 3.1.0 + + '@vscode/emmet-helper@2.11.0': + dependencies: + emmet: 2.4.11 + jsonc-parser: 2.3.1 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.1.0 + + '@vscode/l10n@0.0.18': {} + + '@zag-js/accordion@1.24.2': + dependencies: + '@zag-js/anatomy': 1.24.2 + '@zag-js/core': 1.24.2 + '@zag-js/dom-query': 1.24.2 + '@zag-js/types': 1.24.2 + '@zag-js/utils': 1.24.2 + + '@zag-js/anatomy@1.24.2': {} + + '@zag-js/aria-hidden@1.24.2': {} + + '@zag-js/auto-resize@1.24.2': + dependencies: + '@zag-js/dom-query': 1.24.2 + + '@zag-js/avatar@1.24.2': + dependencies: + '@zag-js/anatomy': 1.24.2 + '@zag-js/core': 1.24.2 + '@zag-js/dom-query': 1.24.2 + '@zag-js/types': 1.24.2 + '@zag-js/utils': 1.24.2 + + '@zag-js/collection@1.24.2': + dependencies: + '@zag-js/utils': 1.24.2 + + '@zag-js/combobox@1.24.2': + dependencies: + '@zag-js/anatomy': 1.24.2 + '@zag-js/aria-hidden': 1.24.2 + '@zag-js/collection': 1.24.2 + '@zag-js/core': 1.24.2 + '@zag-js/dismissable': 1.24.2 + '@zag-js/dom-query': 1.24.2 + '@zag-js/popper': 1.24.2 + '@zag-js/types': 1.24.2 + '@zag-js/utils': 1.24.2 + + '@zag-js/core@1.24.2': + dependencies: + '@zag-js/dom-query': 1.24.2 + '@zag-js/utils': 1.24.2 + + '@zag-js/dialog@1.24.2': + dependencies: + '@zag-js/anatomy': 1.24.2 + '@zag-js/aria-hidden': 1.24.2 + '@zag-js/core': 1.24.2 + '@zag-js/dismissable': 1.24.2 + '@zag-js/dom-query': 1.24.2 + '@zag-js/focus-trap': 1.24.2 + '@zag-js/remove-scroll': 1.24.2 + '@zag-js/types': 1.24.2 + '@zag-js/utils': 1.24.2 + + '@zag-js/dismissable@1.24.2': + dependencies: + '@zag-js/dom-query': 1.24.2 + '@zag-js/interact-outside': 1.24.2 + '@zag-js/utils': 1.24.2 + + '@zag-js/dom-query@1.24.2': + dependencies: + '@zag-js/types': 1.24.2 + + '@zag-js/file-upload@1.24.2': + dependencies: + '@zag-js/anatomy': 1.24.2 + '@zag-js/core': 1.24.2 + '@zag-js/dom-query': 1.24.2 + '@zag-js/file-utils': 1.24.2 + '@zag-js/i18n-utils': 1.24.2 + '@zag-js/types': 1.24.2 + '@zag-js/utils': 1.24.2 + + '@zag-js/file-utils@1.24.2': + dependencies: + '@zag-js/i18n-utils': 1.24.2 + + '@zag-js/focus-trap@1.24.2': + dependencies: + '@zag-js/dom-query': 1.24.2 + + '@zag-js/focus-visible@1.24.2': + dependencies: + '@zag-js/dom-query': 1.24.2 + + '@zag-js/i18n-utils@1.24.2': + dependencies: + '@zag-js/dom-query': 1.24.2 + + '@zag-js/interact-outside@1.24.2': + dependencies: + '@zag-js/dom-query': 1.24.2 + '@zag-js/utils': 1.24.2 + + '@zag-js/live-region@1.24.2': {} + + '@zag-js/popover@1.24.2': + dependencies: + '@zag-js/anatomy': 1.24.2 + '@zag-js/aria-hidden': 1.24.2 + '@zag-js/core': 1.24.2 + '@zag-js/dismissable': 1.24.2 + '@zag-js/dom-query': 1.24.2 + '@zag-js/focus-trap': 1.24.2 + '@zag-js/popper': 1.24.2 + '@zag-js/remove-scroll': 1.24.2 + '@zag-js/types': 1.24.2 + '@zag-js/utils': 1.24.2 + + '@zag-js/popper@1.24.2': + dependencies: + '@floating-ui/dom': 1.7.4 + '@zag-js/dom-query': 1.24.2 + '@zag-js/utils': 1.24.2 + + '@zag-js/progress@1.24.2': + dependencies: + '@zag-js/anatomy': 1.24.2 + '@zag-js/core': 1.24.2 + '@zag-js/dom-query': 1.24.2 + '@zag-js/types': 1.24.2 + '@zag-js/utils': 1.24.2 + + '@zag-js/radio-group@1.24.2': + dependencies: + '@zag-js/anatomy': 1.24.2 + '@zag-js/core': 1.24.2 + '@zag-js/dom-query': 1.24.2 + '@zag-js/focus-visible': 1.24.2 + '@zag-js/types': 1.24.2 + '@zag-js/utils': 1.24.2 + + '@zag-js/rating-group@1.24.2': + dependencies: + '@zag-js/anatomy': 1.24.2 + '@zag-js/core': 1.24.2 + '@zag-js/dom-query': 1.24.2 + '@zag-js/types': 1.24.2 + '@zag-js/utils': 1.24.2 + + '@zag-js/react@1.24.2(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@zag-js/core': 1.24.2 + '@zag-js/store': 1.24.2 + '@zag-js/types': 1.24.2 + '@zag-js/utils': 1.24.2 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + '@zag-js/remove-scroll@1.24.2': + dependencies: + '@zag-js/dom-query': 1.24.2 + + '@zag-js/slider@1.24.2': + dependencies: + '@zag-js/anatomy': 1.24.2 + '@zag-js/core': 1.24.2 + '@zag-js/dom-query': 1.24.2 + '@zag-js/types': 1.24.2 + '@zag-js/utils': 1.24.2 + + '@zag-js/store@1.24.2': + dependencies: + proxy-compare: 3.0.1 + + '@zag-js/svelte@1.24.2(svelte@5.38.6)': + dependencies: + '@zag-js/core': 1.24.2 + '@zag-js/types': 1.24.2 + '@zag-js/utils': 1.24.2 + svelte: 5.38.6 + + '@zag-js/switch@1.24.2': + dependencies: + '@zag-js/anatomy': 1.24.2 + '@zag-js/core': 1.24.2 + '@zag-js/dom-query': 1.24.2 + '@zag-js/focus-visible': 1.24.2 + '@zag-js/types': 1.24.2 + '@zag-js/utils': 1.24.2 + + '@zag-js/tabs@1.24.2': + dependencies: + '@zag-js/anatomy': 1.24.2 + '@zag-js/core': 1.24.2 + '@zag-js/dom-query': 1.24.2 + '@zag-js/types': 1.24.2 + '@zag-js/utils': 1.24.2 + + '@zag-js/tags-input@1.24.2': + dependencies: + '@zag-js/anatomy': 1.24.2 + '@zag-js/auto-resize': 1.24.2 + '@zag-js/core': 1.24.2 + '@zag-js/dom-query': 1.24.2 + '@zag-js/interact-outside': 1.24.2 + '@zag-js/live-region': 1.24.2 + '@zag-js/types': 1.24.2 + '@zag-js/utils': 1.24.2 + + '@zag-js/toast@1.24.2': + dependencies: + '@zag-js/anatomy': 1.24.2 + '@zag-js/core': 1.24.2 + '@zag-js/dismissable': 1.24.2 + '@zag-js/dom-query': 1.24.2 + '@zag-js/types': 1.24.2 + '@zag-js/utils': 1.24.2 + + '@zag-js/tooltip@1.24.2': + dependencies: + '@zag-js/anatomy': 1.24.2 + '@zag-js/core': 1.24.2 + '@zag-js/dom-query': 1.24.2 + '@zag-js/focus-visible': 1.24.2 + '@zag-js/popper': 1.24.2 + '@zag-js/types': 1.24.2 + '@zag-js/utils': 1.24.2 + + '@zag-js/types@1.24.2': + dependencies: + csstype: 3.1.3 + + '@zag-js/utils@1.24.2': {} + + abbrev@3.0.1: {} + + acorn-import-attributes@1.9.5(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn-jsx@5.3.2(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn@8.15.0: {} + + agent-base@7.1.4: {} + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-align@3.0.1: + dependencies: + string-width: 4.2.3 + + ansi-colors@4.1.3: {} + + ansi-regex@5.0.1: {} + + ansi-regex@6.2.2: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@5.2.0: {} + + ansi-styles@6.2.3: {} + + ansis@4.1.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + aria-query@5.3.0: + dependencies: + dequal: 2.0.3 + + aria-query@5.3.2: {} + + array-iterate@2.0.1: {} + + array-union@2.1.0: {} + + assertion-error@2.0.1: {} + + ast-kit@2.1.2: + dependencies: + '@babel/parser': 7.28.4 + pathe: 2.0.3 + + astring@1.9.0: {} + + astro-auto-import@0.4.4(astro@5.13.5(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(rollup@4.50.2)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(typescript@5.9.2)(yaml@2.8.1)): + dependencies: + '@types/node': 18.19.125 + acorn: 8.15.0 + astro: 5.13.5(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(rollup@4.50.2)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(typescript@5.9.2)(yaml@2.8.1) + + astro-expressive-code@0.41.3(astro@5.13.5(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(rollup@4.50.2)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(typescript@5.9.2)(yaml@2.8.1)): + dependencies: + astro: 5.13.5(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(rollup@4.50.2)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(typescript@5.9.2)(yaml@2.8.1) + rehype-expressive-code: 0.41.3 + + astro-icon@1.1.5: + dependencies: + '@iconify/tools': 4.1.3 + '@iconify/types': 2.0.0 + '@iconify/utils': 2.3.0 + transitivePeerDependencies: + - debug + - supports-color + + astro@5.13.5(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(rollup@4.50.2)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(typescript@5.9.2)(yaml@2.8.1): + dependencies: + '@astrojs/compiler': 2.13.0 + '@astrojs/internal-helpers': 0.7.2 + '@astrojs/markdown-remark': 6.3.6 + '@astrojs/telemetry': 3.3.0 + '@capsizecss/unpack': 2.4.0 + '@oslojs/encoding': 1.1.0 + '@rollup/pluginutils': 5.3.0(rollup@4.50.2) + acorn: 8.15.0 + aria-query: 5.3.2 + axobject-query: 4.1.0 + boxen: 8.0.1 + ci-info: 4.3.0 + clsx: 2.1.1 + common-ancestor-path: 1.0.1 + cookie: 1.0.2 + cssesc: 3.0.0 + debug: 4.4.3 + deterministic-object-hash: 2.0.2 + devalue: 5.3.2 + diff: 5.2.0 + dlv: 1.1.3 + dset: 3.1.4 + es-module-lexer: 1.7.0 + esbuild: 0.25.9 + estree-walker: 3.0.3 + flattie: 1.1.1 + fontace: 0.3.0 + github-slugger: 2.0.0 + html-escaper: 3.0.3 + http-cache-semantics: 4.2.0 + import-meta-resolve: 4.2.0 + js-yaml: 4.1.0 + kleur: 4.1.5 + magic-string: 0.30.19 + magicast: 0.3.5 + mrmime: 2.0.1 + neotraverse: 0.6.18 + p-limit: 6.2.0 + p-queue: 8.1.1 + package-manager-detector: 1.3.0 + picomatch: 4.0.3 + prompts: 2.4.2 + rehype: 13.0.2 + semver: 7.7.2 + shiki: 3.12.2 + smol-toml: 1.4.2 + tinyexec: 0.3.2 + tinyglobby: 0.2.14 + tsconfck: 3.1.6(typescript@5.9.2) + ultrahtml: 1.6.0 + unifont: 0.5.2 + unist-util-visit: 5.0.0 + unstorage: 1.17.1 + vfile: 6.0.3 + vite: 6.3.6(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1) + vitefu: 1.1.1(vite@6.3.6(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1)) + xxhash-wasm: 1.1.0 + yargs-parser: 21.1.1 + yocto-spinner: 0.2.3 + zod: 3.25.76 + zod-to-json-schema: 3.24.6(zod@3.25.76) + zod-to-ts: 1.2.0(typescript@5.9.2)(zod@3.25.76) + optionalDependencies: + sharp: 0.33.5 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@types/node' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - db0 + - encoding + - idb-keyval + - ioredis + - jiti + - less + - lightningcss + - rollup + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - typescript + - uploadthing + - yaml + + async-sema@3.1.1: {} + + asynckit@0.4.0: {} + + autoprefixer@10.4.21(postcss@8.5.6): + dependencies: + browserslist: 4.26.2 + caniuse-lite: 1.0.30001743 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.1.1 + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + await-lock@2.2.2: {} + + axios@1.12.2: + dependencies: + follow-redirects: 1.15.11 + form-data: 4.0.4 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + axobject-query@4.1.0: {} + + bail@2.0.2: {} + + balanced-match@1.0.2: {} + + base-64@1.0.0: {} + + base64-js@1.5.1: {} + + baseline-browser-mapping@2.8.4: {} + + bcp-47-match@2.0.3: {} + + before-after-hook@4.0.0: {} + + better-path-resolve@1.0.0: + dependencies: + is-windows: 1.0.2 + + bindings@1.5.0: + dependencies: + file-uri-to-path: 1.0.0 + + birpc@2.5.0: {} + + blob-to-buffer@1.2.9: {} + + boolbase@1.0.0: {} + + bottleneck@2.19.5: {} + + boxen@8.0.1: + dependencies: + ansi-align: 3.0.1 + camelcase: 8.0.0 + chalk: 5.6.2 + cli-boxes: 3.0.0 + string-width: 7.2.0 + type-fest: 4.41.0 + widest-line: 5.0.0 + wrap-ansi: 9.0.2 + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + brotli@1.3.3: + dependencies: + base64-js: 1.5.1 + + browserslist@4.26.2: + dependencies: + baseline-browser-mapping: 2.8.4 + caniuse-lite: 1.0.30001743 + electron-to-chromium: 1.5.218 + node-releases: 2.0.21 + update-browserslist-db: 1.1.3(browserslist@4.26.2) + + buffer-builder@0.2.0: {} + + buffer-crc32@0.2.13: {} + + cac@6.7.14: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + camelcase@8.0.0: {} + + caniuse-lite@1.0.30001743: {} + + ccount@2.0.1: {} + + chai@5.3.3: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.2.1 + pathval: 2.0.1 + + chalk@5.6.2: {} + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + character-reference-invalid@2.0.1: {} + + chardet@2.1.0: {} + + check-error@2.1.1: {} + + cheerio-select@2.1.0: + dependencies: + boolbase: 1.0.0 + css-select: 5.2.2 + css-what: 6.2.2 + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + + cheerio@1.0.0: + dependencies: + cheerio-select: 2.1.0 + dom-serializer: 2.0.0 + domhandler: 5.0.3 + domutils: 3.2.2 + encoding-sniffer: 0.2.1 + htmlparser2: 9.1.0 + parse5: 7.3.0 + parse5-htmlparser2-tree-adapter: 7.1.0 + parse5-parser-stream: 7.1.2 + undici: 6.21.3 + whatwg-mimetype: 4.0.0 + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + chownr@2.0.0: {} + + chownr@3.0.0: {} + + chroma-js@3.1.2: {} + + ci-info@3.9.0: {} + + ci-info@4.3.0: {} + + cli-boxes@3.0.0: {} + + client-only@0.0.1: {} + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone@2.1.2: {} + + clsx@2.1.1: {} + + code-block-writer@13.0.3: {} + + collapse-white-space@2.1.0: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + color-string@1.9.1: + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.4 + + color@4.2.3: + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + + colorette@2.0.20: {} + + colorjs.io@0.5.2: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + comma-separated-tokens@2.0.3: {} + + commander@14.0.0: {} + + commander@7.2.0: {} + + common-ancestor-path@1.0.1: {} + + confbox@0.1.8: {} + + confbox@0.2.2: {} + + config-chain@1.1.13: + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + + consola@3.4.2: {} + + convert-source-map@2.0.0: {} + + cookie-es@1.2.2: {} + + cookie@0.6.0: {} + + cookie@1.0.2: {} + + cross-fetch@3.2.0: + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + crossws@0.3.5: + dependencies: + uncrypto: 0.1.3 + + css-select@5.2.2: + dependencies: + boolbase: 1.0.0 + css-what: 6.2.2 + domhandler: 5.0.3 + domutils: 3.2.2 + nth-check: 2.1.1 + + css-selector-parser@3.1.3: {} + + css-tree@2.2.1: + dependencies: + mdn-data: 2.0.28 + source-map-js: 1.2.1 + + css-tree@2.3.1: + dependencies: + mdn-data: 2.0.30 + source-map-js: 1.2.1 + + css-tree@3.1.0: + dependencies: + mdn-data: 2.12.2 + source-map-js: 1.2.1 + + css-what@6.2.2: {} + + css.escape@1.5.1: {} + + cssesc@3.0.0: {} + + csso@5.0.5: + dependencies: + css-tree: 2.2.1 + + cssstyle@4.6.0: + dependencies: + '@asamuzakjp/css-color': 3.2.0 + rrweb-cssom: 0.8.0 + + csstype@3.1.3: {} + + data-urls@5.0.0: + dependencies: + whatwg-mimetype: 4.0.0 + whatwg-url: 14.2.0 + + dataloader@1.4.0: {} + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + decimal.js@10.6.0: {} + + decode-named-character-reference@1.2.0: + dependencies: + character-entities: 2.0.2 + + dedent-js@1.0.1: {} + + deep-eql@5.0.2: {} + + deep-extend@0.6.0: {} + + deepmerge@4.3.1: {} + + defu@6.1.4: {} + + delayed-stream@1.0.0: {} + + dequal@2.0.3: {} + + destr@2.0.5: {} + + detect-indent@6.1.0: {} + + detect-indent@7.0.1: {} + + detect-libc@1.0.3: + optional: true + + detect-libc@2.1.0: {} + + deterministic-object-hash@2.0.2: + dependencies: + base-64: 1.0.0 + + devalue@5.3.2: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + dfa@1.2.0: {} + + diff@5.2.0: {} + + diff@8.0.2: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + direction@2.0.1: {} + + dlv@1.1.3: {} + + dom-accessibility-api@0.5.16: {} + + dom-accessibility-api@0.6.3: {} + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@3.2.2: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + dotenv@16.6.1: {} + + dset@3.1.4: {} + + dts-resolver@2.1.2: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + eastasianwidth@0.2.0: {} + + electron-to-chromium@1.5.218: {} + + emmet@2.4.11: + dependencies: + '@emmetio/abbreviation': 2.3.3 + '@emmetio/css-abbreviation': 2.1.8 + + emoji-regex@10.5.0: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + empathic@2.0.0: {} + + encoding-sniffer@0.2.1: + dependencies: + iconv-lite: 0.6.3 + whatwg-encoding: 3.1.1 + + end-of-stream@1.4.5: + dependencies: + once: 1.4.0 + + enhanced-resolve@5.18.3: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.3 + + enquirer@2.4.1: + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + + entities@4.5.0: {} + + entities@6.0.1: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-module-lexer@1.7.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + esast-util-from-estree@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + unist-util-position-from-estree: 2.0.0 + + esast-util-from-js@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + acorn: 8.15.0 + esast-util-from-estree: 2.0.0 + vfile-message: 4.0.3 + + esbuild@0.25.9: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.9 + '@esbuild/android-arm': 0.25.9 + '@esbuild/android-arm64': 0.25.9 + '@esbuild/android-x64': 0.25.9 + '@esbuild/darwin-arm64': 0.25.9 + '@esbuild/darwin-x64': 0.25.9 + '@esbuild/freebsd-arm64': 0.25.9 + '@esbuild/freebsd-x64': 0.25.9 + '@esbuild/linux-arm': 0.25.9 + '@esbuild/linux-arm64': 0.25.9 + '@esbuild/linux-ia32': 0.25.9 + '@esbuild/linux-loong64': 0.25.9 + '@esbuild/linux-mips64el': 0.25.9 + '@esbuild/linux-ppc64': 0.25.9 + '@esbuild/linux-riscv64': 0.25.9 + '@esbuild/linux-s390x': 0.25.9 + '@esbuild/linux-x64': 0.25.9 + '@esbuild/netbsd-arm64': 0.25.9 + '@esbuild/netbsd-x64': 0.25.9 + '@esbuild/openbsd-arm64': 0.25.9 + '@esbuild/openbsd-x64': 0.25.9 + '@esbuild/openharmony-arm64': 0.25.9 + '@esbuild/sunos-x64': 0.25.9 + '@esbuild/win32-arm64': 0.25.9 + '@esbuild/win32-ia32': 0.25.9 + '@esbuild/win32-x64': 0.25.9 + + escalade@3.2.0: {} + + escape-string-regexp@5.0.0: {} + + esm-env@1.2.2: {} + + esprima@4.0.1: {} + + esrap@2.1.0: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + estree-util-attach-comments@3.0.0: + dependencies: + '@types/estree': 1.0.8 + + estree-util-build-jsx@3.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-walker: 3.0.3 + + estree-util-is-identifier-name@3.0.0: {} + + estree-util-scope@1.0.0: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + + estree-util-to-js@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + astring: 1.9.0 + source-map: 0.7.6 + + estree-util-visit@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/unist': 3.0.3 + + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.8 + + eventemitter3@5.0.1: {} + + expect-type@1.2.2: {} + + expressive-code@0.41.3: + dependencies: + '@expressive-code/core': 0.41.3 + '@expressive-code/plugin-frames': 0.41.3 + '@expressive-code/plugin-shiki': 0.41.3 + '@expressive-code/plugin-text-markers': 0.41.3 + + exsolve@1.0.7: {} + + extend@3.0.2: {} + + extendable-error@0.1.7: {} + + extract-zip@2.0.1: + dependencies: + debug: 4.4.3 + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.3 + transitivePeerDependencies: + - supports-color + + fast-content-type-parse@3.0.0: {} + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.3: + 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.8 + + fast-uri@3.1.0: {} + + fastq@1.19.1: + dependencies: + reusify: 1.1.0 + + fd-slicer@1.1.0: + dependencies: + pend: 1.2.0 + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + file-uri-to-path@1.0.0: {} + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + flattie@1.1.1: {} + + follow-redirects@1.15.11: {} + + fontace@0.3.0: + dependencies: + '@types/fontkit': 2.0.8 + fontkit: 2.0.4 + + fontkit@2.0.4: + dependencies: + '@swc/helpers': 0.5.17 + brotli: 1.3.3 + clone: 2.1.2 + dfa: 1.2.0 + fast-deep-equal: 3.1.3 + restructure: 3.0.2 + tiny-inflate: 1.0.3 + unicode-properties: 1.4.1 + unicode-trie: 2.0.0 + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + form-data@4.0.4: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + + fraction.js@4.3.7: {} + + fs-extra@7.0.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-minipass@2.1.0: + dependencies: + minipass: 3.3.6 + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + fuse.js@7.1.0: {} + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-east-asian-width@1.4.0: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-stream@5.2.0: + dependencies: + pump: 3.0.3 + + get-tsconfig@4.10.1: + dependencies: + resolve-pkg-maps: 1.0.0 + + github-slugger@2.0.0: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob@10.4.5: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + globals@15.15.0: {} + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + goober@2.1.16(csstype@3.1.3): + dependencies: + csstype: 3.1.3 + + gopd@1.2.0: {} + + graceful-fs@4.2.10: {} + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + h3@1.15.4: + dependencies: + cookie-es: 1.2.2 + crossws: 0.3.5 + defu: 6.1.4 + destr: 2.0.5 + iron-webcrypto: 1.2.1 + node-mock-http: 1.0.3 + radix3: 1.1.2 + ufo: 1.6.1 + uncrypto: 0.1.3 + + has-flag@4.0.0: {} + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hast-util-from-html@2.0.3: + dependencies: + '@types/hast': 3.0.4 + devlop: 1.1.0 + hast-util-from-parse5: 8.0.3 + parse5: 7.3.0 + vfile: 6.0.3 + vfile-message: 4.0.3 + + hast-util-from-parse5@8.0.3: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + devlop: 1.1.0 + hastscript: 9.0.1 + property-information: 7.1.0 + vfile: 6.0.3 + vfile-location: 5.0.3 + web-namespaces: 2.0.1 + + hast-util-has-property@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-is-element@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-parse-selector@4.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-raw@9.1.0: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + '@ungap/structured-clone': 1.3.0 + hast-util-from-parse5: 8.0.3 + hast-util-to-parse5: 8.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + parse5: 7.3.0 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-select@6.0.4: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + bcp-47-match: 2.0.3 + comma-separated-tokens: 2.0.3 + css-selector-parser: 3.1.3 + devlop: 1.1.0 + direction: 2.0.1 + hast-util-has-property: 3.0.0 + hast-util-to-string: 3.0.1 + hast-util-whitespace: 3.0.0 + nth-check: 2.1.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + hast-util-to-estree@3.1.3: + dependencies: + '@types/estree': 1.0.8 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-attach-comments: 3.0.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.17 + unist-util-position: 5.0.0 + zwitch: 2.0.4 + transitivePeerDependencies: + - supports-color + + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-to-jsx-runtime@2.3.6: + dependencies: + '@types/estree': 1.0.8 + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.17 + unist-util-position: 5.0.0 + vfile-message: 4.0.3 + transitivePeerDependencies: + - supports-color + + hast-util-to-parse5@8.0.0: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-to-string@3.0.1: + dependencies: + '@types/hast': 3.0.4 + + hast-util-to-text@4.0.2: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + hast-util-is-element: 3.0.0 + unist-util-find-after: 5.0.0 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hastscript@9.0.1: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + + he@1.2.0: {} + + hookable@5.5.3: {} + + html-encoding-sniffer@4.0.0: + dependencies: + whatwg-encoding: 3.1.1 + + html-escaper@3.0.3: {} + + html-void-elements@3.0.0: {} + + htmlparser2@9.1.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + entities: 4.5.0 + + http-cache-semantics@4.2.0: {} + + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + human-id@4.1.1: {} + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + iconv-lite@0.7.0: + dependencies: + safer-buffer: 2.1.2 + + ignore@5.3.2: {} + + immutable@5.1.3: {} + + import-meta-resolve@4.2.0: {} + + indent-string@4.0.0: {} + + ini@1.3.8: {} + + inline-style-parser@0.2.4: {} + + iron-webcrypto@1.2.1: {} + + is-alphabetical@2.0.1: {} + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + + is-arrayish@0.3.4: {} + + is-decimal@2.0.1: {} + + is-docker@3.0.0: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-hexadecimal@2.0.1: {} + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-number@7.0.0: {} + + is-plain-obj@4.1.0: {} + + is-potential-custom-element-name@1.0.1: {} + + is-reference@3.0.3: + dependencies: + '@types/estree': 1.0.8 + + is-subdir@1.2.0: + dependencies: + better-path-resolve: 1.0.0 + + is-windows@1.0.2: {} + + is-wsl@3.1.0: + dependencies: + is-inside-container: 1.0.0 + + isexe@2.0.0: {} + + iso-datestring-validator@2.2.2: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + javascript-natural-sort@0.7.1: {} + + jiti@2.5.1: {} + + js-tokens@4.0.0: {} + + js-tokens@9.0.1: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsdom@26.1.0: + dependencies: + cssstyle: 4.6.0 + data-urls: 5.0.0 + decimal.js: 10.6.0 + html-encoding-sniffer: 4.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.22 + parse5: 7.3.0 + rrweb-cssom: 0.8.0 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 5.1.2 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 3.1.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 14.2.0 + ws: 8.18.3 + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + jsesc@3.1.0: {} + + json-schema-traverse@1.0.0: {} + + json5@2.2.3: {} + + jsonc-parser@2.3.1: {} + + jsonc-parser@3.3.1: {} + + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + + kleur@3.0.3: {} + + kleur@4.1.5: {} + + kolorist@1.8.0: {} + + ky@1.10.0: {} + + latest-version@9.0.0: + dependencies: + package-json: 10.0.1 + + lightningcss-darwin-arm64@1.30.1: + optional: true + + lightningcss-darwin-x64@1.30.1: + optional: true + + lightningcss-freebsd-x64@1.30.1: + optional: true + + lightningcss-linux-arm-gnueabihf@1.30.1: + optional: true + + lightningcss-linux-arm64-gnu@1.30.1: + optional: true + + lightningcss-linux-arm64-musl@1.30.1: + optional: true + + lightningcss-linux-x64-gnu@1.30.1: + optional: true + + lightningcss-linux-x64-musl@1.30.1: + optional: true + + lightningcss-win32-arm64-msvc@1.30.1: + optional: true + + lightningcss-win32-x64-msvc@1.30.1: + optional: true + + lightningcss@1.30.1: + dependencies: + detect-libc: 2.1.0 + optionalDependencies: + lightningcss-darwin-arm64: 1.30.1 + lightningcss-darwin-x64: 1.30.1 + lightningcss-freebsd-x64: 1.30.1 + lightningcss-linux-arm-gnueabihf: 1.30.1 + lightningcss-linux-arm64-gnu: 1.30.1 + lightningcss-linux-arm64-musl: 1.30.1 + lightningcss-linux-x64-gnu: 1.30.1 + lightningcss-linux-x64-musl: 1.30.1 + lightningcss-win32-arm64-msvc: 1.30.1 + lightningcss-win32-x64-msvc: 1.30.1 + + local-pkg@0.5.1: + dependencies: + mlly: 1.8.0 + pkg-types: 1.3.1 + + local-pkg@1.1.2: + dependencies: + mlly: 1.8.0 + pkg-types: 2.3.0 + quansync: 0.2.11 + + locate-character@3.0.0: {} + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + lodash.startcase@4.4.0: {} + + lodash@4.17.21: {} + + longest-streak@3.1.0: {} + + loupe@3.2.1: {} + + lower-case@2.0.2: + dependencies: + tslib: 2.8.1 + + lru-cache@10.4.3: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lucide-react@0.542.0(react@19.1.1): + dependencies: + react: 19.1.1 + + lz-string@1.5.0: {} + + magic-string-ast@1.0.2: + dependencies: + magic-string: 0.30.19 + + magic-string@0.30.18: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + magic-string@0.30.19: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + magicast@0.3.5: + dependencies: + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + source-map-js: 1.2.1 + + markdown-extensions@2.0.0: {} + + markdown-table@3.0.4: {} + + math-intrinsics@1.1.0: {} + + mdast-util-definitions@6.0.0: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + unist-util-visit: 5.0.0 + + mdast-util-find-and-replace@3.0.2: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + mdast-util-from-markdown@2.0.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.2 + micromark-util-character: 2.1.1 + + mdast-util-gfm-footnote@2.1.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + micromark-util-normalize-identifier: 2.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.1.0: + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.1.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-expression@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-jsx@3.2.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.3 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx@3.0.0: + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdxjs-esm@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.0 + + mdast-util-to-hast@13.2.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + + mdn-data@2.0.28: {} + + mdn-data@2.0.30: {} + + mdn-data@2.12.2: {} + + merge2@1.4.1: {} + + micromark-core-commonmark@2.0.3: + dependencies: + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-table@2.1.1: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.1 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-mdx-expression@3.0.1: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + micromark-factory-mdx-expression: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-mdx-jsx@3.0.2: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + micromark-factory-mdx-expression: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + vfile-message: 4.0.3 + + micromark-extension-mdx-md@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-mdxjs-esm@3.0.0: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.3 + + micromark-extension-mdxjs@3.0.0: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + micromark-extension-mdx-expression: 3.0.1 + micromark-extension-mdx-jsx: 3.0.2 + micromark-extension-mdx-md: 2.0.0 + micromark-extension-mdxjs-esm: 3.0.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-mdx-expression@2.0.3: + dependencies: + '@types/estree': 1.0.8 + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.3 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.2.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-events-to-acorn@2.0.3: + dependencies: + '@types/estree': 1.0.8 + '@types/unist': 3.0.3 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + vfile-message: 4.0.3 + + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.2 + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-subtokenize@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + + micromark@4.0.2: + dependencies: + '@types/debug': 4.1.12 + debug: 4.4.3 + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + transitivePeerDependencies: + - supports-color + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + min-indent@1.0.1: {} + + mini-svg-data-uri@1.4.4: {} + + minimatch@10.0.3: + dependencies: + '@isaacs/brace-expansion': 5.0.0 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + + minimist@1.2.8: {} + + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + + minipass@4.2.8: {} + + minipass@5.0.0: {} + + minipass@7.1.2: {} + + minizlib@2.1.2: + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + + minizlib@3.0.2: + dependencies: + minipass: 7.1.2 + + mkdirp@1.0.4: {} + + mkdirp@3.0.1: {} + + mlly@1.8.0: + dependencies: + acorn: 8.15.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.1 + + mri@1.2.0: {} + + mrmime@2.0.1: {} + + ms@2.1.3: {} + + muggle-string@0.4.1: {} + + multiformats@9.9.0: {} + + nanoid@3.3.11: {} + + nanoid@5.1.5: {} + + nanostores@1.0.1: {} + + neotraverse@0.6.18: {} + + next@15.5.2(@babel/core@7.28.4)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.91.0): + dependencies: + '@next/env': 15.5.2 + '@swc/helpers': 0.5.15 + caniuse-lite: 1.0.30001743 + postcss: 8.4.31 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + styled-jsx: 5.1.6(@babel/core@7.28.4)(react@19.1.1) + optionalDependencies: + '@next/swc-darwin-arm64': 15.5.2 + '@next/swc-darwin-x64': 15.5.2 + '@next/swc-linux-arm64-gnu': 15.5.2 + '@next/swc-linux-arm64-musl': 15.5.2 + '@next/swc-linux-x64-gnu': 15.5.2 + '@next/swc-linux-x64-musl': 15.5.2 + '@next/swc-win32-arm64-msvc': 15.5.2 + '@next/swc-win32-x64-msvc': 15.5.2 + sass: 1.91.0 + sharp: 0.34.3 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + + nlcst-to-string@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 + + no-case@3.0.4: + dependencies: + lower-case: 2.0.2 + tslib: 2.8.1 + + node-addon-api@7.1.1: + optional: true + + node-fetch-native@1.6.7: {} + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-gyp-build@4.8.4: {} + + node-html-parser@7.0.1: + dependencies: + css-select: 5.2.2 + he: 1.2.0 + + node-mock-http@1.0.3: {} + + node-releases@2.0.21: {} + + nopt@8.1.0: + dependencies: + abbrev: 3.0.1 + + normalize-path@3.0.0: {} + + normalize-range@0.1.2: {} + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + nwsapi@2.2.22: {} + + octokit@5.0.3: + dependencies: + '@octokit/app': 16.1.0 + '@octokit/core': 7.0.4 + '@octokit/oauth-app': 8.0.1 + '@octokit/plugin-paginate-graphql': 6.0.0(@octokit/core@7.0.4) + '@octokit/plugin-paginate-rest': 13.1.1(@octokit/core@7.0.4) + '@octokit/plugin-rest-endpoint-methods': 16.1.0(@octokit/core@7.0.4) + '@octokit/plugin-retry': 8.0.1(@octokit/core@7.0.4) + '@octokit/plugin-throttling': 11.0.1(@octokit/core@7.0.4) + '@octokit/request-error': 7.0.0 + '@octokit/types': 14.1.0 + '@octokit/webhooks': 14.1.3 + + ofetch@1.4.1: + dependencies: + destr: 2.0.5 + node-fetch-native: 1.6.7 + ufo: 1.6.1 + + ohash@2.0.11: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + oniguruma-parser@0.12.1: {} + + oniguruma-to-es@4.3.3: + dependencies: + oniguruma-parser: 0.12.1 + regex: 6.0.1 + regex-recursion: 6.0.2 + + outdent@0.5.0: {} + + oxlint-tsgolint@0.2.0: + optionalDependencies: + '@oxlint-tsgolint/darwin-arm64': 0.2.0 + '@oxlint-tsgolint/darwin-x64': 0.2.0 + '@oxlint-tsgolint/linux-arm64': 0.2.0 + '@oxlint-tsgolint/linux-x64': 0.2.0 + '@oxlint-tsgolint/win32-arm64': 0.2.0 + '@oxlint-tsgolint/win32-x64': 0.2.0 + + oxlint@1.15.0(oxlint-tsgolint@0.2.0): + optionalDependencies: + '@oxlint/darwin-arm64': 1.15.0 + '@oxlint/darwin-x64': 1.15.0 + '@oxlint/linux-arm64-gnu': 1.15.0 + '@oxlint/linux-arm64-musl': 1.15.0 + '@oxlint/linux-x64-gnu': 1.15.0 + '@oxlint/linux-x64-musl': 1.15.0 + '@oxlint/win32-arm64': 1.15.0 + '@oxlint/win32-x64': 1.15.0 + oxlint-tsgolint: 0.2.0 + + p-filter@2.1.0: + dependencies: + p-map: 2.1.0 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@6.2.0: + dependencies: + yocto-queue: 1.2.1 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-map@2.1.0: {} + + p-queue@8.1.1: + dependencies: + eventemitter3: 5.0.1 + p-timeout: 6.1.4 + + p-timeout@6.1.4: {} + + p-try@2.2.0: {} + + package-json-from-dist@1.0.1: {} + + package-json@10.0.1: + dependencies: + ky: 1.10.0 + registry-auth-token: 5.1.0 + registry-url: 6.0.1 + semver: 7.7.2 + + package-manager-detector@0.2.11: + dependencies: + quansync: 0.2.11 + + package-manager-detector@1.3.0: {} + + pagefind@1.3.0: + optionalDependencies: + '@pagefind/darwin-arm64': 1.3.0 + '@pagefind/darwin-x64': 1.3.0 + '@pagefind/linux-arm64': 1.3.0 + '@pagefind/linux-x64': 1.3.0 + '@pagefind/windows-x64': 1.3.0 + + pako@0.2.9: {} + + parse-entities@4.0.2: + dependencies: + '@types/unist': 2.0.11 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.2.0 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + + parse-latin@7.0.0: + dependencies: + '@types/nlcst': 2.0.3 + '@types/unist': 3.0.3 + nlcst-to-string: 4.0.0 + unist-util-modify-children: 4.0.0 + unist-util-visit-children: 3.0.0 + vfile: 6.0.3 + + parse5-htmlparser2-tree-adapter@7.1.0: + dependencies: + domhandler: 5.0.3 + parse5: 7.3.0 + + parse5-parser-stream@7.1.2: + dependencies: + parse5: 7.3.0 + + parse5@7.3.0: + dependencies: + entities: 6.0.1 + + pascal-case@3.1.2: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + + path-browserify@1.0.1: {} + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-type@4.0.0: {} + + pathe@1.1.2: {} + + pathe@2.0.3: {} + + pathval@2.0.1: {} + + pend@1.2.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.3: {} + + pify@4.0.1: {} + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.8.0 + pathe: 2.0.3 + + pkg-types@2.3.0: + dependencies: + confbox: 0.2.2 + exsolve: 1.0.7 + pathe: 2.0.3 + + postcss-nested@6.2.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 6.1.2 + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-value-parser@4.2.0: {} + + postcss@8.4.31: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prettier-plugin-astro@0.14.1: + dependencies: + '@astrojs/compiler': 2.13.0 + prettier: 3.6.2 + sass-formatter: 0.7.9 + + prettier-plugin-svelte@3.4.0(prettier@3.6.2)(svelte@5.38.6): + dependencies: + prettier: 3.6.2 + svelte: 5.38.6 + + prettier-plugin-tailwindcss@0.6.14(@trivago/prettier-plugin-sort-imports@5.2.2(prettier-plugin-svelte@3.4.0(prettier@3.6.2)(svelte@5.38.6))(prettier@3.6.2)(svelte@5.38.6))(prettier-plugin-astro@0.14.1)(prettier-plugin-svelte@3.4.0(prettier@3.6.2)(svelte@5.38.6))(prettier@3.6.2): + dependencies: + prettier: 3.6.2 + optionalDependencies: + '@trivago/prettier-plugin-sort-imports': 5.2.2(prettier-plugin-svelte@3.4.0(prettier@3.6.2)(svelte@5.38.6))(prettier@3.6.2)(svelte@5.38.6) + prettier-plugin-astro: 0.14.1 + prettier-plugin-svelte: 3.4.0(prettier@3.6.2)(svelte@5.38.6) + + prettier@2.8.7: + optional: true + + prettier@2.8.8: {} + + prettier@3.6.2: {} + + pretty-format@27.5.1: + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + + prismjs@1.30.0: {} + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + property-information@6.5.0: {} + + property-information@7.1.0: {} + + proto-list@1.2.4: {} + + proxy-compare@3.0.1: {} + + proxy-from-env@1.1.0: {} + + publint@0.3.12: + dependencies: + '@publint/pack': 0.1.2 + package-manager-detector: 1.3.0 + picocolors: 1.1.1 + sade: 1.8.1 + + pump@3.0.3: + dependencies: + end-of-stream: 1.4.5 + once: 1.4.0 + + punycode@2.3.1: {} + + quansync@0.2.11: {} + + queue-microtask@1.2.3: {} + + radix3@1.1.2: {} + + rc@1.2.8: + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + + react-dom@19.1.1(react@19.1.1): + dependencies: + react: 19.1.1 + scheduler: 0.26.0 + + react-hot-toast@2.6.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + csstype: 3.1.3 + goober: 2.1.16(csstype@3.1.3) + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + react-is@17.0.2: {} + + react-refresh@0.17.0: {} + + react@19.1.1: {} + + read-yaml-file@1.1.0: + dependencies: + graceful-fs: 4.2.11 + js-yaml: 3.14.1 + pify: 4.0.1 + strip-bom: 3.0.0 + + readdirp@4.1.2: {} + + recma-build-jsx@1.0.0: + dependencies: + '@types/estree': 1.0.8 + estree-util-build-jsx: 3.0.1 + vfile: 6.0.3 + + recma-jsx@1.0.1(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + estree-util-to-js: 2.0.0 + recma-parse: 1.0.0 + recma-stringify: 1.0.0 + unified: 11.0.5 + + recma-parse@1.0.0: + dependencies: + '@types/estree': 1.0.8 + esast-util-from-js: 2.0.1 + unified: 11.0.5 + vfile: 6.0.3 + + recma-stringify@1.0.0: + dependencies: + '@types/estree': 1.0.8 + estree-util-to-js: 2.0.0 + unified: 11.0.5 + vfile: 6.0.3 + + redent@3.0.0: + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + + regex-recursion@6.0.2: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@6.0.1: + dependencies: + regex-utilities: 2.3.0 + + registry-auth-token@5.1.0: + dependencies: + '@pnpm/npm-conf': 2.3.1 + + registry-url@6.0.1: + dependencies: + rc: 1.2.8 + + rehype-expressive-code@0.41.3: + dependencies: + expressive-code: 0.41.3 + + rehype-parse@9.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-from-html: 2.0.3 + unified: 11.0.5 + + rehype-raw@7.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-raw: 9.1.0 + vfile: 6.0.3 + + rehype-recma@1.0.0: + dependencies: + '@types/estree': 1.0.8 + '@types/hast': 3.0.4 + hast-util-to-estree: 3.1.3 + transitivePeerDependencies: + - supports-color + + rehype-stringify@10.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + unified: 11.0.5 + + rehype@13.0.2: + dependencies: + '@types/hast': 3.0.4 + rehype-parse: 9.0.1 + rehype-stringify: 10.0.1 + unified: 11.0.5 + + remark-gfm@4.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.1.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-mdx@3.1.1: + dependencies: + mdast-util-mdx: 3.0.0 + micromark-extension-mdxjs: 3.0.0 + transitivePeerDependencies: + - supports-color + + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + micromark-util-types: 2.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-rehype@11.1.2: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.2.0 + unified: 11.0.5 + vfile: 6.0.3 + + remark-smartypants@3.0.2: + dependencies: + retext: 9.0.0 + retext-smartypants: 6.2.0 + unified: 11.0.5 + unist-util-visit: 5.0.0 + + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.2 + unified: 11.0.5 + + request-light@0.5.8: {} + + request-light@0.7.0: {} + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + resolve-from@5.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + restructure@3.0.2: {} + + retext-latin@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 + parse-latin: 7.0.0 + unified: 11.0.5 + + retext-smartypants@6.2.0: + dependencies: + '@types/nlcst': 2.0.3 + nlcst-to-string: 4.0.0 + unist-util-visit: 5.0.0 + + retext-stringify@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 + nlcst-to-string: 4.0.0 + unified: 11.0.5 + + retext@9.0.0: + dependencies: + '@types/nlcst': 2.0.3 + retext-latin: 4.0.0 + retext-stringify: 4.0.0 + unified: 11.0.5 + + reusify@1.1.0: {} + + rolldown-plugin-dts@0.15.10(rolldown@1.0.0-beta.38)(typescript@5.9.2): + dependencies: + '@babel/generator': 7.28.3 + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + ast-kit: 2.1.2 + birpc: 2.5.0 + debug: 4.4.3 + dts-resolver: 2.1.2 + get-tsconfig: 4.10.1 + rolldown: 1.0.0-beta.38 + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - oxc-resolver + - supports-color + + rolldown@1.0.0-beta.38: + dependencies: + '@oxc-project/types': 0.89.0 + '@rolldown/pluginutils': 1.0.0-beta.38 + ansis: 4.1.0 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-beta.38 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.38 + '@rolldown/binding-darwin-x64': 1.0.0-beta.38 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.38 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.38 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.38 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.38 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.38 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.38 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.38 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.38 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.38 + '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.38 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.38 + + rollup@4.50.2: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.50.2 + '@rollup/rollup-android-arm64': 4.50.2 + '@rollup/rollup-darwin-arm64': 4.50.2 + '@rollup/rollup-darwin-x64': 4.50.2 + '@rollup/rollup-freebsd-arm64': 4.50.2 + '@rollup/rollup-freebsd-x64': 4.50.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.50.2 + '@rollup/rollup-linux-arm-musleabihf': 4.50.2 + '@rollup/rollup-linux-arm64-gnu': 4.50.2 + '@rollup/rollup-linux-arm64-musl': 4.50.2 + '@rollup/rollup-linux-loong64-gnu': 4.50.2 + '@rollup/rollup-linux-ppc64-gnu': 4.50.2 + '@rollup/rollup-linux-riscv64-gnu': 4.50.2 + '@rollup/rollup-linux-riscv64-musl': 4.50.2 + '@rollup/rollup-linux-s390x-gnu': 4.50.2 + '@rollup/rollup-linux-x64-gnu': 4.50.2 + '@rollup/rollup-linux-x64-musl': 4.50.2 + '@rollup/rollup-openharmony-arm64': 4.50.2 + '@rollup/rollup-win32-arm64-msvc': 4.50.2 + '@rollup/rollup-win32-ia32-msvc': 4.50.2 + '@rollup/rollup-win32-x64-msvc': 4.50.2 + fsevents: 2.3.3 + + rrweb-cssom@0.8.0: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 + + s.color@0.0.15: {} + + sade@1.8.1: + dependencies: + mri: 1.2.0 + + safer-buffer@2.1.2: {} + + sass-embedded-all-unknown@1.91.0: + dependencies: + sass: 1.91.0 + optional: true + + sass-embedded-android-arm64@1.91.0: + optional: true + + sass-embedded-android-arm@1.91.0: + optional: true + + sass-embedded-android-riscv64@1.91.0: + optional: true + + sass-embedded-android-x64@1.91.0: + optional: true + + sass-embedded-darwin-arm64@1.91.0: + optional: true + + sass-embedded-darwin-x64@1.91.0: + optional: true + + sass-embedded-linux-arm64@1.91.0: + optional: true + + sass-embedded-linux-arm@1.91.0: + optional: true + + sass-embedded-linux-musl-arm64@1.91.0: + optional: true + + sass-embedded-linux-musl-arm@1.91.0: + optional: true + + sass-embedded-linux-musl-riscv64@1.91.0: + optional: true + + sass-embedded-linux-musl-x64@1.91.0: + optional: true + + sass-embedded-linux-riscv64@1.91.0: + optional: true + + sass-embedded-linux-x64@1.91.0: + optional: true + + sass-embedded-unknown-all@1.91.0: + dependencies: + sass: 1.91.0 + optional: true + + sass-embedded-win32-arm64@1.91.0: + optional: true + + sass-embedded-win32-x64@1.91.0: + optional: true + + sass-embedded@1.91.0: + dependencies: + '@bufbuild/protobuf': 2.8.0 + buffer-builder: 0.2.0 + colorjs.io: 0.5.2 + immutable: 5.1.3 + rxjs: 7.8.2 + supports-color: 8.1.1 + sync-child-process: 1.0.2 + varint: 6.0.0 + optionalDependencies: + sass-embedded-all-unknown: 1.91.0 + sass-embedded-android-arm: 1.91.0 + sass-embedded-android-arm64: 1.91.0 + sass-embedded-android-riscv64: 1.91.0 + sass-embedded-android-x64: 1.91.0 + sass-embedded-darwin-arm64: 1.91.0 + sass-embedded-darwin-x64: 1.91.0 + sass-embedded-linux-arm: 1.91.0 + sass-embedded-linux-arm64: 1.91.0 + sass-embedded-linux-musl-arm: 1.91.0 + sass-embedded-linux-musl-arm64: 1.91.0 + sass-embedded-linux-musl-riscv64: 1.91.0 + sass-embedded-linux-musl-x64: 1.91.0 + sass-embedded-linux-riscv64: 1.91.0 + sass-embedded-linux-x64: 1.91.0 + sass-embedded-unknown-all: 1.91.0 + sass-embedded-win32-arm64: 1.91.0 + sass-embedded-win32-x64: 1.91.0 + + sass-formatter@0.7.9: + dependencies: + suf-log: 2.5.3 + + sass@1.91.0: + dependencies: + chokidar: 4.0.3 + immutable: 5.1.3 + source-map-js: 1.2.1 + optionalDependencies: + '@parcel/watcher': 2.5.1 + optional: true + + saxes@6.0.0: + dependencies: + xmlchars: 2.2.0 + + scheduler@0.26.0: {} + + semver@6.3.1: {} + + semver@7.7.2: {} + + set-cookie-parser@2.7.1: {} + + sharp@0.33.5: + dependencies: + color: 4.2.3 + detect-libc: 2.1.0 + semver: 7.7.2 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.33.5 + '@img/sharp-darwin-x64': 0.33.5 + '@img/sharp-libvips-darwin-arm64': 1.0.4 + '@img/sharp-libvips-darwin-x64': 1.0.4 + '@img/sharp-libvips-linux-arm': 1.0.5 + '@img/sharp-libvips-linux-arm64': 1.0.4 + '@img/sharp-libvips-linux-s390x': 1.0.4 + '@img/sharp-libvips-linux-x64': 1.0.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + '@img/sharp-linux-arm': 0.33.5 + '@img/sharp-linux-arm64': 0.33.5 + '@img/sharp-linux-s390x': 0.33.5 + '@img/sharp-linux-x64': 0.33.5 + '@img/sharp-linuxmusl-arm64': 0.33.5 + '@img/sharp-linuxmusl-x64': 0.33.5 + '@img/sharp-wasm32': 0.33.5 + '@img/sharp-win32-ia32': 0.33.5 + '@img/sharp-win32-x64': 0.33.5 + optional: true + + sharp@0.34.3: + dependencies: + color: 4.2.3 + detect-libc: 2.1.0 + semver: 7.7.2 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.3 + '@img/sharp-darwin-x64': 0.34.3 + '@img/sharp-libvips-darwin-arm64': 1.2.0 + '@img/sharp-libvips-darwin-x64': 1.2.0 + '@img/sharp-libvips-linux-arm': 1.2.0 + '@img/sharp-libvips-linux-arm64': 1.2.0 + '@img/sharp-libvips-linux-ppc64': 1.2.0 + '@img/sharp-libvips-linux-s390x': 1.2.0 + '@img/sharp-libvips-linux-x64': 1.2.0 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.0 + '@img/sharp-libvips-linuxmusl-x64': 1.2.0 + '@img/sharp-linux-arm': 0.34.3 + '@img/sharp-linux-arm64': 0.34.3 + '@img/sharp-linux-ppc64': 0.34.3 + '@img/sharp-linux-s390x': 0.34.3 + '@img/sharp-linux-x64': 0.34.3 + '@img/sharp-linuxmusl-arm64': 0.34.3 + '@img/sharp-linuxmusl-x64': 0.34.3 + '@img/sharp-wasm32': 0.34.3 + '@img/sharp-win32-arm64': 0.34.3 + '@img/sharp-win32-ia32': 0.34.3 + '@img/sharp-win32-x64': 0.34.3 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shiki@3.12.0: + dependencies: + '@shikijs/core': 3.12.0 + '@shikijs/engine-javascript': 3.12.0 + '@shikijs/engine-oniguruma': 3.12.0 + '@shikijs/langs': 3.12.0 + '@shikijs/themes': 3.12.0 + '@shikijs/types': 3.12.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + shiki@3.12.2: + dependencies: + '@shikijs/core': 3.12.2 + '@shikijs/engine-javascript': 3.12.2 + '@shikijs/engine-oniguruma': 3.12.2 + '@shikijs/langs': 3.12.2 + '@shikijs/themes': 3.12.2 + '@shikijs/types': 3.12.2 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + siginfo@2.0.0: {} + + signal-exit@4.1.0: {} + + simple-swizzle@0.2.4: + dependencies: + is-arrayish: 0.3.4 + + sirv@3.0.2: + dependencies: + '@polka/url': 1.0.0-next.29 + mrmime: 2.0.1 + totalist: 3.0.1 + + sisteransi@1.0.5: {} + + slash@3.0.0: {} + + smol-toml@1.4.2: {} + + source-map-js@1.2.1: {} + + source-map@0.7.6: {} + + space-separated-tokens@2.0.2: {} + + spawndamnit@3.0.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + sprintf-js@1.0.3: {} + + stackback@0.0.2: {} + + std-env@3.9.0: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.2 + + string-width@7.2.0: + dependencies: + emoji-regex: 10.5.0 + get-east-asian-width: 1.4.0 + strip-ansi: 7.1.2 + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.2: + dependencies: + ansi-regex: 6.2.2 + + strip-bom@3.0.0: {} + + strip-indent@3.0.0: + dependencies: + min-indent: 1.0.1 + + strip-json-comments@2.0.1: {} + + strip-literal@3.0.0: + dependencies: + js-tokens: 9.0.1 + + style-to-js@1.1.17: + dependencies: + style-to-object: 1.0.9 + + style-to-object@1.0.9: + dependencies: + inline-style-parser: 0.2.4 + + styled-jsx@5.1.6(@babel/core@7.28.4)(react@19.1.1): + dependencies: + client-only: 0.0.1 + react: 19.1.1 + optionalDependencies: + '@babel/core': 7.28.4 + + suf-log@2.5.3: + dependencies: + s.color: 0.0.15 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + svelte-check@4.3.1(picomatch@4.0.3)(svelte@5.38.6)(typescript@5.9.2): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + chokidar: 4.0.3 + fdir: 6.5.0(picomatch@4.0.3) + picocolors: 1.1.1 + sade: 1.8.1 + svelte: 5.38.6 + typescript: 5.9.2 + transitivePeerDependencies: + - picomatch + + svelte2tsx@0.7.43(svelte@5.38.6)(typescript@5.9.2): + dependencies: + dedent-js: 1.0.1 + pascal-case: 3.1.2 + svelte: 5.38.6 + typescript: 5.9.2 + + svelte@5.38.6: + dependencies: + '@jridgewell/remapping': 2.3.5 + '@jridgewell/sourcemap-codec': 1.5.5 + '@sveltejs/acorn-typescript': 1.0.5(acorn@8.15.0) + '@types/estree': 1.0.8 + acorn: 8.15.0 + aria-query: 5.3.2 + axobject-query: 4.1.0 + clsx: 2.1.1 + esm-env: 1.2.2 + esrap: 2.1.0 + is-reference: 3.0.3 + locate-character: 3.0.0 + magic-string: 0.30.18 + zimmerframe: 1.1.2 + + svgo@3.3.2: + dependencies: + '@trysound/sax': 0.2.0 + commander: 7.2.0 + css-select: 5.2.2 + css-tree: 2.3.1 + css-what: 6.2.2 + csso: 5.0.5 + picocolors: 1.1.1 + + symbol-tree@3.2.4: {} + + sync-child-process@1.0.2: + dependencies: + sync-message-port: 1.1.3 + + sync-message-port@1.1.3: {} + + tabbable@6.2.0: {} + + tailwindcss@4.1.12: {} + + tailwindcss@4.1.13: {} + + tapable@2.2.3: {} + + tar@6.2.1: + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + + tar@7.4.3: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.0.2 + mkdirp: 3.0.1 + yallist: 5.0.0 + + term-size@2.2.1: {} + + tiny-inflate@1.0.3: {} + + tinybench@2.9.0: {} + + tinyexec@0.3.2: {} + + tinyexec@1.0.1: {} + + tinyglobby@0.2.14: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + tinypool@1.1.1: {} + + tinyrainbow@2.0.0: {} + + tinyspy@4.0.3: {} + + tlds@1.260.0: {} + + tldts-core@6.1.86: {} + + tldts@6.1.86: + dependencies: + tldts-core: 6.1.86 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toad-cache@3.7.0: {} + + totalist@3.0.1: {} + + tough-cookie@5.1.2: + dependencies: + tldts: 6.1.86 + + tr46@0.0.3: {} + + tr46@5.1.1: + dependencies: + punycode: 2.3.1 + + tree-kill@1.2.2: {} + + trim-lines@3.0.1: {} + + trough@2.2.0: {} + + ts-morph@26.0.0: + dependencies: + '@ts-morph/common': 0.27.0 + code-block-writer: 13.0.3 + + tsconfck@3.1.6(typescript@5.9.2): + optionalDependencies: + typescript: 5.9.2 + + tsdown@0.14.2(publint@0.3.12)(typescript@5.9.2): + dependencies: + ansis: 4.1.0 + cac: 6.7.14 + chokidar: 4.0.3 + debug: 4.4.3 + diff: 8.0.2 + empathic: 2.0.0 + hookable: 5.5.3 + rolldown: 1.0.0-beta.38 + rolldown-plugin-dts: 0.15.10(rolldown@1.0.0-beta.38)(typescript@5.9.2) + semver: 7.7.2 + tinyexec: 1.0.1 + tinyglobby: 0.2.14 + tree-kill: 1.2.2 + unconfig: 7.3.3 + optionalDependencies: + publint: 0.3.12 + typescript: 5.9.2 + transitivePeerDependencies: + - '@typescript/native-preview' + - oxc-resolver + - supports-color + - vue-tsc + + tslib@2.8.1: {} + + tsx@4.20.5: + dependencies: + esbuild: 0.25.9 + get-tsconfig: 4.10.1 + optionalDependencies: + fsevents: 2.3.3 + + type-fest@4.41.0: {} + + typesafe-path@0.2.2: {} + + typescript-auto-import-cache@0.3.6: + dependencies: + semver: 7.7.2 + + typescript@5.9.2: {} + + ufo@1.6.1: {} + + uint8arrays@3.0.0: + dependencies: + multiformats: 9.9.0 + + ultrahtml@1.6.0: {} + + unconfig@7.3.3: + dependencies: + '@quansync/fs': 0.1.5 + defu: 6.1.4 + jiti: 2.5.1 + quansync: 0.2.11 + + uncrypto@0.1.3: {} + + undici-types@5.26.5: {} + + undici-types@7.11.0: {} + + undici-types@7.12.0: {} + + undici@6.21.3: {} + + unicode-properties@1.4.1: + dependencies: + base64-js: 1.5.1 + unicode-trie: 2.0.0 + + unicode-trie@2.0.0: + dependencies: + pako: 0.2.9 + tiny-inflate: 1.0.3 + + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + + unifont@0.5.2: + dependencies: + css-tree: 3.1.0 + ofetch: 1.4.1 + ohash: 2.0.11 + + unist-util-find-after@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + + unist-util-is@6.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-modify-children@4.0.0: + dependencies: + '@types/unist': 3.0.3 + array-iterate: 2.0.1 + + unist-util-position-from-estree@2.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-remove-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-visit: 5.0.0 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-children@3.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.1: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + + unist-util-visit@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + universal-github-app-jwt@2.2.2: {} + + universal-user-agent@7.0.3: {} + + universalify@0.1.2: {} + + unplugin-macros@0.18.1(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1): + dependencies: + ast-kit: 2.1.2 + magic-string-ast: 1.0.2 + unplugin: 2.3.10 + vite: 7.1.5(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1) + vite-node: 3.2.4(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + unplugin-raw@0.6.1(esbuild@0.25.9): + dependencies: + unplugin: 2.3.10 + unplugin-utils: 0.2.5 + optionalDependencies: + esbuild: 0.25.9 + + unplugin-utils@0.2.5: + dependencies: + pathe: 2.0.3 + picomatch: 4.0.3 + + unplugin@2.3.10: + dependencies: + '@jridgewell/remapping': 2.3.5 + acorn: 8.15.0 + picomatch: 4.0.3 + webpack-virtual-modules: 0.6.2 + + unstorage@1.17.1: + dependencies: + anymatch: 3.1.3 + chokidar: 4.0.3 + destr: 2.0.5 + h3: 1.15.4 + lru-cache: 10.4.3 + node-fetch-native: 1.6.7 + ofetch: 1.4.1 + ufo: 1.6.1 + + update-browserslist-db@1.1.3(browserslist@4.26.2): + dependencies: + browserslist: 4.26.2 + escalade: 3.2.0 + picocolors: 1.1.1 + + util-deprecate@1.0.2: {} + + varint@6.0.0: {} + + vfile-location@5.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile: 6.0.3 + + vfile-message@4.0.3: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.3 + + vite-node@3.2.4(@types/node@24.4.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1): + dependencies: + cac: 6.7.14 + debug: 4.4.3 + es-module-lexer: 1.7.0 + pathe: 2.0.3 + vite: 7.1.3(@types/node@24.4.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + vite-node@3.2.4(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1): + dependencies: + cac: 6.7.14 + debug: 4.4.3 + es-module-lexer: 1.7.0 + pathe: 2.0.3 + vite: 7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + vite-plugin-pagefind@1.0.7(vite@7.1.5(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1)): + dependencies: + colorette: 2.0.20 + package-manager-detector: 0.2.11 + vite: 7.1.5(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1) + + vite@6.3.6(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1): + dependencies: + esbuild: 0.25.9 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.50.2 + tinyglobby: 0.2.14 + optionalDependencies: + '@types/node': 24.5.0 + fsevents: 2.3.3 + jiti: 2.5.1 + lightningcss: 1.30.1 + sass: 1.91.0 + sass-embedded: 1.91.0 + tsx: 4.20.5 + yaml: 2.8.1 + + vite@7.1.3(@types/node@24.4.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1): + dependencies: + esbuild: 0.25.9 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.50.2 + tinyglobby: 0.2.14 + optionalDependencies: + '@types/node': 24.4.0 + fsevents: 2.3.3 + jiti: 2.5.1 + lightningcss: 1.30.1 + sass: 1.91.0 + sass-embedded: 1.91.0 + tsx: 4.20.5 + yaml: 2.8.1 + + vite@7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1): + dependencies: + esbuild: 0.25.9 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.50.2 + tinyglobby: 0.2.14 + optionalDependencies: + '@types/node': 24.5.0 + fsevents: 2.3.3 + jiti: 2.5.1 + lightningcss: 1.30.1 + sass: 1.91.0 + sass-embedded: 1.91.0 + tsx: 4.20.5 + yaml: 2.8.1 + + vite@7.1.5(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1): + dependencies: + esbuild: 0.25.9 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.50.2 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 24.5.0 + fsevents: 2.3.3 + jiti: 2.5.1 + lightningcss: 1.30.1 + sass: 1.91.0 + sass-embedded: 1.91.0 + tsx: 4.20.5 + yaml: 2.8.1 + + vitefu@1.1.1(vite@6.3.6(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1)): + optionalDependencies: + vite: 6.3.6(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1) + + vitefu@1.1.1(vite@7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1)): + optionalDependencies: + vite: 7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1) + + vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.4.0)(jiti@2.5.1)(jsdom@26.1.0)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1): + dependencies: + '@types/chai': 5.2.2 + '@vitest/expect': 3.2.4 + '@vitest/mocker': 3.2.4(vite@7.1.3(@types/node@24.4.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1)) + '@vitest/pretty-format': 3.2.4 + '@vitest/runner': 3.2.4 + '@vitest/snapshot': 3.2.4 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.3.3 + debug: 4.4.3 + expect-type: 1.2.2 + magic-string: 0.30.18 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.9.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.14 + tinypool: 1.1.1 + tinyrainbow: 2.0.0 + vite: 7.1.3(@types/node@24.4.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1) + vite-node: 3.2.4(@types/node@24.4.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/debug': 4.1.12 + '@types/node': 24.4.0 + jsdom: 26.1.0 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.5.0)(jiti@2.5.1)(jsdom@26.1.0)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1): + dependencies: + '@types/chai': 5.2.2 + '@vitest/expect': 3.2.4 + '@vitest/mocker': 3.2.4(vite@7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1)) + '@vitest/pretty-format': 3.2.4 + '@vitest/runner': 3.2.4 + '@vitest/snapshot': 3.2.4 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.3.3 + debug: 4.4.3 + expect-type: 1.2.2 + magic-string: 0.30.18 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.9.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.14 + tinypool: 1.1.1 + tinyrainbow: 2.0.0 + vite: 7.1.3(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1) + vite-node: 3.2.4(@types/node@24.5.0)(jiti@2.5.1)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(tsx@4.20.5)(yaml@2.8.1) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/debug': 4.1.12 + '@types/node': 24.5.0 + jsdom: 26.1.0 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + volar-service-css@0.0.62(@volar/language-service@2.4.23): + dependencies: + vscode-css-languageservice: 6.3.7 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.1.0 + optionalDependencies: + '@volar/language-service': 2.4.23 + + volar-service-emmet@0.0.62(@volar/language-service@2.4.23): + dependencies: + '@emmetio/css-parser': 0.4.0 + '@emmetio/html-matcher': 1.3.0 + '@vscode/emmet-helper': 2.11.0 + vscode-uri: 3.1.0 + optionalDependencies: + '@volar/language-service': 2.4.23 + + volar-service-html@0.0.62(@volar/language-service@2.4.23): + dependencies: + vscode-html-languageservice: 5.5.1 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.1.0 + optionalDependencies: + '@volar/language-service': 2.4.23 + + volar-service-prettier@0.0.62(@volar/language-service@2.4.23)(prettier@3.6.2): + dependencies: + vscode-uri: 3.1.0 + optionalDependencies: + '@volar/language-service': 2.4.23 + prettier: 3.6.2 + + volar-service-typescript-twoslash-queries@0.0.62(@volar/language-service@2.4.23): + dependencies: + vscode-uri: 3.1.0 + optionalDependencies: + '@volar/language-service': 2.4.23 + + volar-service-typescript@0.0.62(@volar/language-service@2.4.23): + dependencies: + path-browserify: 1.0.1 + semver: 7.7.2 + typescript-auto-import-cache: 0.3.6 + vscode-languageserver-textdocument: 1.0.12 + vscode-nls: 5.2.0 + vscode-uri: 3.1.0 + optionalDependencies: + '@volar/language-service': 2.4.23 + + volar-service-yaml@0.0.62(@volar/language-service@2.4.23): + dependencies: + vscode-uri: 3.1.0 + yaml-language-server: 1.15.0 + optionalDependencies: + '@volar/language-service': 2.4.23 + + vscode-css-languageservice@6.3.7: + dependencies: + '@vscode/l10n': 0.0.18 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.1.0 + + vscode-html-languageservice@5.5.1: + dependencies: + '@vscode/l10n': 0.0.18 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.1.0 + + vscode-json-languageservice@4.1.8: + dependencies: + jsonc-parser: 3.3.1 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-nls: 5.2.0 + vscode-uri: 3.1.0 + + vscode-jsonrpc@6.0.0: {} + + vscode-jsonrpc@8.2.0: {} + + vscode-languageserver-protocol@3.16.0: + dependencies: + vscode-jsonrpc: 6.0.0 + vscode-languageserver-types: 3.16.0 + + vscode-languageserver-protocol@3.17.5: + dependencies: + vscode-jsonrpc: 8.2.0 + vscode-languageserver-types: 3.17.5 + + vscode-languageserver-textdocument@1.0.12: {} + + vscode-languageserver-types@3.16.0: {} + + vscode-languageserver-types@3.17.5: {} + + vscode-languageserver@7.0.0: + dependencies: + vscode-languageserver-protocol: 3.16.0 + + vscode-languageserver@9.0.1: + dependencies: + vscode-languageserver-protocol: 3.17.5 + + vscode-nls@5.2.0: {} + + vscode-uri@3.1.0: {} + + w3c-xmlserializer@5.0.0: + dependencies: + xml-name-validator: 5.0.0 + + web-namespaces@2.0.1: {} + + webidl-conversions@3.0.1: {} + + webidl-conversions@7.0.0: {} + + webpack-virtual-modules@0.6.2: {} + + whatwg-encoding@3.1.1: + dependencies: + iconv-lite: 0.6.3 + + whatwg-mimetype@4.0.0: {} + + whatwg-url@14.2.0: + dependencies: + tr46: 5.1.1 + webidl-conversions: 7.0.0 + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which-pm-runs@1.1.0: {} + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + widest-line@5.0.0: + dependencies: + string-width: 7.2.0 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.3 + string-width: 5.1.2 + strip-ansi: 7.1.2 + + wrap-ansi@9.0.2: + dependencies: + ansi-styles: 6.2.3 + string-width: 7.2.0 + strip-ansi: 7.1.2 + + wrappy@1.0.2: {} + + ws@8.18.3: {} + + xml-name-validator@5.0.0: {} + + xmlchars@2.2.0: {} + + xxhash-wasm@1.1.0: {} + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yallist@4.0.0: {} + + yallist@5.0.0: {} + + yaml-language-server@1.15.0: + dependencies: + ajv: 8.17.1 + lodash: 4.17.21 + request-light: 0.5.8 + vscode-json-languageservice: 4.1.8 + vscode-languageserver: 7.0.0 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-nls: 5.2.0 + vscode-uri: 3.1.0 + yaml: 2.2.2 + optionalDependencies: + prettier: 2.8.7 + + yaml@2.2.2: {} + + yaml@2.8.1: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yauzl@2.10.0: + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + + yocto-queue@1.2.1: {} + + yocto-spinner@0.2.3: + dependencies: + yoctocolors: 2.1.2 + + yoctocolors@2.1.2: {} + + zimmerframe@1.1.2: {} + + zod-to-json-schema@3.24.6(zod@3.25.76): + dependencies: + zod: 3.25.76 + + zod-to-ts@1.2.0(typescript@5.9.2)(zod@3.25.76): + dependencies: + typescript: 5.9.2 + zod: 3.25.76 + + zod@3.25.76: {} + + zwitch@2.0.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000000..f27f4fc610 --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,123 @@ +packages: + - packages/* + - playgrounds/* + - sites/* + +catalog: + '@astrojs/check': 0.9.4 + '@astrojs/mdx': 4.3.4 + '@astrojs/partytown': 2.1.4 + '@astrojs/react': 4.3.0 + '@astrojs/svelte': 7.1.0 + '@atproto/api': 0.16.6 + '@changesets/cli': 2.29.7 + '@clack/prompts': 0.11.0 + '@floating-ui/react': 0.27.16 + '@lucide/svelte': 0.542.0 + '@nanostores/persistent': 1.1.0 + '@sveltejs/adapter-auto': 6.1.0 + '@sveltejs/adapter-vercel': 5.10.2 + '@sveltejs/kit': 2.37.0 + '@sveltejs/package': 2.5.0 + '@sveltejs/vite-plugin-svelte': 6.1.3 + '@svitejs/changesets-changelog-github.amrom.workers.devpact': 1.2.0 + '@tailwindcss/forms': 0.5.10 + '@tailwindcss/postcss': 4.1.12 + '@tailwindcss/vite': 4.1.12 + '@testing-library/jest-dom': 6.8.0 + '@testing-library/react': 16.3.0 + '@testing-library/svelte': 5.2.8 + '@trivago/prettier-plugin-sort-imports': 5.2.2 + '@types/chroma-js': 3.1.1 + '@types/estree': 1.0.8 + '@types/node': 24.4.0 + '@types/react': 19.1.12 + '@types/react-dom': 19.1.9 + '@types/semver': 7.7.0 + '@vitejs/plugin-react': 5.0.2 + '@zag-js/accordion': 1.24.2 + '@zag-js/avatar': 1.24.2 + '@zag-js/collection': 1.24.2 + '@zag-js/combobox': 1.24.2 + '@zag-js/dialog': 1.24.2 + '@zag-js/file-upload': 1.24.2 + '@zag-js/popover': 1.24.2 + '@zag-js/progress': 1.24.2 + '@zag-js/radio-group': 1.24.2 + '@zag-js/rating-group': 1.24.2 + '@zag-js/react': 1.24.2 + '@zag-js/slider': 1.24.2 + '@zag-js/svelte': 1.24.2 + '@zag-js/switch': 1.24.2 + '@zag-js/tabs': 1.24.2 + '@zag-js/tags-input': 1.24.2 + '@zag-js/toast': 1.24.2 + '@zag-js/tooltip': 1.24.2 + astro: 5.13.5 + astro-auto-import: 0.4.4 + astro-expressive-code: 0.41.3 + astro-icon: 1.1.5 + autoprefixer: 10.4.21 + chroma-js: 3.1.2 + colorette: 2.0.20 + commander: 14.0.0 + detect-indent: 7.0.1 + fuse.js: 7.1.0 + jsdom: 26.1.0 + latest-version: 9.0.0 + lucide-react: 0.542.0 + magic-string: 0.30.18 + nanoid: 5.1.5 + nanostores: 1.0.1 + next: 15.5.2 + node-html-parser: 7.0.1 + octokit: 5.0.3 + oxlint: 1.15.0 + oxlint-tsgolint: 0.2.0 + package-manager-detector: 1.3.0 + pagefind: 1.3.0 + postcss: 8.5.6 + prettier: 3.6.2 + prettier-plugin-astro: 0.14.1 + prettier-plugin-svelte: 3.4.0 + prettier-plugin-tailwindcss: 0.6.14 + publint: 0.3.12 + react: 19.1.1 + react-dom: 19.1.1 + react-hot-toast: 2.6.0 + sass-embedded: 1.91.0 + semver: 7.7.2 + sharp: 0.34.3 + shiki: 3.12.0 + svelte: 5.38.6 + svelte-check: 4.3.1 + tailwindcss: 4.1.12 + tinyglobby: 0.2.14 + ts-morph: 26.0.0 + tsdown: 0.14.2 + tslib: 2.8.1 + tsx: 4.20.5 + type-fest: 4.41.0 + typescript: 5.9.2 + unplugin-macros: 0.18.1 + unplugin-raw: 0.6.1 + vite: 7.1.3 + vite-plugin-pagefind: 1.0.7 + vitest: 3.2.4 + zimmerframe: 1.1.2 + +catalogMode: strict + +cleanupUnusedCatalogs: true + +engineStrict: true + +minimumReleaseAge: 1440 + +onlyBuiltDependencies: + - '@parcel/watcher' + - '@tailwindcss/oxide' + - esbuild + - sharp + +savePrefix: '' diff --git a/postcss.config.cjs b/postcss.config.cjs deleted file mode 100644 index fe10e55a83..0000000000 --- a/postcss.config.cjs +++ /dev/null @@ -1,13 +0,0 @@ -const tailwindcss = require('tailwindcss'); -const autoprefixer = require('autoprefixer'); - -const config = { - plugins: [ - //Some plugins, like tailwindcss/nesting, need to run before Tailwind, - tailwindcss(), - //But others, like autoprefixer, need to run after, - autoprefixer - ] -}; - -module.exports = config; diff --git a/prettier.config.ts b/prettier.config.ts new file mode 100644 index 0000000000..6c11b2ce09 --- /dev/null +++ b/prettier.config.ts @@ -0,0 +1,22 @@ +import type { Config } from 'prettier'; + +export default { + plugins: ['prettier-plugin-astro', 'prettier-plugin-svelte', '@trivago/prettier-plugin-sort-imports'], + overrides: [ + { + files: '*.astro', + options: { + parser: 'astro', + }, + }, + { + files: '*.svelte', + options: { + parser: 'svelte', + }, + }, + ], + printWidth: 140, + singleQuote: true, + useTabs: true, +} satisfies Config; diff --git a/scripts/skel b/scripts/skel deleted file mode 100644 index 1e1d4b7ea5..0000000000 --- a/scripts/skel +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/sh -# Usage: skel my-new-app -# Auto-runs Svelte-Kit + Tailwind + Skeleton setup to make it a one liner for setting a up a fresh Skeleton app. -# Either call this script directly, or preferably drop it into a bin directory that is in your $PATH. You need jq, pnpm installed as well -# Most likely you should tweak the options depending on what you are testing. - -npm init @svelte-add/kit@latest $1 -y -- --with typescript+eslint+prettier+tailwindcss --tailwindcss-typography --tailwindcss-forms -#additional options --install --tailwindcss-typography --tailwindcss-forms -cd $1/ -#pnpm i @brainandbones/skeleton --save-dev //re-enable when a @dev scope comes along -cat < tailwind.config.cjs -const typography = require('@tailwindcss/typography'); -const forms = require('@tailwindcss/forms'); -const skeleton = require('@brainandbones/skeleton/tailwind/theme.cjs'); - -const config = { - content: ['./src/**/*.{html,js,svelte,ts}', './node_modules/@brainandbones/skeleton/**/*.{html,js,svelte,ts}'], - - theme: { - extend: {} - }, - - plugins: [forms, typography, skeleton] -}; - -module.exports = config; -EOT -#curl -s -o src/app.postcss https://raw.githubusercontent.com/Brain-Bones/skeleton/master/src/app.css -truncate -s 0 src/app.postcss -cat < src/routes/+layout.svelte - - - -EOT diff --git a/sites/skeleton.dev/.prettierignore b/sites/skeleton.dev/.prettierignore new file mode 100644 index 0000000000..5e087d8b3b --- /dev/null +++ b/sites/skeleton.dev/.prettierignore @@ -0,0 +1 @@ +**/**/*.mdx diff --git a/sites/skeleton.dev/README.md b/sites/skeleton.dev/README.md new file mode 100644 index 0000000000..d9fc536800 --- /dev/null +++ b/sites/skeleton.dev/README.md @@ -0,0 +1,43 @@ +# Skeleton Documentation Website + +This project was generated using Astro: https://astro.build/ + +```sh +npm create astro@latest -- --template minimal +``` + +[![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/github/withastro/astro/tree/latest/examples/minimal) +[![Open with CodeSandbox](https://assets.codesandbox.io/github/button-edit-lime.svg)](https://codesandbox.io/p/sandbox/github/withastro/astro/tree/latest/examples/minimal) +[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/withastro/astro?devcontainer_path=.devcontainer/minimal/devcontainer.json) + +## 🚀 Project Structure + +Inside of your Astro project, you'll see the following folders and files: + +```text +/ +├── public/ +├── src/ +│ └── pages/ +│ └── index.astro +└── package.json +``` + +Astro looks for `.astro` or `.md` files in the `src/pages/` directory. Each page is exposed as a route based on its file name. + +There's nothing special about `src/components/`, but that's where we like to put any Astro/React/Vue/Svelte/Preact components. + +Any static assets, like images, can be placed in the `public/` directory. + +## 🧞 Commands + +All commands are run from the root of the project, from a terminal: + +| Command | Action | +| :------------------------ | :----------------------------------------------- | +| `npm install` | Installs dependencies | +| `npm run dev` | Starts local dev server at `localhost:4321` | +| `npm run build` | Build your production site to `./dist/` | +| `npm run preview` | Preview your build locally, before deploying | +| `npm run astro ...` | Run CLI commands like `astro add`, `astro check` | +| `npm run astro -- --help` | Get help using the Astro CLI | diff --git a/sites/skeleton.dev/astro.config.js b/sites/skeleton.dev/astro.config.js new file mode 100644 index 0000000000..0510c6c452 --- /dev/null +++ b/sites/skeleton.dev/astro.config.js @@ -0,0 +1,71 @@ +import mdx from '@astrojs/mdx'; +// Integrations +import partytown from '@astrojs/partytown'; +import react from '@astrojs/react'; +import svelte from '@astrojs/svelte'; +// Vite Plugins +import tailwindcss from '@tailwindcss/vite'; +import AutoImport from 'astro-auto-import'; +import expressiveCode from 'astro-expressive-code'; +import icon from 'astro-icon'; +import { defineConfig } from 'astro/config'; +import { pagefind } from 'vite-plugin-pagefind'; + +// https://astro.build/config +export default defineConfig({ + integrations: [ + // https://docs.astro.build/en/guides/integrations-guide/partytown/ + partytown(), + // https://docs.astro.build/en/guides/integrations-guide/svelte/ + svelte(), + // https://docs.astro.build/en/guides/integrations-guide/react/ + react({ + experimentalReactChildren: true, + }), + // https://expressive-code.com/ + expressiveCode({ + defaultProps: { wrap: true }, + themes: ['dark-plus', 'github-dark'], + }), + // https://www.astroicon.dev/ + icon({ + include: { + iconDir: ['src/icons'], + }, + }), + // https://github.com/delucis/astro-auto-import/tree/main/packages/astro-auto-import + AutoImport({ + imports: [ + // import ApiTable from '@components/docs/ApiTable.astro'; + '@components/docs/ApiTable.astro', + // import Anatomy from '@components/docs/Anatomy.astro'; + '@components/docs/Anatomy.astro', + { + // import componentSet from "@components/mdx/index"; + '@components/mdx/index': [['default', 'componentSet']], + // import { Icon } from 'astro-icon/components'; + 'astro-icon/components': ['Icon'], + // import { Code } from 'astro-expressive-code/components'; + 'astro-expressive-code/components': ['Code'], + // import { Preview } from '@components/docs/Preview.tsx'; + '@components/docs/Preview.tsx': ['Preview'], + // import { FrameworkTabs } from '@components/docs/FrameworkTabs'; + '@components/docs/FrameworkTabs.tsx': ['FrameworkTabs'], + }, + ], + }), + // IMPORTANT: MUST BE LAST INTEGRATION + // https://docs.astro.build/en/guides/integrations-guide/mdx/ + mdx(), + ], + vite: { + plugins: [ + // https://tailwindcss.com/docs/installation/framework-guides/astro + tailwindcss(), + // https://github.com/Hugos68/vite-plugin-pagefind + pagefind({ + outputDirectory: 'dist', + }), + ], + }, +}); diff --git a/sites/skeleton.dev/package.json b/sites/skeleton.dev/package.json new file mode 100644 index 0000000000..871803c815 --- /dev/null +++ b/sites/skeleton.dev/package.json @@ -0,0 +1,59 @@ +{ + "name": "@skeletonlabs/skeleton.dev", + "version": "0.0.1", + "private": true, + "type": "module", + "scripts": { + "dev": "astro dev", + "build": "pnpm generate:types && astro build && pnpm generate:search", + "check": "astro check --noSync", + "sync": "astro sync", + "generate:types": "tsx ./scripts/generate-type-documentation/index", + "generate:search": "pagefind --site dist --exclude-selectors \".expressive-code\"" + }, + "devDependencies": { + "@types/react": "catalog:", + "@types/react-dom": "catalog:", + "colorette": "catalog:", + "next": "catalog:", + "tinyglobby": "catalog:", + "ts-morph": "catalog:", + "tsx": "catalog:", + "vite-plugin-pagefind": "catalog:" + }, + "dependencies": { + "fuse.js": "catalog:", + "@astrojs/check": "catalog:", + "@astrojs/mdx": "catalog:", + "@astrojs/partytown": "catalog:", + "@astrojs/react": "catalog:", + "@astrojs/svelte": "catalog:", + "@atproto/api": "catalog:", + "@clack/prompts": "catalog:", + "@floating-ui/react": "catalog:", + "@lucide/svelte": "catalog:", + "@nanostores/persistent": "catalog:", + "@skeletonlabs/skeleton": "workspace:*", + "@skeletonlabs/skeleton-common": "workspace:*", + "@skeletonlabs/skeleton-react": "workspace:*", + "@skeletonlabs/skeleton-svelte": "workspace:*", + "@tailwindcss/forms": "catalog:", + "@tailwindcss/vite": "catalog:", + "astro": "catalog:", + "astro-auto-import": "catalog:", + "astro-expressive-code": "catalog:", + "astro-icon": "catalog:", + "lucide-react": "catalog:", + "nanostores": "catalog:", + "octokit": "catalog:", + "pagefind": "catalog:", + "react": "catalog:", + "react-dom": "catalog:", + "react-hot-toast": "catalog:", + "sharp": "catalog:", + "svelte": "catalog:", + "svelte-check": "catalog:", + "tailwindcss": "catalog:", + "typescript": "catalog:" + } +} diff --git a/sites/skeleton.dev/public/favicon.png b/sites/skeleton.dev/public/favicon.png new file mode 100644 index 0000000000..c4e3735c58 Binary files /dev/null and b/sites/skeleton.dev/public/favicon.png differ diff --git a/sites/skeleton.dev/public/llms.txt b/sites/skeleton.dev/public/llms.txt new file mode 100644 index 0000000000..d153f63a32 --- /dev/null +++ b/sites/skeleton.dev/public/llms.txt @@ -0,0 +1,14 @@ +# Skeleton Documentation for LLMs + +> Skeleton provides a uniform design language and structured framework for controlling the look and feel of your product and user experience. It serves as an opinionated design system that aims to greatly reduce the amount of time spent managing design elements and patterns, allowing you to more quickly build and manage your frontend interfaces at scale. + + +## Documentation Sets + +- [React package documentation](https://skeleton.dev/llms-react.txt): documentation with React specific examples. +- [Svelte package documentation](https://skeleton.dev/llms-svelte.txt): documentation with Svelte specific examples. + +## Notes +- The content is automatically generated from the official documentation +- Skeleton's core features are framework agnostic, only requiring the use of [Tailwind CSS](https://tailwindcss.com/). This provides full access to all design system features, while enabling you to standardize the design process for your framework of choice. + diff --git a/sites/skeleton.dev/scripts/generate-type-documentation/constants.ts b/sites/skeleton.dev/scripts/generate-type-documentation/constants.ts new file mode 100644 index 0000000000..cce66561b1 --- /dev/null +++ b/sites/skeleton.dev/scripts/generate-type-documentation/constants.ts @@ -0,0 +1,7 @@ +import { dirname, join } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +export const SKELETON_DEV_ROOT = join(dirname(fileURLToPath(import.meta.url)), '..', '..'); +export const MONOREPO_ROOT = join(dirname(SKELETON_DEV_ROOT), '..'); +export const OUTPUT_DIRECTORY = join(SKELETON_DEV_ROOT, 'src', 'content', 'types'); +export const CLASSES_DIRECTORY = join(MONOREPO_ROOT, 'packages', 'skeleton-common', 'dist', 'classes'); diff --git a/sites/skeleton.dev/scripts/generate-type-documentation/index.ts b/sites/skeleton.dev/scripts/generate-type-documentation/index.ts new file mode 100644 index 0000000000..38c6e2c3b9 --- /dev/null +++ b/sites/skeleton.dev/scripts/generate-type-documentation/index.ts @@ -0,0 +1,138 @@ +import { CLASSES_DIRECTORY, MONOREPO_ROOT, OUTPUT_DIRECTORY } from './constants'; +import { Parser } from './parser'; +import { kebabToCamel, kebabToPascal } from './string-utils'; +import { mkdir, readFile, rm, writeFile } from 'node:fs/promises'; +import { join } from 'node:path'; +import { pathToFileURL } from 'node:url'; +import { glob } from 'tinyglobby'; +import * as tsMorph from 'ts-morph'; + +async function getPartOrderFromAnatomy(framework: string, component: string) { + const project = new tsMorph.Project({ useInMemoryFileSystem: true }); + const sourceFile = project.createSourceFile( + `anatomy.js`, + await readFile( + join(MONOREPO_ROOT, 'packages', `skeleton-${framework}`, 'dist', 'components', component, 'modules', `anatomy.js`), + 'utf8', + ), + ); + const anatomy = sourceFile.getFirstDescendantByKind(tsMorph.SyntaxKind.ObjectLiteralExpression); + if (!anatomy) { + return [`${kebabToPascal(component)}Root`]; + } + return [ + `${kebabToPascal(component)}Root`, + ...anatomy + .getProperties() + .filter(tsMorph.Node.isPropertyAssignment) + .map((p) => { + const name = p.getName(); + if (name === 'Context') { + return `${kebabToPascal(component)}RootContext`; + } + return `${kebabToPascal(component)}${name}`; + }), + ]; +} + +async function getClassValue(component: string, part: string) { + try { + const module = await import(pathToFileURL(join(CLASSES_DIRECTORY, `${component}.js`)).href); + const value = module[`classes${kebabToPascal(component)}`][kebabToCamel(part)]; + if (!value || typeof value !== 'string') { + return; + } + return value + .split(' ') + .map((str) => str.replace('skb:', '')) + .join(' '); + } catch {} +} + +function getComponentNameFromPath(path: string): string { + const segments = path.split(/[\\/]/); + const component = segments.at(-3); + if (!component) { + throw new Error(`Could not determine component from path: ${path}`); + } + return component; +} + +function getComponentPartNameFromPath(path: string): string { + const segments = path.split(/[\\/]/); + const componentPart = segments.at(-1)?.split('.').at(0); + if (!componentPart) { + throw new Error(`Could not determine component part from path: ${path}`); + } + return componentPart; +} + +async function main() { + for (const framework of ['svelte', 'react'] as const) { + await rm(join(OUTPUT_DIRECTORY, framework), { recursive: true, force: true }); + await mkdir(join(OUTPUT_DIRECTORY, framework), { recursive: true }); + + const paths = await glob(`**/anatomy/*.d.ts`, { + cwd: join(MONOREPO_ROOT, 'packages', `skeleton-${framework}`, 'dist', 'components'), + absolute: true, + }); + + const components = paths.reduce( + (acc, path) => { + const component = getComponentNameFromPath(path); + if (!acc[component]) { + acc[component] = []; + } + acc[component].push(path); + return acc; + }, + {} as Record, + ); + + const parser = new Parser(framework); + + for (const [component, parts] of Object.entries(components)) { + const partOrder = await getPartOrderFromAnatomy(framework, component); + + const types = ( + await Promise.all( + parts.map(async (part) => { + const sourceFile = parser.getSourceFile(part); + const componentPartName = getComponentPartNameFromPath(part); + const _interface = sourceFile.getInterface(`${kebabToPascal(component)}${kebabToPascal(componentPartName)}Props`); + const classValue = await getClassValue(component, componentPartName); + return { + name: _interface.name, + props: _interface.props, + metadata: { + classValue: classValue, + }, + }; + }), + ) + ).toSorted((a, b) => { + const aName = a.name.replace(/Props$/, ''); + const bName = b.name.replace(/Props$/, ''); + return partOrder.indexOf(aName) - partOrder.indexOf(bName); + }); + + const result = JSON.stringify( + { + name: component, + types: types, + }, + undefined, + 4, + ); + + const outputPath = join(OUTPUT_DIRECTORY, framework, `${component}.json`); + + await writeFile(outputPath, result, 'utf8'); + } + } +} + +main().catch((error) => { + console.error(error); + process.exit(1); +}); diff --git a/sites/skeleton.dev/scripts/generate-type-documentation/parser.ts b/sites/skeleton.dev/scripts/generate-type-documentation/parser.ts new file mode 100644 index 0000000000..16c3a3624e --- /dev/null +++ b/sites/skeleton.dev/scripts/generate-type-documentation/parser.ts @@ -0,0 +1,127 @@ +import { MONOREPO_ROOT } from './constants'; +import { join } from 'node:path'; +import * as tsMorph from 'ts-morph'; + +export type TypeKind = 'function' | 'array' | 'object' | 'primitive'; + +export interface Property { + name: string; + type: string; + typeKind: TypeKind; + optional: boolean; + JSDoc: JSDoc; +} + +export interface JSDoc { + description: string | null; + tags: Tag[]; +} + +export interface Tag { + name: string; + value: string | null; +} + +export interface Interface { + name: string; + props: Property[]; +} + +export class SourceFile { + constructor(private sourceFile: tsMorph.SourceFile) {} + + private isFunctionType(type: tsMorph.Type) { + return type.getCallSignatures().length > 0 || type.getUnionTypes().some((t) => t.getCallSignatures().length > 0); + } + + private isArrayType(type: tsMorph.Type) { + return type.isArray() || type.getUnionTypes().some((t) => t.isArray()); + } + + private isObjectType(type: tsMorph.Type) { + return type.isObject() || type.getUnionTypes().some((t) => t.isObject()); + } + + private getTypeKind(symbol: tsMorph.Symbol): TypeKind { + const type = symbol.getTypeAtLocation(this.sourceFile); + if (this.isFunctionType(type)) { + return 'function'; + } + if (this.isArrayType(type)) { + return 'array'; + } + if (this.isObjectType(type)) { + return 'object'; + } + return 'primitive'; + } + + private getDocumentation(symbol: tsMorph.Symbol): JSDoc { + const jsDoc = symbol + .getDeclarations() + .filter((decl) => tsMorph.Node.isJSDocable(decl)) + .flatMap((decl) => decl.getJsDocs()) + .at(0); + + if (!jsDoc) { + return { description: null, tags: [] }; + } + + return { + description: jsDoc.getDescription().trim(), + tags: jsDoc.getTags().map((tag) => ({ name: tag.getTagName(), value: tag.getCommentText() ?? null })), + }; + } + + public getProperty(symbol: tsMorph.Symbol): Property { + const type = symbol.getTypeAtLocation(this.sourceFile); + return { + name: symbol.getName(), + type: type.getText(undefined, tsMorph.ts.TypeFormatFlags.UseAliasDefinedOutsideCurrentScope), + typeKind: this.getTypeKind(symbol), + optional: symbol.isOptional(), + JSDoc: this.getDocumentation(symbol), + }; + } + + public getInterface(name: string): Interface { + const interface_ = this.sourceFile.getInterface(name); + if (!interface_) { + throw new Error(`Interface not found: ${name}`); + } + + interface_.getExtends().forEach((ext) => { + if (/HTMLAttributes<[^>]+>/.test(ext.getText())) { + interface_.removeExtends(ext); + } + }); + + return { + name: interface_.getName(), + props: interface_ + .getType() + .getProperties() + .map((symbol) => this.getProperty(symbol)), + }; + } +} + +export class Parser { + private project: tsMorph.Project; + + constructor(framework: string) { + this.project = new tsMorph.Project({ + skipAddingFilesFromTsConfig: true, + tsConfigFilePath: join(MONOREPO_ROOT, 'packages', `skeleton-${framework}`, 'tsconfig.json'), + }); + this.project.addSourceFilesAtPaths(join(MONOREPO_ROOT, 'packages', `skeleton-${framework}`, 'dist', 'components/*/anatomy/*.d.ts')); + } + + public getSourceFile(path: string): SourceFile { + const sourceFile = this.project.getSourceFile(path); + if (!sourceFile) { + throw new Error(`Source file not found: ${path}`); + } + return new SourceFile(sourceFile); + } +} diff --git a/sites/skeleton.dev/scripts/generate-type-documentation/string-utils.ts b/sites/skeleton.dev/scripts/generate-type-documentation/string-utils.ts new file mode 100644 index 0000000000..47d06b16d7 --- /dev/null +++ b/sites/skeleton.dev/scripts/generate-type-documentation/string-utils.ts @@ -0,0 +1,16 @@ +export function capitalize(str: string) { + return str.charAt(0).toUpperCase() + str.slice(1); +} + +export function kebabToPascal(str: string) { + return str.split('-').map(capitalize).join(''); +} + +export function kebabToCamel(str: string) { + const pascal = kebabToPascal(str); + return pascal.charAt(0).toLowerCase() + pascal.slice(1); +} + +export function pascalToKebab(str: string) { + return str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase(); +} diff --git a/sites/skeleton.dev/src/components/docs/Anatomy.astro b/sites/skeleton.dev/src/components/docs/Anatomy.astro new file mode 100644 index 0000000000..45095425bb --- /dev/null +++ b/sites/skeleton.dev/src/components/docs/Anatomy.astro @@ -0,0 +1,44 @@ +--- +interface Props { + isComponent?: boolean; + label?: string; + descriptor?: string; + tag?: string; +} + +const { isComponent, label, descriptor, tag } = Astro.props; + +const labelFallback = '(unlabeled)'; +const tagFallback = 'div'; +--- + +
+
+
+ + + {isComponent ? `<${label ?? labelFallback}>` : (label ?? labelFallback)} + + + {descriptor && {descriptor}} +
+ + {`<${tag ?? tagFallback}>`} +
+ + { + Astro.slots.has('default') && ( +
+ +
+ ) + } +
+ + diff --git a/sites/skeleton.dev/src/components/docs/ApiTable.astro b/sites/skeleton.dev/src/components/docs/ApiTable.astro new file mode 100644 index 0000000000..6233c04c5f --- /dev/null +++ b/sites/skeleton.dev/src/components/docs/ApiTable.astro @@ -0,0 +1,68 @@ +--- +import { getEntry } from 'astro:content'; +import { Code } from 'astro-expressive-code/components'; + +interface Props { + component: string; + framework: string; +} + +const framework = Astro.props.framework ?? Astro.params.slug?.split('/').at(-1); +const component = Astro.props.component ?? Astro.params.slug?.split('/').at(-2); + +const types = await getEntry('types', `${framework}/${component}`); + +function capitalize(str: string) { + return str.charAt(0).toUpperCase() + str.slice(1); +} +--- + +
+ { + !types ? ( +

+ Unable to load types for {framework}/{component} +

+ ) : ( +
+ {types.data.types.map((type) => ( + <> +

{type.name.replace(capitalize(component), '').replace('Props', '')}

+ {type.metadata.classValue && type.metadata.classValue !== "''" && } + + + + + + + + + + {type.props.map((property) => ( + + + + + + ))} + +
PropertyDefaultType
+ {property.name} + + {property.JSDoc && property.JSDoc.tags.some((tag) => tag.name === 'default') ? ( + {property.JSDoc.tags.find((tag) => tag.name === 'default')?.value} + ) : ( + - + )} + + {/* This pre tag will otherwise include the line breaks prettier adds */} + {/* prettier-ignore */} +
{property.type}
+ {property.JSDoc.description} +
+ + ))} +
+ ) + } +
diff --git a/sites/skeleton.dev/src/components/docs/BlueskyFeed.svelte b/sites/skeleton.dev/src/components/docs/BlueskyFeed.svelte new file mode 100644 index 0000000000..b35254e1f6 --- /dev/null +++ b/sites/skeleton.dev/src/components/docs/BlueskyFeed.svelte @@ -0,0 +1,64 @@ + + +{#await postsPromise} + {#each { length: 15 } as _ (_)} +
+ {/each} +{:then posts} + {#each posts as post (post.cid)} + +
+
+ avatar + {new Date(post.record.createdAt).toLocaleString()} +
+

{post.record.text}

+
+ {#if post.embed} + {#if post.embed.$type.includes('external')} +
+ {#if post.embed.external.thumb} + {post.embed.external.title} + {:else} +
+ {post.embed.external.title} +
+ {/if} +
+ {:else if post.embed.$type.includes('images')} + {#each post.embed.images as image (image)} + {image.alt} + {/each} + {/if} + {/if} +
+
+
+ {/each} +{:catch error} +

{error.message}

+{/await} diff --git a/sites/skeleton.dev/src/components/docs/Breadcrumbs.astro b/sites/skeleton.dev/src/components/docs/Breadcrumbs.astro new file mode 100644 index 0000000000..31cb43f5d5 --- /dev/null +++ b/sites/skeleton.dev/src/components/docs/Breadcrumbs.astro @@ -0,0 +1,31 @@ +--- +const { pathname } = Astro.url; +const exceptions = ['components']; // Add more exceptions here +const breadcrumbs = pathname.split('/').filter((crumb) => Boolean(crumb) && crumb !== 'docs'); +--- + +
    + { + breadcrumbs.map((crumb, i, arr) => { + const isLast = i === arr.length - 1; + const isException = exceptions.includes(breadcrumbs[0]); + const href = isException || isLast ? undefined : `/docs/${breadcrumbs[0]}/${crumb}`; + const displayCrumb = crumb.replace('-', ' '); + + return ( + <> +
  1. + {href ? ( + + {displayCrumb} + + ) : ( + displayCrumb + )} +
  2. + {!isLast &&
  3. } + + ); + }) + } +
diff --git a/sites/skeleton.dev/src/components/docs/ChipsBar.astro b/sites/skeleton.dev/src/components/docs/ChipsBar.astro new file mode 100644 index 0000000000..b0b611d3f5 --- /dev/null +++ b/sites/skeleton.dev/src/components/docs/ChipsBar.astro @@ -0,0 +1,61 @@ +--- +import { PersonStanding as IconA11y, BookOpen as IconBook, Code as IconCode, Blocks as IconZap } from 'lucide-react'; + +// Props +const { frontmatter, urls } = Astro.props; +--- + +
+ { + frontmatter.srcCore && ( + + + Source + + ) + } + { + frontmatter.srcReact && ( + + + React + + ) + } + { + frontmatter.srcSvelte && ( + + + Svelte + + ) + } + { + frontmatter.showDocsUrl && ( + + + Doc + + ) + } + { + frontmatter.srcAlly && ( + + + A11y + + ) + } + { + frontmatter.srcZag && ( + + + API + + ) + } +
diff --git a/sites/skeleton.dev/src/components/docs/Drawer.astro b/sites/skeleton.dev/src/components/docs/Drawer.astro new file mode 100644 index 0000000000..aaaeb77231 --- /dev/null +++ b/sites/skeleton.dev/src/components/docs/Drawer.astro @@ -0,0 +1,140 @@ +--- +import { X as IconClose, Menu as IconMenu } from 'lucide-react'; + +interface DrawerProps { + navigation?: { + href: string; + label: string; + target: string; + }[]; + base?: string; + classes?: string; +} + +const { + base = 'xl:hidden preset-filled-surface-100-900 border-white shadow-xl w-lg max-h-dvh h-dvh pb-24 overflow-y-scroll backdrop:bg-black/50 max-w-[75dvw]', + classes = '', +}: DrawerProps = Astro.props; +--- + +{/* Drawer */} + + +
+

Skeleton

+ +
+
+ + +
+
+ +{/* Drawer Trigger */} + + + + + diff --git a/sites/skeleton.dev/src/components/docs/FigmaBuyNow.astro b/sites/skeleton.dev/src/components/docs/FigmaBuyNow.astro new file mode 100644 index 0000000000..57bb3d2bb6 --- /dev/null +++ b/sites/skeleton.dev/src/components/docs/FigmaBuyNow.astro @@ -0,0 +1,115 @@ +--- +import { Check as IconCheck } from 'lucide-react'; +--- + +
+
+

Get Access

+ Figma UI Kit for Skeleton includes: +
+
+
+ +
+

Figma Skeleton v3 Components library

+
+
+
+ +
+

Lucide Icons

+
+
+
+ +
+

Dark / Light Support

+
+
+
+ +
+

Custom Theme Support

+
+
+
+ +
+

Figma Plugin to import your custom Theme

+
+
+
+ +
+

Tutorials

+
+
+
+
+
+ Individual License +
+
+ $109 + +1 year of updates +
+ Buy +
+
+
+ Team License + +
+
+ $219 + +1 year of updates +
+ Buy +
+
+
+
+ + + + + diff --git a/sites/skeleton.dev/src/components/docs/Footer.astro b/sites/skeleton.dev/src/components/docs/Footer.astro new file mode 100644 index 0000000000..712147a105 --- /dev/null +++ b/sites/skeleton.dev/src/components/docs/Footer.astro @@ -0,0 +1,28 @@ +--- +import { Icon } from 'astro-icon/components'; +import { socialLinks } from 'src/stores/social-links'; + +const { classList = 'p-4' } = Astro.props; +--- + + diff --git a/sites/skeleton.dev/src/components/docs/FrameworkPicker.astro b/sites/skeleton.dev/src/components/docs/FrameworkPicker.astro new file mode 100644 index 0000000000..93d9b500c6 --- /dev/null +++ b/sites/skeleton.dev/src/components/docs/FrameworkPicker.astro @@ -0,0 +1,64 @@ +--- +import { Icon } from 'astro-icon/components'; +import { frameworks } from 'src/stores/preferred-framework'; + +function getPathAndFramework(pathname: string) { + const parts = pathname.split('/').filter(Boolean); + const path = parts.slice(0, -1).join('/'); + const frameworkSlug = parts.at(-1); + const framework = frameworks.find(({ slug }) => slug === frameworkSlug); + return [path, framework] as const; +} + +const [path, framework] = getPathAndFramework(Astro.url.pathname); + +// Classes +const cBtn = 'flex justify-center items-center space-x-4 py-8 rounded-tl-container rounded-tr-container'; +const cActive = + 'bg-gradient-to-b from-surface-100 dark:from-surface-900/30 to-transparent border-t-[1px] border-l-[1px] border-r-[1px] border-surface-200-800'; +const cHover = 'hover:bg-gradient-to-t from-surface-100 dark:from-surface-900/30 to-transparent border-b-[1px] border-surface-200-800'; +--- + +{ + framework && ( + + ) +} + + diff --git a/sites/skeleton.dev/src/components/docs/FrameworkTabs.tsx b/sites/skeleton.dev/src/components/docs/FrameworkTabs.tsx new file mode 100644 index 0000000000..33dc8f5f61 --- /dev/null +++ b/sites/skeleton.dev/src/components/docs/FrameworkTabs.tsx @@ -0,0 +1,38 @@ +import React from 'react'; + +interface FrameworkTabsProps { + selected: 'svelte' | 'react'; + svelte: React.ReactNode; + react: React.ReactNode; +} + +/** Create a framework-specific tab component. */ +export const FrameworkTabs: React.FC = (props) => { + const [selected, setSelected] = React.useState(props.selected || 'react'); + const cTab = 'font-bold py-2 px-4 border-b-[3px] border-transparent capitalize'; + const cTabActive = '!border-surface-950-50'; + + function selectedClass(tab: string) { + if (tab === selected) { + return cTabActive; + } + } + + return ( +
+ {/* Tabs */} + + {/* Panel: React */} +
{props.react}
+ {/* Panel: Svelte */} +
{props.svelte}
+
+ ); +}; diff --git a/sites/skeleton.dev/src/components/docs/Header.astro b/sites/skeleton.dev/src/components/docs/Header.astro new file mode 100644 index 0000000000..731d67483e --- /dev/null +++ b/sites/skeleton.dev/src/components/docs/Header.astro @@ -0,0 +1,92 @@ +--- +// Stores +// Components +import Drawer from '@components/docs/Drawer.astro'; +import Lightswitch from '@components/docs/Lightswitch.astro'; +import Navigation from '@components/docs/Navigation.astro'; +// Icons +import { Icon } from 'astro-icon/components'; +import { socialLinks } from 'src/stores/social-links'; + +import { HeaderSponsors } from './HeaderSponsors'; +import { HeaderThemes } from './HeaderThemes'; +import { HeaderVersion } from './HeaderVersion'; +import Search from './Search.svelte'; + +const coreLinks = [ + { href: '/docs/get-started/introduction', title: 'Docs' }, + { href: '/news', title: 'News' }, + { href: 'https://themes.skeleton.dev/', title: 'Themes', target: '_blank' }, + { href: '/figma', title: 'Figma' }, +]; +const versionLinks = [ + { href: 'https://v1.skeleton.dev/', title: 'Version 1', target: '_blank' }, + { href: 'https://v2.skeleton.dev/', title: 'Version 2', target: '_blank' }, +]; +--- + +
+
+ +
+ + + + + + + +
+ +
+ + +
+ + +
+ + + + + + + + + + +
+ +
+
+
+
diff --git a/sites/skeleton.dev/src/components/docs/HeaderSponsors.tsx b/sites/skeleton.dev/src/components/docs/HeaderSponsors.tsx new file mode 100644 index 0000000000..d6d1cac677 --- /dev/null +++ b/sites/skeleton.dev/src/components/docs/HeaderSponsors.tsx @@ -0,0 +1,86 @@ +// Floating UI React +import { + FloatingFocusManager, + autoUpdate, + flip, + offset, + shift, + useClick, + useDismiss, + useFloating, + useInteractions, + useRole, +} from '@floating-ui/react'; +// Icons +import { ArrowUpRight as IconArrow } from 'lucide-react'; +import { ChevronDown as IconChevron } from 'lucide-react'; +import { Heart as IconHeart } from 'lucide-react'; +import React from 'react'; +import { useState } from 'react'; + +export const HeaderSponsors: React.FC = () => { + const [isOpen, setIsOpen] = useState(false); + + const { refs, floatingStyles, context } = useFloating({ + open: isOpen, + onOpenChange: setIsOpen, + middleware: [offset(8), flip(), shift()], + placement: 'top-end', + whileElementsMounted: autoUpdate, + }); + + const click = useClick(context); + const dismiss = useDismiss(context); + const role = useRole(context); + + const { getReferenceProps, getFloatingProps } = useInteractions([click, dismiss, role]); + + return ( + + ); +}; diff --git a/sites/skeleton.dev/src/components/docs/HeaderThemes.tsx b/sites/skeleton.dev/src/components/docs/HeaderThemes.tsx new file mode 100644 index 0000000000..36d6bfde4d --- /dev/null +++ b/sites/skeleton.dev/src/components/docs/HeaderThemes.tsx @@ -0,0 +1,117 @@ +// Floating UI React +import { + FloatingFocusManager, + autoUpdate, + flip, + offset, + shift, + useClick, + useDismiss, + useFloating, + useInteractions, + useRole, +} from '@floating-ui/react'; +// Themes +import { themes } from '@skeletonlabs/skeleton-common'; +// Icons +import { ArrowUpRight as IconArrow } from 'lucide-react'; +import { ChevronDown as IconChevron } from 'lucide-react'; +import { SwatchBook as IconTheme } from 'lucide-react'; +import React, { useEffect, useState } from 'react'; + +export const HeaderThemes: React.FC = () => { + const defaultTheme = 'cerberus'; + + const [isOpen, setIsOpen] = useState(false); + const [activeTheme, setActiveTheme] = useState(defaultTheme); + + useEffect(() => { + setActiveTheme(localStorage.getItem('theme') || defaultTheme); + }, []); + + const { refs, floatingStyles, context } = useFloating({ + open: isOpen, + onOpenChange: setIsOpen, + middleware: [offset(8), flip(), shift()], + whileElementsMounted: autoUpdate, + }); + + const click = useClick(context); + const dismiss = useDismiss(context); + const role = useRole(context); + + const { getReferenceProps, getFloatingProps } = useInteractions([click, dismiss, role]); + + function onSelection(themeName: string) { + setActiveTheme(themeName); + + document.body.classList.add('transition-all'); + document.body.classList.add('duration-200'); + + document.documentElement.setAttribute('data-theme', themeName); + localStorage.setItem('theme', themeName); + setIsOpen(false); + + setTimeout(() => { + document.body.classList.remove('transition-all'); + document.body.classList.remove('duration-200'); + }, 200); + } + + return ( +
+ {/* Trigger */} + + {/* Popup */} + {isOpen && ( + +
+ {/* Theme Generator */} +
+ setIsOpen(false)} + > + Create a Theme + + +
+ {/* Divider */} +
+ {/* Theme List */} +
+ {themes.map((theme) => ( + + ))} +
+
+
+ )} +
+ ); +}; diff --git a/sites/skeleton.dev/src/components/docs/HeaderVersion.tsx b/sites/skeleton.dev/src/components/docs/HeaderVersion.tsx new file mode 100644 index 0000000000..00bf05ee75 --- /dev/null +++ b/sites/skeleton.dev/src/components/docs/HeaderVersion.tsx @@ -0,0 +1,78 @@ +// Floating UI React +import { + FloatingFocusManager, + autoUpdate, + flip, + offset, + shift, + useClick, + useDismiss, + useFloating, + useInteractions, + useRole, +} from '@floating-ui/react'; +// Icons +import { ChevronDown as IconChevron } from 'lucide-react'; +import { ArrowUpRight as IconArrow } from 'lucide-react'; +import React from 'react'; +import { useState } from 'react'; + +export const HeaderVersion: React.FC = () => { + const [isOpen, setIsOpen] = useState(false); + + const { refs, floatingStyles, context } = useFloating({ + open: isOpen, + onOpenChange: setIsOpen, + middleware: [offset(8), flip(), shift()], + placement: 'top-start', + whileElementsMounted: autoUpdate, + }); + + const click = useClick(context); + const dismiss = useDismiss(context); + const role = useRole(context); + + const { getReferenceProps, getFloatingProps } = useInteractions([click, dismiss, role]); + + return ( +
+ {/* Trigger */} + + {/* Popup */} + {isOpen && ( + + + + )} +
+ ); +}; diff --git a/sites/skeleton.dev/src/components/docs/HideHeader.astro b/sites/skeleton.dev/src/components/docs/HideHeader.astro new file mode 100644 index 0000000000..2670aab133 --- /dev/null +++ b/sites/skeleton.dev/src/components/docs/HideHeader.astro @@ -0,0 +1,5 @@ + diff --git a/sites/skeleton.dev/src/components/docs/Lightswitch.astro b/sites/skeleton.dev/src/components/docs/Lightswitch.astro new file mode 100644 index 0000000000..2a418d855e --- /dev/null +++ b/sites/skeleton.dev/src/components/docs/Lightswitch.astro @@ -0,0 +1,31 @@ +--- +// Lightswitch +// Ref: https://docs.astro.build/en/tutorial/6-islands/2/ + +import { SunMoon } from 'lucide-react'; +--- + + + + diff --git a/sites/skeleton.dev/src/components/docs/NavGrid.astro b/sites/skeleton.dev/src/components/docs/NavGrid.astro new file mode 100644 index 0000000000..f2eaeaae44 --- /dev/null +++ b/sites/skeleton.dev/src/components/docs/NavGrid.astro @@ -0,0 +1,40 @@ +--- +import { getCollection } from 'astro:content'; +import type { CollectionEntry } from 'astro:content'; + +interface Props { + collection: 'docs'; + path: string; + classes: string; +} + +const { collection, path, classes } = Astro.props; + +// Get collection, filter by path +const collectionItems = await getCollection(collection, (item) => { + if (item.filePath?.includes(path) && !item.id.endsWith('meta.mdx')) { + return item; + } +}); + +// Sort Order +const sortByOrder = (a: CollectionEntry<'docs'>, b: CollectionEntry<'docs'>) => { + return a.data.order - b.data.order; +}; +--- + + diff --git a/sites/skeleton.dev/src/components/docs/Navigation.astro b/sites/skeleton.dev/src/components/docs/Navigation.astro new file mode 100644 index 0000000000..f837eef41f --- /dev/null +++ b/sites/skeleton.dev/src/components/docs/Navigation.astro @@ -0,0 +1,157 @@ +--- +import type { HTMLAttributes } from 'astro/types'; +import type { CollectionEntry } from 'astro:content'; +import { getCollection } from 'astro:content'; + +interface NavigationItem extends HTMLAttributes<'a'> { + title: string; + tag?: string; +} + +interface NavigationGroup { + title: string; + items: NavigationItem[]; +} + +interface Props { + topGroups?: NavigationGroup[]; + classList?: string; + bottomGroups?: NavigationGroup[]; +} +const { topGroups, bottomGroups, classList } = Astro.props; + +const sortByOrder = (a: CollectionEntry<'docs'>, b: CollectionEntry<'docs'>) => a.data.order - b.data.order; + +async function queryCollection(startsWith: string) { + return ( + await getCollection('docs', (entry) => { + if (!entry.id.startsWith(startsWith)) { + return false; + } + if (entry.id.split('/').length > 2) { + return false; + } + if (entry.id.endsWith('meta')) { + return false; + } + return true; + }) + ).toSorted(sortByOrder); +} + +async function queryMetaCollection(startsWith: string) { + return ( + await getCollection('docs', (entry) => { + if (!entry.id.startsWith(startsWith)) { + return false; + } + if (!entry.id.endsWith('meta')) { + return false; + } + return true; + }) + ).toSorted(sortByOrder); +} + +const toNavItems = (entries: CollectionEntry<'docs'>[]) => + entries.map((page) => ({ + title: page.data.title, + href: `/docs/${page.id}`, + tag: page.data.stability === 'stable' ? undefined : page.data.stability, + })); + +// Define navigation sections +const sections: [string, string, (prefix: string) => Promise[]>][] = [ + ['Get Started', 'get-started/', queryCollection], + ['Guides', 'guides/', queryCollection], + ['Design System', 'design/', queryCollection], + ['Tailwind Components', 'tailwind/', queryCollection], + ['Functional Components', 'components/', queryMetaCollection], + ['Headless Components', 'headless/', queryCollection], + ['Integrations', 'integrations/', queryMetaCollection], + ['Resources', 'resources/', queryCollection], +]; + +// Build navigation dynamically +const navigation: NavigationGroup[] = [ + ...(topGroups ?? []), + ...(await Promise.all( + sections.map(async ([title, prefix, queryFn]) => ({ + title, + items: toNavItems(await queryFn(prefix)), + })), + )), + ...(bottomGroups ?? []), +]; +--- + + + + diff --git a/sites/skeleton.dev/src/components/docs/Popover.tsx b/sites/skeleton.dev/src/components/docs/Popover.tsx new file mode 100644 index 0000000000..88896e71a3 --- /dev/null +++ b/sites/skeleton.dev/src/components/docs/Popover.tsx @@ -0,0 +1,81 @@ +import { + FloatingArrow, + arrow, + autoUpdate, + flip, + offset, + shift, + useClick, + useDismiss, + useFloating, + useFocus, + useInteractions, + useRole, +} from '@floating-ui/react'; +import React, { useRef, useState } from 'react'; + +interface PopoverProps extends React.PropsWithChildren { + trigger: React.ReactNode; + // Trigger --- + triggerBase?: string; + triggerPreset?: string; + triggerClasses?: string; + // Popover + popoverBase?: string; + popoverClasses?: string; + // Arrow + arrowBase?: string; + arrowClasses?: string; +} + +export const Popover: React.FC = ({ + // prettier-ignore + trigger, + // Trigger + triggerBase = '', + triggerPreset = '', + triggerClasses = '', + // Popover + popoverBase = 'z-10', + popoverClasses = '', + // Arrow + arrowBase = '', + arrowClasses = '', + // Children + children, +}) => { + const [isOpen, setIsOpen] = useState(false); + + const arrowRef = useRef(null); + const { refs, floatingStyles, context } = useFloating({ + open: isOpen, + onOpenChange: setIsOpen, + middleware: [offset(12), flip(), shift(), arrow({ element: arrowRef })], + placement: 'top', + whileElementsMounted: autoUpdate, + }); + + const click = useClick(context, {}); + const focus = useFocus(context); + const dismiss = useDismiss(context); + const role = useRole(context); + + const { getReferenceProps, getFloatingProps } = useInteractions([click, focus, dismiss, role]); + + return ( + <> + {/* Trigger */} + + {/* Popover */} + {isOpen && ( +
+
{children ?? '(children missing)'}
+ {/* Arrow */} + +
+ )} + + ); +}; diff --git a/sites/skeleton.dev/src/components/docs/Preview.tsx b/sites/skeleton.dev/src/components/docs/Preview.tsx new file mode 100644 index 0000000000..b0a2a72312 --- /dev/null +++ b/sites/skeleton.dev/src/components/docs/Preview.tsx @@ -0,0 +1,67 @@ +import React from 'react'; + +interface PreviewProps { + selected: 'preview' | 'code' | 'codeReact' | 'codeSvelte'; + preview: React.ReactNode; + code: React.ReactNode; + codeReact: React.ReactNode; + codeSvelte: React.ReactNode; +} + +/** Create preview/code tabs for showcasing features. */ +export const Preview: React.FC = (props) => { + const [selected, setSelected] = React.useState(props.selected || 'preview'); + const cTab = 'border-b-[1px] border-transparent pb-2 hover:[&>span]:preset-tonal-primary'; + const cTabControl = 'block p-2 px-4 capitalize rounded-container'; + const cTabActive = '!border-surface-950-50'; + + function selectedClass(tab: string) { + if (tab === selected) { + return cTabActive; + } + } + + return ( +
+ {/* Tabs */} + + {/* Panel: Preview */} +
+ {props.preview} +
+ {/* Panel: Code (Generic) */} +
{props.code}
+ {/* Panel: Code (React) */} +
{props.codeReact}
+ {/* Panel: Code (Svelte) */} +
{props.codeSvelte}
+
+ ); +}; diff --git a/sites/skeleton.dev/src/components/docs/Process.astro b/sites/skeleton.dev/src/components/docs/Process.astro new file mode 100644 index 0000000000..87f7ed0d8c --- /dev/null +++ b/sites/skeleton.dev/src/components/docs/Process.astro @@ -0,0 +1,3 @@ +
+ +
diff --git a/sites/skeleton.dev/src/components/docs/ProcessStep.astro b/sites/skeleton.dev/src/components/docs/ProcessStep.astro new file mode 100644 index 0000000000..c303da5423 --- /dev/null +++ b/sites/skeleton.dev/src/components/docs/ProcessStep.astro @@ -0,0 +1,13 @@ +--- +import { Check } from 'lucide-react'; +const { step } = Astro.props; +--- + +
+
+ {step !== 'check' ? step : } +
+
+ +
+
diff --git a/sites/skeleton.dev/src/components/docs/Search.svelte b/sites/skeleton.dev/src/components/docs/Search.svelte new file mode 100644 index 0000000000..42a197f4ea --- /dev/null +++ b/sites/skeleton.dev/src/components/docs/Search.svelte @@ -0,0 +1,227 @@ + + + + + + + + +
+
+ +
+ + +
+ + {#if showFilters} + + {/if} + +
+ {#await searchPromise} +

+ {:then results} + {#if results.length === 0 && query !== ''} +

No results found for {query}

+ {:else if results.length === 0} +

What can we help you find?

+ {:else} +
    + {#each results as result (result)} +
  1. + + + +
    +

    {result.meta.title}

    +

    {result.url}

    +
    + +
    + +
    + {#each result.sub_results.filter((r) => r.title !== result.meta.title) as subResult (subResult)} + + +
    +

    {subResult.title}

    +

    + + {@html subResult.excerpt} +

    +
    + +
    + {/each} +
    +
  2. + {/each} +
+ {/if} + {/await} +
+
diff --git a/sites/skeleton.dev/src/components/docs/TableCookbook.astro b/sites/skeleton.dev/src/components/docs/TableCookbook.astro new file mode 100644 index 0000000000..2fdf6b39fb --- /dev/null +++ b/sites/skeleton.dev/src/components/docs/TableCookbook.astro @@ -0,0 +1,40 @@ +--- +import { getCollection } from 'astro:content'; + +const collection = 'docs'; +const path = 'guides/cookbook/'; + +// Get Collection +const tableData = await getCollection(collection, (item) => { + if (item.filePath?.includes(path)) { + return item; + } +}); +--- + +
+ + + { + tableData.map((row) => ( + + + + {/* */} + + + )) + } + +
{row.data.title} +
+ {row.data.tags?.map((tag: string) => ( + {tag} + ))} +
+
{row.data.pubDate?.toLocaleDateString()} + + Explore → + +
+
diff --git a/sites/skeleton.dev/src/components/docs/TableOfContents.astro b/sites/skeleton.dev/src/components/docs/TableOfContents.astro new file mode 100644 index 0000000000..c95003dba1 --- /dev/null +++ b/sites/skeleton.dev/src/components/docs/TableOfContents.astro @@ -0,0 +1,51 @@ +--- +interface PageHeadings { + depth: number; + slug: string; + text: string; +} + +interface Props { + headings: PageHeadings[]; +} + +const { headings } = Astro.props; + +function setDepthClass(depth: number) { + if (depth === 3) { + return 'ml-4'; + } + if (depth === 4) { + return 'ml-6'; + } + if (depth === 5) { + return 'ml-8'; + } + if (depth === 6) { + return 'ml-10'; + } + return; +} +--- + +{ + headings.length > 0 && ( + + ) +} diff --git a/sites/skeleton.dev/src/components/docs/ThemeList.astro b/sites/skeleton.dev/src/components/docs/ThemeList.astro new file mode 100644 index 0000000000..f97bcc1e3b --- /dev/null +++ b/sites/skeleton.dev/src/components/docs/ThemeList.astro @@ -0,0 +1,34 @@ +--- +import { themes } from '@skeletonlabs/skeleton-common'; +--- + +
+ { + themes.map((theme) => ( + + )) + } +
+ + diff --git a/sites/skeleton.dev/src/components/homepage/HomeBottomCta.astro b/sites/skeleton.dev/src/components/homepage/HomeBottomCta.astro new file mode 100644 index 0000000000..36106f4697 --- /dev/null +++ b/sites/skeleton.dev/src/components/homepage/HomeBottomCta.astro @@ -0,0 +1,13 @@ +--- +import { ChevronRight as IconChevron } from 'lucide-react'; +--- + +
+
+

Start building with Skeleton today.

+
+ + Get Started + + +
diff --git a/sites/skeleton.dev/src/components/homepage/HomeCompGrid.svelte b/sites/skeleton.dev/src/components/homepage/HomeCompGrid.svelte new file mode 100644 index 0000000000..a0460e44ec --- /dev/null +++ b/sites/skeleton.dev/src/components/homepage/HomeCompGrid.svelte @@ -0,0 +1,407 @@ + + +
+ +
+ +
+
+

Create Account

+

Complete the form to get started.

+
+ +
+
+ + +
+ +
+ +
+
+

Notifications

+

Review each available option.

+
+
+
+
+

Do not disturb

+ +
+
+
+

Global notifications

+ +
+
+
+

Personal notifications

+ +
+
+
+

Priority notifications

+ +
+
+
+

Featured News alerts

+ +
+
+
+ +
+
+
+

Team

+

View all members of the team, or filter using the search field provided.

+
+ +
+ {#each teamData as member (member)} +
+ + {/each} +
+
+
+ +
+
+

Music

+

Harman Kardon Luna

+
+ Massive Attack +
+ + +
+
+ + + + +
+
+ +
+
+
+

Success

+

Task was completed.

+
+
+ +
+
+
+ +
+

Statistics

+
+
+

64k+

+
+

Downloads

+ ↑ 4% +
+
+
+

93k+

+
+

Views

+ ↓ 2.4% +
+
+
+

15k+

+
+

Members

+ ↑ 8% +
+
+
+
+

Data represents quarterly metrics for the TPS reports. Updates every 24 hours.

+
+ +
+

Progression

+
+ +
+
+ +
+
+
+

Revenue

+

Posted April 1-13

+
+ +
+
+
+
+ $3,900 + +20% +
+ +
+
+
+ $6,400 + -5% +
+ +
+
+
+ $1,300 + +8% +
+ +
+
+ +
+
+

Delivery

+ +
+
+

Size

+ +
+
+

Material

+ +
+
+ +
+ +
+

Invoice Paid

+

You paid $14,276. Receipt submitted to:

+

me@email.com

+
+ +
+ +
+ +
+ + + + + + + + + + + {#each tableData as row, i (row)} + + + + + + + {/each} + +
+ + SymbolNameWeight
+ + {row.symbol}{row.name}{row.atomic_no}
+
+
+ +
+

Set Reminder

+ + +
+ +
+
+ +
+
+
+

Contributions

+ +
+

+1,248

+

+150% increase

+
+
+ +
+
+ +
+ +
+

Pink Floyd

+ +
+

Another Brick in the Wall

+

3:16

+
+
+ +
+
+ + +
+
+
+
+
diff --git a/sites/skeleton.dev/src/components/homepage/HomeDesignSystem.svelte b/sites/skeleton.dev/src/components/homepage/HomeDesignSystem.svelte new file mode 100644 index 0000000000..1aad6f25c2 --- /dev/null +++ b/sites/skeleton.dev/src/components/homepage/HomeDesignSystem.svelte @@ -0,0 +1,175 @@ + + +
+ +
+

Design System

+ +
+

{steps[state].desc}

+ {#if state === 0} + Learn More → + {/if} +
+
+ +
+ {#if state === 0} + + figma + {:else if state == 1} + +
+ + +
+{`[data-theme='cerberus'] {
+	--spacing: 0.25rem;
+	--text-scaling: 1.067;
+	--base-font-color: var(--color-surface-950);
+	--base-font-color-dark: var(--color-surface-50);
+	--base-font-family: system-ui;
+	--base-font-size: inherit;
+	--base-line-height: inherit;
+	--base-font-weight: normal;
+	--base-font-style: normal;
+	--base-letter-spacing: 0em;
+	--heading-font-color: inherit;
+	--heading-font-color-dark: inherit;
+	--heading-font-family: inherit;
+	--heading-font-weight: bold;
+	--heading-font-style: normal;
+	--heading-letter-spacing: inherit;
+	--anchor-font-color: var(--color-primary-500);
+	--anchor-font-color-dark: var(--color-primary-400);
+	--anchor-font-family: inherit;
+	--anchor-font-size: inherit;
+	--anchor-line-height: inherit;
+	--anchor-font-weight: inherit;
+	--anchor-font-style: inherit;
+	--anchor-letter-spacing: inherit;
+	--anchor-text-decoration: none;
+	--anchor-text-decoration-hover: underline;
+	--anchor-text-decoration-active: none;
+	--anchor-text-decoration-focus: none;`.trim()}
+
+
+
+ {:else if state == 2} + +
+
+
+
+
+
+
+
+ {:else if state == 3} + +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ {:else if state == 4} + +
+

Aa

+

The quick brown fox jumped over the lazy dog.

+
+ {:else if state == 5} + +
+ {#each spacing as rowHeight (rowHeight)} +
+ {rowHeight} +
+
+ {/each} +
+ {:else if state == 6} + +
+ + + +
+ {/if} +
+
diff --git a/sites/skeleton.dev/src/components/homepage/HomeEvenMore.astro b/sites/skeleton.dev/src/components/homepage/HomeEvenMore.astro new file mode 100644 index 0000000000..f8217e20bf --- /dev/null +++ b/sites/skeleton.dev/src/components/homepage/HomeEvenMore.astro @@ -0,0 +1,71 @@ +--- +import { + SunMoon as IconDarkMode, + Palette as IconDesign, + BadgeCheck as IconFramework, + Puzzle as IconIntegrations, + FileCode as IconTypescript, + Blocks as IconZag, +} from 'lucide-react'; +--- + +
+ +
+

And Even More...

+

+ Solve the hard problems at scale. Skeleton comes with an assortment of quality of life features out of the box. +

+
+ +
+ +
+
+ +

Use Anywhere

+

Core features such as theses and utility classes require one dependency — Tailwind CSS.

+
+
+ +
+
+ +

Built with Zag.js

+

Enables cross-framework components with standardized features, a11y, and i18n.

+
+
+ +
+
+ +

Integrations

+

Easily extend Skeleton using our turnkey guides for popovers, code blocks, and more.

+
+
+ +
+
+ +

Adaptive Design

+

All interface elements automatically adapt to your themes colors, fonts, and overall aesethetic.

+
+
+ +
+
+ +

Dark Mode

+

Full support for Tailwind's dark mode and color scheme mechanisms out of the box.

+
+
+ +
+
+ +

Typescript

+

Type-safe by default, with helpful IntelliSense feedback as you work.

+
+
+
+
diff --git a/sites/skeleton.dev/src/components/homepage/HomeFrameworkComps.svelte b/sites/skeleton.dev/src/components/homepage/HomeFrameworkComps.svelte new file mode 100644 index 0000000000..d2fec59fe3 --- /dev/null +++ b/sites/skeleton.dev/src/components/homepage/HomeFrameworkComps.svelte @@ -0,0 +1,40 @@ + + +
+
+
+

Tailwind Components

+

+ Common visual interfaces, such as cards, buttons, and tables. Using semantic HTML elements and Tailwind utility classes. +

+
+ +
+
+
+

Functional Components

+

+ Interactive components for supported frameworks. Handle state and logic for user interaction and form elements. +

+
+
+ +
+
+
diff --git a/sites/skeleton.dev/src/components/homepage/HomeHero.astro b/sites/skeleton.dev/src/components/homepage/HomeHero.astro new file mode 100644 index 0000000000..e4dbdfdc0a --- /dev/null +++ b/sites/skeleton.dev/src/components/homepage/HomeHero.astro @@ -0,0 +1,39 @@ +--- +import { Icon } from 'astro-icon/components'; +import { ChevronRight as IconChevron } from 'lucide-react'; +--- + +
+ +
+
+ +
+
+
+ +
+ + + +

An adaptive design system powered by Tailwind CSS.

+

+ Skeleton integrates with Tailwind to provide an opinionated solution + for generating adaptive design systems. Including simple to use components for your favorite web frameworks. +

+ + +
+
diff --git a/sites/skeleton.dev/src/components/homepage/HomeMetrics.astro b/sites/skeleton.dev/src/components/homepage/HomeMetrics.astro new file mode 100644 index 0000000000..e4f4bf762e --- /dev/null +++ b/sites/skeleton.dev/src/components/homepage/HomeMetrics.astro @@ -0,0 +1,22 @@ +
+
+
+

80k+

+

Monthly Downloads

+
+
+ +
+
+

5k+

+

GitHub Stars

+
+
+ +
+
+

2k+

+

Discord Members

+
+
+
diff --git a/sites/skeleton.dev/src/components/homepage/HomeOpenSource.astro b/sites/skeleton.dev/src/components/homepage/HomeOpenSource.astro new file mode 100644 index 0000000000..536ed45938 --- /dev/null +++ b/sites/skeleton.dev/src/components/homepage/HomeOpenSource.astro @@ -0,0 +1,52 @@ +--- +import { ChevronRight as IconChevron } from 'lucide-react'; +import { Octokit } from 'octokit'; + +const octokit = new Octokit(); + +async function getContributors() { + const response = await octokit.rest.repos.listContributors({ + owner: 'skeletonlabs', + repo: 'skeleton', + per_page: 100, + }); + return response.data; +} + +const contributors = process.env.VERCEL_ENV === 'production' ? await getContributors() : []; +--- + +
+ +
+ { + contributors.map((contributor) => { + return ( + + {contributor.login} + + ); + }) + } +
+ +
+
+

Open Source

+

+ Tended by Skeleton Labs and provided under the flexible + MIT License. Join + our vast community of open source volunteers and start contributing today! +

+
+ +
+
diff --git a/sites/skeleton.dev/src/components/homepage/HomePlayground.astro b/sites/skeleton.dev/src/components/homepage/HomePlayground.astro new file mode 100644 index 0000000000..ee1e54d120 --- /dev/null +++ b/sites/skeleton.dev/src/components/homepage/HomePlayground.astro @@ -0,0 +1,76 @@ +--- +import { Icon } from 'astro-icon/components'; +import { Ellipsis as IconEllipsis } from 'lucide-react'; +--- + +
+ +
+

Live Demos

+

Test drive Skeleton directly in your browser for supported frameworks.

+

* Functional components limited to React and Svelte.

+
+ + +
diff --git a/sites/skeleton.dev/src/components/homepage/HomeSponsors.astro b/sites/skeleton.dev/src/components/homepage/HomeSponsors.astro new file mode 100644 index 0000000000..6abb05728e --- /dev/null +++ b/sites/skeleton.dev/src/components/homepage/HomeSponsors.astro @@ -0,0 +1,32 @@ +
+ +
+
+

Sponsor Us

+

+ Projects like Skeleton exist through the generosity of our community. Help fund the project, while receiving fun incentives in + return. Available on the following services. +

+
+
+ +
diff --git a/sites/skeleton.dev/src/components/mdx/Anchor.astro b/sites/skeleton.dev/src/components/mdx/Anchor.astro new file mode 100644 index 0000000000..84f69e814b --- /dev/null +++ b/sites/skeleton.dev/src/components/mdx/Anchor.astro @@ -0,0 +1,5 @@ +--- +const props = Astro.props; +--- + + diff --git a/sites/skeleton.dev/src/components/mdx/Blockquote.astro b/sites/skeleton.dev/src/components/mdx/Blockquote.astro new file mode 100644 index 0000000000..a9a20f97a2 --- /dev/null +++ b/sites/skeleton.dev/src/components/mdx/Blockquote.astro @@ -0,0 +1,5 @@ +--- +const props = Astro.props; +--- + +
diff --git a/sites/skeleton.dev/src/components/mdx/Code.astro b/sites/skeleton.dev/src/components/mdx/Code.astro new file mode 100644 index 0000000000..d57a27bde6 --- /dev/null +++ b/sites/skeleton.dev/src/components/mdx/Code.astro @@ -0,0 +1,5 @@ +--- +const props = Astro.props; +--- + + diff --git a/sites/skeleton.dev/src/components/mdx/Heading1.astro b/sites/skeleton.dev/src/components/mdx/Heading1.astro new file mode 100644 index 0000000000..ce45c007c4 --- /dev/null +++ b/sites/skeleton.dev/src/components/mdx/Heading1.astro @@ -0,0 +1,5 @@ +--- +const props = Astro.props; +--- + +

diff --git a/sites/skeleton.dev/src/components/mdx/Heading2.astro b/sites/skeleton.dev/src/components/mdx/Heading2.astro new file mode 100644 index 0000000000..286154a88d --- /dev/null +++ b/sites/skeleton.dev/src/components/mdx/Heading2.astro @@ -0,0 +1,5 @@ +--- +const props = Astro.props; +--- + +

diff --git a/sites/skeleton.dev/src/components/mdx/Heading3.astro b/sites/skeleton.dev/src/components/mdx/Heading3.astro new file mode 100644 index 0000000000..b2cce68929 --- /dev/null +++ b/sites/skeleton.dev/src/components/mdx/Heading3.astro @@ -0,0 +1,5 @@ +--- +const props = Astro.props; +--- + +

diff --git a/sites/skeleton.dev/src/components/mdx/Heading4.astro b/sites/skeleton.dev/src/components/mdx/Heading4.astro new file mode 100644 index 0000000000..aa6bd2ef03 --- /dev/null +++ b/sites/skeleton.dev/src/components/mdx/Heading4.astro @@ -0,0 +1,5 @@ +--- +const props = Astro.props; +--- + +

diff --git a/sites/skeleton.dev/src/components/mdx/Heading5.astro b/sites/skeleton.dev/src/components/mdx/Heading5.astro new file mode 100644 index 0000000000..b079ec5c47 --- /dev/null +++ b/sites/skeleton.dev/src/components/mdx/Heading5.astro @@ -0,0 +1,5 @@ +--- +const props = Astro.props; +--- + +
diff --git a/sites/skeleton.dev/src/components/mdx/Heading6.astro b/sites/skeleton.dev/src/components/mdx/Heading6.astro new file mode 100644 index 0000000000..91a2430b3c --- /dev/null +++ b/sites/skeleton.dev/src/components/mdx/Heading6.astro @@ -0,0 +1,5 @@ +--- +const props = Astro.props; +--- + +
diff --git a/sites/skeleton.dev/src/components/mdx/HorzRule.astro b/sites/skeleton.dev/src/components/mdx/HorzRule.astro new file mode 100644 index 0000000000..8808a5a24d --- /dev/null +++ b/sites/skeleton.dev/src/components/mdx/HorzRule.astro @@ -0,0 +1,5 @@ +--- +const props = Astro.props; +--- + +
diff --git a/sites/skeleton.dev/src/components/mdx/ListOrdered.astro b/sites/skeleton.dev/src/components/mdx/ListOrdered.astro new file mode 100644 index 0000000000..b84686064d --- /dev/null +++ b/sites/skeleton.dev/src/components/mdx/ListOrdered.astro @@ -0,0 +1,7 @@ +--- +const props = Astro.props; +--- + +
    + +
diff --git a/sites/skeleton.dev/src/components/mdx/ListUnordered.astro b/sites/skeleton.dev/src/components/mdx/ListUnordered.astro new file mode 100644 index 0000000000..d08ec7c6b4 --- /dev/null +++ b/sites/skeleton.dev/src/components/mdx/ListUnordered.astro @@ -0,0 +1,7 @@ +--- +const props = Astro.props; +--- + +
    + +
diff --git a/sites/skeleton.dev/src/components/mdx/Table.astro b/sites/skeleton.dev/src/components/mdx/Table.astro new file mode 100644 index 0000000000..3dee21e8d9 --- /dev/null +++ b/sites/skeleton.dev/src/components/mdx/Table.astro @@ -0,0 +1,9 @@ +--- +const props = Astro.props; +--- + +
+ + +
+
diff --git a/sites/skeleton.dev/src/components/mdx/index.ts b/sites/skeleton.dev/src/components/mdx/index.ts new file mode 100644 index 0000000000..c9617313ab --- /dev/null +++ b/sites/skeleton.dev/src/components/mdx/index.ts @@ -0,0 +1,34 @@ +// MDX Replacement Components +// https://docs.astro.build/en/guides/markdown-content/#assigning-custom-components-to-html-elements +// https://mdxjs.com/table-of-components/ +import Anchor from '@components/mdx/Anchor.astro'; +import Blockquote from '@components/mdx/Blockquote.astro'; +import Code from '@components/mdx/Code.astro'; +import Heading1 from '@components/mdx/Heading1.astro'; +import Heading2 from '@components/mdx/Heading2.astro'; +import Heading3 from '@components/mdx/Heading3.astro'; +import Heading4 from '@components/mdx/Heading4.astro'; +import Heading5 from '@components/mdx/Heading5.astro'; +import Heading6 from '@components/mdx/Heading6.astro'; +import HorzRule from '@components/mdx/HorzRule.astro'; +import ListOrdered from '@components/mdx/ListOrdered.astro'; +import ListUnordered from '@components/mdx/ListUnordered.astro'; +import Table from '@components/mdx/Table.astro'; + +const componentSet = { + h1: Heading1, + h2: Heading2, + h3: Heading3, + h4: Heading4, + h5: Heading5, + h6: Heading6, + a: Anchor, + blockquote: Blockquote, + ul: ListUnordered, + ol: ListOrdered, + code: Code, + hr: HorzRule, + table: Table, +}; + +export default componentSet; diff --git a/sites/skeleton.dev/src/content.config.ts b/sites/skeleton.dev/src/content.config.ts new file mode 100644 index 0000000000..dd20faa578 --- /dev/null +++ b/sites/skeleton.dev/src/content.config.ts @@ -0,0 +1,59 @@ +import { glob } from 'astro/loaders'; +import { defineCollection, z } from 'astro:content'; + +const docs = defineCollection({ + loader: glob({ + base: './src/content/docs', + pattern: ['**/*.mdx', '!**/_*.mdx'], + }), + schema: z.object({ + title: z.string().optional().default('(Title)'), + description: z.string().optional().default('(Description)'), + srcSvelte: z.string().optional(), + srcReact: z.string().optional(), + srcAlly: z.string().optional(), + srcZag: z.string().optional(), + stability: z.enum(['alpha', 'beta', 'stable']).optional().default('stable'), + showDocsUrl: z.boolean().optional().default(false), + pubDate: z.date().optional(), + tags: z.array(z.string()).optional(), + order: z.number().optional().default(0), + }), +}); + +const types = defineCollection({ + loader: glob({ + base: './src/content/types', + pattern: '**/*.json', + }), + schema: z.object({ + name: z.string(), + types: z.array( + z.object({ + name: z.string(), + props: z.array( + z.object({ + name: z.string(), + type: z.string(), + typeKind: z.string(), + optional: z.boolean(), + JSDoc: z.object({ + description: z.string().nullable(), + tags: z.array( + z.object({ + name: z.string(), + value: z.string().nullable(), + }), + ), + }), + }), + ), + metadata: z.object({ + classValue: z.string().optional(), + }), + }), + ), + }), +}); + +export const collections = { docs, types }; diff --git a/sites/skeleton.dev/src/content/docs/components/accordion/meta.mdx b/sites/skeleton.dev/src/content/docs/components/accordion/meta.mdx new file mode 100644 index 0000000000..78e3603e01 --- /dev/null +++ b/sites/skeleton.dev/src/content/docs/components/accordion/meta.mdx @@ -0,0 +1,9 @@ +--- +title: Accordion +description: Divide content into collapsible sections. +srcSvelte: '/src/components/accordion' +srcReact: '/src/components/accordion' +srcAlly: 'https://www.w3.org/WAI/ARIA/apg/patterns/accordion/' +srcZag: 'https://zagjs.com/components/react/accordion' +showDocsUrl: true +--- diff --git a/sites/skeleton.dev/src/content/docs/components/accordion/react.mdx b/sites/skeleton.dev/src/content/docs/components/accordion/react.mdx new file mode 100644 index 0000000000..cc5acd23c4 --- /dev/null +++ b/sites/skeleton.dev/src/content/docs/components/accordion/react.mdx @@ -0,0 +1,85 @@ +--- +layout: '@layouts/LayoutDoc.astro' +--- + +export const components = componentSet; + +import Default from '@examples/components/accordion/react/default.tsx'; +import DefaultRaw from '@examples/components/accordion/react/default.tsx?raw'; + +import State from '@examples/components/accordion/react/state'; +import StateRaw from '@examples/components/accordion/react/state.tsx?raw'; + +import Collapsible from '@examples/components/accordion/react/collapsible.tsx'; +import CollapsibleRaw from '@examples/components/accordion/react/collapsible.tsx?raw'; + +import Multiple from '@examples/components/accordion/react/multiple.tsx'; +import MultipleRaw from '@examples/components/accordion/react/multiple.tsx?raw'; + +import Columns from '@examples/components/accordion/react/columns'; +import ColumnsRaw from '@examples/components/accordion/react/columns.tsx?raw'; + + + + + + + + + + +## State + +Note that `value` and `onValueChanged` are optional on the root component. + + + + + + + + + + +## Collapsible + +By default you can't close open items. Adding `collapsible` changes this behavior. + + + + + + + + + + +## Multiple + +Adding `multiple` allows items to open independently. + + + + + + + + + + +## Grid Columns + +Use [Grid Columns](https://tailwindcss.com/docs/grid-template-columns) to adjust the layout of the Trigger component. + + + + + + + + + + +## API Reference + + diff --git a/sites/skeleton.dev/src/content/docs/components/accordion/svelte.mdx b/sites/skeleton.dev/src/content/docs/components/accordion/svelte.mdx new file mode 100644 index 0000000000..804d5c76ba --- /dev/null +++ b/sites/skeleton.dev/src/content/docs/components/accordion/svelte.mdx @@ -0,0 +1,85 @@ +--- +layout: '@layouts/LayoutDoc.astro' +--- + +export const components = componentSet; + +import Default from '@examples/components/accordion/svelte/default.svelte'; +import DefaultRaw from '@examples/components/accordion/svelte/default.svelte?raw'; + +import State from '@examples/components/accordion/svelte/state.svelte'; +import StateRaw from '@examples/components/accordion/svelte/state.svelte?raw'; + +import Collapsible from '@examples/components/accordion/svelte/collapsible.svelte'; +import CollapsibleRaw from '@examples/components/accordion/svelte/collapsible.svelte?raw'; + +import Multiple from '@examples/components/accordion/svelte/multiple.svelte'; +import MultipleRaw from '@examples/components/accordion/svelte/multiple.svelte?raw'; + +import Columns from '@examples/components/accordion/svelte/columns.svelte'; +import ColumnsRaw from '@examples/components/accordion/svelte/columns.svelte?raw'; + + + + + + + + + + +## State + +Note that `value` and `onValueChanged` are optional on the root component. + + + + + + + + + + +## Collapsible + +By default you can't close open items. Adding `collapsible` changes this behavior. + + + + + + + + + + +## Multiple + +Adding `multiple` allows items to open independently. + + + + + + + + + + +## Grid Columns + +Use [Grid Columns](https://tailwindcss.com/docs/grid-template-columns) to adjust the layout of the Trigger component. + + + + + + + + + + +## API Reference + + diff --git a/sites/skeleton.dev/src/content/docs/components/app-bar/meta.mdx b/sites/skeleton.dev/src/content/docs/components/app-bar/meta.mdx new file mode 100644 index 0000000000..08cce80161 --- /dev/null +++ b/sites/skeleton.dev/src/content/docs/components/app-bar/meta.mdx @@ -0,0 +1,7 @@ +--- +title: App Bar +description: A header element for the top of your page layout. +srcSvelte: '/src/components/app-bar' +srcReact: '/src/components/app-bar' +showDocsUrl: true +--- diff --git a/sites/skeleton.dev/src/content/docs/components/app-bar/react.mdx b/sites/skeleton.dev/src/content/docs/components/app-bar/react.mdx new file mode 100644 index 0000000000..6964c8f9ef --- /dev/null +++ b/sites/skeleton.dev/src/content/docs/components/app-bar/react.mdx @@ -0,0 +1,67 @@ +--- +layout: '@layouts/LayoutDoc.astro' +--- + +export const components = componentSet; + +import Default from '@examples/components/app-bar/react/default.tsx'; +import DefaultRaw from '@examples/components/app-bar/react/default.tsx?raw'; + +import Centered from '@examples/components/app-bar/react/centered.tsx'; +import CenteredRaw from '@examples/components/app-bar/react/centered.tsx?raw'; + +import Extended from '@examples/components/app-bar/react/extended.tsx'; +import ExtendedRaw from '@examples/components/app-bar/react/extended.tsx?raw'; + +import Responsive from '@examples/components/app-bar/react/responsive.tsx'; +import ResponsiveRaw from '@examples/components/app-bar/react/responsive.tsx?raw'; + + + + + + + + + + +## Centered + +Control the layout using a [grid-cols-\*](https://tailwindcss.com/docs/grid-column) utility class. + + + + + + + + + + +## Extended + +Move the `` to a new row within the root. + + + + + + + + + + +## Responsive + + + + + + + + + + +## API Reference + + diff --git a/sites/skeleton.dev/src/content/docs/components/app-bar/svelte.mdx b/sites/skeleton.dev/src/content/docs/components/app-bar/svelte.mdx new file mode 100644 index 0000000000..3ca913323c --- /dev/null +++ b/sites/skeleton.dev/src/content/docs/components/app-bar/svelte.mdx @@ -0,0 +1,67 @@ +--- +layout: '@layouts/LayoutDoc.astro' +--- + +export const components = componentSet; + +import Default from '@examples/components/app-bar/svelte/default.svelte'; +import DefaultRaw from '@examples/components/app-bar/svelte/default.svelte?raw'; + +import Centered from '@examples/components/app-bar/svelte/centered.svelte'; +import CenteredRaw from '@examples/components/app-bar/svelte/centered.svelte?raw'; + +import Extended from '@examples/components/app-bar/svelte/extended.svelte'; +import ExtendedRaw from '@examples/components/app-bar/svelte/extended.svelte?raw'; + +import Responsive from '@examples/components/app-bar/svelte/responsive.svelte'; +import ResponsiveRaw from '@examples/components/app-bar/svelte/responsive.svelte?raw'; + + + + + + + + + + +## Centered + +Control the layout using a [grid-cols-\*](https://tailwindcss.com/docs/grid-column) utility class. + + + + + + + + + + +## Extended + +Move the `` to a new row within the root. + + + + + + + + + + +## Responsive + + + + + + + + + + +## API Reference + + diff --git a/sites/skeleton.dev/src/content/docs/components/avatar/meta.mdx b/sites/skeleton.dev/src/content/docs/components/avatar/meta.mdx new file mode 100644 index 0000000000..f284370a08 --- /dev/null +++ b/sites/skeleton.dev/src/content/docs/components/avatar/meta.mdx @@ -0,0 +1,8 @@ +--- +title: Avatar +description: An image with a fallback for representing the user. +srcSvelte: '/src/components/avatar' +srcReact: '/src/components/avatar' +srcZag: 'https://zagjs.com/components/react/avatar' +showDocsUrl: true +--- diff --git a/sites/skeleton.dev/src/content/docs/components/avatar/react.mdx b/sites/skeleton.dev/src/content/docs/components/avatar/react.mdx new file mode 100644 index 0000000000..de6fedb47f --- /dev/null +++ b/sites/skeleton.dev/src/content/docs/components/avatar/react.mdx @@ -0,0 +1,53 @@ +--- +layout: '@layouts/LayoutDoc.astro' +--- + +export const components = componentSet; + +import Default from '@examples/components/avatar/react/default.tsx'; +import DefaultRaw from '@examples/components/avatar/react/default.tsx?raw'; + +import Fallback from '@examples/components/avatar/react/fallback.tsx'; +import FallbackRaw from '@examples/components/avatar/react/fallback.tsx?raw'; + +import Filter from '@examples/components/avatar/react/filter.tsx'; +import FilterRaw from '@examples/components/avatar/react/filter.tsx?raw'; + + + + + + + + + + +## Fallback + +Use `` to provide initials, icons, or a framework-specific image component. + + + + + + + + + + +## Filter + +Avatars can implement [SVG Filters](/docs/guides/cookbook/svg-filters) using the image `className` attribute. + + + + + + + + + + +## API Reference + + diff --git a/sites/skeleton.dev/src/content/docs/components/avatar/svelte.mdx b/sites/skeleton.dev/src/content/docs/components/avatar/svelte.mdx new file mode 100644 index 0000000000..dee332004d --- /dev/null +++ b/sites/skeleton.dev/src/content/docs/components/avatar/svelte.mdx @@ -0,0 +1,53 @@ +--- +layout: '@layouts/LayoutDoc.astro' +--- + +export const components = componentSet; + +import Default from '@examples/components/avatar/svelte/default.svelte'; +import DefaultRaw from '@examples/components/avatar/svelte/default.svelte?raw'; + +import Fallback from '@examples/components/avatar/svelte/fallback.svelte'; +import FallbackRaw from '@examples/components/avatar/svelte/fallback.svelte?raw'; + +import Filter from '@examples/components/avatar/svelte/filter.svelte'; +import FilterRaw from '@examples/components/avatar/svelte/filter.svelte?raw'; + + + + + + + + + + +## Fallback + +Use `` to provide initials, icons, or a framework-specific image component. + + + + + + + + + + +## Filter + +Avatars can implement [SVG Filters](/docs/guides/cookbook/svg-filters) using the image `class` attribute. + + + + + + + + + + +## API Reference + + diff --git a/sites/skeleton.dev/src/content/docs/components/combobox/meta.mdx b/sites/skeleton.dev/src/content/docs/components/combobox/meta.mdx new file mode 100644 index 0000000000..f2f1c5d36d --- /dev/null +++ b/sites/skeleton.dev/src/content/docs/components/combobox/meta.mdx @@ -0,0 +1,8 @@ +--- +title: Combobox +description: A combobox is an input widget with an associated popup that enables users to select a value from a collection of possible values. +srcSvelte: '/src/components/combobox' +srcReact: '/src/components/combobox' +srcZag: 'https://zagjs.com/components/react/combobox' +showDocsUrl: true +--- diff --git a/sites/skeleton.dev/src/content/docs/components/combobox/react.mdx b/sites/skeleton.dev/src/content/docs/components/combobox/react.mdx new file mode 100644 index 0000000000..118b091793 --- /dev/null +++ b/sites/skeleton.dev/src/content/docs/components/combobox/react.mdx @@ -0,0 +1,119 @@ +--- +layout: '@layouts/LayoutDoc.astro' +--- + +export const components = componentSet; + +import Default from '@examples/components/combobox/react/default'; +import DefaultRaw from '@examples/components/combobox/react/default?raw'; + +import Group from '@examples/components/combobox/react/group'; +import GroupRaw from '@examples/components/combobox/react/group?raw'; + +import AutoHighlight from '@examples/components/combobox/react/auto-highlight'; +import AutoHighlightRaw from '@examples/components/combobox/react/auto-highlight?raw'; + +import Multiple from '@examples/components/combobox/react/multiple'; +import MultipleRaw from '@examples/components/combobox/react/multiple?raw'; + +import DisabledItem from '@examples/components/combobox/react/disabled-item'; +import DisabledItemRaw from '@examples/components/combobox/react/disabled-item?raw'; + +import CustomFilter from '@examples/components/combobox/react/custom-filter'; +import CustomFilterRaw from '@examples/components/combobox/react/custom-filter?raw'; + +import ZIndex from '@examples/components/combobox/react/z-index'; +import ZIndexRaw from '@examples/components/combobox/react/z-index?raw'; + + + + + + + + + + +## Groups + +Create labelled groups for your items. + + + + + + + + + + +## Auto Highlight + +Search for any option, then tap Enter on your keyboard to automatically select it. + + + + + + + + + + +## Multiple + +To maintain filtering functionality and improve clarity for users, we recommend displaying the selected values outside of the Combobox component. + + + + + + + + + + +## Disabled Item + + + + + + + + + + +## Custom Filter + +Try mistyping `apple` or `banana` to see the custom filter using the fuzzy search from [Fuse.js](https://fusejs.io/) in action. + + + + + + + + + + +## Z-Index + +By default we do not take an opinionated stance regarding z-index stacking. The result is the component can sometimes be occluded beneath other elements with a higher index. The Z-Index can controlled by applying a utility class to the Positioner component part. + + + + + + + + + + +## Items Max + +Note that we do not recommend this interface for excessive amounts of items. For normal usage, a few dozen is likely best. Going above 500 items may cause performance issues. + +## API Reference + + diff --git a/sites/skeleton.dev/src/content/docs/components/combobox/svelte.mdx b/sites/skeleton.dev/src/content/docs/components/combobox/svelte.mdx new file mode 100644 index 0000000000..b3f19f1d4e --- /dev/null +++ b/sites/skeleton.dev/src/content/docs/components/combobox/svelte.mdx @@ -0,0 +1,119 @@ +--- +layout: '@layouts/LayoutDoc.astro' +--- + +export const components = componentSet; + +import Default from '@examples/components/combobox/svelte/default.svelte'; +import DefaultRaw from '@examples/components/combobox/svelte/default.svelte?raw'; + +import Group from '@examples/components/combobox/svelte/group.svelte'; +import GroupRaw from '@examples/components/combobox/svelte/group.svelte?raw'; + +import AutoHighlight from '@examples/components/combobox/svelte/auto-highlight.svelte'; +import AutoHighlightRaw from '@examples/components/combobox/svelte/auto-highlight.svelte?raw'; + +import Multiple from '@examples/components/combobox/svelte/multiple.svelte'; +import MultipleRaw from '@examples/components/combobox/svelte/multiple.svelte?raw'; + +import DisabledItem from '@examples/components/combobox/svelte/disabled-item.svelte'; +import DisabledItemRaw from '@examples/components/combobox/svelte/disabled-item.svelte?raw'; + +import CustomFilter from '@examples/components/combobox/svelte/custom-filter.svelte'; +import CustomFilterRaw from '@examples/components/combobox/svelte/custom-filter.svelte?raw'; + +import ZIndex from '@examples/components/combobox/svelte/z-index.svelte'; +import ZIndexRaw from '@examples/components/combobox/svelte/z-index.svelte?raw'; + + + + + + + + + + +## Groups + +Create labelled groups for your items. + + + + + + + + + + +## Auto Highlight + +Search for any option, then tap Enter on your keyboard to automatically select it. + + + + + + + + + + +## Multiple + +To maintain filtering functionality and improve clarity for users, we recommend displaying the selected values outside of the Combobox component. + + + + + + + + + + +## Disabled Item + + + + + + + + + + +## Custom Filter + +Try mistyping `apple` or `banana` to see the custom filter using the fuzzy search from [Fuse.js](https://fusejs.io/) in action. + + + + + + + + + + +## Z-Index + +By default we do not take an opinionated stance regarding z-index stacking. The result is the component can sometimes be occluded beneath other elements with a higher index. The Z-Index can controlled by applying a utility class to the Positioner component part. + + + + + + + + + + +## Items Max + +Note that we do not recommend this interface for excessive amounts of items. For normal usage, a few dozen is likely best. Going above 500 items may cause performance issues. + +## API Reference + + diff --git a/sites/skeleton.dev/src/content/docs/components/dialog/meta.mdx b/sites/skeleton.dev/src/content/docs/components/dialog/meta.mdx new file mode 100644 index 0000000000..d5a749524e --- /dev/null +++ b/sites/skeleton.dev/src/content/docs/components/dialog/meta.mdx @@ -0,0 +1,9 @@ +--- +title: Dialog +layout: '@layouts/LayoutDoc.astro' +description: A modal dialog for displaying content and actions. +srcSvelte: '/src/components/dialog' +srcReact: '/src/components/dialog' +srcZag: 'https://zagjs.com/components/react/dialog' +showDocsUrl: true +--- diff --git a/sites/skeleton.dev/src/content/docs/components/dialog/react.mdx b/sites/skeleton.dev/src/content/docs/components/dialog/react.mdx new file mode 100644 index 0000000000..67b5403d42 --- /dev/null +++ b/sites/skeleton.dev/src/content/docs/components/dialog/react.mdx @@ -0,0 +1,108 @@ +--- +layout: '@layouts/LayoutDoc.astro' +--- + +export const components = componentSet; + +import Default from '@examples/components/dialog/react/default'; +import DefaultRaw from '@examples/components/dialog/react/default?raw'; + +import AlertDialog from '@examples/components/dialog/react/alert-dialog'; +import AlertDialogRaw from '@examples/components/dialog/react/alert-dialog?raw'; + +import Interaction from '@examples/components/dialog/react/interaction'; +import InteractionRaw from '@examples/components/dialog/react/interaction?raw'; + +import Drawer from '@examples/components/dialog/react/drawer'; +import DrawerRaw from '@examples/components/dialog/react/drawer?raw'; + +import ZIndex from '@examples/components/dialog/react/z-index'; +import ZIndexRaw from '@examples/components/dialog/react/z-index?raw'; + +import Headless from '@examples/components/dialog/react/headless'; +import HeadlessRaw from '@examples/components/dialog/react/headless?raw'; + + + + + + + + + + +## Alert Dialog + +The [alertdialog](https://w3c.github.io/aria/#alertdialog) role enables assistive technologies and browsers to distinguish alert dialogs from other dialogs so they have the option of giving alert dialogs special treatment, such as playing a system alert sound. + + + + + + + + + + +## Interaction + +If desired, you can disable click to close interactions for the backdrop. We recommend using this sparingly, as this traps the +user in this experience. + + + + + + + + + + +## Drawer + +This example repurposes the Dialog for use as a side-panel Drawer. It also introduces basic transition animations. + + + + + + + + + + +## Z-Index + +By default we do not take an opinionated stance regarding z-index stacking. The result is the component can sometimes be occluded beneath other elements with a higher index. The Z-Index can controlled by applying a utility class to the `Positioner` component part. + + + + + + + + + + +## Headless + +Unlike most components in Skeleton, this is provided "headless". This means no default styles are applied out of the box. This ensures you retain full control of all styling. + + + + + + + + + + +The benefits are as follows: + +- You can make the `Trigger` surround any element, including an icon, button, image, etc. +- You can modify the entire structure within `Content`, including custom markup and styling. +- You may place the `CloseTrigger` anywhere, and use it as an X close option. + +## API Reference + + diff --git a/sites/skeleton.dev/src/content/docs/components/dialog/svelte.mdx b/sites/skeleton.dev/src/content/docs/components/dialog/svelte.mdx new file mode 100644 index 0000000000..3e0e24dcd6 --- /dev/null +++ b/sites/skeleton.dev/src/content/docs/components/dialog/svelte.mdx @@ -0,0 +1,108 @@ +--- +layout: '@layouts/LayoutDoc.astro' +--- + +export const components = componentSet; + +import Default from '@examples/components/dialog/svelte/default.svelte'; +import DefaultRaw from '@examples/components/dialog/svelte/default.svelte?raw'; + +import AlertDialog from '@examples/components/dialog/svelte/alert-dialog.svelte'; +import AlertDialogRaw from '@examples/components/dialog/svelte/alert-dialog.svelte?raw'; + +import Interaction from '@examples/components/dialog/svelte/interaction.svelte'; +import InteractionRaw from '@examples/components/dialog/svelte/interaction.svelte?raw'; + +import Drawer from '@examples/components/dialog/svelte/drawer.svelte'; +import DrawerRaw from '@examples/components/dialog/svelte/drawer.svelte?raw'; + +import ZIndex from '@examples/components/dialog/svelte/z-index.svelte'; +import ZIndexRaw from '@examples/components/dialog/svelte/z-index.svelte?raw'; + +import Headless from '@examples/components/dialog/svelte/headless.svelte'; +import HeadlessRaw from '@examples/components/dialog/svelte/headless.svelte?raw'; + + + + + + + + + + +## Alert Dialog + +The [alertdialog](https://w3c.github.io/aria/#alertdialog) role enables assistive technologies and browsers to distinguish alert dialogs from other dialogs so they have the option of giving alert dialogs special treatment, such as playing a system alert sound. + + + + + + + + + + +## Interaction + +If desired, you can disable click to close interactions for the backdrop. We recommend using this sparingly, as this traps the +user in this experience. + + + + + + + + + + +## Drawer + +This example repurposes the Dialog for use as a side-panel Drawer. It also introduces basic transition animations. + + + + + + + + + + +## Z-Index + +By default we do not take an opinionated stance regarding z-index stacking. The result is the component can sometimes be occluded beneath other elements with a higher index. The Z-Index can controlled by applying a utility class to the `Positioner` component part. + + + + + + + + + + +## Headless + +Unlike most components in Skeleton, this is provided "headless". This means no default styles are applied out of the box. This ensures you retain full control of all styling. + + + + + + + + + + +The benefits are as follows: + +- You can make the `Trigger` surround any element, including an icon, button, image, etc. +- You can modify the entire structure within `Content`, including custom markup and styling. +- You may place the `CloseTrigger` anywhere, and use it as an X close option. + +## API Reference + + diff --git a/sites/skeleton.dev/src/content/docs/components/file-upload/meta.mdx b/sites/skeleton.dev/src/content/docs/components/file-upload/meta.mdx new file mode 100644 index 0000000000..0292457695 --- /dev/null +++ b/sites/skeleton.dev/src/content/docs/components/file-upload/meta.mdx @@ -0,0 +1,8 @@ +--- +title: File Upload +layout: '@layouts/LayoutDoc.astro' +description: A component for uploading files with drag-and-drop and browse support. +srcSvelte: '/src/components/file-upload' +srcReact: '/src/components/file-upload' +showDocsUrl: true +--- diff --git a/sites/skeleton.dev/src/content/docs/components/file-upload/react.mdx b/sites/skeleton.dev/src/content/docs/components/file-upload/react.mdx new file mode 100644 index 0000000000..52da39434c --- /dev/null +++ b/sites/skeleton.dev/src/content/docs/components/file-upload/react.mdx @@ -0,0 +1,81 @@ +--- +layout: '@layouts/LayoutDoc.astro' +--- + +export const components = componentSet; + +import Default from '@examples/components/file-upload/react/default'; +import DefaultRaw from '@examples/components/file-upload/react/default?raw'; + +import CustomContent from '@examples/components/file-upload/react/custom-content'; +import CustomContentRaw from '@examples/components/file-upload/react/custom-content?raw'; + +import Disabled from '@examples/components/file-upload/react/disabled'; +import DisabledRaw from '@examples/components/file-upload/react/disabled?raw'; + +import Button from '@examples/components/file-upload/react/button'; +import ButtonRaw from '@examples/components/file-upload/react/button?raw'; + +import ClearFiles from '@examples/components/file-upload/react/clear-files'; +import ClearFilesRaw from '@examples/components/file-upload/react/clear-files?raw'; + + + + + + + + + + +## Custom Content + + + + + + + + + + +## Disabled + + + + + + + + + + +## Button + + + + + + ``` + + + ### Set Active Theme + Open `/src/layouts/Layout.astro`, then set the `data-theme` attribute on the HTML tag to define the active theme. + ```html title="layouts/Layout.astro" "data-theme="cerberus"" + ... + ``` + + + ### Run the Project + Start the dev server using the following command. + ```console + npm run dev + ``` + + + + +## Using Components in Astro + +While Astro can support [multiple Frontend frameworks](https://docs.astro.build/en/guides/integrations-guide/), please be aware this comes with some notable restrictions: + +- With the exception of this [experimental React flag](https://docs.astro.build/en/guides/integrations-guide/react/#children-parsing), components cannot utilize slotted content in `.astro` files. +- You will need to install additional packages for both Astro and Skeleton per your framework of choice. +- You may need a _wrapper_ component to use to utilize all component feature. We'll demo this below. + + + + ### Astro Framework Packages + Install only the Astro framework(s) packages you intend to use. + ```console + npx astro add react + ``` + https://docs.astro.build/en/guides/integrations-guide/react/ + ```console + npx astro add svelte + ``` + https://docs.astro.build/en/guides/integrations-guide/svelte/ + + + ### Skeleton Framework Packages + Install only the Skeleton framework(s) packages you intend to use. + ```console + @skeletonlabs/skeleton-react + ``` + ```console + @skeletonlabs/skeleton-svelte + ``` + + + ### Add Style Imports + + Import the stylesheets for the framework(s) you intend to use in your global stylesheet created above. + ```css title="global.css" + @import '@skeletonlabs/skeleton-react'; + @import '@skeletonlabs/skeleton-svelte'; + ``` + + + ### Using Wrapper Components + In most cases, frontend framework components may not be fully functional if used directly within `.astro` files. To overcome this, you may utilize a wrapper component of that framework. Here's a demo using the Skeleton Avatar component as an example. + #### React + ```tsx title="ReactAvatarWrapper.tsx" + import React from 'react'; + import { Avatar } from '@skeletonlabs/skeleton-react'; + + export const ReactAvatarWrapper: React.FC = () => { + const imgSrc = '...'; + return ; + }; + ``` + ```astro title="page.astro" + --- + import { ReactAvatarWrapper } from '@components/ReactAvatarWrapper'; + --- + + + ``` + #### Svelte + ```svelte title="SvelteAvatarWrapper.svelte" + + + + ``` + ```astro title="page.astro" + --- + import { SvelteAvatarWrapper } from '@components/SvelteAvatarWrapper'; + --- + + + ``` + + + ### Run the Project + Start the dev server using the following command. + ```console + npm run dev + ``` + + + diff --git a/sites/skeleton.dev/src/content/docs/get-started/installation/nextjs.mdx b/sites/skeleton.dev/src/content/docs/get-started/installation/nextjs.mdx new file mode 100644 index 0000000000..5954c627a8 --- /dev/null +++ b/sites/skeleton.dev/src/content/docs/get-started/installation/nextjs.mdx @@ -0,0 +1,67 @@ +--- +layout: '@layouts/LayoutDoc.astro' +title: Next.js +description: Install and configure Skeleton for Next.js. +order: 0 +--- + +export const components = componentSet; + +import Process from '@components/docs/Process.astro'; +import ProcessStep from '@components/docs/ProcessStep.astro'; + +{/* --- */} + +## Requirements + +| Tooling | Minimum Supported | +| ------------------------------------ | ----------------- | +| [Next.js](https://nextjs.org/) | 15 | +| [React](https://react.dev/) | 18 | +| [Tailwind](https://tailwindcss.com/) | 4 | + +## Installation + + + + ### Create a Project + Use the [Next.js CLI](https://nextjs.org/docs/app/getting-started/installation) to scaffold a new project. + ```console + npm create next-app@latest my-skeleton-app + cd my-skeleton-app + ``` + + + ### Install Skeleton + Install the Skeleton core and React component packages. + ```console + npm i -D @skeletonlabs/skeleton @skeletonlabs/skeleton-react + ``` + + + ### Configure Tailwind + Open your global stylesheet in `/src/app/globals.css` and add the following imports: + ```css title="globals.css" {3-7} + @import 'tailwindcss'; + + @import '@skeletonlabs/skeleton'; + @import '@skeletonlabs/skeleton-react'; + @import '@skeletonlabs/skeleton/themes/cerberus'; + ``` + + + ### Set Active Theme + Open `/src/app/layout.tsx`, then set the `data-theme` attribute on the HTML tag to define the active theme. + ```html title="layout.tsx" "data-theme="cerberus"" + ... + ``` + + + ### Done + Start the dev server using the following command. + ```console + npm run dev + ``` + + + diff --git a/sites/skeleton.dev/src/content/docs/get-started/installation/other.mdx b/sites/skeleton.dev/src/content/docs/get-started/installation/other.mdx new file mode 100644 index 0000000000..246a6983ec --- /dev/null +++ b/sites/skeleton.dev/src/content/docs/get-started/installation/other.mdx @@ -0,0 +1,72 @@ +--- +layout: '@layouts/LayoutDoc.astro' +title: Other Frameworks +description: Install Skeleton for other frameworks. +order: 1000 +--- + +export const components = componentSet; + +import Process from '@components/docs/Process.astro'; +import ProcessStep from '@components/docs/ProcessStep.astro'; + +{/* --- */} + +## Requirements + +Skeleton's [Core Package](/docs/get-started/core-api) is framework agnostic, meaning many of the Design System and Tailwind-centric features can used on any number of frameworks. This includes everything _except_ components. In order to install Skeleton for additional framework, your app must be able to support the following: + +| Tooling | Minimum Supported | +| ------------------------------------ | --------------------- | +| Package Management | NPM, PNPM, Yarn, etc. | +| [Tailwind](https://tailwindcss.com/) | 4 | + +The exact instructions for installing Skeleton will differ per framework, however we've provided a general guidance below. Use this as a foundation for getting started in any number of unofficially supported frameworks. + +## Installation + + + + ### Create a Project + Scaffold your web-based application using any framework (such as [Nuxt](https://nuxt.com/), [SolidStart](https://start.solidjs.com/), [Laravel](https://laravel.com/), etc.) + + + ### Install Tailwind + Refer to the [official instructions](https://tailwindcss.com/docs/installation/framework-guides) for installing Tailwind on your framework of choice. + + + ### Install Skeleton + Install the Skeleton core package to gain access to most features - excluding Components. + ```console + npm i -D @skeletonlabs/skeleton + ``` + + + ### Configure Tailwind + Locate your global stylesheet and append the following at the top of the file. + ```css {3-5} + @import 'tailwindcss'; + + @import '@skeletonlabs/skeleton'; + @import '@skeletonlabs/skeleton/themes/cerberus'; + ``` + + + ### Set Active Theme + Open the file containing the `` tag for your project and set the `data-theme` attribute as follows. + ```html "data-theme="cerberus"" + + ... + + ``` + + + ### Run the Project + Start the dev server for your framework of choice. + + + + +## Support + +While we officially limit support for Skeleton to React, Svelte, and Astro for now, Skeleton has an active community of users on [GitHub](https://github.com/skeletonlabs/skeleton/discussions) and [Discord](https://discord.gg/EXqV7W8MtY). If you need support (directly related to Skeleton) considering reaching out in these spaces. Other members of the community may be able to assist you. diff --git a/sites/skeleton.dev/src/content/docs/get-started/installation/sveltekit.mdx b/sites/skeleton.dev/src/content/docs/get-started/installation/sveltekit.mdx new file mode 100644 index 0000000000..f3430d7bb0 --- /dev/null +++ b/sites/skeleton.dev/src/content/docs/get-started/installation/sveltekit.mdx @@ -0,0 +1,68 @@ +--- +layout: '@layouts/LayoutDoc.astro' +title: SvelteKit +description: Install and configure Skeleton for SvelteKit. +order: 10 +--- + +export const components = componentSet; + +import Process from '@components/docs/Process.astro'; +import ProcessStep from '@components/docs/ProcessStep.astro'; + +{/* --- */} + +## Requirements + +| Tooling | Minimum Supported | +| ------------------------------------ | ----------------- | +| [SvelteKit](https://svelte.dev/) | 2 | +| [Svelte](https://svelte.dev/) | 5 | +| [Tailwind](https://tailwindcss.com/) | 4 | + +## Installation + + + + ### Create a Project + Use the [Svelte CLI](https://svelte.dev/docs/kit/creating-a-project) to generate a new SvelteKit project. + ```console + npx sv create --types ts my-skeleton-app + cd my-skeleton-app + ``` + > NOTE: If you did not select the options to add Tailwind, use `npx sv add tailwindcss` to add it retroactively. + + + ### Install Skeleton + Install the Skeleton core and Svelte component packages. + ```console + npm i -D @skeletonlabs/skeleton @skeletonlabs/skeleton-svelte + ``` + + + ### Configure Tailwind + Open your global stylesheet in `/src/app.css` and add the following imports: + ```css title="app.css" {3-7} + @import 'tailwindcss'; + + @import '@skeletonlabs/skeleton'; + @import '@skeletonlabs/skeleton-svelte'; + @import '@skeletonlabs/skeleton/themes/cerberus'; + ``` + + + ### Set Active Theme + Open `/src/app.html`, then set the `data-theme` attribute on the HTML tag to define the active theme. + ```html title="app.html" "data-theme="cerberus"" + ... + ``` + + + ### Done + Start the dev server using the following command. + ```console + npm run dev + ``` + + + diff --git a/sites/skeleton.dev/src/content/docs/get-started/installation/vite-react.mdx b/sites/skeleton.dev/src/content/docs/get-started/installation/vite-react.mdx new file mode 100644 index 0000000000..77ca362b06 --- /dev/null +++ b/sites/skeleton.dev/src/content/docs/get-started/installation/vite-react.mdx @@ -0,0 +1,92 @@ +--- +layout: '@layouts/LayoutDoc.astro' +title: Vite + React +description: Install and configure Skeleton for Vite + React. +order: 20 +--- + +export const components = componentSet; + +import Process from '@components/docs/Process.astro'; +import ProcessStep from '@components/docs/ProcessStep.astro'; + +{/* --- */} + +## Requirements + +| Tooling | Minimum Supported | +| ------------------------------------ | ----------------- | +| [Vite](https://vite.dev/) | 6 | +| [React](https://react.dev/) | 18 | +| [Tailwind](https://tailwindcss.com/) | 4 | + +## Installation + + + + ### Create a Project + Start by creating a new [Vite](https://vite.dev/guide/#scaffolding-your-first-vite-project) project. This will install React and Typescript. + ```console + npm create vite@latest + - Set your project named as desired + - Set React as the framework + - Set Typescript as the variant + cd {yourProjectName} + npm install + ``` + + + ### Install Skeleton + Install the Skeleton core and React component packages. + ```console + npm i -D @skeletonlabs/skeleton @skeletonlabs/skeleton-react + ``` + + + ### Install Tailwind + Install Tailwind and and the Tailwind Vite plugin. + ```console + npm install tailwindcss @tailwindcss/vite + ``` + Implement the plugin in `vite.config` in the root of your project. + ```ts title="vite.config" {3} "tailwindcss()" + import { defineConfig } from "vite"; + import react from "@vitejs/plugin-react"; + import tailwindcss from "@tailwindcss/vite"; + + export default defineConfig({ + plugins: [ + tailwindcss(), + react() // <-- Must come after Tailwind + ], + }); + ``` + + + ### Configure Tailwind + Open your global styleshset in `/src/index.css` and append the following at the top of the file. + ```css title="index.css" + @import 'tailwindcss'; + + @import '@skeletonlabs/skeleton'; + @import '@skeletonlabs/skeleton-react'; + @import '@skeletonlabs/skeleton/themes/cerberus'; + ``` + + + ### Set the Active Theme + Open `index.html`, then set the `data-theme` attribute on the HTML tag to define the active theme. + + ```html title="index.html" "data-theme="cerberus"" + ... + ``` + + + ### Done + Start the dev server using the following command. + ```console + npm run dev + ``` + + + diff --git a/sites/skeleton.dev/src/content/docs/get-started/installation/vite-svelte.mdx b/sites/skeleton.dev/src/content/docs/get-started/installation/vite-svelte.mdx new file mode 100644 index 0000000000..744a020523 --- /dev/null +++ b/sites/skeleton.dev/src/content/docs/get-started/installation/vite-svelte.mdx @@ -0,0 +1,91 @@ +--- +layout: '@layouts/LayoutDoc.astro' +title: Vite + Svelte +description: Install and configure Skeleton for Vite + Svelte. +order: 30 +--- + +export const components = componentSet; + +import Process from '@components/docs/Process.astro'; +import ProcessStep from '@components/docs/ProcessStep.astro'; + +{/* --- */} + +## Requirements + +| Tooling | Minimum Supported | +| ------------------------------------ | ----------------- | +| [Vite](https://vite.dev/) | 6 | +| [Svelte](https://svelte.dev/) | 5 | +| [Tailwind](https://tailwindcss.com/) | 4 | + +## Installation + + + + ### Create a Project + Start by creating a new [Vite](https://vite.dev/guide/#scaffolding-your-first-vite-project) project. This will install Svelte and Typescript. + ```console + npm create vite@latest + - Set your project named as desired + - Set Svelte as the framework + - Set Typescript as the variant + cd {yourProjectName} + npm install + ``` + + + ### Install Skeleton + Install the Skeleton core and Svelte component packages. + ```console + npm i -D @skeletonlabs/skeleton @skeletonlabs/skeleton-svelte + ``` + + + ### Install Tailwind + Install Tailwind and and the Tailwind Vite plugin. + ```console + npm install tailwindcss @tailwindcss/vite + ``` + Implement the plugin in `vite.config` in the root of your project. + ```ts title="vite.config" {3} "tailwindcss()" + import { defineConfig } from "vite"; + import svelte from "@vitejs/plugin-svelte"; + import tailwindcss from "@tailwindcss/vite"; + + export default defineConfig({ + plugins: [ + tailwindcss(), + svelte() // <-- Must come after Tailwind + ], + }); + ``` + + + ### Configure Tailwind + Open your global styleshset in `/src/app.css` and append the following at the top of the file. + ```css title="app.css" + @import 'tailwindcss'; + + @import '@skeletonlabs/skeleton'; + @import '@skeletonlabs/skeleton-svelte'; + @import '@skeletonlabs/skeleton/themes/cerberus'; + ``` + + + ### Set the Active Theme + Open `index.html`, then set the `data-theme` attribute on the HTML tag to define the active theme. + ```html title="index.html" "data-theme="cerberus"" + ... + ``` + + + ### Done + Start the dev server using the following command. + ```console + npm run dev + ``` + + + diff --git a/sites/skeleton.dev/src/content/docs/get-started/introduction.mdx b/sites/skeleton.dev/src/content/docs/get-started/introduction.mdx new file mode 100644 index 0000000000..b520dfca16 --- /dev/null +++ b/sites/skeleton.dev/src/content/docs/get-started/introduction.mdx @@ -0,0 +1,141 @@ +--- +layout: '@layouts/LayoutDoc.astro' +title: Introduction +description: Skeleton integrates with Tailwind to provide an opinionated solution for generating adaptive design systems. Including easy to use components for your favorite web frameworks. +order: 0 +--- + +export const components = componentSet; + + + +## Alternatives + +If you need finer grain control, consider Skeleton's integration guides for [Floating UI](https://floating-ui.com/). + +- [React Popovers](/docs/integrations/popover/react) - powered by Floating UI React. +- [Svelte Popovers](/docs/integrations/popover/svelte) - powered by Floating UI Svelte. diff --git a/sites/skeleton.dev/src/content/docs/guides/cookbook/dynamic-theming.mdx b/sites/skeleton.dev/src/content/docs/guides/cookbook/dynamic-theming.mdx new file mode 100644 index 0000000000..ad9204a5b3 --- /dev/null +++ b/sites/skeleton.dev/src/content/docs/guides/cookbook/dynamic-theming.mdx @@ -0,0 +1,185 @@ +--- +layout: '@layouts/LayoutDoc.astro' +title: Dynamic Theme Loading +description: Load skeleton themes on demand. +showDocsUrl: true +pubDate: 2025-01-18 +tags: ['theme', 'guides'] +--- + +export const components = componentSet; + +## About Themes + +The most common way to load skeleton themes is by importing them in your root stylesheet. + + + + ```css title="app/globals.css" + @import 'tailwindcss'; + + @import '@skeletonlabs/skeleton'; + @import '@skeletonlabs/skeleton/themes/cerberus'; + @import '@skeletonlabs/skeleton/themes/catppuccin'; + ``` + + + ```css title="src/app.css" + @import 'tailwindcss'; + + @import '@skeletonlabs/skeleton'; + @import '@skeletonlabs/skeleton/themes/cerberus'; + @import '@skeletonlabs/skeleton/themes/catppuccin'; + ``` + + + + +This will bundle your themes when you build your application, for that reason you should only import the themes you need because they will increase your CSS bundle size. + +While this is sufficient for most applications this might not be flexible enough for your needs, you may want themes to be +user specific, editable, organization specific and so on, since skeleton themes are just CSS variables there are many ways +you can load themes on demand, read further to see how. + +## Creating Stylesheets on layout load + +This approach assumes the CSS variables of the skeleton theme you want is available during the load function (eg: on your database or in memory). + +In this example we will add a default theme that that can be used as a fallback. + + + + ```css title="app/globals.css" + @import 'tailwindcss'; + + @import '@skeletonlabs/skeleton'; + @import './default.css'; + ``` + + + ```css title="src/app.css" + @import 'tailwindcss'; + + @import '@skeletonlabs/skeleton'; + @import './default.css'; + ``` + + + + + + + ```css title="app/default.css" + [data-theme='default'] { + /* ... */ + } + ``` + + + ```css title="src/default.css" + [data-theme='default'] { + /* ... */ + } + ``` + + + + + + + To load your themes we will utilize the [NextJS `getServerSideProps` function](https://nextjs.org/docs/pages/building-your-application/data-fetching/get-server-side-props) function in combination with [Head component](https://nextjs.org/docs/pages/api-reference/components/head): + + ```tsx title="app/layout.tsx" + import Head from 'next/head'; + import type { InferGetServerSidePropsType, GetServerSideProps } from 'next'; + + const getThemes = async () => { + return [ + { + name: 'theme-1', + css: `[data-theme='theme-1'] { /* ... */ }` + }, + { + name: 'theme-2', + css: `[data-theme='theme-2'] { /* ... */ }` + } + ]; + }; + + export const getServerSideProps = (async () => { + const themes = getThemes(); + return { + props: { + themes: ['default', ...themes.map((t) => t.name)], + css: themes.map((theme) => theme.css).join('\n\n') + } + }; + }) satisfies GetServerSideProps<{ repo: Repo }>; + + export default function Page({ repo }: InferGetServerSidePropsType) { + return ( + <> + + `} + + ``` + + + + + +> ⚠️ _Important_ make sure you sanitize the CSS before inserting it or you'll be vulnerable to CSS injection. + +After doing so you should be able to toggle themes on demand by changing the `data-theme` attribute on the `html` tag. + +Note that there are multiple ways to go about this problem, another way could be to generate CSS files with +the same content as the one in this example and then load only the css files you want, while this +is more complex than storing and retrieving themes as JSON on a database this approach could benefit +from the browser caching mechanism. diff --git a/sites/skeleton.dev/src/content/docs/guides/cookbook/floating-ui-attachments.mdx b/sites/skeleton.dev/src/content/docs/guides/cookbook/floating-ui-attachments.mdx new file mode 100644 index 0000000000..52881223bd --- /dev/null +++ b/sites/skeleton.dev/src/content/docs/guides/cookbook/floating-ui-attachments.mdx @@ -0,0 +1,120 @@ +--- +layout: '@layouts/LayoutDoc.astro' +title: Floating UI Attachments +description: A Svelte-focused guide around integrating Floating UI and Svelte attachments. +showDocsUrl: true +pubDate: 2025-08-13 +tags: ['integration', 'popovers', 'svelte'] +--- + +export const components = componentSet; + +import ExampleAttachment from '@examples/guides/cookbook/floating-ui-attachments/ExampleAttachment.txt?raw'; +import ExamplePopover from '@examples/guides/cookbook/floating-ui-attachments/ExamplePopover.txt?raw'; +import ExampleTooltip from '@examples/guides/cookbook/floating-ui-attachments/ExampleTooltip.txt?raw'; + +Please note that this is a Svelte-only guide based around the [attachments](https://svelte.dev/docs/svelte/svelte-attachments) feature introduced in Svelte `v5.29`. + +### Summary + +The following will guide you through integrating [Floating UI](https://floating-ui.com/) in Svelte and generating a baseline [attachment](https://svelte.dev/docs/svelte/svelte-attachments) that can be used to scaffold any number of custom popover interfaces, including but not limited to: popovers, tooltips, dialogs, drawers, combobox, context menus, and more. + +### Accessibility Warning + +This guide is not a drop-in replacement for Skeleton's [Svelte Popovers](/docs/integrations/popover/svelte) as it does not replicate all recommended accessbility features out of the box (such as ARIA attributes, focus states, keyboard interactions, etc). These features are out of scope of this guide. It will be your responsibility to handle these features before using this in a production environment. + +### Target Audience + +This guide is intended for advanced Svelte users that wish to integrate directly with Floating UI, build custom floating interfaces, and go beyond the scope of Skeleton's [Svelte Popovers](/docs/integrations/popover/svelte). This can be used to generate interfaces not covered by Skeleton's Popover components. + +## Installing Floating UI + +To begin, install the standard version of Floating UI. + +```console +npm install @floating-ui/dom +``` + +If this is your first time using Floating UI, we recommend following the [guided tutorial](https://floating-ui.com/docs/tutorial) to learn the basics. + +## Creating a Svelte Attachment + +Next, let's generate our custom attachment. If you're working with SvelteKit, we recommend adding this to `/src/lib/attachments/floating.svelte.ts`. + + + +This attachment will handle the following critical functionality: + +1. This imports the Svelte attachment and Floating UI dependencies. +2. Scaffolds a simple `PopoverOptions` interface, which defines our configuraton options. +3. Implement the `Popover` class, which handles all the business logic for creating and using the attachment. +4. And of course sets the default configuration via `options`. + +We'll cover each additional method below. + +### reference() + +When implemented, this is spread to the **Trigger** element and handles interaction such as `click` and `hover`. + +### floating() + +When implemented, this is spread to the **Popover** element itself. This uses [createAttachmentKey](https://svelte.dev/docs/svelte/svelte-attachments#createAttachmentKey) to generate the attachment relationship itself. + +### isOpen() + +Returns the current `open` state as a boolean value. We'll use this to show and hide the popover on demand. + +### #updatePosition() + +This scaffolds [computePosition](https://floating-ui.com/docs/computePosition), which handles most of Floating UI's functionality. + +## Making the Tooltip Float + +Floating UI [requires these CSS styles](https://floating-ui.com/docs/tutorial#making-the-tooltip-float) to ensure the popover element "floats" over other UI. For this guide we'll handle this with a convention by adding the following your to global stylesheet. For SvelteKit this is located in `/src/app.css`. + +```css +[data-floating] { + width: max-content; + position: absolute; + top: 0; + left: 0; +} +``` + +## Usage + +### Popover + +Add the following to any page within your application to generate a basic popover. + + + +1. First, import the Popover attachment and generate an instance using `new Popover()`. +2. Next, create a wrapping `` to ensure your popover is not affected by the flow of the document. +3. Add your trigger button and spread the `popover.reference()` +4. Add your popover element and spread the `popover.floating()` +5. Apply `data-floating` to the popover element. +6. Wrap the popover element with `#if popover.isOpen()` to show/hide the popover. + +> TIP: you can optionally import a [Svelte transition](https://svelte.dev/docs/svelte/svelte-transition), such as `slide`. Then use this to trigger animations on the open/close state for the popover. + +### Tooltip + +Add the following to any page within your application to generate a basic tooltip. + + + +1. Similar to the Popover - we import, initialize, and scaffold the common attachment requirements. +2. Unlike the Popover though, we configure `new Popover({ ... })` to adjust `interaction` and `placement` settings. +3. We can also use a different transition, such as `fade`, as shown above. + +## Handling Accessibility + +We recommend you follow the [Aria APG patterns](https://www.w3.org/WAI/ARIA/apg/patterns/) when generating popover interfaces for production use. We've linked a few of the common patterns below to help you get started. This covers `aria` and `role` attributes, keyboard interactions, and other best practices. + +- [Alert and Message Dialogs Pattern](https://www.w3.org/WAI/ARIA/apg/patterns/alertdialog/) +- [Alert Pattern](https://www.w3.org/WAI/ARIA/apg/patterns/alert/) +- [Combobox Pattern](https://www.w3.org/WAI/ARIA/apg/patterns/combobox/) +- [Dialog (Modal) Pattern](https://www.w3.org/WAI/ARIA/apg/patterns/dialog-modal/) +- [Menu and Menubar Pattern](https://www.w3.org/WAI/ARIA/apg/patterns/menubar/) +- [Tooltip](https://www.w3.org/WAI/ARIA/apg/patterns/tooltip/) diff --git a/sites/skeleton.dev/src/content/docs/guides/cookbook/image-layouts.mdx b/sites/skeleton.dev/src/content/docs/guides/cookbook/image-layouts.mdx new file mode 100644 index 0000000000..64b75e4f8c --- /dev/null +++ b/sites/skeleton.dev/src/content/docs/guides/cookbook/image-layouts.mdx @@ -0,0 +1,67 @@ +--- +layout: '@layouts/LayoutDoc.astro' +title: Image Layouts +description: Layouts for displaying sets of images. +showDocsUrl: true +pubDate: 2024-11-18 +tags: ['blocks', 'layouts', 'images'] +--- + +export const components = componentSet; + +import ExampleFeatured from '@examples/guides/cookbook/image-layouts/ExampleFeatured.astro'; +import ExampleFeaturedRaw from '@examples/guides/cookbook/image-layouts/ExampleFeatured.astro?raw'; +import ExampleGrid from '@examples/guides/cookbook/image-layouts/ExampleGrid.astro'; +import ExampleGridRaw from '@examples/guides/cookbook/image-layouts/ExampleGrid.astro?raw'; +import ExampleMasonry from '@examples/guides/cookbook/image-layouts/ExampleMasonry.astro'; +import ExampleMasonryRaw from '@examples/guides/cookbook/image-layouts/ExampleMasonry.astro?raw'; +import ExampleQuad from '@examples/guides/cookbook/image-layouts/ExampleQuad.astro'; +import ExampleQuadRaw from '@examples/guides/cookbook/image-layouts/ExampleQuad.astro?raw'; + +## Grid + + + + + + + + + + +## Quad + + + + + + + + + + +## Masonry + + + + + + + + + + +## Featured + + + + + + + + + + +## Attribution + +Images courtesy of [Lorem Picsum](https://picsum.photos/). Markup and styles inspired by [Flowbite](https://flowbite.com/docs/components/gallery/#masonry-grid). diff --git a/sites/skeleton.dev/src/content/docs/guides/cookbook/light-switch.mdx b/sites/skeleton.dev/src/content/docs/guides/cookbook/light-switch.mdx new file mode 100644 index 0000000000..7c1c3e5a7b --- /dev/null +++ b/sites/skeleton.dev/src/content/docs/guides/cookbook/light-switch.mdx @@ -0,0 +1,67 @@ +--- +layout: '@layouts/LayoutDoc.astro' +title: Light Switch +description: Learn how to create a Light Switch toggle. +showDocsUrl: true +pubDate: 2025-03-18 +tags: ['theme', 'mode', 'guides'] +--- + +export const components = componentSet; + +import Process from '@components/docs/Process.astro'; +import ProcessStep from '@components/docs/ProcessStep.astro'; + +import ExampleSvelteRaw from '@examples/guides/cookbook/light-switch/Example.svelte?raw'; +import ExampleReactRaw from '@examples/guides/cookbook/light-switch/Example.tsx?raw'; + +Use [Dark Mode](/docs/guides/mode) to make use of either a base or `dark:` variant for your utility class styles. By default, Tailwind uses the `prefers-color-scheme` media query to determine and match the user's operating system settings. However, if you wish to provide your users manual control, you'll need to adjust the Dark Mode strategy for Tailwind, as well as provide the toggle interface (aka a light switch). This guide will show you how to fulfill both requirements. + +{/* prettier-ignore */} + + + ## Adjust the Dark Mode Strategy + Open your global stylesheet and set the following variant: + ```css + @custom-variant dark (&:where([data-mode="dark"], [data-mode="dark"] *)); + ``` + Then set the following data attribute on your application's `` element for light mode: + ```html + + ``` + Or for dark mode: + ```html + + ``` + + + ## Create the Component + We'll create a implementation of the Switch component that can toggle the mode on demand. + + + + + + + + + + + ## Import the Component + We'll then add the component to our app. Make sure to set the correct path and file extension. + ```ts + import Lightswitch from './path/to/Lightswitch.{tsx|svelte}'; + ``` + ```svelte + + ``` + + + +## User Interface + +While we utilize a primitive Switch for the minimal example above, feel free to adjust the logic and interface to your preference. We provide a more detailed Switch example for [React](/docs/components/switch/react#light-switch) and [Svelte](/docs/components/switch/svelte#light-switch) respectively. + +## Next.js Users + +For Next.js users, you will need to [suppressHydrationWarning](https://nextjs.org/docs/messages/react-hydration-error#solution-3-using-suppresshydrationwarning) to `true` on the root `` element. This will suppress hydration warnings. diff --git a/sites/skeleton.dev/src/content/docs/guides/cookbook/logo-clouds.mdx b/sites/skeleton.dev/src/content/docs/guides/cookbook/logo-clouds.mdx new file mode 100644 index 0000000000..44467c83f0 --- /dev/null +++ b/sites/skeleton.dev/src/content/docs/guides/cookbook/logo-clouds.mdx @@ -0,0 +1,35 @@ +--- +layout: '@layouts/LayoutDoc.astro' +title: Logo Clouds +description: Provides a grid for presenting a set of logos, brands, or sponsors. +showDocsUrl: true +pubDate: 2024-11-18 +tags: ['blocks', 'branding'] +--- + +export const components = componentSet; + +import Example from '@examples/guides/cookbook/logo-clouds/Example.astro'; +import ExampleRaw from '@examples/guides/cookbook/logo-clouds/Example.astro?raw'; +import ExampleRows from '@examples/guides/cookbook/logo-clouds/ExampleRows.astro'; +import ExampleRowsRaw from '@examples/guides/cookbook/logo-clouds/ExampleRows.astro?raw'; + + + + + + + + + + +## Rows + + + + + + + + + diff --git a/sites/skeleton.dev/src/content/docs/guides/cookbook/scroll-containers.mdx b/sites/skeleton.dev/src/content/docs/guides/cookbook/scroll-containers.mdx new file mode 100644 index 0000000000..af1a8c6c4c --- /dev/null +++ b/sites/skeleton.dev/src/content/docs/guides/cookbook/scroll-containers.mdx @@ -0,0 +1,71 @@ +--- +layout: '@layouts/LayoutDoc.astro' +title: Scroll Containers +description: Create scrolling containers using the scroll snap features from Tailwind. +showDocsUrl: true +pubDate: 2024-11-19 +tags: ['blocks', 'images'] +--- + +export const components = componentSet; + +import Example from '@examples/guides/cookbook/scroll-containers/Example.astro'; +import ExampleRaw from '@examples/guides/cookbook/scroll-containers/Example.astro?raw'; +import ExampleCarousel from '@examples/guides/cookbook/scroll-containers/ExampleCarousel.astro'; +import ExampleCarouselRaw from '@examples/guides/cookbook/scroll-containers/ExampleCarousel.astro?raw'; +import ExampleMultiColumn from '@examples/guides/cookbook/scroll-containers/ExampleMultiColumn.astro'; +import ExampleMultiColumnRaw from '@examples/guides/cookbook/scroll-containers/ExampleMultiColumn.astro?raw'; + +## Scroll Snap + +Implements Tailwind's [Scroll Snap Alignment](https://tailwindcss.com/docs/scroll-snap-align) utility classes. + + + + + + + + + + +## Carousels + +Using Scroll Containers, we can create a fully functional carousel, complete with thumbnail selection. + + + + + + + + + + +## Multi-Column + +Using Scroll Containers, we can scroll sets of items. + + + + + + + + + + +> Images courtesy of [The Movie Database](https://www.themoviedb.org/) + +## API Reference + +Learn more about Tailwind's utility classes for scroll behavior and scroll snap. + +| Feature | Description | +| ------------------------------------------------------------------- | ------------------------------------------------------------------- | +| [scroll-behavior](https://tailwindcss.com/docs/scroll-behavior) | Controls the scroll behavior of an element. | +| [scroll-margin](https://tailwindcss.com/docs/scroll-margin) | Controls the scroll offset around items in a snap container. | +| [scroll-padding](https://tailwindcss.com/docs/scroll-padding) | Controls an element's scroll offset within a snap container. | +| [scroll-snap-align](https://tailwindcss.com/docs/scroll-snap-align) | Controls the scroll snap alignment of an element. | +| [scroll-snap-stop](https://tailwindcss.com/docs/scroll-snap-stop) | Controls whether you can skip past possible snap positions. | +| [scroll-snap-type](https://tailwindcss.com/docs/scroll-snap-type) | Controls how strictly snap points are enforced in a snap container. | diff --git a/sites/skeleton.dev/src/content/docs/guides/cookbook/stepper.mdx b/sites/skeleton.dev/src/content/docs/guides/cookbook/stepper.mdx new file mode 100644 index 0000000000..30ad822723 --- /dev/null +++ b/sites/skeleton.dev/src/content/docs/guides/cookbook/stepper.mdx @@ -0,0 +1,47 @@ +--- +layout: '@layouts/LayoutDoc.astro' +title: Stepper +description: Divide and present content in sequenced steps. +showDocsUrl: true +pubDate: 2024-11-19 +tags: ['blocks', 'navigation', 'ux'] +--- + +export const components = componentSet; + +import Example from '@examples/guides/cookbook/stepper/Example.svelte'; +import ExampleRaw from '@examples/guides/cookbook/stepper/Example.svelte?raw'; +import ExampleComponent from '@examples/guides/cookbook/stepper/ExampleComponent.svelte'; +import ExampleComponentRaw from '@examples/guides/cookbook/stepper/ExampleComponent.svelte?raw'; +import ExampleStepOne from '@examples/guides/cookbook/stepper/ExampleStepOne.svelte?raw'; + + + + + + + + + + + + + +## Using Components + +Optionally, you can substitute primitive data for components and props. + + + + + + + + + +
+ + +
+
+
diff --git a/sites/skeleton.dev/src/content/docs/guides/cookbook/svg-filters.mdx b/sites/skeleton.dev/src/content/docs/guides/cookbook/svg-filters.mdx new file mode 100644 index 0000000000..d033ac8ede --- /dev/null +++ b/sites/skeleton.dev/src/content/docs/guides/cookbook/svg-filters.mdx @@ -0,0 +1,73 @@ +--- +layout: '@layouts/LayoutDoc.astro' +title: SVG Filters +description: Apply filter effects to elements and images. +showDocsUrl: true +pubDate: 2024-11-19 +tags: ['native', 'effects'] +--- + +export const components = componentSet; + +import Example from '@examples/guides/cookbook/svg-filters/Example.astro'; + +import ApolloRaw from '@examples/guides/cookbook/svg-filters/filters/Apollo.astro?raw'; +import BlueNightRaw from '@examples/guides/cookbook/svg-filters/filters/BlueNight.astro?raw'; +import EmeraldRaw from '@examples/guides/cookbook/svg-filters/filters/Emerald.astro?raw'; +import GreenFallRaw from '@examples/guides/cookbook/svg-filters/filters/GreenFall.astro?raw'; +import NoirRaw from '@examples/guides/cookbook/svg-filters/filters/Noir.astro?raw'; +import NoirLightRaw from '@examples/guides/cookbook/svg-filters/filters/NoirLight.astro?raw'; +import RusticRaw from '@examples/guides/cookbook/svg-filters/filters/Rustic.astro?raw'; +import SummerRaw from '@examples/guides/cookbook/svg-filters/filters/Summer.astro?raw'; +import XProRaw from '@examples/guides/cookbook/svg-filters/filters/XPro.astro?raw'; + +## How It Works + +This feature is enabled by [SVG filters](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/filter) paired with [feColorMatrix](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/feColorMatrix) transformations. + +## Usage + +Apply a filter to any element using the Filter style property and passing the unique SVG Filter ID. + +```astro + + + + + + + +... +``` + +We've provided a curated collection of SVG Filters to choose from below. + + + + + + +
+ + + + + + + + +
+
+
+ +## Create a Filter + +We recommend [SVG Color Matrix Mixer](https://fecolormatrix.com/) by [Rik Schennink](https://x.com/rikschennink/) to create your own filters. + +## Tips + +- The SVG must be in the same scope as the elements you wish to filter. Global scope is acceptable. +- Consder storing your SVGs within your local project for quick and reusable imports. +- All Vite-based frameworks support [SVG imports](https://vite.dev/guide/assets.html#importing-asset-as-url). +- Optionally you can embed the SVG within a imported component (ex: `Apollo.svelte`, `Apollo.tsx`). +- Filter SVGs are affected by the flow DOM, including class styles such as `space-{x|y}`. diff --git a/sites/skeleton.dev/src/content/docs/guides/cookbook/table-of-contents.mdx b/sites/skeleton.dev/src/content/docs/guides/cookbook/table-of-contents.mdx new file mode 100644 index 0000000000..09c21f295a --- /dev/null +++ b/sites/skeleton.dev/src/content/docs/guides/cookbook/table-of-contents.mdx @@ -0,0 +1,84 @@ +--- +layout: '@layouts/LayoutDoc.astro' +title: Table of Contents +description: Navigate the hierarchy of headings for the current page. +showDocsUrl: true +pubDate: 2024-11-19 +tags: ['blocks', 'navigation', 'guides'] +--- + +export const components = componentSet; + +import Example from '@examples/guides/cookbook/table-of-contents/Example.astro'; +import ExampleRaw from '@examples/guides/cookbook/table-of-contents/Example.astro?raw'; + + + + + + + + + + +## Deep Linking + +Browsers allow you to deep link to any element via the ID. This is accomplished with an anchor tag and hashed (`#`) href value. When interacting with these anchors, the viewport will automatically attempt to scroll the `` element and bring the element into view. + +```html +

+ Some Example Heading +

+ +``` + +```html +Some Example Heading +``` + +> TIP: If you abstract scrolling away from the `` element, this will not work. + +## Scroll Behavior + +You may optionally choose to implement a smooth [scroll behavior](https://developer.mozilla.org/en-US/docs/Web/CSS/scroll-behavior) using CSS. + +```html + +``` + +```css +body { + scroll-behavior: smooth; +} +``` + +## Generate a Slug + +The following provides a barebones implementation for generating a slug based on a heading text value. + +```ts +function generateSlug(text: string, prefix?: string = '', suffix?: string = '') { + // Format the slug from the text value. + const slug = text + .toLowerCase() + .replaceAll(/[^a-zA-Z0-9 ]/g, '') + .replaceAll(' ', '-') + .toLowerCase(); + // Note that you can optionally apply a prefix/suffix. + return `${prefix}${slug}${suffix}`; +} + +// Usage +generateSlug('An Example Header'); // result: an-example-header +generateSlug('An Example Header', 'skeleton-'); // result: skeleton-an-example-header +generateSlug('An Example Header', '', '-skeleton'); // result: an-example-header-skeleton +``` + +## Guides + +Specific instructions for generating headings will differ based on your meta-framework and your application architecture. Below are a few suggestions, but this is neither a definitive or exhaustive list of all available options. + +- [Astro](https://kld.dev/building-table-of-contents/) - enables you to automatically generate headings using built-in MDX features. +- [Svelte](https://www.melt-ui.com/docs/builders/table-of-contents) - Melt UI provides a headless component solution for Svelte. +- [Next.js](https://nextra.site/docs/docs-theme/theme-configuration#toc-sidebar) - Nextra provides a headless component solution for Next.js + MDX. +- [Rehype Plugin](https://github.com/stefanprobst/rehype-extract-toc) - a general purpose Rehype plugin for generating a table of contents. diff --git a/sites/skeleton.dev/src/content/docs/guides/figma.mdx b/sites/skeleton.dev/src/content/docs/guides/figma.mdx new file mode 100644 index 0000000000..bae28dd008 --- /dev/null +++ b/sites/skeleton.dev/src/content/docs/guides/figma.mdx @@ -0,0 +1,45 @@ +--- +layout: '@layouts/LayoutDoc.astro' +title: Figma UI kit +description: Welcome to the Skeleton Figma Design System Tutorials! +order: 60 +--- + +export const components = componentSet; + +import FigmaBuyNow from '@components/docs/FigmaBuyNow.astro'; +import NavGrid from '@components/docs/NavGrid.astro'; + +import ImgComponents from '@images/get-started/figma/components.webp'; +import ImgHero from '@images/get-started/figma/hero.webp'; +import ImgPlugin from '@images/get-started/figma/plugin.webp'; +import ImgTutorial from '@images/get-started/figma/tutorials.webp'; +import ImgKit from '@images/get-started/figma/ui-kit.webp'; +import { Image } from 'astro:assets'; +import { Clock3 } from 'lucide-react'; +import { Shapes } from 'lucide-react'; +import { SwatchBook } from 'lucide-react'; + +{ + +

+ Explore step-by-step guides to unlock the full potential of Skeleton in your design workflow. Whether you're setting up for the first time + or mastering advanced features, these tutorials will guide you every step of the way. +

+} + +## Get Access + +Review the benefits of the Figma UI Kit for Skeleton. + +
+ + Get the Figma UI Kit → + +
+ +## Guides + +Follow along with our step-by-step guides. + + diff --git a/sites/skeleton.dev/src/content/docs/guides/figma/chapter-1.mdx b/sites/skeleton.dev/src/content/docs/guides/figma/chapter-1.mdx new file mode 100644 index 0000000000..0a9102abea --- /dev/null +++ b/sites/skeleton.dev/src/content/docs/guides/figma/chapter-1.mdx @@ -0,0 +1,117 @@ +--- +layout: '@layouts/LayoutDoc.astro' +title: 1 - Setup & Usage +description: Get Started with Skeleton. +order: 0 +--- + +export const components = componentSet; + +import NavGrid from '@components/docs/NavGrid.astro'; +import Process from '@components/docs/Process.astro'; +import ProcessStep from '@components/docs/ProcessStep.astro'; + +import ImgCreateNewProject from '@images/tutorials/figma/chapter-1/01_createNewProject.webp'; +import ImgImportProject from '@images/tutorials/figma/chapter-1/02_importProject.webp'; +import ImgPublish from '@images/tutorials/figma/chapter-1/03_publish.webp'; +import ImgCreateNewFile from '@images/tutorials/figma/chapter-1/04_createNewFile.webp'; +import ImgSelectLibrary from '@images/tutorials/figma/chapter-1/05_selectLibrary.webp'; +import ImgUseLibrary from '@images/tutorials/figma/chapter-1/06_useLibrary.webp'; +import SvgSkeleton from '@images/tutorials/figma/skeletonFileIcon.svg'; +import { BookOpen } from '@lucide/svelte'; +import { Image } from 'astro:assets'; + +

+ For best results, a{' '} + + Figma Professional Team Plan + {' '} + (or higher) is recommended. +

+ +## How to Install the Figma Library + + + + ### Purchase the Figma Asset + +
+
+ Skeleton +
+
Skeleton Figma Design System
+

Complete set of themed components for Skeleton v3

+
+
+ Purchase +
+
+ + + ### Create a New Project + + In Figma, go to `Home`¹ and select `All projects`² from the left sidebar². On the right side, click `+ Project`³ and name the project `Libraries`⁴. + + Create New Project + + + + ### Import Skeleton Design System + + From the project page, click `Create new` in the top-right corner⁵ and select `Import`⁶. Then, choose `Import from computer`⁷ and select the Skeleton Figma file. + + Import Project + + + + ### Publish Skeleton Figma Library + + To use the library across all Figma files, it must be published. + + Double-click the Skeleton Library to open it. At the top left, next to the library file name, click the chevron `v`⁸ and select `Publish library…`⁹. In the modal, click `Publish`¹⁰ and wait for the library to finish publishing. + + Publish + + Once published, you can access the Skeleton Figma Library in any of your projects. + + +
+ +--- + +## How to Use the Figma Library + + + + ### Open or Create a Project to Use the Library + + Open an existing project, or create a new one by clicking `+ Create new`¹ and selecting `Design file`². + + Create New File + + + + ### Add the Library to Your Project + + In the left sidebar, click `Assets`³, then click the ⁴ icon. A modal will appear with the `Libraries` tab active. Search for `skeleton`⁵ and click `Add to file`⁶. + + The library is now added to your file, and its assets are ready for use. + + Select Library + + + + ### Use Assets (Components) + + You can now access the Skeleton Design library. In the `Assets` tab, you’ll see a list of Skeleton Components. Drag components onto the canvas or search for specific ones. + + Use Library + + + + +--- + +## Guides + + diff --git a/sites/skeleton.dev/src/content/docs/guides/figma/chapter-2.mdx b/sites/skeleton.dev/src/content/docs/guides/figma/chapter-2.mdx new file mode 100644 index 0000000000..ecb30e5db0 --- /dev/null +++ b/sites/skeleton.dev/src/content/docs/guides/figma/chapter-2.mdx @@ -0,0 +1,158 @@ +--- +layout: '@layouts/LayoutDoc.astro' +title: 2 - Import Themes +description: Customize Your Design with Skeleton Themes +order: 10 +--- + +export const components = componentSet; + +import NavGrid from '@components/docs/NavGrid.astro'; +import Process from '@components/docs/Process.astro'; +import ProcessStep from '@components/docs/ProcessStep.astro'; + +import ImgOpenProject from '@images/tutorials/figma/chapter-2/01_openProject.webp'; +import ImgOpenSkeleton from '@images/tutorials/figma/chapter-2/01_openSkeleton.webp'; +import ImgOpenThemePlugin from '@images/tutorials/figma/chapter-2/02_openThemePlugin.webp'; +import ImgSetStage from '@images/tutorials/figma/chapter-2/02_setStage.webp'; +import ImgAddNewTheme from '@images/tutorials/figma/chapter-2/03_addNewTheme.webp'; +import ImgSwitchTheme from '@images/tutorials/figma/chapter-2/03_switchTheme.webp'; +import ImgSwitchThemeResult from '@images/tutorials/figma/chapter-2/03_switchThemeResult.webp'; +import ImgSelectTheme from '@images/tutorials/figma/chapter-2/04_selectTheme.webp'; +import ImgSwitchColorScheme from '@images/tutorials/figma/chapter-2/04_switchColorScheme.webp'; +import ImgSwitchColorSchemeResult from '@images/tutorials/figma/chapter-2/04_switchColorSchemeResult.webp'; +import ImgCopyTheme from '@images/tutorials/figma/chapter-2/05_copyTheme.webp'; +import ImgPasteTheme from '@images/tutorials/figma/chapter-2/06_pasteTheme.webp'; +import ImgPublish from '@images/tutorials/figma/chapter-2/07_publish.webp'; +import ImgPublishUpdates from '@images/tutorials/figma/chapter-2/07_publishUpdates.webp'; +import SvgSkeleton from '@images/tutorials/figma/skeletonFileIcon.svg'; +import { Image } from 'astro:assets'; + +## Prerequisites + +- [Chapter 1: Set-up Skeleton Figma Library](chapter-1) + +--- + +## Import Custom Theme + + + + ### Open Skeleton v3 Figma Library + + Create New Project + + + + ### Open Skeleton themes plugin + + Click on the `Actions`¹ button in the toolbar, search for `Skeleton Themes`², and click on the `Skeleton Themes`³ plugin when it appears. + > **Important:** The plugin is compatible only with the Skeleton v3 Figma Library. + + Create New Project + + + + ### Add new theme + + The library includes a default theme, `Cerberus`. To add your theme, click `Add theme`⁴. + + Import Project + + + + ### Select theme + + Copy your theme code by visiting the [Skeleton theme creator](https://themes.skeleton.dev/themes/create). Click `Import`⁵, then select a theme⁶, or compose your own. + + Publish + + + + ### Copy theme + + Open the `Code` tab in the right panel⁷ and copy the theme code⁸. + + Create New File + + + + ### Paste theme + + Return to the `Skeleton Themes` plugin in Figma, paste the theme code⁹, and click `Upload`¹⁰. + + > **Note:** Uploading the theme may take 3–5 minutes, depending on your device. + + Select Library + + + + ### Publish updates + + After uploading, publish the library to make the new theme accessible. In the left panel, click the `Book` icon¹¹, then click the `Publish...` button¹². When the modal appears, click `Publish` again¹³. + + > **Note:** Publishing may take 5–7 minutes. + + Use Library + Use Library + + + + +--- + +## Apply Custom Theme in Project + +### Prerequisites + +- Completed [Chapter 1: Set-up Skeleton Figma Library](chapter-1#how-to-install-the-figma-library) +- Completed [Chapter 2: Import Custom Theme](#import-custom-theme) + + + + ### Open Project + + Open the project where the `Skeleton Figma Library` is applied. + + Use Library + + + + ### Set the stage + + Add `page examples` components on the canvas to preview your theme. + + Use Library + + + + ### Switch theme + + In the `Pages` section⁴ on the right panel, click `Apply variable mode`, hover over `Theme`, and select your imported theme⁵. + + Use Library + + Voilà! Your theme is now applied to the components. + + Use Library + + + + ### Switch modes + + Skeleton themes include `light` and `dark` modes by default. Switch modes the same way you switch themes: in the `Pages` section⁶, click `Apply variable mode`, hover over `Color Scheme`, and select the scheme⁷. + + Use Library + + Your components are now in the `Dark` `Color Scheme`. + + Use Library + + + + +--- + +## Guides + + diff --git a/sites/skeleton.dev/src/content/docs/guides/figma/chapter-3.mdx b/sites/skeleton.dev/src/content/docs/guides/figma/chapter-3.mdx new file mode 100644 index 0000000000..b29d981d09 --- /dev/null +++ b/sites/skeleton.dev/src/content/docs/guides/figma/chapter-3.mdx @@ -0,0 +1,89 @@ +--- +layout: '@layouts/LayoutDoc.astro' +title: 3 - Update Figma library +description: Keep Your Skeleton Library Up to Date +order: 20 +--- + +export const components = componentSet; + +import NavGrid from '@components/docs/NavGrid.astro'; +import Process from '@components/docs/Process.astro'; +import ProcessStep from '@components/docs/ProcessStep.astro'; + +import ImgImport from '@images/tutorials/figma/chapter-3/02_import.webp'; +import ImgPublishLib from '@images/tutorials/figma/chapter-3/03_publishLibrary.webp'; +import ImgOpenFile from '@images/tutorials/figma/chapter-3/04_openFile.webp'; +import ImgSelectNewSkeleton from '@images/tutorials/figma/chapter-3/04_selectNewSkeleton.webp'; +import ImgSelectSkeleton from '@images/tutorials/figma/chapter-3/04_selectSkeleton.webp'; +import ImgRemoveOld from '@images/tutorials/figma/chapter-3/removeOld.webp'; +import SvgSkeleton from '@images/tutorials/figma/skeletonFileIcon.svg'; +import { ChevronDown, BookOpen } from '@lucide/svelte'; +import { Image } from 'astro:assets'; + +

+ Skeleton is continually evolving, and to ensure that your design remains in harmony with it, it's essential to keep the Skeleton Figma UI + library up to date. +

+ +## How to update the library + + + + ### Download the latest version of the Skeleton Figma UI library + + Download + + + + ### Import the new version to your Figma library + + From the project page, click `Create new`² in the top-right corner and select `Import`³. Then, choose `Import from computer`⁴ and select the Skeleton Figma file. + Import + + + + ### Publish new version + + Double-click the new version of Skeleton v3 Figma UI Library to open it. + +

At the top left, next to the library file name, click the ⁵ icon and select `Publish library…` ⁶. In the modal, click `Publish` ⁷ and wait for the library to finish publishing.

+ Publish library +
+ + + ### Swap libraries + + Open the project that uses the old version of Skeleton v3 Figma UI library. Open the `Assets`⁸ tab and click on the ⁹ icon to open the `Manage libraries`¹⁰ popup. + + In the `Libraries added to this file` section, select the old version of the Skeleton v3 Figma UI library¹¹. + Publish library + +

Click the `Swap Library`¹² button in the bottom right corner of the popup.

+ Publish library + +

In the top right corner of the popup, click `Choose library`¹³, select the latest Skeleton v3 Figma UI library¹⁴, and then click `Swap library`¹⁵.

+ Publish library + +

Your library will be updated, and all components using the Skeleton Figma library will refresh automatically.

+
+ +
+ +--- + +### Remove previous version + +After updating the Skeleton Figma library, please remove previous versions. Keeping multiple versions can create multiple copies of the same components, leading to design inconsistencies. + +Open the project that utilizes the old version of Skeleton v3 Figma UI library. Open `Assets`¹ tab and click on ² icon to open `Manage libraries` popup. + +In the `Libraries added to this file` section, click the `Remove`³ button next to the old version of the Skeleton v3 Figma UI library. + +Publish library + +--- + +## Guides + + diff --git a/sites/skeleton.dev/src/content/docs/guides/layouts.mdx b/sites/skeleton.dev/src/content/docs/guides/layouts.mdx new file mode 100644 index 0000000000..40a1c40888 --- /dev/null +++ b/sites/skeleton.dev/src/content/docs/guides/layouts.mdx @@ -0,0 +1,212 @@ +--- +layout: '@layouts/LayoutDoc.astro' +title: Layouts +description: Learn best practices for creating responsive layouts using semantic HTML and Tailwind. +order: 50 +--- + +export const components = componentSet; + +import ExampleColOne from '@examples/guides/cookbook/layouts/ExampleColOne.astro'; +import ExampleColOneRaw from '@examples/guides/cookbook/layouts/ExampleColOne.astro?raw'; +import ExampleColThree from '@examples/guides/cookbook/layouts/ExampleColThree.astro'; +import ExampleColThreeRaw from '@examples/guides/cookbook/layouts/ExampleColThree.astro?raw'; +import ExampleColTwo from '@examples/guides/cookbook/layouts/ExampleColTwo.astro'; +import ExampleColTwoRaw from '@examples/guides/cookbook/layouts/ExampleColTwo.astro?raw'; +import ExampleStickyHeader from '@examples/guides/cookbook/layouts/ExampleStickyHeader.astro'; +import ExampleStickyHeaderRaw from '@examples/guides/cookbook/layouts/ExampleStickyHeader.astro?raw'; + +

+ Skeleton supports a variety of web-based frameworks and meta-frameworks, and this guide serves as a universal reference when implementing + page layouts. These techniques utilize native HTML and Tailwind, meaning Skeleton is supported but not required. The only prerequisite is + Tailwind itself. +

+ +## Real World Example + +See our real world three column example, which implements many of the concepts introduced below. + +
+ + View Real World Example + +
+ +## Semantic Markup + +When creating custom layouts, it's recommended to use semantic HTML to denote each region of the page. + +| Element | Description | Source | +| ----------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------ | +| `
` | Represents introductory content, typically a group of introductory or navigational aids. It may contain some heading elements but also a logo, a search form, an author name, and other elements. | [MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/header) | +| `
` | Represents the dominant content within the document ``. The main content area consists of content that is directly related to or expands upon the central topic of a document, or the central functionality of an application. | [MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/main) | +| `