From 168cae3ce153d509db0d9b4076945c892d2989a4 Mon Sep 17 00:00:00 2001
From: Tsanie <lchen@foresightintelligence.com>
Date: Thu, 7 Mar 2024 12:54:00 +0800
Subject: [PATCH] feature: tooltip in the checkbox feature: add
 GridColumn.getElement feature: column property of `contentWrap` and
 `maxLines` change: line height from 24px to 18px fix: adapt enabled after
 cell changed fix: wrap issue of filter panel

---
 lib/ui/checkbox.d.ts                 |   2 +
 lib/ui/checkbox.js                   |  18 ++-
 lib/ui/css/grid.scss                 |  16 ++-
 lib/ui/css/variables/definition.scss |   2 +-
 lib/ui/grid/column.js                |  41 +++++-
 lib/ui/grid/grid.js                  | 189 +++++++++++++++++++++++---
 package-lock.json                    | 193 +++++++++++++++------------
 package.json                         |   8 +-
 8 files changed, 343 insertions(+), 126 deletions(-)

diff --git a/lib/ui/checkbox.d.ts b/lib/ui/checkbox.d.ts
index 927c979..e79dfcc 100644
--- a/lib/ui/checkbox.d.ts
+++ b/lib/ui/checkbox.d.ts
@@ -14,6 +14,8 @@ interface CheckboxOptions {
     type?: string;
     /** 标签 */
     label?: string | HTMLElement;
+    /** 标签提示文本 */
+    title?: string;
     /** 是否已选中 */
     checked?: boolean;
     /** 图片高度 */
diff --git a/lib/ui/checkbox.js b/lib/ui/checkbox.js
index 731766e..82f4af4 100644
--- a/lib/ui/checkbox.js
+++ b/lib/ui/checkbox.js
@@ -2,7 +2,7 @@ import './css/checkbox.scss';
 import { createElement } from "../functions";
 import { createIcon } from "./icon";
 
-function fillCheckbox(container, type = 'fa-regular', label, tabindex = -1, charactor = 'check') {
+function fillCheckbox(container, type = 'fa-regular', label, tabindex = -1, charactor = 'check', title) {
     container.appendChild(
         createElement('layer', layer => {
             layer.className = 'ui-check-inner';
@@ -24,7 +24,10 @@ function fillCheckbox(container, type = 'fa-regular', label, tabindex = -1, char
         container.appendChild(label);
     } else if (label != null && String(label).length > 0) {
         container.appendChild(
-            createElement('span', span => span.innerText = label)
+            createElement('span', span => {
+                span.innerText = label;
+                span.title = title;
+            })
         );
     }
 }
@@ -52,7 +55,7 @@ export function createRadiobox(opts = {}) {
     if (opts.className) {
         container.classList.add(opts.className);
     }
-    fillCheckbox(container, opts.type, opts.label, opts.tabIndex, 'circle');
+    fillCheckbox(container, opts.type, opts.label, opts.tabIndex, 'circle', opts.title);
     return container;
 }
 
@@ -92,7 +95,7 @@ export function createCheckbox(opts = {}) {
         opts.uncheckedNode.classList.add('unchecked');
         container.appendChild(opts.uncheckedNode);
     } else {
-        fillCheckbox(container, opts.type, opts.label, opts.tabIndex);
+        fillCheckbox(container, opts.type, opts.label, opts.tabIndex, undefined, opts.title);
     }
     return container;
 }
@@ -144,7 +147,7 @@ export function resolveCheckbox(container = document.body, legacy) {
                 label.className = 'ui-check-wrapper';
             }
             label.replaceChildren();
-            fillCheckbox(label, 'fa-regular', text, chk.tabIndex);
+            fillCheckbox(label, 'fa-regular', text, chk.tabIndex, undefined, label.title);
             label.insertBefore(chk, label.firstChild);
         }
     }
@@ -161,7 +164,10 @@ export function resolveCheckbox(container = document.body, legacy) {
             fillCheckbox(box,
                 box.dataset.type,
                 box.dataset.label,
-                box.dataset.tabIndex)
+                box.dataset.tabIndex,
+                undefined,
+                box.title);
+            box.removeAttribute('title');
             box.removeAttribute('data-type');
             box.removeAttribute('data-label');
         }
diff --git a/lib/ui/css/grid.scss b/lib/ui/css/grid.scss
index e5412f8..fa62f2e 100644
--- a/lib/ui/css/grid.scss
+++ b/lib/ui/css/grid.scss
@@ -44,7 +44,7 @@
         --header-padding: 4px 12px 4px 8px;
         --header-filter-padding: 4px 26px 4px 8px;
         --spacing-s: 4px;
-        --spacing-cell: 6px 4px 6px 8px;
+        --spacing-cell: 9px 4px 9px 8px;
         --filter-line-height: 30px;
         --filter-item-padding: 0 4px;
     }
@@ -291,6 +291,10 @@
                             overflow: hidden;
                             text-overflow: ellipsis;
                             white-space: pre;
+
+                            &.wrap {
+                                white-space: normal;
+                            }
                         }
                     }
                 }
@@ -357,6 +361,7 @@
                         }
 
                         >input[type="text"],
+                        >input[type="date"],
                         >textarea {
                             border: none;
                             box-sizing: border-box;
@@ -415,12 +420,8 @@
                         }
 
                         .ui-date-cell {
-                            line-height: 22px;
-                            box-sizing: border-box;
-                            padding: var(--spacing-cell);
-                            border: none;
-                            font-size: var(--font-size);
-                            width: 100%;
+                            height: var(--row-height);
+                            text-indent: 4px;
 
                             &:invalid {
                                 color: rgba(0, 0, 0, .3);
@@ -581,6 +582,7 @@
 
                 .ui-check-wrapper {
                     height: var(--filter-line-height);
+                    line-height: var(--filter-line-height);
                     display: flex;
 
                     .ui-check-inner+* {
diff --git a/lib/ui/css/variables/definition.scss b/lib/ui/css/variables/definition.scss
index c1a7794..0397d2d 100644
--- a/lib/ui/css/variables/definition.scss
+++ b/lib/ui/css/variables/definition.scss
@@ -35,7 +35,7 @@
 
     --border-radius: 2px;
     --text-indent: 4px;
-    --line-height: 24px;
+    --line-height: 18px;
 
     --font-size: .8125rem; // 13px
     --font-smaller-size: .75rem; // 12px
diff --git a/lib/ui/grid/column.js b/lib/ui/grid/column.js
index ee90b6f..990dd90 100644
--- a/lib/ui/grid/column.js
+++ b/lib/ui/grid/column.js
@@ -73,6 +73,15 @@ export class GridColumn {
      * @virtual
      */
 
+    /**
+     * 获取用于判断文本大小的元素
+     * @method
+     * @name GridColumn.getElement
+     * @param {HTMLElement} element - 单元格主内容元素
+     * @returns {HTMLElement} 返回文本元素
+     * @virtual
+     */
+
     /**
      * 获取编辑状态单元格值时调用的方法
      * @method
@@ -153,7 +162,7 @@ export class GridColumn {
     /**
      * @ignore
      */
-    static toString() { return '[object Column]' }
+    static toString() { return 'GridCommon' }
 
     /**
      * @ignore
@@ -234,6 +243,11 @@ export class GridInputColumn extends GridColumn {
         super.setEnabled(element, enabled);
         element.disabled = enabled === false;
     }
+
+    /**
+     * @ignore
+     */
+    static toString() { return 'GridInput' }
 }
 
 /**
@@ -280,6 +294,11 @@ export class GridTextColumn extends GridInputColumn {
             // TODO: bad performance
         }
     }
+
+    /**
+     * @ignore
+     */
+    static toString() { return 'GridText' }
 }
 
 const SymbolDropdown = Symbol.for('ui-dropdown');
@@ -477,6 +496,11 @@ export class GridDropdownColumn extends GridColumn {
             drop.onCollapsed();
         }
     }
+
+    /**
+     * @ignore
+     */
+    static toString() { return 'GridDropdown' }
 }
 
 /**
@@ -538,6 +562,11 @@ export class GridCheckboxColumn extends GridColumn {
         super.setEnabled(element, enabled);
         element.querySelector('input').disabled = enabled === false;
     }
+
+    /**
+     * @ignore
+     */
+    static toString() { return 'GridCheckbox' }
 }
 
 /**
@@ -609,6 +638,11 @@ export class GridIconColumn extends GridColumn {
             element.classList.remove('disabled');
         }
     }
+
+    /**
+     * @ignore
+     */
+    static toString() { return 'GridIcon' }
 }
 
 /**
@@ -700,4 +734,9 @@ export class GridDateColumn extends GridColumn {
     static formatDate(date) {
         return formatDate(date);
     }
+
+    /**
+     * @ignore
+     */
+    static toString() { return 'GridDate' }
 }
\ No newline at end of file
diff --git a/lib/ui/grid/grid.js b/lib/ui/grid/grid.js
index 23774e6..6cac4a0 100644
--- a/lib/ui/grid/grid.js
+++ b/lib/ui/grid/grid.js
@@ -13,7 +13,7 @@ import { GridColumn, GridInputColumn, GridTextColumn, GridDropdownColumn, GridCh
 /**
  * @author Tsanie Lily <tsorgy@gmail.com>
  * @license MIT
- * @version 1.0.1
+ * @version 1.0.2
  */
 
 const ColumnChangedType = {
@@ -234,7 +234,9 @@ let r = lang;
  * @property {boolean} [orderable=true] - 列是否允许重排顺序
  * @property {boolean} [allcheck=false] - 列为复选框类型时是否在列头增加全选复选框
  * @property {boolean} [shrink=false] - 列为收缩列,禁用自动调整大小
- * @property {string} [class] - 单元格元素的额外样式类型字符串(仅在重建行元素时读取)
+ * @property {string} [class] - 单元格元素的额外样式类型字符串(仅在重建行元素时设置)
+ * @property {boolean} [contentWrap=false] - 单元格文本是否换行(仅在重建行元素时设置)
+ * @property {number} [maxLines=0] - 大于 0 时限制显示最大行数
  * @property {any} [css] - 单元格css样式对象(仅在重建行元素时读取)
  * @property {any} [totalCss] - 合计行样式(仅在重建合计行元素时读取)
  * @property {(any | GridItemObjectCallback)} [style] - 单元格样式(填充行列数据时读取),支持直接返回样式对象或调用函数返回(若赋值则忽略 [styleFilter]{@linkcode GridColumnDefinition#styleFilter})
@@ -588,6 +590,12 @@ export class Grid {
          * @private
          */
         currentSource: null,
+        /**
+         * 列可用性的关联字典
+         * @type {KeyMap<string | boolean>}
+         * @private
+         */
+        enabledDict: {},
         /**
          * 合计行数据
          * @type {GridRowItem}
@@ -825,10 +833,10 @@ export class Grid {
     /**
      * 文本行高(多行文本列计算高度时使用)
      * @type {number}
-     * @default 24
+     * @default 18
      * @ignore
      */
-    lineHeight = 24;
+    lineHeight = 18;
     /**
      * 列头未过滤时的图标
      * @type {string}
@@ -1046,7 +1054,7 @@ export class Grid {
      * @property {number} [virtualCount=100] - 行数大于等于该值则启用虚模式
      * @property {boolean} [autoResize=true] - 未设置宽度的列自动调整列宽
      * @property {number} [rowHeight=36] - 表格行高
-     * @property {number} [lineHeight=24] - 文本行高(多行文本列计算高度时使用)
+     * @property {number} [lineHeight=18] - 文本行高(多行文本列计算高度时使用)
      * @property {string} [filterIcon=ellipsis-h] - 列头未过滤时的图标
      * @property {string} [filteredIcon=filter] - 列头已过滤时的图标
      * @property {number} [extraRows=0] - 列表底部留出额外的空白行
@@ -2062,6 +2070,78 @@ export class Grid {
         return array;
     }
 
+    /**
+     * 导出已压缩的数据源,结构为
+     * ```
+     * {
+     *   columns: [],
+     *   source: [],
+     *   rowHeight: number,
+     *   sortDirection: number,
+     *   sortKey?: string,
+     *   sortArray?: Array<{
+     *     column: string,
+     *     order: "asc" | "desc"
+     *   }>
+     * }
+     * ```
+     * @returns {Promise<Uint8Array>} 返回 `Uint8Array` 数据对象
+     * @since 1.0.2
+     */
+    export() {
+        const js = new Blob(['function h(e,t,o){if(null==e)return"";let r;const l={},h={};let s="",n="",p="",a=2,f=3,c=2;const u=[];let i=0,d=0;for(let w=0;w<e.length;w+=1)if(s=e.charAt(w),Object.prototype.hasOwnProperty.call(l,s)||(l[s]=f++,h[s]=!0),n=p+s,Object.prototype.hasOwnProperty.call(l,n))p=n;else{if(Object.prototype.hasOwnProperty.call(h,p)){if(p.charCodeAt(0)<256){for(let e=0;e<c;e++)i<<=1,d==t-1?(d=0,u.push(o(i)),i=0):d++;r=p.charCodeAt(0);for(let e=0;e<8;e++)i=i<<1|1&r,d==t-1?(d=0,u.push(o(i)),i=0):d++,r>>=1}else{r=1;for(let e=0;e<c;e++)i=i<<1|r,d==t-1?(d=0,u.push(o(i)),i=0):d++,r=0;r=p.charCodeAt(0);for(let e=0;e<16;e++)i=i<<1|1&r,d==t-1?(d=0,u.push(o(i)),i=0):d++,r>>=1}0==--a&&(a=Math.pow(2,c),c++),delete h[p]}else{r=l[p];for(let e=0;e<c;e++)i=i<<1|1&r,d==t-1?(d=0,u.push(o(i)),i=0):d++,r>>=1}0==--a&&(a=Math.pow(2,c),c++),l[n]=f++,p=String(s)}if(""!==p){if(Object.prototype.hasOwnProperty.call(h,p)){if(p.charCodeAt(0)<256){for(let e=0;e<c;e++)i<<=1,d==t-1?(d=0,u.push(o(i)),i=0):d++;r=p.charCodeAt(0);for(let e=0;e<8;e++)i=i<<1|1&r,d==t-1?(d=0,u.push(o(i)),i=0):d++,r>>=1}else{r=1;for(let e=0;e<c;e++)i=i<<1|r,d==t-1?(d=0,u.push(o(i)),i=0):d++,r=0;r=p.charCodeAt(0);for(let e=0;e<16;e++)i=i<<1|1&r,d==t-1?(d=0,u.push(o(i)),i=0):d++,r>>=1}0==--a&&(a=Math.pow(2,c),c++),delete h[p]}else{r=l[p];for(let e=0;e<c;e++)i=i<<1|1&r,d==t-1?(d=0,u.push(o(i)),i=0):d++,r>>=1}0==--a&&(a=Math.pow(2,c),c++)}r=2;for(let e=0;e<c;e++)i=i<<1|1&r,d==t-1?(d=0,u.push(o(i)),i=0):d++,r>>=1;let w=!0;do{i<<=1,d==t-1?(u.push(o(i)),w=!1):d++}while(w);return u.join("")}function s(e){return null==e?"":h(e,16,e=>String.fromCharCode(e))}function i(e){const t=s(e),o=new Uint8Array(2*t.length);for(let e=0,r=t.length;e<r;e++){const r=t.charCodeAt(e);o[2*e]=r>>>8,o[2*e+1]=r%256}return o}self.addEventListener("message",function(e){this.self.postMessage(i(e.data))},!1);']);
+        return new Promise((resolve, reject) => {
+            let working;
+            const url = URL.createObjectURL(js);
+            const worker = new Worker(url);
+            /**
+             * @private
+             * @param {Function} next 
+             * @param {any} data 
+             */
+            const terminate = (next, data) => {
+                working = false;
+                worker.terminate();
+                URL.revokeObjectURL(url);
+                next(data);
+            }
+            // 超过 10 秒则拒绝
+            const timer = setTimeout(() => {
+                if (working) {
+                    terminate(reject, { message: 'timeout' });
+                }
+            }, 10000);
+            worker.addEventListener('message', e => {
+                if (working) {
+                    clearTimeout(timer);
+                    terminate(resolve, e.data);
+                }
+            })
+            worker.addEventListener('error', e => {
+                if (working) {
+                    clearTimeout(timer);
+                    terminate(reject, e);
+                }
+            })
+            working = true;
+            worker.postMessage(JSON.stringify({
+                columns: this.columns.map(c => ({
+                    key: c.key,
+                    type: c.type?.toString(),
+                    caption: c.caption,
+                    width: c.width,
+                    align: c.align,
+                    visible: c.visible
+                })),
+                source: this.source,
+                rowHeight: this.rowHeight,
+                sortDirection: this.sortDirection,
+                sortKey: this.sortKey,
+                sortArray: this.sortArray
+            }));
+        });
+    }
+
     /**
      * @private
      * @callback PrivateGridComparerCallback
@@ -2387,10 +2467,13 @@ export class Grid {
                 if (style !== '') {
                     cell.style.cssText = style;
                 }
-                const element = GridColumn.create(col)
+                const element = GridColumn.create(col);
                 if (typeof col.class === 'string') {
                     GridColumn.setClass(element, col.class);
                 }
+                if (col.contentWrap) {
+                    element.classList.add('wrap');
+                }
                 cell.appendChild(element);
             } else {
                 cell.style.display = 'none';
@@ -2474,6 +2557,9 @@ export class Grid {
                             if (typeof col.class === 'string') {
                                 type.setClass(element, col.class);
                             }
+                            if (col.contentWrap) {
+                                element.classList.add('wrap');
+                            }
                         }
                         cell.appendChild(element);
                         if (col.events != null) {
@@ -2649,6 +2735,9 @@ export class Grid {
                         if (typeof col.class === 'string') {
                             type.setClass(element, col.class);
                         }
+                        if (col.contentWrap) {
+                            element.classList.add('wrap');
+                        }
                         cell.replaceChildren(element);
                         if (col.events != null) {
                             for (let ev of Object.entries(col.events)) {
@@ -2666,6 +2755,7 @@ export class Grid {
                         delete virtualCell.attrs;
                         delete virtualCell.style;
                         delete virtualCell.value;
+                        delete virtualCell.enabled;
                     }
                     if (typeof type.setEditing === 'function') {
                         type.setEditing(element, virtualRow.editing);
@@ -2675,15 +2765,17 @@ export class Grid {
                     virtualCell.value = val;
                     type.setValue(element, val, vals, col, this);
                 }
-                if (virtualRow.editing && typeof type.setEnabled === 'function') {
+                if (typeof type.setEnabled === 'function') {
                     let enabled;
                     if (readonly) {
                         enabled = false;
                     } else {
                         enabled = col.enabled;
                         if (typeof enabled === 'function') {
+                            this._var.enabledDict[col.key] = true;
                             enabled = enabled.call(col, item);
                         } else if (typeof enabled === 'string') {
+                            this._var.enabledDict[col.key] = enabled;
                             enabled = item[enabled];
                         }
                     }
@@ -2720,6 +2812,14 @@ export class Grid {
                 } else if (typeof col.styleFilter === 'function') {
                     style = col.styleFilter(item);
                 }
+                if (col.maxLines > 0) {
+                    const maxHeight = `${col.maxLines * this.lineHeight}px`;
+                    if (style == null) {
+                        style = { 'max-height': maxHeight };
+                    } else {
+                        style['max-height'] = maxHeight;
+                    }
+                }
                 const styleText = style != null ? convertCssStyle(style) : '';
                 if (styleText !== virtualCell.style) {
                     virtualCell.style = styleText;
@@ -3420,9 +3520,11 @@ export class Grid {
     _doFillFilterList(content, array, all) {
         for (let item of array) {
             const div = createElement('div', 'filter-item');
+            const display = Object.prototype.hasOwnProperty.call(item, 'DisplayValue') ? item.DisplayValue : item;
             div.appendChild(createCheckbox({
                 checked: item.__checked,
-                label: Object.prototype.hasOwnProperty.call(item, 'DisplayValue') ? item.DisplayValue : item,
+                label: display && String(display).replace(/(\r\n|\n|<br[ \t]*\/?>)/g, '\u00a0'),
+                title: display,
                 onchange: e => {
                     item.__checked = e.target.checked;
                     all.querySelector('input').checked = ![...content.querySelectorAll('input')].some(i => !i.checked);
@@ -3708,7 +3810,25 @@ export class Grid {
             // sub ui-grid
             return;
         }
-        const element = target.children[0];
+        const row = target.dataset.row;
+        if (this._var.virtualRows[row]?.editing) {
+            delete holder.dataset.row;
+            delete holder.dataset.col;
+            if (holder.classList.contains('active')) {
+                holder.classList.remove('active');
+            }
+            return;
+        }
+        const col = target.dataset.col;
+        if (holder.dataset.row === row &&
+            holder.dataset.col === col) {
+            return;
+        }
+        const type = this._var.colTypes[this.columns[col]?.key];
+        let element = target.children[0];
+        if (type != null && typeof type.getElement === 'function') {
+            element = type.getElement(element);
+        }
         if (element?.tagName !== 'SPAN') {
             if (holder.classList.contains('active')) {
                 delete holder.dataset.row;
@@ -3717,13 +3837,8 @@ export class Grid {
             }
             return;
         }
-        const row = target.dataset.row;
-        const col = target.dataset.col;
-        if (holder.dataset.row === row &&
-            holder.dataset.col === col) {
-            return;
-        }
-        if (element.scrollWidth > element.offsetWidth) {
+        if (element.scrollWidth > element.offsetWidth ||
+            element.scrollHeight > element.offsetHeight) {
             holder.dataset.row = row;
             holder.dataset.col = col;
             holder.innerText = element.innerText;
@@ -3738,7 +3853,7 @@ export class Grid {
                 left = maxleft;
             }
             const height = target.offsetHeight;
-            holder.style.cssText = `top: ${top}px; left: ${left}px; max-width: ${this._var.wrapClientWidth}px; height: ${height - 2}px`;
+            holder.style.cssText = `top: ${top}px; left: ${left}px; max-width: ${this._var.wrapClientWidth}px; min-height: ${height - 2}px`;
             holder.classList.add('active');
         } else if (holder.classList.contains('active')) {
             delete holder.dataset.row;
@@ -3852,9 +3967,9 @@ export class Grid {
         if (this._var.currentSource == null) {
             return;
         }
-        const row = this._var.currentSource[this._var.startIndex + index];
-        delete row.source;
-        const item = row.values;
+        const vals = this._var.currentSource[this._var.startIndex + index];
+        delete vals.source;
+        const item = vals.values;
         if (item == null) {
             return;
         }
@@ -3873,7 +3988,8 @@ export class Grid {
                 oldValue ??= val;
                 item[col.key] = value;
             }
-            const virtualCell = this._var.virtualRows[index]?.cells[col.key];
+            const virtualRow = this._var.virtualRows[index];
+            const virtualCell = virtualRow.cells[col.key];
             if (virtualCell != null) {
                 virtualCell.value = value;
             }
@@ -3886,7 +4002,36 @@ export class Grid {
             } else {
                 setTooltip(cell.children[0], tip, false, this.element);
             }
-            row.__changed = true;
+            // 调整其他列的可用性
+            const row = this._tableRows[index];
+            const offset = this.expandable ? 1 : 0;
+            this.columns.forEach((c, j) => {
+                const cache = this._var.enabledDict[c.key];
+                if (cache !== true && cache !== col.key) {
+                    return;
+                }
+                const cell = row.children[j + offset];
+                if (cell == null) {
+                    return;
+                }
+                const type = GridColumnTypeEnum.isCheckbox(c.type) ?
+                    GridCheckboxColumn : this._var.colTypes[c.key] ?? GridColumn;
+                if (typeof type.setEnabled === 'function') {
+                    if (typeof c.enabled === 'function') {
+                        enabled = c.enabled(item);
+                    } else if (typeof c.enabled === 'string') {
+                        enabled = item[c.enabled];
+                    } else {
+                        return;
+                    }
+                    const vCell = virtualRow.cells[c.key ?? j];
+                    if (enabled !== vCell.enabled) {
+                        vCell.enabled = enabled;
+                        type.setEnabled(cell.children[0], enabled);
+                    }
+                }
+            });
+            vals.__changed = true;
             if (typeof col.onChanged === 'function') {
                 col.onChanged.call(this, item, value, oldValue, e);
             }
diff --git a/package-lock.json b/package-lock.json
index 6c844b9..8cf2ba6 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,21 +1,21 @@
 {
   "name": "ui-lib",
-  "version": "1.0.1",
+  "version": "1.0.2",
   "lockfileVersion": 3,
   "requires": true,
   "packages": {
     "": {
       "name": "ui-lib",
-      "version": "1.0.1",
+      "version": "1.0.2",
       "devDependencies": {
         "@mxssfd/typedoc-theme": "^1.1.3",
         "clean-jsdoc-theme": "^4.2.17",
         "docdash": "^2.0.2",
         "jsdoc": "^4.0.2",
-        "postcss-preset-env": "^9.4.0",
+        "postcss-preset-env": "^9.5.0",
         "sass": "^1.71.1",
-        "typedoc": "^0.25.10",
-        "vite": "^5.1.4",
+        "typedoc": "^0.25.11",
+        "vite": "^5.1.5",
         "vite-plugin-externals": "^0.6.2"
       }
     },
@@ -945,6 +945,28 @@
         "postcss": "^8.4"
       }
     },
+    "node_modules/@csstools/selector-resolve-nested": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-1.1.0.tgz",
+      "integrity": "sha512-uWvSaeRcHyeNenKg8tp17EVDRkpflmdyvbE0DHo6D/GdBb6PDnCYYU6gRpXhtICMGMcahQmj2zGxwFM/WC8hCg==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/csstools"
+        },
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/csstools"
+        }
+      ],
+      "engines": {
+        "node": "^14 || ^16 || >=18"
+      },
+      "peerDependencies": {
+        "postcss-selector-parser": "^6.0.13"
+      }
+    },
     "node_modules/@csstools/selector-specificity": {
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.0.2.tgz",
@@ -1440,9 +1462,9 @@
       }
     },
     "node_modules/@rollup/rollup-android-arm-eabi": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.12.0.tgz",
-      "integrity": "sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==",
+      "version": "4.12.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.12.1.tgz",
+      "integrity": "sha512-iU2Sya8hNn1LhsYyf0N+L4Gf9Qc+9eBTJJJsaOGUp+7x4n2M9dxTt8UvhJl3oeftSjblSlpCfvjA/IfP3g5VjQ==",
       "cpu": [
         "arm"
       ],
@@ -1453,9 +1475,9 @@
       ]
     },
     "node_modules/@rollup/rollup-android-arm64": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.12.0.tgz",
-      "integrity": "sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==",
+      "version": "4.12.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.12.1.tgz",
+      "integrity": "sha512-wlzcWiH2Ir7rdMELxFE5vuM7D6TsOcJ2Yw0c3vaBR3VOsJFVTx9xvwnAvhgU5Ii8Gd6+I11qNHwndDscIm0HXg==",
       "cpu": [
         "arm64"
       ],
@@ -1466,9 +1488,9 @@
       ]
     },
     "node_modules/@rollup/rollup-darwin-arm64": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.12.0.tgz",
-      "integrity": "sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==",
+      "version": "4.12.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.12.1.tgz",
+      "integrity": "sha512-YRXa1+aZIFN5BaImK+84B3uNK8C6+ynKLPgvn29X9s0LTVCByp54TB7tdSMHDR7GTV39bz1lOmlLDuedgTwwHg==",
       "cpu": [
         "arm64"
       ],
@@ -1479,9 +1501,9 @@
       ]
     },
     "node_modules/@rollup/rollup-darwin-x64": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.12.0.tgz",
-      "integrity": "sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==",
+      "version": "4.12.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.12.1.tgz",
+      "integrity": "sha512-opjWJ4MevxeA8FhlngQWPBOvVWYNPFkq6/25rGgG+KOy0r8clYwL1CFd+PGwRqqMFVQ4/Qd3sQu5t7ucP7C/Uw==",
       "cpu": [
         "x64"
       ],
@@ -1492,9 +1514,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.12.0.tgz",
-      "integrity": "sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==",
+      "version": "4.12.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.12.1.tgz",
+      "integrity": "sha512-uBkwaI+gBUlIe+EfbNnY5xNyXuhZbDSx2nzzW8tRMjUmpScd6lCQYKY2V9BATHtv5Ef2OBq6SChEP8h+/cxifQ==",
       "cpu": [
         "arm"
       ],
@@ -1505,9 +1527,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-arm64-gnu": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.12.0.tgz",
-      "integrity": "sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==",
+      "version": "4.12.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.12.1.tgz",
+      "integrity": "sha512-0bK9aG1kIg0Su7OcFTlexkVeNZ5IzEsnz1ept87a0TUgZ6HplSgkJAnFpEVRW7GRcikT4GlPV0pbtVedOaXHQQ==",
       "cpu": [
         "arm64"
       ],
@@ -1518,9 +1540,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-arm64-musl": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.12.0.tgz",
-      "integrity": "sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==",
+      "version": "4.12.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.12.1.tgz",
+      "integrity": "sha512-qB6AFRXuP8bdkBI4D7UPUbE7OQf7u5OL+R94JE42Z2Qjmyj74FtDdLGeriRyBDhm4rQSvqAGCGC01b8Fu2LthQ==",
       "cpu": [
         "arm64"
       ],
@@ -1531,9 +1553,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-riscv64-gnu": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.12.0.tgz",
-      "integrity": "sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==",
+      "version": "4.12.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.12.1.tgz",
+      "integrity": "sha512-sHig3LaGlpNgDj5o8uPEoGs98RII8HpNIqFtAI8/pYABO8i0nb1QzT0JDoXF/pxzqO+FkxvwkHZo9k0NJYDedg==",
       "cpu": [
         "riscv64"
       ],
@@ -1544,9 +1566,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-x64-gnu": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.12.0.tgz",
-      "integrity": "sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==",
+      "version": "4.12.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.12.1.tgz",
+      "integrity": "sha512-nD3YcUv6jBJbBNFvSbp0IV66+ba/1teuBcu+fBBPZ33sidxitc6ErhON3JNavaH8HlswhWMC3s5rgZpM4MtPqQ==",
       "cpu": [
         "x64"
       ],
@@ -1557,9 +1579,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-x64-musl": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.12.0.tgz",
-      "integrity": "sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==",
+      "version": "4.12.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.12.1.tgz",
+      "integrity": "sha512-7/XVZqgBby2qp/cO0TQ8uJK+9xnSdJ9ct6gSDdEr4MfABrjTyrW6Bau7HQ73a2a5tPB7hno49A0y1jhWGDN9OQ==",
       "cpu": [
         "x64"
       ],
@@ -1570,9 +1592,9 @@
       ]
     },
     "node_modules/@rollup/rollup-win32-arm64-msvc": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.12.0.tgz",
-      "integrity": "sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==",
+      "version": "4.12.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.12.1.tgz",
+      "integrity": "sha512-CYc64bnICG42UPL7TrhIwsJW4QcKkIt9gGlj21gq3VV0LL6XNb1yAdHVp1pIi9gkts9gGcT3OfUYHjGP7ETAiw==",
       "cpu": [
         "arm64"
       ],
@@ -1583,9 +1605,9 @@
       ]
     },
     "node_modules/@rollup/rollup-win32-ia32-msvc": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.12.0.tgz",
-      "integrity": "sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==",
+      "version": "4.12.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.12.1.tgz",
+      "integrity": "sha512-LN+vnlZ9g0qlHGlS920GR4zFCqAwbv2lULrR29yGaWP9u7wF5L7GqWu9Ah6/kFZPXPUkpdZwd//TNR+9XC9hvA==",
       "cpu": [
         "ia32"
       ],
@@ -1596,9 +1618,9 @@
       ]
     },
     "node_modules/@rollup/rollup-win32-x64-msvc": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.12.0.tgz",
-      "integrity": "sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==",
+      "version": "4.12.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.12.1.tgz",
+      "integrity": "sha512-n+vkrSyphvmU0qkQ6QBNXCGr2mKjhP08mPRM/Xp5Ck2FV4NrHU+y6axzDeixUrCBHVUS51TZhjqrKBBsHLKb2Q==",
       "cpu": [
         "x64"
       ],
@@ -1801,9 +1823,9 @@
       }
     },
     "node_modules/caniuse-lite": {
-      "version": "1.0.30001593",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001593.tgz",
-      "integrity": "sha512-UWM1zlo3cZfkpBysd7AS+z+v007q9G1+fLTUU42rQnY6t2axoogPW/xol6T7juU5EUoOhML4WgBIdG+9yYqAjQ==",
+      "version": "1.0.30001594",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001594.tgz",
+      "integrity": "sha512-VblSX6nYqyJVs8DKFMldE2IVCJjZ225LW00ydtUWwh5hk9IfkTOffO6r8gJNsH0qqqeAF8KrbMYA2VEwTlGW5g==",
       "dev": true,
       "funding": [
         {
@@ -2016,9 +2038,9 @@
       }
     },
     "node_modules/electron-to-chromium": {
-      "version": "1.4.690",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.690.tgz",
-      "integrity": "sha512-+2OAGjUx68xElQhydpcbqH50hE8Vs2K6TkAeLhICYfndb67CVH0UsZaijmRUE3rHlIxU1u0jxwhgVe6fK3YANA==",
+      "version": "1.4.694",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.694.tgz",
+      "integrity": "sha512-kM3SwvGTYpBFJSc8jm4IYVMIOzDmAGd/Ry96O9elRiM6iEwHKNKhtXyFGzpfMMIGZD84W4/hyaULlMmNVvLQlQ==",
       "dev": true
     },
     "node_modules/entities": {
@@ -2966,9 +2988,9 @@
       }
     },
     "node_modules/postcss-nesting": {
-      "version": "12.0.4",
-      "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-12.0.4.tgz",
-      "integrity": "sha512-WuCe0KnP4vKjLZK8VNoUWKL8ZLOv/5jiM94mHcI3VszLropHwmjotdUyP/ObzqZpXuQKP2Jf9R12vIHKFSStKw==",
+      "version": "12.1.0",
+      "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-12.1.0.tgz",
+      "integrity": "sha512-QOYnosaZ+mlP6plQrAxFw09UUp2Sgtxj1BVHN+rSVbtV0Yx48zRt9/9F/ZOoxOKBBEsaJk2MYhhVRjeRRw5yuw==",
       "dev": true,
       "funding": [
         {
@@ -2981,6 +3003,7 @@
         }
       ],
       "dependencies": {
+        "@csstools/selector-resolve-nested": "^1.1.0",
         "@csstools/selector-specificity": "^3.0.2",
         "postcss-selector-parser": "^6.0.13"
       },
@@ -3073,9 +3096,9 @@
       }
     },
     "node_modules/postcss-preset-env": {
-      "version": "9.4.0",
-      "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-9.4.0.tgz",
-      "integrity": "sha512-5X2UA4Dn4xo7sJFCxlzW/dAGo71Oxh/K5DVls33hd2e3j06OKnW5FJQTw2hB0wTnGv0f6WcMaVBGFqcEfAgwlw==",
+      "version": "9.5.0",
+      "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-9.5.0.tgz",
+      "integrity": "sha512-ZTrTWCSqKVYSABB1GerMBb6F8Uto5YWIq1nqi+TKOHPzrXMcyJNuJTc0v2lp5WjG4Sfvwdo7HF/7/3j7HskRog==",
       "dev": true,
       "funding": [
         {
@@ -3094,7 +3117,7 @@
         "@csstools/postcss-exponential-functions": "^1.0.4",
         "@csstools/postcss-font-format-keywords": "^3.0.2",
         "@csstools/postcss-gamut-mapping": "^1.0.3",
-        "@csstools/postcss-gradients-interpolation-method": "^4.0.10",
+        "@csstools/postcss-gradients-interpolation-method": "^4.0.11",
         "@csstools/postcss-hwb-function": "^3.0.9",
         "@csstools/postcss-ic-unit": "^3.0.4",
         "@csstools/postcss-initial": "^1.0.1",
@@ -3117,12 +3140,12 @@
         "@csstools/postcss-text-decoration-shorthand": "^3.0.4",
         "@csstools/postcss-trigonometric-functions": "^3.0.5",
         "@csstools/postcss-unset-value": "^3.0.1",
-        "autoprefixer": "^10.4.17",
+        "autoprefixer": "^10.4.18",
         "browserslist": "^4.22.3",
         "css-blank-pseudo": "^6.0.1",
         "css-has-pseudo": "^6.0.2",
         "css-prefers-color-scheme": "^9.0.1",
-        "cssdb": "^7.11.0",
+        "cssdb": "^7.11.1",
         "postcss-attribute-case-insensitive": "^6.0.3",
         "postcss-clamp": "^4.1.0",
         "postcss-color-functional-notation": "^6.0.5",
@@ -3140,7 +3163,7 @@
         "postcss-image-set-function": "^6.0.3",
         "postcss-lab-function": "^6.0.10",
         "postcss-logical": "^7.0.1",
-        "postcss-nesting": "^12.0.3",
+        "postcss-nesting": "^12.1.0",
         "postcss-opacity-percentage": "^2.0.0",
         "postcss-overflow-shorthand": "^5.0.1",
         "postcss-page-break": "^3.0.4",
@@ -3265,9 +3288,9 @@
       }
     },
     "node_modules/rollup": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.12.0.tgz",
-      "integrity": "sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==",
+      "version": "4.12.1",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.12.1.tgz",
+      "integrity": "sha512-ggqQKvx/PsB0FaWXhIvVkSWh7a/PCLQAsMjBc+nA2M8Rv2/HG0X6zvixAB7KyZBRtifBUhy5k8voQX/mRnABPg==",
       "dev": true,
       "dependencies": {
         "@types/estree": "1.0.5"
@@ -3280,19 +3303,19 @@
         "npm": ">=8.0.0"
       },
       "optionalDependencies": {
-        "@rollup/rollup-android-arm-eabi": "4.12.0",
-        "@rollup/rollup-android-arm64": "4.12.0",
-        "@rollup/rollup-darwin-arm64": "4.12.0",
-        "@rollup/rollup-darwin-x64": "4.12.0",
-        "@rollup/rollup-linux-arm-gnueabihf": "4.12.0",
-        "@rollup/rollup-linux-arm64-gnu": "4.12.0",
-        "@rollup/rollup-linux-arm64-musl": "4.12.0",
-        "@rollup/rollup-linux-riscv64-gnu": "4.12.0",
-        "@rollup/rollup-linux-x64-gnu": "4.12.0",
-        "@rollup/rollup-linux-x64-musl": "4.12.0",
-        "@rollup/rollup-win32-arm64-msvc": "4.12.0",
-        "@rollup/rollup-win32-ia32-msvc": "4.12.0",
-        "@rollup/rollup-win32-x64-msvc": "4.12.0",
+        "@rollup/rollup-android-arm-eabi": "4.12.1",
+        "@rollup/rollup-android-arm64": "4.12.1",
+        "@rollup/rollup-darwin-arm64": "4.12.1",
+        "@rollup/rollup-darwin-x64": "4.12.1",
+        "@rollup/rollup-linux-arm-gnueabihf": "4.12.1",
+        "@rollup/rollup-linux-arm64-gnu": "4.12.1",
+        "@rollup/rollup-linux-arm64-musl": "4.12.1",
+        "@rollup/rollup-linux-riscv64-gnu": "4.12.1",
+        "@rollup/rollup-linux-x64-gnu": "4.12.1",
+        "@rollup/rollup-linux-x64-musl": "4.12.1",
+        "@rollup/rollup-win32-arm64-msvc": "4.12.1",
+        "@rollup/rollup-win32-ia32-msvc": "4.12.1",
+        "@rollup/rollup-win32-x64-msvc": "4.12.1",
         "fsevents": "~2.3.2"
       }
     },
@@ -3398,9 +3421,9 @@
       }
     },
     "node_modules/terser": {
-      "version": "5.28.1",
-      "resolved": "https://registry.npmjs.org/terser/-/terser-5.28.1.tgz",
-      "integrity": "sha512-wM+bZp54v/E9eRRGXb5ZFDvinrJIOaTapx3WUokyVGZu5ucVCK55zEgGd5Dl2fSr3jUo5sDiERErUWLY6QPFyA==",
+      "version": "5.29.1",
+      "resolved": "https://registry.npmjs.org/terser/-/terser-5.29.1.tgz",
+      "integrity": "sha512-lZQ/fyaIGxsbGxApKmoPTODIzELy3++mXhS5hOqaAWZjQtpq/hFHAc+rm29NND1rYRxRWKcjuARNwULNXa5RtQ==",
       "dev": true,
       "dependencies": {
         "@jridgewell/source-map": "^0.3.3",
@@ -3440,9 +3463,9 @@
       "dev": true
     },
     "node_modules/typedoc": {
-      "version": "0.25.10",
-      "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.25.10.tgz",
-      "integrity": "sha512-v10rtOFojrjW9og3T+6wAKeJaGMuojU87DXGZ33sfs+554wgPTRG+s07Ag1BjPZI85Y5QPVouPI63JQ6fcQM5w==",
+      "version": "0.25.11",
+      "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.25.11.tgz",
+      "integrity": "sha512-5MbI1W/FOG6oXsd8bdssQidSTeKh8Kt3xA5uKVzI+K99uzP8EGN45uPnPvQesyaWdD+89s4wCQdtWEd8QUbiRg==",
       "dev": true,
       "dependencies": {
         "lunr": "^2.3.9",
@@ -3532,9 +3555,9 @@
       "dev": true
     },
     "node_modules/vite": {
-      "version": "5.1.4",
-      "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.4.tgz",
-      "integrity": "sha512-n+MPqzq+d9nMVTKyewqw6kSt+R3CkvF9QAKY8obiQn8g1fwTscKxyfaYnC632HtBXAQGc1Yjomphwn1dtwGAHg==",
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.5.tgz",
+      "integrity": "sha512-BdN1xh0Of/oQafhU+FvopafUp6WaYenLU/NFoL5WyJL++GxkNfieKzBhM24H3HVsPQrlAqB7iJYTHabzaRed5Q==",
       "dev": true,
       "dependencies": {
         "esbuild": "^0.19.3",
diff --git a/package.json b/package.json
index af1c231..9e4205f 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
 {
   "name": "ui-lib",
   "private": true,
-  "version": "1.0.1",
+  "version": "1.0.2",
   "type": "module",
   "files": [
     "dist"
@@ -32,10 +32,10 @@
     "clean-jsdoc-theme": "^4.2.17",
     "docdash": "^2.0.2",
     "jsdoc": "^4.0.2",
-    "postcss-preset-env": "^9.4.0",
+    "postcss-preset-env": "^9.5.0",
     "sass": "^1.71.1",
-    "typedoc": "^0.25.10",
-    "vite": "^5.1.4",
+    "typedoc": "^0.25.11",
+    "vite": "^5.1.5",
     "vite-plugin-externals": "^0.6.2"
   }
 }