diff --git a/apps/ui/.gitignore b/apps/ui/.gitignore new file mode 100644 index 0000000..53c37a1 --- /dev/null +++ b/apps/ui/.gitignore @@ -0,0 +1 @@ +dist \ No newline at end of file diff --git a/apps/ui/deploy/message.js b/apps/ui/deploy/message.js index 3e4bffb..41b4277 100644 --- a/apps/ui/deploy/message.js +++ b/apps/ui/deploy/message.js @@ -256,19 +256,19 @@ export class Message { remove(); }; }; - success = (message, timeout = 1000, onClose) => { + success = (message, timeout = 1000, onClose = () => {}) => { return this.open(message, timeout, onClose, { type: 'success' }); }; - info = (message, timeout = 1500, onClose) => { + info = (message, timeout = 1500, onClose = () => {}) => { return this.open(message, timeout, onClose, { type: 'info' }); }; - warning = (message, timeout = 3000, onClose) => { + warning = (message, timeout = 3000, onClose = () => {}) => { return this.open(message, timeout, onClose, { type: 'warning' }); }; - error = (message, timeout = 3000, onClose) => { + error = (message, timeout = 3000, onClose = () => {}) => { return this.open(message, timeout, onClose, { type: 'error' }); }; - loading = (message, timeout = 0, onClose) => { + loading = (message, timeout = 0, onClose = () => {}) => { return this.open(message, timeout, onClose, { type: 'loading' }); }; } diff --git a/apps/ui/index.html b/apps/ui/index.html deleted file mode 100644 index 75257e2..0000000 --- a/apps/ui/index.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - UI - - - -
- - - - \ No newline at end of file diff --git a/apps/ui/package.json b/apps/ui/package.json index f4b229d..22da953 100644 --- a/apps/ui/package.json +++ b/apps/ui/package.json @@ -1,13 +1,51 @@ { - "name": "ui", - "version": "1.0.0", + "name": "@kevisual/system-ui", + "version": "0.0.1", "description": "", - "main": "index.js", + "main": "dist/index.js", + "privite": false, + "type": "module", "scripts": { + "dev": "rollup -c -w", + "build": "npm run clean && rollup -c", "pub": "envision switchOrg system && envision deploy ./deploy -v 0.0.1 -k ui -y y", - "dev": "vite" + "clean": "rimraf dist" }, + "files": [ + "dist", + "src", + "components" + ], "keywords": [], - "author": "", - "license": "ISC" + "author": "abearxiong", + "license": "MIT", + "dependencies": { + "dayjs": "^1.11.13", + "lodash-es": "^4.17.21", + "style-to-object": "^1.0.8" + }, + "devDependencies": { + "@emotion/serialize": "^1.3.1", + "@rollup/plugin-commonjs": "^28.0.1", + "@rollup/plugin-node-resolve": "^15.2.3", + "@rollup/plugin-terser": "^0.4.4", + "@rollup/plugin-typescript": "^11.1.6", + "@types/postcss-import": "^14.0.3", + "@types/react": "^18.3.8", + "autoprefixer": "^10.4.20", + "cross-env": "^7.0.3", + "cssnano": "^7.0.6", + "immer": "^10.1.1", + "nanoid": "^5.0.7", + "postcss-import": "^16.1.0", + "rollup": "^4.22.2", + "rollup-plugin-postcss": "^4.0.2", + "ts-lib": "^0.0.5", + "typescript": "^5.6.2", + "zustand": "5.0.0-rc.2" + }, + "publishConfig": { + "registry": "https://registry.npmjs.org/", + "access": "public" + } } \ No newline at end of file diff --git a/apps/ui/rollup.config.js b/apps/ui/rollup.config.js new file mode 100644 index 0000000..d899894 --- /dev/null +++ b/apps/ui/rollup.config.js @@ -0,0 +1,60 @@ +import resolve from '@rollup/plugin-node-resolve'; +import typescript from '@rollup/plugin-typescript'; +import commonjs from '@rollup/plugin-commonjs'; +import postcss from 'rollup-plugin-postcss'; +import autoprefixer from 'autoprefixer'; +import cssnano from 'cssnano'; +import terser from '@rollup/plugin-terser'; + +import postcssImport from 'postcss-import'; + +const isApps = process.env.TYPE === 'apps'; +const entrys = ['index']; +/** + * @type {import('rollup').RollupOptions[]} + */ +const configs = entrys.map((entry) => ({ + input: `./src/${entry}.ts`, // 修改输入文件为 TypeScript 文件 + output: { + file: `./dist/${entry}.js`, + // dir: 'dist', + format: 'es', // 输出格式为 ES Module + }, + plugins: [ + resolve({ + browser: true, // 处理浏览器版本的依赖 + }), + commonjs(), + typescript({ + tsconfig: './tsconfig.json', + compilerOptions: { + declaration: !isApps, // 生成声明文件 + declarationDir: './dist', // 声明文件输出目录 + // outDir: './types', // + }, + }), // 添加 TypeScript 插件 + terser(), // 压缩输出的 ES Module 文件 + ], +})); + +const entryCss = ['index']; +const configsCss = entryCss.map((entry) => ({ + input: `./src/${entry}.css`, // 修改输入文件为 TypeScript 文件 + output: { + file: `./dist/${entry}.css`, + }, + include: ['src/**/*.css'], + plugins: [ + // resolve(), + postcss({ + // extract: true, + extract: true, + plugins: [ + postcssImport(), // 处理 @import 语句 + autoprefixer(), + ], + }), + ], +})); + +export default [...configs, ...configsCss]; diff --git a/apps/ui/src/components/message/index.ts b/apps/ui/src/components/message/index.ts new file mode 100644 index 0000000..f545587 --- /dev/null +++ b/apps/ui/src/components/message/index.ts @@ -0,0 +1 @@ +export * from './message'; diff --git a/apps/ui/src/components/message/message.ts b/apps/ui/src/components/message/message.ts new file mode 100644 index 0000000..bbbc6eb --- /dev/null +++ b/apps/ui/src/components/message/message.ts @@ -0,0 +1,277 @@ +export class MessageContainer { + container; + id = 'for-message'; + root = document.body; + constructor(opts?: any) { + const { id } = opts || {}; + if (id) { + this.id = id; + } + this.initContainer(); + } + initContainer() { + const id = this.id; + const root = this.root; + let forModal = document.querySelector('#' + id); + if (!forModal) { + forModal = document.createElement('div'); + forModal.id = id; + // 点击穿透 + root.appendChild(forModal); + } + this.initStyle(); + this.container = forModal; + } + initStyle(force: boolean = false) { + const id = this.id; + const styleId = id + '-style'; + const _style = document.querySelector('#' + styleId); + if (force && _style) { + _style.remove(); + } + if (!force && _style) { + return; + } + const style = document.createElement('style'); + style.id = styleId; + + style.innerHTML = ` + #${id} { + position: fixed; top: 0; left: 0; z-index: 1000; width: 100vw;height: 100vh;pointer-events: none; display: flex; flex-direction: column; gap: 10px; + } + .message-wrapper { + display: flex; + transition: transform 2s ease-in-out, opacity 1.2s ease-in-out; /* 缩小并淡出 */ + } + .message-wrapper:first-child { + margin-top: 20px; + } + .message { + display: flex; + gap: 10px; + padding: 6px 10px; + margin: 0 auto; + border-radius: 4px; + background-color: white; + box-shadow: 0 6px 16px 0 rgba(0, 0, 0, 0.08), + 0 3px 6px -4px rgba(0, 0, 0, 0.12), + 0 9px 28px 8px rgba(0, 0, 0, 0.05); + justify-content: center; + align-item: center; + animation: message-slide-down 0.3s ease-out forwards; /* 应用动画 */ + } + /* 添加消失类时 */ + .message-wrapper.message-hide { + transform: scale(0); + opacity: 0; + pointer-events: none; /* 防止交互 */ + } + .message-success { + } + @keyframes message-slide-down { + 0% { + transform: translateY(-100px); /* 从上方开始 */ + opacity: 0; /* 从不可见状态开始 */ + } + 50% { + opacity: 0.5; /* 渐渐变为半透明 */ + } + 100% { + transform: translateY(0); /* 移动到初始位置 */ + opacity: 1; /* 最终完全可见 */ + } + } + .message-icon { + position: relative; + width: 24px; + height: 24px; + box-sizing: border-box; + } + .message-icon::before { + content: ""; + position: absolute; + left: 7px; + top: 3px; + width: 5px; + height: 10px; + } + .icon-success { + border: 2px solid green; /* 外圆圈 */ + border-radius: 50%; /* 使其为圆形 */ + } + .icon-success::before { + border-right: 2px solid green; /* 打勾的右边部分 */ + border-bottom: 2px solid green; /* 打勾的下边部分 */ + transform: rotate(45deg); + } + .icon-info { + border: 2px solid blue; /* 外圆圈 */ + border-radius: 50%; /* 使其为圆形 */ + } + .icon-info::before { + content: "i"; + position: absolute; + top: 0px; + color: blue; + font-weight: bold; + font-size: 16px; + left: 8px; + } + .icon-error::before, .icon-error::after { + content: ""; + position: absolute; + top: 4px; + left: 50%; + width: 2px; + height: 12px; + background-color: red; + transform-origin: center; + } + .icon-error { + border: 2px solid red; /* 外圆圈 */ + border-radius: 50%; /* 使其为圆形 */ + } + .icon-error::before { + transform: translateX(-50%) rotate(45deg); /* 旋转形成叉号的一部分 */ + } + + .icon-error::after { + transform: translateX(-50%) rotate(-45deg); /* 旋转形成叉号的另一部分 */ + } + .icon-warning { + position: relative; + width: 0; + height: 0; + border-left: 12px solid transparent; + border-right: 12px solid transparent; + border-bottom: 24px solid orange; /* 三角形 */ + display: inline-block; + transform: scale(0.8); /* 缩小三角形 */ + } + + .icon-warning::before { + content: "!"; + position: absolute; + top: 5px; + left: 50%; + transform: translateX(-50%); + color: white; + font-weight: bold; + font-size: 16px; + } + .icon-loading { + width: 24px; + height: 24px; + border: 3px solid #f3f3f3; /* 边框颜色,用于加载圈的背景 */ + border-top: 3px solid #3498db; /* 顶部边框的颜色,用于显示加载进度 */ + border-radius: 50%; /* 圆形 */ + animation: spin 1s linear infinite; /* 旋转动画 */ + } + + @keyframes spin { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } + } + `; + document.head.appendChild(style); + } + setRoot(root) { + if (root instanceof HTMLElement) { + this.root = root; + root.appendChild(this.container); + } + } +} +const controller = new MessageContainer(); + +export const createMessage = (content, opts) => { + let { icon, key, style, className, type } = opts || {}; + const div = document.createElement('div'); + div.className = 'message-wrapper' + (className ? ' ' + className : ''); + if (style) { + div.style.cssText = style; + } + if (key) div.setAttribute('data-key', key); + const contentDiv = document.createElement('div'); + contentDiv.className = 'message'; + if (icon) { + const i = document.createElement('i'); + i.className = icon; + i.classList.add('message-icon'); + contentDiv.appendChild(i); + } else if (type) { + const i = document.createElement('div'); + i.className = 'icon-' + type; + i.classList.add('message-icon'); + contentDiv.appendChild(i); + } + if (content instanceof HTMLElement) { + contentDiv.appendChild(content); + } else { + const text = document.createElement('span'); + text.innerText = content; + contentDiv.appendChild(text); + } + div.appendChild(contentDiv); + + return div; +}; +const methods = ['success', 'info', 'warning', 'error', 'loading']; + +export class Message { + controller = controller; + constructor() { + this.controller = controller; + } + open = (message, timeout = 3000, onClose, opts) => { + const controller = this.controller; + const div = createMessage(message, opts); + const remove = () => { + div.classList.add('message-hide'); + setTimeout(() => { + if (div?.isConnected) { + div.remove(); + } else { + console.log('not connected'); + controller.container.removeChild(div); + } + }, 1000); + onClose && onClose(); + }; + controller.container.appendChild(div); + controller.initStyle(true); + if (timeout === 0) { + return () => { + remove(); + }; + } + const time = setTimeout(() => { + remove(); + }, timeout); + return () => { + clearTimeout(time); + remove(); + }; + }; + success = (message: string, timeout = 1000, onClose = () => {}) => { + return this.open(message, timeout, onClose, { type: 'success' }); + }; + info = (message: string, timeout = 1500, onClose = () => {}) => { + return this.open(message, timeout, onClose, { type: 'info' }); + }; + warning = (message: string, timeout = 3000, onClose = () => {}) => { + return this.open(message, timeout, onClose, { type: 'warning' }); + }; + error = (message: string, timeout = 3000, onClose = () => {}) => { + return this.open(message, timeout, onClose, { type: 'error' }); + }; + loading = (message: string, timeout = 0, onClose = () => {}) => { + return this.open(message, timeout, onClose, { type: 'loading' }); + }; +} + +export const message = new Message(); diff --git a/apps/ui/src/components/modal/blank-modal.ts b/apps/ui/src/components/modal/blank-modal.ts new file mode 100644 index 0000000..ebbdfe1 --- /dev/null +++ b/apps/ui/src/components/modal/blank-modal.ts @@ -0,0 +1,176 @@ +import { Modal, ModalOpts, KV } from './modal'; +import { SelectEl, querySelector, elAddCS, ElStyle, elAddCS2 } from '../../utils/query-el'; +import { ObjCss } from '../../utils/css'; + +export class BlankModal extends Modal { + constructor(opts: ModalOpts) { + super(opts); + } +} +type DialogModalOpts = { + dialogTitle?: string; + dialogTitleClassName?: string; + dialogTitleStyle?: ElStyle; + dialogTitleEl?: HTMLElement; + dialogTitleCloseIcon?: boolean; + + dialogContentClassName?: string; + dialogContentStyle?: ElStyle; + + dialogFooterClassName?: string; + dialogFooterStyle?: ElStyle; +} & ModalOpts; + +type DialogDefaultStyle = { + defaultDialogTitleStyle?: ObjCss; + defaultDialogContentStyle?: ObjCss; + defaultDialogFooterStyle?: ObjCss; +}; + +export class DialogModal extends Modal { + dialogTitle?: string; + dialogTitleClassName?: string; + dialogTitleStyle?: ElStyle; + dialogTitleEl?: HTMLElement; + dialogTitleCloseIcon?: boolean; + + dialogContentClassName?: string; + dialogContentStyle?: ElStyle; + + dialogFooterShow?: boolean; + dialogFooterClassName?: string; + dialogFooterStyle?: ElStyle; + + constructor(opts: ModalOpts) { + super(opts); + + this.dialogTitle = opts.dialogTitle; + this.dialogTitleClassName = opts.dialogTitleClassName; + this.dialogTitleStyle = opts.dialogTitleStyle; + this.dialogTitleEl = opts.dialogTitleEl; + this.dialogTitleCloseIcon = opts.dialogTitleCloseIcon; + + this.dialogContentClassName = opts.dialogContentClassName; + this.dialogContentStyle = opts.dialogContentStyle; + + this.dialogFooterClassName = opts.dialogFooterClassName; + this.dialogFooterStyle = opts.dialogFooterStyle; + this.dialogFooterShow = opts.dialogFooterShow ?? false; + + this.setDefaultStyle('defaultContentStyle', { + position: 'absolute', + padding: '0px', + left: '50%', + top: '20%', + width: '600px', + background: '#fff', + borderRadius: '5px', + boxShadow: '0 0 10px rgba(0,0,0,.1)', + transform: 'translate(-50%, -50%)', + maxHeight: '80vh', + overflow: 'auto', + ...opts?.defaultStyle?.defaultContentStyle, + }); + + this.setDefaultStyle('defaultDialogTitleStyle', { + display: 'flex', + justifyContent: 'space-between', + alignItems: 'center', + position: 'sticky', + padding: '10px 20px', + top: '0', + fontSize: '16px', + background: '#fff', + marginTop: '-10px', + borderBottom: '1px solid #f0f0f0', + marginBottom: '5px', + ...opts?.defaultStyle?.defaultDialogTitleStyle, + }); + this.setDefaultStyle('defaultDialogContentStyle', { + padding: '20px', + ...opts?.defaultStyle?.defaultDialogContentStyle, + }); + this.setDefaultStyle('defaultDialogFooterStyle', { + display: 'flex', + justifyItems: 'end', + borderTop: '1px solid #f0f0f0', + padding: '10px 20px', + ...opts?.defaultStyle?.defaultDialogFooterStyle, + }); + } + // static render(el: string | HTMLDivElement, id: string, opts?: DialogModalOpts): DialogModal; + // static render(el: string | HTMLDivElement, opts?: DialogModalOpts): DialogModal; + // static render(...args: any[]) { + // const [el, id, opts] = args; + // return super.render(el, id, opts); + // } + appendRoot(documentFragment: DocumentFragment): void { + const cacheFragment = document.createDocumentFragment(); + // 拿出来 + cacheFragment.appendChild(this.Element); + const DialogBox = documentFragment.querySelector('.ui-modal-content'); + DialogBox.classList.add('ui-modal-dialog'); + + // 创建title + const title = document.createElement('div'); + title.classList.add('ui-modal-dialog-title'); + elAddCS2(title, this.dialogTitleClassName, this.dialogTitleStyle, this.defaultStyle.defaultDialogTitleStyle); + if (this.dialogTitleEl) { + title.appendChild(this.dialogTitleEl); + } else { + title.innerText = this.dialogTitle; + } + if (this.dialogTitleCloseIcon) { + const closeIcon = document.createElement('span'); + closeIcon.className = 'ui-modal-dialog-close'; + closeIcon.innerHTML = '×'; + closeIcon.style.cssText = ` + cursor: pointer; + font-size: 24px; + margin: -5px 10px 0 0; + `; + closeIcon.onclick = (e) => { + this.setOpen(false); + }; + title.appendChild(closeIcon); + } + + DialogBox.appendChild(title); + // 创建content + const content = document.createElement('div'); + content.className = 'ui-modal-dialog-content'; + elAddCS2(content, this.dialogContentClassName, this.dialogContentStyle, this.defaultStyle.defaultDialogContentStyle); + + content.appendChild(cacheFragment); + + if (this.dialogFooterShow) { + const footer = document.createElement('div'); + footer.className = 'ui-modal-dialog-footer'; + elAddCS2(footer, this.dialogFooterClassName, this.dialogFooterStyle, this.defaultStyle.defaultDialogFooterStyle); + DialogBox.appendChild(footer); + } + + DialogBox.appendChild(content); + + super.appendRoot(documentFragment); + } + renderEl(el: HTMLDivElement): this { + return super.renderEl(el); + } + renderFooter(el?: SelectEl): void { + const _el = querySelector(el); + if (!_el) return; + const footer = this.Element.querySelector('.ui-modal-dialog-footer'); + if (!footer) return; + footer.innerHTML = ''; + footer.appendChild(_el); + } + renerContent(el?: SelectEl): void { + const _el = querySelector(el); + if (!_el) return; + const content = this.Element.querySelector('.ui-modal-dialog-content'); + if (!content) return; + content.innerHTML = ''; + content.appendChild(_el); + } +} diff --git a/apps/ui/src/components/modal/event.ts b/apps/ui/src/components/modal/event.ts new file mode 100644 index 0000000..b9bb983 --- /dev/null +++ b/apps/ui/src/components/modal/event.ts @@ -0,0 +1,39 @@ +import { modalStore } from './store'; +// modal 事件实现 +const ModalEvent = { + // +}; +const onClick = (e: MouseEvent) => { + const target = e.target as HTMLElement; + if (!target) { + console.log('target is null'); + return; + } + if (target.classList.contains('ui-modal-mask')) { + const modalState = modalStore.getState(); + const modal = modalState.modals.find((modal) => modal.id === target.dataset.id); + if (modal && modal.open) { + modal.onMaskClose(e); + } + e.preventDefault(); + return; + } + // const parentModalRoot = target.closest('.ui-modal-root'); + // if (!parentModalRoot) { + // return; + // } +}; + +export const InitModalEvent = (el: HTMLDivElement) => { + const id = el.id; + if (ModalEvent[id] && el === ModalEvent[id]) { + return; + } + // Remove previous event listener to prevent memory leak + if (ModalEvent[id]) { + ModalEvent[id].removeEventListener('click', onClick); + } + ModalEvent[id] = null; + el.addEventListener('click', onClick); + ModalEvent[id] = el; +}; diff --git a/apps/ui/src/components/modal/index.css b/apps/ui/src/components/modal/index.css new file mode 100644 index 0000000..00b1915 --- /dev/null +++ b/apps/ui/src/components/modal/index.css @@ -0,0 +1,28 @@ +#ui-modal-list { + position: relative; +} +.ui-modal-wrapper { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 200; +} +.ui-modal-close { + display: none; +} + +.ui-modal-mask { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.5); + z-index: 201; +} +.ui-modal-content { + position: fixed; + z-index: 202; +} diff --git a/apps/ui/src/components/modal/index.ts b/apps/ui/src/components/modal/index.ts new file mode 100644 index 0000000..a7ab81d --- /dev/null +++ b/apps/ui/src/components/modal/index.ts @@ -0,0 +1,5 @@ +export * from './modal'; + +export { modalStore } from './store'; + +export { BlankModal, DialogModal } from './blank-modal'; diff --git a/apps/ui/src/components/modal/modal.ts b/apps/ui/src/components/modal/modal.ts new file mode 100644 index 0000000..29410ff --- /dev/null +++ b/apps/ui/src/components/modal/modal.ts @@ -0,0 +1,272 @@ +import { querySelector, elAddCS, ElStyle, elAddCS2 } from '../../utils/query-el'; +import { generateId } from '../../utils/nanoid'; +import { modalStore } from './store'; +import { InitModalEvent } from './event'; +import { ObjCss } from '../../utils/css'; +export type KV = { + [key: string]: any; +}; +export type ModalOpts< + T = { + [key: string]: any; + }, + U = { + [key: string]: any; + }, +> = { + root?: HTMLDivElement | string; + id?: string; + mask?: boolean; + maskClassName?: string; + maskStyle?: ElStyle; + maskClose?: boolean; + + contentClassName?: string; + contentStyle?: ElStyle; + destroyOnClose?: boolean; // 关闭,把Element移动到cacheFragment中 + hideOnClose?: boolean; // 关闭后是否销毁,设置display:none + open?: boolean; + + onClose?: () => void; + defaultStyle?: DefaultStyle; +} & T; +export type DefaultStyle = { + defaultContentStyle?: ObjCss; + defaultMaskStyle?: ObjCss; +} & T; + +export class Modal { + static rootClassName = '#ui-modal-list'; + root: HTMLDivElement; + id: string; + modalElement?: HTMLDivElement; + Element?: HTMLDivElement; + mask?: boolean; + maskClassName?: string; + maskStyle?: ElStyle; + // 点击mask是否关闭 + maskClose?: boolean; + + contentClassName?: string; + contentStyle?: ElStyle; + + destroyOnClose?: boolean; + hideOnClose?: boolean; + + open?: boolean; + isUse = true; + // 通知关闭 + onClose?: (e: any) => void; + cacheFragment?: DocumentFragment; + + defaultStyle?: DefaultStyle; + constructor(opts: ModalOpts) { + this.root = this.initRoot(opts.root); + InitModalEvent(this.root); + this.id = opts.id || generateId(); + this.mask = opts.mask ?? true; + this.maskClassName = opts.maskClassName; + this.maskStyle = opts.maskStyle; + this.maskClose = opts.maskClose ?? true; + this.contentClassName = opts.contentClassName; + this.contentStyle = opts.contentStyle; + this.destroyOnClose = opts.destroyOnClose ?? true; + this.hideOnClose = opts.hideOnClose ?? true; + if (!this.destroyOnClose && !this.hideOnClose) { + this.destroyOnClose = true; // 必须要有一个为true + console.warn('destroyOnClose Or hideOnClose must one is true'); + } + this.cacheFragment = new DocumentFragment(); + this.defaultStyle = opts.defaultStyle || ({} as DefaultStyle); + this.open = opts.open ?? true; + this.onClose = opts.onClose; + } + protected initRoot(root: ModalOpts['root']) { + let _root = querySelector(root); + if (!_root) { + // 查询ui-modal元素,不存在则创建一个ui-modal元素并添加到body上 + const queryRoot = document.querySelector('#ui-modal-list') as HTMLDivElement; + if (queryRoot) { + _root = queryRoot; + _root.classList.add('ui-modal-root'); + return _root; + } + _root = document.createElement('div'); + _root.id = 'ui-modal-list'; + _root.classList.add('ui-modal-root'); + document.body.appendChild(_root); + return _root; + } + _root.classList.add('ui-custom-modal', 'ui-modal-root'); + + if (!_root.id) { + _root.id = 'ui-modal' + generateId(); + } + + return _root; + } + static render any>(this: T,el: string | HTMLDivElement, id: string, opts?: ConstructorParameters[0]): InstanceType; + static render any>(this: T,el: string | HTMLDivElement, opts?: ConstructorParameters[0]): InstanceType; + static render(...args: any[]) { + let [el, id, opts] = args; + const _el = querySelector(el); + if (!_el) { + console.warn('el is not exist', el); + return; + } + let _id: string = ''; + if (typeof id === 'string' && id) { + // 如果id是字符串 + _id = id; + } else if (typeof id === 'object') { + // 如果id是对象 + _id = id.id; + opts = id; + id = id.id; + } + let _modal: Modal | undefined; + const modalState = modalStore.getState(); + if (_id) { + // 如果存在id,则判断是否已经存在该id的modal + _modal = modalStore.getState().getModal(_id); + } + if (!_modal) { + // 不存在modal,则创建一个modal + // console.log('create modal', id, opts); + const newModal = new this({ id, ...opts }); + _modal = newModal; + modalStore.setState({ + modals: [...modalState.modals, newModal], + }); + } + _modal.renderEl(_el); + return _modal; + } + static create any>(this:T, opts: ModalOpts):InstanceType { + let _id = opts.id; + let _modal: Modal | undefined; + const modalState = modalStore.getState(); + if (_id) { + // 如果存在id,则判断是否已经存在该id的modal + _modal = modalStore.getState().getModal(_id); + } + if (!_modal) { + // 不存在modal,则创建一个modal + // console.log('create modal', id, opts); + const newModal = new this({ ...opts, id: _id }); + _modal = newModal; + modalStore.setState({ + modals: [...modalState.modals, newModal], + }); + } + return _modal as InstanceType; + } + createMask() { + const mask = document.createElement('div'); + mask.classList.add('ui-modal-mask'); + mask.dataset.id = this.id; + elAddCS2(mask, this.maskClassName, this.maskStyle, this.defaultStyle?.defaultMaskStyle); + return mask; + } + renderEl(el: HTMLDivElement) { + const defaultContentStyle = this.defaultStyle?.defaultContentStyle || { + position: 'absolute', + padding: '20px', + left: '50%', + top: '20%', + width: '600px', + background: '#fff', + borderRadius: '5px', + boxShadow: '0 0 10px rgba(0,0,0,.1)', + transform: 'translate(-50%, -50%)', + maxHeight: '80vh', + overflow: 'auto', + }; + + const fragment = document.createDocumentFragment(); + const _modalEl = document.createElement('div'); + _modalEl.classList.add('ui-modal-wrapper'); + _modalEl.id = this.id; + _modalEl.dataset.mid = this.id; + if (this.mask) { + const mask = this.createMask(); + _modalEl.appendChild(mask); + } + const modalContent = document.createElement('div'); + modalContent.classList.add('ui-modal-content'); + elAddCS2(modalContent, this.contentClassName, this.contentStyle, defaultContentStyle); + modalContent.appendChild(el); + _modalEl.appendChild(modalContent); + fragment.appendChild(_modalEl); + + this.modalElement = _modalEl; + this.Element = el; + this.appendRoot(fragment); + + return this; + } + appendRoot(document: DocumentFragment) { + this.root.appendChild(document); + // 第一次渲染,open为true,显示弹窗 + this.setOpen(this.open); + } + setOpen(open: boolean) { + this.open = open; + if (this.destroyOnClose) { + if (open) { + this.root.appendChild(this.modalElement); + } else { + this.cacheFragment.appendChild(this.modalElement); + } + return; + } + if (this.hideOnClose) { + if (open) { + this.modalElement.classList.remove('ui-modal-close'); + } else { + this.modalElement.classList.add('ui-modal-close'); + } + } + } + unMount() { + // 返回渲染的的Element, 然后删除modalElement + const fragment = document.createDocumentFragment(); + fragment.appendChild(this.Element); + this.modalElement?.remove(); + + const modalState = modalStore.getState(); + modalStore.setState({ + modals: modalState.modals.filter((modal) => modal.id !== this.id), + }); + this.isUse = false; + this.cacheFragment = new DocumentFragment(); + return fragment; + } + /** + * 保留,暂时不用 + * // TODO: 研究 + * @param force + * @param opts + * @returns + */ + reRender(force?: boolean, opts?: ModalOpts) { + if (force) { + this.modalElement?.remove?.(); + this.modalElement = undefined; + if (!this.Element) return; + this.renderEl(this.Element); + } + } + async onMaskClose(e?: any) { + if (this.maskClose) { + this.setOpen(false); + this.onClose?.(e); + } + } + setDefaultStyle(key: keyof DefaultStyle, style: ObjCss) { + this.defaultStyle[key] = style as any; + } +} + +// modal.render('#abc'||document.querySelector('#abc')); +// modal.unmount(); diff --git a/apps/ui/src/components/modal/store.ts b/apps/ui/src/components/modal/store.ts new file mode 100644 index 0000000..5db4ade --- /dev/null +++ b/apps/ui/src/components/modal/store.ts @@ -0,0 +1,16 @@ +import { createStore } from '../../utils'; +import { Modal } from './modal'; + +type ModeStore = { + modals: Modal[]; + getModal: (id: string) => Modal | undefined; +}; + +export const modalStore = createStore((set, get) => { + return { + modals: [], + getModal: (id: string) => { + return get().modals.find((model) => model.id === id) as Modal; + }, + }; +}); diff --git a/apps/ui/src/index.css b/apps/ui/src/index.css new file mode 100644 index 0000000..9ba51f5 --- /dev/null +++ b/apps/ui/src/index.css @@ -0,0 +1 @@ +@import './components/modal/index.css'; \ No newline at end of file diff --git a/apps/ui/src/index.ts b/apps/ui/src/index.ts new file mode 100644 index 0000000..e8f0492 --- /dev/null +++ b/apps/ui/src/index.ts @@ -0,0 +1,9 @@ +import { Modal, modalStore, BlankModal, DialogModal } from './components/modal'; + +export { Modal, modalStore, BlankModal, DialogModal }; + +import { createDOMElement } from './utils/dom/create-dom-element'; + +export { createDOMElement }; + +export * from './utils'; diff --git a/apps/ui/src/utils/css.ts b/apps/ui/src/utils/css.ts new file mode 100644 index 0000000..98d2492 --- /dev/null +++ b/apps/ui/src/utils/css.ts @@ -0,0 +1,19 @@ +import { serializeStyles } from '@emotion/serialize'; + +export const getCssText = (obj?: ObjCss) => { + if (!obj) return ''; + const serialized = serializeStyles([obj]); + return serialized.styles; +}; +export const getCssTextObjs = (objs?: ObjCss[]) => { + if (!objs) return ''; + const serialized = serializeStyles(objs); + return serialized.styles; +}; +export type ObjCss = { [key: string]: number | string } & React.CSSProperties; +export const obj2css = (el?: HTMLDivElement, obj?: ObjCss) => { + if (!el) return; + if (!obj) return; + const serialized = serializeStyles([obj as unknown as Record]); + el.style.cssText = serialized.styles; +}; diff --git a/apps/ui/src/utils/dom/create-dom-element.ts b/apps/ui/src/utils/dom/create-dom-element.ts new file mode 100644 index 0000000..908f873 --- /dev/null +++ b/apps/ui/src/utils/dom/create-dom-element.ts @@ -0,0 +1,82 @@ +type JSXElement = { + type: string | symbol; + props: Record; + key?: string | number; +}; +export function createDOMElement(jsxElement: JSXElement) { + // 如果 jsxElement 是 null, undefined 或者是布尔值,则直接跳过处理 + if (jsxElement == null || typeof jsxElement === 'boolean') { + console.warn('Invalid JSX element:', jsxElement); + return null; + } + const { type, props } = jsxElement; + // React Fragment 的处理 + if (type === Symbol.for('react.fragment')) { + const fragment = document.createDocumentFragment(); + if (props.children) { + if (Array.isArray(props.children)) { + props.children.forEach((child) => { + const childElement = createDOMElement(child); + if (childElement) { + fragment.appendChild(childElement); + } + }); + } else { + const childElement = createDOMElement(props.children); + if (childElement) { + fragment.appendChild(childElement); + } + } + } + return fragment; + } + + const domElement = document.createElement(type as string); + + // 处理 props + Object.keys(props).forEach((prop) => { + if (prop === 'children') { + // 递归处理 children + if (Array.isArray(props.children)) { + props.children.forEach((child) => { + const childElement = createDOMElement(child); + if (childElement) { + domElement.appendChild(childElement); + } + }); + } else if (typeof props.children === 'string') { + domElement.appendChild(document.createTextNode(props.children)); + } else if (typeof props.children === 'object' && props.children !== null) { + const childElement = createDOMElement(props.children); + if (childElement) { + domElement.appendChild(childElement); + } + } + } else if (prop.startsWith('on')) { + // 处理事件监听器 + const eventType = prop.slice(2).toLowerCase(); // 提取事件类型(如 onClick -> click) + domElement.addEventListener(eventType, props[prop]); + } else if (prop === 'style' && typeof props[prop] === 'object') { + // 处理 style 属性 + Object.assign(domElement.style, props[prop]); + } else if (prop === 'dangerouslySetInnerHTML') { + // 处理 dangerouslySetInnerHTML + if (props[prop] && typeof props[prop].__html === 'string') { + domElement.innerHTML = props[prop].__html; + } else { + console.warn('Invalid dangerouslySetInnerHTML content:', props[prop]); + } + } else if (prop === 'ref') { + // React 的 ref 在手动创建 DOM 时没有用处 + console.warn('Ref prop is not supported in manual DOM creation'); + } else if (prop === 'key') { + // React 的 key 属性是用于虚拟 DOM 的,不影响实际 DOM + console.warn('Key prop is not applicable in manual DOM creation'); + } else { + // 处理其他普通属性 + domElement.setAttribute(prop, props[prop]); + } + }); + + return domElement; +} diff --git a/apps/ui/src/utils/extra.ts b/apps/ui/src/utils/extra.ts new file mode 100644 index 0000000..70727c0 --- /dev/null +++ b/apps/ui/src/utils/extra.ts @@ -0,0 +1,11 @@ +export function extractKeysFromBraces(text: string) { + const regex = /\{\{\s*(.*?)\s*\}\}/g; + const keys: string[] = []; + let matches: RegExpExecArray | null; + + while ((matches = regex.exec(text)) !== null) { + keys.push(matches[1]); // 获取{{}}中间的key + } + + return keys; +} diff --git a/apps/ui/src/utils/history.ts b/apps/ui/src/utils/history.ts new file mode 100644 index 0000000..d5edef5 --- /dev/null +++ b/apps/ui/src/utils/history.ts @@ -0,0 +1,22 @@ +type To = string | Location; +type State = { + [key: string]: any; +} & T; +export const push = (to: To, state?: State, refresh = true) => { + const _history = window.history; + if (typeof to === 'string') { + // must key is default, so react navigate can work + _history.pushState({ key: 'default', usr: state }, '', to); + } else { + // const path = to.pathname; + _history.pushState({ key: 'default', usr: state }, '', to.pathname); + } + // must dispatch popstate event, so react navigate can work + refresh && window.dispatchEvent(new Event('popstate')); +}; +export const history = { + push, +}; + +// import { createBrowserHistory } from 'history'; +// export const history = createBrowserHistory(); \ No newline at end of file diff --git a/apps/ui/src/utils/index.ts b/apps/ui/src/utils/index.ts new file mode 100644 index 0000000..66907db --- /dev/null +++ b/apps/ui/src/utils/index.ts @@ -0,0 +1,7 @@ +export * from './css'; +export * from './extra'; +export * from './history'; +export * from './is-null'; +export * from './nanoid'; +export * from './store'; +export * from './query-el'; diff --git a/apps/ui/src/utils/is-null.ts b/apps/ui/src/utils/is-null.ts new file mode 100644 index 0000000..39d63f5 --- /dev/null +++ b/apps/ui/src/utils/is-null.ts @@ -0,0 +1,9 @@ +export const isObjectNull = (value: any) => { + if (value === null || value === undefined) { + return true; + } + if (JSON.stringify(value) === '{}') { + return true; + } + return false; +}; diff --git a/apps/ui/src/utils/nanoid.ts b/apps/ui/src/utils/nanoid.ts new file mode 100644 index 0000000..28b3002 --- /dev/null +++ b/apps/ui/src/utils/nanoid.ts @@ -0,0 +1,14 @@ +import { customAlphabet } from 'nanoid'; +// 全小写的字母和数字 +const alphabetLetter = 'abcdefghijklmnopqrstuvwxyz'; +const alphabet = '0123456789abcdefghijklmnopqrstuvwxyz'; +export const alphabetLetterAll = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; + +export const generateId6 = customAlphabet(alphabet, 6); +export const customNanoid = customAlphabet(alphabetLetterAll, 12); +export const generateId = (size = 6) => { + return 'b-' + generateId6(size); +}; +export const generate = (size = 6) => { + return customNanoid(size); +}; diff --git a/apps/ui/src/utils/query-el.ts b/apps/ui/src/utils/query-el.ts new file mode 100644 index 0000000..4c73595 --- /dev/null +++ b/apps/ui/src/utils/query-el.ts @@ -0,0 +1,54 @@ +import { obj2css, ObjCss } from './css'; +import parse from 'style-to-object'; +export type SelectEl = string | HTMLDivElement; +export const querySelector = (el?: string | HTMLDivElement): HTMLDivElement | null => { + if (!el) { + return null; + } + if (typeof el === 'string') { + return document.querySelector(el) as HTMLDivElement; + } + return el; +}; + +export type ElStyle = ObjCss | string; +/** + * el add class and style + * @param el + * @param className + * @param style + * @returns + */ +export const elAddCS = (el: HTMLDivElement, className?: string, style?: ElStyle) => { + if (!el) return; + if (className) { + el.classList.add(className); + } + if (style && typeof style === 'string') { + el.style.cssText = style; + } else if (style) { + obj2css(el, style as ObjCss); + } +}; + +/** + * 添加style的同时保留默认的的style + * @param el + * @param className + * @param style + * @param defaultStyle + * @returns + */ +export const elAddCS2 = (el: HTMLDivElement, className?: string, style?: ElStyle, defaultStyle?: ObjCss) => { + if (!el) return; + if (className) { + el.classList.add(className); + } + let _style: ObjCss = { ...defaultStyle }; + if (style && typeof style === 'string') { + _style = { ...defaultStyle, ...parse(style) }; + } else if (style && typeof style === 'object') { + _style = { ...defaultStyle, ...style }; + } + obj2css(el, _style); +}; diff --git a/apps/ui/src/utils/store.ts b/apps/ui/src/utils/store.ts new file mode 100644 index 0000000..2bf6460 --- /dev/null +++ b/apps/ui/src/utils/store.ts @@ -0,0 +1,3 @@ +import { createStore } from 'zustand/vanilla'; + +export { createStore }; diff --git a/apps/ui/tsconfig.json b/apps/ui/tsconfig.json new file mode 100644 index 0000000..cea3ee7 --- /dev/null +++ b/apps/ui/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "target": "ESNext", + "module": "ESNext", + "lib": [ + "DOM", + "ESNext" + ], + "moduleResolution": "Node", + "declaration": true, + "esModuleInterop": true, + "skipLibCheck": true, + "outDir": "./dist", + "rootDir": "./src" + }, + "include": [ + "src" + ], + "exclude": [ + "node_modules", + "dist" + ] +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index eee4519..5ea5056 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -69,7 +69,72 @@ importers: apps/store: {} - apps/ui: {} + apps/ui: + dependencies: + dayjs: + specifier: ^1.11.13 + version: 1.11.13 + lodash-es: + specifier: ^4.17.21 + version: 4.17.21 + style-to-object: + specifier: ^1.0.8 + version: 1.0.8 + devDependencies: + '@emotion/serialize': + specifier: ^1.3.1 + version: 1.3.2 + '@rollup/plugin-commonjs': + specifier: ^28.0.1 + version: 28.0.1(rollup@4.24.0) + '@rollup/plugin-node-resolve': + specifier: ^15.2.3 + version: 15.3.0(rollup@4.24.0) + '@rollup/plugin-terser': + specifier: ^0.4.4 + version: 0.4.4(rollup@4.24.0) + '@rollup/plugin-typescript': + specifier: ^11.1.6 + version: 11.1.6(rollup@4.24.0)(tslib@2.8.0)(typescript@5.6.3) + '@types/postcss-import': + specifier: ^14.0.3 + version: 14.0.3 + '@types/react': + specifier: ^18.3.8 + version: 18.3.11 + autoprefixer: + specifier: ^10.4.20 + version: 10.4.20(postcss@8.4.47) + cross-env: + specifier: ^7.0.3 + version: 7.0.3 + cssnano: + specifier: ^7.0.6 + version: 7.0.6(postcss@8.4.47) + immer: + specifier: ^10.1.1 + version: 10.1.1 + nanoid: + specifier: ^5.0.7 + version: 5.0.8 + postcss-import: + specifier: ^16.1.0 + version: 16.1.0(postcss@8.4.47) + rollup: + specifier: ^4.22.2 + version: 4.24.0 + rollup-plugin-postcss: + specifier: ^4.0.2 + version: 4.0.2(postcss@8.4.47) + ts-lib: + specifier: ^0.0.5 + version: 0.0.5 + typescript: + specifier: ^5.6.2 + version: 5.6.3 + zustand: + specifier: 5.0.0-rc.2 + version: 5.0.0-rc.2(@types/react@18.3.11)(immer@10.1.1)(react@18.3.1) packages: @@ -100,6 +165,21 @@ packages: resolution: {integrity: sha512-7bPIliISedeIpnVKbzktysFYW5n56bN91kxuOj1XXKixmjbUHRUMvcXd4K2liN6MiR5ZqJtmtcPsZ6CebbGlEA==} engines: {node: '>=16.0.0', yarn: '>=1.22.18'} + '@emotion/hash@0.9.2': + resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} + + '@emotion/memoize@0.9.0': + resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} + + '@emotion/serialize@1.3.2': + resolution: {integrity: sha512-grVnMvVPK9yUVE6rkKfAJlYZgo0cu3l9iMC77V7DW6E1DUIrU68pSEXRmFZFOFB1QFo57TncmOcvcbMDWsL4yA==} + + '@emotion/unitless@0.10.0': + resolution: {integrity: sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==} + + '@emotion/utils@1.4.1': + resolution: {integrity: sha512-BymCXzCG3r72VKJxaYVwOXATqXIZ85cuvg0YOUDxMGNrKc1DJRZk8MgV5wyXRyEayIMd4FuXJIUgTBXvDNW5cA==} + '@esbuild/aix-ppc64@0.21.5': resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} @@ -432,6 +512,55 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} + '@rollup/plugin-commonjs@28.0.1': + resolution: {integrity: sha512-+tNWdlWKbpB3WgBN7ijjYkq9X5uhjmcvyjEght4NmH5fAU++zfQzAJ6wumLS+dNcvwEZhKx2Z+skY8m7v0wGSA==} + engines: {node: '>=16.0.0 || 14 >= 14.17'} + peerDependencies: + rollup: ^2.68.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-node-resolve@15.3.0': + resolution: {integrity: sha512-9eO5McEICxMzJpDW9OnMYSv4Sta3hmt7VtBFz5zR9273suNOydOyq/FrGeGy+KsTRFm8w0SLVhzig2ILFT63Ag==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.78.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-terser@0.4.4': + resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-typescript@11.1.6': + resolution: {integrity: sha512-R92yOmIACgYdJ7dJ97p4K69I8gg6IEHt8M7dUBxN3W6nrO8uUxX5ixl0yU/N3aZTi8WhPuICvOHXQvF6FaykAA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.14.0||^3.0.0||^4.0.0 + tslib: '*' + typescript: '>=3.7.0' + peerDependenciesMeta: + rollup: + optional: true + tslib: + optional: true + + '@rollup/pluginutils@5.1.3': + resolution: {integrity: sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + '@rollup/rollup-android-arm-eabi@4.24.0': resolution: {integrity: sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==} cpu: [arm] @@ -784,6 +913,10 @@ packages: peerDependencies: '@testing-library/dom': '>=7.21.4' + '@trysound/sax@0.2.0': + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} + engines: {node: '>=10.13.0'} + '@types/aria-query@5.0.4': resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} @@ -829,6 +962,9 @@ packages: '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + '@types/postcss-import@14.0.3': + resolution: {integrity: sha512-raZhRVTf6Vw5+QbmQ7LOHSDML71A5rj4+EqDzAbrZPfxfoGzFxMHRCq16VlddGIZpHELw0BG4G0YE2ANkdZiIQ==} + '@types/prop-types@15.7.13': resolution: {integrity: sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==} @@ -841,6 +977,9 @@ packages: '@types/react@18.3.11': resolution: {integrity: sha512-r6QZ069rFTjrEYgFdOck1gK7FLVsgJE7tTz0pQBczlBNUhBNk0MQH4UbnFSwjpQLMkLzgqvBBa+qGpLje16eTQ==} + '@types/resolve@1.20.2': + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + '@types/semver@7.5.8': resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} @@ -1095,6 +1234,9 @@ packages: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} + caniuse-api@3.0.0: + resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} + caniuse-lite@1.0.30001669: resolution: {integrity: sha512-DlWzFDJqstqtIVx1zeSpIMLjunf5SmwOw0N2Ck/QSQdS8PLS4+9HrLaYei4w8BIAL7IB/UEDu889d8vhCTPA0w==} @@ -1162,6 +1304,9 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} @@ -1172,13 +1317,23 @@ packages: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + commander@8.3.0: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + concat-with-sourcemaps@1.1.0: + resolution: {integrity: sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==} + constants-browserify@1.0.0: resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==} @@ -1210,10 +1365,27 @@ packages: typescript: optional: true + cross-env@7.0.3: + resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} + engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} + hasBin: true + cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} + css-declaration-sorter@6.4.1: + resolution: {integrity: sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==} + engines: {node: ^10 || ^12 || >=14} + peerDependencies: + postcss: ^8.0.9 + + css-declaration-sorter@7.2.0: + resolution: {integrity: sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.0.9 + css-loader@6.11.0: resolution: {integrity: sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==} engines: {node: '>= 12.13.0'} @@ -1229,6 +1401,21 @@ packages: css-select@4.3.0: resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + css-select@5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + + css-tree@1.1.3: + resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} + engines: {node: '>=8.0.0'} + + css-tree@2.2.1: + resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + + css-tree@2.3.1: + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + css-what@6.1.0: resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} engines: {node: '>= 6'} @@ -1241,6 +1428,50 @@ packages: engines: {node: '>=4'} hasBin: true + cssnano-preset-default@5.2.14: + resolution: {integrity: sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + cssnano-preset-default@7.0.6: + resolution: {integrity: sha512-ZzrgYupYxEvdGGuqL+JKOY70s7+saoNlHSCK/OGn1vB2pQK8KSET8jvenzItcY+kA7NoWvfbb/YhlzuzNKjOhQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + cssnano-utils@3.1.0: + resolution: {integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + cssnano-utils@5.0.0: + resolution: {integrity: sha512-Uij0Xdxc24L6SirFr25MlwC2rCFX6scyUmuKpzI+JQ7cyqDEwD42fJ0xfB3yLfOnRDU5LKGgjQ9FA6LYh76GWQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + cssnano@5.1.15: + resolution: {integrity: sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + cssnano@7.0.6: + resolution: {integrity: sha512-54woqx8SCbp8HwvNZYn68ZFAepuouZW4lTwiMVnBErM3VkO7/Sd4oTOt3Zz3bPx3kxQ36aISppyXj2Md4lg8bw==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + csso@4.2.0: + resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} + engines: {node: '>=8.0.0'} + + csso@5.0.5: + resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} @@ -1310,6 +1541,9 @@ packages: dom-serializer@1.4.1: resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + domelementtype@2.3.0: resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} @@ -1317,9 +1551,16 @@ packages: resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} engines: {node: '>= 4'} + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + domutils@2.8.0: resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + dot-case@3.0.4: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} @@ -1353,6 +1594,10 @@ packages: entities@2.2.0: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} @@ -1418,6 +1663,12 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} + estree-walker@0.6.1: + resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} @@ -1425,6 +1676,9 @@ packages: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} @@ -1449,6 +1703,14 @@ packages: fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fdir@6.4.2: + resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + filesize@10.1.6: resolution: {integrity: sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w==} engines: {node: '>= 10.4.0'} @@ -1505,6 +1767,9 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + generic-names@4.0.0: + resolution: {integrity: sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==} + get-intrinsic@1.2.4: resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} engines: {node: '>= 0.4'} @@ -1610,16 +1875,30 @@ packages: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} + icss-replace-symbols@1.1.0: + resolution: {integrity: sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==} + icss-utils@5.1.0: resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 + immer@10.1.1: + resolution: {integrity: sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==} + + import-cwd@3.0.0: + resolution: {integrity: sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==} + engines: {node: '>=8'} + import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} + import-from@3.0.0: + resolution: {integrity: sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==} + engines: {node: '>=8'} + indent-string@4.0.0: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} @@ -1678,10 +1957,16 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + is-reference@1.2.1: + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + is-typed-array@1.1.13: resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} engines: {node: '>= 0.4'} @@ -1742,9 +2027,22 @@ packages: resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} engines: {node: '>=6.11.5'} + loader-utils@3.3.1: + resolution: {integrity: sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==} + engines: {node: '>= 12.13.0'} + lodash-es@4.17.21: resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + + lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} @@ -1777,6 +2075,15 @@ packages: peerDependencies: react: '>= 0.14.0' + mdn-data@2.0.14: + resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + + mdn-data@2.0.28: + resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} + + mdn-data@2.0.30: + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + media-typer@0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} @@ -1854,6 +2161,11 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + nanoid@5.0.8: + resolution: {integrity: sha512-TcJPw+9RV9dibz1hHUzlLVy8N4X9TnwirAjrU08Juo6BNKggzVfP2ZJ/3ZUSq15Xl5i85i+Z89XBO90pB2PghQ==} + engines: {node: ^18 || >=20} + hasBin: true + negotiator@0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} @@ -1878,6 +2190,10 @@ packages: resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} engines: {node: '>=0.10.0'} + normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} @@ -1901,6 +2217,18 @@ packages: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} + p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + + p-queue@6.6.2: + resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} + engines: {node: '>=8'} + + p-timeout@3.2.0: + resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} + engines: {node: '>=8'} + package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} @@ -1957,10 +2285,18 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} + pify@5.0.0: + resolution: {integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==} + engines: {node: '>=10'} + pirates@4.0.6: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} @@ -1973,18 +2309,119 @@ packages: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} engines: {node: '>= 0.4'} + postcss-calc@10.0.2: + resolution: {integrity: sha512-DT/Wwm6fCKgpYVI7ZEWuPJ4az8hiEHtCUeYjZXqU7Ou4QqYh1Df2yCQ7Ca6N7xqKPFkxN3fhf+u9KSoOCJNAjg==} + engines: {node: ^18.12 || ^20.9 || >=22.0} + peerDependencies: + postcss: ^8.4.38 + + postcss-calc@8.2.4: + resolution: {integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==} + peerDependencies: + postcss: ^8.2.2 + + postcss-colormin@5.3.1: + resolution: {integrity: sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-colormin@7.0.2: + resolution: {integrity: sha512-YntRXNngcvEvDbEjTdRWGU606eZvB5prmHG4BF0yLmVpamXbpsRJzevyy6MZVyuecgzI2AWAlvFi8DAeCqwpvA==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-convert-values@5.1.3: + resolution: {integrity: sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-convert-values@7.0.4: + resolution: {integrity: sha512-e2LSXPqEHVW6aoGbjV9RsSSNDO3A0rZLCBxN24zvxF25WknMPpX8Dm9UxxThyEbaytzggRuZxaGXqaOhxQ514Q==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-discard-comments@5.1.2: + resolution: {integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-discard-comments@7.0.3: + resolution: {integrity: sha512-q6fjd4WU4afNhWOA2WltHgCbkRhZPgQe7cXF74fuVB/ge4QbM9HEaOIzGSiMvM+g/cOsNAUGdf2JDzqA2F8iLA==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-discard-duplicates@5.1.0: + resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-discard-duplicates@7.0.1: + resolution: {integrity: sha512-oZA+v8Jkpu1ct/xbbrntHRsfLGuzoP+cpt0nJe5ED2FQF8n8bJtn7Bo28jSmBYwqgqnqkuSXJfSUEE7if4nClQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-discard-empty@5.1.1: + resolution: {integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-discard-empty@7.0.0: + resolution: {integrity: sha512-e+QzoReTZ8IAwhnSdp/++7gBZ/F+nBq9y6PomfwORfP7q9nBpK5AMP64kOt0bA+lShBFbBDcgpJ3X4etHg4lzA==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-discard-overridden@5.1.0: + resolution: {integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-discard-overridden@7.0.0: + resolution: {integrity: sha512-GmNAzx88u3k2+sBTZrJSDauR0ccpE24omTQCVmaTTZFz1du6AasspjaUPMJ2ud4RslZpoFKyf+6MSPETLojc6w==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + postcss-import@15.1.0: resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} engines: {node: '>=14.0.0'} peerDependencies: postcss: ^8.0.0 + postcss-import@16.1.0: + resolution: {integrity: sha512-7hsAZ4xGXl4MW+OKEWCnF6T5jqBw80/EE9aXg1r2yyn1RsVEU8EtKXbijEODa+rg7iih4bKf7vlvTGYR4CnPNg==} + engines: {node: '>=18.0.0'} + peerDependencies: + postcss: ^8.0.0 + postcss-js@4.0.1: resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} engines: {node: ^12 || ^14 || >= 16} peerDependencies: postcss: ^8.4.21 + postcss-load-config@3.1.4: + resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} + engines: {node: '>= 10'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + postcss-load-config@4.0.2: resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} engines: {node: '>= 14'} @@ -2010,6 +2447,78 @@ packages: webpack: optional: true + postcss-merge-longhand@5.1.7: + resolution: {integrity: sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-merge-longhand@7.0.4: + resolution: {integrity: sha512-zer1KoZA54Q8RVHKOY5vMke0cCdNxMP3KBfDerjH/BYHh4nCIh+1Yy0t1pAEQF18ac/4z3OFclO+ZVH8azjR4A==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-merge-rules@5.1.4: + resolution: {integrity: sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-merge-rules@7.0.4: + resolution: {integrity: sha512-ZsaamiMVu7uBYsIdGtKJ64PkcQt6Pcpep/uO90EpLS3dxJi6OXamIobTYcImyXGoW0Wpugh7DSD3XzxZS9JCPg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-minify-font-values@5.1.0: + resolution: {integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-minify-font-values@7.0.0: + resolution: {integrity: sha512-2ckkZtgT0zG8SMc5aoNwtm5234eUx1GGFJKf2b1bSp8UflqaeFzR50lid4PfqVI9NtGqJ2J4Y7fwvnP/u1cQog==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-minify-gradients@5.1.1: + resolution: {integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-minify-gradients@7.0.0: + resolution: {integrity: sha512-pdUIIdj/C93ryCHew0UgBnL2DtUS3hfFa5XtERrs4x+hmpMYGhbzo6l/Ir5de41O0GaKVpK1ZbDNXSY6GkXvtg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-minify-params@5.1.4: + resolution: {integrity: sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-minify-params@7.0.2: + resolution: {integrity: sha512-nyqVLu4MFl9df32zTsdcLqCFfE/z2+f8GE1KHPxWOAmegSo6lpV2GNy5XQvrzwbLmiU7d+fYay4cwto1oNdAaQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-minify-selectors@5.2.1: + resolution: {integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-minify-selectors@7.0.4: + resolution: {integrity: sha512-JG55VADcNb4xFCf75hXkzc1rNeURhlo7ugf6JjiiKRfMsKlDzN9CXHZDyiG6x/zGchpjQS+UAgb1d4nqXqOpmA==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + postcss-modules-extract-imports@3.1.0: resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} engines: {node: ^10 || ^12 || >= 14} @@ -2034,16 +2543,189 @@ packages: peerDependencies: postcss: ^8.1.0 + postcss-modules@4.3.1: + resolution: {integrity: sha512-ItUhSUxBBdNamkT3KzIZwYNNRFKmkJrofvC2nWab3CPKhYBQ1f27XXh1PAPE27Psx58jeelPsxWB/+og+KEH0Q==} + peerDependencies: + postcss: ^8.0.0 + postcss-nested@6.2.0: resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} engines: {node: '>=12.0'} peerDependencies: postcss: ^8.2.14 + postcss-normalize-charset@5.1.0: + resolution: {integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-charset@7.0.0: + resolution: {integrity: sha512-ABisNUXMeZeDNzCQxPxBCkXexvBrUHV+p7/BXOY+ulxkcjUZO0cp8ekGBwvIh2LbCwnWbyMPNJVtBSdyhM2zYQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-display-values@5.1.0: + resolution: {integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-display-values@7.0.0: + resolution: {integrity: sha512-lnFZzNPeDf5uGMPYgGOw7v0BfB45+irSRz9gHQStdkkhiM0gTfvWkWB5BMxpn0OqgOQuZG/mRlZyJxp0EImr2Q==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-positions@5.1.1: + resolution: {integrity: sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-positions@7.0.0: + resolution: {integrity: sha512-I0yt8wX529UKIGs2y/9Ybs2CelSvItfmvg/DBIjTnoUSrPxSV7Z0yZ8ShSVtKNaV/wAY+m7bgtyVQLhB00A1NQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-repeat-style@5.1.1: + resolution: {integrity: sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-repeat-style@7.0.0: + resolution: {integrity: sha512-o3uSGYH+2q30ieM3ppu9GTjSXIzOrRdCUn8UOMGNw7Af61bmurHTWI87hRybrP6xDHvOe5WlAj3XzN6vEO8jLw==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-string@5.1.0: + resolution: {integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-string@7.0.0: + resolution: {integrity: sha512-w/qzL212DFVOpMy3UGyxrND+Kb0fvCiBBujiaONIihq7VvtC7bswjWgKQU/w4VcRyDD8gpfqUiBQ4DUOwEJ6Qg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-timing-functions@5.1.0: + resolution: {integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-timing-functions@7.0.0: + resolution: {integrity: sha512-tNgw3YV0LYoRwg43N3lTe3AEWZ66W7Dh7lVEpJbHoKOuHc1sLrzMLMFjP8SNULHaykzsonUEDbKedv8C+7ej6g==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-unicode@5.1.1: + resolution: {integrity: sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-unicode@7.0.2: + resolution: {integrity: sha512-ztisabK5C/+ZWBdYC+Y9JCkp3M9qBv/XFvDtSw0d/XwfT3UaKeW/YTm/MD/QrPNxuecia46vkfEhewjwcYFjkg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-url@5.1.0: + resolution: {integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-url@7.0.0: + resolution: {integrity: sha512-+d7+PpE+jyPX1hDQZYG+NaFD+Nd2ris6r8fPTBAjE8z/U41n/bib3vze8x7rKs5H1uEw5ppe9IojewouHk0klQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-whitespace@5.1.1: + resolution: {integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-normalize-whitespace@7.0.0: + resolution: {integrity: sha512-37/toN4wwZErqohedXYqWgvcHUGlT8O/m2jVkAfAe9Bd4MzRqlBmXrJRePH0e9Wgnz2X7KymTgTOaaFizQe3AQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-ordered-values@5.1.3: + resolution: {integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-ordered-values@7.0.1: + resolution: {integrity: sha512-irWScWRL6nRzYmBOXReIKch75RRhNS86UPUAxXdmW/l0FcAsg0lvAXQCby/1lymxn/o0gVa6Rv/0f03eJOwHxw==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-reduce-initial@5.1.2: + resolution: {integrity: sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-reduce-initial@7.0.2: + resolution: {integrity: sha512-pOnu9zqQww7dEKf62Nuju6JgsW2V0KRNBHxeKohU+JkHd/GAH5uvoObqFLqkeB2n20mr6yrlWDvo5UBU5GnkfA==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + + postcss-reduce-transforms@5.1.0: + resolution: {integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-reduce-transforms@7.0.0: + resolution: {integrity: sha512-pnt1HKKZ07/idH8cpATX/ujMbtOGhUfE+m8gbqwJE05aTaNw8gbo34a2e3if0xc0dlu75sUOiqvwCGY3fzOHew==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + postcss-selector-parser@6.1.2: resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} engines: {node: '>=4'} + postcss-svgo@5.1.0: + resolution: {integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-svgo@7.0.1: + resolution: {integrity: sha512-0WBUlSL4lhD9rA5k1e5D8EN5wCEyZD6HJk0jIvRxl+FDVOMlJ7DePHYWGGVc5QRqrJ3/06FTXM0bxjmJpmTPSA==} + engines: {node: ^18.12.0 || ^20.9.0 || >= 18} + peerDependencies: + postcss: ^8.4.31 + + postcss-unique-selectors@5.1.1: + resolution: {integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-unique-selectors@7.0.3: + resolution: {integrity: sha512-J+58u5Ic5T1QjP/LDV9g3Cx4CNOgB5vz+kM6+OxHHhFACdcDeKhBXjQmB7fnIZM12YSTvsL0Opwco83DmacW2g==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} @@ -2062,6 +2744,10 @@ packages: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} + promise.series@0.2.0: + resolution: {integrity: sha512-VWQJyU2bcDTgZw8kpfBpB/ejZASlCrzwz5f2hjb/zlujOEB4oeiAhHygAWq8ubsX2GVkD4kCU5V2dwOTaCY5EQ==} + engines: {node: '>=0.12'} + proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -2154,6 +2840,10 @@ packages: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + resolve@1.22.8: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true @@ -2162,6 +2852,15 @@ packages: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + rollup-plugin-postcss@4.0.2: + resolution: {integrity: sha512-05EaY6zvZdmvPUDi3uCcAQoESDcYnv8ogJJQRp6V5kZ6J6P7uAVJlrTZcaaA20wTH527YTnKfkAoPxWI/jPp4w==} + engines: {node: '>=10'} + peerDependencies: + postcss: 8.x + + rollup-pluginutils@2.8.2: + resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==} + rollup@4.24.0: resolution: {integrity: sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -2173,6 +2872,9 @@ packages: safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safe-identifier@0.4.2: + resolution: {integrity: sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==} + safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -2226,6 +2928,9 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + smob@1.5.0: + resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} @@ -2240,6 +2945,10 @@ packages: space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + stable@0.1.8: + resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} + deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' + statuses@2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} @@ -2248,6 +2957,9 @@ packages: resolution: {integrity: sha512-9GVbtej6ZzPRUM7KRQ7848506FfHrUiJGqPuIQdoSJd09EmuEoLjmLAgEOmrHBQKgGYMaM7Vh9GsTLim6vwZTQ==} hasBin: true + string-hash@1.1.3: + resolution: {integrity: sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -2268,6 +2980,9 @@ packages: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} + style-inject@0.3.0: + resolution: {integrity: sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw==} + style-loader@3.3.4: resolution: {integrity: sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==} engines: {node: '>= 12.13.0'} @@ -2277,6 +2992,18 @@ packages: style-to-object@1.0.8: resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==} + stylehacks@5.1.1: + resolution: {integrity: sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + stylehacks@7.0.4: + resolution: {integrity: sha512-i4zfNrGMt9SB4xRK9L83rlsFCgdGANfeDAYacO1pkqcE7cRHPdWHwnKZVz7WY17Veq/FvyYsRAU++Ga+qDFIww==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.31 + sucrase@3.35.0: resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} engines: {node: '>=16 || 14 >=14.17'} @@ -2298,6 +3025,16 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + svgo@2.8.0: + resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==} + engines: {node: '>=10.13.0'} + hasBin: true + + svgo@3.3.2: + resolution: {integrity: sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==} + engines: {node: '>=14.0.0'} + hasBin: true + swc-loader@0.2.6: resolution: {integrity: sha512-9Zi9UP2YmDpgmQVbyOPJClY0dwf58JDyDMQ7uRc4krmc72twNI2fvlBWHLqVekBpPc7h5NJkGVT1zNDxFrqhvg==} peerDependencies: @@ -2373,6 +3110,9 @@ packages: ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + ts-lib@0.0.5: + resolution: {integrity: sha512-pBLcwddLU22ib+vOAzhmTVqQZVN6FD8LtI0Rq4W6BZMOwhOpXqkKRi8f7P5F8KkuPzeunpimLbL0jznWsBeQHg==} + tslib@2.8.0: resolution: {integrity: sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==} @@ -2557,6 +3297,24 @@ packages: engines: {node: '>= 14'} hasBin: true + zustand@5.0.0-rc.2: + resolution: {integrity: sha512-o2Nwuvnk8vQBX7CcHL8WfFkZNJdxB/VKeWw0tNglw8p4cypsZ3tRT7rTRTDNeUPFS0qaMBRSKe+fVwL5xpcE3A==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=18.0.0' + immer: '>=9.0.6' + react: '>=18.0.0' + use-sync-external-store: '>=1.2.0' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + use-sync-external-store: + optional: true + snapshots: '@adobe/css-tools@4.4.0': {} @@ -2593,6 +3351,22 @@ snapshots: - '@chromatic-com/playwright' - react + '@emotion/hash@0.9.2': {} + + '@emotion/memoize@0.9.0': {} + + '@emotion/serialize@1.3.2': + dependencies: + '@emotion/hash': 0.9.2 + '@emotion/memoize': 0.9.0 + '@emotion/unitless': 0.10.0 + '@emotion/utils': 1.4.1 + csstype: 3.1.3 + + '@emotion/unitless@0.10.0': {} + + '@emotion/utils@1.4.1': {} + '@esbuild/aix-ppc64@0.21.5': optional: true @@ -2792,6 +3566,53 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true + '@rollup/plugin-commonjs@28.0.1(rollup@4.24.0)': + dependencies: + '@rollup/pluginutils': 5.1.3(rollup@4.24.0) + commondir: 1.0.1 + estree-walker: 2.0.2 + fdir: 6.4.2(picomatch@4.0.2) + is-reference: 1.2.1 + magic-string: 0.30.12 + picomatch: 4.0.2 + optionalDependencies: + rollup: 4.24.0 + + '@rollup/plugin-node-resolve@15.3.0(rollup@4.24.0)': + dependencies: + '@rollup/pluginutils': 5.1.3(rollup@4.24.0) + '@types/resolve': 1.20.2 + deepmerge: 4.3.1 + is-module: 1.0.0 + resolve: 1.22.8 + optionalDependencies: + rollup: 4.24.0 + + '@rollup/plugin-terser@0.4.4(rollup@4.24.0)': + dependencies: + serialize-javascript: 6.0.2 + smob: 1.5.0 + terser: 5.36.0 + optionalDependencies: + rollup: 4.24.0 + + '@rollup/plugin-typescript@11.1.6(rollup@4.24.0)(tslib@2.8.0)(typescript@5.6.3)': + dependencies: + '@rollup/pluginutils': 5.1.3(rollup@4.24.0) + resolve: 1.22.8 + typescript: 5.6.3 + optionalDependencies: + rollup: 4.24.0 + tslib: 2.8.0 + + '@rollup/pluginutils@5.1.3(rollup@4.24.0)': + dependencies: + '@types/estree': 1.0.6 + estree-walker: 2.0.2 + picomatch: 4.0.2 + optionalDependencies: + rollup: 4.24.0 + '@rollup/rollup-android-arm-eabi@4.24.0': optional: true @@ -3214,6 +4035,8 @@ snapshots: dependencies: '@testing-library/dom': 10.4.0 + '@trysound/sax@0.2.0': {} + '@types/aria-query@5.0.4': {} '@types/body-parser@1.19.5': @@ -3263,6 +4086,10 @@ snapshots: '@types/parse-json@4.0.2': {} + '@types/postcss-import@14.0.3': + dependencies: + postcss: 8.4.47 + '@types/prop-types@15.7.13': {} '@types/qs@6.9.16': {} @@ -3274,6 +4101,8 @@ snapshots: '@types/prop-types': 15.7.13 csstype: 3.1.3 + '@types/resolve@1.20.2': {} + '@types/semver@7.5.8': {} '@types/send@0.17.4': @@ -3570,6 +4399,13 @@ snapshots: camelcase-css@2.0.1: {} + caniuse-api@3.0.0: + dependencies: + browserslist: 4.24.0 + caniuse-lite: 1.0.30001669 + lodash.memoize: 4.1.2 + lodash.uniq: 4.5.0 + caniuse-lite@1.0.30001669: {} case-sensitive-paths-webpack-plugin@2.4.0: {} @@ -3634,16 +4470,26 @@ snapshots: color-name@1.1.4: {} + colord@2.9.3: {} + colorette@2.0.20: {} commander@2.20.3: {} commander@4.1.1: {} + commander@7.2.0: {} + commander@8.3.0: {} + commondir@1.0.1: {} + concat-map@0.0.1: {} + concat-with-sourcemaps@1.1.0: + dependencies: + source-map: 0.6.1 + constants-browserify@1.0.0: {} content-disposition@0.5.4: @@ -3673,12 +4519,24 @@ snapshots: optionalDependencies: typescript: 5.6.3 + cross-env@7.0.3: + dependencies: + cross-spawn: 7.0.3 + cross-spawn@7.0.3: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 + css-declaration-sorter@6.4.1(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + + css-declaration-sorter@7.2.0(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + css-loader@6.11.0(webpack@5.95.0(@swc/core@1.7.36)(esbuild@0.23.1)): dependencies: icss-utils: 5.1.0(postcss@8.4.47) @@ -3700,12 +4558,131 @@ snapshots: domutils: 2.8.0 nth-check: 2.1.1 + css-select@5.1.0: + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 5.0.3 + domutils: 3.1.0 + nth-check: 2.1.1 + + css-tree@1.1.3: + dependencies: + mdn-data: 2.0.14 + source-map: 0.6.1 + + css-tree@2.2.1: + dependencies: + mdn-data: 2.0.28 + source-map-js: 1.2.1 + + css-tree@2.3.1: + dependencies: + mdn-data: 2.0.30 + source-map-js: 1.2.1 + css-what@6.1.0: {} css.escape@1.5.1: {} cssesc@3.0.0: {} + cssnano-preset-default@5.2.14(postcss@8.4.47): + dependencies: + css-declaration-sorter: 6.4.1(postcss@8.4.47) + cssnano-utils: 3.1.0(postcss@8.4.47) + postcss: 8.4.47 + postcss-calc: 8.2.4(postcss@8.4.47) + postcss-colormin: 5.3.1(postcss@8.4.47) + postcss-convert-values: 5.1.3(postcss@8.4.47) + postcss-discard-comments: 5.1.2(postcss@8.4.47) + postcss-discard-duplicates: 5.1.0(postcss@8.4.47) + postcss-discard-empty: 5.1.1(postcss@8.4.47) + postcss-discard-overridden: 5.1.0(postcss@8.4.47) + postcss-merge-longhand: 5.1.7(postcss@8.4.47) + postcss-merge-rules: 5.1.4(postcss@8.4.47) + postcss-minify-font-values: 5.1.0(postcss@8.4.47) + postcss-minify-gradients: 5.1.1(postcss@8.4.47) + postcss-minify-params: 5.1.4(postcss@8.4.47) + postcss-minify-selectors: 5.2.1(postcss@8.4.47) + postcss-normalize-charset: 5.1.0(postcss@8.4.47) + postcss-normalize-display-values: 5.1.0(postcss@8.4.47) + postcss-normalize-positions: 5.1.1(postcss@8.4.47) + postcss-normalize-repeat-style: 5.1.1(postcss@8.4.47) + postcss-normalize-string: 5.1.0(postcss@8.4.47) + postcss-normalize-timing-functions: 5.1.0(postcss@8.4.47) + postcss-normalize-unicode: 5.1.1(postcss@8.4.47) + postcss-normalize-url: 5.1.0(postcss@8.4.47) + postcss-normalize-whitespace: 5.1.1(postcss@8.4.47) + postcss-ordered-values: 5.1.3(postcss@8.4.47) + postcss-reduce-initial: 5.1.2(postcss@8.4.47) + postcss-reduce-transforms: 5.1.0(postcss@8.4.47) + postcss-svgo: 5.1.0(postcss@8.4.47) + postcss-unique-selectors: 5.1.1(postcss@8.4.47) + + cssnano-preset-default@7.0.6(postcss@8.4.47): + dependencies: + browserslist: 4.24.0 + css-declaration-sorter: 7.2.0(postcss@8.4.47) + cssnano-utils: 5.0.0(postcss@8.4.47) + postcss: 8.4.47 + postcss-calc: 10.0.2(postcss@8.4.47) + postcss-colormin: 7.0.2(postcss@8.4.47) + postcss-convert-values: 7.0.4(postcss@8.4.47) + postcss-discard-comments: 7.0.3(postcss@8.4.47) + postcss-discard-duplicates: 7.0.1(postcss@8.4.47) + postcss-discard-empty: 7.0.0(postcss@8.4.47) + postcss-discard-overridden: 7.0.0(postcss@8.4.47) + postcss-merge-longhand: 7.0.4(postcss@8.4.47) + postcss-merge-rules: 7.0.4(postcss@8.4.47) + postcss-minify-font-values: 7.0.0(postcss@8.4.47) + postcss-minify-gradients: 7.0.0(postcss@8.4.47) + postcss-minify-params: 7.0.2(postcss@8.4.47) + postcss-minify-selectors: 7.0.4(postcss@8.4.47) + postcss-normalize-charset: 7.0.0(postcss@8.4.47) + postcss-normalize-display-values: 7.0.0(postcss@8.4.47) + postcss-normalize-positions: 7.0.0(postcss@8.4.47) + postcss-normalize-repeat-style: 7.0.0(postcss@8.4.47) + postcss-normalize-string: 7.0.0(postcss@8.4.47) + postcss-normalize-timing-functions: 7.0.0(postcss@8.4.47) + postcss-normalize-unicode: 7.0.2(postcss@8.4.47) + postcss-normalize-url: 7.0.0(postcss@8.4.47) + postcss-normalize-whitespace: 7.0.0(postcss@8.4.47) + postcss-ordered-values: 7.0.1(postcss@8.4.47) + postcss-reduce-initial: 7.0.2(postcss@8.4.47) + postcss-reduce-transforms: 7.0.0(postcss@8.4.47) + postcss-svgo: 7.0.1(postcss@8.4.47) + postcss-unique-selectors: 7.0.3(postcss@8.4.47) + + cssnano-utils@3.1.0(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + + cssnano-utils@5.0.0(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + + cssnano@5.1.15(postcss@8.4.47): + dependencies: + cssnano-preset-default: 5.2.14(postcss@8.4.47) + lilconfig: 2.1.0 + postcss: 8.4.47 + yaml: 1.10.2 + + cssnano@7.0.6(postcss@8.4.47): + dependencies: + cssnano-preset-default: 7.0.6(postcss@8.4.47) + lilconfig: 3.1.2 + postcss: 8.4.47 + + csso@4.2.0: + dependencies: + css-tree: 1.1.3 + + csso@5.0.5: + dependencies: + css-tree: 2.2.1 + csstype@3.1.3: {} dayjs@1.11.13: {} @@ -3754,18 +4731,34 @@ snapshots: domhandler: 4.3.1 entities: 2.2.0 + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + domelementtype@2.3.0: {} domhandler@4.3.1: dependencies: domelementtype: 2.3.0 + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + domutils@2.8.0: dependencies: dom-serializer: 1.4.1 domelementtype: 2.3.0 domhandler: 4.3.1 + domutils@3.1.0: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + dot-case@3.0.4: dependencies: no-case: 3.0.4 @@ -3792,6 +4785,8 @@ snapshots: entities@2.2.0: {} + entities@4.5.0: {} + env-paths@2.2.1: {} error-ex@1.3.2: @@ -3887,12 +4882,18 @@ snapshots: estraverse@5.3.0: {} + estree-walker@0.6.1: {} + + estree-walker@2.0.2: {} + estree-walker@3.0.3: dependencies: '@types/estree': 1.0.6 etag@1.8.1: {} + eventemitter3@4.0.7: {} + events@3.3.0: {} express@4.21.1: @@ -3949,6 +4950,10 @@ snapshots: dependencies: reusify: 1.0.4 + fdir@6.4.2(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + filesize@10.1.6: {} fill-range@7.1.1: @@ -4018,6 +5023,10 @@ snapshots: function-bind@1.1.2: {} + generic-names@4.0.0: + dependencies: + loader-utils: 3.3.1 + get-intrinsic@1.2.4: dependencies: es-errors: 1.3.0 @@ -4134,15 +5143,27 @@ snapshots: dependencies: safer-buffer: 2.1.2 + icss-replace-symbols@1.1.0: {} + icss-utils@5.1.0(postcss@8.4.47): dependencies: postcss: 8.4.47 + immer@10.1.1: {} + + import-cwd@3.0.0: + dependencies: + import-from: 3.0.0 + import-fresh@3.3.0: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 + import-from@3.0.0: + dependencies: + resolve-from: 5.0.0 + indent-string@4.0.0: {} inherits@2.0.4: {} @@ -4184,8 +5205,14 @@ snapshots: dependencies: is-extglob: 2.1.1 + is-module@1.0.0: {} + is-number@7.0.0: {} + is-reference@1.2.1: + dependencies: + '@types/estree': 1.0.6 + is-typed-array@1.1.13: dependencies: which-typed-array: 1.1.15 @@ -4238,8 +5265,16 @@ snapshots: loader-runner@4.3.0: {} + loader-utils@3.3.1: {} + lodash-es@4.17.21: {} + lodash.camelcase@4.3.0: {} + + lodash.memoize@4.1.2: {} + + lodash.uniq@4.5.0: {} + lodash@4.17.21: {} loose-envify@1.4.0: @@ -4266,6 +5301,12 @@ snapshots: dependencies: react: 18.3.1 + mdn-data@2.0.14: {} + + mdn-data@2.0.28: {} + + mdn-data@2.0.30: {} + media-typer@0.3.0: {} memfs@3.5.3: @@ -4327,6 +5368,8 @@ snapshots: nanoid@3.3.7: {} + nanoid@5.0.8: {} + negotiator@0.6.3: {} neo-async@2.6.2: {} @@ -4344,6 +5387,8 @@ snapshots: normalize-range@0.1.2: {} + normalize-url@6.1.0: {} + nth-check@2.1.1: dependencies: boolbase: 1.0.0 @@ -4364,6 +5409,17 @@ snapshots: is-docker: 2.2.1 is-wsl: 2.2.0 + p-finally@1.0.0: {} + + p-queue@6.6.2: + dependencies: + eventemitter3: 4.0.7 + p-timeout: 3.2.0 + + p-timeout@3.2.0: + dependencies: + p-finally: 1.0.0 + package-json-from-dist@1.0.1: {} param-case@3.0.4: @@ -4412,8 +5468,12 @@ snapshots: picomatch@2.3.1: {} + picomatch@4.0.2: {} + pify@2.3.0: {} + pify@5.0.0: {} + pirates@4.0.6: {} polished@4.3.1: @@ -4422,6 +5482,79 @@ snapshots: possible-typed-array-names@1.0.0: {} + postcss-calc@10.0.2(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + postcss-selector-parser: 6.1.2 + postcss-value-parser: 4.2.0 + + postcss-calc@8.2.4(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + postcss-selector-parser: 6.1.2 + postcss-value-parser: 4.2.0 + + postcss-colormin@5.3.1(postcss@8.4.47): + dependencies: + browserslist: 4.24.0 + caniuse-api: 3.0.0 + colord: 2.9.3 + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + + postcss-colormin@7.0.2(postcss@8.4.47): + dependencies: + browserslist: 4.24.0 + caniuse-api: 3.0.0 + colord: 2.9.3 + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + + postcss-convert-values@5.1.3(postcss@8.4.47): + dependencies: + browserslist: 4.24.0 + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + + postcss-convert-values@7.0.4(postcss@8.4.47): + dependencies: + browserslist: 4.24.0 + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + + postcss-discard-comments@5.1.2(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + + postcss-discard-comments@7.0.3(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + postcss-selector-parser: 6.1.2 + + postcss-discard-duplicates@5.1.0(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + + postcss-discard-duplicates@7.0.1(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + + postcss-discard-empty@5.1.1(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + + postcss-discard-empty@7.0.0(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + + postcss-discard-overridden@5.1.0(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + + postcss-discard-overridden@7.0.0(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + postcss-import@15.1.0(postcss@8.4.47): dependencies: postcss: 8.4.47 @@ -4429,11 +5562,25 @@ snapshots: read-cache: 1.0.0 resolve: 1.22.8 + postcss-import@16.1.0(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.8 + postcss-js@4.0.1(postcss@8.4.47): dependencies: camelcase-css: 2.0.1 postcss: 8.4.47 + postcss-load-config@3.1.4(postcss@8.4.47): + dependencies: + lilconfig: 2.1.0 + yaml: 1.10.2 + optionalDependencies: + postcss: 8.4.47 + postcss-load-config@4.0.2(postcss@8.4.47): dependencies: lilconfig: 3.1.2 @@ -4452,6 +5599,83 @@ snapshots: transitivePeerDependencies: - typescript + postcss-merge-longhand@5.1.7(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + stylehacks: 5.1.1(postcss@8.4.47) + + postcss-merge-longhand@7.0.4(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + stylehacks: 7.0.4(postcss@8.4.47) + + postcss-merge-rules@5.1.4(postcss@8.4.47): + dependencies: + browserslist: 4.24.0 + caniuse-api: 3.0.0 + cssnano-utils: 3.1.0(postcss@8.4.47) + postcss: 8.4.47 + postcss-selector-parser: 6.1.2 + + postcss-merge-rules@7.0.4(postcss@8.4.47): + dependencies: + browserslist: 4.24.0 + caniuse-api: 3.0.0 + cssnano-utils: 5.0.0(postcss@8.4.47) + postcss: 8.4.47 + postcss-selector-parser: 6.1.2 + + postcss-minify-font-values@5.1.0(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + + postcss-minify-font-values@7.0.0(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + + postcss-minify-gradients@5.1.1(postcss@8.4.47): + dependencies: + colord: 2.9.3 + cssnano-utils: 3.1.0(postcss@8.4.47) + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + + postcss-minify-gradients@7.0.0(postcss@8.4.47): + dependencies: + colord: 2.9.3 + cssnano-utils: 5.0.0(postcss@8.4.47) + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + + postcss-minify-params@5.1.4(postcss@8.4.47): + dependencies: + browserslist: 4.24.0 + cssnano-utils: 3.1.0(postcss@8.4.47) + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + + postcss-minify-params@7.0.2(postcss@8.4.47): + dependencies: + browserslist: 4.24.0 + cssnano-utils: 5.0.0(postcss@8.4.47) + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + + postcss-minify-selectors@5.2.1(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + postcss-selector-parser: 6.1.2 + + postcss-minify-selectors@7.0.4(postcss@8.4.47): + dependencies: + cssesc: 3.0.0 + postcss: 8.4.47 + postcss-selector-parser: 6.1.2 + postcss-modules-extract-imports@3.1.0(postcss@8.4.47): dependencies: postcss: 8.4.47 @@ -4473,16 +5697,175 @@ snapshots: icss-utils: 5.1.0(postcss@8.4.47) postcss: 8.4.47 + postcss-modules@4.3.1(postcss@8.4.47): + dependencies: + generic-names: 4.0.0 + icss-replace-symbols: 1.1.0 + lodash.camelcase: 4.3.0 + postcss: 8.4.47 + postcss-modules-extract-imports: 3.1.0(postcss@8.4.47) + postcss-modules-local-by-default: 4.0.5(postcss@8.4.47) + postcss-modules-scope: 3.2.0(postcss@8.4.47) + postcss-modules-values: 4.0.0(postcss@8.4.47) + string-hash: 1.1.3 + postcss-nested@6.2.0(postcss@8.4.47): dependencies: postcss: 8.4.47 postcss-selector-parser: 6.1.2 + postcss-normalize-charset@5.1.0(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + + postcss-normalize-charset@7.0.0(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + + postcss-normalize-display-values@5.1.0(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + + postcss-normalize-display-values@7.0.0(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + + postcss-normalize-positions@5.1.1(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + + postcss-normalize-positions@7.0.0(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + + postcss-normalize-repeat-style@5.1.1(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + + postcss-normalize-repeat-style@7.0.0(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + + postcss-normalize-string@5.1.0(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + + postcss-normalize-string@7.0.0(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + + postcss-normalize-timing-functions@5.1.0(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + + postcss-normalize-timing-functions@7.0.0(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + + postcss-normalize-unicode@5.1.1(postcss@8.4.47): + dependencies: + browserslist: 4.24.0 + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + + postcss-normalize-unicode@7.0.2(postcss@8.4.47): + dependencies: + browserslist: 4.24.0 + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + + postcss-normalize-url@5.1.0(postcss@8.4.47): + dependencies: + normalize-url: 6.1.0 + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + + postcss-normalize-url@7.0.0(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + + postcss-normalize-whitespace@5.1.1(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + + postcss-normalize-whitespace@7.0.0(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + + postcss-ordered-values@5.1.3(postcss@8.4.47): + dependencies: + cssnano-utils: 3.1.0(postcss@8.4.47) + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + + postcss-ordered-values@7.0.1(postcss@8.4.47): + dependencies: + cssnano-utils: 5.0.0(postcss@8.4.47) + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + + postcss-reduce-initial@5.1.2(postcss@8.4.47): + dependencies: + browserslist: 4.24.0 + caniuse-api: 3.0.0 + postcss: 8.4.47 + + postcss-reduce-initial@7.0.2(postcss@8.4.47): + dependencies: + browserslist: 4.24.0 + caniuse-api: 3.0.0 + postcss: 8.4.47 + + postcss-reduce-transforms@5.1.0(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + + postcss-reduce-transforms@7.0.0(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + postcss-selector-parser@6.1.2: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 + postcss-svgo@5.1.0(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + svgo: 2.8.0 + + postcss-svgo@7.0.1(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + svgo: 3.3.2 + + postcss-unique-selectors@5.1.1(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + postcss-selector-parser: 6.1.2 + + postcss-unique-selectors@7.0.3(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + postcss-selector-parser: 6.1.2 + postcss-value-parser@4.2.0: {} postcss@8.4.47: @@ -4504,6 +5887,8 @@ snapshots: process@0.11.10: {} + promise.series@0.2.0: {} + proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 @@ -4608,6 +5993,8 @@ snapshots: resolve-from@4.0.0: {} + resolve-from@5.0.0: {} + resolve@1.22.8: dependencies: is-core-module: 2.15.1 @@ -4616,6 +6003,29 @@ snapshots: reusify@1.0.4: {} + rollup-plugin-postcss@4.0.2(postcss@8.4.47): + dependencies: + chalk: 4.1.2 + concat-with-sourcemaps: 1.1.0 + cssnano: 5.1.15(postcss@8.4.47) + import-cwd: 3.0.0 + p-queue: 6.6.2 + pify: 5.0.0 + postcss: 8.4.47 + postcss-load-config: 3.1.4(postcss@8.4.47) + postcss-modules: 4.3.1(postcss@8.4.47) + promise.series: 0.2.0 + resolve: 1.22.8 + rollup-pluginutils: 2.8.2 + safe-identifier: 0.4.2 + style-inject: 0.3.0 + transitivePeerDependencies: + - ts-node + + rollup-pluginutils@2.8.2: + dependencies: + estree-walker: 0.6.1 + rollup@4.24.0: dependencies: '@types/estree': 1.0.6 @@ -4644,6 +6054,8 @@ snapshots: safe-buffer@5.2.1: {} + safe-identifier@0.4.2: {} + safer-buffer@2.1.2: {} scheduler@0.23.2: @@ -4722,6 +6134,8 @@ snapshots: signal-exit@4.1.0: {} + smob@1.5.0: {} + source-map-js@1.2.1: {} source-map-support@0.5.21: @@ -4733,6 +6147,8 @@ snapshots: space-separated-tokens@2.0.2: {} + stable@0.1.8: {} + statuses@2.0.1: {} storybook@8.3.6: @@ -4743,6 +6159,8 @@ snapshots: - supports-color - utf-8-validate + string-hash@1.1.3: {} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -4767,6 +6185,8 @@ snapshots: dependencies: min-indent: 1.0.1 + style-inject@0.3.0: {} + style-loader@3.3.4(webpack@5.95.0(@swc/core@1.7.36)(esbuild@0.23.1)): dependencies: webpack: 5.95.0(@swc/core@1.7.36)(esbuild@0.23.1) @@ -4775,6 +6195,18 @@ snapshots: dependencies: inline-style-parser: 0.2.4 + stylehacks@5.1.1(postcss@8.4.47): + dependencies: + browserslist: 4.24.0 + postcss: 8.4.47 + postcss-selector-parser: 6.1.2 + + stylehacks@7.0.4(postcss@8.4.47): + dependencies: + browserslist: 4.24.0 + postcss: 8.4.47 + postcss-selector-parser: 6.1.2 + sucrase@3.35.0: dependencies: '@jridgewell/gen-mapping': 0.3.5 @@ -4799,6 +6231,26 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + svgo@2.8.0: + dependencies: + '@trysound/sax': 0.2.0 + commander: 7.2.0 + css-select: 4.3.0 + css-tree: 1.1.3 + csso: 4.2.0 + picocolors: 1.1.1 + stable: 0.1.8 + + svgo@3.3.2: + dependencies: + '@trysound/sax': 0.2.0 + commander: 7.2.0 + css-select: 5.1.0 + css-tree: 2.3.1 + css-what: 6.1.0 + csso: 5.0.5 + picocolors: 1.1.1 + swc-loader@0.2.6(@swc/core@1.7.36)(webpack@5.95.0(@swc/core@1.7.36)(esbuild@0.23.1)): dependencies: '@swc/core': 1.7.36 @@ -4883,6 +6335,8 @@ snapshots: ts-interface-checker@0.1.13: {} + ts-lib@0.0.5: {} + tslib@2.8.0: {} tween-functions@1.2.0: {} @@ -5051,3 +6505,9 @@ snapshots: yaml@1.10.2: {} yaml@2.6.0: {} + + zustand@5.0.0-rc.2(@types/react@18.3.11)(immer@10.1.1)(react@18.3.1): + optionalDependencies: + '@types/react': 18.3.11 + immer: 10.1.1 + react: 18.3.1