@ioca/react 1.5.4 → 1.5.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4,7 +4,6 @@ Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var jsxRuntime = require('react/jsx-runtime');
6
6
  var material = require('@ricons/material');
7
- var xss = require('xss');
8
7
  var button = require('../button/button.js');
9
8
  var icon = require('../icon/icon.js');
10
9
 
@@ -13,13 +12,18 @@ const exec = (a, b, c) => {
13
12
  return;
14
13
  return document.execCommand(a, b, c);
15
14
  };
15
+ const escapeHtmlAttr = (value) => value
16
+ .replaceAll("&", "&")
17
+ .replaceAll('"', """)
18
+ .replaceAll("<", "&lt;")
19
+ .replaceAll(">", "&gt;");
16
20
  const xssOptions = {
17
21
  onIgnoreTagAttr(tag, name, value) {
18
22
  if (["class", "contenteditable"].includes(name)) {
19
- return name + '="' + xss.escapeAttrValue(value) + '"';
23
+ return name + '="' + escapeHtmlAttr(value) + '"';
20
24
  }
21
25
  if (["data-", "style"].includes(name.substring(0, 5))) {
22
- return name + '="' + xss.escapeAttrValue(value) + '"';
26
+ return name + '="' + escapeHtmlAttr(value) + '"';
23
27
  }
24
28
  },
25
29
  };
@@ -1 +1 @@
1
- {"version":3,"file":"controls.js","sources":["../../../../packages/components/editor/controls.tsx"],"sourcesContent":["import {\r\n ClearAllRound,\r\n FormatBoldRound,\r\n FormatItalicRound,\r\n FormatUnderlinedRound,\r\n RedoRound,\r\n StrikethroughSRound,\r\n UndoRound,\r\n} from \"@ricons/material\";\r\nimport { MouseEvent, ReactNode } from \"react\";\r\nimport { escapeAttrValue, type IFilterXSSOptions } from \"xss\";\r\nimport Button from \"../button\";\r\nimport { IButton } from \"../button/type\";\r\nimport Icon from \"../icon\";\r\nimport { IEditorAddtionControl } from \"./type\";\r\n\r\nexport const exec = (a, b?, c?) => {\r\n if (typeof document === \"undefined\") return;\r\n return document.execCommand(a, b, c);\r\n};\r\n\r\nexport const xssOptions: IFilterXSSOptions = {\r\n onIgnoreTagAttr(tag, name, value) {\r\n if ([\"class\", \"contenteditable\"].includes(name)) {\r\n return name + '=\"' + escapeAttrValue(value) + '\"';\r\n }\r\n if ([\"data-\", \"style\"].includes(name.substring(0, 5))) {\r\n return name + '=\"' + escapeAttrValue(value) + '\"';\r\n }\r\n },\r\n};\r\n\r\nconst handleMouseDown = (e: MouseEvent<HTMLElement>) => {\r\n e.preventDefault();\r\n};\r\n\r\nconst fnMap = {\r\n bold: {\r\n icon: <FormatBoldRound />,\r\n onClick: () => exec(\"bold\"),\r\n },\r\n italic: {\r\n icon: <FormatItalicRound />,\r\n onClick: () => exec(\"italic\"),\r\n },\r\n underline: {\r\n icon: <FormatUnderlinedRound />,\r\n onClick: () => exec(\"underline\"),\r\n },\r\n strike: {\r\n icon: <StrikethroughSRound />,\r\n onClick: () => exec(\"strikeThrough\"),\r\n },\r\n redo: {\r\n icon: <RedoRound />,\r\n onClick: () => exec(\"redo\"),\r\n },\r\n undo: {\r\n icon: <UndoRound />,\r\n onClick: () => exec(\"undo\"),\r\n },\r\n clear: {\r\n icon: <ClearAllRound />,\r\n onClick: () => exec(\"removeFormat\"),\r\n },\r\n};\r\n\r\nconst defaultKeys = [\r\n \"undo\",\r\n \"redo\",\r\n \"bold\",\r\n \"italic\",\r\n \"underline\",\r\n \"strike\",\r\n \"clear\",\r\n] as const;\r\n\r\ntype ControlKey = (typeof defaultKeys)[number];\r\ntype ControlItem = {\r\n icon: ReactNode;\r\n onClick: () => void;\r\n};\r\n\r\nconst typedFnMap: Record<ControlKey, ControlItem> = fnMap;\r\n\r\nexport default function getControls(options: {\r\n controlBtnProps: IButton;\r\n addtionControls?: IEditorAddtionControl[];\r\n getSelection: () => Range | null;\r\n}) {\r\n const { controlBtnProps, addtionControls, getSelection } = options;\r\n\r\n const controls = defaultKeys.map((k) => {\r\n const { icon, onClick } = typedFnMap[k];\r\n\r\n return (\r\n <Button\r\n key={k}\r\n {...controlBtnProps}\r\n onMouseDown={handleMouseDown}\r\n onClick={onClick}\r\n >\r\n <Icon icon={icon} />\r\n </Button>\r\n );\r\n });\r\n\r\n const extControls = (addtionControls ?? []).map((item, index) => (\r\n <Button\r\n key={`addtion-${index}`}\r\n {...controlBtnProps}\r\n onMouseDown={handleMouseDown}\r\n onClick={(e) => item.onClick?.(getSelection(), e)}\r\n >\r\n {item.icon}\r\n </Button>\r\n ));\r\n\r\n return [...controls, ...extControls];\r\n}\r\n"],"names":["escapeAttrValue","_jsx","FormatBoldRound","FormatItalicRound","FormatUnderlinedRound","StrikethroughSRound","RedoRound","UndoRound","ClearAllRound","icon","Button","Icon"],"mappings":";;;;;;;;;;AAgBO,MAAM,IAAI,GAAG,CAAC,CAAC,EAAE,CAAE,EAAE,CAAE,KAAI;IAC9B,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE;IACrC,OAAO,QAAQ,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AACxC;AAEO,MAAM,UAAU,GAAsB;AACzC,IAAA,eAAe,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAA;QAC5B,IAAI,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;YAC7C,OAAO,IAAI,GAAG,IAAI,GAAGA,mBAAe,CAAC,KAAK,CAAC,GAAG,GAAG;QACrD;AACA,QAAA,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;YACnD,OAAO,IAAI,GAAG,IAAI,GAAGA,mBAAe,CAAC,KAAK,CAAC,GAAG,GAAG;QACrD;IACJ,CAAC;;AAGL,MAAM,eAAe,GAAG,CAAC,CAA0B,KAAI;IACnD,CAAC,CAAC,cAAc,EAAE;AACtB,CAAC;AAED,MAAM,KAAK,GAAG;AACV,IAAA,IAAI,EAAE;QACF,IAAI,EAAEC,cAAA,CAACC,wBAAe,EAAA,EAAA,CAAG;AACzB,QAAA,OAAO,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC;AAC9B,KAAA;AACD,IAAA,MAAM,EAAE;QACJ,IAAI,EAAED,cAAA,CAACE,0BAAiB,EAAA,EAAA,CAAG;AAC3B,QAAA,OAAO,EAAE,MAAM,IAAI,CAAC,QAAQ,CAAC;AAChC,KAAA;AACD,IAAA,SAAS,EAAE;QACP,IAAI,EAAEF,cAAA,CAACG,8BAAqB,EAAA,EAAA,CAAG;AAC/B,QAAA,OAAO,EAAE,MAAM,IAAI,CAAC,WAAW,CAAC;AACnC,KAAA;AACD,IAAA,MAAM,EAAE;QACJ,IAAI,EAAEH,cAAA,CAACI,4BAAmB,EAAA,EAAA,CAAG;AAC7B,QAAA,OAAO,EAAE,MAAM,IAAI,CAAC,eAAe,CAAC;AACvC,KAAA;AACD,IAAA,IAAI,EAAE;QACF,IAAI,EAAEJ,cAAA,CAACK,kBAAS,EAAA,EAAA,CAAG;AACnB,QAAA,OAAO,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC;AAC9B,KAAA;AACD,IAAA,IAAI,EAAE;QACF,IAAI,EAAEL,cAAA,CAACM,kBAAS,EAAA,EAAA,CAAG;AACnB,QAAA,OAAO,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC;AAC9B,KAAA;AACD,IAAA,KAAK,EAAE;QACH,IAAI,EAAEN,cAAA,CAACO,sBAAa,EAAA,EAAA,CAAG;AACvB,QAAA,OAAO,EAAE,MAAM,IAAI,CAAC,cAAc,CAAC;AACtC,KAAA;CACJ;AAED,MAAM,WAAW,GAAG;IAChB,MAAM;IACN,MAAM;IACN,MAAM;IACN,QAAQ;IACR,WAAW;IACX,QAAQ;IACR,OAAO;CACD;AAQV,MAAM,UAAU,GAAoC,KAAK;AAE3C,SAAU,WAAW,CAAC,OAInC,EAAA;IACG,MAAM,EAAE,eAAe,EAAE,eAAe,EAAE,YAAY,EAAE,GAAG,OAAO;IAElE,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;QACnC,MAAM,QAAEC,MAAI,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC;QAEvC,QACIR,cAAA,CAACS,cAAM,EAAA,EAAA,GAEC,eAAe,EACnB,WAAW,EAAE,eAAe,EAC5B,OAAO,EAAE,OAAO,EAAA,QAAA,EAEhBT,cAAA,CAACU,YAAI,EAAA,EAAC,IAAI,EAAEF,MAAI,EAAA,CAAI,EAAA,EALf,CAAC,CAMD;AAEjB,IAAA,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,CAAC,eAAe,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,MACxDR,cAAA,CAACS,cAAM,EAAA,EAAA,GAEC,eAAe,EACnB,WAAW,EAAE,eAAe,EAC5B,OAAO,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,OAAO,GAAG,YAAY,EAAE,EAAE,CAAC,CAAC,EAAA,QAAA,EAEhD,IAAI,CAAC,IAAI,EAAA,EALL,CAAA,QAAA,EAAW,KAAK,CAAA,CAAE,CAMlB,CACZ,CAAC;AAEF,IAAA,OAAO,CAAC,GAAG,QAAQ,EAAE,GAAG,WAAW,CAAC;AACxC;;;;;;"}
1
+ {"version":3,"file":"controls.js","sources":["../../../../packages/components/editor/controls.tsx"],"sourcesContent":["import {\r\n ClearAllRound,\r\n FormatBoldRound,\r\n FormatItalicRound,\r\n FormatUnderlinedRound,\r\n RedoRound,\r\n StrikethroughSRound,\r\n UndoRound,\r\n} from \"@ricons/material\";\r\nimport { MouseEvent, ReactNode } from \"react\";\r\nimport { type IFilterXSSOptions } from \"xss\";\r\nimport Button from \"../button\";\r\nimport { IButton } from \"../button/type\";\r\nimport Icon from \"../icon\";\r\nimport { IEditorAddtionControl } from \"./type\";\r\n\r\nexport const exec = (a, b?, c?) => {\r\n if (typeof document === \"undefined\") return;\r\n return document.execCommand(a, b, c);\r\n};\r\n\r\nconst escapeHtmlAttr = (value: string) =>\r\n value\r\n .replaceAll(\"&\", \"&amp;\")\r\n .replaceAll('\"', \"&quot;\")\r\n .replaceAll(\"<\", \"&lt;\")\r\n .replaceAll(\">\", \"&gt;\");\r\n\r\nexport const xssOptions: IFilterXSSOptions = {\r\n onIgnoreTagAttr(tag, name, value) {\r\n if ([\"class\", \"contenteditable\"].includes(name)) {\r\n return name + '=\"' + escapeHtmlAttr(value) + '\"';\r\n }\r\n if ([\"data-\", \"style\"].includes(name.substring(0, 5))) {\r\n return name + '=\"' + escapeHtmlAttr(value) + '\"';\r\n }\r\n },\r\n};\r\n\r\nconst handleMouseDown = (e: MouseEvent<HTMLElement>) => {\r\n e.preventDefault();\r\n};\r\n\r\nconst fnMap = {\r\n bold: {\r\n icon: <FormatBoldRound />,\r\n onClick: () => exec(\"bold\"),\r\n },\r\n italic: {\r\n icon: <FormatItalicRound />,\r\n onClick: () => exec(\"italic\"),\r\n },\r\n underline: {\r\n icon: <FormatUnderlinedRound />,\r\n onClick: () => exec(\"underline\"),\r\n },\r\n strike: {\r\n icon: <StrikethroughSRound />,\r\n onClick: () => exec(\"strikeThrough\"),\r\n },\r\n redo: {\r\n icon: <RedoRound />,\r\n onClick: () => exec(\"redo\"),\r\n },\r\n undo: {\r\n icon: <UndoRound />,\r\n onClick: () => exec(\"undo\"),\r\n },\r\n clear: {\r\n icon: <ClearAllRound />,\r\n onClick: () => exec(\"removeFormat\"),\r\n },\r\n};\r\n\r\nconst defaultKeys = [\r\n \"undo\",\r\n \"redo\",\r\n \"bold\",\r\n \"italic\",\r\n \"underline\",\r\n \"strike\",\r\n \"clear\",\r\n] as const;\r\n\r\ntype ControlKey = (typeof defaultKeys)[number];\r\ntype ControlItem = {\r\n icon: ReactNode;\r\n onClick: () => void;\r\n};\r\n\r\nconst typedFnMap: Record<ControlKey, ControlItem> = fnMap;\r\n\r\nexport default function getControls(options: {\r\n controlBtnProps: IButton;\r\n addtionControls?: IEditorAddtionControl[];\r\n getSelection: () => Range | null;\r\n}) {\r\n const { controlBtnProps, addtionControls, getSelection } = options;\r\n\r\n const controls = defaultKeys.map((k) => {\r\n const { icon, onClick } = typedFnMap[k];\r\n\r\n return (\r\n <Button\r\n key={k}\r\n {...controlBtnProps}\r\n onMouseDown={handleMouseDown}\r\n onClick={onClick}\r\n >\r\n <Icon icon={icon} />\r\n </Button>\r\n );\r\n });\r\n\r\n const extControls = (addtionControls ?? []).map((item, index) => (\r\n <Button\r\n key={`addtion-${index}`}\r\n {...controlBtnProps}\r\n onMouseDown={handleMouseDown}\r\n onClick={(e) => item.onClick?.(getSelection(), e)}\r\n >\r\n {item.icon}\r\n </Button>\r\n ));\r\n\r\n return [...controls, ...extControls];\r\n}\r\n"],"names":["_jsx","FormatBoldRound","FormatItalicRound","FormatUnderlinedRound","StrikethroughSRound","RedoRound","UndoRound","ClearAllRound","icon","Button","Icon"],"mappings":"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"}
@@ -5,10 +5,14 @@ Object.defineProperty(exports, '__esModule', { value: true });
5
5
  var jsxRuntime = require('react/jsx-runtime');
6
6
  var react = require('react');
7
7
  var server = require('react-dom/server');
8
- var xss = require('xss');
9
8
  var list = require('../list/list.js');
10
9
 
11
10
  const MEMTION_TAG_CLASS_NAME = "i-memtion-tag";
11
+ const escapeHtmlAttr = (value) => value
12
+ .replaceAll("&", "&amp;")
13
+ .replaceAll('"', "&quot;")
14
+ .replaceAll("<", "&lt;")
15
+ .replaceAll(">", "&gt;");
12
16
  const getInsertNode = (memtion, option) => memtion?.insert?.(option) ?? option.value;
13
17
  const getInsertText = (memtion, option) => {
14
18
  const nextNode = getInsertNode(memtion, option);
@@ -23,7 +27,7 @@ const getInsertHtml = (memtion, option, sanitizeValue) => {
23
27
  return "";
24
28
  }
25
29
  const content = sanitizeValue(server.renderToStaticMarkup(jsxRuntime.jsx(jsxRuntime.Fragment, { children: nextNode })));
26
- return `<span class="${MEMTION_TAG_CLASS_NAME}" contenteditable="false" data-memtion-value="${xss.escapeAttrValue(String(option.value))}">${content}</span>`;
30
+ return `<span class="${MEMTION_TAG_CLASS_NAME}" contenteditable="false" data-memtion-value="${escapeHtmlAttr(String(option.value))}">${content}</span>`;
27
31
  };
28
32
  const getSelectionRect = (range) => {
29
33
  if (!range)
@@ -1 +1 @@
1
- {"version":3,"file":"memtion.js","sources":["../../../../packages/components/editor/memtion.tsx"],"sourcesContent":["import { memo, ReactNode } from \"react\";\r\nimport { renderToStaticMarkup } from \"react-dom/server\";\r\nimport { escapeAttrValue } from \"xss\";\r\nimport List from \"../list\";\r\nimport { IEditorMemtion, IEditorMemtionOption } from \"./type\";\r\n\r\nexport const MEMTION_TAG_CLASS_NAME = \"i-memtion-tag\";\r\n\r\ninterface IMemtionProps {\r\n visible?: boolean;\r\n rect?: DOMRect | null;\r\n options?: IEditorMemtionOption[];\r\n activeIndex?: number;\r\n onActiveChange?: (index: number) => void;\r\n onSelect?: (option: IEditorMemtionOption) => void;\r\n}\r\n\r\ninterface IInsertMemtionOptionParams {\r\n editor: HTMLDivElement | null;\r\n range: Range | null;\r\n mode: \"rich\" | \"plaintext\";\r\n memtion?: IEditorMemtion;\r\n option: IEditorMemtionOption;\r\n sanitizeValue: (value: string) => string;\r\n}\r\n\r\nconst getInsertNode = (\r\n memtion: IEditorMemtion | undefined,\r\n option: IEditorMemtionOption,\r\n) => memtion?.insert?.(option) ?? option.value;\r\n\r\nconst getInsertText = (\r\n memtion: IEditorMemtion | undefined,\r\n option: IEditorMemtionOption,\r\n) => {\r\n const nextNode = getInsertNode(memtion, option);\r\n\r\n if (typeof nextNode === \"string\" || typeof nextNode === \"number\") {\r\n return `${String(nextNode)} `;\r\n }\r\n\r\n return `${String(option.value)} `;\r\n};\r\n\r\nconst getInsertHtml = (\r\n memtion: IEditorMemtion | undefined,\r\n option: IEditorMemtionOption,\r\n sanitizeValue: (value: string) => string,\r\n) => {\r\n const nextNode = getInsertNode(memtion, option);\r\n\r\n if (nextNode === null || nextNode === undefined || nextNode === false) {\r\n return \"\";\r\n }\r\n\r\n const content = sanitizeValue(\r\n renderToStaticMarkup(<>{nextNode as ReactNode}</>),\r\n );\r\n\r\n return `<span class=\"${MEMTION_TAG_CLASS_NAME}\" contenteditable=\"false\" data-memtion-value=\"${escapeAttrValue(String(option.value))}\">${content}</span>`;\r\n};\r\n\r\nexport const getSelectionRect = (range: Range | null) => {\r\n if (!range) return null;\r\n\r\n const rect = range.getBoundingClientRect();\r\n\r\n if (rect.width || rect.height) {\r\n return rect;\r\n }\r\n\r\n return range.getClientRects()[0] ?? rect;\r\n};\r\n\r\nexport const insertMemtionOption = ({\r\n editor,\r\n range,\r\n mode,\r\n memtion,\r\n option,\r\n sanitizeValue,\r\n}: IInsertMemtionOptionParams) => {\r\n if (!editor || !range) return null;\r\n\r\n const browserSelection = window.getSelection();\r\n if (!browserSelection) return null;\r\n\r\n const nextRange = range.cloneRange();\r\n browserSelection.removeAllRanges();\r\n browserSelection.addRange(nextRange);\r\n editor.focus();\r\n nextRange.deleteContents();\r\n\r\n if (mode === \"plaintext\") {\r\n const text = document.createTextNode(getInsertText(memtion, option));\r\n nextRange.insertNode(text);\r\n nextRange.setStartAfter(text);\r\n } else {\r\n const html = getInsertHtml(memtion, option, sanitizeValue);\r\n const fragment = nextRange.createContextualFragment(html);\r\n const lastNode = fragment.lastChild;\r\n const spacing = document.createTextNode(\" \");\r\n\r\n nextRange.insertNode(fragment);\r\n\r\n if (lastNode) {\r\n nextRange.setStartAfter(lastNode);\r\n nextRange.collapse(true);\r\n }\r\n\r\n nextRange.insertNode(spacing);\r\n nextRange.setStartAfter(spacing);\r\n }\r\n\r\n nextRange.collapse(true);\r\n browserSelection.removeAllRanges();\r\n browserSelection.addRange(nextRange);\r\n\r\n return nextRange;\r\n};\r\n\r\nexport const getMemtionText = (\r\n triggerRange: Range | null,\r\n selectionRange: Range | null,\r\n) => {\r\n if (!triggerRange || !selectionRange) return \"\";\r\n\r\n const range = triggerRange.cloneRange();\r\n range.setEnd(selectionRange.endContainer, selectionRange.endOffset);\r\n\r\n return range.toString();\r\n};\r\n\r\nexport const getMemtionReplaceRange = (\r\n triggerRange: Range | null,\r\n selectionRange: Range | null,\r\n) => {\r\n if (!triggerRange || !selectionRange) return null;\r\n\r\n const range = triggerRange.cloneRange();\r\n range.setEnd(selectionRange.endContainer, selectionRange.endOffset);\r\n\r\n return range;\r\n};\r\n\r\nexport const filterMemtionOptions = (\r\n options: IEditorMemtionOption[],\r\n keyword: string,\r\n) => {\r\n const normalizedKeyword = keyword.trim().toLowerCase();\r\n\r\n if (!normalizedKeyword) {\r\n return options;\r\n }\r\n\r\n return options.filter((option) =>\r\n String(option.value).toLowerCase().includes(normalizedKeyword),\r\n );\r\n};\r\n\r\nconst isMemtionTag = (node: Node | null) =>\r\n node instanceof HTMLElement &&\r\n node.classList.contains(MEMTION_TAG_CLASS_NAME);\r\n\r\nconst getAdjacentMemtionTag = (\r\n range: Range,\r\n direction: \"backward\" | \"forward\",\r\n) => {\r\n const { startContainer, startOffset } = range;\r\n\r\n if (startContainer.nodeType === Node.TEXT_NODE) {\r\n const textNode = startContainer as Text;\r\n\r\n if (direction === \"backward\" && startOffset === 0) {\r\n return isMemtionTag(textNode.previousSibling)\r\n ? (textNode.previousSibling as HTMLElement)\r\n : null;\r\n }\r\n\r\n if (direction === \"forward\" && startOffset === textNode.data.length) {\r\n return isMemtionTag(textNode.nextSibling)\r\n ? (textNode.nextSibling as HTMLElement)\r\n : null;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n const element = startContainer as Element;\r\n const targetIndex =\r\n direction === \"backward\" ? startOffset - 1 : startOffset;\r\n const targetNode = element.childNodes.item(targetIndex);\r\n\r\n return isMemtionTag(targetNode) ? (targetNode as HTMLElement) : null;\r\n};\r\n\r\nexport const removeAdjacentMemtionTag = (\r\n editor: HTMLDivElement | null,\r\n key: \"Backspace\" | \"Delete\",\r\n) => {\r\n if (!editor) return false;\r\n\r\n const selection = window.getSelection();\r\n if (!selection?.rangeCount || !selection.isCollapsed) return false;\r\n\r\n const activeRange = selection.getRangeAt(0);\r\n const tag = getAdjacentMemtionTag(\r\n activeRange,\r\n key === \"Backspace\" ? \"backward\" : \"forward\",\r\n );\r\n\r\n if (!tag || !tag.parentNode) return false;\r\n\r\n const parent = tag.parentNode;\r\n const nextSibling = tag.nextSibling;\r\n const index = Array.prototype.indexOf.call(parent.childNodes, tag);\r\n\r\n if (nextSibling?.nodeType === Node.TEXT_NODE) {\r\n const textNode = nextSibling as Text;\r\n\r\n if (textNode.data.startsWith(\" \")) {\r\n textNode.deleteData(0, 1);\r\n\r\n if (!textNode.data.length) {\r\n nextSibling.remove();\r\n }\r\n }\r\n }\r\n\r\n tag.remove();\r\n\r\n const range = document.createRange();\r\n range.setStart(parent, Math.min(index, parent.childNodes.length));\r\n range.collapse(true);\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n editor.focus();\r\n\r\n return true;\r\n};\r\n\r\nconst Memtion = (props: IMemtionProps) => {\r\n const { visible, rect, options, activeIndex, onActiveChange, onSelect } =\r\n props;\r\n\r\n if (!visible || !rect || !options?.length) {\r\n return null;\r\n }\r\n\r\n return (\r\n <List\r\n className=\"i-editor-memtion\"\r\n type=\"option\"\r\n style={{\r\n position: \"fixed\",\r\n top: rect.bottom,\r\n left: rect.left,\r\n }}\r\n >\r\n {options.map((option, i) => (\r\n <List.Item\r\n key={`${option.value}-${i}`}\r\n type=\"option\"\r\n active={i === activeIndex}\r\n onMouseDown={(e) => e.preventDefault()}\r\n onMouseEnter={() => onActiveChange?.(i)}\r\n onClick={() => onSelect?.(option)}\r\n >\r\n {option.label}\r\n </List.Item>\r\n ))}\r\n </List>\r\n );\r\n};\r\n\r\nexport default memo(Memtion);\r\n"],"names":["renderToStaticMarkup","_jsx","_Fragment","escapeAttrValue","Memtion","List","memo"],"mappings":"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"}
1
+ {"version":3,"file":"memtion.js","sources":["../../../../packages/components/editor/memtion.tsx"],"sourcesContent":["import { memo, ReactNode } from \"react\";\r\nimport { renderToStaticMarkup } from \"react-dom/server\";\r\nimport List from \"../list\";\r\nimport { IEditorMemtion, IEditorMemtionOption } from \"./type\";\r\n\r\nexport const MEMTION_TAG_CLASS_NAME = \"i-memtion-tag\";\r\n\nconst escapeHtmlAttr = (value: string) =>\n value\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll('\"', \"&quot;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\");\n\r\ninterface IMemtionProps {\r\n visible?: boolean;\r\n rect?: DOMRect | null;\r\n options?: IEditorMemtionOption[];\r\n activeIndex?: number;\r\n onActiveChange?: (index: number) => void;\r\n onSelect?: (option: IEditorMemtionOption) => void;\r\n}\r\n\r\ninterface IInsertMemtionOptionParams {\r\n editor: HTMLDivElement | null;\r\n range: Range | null;\r\n mode: \"rich\" | \"plaintext\";\r\n memtion?: IEditorMemtion;\r\n option: IEditorMemtionOption;\r\n sanitizeValue: (value: string) => string;\r\n}\r\n\r\nconst getInsertNode = (\r\n memtion: IEditorMemtion | undefined,\r\n option: IEditorMemtionOption,\r\n) => memtion?.insert?.(option) ?? option.value;\r\n\r\nconst getInsertText = (\r\n memtion: IEditorMemtion | undefined,\r\n option: IEditorMemtionOption,\r\n) => {\r\n const nextNode = getInsertNode(memtion, option);\r\n\r\n if (typeof nextNode === \"string\" || typeof nextNode === \"number\") {\r\n return `${String(nextNode)} `;\r\n }\r\n\r\n return `${String(option.value)} `;\r\n};\r\n\r\nconst getInsertHtml = (\r\n memtion: IEditorMemtion | undefined,\r\n option: IEditorMemtionOption,\r\n sanitizeValue: (value: string) => string,\r\n) => {\r\n const nextNode = getInsertNode(memtion, option);\r\n\r\n if (nextNode === null || nextNode === undefined || nextNode === false) {\r\n return \"\";\r\n }\r\n\r\n const content = sanitizeValue(\r\n renderToStaticMarkup(<>{nextNode as ReactNode}</>),\r\n );\r\n\r\n return `<span class=\"${MEMTION_TAG_CLASS_NAME}\" contenteditable=\"false\" data-memtion-value=\"${escapeHtmlAttr(String(option.value))}\">${content}</span>`;\n};\r\n\r\nexport const getSelectionRect = (range: Range | null) => {\r\n if (!range) return null;\r\n\r\n const rect = range.getBoundingClientRect();\r\n\r\n if (rect.width || rect.height) {\r\n return rect;\r\n }\r\n\r\n return range.getClientRects()[0] ?? rect;\r\n};\r\n\r\nexport const insertMemtionOption = ({\r\n editor,\r\n range,\r\n mode,\r\n memtion,\r\n option,\r\n sanitizeValue,\r\n}: IInsertMemtionOptionParams) => {\r\n if (!editor || !range) return null;\r\n\r\n const browserSelection = window.getSelection();\r\n if (!browserSelection) return null;\r\n\r\n const nextRange = range.cloneRange();\r\n browserSelection.removeAllRanges();\r\n browserSelection.addRange(nextRange);\r\n editor.focus();\r\n nextRange.deleteContents();\r\n\r\n if (mode === \"plaintext\") {\r\n const text = document.createTextNode(getInsertText(memtion, option));\r\n nextRange.insertNode(text);\r\n nextRange.setStartAfter(text);\r\n } else {\r\n const html = getInsertHtml(memtion, option, sanitizeValue);\r\n const fragment = nextRange.createContextualFragment(html);\r\n const lastNode = fragment.lastChild;\r\n const spacing = document.createTextNode(\" \");\r\n\r\n nextRange.insertNode(fragment);\r\n\r\n if (lastNode) {\r\n nextRange.setStartAfter(lastNode);\r\n nextRange.collapse(true);\r\n }\r\n\r\n nextRange.insertNode(spacing);\r\n nextRange.setStartAfter(spacing);\r\n }\r\n\r\n nextRange.collapse(true);\r\n browserSelection.removeAllRanges();\r\n browserSelection.addRange(nextRange);\r\n\r\n return nextRange;\r\n};\r\n\r\nexport const getMemtionText = (\r\n triggerRange: Range | null,\r\n selectionRange: Range | null,\r\n) => {\r\n if (!triggerRange || !selectionRange) return \"\";\r\n\r\n const range = triggerRange.cloneRange();\r\n range.setEnd(selectionRange.endContainer, selectionRange.endOffset);\r\n\r\n return range.toString();\r\n};\r\n\r\nexport const getMemtionReplaceRange = (\r\n triggerRange: Range | null,\r\n selectionRange: Range | null,\r\n) => {\r\n if (!triggerRange || !selectionRange) return null;\r\n\r\n const range = triggerRange.cloneRange();\r\n range.setEnd(selectionRange.endContainer, selectionRange.endOffset);\r\n\r\n return range;\r\n};\r\n\r\nexport const filterMemtionOptions = (\r\n options: IEditorMemtionOption[],\r\n keyword: string,\r\n) => {\r\n const normalizedKeyword = keyword.trim().toLowerCase();\r\n\r\n if (!normalizedKeyword) {\r\n return options;\r\n }\r\n\r\n return options.filter((option) =>\r\n String(option.value).toLowerCase().includes(normalizedKeyword),\r\n );\r\n};\r\n\r\nconst isMemtionTag = (node: Node | null) =>\r\n node instanceof HTMLElement &&\r\n node.classList.contains(MEMTION_TAG_CLASS_NAME);\r\n\r\nconst getAdjacentMemtionTag = (\r\n range: Range,\r\n direction: \"backward\" | \"forward\",\r\n) => {\r\n const { startContainer, startOffset } = range;\r\n\r\n if (startContainer.nodeType === Node.TEXT_NODE) {\r\n const textNode = startContainer as Text;\r\n\r\n if (direction === \"backward\" && startOffset === 0) {\r\n return isMemtionTag(textNode.previousSibling)\r\n ? (textNode.previousSibling as HTMLElement)\r\n : null;\r\n }\r\n\r\n if (direction === \"forward\" && startOffset === textNode.data.length) {\r\n return isMemtionTag(textNode.nextSibling)\r\n ? (textNode.nextSibling as HTMLElement)\r\n : null;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n const element = startContainer as Element;\r\n const targetIndex =\r\n direction === \"backward\" ? startOffset - 1 : startOffset;\r\n const targetNode = element.childNodes.item(targetIndex);\r\n\r\n return isMemtionTag(targetNode) ? (targetNode as HTMLElement) : null;\r\n};\r\n\r\nexport const removeAdjacentMemtionTag = (\r\n editor: HTMLDivElement | null,\r\n key: \"Backspace\" | \"Delete\",\r\n) => {\r\n if (!editor) return false;\r\n\r\n const selection = window.getSelection();\r\n if (!selection?.rangeCount || !selection.isCollapsed) return false;\r\n\r\n const activeRange = selection.getRangeAt(0);\r\n const tag = getAdjacentMemtionTag(\r\n activeRange,\r\n key === \"Backspace\" ? \"backward\" : \"forward\",\r\n );\r\n\r\n if (!tag || !tag.parentNode) return false;\r\n\r\n const parent = tag.parentNode;\r\n const nextSibling = tag.nextSibling;\r\n const index = Array.prototype.indexOf.call(parent.childNodes, tag);\r\n\r\n if (nextSibling?.nodeType === Node.TEXT_NODE) {\r\n const textNode = nextSibling as Text;\r\n\r\n if (textNode.data.startsWith(\" \")) {\r\n textNode.deleteData(0, 1);\r\n\r\n if (!textNode.data.length) {\r\n nextSibling.remove();\r\n }\r\n }\r\n }\r\n\r\n tag.remove();\r\n\r\n const range = document.createRange();\r\n range.setStart(parent, Math.min(index, parent.childNodes.length));\r\n range.collapse(true);\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n editor.focus();\r\n\r\n return true;\r\n};\r\n\r\nconst Memtion = (props: IMemtionProps) => {\r\n const { visible, rect, options, activeIndex, onActiveChange, onSelect } =\r\n props;\r\n\r\n if (!visible || !rect || !options?.length) {\r\n return null;\r\n }\r\n\r\n return (\r\n <List\r\n className=\"i-editor-memtion\"\r\n type=\"option\"\r\n style={{\r\n position: \"fixed\",\r\n top: rect.bottom,\r\n left: rect.left,\r\n }}\r\n >\r\n {options.map((option, i) => (\r\n <List.Item\r\n key={`${option.value}-${i}`}\r\n type=\"option\"\r\n active={i === activeIndex}\r\n onMouseDown={(e) => e.preventDefault()}\r\n onMouseEnter={() => onActiveChange?.(i)}\r\n onClick={() => onSelect?.(option)}\r\n >\r\n {option.label}\r\n </List.Item>\r\n ))}\r\n </List>\r\n );\r\n};\r\n\r\nexport default memo(Memtion);\r\n"],"names":["renderToStaticMarkup","_jsx","_Fragment","Memtion","List","memo"],"mappings":"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"}
package/lib/css/index.css CHANGED
@@ -1,3 +1,3 @@
1
- @import"./tokens.css";@import"./reset.css";@import"./input.css";@import"./colors.css";@import"./utilities.css";@import"@rc-component/color-picker/assets/index.css";.i-input-label{position:relative;display:flex;flex-wrap:wrap;align-items:baseline;align-content:flex-start;gap:.5em;width:100%;max-width:100%;border-radius:var(--radius)}.i-input-label:has(.i-input-success){--color: var(--green)}.i-input-label:has(.i-input-warning){--color: var(--yellow)}.i-input-label:has(.i-input-error){--color: var(--error)}.i-input-inline{flex-wrap:nowrap}.i-input-inline .i-input-item,.i-input-inline .i-upload-inner,.i-input-inline .i-radio-options{flex:1 1 auto}.i-input-inline .i-input-message{position:absolute;right:12%;top:-0.8em;padding:.2em .5em;background:var(--background-opacity);backdrop-filter:var(--blur)}.i-input-label-text{flex:0 0 var(--label-width);text-align:var(--label-align);border-radius:inherit;font-weight:500;transition:all .12s}.i-input-item{--input-border-width: 2px;--invert-input-border-width: calc(var(--input-border-width) * -1);flex:1 1 100%;display:flex;align-items:baseline;transition:var(--transition);border-radius:inherit;border:var(--input-border-width) solid var(--background-opacity-2);max-width:100%}.i-input-item .i-btn{align-self:stretch}.i-input-item:hover,.i-input-item:focus-within,.i-input-item.i-input-focus{border-color:var(--color-8);background-color:rgba(0,0,0,0)}.i-input-item.i-input-success{border-color:var(--green-0)}.i-input-item.i-input-warning{border-color:var(--yellow-0)}.i-input-item.i-input-error{border-color:var(--error-0)}.i-input-borderless{border-color:rgba(0,0,0,0);background:var(--background-opacity-2)}.i-input-underline{border-width:0 0 var(--input-border-width) 0;border-radius:0;border-color:var(--background-opacity-2);background:rgba(0,0,0,0)}.i-input{padding:var(--padding);flex:1;width:100%;color:inherit;outline:none;transition:var(--transition);background:rgba(0,0,0,0);border-radius:inherit;text-align:inherit}.i-input[type=number]::-webkit-inner-spin-button,.i-input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none}.i-input[readonly]{caret-color:rgba(0,0,0,0)}.i-input[type=password]{font-family:math}.i-input:disabled{background:var(--background-opacity-1);cursor:not-allowed}.i-input-message{--color: var(--color-5);flex:1 1 auto;align-self:center;z-index:1;font-size:.8em;color:var(--color);border-radius:var(--radius);pointer-events:none}.i-input-success{--color: var(--green)}.i-input-warning{--color: var(--yellow)}.i-input-error{--color: var(--error)}.i-textarea{display:block;transition:var(--transition),width 0s,height 0s;max-width:100%;min-height:2.14em}.i-input-prepend,.i-input-append{margin:var(--invert-input-border-width);display:flex;align-self:stretch;place-items:center}.i-input-prepend .i-btn,.i-input-append .i-btn{border-radius:inherit;height:unset}.i-input-prepend{margin-right:0;border-top-left-radius:inherit;border-bottom-left-radius:inherit}.i-input-append{margin-left:0;border-top-right-radius:inherit;border-bottom-right-radius:inherit}.i-options-block>.i-checkbox-item,.i-options-block>.i-radio-item{flex:1 1 100%}.i-input-number{text-align:center;padding:var(--padding);padding-inline:0}.i-card{--card-padding: 8px 12px;display:flex;flex-direction:column;background:var(--background-opacity-2);backdrop-filter:var(--blur);border-radius:var(--radius);overflow:auto}.i-card-bordered{border:1px solid var(--color-8)}.i-card-header{display:flex;align-items:center;padding:var(--card-padding);gap:.25em}.i-card-content{flex:1}.i-card-footer{margin-top:auto;display:flex;align-items:center;padding:var(--card-padding);gap:.25em}.i-affix{position:fixed;z-index:50;display:flex;flex-direction:column;gap:.5em;transition:var(--transition)}.i-affix-hidden .i-affix-totop{opacity:0}.i-datagrid-container{border-radius:var(--radius);overflow:auto}.i-datagrid-loading{overflow:hidden !important;user-select:none}.i-datagrid-loading .i-datagrid{max-height:100%;max-width:100%}.i-datagrid-loading .i-loading-container{position:absolute;inset:0;z-index:10;background:var(--background-opacity);backdrop-filter:blur(2px)}.i-datagrid{display:grid;contain:content;content-visibility:auto;width:fit-content;grid-template-columns:var(--grid-template-columns);grid-template-rows:var(--grid-template-rows);min-width:100%}.i-datagrid .i-empty{margin:1em auto;grid-column:1/-1}.i-datagrid-bordered{--datagrid-border-color: var(--color-9);outline:1px solid var(--datagrid-border-color)}.i-datagrid-bordered .i-datagrid-cell{outline:1px solid var(--datagrid-border-color)}.i-datagrid-striped .i-datagrid-row{--datagrid-border-color: var(--color-8)}.i-datagrid-striped .i-datagrid-row:nth-child(odd){--datagrid-cell-background: var(--background-opacity-1) }.i-datagrid .i-datagrid-row{--datagrid-cell-background: var(--background-opacity);display:contents}.i-datagrid .i-datagrid-row:hover{--datagrid-border-color: var(--color-8);--datagrid-cell-background: var(--background-opacity-1)}.i-datagrid .i-datagrid-row:hover .i-datagrid-cell{z-index:1}.i-datagrid .i-datagrid-row:hover [class*=" i-datagrid-cell-fixed"]{z-index:3}.i-datagrid-cell{position:sticky;display:flex;align-items:center;justify-content:var(--datagrid-justify);gap:4px;padding:var(--cell-padding);background:var(--datagrid-cell-background);transition:background-color .12s;overflow:hidden;backdrop-filter:var(--blur)}[class*=" i-datagrid-cell-fixed"]{z-index:2}.i-datagrid-cell-fixed-right{box-shadow:-2px 0 4px var(--color-9)}.i-datagrid-cell-fixed-left{box-shadow:2px 0 4px var(--color-9)}.i-datagrid-cell-content{min-width:0;flex:1 1 auto;display:inherit;gap:inherit;justify-content:inherit;white-space:nowrap;overflow:hidden}.i-datagrid-cell-content-ellipsis{display:block;text-overflow:ellipsis;text-align:var(--datagrid-justify)}.i-datagrid-header .i-datagrid-cell{--datagrid-cell-background: var(--background-opacity-2);z-index:3;white-space:nowrap;text-overflow:ellipsis;line-height:1;user-select:none;backdrop-filter:var(--blur)}.i-datagrid-header [class*=" i-datagrid-cell-fixed"]{z-index:4}.i-datagrid-resizor{position:absolute;inset:0 0 0 auto;width:4px;transition:.12s;cursor:ew-resize}.i-datagrid-resizor:hover{background-color:var(--color-5)}.i-datagrid-has-sorter{cursor:pointer}.i-datagrid-has-sorter:hover{--datagrid-cell-background: var(--color-8)}.i-datagrid-sorter{display:flex;flex-direction:column;flex-shrink:0;width:.8em;overflow:hidden;color:var(--color-7)}.i-datagrid-sorter-caret:first-child{margin-bottom:-0.4em;transform:rotate(-90deg)}.i-datagrid-sorter-caret:last-child{transform:rotate(90deg)}.i-datagrid-sorter-asc .i-datagrid-sorter-caret:first-child{color:var(--color-main)}.i-datagrid-sorter-desc .i-datagrid-sorter-caret:last-child{color:var(--color-main)}.i-checkbox{gap:1em}.i-checkbox-item{display:inline-flex;align-items:baseline;gap:.25em;border-radius:var(--radius);align-self:flex-start}.i-checkbox-item:hover .i-checkbox-input{box-shadow:inset 0 0 0 2px var(--color-5)}.i-checkbox-item:hover .i-checkbox-switch{box-shadow:inset 0 0 0 2px var(--color-8)}.i-checkbox-item:hover .i-checkbox-partof{box-shadow:none}.i-checkbox-item .i-checkbox-input:checked{box-shadow:none}.i-checkbox-options{flex:1 1 100%;position:relative;display:flex;flex-wrap:wrap;gap:.625em;align-self:baseline}.i-checkbox-text{display:inline-flex;transition:var(--transition);user-select:none;border-radius:inherit;color:var(--color-3)}.i-checkbox-text:empty{display:none}.i-checkbox-input{position:relative;display:flex;cursor:inherit;height:1.125em;width:1.125em;overflow:hidden;appearance:none;border-radius:inherit;transition:var(--transition);outline:0;align-self:center}.i-checkbox-custom{width:0;height:0}.i-checkbox-switch{height:1.125em;width:2.2em;overflow:unset;border-radius:2.4em;box-shadow:inset 0 0 0 2px var(--color-9);background:var(--color-9)}.i-checkbox-switch:hover:after{box-shadow:0 0 0 2px var(--color-7);background-color:var(--color-main-0)}.i-checkbox-default{border-radius:2px;box-shadow:inset 0 0 0 2px var(--color-7)}.i-checkbox-button{display:none}.i-checkbox-default:after,.i-checkbox-switch:before,.i-checkbox-switch:after,.i-checkbox-partof:after{content:" ";position:absolute;transition:var(--transition)}.i-checkbox-default:after{left:34%;top:16%;height:50%;width:20%;border-bottom:2px solid var(--color-main-reverse);border-right:2px solid var(--color-main-reverse);transform:rotate(90deg) scale(0);border-radius:1px}.i-checkbox-switch:after{left:0;top:50%;width:1em;height:1em;transform:translate(0, -50%);box-shadow:0 0 0 2px var(--color-8);border-radius:1em;transition:var(--transition);background-color:var(--background)}.i-checkbox-switch:active:after{width:1.5em}.i-checkbox-switch:active:checked:after{left:-0.5em}.i-checkbox-input:checked.i-checkbox-default{background-color:var(--color-main)}.i-checkbox-input:checked.i-checkbox-default:after{transform:rotate(45deg)}.i-checkbox-input:checked.i-checkbox-switch{background-color:var(--color-main)}.i-checkbox-input:checked.i-checkbox-switch:after{box-shadow:0 0 0 2px var(--color-main);transform:translate(1.2em, -50%);background-color:var(--background)}.i-checkbox-input:checked+.i-checkbox-text{color:var(--color-main)}.i-checkbox-button+.i-checkbox-text{padding:0 1em;line-height:1.8;font-size:.9em;display:flex;align-items:center;white-space:nowrap;border-radius:2em;border:1.5px solid var(--color-9)}.i-checkbox-button:hover+.i-checkbox-text{background-color:var(--color-9);border-color:var(--color-8)}.i-checkbox-button:checked+.i-checkbox-text{background-color:var(--color-main-0);color:var(--color-main);border-color:var(--color-main)}.i-checkbox-partof{border-radius:2px;background-color:var(--color-main)}.i-checkbox-partof:after{background-color:var(--color-main-reverse);height:2px;width:.5em;left:50%;top:50%;transform:translate(-50%, -50%);border-radius:var(--radius)}.i-checkbox-message{margin-top:.5em;font-size:.8em;align-self:flex-start;pointer-events:none}.i-checkbox-success .i-checkbox-input{box-shadow:inset 0 0 0 2px var(--success-0)}.i-checkbox-success .i-checkbox-input:checked{background-color:var(--success-0)}.i-checkbox-success .i-checkbox-message{color:var(--success)}.i-checkbox-warning .i-checkbox-input{box-shadow:inset 0 0 0 2px var(--warning-0)}.i-checkbox-warning .i-checkbox-input:checked{background-color:var(--warning-0)}.i-checkbox-warning .i-checkbox-message{color:var(--warning)}.i-checkbox-error .i-checkbox-input{box-shadow:inset 0 0 0 2px var(--error-0)}.i-checkbox-error .i-checkbox-input:checked{background-color:var(--error-0)}.i-checkbox-error .i-checkbox-message{color:var(--error)}.i-badge{position:relative;display:inline-flex;align-self:center;flex-shrink:0;border-radius:var(--radius)}.i-badge-content{position:absolute;z-index:1;inset:0 0 auto auto;padding:.2em .5em;transition:all .16s;transform:translate(50%, -50%) scale(1);border-radius:inherit;background:var(--background-opacity);backdrop-filter:var(--blur);box-shadow:var(--shadow);font-size:.86em;pointer-events:none}.i-badge-content.i-badge-dot{height:1em;width:1em;padding:0;border-radius:1em;overflow:hidden;color:rgba(0,0,0,0)}.i-badge-content:empty,.i-badge-content.i-badge-hidden{transform:translate(50%, -50%) scale(0)}.i-description{display:grid}.i-description-item{display:flex;gap:.5em}.i-description-item-vertical{flex-direction:column}.i-description-label{flex-shrink:0;width:var(--description-label-width);color:var(--color-5)}.i-description-value{flex:1}.i-dropdown-content{display:flex;flex-direction:column;max-height:40vh;padding:8px;gap:2px;overflow-x:hidden;border-radius:inherit}.i-backdrop-drawer{position:fixed;inset:0;z-index:100;pointer-events:none;background:var(--color-backdrop);backdrop-filter:blur(8px);transition:var(--transition);opacity:0;display:flex}.i-backdrop-drawer.i-active{opacity:1;pointer-events:unset}.i-drawer{position:absolute;display:flex;flex-direction:column;max-width:100%;max-height:100%;overflow:auto;box-shadow:var(--shadow);transition:var(--transition);background:var(--background);backdrop-filter:var(--blur)}.i-drawer-left{inset:0 auto 0 0;transform:translate3d(-100%, 0, 0)}.i-drawer-top{inset:0 0 auto;transform:translate3d(0, -100%, 0)}.i-drawer-right{inset:0 0 0 auto;transform:translate3d(100%, 0, 0)}.i-drawer-bottom{inset:auto 0 0;transform:translate3d(0, 100%, 0)}.i-active>.i-drawer{opacity:1;transform:none;pointer-events:unset}.i-drawer-header,.i-drawer-footer{display:flex;align-items:center;padding:12px}.i-drawer-header:empty,.i-drawer-footer:empty{display:none}.i-drawer-content{flex:1;overflow-x:hidden}.i-drawer-close{margin:0 0 0 auto;display:flex;align-self:flex-start;border-radius:var(--radius)}.icon{vertical-align:middle}.i-image{position:relative;display:inline-flex;align-items:center;justify-content:center;align-self:center;border-radius:var(--radius);overflow:hidden;vertical-align:middle;background:var(--background-opacity);backdrop-filter:var(--blur);flex-shrink:0}.i-image .i-loading-container{z-index:1;backdrop-filter:var(--blur)}.i-image>img{border-radius:inherit;width:100%;height:100%;object-fit:cover}.i-image-cover{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;backdrop-filter:var(--blur);background:var(--background-opacity)}.i-editor{display:flex;flex-direction:column;position:relative}.i-editor:focus-within>.i-editor-controls,.i-editor:focus-within>.i-editor-content,.i-editor:hover>.i-editor-controls,.i-editor:hover>.i-editor-content{border-color:var(--color-8)}.i-editor-borderless{border-radius:var(--radius)}.i-editor-borderless>.i-editor-controls,.i-editor-borderless>.i-editor-content{border:none}.i-editor-controls{display:flex;gap:2px;border:2px solid var(--color-9);border-bottom:0;padding:2px;border-radius:var(--radius) var(--radius) 0 0;transition:var(--transition)}.i-editor-controls .i-btn{--color: var(--color-5)}.i-editor-controls .i-btn:hover{--color: var(--color)}.i-editor-controls .i-btn:hover .i-editor-control-tip{opacity:1}.i-editor-control-tip{position:absolute;z-index:1;top:100%;left:50%;transform:translate(-50%, 0);opacity:0;padding:4px;border-radius:4px;line-height:1;pointer-events:none;transition:var(--transition);backdrop-filter:var(--blur)}.i-editor-content{flex:1;outline:none;padding:var(--padding);border:2px solid var(--color-9);border-radius:0 0 var(--radius) var(--radius);transition:var(--transition);overflow:auto;white-space:pre-wrap;word-wrap:break-word;word-break:break-all;tab-size:1em}.i-editor-content:first-child{border-radius:var(--radius)}.i-editor-content:hover,.i-editor-content:focus{border-color:var(--color-8)}.i-editor-content a{color:var(--blue)}.i-editor-content img{margin:0}.i-editor-content:empty:before{content:attr(data-placeholder);color:var(--color-5)}.i-editor-memtion{z-index:1000;margin:4px 0 0;padding:4px;min-width:120px;max-width:240px;border-radius:var(--radius);background:var(--background-opacity);box-shadow:var(--shadow);backdrop-filter:var(--blur);overflow:auto}.i-editor-memtion .i-list-item{color:var(--color-5)}.i-editor-memtion .i-list-item-active{color:var(--color-main)}.i-memtion-tag{display:inline-flex;align-items:center;max-width:100%;vertical-align:baseline;user-select:none}.i-loading-container{display:flex;flex-direction:column;justify-content:center;align-items:center;gap:.5em;font-size:inherit;transform:translateZ(0);border-radius:inherit;backdrop-filter:blur(2px)}.i-loading-icon{stroke:var(--color);width:1em;height:1em;animation:rotate .628s linear 0s infinite}.i-list{--gap: 0.5em;overflow:auto}.i-list-item{display:flex;gap:var(--gap);padding:var(--padding);transition:var(--transition);border-radius:var(--radius)}.i-list-item-bordered{box-shadow:inset 0 0 0 1px var(--color-8)}.i-list-item-bordered+.i-list-item-bordered{margin-top:-1px}.i-list-item-bordered:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.i-list-item-bordered:not(:last-child){border-bottom-right-radius:0;border-bottom-left-radius:0}.i-list-item-bordered:hover{box-shadow:inset 0 0 0 1px var(--color-7);z-index:1}.i-list-option{position:relative;cursor:pointer;user-select:none;white-space:nowrap;justify-content:space-between}.i-list-option:hover{background-color:var(--background-opacity-1)}.i-list-option.i-list-item-active{background-color:var(--color-main-0)}.i-list-item-label{align-self:flex-start}.i-modal-container{position:fixed;inset:0;z-index:100;padding:12px;transition:var(--transition);opacity:0;pointer-events:none;display:flex;overflow:hidden}.i-modal-container.i-modal-active{opacity:1}.i-modal-backdrop{background:var(--color-backdrop);backdrop-filter:blur(8px)}.i-modal-backdrop.i-modal-active{pointer-events:unset}.i-modal-customized{overflow:unset}.i-modal{position:relative;display:flex;flex-direction:column;margin:auto;max-width:100%;max-height:100%;overflow-x:hidden;border-radius:var(--radius);transform:translate(0, 12px);transition:var(--transition);background:var(--background)}.i-modal.bounced{animation:bounce .4s ease-in-out 0s}.i-modal-active>.i-modal{opacity:1;transform:none;pointer-events:all}.i-modal-header,.i-modal-footer{position:relative;display:flex;align-items:center;padding:12px;gap:12px}.i-modal-header:empty,.i-modal-footer:empty{display:none}.i-modal-header>b{display:contents}.i-modal-footer{justify-content:center}.i-modal-content{overflow-x:hidden;flex:1;max-height:100%;line-height:1.5}.i-modal .i-modal-close{margin:0 0 0 auto;display:flex;align-self:flex-start;border-radius:var(--radius)}.i-messages{position:fixed;inset:12px;pointer-events:none;display:flex;flex-direction:column;justify-content:center;z-index:10000;transition:var(--transition);cursor:default}.i-message{position:absolute;padding:.625em 1em;pointer-events:all;opacity:0;transition:var(--transition);transform:translate(80px, 0) scale(0.86) skew(-40deg);background:var(--background-opacity);border-radius:var(--radius);box-shadow:var(--shadow);backdrop-filter:var(--blur)}.i-message.i-message-active{opacity:1;transform:translate(0, 0)}.i-popconfirm{padding:1rem}.i-popconfirm-footer{margin-top:1rem}.i-form{display:grid;max-width:100%}.i-form-inline{--label-inline: nowrap}.i-form-inline .i-input-label{flex-wrap:nowrap}.i-progress{flex:1 1 100%;position:relative;display:flex;background:var(--background-1);border-radius:var(--radius);cursor:pointer}.i-progress-vertical{height:100%}.i-progress-vertical>.i-progress-bar{height:100%;align-self:flex-end}.i-progress-bar{position:relative;width:100%;background:var(--color-main);border-radius:var(--radius);transform-origin:left;transition:var(--transition)}.i-progress-cursor{position:absolute;right:0;top:50%;display:flex;min-height:120%;min-width:1em;transform:translate(50%, -50%) scale(0);transition:var(--transition);border-radius:inherit;box-shadow:var(--shadow);user-select:none;overflow:hidden}.i-progress:hover .i-progress-cursor,.no-transition>.i-progress-cursor{transform:translate(50%, -50%) scale(1)}.i-progress-circle{position:relative}.i-progress-circle-path{transition:var(--transition);border-radius:50px}.i-progress-circle-value{position:absolute;left:50%;top:50%;transform:translate(-50%, -50%);font-size:1.5em}.i-popup{position:absolute;z-index:100;opacity:0;transition:all .12s;will-change:left,top,opacity,transform;border-radius:var(--radius);background:var(--background);box-shadow:var(--shadow);transform:translate(0, 2px)}.i-popup-arrow{position:absolute;width:8px;height:24px;pointer-events:none;color:unset;transition:all .12s}.i-popup-arrow path{fill:var(--background)}.i-pagination{display:flex;align-items:center;gap:.2em}.i-page{--background: transparent;--color: var(--color-7);position:relative;display:inline-flex;align-items:center;justify-content:center;padding:0 .32em;height:2.25em;min-width:2.25em;border-radius:var(--radius);border:2px solid rgba(0,0,0,0);transition:var(--transition);user-select:none;cursor:pointer;white-space:nowrap;outline:none;color:var(--color);background:var(--background)}.i-page .i-ripple-container{inset:-2px}.i-page .i-loading-container{position:absolute;inset:0;z-index:1;background:var(--background-opacity);backdrop-filter:var(--blur)}.i-page:hover{--background: var(--background-opacity-2)}.i-page.i-page-active{--background: var(--color-main);--color: var(--color-main-reverse);cursor:default}.i-page.i-page-loading{--background: unset;cursor:default}.i-resizable{display:flex;overflow:hidden}.i-resizable-vertical{flex-direction:column}.i-resizable-vertical>.i-resizable-line{cursor:ns-resize;width:100%;height:2px}.i-resizable-a{overflow:auto}.i-resizable-b{flex:1;overflow:auto}.i-resizable-line{position:relative;display:flex;justify-content:center;align-items:center;width:2px;height:100%;background:var(--color-8);cursor:ew-resize;transition:var(--transition);touch-action:none;user-select:none}.i-resizable-line:hover,.i-resizable-line.i-resizable-resizing{outline:1px solid var(--color-8)}.i-resizable-line:hover>.i-resizable-line-node,.i-resizable-line.i-resizable-resizing>.i-resizable-line-node{opacity:1}.i-resizable-line-node{display:flex;position:relative;z-index:1;pointer-events:none;opacity:0;transition:var(--transition);background:inherit;border-radius:var(--radius);font-size:.8em}.i-radio{position:relative;display:inline-flex;flex-wrap:wrap;gap:1em}.i-radio-label{width:var(--label-width);text-align:var(--label-align);font-weight:500}.i-radio-item{display:inline-flex;align-items:baseline;border-radius:var(--radius)}.i-radio-item:hover .i-radio-input{box-shadow:inset 0 0 0 3px var(--color-7);background-color:var(--color-main-0)}.i-radio-item-custom>.i-radio-input{width:0;height:0}.i-input-success .i-radio-input{box-shadow:inset 0 0 0 3px var(--green-0)}.i-input-warning .i-radio-input{box-shadow:inset 0 0 0 3px var(--yellow-0)}.i-input-error .i-radio-input{box-shadow:inset 0 0 0 3px var(--error-0)}.i-radio-options{flex:1 1 100%;position:relative;display:flex;flex-wrap:wrap;gap:.625em;align-self:baseline}.i-radio-options-button{flex:none}.i-radio-text{display:inline-flex;margin-left:.4em;transition:var(--transition);user-select:none;border-radius:inherit;color:var(--color-3)}.i-radio-input{position:relative;display:flex;cursor:inherit;height:1.125em;width:1.125em;flex-shrink:0;overflow:hidden;appearance:none;border-radius:50%;transition:all .15s;outline:0;align-self:center;box-shadow:inset 0 0 0 3px var(--color-8)}.i-radio-default{border:0 solid rgba(0,0,0,0)}.i-radio-input:checked.i-radio-default{border-width:.4em;border-color:var(--color-main);background:var(--color-main-reverse);box-shadow:none}.i-radio-input:checked.i-radio-default+.i-radio-text{color:var(--color-main)}.i-radio-default:active{transform:scale(1.1)}.i-radio-button{display:none}.i-radio-button+.i-radio-text{margin-left:0;padding:0 .628em;line-height:1.8;font-size:.94em;white-space:nowrap;border:1.5px solid var(--color-9)}.i-radio-button+.i-radio-text:hover{background-color:var(--color-main-0);border-color:var(--color-8)}.i-radio-button:checked+.i-radio-text{background:var(--color-main-0);color:var(--color-main);border-color:var(--color-main)}.i-radio-message{margin-top:.5em;font-size:.8em;align-self:flex-start;pointer-events:none}.i-radio-success .i-radio-input{box-shadow:inset 0 0 0 3px var(--success-0)}.i-radio-success .i-radio-message{color:var(--success)}.i-radio-warning .i-radio-input{box-shadow:inset 0 0 0 3px var(--warning-0)}.i-radio-warning .i-radio-message{color:var(--warning)}.i-radio-error .i-radio-input{box-shadow:inset 0 0 0 3px var(--error-0)}.i-radio-error .i-radio-message{color:var(--error)}.i-river{overflow:hidden}.i-river-track{display:inline-flex;will-change:transform}.i-river-item{flex-shrink:0}.i-select{display:flex;gap:.5em}.i-select-multiple{flex-wrap:wrap;padding:.25em .628em}.i-select-multiple .i-tag{position:relative;padding:0 .5em;line-height:1.425em;background:var(--background-opacity-1)}.i-select-options{--gap: 0.25em;display:flex;flex-direction:column;max-height:40vh;padding:4px;gap:2px;overflow-x:hidden;border-radius:inherit}.i-select-options .i-list-item{justify-content:unset;align-items:center;color:var(--color-5)}.i-select-options .i-list-item.i-list-item-active{color:var(--color-main);background:var(--color-main-0)}.i-select-options .i-list-item.i-list-item-active .i-select-option-check{opacity:1}.i-select-options .i-list-item.disabled{pointer-events:none}.i-select-options-multiple .i-list-item.i-list-item-active{background:rgba(0,0,0,0)}.i-select-option-check{opacity:0}.i-select-filter{position:sticky;top:0;z-index:1;display:flex;flex-wrap:wrap;background:var(--background-opacity);backdrop-filter:var(--blur);border-bottom:1px solid var(--background-opacity-1)}.i-select-filter:empty{display:none}.i-step{display:flex;flex-wrap:wrap;gap:.5em;overflow:hidden}.i-step-vertical{flex-direction:column}.i-step-vertical .i-step-item{flex-direction:row}.i-step-vertical .i-step-item:not(:last-child) .i-step-item-right{padding-bottom:1em}.i-step-item{display:flex;flex-direction:column;gap:.5em;flex:1 1 auto;transition:var(--transition)}.i-step-item:last-child{flex:none}.i-step-item:last-child .i-step-divider{display:none}.i-step-item.i-step-item-finished{opacity:.4}.i-step-item.i-step-item-finished .i-step-divider{border-style:solid}.i-step-item.i-step-item-pending{opacity:.4}.i-step-item:hover{opacity:1}.i-step-item-index{display:flex;align-items:center;justify-content:center;flex-shrink:0;width:1.5em;line-height:1.5em;border-radius:1.5em;background:var(--color-4);color:var(--background)}.i-step-divider{flex:1;align-self:center;border:1px dashed var(--color-7)}.i-step-item-title{display:flex;align-items:center;gap:.5em;white-space:nowrap}.i-step-item-left{display:flex;flex-direction:column;align-items:center;gap:.5em}.i-step-item-right{display:flex;flex-direction:column;gap:.5em}.i-btn{--gap: 0.25em;--background: var(--color-main);--background-hover: var(--color-main-1);--color: var(--color-main-reverse);position:relative;display:inline-flex;align-items:center;justify-content:center;gap:var(--gap);padding:0 .6em;height:2.25em;border-radius:var(--radius);border:2px solid rgba(0,0,0,0);transition:var(--transition);user-select:none;cursor:pointer;white-space:nowrap;outline:none;font-weight:500;font-size:.94em;background:var(--background);color:var(--color);line-height:1;flex-shrink:0}.i-btn .i-ripple-container{inset:-2px}.i-btn-toggle{overflow:hidden}.i-btn-toggle-content{display:inline-flex;gap:var(--gap);align-items:center;transform:scale(0.4)}.i-btn-toggle-content.i-btn-toggle-active{transition:var(--transition);transform:none}.i-btn-block{width:100%}.i-btn-large{font-size:1.25em}.i-btn-extreme{font-size:2em;height:2em}.i-btn-small{height:2em;line-height:2;font-size:.86em;padding:0 .4em}.i-btn-mini{line-height:1;height:1.4em;font-size:.8em;padding:0 .2em}.i-btn-square{padding:0;width:2.25em}.i-btn-square.i-btn-extreme,.i-btn-square.i-btn-small{width:2em}.i-btn:hover{--background: var(--background-hover);--color: var(--color-hover, var(--color-main-reverse))}.i-btn-secondary{--background-hover: var(--color-main-0);--background: var(--color-main-0);--color: var(--color-main);--color-hover: var(--color-main-1)}.i-btn-flat{--background-hover: var(--color-main-0);--background: transparent;--color: var(--color-main);--color-hover: var(--color-main-1)}.i-btn-outline{--background-hover: var(--color-main-0);--color: var(--color-main);--color-hover: var(--color-main-1)}.i-btn-outline.i-btn{--background: transparent;border-color:var(--color)}.i-btn.i-btn-outline:hover,.i-btn.i-btn-secondary:hover,.i-btn.i-btn-flat:hover{--background: var(--background-hover)}.i-btn-content{display:contents}.i-btn-loading{opacity:.628;cursor:default}.i-btn-group-horizonal{display:flex}.i-btn-group-horizonal .i-btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.i-btn-group-horizonal .i-btn:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.i-btn-group-vertical{display:flex;flex-direction:column}.i-btn-group-vertical .i-btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.i-btn-group-vertical .i-btn:not(:last-child){border-bottom-right-radius:0;border-bottom-left-radius:0}.i-swiper{position:relative;max-width:100%;user-select:none}.i-swiper:hover .i-swiper-arrow{opacity:.72}.i-swiper .i-swiper-arrow:hover{opacity:1}.i-swiper-track{position:relative;overflow:hidden;touch-action:pan-x}.i-swiper-list{display:flex;will-change:transform}.i-swiper-fade>.i-swiper-item{opacity:0}.i-swiper-fade>.i-swiper-active{opacity:1}.i-swiper-vertical .i-swiper-track{height:100%;touch-action:pan-y}.i-swiper-vertical .i-swiper-list{flex-direction:column}.i-swiper-vertical .i-swiper-item{width:100%}.i-swiper-vertical .i-swiper-arrow{left:unset;right:.5em}.i-swiper-vertical .i-swiper-prev{bottom:50%;top:unset;transform:translate(0, -6px)}.i-swiper-vertical .i-swiper-next{transform:translate(0, 6px)}.i-swiper-item{flex:1;flex-shrink:0;display:flex;justify-content:center;align-items:center;overflow:hidden;transition:var(--transition)}.i-swiper-arrow{position:absolute;top:50%;display:inline-flex;align-items:center;justify-content:center;border-radius:var(--radius);transform:translate(0, -50%);transition:var(--transition);opacity:0}.i-swiper-prev{left:.5em}.i-swiper-next{right:.5em}.i-swiper-indicators{margin:.5em 0;display:flex;justify-content:center;gap:.5em}.i-swiper-indicators-fixed{position:absolute;bottom:0;left:50%;transform:translate(-50%, 0)}.i-swiper-indicator{width:8px;height:8px;border-radius:50%;flex-shrink:0;background:var(--color);opacity:.25}.i-swiper-indicator:hover{opacity:.8}.i-swiper-indicator.i-indicator-active{opacity:1}.i-tag{--background: var(--color-9);--color: var(--color-1);position:relative;display:inline-flex;align-items:center;justify-content:center;align-self:center;gap:.5em;padding:.25em .5em;border-radius:var(--radius);background:var(--background);color:var(--color);border:2px solid rgba(0,0,0,0);transition:var(--transition);font-size:.81em;line-height:1}.i-tag .i-tag-close{position:absolute;right:0;top:0;z-index:1;margin:0;background:var(--error);color:var(--white);transform:translate(50%, -50%);font-size:.81em;transition:all .16s}.i-tag .i-tag-close:hover{background:var(--error-1);color:var(--white)}.i-tag:hover .i-tag-hover-close{opacity:1;transform:translate(50%, -50%) scale(1)}.i-tag-large{font-size:1em}.i-tag-extreme{font-size:1.5em;height:2em}.i-tag-small{font-size:.72em;padding:.125em .4em}.i-tag-dot{content:" ";width:.385em;height:.385em;border-radius:50%;background-color:var(--color);box-shadow:0 -1px 1px 0 rgba(var(--color), 0.3);flex-shrink:0;transition:inherit}.i-tag-outline{--background: transparent;border-color:var(--color)}.i-tag-hover-close{transform:translate(50%, -50%) scale(0);opacity:0}.i-tag-clickable{cursor:pointer}.i-tag-clickable:hover{background:var(--background-hover);color:var(--color-hover, var(--color))}.i-tabs{max-width:100%;gap:.5em}.i-tabs-line .i-tab-navs{gap:1em}.i-tabs-line .i-tab-nav{padding:.4em 0}.i-tabs-line .i-tab-nav.i-tab-active{--color: var(--color-main)}.i-tabs-line .i-tab-navs-bar{background:var(--color-main)}.i-tabs-line .i-tab-navs-vertical>.i-tab-navs{gap:.5em}.i-tabs-line .i-tab-navs-vertical>.i-tab-navs>.i-tab-nav{padding:.25em 1em}.i-tab-navs-container{display:flex;border-radius:var(--radius);scroll-behavior:smooth;gap:4px;align-items:center}.i-tab-navs-vertical{align-items:flex-end;flex-direction:column}.i-tab-navs{flex:1;position:relative;display:flex;flex-direction:inherit;overflow:auto;user-select:none;scroll-behavior:unset;scrollbar-width:none;gap:1px}.i-tab-navs::-webkit-scrollbar{display:none}.i-tabs-pane .i-tab-navs-container{position:relative}.i-tabs-pane .i-tab-navs-container:before{position:absolute;bottom:0;left:0;right:0;width:100%;border-top:1px solid var(--color-8);content:"";z-index:1}.i-tabs-pane .i-tab-navs{gap:4px}.i-tabs-pane .i-tab-navs .i-tab-nav{border-radius:var(--radius) var(--radius) 0 0;border:1px solid rgba(0,0,0,0)}.i-tabs-pane .i-tab-navs .i-tab-nav:hover{border-color:var(--color-8);border-bottom-color:var(--background)}.i-tabs-pane .i-tab-navs .i-tab-active{z-index:2;background:rgba(0,0,0,0);border-color:var(--color-8);border-bottom:1px solid var(--background);box-shadow:1px 2px 0 1px var(--color-8)}.i-tabs-pane .i-tab-navs .i-tab-active:hover{background-color:rgba(0,0,0,0)}.i-tabs-pane .i-tab-navs-vertical:before{left:unset;top:0;width:unset;height:100%;border-top:none;border-right:1px solid var(--color-8)}.i-tabs-pane .i-tab-navs-vertical .i-tab-navs .i-tab-nav{border-radius:var(--radius) 0 0 var(--radius);border:1px solid rgba(0,0,0,0)}.i-tabs-pane .i-tab-navs-vertical .i-tab-navs .i-tab-nav:hover{border-color:var(--color-8);border-right-color:var(--background)}.i-tabs-pane .i-tab-navs-vertical .i-tab-navs .i-tab-active{border-color:var(--color-7);border-right:1px solid var(--background)}.i-tabs-pane .i-tab-navs-vertical .i-tab-navs .i-tab-active:hover{background-color:rgba(0,0,0,0)}.i-tab-nav{--color: var(--color-7);position:relative;z-index:1;display:flex;align-items:center;justify-content:center;padding:.4em .5em;user-select:none;flex-shrink:0;gap:.25em;color:var(--color);border-radius:var(--radius)}.i-tab-nav:hover{--color: var(--color-3)}.i-tab-nav.i-tab-active{--color: var(--color-main)}.i-tabs-morelist .i-tab-nav{white-space:nowrap}.i-tabs-morelist .i-tab-active{background:var(--color-main-0)}.i-tab-closable .i-tab-nav{padding-right:0;border-radius:var(--radius) var(--radius) 0 0}.i-tab-closable .i-tab-nav.i-tab-active{box-shadow:2px 0 8px rgba(0,0,0,.0509803922);background-color:var(--background)}.i-tab-nav-close{position:absolute;right:4px;margin:0;font-size:.7em;padding:0;opacity:0;background:var(--background)}.i-tab-nav-close:hover{color:var(--error);background:var(--background)}.i-tab-nav:hover .i-tab-nav-close{opacity:1}.i-tab-navs-bar{position:absolute;bottom:0em;left:0;height:0;background:var(--color-main-0);pointer-events:none;transition:var(--transition);border-radius:4px}.i-tab-navs-vertical>.i-tab-navs{gap:1px}.i-tab-navs-vertical>.i-tab-navs>.i-tab-navs-bar{width:0;left:unset;bottom:unset;right:0;top:0}.i-tab-contents{position:relative;flex:1}.i-tab-content{display:none}.i-tab-content.i-tab-active{display:block}.i-tree{display:flex;flex-direction:column;gap:1px;color:var(--color-2)}.i-tree-group-title{position:relative;font-size:1em;display:flex;font-weight:300;font-style:italic;font-size:.9em}.i-tree-group-title:after{content:" ";margin-left:.5em;flex:1;height:1px;align-self:center;background:var(--color-8)}.i-tree-item-header{position:relative;display:flex;align-items:center;gap:.25em;padding:.4em;user-select:none;border-radius:var(--radius);overflow:hidden;color:var(--color-6)}.i-tree-item-header.i-tree-item-round{border-radius:100px}.i-tree-item-header.i-tree-item-selected,.i-tree-item-header:hover{background:var(--color-main-0);color:var(--color-main)}.i-tree-round{--radius: 100px}.i-tree-item-icon{display:flex}.i-tree-checkbox{align-self:center}.i-tree-toggle{margin-left:auto;transition:var(--transition);border-radius:inherit;color:var(--color-6)}.i-tree-toggle:hover{color:var(--color-3);background:var(--background-opacity)}.i-tree-item-content{max-height:0;overflow:hidden;transition:max-height .5s cubic-bezier(0, 1, 0, 1)}.i-tree-expand>.i-tree-item-content{transition:max-height .25s cubic-bezier(1, 0, 1, 0);max-height:2000px}.i-tree-expand>.i-tree-item-header{color:var(--color-main);opacity:1}.i-tree-expand>.i-tree-item-header>.i-tree-toggle{transform:rotateX(180deg)}.i-text-gradient{-webkit-text-fill-color:rgba(0,0,0,0)}.i-text-gradient-wave{background-size:200% 100%;background-position:0 0;animation:text-wave 1.2s linear 0s infinite}@keyframes text-wave{100%{background-position:-100% 0}}.i-input-label-file{display:inline-flex;width:unset}.i-input-label-file:has(.i-upload-list:empty){align-items:center}.i-input-file-hidden{display:none}.i-upload-inner{flex:1 1 100%;display:flex;flex-wrap:wrap;gap:.5em}.i-upload-card:has(.i-upload-list:not(:empty)){align-self:flex-start}.i-upload-card .i-upload-list{display:contents}.i-upload-list{display:flex;flex-wrap:wrap;width:100%;gap:inherit;user-select:none}.i-upload-list:empty{display:none}.i-upload-delete{opacity:0;margin:0;z-index:1;right:-0.825em;top:-0.825em;box-shadow:var(--shadow)}.i-upload-btn{align-self:center}.i-upload-card-btn{border-style:dashed;width:var(--upload-card-size);height:var(--upload-card-size);opacity:.6;font-size:1em}.i-upload-card-btn:hover{opacity:1}.i-upload-item{position:relative;display:inline-flex;align-items:center;gap:.25em;padding:.25em .4em;border:2px solid var(--background-opacity-1);border-radius:var(--radius);background:var(--background-opacity);transition:var(--transition);font-size:.8em}.i-upload-item .i-upload-delete{position:absolute;background-color:var(--error);color:#fff}.i-upload-item .i-upload-delete:hover{background-color:var(--error);color:#fff}.i-upload-item:hover{background-color:var(--background-opacity-1)}.i-upload-item:hover .i-upload-delete{opacity:1}.i-upload-item-card{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.25em;width:var(--upload-card-size);height:var(--upload-card-size);border-radius:var(--radius);background:var(--background-opacity-1);cursor:pointer}.i-upload-item-card .i-image,.i-upload-item-card video{width:100%;height:100%;object-fit:cover}.i-upload-item-card .i-upload-file-name{max-width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-size:.8em;padding-inline:4px}.i-upload-item-card .i-upload-delete{font-size:.72em;position:absolute;background-color:var(--error);color:#fff}.i-upload-item-card .i-upload-delete:hover{background-color:var(--error);color:#fff}.i-upload-item-card:hover .i-upload-delete{opacity:1}.i-upload-size{font-size:.8em;color:var(--color-6)}.i-upload-item-dragged{z-index:1000}.i-ripple-container{position:absolute;inset:0;overflow:hidden;pointer-events:none;border-radius:inherit;contain:strict}.i-ripple-container .i-ripple{position:absolute;background:var(--color);opacity:.15;transform:translate(-50%, -50%) scale(0.25);transform-origin:50%;border-radius:50%}.i-ripple-container .i-ripple-active{opacity:0;transform:translate(-50%, -50%) scale(1)}.i-video{position:relative;background:#000;border-radius:var(--radius);overflow:hidden}.i-video video{width:100%;height:100%}.i-video-controls{position:absolute;left:0;bottom:-1px;right:0;display:flex;align-items:center;padding:4px;gap:4px;font-size:.9em;white-space:nowrap;user-select:none;transition:var(--transition);background:var(--background-opacity);backdrop-filter:var(--blur)}.i-video-controls .i-btn{flex-shrink:0}.i-video-controls .i-icon{font-size:1.2em}.i-video-controls:hover{opacity:1;pointer-events:unset}.i-video-controls-hidden{opacity:0;pointer-events:none}.i-video-control{display:flex;align-items:center}.i-video-times{margin-inline:8px;display:flex;align-items:center;gap:4px}.i-video-volume{position:absolute;z-index:1;bottom:100%;left:50%;transform:translate(-50%, 4px);padding:8px;opacity:0;pointer-events:none;border-radius:var(--radius);transition:var(--transition);backdrop-filter:var(--blur);background:var(--background-opacity)}.i-video-control-volume{position:relative}.i-video-control-volume:hover .i-video-volume{opacity:1;pointer-events:unset}.i-preview{padding:0}.i-preview .i-modal{position:static;background:rgba(0,0,0,0);overflow:unset;transform:none;pointer-events:none !important;width:100%;height:100%}.i-preview .i-preview-container{position:relative;width:100%;height:100%}.i-preview .i-preview-content{display:flex;align-items:center;justify-content:center;width:100%;height:100%;transition:var(--transition);pointer-events:none;will-change:transform}.i-preview .i-preview-content *{pointer-events:all}.i-preview .i-preview-controls{position:fixed;z-index:10;right:.5em;top:.5em;padding:4px;display:flex;align-items:center;gap:1px;background:var(--background-opacity);border-radius:var(--radius);font-size:.9em;pointer-events:all;transition:all .24s ease-out}.i-preview .i-preview-controls:hover{opacity:1}.i-preview .i-preview-controls-hidden{opacity:0}.i-preview .i-preview-unknown{display:flex;flex-direction:column;align-items:center;padding:.5em 1em;background:var(--background);border-radius:var(--radius)}.i-collapse{border-radius:var(--radius)}.i-collapse-bordered{border:1px solid var(--color-8)}.i-collapse-bordered .i-collapse-item+.i-collapse-item{border-top:1px solid var(--color-8)}.i-collapse-item{border-radius:var(--radius)}.i-collapse-header{display:flex;justify-content:space-between;align-items:center;padding:.5em;transition:var(--transition);font-weight:500;border-radius:var(--radius)}.i-collapse-header:hover{background-color:var(--background-opacity-1)}.i-collapse-toggle{margin:0;display:flex;user-select:none}.i-collapse-content{padding:0 .5em;height:0;overflow:hidden;transition:var(--transition);border-radius:var(--radius)}.i-collapse-active>.i-collapse-header,.i-collapse-header:hover{opacity:1}.i-collapse-active>.i-collapse-content{padding:.5em;height:unset}.i-collapse-disabled{pointer-events:none;opacity:.4}.i-collapse-disabled>.i-collapse-content{padding:0 .5em;height:0;overflow:hidden}.i-empty{margin:auto;width:3em;height:3em;color:var(--color-7)}.i-helpericon{position:relative;margin:.25em;padding:.125em;min-height:1.675em;min-width:1.675em;display:flex;align-items:center;justify-content:center;align-self:center;color:var(--color-7);transition:var(--transition);border-radius:var(--radius);font-size:.8em}.i-helpericon:hover{color:var(--color-3);background:var(--background-opacity-1)}.i-datepicker-label{position:unset}.i-datepicker{padding:8px}.i-datepicker .i-datepicker-item{cursor:pointer}.i-datepicker-weeks,.i-datepicker-dates{display:grid;grid-template-columns:repeat(7, 1fr);gap:2px}.i-datepicker-week,.i-datepicker-item{display:flex;justify-content:center;padding:.32em .5em}.i-datepicker-week{color:var(--color-5)}.i-datepicker-item{--background: transparent;opacity:.4;border-radius:var(--radius);transition:all .12s;background:var(--background);color:var(--color)}.i-datepicker-item:hover{opacity:1;--background: var(--color-main-0)}.i-datepicker-item.i-datepicker-same-month{opacity:.8}.i-datepicker-item.i-datepicker-today{--background: var(--color-main-0)}.i-datepicker-item.i-datepicker-active{--background: var(--color-main);--color: var(--color-main-reverse);opacity:1}.i-datepicker-item.i-datepicker-disabled{opacity:.2;cursor:not-allowed}.i-datepicker-units{margin-bottom:.5em;display:flex;align-items:center;gap:.125em;color:var(--color-6);font-size:.9em}.i-datepicker-action{position:relative;display:flex;align-items:baseline;gap:.25em;padding:.125em .5em;user-select:none;border-radius:var(--radius)}.i-datepicker-action>span{color:var(--color);font-size:1.15em}.i-datepicker-action:hover{background:var(--color-main-0)}.i-datepicker-icon{margin-right:.4em;opacity:.5;pointer-events:none}.i-datepicker-ym{position:absolute;inset:0;z-index:1;padding:8px;gap:.5em;background:var(--background);backdrop-filter:var(--blur);display:flex;pointer-events:none;opacity:0;transition:var(--transition)}.i-datepicker-ym.i-datepicker-active{opacity:1;pointer-events:unset}.i-datepicker-years{width:5em;overflow-x:hidden;display:flex;flex-direction:column;max-height:100%;gap:.25em}.i-datepicker-months{margin-top:1.5em;flex:1;display:grid;grid-template-columns:repeat(3, 1fr);gap:.25em}.i-datepicker-year{flex:1}.i-datepicker-year,.i-datepicker-month{display:flex;padding:2px;user-select:none;border-radius:var(--radius);justify-content:center;align-items:center}.i-datepicker-year:hover,.i-datepicker-month:hover{background-color:var(--background-opacity-2)}.i-datepicker-year.i-datepicker-active,.i-datepicker-month.i-datepicker-active{background:var(--color-main);color:var(--color-main-reverse);opacity:1}.i-datepicker-close{position:absolute;right:0;top:0}.i-colorpicker-handle{position:relative;display:inline-flex;align-items:center;font-size:.8em;gap:.25em}.i-colorpicker-square{display:inline-block;width:1.8em;height:1.8em;border:2px solid var(--color-9);border-radius:var(--radius);cursor:pointer;transition:var(--transition)}.i-colorpicker-square:hover{border-color:var(--color-8)}.i-colorpicker-footer{display:flex;gap:4px;font-size:.8em}.i-colorpicker-text{transition:var(--transition);cursor:pointer;padding:.25em .5em;border-radius:var(--radius);background:var(--color-9)}.i-colorpicker-text:hover{background:var(--color-8)}.rc-color-picker-panel{box-shadow:none;background:inherit}.i-timepicker-label{position:unset}.i-timepicker{display:flex}.i-timepicker-list{min-width:3em;text-align:center;overflow:auto;padding:4px;max-height:12.2em;display:flex;flex-direction:column;gap:2px;scrollbar-width:none}.i-timepicker-list::-webkit-scrollbar{display:none}.i-timepicker-list:not(:last-child){border-right:1px solid var(--color-9)}.i-timepicker-item{display:block;padding:.32em .5em;border-radius:var(--radius);opacity:.5}.i-timepicker-item:hover{background-color:var(--color-9);opacity:1}.i-timepicker-item.i-timepicker-item-active{position:sticky;top:0;bottom:0;z-index:1;background:var(--color-main);color:var(--color-main-reverse);opacity:1}.i-timepicker-icon{margin-right:.4em;opacity:.5;pointer-events:none}
1
+ @import"./tokens.css";@import"./reset.css";@import"./input.css";@import"./colors.css";@import"./utilities.css";@import"@rc-component/color-picker/assets/index.css";.i-ripple-container{position:absolute;inset:0;overflow:hidden;pointer-events:none;border-radius:inherit;contain:strict}.i-ripple-container .i-ripple{position:absolute;background:var(--color);opacity:.15;transform:translate(-50%, -50%) scale(0.25);transform-origin:50%;border-radius:50%}.i-ripple-container .i-ripple-active{opacity:0;transform:translate(-50%, -50%) scale(1)}.i-affix{position:fixed;z-index:50;display:flex;flex-direction:column;gap:.5em;transition:var(--transition)}.i-affix-hidden .i-affix-totop{opacity:0}.i-card{--card-padding: 8px 12px;display:flex;flex-direction:column;background:var(--background-opacity-2);backdrop-filter:var(--blur);border-radius:var(--radius);overflow:auto}.i-card-bordered{border:1px solid var(--color-8)}.i-card-header{display:flex;align-items:center;padding:var(--card-padding);gap:.25em}.i-card-content{flex:1}.i-card-footer{margin-top:auto;display:flex;align-items:center;padding:var(--card-padding);gap:.25em}.i-preview{padding:0}.i-preview .i-modal{position:static;background:rgba(0,0,0,0);overflow:unset;transform:none;pointer-events:none !important;width:100%;height:100%}.i-preview .i-preview-container{position:relative;width:100%;height:100%}.i-preview .i-preview-content{display:flex;align-items:center;justify-content:center;width:100%;height:100%;transition:var(--transition);pointer-events:none;will-change:transform}.i-preview .i-preview-content *{pointer-events:all}.i-preview .i-preview-controls{position:fixed;z-index:10;right:.5em;top:.5em;padding:4px;display:flex;align-items:center;gap:1px;background:var(--background-opacity);border-radius:var(--radius);font-size:.9em;pointer-events:all;transition:all .24s ease-out}.i-preview .i-preview-controls:hover{opacity:1}.i-preview .i-preview-controls-hidden{opacity:0}.i-preview .i-preview-unknown{display:flex;flex-direction:column;align-items:center;padding:.5em 1em;background:var(--background);border-radius:var(--radius)}.i-badge{position:relative;display:inline-flex;align-self:center;flex-shrink:0;border-radius:var(--radius)}.i-badge-content{position:absolute;z-index:1;inset:0 0 auto auto;padding:.2em .5em;transition:all .16s;transform:translate(50%, -50%) scale(1);border-radius:inherit;background:var(--background-opacity);backdrop-filter:var(--blur);box-shadow:var(--shadow);font-size:.86em;pointer-events:none}.i-badge-content.i-badge-dot{height:1em;width:1em;padding:0;border-radius:1em;overflow:hidden;color:rgba(0,0,0,0)}.i-badge-content:empty,.i-badge-content.i-badge-hidden{transform:translate(50%, -50%) scale(0)}.i-btn{--gap: 0.25em;--background: var(--color-main);--background-hover: var(--color-main-1);--color: var(--color-main-reverse);position:relative;display:inline-flex;align-items:center;justify-content:center;gap:var(--gap);padding:0 .6em;height:2.25em;border-radius:var(--radius);border:2px solid rgba(0,0,0,0);transition:var(--transition);user-select:none;cursor:pointer;white-space:nowrap;outline:none;font-weight:500;font-size:.94em;background:var(--background);color:var(--color);line-height:1;flex-shrink:0}.i-btn .i-ripple-container{inset:-2px}.i-btn-toggle{overflow:hidden}.i-btn-toggle-content{display:inline-flex;gap:var(--gap);align-items:center;transform:scale(0.4)}.i-btn-toggle-content.i-btn-toggle-active{transition:var(--transition);transform:none}.i-btn-block{width:100%}.i-btn-large{font-size:1.25em}.i-btn-extreme{font-size:2em;height:2em}.i-btn-small{height:2em;line-height:2;font-size:.86em;padding:0 .4em}.i-btn-mini{line-height:1;height:1.4em;font-size:.8em;padding:0 .2em}.i-btn-square{padding:0;width:2.25em}.i-btn-square.i-btn-extreme,.i-btn-square.i-btn-small{width:2em}.i-btn:hover{--background: var(--background-hover);--color: var(--color-hover, var(--color-main-reverse))}.i-btn-secondary{--background-hover: var(--color-main-0);--background: var(--color-main-0);--color: var(--color-main);--color-hover: var(--color-main-1)}.i-btn-flat{--background-hover: var(--color-main-0);--background: transparent;--color: var(--color-main);--color-hover: var(--color-main-1)}.i-btn-outline{--background-hover: var(--color-main-0);--color: var(--color-main);--color-hover: var(--color-main-1)}.i-btn-outline.i-btn{--background: transparent;border-color:var(--color)}.i-btn.i-btn-outline:hover,.i-btn.i-btn-secondary:hover,.i-btn.i-btn-flat:hover{--background: var(--background-hover)}.i-btn-content{display:contents}.i-btn-loading{opacity:.628;cursor:default}.i-btn-group-horizonal{display:flex}.i-btn-group-horizonal .i-btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.i-btn-group-horizonal .i-btn:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.i-btn-group-vertical{display:flex;flex-direction:column}.i-btn-group-vertical .i-btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.i-btn-group-vertical .i-btn:not(:last-child){border-bottom-right-radius:0;border-bottom-left-radius:0}.i-description{display:grid}.i-description-item{display:flex;gap:.5em}.i-description-item-vertical{flex-direction:column}.i-description-label{flex-shrink:0;width:var(--description-label-width);color:var(--color-5)}.i-description-value{flex:1}.i-collapse{border-radius:var(--radius)}.i-collapse-bordered{border:1px solid var(--color-8)}.i-collapse-bordered .i-collapse-item+.i-collapse-item{border-top:1px solid var(--color-8)}.i-collapse-item{border-radius:var(--radius)}.i-collapse-header{display:flex;justify-content:space-between;align-items:center;padding:.5em;transition:var(--transition);font-weight:500;border-radius:var(--radius)}.i-collapse-header:hover{background-color:var(--background-opacity-1)}.i-collapse-toggle{margin:0;display:flex;user-select:none}.i-collapse-content{padding:0 .5em;height:0;overflow:hidden;transition:var(--transition);border-radius:var(--radius)}.i-collapse-active>.i-collapse-header,.i-collapse-header:hover{opacity:1}.i-collapse-active>.i-collapse-content{padding:.5em;height:unset}.i-collapse-disabled{pointer-events:none;opacity:.4}.i-collapse-disabled>.i-collapse-content{padding:0 .5em;height:0;overflow:hidden}.i-dropdown-content{display:flex;flex-direction:column;max-height:40vh;padding:8px;gap:2px;overflow-x:hidden;border-radius:inherit}.i-input-label{position:relative;display:flex;flex-wrap:wrap;align-items:baseline;align-content:flex-start;gap:.5em;width:100%;max-width:100%;border-radius:var(--radius)}.i-input-label:has(.i-input-success){--color: var(--green)}.i-input-label:has(.i-input-warning){--color: var(--yellow)}.i-input-label:has(.i-input-error){--color: var(--error)}.i-input-inline{flex-wrap:nowrap}.i-input-inline .i-input-item,.i-input-inline .i-upload-inner,.i-input-inline .i-radio-options{flex:1 1 auto}.i-input-inline .i-input-message{position:absolute;right:12%;top:-0.8em;padding:.2em .5em;background:var(--background-opacity);backdrop-filter:var(--blur)}.i-input-label-text{flex:0 0 var(--label-width);text-align:var(--label-align);border-radius:inherit;font-weight:500;transition:all .12s}.i-input-item{--input-border-width: 2px;--invert-input-border-width: calc(var(--input-border-width) * -1);flex:1 1 100%;display:flex;align-items:baseline;transition:var(--transition);border-radius:inherit;border:var(--input-border-width) solid var(--background-opacity-2);max-width:100%}.i-input-item .i-btn{align-self:stretch}.i-input-item:hover,.i-input-item:focus-within,.i-input-item.i-input-focus{border-color:var(--color-8);background-color:rgba(0,0,0,0)}.i-input-item.i-input-success{border-color:var(--green-0)}.i-input-item.i-input-warning{border-color:var(--yellow-0)}.i-input-item.i-input-error{border-color:var(--error-0)}.i-input-borderless{border-color:rgba(0,0,0,0);background:var(--background-opacity-2)}.i-input-underline{border-width:0 0 var(--input-border-width) 0;border-radius:0;border-color:var(--background-opacity-2);background:rgba(0,0,0,0)}.i-input{padding:var(--padding);flex:1;width:100%;color:inherit;outline:none;transition:var(--transition);background:rgba(0,0,0,0);border-radius:inherit;text-align:inherit}.i-input[type=number]::-webkit-inner-spin-button,.i-input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none}.i-input[readonly]{caret-color:rgba(0,0,0,0)}.i-input[type=password]{font-family:math}.i-input:disabled{background:var(--background-opacity-1);cursor:not-allowed}.i-input-message{--color: var(--color-5);flex:1 1 auto;align-self:center;z-index:1;font-size:.8em;color:var(--color);border-radius:var(--radius);pointer-events:none}.i-input-success{--color: var(--green)}.i-input-warning{--color: var(--yellow)}.i-input-error{--color: var(--error)}.i-textarea{display:block;transition:var(--transition),width 0s,height 0s;max-width:100%;min-height:2.14em}.i-input-prepend,.i-input-append{margin:var(--invert-input-border-width);display:flex;align-self:stretch;place-items:center}.i-input-prepend .i-btn,.i-input-append .i-btn{border-radius:inherit;height:unset}.i-input-prepend{margin-right:0;border-top-left-radius:inherit;border-bottom-left-radius:inherit}.i-input-append{margin-left:0;border-top-right-radius:inherit;border-bottom-right-radius:inherit}.i-options-block>.i-checkbox-item,.i-options-block>.i-radio-item{flex:1 1 100%}.i-input-number{text-align:center;padding:var(--padding);padding-inline:0}.i-editor{display:flex;flex-direction:column;position:relative}.i-editor:focus-within>.i-editor-controls,.i-editor:focus-within>.i-editor-content,.i-editor:hover>.i-editor-controls,.i-editor:hover>.i-editor-content{border-color:var(--color-8)}.i-editor-borderless{border-radius:var(--radius)}.i-editor-borderless>.i-editor-controls,.i-editor-borderless>.i-editor-content{border:none}.i-editor-controls{display:flex;gap:2px;border:2px solid var(--color-9);border-bottom:0;padding:2px;border-radius:var(--radius) var(--radius) 0 0;transition:var(--transition)}.i-editor-controls .i-btn{--color: var(--color-5)}.i-editor-controls .i-btn:hover{--color: var(--color)}.i-editor-controls .i-btn:hover .i-editor-control-tip{opacity:1}.i-editor-control-tip{position:absolute;z-index:1;top:100%;left:50%;transform:translate(-50%, 0);opacity:0;padding:4px;border-radius:4px;line-height:1;pointer-events:none;transition:var(--transition);backdrop-filter:var(--blur)}.i-editor-content{flex:1;outline:none;padding:var(--padding);border:2px solid var(--color-9);border-radius:0 0 var(--radius) var(--radius);transition:var(--transition);overflow:auto;white-space:pre-wrap;word-wrap:break-word;word-break:break-all;tab-size:1em}.i-editor-content:first-child{border-radius:var(--radius)}.i-editor-content:hover,.i-editor-content:focus{border-color:var(--color-8)}.i-editor-content a{color:var(--blue)}.i-editor-content img{margin:0}.i-editor-content:empty:before{content:attr(data-placeholder);color:var(--color-5)}.i-editor-memtion{z-index:1000;margin:4px 0 0;padding:4px;min-width:120px;max-width:240px;border-radius:var(--radius);background:var(--background-opacity);box-shadow:var(--shadow);backdrop-filter:var(--blur);overflow:auto}.i-editor-memtion .i-list-item{color:var(--color-5)}.i-editor-memtion .i-list-item-active{color:var(--color-main)}.i-memtion-tag{display:inline-flex;align-items:center;max-width:100%;vertical-align:baseline;user-select:none}.i-form{display:grid;max-width:100%}.i-form-inline{--label-inline: nowrap}.i-form-inline .i-input-label{flex-wrap:nowrap}.icon{vertical-align:middle}.i-datagrid-container{border-radius:var(--radius);overflow:auto}.i-datagrid-loading{overflow:hidden !important;user-select:none}.i-datagrid-loading .i-datagrid{max-height:100%;max-width:100%}.i-datagrid-loading .i-loading-container{position:absolute;inset:0;z-index:10;background:var(--background-opacity);backdrop-filter:blur(2px)}.i-datagrid{display:grid;contain:content;content-visibility:auto;width:fit-content;grid-template-columns:var(--grid-template-columns);grid-template-rows:var(--grid-template-rows);min-width:100%}.i-datagrid .i-empty{margin:1em auto;grid-column:1/-1}.i-datagrid-bordered{--datagrid-border-color: var(--color-9);outline:1px solid var(--datagrid-border-color)}.i-datagrid-bordered .i-datagrid-cell{outline:1px solid var(--datagrid-border-color)}.i-datagrid-striped .i-datagrid-row{--datagrid-border-color: var(--color-8)}.i-datagrid-striped .i-datagrid-row:nth-child(odd){--datagrid-cell-background: var(--background-opacity-1) }.i-datagrid .i-datagrid-row{--datagrid-cell-background: var(--background-opacity);display:contents}.i-datagrid .i-datagrid-row:hover{--datagrid-border-color: var(--color-8);--datagrid-cell-background: var(--background-opacity-1)}.i-datagrid .i-datagrid-row:hover .i-datagrid-cell{z-index:1}.i-datagrid .i-datagrid-row:hover [class*=" i-datagrid-cell-fixed"]{z-index:3}.i-datagrid-cell{position:sticky;display:flex;align-items:center;justify-content:var(--datagrid-justify);gap:4px;padding:var(--cell-padding);background:var(--datagrid-cell-background);transition:background-color .12s;overflow:hidden;backdrop-filter:var(--blur)}[class*=" i-datagrid-cell-fixed"]{z-index:2}.i-datagrid-cell-fixed-right{box-shadow:-2px 0 4px var(--color-9)}.i-datagrid-cell-fixed-left{box-shadow:2px 0 4px var(--color-9)}.i-datagrid-cell-content{min-width:0;flex:1 1 auto;display:inherit;gap:inherit;justify-content:inherit;white-space:nowrap;overflow:hidden}.i-datagrid-cell-content-ellipsis{display:block;text-overflow:ellipsis;text-align:var(--datagrid-justify)}.i-datagrid-header .i-datagrid-cell{--datagrid-cell-background: var(--background-opacity-2);z-index:3;white-space:nowrap;text-overflow:ellipsis;line-height:1;user-select:none;backdrop-filter:var(--blur)}.i-datagrid-header [class*=" i-datagrid-cell-fixed"]{z-index:4}.i-datagrid-resizor{position:absolute;inset:0 0 0 auto;width:4px;transition:.12s;cursor:ew-resize}.i-datagrid-resizor:hover{background-color:var(--color-5)}.i-datagrid-has-sorter{cursor:pointer}.i-datagrid-has-sorter:hover{--datagrid-cell-background: var(--color-8)}.i-datagrid-sorter{display:flex;flex-direction:column;flex-shrink:0;width:.8em;overflow:hidden;color:var(--color-7)}.i-datagrid-sorter-caret:first-child{margin-bottom:-0.4em;transform:rotate(-90deg)}.i-datagrid-sorter-caret:last-child{transform:rotate(90deg)}.i-datagrid-sorter-asc .i-datagrid-sorter-caret:first-child{color:var(--color-main)}.i-datagrid-sorter-desc .i-datagrid-sorter-caret:last-child{color:var(--color-main)}.i-backdrop-drawer{position:fixed;inset:0;z-index:100;pointer-events:none;background:var(--color-backdrop);backdrop-filter:blur(8px);transition:var(--transition);opacity:0;display:flex}.i-backdrop-drawer.i-active{opacity:1;pointer-events:unset}.i-drawer{position:absolute;display:flex;flex-direction:column;max-width:100%;max-height:100%;overflow:auto;box-shadow:var(--shadow);transition:var(--transition);background:var(--background);backdrop-filter:var(--blur)}.i-drawer-left{inset:0 auto 0 0;transform:translate3d(-100%, 0, 0)}.i-drawer-top{inset:0 0 auto;transform:translate3d(0, -100%, 0)}.i-drawer-right{inset:0 0 0 auto;transform:translate3d(100%, 0, 0)}.i-drawer-bottom{inset:auto 0 0;transform:translate3d(0, 100%, 0)}.i-active>.i-drawer{opacity:1;transform:none;pointer-events:unset}.i-drawer-header,.i-drawer-footer{display:flex;align-items:center;padding:12px}.i-drawer-header:empty,.i-drawer-footer:empty{display:none}.i-drawer-content{flex:1;overflow-x:hidden}.i-drawer-close{margin:0 0 0 auto;display:flex;align-self:flex-start;border-radius:var(--radius)}.i-image{position:relative;display:inline-flex;align-items:center;justify-content:center;align-self:center;border-radius:var(--radius);overflow:hidden;vertical-align:middle;background:var(--background-opacity);backdrop-filter:var(--blur);flex-shrink:0}.i-image .i-loading-container{z-index:1;backdrop-filter:var(--blur)}.i-image>img{border-radius:inherit;width:100%;height:100%;object-fit:cover}.i-image-cover{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;backdrop-filter:var(--blur);background:var(--background-opacity)}.i-loading-container{display:flex;flex-direction:column;justify-content:center;align-items:center;gap:.5em;font-size:inherit;transform:translateZ(0);border-radius:inherit;backdrop-filter:blur(2px)}.i-loading-icon{stroke:var(--color);width:1em;height:1em;animation:rotate .628s linear 0s infinite}.i-list{--gap: 0.5em;overflow:auto}.i-list-item{display:flex;gap:var(--gap);padding:var(--padding);transition:var(--transition);border-radius:var(--radius)}.i-list-item-bordered{box-shadow:inset 0 0 0 1px var(--color-8)}.i-list-item-bordered+.i-list-item-bordered{margin-top:-1px}.i-list-item-bordered:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.i-list-item-bordered:not(:last-child){border-bottom-right-radius:0;border-bottom-left-radius:0}.i-list-item-bordered:hover{box-shadow:inset 0 0 0 1px var(--color-7);z-index:1}.i-list-option{position:relative;cursor:pointer;user-select:none;white-space:nowrap;justify-content:space-between}.i-list-option:hover{background-color:var(--background-opacity-1)}.i-list-option.i-list-item-active{background-color:var(--color-main-0)}.i-list-item-label{align-self:flex-start}.i-messages{position:fixed;inset:12px;pointer-events:none;display:flex;flex-direction:column;justify-content:center;z-index:10000;transition:var(--transition);cursor:default}.i-message{position:absolute;padding:.625em 1em;pointer-events:all;opacity:0;transition:var(--transition);transform:translate(80px, 0) scale(0.86) skew(-40deg);background:var(--background-opacity);border-radius:var(--radius);box-shadow:var(--shadow);backdrop-filter:var(--blur)}.i-message.i-message-active{opacity:1;transform:translate(0, 0)}.i-popconfirm{padding:1rem}.i-popconfirm-footer{margin-top:1rem}.i-modal-container{position:fixed;inset:0;z-index:100;padding:12px;transition:var(--transition);opacity:0;pointer-events:none;display:flex;overflow:hidden}.i-modal-container.i-modal-active{opacity:1}.i-modal-backdrop{background:var(--color-backdrop);backdrop-filter:blur(8px)}.i-modal-backdrop.i-modal-active{pointer-events:unset}.i-modal-customized{overflow:unset}.i-modal{position:relative;display:flex;flex-direction:column;margin:auto;max-width:100%;max-height:100%;overflow-x:hidden;border-radius:var(--radius);transform:translate(0, 12px);transition:var(--transition);background:var(--background)}.i-modal.bounced{animation:bounce .4s ease-in-out 0s}.i-modal-active>.i-modal{opacity:1;transform:none;pointer-events:all}.i-modal-header,.i-modal-footer{position:relative;display:flex;align-items:center;padding:12px;gap:12px}.i-modal-header:empty,.i-modal-footer:empty{display:none}.i-modal-header>b{display:contents}.i-modal-footer{justify-content:center}.i-modal-content{overflow-x:hidden;flex:1;max-height:100%;line-height:1.5}.i-modal .i-modal-close{margin:0 0 0 auto;display:flex;align-self:flex-start;border-radius:var(--radius)}.i-popup{position:absolute;z-index:100;opacity:0;transition:all .12s;will-change:left,top,opacity,transform;border-radius:var(--radius);background:var(--background);box-shadow:var(--shadow);transform:translate(0, 2px)}.i-popup-arrow{position:absolute;width:8px;height:24px;pointer-events:none;color:unset;transition:all .12s}.i-popup-arrow path{fill:var(--background)}.i-radio{position:relative;display:inline-flex;flex-wrap:wrap;gap:1em}.i-radio-label{width:var(--label-width);text-align:var(--label-align);font-weight:500}.i-radio-item{display:inline-flex;align-items:baseline;border-radius:var(--radius)}.i-radio-item:hover .i-radio-input{box-shadow:inset 0 0 0 3px var(--color-7);background-color:var(--color-main-0)}.i-radio-item-custom>.i-radio-input{width:0;height:0}.i-input-success .i-radio-input{box-shadow:inset 0 0 0 3px var(--green-0)}.i-input-warning .i-radio-input{box-shadow:inset 0 0 0 3px var(--yellow-0)}.i-input-error .i-radio-input{box-shadow:inset 0 0 0 3px var(--error-0)}.i-radio-options{flex:1 1 100%;position:relative;display:flex;flex-wrap:wrap;gap:.625em;align-self:baseline}.i-radio-options-button{flex:none}.i-radio-text{display:inline-flex;margin-left:.4em;transition:var(--transition);user-select:none;border-radius:inherit;color:var(--color-3)}.i-radio-input{position:relative;display:flex;cursor:inherit;height:1.125em;width:1.125em;flex-shrink:0;overflow:hidden;appearance:none;border-radius:50%;transition:all .15s;outline:0;align-self:center;box-shadow:inset 0 0 0 3px var(--color-8)}.i-radio-default{border:0 solid rgba(0,0,0,0)}.i-radio-input:checked.i-radio-default{border-width:.4em;border-color:var(--color-main);background:var(--color-main-reverse);box-shadow:none}.i-radio-input:checked.i-radio-default+.i-radio-text{color:var(--color-main)}.i-radio-default:active{transform:scale(1.1)}.i-radio-button{display:none}.i-radio-button+.i-radio-text{margin-left:0;padding:0 .628em;line-height:1.8;font-size:.94em;white-space:nowrap;border:1.5px solid var(--color-9)}.i-radio-button+.i-radio-text:hover{background-color:var(--color-main-0);border-color:var(--color-8)}.i-radio-button:checked+.i-radio-text{background:var(--color-main-0);color:var(--color-main);border-color:var(--color-main)}.i-radio-message{margin-top:.5em;font-size:.8em;align-self:flex-start;pointer-events:none}.i-radio-success .i-radio-input{box-shadow:inset 0 0 0 3px var(--success-0)}.i-radio-success .i-radio-message{color:var(--success)}.i-radio-warning .i-radio-input{box-shadow:inset 0 0 0 3px var(--warning-0)}.i-radio-warning .i-radio-message{color:var(--warning)}.i-radio-error .i-radio-input{box-shadow:inset 0 0 0 3px var(--error-0)}.i-radio-error .i-radio-message{color:var(--error)}.i-progress{flex:1 1 100%;position:relative;display:flex;background:var(--background-1);border-radius:var(--radius);cursor:pointer}.i-progress-vertical{height:100%}.i-progress-vertical>.i-progress-bar{height:100%;align-self:flex-end}.i-progress-bar{position:relative;width:100%;background:var(--color-main);border-radius:var(--radius);transform-origin:left;transition:var(--transition)}.i-progress-cursor{position:absolute;right:0;top:50%;display:flex;min-height:120%;min-width:1em;transform:translate(50%, -50%) scale(0);transition:var(--transition);border-radius:inherit;box-shadow:var(--shadow);user-select:none;overflow:hidden}.i-progress:hover .i-progress-cursor,.no-transition>.i-progress-cursor{transform:translate(50%, -50%) scale(1)}.i-progress-circle{position:relative}.i-progress-circle-path{transition:var(--transition);border-radius:50px}.i-progress-circle-value{position:absolute;left:50%;top:50%;transform:translate(-50%, -50%);font-size:1.5em}.i-resizable{display:flex;overflow:hidden}.i-resizable-vertical{flex-direction:column}.i-resizable-vertical>.i-resizable-line{cursor:ns-resize;width:100%;height:2px}.i-resizable-a{overflow:auto}.i-resizable-b{flex:1;overflow:auto}.i-resizable-line{position:relative;display:flex;justify-content:center;align-items:center;width:2px;height:100%;background:var(--color-8);cursor:ew-resize;transition:var(--transition);touch-action:none;user-select:none}.i-resizable-line:hover,.i-resizable-line.i-resizable-resizing{outline:1px solid var(--color-8)}.i-resizable-line:hover>.i-resizable-line-node,.i-resizable-line.i-resizable-resizing>.i-resizable-line-node{opacity:1}.i-resizable-line-node{display:flex;position:relative;z-index:1;pointer-events:none;opacity:0;transition:var(--transition);background:inherit;border-radius:var(--radius);font-size:.8em}.i-river{overflow:hidden}.i-river-track{display:inline-flex;will-change:transform}.i-river-item{flex-shrink:0}.i-select{display:flex;gap:.5em}.i-select-multiple{flex-wrap:wrap;padding:.25em .628em}.i-select-multiple .i-tag{position:relative;padding:0 .5em;line-height:1.425em;background:var(--background-opacity-1)}.i-select-options{--gap: 0.25em;display:flex;flex-direction:column;max-height:40vh;padding:4px;gap:2px;overflow-x:hidden;border-radius:inherit}.i-select-options .i-list-item{justify-content:unset;align-items:center;color:var(--color-5)}.i-select-options .i-list-item.i-list-item-active{color:var(--color-main);background:var(--color-main-0)}.i-select-options .i-list-item.i-list-item-active .i-select-option-check{opacity:1}.i-select-options .i-list-item.disabled{pointer-events:none}.i-select-options-multiple .i-list-item.i-list-item-active{background:rgba(0,0,0,0)}.i-select-option-check{opacity:0}.i-select-filter{position:sticky;top:0;z-index:1;display:flex;flex-wrap:wrap;background:var(--background-opacity);backdrop-filter:var(--blur);border-bottom:1px solid var(--background-opacity-1)}.i-select-filter:empty{display:none}.i-text-gradient{-webkit-text-fill-color:rgba(0,0,0,0)}.i-text-gradient-wave{background-size:200% 100%;background-position:0 0;animation:text-wave 1.2s linear 0s infinite}@keyframes text-wave{100%{background-position:-100% 0}}.i-tabs{max-width:100%;gap:.5em}.i-tabs-line .i-tab-navs{gap:1em}.i-tabs-line .i-tab-nav{padding:.4em 0}.i-tabs-line .i-tab-nav.i-tab-active{--color: var(--color-main)}.i-tabs-line .i-tab-navs-bar{background:var(--color-main)}.i-tabs-line .i-tab-navs-vertical>.i-tab-navs{gap:.5em}.i-tabs-line .i-tab-navs-vertical>.i-tab-navs>.i-tab-nav{padding:.25em 1em}.i-tab-navs-container{display:flex;border-radius:var(--radius);scroll-behavior:smooth;gap:4px;align-items:center}.i-tab-navs-vertical{align-items:flex-end;flex-direction:column}.i-tab-navs{flex:1;position:relative;display:flex;flex-direction:inherit;overflow:auto;user-select:none;scroll-behavior:unset;scrollbar-width:none;gap:1px}.i-tab-navs::-webkit-scrollbar{display:none}.i-tabs-pane .i-tab-navs-container{position:relative}.i-tabs-pane .i-tab-navs-container:before{position:absolute;bottom:0;left:0;right:0;width:100%;border-top:1px solid var(--color-8);content:"";z-index:1}.i-tabs-pane .i-tab-navs{gap:4px}.i-tabs-pane .i-tab-navs .i-tab-nav{border-radius:var(--radius) var(--radius) 0 0;border:1px solid rgba(0,0,0,0)}.i-tabs-pane .i-tab-navs .i-tab-nav:hover{border-color:var(--color-8);border-bottom-color:var(--background)}.i-tabs-pane .i-tab-navs .i-tab-active{z-index:2;background:rgba(0,0,0,0);border-color:var(--color-8);border-bottom:1px solid var(--background);box-shadow:1px 2px 0 1px var(--color-8)}.i-tabs-pane .i-tab-navs .i-tab-active:hover{background-color:rgba(0,0,0,0)}.i-tabs-pane .i-tab-navs-vertical:before{left:unset;top:0;width:unset;height:100%;border-top:none;border-right:1px solid var(--color-8)}.i-tabs-pane .i-tab-navs-vertical .i-tab-navs .i-tab-nav{border-radius:var(--radius) 0 0 var(--radius);border:1px solid rgba(0,0,0,0)}.i-tabs-pane .i-tab-navs-vertical .i-tab-navs .i-tab-nav:hover{border-color:var(--color-8);border-right-color:var(--background)}.i-tabs-pane .i-tab-navs-vertical .i-tab-navs .i-tab-active{border-color:var(--color-7);border-right:1px solid var(--background)}.i-tabs-pane .i-tab-navs-vertical .i-tab-navs .i-tab-active:hover{background-color:rgba(0,0,0,0)}.i-tab-nav{--color: var(--color-7);position:relative;z-index:1;display:flex;align-items:center;justify-content:center;padding:.4em .5em;user-select:none;flex-shrink:0;gap:.25em;color:var(--color);border-radius:var(--radius)}.i-tab-nav:hover{--color: var(--color-3)}.i-tab-nav.i-tab-active{--color: var(--color-main)}.i-tabs-morelist .i-tab-nav{white-space:nowrap}.i-tabs-morelist .i-tab-active{background:var(--color-main-0)}.i-tab-closable .i-tab-nav{padding-right:0;border-radius:var(--radius) var(--radius) 0 0}.i-tab-closable .i-tab-nav.i-tab-active{box-shadow:2px 0 8px rgba(0,0,0,.0509803922);background-color:var(--background)}.i-tab-nav-close{position:absolute;right:4px;margin:0;font-size:.7em;padding:0;opacity:0;background:var(--background)}.i-tab-nav-close:hover{color:var(--error);background:var(--background)}.i-tab-nav:hover .i-tab-nav-close{opacity:1}.i-tab-navs-bar{position:absolute;bottom:0em;left:0;height:0;background:var(--color-main-0);pointer-events:none;transition:var(--transition);border-radius:4px}.i-tab-navs-vertical>.i-tab-navs{gap:1px}.i-tab-navs-vertical>.i-tab-navs>.i-tab-navs-bar{width:0;left:unset;bottom:unset;right:0;top:0}.i-tab-contents{position:relative;flex:1}.i-tab-content{display:none}.i-tab-content.i-tab-active{display:block}.i-tag{--background: var(--color-9);--color: var(--color-1);position:relative;display:inline-flex;align-items:center;justify-content:center;align-self:center;gap:.5em;padding:.25em .5em;border-radius:var(--radius);background:var(--background);color:var(--color);border:2px solid rgba(0,0,0,0);transition:var(--transition);font-size:.81em;line-height:1}.i-tag .i-tag-close{position:absolute;right:0;top:0;z-index:1;margin:0;background:var(--error);color:var(--white);transform:translate(50%, -50%);font-size:.81em;transition:all .16s}.i-tag .i-tag-close:hover{background:var(--error-1);color:var(--white)}.i-tag:hover .i-tag-hover-close{opacity:1;transform:translate(50%, -50%) scale(1)}.i-tag-large{font-size:1em}.i-tag-extreme{font-size:1.5em;height:2em}.i-tag-small{font-size:.72em;padding:.125em .4em}.i-tag-dot{content:" ";width:.385em;height:.385em;border-radius:50%;background-color:var(--color);box-shadow:0 -1px 1px 0 rgba(var(--color), 0.3);flex-shrink:0;transition:inherit}.i-tag-outline{--background: transparent;border-color:var(--color)}.i-tag-hover-close{transform:translate(50%, -50%) scale(0);opacity:0}.i-tag-clickable{cursor:pointer}.i-tag-clickable:hover{background:var(--background-hover);color:var(--color-hover, var(--color))}.i-swiper{position:relative;max-width:100%;user-select:none}.i-swiper:hover .i-swiper-arrow{opacity:.72}.i-swiper .i-swiper-arrow:hover{opacity:1}.i-swiper-track{position:relative;overflow:hidden;touch-action:pan-x}.i-swiper-list{display:flex;will-change:transform}.i-swiper-fade>.i-swiper-item{opacity:0}.i-swiper-fade>.i-swiper-active{opacity:1}.i-swiper-vertical .i-swiper-track{height:100%;touch-action:pan-y}.i-swiper-vertical .i-swiper-list{flex-direction:column}.i-swiper-vertical .i-swiper-item{width:100%}.i-swiper-vertical .i-swiper-arrow{left:unset;right:.5em}.i-swiper-vertical .i-swiper-prev{bottom:50%;top:unset;transform:translate(0, -6px)}.i-swiper-vertical .i-swiper-next{transform:translate(0, 6px)}.i-swiper-item{flex:1;flex-shrink:0;display:flex;justify-content:center;align-items:center;overflow:hidden;transition:var(--transition)}.i-swiper-arrow{position:absolute;top:50%;display:inline-flex;align-items:center;justify-content:center;border-radius:var(--radius);transform:translate(0, -50%);transition:var(--transition);opacity:0}.i-swiper-prev{left:.5em}.i-swiper-next{right:.5em}.i-swiper-indicators{margin:.5em 0;display:flex;justify-content:center;gap:.5em}.i-swiper-indicators-fixed{position:absolute;bottom:0;left:50%;transform:translate(-50%, 0)}.i-swiper-indicator{width:8px;height:8px;border-radius:50%;flex-shrink:0;background:var(--color);opacity:.25}.i-swiper-indicator:hover{opacity:.8}.i-swiper-indicator.i-indicator-active{opacity:1}.i-step{display:flex;flex-wrap:wrap;gap:.5em;overflow:hidden}.i-step-vertical{flex-direction:column}.i-step-vertical .i-step-item{flex-direction:row}.i-step-vertical .i-step-item:not(:last-child) .i-step-item-right{padding-bottom:1em}.i-step-item{display:flex;flex-direction:column;gap:.5em;flex:1 1 auto;transition:var(--transition)}.i-step-item:last-child{flex:none}.i-step-item:last-child .i-step-divider{display:none}.i-step-item.i-step-item-finished{opacity:.4}.i-step-item.i-step-item-finished .i-step-divider{border-style:solid}.i-step-item.i-step-item-pending{opacity:.4}.i-step-item:hover{opacity:1}.i-step-item-index{display:flex;align-items:center;justify-content:center;flex-shrink:0;width:1.5em;line-height:1.5em;border-radius:1.5em;background:var(--color-4);color:var(--background)}.i-step-divider{flex:1;align-self:center;border:1px dashed var(--color-7)}.i-step-item-title{display:flex;align-items:center;gap:.5em;white-space:nowrap}.i-step-item-left{display:flex;flex-direction:column;align-items:center;gap:.5em}.i-step-item-right{display:flex;flex-direction:column;gap:.5em}.i-tree{display:flex;flex-direction:column;gap:1px;color:var(--color-2)}.i-tree-group-title{position:relative;font-size:1em;display:flex;font-weight:300;font-style:italic;font-size:.9em}.i-tree-group-title:after{content:" ";margin-left:.5em;flex:1;height:1px;align-self:center;background:var(--color-8)}.i-tree-item-header{position:relative;display:flex;align-items:center;gap:.25em;padding:.4em;user-select:none;border-radius:var(--radius);overflow:hidden;color:var(--color-6)}.i-tree-item-header.i-tree-item-round{border-radius:100px}.i-tree-item-header.i-tree-item-selected,.i-tree-item-header:hover{background:var(--color-main-0);color:var(--color-main)}.i-tree-round{--radius: 100px}.i-tree-item-icon{display:flex}.i-tree-checkbox{align-self:center}.i-tree-toggle{margin-left:auto;transition:var(--transition);border-radius:inherit;color:var(--color-6)}.i-tree-toggle:hover{color:var(--color-3);background:var(--background-opacity)}.i-tree-item-content{max-height:0;overflow:hidden;transition:max-height .5s cubic-bezier(0, 1, 0, 1)}.i-tree-expand>.i-tree-item-content{transition:max-height .25s cubic-bezier(1, 0, 1, 0);max-height:2000px}.i-tree-expand>.i-tree-item-header{color:var(--color-main);opacity:1}.i-tree-expand>.i-tree-item-header>.i-tree-toggle{transform:rotateX(180deg)}.i-input-label-file{display:inline-flex;width:unset}.i-input-label-file:has(.i-upload-list:empty){align-items:center}.i-input-file-hidden{display:none}.i-upload-inner{flex:1 1 100%;display:flex;flex-wrap:wrap;gap:.5em}.i-upload-card:has(.i-upload-list:not(:empty)){align-self:flex-start}.i-upload-card .i-upload-list{display:contents}.i-upload-list{display:flex;flex-wrap:wrap;width:100%;gap:inherit;user-select:none}.i-upload-list:empty{display:none}.i-upload-delete{opacity:0;margin:0;z-index:1;right:-0.825em;top:-0.825em;box-shadow:var(--shadow)}.i-upload-btn{align-self:center}.i-upload-card-btn{border-style:dashed;width:var(--upload-card-size);height:var(--upload-card-size);opacity:.6;font-size:1em}.i-upload-card-btn:hover{opacity:1}.i-upload-item{position:relative;display:inline-flex;align-items:center;gap:.25em;padding:.25em .4em;border:2px solid var(--background-opacity-1);border-radius:var(--radius);background:var(--background-opacity);transition:var(--transition);font-size:.8em}.i-upload-item .i-upload-delete{position:absolute;background-color:var(--error);color:#fff}.i-upload-item .i-upload-delete:hover{background-color:var(--error);color:#fff}.i-upload-item:hover{background-color:var(--background-opacity-1)}.i-upload-item:hover .i-upload-delete{opacity:1}.i-upload-item-card{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.25em;width:var(--upload-card-size);height:var(--upload-card-size);border-radius:var(--radius);background:var(--background-opacity-1);cursor:pointer}.i-upload-item-card .i-image,.i-upload-item-card video{width:100%;height:100%;object-fit:cover}.i-upload-item-card .i-upload-file-name{max-width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-size:.8em;padding-inline:4px}.i-upload-item-card .i-upload-delete{font-size:.72em;position:absolute;background-color:var(--error);color:#fff}.i-upload-item-card .i-upload-delete:hover{background-color:var(--error);color:#fff}.i-upload-item-card:hover .i-upload-delete{opacity:1}.i-upload-size{font-size:.8em;color:var(--color-6)}.i-upload-item-dragged{z-index:1000}.i-video{position:relative;background:#000;border-radius:var(--radius);overflow:hidden}.i-video video{width:100%;height:100%}.i-video-controls{position:absolute;left:0;bottom:-1px;right:0;display:flex;align-items:center;padding:4px;gap:4px;font-size:.9em;white-space:nowrap;user-select:none;transition:var(--transition);background:var(--background-opacity);backdrop-filter:var(--blur)}.i-video-controls .i-btn{flex-shrink:0}.i-video-controls .i-icon{font-size:1.2em}.i-video-controls:hover{opacity:1;pointer-events:unset}.i-video-controls-hidden{opacity:0;pointer-events:none}.i-video-control{display:flex;align-items:center}.i-video-times{margin-inline:8px;display:flex;align-items:center;gap:4px}.i-video-volume{position:absolute;z-index:1;bottom:100%;left:50%;transform:translate(-50%, 4px);padding:8px;opacity:0;pointer-events:none;border-radius:var(--radius);transition:var(--transition);backdrop-filter:var(--blur);background:var(--background-opacity)}.i-video-control-volume{position:relative}.i-video-control-volume:hover .i-video-volume{opacity:1;pointer-events:unset}.i-checkbox{gap:1em}.i-checkbox-item{display:inline-flex;align-items:baseline;gap:.25em;border-radius:var(--radius);align-self:flex-start}.i-checkbox-item:hover .i-checkbox-input{box-shadow:inset 0 0 0 2px var(--color-5)}.i-checkbox-item:hover .i-checkbox-switch{box-shadow:inset 0 0 0 2px var(--color-8)}.i-checkbox-item:hover .i-checkbox-partof{box-shadow:none}.i-checkbox-item .i-checkbox-input:checked{box-shadow:none}.i-checkbox-options{flex:1 1 100%;position:relative;display:flex;flex-wrap:wrap;gap:.625em;align-self:baseline}.i-checkbox-text{display:inline-flex;transition:var(--transition);user-select:none;border-radius:inherit;color:var(--color-3)}.i-checkbox-text:empty{display:none}.i-checkbox-input{position:relative;display:flex;cursor:inherit;height:1.125em;width:1.125em;overflow:hidden;appearance:none;border-radius:inherit;transition:var(--transition);outline:0;align-self:center}.i-checkbox-custom{width:0;height:0}.i-checkbox-switch{height:1.125em;width:2.2em;overflow:unset;border-radius:2.4em;box-shadow:inset 0 0 0 2px var(--color-9);background:var(--color-9)}.i-checkbox-switch:hover:after{box-shadow:0 0 0 2px var(--color-7);background-color:var(--color-main-0)}.i-checkbox-default{border-radius:2px;box-shadow:inset 0 0 0 2px var(--color-7)}.i-checkbox-button{display:none}.i-checkbox-default:after,.i-checkbox-switch:before,.i-checkbox-switch:after,.i-checkbox-partof:after{content:" ";position:absolute;transition:var(--transition)}.i-checkbox-default:after{left:34%;top:16%;height:50%;width:20%;border-bottom:2px solid var(--color-main-reverse);border-right:2px solid var(--color-main-reverse);transform:rotate(90deg) scale(0);border-radius:1px}.i-checkbox-switch:after{left:0;top:50%;width:1em;height:1em;transform:translate(0, -50%);box-shadow:0 0 0 2px var(--color-8);border-radius:1em;transition:var(--transition);background-color:var(--background)}.i-checkbox-switch:active:after{width:1.5em}.i-checkbox-switch:active:checked:after{left:-0.5em}.i-checkbox-input:checked.i-checkbox-default{background-color:var(--color-main)}.i-checkbox-input:checked.i-checkbox-default:after{transform:rotate(45deg)}.i-checkbox-input:checked.i-checkbox-switch{background-color:var(--color-main)}.i-checkbox-input:checked.i-checkbox-switch:after{box-shadow:0 0 0 2px var(--color-main);transform:translate(1.2em, -50%);background-color:var(--background)}.i-checkbox-input:checked+.i-checkbox-text{color:var(--color-main)}.i-checkbox-button+.i-checkbox-text{padding:0 1em;line-height:1.8;font-size:.9em;display:flex;align-items:center;white-space:nowrap;border-radius:2em;border:1.5px solid var(--color-9)}.i-checkbox-button:hover+.i-checkbox-text{background-color:var(--color-9);border-color:var(--color-8)}.i-checkbox-button:checked+.i-checkbox-text{background-color:var(--color-main-0);color:var(--color-main);border-color:var(--color-main)}.i-checkbox-partof{border-radius:2px;background-color:var(--color-main)}.i-checkbox-partof:after{background-color:var(--color-main-reverse);height:2px;width:.5em;left:50%;top:50%;transform:translate(-50%, -50%);border-radius:var(--radius)}.i-checkbox-message{margin-top:.5em;font-size:.8em;align-self:flex-start;pointer-events:none}.i-checkbox-success .i-checkbox-input{box-shadow:inset 0 0 0 2px var(--success-0)}.i-checkbox-success .i-checkbox-input:checked{background-color:var(--success-0)}.i-checkbox-success .i-checkbox-message{color:var(--success)}.i-checkbox-warning .i-checkbox-input{box-shadow:inset 0 0 0 2px var(--warning-0)}.i-checkbox-warning .i-checkbox-input:checked{background-color:var(--warning-0)}.i-checkbox-warning .i-checkbox-message{color:var(--warning)}.i-checkbox-error .i-checkbox-input{box-shadow:inset 0 0 0 2px var(--error-0)}.i-checkbox-error .i-checkbox-input:checked{background-color:var(--error-0)}.i-checkbox-error .i-checkbox-message{color:var(--error)}.i-pagination{display:flex;align-items:center;gap:.2em}.i-page{--background: transparent;--color: var(--color-7);position:relative;display:inline-flex;align-items:center;justify-content:center;padding:0 .32em;height:2.25em;min-width:2.25em;border-radius:var(--radius);border:2px solid rgba(0,0,0,0);transition:var(--transition);user-select:none;cursor:pointer;white-space:nowrap;outline:none;color:var(--color);background:var(--background)}.i-page .i-ripple-container{inset:-2px}.i-page .i-loading-container{position:absolute;inset:0;z-index:1;background:var(--background-opacity);backdrop-filter:var(--blur)}.i-page:hover{--background: var(--background-opacity-2)}.i-page.i-page-active{--background: var(--color-main);--color: var(--color-main-reverse);cursor:default}.i-page.i-page-loading{--background: unset;cursor:default}.i-helpericon{position:relative;margin:.25em;padding:.125em;min-height:1.675em;min-width:1.675em;display:flex;align-items:center;justify-content:center;align-self:center;color:var(--color-7);transition:var(--transition);border-radius:var(--radius);font-size:.8em}.i-helpericon:hover{color:var(--color-3);background:var(--background-opacity-1)}.i-timepicker-label{position:unset}.i-timepicker{display:flex}.i-timepicker-list{min-width:3em;text-align:center;overflow:auto;padding:4px;max-height:12.2em;display:flex;flex-direction:column;gap:2px;scrollbar-width:none}.i-timepicker-list::-webkit-scrollbar{display:none}.i-timepicker-list:not(:last-child){border-right:1px solid var(--color-9)}.i-timepicker-item{display:block;padding:.32em .5em;border-radius:var(--radius);opacity:.5}.i-timepicker-item:hover{background-color:var(--color-9);opacity:1}.i-timepicker-item.i-timepicker-item-active{position:sticky;top:0;bottom:0;z-index:1;background:var(--color-main);color:var(--color-main-reverse);opacity:1}.i-timepicker-icon{margin-right:.4em;opacity:.5;pointer-events:none}.i-empty{margin:auto;width:3em;height:3em;color:var(--color-7)}.i-colorpicker-handle{position:relative;display:inline-flex;align-items:center;font-size:.8em;gap:.25em}.i-colorpicker-square{display:inline-block;width:1.8em;height:1.8em;border:2px solid var(--color-9);border-radius:var(--radius);cursor:pointer;transition:var(--transition)}.i-colorpicker-square:hover{border-color:var(--color-8)}.i-colorpicker-footer{display:flex;gap:4px;font-size:.8em}.i-colorpicker-text{transition:var(--transition);cursor:pointer;padding:.25em .5em;border-radius:var(--radius);background:var(--color-9)}.i-colorpicker-text:hover{background:var(--color-8)}.rc-color-picker-panel{box-shadow:none;background:inherit}.i-datepicker-label{position:unset}.i-datepicker{padding:8px}.i-datepicker .i-datepicker-item{cursor:pointer}.i-datepicker-weeks,.i-datepicker-dates{display:grid;grid-template-columns:repeat(7, 1fr);gap:2px}.i-datepicker-week,.i-datepicker-item{display:flex;justify-content:center;padding:.32em .5em}.i-datepicker-week{color:var(--color-5)}.i-datepicker-item{--background: transparent;opacity:.4;border-radius:var(--radius);transition:all .12s;background:var(--background);color:var(--color)}.i-datepicker-item:hover{opacity:1;--background: var(--color-main-0)}.i-datepicker-item.i-datepicker-same-month{opacity:.8}.i-datepicker-item.i-datepicker-today{--background: var(--color-main-0)}.i-datepicker-item.i-datepicker-active{--background: var(--color-main);--color: var(--color-main-reverse);opacity:1}.i-datepicker-item.i-datepicker-disabled{opacity:.2;cursor:not-allowed}.i-datepicker-units{margin-bottom:.5em;display:flex;align-items:center;gap:.125em;color:var(--color-6);font-size:.9em}.i-datepicker-action{position:relative;display:flex;align-items:baseline;gap:.25em;padding:.125em .5em;user-select:none;border-radius:var(--radius)}.i-datepicker-action>span{color:var(--color);font-size:1.15em}.i-datepicker-action:hover{background:var(--color-main-0)}.i-datepicker-icon{margin-right:.4em;opacity:.5;pointer-events:none}.i-datepicker-ym{position:absolute;inset:0;z-index:1;padding:8px;gap:.5em;background:var(--background);backdrop-filter:var(--blur);display:flex;pointer-events:none;opacity:0;transition:var(--transition)}.i-datepicker-ym.i-datepicker-active{opacity:1;pointer-events:unset}.i-datepicker-years{width:5em;overflow-x:hidden;display:flex;flex-direction:column;max-height:100%;gap:.25em}.i-datepicker-months{margin-top:1.5em;flex:1;display:grid;grid-template-columns:repeat(3, 1fr);gap:.25em}.i-datepicker-year{flex:1}.i-datepicker-year,.i-datepicker-month{display:flex;padding:2px;user-select:none;border-radius:var(--radius);justify-content:center;align-items:center}.i-datepicker-year:hover,.i-datepicker-month:hover{background-color:var(--background-opacity-2)}.i-datepicker-year.i-datepicker-active,.i-datepicker-month.i-datepicker-active{background:var(--color-main);color:var(--color-main-reverse);opacity:1}.i-datepicker-close{position:absolute;right:0;top:0}
2
2
 
3
3
  /*# sourceMappingURL=index.css.map */
@@ -1 +1 @@
1
- {"version":3,"sourceRoot":"","sources":["stdin"],"names":[],"mappings":"AAAQ,sBACA,qBACA,qBACA,sBACA,yBA0pFA,qDAzpFR,eACI,kBACA,aACA,eACA,qBACA,yBACA,SACA,WACA,eACA,4BAEA,qCACI,sBAGJ,qCACI,uBAGJ,mCACI,sBAIR,gBACI,iBAEA,+FAGI,cAGJ,iCACI,kBACA,UACA,WACA,kBACA,qCACA,4BAIR,oBACI,4BACA,8BACA,sBACA,gBACA,oBAGJ,cACI,0BACA,kEACA,cACA,aACA,qBACA,6BACA,sBACA,mEACA,eAEA,qBACI,mBAGJ,2EAGI,4BACA,+BAGJ,8BACI,4BAGJ,8BACI,6BAGJ,4BACI,4BAIR,oBACI,2BACA,uCAGJ,mBACI,6CACA,gBACA,yCACA,yBAGJ,SACI,uBACA,OACA,WACA,cACA,aACA,6BACA,yBACA,sBACA,mBAEA,kGAEI,wBAGJ,mBACI,0BAGJ,wBACI,iBAGJ,kBACI,uCACA,mBAIR,iBACI,wBACA,cACA,kBACA,UACA,eACA,mBACA,4BACA,oBAGJ,iBACI,sBAGJ,iBACI,uBAGJ,eACI,sBAGJ,YACI,cACA,WACI,qCAGJ,eACA,kBAGJ,iCAEI,wCACA,aACA,mBACA,mBAEA,+CACI,sBACA,aAIR,iBACI,eACA,+BACA,kCAGJ,gBACI,cACA,gCACA,mCAIA,iEAEI,cAIR,gBACI,kBACA,uBACA,iBAEF,QACE,yBACA,aACA,sBACA,uCACA,4BACA,4BACA,cAEF,iBACE,gCAEF,eACE,aACA,mBACA,4BACA,UAEF,gBACE,OAEF,eACE,gBACA,aACA,mBACA,4BACA,UAEF,SACE,eACA,WACA,aACA,sBACA,SACA,6BAGA,+BACE,UAGJ,sBACI,4BACA,cAGJ,oBACI,2BACA,iBAEA,gCACI,gBACA,eAGJ,yCACI,kBACA,QACA,WACA,qCACA,0BAIR,YACI,aACA,gBACA,wBACA,kBACA,mDACA,6CACA,eAEA,qBACI,gBACA,iBAIR,qBACI,wCACA,+CAEA,sCACI,+CAKJ,oCACI,wCAEA,mDACI,yDAKZ,4BACI,sDACA,iBAEA,kCACI,wCACA,wDAEA,mDACI,UAGJ,oEACI,UAKZ,iBACI,gBACA,aACA,mBACA,wCACA,QACA,4BACA,2CACA,iCACA,gBACA,4BAGJ,kCACI,UAGJ,6BACI,qCAGJ,4BACI,oCAGJ,yBACI,YACA,cACA,gBACA,YACA,wBACA,mBACA,gBAGJ,kCACI,cACA,uBACA,mCAIA,oCACI,wDACA,UACA,mBACA,uBACA,cACA,iBACA,4BAGJ,qDACI,UAIR,oBACI,kBACA,iBACA,UACA,gBACA,iBAEA,0BACI,gCAIR,uBACI,eAEA,6BACI,2CAIR,mBACI,aACA,sBACA,cACA,WACA,gBACA,qBAIA,qCACI,qBACA,yBAGJ,oCACI,wBAKJ,4DACI,wBAKJ,4DACI,wBAEL,YACD,QAEF,iBACE,oBACA,qBACA,UACA,4BACA,sBAEE,yCACE,0CAEF,0CACE,0CAEF,0CACE,gBAIF,2CACE,gBAIN,oBACE,cACA,kBACA,aACA,eACA,WACA,oBAEF,iBACE,oBACA,6BACA,iBACA,sBACA,qBACA,uBACE,aAGJ,kBACE,kBACA,aACA,eACA,eACA,cACA,gBACA,gBACA,sBACA,6BACA,UACA,kBAEF,mBACE,QACA,SAEF,mBACE,eACA,YACA,eACA,oBACA,0CACA,0BAEE,+BACE,oCACA,qCAIN,oBACE,kBACA,0CAEF,mBACE,aAEF,sGAIE,YACA,kBACA,6BAEF,0BACE,SACA,QACA,WACA,UACA,kDACA,iDACA,iCACA,kBAGA,yBACE,OACA,QACA,UACA,WACA,6BACA,oCACA,kBACA,6BACA,mCAGA,gCACE,YAEF,wCACE,YAKJ,6CACE,mCACA,mDACE,wBAGJ,4CACE,mCACA,kDACE,uCACA,iCACA,mCAGJ,2CACE,wBAIF,oCACE,cACA,gBACA,eACA,aACA,mBACA,mBACA,kBACA,kCAEF,0CACE,gCACA,4BAEF,4CACE,qCACA,wBACA,+BAGJ,mBACE,kBACA,mCACA,yBACE,2CACA,WACA,WACA,SACA,QACA,gCACA,4BAGJ,oBACE,gBACA,eACA,sBACA,oBAGA,sCACE,4CACA,8CACE,kCAGJ,wCACE,qBAIF,sCACE,4CACA,8CACE,kCAGJ,wCACE,qBAIF,oCACE,0CACA,4CACE,gCAGJ,sCACE,mBAGJ,SACE,kBACA,oBACA,kBACA,cACA,4BAEF,iBACE,kBACA,UACA,oBACA,kBACA,oBACA,wCACA,sBACA,qCACA,4BACA,yBACA,gBACA,oBACA,6BACE,WACA,UACA,UACA,kBACA,gBACA,oBAEF,uDAEE,wCAGJ,eACE,aAEF,oBACE,aACA,SAEF,6BACE,sBAEF,qBACE,cACA,qCACA,qBAEF,qBACE,OAEF,oBACE,aACA,sBACA,gBACA,YACA,QACA,kBACA,sBAEJ,mBACI,eACA,QACA,YACA,oBACA,iCACA,0BACA,6BACA,UACA,aAEA,4BACI,UACA,qBAIR,UACI,kBACA,aACA,sBACA,eACA,gBACA,cACA,yBACA,6BACA,6BACA,4BAGJ,eACI,iBACA,mCAGJ,cACI,eACA,mCAGJ,gBACI,iBACA,kCAGJ,iBACI,eACA,kCAGJ,oBACI,UACA,eACA,qBAGJ,kCAEI,aACA,mBACA,aAEA,8CACI,aAIR,kBACI,OACA,kBAGJ,gBACI,kBACA,aACA,sBACA,4BAEF,MACE,sBAEJ,SACI,kBACA,oBACA,mBACA,uBACA,kBACA,4BACA,gBACA,sBACA,qCACA,4BACA,cACA,8BACI,UACA,4BAEJ,aACI,sBACA,WACA,YACA,iBAGR,eACI,kBACA,QACA,aACA,mBACA,uBACA,4BACA,qCAEJ,UACI,aACA,sBACA,kBAGI,wJAEI,4BAIZ,qBACI,4BACA,+EAEI,YAGR,mBACI,aACA,QACA,gCACA,gBACA,YACA,8CACA,6BACA,0BACI,wBACA,gCACI,sBACA,sDACI,UAKhB,sBACI,kBACA,UACA,SACA,SACA,6BACA,UACA,YACA,kBACA,cACA,oBACA,6BACA,4BAEJ,kBACI,OACA,aACA,uBACA,gCACA,8CACA,6BACA,cACA,qBACA,qBACA,qBACA,aACA,8BACI,4BAEJ,gDAEI,4BAEJ,oBACI,kBAEJ,sBACI,SAEJ,+BACI,+BACA,qBAIR,kBACI,aACA,eACA,YACA,gBACA,gBACA,4BACA,qCACA,yBACA,4BACA,cACA,+BACI,qBAEJ,sCACI,wBAIR,eACI,oBACA,mBACA,eACA,wBACA,iBAEJ,qBACI,aACA,sBACA,uBACA,mBACA,SACA,kBACA,wBACA,sBACA,0BAGJ,gBACI,oBACA,UACA,WACA,0CAEJ,QACI,aACA,cAEJ,aACI,aACA,eACA,uBACA,6BACA,4BAEJ,sBACI,0CACA,4CACI,gBAEJ,wCACI,yBACA,0BAEJ,uCACI,6BACA,4BAEJ,4BACI,0CACA,UAGR,eACI,kBACA,eACA,iBACA,mBACA,8BACA,qBACI,6CAEJ,kCACI,qCAGR,mBACI,sBAEJ,mBACI,eACA,QACA,YACA,aACA,6BACA,UACA,oBACA,aACA,gBACA,kCACI,UAGR,kBACI,iCACA,0BACA,iCACI,qBAGR,oBACI,eAEJ,SACI,kBACA,aACA,sBACA,YACA,eACA,gBACA,kBACA,4BACA,6BACA,6BACA,6BACA,iBACI,oCAGR,yBACI,UACA,eACA,mBAEJ,gCAEI,kBACA,aACA,mBACA,aACA,SACA,4CACI,aAGR,kBACI,iBAEJ,gBACI,uBAEJ,iBACI,kBACA,OACA,gBACA,gBAGA,wBACI,kBACA,aACA,sBACA,4BAGR,YACI,eACA,WACA,oBACA,aACA,sBACA,uBACA,cACA,6BACA,eAGJ,WACI,kBACA,mBACA,mBACA,UACA,6BACA,sDACA,qCACA,4BACA,yBACA,4BAEA,4BACI,UACA,0BAGN,cACE,aAEF,qBACE,gBAEF,QACE,aACA,eAEF,eACE,uBACA,8BACE,iBAGJ,YACE,cACA,kBACA,aACA,+BACA,4BACA,eAEF,qBACE,YACA,qCACE,YACA,oBAGJ,gBACE,kBACA,WACA,6BACA,4BACA,sBACA,6BAEF,mBACE,kBACA,QACA,QACA,aACA,gBACA,cACA,wCACA,6BACA,sBACA,yBACA,iBACA,gBAEF,uEAEE,wCAEF,mBACE,kBAEF,wBACE,6BACA,mBAEF,yBACE,kBACA,SACA,QACA,gCACA,gBAEF,SACI,kBACA,YACA,UACA,oBACA,uCACA,4BACA,6BACA,yBACA,4BAGJ,eACI,kBACA,UACA,YACA,oBACA,YACA,oBAEA,oBACI,uBAEP,cACC,aACA,mBACA,SAEJ,QACI,0BACA,wBACA,kBACA,oBACA,mBACA,uBACA,gBACA,cACA,iBACA,4BACA,+BACA,6BACA,iBACA,eACA,mBACA,aACA,mBACA,6BACA,4BACI,WAEJ,6BACI,kBACA,QACA,UACA,qCACA,4BAEJ,cACI,0CAEJ,sBACI,gCACA,mCACA,eAEJ,uBACI,oBACA,eAGN,aACE,aACA,gBAEF,sBACE,sBACA,wCACE,iBACA,WACA,WAGJ,eACE,cAEF,eACE,OACA,cAEF,kBACE,kBACA,aACA,uBACA,mBACA,UACA,YACA,0BACA,iBACA,6BACA,kBACA,iBACA,+DAEE,iCACA,6GACE,UAIN,uBACE,aACA,kBACA,UACA,oBACA,UACA,6BACA,mBACA,4BACA,eAEF,SACE,kBACA,oBACA,eACA,QAEF,eACE,yBACA,8BACA,gBAEF,cACE,oBACA,qBACA,4BAEE,mCACE,0CACA,qCAKJ,oCACE,QACA,SAGJ,gCACE,0CAEF,gCACE,2CAEF,8BACE,0CAEF,iBACE,cACA,kBACA,aACA,eACA,WACA,oBAEF,wBACE,UAEF,cACE,oBACA,iBACA,6BACA,iBACA,sBACA,qBAEF,eACE,kBACA,aACA,eACA,eACA,cACA,cACA,gBACA,gBACA,kBACA,oBACA,UACA,kBACA,0CAEF,iBACE,6BAGA,uCACE,kBACA,+BACA,qCACA,gBACA,qDACE,wBAIN,wBACE,qBAEF,gBACE,aACA,8BACE,cACA,iBACA,gBACA,gBACA,mBACA,kCACA,oCACE,qCACA,4BAGJ,sCACE,+BACA,wBACA,+BAGJ,iBACE,gBACA,eACA,sBACA,oBAGA,gCACE,4CAEF,kCACE,qBAIF,gCACE,4CAEF,kCACE,qBAIF,8BACE,0CAEF,gCACE,mBAGJ,SACE,gBAEF,eACE,oBACA,sBAEF,cACE,cAEF,UACI,aACA,SAGJ,mBACI,eACA,qBAEA,0BACI,kBACA,eACA,oBACA,uCAIR,kBACI,cACA,aACA,sBACA,gBACA,YACA,QACA,kBACA,sBAEA,+BACI,sBACA,mBACA,qBAEA,kDACI,wBACA,+BAEA,yEACI,UAIR,wCACI,oBAOJ,2DACI,yBAKZ,uBACI,UAGJ,iBACI,gBACA,MACA,UACA,aACA,eACA,qCACA,4BACA,oDAEA,uBACI,aAEL,QACD,aACA,eACA,SACA,gBAEF,iBACE,sBACA,8BACE,mBAEE,kEACE,mBAKR,aACE,aACA,sBACA,SACA,cACA,6BACA,wBACE,UACA,wCACE,aAGJ,kCACE,WACA,kDACE,mBAGJ,iCACE,WAEF,mBACE,UAGJ,mBACE,aACA,mBACA,uBACA,cACA,YACA,kBACA,oBACA,0BACA,wBAEF,gBACE,OACA,kBACA,iCAEF,mBACE,aACA,mBACA,SACA,mBAEF,kBACE,aACA,sBACA,mBACA,SAEF,mBACE,aACA,sBACA,SAEJ,OACI,cACA,gCACA,wCACA,mCACA,kBACA,oBACA,mBACA,uBACA,eACA,eACA,cACA,4BACA,+BACA,6BACA,iBACA,eACA,mBACA,aACA,gBACA,gBACA,6BACA,mBACA,cACA,cAEA,2BACI,WAIR,cACI,gBAGJ,sBACI,oBACA,eACA,mBACA,qBAEA,0CACI,6BACA,eAIR,aACI,WAGJ,aACI,iBAGJ,eACI,cACA,WAGJ,aACI,WACA,cACA,gBACA,eAGJ,YACI,cACA,aACA,eACA,eAGJ,cACI,UACA,aAEA,sDAEI,UAIR,aACI,sCACA,uDAGJ,iBACI,wCACA,kCACA,2BACA,mCAGJ,YACI,wCACA,0BACA,2BACA,mCAGJ,eACI,wCACA,2BACA,mCAEA,qBACI,0BACA,0BAIR,gFAGI,sCAGJ,eACI,iBAGJ,eACI,aACA,eAGJ,uBACI,aAGI,gDACI,yBACA,4BAGJ,+CACI,0BACA,6BAKZ,sBACI,aACA,sBAGI,+CACI,yBACA,0BAGJ,8CACI,6BACA,4BAIZ,UACI,kBACA,eACA,iBAEI,gCACI,YAGR,gCACI,UAGR,gBACI,kBACA,gBACA,mBAEJ,eACI,aACA,sBAGA,8BACI,UAEJ,gCACI,UAIJ,mCACI,YACA,mBAEJ,kCACI,sBAEJ,kCACI,WAEJ,mCACI,WACA,WAEJ,kCACI,WACA,UACA,6BAEJ,kCACI,4BAGR,eACI,OACA,cACA,aACA,uBACA,mBACA,gBACA,6BAEJ,gBACI,kBACA,QACA,oBACA,mBACA,uBACA,4BACA,6BACA,6BACA,UAEJ,eACI,UAEJ,eACI,WAEJ,qBACI,cACA,aACA,uBACA,SAEJ,2BACI,kBACA,SACA,SACA,6BAEJ,oBACI,UACA,WACA,kBACA,cACA,wBACA,YACA,0BACI,WAEJ,uCACI,UAGR,OACI,6BACA,wBACA,kBACA,oBACA,mBACA,uBACA,kBACA,SACA,mBACA,4BACA,6BACA,mBACA,+BACA,6BACA,gBACA,cAEA,oBACI,kBACA,QACA,MACA,UACA,SACA,wBACA,mBACA,+BACA,gBACA,oBAEA,0BACI,0BACA,mBAKJ,gCACI,UACA,wCAKZ,aACI,cAGJ,eACI,gBACA,WAGJ,aACI,gBACA,oBAGJ,WACI,YACA,aACA,cACA,kBACA,8BACA,gDACA,cACA,mBAGJ,eACI,0BACA,0BAGJ,mBACI,wCACA,UAGJ,iBACI,eAEA,uBACI,mCACA,uCAGR,QACI,eACA,SAGA,yBACI,QAEJ,wBACI,eACA,qCACI,2BAGR,6BACI,6BAEJ,8CACI,SACA,yDACI,kBAIZ,sBACI,aACA,4BACA,uBACA,QACA,mBAEJ,qBACI,qBACA,sBAEJ,YACI,OACA,kBACA,aACA,uBACA,cACA,iBACA,sBACA,qBACA,QAEJ,+BACI,aAGA,mCACI,kBACA,0CACI,kBACA,SACA,OACA,QACA,WACA,oCACA,WACA,UAGR,yBACI,QACA,oCACI,8CACA,+BACA,0CACI,4BACA,sCAGR,uCACI,UACA,yBACA,4BACA,0CACA,wCACA,6CACI,+BAKR,yCACI,WACA,MACA,YACA,YACA,gBACA,sCAGA,yDACI,8CACA,+BACA,+DACI,4BACA,qCAGR,4DACI,4BACA,yCACA,kEACI,+BAMpB,WACI,wBACA,kBACA,UACA,aACA,mBACA,uBACA,kBACA,iBACA,cACA,UACA,mBACA,4BACA,iBACI,wBAEJ,wBACI,2BAIJ,4BACI,mBAEJ,+BACI,+BAIJ,2BACI,gBACA,8CACA,wCACI,6CACA,mCAIZ,iBACI,kBACA,UACA,SACA,eACA,UACA,UACA,6BACA,uBACI,mBACA,6BAIJ,kCACI,UAIR,gBACI,kBACA,WACA,OACA,SACA,+BACA,oBACA,6BACA,kBAGA,iCACI,QACA,iDACI,QACA,WACA,aACA,QACA,MAIZ,gBACI,kBACA,OAEJ,eACI,aACA,4BACI,cAGN,QACE,aACA,sBACA,QACA,qBAEF,oBACE,kBACA,cACA,aACA,gBACA,kBACA,eACA,0BACE,YACA,iBACA,OACA,WACA,kBACA,0BAGJ,oBACE,kBACA,aACA,mBACA,UACA,aACA,iBACA,4BACA,gBACA,qBACA,sCACE,oBAEF,mEAEE,+BACA,wBAGJ,cACE,gBAEF,kBACE,aAEF,iBACE,kBAEF,eACE,iBACA,6BACA,sBACA,qBACA,qBACE,qBACA,qCAGJ,qBACE,aACA,gBACA,mDAGA,oCACE,oDACA,kBAEF,mCACE,wBACA,UACA,kDACE,0BAIN,iBACE,sCAEF,sBACE,0BACA,wBACA,4CAEF,qBACE,KACE,6BAGJ,oBACE,oBACA,YACA,8CACE,mBAGJ,qBACE,aAEF,gBACE,cACA,aACA,eACA,SAGA,+CACE,sBAEF,8BACE,iBAGJ,eACE,aACA,eACA,WACA,YACA,iBACA,qBACE,aAGJ,iBACE,UACA,SACA,UACA,eACA,aACA,yBAEF,cACE,kBAEF,mBACE,oBACA,8BACA,+BACA,WACA,cACA,yBACE,UAGJ,eACE,kBACA,oBACA,mBACA,UACA,mBACA,6CACA,4BACA,qCACA,6BACA,eACA,gCACE,kBACA,8BACA,WACA,sCACE,8BACA,WAGJ,qBACE,6CACA,sCACE,UAIN,oBACE,kBACA,aACA,sBACA,mBACA,uBACA,UACA,8BACA,+BACA,4BACA,uCACA,eACA,uDAEE,WACA,YACA,iBAEF,wCACE,eACA,gBACA,mBACA,uBACA,eACA,mBAEF,qCACE,gBACA,kBACA,8BACA,WACA,2CACE,8BACA,WAIF,2CACE,UAIN,eACE,eACA,qBAEF,uBACE,aAEJ,oBACI,kBACA,QACA,gBACA,oBACA,sBACA,eACA,8BACI,kBACA,wBACA,YACA,4CACA,qBACA,kBAEJ,qCACI,UACA,yCAGN,SACE,kBACA,gBACA,4BACA,gBACA,eACE,WACA,YAGJ,kBACE,kBACA,OACA,YACA,QACA,aACA,mBACA,YACA,QACA,eACA,mBACA,iBACA,6BACA,qCACA,4BACA,yBACE,cAEF,0BACE,gBAEF,wBACE,UACA,qBAGJ,yBACE,UACA,oBAEF,iBACE,aACA,mBAEF,eACE,kBACA,aACA,mBACA,QAEF,gBACE,kBACA,UACA,YACA,SACA,+BACA,YACA,UACA,oBACA,4BACA,6BACA,4BACA,qCAEF,wBACE,kBAEE,8CACE,UACA,qBAIR,WACI,UACA,oBACI,gBACA,yBACA,eACA,eACA,+BACA,WACA,YAEJ,gCACI,kBACA,WACA,YAEJ,8BACI,aACA,mBACA,uBACA,WACA,YACA,6BACA,oBACA,sBACA,gCACI,mBAGR,+BACI,eACA,WACA,WACA,SACA,YACA,aACA,mBACA,QACA,qCACA,4BACA,eACA,mBACA,6BACA,qCACI,UAGR,sCACI,UAEJ,8BACI,aACA,sBACA,mBACA,iBACA,6BACA,4BAGN,YACE,4BAEF,qBACE,gCACA,uDACE,oCAGJ,iBACE,4BAEF,mBACE,aACA,8BACA,mBACA,aACA,6BACA,gBACA,4BACA,yBACE,6CAGJ,mBACE,SACA,aACA,iBAEF,oBACE,eACA,SACA,gBACA,6BACA,4BAEF,+DAEE,UAEF,uCACE,aACA,aAEF,qBACE,oBACA,WACA,yCACE,eACA,SACA,gBAGJ,SACE,YACA,UACA,WACA,qBAEF,cACE,kBACA,aACA,eACA,mBACA,kBACA,aACA,mBACA,uBACA,kBACA,qBACA,6BACA,4BACA,eACA,oBACE,qBACA,uCAGJ,oBACE,eAEF,cACE,YACA,iCACE,eAGJ,wCAEE,aACA,qCACA,QAEF,sCAEE,aACA,uBACA,mBAEF,mBACE,qBAEF,mBACE,0BACA,WACA,4BACA,oBACA,6BACA,mBACA,yBACE,UACA,kCAEF,2CACE,WAEF,sCACE,kCAEF,uCACE,gCACA,mCACA,UAEF,yCACE,WACA,mBAGJ,oBACE,mBACA,aACA,mBACA,WACA,qBACA,eAEF,qBACE,kBACA,aACA,qBACA,UACA,oBACA,iBACA,4BACA,0BACE,mBACA,iBAEF,2BACE,+BAGJ,mBACE,kBACA,WACA,oBAEF,iBACE,kBACA,QACA,UACA,YACA,SACA,6BACA,4BACA,aACA,oBACA,UACA,6BACA,qCACE,UACA,qBAGJ,oBACE,UACA,kBACA,aACA,sBACA,gBACA,UAEF,qBACE,iBACA,OACA,aACA,qCACA,UAEF,mBACE,OAEF,uCAEE,aACA,YACA,iBACA,4BACA,uBACA,mBACA,mDACE,6CAEF,+EACE,6BACA,gCACA,UAGJ,oBACE,kBACA,QACA,MAIJ,sBACI,kBACA,oBACA,mBACA,eACA,UAEJ,sBACI,qBACA,YACA,aACA,gCACA,4BACA,eACA,6BACA,4BACI,4BAGR,sBACI,aACA,QACA,eAEJ,oBACI,6BACA,eACA,mBACA,4BACA,0BACA,0BACI,0BAGR,uBACI,gBACA,mBAEF,oBACE,eAEF,cACE,aAEF,mBACE,cACA,kBACA,cACA,YACA,kBACA,aACA,sBACA,QACA,qBACA,sCACE,aAEF,oCACE,sCAGJ,mBACE,cACA,mBACA,4BACA,WACA,yBACE,gCACA,UAEF,4CACE,gBACA,MACA,SACA,UACA,6BACA,gCACA,UAGJ,mBACE,kBACA,WACA","file":"index.css"}
1
+ {"version":3,"sourceRoot":"","sources":["stdin"],"names":[],"mappings":"AAoBQ,sBACA,qBACA,qBACA,sBACA,yBA4iFA,qDApkFR,oBACI,kBACA,QACA,gBACA,oBACA,sBACA,eACA,8BACI,kBACA,wBACA,YACA,4CACA,qBACA,kBAEJ,qCACI,UACA,yCAQN,SACE,eACA,WACA,aACA,sBACA,SACA,6BAGA,+BACE,UAGJ,QACE,yBACA,aACA,sBACA,uCACA,4BACA,4BACA,cAEF,iBACE,gCAEF,eACE,aACA,mBACA,4BACA,UAEF,gBACE,OAEF,eACE,gBACA,aACA,mBACA,4BACA,UAEJ,WACI,UACA,oBACI,gBACA,yBACA,eACA,eACA,+BACA,WACA,YAEJ,gCACI,kBACA,WACA,YAEJ,8BACI,aACA,mBACA,uBACA,WACA,YACA,6BACA,oBACA,sBACA,gCACI,mBAGR,+BACI,eACA,WACA,WACA,SACA,YACA,aACA,mBACA,QACA,qCACA,4BACA,eACA,mBACA,6BACA,qCACI,UAGR,sCACI,UAEJ,8BACI,aACA,sBACA,mBACA,iBACA,6BACA,4BAGN,SACE,kBACA,oBACA,kBACA,cACA,4BAEF,iBACE,kBACA,UACA,oBACA,kBACA,oBACA,wCACA,sBACA,qCACA,4BACA,yBACA,gBACA,oBACA,6BACE,WACA,UACA,UACA,kBACA,gBACA,oBAEF,uDAEE,wCAGN,OACI,cACA,gCACA,wCACA,mCACA,kBACA,oBACA,mBACA,uBACA,eACA,eACA,cACA,4BACA,+BACA,6BACA,iBACA,eACA,mBACA,aACA,gBACA,gBACA,6BACA,mBACA,cACA,cAEA,2BACI,WAIR,cACI,gBAGJ,sBACI,oBACA,eACA,mBACA,qBAEA,0CACI,6BACA,eAIR,aACI,WAGJ,aACI,iBAGJ,eACI,cACA,WAGJ,aACI,WACA,cACA,gBACA,eAGJ,YACI,cACA,aACA,eACA,eAGJ,cACI,UACA,aAEA,sDAEI,UAIR,aACI,sCACA,uDAGJ,iBACI,wCACA,kCACA,2BACA,mCAGJ,YACI,wCACA,0BACA,2BACA,mCAGJ,eACI,wCACA,2BACA,mCAEA,qBACI,0BACA,0BAIR,gFAGI,sCAGJ,eACI,iBAGJ,eACI,aACA,eAGJ,uBACI,aAGI,gDACI,yBACA,4BAGJ,+CACI,0BACA,6BAKZ,sBACI,aACA,sBAGI,+CACI,yBACA,0BAGJ,8CACI,6BACA,4BAIV,eACE,aAEF,oBACE,aACA,SAEF,6BACE,sBAEF,qBACE,cACA,qCACA,qBAEF,qBACE,OAEF,YACE,4BAEF,qBACE,gCACA,uDACE,oCAGJ,iBACE,4BAEF,mBACE,aACA,8BACA,mBACA,aACA,6BACA,gBACA,4BACA,yBACE,6CAGJ,mBACE,SACA,aACA,iBAEF,oBACE,eACA,SACA,gBACA,6BACA,4BAEF,+DAEE,UAEF,uCACE,aACA,aAEF,qBACE,oBACA,WACA,yCACE,eACA,SACA,gBAGJ,oBACE,aACA,sBACA,gBACA,YACA,QACA,kBACA,sBAEJ,eACI,kBACA,aACA,eACA,qBACA,yBACA,SACA,WACA,eACA,4BAEA,qCACI,sBAGJ,qCACI,uBAGJ,mCACI,sBAIR,gBACI,iBAEA,+FAGI,cAGJ,iCACI,kBACA,UACA,WACA,kBACA,qCACA,4BAIR,oBACI,4BACA,8BACA,sBACA,gBACA,oBAGJ,cACI,0BACA,kEACA,cACA,aACA,qBACA,6BACA,sBACA,mEACA,eAEA,qBACI,mBAGJ,2EAGI,4BACA,+BAGJ,8BACI,4BAGJ,8BACI,6BAGJ,4BACI,4BAIR,oBACI,2BACA,uCAGJ,mBACI,6CACA,gBACA,yCACA,yBAGJ,SACI,uBACA,OACA,WACA,cACA,aACA,6BACA,yBACA,sBACA,mBAEA,kGAEI,wBAGJ,mBACI,0BAGJ,wBACI,iBAGJ,kBACI,uCACA,mBAIR,iBACI,wBACA,cACA,kBACA,UACA,eACA,mBACA,4BACA,oBAGJ,iBACI,sBAGJ,iBACI,uBAGJ,eACI,sBAGJ,YACI,cACA,WACI,qCAGJ,eACA,kBAGJ,iCAEI,wCACA,aACA,mBACA,mBAEA,+CACI,sBACA,aAIR,iBACI,eACA,+BACA,kCAGJ,gBACI,cACA,gCACA,mCAIA,iEAEI,cAIR,gBACI,kBACA,uBACA,iBAEJ,UACI,aACA,sBACA,kBAGI,wJAEI,4BAIZ,qBACI,4BACA,+EAEI,YAGR,mBACI,aACA,QACA,gCACA,gBACA,YACA,8CACA,6BACA,0BACI,wBACA,gCACI,sBACA,sDACI,UAKhB,sBACI,kBACA,UACA,SACA,SACA,6BACA,UACA,YACA,kBACA,cACA,oBACA,6BACA,4BAEJ,kBACI,OACA,aACA,uBACA,gCACA,8CACA,6BACA,cACA,qBACA,qBACA,qBACA,aACA,8BACI,4BAEJ,gDAEI,4BAEJ,oBACI,kBAEJ,sBACI,SAEJ,+BACI,+BACA,qBAIR,kBACI,aACA,eACA,YACA,gBACA,gBACA,4BACA,qCACA,yBACA,4BACA,cACA,+BACI,qBAEJ,sCACI,wBAIR,eACI,oBACA,mBACA,eACA,wBACA,iBAEF,QACE,aACA,eAEF,eACE,uBACA,8BACE,iBAGJ,MACE,sBAEF,sBACI,4BACA,cAGJ,oBACI,2BACA,iBAEA,gCACI,gBACA,eAGJ,yCACI,kBACA,QACA,WACA,qCACA,0BAIR,YACI,aACA,gBACA,wBACA,kBACA,mDACA,6CACA,eAEA,qBACI,gBACA,iBAIR,qBACI,wCACA,+CAEA,sCACI,+CAKJ,oCACI,wCAEA,mDACI,yDAKZ,4BACI,sDACA,iBAEA,kCACI,wCACA,wDAEA,mDACI,UAGJ,oEACI,UAKZ,iBACI,gBACA,aACA,mBACA,wCACA,QACA,4BACA,2CACA,iCACA,gBACA,4BAGJ,kCACI,UAGJ,6BACI,qCAGJ,4BACI,oCAGJ,yBACI,YACA,cACA,gBACA,YACA,wBACA,mBACA,gBAGJ,kCACI,cACA,uBACA,mCAIA,oCACI,wDACA,UACA,mBACA,uBACA,cACA,iBACA,4BAGJ,qDACI,UAIR,oBACI,kBACA,iBACA,UACA,gBACA,iBAEA,0BACI,gCAIR,uBACI,eAEA,6BACI,2CAIR,mBACI,aACA,sBACA,cACA,WACA,gBACA,qBAIA,qCACI,qBACA,yBAGJ,oCACI,wBAKJ,4DACI,wBAKJ,4DACI,wBAEP,mBACC,eACA,QACA,YACA,oBACA,iCACA,0BACA,6BACA,UACA,aAEA,4BACI,UACA,qBAIR,UACI,kBACA,aACA,sBACA,eACA,gBACA,cACA,yBACA,6BACA,6BACA,4BAGJ,eACI,iBACA,mCAGJ,cACI,eACA,mCAGJ,gBACI,iBACA,kCAGJ,iBACI,eACA,kCAGJ,oBACI,UACA,eACA,qBAGJ,kCAEI,aACA,mBACA,aAEA,8CACI,aAIR,kBACI,OACA,kBAGJ,gBACI,kBACA,aACA,sBACA,4BAEJ,SACI,kBACA,oBACA,mBACA,uBACA,kBACA,4BACA,gBACA,sBACA,qCACA,4BACA,cACA,8BACI,UACA,4BAEJ,aACI,sBACA,WACA,YACA,iBAGR,eACI,kBACA,QACA,aACA,mBACA,uBACA,4BACA,qCAEJ,qBACI,aACA,sBACA,uBACA,mBACA,SACA,kBACA,wBACA,sBACA,0BAGJ,gBACI,oBACA,UACA,WACA,0CAEJ,QACI,aACA,cAEJ,aACI,aACA,eACA,uBACA,6BACA,4BAEJ,sBACI,0CACA,4CACI,gBAEJ,wCACI,yBACA,0BAEJ,uCACI,6BACA,4BAEJ,4BACI,0CACA,UAGR,eACI,kBACA,eACA,iBACA,mBACA,8BACA,qBACI,6CAEJ,kCACI,qCAGR,mBACI,sBAEJ,YACI,eACA,WACA,oBACA,aACA,sBACA,uBACA,cACA,6BACA,eAGJ,WACI,kBACA,mBACA,mBACA,UACA,6BACA,sDACA,qCACA,4BACA,yBACA,4BAEA,4BACI,UACA,0BAGN,cACE,aAEF,qBACE,gBAEJ,mBACI,eACA,QACA,YACA,aACA,6BACA,UACA,oBACA,aACA,gBACA,kCACI,UAGR,kBACI,iCACA,0BACA,iCACI,qBAGR,oBACI,eAEJ,SACI,kBACA,aACA,sBACA,YACA,eACA,gBACA,kBACA,4BACA,6BACA,6BACA,6BACA,iBACI,oCAGR,yBACI,UACA,eACA,mBAEJ,gCAEI,kBACA,aACA,mBACA,aACA,SACA,4CACI,aAGR,kBACI,iBAEJ,gBACI,uBAEJ,iBACI,kBACA,OACA,gBACA,gBAGA,wBACI,kBACA,aACA,sBACA,4BAGN,SACI,kBACA,YACA,UACA,oBACA,uCACA,4BACA,6BACA,yBACA,4BAGJ,eACI,kBACA,UACA,YACA,oBACA,YACA,oBAEA,oBACI,uBAEL,SACD,kBACA,oBACA,eACA,QAEF,eACE,yBACA,8BACA,gBAEF,cACE,oBACA,qBACA,4BAEE,mCACE,0CACA,qCAKJ,oCACE,QACA,SAGJ,gCACE,0CAEF,gCACE,2CAEF,8BACE,0CAEF,iBACE,cACA,kBACA,aACA,eACA,WACA,oBAEF,wBACE,UAEF,cACE,oBACA,iBACA,6BACA,iBACA,sBACA,qBAEF,eACE,kBACA,aACA,eACA,eACA,cACA,cACA,gBACA,gBACA,kBACA,oBACA,UACA,kBACA,0CAEF,iBACE,6BAGA,uCACE,kBACA,+BACA,qCACA,gBACA,qDACE,wBAIN,wBACE,qBAEF,gBACE,aACA,8BACE,cACA,iBACA,gBACA,gBACA,mBACA,kCACA,oCACE,qCACA,4BAGJ,sCACE,+BACA,wBACA,+BAGJ,iBACE,gBACA,eACA,sBACA,oBAGA,gCACE,4CAEF,kCACE,qBAIF,gCACE,4CAEF,kCACE,qBAIF,8BACE,0CAEF,gCACE,mBAGJ,YACE,cACA,kBACA,aACA,+BACA,4BACA,eAEF,qBACE,YACA,qCACE,YACA,oBAGJ,gBACE,kBACA,WACA,6BACA,4BACA,sBACA,6BAEF,mBACE,kBACA,QACA,QACA,aACA,gBACA,cACA,wCACA,6BACA,sBACA,yBACA,iBACA,gBAEF,uEAEE,wCAEF,mBACE,kBAEF,wBACE,6BACA,mBAEF,yBACE,kBACA,SACA,QACA,gCACA,gBAEF,aACE,aACA,gBAEF,sBACE,sBACA,wCACE,iBACA,WACA,WAGJ,eACE,cAEF,eACE,OACA,cAEF,kBACE,kBACA,aACA,uBACA,mBACA,UACA,YACA,0BACA,iBACA,6BACA,kBACA,iBACA,+DAEE,iCACA,6GACE,UAIN,uBACE,aACA,kBACA,UACA,oBACA,UACA,6BACA,mBACA,4BACA,eAEF,SACE,gBAEF,eACE,oBACA,sBAEF,cACE,cAEF,UACI,aACA,SAGJ,mBACI,eACA,qBAEA,0BACI,kBACA,eACA,oBACA,uCAIR,kBACI,cACA,aACA,sBACA,gBACA,YACA,QACA,kBACA,sBAEA,+BACI,sBACA,mBACA,qBAEA,kDACI,wBACA,+BAEA,yEACI,UAIR,wCACI,oBAOJ,2DACI,yBAKZ,uBACI,UAGJ,iBACI,gBACA,MACA,UACA,aACA,eACA,qCACA,4BACA,oDAEA,uBACI,aAEL,iBACD,sCAEF,sBACE,0BACA,wBACA,4CAEF,qBACE,KACE,6BAGN,QACI,eACA,SAGA,yBACI,QAEJ,wBACI,eACA,qCACI,2BAGR,6BACI,6BAEJ,8CACI,SACA,yDACI,kBAIZ,sBACI,aACA,4BACA,uBACA,QACA,mBAEJ,qBACI,qBACA,sBAEJ,YACI,OACA,kBACA,aACA,uBACA,cACA,iBACA,sBACA,qBACA,QAEJ,+BACI,aAGA,mCACI,kBACA,0CACI,kBACA,SACA,OACA,QACA,WACA,oCACA,WACA,UAGR,yBACI,QACA,oCACI,8CACA,+BACA,0CACI,4BACA,sCAGR,uCACI,UACA,yBACA,4BACA,0CACA,wCACA,6CACI,+BAKR,yCACI,WACA,MACA,YACA,YACA,gBACA,sCAGA,yDACI,8CACA,+BACA,+DACI,4BACA,qCAGR,4DACI,4BACA,yCACA,kEACI,+BAMpB,WACI,wBACA,kBACA,UACA,aACA,mBACA,uBACA,kBACA,iBACA,cACA,UACA,mBACA,4BACA,iBACI,wBAEJ,wBACI,2BAIJ,4BACI,mBAEJ,+BACI,+BAIJ,2BACI,gBACA,8CACA,wCACI,6CACA,mCAIZ,iBACI,kBACA,UACA,SACA,eACA,UACA,UACA,6BACA,uBACI,mBACA,6BAIJ,kCACI,UAIR,gBACI,kBACA,WACA,OACA,SACA,+BACA,oBACA,6BACA,kBAGA,iCACI,QACA,iDACI,QACA,WACA,aACA,QACA,MAIZ,gBACI,kBACA,OAEJ,eACI,aACA,4BACI,cAGR,OACI,6BACA,wBACA,kBACA,oBACA,mBACA,uBACA,kBACA,SACA,mBACA,4BACA,6BACA,mBACA,+BACA,6BACA,gBACA,cAEA,oBACI,kBACA,QACA,MACA,UACA,SACA,wBACA,mBACA,+BACA,gBACA,oBAEA,0BACI,0BACA,mBAKJ,gCACI,UACA,wCAKZ,aACI,cAGJ,eACI,gBACA,WAGJ,aACI,gBACA,oBAGJ,WACI,YACA,aACA,cACA,kBACA,8BACA,gDACA,cACA,mBAGJ,eACI,0BACA,0BAGJ,mBACI,wCACA,UAGJ,iBACI,eAEA,uBACI,mCACA,uCAGR,UACI,kBACA,eACA,iBAEI,gCACI,YAGR,gCACI,UAGR,gBACI,kBACA,gBACA,mBAEJ,eACI,aACA,sBAGA,8BACI,UAEJ,gCACI,UAIJ,mCACI,YACA,mBAEJ,kCACI,sBAEJ,kCACI,WAEJ,mCACI,WACA,WAEJ,kCACI,WACA,UACA,6BAEJ,kCACI,4BAGR,eACI,OACA,cACA,aACA,uBACA,mBACA,gBACA,6BAEJ,gBACI,kBACA,QACA,oBACA,mBACA,uBACA,4BACA,6BACA,6BACA,UAEJ,eACI,UAEJ,eACI,WAEJ,qBACI,cACA,aACA,uBACA,SAEJ,2BACI,kBACA,SACA,SACA,6BAEJ,oBACI,UACA,WACA,kBACA,cACA,wBACA,YACA,0BACI,WAEJ,uCACI,UAGN,QACE,aACA,eACA,SACA,gBAEF,iBACE,sBACA,8BACE,mBAEE,kEACE,mBAKR,aACE,aACA,sBACA,SACA,cACA,6BACA,wBACE,UACA,wCACE,aAGJ,kCACE,WACA,kDACE,mBAGJ,iCACE,WAEF,mBACE,UAGJ,mBACE,aACA,mBACA,uBACA,cACA,YACA,kBACA,oBACA,0BACA,wBAEF,gBACE,OACA,kBACA,iCAEF,mBACE,aACA,mBACA,SACA,mBAEF,kBACE,aACA,sBACA,mBACA,SAEF,mBACE,aACA,sBACA,SAEF,QACE,aACA,sBACA,QACA,qBAEF,oBACE,kBACA,cACA,aACA,gBACA,kBACA,eACA,0BACE,YACA,iBACA,OACA,WACA,kBACA,0BAGJ,oBACE,kBACA,aACA,mBACA,UACA,aACA,iBACA,4BACA,gBACA,qBACA,sCACE,oBAEF,mEAEE,+BACA,wBAGJ,cACE,gBAEF,kBACE,aAEF,iBACE,kBAEF,eACE,iBACA,6BACA,sBACA,qBACA,qBACE,qBACA,qCAGJ,qBACE,aACA,gBACA,mDAGA,oCACE,oDACA,kBAEF,mCACE,wBACA,UACA,kDACE,0BAIN,oBACE,oBACA,YACA,8CACE,mBAGJ,qBACE,aAEF,gBACE,cACA,aACA,eACA,SAGA,+CACE,sBAEF,8BACE,iBAGJ,eACE,aACA,eACA,WACA,YACA,iBACA,qBACE,aAGJ,iBACE,UACA,SACA,UACA,eACA,aACA,yBAEF,cACE,kBAEF,mBACE,oBACA,8BACA,+BACA,WACA,cACA,yBACE,UAGJ,eACE,kBACA,oBACA,mBACA,UACA,mBACA,6CACA,4BACA,qCACA,6BACA,eACA,gCACE,kBACA,8BACA,WACA,sCACE,8BACA,WAGJ,qBACE,6CACA,sCACE,UAIN,oBACE,kBACA,aACA,sBACA,mBACA,uBACA,UACA,8BACA,+BACA,4BACA,uCACA,eACA,uDAEE,WACA,YACA,iBAEF,wCACE,eACA,gBACA,mBACA,uBACA,eACA,mBAEF,qCACE,gBACA,kBACA,8BACA,WACA,2CACE,8BACA,WAIF,2CACE,UAIN,eACE,eACA,qBAEF,uBACE,aAEF,SACE,kBACA,gBACA,4BACA,gBACA,eACE,WACA,YAGJ,kBACE,kBACA,OACA,YACA,QACA,aACA,mBACA,YACA,QACA,eACA,mBACA,iBACA,6BACA,qCACA,4BACA,yBACE,cAEF,0BACE,gBAEF,wBACE,UACA,qBAGJ,yBACE,UACA,oBAEF,iBACE,aACA,mBAEF,eACE,kBACA,aACA,mBACA,QAEF,gBACE,kBACA,UACA,YACA,SACA,+BACA,YACA,UACA,oBACA,4BACA,6BACA,4BACA,qCAEF,wBACE,kBAEE,8CACE,UACA,qBAIN,YACE,QAEF,iBACE,oBACA,qBACA,UACA,4BACA,sBAEE,yCACE,0CAEF,0CACE,0CAEF,0CACE,gBAIF,2CACE,gBAIN,oBACE,cACA,kBACA,aACA,eACA,WACA,oBAEF,iBACE,oBACA,6BACA,iBACA,sBACA,qBACA,uBACE,aAGJ,kBACE,kBACA,aACA,eACA,eACA,cACA,gBACA,gBACA,sBACA,6BACA,UACA,kBAEF,mBACE,QACA,SAEF,mBACE,eACA,YACA,eACA,oBACA,0CACA,0BAEE,+BACE,oCACA,qCAIN,oBACE,kBACA,0CAEF,mBACE,aAEF,sGAIE,YACA,kBACA,6BAEF,0BACE,SACA,QACA,WACA,UACA,kDACA,iDACA,iCACA,kBAGA,yBACE,OACA,QACA,UACA,WACA,6BACA,oCACA,kBACA,6BACA,mCAGA,gCACE,YAEF,wCACE,YAKJ,6CACE,mCACA,mDACE,wBAGJ,4CACE,mCACA,kDACE,uCACA,iCACA,mCAGJ,2CACE,wBAIF,oCACE,cACA,gBACA,eACA,aACA,mBACA,mBACA,kBACA,kCAEF,0CACE,gCACA,4BAEF,4CACE,qCACA,wBACA,+BAGJ,mBACE,kBACA,mCACA,yBACE,2CACA,WACA,WACA,SACA,QACA,gCACA,4BAGJ,oBACE,gBACA,eACA,sBACA,oBAGA,sCACE,4CACA,8CACE,kCAGJ,wCACE,qBAIF,sCACE,4CACA,8CACE,kCAGJ,wCACE,qBAIF,oCACE,0CACA,4CACE,gCAGJ,sCACE,mBAGN,cACI,aACA,mBACA,SAEJ,QACI,0BACA,wBACA,kBACA,oBACA,mBACA,uBACA,gBACA,cACA,iBACA,4BACA,+BACA,6BACA,iBACA,eACA,mBACA,aACA,mBACA,6BACA,4BACI,WAEJ,6BACI,kBACA,QACA,UACA,qCACA,4BAEJ,cACI,0CAEJ,sBACI,gCACA,mCACA,eAEJ,uBACI,oBACA,eAGN,cACE,kBACA,aACA,eACA,mBACA,kBACA,aACA,mBACA,uBACA,kBACA,qBACA,6BACA,4BACA,eACA,oBACE,qBACA,uCAGJ,oBACE,eAEF,cACE,aAEF,mBACE,cACA,kBACA,cACA,YACA,kBACA,aACA,sBACA,QACA,qBACA,sCACE,aAEF,oCACE,sCAGJ,mBACE,cACA,mBACA,4BACA,WACA,yBACE,gCACA,UAEF,4CACE,gBACA,MACA,SACA,UACA,6BACA,gCACA,UAGJ,mBACE,kBACA,WACA,oBAEF,SACE,YACA,UACA,WACA,qBAIJ,sBACI,kBACA,oBACA,mBACA,eACA,UAEJ,sBACI,qBACA,YACA,aACA,gCACA,4BACA,eACA,6BACA,4BACI,4BAGR,sBACI,aACA,QACA,eAEJ,oBACI,6BACA,eACA,mBACA,4BACA,0BACA,0BACI,0BAGR,uBACI,gBACA,mBAEF,oBACE,eAEF,cACE,YACA,iCACE,eAGJ,wCAEE,aACA,qCACA,QAEF,sCAEE,aACA,uBACA,mBAEF,mBACE,qBAEF,mBACE,0BACA,WACA,4BACA,oBACA,6BACA,mBACA,yBACE,UACA,kCAEF,2CACE,WAEF,sCACE,kCAEF,uCACE,gCACA,mCACA,UAEF,yCACE,WACA,mBAGJ,oBACE,mBACA,aACA,mBACA,WACA,qBACA,eAEF,qBACE,kBACA,aACA,qBACA,UACA,oBACA,iBACA,4BACA,0BACE,mBACA,iBAEF,2BACE,+BAGJ,mBACE,kBACA,WACA,oBAEF,iBACE,kBACA,QACA,UACA,YACA,SACA,6BACA,4BACA,aACA,oBACA,UACA,6BACA,qCACE,UACA,qBAGJ,oBACE,UACA,kBACA,aACA,sBACA,gBACA,UAEF,qBACE,iBACA,OACA,aACA,qCACA,UAEF,mBACE,OAEF,uCAEE,aACA,YACA,iBACA,4BACA,uBACA,mBACA,mDACE,6CAEF,+EACE,6BACA,gCACA,UAGJ,oBACE,kBACA,QACA","file":"index.css"}
@@ -1,6 +1,5 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
2
  import { ClearAllRound, UndoRound, RedoRound, StrikethroughSRound, FormatUnderlinedRound, FormatItalicRound, FormatBoldRound } from '@ricons/material';
3
- import { escapeAttrValue } from 'xss';
4
3
  import Button from '../button/button.js';
5
4
  import Icon from '../icon/icon.js';
6
5
 
@@ -9,13 +8,18 @@ const exec = (a, b, c) => {
9
8
  return;
10
9
  return document.execCommand(a, b, c);
11
10
  };
11
+ const escapeHtmlAttr = (value) => value
12
+ .replaceAll("&", "&amp;")
13
+ .replaceAll('"', "&quot;")
14
+ .replaceAll("<", "&lt;")
15
+ .replaceAll(">", "&gt;");
12
16
  const xssOptions = {
13
17
  onIgnoreTagAttr(tag, name, value) {
14
18
  if (["class", "contenteditable"].includes(name)) {
15
- return name + '="' + escapeAttrValue(value) + '"';
19
+ return name + '="' + escapeHtmlAttr(value) + '"';
16
20
  }
17
21
  if (["data-", "style"].includes(name.substring(0, 5))) {
18
- return name + '="' + escapeAttrValue(value) + '"';
22
+ return name + '="' + escapeHtmlAttr(value) + '"';
19
23
  }
20
24
  },
21
25
  };
@@ -1 +1 @@
1
- {"version":3,"file":"controls.js","sources":["../../../../packages/components/editor/controls.tsx"],"sourcesContent":["import {\r\n ClearAllRound,\r\n FormatBoldRound,\r\n FormatItalicRound,\r\n FormatUnderlinedRound,\r\n RedoRound,\r\n StrikethroughSRound,\r\n UndoRound,\r\n} from \"@ricons/material\";\r\nimport { MouseEvent, ReactNode } from \"react\";\r\nimport { escapeAttrValue, type IFilterXSSOptions } from \"xss\";\r\nimport Button from \"../button\";\r\nimport { IButton } from \"../button/type\";\r\nimport Icon from \"../icon\";\r\nimport { IEditorAddtionControl } from \"./type\";\r\n\r\nexport const exec = (a, b?, c?) => {\r\n if (typeof document === \"undefined\") return;\r\n return document.execCommand(a, b, c);\r\n};\r\n\r\nexport const xssOptions: IFilterXSSOptions = {\r\n onIgnoreTagAttr(tag, name, value) {\r\n if ([\"class\", \"contenteditable\"].includes(name)) {\r\n return name + '=\"' + escapeAttrValue(value) + '\"';\r\n }\r\n if ([\"data-\", \"style\"].includes(name.substring(0, 5))) {\r\n return name + '=\"' + escapeAttrValue(value) + '\"';\r\n }\r\n },\r\n};\r\n\r\nconst handleMouseDown = (e: MouseEvent<HTMLElement>) => {\r\n e.preventDefault();\r\n};\r\n\r\nconst fnMap = {\r\n bold: {\r\n icon: <FormatBoldRound />,\r\n onClick: () => exec(\"bold\"),\r\n },\r\n italic: {\r\n icon: <FormatItalicRound />,\r\n onClick: () => exec(\"italic\"),\r\n },\r\n underline: {\r\n icon: <FormatUnderlinedRound />,\r\n onClick: () => exec(\"underline\"),\r\n },\r\n strike: {\r\n icon: <StrikethroughSRound />,\r\n onClick: () => exec(\"strikeThrough\"),\r\n },\r\n redo: {\r\n icon: <RedoRound />,\r\n onClick: () => exec(\"redo\"),\r\n },\r\n undo: {\r\n icon: <UndoRound />,\r\n onClick: () => exec(\"undo\"),\r\n },\r\n clear: {\r\n icon: <ClearAllRound />,\r\n onClick: () => exec(\"removeFormat\"),\r\n },\r\n};\r\n\r\nconst defaultKeys = [\r\n \"undo\",\r\n \"redo\",\r\n \"bold\",\r\n \"italic\",\r\n \"underline\",\r\n \"strike\",\r\n \"clear\",\r\n] as const;\r\n\r\ntype ControlKey = (typeof defaultKeys)[number];\r\ntype ControlItem = {\r\n icon: ReactNode;\r\n onClick: () => void;\r\n};\r\n\r\nconst typedFnMap: Record<ControlKey, ControlItem> = fnMap;\r\n\r\nexport default function getControls(options: {\r\n controlBtnProps: IButton;\r\n addtionControls?: IEditorAddtionControl[];\r\n getSelection: () => Range | null;\r\n}) {\r\n const { controlBtnProps, addtionControls, getSelection } = options;\r\n\r\n const controls = defaultKeys.map((k) => {\r\n const { icon, onClick } = typedFnMap[k];\r\n\r\n return (\r\n <Button\r\n key={k}\r\n {...controlBtnProps}\r\n onMouseDown={handleMouseDown}\r\n onClick={onClick}\r\n >\r\n <Icon icon={icon} />\r\n </Button>\r\n );\r\n });\r\n\r\n const extControls = (addtionControls ?? []).map((item, index) => (\r\n <Button\r\n key={`addtion-${index}`}\r\n {...controlBtnProps}\r\n onMouseDown={handleMouseDown}\r\n onClick={(e) => item.onClick?.(getSelection(), e)}\r\n >\r\n {item.icon}\r\n </Button>\r\n ));\r\n\r\n return [...controls, ...extControls];\r\n}\r\n"],"names":["_jsx"],"mappings":"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"}
1
+ {"version":3,"file":"controls.js","sources":["../../../../packages/components/editor/controls.tsx"],"sourcesContent":["import {\r\n ClearAllRound,\r\n FormatBoldRound,\r\n FormatItalicRound,\r\n FormatUnderlinedRound,\r\n RedoRound,\r\n StrikethroughSRound,\r\n UndoRound,\r\n} from \"@ricons/material\";\r\nimport { MouseEvent, ReactNode } from \"react\";\r\nimport { type IFilterXSSOptions } from \"xss\";\r\nimport Button from \"../button\";\r\nimport { IButton } from \"../button/type\";\r\nimport Icon from \"../icon\";\r\nimport { IEditorAddtionControl } from \"./type\";\r\n\r\nexport const exec = (a, b?, c?) => {\r\n if (typeof document === \"undefined\") return;\r\n return document.execCommand(a, b, c);\r\n};\r\n\r\nconst escapeHtmlAttr = (value: string) =>\r\n value\r\n .replaceAll(\"&\", \"&amp;\")\r\n .replaceAll('\"', \"&quot;\")\r\n .replaceAll(\"<\", \"&lt;\")\r\n .replaceAll(\">\", \"&gt;\");\r\n\r\nexport const xssOptions: IFilterXSSOptions = {\r\n onIgnoreTagAttr(tag, name, value) {\r\n if ([\"class\", \"contenteditable\"].includes(name)) {\r\n return name + '=\"' + escapeHtmlAttr(value) + '\"';\r\n }\r\n if ([\"data-\", \"style\"].includes(name.substring(0, 5))) {\r\n return name + '=\"' + escapeHtmlAttr(value) + '\"';\r\n }\r\n },\r\n};\r\n\r\nconst handleMouseDown = (e: MouseEvent<HTMLElement>) => {\r\n e.preventDefault();\r\n};\r\n\r\nconst fnMap = {\r\n bold: {\r\n icon: <FormatBoldRound />,\r\n onClick: () => exec(\"bold\"),\r\n },\r\n italic: {\r\n icon: <FormatItalicRound />,\r\n onClick: () => exec(\"italic\"),\r\n },\r\n underline: {\r\n icon: <FormatUnderlinedRound />,\r\n onClick: () => exec(\"underline\"),\r\n },\r\n strike: {\r\n icon: <StrikethroughSRound />,\r\n onClick: () => exec(\"strikeThrough\"),\r\n },\r\n redo: {\r\n icon: <RedoRound />,\r\n onClick: () => exec(\"redo\"),\r\n },\r\n undo: {\r\n icon: <UndoRound />,\r\n onClick: () => exec(\"undo\"),\r\n },\r\n clear: {\r\n icon: <ClearAllRound />,\r\n onClick: () => exec(\"removeFormat\"),\r\n },\r\n};\r\n\r\nconst defaultKeys = [\r\n \"undo\",\r\n \"redo\",\r\n \"bold\",\r\n \"italic\",\r\n \"underline\",\r\n \"strike\",\r\n \"clear\",\r\n] as const;\r\n\r\ntype ControlKey = (typeof defaultKeys)[number];\r\ntype ControlItem = {\r\n icon: ReactNode;\r\n onClick: () => void;\r\n};\r\n\r\nconst typedFnMap: Record<ControlKey, ControlItem> = fnMap;\r\n\r\nexport default function getControls(options: {\r\n controlBtnProps: IButton;\r\n addtionControls?: IEditorAddtionControl[];\r\n getSelection: () => Range | null;\r\n}) {\r\n const { controlBtnProps, addtionControls, getSelection } = options;\r\n\r\n const controls = defaultKeys.map((k) => {\r\n const { icon, onClick } = typedFnMap[k];\r\n\r\n return (\r\n <Button\r\n key={k}\r\n {...controlBtnProps}\r\n onMouseDown={handleMouseDown}\r\n onClick={onClick}\r\n >\r\n <Icon icon={icon} />\r\n </Button>\r\n );\r\n });\r\n\r\n const extControls = (addtionControls ?? []).map((item, index) => (\r\n <Button\r\n key={`addtion-${index}`}\r\n {...controlBtnProps}\r\n onMouseDown={handleMouseDown}\r\n onClick={(e) => item.onClick?.(getSelection(), e)}\r\n >\r\n {item.icon}\r\n </Button>\r\n ));\r\n\r\n return [...controls, ...extControls];\r\n}\r\n"],"names":["_jsx"],"mappings":"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"}
@@ -1,10 +1,14 @@
1
1
  import { jsx, Fragment } from 'react/jsx-runtime';
2
2
  import { memo } from 'react';
3
3
  import { renderToStaticMarkup } from 'react-dom/server';
4
- import { escapeAttrValue } from 'xss';
5
4
  import List from '../list/list.js';
6
5
 
7
6
  const MEMTION_TAG_CLASS_NAME = "i-memtion-tag";
7
+ const escapeHtmlAttr = (value) => value
8
+ .replaceAll("&", "&amp;")
9
+ .replaceAll('"', "&quot;")
10
+ .replaceAll("<", "&lt;")
11
+ .replaceAll(">", "&gt;");
8
12
  const getInsertNode = (memtion, option) => memtion?.insert?.(option) ?? option.value;
9
13
  const getInsertText = (memtion, option) => {
10
14
  const nextNode = getInsertNode(memtion, option);
@@ -19,7 +23,7 @@ const getInsertHtml = (memtion, option, sanitizeValue) => {
19
23
  return "";
20
24
  }
21
25
  const content = sanitizeValue(renderToStaticMarkup(jsx(Fragment, { children: nextNode })));
22
- return `<span class="${MEMTION_TAG_CLASS_NAME}" contenteditable="false" data-memtion-value="${escapeAttrValue(String(option.value))}">${content}</span>`;
26
+ return `<span class="${MEMTION_TAG_CLASS_NAME}" contenteditable="false" data-memtion-value="${escapeHtmlAttr(String(option.value))}">${content}</span>`;
23
27
  };
24
28
  const getSelectionRect = (range) => {
25
29
  if (!range)
@@ -1 +1 @@
1
- {"version":3,"file":"memtion.js","sources":["../../../../packages/components/editor/memtion.tsx"],"sourcesContent":["import { memo, ReactNode } from \"react\";\r\nimport { renderToStaticMarkup } from \"react-dom/server\";\r\nimport { escapeAttrValue } from \"xss\";\r\nimport List from \"../list\";\r\nimport { IEditorMemtion, IEditorMemtionOption } from \"./type\";\r\n\r\nexport const MEMTION_TAG_CLASS_NAME = \"i-memtion-tag\";\r\n\r\ninterface IMemtionProps {\r\n visible?: boolean;\r\n rect?: DOMRect | null;\r\n options?: IEditorMemtionOption[];\r\n activeIndex?: number;\r\n onActiveChange?: (index: number) => void;\r\n onSelect?: (option: IEditorMemtionOption) => void;\r\n}\r\n\r\ninterface IInsertMemtionOptionParams {\r\n editor: HTMLDivElement | null;\r\n range: Range | null;\r\n mode: \"rich\" | \"plaintext\";\r\n memtion?: IEditorMemtion;\r\n option: IEditorMemtionOption;\r\n sanitizeValue: (value: string) => string;\r\n}\r\n\r\nconst getInsertNode = (\r\n memtion: IEditorMemtion | undefined,\r\n option: IEditorMemtionOption,\r\n) => memtion?.insert?.(option) ?? option.value;\r\n\r\nconst getInsertText = (\r\n memtion: IEditorMemtion | undefined,\r\n option: IEditorMemtionOption,\r\n) => {\r\n const nextNode = getInsertNode(memtion, option);\r\n\r\n if (typeof nextNode === \"string\" || typeof nextNode === \"number\") {\r\n return `${String(nextNode)} `;\r\n }\r\n\r\n return `${String(option.value)} `;\r\n};\r\n\r\nconst getInsertHtml = (\r\n memtion: IEditorMemtion | undefined,\r\n option: IEditorMemtionOption,\r\n sanitizeValue: (value: string) => string,\r\n) => {\r\n const nextNode = getInsertNode(memtion, option);\r\n\r\n if (nextNode === null || nextNode === undefined || nextNode === false) {\r\n return \"\";\r\n }\r\n\r\n const content = sanitizeValue(\r\n renderToStaticMarkup(<>{nextNode as ReactNode}</>),\r\n );\r\n\r\n return `<span class=\"${MEMTION_TAG_CLASS_NAME}\" contenteditable=\"false\" data-memtion-value=\"${escapeAttrValue(String(option.value))}\">${content}</span>`;\r\n};\r\n\r\nexport const getSelectionRect = (range: Range | null) => {\r\n if (!range) return null;\r\n\r\n const rect = range.getBoundingClientRect();\r\n\r\n if (rect.width || rect.height) {\r\n return rect;\r\n }\r\n\r\n return range.getClientRects()[0] ?? rect;\r\n};\r\n\r\nexport const insertMemtionOption = ({\r\n editor,\r\n range,\r\n mode,\r\n memtion,\r\n option,\r\n sanitizeValue,\r\n}: IInsertMemtionOptionParams) => {\r\n if (!editor || !range) return null;\r\n\r\n const browserSelection = window.getSelection();\r\n if (!browserSelection) return null;\r\n\r\n const nextRange = range.cloneRange();\r\n browserSelection.removeAllRanges();\r\n browserSelection.addRange(nextRange);\r\n editor.focus();\r\n nextRange.deleteContents();\r\n\r\n if (mode === \"plaintext\") {\r\n const text = document.createTextNode(getInsertText(memtion, option));\r\n nextRange.insertNode(text);\r\n nextRange.setStartAfter(text);\r\n } else {\r\n const html = getInsertHtml(memtion, option, sanitizeValue);\r\n const fragment = nextRange.createContextualFragment(html);\r\n const lastNode = fragment.lastChild;\r\n const spacing = document.createTextNode(\" \");\r\n\r\n nextRange.insertNode(fragment);\r\n\r\n if (lastNode) {\r\n nextRange.setStartAfter(lastNode);\r\n nextRange.collapse(true);\r\n }\r\n\r\n nextRange.insertNode(spacing);\r\n nextRange.setStartAfter(spacing);\r\n }\r\n\r\n nextRange.collapse(true);\r\n browserSelection.removeAllRanges();\r\n browserSelection.addRange(nextRange);\r\n\r\n return nextRange;\r\n};\r\n\r\nexport const getMemtionText = (\r\n triggerRange: Range | null,\r\n selectionRange: Range | null,\r\n) => {\r\n if (!triggerRange || !selectionRange) return \"\";\r\n\r\n const range = triggerRange.cloneRange();\r\n range.setEnd(selectionRange.endContainer, selectionRange.endOffset);\r\n\r\n return range.toString();\r\n};\r\n\r\nexport const getMemtionReplaceRange = (\r\n triggerRange: Range | null,\r\n selectionRange: Range | null,\r\n) => {\r\n if (!triggerRange || !selectionRange) return null;\r\n\r\n const range = triggerRange.cloneRange();\r\n range.setEnd(selectionRange.endContainer, selectionRange.endOffset);\r\n\r\n return range;\r\n};\r\n\r\nexport const filterMemtionOptions = (\r\n options: IEditorMemtionOption[],\r\n keyword: string,\r\n) => {\r\n const normalizedKeyword = keyword.trim().toLowerCase();\r\n\r\n if (!normalizedKeyword) {\r\n return options;\r\n }\r\n\r\n return options.filter((option) =>\r\n String(option.value).toLowerCase().includes(normalizedKeyword),\r\n );\r\n};\r\n\r\nconst isMemtionTag = (node: Node | null) =>\r\n node instanceof HTMLElement &&\r\n node.classList.contains(MEMTION_TAG_CLASS_NAME);\r\n\r\nconst getAdjacentMemtionTag = (\r\n range: Range,\r\n direction: \"backward\" | \"forward\",\r\n) => {\r\n const { startContainer, startOffset } = range;\r\n\r\n if (startContainer.nodeType === Node.TEXT_NODE) {\r\n const textNode = startContainer as Text;\r\n\r\n if (direction === \"backward\" && startOffset === 0) {\r\n return isMemtionTag(textNode.previousSibling)\r\n ? (textNode.previousSibling as HTMLElement)\r\n : null;\r\n }\r\n\r\n if (direction === \"forward\" && startOffset === textNode.data.length) {\r\n return isMemtionTag(textNode.nextSibling)\r\n ? (textNode.nextSibling as HTMLElement)\r\n : null;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n const element = startContainer as Element;\r\n const targetIndex =\r\n direction === \"backward\" ? startOffset - 1 : startOffset;\r\n const targetNode = element.childNodes.item(targetIndex);\r\n\r\n return isMemtionTag(targetNode) ? (targetNode as HTMLElement) : null;\r\n};\r\n\r\nexport const removeAdjacentMemtionTag = (\r\n editor: HTMLDivElement | null,\r\n key: \"Backspace\" | \"Delete\",\r\n) => {\r\n if (!editor) return false;\r\n\r\n const selection = window.getSelection();\r\n if (!selection?.rangeCount || !selection.isCollapsed) return false;\r\n\r\n const activeRange = selection.getRangeAt(0);\r\n const tag = getAdjacentMemtionTag(\r\n activeRange,\r\n key === \"Backspace\" ? \"backward\" : \"forward\",\r\n );\r\n\r\n if (!tag || !tag.parentNode) return false;\r\n\r\n const parent = tag.parentNode;\r\n const nextSibling = tag.nextSibling;\r\n const index = Array.prototype.indexOf.call(parent.childNodes, tag);\r\n\r\n if (nextSibling?.nodeType === Node.TEXT_NODE) {\r\n const textNode = nextSibling as Text;\r\n\r\n if (textNode.data.startsWith(\" \")) {\r\n textNode.deleteData(0, 1);\r\n\r\n if (!textNode.data.length) {\r\n nextSibling.remove();\r\n }\r\n }\r\n }\r\n\r\n tag.remove();\r\n\r\n const range = document.createRange();\r\n range.setStart(parent, Math.min(index, parent.childNodes.length));\r\n range.collapse(true);\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n editor.focus();\r\n\r\n return true;\r\n};\r\n\r\nconst Memtion = (props: IMemtionProps) => {\r\n const { visible, rect, options, activeIndex, onActiveChange, onSelect } =\r\n props;\r\n\r\n if (!visible || !rect || !options?.length) {\r\n return null;\r\n }\r\n\r\n return (\r\n <List\r\n className=\"i-editor-memtion\"\r\n type=\"option\"\r\n style={{\r\n position: \"fixed\",\r\n top: rect.bottom,\r\n left: rect.left,\r\n }}\r\n >\r\n {options.map((option, i) => (\r\n <List.Item\r\n key={`${option.value}-${i}`}\r\n type=\"option\"\r\n active={i === activeIndex}\r\n onMouseDown={(e) => e.preventDefault()}\r\n onMouseEnter={() => onActiveChange?.(i)}\r\n onClick={() => onSelect?.(option)}\r\n >\r\n {option.label}\r\n </List.Item>\r\n ))}\r\n </List>\r\n );\r\n};\r\n\r\nexport default memo(Memtion);\r\n"],"names":["_jsx","_Fragment"],"mappings":"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"}
1
+ {"version":3,"file":"memtion.js","sources":["../../../../packages/components/editor/memtion.tsx"],"sourcesContent":["import { memo, ReactNode } from \"react\";\r\nimport { renderToStaticMarkup } from \"react-dom/server\";\r\nimport List from \"../list\";\r\nimport { IEditorMemtion, IEditorMemtionOption } from \"./type\";\r\n\r\nexport const MEMTION_TAG_CLASS_NAME = \"i-memtion-tag\";\r\n\nconst escapeHtmlAttr = (value: string) =>\n value\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll('\"', \"&quot;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\");\n\r\ninterface IMemtionProps {\r\n visible?: boolean;\r\n rect?: DOMRect | null;\r\n options?: IEditorMemtionOption[];\r\n activeIndex?: number;\r\n onActiveChange?: (index: number) => void;\r\n onSelect?: (option: IEditorMemtionOption) => void;\r\n}\r\n\r\ninterface IInsertMemtionOptionParams {\r\n editor: HTMLDivElement | null;\r\n range: Range | null;\r\n mode: \"rich\" | \"plaintext\";\r\n memtion?: IEditorMemtion;\r\n option: IEditorMemtionOption;\r\n sanitizeValue: (value: string) => string;\r\n}\r\n\r\nconst getInsertNode = (\r\n memtion: IEditorMemtion | undefined,\r\n option: IEditorMemtionOption,\r\n) => memtion?.insert?.(option) ?? option.value;\r\n\r\nconst getInsertText = (\r\n memtion: IEditorMemtion | undefined,\r\n option: IEditorMemtionOption,\r\n) => {\r\n const nextNode = getInsertNode(memtion, option);\r\n\r\n if (typeof nextNode === \"string\" || typeof nextNode === \"number\") {\r\n return `${String(nextNode)} `;\r\n }\r\n\r\n return `${String(option.value)} `;\r\n};\r\n\r\nconst getInsertHtml = (\r\n memtion: IEditorMemtion | undefined,\r\n option: IEditorMemtionOption,\r\n sanitizeValue: (value: string) => string,\r\n) => {\r\n const nextNode = getInsertNode(memtion, option);\r\n\r\n if (nextNode === null || nextNode === undefined || nextNode === false) {\r\n return \"\";\r\n }\r\n\r\n const content = sanitizeValue(\r\n renderToStaticMarkup(<>{nextNode as ReactNode}</>),\r\n );\r\n\r\n return `<span class=\"${MEMTION_TAG_CLASS_NAME}\" contenteditable=\"false\" data-memtion-value=\"${escapeHtmlAttr(String(option.value))}\">${content}</span>`;\n};\r\n\r\nexport const getSelectionRect = (range: Range | null) => {\r\n if (!range) return null;\r\n\r\n const rect = range.getBoundingClientRect();\r\n\r\n if (rect.width || rect.height) {\r\n return rect;\r\n }\r\n\r\n return range.getClientRects()[0] ?? rect;\r\n};\r\n\r\nexport const insertMemtionOption = ({\r\n editor,\r\n range,\r\n mode,\r\n memtion,\r\n option,\r\n sanitizeValue,\r\n}: IInsertMemtionOptionParams) => {\r\n if (!editor || !range) return null;\r\n\r\n const browserSelection = window.getSelection();\r\n if (!browserSelection) return null;\r\n\r\n const nextRange = range.cloneRange();\r\n browserSelection.removeAllRanges();\r\n browserSelection.addRange(nextRange);\r\n editor.focus();\r\n nextRange.deleteContents();\r\n\r\n if (mode === \"plaintext\") {\r\n const text = document.createTextNode(getInsertText(memtion, option));\r\n nextRange.insertNode(text);\r\n nextRange.setStartAfter(text);\r\n } else {\r\n const html = getInsertHtml(memtion, option, sanitizeValue);\r\n const fragment = nextRange.createContextualFragment(html);\r\n const lastNode = fragment.lastChild;\r\n const spacing = document.createTextNode(\" \");\r\n\r\n nextRange.insertNode(fragment);\r\n\r\n if (lastNode) {\r\n nextRange.setStartAfter(lastNode);\r\n nextRange.collapse(true);\r\n }\r\n\r\n nextRange.insertNode(spacing);\r\n nextRange.setStartAfter(spacing);\r\n }\r\n\r\n nextRange.collapse(true);\r\n browserSelection.removeAllRanges();\r\n browserSelection.addRange(nextRange);\r\n\r\n return nextRange;\r\n};\r\n\r\nexport const getMemtionText = (\r\n triggerRange: Range | null,\r\n selectionRange: Range | null,\r\n) => {\r\n if (!triggerRange || !selectionRange) return \"\";\r\n\r\n const range = triggerRange.cloneRange();\r\n range.setEnd(selectionRange.endContainer, selectionRange.endOffset);\r\n\r\n return range.toString();\r\n};\r\n\r\nexport const getMemtionReplaceRange = (\r\n triggerRange: Range | null,\r\n selectionRange: Range | null,\r\n) => {\r\n if (!triggerRange || !selectionRange) return null;\r\n\r\n const range = triggerRange.cloneRange();\r\n range.setEnd(selectionRange.endContainer, selectionRange.endOffset);\r\n\r\n return range;\r\n};\r\n\r\nexport const filterMemtionOptions = (\r\n options: IEditorMemtionOption[],\r\n keyword: string,\r\n) => {\r\n const normalizedKeyword = keyword.trim().toLowerCase();\r\n\r\n if (!normalizedKeyword) {\r\n return options;\r\n }\r\n\r\n return options.filter((option) =>\r\n String(option.value).toLowerCase().includes(normalizedKeyword),\r\n );\r\n};\r\n\r\nconst isMemtionTag = (node: Node | null) =>\r\n node instanceof HTMLElement &&\r\n node.classList.contains(MEMTION_TAG_CLASS_NAME);\r\n\r\nconst getAdjacentMemtionTag = (\r\n range: Range,\r\n direction: \"backward\" | \"forward\",\r\n) => {\r\n const { startContainer, startOffset } = range;\r\n\r\n if (startContainer.nodeType === Node.TEXT_NODE) {\r\n const textNode = startContainer as Text;\r\n\r\n if (direction === \"backward\" && startOffset === 0) {\r\n return isMemtionTag(textNode.previousSibling)\r\n ? (textNode.previousSibling as HTMLElement)\r\n : null;\r\n }\r\n\r\n if (direction === \"forward\" && startOffset === textNode.data.length) {\r\n return isMemtionTag(textNode.nextSibling)\r\n ? (textNode.nextSibling as HTMLElement)\r\n : null;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n const element = startContainer as Element;\r\n const targetIndex =\r\n direction === \"backward\" ? startOffset - 1 : startOffset;\r\n const targetNode = element.childNodes.item(targetIndex);\r\n\r\n return isMemtionTag(targetNode) ? (targetNode as HTMLElement) : null;\r\n};\r\n\r\nexport const removeAdjacentMemtionTag = (\r\n editor: HTMLDivElement | null,\r\n key: \"Backspace\" | \"Delete\",\r\n) => {\r\n if (!editor) return false;\r\n\r\n const selection = window.getSelection();\r\n if (!selection?.rangeCount || !selection.isCollapsed) return false;\r\n\r\n const activeRange = selection.getRangeAt(0);\r\n const tag = getAdjacentMemtionTag(\r\n activeRange,\r\n key === \"Backspace\" ? \"backward\" : \"forward\",\r\n );\r\n\r\n if (!tag || !tag.parentNode) return false;\r\n\r\n const parent = tag.parentNode;\r\n const nextSibling = tag.nextSibling;\r\n const index = Array.prototype.indexOf.call(parent.childNodes, tag);\r\n\r\n if (nextSibling?.nodeType === Node.TEXT_NODE) {\r\n const textNode = nextSibling as Text;\r\n\r\n if (textNode.data.startsWith(\" \")) {\r\n textNode.deleteData(0, 1);\r\n\r\n if (!textNode.data.length) {\r\n nextSibling.remove();\r\n }\r\n }\r\n }\r\n\r\n tag.remove();\r\n\r\n const range = document.createRange();\r\n range.setStart(parent, Math.min(index, parent.childNodes.length));\r\n range.collapse(true);\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n editor.focus();\r\n\r\n return true;\r\n};\r\n\r\nconst Memtion = (props: IMemtionProps) => {\r\n const { visible, rect, options, activeIndex, onActiveChange, onSelect } =\r\n props;\r\n\r\n if (!visible || !rect || !options?.length) {\r\n return null;\r\n }\r\n\r\n return (\r\n <List\r\n className=\"i-editor-memtion\"\r\n type=\"option\"\r\n style={{\r\n position: \"fixed\",\r\n top: rect.bottom,\r\n left: rect.left,\r\n }}\r\n >\r\n {options.map((option, i) => (\r\n <List.Item\r\n key={`${option.value}-${i}`}\r\n type=\"option\"\r\n active={i === activeIndex}\r\n onMouseDown={(e) => e.preventDefault()}\r\n onMouseEnter={() => onActiveChange?.(i)}\r\n onClick={() => onSelect?.(option)}\r\n >\r\n {option.label}\r\n </List.Item>\r\n ))}\r\n </List>\r\n );\r\n};\r\n\r\nexport default memo(Memtion);\r\n"],"names":["_jsx","_Fragment"],"mappings":"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"}
package/lib/index.js CHANGED
@@ -5,7 +5,7 @@ import { useState, useRef, useCallback, useEffect, useMemo, Children, cloneEleme
5
5
  import { SkipPreviousRound, CloseRound, MinusRound, PlusRound, InboxTwotone, ClearAllRound, UndoRound, RedoRound, StrikethroughSRound, FormatUnderlinedRound, FormatItalicRound, FormatBoldRound, PlayArrowRound, PauseRound, StopRound, VolumeDownRound, VolumeOffRound, FullscreenRound, FullscreenExitRound, FeedOutlined, AspectRatioRound, OpenInNewRound, FileDownloadOutlined, RotateRightRound, RotateLeftRound, KeyboardArrowLeftRound, KeyboardArrowRightRound, KeyboardDoubleArrowUpRound, SyncAltRound, VisibilityRound, VisibilityOffRound, MoreHorizRound, SearchRound, CheckRound, UnfoldMoreRound, CalendarMonthTwotone, AccessTimeRound, InfoOutlined, KeyboardArrowDownRound, ListAltRound, DriveFolderUploadOutlined, PlusSharp } from '@ricons/material';
6
6
  import { createRoot } from 'react-dom/client';
7
7
  import { createPortal } from 'react-dom';
8
- import xss, { escapeAttrValue } from 'xss';
8
+ import xss from 'xss';
9
9
  import { renderToStaticMarkup } from 'react-dom/server';
10
10
  import PubSub from 'pubsub-js';
11
11
  import { findAll } from 'highlight-words-core';
@@ -1849,13 +1849,18 @@ const exec = (a, b, c) => {
1849
1849
  return;
1850
1850
  return document.execCommand(a, b, c);
1851
1851
  };
1852
+ const escapeHtmlAttr$1 = (value) => value
1853
+ .replaceAll("&", "&amp;")
1854
+ .replaceAll('"', "&quot;")
1855
+ .replaceAll("<", "&lt;")
1856
+ .replaceAll(">", "&gt;");
1852
1857
  const xssOptions = {
1853
1858
  onIgnoreTagAttr(tag, name, value) {
1854
1859
  if (["class", "contenteditable"].includes(name)) {
1855
- return name + '="' + escapeAttrValue(value) + '"';
1860
+ return name + '="' + escapeHtmlAttr$1(value) + '"';
1856
1861
  }
1857
1862
  if (["data-", "style"].includes(name.substring(0, 5))) {
1858
- return name + '="' + escapeAttrValue(value) + '"';
1863
+ return name + '="' + escapeHtmlAttr$1(value) + '"';
1859
1864
  }
1860
1865
  },
1861
1866
  };
@@ -1913,6 +1918,11 @@ function getControls(options) {
1913
1918
  }
1914
1919
 
1915
1920
  const MEMTION_TAG_CLASS_NAME = "i-memtion-tag";
1921
+ const escapeHtmlAttr = (value) => value
1922
+ .replaceAll("&", "&amp;")
1923
+ .replaceAll('"', "&quot;")
1924
+ .replaceAll("<", "&lt;")
1925
+ .replaceAll(">", "&gt;");
1916
1926
  const getInsertNode = (memtion, option) => memtion?.insert?.(option) ?? option.value;
1917
1927
  const getInsertText = (memtion, option) => {
1918
1928
  const nextNode = getInsertNode(memtion, option);
@@ -1927,7 +1937,7 @@ const getInsertHtml = (memtion, option, sanitizeValue) => {
1927
1937
  return "";
1928
1938
  }
1929
1939
  const content = sanitizeValue(renderToStaticMarkup(jsx(Fragment, { children: nextNode })));
1930
- return `<span class="${MEMTION_TAG_CLASS_NAME}" contenteditable="false" data-memtion-value="${escapeAttrValue(String(option.value))}">${content}</span>`;
1940
+ return `<span class="${MEMTION_TAG_CLASS_NAME}" contenteditable="false" data-memtion-value="${escapeHtmlAttr(String(option.value))}">${content}</span>`;
1931
1941
  };
1932
1942
  const getSelectionRect = (range) => {
1933
1943
  if (!range)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ioca/react",
3
- "version": "1.5.04",
3
+ "version": "1.5.05",
4
4
  "type": "module",
5
5
  "scripts": {
6
6
  "dev": "vite",