diff --git a/.gitignore b/.gitignore index 0145db0..55fe337 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,7 @@ node_modules docs/.vitepress/dist docs/.vitepress/cache docs/public/examples/ +docs/public/examples-stimulus/ +docs/public/examples-vue/ +docs/public/examples-react/ +examples/docs/ diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index a317796..4e54331 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -43,10 +43,13 @@ export default defineConfig({ { icon: 'twitter', link: 'https://twitter.com/winduum_dev' } ], - algolia: { - appId: '3DLECEENW2', - apiKey: '31331a8def9abe0356f5338d568ca974', - indexName: 'winduum' + search: { + provider: 'algolia', + options: { + appId: '3DLECEENW2', + apiKey: '31331a8def9abe0356f5338d568ca974', + indexName: 'winduum' + }, }, footer: { @@ -67,20 +70,58 @@ export default defineConfig({ }, { text: 'Changelog', - link: 'https://github.com/winduum/winduum/blob/main/CHANGELOG.md' + link: 'https://github.com/winduum/winduum/blob/next/CHANGELOG.md' + } + ] + }, + { + items: [ + { + text: 'Webuum', + link: 'https://webuum.dev' }, { - text: 'v1', - link: 'https://v1--winduum.netlify.app/' + text: 'Vituum', + link: 'https://vituum.dev' } ] } ] - } + }, + { + text: 'v3 (next)', + items: [ + { + text: 'v2', + link: 'https://v2--winduum.netlify.app/' + }, + { + text: 'v1', + link: 'https://v1--winduum.netlify.app/' + } + ] + }, ], sidebar: { '/docs/': [ + { + text: 'v3 Announcement', + link: '/blog/' + }, + { + text: 'Migrations', + items: [ + { + text: 'winduum v3', + link: '/migrations/winduum-v3' + }, + { + text: 'winduum-elements v3', + link: '/migrations/winduum-elements-v3' + }, + ], + }, { text: 'Get started', items: [ @@ -104,13 +145,13 @@ export default defineConfig({ text: 'Grid', link: '/docs/grid' }, - { - text: 'Layers', - link: '/docs/layers' - }, { text: 'Tokens', link: '/docs/tokens' + }, + { + text: 'Polyfills', + link: '/docs/polyfills' } ] }, @@ -144,7 +185,7 @@ export default defineConfig({ { text: 'Transitions', link: '/docs/base/transitions' - } + }, ] }, { @@ -227,8 +268,8 @@ export default defineConfig({ link: '/docs/components/label' }, { - text: 'Link', - link: '/docs/components/link' + text: 'Marquee', + link: '/docs/components/marquee' }, { text: 'Notice', @@ -288,7 +329,6 @@ export default defineConfig({ } ] }, - { text: 'Utilities', items: [ @@ -300,10 +340,6 @@ export default defineConfig({ text: 'Animation', link: '/docs/utilities/animation' }, - { - text: 'Container', - link: '/docs/utilities/container' - }, { text: 'Divide Gap', link: '/docs/utilities/divide-gap' @@ -316,6 +352,22 @@ export default defineConfig({ text: 'Dot', link: '/docs/utilities/dot' }, + { + text: 'Grid', + link: '/docs/utilities/grid' + }, + { + text: 'Link', + link: '/docs/utilities/link' + }, + { + text: 'Position', + link: '/docs/utilities/position' + }, + { + text: 'Ripple', + link: '/docs/utilities/ripple' + }, { text: 'Skeleton', link: '/docs/utilities/skeleton' @@ -328,15 +380,36 @@ export default defineConfig({ text: 'Swap', link: '/docs/utilities/swap' }, - { - text: 'Ripple', - link: '/docs/utilities/ripple' - }, { text: 'Underline', link: '/docs/utilities/underline' + }, + { + text: 'View Transition', + link: '/docs/utilities/view-transition' } ] + }, + { + text: "Variants", + items: [ + { + text: 'Dark', + link: '/docs/variants/dark' + }, + { + text: 'Hocus', + link: '/docs/variants/hocus' + }, + { + text: 'Interest', + link: '/docs/variants/interest' + }, + { + text: 'Scroll State', + link: '/docs/variants/scroll-state' + }, + ] } ] } diff --git a/docs/.vitepress/theme/components/LinkGh.vue b/docs/.vitepress/theme/components/LinkGh.vue index d040a70..2479c77 100644 --- a/docs/.vitepress/theme/components/LinkGh.vue +++ b/docs/.vitepress/theme/components/LinkGh.vue @@ -4,5 +4,5 @@ diff --git a/docs/.vitepress/theme/components/ViewSourceGh.vue b/docs/.vitepress/theme/components/ViewSourceGh.vue index 0ecbadd..3c3ab74 100644 --- a/docs/.vitepress/theme/components/ViewSourceGh.vue +++ b/docs/.vitepress/theme/components/ViewSourceGh.vue @@ -3,5 +3,5 @@ diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts index 74ebe16..ee2f909 100644 --- a/docs/.vitepress/theme/index.ts +++ b/docs/.vitepress/theme/index.ts @@ -1,8 +1,4 @@ import Theme from 'vitepress/theme' -import { showRipple } from 'winduum/src/utilities/ripple' -import { showToast, closeToast } from 'winduum/src/components/toast' -import { closeToaster } from 'winduum/src/components/toaster' -import { showDrawer, closeDrawer, scrollDrawer, scrollInitDrawer } from "winduum/src/components/drawer" import './styles/vars.css' import 'winduum/dist/main.css' import 'winduum/dist/tailwind.css' @@ -11,7 +7,6 @@ import LinkGh from './components/LinkGh.vue' import ViewSourceGh from './components/ViewSourceGh.vue' import HomeSponsors from './components/HomeSponsors.vue' import UsageInfo from './components/UsageInfo.vue' -import { showDialog, closeDialog } from "winduum/src/components/dialog"; function updateDarkIframes() { if (typeof document !== 'undefined') { @@ -23,135 +18,68 @@ function updateDarkIframes() { } } -function dialogEvent() { - if (typeof document !== 'undefined') { - // @ts-ignore - document.querySelector('#showDialog')?.addEventListener('click', async () => { - showDialog(window.dialogExample) - }) - - window.dialogExample?.querySelector('form')?.addEventListener('submit', (e) => { - e.preventDefault() - closeDialog(window.dialogExample) - }) - - document.querySelector('#showRipple')?.addEventListener('click', (event) => { - showRipple(event) - }) - - document.querySelector('#closeToaster')?.addEventListener(`click`, async () => { - await closeToaster(document.querySelector('.c-toaster')) - }) - - document.querySelector('#showToast:not(.has-events)')?.addEventListener('click', () => { - - if (!document.querySelector('.x-toaster')) { - document.body.insertAdjacentHTML('beforeend', `
    `) - } - - document.querySelector('.x-toaster')?.insertAdjacentHTML('beforeend', ` -
  1. -
    -
    -
    Hello toast
    -
    Amazing toast
    -
    - -
    -
  2. - `) - - showToast(document.querySelector('.x-toaster').children[document.querySelector('.x-toaster').children.length - 1]) - - const closeToastButton = document.querySelectorAll('[data-action="closeToast"]')[document.querySelectorAll('[data-action="closeToast"]').length - 1] - - closeToastButton.addEventListener('click', ({ currentTarget }) => { - closeToast(currentTarget.closest('.x-toast')) - }) - }) - - document.querySelector('#showToast')?.classList.add('has-events') - - if (!document.querySelector('.vp-doc').classList.contains('has-events')) { - document.querySelector('.vp-doc').classList.add('has-events') - - - window.drawerLeftElement?.addEventListener('scroll', ({ target }) => scrollDrawer(target)) - - window.showDrawerLeftElement?.addEventListener('click', async () => { - window.drawerLeftElement.showModal() - - await scrollInitDrawer(window.drawerLeftElement) - - showDrawer(window.drawerLeftElement) - }) - - window.closeDrawerLeftElement?.addEventListener('click', () => closeDrawer(window.drawerLeftElement, window.drawerLeftElement.scrollWidth)) - - - - - window.drawerRightElement?.addEventListener('scroll', ({ target }) => scrollDrawer(target, { - opacityRatio: 0, - scrollOpen: target.scrollWidth - target.clientWidth, - scrollClose: 0 - })) - - window.showDrawerRightElement?.addEventListener('click', async () => { - window.drawerRightElement.showModal() - - await scrollInitDrawer(window.drawerRightElement, 0) +async function initPolyfills() { + // @ts-ignore + if (!('command' in HTMLButtonElement.prototype)) { + const { apply } = await import('invokers-polyfill/fn') + apply() + } +} - showDrawer(window.drawerRightElement, drawerRightElement.scrollWidth) - }) +async function exampleEvents() { + if (typeof document === 'undefined') return - window.closeDrawerRightElement?.addEventListener('click', () => closeDrawer(window.drawerRightElement, 0)) + // dialog side-effect script — closedby fallback + --default-scrollbar-width + await import('winduum/src/components/dialog') + const { showRipple } = await import('winduum/src/utilities/ripple') + const { showToast, closeToast } = await import('winduum/src/components/toast') + const { closeToaster, toasterObserver } = await import('winduum/src/components/toaster') + // @ts-ignore + document.querySelector('#showRipple')?.addEventListener('click', (event) => { + showRipple(event) + }) + document.querySelector('#closeToaster')?.addEventListener(`click`, () => { + closeToaster(document.querySelector('.x-toaster')) + }) - window.drawerBottomElement?.addEventListener('scroll', ({ target }) => scrollDrawer(target, { - opacityRatio: 0, - scrollOpen: target.scrollHeight - target.clientHeight, - scrollClose: 0, - scrollDirection: target.scrollTop, - snapClass: 'snap-y snap-mandatory', - scrollSize: target.scrollHeight - target.clientHeight - })) + document.querySelector('#showToast:not(.has-events)')?.addEventListener('click', () => { - window.showDrawerBottomElement?.addEventListener('click', async () => { - window.drawerBottomElement.showModal() + if (!document.querySelector('.x-toaster')) { + document.body.insertAdjacentHTML('beforeend', `
      `) - await scrollInitDrawer(window.drawerBottomElement, 0, 'top') + const observer = toasterObserver() - showDrawer(window.drawerBottomElement, drawerBottomElement.scrollHeight, 'top') + observer.observe(document.querySelector('.x-toaster'), { + childList: true, }) + } - window.closeDrawerBottomElement?.addEventListener('click', () => closeDrawer(window.drawerBottomElement, 0, 'top')) - - - - window.drawerTopElement?.scroll({ top: drawerTopElement.scrollHeight, behavior: 'instant' }); - window.drawerTopElement?.classList.remove('invisible') - - window.drawerTopElement?.addEventListener('scroll', ({ target }) => scrollDrawer(target, { - snapClass: 'snap-y snap-mandatory', - scrollSize: target.scrollHeight - target.clientHeight, - scrollDirection: target.scrollTop, - scrollOpen: 0, - scrollClose: target.scrollHeight - target.clientHeight - })) - window.showDrawerTopElement?.addEventListener('click', async () => { - window.drawerTopElement.showModal() - - await scrollInitDrawer(window.drawerTopElement, window.drawerTopElement?.scrollHeight, 'top') - - showDrawer(window.drawerTopElement, 0, 'top') - }) + document.querySelector('.x-toaster')?.insertAdjacentHTML('beforeend', ` +
    1. +
      +
      +
      Hello toast
      +
      Amazing toast
      +
      + +
      +
    2. + `) + + showToast(document.querySelector('.x-toaster').children[document.querySelector('.x-toaster').children.length - 1]) + + const closeToastButton = document.querySelectorAll('[data-action="closeToast"]')[document.querySelectorAll('[data-action="closeToast"]').length - 1] + + closeToastButton.addEventListener('click', ({ currentTarget }) => { + // @ts-ignore + closeToast(currentTarget.closest('.x-toast')) + }) + }) - window.closeDrawerTopElement?.addEventListener('click', () => closeDrawer(window.drawerTopElement, drawerTopElement.scrollHeight, 'top')) - } - } + document.querySelector('#showToast')?.classList.add('has-events') } export default { @@ -169,14 +97,15 @@ export default { watch(router.route, () => { setTimeout(() => { updateDarkIframes() - dialogEvent() + exampleEvents() }, 10) }) }, setup() { onMounted(() => { updateDarkIframes() - dialogEvent() + initPolyfills() + exampleEvents() !document.getElementById('icons') && document.body.insertAdjacentHTML('beforeend', ` `) diff --git a/docs/.vitepress/theme/styles/vars.css b/docs/.vitepress/theme/styles/vars.css index 56306ac..d469567 100644 --- a/docs/.vitepress/theme/styles/vars.css +++ b/docs/.vitepress/theme/styles/vars.css @@ -297,6 +297,10 @@ html:has(dialog[open]) .VPSidebar { animation-name: ripple; } +html { + scrollbar-gutter: stable; +} + body { margin: 0; width: 100%; diff --git a/docs/blog/index.md b/docs/blog/index.md new file mode 100644 index 0000000..7131442 --- /dev/null +++ b/docs/blog/index.md @@ -0,0 +1,360 @@ +--- +description: "Winduum 3 moves component behavior closer to the browser with Winduum Elements, native platform APIs, less JavaScript, new Tailwind CSS utilities, and opt-in fallbacks." +--- + +# Announcing Winduum 3 + +Winduum 3 is a native-first release focused on one goal: use more of the browser and ship less JavaScript. + +The web platform can now handle much of the behavior that component libraries used to recreate themselves. Dialogs can be opened with [Invoker Commands](https://developer.mozilla.org/en-US/docs/Web/API/Invoker_Commands_API), popovers can live in the [top layer](https://developer.mozilla.org/en-US/docs/Glossary/Top_layer) through the [Popover API](https://developer.mozilla.org/en-US/docs/Web/API/Popover_API) and anchor themselves with [CSS Anchor Positioning](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_anchor_positioning), accordions can be exclusive through the native [`name` attribute on `
      `](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/details#name), and [CSS Scroll Snap](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_scroll_snap) can drive carousels and drawers. Winduum 3 adopts those capabilities directly and adds only the small enhancement layer that is still useful. + +The result is a leaner core, simpler markup and components that preserve useful behavior even before JavaScript loads — or when it does not load at all. + +::: tip Upgrading from Winduum 2? +Start with the [Winduum v3 migration guide](/migrations/winduum-v3), which covers the core and `winduum-stimulus` together. Once that migration works, projects replacing Stimulus with Winduum Elements can continue with the [winduum-elements migration guide](/migrations/winduum-elements-v3). +::: + +## Winduum Elements, Built on Webuum + +The main addition in this release is [winduum-elements](https://github.com/winduum/winduum-elements): a set of ready-to-use [Custom Elements](https://developer.mozilla.org/en-US/docs/Web/API/Web_components/Using_custom_elements) for Winduum components. + +Winduum Elements is built on [Webuum](https://webuum.dev/), a tiny framework for progressively enhancing server-rendered websites with native Custom Elements. Webuum has no virtual DOM, hydration layer, router or application runtime. It keeps component behavior close to the HTML and relies on browser APIs wherever the platform already has an answer. + +Read the [Webuum v0.x announcement](https://webuum.dev/blog/webuum-0.x.html) for the ideas behind that foundation. + +Install the next release and register only the elements your project needs: + +```shell +npm install winduum@next winduum-elements@next +``` + +```js +import { Drawer } from 'winduum-elements/components/drawer/index.js' +import { Popover } from 'winduum-elements/components/popover/index.js' + +customElements.define('x-drawer', Drawer, { extends: 'dialog' }) +customElements.define('x-popover', Popover) +``` + +This gives server-rendered projects a frameworkless default integration while keeping [winduum-stimulus](https://github.com/winduum/winduum-stimulus), [winduum-vue](https://github.com/winduum/winduum-vue) and [winduum-react](https://github.com/winduum/winduum-react) available for projects that already use those stacks. + +## The Browser Is the Component Runtime + +Winduum 3 replaces custom behavior with native HTML and CSS wherever possible. + +| Component | Native foundation | JavaScript in Winduum 3 | +| --- | --- | --- | +| [Dialog](/docs/components/dialog) | [``](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/dialog), [Invoker Commands](https://developer.mozilla.org/en-US/docs/Web/API/Invoker_Commands_API), [`closedby`](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/dialog#closedby) | No controller or custom open/close API; only an optional compatibility side effect | +| [Details](/docs/components/details) | [`
      `](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/details), ``, [`name`](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/details#name), CSS transitions | None for standard details and accordions; an optional helper syncs the checkbox variant | +| [Popover](/docs/components/popover) | [Popover API](https://developer.mozilla.org/en-US/docs/Web/API/Popover_API), [Invoker Commands](https://developer.mozilla.org/en-US/docs/Web/API/Invoker_Commands_API), [CSS Anchor Positioning](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_anchor_positioning), [`interestfor`](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Attributes/interestfor) | None in modern browsers; a small positioning fallback is available | +| [Drawer](/docs/components/drawer) | [``](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/dialog), [Invoker Commands](https://developer.mozilla.org/en-US/docs/Web/API/Invoker_Commands_API), [scroll snap](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_scroll_snap), [scroll-driven animations](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_scroll-driven_animations), observers | Reduced to the enhancement layer for command handling, snap state, swipe dismissal and fallbacks | +| [Marquee](/docs/components/marquee) | [CSS motion path](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_motion_path), [`sibling-index()`](https://developer.mozilla.org/en-US/docs/Web/CSS/sibling-index) and animations | None | + +### Dialog Without a JavaScript Controller + +The [Dialog component](/docs/components/dialog) no longer needs its old `showDialog`, `closeDialog` and `defaultOptions` APIs. A button now opens and closes the native [``](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/dialog) declaratively with [Invoker Commands](https://developer.mozilla.org/en-US/docs/Web/API/Invoker_Commands_API) (`command` and `commandfor`), while [`closedby`](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/dialog#closedby) controls light dismiss. + + + +<<< @/public/examples/components/dialog/basic.html#body{} [html] + +For programmatic control, use the native [`HTMLDialogElement.showModal()`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLDialogElement/showModal) and [`HTMLDialogElement.close()`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLDialogElement/close) methods. The optional side-effect script only fills gaps for browsers without [`closedby`](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/dialog#closedby) support and keeps the scrollbar-width CSS property up to date. See the complete [Dialog documentation](/docs/components/dialog). + +### Details and Accordions in Native HTML + +The [Details component](/docs/components/details) no longer uses `showDetails`, `closeDetails` or their JavaScript animation options. Open and close transitions are now handled in CSS, while exclusive accordions use the native [`name` attribute](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/details#name) on related [`
      `](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/details) elements. + + + +<<< @/public/examples/components/details/default.html#body{} [html] + +Standard details and accordion patterns need no JavaScript. The synchronous `toggleDetails` helper remains only for the optional pattern that keeps a checkbox inside `` in sync with the `open` state. See the complete [Details documentation](/docs/components/details). + +### Popover and Anchor Positioning + +The [Popover component](/docs/components/popover) has been rewritten around the native [Popover API](https://developer.mozilla.org/en-US/docs/Web/API/Popover_API), [Invoker Commands](https://developer.mozilla.org/en-US/docs/Web/API/Invoker_Commands_API) and [CSS Anchor Positioning](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_anchor_positioning). The browser owns [top-layer](https://developer.mozilla.org/en-US/docs/Glossary/Top_layer) placement, light dismiss, Escape handling and the open state. + + + +<<< @/public/examples/components/popover/basic.html#body{} [html] + +The old `showPopover`, `hidePopover`, `togglePopover` and `computePopover` helpers are no longer part of the Winduum API — [`showPopover()`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/showPopover), [`hidePopover()`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/hidePopover) and [`togglePopover()`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/togglePopover) now belong to the native platform. `computePositionPopover` and `autoUpdatePopover` remain as focused Floating UI fallbacks for browsers without [CSS Anchor Positioning](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_anchor_positioning). + +The former Tooltip component is deprecated in favor of the [`x-popover tooltip` variant](/docs/components/popover#tooltip-popover). Its directional variants now use the explicit `tooltip-top`, `tooltip-bottom`, `tooltip-left` and `tooltip-right` names. See the complete [Popover documentation](/docs/components/popover). + +### A Much Smaller Drawer Layer + +The [Drawer component](/docs/components/drawer) still supports touch-driven dismissal, but the browser now does most of the work. Native [Invoker Commands](https://developer.mozilla.org/en-US/docs/Web/API/Invoker_Commands_API) open and close its dialog, [CSS Scroll Snap](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_scroll_snap) defines the open and closed positions, a [scroll-driven animation](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_scroll-driven_animations) drives the backdrop and an [Intersection Observer](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API) tracks settled state. This follows the same platform-first principles described in the Chrome team's [navigation drawer guidance](https://github.com/GoogleChrome/modern-web-guidance/blob/main/skills/modern-web-guidance/guides/overlays/navigation-drawer.md): the user's finger controls the native scroller instead of a JavaScript `transform` tween. + + + +::: code-group +<<< @/public/examples/components/drawer/noscript.html#body{} [winduum-elements] +<<< @/../examples-vue/src/pages/components/drawer/noscript.vue [winduum-vue] +<<< @/../examples-react/src/pages/components/drawer/noscript.tsx [winduum-react] +::: + +The v3 rewrite adds placement-based helpers, modal and non-modal patterns, a responsive dialog variant and two CSS-first fallbacks: + +- `noscript` keeps an animated drawer usable when JavaScript is disabled. +- `nosnap` removes the scroll-snap behavior and works without JavaScript. +- `dialog` changes from a bottom drawer to a centered dialog at a container breakpoint. +- `left`, `right`, `top` and `bottom` placements share the same API. + +See the complete [Drawer documentation](/docs/components/drawer), including every placement and the `dialog`, `noscript` and `nosnap` examples. + +### CSS-only Marquee + +The new [Marquee component](/docs/components/marquee) creates an infinite loop with a [CSS motion path](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_motion_path), [`sibling-count()`](https://developer.mozilla.org/en-US/docs/Web/CSS/sibling-count) and [`sibling-index()`](https://developer.mozilla.org/en-US/docs/Web/CSS/sibling-index). It has no JavaScript runtime and pauses when keyboard focus moves inside the component. + + + +The `--x-marquee-sibling-index` and `--x-marquee-sibling-count` properties provide a declarative fallback until `sibling-index()` and `sibling-count()` are available in every target browser. See the [Marquee docs](/docs/components/marquee) for the complete HTML, Vue and React examples. + +## Native-first Components Beyond the Headliners + +The same direction continues across the rest of the library. + +### Experimental Carousel + +The goal of [Carousel Experimental](/docs/components/carousel-experimental) was to mirror the [CSS Overflow Module Level 5](https://www.w3.org/TR/css-overflow-5/) carousel API in JavaScript. Scroll buttons, markers and the active snap target would use ordinary elements, making patterns such as Chrome's [Horizontal List](https://chrome.dev/carousel/horizontal/list/) available without relying on the still-unsupported `::scroll-button()` and `::scroll-marker` pseudo-elements. + +That compatibility layer is not ready yet because the required Scroll Snap behavior is not consistent across browsers. The [`scrollsnapchange` event](https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollsnapchange_event) is still unavailable in Firefox and Safari, while Safari's [`scrollBy()`](https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollBy) can fail in combination with scroll snapping ([WebKit #270064](https://www2.webkit.org/show_bug.cgi?id=270064), [WebKit #316084](https://www2.webkit.org/show_bug.cgi?id=316084)). The component therefore remains experimental; use the stable [Carousel](/docs/components/carousel) when broad browser support is required. + +### Integrations and Component APIs + +- `winduum-vue` and `winduum-react` have been updated for Winduum 3 and now include the previously missing components, including the interactive components. +- `winduum-stimulus` v3 adopts the same Winduum 3 markup and APIs for projects that want to stay on Stimulus. +- [Text](/docs/components/text) is split into the small base `x-text` component and the `x-text content` variant for rich CMS or WYSIWYG output. +- [Form](/docs/components/form) now imports `validateField` from the standalone Field module. The default selector is `.x-field`, `validateSelectors` is renamed to `validateSelector`, and validation options are smaller. +- [Toast](/docs/components/toast) auto-hides after 7.5 seconds by default and removes its element after the exit transition. The new `toasterObserver` opens and closes a [Toaster](/docs/components/toaster) popover as its contents change. +- `tel-country-code` adds styles for country-code select controls. +- Typography, headings, labels, selects, the container width and responsive container padding have updated defaults. + +## Tailwind CSS Utilities That Match the Platform + +Several utilities and variants first shipped experimentally between Winduum `2.2.20` and `2.2.28`. Winduum 3 makes them part of the documented workflow. Together they answer the question posed in [Do you still need Framer Motion?](https://motion.dev/magazine/do-you-still-need-framer-motion) in a deliberately pragmatic way: start with CSS when the browser already owns the interaction or timeline, then add JavaScript only when the effect needs runtime physics, gesture data or orchestration. + +The documented workflow now includes: + +- [Link](/docs/utilities/link) utilities and [Interest](/docs/variants/interest) variants. +- New `ease-anticipate`, `ease-spring` and `ease-emphasized` easing curves. +- [Grid area](/docs/utilities/grid#grid-area) utilities. +- [Animation Timeline and Animation Trigger](/docs/utilities/animation) utilities with composable `enter` / `exit` keyframes and the `animation-trigger-enter` fallback. +- [Scroll State](/docs/variants/scroll-state) variants. +- The experimental [`timelineTrigger` polyfill](/docs/polyfills#timeline-trigger) and `supportsInterestFor` feature check. +- [Position](/docs/utilities/position) utilities. + +### Expressive easing without a runtime + +Winduum now includes three easing tokens beyond the familiar `ease-in`, `ease-out` and `ease-in-out` curves: + +- `ease-anticipate` briefly moves against the expected direction before accelerating forward. +- `ease-spring` uses the CSS [`linear()` easing function](https://developer.mozilla.org/en-US/docs/Web/CSS/easing-function/linear) to encode a sampled spring-like curve. +- `ease-emphasized` accelerates quickly and settles smoothly. It is also the default timing function for `animation-trigger-enter`. + +Tailwind CSS `ease-*` utilities apply the curve directly to `transition-timing-function` and expose it through `--tw-ease`. Keyframe and scroll-driven animations can reuse the same token, but must connect it to `animation-timing-function` explicitly: + +::: code-group +```html [Spring] + +``` + +```html [Anticipate] +
      + Hover me +
      +``` + +```html [Emphasized] +
      + Content +
      +``` +::: + +`ease-spring` is intentionally a predefined curve, not a physics engine. It cannot inherit the release velocity of a drag gesture, change its duration from spring parameters or preserve velocity when interrupted. Motion still makes sense for those cases; CSS is the smaller option when a consistent spring-like transition is enough. + +### Scroll-linked animation with `animation-timeline` + +[CSS scroll-driven animations](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_scroll-driven_animations) replace the usual scroll listener and per-frame progress calculation with a browser-owned timeline. Winduum exposes both kinds through its [Animation Timeline utilities](/docs/utilities/animation#animation-timeline): + +- `animation-timeline-scroll`, `-x` and `-y` use `scroll()` so animation progress follows a scroll container. +- `animation-timeline-view` uses `view()` so progress follows an element as it passes through the viewport. +- `animation-range-*` limits the part of that timeline in which the animation runs. +- Named `scroll-timeline-*`, `view-timeline-*` and `timeline-scope-*` utilities connect a timeline to an animation elsewhere in the component. + +::: info Approaching Baseline +Scroll-linked animations are close to becoming Baseline across the major browser engines. The current [`scroll-timeline` support table](https://caniuse.com/mdn-css_properties_scroll-timeline) lists Firefox 155 as its first supported release, joining the existing Chromium and Safari implementations. +::: + +::: code-group +```html [View progress] +
      + Content reveals as it enters the viewport. +
      +``` + +```html [Scroller progress] +
      +
        ...
      + +
      +
      +``` +::: + +This is **scroll-linked** motion: its progress continuously follows scroll position. For `transform` and `opacity`, the browser can keep the animation on its optimized rendering path, while the markup still exposes the underlying [`animation-timeline`](https://developer.mozilla.org/en-US/docs/Web/CSS/animation-timeline) model. + +### Scroll-triggered animation with `animation-trigger` + +Scroll-triggered motion is different: a normal time-based animation should start once when an element reaches a threshold. Winduum targets the emerging [`animation-trigger` and `timeline-trigger` properties](https://developer.chrome.com/blog/animation-trigger) for that job. + +The `animation-trigger-enter` utility selects the composable `enter` keyframes, while `from-*` and `to-*` classes define their opacity, translation, scale and rotation. `timeline-trigger-enter` supplies a view trigger with a default `20%` entry threshold and a `play-once` action: + +```html +

      + Our key partners +

      +``` + +The default duration is `1.75s`, the default easing is `ease-emphasized`, and the animation uses `fill-mode: both`. Winduum disables it for `prefers-reduced-motion` and print automatically. + +The properties are still experimental, so the native path is progressive enhancement rather than a hard dependency. In a browser without `timeline-trigger`, Winduum's fallback keeps `animation-trigger-enter` paused until a `data-enter` state is present. The opt-in [`timelineTrigger` polyfill](/docs/polyfills#timeline-trigger) supplies that state with `IntersectionObserver`; supported browsers need no observer or trigger JavaScript at all. See the complete [Animation Trigger documentation](/docs/utilities/animation#animation-trigger). + +### Scroll state as a CSS variant + +[Scroll-state container queries](https://developer.mozilla.org/en-US/docs/Web/CSS/Guides/Conditional_rules/Container_scroll-state_queries) let the browser expose state that previously required scroll listeners, measurements and classes toggled from JavaScript. After setting `container-type: scroll-state`, Winduum's [Scroll State variants](/docs/variants/scroll-state) can react to four groups: + +- `scrollable-*` shows whether more content is available in a direction — useful for edge fades and navigation controls. +- `scrolled-*` shows whether the container has moved away from an edge — useful for separators and scroll affordances. +- `snapped-*` identifies the currently snapped item — useful for native carousels and galleries. +- `stuck-*` identifies when a sticky element is actually stuck — useful for changing a header's shadow or size only after it reaches an edge. + +::: code-group +```html [Sticky header] +
      + +
      +``` + +```html [Scroll affordance] +
      +
        ...
      + +
      +``` + +```html [Snapped item] +
        +
      • + +
      • +
      +``` +::: + +Unsupported browsers ignore the conditional styles, so the content and native scrolling remain usable. The variants are best used for visual enhancement rather than as the only way to expose essential state. + +### Interaction, positioning and layout primitives + +The rest of this group follows the same rule: expose what the browser already knows instead of rebuilding it in a component script. + +- [Link](/docs/utilities/link) scopes hover and focus transitions to real interactive elements using [`:any-link`](https://developer.mozilla.org/en-US/docs/Web/CSS/:any-link), enabled buttons and button roles. +- [Interest](/docs/variants/interest) turns the declarative `interestfor` relationship into `interest-source:` and `interest-target:` variants for tooltips and hover cards, with an optional fallback selected by `supportsInterestFor`. +- [Position](/docs/utilities/position) composes [CSS Anchor Positioning](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_anchor_positioning), `position-area` and fallback flipping for popovers instead of recalculating coordinates on every layout change. +- [Grid area](/docs/utilities/grid#grid-area) makes named or overlapping grid areas composable, including `grid-area-full` for stacking content without absolute positioning. + +::: code-group +```html [Interest popover] + + +
      + Tooltip content +
      +``` + +```html [Anchored position] + + + +``` + +```html [Grid area] +
      + +
      Caption
      +
      +``` +::: + +The deprecated `--radius` token now resolves to the base `xs` radius (`0.125rem`) instead of `--radius-xl`. Use the named, calculated radius variables in new code. + +## Progressive Enhancement, Including the Fallbacks + +Adopting new browser APIs does not mean shipping every polyfill to every browser. Winduum 3 adds a `winduum/polyfill` entry point and individual support checks so fallbacks can be loaded only where they are needed. + +```js +import { + supportsAnimationTimeline, + supportsInterestFor, + supportsScrollInitialTarget, + supportsScrollSnapEvents, + supportsTimelineTrigger, +} from 'winduum/supports' + +if (!supportsInterestFor) { + await import('interestfor/src/interestfor.js') +} + +if (!supportsTimelineTrigger) { + await import('winduum/src/polyfills/timelineTrigger.js') +} +``` + +Winduum Elements also exposes Webuum's feature checks for [Invoker Commands](https://developer.mozilla.org/en-US/docs/Web/API/Invoker_Commands_API) and [customized built-in elements](https://developer.mozilla.org/en-US/docs/Web/API/Web_components/Using_custom_elements#customized_built-in_elements): + +```js +import { supportsCommand, supportsIs } from 'webuum/supports' + +if (!supportsCommand) { + const { apply } = await import('invokers-polyfill/fn') + apply() +} + +if (!supportsIs()) { + await import('@webreflection/custom-elements-builtin') +} +``` + +The remaining checks — including animation timelines, scroll initial targets, scroll-snap events, anchor positioning and anchored containers — make it possible to choose a project-specific fallback rather than paying for a global compatibility layer. See the [Polyfills documentation](/docs/polyfills) for the recommended setup. + +## Migrating to Winduum 3 + +Winduum 3 removes and renames JavaScript APIs, changes some component markup and updates several defaults. Existing projects should treat it as a deliberate migration rather than a dependency-only upgrade. + +- Follow the [Winduum v3 migration guide](/migrations/winduum-v3) to upgrade core styles, component markup, native APIs and `winduum-stimulus` controllers together. +- Follow the [winduum-elements migration guide](/migrations/winduum-elements-v3) only after that migration works when replacing the migrated Stimulus integration with Custom Elements. +- Review the full [Winduum changelog](https://github.com/winduum/winduum/blob/next/CHANGELOG.md) for the release-by-release details. + +Winduum 3 is not a rewrite of what a component library looks like. It is a rewrite of who should own the behavior. Whenever the browser can provide the semantics, focus handling, top layer, scrolling or animation, Winduum now lets the browser do it — and keeps its own JavaScript focused on progressive enhancement. diff --git a/docs/docs/about.md b/docs/docs/about.md index 0539f0a..1e0f213 100644 --- a/docs/docs/about.md +++ b/docs/docs/about.md @@ -1,15 +1,19 @@ +--- +description: "Winduum is a small, modern CSS component framework built on the newest web standards, using as little JavaScript as possible." +--- + # About Winduum is a mix of words **Tailwind** _(Popular CSS utility framework)_ and **Tuum** _(Estonian word for "core")_. -It essentially provides ways to leverage use of **modern and accessible standards** as much possible. Because we ❤️ CSS and this is a small modest CSS component framework. +It's a small, modern CSS component framework that leans on the **newest web platform standards** and uses **as little JavaScript as possible**. Because we ❤️ CSS. Its approach to **TailwindCSS** is a little different. It encourages writing components in CSS or other (pre/post)-processors and to use utility classes to enhance the components. -As a CSS library, it provides beautifully styled accessible components. Which you can extend with your own components. +As a CSS library, it provides beautifully styled accessible components, which you can extend with your own. TailwindCSS is recommended for the full experience, but it's optional — everything works without it too. -It is very modular and split to `base`, `components` and `utilities` layers. +It is very modular and split into `base`, `components` and `utilities` layers. You can choose what you want to use and make your own complex UX/UI project written in whatever you want. @@ -17,31 +21,37 @@ You can choose what you want to use and make your own complex UX/UI project writ The question inevitably arises: Why introduce yet another UI component library into the mix? Simply because Winduum is different in a few areas than the others. 1. It focuses on web standards, accessibility and minimum simple code -2. It's progressive, uses modern features and standards -3. It's framework-agnostic, so it can be used in any scenario -4. Its source code is plain CSS and JS, so it can be also used without a build step +2. It's progressive — it embraces the latest CSS and HTML features instead of reimplementing them in JavaScript +3. It ships as little JavaScript as possible — many components need none at all +4. It's framework-agnostic, so it can be used in any scenario +5. Its source code is plain CSS and JS, so it can be also used without a build step ## Framework-agnostic -Winduum is **framework-agnostic**, so you are able to create your own components using your preferred framework. Javascript primitives can be also adapted in any framework. +Winduum is **framework-agnostic**, so you are able to create your own components using your preferred framework. The JavaScript primitives can be adapted in any framework too. -If there is interest, pre-built components may be developed for popular frameworks. -Currently, -only [`winduum-vue`](https://www.github.com/winduum/winduum-vue) and [`winduum-react`](https://www.github.com/winduum/winduum-react) are available -and most of the components have usage and installation examples in the docs. +Pre-built components are available for the most common setups — [`winduum-elements`](https://github.com/winduum/winduum-elements) (Web Components), [`winduum-stimulus`](https://github.com/winduum/winduum-stimulus), [`winduum-vue`](https://github.com/winduum/winduum-vue) and [`winduum-react`](https://github.com/winduum/winduum-react) — and most components include usage and installation examples for them in the docs. Want to help? We're open for pull requests! -## Modern CSS Features -Staying ahead of the curve, Winduum leverages modern CSS features, allowing you to harness the power of the latest specifications and improve overall styling capabilities. All of these are supported in current browsers. - -- **CSS Properties** -- **CSS Logical Properties** -- **CSS Nesting** -- **CSS color-mix** -- **Modern pseudo selectors** such as `:where`, `:is` and `:has` -- **Modern CSS reset** -- **View Transition API, Dialog API, Popover API** and more! -- **Low specifity or layers** +## Modern web standards +Staying ahead of the curve, Winduum leverages the latest web platform features so behavior that used to require JavaScript is handled natively by the browser. Where support is still rolling out, features degrade gracefully or can be covered with opt-in [polyfills](/docs/polyfills). + +Interaction and layout, largely without JavaScript: + +- **[Popover API](https://developer.mozilla.org/en-US/docs/Web/API/Popover_API)** and **[Invoker Commands](https://developer.mozilla.org/en-US/docs/Web/API/Invoker_Commands_API)** — popovers, dialogs, drawers and toasts +- **[CSS Anchor Positioning](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_anchor_positioning)** — popover and tooltip placement +- **[Interest Invokers](/docs/variants/interest)** (`interestfor`) — hover/focus cards and tooltips +- **[Scroll Snap](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_scroll_snap)** — carousel and drawer +- **[Scroll-driven animations](/docs/utilities/animation#animation-timeline)** and **[scroll-state queries](/docs/variants/scroll-state)** +- **`@starting-style`** and **`allow-discrete`** transitions — enter/exit animations +- Native **``**, **`
      `** and form elements for built-in accessibility + +Modern styling foundations: + +- **CSS custom properties** and **logical properties** +- **CSS nesting** and **`color-mix()`** +- **Modern pseudo-selectors** such as `:where`, `:is` and `:has` +- **Modern CSS reset** with **low specificity** and **cascade layers** **Winduum** is all about accessibility and web standards that can be used in any framework. diff --git a/docs/docs/base/breakpoints.md b/docs/docs/base/breakpoints.md index 12af6a9..0637991 100644 --- a/docs/docs/base/breakpoints.md +++ b/docs/docs/base/breakpoints.md @@ -1,3 +1,7 @@ +--- +description: "Breakpoints in Winduum are very close to TailwindCSS, yet they have slightly different values and extended to cover all possible resolutions." +--- + # Breakpoints Breakpoints in Winduum are very close to TailwindCSS, yet they have slightly different values and extended to cover all possible resolutions. @@ -15,10 +19,8 @@ You can use the same principles as defined in [Responsive design](https://tailwi * **xxl** - 2016px * **2xxl** - 2528px -Breakpoints are defined in [`src/base/breakpoints.css`](https://github.com/winduum/winduum/blob/main/src/base/breakpoints.css) and in [config#screens](/docs/base/config#screens) -(TailwindCSS `v3`) -or [`tailwindcss/theme/config/breakpoint.css`](https://github.com/winduum/winduum/blob/main/tailwindcss/theme/config/breakpoint.css) -(TailwindCSS `v4`) +Breakpoints are defined in [`src/base/breakpoints.css`](https://github.com/winduum/winduum/blob/next/src/base/breakpoints.css) and in [`tailwindcss/theme/config/breakpoint.css`](https://github.com/winduum/winduum/blob/next/tailwindcss/theme/config/breakpoint.css) +for TailwindCSS. You can also use the breakpoints inside CSS like this. diff --git a/docs/docs/base/config.md b/docs/docs/base/config.md index d5f0ee2..5bf8242 100644 --- a/docs/docs/base/config.md +++ b/docs/docs/base/config.md @@ -1,228 +1,34 @@ -# CSS config - -Each CSS property is defined in CSS in following path - [`src/theme/config/index.css`](https://github.com/winduum/winduum/blob/main/src/theme/config/index.css). - -We are using naming conventions from TailwindCSS `v4`, -so you can use these properties in both current and future versions of TailwindCSS or without TailwindCSS. +--- +description: "Theme configuration via CSS custom properties — works with the TailwindCSS @theme at-rule or as plain CSS properties without TailwindCSS." +--- -<<< @/../node_modules/winduum/src/theme/config/index.css +# CSS config +Theme configuration via CSS custom properties — works with the TailwindCSS `@theme` at-rule or as plain CSS properties without TailwindCSS. -## Tailwind CSS v4 -In the new version of TailwindCSS the configuration is done via CSS, so no plugin is necessary. -Most of the config CSS properties are also part of the new version. +## Tailwind CSS +The configuration is done via [@theme](https://github.com/winduum/winduum/tree/next/tailwindcss/theme/config) config. ```css -@import "tailwindcss/theme.css" layer(theme); @import "winduum/tailwindcss/theme/config/index.css" layer(theme); -@import "winduum/tailwindcss/theme/default.css" layer(theme); -``` - -## Tailwind CSS v3 - -To add `winduum` to TailwindCSS v3, add folowing plugin to `tailwind.config.js` configuration file. - -```js -import winduum from 'winduum' - -export default { - darkMode: 'class', - content: [ - './node_modules/winduum/src/**/*.js', - './src/**/*.{js,html}' - ], - plugins: [ - winduum({ - // config options - }) - ], -} ``` -You can customize config with options listed bellow. - -This plugin disables by default following TailwindCSS corePlugins - -* **preflight** - custom modern css reset is used, see [Reset](/docs/base/reset) - -Winduum also exports useful helper functions you can use in your `tailwind.config.js`, see [`utils/tailwind.js`](https://github.com/winduum/winduum/blob/main/utils/tailwind.js) for more info. - -### settings.rgb -Include `-rgb` color variants. Learn more about this in [Compatibility](/docs/base/theme.html#compatibility) section. - -* **Type:** `boolean` -* **Default:** `false` - -### settings.colorMix -Use `color-mix` in color variants instead of rgb. Learn more about this in [Compatibility](/docs/base/theme.html#compatibility) section. - -* **Type:** `boolean` -* **Default:** `true` - -### colors -* **Type:** `string[] | string` -* **Default:** `undefined` - -These are additional color tokens that can be used with TailwindCSS as CSS custom properties, which can be then defined in `.css`. See [Colors](/docs/colors) for more info. -Or you can add a path to `.css` file containing the CSS custom properties, and it will be parsed automatically. +### Individual properties +#### breakpoint +<<< @/../node_modules/winduum/tailwindcss/theme/config/breakpoint.css +#### easing +<<< @/../node_modules/winduum/tailwindcss/theme/config/easing.css +#### font +<<< @/../node_modules/winduum/tailwindcss/theme/config/font.css +#### radius +<<< @/../node_modules/winduum/tailwindcss/theme/config/radius.css +#### transition +<<< @/../node_modules/winduum/tailwindcss/theme/config/transition.css +#### z-index +<<< @/../node_modules/winduum/tailwindcss/theme/config/z.css -Example `bg-primary`: -```css -.bg-primary { - background-color: color-mix(in sRGB, var(--color-primary) calc(var(--tw-bg-opacity, 1) * 100%), transparent); -} -``` - -### fontFamily -* **Type:** `string[] | string` -* **Default:** `undefined` - -These are additional font-family tokens that can be used with TailwindCSS as CSS properties, which can be then defined in `.css`. -Or you can add a path to `.css` file containing the CSS custom properties, and it will be parsed automatically. - -Example `font-primary`: -```css -.font-primary { - font-family: var(--font-primary); -} -``` - -### fontWeight -* **Type:** `string[] | string` -* **Default:** `undefined` - -These are additional font-weight tokens that can be used with TailwindCSS as CSS properties, which can be then defined in `.css`. -Or you can add a path to `.css` file containing the CSS custom properties, and it will be parsed automatically. - -Example `font-bold`: -```css -.font-bold { - font-weight: var(--font-bold); -} -``` - -### ease -* **Type:** `string[] | string` -* **Default:** `undefined` - -These are additional transition easing tokens that can be used with TailwindCSS as CSS properties, which can be then defined in `.css`. -Or you can add a path to `.css` file containing the CSS custom properties, and it will be parsed automatically. - -Example `ease-linear`: -```css -.ease-linear { - transition-timing-function: var(--ease-linear); -} -``` +### Without Tailwind CSS +Each CSS property is defined in CSS in following path - [`src/theme/config/index.css`](https://github.com/winduum/winduum/blob/next/src/theme/config/index.css). -### zIndex -* **Type:** `string[] | string` -* **Default:** `undefined` - -These are additional z-index tokens that can be used with TailwindCSS as CSS properties, which can be then defined in `.css`. -Or you can add a path to `.css` file containing the CSS custom properties, and it will be parsed automatically. - -Example `z-10`: -```css -.z-10 { - z-index: var(--z-10); -} -``` - -### fontSize -* **Type:** `string[] | string` -* **Default:** `undefined` - -These are additional `font-size` tokens that can be used with TailwindCSS as CSS properties, which can be then defined in `.css`. -Or you can add a path to `.css` file containing the CSS custom properties, and it will be parsed automatically. - -Example `text-md`: -```css -.text-md { - font-size: var(--font-size-md); - line-height: calc(var(--font-size-md) + 0.5rem); -} -``` - -### spacing -* **Type:** `string[] | string` -* **Default:** `undefined` - -These are additional spacing tokens that can be used with TailwindCSS as CSS properties, which can be then defined in `.css`. -Or you can add a path to `.css` file containing the CSS custom properties, and it will be parsed automatically. - -Example `gap-4`: -```css -.gap-4 { - gap: var(--spacing-4); -} -``` - -Example `px-4`: -```css -.px-4 { - padding-left: var(--spacing-4); - padding-right: var(--spacing-4); -} -``` - -### borderRadius -* **Type:** `string[] | string` -* **Default:** `undefined` - -These are additional border-radius tokens that can be used with TailwindCSS as CSS properties, which can be then defined in `.css`. -Or you can add a path to `.css` file containing the CSS custom properties, and it will be parsed automatically. - -Example `rounded-md`: -```css -.rounded-md { - border-radius: var(--radius-md); -} -``` - -### animations -* **Type:** `string[]` -* **Default:** `['fade-in', 'fade-out', 'ripple', 'spin', 'move-indeterminate']` - -These are additional animation tokens that can be used with TailwindCSS as CSS properties, which can be then defined in `.css`. -Or you can add a path to `.css` file containing the CSS custom properties, and it will be parsed automatically. - -Example `animation-fade-in`: -```css -.animation-fade-in { - animation-name: fade-in; -} -``` - -### mask -* **Type:** `string[] | string` -* **Default:** `undefined` - -These are additional mask tokens that can be used with TailwindCSS as CSS properties, which can be then defined in `.css`. -Or you can add a path to `.css` file containing the CSS custom properties, and it will be parsed automatically. - -Example `animation-fade-in`: -```css -.mask-check { - mask: var(--mask-check) -} -``` - -### screens -* **Type:** `object` -* **Default:** -```js -{ - 'xs': '22.5em', - 'sm': '26em', - 'md': '48em', - 'lg': '60em', - 'xl': '76em', - '2xl': '82em', - '3xl': '88em', - '4xl': '100em', - 'xxl': '126em', - '2xxl': '158em' -} -``` +We are using naming conventions as Tailwind CSS, so you can use these properties with or without TailwindCSS. -These are new media queries tokens that can be used with TailwindCSS, see more in [Breakpoints](/docs/base/breakpoints) +<<< @/../node_modules/winduum/src/theme/config/index.css \ No newline at end of file diff --git a/docs/docs/base/defaults.md b/docs/docs/base/defaults.md index 7dd3db1..aaf5d88 100644 --- a/docs/docs/base/defaults.md +++ b/docs/docs/base/defaults.md @@ -1,20 +1,26 @@ +--- +description: "Default styles or rules applied to certain HTML elements or pseudo-elements. These are very much optional." +--- + # Defaults Default styles or rules applied to certain HTML elements or pseudo-elements. These are very much optional. -[`src/base/defaults.css`](https://github.com/winduum/winduum/blob/main/src/base/defaults.css) +[`src/base/defaults.css`](https://github.com/winduum/winduum/blob/next/src/base/defaults.css) <<< @/../node_modules/winduum/src/base/defaults.css -For TailwindCSS `v3` there are few rules such as resetting borders -and applying `--tw-content` to all pseudo-elements and zero border to all elements or pseudo-elements. +There is also an extended set of opinionated defaults — block `svg`/`img`, icon styling based on `href` suffixes (`-outline`, `-solid`, ...), unstyled lists and native appearance resets for `number` and `search` inputs. + +[`src/base/defaults-extended.css`](https://github.com/winduum/winduum/blob/next/src/base/defaults-extended.css) -[`tailwindcss/base/defaults.css`](https://github.com/winduum/winduum/blob/main/tailwindcss/base/defaults.css) - +```css +@import "winduum/src/base/defaults-extended.css" layer(base); +``` ## Cursor -Default `cursor: pointer` for clickable elements, you can change this globally via CSS property `--default-cursor` if you prefer more application like behavior. +Default `cursor: pointer` for clickable elements, you can change this globally via CSS property `--cursor-pointer` if you prefer more application like behavior. ## Svg Set the default size of an SVG as a small square if neither width nor height is specified. diff --git a/docs/docs/base/keyframes.md b/docs/docs/base/keyframes.md index a814be2..392c3fc 100644 --- a/docs/docs/base/keyframes.md +++ b/docs/docs/base/keyframes.md @@ -1,5 +1,9 @@ +--- +description: "Following keyframes are provided in src/base/keyframes.css." +--- + # Keyframes -Following keyframes are provided in [`src/base/keyframes.css`](https://github.com/winduum/winduum/blob/main/src/base/keyframes.css). +Following keyframes are provided in [`src/base/keyframes.css`](https://github.com/winduum/winduum/blob/next/src/base/keyframes.css). <<< @/../node_modules/winduum/src/base/keyframes.css diff --git a/docs/docs/base/reset.md b/docs/docs/base/reset.md index 749e39c..82539ff 100644 --- a/docs/docs/base/reset.md +++ b/docs/docs/base/reset.md @@ -1,9 +1,12 @@ +--- +description: "New modern CSS reset, that means Preflight from TailwindCSS is disabled by default." +--- + # Reset New modern CSS reset, that means [Preflight](https://tailwindcss.com/docs/preflight#border-styles-are-reset-globally) from **TailwindCSS** is disabled by default. -You can always enable it again via `tailwind.config.js` if you prefer it more. -Everything except [Defaults](https://github.com/winduum/winduum/blob/main/src/base/defaults.css) is unstyled, so you are free to style your components or use pre-built components. +Everything except [Defaults](https://github.com/winduum/winduum/blob/next/src/base/defaults.css) is unstyled, so you are free to style your components or use pre-built components. -[`src/base/reset.css`](https://github.com/winduum/winduum/blob/main/src/base/reset.css) +[`src/base/reset.css`](https://github.com/winduum/winduum/blob/next/src/base/reset.css) <<< @/../node_modules/winduum/src/base/reset.css diff --git a/docs/docs/base/theme.md b/docs/docs/base/theme.md index bd17261..191dc7c 100644 --- a/docs/docs/base/theme.md +++ b/docs/docs/base/theme.md @@ -1,3 +1,7 @@ +--- +description: "Theming in Winduum is really easy. All it takes is a few CSS properties. There are two themes by default (light and dark) and to create a new one, you can…" +--- + # Theme Theming in Winduum is really easy. All it takes is a few CSS properties. There are two themes by default (light and dark) and to create a new one, you can just extend the default theme. @@ -6,21 +10,22 @@ Theming in Winduum is really easy. All it takes is a few CSS properties. There a Each `color-mix` function also contains `--default-color-space` property, which you can change from `sRGB` to mix colors in different color spaces. You can use colors in any format you want. -### TailwindCSS v4 +### TailwindCSS + +Instead of `:root, :host` the `@theme` at-rule is used. -Instead of `:root, :host` the `v4` `@theme` at-rule is used. +[`tailwindcss/theme/default.css`](https://github.com/winduum/winduum/blob/next/tailwindcss/theme/default.css) -[`tailwindcss/theme/default.css`](https://github.com/winduum/winduum/blob/main/tailwindcss/theme/default.css) +<<< @/../node_modules/winduum/tailwindcss/theme/default.css -### TailwindCSS v3 -[`src/theme/default.css`](https://github.com/winduum/winduum/blob/main/src/theme/default.css) +### Without TailwindCSS -<<< @/../node_modules/winduum/src/theme/default.css +[`src/theme/default.css`](https://github.com/winduum/winduum/blob/next/src/theme/default.css) ## Default P3 -[`src/theme/default-p3.css`](https://github.com/winduum/winduum/blob/main/src/theme/default-p3.css) +[`src/theme/default-p3.css`](https://github.com/winduum/winduum/blob/next/src/theme/default-p3.css) Better high range colors for P3 capable displays. @@ -28,18 +33,6 @@ Better high range colors for P3 capable displays. ## Dark -[`src/theme/dark.css`](https://github.com/winduum/winduum/blob/main/src/theme/dark.css) +[`src/theme/dark.css`](https://github.com/winduum/winduum/blob/next/src/theme/dark.css) <<< @/../node_modules/winduum/src/theme/dark.css - - - -## Compatibility - -Support for `color-mix` is almost `90%` global usage. -But if you want better compatibility you can still use `rgb` -which can be enabled it in the [Config](/docs/base/config.html#settings-rgb) (only for TailwindCSS v3). -In that case, you have to use rgb variants for theming in your own components. - -* [`src/theme/default-rgb.css`](https://github.com/winduum/winduum/blob/main/src/theme/default-rgb.css) -* [`src/theme/dark-rgb.css`](https://github.com/winduum/winduum/blob/main/src/theme/dark-rgb.css) diff --git a/docs/docs/base/transitions.md b/docs/docs/base/transitions.md index f2b86b1..af696b4 100644 --- a/docs/docs/base/transitions.md +++ b/docs/docs/base/transitions.md @@ -1,9 +1,13 @@ +--- +description: "This activates the View Transitions API with cross-document animations." +--- + # Transitions This activates the [View Transitions API](https://developer.mozilla.org/en-US/docs/Web/API/View_Transitions_API) with cross-document animations.
      -CSS properties can be changed via [Config](https://github.com/winduum/winduum/blob/main/src/theme/config.css). +CSS properties can be changed via [Config](/docs/base/config). -[`src/base/transitions.css`](https://github.com/winduum/winduum/blob/main/src/base/transitions.css) +[`src/base/transitions.css`](https://github.com/winduum/winduum/blob/next/src/base/transitions.css) ```css @view-transition { @@ -22,7 +26,7 @@ CSS properties can be changed via [Config](https://github.com/winduum/winduum/bl Add `view-transition-main` class to any element you want to animate page navigation. -[`src/utilities/view-transition.css`](https://github.com/winduum/winduum/blob/main/src/utilities/view-transition.css) +[`src/utilities/view-transition.css`](https://github.com/winduum/winduum/blob/next/src/utilities/view-transition.css) ```css .view-transition-main { diff --git a/docs/docs/colors.md b/docs/docs/colors.md index 88a60ef..3e566ee 100644 --- a/docs/docs/colors.md +++ b/docs/docs/colors.md @@ -1,3 +1,7 @@ +--- +description: "There are few types of colors with various areas of use. Colors are defined in Theme." +--- + # Colors There are few types of colors with various areas of use. Colors are defined in [Theme](/docs/base/theme). diff --git a/docs/docs/components/badge.md b/docs/docs/components/badge.md index a535e83..05db902 100644 --- a/docs/docs/components/badge.md +++ b/docs/docs/components/badge.md @@ -1,13 +1,22 @@ +--- +description: "Small labelling component to highlight statuses, counts or categories." +--- + # Badge -
      +Small labelling component to highlight statuses, counts or categories. - + -### Usage + -```css -@import "winduum/src/components/badge/index.css" layer(utilities); -``` +## Installation +Follow instructions for individual framework usage below + +* +* +* + +## Styles ### Variants @@ -17,19 +26,12 @@ * ### Tokens -* `bordered` -* `muted` -* `sm` -* `lg` -* `square` -* `circle` - -### Installation -Follow instructions for individual framework usage below - -* -* -* +* `bordered` +* `muted` +* `sm` +* `lg` +* `square` +* `circle` ## Examples @@ -38,8 +40,8 @@ Follow instructions for individual framework usage below ::: code-group -<<< @/public/examples/components/badge/basic.html#body{} [html] -```vue +<<< @/public/examples/components/badge/basic.html#body{} [winduum] +```vue [winduum-vue] @@ -49,7 +51,7 @@ Follow instructions for individual framework usage below Badge ``` -```jsx +```jsx [winduum-react] import { Badge } from "@/components/badge" export function Example() { diff --git a/docs/docs/components/breadcrumb.md b/docs/docs/components/breadcrumb.md index d01e0ef..1c91005 100644 --- a/docs/docs/components/breadcrumb.md +++ b/docs/docs/components/breadcrumb.md @@ -1,12 +1,22 @@ +--- +description: "Displays the current page location within a navigational hierarchy." +--- + # Breadcrumb -
      - +Displays the current page location within a navigational hierarchy. -### Usage + -```css -@import "winduum/src/components/breadcrumb/index.css" layer(utilities); -``` + + +## Installation +Follow instructions for individual framework usage below + +* +* +* + +## Styles ### Variants * @@ -14,15 +24,68 @@ ### Props * -### Installation -Follow instructions for individual framework usage below - -* -* -* +## Examples -## Example +### Basic -<<< @/public/examples/components/breadcrumb.html#body{} +::: code-group +<<< @/public/examples/components/breadcrumb.html#body{} [winduum] +```vue [winduum-vue] + + + +``` +```jsx [winduum-react] +import { Breadcrumb } from '@/components/breadcrumb' +import { Link } from '@/components/link' + +export function Example() { + return ( + +
        +
      1. + + + +
      2. +
      3. + User +
      4. +
      5. + + Documents + +
      6. +
      +
      + ) +} +``` +::: diff --git a/docs/docs/components/button.md b/docs/docs/components/button.md index 8ba321c..d9eaf31 100644 --- a/docs/docs/components/button.md +++ b/docs/docs/components/button.md @@ -1,41 +1,48 @@ +--- +description: "Button component for triggering actions — works with button, a and input elements and comes in several variants and sizes." +--- + # Button -
      +Button component for triggering actions — works with `button`, `a` and `input` elements and comes in several variants and sizes. - + -### Usage + -```css -@import "winduum/src/components/button/index.css" layer(utilities); -``` +## Installation +Follow instructions for individual framework usage below + +* +* +* +* +* + +## Styles ### Variants -* -* +* +* ### Props * * -### Tokens -* `bordered` -* `muted` -* `raised` -* `ghosted` -* `sm` -* `lg` -* `square` -* `circle` -* `fill` - - -### Installation -Follow instructions for individual framework usage below +## Scripts +The Button script adds the ripple effect and keeps the loading spinner state in sync +with `data-loading`. -* -* -* -* +### Tokens +* `bordered` +* `muted` +* `raised` +* `ghosted` +* `sm` +* `lg` +* `square` +* `circle` +* `fill` +* `spinner` ## Examples @@ -44,29 +51,11 @@ Follow instructions for individual framework usage below ::: code-group -<<< @/public/examples/components/btn/basic.html#body{} [html] -```vue - - - -``` -```jsx -import { Button } from "@/components/button" - -export function Example() { - return ( - <> - - - - ) -} -``` +<<< @/public/examples/components/btn/basic.html#body{} [winduum] +<<< @/public/examples/components/button/basic.html#body{} [winduum-elements] +<<< @/../examples-stimulus/src/pages/components/button/basic.liquid#body{} [winduum-stimulus] +<<< @/../examples-vue/src/pages/components/button/basic.vue [winduum-vue] +<<< @/../examples-react/src/pages/components/button/basic.tsx [winduum-react] ::: ### Flat @@ -184,78 +173,3 @@ You can group buttons into groups via `x-group` component. <<< @/public/examples/components/btn/group.html#body{} - - -## Custom Props - -### default - -| CSS property | Default value | -|---------------------------------------|----------------------------------| -| `--x-button-inline-size` | `initial` | -| `--x-button-block-size` | `2.25rem` | -| `--x-button-padding-block` | `0.375rem` | -| `--x-button-padding-inline` | `0.75rem` | -| `--x-button-border-radius` | `var(--radius, 0.75rem)` | -| `--x-button-font-family` | `initial` | -| `--x-button-font-size` | `var(--font-size-sm, 0.875rem)` | -| `--x-button-font-weight` | `var(--font-weight-medium, 500)` | -| `--x-button-letter-spacing` | `initial` | -| `--x-button-background-color-space` | `srgb` | -| `--x-button-background-color` | `var(--color-accent)` | -| `--x-button-background-color-opacity` | `100%` | -| `--x-button-background-color-mix` | `transparent` | -| `--x-button-color-space` | `srgb` | -| `--x-button-color` | `var(--color-accent-foreground)` | -| `--x-button-color-opacity` | `100%` | -| `--x-button-color-mix` | `transparent` | -| `--x-button-border-width` | `0px` | -| `--x-button-border-color-space` | `srgb` | -| `--x-button-border-color` | `var(--color-accent)` | -| `--x-button-border-color-opacity` | `100%` | -| `--x-button-border-color-mix` | `transparent` | -| `--x-button-outline-width` | `2px` | -| `--x-button-outline-color-space` | `srgb` | -| `--x-button-outline-color` | `transparent` | -| `--x-button-outline-color-opacity` | `100%` | -| `--x-button-outline-color-mix` | `transparent` | -| `--x-button-outline-offset` | `initial` | -| `--x-button-gap` | `var(--spacing-2, 0.5rem)` | - -### interactive - -| CSS property | Default value | -|------------------------------------------------|--------------------------------------------| -| `--x-button-transition-property` | `var(--default-transition-property)` | -| `--x-button-timing-function` | `var(--transition-timing-function-in-out)` | -| `--x-button-transition-duration` | `var(--default-transition-duration)` | -| `--x-button-hover-background-color` | `var(--color-accent)` | -| `--x-button-hover-background-color-mix` | `var(--color-dark)` | -| `--x-button-hover-background-color-opacity` | `80%` | -| `--x-button-hover-border-color` | `var(--color-accent)` | -| `--x-button-hover-border-color-mix` | `transparent` | -| `--x-button-hover-border-color-opacity` | `100%` | -| `--x-button-hover-color` | `var(--color-accent-foreground)` | -| `--x-button-hover-color-mix` | `transparent` | -| `--x-button-hover-color-opacity` | `100%` | -| `--x-button-focus-outline-offset` | `2px` | -| `--x-button-focus-outline-color` | `var(--color-accent)` | -| `--x-button-focus-outline-color-opacity` | `50%` | -| `--x-button-active-background-color` | `var(--color-accent)` | -| `--x-button-active-background-color-mix` | `var(--color-dark)` | -| `--x-button-active-background-color-opacity` | `90%` | -| `--x-button-active-border-color` | `var(--color-accent)` | -| `--x-button-active-border-color-mix` | `transparent` | -| `--x-button-active-border-color-opacity` | `100%` | -| `--x-button-active-color` | `var(--color-accent-foreground)` | -| `--x-button-active-color-mix` | `transparent` | -| `--x-button-active-color-opacity` | `100%` | -| `--x-button-disabled-background-color` | `var(--color-accent)` | -| `--x-button-disabled-background-color-mix` | `transparent` | -| `--x-button-disabled-background-color-opacity` | `50%` | -| `--x-button-disabled-border-color` | `var(--color-accent)` | -| `--x-button-disabled-border-color-mix` | `transparent` | -| `--x-button-disabled-border-color-opacity` | `50%` | -| `--x-button-disabled-color` | `var(--color-accent-foreground)` | -| `--x-button-disabled-color-mix` | `transparent` | -| `--x-button-disabled-color-opacity` | `50%` | diff --git a/docs/docs/components/card.md b/docs/docs/components/card.md index b139651..1cff5af 100644 --- a/docs/docs/components/card.md +++ b/docs/docs/components/card.md @@ -1,12 +1,22 @@ +--- +description: "Content container for grouping related information and actions." +--- + # Card -
      - +Content container for grouping related information and actions. -### Usage + -```css -@import "winduum/src/components/card/index.css" layer(utilities); -``` + + +## Installation +Follow instructions for individual framework usage below + +* +* +* + +## Styles ### Variants * @@ -14,20 +24,47 @@ ### Props * -### Installation -Follow instructions for individual framework usage below - -* -* -* - ## Examples ### Default -<<< @/public/examples/components/card/default.html#body{} +::: code-group +<<< @/public/examples/components/card/default.html#body{} [winduum] +```vue [winduum-vue] + + + +``` +```jsx [winduum-react] +import { Card } from '@/components/card' +import { Heading } from '@/components/heading' +import { Text } from '@/components/text' + +export function Example() { + return ( + + Card title + + Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nulla accumsan, elit sit amet varius semper, nulla mauris mollis quam, tempor suscipit diam nulla vel leo. Lorem ipsum dolor sit amet + + + ) +} +``` +::: ### Image diff --git a/docs/docs/components/carousel-experimental.md b/docs/docs/components/carousel-experimental.md new file mode 100644 index 0000000..b461c18 --- /dev/null +++ b/docs/docs/components/carousel-experimental.md @@ -0,0 +1,135 @@ +--- +description: "Provides an experimental scroll carousel built around emerging native carousel APIs." +--- + +# Carousel Experimental +Provides an experimental scroll carousel that uses native CSS `scroll-snap` and emerging carousel-related browser APIs. + +The carousel is CSS-first — scrolling, snapping and layout are handled by CSS alone. + +A small JavaScript layer mirrors the behavior of +[CSS Native Carousels](https://developer.mozilla.org/en-US/docs/Web/CSS/Guides/Overflow/Carousels), +so you can build carousels like [chrome.dev/carousel](https://chrome.dev/carousel/) +without using `::scroll-button()`, `::scroll-marker-group` and `::scroll-marker` directly. + +::: warning Experimental browser support +This version depends on emerging browser APIs whose support is still incomplete. Not all required APIs have polyfills, so behavior cannot yet be made consistent across all supported browsers. Use the [stable Carousel](/docs/components/carousel) when broad browser compatibility is required. +::: + + + + + +## Installation +Follow instructions for individual framework usage below + +* +* +* +* +* + +## Styles + +### Variants +* +* + +## Scripts +The Carousel script wires marker and navigation controls and keeps the active snap +and scroll edge state in sync. + +## Examples + +### Basic + + + +::: code-group +<<< @/public/examples/components/carousel-experimental/basic.html#body{} [winduum-elements] +<<< @/../examples-stimulus/src/pages/components/carousel-experimental/basic.liquid#body{} [winduum-stimulus] +<<< @/../examples-vue/src/pages/components/carousel-experimental/basic.vue [winduum-vue] +<<< @/../examples-react/src/pages/components/carousel-experimental/basic.tsx [winduum-react] +::: + +### Full + + + +::: code-group +<<< @/public/examples/components/carousel-experimental/full.html#body{} [winduum-elements] +<<< @/../examples-stimulus/src/pages/components/carousel-experimental/full.liquid#body{} [winduum-stimulus] +<<< @/../examples-vue/src/pages/components/carousel-experimental/full.vue [winduum-vue] +<<< @/../examples-react/src/pages/components/carousel-experimental/full.tsx [winduum-react] +::: + +## JavaScript API + +Low-level helpers used by `winduum-elements`, `winduum-stimulus`, `winduum-vue` and `winduum-react` — you can use them to build your own integration. + +### `scrollBy` + +* **Type:** `(element: HTMLElement, options: { direction?: number, vertical?: boolean, ratio?: number }) => void` +* **Kind:** `sync` + +Scrolls the carousel content by a portion of its visible size. +`direction` is `1` (next) or `-1` (prev), `ratio` determines how much of the visible size is scrolled (default `0.85`). + +```js +import { scrollBy } from 'winduum/src/components/carousel-experimental' + +nextElement.addEventListener('click', () => scrollBy(contentElement, { direction: 1 })) +prevElement.addEventListener('click', () => scrollBy(contentElement, { direction: -1 })) +``` + +### `toggleScrollState` + +* **Type:** `(element: HTMLElement, options: { prevElement?: HTMLButtonElement, nextElement?: HTMLButtonElement, vertical?: boolean }) => void` +* **Kind:** `sync` + +Updates the carousel scroll state — toggles `data-scroll-start`, `data-scroll-end` and `data-scroll-none` +attributes on the content element and disables the prev/next buttons at the edges. Call it on `scroll`. + +```js +contentElement.addEventListener('scroll', () => { + toggleScrollState(contentElement, { prevElement, nextElement }) +}) +``` + +### `setCurrentAttribute` + +* **Type:** `(element: HTMLElement, index: number, attributeName?: string) => void` +* **Kind:** `sync` + +Marks the child at `index` with the given attribute (default `aria-current`) and removes it from the previous one. + +### `setSnappedAttribute` + +* **Type:** `(element: HTMLElement, target: HTMLElement, markerGroupElement?: HTMLElement) => void` +* **Kind:** `sync` + +Sets `data-snapped` on the currently snapped item and syncs `aria-current` in the marker group. +Designed for the [`scrollsnapchanging`](https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollsnapchanging_event) event. + +```js +contentElement.addEventListener('scrollsnapchanging', (event) => { + setSnappedAttribute(contentElement, event.snapTargetInline ?? event.snapTargetBlock, markerGroupElement) +}) +``` + +### `scrollToMarker` + +* **Type:** `(element: HTMLElement, target: HTMLElement, markerGroupElement: HTMLElement, scrollIntoViewOptions?: ScrollIntoViewOptions) => void` +* **Kind:** `sync` + +Scrolls the carousel to the item referenced by a marker (an anchor with `href="#slide-id"`) and updates the marker state. + +```js +markerElements.forEach((marker) => { + marker.addEventListener('click', (event) => { + event.preventDefault() + + scrollToMarker(contentElement, event.target, markerGroupElement) + }) +}) +``` diff --git a/docs/docs/components/carousel.md b/docs/docs/components/carousel.md index e1d5268..8e8518b 100644 --- a/docs/docs/components/carousel.md +++ b/docs/docs/components/carousel.md @@ -1,25 +1,37 @@ +--- +description: "Provides a broadly compatible scroll carousel built with native CSS scroll snapping." +--- + # Carousel -Provides a scroll carousel that uses native CSS `scroll-snap` property.
      +Provides a scroll carousel that uses the native CSS `scroll-snap` property. - +The carousel is CSS-first — scrolling, snapping and layout are handled by CSS. The optional JavaScript layer adds navigation, pagination, counters, progress, autoplay and drag helpers. -### Usage -::: code-group -```css -@import "winduum/src/components/carousel/index.css" layer(utilities); -``` -<<< @/public/examples/components/carousel/basic.html#body{} [html] -<<< @/../examples/src/pages/components/carousel/basic.liquid#js{} [js] +::: info Experimental version +An [experimental Carousel](/docs/components/carousel-experimental) is also available. It follows emerging native carousel APIs more closely, but browser support is still incomplete and not all required APIs have polyfills. Use this stable version when broad browser compatibility is required. ::: + + + + +## Installation +Follow the instructions for your integration: + +* +* +* +* +* + +## Styles + ### Variants * * -### Installation -Follow instructions for individual framework usage below - -* +## Scripts +The Carousel script keeps counters, progress, pagination and scroll-edge state in sync. Navigation can move by one item or scroll directly to an item by index. ## Examples @@ -28,8 +40,10 @@ Follow instructions for individual framework usage below ::: code-group -<<< @/public/examples/components/carousel/basic.html#body{} [html] -<<< @/../examples/src/pages/components/carousel/basic.liquid#js{} [js] +<<< @/public/examples/components/carousel/basic.html#body{} [winduum-elements] +<<< @/../examples-stimulus/src/pages/components/carousel/basic.liquid#body{} [winduum-stimulus] +<<< @/../examples-vue/src/pages/components/carousel/basic.vue [winduum-vue] +<<< @/../examples-react/src/pages/components/carousel/basic.tsx [winduum-react] ::: ### Full @@ -37,190 +51,153 @@ Follow instructions for individual framework usage below ::: code-group -<<< @/public/examples/components/carousel/full.html#body{} [html] -<<< @/../examples/src/pages/components/carousel/full.liquid#js{} [js] +<<< @/public/examples/components/carousel/full.html#body{} [winduum-elements] +<<< @/../examples-stimulus/src/pages/components/carousel/full.liquid#body{} [winduum-stimulus] +<<< @/../examples-vue/src/pages/components/carousel/full.vue [winduum-vue] +<<< @/../examples-react/src/pages/components/carousel/full.tsx [winduum-react] ::: +## JavaScript API -## Javascript API +Low-level helpers used by `winduum-elements`, `winduum-stimulus`, `winduum-vue` and `winduum-react` — you can also use them to build your own integration. ### `scrollTo` -* **Type:** `(element: HTMLElement | Element, index: number) => void` +* **Type:** `(element: HTMLElement | Element, index?: number) => void` * **Kind:** `sync` -Scroll to a snap item by its index. +Scrolls to a carousel item by its index. ### `scrollNext` * **Type:** `(element: HTMLElement | Element) => void` * **Kind:** `sync` -Scroll to the next snap item. +Scrolls to the next item based on the active index set by `observeCarousel`. ### `scrollPrev` * **Type:** `(element: HTMLElement | Element) => void` * **Kind:** `sync` -Scroll to a previous snap item. +Scrolls to the previous item based on the active index set by `observeCarousel`. ### `getItemCount` -* **Type:** `(element: HTMLElement | Element, scrollWidth: number, mathFloor: boolean) => number` +* **Type:** `(element: HTMLElement | Element, scrollWidth?: number, mathFloor?: boolean) => number` * **Kind:** `sync` -Get the number of possible scrolls inside the carousel. - +Returns the number of possible carousel positions. ### `observeCarousel` -* **Type:** `(element: HTMLElement | Element, options?: ObserveCarouselOptions) => void` +* **Type:** `(element: HTMLElement | Element, options?: ObserveCarouselOptions) => IntersectionObserver` * **Kind:** `sync` -Adds an observer for the carousel. Adds properties `_observer` and `_activeIndex` to the DOM of the carousel `element`. - -#### ObserveCarouselOptions +Observes carousel items, toggles a visibility attribute and stores `_observer` and `_activeIndex` on the content element. ---- +#### `ObserveCarouselOptions` -##### visibleAttribute +##### `visibleAttribute` * **Type:** `string` * **Default:** `data-visible` -A class that is added to the carousel items once they are visible. - ---- +Attribute added to carousel items while they intersect the carousel viewport. -##### observerOptions +##### `observerOptions` * **Type:** `IntersectionObserverInit` -* **Default:** `{ threshold: 0.5 }` +* **Default:** `{ threshold: 0.75 }` -Additional [options](https://developer.mozilla.org/en-US/docs/Web/API/IntersectionObserver/IntersectionObserver#options) confugration for the observer. - ---- +Additional configuration for the underlying `IntersectionObserver`. ### `dragCarousel` * **Type:** `(element: HTMLElement | Element, options?: DragCarouselOptions) => void` * **Kind:** `sync` -Adds a mouse dragging capability to the carousel. - -#### DragCarouselOptions +Adds mouse dragging on devices with a fine pointer. ---- +#### `DragCarouselOptions` -##### activeAttribute +##### `activeAttribute` * **Type:** `string` * **Default:** `data-grabbing` ---- - ### `paginationCarousel` * **Type:** `(element: HTMLElement | Element, options?: PaginationCarouselOptions) => void` * **Kind:** `sync` -Inserts pagination indicators for the carousel to the desired element. +Creates pagination items and wires them to the carousel. -#### PaginationCarouselOptions +#### `PaginationCarouselOptions` ---- - -##### element +##### `element` * **Type:** `HTMLElement | Element` * **Default:** `undefined` ---- - -##### itemContent +##### `itemContent` * **Type:** `string` * **Default:** `` ---- - -##### activeAttribute +##### `activeAttribute` * **Type:** `string` * **Default:** `data-active` ---- - ### `autoplayCarousel` * **Type:** `(element: HTMLElement | Element, options?: AutoplayCarouselOptions) => void` * **Kind:** `sync` -Adds an autoplay for the carousel. - -#### AutoplayCarouselOptions +Automatically advances the carousel and restarts from the beginning after the final item. ---- +#### `AutoplayCarouselOptions` -##### delay +##### `delay` * **Type:** `number` * **Default:** `4000` -Delay in ms. - ---- +Delay in milliseconds. -##### pauseElements +##### `pauseElements` -* **Type:** `HTMLElement[] | Element[]` +* **Type:** `(HTMLElement | Element)[]` * **Default:** `[]` -Which elements should pause the autoplay upon hover. - ---- +Elements that pause autoplay while hovered. ### `scrollCarousel` * **Type:** `(element: HTMLElement | Element, options?: ScrollCarouselOptions) => void` * **Kind:** `sync` -A helper function that updates various carousel states upon scroll. - -#### ScrollCarouselOptions +Updates pagination, progress and counter state after scrolling. ---- - -##### observe - -* **Type:** `ObserveCarouselOptions` -* **Default:** `undefined` - ---- +#### `ScrollCarouselOptions` -##### pagination +##### `pagination` * **Type:** `PaginationCarouselOptions` -* **Default:** `{ activeClass: 'active' }` +* **Default:** `{ activeAttribute: 'data-active' }` ---- - -##### progressElement +##### `progressElement` * **Type:** `HTMLProgressElement | Element` * **Default:** `undefined` ---- - -##### counterMinElement +##### `counterMinElement` * **Type:** `HTMLElement | Element` * **Default:** `undefined` ---- - -##### counterMaxElement +##### `counterMaxElement` * **Type:** `HTMLElement | Element` * **Default:** `undefined` diff --git a/docs/docs/components/check.md b/docs/docs/components/check.md index 9107cbe..83e7a80 100644 --- a/docs/docs/components/check.md +++ b/docs/docs/components/check.md @@ -1,13 +1,24 @@ +--- +description: "Check supports checkbox and radio input types" +--- + # Check Check supports `checkbox` and `radio` **input** types - + -### Usage + -```css -@import "winduum/src/components/check/index.css" layer(utilities); -``` +## Installation +Follow instructions for individual framework usage below + +* +* +* +* +* + +## Styles ### Variants * @@ -18,13 +29,6 @@ Check supports `checkbox` and `radio` **input** types * * -### Installation -Follow instructions for individual framework usage below - -* -* -* - ## Examples ### Basic @@ -32,8 +36,8 @@ Follow instructions for individual framework usage below ::: code-group -<<< @/public/examples/components/checkbox/basic.html#body{} [html] -```vue +<<< @/public/examples/components/checkbox/basic.html#body{} [winduum] +```vue [winduum-vue] @@ -48,7 +52,7 @@ Follow instructions for individual framework usage below ``` -```jsx +```jsx [winduum-react] import { Check } from "@/components/check" export function Example() { @@ -70,42 +74,41 @@ export function Example() { ::: code-group -<<< @/public/examples/components/radio/basic.html#body{} [html] -```vue +<<< @/public/examples/components/radio/basic.html#body{} [winduum] +```vue [winduum-vue] ``` -```jsx -import { UiCheck } from "@/components/check" +```jsx [winduum-react] +import { Check } from "@/components/check" export function Example() { return ( <> - + Radio - - + + - + ) } ``` ::: - ### Label diff --git a/docs/docs/components/color.md b/docs/docs/components/color.md index 5694663..91ac4ba 100644 --- a/docs/docs/components/color.md +++ b/docs/docs/components/color.md @@ -1,13 +1,22 @@ +--- +description: "Color supports checkbox and radio input types for displaying selected color." +--- + # Color Color supports `checkbox` and `radio` **input** types for displaying selected color. - + -### Usage + -```css -@import "winduum/src/components/color/index.css" layer(utilities); -``` +## Installation +Follow instructions for individual framework usage below + +* +* +* + +## Styles ### Variants * @@ -17,13 +26,6 @@ Color supports `checkbox` and `radio` **input** types for displaying selected co * * -### Installation -Follow instructions for individual framework usage below - -* -* -* - ## Examples ### Basic @@ -31,8 +33,8 @@ Follow instructions for individual framework usage below ::: code-group -<<< @/public/examples/components/color/basic.html#body{} [html] -```vue +<<< @/public/examples/components/color/basic.html#body{} [winduum] +```vue [winduum-vue] @@ -49,7 +51,7 @@ Follow instructions for individual framework usage below ``` -```jsx +```jsx [winduum-react] import { Color } from "@/components/color" export function Example() { @@ -75,4 +77,3 @@ export function Example() { <<< @/public/examples/components/color/disabled.html#body{} - diff --git a/docs/docs/components/compare.md b/docs/docs/components/compare.md index e0f4d88..9c0e08e 100644 --- a/docs/docs/components/compare.md +++ b/docs/docs/components/compare.md @@ -1,21 +1,31 @@ +--- +description: "Side-by-side comparison slider component." +--- + # Compare Side-by-side comparison slider component. - + -### Usage + + +## Installation +Follow instructions for individual framework usage below + +* +* +* +* +* + +## Styles -```css -@import "winduum/src/components/compare/index.css" layer(utilities); -``` ### Variants * -### Installation -Follow instructions for individual framework usage below - -* -* +## Scripts +The Compare script updates the comparison position and adjusts the range step for +keyboard and pointer interaction. ## Examples @@ -24,8 +34,10 @@ Follow instructions for individual framework usage below ::: code-group -<<< @/public/examples/components/compare/default.html#body{} [html] -<<< @/../examples/src/pages/components/compare/default.liquid#js{} [js] +<<< @/public/examples/components/compare/default.html#body{} [winduum-elements] +<<< @/../examples-stimulus/src/pages/components/compare/default.liquid#body{} [winduum-stimulus] +<<< @/../examples-vue/src/pages/components/compare/default.vue [winduum-vue] +<<< @/../examples-react/src/pages/components/compare/default.tsx [winduum-react] ::: ### Text @@ -33,17 +45,41 @@ Follow instructions for individual framework usage below ::: code-group -<<< @/public/examples/components/compare/text.html#body{} [html] -<<< @/../examples/src/pages/components/compare/text.liquid#js{} [js] +<<< @/public/examples/components/compare/text.html#body{} [winduum-elements] +<<< @/../examples-stimulus/src/pages/components/compare/text.liquid#body{} [winduum-stimulus] +<<< @/../examples-vue/src/pages/components/compare/text.vue [winduum-vue] +<<< @/../examples-react/src/pages/components/compare/text.tsx [winduum-react] ::: -## Javascript API +## JavaScript API + +Low-level helpers used by `winduum-elements` and `winduum-stimulus` — you can use them to wire the component manually or build your own integration. + +All three helpers work with the `` element inside `.x-compare` — attach them to its events: -### setPosition +```js +import { setPosition, setKeyboardStep, setMouseStep } from 'winduum/src/components/compare' + +document.querySelectorAll('.x-compare input[type="range"]').forEach((inputElement) => { + inputElement.addEventListener('input', (event) => setPosition(event.target)) + + inputElement.addEventListener('keydown', (event) => setKeyboardStep(event.target, event.key)) + + inputElement.addEventListener('mousedown', (event) => setMouseStep(event.target)) +}) +``` + +### `setPosition` * **Type:** `(element: HTMLInputElement, options?: SetPositionOptions) => void` * **Kind:** `sync` +Sets the `--x-compare-position` CSS property on the closest `.x-compare` element to the current input value. Call it on the `input` event. + +```js +inputElement.addEventListener('input', (event) => setPosition(event.target)) +``` + #### SetPositionOptions --- @@ -62,14 +98,26 @@ Follow instructions for individual framework usage below --- -### setKeyboardStep +### `setKeyboardStep` -* **Type:** `(element: HTMLInputElement, key: string, step?: number) => void` +* **Type:** `(element: HTMLInputElement, key: string, step?: string) => void` * **Kind:** `sync` +* **Default step:** `'10'` + +Sets a larger input `step` when `ArrowLeft` or `ArrowRight` is pressed, so keyboard users move the slider in bigger increments. Call it on the `keydown` event. +```js +inputElement.addEventListener('keydown', (event) => setKeyboardStep(event.target, event.key)) +``` -### setMouseStep +### `setMouseStep` -* **Type:** `(element: HTMLInputElement, step?: number) => void` +* **Type:** `(element: HTMLInputElement, step?: string) => void` * **Kind:** `sync` +* **Default step:** `'0.1'` + +Restores a fine input `step` for smooth mouse dragging. Call it on the `mousedown` event. +```js +inputElement.addEventListener('mousedown', (event) => setMouseStep(event.target)) +``` diff --git a/docs/docs/components/control.md b/docs/docs/components/control.md index f327c05..2bf331f 100644 --- a/docs/docs/components/control.md +++ b/docs/docs/components/control.md @@ -1,3 +1,7 @@ +--- +description: "Form control as it should be!" +--- + # Control Form control as it should be! @@ -9,21 +13,20 @@ Other input types are supported in other components * `range` - included in [Range](/docs/components/range) * `button`, `reset`, `submit` - included in [Button](/docs/components/button) - + + + -### Installation +## Installation Follow instructions for individual framework usage below -* +* +* +* * * -* - -### Usage -```css -@import "winduum/src/components/control/index.css" layer(utilities); -``` +## Styles ### Variants * @@ -35,6 +38,8 @@ Follow instructions for individual framework usage below * * * +* +* * ### Props @@ -42,40 +47,25 @@ Follow instructions for individual framework usage below * * * +* * -## Examples +## Scripts +The Control script keeps `data-active` in sync with the control value and adds helper +actions for steppers, picker opening and tel country code mirroring. + +## Examples ### Basic ::: code-group -<<< @/public/examples/components/input/basic.html#body{} [html] -```vue - - - -``` -```jsx -import { Control } from "@/components/control" - -export function Example() { - return ( - <> - - - - - ) -} -``` +<<< @/public/examples/components/input/basic.html#body{} [winduum] +<<< @/public/examples/components/control/basic.html#body{} [winduum-elements] +<<< @/../examples-stimulus/src/pages/components/control/basic.liquid#body{} [winduum-stimulus] +<<< @/../examples-vue/src/pages/components/control/basic.vue [winduum-vue] +<<< @/../examples-react/src/pages/components/control/basic.tsx [winduum-react] ::: ### Icon @@ -105,6 +95,14 @@ You can position any content to `start` and `end` of the control.
      Padding is <<< @/public/examples/components/select/basic.html#body{} +### Tel Country Code + +Combine a country calling code selector with a national phone number. The Control script mirrors the selected code into the adjacent `span` while keeping the full country names available in the native select. + + + +<<< @/public/examples/components/control/tel-country-code.html#body{} + ### Placeholder diff --git a/docs/docs/components/details.md b/docs/docs/components/details.md index 768fe77..72d79f7 100644 --- a/docs/docs/components/details.md +++ b/docs/docs/components/details.md @@ -1,54 +1,32 @@ -# Details - -An accessible accordion or toggle component for `details` and `summary` elements.
      -Uses small external library `slide-element` for smooth toggle animations. +--- +description: "An accessible accordion or toggle component for details and summary elements." +--- -It is unstyled by default, so you can apply your own styles. +# Details - +An accessible accordion or toggle component for `details` and `summary` elements. -### Dependencies + -* [slide-element](https://www.npmjs.com/package/slide-element) + -### Usage -::: code-group -```shell -npm i slide-element -``` -```html -
      - - Show more - - - - -
      -
      - Details content -
      -
      -
      -``` -```js -import { toggleDetails } from 'winduum/src/components/details' +## Installation +Follow instructions for individual framework usage below -document.querySelectorAll('[data-action="toggleDetails"]').forEach(summary => { - summary.addEventListener('click', event => { - if (event.currentTarget.tagName !== 'INPUT') event.preventDefault() +* +* +* +* +* - toggleDetails(summary) - }) -}) -``` -::: +## Styles -### Installation -Follow instructions for individual framework usage below +### Variants +* -* -* +## Scripts +The Details script keeps a checkbox inside `summary` in sync with the native +`details[open]` state. ## Examples @@ -57,57 +35,96 @@ Follow instructions for individual framework usage below ::: code-group -<<< @/public/examples/components/details/default.html#body{} [html] -<<< @/../examples/src/pages/components/details/default.liquid#js{} [js] +<<< @/public/examples/components/details/default.html#body{} [winduum] +```vue [winduum-vue] + + + +``` +```jsx [winduum-react] +import { Details } from '@/components/details' + +export function Example() { + return ( +
      + + Show more + + + + +
      + Details content +
      +
      + ) +} +``` ::: ### Checkbox +You can also control details with a checkbox inside `summary` — only a tiny script is needed to sync the checkbox state. +It's provided by the [`toggleDetails`](#toggledetails) helper and wired up by the `winduum-elements`, `winduum-stimulus`, +`winduum-vue` and `winduum-react` integrations below. + ::: code-group -<<< @/public/examples/components/details/checkbox.html#body{} [html] -<<< @/../examples/src/pages/components/details/checkbox.liquid#js{} [js] +<<< @/public/examples/components/details/checkbox.html#body{} [winduum-elements] +<<< @/../examples-stimulus/src/pages/components/details/checkbox.liquid#body{} [winduum-stimulus] +<<< @/../examples-vue/src/pages/components/details/checkbox.vue [winduum-vue] +<<< @/../examples-react/src/pages/components/details/checkbox.tsx [winduum-react] ::: ### Accordion - - -::: code-group -<<< @/public/examples/components/details/accordion.html#body{} [html] -<<< @/../examples/src/pages/components/details/accordion.liquid#js{} [js] -::: - +Exclusive accordions use the native `name` attribute — details elements sharing the same `name` close each other automatically. -## Javascript API + -```typescript -interface DefaultOptions { - selector?: string - summarySelector?: string -} -``` +<<< @/public/examples/components/details/accordion.html#body{} -### toggleDetails +## JavaScript API -* **Type:** `(selector: HTMLInputElement | HTMLElement, options?: DefaultOptions) => Promise` -* **Kind:** `async` +Low-level helper used by `winduum-elements`, `winduum-stimulus`, `winduum-vue` and `winduum-react` — +you can use it to wire the checkbox sync manually or build your own integration. -Toggles a details element, should be added on summary or anywhere inside the details element. +```js +import { toggleDetails } from 'winduum/src/components/details' -### showDetails +document.querySelectorAll('.x-details summary input[type="checkbox"]').forEach((inputElement) => { + inputElement.addEventListener('change', (event) => toggleDetails(event.target)) +}) +``` -* **Type:** `(selector: HTMLInputElement | HTMLElement, options?: DefaultOptions) => Promise` -* **Kind:** `async` +### `toggleDetails` -Shows a details element, should be added on `summary` or anywhere inside the `details` element. +* **Type:** `(element: HTMLInputElement, options?: ToggleDetailsOptions) => void` +* **Kind:** `sync` -### closeDetails +Toggles the `open` attribute of the closest `details` element to match the checkbox `checked` state. +Call it on the `change` event of a checkbox inside `summary`. -* **Type:** `(selector: HTMLInputElement | HTMLElement, options?: DefaultOptions) => Promise` -* **Kind:** `async` +#### ToggleDetailsOptions -Closes a details element, should be added on `summary` or anywhere inside the `details` element. +--- +##### selector +* **Type:** `string` +* **Default:** `details` diff --git a/docs/docs/components/dialog.md b/docs/docs/components/dialog.md index 74930ba..e93046b 100644 --- a/docs/docs/components/dialog.md +++ b/docs/docs/components/dialog.md @@ -1,239 +1,78 @@ +--- +description: "Modal component that uses native HTML5 dialog functionality." +--- + # Dialog Modal component that uses native HTML5 `dialog` functionality. - +Dialogs are fully controlled by the web platform — opening and closing is handled with +native [Invoker Commands](https://developer.mozilla.org/en-US/docs/Web/API/Invoker_Commands_API) +(`command` / `commandfor`) and the [`closedby`](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/dialog#closedby) +attribute, so no JavaScript API is needed. -## Usage + -::: code-group -```css -@import "winduum/src/components/dialog/index.css" layer(utilities); -``` -```js -import { showDialog } from 'winduum/src/components/dialog' + -document.querySelector('#showDialog').addEventListener('click', () => { - showDialog(document.querySelector('dialog')) -}) -``` -```vue - - - -``` +## Installation +Follow instructions for individual framework usage below + +* +* +* + +::: info Browser support +The `dialog` element is Baseline. For older browsers cover +[Invoker Commands](https://developer.mozilla.org/en-US/docs/Web/API/Invoker_Commands_API) with [invokers-polyfill](https://www.npmjs.com/package/invokers-polyfill) — +the [`closedby`](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/dialog#closedby) attribute is covered by the +[side-effect script](#javascript) below. See [Polyfills](/docs/polyfills). ::: +## Styles + ### Variants * * +* ### Props * * +## Examples -### Installation -Follow instructions for individual framework usage below +### Basic -* -* -* -* - -## Example - -
      - -
      - - -
      -
      Example dialog
      -
      -
      -

      You can close this dialog with Esc, clicking outside, or by form submit

      -
      -
      - -
      -
      + ::: code-group -```html - - - -
      -
      Example dialog
      -
      -
      -

      You can close this dialog with Esc, clicking outside, or by form submit

      -
      -
      - -
      -
      - - -``` -```vue - - - - -``` +<<< @/public/examples/components/dialog/basic.html#body{} [winduum] +<<< @/../examples-stimulus/src/pages/components/dialog/basic.liquid#body{} [winduum-stimulus] +<<< @/../examples-vue/src/pages/components/dialog/basic.vue [winduum-vue] +<<< @/../examples-react/src/pages/components/dialog/basic.tsx [winduum-react] ::: -## JavaScript API - -### `showDialog` - -* **Type:** `(selector: HTMLDialogElement, options?: DefaultOptions) => Promise` -* **Kind:** `async` +## Accessibility -Shows an existing ``. It takes a `selector` argument, which is a CSS selector that identifies the dialog DOM element to be displayed. It also takes an options argument, which is an object that specifies how the dialog should be displayed. +The native `dialog` element provides accessibility out of the box — `showModal()` moves focus into the dialog, makes the rest of the page inert, closes on Esc and returns focus to the trigger on close. Light-dismiss behavior is controlled declaratively with the `closedby` attribute. -The `closeDialog` event is sent upon closing with the `esc` key or clicking outside the dialog content window. +## JavaScript -#### Example +Always include the dialog side-effect script in every installation variant: ```js -import { showDialog } from 'winduum/src/libraries/dialog' - -document.querySelector('#showDialog').addEventListener('click', async () => { - await showDialog(document.querySelector('#dialogElement')) -}) +import '/src/components/dialog/index.js' ``` -
      - -#### `DefaultOptions` - ---- - -##### remove - -* **Type:** `boolean` -* **Default:** `true` - -A boolean that indicates whether the dialog should be removed from the DOM when it is closed. - ---- - -##### closable - -* **Type:** `boolean` -* **Default:** `true` - -A boolean that indicates whenever is dialog closable by clicking outside or with `esc` key. ---- - -##### modal - -* **Type:** `boolean` -* **Default:** `true` - -Determines if the dialog is shown as modal on top-layer. - ---- - -##### openAttribute - -* **Type:** `string` -* **Default:** `data-open` - -A string representing a data attribute that will be added when the dialog is fully visible. - ---- - -##### closedAttribute - -* **Type:** `string` -* **Default:** `data-closed` - -A string representing a data attribute that will be added once the dialog starts closing. - ---- - -##### contentSelector - -* **Type:** `string` -* **Default:** `.x-dialog-content` - -A string representing a CSS selector representing the dialog content - ---- - -##### scrollbarWidthProperty - -* **Type:** `string` -* **Default:** `--default-scrollbar-width` - -A CSS property representing a scrollbar width, when dialog is shown the document scrollbar is hidden, this adds necessary padding. - ---- - -
      - -### `closeDialog` - -* **Type:** `(selector: HTMLDialogElement, options?: DefaultOptions) => Promise` -* **Kind:** `async` - -Closes an existing ``. -It takes a `selector` argument, which is a CSS selector that identifies the dialog DOM element. -It also takes an `options` argument, which is an object that specifies how the dialog should be closed. - -When dialog closes it sends native `close` event you can listen to, -additionally `x-dialog:close` event is sent when dialog animation starts. - -#### Example +There is no JavaScript API — dialogs use the native [`HTMLDialogElement`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLDialogElement) +interface. If you need to control a dialog programmatically, use the native methods directly ```js -import { closeDialog } from 'winduum/src/components/dialog' - -document.querySelector('#closeDialog').addEventListener('click', async () => { - await closeDialog(document.querySelector('#dialogElement')) -}) +document.querySelector('#dialogExample').showModal() +document.querySelector('#dialogExample').close() ``` +The `winduum/src/components/dialog` side-effect script additionally + +* closes an open dialog when clicking its backdrop, based on the `closedby` attribute (fallback for browsers without native `closedby` support) +* keeps `--default-scrollbar-width` on `` updated via a `ResizeObserver`, which the dialog CSS uses to compensate for the hidden page scrollbar diff --git a/docs/docs/components/drawer.md b/docs/docs/components/drawer.md index cfc8c94..5727605 100644 --- a/docs/docs/components/drawer.md +++ b/docs/docs/components/drawer.md @@ -1,198 +1,203 @@ +--- +description: "Provides a scroll drawer that uses native HTML5 dialog and CSS scroll-snap property." +--- + # Drawer Provides a scroll drawer that uses native HTML5 `dialog` and CSS `scroll-snap` property.
      Can be dismissed with touch gestures on touch devices. - +The drawer is opened with native [Invoker Commands](https://developer.mozilla.org/en-US/docs/Web/API/Invoker_Commands_API) +(`command="show-modal"` / `command="request-close"`) and the scroll behavior is driven by the `Drawer` custom element from +[winduum-elements](https://github.com/winduum/winduum-elements/tree/main/components/drawer) +(or the [winduum-stimulus](https://github.com/winduum/winduum-stimulus/tree/main/components/drawer) controller). +Thanks to the `noscript` variant, the drawer degrades gracefully even without JavaScript. -### Usage -::: code-group -```css -@import "winduum/src/components/drawer/index.css" layer(utilities); -``` -<<< @/public/examples/components/drawer/left.html#body{} [html] -<<< @/../examples/src/pages/components/drawer/left.liquid#js{} [js] + + + + +## Installation +Follow instructions for individual framework usage below + +* +* +* +* +* + +::: info Browser support +For older browsers cover [Invoker Commands](https://developer.mozilla.org/en-US/docs/Web/API/Invoker_Commands_API) with +[invokers-polyfill](https://www.npmjs.com/package/invokers-polyfill) and — when using `winduum-elements` — customized built-in elements with +[@webreflection/custom-elements-builtin](https://www.npmjs.com/package/@webreflection/custom-elements-builtin). +Missing [`scroll-initial-target`](https://developer.mozilla.org/en-US/docs/Web/CSS/scroll-initial-target) support is handled by the +[`showDrawer`](#showdrawer) helper itself. See [Polyfills](/docs/polyfills). ::: +## Styles + ### Variants * * +* +* +* ### Props * * -### Installation -Follow instructions for individual framework usage below - -* -* +## Scripts +The Drawer script connects the dialog open flow with drawer snapping, swipe dismissal +and trigger `aria-expanded` state. ## Examples ### Left -
      - -
      - - -
      -
      Drawer content
      - -
      -
      + ::: code-group -<<< @/public/examples/components/drawer/left.html#body{} [html] -<<< @/../examples/src/pages/components/drawer/left.liquid#js{} [js] +<<< @/public/examples/components/drawer/left.html#body{} [winduum-elements] +<<< @/../examples-stimulus/src/pages/components/drawer/left.liquid#body{} [winduum-stimulus] +<<< @/../examples-vue/src/pages/components/drawer/left.vue [winduum-vue] +<<< @/../examples-react/src/pages/components/drawer/left.tsx [winduum-react] ::: ### Right -
      - -
      - - -
      -
      Drawer content
      - -
      -
      + ::: code-group -<<< @/public/examples/components/drawer/right.html#body{} [html] -<<< @/../examples/src/pages/components/drawer/right.liquid#js{} [js] +<<< @/public/examples/components/drawer/right.html#body{} [winduum-elements] +<<< @/../examples-stimulus/src/pages/components/drawer/right.liquid#body{} [winduum-stimulus] +<<< @/../examples-vue/src/pages/components/drawer/right.vue [winduum-vue] +<<< @/../examples-react/src/pages/components/drawer/right.tsx [winduum-react] ::: - ### Bottom -
      - -
      - - -
      -
      Drawer content
      - -
      -
      + ::: code-group -<<< @/public/examples/components/drawer/bottom.html#body{} [html] -<<< @/../examples/src/pages/components/drawer/bottom.liquid#js{} [js] +<<< @/public/examples/components/drawer/bottom.html#body{} [winduum-elements] +<<< @/../examples-stimulus/src/pages/components/drawer/bottom.liquid#body{} [winduum-stimulus] +<<< @/../examples-vue/src/pages/components/drawer/bottom.vue [winduum-vue] +<<< @/../examples-react/src/pages/components/drawer/bottom.tsx [winduum-react] ::: ### Top -
      - -
      - - -
      -
      Drawer content
      - -
      -
      + ::: code-group -<<< @/public/examples/components/drawer/top.html#body{} [html] -<<< @/../examples/src/pages/components/drawer/top.liquid#js{} [js] +<<< @/public/examples/components/drawer/top.html#body{} [winduum-elements] +<<< @/../examples-stimulus/src/pages/components/drawer/top.liquid#body{} [winduum-stimulus] +<<< @/../examples-vue/src/pages/components/drawer/top.vue [winduum-vue] +<<< @/../examples-react/src/pages/components/drawer/top.tsx [winduum-react] ::: -## Javascript API - -### `showDrawer` - -* **Type:** `(element: HTMLElement | Element, distance: number, direction: 'left' | 'top') => void` -* **Kind:** `sync` - -Scroll the drawer to open state. +### Dialog -### `closeDrawer` +Responsive variant that behaves as a bottom drawer below the `xl` container breakpoint (576px) and as a dialog in larger containers. -* **Type:** `(element: HTMLElement | Element, distance: number, direction: 'left' | 'top') => void` -* **Kind:** `sync` + -Scroll the drawer to closed state. +::: code-group +<<< @/public/examples/components/drawer/dialog.html#body{} [winduum-elements] +<<< @/../examples-stimulus/src/pages/components/drawer/dialog.liquid#body{} [winduum-stimulus] +<<< @/../examples-vue/src/pages/components/drawer/dialog.vue [winduum-vue] +<<< @/../examples-react/src/pages/components/drawer/dialog.tsx [winduum-react] +::: -### `scrollInitDrawer` +### No Script -* **Type:** `(element: HTMLElement | Element, distance?: number, direction?: 'left' | 'top') => void` -* **Kind:** `sync` +Fully animated drawer when JavaScript is disabled. -Initializes the scroll position. Call this before `showDrawer` method. + -### `scrollDrawer` +::: code-group +<<< @/public/examples/components/drawer/noscript.html#body{} [winduum-elements] +<<< @/../examples-stimulus/src/pages/components/drawer/noscript.liquid#body{} [winduum-stimulus] +<<< @/../examples-vue/src/pages/components/drawer/noscript.vue [winduum-vue] +<<< @/../examples-react/src/pages/components/drawer/noscript.tsx [winduum-react] +::: -* **Type:** `(element: HTMLElement | Element, options: ScrollDrawerOptions) => void` -* **Kind:** `sync` +### No Snap -Sets correct classes and attributes upon scroll. Events `c-drawer:open` and `c-drawer:close` are dispatched upon opening or closing the drawer. +CSS only drawer variant that does not need JavaScript and works the same way as No Script. -#### ScrollDrawerOptions + ---- +<<< @/public/examples/components/drawer/nosnap.html#body{} [winduum] -##### snapClass +## JavaScript API -* **Type:** `string` -* **Default:** `snap-x snap-mandatory` +Low-level helpers used by `winduum-elements` and `winduum-stimulus` — you can use them to build your own integration. +All functions take a `placement` of `'left' | 'right' | 'top' | 'bottom'` and operate on the **scroller** element (`.x-drawer-scroller`). -A classes that are added for snapping purposes once the drawer is open. +### `showDrawer` ---- +* **Type:** `(element: HTMLElement, placement: 'left' | 'right' | 'top' | 'bottom') => Promise` +* **Kind:** `async` -##### opacityProperty +Scrolls the drawer scroller to its open state. Resets the scroll position first in browsers without +[`scroll-initial-target`](https://developer.mozilla.org/en-US/docs/Web/CSS/scroll-initial-target) support. +Call it after `dialog.showModal()`. -* **Type:** `string` -* **Default:** `--tw-bg-opacity` +```js +import { showDrawer } from 'winduum/src/components/drawer' -A CSS property for animating the background opacity upon scroll. +dialogElement.showModal() +await showDrawer(dialogElement.firstElementChild, 'left') +``` ---- +### `closeDrawer` -##### opacityRatio +* **Type:** `(element: HTMLElement, placement: 'left' | 'right' | 'top' | 'bottom') => void` +* **Kind:** `sync` -* **Type:** `number` -* **Default:** `1` +Scrolls the drawer scroller to its closed state — the dismiss animation is handled by scroll snapping, +and the dialog is closed by `drawerObserver` once the content leaves the viewport. -You can either set `1` or `0` depending on the direction the drawer is opened. Right and bottom drawer should be set to `0`. +### `scrollDrawer` ---- +* **Type:** `(element: HTMLElement, placement: 'left' | 'right' | 'top' | 'bottom', reverse?: boolean, behavior?: 'auto' | 'instant') => void` +* **Kind:** `sync` -##### scrollOpen +Scrolls the drawer scroller to the open (or closed, with `reverse: true`) position. -* **Type:** `number` -* **Default:** `0` +### `drawerEvents` -Scroll position indicating that the drawer is opened. +* **Type:** `(element: HTMLDialogElement, contentElement: HTMLElement, placement: 'left' | 'right' | 'top' | 'bottom', signal?: AbortSignal) => void` +* **Kind:** `sync` ---- +Wires up dialog events — closes the drawer with the scroll animation on `cancel` (Esc) and on click outside the content. -##### scrollClose +### `drawerObserver` -* **Type:** `number` -* **Default:** `element.scrollWidth - element.clientWidth` +* **Type:** `(element: HTMLDialogElement, placement: 'left' | 'right' | 'top' | 'bottom') => IntersectionObserver` +* **Kind:** `sync` -Scroll position indicating that the drawer is closed. +Returns an `IntersectionObserver` that closes the dialog once the drawer content is scrolled/swiped out of view. +Observe the content element with it. ---- +```js +import { drawerObserver } from 'winduum/src/components/drawer' -##### scrollSize +const observer = drawerObserver(dialogElement, 'left') +observer.observe(contentElement) +``` -* **Type:** `number` -* **Default:** `element.scrollWidth - element.clientWidth` +### `drawerProperties` -Maximum scroll size of the drawer. +* **Type:** `(element: HTMLElement, placement: 'left' | 'right' | 'top' | 'bottom') => ['top' | 'left', number, number]` +* **Kind:** `sync` ---- +Returns the scroll axis and the open/closed scroll distances for the given placement. -##### scrollDirection +### `isVerticalDrawer` -* **Type:** `number` -* **Default:** `element.scrollLeft` +* **Type:** `(placement: 'left' | 'right' | 'top' | 'bottom') => boolean` +* **Kind:** `sync` -Current scroll position of the drawer. +Returns `true` for `top` and `bottom` placements. diff --git a/docs/docs/components/field.md b/docs/docs/components/field.md index db69d8b..00b607f 100644 --- a/docs/docs/components/field.md +++ b/docs/docs/components/field.md @@ -1,24 +1,32 @@ +--- +description: "Component used to group a form components." +--- + # Field Component used to group a form components. - + -### Variants -* + -### Installation +## Installation Follow instructions for individual framework usage below -* +* +* +* * * -### Usage +## Styles + +### Variants +* -```css -@import "winduum/src/components/field/index.css" layer(utilities); -``` +## Scripts +The Field script validates the field on change and renders the validation message and +icon when the control is invalid. ## Examples @@ -26,4 +34,9 @@ Follow instructions for individual framework usage below -<<< @/public/examples/components/field/basic.html#body{} +::: code-group +<<< @/public/examples/components/field/basic.html#body{} [winduum-elements] +<<< @/../examples-stimulus/src/pages/components/field/basic.liquid#body{} [winduum-stimulus] +<<< @/../examples-vue/src/pages/components/field/basic.vue [winduum-vue] +<<< @/../examples-react/src/pages/components/field/basic.tsx [winduum-react] +::: diff --git a/docs/docs/components/form.md b/docs/docs/components/form.md index 524b63c..3bf5ab1 100644 --- a/docs/docs/components/form.md +++ b/docs/docs/components/form.md @@ -1,25 +1,33 @@ +--- +description: "Provides a basic way to validate your form and show feedback to your users with native HTML5 form validation. Use attributes such as pattern to add other…" +--- + # Form Provides a basic way to validate your form and show feedback to your users with native HTML5 form validation. Use attributes such as [pattern](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/pattern) to add other validation rules. `novalidate` must be present on `form` to handle validation with JavaScript. -::: info -Compatible with any reactive framework, but updates will not propagate to the virtual DOM.
      -For advance form of validation use [VeeValidate](https://vee-validate.logaretm.com/v4/), [React Hook Form](https://react-hook-form.com/) or others. -::: + - + -### Installation +## Installation Follow instructions for individual framework usage below -* -* +* +* +* +* +* -### Usage -::: code-group -<<< @/public/examples/form.html#body{} [html] -<<< @/../examples/src/pages/form.liquid#js{} [js] +## Scripts +The Form script handles custom validation on submit and can set `data-loading` on +the submitter after a valid submit. + +::: info +Native validation is enough for most forms. Validation libraries are often unnecessary +abstractions and are only needed for very complex forms. In those cases, we recommend +[VeeValidate](https://vee-validate.logaretm.com/v4/) or [TanStack Form](https://tanstack.com/form/latest). ::: ## Examples @@ -29,40 +37,34 @@ Follow instructions for individual framework usage below ::: code-group -<<< @/public/examples/form.html#body{} [html] -<<< @/../examples/src/pages/form.liquid#js{} [js] +<<< @/public/examples/form.html#body{} [winduum-elements] +<<< @/../examples-stimulus/src/pages/form.liquid#body{} [winduum-stimulus] +<<< @/../examples-vue/src/pages/form.vue [winduum-vue] +<<< @/../examples-react/src/pages/form.tsx [winduum-react] ::: - -### Field - - - -::: code-group -<<< @/public/examples/form-field.html#body{} [html] -<<< @/../examples/src/pages/form-field.liquid#js{} [js] -::: - - -## Javascript API +## JavaScript API ### `validateForm` * **Type:** `(event: Event | SubmitEvent, options?: ValidateFormOptions) => void` * **Kind:** `sync` -Validates a form with [checkValidity](https://developer.mozilla.org/en-US/docs/Web/API/HTMLSelectElement/checkValidity) and [validateField](/docs/components/form#validatefield) events. +Validates a form with [checkValidity](https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/checkValidity) +and runs [validateField](/docs/components/form#validatefield) on every field. +On invalid submit it scrolls to and focuses the first invalid element, on valid submit it marks the submitter +with a loading attribute. #### ValidateFormOptions --- -##### validateSelectors +##### validateSelector * **Type:** `string` -* **Default:** `.x-control, .x-check, .x-switch, .x-rating, .x-color` +* **Default:** `.x-field` -Selectors which will be validated. +Selector of field wrappers which will be validated. --- @@ -75,12 +77,21 @@ Additional options for `validateField` --- +##### validateField + +* **Type:** `typeof validateField` +* **Default:** `validateField` + +Override the field validation function. + +--- + ##### submitterLoadingAttribute * **Type:** `string` * **Default:** `data-loading` -Loading class that will be added to a submitter element, e.g., A button. +Loading attribute that will be added to the submitter element (e.g. a button) on valid submit. --- @@ -95,86 +106,70 @@ Scroll options when scrolling to an invalid element. ### `validateField` -* **Type:** `(selector: HTMLElement, options?: ValidateFieldOptions) => void` +* **Type:** `(element: HTMLElement, options?: ValidateFieldOptions) => void` * **Kind:** `sync` -Validates a field. This can be element such as `.x-control`, `x-check` and others that can be validated. It adds validation info message inside `c-field` and validation icon inside `x-control`. -It also adds a `valid`, `invalid` or `active` class to the element. - +Validates a single field wrapper (typically `.x-field`). It appends a validation info message +(with `data-validity`) to the field and a validation icon inside `.x-control`. +The message text is resolved from `options.validationMessage`, the `data-validation-message` attribute +on the invalid element, or the native +[`validationMessage`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLObjectElement/validationMessage). #### ValidateFieldOptions --- -##### validate -* **Type:** `boolean` -* **Default:** `true` +##### validationMessage +* **Type:** `string` +* **Default:** `undefined` -Only `active` class is added if the element value is not empty. No other validation is done. +Overrides the displayed validation message. --- ##### selector * **Type:** `string` -* **Default:** `input:not([type="hidden"]), textarea, select` - ---- +* **Default:** `:is(input:not([type="hidden"]), textarea, select):not([readonly], [data-novalidate])` -##### ignoreMatch -* **Type:** `RegExp` -* **Default:** `/(data-novalidate|readonly)/` - -Ignores a validation if any of these strings are present in the HTML. +Selector of elements inside the field that are validated. Add `data-novalidate` or `readonly` to skip validation. --- ##### validitySelector * **Type:** `string` -* **Default:** `.validity` - -Selector for dynamically added content in the DOM such us info message or icon. - ---- - -##### infoParentSelector -* **Type:** `string` -* **Default:** `.x-field` - ---- +* **Default:** `[data-validity]` -##### infoSelector -* **Type:** `string` -* **Default:** `.x-info` +Selector for dynamically added content in the DOM, such as the info message or icon — it is removed on re-validation. --- ##### infoContent * **Type:** `string` -* **Default:** `
      ` +* **Default:** `
      ` + +Element appended to the field with the validation message. --- -##### endParentSelector +##### iconParentSelector * **Type:** `string` * **Default:** `.x-control` +Element the validation icon is appended into. + --- -##### endSelector +##### iconSelector * **Type:** `string` * **Default:** `.ms-auto` --- -##### endContent +##### iconContent * **Type:** `string` * **Default:** `
      ` ---- - -##### validAttribute -* **Type:** `string` -* **Default:** `data-valid` +Wrapper element for the validation icon, created inside `iconParentSelector` when missing. --- @@ -184,19 +179,6 @@ Selector for dynamically added content in the DOM such us info message or icon. --- -##### invalidAttribute -* **Type:** `string` -* **Default:** `data-invalid` - ---- - ##### invalidIcon * **Type:** `string` -* **Default:** `` - ---- - -##### activeAttribute -* **Type:** `string` -* **Default:** `data-active` - +* **Default:** `` diff --git a/docs/docs/components/group.md b/docs/docs/components/group.md index 786ae26..fbee6a3 100644 --- a/docs/docs/components/group.md +++ b/docs/docs/components/group.md @@ -1,14 +1,23 @@ +--- +description: "Group common ui components such as Button, Badge or Control together." +--- + # Group Group common ui components such as [Button](/docs/components/button), [Badge](/docs/components/badge) or [Control](/docs/components/control) together. - + -### Usage + -```css -@import "winduum/src/components/group/index.css" layer(utilities); -``` +## Installation +Follow instructions for individual framework usage below + +* +* +* + +## Styles ### Variants * @@ -16,13 +25,6 @@ Group common ui components such as [Button](/docs/components/button), [Badge](/d ### Tokens * -### Installation -Follow instructions for individual framework usage below - -* -* -* - ## Examples ### Button Group @@ -30,8 +32,8 @@ Follow instructions for individual framework usage below ::: code-group -<<< @/public/examples/components/btn/group.html#body{} [html] -```vue +<<< @/public/examples/components/btn/group.html#body{} [winduum] +```vue [winduum-vue] @@ -38,7 +43,7 @@ Follow instructions for individual framework usage below Heading ``` -```jsx +```jsx [winduum-react] import { Heading } from '@/components/heading' export function Example() { diff --git a/docs/docs/components/image.md b/docs/docs/components/image.md index db72db2..f1b5b11 100644 --- a/docs/docs/components/image.md +++ b/docs/docs/components/image.md @@ -1,13 +1,24 @@ +--- +description: "Default constrains for media elements such as img, video, iframe, object or svg" +--- + # Image Default constrains for media elements such as `img`, `video`, `iframe`, `object` or `svg` - + -### Usage + -```css -@import "winduum/src/components/image/index.css" layer(utilities); -``` +## Installation +Follow instructions for individual framework usage below + +* +* +* +* +* + +## Styles ### Variants * @@ -15,62 +26,63 @@ Default constrains for media elements such as `img`, `video`, `iframe`, `object` ### Tokens * -### Installation -Follow instructions for individual framework usage below - -* -* -* +## Scripts +The Image script removes the skeleton placeholder once the wrapped media is ready. ## Examples -### Ratio +### Default ::: code-group -<<< @/public/examples/components/image/ratio.html#body{} [html] -```vue - - - -``` -```jsx -import { UiImage } from '@/components/image' - -export function Example() { - return ( - - - - ) -} -``` +<<< @/public/examples/components/image/ratio.html#body{} [winduum-elements] +<<< @/../examples-stimulus/src/pages/components/image/ratio.liquid#body{} [winduum-stimulus] +<<< @/../examples-vue/src/pages/components/image/ratio.vue [winduum-vue] +<<< @/../examples-react/src/pages/components/image/ratio.tsx [winduum-react] +::: + +### Picture + + + +::: code-group +<<< @/public/examples/components/image/picture.html#body{} [winduum-elements] +<<< @/../examples-stimulus/src/pages/components/image/picture.liquid#body{} [winduum-stimulus] +<<< @/../examples-vue/src/pages/components/image/picture.vue [winduum-vue] +<<< @/../examples-react/src/pages/components/image/picture.tsx [winduum-react] ::: ### Rounded -<<< @/public/examples/components/image/rounded.html#body{} +```html +
      + +
      +``` ### Avatar -<<< @/public/examples/components/image/avatar.html#body{} +```html +
      + LB +
      +``` ### Skeleton -<<< @/public/examples/components/image/transparent.html#body{} +::: code-group +<<< @/public/examples/components/image/skeleton.html#body{} [winduum-elements] +<<< @/../examples-stimulus/src/pages/components/image/skeleton.liquid#body{} [winduum-stimulus] +<<< @/../examples-vue/src/pages/components/image/skeleton.vue [winduum-vue] +<<< @/../examples-react/src/pages/components/image/skeleton.tsx [winduum-react] +::: ### Iframe diff --git a/docs/docs/components/info.md b/docs/docs/components/info.md index 0046c74..938d2ea 100644 --- a/docs/docs/components/info.md +++ b/docs/docs/components/info.md @@ -1,13 +1,22 @@ +--- +description: "Small informative component." +--- + # Info Small informative component. - + -### Usage + -```css -@import "winduum/src/components/info/index.css" layer(utilities); -``` +## Installation +Follow instructions for individual framework usage below + +* +* +* + +## Styles ### Variants * @@ -15,13 +24,6 @@ Small informative component. ### Props * -### Installation -Follow instructions for individual framework usage below - -* -* -* - ## Examples ### Basic @@ -29,8 +31,8 @@ Follow instructions for individual framework usage below ::: code-group -<<< @/public/examples/components/info/basic.html#body{} [html] -```vue +<<< @/public/examples/components/info/basic.html#body{} [winduum] +```vue [winduum-vue] @@ -39,7 +41,7 @@ Follow instructions for individual framework usage below Info text ``` -```jsx +```jsx [winduum-react] import { Info } from '@/components/info' export function Example() { diff --git a/docs/docs/components/label.md b/docs/docs/components/label.md index c8fffa7..21da8f6 100644 --- a/docs/docs/components/label.md +++ b/docs/docs/components/label.md @@ -1,12 +1,22 @@ +--- +description: "Accessible label for form controls such as inputs, selects or textareas." +--- + # Label -
      - +Accessible label for form controls such as inputs, selects or textareas. -### Usage + -```css -@import "winduum/src/components/label/index.css" layer(utilities); -``` + + +## Installation +Follow instructions for individual framework usage below + +* +* +* + +## Styles ### Variants * @@ -14,22 +24,15 @@ ### Props * -### Installation -Follow instructions for individual framework usage below - -* -* -* - ## Examples -### Basic +### Default ::: code-group -<<< @/public/examples/components/input/label.html#body{} [html] -```vue +<<< @/public/examples/components/input/label.html#body{} [winduum] +```vue [winduum-vue] @@ -38,7 +41,7 @@ Follow instructions for individual framework usage below ``` -```jsx +```jsx [winduum-react] import { Label } from '@/components/label' export function Example() { diff --git a/docs/docs/components/link.md b/docs/docs/components/link.md deleted file mode 100644 index d0f7ffc..0000000 --- a/docs/docs/components/link.md +++ /dev/null @@ -1,69 +0,0 @@ -# Link -
      - - -### Usage - -```css -@import "winduum/src/components/link/index.css" layer(utilities); -``` - -### Variants -* -* - -### Props -* - -### Installation -Follow instructions for individual framework usage below - -* -* -* - -## Examples - -### Basic - - - -::: code-group -<<< @/public/examples/components/link/basic.html#body{} [html] -```vue - - - -``` -```jsx -import { Link } from '@/components/link' - -export function Example() { - return ( - <> - - Link Default - - - Link Primary - - - ) -} -``` -::: - -### Underline - - - -<<< @/public/examples/components/link/underline.html#body{} diff --git a/docs/docs/components/marquee.md b/docs/docs/components/marquee.md new file mode 100644 index 0000000..1a5da0b --- /dev/null +++ b/docs/docs/components/marquee.md @@ -0,0 +1,145 @@ +--- +description: "Marquee creates an infinite horizontal loop for logos, partners or other repeated items. It is CSS-only and positions each child on the same motion path…" +--- + +# Marquee + +Marquee creates an infinite horizontal loop for logos, partners or other repeated items. It is CSS-only and positions each child on the same motion path using sibling count and sibling index variables. + + + + + +## Installation +Follow instructions for individual framework usage below. + +* +* +* + +::: info Browser support +Item positioning uses [`sibling-index()`](https://developer.mozilla.org/en-US/docs/Web/CSS/sibling-index) — in browsers without support, +set the `--x-marquee-sibling-index` prop on each item as a fallback (see [Props](#props)). +::: + +## Styles + +### Variants +* + +### Props +* `--x-marquee-sibling-count` - total number of marquee items +* `--x-marquee-visible-count` - number of visible items used for spacing along the path +* `--x-marquee-inline-size` - inline size of each marquee item +* `--x-marquee-gap` - gap between marquee items +* `--x-marquee-animation-duration` - animation duration, defaults to `30s` +* `--x-marquee-animation-timing-function` - animation timing function, defaults to `linear` +* `--x-marquee-sibling-index` - item index, required as a fallback for browsers without `sibling-index()` + +## Examples + +### Default + + + +::: code-group +<<< @/public/examples/components/marquee/default.html#body{} [winduum] +```vue [winduum-vue] + + + +``` +```jsx [winduum-react] +import type { CSSProperties } from 'react' +import { Marquee } from '@/components/marquee' + +const partners = [ + '777777', + '777777', + '888888', + '333333', + '333333', + '111111', + '444444', + '444444', + '888888', + '222222' +] + +const marqueeStyle = { + '--x-marquee-sibling-count': partners.length, + '--x-marquee-visible-count': 9, + '--x-marquee-inline-size': 'calc(var(--spacing) * 50)', + '--x-marquee-gap': 'calc(var(--spacing) * 6)' +} as CSSProperties + +export function Example() { + return ( + + {partners.map((color, index) => ( + 3 ? true : undefined} + tabIndex={index > 3 ? -1 : undefined} + style={{ '--x-marquee-sibling-index': index + 1 } as CSSProperties} + > + {`Partner + + ))} + + ) +} +``` +::: + +### Reverse + +Use TailwindCSS arbitrary child variant `*:[animation-direction:reverse]` to move the loop in the opposite direction. + + + +<<< @/public/examples/components/marquee/reverse.html#body{} [winduum] + +## Accessibility + +Keep only the real set of links focusable. If extra duplicated items are present only to make the loop feel continuous, add `aria-hidden="true"` and `tabindex="-1"` to those duplicates. + +Pause the animation when focus moves inside the marquee so keyboard users can interact with links without the focused item moving away. The examples use `*:group-has-focus-within:[animation-play-state:paused]` on the marquee wrapper. diff --git a/docs/docs/components/notice.md b/docs/docs/components/notice.md index 737d274..d28a63f 100644 --- a/docs/docs/components/notice.md +++ b/docs/docs/components/notice.md @@ -1,12 +1,22 @@ +--- +description: "Informative message component — use accent colors for success, error, warning or info states." +--- + # Notice -
      - +Informative message component — use accent colors for success, error, warning or info states. -### Usage + -```css -@import "winduum/src/components/notice/index.css" layer(utilities); -``` + + +## Installation +Follow instructions for individual framework usage below + +* +* +* + +## Styles ### Variants * @@ -14,13 +24,6 @@ ### Props * -### Installation -Follow instructions for individual framework usage below - -* -* -* - ## Examples ### Success @@ -28,8 +31,8 @@ Follow instructions for individual framework usage below ::: code-group -<<< @/public/examples/components/notice/success.html#body{} [html] -```vue +<<< @/public/examples/components/notice/success.html#body{} [winduum] +```vue [winduum-vue] @@ -40,7 +43,7 @@ Follow instructions for individual framework usage below ``` -```jsx +```jsx [winduum-react] import { Notice } from '@/components/notice' export function Example() { diff --git a/docs/docs/components/pagination.md b/docs/docs/components/pagination.md index 55c9515..5dcd44b 100644 --- a/docs/docs/components/pagination.md +++ b/docs/docs/components/pagination.md @@ -1,25 +1,66 @@ +--- +description: "Navigation between multiple pages of content." +--- + # Pagination -
      - +Navigation between multiple pages of content. -### Usage + -```css -@import "winduum/src/components/pagination/index.css" layer(utilities); -``` + -### Variants -* - -### Installation +## Installation Follow instructions for individual framework usage below -* +* * * -## Example +## Styles + +### Variants +* + +## Examples + +### Basic -<<< @/public/examples/components/pagination.html#body{} +::: code-group +<<< @/public/examples/components/pagination.html#body{} [winduum] +```vue [winduum-vue] + + + +``` +```jsx [winduum-react] +import { Pagination } from '@/components/pagination' +import { Button } from '@/components/button' + +export function Example() { + return ( + + + + + + + + + ) +} +``` +::: diff --git a/docs/docs/components/popover.md b/docs/docs/components/popover.md index 4456471..9776df0 100644 --- a/docs/docs/components/popover.md +++ b/docs/docs/components/popover.md @@ -1,264 +1,173 @@ -# Popover -Popover can be used for dropdowns and other popovers when an element is clicked and focused. -You have following types of trigger as an option: -* trigger on focus with CSS `trigger-focus` class -* trigger on hover with CSS `trigger-hover` class -* trigger on click with JS and the `[popover]` attribute +--- +description: "Popover can be used for dropdowns and other popovers when an element is clicked, focused or hovered." +--- - +# Popover +Popover can be used for dropdowns and other popovers when an element is clicked, focused or hovered. +You have the following types of trigger as an option: +* trigger on click with `command="toggle-popover"` and `commandfor` +* trigger on hover/focus with the [`interestfor`](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Attributes/interestfor) attribute (see the [Interest](/docs/variants/interest) variant) -### Dependencies +Popovers are build entirely on the web platform — the `[popover]` attribute, +[Invoker Commands](https://developer.mozilla.org/en-US/docs/Web/API/Invoker_Commands_API) +(`command="toggle-popover"` / `show-popover` / `hide-popover`) and +[CSS Anchor Positioning](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_anchor_positioning). -* [floating-ui](https://floating-ui.com/) - for `[popover]` trigger +No JavaScript is required in browsers with anchor positioning support. -## Usage + -::: code-group -```css -@import "winduum/src/components/popover/index.css" layer(utilities); -``` -<<< @/public/examples/components/popover/basic.html#body{} [html] -```vue - - - -``` -::: + -### Variants -* -* - -### Tokens -Applicable to `x-popover-content` -* `bottom bottom-start` -* `bottom bottom-end` -* `top top-start` -* `top top-end` -* `right right-start` -* `right right-end` -* `left left-start` -* `left left-end` -* `bottom inline-center` -* `top inline-center` -* `right block-center` -* `left block-center` - -### Installation +## Installation Follow instructions for individual framework usage below -* +* +* +* * * -* - -## Examples - - -### focus-trigger - - - -<<< @/public/examples/components/popover/basic.html#body{} - -### hover-trigger - - - -<<< @/public/examples/components/popover/hover.html#body{} - -### [popover] -This is using advantages of [Popover API](https://developer.mozilla.org/en-US/docs/Web/API/Popover_API) with [floating-ui](https://floating-ui.com/). -It's also backwards compatible as it's leveraging only the `showPopover` and `hidePopover` for the [top-layer](https://developer.mozilla.org/en-US/docs/Glossary/Top_layer) support. - -Popover is placed dynamically upon available space, and auto updates itself when needed. - - - -<<< @/public/examples/components/popover/api.html#body{} - - -## JavaScript API - -### `showPopover` - -* **Type:** `(element: HTMLElement | Element, options?: ShowPopoverOptions) => Promise` -* **Kind:** `async` - -#### Example - -```js -import { showPopover, hidePopover } from '/src/components/popover' - -const popoverActionElement = document?.querySelector('[popovertargetaction="show"]') - -popoverActionElement?.addEventListener('click', async (e) => { - e.preventDefault() - - const currentTarget = e.currentTarget - await showPopover(currentTarget, { - placement: 'right-end', - }) -}) - -// close on esc -window.addEventListener('keydown', ({ key }) => { - if (key === 'Escape') { - hidePopover(popoverActionElement) - } -}) - -// outside dismiss -window.addEventListener('click', ({ target }) => { - if (!window.popover?.contains(target) && !popoverActionElement?.isEqualNode(target) && popoverActionElement?.ariaExpanded === 'true') { - hidePopover(popoverActionElement) - } -}) -``` -
      - -#### `ShowPopoverOptions` - ---- - -##### anchorSelector - -* **Type:** `string` -* **Default:** `undefined` - -By default, the anchor selector is the trigger button, you can change this to other selector. - ---- - -##### openAttribute - -* **Type:** `string` -* **Default:** `data-open` - -A string representing an attribute that will be added when popover is visible. - ---- +::: info Browser support +The [Popover API](https://developer.mozilla.org/en-US/docs/Web/API/Popover_API) is Baseline. For older browsers cover +[Invoker Commands](https://developer.mozilla.org/en-US/docs/Web/API/Invoker_Commands_API) with [invokers-polyfill](https://www.npmjs.com/package/invokers-polyfill) +and `interestfor` with the [interestfor polyfill](/docs/polyfills#interest-invokers). +Where CSS Anchor Positioning isn't supported, use the [floating-ui fallback helpers](#javascript-api). See [Polyfills](/docs/polyfills). +::: -##### compute +## Styles -* **Type:** `boolean` -* **Default:** `true` +### Variants +* +* +* -Determines if the popover should be anchored and computed with `@floating-ui/dom` +### Props +* +* ---- +### Tokens +Positioning of `x-popover` is provided by the [Position](/docs/utilities/position) utilities +* `top` `top-start` `top-end` +* `bottom` `bottom-start` `bottom-end` +* `left` `left-start` `left-end` +* `right` `right-start` `right-end` -##### placement +## Scripts +The Popover script keeps trigger `aria-expanded` in sync and provides the floating-ui +positioning fallback when needed. -* **Type:** `Placement` -* **Default:** `undefined` +## Examples -Determines [placement](https://floating-ui.com/docs/computePosition#placement) of the popover with `@floating-ui/dom`, also adds a corresponding class to the popover target. +### Basic Popover ---- +Native [Popover API](https://developer.mozilla.org/en-US/docs/Web/API/Popover_API) with +[Invoker Commands](https://developer.mozilla.org/en-US/docs/Web/API/Invoker_Commands_API) — +the popover lives in the [top-layer](https://developer.mozilla.org/en-US/docs/Glossary/Top_layer), gets light-dismiss +(Esc, clicking outside) and keyboard handling for free, without a single line of JavaScript. -##### middleware + -* **Type:** `Array` -* **Default:** `[offset(12 ?? options?.offset), flip(options?.flip), shift({ padding: 8, ...options?.shift })]` +::: code-group +<<< @/public/examples/components/popover/basic.html#body{} [winduum] +<<< @/../examples-vue/src/pages/components/popover/basic.vue [winduum-vue] +<<< @/../examples-react/src/pages/components/popover/basic.tsx [winduum-react] +::: -Customize [middleware](https://floating-ui.com/docs/computePosition#middleware) for `@floating-ui/dom` +### Interest Popover ---- +Shows the popover when the user *shows interest* in the trigger — hover or keyboard focus — via the `interestfor` attribute. +Use the [interestfor](https://www.npmjs.com/package/interestfor) polyfill for browsers without native support. -##### offset + -* **Type:** `OffsetOptions` -* **Default:** `12` +::: code-group +<<< @/public/examples/components/popover/hover.html#body{} [winduum] +<<< @/../examples-vue/src/pages/components/popover/interest.vue [winduum-vue] +<<< @/../examples-react/src/pages/components/popover/interest.tsx [winduum-react] +::: -Customize [offset](https://floating-ui.com/docs/offset#options) options for `@floating-ui/dom` +### Positioning fallback ---- +Same as the above examples, but wrapped as component, which applies +the floating-ui positioning fallback in browsers without CSS Anchor Positioning. -##### flip + -* **Type:** `FlipOptions` -* **Default:** `undefined` +::: code-group +<<< @/public/examples/components/popover/api.html#body{} [winduum-elements] +<<< @/../examples-stimulus/src/pages/components/popover/api.liquid#body{} [winduum-stimulus] +<<< @/../examples-vue/src/pages/components/popover/api.vue [winduum-vue] +<<< @/../examples-react/src/pages/components/popover/api.tsx [winduum-react] +::: -Customize [flip](https://floating-ui.com/docs/flip#options) options for `@floating-ui/dom` +### Tooltip Popover ---- +Uses the `tooltip` variant with an interest-triggered hint popover. Setting `interest-delay` to `0s` shows it immediately on hover or keyboard focus. The component integrations also apply the floating-ui positioning fallback in browsers without CSS Anchor Positioning. -##### shift + -* **Type:** `ShiftOptions` -* **Default:** `undefined` +::: code-group +<<< @/public/examples/components/popover/tooltip.html#body{} [winduum-elements] +<<< @/../examples-stimulus/src/pages/components/popover/tooltip.liquid#body{} [winduum-stimulus] +<<< @/../examples-vue/src/pages/components/popover/tooltip.vue [winduum-vue] +<<< @/../examples-react/src/pages/components/popover/tooltip.tsx [winduum-react] +::: -Customize [shift](https://floating-ui.com/docs/shift#options) options for `@floating-ui/dom` +## JavaScript API ---- +The core popover component needs no JavaScript — use the native +[`showPopover`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/showPopover) / +[`hidePopover`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/hidePopover) / +[`togglePopover`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/togglePopover) methods for programmatic control. -
      +Two helpers are exported for the floating-ui positioning fallback (they require [`@floating-ui/dom`](https://floating-ui.com/) as a dependency). +They are used internally by `winduum-elements` and `winduum-stimulus`, but you can use them to build your own integration. -### `hidePopover` +### `computePositionPopover` -* **Type:** `(element: HTMLElement | Element) => Promise` +* **Type:** `(referenceElement: HTMLElement, floatingElement: HTMLElement, placement: Placement, options?: ComputePositionConfig | boolean) => Promise` * **Kind:** `async` +Computes the popover position with `@floating-ui/dom` and applies it to the floating element. +When native CSS anchor positioning is supported, only the placement class is applied and positioning is left to CSS. +Passing `options: true` enables the built-in `flip()` middleware. + #### Example ```js -import { hidePopover } from '/src/components/popover' +import { computePositionPopover } from 'winduum/src/components/popover' -const popoverActionElement = document?.querySelector('[popovertargetaction="hide"]') +const trigger = document.querySelector('#popoverTrigger') +const popover = document.querySelector('#popoverElement') -popoverActionElement?.addEventListener('click', async (e) => { - e.preventDefault() - - const currentTarget = e.currentTarget - await hidePopover(currentTarget) +popover.addEventListener('toggle', async ({ newState }) => { + if (newState === 'open') { + await computePositionPopover(trigger, popover, 'bottom-start') + } }) ``` -
      -### `togglePopover` +### `autoUpdatePopover` -* **Type:** `(element: HTMLElement | Element, options?: ShowPopoverOptions) => Promise` +* **Type:** `(referenceElement: HTMLElement, floatingElement: HTMLElement, placement: Placement, options?: ComputePositionConfig | boolean) => Promise<() => void>` * **Kind:** `async` +Same as `computePositionPopover`, but keeps the position updated on scroll and resize via floating-ui +[`autoUpdate`](https://floating-ui.com/docs/autoUpdate). Returns a cleanup function — call it when the popover closes. + #### Example ```js -import { togglePopover, hidePopover } from '/src/components/popover' +import { autoUpdatePopover } from 'winduum/src/components/popover' -const popoverActionElement = document?.querySelector('[popovertargetaction="toggle"]') - -popoverActionElement?.addEventListener('click', async (e) => { - e.preventDefault() - - const currentTarget = e.currentTarget - await togglePopover(currentTarget) -}) - -// close on esc -window.addEventListener('keydown', ({ key }) => { - if (key === 'Escape') { - hidePopover(popoverActionElement) - } -}) +let cleanup -// outside dismiss -window.addEventListener('click', ({ target }) => { - if (!window.popover?.contains(target) && !popoverActionElement?.isEqualNode(target) && popoverActionElement?.ariaExpanded === 'true') { - hidePopover(popoverActionElement) +popover.addEventListener('toggle', async ({ newState }) => { + if (newState === 'open') { + cleanup = await autoUpdatePopover(trigger, popover, 'bottom-start') + } else { + cleanup?.() } }) ``` -
      diff --git a/docs/docs/components/progress.md b/docs/docs/components/progress.md index 7aded79..4f53a69 100644 --- a/docs/docs/components/progress.md +++ b/docs/docs/components/progress.md @@ -1,13 +1,22 @@ +--- +description: "Displays progress with native HTML5 tags progress or meter" +--- + # Progress Displays progress with native HTML5 tags `progress` or `meter` - + -### Usage + -```css -@import "winduum/src/components/progress/index.css" layer(utilities); -``` +## Installation +Follow instructions for individual framework usage below + +* +* +* + +## Styles ### Variants * @@ -17,15 +26,8 @@ Displays progress with native HTML5 tags `progress` or `meter` * ### Tokens -* `sm` -* `lg` - -### Installation -Follow instructions for individual framework usage below - -* -* -* +* `sm` +* `lg` ## Examples @@ -34,31 +36,31 @@ Follow instructions for individual framework usage below ::: code-group -<<< @/public/examples/components/progress/colors.html#body{} [html] -```vue +<<< @/public/examples/components/progress/colors.html#body{} [winduum] +```vue [winduum-vue] ``` -```jsx -import { UiProgress } from '@/components/progress' +```jsx [winduum-react] +import { Progress } from '@/components/progress' export function Example() { return ( <> - - - - - + + + + + ) } diff --git a/docs/docs/components/range.md b/docs/docs/components/range.md index 9ddbbdb..801ad42 100644 --- a/docs/docs/components/range.md +++ b/docs/docs/components/range.md @@ -1,41 +1,38 @@ +--- +description: "Accessible range slider that allows easy selection of a value by sliding a handle." +--- + # Range Accessible range slider that allows easy selection of a value by sliding a handle. - + -### Usage + -::: code-group -```css -@import "winduum/src/components/range/index.css" layer(utilities); -``` -```js -import { setValue } from 'winduum/src/components/range' +## Installation +Follow instructions for individual framework usage below -const rangeSlider = document.querySelector('#rangeSlider') +* +* +* +* +* -setValue(rangeSlider) -rangeSlider.addEventListener('input', ({ currentTarget }) => setValue(currentTarget)) -``` -::: +## Styles ### Variants -* `default` -* `multi` +* `default` +* `multi` ### Props * ### Tokens -* `vertical` - -### Installation -Follow instructions for individual framework usage below +* `vertical` -* -* -* -* +## Scripts +The Range script updates track CSS variables and linked output values as the slider +changes. ## Examples @@ -44,30 +41,10 @@ Follow instructions for individual framework usage below ::: code-group -<<< @/public/examples/components/range/default.html#body{} [html] -<<< @/../examples/src/pages/components/range/default.liquid#js{} [js] -```vue - - - -``` -```jsx -import { Range } from '@/components/range' - -export function Example() { - return ( - - - - ) -} -``` +<<< @/public/examples/components/range/default.html#body{} [winduum-elements] +<<< @/../examples-stimulus/src/pages/components/range/default.liquid#body{} [winduum-stimulus] +<<< @/../examples-vue/src/pages/components/range/default.vue [winduum-vue] +<<< @/../examples-react/src/pages/components/range/default.tsx [winduum-react] ::: ### Multi @@ -75,21 +52,24 @@ export function Example() { ::: code-group -<<< @/public/examples/components/range/multi.html#body{} [html] -<<< @/../examples/src/pages/components/range/multi.liquid#js{} [js] +<<< @/public/examples/components/range/multi.html#body{} [winduum-elements] +<<< @/../examples-stimulus/src/pages/components/range/multi.liquid#body{} [winduum-stimulus] +<<< @/../examples-vue/src/pages/components/range/multi.vue [winduum-vue] +<<< @/../examples-react/src/pages/components/range/multi.tsx [winduum-react] ::: - ### Vertical ::: code-group -<<< @/public/examples/components/range/vertical.html#body{} [html] -<<< @/../examples/src/pages/components/range/vertical.liquid#js{} [js] +<<< @/public/examples/components/range/vertical.html#body{} [winduum-elements] +<<< @/../examples-stimulus/src/pages/components/range/vertical.liquid#body{} [winduum-stimulus] +<<< @/../examples-vue/src/pages/components/range/vertical.vue [winduum-vue] +<<< @/../examples-react/src/pages/components/range/vertical.tsx [winduum-react] ::: -## Javascript API +## JavaScript API ### setTrackProperty diff --git a/docs/docs/components/rating.md b/docs/docs/components/rating.md index 8805d8c..0a4dbc1 100644 --- a/docs/docs/components/rating.md +++ b/docs/docs/components/rating.md @@ -1,12 +1,22 @@ +--- +description: "Accessible star rating built with radio input types." +--- + # Rating -
      - +Accessible star rating built with `radio` **input** types. -### Usage + -```css -@import "winduum/src/components/rating/index.css" layer(utilities); -``` + + +## Installation +Follow instructions for individual framework usage below + +* +* +* + +## Styles ### Variants * @@ -15,13 +25,6 @@ ### Props * -### Installation -Follow instructions for individual framework usage below - -* -* -* - ## Examples ### Basic @@ -29,8 +32,8 @@ Follow instructions for individual framework usage below ::: code-group -<<< @/public/examples/components/rating.html#body{} [html] -```vue +<<< @/public/examples/components/rating.html#body{} [winduum] +```vue [winduum-vue] @@ -45,7 +48,7 @@ Follow instructions for individual framework usage below ``` -```jsx +```jsx [winduum-react] import { Rating } from '@/components/rating' export function Example() { @@ -61,3 +64,7 @@ export function Example() { } ``` ::: + +## Accessibility + +Rating is a native radio group — each star is an `input type="radio"` sharing the same `name`, so keyboard users can move between values with arrow keys and the selection is announced by screen readers. Give every input a descriptive `aria-label` (e.g. `Rate 3/5`) as shown in the example. diff --git a/docs/docs/components/switch.md b/docs/docs/components/switch.md index 55c16ee..3de59ce 100644 --- a/docs/docs/components/switch.md +++ b/docs/docs/components/switch.md @@ -1,12 +1,22 @@ +--- +description: "Toggle switch built with a checkbox input type." +--- + # Switch -
      - +Toggle switch built with a `checkbox` **input** type. -### Usage + -```css -@import "winduum/src/components/switch/index.css" layer(utilities); -``` + + +## Installation +Follow instructions for individual framework usage below + +* +* +* + +## Styles ### Variants * @@ -17,13 +27,6 @@ * * -### Installation -Follow instructions for individual framework usage below - -* -* -* - ## Examples ### Basic @@ -31,8 +34,8 @@ Follow instructions for individual framework usage below ::: code-group -<<< @/public/examples/components/switch/basic.html#body{} [html] -```vue +<<< @/public/examples/components/switch/basic.html#body{} [winduum] +```vue [winduum-vue] @@ -44,7 +47,7 @@ Follow instructions for individual framework usage below ``` -```jsx +```jsx [winduum-react] import { Switch } from '@/components/switch' export function Example() { @@ -75,3 +78,11 @@ export function Example() { <<< @/public/examples/components/switch/disabled.html#body{} + +### Validation + +Invalid state styling via the `invalid` variant — works with native HTML5 form validation, see [Form](/docs/components/form). + + + +<<< @/public/examples/components/switch/validation.html#body{} diff --git a/docs/docs/components/table.md b/docs/docs/components/table.md index 53ecfcf..2752e72 100644 --- a/docs/docs/components/table.md +++ b/docs/docs/components/table.md @@ -1,12 +1,22 @@ +--- +description: "Display your data in non-interactive, interactive or responsive tables." +--- + # Table Display your data in non-interactive, interactive or responsive tables. - -### Usage + -```css -@import "winduum/src/components/table/index.css" layer(utilities); -``` + + +## Installation +Follow instructions for individual framework usage below + +* +* +* + +## Styles ### Variants * @@ -15,20 +25,87 @@ Display your data in non-interactive, interactive or responsive tables. ### Props * -### Installation -Follow instructions for individual framework usage below - -* -* -* - ## Examples ### Default -<<< @/public/examples/components/table/default.html#body{} +::: code-group +<<< @/public/examples/components/table/default.html#body{} [winduum] +```vue [winduum-vue] + + + +``` +```jsx [winduum-react] +import { Table } from '@/components/table' + +export function Example() { + return ( + +
      + + + + + + + + + + + + + + + + + + + + + + + + +
      Full nameEmailEmployment
      Agata Hendersona.henderson@example.comInterpreter
      Tony Johnstont.johnston@example.comSinger
      Maya Walkerm.walker@example.comLawer
      + + ) +} +``` +::: ### Interactive diff --git a/docs/docs/components/tabs.md b/docs/docs/components/tabs.md index 21f79a4..464f855 100644 --- a/docs/docs/components/tabs.md +++ b/docs/docs/components/tabs.md @@ -1,21 +1,30 @@ -# Tabs -
      - +--- +description: "Accessible tabs to switch between panels of content." +--- -### Usage +# Tabs +Accessible tabs to switch between panels of content. -```css -@import "winduum/src/components/tabs/index.css" layer(utilities); -``` + -### Variants -* + -### Installation +## Installation Follow instructions for individual framework usage below -* -* +* +* +* +* +* + +## Styles + +### Variants +* + +## Scripts +The Tabs script switches active panels and keeps tab ARIA state in sync. ## Examples @@ -24,8 +33,10 @@ Follow instructions for individual framework usage below ::: code-group -<<< @/public/examples/components/tabs/default.html#body{} [html] -<<< @/../examples/src/pages/components/tabs/default.liquid#js{} [js] +<<< @/public/examples/components/tabs/default.html#body{} [winduum-elements] +<<< @/../examples-stimulus/src/pages/components/tabs/default.liquid#body{} [winduum-stimulus] +<<< @/../examples-vue/src/pages/components/tabs/default.vue [winduum-vue] +<<< @/../examples-react/src/pages/components/tabs/default.tsx [winduum-react] ::: ### Custom @@ -33,11 +44,17 @@ Follow instructions for individual framework usage below ::: code-group -<<< @/public/examples/components/tabs/custom.html#body{} [html] -<<< @/../examples/src/pages/components/tabs/custom.liquid#js{} [js] +<<< @/public/examples/components/tabs/custom.html#body{} [winduum-elements] +<<< @/../examples-stimulus/src/pages/components/tabs/custom.liquid#body{} [winduum-stimulus] +<<< @/../examples-vue/src/pages/components/tabs/custom.vue [winduum-vue] +<<< @/../examples-react/src/pages/components/tabs/custom.tsx [winduum-react] ::: -## Javascript API +## Accessibility + +Tabs follow the [ARIA tabs pattern](https://www.w3.org/WAI/ARIA/apg/patterns/tabs/) — triggers use `role="tab"` with `aria-controls` and `aria-selected` inside a `role="tablist"` wrapper, panels use `role="tabpanel"` with `aria-labelledby`. The [`toggleTab`](#toggletab) helper keeps `aria-selected` and `aria-hidden` in sync when switching tabs. + +## JavaScript API ### `toggleTab` @@ -52,14 +69,14 @@ Toggles tab and tab panel aria attributes. ##### tabElements -* **Type:** `NodeListOf` +* **Type:** `NodeListOf | Element[]` * **Default:** `undefined` Elements representing tabs. ##### tabPanelElements -* **Type:** `NodeListOf` +* **Type:** `NodeListOf | Element[]` * **Default:** `undefined` Elements representing tab panels. diff --git a/docs/docs/components/text.md b/docs/docs/components/text.md index 9c408cc..12d04fb 100644 --- a/docs/docs/components/text.md +++ b/docs/docs/components/text.md @@ -1,42 +1,82 @@ +--- +description: "Typographic defaults for plain text and rich content." +--- + # Text -Typographic defaults for common wysiwyg content. It's an alternative to [prose](https://tailwindcss.com/docs/typography-plugin). +Text provides typographic defaults for plain text. Add the `content` variant for rich text or WYSIWYG content as an alternative to [prose](https://tailwindcss.com/docs/typography-plugin). - + -### Usage + -```css -@import "winduum/src/components/text/index.css" layer(utilities); -``` +## Installation +Follow instructions for individual framework usage below + +* +* +* + +## Styles ### Variants * +* ### Props * +* -### Installation -Follow instructions for individual framework usage below +## Examples -* -* -* +### Basic -## Examples +Use `x-text` for typographic defaults on a plain text element. -### Text + - +::: code-group +<<< @/public/examples/components/text/basic.html#body{} [winduum] +```vue [winduum-vue] + + + +``` +```jsx [winduum-react] +import { Text } from '@/components/text' + +export function Example() { + return ( + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec eget efficitur metus. In bibendum nisi et dui + sagittis efficitur. + + ) +} +``` +::: + +### Content + +Add the `content` variant when `x-text` wraps rich content made of nested semantic elements, such as CMS or WYSIWYG output. + + ::: code-group -<<< @/public/examples/components/text/text.html#body{} [html] -```vue +<<< @/public/examples/components/text/content.html#body{} [winduum] +```vue [winduum-vue] ``` -```jsx -import { UiText } from '@/components/text' +```jsx [winduum-react] +import { Text } from '@/components/text' export function Example() { return ( - +

      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec eget efficitur metus. In bibendum nisi et dui sagittis efficitur. Proin porttitor diam at quam finibus, quis porttitor turpis ullamcorper. Quisque iaculis imperdiet nunc in @@ -66,12 +106,20 @@ export function Example() { Phasellus non pretium libero.

      Lorem ipsum dolor sit amet, consectetur adipiscing elit.

      -
      + ) } ``` ::: +### Rich + +A complete rich-content example combining headings, paragraphs, lists, code blocks, blockquotes, tables, and MathML. + + + +<<< @/public/examples/components/text/rich.html#body{} + ### Headings diff --git a/docs/docs/components/title.md b/docs/docs/components/title.md index 9db1b39..5086201 100644 --- a/docs/docs/components/title.md +++ b/docs/docs/components/title.md @@ -1,13 +1,22 @@ +--- +description: "For common title styles that you can manage from one component across project." +--- + # Title For common title styles that you can manage from one component across project. - + -### Usage + -```css -@import "winduum/src/components/title/index.css" layer(utilities); -``` +## Installation +Follow instructions for individual framework usage below + +* +* +* + +## Styles ### Variants * @@ -16,15 +25,8 @@ For common title styles that you can manage from one component across project. * ### Tokens -* `sm` -* `lg` - -### Installation -Follow instructions for individual framework usage below - -* -* -* +* `sm` +* `lg` ## Examples @@ -33,8 +35,8 @@ Follow instructions for individual framework usage below ::: code-group -<<< @/public/examples/components/title/basic.html#body{} [html] -```vue +<<< @/public/examples/components/title/basic.html#body{} [winduum] +```vue [winduum-vue] @@ -43,7 +45,7 @@ Follow instructions for individual framework usage below Title ``` -```jsx +```jsx [winduum-react] import { Title } from '@/components/title' export function Example() { diff --git a/docs/docs/components/toast.md b/docs/docs/components/toast.md index 7ead7ef..e73246e 100644 --- a/docs/docs/components/toast.md +++ b/docs/docs/components/toast.md @@ -1,114 +1,66 @@ +--- +description: "Let it bake and fly from your Toaster!" +--- + # Toast Let it bake and fly from your [Toaster](/docs/components/toaster)! - + -## Usage + -::: code-group -```css -@import "winduum/src/components/toast/index.css" layer(utilities); -``` -```js -import { showToast, closeToast } from 'winduum/src/components/toaster' - -document.querySelector('#insertToast').addEventListener('click', async () => { - const toaster = document.querySelector('.x-toaster') - - toaster.insertAdjacentHTML('beforeend', ` -
    3. -
      -
      -
      Hello toast
      -
      Amazing toast
      -
      - -
      -
    4. - `) - - await showToast(toaster.children[toaster.children.length - 1]) - - const closeToastButton = document.querySelectorAll('[data-action="closeToast"]')[document.querySelectorAll('[data-action="closeToast"]').length - 1] - - closeToastButton.addEventListener('click', ({ currentTarget }) => { - closeToast(currentTarget.closest('.c-toast')) - }) -}) -``` -```html - - -
        - -``` -::: +## Installation +Follow instructions for individual framework usage below + +* +* +* +* +* + +## Styles ### Variants -* -* +* +* -### Installation -Follow instructions for individual framework usage below +### Props +* +* + +## Scripts +The Toast script runs enter/exit animations and handles optional auto-hide. -* -* +::: info +For `winduum-elements` and `winduum-stimulus`, toasts are expected to be appended into the Toaster from the backend, for example via ajax. You can also append the HTML manually, for example with `insertAdjacentHTML`. +::: + +## Examples -## Example +### Default -
        - -
        + ::: code-group -```html - - -
          - - -``` +<<< @/public/examples/components/toast/default.html#body{} [winduum-elements] +<<< @/../examples-stimulus/src/pages/components/toast/default.liquid#body{} [winduum-stimulus] +<<< @/../examples-vue/src/pages/components/toast/default.vue [winduum-vue] +<<< @/../examples-react/src/pages/components/toast/default.tsx [winduum-react] ::: ## JavaScript API ### `showToast` -* **Type:** `(selector: HTMLElement, options?: ShowToastOptions) => Promise` +* **Type:** `(element: HTMLElement, options?: ShowToastOptions) => Promise` * **Kind:** `async` -Applies an enter animation to existing toast. +Applies an enter animation to existing toast and schedules its auto-hide. #### Example ```js -import { showToast } from 'winduum/src/components/toaster' +import { showToast } from 'winduum/src/components/toast' document.querySelector('#showToast').addEventListener('click', async () => { await showToast(document.querySelector('#toastElement')) @@ -129,15 +81,17 @@ document.querySelector('#showToast').addEventListener('click', async () => { ##### autoHide -* **Type:** `number` -* **Default:** `null` +* **Type:** `number | null` +* **Default:** `7500` + +Time in ms after which the toast closes automatically — the delay scales with the number of toasts in the toaster. Set to `null` to disable. --- ##### heightProperty * **Type:** `string` -* **Default:** `--x-toast-height` +* **Default:** `--x-toast-block-size` --- @@ -146,13 +100,15 @@ document.querySelector('#showToast').addEventListener('click', async () => { * **Type:** `CloseToastOptions` * **Default:** `{}` +Options passed to `closeToast` when the toast auto-hides. + ---
          ### `closeToast` -* **Type:** `(selector: HTMLElement, options?: CloseToastOptions) => Promise` +* **Type:** `(element: HTMLElement, options?: CloseToastOptions) => Promise` * **Kind:** `async` Applies an exit animation to existing toast and removes it from DOM. @@ -160,7 +116,7 @@ Applies an exit animation to existing toast and removes it from DOM. #### Example ```js -import { showToast } from 'winduum/src/components/toaster' +import { closeToast } from 'winduum/src/components/toast' document.querySelector('#closeToast').addEventListener('click', async () => { await closeToast(document.querySelector('#toastElement')) @@ -175,14 +131,21 @@ document.querySelector('#closeToast').addEventListener('click', async () => { ##### closedAttribute -* **Type:** `data-closed` -* **Default:** `out` +* **Type:** `string` +* **Default:** `data-closed` --- ##### heightProperty * **Type:** `string` -* **Default:** `--x-toast-height` +* **Default:** `--x-toast-block-size` --- + +##### remove + +* **Type:** `boolean` +* **Default:** `true` + +Determines whether the toast is removed from the DOM after the exit animation. diff --git a/docs/docs/components/toaster.md b/docs/docs/components/toaster.md index 0a5e7bd..33fd97b 100644 --- a/docs/docs/components/toaster.md +++ b/docs/docs/components/toaster.md @@ -1,42 +1,92 @@ +--- +description: "Bake your Toast and let it fly! You should insert in into your " +--- + # Toaster Bake your [Toast](/docs/components/toast) and let it fly! You should insert in into your `` - +The toaster uses the [Popover API](https://developer.mozilla.org/en-US/docs/Web/API/Popover_API) +(`popover="manual"`) so toasts always appear in the [top-layer](https://developer.mozilla.org/en-US/docs/Glossary/Top_layer) — +even above open dialogs. Use `toasterObserver` to show/hide the toaster popover automatically as toasts are added and removed. -## Usage + -```css -@import "winduum/src/components/toaster/index.css" layer(utilities); -``` + + +## Installation +Follow instructions for individual framework usage below + +* +* +* +* +* + +## Styles ### Variants -* +* -### Installation -Follow instructions for individual framework usage below +### Props +* -* -* +## Scripts +The Toaster script shows or hides the toaster popover as toasts are added or removed. -## Example +::: info +For `winduum-elements` and `winduum-stimulus`, toasts are expected to be appended into the Toaster from the backend, for example via ajax. You can also append the HTML manually, for example with `insertAdjacentHTML`. +::: -```html -
            -``` +## Examples + +### Default + +The toaster lives at the end of your `` — toasts are inserted into it and the popover shows/hides automatically via `toasterObserver`. + + + +::: code-group +<<< @/public/examples/components/toaster/default.html#body{} [winduum-elements] +<<< @/../examples-stimulus/src/pages/components/toaster/default.liquid#body{} [winduum-stimulus] +<<< @/../examples-vue/src/pages/components/toaster/default.vue [winduum-vue] +<<< @/../examples-react/src/pages/components/toaster/default.tsx [winduum-react] +::: + +## JavaScript API ### `closeToaster` -* **Type:** `(selector: HTMLElement, options?: CloseToastOptions) => Promise` -* **Kind:** `async` +* **Type:** `(element: HTMLElement, options?: CloseToastOptions) => void` +* **Kind:** `sync` All toasts are closed at once. #### Example ```js -import { showToast } from 'winduum/src/components/toaster' +import { closeToaster } from 'winduum/src/components/toaster' + +document.querySelector('#closeToaster').addEventListener('click', () => { + closeToaster(document.querySelector('.x-toaster')) +}) +``` + +### `toasterObserver` + +* **Type:** `() => MutationObserver` +* **Kind:** `sync` + +Returns a `MutationObserver` that shows the toaster popover when the first toast is inserted +and hides it when the last toast is removed. Observe the toaster element with `{ childList: true }`. + +#### Example + +```js +import { toasterObserver } from 'winduum/src/components/toaster' + +const observer = toasterObserver() -document.querySelector('#closeToaster').addEventListener('click', async () => { - await closeToaster(document.querySelector('.c-toaster')) +observer.observe(document.querySelector('.x-toaster'), { + childList: true, }) ``` diff --git a/docs/docs/components/tooltip.md b/docs/docs/components/tooltip.md index 1e8b64f..46c596a 100644 --- a/docs/docs/components/tooltip.md +++ b/docs/docs/components/tooltip.md @@ -1,50 +1,60 @@ +--- +description: "Tooltip can be used for a little info hint on hover or focus." +--- + # Tooltip Tooltip can be used for a little info hint on hover or focus. - - -## Usage - -::: code-group -```css -@import "winduum/src/components/tooltip/index.css" layer(utilities); -``` -<<< @/public/examples/components/tooltip/basic.html#body{} [html] -```vue - +It's a pure CSS visual hint — the text comes from the `aria-label` attribute and is rendered via the `::before` pseudo-element. Placement is controlled with the `tooltip-*` tokens and appearance can be customized via the `--x-tooltip-*` props. - -``` -::: +Do not rely on this pattern as an accessible description when `aria-label` is placed on a generic wrapper: its child trigger does not inherit that label, and the CSS hint cannot be dismissed with Escape. Prefer the [Popover tooltip variant](/docs/components/popover#interest-popover) using the [`interestfor`](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Attributes/interestfor) attribute. -### Variants -* + -### Tokens -* `top` -* `bottom` -* `left` -* `right` + -### Installation +## Installation Follow instructions for individual framework usage below -* +* * * +## Styles + +### Variants +* + +### Props +* + +### Tokens +* `tooltip-top` +* `tooltip-bottom` +* `tooltip-left` +* `tooltip-right` + ## Examples ### Basic -<<< @/public/examples/components/tooltip/basic.html#body{} +::: code-group +<<< @/public/examples/components/tooltip/basic.html#body{} [winduum] +```vue [winduum-vue] + + + +``` +```jsx [winduum-react] +``` +::: diff --git a/docs/docs/grid.md b/docs/docs/grid.md index 087f137..f5cbb2e 100644 --- a/docs/docs/grid.md +++ b/docs/docs/grid.md @@ -1,3 +1,7 @@ +--- +description: "It's recommended to use the following TailwindCSS approaches to shape your layout" +--- + # Grid It's recommended to use the following TailwindCSS approaches to shape your layout @@ -8,5 +12,5 @@ It's recommended to use the following TailwindCSS approaches to shape your layou Winduum also provides additional utilities to make things even easier. -* [Container](/docs/utilities/container) +* [Grid](/docs/utilities/grid) * [Divide Gap](/docs/utilities/divide-gap) diff --git a/docs/docs/icons.md b/docs/docs/icons.md index 332b0f2..d3c7c9a 100644 --- a/docs/docs/icons.md +++ b/docs/docs/icons.md @@ -1,3 +1,7 @@ +--- +description: "It's recommended to use icons as svg, such as Heroicons" +--- + # Icons It's recommended to use icons as svg, such as [Heroicons](https://heroicons.com/) diff --git a/docs/docs/index.md b/docs/docs/index.md index a961488..d1c3353 100644 --- a/docs/docs/index.md +++ b/docs/docs/index.md @@ -1,11 +1,12 @@ +--- +description: "You can use Winduum with or without TailwindCSS." +--- + # Install You can use Winduum with or without [TailwindCSS](https://tailwindcss.com/). Check out the [About](/docs/about) page to learn more about Winduum and its philosophy. -Winduum `2.x` is using compatible naming for CSS custom properties that work with both current and old versions of TailwindCSS, -specifically `v4` and `v3`. - ## Get started You can install Winduum via **npm** and use it in your **Node.js** project.
            @@ -18,48 +19,13 @@ See [Trying Winduum Online](#trying-winduum-online) section below to see all pos ### npm ```shell -npm i winduum -``` - -The components are written in plain CSS, so sources can be also loaded in browsers without a build step or used in any other build tool such as **PostCSS** or **LightningCSS**. - -```css -@import "winduum/src/theme/index.css" layer(theme); -@import "winduum/src/base/index.css" layer(base); -@import "winduum/src/components/index.css" layer(utilities); -@import "winduum/src/utilities/index.css" layer(utilities); -``` - -Or you can include components separately, follow usage steps with each component. - -```css -@import "winduum/src/theme/index.css" layer(theme); -@import "winduum/src/base/index.css" layer(base); -@import "winduum/src/components/button/index.css" layer(utilities); -@import "winduum/src/utilities/index.css" layer(utilities); -``` - -Or paste the source code to your project and make it your own! - -```css -@import "@/styles/theme/index.css" layer(theme); -@import "@/styles/base/index.css" layer(base); -@import "@/styles/components/button/index.css" layer(utilities); -@import "@/styles/utilities/index.css" layer(utilities); +npm i winduum@next ``` - - -With `layer(utilities)` you can use TailwindCSS variant classes, for example `class="x-button lg:square"` to make button square only from `lg` breakpoint. (Not wokring with TailwindCSS v4 currently) - ### TailwindCSS It's optional but recommended to leverage the full functionality of the library! -#### v4 - -To use TailwindCSS `v4`, you will have to import TailwindCSS and Winduum imports individually. - ```css @import "tailwindcss/theme.css" layer(theme); @import "winduum/tailwindcss/theme/config/index.css" layer(theme); @@ -81,52 +47,49 @@ To use TailwindCSS `v4`, you will have to import TailwindCSS and Winduum imports @import "winduum/src/base/breakpoints.css"; @import "winduum/src/base/keyframes.css"; @import "winduum/src/base/transitions.css"; -``` -TailwindCSS `v4` can be used in any project with Vite and works out of the box. -No `tailwind.config.js` needed! -All configuration is done in CSS! +/* paths are relative to this stylesheet */ +@source "../../node_modules/winduum/src"; +@source "../../node_modules/winduum-elements"; +``` -```javascript -import tailwindcss from '@tailwindcss/vite' -import { defineConfig } from 'vite' +Tailwind CSS excludes dependencies from automatic source detection. Keep the first `@source` directive and replace +`winduum-elements` with the integration used by your project: `winduum-stimulus`, `winduum-vue` or `winduum-react`. -export default defineConfig({ - plugins: [tailwindcss()], -}) -``` +Follow the installation steps in [TailwindCSS](https://tailwindcss.com/docs/installation/using-vite) docs. -#### v3 +### Without TailwindCSS -To use TailwindCSS `v3`, you will have to import TailwindCSS and Winduum imports individually. +The components are written in plain CSS, so sources can be also loaded in browsers without a build step or used in any other build tool such as **PostCSS** or **LightningCSS**. ```css -@import "winduum/src/theme/index.css"; -@import "winduum/src/base/index.css"; +@import "winduum/src/theme/index.css" layer(theme); +@import "winduum/src/base/index.css" layer(base); + +/* all components in one import */ @import "winduum/src/components/index.css" layer(utilities); @import "winduum/src/utilities/index.css" layer(utilities); -@import "winduum/tailwindcss/base/defaults.css"; -@import "tailwindcss/base.css"; -@import "tailwindcss/components.css"; -@import "tailwindcss/utilities.css"; -@import "tailwindcss/variants.css"; ``` -Follow the installation steps in [TailwindCSS](https://v3.tailwindcss.com/docs/installation) docs -and include Winduum as a plugin, -see [Config](/docs/base/config#tailwind-css-v3) for more info. +Or you can include components separately, follow usage steps with each component. + +```css +@import "winduum/src/theme/index.css" layer(theme); +@import "winduum/src/base/index.css" layer(base); + +/* one component at a time */ +@import "winduum/src/components/button/index.css" layer(utilities); +@import "winduum/src/utilities/index.css" layer(utilities); +``` -## PostCSS or LightingCSS -For TailwindCSS `v3` following PostCSS plugins are required. -If you are using `v4` the [LightingCSS](https://lightningcss.dev/) is used out of the box. +Or paste the source code to your project and make it your own! -* [`autoprefixer`](https://www.npmjs.com/package/autoprefixer) -* [`tailwindcss`](https://www.npmjs.com/package/tailwindcss) -* [`postcss-nesting`](https://www.npmjs.com/package/postcss-nesting) -* [`postcss-import`](https://www.npmjs.com/package/postcss-import) -* [`postcss-custom-media`](https://www.npmjs.com/package/postcss-custom-media) - -If you are not using TailwindCSS, you can use whatever you want, even no build step! +```css +@import "@/styles/theme/index.css" layer(theme); +@import "@/styles/base/index.css" layer(base); +@import "@/styles/components/button/index.css" layer(utilities); +@import "@/styles/utilities/index.css" layer(utilities); +``` ## Stylelint @@ -134,7 +97,7 @@ It's also recommended to use [Stylelint](https://stylelint.io/) with [stylelint-stylistic](https://github.com/stylelint-stylistic/stylelint-stylistic) to help add conventions to your styles. You can check -and use basic `.stylelintrc` for Winduum [here](https://github.com/winduum/winduum/blob/main/.stylelintrc). +and use basic `.stylelintrc` for Winduum [here](https://github.com/winduum/winduum/blob/next/stylelint.config.js). ```shell npm i stylelint stylelint-config-standard @stylistic/stylelint-config --save-dev @@ -163,7 +126,7 @@ To leverage the full functionality of the framework, [TailwindCSS](#tailwindcss) ## Trying Winduum Online -On [StackBlitz](https://stackblitz.com/) or [GitHub](https://github.com/winduum/winduum/tree/main/examples) with basic examples how to use it in [Vite](https://vitejs.dev/) and other frameworks. +On [StackBlitz](https://stackblitz.com/) or [GitHub](https://github.com/winduum/winduum/tree/next/examples) with basic examples how to use it in [Vite](https://vitejs.dev/) and other frameworks. + + + +
            + + + diff --git a/examples-react/src/pages/components/carousel-experimental/basic.tsx b/examples-react/src/pages/components/carousel-experimental/basic.tsx new file mode 100644 index 0000000..f8a13ae --- /dev/null +++ b/examples-react/src/pages/components/carousel-experimental/basic.tsx @@ -0,0 +1,36 @@ +import { useRef } from 'react' +import { Carousel } from '@/components/carousel-experimental' + +export function Example() { + const contentElement = useRef(null) + const prevElement = useRef(null) + const nextElement = useRef(null) + + return ( + + {({ scrollPrev, scrollNext, toggleScrollState }) => ( + <> + +
            +
            + +
            +
            + +
            +
            + + + )} +
            + ) +} + diff --git a/examples-react/src/pages/components/carousel-experimental/full.html b/examples-react/src/pages/components/carousel-experimental/full.html new file mode 100644 index 0000000..9fc1c4e --- /dev/null +++ b/examples-react/src/pages/components/carousel-experimental/full.html @@ -0,0 +1,37 @@ + + + + + + + + + + + + +
            + + + diff --git a/examples-react/src/pages/components/carousel-experimental/full.tsx b/examples-react/src/pages/components/carousel-experimental/full.tsx new file mode 100644 index 0000000..4b8b272 --- /dev/null +++ b/examples-react/src/pages/components/carousel-experimental/full.tsx @@ -0,0 +1,58 @@ +import { useRef } from 'react' +import { Carousel } from '@/components/carousel-experimental' + +const slides = [1, 2, 3, 4, 5, 6] + +export function Example() { + const contentElement = useRef(null) + const markerGroupElement = useRef(null) + const prevElement = useRef(null) + const nextElement = useRef(null) + + return ( + + {({ scrollPrev, scrollNext, toggleScrollState, scrollToMarker }) => ( + <> +
            + +
            + {slides.map((slide) => ( +
            + +
            + ))} +
            + +
            + + + )} +
            + ) +} + diff --git a/examples-react/src/pages/components/carousel/basic.html b/examples-react/src/pages/components/carousel/basic.html new file mode 100644 index 0000000..16f8c6f --- /dev/null +++ b/examples-react/src/pages/components/carousel/basic.html @@ -0,0 +1,24 @@ + + + + + + + + + + + + +
            + + + diff --git a/examples-react/src/pages/components/carousel/basic.tsx b/examples-react/src/pages/components/carousel/basic.tsx new file mode 100644 index 0000000..bc25b40 --- /dev/null +++ b/examples-react/src/pages/components/carousel/basic.tsx @@ -0,0 +1,38 @@ +import { useRef } from 'react' +import { Carousel } from '@/components/carousel' + +export function Example() { + const contentElement = useRef(null) + const prevElement = useRef(null) + const nextElement = useRef(null) + + return ( + + {({ scrollPrev, scrollNext, onScroll }) => ( + <> + +
            +
            + +
            +
            + +
            +
            + + + )} +
            + ) +} diff --git a/examples-react/src/pages/components/carousel/full.html b/examples-react/src/pages/components/carousel/full.html new file mode 100644 index 0000000..7ec0eb7 --- /dev/null +++ b/examples-react/src/pages/components/carousel/full.html @@ -0,0 +1,24 @@ + + + + + + + + + + + + +
            + + + diff --git a/examples-react/src/pages/components/carousel/full.tsx b/examples-react/src/pages/components/carousel/full.tsx new file mode 100644 index 0000000..b934983 --- /dev/null +++ b/examples-react/src/pages/components/carousel/full.tsx @@ -0,0 +1,61 @@ +import { useRef } from 'react' +import { Carousel } from '@/components/carousel' + +const slides = [1, 2, 3, 4, 5, 6] + +export function Example() { + const contentElement = useRef(null) + const prevElement = useRef(null) + const nextElement = useRef(null) + const paginationElement = useRef(null) + + return ( + + {({ scrollPrev, scrollNext, onScroll }) => ( + <> +
            + +
            onScroll(event, { + pagination: { element: paginationElement.current ?? undefined } + })} + > + {slides.map((slide) => ( +
            + +
            + ))} +
            + +
            + + + )} +
            + ) +} diff --git a/examples-react/src/pages/components/compare/default.html b/examples-react/src/pages/components/compare/default.html new file mode 100644 index 0000000..9b30909 --- /dev/null +++ b/examples-react/src/pages/components/compare/default.html @@ -0,0 +1,20 @@ + + + + + + + + + + + +
            + + + + diff --git a/examples-react/src/pages/components/compare/default.tsx b/examples-react/src/pages/components/compare/default.tsx new file mode 100644 index 0000000..a4cb90d --- /dev/null +++ b/examples-react/src/pages/components/compare/default.tsx @@ -0,0 +1,20 @@ +import { Compare } from '@/components/compare' + +export function Example() { + return ( + + + +
            + Image 1 + Image 2 +
            +
            + ) +} + diff --git a/examples-react/src/pages/components/compare/text.html b/examples-react/src/pages/components/compare/text.html new file mode 100644 index 0000000..9b30909 --- /dev/null +++ b/examples-react/src/pages/components/compare/text.html @@ -0,0 +1,20 @@ + + + + + + + + + + + +
            + + + + diff --git a/examples-react/src/pages/components/compare/text.tsx b/examples-react/src/pages/components/compare/text.tsx new file mode 100644 index 0000000..26c2393 --- /dev/null +++ b/examples-react/src/pages/components/compare/text.tsx @@ -0,0 +1,20 @@ +import { Compare } from '@/components/compare' + +export function Example() { + return ( + + + +
            +
            PRIMARY
            +
            PRIMARY
            +
            +
            + ) +} + diff --git a/examples-react/src/pages/components/control/basic.html b/examples-react/src/pages/components/control/basic.html new file mode 100644 index 0000000..2fea1c6 --- /dev/null +++ b/examples-react/src/pages/components/control/basic.html @@ -0,0 +1,19 @@ + + + + + + + + + + + +
            + + + diff --git a/examples-react/src/pages/components/control/basic.tsx b/examples-react/src/pages/components/control/basic.tsx new file mode 100644 index 0000000..330fb09 --- /dev/null +++ b/examples-react/src/pages/components/control/basic.tsx @@ -0,0 +1,9 @@ +import { Control } from '@/components/control' + +export function Example() { + return ( + + + + ) +} diff --git a/examples-react/src/pages/components/details/checkbox.html b/examples-react/src/pages/components/details/checkbox.html new file mode 100644 index 0000000..9b30909 --- /dev/null +++ b/examples-react/src/pages/components/details/checkbox.html @@ -0,0 +1,20 @@ + + + + + + + + + + + +
            + + + + diff --git a/examples-react/src/pages/components/details/checkbox.tsx b/examples-react/src/pages/components/details/checkbox.tsx new file mode 100644 index 0000000..6e02f3d --- /dev/null +++ b/examples-react/src/pages/components/details/checkbox.tsx @@ -0,0 +1,18 @@ +import { Details } from '@/components/details' + +export function Example() { + return ( +
            + + + +
            + +
            +
            + ) +} + diff --git a/examples-react/src/pages/components/dialog/basic.html b/examples-react/src/pages/components/dialog/basic.html new file mode 100644 index 0000000..2fea1c6 --- /dev/null +++ b/examples-react/src/pages/components/dialog/basic.html @@ -0,0 +1,19 @@ + + + + + + + + + + + +
            + + + diff --git a/examples-react/src/pages/components/dialog/basic.tsx b/examples-react/src/pages/components/dialog/basic.tsx new file mode 100644 index 0000000..0571109 --- /dev/null +++ b/examples-react/src/pages/components/dialog/basic.tsx @@ -0,0 +1,24 @@ +import { useId } from 'react' +import { Button } from '@/components/button' +import { Dialog, DialogContent } from '@/components/dialog' +import { Heading } from '@/components/heading' + +export function Example() { + const dialogBasic = useId() + + return ( + <> + + + + Hello there! + + + + + ) +} diff --git a/examples-react/src/pages/components/drawer/bottom.html b/examples-react/src/pages/components/drawer/bottom.html new file mode 100644 index 0000000..9b30909 --- /dev/null +++ b/examples-react/src/pages/components/drawer/bottom.html @@ -0,0 +1,20 @@ + + + + + + + + + + + +
            + + + + diff --git a/examples-react/src/pages/components/drawer/bottom.tsx b/examples-react/src/pages/components/drawer/bottom.tsx new file mode 100644 index 0000000..426210f --- /dev/null +++ b/examples-react/src/pages/components/drawer/bottom.tsx @@ -0,0 +1,26 @@ +import type { CSSProperties } from 'react' +import { useId, useRef } from 'react' +import { Drawer, DrawerContent, DrawerScroller } from '@/components/drawer' +import { Button } from '@/components/button' + +export function Example() { + const drawerId = useId() + const contentElement = useRef(null) + + return ( + <> + + + + + Drawer content + + + + + + ) +} + diff --git a/examples-react/src/pages/components/drawer/dialog.html b/examples-react/src/pages/components/drawer/dialog.html new file mode 100644 index 0000000..9b30909 --- /dev/null +++ b/examples-react/src/pages/components/drawer/dialog.html @@ -0,0 +1,20 @@ + + + + + + + + + + + +
            + + + + diff --git a/examples-react/src/pages/components/drawer/dialog.tsx b/examples-react/src/pages/components/drawer/dialog.tsx new file mode 100644 index 0000000..07ad77f --- /dev/null +++ b/examples-react/src/pages/components/drawer/dialog.tsx @@ -0,0 +1,36 @@ +import { useId, useRef } from 'react' +import { Drawer, DrawerScroller } from '@/components/drawer' +import { Button } from '@/components/button' + +export function Example() { + const drawerId = useId() + const contentElement = useRef(null) + + return ( + <> + + + +
            +
            Dialog drawer
            +
            +
            +

            This component behaves as a bottom drawer on small screens and as a dialog on larger screens.

            +
            +
            + + +
            +
            +
            + + ) +} + diff --git a/examples-react/src/pages/components/drawer/left.html b/examples-react/src/pages/components/drawer/left.html new file mode 100644 index 0000000..9b30909 --- /dev/null +++ b/examples-react/src/pages/components/drawer/left.html @@ -0,0 +1,20 @@ + + + + + + + + + + + +
            + + + + diff --git a/examples-react/src/pages/components/drawer/left.tsx b/examples-react/src/pages/components/drawer/left.tsx new file mode 100644 index 0000000..99af679 --- /dev/null +++ b/examples-react/src/pages/components/drawer/left.tsx @@ -0,0 +1,25 @@ +import { useId, useRef } from "react" +import { Drawer, DrawerContent, DrawerScroller } from "@/components/drawer" +import { Button } from "@/components/button" + +export function Example() { + const drawerLeft = useId() + const contentElement = useRef(null) + + return ( + <> + + + + + Drawer content + + + + + + ) +} + diff --git a/examples-react/src/pages/components/drawer/noscript.html b/examples-react/src/pages/components/drawer/noscript.html new file mode 100644 index 0000000..9b30909 --- /dev/null +++ b/examples-react/src/pages/components/drawer/noscript.html @@ -0,0 +1,20 @@ + + + + + + + + + + + +
            + + + + diff --git a/examples-react/src/pages/components/drawer/noscript.tsx b/examples-react/src/pages/components/drawer/noscript.tsx new file mode 100644 index 0000000..3c5f5d6 --- /dev/null +++ b/examples-react/src/pages/components/drawer/noscript.tsx @@ -0,0 +1,25 @@ +import { useId, useRef } from 'react' +import { Drawer, DrawerContent, DrawerScroller } from '@/components/drawer' +import { Button } from '@/components/button' + +export function Example() { + const drawerId = useId() + const contentElement = useRef(null) + + return ( + <> + + + + + Drawer content + + + + + + ) +} + diff --git a/examples-react/src/pages/components/drawer/right.html b/examples-react/src/pages/components/drawer/right.html new file mode 100644 index 0000000..9b30909 --- /dev/null +++ b/examples-react/src/pages/components/drawer/right.html @@ -0,0 +1,20 @@ + + + + + + + + + + + +
            + + + + diff --git a/examples-react/src/pages/components/drawer/right.tsx b/examples-react/src/pages/components/drawer/right.tsx new file mode 100644 index 0000000..ca8394f --- /dev/null +++ b/examples-react/src/pages/components/drawer/right.tsx @@ -0,0 +1,25 @@ +import { useId, useRef } from 'react' +import { Drawer, DrawerContent, DrawerScroller } from '@/components/drawer' +import { Button } from '@/components/button' + +export function Example() { + const drawerId = useId() + const contentElement = useRef(null) + + return ( + <> + + + + + Drawer content + + + + + + ) +} + diff --git a/examples-react/src/pages/components/drawer/top.html b/examples-react/src/pages/components/drawer/top.html new file mode 100644 index 0000000..9b30909 --- /dev/null +++ b/examples-react/src/pages/components/drawer/top.html @@ -0,0 +1,20 @@ + + + + + + + + + + + +
            + + + + diff --git a/examples-react/src/pages/components/drawer/top.tsx b/examples-react/src/pages/components/drawer/top.tsx new file mode 100644 index 0000000..06f9576 --- /dev/null +++ b/examples-react/src/pages/components/drawer/top.tsx @@ -0,0 +1,26 @@ +import type { CSSProperties } from 'react' +import { useId, useRef } from 'react' +import { Drawer, DrawerContent, DrawerScroller } from '@/components/drawer' +import { Button } from '@/components/button' + +export function Example() { + const drawerId = useId() + const contentElement = useRef(null) + + return ( + <> + + + + + Drawer content + + + + + + ) +} + diff --git a/examples-react/src/pages/components/field/basic.html b/examples-react/src/pages/components/field/basic.html new file mode 100644 index 0000000..9b30909 --- /dev/null +++ b/examples-react/src/pages/components/field/basic.html @@ -0,0 +1,20 @@ + + + + + + + + + + + +
            + + + + diff --git a/examples-react/src/pages/components/field/basic.tsx b/examples-react/src/pages/components/field/basic.tsx new file mode 100644 index 0000000..3d091e5 --- /dev/null +++ b/examples-react/src/pages/components/field/basic.tsx @@ -0,0 +1,17 @@ +import { Field } from "@/components/field" +import { Label } from "@/components/label" +import { Control } from "@/components/control" +import { Info } from "@/components/info" + +export function Example() { + return ( + + + + + + Info message + + ) +} + diff --git a/examples-react/src/pages/components/image/picture.html b/examples-react/src/pages/components/image/picture.html new file mode 100644 index 0000000..9b30909 --- /dev/null +++ b/examples-react/src/pages/components/image/picture.html @@ -0,0 +1,20 @@ + + + + + + + + + + + +
            + + + + diff --git a/examples-react/src/pages/components/image/picture.tsx b/examples-react/src/pages/components/image/picture.tsx new file mode 100644 index 0000000..2e5eead --- /dev/null +++ b/examples-react/src/pages/components/image/picture.tsx @@ -0,0 +1,11 @@ +import { Image } from '@/components/image' + +export function Example() { + return ( + + + + + ) +} + diff --git a/examples-react/src/pages/components/image/ratio.html b/examples-react/src/pages/components/image/ratio.html new file mode 100644 index 0000000..9b30909 --- /dev/null +++ b/examples-react/src/pages/components/image/ratio.html @@ -0,0 +1,20 @@ + + + + + + + + + + + +
            + + + + diff --git a/examples-react/src/pages/components/image/ratio.tsx b/examples-react/src/pages/components/image/ratio.tsx new file mode 100644 index 0000000..515f5a9 --- /dev/null +++ b/examples-react/src/pages/components/image/ratio.tsx @@ -0,0 +1,10 @@ +import { Image } from '@/components/image' + +export function Example() { + return ( + + + + ) +} + diff --git a/examples-react/src/pages/components/image/skeleton.html b/examples-react/src/pages/components/image/skeleton.html new file mode 100644 index 0000000..2fea1c6 --- /dev/null +++ b/examples-react/src/pages/components/image/skeleton.html @@ -0,0 +1,19 @@ + + + + + + + + + + + +
            + + + diff --git a/examples-react/src/pages/components/image/skeleton.tsx b/examples-react/src/pages/components/image/skeleton.tsx new file mode 100644 index 0000000..1e23805 --- /dev/null +++ b/examples-react/src/pages/components/image/skeleton.tsx @@ -0,0 +1,9 @@ +import { Image } from '@/components/image' + +export function Example() { + return ( + + + + ) +} diff --git a/examples-react/src/pages/components/popover/api.html b/examples-react/src/pages/components/popover/api.html new file mode 100644 index 0000000..9b30909 --- /dev/null +++ b/examples-react/src/pages/components/popover/api.html @@ -0,0 +1,20 @@ + + + + + + + + + + + +
            + + + + diff --git a/examples-react/src/pages/components/popover/api.tsx b/examples-react/src/pages/components/popover/api.tsx new file mode 100644 index 0000000..3b898e4 --- /dev/null +++ b/examples-react/src/pages/components/popover/api.tsx @@ -0,0 +1,21 @@ +import { useId } from 'react' +import { Button } from '@/components/button' +import { Popover, PopoverContent } from '@/components/popover' + +export function Example() { + const popoverApi = useId() + + return ( +
            + + + + + + + +
            + ) +} diff --git a/examples-react/src/pages/components/popover/basic.html b/examples-react/src/pages/components/popover/basic.html new file mode 100644 index 0000000..2fea1c6 --- /dev/null +++ b/examples-react/src/pages/components/popover/basic.html @@ -0,0 +1,19 @@ + + + + + + + + + + + +
            + + + diff --git a/examples-react/src/pages/components/popover/basic.tsx b/examples-react/src/pages/components/popover/basic.tsx new file mode 100644 index 0000000..1a59b0a --- /dev/null +++ b/examples-react/src/pages/components/popover/basic.tsx @@ -0,0 +1,21 @@ +import { useId } from 'react' +import { Button } from '@/components/button' +import { Popover, PopoverContent } from '@/components/popover' + +export function Example() { + const popoverBasic = useId() + + return ( + <> + + + + + + + + + ) +} diff --git a/examples-react/src/pages/components/popover/interest.html b/examples-react/src/pages/components/popover/interest.html new file mode 100644 index 0000000..2fea1c6 --- /dev/null +++ b/examples-react/src/pages/components/popover/interest.html @@ -0,0 +1,19 @@ + + + + + + + + + + + +
            + + + diff --git a/examples-react/src/pages/components/popover/interest.tsx b/examples-react/src/pages/components/popover/interest.tsx new file mode 100644 index 0000000..b6202f1 --- /dev/null +++ b/examples-react/src/pages/components/popover/interest.tsx @@ -0,0 +1,19 @@ +import { useId } from 'react' +import { Button } from '@/components/button' +import { Popover, PopoverContent } from '@/components/popover' + +export function Example() { + const popoverInterest = useId() + + return ( + <> + + + + + + + + + ) +} diff --git a/examples-react/src/pages/components/popover/tooltip.html b/examples-react/src/pages/components/popover/tooltip.html new file mode 100644 index 0000000..2fea1c6 --- /dev/null +++ b/examples-react/src/pages/components/popover/tooltip.html @@ -0,0 +1,19 @@ + + + + + + + + + + + +
            + + + diff --git a/examples-react/src/pages/components/popover/tooltip.tsx b/examples-react/src/pages/components/popover/tooltip.tsx new file mode 100644 index 0000000..6c62c02 --- /dev/null +++ b/examples-react/src/pages/components/popover/tooltip.tsx @@ -0,0 +1,20 @@ +import { type CSSProperties, useId } from 'react' +import { Button } from '@/components/button' +import { Popover, PopoverContent } from '@/components/popover' + +export function Example() { + const tooltipPopover = useId() + + return ( + <> + + + + Popover + + + + ) +} diff --git a/examples-react/src/pages/components/range/default.html b/examples-react/src/pages/components/range/default.html new file mode 100644 index 0000000..9b30909 --- /dev/null +++ b/examples-react/src/pages/components/range/default.html @@ -0,0 +1,20 @@ + + + + + + + + + + + +
            + + + + diff --git a/examples-react/src/pages/components/range/default.tsx b/examples-react/src/pages/components/range/default.tsx new file mode 100644 index 0000000..a4222f8 --- /dev/null +++ b/examples-react/src/pages/components/range/default.tsx @@ -0,0 +1,19 @@ +import { useRef } from "react" +import { Range } from "@/components/range" + +export function Example() { + const startElement = useRef(null) + + return ( + <> + + {({ setValue }) => ( + + )} + + + 10 000 + + ) +} + diff --git a/examples-react/src/pages/components/range/multi.html b/examples-react/src/pages/components/range/multi.html new file mode 100644 index 0000000..9b30909 --- /dev/null +++ b/examples-react/src/pages/components/range/multi.html @@ -0,0 +1,20 @@ + + + + + + + + + + + +
            + + + + diff --git a/examples-react/src/pages/components/range/multi.tsx b/examples-react/src/pages/components/range/multi.tsx new file mode 100644 index 0000000..50e8e02 --- /dev/null +++ b/examples-react/src/pages/components/range/multi.tsx @@ -0,0 +1,26 @@ +import { useRef } from 'react' +import { Range } from '@/components/range' + +export function Example() { + const startElement = useRef(null) + const endElement = useRef(null) + + return ( + <> + + {({ setValue }) => ( + <> + + + + )} + + +
            + 0 + 10 000 +
            + + ) +} + diff --git a/examples-react/src/pages/components/range/vertical.html b/examples-react/src/pages/components/range/vertical.html new file mode 100644 index 0000000..9b30909 --- /dev/null +++ b/examples-react/src/pages/components/range/vertical.html @@ -0,0 +1,20 @@ + + + + + + + + + + + +
            + + + + diff --git a/examples-react/src/pages/components/range/vertical.tsx b/examples-react/src/pages/components/range/vertical.tsx new file mode 100644 index 0000000..c36c21c --- /dev/null +++ b/examples-react/src/pages/components/range/vertical.tsx @@ -0,0 +1,19 @@ +import { useRef } from 'react' +import { Range } from '@/components/range' + +export function Example() { + const startElement = useRef(null) + + return ( + <> + + {({ setValue }) => ( + + )} + + + 10 000 + + ) +} + diff --git a/examples-react/src/pages/components/tabs/custom.html b/examples-react/src/pages/components/tabs/custom.html new file mode 100644 index 0000000..9b30909 --- /dev/null +++ b/examples-react/src/pages/components/tabs/custom.html @@ -0,0 +1,20 @@ + + + + + + + + + + + +
            + + + + diff --git a/examples-react/src/pages/components/tabs/custom.tsx b/examples-react/src/pages/components/tabs/custom.tsx new file mode 100644 index 0000000..0f66473 --- /dev/null +++ b/examples-react/src/pages/components/tabs/custom.tsx @@ -0,0 +1,47 @@ +import { createRef, useRef } from 'react' +import { Tabs, TabsList } from '@/components/tabs' + +const tabs = ['All', 'Photos', 'Music', 'Documents'] + +export function Example() { + const tabElements = useRef(tabs.map(() => createRef())).current + const tabPanelElements = useRef(tabs.map(() => createRef())).current + + return ( + + {({ toggleTab }) => ( + <> + + {tabs.map((tab, index) => ( + + ))} + + {tabs.map((tab, index) => ( +
            + {tab} +
            + ))} + + )} +
            + ) +} diff --git a/examples-react/src/pages/components/tabs/default.html b/examples-react/src/pages/components/tabs/default.html new file mode 100644 index 0000000..9b30909 --- /dev/null +++ b/examples-react/src/pages/components/tabs/default.html @@ -0,0 +1,20 @@ + + + + + + + + + + + +
            + + + + diff --git a/examples-react/src/pages/components/tabs/default.tsx b/examples-react/src/pages/components/tabs/default.tsx new file mode 100644 index 0000000..85df50b --- /dev/null +++ b/examples-react/src/pages/components/tabs/default.tsx @@ -0,0 +1,47 @@ +import { createRef, useRef } from 'react' +import { Tabs, TabsList } from "@/components/tabs" + +const tabs = ['All', 'Photos', 'Music', 'Documents'] + +export function Example() { + const tabElements = useRef(tabs.map(() => createRef())).current + const tabPanelElements = useRef(tabs.map(() => createRef())).current + + return ( + + {({ toggleTab }) => ( + <> + + {tabs.map((tab, index) => ( + + ))} + + {tabs.map((tab, index) => ( +
            + {tab} +
            + ))} + + )} +
            + ) +} diff --git a/examples-react/src/pages/components/toast/default.html b/examples-react/src/pages/components/toast/default.html new file mode 100644 index 0000000..9b30909 --- /dev/null +++ b/examples-react/src/pages/components/toast/default.html @@ -0,0 +1,20 @@ + + + + + + + + + + + +
            + + + + diff --git a/examples-react/src/pages/components/toast/default.tsx b/examples-react/src/pages/components/toast/default.tsx new file mode 100644 index 0000000..a491b29 --- /dev/null +++ b/examples-react/src/pages/components/toast/default.tsx @@ -0,0 +1,41 @@ +import { useState } from "react" +import { Button } from "@/components/button" +import { Title } from "@/components/title" +import { Text } from "@/components/text" +import { Toast, ToastContent } from "@/components/toast" +import { Toaster } from "@/components/toaster" + +export function Example() { + const [toasts, setToasts] = useState([]) + + const showToast = () => { + setToasts(current => [...current, Date.now()]) + } + + const closeToast = (toast: number) => { + setToasts(current => current.filter(item => item !== toast)) + } + + return ( + <> + + + + {toasts.map((toast) => ( + closeToast(toast)}> + {({ close }) => ( + +
            + Hello toast + Amazing toast +
            + +
            + )} +
            + ))} +
            + + ) +} + diff --git a/examples-react/src/pages/components/toaster/default.html b/examples-react/src/pages/components/toaster/default.html new file mode 100644 index 0000000..9b30909 --- /dev/null +++ b/examples-react/src/pages/components/toaster/default.html @@ -0,0 +1,20 @@ + + + + + + + + + + + +
            + + + + diff --git a/examples-react/src/pages/components/toaster/default.tsx b/examples-react/src/pages/components/toaster/default.tsx new file mode 100644 index 0000000..37c56cd --- /dev/null +++ b/examples-react/src/pages/components/toaster/default.tsx @@ -0,0 +1,39 @@ +import { useState } from "react" +import { Button } from "@/components/button" +import { Title } from "@/components/title" +import { Text } from "@/components/text" +import { Toast, ToastContent } from "@/components/toast" +import { Toaster } from "@/components/toaster" + +export function Example() { + const [toasts, setToasts] = useState([Date.now()]) + + const closeToast = (toast: number) => { + setToasts(current => current.filter(item => item !== toast)) + } + + const closeToaster = () => { + setToasts([]) + } + + return ( + <> + + + + {toasts.map((toast) => ( + closeToast(toast)}> + +
            + Hello toast + Amazing toast +
            + +
            +
            + ))} +
            + + ) +} + diff --git a/examples-react/src/pages/form.html b/examples-react/src/pages/form.html new file mode 100644 index 0000000..9b30909 --- /dev/null +++ b/examples-react/src/pages/form.html @@ -0,0 +1,20 @@ + + + + + + + + + + + +
            + + + + diff --git a/examples-react/src/pages/form.tsx b/examples-react/src/pages/form.tsx new file mode 100644 index 0000000..2c11ef8 --- /dev/null +++ b/examples-react/src/pages/form.tsx @@ -0,0 +1,34 @@ +import { Form } from '@/components/form' +import { Field } from '@/components/field' +import { Label } from '@/components/label' +import { Control } from '@/components/control' +import { Button } from '@/components/button' + +export function Example() { + return ( +
            + + + + + + + + + + + + + + + + + + + + + +
            + ) +} + diff --git a/examples-react/src/pages/index.html b/examples-react/src/pages/index.html new file mode 100644 index 0000000..f71454c --- /dev/null +++ b/examples-react/src/pages/index.html @@ -0,0 +1,88 @@ + + + + + + + + + + + + +
            +
            +

            Winduum React examples

            +

            Browse or filter the generated example pages.

            +
            +
            + +
            +

            0 examples

            +
              + +
            + +
            + + diff --git a/examples-react/src/styles/main.css b/examples-react/src/styles/main.css new file mode 100644 index 0000000..608a7da --- /dev/null +++ b/examples-react/src/styles/main.css @@ -0,0 +1,23 @@ +@import "tailwindcss/theme.css" layer(theme); +@import "winduum/tailwindcss/theme/config/index.css" layer(theme); +@import "winduum/tailwindcss/theme/default.css" layer(theme); +@import "winduum/src/theme/dark.css" layer(theme); +@import "winduum/src/base/reset.css" layer(base); +@import "winduum/src/base/defaults.css" layer(base); + +@import "winduum/src/components/index.css" layer(utilities); +@import "winduum/src/components/drawer/nosnap.css" layer(utilities); +@import "winduum/src/utilities/container/props/default.css" layer(theme); +@import "winduum/src/utilities/ripple/keyframes/default.css"; +@import "winduum/src/utilities/skeleton/props/default.css" layer(theme); +@import "winduum/src/utilities/spinner/keyframes/ring.css"; + +@import "winduum/tailwindcss/utilities/index.css"; +@import "tailwindcss/utilities" layer(utilities); +@import "winduum/tailwindcss/variants/index.css"; +@import "winduum/src/base/breakpoints.css"; +@import "winduum/src/base/keyframes.css"; +@import "winduum/src/base/transitions.css"; + +@source "../../node_modules/winduum/src"; +@source "../../node_modules/winduum-react"; \ No newline at end of file diff --git a/examples-react/src/styles/style.css b/examples-react/src/styles/style.css new file mode 100644 index 0000000..8d72b2b --- /dev/null +++ b/examples-react/src/styles/style.css @@ -0,0 +1,27 @@ +:root, :host { + height: 100%; + background-color: var(--color-body); + + &.dark { + --color-body: rgb(10, 10, 10); + } +} + +:where(body) { + display: flex; + gap: 0.5rem; + padding: 1rem; + justify-content: center; + align-items: center; + align-content: center; + flex-direction: row; + flex-wrap: wrap; + border-radius: var(--radius); + min-height: 100%; + background: transparent; +} + +#app { + display: contents; +} + diff --git a/examples-react/src/types.d.ts b/examples-react/src/types.d.ts new file mode 100644 index 0000000..cfb28a7 --- /dev/null +++ b/examples-react/src/types.d.ts @@ -0,0 +1 @@ +declare module 'interestfor' diff --git a/examples-react/tsconfig.json b/examples-react/tsconfig.json new file mode 100644 index 0000000..4a2c30f --- /dev/null +++ b/examples-react/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "module": "ESNext", + "moduleResolution": "Bundler", + "allowImportingTsExtensions": true, + "strict": true, + "jsx": "react-jsx", + "resolveJsonModule": true, + "isolatedModules": true, + "esModuleInterop": true, + "lib": ["ESNext", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + "types": ["vite/client"], + "baseUrl": ".", + "paths": { + "@/components/field": ["src/adapters/field/index.ts"], + "@/*": ["node_modules/winduum-react/src/*"] + } + }, + "include": ["src/**/*.ts", "src/**/*.tsx"] +} diff --git a/examples-react/vite.config.js b/examples-react/vite.config.js new file mode 100644 index 0000000..efdd6ad --- /dev/null +++ b/examples-react/vite.config.js @@ -0,0 +1,45 @@ +import { resolve, relative } from 'path' +import { defineConfig } from 'vite' +import vituum from 'vituum' +import tailwindcss from '@tailwindcss/vite' +import framework from '@vitejs/plugin-react' +import { examplesIndex } from '../examples-index-plugin.js' + +const htmlPlugin = () => ({ + name: 'html-transform', + transformIndexHtml: { + order: 'post', + handler(html, { path }) { + return html.replaceAll( + '"/assets/', + `"${relative(path, '/src/pages/').slice(0, -2)}assets/` + ) + } + } +}) + +export default defineConfig({ + resolve: { + alias: [ + { + find: '@/components/field', + replacement: resolve(process.cwd(), 'src/adapters/field/index.ts') + }, + { + find: '@', + replacement: resolve(process.cwd(), 'node_modules/winduum-react/src') + } + ] + }, + plugins: [vituum(), framework(), tailwindcss(), examplesIndex({ + pagesDirectory: resolve(process.cwd(), 'src/pages'), + extension: '.html' + }), htmlPlugin()], + build: { + target: 'esnext', + manifest: false, + modulePreload: false, + emptyOutDir: true, + outDir: resolve(process.cwd(), '../docs/public/examples-react') + } +}) diff --git a/examples-stimulus/package-lock.json b/examples-stimulus/package-lock.json new file mode 100644 index 0000000..5bac560 --- /dev/null +++ b/examples-stimulus/package-lock.json @@ -0,0 +1,2228 @@ +{ + "name": "examples-stimulus", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "@floating-ui/dom": "^1.6.13", + "@hotwired/stimulus": "^3.2.2", + "@tailwindcss/vite": "^4.0.0", + "@vituum/vite-plugin-liquid": "^1.1.0", + "interestfor": "^1.0.0", + "invokers-polyfill": "^1.0.3", + "tailwindcss": "^4.3.2", + "vite": "^6.0.11", + "vituum": "^1.1.1", + "winduum": "^3.0.0-next.16", + "winduum-stimulus": "^3.0.0-next.1" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.8.0.tgz", + "integrity": "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.12" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.8.0.tgz", + "integrity": "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.8.0", + "@floating-ui/utils": "^0.2.12" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.12.tgz", + "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==", + "license": "MIT" + }, + "node_modules/@hotwired/stimulus": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@hotwired/stimulus/-/stimulus-3.2.2.tgz", + "integrity": "sha512-eGeIqNOQpXoPAIP7tC1+1Yc1yl1xnwYqg+3mzqxyrbE5pg5YFBZcA6YoTiByJB6DKAEsiWtl6tjTJS4IYtbB7A==", + "license": "MIT" + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@newlogic-digital/utils-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@newlogic-digital/utils-js/-/utils-js-1.2.0.tgz", + "integrity": "sha512-tObXqpJKB8C9AvHACfCqJZkKHbDAIBTgO9RpMM01Ow/0pxX9G5vB8OSZ2W9eInMA9oB6BYGtPCzvO7MdZ2CWhw==", + "license": "MIT", + "engines": { + "node": ">=20.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==", + "license": "MIT", + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.2.tgz", + "integrity": "sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.2.tgz", + "integrity": "sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.2.tgz", + "integrity": "sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.2.tgz", + "integrity": "sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.2.tgz", + "integrity": "sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.2.tgz", + "integrity": "sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.2.tgz", + "integrity": "sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==", + "cpu": [ + "arm" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.2.tgz", + "integrity": "sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==", + "cpu": [ + "arm" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.2.tgz", + "integrity": "sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.2.tgz", + "integrity": "sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.2.tgz", + "integrity": "sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==", + "cpu": [ + "loong64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.2.tgz", + "integrity": "sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==", + "cpu": [ + "loong64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.2.tgz", + "integrity": "sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.2.tgz", + "integrity": "sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==", + "cpu": [ + "ppc64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.2.tgz", + "integrity": "sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==", + "cpu": [ + "riscv64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.2.tgz", + "integrity": "sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==", + "cpu": [ + "riscv64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.2.tgz", + "integrity": "sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==", + "cpu": [ + "s390x" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.2.tgz", + "integrity": "sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.2.tgz", + "integrity": "sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.2.tgz", + "integrity": "sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.2.tgz", + "integrity": "sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.2.tgz", + "integrity": "sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.2.tgz", + "integrity": "sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.2.tgz", + "integrity": "sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.2.tgz", + "integrity": "sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@tailwindcss/node": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.2.tgz", + "integrity": "sha512-yWP/sqEcBLaD8JuA6zNwxoYKr75qxTioYwlRwekj5Jr/I5GXnoJfjetH/psLUIv74cYTH2lBUEzBkinthoYcBg==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "5.21.6", + "jiti": "^2.7.0", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.3.2" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.2.tgz", + "integrity": "sha512-z8ZgnzX8gdNoWLBLqBPoh/sjnxkwvf9ZuWjnO0l0yIzbLa5/9S+eC5QxGZKRobVHIC3/1BoMWjHblqWjcgFgag==", + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.3.2", + "@tailwindcss/oxide-darwin-arm64": "4.3.2", + "@tailwindcss/oxide-darwin-x64": "4.3.2", + "@tailwindcss/oxide-freebsd-x64": "4.3.2", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.2", + "@tailwindcss/oxide-linux-arm64-gnu": "4.3.2", + "@tailwindcss/oxide-linux-arm64-musl": "4.3.2", + "@tailwindcss/oxide-linux-x64-gnu": "4.3.2", + "@tailwindcss/oxide-linux-x64-musl": "4.3.2", + "@tailwindcss/oxide-wasm32-wasi": "4.3.2", + "@tailwindcss/oxide-win32-arm64-msvc": "4.3.2", + "@tailwindcss/oxide-win32-x64-msvc": "4.3.2" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.2.tgz", + "integrity": "sha512-WHxqIuHpvZ5VtdX6GTl1Ik/Vp2YuN42Et+0CdeaVd/frQ9jAvGmvR8vLT+jk3e8/Q3x8kECB9+R17pgpp2BulA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.2.tgz", + "integrity": "sha512-GZypeUY/IDJW3877KeM+O67vbXr3MBnbtEL4aYhNErv/JWZhye2vGSWWG9tB6iiqR2MqRNkY8IOUy4NdSZV26w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.2.tgz", + "integrity": "sha512-UIIzmefR6KO1sDU7MzRqAxC8iBpft/VhkGjTjnhoS6k7Z3rQ9wEgA1ODSiyH/tcSYssulNm4Ci3hOeK1jH7ccQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.2.tgz", + "integrity": "sha512-GN+uAmcI6DNspnCDwtOAZrTz6oukJnp337qZvxqCGLd3BHBzJpO0ZbTLRvJNdztOeAmTzewewGIMPb0tk2R4WA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.2.tgz", + "integrity": "sha512-4ABn7qSbdHRwTiDiuWNegCyb5+2FJ4vKIKc3DmKrvAFw7MU1Lm11dIkTPwUaFdTzc7IsOpDbqBrlh0x6y36U/w==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.2.tgz", + "integrity": "sha512-wDgEIGwoM8w8pufh9LVt1PahDgNdKXrLC2qfAnV3vAmococ9RWbxeAw4pxPttd/TsJfwjyLf90Dg1y9y8I6Emw==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.2.tgz", + "integrity": "sha512-J5Nuk0uZQIiMTJj3LEx4sAA9tMFUoXQZFv1J6An+QGYe53HKRJuFDi0rpq/tuouCZeAbOBY3kQ6g8qeD4TUjtA==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.2.tgz", + "integrity": "sha512-kqCZpSKOBEJO4mz7OqWoofBZeXTAwaVGPj0ErAj7CojmhKpWVWVOnrt9dE8odoIraZq4oj3ausM37kXi+Tow8w==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.2.tgz", + "integrity": "sha512-cixpqbh2toJDmkuCRI68nXA8ZxNmdK9Y+9v5h3MC3ZQKy/0BO8AWzlkWyRM7JAFSGBlfig4YVTPsK6MVgqz1uw==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.2.tgz", + "integrity": "sha512-4ec2Z/LOmRsAgU23CS4xeJfcJlmRg94A/XrbGRCF1gyU/zdDfRLYDVsS+ynSZCmGNxQ1jQriQOKMQeQxBA3Isw==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.11.1", + "@emnapi/runtime": "^1.11.1", + "@emnapi/wasi-threads": "^1.2.2", + "@napi-rs/wasm-runtime": "^1.1.4", + "@tybys/wasm-util": "^0.10.2", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.2.tgz", + "integrity": "sha512-Zyr/M0+XcYZu3bZrUytc7TXvrk0ftWfl8gN2MwekNDzhqhKRUucMPSeOzM0o0wH5AWOU49BsKRrfKxI2atCPMQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.2.tgz", + "integrity": "sha512-QI9BO7KlNZsp2GuO0jwAAj5jCDABOKXRkCk2XuKTSaNEFSdfzqswYVTtCHBNKHLsqyjFyFkqlDiwkNbTYSssMQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.2.tgz", + "integrity": "sha512-eHpMeX4JXfVNJDEcsouTeCBubJBTcTLigeaw/NTUW6PB5ATKKXdyonnXgTBX2VuRbjz1hjfz6C5XAhr52ImQXA==", + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.3.2", + "@tailwindcss/oxide": "4.3.2", + "tailwindcss": "4.3.2" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7 || ^8" + } + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "license": "MIT" + }, + "node_modules/@vituum/vite-plugin-liquid": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@vituum/vite-plugin-liquid/-/vite-plugin-liquid-1.1.0.tgz", + "integrity": "sha512-t7Lhg/8g57Omz7j3TY1k38GUlqo//eqGnKIhw0mh0OQMimqjhhxAEUVfX/S8vHuLLtkhJ/5gzwCg2dy+5W34Bw==", + "dependencies": { + "liquidjs": "^10.9", + "lodash": "^4.17", + "vituum": "^1.1" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz", + "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", + "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" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.21.6", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.6.tgz", + "integrity": "sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", + "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.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "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==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/interestfor": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/interestfor/-/interestfor-1.0.8.tgz", + "integrity": "sha512-qYwTmxzDnrosGZX/1lDEOsAv73aYiFKLniN20SS78588WhRMHj8z7u2uFe9QZPIVmkCyIbJwiMQ/85Up7hrseQ==", + "license": "BSD-3-Clause" + }, + "node_modules/invokers-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/invokers-polyfill/-/invokers-polyfill-1.0.3.tgz", + "integrity": "sha512-T8zVavFQu5GlWlpkjghmaCaTx6Wk+9tWwJ2BC4oNsNAnar6AIrvSJQFZUcYDfrxzK9thBIyZvAkeLfdN9hTzGA==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/liquidjs": { + "version": "10.27.2", + "resolved": "https://registry.npmjs.org/liquidjs/-/liquidjs-10.27.2.tgz", + "integrity": "sha512-kvknfAEtOHjHkAAv7GxLEJh8ghpMQm3Fc4uWVyF7hERSTsSRsdC7saWs0p5aDG7GDcWsu5o+T4232O+8KZO55w==", + "license": "MIT", + "dependencies": { + "commander": "^10.0.0" + }, + "bin": { + "liquid": "bin/liquid.js", + "liquidjs": "bin/liquid.js" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/liquidjs" + } + }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "license": "MIT" + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/nanoid": { + "version": "3.3.16", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", + "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.19", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.19.tgz", + "integrity": "sha512-Mz8SaolMd8nB+G13WkORcxQKHZ/NE4xXevtkJHVuG+guo9/wYKlIMTKAqGdEmYOXR2ijPjTYNHssizdaVSUNdQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/readdirp/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.2.tgz", + "integrity": "sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==", + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.62.2", + "@rollup/rollup-android-arm64": "4.62.2", + "@rollup/rollup-darwin-arm64": "4.62.2", + "@rollup/rollup-darwin-x64": "4.62.2", + "@rollup/rollup-freebsd-arm64": "4.62.2", + "@rollup/rollup-freebsd-x64": "4.62.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.62.2", + "@rollup/rollup-linux-arm-musleabihf": "4.62.2", + "@rollup/rollup-linux-arm64-gnu": "4.62.2", + "@rollup/rollup-linux-arm64-musl": "4.62.2", + "@rollup/rollup-linux-loong64-gnu": "4.62.2", + "@rollup/rollup-linux-loong64-musl": "4.62.2", + "@rollup/rollup-linux-ppc64-gnu": "4.62.2", + "@rollup/rollup-linux-ppc64-musl": "4.62.2", + "@rollup/rollup-linux-riscv64-gnu": "4.62.2", + "@rollup/rollup-linux-riscv64-musl": "4.62.2", + "@rollup/rollup-linux-s390x-gnu": "4.62.2", + "@rollup/rollup-linux-x64-gnu": "4.62.2", + "@rollup/rollup-linux-x64-musl": "4.62.2", + "@rollup/rollup-openbsd-x64": "4.62.2", + "@rollup/rollup-openharmony-arm64": "4.62.2", + "@rollup/rollup-win32-arm64-msvc": "4.62.2", + "@rollup/rollup-win32-ia32-msvc": "4.62.2", + "@rollup/rollup-win32-x64-gnu": "4.62.2", + "@rollup/rollup-win32-x64-msvc": "4.62.2", + "fsevents": "~2.3.2" + } + }, + "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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tailwindcss": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.2.tgz", + "integrity": "sha512-WtctNNSH8A9jlMIqxzuYumOHU5uGZyRv0Q5svQl+oEPy5w84YpBxdb7MdqyiSPQge5jTJ6zFQLq0PFygdccSBA==", + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/vite": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.3.tgz", + "integrity": "sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==", + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "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 + } + } + }, + "node_modules/vituum": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vituum/-/vituum-1.2.0.tgz", + "integrity": "sha512-1YYOrzrIMSeWj6zAib5VTsNo1oDcqSg45jCFjxzU70vMPBONoXXhTAMcX0p21Bj7NkzceBFgdmEtnAze258lqw==", + "dependencies": { + "chokidar": "^3.5", + "fast-glob": "^3.3", + "lodash": "^4.17", + "minimatch": "^10.0", + "vite": "^6.2" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/winduum": { + "version": "3.0.0-next.16", + "resolved": "https://registry.npmjs.org/winduum/-/winduum-3.0.0-next.16.tgz", + "integrity": "sha512-Nk6GbAATr++Z1gGR46htvbzEaDxikgmmMVXz1DRb6hRJgL3UxqCIlXtKW3zs8yWJ5msvFxWdz1DoR8a/vd8dBg==", + "engines": { + "node": ">=20.0.0", + "npm": ">=9.0.0" + } + }, + "node_modules/winduum-stimulus": { + "version": "3.0.0-next.1", + "resolved": "https://registry.npmjs.org/winduum-stimulus/-/winduum-stimulus-3.0.0-next.1.tgz", + "integrity": "sha512-mr44dTVgZDXxJe/Zx7NGsAyu7xVtnlOBpY3hAFua4LF0rBKKkpcjCuuA8GscDFk6EES82LnQjfLxh2pM0hQB5Q==", + "dependencies": { + "@hotwired/stimulus": "^3.2.2", + "@newlogic-digital/utils-js": "^1.2.0", + "winduum": "^3.0.0-next.16" + } + } + } +} diff --git a/examples-stimulus/package.json b/examples-stimulus/package.json new file mode 100644 index 0000000..bb2458e --- /dev/null +++ b/examples-stimulus/package.json @@ -0,0 +1,21 @@ +{ + "type": "module", + "scripts": { + "build": "vite build", + "dev": "vite", + "preview": "vite preview" + }, + "dependencies": { + "@hotwired/stimulus": "^3.2.2", + "@tailwindcss/vite": "^4.0.0", + "@vituum/vite-plugin-liquid": "^1.1.0", + "@floating-ui/dom": "^1.6.13", + "interestfor": "^1.0.0", + "invokers-polyfill": "^1.0.3", + "tailwindcss": "^4.3.2", + "vite": "^6.0.11", + "vituum": "^1.1.1", + "winduum": "^3.0.0-next.16", + "winduum-stimulus": "^3.0.0-next.1" + } +} diff --git a/examples-stimulus/src/application.js b/examples-stimulus/src/application.js new file mode 100644 index 0000000..49016b8 --- /dev/null +++ b/examples-stimulus/src/application.js @@ -0,0 +1,45 @@ +import { Application } from '@hotwired/stimulus' +import { Button } from 'winduum-stimulus/components/button/index.js' +import { Carousel as CarouselExperimental } from 'winduum-stimulus/components/carousel-experimental/index.js' +import { Carousel } from 'winduum-stimulus/components/carousel/index.js' +import { Compare } from 'winduum-stimulus/components/compare/index.js' +import { Control } from 'winduum-stimulus/components/control/index.js' +import { Details } from 'winduum-stimulus/components/details/index.js' +import { Drawer } from 'winduum-stimulus/components/drawer/index.js' +import { Field } from 'winduum-stimulus/components/field/index.js' +import { Form } from 'winduum-stimulus/components/form/index.js' +import { Image } from 'winduum-stimulus/components/image/index.js' +import { Popover } from 'winduum-stimulus/components/popover/index.js' +import { Range } from 'winduum-stimulus/components/range/index.js' +import { Tabs } from 'winduum-stimulus/components/tabs/index.js' +import { Toast } from 'winduum-stimulus/components/toast/index.js' +import { Toaster } from 'winduum-stimulus/components/toaster/index.js' +import { Invoke } from 'winduum-stimulus/utilities/invoke/index.js' + +const application = Application.start() + +if (!('command' in HTMLButtonElement.prototype)) { + const { apply } = await import('invokers-polyfill/fn') + apply() +} + +if (!Object.prototype.hasOwnProperty.call(HTMLButtonElement.prototype, 'interestForElement')) { + await import('interestfor') +} + +application.register('invoke', Invoke) +application.register('x-button', Button) +application.register('x-carousel-experimental', CarouselExperimental) +application.register('x-carousel', Carousel) +application.register('x-compare', Compare) +application.register('x-control', Control) +application.register('x-details', Details) +application.register('x-drawer', Drawer) +application.register('x-field', Field) +application.register('x-form', Form) +application.register('x-image', Image) +application.register('x-popover', Popover) +application.register('x-range', Range) +application.register('x-tabs', Tabs) +application.register('x-toast', Toast) +application.register('x-toaster', Toaster) diff --git a/examples-stimulus/src/pages/components/button/basic.liquid b/examples-stimulus/src/pages/components/button/basic.liquid new file mode 100644 index 0000000..35ea7ce --- /dev/null +++ b/examples-stimulus/src/pages/components/button/basic.liquid @@ -0,0 +1,7 @@ +{% layout "templates/layout.liquid" %} +{% block %} + + +Button + +{% endblock %} diff --git a/examples-stimulus/src/pages/components/carousel-experimental/basic.liquid b/examples-stimulus/src/pages/components/carousel-experimental/basic.liquid new file mode 100644 index 0000000..ef6896e --- /dev/null +++ b/examples-stimulus/src/pages/components/carousel-experimental/basic.liquid @@ -0,0 +1,42 @@ +{% layout "templates/layout.liquid" %} +{% block %} + + + +{% endblock %} + +{% block head %} + +{% endblock %} + + + diff --git a/examples-stimulus/src/pages/components/carousel-experimental/full.liquid b/examples-stimulus/src/pages/components/carousel-experimental/full.liquid new file mode 100644 index 0000000..d1d426d --- /dev/null +++ b/examples-stimulus/src/pages/components/carousel-experimental/full.liquid @@ -0,0 +1,72 @@ +{% layout "templates/layout.liquid" %} +{% block %} + + + +{% endblock %} + +{% block head %} + +{% endblock %} + + diff --git a/examples-stimulus/src/pages/components/carousel/basic.liquid b/examples-stimulus/src/pages/components/carousel/basic.liquid new file mode 100644 index 0000000..935db01 --- /dev/null +++ b/examples-stimulus/src/pages/components/carousel/basic.liquid @@ -0,0 +1,41 @@ +{% layout "templates/layout.liquid" %} +{% block %} + + + +{% endblock %} + +{% block head %} + +{% endblock %} + + diff --git a/examples-stimulus/src/pages/components/carousel/full.liquid b/examples-stimulus/src/pages/components/carousel/full.liquid new file mode 100644 index 0000000..d8fa6f8 --- /dev/null +++ b/examples-stimulus/src/pages/components/carousel/full.liquid @@ -0,0 +1,56 @@ +{% layout "templates/layout.liquid" %} +{% block %} + + + +{% endblock %} + +{% block head %} + +{% endblock %} + + diff --git a/examples-stimulus/src/pages/components/compare/default.liquid b/examples-stimulus/src/pages/components/compare/default.liquid new file mode 100644 index 0000000..c517536 --- /dev/null +++ b/examples-stimulus/src/pages/components/compare/default.liquid @@ -0,0 +1,20 @@ +{% layout "templates/layout.liquid" %} +{% block %} + +
            + + +
            + Image 1 + Image 2 +
            +
            + +{% endblock %} + + diff --git a/examples-stimulus/src/pages/components/compare/text.liquid b/examples-stimulus/src/pages/components/compare/text.liquid new file mode 100644 index 0000000..e2f4794 --- /dev/null +++ b/examples-stimulus/src/pages/components/compare/text.liquid @@ -0,0 +1,20 @@ +{% layout "templates/layout.liquid" %} +{% block %} + +
            + + +
            +
            PRIMARY
            +
            PRIMARY
            +
            +
            + +{% endblock %} + + diff --git a/examples-stimulus/src/pages/components/control/basic.liquid b/examples-stimulus/src/pages/components/control/basic.liquid new file mode 100644 index 0000000..e725f3c --- /dev/null +++ b/examples-stimulus/src/pages/components/control/basic.liquid @@ -0,0 +1,8 @@ +{% layout "templates/layout.liquid" %} +{% block %} + +
            + +
            + +{% endblock %} diff --git a/examples-stimulus/src/pages/components/details/checkbox.liquid b/examples-stimulus/src/pages/components/details/checkbox.liquid new file mode 100644 index 0000000..ea0f180 --- /dev/null +++ b/examples-stimulus/src/pages/components/details/checkbox.liquid @@ -0,0 +1,31 @@ +{% layout "templates/layout.liquid" %} +{% block %} + +
            + + + +
            + +
            +
            + +{% endblock %} + +{% block head %} + +{% endblock %} + + diff --git a/examples-stimulus/src/pages/components/dialog/basic.liquid b/examples-stimulus/src/pages/components/dialog/basic.liquid new file mode 100644 index 0000000..b4493d8 --- /dev/null +++ b/examples-stimulus/src/pages/components/dialog/basic.liquid @@ -0,0 +1,23 @@ +{% layout "templates/layout.liquid" %} +{% block %} + + + +
            +
            Example dialog
            +
            +
            +

            You can close this dialog with Esc, clicking outside, or by form submit

            +
            +
            + +
            +
            + +{% endblock %} + +{% block foot %} + +{% endblock %} diff --git a/examples-stimulus/src/pages/components/drawer/bottom.liquid b/examples-stimulus/src/pages/components/drawer/bottom.liquid new file mode 100644 index 0000000..dafb2ec --- /dev/null +++ b/examples-stimulus/src/pages/components/drawer/bottom.liquid @@ -0,0 +1,15 @@ +{% layout "templates/layout.liquid" %} +{% block %} + + + +
            + +
            +
            + +{% endblock %} + diff --git a/examples-stimulus/src/pages/components/drawer/dialog.liquid b/examples-stimulus/src/pages/components/drawer/dialog.liquid new file mode 100644 index 0000000..a743e20 --- /dev/null +++ b/examples-stimulus/src/pages/components/drawer/dialog.liquid @@ -0,0 +1,26 @@ +{% layout "templates/layout.liquid" %} +{% block %} + + + +
            +
            +
            Dialog drawer
            +
            +
            +

            This component behaves as a bottom drawer on small screens and as a dialog on larger screens.

            +
            +
            + + +
            +
            +
            + +{% endblock %} + +{% block foot %} + +{% endblock %} diff --git a/examples-stimulus/src/pages/components/drawer/left.liquid b/examples-stimulus/src/pages/components/drawer/left.liquid new file mode 100644 index 0000000..107ecec --- /dev/null +++ b/examples-stimulus/src/pages/components/drawer/left.liquid @@ -0,0 +1,15 @@ +{% layout "templates/layout.liquid" %} +{% block %} + + + +
            + +
            +
            + +{% endblock %} + diff --git a/examples-stimulus/src/pages/components/drawer/noscript.liquid b/examples-stimulus/src/pages/components/drawer/noscript.liquid new file mode 100644 index 0000000..ff2a6f8 --- /dev/null +++ b/examples-stimulus/src/pages/components/drawer/noscript.liquid @@ -0,0 +1,15 @@ +{% layout "templates/layout.liquid" %} +{% block %} + + + +
            + +
            +
            + +{% endblock %} + diff --git a/examples-stimulus/src/pages/components/drawer/right.liquid b/examples-stimulus/src/pages/components/drawer/right.liquid new file mode 100644 index 0000000..ab12754 --- /dev/null +++ b/examples-stimulus/src/pages/components/drawer/right.liquid @@ -0,0 +1,15 @@ +{% layout "templates/layout.liquid" %} +{% block %} + + + +
            + +
            +
            + +{% endblock %} + diff --git a/examples-stimulus/src/pages/components/drawer/top.liquid b/examples-stimulus/src/pages/components/drawer/top.liquid new file mode 100644 index 0000000..ffe3620 --- /dev/null +++ b/examples-stimulus/src/pages/components/drawer/top.liquid @@ -0,0 +1,15 @@ +{% layout "templates/layout.liquid" %} +{% block %} + + + +
            + +
            +
            + +{% endblock %} + diff --git a/examples-stimulus/src/pages/components/field/basic.liquid b/examples-stimulus/src/pages/components/field/basic.liquid new file mode 100644 index 0000000..6e7b218 --- /dev/null +++ b/examples-stimulus/src/pages/components/field/basic.liquid @@ -0,0 +1,22 @@ +{% layout "templates/layout.liquid" %} +{% block %} + +
            + +
            + +
            + Info message +
            + +{% endblock %} + +{% block foot %} + + +{% endblock %} + diff --git a/examples-stimulus/src/pages/components/image/picture.liquid b/examples-stimulus/src/pages/components/image/picture.liquid new file mode 100644 index 0000000..f221236 --- /dev/null +++ b/examples-stimulus/src/pages/components/image/picture.liquid @@ -0,0 +1,11 @@ +{% layout "templates/layout.liquid" %} +{% block %} + + + + + + +{% endblock %} + + diff --git a/examples-stimulus/src/pages/components/image/ratio.liquid b/examples-stimulus/src/pages/components/image/ratio.liquid new file mode 100644 index 0000000..d99e693 --- /dev/null +++ b/examples-stimulus/src/pages/components/image/ratio.liquid @@ -0,0 +1,10 @@ +{% layout "templates/layout.liquid" %} +{% block %} + +
            + +
            + +{% endblock %} + + diff --git a/examples-stimulus/src/pages/components/image/skeleton.liquid b/examples-stimulus/src/pages/components/image/skeleton.liquid new file mode 100644 index 0000000..ea200ca --- /dev/null +++ b/examples-stimulus/src/pages/components/image/skeleton.liquid @@ -0,0 +1,16 @@ +{% layout "templates/layout.liquid" %} +{% block %} + +
            + +
            + +{% endblock %} + +{% block head %} + +{% endblock %} diff --git a/examples-stimulus/src/pages/components/popover/api.liquid b/examples-stimulus/src/pages/components/popover/api.liquid new file mode 100644 index 0000000..7b6c61f --- /dev/null +++ b/examples-stimulus/src/pages/components/popover/api.liquid @@ -0,0 +1,23 @@ +{% layout "templates/layout.liquid" %} +{% block %} + +
            + +
            +
            + + +
            +
            +
            + +{% endblock %} + +{% block head %} + +{% endblock %} + diff --git a/examples-stimulus/src/pages/components/popover/tooltip.liquid b/examples-stimulus/src/pages/components/popover/tooltip.liquid new file mode 100644 index 0000000..690fcd9 --- /dev/null +++ b/examples-stimulus/src/pages/components/popover/tooltip.liquid @@ -0,0 +1,11 @@ +{% layout "templates/layout.liquid" %} +{% block %} + + +
            +
            + Popover +
            +
            + +{% endblock %} diff --git a/examples-stimulus/src/pages/components/range/default.liquid b/examples-stimulus/src/pages/components/range/default.liquid new file mode 100644 index 0000000..cc372e9 --- /dev/null +++ b/examples-stimulus/src/pages/components/range/default.liquid @@ -0,0 +1,20 @@ +{% layout "templates/layout.liquid" %} +{% block %} + +
            + +
            + +10 000 + +{% endblock %} + +{% block head %} + +{% endblock %} + + diff --git a/examples-stimulus/src/pages/components/range/multi.liquid b/examples-stimulus/src/pages/components/range/multi.liquid new file mode 100644 index 0000000..64adf4d --- /dev/null +++ b/examples-stimulus/src/pages/components/range/multi.liquid @@ -0,0 +1,24 @@ +{% layout "templates/layout.liquid" %} +{% block %} + +
            + + +
            + +
            + 0 + 10 000 +
            + +{% endblock %} + +{% block head %} + +{% endblock %} + + diff --git a/examples-stimulus/src/pages/components/range/vertical.liquid b/examples-stimulus/src/pages/components/range/vertical.liquid new file mode 100644 index 0000000..8bf4935 --- /dev/null +++ b/examples-stimulus/src/pages/components/range/vertical.liquid @@ -0,0 +1,20 @@ +{% layout "templates/layout.liquid" %} +{% block %} + +
            + +
            + +10 000 + +{% endblock %} + +{% block head %} + +{% endblock %} + + diff --git a/examples-stimulus/src/pages/components/tabs/custom.liquid b/examples-stimulus/src/pages/components/tabs/custom.liquid new file mode 100644 index 0000000..baeb180 --- /dev/null +++ b/examples-stimulus/src/pages/components/tabs/custom.liquid @@ -0,0 +1,49 @@ +{% layout "templates/layout.liquid" %} +{% block %} + +
            +
            + + + + +
            +
            + All +
            + + + +
            + +{% endblock %} + + +{% block head %} + +{% endblock %} + diff --git a/examples-stimulus/src/pages/components/tabs/default.liquid b/examples-stimulus/src/pages/components/tabs/default.liquid new file mode 100644 index 0000000..de40ce9 --- /dev/null +++ b/examples-stimulus/src/pages/components/tabs/default.liquid @@ -0,0 +1,43 @@ +{% layout "templates/layout.liquid" %} +{% block %} + +
            +
            + + + + +
            +
            + All +
            + + + +
            + +{% endblock %} + +{% block head %} + +{% endblock %} + diff --git a/examples-stimulus/src/pages/components/toast/default.liquid b/examples-stimulus/src/pages/components/toast/default.liquid new file mode 100644 index 0000000..fe685c3 --- /dev/null +++ b/examples-stimulus/src/pages/components/toast/default.liquid @@ -0,0 +1,34 @@ +{% layout "templates/layout.liquid" %} +{% block %} + + + + + +
              + +{% endblock %} + +{% block foot %} + + + +{% endblock %} + diff --git a/examples-stimulus/src/pages/components/toaster/default.liquid b/examples-stimulus/src/pages/components/toaster/default.liquid new file mode 100644 index 0000000..491c299 --- /dev/null +++ b/examples-stimulus/src/pages/components/toaster/default.liquid @@ -0,0 +1,37 @@ +{% layout "templates/layout.liquid" %} +{% block %} + +
              + + + + + +
                +
                + +{% endblock %} + +{% block foot %} + + + +{% endblock %} + diff --git a/examples-stimulus/src/pages/form.liquid b/examples-stimulus/src/pages/form.liquid new file mode 100644 index 0000000..61c4f65 --- /dev/null +++ b/examples-stimulus/src/pages/form.liquid @@ -0,0 +1,38 @@ +{% layout "templates/layout.liquid" %} +{% block %} + +
                +
                + +
                + +
                +
                +
                + +
                + +
                +
                +
                + +
                + +
                +
                +
                + +
                +
                + +{% endblock %} + +{% block foot %} + + +{% endblock %} + diff --git a/examples-stimulus/src/pages/index.liquid b/examples-stimulus/src/pages/index.liquid new file mode 100644 index 0000000..896f481 --- /dev/null +++ b/examples-stimulus/src/pages/index.liquid @@ -0,0 +1,77 @@ +{% layout "templates/layout.liquid" %} +{% block %} +
                +
                +

                Winduum Stimulus examples

                +

                Browse or filter the generated example pages.

                +
                +
                + +
                +

                0 examples

                +
                  + +
                + +
                +{% endblock %} + +{% block head %} + +{% endblock %} diff --git a/examples-stimulus/src/styles/main.css b/examples-stimulus/src/styles/main.css new file mode 100644 index 0000000..9976ecf --- /dev/null +++ b/examples-stimulus/src/styles/main.css @@ -0,0 +1,24 @@ +@import "tailwindcss/theme.css" layer(theme); +@import "winduum/tailwindcss/theme/config/index.css" layer(theme); +@import "winduum/tailwindcss/theme/default.css" layer(theme); +@import "winduum/src/theme/dark.css" layer(theme); +@import "winduum/src/base/reset.css" layer(base); +@import "winduum/src/base/defaults.css" layer(base); + +/* single imports for your components and utilities, or you can include them separately in your project (recommended) */ +@import "winduum/src/components/index.css" layer(utilities); +@import "winduum/src/components/drawer/nosnap.css" layer(utilities); +@import "winduum/src/utilities/container/props/default.css" layer(theme); +@import "winduum/src/utilities/ripple/keyframes/default.css"; +@import "winduum/src/utilities/skeleton/props/default.css" layer(theme); +@import "winduum/src/utilities/spinner/keyframes/ring.css"; + +@import "winduum/tailwindcss/utilities/index.css"; +@import "tailwindcss/utilities" layer(utilities); +@import "winduum/tailwindcss/variants/index.css"; +@import "winduum/src/base/breakpoints.css"; +@import "winduum/src/base/keyframes.css"; +@import "winduum/src/base/transitions.css"; + +@source "../../node_modules/winduum/src"; +@source "../../node_modules/winduum-stimulus"; \ No newline at end of file diff --git a/examples-stimulus/src/styles/style.css b/examples-stimulus/src/styles/style.css new file mode 100644 index 0000000..72c2434 --- /dev/null +++ b/examples-stimulus/src/styles/style.css @@ -0,0 +1,22 @@ +:root, :host { + height: 100%; + background-color: var(--color-body); + + &.dark { + --color-body: rgb(10, 10, 10); + } +} + +:where(body) { + display: flex; + gap: 0.5rem; + padding: 1rem; + justify-content: center; + align-items: center; + align-content: center; + flex-direction: row; + flex-wrap: wrap; + border-radius: var(--radius); + min-height: 100%; + background: transparent; +} diff --git a/examples-stimulus/src/templates/layout.liquid b/examples-stimulus/src/templates/layout.liquid new file mode 100644 index 0000000..0683060 --- /dev/null +++ b/examples-stimulus/src/templates/layout.liquid @@ -0,0 +1,23 @@ + + + + + + + + + + + + {% block head %}{% endblock %} + + +{% block %}{% endblock %} +{% block foot %}{% endblock %} + + + diff --git a/examples-stimulus/vite.config.js b/examples-stimulus/vite.config.js new file mode 100644 index 0000000..b79f304 --- /dev/null +++ b/examples-stimulus/vite.config.js @@ -0,0 +1,37 @@ +import { resolve, relative } from 'path' +import { defineConfig } from 'vite' +import vituum from 'vituum' +import liquid from '@vituum/vite-plugin-liquid' +import tailwindcss from '@tailwindcss/vite' +import { examplesIndex } from '../examples-index-plugin.js' + +const htmlPlugin = () => { + return { + name: 'html-transform', + transformIndexHtml: { + order: 'post', + async transform(html, { path }) { + return html.replaceAll( + '"/assets/', + `"${relative(path, '/src/pages/').slice(0, -2)}assets/` + ) + } + } + } +} + +export default defineConfig({ + plugins: [vituum(), tailwindcss(), liquid({ + root: './src' + }), examplesIndex({ + pagesDirectory: resolve(process.cwd(), 'src/pages'), + extension: '.liquid' + }), htmlPlugin()], + build: { + target: 'esnext', + manifest: false, + modulePreload: false, + emptyOutDir: true, + outDir: resolve(process.cwd(), '../docs/public/examples-stimulus') + } +}) diff --git a/examples-vue/package-lock.json b/examples-vue/package-lock.json new file mode 100644 index 0000000..c69a561 --- /dev/null +++ b/examples-vue/package-lock.json @@ -0,0 +1,3092 @@ +{ + "name": "examples-vue", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "@floating-ui/dom": "^1.7.6", + "interestfor": "^1.0.0", + "invokers-polyfill": "^1.0.3", + "vue": "^3.5.39", + "winduum": "^3.0.0-next.16", + "winduum-vue": "https://github.com/winduum/winduum-vue/archive/a254110372a1f97896aa4d251d8436fb5d2eb71e.tar.gz" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.3.2", + "@vitejs/plugin-vue": "^6.0.7", + "tailwindcss": "^4.3.2", + "typescript": "^5.9.3", + "vite": "^8.1.3", + "vituum": "^1.1.1", + "vue-tsc": "^3.3.6" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", + "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", + "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", + "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.8.0.tgz", + "integrity": "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.12" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.8.0.tgz", + "integrity": "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.8.0", + "@floating-ui/utils": "^0.2.12" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.12.tgz", + "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==", + "license": "MIT" + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", + "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.3" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.139.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.139.0.tgz", + "integrity": "sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.5.tgz", + "integrity": "sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.5.tgz", + "integrity": "sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.5.tgz", + "integrity": "sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.5.tgz", + "integrity": "sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.5.tgz", + "integrity": "sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.5.tgz", + "integrity": "sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.5.tgz", + "integrity": "sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.5.tgz", + "integrity": "sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.5.tgz", + "integrity": "sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.5.tgz", + "integrity": "sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.5.tgz", + "integrity": "sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.5.tgz", + "integrity": "sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.5.tgz", + "integrity": "sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.11.1", + "@emnapi/runtime": "1.11.1", + "@napi-rs/wasm-runtime": "^1.1.6" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.5.tgz", + "integrity": "sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.5.tgz", + "integrity": "sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.2.tgz", + "integrity": "sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.2.tgz", + "integrity": "sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.2.tgz", + "integrity": "sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.2.tgz", + "integrity": "sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.2.tgz", + "integrity": "sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.2.tgz", + "integrity": "sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.2.tgz", + "integrity": "sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.2.tgz", + "integrity": "sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.2.tgz", + "integrity": "sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.2.tgz", + "integrity": "sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.2.tgz", + "integrity": "sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.2.tgz", + "integrity": "sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.2.tgz", + "integrity": "sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.2.tgz", + "integrity": "sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.2.tgz", + "integrity": "sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.2.tgz", + "integrity": "sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.2.tgz", + "integrity": "sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.2.tgz", + "integrity": "sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.2.tgz", + "integrity": "sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.2.tgz", + "integrity": "sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.2.tgz", + "integrity": "sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.2.tgz", + "integrity": "sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.2.tgz", + "integrity": "sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.2.tgz", + "integrity": "sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.2.tgz", + "integrity": "sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@tailwindcss/node": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.2.tgz", + "integrity": "sha512-yWP/sqEcBLaD8JuA6zNwxoYKr75qxTioYwlRwekj5Jr/I5GXnoJfjetH/psLUIv74cYTH2lBUEzBkinthoYcBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "5.21.6", + "jiti": "^2.7.0", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.3.2" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.2.tgz", + "integrity": "sha512-z8ZgnzX8gdNoWLBLqBPoh/sjnxkwvf9ZuWjnO0l0yIzbLa5/9S+eC5QxGZKRobVHIC3/1BoMWjHblqWjcgFgag==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.3.2", + "@tailwindcss/oxide-darwin-arm64": "4.3.2", + "@tailwindcss/oxide-darwin-x64": "4.3.2", + "@tailwindcss/oxide-freebsd-x64": "4.3.2", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.2", + "@tailwindcss/oxide-linux-arm64-gnu": "4.3.2", + "@tailwindcss/oxide-linux-arm64-musl": "4.3.2", + "@tailwindcss/oxide-linux-x64-gnu": "4.3.2", + "@tailwindcss/oxide-linux-x64-musl": "4.3.2", + "@tailwindcss/oxide-wasm32-wasi": "4.3.2", + "@tailwindcss/oxide-win32-arm64-msvc": "4.3.2", + "@tailwindcss/oxide-win32-x64-msvc": "4.3.2" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.2.tgz", + "integrity": "sha512-WHxqIuHpvZ5VtdX6GTl1Ik/Vp2YuN42Et+0CdeaVd/frQ9jAvGmvR8vLT+jk3e8/Q3x8kECB9+R17pgpp2BulA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.2.tgz", + "integrity": "sha512-GZypeUY/IDJW3877KeM+O67vbXr3MBnbtEL4aYhNErv/JWZhye2vGSWWG9tB6iiqR2MqRNkY8IOUy4NdSZV26w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.2.tgz", + "integrity": "sha512-UIIzmefR6KO1sDU7MzRqAxC8iBpft/VhkGjTjnhoS6k7Z3rQ9wEgA1ODSiyH/tcSYssulNm4Ci3hOeK1jH7ccQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.2.tgz", + "integrity": "sha512-GN+uAmcI6DNspnCDwtOAZrTz6oukJnp337qZvxqCGLd3BHBzJpO0ZbTLRvJNdztOeAmTzewewGIMPb0tk2R4WA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.2.tgz", + "integrity": "sha512-4ABn7qSbdHRwTiDiuWNegCyb5+2FJ4vKIKc3DmKrvAFw7MU1Lm11dIkTPwUaFdTzc7IsOpDbqBrlh0x6y36U/w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.2.tgz", + "integrity": "sha512-wDgEIGwoM8w8pufh9LVt1PahDgNdKXrLC2qfAnV3vAmococ9RWbxeAw4pxPttd/TsJfwjyLf90Dg1y9y8I6Emw==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.2.tgz", + "integrity": "sha512-J5Nuk0uZQIiMTJj3LEx4sAA9tMFUoXQZFv1J6An+QGYe53HKRJuFDi0rpq/tuouCZeAbOBY3kQ6g8qeD4TUjtA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.2.tgz", + "integrity": "sha512-kqCZpSKOBEJO4mz7OqWoofBZeXTAwaVGPj0ErAj7CojmhKpWVWVOnrt9dE8odoIraZq4oj3ausM37kXi+Tow8w==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.2.tgz", + "integrity": "sha512-cixpqbh2toJDmkuCRI68nXA8ZxNmdK9Y+9v5h3MC3ZQKy/0BO8AWzlkWyRM7JAFSGBlfig4YVTPsK6MVgqz1uw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.2.tgz", + "integrity": "sha512-4ec2Z/LOmRsAgU23CS4xeJfcJlmRg94A/XrbGRCF1gyU/zdDfRLYDVsS+ynSZCmGNxQ1jQriQOKMQeQxBA3Isw==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.11.1", + "@emnapi/runtime": "^1.11.1", + "@emnapi/wasi-threads": "^1.2.2", + "@napi-rs/wasm-runtime": "^1.1.4", + "@tybys/wasm-util": "^0.10.2", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.2.tgz", + "integrity": "sha512-Zyr/M0+XcYZu3bZrUytc7TXvrk0ftWfl8gN2MwekNDzhqhKRUucMPSeOzM0o0wH5AWOU49BsKRrfKxI2atCPMQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.2.tgz", + "integrity": "sha512-QI9BO7KlNZsp2GuO0jwAAj5jCDABOKXRkCk2XuKTSaNEFSdfzqswYVTtCHBNKHLsqyjFyFkqlDiwkNbTYSssMQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.2.tgz", + "integrity": "sha512-eHpMeX4JXfVNJDEcsouTeCBubJBTcTLigeaw/NTUW6PB5ATKKXdyonnXgTBX2VuRbjz1hjfz6C5XAhr52ImQXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.3.2", + "@tailwindcss/oxide": "4.3.2", + "tailwindcss": "4.3.2" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7 || ^8" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", + "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "6.0.8", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.8.tgz", + "integrity": "sha512-0ZjgOg7oO6farnNGup7yvoM/YXZV84OZxHAwtflItNa/6zzQyVb5LNxyea3FEKEX2XlagIKzrlH7wwxkKgtiew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.1" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.28.tgz", + "integrity": "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.28" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.28.tgz", + "integrity": "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@volar/typescript": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.28.tgz", + "integrity": "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.28", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.39", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.39.tgz", + "integrity": "sha512-16KBTEXAJCpDr0mwlw+AZyhu8iyC7R3S2vBwsI7QnWJU6X3WKc9VKeNEZpiMdZ569qWhz9574L3vV55qRL0Vtw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@vue/shared": "3.5.39", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.39", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.39.tgz", + "integrity": "sha512-oQPigALqYbNxTNPvNgSOe+czwVExfbVF02lz8jP0S3AXJiu3jxYDygNUiqSep4ezzW8XgnubqH63My2A7JR/vg==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.39", + "@vue/shared": "3.5.39" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.39", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.39.tgz", + "integrity": "sha512-d0ki86iOyN8LoZPBmk5SJWNwHP19CnDDCfuo//+2WJa2g5Ke0Jay983PIBIcSSzldC68I8DrD5GrHV3OSDfodg==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@vue/compiler-core": "3.5.39", + "@vue/compiler-dom": "3.5.39", + "@vue/compiler-ssr": "3.5.39", + "@vue/shared": "3.5.39", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.15", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.39", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.39.tgz", + "integrity": "sha512-Ce7/wvwMHai74bdszfXExdazFigYnlF9zgCmEQUcM1j0fOymlouZ7XilTYNo8oUjhlnjYOZbGrcYKuqjz89Ucw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.39", + "@vue/shared": "3.5.39" + } + }, + "node_modules/@vue/language-core": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-3.3.7.tgz", + "integrity": "sha512-LzmkKinXAMMoh8Jfi/jMUSDUjuPdv8mynH5WJGKfXyZtDw3hQ6GBaoI6Bcnl/Xqlu32q/0Z6i/trp4VXykzyLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.28", + "@vue/compiler-dom": "^3.5.0", + "@vue/shared": "^3.5.0", + "alien-signals": "^3.2.1", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1", + "picomatch": "^4.0.4" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.39", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.39.tgz", + "integrity": "sha512-TpsuBJ9gGlZa5d23XcM2y8EXanz9dZeVDQBXRwzy46ItgvM+rWpzs+UVM0wcRLxGvcav0HE5jz2gNL53xlRAog==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.39" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.39", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.39.tgz", + "integrity": "sha512-9GLtNyRvPAUMbX+7ono0RC2j0guo2LXVi8LvcmAooImACUKm0oFf0jjwbX8/H0AE/t1nxhAkn8RSl9PMCzzxZw==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.39", + "@vue/shared": "3.5.39" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.39", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.39.tgz", + "integrity": "sha512-7Y6aAGboKcXAZ3ECuUy7RrS5yy2r47dhTp2SKaJmYxjopImaVFaNa5Ne66NwGovsrxVAl5S5rwc7m22UG7Lmww==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.39", + "@vue/runtime-core": "3.5.39", + "@vue/shared": "3.5.39", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.39", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.39.tgz", + "integrity": "sha512-yZSakiAGw85rZfG7UM8akMnIF+FmeiNk47uvHf2nVBBSe+dIKUhZuZq9+XgJhbV3nS5Z4ALH23/MpXofW+mbcw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.39", + "@vue/shared": "3.5.39" + }, + "peerDependencies": { + "vue": "3.5.39" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.39", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.39.tgz", + "integrity": "sha512-l1rrBtBfTnmxvtsvdQDXltUUy8S1Y+ZaqdfUzmAnJkTd8Z8rv5v/ytW+TKiqEOWyHPoqtPlNFSs0lhRmYVSHVA==", + "license": "MIT" + }, + "node_modules/alien-signals": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-3.2.1.tgz", + "integrity": "sha512-I8FjmltrfnDFoZedi5CG8DghVYNhzb/Ijluz7tCSJH0xpd0484Kowhbb1XDYOxfJpU1p5wnM2X54dA+IfGyD1g==", + "dev": true, + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz", + "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "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" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.21.6", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.6.tgz", + "integrity": "sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "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.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "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, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/interestfor": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/interestfor/-/interestfor-1.0.8.tgz", + "integrity": "sha512-qYwTmxzDnrosGZX/1lDEOsAv73aYiFKLniN20SS78588WhRMHj8z7u2uFe9QZPIVmkCyIbJwiMQ/85Up7hrseQ==", + "license": "BSD-3-Clause" + }, + "node_modules/invokers-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/invokers-polyfill/-/invokers-polyfill-1.0.3.tgz", + "integrity": "sha512-T8zVavFQu5GlWlpkjghmaCaTx6Wk+9tWwJ2BC4oNsNAnar6AIrvSJQFZUcYDfrxzK9thBIyZvAkeLfdN9hTzGA==", + "license": "MIT" + }, + "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, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.16", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", + "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.19", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.19.tgz", + "integrity": "sha512-Mz8SaolMd8nB+G13WkORcxQKHZ/NE4xXevtkJHVuG+guo9/wYKlIMTKAqGdEmYOXR2ijPjTYNHssizdaVSUNdQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "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" + } + ], + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/readdirp/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rolldown": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.5.tgz", + "integrity": "sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.139.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.1.5", + "@rolldown/binding-darwin-arm64": "1.1.5", + "@rolldown/binding-darwin-x64": "1.1.5", + "@rolldown/binding-freebsd-x64": "1.1.5", + "@rolldown/binding-linux-arm-gnueabihf": "1.1.5", + "@rolldown/binding-linux-arm64-gnu": "1.1.5", + "@rolldown/binding-linux-arm64-musl": "1.1.5", + "@rolldown/binding-linux-ppc64-gnu": "1.1.5", + "@rolldown/binding-linux-s390x-gnu": "1.1.5", + "@rolldown/binding-linux-x64-gnu": "1.1.5", + "@rolldown/binding-linux-x64-musl": "1.1.5", + "@rolldown/binding-openharmony-arm64": "1.1.5", + "@rolldown/binding-wasm32-wasi": "1.1.5", + "@rolldown/binding-win32-arm64-msvc": "1.1.5", + "@rolldown/binding-win32-x64-msvc": "1.1.5" + } + }, + "node_modules/rollup": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.2.tgz", + "integrity": "sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.62.2", + "@rollup/rollup-android-arm64": "4.62.2", + "@rollup/rollup-darwin-arm64": "4.62.2", + "@rollup/rollup-darwin-x64": "4.62.2", + "@rollup/rollup-freebsd-arm64": "4.62.2", + "@rollup/rollup-freebsd-x64": "4.62.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.62.2", + "@rollup/rollup-linux-arm-musleabihf": "4.62.2", + "@rollup/rollup-linux-arm64-gnu": "4.62.2", + "@rollup/rollup-linux-arm64-musl": "4.62.2", + "@rollup/rollup-linux-loong64-gnu": "4.62.2", + "@rollup/rollup-linux-loong64-musl": "4.62.2", + "@rollup/rollup-linux-ppc64-gnu": "4.62.2", + "@rollup/rollup-linux-ppc64-musl": "4.62.2", + "@rollup/rollup-linux-riscv64-gnu": "4.62.2", + "@rollup/rollup-linux-riscv64-musl": "4.62.2", + "@rollup/rollup-linux-s390x-gnu": "4.62.2", + "@rollup/rollup-linux-x64-gnu": "4.62.2", + "@rollup/rollup-linux-x64-musl": "4.62.2", + "@rollup/rollup-openbsd-x64": "4.62.2", + "@rollup/rollup-openharmony-arm64": "4.62.2", + "@rollup/rollup-win32-arm64-msvc": "4.62.2", + "@rollup/rollup-win32-ia32-msvc": "4.62.2", + "@rollup/rollup-win32-x64-gnu": "4.62.2", + "@rollup/rollup-win32-x64-msvc": "4.62.2", + "fsevents": "~2.3.2" + } + }, + "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" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tailwindcss": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.2.tgz", + "integrity": "sha512-WtctNNSH8A9jlMIqxzuYumOHU5uGZyRv0Q5svQl+oEPy5w84YpBxdb7MdqyiSPQge5jTJ6zFQLq0PFygdccSBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "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, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "optional": true + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/vite": { + "version": "8.1.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.4.tgz", + "integrity": "sha512-bTT9PsdWO+MQMNG9ZXIP/qM9wGh37DFxTV/sPq9cFpHr3w4jkgef032PkAL9jAqhk3Nz8NQw3O8n6/xFkqO4QQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.5", + "postcss": "^8.5.16", + "rolldown": "~1.1.4", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.3.0", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.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 + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vituum": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vituum/-/vituum-1.2.0.tgz", + "integrity": "sha512-1YYOrzrIMSeWj6zAib5VTsNo1oDcqSg45jCFjxzU70vMPBONoXXhTAMcX0p21Bj7NkzceBFgdmEtnAze258lqw==", + "dev": true, + "dependencies": { + "chokidar": "^3.5", + "fast-glob": "^3.3", + "lodash": "^4.17", + "minimatch": "^10.0", + "vite": "^6.2" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/vituum/node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vituum/node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vituum/node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vituum/node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vituum/node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vituum/node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vituum/node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vituum/node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vituum/node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vituum/node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vituum/node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vituum/node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vituum/node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vituum/node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vituum/node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vituum/node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vituum/node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vituum/node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vituum/node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vituum/node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vituum/node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vituum/node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vituum/node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vituum/node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vituum/node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vituum/node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vituum/node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/vituum/node_modules/vite": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.3.tgz", + "integrity": "sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "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 + } + } + }, + "node_modules/vscode-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue": { + "version": "3.5.39", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.39.tgz", + "integrity": "sha512-xmZCYabFGcirU8r0fTuvl/LICc1OU620rnqepaJDL/a141ZigkG7AyaxQLdqJ02ZRYzWe6YPaDHeQx7MfknQfA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.39", + "@vue/compiler-sfc": "3.5.39", + "@vue/runtime-dom": "3.5.39", + "@vue/server-renderer": "3.5.39", + "@vue/shared": "3.5.39" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-tsc": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-3.3.7.tgz", + "integrity": "sha512-+C+rgD49wAQ5bUTl2sp5a8Bzg4YoldMNXM+g7CFe604MYcQ8PrZPMQhIjJSzKXtPBCa+C5ayMipqjbA7splekQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/typescript": "2.4.28", + "@vue/language-core": "3.3.7" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": ">=5.0.0" + } + }, + "node_modules/winduum": { + "version": "3.0.0-next.16", + "resolved": "https://registry.npmjs.org/winduum/-/winduum-3.0.0-next.16.tgz", + "integrity": "sha512-Nk6GbAATr++Z1gGR46htvbzEaDxikgmmMVXz1DRb6hRJgL3UxqCIlXtKW3zs8yWJ5msvFxWdz1DoR8a/vd8dBg==", + "engines": { + "node": ">=20.0.0", + "npm": ">=9.0.0" + } + }, + "node_modules/winduum-vue": { + "version": "0.0.1", + "resolved": "https://github.com/winduum/winduum-vue/archive/a254110372a1f97896aa4d251d8436fb5d2eb71e.tar.gz", + "integrity": "sha512-tJOHL56Be+nHkbJrbXupCcJXaUmDJ/kARu5cGh+QuviQ3BywLG1BKN7AXZ3OSsL5xqd47CMbryE9ZFa11pMHKg==", + "dependencies": { + "@floating-ui/dom": "^1.7.6" + }, + "engines": { + "node": ">=20.19.0", + "npm": ">=9.0.0" + } + } + } +} diff --git a/examples-vue/package.json b/examples-vue/package.json new file mode 100644 index 0000000..0567500 --- /dev/null +++ b/examples-vue/package.json @@ -0,0 +1,25 @@ +{ + "type": "module", + "scripts": { + "build": "vue-tsc --noEmit && vite build", + "dev": "vite", + "preview": "vite preview" + }, + "dependencies": { + "@floating-ui/dom": "^1.7.6", + "interestfor": "^1.0.0", + "invokers-polyfill": "^1.0.3", + "vue": "^3.5.39", + "winduum": "^3.0.0-next.16", + "winduum-vue": "https://github.com/winduum/winduum-vue/archive/a254110372a1f97896aa4d251d8436fb5d2eb71e.tar.gz" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.3.2", + "@vitejs/plugin-vue": "^6.0.7", + "tailwindcss": "^4.3.2", + "typescript": "^5.9.3", + "vite": "^8.1.3", + "vituum": "^1.1.1", + "vue-tsc": "^3.3.6" + } +} diff --git a/examples-vue/src/adapters/field/Field.vue b/examples-vue/src/adapters/field/Field.vue new file mode 100644 index 0000000..f773d51 --- /dev/null +++ b/examples-vue/src/adapters/field/Field.vue @@ -0,0 +1,19 @@ + + + diff --git a/examples-vue/src/adapters/field/index.ts b/examples-vue/src/adapters/field/index.ts new file mode 100644 index 0000000..01da3ec --- /dev/null +++ b/examples-vue/src/adapters/field/index.ts @@ -0,0 +1 @@ +export { default as Field } from './Field.vue' diff --git a/examples-vue/src/main.ts b/examples-vue/src/main.ts new file mode 100644 index 0000000..240a915 --- /dev/null +++ b/examples-vue/src/main.ts @@ -0,0 +1,23 @@ +import type { Component } from 'vue' +import { createApp } from 'vue' + +if (!('command' in HTMLButtonElement.prototype)) { + const { apply } = await import('invokers-polyfill/fn') + apply() +} + +if (!Object.prototype.hasOwnProperty.call(HTMLButtonElement.prototype, 'interestForElement')) { + await import('interestfor') +} + +const examples = import.meta.glob<{ default: Component }>('./pages/**/*.vue') +const pathname = window.location.pathname + .replace(/^\/examples-vue/, '') + .replace(/\.html$/, '.vue') +const loadExample = examples[`./pages${pathname}`] + +if (!loadExample) throw new Error(`Vue example not found: ${pathname}`) + +const { default: Example } = await loadExample() + +createApp(Example).mount('#app') diff --git a/examples-vue/src/pages/components/button/basic.html b/examples-vue/src/pages/components/button/basic.html new file mode 100644 index 0000000..7c7480b --- /dev/null +++ b/examples-vue/src/pages/components/button/basic.html @@ -0,0 +1,19 @@ + + + + + + + + + + + +
                + + + diff --git a/examples-vue/src/pages/components/button/basic.vue b/examples-vue/src/pages/components/button/basic.vue new file mode 100644 index 0000000..2544000 --- /dev/null +++ b/examples-vue/src/pages/components/button/basic.vue @@ -0,0 +1,8 @@ + + + diff --git a/examples-vue/src/pages/components/carousel-experimental/basic.html b/examples-vue/src/pages/components/carousel-experimental/basic.html new file mode 100644 index 0000000..aa13125 --- /dev/null +++ b/examples-vue/src/pages/components/carousel-experimental/basic.html @@ -0,0 +1,24 @@ + + + + + + + + + + + + +
                + + + diff --git a/examples-vue/src/pages/components/carousel-experimental/basic.vue b/examples-vue/src/pages/components/carousel-experimental/basic.vue new file mode 100644 index 0000000..2a8eb57 --- /dev/null +++ b/examples-vue/src/pages/components/carousel-experimental/basic.vue @@ -0,0 +1,35 @@ + + + diff --git a/examples-vue/src/pages/components/carousel-experimental/full.html b/examples-vue/src/pages/components/carousel-experimental/full.html new file mode 100644 index 0000000..829b4fa --- /dev/null +++ b/examples-vue/src/pages/components/carousel-experimental/full.html @@ -0,0 +1,37 @@ + + + + + + + + + + + + +
                + + + diff --git a/examples-vue/src/pages/components/carousel-experimental/full.vue b/examples-vue/src/pages/components/carousel-experimental/full.vue new file mode 100644 index 0000000..afbbb59 --- /dev/null +++ b/examples-vue/src/pages/components/carousel-experimental/full.vue @@ -0,0 +1,57 @@ + + + diff --git a/examples-vue/src/pages/components/carousel/basic.html b/examples-vue/src/pages/components/carousel/basic.html new file mode 100644 index 0000000..47c0683 --- /dev/null +++ b/examples-vue/src/pages/components/carousel/basic.html @@ -0,0 +1,24 @@ + + + + + + + + + + + + +
                + + + diff --git a/examples-vue/src/pages/components/carousel/basic.vue b/examples-vue/src/pages/components/carousel/basic.vue new file mode 100644 index 0000000..3e7ce40 --- /dev/null +++ b/examples-vue/src/pages/components/carousel/basic.vue @@ -0,0 +1,35 @@ + + + diff --git a/examples-vue/src/pages/components/carousel/full.html b/examples-vue/src/pages/components/carousel/full.html new file mode 100644 index 0000000..0508972 --- /dev/null +++ b/examples-vue/src/pages/components/carousel/full.html @@ -0,0 +1,24 @@ + + + + + + + + + + + + +
                + + + diff --git a/examples-vue/src/pages/components/carousel/full.vue b/examples-vue/src/pages/components/carousel/full.vue new file mode 100644 index 0000000..26f02d1 --- /dev/null +++ b/examples-vue/src/pages/components/carousel/full.vue @@ -0,0 +1,53 @@ + + + diff --git a/examples-vue/src/pages/components/compare/default.html b/examples-vue/src/pages/components/compare/default.html new file mode 100644 index 0000000..1d59a14 --- /dev/null +++ b/examples-vue/src/pages/components/compare/default.html @@ -0,0 +1,20 @@ + + + + + + + + + + + +
                + + + + diff --git a/examples-vue/src/pages/components/compare/default.vue b/examples-vue/src/pages/components/compare/default.vue new file mode 100644 index 0000000..14167fc --- /dev/null +++ b/examples-vue/src/pages/components/compare/default.vue @@ -0,0 +1,20 @@ + + + + diff --git a/examples-vue/src/pages/components/compare/text.html b/examples-vue/src/pages/components/compare/text.html new file mode 100644 index 0000000..1d59a14 --- /dev/null +++ b/examples-vue/src/pages/components/compare/text.html @@ -0,0 +1,20 @@ + + + + + + + + + + + +
                + + + + diff --git a/examples-vue/src/pages/components/compare/text.vue b/examples-vue/src/pages/components/compare/text.vue new file mode 100644 index 0000000..7715b89 --- /dev/null +++ b/examples-vue/src/pages/components/compare/text.vue @@ -0,0 +1,20 @@ + + + + diff --git a/examples-vue/src/pages/components/control/basic.html b/examples-vue/src/pages/components/control/basic.html new file mode 100644 index 0000000..7c7480b --- /dev/null +++ b/examples-vue/src/pages/components/control/basic.html @@ -0,0 +1,19 @@ + + + + + + + + + + + +
                + + + diff --git a/examples-vue/src/pages/components/control/basic.vue b/examples-vue/src/pages/components/control/basic.vue new file mode 100644 index 0000000..fa23fb2 --- /dev/null +++ b/examples-vue/src/pages/components/control/basic.vue @@ -0,0 +1,9 @@ + + + diff --git a/examples-vue/src/pages/components/details/checkbox.html b/examples-vue/src/pages/components/details/checkbox.html new file mode 100644 index 0000000..1d59a14 --- /dev/null +++ b/examples-vue/src/pages/components/details/checkbox.html @@ -0,0 +1,20 @@ + + + + + + + + + + + +
                + + + + diff --git a/examples-vue/src/pages/components/details/checkbox.vue b/examples-vue/src/pages/components/details/checkbox.vue new file mode 100644 index 0000000..2f168d3 --- /dev/null +++ b/examples-vue/src/pages/components/details/checkbox.vue @@ -0,0 +1,18 @@ + + + + diff --git a/examples-vue/src/pages/components/dialog/basic.html b/examples-vue/src/pages/components/dialog/basic.html new file mode 100644 index 0000000..7c7480b --- /dev/null +++ b/examples-vue/src/pages/components/dialog/basic.html @@ -0,0 +1,19 @@ + + + + + + + + + + + +
                + + + diff --git a/examples-vue/src/pages/components/dialog/basic.vue b/examples-vue/src/pages/components/dialog/basic.vue new file mode 100644 index 0000000..8fd190d --- /dev/null +++ b/examples-vue/src/pages/components/dialog/basic.vue @@ -0,0 +1,22 @@ + + + diff --git a/examples-vue/src/pages/components/drawer/bottom.html b/examples-vue/src/pages/components/drawer/bottom.html new file mode 100644 index 0000000..1d59a14 --- /dev/null +++ b/examples-vue/src/pages/components/drawer/bottom.html @@ -0,0 +1,20 @@ + + + + + + + + + + + +
                + + + + diff --git a/examples-vue/src/pages/components/drawer/bottom.vue b/examples-vue/src/pages/components/drawer/bottom.vue new file mode 100644 index 0000000..9f31188 --- /dev/null +++ b/examples-vue/src/pages/components/drawer/bottom.vue @@ -0,0 +1,23 @@ + + + + diff --git a/examples-vue/src/pages/components/drawer/dialog.html b/examples-vue/src/pages/components/drawer/dialog.html new file mode 100644 index 0000000..1d59a14 --- /dev/null +++ b/examples-vue/src/pages/components/drawer/dialog.html @@ -0,0 +1,20 @@ + + + + + + + + + + + +
                + + + + diff --git a/examples-vue/src/pages/components/drawer/dialog.vue b/examples-vue/src/pages/components/drawer/dialog.vue new file mode 100644 index 0000000..b7d9025 --- /dev/null +++ b/examples-vue/src/pages/components/drawer/dialog.vue @@ -0,0 +1,34 @@ + + + + diff --git a/examples-vue/src/pages/components/drawer/left.html b/examples-vue/src/pages/components/drawer/left.html new file mode 100644 index 0000000..1d59a14 --- /dev/null +++ b/examples-vue/src/pages/components/drawer/left.html @@ -0,0 +1,20 @@ + + + + + + + + + + + +
                + + + + diff --git a/examples-vue/src/pages/components/drawer/left.vue b/examples-vue/src/pages/components/drawer/left.vue new file mode 100644 index 0000000..1bac614 --- /dev/null +++ b/examples-vue/src/pages/components/drawer/left.vue @@ -0,0 +1,23 @@ + + + + diff --git a/examples-vue/src/pages/components/drawer/noscript.html b/examples-vue/src/pages/components/drawer/noscript.html new file mode 100644 index 0000000..1d59a14 --- /dev/null +++ b/examples-vue/src/pages/components/drawer/noscript.html @@ -0,0 +1,20 @@ + + + + + + + + + + + +
                + + + + diff --git a/examples-vue/src/pages/components/drawer/noscript.vue b/examples-vue/src/pages/components/drawer/noscript.vue new file mode 100644 index 0000000..819065f --- /dev/null +++ b/examples-vue/src/pages/components/drawer/noscript.vue @@ -0,0 +1,23 @@ + + + + diff --git a/examples-vue/src/pages/components/drawer/right.html b/examples-vue/src/pages/components/drawer/right.html new file mode 100644 index 0000000..1d59a14 --- /dev/null +++ b/examples-vue/src/pages/components/drawer/right.html @@ -0,0 +1,20 @@ + + + + + + + + + + + +
                + + + + diff --git a/examples-vue/src/pages/components/drawer/right.vue b/examples-vue/src/pages/components/drawer/right.vue new file mode 100644 index 0000000..34a3728 --- /dev/null +++ b/examples-vue/src/pages/components/drawer/right.vue @@ -0,0 +1,23 @@ + + + + diff --git a/examples-vue/src/pages/components/drawer/top.html b/examples-vue/src/pages/components/drawer/top.html new file mode 100644 index 0000000..1d59a14 --- /dev/null +++ b/examples-vue/src/pages/components/drawer/top.html @@ -0,0 +1,20 @@ + + + + + + + + + + + +
                + + + + diff --git a/examples-vue/src/pages/components/drawer/top.vue b/examples-vue/src/pages/components/drawer/top.vue new file mode 100644 index 0000000..43fd338 --- /dev/null +++ b/examples-vue/src/pages/components/drawer/top.vue @@ -0,0 +1,23 @@ + + + + diff --git a/examples-vue/src/pages/components/field/basic.html b/examples-vue/src/pages/components/field/basic.html new file mode 100644 index 0000000..1d59a14 --- /dev/null +++ b/examples-vue/src/pages/components/field/basic.html @@ -0,0 +1,20 @@ + + + + + + + + + + + +
                + + + + diff --git a/examples-vue/src/pages/components/field/basic.vue b/examples-vue/src/pages/components/field/basic.vue new file mode 100644 index 0000000..c357378 --- /dev/null +++ b/examples-vue/src/pages/components/field/basic.vue @@ -0,0 +1,17 @@ + + + + diff --git a/examples-vue/src/pages/components/image/picture.html b/examples-vue/src/pages/components/image/picture.html new file mode 100644 index 0000000..1d59a14 --- /dev/null +++ b/examples-vue/src/pages/components/image/picture.html @@ -0,0 +1,20 @@ + + + + + + + + + + + +
                + + + + diff --git a/examples-vue/src/pages/components/image/picture.vue b/examples-vue/src/pages/components/image/picture.vue new file mode 100644 index 0000000..6ca4a9a --- /dev/null +++ b/examples-vue/src/pages/components/image/picture.vue @@ -0,0 +1,11 @@ + + + + diff --git a/examples-vue/src/pages/components/image/ratio.html b/examples-vue/src/pages/components/image/ratio.html new file mode 100644 index 0000000..1d59a14 --- /dev/null +++ b/examples-vue/src/pages/components/image/ratio.html @@ -0,0 +1,20 @@ + + + + + + + + + + + +
                + + + + diff --git a/examples-vue/src/pages/components/image/ratio.vue b/examples-vue/src/pages/components/image/ratio.vue new file mode 100644 index 0000000..a88ba3f --- /dev/null +++ b/examples-vue/src/pages/components/image/ratio.vue @@ -0,0 +1,10 @@ + + + + diff --git a/examples-vue/src/pages/components/image/skeleton.html b/examples-vue/src/pages/components/image/skeleton.html new file mode 100644 index 0000000..7c7480b --- /dev/null +++ b/examples-vue/src/pages/components/image/skeleton.html @@ -0,0 +1,19 @@ + + + + + + + + + + + +
                + + + diff --git a/examples-vue/src/pages/components/image/skeleton.vue b/examples-vue/src/pages/components/image/skeleton.vue new file mode 100644 index 0000000..ac5663c --- /dev/null +++ b/examples-vue/src/pages/components/image/skeleton.vue @@ -0,0 +1,9 @@ + + + diff --git a/examples-vue/src/pages/components/popover/api.html b/examples-vue/src/pages/components/popover/api.html new file mode 100644 index 0000000..1d59a14 --- /dev/null +++ b/examples-vue/src/pages/components/popover/api.html @@ -0,0 +1,20 @@ + + + + + + + + + + + +
                + + + + diff --git a/examples-vue/src/pages/components/popover/api.vue b/examples-vue/src/pages/components/popover/api.vue new file mode 100644 index 0000000..d92f1ef --- /dev/null +++ b/examples-vue/src/pages/components/popover/api.vue @@ -0,0 +1,21 @@ + + + diff --git a/examples-vue/src/pages/components/popover/basic.html b/examples-vue/src/pages/components/popover/basic.html new file mode 100644 index 0000000..7c7480b --- /dev/null +++ b/examples-vue/src/pages/components/popover/basic.html @@ -0,0 +1,19 @@ + + + + + + + + + + + +
                + + + diff --git a/examples-vue/src/pages/components/popover/basic.vue b/examples-vue/src/pages/components/popover/basic.vue new file mode 100644 index 0000000..dd2d9d3 --- /dev/null +++ b/examples-vue/src/pages/components/popover/basic.vue @@ -0,0 +1,19 @@ + + + diff --git a/examples-vue/src/pages/components/popover/interest.html b/examples-vue/src/pages/components/popover/interest.html new file mode 100644 index 0000000..7c7480b --- /dev/null +++ b/examples-vue/src/pages/components/popover/interest.html @@ -0,0 +1,19 @@ + + + + + + + + + + + +
                + + + diff --git a/examples-vue/src/pages/components/popover/interest.vue b/examples-vue/src/pages/components/popover/interest.vue new file mode 100644 index 0000000..cc7c276 --- /dev/null +++ b/examples-vue/src/pages/components/popover/interest.vue @@ -0,0 +1,17 @@ + + + diff --git a/examples-vue/src/pages/components/popover/tooltip.html b/examples-vue/src/pages/components/popover/tooltip.html new file mode 100644 index 0000000..7c7480b --- /dev/null +++ b/examples-vue/src/pages/components/popover/tooltip.html @@ -0,0 +1,19 @@ + + + + + + + + + + + +
                + + + diff --git a/examples-vue/src/pages/components/popover/tooltip.vue b/examples-vue/src/pages/components/popover/tooltip.vue new file mode 100644 index 0000000..e19c0d2 --- /dev/null +++ b/examples-vue/src/pages/components/popover/tooltip.vue @@ -0,0 +1,18 @@ + + + diff --git a/examples-vue/src/pages/components/range/default.html b/examples-vue/src/pages/components/range/default.html new file mode 100644 index 0000000..1d59a14 --- /dev/null +++ b/examples-vue/src/pages/components/range/default.html @@ -0,0 +1,20 @@ + + + + + + + + + + + +
                + + + + diff --git a/examples-vue/src/pages/components/range/default.vue b/examples-vue/src/pages/components/range/default.vue new file mode 100644 index 0000000..555c370 --- /dev/null +++ b/examples-vue/src/pages/components/range/default.vue @@ -0,0 +1,15 @@ + + + + diff --git a/examples-vue/src/pages/components/range/multi.html b/examples-vue/src/pages/components/range/multi.html new file mode 100644 index 0000000..1d59a14 --- /dev/null +++ b/examples-vue/src/pages/components/range/multi.html @@ -0,0 +1,20 @@ + + + + + + + + + + + +
                + + + + diff --git a/examples-vue/src/pages/components/range/multi.vue b/examples-vue/src/pages/components/range/multi.vue new file mode 100644 index 0000000..0b7767a --- /dev/null +++ b/examples-vue/src/pages/components/range/multi.vue @@ -0,0 +1,20 @@ + + + + diff --git a/examples-vue/src/pages/components/range/vertical.html b/examples-vue/src/pages/components/range/vertical.html new file mode 100644 index 0000000..1d59a14 --- /dev/null +++ b/examples-vue/src/pages/components/range/vertical.html @@ -0,0 +1,20 @@ + + + + + + + + + + + +
                + + + + diff --git a/examples-vue/src/pages/components/range/vertical.vue b/examples-vue/src/pages/components/range/vertical.vue new file mode 100644 index 0000000..6d29f74 --- /dev/null +++ b/examples-vue/src/pages/components/range/vertical.vue @@ -0,0 +1,15 @@ + + + + diff --git a/examples-vue/src/pages/components/tabs/custom.html b/examples-vue/src/pages/components/tabs/custom.html new file mode 100644 index 0000000..1d59a14 --- /dev/null +++ b/examples-vue/src/pages/components/tabs/custom.html @@ -0,0 +1,20 @@ + + + + + + + + + + + +
                + + + + diff --git a/examples-vue/src/pages/components/tabs/custom.vue b/examples-vue/src/pages/components/tabs/custom.vue new file mode 100644 index 0000000..c6d53a5 --- /dev/null +++ b/examples-vue/src/pages/components/tabs/custom.vue @@ -0,0 +1,41 @@ + + + + diff --git a/examples-vue/src/pages/components/tabs/default.html b/examples-vue/src/pages/components/tabs/default.html new file mode 100644 index 0000000..1d59a14 --- /dev/null +++ b/examples-vue/src/pages/components/tabs/default.html @@ -0,0 +1,20 @@ + + + + + + + + + + + +
                + + + + diff --git a/examples-vue/src/pages/components/tabs/default.vue b/examples-vue/src/pages/components/tabs/default.vue new file mode 100644 index 0000000..bed27ba --- /dev/null +++ b/examples-vue/src/pages/components/tabs/default.vue @@ -0,0 +1,41 @@ + + + + diff --git a/examples-vue/src/pages/components/toast/default.html b/examples-vue/src/pages/components/toast/default.html new file mode 100644 index 0000000..1d59a14 --- /dev/null +++ b/examples-vue/src/pages/components/toast/default.html @@ -0,0 +1,20 @@ + + + + + + + + + + + +
                + + + + diff --git a/examples-vue/src/pages/components/toast/default.vue b/examples-vue/src/pages/components/toast/default.vue new file mode 100644 index 0000000..6d6cb31 --- /dev/null +++ b/examples-vue/src/pages/components/toast/default.vue @@ -0,0 +1,35 @@ + + + + diff --git a/examples-vue/src/pages/components/toaster/default.html b/examples-vue/src/pages/components/toaster/default.html new file mode 100644 index 0000000..1d59a14 --- /dev/null +++ b/examples-vue/src/pages/components/toaster/default.html @@ -0,0 +1,20 @@ + + + + + + + + + + + +
                + + + + diff --git a/examples-vue/src/pages/components/toaster/default.vue b/examples-vue/src/pages/components/toaster/default.vue new file mode 100644 index 0000000..02ec46d --- /dev/null +++ b/examples-vue/src/pages/components/toaster/default.vue @@ -0,0 +1,35 @@ + + + + diff --git a/examples-vue/src/pages/form.html b/examples-vue/src/pages/form.html new file mode 100644 index 0000000..1d59a14 --- /dev/null +++ b/examples-vue/src/pages/form.html @@ -0,0 +1,20 @@ + + + + + + + + + + + +
                + + + + diff --git a/examples-vue/src/pages/form.vue b/examples-vue/src/pages/form.vue new file mode 100644 index 0000000..6e85681 --- /dev/null +++ b/examples-vue/src/pages/form.vue @@ -0,0 +1,34 @@ + + + + diff --git a/examples-vue/src/pages/index.html b/examples-vue/src/pages/index.html new file mode 100644 index 0000000..961eafc --- /dev/null +++ b/examples-vue/src/pages/index.html @@ -0,0 +1,88 @@ + + + + + + + + + + + + +
                +
                +

                Winduum Vue examples

                +

                Browse or filter the generated example pages.

                +
                +
                + +
                +

                0 examples

                +
                  + +
                + +
                + + diff --git a/examples-vue/src/styles/main.css b/examples-vue/src/styles/main.css new file mode 100644 index 0000000..8672a15 --- /dev/null +++ b/examples-vue/src/styles/main.css @@ -0,0 +1,23 @@ +@import "tailwindcss/theme.css" layer(theme); +@import "winduum/tailwindcss/theme/config/index.css" layer(theme); +@import "winduum/tailwindcss/theme/default.css" layer(theme); +@import "winduum/src/theme/dark.css" layer(theme); +@import "winduum/src/base/reset.css" layer(base); +@import "winduum/src/base/defaults.css" layer(base); + +@import "winduum/src/components/index.css" layer(utilities); +@import "winduum/src/components/drawer/nosnap.css" layer(utilities); +@import "winduum/src/utilities/container/props/default.css" layer(theme); +@import "winduum/src/utilities/ripple/keyframes/default.css"; +@import "winduum/src/utilities/skeleton/props/default.css" layer(theme); +@import "winduum/src/utilities/spinner/keyframes/ring.css"; + +@import "winduum/tailwindcss/utilities/index.css"; +@import "tailwindcss/utilities" layer(utilities); +@import "winduum/tailwindcss/variants/index.css"; +@import "winduum/src/base/breakpoints.css"; +@import "winduum/src/base/keyframes.css"; +@import "winduum/src/base/transitions.css"; + +@source "../../node_modules/winduum/src"; +@source "../../node_modules/winduum-vue"; diff --git a/examples-vue/src/styles/style.css b/examples-vue/src/styles/style.css new file mode 100644 index 0000000..8d72b2b --- /dev/null +++ b/examples-vue/src/styles/style.css @@ -0,0 +1,27 @@ +:root, :host { + height: 100%; + background-color: var(--color-body); + + &.dark { + --color-body: rgb(10, 10, 10); + } +} + +:where(body) { + display: flex; + gap: 0.5rem; + padding: 1rem; + justify-content: center; + align-items: center; + align-content: center; + flex-direction: row; + flex-wrap: wrap; + border-radius: var(--radius); + min-height: 100%; + background: transparent; +} + +#app { + display: contents; +} + diff --git a/examples-vue/src/types.d.ts b/examples-vue/src/types.d.ts new file mode 100644 index 0000000..cfb28a7 --- /dev/null +++ b/examples-vue/src/types.d.ts @@ -0,0 +1 @@ +declare module 'interestfor' diff --git a/examples-vue/tsconfig.json b/examples-vue/tsconfig.json new file mode 100644 index 0000000..5811231 --- /dev/null +++ b/examples-vue/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "module": "ESNext", + "moduleResolution": "Bundler", + "allowImportingTsExtensions": true, + "strict": true, + "jsx": "preserve", + "resolveJsonModule": true, + "isolatedModules": true, + "esModuleInterop": true, + "lib": ["ESNext", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + "types": ["vite/client"], + "baseUrl": ".", + "paths": { + "@/components/field": ["src/adapters/field/index.ts"], + "@/*": ["node_modules/winduum-vue/src/*"] + } + }, + "include": ["src/**/*.ts", "src/**/*.vue"] +} diff --git a/examples-vue/vite.config.js b/examples-vue/vite.config.js new file mode 100644 index 0000000..7e571ed --- /dev/null +++ b/examples-vue/vite.config.js @@ -0,0 +1,45 @@ +import { resolve, relative } from 'path' +import { defineConfig } from 'vite' +import vituum from 'vituum' +import tailwindcss from '@tailwindcss/vite' +import framework from '@vitejs/plugin-vue' +import { examplesIndex } from '../examples-index-plugin.js' + +const htmlPlugin = () => ({ + name: 'html-transform', + transformIndexHtml: { + order: 'post', + handler(html, { path }) { + return html.replaceAll( + '"/assets/', + `"${relative(path, '/src/pages/').slice(0, -2)}assets/` + ) + } + } +}) + +export default defineConfig({ + resolve: { + alias: [ + { + find: '@/components/field', + replacement: resolve(process.cwd(), 'src/adapters/field/index.ts') + }, + { + find: '@', + replacement: resolve(process.cwd(), 'node_modules/winduum-vue/src') + } + ] + }, + plugins: [vituum(), framework(), tailwindcss(), examplesIndex({ + pagesDirectory: resolve(process.cwd(), 'src/pages'), + extension: '.html' + }), htmlPlugin()], + build: { + target: 'esnext', + manifest: false, + modulePreload: false, + emptyOutDir: true, + outDir: resolve(process.cwd(), '../docs/public/examples-vue') + } +}) diff --git a/examples/docs/.vitepress/cache/deps_temp_5bf39089/package.json b/examples/docs/.vitepress/cache/deps_temp_5bf39089/package.json deleted file mode 100644 index 3dbc1ca..0000000 --- a/examples/docs/.vitepress/cache/deps_temp_5bf39089/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "type": "module" -} diff --git a/examples/docs/.vitepress/cache/deps_temp_5bf39089/vitepress___@vue_devtools-api.js b/examples/docs/.vitepress/cache/deps_temp_5bf39089/vitepress___@vue_devtools-api.js deleted file mode 100644 index a698f3a..0000000 --- a/examples/docs/.vitepress/cache/deps_temp_5bf39089/vitepress___@vue_devtools-api.js +++ /dev/null @@ -1,162 +0,0 @@ -// ../node_modules/@vue/devtools-api/lib/esm/env.js -function getDevtoolsGlobalHook() { - return getTarget().__VUE_DEVTOOLS_GLOBAL_HOOK__; -} -function getTarget() { - return typeof navigator !== "undefined" && typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : {}; -} -var isProxyAvailable = typeof Proxy === "function"; - -// ../node_modules/@vue/devtools-api/lib/esm/const.js -var HOOK_SETUP = "devtools-plugin:setup"; -var HOOK_PLUGIN_SETTINGS_SET = "plugin:settings:set"; - -// ../node_modules/@vue/devtools-api/lib/esm/time.js -var supported; -var perf; -function isPerformanceSupported() { - var _a; - if (supported !== void 0) { - return supported; - } - if (typeof window !== "undefined" && window.performance) { - supported = true; - perf = window.performance; - } else if (typeof global !== "undefined" && ((_a = global.perf_hooks) === null || _a === void 0 ? void 0 : _a.performance)) { - supported = true; - perf = global.perf_hooks.performance; - } else { - supported = false; - } - return supported; -} -function now() { - return isPerformanceSupported() ? perf.now() : Date.now(); -} - -// ../node_modules/@vue/devtools-api/lib/esm/proxy.js -var ApiProxy = class { - constructor(plugin, hook) { - this.target = null; - this.targetQueue = []; - this.onQueue = []; - this.plugin = plugin; - this.hook = hook; - const defaultSettings = {}; - if (plugin.settings) { - for (const id in plugin.settings) { - const item = plugin.settings[id]; - defaultSettings[id] = item.defaultValue; - } - } - const localSettingsSaveId = `__vue-devtools-plugin-settings__${plugin.id}`; - let currentSettings = Object.assign({}, defaultSettings); - try { - const raw = localStorage.getItem(localSettingsSaveId); - const data = JSON.parse(raw); - Object.assign(currentSettings, data); - } catch (e) { - } - this.fallbacks = { - getSettings() { - return currentSettings; - }, - setSettings(value) { - try { - localStorage.setItem(localSettingsSaveId, JSON.stringify(value)); - } catch (e) { - } - currentSettings = value; - }, - now() { - return now(); - } - }; - if (hook) { - hook.on(HOOK_PLUGIN_SETTINGS_SET, (pluginId, value) => { - if (pluginId === this.plugin.id) { - this.fallbacks.setSettings(value); - } - }); - } - this.proxiedOn = new Proxy({}, { - get: (_target, prop) => { - if (this.target) { - return this.target.on[prop]; - } else { - return (...args) => { - this.onQueue.push({ - method: prop, - args - }); - }; - } - } - }); - this.proxiedTarget = new Proxy({}, { - get: (_target, prop) => { - if (this.target) { - return this.target[prop]; - } else if (prop === "on") { - return this.proxiedOn; - } else if (Object.keys(this.fallbacks).includes(prop)) { - return (...args) => { - this.targetQueue.push({ - method: prop, - args, - resolve: () => { - } - }); - return this.fallbacks[prop](...args); - }; - } else { - return (...args) => { - return new Promise((resolve) => { - this.targetQueue.push({ - method: prop, - args, - resolve - }); - }); - }; - } - } - }); - } - async setRealTarget(target) { - this.target = target; - for (const item of this.onQueue) { - this.target.on[item.method](...item.args); - } - for (const item of this.targetQueue) { - item.resolve(await this.target[item.method](...item.args)); - } - } -}; - -// ../node_modules/@vue/devtools-api/lib/esm/index.js -function setupDevtoolsPlugin(pluginDescriptor, setupFn) { - const descriptor = pluginDescriptor; - const target = getTarget(); - const hook = getDevtoolsGlobalHook(); - const enableProxy = isProxyAvailable && descriptor.enableEarlyProxy; - if (hook && (target.__VUE_DEVTOOLS_PLUGIN_API_AVAILABLE__ || !enableProxy)) { - hook.emit(HOOK_SETUP, pluginDescriptor, setupFn); - } else { - const proxy = enableProxy ? new ApiProxy(descriptor, hook) : null; - const list = target.__VUE_DEVTOOLS_PLUGINS__ = target.__VUE_DEVTOOLS_PLUGINS__ || []; - list.push({ - pluginDescriptor: descriptor, - setupFn, - proxy - }); - if (proxy) - setupFn(proxy.proxiedTarget); - } -} -export { - isPerformanceSupported, - now, - setupDevtoolsPlugin -}; -//# sourceMappingURL=vitepress___@vue_devtools-api.js.map diff --git a/examples/docs/.vitepress/cache/deps_temp_5bf39089/vitepress___@vue_devtools-api.js.map b/examples/docs/.vitepress/cache/deps_temp_5bf39089/vitepress___@vue_devtools-api.js.map deleted file mode 100644 index c4af0ef..0000000 --- a/examples/docs/.vitepress/cache/deps_temp_5bf39089/vitepress___@vue_devtools-api.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../../../../../node_modules/@vue/devtools-api/lib/esm/env.js", "../../../../../node_modules/@vue/devtools-api/lib/esm/const.js", "../../../../../node_modules/@vue/devtools-api/lib/esm/time.js", "../../../../../node_modules/@vue/devtools-api/lib/esm/proxy.js", "../../../../../node_modules/@vue/devtools-api/lib/esm/index.js"], - "sourcesContent": ["export function getDevtoolsGlobalHook() {\n return getTarget().__VUE_DEVTOOLS_GLOBAL_HOOK__;\n}\nexport function getTarget() {\n // @ts-ignore\n return (typeof navigator !== 'undefined' && typeof window !== 'undefined')\n ? window\n : typeof global !== 'undefined'\n ? global\n : {};\n}\nexport const isProxyAvailable = typeof Proxy === 'function';\n", "export const HOOK_SETUP = 'devtools-plugin:setup';\nexport const HOOK_PLUGIN_SETTINGS_SET = 'plugin:settings:set';\n", "let supported;\nlet perf;\nexport function isPerformanceSupported() {\n var _a;\n if (supported !== undefined) {\n return supported;\n }\n if (typeof window !== 'undefined' && window.performance) {\n supported = true;\n perf = window.performance;\n }\n else if (typeof global !== 'undefined' && ((_a = global.perf_hooks) === null || _a === void 0 ? void 0 : _a.performance)) {\n supported = true;\n perf = global.perf_hooks.performance;\n }\n else {\n supported = false;\n }\n return supported;\n}\nexport function now() {\n return isPerformanceSupported() ? perf.now() : Date.now();\n}\n", "import { HOOK_PLUGIN_SETTINGS_SET } from './const.js';\nimport { now } from './time.js';\nexport class ApiProxy {\n constructor(plugin, hook) {\n this.target = null;\n this.targetQueue = [];\n this.onQueue = [];\n this.plugin = plugin;\n this.hook = hook;\n const defaultSettings = {};\n if (plugin.settings) {\n for (const id in plugin.settings) {\n const item = plugin.settings[id];\n defaultSettings[id] = item.defaultValue;\n }\n }\n const localSettingsSaveId = `__vue-devtools-plugin-settings__${plugin.id}`;\n let currentSettings = Object.assign({}, defaultSettings);\n try {\n const raw = localStorage.getItem(localSettingsSaveId);\n const data = JSON.parse(raw);\n Object.assign(currentSettings, data);\n }\n catch (e) {\n // noop\n }\n this.fallbacks = {\n getSettings() {\n return currentSettings;\n },\n setSettings(value) {\n try {\n localStorage.setItem(localSettingsSaveId, JSON.stringify(value));\n }\n catch (e) {\n // noop\n }\n currentSettings = value;\n },\n now() {\n return now();\n },\n };\n if (hook) {\n hook.on(HOOK_PLUGIN_SETTINGS_SET, (pluginId, value) => {\n if (pluginId === this.plugin.id) {\n this.fallbacks.setSettings(value);\n }\n });\n }\n this.proxiedOn = new Proxy({}, {\n get: (_target, prop) => {\n if (this.target) {\n return this.target.on[prop];\n }\n else {\n return (...args) => {\n this.onQueue.push({\n method: prop,\n args,\n });\n };\n }\n },\n });\n this.proxiedTarget = new Proxy({}, {\n get: (_target, prop) => {\n if (this.target) {\n return this.target[prop];\n }\n else if (prop === 'on') {\n return this.proxiedOn;\n }\n else if (Object.keys(this.fallbacks).includes(prop)) {\n return (...args) => {\n this.targetQueue.push({\n method: prop,\n args,\n resolve: () => { },\n });\n return this.fallbacks[prop](...args);\n };\n }\n else {\n return (...args) => {\n return new Promise(resolve => {\n this.targetQueue.push({\n method: prop,\n args,\n resolve,\n });\n });\n };\n }\n },\n });\n }\n async setRealTarget(target) {\n this.target = target;\n for (const item of this.onQueue) {\n this.target.on[item.method](...item.args);\n }\n for (const item of this.targetQueue) {\n item.resolve(await this.target[item.method](...item.args));\n }\n }\n}\n", "import { getTarget, getDevtoolsGlobalHook, isProxyAvailable } from './env.js';\nimport { HOOK_SETUP } from './const.js';\nimport { ApiProxy } from './proxy.js';\nexport * from './api/index.js';\nexport * from './plugin.js';\nexport * from './time.js';\nexport function setupDevtoolsPlugin(pluginDescriptor, setupFn) {\n const descriptor = pluginDescriptor;\n const target = getTarget();\n const hook = getDevtoolsGlobalHook();\n const enableProxy = isProxyAvailable && descriptor.enableEarlyProxy;\n if (hook && (target.__VUE_DEVTOOLS_PLUGIN_API_AVAILABLE__ || !enableProxy)) {\n hook.emit(HOOK_SETUP, pluginDescriptor, setupFn);\n }\n else {\n const proxy = enableProxy ? new ApiProxy(descriptor, hook) : null;\n const list = target.__VUE_DEVTOOLS_PLUGINS__ = target.__VUE_DEVTOOLS_PLUGINS__ || [];\n list.push({\n pluginDescriptor: descriptor,\n setupFn,\n proxy,\n });\n if (proxy)\n setupFn(proxy.proxiedTarget);\n }\n}\n"], - "mappings": ";AAAO,SAAS,wBAAwB;AACpC,SAAO,UAAU,EAAE;AACvB;AACO,SAAS,YAAY;AAExB,SAAQ,OAAO,cAAc,eAAe,OAAO,WAAW,cACxD,SACA,OAAO,WAAW,cACd,SACA,CAAC;AACf;AACO,IAAM,mBAAmB,OAAO,UAAU;;;ACX1C,IAAM,aAAa;AACnB,IAAM,2BAA2B;;;ACDxC,IAAI;AACJ,IAAI;AACG,SAAS,yBAAyB;AACrC,MAAI;AACJ,MAAI,cAAc,QAAW;AACzB,WAAO;AAAA,EACX;AACA,MAAI,OAAO,WAAW,eAAe,OAAO,aAAa;AACrD,gBAAY;AACZ,WAAO,OAAO;AAAA,EAClB,WACS,OAAO,WAAW,iBAAiB,KAAK,OAAO,gBAAgB,QAAQ,OAAO,SAAS,SAAS,GAAG,cAAc;AACtH,gBAAY;AACZ,WAAO,OAAO,WAAW;AAAA,EAC7B,OACK;AACD,gBAAY;AAAA,EAChB;AACA,SAAO;AACX;AACO,SAAS,MAAM;AAClB,SAAO,uBAAuB,IAAI,KAAK,IAAI,IAAI,KAAK,IAAI;AAC5D;;;ACpBO,IAAM,WAAN,MAAe;AAAA,EAClB,YAAY,QAAQ,MAAM;AACtB,SAAK,SAAS;AACd,SAAK,cAAc,CAAC;AACpB,SAAK,UAAU,CAAC;AAChB,SAAK,SAAS;AACd,SAAK,OAAO;AACZ,UAAM,kBAAkB,CAAC;AACzB,QAAI,OAAO,UAAU;AACjB,iBAAW,MAAM,OAAO,UAAU;AAC9B,cAAM,OAAO,OAAO,SAAS,EAAE;AAC/B,wBAAgB,EAAE,IAAI,KAAK;AAAA,MAC/B;AAAA,IACJ;AACA,UAAM,sBAAsB,mCAAmC,OAAO,EAAE;AACxE,QAAI,kBAAkB,OAAO,OAAO,CAAC,GAAG,eAAe;AACvD,QAAI;AACA,YAAM,MAAM,aAAa,QAAQ,mBAAmB;AACpD,YAAM,OAAO,KAAK,MAAM,GAAG;AAC3B,aAAO,OAAO,iBAAiB,IAAI;AAAA,IACvC,SACO,GAAG;AAAA,IAEV;AACA,SAAK,YAAY;AAAA,MACb,cAAc;AACV,eAAO;AAAA,MACX;AAAA,MACA,YAAY,OAAO;AACf,YAAI;AACA,uBAAa,QAAQ,qBAAqB,KAAK,UAAU,KAAK,CAAC;AAAA,QACnE,SACO,GAAG;AAAA,QAEV;AACA,0BAAkB;AAAA,MACtB;AAAA,MACA,MAAM;AACF,eAAO,IAAI;AAAA,MACf;AAAA,IACJ;AACA,QAAI,MAAM;AACN,WAAK,GAAG,0BAA0B,CAAC,UAAU,UAAU;AACnD,YAAI,aAAa,KAAK,OAAO,IAAI;AAC7B,eAAK,UAAU,YAAY,KAAK;AAAA,QACpC;AAAA,MACJ,CAAC;AAAA,IACL;AACA,SAAK,YAAY,IAAI,MAAM,CAAC,GAAG;AAAA,MAC3B,KAAK,CAAC,SAAS,SAAS;AACpB,YAAI,KAAK,QAAQ;AACb,iBAAO,KAAK,OAAO,GAAG,IAAI;AAAA,QAC9B,OACK;AACD,iBAAO,IAAI,SAAS;AAChB,iBAAK,QAAQ,KAAK;AAAA,cACd,QAAQ;AAAA,cACR;AAAA,YACJ,CAAC;AAAA,UACL;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ,CAAC;AACD,SAAK,gBAAgB,IAAI,MAAM,CAAC,GAAG;AAAA,MAC/B,KAAK,CAAC,SAAS,SAAS;AACpB,YAAI,KAAK,QAAQ;AACb,iBAAO,KAAK,OAAO,IAAI;AAAA,QAC3B,WACS,SAAS,MAAM;AACpB,iBAAO,KAAK;AAAA,QAChB,WACS,OAAO,KAAK,KAAK,SAAS,EAAE,SAAS,IAAI,GAAG;AACjD,iBAAO,IAAI,SAAS;AAChB,iBAAK,YAAY,KAAK;AAAA,cAClB,QAAQ;AAAA,cACR;AAAA,cACA,SAAS,MAAM;AAAA,cAAE;AAAA,YACrB,CAAC;AACD,mBAAO,KAAK,UAAU,IAAI,EAAE,GAAG,IAAI;AAAA,UACvC;AAAA,QACJ,OACK;AACD,iBAAO,IAAI,SAAS;AAChB,mBAAO,IAAI,QAAQ,aAAW;AAC1B,mBAAK,YAAY,KAAK;AAAA,gBAClB,QAAQ;AAAA,gBACR;AAAA,gBACA;AAAA,cACJ,CAAC;AAAA,YACL,CAAC;AAAA,UACL;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ,CAAC;AAAA,EACL;AAAA,EACA,MAAM,cAAc,QAAQ;AACxB,SAAK,SAAS;AACd,eAAW,QAAQ,KAAK,SAAS;AAC7B,WAAK,OAAO,GAAG,KAAK,MAAM,EAAE,GAAG,KAAK,IAAI;AAAA,IAC5C;AACA,eAAW,QAAQ,KAAK,aAAa;AACjC,WAAK,QAAQ,MAAM,KAAK,OAAO,KAAK,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC;AAAA,IAC7D;AAAA,EACJ;AACJ;;;ACpGO,SAAS,oBAAoB,kBAAkB,SAAS;AAC3D,QAAM,aAAa;AACnB,QAAM,SAAS,UAAU;AACzB,QAAM,OAAO,sBAAsB;AACnC,QAAM,cAAc,oBAAoB,WAAW;AACnD,MAAI,SAAS,OAAO,yCAAyC,CAAC,cAAc;AACxE,SAAK,KAAK,YAAY,kBAAkB,OAAO;AAAA,EACnD,OACK;AACD,UAAM,QAAQ,cAAc,IAAI,SAAS,YAAY,IAAI,IAAI;AAC7D,UAAM,OAAO,OAAO,2BAA2B,OAAO,4BAA4B,CAAC;AACnF,SAAK,KAAK;AAAA,MACN,kBAAkB;AAAA,MAClB;AAAA,MACA;AAAA,IACJ,CAAC;AACD,QAAI;AACA,cAAQ,MAAM,aAAa;AAAA,EACnC;AACJ;", - "names": [] -} diff --git a/examples/docs/.vitepress/cache/deps_temp_5bf39089/vue.js b/examples/docs/.vitepress/cache/deps_temp_5bf39089/vue.js deleted file mode 100644 index 7d4305f..0000000 --- a/examples/docs/.vitepress/cache/deps_temp_5bf39089/vue.js +++ /dev/null @@ -1,10795 +0,0 @@ -// ../node_modules/@vue/shared/dist/shared.esm-bundler.js -function makeMap(str, expectsLowerCase) { - const map2 = /* @__PURE__ */ Object.create(null); - const list = str.split(","); - for (let i = 0; i < list.length; i++) { - map2[list[i]] = true; - } - return expectsLowerCase ? (val) => !!map2[val.toLowerCase()] : (val) => !!map2[val]; -} -var EMPTY_OBJ = true ? Object.freeze({}) : {}; -var EMPTY_ARR = true ? Object.freeze([]) : []; -var NOOP = () => { -}; -var NO = () => false; -var onRE = /^on[^a-z]/; -var isOn = (key) => onRE.test(key); -var isModelListener = (key) => key.startsWith("onUpdate:"); -var extend = Object.assign; -var remove = (arr, el) => { - const i = arr.indexOf(el); - if (i > -1) { - arr.splice(i, 1); - } -}; -var hasOwnProperty = Object.prototype.hasOwnProperty; -var hasOwn = (val, key) => hasOwnProperty.call(val, key); -var isArray = Array.isArray; -var isMap = (val) => toTypeString(val) === "[object Map]"; -var isSet = (val) => toTypeString(val) === "[object Set]"; -var isDate = (val) => toTypeString(val) === "[object Date]"; -var isRegExp = (val) => toTypeString(val) === "[object RegExp]"; -var isFunction = (val) => typeof val === "function"; -var isString = (val) => typeof val === "string"; -var isSymbol = (val) => typeof val === "symbol"; -var isObject = (val) => val !== null && typeof val === "object"; -var isPromise = (val) => { - return isObject(val) && isFunction(val.then) && isFunction(val.catch); -}; -var objectToString = Object.prototype.toString; -var toTypeString = (value) => objectToString.call(value); -var toRawType = (value) => { - return toTypeString(value).slice(8, -1); -}; -var isPlainObject = (val) => toTypeString(val) === "[object Object]"; -var isIntegerKey = (key) => isString(key) && key !== "NaN" && key[0] !== "-" && "" + parseInt(key, 10) === key; -var isReservedProp = makeMap( - // the leading comma is intentional so empty string "" is also included - ",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted" -); -var isBuiltInDirective = makeMap( - "bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo" -); -var cacheStringFunction = (fn) => { - const cache = /* @__PURE__ */ Object.create(null); - return (str) => { - const hit = cache[str]; - return hit || (cache[str] = fn(str)); - }; -}; -var camelizeRE = /-(\w)/g; -var camelize = cacheStringFunction((str) => { - return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : ""); -}); -var hyphenateRE = /\B([A-Z])/g; -var hyphenate = cacheStringFunction( - (str) => str.replace(hyphenateRE, "-$1").toLowerCase() -); -var capitalize = cacheStringFunction( - (str) => str.charAt(0).toUpperCase() + str.slice(1) -); -var toHandlerKey = cacheStringFunction( - (str) => str ? `on${capitalize(str)}` : `` -); -var hasChanged = (value, oldValue) => !Object.is(value, oldValue); -var invokeArrayFns = (fns, arg) => { - for (let i = 0; i < fns.length; i++) { - fns[i](arg); - } -}; -var def = (obj, key, value) => { - Object.defineProperty(obj, key, { - configurable: true, - enumerable: false, - value - }); -}; -var looseToNumber = (val) => { - const n = parseFloat(val); - return isNaN(n) ? val : n; -}; -var toNumber = (val) => { - const n = isString(val) ? Number(val) : NaN; - return isNaN(n) ? val : n; -}; -var _globalThis; -var getGlobalThis = () => { - return _globalThis || (_globalThis = typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : {}); -}; -var GLOBALS_WHITE_LISTED = "Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console"; -var isGloballyWhitelisted = makeMap(GLOBALS_WHITE_LISTED); -function normalizeStyle(value) { - if (isArray(value)) { - const res = {}; - for (let i = 0; i < value.length; i++) { - const item = value[i]; - const normalized = isString(item) ? parseStringStyle(item) : normalizeStyle(item); - if (normalized) { - for (const key in normalized) { - res[key] = normalized[key]; - } - } - } - return res; - } else if (isString(value)) { - return value; - } else if (isObject(value)) { - return value; - } -} -var listDelimiterRE = /;(?![^(]*\))/g; -var propertyDelimiterRE = /:([^]+)/; -var styleCommentRE = /\/\*[^]*?\*\//g; -function parseStringStyle(cssText) { - const ret = {}; - cssText.replace(styleCommentRE, "").split(listDelimiterRE).forEach((item) => { - if (item) { - const tmp = item.split(propertyDelimiterRE); - tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim()); - } - }); - return ret; -} -function normalizeClass(value) { - let res = ""; - if (isString(value)) { - res = value; - } else if (isArray(value)) { - for (let i = 0; i < value.length; i++) { - const normalized = normalizeClass(value[i]); - if (normalized) { - res += normalized + " "; - } - } - } else if (isObject(value)) { - for (const name in value) { - if (value[name]) { - res += name + " "; - } - } - } - return res.trim(); -} -function normalizeProps(props) { - if (!props) - return null; - let { class: klass, style } = props; - if (klass && !isString(klass)) { - props.class = normalizeClass(klass); - } - if (style) { - props.style = normalizeStyle(style); - } - return props; -} -var HTML_TAGS = "html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot"; -var SVG_TAGS = "svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,feDistantLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view"; -var VOID_TAGS = "area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr"; -var isHTMLTag = makeMap(HTML_TAGS); -var isSVGTag = makeMap(SVG_TAGS); -var isVoidTag = makeMap(VOID_TAGS); -var specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`; -var isSpecialBooleanAttr = makeMap(specialBooleanAttrs); -var isBooleanAttr = makeMap( - specialBooleanAttrs + `,async,autofocus,autoplay,controls,default,defer,disabled,hidden,inert,loop,open,required,reversed,scoped,seamless,checked,muted,multiple,selected` -); -function includeBooleanAttr(value) { - return !!value || value === ""; -} -var isKnownHtmlAttr = makeMap( - `accept,accept-charset,accesskey,action,align,allow,alt,async,autocapitalize,autocomplete,autofocus,autoplay,background,bgcolor,border,buffered,capture,challenge,charset,checked,cite,class,code,codebase,color,cols,colspan,content,contenteditable,contextmenu,controls,coords,crossorigin,csp,data,datetime,decoding,default,defer,dir,dirname,disabled,download,draggable,dropzone,enctype,enterkeyhint,for,form,formaction,formenctype,formmethod,formnovalidate,formtarget,headers,height,hidden,high,href,hreflang,http-equiv,icon,id,importance,inert,integrity,ismap,itemprop,keytype,kind,label,lang,language,loading,list,loop,low,manifest,max,maxlength,minlength,media,min,multiple,muted,name,novalidate,open,optimum,pattern,ping,placeholder,poster,preload,radiogroup,readonly,referrerpolicy,rel,required,reversed,rows,rowspan,sandbox,scope,scoped,selected,shape,size,sizes,slot,span,spellcheck,src,srcdoc,srclang,srcset,start,step,style,summary,tabindex,target,title,translate,type,usemap,value,width,wrap` -); -var isKnownSvgAttr = makeMap( - `xmlns,accent-height,accumulate,additive,alignment-baseline,alphabetic,amplitude,arabic-form,ascent,attributeName,attributeType,azimuth,baseFrequency,baseline-shift,baseProfile,bbox,begin,bias,by,calcMode,cap-height,class,clip,clipPathUnits,clip-path,clip-rule,color,color-interpolation,color-interpolation-filters,color-profile,color-rendering,contentScriptType,contentStyleType,crossorigin,cursor,cx,cy,d,decelerate,descent,diffuseConstant,direction,display,divisor,dominant-baseline,dur,dx,dy,edgeMode,elevation,enable-background,end,exponent,fill,fill-opacity,fill-rule,filter,filterRes,filterUnits,flood-color,flood-opacity,font-family,font-size,font-size-adjust,font-stretch,font-style,font-variant,font-weight,format,from,fr,fx,fy,g1,g2,glyph-name,glyph-orientation-horizontal,glyph-orientation-vertical,glyphRef,gradientTransform,gradientUnits,hanging,height,href,hreflang,horiz-adv-x,horiz-origin-x,id,ideographic,image-rendering,in,in2,intercept,k,k1,k2,k3,k4,kernelMatrix,kernelUnitLength,kerning,keyPoints,keySplines,keyTimes,lang,lengthAdjust,letter-spacing,lighting-color,limitingConeAngle,local,marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mask,maskContentUnits,maskUnits,mathematical,max,media,method,min,mode,name,numOctaves,offset,opacity,operator,order,orient,orientation,origin,overflow,overline-position,overline-thickness,panose-1,paint-order,path,pathLength,patternContentUnits,patternTransform,patternUnits,ping,pointer-events,points,pointsAtX,pointsAtY,pointsAtZ,preserveAlpha,preserveAspectRatio,primitiveUnits,r,radius,referrerPolicy,refX,refY,rel,rendering-intent,repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,result,rotate,rx,ry,scale,seed,shape-rendering,slope,spacing,specularConstant,specularExponent,speed,spreadMethod,startOffset,stdDeviation,stemh,stemv,stitchTiles,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,string,stroke,stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,stroke-width,style,surfaceScale,systemLanguage,tabindex,tableValues,target,targetX,targetY,text-anchor,text-decoration,text-rendering,textLength,to,transform,transform-origin,type,u1,u2,underline-position,underline-thickness,unicode,unicode-bidi,unicode-range,units-per-em,v-alphabetic,v-hanging,v-ideographic,v-mathematical,values,vector-effect,version,vert-adv-y,vert-origin-x,vert-origin-y,viewBox,viewTarget,visibility,width,widths,word-spacing,writing-mode,x,x-height,x1,x2,xChannelSelector,xlink:actuate,xlink:arcrole,xlink:href,xlink:role,xlink:show,xlink:title,xlink:type,xml:base,xml:lang,xml:space,y,y1,y2,yChannelSelector,z,zoomAndPan` -); -function looseCompareArrays(a, b) { - if (a.length !== b.length) - return false; - let equal = true; - for (let i = 0; equal && i < a.length; i++) { - equal = looseEqual(a[i], b[i]); - } - return equal; -} -function looseEqual(a, b) { - if (a === b) - return true; - let aValidType = isDate(a); - let bValidType = isDate(b); - if (aValidType || bValidType) { - return aValidType && bValidType ? a.getTime() === b.getTime() : false; - } - aValidType = isSymbol(a); - bValidType = isSymbol(b); - if (aValidType || bValidType) { - return a === b; - } - aValidType = isArray(a); - bValidType = isArray(b); - if (aValidType || bValidType) { - return aValidType && bValidType ? looseCompareArrays(a, b) : false; - } - aValidType = isObject(a); - bValidType = isObject(b); - if (aValidType || bValidType) { - if (!aValidType || !bValidType) { - return false; - } - const aKeysCount = Object.keys(a).length; - const bKeysCount = Object.keys(b).length; - if (aKeysCount !== bKeysCount) { - return false; - } - for (const key in a) { - const aHasKey = a.hasOwnProperty(key); - const bHasKey = b.hasOwnProperty(key); - if (aHasKey && !bHasKey || !aHasKey && bHasKey || !looseEqual(a[key], b[key])) { - return false; - } - } - } - return String(a) === String(b); -} -function looseIndexOf(arr, val) { - return arr.findIndex((item) => looseEqual(item, val)); -} -var toDisplayString = (val) => { - return isString(val) ? val : val == null ? "" : isArray(val) || isObject(val) && (val.toString === objectToString || !isFunction(val.toString)) ? JSON.stringify(val, replacer, 2) : String(val); -}; -var replacer = (_key, val) => { - if (val && val.__v_isRef) { - return replacer(_key, val.value); - } else if (isMap(val)) { - return { - [`Map(${val.size})`]: [...val.entries()].reduce((entries, [key, val2]) => { - entries[`${key} =>`] = val2; - return entries; - }, {}) - }; - } else if (isSet(val)) { - return { - [`Set(${val.size})`]: [...val.values()] - }; - } else if (isObject(val) && !isArray(val) && !isPlainObject(val)) { - return String(val); - } - return val; -}; - -// ../node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js -function warn(msg, ...args) { - console.warn(`[Vue warn] ${msg}`, ...args); -} -var activeEffectScope; -var EffectScope = class { - constructor(detached = false) { - this.detached = detached; - this._active = true; - this.effects = []; - this.cleanups = []; - this.parent = activeEffectScope; - if (!detached && activeEffectScope) { - this.index = (activeEffectScope.scopes || (activeEffectScope.scopes = [])).push( - this - ) - 1; - } - } - get active() { - return this._active; - } - run(fn) { - if (this._active) { - const currentEffectScope = activeEffectScope; - try { - activeEffectScope = this; - return fn(); - } finally { - activeEffectScope = currentEffectScope; - } - } else if (true) { - warn(`cannot run an inactive effect scope.`); - } - } - /** - * This should only be called on non-detached scopes - * @internal - */ - on() { - activeEffectScope = this; - } - /** - * This should only be called on non-detached scopes - * @internal - */ - off() { - activeEffectScope = this.parent; - } - stop(fromParent) { - if (this._active) { - let i, l; - for (i = 0, l = this.effects.length; i < l; i++) { - this.effects[i].stop(); - } - for (i = 0, l = this.cleanups.length; i < l; i++) { - this.cleanups[i](); - } - if (this.scopes) { - for (i = 0, l = this.scopes.length; i < l; i++) { - this.scopes[i].stop(true); - } - } - if (!this.detached && this.parent && !fromParent) { - const last = this.parent.scopes.pop(); - if (last && last !== this) { - this.parent.scopes[this.index] = last; - last.index = this.index; - } - } - this.parent = void 0; - this._active = false; - } - } -}; -function effectScope(detached) { - return new EffectScope(detached); -} -function recordEffectScope(effect2, scope = activeEffectScope) { - if (scope && scope.active) { - scope.effects.push(effect2); - } -} -function getCurrentScope() { - return activeEffectScope; -} -function onScopeDispose(fn) { - if (activeEffectScope) { - activeEffectScope.cleanups.push(fn); - } else if (true) { - warn( - `onScopeDispose() is called when there is no active effect scope to be associated with.` - ); - } -} -var createDep = (effects) => { - const dep = new Set(effects); - dep.w = 0; - dep.n = 0; - return dep; -}; -var wasTracked = (dep) => (dep.w & trackOpBit) > 0; -var newTracked = (dep) => (dep.n & trackOpBit) > 0; -var initDepMarkers = ({ deps }) => { - if (deps.length) { - for (let i = 0; i < deps.length; i++) { - deps[i].w |= trackOpBit; - } - } -}; -var finalizeDepMarkers = (effect2) => { - const { deps } = effect2; - if (deps.length) { - let ptr = 0; - for (let i = 0; i < deps.length; i++) { - const dep = deps[i]; - if (wasTracked(dep) && !newTracked(dep)) { - dep.delete(effect2); - } else { - deps[ptr++] = dep; - } - dep.w &= ~trackOpBit; - dep.n &= ~trackOpBit; - } - deps.length = ptr; - } -}; -var targetMap = /* @__PURE__ */ new WeakMap(); -var effectTrackDepth = 0; -var trackOpBit = 1; -var maxMarkerBits = 30; -var activeEffect; -var ITERATE_KEY = Symbol(true ? "iterate" : ""); -var MAP_KEY_ITERATE_KEY = Symbol(true ? "Map key iterate" : ""); -var ReactiveEffect = class { - constructor(fn, scheduler = null, scope) { - this.fn = fn; - this.scheduler = scheduler; - this.active = true; - this.deps = []; - this.parent = void 0; - recordEffectScope(this, scope); - } - run() { - if (!this.active) { - return this.fn(); - } - let parent = activeEffect; - let lastShouldTrack = shouldTrack; - while (parent) { - if (parent === this) { - return; - } - parent = parent.parent; - } - try { - this.parent = activeEffect; - activeEffect = this; - shouldTrack = true; - trackOpBit = 1 << ++effectTrackDepth; - if (effectTrackDepth <= maxMarkerBits) { - initDepMarkers(this); - } else { - cleanupEffect(this); - } - return this.fn(); - } finally { - if (effectTrackDepth <= maxMarkerBits) { - finalizeDepMarkers(this); - } - trackOpBit = 1 << --effectTrackDepth; - activeEffect = this.parent; - shouldTrack = lastShouldTrack; - this.parent = void 0; - if (this.deferStop) { - this.stop(); - } - } - } - stop() { - if (activeEffect === this) { - this.deferStop = true; - } else if (this.active) { - cleanupEffect(this); - if (this.onStop) { - this.onStop(); - } - this.active = false; - } - } -}; -function cleanupEffect(effect2) { - const { deps } = effect2; - if (deps.length) { - for (let i = 0; i < deps.length; i++) { - deps[i].delete(effect2); - } - deps.length = 0; - } -} -function effect(fn, options) { - if (fn.effect) { - fn = fn.effect.fn; - } - const _effect = new ReactiveEffect(fn); - if (options) { - extend(_effect, options); - if (options.scope) - recordEffectScope(_effect, options.scope); - } - if (!options || !options.lazy) { - _effect.run(); - } - const runner = _effect.run.bind(_effect); - runner.effect = _effect; - return runner; -} -function stop(runner) { - runner.effect.stop(); -} -var shouldTrack = true; -var trackStack = []; -function pauseTracking() { - trackStack.push(shouldTrack); - shouldTrack = false; -} -function resetTracking() { - const last = trackStack.pop(); - shouldTrack = last === void 0 ? true : last; -} -function track(target, type, key) { - if (shouldTrack && activeEffect) { - let depsMap = targetMap.get(target); - if (!depsMap) { - targetMap.set(target, depsMap = /* @__PURE__ */ new Map()); - } - let dep = depsMap.get(key); - if (!dep) { - depsMap.set(key, dep = createDep()); - } - const eventInfo = true ? { effect: activeEffect, target, type, key } : void 0; - trackEffects(dep, eventInfo); - } -} -function trackEffects(dep, debuggerEventExtraInfo) { - let shouldTrack2 = false; - if (effectTrackDepth <= maxMarkerBits) { - if (!newTracked(dep)) { - dep.n |= trackOpBit; - shouldTrack2 = !wasTracked(dep); - } - } else { - shouldTrack2 = !dep.has(activeEffect); - } - if (shouldTrack2) { - dep.add(activeEffect); - activeEffect.deps.push(dep); - if (activeEffect.onTrack) { - activeEffect.onTrack( - extend( - { - effect: activeEffect - }, - debuggerEventExtraInfo - ) - ); - } - } -} -function trigger(target, type, key, newValue, oldValue, oldTarget) { - const depsMap = targetMap.get(target); - if (!depsMap) { - return; - } - let deps = []; - if (type === "clear") { - deps = [...depsMap.values()]; - } else if (key === "length" && isArray(target)) { - const newLength = Number(newValue); - depsMap.forEach((dep, key2) => { - if (key2 === "length" || key2 >= newLength) { - deps.push(dep); - } - }); - } else { - if (key !== void 0) { - deps.push(depsMap.get(key)); - } - switch (type) { - case "add": - if (!isArray(target)) { - deps.push(depsMap.get(ITERATE_KEY)); - if (isMap(target)) { - deps.push(depsMap.get(MAP_KEY_ITERATE_KEY)); - } - } else if (isIntegerKey(key)) { - deps.push(depsMap.get("length")); - } - break; - case "delete": - if (!isArray(target)) { - deps.push(depsMap.get(ITERATE_KEY)); - if (isMap(target)) { - deps.push(depsMap.get(MAP_KEY_ITERATE_KEY)); - } - } - break; - case "set": - if (isMap(target)) { - deps.push(depsMap.get(ITERATE_KEY)); - } - break; - } - } - const eventInfo = true ? { target, type, key, newValue, oldValue, oldTarget } : void 0; - if (deps.length === 1) { - if (deps[0]) { - if (true) { - triggerEffects(deps[0], eventInfo); - } else { - triggerEffects(deps[0]); - } - } - } else { - const effects = []; - for (const dep of deps) { - if (dep) { - effects.push(...dep); - } - } - if (true) { - triggerEffects(createDep(effects), eventInfo); - } else { - triggerEffects(createDep(effects)); - } - } -} -function triggerEffects(dep, debuggerEventExtraInfo) { - const effects = isArray(dep) ? dep : [...dep]; - for (const effect2 of effects) { - if (effect2.computed) { - triggerEffect(effect2, debuggerEventExtraInfo); - } - } - for (const effect2 of effects) { - if (!effect2.computed) { - triggerEffect(effect2, debuggerEventExtraInfo); - } - } -} -function triggerEffect(effect2, debuggerEventExtraInfo) { - if (effect2 !== activeEffect || effect2.allowRecurse) { - if (effect2.onTrigger) { - effect2.onTrigger(extend({ effect: effect2 }, debuggerEventExtraInfo)); - } - if (effect2.scheduler) { - effect2.scheduler(); - } else { - effect2.run(); - } - } -} -function getDepFromReactive(object, key) { - var _a; - return (_a = targetMap.get(object)) == null ? void 0 : _a.get(key); -} -var isNonTrackableKeys = makeMap(`__proto__,__v_isRef,__isVue`); -var builtInSymbols = new Set( - Object.getOwnPropertyNames(Symbol).filter((key) => key !== "arguments" && key !== "caller").map((key) => Symbol[key]).filter(isSymbol) -); -var get$1 = createGetter(); -var shallowGet = createGetter(false, true); -var readonlyGet = createGetter(true); -var shallowReadonlyGet = createGetter(true, true); -var arrayInstrumentations = createArrayInstrumentations(); -function createArrayInstrumentations() { - const instrumentations = {}; - ["includes", "indexOf", "lastIndexOf"].forEach((key) => { - instrumentations[key] = function(...args) { - const arr = toRaw(this); - for (let i = 0, l = this.length; i < l; i++) { - track(arr, "get", i + ""); - } - const res = arr[key](...args); - if (res === -1 || res === false) { - return arr[key](...args.map(toRaw)); - } else { - return res; - } - }; - }); - ["push", "pop", "shift", "unshift", "splice"].forEach((key) => { - instrumentations[key] = function(...args) { - pauseTracking(); - const res = toRaw(this)[key].apply(this, args); - resetTracking(); - return res; - }; - }); - return instrumentations; -} -function hasOwnProperty2(key) { - const obj = toRaw(this); - track(obj, "has", key); - return obj.hasOwnProperty(key); -} -function createGetter(isReadonly2 = false, shallow = false) { - return function get2(target, key, receiver) { - if (key === "__v_isReactive") { - return !isReadonly2; - } else if (key === "__v_isReadonly") { - return isReadonly2; - } else if (key === "__v_isShallow") { - return shallow; - } else if (key === "__v_raw" && receiver === (isReadonly2 ? shallow ? shallowReadonlyMap : readonlyMap : shallow ? shallowReactiveMap : reactiveMap).get(target)) { - return target; - } - const targetIsArray = isArray(target); - if (!isReadonly2) { - if (targetIsArray && hasOwn(arrayInstrumentations, key)) { - return Reflect.get(arrayInstrumentations, key, receiver); - } - if (key === "hasOwnProperty") { - return hasOwnProperty2; - } - } - const res = Reflect.get(target, key, receiver); - if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) { - return res; - } - if (!isReadonly2) { - track(target, "get", key); - } - if (shallow) { - return res; - } - if (isRef(res)) { - return targetIsArray && isIntegerKey(key) ? res : res.value; - } - if (isObject(res)) { - return isReadonly2 ? readonly(res) : reactive(res); - } - return res; - }; -} -var set$1 = createSetter(); -var shallowSet = createSetter(true); -function createSetter(shallow = false) { - return function set2(target, key, value, receiver) { - let oldValue = target[key]; - if (isReadonly(oldValue) && isRef(oldValue) && !isRef(value)) { - return false; - } - if (!shallow) { - if (!isShallow(value) && !isReadonly(value)) { - oldValue = toRaw(oldValue); - value = toRaw(value); - } - if (!isArray(target) && isRef(oldValue) && !isRef(value)) { - oldValue.value = value; - return true; - } - } - const hadKey = isArray(target) && isIntegerKey(key) ? Number(key) < target.length : hasOwn(target, key); - const result = Reflect.set(target, key, value, receiver); - if (target === toRaw(receiver)) { - if (!hadKey) { - trigger(target, "add", key, value); - } else if (hasChanged(value, oldValue)) { - trigger(target, "set", key, value, oldValue); - } - } - return result; - }; -} -function deleteProperty(target, key) { - const hadKey = hasOwn(target, key); - const oldValue = target[key]; - const result = Reflect.deleteProperty(target, key); - if (result && hadKey) { - trigger(target, "delete", key, void 0, oldValue); - } - return result; -} -function has$1(target, key) { - const result = Reflect.has(target, key); - if (!isSymbol(key) || !builtInSymbols.has(key)) { - track(target, "has", key); - } - return result; -} -function ownKeys(target) { - track(target, "iterate", isArray(target) ? "length" : ITERATE_KEY); - return Reflect.ownKeys(target); -} -var mutableHandlers = { - get: get$1, - set: set$1, - deleteProperty, - has: has$1, - ownKeys -}; -var readonlyHandlers = { - get: readonlyGet, - set(target, key) { - if (true) { - warn( - `Set operation on key "${String(key)}" failed: target is readonly.`, - target - ); - } - return true; - }, - deleteProperty(target, key) { - if (true) { - warn( - `Delete operation on key "${String(key)}" failed: target is readonly.`, - target - ); - } - return true; - } -}; -var shallowReactiveHandlers = extend( - {}, - mutableHandlers, - { - get: shallowGet, - set: shallowSet - } -); -var shallowReadonlyHandlers = extend( - {}, - readonlyHandlers, - { - get: shallowReadonlyGet - } -); -var toShallow = (value) => value; -var getProto = (v) => Reflect.getPrototypeOf(v); -function get(target, key, isReadonly2 = false, isShallow3 = false) { - target = target["__v_raw"]; - const rawTarget = toRaw(target); - const rawKey = toRaw(key); - if (!isReadonly2) { - if (key !== rawKey) { - track(rawTarget, "get", key); - } - track(rawTarget, "get", rawKey); - } - const { has: has2 } = getProto(rawTarget); - const wrap = isShallow3 ? toShallow : isReadonly2 ? toReadonly : toReactive; - if (has2.call(rawTarget, key)) { - return wrap(target.get(key)); - } else if (has2.call(rawTarget, rawKey)) { - return wrap(target.get(rawKey)); - } else if (target !== rawTarget) { - target.get(key); - } -} -function has(key, isReadonly2 = false) { - const target = this["__v_raw"]; - const rawTarget = toRaw(target); - const rawKey = toRaw(key); - if (!isReadonly2) { - if (key !== rawKey) { - track(rawTarget, "has", key); - } - track(rawTarget, "has", rawKey); - } - return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey); -} -function size(target, isReadonly2 = false) { - target = target["__v_raw"]; - !isReadonly2 && track(toRaw(target), "iterate", ITERATE_KEY); - return Reflect.get(target, "size", target); -} -function add(value) { - value = toRaw(value); - const target = toRaw(this); - const proto = getProto(target); - const hadKey = proto.has.call(target, value); - if (!hadKey) { - target.add(value); - trigger(target, "add", value, value); - } - return this; -} -function set(key, value) { - value = toRaw(value); - const target = toRaw(this); - const { has: has2, get: get2 } = getProto(target); - let hadKey = has2.call(target, key); - if (!hadKey) { - key = toRaw(key); - hadKey = has2.call(target, key); - } else if (true) { - checkIdentityKeys(target, has2, key); - } - const oldValue = get2.call(target, key); - target.set(key, value); - if (!hadKey) { - trigger(target, "add", key, value); - } else if (hasChanged(value, oldValue)) { - trigger(target, "set", key, value, oldValue); - } - return this; -} -function deleteEntry(key) { - const target = toRaw(this); - const { has: has2, get: get2 } = getProto(target); - let hadKey = has2.call(target, key); - if (!hadKey) { - key = toRaw(key); - hadKey = has2.call(target, key); - } else if (true) { - checkIdentityKeys(target, has2, key); - } - const oldValue = get2 ? get2.call(target, key) : void 0; - const result = target.delete(key); - if (hadKey) { - trigger(target, "delete", key, void 0, oldValue); - } - return result; -} -function clear() { - const target = toRaw(this); - const hadItems = target.size !== 0; - const oldTarget = true ? isMap(target) ? new Map(target) : new Set(target) : void 0; - const result = target.clear(); - if (hadItems) { - trigger(target, "clear", void 0, void 0, oldTarget); - } - return result; -} -function createForEach(isReadonly2, isShallow3) { - return function forEach(callback, thisArg) { - const observed = this; - const target = observed["__v_raw"]; - const rawTarget = toRaw(target); - const wrap = isShallow3 ? toShallow : isReadonly2 ? toReadonly : toReactive; - !isReadonly2 && track(rawTarget, "iterate", ITERATE_KEY); - return target.forEach((value, key) => { - return callback.call(thisArg, wrap(value), wrap(key), observed); - }); - }; -} -function createIterableMethod(method, isReadonly2, isShallow3) { - return function(...args) { - const target = this["__v_raw"]; - const rawTarget = toRaw(target); - const targetIsMap = isMap(rawTarget); - const isPair = method === "entries" || method === Symbol.iterator && targetIsMap; - const isKeyOnly = method === "keys" && targetIsMap; - const innerIterator = target[method](...args); - const wrap = isShallow3 ? toShallow : isReadonly2 ? toReadonly : toReactive; - !isReadonly2 && track( - rawTarget, - "iterate", - isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY - ); - return { - // iterator protocol - next() { - const { value, done } = innerIterator.next(); - return done ? { value, done } : { - value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value), - done - }; - }, - // iterable protocol - [Symbol.iterator]() { - return this; - } - }; - }; -} -function createReadonlyMethod(type) { - return function(...args) { - if (true) { - const key = args[0] ? `on key "${args[0]}" ` : ``; - console.warn( - `${capitalize(type)} operation ${key}failed: target is readonly.`, - toRaw(this) - ); - } - return type === "delete" ? false : this; - }; -} -function createInstrumentations() { - const mutableInstrumentations2 = { - get(key) { - return get(this, key); - }, - get size() { - return size(this); - }, - has, - add, - set, - delete: deleteEntry, - clear, - forEach: createForEach(false, false) - }; - const shallowInstrumentations2 = { - get(key) { - return get(this, key, false, true); - }, - get size() { - return size(this); - }, - has, - add, - set, - delete: deleteEntry, - clear, - forEach: createForEach(false, true) - }; - const readonlyInstrumentations2 = { - get(key) { - return get(this, key, true); - }, - get size() { - return size(this, true); - }, - has(key) { - return has.call(this, key, true); - }, - add: createReadonlyMethod("add"), - set: createReadonlyMethod("set"), - delete: createReadonlyMethod("delete"), - clear: createReadonlyMethod("clear"), - forEach: createForEach(true, false) - }; - const shallowReadonlyInstrumentations2 = { - get(key) { - return get(this, key, true, true); - }, - get size() { - return size(this, true); - }, - has(key) { - return has.call(this, key, true); - }, - add: createReadonlyMethod("add"), - set: createReadonlyMethod("set"), - delete: createReadonlyMethod("delete"), - clear: createReadonlyMethod("clear"), - forEach: createForEach(true, true) - }; - const iteratorMethods = ["keys", "values", "entries", Symbol.iterator]; - iteratorMethods.forEach((method) => { - mutableInstrumentations2[method] = createIterableMethod( - method, - false, - false - ); - readonlyInstrumentations2[method] = createIterableMethod( - method, - true, - false - ); - shallowInstrumentations2[method] = createIterableMethod( - method, - false, - true - ); - shallowReadonlyInstrumentations2[method] = createIterableMethod( - method, - true, - true - ); - }); - return [ - mutableInstrumentations2, - readonlyInstrumentations2, - shallowInstrumentations2, - shallowReadonlyInstrumentations2 - ]; -} -var [ - mutableInstrumentations, - readonlyInstrumentations, - shallowInstrumentations, - shallowReadonlyInstrumentations -] = createInstrumentations(); -function createInstrumentationGetter(isReadonly2, shallow) { - const instrumentations = shallow ? isReadonly2 ? shallowReadonlyInstrumentations : shallowInstrumentations : isReadonly2 ? readonlyInstrumentations : mutableInstrumentations; - return (target, key, receiver) => { - if (key === "__v_isReactive") { - return !isReadonly2; - } else if (key === "__v_isReadonly") { - return isReadonly2; - } else if (key === "__v_raw") { - return target; - } - return Reflect.get( - hasOwn(instrumentations, key) && key in target ? instrumentations : target, - key, - receiver - ); - }; -} -var mutableCollectionHandlers = { - get: createInstrumentationGetter(false, false) -}; -var shallowCollectionHandlers = { - get: createInstrumentationGetter(false, true) -}; -var readonlyCollectionHandlers = { - get: createInstrumentationGetter(true, false) -}; -var shallowReadonlyCollectionHandlers = { - get: createInstrumentationGetter(true, true) -}; -function checkIdentityKeys(target, has2, key) { - const rawKey = toRaw(key); - if (rawKey !== key && has2.call(target, rawKey)) { - const type = toRawType(target); - console.warn( - `Reactive ${type} contains both the raw and reactive versions of the same object${type === `Map` ? ` as keys` : ``}, which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible.` - ); - } -} -var reactiveMap = /* @__PURE__ */ new WeakMap(); -var shallowReactiveMap = /* @__PURE__ */ new WeakMap(); -var readonlyMap = /* @__PURE__ */ new WeakMap(); -var shallowReadonlyMap = /* @__PURE__ */ new WeakMap(); -function targetTypeMap(rawType) { - switch (rawType) { - case "Object": - case "Array": - return 1; - case "Map": - case "Set": - case "WeakMap": - case "WeakSet": - return 2; - default: - return 0; - } -} -function getTargetType(value) { - return value["__v_skip"] || !Object.isExtensible(value) ? 0 : targetTypeMap(toRawType(value)); -} -function reactive(target) { - if (isReadonly(target)) { - return target; - } - return createReactiveObject( - target, - false, - mutableHandlers, - mutableCollectionHandlers, - reactiveMap - ); -} -function shallowReactive(target) { - return createReactiveObject( - target, - false, - shallowReactiveHandlers, - shallowCollectionHandlers, - shallowReactiveMap - ); -} -function readonly(target) { - return createReactiveObject( - target, - true, - readonlyHandlers, - readonlyCollectionHandlers, - readonlyMap - ); -} -function shallowReadonly(target) { - return createReactiveObject( - target, - true, - shallowReadonlyHandlers, - shallowReadonlyCollectionHandlers, - shallowReadonlyMap - ); -} -function createReactiveObject(target, isReadonly2, baseHandlers, collectionHandlers, proxyMap) { - if (!isObject(target)) { - if (true) { - console.warn(`value cannot be made reactive: ${String(target)}`); - } - return target; - } - if (target["__v_raw"] && !(isReadonly2 && target["__v_isReactive"])) { - return target; - } - const existingProxy = proxyMap.get(target); - if (existingProxy) { - return existingProxy; - } - const targetType = getTargetType(target); - if (targetType === 0) { - return target; - } - const proxy = new Proxy( - target, - targetType === 2 ? collectionHandlers : baseHandlers - ); - proxyMap.set(target, proxy); - return proxy; -} -function isReactive(value) { - if (isReadonly(value)) { - return isReactive(value["__v_raw"]); - } - return !!(value && value["__v_isReactive"]); -} -function isReadonly(value) { - return !!(value && value["__v_isReadonly"]); -} -function isShallow(value) { - return !!(value && value["__v_isShallow"]); -} -function isProxy(value) { - return isReactive(value) || isReadonly(value); -} -function toRaw(observed) { - const raw = observed && observed["__v_raw"]; - return raw ? toRaw(raw) : observed; -} -function markRaw(value) { - def(value, "__v_skip", true); - return value; -} -var toReactive = (value) => isObject(value) ? reactive(value) : value; -var toReadonly = (value) => isObject(value) ? readonly(value) : value; -function trackRefValue(ref2) { - if (shouldTrack && activeEffect) { - ref2 = toRaw(ref2); - if (true) { - trackEffects(ref2.dep || (ref2.dep = createDep()), { - target: ref2, - type: "get", - key: "value" - }); - } else { - trackEffects(ref2.dep || (ref2.dep = createDep())); - } - } -} -function triggerRefValue(ref2, newVal) { - ref2 = toRaw(ref2); - const dep = ref2.dep; - if (dep) { - if (true) { - triggerEffects(dep, { - target: ref2, - type: "set", - key: "value", - newValue: newVal - }); - } else { - triggerEffects(dep); - } - } -} -function isRef(r) { - return !!(r && r.__v_isRef === true); -} -function ref(value) { - return createRef(value, false); -} -function shallowRef(value) { - return createRef(value, true); -} -function createRef(rawValue, shallow) { - if (isRef(rawValue)) { - return rawValue; - } - return new RefImpl(rawValue, shallow); -} -var RefImpl = class { - constructor(value, __v_isShallow) { - this.__v_isShallow = __v_isShallow; - this.dep = void 0; - this.__v_isRef = true; - this._rawValue = __v_isShallow ? value : toRaw(value); - this._value = __v_isShallow ? value : toReactive(value); - } - get value() { - trackRefValue(this); - return this._value; - } - set value(newVal) { - const useDirectValue = this.__v_isShallow || isShallow(newVal) || isReadonly(newVal); - newVal = useDirectValue ? newVal : toRaw(newVal); - if (hasChanged(newVal, this._rawValue)) { - this._rawValue = newVal; - this._value = useDirectValue ? newVal : toReactive(newVal); - triggerRefValue(this, newVal); - } - } -}; -function triggerRef(ref2) { - triggerRefValue(ref2, true ? ref2.value : void 0); -} -function unref(ref2) { - return isRef(ref2) ? ref2.value : ref2; -} -function toValue(source) { - return isFunction(source) ? source() : unref(source); -} -var shallowUnwrapHandlers = { - get: (target, key, receiver) => unref(Reflect.get(target, key, receiver)), - set: (target, key, value, receiver) => { - const oldValue = target[key]; - if (isRef(oldValue) && !isRef(value)) { - oldValue.value = value; - return true; - } else { - return Reflect.set(target, key, value, receiver); - } - } -}; -function proxyRefs(objectWithRefs) { - return isReactive(objectWithRefs) ? objectWithRefs : new Proxy(objectWithRefs, shallowUnwrapHandlers); -} -var CustomRefImpl = class { - constructor(factory) { - this.dep = void 0; - this.__v_isRef = true; - const { get: get2, set: set2 } = factory( - () => trackRefValue(this), - () => triggerRefValue(this) - ); - this._get = get2; - this._set = set2; - } - get value() { - return this._get(); - } - set value(newVal) { - this._set(newVal); - } -}; -function customRef(factory) { - return new CustomRefImpl(factory); -} -function toRefs(object) { - if (!isProxy(object)) { - console.warn(`toRefs() expects a reactive object but received a plain one.`); - } - const ret = isArray(object) ? new Array(object.length) : {}; - for (const key in object) { - ret[key] = propertyToRef(object, key); - } - return ret; -} -var ObjectRefImpl = class { - constructor(_object, _key, _defaultValue) { - this._object = _object; - this._key = _key; - this._defaultValue = _defaultValue; - this.__v_isRef = true; - } - get value() { - const val = this._object[this._key]; - return val === void 0 ? this._defaultValue : val; - } - set value(newVal) { - this._object[this._key] = newVal; - } - get dep() { - return getDepFromReactive(toRaw(this._object), this._key); - } -}; -var GetterRefImpl = class { - constructor(_getter) { - this._getter = _getter; - this.__v_isRef = true; - this.__v_isReadonly = true; - } - get value() { - return this._getter(); - } -}; -function toRef(source, key, defaultValue) { - if (isRef(source)) { - return source; - } else if (isFunction(source)) { - return new GetterRefImpl(source); - } else if (isObject(source) && arguments.length > 1) { - return propertyToRef(source, key, defaultValue); - } else { - return ref(source); - } -} -function propertyToRef(source, key, defaultValue) { - const val = source[key]; - return isRef(val) ? val : new ObjectRefImpl( - source, - key, - defaultValue - ); -} -var ComputedRefImpl = class { - constructor(getter, _setter, isReadonly2, isSSR) { - this._setter = _setter; - this.dep = void 0; - this.__v_isRef = true; - this["__v_isReadonly"] = false; - this._dirty = true; - this.effect = new ReactiveEffect(getter, () => { - if (!this._dirty) { - this._dirty = true; - triggerRefValue(this); - } - }); - this.effect.computed = this; - this.effect.active = this._cacheable = !isSSR; - this["__v_isReadonly"] = isReadonly2; - } - get value() { - const self2 = toRaw(this); - trackRefValue(self2); - if (self2._dirty || !self2._cacheable) { - self2._dirty = false; - self2._value = self2.effect.run(); - } - return self2._value; - } - set value(newValue) { - this._setter(newValue); - } -}; -function computed(getterOrOptions, debugOptions, isSSR = false) { - let getter; - let setter; - const onlyGetter = isFunction(getterOrOptions); - if (onlyGetter) { - getter = getterOrOptions; - setter = true ? () => { - console.warn("Write operation failed: computed value is readonly"); - } : NOOP; - } else { - getter = getterOrOptions.get; - setter = getterOrOptions.set; - } - const cRef = new ComputedRefImpl(getter, setter, onlyGetter || !setter, isSSR); - if (debugOptions && !isSSR) { - cRef.effect.onTrack = debugOptions.onTrack; - cRef.effect.onTrigger = debugOptions.onTrigger; - } - return cRef; -} -var tick = Promise.resolve(); - -// ../node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js -var stack = []; -function pushWarningContext(vnode) { - stack.push(vnode); -} -function popWarningContext() { - stack.pop(); -} -function warn2(msg, ...args) { - if (false) - return; - pauseTracking(); - const instance = stack.length ? stack[stack.length - 1].component : null; - const appWarnHandler = instance && instance.appContext.config.warnHandler; - const trace = getComponentTrace(); - if (appWarnHandler) { - callWithErrorHandling( - appWarnHandler, - instance, - 11, - [ - msg + args.join(""), - instance && instance.proxy, - trace.map( - ({ vnode }) => `at <${formatComponentName(instance, vnode.type)}>` - ).join("\n"), - trace - ] - ); - } else { - const warnArgs = [`[Vue warn]: ${msg}`, ...args]; - if (trace.length && // avoid spamming console during tests - true) { - warnArgs.push(` -`, ...formatTrace(trace)); - } - console.warn(...warnArgs); - } - resetTracking(); -} -function getComponentTrace() { - let currentVNode = stack[stack.length - 1]; - if (!currentVNode) { - return []; - } - const normalizedStack = []; - while (currentVNode) { - const last = normalizedStack[0]; - if (last && last.vnode === currentVNode) { - last.recurseCount++; - } else { - normalizedStack.push({ - vnode: currentVNode, - recurseCount: 0 - }); - } - const parentInstance = currentVNode.component && currentVNode.component.parent; - currentVNode = parentInstance && parentInstance.vnode; - } - return normalizedStack; -} -function formatTrace(trace) { - const logs = []; - trace.forEach((entry, i) => { - logs.push(...i === 0 ? [] : [` -`], ...formatTraceEntry(entry)); - }); - return logs; -} -function formatTraceEntry({ vnode, recurseCount }) { - const postfix = recurseCount > 0 ? `... (${recurseCount} recursive calls)` : ``; - const isRoot = vnode.component ? vnode.component.parent == null : false; - const open = ` at <${formatComponentName( - vnode.component, - vnode.type, - isRoot - )}`; - const close = `>` + postfix; - return vnode.props ? [open, ...formatProps(vnode.props), close] : [open + close]; -} -function formatProps(props) { - const res = []; - const keys = Object.keys(props); - keys.slice(0, 3).forEach((key) => { - res.push(...formatProp(key, props[key])); - }); - if (keys.length > 3) { - res.push(` ...`); - } - return res; -} -function formatProp(key, value, raw) { - if (isString(value)) { - value = JSON.stringify(value); - return raw ? value : [`${key}=${value}`]; - } else if (typeof value === "number" || typeof value === "boolean" || value == null) { - return raw ? value : [`${key}=${value}`]; - } else if (isRef(value)) { - value = formatProp(key, toRaw(value.value), true); - return raw ? value : [`${key}=Ref<`, value, `>`]; - } else if (isFunction(value)) { - return [`${key}=fn${value.name ? `<${value.name}>` : ``}`]; - } else { - value = toRaw(value); - return raw ? value : [`${key}=`, value]; - } -} -function assertNumber(val, type) { - if (false) - return; - if (val === void 0) { - return; - } else if (typeof val !== "number") { - warn2(`${type} is not a valid number - got ${JSON.stringify(val)}.`); - } else if (isNaN(val)) { - warn2(`${type} is NaN - the duration expression might be incorrect.`); - } -} -var ErrorTypeStrings = { - ["sp"]: "serverPrefetch hook", - ["bc"]: "beforeCreate hook", - ["c"]: "created hook", - ["bm"]: "beforeMount hook", - ["m"]: "mounted hook", - ["bu"]: "beforeUpdate hook", - ["u"]: "updated", - ["bum"]: "beforeUnmount hook", - ["um"]: "unmounted hook", - ["a"]: "activated hook", - ["da"]: "deactivated hook", - ["ec"]: "errorCaptured hook", - ["rtc"]: "renderTracked hook", - ["rtg"]: "renderTriggered hook", - [0]: "setup function", - [1]: "render function", - [2]: "watcher getter", - [3]: "watcher callback", - [4]: "watcher cleanup function", - [5]: "native event handler", - [6]: "component event handler", - [7]: "vnode hook", - [8]: "directive hook", - [9]: "transition hook", - [10]: "app errorHandler", - [11]: "app warnHandler", - [12]: "ref function", - [13]: "async component loader", - [14]: "scheduler flush. This is likely a Vue internals bug. Please open an issue at https://new-issue.vuejs.org/?repo=vuejs/core" -}; -function callWithErrorHandling(fn, instance, type, args) { - let res; - try { - res = args ? fn(...args) : fn(); - } catch (err) { - handleError(err, instance, type); - } - return res; -} -function callWithAsyncErrorHandling(fn, instance, type, args) { - if (isFunction(fn)) { - const res = callWithErrorHandling(fn, instance, type, args); - if (res && isPromise(res)) { - res.catch((err) => { - handleError(err, instance, type); - }); - } - return res; - } - const values = []; - for (let i = 0; i < fn.length; i++) { - values.push(callWithAsyncErrorHandling(fn[i], instance, type, args)); - } - return values; -} -function handleError(err, instance, type, throwInDev = true) { - const contextVNode = instance ? instance.vnode : null; - if (instance) { - let cur = instance.parent; - const exposedInstance = instance.proxy; - const errorInfo = true ? ErrorTypeStrings[type] : type; - while (cur) { - const errorCapturedHooks = cur.ec; - if (errorCapturedHooks) { - for (let i = 0; i < errorCapturedHooks.length; i++) { - if (errorCapturedHooks[i](err, exposedInstance, errorInfo) === false) { - return; - } - } - } - cur = cur.parent; - } - const appErrorHandler = instance.appContext.config.errorHandler; - if (appErrorHandler) { - callWithErrorHandling( - appErrorHandler, - null, - 10, - [err, exposedInstance, errorInfo] - ); - return; - } - } - logError(err, type, contextVNode, throwInDev); -} -function logError(err, type, contextVNode, throwInDev = true) { - if (true) { - const info = ErrorTypeStrings[type]; - if (contextVNode) { - pushWarningContext(contextVNode); - } - warn2(`Unhandled error${info ? ` during execution of ${info}` : ``}`); - if (contextVNode) { - popWarningContext(); - } - if (throwInDev) { - throw err; - } else { - console.error(err); - } - } else { - console.error(err); - } -} -var isFlushing = false; -var isFlushPending = false; -var queue = []; -var flushIndex = 0; -var pendingPostFlushCbs = []; -var activePostFlushCbs = null; -var postFlushIndex = 0; -var resolvedPromise = Promise.resolve(); -var currentFlushPromise = null; -var RECURSION_LIMIT = 100; -function nextTick(fn) { - const p2 = currentFlushPromise || resolvedPromise; - return fn ? p2.then(this ? fn.bind(this) : fn) : p2; -} -function findInsertionIndex(id) { - let start = flushIndex + 1; - let end = queue.length; - while (start < end) { - const middle = start + end >>> 1; - const middleJobId = getId(queue[middle]); - middleJobId < id ? start = middle + 1 : end = middle; - } - return start; -} -function queueJob(job) { - if (!queue.length || !queue.includes( - job, - isFlushing && job.allowRecurse ? flushIndex + 1 : flushIndex - )) { - if (job.id == null) { - queue.push(job); - } else { - queue.splice(findInsertionIndex(job.id), 0, job); - } - queueFlush(); - } -} -function queueFlush() { - if (!isFlushing && !isFlushPending) { - isFlushPending = true; - currentFlushPromise = resolvedPromise.then(flushJobs); - } -} -function invalidateJob(job) { - const i = queue.indexOf(job); - if (i > flushIndex) { - queue.splice(i, 1); - } -} -function queuePostFlushCb(cb) { - if (!isArray(cb)) { - if (!activePostFlushCbs || !activePostFlushCbs.includes( - cb, - cb.allowRecurse ? postFlushIndex + 1 : postFlushIndex - )) { - pendingPostFlushCbs.push(cb); - } - } else { - pendingPostFlushCbs.push(...cb); - } - queueFlush(); -} -function flushPreFlushCbs(seen, i = isFlushing ? flushIndex + 1 : 0) { - if (true) { - seen = seen || /* @__PURE__ */ new Map(); - } - for (; i < queue.length; i++) { - const cb = queue[i]; - if (cb && cb.pre) { - if (checkRecursiveUpdates(seen, cb)) { - continue; - } - queue.splice(i, 1); - i--; - cb(); - } - } -} -function flushPostFlushCbs(seen) { - if (pendingPostFlushCbs.length) { - const deduped = [...new Set(pendingPostFlushCbs)]; - pendingPostFlushCbs.length = 0; - if (activePostFlushCbs) { - activePostFlushCbs.push(...deduped); - return; - } - activePostFlushCbs = deduped; - if (true) { - seen = seen || /* @__PURE__ */ new Map(); - } - activePostFlushCbs.sort((a, b) => getId(a) - getId(b)); - for (postFlushIndex = 0; postFlushIndex < activePostFlushCbs.length; postFlushIndex++) { - if (checkRecursiveUpdates(seen, activePostFlushCbs[postFlushIndex])) { - continue; - } - activePostFlushCbs[postFlushIndex](); - } - activePostFlushCbs = null; - postFlushIndex = 0; - } -} -var getId = (job) => job.id == null ? Infinity : job.id; -var comparator = (a, b) => { - const diff = getId(a) - getId(b); - if (diff === 0) { - if (a.pre && !b.pre) - return -1; - if (b.pre && !a.pre) - return 1; - } - return diff; -}; -function flushJobs(seen) { - isFlushPending = false; - isFlushing = true; - if (true) { - seen = seen || /* @__PURE__ */ new Map(); - } - queue.sort(comparator); - const check = true ? (job) => checkRecursiveUpdates(seen, job) : NOOP; - try { - for (flushIndex = 0; flushIndex < queue.length; flushIndex++) { - const job = queue[flushIndex]; - if (job && job.active !== false) { - if (check(job)) { - continue; - } - callWithErrorHandling(job, null, 14); - } - } - } finally { - flushIndex = 0; - queue.length = 0; - flushPostFlushCbs(seen); - isFlushing = false; - currentFlushPromise = null; - if (queue.length || pendingPostFlushCbs.length) { - flushJobs(seen); - } - } -} -function checkRecursiveUpdates(seen, fn) { - if (!seen.has(fn)) { - seen.set(fn, 1); - } else { - const count = seen.get(fn); - if (count > RECURSION_LIMIT) { - const instance = fn.ownerInstance; - const componentName = instance && getComponentName(instance.type); - warn2( - `Maximum recursive updates exceeded${componentName ? ` in component <${componentName}>` : ``}. This means you have a reactive effect that is mutating its own dependencies and thus recursively triggering itself. Possible sources include component template, render function, updated hook or watcher source function.` - ); - return true; - } else { - seen.set(fn, count + 1); - } - } -} -var isHmrUpdating = false; -var hmrDirtyComponents = /* @__PURE__ */ new Set(); -if (true) { - getGlobalThis().__VUE_HMR_RUNTIME__ = { - createRecord: tryWrap(createRecord), - rerender: tryWrap(rerender), - reload: tryWrap(reload) - }; -} -var map = /* @__PURE__ */ new Map(); -function registerHMR(instance) { - const id = instance.type.__hmrId; - let record = map.get(id); - if (!record) { - createRecord(id, instance.type); - record = map.get(id); - } - record.instances.add(instance); -} -function unregisterHMR(instance) { - map.get(instance.type.__hmrId).instances.delete(instance); -} -function createRecord(id, initialDef) { - if (map.has(id)) { - return false; - } - map.set(id, { - initialDef: normalizeClassComponent(initialDef), - instances: /* @__PURE__ */ new Set() - }); - return true; -} -function normalizeClassComponent(component) { - return isClassComponent(component) ? component.__vccOpts : component; -} -function rerender(id, newRender) { - const record = map.get(id); - if (!record) { - return; - } - record.initialDef.render = newRender; - [...record.instances].forEach((instance) => { - if (newRender) { - instance.render = newRender; - normalizeClassComponent(instance.type).render = newRender; - } - instance.renderCache = []; - isHmrUpdating = true; - instance.update(); - isHmrUpdating = false; - }); -} -function reload(id, newComp) { - const record = map.get(id); - if (!record) - return; - newComp = normalizeClassComponent(newComp); - updateComponentDef(record.initialDef, newComp); - const instances = [...record.instances]; - for (const instance of instances) { - const oldComp = normalizeClassComponent(instance.type); - if (!hmrDirtyComponents.has(oldComp)) { - if (oldComp !== record.initialDef) { - updateComponentDef(oldComp, newComp); - } - hmrDirtyComponents.add(oldComp); - } - instance.appContext.propsCache.delete(instance.type); - instance.appContext.emitsCache.delete(instance.type); - instance.appContext.optionsCache.delete(instance.type); - if (instance.ceReload) { - hmrDirtyComponents.add(oldComp); - instance.ceReload(newComp.styles); - hmrDirtyComponents.delete(oldComp); - } else if (instance.parent) { - queueJob(instance.parent.update); - } else if (instance.appContext.reload) { - instance.appContext.reload(); - } else if (typeof window !== "undefined") { - window.location.reload(); - } else { - console.warn( - "[HMR] Root or manually mounted instance modified. Full reload required." - ); - } - } - queuePostFlushCb(() => { - for (const instance of instances) { - hmrDirtyComponents.delete( - normalizeClassComponent(instance.type) - ); - } - }); -} -function updateComponentDef(oldComp, newComp) { - extend(oldComp, newComp); - for (const key in oldComp) { - if (key !== "__file" && !(key in newComp)) { - delete oldComp[key]; - } - } -} -function tryWrap(fn) { - return (id, arg) => { - try { - return fn(id, arg); - } catch (e) { - console.error(e); - console.warn( - `[HMR] Something went wrong during Vue component hot-reload. Full reload required.` - ); - } - }; -} -var devtools; -var buffer = []; -var devtoolsNotInstalled = false; -function emit$1(event, ...args) { - if (devtools) { - devtools.emit(event, ...args); - } else if (!devtoolsNotInstalled) { - buffer.push({ event, args }); - } -} -function setDevtoolsHook(hook, target) { - var _a, _b; - devtools = hook; - if (devtools) { - devtools.enabled = true; - buffer.forEach(({ event, args }) => devtools.emit(event, ...args)); - buffer = []; - } else if ( - // handle late devtools injection - only do this if we are in an actual - // browser environment to avoid the timer handle stalling test runner exit - // (#4815) - typeof window !== "undefined" && // some envs mock window but not fully - window.HTMLElement && // also exclude jsdom - !((_b = (_a = window.navigator) == null ? void 0 : _a.userAgent) == null ? void 0 : _b.includes("jsdom")) - ) { - const replay = target.__VUE_DEVTOOLS_HOOK_REPLAY__ = target.__VUE_DEVTOOLS_HOOK_REPLAY__ || []; - replay.push((newHook) => { - setDevtoolsHook(newHook, target); - }); - setTimeout(() => { - if (!devtools) { - target.__VUE_DEVTOOLS_HOOK_REPLAY__ = null; - devtoolsNotInstalled = true; - buffer = []; - } - }, 3e3); - } else { - devtoolsNotInstalled = true; - buffer = []; - } -} -function devtoolsInitApp(app, version2) { - emit$1("app:init", app, version2, { - Fragment, - Text, - Comment, - Static - }); -} -function devtoolsUnmountApp(app) { - emit$1("app:unmount", app); -} -var devtoolsComponentAdded = createDevtoolsComponentHook( - "component:added" - /* COMPONENT_ADDED */ -); -var devtoolsComponentUpdated = createDevtoolsComponentHook( - "component:updated" - /* COMPONENT_UPDATED */ -); -var _devtoolsComponentRemoved = createDevtoolsComponentHook( - "component:removed" - /* COMPONENT_REMOVED */ -); -var devtoolsComponentRemoved = (component) => { - if (devtools && typeof devtools.cleanupBuffer === "function" && // remove the component if it wasn't buffered - !devtools.cleanupBuffer(component)) { - _devtoolsComponentRemoved(component); - } -}; -function createDevtoolsComponentHook(hook) { - return (component) => { - emit$1( - hook, - component.appContext.app, - component.uid, - component.parent ? component.parent.uid : void 0, - component - ); - }; -} -var devtoolsPerfStart = createDevtoolsPerformanceHook( - "perf:start" - /* PERFORMANCE_START */ -); -var devtoolsPerfEnd = createDevtoolsPerformanceHook( - "perf:end" - /* PERFORMANCE_END */ -); -function createDevtoolsPerformanceHook(hook) { - return (component, type, time) => { - emit$1(hook, component.appContext.app, component.uid, component, type, time); - }; -} -function devtoolsComponentEmit(component, event, params) { - emit$1( - "component:emit", - component.appContext.app, - component, - event, - params - ); -} -function emit(instance, event, ...rawArgs) { - if (instance.isUnmounted) - return; - const props = instance.vnode.props || EMPTY_OBJ; - if (true) { - const { - emitsOptions, - propsOptions: [propsOptions] - } = instance; - if (emitsOptions) { - if (!(event in emitsOptions) && true) { - if (!propsOptions || !(toHandlerKey(event) in propsOptions)) { - warn2( - `Component emitted event "${event}" but it is neither declared in the emits option nor as an "${toHandlerKey(event)}" prop.` - ); - } - } else { - const validator = emitsOptions[event]; - if (isFunction(validator)) { - const isValid = validator(...rawArgs); - if (!isValid) { - warn2( - `Invalid event arguments: event validation failed for event "${event}".` - ); - } - } - } - } - } - let args = rawArgs; - const isModelListener2 = event.startsWith("update:"); - const modelArg = isModelListener2 && event.slice(7); - if (modelArg && modelArg in props) { - const modifiersKey = `${modelArg === "modelValue" ? "model" : modelArg}Modifiers`; - const { number, trim } = props[modifiersKey] || EMPTY_OBJ; - if (trim) { - args = rawArgs.map((a) => isString(a) ? a.trim() : a); - } - if (number) { - args = rawArgs.map(looseToNumber); - } - } - if (true) { - devtoolsComponentEmit(instance, event, args); - } - if (true) { - const lowerCaseEvent = event.toLowerCase(); - if (lowerCaseEvent !== event && props[toHandlerKey(lowerCaseEvent)]) { - warn2( - `Event "${lowerCaseEvent}" is emitted in component ${formatComponentName( - instance, - instance.type - )} but the handler is registered for "${event}". Note that HTML attributes are case-insensitive and you cannot use v-on to listen to camelCase events when using in-DOM templates. You should probably use "${hyphenate(event)}" instead of "${event}".` - ); - } - } - let handlerName; - let handler = props[handlerName = toHandlerKey(event)] || // also try camelCase event handler (#2249) - props[handlerName = toHandlerKey(camelize(event))]; - if (!handler && isModelListener2) { - handler = props[handlerName = toHandlerKey(hyphenate(event))]; - } - if (handler) { - callWithAsyncErrorHandling( - handler, - instance, - 6, - args - ); - } - const onceHandler = props[handlerName + `Once`]; - if (onceHandler) { - if (!instance.emitted) { - instance.emitted = {}; - } else if (instance.emitted[handlerName]) { - return; - } - instance.emitted[handlerName] = true; - callWithAsyncErrorHandling( - onceHandler, - instance, - 6, - args - ); - } -} -function normalizeEmitsOptions(comp, appContext, asMixin = false) { - const cache = appContext.emitsCache; - const cached = cache.get(comp); - if (cached !== void 0) { - return cached; - } - const raw = comp.emits; - let normalized = {}; - let hasExtends = false; - if (__VUE_OPTIONS_API__ && !isFunction(comp)) { - const extendEmits = (raw2) => { - const normalizedFromExtend = normalizeEmitsOptions(raw2, appContext, true); - if (normalizedFromExtend) { - hasExtends = true; - extend(normalized, normalizedFromExtend); - } - }; - if (!asMixin && appContext.mixins.length) { - appContext.mixins.forEach(extendEmits); - } - if (comp.extends) { - extendEmits(comp.extends); - } - if (comp.mixins) { - comp.mixins.forEach(extendEmits); - } - } - if (!raw && !hasExtends) { - if (isObject(comp)) { - cache.set(comp, null); - } - return null; - } - if (isArray(raw)) { - raw.forEach((key) => normalized[key] = null); - } else { - extend(normalized, raw); - } - if (isObject(comp)) { - cache.set(comp, normalized); - } - return normalized; -} -function isEmitListener(options, key) { - if (!options || !isOn(key)) { - return false; - } - key = key.slice(2).replace(/Once$/, ""); - return hasOwn(options, key[0].toLowerCase() + key.slice(1)) || hasOwn(options, hyphenate(key)) || hasOwn(options, key); -} -var currentRenderingInstance = null; -var currentScopeId = null; -function setCurrentRenderingInstance(instance) { - const prev = currentRenderingInstance; - currentRenderingInstance = instance; - currentScopeId = instance && instance.type.__scopeId || null; - return prev; -} -function pushScopeId(id) { - currentScopeId = id; -} -function popScopeId() { - currentScopeId = null; -} -var withScopeId = (_id) => withCtx; -function withCtx(fn, ctx = currentRenderingInstance, isNonScopedSlot) { - if (!ctx) - return fn; - if (fn._n) { - return fn; - } - const renderFnWithContext = (...args) => { - if (renderFnWithContext._d) { - setBlockTracking(-1); - } - const prevInstance = setCurrentRenderingInstance(ctx); - let res; - try { - res = fn(...args); - } finally { - setCurrentRenderingInstance(prevInstance); - if (renderFnWithContext._d) { - setBlockTracking(1); - } - } - if (true) { - devtoolsComponentUpdated(ctx); - } - return res; - }; - renderFnWithContext._n = true; - renderFnWithContext._c = true; - renderFnWithContext._d = true; - return renderFnWithContext; -} -var accessedAttrs = false; -function markAttrsAccessed() { - accessedAttrs = true; -} -function renderComponentRoot(instance) { - const { - type: Component, - vnode, - proxy, - withProxy, - props, - propsOptions: [propsOptions], - slots, - attrs, - emit: emit2, - render: render2, - renderCache, - data, - setupState, - ctx, - inheritAttrs - } = instance; - let result; - let fallthroughAttrs; - const prev = setCurrentRenderingInstance(instance); - if (true) { - accessedAttrs = false; - } - try { - if (vnode.shapeFlag & 4) { - const proxyToUse = withProxy || proxy; - result = normalizeVNode( - render2.call( - proxyToUse, - proxyToUse, - renderCache, - props, - setupState, - data, - ctx - ) - ); - fallthroughAttrs = attrs; - } else { - const render22 = Component; - if (attrs === props) { - markAttrsAccessed(); - } - result = normalizeVNode( - render22.length > 1 ? render22( - props, - true ? { - get attrs() { - markAttrsAccessed(); - return attrs; - }, - slots, - emit: emit2 - } : { attrs, slots, emit: emit2 } - ) : render22( - props, - null - /* we know it doesn't need it */ - ) - ); - fallthroughAttrs = Component.props ? attrs : getFunctionalFallthrough(attrs); - } - } catch (err) { - blockStack.length = 0; - handleError(err, instance, 1); - result = createVNode(Comment); - } - let root = result; - let setRoot = void 0; - if (result.patchFlag > 0 && result.patchFlag & 2048) { - [root, setRoot] = getChildRoot(result); - } - if (fallthroughAttrs && inheritAttrs !== false) { - const keys = Object.keys(fallthroughAttrs); - const { shapeFlag } = root; - if (keys.length) { - if (shapeFlag & (1 | 6)) { - if (propsOptions && keys.some(isModelListener)) { - fallthroughAttrs = filterModelListeners( - fallthroughAttrs, - propsOptions - ); - } - root = cloneVNode(root, fallthroughAttrs); - } else if (!accessedAttrs && root.type !== Comment) { - const allAttrs = Object.keys(attrs); - const eventAttrs = []; - const extraAttrs = []; - for (let i = 0, l = allAttrs.length; i < l; i++) { - const key = allAttrs[i]; - if (isOn(key)) { - if (!isModelListener(key)) { - eventAttrs.push(key[2].toLowerCase() + key.slice(3)); - } - } else { - extraAttrs.push(key); - } - } - if (extraAttrs.length) { - warn2( - `Extraneous non-props attributes (${extraAttrs.join(", ")}) were passed to component but could not be automatically inherited because component renders fragment or text root nodes.` - ); - } - if (eventAttrs.length) { - warn2( - `Extraneous non-emits event listeners (${eventAttrs.join(", ")}) were passed to component but could not be automatically inherited because component renders fragment or text root nodes. If the listener is intended to be a component custom event listener only, declare it using the "emits" option.` - ); - } - } - } - } - if (vnode.dirs) { - if (!isElementRoot(root)) { - warn2( - `Runtime directive used on component with non-element root node. The directives will not function as intended.` - ); - } - root = cloneVNode(root); - root.dirs = root.dirs ? root.dirs.concat(vnode.dirs) : vnode.dirs; - } - if (vnode.transition) { - if (!isElementRoot(root)) { - warn2( - `Component inside renders non-element root node that cannot be animated.` - ); - } - root.transition = vnode.transition; - } - if (setRoot) { - setRoot(root); - } else { - result = root; - } - setCurrentRenderingInstance(prev); - return result; -} -var getChildRoot = (vnode) => { - const rawChildren = vnode.children; - const dynamicChildren = vnode.dynamicChildren; - const childRoot = filterSingleRoot(rawChildren); - if (!childRoot) { - return [vnode, void 0]; - } - const index = rawChildren.indexOf(childRoot); - const dynamicIndex = dynamicChildren ? dynamicChildren.indexOf(childRoot) : -1; - const setRoot = (updatedRoot) => { - rawChildren[index] = updatedRoot; - if (dynamicChildren) { - if (dynamicIndex > -1) { - dynamicChildren[dynamicIndex] = updatedRoot; - } else if (updatedRoot.patchFlag > 0) { - vnode.dynamicChildren = [...dynamicChildren, updatedRoot]; - } - } - }; - return [normalizeVNode(childRoot), setRoot]; -}; -function filterSingleRoot(children) { - let singleRoot; - for (let i = 0; i < children.length; i++) { - const child = children[i]; - if (isVNode(child)) { - if (child.type !== Comment || child.children === "v-if") { - if (singleRoot) { - return; - } else { - singleRoot = child; - } - } - } else { - return; - } - } - return singleRoot; -} -var getFunctionalFallthrough = (attrs) => { - let res; - for (const key in attrs) { - if (key === "class" || key === "style" || isOn(key)) { - (res || (res = {}))[key] = attrs[key]; - } - } - return res; -}; -var filterModelListeners = (attrs, props) => { - const res = {}; - for (const key in attrs) { - if (!isModelListener(key) || !(key.slice(9) in props)) { - res[key] = attrs[key]; - } - } - return res; -}; -var isElementRoot = (vnode) => { - return vnode.shapeFlag & (6 | 1) || vnode.type === Comment; -}; -function shouldUpdateComponent(prevVNode, nextVNode, optimized) { - const { props: prevProps, children: prevChildren, component } = prevVNode; - const { props: nextProps, children: nextChildren, patchFlag } = nextVNode; - const emits = component.emitsOptions; - if ((prevChildren || nextChildren) && isHmrUpdating) { - return true; - } - if (nextVNode.dirs || nextVNode.transition) { - return true; - } - if (optimized && patchFlag >= 0) { - if (patchFlag & 1024) { - return true; - } - if (patchFlag & 16) { - if (!prevProps) { - return !!nextProps; - } - return hasPropsChanged(prevProps, nextProps, emits); - } else if (patchFlag & 8) { - const dynamicProps = nextVNode.dynamicProps; - for (let i = 0; i < dynamicProps.length; i++) { - const key = dynamicProps[i]; - if (nextProps[key] !== prevProps[key] && !isEmitListener(emits, key)) { - return true; - } - } - } - } else { - if (prevChildren || nextChildren) { - if (!nextChildren || !nextChildren.$stable) { - return true; - } - } - if (prevProps === nextProps) { - return false; - } - if (!prevProps) { - return !!nextProps; - } - if (!nextProps) { - return true; - } - return hasPropsChanged(prevProps, nextProps, emits); - } - return false; -} -function hasPropsChanged(prevProps, nextProps, emitsOptions) { - const nextKeys = Object.keys(nextProps); - if (nextKeys.length !== Object.keys(prevProps).length) { - return true; - } - for (let i = 0; i < nextKeys.length; i++) { - const key = nextKeys[i]; - if (nextProps[key] !== prevProps[key] && !isEmitListener(emitsOptions, key)) { - return true; - } - } - return false; -} -function updateHOCHostEl({ vnode, parent }, el) { - while (parent && parent.subTree === vnode) { - (vnode = parent.vnode).el = el; - parent = parent.parent; - } -} -var isSuspense = (type) => type.__isSuspense; -var SuspenseImpl = { - name: "Suspense", - // In order to make Suspense tree-shakable, we need to avoid importing it - // directly in the renderer. The renderer checks for the __isSuspense flag - // on a vnode's type and calls the `process` method, passing in renderer - // internals. - __isSuspense: true, - process(n1, n2, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized, rendererInternals) { - if (n1 == null) { - mountSuspense( - n2, - container, - anchor, - parentComponent, - parentSuspense, - isSVG, - slotScopeIds, - optimized, - rendererInternals - ); - } else { - patchSuspense( - n1, - n2, - container, - anchor, - parentComponent, - isSVG, - slotScopeIds, - optimized, - rendererInternals - ); - } - }, - hydrate: hydrateSuspense, - create: createSuspenseBoundary, - normalize: normalizeSuspenseChildren -}; -var Suspense = SuspenseImpl; -function triggerEvent(vnode, name) { - const eventListener = vnode.props && vnode.props[name]; - if (isFunction(eventListener)) { - eventListener(); - } -} -function mountSuspense(vnode, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized, rendererInternals) { - const { - p: patch, - o: { createElement } - } = rendererInternals; - const hiddenContainer = createElement("div"); - const suspense = vnode.suspense = createSuspenseBoundary( - vnode, - parentSuspense, - parentComponent, - container, - hiddenContainer, - anchor, - isSVG, - slotScopeIds, - optimized, - rendererInternals - ); - patch( - null, - suspense.pendingBranch = vnode.ssContent, - hiddenContainer, - null, - parentComponent, - suspense, - isSVG, - slotScopeIds - ); - if (suspense.deps > 0) { - triggerEvent(vnode, "onPending"); - triggerEvent(vnode, "onFallback"); - patch( - null, - vnode.ssFallback, - container, - anchor, - parentComponent, - null, - // fallback tree will not have suspense context - isSVG, - slotScopeIds - ); - setActiveBranch(suspense, vnode.ssFallback); - } else { - suspense.resolve(false, true); - } -} -function patchSuspense(n1, n2, container, anchor, parentComponent, isSVG, slotScopeIds, optimized, { p: patch, um: unmount, o: { createElement } }) { - const suspense = n2.suspense = n1.suspense; - suspense.vnode = n2; - n2.el = n1.el; - const newBranch = n2.ssContent; - const newFallback = n2.ssFallback; - const { activeBranch, pendingBranch, isInFallback, isHydrating } = suspense; - if (pendingBranch) { - suspense.pendingBranch = newBranch; - if (isSameVNodeType(newBranch, pendingBranch)) { - patch( - pendingBranch, - newBranch, - suspense.hiddenContainer, - null, - parentComponent, - suspense, - isSVG, - slotScopeIds, - optimized - ); - if (suspense.deps <= 0) { - suspense.resolve(); - } else if (isInFallback) { - patch( - activeBranch, - newFallback, - container, - anchor, - parentComponent, - null, - // fallback tree will not have suspense context - isSVG, - slotScopeIds, - optimized - ); - setActiveBranch(suspense, newFallback); - } - } else { - suspense.pendingId++; - if (isHydrating) { - suspense.isHydrating = false; - suspense.activeBranch = pendingBranch; - } else { - unmount(pendingBranch, parentComponent, suspense); - } - suspense.deps = 0; - suspense.effects.length = 0; - suspense.hiddenContainer = createElement("div"); - if (isInFallback) { - patch( - null, - newBranch, - suspense.hiddenContainer, - null, - parentComponent, - suspense, - isSVG, - slotScopeIds, - optimized - ); - if (suspense.deps <= 0) { - suspense.resolve(); - } else { - patch( - activeBranch, - newFallback, - container, - anchor, - parentComponent, - null, - // fallback tree will not have suspense context - isSVG, - slotScopeIds, - optimized - ); - setActiveBranch(suspense, newFallback); - } - } else if (activeBranch && isSameVNodeType(newBranch, activeBranch)) { - patch( - activeBranch, - newBranch, - container, - anchor, - parentComponent, - suspense, - isSVG, - slotScopeIds, - optimized - ); - suspense.resolve(true); - } else { - patch( - null, - newBranch, - suspense.hiddenContainer, - null, - parentComponent, - suspense, - isSVG, - slotScopeIds, - optimized - ); - if (suspense.deps <= 0) { - suspense.resolve(); - } - } - } - } else { - if (activeBranch && isSameVNodeType(newBranch, activeBranch)) { - patch( - activeBranch, - newBranch, - container, - anchor, - parentComponent, - suspense, - isSVG, - slotScopeIds, - optimized - ); - setActiveBranch(suspense, newBranch); - } else { - triggerEvent(n2, "onPending"); - suspense.pendingBranch = newBranch; - suspense.pendingId++; - patch( - null, - newBranch, - suspense.hiddenContainer, - null, - parentComponent, - suspense, - isSVG, - slotScopeIds, - optimized - ); - if (suspense.deps <= 0) { - suspense.resolve(); - } else { - const { timeout, pendingId } = suspense; - if (timeout > 0) { - setTimeout(() => { - if (suspense.pendingId === pendingId) { - suspense.fallback(newFallback); - } - }, timeout); - } else if (timeout === 0) { - suspense.fallback(newFallback); - } - } - } - } -} -var hasWarned = false; -function createSuspenseBoundary(vnode, parentSuspense, parentComponent, container, hiddenContainer, anchor, isSVG, slotScopeIds, optimized, rendererInternals, isHydrating = false) { - if (!hasWarned) { - hasWarned = true; - console[console.info ? "info" : "log"]( - ` is an experimental feature and its API will likely change.` - ); - } - const { - p: patch, - m: move, - um: unmount, - n: next, - o: { parentNode, remove: remove2 } - } = rendererInternals; - let parentSuspenseId; - const isSuspensible = isVNodeSuspensible(vnode); - if (isSuspensible) { - if (parentSuspense == null ? void 0 : parentSuspense.pendingBranch) { - parentSuspenseId = parentSuspense.pendingId; - parentSuspense.deps++; - } - } - const timeout = vnode.props ? toNumber(vnode.props.timeout) : void 0; - if (true) { - assertNumber(timeout, `Suspense timeout`); - } - const suspense = { - vnode, - parent: parentSuspense, - parentComponent, - isSVG, - container, - hiddenContainer, - anchor, - deps: 0, - pendingId: 0, - timeout: typeof timeout === "number" ? timeout : -1, - activeBranch: null, - pendingBranch: null, - isInFallback: true, - isHydrating, - isUnmounted: false, - effects: [], - resolve(resume = false, sync = false) { - if (true) { - if (!resume && !suspense.pendingBranch) { - throw new Error( - `suspense.resolve() is called without a pending branch.` - ); - } - if (suspense.isUnmounted) { - throw new Error( - `suspense.resolve() is called on an already unmounted suspense boundary.` - ); - } - } - const { - vnode: vnode2, - activeBranch, - pendingBranch, - pendingId, - effects, - parentComponent: parentComponent2, - container: container2 - } = suspense; - if (suspense.isHydrating) { - suspense.isHydrating = false; - } else if (!resume) { - const delayEnter = activeBranch && pendingBranch.transition && pendingBranch.transition.mode === "out-in"; - if (delayEnter) { - activeBranch.transition.afterLeave = () => { - if (pendingId === suspense.pendingId) { - move(pendingBranch, container2, anchor2, 0); - } - }; - } - let { anchor: anchor2 } = suspense; - if (activeBranch) { - anchor2 = next(activeBranch); - unmount(activeBranch, parentComponent2, suspense, true); - } - if (!delayEnter) { - move(pendingBranch, container2, anchor2, 0); - } - } - setActiveBranch(suspense, pendingBranch); - suspense.pendingBranch = null; - suspense.isInFallback = false; - let parent = suspense.parent; - let hasUnresolvedAncestor = false; - while (parent) { - if (parent.pendingBranch) { - parent.effects.push(...effects); - hasUnresolvedAncestor = true; - break; - } - parent = parent.parent; - } - if (!hasUnresolvedAncestor) { - queuePostFlushCb(effects); - } - suspense.effects = []; - if (isSuspensible) { - if (parentSuspense && parentSuspense.pendingBranch && parentSuspenseId === parentSuspense.pendingId) { - parentSuspense.deps--; - if (parentSuspense.deps === 0 && !sync) { - parentSuspense.resolve(); - } - } - } - triggerEvent(vnode2, "onResolve"); - }, - fallback(fallbackVNode) { - if (!suspense.pendingBranch) { - return; - } - const { vnode: vnode2, activeBranch, parentComponent: parentComponent2, container: container2, isSVG: isSVG2 } = suspense; - triggerEvent(vnode2, "onFallback"); - const anchor2 = next(activeBranch); - const mountFallback = () => { - if (!suspense.isInFallback) { - return; - } - patch( - null, - fallbackVNode, - container2, - anchor2, - parentComponent2, - null, - // fallback tree will not have suspense context - isSVG2, - slotScopeIds, - optimized - ); - setActiveBranch(suspense, fallbackVNode); - }; - const delayEnter = fallbackVNode.transition && fallbackVNode.transition.mode === "out-in"; - if (delayEnter) { - activeBranch.transition.afterLeave = mountFallback; - } - suspense.isInFallback = true; - unmount( - activeBranch, - parentComponent2, - null, - // no suspense so unmount hooks fire now - true - // shouldRemove - ); - if (!delayEnter) { - mountFallback(); - } - }, - move(container2, anchor2, type) { - suspense.activeBranch && move(suspense.activeBranch, container2, anchor2, type); - suspense.container = container2; - }, - next() { - return suspense.activeBranch && next(suspense.activeBranch); - }, - registerDep(instance, setupRenderEffect) { - const isInPendingSuspense = !!suspense.pendingBranch; - if (isInPendingSuspense) { - suspense.deps++; - } - const hydratedEl = instance.vnode.el; - instance.asyncDep.catch((err) => { - handleError(err, instance, 0); - }).then((asyncSetupResult) => { - if (instance.isUnmounted || suspense.isUnmounted || suspense.pendingId !== instance.suspenseId) { - return; - } - instance.asyncResolved = true; - const { vnode: vnode2 } = instance; - if (true) { - pushWarningContext(vnode2); - } - handleSetupResult(instance, asyncSetupResult, false); - if (hydratedEl) { - vnode2.el = hydratedEl; - } - const placeholder = !hydratedEl && instance.subTree.el; - setupRenderEffect( - instance, - vnode2, - // component may have been moved before resolve. - // if this is not a hydration, instance.subTree will be the comment - // placeholder. - parentNode(hydratedEl || instance.subTree.el), - // anchor will not be used if this is hydration, so only need to - // consider the comment placeholder case. - hydratedEl ? null : next(instance.subTree), - suspense, - isSVG, - optimized - ); - if (placeholder) { - remove2(placeholder); - } - updateHOCHostEl(instance, vnode2.el); - if (true) { - popWarningContext(); - } - if (isInPendingSuspense && --suspense.deps === 0) { - suspense.resolve(); - } - }); - }, - unmount(parentSuspense2, doRemove) { - suspense.isUnmounted = true; - if (suspense.activeBranch) { - unmount( - suspense.activeBranch, - parentComponent, - parentSuspense2, - doRemove - ); - } - if (suspense.pendingBranch) { - unmount( - suspense.pendingBranch, - parentComponent, - parentSuspense2, - doRemove - ); - } - } - }; - return suspense; -} -function hydrateSuspense(node, vnode, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized, rendererInternals, hydrateNode) { - const suspense = vnode.suspense = createSuspenseBoundary( - vnode, - parentSuspense, - parentComponent, - node.parentNode, - document.createElement("div"), - null, - isSVG, - slotScopeIds, - optimized, - rendererInternals, - true - /* hydrating */ - ); - const result = hydrateNode( - node, - suspense.pendingBranch = vnode.ssContent, - parentComponent, - suspense, - slotScopeIds, - optimized - ); - if (suspense.deps === 0) { - suspense.resolve(false, true); - } - return result; -} -function normalizeSuspenseChildren(vnode) { - const { shapeFlag, children } = vnode; - const isSlotChildren = shapeFlag & 32; - vnode.ssContent = normalizeSuspenseSlot( - isSlotChildren ? children.default : children - ); - vnode.ssFallback = isSlotChildren ? normalizeSuspenseSlot(children.fallback) : createVNode(Comment); -} -function normalizeSuspenseSlot(s) { - let block; - if (isFunction(s)) { - const trackBlock = isBlockTreeEnabled && s._c; - if (trackBlock) { - s._d = false; - openBlock(); - } - s = s(); - if (trackBlock) { - s._d = true; - block = currentBlock; - closeBlock(); - } - } - if (isArray(s)) { - const singleChild = filterSingleRoot(s); - if (!singleChild) { - warn2(` slots expect a single root node.`); - } - s = singleChild; - } - s = normalizeVNode(s); - if (block && !s.dynamicChildren) { - s.dynamicChildren = block.filter((c) => c !== s); - } - return s; -} -function queueEffectWithSuspense(fn, suspense) { - if (suspense && suspense.pendingBranch) { - if (isArray(fn)) { - suspense.effects.push(...fn); - } else { - suspense.effects.push(fn); - } - } else { - queuePostFlushCb(fn); - } -} -function setActiveBranch(suspense, branch) { - suspense.activeBranch = branch; - const { vnode, parentComponent } = suspense; - const el = vnode.el = branch.el; - if (parentComponent && parentComponent.subTree === vnode) { - parentComponent.vnode.el = el; - updateHOCHostEl(parentComponent, el); - } -} -function isVNodeSuspensible(vnode) { - var _a; - return ((_a = vnode.props) == null ? void 0 : _a.suspensible) != null && vnode.props.suspensible !== false; -} -function watchEffect(effect2, options) { - return doWatch(effect2, null, options); -} -function watchPostEffect(effect2, options) { - return doWatch( - effect2, - null, - true ? extend({}, options, { flush: "post" }) : { flush: "post" } - ); -} -function watchSyncEffect(effect2, options) { - return doWatch( - effect2, - null, - true ? extend({}, options, { flush: "sync" }) : { flush: "sync" } - ); -} -var INITIAL_WATCHER_VALUE = {}; -function watch(source, cb, options) { - if (!isFunction(cb)) { - warn2( - `\`watch(fn, options?)\` signature has been moved to a separate API. Use \`watchEffect(fn, options?)\` instead. \`watch\` now only supports \`watch(source, cb, options?) signature.` - ); - } - return doWatch(source, cb, options); -} -function doWatch(source, cb, { immediate, deep, flush, onTrack, onTrigger } = EMPTY_OBJ) { - var _a; - if (!cb) { - if (immediate !== void 0) { - warn2( - `watch() "immediate" option is only respected when using the watch(source, callback, options?) signature.` - ); - } - if (deep !== void 0) { - warn2( - `watch() "deep" option is only respected when using the watch(source, callback, options?) signature.` - ); - } - } - const warnInvalidSource = (s) => { - warn2( - `Invalid watch source: `, - s, - `A watch source can only be a getter/effect function, a ref, a reactive object, or an array of these types.` - ); - }; - const instance = getCurrentScope() === ((_a = currentInstance) == null ? void 0 : _a.scope) ? currentInstance : null; - let getter; - let forceTrigger = false; - let isMultiSource = false; - if (isRef(source)) { - getter = () => source.value; - forceTrigger = isShallow(source); - } else if (isReactive(source)) { - getter = () => source; - deep = true; - } else if (isArray(source)) { - isMultiSource = true; - forceTrigger = source.some((s) => isReactive(s) || isShallow(s)); - getter = () => source.map((s) => { - if (isRef(s)) { - return s.value; - } else if (isReactive(s)) { - return traverse(s); - } else if (isFunction(s)) { - return callWithErrorHandling(s, instance, 2); - } else { - warnInvalidSource(s); - } - }); - } else if (isFunction(source)) { - if (cb) { - getter = () => callWithErrorHandling(source, instance, 2); - } else { - getter = () => { - if (instance && instance.isUnmounted) { - return; - } - if (cleanup) { - cleanup(); - } - return callWithAsyncErrorHandling( - source, - instance, - 3, - [onCleanup] - ); - }; - } - } else { - getter = NOOP; - warnInvalidSource(source); - } - if (cb && deep) { - const baseGetter = getter; - getter = () => traverse(baseGetter()); - } - let cleanup; - let onCleanup = (fn) => { - cleanup = effect2.onStop = () => { - callWithErrorHandling(fn, instance, 4); - }; - }; - let ssrCleanup; - if (isInSSRComponentSetup) { - onCleanup = NOOP; - if (!cb) { - getter(); - } else if (immediate) { - callWithAsyncErrorHandling(cb, instance, 3, [ - getter(), - isMultiSource ? [] : void 0, - onCleanup - ]); - } - if (flush === "sync") { - const ctx = useSSRContext(); - ssrCleanup = ctx.__watcherHandles || (ctx.__watcherHandles = []); - } else { - return NOOP; - } - } - let oldValue = isMultiSource ? new Array(source.length).fill(INITIAL_WATCHER_VALUE) : INITIAL_WATCHER_VALUE; - const job = () => { - if (!effect2.active) { - return; - } - if (cb) { - const newValue = effect2.run(); - if (deep || forceTrigger || (isMultiSource ? newValue.some( - (v, i) => hasChanged(v, oldValue[i]) - ) : hasChanged(newValue, oldValue)) || false) { - if (cleanup) { - cleanup(); - } - callWithAsyncErrorHandling(cb, instance, 3, [ - newValue, - // pass undefined as the old value when it's changed for the first time - oldValue === INITIAL_WATCHER_VALUE ? void 0 : isMultiSource && oldValue[0] === INITIAL_WATCHER_VALUE ? [] : oldValue, - onCleanup - ]); - oldValue = newValue; - } - } else { - effect2.run(); - } - }; - job.allowRecurse = !!cb; - let scheduler; - if (flush === "sync") { - scheduler = job; - } else if (flush === "post") { - scheduler = () => queuePostRenderEffect(job, instance && instance.suspense); - } else { - job.pre = true; - if (instance) - job.id = instance.uid; - scheduler = () => queueJob(job); - } - const effect2 = new ReactiveEffect(getter, scheduler); - if (true) { - effect2.onTrack = onTrack; - effect2.onTrigger = onTrigger; - } - if (cb) { - if (immediate) { - job(); - } else { - oldValue = effect2.run(); - } - } else if (flush === "post") { - queuePostRenderEffect( - effect2.run.bind(effect2), - instance && instance.suspense - ); - } else { - effect2.run(); - } - const unwatch = () => { - effect2.stop(); - if (instance && instance.scope) { - remove(instance.scope.effects, effect2); - } - }; - if (ssrCleanup) - ssrCleanup.push(unwatch); - return unwatch; -} -function instanceWatch(source, value, options) { - const publicThis = this.proxy; - const getter = isString(source) ? source.includes(".") ? createPathGetter(publicThis, source) : () => publicThis[source] : source.bind(publicThis, publicThis); - let cb; - if (isFunction(value)) { - cb = value; - } else { - cb = value.handler; - options = value; - } - const cur = currentInstance; - setCurrentInstance(this); - const res = doWatch(getter, cb.bind(publicThis), options); - if (cur) { - setCurrentInstance(cur); - } else { - unsetCurrentInstance(); - } - return res; -} -function createPathGetter(ctx, path) { - const segments = path.split("."); - return () => { - let cur = ctx; - for (let i = 0; i < segments.length && cur; i++) { - cur = cur[segments[i]]; - } - return cur; - }; -} -function traverse(value, seen) { - if (!isObject(value) || value["__v_skip"]) { - return value; - } - seen = seen || /* @__PURE__ */ new Set(); - if (seen.has(value)) { - return value; - } - seen.add(value); - if (isRef(value)) { - traverse(value.value, seen); - } else if (isArray(value)) { - for (let i = 0; i < value.length; i++) { - traverse(value[i], seen); - } - } else if (isSet(value) || isMap(value)) { - value.forEach((v) => { - traverse(v, seen); - }); - } else if (isPlainObject(value)) { - for (const key in value) { - traverse(value[key], seen); - } - } - return value; -} -function validateDirectiveName(name) { - if (isBuiltInDirective(name)) { - warn2("Do not use built-in directive ids as custom directive id: " + name); - } -} -function withDirectives(vnode, directives) { - const internalInstance = currentRenderingInstance; - if (internalInstance === null) { - warn2(`withDirectives can only be used inside render functions.`); - return vnode; - } - const instance = getExposeProxy(internalInstance) || internalInstance.proxy; - const bindings = vnode.dirs || (vnode.dirs = []); - for (let i = 0; i < directives.length; i++) { - let [dir, value, arg, modifiers = EMPTY_OBJ] = directives[i]; - if (dir) { - if (isFunction(dir)) { - dir = { - mounted: dir, - updated: dir - }; - } - if (dir.deep) { - traverse(value); - } - bindings.push({ - dir, - instance, - value, - oldValue: void 0, - arg, - modifiers - }); - } - } - return vnode; -} -function invokeDirectiveHook(vnode, prevVNode, instance, name) { - const bindings = vnode.dirs; - const oldBindings = prevVNode && prevVNode.dirs; - for (let i = 0; i < bindings.length; i++) { - const binding = bindings[i]; - if (oldBindings) { - binding.oldValue = oldBindings[i].value; - } - let hook = binding.dir[name]; - if (hook) { - pauseTracking(); - callWithAsyncErrorHandling(hook, instance, 8, [ - vnode.el, - binding, - vnode, - prevVNode - ]); - resetTracking(); - } - } -} -function useTransitionState() { - const state = { - isMounted: false, - isLeaving: false, - isUnmounting: false, - leavingVNodes: /* @__PURE__ */ new Map() - }; - onMounted(() => { - state.isMounted = true; - }); - onBeforeUnmount(() => { - state.isUnmounting = true; - }); - return state; -} -var TransitionHookValidator = [Function, Array]; -var BaseTransitionPropsValidators = { - mode: String, - appear: Boolean, - persisted: Boolean, - // enter - onBeforeEnter: TransitionHookValidator, - onEnter: TransitionHookValidator, - onAfterEnter: TransitionHookValidator, - onEnterCancelled: TransitionHookValidator, - // leave - onBeforeLeave: TransitionHookValidator, - onLeave: TransitionHookValidator, - onAfterLeave: TransitionHookValidator, - onLeaveCancelled: TransitionHookValidator, - // appear - onBeforeAppear: TransitionHookValidator, - onAppear: TransitionHookValidator, - onAfterAppear: TransitionHookValidator, - onAppearCancelled: TransitionHookValidator -}; -var BaseTransitionImpl = { - name: `BaseTransition`, - props: BaseTransitionPropsValidators, - setup(props, { slots }) { - const instance = getCurrentInstance(); - const state = useTransitionState(); - let prevTransitionKey; - return () => { - const children = slots.default && getTransitionRawChildren(slots.default(), true); - if (!children || !children.length) { - return; - } - let child = children[0]; - if (children.length > 1) { - let hasFound = false; - for (const c of children) { - if (c.type !== Comment) { - if (hasFound) { - warn2( - " can only be used on a single element or component. Use for lists." - ); - break; - } - child = c; - hasFound = true; - if (false) - break; - } - } - } - const rawProps = toRaw(props); - const { mode } = rawProps; - if (mode && mode !== "in-out" && mode !== "out-in" && mode !== "default") { - warn2(`invalid mode: ${mode}`); - } - if (state.isLeaving) { - return emptyPlaceholder(child); - } - const innerChild = getKeepAliveChild(child); - if (!innerChild) { - return emptyPlaceholder(child); - } - const enterHooks = resolveTransitionHooks( - innerChild, - rawProps, - state, - instance - ); - setTransitionHooks(innerChild, enterHooks); - const oldChild = instance.subTree; - const oldInnerChild = oldChild && getKeepAliveChild(oldChild); - let transitionKeyChanged = false; - const { getTransitionKey } = innerChild.type; - if (getTransitionKey) { - const key = getTransitionKey(); - if (prevTransitionKey === void 0) { - prevTransitionKey = key; - } else if (key !== prevTransitionKey) { - prevTransitionKey = key; - transitionKeyChanged = true; - } - } - if (oldInnerChild && oldInnerChild.type !== Comment && (!isSameVNodeType(innerChild, oldInnerChild) || transitionKeyChanged)) { - const leavingHooks = resolveTransitionHooks( - oldInnerChild, - rawProps, - state, - instance - ); - setTransitionHooks(oldInnerChild, leavingHooks); - if (mode === "out-in") { - state.isLeaving = true; - leavingHooks.afterLeave = () => { - state.isLeaving = false; - if (instance.update.active !== false) { - instance.update(); - } - }; - return emptyPlaceholder(child); - } else if (mode === "in-out" && innerChild.type !== Comment) { - leavingHooks.delayLeave = (el, earlyRemove, delayedLeave) => { - const leavingVNodesCache = getLeavingNodesForType( - state, - oldInnerChild - ); - leavingVNodesCache[String(oldInnerChild.key)] = oldInnerChild; - el._leaveCb = () => { - earlyRemove(); - el._leaveCb = void 0; - delete enterHooks.delayedLeave; - }; - enterHooks.delayedLeave = delayedLeave; - }; - } - } - return child; - }; - } -}; -var BaseTransition = BaseTransitionImpl; -function getLeavingNodesForType(state, vnode) { - const { leavingVNodes } = state; - let leavingVNodesCache = leavingVNodes.get(vnode.type); - if (!leavingVNodesCache) { - leavingVNodesCache = /* @__PURE__ */ Object.create(null); - leavingVNodes.set(vnode.type, leavingVNodesCache); - } - return leavingVNodesCache; -} -function resolveTransitionHooks(vnode, props, state, instance) { - const { - appear, - mode, - persisted = false, - onBeforeEnter, - onEnter, - onAfterEnter, - onEnterCancelled, - onBeforeLeave, - onLeave, - onAfterLeave, - onLeaveCancelled, - onBeforeAppear, - onAppear, - onAfterAppear, - onAppearCancelled - } = props; - const key = String(vnode.key); - const leavingVNodesCache = getLeavingNodesForType(state, vnode); - const callHook3 = (hook, args) => { - hook && callWithAsyncErrorHandling( - hook, - instance, - 9, - args - ); - }; - const callAsyncHook = (hook, args) => { - const done = args[1]; - callHook3(hook, args); - if (isArray(hook)) { - if (hook.every((hook2) => hook2.length <= 1)) - done(); - } else if (hook.length <= 1) { - done(); - } - }; - const hooks = { - mode, - persisted, - beforeEnter(el) { - let hook = onBeforeEnter; - if (!state.isMounted) { - if (appear) { - hook = onBeforeAppear || onBeforeEnter; - } else { - return; - } - } - if (el._leaveCb) { - el._leaveCb( - true - /* cancelled */ - ); - } - const leavingVNode = leavingVNodesCache[key]; - if (leavingVNode && isSameVNodeType(vnode, leavingVNode) && leavingVNode.el._leaveCb) { - leavingVNode.el._leaveCb(); - } - callHook3(hook, [el]); - }, - enter(el) { - let hook = onEnter; - let afterHook = onAfterEnter; - let cancelHook = onEnterCancelled; - if (!state.isMounted) { - if (appear) { - hook = onAppear || onEnter; - afterHook = onAfterAppear || onAfterEnter; - cancelHook = onAppearCancelled || onEnterCancelled; - } else { - return; - } - } - let called = false; - const done = el._enterCb = (cancelled) => { - if (called) - return; - called = true; - if (cancelled) { - callHook3(cancelHook, [el]); - } else { - callHook3(afterHook, [el]); - } - if (hooks.delayedLeave) { - hooks.delayedLeave(); - } - el._enterCb = void 0; - }; - if (hook) { - callAsyncHook(hook, [el, done]); - } else { - done(); - } - }, - leave(el, remove2) { - const key2 = String(vnode.key); - if (el._enterCb) { - el._enterCb( - true - /* cancelled */ - ); - } - if (state.isUnmounting) { - return remove2(); - } - callHook3(onBeforeLeave, [el]); - let called = false; - const done = el._leaveCb = (cancelled) => { - if (called) - return; - called = true; - remove2(); - if (cancelled) { - callHook3(onLeaveCancelled, [el]); - } else { - callHook3(onAfterLeave, [el]); - } - el._leaveCb = void 0; - if (leavingVNodesCache[key2] === vnode) { - delete leavingVNodesCache[key2]; - } - }; - leavingVNodesCache[key2] = vnode; - if (onLeave) { - callAsyncHook(onLeave, [el, done]); - } else { - done(); - } - }, - clone(vnode2) { - return resolveTransitionHooks(vnode2, props, state, instance); - } - }; - return hooks; -} -function emptyPlaceholder(vnode) { - if (isKeepAlive(vnode)) { - vnode = cloneVNode(vnode); - vnode.children = null; - return vnode; - } -} -function getKeepAliveChild(vnode) { - return isKeepAlive(vnode) ? vnode.children ? vnode.children[0] : void 0 : vnode; -} -function setTransitionHooks(vnode, hooks) { - if (vnode.shapeFlag & 6 && vnode.component) { - setTransitionHooks(vnode.component.subTree, hooks); - } else if (vnode.shapeFlag & 128) { - vnode.ssContent.transition = hooks.clone(vnode.ssContent); - vnode.ssFallback.transition = hooks.clone(vnode.ssFallback); - } else { - vnode.transition = hooks; - } -} -function getTransitionRawChildren(children, keepComment = false, parentKey) { - let ret = []; - let keyedFragmentCount = 0; - for (let i = 0; i < children.length; i++) { - let child = children[i]; - const key = parentKey == null ? child.key : String(parentKey) + String(child.key != null ? child.key : i); - if (child.type === Fragment) { - if (child.patchFlag & 128) - keyedFragmentCount++; - ret = ret.concat( - getTransitionRawChildren(child.children, keepComment, key) - ); - } else if (keepComment || child.type !== Comment) { - ret.push(key != null ? cloneVNode(child, { key }) : child); - } - } - if (keyedFragmentCount > 1) { - for (let i = 0; i < ret.length; i++) { - ret[i].patchFlag = -2; - } - } - return ret; -} -function defineComponent(options, extraOptions) { - return isFunction(options) ? ( - // #8326: extend call and options.name access are considered side-effects - // by Rollup, so we have to wrap it in a pure-annotated IIFE. - (() => extend({ name: options.name }, extraOptions, { setup: options }))() - ) : options; -} -var isAsyncWrapper = (i) => !!i.type.__asyncLoader; -function defineAsyncComponent(source) { - if (isFunction(source)) { - source = { loader: source }; - } - const { - loader, - loadingComponent, - errorComponent, - delay = 200, - timeout, - // undefined = never times out - suspensible = true, - onError: userOnError - } = source; - let pendingRequest = null; - let resolvedComp; - let retries = 0; - const retry = () => { - retries++; - pendingRequest = null; - return load(); - }; - const load = () => { - let thisRequest; - return pendingRequest || (thisRequest = pendingRequest = loader().catch((err) => { - err = err instanceof Error ? err : new Error(String(err)); - if (userOnError) { - return new Promise((resolve2, reject) => { - const userRetry = () => resolve2(retry()); - const userFail = () => reject(err); - userOnError(err, userRetry, userFail, retries + 1); - }); - } else { - throw err; - } - }).then((comp) => { - if (thisRequest !== pendingRequest && pendingRequest) { - return pendingRequest; - } - if (!comp) { - warn2( - `Async component loader resolved to undefined. If you are using retry(), make sure to return its return value.` - ); - } - if (comp && (comp.__esModule || comp[Symbol.toStringTag] === "Module")) { - comp = comp.default; - } - if (comp && !isObject(comp) && !isFunction(comp)) { - throw new Error(`Invalid async component load result: ${comp}`); - } - resolvedComp = comp; - return comp; - })); - }; - return defineComponent({ - name: "AsyncComponentWrapper", - __asyncLoader: load, - get __asyncResolved() { - return resolvedComp; - }, - setup() { - const instance = currentInstance; - if (resolvedComp) { - return () => createInnerComp(resolvedComp, instance); - } - const onError = (err) => { - pendingRequest = null; - handleError( - err, - instance, - 13, - !errorComponent - /* do not throw in dev if user provided error component */ - ); - }; - if (suspensible && instance.suspense || isInSSRComponentSetup) { - return load().then((comp) => { - return () => createInnerComp(comp, instance); - }).catch((err) => { - onError(err); - return () => errorComponent ? createVNode(errorComponent, { - error: err - }) : null; - }); - } - const loaded = ref(false); - const error = ref(); - const delayed = ref(!!delay); - if (delay) { - setTimeout(() => { - delayed.value = false; - }, delay); - } - if (timeout != null) { - setTimeout(() => { - if (!loaded.value && !error.value) { - const err = new Error( - `Async component timed out after ${timeout}ms.` - ); - onError(err); - error.value = err; - } - }, timeout); - } - load().then(() => { - loaded.value = true; - if (instance.parent && isKeepAlive(instance.parent.vnode)) { - queueJob(instance.parent.update); - } - }).catch((err) => { - onError(err); - error.value = err; - }); - return () => { - if (loaded.value && resolvedComp) { - return createInnerComp(resolvedComp, instance); - } else if (error.value && errorComponent) { - return createVNode(errorComponent, { - error: error.value - }); - } else if (loadingComponent && !delayed.value) { - return createVNode(loadingComponent); - } - }; - } - }); -} -function createInnerComp(comp, parent) { - const { ref: ref2, props, children, ce } = parent.vnode; - const vnode = createVNode(comp, props, children); - vnode.ref = ref2; - vnode.ce = ce; - delete parent.vnode.ce; - return vnode; -} -var isKeepAlive = (vnode) => vnode.type.__isKeepAlive; -var KeepAliveImpl = { - name: `KeepAlive`, - // Marker for special handling inside the renderer. We are not using a === - // check directly on KeepAlive in the renderer, because importing it directly - // would prevent it from being tree-shaken. - __isKeepAlive: true, - props: { - include: [String, RegExp, Array], - exclude: [String, RegExp, Array], - max: [String, Number] - }, - setup(props, { slots }) { - const instance = getCurrentInstance(); - const sharedContext = instance.ctx; - if (!sharedContext.renderer) { - return () => { - const children = slots.default && slots.default(); - return children && children.length === 1 ? children[0] : children; - }; - } - const cache = /* @__PURE__ */ new Map(); - const keys = /* @__PURE__ */ new Set(); - let current = null; - if (true) { - instance.__v_cache = cache; - } - const parentSuspense = instance.suspense; - const { - renderer: { - p: patch, - m: move, - um: _unmount, - o: { createElement } - } - } = sharedContext; - const storageContainer = createElement("div"); - sharedContext.activate = (vnode, container, anchor, isSVG, optimized) => { - const instance2 = vnode.component; - move(vnode, container, anchor, 0, parentSuspense); - patch( - instance2.vnode, - vnode, - container, - anchor, - instance2, - parentSuspense, - isSVG, - vnode.slotScopeIds, - optimized - ); - queuePostRenderEffect(() => { - instance2.isDeactivated = false; - if (instance2.a) { - invokeArrayFns(instance2.a); - } - const vnodeHook = vnode.props && vnode.props.onVnodeMounted; - if (vnodeHook) { - invokeVNodeHook(vnodeHook, instance2.parent, vnode); - } - }, parentSuspense); - if (true) { - devtoolsComponentAdded(instance2); - } - }; - sharedContext.deactivate = (vnode) => { - const instance2 = vnode.component; - move(vnode, storageContainer, null, 1, parentSuspense); - queuePostRenderEffect(() => { - if (instance2.da) { - invokeArrayFns(instance2.da); - } - const vnodeHook = vnode.props && vnode.props.onVnodeUnmounted; - if (vnodeHook) { - invokeVNodeHook(vnodeHook, instance2.parent, vnode); - } - instance2.isDeactivated = true; - }, parentSuspense); - if (true) { - devtoolsComponentAdded(instance2); - } - }; - function unmount(vnode) { - resetShapeFlag(vnode); - _unmount(vnode, instance, parentSuspense, true); - } - function pruneCache(filter) { - cache.forEach((vnode, key) => { - const name = getComponentName(vnode.type); - if (name && (!filter || !filter(name))) { - pruneCacheEntry(key); - } - }); - } - function pruneCacheEntry(key) { - const cached = cache.get(key); - if (!current || !isSameVNodeType(cached, current)) { - unmount(cached); - } else if (current) { - resetShapeFlag(current); - } - cache.delete(key); - keys.delete(key); - } - watch( - () => [props.include, props.exclude], - ([include, exclude]) => { - include && pruneCache((name) => matches(include, name)); - exclude && pruneCache((name) => !matches(exclude, name)); - }, - // prune post-render after `current` has been updated - { flush: "post", deep: true } - ); - let pendingCacheKey = null; - const cacheSubtree = () => { - if (pendingCacheKey != null) { - cache.set(pendingCacheKey, getInnerChild(instance.subTree)); - } - }; - onMounted(cacheSubtree); - onUpdated(cacheSubtree); - onBeforeUnmount(() => { - cache.forEach((cached) => { - const { subTree, suspense } = instance; - const vnode = getInnerChild(subTree); - if (cached.type === vnode.type && cached.key === vnode.key) { - resetShapeFlag(vnode); - const da = vnode.component.da; - da && queuePostRenderEffect(da, suspense); - return; - } - unmount(cached); - }); - }); - return () => { - pendingCacheKey = null; - if (!slots.default) { - return null; - } - const children = slots.default(); - const rawVNode = children[0]; - if (children.length > 1) { - if (true) { - warn2(`KeepAlive should contain exactly one component child.`); - } - current = null; - return children; - } else if (!isVNode(rawVNode) || !(rawVNode.shapeFlag & 4) && !(rawVNode.shapeFlag & 128)) { - current = null; - return rawVNode; - } - let vnode = getInnerChild(rawVNode); - const comp = vnode.type; - const name = getComponentName( - isAsyncWrapper(vnode) ? vnode.type.__asyncResolved || {} : comp - ); - const { include, exclude, max } = props; - if (include && (!name || !matches(include, name)) || exclude && name && matches(exclude, name)) { - current = vnode; - return rawVNode; - } - const key = vnode.key == null ? comp : vnode.key; - const cachedVNode = cache.get(key); - if (vnode.el) { - vnode = cloneVNode(vnode); - if (rawVNode.shapeFlag & 128) { - rawVNode.ssContent = vnode; - } - } - pendingCacheKey = key; - if (cachedVNode) { - vnode.el = cachedVNode.el; - vnode.component = cachedVNode.component; - if (vnode.transition) { - setTransitionHooks(vnode, vnode.transition); - } - vnode.shapeFlag |= 512; - keys.delete(key); - keys.add(key); - } else { - keys.add(key); - if (max && keys.size > parseInt(max, 10)) { - pruneCacheEntry(keys.values().next().value); - } - } - vnode.shapeFlag |= 256; - current = vnode; - return isSuspense(rawVNode.type) ? rawVNode : vnode; - }; - } -}; -var KeepAlive = KeepAliveImpl; -function matches(pattern, name) { - if (isArray(pattern)) { - return pattern.some((p2) => matches(p2, name)); - } else if (isString(pattern)) { - return pattern.split(",").includes(name); - } else if (isRegExp(pattern)) { - return pattern.test(name); - } - return false; -} -function onActivated(hook, target) { - registerKeepAliveHook(hook, "a", target); -} -function onDeactivated(hook, target) { - registerKeepAliveHook(hook, "da", target); -} -function registerKeepAliveHook(hook, type, target = currentInstance) { - const wrappedHook = hook.__wdc || (hook.__wdc = () => { - let current = target; - while (current) { - if (current.isDeactivated) { - return; - } - current = current.parent; - } - return hook(); - }); - injectHook(type, wrappedHook, target); - if (target) { - let current = target.parent; - while (current && current.parent) { - if (isKeepAlive(current.parent.vnode)) { - injectToKeepAliveRoot(wrappedHook, type, target, current); - } - current = current.parent; - } - } -} -function injectToKeepAliveRoot(hook, type, target, keepAliveRoot) { - const injected = injectHook( - type, - hook, - keepAliveRoot, - true - /* prepend */ - ); - onUnmounted(() => { - remove(keepAliveRoot[type], injected); - }, target); -} -function resetShapeFlag(vnode) { - vnode.shapeFlag &= ~256; - vnode.shapeFlag &= ~512; -} -function getInnerChild(vnode) { - return vnode.shapeFlag & 128 ? vnode.ssContent : vnode; -} -function injectHook(type, hook, target = currentInstance, prepend = false) { - if (target) { - const hooks = target[type] || (target[type] = []); - const wrappedHook = hook.__weh || (hook.__weh = (...args) => { - if (target.isUnmounted) { - return; - } - pauseTracking(); - setCurrentInstance(target); - const res = callWithAsyncErrorHandling(hook, target, type, args); - unsetCurrentInstance(); - resetTracking(); - return res; - }); - if (prepend) { - hooks.unshift(wrappedHook); - } else { - hooks.push(wrappedHook); - } - return wrappedHook; - } else if (true) { - const apiName = toHandlerKey(ErrorTypeStrings[type].replace(/ hook$/, "")); - warn2( - `${apiName} is called when there is no active component instance to be associated with. Lifecycle injection APIs can only be used during execution of setup(). If you are using async setup(), make sure to register lifecycle hooks before the first await statement.` - ); - } -} -var createHook = (lifecycle) => (hook, target = currentInstance) => ( - // post-create lifecycle registrations are noops during SSR (except for serverPrefetch) - (!isInSSRComponentSetup || lifecycle === "sp") && injectHook(lifecycle, (...args) => hook(...args), target) -); -var onBeforeMount = createHook("bm"); -var onMounted = createHook("m"); -var onBeforeUpdate = createHook("bu"); -var onUpdated = createHook("u"); -var onBeforeUnmount = createHook("bum"); -var onUnmounted = createHook("um"); -var onServerPrefetch = createHook("sp"); -var onRenderTriggered = createHook( - "rtg" -); -var onRenderTracked = createHook( - "rtc" -); -function onErrorCaptured(hook, target = currentInstance) { - injectHook("ec", hook, target); -} -var COMPONENTS = "components"; -var DIRECTIVES = "directives"; -function resolveComponent(name, maybeSelfReference) { - return resolveAsset(COMPONENTS, name, true, maybeSelfReference) || name; -} -var NULL_DYNAMIC_COMPONENT = Symbol.for("v-ndc"); -function resolveDynamicComponent(component) { - if (isString(component)) { - return resolveAsset(COMPONENTS, component, false) || component; - } else { - return component || NULL_DYNAMIC_COMPONENT; - } -} -function resolveDirective(name) { - return resolveAsset(DIRECTIVES, name); -} -function resolveAsset(type, name, warnMissing = true, maybeSelfReference = false) { - const instance = currentRenderingInstance || currentInstance; - if (instance) { - const Component = instance.type; - if (type === COMPONENTS) { - const selfName = getComponentName( - Component, - false - /* do not include inferred name to avoid breaking existing code */ - ); - if (selfName && (selfName === name || selfName === camelize(name) || selfName === capitalize(camelize(name)))) { - return Component; - } - } - const res = ( - // local registration - // check instance[type] first which is resolved for options API - resolve(instance[type] || Component[type], name) || // global registration - resolve(instance.appContext[type], name) - ); - if (!res && maybeSelfReference) { - return Component; - } - if (warnMissing && !res) { - const extra = type === COMPONENTS ? ` -If this is a native custom element, make sure to exclude it from component resolution via compilerOptions.isCustomElement.` : ``; - warn2(`Failed to resolve ${type.slice(0, -1)}: ${name}${extra}`); - } - return res; - } else if (true) { - warn2( - `resolve${capitalize(type.slice(0, -1))} can only be used in render() or setup().` - ); - } -} -function resolve(registry, name) { - return registry && (registry[name] || registry[camelize(name)] || registry[capitalize(camelize(name))]); -} -function renderList(source, renderItem, cache, index) { - let ret; - const cached = cache && cache[index]; - if (isArray(source) || isString(source)) { - ret = new Array(source.length); - for (let i = 0, l = source.length; i < l; i++) { - ret[i] = renderItem(source[i], i, void 0, cached && cached[i]); - } - } else if (typeof source === "number") { - if (!Number.isInteger(source)) { - warn2(`The v-for range expect an integer value but got ${source}.`); - } - ret = new Array(source); - for (let i = 0; i < source; i++) { - ret[i] = renderItem(i + 1, i, void 0, cached && cached[i]); - } - } else if (isObject(source)) { - if (source[Symbol.iterator]) { - ret = Array.from( - source, - (item, i) => renderItem(item, i, void 0, cached && cached[i]) - ); - } else { - const keys = Object.keys(source); - ret = new Array(keys.length); - for (let i = 0, l = keys.length; i < l; i++) { - const key = keys[i]; - ret[i] = renderItem(source[key], key, i, cached && cached[i]); - } - } - } else { - ret = []; - } - if (cache) { - cache[index] = ret; - } - return ret; -} -function createSlots(slots, dynamicSlots) { - for (let i = 0; i < dynamicSlots.length; i++) { - const slot = dynamicSlots[i]; - if (isArray(slot)) { - for (let j = 0; j < slot.length; j++) { - slots[slot[j].name] = slot[j].fn; - } - } else if (slot) { - slots[slot.name] = slot.key ? (...args) => { - const res = slot.fn(...args); - if (res) - res.key = slot.key; - return res; - } : slot.fn; - } - } - return slots; -} -function renderSlot(slots, name, props = {}, fallback, noSlotted) { - if (currentRenderingInstance.isCE || currentRenderingInstance.parent && isAsyncWrapper(currentRenderingInstance.parent) && currentRenderingInstance.parent.isCE) { - if (name !== "default") - props.name = name; - return createVNode("slot", props, fallback && fallback()); - } - let slot = slots[name]; - if (slot && slot.length > 1) { - warn2( - `SSR-optimized slot function detected in a non-SSR-optimized render function. You need to mark this component with $dynamic-slots in the parent template.` - ); - slot = () => []; - } - if (slot && slot._c) { - slot._d = false; - } - openBlock(); - const validSlotContent = slot && ensureValidVNode(slot(props)); - const rendered = createBlock( - Fragment, - { - key: props.key || // slot content array of a dynamic conditional slot may have a branch - // key attached in the `createSlots` helper, respect that - validSlotContent && validSlotContent.key || `_${name}` - }, - validSlotContent || (fallback ? fallback() : []), - validSlotContent && slots._ === 1 ? 64 : -2 - ); - if (!noSlotted && rendered.scopeId) { - rendered.slotScopeIds = [rendered.scopeId + "-s"]; - } - if (slot && slot._c) { - slot._d = true; - } - return rendered; -} -function ensureValidVNode(vnodes) { - return vnodes.some((child) => { - if (!isVNode(child)) - return true; - if (child.type === Comment) - return false; - if (child.type === Fragment && !ensureValidVNode(child.children)) - return false; - return true; - }) ? vnodes : null; -} -function toHandlers(obj, preserveCaseIfNecessary) { - const ret = {}; - if (!isObject(obj)) { - warn2(`v-on with no argument expects an object value.`); - return ret; - } - for (const key in obj) { - ret[preserveCaseIfNecessary && /[A-Z]/.test(key) ? `on:${key}` : toHandlerKey(key)] = obj[key]; - } - return ret; -} -var getPublicInstance = (i) => { - if (!i) - return null; - if (isStatefulComponent(i)) - return getExposeProxy(i) || i.proxy; - return getPublicInstance(i.parent); -}; -var publicPropertiesMap = ( - // Move PURE marker to new line to workaround compiler discarding it - // due to type annotation - extend(/* @__PURE__ */ Object.create(null), { - $: (i) => i, - $el: (i) => i.vnode.el, - $data: (i) => i.data, - $props: (i) => true ? shallowReadonly(i.props) : i.props, - $attrs: (i) => true ? shallowReadonly(i.attrs) : i.attrs, - $slots: (i) => true ? shallowReadonly(i.slots) : i.slots, - $refs: (i) => true ? shallowReadonly(i.refs) : i.refs, - $parent: (i) => getPublicInstance(i.parent), - $root: (i) => getPublicInstance(i.root), - $emit: (i) => i.emit, - $options: (i) => __VUE_OPTIONS_API__ ? resolveMergedOptions(i) : i.type, - $forceUpdate: (i) => i.f || (i.f = () => queueJob(i.update)), - $nextTick: (i) => i.n || (i.n = nextTick.bind(i.proxy)), - $watch: (i) => __VUE_OPTIONS_API__ ? instanceWatch.bind(i) : NOOP - }) -); -var isReservedPrefix = (key) => key === "_" || key === "$"; -var hasSetupBinding = (state, key) => state !== EMPTY_OBJ && !state.__isScriptSetup && hasOwn(state, key); -var PublicInstanceProxyHandlers = { - get({ _: instance }, key) { - const { ctx, setupState, data, props, accessCache, type, appContext } = instance; - if (key === "__isVue") { - return true; - } - let normalizedProps; - if (key[0] !== "$") { - const n = accessCache[key]; - if (n !== void 0) { - switch (n) { - case 1: - return setupState[key]; - case 2: - return data[key]; - case 4: - return ctx[key]; - case 3: - return props[key]; - } - } else if (hasSetupBinding(setupState, key)) { - accessCache[key] = 1; - return setupState[key]; - } else if (data !== EMPTY_OBJ && hasOwn(data, key)) { - accessCache[key] = 2; - return data[key]; - } else if ( - // only cache other properties when instance has declared (thus stable) - // props - (normalizedProps = instance.propsOptions[0]) && hasOwn(normalizedProps, key) - ) { - accessCache[key] = 3; - return props[key]; - } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) { - accessCache[key] = 4; - return ctx[key]; - } else if (!__VUE_OPTIONS_API__ || shouldCacheAccess) { - accessCache[key] = 0; - } - } - const publicGetter = publicPropertiesMap[key]; - let cssModule, globalProperties; - if (publicGetter) { - if (key === "$attrs") { - track(instance, "get", key); - markAttrsAccessed(); - } else if (key === "$slots") { - track(instance, "get", key); - } - return publicGetter(instance); - } else if ( - // css module (injected by vue-loader) - (cssModule = type.__cssModules) && (cssModule = cssModule[key]) - ) { - return cssModule; - } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) { - accessCache[key] = 4; - return ctx[key]; - } else if ( - // global properties - globalProperties = appContext.config.globalProperties, hasOwn(globalProperties, key) - ) { - { - return globalProperties[key]; - } - } else if (currentRenderingInstance && (!isString(key) || // #1091 avoid internal isRef/isVNode checks on component instance leading - // to infinite warning loop - key.indexOf("__v") !== 0)) { - if (data !== EMPTY_OBJ && isReservedPrefix(key[0]) && hasOwn(data, key)) { - warn2( - `Property ${JSON.stringify( - key - )} must be accessed via $data because it starts with a reserved character ("$" or "_") and is not proxied on the render context.` - ); - } else if (instance === currentRenderingInstance) { - warn2( - `Property ${JSON.stringify(key)} was accessed during render but is not defined on instance.` - ); - } - } - }, - set({ _: instance }, key, value) { - const { data, setupState, ctx } = instance; - if (hasSetupBinding(setupState, key)) { - setupState[key] = value; - return true; - } else if (setupState.__isScriptSetup && hasOwn(setupState, key)) { - warn2(`Cannot mutate + +{% endblock %} diff --git a/examples/src/pages/components/carousel-experimental/basic.liquid b/examples/src/pages/components/carousel-experimental/basic.liquid new file mode 100644 index 0000000..7928e17 --- /dev/null +++ b/examples/src/pages/components/carousel-experimental/basic.liquid @@ -0,0 +1,53 @@ +{% layout "templates/layout.liquid" %} +{% block %} + + + + + +{% endblock %} + +{% block head %} + +{% endblock %} + + +{% block foot %} + + + +{% endblock %} diff --git a/examples/src/pages/components/carousel-experimental/full.liquid b/examples/src/pages/components/carousel-experimental/full.liquid new file mode 100644 index 0000000..501dac5 --- /dev/null +++ b/examples/src/pages/components/carousel-experimental/full.liquid @@ -0,0 +1,83 @@ +{% layout "templates/layout.liquid" %} +{% block %} + +
                + + + +
                + +
                +{% endblock %} + +{% block head %} + +{% endblock %} + +{% block foot %} + + + +{% endblock %} diff --git a/examples/src/pages/components/carousel/basic.liquid b/examples/src/pages/components/carousel/basic.liquid index 509d2a7..2d97edc 100644 --- a/examples/src/pages/components/carousel/basic.liquid +++ b/examples/src/pages/components/carousel/basic.liquid @@ -1,12 +1,12 @@ {% layout "templates/layout.liquid" %} {% block %} - + {% endblock %} {% block head %} {% endblock %} - {% block foot %} {% endblock %} diff --git a/examples/src/pages/components/carousel/full.liquid b/examples/src/pages/components/carousel/full.liquid index 74798c1..5346e8a 100644 --- a/examples/src/pages/components/carousel/full.liquid +++ b/examples/src/pages/components/carousel/full.liquid @@ -1,17 +1,16 @@ {% layout "templates/layout.liquid" %} {% block %} -