diff --git a/README.md b/README.md index 49c3e67..d2dffbd 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,21 @@ # [ui-lib].Grid -UI Mordern Gridview Library \ No newline at end of file +UI Mordern Gridview Library + +## 1.0.3 +* 调整: [showSortPanel(callback?: Function, layout?: boolean)](Grid.html#showSortPanel) 现支持输入搜索列,已添加的列不会重复显示在下拉数据源中,增加回调函数与 layout 更新复选框。 +* 新增: [onRowChanged(action: "update" | "add" | "remove", items: GridRowItem[], indexes: number | number[])](Grid.html#onRowChanged) - 行发生变化时触发的事件 +### bugs +* 修复: 清空多列排序后列头箭头没有清除的异常。 + +## 1.0.2 +* 新增: [export(compressed: string | boolean, module?: string) : Promise<GridExportData>](Grid.html#export) - 导出已压缩的数据源 + +## 1.0.1 +* 新增: [total: GridRowItem](Grid.html#total) - 获取或设置合计行数据 +* 新增: [showSortPanel()](Grid.html#showSortPanel) - 显示多列排序设置面板 +* 新增: [setItem(index: number, item: GridRowItem)](Grid.html#setItem) - 设置单行数据 +* 新增: [addItem(item: GridRowItem, index?: number): GridRowItem](Grid.html#addItem) - 添加行数据 +* 新增: [addItems(array: GridRowItem[], index?: number) : GridRowItem[]](Grid.html#addItems) - 批量添加行数据 +* 新增: [removeItem(index: number) : GridRowItem](Grid.html#removeItem) - 删除行数据 +* 新增: [removeItems(indexes?: number[]): GridRowItem[]](Grid.html#removeItems) - 批量删除行数据 diff --git a/lib/app.js b/lib/app.js index d2c7480..7e014c9 100644 --- a/lib/app.js +++ b/lib/app.js @@ -2,9 +2,11 @@ import "./app/communications/style.scss"; import CustomerCommunication from "./app/communications/customer"; import InternalComment from "./app/communications/internal"; import CustomerRecordComment from "./app/communications/comments"; +import { createHideMessageTitleButton } from "./app/communications/lib"; export { CustomerCommunication, InternalComment, - CustomerRecordComment + CustomerRecordComment, + createHideMessageTitleButton } \ No newline at end of file diff --git a/lib/app/communications/comments.js b/lib/app/communications/comments.js index 7c47a27..d024446 100644 --- a/lib/app/communications/comments.js +++ b/lib/app/communications/comments.js @@ -1,6 +1,6 @@ import { createElement, setTooltip, createIcon } from "../../ui"; import { r as lang, nullOrEmpty, escapeHtml, escapeEmoji } from "../../utility"; -import { createBox, appendMedia } from "./lib"; +import { createBox, appendMedia, createHideMessageTitleButton, createHideMessageCommentTail } from "./lib"; let r = lang; @@ -25,7 +25,9 @@ export default class CustomerRecordComment { } } - get messageHidden() { return this._var.option.showCommentHidden } + /** + * @param {boolean} flag + */ set messageHidden(flag) { const el = this._var.container.querySelector('.msgadminsetting'); if (el == null) { @@ -62,34 +64,14 @@ export default class CustomerRecordComment { } create() { - const option = this._var.option; const readonly = this._var.option.readonly; - const spanv = createElement('span'); - if (option.userIsAdmin) { - spanv.className = 'msgadminsetting sbutton iconnotview'; - spanv.style.padding = '0px 0px 0px 5px'; - spanv.addEventListener('click', function () { - if (!option.showCommentHidden) { - this.classList.remove('iconnotview'); - this.classList.add('iconview'); - option.showCommentHidden = true; - container.querySelectorAll('.msgsetting').forEach(x => x.style.display = ''); - } else { - this.classList.remove('iconview'); - this.classList.add('iconnotview'); - option.showCommentHidden = false; - container.querySelectorAll('.msgsetting').forEach(x => x.style.display = 'none'); - } - - }); - } const container = createBox( createElement('div', null, createElement('div', div => { div.className = 'title-module'; div.innerText = r('P_CR_COMMENTS', 'Comments'); }, - spanv + createHideMessageTitleButton(this, 'showCommentHidden') ) ), [ @@ -154,11 +136,18 @@ export default class CustomerRecordComment { return this._var.container = container; } - load(data, func) { + load(data, func, hisFunc, keep) { const children = []; if (data?.length > 0) { + const lastVisible = this._var.option.showCommentHidden; for (let comment of data) { const div = createElement('div', 'item-div'); + if (comment.Hidden) { + div.classList.add('hidden-content'); + if (!lastVisible) { + div.style.display = 'none'; + } + } // if (sendto !== '') { // sendto = r('P_CU_SENDTO_COLON', 'Sent To :') + `\n${sendto}`; // } @@ -177,37 +166,19 @@ export default class CustomerRecordComment { } div.append( content, - createElement('div', div => { - div.className = 'item-time'; - }, - createElement('span', span => { - span.className = 'msgsetting sbutton ' + (comment.Hidden ? 'iconnotview' : 'iconview'); - span.style.padding = '0px 0px 0px 5px'; - span.style.fontSize = '12px'; - span.style.display = this._var.option.showCommentHidden ? '' : 'none'; - span.addEventListener('click', function () { - if (this.classList.contains('iconview')) { - func(comment.Id, true); - this.classList.remove('iconview'); - this.classList.add('iconnotview'); - } else { - func(comment.Id, false); - this.classList.remove('iconnotview'); - this.classList.add('iconview'); - } - }); - }), - createElement('span', span => { - span.innerText = comment.SubmitLocalDateStr; - }) - ) + createHideMessageCommentTail( + this, 'showCommentHidden', + comment, 'SubmitLocalDateStr', + func, hisFunc) ); children.push(div); } children[0].style.marginTop = '0'; } + if (this._var.message.children.length > 0) { + this._var.lastTop = this._var.message.scrollTop; + } this._var.message.replaceChildren(...children); - this._var.message.scrollTop = this._var.message.scrollHeight - // setTimeout(() => this._var.message.scrollTop = this._var.message.scrollHeight, 0); + setTimeout(() => this._var.message.scrollTop = keep ? this._var.lastTop : this._var.message.scrollHeight, 0); } } \ No newline at end of file diff --git a/lib/app/communications/customer.js b/lib/app/communications/customer.js index c0fa52d..7fbd896 100644 --- a/lib/app/communications/customer.js +++ b/lib/app/communications/customer.js @@ -1,6 +1,6 @@ import { Grid, GridColumn, createElement, setTooltip, createIcon, createCheckbox, createRadiobox, showAlert, showConfirm, Popup } from "../../ui"; import { r as lang, nullOrEmpty, formatUrl, escapeEmoji, isEmail, isPhone } from "../../utility"; -import { createBox, appendMedia, fileSupported, insertFile, getMessageSendTo, getMessageStatus, updateCustomerName } from "./lib"; +import { createBox, appendMedia, fileSupported, insertFile, getMessageSendTo, getMessageStatus, updateCustomerName, createHideMessageTitleButton, createHideMessageCommentTail } from "./lib"; import { Contact, CustomerRecordContact } from "./contact"; import Follower from "./follower"; @@ -69,7 +69,9 @@ export default class CustomerCommunication { element.dispatchEvent(new Event('change')); } - get messageHidden() { return this._var.option.showMessageHidden } + /** + * @param {boolean} flag + */ set messageHidden(flag) { const el = this._var.container.querySelector('.msgadminsetting'); if (el == null) { @@ -425,24 +427,6 @@ export default class CustomerCommunication { if (option.statusLinkVisible === false) { checkLink.style.display = 'none'; } - const spanv = createElement('span'); - if (option.userIsAdmin) { - spanv.className = 'msgadminsetting sbutton iconnotview'; - spanv.style.padding = '0px 0px 0px 5px'; - spanv.addEventListener('click', function () { - if (!option.showMessageHidden) { - this.classList.remove('iconnotview'); - this.classList.add('iconview'); - option.showMessageHidden = true; - container.querySelectorAll('.msgsetting').forEach(x => x.style.display = ''); - } else { - this.classList.remove('iconview'); - this.classList.add('iconnotview'); - option.showMessageHidden = false; - container.querySelectorAll('.msgsetting').forEach(x => x.style.display = 'none'); - } - }); - } const container = createBox( createElement('div', null, @@ -450,7 +434,7 @@ export default class CustomerCommunication { div.className = 'title-module'; div.innerText = option.title ?? r('P_WO_CUSTOMERCOMMUNICATION', 'Customer Communication'); }, - spanv + createHideMessageTitleButton(this, 'showMessageHidden') ), createElement('div', div => { div.className = 'title-company'; @@ -1179,7 +1163,7 @@ export default class CustomerCommunication { return followers; } - load(data, contacts, followers, func) { + load(data, contacts, followers, func, hisFunc, keep) { const children = []; if (data?.length > 0) { contacts ??= this._var.data.contacts; @@ -1192,45 +1176,52 @@ export default class CustomerCommunication { this._var.contactsUpdated = true; } } - for (let comm of data) { + const lastVisible = this._var.option.showMessageHidden; + for (let comment of data) { const div = createElement('div', 'item-div'); + if (comment.Hidden) { + div.classList.add('hidden-content'); + if (!lastVisible) { + div.style.display = 'none'; + } + } let name; - if (comm.IsReply && contacts?.length > 0) { - const c = isEmail(comm.Sender) ? - contacts.find(c => c.Email === comm.Sender) : - contacts.find(c => c.MobilePhone === comm.Sender); + if (comment.IsReply && contacts?.length > 0) { + const c = isEmail(comment.Sender) ? + contacts.find(c => c.Email === comment.Sender) : + contacts.find(c => c.MobilePhone === comment.Sender); name = c?.Name; } - name ??= comm.IsReply && String(comm.FormatSender) !== '' ? comm.FormatSender : comm.Sender; - const sendto = getMessageSendTo(comm, contacts, followers, r) + name ??= comment.IsReply && String(comment.FormatSender) !== '' ? comment.FormatSender : comment.Sender; + const sendto = getMessageSendTo(comment, contacts, followers, r) div.appendChild(createElement('div', div => { div.className = 'item-poster'; div.innerText = name; - if (!comm.IsReply && sendto?.length > 0) { + if (!comment.IsReply && sendto?.length > 0) { setTooltip(div, sendto); } })); const content = createElement('div', 'item-content'); const mmsParts = createElement('div', div => div.style.display = 'none'); content.appendChild(createElement('span', span => { - if (/https?:\/\//i.test(comm.Message)) { - span.innerHTML = formatUrl(escapeEmoji(comm.Message)); + if (/https?:\/\//i.test(comment.Message)) { + span.innerHTML = formatUrl(escapeEmoji(comment.Message)); } else { - span.innerText = escapeEmoji(comm.Message); + span.innerText = escapeEmoji(comment.Message); } span.appendChild(mmsParts); })); - if (comm.MMSParts?.length > 0) { + if (comment.MMSParts?.length > 0) { mmsParts.style.display = ''; - for (let kv of comm.MMSParts) { + for (let kv of comment.MMSParts) { appendMedia(mmsParts, kv.Key, kv.Value); } } - if (comm.IsReply) { + if (comment.IsReply) { div.classList.add('item-other'); } else { div.classList.add('item-self'); - const [status, text, color, tips] = getMessageStatus(comm, r, this._var); + const [status, text, color, tips] = getMessageStatus(comment, r, this._var); if (status !== -100) { if (color != null) { content.style.backgroundColor = color; @@ -1247,37 +1238,19 @@ export default class CustomerCommunication { } div.append( content, - createElement('div', div => { - div.className = 'item-time'; - }, - createElement('span', span => { - span.className = 'msgsetting sbutton ' + (comm.Hidden ? 'iconnotview' : 'iconview'); - span.style.padding = '0px 0px 0px 5px'; - span.style.fontSize = '12px'; - span.style.display = this._var.option.showMessageHidden ? '' : 'none'; - span.addEventListener('click', function () { - if (this.classList.contains('iconview')) { - func(comm.Id, true); - this.classList.remove('iconview'); - this.classList.add('iconnotview'); - } else { - func(comm.Id, false); - this.classList.remove('iconnotview'); - this.classList.add('iconview'); - } - }); - }), - createElement('span', span => { - span.innerText = comm.TimeStr; - }) - ) + createHideMessageCommentTail( + this, 'showMessageHidden', + comment, 'TimeStr', + func, hisFunc) ); children.push(div); } children[0].style.marginTop = '0'; } + if (this._var.message.children.length > 0) { + this._var.lastTop = this._var.message.scrollTop; + } this._var.message.replaceChildren(...children); - this._var.message.scrollTop = this._var.message.scrollHeight - // setTimeout(() => this._var.message.scrollTop = this._var.message.scrollHeight, 0); + setTimeout(() => this._var.message.scrollTop = keep ? this._var.lastTop : this._var.message.scrollHeight, 0); } } \ No newline at end of file diff --git a/lib/app/communications/internal.js b/lib/app/communications/internal.js index 0949c22..d357506 100644 --- a/lib/app/communications/internal.js +++ b/lib/app/communications/internal.js @@ -1,7 +1,7 @@ import { createElement, setTooltip, createIcon } from "../../ui"; import { r as lang, nullOrEmpty, escapeHtml, escapeEmoji } from "../../utility"; import { createBox, appendMedia } from "./lib"; -import { fileSupported, insertFile, getMessageSendTo, getMessageStatus, updateCustomerName } from "./lib"; +import { fileSupported, insertFile, getMessageSendTo, getMessageStatus, updateCustomerName, createHideMessageTitleButton, createHideMessageCommentTail } from "./lib"; let r = lang; @@ -32,7 +32,9 @@ export default class InternalComment { } } - get messageHidden() { return this._var.option.showCommentHidden } + /** + * @param {boolean} flag + */ set messageHidden(flag) { const el = this._var.container.querySelector('.msgadminsetting'); if (el == null) { @@ -123,26 +125,7 @@ export default class InternalComment { div.className = 'title-module'; div.innerText = r('P_WO_INTERNALCOMMENTS', 'Internal Comments'); }, - createElement('span', span => { - if (option.userIsAdmin) { - span.className = 'msgadminsetting sbutton iconnotview'; - span.style.padding = '0px 0px 0px 5px'; - span.addEventListener('click', function () { - if (!option.showMessageHidden) { - this.classList.remove('iconnotview'); - this.classList.add('iconview'); - option.showMessageHidden = true; - container.querySelectorAll('.msgsetting').forEach(x => x.style.display = ''); - } - else { - this.classList.remove('iconview'); - this.classList.add('iconnotview'); - option.showMessageHidden = false; - container.querySelectorAll('.msgsetting').forEach(x => x.style.display = 'none'); - } - }); - } - }) + createHideMessageTitleButton(this, 'showMessageHidden') ) ), [] ); @@ -278,7 +261,7 @@ export default class InternalComment { return this._var.container = container; } - load(data, func) { + load(data, func, hisFunc, keep) { const children = []; if (data?.length > 0) { this._var.comments = data; @@ -289,8 +272,15 @@ export default class InternalComment { this._var.contactsUpdated = true; } } + const lastVisible = this._var.option.showMessageHidden; for (let comment of data) { const div = createElement('div', 'item-div'); + if (comment.Hidden) { + div.classList.add('hidden-content'); + if (!lastVisible) { + div.style.display = 'none'; + } + } const sendto = getMessageSendTo(comment, null, null, r) div.appendChild(createElement('div', div => { div.className = 'item-poster'; @@ -333,37 +323,19 @@ export default class InternalComment { } div.append( content, - createElement('div', div => { - div.className = 'item-time'; - }, - createElement('span', span => { - span.className = 'msgsetting sbutton ' + (comment.Hidden ? 'iconnotview' : 'iconview'); - span.style.padding = '0px 0px 0px 5px'; - span.style.fontSize = '12px'; - span.style.display = this._var.option.showMessageHidden ? '' : 'none'; - span.addEventListener('click', function () { - if (this.classList.contains('iconview')) { - func(comment.Id, true); - this.classList.remove('iconview'); - this.classList.add('iconnotview'); - } else { - func(comment.Id, false); - this.classList.remove('iconnotview'); - this.classList.add('iconview'); - } - }); - }), - createElement('span', span => { - span.innerText = comment.TimeStr; - }) - ) + createHideMessageCommentTail( + this, 'showMessageHidden', + comment, 'TimeStr', + func, hisFunc) ); children.push(div); } children[0].style.marginTop = '0'; } + if (this._var.message.children.length > 0) { + this._var.lastTop = this._var.message.scrollTop; + } this._var.message.replaceChildren(...children); - this._var.message.scrollTop = this._var.message.scrollHeight - // setTimeout(() => this._var.message.scrollTop = this._var.message.scrollHeight, 0); + setTimeout(() => this._var.message.scrollTop = keep ? this._var.lastTop : this._var.message.scrollHeight, 0); } } \ No newline at end of file diff --git a/lib/app/communications/lib.js b/lib/app/communications/lib.js index 3dbf581..78e1ec9 100644 --- a/lib/app/communications/lib.js +++ b/lib/app/communications/lib.js @@ -420,4 +420,99 @@ export function updateCustomerName(messages, contacts) { } } } +} + +export function createHideMessageTitleButton(This, optionName) { + const option = This._var.option; + return createElement('span', span => { + if (option.userIsAdmin) { + if (option[optionName]) { + span.className = 'msgadminsetting sbutton iconview'; + } else { + span.className = 'msgadminsetting sbutton iconnotview'; + } + span.style.padding = '0px 0px 0px 5px'; + setTooltip(span, option?.getText('P_WO_MESSAGEHISTORY_MANAGE', 'Manage Messages')); + span.addEventListener('click', function () { + const container = This._var.container; + if (!option[optionName]) { + this.classList.remove('iconnotview'); + this.classList.add('iconview'); + option[optionName] = true; + container.querySelectorAll('.msgsetting').forEach(x => x.style.display = ''); + container.querySelectorAll('.msgHistory').forEach(h => h.style.display = h.getAttribute('ModifyCount') > 0 ? '' : 'none'); + container.querySelectorAll('.hidden-content').forEach(c => c.style.display = ''); + } else { + this.classList.remove('iconview'); + this.classList.add('iconnotview'); + option[optionName] = false; + container.querySelectorAll('.msgsetting').forEach(x => x.style.display = 'none'); + container.querySelectorAll('.msgHistory').forEach(h => h.style.display = 'none'); + container.querySelectorAll('.hidden-content').forEach(c => c.style.display = 'none'); + } + }); + } + }); +} + +export function createHideMessageCommentTail(This, optionName, comment, commentTime, func, hisFunc) { + const option = This._var.option; + const showTooltip = option?.getText('P_WO_MESSAGEHISTORY_VISIBLE', 'Visible'); + const notShowTooltip = option?.getText('P_WO_MESSAGEHISTORY_NOTVISIBLE', 'Not Visible'); + return createElement('div', div => { + div.className = 'item-time'; + div.style.display = 'flex'; + div.style.alignItems = 'center'; + }, + createElement('span', span => { + span.className = 'msgsetting sbutton ' + (comment.Hidden ? 'iconnotview' : 'iconview'); + span.style.padding = '0'; + span.style.fontSize = '12px'; + setTooltip(span, comment.Hidden ? notShowTooltip : showTooltip); + span.style.display = option[optionName] ? '' : 'none'; + span.addEventListener('click', function () { + if (this.classList.contains('iconview')) { + func(comment.Id, true); + this.classList.remove('iconview'); + this.classList.add('iconnotview'); + setTooltip(this, notShowTooltip); + } else { + func(comment.Id, false); + this.classList.remove('iconnotview'); + this.classList.add('iconview'); + setTooltip(this, showTooltip); + } + if (isNaN(comment.ModifyCount)) { + comment.ModifyCount = 1; + } else { + comment.ModifyCount += 1; + } + const x = This._var.container.querySelector('.history-span-' + comment.Id); + if (x != null) { + x.setAttribute('ModifyCount', comment.ModifyCount); + x.style.display = (option[optionName] && comment.ModifyCount > 0) ? '' : 'none'; + } + }); + }), + createElement('span', span => { + span.className = 'msgHistory history-span-' + comment.Id; + span.setAttribute('ModifyCount', comment.ModifyCount ?? 0); + span.style.display = (option[optionName] && comment.ModifyCount > 0) ? '' : 'none'; + setTooltip(span, option?.getText('P_WO_MESSAGEHISTORY_HEADER', 'Hidden History')); + const icon = createIcon('fa-light', 'wave-sine'); + icon.style.height = '12px'; + icon.style.width = '12px'; + icon.style.margin = '0 5px 0 0'; + icon.style.cursor = 'pointer'; + icon.style.border = '1px solid'; + icon.style.borderRadius = '6px'; + icon.style.borderColor = '#000'; + icon.style.display = 'block'; + span.appendChild(icon); + span.addEventListener('click', () => hisFunc(comment.Id)); + }), + createElement('span', span => { + span.innerText = comment[commentTime]; + }) + ); } \ No newline at end of file diff --git a/lib/ui/checkbox.js b/lib/ui/checkbox.js index 82f4af4..e415a43 100644 --- a/lib/ui/checkbox.js +++ b/lib/ui/checkbox.js @@ -26,7 +26,9 @@ function fillCheckbox(container, type = 'fa-regular', label, tabindex = -1, char container.appendChild( createElement('span', span => { span.innerText = label; - span.title = title; + if (title != null) { + span.title = title; + } }) ); } diff --git a/lib/ui/css/grid.scss b/lib/ui/css/grid.scss index ff3d42f..ae6da1b 100644 --- a/lib/ui/css/grid.scss +++ b/lib/ui/css/grid.scss @@ -705,6 +705,12 @@ } } +.ui-popup-mask .ui-popup-container .ui-popup-footer { + >.ui-sort-layout { + flex: 1 1 auto; + } +} + /*@media (prefers-color-scheme: dark) { .ui-grid { --cell-hover-bg-color: yellow; diff --git a/lib/ui/css/media.scss b/lib/ui/css/media.scss index 5f2dad4..24a2aad 100644 --- a/lib/ui/css/media.scss +++ b/lib/ui/css/media.scss @@ -76,43 +76,47 @@ --icon-size: 16px; - >.ui-video-wrapper { - position: relative; - display: inline-block; + >.ui-video-content { + height: 100%; - >video { - width: 100%; - height: 100%; - } + >.ui-video-wrapper { + position: relative; + display: inline-block; - >.ui-video-waiting { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-color: rgba(0, 0, 0, .3); - display: flex; - justify-content: center; - align-items: center; - transition: opacity .2s; - - >svg { - fill: #eee; - width: 30px; - height: 30px; - top: calc(50% - 15px); - left: calc(50% - 15px); - animation: spinner 1.2s infinite linear; + >video { + width: 100%; + height: 100%; } - @keyframes spinner { - 0% { - transform: rotate(0deg); + >.ui-video-waiting { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, .3); + display: flex; + justify-content: center; + align-items: center; + transition: opacity .2s; + + >svg { + fill: #eee; + width: 30px; + height: 30px; + top: calc(50% - 15px); + left: calc(50% - 15px); + animation: spinner 1.2s infinite linear; } - 100% { - transform: rotate(359deg); + @keyframes spinner { + 0% { + transform: rotate(0deg); + } + + 100% { + transform: rotate(359deg); + } } } } @@ -120,12 +124,13 @@ >.ui-video-control { position: absolute; - top: 0; left: 0; width: 100%; - height: 100%; + height: 70px; + bottom: 0; opacity: 0; - background: linear-gradient(transparent calc(100% - 100px), rgba(50, 50, 50, .7) calc(100% - 65px), #000); + background: linear-gradient(transparent, #000); + // calc(100% - 100px), rgba(50, 50, 50, .7) calc(100% - 65px) transition: opacity .5s; &:hover, diff --git a/lib/ui/dropdown.js b/lib/ui/dropdown.js index 9799ef0..2bfe38e 100644 --- a/lib/ui/dropdown.js +++ b/lib/ui/dropdown.js @@ -204,7 +204,8 @@ export class Dropdown { let label; if (options.input) { label = createElement('input', 'ui-drop-text'); - label.setAttribute('type', 'text'); + label.type = 'text'; + label.draggable = false; options.placeholder && label.setAttribute('placeholder', options.placeholder); isPositive(options.maxLength) && label.setAttribute('maxlength', options.maxLength); isPositive(options.tabIndex) && label.setAttribute('tabindex', options.tabIndex); @@ -383,7 +384,7 @@ export class Dropdown { if (!options.input && options.search) { const search = createElement('div', 'ui-drop-search'); const input = createElement('input'); - input.setAttribute('type', 'text'); + input.type = 'text'; isPositive(options.tabIndex) && input.setAttribute('tabindex', options.tabIndex); !nullOrEmpty(options.searchPlaceholder) && input.setAttribute('placeholder', options.searchPlaceholder); input.addEventListener('input', e => { @@ -503,7 +504,7 @@ export class Dropdown { } const li = createElement('li'); li.dataset.value = val; - li.setAttribute('title', item[textkey]); + li.title = item[textkey]; let label; const html = item[htmlkey]; if (html instanceof HTMLElement) { diff --git a/lib/ui/grid/grid.js b/lib/ui/grid/grid.js index 0178eb3..54057cd 100644 --- a/lib/ui/grid/grid.js +++ b/lib/ui/grid/grid.js @@ -71,13 +71,13 @@ let r = lang; /** * 键值字典 * @template T - * @typedef {Map} KeyMap + * @typedef {{[key: string]: T}} KeyMap */ /** * 索引字典 * @template T - * @typedef {Map} IndexMap + * @typedef {{[index: number]: T}} IndexMap */ /** @@ -134,6 +134,7 @@ let r = lang; * @param {GridRowItem} item - 行数据对象 * @param {boolean} editing - 是否处于编辑状态 * @param {HTMLElement} [body] - Grid 控件的 `` 部分 + * @param {number} [index] - 所在行索引(不可依赖此值,除了呈现时,其他时候该值不会传递) * @returns {ValueItem} - 返回过滤后的显示或编辑值 * @this GridColumnDefinition */ @@ -455,6 +456,9 @@ const GridColumnDirection = { * @property {string} [addLevel] - Add Level * @property {string} [deleteLevel] - Delete Level * @property {string} [copyLevel] - Copy Level + * @property {string} [sortBy] - Sort by + * @property {string} [thenBy] - Then by + * @property {string} [updateLayout] - Update Layout * @property {string} [asc] - Ascending * @property {string} [desc] - Descending * @property {string} [column] - Column @@ -939,6 +943,13 @@ export class Grid { * @ignore */ headerWrap = true; + /** + * 是否允许行间拖拽 + * @type {boolean} + * @default false + * @ignore + */ + rowDraggable = false; /** * 监听事件的窗口载体 * @type {(Window | HTMLElement)} @@ -1060,6 +1071,16 @@ export class Grid { * @this Grid */ onRowCollapsed; + /** + * 行发生变化时触发的事件 + * @event + * @param {("update" | "add" | "remove")} action - 变动类型 + * @param {GridRowItem[]} items - 发生变动的行对象 + * @param {(number | number[])} indexes - 变动的索引集合 + * @this Grid + * @since 1.0.3 + */ + onRowChanged; /** * 列类型枚举 @@ -1099,6 +1120,7 @@ export class Grid { * @property {boolean} [tooltipDisabled=false] - 单元格 tooltip 是否禁用 * @property {boolean} [headerVisible=true] - 列头是否显示 * @property {boolean} [headerWrap=true] - 列头是否允许换行 + * @property {boolean} [rowDraggable=false] - 是否允许行间拖拽 @since 1.0.3 * @property {(Window | HTMLElement)} [window=global] - 监听事件的窗口载体 * @property {number} [sortIndex=-1] - 排序列的索引 * @property {GridColumnDirection} [sortDirection=GridColumnDirection.Ascending] - 排序方式,正数升序,负数倒序 @@ -1332,6 +1354,9 @@ export class Grid { addLevel: r('addLevel', 'Add level'), deleteLevel: r('deleteLevel', 'Delete level'), copyLevel: r('copyLevel', 'Copy level'), + sortBy: r('sortBy', 'Sort by'), + thenBy: r('thenBy', 'Then by'), + updateLayout: r('updateLayout', 'Update Layout'), asc: r('asc', 'Ascending'), desc: r('desc', 'Descending'), column: r('column', 'Column'), @@ -1408,6 +1433,30 @@ export class Grid { } this._onRowClicked(e, rowIndex, colIndex); }); + if (this.rowDraggable) { + grid.addEventListener('dragover', e => { + e.preventDefault(); + e.stopPropagation(); + e.dataTransfer.dropEffect = e.ctrlKey ? 'copy' : 'move'; + }); + grid.addEventListener('drop', e => { + e.preventDefault(); + e.stopPropagation(); + const src = Number(e.dataTransfer.getData('text')); + if (isNaN(src) || src < 0) { + return; + } + const target = this._var.currentSource?.length ?? 0; + if (target == null || src === target) { + return; + } + const row = e.ctrlKey ? + Object.assign({}, this._var.currentSource[src]?.values) : + this.removeItem(src); + this.addItem(row, target); + this.selectedIndexes = [e.ctrlKey ? target : target - 1]; + }); + } container.replaceChildren(grid); const sizer = createElement('span', 'ui-grid-sizer'); grid.appendChild(sizer); @@ -1719,24 +1768,35 @@ export class Grid { /** * 显示多列排序设置面板 + * @param {Function} [callback] - 更新回调函数 @since 1.0.3 + * @param {boolean} [layout] - 是否显示更新 layout 复选框 @since 1.0.3 * @since 1.0.1 */ - showSortPanel() { + showSortPanel(callback, layout) { const content = createElement('div', 'ui-sort-panel-content'); const buttonWrapper = createElement('div', 'ui-sort-panel-buttons'); const grid = new Grid(null, r); + grid.rowDraggable = true; grid.langs = this.langs; const rowChanged = index => { buttonWrapper.querySelector('.ui-button-delete').disabled = index < 0; buttonWrapper.querySelector('.ui-button-copy').disabled = index < 0; - buttonWrapper.querySelector('.ui-button-move-up').disabled = index < 1; - buttonWrapper.querySelector('.ui-button-move-down').disabled = index >= grid.source.length - 1; + // buttonWrapper.querySelector('.ui-button-move-up').disabled = index < 1; + // buttonWrapper.querySelector('.ui-button-move-down').disabled = index >= grid.source.length - 1; }; grid.onSelectedRowChanged = rowChanged; + grid.onRowChanged = () => { + const layout = pop.container.querySelector('.ui-sort-layout'); + if (layout != null) { + layout.classList.remove('disabled'); + layout.querySelector('input').disabled = false; + } + }; const reload = index => { grid.selectedIndexes = [index]; grid.scrollTop = index * (grid.rowHeight + 1); rowChanged(index); + grid.onRowChanged(); } buttonWrapper.append( createElement('span', 'button', @@ -1793,6 +1853,7 @@ export class Grid { }); }) ), + /* createElement('span', button => { button.className = 'button ui-button-move-up'; const icon = createIcon('fa-light', 'chevron-up'); @@ -1829,23 +1890,43 @@ export class Grid { }); button.appendChild(icon); }) + //*/ ); const gridWrapper = createElement('div', 'ui-sort-panel-grid'); content.append(buttonWrapper, gridWrapper); - const columnSource = this.columns.filter(c => c.sortable !== false && c.visible !== false); + const columnSource = this.columns.filter(c => c.sortable !== false); // ticket 56389, && c.visible !== false + columnSource.sort((a, b) => a.caption > b.caption ? 1 : -1); grid.columns = [ { - key: 'column', + width: 80, + sortable: false, + orderable: false, + resizable: false, + filter: (_item, _editing, _body, index) => index === 0 ? this.langs.sortBy : this.langs.thenBy + }, + { + key: 'caption', caption: this.langs.column, width: 270, type: GridColumnTypeEnum.Dropdown, dropOptions: { textKey: 'caption', - valueKey: 'key' + valueKey: 'caption', + input: true }, - source: columnSource, + dropRestrictCase: true, + sourceCache: false, + source: () => columnSource.filter(c => grid.source?.find(s => s.column === c.key) == null), sortable: false, - orderable: false + orderable: false, + onChanged: (item, _value, _oldValue, e) => { + item.column = e.key; + const layout = pop.container.querySelector('.ui-sort-layout'); + if (layout != null) { + layout.classList.remove('disabled'); + layout.querySelector('input').disabled = false; + } + } }, { key: 'order', @@ -1857,7 +1938,14 @@ export class Grid { { value: 'desc', text: this.langs.desc } ], sortable: false, - orderable: false + orderable: false, + onChanged: () => { + const layout = pop.container.querySelector('.ui-sort-layout'); + if (layout != null) { + layout.classList.remove('disabled'); + layout.querySelector('input').disabled = false; + } + } } ]; const pop = new Popup({ @@ -1871,6 +1959,14 @@ export class Grid { const source = grid.source; if (source == null || source.length === 0) { this.sortArray = null; + // arrow icon + [...this._headerCells].forEach((th, i) => { + const arrow = th.querySelector('.arrow'); + if (arrow == null) { + return; + } + arrow.className = 'arrow'; + }); } else { const dict = {}; for (let i = 0; i < source.length; ++i) { @@ -1895,12 +1991,12 @@ export class Grid { } dict[it.column] = true; } - this.sortArray = source; + this.sortArray = source.map(s => ({ column: s.column, order: s.order })); this.sortDirection = 1; this.sort(); } - if (typeof this.onSorted === 'function') { - this.onSorted(this.sortArray); + if (typeof callback === 'function') { + callback.call(this, this.sortArray, pop.container.querySelector('.ui-sort-layout>input')?.checked); } return true; } @@ -1909,11 +2005,29 @@ export class Grid { ], onResizeEnded: () => grid.resize() }); - const source = this.sortArray || [{ column: '', order: 'asc' }]; + let source = this.sortArray; + if (source == null && this.sortIndex >= 0) { + const col = this.columns[this.sortIndex]; + if (col != null) { + source = [{ column: col.key, order: this.sortDirection > 0 ? 'asc' : 'desc' }]; + } + } + source ??= [{ column: '', order: 'asc' }]; pop.show(this._var.el).then(() => { - pop.container.style.cssText += 'width: 520px; height: 400px'; + pop.container.style.cssText += 'width: 600px; height: 460px'; + if (layout) { + const footer = pop.container.querySelector('.ui-popup-footer'); + footer.insertBefore(createCheckbox({ + label: this.langs.updateLayout, + className: 'ui-sort-layout', + enabled: false + }), footer.children[0]); + } grid.init(gridWrapper); - grid.source = source.filter(s => s.column === '' || columnSource.find(c => c.key === s.column) != null); + grid.source = source + .map(s => (s.c = columnSource.find(c => c.key === s.column), s)) + .filter(s => s.column === '' || s.c != null) + .map(s => ({ column: s.column, caption: s.c?.caption ?? '', order: s.order })); grid.selectedIndexes = [0]; grid.refresh(); rowChanged(0); @@ -1942,6 +2056,9 @@ export class Grid { } else { this.refresh(); } + if (typeof this.onRowChanged === 'function') { + this.onRowChanged('update', [item], index); + } } /** @@ -1980,6 +2097,9 @@ export class Grid { } else { this.reload(); } + if (typeof this.onRowChanged === 'function') { + this.onRowChanged('add', [item], index); + } return item; } @@ -2024,6 +2144,9 @@ export class Grid { } else { this.reload(); } + if (typeof this.onRowChanged === 'function') { + this.onRowChanged('add', array, index); + } return array; } @@ -2053,6 +2176,9 @@ export class Grid { this._var.selectedIndexes = []; } this.reload(); + if (typeof this.onRowChanged === 'function') { + this.onRowChanged('remove', [it.values], index); + } return it.values; } @@ -2098,11 +2224,14 @@ export class Grid { it.__index -= offset; } const index = indexes[0]; - if (index < 1) { + if (index > 0) { this._var.selectedIndexes = [index - 1]; } else { this._var.selectedIndexes = []; } + if (typeof this.onRowChanged === 'function') { + this.onRowChanged('remove', array, indexes); + } this.reload(); return array; } @@ -2144,7 +2273,7 @@ export class Grid { align: c.align, visible: c.visible })), - source: this.source?.map(s => { + source: this.source?.map((s, i) => { const item = Object.create(null); for (let c of this.columns) { if (c.key == null) { @@ -2154,7 +2283,7 @@ export class Grid { if (c.text != null) { val = c.text; } else if (typeof c.filter === 'function') { - val = c.filter(s, false, this._var.refs.body); + val = c.filter(s, false, this._var.refs.body, i); } else { val = s[c.key]; if (val != null) { @@ -2676,6 +2805,34 @@ export class Grid { const readonly = this.readonly; for (let i = 0; i < count; ++i) { const row = createElement('tr', 'ui-grid-row'); + if (this.rowDraggable) { + row.draggable = true; + row.addEventListener('dragstart', e => { + e.dataTransfer.setData('text', String(this._var.startIndex + exists + i)); + }); + row.addEventListener('dragover', e => { + e.preventDefault(); + e.stopPropagation(); + e.dataTransfer.dropEffect = e.ctrlKey ? 'copy' : 'move'; + }); + row.addEventListener('drop', e => { + e.preventDefault(); + e.stopPropagation(); + const src = Number(e.dataTransfer.getData('text')); + if (isNaN(src) || src < 0) { + return; + } + const target = this._var.startIndex + exists + i; + if (src === target) { + return; + } + const row = e.ctrlKey ? + Object.assign({}, this._var.currentSource[src]?.values) : + this.removeItem(src); + this.addItem(row, target); + this.selectedIndexes = [target]; + }); + } const virtualRow = { cells: {} }; this._var.virtualRows[exists + i] = virtualRow; let left = this.expandable ? ExpandableWidth : 0; @@ -2852,7 +3009,7 @@ export class Grid { if (col.text != null) { val = col.text; } else if (typeof col.filter === 'function') { - val = col.filter(item, selected, this._var.refs.body); + val = col.filter(item, selected, this._var.refs.body, startIndex + i); } else { val = item[col.key]; if (val != null) { diff --git a/lib/ui/media.js b/lib/ui/media.js index d479559..ac39843 100644 --- a/lib/ui/media.js +++ b/lib/ui/media.js @@ -158,6 +158,7 @@ export function createFile(url, icon = 'file-alt') { * @param {boolean} options.[autoPlay] - 是否自动播放 * @param {boolean} options.[autoFullScreen] - 是否自动全屏 * @param {boolean} options.[autoLoop] - 是否循环播放 + * @param {Function} options.[onLoaded] - 视频加载完成回调 * @param {Function} [callback] - 视频元素处理回调函数 * @returns {HTMLDivElement} 返回联动视频元素 */ @@ -330,6 +331,9 @@ export function createVideoList(urls, options, callback) { controller.classList.add('no-fullscreen'); } + const content = createElement('div', 'ui-video-content'); + container.append(content, controller); + urls.forEach((url, i) => { const video = createElement('video'); videos[i] = video; @@ -349,17 +353,22 @@ export function createVideoList(urls, options, callback) { video.volume = 0; } prepared += 1; - if (options?.autoPlay && prepared >= length) { - // auto play - videos.forEach(v => v.play().catch(() => { })); - if (options?.autoFullScreen && length === 1 && document.fullscreenElement == null) { - video.requestFullscreen().catch(() => { }); + if (prepared >= length) { + if (options?.autoPlay) { + // auto play + videos.forEach(v => v.play().catch(() => { })); + if (options?.autoFullScreen && length === 1 && document.fullscreenElement == null) { + video.requestFullscreen().catch(() => { }); + } + } + if (typeof options?.onLoaded === 'function') { + options.onLoaded(); } } }); video.addEventListener('progress', () => { const buffered = video.buffered; - for (let i = 0; i < buffered.length; i += 1) { + for (let i = 0; i < buffered.length; ++i) { let buffer = seekBufferBar.children[i]; if (buffer == null) { seekBufferBar.append(buffer = createElement('div', 'ui-video-buffer')); @@ -435,9 +444,8 @@ export function createVideoList(urls, options, callback) { if (typeof callback === 'function') { callback(wrapper); } - container.append(wrapper); + content.append(wrapper); }); - container.append(controller); return container; } \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 7beb4f7..549adef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,20 +9,20 @@ "version": "1.0.2", "devDependencies": { "@mxssfd/typedoc-theme": "^1.1.3", - "clean-jsdoc-theme": "^4.2.18", + "clean-jsdoc-theme": "^4.3.0", "docdash": "^2.0.2", - "jsdoc": "^4.0.2", - "postcss-preset-env": "^9.5.9", - "sass": "^1.75.0", + "jsdoc": "^4.0.3", + "postcss-preset-env": "^9.5.12", + "sass": "^1.77.1", "typedoc": "^0.25.13", - "vite": "^5.2.10", + "vite": "^5.2.11", "vite-plugin-externals": "^0.6.2" } }, "node_modules/@babel/parser": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", - "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", + "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -32,9 +32,9 @@ } }, "node_modules/@csstools/cascade-layer-name-parser": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-1.0.9.tgz", - "integrity": "sha512-RRqNjxTZDUhx7pxYOBG/AkCVmPS3zYzfE47GEhIGkFuWFTQGJBgWOUUkKNo5MfxIfjDz5/1L3F3rF1oIsYaIpw==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-1.0.11.tgz", + "integrity": "sha512-yhsonEAhaWRQvHFYhSzOUobH2Ev++fMci+ppFRagw0qVSPlcPV4FnNmlwpM/b2BM10ZeMRkVV4So6YRswD0O0w==", "dev": true, "funding": [ { @@ -50,8 +50,8 @@ "node": "^14 || ^16 || >=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4" + "@csstools/css-parser-algorithms": "^2.6.3", + "@csstools/css-tokenizer": "^2.3.1" } }, "node_modules/@csstools/color-helpers": { @@ -74,9 +74,9 @@ } }, "node_modules/@csstools/css-calc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-1.2.0.tgz", - "integrity": "sha512-iQqIW5vDPqQdLx07/atCuNKDprhIWjB0b8XRhUyXZWBZYUG+9mNyFwyu30rypX84WLevVo25NYW2ipxR8WyseQ==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-1.2.2.tgz", + "integrity": "sha512-0owrl7AruDRKAxoSIW8XzJdz7GnuW3AOj4rYLfmXsoKIX2ZZzttzGXoiC8n8V08X7wIBlEWWVB4C8fAN18+I6Q==", "dev": true, "funding": [ { @@ -92,14 +92,14 @@ "node": "^14 || ^16 || >=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4" + "@csstools/css-parser-algorithms": "^2.6.3", + "@csstools/css-tokenizer": "^2.3.1" } }, "node_modules/@csstools/css-color-parser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-2.0.0.tgz", - "integrity": "sha512-0/v6OPpcg+b8TJT2N1Rcp0oH5xEvVOU5K2qDkaR3IMHNXuJ7XfVCQLINt3Cuj8mr54DbilEoZ9uvAmHBoZ//Fw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-2.0.2.tgz", + "integrity": "sha512-Agx2YmxTcZ7TfB7KNZQ+iekaxbWSdblvtA35aTwE3KfuYyjOlCg3P4KGGdQF/cjm1pHWVSBo5duF/BRfZ8s07A==", "dev": true, "funding": [ { @@ -113,20 +113,20 @@ ], "dependencies": { "@csstools/color-helpers": "^4.2.0", - "@csstools/css-calc": "^1.2.0" + "@csstools/css-calc": "^1.2.2" }, "engines": { "node": "^14 || ^16 || >=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4" + "@csstools/css-parser-algorithms": "^2.6.3", + "@csstools/css-tokenizer": "^2.3.1" } }, "node_modules/@csstools/css-parser-algorithms": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.6.1.tgz", - "integrity": "sha512-ubEkAaTfVZa+WwGhs5jbo5Xfqpeaybr/RvWzvFxRs4jfq16wH8l8Ty/QEEpINxll4xhuGfdMbipRyz5QZh9+FA==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.6.3.tgz", + "integrity": "sha512-xI/tL2zxzEbESvnSxwFgwvy5HS00oCXxL4MLs6HUiDcYfwowsoQaABKxUElp1ARITrINzBnsECOc1q0eg2GOrA==", "dev": true, "funding": [ { @@ -142,13 +142,13 @@ "node": "^14 || ^16 || >=18" }, "peerDependencies": { - "@csstools/css-tokenizer": "^2.2.4" + "@csstools/css-tokenizer": "^2.3.1" } }, "node_modules/@csstools/css-tokenizer": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.2.4.tgz", - "integrity": "sha512-PuWRAewQLbDhGeTvFuq2oClaSCKPIBmHyIobCV39JHRYN0byDcUWJl5baPeNUcqrjtdMNqFooE0FGl31I3JOqw==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.3.1.tgz", + "integrity": "sha512-iMNHTyxLbBlWIfGtabT157LH9DUx9X8+Y3oymFEuMj8HNc+rpE3dPFGFgHjpKfjeFDjLjYIAIhXPGvS2lKxL9g==", "dev": true, "funding": [ { @@ -165,9 +165,9 @@ } }, "node_modules/@csstools/media-query-list-parser": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.9.tgz", - "integrity": "sha512-qqGuFfbn4rUmyOB0u8CVISIp5FfJ5GAR3mBrZ9/TKndHakdnm6pY0L/fbLcpPnrzwCyyTEZl1nUcXAYHEWneTA==", + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.11.tgz", + "integrity": "sha512-uox5MVhvNHqitPP+SynrB1o8oPxPMt2JLgp5ghJOWf54WGQ5OKu47efne49r1SWqs3wRP8xSWjnO9MBKxhB1dA==", "dev": true, "funding": [ { @@ -183,14 +183,14 @@ "node": "^14 || ^16 || >=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4" + "@csstools/css-parser-algorithms": "^2.6.3", + "@csstools/css-tokenizer": "^2.3.1" } }, "node_modules/@csstools/postcss-cascade-layers": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-4.0.4.tgz", - "integrity": "sha512-MKErv8lpEwVmAcAwidY1Kfd3oWrh2Q14kxHs9xn26XzjP/PrcdngWq63lJsZeMlBY7o+WlEOeE+FP6zPzeY2uw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-4.0.5.tgz", + "integrity": "sha512-nAI2ToT2G/E4XEwJitVjCr2V2SluE9Eaiski+xfRbKSGxFmDUtua7SCG1AtMbjteIVqGDRw7uBd7qXqCZq2b1Q==", "dev": true, "funding": [ { @@ -203,7 +203,7 @@ } ], "dependencies": { - "@csstools/selector-specificity": "^3.0.3", + "@csstools/selector-specificity": "^3.1.0", "postcss-selector-parser": "^6.0.13" }, "engines": { @@ -214,9 +214,9 @@ } }, "node_modules/@csstools/postcss-color-function": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-3.0.14.tgz", - "integrity": "sha512-joGAf5bT3Jg1CpybupMJ4DwNg/VNjmLWZoWMDmX0MTy/ftHA1Qr4+CslqTT4AA1n6Dx4Wa+DSMGPrDLHtRP0jg==", + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-3.0.16.tgz", + "integrity": "sha512-KtmXfckANSKsLBoTQCzggvKft1cmmmDKYjFO4yVlB23nWUgGInVBTE9T5JLmH29NNdTWSEPLWPUxoQ6XiIEn2Q==", "dev": true, "funding": [ { @@ -229,9 +229,9 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^2.0.0", - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4", + "@csstools/css-color-parser": "^2.0.2", + "@csstools/css-parser-algorithms": "^2.6.3", + "@csstools/css-tokenizer": "^2.3.1", "@csstools/postcss-progressive-custom-properties": "^3.2.0", "@csstools/utilities": "^1.0.0" }, @@ -243,9 +243,9 @@ } }, "node_modules/@csstools/postcss-color-mix-function": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-2.0.14.tgz", - "integrity": "sha512-ZLbgtdhyuOoWoRo/W8jFv68q+IMgTJHOAI+WunRbrRPqI+vJ0K2rud/lS9Se5urzM/imVKs/kz0Uobm5Yj4HUg==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-2.0.16.tgz", + "integrity": "sha512-BJnD1M5Pdypl1cJuwGuzVC52PqgzaObsDLu34jgf+QU7daVFqz432PvpqvXTmfTSNt4OckOT1QIzWexEFlDNXw==", "dev": true, "funding": [ { @@ -258,9 +258,9 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^2.0.0", - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4", + "@csstools/css-color-parser": "^2.0.2", + "@csstools/css-parser-algorithms": "^2.6.3", + "@csstools/css-tokenizer": "^2.3.1", "@csstools/postcss-progressive-custom-properties": "^3.2.0", "@csstools/utilities": "^1.0.0" }, @@ -272,9 +272,9 @@ } }, "node_modules/@csstools/postcss-exponential-functions": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-1.0.5.tgz", - "integrity": "sha512-7S7I7KgwHWQYzJJAoIjRtUf7DQs1dxipeg1A6ikZr0PYapNJX7UHz0evlpE67SQqYj1xBs70gpG7xUv3uLp4PA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-1.0.7.tgz", + "integrity": "sha512-9usBPQX74OhiF/VuaVrp44UAPzqbKNyoaxEa6tbEXiFp+OAm3yB/TLRKyPUWg5tvvHGCduGJVdJJB3w8c8NBtA==", "dev": true, "funding": [ { @@ -287,9 +287,9 @@ } ], "dependencies": { - "@csstools/css-calc": "^1.2.0", - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4" + "@csstools/css-calc": "^1.2.2", + "@csstools/css-parser-algorithms": "^2.6.3", + "@csstools/css-tokenizer": "^2.3.1" }, "engines": { "node": "^14 || ^16 || >=18" @@ -325,9 +325,9 @@ } }, "node_modules/@csstools/postcss-gamut-mapping": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-1.0.7.tgz", - "integrity": "sha512-vrsHsl5TN6NB5CT0rPG6JE9V2GLFftcmPtF/k4cWT4gyVMCsDyS9wEVl82sgvh/JQ32TaUo6bh8Ndl+XRJqGQw==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-1.0.9.tgz", + "integrity": "sha512-JmOeiBJj1RJriAkr+aLBaiYUpEqdNOIo3ERQ5a4uNzy18upzrQ6tz7m2Vt1GQpJ62zQj7rC5PjAhCoZCoyE31g==", "dev": true, "funding": [ { @@ -340,9 +340,9 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^2.0.0", - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4" + "@csstools/css-color-parser": "^2.0.2", + "@csstools/css-parser-algorithms": "^2.6.3", + "@csstools/css-tokenizer": "^2.3.1" }, "engines": { "node": "^14 || ^16 || >=18" @@ -352,9 +352,9 @@ } }, "node_modules/@csstools/postcss-gradients-interpolation-method": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-4.0.15.tgz", - "integrity": "sha512-0xQ5r4WU/6W2lDmnOTx9liC1Cq6RSnrkEzqX7d0cRA3fz5hjC276pA0nLMoAiY3vtAp0u71nTk/3TRdnCx/OUw==", + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-4.0.17.tgz", + "integrity": "sha512-qSNIqzLPKd2SadfWwHZv42lDRyYlLaM+Vx5rRIsnYCZbQxzFfe1XAwssrcCsHgba5bA6bi5oDoFCx0W+PRCpfw==", "dev": true, "funding": [ { @@ -367,9 +367,9 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^2.0.0", - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4", + "@csstools/css-color-parser": "^2.0.2", + "@csstools/css-parser-algorithms": "^2.6.3", + "@csstools/css-tokenizer": "^2.3.1", "@csstools/postcss-progressive-custom-properties": "^3.2.0", "@csstools/utilities": "^1.0.0" }, @@ -381,9 +381,9 @@ } }, "node_modules/@csstools/postcss-hwb-function": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-3.0.13.tgz", - "integrity": "sha512-f44tgkFSxJBGm8UjlkAfBP7xE2x2XFFdvNdedHl8jpx2pQcW8a50OT3yeMnM3NB9Y2Ynd7Wn8iXARiV/IHoKvw==", + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-3.0.15.tgz", + "integrity": "sha512-l34fRiZ7o5+pULv7OplXniBTU4TuKYNNOv0abuvUanddWGSy3+YHlMKUSgcVFo0d1DorxPAhJSTCrugl+4OmMQ==", "dev": true, "funding": [ { @@ -396,9 +396,9 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^2.0.0", - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4", + "@csstools/css-color-parser": "^2.0.2", + "@csstools/css-parser-algorithms": "^2.6.3", + "@csstools/css-tokenizer": "^2.3.1", "@csstools/postcss-progressive-custom-properties": "^3.2.0", "@csstools/utilities": "^1.0.0" }, @@ -459,9 +459,9 @@ } }, "node_modules/@csstools/postcss-is-pseudo-class": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-4.0.6.tgz", - "integrity": "sha512-HilOhAsMpFheMYkuaREZx+CGa4hsG6kQdzwXSsuqKDFzYz2eIMP213+3dH/vUbPXaWrzqLKr8m3i0dgYPoh7vg==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-4.0.7.tgz", + "integrity": "sha512-snT/fL6V0I/4AiObPtk2mzJ/eSvpqnf3Kyx9Mc0rI6VskjRkkrEME+kH3aMKBKwjstBrgrYUMoI+vXw2HRi9CQ==", "dev": true, "funding": [ { @@ -474,7 +474,7 @@ } ], "dependencies": { - "@csstools/selector-specificity": "^3.0.3", + "@csstools/selector-specificity": "^3.1.0", "postcss-selector-parser": "^6.0.13" }, "engines": { @@ -485,9 +485,9 @@ } }, "node_modules/@csstools/postcss-light-dark-function": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-1.0.3.tgz", - "integrity": "sha512-izW8hvhOqJlarLcGXO5PSylW9pQS3fytmhRdx2/e1oZFi15vs7ZShOHcREHJ3FfGdYqDA10cP9uhH0A3hmm1Rw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-1.0.5.tgz", + "integrity": "sha512-kKM9dtEaVmSTb3scL2pgef62KyWv6SK19JiAnCCuiDhlRE6PADKzaPPBXmP3qj4IEgIH+cQhdEosB0eroU6Fnw==", "dev": true, "funding": [ { @@ -500,8 +500,8 @@ } ], "dependencies": { - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4", + "@csstools/css-parser-algorithms": "^2.6.3", + "@csstools/css-tokenizer": "^2.3.1", "@csstools/postcss-progressive-custom-properties": "^3.2.0", "@csstools/utilities": "^1.0.0" }, @@ -604,9 +604,9 @@ } }, "node_modules/@csstools/postcss-logical-viewport-units": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-2.0.7.tgz", - "integrity": "sha512-L4G3zsp/bnU0+WXUyysihCUH14LkfMgUJsS9vKz3vCYbVobOTqQRoNXnEPpyNp8WYyolLqAWbGGJhVu8J6u2OQ==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-2.0.9.tgz", + "integrity": "sha512-iBBJuExgHwedFH9AqNOHWzZFgYnt17zhu1qWjmSihu1P5pw0lIG9q5t3uIgJJFDNmYoOGfBKan66z9u1QH8yBQ==", "dev": true, "funding": [ { @@ -619,7 +619,7 @@ } ], "dependencies": { - "@csstools/css-tokenizer": "^2.2.4", + "@csstools/css-tokenizer": "^2.3.1", "@csstools/utilities": "^1.0.0" }, "engines": { @@ -630,9 +630,9 @@ } }, "node_modules/@csstools/postcss-media-minmax": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-1.1.4.tgz", - "integrity": "sha512-xl/PIO3TUbXO1ZA4SA6HCw+Q9UGe2cgeRKx3lHCzoNig2D4bT5vfVCOrwhxjUb09oHihc9eI3I0iIfVPiXaN1A==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-1.1.6.tgz", + "integrity": "sha512-bc0frf2Lod53j6wEHVsaVElfvCf6uhc96v99M/wUfer4MmNYfO3YLx1kFuB8xXvb0AXiWx4fohCJqemHV3bfRg==", "dev": true, "funding": [ { @@ -645,10 +645,10 @@ } ], "dependencies": { - "@csstools/css-calc": "^1.2.0", - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4", - "@csstools/media-query-list-parser": "^2.1.9" + "@csstools/css-calc": "^1.2.2", + "@csstools/css-parser-algorithms": "^2.6.3", + "@csstools/css-tokenizer": "^2.3.1", + "@csstools/media-query-list-parser": "^2.1.11" }, "engines": { "node": "^14 || ^16 || >=18" @@ -658,9 +658,9 @@ } }, "node_modules/@csstools/postcss-media-queries-aspect-ratio-number-values": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-2.0.7.tgz", - "integrity": "sha512-HBDAQw1K0NilcHGMUHv8jzf2mpOtcWTVKtuY3AeZ5TS1uyWWNVi5/yuA/tREPLU9WifNdqHQ+rfbsV/8zTIkTg==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-2.0.9.tgz", + "integrity": "sha512-PR0s3tFSxPoKoPLoKuiZuYhwQC5bQxq/gFfywX2u/kh8rMzesARPZYKxE71I3jHWi6KDHGZl9Xb5xcFPwtvLiQ==", "dev": true, "funding": [ { @@ -673,9 +673,9 @@ } ], "dependencies": { - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4", - "@csstools/media-query-list-parser": "^2.1.9" + "@csstools/css-parser-algorithms": "^2.6.3", + "@csstools/css-tokenizer": "^2.3.1", + "@csstools/media-query-list-parser": "^2.1.11" }, "engines": { "node": "^14 || ^16 || >=18" @@ -736,9 +736,9 @@ } }, "node_modules/@csstools/postcss-oklab-function": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-3.0.14.tgz", - "integrity": "sha512-92xdpcfc2wB3z4+GftPA0PXMuGI/tRLw9Tc0+HzpaAHHxyLK6aCJtoQIcw0Ox/PthXtqXZn/3wWT/Idfe8I7Wg==", + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-3.0.16.tgz", + "integrity": "sha512-zm8nND+EraZrmbO4mgcT8FrJrAQUfWNfMmbV5uTCpWtAcO5ycX3E3bO8T1TjczKYRxC5QMM/91n9YExYCF4Mvw==", "dev": true, "funding": [ { @@ -751,9 +751,9 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^2.0.0", - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4", + "@csstools/css-color-parser": "^2.0.2", + "@csstools/css-parser-algorithms": "^2.6.3", + "@csstools/css-tokenizer": "^2.3.1", "@csstools/postcss-progressive-custom-properties": "^3.2.0", "@csstools/utilities": "^1.0.0" }, @@ -790,9 +790,9 @@ } }, "node_modules/@csstools/postcss-relative-color-syntax": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-2.0.14.tgz", - "integrity": "sha512-NlxgLjAjVCTUVGiWk8WNj3dKvux9eC6O5aLM3BmdA8UXEwBHYI9r4IqlanxG9PlcXnzhTUX6eZsqgmxwt4FPow==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-2.0.16.tgz", + "integrity": "sha512-TSM8fVqJkT8JZDranZPnkpxjU/Q1sNR192lXMND+EcKOUjYa6uYpGSfHgjnWjCRiBSciettS+sL7y9wmnas7qQ==", "dev": true, "funding": [ { @@ -805,9 +805,9 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^2.0.0", - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4", + "@csstools/css-color-parser": "^2.0.2", + "@csstools/css-parser-algorithms": "^2.6.3", + "@csstools/css-tokenizer": "^2.3.1", "@csstools/postcss-progressive-custom-properties": "^3.2.0", "@csstools/utilities": "^1.0.0" }, @@ -844,9 +844,9 @@ } }, "node_modules/@csstools/postcss-stepped-value-functions": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-3.0.6.tgz", - "integrity": "sha512-rnyp8tWRuBXERTHVdB5hjUlif5dQgPcyN+BX55wUnYpZ3LN9QPfK2Z3/HUZymwyou8Gg6vhd6X2W+g1pLq1jYg==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-3.0.8.tgz", + "integrity": "sha512-X76+thsvsmH/SkqVbN+vjeFKe1ABGLRx8/Wl68QTb/zvJWdzgx5S/nbszZP5O3nTRc5eI8NxIOrQUiy30fR+0g==", "dev": true, "funding": [ { @@ -859,9 +859,9 @@ } ], "dependencies": { - "@csstools/css-calc": "^1.2.0", - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4" + "@csstools/css-calc": "^1.2.2", + "@csstools/css-parser-algorithms": "^2.6.3", + "@csstools/css-tokenizer": "^2.3.1" }, "engines": { "node": "^14 || ^16 || >=18" @@ -897,9 +897,9 @@ } }, "node_modules/@csstools/postcss-trigonometric-functions": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-3.0.6.tgz", - "integrity": "sha512-i5Zd0bMJooZAn+ZcDmPij2WCkcOJJJ6opzK+QeDjxbMrYmoGQl0CY8FDHdeQyBF1Nly+Q0Fq3S7QfdNLKBBaCg==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-3.0.8.tgz", + "integrity": "sha512-zEzyGriPqoIYFgHJqWNy8bmoxjM4+ONyTap1ZzQK/Lll/VsCYvx0IckB33W/u89uLSVeeB8xC7uTrkoQ7ogKyQ==", "dev": true, "funding": [ { @@ -912,9 +912,9 @@ } ], "dependencies": { - "@csstools/css-calc": "^1.2.0", - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4" + "@csstools/css-calc": "^1.2.2", + "@csstools/css-parser-algorithms": "^2.6.3", + "@csstools/css-tokenizer": "^2.3.1" }, "engines": { "node": "^14 || ^16 || >=18" @@ -968,9 +968,9 @@ } }, "node_modules/@csstools/selector-specificity": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.0.3.tgz", - "integrity": "sha512-KEPNw4+WW5AVEIyzC80rTbWEUatTW2lXpN8+8ILC8PiPeWPjwUzrPZDIOZ2wwqDmeqOYTdSGyL3+vE5GC3FB3Q==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.1.0.tgz", + "integrity": "sha512-tGDFEHZ4XJeIt5NF7/nAfLGqPckmDZSnYne5gl67p4agQolE5s4rofdQ3e+VkeukfR91lVtSQ/Jt9DqM1ICiIQ==", "dev": true, "funding": [ { @@ -1462,9 +1462,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.16.4.tgz", - "integrity": "sha512-GkhjAaQ8oUTOKE4g4gsZ0u8K/IHU1+2WQSgS1TwTcYvL+sjbaQjNHFXbOJ6kgqGHIO1DfUhI/Sphi9GkRT9K+Q==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.17.2.tgz", + "integrity": "sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==", "cpu": [ "arm" ], @@ -1475,9 +1475,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.16.4.tgz", - "integrity": "sha512-Bvm6D+NPbGMQOcxvS1zUl8H7DWlywSXsphAeOnVeiZLQ+0J6Is8T7SrjGTH29KtYkiY9vld8ZnpV3G2EPbom+w==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.17.2.tgz", + "integrity": "sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==", "cpu": [ "arm64" ], @@ -1488,9 +1488,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.16.4.tgz", - "integrity": "sha512-i5d64MlnYBO9EkCOGe5vPR/EeDwjnKOGGdd7zKFhU5y8haKhQZTN2DgVtpODDMxUr4t2K90wTUJg7ilgND6bXw==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.17.2.tgz", + "integrity": "sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==", "cpu": [ "arm64" ], @@ -1501,9 +1501,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.16.4.tgz", - "integrity": "sha512-WZupV1+CdUYehaZqjaFTClJI72fjJEgTXdf4NbW69I9XyvdmztUExBtcI2yIIU6hJtYvtwS6pkTkHJz+k08mAQ==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.17.2.tgz", + "integrity": "sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==", "cpu": [ "x64" ], @@ -1514,9 +1514,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.16.4.tgz", - "integrity": "sha512-ADm/xt86JUnmAfA9mBqFcRp//RVRt1ohGOYF6yL+IFCYqOBNwy5lbEK05xTsEoJq+/tJzg8ICUtS82WinJRuIw==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.17.2.tgz", + "integrity": "sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==", "cpu": [ "arm" ], @@ -1527,9 +1527,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.16.4.tgz", - "integrity": "sha512-tJfJaXPiFAG+Jn3cutp7mCs1ePltuAgRqdDZrzb1aeE3TktWWJ+g7xK9SNlaSUFw6IU4QgOxAY4rA+wZUT5Wfg==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.17.2.tgz", + "integrity": "sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==", "cpu": [ "arm" ], @@ -1540,9 +1540,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.16.4.tgz", - "integrity": "sha512-7dy1BzQkgYlUTapDTvK997cgi0Orh5Iu7JlZVBy1MBURk7/HSbHkzRnXZa19ozy+wwD8/SlpJnOOckuNZtJR9w==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.17.2.tgz", + "integrity": "sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==", "cpu": [ "arm64" ], @@ -1553,9 +1553,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.16.4.tgz", - "integrity": "sha512-zsFwdUw5XLD1gQe0aoU2HVceI6NEW7q7m05wA46eUAyrkeNYExObfRFQcvA6zw8lfRc5BHtan3tBpo+kqEOxmg==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.17.2.tgz", + "integrity": "sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==", "cpu": [ "arm64" ], @@ -1566,9 +1566,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.16.4.tgz", - "integrity": "sha512-p8C3NnxXooRdNrdv6dBmRTddEapfESEUflpICDNKXpHvTjRRq1J82CbU5G3XfebIZyI3B0s074JHMWD36qOW6w==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.17.2.tgz", + "integrity": "sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==", "cpu": [ "ppc64" ], @@ -1579,9 +1579,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.16.4.tgz", - "integrity": "sha512-Lh/8ckoar4s4Id2foY7jNgitTOUQczwMWNYi+Mjt0eQ9LKhr6sK477REqQkmy8YHY3Ca3A2JJVdXnfb3Rrwkng==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.17.2.tgz", + "integrity": "sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==", "cpu": [ "riscv64" ], @@ -1592,9 +1592,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.16.4.tgz", - "integrity": "sha512-1xwwn9ZCQYuqGmulGsTZoKrrn0z2fAur2ujE60QgyDpHmBbXbxLaQiEvzJWDrscRq43c8DnuHx3QorhMTZgisQ==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.17.2.tgz", + "integrity": "sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==", "cpu": [ "s390x" ], @@ -1605,9 +1605,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.16.4.tgz", - "integrity": "sha512-LuOGGKAJ7dfRtxVnO1i3qWc6N9sh0Em/8aZ3CezixSTM+E9Oq3OvTsvC4sm6wWjzpsIlOCnZjdluINKESflJLA==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.17.2.tgz", + "integrity": "sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==", "cpu": [ "x64" ], @@ -1618,9 +1618,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.16.4.tgz", - "integrity": "sha512-ch86i7KkJKkLybDP2AtySFTRi5fM3KXp0PnHocHuJMdZwu7BuyIKi35BE9guMlmTpwwBTB3ljHj9IQXnTCD0vA==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.17.2.tgz", + "integrity": "sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==", "cpu": [ "x64" ], @@ -1631,9 +1631,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.16.4.tgz", - "integrity": "sha512-Ma4PwyLfOWZWayfEsNQzTDBVW8PZ6TUUN1uFTBQbF2Chv/+sjenE86lpiEwj2FiviSmSZ4Ap4MaAfl1ciF4aSA==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.17.2.tgz", + "integrity": "sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==", "cpu": [ "arm64" ], @@ -1644,9 +1644,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.16.4.tgz", - "integrity": "sha512-9m/ZDrQsdo/c06uOlP3W9G2ENRVzgzbSXmXHT4hwVaDQhYcRpi9bgBT0FTG9OhESxwK0WjQxYOSfv40cU+T69w==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.17.2.tgz", + "integrity": "sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==", "cpu": [ "ia32" ], @@ -1657,9 +1657,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.16.4.tgz", - "integrity": "sha512-YunpoOAyGLDseanENHmbFvQSfVL5BxW3k7hhy0eN4rb3gS/ct75dVD0EXOWIqFT/nE8XYW6LP6vz6ctKRi0k9A==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.17.2.tgz", + "integrity": "sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==", "cpu": [ "x64" ], @@ -1676,25 +1676,25 @@ "dev": true }, "node_modules/@types/linkify-it": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.5.tgz", - "integrity": "sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", "dev": true }, "node_modules/@types/markdown-it": { - "version": "12.2.3", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz", - "integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==", + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.1.tgz", + "integrity": "sha512-4NpsnpYl2Gt1ljyBGrKMxFYAYvpqbnnkgP/i/g+NLpjEUa3obn1XJCur9YbEXKDAkaXqsR1LbDnGEJ0MmKFxfg==", "dev": true, "dependencies": { - "@types/linkify-it": "*", - "@types/mdurl": "*" + "@types/linkify-it": "^5", + "@types/mdurl": "^2" } }, "node_modules/@types/mdurl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.5.tgz", - "integrity": "sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", "dev": true }, "node_modules/acorn": { @@ -1865,9 +1865,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001612", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001612.tgz", - "integrity": "sha512-lFgnZ07UhaCcsSZgWW0K5j4e69dK1u/ltrL9lTUiFOwNHs12S3UMIEYgBV0Z6C6hRDev7iRnMzzYmKabYdXF9g==", + "version": "1.0.30001617", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001617.tgz", + "integrity": "sha512-mLyjzNI9I+Pix8zwcrpxEbGlfqOkF9kM3ptzmKNw5tizSyYwMe+nGLTqMK9cO+0E+Bh6TsBxNAaHWEM8xwSsmA==", "dev": true, "funding": [ { @@ -1933,9 +1933,9 @@ } }, "node_modules/clean-jsdoc-theme": { - "version": "4.2.18", - "resolved": "https://registry.npmjs.org/clean-jsdoc-theme/-/clean-jsdoc-theme-4.2.18.tgz", - "integrity": "sha512-iPz34GEhTZGW33Oi25IUgW1suGFuQZoDoCjn82BEI7Ck83CvJisrrxYv3WLjHA/wz8g82wy8WsUyRiTGajUZdw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/clean-jsdoc-theme/-/clean-jsdoc-theme-4.3.0.tgz", + "integrity": "sha512-QMrBdZ2KdPt6V2Ytg7dIt0/q32U4COpxvR0UDhPjRRKRL0o0MvRCR5YpY37/4rPF1SI1AYEKAWyof7ndCb/dzA==", "dev": true, "dependencies": { "@jsdoc/salty": "^0.2.4", @@ -1984,9 +1984,9 @@ } }, "node_modules/css-has-pseudo": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-6.0.3.tgz", - "integrity": "sha512-qIsDxK/z0byH/mpNsv5hzQ5NOl8m1FRmOLgZpx4bG5uYHnOlO2XafeMI4mFIgNSViHwoUWcxSJZyyijaAmbs+A==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-6.0.4.tgz", + "integrity": "sha512-u9vuyeksska4OMRC061xTQb2RJZv7T1JJjnZbaQpNhZRPF1UqGpBqHnlcwRS/1vv+QOpD4NVsaFT4U1zmkciuA==", "dev": true, "funding": [ { @@ -1999,7 +1999,7 @@ } ], "dependencies": { - "@csstools/selector-specificity": "^3.0.3", + "@csstools/selector-specificity": "^3.1.0", "postcss-selector-parser": "^6.0.13", "postcss-value-parser": "^4.2.0" }, @@ -2033,9 +2033,9 @@ } }, "node_modules/cssdb": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.0.0.tgz", - "integrity": "sha512-hfpm8VXc7/dhcEWpLvKDLwImOSk1sa2DxL36OEiY/4h2MGfKjPYIMZo4hnEEl+TCJr2GwcX46jF5TafRASDe9w==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.0.1.tgz", + "integrity": "sha512-diegY/vnOYmPXY0bOBj5jeHaiK8MMpjgPuipirY8pF9AthtqEXgqVdKF5tnb6RTc/ZdhQqG0TBnInQ5CbbUW7Q==", "dev": true, "funding": [ { @@ -2080,9 +2080,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.747", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.747.tgz", - "integrity": "sha512-+FnSWZIAvFHbsNVmUxhEqWiaOiPMcfum1GQzlWCg/wLigVtshOsjXHyEFfmt6cFK6+HkS3QOJBv6/3OPumbBfw==", + "version": "1.4.763", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.763.tgz", + "integrity": "sha512-k4J8NrtJ9QrvHLRo8Q18OncqBCB7tIUyqxRcJnlonQ0ioHKYB988GcDFF3ZePmnb8eHEopDs/wPHR/iGAFgoUQ==", "dev": true }, "node_modules/entities": { @@ -2309,21 +2309,21 @@ } }, "node_modules/jsdoc": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.2.tgz", - "integrity": "sha512-e8cIg2z62InH7azBBi3EsSEqrKx+nUtAS5bBcYTSpZFA+vhNPyhv8PTFZ0WsjOPDj04/dOLlm08EDcQJDqaGQg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.3.tgz", + "integrity": "sha512-Nu7Sf35kXJ1MWDZIMAuATRQTg1iIPdzh7tqJ6jjvaU/GfDf+qi5UV8zJR3Mo+/pYFvm8mzay4+6O5EWigaQBQw==", "dev": true, "dependencies": { "@babel/parser": "^7.20.15", "@jsdoc/salty": "^0.2.1", - "@types/markdown-it": "^12.2.3", + "@types/markdown-it": "^14.1.1", "bluebird": "^3.7.2", "catharsis": "^0.9.0", "escape-string-regexp": "^2.0.0", "js2xmlparser": "^4.0.2", "klaw": "^3.0.0", - "markdown-it": "^12.3.2", - "markdown-it-anchor": "^8.4.1", + "markdown-it": "^14.1.0", + "markdown-it-anchor": "^8.6.7", "marked": "^4.0.10", "mkdirp": "^1.0.4", "requizzle": "^0.2.3", @@ -2374,12 +2374,12 @@ } }, "node_modules/linkify-it": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", - "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", "dev": true, "dependencies": { - "uc.micro": "^1.0.1" + "uc.micro": "^2.0.0" } }, "node_modules/lodash": { @@ -2413,19 +2413,20 @@ } }, "node_modules/markdown-it": { - "version": "12.3.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", - "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", "dev": true, "dependencies": { "argparse": "^2.0.1", - "entities": "~2.1.0", - "linkify-it": "^3.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" }, "bin": { - "markdown-it": "bin/markdown-it.js" + "markdown-it": "bin/markdown-it.mjs" } }, "node_modules/markdown-it-anchor": { @@ -2438,15 +2439,6 @@ "markdown-it": "*" } }, - "node_modules/markdown-it/node_modules/entities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", - "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", - "dev": true, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/marked": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", @@ -2460,9 +2452,9 @@ } }, "node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", "dev": true }, "node_modules/minimatch": { @@ -2651,9 +2643,9 @@ } }, "node_modules/postcss-color-functional-notation": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-6.0.9.tgz", - "integrity": "sha512-8i/ofOArZ4fljp+3g+HI6Pok01Kb8YaSqInrJt2vMimEKrI0ZDNRLpH+wLhXBNu/Bi8zeWDvxhvCqsGSpu8E6Q==", + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-6.0.11.tgz", + "integrity": "sha512-gJ+hAtAsgBF4w7eh28Pg7EA60lx7vE5xO/B/yZawaI6FYHky+5avA9YSe73nJHnAMEVFpCMeJc6Wts5g+niksg==", "dev": true, "funding": [ { @@ -2666,9 +2658,9 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^2.0.0", - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4", + "@csstools/css-color-parser": "^2.0.2", + "@csstools/css-parser-algorithms": "^2.6.3", + "@csstools/css-tokenizer": "^2.3.1", "@csstools/postcss-progressive-custom-properties": "^3.2.0", "@csstools/utilities": "^1.0.0" }, @@ -2732,9 +2724,9 @@ } }, "node_modules/postcss-custom-media": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-10.0.4.tgz", - "integrity": "sha512-Ubs7O3wj2prghaKRa68VHBvuy3KnTQ0zbGwqDYY1mntxJD0QL2AeiAy+AMfl3HBedTCVr2IcFNktwty9YpSskA==", + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-10.0.6.tgz", + "integrity": "sha512-BjihQoIO4Wjqv9fQNExSJIim8UAmkhLxuJnhJsLTRFSba1y1MhxkJK5awsM//6JJ+/Tu5QUxf624RQAvKHv6SA==", "dev": true, "funding": [ { @@ -2747,10 +2739,10 @@ } ], "dependencies": { - "@csstools/cascade-layer-name-parser": "^1.0.9", - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4", - "@csstools/media-query-list-parser": "^2.1.9" + "@csstools/cascade-layer-name-parser": "^1.0.11", + "@csstools/css-parser-algorithms": "^2.6.3", + "@csstools/css-tokenizer": "^2.3.1", + "@csstools/media-query-list-parser": "^2.1.11" }, "engines": { "node": "^14 || ^16 || >=18" @@ -2760,9 +2752,9 @@ } }, "node_modules/postcss-custom-properties": { - "version": "13.3.8", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-13.3.8.tgz", - "integrity": "sha512-OP9yj4yXxYOiW2n2TRpnE7C0yePvBiZb72S22mZVNzZEObdTYFjNaX6oZO4R4E8Ie9RmC/Jxw8EKYSbLrC1EFA==", + "version": "13.3.10", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-13.3.10.tgz", + "integrity": "sha512-ejaalIpl7p0k0L5ngIZ86AZGmp3m1KdeOCbSQTK4gQcB1ncaoPTHorw206+tsZRIhIDYvh5ZButEje6740YDXw==", "dev": true, "funding": [ { @@ -2775,9 +2767,9 @@ } ], "dependencies": { - "@csstools/cascade-layer-name-parser": "^1.0.9", - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4", + "@csstools/cascade-layer-name-parser": "^1.0.11", + "@csstools/css-parser-algorithms": "^2.6.3", + "@csstools/css-tokenizer": "^2.3.1", "@csstools/utilities": "^1.0.0", "postcss-value-parser": "^4.2.0" }, @@ -2789,9 +2781,9 @@ } }, "node_modules/postcss-custom-selectors": { - "version": "7.1.8", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-7.1.8.tgz", - "integrity": "sha512-fqDkGSEsO7+oQaqdRdR8nwwqH+N2uk6LE/2g4myVJJYz/Ly418lHKEleKTdV/GzjBjFcG4n0dbfuH/Pd2BE8YA==", + "version": "7.1.10", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-7.1.10.tgz", + "integrity": "sha512-bV/6+IExyT2J4kMzX6c+ZMlN1xDfjcC4ePr1ywKezcTgwgUn11qQN3jdzFBpo8Dk1K7vO/OYOwMb5AtJP4JZcg==", "dev": true, "funding": [ { @@ -2804,9 +2796,9 @@ } ], "dependencies": { - "@csstools/cascade-layer-name-parser": "^1.0.9", - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4", + "@csstools/cascade-layer-name-parser": "^1.0.11", + "@csstools/css-parser-algorithms": "^2.6.3", + "@csstools/css-tokenizer": "^2.3.1", "postcss-selector-parser": "^6.0.13" }, "engines": { @@ -2976,9 +2968,9 @@ } }, "node_modules/postcss-lab-function": { - "version": "6.0.14", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-6.0.14.tgz", - "integrity": "sha512-ddQS9FRWT8sfl4wfW0ae8fpP2JdLIuhC9pYpHq1077avjrLzg73T9IEVu5QmFa72nJhYFlO9CbqjcoSdEzfY9A==", + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-6.0.16.tgz", + "integrity": "sha512-QWv0VxfjgIl8jBR/wuQcm/o31jn4P/LwzYuVKzNQoO5t7HPcU0d3RfWUiDrHN3frmSv+YYZppr3P81tKFTDyqg==", "dev": true, "funding": [ { @@ -2991,9 +2983,9 @@ } ], "dependencies": { - "@csstools/css-color-parser": "^2.0.0", - "@csstools/css-parser-algorithms": "^2.6.1", - "@csstools/css-tokenizer": "^2.2.4", + "@csstools/css-color-parser": "^2.0.2", + "@csstools/css-parser-algorithms": "^2.6.3", + "@csstools/css-tokenizer": "^2.3.1", "@csstools/postcss-progressive-custom-properties": "^3.2.0", "@csstools/utilities": "^1.0.0" }, @@ -3030,9 +3022,9 @@ } }, "node_modules/postcss-nesting": { - "version": "12.1.2", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-12.1.2.tgz", - "integrity": "sha512-FUmTHGDNundodutB4PUBxt/EPuhgtpk8FJGRsBhOuy+6FnkR2A8RZWIsyyy6XmhvX2DZQQWIkvu+HB4IbJm+Ew==", + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-12.1.3.tgz", + "integrity": "sha512-8XVmgNNYlmIg1qxSP7O5n76nm0I71noCzlSCl7oqaL2opJ5nSB7r8/726yObKrUTRt6ipjiqHB1wYrMVTM66Sg==", "dev": true, "funding": [ { @@ -3046,7 +3038,7 @@ ], "dependencies": { "@csstools/selector-resolve-nested": "^1.1.0", - "@csstools/selector-specificity": "^3.0.3", + "@csstools/selector-specificity": "^3.1.0", "postcss-selector-parser": "^6.0.13" }, "engines": { @@ -3138,9 +3130,9 @@ } }, "node_modules/postcss-preset-env": { - "version": "9.5.9", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-9.5.9.tgz", - "integrity": "sha512-W+WgDH1MOWLT3Fsvknd45pzGMQ8Sp3fmt94Pxeik3Zkqfhw2XUDF8FehfV3Naxw4l/NrKPWLtltPJYVnpjMmfw==", + "version": "9.5.12", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-9.5.12.tgz", + "integrity": "sha512-aSeT8hNFKAgywopQE9MINFR5rZjRoA1MKv/Z09aLNlF3ki7Es3oeoFDx52po1QbBVvFuU9wSH/IosqqAa3oJow==", "dev": true, "funding": [ { @@ -3153,49 +3145,49 @@ } ], "dependencies": { - "@csstools/postcss-cascade-layers": "^4.0.4", - "@csstools/postcss-color-function": "^3.0.14", - "@csstools/postcss-color-mix-function": "^2.0.14", - "@csstools/postcss-exponential-functions": "^1.0.5", + "@csstools/postcss-cascade-layers": "^4.0.5", + "@csstools/postcss-color-function": "^3.0.16", + "@csstools/postcss-color-mix-function": "^2.0.16", + "@csstools/postcss-exponential-functions": "^1.0.7", "@csstools/postcss-font-format-keywords": "^3.0.2", - "@csstools/postcss-gamut-mapping": "^1.0.7", - "@csstools/postcss-gradients-interpolation-method": "^4.0.15", - "@csstools/postcss-hwb-function": "^3.0.13", + "@csstools/postcss-gamut-mapping": "^1.0.9", + "@csstools/postcss-gradients-interpolation-method": "^4.0.17", + "@csstools/postcss-hwb-function": "^3.0.15", "@csstools/postcss-ic-unit": "^3.0.6", "@csstools/postcss-initial": "^1.0.1", - "@csstools/postcss-is-pseudo-class": "^4.0.6", - "@csstools/postcss-light-dark-function": "^1.0.3", + "@csstools/postcss-is-pseudo-class": "^4.0.7", + "@csstools/postcss-light-dark-function": "^1.0.5", "@csstools/postcss-logical-float-and-clear": "^2.0.1", "@csstools/postcss-logical-overflow": "^1.0.1", "@csstools/postcss-logical-overscroll-behavior": "^1.0.1", "@csstools/postcss-logical-resize": "^2.0.1", - "@csstools/postcss-logical-viewport-units": "^2.0.7", - "@csstools/postcss-media-minmax": "^1.1.4", - "@csstools/postcss-media-queries-aspect-ratio-number-values": "^2.0.7", + "@csstools/postcss-logical-viewport-units": "^2.0.9", + "@csstools/postcss-media-minmax": "^1.1.6", + "@csstools/postcss-media-queries-aspect-ratio-number-values": "^2.0.9", "@csstools/postcss-nested-calc": "^3.0.2", "@csstools/postcss-normalize-display-values": "^3.0.2", - "@csstools/postcss-oklab-function": "^3.0.14", + "@csstools/postcss-oklab-function": "^3.0.16", "@csstools/postcss-progressive-custom-properties": "^3.2.0", - "@csstools/postcss-relative-color-syntax": "^2.0.14", + "@csstools/postcss-relative-color-syntax": "^2.0.16", "@csstools/postcss-scope-pseudo-class": "^3.0.1", - "@csstools/postcss-stepped-value-functions": "^3.0.6", + "@csstools/postcss-stepped-value-functions": "^3.0.8", "@csstools/postcss-text-decoration-shorthand": "^3.0.6", - "@csstools/postcss-trigonometric-functions": "^3.0.6", + "@csstools/postcss-trigonometric-functions": "^3.0.8", "@csstools/postcss-unset-value": "^3.0.1", "autoprefixer": "^10.4.19", "browserslist": "^4.22.3", "css-blank-pseudo": "^6.0.2", - "css-has-pseudo": "^6.0.3", + "css-has-pseudo": "^6.0.4", "css-prefers-color-scheme": "^9.0.1", "cssdb": "^8.0.0", "postcss-attribute-case-insensitive": "^6.0.3", "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^6.0.9", + "postcss-color-functional-notation": "^6.0.11", "postcss-color-hex-alpha": "^9.0.4", "postcss-color-rebeccapurple": "^9.0.3", - "postcss-custom-media": "^10.0.4", - "postcss-custom-properties": "^13.3.8", - "postcss-custom-selectors": "^7.1.8", + "postcss-custom-media": "^10.0.6", + "postcss-custom-properties": "^13.3.10", + "postcss-custom-selectors": "^7.1.10", "postcss-dir-pseudo-class": "^8.0.1", "postcss-double-position-gradients": "^5.0.6", "postcss-focus-visible": "^9.0.1", @@ -3203,9 +3195,9 @@ "postcss-font-variant": "^5.0.0", "postcss-gap-properties": "^5.0.1", "postcss-image-set-function": "^6.0.3", - "postcss-lab-function": "^6.0.14", + "postcss-lab-function": "^6.0.16", "postcss-logical": "^7.0.1", - "postcss-nesting": "^12.1.2", + "postcss-nesting": "^12.1.3", "postcss-opacity-percentage": "^2.0.0", "postcss-overflow-shorthand": "^5.0.1", "postcss-page-break": "^3.0.4", @@ -3299,6 +3291,15 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -3330,9 +3331,9 @@ } }, "node_modules/rollup": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.16.4.tgz", - "integrity": "sha512-kuaTJSUbz+Wsb2ATGvEknkI12XV40vIiHmLuFlejoo7HtDok/O5eDDD0UpCVY5bBX5U5RYo8wWP83H7ZsqVEnA==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.17.2.tgz", + "integrity": "sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==", "dev": true, "dependencies": { "@types/estree": "1.0.5" @@ -3345,29 +3346,29 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.16.4", - "@rollup/rollup-android-arm64": "4.16.4", - "@rollup/rollup-darwin-arm64": "4.16.4", - "@rollup/rollup-darwin-x64": "4.16.4", - "@rollup/rollup-linux-arm-gnueabihf": "4.16.4", - "@rollup/rollup-linux-arm-musleabihf": "4.16.4", - "@rollup/rollup-linux-arm64-gnu": "4.16.4", - "@rollup/rollup-linux-arm64-musl": "4.16.4", - "@rollup/rollup-linux-powerpc64le-gnu": "4.16.4", - "@rollup/rollup-linux-riscv64-gnu": "4.16.4", - "@rollup/rollup-linux-s390x-gnu": "4.16.4", - "@rollup/rollup-linux-x64-gnu": "4.16.4", - "@rollup/rollup-linux-x64-musl": "4.16.4", - "@rollup/rollup-win32-arm64-msvc": "4.16.4", - "@rollup/rollup-win32-ia32-msvc": "4.16.4", - "@rollup/rollup-win32-x64-msvc": "4.16.4", + "@rollup/rollup-android-arm-eabi": "4.17.2", + "@rollup/rollup-android-arm64": "4.17.2", + "@rollup/rollup-darwin-arm64": "4.17.2", + "@rollup/rollup-darwin-x64": "4.17.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.17.2", + "@rollup/rollup-linux-arm-musleabihf": "4.17.2", + "@rollup/rollup-linux-arm64-gnu": "4.17.2", + "@rollup/rollup-linux-arm64-musl": "4.17.2", + "@rollup/rollup-linux-powerpc64le-gnu": "4.17.2", + "@rollup/rollup-linux-riscv64-gnu": "4.17.2", + "@rollup/rollup-linux-s390x-gnu": "4.17.2", + "@rollup/rollup-linux-x64-gnu": "4.17.2", + "@rollup/rollup-linux-x64-musl": "4.17.2", + "@rollup/rollup-win32-arm64-msvc": "4.17.2", + "@rollup/rollup-win32-ia32-msvc": "4.17.2", + "@rollup/rollup-win32-x64-msvc": "4.17.2", "fsevents": "~2.3.2" } }, "node_modules/sass": { - "version": "1.75.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.75.0.tgz", - "integrity": "sha512-ShMYi3WkrDWxExyxSZPst4/okE9ts46xZmJDSawJQrnte7M1V9fScVB+uNXOVKRBt0PggHOwoZcn8mYX4trnBw==", + "version": "1.77.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.1.tgz", + "integrity": "sha512-OMEyfirt9XEfyvocduUIOlUSkWOXS/LAt6oblR/ISXCTukyavjex+zQNm51pPCOiFKY1QpWvEH1EeCkgyV3I6w==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -3466,9 +3467,9 @@ } }, "node_modules/terser": { - "version": "5.30.4", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.30.4.tgz", - "integrity": "sha512-xRdd0v64a8mFK9bnsKVdoNP9GQIKUAaJPTaqEQDL4w/J8WaW4sWXXoMZ+6SimPkfT5bElreXf8m9HnmPc3E1BQ==", + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.0.tgz", + "integrity": "sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -3543,9 +3544,9 @@ } }, "node_modules/uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", "dev": true }, "node_modules/underscore": { @@ -3564,9 +3565,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.15.tgz", + "integrity": "sha512-K9HWH62x3/EalU1U6sjSZiylm9C8tgq2mSvshZpqc7QE69RaA2qjhkW2HlNA0tFpEbtyFz7HTqbSdN4MSwUodA==", "dev": true, "funding": [ { @@ -3583,7 +3584,7 @@ } ], "dependencies": { - "escalade": "^3.1.1", + "escalade": "^3.1.2", "picocolors": "^1.0.0" }, "bin": { @@ -3600,9 +3601,9 @@ "dev": true }, "node_modules/vite": { - "version": "5.2.10", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.10.tgz", - "integrity": "sha512-PAzgUZbP7msvQvqdSD+ErD5qGnSFiGOoWmV5yAKUEI0kdhjbH6nMWVyZQC/hSc4aXwc0oJ9aEdIiF9Oje0JFCw==", + "version": "5.2.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.11.tgz", + "integrity": "sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==", "dev": true, "dependencies": { "esbuild": "^0.20.1", diff --git a/package.json b/package.json index a69ec05..8bf66ff 100644 --- a/package.json +++ b/package.json @@ -29,13 +29,13 @@ }, "devDependencies": { "@mxssfd/typedoc-theme": "^1.1.3", - "clean-jsdoc-theme": "^4.2.18", + "clean-jsdoc-theme": "^4.3.0", "docdash": "^2.0.2", - "jsdoc": "^4.0.2", - "postcss-preset-env": "^9.5.9", - "sass": "^1.75.0", + "jsdoc": "^4.0.3", + "postcss-preset-env": "^9.5.12", + "sass": "^1.77.1", "typedoc": "^0.25.13", - "vite": "^5.2.10", + "vite": "^5.2.11", "vite-plugin-externals": "^0.6.2" } }