neko-ui 2.9.2 → 2.9.3
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.
- package/es/code/index.d.ts +6 -2
- package/es/code/index.js +1 -1
- package/es/code/index.js.map +1 -1
- package/es/code/style.js +1 -1
- package/es/code/style.js.map +1 -1
- package/es/md/index.js +1 -1
- package/es/md/index.js.map +1 -1
- package/es/prism/index.d.ts +0 -1
- package/es/prism/index.js +1 -1
- package/es/prism/index.js.map +1 -1
- package/lib/code/index.d.ts +6 -2
- package/lib/code/index.js +1 -1
- package/lib/code/index.js.map +1 -1
- package/lib/code/style.js +1 -1
- package/lib/code/style.js.map +1 -1
- package/lib/md/index.js +1 -1
- package/lib/md/index.js.map +1 -1
- package/lib/prism/index.d.ts +0 -1
- package/lib/prism/index.js +1 -1
- package/lib/prism/index.js.map +1 -1
- package/package.json +5 -5
- package/umd/index.js +1 -1
package/es/code/index.d.ts
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import { type JSX } from 'solid-js';
|
|
2
2
|
import type { CustomElement } from '..';
|
|
3
|
-
export type
|
|
3
|
+
export type LanguageBase = 'bash' | 'shell' | 'sh' | 'clike' | 'css' | 'docker' | 'dockerfile' | 'git' | 'javascript' | 'js' | 'json' | 'webmanifest' | 'jsx' | 'tsx' | 'less' | 'html' | 'mathml' | 'svg' | 'xml' | 'ssml' | 'atom' | 'rss' | 'regex' | 'rust' | 'sql' | 'swift' | 'toml' | 'typescript' | 'ts' | 'yaml' | 'yml' | 'matlab';
|
|
4
|
+
type ExcludeLanguage<T extends LanguageBase, U extends LanguageBase> = T extends U ? never : T;
|
|
5
|
+
export type Language = LanguageBase | {
|
|
6
|
+
[T in LanguageBase]: `${T} ${ExcludeLanguage<LanguageBase, T>}`;
|
|
7
|
+
}[LanguageBase];
|
|
4
8
|
export interface CodeProps {
|
|
5
9
|
/** 自定义类名 */
|
|
6
10
|
class?: string;
|
|
@@ -8,7 +12,7 @@ export interface CodeProps {
|
|
|
8
12
|
css?: string;
|
|
9
13
|
/** 内容 */
|
|
10
14
|
code?: string;
|
|
11
|
-
/**
|
|
15
|
+
/** 语言(支持多种语言配置:如 `html css javascript`)
|
|
12
16
|
* @default 'markup'
|
|
13
17
|
*/
|
|
14
18
|
language?: Language;
|
package/es/code/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
function t(t,e,i,
|
|
1
|
+
function t(t,e,o,i,r,n,l){try{var s=t[n](l),a=s.value}catch(t){o(t);return}s.done?e(a):Promise.resolve(a).then(i,r)}import{use as e}from"solid-js/web";import{template as o}from"solid-js/web";import{setAttribute as i}from"solid-js/web";import{mergeProps as r}from"solid-js/web";import{insert as n}from"solid-js/web";import{effect as l}from"solid-js/web";import{delegateEvents as s}from"solid-js/web";import{createComponent as a}from"solid-js/web";import{classList as d}from"solid-js/web";import{addEventListener as c}from"solid-js/web";let h=o("<style> "),m=o("<style>"),g=o('<div class="toolbar"><button class="toolbar-copy" aria-label="copy">'),u=o("<pre><code>");import{createEffect as f,createMemo as p,createResource as v,createSignal as b,createUniqueId as w,mergeProps as C,onCleanup as y,Show as S,untrack as k}from"solid-js";import j from"@moneko/common/lib/isFunction";import $ from"@moneko/common/lib/setClipboard";import{css as x}from"@moneko/css";import{customElement as E}from"solid-element";import{clearAttribute as P}from"../basic-config";import A from"../theme";import{darkCss as _,lightCss as z,style as H}from"./style";function T(o){let r,s;let{isDark:C}=A,E=/%[0-9A-Fa-f]{2}/,P=w(),[T,W]=b(""),[F,L]=b();function R(){var e;return e=function*(){return window.Prism?(window.Prism.disableWorkerMessageHandler=!0,window.Prism.manual=!0,window.Prism):(yield import("../prism")).default},(R=function(){var o=this,i=arguments;return new Promise(function(r,n){var l=e.apply(o,i);function s(e){t(l,r,n,s,a,"next",e)}function a(e){t(l,r,n,s,a,"throw",e)}s(void 0)})}).apply(this,arguments)}let[I]=v("prism",function(){return R.apply(this,arguments)}),M=p(()=>{var t;return null==(t=o.language)?void 0:t.split(" ").pop()});function O(){$(k(T),r)}f(()=>{let t=o.code||"";E.test(t)&&(t=decodeURIComponent(t)),r.normalize(),t!==r.textContent&&W(t)});let U=function(t){t.target.normalize();let e=t.target.textContent;q(o.language,e,!0),j(o.onChange)&&o.onChange(e)};function q(t="markup",e,o,i={}){s&&(clearTimeout(s),s=void 0);let n=I();e&&n&&(s=setTimeout(()=>{if(clearTimeout(s),CSS.highlights){o&&CSS.highlights.forEach((t,e)=>{e.startsWith(P)&&t.clear()});let l=t.split(" "),s=n.languages[l[0]];s&&function t(e,o,i,r=0){let n=r;if(Array.isArray(o)){for(let r=0,l=o.length;r<l;r++){let l=o[r];if("object"!=typeof l){n+=l.length;continue}n=t(e,l,i,n)}return n}if("object"==typeof o&&o.type&&e.firstChild){var l;let r=(null!=(l=o.alias)?l:o.type).toString(),s=P+r,a=new Range;["deleted","inserted"].includes(r)?a.setStart(e.firstChild,n+2):a.setStart(e.firstChild,n),Array.isArray(o.content)?n=t(e,o.content,i,n):"string"==typeof o.content&&(n+=o.content.length),a.setEnd(e.firstChild,n),function(t,e,o,i){let r=CSS.highlights.get(t);r?r.add(o):CSS.highlights.set(t,new Highlight().add(o)),void 0===i[t]&&(i[t]=`::highlight(${t}){color:var(--${e});background-color:var(--${e}-bg);text-decoration:var(--${e}-text-decoration);text-shadow:var(--${e}-text-shadow);-webkit-text-stroke-width:var(--${e}-stroke-width);-webkit-text-stroke-color:var(--${e}-stroke-color);}`)}(s,r,a,i)}return n}(r,n.tokenize(e,s),i),l.length>1||"git"===l[0]?q(l[1],e,!1,i):L(Object.values(i).join(""))}else throw Error("不支持 CSS Highlights");s=void 0},0))}return f(()=>{q(o.language,T(),!0)}),y(()=>{if(CSS.highlights)for(let t of CSS.highlights.keys())t.startsWith(P)&&CSS.highlights.delete(t)}),[(()=>{let t=h(),e=t.firstChild;return l(()=>e.data=C()?_:z),t})(),(()=>{let t=h(),e=t.firstChild;return l(()=>e.data=F()),t})(),(()=>{let t=m();return t.textContent=H,t})(),a(S,{get when(){return o.css},get children(){let t=h(),e=t.firstChild;return l(()=>e.data=x(o.css)),t}}),(()=>{let t=u(),s=t.firstChild,h=r;return n(t,a(S,{get when(){return o.toolbar},get children(){let t=g();return c(t.firstChild,"click",O,!0),l(()=>i(t,"data-language",M())),t}}),s),c(s,"input",U,!0),"function"==typeof h?e(h,s):r=s,i(s,"spellcheck",!1),n(s,T),l(e=>{let r={[`language-${o.language}`]:!!o.language,"not-toolbar":!o.toolbar,[o.class]:!o.edit},n=o.edit;return e._v$=d(t,r,e._v$),n!==e._v$2&&i(s,"contenteditable",e._v$2=n),e},{_v$:void 0,_v$2:void 0}),t})()]}E("n-code",{class:void 0,code:void 0,language:void 0,children:void 0,edit:void 0,toolbar:void 0,css:void 0,onChange:void 0},(t,e)=>{let{baseStyle:o}=A,i=e.element,n=C({code:i.textContent,css:i.css,onChange(t){i.dispatchEvent(new CustomEvent("change",{detail:t}))}},t);return f(()=>{P(i,["css","code"]),i.replaceChildren()}),[(()=>{let t=h(),e=t.firstChild;return l(()=>e.data=o()),t})(),a(T,r({language:"atom"},n))]});export default T;s(["click","input"]);
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/es/code/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../components/code/index.tsx"],"sourcesContent":["import {\n createEffect,\n createResource,\n createSignal,\n createUniqueId,\n type JSX,\n mergeProps,\n onCleanup,\n Show,\n untrack,\n} from 'solid-js';\nimport { isFunction, setClipboard } from '@moneko/common';\nimport { css } from '@moneko/css';\nimport type { TokenStream } from 'prismjs';\nimport { customElement } from 'solid-element';\n\nimport type { CustomElement } from '..';\nimport { clearAttribute } from '../basic-config';\nimport theme from '../theme';\n\nimport { darkCss, lightCss, style } from './style';\n\nexport type Language =\n | 'bash'\n | 'shell'\n | 'sh'\n | 'clike'\n | 'css'\n | 'docker'\n | 'dockerfile'\n | 'git'\n | 'diff'\n | 'javascript'\n | 'js'\n | 'json'\n | 'webmanifest'\n | 'jsx'\n | 'tsx'\n | 'less'\n | 'html'\n | 'mathml'\n | 'svg'\n | 'xml'\n | 'ssml'\n | 'atom'\n | 'rss'\n | 'regex'\n | 'rust'\n | 'sql'\n | 'swift'\n | 'toml'\n | 'typescript'\n | 'ts'\n | 'yaml'\n | 'yml'\n | 'matlab';\n\nexport interface CodeProps {\n /** 自定义类名 */\n class?: string;\n /** 自定义样式表 */\n css?: string;\n /** 内容 */\n code?: string;\n /** 语言\n * @default 'markup'\n */\n language?: Language;\n /** 支持编辑 */\n edit?: boolean;\n /** 开启代码块工具条 */\n toolbar?: boolean;\n /** 编辑修改时的回调 */\n onChange?(code: string): void;\n children?: JSX.Element;\n}\nexport type CodeElement = CustomElement<CodeProps>;\n\nfunction Code(props: CodeProps) {\n const { isDark } = theme;\n let codeEl: HTMLPreElement;\n let timer: NodeJS.Timeout | undefined;\n const diffLang = /^diff-([\\w-]+)/i;\n const decoded = /%[0-9A-Fa-f]{2}/;\n const id = createUniqueId();\n const [code, setCode] = createSignal<string>('');\n const [highlightCss, setHighlightCss] = createSignal<string>();\n\n async function fetchPrism() {\n if (!window.Prism) {\n return (await import('../prism')).default;\n }\n return window.Prism;\n }\n const [prismJS] = createResource('prism', fetchPrism);\n\n createEffect(() => {\n let _next = props.code || '';\n\n if (decoded.test(_next)) {\n _next = decodeURIComponent(_next);\n }\n codeEl.normalize();\n if (_next !== codeEl.textContent) {\n setCode(_next);\n }\n });\n\n function copy() {\n setClipboard(untrack(code), codeEl);\n }\n const change: JSX.InputEventHandlerUnion<HTMLElement, InputEvent> = function (e) {\n e.target.normalize();\n const next = e.target.textContent;\n\n syntax(props.language, next);\n if (isFunction(props.onChange)) {\n props.onChange(next);\n }\n };\n\n function highlighter(el: HTMLPreElement, tokenize: TokenStream, start = 0) {\n let pos = start;\n\n if (Array.isArray(tokenize)) {\n for (let i = 0, len = tokenize.length; i < len; i++) {\n const token = tokenize[i];\n\n if (typeof token !== 'object') {\n pos += token.length;\n continue;\n }\n pos = highlighter(el, token, pos);\n }\n return pos;\n }\n if (typeof tokenize === 'object' && tokenize.type) {\n if (el.firstChild) {\n const key = id + (tokenize.alias ?? tokenize.type);\n const range = new Range();\n\n range.setStart(el.firstChild, pos);\n if (Array.isArray(tokenize.content)) {\n pos = highlighter(el, tokenize.content, pos);\n } else if (typeof tokenize.content === 'string') {\n pos += tokenize.content.length;\n }\n range.setEnd(el.firstChild, pos);\n const highlight = CSS.highlights.get(key);\n\n if (highlight) {\n highlight.add(range);\n } else {\n CSS.highlights.set(key, new Highlight().add(range));\n }\n }\n }\n\n return pos;\n }\n function syntax(language = 'markup', value: string | null) {\n if (timer) {\n clearTimeout(timer);\n timer = void 0;\n }\n const Prism = prismJS();\n\n if (!value || !Prism) return;\n timer = setTimeout(() => {\n clearTimeout(timer);\n\n if (CSS.highlights) {\n CSS.highlights.forEach((highlight, key) => {\n if (key.startsWith(id)) {\n highlight.clear();\n }\n });\n const grammar =\n Prism.languages[diffLang.test(language) ? 'diff' : language] || Prism.languages.markup;\n\n highlighter(codeEl, Prism.tokenize(value, grammar));\n setHighlightCss(() => {\n const len = id.length;\n let style = '';\n\n for (const key of CSS.highlights.keys()) {\n if (key.startsWith(id)) {\n style += `::highlight(${key}){color:var(--${key.substring(len)});}`;\n }\n }\n return style;\n });\n } else {\n throw Error('不支持 CSS Highlights');\n }\n timer = void 0;\n }, 0);\n }\n createEffect(() => {\n syntax(props.language, code());\n });\n onCleanup(() => {\n if (CSS.highlights) {\n for (const key of CSS.highlights.keys()) {\n if (key.startsWith(id)) {\n CSS.highlights.delete(key);\n }\n }\n }\n });\n\n return (\n <>\n <style textContent={isDark() ? darkCss : lightCss} />\n <style textContent={highlightCss()} />\n <style textContent={style} />\n <Show when={props.css}>\n <style textContent={css(props.css)} />\n </Show>\n <pre\n classList={{\n [`language-${props.language}`]: !!props.language,\n 'not-toolbar': !props.toolbar,\n [props.class!]: !props.edit,\n }}\n >\n <Show when={props.toolbar}>\n <div class=\"toolbar\" data-language={props.language?.split(' ')[0]}>\n <button class=\"toolbar-copy\" aria-label=\"copy\" onClick={copy} />\n </div>\n </Show>\n <code ref={codeEl!} contenteditable={props.edit} spellcheck={false} onInput={change}>\n {code()}\n </code>\n </pre>\n </>\n );\n}\n\ncustomElement<CodeProps>(\n 'n-code',\n {\n class: void 0,\n code: void 0,\n language: void 0,\n children: void 0,\n edit: void 0,\n toolbar: void 0,\n css: void 0,\n onChange: void 0,\n },\n (_, opt) => {\n const { baseStyle } = theme;\n const el = opt.element;\n const props = mergeProps(\n {\n code: el.textContent,\n css: el.css,\n onChange(val: string) {\n el.dispatchEvent(\n new CustomEvent('change', {\n detail: val,\n }),\n );\n },\n },\n _,\n );\n\n createEffect(() => {\n clearAttribute(el, ['css', 'code']);\n el.replaceChildren();\n });\n return (\n <>\n <style textContent={baseStyle()} />\n <Code {...props} />\n </>\n );\n },\n);\nexport default Code;\n"],"names":["createEffect","createResource","createSignal","createUniqueId","mergeProps","onCleanup","Show","untrack","isFunction","setClipboard","css","customElement","clearAttribute","theme","darkCss","lightCss","style","Code","props","codeEl","timer","isDark","diffLang","decoded","id","code","setCode","highlightCss","setHighlightCss","fetchPrism","window","Prism","default","prismJS","copy","_next","test","decodeURIComponent","normalize","textContent","change","e","target","next","syntax","language","onChange","value","clearTimeout","setTimeout","CSS","highlights","forEach","highlight","key","startsWith","clear","grammar","languages","markup","highlighter","el","tokenize","start","pos","Array","isArray","i","len","length","token","type","firstChild","alias","range","Range","setStart","content","setEnd","get","add","set","Highlight","keys","substring","Error","delete","toolbar","split","class","edit","children","_","opt","baseStyle","element","val","dispatchEvent","CustomEvent","detail","replaceChildren"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../components/code/index.tsx"],"sourcesContent":["import {\n createEffect,\n createMemo,\n createResource,\n createSignal,\n createUniqueId,\n type JSX,\n mergeProps,\n onCleanup,\n Show,\n untrack,\n} from 'solid-js';\nimport { isFunction, setClipboard } from '@moneko/common';\nimport { css } from '@moneko/css';\nimport type { TokenStream } from 'prismjs';\nimport { customElement } from 'solid-element';\n\nimport type { CustomElement } from '..';\nimport { clearAttribute } from '../basic-config';\nimport theme from '../theme';\n\nimport { darkCss, lightCss, style } from './style';\n\nexport type LanguageBase =\n | 'bash'\n | 'shell'\n | 'sh'\n | 'clike'\n | 'css'\n | 'docker'\n | 'dockerfile'\n | 'git'\n | 'javascript'\n | 'js'\n | 'json'\n | 'webmanifest'\n | 'jsx'\n | 'tsx'\n | 'less'\n | 'html'\n | 'mathml'\n | 'svg'\n | 'xml'\n | 'ssml'\n | 'atom'\n | 'rss'\n | 'regex'\n | 'rust'\n | 'sql'\n | 'swift'\n | 'toml'\n | 'typescript'\n | 'ts'\n | 'yaml'\n | 'yml'\n | 'matlab';\n\ntype ExcludeLanguage<T extends LanguageBase, U extends LanguageBase> = T extends U ? never : T;\n\nexport type Language =\n | LanguageBase\n | {\n [T in LanguageBase]: `${T} ${ExcludeLanguage<LanguageBase, T>}`;\n }[LanguageBase];\nexport interface CodeProps {\n /** 自定义类名 */\n class?: string;\n /** 自定义样式表 */\n css?: string;\n /** 内容 */\n code?: string;\n /** 语言(支持多种语言配置:如 `html css javascript`)\n * @default 'markup'\n */\n language?: Language;\n /** 支持编辑 */\n edit?: boolean;\n /** 开启代码块工具条 */\n toolbar?: boolean;\n /** 编辑修改时的回调 */\n onChange?(code: string): void;\n children?: JSX.Element;\n}\nexport type CodeElement = CustomElement<CodeProps>;\n\nfunction Code(props: CodeProps) {\n const { isDark } = theme;\n let codeEl: HTMLPreElement;\n let timer: NodeJS.Timeout | undefined;\n const decoded = /%[0-9A-Fa-f]{2}/;\n const id = createUniqueId();\n const [code, setCode] = createSignal<string>('');\n const [highlightCss, setHighlightCss] = createSignal<string>();\n\n async function fetchPrism() {\n if (!window.Prism) {\n return (await import('../prism')).default;\n }\n window.Prism.disableWorkerMessageHandler = true;\n window.Prism.manual = true;\n return window.Prism;\n }\n const [prismJS] = createResource('prism', fetchPrism);\n const title = createMemo(() => props.language?.split(' ').pop());\n\n createEffect(() => {\n let _next = props.code || '';\n\n if (decoded.test(_next)) {\n _next = decodeURIComponent(_next);\n }\n codeEl.normalize();\n if (_next !== codeEl.textContent) {\n setCode(_next);\n }\n });\n\n function copy() {\n setClipboard(untrack(code), codeEl);\n }\n const change: JSX.InputEventHandlerUnion<HTMLElement, InputEvent> = function (e) {\n e.target.normalize();\n const next = e.target.textContent;\n\n syntax(props.language, next, true);\n if (isFunction(props.onChange)) {\n props.onChange(next);\n }\n };\n\n function updateRang(\n key: string,\n token: string,\n range: AbstractRange,\n selection: Record<string, string>,\n ) {\n const highlight = CSS.highlights.get(key);\n\n if (highlight) {\n highlight.add(range);\n } else {\n CSS.highlights.set(key, new Highlight().add(range));\n }\n if (selection[key] === void 0) {\n selection[key] =\n `::highlight(${key}){color:var(--${token});background-color:var(--${token}-bg);text-decoration:var(--${token}-text-decoration);text-shadow:var(--${token}-text-shadow);-webkit-text-stroke-width:var(--${token}-stroke-width);-webkit-text-stroke-color:var(--${token}-stroke-color);}`;\n }\n }\n function highlighter(\n el: HTMLPreElement,\n tokenize: TokenStream,\n selection: Record<string, string>,\n start = 0,\n ) {\n let pos = start;\n\n if (Array.isArray(tokenize)) {\n for (let i = 0, len = tokenize.length; i < len; i++) {\n const token = tokenize[i];\n\n if (typeof token !== 'object') {\n pos += token.length;\n continue;\n }\n pos = highlighter(el, token, selection, pos);\n }\n return pos;\n }\n if (typeof tokenize === 'object' && tokenize.type) {\n if (el.firstChild) {\n const token = (tokenize.alias ?? tokenize.type).toString();\n const key = id + token;\n const range = new Range();\n\n if (['deleted', 'inserted'].includes(token)) {\n // diff\n range.setStart(el.firstChild, pos + 2);\n } else {\n range.setStart(el.firstChild, pos);\n }\n if (Array.isArray(tokenize.content)) {\n pos = highlighter(el, tokenize.content, selection, pos);\n } else if (typeof tokenize.content === 'string') {\n pos += tokenize.content.length;\n }\n range.setEnd(el.firstChild, pos);\n updateRang(key, token, range, selection);\n }\n }\n\n return pos;\n }\n function syntax(\n language: Language = 'markup' as Language,\n value: string | null,\n clear?: boolean,\n prevCss = {},\n ) {\n if (timer) {\n clearTimeout(timer);\n timer = void 0;\n }\n const Prism = prismJS();\n\n if (!value || !Prism) return;\n timer = setTimeout(() => {\n clearTimeout(timer);\n if (CSS.highlights) {\n if (clear) {\n CSS.highlights.forEach((highlight, key) => {\n if (key.startsWith(id)) {\n highlight.clear();\n }\n });\n }\n const grammars = language.split(' ') as Language[],\n grammar = Prism.languages[grammars[0]];\n\n if (grammar) {\n highlighter(codeEl, Prism.tokenize(value, grammar), prevCss);\n }\n if (grammars.length > 1 || grammars[0] === 'git') {\n syntax(grammars[1], value, false, prevCss);\n } else {\n setHighlightCss(Object.values(prevCss).join(''));\n }\n } else {\n throw Error('不支持 CSS Highlights');\n }\n timer = void 0;\n }, 0);\n }\n createEffect(() => {\n syntax(props.language, code(), true);\n });\n onCleanup(() => {\n if (CSS.highlights) {\n for (const key of CSS.highlights.keys()) {\n if (key.startsWith(id)) {\n CSS.highlights.delete(key);\n }\n }\n }\n });\n\n return (\n <>\n <style textContent={isDark() ? darkCss : lightCss} />\n <style textContent={highlightCss()} />\n <style textContent={style} />\n <Show when={props.css}>\n <style textContent={css(props.css)} />\n </Show>\n <pre\n classList={{\n [`language-${props.language}`]: !!props.language,\n 'not-toolbar': !props.toolbar,\n [props.class!]: !props.edit,\n }}\n >\n <Show when={props.toolbar}>\n <div class=\"toolbar\" data-language={title()}>\n <button class=\"toolbar-copy\" aria-label=\"copy\" onClick={copy} />\n </div>\n </Show>\n <code ref={codeEl!} contenteditable={props.edit} spellcheck={false} onInput={change}>\n {code()}\n </code>\n </pre>\n </>\n );\n}\n\ncustomElement<CodeProps>(\n 'n-code',\n {\n class: void 0,\n code: void 0,\n language: void 0,\n children: void 0,\n edit: void 0,\n toolbar: void 0,\n css: void 0,\n onChange: void 0,\n },\n (_, opt) => {\n const { baseStyle } = theme;\n const el = opt.element;\n const props = mergeProps(\n {\n code: el.textContent,\n css: el.css,\n onChange(val: string) {\n el.dispatchEvent(\n new CustomEvent('change', {\n detail: val,\n }),\n );\n },\n },\n _,\n );\n\n createEffect(() => {\n clearAttribute(el, ['css', 'code']);\n el.replaceChildren();\n });\n return (\n <>\n <style textContent={baseStyle()} />\n <Code language={'atom'} {...props} />\n </>\n );\n },\n);\nexport default Code;\n"],"names":["createEffect","createMemo","createResource","createSignal","createUniqueId","mergeProps","onCleanup","Show","untrack","isFunction","setClipboard","css","customElement","clearAttribute","theme","darkCss","lightCss","style","Code","props","codeEl","timer","isDark","decoded","id","code","setCode","highlightCss","setHighlightCss","fetchPrism","window","Prism","disableWorkerMessageHandler","manual","default","prismJS","title","language","split","pop","copy","_next","test","decodeURIComponent","normalize","textContent","change","e","target","next","syntax","onChange","value","clear","prevCss","clearTimeout","setTimeout","CSS","highlights","forEach","highlight","key","startsWith","grammars","grammar","languages","highlighter","el","tokenize","selection","start","pos","Array","isArray","i","len","length","token","type","firstChild","alias","toString","range","Range","includes","setStart","content","setEnd","updateRang","get","add","set","Highlight","Object","values","join","Error","keys","delete","toolbar","class","edit","children","_","opt","baseStyle","element","val","dispatchEvent","CustomEvent","detail","replaceChildren"],"mappings":"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"}
|
package/es/code/style.js
CHANGED
|
@@ -203,5 +203,5 @@ import{css as o}from"@moneko/css";export const style=o`
|
|
|
203
203
|
block-size: 5px;
|
|
204
204
|
inline-size: 5px;
|
|
205
205
|
}
|
|
206
|
-
`;export const darkCss=o({":host":{"--code-color":"#eee","--code-lang-style-color":"#fd9170","--code-toolbar-bg":"rgb(63, 63, 63, 0.7)","--atrule":"#c792ea","--attr-name":"#9cdcfe","--attr-value":"#ce9178","--attr-equals":"#ccc","--attribute":"#a5e844","--boolean":"#c792ea","--builtin":"#ffcb6b","--cdata":"#80cbc4","--char":"#80cbc4","--class":"#ffcb6b","--class-name":"#f2ff00","--comment":"#616161","--constant":"#c792ea","--
|
|
206
|
+
`;export const darkCss=o({":host":{"--code-color":"#eee","--code-lang-style-color":"#fd9170","--code-toolbar-bg":"rgb(63, 63, 63, 0.7)","--atrule":"#c792ea","--attr-name":"#9cdcfe","--attr-value":"#ce9178","--attr-equals":"#ccc","--attribute":"#a5e844","--boolean":"#c792ea","--builtin":"#ffcb6b","--cdata":"#80cbc4","--char":"#80cbc4","--class":"#ffcb6b","--class-name":"#f2ff00","--comment":"#616161","--constant":"#c792ea","--doctype":"#616161","--entity":"#f66","--function":"#dcdcaa","--hexcode":"#f2ff00","--id":"#c792ea","--important":"#c792ea","--keyword":"#c792ea","--number":"#fd9170","--operator":"#569cd6","--prolog":"#616161","--property":"#80cbc4","--pseudo-class":"#a5e844","--pseudo-element":"#a5e844","--punctuation":"#89ddff","--regex":"#f2ff00","--selector":"#f66","--string":"#a5e844","--symbol":"#c792ea","--tag":"#569cd6","--unit":"#fd9170","--url":"#f66","--variable":"#f66","--inserted-bg":"rgba(0, 255, 128, .15)","--deleted-bg":"rgba(255, 0, 0, .15)"}});export const lightCss=o({":host":{"--code-color":"#90a4ae","--code-lang-style-color":"#f76d47","--namespace":"rgba(56, 64, 68, 0.7)","--tag":"#4b69c6","--atrule":"#7c4dff","--attr-name":"#39adb5","--attr-value":"#f6a434","--attr-equals":"#90a4ae","--attribute":"#f6a434","--boolean":"#7c4dff","--builtin":"#39adb5","--cdata":"#39adb5","--char":"#39adb5","--class":"#39adb5","--class-name":"#6182b8","--comment":"#aabfc9","--constant":"#7c4dff","--doctype":"#aabfc9","--entity":"#e53935","--hexcode":"#f76d47","--id":"#7c4dff","--important":"#7c4dff","--keyword":"#7c4dff","--number":"#f76d47","--operator":"#91b3e0","--prolog":"#aabfc9","--property":"#39adb5","--pseudo-class":"#f6a434","--pseudo-element":"#f6a434","--punctuation":"#39adb5","--regex":"#6182b8","--selector":"#e53935","--string":"#f6a434","--symbol":"#7c4dff","--unit":"#f76d47","--url":"#e53935","--variable":"#e53935","--function":"#4078f2","--name":"#39adb5","--prefix-inserted":"green","--prefix-deleted":"red","--inserted-bg":"rgba(0, 255, 128, .1)","--deleted-bg":"rgba(255, 0, 0, .1)"}});
|
|
207
207
|
//# sourceMappingURL=style.js.map
|
package/es/code/style.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../components/code/style.ts"],"sourcesContent":["import { css } from '@moneko/css';\n\nexport const style = css`\n :host {\n --code-font-stack: 'Liberation Mono', monaco, menlo, consolas, 'Source Code Pro', 'Ubuntu Mono',\n 'Microsoft Yahei', '微软雅黑', courier, 'Helvetica Neue', 'Lantinghei SC', stxihei, wenquanyi,\n sans-serif;\n\n position: relative;\n display: block;\n box-sizing: border-box;\n }\n\n .toolbar::after,\n .toolbar-copy::after,\n pre,\n code {\n transition-duration: var(--transition-duration);\n transition-timing-function: var(--transition-timing-function);\n }\n\n [data-copy]::before {\n position: absolute;\n z-index: 1;\n display: inline-block;\n margin: auto;\n border: 1px solid;\n border-radius: var(--border-radius);\n padding: 4px 8px;\n font-size: var(--font-size-sm);\n transition:\n background-color 0.3s,\n color 0.3s,\n border-color 0.3s;\n content: '复制成功';\n inline-size: fit-content;\n animation-fill-mode: forwards;\n inset-block-start: 32px;\n inset-inline: 0;\n }\n\n [data-copy='success']::before {\n border-color: var(--success-border);\n color: var(--success-color);\n background-color: var(--success-bg);\n animation: copy-slide-in var(--transition-duration) var(--transition-timing-function);\n }\n\n [data-copy='failure']::before {\n border-color: var(--error-border);\n color: var(--error-color);\n background-color: var(--error-bg);\n animation:\n copy-slide-in var(--transition-duration) var(--transition-timing-function),\n error 1s var(--transition-timing-function) 1s;\n content: '复制失败';\n }\n\n [data-copy-exit]::before {\n animation: copy-slide-out var(--transition-duration) forwards var(--transition-timing-function);\n }\n\n @keyframes copy-slide-in {\n from {\n opacity: 0;\n transform: translate3d(0, -100%, 0) scale(0);\n }\n\n to {\n opacity: 1;\n transform: translate3d(0, 0, 0) scale(1);\n }\n }\n\n @keyframes copy-slide-out {\n from {\n opacity: 1;\n transform: translate3d(0, 0, 0) scale(1);\n }\n\n to {\n opacity: 0;\n transform: translate3d(0, -100%, 0) scale(0);\n }\n }\n\n pre,\n code {\n display: block;\n border: none;\n border-radius: var(--border-radius);\n font-size: var(--font-size);\n font-family: var(--code-font-stack);\n text-align: start;\n white-space: pre-wrap;\n outline: none;\n text-shadow: none;\n overflow-wrap: normal;\n tab-size: 4;\n hyphens: none;\n max-inline-size: 100%;\n line-height: 1.8;\n transition-property: box-shadow, background-color, border-color, color;\n }\n\n pre {\n position: relative;\n overflow: visible;\n margin: auto;\n color: var(--code-color);\n background-color: var(--primary-component-bg);\n box-shadow: 0 2px 8px 0 var(--primary-shadow);\n }\n\n pre > code {\n overflow: auto;\n padding: 32px 16px 8px;\n pointer-events: auto;\n }\n\n pre.language-css,\n pre.language-less,\n pre.language-regex {\n color: var(--code-lang-style-color);\n }\n\n pre > .toolbar::after {\n position: absolute;\n z-index: 2;\n display: block;\n border-radius: var(--border-radius) var(--border-radius) 0 0;\n font-size: var(--font-size);\n font-family: Ubuntu, sans-serif;\n font-weight: bold;\n text-align: center;\n color: var(--text-color);\n background-color: var(--code-toolbar-bg, rgb(220 224 229 / 50%));\n box-shadow: 0 1px 5px rgb(0 0 0 / 10%);\n text-transform: uppercase;\n backdrop-filter: blur(10px);\n content: attr(data-language) '';\n block-size: 24px;\n inline-size: 100%;\n line-height: 24px;\n transition-property: background-color, border-color, color;\n inset-block-start: 0;\n inset-inline-start: 0;\n }\n\n pre > .toolbar::before {\n position: absolute;\n z-index: 3;\n display: inline-block;\n border-radius: var(--border-radius);\n text-align: center;\n background-color: #fc625d;\n box-shadow:\n 0 0 0 4px #fc625d,\n 20px 0 0 4px #fdbc40,\n 40px 0 0 4px #35cd4b;\n cursor: pointer;\n content: '';\n block-size: 4px;\n inline-size: 4px;\n inset-block-start: 10px;\n inset-inline-start: 12px;\n }\n\n pre > .toolbar > .toolbar-copy {\n position: absolute;\n z-index: 3;\n border: none;\n padding: 0;\n background: none;\n outline: none;\n cursor: pointer;\n inset-block-start: 0;\n inset-inline-end: 8px;\n }\n\n pre > .toolbar > .toolbar-copy:active {\n transform: scale(0.95);\n }\n\n .toolbar > .toolbar-copy::after {\n display: block;\n font-size: 24px;\n font-family: sans-serif;\n color: var(--text-color);\n user-select: none;\n content: '⎘';\n line-height: 24px;\n transition-property: color, transform;\n }\n\n .toolbar > .toolbar-copy:hover::after {\n color: var(--primary-color, #5794ff);\n }\n\n .not-toolbar > code {\n padding-block-start: 8px !important;\n }\n\n pre::-webkit-scrollbar {\n block-size: 5px;\n inline-size: 5px;\n }\n`;\nexport const darkCss = css({\n ':host': {\n '--code-color': '#eee',\n '--code-lang-style-color': '#fd9170',\n '--code-toolbar-bg': 'rgb(63, 63, 63, 0.7)',\n '--atrule': '#c792ea',\n '--attr-name': '#9cdcfe',\n '--attr-value': '#ce9178',\n '--attr-equals': '#ccc',\n '--attribute': '#a5e844',\n '--boolean': '#c792ea',\n '--builtin': '#ffcb6b',\n '--cdata': '#80cbc4',\n '--char': '#80cbc4',\n '--class': '#ffcb6b',\n '--class-name': '#f2ff00',\n '--comment': '#616161',\n '--constant': '#c792ea',\n '--
|
|
1
|
+
{"version":3,"sources":["../../components/code/style.ts"],"sourcesContent":["import { css } from '@moneko/css';\n\nexport const style = css`\n :host {\n --code-font-stack: 'Liberation Mono', monaco, menlo, consolas, 'Source Code Pro', 'Ubuntu Mono',\n 'Microsoft Yahei', '微软雅黑', courier, 'Helvetica Neue', 'Lantinghei SC', stxihei, wenquanyi,\n sans-serif;\n\n position: relative;\n display: block;\n box-sizing: border-box;\n }\n\n .toolbar::after,\n .toolbar-copy::after,\n pre,\n code {\n transition-duration: var(--transition-duration);\n transition-timing-function: var(--transition-timing-function);\n }\n\n [data-copy]::before {\n position: absolute;\n z-index: 1;\n display: inline-block;\n margin: auto;\n border: 1px solid;\n border-radius: var(--border-radius);\n padding: 4px 8px;\n font-size: var(--font-size-sm);\n transition:\n background-color 0.3s,\n color 0.3s,\n border-color 0.3s;\n content: '复制成功';\n inline-size: fit-content;\n animation-fill-mode: forwards;\n inset-block-start: 32px;\n inset-inline: 0;\n }\n\n [data-copy='success']::before {\n border-color: var(--success-border);\n color: var(--success-color);\n background-color: var(--success-bg);\n animation: copy-slide-in var(--transition-duration) var(--transition-timing-function);\n }\n\n [data-copy='failure']::before {\n border-color: var(--error-border);\n color: var(--error-color);\n background-color: var(--error-bg);\n animation:\n copy-slide-in var(--transition-duration) var(--transition-timing-function),\n error 1s var(--transition-timing-function) 1s;\n content: '复制失败';\n }\n\n [data-copy-exit]::before {\n animation: copy-slide-out var(--transition-duration) forwards var(--transition-timing-function);\n }\n\n @keyframes copy-slide-in {\n from {\n opacity: 0;\n transform: translate3d(0, -100%, 0) scale(0);\n }\n\n to {\n opacity: 1;\n transform: translate3d(0, 0, 0) scale(1);\n }\n }\n\n @keyframes copy-slide-out {\n from {\n opacity: 1;\n transform: translate3d(0, 0, 0) scale(1);\n }\n\n to {\n opacity: 0;\n transform: translate3d(0, -100%, 0) scale(0);\n }\n }\n\n pre,\n code {\n display: block;\n border: none;\n border-radius: var(--border-radius);\n font-size: var(--font-size);\n font-family: var(--code-font-stack);\n text-align: start;\n white-space: pre-wrap;\n outline: none;\n text-shadow: none;\n overflow-wrap: normal;\n tab-size: 4;\n hyphens: none;\n max-inline-size: 100%;\n line-height: 1.8;\n transition-property: box-shadow, background-color, border-color, color;\n }\n\n pre {\n position: relative;\n overflow: visible;\n margin: auto;\n color: var(--code-color);\n background-color: var(--primary-component-bg);\n box-shadow: 0 2px 8px 0 var(--primary-shadow);\n }\n\n pre > code {\n overflow: auto;\n padding: 32px 16px 8px;\n pointer-events: auto;\n }\n\n pre.language-css,\n pre.language-less,\n pre.language-regex {\n color: var(--code-lang-style-color);\n }\n\n pre > .toolbar::after {\n position: absolute;\n z-index: 2;\n display: block;\n border-radius: var(--border-radius) var(--border-radius) 0 0;\n font-size: var(--font-size);\n font-family: Ubuntu, sans-serif;\n font-weight: bold;\n text-align: center;\n color: var(--text-color);\n background-color: var(--code-toolbar-bg, rgb(220 224 229 / 50%));\n box-shadow: 0 1px 5px rgb(0 0 0 / 10%);\n text-transform: uppercase;\n backdrop-filter: blur(10px);\n content: attr(data-language) '';\n block-size: 24px;\n inline-size: 100%;\n line-height: 24px;\n transition-property: background-color, border-color, color;\n inset-block-start: 0;\n inset-inline-start: 0;\n }\n\n pre > .toolbar::before {\n position: absolute;\n z-index: 3;\n display: inline-block;\n border-radius: var(--border-radius);\n text-align: center;\n background-color: #fc625d;\n box-shadow:\n 0 0 0 4px #fc625d,\n 20px 0 0 4px #fdbc40,\n 40px 0 0 4px #35cd4b;\n cursor: pointer;\n content: '';\n block-size: 4px;\n inline-size: 4px;\n inset-block-start: 10px;\n inset-inline-start: 12px;\n }\n\n pre > .toolbar > .toolbar-copy {\n position: absolute;\n z-index: 3;\n border: none;\n padding: 0;\n background: none;\n outline: none;\n cursor: pointer;\n inset-block-start: 0;\n inset-inline-end: 8px;\n }\n\n pre > .toolbar > .toolbar-copy:active {\n transform: scale(0.95);\n }\n\n .toolbar > .toolbar-copy::after {\n display: block;\n font-size: 24px;\n font-family: sans-serif;\n color: var(--text-color);\n user-select: none;\n content: '⎘';\n line-height: 24px;\n transition-property: color, transform;\n }\n\n .toolbar > .toolbar-copy:hover::after {\n color: var(--primary-color, #5794ff);\n }\n\n .not-toolbar > code {\n padding-block-start: 8px !important;\n }\n\n pre::-webkit-scrollbar {\n block-size: 5px;\n inline-size: 5px;\n }\n`;\nexport const darkCss = css({\n ':host': {\n '--code-color': '#eee',\n '--code-lang-style-color': '#fd9170',\n '--code-toolbar-bg': 'rgb(63, 63, 63, 0.7)',\n '--atrule': '#c792ea',\n '--attr-name': '#9cdcfe',\n '--attr-value': '#ce9178',\n '--attr-equals': '#ccc',\n '--attribute': '#a5e844',\n '--boolean': '#c792ea',\n '--builtin': '#ffcb6b',\n '--cdata': '#80cbc4',\n '--char': '#80cbc4',\n '--class': '#ffcb6b',\n '--class-name': '#f2ff00',\n '--comment': '#616161',\n '--constant': '#c792ea',\n '--doctype': '#616161',\n '--entity': '#f66',\n '--function': '#dcdcaa',\n '--hexcode': '#f2ff00',\n '--id': '#c792ea',\n '--important': '#c792ea',\n '--keyword': '#c792ea',\n '--number': '#fd9170',\n '--operator': '#569cd6',\n '--prolog': '#616161',\n '--property': '#80cbc4',\n '--pseudo-class': '#a5e844',\n '--pseudo-element': '#a5e844',\n '--punctuation': '#89ddff',\n '--regex': '#f2ff00',\n '--selector': '#f66',\n '--string': '#a5e844',\n '--symbol': '#c792ea',\n '--tag': '#569cd6',\n '--unit': '#fd9170',\n '--url': '#f66',\n '--variable': '#f66',\n '--inserted-bg': 'rgba(0, 255, 128, .15)',\n '--deleted-bg': 'rgba(255, 0, 0, .15)',\n },\n});\nexport const lightCss = css({\n ':host': {\n '--code-color': '#90a4ae',\n '--code-lang-style-color': '#f76d47',\n '--namespace': 'rgba(56, 64, 68, 0.7)',\n '--tag': '#4b69c6',\n '--atrule': '#7c4dff',\n '--attr-name': '#39adb5',\n '--attr-value': '#f6a434',\n '--attr-equals': '#90a4ae',\n '--attribute': '#f6a434',\n '--boolean': '#7c4dff',\n '--builtin': '#39adb5',\n '--cdata': '#39adb5',\n '--char': '#39adb5',\n '--class': '#39adb5',\n '--class-name': '#6182b8',\n '--comment': '#aabfc9',\n '--constant': '#7c4dff',\n '--doctype': '#aabfc9',\n '--entity': '#e53935',\n '--hexcode': '#f76d47',\n '--id': '#7c4dff',\n '--important': '#7c4dff',\n '--keyword': '#7c4dff',\n '--number': '#f76d47',\n '--operator': '#91b3e0',\n '--prolog': '#aabfc9',\n '--property': '#39adb5',\n '--pseudo-class': '#f6a434',\n '--pseudo-element': '#f6a434',\n '--punctuation': '#39adb5',\n '--regex': '#6182b8',\n '--selector': '#e53935',\n '--string': '#f6a434',\n '--symbol': '#7c4dff',\n '--unit': '#f76d47',\n '--url': '#e53935',\n '--variable': '#e53935',\n '--function': '#4078f2',\n '--name': '#39adb5',\n '--prefix-inserted': 'green',\n '--prefix-deleted': 'red',\n '--inserted-bg': 'rgba(0, 255, 128, .1)',\n '--deleted-bg': 'rgba(255, 0, 0, .1)',\n },\n});\n"],"names":["css","style","darkCss","lightCss"],"mappings":"AAAA,OAASA,OAAAA,CAAG,KAAQ,aAAc,AAElC,QAAO,MAAMC,MAAQD,CAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6MzB,CAAC,AAAC,AACF,QAAO,MAAME,QAAUF,EAAI,CACzB,QAAS,CACP,eAAgB,OAChB,0BAA2B,UAC3B,oBAAqB,uBACrB,WAAY,UACZ,cAAe,UACf,eAAgB,UAChB,gBAAiB,OACjB,cAAe,UACf,YAAa,UACb,YAAa,UACb,UAAW,UACX,SAAU,UACV,UAAW,UACX,eAAgB,UAChB,YAAa,UACb,aAAc,UACd,YAAa,UACb,WAAY,OACZ,aAAc,UACd,YAAa,UACb,OAAQ,UACR,cAAe,UACf,YAAa,UACb,WAAY,UACZ,aAAc,UACd,WAAY,UACZ,aAAc,UACd,iBAAkB,UAClB,mBAAoB,UACpB,gBAAiB,UACjB,UAAW,UACX,aAAc,OACd,WAAY,UACZ,WAAY,UACZ,QAAS,UACT,SAAU,UACV,QAAS,OACT,aAAc,OACd,gBAAiB,yBACjB,eAAgB,sBAClB,CACF,EAAG,AACH,QAAO,MAAMG,SAAWH,EAAI,CAC1B,QAAS,CACP,eAAgB,UAChB,0BAA2B,UAC3B,cAAe,wBACf,QAAS,UACT,WAAY,UACZ,cAAe,UACf,eAAgB,UAChB,gBAAiB,UACjB,cAAe,UACf,YAAa,UACb,YAAa,UACb,UAAW,UACX,SAAU,UACV,UAAW,UACX,eAAgB,UAChB,YAAa,UACb,aAAc,UACd,YAAa,UACb,WAAY,UACZ,YAAa,UACb,OAAQ,UACR,cAAe,UACf,YAAa,UACb,WAAY,UACZ,aAAc,UACd,WAAY,UACZ,aAAc,UACd,iBAAkB,UAClB,mBAAoB,UACpB,gBAAiB,UACjB,UAAW,UACX,aAAc,UACd,WAAY,UACZ,WAAY,UACZ,SAAU,UACV,QAAS,UACT,aAAc,UACd,aAAc,UACd,SAAU,UACV,oBAAqB,QACrB,mBAAoB,MACpB,gBAAiB,wBACjB,eAAgB,qBAClB,CACF,EAAG"}
|
package/es/md/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
function e(e,t,r,o,n,i,l){try{var a=e[i](l),s=a.value}catch(e){r(e);return}a.done?t(s):Promise.resolve(s).then(o,n)}function t(){return(t=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e}).apply(this,arguments)}import{use as r}from"solid-js/web";import{template as o}from"solid-js/web";import"solid-js/web";import{insert as n}from"solid-js/web";import{effect as i}from"solid-js/web";import{createComponent as l}from"solid-js/web";import{className as a}from"solid-js/web";let s=o("<style> "),c=o("<style>"),d=o('<article class="n-md-box" part="box"><div class="n-md-body" part="body">'),u=o('<article part="box">');import{createEffect as m,For as f,Match as h,mergeProps as p,onCleanup as v,Show as g,Switch as b}from"solid-js";import w from"@moneko/common/lib/frameCallback";import{css as x,cx as y}from"@moneko/css";import{customElement as k}from"solid-element";import{clearAttribute as C}from"../basic-config";import j from"../md-style";import E,{block as P}from"../theme";import"../code";import"../img";function $(o){let k,C;let{baseStyle
|
|
1
|
+
function e(e,t,r,o,n,i,l){try{var a=e[i](l),s=a.value}catch(e){r(e);return}a.done?t(s):Promise.resolve(s).then(o,n)}function t(){return(t=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e}).apply(this,arguments)}import{use as r}from"solid-js/web";import{template as o}from"solid-js/web";import"solid-js/web";import{insert as n}from"solid-js/web";import{effect as i}from"solid-js/web";import{createComponent as l}from"solid-js/web";import{className as a}from"solid-js/web";let s=o("<style> "),c=o("<style>"),d=o('<article class="n-md-box" part="box"><div class="n-md-body" part="body">'),u=o('<article part="box">');import{createEffect as m,For as f,Match as h,mergeProps as p,onCleanup as v,Show as g,Switch as b}from"solid-js";import w from"@moneko/common/lib/frameCallback";import{css as x,cx as y}from"@moneko/css";import{customElement as k}from"solid-element";import{clearAttribute as C}from"../basic-config";import j from"../md-style";import E,{block as P}from"../theme";import"../code";import"../img";function $(o){let k,C;let P=/<[^>]+>/,{baseStyle:$}=E,L=p({webWorker:!1,pictureViewer:!0,lazyPicture:!0,text:"",tools:["copy"],getAnchorContainer:()=>window},o);function O(){return new Worker("https://cdn.jsdelivr.net/npm/neko-ui@latest/es/md/worker.js")}let z=L.webWorker?O():void 0;function A(e){C&&(C.innerHTML=e.data)}function T(){var r;return r=function*(e){let{text:r,pictureViewer:o,lazyPicture:n,langToolbar:i}=e,l=function(e,t){if(null==e)return{};var r,o,n={},i=Object.keys(e);for(o=0;o<i.length;o++)t.indexOf(r=i[o])>=0||(n[r]=e[r]);return n}(e,["text","pictureViewer","lazyPicture","langToolbar"]),a=(yield import("marked-completed")).default;k||((k=new a.Renderer).katexBlock=e=>`<n-katex display-mode="true">${e}</n-katex>`,k.katexInline=e=>`<n-katex>${e}</n-katex>`),k.image=(e,t,r)=>`<n-img lazy="${n}" disabled="${!o}" role="img" src="${e}" alt="${r}" ${t?`title="${t}"`:""}></n-img>`;let s=!!(null==i?void 0:i.length);k.code=function(e,t){if("treeview"===t)return`<n-tree data="${e}" />`;let r=P.test(e)?encodeURIComponent(e):e;return`<n-code class="n-code" toolbar="${s}" language="${t}">${r}</n-code>`},A({data:a(r,t({renderer:k,langToolbar:i,headerPrefix:"# ",breaks:!0,pedantic:!1,smartLists:!0,smartypants:!0,xhtml:!0},l))})},(T=function(){var t=this,o=arguments;return new Promise(function(n,i){var l=r.apply(t,o);function a(t){e(l,n,i,a,s,"next",t)}function s(t){e(l,n,i,a,s,"throw",t)}a(void 0)})}).apply(this,arguments)}m(()=>{L.webWorker&&(z||(z=O()),z.addEventListener("message",A))}),m(()=>{z?z.postMessage(JSON.stringify({text:L.text,langToolbar:L.tools,pictureViewer:L.pictureViewer,lazyPicture:L.lazyPicture})):w(()=>(function(e){return T.apply(this,arguments)})({text:L.text,langToolbar:L.tools,pictureViewer:L.pictureViewer,lazyPicture:L.lazyPicture}))}),v(()=>{z&&(z.removeEventListener("message",A),z.terminate())});let V=[],I=[],W=[];function R(e){e.preventDefault(),e.stopPropagation();let t=e.target;if(t.hash){var r;null==C||null==(r=C.querySelector(decodeURIComponent(t.hash)))||r.scrollIntoView({behavior:"smooth",block:"nearest"}),V.forEach(e=>{e.classList.remove("active")}),t.classList.add("active")}else window.open(t.href)}function S(e){e.forEach(e=>{let t;let r=e.target.getAttribute("id"),o=e.target.querySelectorAll("a");if(V.forEach(e=>{e.hash===`#${r}`?t=e:e.hash||o.forEach(r=>{r.href===e.href&&(t=e)})}),t){let r=W.indexOf(t);if(W.forEach(e=>{e.classList.remove("active")}),e.isIntersecting?W.push(t):-1!==r&&W.splice(r,1),W[0]){var n;W[0].classList.add("active"),null==(n=W[0].offsetParent)||n.scrollTo({top:W[0].offsetTop})}}})}return m(()=>{let e;C&&L.text.startsWith("[TOC]")&&(V=[...C.querySelectorAll(".n-md-toc a[href]")],I=[...C.querySelectorAll("h1, h2, h3, h4, h5, h6")],e=new IntersectionObserver(S,{rootMargin:"-50px 0px",threshold:.5}),I.forEach(t=>{e.observe(t)}),V.forEach(e=>{e.addEventListener("click",R)})),v(()=>{e&&(I.forEach(t=>{e.unobserve(t)}),e.disconnect()),V.forEach(e=>{e.removeEventListener("click",R)})})}),[(()=>{let e=s(),t=e.firstChild;return i(()=>t.data=$()),e})(),(()=>{let e=c();return e.textContent=j,e})(),l(g,{get when(){return L.css},get children(){let e=s(),t=e.firstChild;return i(()=>t.data=x(L.css)),e}}),l(b,{get children(){return[l(h,{get when(){return(L.children||[]).length>0},get children(){let e=d();return n(e.firstChild,l(f,{get each(){return L.children},children:e=>e})),e}}),l(h,{get when(){return L.text},get children(){let e=u(),t=C;return"function"==typeof t?r(t,e):C=e,i(()=>a(e,y("n-md-box",L.class))),e}})]}})]}k("n-md",{class:void 0,pictureViewer:void 0,lazyPicture:void 0,text:void 0,tools:void 0,getAnchorContainer:void 0,css:void 0,children:void 0,notRender:void 0,webWorker:void 0},(e,t)=>{let r=t.element,o=p({text:!e.notRender&&r.textContent||r.text,css:r.css,tools:r.tools,getAnchorContainer:r.getAnchorContainer},e);return m(()=>{C(r,["css","text"]),r.replaceChildren()}),[(()=>{let e=c();return e.textContent=P,e})(),l($,o)]});export default $;
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/es/md/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../components/md/index.tsx"],"sourcesContent":["import { createEffect, For, Match, mergeProps, onCleanup, Show, Switch } from 'solid-js';\nimport { frameCallback } from '@moneko/common';\nimport { css, cx } from '@moneko/css';\nimport { customElement } from 'solid-element';\n\nimport type { CustomElement } from '..';\nimport { clearAttribute } from '../basic-config';\nimport mdStyle from '../md-style';\nimport theme, { block } from '../theme';\n\nimport '../code';\nimport '../img';\n\nfunction MD(_props: MdProps) {\n let renderer: marked.Renderer | undefined;\n let ref: HTMLDivElement | undefined;\n const { baseStyle } = theme;\n const props = mergeProps(\n {\n webWorker: false,\n pictureViewer: true,\n lazyPicture: true,\n text: '',\n tools: ['copy'],\n getAnchorContainer: () => window as unknown as HTMLElement,\n },\n _props,\n );\n\n function initWorker() {\n return new Worker('https://cdn.jsdelivr.net/npm/neko-ui@latest/es/md/worker.js');\n }\n // eslint-disable-next-line solid/reactivity\n let worker: Worker | undefined = props.webWorker ? initWorker() : void 0;\n\n function update(e: { data: string }) {\n if (ref) {\n ref.innerHTML = e.data;\n }\n }\n async function postMessage(opt: {\n text: string;\n pictureViewer?: boolean;\n lazyPicture?: boolean;\n langToolbar?: string[];\n }) {\n const { text, pictureViewer, lazyPicture, langToolbar, ...options } = opt;\n const marked = (await import('marked-completed')).default;\n\n if (!renderer) {\n renderer = new marked.Renderer();\n\n renderer.katexBlock = (code: string) => {\n return `<n-katex display-mode=\"true\">${code}</n-katex>`;\n };\n renderer.katexInline = (code: string) => {\n return `<n-katex>${code}</n-katex>`;\n };\n }\n\n renderer.image = (src: string, title: string, alt: string) => {\n return `<n-img lazy=\"${lazyPicture}\" disabled=\"${!pictureViewer}\" role=\"img\" src=\"${src}\" alt=\"${alt}\" ${title ? `title=\"${title}\"` : ''}></n-img>`;\n };\n const toolbar = !!langToolbar?.length;\n\n renderer.code = function (code: string, lang: string) {\n if (lang === 'treeview') {\n return `<n-tree data=\"${code}\" />`;\n }\n\n return `<n-code class=\"n-code\" toolbar=\"${toolbar}\" language=\"${lang}\">${code}</n-code>`;\n };\n\n update({\n data: marked(text, {\n renderer: renderer,\n langToolbar: langToolbar,\n headerPrefix: '# ',\n breaks: true,\n pedantic: false,\n smartLists: true,\n smartypants: true,\n xhtml: true,\n ...options,\n }),\n });\n }\n createEffect(() => {\n if (props.webWorker) {\n if (!worker) {\n worker = initWorker();\n }\n worker.addEventListener('message', update);\n }\n });\n\n createEffect(() => {\n if (worker) {\n worker.postMessage(\n JSON.stringify({\n text: props.text,\n langToolbar: props.tools,\n pictureViewer: props.pictureViewer,\n lazyPicture: props.lazyPicture,\n }),\n );\n } else {\n const call = () =>\n postMessage({\n text: props.text,\n langToolbar: props.tools,\n pictureViewer: props.pictureViewer,\n lazyPicture: props.lazyPicture,\n });\n\n frameCallback(call);\n }\n });\n onCleanup(() => {\n if (worker) {\n worker.removeEventListener('message', update);\n worker.terminate();\n }\n });\n let list: HTMLAnchorElement[] = [];\n let heading: HTMLHeadingElement[] = [];\n const active: HTMLAnchorElement[] = [];\n\n function handleAnchor(e: Event) {\n e.preventDefault();\n e.stopPropagation();\n const a = e.target as HTMLAnchorElement;\n\n if (a.hash) {\n ref?.querySelector(decodeURIComponent(a.hash))?.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n });\n list.forEach((item) => {\n item.classList.remove('active');\n });\n a.classList.add('active');\n } else {\n window.open(a.href);\n }\n }\n function observerEntry(entries: IntersectionObserverEntry[]) {\n entries.forEach((entry) => {\n const id = entry.target.getAttribute('id');\n const all = entry.target.querySelectorAll('a');\n let a: HTMLAnchorElement | undefined;\n\n list.forEach((l) => {\n if (l.hash === `#${id}`) {\n a = l;\n } else if (!l.hash) {\n all.forEach((e) => {\n if (e.href === l.href) {\n a = l;\n }\n });\n }\n });\n if (a) {\n const idx = active.indexOf(a);\n\n active.forEach((e) => {\n e.classList.remove('active');\n });\n if (entry.isIntersecting) {\n active.push(a);\n } else if (idx !== -1) {\n active.splice(idx, 1);\n }\n if (active[0]) {\n active[0].classList.add('active');\n active[0].offsetParent?.scrollTo({\n top: active[0].offsetTop,\n });\n }\n }\n });\n }\n createEffect(() => {\n let observer: IntersectionObserver;\n\n if (ref && props.text.startsWith('[TOC]')) {\n list = [...ref.querySelectorAll<HTMLAnchorElement>('.n-md-toc a[href]')];\n heading = [...ref.querySelectorAll<HTMLHeadingElement>('h1, h2, h3, h4, h5, h6')];\n observer = new IntersectionObserver(observerEntry, {\n rootMargin: '-50px 0px',\n threshold: 0.5,\n });\n heading.forEach((e) => {\n observer.observe(e);\n });\n list.forEach((e) => {\n e.addEventListener('click', handleAnchor);\n });\n }\n onCleanup(() => {\n if (observer) {\n heading.forEach((e) => {\n observer.unobserve(e);\n });\n observer.disconnect();\n }\n list.forEach((e) => {\n e.removeEventListener('click', handleAnchor);\n });\n });\n });\n\n return (\n <>\n <style textContent={baseStyle()} />\n <style textContent={mdStyle} />\n <Show when={props.css}>\n <style textContent={css(props.css)} />\n </Show>\n <Switch>\n <Match when={(props.children || []).length > 0}>\n <article class=\"n-md-box\" part=\"box\">\n <div class=\"n-md-body\" part=\"body\">\n <For each={props.children as []}>{(e) => e}</For>\n </div>\n </article>\n </Match>\n <Match when={props.text}>\n <article ref={ref} class={cx('n-md-box', props.class)} part=\"box\" />\n </Match>\n </Switch>\n </>\n );\n}\n\nexport interface MdProps {\n /** 自定义类名 */\n class?: string;\n /** 自定义样式表 */\n css?: string;\n /** md内容 */\n text?: string;\n /** 开启图片查看器\n * @since 2.0.8\n * @default true\n */\n pictureViewer?: boolean;\n /** 开启图片懒加载\n * @since 2.8.3\n * @default true\n */\n lazyPicture?: boolean;\n /** 开启代码块工具条\n * @default ['copy']\n */\n tools?: 'copy'[];\n /** 指定滚动的容器\n * @default () => window\n */\n getAnchorContainer?: () => HTMLElement;\n /** 不进行解析\n * @default false\n */\n notRender?: boolean;\n children?: JSX.Element;\n /**\n * 使用 web worker\n */\n webWorker?: boolean;\n}\n\nexport type MdElement = CustomElement<MdProps>;\n\ncustomElement<MdProps>(\n 'n-md',\n {\n class: void 0,\n pictureViewer: void 0,\n lazyPicture: void 0,\n text: void 0,\n tools: void 0,\n getAnchorContainer: void 0,\n css: void 0,\n children: void 0,\n notRender: void 0,\n webWorker: void 0,\n },\n (_, opt) => {\n const el = opt.element;\n const props = mergeProps(\n {\n text: (!_.notRender && el.textContent) || el.text,\n css: el.css,\n tools: el.tools,\n getAnchorContainer: el.getAnchorContainer,\n },\n _,\n );\n\n createEffect(() => {\n clearAttribute(el, ['css', 'text']);\n el.replaceChildren();\n });\n return (\n <>\n <style textContent={block} />\n <MD {...props} />\n </>\n );\n },\n);\nexport default MD;\n"],"names":["createEffect","For","Match","mergeProps","onCleanup","Show","Switch","frameCallback","css","cx","customElement","clearAttribute","mdStyle","theme","block","MD","_props","renderer","ref","baseStyle","props","webWorker","pictureViewer","lazyPicture","text","tools","getAnchorContainer","window","initWorker","Worker","worker","update","e","innerHTML","data","postMessage","opt","langToolbar","options","marked","default","Renderer","katexBlock","code","katexInline","image","src","title","alt","toolbar","length","lang","headerPrefix","breaks","pedantic","smartLists","smartypants","xhtml","addEventListener","JSON","stringify","removeEventListener","terminate","list","heading","active","handleAnchor","preventDefault","stopPropagation","a","target","hash","querySelector","decodeURIComponent","scrollIntoView","behavior","forEach","item","classList","remove","add","open","href","observerEntry","entries","entry","id","getAttribute","all","querySelectorAll","l","idx","indexOf","isIntersecting","push","splice","offsetParent","scrollTo","top","offsetTop","observer","startsWith","IntersectionObserver","rootMargin","threshold","observe","unobserve","disconnect","children","class","notRender","_","el","element","textContent","replaceChildren"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../components/md/index.tsx"],"sourcesContent":["import { createEffect, For, Match, mergeProps, onCleanup, Show, Switch } from 'solid-js';\nimport { frameCallback } from '@moneko/common';\nimport { css, cx } from '@moneko/css';\nimport { customElement } from 'solid-element';\n\nimport type { CustomElement } from '..';\nimport { clearAttribute } from '../basic-config';\nimport mdStyle from '../md-style';\nimport theme, { block } from '../theme';\n\nimport '../code';\nimport '../img';\n\nfunction MD(_props: MdProps) {\n let renderer: marked.Renderer | undefined;\n let ref: HTMLDivElement | undefined;\n const needEndod = /<[^>]+>/;\n const { baseStyle } = theme;\n const props = mergeProps(\n {\n webWorker: false,\n pictureViewer: true,\n lazyPicture: true,\n text: '',\n tools: ['copy'],\n getAnchorContainer: () => window as unknown as HTMLElement,\n },\n _props,\n );\n\n function initWorker() {\n return new Worker('https://cdn.jsdelivr.net/npm/neko-ui@latest/es/md/worker.js');\n }\n // eslint-disable-next-line solid/reactivity\n let worker: Worker | undefined = props.webWorker ? initWorker() : void 0;\n\n function update(e: { data: string }) {\n if (ref) {\n ref.innerHTML = e.data;\n }\n }\n async function postMessage(opt: {\n text: string;\n pictureViewer?: boolean;\n lazyPicture?: boolean;\n langToolbar?: string[];\n }) {\n const { text, pictureViewer, lazyPicture, langToolbar, ...options } = opt;\n const marked = (await import('marked-completed')).default;\n\n if (!renderer) {\n renderer = new marked.Renderer();\n\n renderer.katexBlock = (code: string) => {\n return `<n-katex display-mode=\"true\">${code}</n-katex>`;\n };\n renderer.katexInline = (code: string) => {\n return `<n-katex>${code}</n-katex>`;\n };\n }\n\n renderer.image = (src: string, title: string, alt: string) => {\n return `<n-img lazy=\"${lazyPicture}\" disabled=\"${!pictureViewer}\" role=\"img\" src=\"${src}\" alt=\"${alt}\" ${title ? `title=\"${title}\"` : ''}></n-img>`;\n };\n const toolbar = !!langToolbar?.length;\n\n renderer.code = function (code: string, lang: string) {\n if (lang === 'treeview') {\n return `<n-tree data=\"${code}\" />`;\n }\n const source = needEndod.test(code) ? encodeURIComponent(code) : code;\n\n return `<n-code class=\"n-code\" toolbar=\"${toolbar}\" language=\"${lang}\">${source}</n-code>`;\n };\n\n update({\n data: marked(text, {\n renderer: renderer,\n langToolbar: langToolbar,\n headerPrefix: '# ',\n breaks: true,\n pedantic: false,\n smartLists: true,\n smartypants: true,\n xhtml: true,\n ...options,\n }),\n });\n }\n createEffect(() => {\n if (props.webWorker) {\n if (!worker) {\n worker = initWorker();\n }\n worker.addEventListener('message', update);\n }\n });\n\n createEffect(() => {\n if (worker) {\n worker.postMessage(\n JSON.stringify({\n text: props.text,\n langToolbar: props.tools,\n pictureViewer: props.pictureViewer,\n lazyPicture: props.lazyPicture,\n }),\n );\n } else {\n const call = () =>\n postMessage({\n text: props.text,\n langToolbar: props.tools,\n pictureViewer: props.pictureViewer,\n lazyPicture: props.lazyPicture,\n });\n\n frameCallback(call);\n }\n });\n onCleanup(() => {\n if (worker) {\n worker.removeEventListener('message', update);\n worker.terminate();\n }\n });\n let list: HTMLAnchorElement[] = [];\n let heading: HTMLHeadingElement[] = [];\n const active: HTMLAnchorElement[] = [];\n\n function handleAnchor(e: Event) {\n e.preventDefault();\n e.stopPropagation();\n const a = e.target as HTMLAnchorElement;\n\n if (a.hash) {\n ref?.querySelector(decodeURIComponent(a.hash))?.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n });\n list.forEach((item) => {\n item.classList.remove('active');\n });\n a.classList.add('active');\n } else {\n window.open(a.href);\n }\n }\n function observerEntry(entries: IntersectionObserverEntry[]) {\n entries.forEach((entry) => {\n const id = entry.target.getAttribute('id');\n const all = entry.target.querySelectorAll('a');\n let a: HTMLAnchorElement | undefined;\n\n list.forEach((l) => {\n if (l.hash === `#${id}`) {\n a = l;\n } else if (!l.hash) {\n all.forEach((e) => {\n if (e.href === l.href) {\n a = l;\n }\n });\n }\n });\n if (a) {\n const idx = active.indexOf(a);\n\n active.forEach((e) => {\n e.classList.remove('active');\n });\n if (entry.isIntersecting) {\n active.push(a);\n } else if (idx !== -1) {\n active.splice(idx, 1);\n }\n if (active[0]) {\n active[0].classList.add('active');\n active[0].offsetParent?.scrollTo({\n top: active[0].offsetTop,\n });\n }\n }\n });\n }\n createEffect(() => {\n let observer: IntersectionObserver;\n\n if (ref && props.text.startsWith('[TOC]')) {\n list = [...ref.querySelectorAll<HTMLAnchorElement>('.n-md-toc a[href]')];\n heading = [...ref.querySelectorAll<HTMLHeadingElement>('h1, h2, h3, h4, h5, h6')];\n observer = new IntersectionObserver(observerEntry, {\n rootMargin: '-50px 0px',\n threshold: 0.5,\n });\n heading.forEach((e) => {\n observer.observe(e);\n });\n list.forEach((e) => {\n e.addEventListener('click', handleAnchor);\n });\n }\n onCleanup(() => {\n if (observer) {\n heading.forEach((e) => {\n observer.unobserve(e);\n });\n observer.disconnect();\n }\n list.forEach((e) => {\n e.removeEventListener('click', handleAnchor);\n });\n });\n });\n\n return (\n <>\n <style textContent={baseStyle()} />\n <style textContent={mdStyle} />\n <Show when={props.css}>\n <style textContent={css(props.css)} />\n </Show>\n <Switch>\n <Match when={(props.children || []).length > 0}>\n <article class=\"n-md-box\" part=\"box\">\n <div class=\"n-md-body\" part=\"body\">\n <For each={props.children as []}>{(e) => e}</For>\n </div>\n </article>\n </Match>\n <Match when={props.text}>\n <article ref={ref} class={cx('n-md-box', props.class)} part=\"box\" />\n </Match>\n </Switch>\n </>\n );\n}\n\nexport interface MdProps {\n /** 自定义类名 */\n class?: string;\n /** 自定义样式表 */\n css?: string;\n /** md内容 */\n text?: string;\n /** 开启图片查看器\n * @since 2.0.8\n * @default true\n */\n pictureViewer?: boolean;\n /** 开启图片懒加载\n * @since 2.8.3\n * @default true\n */\n lazyPicture?: boolean;\n /** 开启代码块工具条\n * @default ['copy']\n */\n tools?: 'copy'[];\n /** 指定滚动的容器\n * @default () => window\n */\n getAnchorContainer?: () => HTMLElement;\n /** 不进行解析\n * @default false\n */\n notRender?: boolean;\n children?: JSX.Element;\n /**\n * 使用 web worker\n */\n webWorker?: boolean;\n}\n\nexport type MdElement = CustomElement<MdProps>;\n\ncustomElement<MdProps>(\n 'n-md',\n {\n class: void 0,\n pictureViewer: void 0,\n lazyPicture: void 0,\n text: void 0,\n tools: void 0,\n getAnchorContainer: void 0,\n css: void 0,\n children: void 0,\n notRender: void 0,\n webWorker: void 0,\n },\n (_, opt) => {\n const el = opt.element;\n const props = mergeProps(\n {\n text: (!_.notRender && el.textContent) || el.text,\n css: el.css,\n tools: el.tools,\n getAnchorContainer: el.getAnchorContainer,\n },\n _,\n );\n\n createEffect(() => {\n clearAttribute(el, ['css', 'text']);\n el.replaceChildren();\n });\n return (\n <>\n <style textContent={block} />\n <MD {...props} />\n </>\n );\n },\n);\nexport default MD;\n"],"names":["createEffect","For","Match","mergeProps","onCleanup","Show","Switch","frameCallback","css","cx","customElement","clearAttribute","mdStyle","theme","block","MD","_props","renderer","ref","needEndod","baseStyle","props","webWorker","pictureViewer","lazyPicture","text","tools","getAnchorContainer","window","initWorker","Worker","worker","update","e","innerHTML","data","postMessage","opt","langToolbar","options","marked","default","Renderer","katexBlock","code","katexInline","image","src","title","alt","toolbar","length","lang","source","test","encodeURIComponent","headerPrefix","breaks","pedantic","smartLists","smartypants","xhtml","addEventListener","JSON","stringify","removeEventListener","terminate","list","heading","active","handleAnchor","preventDefault","stopPropagation","a","target","hash","querySelector","decodeURIComponent","scrollIntoView","behavior","forEach","item","classList","remove","add","open","href","observerEntry","entries","entry","id","getAttribute","all","querySelectorAll","l","idx","indexOf","isIntersecting","push","splice","offsetParent","scrollTo","top","offsetTop","observer","startsWith","IntersectionObserver","rootMargin","threshold","observe","unobserve","disconnect","children","class","notRender","_","el","element","textContent","replaceChildren"],"mappings":"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"}
|
package/es/prism/index.d.ts
CHANGED
|
@@ -18,5 +18,4 @@ import 'prismjs/components/prism-toml.js';
|
|
|
18
18
|
import 'prismjs/components/prism-typescript.js';
|
|
19
19
|
import 'prismjs/components/prism-yaml.js';
|
|
20
20
|
import 'prismjs/components/prism-matlab.js';
|
|
21
|
-
import 'prismjs/plugins/highlight-keywords/prism-highlight-keywords.js';
|
|
22
21
|
export default Prism;
|
package/es/prism/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import s from"prismjs";import"prismjs/components/prism-bash.js";import"prismjs/components/prism-clike.js";import"prismjs/components/prism-css.js";import"prismjs/components/prism-docker.js";import"prismjs/components/prism-git.js";import"prismjs/components/prism-javascript.js";import"prismjs/components/prism-json.js";import"prismjs/components/prism-jsx.js";import"prismjs/components/prism-tsx.js";import"prismjs/components/prism-less.js";import"prismjs/components/prism-markup.js";import"prismjs/components/prism-regex.js";import"prismjs/components/prism-rust.js";import"prismjs/components/prism-sql.js";import"prismjs/components/prism-swift.js";import"prismjs/components/prism-toml.js";import"prismjs/components/prism-typescript.js";import"prismjs/components/prism-yaml.js";import"prismjs/components/prism-matlab.js";
|
|
1
|
+
import s from"prismjs";import"prismjs/components/prism-bash.js";import"prismjs/components/prism-clike.js";import"prismjs/components/prism-css.js";import"prismjs/components/prism-docker.js";import"prismjs/components/prism-git.js";import"prismjs/components/prism-javascript.js";import"prismjs/components/prism-json.js";import"prismjs/components/prism-jsx.js";import"prismjs/components/prism-tsx.js";import"prismjs/components/prism-less.js";import"prismjs/components/prism-markup.js";import"prismjs/components/prism-regex.js";import"prismjs/components/prism-rust.js";import"prismjs/components/prism-sql.js";import"prismjs/components/prism-swift.js";import"prismjs/components/prism-toml.js";import"prismjs/components/prism-typescript.js";import"prismjs/components/prism-yaml.js";import"prismjs/components/prism-matlab.js";export default s;
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/es/prism/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../components/prism/index.ts"],"sourcesContent":["import Prism from 'prismjs';\n\n// language\nimport 'prismjs/components/prism-bash.js'; // shell + sh + bash\nimport 'prismjs/components/prism-clike.js';\nimport 'prismjs/components/prism-css.js';\nimport 'prismjs/components/prism-docker.js'; // docker + dockerfile\nimport 'prismjs/components/prism-git.js'; // diff\nimport 'prismjs/components/prism-javascript.js'; // javascript + js\nimport 'prismjs/components/prism-json.js'; // json + webmanifest\nimport 'prismjs/components/prism-jsx.js';\nimport 'prismjs/components/prism-tsx.js';\nimport 'prismjs/components/prism-less.js';\nimport 'prismjs/components/prism-markup.js'; // html + mathml + svg + xml + ssml + atom + rss\nimport 'prismjs/components/prism-regex.js';\nimport 'prismjs/components/prism-rust.js';\nimport 'prismjs/components/prism-sql.js';\nimport 'prismjs/components/prism-swift.js';\nimport 'prismjs/components/prism-toml.js';\nimport 'prismjs/components/prism-typescript.js'; // typescript + ts\nimport 'prismjs/components/prism-yaml.js'; // yaml + yml\nimport 'prismjs/components/prism-matlab.js';\n
|
|
1
|
+
{"version":3,"sources":["../../components/prism/index.ts"],"sourcesContent":["import Prism from 'prismjs';\n\n// language\nimport 'prismjs/components/prism-bash.js'; // shell + sh + bash\nimport 'prismjs/components/prism-clike.js';\nimport 'prismjs/components/prism-css.js';\nimport 'prismjs/components/prism-docker.js'; // docker + dockerfile\nimport 'prismjs/components/prism-git.js'; // diff\nimport 'prismjs/components/prism-javascript.js'; // javascript + js\nimport 'prismjs/components/prism-json.js'; // json + webmanifest\nimport 'prismjs/components/prism-jsx.js';\nimport 'prismjs/components/prism-tsx.js';\nimport 'prismjs/components/prism-less.js';\nimport 'prismjs/components/prism-markup.js'; // html + mathml + svg + xml + ssml + atom + rss\nimport 'prismjs/components/prism-regex.js';\nimport 'prismjs/components/prism-rust.js';\nimport 'prismjs/components/prism-sql.js';\nimport 'prismjs/components/prism-swift.js';\nimport 'prismjs/components/prism-toml.js';\nimport 'prismjs/components/prism-typescript.js'; // typescript + ts\nimport 'prismjs/components/prism-yaml.js'; // yaml + yml\nimport 'prismjs/components/prism-matlab.js';\n\nexport default Prism;\n"],"names":["Prism"],"mappings":"AAAA,OAAOA,MAAW,SAAU,AAG5B,OAAO,kCAAmC,AAC1C,OAAO,mCAAoC,AAC3C,OAAO,iCAAkC,AACzC,OAAO,oCAAqC,AAC5C,OAAO,iCAAkC,AACzC,OAAO,wCAAyC,AAChD,OAAO,kCAAmC,AAC1C,OAAO,iCAAkC,AACzC,OAAO,iCAAkC,AACzC,OAAO,kCAAmC,AAC1C,OAAO,oCAAqC,AAC5C,OAAO,mCAAoC,AAC3C,OAAO,kCAAmC,AAC1C,OAAO,iCAAkC,AACzC,OAAO,mCAAoC,AAC3C,OAAO,kCAAmC,AAC1C,OAAO,wCAAyC,AAChD,OAAO,kCAAmC,AAC1C,OAAO,oCAAqC,AAE5C,gBAAeA,CAAM"}
|
package/lib/code/index.d.ts
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import { type JSX } from 'solid-js';
|
|
2
2
|
import type { CustomElement } from '..';
|
|
3
|
-
export type
|
|
3
|
+
export type LanguageBase = 'bash' | 'shell' | 'sh' | 'clike' | 'css' | 'docker' | 'dockerfile' | 'git' | 'javascript' | 'js' | 'json' | 'webmanifest' | 'jsx' | 'tsx' | 'less' | 'html' | 'mathml' | 'svg' | 'xml' | 'ssml' | 'atom' | 'rss' | 'regex' | 'rust' | 'sql' | 'swift' | 'toml' | 'typescript' | 'ts' | 'yaml' | 'yml' | 'matlab';
|
|
4
|
+
type ExcludeLanguage<T extends LanguageBase, U extends LanguageBase> = T extends U ? never : T;
|
|
5
|
+
export type Language = LanguageBase | {
|
|
6
|
+
[T in LanguageBase]: `${T} ${ExcludeLanguage<LanguageBase, T>}`;
|
|
7
|
+
}[LanguageBase];
|
|
4
8
|
export interface CodeProps {
|
|
5
9
|
/** 自定义类名 */
|
|
6
10
|
class?: string;
|
|
@@ -8,7 +12,7 @@ export interface CodeProps {
|
|
|
8
12
|
css?: string;
|
|
9
13
|
/** 内容 */
|
|
10
14
|
code?: string;
|
|
11
|
-
/**
|
|
15
|
+
/** 语言(支持多种语言配置:如 `html css javascript`)
|
|
12
16
|
* @default 'markup'
|
|
13
17
|
*/
|
|
14
18
|
language?: Language;
|
package/lib/code/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"default",{enumerable:!0,get:function(){return
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"default",{enumerable:!0,get:function(){return m}});const e=require("solid-js/web"),t=require("solid-js"),r=c(require("@moneko/common/lib/isFunction")),n=c(require("@moneko/common/lib/setClipboard")),i=require("@moneko/css"),o=require("solid-element"),l=require("../basic-config"),a=c(require("../theme")),s=require("./style");function c(e){return e&&e.__esModule?e:{default:e}}function u(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(u=function(e){return e?r:t})(e)}const d=(0,e.template)("<style> "),f=(0,e.template)("<style>"),g=(0,e.template)('<div class="toolbar"><button class="toolbar-copy" aria-label="copy">'),h=(0,e.template)("<pre><code>");function p(o){let l,c;let{isDark:p}=a.default,m=/%[0-9A-Fa-f]{2}/,v=(0,t.createUniqueId)(),[C,b]=(0,t.createSignal)(""),[w,y]=(0,t.createSignal)();async function S(){return window.Prism?(window.Prism.disableWorkerMessageHandler=!0,window.Prism.manual=!0,window.Prism):(await Promise.resolve().then(()=>(function(e,t){if(e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var r=u(void 0);if(r&&r.has(e))return r.get(e);var n={__proto__:null},i=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e)if("default"!==o&&Object.prototype.hasOwnProperty.call(e,o)){var l=i?Object.getOwnPropertyDescriptor(e,o):null;l&&(l.get||l.set)?Object.defineProperty(n,o,l):n[o]=e[o]}return n.default=e,r&&r.set(e,n),n})(require("../prism")))).default}let[k]=(0,t.createResource)("prism",S),_=(0,t.createMemo)(()=>o.language?.split(" ").pop());function j(){(0,n.default)((0,t.untrack)(C),l)}(0,t.createEffect)(()=>{let e=o.code||"";m.test(e)&&(e=decodeURIComponent(e)),l.normalize(),e!==l.textContent&&b(e)});let P=function(e){e.target.normalize();let t=e.target.textContent;$(o.language,t,!0),(0,r.default)(o.onChange)&&o.onChange(t)};function $(e="markup",t,r,n={}){c&&(clearTimeout(c),c=void 0);let i=k();t&&i&&(c=setTimeout(()=>{if(clearTimeout(c),CSS.highlights){r&&CSS.highlights.forEach((e,t)=>{t.startsWith(v)&&e.clear()});let o=e.split(" "),a=i.languages[o[0]];a&&function e(t,r,n,i=0){let o=i;if(Array.isArray(r)){for(let i=0,l=r.length;i<l;i++){let l=r[i];if("object"!=typeof l){o+=l.length;continue}o=e(t,l,n,o)}return o}if("object"==typeof r&&r.type&&t.firstChild){let i=(r.alias??r.type).toString(),l=v+i,a=new Range;["deleted","inserted"].includes(i)?a.setStart(t.firstChild,o+2):a.setStart(t.firstChild,o),Array.isArray(r.content)?o=e(t,r.content,n,o):"string"==typeof r.content&&(o+=r.content.length),a.setEnd(t.firstChild,o),function(e,t,r,n){let i=CSS.highlights.get(e);i?i.add(r):CSS.highlights.set(e,new Highlight().add(r)),void 0===n[e]&&(n[e]=`::highlight(${e}){color:var(--${t});background-color:var(--${t}-bg);text-decoration:var(--${t}-text-decoration);text-shadow:var(--${t}-text-shadow);-webkit-text-stroke-width:var(--${t}-stroke-width);-webkit-text-stroke-color:var(--${t}-stroke-color);}`)}(l,i,a,n)}return o}(l,i.tokenize(t,a),n),o.length>1||"git"===o[0]?$(o[1],t,!1,n):y(Object.values(n).join(""))}else throw Error("不支持 CSS Highlights");c=void 0},0))}return(0,t.createEffect)(()=>{$(o.language,C(),!0)}),(0,t.onCleanup)(()=>{if(CSS.highlights)for(let e of CSS.highlights.keys())e.startsWith(v)&&CSS.highlights.delete(e)}),[(()=>{let t=d(),r=t.firstChild;return(0,e.effect)(()=>r.data=p()?s.darkCss:s.lightCss),t})(),(()=>{let t=d(),r=t.firstChild;return(0,e.effect)(()=>r.data=w()),t})(),(()=>{let e=f();return e.textContent=s.style,e})(),(0,e.createComponent)(t.Show,{get when(){return o.css},get children(){let t=d(),r=t.firstChild;return(0,e.effect)(()=>r.data=(0,i.css)(o.css)),t}}),(()=>{let r=h(),n=r.firstChild,i=l;return(0,e.insert)(r,(0,e.createComponent)(t.Show,{get when(){return o.toolbar},get children(){let t=g(),r=t.firstChild;return(0,e.addEventListener)(r,"click",j,!0),(0,e.effect)(()=>(0,e.setAttribute)(t,"data-language",_())),t}}),n),(0,e.addEventListener)(n,"input",P,!0),"function"==typeof i?(0,e.use)(i,n):l=n,(0,e.setAttribute)(n,"spellcheck",!1),(0,e.insert)(n,C),(0,e.effect)(t=>{let i={[`language-${o.language}`]:!!o.language,"not-toolbar":!o.toolbar,[o.class]:!o.edit},l=o.edit;return t._v$=(0,e.classList)(r,i,t._v$),l!==t._v$2&&(0,e.setAttribute)(n,"contenteditable",t._v$2=l),t},{_v$:void 0,_v$2:void 0}),r})()]}(0,o.customElement)("n-code",{class:void 0,code:void 0,language:void 0,children:void 0,edit:void 0,toolbar:void 0,css:void 0,onChange:void 0},(r,n)=>{let{baseStyle:i}=a.default,o=n.element,s=(0,t.mergeProps)({code:o.textContent,css:o.css,onChange(e){o.dispatchEvent(new CustomEvent("change",{detail:e}))}},r);return(0,t.createEffect)(()=>{(0,l.clearAttribute)(o,["css","code"]),o.replaceChildren()}),[(()=>{let t=d(),r=t.firstChild;return(0,e.effect)(()=>r.data=i()),t})(),(0,e.createComponent)(p,(0,e.mergeProps)({language:"atom"},s))]});const m=p;(0,e.delegateEvents)(["click","input"]);
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/lib/code/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../components/code/index.tsx"],"sourcesContent":["import {\n createEffect,\n createResource,\n createSignal,\n createUniqueId,\n type JSX,\n mergeProps,\n onCleanup,\n Show,\n untrack,\n} from 'solid-js';\nimport { isFunction, setClipboard } from '@moneko/common';\nimport { css } from '@moneko/css';\nimport type { TokenStream } from 'prismjs';\nimport { customElement } from 'solid-element';\n\nimport type { CustomElement } from '..';\nimport { clearAttribute } from '../basic-config';\nimport theme from '../theme';\n\nimport { darkCss, lightCss, style } from './style';\n\nexport type Language =\n | 'bash'\n | 'shell'\n | 'sh'\n | 'clike'\n | 'css'\n | 'docker'\n | 'dockerfile'\n | 'git'\n | 'diff'\n | 'javascript'\n | 'js'\n | 'json'\n | 'webmanifest'\n | 'jsx'\n | 'tsx'\n | 'less'\n | 'html'\n | 'mathml'\n | 'svg'\n | 'xml'\n | 'ssml'\n | 'atom'\n | 'rss'\n | 'regex'\n | 'rust'\n | 'sql'\n | 'swift'\n | 'toml'\n | 'typescript'\n | 'ts'\n | 'yaml'\n | 'yml'\n | 'matlab';\n\nexport interface CodeProps {\n /** 自定义类名 */\n class?: string;\n /** 自定义样式表 */\n css?: string;\n /** 内容 */\n code?: string;\n /** 语言\n * @default 'markup'\n */\n language?: Language;\n /** 支持编辑 */\n edit?: boolean;\n /** 开启代码块工具条 */\n toolbar?: boolean;\n /** 编辑修改时的回调 */\n onChange?(code: string): void;\n children?: JSX.Element;\n}\nexport type CodeElement = CustomElement<CodeProps>;\n\nfunction Code(props: CodeProps) {\n const { isDark } = theme;\n let codeEl: HTMLPreElement;\n let timer: NodeJS.Timeout | undefined;\n const diffLang = /^diff-([\\w-]+)/i;\n const decoded = /%[0-9A-Fa-f]{2}/;\n const id = createUniqueId();\n const [code, setCode] = createSignal<string>('');\n const [highlightCss, setHighlightCss] = createSignal<string>();\n\n async function fetchPrism() {\n if (!window.Prism) {\n return (await import('../prism')).default;\n }\n return window.Prism;\n }\n const [prismJS] = createResource('prism', fetchPrism);\n\n createEffect(() => {\n let _next = props.code || '';\n\n if (decoded.test(_next)) {\n _next = decodeURIComponent(_next);\n }\n codeEl.normalize();\n if (_next !== codeEl.textContent) {\n setCode(_next);\n }\n });\n\n function copy() {\n setClipboard(untrack(code), codeEl);\n }\n const change: JSX.InputEventHandlerUnion<HTMLElement, InputEvent> = function (e) {\n e.target.normalize();\n const next = e.target.textContent;\n\n syntax(props.language, next);\n if (isFunction(props.onChange)) {\n props.onChange(next);\n }\n };\n\n function highlighter(el: HTMLPreElement, tokenize: TokenStream, start = 0) {\n let pos = start;\n\n if (Array.isArray(tokenize)) {\n for (let i = 0, len = tokenize.length; i < len; i++) {\n const token = tokenize[i];\n\n if (typeof token !== 'object') {\n pos += token.length;\n continue;\n }\n pos = highlighter(el, token, pos);\n }\n return pos;\n }\n if (typeof tokenize === 'object' && tokenize.type) {\n if (el.firstChild) {\n const key = id + (tokenize.alias ?? tokenize.type);\n const range = new Range();\n\n range.setStart(el.firstChild, pos);\n if (Array.isArray(tokenize.content)) {\n pos = highlighter(el, tokenize.content, pos);\n } else if (typeof tokenize.content === 'string') {\n pos += tokenize.content.length;\n }\n range.setEnd(el.firstChild, pos);\n const highlight = CSS.highlights.get(key);\n\n if (highlight) {\n highlight.add(range);\n } else {\n CSS.highlights.set(key, new Highlight().add(range));\n }\n }\n }\n\n return pos;\n }\n function syntax(language = 'markup', value: string | null) {\n if (timer) {\n clearTimeout(timer);\n timer = void 0;\n }\n const Prism = prismJS();\n\n if (!value || !Prism) return;\n timer = setTimeout(() => {\n clearTimeout(timer);\n\n if (CSS.highlights) {\n CSS.highlights.forEach((highlight, key) => {\n if (key.startsWith(id)) {\n highlight.clear();\n }\n });\n const grammar =\n Prism.languages[diffLang.test(language) ? 'diff' : language] || Prism.languages.markup;\n\n highlighter(codeEl, Prism.tokenize(value, grammar));\n setHighlightCss(() => {\n const len = id.length;\n let style = '';\n\n for (const key of CSS.highlights.keys()) {\n if (key.startsWith(id)) {\n style += `::highlight(${key}){color:var(--${key.substring(len)});}`;\n }\n }\n return style;\n });\n } else {\n throw Error('不支持 CSS Highlights');\n }\n timer = void 0;\n }, 0);\n }\n createEffect(() => {\n syntax(props.language, code());\n });\n onCleanup(() => {\n if (CSS.highlights) {\n for (const key of CSS.highlights.keys()) {\n if (key.startsWith(id)) {\n CSS.highlights.delete(key);\n }\n }\n }\n });\n\n return (\n <>\n <style textContent={isDark() ? darkCss : lightCss} />\n <style textContent={highlightCss()} />\n <style textContent={style} />\n <Show when={props.css}>\n <style textContent={css(props.css)} />\n </Show>\n <pre\n classList={{\n [`language-${props.language}`]: !!props.language,\n 'not-toolbar': !props.toolbar,\n [props.class!]: !props.edit,\n }}\n >\n <Show when={props.toolbar}>\n <div class=\"toolbar\" data-language={props.language?.split(' ')[0]}>\n <button class=\"toolbar-copy\" aria-label=\"copy\" onClick={copy} />\n </div>\n </Show>\n <code ref={codeEl!} contenteditable={props.edit} spellcheck={false} onInput={change}>\n {code()}\n </code>\n </pre>\n </>\n );\n}\n\ncustomElement<CodeProps>(\n 'n-code',\n {\n class: void 0,\n code: void 0,\n language: void 0,\n children: void 0,\n edit: void 0,\n toolbar: void 0,\n css: void 0,\n onChange: void 0,\n },\n (_, opt) => {\n const { baseStyle } = theme;\n const el = opt.element;\n const props = mergeProps(\n {\n code: el.textContent,\n css: el.css,\n onChange(val: string) {\n el.dispatchEvent(\n new CustomEvent('change', {\n detail: val,\n }),\n );\n },\n },\n _,\n );\n\n createEffect(() => {\n clearAttribute(el, ['css', 'code']);\n el.replaceChildren();\n });\n return (\n <>\n <style textContent={baseStyle()} />\n <Code {...props} />\n </>\n );\n },\n);\nexport default Code;\n"],"names":["Code","props","codeEl","timer","isDark","theme","diffLang","decoded","id","createUniqueId","code","setCode","createSignal","highlightCss","setHighlightCss","fetchPrism","window","Prism","default","prismJS","createResource","copy","setClipboard","untrack","createEffect","_next","test","decodeURIComponent","normalize","textContent","change","e","target","next","syntax","language","isFunction","onChange","value","clearTimeout","setTimeout","CSS","highlights","forEach","highlight","key","startsWith","clear","grammar","languages","markup","highlighter","el","tokenize","start","pos","Array","isArray","i","len","length","token","type","firstChild","alias","range","Range","setStart","content","setEnd","get","add","set","Highlight","style","keys","substring","Error","onCleanup","delete","darkCss","lightCss","Show","css","toolbar","split","class","edit","customElement","children","_","opt","baseStyle","element","mergeProps","val","dispatchEvent","CustomEvent","detail","clearAttribute","replaceChildren"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../components/code/index.tsx"],"sourcesContent":["import {\n createEffect,\n createMemo,\n createResource,\n createSignal,\n createUniqueId,\n type JSX,\n mergeProps,\n onCleanup,\n Show,\n untrack,\n} from 'solid-js';\nimport { isFunction, setClipboard } from '@moneko/common';\nimport { css } from '@moneko/css';\nimport type { TokenStream } from 'prismjs';\nimport { customElement } from 'solid-element';\n\nimport type { CustomElement } from '..';\nimport { clearAttribute } from '../basic-config';\nimport theme from '../theme';\n\nimport { darkCss, lightCss, style } from './style';\n\nexport type LanguageBase =\n | 'bash'\n | 'shell'\n | 'sh'\n | 'clike'\n | 'css'\n | 'docker'\n | 'dockerfile'\n | 'git'\n | 'javascript'\n | 'js'\n | 'json'\n | 'webmanifest'\n | 'jsx'\n | 'tsx'\n | 'less'\n | 'html'\n | 'mathml'\n | 'svg'\n | 'xml'\n | 'ssml'\n | 'atom'\n | 'rss'\n | 'regex'\n | 'rust'\n | 'sql'\n | 'swift'\n | 'toml'\n | 'typescript'\n | 'ts'\n | 'yaml'\n | 'yml'\n | 'matlab';\n\ntype ExcludeLanguage<T extends LanguageBase, U extends LanguageBase> = T extends U ? never : T;\n\nexport type Language =\n | LanguageBase\n | {\n [T in LanguageBase]: `${T} ${ExcludeLanguage<LanguageBase, T>}`;\n }[LanguageBase];\nexport interface CodeProps {\n /** 自定义类名 */\n class?: string;\n /** 自定义样式表 */\n css?: string;\n /** 内容 */\n code?: string;\n /** 语言(支持多种语言配置:如 `html css javascript`)\n * @default 'markup'\n */\n language?: Language;\n /** 支持编辑 */\n edit?: boolean;\n /** 开启代码块工具条 */\n toolbar?: boolean;\n /** 编辑修改时的回调 */\n onChange?(code: string): void;\n children?: JSX.Element;\n}\nexport type CodeElement = CustomElement<CodeProps>;\n\nfunction Code(props: CodeProps) {\n const { isDark } = theme;\n let codeEl: HTMLPreElement;\n let timer: NodeJS.Timeout | undefined;\n const decoded = /%[0-9A-Fa-f]{2}/;\n const id = createUniqueId();\n const [code, setCode] = createSignal<string>('');\n const [highlightCss, setHighlightCss] = createSignal<string>();\n\n async function fetchPrism() {\n if (!window.Prism) {\n return (await import('../prism')).default;\n }\n window.Prism.disableWorkerMessageHandler = true;\n window.Prism.manual = true;\n return window.Prism;\n }\n const [prismJS] = createResource('prism', fetchPrism);\n const title = createMemo(() => props.language?.split(' ').pop());\n\n createEffect(() => {\n let _next = props.code || '';\n\n if (decoded.test(_next)) {\n _next = decodeURIComponent(_next);\n }\n codeEl.normalize();\n if (_next !== codeEl.textContent) {\n setCode(_next);\n }\n });\n\n function copy() {\n setClipboard(untrack(code), codeEl);\n }\n const change: JSX.InputEventHandlerUnion<HTMLElement, InputEvent> = function (e) {\n e.target.normalize();\n const next = e.target.textContent;\n\n syntax(props.language, next, true);\n if (isFunction(props.onChange)) {\n props.onChange(next);\n }\n };\n\n function updateRang(\n key: string,\n token: string,\n range: AbstractRange,\n selection: Record<string, string>,\n ) {\n const highlight = CSS.highlights.get(key);\n\n if (highlight) {\n highlight.add(range);\n } else {\n CSS.highlights.set(key, new Highlight().add(range));\n }\n if (selection[key] === void 0) {\n selection[key] =\n `::highlight(${key}){color:var(--${token});background-color:var(--${token}-bg);text-decoration:var(--${token}-text-decoration);text-shadow:var(--${token}-text-shadow);-webkit-text-stroke-width:var(--${token}-stroke-width);-webkit-text-stroke-color:var(--${token}-stroke-color);}`;\n }\n }\n function highlighter(\n el: HTMLPreElement,\n tokenize: TokenStream,\n selection: Record<string, string>,\n start = 0,\n ) {\n let pos = start;\n\n if (Array.isArray(tokenize)) {\n for (let i = 0, len = tokenize.length; i < len; i++) {\n const token = tokenize[i];\n\n if (typeof token !== 'object') {\n pos += token.length;\n continue;\n }\n pos = highlighter(el, token, selection, pos);\n }\n return pos;\n }\n if (typeof tokenize === 'object' && tokenize.type) {\n if (el.firstChild) {\n const token = (tokenize.alias ?? tokenize.type).toString();\n const key = id + token;\n const range = new Range();\n\n if (['deleted', 'inserted'].includes(token)) {\n // diff\n range.setStart(el.firstChild, pos + 2);\n } else {\n range.setStart(el.firstChild, pos);\n }\n if (Array.isArray(tokenize.content)) {\n pos = highlighter(el, tokenize.content, selection, pos);\n } else if (typeof tokenize.content === 'string') {\n pos += tokenize.content.length;\n }\n range.setEnd(el.firstChild, pos);\n updateRang(key, token, range, selection);\n }\n }\n\n return pos;\n }\n function syntax(\n language: Language = 'markup' as Language,\n value: string | null,\n clear?: boolean,\n prevCss = {},\n ) {\n if (timer) {\n clearTimeout(timer);\n timer = void 0;\n }\n const Prism = prismJS();\n\n if (!value || !Prism) return;\n timer = setTimeout(() => {\n clearTimeout(timer);\n if (CSS.highlights) {\n if (clear) {\n CSS.highlights.forEach((highlight, key) => {\n if (key.startsWith(id)) {\n highlight.clear();\n }\n });\n }\n const grammars = language.split(' ') as Language[],\n grammar = Prism.languages[grammars[0]];\n\n if (grammar) {\n highlighter(codeEl, Prism.tokenize(value, grammar), prevCss);\n }\n if (grammars.length > 1 || grammars[0] === 'git') {\n syntax(grammars[1], value, false, prevCss);\n } else {\n setHighlightCss(Object.values(prevCss).join(''));\n }\n } else {\n throw Error('不支持 CSS Highlights');\n }\n timer = void 0;\n }, 0);\n }\n createEffect(() => {\n syntax(props.language, code(), true);\n });\n onCleanup(() => {\n if (CSS.highlights) {\n for (const key of CSS.highlights.keys()) {\n if (key.startsWith(id)) {\n CSS.highlights.delete(key);\n }\n }\n }\n });\n\n return (\n <>\n <style textContent={isDark() ? darkCss : lightCss} />\n <style textContent={highlightCss()} />\n <style textContent={style} />\n <Show when={props.css}>\n <style textContent={css(props.css)} />\n </Show>\n <pre\n classList={{\n [`language-${props.language}`]: !!props.language,\n 'not-toolbar': !props.toolbar,\n [props.class!]: !props.edit,\n }}\n >\n <Show when={props.toolbar}>\n <div class=\"toolbar\" data-language={title()}>\n <button class=\"toolbar-copy\" aria-label=\"copy\" onClick={copy} />\n </div>\n </Show>\n <code ref={codeEl!} contenteditable={props.edit} spellcheck={false} onInput={change}>\n {code()}\n </code>\n </pre>\n </>\n );\n}\n\ncustomElement<CodeProps>(\n 'n-code',\n {\n class: void 0,\n code: void 0,\n language: void 0,\n children: void 0,\n edit: void 0,\n toolbar: void 0,\n css: void 0,\n onChange: void 0,\n },\n (_, opt) => {\n const { baseStyle } = theme;\n const el = opt.element;\n const props = mergeProps(\n {\n code: el.textContent,\n css: el.css,\n onChange(val: string) {\n el.dispatchEvent(\n new CustomEvent('change', {\n detail: val,\n }),\n );\n },\n },\n _,\n );\n\n createEffect(() => {\n clearAttribute(el, ['css', 'code']);\n el.replaceChildren();\n });\n return (\n <>\n <style textContent={baseStyle()} />\n <Code language={'atom'} {...props} />\n </>\n );\n },\n);\nexport default Code;\n"],"names":["Code","props","codeEl","timer","isDark","theme","decoded","id","createUniqueId","code","setCode","createSignal","highlightCss","setHighlightCss","fetchPrism","window","Prism","disableWorkerMessageHandler","manual","default","prismJS","createResource","title","createMemo","language","split","pop","copy","setClipboard","untrack","createEffect","_next","test","decodeURIComponent","normalize","textContent","change","e","target","next","syntax","isFunction","onChange","value","clear","prevCss","clearTimeout","setTimeout","CSS","highlights","forEach","highlight","key","startsWith","grammars","grammar","languages","highlighter","el","tokenize","selection","start","pos","Array","isArray","i","len","length","token","type","firstChild","alias","toString","range","Range","includes","setStart","content","setEnd","updateRang","get","add","set","Highlight","Object","values","join","Error","onCleanup","keys","delete","darkCss","lightCss","style","Show","css","toolbar","class","edit","customElement","children","_","opt","baseStyle","element","mergeProps","val","dispatchEvent","CustomEvent","detail","clearAttribute","replaceChildren"],"mappings":"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"}
|
package/lib/code/style.js
CHANGED
|
@@ -203,5 +203,5 @@
|
|
|
203
203
|
block-size: 5px;
|
|
204
204
|
inline-size: 5px;
|
|
205
205
|
}
|
|
206
|
-
`,e=(0,o.css)({":host":{"--code-color":"#eee","--code-lang-style-color":"#fd9170","--code-toolbar-bg":"rgb(63, 63, 63, 0.7)","--atrule":"#c792ea","--attr-name":"#9cdcfe","--attr-value":"#ce9178","--attr-equals":"#ccc","--attribute":"#a5e844","--boolean":"#c792ea","--builtin":"#ffcb6b","--cdata":"#80cbc4","--char":"#80cbc4","--class":"#ffcb6b","--class-name":"#f2ff00","--comment":"#616161","--constant":"#c792ea","--
|
|
206
|
+
`,e=(0,o.css)({":host":{"--code-color":"#eee","--code-lang-style-color":"#fd9170","--code-toolbar-bg":"rgb(63, 63, 63, 0.7)","--atrule":"#c792ea","--attr-name":"#9cdcfe","--attr-value":"#ce9178","--attr-equals":"#ccc","--attribute":"#a5e844","--boolean":"#c792ea","--builtin":"#ffcb6b","--cdata":"#80cbc4","--char":"#80cbc4","--class":"#ffcb6b","--class-name":"#f2ff00","--comment":"#616161","--constant":"#c792ea","--doctype":"#616161","--entity":"#f66","--function":"#dcdcaa","--hexcode":"#f2ff00","--id":"#c792ea","--important":"#c792ea","--keyword":"#c792ea","--number":"#fd9170","--operator":"#569cd6","--prolog":"#616161","--property":"#80cbc4","--pseudo-class":"#a5e844","--pseudo-element":"#a5e844","--punctuation":"#89ddff","--regex":"#f2ff00","--selector":"#f66","--string":"#a5e844","--symbol":"#c792ea","--tag":"#569cd6","--unit":"#fd9170","--url":"#f66","--variable":"#f66","--inserted-bg":"rgba(0, 255, 128, .15)","--deleted-bg":"rgba(255, 0, 0, .15)"}}),a=(0,o.css)({":host":{"--code-color":"#90a4ae","--code-lang-style-color":"#f76d47","--namespace":"rgba(56, 64, 68, 0.7)","--tag":"#4b69c6","--atrule":"#7c4dff","--attr-name":"#39adb5","--attr-value":"#f6a434","--attr-equals":"#90a4ae","--attribute":"#f6a434","--boolean":"#7c4dff","--builtin":"#39adb5","--cdata":"#39adb5","--char":"#39adb5","--class":"#39adb5","--class-name":"#6182b8","--comment":"#aabfc9","--constant":"#7c4dff","--doctype":"#aabfc9","--entity":"#e53935","--hexcode":"#f76d47","--id":"#7c4dff","--important":"#7c4dff","--keyword":"#7c4dff","--number":"#f76d47","--operator":"#91b3e0","--prolog":"#aabfc9","--property":"#39adb5","--pseudo-class":"#f6a434","--pseudo-element":"#f6a434","--punctuation":"#39adb5","--regex":"#6182b8","--selector":"#e53935","--string":"#f6a434","--symbol":"#7c4dff","--unit":"#f76d47","--url":"#e53935","--variable":"#e53935","--function":"#4078f2","--name":"#39adb5","--prefix-inserted":"green","--prefix-deleted":"red","--inserted-bg":"rgba(0, 255, 128, .1)","--deleted-bg":"rgba(255, 0, 0, .1)"}});
|
|
207
207
|
//# sourceMappingURL=style.js.map
|
package/lib/code/style.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../components/code/style.ts"],"sourcesContent":["import { css } from '@moneko/css';\n\nexport const style = css`\n :host {\n --code-font-stack: 'Liberation Mono', monaco, menlo, consolas, 'Source Code Pro', 'Ubuntu Mono',\n 'Microsoft Yahei', '微软雅黑', courier, 'Helvetica Neue', 'Lantinghei SC', stxihei, wenquanyi,\n sans-serif;\n\n position: relative;\n display: block;\n box-sizing: border-box;\n }\n\n .toolbar::after,\n .toolbar-copy::after,\n pre,\n code {\n transition-duration: var(--transition-duration);\n transition-timing-function: var(--transition-timing-function);\n }\n\n [data-copy]::before {\n position: absolute;\n z-index: 1;\n display: inline-block;\n margin: auto;\n border: 1px solid;\n border-radius: var(--border-radius);\n padding: 4px 8px;\n font-size: var(--font-size-sm);\n transition:\n background-color 0.3s,\n color 0.3s,\n border-color 0.3s;\n content: '复制成功';\n inline-size: fit-content;\n animation-fill-mode: forwards;\n inset-block-start: 32px;\n inset-inline: 0;\n }\n\n [data-copy='success']::before {\n border-color: var(--success-border);\n color: var(--success-color);\n background-color: var(--success-bg);\n animation: copy-slide-in var(--transition-duration) var(--transition-timing-function);\n }\n\n [data-copy='failure']::before {\n border-color: var(--error-border);\n color: var(--error-color);\n background-color: var(--error-bg);\n animation:\n copy-slide-in var(--transition-duration) var(--transition-timing-function),\n error 1s var(--transition-timing-function) 1s;\n content: '复制失败';\n }\n\n [data-copy-exit]::before {\n animation: copy-slide-out var(--transition-duration) forwards var(--transition-timing-function);\n }\n\n @keyframes copy-slide-in {\n from {\n opacity: 0;\n transform: translate3d(0, -100%, 0) scale(0);\n }\n\n to {\n opacity: 1;\n transform: translate3d(0, 0, 0) scale(1);\n }\n }\n\n @keyframes copy-slide-out {\n from {\n opacity: 1;\n transform: translate3d(0, 0, 0) scale(1);\n }\n\n to {\n opacity: 0;\n transform: translate3d(0, -100%, 0) scale(0);\n }\n }\n\n pre,\n code {\n display: block;\n border: none;\n border-radius: var(--border-radius);\n font-size: var(--font-size);\n font-family: var(--code-font-stack);\n text-align: start;\n white-space: pre-wrap;\n outline: none;\n text-shadow: none;\n overflow-wrap: normal;\n tab-size: 4;\n hyphens: none;\n max-inline-size: 100%;\n line-height: 1.8;\n transition-property: box-shadow, background-color, border-color, color;\n }\n\n pre {\n position: relative;\n overflow: visible;\n margin: auto;\n color: var(--code-color);\n background-color: var(--primary-component-bg);\n box-shadow: 0 2px 8px 0 var(--primary-shadow);\n }\n\n pre > code {\n overflow: auto;\n padding: 32px 16px 8px;\n pointer-events: auto;\n }\n\n pre.language-css,\n pre.language-less,\n pre.language-regex {\n color: var(--code-lang-style-color);\n }\n\n pre > .toolbar::after {\n position: absolute;\n z-index: 2;\n display: block;\n border-radius: var(--border-radius) var(--border-radius) 0 0;\n font-size: var(--font-size);\n font-family: Ubuntu, sans-serif;\n font-weight: bold;\n text-align: center;\n color: var(--text-color);\n background-color: var(--code-toolbar-bg, rgb(220 224 229 / 50%));\n box-shadow: 0 1px 5px rgb(0 0 0 / 10%);\n text-transform: uppercase;\n backdrop-filter: blur(10px);\n content: attr(data-language) '';\n block-size: 24px;\n inline-size: 100%;\n line-height: 24px;\n transition-property: background-color, border-color, color;\n inset-block-start: 0;\n inset-inline-start: 0;\n }\n\n pre > .toolbar::before {\n position: absolute;\n z-index: 3;\n display: inline-block;\n border-radius: var(--border-radius);\n text-align: center;\n background-color: #fc625d;\n box-shadow:\n 0 0 0 4px #fc625d,\n 20px 0 0 4px #fdbc40,\n 40px 0 0 4px #35cd4b;\n cursor: pointer;\n content: '';\n block-size: 4px;\n inline-size: 4px;\n inset-block-start: 10px;\n inset-inline-start: 12px;\n }\n\n pre > .toolbar > .toolbar-copy {\n position: absolute;\n z-index: 3;\n border: none;\n padding: 0;\n background: none;\n outline: none;\n cursor: pointer;\n inset-block-start: 0;\n inset-inline-end: 8px;\n }\n\n pre > .toolbar > .toolbar-copy:active {\n transform: scale(0.95);\n }\n\n .toolbar > .toolbar-copy::after {\n display: block;\n font-size: 24px;\n font-family: sans-serif;\n color: var(--text-color);\n user-select: none;\n content: '⎘';\n line-height: 24px;\n transition-property: color, transform;\n }\n\n .toolbar > .toolbar-copy:hover::after {\n color: var(--primary-color, #5794ff);\n }\n\n .not-toolbar > code {\n padding-block-start: 8px !important;\n }\n\n pre::-webkit-scrollbar {\n block-size: 5px;\n inline-size: 5px;\n }\n`;\nexport const darkCss = css({\n ':host': {\n '--code-color': '#eee',\n '--code-lang-style-color': '#fd9170',\n '--code-toolbar-bg': 'rgb(63, 63, 63, 0.7)',\n '--atrule': '#c792ea',\n '--attr-name': '#9cdcfe',\n '--attr-value': '#ce9178',\n '--attr-equals': '#ccc',\n '--attribute': '#a5e844',\n '--boolean': '#c792ea',\n '--builtin': '#ffcb6b',\n '--cdata': '#80cbc4',\n '--char': '#80cbc4',\n '--class': '#ffcb6b',\n '--class-name': '#f2ff00',\n '--comment': '#616161',\n '--constant': '#c792ea',\n '--
|
|
1
|
+
{"version":3,"sources":["../../components/code/style.ts"],"sourcesContent":["import { css } from '@moneko/css';\n\nexport const style = css`\n :host {\n --code-font-stack: 'Liberation Mono', monaco, menlo, consolas, 'Source Code Pro', 'Ubuntu Mono',\n 'Microsoft Yahei', '微软雅黑', courier, 'Helvetica Neue', 'Lantinghei SC', stxihei, wenquanyi,\n sans-serif;\n\n position: relative;\n display: block;\n box-sizing: border-box;\n }\n\n .toolbar::after,\n .toolbar-copy::after,\n pre,\n code {\n transition-duration: var(--transition-duration);\n transition-timing-function: var(--transition-timing-function);\n }\n\n [data-copy]::before {\n position: absolute;\n z-index: 1;\n display: inline-block;\n margin: auto;\n border: 1px solid;\n border-radius: var(--border-radius);\n padding: 4px 8px;\n font-size: var(--font-size-sm);\n transition:\n background-color 0.3s,\n color 0.3s,\n border-color 0.3s;\n content: '复制成功';\n inline-size: fit-content;\n animation-fill-mode: forwards;\n inset-block-start: 32px;\n inset-inline: 0;\n }\n\n [data-copy='success']::before {\n border-color: var(--success-border);\n color: var(--success-color);\n background-color: var(--success-bg);\n animation: copy-slide-in var(--transition-duration) var(--transition-timing-function);\n }\n\n [data-copy='failure']::before {\n border-color: var(--error-border);\n color: var(--error-color);\n background-color: var(--error-bg);\n animation:\n copy-slide-in var(--transition-duration) var(--transition-timing-function),\n error 1s var(--transition-timing-function) 1s;\n content: '复制失败';\n }\n\n [data-copy-exit]::before {\n animation: copy-slide-out var(--transition-duration) forwards var(--transition-timing-function);\n }\n\n @keyframes copy-slide-in {\n from {\n opacity: 0;\n transform: translate3d(0, -100%, 0) scale(0);\n }\n\n to {\n opacity: 1;\n transform: translate3d(0, 0, 0) scale(1);\n }\n }\n\n @keyframes copy-slide-out {\n from {\n opacity: 1;\n transform: translate3d(0, 0, 0) scale(1);\n }\n\n to {\n opacity: 0;\n transform: translate3d(0, -100%, 0) scale(0);\n }\n }\n\n pre,\n code {\n display: block;\n border: none;\n border-radius: var(--border-radius);\n font-size: var(--font-size);\n font-family: var(--code-font-stack);\n text-align: start;\n white-space: pre-wrap;\n outline: none;\n text-shadow: none;\n overflow-wrap: normal;\n tab-size: 4;\n hyphens: none;\n max-inline-size: 100%;\n line-height: 1.8;\n transition-property: box-shadow, background-color, border-color, color;\n }\n\n pre {\n position: relative;\n overflow: visible;\n margin: auto;\n color: var(--code-color);\n background-color: var(--primary-component-bg);\n box-shadow: 0 2px 8px 0 var(--primary-shadow);\n }\n\n pre > code {\n overflow: auto;\n padding: 32px 16px 8px;\n pointer-events: auto;\n }\n\n pre.language-css,\n pre.language-less,\n pre.language-regex {\n color: var(--code-lang-style-color);\n }\n\n pre > .toolbar::after {\n position: absolute;\n z-index: 2;\n display: block;\n border-radius: var(--border-radius) var(--border-radius) 0 0;\n font-size: var(--font-size);\n font-family: Ubuntu, sans-serif;\n font-weight: bold;\n text-align: center;\n color: var(--text-color);\n background-color: var(--code-toolbar-bg, rgb(220 224 229 / 50%));\n box-shadow: 0 1px 5px rgb(0 0 0 / 10%);\n text-transform: uppercase;\n backdrop-filter: blur(10px);\n content: attr(data-language) '';\n block-size: 24px;\n inline-size: 100%;\n line-height: 24px;\n transition-property: background-color, border-color, color;\n inset-block-start: 0;\n inset-inline-start: 0;\n }\n\n pre > .toolbar::before {\n position: absolute;\n z-index: 3;\n display: inline-block;\n border-radius: var(--border-radius);\n text-align: center;\n background-color: #fc625d;\n box-shadow:\n 0 0 0 4px #fc625d,\n 20px 0 0 4px #fdbc40,\n 40px 0 0 4px #35cd4b;\n cursor: pointer;\n content: '';\n block-size: 4px;\n inline-size: 4px;\n inset-block-start: 10px;\n inset-inline-start: 12px;\n }\n\n pre > .toolbar > .toolbar-copy {\n position: absolute;\n z-index: 3;\n border: none;\n padding: 0;\n background: none;\n outline: none;\n cursor: pointer;\n inset-block-start: 0;\n inset-inline-end: 8px;\n }\n\n pre > .toolbar > .toolbar-copy:active {\n transform: scale(0.95);\n }\n\n .toolbar > .toolbar-copy::after {\n display: block;\n font-size: 24px;\n font-family: sans-serif;\n color: var(--text-color);\n user-select: none;\n content: '⎘';\n line-height: 24px;\n transition-property: color, transform;\n }\n\n .toolbar > .toolbar-copy:hover::after {\n color: var(--primary-color, #5794ff);\n }\n\n .not-toolbar > code {\n padding-block-start: 8px !important;\n }\n\n pre::-webkit-scrollbar {\n block-size: 5px;\n inline-size: 5px;\n }\n`;\nexport const darkCss = css({\n ':host': {\n '--code-color': '#eee',\n '--code-lang-style-color': '#fd9170',\n '--code-toolbar-bg': 'rgb(63, 63, 63, 0.7)',\n '--atrule': '#c792ea',\n '--attr-name': '#9cdcfe',\n '--attr-value': '#ce9178',\n '--attr-equals': '#ccc',\n '--attribute': '#a5e844',\n '--boolean': '#c792ea',\n '--builtin': '#ffcb6b',\n '--cdata': '#80cbc4',\n '--char': '#80cbc4',\n '--class': '#ffcb6b',\n '--class-name': '#f2ff00',\n '--comment': '#616161',\n '--constant': '#c792ea',\n '--doctype': '#616161',\n '--entity': '#f66',\n '--function': '#dcdcaa',\n '--hexcode': '#f2ff00',\n '--id': '#c792ea',\n '--important': '#c792ea',\n '--keyword': '#c792ea',\n '--number': '#fd9170',\n '--operator': '#569cd6',\n '--prolog': '#616161',\n '--property': '#80cbc4',\n '--pseudo-class': '#a5e844',\n '--pseudo-element': '#a5e844',\n '--punctuation': '#89ddff',\n '--regex': '#f2ff00',\n '--selector': '#f66',\n '--string': '#a5e844',\n '--symbol': '#c792ea',\n '--tag': '#569cd6',\n '--unit': '#fd9170',\n '--url': '#f66',\n '--variable': '#f66',\n '--inserted-bg': 'rgba(0, 255, 128, .15)',\n '--deleted-bg': 'rgba(255, 0, 0, .15)',\n },\n});\nexport const lightCss = css({\n ':host': {\n '--code-color': '#90a4ae',\n '--code-lang-style-color': '#f76d47',\n '--namespace': 'rgba(56, 64, 68, 0.7)',\n '--tag': '#4b69c6',\n '--atrule': '#7c4dff',\n '--attr-name': '#39adb5',\n '--attr-value': '#f6a434',\n '--attr-equals': '#90a4ae',\n '--attribute': '#f6a434',\n '--boolean': '#7c4dff',\n '--builtin': '#39adb5',\n '--cdata': '#39adb5',\n '--char': '#39adb5',\n '--class': '#39adb5',\n '--class-name': '#6182b8',\n '--comment': '#aabfc9',\n '--constant': '#7c4dff',\n '--doctype': '#aabfc9',\n '--entity': '#e53935',\n '--hexcode': '#f76d47',\n '--id': '#7c4dff',\n '--important': '#7c4dff',\n '--keyword': '#7c4dff',\n '--number': '#f76d47',\n '--operator': '#91b3e0',\n '--prolog': '#aabfc9',\n '--property': '#39adb5',\n '--pseudo-class': '#f6a434',\n '--pseudo-element': '#f6a434',\n '--punctuation': '#39adb5',\n '--regex': '#6182b8',\n '--selector': '#e53935',\n '--string': '#f6a434',\n '--symbol': '#7c4dff',\n '--unit': '#f76d47',\n '--url': '#e53935',\n '--variable': '#e53935',\n '--function': '#4078f2',\n '--name': '#39adb5',\n '--prefix-inserted': 'green',\n '--prefix-deleted': 'red',\n '--inserted-bg': 'rgba(0, 255, 128, .1)',\n '--deleted-bg': 'rgba(255, 0, 0, .1)',\n },\n});\n"],"names":["darkCss","lightCss","style","css"],"mappings":"+JAgNaA,OAAO,mBAAPA,GA4CAC,QAAQ,mBAARA,GA1PAC,KAAK,mBAALA,qBAFO,eAEPA,EAAQC,GAAAA,KAAG,CAAA,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6MzB,CAAC,CACYH,EAAUG,GAAAA,KAAG,EAAC,CACzB,QAAS,CACP,eAAgB,OAChB,0BAA2B,UAC3B,oBAAqB,uBACrB,WAAY,UACZ,cAAe,UACf,eAAgB,UAChB,gBAAiB,OACjB,cAAe,UACf,YAAa,UACb,YAAa,UACb,UAAW,UACX,SAAU,UACV,UAAW,UACX,eAAgB,UAChB,YAAa,UACb,aAAc,UACd,YAAa,UACb,WAAY,OACZ,aAAc,UACd,YAAa,UACb,OAAQ,UACR,cAAe,UACf,YAAa,UACb,WAAY,UACZ,aAAc,UACd,WAAY,UACZ,aAAc,UACd,iBAAkB,UAClB,mBAAoB,UACpB,gBAAiB,UACjB,UAAW,UACX,aAAc,OACd,WAAY,UACZ,WAAY,UACZ,QAAS,UACT,SAAU,UACV,QAAS,OACT,aAAc,OACd,gBAAiB,yBACjB,eAAgB,sBAClB,CACF,GACaF,EAAWE,GAAAA,KAAG,EAAC,CAC1B,QAAS,CACP,eAAgB,UAChB,0BAA2B,UAC3B,cAAe,wBACf,QAAS,UACT,WAAY,UACZ,cAAe,UACf,eAAgB,UAChB,gBAAiB,UACjB,cAAe,UACf,YAAa,UACb,YAAa,UACb,UAAW,UACX,SAAU,UACV,UAAW,UACX,eAAgB,UAChB,YAAa,UACb,aAAc,UACd,YAAa,UACb,WAAY,UACZ,YAAa,UACb,OAAQ,UACR,cAAe,UACf,YAAa,UACb,WAAY,UACZ,aAAc,UACd,WAAY,UACZ,aAAc,UACd,iBAAkB,UAClB,mBAAoB,UACpB,gBAAiB,UACjB,UAAW,UACX,aAAc,UACd,WAAY,UACZ,WAAY,UACZ,SAAU,UACV,QAAS,UACT,aAAc,UACd,aAAc,UACd,SAAU,UACV,oBAAqB,QACrB,mBAAoB,MACpB,gBAAiB,wBACjB,eAAgB,qBAClB,CACF"}
|