neko-ui 2.13.6 → 2.13.7
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/back-top/index.js +1 -1
- package/es/back-top/index.js.map +1 -1
- package/es/button/index.js +1 -1
- package/es/button/index.js.map +1 -1
- package/es/capture-screen/index.js +1 -1
- package/es/capture-screen/index.js.map +1 -1
- package/es/carousel/index.js +1 -1
- package/es/carousel/index.js.map +1 -1
- package/es/code/index.js +1 -1
- package/es/code/index.js.map +1 -1
- package/es/color-palette/index.js +1 -1
- package/es/color-palette/index.js.map +1 -1
- package/es/dropdown/index.js +1 -1
- package/es/dropdown/index.js.map +1 -1
- package/es/get-options/index.js +1 -1
- package/es/get-options/index.js.map +1 -1
- package/es/input/index.js +1 -1
- package/es/input/index.js.map +1 -1
- package/es/input-number/index.js +1 -1
- package/es/input-number/index.js.map +1 -1
- package/es/marquee/index.js +1 -1
- package/es/marquee/index.js.map +1 -1
- package/es/menu/index.js +1 -1
- package/es/menu/index.js.map +1 -1
- package/es/modal/index.js +1 -1
- package/es/modal/index.js.map +1 -1
- package/es/modal/store.js +1 -1
- package/es/modal/store.js.map +1 -1
- package/es/pagination/index.js +1 -1
- package/es/pagination/index.js.map +1 -1
- package/es/popover/index.js +1 -1
- package/es/popover/index.js.map +1 -1
- package/es/segmented/index.js +1 -1
- package/es/segmented/index.js.map +1 -1
- package/es/select/index.js +1 -1
- package/es/select/index.js.map +1 -1
- package/es/table/index.js +1 -1
- package/es/table/index.js.map +1 -1
- package/es/tabs/index.js +1 -1
- package/es/tabs/index.js.map +1 -1
- package/es/tag/index.js +2 -2
- package/es/tag/index.js.map +1 -1
- package/es/theme/index.js +1 -1
- package/es/theme/index.js.map +1 -1
- package/es/tree/index.js +1 -1
- package/es/tree/index.js.map +1 -1
- package/lib/back-top/index.js +1 -1
- package/lib/back-top/index.js.map +1 -1
- package/lib/button/index.js +1 -1
- package/lib/button/index.js.map +1 -1
- package/lib/capture-screen/index.js +1 -1
- package/lib/capture-screen/index.js.map +1 -1
- package/lib/carousel/index.js +1 -1
- package/lib/carousel/index.js.map +1 -1
- package/lib/code/index.js +1 -1
- package/lib/code/index.js.map +1 -1
- package/lib/color-palette/index.js +1 -1
- package/lib/color-palette/index.js.map +1 -1
- package/lib/dropdown/index.js +1 -1
- package/lib/dropdown/index.js.map +1 -1
- package/lib/get-options/index.js +1 -1
- package/lib/get-options/index.js.map +1 -1
- package/lib/input/index.js +1 -1
- package/lib/input/index.js.map +1 -1
- package/lib/input-number/index.js +2 -2
- package/lib/input-number/index.js.map +1 -1
- package/lib/marquee/index.js +1 -1
- package/lib/marquee/index.js.map +1 -1
- package/lib/menu/index.js +1 -1
- package/lib/menu/index.js.map +1 -1
- package/lib/modal/index.js +1 -1
- package/lib/modal/index.js.map +1 -1
- package/lib/modal/store.js +1 -1
- package/lib/modal/store.js.map +1 -1
- package/lib/pagination/index.js +1 -1
- package/lib/pagination/index.js.map +1 -1
- package/lib/popover/index.js +1 -1
- package/lib/popover/index.js.map +1 -1
- package/lib/segmented/index.js +1 -1
- package/lib/segmented/index.js.map +1 -1
- package/lib/select/index.js +1 -1
- package/lib/select/index.js.map +1 -1
- package/lib/table/index.js +1 -1
- package/lib/table/index.js.map +1 -1
- package/lib/tabs/index.js +1 -1
- package/lib/tabs/index.js.map +1 -1
- package/lib/tag/index.js +3 -3
- package/lib/tag/index.js.map +1 -1
- package/lib/theme/index.js +1 -1
- package/lib/theme/index.js.map +1 -1
- package/lib/tree/index.js +1 -1
- package/lib/tree/index.js.map +1 -1
- package/package.json +5 -5
- package/umd/index.js +49 -49
- package/umd/manifest.json +1 -1
package/es/back-top/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{template as t}from"solid-js/web";import{spread as e}from"solid-js/web";import{mergeProps as r}from"solid-js/web";import"solid-js/web";import{effect as o}from"solid-js/web";import{delegateEvents as i}from"solid-js/web";import{createComponent as s}from"solid-js/web";import{addEventListener as l}from"solid-js/web";let n=t("<style> "),m=t("<style>"),a=t("<div>");import{createEffect as
|
|
1
|
+
import{template as t}from"solid-js/web";import{spread as e}from"solid-js/web";import{mergeProps as r}from"solid-js/web";import"solid-js/web";import{effect as o}from"solid-js/web";import{delegateEvents as i}from"solid-js/web";import{createComponent as s}from"solid-js/web";import{addEventListener as l}from"solid-js/web";let n=t("<style> "),m=t("<style>"),a=t("<div>");import{createEffect as d,createMemo as c,createSignal as u,mergeProps as p,onCleanup as g,onMount as f,Show as b,splitProps as v}from"solid-js";import{Portal as h}from"solid-js/web";import{getMaxZindex as y,getScrollTop as w,isFunction as j}from"@moneko/common";import{css as k,cx as H}from"@moneko/css";import{customElement as x}from"solid-element";import{clearAttribute as C}from"../basic-config";import E,{inline as L}from"../theme";import{style as S}from"./style";function z(t){let{baseStyle:i,isDark:d}=E,[x,C]=v(p({target:window,visibilityHeight:400},t),["class","target","mount","css","visibilityHeight"]),[L,z]=u(null),D=c(()=>j(x.target)?x.target():x.target),P=c(()=>{let t=d()?"rgb(255 255 255 / 45%)":"var(--primary-border)";return`:host {--back-top-bg: ${t};}`});function R(){var t;null==(t=D())||t.scrollTo({top:0,behavior:"smooth"})}function T(){!1===L()&&z(null)}function $(t){t.preventDefault();let e=0,r=0,o=D();o&&(e=w(o),r=o.offsetHeight||0);let i=e>r/3||e>x.visibilityHeight;return!!L()!==i&&z(i),!1}return f(()=>{var t;null==(t=D())||t.addEventListener("scroll",$,!1)}),g(()=>{var t;null==(t=D())||t.removeEventListener("scroll",$,!1)}),s(b,{get when(){return null!==L()},get children(){return s(h,{useShadow:!0,get mount(){return x.mount},get children(){return[(()=>{let t=n(),e=t.firstChild;return o(()=>e.data=i()),t})(),(()=>{let t=n(),e=t.firstChild;return o(()=>e.data=P()),t})(),(()=>{let t=m();return t.textContent=S,t})(),s(b,{get when(){return x.css},get children(){let t=n(),e=t.firstChild;return o(()=>e.data=k(x.css)),t}}),(()=>{let t=a();return l(t,"click",R,!0),l(t,"animationend",T),e(t,r({get class(){return H("back-top",x.class)},get classList(){return{"back-top-out":!1===L()}},get style(){return{"z-index":y().toString()}}},C),!1,!1),t})()]}})}})}z.registry=()=>{x("n-back-top",{class:void 0,css:void 0,visibilityHeight:void 0,mount:void 0,target:void 0},(t,e)=>{let r=e.element;r.mount||(r.style.position="sticky",r.style.bottom="24px",r.style.right="24px",r.style.display="block",r.style.pointerEvents="none");let o=p({css:r.css,visibilityHeight:r.visibilityHeight,mount:r.renderRoot,target:r.target},t);return d(()=>{C(r,["css"])}),[(()=>{let t=m();return t.textContent=L,t})(),s(z,o)]})};export default z;i(["click"]);
|
package/es/back-top/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["components/back-top/index.tsx"],"sourcesContent":["import {\n createEffect,\n createMemo,\n createSignal,\n mergeProps,\n onCleanup,\n onMount,\n Show,\n splitProps,\n} from 'solid-js';\nimport { Portal } from 'solid-js/web';\nimport { getMaxZindex, getScrollTop, isFunction } 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 theme, { inline } from '../theme';\n\nimport { style } from './style';\n\nexport interface BackTopProps {\n /** 设置需要监听其滚动事件的元素\n * @default window\n */\n target?: HTMLElement | (() => HTMLElement | undefined);\n /** 挂载到指定的元素\n * @default body\n */\n mount?: HTMLElement;\n /** 滚动高度达到此参数值才出现 BackTop */\n visibilityHeight?: number;\n /** 自定义类名 */\n class?: string;\n /** 自定义样式表 */\n css?: string;\n}\n\nfunction BackTop(_: BackTopProps) {\n const { baseStyle, isDark } = theme;\n const props = mergeProps({ target: window as unknown as HTMLElement, visibilityHeight: 400 }, _);\n const [local, other] = splitProps(props, ['class', 'target', 'mount', 'css', 'visibilityHeight']);\n const [show, setShow] = createSignal<boolean | null>(null);\n const target = createMemo(() => (isFunction(local.target) ? local.target() : local.target));\n\n const themeStyle = createMemo(() => {\n const bg = isDark() ? 'rgb(255 255 255 / 45%)' : 'var(--primary-border)';\n\n return `:host {--back-top-bg: ${bg};}`;\n });\n\n function handleBackTop() {\n target()?.scrollTo({\n top: 0,\n behavior: 'smooth',\n });\n }\n function exit() {\n if (show() === false) {\n setShow(null);\n }\n }\n function handleScrollY(e: Event) {\n e.preventDefault();\n let scrollTop = 0;\n let offsetHeight = 0;\n const _target = target();\n\n if (_target) {\n scrollTop = getScrollTop(_target);\n offsetHeight = _target.offsetHeight || 0;\n }\n const nextShow = scrollTop > offsetHeight / 3 || scrollTop > local.visibilityHeight;\n\n if (Boolean(show()) !== nextShow) {\n setShow(nextShow);\n }\n return false;\n }\n\n onMount(() => {\n target()?.addEventListener('scroll', handleScrollY, false);\n });\n onCleanup(() => {\n target()?.removeEventListener('scroll', handleScrollY, false);\n });\n return (\n <Show when={show() !== null}>\n <Portal useShadow mount={local.mount}>\n <style textContent={baseStyle()} />\n <style textContent={themeStyle()} />\n <style textContent={style} />\n <Show when={local.css}>\n <style textContent={css(local.css)} />\n </Show>\n <div\n onAnimationEnd={exit}\n class={cx('back-top', local.class)}\n classList={{\n 'back-top-out': show() === false,\n }}\n onClick={handleBackTop}\n style={{ 'z-index': getMaxZindex().toString() }}\n {...other}\n />\n </Portal>\n </Show>\n );\n}\n\nexport type BackTopElement = CustomElement<BackTopProps>;\n\nBackTop.registry = () => {\n customElement<BackTopProps>(\n 'n-back-top',\n {\n class: void 0,\n css: void 0,\n visibilityHeight: void 0,\n mount: void 0,\n target: void 0,\n },\n (_, opt) => {\n const el = opt.element;\n\n if (!el.mount) {\n el.style.position = 'sticky';\n el.style.bottom = '24px';\n el.style.right = '24px';\n el.style.display = 'block';\n el.style.pointerEvents = 'none';\n }\n const props = mergeProps(\n {\n css: el.css,\n visibilityHeight: el.visibilityHeight,\n mount: el.renderRoot as HTMLElement,\n target: el.target,\n },\n _,\n );\n\n createEffect(() => {\n clearAttribute(el, ['css']);\n });\n return (\n <>\n <style textContent={inline} />\n <BackTop {...props} />\n </>\n );\n },\n );\n};\n\nexport default BackTop;\n"],"names":["createEffect","createMemo","createSignal","mergeProps","onCleanup","onMount","Show","splitProps","Portal","getMaxZindex","getScrollTop","isFunction","css","cx","customElement","clearAttribute","theme","inline","style","BackTop","_","baseStyle","isDark","local","other","target","window","visibilityHeight","show","setShow","themeStyle","bg","handleBackTop","scrollTo","top","behavior","exit","handleScrollY","e","preventDefault","scrollTop","offsetHeight","_target","nextShow","Boolean","addEventListener","removeEventListener","mount","class","toString","registry","opt","el","element","position","bottom","right","display","pointerEvents","props","renderRoot"],"mappings":"+WAAA,QACEA,gBAAAA,CAAY,CACZC,cAAAA,CAAU,CACVC,gBAAAA,CAAY,CACZC,cAAAA,CAAU,CACVC,aAAAA,CAAS,CACTC,WAAAA,CAAO,CACPC,QAAAA,CAAI,CACJC,cAAAA,CAAU,KACL,UAAW,AAClB,QAASC,UAAAA,CAAM,KAAQ,cAAe,AACtC,QAASC,
|
|
1
|
+
{"version":3,"sources":["components/back-top/index.tsx"],"sourcesContent":["import {\n createEffect,\n createMemo,\n createSignal,\n mergeProps,\n onCleanup,\n onMount,\n Show,\n splitProps,\n} from 'solid-js';\nimport { Portal } from 'solid-js/web';\nimport { getMaxZindex, getScrollTop, isFunction } 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 theme, { inline } from '../theme';\n\nimport { style } from './style';\n\nexport interface BackTopProps {\n /** 设置需要监听其滚动事件的元素\n * @default window\n */\n target?: HTMLElement | (() => HTMLElement | undefined);\n /** 挂载到指定的元素\n * @default body\n */\n mount?: HTMLElement;\n /** 滚动高度达到此参数值才出现 BackTop */\n visibilityHeight?: number;\n /** 自定义类名 */\n class?: string;\n /** 自定义样式表 */\n css?: string;\n}\n\nfunction BackTop(_: BackTopProps) {\n const { baseStyle, isDark } = theme;\n const props = mergeProps({ target: window as unknown as HTMLElement, visibilityHeight: 400 }, _);\n const [local, other] = splitProps(props, ['class', 'target', 'mount', 'css', 'visibilityHeight']);\n const [show, setShow] = createSignal<boolean | null>(null);\n const target = createMemo(() => (isFunction(local.target) ? local.target() : local.target));\n\n const themeStyle = createMemo(() => {\n const bg = isDark() ? 'rgb(255 255 255 / 45%)' : 'var(--primary-border)';\n\n return `:host {--back-top-bg: ${bg};}`;\n });\n\n function handleBackTop() {\n target()?.scrollTo({\n top: 0,\n behavior: 'smooth',\n });\n }\n function exit() {\n if (show() === false) {\n setShow(null);\n }\n }\n function handleScrollY(e: Event) {\n e.preventDefault();\n let scrollTop = 0;\n let offsetHeight = 0;\n const _target = target();\n\n if (_target) {\n scrollTop = getScrollTop(_target);\n offsetHeight = _target.offsetHeight || 0;\n }\n const nextShow = scrollTop > offsetHeight / 3 || scrollTop > local.visibilityHeight;\n\n if (Boolean(show()) !== nextShow) {\n setShow(nextShow);\n }\n return false;\n }\n\n onMount(() => {\n target()?.addEventListener('scroll', handleScrollY, false);\n });\n onCleanup(() => {\n target()?.removeEventListener('scroll', handleScrollY, false);\n });\n return (\n <Show when={show() !== null}>\n <Portal useShadow mount={local.mount}>\n <style textContent={baseStyle()} />\n <style textContent={themeStyle()} />\n <style textContent={style} />\n <Show when={local.css}>\n <style textContent={css(local.css)} />\n </Show>\n <div\n onAnimationEnd={exit}\n class={cx('back-top', local.class)}\n classList={{\n 'back-top-out': show() === false,\n }}\n onClick={handleBackTop}\n style={{ 'z-index': getMaxZindex().toString() }}\n {...other}\n />\n </Portal>\n </Show>\n );\n}\n\nexport type BackTopElement = CustomElement<BackTopProps>;\n\nBackTop.registry = () => {\n customElement<BackTopProps>(\n 'n-back-top',\n {\n class: void 0,\n css: void 0,\n visibilityHeight: void 0,\n mount: void 0,\n target: void 0,\n },\n (_, opt) => {\n const el = opt.element;\n\n if (!el.mount) {\n el.style.position = 'sticky';\n el.style.bottom = '24px';\n el.style.right = '24px';\n el.style.display = 'block';\n el.style.pointerEvents = 'none';\n }\n const props = mergeProps(\n {\n css: el.css,\n visibilityHeight: el.visibilityHeight,\n mount: el.renderRoot as HTMLElement,\n target: el.target,\n },\n _,\n );\n\n createEffect(() => {\n clearAttribute(el, ['css']);\n });\n return (\n <>\n <style textContent={inline} />\n <BackTop {...props} />\n </>\n );\n },\n );\n};\n\nexport default BackTop;\n"],"names":["createEffect","createMemo","createSignal","mergeProps","onCleanup","onMount","Show","splitProps","Portal","getMaxZindex","getScrollTop","isFunction","css","cx","customElement","clearAttribute","theme","inline","style","BackTop","_","baseStyle","isDark","local","other","target","window","visibilityHeight","show","setShow","themeStyle","bg","handleBackTop","scrollTo","top","behavior","exit","handleScrollY","e","preventDefault","scrollTop","offsetHeight","_target","nextShow","Boolean","addEventListener","removeEventListener","mount","class","toString","registry","opt","el","element","position","bottom","right","display","pointerEvents","props","renderRoot"],"mappings":"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"}
|
package/es/button/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{template as e}from"solid-js/web";import{mergeProps as t}from"solid-js/web";import"solid-js/web";import{insert as i}from"solid-js/web";import{effect as o}from"solid-js/web";import{createComponent as r}from"solid-js/web";let l=e("<style> "),n=e("<style>"),s=e('<span class="icon" part="icon">'),d=e('<span class="label" part="label">');import{createEffect as a,createMemo as c,createSignal as m,Match as f,mergeProps as g,Show as
|
|
1
|
+
import{template as e}from"solid-js/web";import{mergeProps as t}from"solid-js/web";import"solid-js/web";import{insert as i}from"solid-js/web";import{effect as o}from"solid-js/web";import{createComponent as r}from"solid-js/web";let l=e("<style> "),n=e("<style>"),s=e('<span class="icon" part="icon">'),d=e('<span class="label" part="label">');import{createEffect as a,createMemo as c,createSignal as m,Match as f,mergeProps as g,Show as p,splitProps as u,Switch as h}from"solid-js";import{Dynamic as b}from"solid-js/web";import{isFunction as v}from"@moneko/common";import{css as k}from"@moneko/css";import{customElement as w}from"solid-element";import{clearAttribute as y}from"../basic-config";import j,{block as C,inline as z}from"../theme";import x from"./loading";import{style as A}from"./style";function E(e){let a;let{baseStyle:w}=j,[y,E]=u(g({size:"normal",type:"default"},e),["ghost","fill","circle","dashed","flat","link","danger","children","block","size","type","class","icon","css","disabled","tag","loading"]),[L,N]=m(!1),P=c(()=>v(y.icon)?y.icon():y.icon),q=c(()=>y.block?C:z);return[(()=>{let e=l(),t=e.firstChild;return o(()=>t.data=q()),e})(),(()=>{let e=l(),t=e.firstChild;return o(()=>t.data=w()),e})(),(()=>{let e=n();return e.textContent=A,e})(),r(p,{get when(){return y.css},get children(){let e=l(),t=e.firstChild;return o(()=>t.data=k(y.css)),e}}),r(b,t({ref(e){let t=a;"function"==typeof t?t(e):a=e},get component(){return y.link?"a":y.tag||"button"},class:"btn",get classList(){return{[y.type]:!0,[y.size]:!0,loading:y.loading,danger:y.danger,block:y.block,fill:y.fill,circle:y.circle,flat:y.flat,dashed:y.dashed,ghost:y.ghost,link:y.link,disabled:y.disabled,without:L()}},part:"button",onClick:function(){y.disabled||y.loading||N(!0)},onAnimationEnd:function(){N(!1)},get disabled(){return y.disabled||y.loading},role:"button"},E,{get children(){return[r(p,{get when(){return y.icon||y.loading},get children(){let e=s();return i(e,r(h,{get children(){return[r(f,{get when(){return y.icon},get children(){return P()}}),r(f,{get when(){return y.loading},get children(){return x()}})]}})),e}}),(()=>{let e=d();return i(e,()=>y.children),e})()]}}))]}E.registry=()=>{w("n-button",{class:void 0,css:void 0,type:void 0,ghost:void 0,fill:void 0,circle:void 0,dashed:void 0,flat:void 0,disabled:void 0,block:void 0,link:void 0,danger:void 0,size:void 0,icon:void 0,tag:void 0,loading:void 0},(e,t)=>{let i=t.element,o=g({css:i.css,children:[...i.childNodes.values()]},e);return a(()=>{y(i,["css"]),i.replaceChildren()}),r(E,o)})};export default E;
|
package/es/button/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["components/button/index.tsx"],"sourcesContent":["import {\n createEffect,\n createMemo,\n createSignal,\n Match,\n mergeProps,\n Show,\n splitProps,\n Switch,\n} from 'solid-js';\nimport { Dynamic } from 'solid-js/web';\nimport { isFunction } from '@moneko/common';\nimport { css } from '@moneko/css';\nimport { customElement } from 'solid-element';\n\nimport type { BasicConfig, CustomElement } from '..';\nimport { clearAttribute, type JSXElement } from '../basic-config';\nimport theme, { block, inline } from '../theme';\n\nimport loadingIcon from './loading';\nimport { style } from './style';\n\nexport interface ButtonProps {\n /** 自定义类名 */\n class?: string;\n /** 自定义样式表 */\n css?: string;\n /** 按钮类型 */\n type?: 'success' | 'error' | 'primary' | 'warning' | 'default';\n /** 透明背景 */\n ghost?: boolean;\n /** 实色背景 */\n fill?: boolean;\n /** 圆形按钮 */\n circle?: boolean;\n /** 虚线按钮 */\n dashed?: boolean;\n /** 扁平按钮 */\n flat?: boolean;\n /** 禁用按钮 */\n disabled?: boolean;\n /** 块按钮 */\n block?: boolean;\n /** 链接按钮 */\n link?: boolean;\n /** 危险按钮 */\n danger?: boolean;\n /** 自定义 tag\n * @since 2.1.0\n */\n tag?: string;\n /** 按钮尺寸\n * @default 'normal'\n */\n size?: BasicConfig['size'];\n /** 按钮前面添加一个图标 */\n icon?: (() => JSXElement) | JSXElement;\n children?: JSXElement | string;\n onClick?(e: Event): void;\n loading?: boolean;\n}\nexport type ButtonElement = CustomElement<ButtonProps>;\n\nfunction Button(_: ButtonProps) {\n const { baseStyle } = theme;\n const _props = mergeProps({ size: 'normal', type: 'default' }, _);\n const [local, other] = splitProps(_props, [\n 'ghost',\n 'fill',\n 'circle',\n 'dashed',\n 'flat',\n 'link',\n 'danger',\n 'children',\n 'block',\n 'size',\n 'type',\n 'class',\n 'icon',\n 'css',\n 'disabled',\n 'tag',\n 'loading',\n ]);\n let ref: HTMLButtonElement | undefined;\n const [animating, setAnimating] = createSignal(false);\n\n function handleClick() {\n if (!local.disabled && !local.loading) {\n setAnimating(true);\n }\n }\n function handleAnimationEnd() {\n setAnimating(false);\n }\n const icon = createMemo(() => (isFunction(local.icon) ? local.icon() : local.icon));\n const hostStyle = createMemo(() => (local.block ? block : inline));\n\n return (\n <>\n <style textContent={hostStyle()} />\n <style textContent={baseStyle()} />\n <style textContent={style} />\n <Show when={local.css}>\n <style textContent={css(local.css)} />\n </Show>\n <Dynamic\n ref={ref}\n component={local.link ? 'a' : local.tag || 'button'}\n class=\"btn\"\n classList={{\n [local.type]: true,\n [local.size]: true,\n loading: local.loading,\n danger: local.danger,\n block: local.block,\n fill: local.fill,\n circle: local.circle,\n flat: local.flat,\n dashed: local.dashed,\n ghost: local.ghost,\n link: local.link,\n disabled: local.disabled,\n without: animating(),\n }}\n part=\"button\"\n onClick={handleClick}\n onAnimationEnd={handleAnimationEnd}\n disabled={local.disabled || local.loading}\n role=\"button\"\n {...other}\n >\n <Show when={local.icon || local.loading}>\n <span class=\"icon\" part=\"icon\">\n <Switch>\n <Match when={local.icon}>{icon()}</Match>\n <Match when={local.loading}>{loadingIcon()}</Match>\n </Switch>\n </span>\n </Show>\n <span class=\"label\" part=\"label\">\n {local.children}\n </span>\n </Dynamic>\n </>\n );\n}\n\nButton.registry = () => {\n customElement<ButtonProps>(\n 'n-button',\n {\n class: void 0,\n css: void 0,\n type: void 0,\n ghost: void 0,\n fill: void 0,\n circle: void 0,\n dashed: void 0,\n flat: void 0,\n disabled: void 0,\n block: void 0,\n link: void 0,\n danger: void 0,\n size: void 0,\n icon: void 0,\n tag: void 0,\n loading: void 0,\n },\n (_, opt) => {\n const el = opt.element;\n const props = mergeProps(\n {\n css: el.css,\n children: [...el.childNodes.values()],\n },\n _,\n );\n\n createEffect(() => {\n clearAttribute(el, ['css']);\n el.replaceChildren();\n });\n\n return <Button {...props} />;\n },\n );\n};\n\nexport default Button;\n"],"names":["createEffect","createMemo","createSignal","Match","mergeProps","Show","splitProps","Switch","Dynamic","isFunction","css","customElement","clearAttribute","theme","block","inline","loadingIcon","style","Button","_","ref","baseStyle","local","other","size","type","animating","setAnimating","icon","hostStyle","link","tag","loading","danger","fill","circle","flat","dashed","ghost","disabled","without","children","registry","class","opt","el","element","props","childNodes","values","replaceChildren"],"mappings":"oVAAA,QACEA,gBAAAA,CAAY,CACZC,cAAAA,CAAU,CACVC,gBAAAA,CAAY,CACZC,SAAAA,CAAK,CACLC,cAAAA,CAAU,CACVC,QAAAA,CAAI,CACJC,cAAAA,CAAU,CACVC,UAAAA,CAAM,KACD,UAAW,AAClB,QAASC,WAAAA,CAAO,KAAQ,cAAe,AACvC,QAASC,
|
|
1
|
+
{"version":3,"sources":["components/button/index.tsx"],"sourcesContent":["import {\n createEffect,\n createMemo,\n createSignal,\n Match,\n mergeProps,\n Show,\n splitProps,\n Switch,\n} from 'solid-js';\nimport { Dynamic } from 'solid-js/web';\nimport { isFunction } from '@moneko/common';\nimport { css } from '@moneko/css';\nimport { customElement } from 'solid-element';\n\nimport type { BasicConfig, CustomElement } from '..';\nimport { clearAttribute, type JSXElement } from '../basic-config';\nimport theme, { block, inline } from '../theme';\n\nimport loadingIcon from './loading';\nimport { style } from './style';\n\nexport interface ButtonProps {\n /** 自定义类名 */\n class?: string;\n /** 自定义样式表 */\n css?: string;\n /** 按钮类型 */\n type?: 'success' | 'error' | 'primary' | 'warning' | 'default';\n /** 透明背景 */\n ghost?: boolean;\n /** 实色背景 */\n fill?: boolean;\n /** 圆形按钮 */\n circle?: boolean;\n /** 虚线按钮 */\n dashed?: boolean;\n /** 扁平按钮 */\n flat?: boolean;\n /** 禁用按钮 */\n disabled?: boolean;\n /** 块按钮 */\n block?: boolean;\n /** 链接按钮 */\n link?: boolean;\n /** 危险按钮 */\n danger?: boolean;\n /** 自定义 tag\n * @since 2.1.0\n */\n tag?: string;\n /** 按钮尺寸\n * @default 'normal'\n */\n size?: BasicConfig['size'];\n /** 按钮前面添加一个图标 */\n icon?: (() => JSXElement) | JSXElement;\n children?: JSXElement | string;\n onClick?(e: Event): void;\n loading?: boolean;\n}\nexport type ButtonElement = CustomElement<ButtonProps>;\n\nfunction Button(_: ButtonProps) {\n const { baseStyle } = theme;\n const _props = mergeProps({ size: 'normal', type: 'default' }, _);\n const [local, other] = splitProps(_props, [\n 'ghost',\n 'fill',\n 'circle',\n 'dashed',\n 'flat',\n 'link',\n 'danger',\n 'children',\n 'block',\n 'size',\n 'type',\n 'class',\n 'icon',\n 'css',\n 'disabled',\n 'tag',\n 'loading',\n ]);\n let ref: HTMLButtonElement | undefined;\n const [animating, setAnimating] = createSignal(false);\n\n function handleClick() {\n if (!local.disabled && !local.loading) {\n setAnimating(true);\n }\n }\n function handleAnimationEnd() {\n setAnimating(false);\n }\n const icon = createMemo(() => (isFunction(local.icon) ? local.icon() : local.icon));\n const hostStyle = createMemo(() => (local.block ? block : inline));\n\n return (\n <>\n <style textContent={hostStyle()} />\n <style textContent={baseStyle()} />\n <style textContent={style} />\n <Show when={local.css}>\n <style textContent={css(local.css)} />\n </Show>\n <Dynamic\n ref={ref}\n component={local.link ? 'a' : local.tag || 'button'}\n class=\"btn\"\n classList={{\n [local.type]: true,\n [local.size]: true,\n loading: local.loading,\n danger: local.danger,\n block: local.block,\n fill: local.fill,\n circle: local.circle,\n flat: local.flat,\n dashed: local.dashed,\n ghost: local.ghost,\n link: local.link,\n disabled: local.disabled,\n without: animating(),\n }}\n part=\"button\"\n onClick={handleClick}\n onAnimationEnd={handleAnimationEnd}\n disabled={local.disabled || local.loading}\n role=\"button\"\n {...other}\n >\n <Show when={local.icon || local.loading}>\n <span class=\"icon\" part=\"icon\">\n <Switch>\n <Match when={local.icon}>{icon()}</Match>\n <Match when={local.loading}>{loadingIcon()}</Match>\n </Switch>\n </span>\n </Show>\n <span class=\"label\" part=\"label\">\n {local.children}\n </span>\n </Dynamic>\n </>\n );\n}\n\nButton.registry = () => {\n customElement<ButtonProps>(\n 'n-button',\n {\n class: void 0,\n css: void 0,\n type: void 0,\n ghost: void 0,\n fill: void 0,\n circle: void 0,\n dashed: void 0,\n flat: void 0,\n disabled: void 0,\n block: void 0,\n link: void 0,\n danger: void 0,\n size: void 0,\n icon: void 0,\n tag: void 0,\n loading: void 0,\n },\n (_, opt) => {\n const el = opt.element;\n const props = mergeProps(\n {\n css: el.css,\n children: [...el.childNodes.values()],\n },\n _,\n );\n\n createEffect(() => {\n clearAttribute(el, ['css']);\n el.replaceChildren();\n });\n\n return <Button {...props} />;\n },\n );\n};\n\nexport default Button;\n"],"names":["createEffect","createMemo","createSignal","Match","mergeProps","Show","splitProps","Switch","Dynamic","isFunction","css","customElement","clearAttribute","theme","block","inline","loadingIcon","style","Button","_","ref","baseStyle","local","other","size","type","animating","setAnimating","icon","hostStyle","link","tag","loading","danger","fill","circle","flat","dashed","ghost","disabled","without","children","registry","class","opt","el","element","props","childNodes","values","replaceChildren"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function e(e,t,r,o,n,a,i){try{var s=e[a](i),c=s.value}catch(e){r(e);return}s.done?t(c):Promise.resolve(c).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{spread as n}from"solid-js/web";import{mergeProps as a}from"solid-js/web";import{memo as i}from"solid-js/web";import{insert as s}from"solid-js/web";import{getOwner as c}from"solid-js/web";import{effect as l}from"solid-js/web";import{delegateEvents as d}from"solid-js/web";import{createComponent as p}from"solid-js/web";import{addEventListener as u}from"solid-js/web";let v=o("<style> "),m=o("<style>"),f=o('<n-button class="btn">',!0,!1),w=o('<n-button type="error" class="btn">',!0,!1),h=o('<div class="record"><n-button class="btn"><span>',!0,!1),
|
|
1
|
+
function e(e,t,r,o,n,a,i){try{var s=e[a](i),c=s.value}catch(e){r(e);return}s.done?t(c):Promise.resolve(c).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{spread as n}from"solid-js/web";import{mergeProps as a}from"solid-js/web";import{memo as i}from"solid-js/web";import{insert as s}from"solid-js/web";import{getOwner as c}from"solid-js/web";import{effect as l}from"solid-js/web";import{delegateEvents as d}from"solid-js/web";import{createComponent as p}from"solid-js/web";import{addEventListener as u}from"solid-js/web";let v=o("<style> "),m=o("<style>"),f=o('<n-button class="btn">',!0,!1),w=o('<n-button type="error" class="btn">',!0,!1),h=o('<div class="record"><n-button class="btn"><span>',!0,!1),g=o('<div class="view"><span></span><video autoplay>'),R=o('<div><div class="controller"><n-button class="btn">',!0,!1);import{createEffect as C,createMemo as b,createSignal as S,mergeProps as E,onCleanup as x,Show as T,splitProps as y,untrack as j}from"solid-js";import{downloadBlob as $,isFunction as _}from"@moneko/common";import{css as k,cx as D}from"@moneko/css";import{customElement as O}from"solid-element";import{clearAttribute as A}from"../basic-config";import L from"../button";import P,{inline as M}from"../theme";import{style as B}from"./style";let I={video:!0,audio:{echoCancellation:!0,noiseSuppression:!0,sampleRate:44100}},q={inactive:"primary",paused:"warning",recording:"success"};function z(o){let d;let{baseStyle:O}=P,[A,L]=y(E({options:I,captureScreenText:"捕获屏幕",stopCaptureText:"停止捕获",startRecorderText:"开始录制",stopRecorderText:"停止录制",pausedRecorderText:"暂停录制",recorderingText:"录制中",onErrorRecorder:null},o),["options","preview","controls","recorder","filename","captureScreenText","stopCaptureText","startRecorderText","stopRecorderText","pausedRecorderText","recorderingText","onErrorRecorder","onStopRecorder","onStartRecorder","onStopCapture","onStartCapture","onRecorderDataAvailable","onErrorCapture","onSaveRecorder","class","css"]),M=[],[z,F]=S(null),[G,H]=S(null),[J,K]=S("inactive");function N(){let e=j(z);if(e){switch(_(A.onStartRecorder)&&A.onStartRecorder(e.state),e.state){case"inactive":e.start();break;case"paused":e.resume();break;default:e.pause()}K(e.state)}}function Q(e){M.push(e.data),null==A.onRecorderDataAvailable||A.onRecorderDataAvailable.call(A,e)}function U(){let e=j(z);e&&("inactive"!==e.state&&e.stop(),K(e.state)),null==A.onStopRecorder||A.onStopRecorder.call(A)}function V(){if(!M.length)return;let e=new Blob(M,{type:"video/webm"}),t=A.filename||new Date().toISOString(),r=`${t}.webm`;M.splice(0),A.onSaveRecorder&&A.onSaveRecorder(e,r),$(e,r)}function W(){U();let e=j(G);e&&(e.getTracks().forEach(e=>{e.stop()}),H(null)),null==A.onStopCapture||A.onStopCapture.call(A)}function X(){return Y.apply(this,arguments)}function Y(){var r;return r=function*(){W();try{let e=yield navigator.mediaDevices.getDisplayMedia(t({},I,A.options));e&&(e.addEventListener("inactive",W,!1),H(e)),null==A.onStartCapture||A.onStartCapture.call(A,e)}catch(e){null==A.onErrorCapture||A.onErrorCapture.call(A,e)}},(Y=function(){var t=this,o=arguments;return new Promise(function(n,a){var i=r.apply(t,o);function s(t){e(i,n,a,s,c,"next",t)}function c(t){e(i,n,a,s,c,"throw",t)}s(void 0)})}).apply(this,arguments)}C(()=>{let e=G();A.preview&&d&&e&&(d.srcObject=e)}),C(()=>{let e=G();if(null==e?void 0:e.active){let t=new MediaRecorder(e);t.onstop=V,t.onerror=A.onErrorRecorder,t.ondataavailable=Q,F(t)}else F(null)}),x(()=>{let e=j(z);e&&"inactive"!==e.state&&e.stop();let t=j(G);t&&t.getTracks().forEach(e=>{e.stop()})});let Z=b(()=>({paused:A.pausedRecorderText,recording:A.recorderingText,inactive:A.startRecorderText})[J()]);return[(()=>{let e=v(),t=e.firstChild;return l(()=>t.data=O()),e})(),(()=>{let e=m();return e.textContent=B,e})(),p(T,{get when(){return A.css},get children(){let e=v(),t=e.firstChild;return l(()=>t.data=k(A.css)),e}}),(()=>{let e=R(),t=e.firstChild,o=t.firstChild;return n(e,a({get class(){return D("capture-screen",A.class)}},L),!1,!0),u(o,"click",X,!0),o._$owner=c(),s(o,()=>A.captureScreenText),s(t,p(T,{get when(){return G()},get children(){return[(()=>{let e=f();return u(e,"click",W,!0),e.danger=!0,e._$owner=c(),s(e,()=>A.stopCaptureText),e})(),p(T,{get when(){return A.recorder},get children(){let e=h(),t=e.firstChild,r=t.firstChild;return u(t,"click",N,!0),t._$owner=c(),s(r,Z),s(e,p(T,{get when(){return"inactive"!==J()},get children(){let e=w();return u(e,"click",U,!0),e._$owner=c(),s(e,()=>A.stopRecorderText),e}}),null),l(()=>t.type=q[J()]),e}})]}}),null),s(e,p(T,{get when(){return i(()=>!!A.preview)()&&G()},get children(){let e=g(),t=e.firstChild,o=t.nextSibling,n=d;return"function"==typeof n?r(n,o):d=o,l(e=>{let r=!("recording"!==J()),n=!("paused"!==J()),a=A.controls&&null!==G();return r!==e._v$&&t.classList.toggle("recording",e._v$=r),n!==e._v$2&&t.classList.toggle("paused",e._v$2=n),a!==e._v$3&&(o.controls=e._v$3=a),e},{_v$:void 0,_v$2:void 0,_v$3:void 0}),e}}),null),e})()]}z.registry=()=>{L.registry(),O("n-capture-screen",{class:void 0,css:void 0,options:void 0,preview:void 0,controls:void 0,recorder:void 0,filename:void 0,captureScreenText:void 0,stopCaptureText:void 0,startRecorderText:void 0,stopRecorderText:void 0,pausedRecorderText:void 0,recorderingText:void 0,onErrorRecorder:void 0,onStopRecorder:void 0,onStartRecorder:void 0,onRecorderDataAvailable:void 0,onErrorCapture:void 0,onStopCapture:void 0,onStartCapture:void 0,onSaveRecorder:void 0},(e,t)=>{let r=t.element,o=E({onErrorRecorder(e){r.dispatchEvent(new CustomEvent("errorrecorder",{detail:e}))},onStopRecorder(){r.dispatchEvent(new CustomEvent("stoprecorder",{detail:void 0}))},onStartRecorder(e){r.dispatchEvent(new CustomEvent("startrecorder",{detail:e}))},onRecorderDataAvailable(e){r.dispatchEvent(new CustomEvent("recorderdataavailable",{detail:e}))},onErrorCapture(e){r.dispatchEvent(new CustomEvent("errorcapture",{detail:e}))},onStopCapture(){r.dispatchEvent(new CustomEvent("stopcapture",{detail:void 0}))},onStartCapture(e){r.dispatchEvent(new CustomEvent("startcapture",{detail:e}))},onSaveRecorder(e,t){r.dispatchEvent(new CustomEvent("saverecorder",{detail:[e,t]}))}},e);return C(()=>{A(r,["css","options"])}),[(()=>{let e=m();return e.textContent=M,e})(),p(z,o)]})};export default z;d(["click"]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["components/capture-screen/index.tsx"],"sourcesContent":["import {\n createEffect,\n createMemo,\n createSignal,\n mergeProps,\n onCleanup,\n Show,\n splitProps,\n untrack,\n} from 'solid-js';\nimport { downloadBlob, isFunction } 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 Button from '../button';\nimport theme, { inline } from '../theme';\n\nimport { style } from './style';\n\ndeclare interface MediaRecorderDataAvailableEvent extends Event {\n /** MediaRecorderDataAvailableEvent */\n data: Any;\n}\n\nexport interface CaptureScreenProps {\n /** 自定义类名 */\n class?: string;\n /** 自定义样式表 */\n css?: string;\n /** MediaStreamConstraints */\n options?: MediaStreamConstraints;\n /** 是否预览 */\n preview?: boolean;\n /** 预览时是否显示控制器 */\n controls?: boolean;\n /** 录制时配置项 */\n recorder?: boolean;\n /** 录制文件名称 */\n filename?: string;\n /** 捕获屏幕按钮文字 */\n captureScreenText?: string;\n /** 停止捕获按钮文字 */\n stopCaptureText?: string;\n /** 开始录制按钮文字 */\n startRecorderText?: string;\n /** 停止录制按钮文字 */\n stopRecorderText?: string;\n /** 暂停录制按钮文字 */\n pausedRecorderText?: string;\n /** 录制中按钮文字 */\n recorderingText?: string;\n /** 录制错误回调方法 */\n onErrorRecorder?: (e: Event) => void;\n /** 停止录制回调方法 */\n onStopRecorder?: () => void;\n /** 开始录制回调方法 */\n onStartRecorder?: (state: MediaRecorder['state']) => void;\n /** 记录媒体时触发 */\n onRecorderDataAvailable?: (e: MediaRecorderDataAvailableEvent) => void;\n /** 捕获屏幕错误回调方法 */\n onErrorCapture?: (err: unknown) => void;\n /** 停止捕获屏幕回调方法 */\n onStopCapture?: () => void;\n /** 开始捕获屏幕回调方法 */\n onStartCapture?: (stream?: MediaStream) => void;\n /** 自定义保存录制文件方法 */\n onSaveRecorder?: (blob: Blob, fileName: string) => void;\n}\nexport type CaptureScreenElement = CustomElement<\n CaptureScreenProps,\n | 'onErrorRecorder'\n | 'onStopRecorder'\n | 'onStartRecorder'\n | 'onRecorderDataAvailable'\n | 'onErrorCapture'\n | 'onStopCapture'\n | 'onStartCapture'\n | 'onSaveRecorder'\n>;\n\nconst displayMediaOptions: MediaStreamConstraints = {\n video: true,\n audio: {\n echoCancellation: true,\n noiseSuppression: true,\n sampleRate: 44100,\n },\n};\n\nconst btnStatusDic: Record<MediaRecorder['state'], 'primary' | 'warning' | 'success'> = {\n inactive: 'primary',\n paused: 'warning',\n recording: 'success',\n};\n\nfunction CaptureScreen(_: CaptureScreenProps) {\n const { baseStyle } = theme;\n const _props = mergeProps(\n {\n options: displayMediaOptions,\n captureScreenText: '捕获屏幕',\n stopCaptureText: '停止捕获',\n startRecorderText: '开始录制',\n stopRecorderText: '停止录制',\n pausedRecorderText: '暂停录制',\n recorderingText: '录制中',\n onErrorRecorder: null,\n },\n _,\n );\n const [local, props] = splitProps(_props, [\n 'options',\n 'preview',\n 'controls',\n 'recorder',\n 'filename',\n 'captureScreenText',\n 'stopCaptureText',\n 'startRecorderText',\n 'stopRecorderText',\n 'pausedRecorderText',\n 'recorderingText',\n 'onErrorRecorder',\n 'onStopRecorder',\n 'onStartRecorder',\n 'onStopCapture',\n 'onStartCapture',\n 'onRecorderDataAvailable',\n 'onErrorCapture',\n 'onSaveRecorder',\n 'class',\n 'css',\n ]);\n let videoElem: HTMLVideoElement | undefined;\n const chunks: Blob[] = [];\n const [mediaRecorder, setMediaRecorder] = createSignal<MediaRecorder | null>(null);\n const [mediaStream, setMediaStream] = createSignal<MediaStream | null>(null);\n const [recordState, setRecordState] = createSignal<MediaRecorder['state']>('inactive');\n\n // 开始录制\n function handleStartRecorder() {\n const mr = untrack(mediaRecorder);\n\n if (mr) {\n if (isFunction(local.onStartRecorder)) {\n local.onStartRecorder(mr.state);\n }\n switch (mr.state) {\n case 'inactive': // 不活跃\n mr.start();\n break;\n case 'paused': // 暂停\n mr.resume();\n break;\n // case 'recording': // 录制中\n default:\n mr.pause();\n break;\n }\n setRecordState(mr.state);\n }\n }\n function handleRecorderDataAvailable(e: MediaRecorderDataAvailableEvent) {\n chunks.push(e.data as Blob);\n local.onRecorderDataAvailable?.(e);\n }\n // 停止录制\n function stopRecorder() {\n const mr = untrack(mediaRecorder);\n\n // 未录制时不需要停止\n if (mr) {\n if (mr.state !== 'inactive') {\n mr.stop();\n }\n setRecordState(mr.state);\n }\n local.onStopRecorder?.();\n }\n function handleSaveRecorder() {\n if (!chunks.length) return;\n // 将录制内容保存到本地\n const blob: Blob = new Blob(chunks, {\n type: 'video/webm',\n });\n const name = local.filename || new Date().toISOString();\n const fileName = `${name}.webm`;\n\n chunks.splice(0);\n if (local.onSaveRecorder) {\n local.onSaveRecorder(blob, fileName);\n }\n // 保存文件\n downloadBlob(blob, fileName);\n }\n\n // 停止捕获屏幕\n function stopCapture() {\n // 如果在录制则先停止\n stopRecorder();\n const ms = untrack(mediaStream);\n\n if (ms) {\n const tracks = ms.getTracks();\n\n tracks.forEach((track: MediaStreamTrack) => {\n track.stop();\n });\n setMediaStream(null);\n }\n local.onStopCapture?.();\n }\n\n // 开始捕获屏幕\n async function startCapture() {\n stopCapture();\n try {\n const stream = await navigator.mediaDevices.getDisplayMedia({\n ...displayMediaOptions,\n ...local.options,\n });\n\n if (stream) {\n // 监听停止捕获屏幕\n stream.addEventListener('inactive', stopCapture, false);\n setMediaStream(stream);\n }\n local.onStartCapture?.(stream);\n } catch (err) {\n local.onErrorCapture?.(err);\n }\n }\n\n createEffect(() => {\n const ms = mediaStream();\n\n if (local.preview && videoElem && ms) {\n videoElem.srcObject = ms;\n }\n });\n\n createEffect(() => {\n const ms = mediaStream();\n\n if (ms?.active) {\n const recorderInstance = new MediaRecorder(ms);\n\n recorderInstance.onstop = handleSaveRecorder;\n recorderInstance.onerror = local.onErrorRecorder;\n // 每次timeslice记录毫秒级媒体时(或未记录整个媒体时,如果timeslice未指定)定期触发\n recorderInstance.ondataavailable = handleRecorderDataAvailable;\n setMediaRecorder(recorderInstance);\n } else {\n setMediaRecorder(null);\n }\n });\n\n onCleanup(() => {\n const mr = untrack(mediaRecorder);\n\n // 未录制时不需要停止\n if (mr && mr.state !== 'inactive') {\n mr.stop();\n }\n const ms = untrack(mediaStream);\n\n if (ms) {\n const tracks = ms.getTracks();\n\n tracks.forEach((track: MediaStreamTrack) => {\n track.stop();\n });\n }\n });\n const recorderText = createMemo(() => {\n return {\n paused: local.pausedRecorderText,\n recording: local.recorderingText,\n inactive: local.startRecorderText,\n }[recordState()];\n });\n\n return (\n <>\n <style textContent={baseStyle()} />\n <style textContent={style} />\n <Show when={local.css}>\n <style textContent={css(local.css)} />\n </Show>\n <div class={cx('capture-screen', local.class)} {...props}>\n <div class=\"controller\">\n <n-button onClick={startCapture} class=\"btn\">\n {local.captureScreenText}\n </n-button>\n <Show when={mediaStream()}>\n <>\n <n-button danger={true} onClick={stopCapture} class=\"btn\">\n {local.stopCaptureText}\n </n-button>\n <Show when={local.recorder}>\n <div class=\"record\">\n <n-button\n type={btnStatusDic[recordState()]}\n onClick={handleStartRecorder}\n class=\"btn\"\n >\n <span>{recorderText()}</span>\n </n-button>\n <Show when={recordState() !== 'inactive'}>\n <n-button type=\"error\" onClick={stopRecorder} class=\"btn\">\n {local.stopRecorderText}\n </n-button>\n </Show>\n </div>\n </Show>\n </>\n </Show>\n </div>\n <Show when={local.preview && mediaStream()}>\n <div class=\"view\">\n <span\n classList={{\n recording: recordState() === 'recording',\n paused: recordState() === 'paused',\n }}\n />\n <video ref={videoElem} autoplay controls={local.controls && mediaStream() !== null} />\n </div>\n </Show>\n </div>\n </>\n );\n}\n\nCaptureScreen.registry = () => {\n Button.registry();\n customElement<CaptureScreenProps>(\n 'n-capture-screen',\n {\n class: void 0,\n css: void 0,\n options: void 0,\n preview: void 0,\n controls: void 0,\n recorder: void 0,\n filename: void 0,\n captureScreenText: void 0,\n stopCaptureText: void 0,\n startRecorderText: void 0,\n stopRecorderText: void 0,\n pausedRecorderText: void 0,\n recorderingText: void 0,\n onErrorRecorder: void 0,\n onStopRecorder: void 0,\n onStartRecorder: void 0,\n onRecorderDataAvailable: void 0,\n onErrorCapture: void 0,\n onStopCapture: void 0,\n onStartCapture: void 0,\n onSaveRecorder: void 0,\n },\n (_, opt) => {\n const el = opt.element;\n const props = mergeProps(\n {\n onErrorRecorder(e: Event) {\n el.dispatchEvent(\n new CustomEvent('errorrecorder', {\n detail: e,\n }),\n );\n },\n onStopRecorder() {\n el.dispatchEvent(\n new CustomEvent('stoprecorder', {\n detail: void 0,\n }),\n );\n },\n onStartRecorder(state: MediaRecorder['state']) {\n el.dispatchEvent(\n new CustomEvent('startrecorder', {\n detail: state,\n }),\n );\n },\n onRecorderDataAvailable(e: MediaRecorderDataAvailableEvent) {\n el.dispatchEvent(\n new CustomEvent('recorderdataavailable', {\n detail: e,\n }),\n );\n },\n onErrorCapture(e: unknown) {\n el.dispatchEvent(\n new CustomEvent('errorcapture', {\n detail: e,\n }),\n );\n },\n onStopCapture() {\n el.dispatchEvent(\n new CustomEvent('stopcapture', {\n detail: void 0,\n }),\n );\n },\n onStartCapture(stream?: MediaStream) {\n el.dispatchEvent(\n new CustomEvent('startcapture', {\n detail: stream,\n }),\n );\n },\n onSaveRecorder(blob: Blob, fileName: string) {\n el.dispatchEvent(\n new CustomEvent('saverecorder', {\n detail: [blob, fileName],\n }),\n );\n },\n },\n _,\n );\n\n createEffect(() => {\n clearAttribute(el, ['css', 'options']);\n });\n return (\n <>\n <style textContent={inline} />\n <CaptureScreen {...props} />\n </>\n );\n },\n );\n};\nexport default CaptureScreen;\n"],"names":["createEffect","createMemo","createSignal","mergeProps","onCleanup","Show","splitProps","untrack","downloadBlob","isFunction","css","cx","customElement","clearAttribute","Button","theme","inline","style","displayMediaOptions","video","audio","echoCancellation","noiseSuppression","sampleRate","btnStatusDic","inactive","paused","recording","CaptureScreen","_","videoElem","baseStyle","local","props","options","captureScreenText","stopCaptureText","startRecorderText","stopRecorderText","pausedRecorderText","recorderingText","onErrorRecorder","chunks","mediaRecorder","setMediaRecorder","mediaStream","setMediaStream","recordState","setRecordState","handleStartRecorder","mr","onStartRecorder","state","start","resume","pause","handleRecorderDataAvailable","e","push","data","onRecorderDataAvailable","stopRecorder","stop","onStopRecorder","handleSaveRecorder","length","blob","Blob","type","name","filename","Date","toISOString","fileName","splice","onSaveRecorder","stopCapture","ms","tracks","getTracks","forEach","track","onStopCapture","startCapture","stream","navigator","mediaDevices","getDisplayMedia","addEventListener","onStartCapture","err","onErrorCapture","preview","srcObject","active","recorderInstance","MediaRecorder","onstop","onerror","ondataavailable","recorderText","class","recorder","controls","registry","opt","el","element","dispatchEvent","CustomEvent","detail"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["components/capture-screen/index.tsx"],"sourcesContent":["import {\n createEffect,\n createMemo,\n createSignal,\n mergeProps,\n onCleanup,\n Show,\n splitProps,\n untrack,\n} from 'solid-js';\nimport { downloadBlob, isFunction } 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 Button from '../button';\nimport theme, { inline } from '../theme';\n\nimport { style } from './style';\n\ndeclare interface MediaRecorderDataAvailableEvent extends Event {\n /** MediaRecorderDataAvailableEvent */\n data: Any;\n}\n\nexport interface CaptureScreenProps {\n /** 自定义类名 */\n class?: string;\n /** 自定义样式表 */\n css?: string;\n /** MediaStreamConstraints */\n options?: MediaStreamConstraints;\n /** 是否预览 */\n preview?: boolean;\n /** 预览时是否显示控制器 */\n controls?: boolean;\n /** 录制时配置项 */\n recorder?: boolean;\n /** 录制文件名称 */\n filename?: string;\n /** 捕获屏幕按钮文字 */\n captureScreenText?: string;\n /** 停止捕获按钮文字 */\n stopCaptureText?: string;\n /** 开始录制按钮文字 */\n startRecorderText?: string;\n /** 停止录制按钮文字 */\n stopRecorderText?: string;\n /** 暂停录制按钮文字 */\n pausedRecorderText?: string;\n /** 录制中按钮文字 */\n recorderingText?: string;\n /** 录制错误回调方法 */\n onErrorRecorder?: (e: Event) => void;\n /** 停止录制回调方法 */\n onStopRecorder?: () => void;\n /** 开始录制回调方法 */\n onStartRecorder?: (state: MediaRecorder['state']) => void;\n /** 记录媒体时触发 */\n onRecorderDataAvailable?: (e: MediaRecorderDataAvailableEvent) => void;\n /** 捕获屏幕错误回调方法 */\n onErrorCapture?: (err: unknown) => void;\n /** 停止捕获屏幕回调方法 */\n onStopCapture?: () => void;\n /** 开始捕获屏幕回调方法 */\n onStartCapture?: (stream?: MediaStream) => void;\n /** 自定义保存录制文件方法 */\n onSaveRecorder?: (blob: Blob, fileName: string) => void;\n}\nexport type CaptureScreenElement = CustomElement<\n CaptureScreenProps,\n | 'onErrorRecorder'\n | 'onStopRecorder'\n | 'onStartRecorder'\n | 'onRecorderDataAvailable'\n | 'onErrorCapture'\n | 'onStopCapture'\n | 'onStartCapture'\n | 'onSaveRecorder'\n>;\n\nconst displayMediaOptions: MediaStreamConstraints = {\n video: true,\n audio: {\n echoCancellation: true,\n noiseSuppression: true,\n sampleRate: 44100,\n },\n};\n\nconst btnStatusDic: Record<MediaRecorder['state'], 'primary' | 'warning' | 'success'> = {\n inactive: 'primary',\n paused: 'warning',\n recording: 'success',\n};\n\nfunction CaptureScreen(_: CaptureScreenProps) {\n const { baseStyle } = theme;\n const _props = mergeProps(\n {\n options: displayMediaOptions,\n captureScreenText: '捕获屏幕',\n stopCaptureText: '停止捕获',\n startRecorderText: '开始录制',\n stopRecorderText: '停止录制',\n pausedRecorderText: '暂停录制',\n recorderingText: '录制中',\n onErrorRecorder: null,\n },\n _,\n );\n const [local, props] = splitProps(_props, [\n 'options',\n 'preview',\n 'controls',\n 'recorder',\n 'filename',\n 'captureScreenText',\n 'stopCaptureText',\n 'startRecorderText',\n 'stopRecorderText',\n 'pausedRecorderText',\n 'recorderingText',\n 'onErrorRecorder',\n 'onStopRecorder',\n 'onStartRecorder',\n 'onStopCapture',\n 'onStartCapture',\n 'onRecorderDataAvailable',\n 'onErrorCapture',\n 'onSaveRecorder',\n 'class',\n 'css',\n ]);\n let videoElem: HTMLVideoElement | undefined;\n const chunks: Blob[] = [];\n const [mediaRecorder, setMediaRecorder] = createSignal<MediaRecorder | null>(null);\n const [mediaStream, setMediaStream] = createSignal<MediaStream | null>(null);\n const [recordState, setRecordState] = createSignal<MediaRecorder['state']>('inactive');\n\n // 开始录制\n function handleStartRecorder() {\n const mr = untrack(mediaRecorder);\n\n if (mr) {\n if (isFunction(local.onStartRecorder)) {\n local.onStartRecorder(mr.state);\n }\n switch (mr.state) {\n case 'inactive': // 不活跃\n mr.start();\n break;\n case 'paused': // 暂停\n mr.resume();\n break;\n // case 'recording': // 录制中\n default:\n mr.pause();\n break;\n }\n setRecordState(mr.state);\n }\n }\n function handleRecorderDataAvailable(e: MediaRecorderDataAvailableEvent) {\n chunks.push(e.data as Blob);\n local.onRecorderDataAvailable?.(e);\n }\n // 停止录制\n function stopRecorder() {\n const mr = untrack(mediaRecorder);\n\n // 未录制时不需要停止\n if (mr) {\n if (mr.state !== 'inactive') {\n mr.stop();\n }\n setRecordState(mr.state);\n }\n local.onStopRecorder?.();\n }\n function handleSaveRecorder() {\n if (!chunks.length) return;\n // 将录制内容保存到本地\n const blob: Blob = new Blob(chunks, {\n type: 'video/webm',\n });\n const name = local.filename || new Date().toISOString();\n const fileName = `${name}.webm`;\n\n chunks.splice(0);\n if (local.onSaveRecorder) {\n local.onSaveRecorder(blob, fileName);\n }\n // 保存文件\n downloadBlob(blob, fileName);\n }\n\n // 停止捕获屏幕\n function stopCapture() {\n // 如果在录制则先停止\n stopRecorder();\n const ms = untrack(mediaStream);\n\n if (ms) {\n const tracks = ms.getTracks();\n\n tracks.forEach((track: MediaStreamTrack) => {\n track.stop();\n });\n setMediaStream(null);\n }\n local.onStopCapture?.();\n }\n\n // 开始捕获屏幕\n async function startCapture() {\n stopCapture();\n try {\n const stream = await navigator.mediaDevices.getDisplayMedia({\n ...displayMediaOptions,\n ...local.options,\n });\n\n if (stream) {\n // 监听停止捕获屏幕\n stream.addEventListener('inactive', stopCapture, false);\n setMediaStream(stream);\n }\n local.onStartCapture?.(stream);\n } catch (err) {\n local.onErrorCapture?.(err);\n }\n }\n\n createEffect(() => {\n const ms = mediaStream();\n\n if (local.preview && videoElem && ms) {\n videoElem.srcObject = ms;\n }\n });\n\n createEffect(() => {\n const ms = mediaStream();\n\n if (ms?.active) {\n const recorderInstance = new MediaRecorder(ms);\n\n recorderInstance.onstop = handleSaveRecorder;\n recorderInstance.onerror = local.onErrorRecorder;\n // 每次timeslice记录毫秒级媒体时(或未记录整个媒体时,如果timeslice未指定)定期触发\n recorderInstance.ondataavailable = handleRecorderDataAvailable;\n setMediaRecorder(recorderInstance);\n } else {\n setMediaRecorder(null);\n }\n });\n\n onCleanup(() => {\n const mr = untrack(mediaRecorder);\n\n // 未录制时不需要停止\n if (mr && mr.state !== 'inactive') {\n mr.stop();\n }\n const ms = untrack(mediaStream);\n\n if (ms) {\n const tracks = ms.getTracks();\n\n tracks.forEach((track: MediaStreamTrack) => {\n track.stop();\n });\n }\n });\n const recorderText = createMemo(() => {\n return {\n paused: local.pausedRecorderText,\n recording: local.recorderingText,\n inactive: local.startRecorderText,\n }[recordState()];\n });\n\n return (\n <>\n <style textContent={baseStyle()} />\n <style textContent={style} />\n <Show when={local.css}>\n <style textContent={css(local.css)} />\n </Show>\n <div class={cx('capture-screen', local.class)} {...props}>\n <div class=\"controller\">\n <n-button onClick={startCapture} class=\"btn\">\n {local.captureScreenText}\n </n-button>\n <Show when={mediaStream()}>\n <>\n <n-button danger={true} onClick={stopCapture} class=\"btn\">\n {local.stopCaptureText}\n </n-button>\n <Show when={local.recorder}>\n <div class=\"record\">\n <n-button\n type={btnStatusDic[recordState()]}\n onClick={handleStartRecorder}\n class=\"btn\"\n >\n <span>{recorderText()}</span>\n </n-button>\n <Show when={recordState() !== 'inactive'}>\n <n-button type=\"error\" onClick={stopRecorder} class=\"btn\">\n {local.stopRecorderText}\n </n-button>\n </Show>\n </div>\n </Show>\n </>\n </Show>\n </div>\n <Show when={local.preview && mediaStream()}>\n <div class=\"view\">\n <span\n classList={{\n recording: recordState() === 'recording',\n paused: recordState() === 'paused',\n }}\n />\n <video ref={videoElem} autoplay controls={local.controls && mediaStream() !== null} />\n </div>\n </Show>\n </div>\n </>\n );\n}\n\nCaptureScreen.registry = () => {\n Button.registry();\n customElement<CaptureScreenProps>(\n 'n-capture-screen',\n {\n class: void 0,\n css: void 0,\n options: void 0,\n preview: void 0,\n controls: void 0,\n recorder: void 0,\n filename: void 0,\n captureScreenText: void 0,\n stopCaptureText: void 0,\n startRecorderText: void 0,\n stopRecorderText: void 0,\n pausedRecorderText: void 0,\n recorderingText: void 0,\n onErrorRecorder: void 0,\n onStopRecorder: void 0,\n onStartRecorder: void 0,\n onRecorderDataAvailable: void 0,\n onErrorCapture: void 0,\n onStopCapture: void 0,\n onStartCapture: void 0,\n onSaveRecorder: void 0,\n },\n (_, opt) => {\n const el = opt.element;\n const props = mergeProps(\n {\n onErrorRecorder(e: Event) {\n el.dispatchEvent(\n new CustomEvent('errorrecorder', {\n detail: e,\n }),\n );\n },\n onStopRecorder() {\n el.dispatchEvent(\n new CustomEvent('stoprecorder', {\n detail: void 0,\n }),\n );\n },\n onStartRecorder(state: MediaRecorder['state']) {\n el.dispatchEvent(\n new CustomEvent('startrecorder', {\n detail: state,\n }),\n );\n },\n onRecorderDataAvailable(e: MediaRecorderDataAvailableEvent) {\n el.dispatchEvent(\n new CustomEvent('recorderdataavailable', {\n detail: e,\n }),\n );\n },\n onErrorCapture(e: unknown) {\n el.dispatchEvent(\n new CustomEvent('errorcapture', {\n detail: e,\n }),\n );\n },\n onStopCapture() {\n el.dispatchEvent(\n new CustomEvent('stopcapture', {\n detail: void 0,\n }),\n );\n },\n onStartCapture(stream?: MediaStream) {\n el.dispatchEvent(\n new CustomEvent('startcapture', {\n detail: stream,\n }),\n );\n },\n onSaveRecorder(blob: Blob, fileName: string) {\n el.dispatchEvent(\n new CustomEvent('saverecorder', {\n detail: [blob, fileName],\n }),\n );\n },\n },\n _,\n );\n\n createEffect(() => {\n clearAttribute(el, ['css', 'options']);\n });\n return (\n <>\n <style textContent={inline} />\n <CaptureScreen {...props} />\n </>\n );\n },\n );\n};\nexport default CaptureScreen;\n"],"names":["createEffect","createMemo","createSignal","mergeProps","onCleanup","Show","splitProps","untrack","downloadBlob","isFunction","css","cx","customElement","clearAttribute","Button","theme","inline","style","displayMediaOptions","video","audio","echoCancellation","noiseSuppression","sampleRate","btnStatusDic","inactive","paused","recording","CaptureScreen","_","videoElem","baseStyle","local","props","options","captureScreenText","stopCaptureText","startRecorderText","stopRecorderText","pausedRecorderText","recorderingText","onErrorRecorder","chunks","mediaRecorder","setMediaRecorder","mediaStream","setMediaStream","recordState","setRecordState","handleStartRecorder","mr","onStartRecorder","state","start","resume","pause","handleRecorderDataAvailable","e","push","data","onRecorderDataAvailable","stopRecorder","stop","onStopRecorder","handleSaveRecorder","length","blob","Blob","type","name","filename","Date","toISOString","fileName","splice","onSaveRecorder","stopCapture","ms","tracks","getTracks","forEach","track","onStopCapture","startCapture","stream","navigator","mediaDevices","getDisplayMedia","addEventListener","onStartCapture","err","onErrorCapture","preview","srcObject","active","recorderInstance","MediaRecorder","onstop","onerror","ondataavailable","recorderText","class","recorder","controls","registry","opt","el","element","dispatchEvent","CustomEvent","detail"],"mappings":"gjCAAA,QACEA,gBAAAA,CAAY,CACZC,cAAAA,CAAU,CACVC,gBAAAA,CAAY,CACZC,cAAAA,CAAU,CACVC,aAAAA,CAAS,CACTC,QAAAA,CAAI,CACJC,cAAAA,CAAU,CACVC,WAAAA,CAAO,KACF,UAAW,AAClB,QAASC,gBAAAA,CAAY,CAAEC,cAAAA,CAAU,KAAQ,gBAAiB,AAC1D,QAASC,OAAAA,CAAG,CAAEC,MAAAA,CAAE,KAAQ,aAAc,AACtC,QAASC,iBAAAA,CAAa,KAAQ,eAAgB,AAG9C,QAASC,kBAAAA,CAAc,KAAQ,iBAAkB,AACjD,QAAOC,MAAY,WAAY,AAC/B,QAAOC,GAASC,UAAAA,CAAM,KAAQ,UAAW,AAEzC,QAASC,SAAAA,CAAK,KAAQ,SAAU,CA+DhC,IAAMC,EAA8C,CAClDC,MAAO,CAAA,EACPC,MAAO,CACLC,iBAAkB,CAAA,EAClBC,iBAAkB,CAAA,EAClBC,WAAY,KACd,CACF,EAEMC,EAAkF,CACtFC,SAAU,UACVC,OAAQ,UACRC,UAAW,SACb,EAEA,SAASC,EAAcC,CAAqB,MAsCtCC,EArCJ,GAAM,CAAEC,UAAAA,CAAS,CAAE,CAAGhB,EAchB,CAACiB,EAAOC,EAAM,CAAG3B,EAbRH,EACb,CACE+B,QAAShB,EACTiB,kBAAmB,OACnBC,gBAAiB,OACjBC,kBAAmB,OACnBC,iBAAkB,OAClBC,mBAAoB,OACpBC,gBAAiB,MACjBC,gBAAiB,IACnB,EACAZ,GAEwC,CACxC,UACA,UACA,WACA,WACA,WACA,oBACA,kBACA,oBACA,mBACA,qBACA,kBACA,kBACA,iBACA,kBACA,gBACA,iBACA,0BACA,iBACA,iBACA,QACA,MACD,EAEKa,EAAiB,EAAE,CACnB,CAACC,EAAeC,EAAiB,CAAG1C,EAAmC,MACvE,CAAC2C,EAAaC,EAAe,CAAG5C,EAAiC,MACjE,CAAC6C,EAAaC,EAAe,CAAG9C,EAAqC,YAG3E,SAAS+C,IACP,IAAMC,EAAK3C,EAAQoC,GAEnB,GAAIO,EAAI,CAIN,OAHIzC,EAAWuB,EAAMmB,eAAe,GAClCnB,EAAMmB,eAAe,CAACD,EAAGE,KAAK,EAExBF,EAAGE,KAAK,EACd,IAAK,WACHF,EAAGG,KAAK,GACR,KACF,KAAK,SACHH,EAAGI,MAAM,GACT,KAEF,SACEJ,EAAGK,KAAK,EAEZ,CACAP,EAAeE,EAAGE,KAAK,CACzB,CACF,CACA,SAASI,EAA4BC,CAAkC,EACrEf,EAAOgB,IAAI,CAACD,EAAEE,IAAI,QAClB3B,EAAM4B,uBAAuB,EAA7B5B,EAAM4B,uBAAuB,MAA7B5B,EAAgCyB,EAClC,CAEA,SAASI,IACP,IAAMX,EAAK3C,EAAQoC,GAGfO,IACe,aAAbA,EAAGE,KAAK,EACVF,EAAGY,IAAI,GAETd,EAAeE,EAAGE,KAAK,SAEzBpB,EAAM+B,cAAc,EAApB/B,EAAM+B,cAAc,MAApB/B,EACF,CACA,SAASgC,IACP,GAAI,CAACtB,EAAOuB,MAAM,CAAE,OAEpB,IAAMC,EAAa,IAAIC,KAAKzB,EAAQ,CAClC0B,KAAM,YACR,GACMC,EAAOrC,EAAMsC,QAAQ,EAAI,IAAIC,OAAOC,WAAW,GAC/CC,EAAW,CAAC,EAAEJ,EAAK,KAAK,CAAC,CAE/B3B,EAAOgC,MAAM,CAAC,GACV1C,EAAM2C,cAAc,EACtB3C,EAAM2C,cAAc,CAACT,EAAMO,GAG7BjE,EAAa0D,EAAMO,EACrB,CAGA,SAASG,IAEPf,IACA,IAAMgB,EAAKtE,EAAQsC,GAEfgC,IAGFC,AAFeD,EAAGE,SAAS,GAEpBC,OAAO,CAAC,AAACC,IACdA,EAAMnB,IAAI,EACZ,GACAhB,EAAe,aAEjBd,EAAMkD,aAAa,EAAnBlD,EAAMkD,aAAa,MAAnBlD,EACF,UAGemD,WAAAA,iCAAAA,mBAAf,YACEP,IACA,GAAI,CACF,IAAMQ,EAAS,MAAMC,UAAUC,YAAY,CAACC,eAAe,CAAC,KACvDrE,EACAc,EAAME,OAAO,GAGdkD,IAEFA,EAAOI,gBAAgB,CAAC,WAAYZ,EAAa,CAAA,GACjD9B,EAAesC,UAEjBpD,EAAMyD,cAAc,EAApBzD,EAAMyD,cAAc,MAApBzD,EAAuBoD,EACzB,CAAE,MAAOM,EAAK,OACZ1D,EAAM2D,cAAc,EAApB3D,EAAM2D,cAAc,MAApB3D,EAAuB0D,EACzB,CACF,GAjBeP,qMAmBfnF,EAAa,KACX,IAAM6E,EAAKhC,GAEPb,CAAAA,EAAM4D,OAAO,EAAI9D,GAAa+C,GAChC/C,CAAAA,EAAU+D,SAAS,CAAGhB,CAAC,CAE3B,GAEA7E,EAAa,KACX,IAAM6E,EAAKhC,IAEX,SAAIgC,SAAAA,EAAIiB,MAAM,CAAE,CACd,IAAMC,EAAmB,IAAIC,cAAcnB,EAE3CkB,CAAAA,EAAiBE,MAAM,CAAGjC,EAC1B+B,EAAiBG,OAAO,CAAGlE,EAAMS,eAAe,CAEhDsD,EAAiBI,eAAe,CAAG3C,EACnCZ,EAAiBmD,EACnB,MACEnD,EAAiB,KAErB,GAEAxC,EAAU,KACR,IAAM8C,EAAK3C,EAAQoC,GAGfO,GAAMA,AAAa,aAAbA,EAAGE,KAAK,EAChBF,EAAGY,IAAI,GAET,IAAMe,EAAKtE,EAAQsC,GAEfgC,GAGFC,AAFeD,EAAGE,SAAS,GAEpBC,OAAO,CAAC,AAACC,IACdA,EAAMnB,IAAI,EACZ,EAEJ,GACA,IAAMsC,EAAenG,EAAW,IACvB,CAAA,CACLyB,OAAQM,EAAMO,kBAAkB,CAChCZ,UAAWK,EAAMQ,eAAe,CAChCf,SAAUO,EAAMK,iBAAiB,AACnC,CAAA,CAAC,CAACU,IAAc,EAGlB,0DAEwBhB,gDACAd,UACnBZ,qBAAW2B,EAAMtB,GAAG,8DACCA,EAAIsB,EAAMtB,GAAG,uFAEvBC,EAAG,iBAAkBqB,EAAMqE,KAAK,IAAOpE,sBAE5BkD,4BAChBnD,EAAMG,iBAAiB,QAEzB9B,qBAAWwC,8DAEyB+B,eAAf,CAAA,wBACf5C,EAAMI,eAAe,UAEvB/B,qBAAW2B,EAAMsE,QAAQ,4EAIXrD,wBAGFmD,SAER/F,oBAAW0C,AAAkB,aAAlBA,iDACsBc,4BAC7B7B,EAAMM,gBAAgB,0BARnBd,CAAY,CAACuB,IAAc,uBAgB5C1C,qBAAW2B,QAAAA,EAAM4D,OAAO,KAAI/C,+DAQbf,oCAAAA,kBAJqB,cAAlBiB,SACe,WAAlBA,OAG8Bf,EAAMuE,QAAQ,EAAI1D,AAAkB,OAAlBA,4MAMxE,CAEAjB,EAAc4E,QAAQ,CAAG,KACvB1F,EAAO0F,QAAQ,GACf5F,EACE,mBACA,CACEyF,MAAO,KAAK,EACZ3F,IAAK,KAAK,EACVwB,QAAS,KAAK,EACd0D,QAAS,KAAK,EACdW,SAAU,KAAK,EACfD,SAAU,KAAK,EACfhC,SAAU,KAAK,EACfnC,kBAAmB,KAAK,EACxBC,gBAAiB,KAAK,EACtBC,kBAAmB,KAAK,EACxBC,iBAAkB,KAAK,EACvBC,mBAAoB,KAAK,EACzBC,gBAAiB,KAAK,EACtBC,gBAAiB,KAAK,EACtBsB,eAAgB,KAAK,EACrBZ,gBAAiB,KAAK,EACtBS,wBAAyB,KAAK,EAC9B+B,eAAgB,KAAK,EACrBT,cAAe,KAAK,EACpBO,eAAgB,KAAK,EACrBd,eAAgB,KAAK,CACvB,EACA,CAAC9C,EAAG4E,KACF,IAAMC,EAAKD,EAAIE,OAAO,CAChB1E,EAAQ9B,EACZ,CACEsC,gBAAgBgB,CAAQ,EACtBiD,EAAGE,aAAa,CACd,IAAIC,YAAY,gBAAiB,CAC/BC,OAAQrD,CACV,GAEJ,EACAM,iBACE2C,EAAGE,aAAa,CACd,IAAIC,YAAY,eAAgB,CAC9BC,OAAQ,KAAK,CACf,GAEJ,EACA3D,gBAAgBC,CAA6B,EAC3CsD,EAAGE,aAAa,CACd,IAAIC,YAAY,gBAAiB,CAC/BC,OAAQ1D,CACV,GAEJ,EACAQ,wBAAwBH,CAAkC,EACxDiD,EAAGE,aAAa,CACd,IAAIC,YAAY,wBAAyB,CACvCC,OAAQrD,CACV,GAEJ,EACAkC,eAAelC,CAAU,EACvBiD,EAAGE,aAAa,CACd,IAAIC,YAAY,eAAgB,CAC9BC,OAAQrD,CACV,GAEJ,EACAyB,gBACEwB,EAAGE,aAAa,CACd,IAAIC,YAAY,cAAe,CAC7BC,OAAQ,KAAK,CACf,GAEJ,EACArB,eAAeL,CAAoB,EACjCsB,EAAGE,aAAa,CACd,IAAIC,YAAY,eAAgB,CAC9BC,OAAQ1B,CACV,GAEJ,EACAT,eAAeT,CAAU,CAAEO,CAAgB,EACzCiC,EAAGE,aAAa,CACd,IAAIC,YAAY,eAAgB,CAC9BC,OAAQ,CAAC5C,EAAMO,EAAS,AAC1B,GAEJ,CACF,EACA5C,GAMF,OAHA7B,EAAa,KACXa,EAAe6F,EAAI,CAAC,MAAO,UAAU,CACvC,yCAGwB1F,UACnBY,EAAkBK,GAGzB,EAEJ,CACA,gBAAeL,CAAc"}
|
package/es/carousel/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{template as e}from"solid-js/web";import{setAttribute as t}from"solid-js/web";import{insert as i}from"solid-js/web";import{getOwner as r}from"solid-js/web";import{effect as l}from"solid-js/web";import{delegateEvents as o}from"solid-js/web";import{createComponent as
|
|
1
|
+
import{template as e}from"solid-js/web";import{setAttribute as t}from"solid-js/web";import{insert as i}from"solid-js/web";import{getOwner as r}from"solid-js/web";import{effect as l}from"solid-js/web";import{delegateEvents as o}from"solid-js/web";import{createComponent as s}from"solid-js/web";import{className as n}from"solid-js/web";import{addEventListener as a}from"solid-js/web";let d=e("<style> "),c=e("<style>"),m=e('<section class="header">'),f=e('<div class="dots">'),v=e('<section><section class="list"><div class="item"></div><div class="item"></div><div class="item"></div></section><slot name="header"></slot><div class="prev"></div><div class="next">'),h=e('<i class="dot">');import{createEffect as u,createMemo as g,createSignal as p,Index as b,mergeProps as w,onCleanup as C,Show as j}from"solid-js";import{isFunction as x}from"@moneko/common";import{css as y,cx as $}from"@moneko/css";import{customElement as _}from"solid-element";import{clearAttribute as k}from"../basic-config";import S,{block as E}from"../theme";import{style as I}from"./style";function N(e){let o;let{baseStyle:_}=S,k=w({autoplay:-1,children:[]},e),[E,N]=p(0),[A,L]=p(1),[M,O]=p(0),[P,q]=p(0);function z(){let e=P();-1===e?O(E()):1===e&&O(A()),q(0),x(k.onChange)&&k.onChange(M())}function B(){q(-1)}function D(){q(1)}function F(e,t){t.stopPropagation();let i=M(),r=20*Math.floor(i/20)+e;r>i?(q(1),L(r)):r<i&&(q(-1),N(r))}let G=g(()=>[...k.children]),H=g(()=>Array(G().length>20?20:G().length).fill(null));u(()=>{void 0!==k.offset&&O(Number(k.offset))}),u(()=>{var e,t;let i,r;let[l,o]=(e=M(),t=G(),i=e-1,r=e+1,i<0&&(i=t.length-1),r>t.length-1&&(r=0),[i,r]);N(l),L(o)}),u(()=>{clearInterval(o);let e=Number(k.autoplay);e>0&&(o=setInterval(()=>{e<1&&clearInterval(o),D()},e))}),C(()=>{clearInterval(o)});let J=g(()=>x(k.header)?k.header(M()):k.header);return[(()=>{let e=d(),t=e.firstChild;return l(()=>t.data=_()),e})(),(()=>{let e=c();return e.textContent=I,e})(),s(j,{get when(){return k.css},get children(){let e=d(),t=e.firstChild;return l(()=>t.data=y(k.css)),e}}),(()=>{let e=v(),o=e.firstChild,d=o.firstChild,c=d.nextSibling,u=c.nextSibling,g=o.nextSibling,p=g.nextSibling,w=p.nextSibling;return i(d,()=>G()[E()]),a(c,"animationend",z),i(c,()=>G()[M()]),i(u,()=>G()[A()]),g._$owner=r(),i(e,s(j,{get when(){return J()},get children(){let e=m();return i(e,J),e}}),p),a(p,"click",B,!0),a(w,"click",D,!0),i(e,s(j,{get when(){return k.dots},get children(){let e=f();return i(e,s(b,{get each(){return H()},children:(e,t)=>(()=>{let e=h();return a(e,"click",F.bind(null,t),!0),l(()=>e.classList.toggle("active",!(t!==M()%20+P()))),e})()})),e}}),null),l(i=>{let r=$("carousel",k.class),l=P();return r!==i._v$&&n(e,i._v$=r),l!==i._v$2&&t(o,"data-dir",i._v$2=l),i},{_v$:void 0,_v$2:void 0}),e})()]}N.registry=()=>{_("n-carousel",{children:void 0,autoplay:void 0,class:void 0,css:void 0,offset:void 0,dots:void 0,header:void 0,onChange:void 0},(e,t)=>{let i=t.element,r=w({onChange(e){i.offset=e,i.dispatchEvent(new CustomEvent("change",{detail:e}))}},e);return u(()=>{k(i,["css"]),i.replaceChildren()}),[(()=>{let e=c();return e.textContent=E,e})(),s(N,r)]})};export default N;o(["click"]);
|
package/es/carousel/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["components/carousel/index.tsx"],"sourcesContent":["import {\n createEffect,\n createMemo,\n createSignal,\n Index,\n mergeProps,\n onCleanup,\n Show,\n} from 'solid-js';\nimport { isFunction } from '@moneko/common';\nimport { css, cx } from '@moneko/css';\nimport { customElement } from 'solid-element';\n\nimport type { CustomElement } from '..';\nimport { clearAttribute, type JSXElement } from '../basic-config';\nimport theme, { block } from '../theme';\n\nimport { style } from './style';\n\nexport interface CarouselProps {\n /** 自定义类名 */\n class?: string;\n /** 自定义样式表 */\n css?: string;\n /** 轮播的内容 */\n children?: JSXElement[];\n /** 当前内容的位置\n * @default 0\n */\n offset?: number;\n /** 开启指示器 */\n dots?: boolean;\n /** 设置自动播放时长, 不设置时不自动播放 */\n autoplay?: number;\n /** 自定义头部 */\n header?: (current: number) => JSXElement;\n /** 切换显示的位置时的回调方法 */\n onChange?: (e: number) => void;\n}\nexport type CarouselElement = CustomElement<CarouselProps>;\n\nfunction Carousel(_props: CarouselProps) {\n const { baseStyle } = theme;\n const props = mergeProps({ autoplay: -1, children: [] }, _props);\n const [left, setLeft] = createSignal(0);\n const [right, setRight] = createSignal(1);\n const [offset, setOffset] = createSignal(0);\n const [direction, setDirection] = createSignal<1 | -1 | 0>(0);\n let playTimer: NodeJS.Timeout | undefined;\n\n function onOffsetChange() {\n const _dir = direction();\n\n if (_dir === -1) {\n setOffset(left());\n } else if (_dir === 1) {\n setOffset(right());\n }\n setDirection(0);\n if (isFunction(props.onChange)) {\n props.onChange(offset());\n }\n }\n function handlePrev() {\n setDirection(-1);\n }\n function handleNext() {\n setDirection(1);\n }\n function handleDot(idx: number, e: Event) {\n e.stopPropagation();\n const _offset = offset();\n const _current = Math.floor(_offset / 20) * 20 + idx;\n\n if (_current > _offset) {\n setDirection(1);\n setRight(_current);\n } else if (_current < _offset) {\n setDirection(-1);\n setLeft(_current);\n }\n }\n function getPrevNext(idx: number, arr: JSXElement[]) {\n let _prev = idx - 1,\n _next = idx + 1;\n\n if (_prev < 0) {\n _prev = arr.length - 1;\n }\n if (_next > arr.length - 1) {\n _next = 0;\n }\n return [_prev, _next];\n }\n const list = createMemo(() => [...props.children]);\n const dotLen = createMemo(() => Array(list().length > 20 ? 20 : list().length).fill(null));\n\n createEffect(() => {\n if (props.offset !== void 0) {\n setOffset(Number(props.offset));\n }\n });\n createEffect(() => {\n const [_prev, _next] = getPrevNext(offset(), list());\n\n setLeft(_prev);\n setRight(_next);\n });\n createEffect(() => {\n clearInterval(playTimer);\n const autoplay = Number(props.autoplay);\n\n if (autoplay > 0) {\n playTimer = setInterval(() => {\n if (autoplay < 1) {\n clearInterval(playTimer);\n }\n handleNext();\n }, autoplay);\n }\n });\n\n onCleanup(() => {\n clearInterval(playTimer);\n });\n const header = createMemo(() =>\n isFunction(props.header) ? props.header(offset()) : props.header,\n );\n\n return (\n <>\n <style textContent={baseStyle()} />\n <style textContent={style} />\n <Show when={props.css}>\n <style textContent={css(props.css)} />\n </Show>\n <section class={cx('carousel', props.class)}>\n <section class=\"list\" data-dir={direction()}>\n <div class=\"item\">{list()[left()]}</div>\n <div class=\"item\" onAnimationEnd={onOffsetChange}>\n {list()[offset()]}\n </div>\n <div class=\"item\">{list()[right()]}</div>\n </section>\n <slot name=\"header\" />\n <Show when={header()}>\n <section class=\"header\">{header()}</section>\n </Show>\n <div class=\"prev\" onClick={handlePrev} />\n <div class=\"next\" onClick={handleNext} />\n <Show when={props.dots}>\n <div class=\"dots\">\n <Index each={dotLen()}>\n {(_, idx) => {\n return (\n <i\n class=\"dot\"\n classList={{\n active: idx === (offset() % 20) + direction(),\n }}\n onClick={handleDot.bind(null, idx)}\n />\n );\n }}\n </Index>\n </div>\n </Show>\n </section>\n </>\n );\n}\n\nCarousel.registry = () => {\n customElement<CarouselProps>(\n 'n-carousel',\n {\n children: void 0,\n autoplay: void 0,\n class: void 0,\n css: void 0,\n offset: void 0,\n dots: void 0,\n header: void 0,\n onChange: void 0,\n },\n (_, opt) => {\n const el = opt.element;\n const props = mergeProps(\n {\n onChange(key: number) {\n el.offset = key;\n el.dispatchEvent(\n new CustomEvent('change', {\n detail: key,\n }),\n );\n },\n },\n _,\n );\n\n createEffect(() => {\n clearAttribute(el, ['css']);\n el.replaceChildren();\n });\n return (\n <>\n <style textContent={block} />\n <Carousel {...props} />\n </>\n );\n },\n );\n};\nexport default Carousel;\n"],"names":["createEffect","createMemo","createSignal","Index","mergeProps","onCleanup","Show","isFunction","css","cx","customElement","clearAttribute","theme","block","style","Carousel","_props","playTimer","baseStyle","props","autoplay","children","left","setLeft","right","setRight","offset","setOffset","direction","setDirection","onOffsetChange","_dir","onChange","handlePrev","handleNext","handleDot","idx","e","stopPropagation","_offset","_current","Math","floor","list","dotLen","Array","length","fill","Number","arr","_prev","_next","clearInterval","setInterval","header","dots","_","bind","class","registry","opt","el","element","key","dispatchEvent","CustomEvent","detail","replaceChildren"],"mappings":"+qBAAA,QACEA,gBAAAA,CAAY,CACZC,cAAAA,CAAU,CACVC,gBAAAA,CAAY,CACZC,SAAAA,CAAK,CACLC,cAAAA,CAAU,CACVC,aAAAA,CAAS,CACTC,QAAAA,CAAI,KACC,UAAW,AAClB,QAASC,
|
|
1
|
+
{"version":3,"sources":["components/carousel/index.tsx"],"sourcesContent":["import {\n createEffect,\n createMemo,\n createSignal,\n Index,\n mergeProps,\n onCleanup,\n Show,\n} from 'solid-js';\nimport { isFunction } from '@moneko/common';\nimport { css, cx } from '@moneko/css';\nimport { customElement } from 'solid-element';\n\nimport type { CustomElement } from '..';\nimport { clearAttribute, type JSXElement } from '../basic-config';\nimport theme, { block } from '../theme';\n\nimport { style } from './style';\n\nexport interface CarouselProps {\n /** 自定义类名 */\n class?: string;\n /** 自定义样式表 */\n css?: string;\n /** 轮播的内容 */\n children?: JSXElement[];\n /** 当前内容的位置\n * @default 0\n */\n offset?: number;\n /** 开启指示器 */\n dots?: boolean;\n /** 设置自动播放时长, 不设置时不自动播放 */\n autoplay?: number;\n /** 自定义头部 */\n header?: (current: number) => JSXElement;\n /** 切换显示的位置时的回调方法 */\n onChange?: (e: number) => void;\n}\nexport type CarouselElement = CustomElement<CarouselProps>;\n\nfunction Carousel(_props: CarouselProps) {\n const { baseStyle } = theme;\n const props = mergeProps({ autoplay: -1, children: [] }, _props);\n const [left, setLeft] = createSignal(0);\n const [right, setRight] = createSignal(1);\n const [offset, setOffset] = createSignal(0);\n const [direction, setDirection] = createSignal<1 | -1 | 0>(0);\n let playTimer: NodeJS.Timeout | undefined;\n\n function onOffsetChange() {\n const _dir = direction();\n\n if (_dir === -1) {\n setOffset(left());\n } else if (_dir === 1) {\n setOffset(right());\n }\n setDirection(0);\n if (isFunction(props.onChange)) {\n props.onChange(offset());\n }\n }\n function handlePrev() {\n setDirection(-1);\n }\n function handleNext() {\n setDirection(1);\n }\n function handleDot(idx: number, e: Event) {\n e.stopPropagation();\n const _offset = offset();\n const _current = Math.floor(_offset / 20) * 20 + idx;\n\n if (_current > _offset) {\n setDirection(1);\n setRight(_current);\n } else if (_current < _offset) {\n setDirection(-1);\n setLeft(_current);\n }\n }\n function getPrevNext(idx: number, arr: JSXElement[]) {\n let _prev = idx - 1,\n _next = idx + 1;\n\n if (_prev < 0) {\n _prev = arr.length - 1;\n }\n if (_next > arr.length - 1) {\n _next = 0;\n }\n return [_prev, _next];\n }\n const list = createMemo(() => [...props.children]);\n const dotLen = createMemo(() => Array(list().length > 20 ? 20 : list().length).fill(null));\n\n createEffect(() => {\n if (props.offset !== void 0) {\n setOffset(Number(props.offset));\n }\n });\n createEffect(() => {\n const [_prev, _next] = getPrevNext(offset(), list());\n\n setLeft(_prev);\n setRight(_next);\n });\n createEffect(() => {\n clearInterval(playTimer);\n const autoplay = Number(props.autoplay);\n\n if (autoplay > 0) {\n playTimer = setInterval(() => {\n if (autoplay < 1) {\n clearInterval(playTimer);\n }\n handleNext();\n }, autoplay);\n }\n });\n\n onCleanup(() => {\n clearInterval(playTimer);\n });\n const header = createMemo(() =>\n isFunction(props.header) ? props.header(offset()) : props.header,\n );\n\n return (\n <>\n <style textContent={baseStyle()} />\n <style textContent={style} />\n <Show when={props.css}>\n <style textContent={css(props.css)} />\n </Show>\n <section class={cx('carousel', props.class)}>\n <section class=\"list\" data-dir={direction()}>\n <div class=\"item\">{list()[left()]}</div>\n <div class=\"item\" onAnimationEnd={onOffsetChange}>\n {list()[offset()]}\n </div>\n <div class=\"item\">{list()[right()]}</div>\n </section>\n <slot name=\"header\" />\n <Show when={header()}>\n <section class=\"header\">{header()}</section>\n </Show>\n <div class=\"prev\" onClick={handlePrev} />\n <div class=\"next\" onClick={handleNext} />\n <Show when={props.dots}>\n <div class=\"dots\">\n <Index each={dotLen()}>\n {(_, idx) => {\n return (\n <i\n class=\"dot\"\n classList={{\n active: idx === (offset() % 20) + direction(),\n }}\n onClick={handleDot.bind(null, idx)}\n />\n );\n }}\n </Index>\n </div>\n </Show>\n </section>\n </>\n );\n}\n\nCarousel.registry = () => {\n customElement<CarouselProps>(\n 'n-carousel',\n {\n children: void 0,\n autoplay: void 0,\n class: void 0,\n css: void 0,\n offset: void 0,\n dots: void 0,\n header: void 0,\n onChange: void 0,\n },\n (_, opt) => {\n const el = opt.element;\n const props = mergeProps(\n {\n onChange(key: number) {\n el.offset = key;\n el.dispatchEvent(\n new CustomEvent('change', {\n detail: key,\n }),\n );\n },\n },\n _,\n );\n\n createEffect(() => {\n clearAttribute(el, ['css']);\n el.replaceChildren();\n });\n return (\n <>\n <style textContent={block} />\n <Carousel {...props} />\n </>\n );\n },\n );\n};\nexport default Carousel;\n"],"names":["createEffect","createMemo","createSignal","Index","mergeProps","onCleanup","Show","isFunction","css","cx","customElement","clearAttribute","theme","block","style","Carousel","_props","playTimer","baseStyle","props","autoplay","children","left","setLeft","right","setRight","offset","setOffset","direction","setDirection","onOffsetChange","_dir","onChange","handlePrev","handleNext","handleDot","idx","e","stopPropagation","_offset","_current","Math","floor","list","dotLen","Array","length","fill","Number","arr","_prev","_next","clearInterval","setInterval","header","dots","_","bind","class","registry","opt","el","element","key","dispatchEvent","CustomEvent","detail","replaceChildren"],"mappings":"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"}
|
package/es/code/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
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{insert as r}from"solid-js/web";import{effect as n}from"solid-js/web";import{delegateEvents as l}from"solid-js/web";import{createComponent as s}from"solid-js/web";import{classList as a}from"solid-js/web";import{addEventListener as d}from"solid-js/web";let c=o("<style> "),h=o("<style>"),
|
|
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{insert as r}from"solid-js/web";import{effect as n}from"solid-js/web";import{delegateEvents as l}from"solid-js/web";import{createComponent as s}from"solid-js/web";import{classList as a}from"solid-js/web";import{addEventListener as d}from"solid-js/web";let c=o("<style> "),h=o("<style>"),g=o('<div class="toolbar">'),u=o("<pre><code>");import{createEffect as m,createMemo as f,createResource as p,createSignal as v,createUniqueId as w,mergeProps as C,onCleanup as b,Show as y,untrack as S}from"solid-js";import{isFunction as k,setClipboard as j}from"@moneko/common";import{css as $}from"@moneko/css";import{customElement as x}from"solid-element";import{clearAttribute as E}from"../basic-config";import A from"../theme";import{CopyIcon as P}from"./copy-icon";import{darkCss as _,lightCss as z,style as H}from"./style";function T(o){let l,C;let{isDark:x}=A,E=/%[0-9A-Fa-f]{2}/,T=w(),[W,L]=v(""),[R,F]=v();function I(){var e;return e=function*(){return window.Prism?(window.Prism.disableWorkerMessageHandler=!0,window.Prism.manual=!0,window.Prism):(yield import("../prism")).default},(I=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[M]=p("prism",function(){return I.apply(this,arguments)}),O=f(()=>{var t;return o.title||(null==(t=o.language)?void 0:t.split(" ").pop())});function U(){j(S(W),l)}m(()=>{let t=o.code||"";E.test(t)&&(t=decodeURIComponent(t)),l&&(l.normalize(),t!==l.textContent&&L(t))});let q=function(t){t.target.normalize();let e=t.target.textContent;B(o.language,e,!0),k(o.onChange)&&o.onChange(e)};function B(t="markup",e,o,i={}){C&&(clearTimeout(C),C=void 0);let r=M();e&&r&&(C=setTimeout(()=>{if(clearTimeout(C),CSS.highlights){o&&CSS.highlights.forEach((t,e)=>{e.startsWith(T)&&t.clear()});let n=t.split(" "),s=r.languages[n[0]];s&&l&&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=T+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}(l,r.tokenize(e,s),i),n.length>1||"git"===n[0]?B(n[1],e,!1,i):F(Object.values(i).join(""))}else throw Error("不支持 CSS Highlights");C=void 0},0))}return m(()=>{B(o.language,W(),!0)}),b(()=>{if(CSS.highlights)for(let t of CSS.highlights.keys())t.startsWith(T)&&CSS.highlights.delete(t)}),[(()=>{let t=c(),e=t.firstChild;return n(()=>e.data=x()?_:z),t})(),(()=>{let t=c(),e=t.firstChild;return n(()=>e.data=R()),t})(),(()=>{let t=h();return t.textContent=H,t})(),s(y,{get when(){return o.css},get children(){let t=c(),e=t.firstChild;return n(()=>e.data=$(o.css)),t}}),(()=>{let t=u(),c=t.firstChild,h=l;return r(t,s(y,{get when(){return o.toolbar},get children(){let t=g();return r(t,s(P,{class:"toolbar-copy",onClick:U})),n(()=>i(t,"data-language",O())),t}}),c),d(c,"input",q,!0),"function"==typeof h?e(h,c):l=c,i(c,"spellcheck",!1),r(c,W),n(e=>{let r={[`language-${o.language}`]:!!o.language,"not-toolbar":!o.toolbar,[o.class]:!o.edit},n=o.edit;return e._v$=a(t,r,e._v$),n!==e._v$2&&i(c,"contenteditable",e._v$2=n),e},{_v$:void 0,_v$2:void 0}),t})()]}T.registry=()=>{x("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,title:void 0},(t,e)=>{let{baseStyle:o}=A,i=e.element,r=C({code:i.textContent,css:i.css,onChange(t){i.dispatchEvent(new CustomEvent("change",{detail:t}))}},t);return m(()=>{E(i,["css","code","title"]),i.replaceChildren()}),[(()=>{let t=c(),e=t.firstChild;return n(()=>e.data=o()),t})(),s(T,r)]})};export default T;l(["input"]);
|
package/es/code/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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, type JSXElement } from '../basic-config';\nimport theme from '../theme';\n\nimport { CopyIcon } from './copy-icon';\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 title?: string;\n /** 编辑修改时的回调 */\n onChange?(code: string): void;\n children?: JSXElement;\n}\nexport type CodeElement = CustomElement<CodeProps>;\n\nfunction Code(props: CodeProps) {\n const { isDark } = theme;\n let codeEl: HTMLPreElement | undefined;\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.title || props.language?.split(' ').pop());\n\n createEffect(() => {\n let _next = props.code || '';\n\n if (decoded.test(_next)) {\n _next = decodeURIComponent(_next);\n }\n if (codeEl) {\n codeEl.normalize();\n if (_next !== codeEl.textContent) {\n setCode(_next);\n }\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 && codeEl) {\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 <CopyIcon class=\"toolbar-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\nCode.registry = () => {\n customElement<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 title: 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', 'title']);\n el.replaceChildren();\n });\n return (\n <>\n <style textContent={baseStyle()} />\n <Code {...props} />\n </>\n );\n },\n );\n};\n\nexport default Code;\n"],"names":["createEffect","createMemo","createResource","createSignal","createUniqueId","mergeProps","onCleanup","Show","untrack","isFunction","setClipboard","css","customElement","clearAttribute","theme","CopyIcon","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","registry","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, type JSXElement } from '../basic-config';\nimport theme from '../theme';\n\nimport { CopyIcon } from './copy-icon';\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 title?: string;\n /** 编辑修改时的回调 */\n onChange?(code: string): void;\n children?: JSXElement;\n}\nexport type CodeElement = CustomElement<CodeProps>;\n\nfunction Code(props: CodeProps) {\n const { isDark } = theme;\n let codeEl: HTMLPreElement | undefined;\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.title || props.language?.split(' ').pop());\n\n createEffect(() => {\n let _next = props.code || '';\n\n if (decoded.test(_next)) {\n _next = decodeURIComponent(_next);\n }\n if (codeEl) {\n codeEl.normalize();\n if (_next !== codeEl.textContent) {\n setCode(_next);\n }\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 && codeEl) {\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 <CopyIcon class=\"toolbar-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\nCode.registry = () => {\n customElement<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 title: 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', 'title']);\n el.replaceChildren();\n });\n return (\n <>\n <style textContent={baseStyle()} />\n <Code {...props} />\n </>\n );\n },\n );\n};\n\nexport default Code;\n"],"names":["createEffect","createMemo","createResource","createSignal","createUniqueId","mergeProps","onCleanup","Show","untrack","isFunction","setClipboard","css","customElement","clearAttribute","theme","CopyIcon","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","registry","children","_","opt","baseStyle","element","val","dispatchEvent","CustomEvent","detail","replaceChildren"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function e(e,t,r,n,o,i,l){try{var a=e[i](l),s=a.value}catch(e){r(e);return}a.done?t(s):Promise.resolve(s).then(n,o)}function t(){return(t=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}import{use as r}from"solid-js/web";import{template as n}from"solid-js/web";import{spread as o}from"solid-js/web";import{mergeProps as i}from"solid-js/web";import"solid-js/web";import{insert as l}from"solid-js/web";import{getOwner as a}from"solid-js/web";import{effect as s}from"solid-js/web";import{delegateEvents as u}from"solid-js/web";import{createComponent as
|
|
1
|
+
function e(e,t,r,n,o,i,l){try{var a=e[i](l),s=a.value}catch(e){r(e);return}a.done?t(s):Promise.resolve(s).then(n,o)}function t(){return(t=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}import{use as r}from"solid-js/web";import{template as n}from"solid-js/web";import{spread as o}from"solid-js/web";import{mergeProps as i}from"solid-js/web";import"solid-js/web";import{insert as l}from"solid-js/web";import{getOwner as a}from"solid-js/web";import{effect as s}from"solid-js/web";import{delegateEvents as u}from"solid-js/web";import{createComponent as d}from"solid-js/web";import{className as c}from"solid-js/web";import{addEventListener as p}from"solid-js/web";let m=n("<style> "),f=n("<style>"),v=n("<n-input>",!0,!1),g=n('<i class="eye-dropper">'),h=n('<div><div class="picker"></div><div class="chooser"><div class="range"><input class="slider hue" min="0" max="360" type="range"><input class="slider opacity" min="0" max="1" step="0.01" type="range"></div><div class="preview"></div></div><div class="form"><n-dropdown placement="right" trigger="click"><span class="switch"></span></n-dropdown></div><div class="color">',!0,!1),y=n("<n-input-number>",!0,!1),b=n("<i>");import{createEffect as w,createMemo as C,createSignal as x,For as j,Index as E,mergeProps as S,onCleanup as $,onMount as k,Show as P,untrack as B}from"solid-js";import{colorParse as D,isFunction as F,passiveSupported as L,setClipboard as M,throttle as A}from"@moneko/common";import{css as H,cx as O}from"@moneko/css";import{customElement as R}from"solid-element";import{clearAttribute as N}from"../basic-config";import V from"../dropdown";import G from"../input";import _ from"../input-number";import z,{block as U}from"../theme";import{style as X,switchCss as K}from"./style";function Y(n){let u;let{baseStyle:R}=z,N=S({defaultValue:"#5794ff"},n),V=[{label:"RGBA",value:"rgba",handleClosed:!1},{label:"HSLA",value:"hsla",handleClosed:!1},{label:"HEXA",value:"hexa",handleClosed:!1}],G=["#f44336","#E91E63","#9C27B0","#673AB7","#3F51B5","#2196F3","#00BCD4","#009688","#4CAF50","#CDDC39","#FF9800","#795548","#607D8B"],_={class:"input",size:"small",css:".input{text-align:center;font-size:12px;}"},[U,Y]=x(D(N.value||N.defaultValue)),[q,I]=x(!1);function J(e){return e?Number((100*e).toFixed()):e}function Q(e){let t=e;return"string"==typeof e&&(t=e.replace(/[^\d]/g,"")),t/100}let T=C(()=>{var e;let t=U(),r=t[e=t.type,`to${e[0].toUpperCase()+e.slice(1)}`]();return F(N.onChange)&&r.toString()!==N.value&&N.onChange(r.toString()),r});function W(e=N.defaultValue){B(T).toString()!==e&&Y(D(e))}function Z(e){e.target&&(e.target.value=e.detail)}function ee(e){e.target.value&&W(e.target.value)}function et(e){"Enter"===e.key&&"string"==typeof e.target.value&&W(e.target.value)}function er(e){if(u){let{x:r,y:n,width:o,height:i}=u.getBoundingClientRect(),l=B(U),a=l.value;a[1]=Math.floor(Math.min(Math.max(0,(e.clientX-r)/o*100),100)),a[2]=Math.floor(100-Math.min(Math.max(0,(e.clientY-n)/i*100),100)),Y(t({},l,{value:a}))}}function en(e,r,n){if("number"==typeof r){let o=B(U),i=3===e||"hsva"===n,l=i?o.value:B(T);l[e]=r||0,i?Y(t({},o,{value:l})):Y(D(l.toString()))}}function eo(e){I(!0),er(e)}function ei(){I(!1)}function el(e){Y(r=>t({},r,{type:e.detail[0]}))}function ea(e){M(B(T).toString(),e.target)}function es(){return eu.apply(this,arguments)}function eu(){var t;return t=function*(){if(window.EyeDropper){let e=yield new window.EyeDropper().open();e.sRGBHex&&W(e.sRGBHex);return}},(eu=function(){var r=this,n=arguments;return new Promise(function(o,i){var l=t.apply(r,n);function a(t){e(l,o,i,a,s,"next",t)}function s(t){e(l,o,i,a,s,"throw",t)}a(void 0)})}).apply(this,arguments)}let ed=C(()=>{let e=U(),t=e.value;return`.palette {--c:${e.toRgbaString()};--h:${t[0]};--s:${t[1]};--v:${t[2]};--a:${t[3]};}`});return w(()=>{A(W,8)(N.value)}),w(()=>{q()&&document.body.addEventListener("mousemove",er,{passive:L}),$(()=>{document.body.removeEventListener("mousemove",er,!1)})}),k(()=>{document.body.addEventListener("mouseup",ei,{passive:L})}),$(()=>{document.body.removeEventListener("mouseup",ei,!1)}),[(()=>{let e=m(),t=e.firstChild;return s(()=>t.data=R()),e})(),(()=>{let e=f();return e.textContent=X,e})(),(()=>{let e=m(),t=e.firstChild;return s(()=>t.data=ed()),e})(),d(P,{get when(){return N.css},get children(){let e=m(),t=e.firstChild;return s(()=>t.data=H(N.css)),e}}),(()=>{let e=h(),t=e.firstChild,n=u,m=t.nextSibling,f=m.firstChild,w=f.firstChild,C=w.nextSibling,x=f.nextSibling,S=m.nextSibling,$=S.firstChild,k=$.firstChild,D=S.nextSibling;return p(t,"mousedown",eo,!0),"function"==typeof n?r(n,t):u=t,w.$$input=e=>{en(0,Number(e.target.value),"hsva")},C.$$input=e=>{en(3,Number(e.target.value))},p(x,"click",ea,!0),l(S,d(P,{get when(){return"hexa"===U().type},get fallback(){return d(E,{get each(){return T()},children:(e,t)=>{let r=Object.assign({},_,3===t&&{step:.01,formatter:J,parse:Q});return(()=>{let n=y();return o(n,i(r,{get value(){return e()},get max(){return B(T).max[t]},min:0,onChange:e=>{en(t,e.detail)}}),!1,!1),n._$owner=a(),n})()}})},get children(){let e=v();return o(e,i(_,{get value(){return U().toHexaString()},onChange:Z,onBlur:ee,onKeyUp:et}),!1,!1),e._$owner=a(),e}}),$),p($,"change",el),$.css=K,$.items=V,$._$owner=a(),l(k,()=>U().type),l(D,d(P,{get when(){return window.EyeDropper},get fallback(){return(()=>{let e=b();return p(e,"click",W.bind(null,"rgba(168,16,16,0.15)"),!0),e.style.setProperty("--c","rgba(168,16,16,0.15)"),e})()},get children(){let e=g();return p(e,"click",es,!0),e.style.setProperty("--c","transparent"),e}}),null),l(D,d(j,{each:G,children:e=>(()=>{let t=b();return p(t,"click",W.bind(null,e),!0),null!=e?t.style.setProperty("--c",e):t.style.removeProperty("--c"),t})()}),null),s(()=>c(e,O("palette",N.class))),s(()=>w.value=U().value[0]),s(()=>C.value=U().value[3]),s(()=>$.value=U().type),e})()]}export const defaultColorPaletteProps={class:void 0,style:void 0,css:void 0,value:void 0,defaultValue:void 0,onChange:void 0};Y.registry=()=>{V.registry(),G.registry(),_.registry(),R("n-color-palette",defaultColorPaletteProps,(e,t)=>{let r=t.element,n=S({onChange(e){r.dispatchEvent(new CustomEvent("change",{detail:e}))}},e);return w(()=>{N(r,["css"])}),[(()=>{let e=f();return e.textContent=U,e})(),d(Y,n)]})};export default Y;u(["click","input","mousedown"]);
|