neko-ui 2.6.7 → 2.7.0

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.
Files changed (139) hide show
  1. package/CHANGELOG.md +24 -6
  2. package/es/@moneko/routes/index.d.ts +1 -1
  3. package/es/back-top/style.js +1 -3
  4. package/es/back-top/style.js.map +1 -1
  5. package/es/button/style.js.map +1 -1
  6. package/es/capture-screen/index.js +1 -1
  7. package/es/capture-screen/index.js.map +1 -1
  8. package/es/cron/begin-interval.d.ts +1 -0
  9. package/es/cron/index.js +1 -1
  10. package/es/cron/index.js.map +1 -1
  11. package/es/cron/item.d.ts +1 -0
  12. package/es/cron/period.d.ts +1 -0
  13. package/es/cron/some.d.ts +1 -0
  14. package/es/date-picker/index.js +1 -1
  15. package/es/date-picker/index.js.map +1 -1
  16. package/es/img/style.js +0 -2
  17. package/es/img/style.js.map +1 -1
  18. package/es/index.d.ts +1 -0
  19. package/es/index.js +1 -1
  20. package/es/index.js.map +1 -1
  21. package/es/md-style/index.js +6 -8
  22. package/es/md-style/index.js.map +1 -1
  23. package/es/modal/hooks.d.ts +5 -0
  24. package/es/modal/hooks.js +2 -0
  25. package/es/modal/hooks.js.map +1 -0
  26. package/es/modal/style.js +3 -4
  27. package/es/modal/style.js.map +1 -1
  28. package/es/notification/index.d.ts +59 -0
  29. package/es/notification/index.js +2 -0
  30. package/es/notification/index.js.map +1 -0
  31. package/es/notification/notification.d.ts +3 -0
  32. package/es/notification/notification.js +2 -0
  33. package/es/notification/notification.js.map +1 -0
  34. package/es/notification/queque.d.ts +46 -0
  35. package/es/notification/queque.js +2 -0
  36. package/es/notification/queque.js.map +1 -0
  37. package/es/notification/styles.d.ts +1 -0
  38. package/es/notification/styles.js +97 -0
  39. package/es/notification/styles.js.map +1 -0
  40. package/es/popover/index.js +1 -1
  41. package/es/popover/index.js.map +1 -1
  42. package/es/popover/style.js +1 -3
  43. package/es/popover/style.js.map +1 -1
  44. package/es/prism/css.js +1 -3
  45. package/es/prism/css.js.map +1 -1
  46. package/es/select/index.js +1 -1
  47. package/es/select/index.js.map +1 -1
  48. package/es/theme/index.js +10 -8
  49. package/es/theme/index.js.map +1 -1
  50. package/es/tree/index.d.ts +3 -99
  51. package/es/tree/index.js +1 -1
  52. package/es/tree/index.js.map +1 -1
  53. package/es/tree/register.d.ts +1 -0
  54. package/es/tree/register.js +2 -0
  55. package/es/tree/register.js.map +1 -0
  56. package/es/tree/type.d.ts +104 -0
  57. package/es/tree/type.js +2 -0
  58. package/es/tree/type.js.map +1 -0
  59. package/lib/@moneko/routes/index.d.ts +1 -1
  60. package/lib/back-top/style.js +1 -3
  61. package/lib/back-top/style.js.map +1 -1
  62. package/lib/button/style.js.map +1 -1
  63. package/lib/capture-screen/index.js +1 -1
  64. package/lib/capture-screen/index.js.map +1 -1
  65. package/lib/cron/begin-interval.d.ts +1 -0
  66. package/lib/cron/index.js +1 -1
  67. package/lib/cron/index.js.map +1 -1
  68. package/lib/cron/item.d.ts +1 -0
  69. package/lib/cron/period.d.ts +1 -0
  70. package/lib/cron/some.d.ts +1 -0
  71. package/lib/img/style.js +0 -2
  72. package/lib/img/style.js.map +1 -1
  73. package/lib/index.d.ts +1 -0
  74. package/lib/index.js +1 -1
  75. package/lib/index.js.map +1 -1
  76. package/lib/md-style/index.js +6 -8
  77. package/lib/md-style/index.js.map +1 -1
  78. package/lib/modal/hooks.d.ts +5 -0
  79. package/lib/modal/hooks.js +2 -0
  80. package/lib/modal/hooks.js.map +1 -0
  81. package/lib/modal/style.js +3 -4
  82. package/lib/modal/style.js.map +1 -1
  83. package/lib/notification/index.d.ts +59 -0
  84. package/lib/notification/index.js +2 -0
  85. package/lib/notification/index.js.map +1 -0
  86. package/lib/notification/notification.d.ts +3 -0
  87. package/lib/notification/notification.js +2 -0
  88. package/lib/notification/notification.js.map +1 -0
  89. package/lib/notification/queque.d.ts +46 -0
  90. package/lib/notification/queque.js +2 -0
  91. package/lib/notification/queque.js.map +1 -0
  92. package/lib/notification/styles.d.ts +1 -0
  93. package/lib/notification/styles.js +97 -0
  94. package/lib/notification/styles.js.map +1 -0
  95. package/lib/popover/index.js +1 -1
  96. package/lib/popover/index.js.map +1 -1
  97. package/lib/popover/style.js +1 -3
  98. package/lib/popover/style.js.map +1 -1
  99. package/lib/prism/css.js +1 -3
  100. package/lib/prism/css.js.map +1 -1
  101. package/lib/theme/index.js +8 -6
  102. package/lib/theme/index.js.map +1 -1
  103. package/lib/tree/index.d.ts +3 -99
  104. package/lib/tree/index.js +1 -1
  105. package/lib/tree/index.js.map +1 -1
  106. package/lib/tree/register.d.ts +1 -0
  107. package/lib/tree/register.js +2 -0
  108. package/lib/tree/register.js.map +1 -0
  109. package/lib/tree/type.d.ts +104 -0
  110. package/lib/tree/type.js +2 -0
  111. package/lib/tree/type.js.map +1 -0
  112. package/package.json +23 -21
  113. package/umd/index.js +1 -1
  114. package/es/@introduce/api.md +0 -158
  115. package/es/@introduce/getting-started/api.md +0 -34
  116. package/es/@introduce/html/doc.md +0 -45
  117. package/es/@introduce/react/doc.md +0 -49
  118. package/es/@introduce/solid/doc.md +0 -39
  119. package/es/@introduce/vue/doc.md +0 -54
  120. package/es/@moneko/cli/doc.md +0 -211
  121. package/es/@moneko/config/api.md +0 -213
  122. package/es/@moneko/locales/doc.md +0 -130
  123. package/es/@moneko/mock/api.md +0 -177
  124. package/es/@moneko/request/api.md +0 -31
  125. package/es/@moneko/routes/doc.md +0 -81
  126. package/es/@moneko/sso/api.md +0 -158
  127. package/lib/@introduce/api.md +0 -158
  128. package/lib/@introduce/getting-started/api.md +0 -34
  129. package/lib/@introduce/html/doc.md +0 -45
  130. package/lib/@introduce/react/doc.md +0 -49
  131. package/lib/@introduce/solid/doc.md +0 -39
  132. package/lib/@introduce/vue/doc.md +0 -54
  133. package/lib/@moneko/cli/doc.md +0 -211
  134. package/lib/@moneko/config/api.md +0 -213
  135. package/lib/@moneko/locales/doc.md +0 -130
  136. package/lib/@moneko/mock/api.md +0 -177
  137. package/lib/@moneko/request/api.md +0 -31
  138. package/lib/@moneko/routes/doc.md +0 -81
  139. package/lib/@moneko/sso/api.md +0 -158
@@ -1 +1 @@
1
- {"version":3,"sources":["../../components/tree/index.tsx"],"sourcesContent":["import {\n For,\n createComponent,\n createEffect,\n createMemo,\n createSignal,\n mergeProps,\n onCleanup,\n onMount,\n} from 'solid-js';\nimport { isFunction, isString, passiveSupported } from '@moneko/common';\nimport { css, cx } from '@moneko/css';\nimport { customElement } from 'solid-element';\nimport { style } from './style';\nimport schema, { type Schema } from '../from-schema';\nimport theme from '../theme';\nimport type { BasicConfig, CustomElement } from '..';\n\nexport interface TreeBaseProp {\n /** 自定义类名 */\n class?: string;\n /** 自定义样式表 */\n css?: string;\n /** 尺寸\n * @default 'normal'\n */\n size?: BasicConfig['size'];\n /** 只读 */\n readonly?: boolean;\n /** 开启取消选中, 仅多选模式生效 */\n toggle?: boolean;\n /** 方向\n * @default 'ltr'\n */\n direction?: 'rtl' | 'ltr';\n /** 点击行时的回调函数 */\n onRowClick?: (e: MouseEvent, key: string, item: TreeData) => void;\n /** 双击行时的回调函数 */\n onRowDoubleClick?: (e: MouseEvent, key: string, item: TreeData) => void;\n /** 自定义渲染行 */\n renderRow?: (item: TreeData, title: JSX.Element, subTitle?: JSX.Element) => JSX.Element[];\n /** 开启此选项支持 `JSONSchema`\n * @default false\n */\n fromSchema?: false;\n}\n\ninterface TreeBaseProps extends TreeBaseProp {\n /** 选中的值, 多选模式时为数组 */\n value?: string;\n /** 多选模式\n * @default false\n */\n multiple?: false;\n /** 选中的值发生修改时的回调函数, 多选模式时入参为数组 */\n onChange?(key?: string, item?: TreeData): void;\n}\ninterface TreeMultipleBaseProps extends TreeBaseProp {\n /** 选中的值 */\n value?: string[];\n /** 多选模式\n * @default true\n */\n multiple: true;\n onChange?(key?: string[], item?: TreeData): void;\n}\nexport interface TreeProps extends TreeBaseProps {\n /** 数据源 */\n data: TreeData[];\n}\nexport interface TreeSchemaProps extends Omit<TreeBaseProps, 'fromSchema'> {\n /** 开启此选项支持 `JSONSchema` */\n fromSchema: true;\n /** 数据源 */\n data: Schema;\n}\nexport interface TreeStringProps extends TreeBaseProps {\n /** 数据源 */\n data: string;\n}\nexport interface TreeMultipleProps extends TreeMultipleBaseProps {\n /** 数据源 */\n data: TreeData[];\n}\nexport interface TreeMultipleSchemaProps extends Omit<TreeMultipleBaseProps, 'fromSchema'> {\n /** 开启此选项支持 `JSONSchema` */\n fromSchema: true;\n /** 数据源 */\n data: Schema;\n}\nexport interface TreeMultipleStringProps extends TreeMultipleBaseProps {\n /** 数据源 */\n data: string;\n}\n\nfunction Tree(\n _:\n | TreeProps\n | TreeMultipleProps\n | TreeMultipleSchemaProps\n | TreeSchemaProps\n | TreeMultipleStringProps\n | TreeStringProps,\n) {\n const sizeCnt = {\n small: 6,\n normal: 8,\n large: 10,\n };\n const { baseStyle } = theme;\n\n let el: HTMLUListElement | undefined;\n const [lines, setLines] = createSignal<string[]>([]);\n const [treeData, setTreeData] = createSignal<TreeData[]>([]);\n const rtl = createMemo(() => _.direction === 'rtl');\n const current = createMemo(() => {\n if (_.value !== void 0 && _.value !== null) {\n return Array.isArray(_.value) ? _.value : [_.value];\n }\n return [];\n });\n const path = Symbol('path');\n const pathEnd = Symbol('path-end');\n\n function countLineLen(tree: TreeData[], depth = 0) {\n const lastIdx = tree.length - 1;\n const last = tree[lastIdx];\n const frist = tree[0];\n let line: string[] = [];\n\n for (let i = 0, len = tree.length; i < len; i++) {\n const item = tree[i],\n isLast = i === lastIdx;\n\n if (i === 0 || isLast) {\n item[path] = frist.key + (tree.length === 1 ? '' : `>${last.key}`);\n if (isLast) {\n item[pathEnd] = '';\n }\n line.push(item[path]);\n }\n if (item.children) {\n line = line.concat(countLineLen(item.children, depth + 1));\n }\n }\n return line;\n }\n\n function parseTree(str: string): TreeData[] {\n const depthRegex = /[^\\s|`│├└]/;\n const rows = str.trim().split('\\n');\n const stack: TreeStack[] = [{ title: rows[0], key: rows[0] }];\n\n for (let i = 1; i < rows.length; i++) {\n const depth = rows[i].search(depthRegex);\n\n if (depth === -1) {\n continue;\n }\n const node: Partial<TreeData> = {\n title: rows[i].slice(depth + 3),\n depth,\n };\n\n while (stack.length && depth <= (stack[stack.length - 1].depth || 0)) {\n stack.pop();\n }\n if (!stack.length) {\n return [];\n }\n const parent = stack[stack.length - 1];\n\n if (!parent.children) {\n parent.children = [];\n }\n node.key = `${parent.key}-${node.title}-${depth}-${i}`;\n parent.children.push(node as TreeData);\n stack.push(node as TreeData);\n }\n\n return [stack[0]];\n }\n\n function handleChange(key: string, item: TreeData) {\n if (!_.readonly && isFunction(_.onChange)) {\n let _current = [...current()];\n\n if (_.multiple) {\n const idx = _current.indexOf(key);\n\n if (idx === -1) {\n _current.push(key);\n } else {\n _current.splice(idx, 1);\n }\n } else if (_.toggle && _current[0] === key) {\n _current = [];\n } else {\n _current = [key];\n }\n _.onChange(_.multiple ? _current : _current[0], item);\n }\n }\n function handleClick(e: MouseEvent, item: TreeData) {\n handleChange(item.key, item);\n _.onRowClick?.(e, item.key as never, item as TreeData<never>);\n }\n function renderItem(item: TreeData, title: JSX.Element, subTitle?: JSX.Element): JSX.Element[] {\n const row = _.renderRow?.(item, title, subTitle) || [title, subTitle];\n\n return rtl() ? row.reverse() : row;\n }\n\n function renderTreeRow(list: TreeData[], depth = 0): JSX.Element {\n return (\n <For each={list}>\n {(item) => {\n const { name, title, subTitle, key, children } = item;\n const _title = name === title || !name ? [title] : [name, title];\n\n return (\n <>\n <li\n class={cx(\n 'row',\n current().includes(key) && 'active',\n (_.readonly || !isFunction(_.onChange)) && 'non',\n )}\n onClick={(e) => handleClick(e, item)}\n onDblClick={(e) => _.onRowDoubleClick?.(e, key, item)}\n style={depth ? { '--depth': `${depth * 2}em` } : void 0}\n data-path-end={item[pathEnd]}\n data-path={item[path]}\n >\n {renderItem(\n item,\n <span class=\"title\">{(rtl() ? _title.reverse() : _title).join(': ')}</span>,\n subTitle && <span class=\"sub-title\">{subTitle}</span>,\n )}\n </li>\n {children ? renderTreeRow(children, depth + 1) : null}\n </>\n );\n }}\n </For>\n );\n }\n function updateLine(list: string[]) {\n const len = list.length;\n\n if (el && len) {\n const prefixSize = sizeCnt[_.size || 'normal'];\n\n for (let i = 0; i < len; i++) {\n const al: NodeListOf<HTMLLIElement> = el.querySelectorAll(`li[data-path=\"${list[i]}\"]`);\n\n if (al.length) {\n const rect1 = al[0].getBoundingClientRect();\n let sideLen = rect1.height / 2 + prefixSize;\n\n if (al.length > 1) {\n const { bottom, height, top } = al[1].getBoundingClientRect();\n\n sideLen = i === 0 ? top - rect1.top : bottom - rect1.top - height / 2 + prefixSize;\n al[1].style.setProperty('--c', 'none');\n } else if (i === 0) {\n al[0].style.setProperty('--c', 'none');\n }\n if (al.length !== 1 || i !== 0) {\n al[0].style.setProperty('--line', `${Math.abs(sideLen)}px`);\n }\n }\n }\n }\n }\n createEffect(() => {\n const data = _.fromSchema ? schema(_.data) : isString(_.data) ? parseTree(_.data) : _.data;\n\n setLines([...new Set(countLineLen(data))]);\n setTreeData(data);\n });\n\n createEffect(() => {\n const line = lines();\n\n const timer = setTimeout(() => {\n clearTimeout(timer);\n updateLine(line);\n }, 0);\n\n if (line.length) {\n window.addEventListener('resize', updateLine.bind(null, line), {\n passive: passiveSupported,\n });\n }\n onCleanup(() => {\n clearTimeout(timer);\n window.removeEventListener('resize', updateLine.bind(null, lines()), false);\n });\n });\n onMount(() => {\n const timer = setTimeout(() => {\n clearTimeout(timer);\n updateLine(lines());\n }, 32);\n });\n\n return (\n <>\n <style>\n {baseStyle()}\n {style}\n {css(_.css)}\n </style>\n <ul ref={el} class={cx('tree', _.size, _.class, rtl() && 'rtl')}>\n {renderTreeRow(treeData())}\n </ul>\n </>\n );\n}\ntype CustomEvents = 'onChange' | 'onRowDoubleClick' | 'onRowClick';\n\nexport type TreeElement = CustomElement<TreeProps, CustomEvents>;\nexport type TreeSchemaElement = CustomElement<TreeSchemaProps, CustomEvents>;\nexport type TreeStringElement = CustomElement<TreeStringProps, CustomEvents>;\nexport type TreeMultipleElement = CustomElement<TreeMultipleProps, CustomEvents>;\nexport type TreeMultipleSchemaElement = CustomElement<TreeMultipleSchemaProps, CustomEvents>;\nexport type TreeMultipleStringElement = CustomElement<TreeMultipleStringProps, CustomEvents>;\n\ninterface TreeStack extends TreeData {\n /** 深度 */\n depth?: number;\n}\n\nexport interface TreeData<T = string> {\n /** key(唯一值) */\n key: T;\n /** 属性 */\n name?: string;\n /** 标题 */\n title?: string;\n /** 副标题 */\n subTitle?: string;\n /** 详细描述 */\n description?: string;\n /** 子项 */\n children?: TreeData<T>[];\n [key: string | number | symbol]:\n | T\n | string\n | number\n | symbol\n | boolean\n | TreeData<T>[]\n | undefined;\n}\n\ncustomElement<TreeProps>(\n 'n-tree',\n {\n fromSchema: void 0,\n size: void 0,\n data: [],\n multiple: void 0,\n value: void 0,\n onChange: void 0,\n class: void 0,\n css: void 0,\n readonly: void 0,\n toggle: void 0,\n direction: void 0,\n onRowClick: void 0,\n onRowDoubleClick: void 0,\n renderRow: void 0,\n },\n (_, opt) => {\n const el = opt.element;\n const props = mergeProps(\n {\n data: el.data,\n value: el.value,\n multiple: el.multiple,\n fromSchema: el.fromSchema,\n size: el.size,\n css: el.css,\n readonly: el.readonly,\n toggle: el.toggle,\n direction: el.direction,\n onChange(key: string, item: TreeData) {\n el.dispatchEvent(\n new CustomEvent('change', {\n detail: [key, item],\n }),\n );\n },\n onRowClick(e: MouseEvent, key: string, item: TreeData) {\n el.dispatchEvent(\n new CustomEvent('rowclick', {\n detail: [e, key, item],\n }),\n );\n },\n onRowDoubleClick(e: MouseEvent, key: string, item: TreeData) {\n el.dispatchEvent(\n new CustomEvent('rowdoubleclick', {\n detail: [e, key, item],\n }),\n );\n },\n },\n _,\n );\n\n createEffect(() => {\n el.removeAttribute('css');\n el.removeAttribute('data');\n });\n return createComponent(Tree, props);\n },\n);\nexport default Tree;\n"],"names":["For","createComponent","createEffect","createMemo","createSignal","mergeProps","onCleanup","onMount","isFunction","isString","passiveSupported","css","cx","customElement","style","schema","theme","Tree","_","el","sizeCnt","small","normal","large","baseStyle","lines","setLines","treeData","setTreeData","rtl","direction","current","value","Array","isArray","path","Symbol","pathEnd","updateLine","list","len","length","prefixSize","size","i","al","querySelectorAll","rect1","getBoundingClientRect","sideLen","height","bottom","top","setProperty","Math","abs","data","fromSchema","parseTree","str","depthRegex","rows","trim","split","stack","title","key","depth","search","node","slice","pop","parent","children","push","Set","countLineLen","tree","lastIdx","last","frist","line","item","isLast","concat","timer","setTimeout","clearTimeout","window","addEventListener","bind","passive","removeEventListener","renderTreeRow","name","subTitle","_title","e","onRowDoubleClick","handleChange","readonly","onChange","_current","multiple","idx","indexOf","splice","toggle","onRowClick","renderItem","row","renderRow","reverse","join","includes","class","opt","element","props","dispatchEvent","CustomEvent","detail","removeAttribute"],"mappings":"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"}
1
+ {"version":3,"sources":["../../components/tree/index.tsx"],"sourcesContent":["import { For, createEffect, createMemo, createSignal } from 'solid-js';\nimport { frameCallback, isFunction, isString } from '@moneko/common';\nimport { css, cx } from '@moneko/css';\nimport './register';\nimport { style } from './style';\nimport schema from '../from-schema';\nimport theme from '../theme';\nimport type {\n TreeData,\n TreeMultipleProps,\n TreeMultipleSchemaProps,\n TreeMultipleStringProps,\n TreeProps,\n TreeSchemaProps,\n TreeStack,\n TreeStringProps,\n} from './type';\n\nfunction Tree(\n _:\n | TreeProps\n | TreeMultipleProps\n | TreeMultipleSchemaProps\n | TreeSchemaProps\n | TreeMultipleStringProps\n | TreeStringProps,\n) {\n const sizeCnt = {\n small: 6,\n normal: 8,\n large: 10,\n };\n const { baseStyle } = theme;\n let el: HTMLUListElement | undefined;\n const [lines, setLines] = createSignal<string[]>([]);\n const [treeData, setTreeData] = createSignal<TreeData[]>([]);\n const rtl = createMemo(() => _.direction === 'rtl');\n const current = createMemo(() => {\n if (_.value !== void 0 && _.value !== null) {\n return Array.isArray(_.value) ? _.value : [_.value];\n }\n return [];\n });\n const path = Symbol('path');\n const pathEnd = Symbol('path-end');\n\n function countLineLen(tree: TreeData[], depth = 0) {\n const lastIdx = tree.length - 1;\n const last = tree[lastIdx];\n const frist = tree[0];\n let line: string[] = [];\n\n for (let i = 0, len = tree.length; i < len; i++) {\n const item = tree[i],\n isLast = i === lastIdx;\n\n if (i === 0 || isLast) {\n item[path] = frist.key + (tree.length === 1 ? '' : `>${last.key}`);\n if (isLast) {\n item[pathEnd] = '';\n }\n line.push(item[path]);\n }\n if (item.children) {\n line = line.concat(countLineLen(item.children, depth + 1));\n }\n }\n return line;\n }\n\n function parseTree(str: string): TreeData[] {\n const depthRegex = /[^\\s|`│├└]/;\n const rows = str.trim().split('\\n');\n const stack: TreeStack[] = [{ title: rows[0], key: rows[0] }];\n\n for (let i = 1; i < rows.length; i++) {\n const depth = rows[i].search(depthRegex);\n\n if (depth === -1) {\n continue;\n }\n const node: Partial<TreeData> = {\n title: rows[i].slice(depth + 3),\n depth,\n };\n\n while (stack.length && depth <= (stack[stack.length - 1].depth || 0)) {\n stack.pop();\n }\n if (!stack.length) {\n return [];\n }\n const parent = stack[stack.length - 1];\n\n if (!parent.children) {\n parent.children = [];\n }\n node.key = `${parent.key}-${node.title}-${depth}-${i}`;\n parent.children.push(node as TreeData);\n stack.push(node as TreeData);\n }\n\n return [stack[0]];\n }\n\n function handleChange(key: string, item: TreeData) {\n if (!_.readonly && isFunction(_.onChange)) {\n let _current = [...current()];\n\n if (_.multiple) {\n const idx = _current.indexOf(key);\n\n if (idx === -1) {\n _current.push(key);\n } else {\n _current.splice(idx, 1);\n }\n } else if (_.toggle && _current[0] === key) {\n _current = [];\n } else {\n _current = [key];\n }\n _.onChange(_.multiple ? _current : _current[0], item);\n }\n }\n function handleClick(e: MouseEvent, item: TreeData) {\n handleChange(item.key, item);\n _.onRowClick?.(e, item.key as never, item as TreeData<never>);\n }\n function renderItem(item: TreeData, title: JSX.Element, subTitle?: JSX.Element): JSX.Element[] {\n const row = _.renderRow?.(item, title, subTitle) || [title, subTitle];\n\n return rtl() ? row.reverse() : row;\n }\n\n function renderTreeRow(list: TreeData[], depth = 0): JSX.Element {\n return (\n <For each={list}>\n {(item) => {\n const { name, title, subTitle, key, children } = item;\n const _title = name === title || !name ? [title] : [name, title];\n\n return (\n <>\n <li\n class={cx(\n 'row',\n current().includes(key) && 'active',\n (_.readonly || !isFunction(_.onChange)) && 'non',\n )}\n onClick={(e) => handleClick(e, item)}\n onDblClick={(e) => _.onRowDoubleClick?.(e, key, item)}\n style={depth ? { '--depth': `${depth * 2}em` } : void 0}\n data-path-end={item[pathEnd]}\n data-path={item[path]}\n >\n {renderItem(\n item,\n <span class=\"title\">{(rtl() ? _title.reverse() : _title).join(': ')}</span>,\n subTitle && <span class=\"sub-title\">{subTitle}</span>,\n )}\n </li>\n {children ? renderTreeRow(children, depth + 1) : null}\n </>\n );\n }}\n </For>\n );\n }\n createEffect(() => {\n const data = _.fromSchema ? schema(_.data) : isString(_.data) ? parseTree(_.data) : _.data;\n\n setLines([...new Set(countLineLen(data))]);\n setTreeData(data);\n });\n\n createEffect(() => {\n const list = lines();\n const size = _.size || 'normal';\n\n frameCallback(() => {\n const len = list.length;\n\n if (el && len) {\n const prefixSize = sizeCnt[size];\n\n for (let i = 0; i < len; i++) {\n const al: NodeListOf<HTMLLIElement> = el.querySelectorAll(`li[data-path=\"${list[i]}\"]`);\n\n if (al.length) {\n const rect1 = al[0].getBoundingClientRect();\n let sideLen = rect1.height / 2 + prefixSize;\n\n if (al.length > 1) {\n const { bottom, height, top } = al[1].getBoundingClientRect();\n\n sideLen = i === 0 ? top - rect1.top : bottom - rect1.top - height / 2 + prefixSize;\n al[1].style.setProperty('--c', 'none');\n } else if (i === 0) {\n al[0].style.setProperty('--c', 'none');\n }\n if (al.length !== 1 || i !== 0) {\n al[0].style.setProperty('--line', `${Math.abs(sideLen)}px`);\n }\n }\n }\n }\n });\n });\n\n return (\n <>\n <style>\n {baseStyle()}\n {style}\n {css(_.css)}\n </style>\n <ul ref={el} class={cx('tree', _.size, _.class, rtl() && 'rtl')}>\n {renderTreeRow(treeData())}\n </ul>\n </>\n );\n}\n\nexport * from './type';\nexport default Tree;\n"],"names":["For","createEffect","createMemo","createSignal","frameCallback","isFunction","isString","css","cx","style","schema","theme","_","el","sizeCnt","small","normal","large","baseStyle","lines","setLines","treeData","setTreeData","rtl","direction","current","value","Array","isArray","path","Symbol","pathEnd","data","fromSchema","parseTree","str","depthRegex","rows","trim","split","stack","title","key","i","length","depth","search","node","slice","pop","parent","children","push","Set","countLineLen","tree","lastIdx","last","frist","line","len","item","isLast","concat","list","size","prefixSize","al","querySelectorAll","rect1","getBoundingClientRect","sideLen","height","bottom","top","setProperty","Math","abs","renderTreeRow","name","subTitle","_title","e","onRowDoubleClick","handleChange","readonly","onChange","_current","multiple","idx","indexOf","splice","toggle","onRowClick","renderItem","row","renderRow","reverse","join","includes","class"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,2 @@
1
+ import{createComponent as e,createEffect as o,mergeProps as i}from"solid-js";import{customElement as t}from"solid-element";import d from"./index";t("n-tree",{fromSchema:void 0,size:void 0,data:[],multiple:void 0,value:void 0,onChange:void 0,class:void 0,css:void 0,readonly:void 0,toggle:void 0,direction:void 0,onRowClick:void 0,onRowDoubleClick:void 0,renderRow:void 0},(t,l)=>{let n=l.element,a=i({data:n.data,value:n.value,multiple:n.multiple,fromSchema:n.fromSchema,size:n.size,css:n.css,readonly:n.readonly,toggle:n.toggle,direction:n.direction,onChange(e,o){n.dispatchEvent(new CustomEvent("change",{detail:[e,o]}))},onRowClick(e,o,i){n.dispatchEvent(new CustomEvent("rowclick",{detail:[e,o,i]}))},onRowDoubleClick(e,o,i){n.dispatchEvent(new CustomEvent("rowdoubleclick",{detail:[e,o,i]}))}},t);return o(()=>{n.removeAttribute("css"),n.removeAttribute("data")}),e(d,a)});
2
+ //# sourceMappingURL=register.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../components/tree/register.ts"],"sourcesContent":["import { createComponent, createEffect, mergeProps } from 'solid-js';\nimport { customElement } from 'solid-element';\nimport Tree from './index';\nimport type { TreeData, TreeProps } from './type';\n\ncustomElement<TreeProps>(\n 'n-tree',\n {\n fromSchema: void 0,\n size: void 0,\n data: [],\n multiple: void 0,\n value: void 0,\n onChange: void 0,\n class: void 0,\n css: void 0,\n readonly: void 0,\n toggle: void 0,\n direction: void 0,\n onRowClick: void 0,\n onRowDoubleClick: void 0,\n renderRow: void 0,\n },\n (_, opt) => {\n const el = opt.element;\n const props = mergeProps(\n {\n data: el.data,\n value: el.value,\n multiple: el.multiple,\n fromSchema: el.fromSchema,\n size: el.size,\n css: el.css,\n readonly: el.readonly,\n toggle: el.toggle,\n direction: el.direction,\n onChange(key: string, item: TreeData) {\n el.dispatchEvent(\n new CustomEvent('change', {\n detail: [key, item],\n }),\n );\n },\n onRowClick(e: MouseEvent, key: string, item: TreeData) {\n el.dispatchEvent(\n new CustomEvent('rowclick', {\n detail: [e, key, item],\n }),\n );\n },\n onRowDoubleClick(e: MouseEvent, key: string, item: TreeData) {\n el.dispatchEvent(\n new CustomEvent('rowdoubleclick', {\n detail: [e, key, item],\n }),\n );\n },\n },\n _,\n );\n\n createEffect(() => {\n el.removeAttribute('css');\n el.removeAttribute('data');\n });\n return createComponent(Tree, props);\n },\n);\n"],"names":["createComponent","createEffect","mergeProps","customElement","Tree","fromSchema","size","data","multiple","value","onChange","class","css","readonly","toggle","direction","onRowClick","onRowDoubleClick","renderRow","_","opt","el","element","props","key","item","dispatchEvent","CustomEvent","detail","e","removeAttribute"],"mappings":"AAAA,OAASA,mBAAAA,CAAe,CAAEC,gBAAAA,CAAY,CAAEC,cAAAA,CAAU,KAAQ,UAAW,AACrE,QAASC,iBAAAA,CAAa,KAAQ,eAAgB,AAC9C,QAAOC,MAAU,SAAU,CAG3BD,EACE,SACA,CACEE,WAAY,KAAK,EACjBC,KAAM,KAAK,EACXC,KAAM,EAAE,CACRC,SAAU,KAAK,EACfC,MAAO,KAAK,EACZC,SAAU,KAAK,EACfC,MAAO,KAAK,EACZC,IAAK,KAAK,EACVC,SAAU,KAAK,EACfC,OAAQ,KAAK,EACbC,UAAW,KAAK,EAChBC,WAAY,KAAK,EACjBC,iBAAkB,KAAK,EACvBC,UAAW,KAAK,CAClB,EACA,CAACC,EAAGC,KACF,IAAMC,EAAKD,EAAIE,OAAO,CAChBC,EAAQrB,EACZ,CACEK,KAAMc,EAAGd,IAAI,CACbE,MAAOY,EAAGZ,KAAK,CACfD,SAAUa,EAAGb,QAAQ,CACrBH,WAAYgB,EAAGhB,UAAU,CACzBC,KAAMe,EAAGf,IAAI,CACbM,IAAKS,EAAGT,GAAG,CACXC,SAAUQ,EAAGR,QAAQ,CACrBC,OAAQO,EAAGP,MAAM,CACjBC,UAAWM,EAAGN,SAAS,CACvBL,SAASc,CAAW,CAAEC,CAAc,EAClCJ,EAAGK,aAAa,CACd,IAAIC,YAAY,SAAU,CACxBC,OAAQ,CAACJ,EAAKC,EAAK,AACrB,GAEJ,EACAT,WAAWa,CAAa,CAAEL,CAAW,CAAEC,CAAc,EACnDJ,EAAGK,aAAa,CACd,IAAIC,YAAY,WAAY,CAC1BC,OAAQ,CAACC,EAAGL,EAAKC,EAAK,AACxB,GAEJ,EACAR,iBAAiBY,CAAa,CAAEL,CAAW,CAAEC,CAAc,EACzDJ,EAAGK,aAAa,CACd,IAAIC,YAAY,iBAAkB,CAChCC,OAAQ,CAACC,EAAGL,EAAKC,EAAK,AACxB,GAEJ,CACF,EACAN,GAOF,OAJAlB,EAAa,KACXoB,EAAGS,eAAe,CAAC,OACnBT,EAAGS,eAAe,CAAC,OACrB,GACO9B,EAAgBI,EAAMmB,EAC/B"}
@@ -0,0 +1,104 @@
1
+ import type { BasicConfig } from '../basic-config';
2
+ import type { Schema } from '../from-schema';
3
+ export interface TreeBaseProp {
4
+ /** 自定义类名 */
5
+ class?: string;
6
+ /** 自定义样式表 */
7
+ css?: string;
8
+ /** 尺寸
9
+ * @default 'normal'
10
+ */
11
+ size?: BasicConfig['size'];
12
+ /** 只读 */
13
+ readonly?: boolean;
14
+ /** 开启取消选中, 仅多选模式生效 */
15
+ toggle?: boolean;
16
+ /** 方向
17
+ * @default 'ltr'
18
+ */
19
+ direction?: 'rtl' | 'ltr';
20
+ /** 点击行时的回调函数 */
21
+ onRowClick?: (e: MouseEvent, key: string, item: TreeData) => void;
22
+ /** 双击行时的回调函数 */
23
+ onRowDoubleClick?: (e: MouseEvent, key: string, item: TreeData) => void;
24
+ /** 自定义渲染行 */
25
+ renderRow?: (item: TreeData, title: JSX.Element, subTitle?: JSX.Element) => JSX.Element[];
26
+ /** 开启此选项支持 `JSONSchema`
27
+ * @default false
28
+ */
29
+ fromSchema?: false;
30
+ }
31
+ interface TreeBaseProps extends TreeBaseProp {
32
+ /** 选中的值, 多选模式时为数组 */
33
+ value?: string;
34
+ /** 多选模式
35
+ * @default false
36
+ */
37
+ multiple?: false;
38
+ /** 选中的值发生修改时的回调函数, 多选模式时入参为数组 */
39
+ onChange?(key?: string, item?: TreeData): void;
40
+ }
41
+ interface TreeMultipleBaseProps extends TreeBaseProp {
42
+ /** 选中的值 */
43
+ value?: string[];
44
+ /** 多选模式
45
+ * @default true
46
+ */
47
+ multiple: true;
48
+ onChange?(key?: string[], item?: TreeData): void;
49
+ }
50
+ export interface TreeProps extends TreeBaseProps {
51
+ /** 数据源 */
52
+ data: TreeData[];
53
+ }
54
+ export interface TreeSchemaProps extends Omit<TreeBaseProps, 'fromSchema'> {
55
+ /** 开启此选项支持 `JSONSchema` */
56
+ fromSchema: true;
57
+ /** 数据源 */
58
+ data: Schema;
59
+ }
60
+ export interface TreeStringProps extends TreeBaseProps {
61
+ /** 数据源 */
62
+ data: string;
63
+ }
64
+ export interface TreeMultipleProps extends TreeMultipleBaseProps {
65
+ /** 数据源 */
66
+ data: TreeData[];
67
+ }
68
+ export interface TreeMultipleSchemaProps extends Omit<TreeMultipleBaseProps, 'fromSchema'> {
69
+ /** 开启此选项支持 `JSONSchema` */
70
+ fromSchema: true;
71
+ /** 数据源 */
72
+ data: Schema;
73
+ }
74
+ export interface TreeMultipleStringProps extends TreeMultipleBaseProps {
75
+ /** 数据源 */
76
+ data: string;
77
+ }
78
+ type CustomEvents = 'onChange' | 'onRowDoubleClick' | 'onRowClick';
79
+ export type TreeElement = CustomElement<TreeProps, CustomEvents>;
80
+ export type TreeSchemaElement = CustomElement<TreeSchemaProps, CustomEvents>;
81
+ export type TreeStringElement = CustomElement<TreeStringProps, CustomEvents>;
82
+ export type TreeMultipleElement = CustomElement<TreeMultipleProps, CustomEvents>;
83
+ export type TreeMultipleSchemaElement = CustomElement<TreeMultipleSchemaProps, CustomEvents>;
84
+ export type TreeMultipleStringElement = CustomElement<TreeMultipleStringProps, CustomEvents>;
85
+ export interface TreeStack extends TreeData {
86
+ /** 深度 */
87
+ depth?: number;
88
+ }
89
+ export interface TreeData<T = string> {
90
+ /** key(唯一值) */
91
+ key: T;
92
+ /** 属性 */
93
+ name?: string;
94
+ /** 标题 */
95
+ title?: string;
96
+ /** 副标题 */
97
+ subTitle?: string;
98
+ /** 详细描述 */
99
+ description?: string;
100
+ /** 子项 */
101
+ children?: TreeData<T>[];
102
+ [key: string | number | symbol]: T | string | number | symbol | boolean | TreeData<T>[] | undefined;
103
+ }
104
+ export {};
@@ -0,0 +1,2 @@
1
+ export{};
2
+ //# sourceMappingURL=type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../components/tree/type.ts"],"names":[],"mappings":""}
@@ -22,6 +22,6 @@ export interface RouteConfig extends IRouteDefinition {
22
22
  /** 子菜单 */
23
23
  props?: Record<string, Any>;
24
24
  /** 元数据 */
25
- meta?: Record<string, string | number | boolean>;
25
+ metadata?: Record<string, string | number | boolean>;
26
26
  }
27
27
  export {};
@@ -25,9 +25,7 @@
25
25
  min-block-size: 40px;
26
26
  cursor: pointer;
27
27
  animation: back-top-fade-in 1s forwards;
28
- backdrop-filter: blur(16px);
29
- /* stylelint-disable-next-line */
30
- -webkit-backdrop-filter: blur(16px);
28
+ backdrop-filter: blur(10px);
31
29
  pointer-events: all;
32
30
 
33
31
  &::before {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../components/back-top/style.ts"],"sourcesContent":["import { css } from '@moneko/css';\n\nexport const style = css`\n :host {\n --back-top-color: var(--on-primary-selection);\n --back-top-hover-bg: var(--primary-hover);\n }\n\n .back-top {\n position: sticky;\n z-index: 9;\n display: flex;\n justify-content: center;\n align-items: center;\n border-radius: 50%;\n color: var(--back-top-color);\n background-color: var(--back-top-bg);\n box-shadow: var(--box-shadow-base);\n transition:\n background-color var(--transition-duration),\n color var(--transition-duration);\n inset-block-end: 50px;\n inset-inline-start: calc(100% - 100px);\n inline-size: 40px;\n min-inline-size: 40px;\n block-size: 40px;\n min-block-size: 40px;\n cursor: pointer;\n animation: back-top-fade-in 1s forwards;\n backdrop-filter: blur(16px);\n /* stylelint-disable-next-line */\n -webkit-backdrop-filter: blur(16px);\n pointer-events: all;\n\n &::before {\n content: '';\n display: block;\n inline-size: 16px;\n block-size: 8px;\n background-color: var(--back-top-color);\n clip-path: polygon(0 100%, 50% 0, 100% 100%);\n }\n\n &:hover {\n background-color: var(--back-top-hover-bg);\n }\n }\n\n .back-top-out {\n animation: back-top-fade-out 1s forwards;\n }\n\n @keyframes back-top-fade-in {\n from {\n transform: translate3d(0, 16px, 0) scale(1);\n opacity: 0;\n }\n\n to {\n transform: translate3d(0, 0, 0) scale(1);\n opacity: 1;\n }\n }\n\n @keyframes back-top-fade-out {\n 0%,\n 20% {\n transform: translate3d(0, 0, 0);\n opacity: 1;\n }\n\n 100% {\n transform: translate3d(0, 16px, 0);\n opacity: 0;\n }\n }\n`;\n"],"names":["style","css"],"mappings":"kGAEaA,6CAAAA,qBAFO,eAEPA,EAAQC,GAAAA,KAAG,CAAA,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0EzB,CAAC"}
1
+ {"version":3,"sources":["../../components/back-top/style.ts"],"sourcesContent":["import { css } from '@moneko/css';\n\nexport const style = css`\n :host {\n --back-top-color: var(--on-primary-selection);\n --back-top-hover-bg: var(--primary-hover);\n }\n\n .back-top {\n position: sticky;\n z-index: 9;\n display: flex;\n justify-content: center;\n align-items: center;\n border-radius: 50%;\n color: var(--back-top-color);\n background-color: var(--back-top-bg);\n box-shadow: var(--box-shadow-base);\n transition:\n background-color var(--transition-duration),\n color var(--transition-duration);\n inset-block-end: 50px;\n inset-inline-start: calc(100% - 100px);\n inline-size: 40px;\n min-inline-size: 40px;\n block-size: 40px;\n min-block-size: 40px;\n cursor: pointer;\n animation: back-top-fade-in 1s forwards;\n backdrop-filter: blur(10px);\n pointer-events: all;\n\n &::before {\n content: '';\n display: block;\n inline-size: 16px;\n block-size: 8px;\n background-color: var(--back-top-color);\n clip-path: polygon(0 100%, 50% 0, 100% 100%);\n }\n\n &:hover {\n background-color: var(--back-top-hover-bg);\n }\n }\n\n .back-top-out {\n animation: back-top-fade-out 1s forwards;\n }\n\n @keyframes back-top-fade-in {\n from {\n transform: translate3d(0, 16px, 0) scale(1);\n opacity: 0;\n }\n\n to {\n transform: translate3d(0, 0, 0) scale(1);\n opacity: 1;\n }\n }\n\n @keyframes back-top-fade-out {\n 0%,\n 20% {\n transform: translate3d(0, 0, 0);\n opacity: 1;\n }\n\n 100% {\n transform: translate3d(0, 16px, 0);\n opacity: 0;\n }\n }\n`;\n"],"names":["style","css"],"mappings":"kGAEaA,6CAAAA,qBAFO,eAEPA,EAAQC,GAAAA,KAAG,CAAA,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwEzB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../components/button/style.ts"],"sourcesContent":["import { type CSSInterpolation, css } from '@moneko/css';\nimport type { ButtonProps } from '.';\n\nfunction btnColor(type: ButtonProps['type']): CSSInterpolation {\n let _cls = `.${type}`,\n fillCls = `.${type}.fill`;\n\n if (type === 'error') {\n _cls = `.${type},.danger`;\n fillCls = `.${type}.fill,.danger.fill`;\n }\n\n return css`\n ${_cls}:not(.disabled) {\n --btn-border: var(--${type}-border);\n --btn-bg: var(--${type}-selection);\n --btn-hover-bg: var(--btn-bg);\n --btn-hover-color: var(--${type}-hover);\n --btn-active-color: var(--${type}-active);\n --btn-outline-color: var(--${type}-outline);\n --btn-color: var(--${type}-color);\n }\n ${fillCls} {\n --btn-bg: var(--${type}-color);\n --btn-border: var(--${type}-color);\n --btn-hover-bg: var(--${type}-hover);\n --btn-active-bg: var(--${type}-active);\n }\n `;\n}\n\nexport const style = css`\n .btn,\n .label {\n transition-duration: var(--transition-duration);\n }\n\n .label {\n display: block;\n line-height: normal;\n overflow: hidden;\n text-align: center;\n text-overflow: ellipsis;\n white-space: nowrap;\n transition-property: color;\n }\n\n .btn {\n display: inline-flex;\n justify-content: center;\n align-items: center;\n border: 1px solid var(--btn-border);\n border-radius: var(--border-radius);\n padding: 0 16px;\n inline-size: fit-content;\n min-inline-size: var(--btn-size);\n block-size: fit-content;\n min-block-size: var(--btn-size);\n font-size: var(--font-size);\n color: var(--btn-color);\n background-color: var(--btn-bg);\n outline-offset: 4px;\n gap: 3px;\n line-height: 1;\n cursor: pointer;\n transition-property: color, background-color, border-color, width, height, transform;\n touch-action: manipulation;\n box-sizing: border-box;\n user-select: none;\n outline: none;\n\n &:has(.icon) {\n padding: 4px 10px;\n }\n\n &:not(.disabled) {\n &:active {\n transform: scale(0.98);\n\n .label {\n color: var(--btn-active-color);\n }\n\n &:not(.link, .flat) {\n border-color: var(--btn-active-color);\n }\n\n &:not(.link) {\n background-color: var(--btn-hover-bg);\n }\n }\n\n &:hover:not(.link) {\n background-color: var(--btn-hover-bg);\n }\n\n &:hover:not(.link, .flat),\n &:focus:not(.link, .flat) {\n border-color: var(--btn-hover-color);\n }\n\n &:hover .label,\n &:focus .label {\n color: var(--btn-hover-color);\n }\n }\n\n &.disabled {\n --btn-color: var(--disable-color);\n --btn-bg: var(--disable-bg);\n --btn-border: var(--disable-border);\n\n cursor: not-allowed;\n }\n }\n\n .normal {\n --btn-size: 32px;\n }\n\n .small {\n --btn-size: 24px;\n\n gap: 2px;\n padding: 0 7px;\n font-size: var(--font-size-xs);\n\n &:has(.icon) {\n padding: 4px 5px;\n }\n }\n\n .large {\n --btn-size: 40px;\n\n font-size: var(--font-size-lg);\n gap: 4px;\n\n &:has(.icon) {\n padding: 4px 12px;\n }\n }\n\n .default:not(.disabled) {\n --btn-outline-color: var(--primary-outline);\n --btn-color: var(--text-color);\n --btn-bg: var(--component-bg);\n --btn-border: var(--border-color);\n --btn-hover-color: var(--primary-hover);\n --btn-active-color: var(--primary-active);\n }\n ${btnColor('primary')}\n ${btnColor('error')}\n ${btnColor('success')}\n ${btnColor('warning')}\n .fill {\n &:not(.disabled, .default) {\n .label {\n color: #fff !important;\n }\n\n &:hover {\n --btn-bg: var(--btn-hover-color) !important;\n }\n\n &:active {\n --btn-bg: var(--btn-active-color) !important;\n }\n }\n }\n\n .fill.danger.default {\n .label {\n color: #fff !important;\n }\n }\n\n .dashed {\n border-style: dashed;\n }\n\n .link {\n --btn-bg: transparent !important;\n --btn-border: transparent !important;\n\n border-color: transparent !important;\n background-color: transparent !important;\n\n &::after {\n content: none;\n }\n }\n\n .flat {\n --btn-border: transparent !important;\n\n background-color: transparent;\n\n &:not(.disabled, .link).default {\n --btn-hover-bg: rgb(0 0 0 / 6%);\n }\n }\n\n .ghost {\n background-color: transparent !important;\n }\n\n .circle {\n border-radius: 50% !important;\n padding: 0;\n min-inline-size: var(--btn-size);\n max-inline-size: var(--btn-size);\n min-block-size: var(--btn-size);\n max-block-size: var(--btn-size);\n text-align: center;\n line-height: var(--btn-size);\n }\n\n .block {\n inline-size: 100%;\n }\n\n .without:not(.link, .flat)::before {\n animation: btn-wave-effect var(--transition-duration) cubic-bezier(1, 1, 1, 1);\n position: absolute;\n z-index: -1;\n display: block;\n border-radius: inherit;\n opacity: 0.2;\n box-shadow: 0 0 0 0 var(--btn-outline-color);\n inset: 0;\n animation-fill-mode: forwards;\n content: '';\n pointer-events: none;\n }\n\n @keyframes btn-wave-effect {\n 0% {\n opacity: 1;\n box-shadow: 0 0 0 var(--btn-hover-color);\n }\n\n /* 25% {\n opacity: 1;\n box-shadow: 0 0 0 4px var(--btn-hover-color);\n } */\n\n 100% {\n opacity: 0;\n box-shadow: 0 0 0 6px var(--btn-outline-color);\n }\n }\n`;\n"],"names":["style","btnColor","type","_cls","fillCls","css"],"mappings":"kGA+BaA,6CAAAA,qBA/B8B,eAG3C,SAASC,EAASC,CAAyB,EACzC,IAAIC,EAAO,CAAC,CAAC,EAAED,EAAK,CAAC,CACnBE,EAAU,CAAC,CAAC,EAAEF,EAAK,KAAK,CAAC,CAO3B,MALa,UAATA,IACFC,EAAO,CAAC,CAAC,EAAED,EAAK,QAAQ,CAAC,CACzBE,EAAU,CAAC,CAAC,EAAEF,EAAK,kBAAkB,CAAC,EAGjCG,GAAAA,KAAG,CAAA,CAAC;IACT,EAAEF,EAAK;0BACe,EAAED,EAAK;sBACX,EAAEA,EAAK;;+BAEE,EAAEA,EAAK;gCACN,EAAEA,EAAK;iCACN,EAAEA,EAAK;yBACf,EAAEA,EAAK;;IAE5B,EAAEE,EAAQ;sBACQ,EAAEF,EAAK;0BACH,EAAEA,EAAK;4BACL,EAAEA,EAAK;6BACN,EAAEA,EAAK;;EAElC,CAAC,AACH,CAEO,MAAMF,EAAQK,GAAAA,KAAG,CAAA,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwHvB,EAAEJ,EAAS,WAAW;EACtB,EAAEA,EAAS,SAAS;EACpB,EAAEA,EAAS,WAAW;EACtB,EAAEA,EAAS,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkGxB,CAAC"}
1
+ {"version":3,"sources":["../../components/button/style.ts"],"sourcesContent":["import { css } from '@moneko/css';\nimport type { ButtonProps } from '.';\n\nfunction btnColor(type: ButtonProps['type']): string {\n let _cls = `.${type}`,\n fillCls = `.${type}.fill`;\n\n if (type === 'error') {\n _cls = `.${type},.danger`;\n fillCls = `.${type}.fill,.danger.fill`;\n }\n\n return css`\n ${_cls}:not(.disabled) {\n --btn-border: var(--${type}-border);\n --btn-bg: var(--${type}-selection);\n --btn-hover-bg: var(--btn-bg);\n --btn-hover-color: var(--${type}-hover);\n --btn-active-color: var(--${type}-active);\n --btn-outline-color: var(--${type}-outline);\n --btn-color: var(--${type}-color);\n }\n ${fillCls} {\n --btn-bg: var(--${type}-color);\n --btn-border: var(--${type}-color);\n --btn-hover-bg: var(--${type}-hover);\n --btn-active-bg: var(--${type}-active);\n }\n `;\n}\n\nexport const style = css`\n .btn,\n .label {\n transition-duration: var(--transition-duration);\n }\n\n .label {\n display: block;\n line-height: normal;\n overflow: hidden;\n text-align: center;\n text-overflow: ellipsis;\n white-space: nowrap;\n transition-property: color;\n }\n\n .btn {\n display: inline-flex;\n justify-content: center;\n align-items: center;\n border: 1px solid var(--btn-border);\n border-radius: var(--border-radius);\n padding: 0 16px;\n inline-size: fit-content;\n min-inline-size: var(--btn-size);\n block-size: fit-content;\n min-block-size: var(--btn-size);\n font-size: var(--font-size);\n color: var(--btn-color);\n background-color: var(--btn-bg);\n outline-offset: 4px;\n gap: 3px;\n line-height: 1;\n cursor: pointer;\n transition-property: color, background-color, border-color, width, height, transform;\n touch-action: manipulation;\n box-sizing: border-box;\n user-select: none;\n outline: none;\n\n &:has(.icon) {\n padding: 4px 10px;\n }\n\n &:not(.disabled) {\n &:active {\n transform: scale(0.98);\n\n .label {\n color: var(--btn-active-color);\n }\n\n &:not(.link, .flat) {\n border-color: var(--btn-active-color);\n }\n\n &:not(.link) {\n background-color: var(--btn-hover-bg);\n }\n }\n\n &:hover:not(.link) {\n background-color: var(--btn-hover-bg);\n }\n\n &:hover:not(.link, .flat),\n &:focus:not(.link, .flat) {\n border-color: var(--btn-hover-color);\n }\n\n &:hover .label,\n &:focus .label {\n color: var(--btn-hover-color);\n }\n }\n\n &.disabled {\n --btn-color: var(--disable-color);\n --btn-bg: var(--disable-bg);\n --btn-border: var(--disable-border);\n\n cursor: not-allowed;\n }\n }\n\n .normal {\n --btn-size: 32px;\n }\n\n .small {\n --btn-size: 24px;\n\n gap: 2px;\n padding: 0 7px;\n font-size: var(--font-size-xs);\n\n &:has(.icon) {\n padding: 4px 5px;\n }\n }\n\n .large {\n --btn-size: 40px;\n\n font-size: var(--font-size-lg);\n gap: 4px;\n\n &:has(.icon) {\n padding: 4px 12px;\n }\n }\n\n .default:not(.disabled) {\n --btn-outline-color: var(--primary-outline);\n --btn-color: var(--text-color);\n --btn-bg: var(--component-bg);\n --btn-border: var(--border-color);\n --btn-hover-color: var(--primary-hover);\n --btn-active-color: var(--primary-active);\n }\n ${btnColor('primary')}\n ${btnColor('error')}\n ${btnColor('success')}\n ${btnColor('warning')}\n .fill {\n &:not(.disabled, .default) {\n .label {\n color: #fff !important;\n }\n\n &:hover {\n --btn-bg: var(--btn-hover-color) !important;\n }\n\n &:active {\n --btn-bg: var(--btn-active-color) !important;\n }\n }\n }\n\n .fill.danger.default {\n .label {\n color: #fff !important;\n }\n }\n\n .dashed {\n border-style: dashed;\n }\n\n .link {\n --btn-bg: transparent !important;\n --btn-border: transparent !important;\n\n border-color: transparent !important;\n background-color: transparent !important;\n\n &::after {\n content: none;\n }\n }\n\n .flat {\n --btn-border: transparent !important;\n\n background-color: transparent;\n\n &:not(.disabled, .link).default {\n --btn-hover-bg: rgb(0 0 0 / 6%);\n }\n }\n\n .ghost {\n background-color: transparent !important;\n }\n\n .circle {\n border-radius: 50% !important;\n padding: 0;\n min-inline-size: var(--btn-size);\n max-inline-size: var(--btn-size);\n min-block-size: var(--btn-size);\n max-block-size: var(--btn-size);\n text-align: center;\n line-height: var(--btn-size);\n }\n\n .block {\n inline-size: 100%;\n }\n\n .without:not(.link, .flat)::before {\n animation: btn-wave-effect var(--transition-duration) cubic-bezier(1, 1, 1, 1);\n position: absolute;\n z-index: -1;\n display: block;\n border-radius: inherit;\n opacity: 0.2;\n box-shadow: 0 0 0 0 var(--btn-outline-color);\n inset: 0;\n animation-fill-mode: forwards;\n content: '';\n pointer-events: none;\n }\n\n @keyframes btn-wave-effect {\n 0% {\n opacity: 1;\n box-shadow: 0 0 0 var(--btn-hover-color);\n }\n\n /* 25% {\n opacity: 1;\n box-shadow: 0 0 0 4px var(--btn-hover-color);\n } */\n\n 100% {\n opacity: 0;\n box-shadow: 0 0 0 6px var(--btn-outline-color);\n }\n }\n`;\n"],"names":["style","btnColor","type","_cls","fillCls","css"],"mappings":"kGA+BaA,6CAAAA,qBA/BO,eAGpB,SAASC,EAASC,CAAyB,EACzC,IAAIC,EAAO,CAAC,CAAC,EAAED,EAAK,CAAC,CACnBE,EAAU,CAAC,CAAC,EAAEF,EAAK,KAAK,CAAC,CAO3B,MALa,UAATA,IACFC,EAAO,CAAC,CAAC,EAAED,EAAK,QAAQ,CAAC,CACzBE,EAAU,CAAC,CAAC,EAAEF,EAAK,kBAAkB,CAAC,EAGjCG,GAAAA,KAAG,CAAA,CAAC;IACT,EAAEF,EAAK;0BACe,EAAED,EAAK;sBACX,EAAEA,EAAK;;+BAEE,EAAEA,EAAK;gCACN,EAAEA,EAAK;iCACN,EAAEA,EAAK;yBACf,EAAEA,EAAK;;IAE5B,EAAEE,EAAQ;sBACQ,EAAEF,EAAK;0BACH,EAAEA,EAAK;4BACL,EAAEA,EAAK;6BACN,EAAEA,EAAK;;EAElC,CAAC,AACH,CAEO,MAAMF,EAAQK,GAAAA,KAAG,CAAA,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwHvB,EAAEJ,EAAS,WAAW;EACtB,EAAEA,EAAS,SAAS;EACpB,EAAEA,EAAS,WAAW;EACtB,EAAEA,EAAS,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkGxB,CAAC"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"default",{enumerable:!0,get:function(){return R}});const e=require("solid-js/web"),t=require("solid-js"),r=s(require("@moneko/common/lib/downloadBlob")),o=s(require("@moneko/common/lib/isFunction")),n=require("@moneko/css"),a=require("solid-element"),c=require("./style");require("../button");const i=s(require("../theme"));function s(e){return e&&e.__esModule?e:{default:e}}const d=(0,e.template)("<style>"),l=(0,e.template)('<n-button class="btn">',!0,!1),u=(0,e.template)('<n-button type="error" class="btn">',!0,!1),p=(0,e.template)('<div class="record"><n-button class="btn"><span>',!0,!1),v=(0,e.template)('<div class="view"><span></span><video autoplay>'),m=(0,e.template)('<div><div class="controller"><n-button class="btn">',!0,!1),f={video:!0,audio:{echoCancellation:!0,noiseSuppression:!0,sampleRate:44100}},w={inactive:"primary",paused:"warning",recording:"success"};function g(a){let s;let{baseStyle:g}=i.default,R=(0,t.mergeProps)({options:f,captureScreenText:"捕获屏幕",stopCaptureText:"停止捕获",startRecorderText:"开始录制",stopRecorderText:"停止录制",pausedRecorderText:"暂停录制",recorderingText:"录制中",onErrorRecorder:null},a),[S,C]=(0,t.splitProps)(R,["options","preview","controls","recorder","filename","captureScreenText","stopCaptureText","startRecorderText","stopRecorderText","pausedRecorderText","recorderingText","onErrorRecorder","onStopRecorder","onStartRecorder","onStopCapture","onStartCapture","onRecorderDataAvailable","onErrorCapture","onSaveRecorder","class","css"]),E=[],[h,b]=(0,t.createSignal)(null),[x,T]=(0,t.createSignal)(null),[k,y]=(0,t.createSignal)("inactive");function _(){let e=(0,t.untrack)(h);if(e){switch((0,o.default)(S.onStartRecorder)&&S.onStartRecorder(e.state),e.state){case"inactive":e.start();break;case"paused":e.resume();break;default:e.pause()}y(e.state)}}function $(e){E?.push(e.data),S.onRecorderDataAvailable?.(e)}function q(){let e=(0,t.untrack)(h);e&&("inactive"!==e.state&&e.stop(),y(e.state)),S.onStopRecorder?.()}function O(){if(!E?.length)return;let e=new Blob(E,{type:"video/webm"}),t=S.filename||new Date().toISOString(),o=`${t}.webm`;E?.splice(0),S.onSaveRecorder&&S.onSaveRecorder(e,o),(0,r.default)(e,o)}function D(){q();let e=(0,t.untrack)(x);if(e){let t=e.getTracks();t?.forEach(e=>e.stop()),T(null)}S.onStopCapture?.()}async function P(){D();try{let e=await navigator.mediaDevices.getDisplayMedia({...f,...S.options});e&&(e.addEventListener("inactive",D,!1),T(e)),S.onStartCapture?.(e)}catch(e){S.onErrorCapture?.(e)}}(0,t.createEffect)(()=>{let e=x();S.preview&&s&&e&&(s.srcObject=e)}),(0,t.createEffect)(()=>{let e=x();if(e?.active){let t=new MediaRecorder(e);t.onstop=O,t.onerror=S.onErrorRecorder,t.ondataavailable=$,b(t)}else b(null)}),(0,t.onCleanup)(()=>{let e=(0,t.untrack)(h);e&&e?.state!=="inactive"&&e.stop();let r=(0,t.untrack)(x);r&&r.getTracks().forEach(e=>e.stop())});let j=(0,t.createMemo)(()=>({paused:S.pausedRecorderText,recording:S.recorderingText,inactive:S.startRecorderText})[k()]);return[(()=>{let t=d();return(0,e.insert)(t,g,null),(0,e.insert)(t,c.style,null),(0,e.insert)(t,()=>(0,n.css)(S.css),null),t})(),(()=>{let r=m(),o=r.firstChild,a=o.firstChild;return(0,e.spread)(r,(0,e.mergeProps)({get class(){return(0,n.cx)("capture-screen",S.class)}},C),!1,!0),(0,e.addEventListener)(a,"click",P,!0),a._$owner=(0,e.getOwner)(),(0,e.insert)(a,()=>S.captureScreenText),(0,e.insert)(o,(0,e.createComponent)(t.Show,{get when(){return x()},get children(){return[(()=>{let t=l();return(0,e.addEventListener)(t,"click",D,!0),t.danger=!0,t._$owner=(0,e.getOwner)(),(0,e.insert)(t,()=>S.stopCaptureText),t})(),(0,e.createComponent)(t.Show,{get when(){return S.recorder},get children(){let r=p(),o=r.firstChild,n=o.firstChild;return(0,e.addEventListener)(o,"click",_,!0),o._$owner=(0,e.getOwner)(),(0,e.insert)(n,j),(0,e.insert)(r,(0,e.createComponent)(t.Show,{get when(){return"inactive"!==k()},get children(){let t=u();return(0,e.addEventListener)(t,"click",q,!0),t._$owner=(0,e.getOwner)(),(0,e.insert)(t,()=>S.stopRecorderText),t}}),null),(0,e.effect)(()=>o.type=w[k()]),r}})]}}),null),(0,e.insert)(r,(0,e.createComponent)(t.Show,{get when(){return(0,e.memo)(()=>!!S.preview)()&&x()},get children(){let t=v(),r=t.firstChild,o=r.nextSibling,a=s;return"function"==typeof a?(0,e.use)(a,o):s=o,(0,e.effect)(t=>{let a=(0,n.cx)("recording"===k()&&"recording","paused"===k()&&"paused"),c=S.controls&&null!==x();return a!==t._v$&&(0,e.className)(r,t._v$=a),c!==t._v$2&&(o.controls=t._v$2=c),t},{_v$:void 0,_v$2:void 0}),t}}),null),r})()]}(0,a.customElement)("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,r)=>{let o=r.element,n=(0,t.mergeProps)({onErrorRecorder(e){o.dispatchEvent(new CustomEvent("errorrecorder",{detail:e}))},onStopRecorder(){o.dispatchEvent(new CustomEvent("stoprecorder",{detail:null}))},onStartRecorder(e){o.dispatchEvent(new CustomEvent("startrecorder",{detail:e}))},onRecorderDataAvailable(e){o.dispatchEvent(new CustomEvent("recorderdataavailable",{detail:e}))},onErrorCapture(e){o.dispatchEvent(new CustomEvent("errorcapture",{detail:e}))},onStopCapture(){o.dispatchEvent(new CustomEvent("stopcapture",{detail:null}))},onStartCapture(e){o.dispatchEvent(new CustomEvent("startcapture",{detail:e}))},onSaveRecorder(e,t){o.dispatchEvent(new CustomEvent("saverecorder",{detail:[e,t]}))}},e);return(0,t.createComponent)(g,n)});const R=g;(0,e.delegateEvents)(["click"]);
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"default",{enumerable:!0,get:function(){return R}});const e=require("solid-js/web"),t=require("solid-js"),r=s(require("@moneko/common/lib/downloadBlob")),o=s(require("@moneko/common/lib/isFunction")),n=require("@moneko/css"),a=require("solid-element"),c=require("./style");require("../button");const i=s(require("../theme"));function s(e){return e&&e.__esModule?e:{default:e}}const d=(0,e.template)("<style>"),l=(0,e.template)('<n-button class="btn">',!0,!1),u=(0,e.template)('<n-button type="error" class="btn">',!0,!1),p=(0,e.template)('<div class="record"><n-button class="btn"><span>',!0,!1),v=(0,e.template)('<div class="view"><span></span><video autoplay>'),m=(0,e.template)('<div><div class="controller"><n-button class="btn">',!0,!1),f={video:!0,audio:{echoCancellation:!0,noiseSuppression:!0,sampleRate:44100}},w={inactive:"primary",paused:"warning",recording:"success"};function g(a){let s;let{baseStyle:g}=i.default,R=(0,t.mergeProps)({options:f,captureScreenText:"捕获屏幕",stopCaptureText:"停止捕获",startRecorderText:"开始录制",stopRecorderText:"停止录制",pausedRecorderText:"暂停录制",recorderingText:"录制中",onErrorRecorder:null},a),[S,C]=(0,t.splitProps)(R,["options","preview","controls","recorder","filename","captureScreenText","stopCaptureText","startRecorderText","stopRecorderText","pausedRecorderText","recorderingText","onErrorRecorder","onStopRecorder","onStartRecorder","onStopCapture","onStartCapture","onRecorderDataAvailable","onErrorCapture","onSaveRecorder","class","css"]),E=[],[h,b]=(0,t.createSignal)(null),[x,T]=(0,t.createSignal)(null),[k,y]=(0,t.createSignal)("inactive");function _(){let e=(0,t.untrack)(h);if(e){switch((0,o.default)(S.onStartRecorder)&&S.onStartRecorder(e.state),e.state){case"inactive":e.start();break;case"paused":e.resume();break;default:e.pause()}y(e.state)}}function $(e){E?.push(e.data),S.onRecorderDataAvailable?.(e)}function q(){let e=(0,t.untrack)(h);e&&("inactive"!==e.state&&e.stop(),y(e.state)),S.onStopRecorder?.()}function O(){if(!E?.length)return;let e=new Blob(E,{type:"video/webm"}),t=S.filename||new Date().toISOString(),o=`${t}.webm`;E?.splice(0),S.onSaveRecorder&&S.onSaveRecorder(e,o),(0,r.default)(e,o)}function D(){q();let e=(0,t.untrack)(x);if(e){let t=e.getTracks();t?.forEach(e=>e.stop()),T(null)}S.onStopCapture?.()}async function P(){D();try{let e=await navigator.mediaDevices.getDisplayMedia({...f,...S.options});e&&(e.addEventListener("inactive",D,!1),T(e)),S.onStartCapture?.(e)}catch(e){S.onErrorCapture?.(e)}}(0,t.createEffect)(()=>{let e=x();S.preview&&s&&e&&(s.srcObject=e)}),(0,t.createEffect)(()=>{let e=x();if(e?.active){let t=new MediaRecorder(e);t.onstop=O,t.onerror=S.onErrorRecorder,t.ondataavailable=$,b(t)}else b(null)}),(0,t.onCleanup)(()=>{let e=(0,t.untrack)(h);e&&e?.state!=="inactive"&&e.stop();let r=(0,t.untrack)(x);r&&r.getTracks().forEach(e=>e.stop())});let j=(0,t.createMemo)(()=>({paused:S.pausedRecorderText,recording:S.recorderingText,inactive:S.startRecorderText})[k()]);return[(()=>{let t=d();return(0,e.insert)(t,g,null),(0,e.insert)(t,c.style,null),(0,e.insert)(t,()=>(0,n.css)(S.css),null),t})(),(()=>{let r=m(),o=r.firstChild,a=o.firstChild;return(0,e.spread)(r,(0,e.mergeProps)({get class(){return(0,n.cx)("capture-screen",S.class)}},C),!1,!0),(0,e.addEventListener)(a,"click",P,!0),a._$owner=(0,e.getOwner)(),(0,e.insert)(a,()=>S.captureScreenText),(0,e.insert)(o,(0,e.createComponent)(t.Show,{get when(){return x()},get children(){return[(()=>{let t=l();return(0,e.addEventListener)(t,"click",D,!0),t.danger=!0,t._$owner=(0,e.getOwner)(),(0,e.insert)(t,()=>S.stopCaptureText),t})(),(0,e.createComponent)(t.Show,{get when(){return S.recorder},get children(){let r=p(),o=r.firstChild,n=o.firstChild;return(0,e.addEventListener)(o,"click",_,!0),o._$owner=(0,e.getOwner)(),(0,e.insert)(n,j),(0,e.insert)(r,(0,e.createComponent)(t.Show,{get when(){return"inactive"!==k()},get children(){let t=u();return(0,e.addEventListener)(t,"click",q,!0),t._$owner=(0,e.getOwner)(),(0,e.insert)(t,()=>S.stopRecorderText),t}}),null),(0,e.effect)(()=>o.type=w[k()]),r}})]}}),null),(0,e.insert)(r,(0,e.createComponent)(t.Show,{get when(){return(0,e.memo)(()=>!!S.preview)()&&x()},get children(){let t=v(),r=t.firstChild,o=r.nextSibling,a=s;return"function"==typeof a?(0,e.use)(a,o):s=o,(0,e.effect)(t=>{let a=(0,n.cx)("recording"===k()&&"recording","paused"===k()&&"paused"),c=S.controls&&null!==x();return a!==t._v$&&(0,e.className)(r,t._v$=a),c!==t._v$2&&(o.controls=t._v$2=c),t},{_v$:void 0,_v$2:void 0}),t}}),null),r})()]}(0,a.customElement)("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,r)=>{let o=r.element,n=(0,t.mergeProps)({onErrorRecorder(e){o.dispatchEvent(new CustomEvent("errorrecorder",{detail:e}))},onStopRecorder(){o.dispatchEvent(new CustomEvent("stoprecorder",{detail:void 0}))},onStartRecorder(e){o.dispatchEvent(new CustomEvent("startrecorder",{detail:e}))},onRecorderDataAvailable(e){o.dispatchEvent(new CustomEvent("recorderdataavailable",{detail:e}))},onErrorCapture(e){o.dispatchEvent(new CustomEvent("errorcapture",{detail:e}))},onStopCapture(){o.dispatchEvent(new CustomEvent("stopcapture",{detail:void 0}))},onStartCapture(e){o.dispatchEvent(new CustomEvent("startcapture",{detail:e}))},onSaveRecorder(e,t){o.dispatchEvent(new CustomEvent("saverecorder",{detail:[e,t]}))}},e);return(0,t.createComponent)(g,n)});const R=g;(0,e.delegateEvents)(["click"]);
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../components/capture-screen/index.tsx"],"sourcesContent":["import {\n Show,\n createComponent,\n createEffect,\n createMemo,\n createSignal,\n mergeProps,\n onCleanup,\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';\nimport { style } from './style';\nimport '../button';\nimport theme from '../theme';\nimport type { CustomElement } from '..';\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) => track.stop());\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) => track.stop());\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>\n {baseStyle()}\n {style}\n {css(local.css)}\n </style>\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 class={cx(\n recordState() === 'recording' && 'recording',\n recordState() === 'paused' && 'paused',\n )}\n />\n <video ref={videoElem} autoplay controls={local.controls && mediaStream() !== null} />\n </div>\n </Show>\n </div>\n </>\n );\n}\n\ncustomElement<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: null,\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: null,\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 return createComponent(CaptureScreen, props);\n },\n);\n\nexport default CaptureScreen;\n"],"names":["displayMediaOptions","video","audio","echoCancellation","noiseSuppression","sampleRate","btnStatusDic","inactive","paused","recording","CaptureScreen","_","videoElem","baseStyle","theme","_props","mergeProps","options","captureScreenText","stopCaptureText","startRecorderText","stopRecorderText","pausedRecorderText","recorderingText","onErrorRecorder","local","props","splitProps","chunks","mediaRecorder","setMediaRecorder","createSignal","mediaStream","setMediaStream","recordState","setRecordState","handleStartRecorder","mr","untrack","isFunction","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","downloadBlob","stopCapture","ms","tracks","getTracks","forEach","track","onStopCapture","startCapture","stream","navigator","mediaDevices","getDisplayMedia","addEventListener","onStartCapture","err","onErrorCapture","createEffect","preview","srcObject","active","recorderInstance","MediaRecorder","onstop","onerror","ondataavailable","onCleanup","recorderText","createMemo","style","css","cx","class","Show","recorder","controls","customElement","opt","el","element","dispatchEvent","CustomEvent","detail","createComponent"],"mappings":"kGAuaA,+CAAA,+CA7ZO,wBACkC,gDAAA,4CACjB,yBACM,2BACR,mBACf,+BACW,8aAgEZA,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,CAAGC,SAAK,CACrBC,EAASC,GAAAA,YAAU,EACvB,CACEC,QAASjB,EACTkB,kBAAmB,OACnBC,gBAAiB,OACjBC,kBAAmB,OACnBC,iBAAkB,OAClBC,mBAAoB,OACpBC,gBAAiB,MACjBC,gBAAiB,IACnB,EACAb,GAEI,CAACc,EAAOC,EAAM,CAAGC,GAAAA,YAAU,EAACZ,EAAQ,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,CAAGC,GAAAA,cAAY,EAAuB,MACvE,CAACC,EAAaC,EAAe,CAAGF,GAAAA,cAAY,EAAqB,MACjE,CAACG,EAAaC,EAAe,CAAGJ,GAAAA,cAAY,EAAyB,YAG3E,SAASK,IACP,IAAMC,EAAKC,GAAAA,SAAO,EAACT,GAEnB,GAAIQ,EAAI,CAIN,OAHIE,GAAAA,SAAU,EAACd,EAAMe,eAAe,GAClCf,EAAMe,eAAe,CAACH,EAAGI,KAAK,EAExBJ,EAAGI,KAAK,EACd,IAAK,WACHJ,EAAGK,KAAK,GACR,KACF,KAAK,SACHL,EAAGM,MAAM,GACT,KACF,SAEEN,EAAGO,KAAK,EAEZ,CACAT,EAAeE,EAAGI,KAAK,CACzB,CACF,CACA,SAASI,EAA4BC,CAAkC,EACrElB,GAAQmB,KAAKD,EAAEE,IAAI,EACnBvB,EAAMwB,uBAAuB,GAAGH,EAClC,CAEA,SAASI,IACP,IAAMb,EAAKC,GAAAA,SAAO,EAACT,GAGfQ,IACe,aAAbA,EAAGI,KAAK,EACVJ,EAAGc,IAAI,GAEThB,EAAeE,EAAGI,KAAK,GAEzBhB,EAAM2B,cAAc,IACtB,CACA,SAASC,IACP,GAAI,CAACzB,GAAQ0B,OAAQ,OAErB,IAAMC,EAAa,IAAIC,KAAK5B,EAAQ,CAClC6B,KAAM,YACR,GACMC,EAAOjC,EAAMkC,QAAQ,EAAI,IAAIC,OAAOC,WAAW,GAC/CC,EAAW,CAAC,EAAEJ,EAAK,KAAK,CAAC,CAE/B9B,GAAQmC,OAAO,GACXtC,EAAMuC,cAAc,EACtBvC,EAAMuC,cAAc,CAACT,EAAMO,GAG7BG,GAAAA,SAAY,EAACV,EAAMO,EACrB,CAGA,SAASI,IAEPhB,IACA,IAAMiB,EAAK7B,GAAAA,SAAO,EAACN,GAEnB,GAAImC,EAAI,CACN,IAAMC,EAASD,EAAGE,SAAS,GAE3BD,GAAQE,QAAQ,AAACC,GAA4BA,EAAMpB,IAAI,IACvDlB,EAAe,KACjB,CACAR,EAAM+C,aAAa,IACrB,CAGA,eAAeC,IACbP,IACA,GAAI,CACF,IAAMQ,EAAS,MAAMC,UAAUC,YAAY,CAACC,eAAe,CAAC,CAC1D,GAAG7E,CAAmB,CACtB,GAAGyB,EAAMR,OAAO,AAClB,GAEIyD,IAEFA,EAAOI,gBAAgB,CAAC,WAAYZ,EAAa,CAAA,GACjDjC,EAAeyC,IAEjBjD,EAAMsD,cAAc,GAAGL,EACzB,CAAE,MAAOM,EAAK,CACZvD,EAAMwD,cAAc,GAAGD,EACzB,CACF,CAEAE,GAAAA,cAAY,EAAC,KACX,IAAMf,EAAKnC,GAEPP,CAAAA,EAAM0D,OAAO,EAAIvE,GAAauD,GAChCvD,CAAAA,EAAUwE,SAAS,CAAGjB,CAAC,CAE3B,GAEAe,GAAAA,cAAY,EAAC,KACX,IAAMf,EAAKnC,IAEX,GAAImC,GAAIkB,OAAQ,CACd,IAAMC,EAAmB,IAAIC,cAAcpB,EAE3CmB,CAAAA,EAAiBE,MAAM,CAAGnC,EAC1BiC,EAAiBG,OAAO,CAAGhE,EAAMD,eAAe,CAEhD8D,EAAiBI,eAAe,CAAG7C,EACnCf,EAAiBwD,EACnB,MACExD,EAAiB,KAErB,GAEA6D,GAAAA,WAAS,EAAC,KACR,IAAMtD,EAAKC,GAAAA,SAAO,EAACT,GAGfQ,GAAMA,GAAII,QAAU,YACtBJ,EAAGc,IAAI,GAET,IAAMgB,EAAK7B,GAAAA,SAAO,EAACN,GAEfmC,GAGFC,AAFeD,EAAGE,SAAS,GAEpBC,OAAO,CAAC,AAACC,GAA4BA,EAAMpB,IAAI,GAE1D,GACA,IAAMyC,EAAeC,GAAAA,YAAU,EAAC,IACvB,CAAA,CACLrF,OAAQiB,EAAMH,kBAAkB,CAChCb,UAAWgB,EAAMF,eAAe,CAChChB,SAAUkB,EAAML,iBAAiB,AACnC,CAAA,CAAC,CAACc,IAAc,EAGlB,4CAGOrB,uBACAiF,OAAK,0BACLC,GAAAA,KAAG,EAACtE,EAAMsE,GAAG,qHAEJC,GAAAA,IAAE,EAAC,iBAAkBvE,EAAMwE,KAAK,IAAOvE,2CAE5B+C,oDAChBhD,EAAMP,iBAAiB,uCAEzBgF,MAAI,oBAAOlE,kFAEyBkC,eAAf,CAAA,gDACfzC,EAAMN,eAAe,8BAEvB+E,MAAI,oBAAOzE,EAAM0E,QAAQ,gGAIX/D,gDAGFwD,wCAERM,MAAI,mBAAOhE,AAAkB,aAAlBA,qEACsBgB,oDAC7BzB,EAAMJ,gBAAgB,qCARnBf,CAAY,CAAC4B,IAAc,sDAgB5CgE,MAAI,mBAAOzE,iBAAAA,EAAM0D,OAAO,KAAInD,+DAQbpB,4CAAAA,2BALHoF,GAAAA,IAAE,EACP9D,AAAkB,cAAlBA,KAAiC,YACjCA,AAAkB,WAAlBA,KAA8B,YAGQT,EAAM2E,QAAQ,EAAIpE,AAAkB,OAAlBA,iIAMxE,CAEAqE,GAAAA,eAAa,EACX,mBACA,CACEJ,MAAO,KAAK,EACZF,IAAK,KAAK,EACV9E,QAAS,KAAK,EACdkE,QAAS,KAAK,EACdiB,SAAU,KAAK,EACfD,SAAU,KAAK,EACfxC,SAAU,KAAK,EACfzC,kBAAmB,KAAK,EACxBC,gBAAiB,KAAK,EACtBC,kBAAmB,KAAK,EACxBC,iBAAkB,KAAK,EACvBC,mBAAoB,KAAK,EACzBC,gBAAiB,KAAK,EACtBC,gBAAiB,KAAK,EACtB4B,eAAgB,KAAK,EACrBZ,gBAAiB,KAAK,EACtBS,wBAAyB,KAAK,EAC9BgC,eAAgB,KAAK,EACrBT,cAAe,KAAK,EACpBO,eAAgB,KAAK,EACrBf,eAAgB,KAAK,CACvB,EACA,CAACrD,EAAG2F,KACF,IAAMC,EAAKD,EAAIE,OAAO,CAChB9E,EAAQV,GAAAA,YAAU,EACtB,CACEQ,gBAAgBsB,CAAQ,EACtByD,EAAGE,aAAa,CACd,IAAIC,YAAY,gBAAiB,CAC/BC,OAAQ7D,CACV,GAEJ,EACAM,iBACEmD,EAAGE,aAAa,CACd,IAAIC,YAAY,eAAgB,CAC9BC,OAAQ,IACV,GAEJ,EACAnE,gBAAgBC,CAA6B,EAC3C8D,EAAGE,aAAa,CACd,IAAIC,YAAY,gBAAiB,CAC/BC,OAAQlE,CACV,GAEJ,EACAQ,wBAAwBH,CAAkC,EACxDyD,EAAGE,aAAa,CACd,IAAIC,YAAY,wBAAyB,CACvCC,OAAQ7D,CACV,GAEJ,EACAmC,eAAenC,CAAU,EACvByD,EAAGE,aAAa,CACd,IAAIC,YAAY,eAAgB,CAC9BC,OAAQ7D,CACV,GAEJ,EACA0B,gBACE+B,EAAGE,aAAa,CACd,IAAIC,YAAY,cAAe,CAC7BC,OAAQ,IACV,GAEJ,EACA5B,eAAeL,CAAoB,EACjC6B,EAAGE,aAAa,CACd,IAAIC,YAAY,eAAgB,CAC9BC,OAAQjC,CACV,GAEJ,EACAV,eAAeT,CAAU,CAAEO,CAAgB,EACzCyC,EAAGE,aAAa,CACd,IAAIC,YAAY,eAAgB,CAC9BC,OAAQ,CAACpD,EAAMO,EAAS,AAC1B,GAEJ,CACF,EACAnD,GAGF,MAAOiG,GAAAA,iBAAe,EAAClG,EAAegB,EACxC,SAGF,EAAehB"}
1
+ {"version":3,"sources":["../../components/capture-screen/index.tsx"],"sourcesContent":["import {\n Show,\n createComponent,\n createEffect,\n createMemo,\n createSignal,\n mergeProps,\n onCleanup,\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';\nimport { style } from './style';\nimport '../button';\nimport theme from '../theme';\nimport type { CustomElement } from '..';\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) => track.stop());\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) => track.stop());\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>\n {baseStyle()}\n {style}\n {css(local.css)}\n </style>\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 class={cx(\n recordState() === 'recording' && 'recording',\n recordState() === 'paused' && 'paused',\n )}\n />\n <video ref={videoElem} autoplay controls={local.controls && mediaStream() !== null} />\n </div>\n </Show>\n </div>\n </>\n );\n}\n\ncustomElement<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 return createComponent(CaptureScreen, props);\n },\n);\n\nexport default CaptureScreen;\n"],"names":["displayMediaOptions","video","audio","echoCancellation","noiseSuppression","sampleRate","btnStatusDic","inactive","paused","recording","CaptureScreen","_","videoElem","baseStyle","theme","_props","mergeProps","options","captureScreenText","stopCaptureText","startRecorderText","stopRecorderText","pausedRecorderText","recorderingText","onErrorRecorder","local","props","splitProps","chunks","mediaRecorder","setMediaRecorder","createSignal","mediaStream","setMediaStream","recordState","setRecordState","handleStartRecorder","mr","untrack","isFunction","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","downloadBlob","stopCapture","ms","tracks","getTracks","forEach","track","onStopCapture","startCapture","stream","navigator","mediaDevices","getDisplayMedia","addEventListener","onStartCapture","err","onErrorCapture","createEffect","preview","srcObject","active","recorderInstance","MediaRecorder","onstop","onerror","ondataavailable","onCleanup","recorderText","createMemo","style","css","cx","class","Show","recorder","controls","customElement","opt","el","element","dispatchEvent","CustomEvent","detail","createComponent"],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ /// <reference types="typings/typings" />
1
2
  import type { CronData } from '.';
2
3
  import type { BaseOption } from 'neko-ui';
3
4
  type BeginIntervalProps = {
package/lib/cron/index.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"default",{enumerable:!0,get:function(){return b}});const e=require("solid-js/web"),t=require("solid-js"),n=require("@moneko/css"),r=require("solid-element"),a=d(require("./day")),u=d(require("./hour")),l=d(require("./minute")),o=d(require("./month")),s=d(require("./second")),i=d(require("./week")),c=d(require("./year"));function d(e){return e&&e.__esModule?e:{default:e}}require("../button"),require("../input-number"),require("../radio"),require("../select"),require("../tabs");const y=(0,e.template)("<style>"),p=(0,e.template)("<n-tabs>",!0,!1),m=(0,e.template)("<code>");function v(r){let[d]=(0,t.splitProps)(r,["value","defaultValue","exclude","onChange","type","showCron","css","class"]),[v,b]=(0,t.createSignal)(d.defaultValue),f=new Date().getFullYear(),g={hms:{start:0,end:1,begin:0,beginEvery:1,some:[0],value:""},mwd:{start:1,end:2,begin:1,beginEvery:1,some:[1],value:""},year:{start:f,end:f+1,begin:f,beginEvery:1,some:[f],value:""}},h=[],C=[];for(let e=1;e<32;e++)h.push({label:e<10?`0${e}`:`${e}`,value:e}),C.push(e);let[w,$]=(0,t.createSignal)("second"),[k,q]=(0,t.createSignal)({second:{type:"*",...g.hms},minute:{type:"*",...g.hms},hour:{type:"*",...g.hms},day:{type:"*",last:1,closeWorkDay:1,...g.mwd},month:{type:"*",...g.mwd},week:{last:1,type:"?",...g.mwd},year:{type:"",...g.year}});function E(e,n){(0,t.batch)(()=>{!function(){let e=(0,t.untrack)(k),n="day"===w();if(n||"week"===w()){let t=n?"week":"day",r="?"===e[t].type&&"?"===e[w()].type?"*":"?";r!==e[t].type&&q(e=>({...e,[t]:{...e[t],type:r}}))}}(),q(t=>{let r={...t[w()],[e]:n};return("start"===e||"end"===e)&&r.end-r.start<=1&&("end"===e?r.start=n-1:r.end=n+1),{...t,[w()]:r}})})}function N(e){$(e.detail[0])}function x(e,t){if(e.value.indexOf("-")>-1){e.type="period";let t=e.value.split("-");e.start=Number(t[0]),e.end=Number(t[1])}else if(e.value.indexOf("W")>-1)e.type="closeWorkDay",e.closeWorkDay=Number(e.value.split("W")[0])||1;else if(e.value.indexOf("L")>-1)e.type="last",e.last=Number(e.value.split("L")[0])||1;else if(e.value.indexOf(t?"#":"/")>-1){e.type="beginInterval";let n=e.value.split(t?"#":"/");t?(e.begin=Number(n[1]),e.beginEvery=Number(n[0])):(e.begin=Number(n[0]),e.beginEvery=Number(n[1]))}else e.value.indexOf(",")>-1||/^[0-9]+$/.test(e.value)?(e.type="some",e.some=e.value.split(",").map(Number)):e.type=e.value;return e}function P(e){return"number"!=typeof e||isNaN(e)?e:`${e}`}function O(e,t){switch(e.type){case"period":return`${P(e.start)}-${P(e.end)}`;case"beginInterval":if(t)return`${P(e.beginEvery)}#${P(e.begin)}`;return`${P(e.begin)}/${P(e.beginEvery)}`;case"closeWorkDay":return`${P(e.closeWorkDay||1)}W`;case"last":return t?`${P(e.last)}L`:"L";case"some":return e.some.join(",");default:return e.type}}(0,t.createEffect)(()=>{void 0!==d.value&&(0,t.untrack)(v)!==d.value&&b(d.value)}),(0,t.createEffect)(()=>{let e=v();if(e){let n=e.toUpperCase().split(" ");(0,t.batch)(()=>{q(e=>({second:x({...e.second,value:n[0]||"?"}),minute:x({...e.minute,value:n[1]||"?"}),hour:x({...e.hour,value:n[2]||"?"}),day:x({...e.day,value:n[3]||""}),month:x({...e.month,value:n[4]||""}),week:x({...e.week,value:n[5]||""},!0),year:x({...e.year,value:n[6]||""})}))})}}),(0,t.createEffect)(()=>{let{second:e,minute:t,hour:n,day:a,month:u,week:l,year:o}=k(),s=`${O(e)} ${O(t)} ${O(n)} ${O(a)} ${O(u)} ${O(l,!0)} ${O(o)}`;b(e=>e===s?e:(r.onChange?.(s),s))});let W=[{value:"second",label:"秒",content:(0,e.createComponent)(s.default,{get state(){return k().second},onChange:E})},{value:"minute",label:"分钟",content:(0,e.createComponent)(l.default,{get state(){return k().minute},onChange:E})},{value:"hour",label:"小时",content:(0,e.createComponent)(u.default,{get state(){return k().hour},onChange:E})},{value:"day",label:"日",content:(0,e.createComponent)(a.default,{get state(){return k().day},onChange:E})},{value:"week",label:"周",content:(0,e.createComponent)(i.default,{get state(){return k().week},onChange:E})},{value:"month",label:"月",content:(0,e.createComponent)(o.default,{get state(){return k().month},onChange:E})},{value:"year",label:"年",content:(0,e.createComponent)(c.default,{get state(){return k().year},onChange:E})}];return[(()=>{let t=y();return(0,e.insert)(t,()=>(0,n.css)(d.css)),t})(),(()=>{let t=p();return(0,e.addEventListener)(t,"change",N),t.items=W,t._$owner=(0,e.getOwner)(),(0,e.effect)(()=>t.type=d.type),(0,e.effect)(()=>t.value=w()),t})(),(0,e.createComponent)(t.Show,{get when(){return d.showCron},get children(){let t=m();return t.style.setProperty("width","100%"),t.style.setProperty("display","block"),t.style.setProperty("background","var(--component-bg)"),t.style.setProperty("border-radius","var(--border-radius)"),t.style.setProperty("text-align","center"),(0,e.insert)(t,v),t}})]}(0,r.customElement)("n-cron",{value:void 0,defaultValue:"0 0 0 * * ? *",onChange:void 0,type:"line",exclude:[],showCron:!0},(e,n)=>{let r=n.element,a=(0,t.mergeProps)({onChange(e){r.dispatchEvent(new CustomEvent("change",{detail:e}))}},e);return(0,t.createComponent)(v,a)});const b=v;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"default",{enumerable:!0,get:function(){return b}});const e=require("solid-js/web"),t=require("solid-js"),n=require("@moneko/css"),r=require("solid-element"),a=d(require("./day")),u=d(require("./hour")),l=d(require("./minute")),o=d(require("./month")),s=d(require("./second")),i=d(require("./week")),c=d(require("./year"));function d(e){return e&&e.__esModule?e:{default:e}}require("../button"),require("../input-number"),require("../radio"),require("../select"),require("../tabs");const y=(0,e.template)("<style>"),p=(0,e.template)("<n-tabs>",!0,!1),m=(0,e.template)("<code>");function v(r){let[d]=(0,t.splitProps)(r,["value","defaultValue","exclude","onChange","type","showCron","css","class"]),[v,b]=(0,t.createSignal)(d.defaultValue),g=new Date().getFullYear(),f={hms:{start:0,end:1,begin:0,beginEvery:1,some:[0],value:""},mwd:{start:1,end:2,begin:1,beginEvery:1,some:[1],value:""},year:{start:g,end:g+1,begin:g,beginEvery:1,some:[g],value:""}},h=[],C=[];for(let e=1;e<32;e++)h.push({label:e<10?`0${e}`:`${e}`,value:e}),C.push(e);let[w,$]=(0,t.createSignal)("second"),[k,q]=(0,t.createSignal)({second:{type:"*",...f.hms},minute:{type:"*",...f.hms},hour:{type:"*",...f.hms},day:{type:"*",last:1,closeWorkDay:1,...f.mwd},month:{type:"*",...f.mwd},week:{last:1,type:"?",...f.mwd},year:{type:"",...f.year}});function E(e,n){(0,t.batch)(()=>{!function(){let e=(0,t.untrack)(k),n="day"===w();if(n||"week"===w()){let t=n?"week":"day",r="?"===e[t].type&&"?"===e[w()].type?"*":"?";r!==e[t].type&&q(e=>({...e,[t]:{...e[t],type:r}}))}}(),q(t=>{let r={...t[w()],[e]:n};return("start"===e||"end"===e)&&r.end-r.start<=1&&("end"===e?r.start=n-1:r.end=n+1),{...t,[w()]:r}})})}function N(e){$(e.detail[0])}function P(e,t){if(e.value.includes("-")){e.type="period";let t=e.value.split("-");e.start=Number(t[0]),e.end=Number(t[1])}else if(e.value.includes("W"))e.type="closeWorkDay",e.closeWorkDay=Number(e.value.split("W")[0])||1;else if(e.value.includes("L"))e.type="last",e.last=Number(e.value.split("L")[0])||1;else if(e.value.includes(t?"#":"/")){e.type="beginInterval";let n=e.value.split(t?"#":"/");t?(e.begin=Number(n[1]),e.beginEvery=Number(n[0])):(e.begin=Number(n[0]),e.beginEvery=Number(n[1]))}else e.value.includes(",")||/^[0-9]+$/.test(e.value)?(e.type="some",e.some=e.value.split(",").map(Number)):e.type=e.value;return e}function W(e){return"number"!=typeof e||isNaN(e)?e:`${e}`}function D(e,t){switch(e.type){case"period":return`${W(e.start)}-${W(e.end)}`;case"beginInterval":if(t)return`${W(e.beginEvery)}#${W(e.begin)}`;return`${W(e.begin)}/${W(e.beginEvery)}`;case"closeWorkDay":return`${W(e.closeWorkDay||1)}W`;case"last":return t?`${W(e.last)}L`:"L";case"some":return e.some.join(",");default:return e.type}}(0,t.createEffect)(()=>{void 0!==d.value&&(0,t.untrack)(v)!==d.value&&b(d.value)}),(0,t.createEffect)(()=>{let e=v();if(e){let n=e.toUpperCase().split(" ");(0,t.batch)(()=>{q(e=>({second:P({...e.second,value:n[0]||"?"}),minute:P({...e.minute,value:n[1]||"?"}),hour:P({...e.hour,value:n[2]||"?"}),day:P({...e.day,value:n[3]||""}),month:P({...e.month,value:n[4]||""}),week:P({...e.week,value:n[5]||""},!0),year:P({...e.year,value:n[6]||""})}))})}}),(0,t.createEffect)(()=>{let{second:e,minute:t,hour:n,day:a,month:u,week:l,year:o}=k(),s=`${D(e)} ${D(t)} ${D(n)} ${D(a)} ${D(u)} ${D(l,!0)} ${D(o)}`;b(e=>e===s?e:(r.onChange?.(s),s))});let j=[{value:"second",label:"秒",content:(0,e.createComponent)(s.default,{get state(){return k().second},onChange:E})},{value:"minute",label:"分钟",content:(0,e.createComponent)(l.default,{get state(){return k().minute},onChange:E})},{value:"hour",label:"小时",content:(0,e.createComponent)(u.default,{get state(){return k().hour},onChange:E})},{value:"day",label:"日",content:(0,e.createComponent)(a.default,{get state(){return k().day},onChange:E})},{value:"week",label:"周",content:(0,e.createComponent)(i.default,{get state(){return k().week},onChange:E})},{value:"month",label:"月",content:(0,e.createComponent)(o.default,{get state(){return k().month},onChange:E})},{value:"year",label:"年",content:(0,e.createComponent)(c.default,{get state(){return k().year},onChange:E})}];return[(()=>{let t=y();return(0,e.insert)(t,()=>(0,n.css)(d.css)),t})(),(()=>{let t=p();return(0,e.addEventListener)(t,"change",N),t.items=j,t._$owner=(0,e.getOwner)(),(0,e.effect)(()=>t.type=d.type),(0,e.effect)(()=>t.value=w()),t})(),(0,e.createComponent)(t.Show,{get when(){return d.showCron},get children(){let t=m();return t.style.setProperty("width","100%"),t.style.setProperty("display","block"),t.style.setProperty("background","var(--component-bg)"),t.style.setProperty("border-radius","var(--border-radius)"),t.style.setProperty("text-align","center"),(0,e.insert)(t,v),t}})]}(0,r.customElement)("n-cron",{value:void 0,defaultValue:"0 0 0 * * ? *",onChange:void 0,type:"line",exclude:[],showCron:!0},(e,n)=>{let r=n.element,a=(0,t.mergeProps)({onChange(e){r.dispatchEvent(new CustomEvent("change",{detail:e}))}},e);return(0,t.createComponent)(v,a)});const b=v;
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../components/cron/index.tsx"],"sourcesContent":["import {\n Show,\n batch,\n createComponent,\n createEffect,\n createSignal,\n mergeProps,\n splitProps,\n untrack,\n} from 'solid-js';\nimport { css } from '@moneko/css';\nimport { customElement } from 'solid-element';\nimport Day from './day';\nimport Hour from './hour';\nimport Minute from './minute';\nimport Month from './month';\nimport Second from './second';\nimport Week from './week';\nimport Year from './year';\nimport '../button';\nimport '../input-number';\nimport '../radio';\nimport '../select';\nimport '../tabs';\nimport type { BaseOption, CustomElement, TabOption } from '..';\n\nexport interface CronProps {\n /** 自定义类名 */\n class?: string;\n /** 自定义样式表 */\n css?: string;\n /** 隐藏域 */\n exclude?: string[];\n /** 显示表达式\n * @default true\n */\n showCron?: boolean;\n /** 标签页类型\n * @default 'line'\n */\n type?: 'line' | 'card';\n /** 值 */\n value?: string;\n /** 默认值\n * @default 0 0 0 * * ? *\n */\n defaultValue?: string;\n /** 值改变触发a */\n onChange?(val?: string): void;\n}\n\nexport type CronElement = CustomElement<CronProps>;\nexport type SecondType = '*' | 'period' | 'beginInterval' | 'some';\nexport type MinuteType = SecondType;\nexport type HourType = SecondType;\nexport type DayType = SecondType | 'closeWorkDay' | '?' | 'last';\nexport type WeekType = SecondType | 'last' | '?';\nexport type MonthType = SecondType;\nexport type YearType = SecondType | '';\nexport type CronData<T extends string = string> = {\n start: number;\n end: number;\n begin: number;\n beginEvery: number;\n type: T;\n some: number[];\n value: string;\n};\n\nexport type ActiveTab = keyof CronType;\nexport type CronType = {\n second: CronData<SecondType>;\n minute: CronData<MinuteType>;\n hour: CronData<HourType>;\n day: CronData<DayType> & { last: number; closeWorkDay: number };\n week: CronData<WeekType> & { last: number };\n month: CronData<MonthType>;\n year: CronData<YearType>;\n};\n\nfunction Cron(props: CronProps) {\n const [local] = splitProps(props, [\n 'value',\n 'defaultValue',\n 'exclude',\n 'onChange',\n 'type',\n 'showCron',\n 'css',\n 'class',\n ]);\n const [value, setValue] = createSignal(local.defaultValue);\n const date = new Date();\n const fullYear = date.getFullYear();\n const defaultState = {\n hms: {\n start: 0,\n end: 1,\n begin: 0,\n beginEvery: 1,\n some: [0],\n value: '',\n },\n mwd: {\n start: 1,\n end: 2,\n begin: 1,\n beginEvery: 1,\n some: [1],\n value: '',\n },\n year: {\n start: fullYear,\n end: fullYear + 1,\n begin: fullYear,\n beginEvery: 1,\n some: [fullYear],\n value: '',\n },\n };\n const days: BaseOption[] = [];\n const daysBeginEvery: number[] = [];\n\n for (let x = 1; x < 32; x++) {\n days.push({\n label: x < 10 ? `0${x}` : `${x}`,\n value: x,\n });\n daysBeginEvery.push(x);\n }\n const [active, setActive] = createSignal<ActiveTab>('second');\n const [state, setState] = createSignal<CronType>({\n second: { type: '*', ...defaultState.hms },\n minute: { type: '*', ...defaultState.hms },\n hour: { type: '*', ...defaultState.hms },\n day: {\n type: '*',\n last: 1,\n closeWorkDay: 1,\n ...defaultState.mwd,\n },\n month: {\n type: '*',\n ...defaultState.mwd,\n },\n week: {\n last: 1,\n type: '?',\n ...defaultState.mwd,\n },\n year: {\n type: '',\n ...defaultState.year,\n },\n });\n\n function prefixWeekDay() {\n const store = untrack(state);\n const isDay = active() === 'day';\n\n if (isDay || active() === 'week') {\n const key = isDay ? 'week' : 'day';\n const next = store[key].type === '?' && store[active()].type === '?' ? '*' : '?';\n\n if (next !== store[key].type) {\n setState((prev) => {\n return {\n ...prev,\n [key]: {\n ...prev[key],\n type: next,\n },\n };\n });\n }\n }\n }\n\n function onChange<T extends CronType[ActiveTab]>(type: keyof T, val: T[keyof T]) {\n batch(() => {\n prefixWeekDay();\n setState((prev) => {\n const next = {\n ...prev[active()],\n [type]: val,\n };\n\n if (type === 'start' || type === 'end') {\n if (next.end - next.start <= 1) {\n if (type === 'end') {\n next.start = (val as number) - 1;\n } else {\n next.end = (val as number) + 1;\n }\n }\n }\n\n return {\n ...prev,\n [active()]: next,\n };\n });\n });\n }\n function changeActiveKey(e: CustomEvent<[string, TabOption, Event]>) {\n setActive(e.detail[0] as ActiveTab);\n }\n function parseVal<T extends ActiveTab>(item: CronType[T], isWeek?: boolean) {\n if (item.value.indexOf('-') > -1) {\n item.type = 'period';\n const period = item.value.split('-');\n\n item.start = Number(period[0]);\n item.end = Number(period[1]);\n } else if (item.value.indexOf('W') > -1) {\n item.type = 'closeWorkDay';\n (item as CronType['day']).closeWorkDay = Number(item.value.split('W')[0]) || 1;\n } else if (item.value.indexOf('L') > -1) {\n item.type = 'last';\n (item as CronType['day']).last = Number(item.value.split('L')[0]) || 1;\n } else if (item.value.indexOf(isWeek ? '#' : '/') > -1) {\n item.type = 'beginInterval';\n const beginInterval = item.value.split(isWeek ? '#' : '/');\n\n if (isWeek) {\n item.begin = Number(beginInterval[1]);\n item.beginEvery = Number(beginInterval[0]);\n } else {\n item.begin = Number(beginInterval[0]);\n item.beginEvery = Number(beginInterval[1]);\n }\n } else if (item.value.indexOf(',') > -1 || /^[0-9]+$/.test(item.value)) {\n item.type = 'some';\n item.some = item.value.split(',').map(Number);\n } else {\n item.type = item.value as CronType[T]['type'];\n }\n return item;\n }\n\n function nts(num?: string | number) {\n if (typeof num === 'number' && !isNaN(num)) {\n return `${num}`;\n }\n return num;\n }\n\n function fmt<T extends ActiveTab>(item: CronType[T], isWeek?: boolean) {\n switch (item.type) {\n case 'period':\n return `${nts(item.start)}-${nts(item.end)}`;\n case 'beginInterval':\n if (isWeek) return `${nts(item.beginEvery)}#${nts(item.begin)}`;\n return `${nts(item.begin)}/${nts(item.beginEvery)}`;\n case 'closeWorkDay':\n return `${nts(item.closeWorkDay || 1)}W`;\n case 'last':\n return isWeek ? `${nts(item.last)}L` : 'L';\n case 'some':\n return item.some.join(',');\n default:\n return item.type;\n }\n }\n\n createEffect(() => {\n if (local.value !== void 0 && untrack(value) !== local.value) {\n setValue(local.value);\n }\n });\n\n createEffect(() => {\n const val = value();\n\n if (val) {\n const valuesArray = val.toUpperCase().split(' ');\n\n batch(() => {\n setState((prev) => {\n return {\n second: parseVal<'second'>({ ...prev.second, value: valuesArray[0] || '?' }),\n minute: parseVal<'minute'>({ ...prev.minute, value: valuesArray[1] || '?' }),\n hour: parseVal<'hour'>({ ...prev.hour, value: valuesArray[2] || '?' }),\n day: parseVal<'day'>({ ...prev.day, value: valuesArray[3] || '' }),\n month: parseVal<'month'>({ ...prev.month, value: valuesArray[4] || '' }),\n week: parseVal<'week'>({ ...prev.week, value: valuesArray[5] || '' }, true),\n year: parseVal<'year'>({ ...prev.year, value: valuesArray[6] || '' }),\n };\n });\n });\n }\n });\n createEffect(() => {\n const { second, minute, hour, day, month, week, year } = state();\n const next = `${fmt(second)} ${fmt(minute)} ${fmt(hour)} ${fmt(day)} ${fmt(month)} ${fmt(\n week,\n true,\n )} ${fmt(year)}`;\n\n setValue((prev) => {\n if (prev === next) return prev;\n props.onChange?.(next);\n return next;\n });\n });\n\n const items = [\n {\n value: 'second',\n label: '秒',\n content: <Second state={state().second} onChange={onChange} />,\n },\n {\n value: 'minute',\n label: '分钟',\n content: <Minute state={state().minute} onChange={onChange} />,\n },\n {\n value: 'hour',\n label: '小时',\n content: <Hour state={state().hour} onChange={onChange} />,\n },\n {\n value: 'day',\n label: '日',\n content: <Day state={state().day} onChange={onChange} />,\n },\n {\n value: 'week',\n label: '周',\n content: <Week state={state().week} onChange={onChange} />,\n },\n {\n value: 'month',\n label: '月',\n content: <Month state={state().month} onChange={onChange} />,\n },\n {\n value: 'year',\n label: '年',\n content: <Year state={state().year} onChange={onChange} />,\n },\n ];\n\n return (\n <>\n <style>{css(local.css)}</style>\n <n-tabs type={local.type} items={items} value={active()} onChange={changeActiveKey} />\n <Show when={local.showCron}>\n <code\n style={{\n width: '100%',\n display: 'block',\n background: 'var(--component-bg)',\n 'border-radius': 'var(--border-radius)',\n 'text-align': 'center',\n }}\n >\n {value()}\n </code>\n </Show>\n </>\n );\n}\n\ncustomElement<CronProps>(\n 'n-cron',\n {\n value: void 0,\n defaultValue: '0 0 0 * * ? *',\n onChange: void 0,\n type: 'line',\n exclude: [],\n showCron: true,\n } as CronProps,\n (_, opts) => {\n const el = opts.element;\n const props = mergeProps(\n {\n onChange(val?: string) {\n el.dispatchEvent(\n new CustomEvent('change', {\n detail: val,\n }),\n );\n },\n },\n _,\n );\n\n return createComponent(Cron, props);\n },\n);\nexport default Cron;\n"],"names":["Cron","props","local","splitProps","value","setValue","createSignal","defaultValue","fullYear","date","Date","getFullYear","defaultState","hms","start","end","begin","beginEvery","some","mwd","year","days","daysBeginEvery","x","push","label","active","setActive","state","setState","second","type","minute","hour","day","last","closeWorkDay","month","week","onChange","val","batch","prefixWeekDay","store","untrack","isDay","key","next","prev","changeActiveKey","e","detail","parseVal","item","isWeek","indexOf","period","split","Number","beginInterval","test","map","nts","num","isNaN","fmt","join","createEffect","valuesArray","toUpperCase","items","content","Second","Minute","Hour","Day","Week","Month","Year","css","Show","showCron","customElement","exclude","_","opts","el","element","mergeProps","dispatchEvent","CustomEvent","createComponent"],"mappings":"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"}
1
+ {"version":3,"sources":["../../components/cron/index.tsx"],"sourcesContent":["import {\n Show,\n batch,\n createComponent,\n createEffect,\n createSignal,\n mergeProps,\n splitProps,\n untrack,\n} from 'solid-js';\nimport { css } from '@moneko/css';\nimport { customElement } from 'solid-element';\nimport Day from './day';\nimport Hour from './hour';\nimport Minute from './minute';\nimport Month from './month';\nimport Second from './second';\nimport Week from './week';\nimport Year from './year';\nimport '../button';\nimport '../input-number';\nimport '../radio';\nimport '../select';\nimport '../tabs';\nimport type { BaseOption, CustomElement, TabOption } from '..';\n\nexport interface CronProps {\n /** 自定义类名 */\n class?: string;\n /** 自定义样式表 */\n css?: string;\n /** 隐藏域 */\n exclude?: string[];\n /** 显示表达式\n * @default true\n */\n showCron?: boolean;\n /** 标签页类型\n * @default 'line'\n */\n type?: 'line' | 'card';\n /** 值 */\n value?: string;\n /** 默认值\n * @default 0 0 0 * * ? *\n */\n defaultValue?: string;\n /** 值改变触发a */\n onChange?(val?: string): void;\n}\n\nexport type CronElement = CustomElement<CronProps>;\nexport type SecondType = '*' | 'period' | 'beginInterval' | 'some';\nexport type MinuteType = SecondType;\nexport type HourType = SecondType;\nexport type DayType = SecondType | 'closeWorkDay' | '?' | 'last';\nexport type WeekType = SecondType | 'last' | '?';\nexport type MonthType = SecondType;\nexport type YearType = SecondType | '';\nexport type CronData<T extends string = string> = {\n start: number;\n end: number;\n begin: number;\n beginEvery: number;\n type: T;\n some: number[];\n value: string;\n};\n\nexport type ActiveTab = keyof CronType;\nexport type CronType = {\n second: CronData<SecondType>;\n minute: CronData<MinuteType>;\n hour: CronData<HourType>;\n day: CronData<DayType> & { last: number; closeWorkDay: number };\n week: CronData<WeekType> & { last: number };\n month: CronData<MonthType>;\n year: CronData<YearType>;\n};\n\nfunction Cron(props: CronProps) {\n const [local] = splitProps(props, [\n 'value',\n 'defaultValue',\n 'exclude',\n 'onChange',\n 'type',\n 'showCron',\n 'css',\n 'class',\n ]);\n const [value, setValue] = createSignal(local.defaultValue);\n const date = new Date();\n const fullYear = date.getFullYear();\n const defaultState = {\n hms: {\n start: 0,\n end: 1,\n begin: 0,\n beginEvery: 1,\n some: [0],\n value: '',\n },\n mwd: {\n start: 1,\n end: 2,\n begin: 1,\n beginEvery: 1,\n some: [1],\n value: '',\n },\n year: {\n start: fullYear,\n end: fullYear + 1,\n begin: fullYear,\n beginEvery: 1,\n some: [fullYear],\n value: '',\n },\n };\n const days: BaseOption[] = [];\n const daysBeginEvery: number[] = [];\n\n for (let x = 1; x < 32; x++) {\n days.push({\n label: x < 10 ? `0${x}` : `${x}`,\n value: x,\n });\n daysBeginEvery.push(x);\n }\n const [active, setActive] = createSignal<ActiveTab>('second');\n const [state, setState] = createSignal<CronType>({\n second: { type: '*', ...defaultState.hms },\n minute: { type: '*', ...defaultState.hms },\n hour: { type: '*', ...defaultState.hms },\n day: {\n type: '*',\n last: 1,\n closeWorkDay: 1,\n ...defaultState.mwd,\n },\n month: {\n type: '*',\n ...defaultState.mwd,\n },\n week: {\n last: 1,\n type: '?',\n ...defaultState.mwd,\n },\n year: {\n type: '',\n ...defaultState.year,\n },\n });\n\n function prefixWeekDay() {\n const store = untrack(state);\n const isDay = active() === 'day';\n\n if (isDay || active() === 'week') {\n const key = isDay ? 'week' : 'day';\n const next = store[key].type === '?' && store[active()].type === '?' ? '*' : '?';\n\n if (next !== store[key].type) {\n setState((prev) => {\n return {\n ...prev,\n [key]: {\n ...prev[key],\n type: next,\n },\n };\n });\n }\n }\n }\n\n function onChange<T extends CronType[ActiveTab]>(type: keyof T, val: T[keyof T]) {\n batch(() => {\n prefixWeekDay();\n setState((prev) => {\n const next = {\n ...prev[active()],\n [type]: val,\n };\n\n if (type === 'start' || type === 'end') {\n if (next.end - next.start <= 1) {\n if (type === 'end') {\n next.start = (val as number) - 1;\n } else {\n next.end = (val as number) + 1;\n }\n }\n }\n\n return {\n ...prev,\n [active()]: next,\n };\n });\n });\n }\n function changeActiveKey(e: CustomEvent<[string, TabOption, Event]>) {\n setActive(e.detail[0] as ActiveTab);\n }\n function parseVal<T extends ActiveTab>(item: CronType[T], isWeek?: boolean) {\n if (item.value.includes('-')) {\n item.type = 'period';\n const period = item.value.split('-');\n\n item.start = Number(period[0]);\n item.end = Number(period[1]);\n } else if (item.value.includes('W')) {\n item.type = 'closeWorkDay';\n (item as CronType['day']).closeWorkDay = Number(item.value.split('W')[0]) || 1;\n } else if (item.value.includes('L')) {\n item.type = 'last';\n (item as CronType['day']).last = Number(item.value.split('L')[0]) || 1;\n } else if (item.value.includes(isWeek ? '#' : '/')) {\n item.type = 'beginInterval';\n const beginInterval = item.value.split(isWeek ? '#' : '/');\n\n if (isWeek) {\n item.begin = Number(beginInterval[1]);\n item.beginEvery = Number(beginInterval[0]);\n } else {\n item.begin = Number(beginInterval[0]);\n item.beginEvery = Number(beginInterval[1]);\n }\n } else if (item.value.includes(',') || /^[0-9]+$/.test(item.value)) {\n item.type = 'some';\n item.some = item.value.split(',').map(Number);\n } else {\n item.type = item.value as CronType[T]['type'];\n }\n return item;\n }\n\n function nts(num?: string | number) {\n if (typeof num === 'number' && !isNaN(num)) {\n return `${num}`;\n }\n return num;\n }\n\n function fmt<T extends ActiveTab>(item: CronType[T], isWeek?: boolean) {\n switch (item.type) {\n case 'period':\n return `${nts(item.start)}-${nts(item.end)}`;\n case 'beginInterval':\n if (isWeek) return `${nts(item.beginEvery)}#${nts(item.begin)}`;\n return `${nts(item.begin)}/${nts(item.beginEvery)}`;\n case 'closeWorkDay':\n return `${nts(item.closeWorkDay || 1)}W`;\n case 'last':\n return isWeek ? `${nts(item.last)}L` : 'L';\n case 'some':\n return item.some.join(',');\n default:\n return item.type;\n }\n }\n\n createEffect(() => {\n if (local.value !== void 0 && untrack(value) !== local.value) {\n setValue(local.value);\n }\n });\n\n createEffect(() => {\n const val = value();\n\n if (val) {\n const valuesArray = val.toUpperCase().split(' ');\n\n batch(() => {\n setState((prev) => {\n return {\n second: parseVal<'second'>({ ...prev.second, value: valuesArray[0] || '?' }),\n minute: parseVal<'minute'>({ ...prev.minute, value: valuesArray[1] || '?' }),\n hour: parseVal<'hour'>({ ...prev.hour, value: valuesArray[2] || '?' }),\n day: parseVal<'day'>({ ...prev.day, value: valuesArray[3] || '' }),\n month: parseVal<'month'>({ ...prev.month, value: valuesArray[4] || '' }),\n week: parseVal<'week'>({ ...prev.week, value: valuesArray[5] || '' }, true),\n year: parseVal<'year'>({ ...prev.year, value: valuesArray[6] || '' }),\n };\n });\n });\n }\n });\n createEffect(() => {\n const { second, minute, hour, day, month, week, year } = state();\n const next = `${fmt(second)} ${fmt(minute)} ${fmt(hour)} ${fmt(day)} ${fmt(month)} ${fmt(\n week,\n true,\n )} ${fmt(year)}`;\n\n setValue((prev) => {\n if (prev === next) return prev;\n props.onChange?.(next);\n return next;\n });\n });\n\n const items = [\n {\n value: 'second',\n label: '秒',\n content: <Second state={state().second} onChange={onChange} />,\n },\n {\n value: 'minute',\n label: '分钟',\n content: <Minute state={state().minute} onChange={onChange} />,\n },\n {\n value: 'hour',\n label: '小时',\n content: <Hour state={state().hour} onChange={onChange} />,\n },\n {\n value: 'day',\n label: '日',\n content: <Day state={state().day} onChange={onChange} />,\n },\n {\n value: 'week',\n label: '周',\n content: <Week state={state().week} onChange={onChange} />,\n },\n {\n value: 'month',\n label: '月',\n content: <Month state={state().month} onChange={onChange} />,\n },\n {\n value: 'year',\n label: '年',\n content: <Year state={state().year} onChange={onChange} />,\n },\n ];\n\n return (\n <>\n <style>{css(local.css)}</style>\n <n-tabs type={local.type} items={items} value={active()} onChange={changeActiveKey} />\n <Show when={local.showCron}>\n <code\n style={{\n width: '100%',\n display: 'block',\n background: 'var(--component-bg)',\n 'border-radius': 'var(--border-radius)',\n 'text-align': 'center',\n }}\n >\n {value()}\n </code>\n </Show>\n </>\n );\n}\n\ncustomElement<CronProps>(\n 'n-cron',\n {\n value: void 0,\n defaultValue: '0 0 0 * * ? *',\n onChange: void 0,\n type: 'line',\n exclude: [],\n showCron: true,\n } as CronProps,\n (_, opts) => {\n const el = opts.element;\n const props = mergeProps(\n {\n onChange(val?: string) {\n el.dispatchEvent(\n new CustomEvent('change', {\n detail: val,\n }),\n );\n },\n },\n _,\n );\n\n return createComponent(Cron, props);\n },\n);\nexport default Cron;\n"],"names":["Cron","props","local","splitProps","value","setValue","createSignal","defaultValue","fullYear","date","Date","getFullYear","defaultState","hms","start","end","begin","beginEvery","some","mwd","year","days","daysBeginEvery","x","push","label","active","setActive","state","setState","second","type","minute","hour","day","last","closeWorkDay","month","week","onChange","val","batch","prefixWeekDay","store","untrack","isDay","key","next","prev","changeActiveKey","e","detail","parseVal","item","isWeek","includes","period","split","Number","beginInterval","test","map","nts","num","isNaN","fmt","join","createEffect","valuesArray","toUpperCase","items","content","Second","Minute","Hour","Day","Week","Month","Year","css","Show","showCron","customElement","exclude","_","opts","el","element","mergeProps","dispatchEvent","CustomEvent","createComponent"],"mappings":"kGAyYA,+CAAA,+CAhYO,sBACa,yBACU,6BACd,sBACC,uBACE,yBACD,wBACC,yBACF,uBACA,sEACV,qBACA,2BACA,oBACA,qBACA,2GAyDP,SAASA,EAAKC,CAAgB,EAC5B,GAAM,CAACC,EAAM,CAAGC,GAAAA,YAAU,EAACF,EAAO,CAChC,QACA,eACA,UACA,WACA,OACA,WACA,MACA,QACD,EACK,CAACG,EAAOC,EAAS,CAAGC,GAAAA,cAAY,EAACJ,EAAMK,YAAY,EAEnDC,EAAWC,AADJ,IAAIC,OACKC,WAAW,GAC3BC,EAAe,CACnBC,IAAK,CACHC,MAAO,EACPC,IAAK,EACLC,MAAO,EACPC,WAAY,EACZC,KAAM,CAAC,EAAE,CACTd,MAAO,EACT,EACAe,IAAK,CACHL,MAAO,EACPC,IAAK,EACLC,MAAO,EACPC,WAAY,EACZC,KAAM,CAAC,EAAE,CACTd,MAAO,EACT,EACAgB,KAAM,CACJN,MAAON,EACPO,IAAKP,EAAW,EAChBQ,MAAOR,EACPS,WAAY,EACZC,KAAM,CAACV,EAAS,CAChBJ,MAAO,EACT,CACF,EACMiB,EAAqB,EAAE,CACvBC,EAA2B,EAAE,CAEnC,IAAK,IAAIC,EAAI,EAAGA,EAAI,GAAIA,IACtBF,EAAKG,IAAI,CAAC,CACRC,MAAOF,EAAI,GAAK,CAAC,CAAC,EAAEA,EAAE,CAAC,CAAG,CAAC,EAAEA,EAAE,CAAC,CAChCnB,MAAOmB,CACT,GACAD,EAAeE,IAAI,CAACD,GAEtB,GAAM,CAACG,EAAQC,EAAU,CAAGrB,GAAAA,cAAY,EAAY,UAC9C,CAACsB,EAAOC,EAAS,CAAGvB,GAAAA,cAAY,EAAW,CAC/CwB,OAAQ,CAAEC,KAAM,IAAK,GAAGnB,EAAaC,GAAG,AAAC,EACzCmB,OAAQ,CAAED,KAAM,IAAK,GAAGnB,EAAaC,GAAG,AAAC,EACzCoB,KAAM,CAAEF,KAAM,IAAK,GAAGnB,EAAaC,GAAG,AAAC,EACvCqB,IAAK,CACHH,KAAM,IACNI,KAAM,EACNC,aAAc,EACd,GAAGxB,EAAaO,GAAG,AACrB,EACAkB,MAAO,CACLN,KAAM,IACN,GAAGnB,EAAaO,GAAG,AACrB,EACAmB,KAAM,CACJH,KAAM,EACNJ,KAAM,IACN,GAAGnB,EAAaO,GAAG,AACrB,EACAC,KAAM,CACJW,KAAM,GACN,GAAGnB,EAAaQ,IAAI,AACtB,CACF,GAwBA,SAASmB,EAAwCR,CAAa,CAAES,CAAe,EAC7EC,GAAAA,OAAK,EAAC,MACJC,AAxBJ,WACE,IAAMC,EAAQC,GAAAA,SAAO,EAAChB,GAChBiB,EAAQnB,AAAa,QAAbA,IAEd,GAAImB,GAASnB,AAAa,SAAbA,IAAqB,CAChC,IAAMoB,EAAMD,EAAQ,OAAS,MACvBE,EAAOJ,AAAoB,MAApBA,CAAK,CAACG,EAAI,CAACf,IAAI,EAAYY,AAAyB,MAAzBA,CAAK,CAACjB,IAAS,CAACK,IAAI,CAAW,IAAM,IAEzEgB,IAASJ,CAAK,CAACG,EAAI,CAACf,IAAI,EAC1BF,EAAS,AAACmB,GACD,CAAA,CACL,GAAGA,CAAI,CACP,CAACF,EAAI,CAAE,CACL,GAAGE,CAAI,CAACF,EAAI,CACZf,KAAMgB,CACR,CACF,CAAA,EAGN,CACF,IAKIlB,EAAS,AAACmB,IACR,IAAMD,EAAO,CACX,GAAGC,CAAI,CAACtB,IAAS,CACjB,CAACK,EAAK,CAAES,CACV,EAYA,MAVIT,CAAAA,AAAS,UAATA,GAAoBA,AAAS,QAATA,CAAa,GAC/BgB,EAAKhC,GAAG,CAAGgC,EAAKjC,KAAK,EAAI,IACvBiB,AAAS,QAATA,EACFgB,EAAKjC,KAAK,CAAG,AAAC0B,EAAiB,EAE/BO,EAAKhC,GAAG,CAAG,AAACyB,EAAiB,GAK5B,CACL,GAAGQ,CAAI,CACP,CAACtB,IAAS,CAAEqB,CACd,CACF,EACF,EACF,CACA,SAASE,EAAgBC,CAA0C,EACjEvB,EAAUuB,EAAEC,MAAM,CAAC,EAAE,CACvB,CACA,SAASC,EAA8BC,CAAiB,CAAEC,CAAgB,EACxE,GAAID,EAAKjD,KAAK,CAACmD,QAAQ,CAAC,KAAM,CAC5BF,EAAKtB,IAAI,CAAG,SACZ,IAAMyB,EAASH,EAAKjD,KAAK,CAACqD,KAAK,CAAC,IAEhCJ,CAAAA,EAAKvC,KAAK,CAAG4C,OAAOF,CAAM,CAAC,EAAE,EAC7BH,EAAKtC,GAAG,CAAG2C,OAAOF,CAAM,CAAC,EAAE,CAC7B,MAAO,GAAIH,EAAKjD,KAAK,CAACmD,QAAQ,CAAC,KAC7BF,EAAKtB,IAAI,CAAG,eACZ,AAACsB,EAAyBjB,YAAY,CAAGsB,OAAOL,EAAKjD,KAAK,CAACqD,KAAK,CAAC,IAAI,CAAC,EAAE,GAAK,OACxE,GAAIJ,EAAKjD,KAAK,CAACmD,QAAQ,CAAC,KAC7BF,EAAKtB,IAAI,CAAG,OACZ,AAACsB,EAAyBlB,IAAI,CAAGuB,OAAOL,EAAKjD,KAAK,CAACqD,KAAK,CAAC,IAAI,CAAC,EAAE,GAAK,OAChE,GAAIJ,EAAKjD,KAAK,CAACmD,QAAQ,CAACD,EAAS,IAAM,KAAM,CAClDD,EAAKtB,IAAI,CAAG,gBACZ,IAAM4B,EAAgBN,EAAKjD,KAAK,CAACqD,KAAK,CAACH,EAAS,IAAM,KAElDA,GACFD,EAAKrC,KAAK,CAAG0C,OAAOC,CAAa,CAAC,EAAE,EACpCN,EAAKpC,UAAU,CAAGyC,OAAOC,CAAa,CAAC,EAAE,IAEzCN,EAAKrC,KAAK,CAAG0C,OAAOC,CAAa,CAAC,EAAE,EACpCN,EAAKpC,UAAU,CAAGyC,OAAOC,CAAa,CAAC,EAAE,EAE7C,MAAWN,EAAKjD,KAAK,CAACmD,QAAQ,CAAC,MAAQ,WAAWK,IAAI,CAACP,EAAKjD,KAAK,GAC/DiD,EAAKtB,IAAI,CAAG,OACZsB,EAAKnC,IAAI,CAAGmC,EAAKjD,KAAK,CAACqD,KAAK,CAAC,KAAKI,GAAG,CAACH,SAEtCL,EAAKtB,IAAI,CAAGsB,EAAKjD,KAAK,CAExB,OAAOiD,CACT,CAEA,SAASS,EAAIC,CAAqB,QAChC,AAAI,AAAe,UAAf,OAAOA,GAAqBC,MAAMD,GAG/BA,EAFE,CAAC,EAAEA,EAAI,CAAC,AAGnB,CAEA,SAASE,EAAyBZ,CAAiB,CAAEC,CAAgB,EACnE,OAAQD,EAAKtB,IAAI,EACf,IAAK,SACH,MAAO,CAAC,EAAE+B,EAAIT,EAAKvC,KAAK,EAAE,CAAC,EAAEgD,EAAIT,EAAKtC,GAAG,EAAE,CAAC,AAC9C,KAAK,gBACH,GAAIuC,EAAQ,MAAO,CAAC,EAAEQ,EAAIT,EAAKpC,UAAU,EAAE,CAAC,EAAE6C,EAAIT,EAAKrC,KAAK,EAAE,CAAC,CAC/D,MAAO,CAAC,EAAE8C,EAAIT,EAAKrC,KAAK,EAAE,CAAC,EAAE8C,EAAIT,EAAKpC,UAAU,EAAE,CAAC,AACrD,KAAK,eACH,MAAO,CAAC,EAAE6C,EAAIT,EAAKjB,YAAY,EAAI,GAAG,CAAC,CAAC,AAC1C,KAAK,OACH,OAAOkB,EAAS,CAAC,EAAEQ,EAAIT,EAAKlB,IAAI,EAAE,CAAC,CAAC,CAAG,GACzC,KAAK,OACH,OAAOkB,EAAKnC,IAAI,CAACgD,IAAI,CAAC,IACxB,SACE,OAAOb,EAAKtB,IAAI,AACpB,CACF,CAEAoC,GAAAA,cAAY,EAAC,KACS,KAAK,IAArBjE,EAAME,KAAK,EAAewC,GAAAA,SAAO,EAACxC,KAAWF,EAAME,KAAK,EAC1DC,EAASH,EAAME,KAAK,CAExB,GAEA+D,GAAAA,cAAY,EAAC,KACX,IAAM3B,EAAMpC,IAEZ,GAAIoC,EAAK,CACP,IAAM4B,EAAc5B,EAAI6B,WAAW,GAAGZ,KAAK,CAAC,KAE5ChB,GAAAA,OAAK,EAAC,KACJZ,EAAS,AAACmB,GACD,CAAA,CACLlB,OAAQsB,EAAmB,CAAE,GAAGJ,EAAKlB,MAAM,CAAE1B,MAAOgE,CAAW,CAAC,EAAE,EAAI,GAAI,GAC1EpC,OAAQoB,EAAmB,CAAE,GAAGJ,EAAKhB,MAAM,CAAE5B,MAAOgE,CAAW,CAAC,EAAE,EAAI,GAAI,GAC1EnC,KAAMmB,EAAiB,CAAE,GAAGJ,EAAKf,IAAI,CAAE7B,MAAOgE,CAAW,CAAC,EAAE,EAAI,GAAI,GACpElC,IAAKkB,EAAgB,CAAE,GAAGJ,EAAKd,GAAG,CAAE9B,MAAOgE,CAAW,CAAC,EAAE,EAAI,EAAG,GAChE/B,MAAOe,EAAkB,CAAE,GAAGJ,EAAKX,KAAK,CAAEjC,MAAOgE,CAAW,CAAC,EAAE,EAAI,EAAG,GACtE9B,KAAMc,EAAiB,CAAE,GAAGJ,EAAKV,IAAI,CAAElC,MAAOgE,CAAW,CAAC,EAAE,EAAI,EAAG,EAAG,CAAA,GACtEhD,KAAMgC,EAAiB,CAAE,GAAGJ,EAAK5B,IAAI,CAAEhB,MAAOgE,CAAW,CAAC,EAAE,EAAI,EAAG,EACrE,CAAA,EAEJ,EACF,CACF,GACAD,GAAAA,cAAY,EAAC,KACX,GAAM,CAAErC,OAAAA,CAAM,CAAEE,OAAAA,CAAM,CAAEC,KAAAA,CAAI,CAAEC,IAAAA,CAAG,CAAEG,MAAAA,CAAK,CAAEC,KAAAA,CAAI,CAAElB,KAAAA,CAAI,CAAE,CAAGQ,IACnDmB,EAAO,CAAC,EAAEkB,EAAInC,GAAQ,CAAC,EAAEmC,EAAIjC,GAAQ,CAAC,EAAEiC,EAAIhC,GAAM,CAAC,EAAEgC,EAAI/B,GAAK,CAAC,EAAE+B,EAAI5B,GAAO,CAAC,EAAE4B,EACnF3B,EACA,CAAA,GACA,CAAC,EAAE2B,EAAI7C,GAAM,CAAC,CAEhBf,EAAS,AAAC2C,GACR,AAAIA,IAASD,EAAaC,GAC1B/C,EAAMsC,QAAQ,GAAGQ,GACVA,GAEX,GAEA,IAAMuB,EAAQ,CACZ,CACElE,MAAO,SACPqB,MAAO,IACP8C,OAAO,uBAAGC,SAAM,qBAAQ5C,IAAQE,MAAM,WAAYS,GACpD,EACA,CACEnC,MAAO,SACPqB,MAAO,KACP8C,OAAO,uBAAGE,SAAM,qBAAQ7C,IAAQI,MAAM,WAAYO,GACpD,EACA,CACEnC,MAAO,OACPqB,MAAO,KACP8C,OAAO,uBAAGG,SAAI,qBAAQ9C,IAAQK,IAAI,WAAYM,GAChD,EACA,CACEnC,MAAO,MACPqB,MAAO,IACP8C,OAAO,uBAAGI,SAAG,qBAAQ/C,IAAQM,GAAG,WAAYK,GAC9C,EACA,CACEnC,MAAO,OACPqB,MAAO,IACP8C,OAAO,uBAAGK,SAAI,qBAAQhD,IAAQU,IAAI,WAAYC,GAChD,EACA,CACEnC,MAAO,QACPqB,MAAO,IACP8C,OAAO,uBAAGM,SAAK,qBAAQjD,IAAQS,KAAK,WAAYE,GAClD,EACA,CACEnC,MAAO,OACPqB,MAAO,IACP8C,OAAO,uBAAGO,SAAI,qBAAQlD,IAAQR,IAAI,WAAYmB,GAChD,EACD,CAED,gDAEYwC,GAAAA,KAAG,EAAC7E,EAAM6E,GAAG,iEAC8C9B,WAAlCqB,qDAAnBpE,EAAM6B,IAAI,2BAAuBL,iCAC9CsD,MAAI,oBAAO9E,EAAM+E,QAAQ,2RAUrB7E,QAKX,CAEA8E,GAAAA,eAAa,EACX,SACA,CACE9E,MAAO,KAAK,EACZG,aAAc,gBACdgC,SAAU,KAAK,EACfR,KAAM,OACNoD,QAAS,EAAE,CACXF,SAAU,CAAA,CACZ,EACA,CAACG,EAAGC,KACF,IAAMC,EAAKD,EAAKE,OAAO,CACjBtF,EAAQuF,GAAAA,YAAU,EACtB,CACEjD,SAASC,CAAY,EACnB8C,EAAGG,aAAa,CACd,IAAIC,YAAY,SAAU,CACxBvC,OAAQX,CACV,GAEJ,CACF,EACA4C,GAGF,MAAOO,GAAAA,iBAAe,EAAC3F,EAAMC,EAC/B,SAEF,EAAeD"}
@@ -1,3 +1,4 @@
1
+ /// <reference types="typings/typings" />
1
2
  import type { ActiveTab, CronType } from '.';
2
3
  import type { RadioOption } from 'neko-ui';
3
4
  export type CronItemProps<T extends ActiveTab = 'second'> = {
@@ -1,3 +1,4 @@
1
+ /// <reference types="typings/typings" />
1
2
  import type { CronData } from '.';
2
3
  import type { BaseOption } from 'neko-ui';
3
4
  type PeriodProps = {
@@ -1,3 +1,4 @@
1
+ /// <reference types="typings/typings" />
1
2
  import type { CronData } from '.';
2
3
  import type { BaseOption } from 'neko-ui';
3
4
  type SomeProps = {
package/lib/img/style.js CHANGED
@@ -55,8 +55,6 @@
55
55
  block-size: 100%;
56
56
  pointer-events: none;
57
57
  backdrop-filter: blur(50px);
58
- /* stylelint-disable-next-line */
59
- -webkit-backdrop-filter: blur(50px);
60
58
  }
61
59
 
62
60
  &:hover {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../components/img/style.ts"],"sourcesContent":["import { css } from '@moneko/css';\n\nexport const imgCss = css`\n .img {\n max-inline-size: 100%;\n max-block-size: 100%;\n object-fit: contain;\n transition: opacity 0.3s;\n }\n\n .none {\n pointer-events: none;\n opacity: 0.25;\n }\n`;\nexport const style = css`\n .close {\n position: absolute;\n inset-block-start: 0;\n inset-inline-end: 0;\n z-index: 1;\n color: #fff;\n transition: transform var(--transition-duration);\n cursor: pointer;\n transform: scale(0);\n\n &::before {\n padding: 0 16px;\n font-size: 24px;\n content: '⛌';\n line-height: 46px;\n }\n }\n\n .portal {\n position: fixed;\n z-index: 99999;\n display: flex;\n justify-content: center;\n align-items: center;\n\n &::before {\n position: absolute;\n z-index: -1;\n background: var(--img) center/cover no-repeat;\n content: '';\n inline-size: 100%;\n block-size: 100%;\n pointer-events: none;\n opacity: 0.5;\n }\n\n &::after {\n position: absolute;\n z-index: -1;\n content: '';\n inline-size: 100%;\n block-size: 100%;\n pointer-events: none;\n backdrop-filter: blur(50px);\n /* stylelint-disable-next-line */\n -webkit-backdrop-filter: blur(50px);\n }\n\n &:hover {\n .close {\n transform: scale(1);\n }\n }\n }\n\n .open {\n animation: photo-in var(--transition-duration) forwards;\n }\n\n .closeing {\n animation: photo-out var(--transition-duration) forwards;\n }\n\n @keyframes photo-in {\n 0% {\n pointer-events: none;\n }\n\n 100% {\n inline-size: 100vi;\n block-size: 100vb;\n inset-block-start: 0;\n inset-inline-start: 0;\n }\n }\n\n @keyframes photo-out {\n from {\n inline-size: 100vi;\n block-size: 100vb;\n inset-block-start: 0;\n inset-inline-start: 0;\n }\n\n to {\n pointer-events: none;\n }\n }\n`;\n"],"names":["imgCss","style","css"],"mappings":"+JAEaA,MAAM,mBAANA,GAaAC,KAAK,mBAALA,qBAfO,eAEPD,EAASE,GAAAA,KAAG,CAAA,CAAC;;;;;;;;;;;;AAY1B,CAAC,CACYD,EAAQC,GAAAA,KAAG,CAAA,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyFzB,CAAC"}
1
+ {"version":3,"sources":["../../components/img/style.ts"],"sourcesContent":["import { css } from '@moneko/css';\n\nexport const imgCss = css`\n .img {\n max-inline-size: 100%;\n max-block-size: 100%;\n object-fit: contain;\n transition: opacity 0.3s;\n }\n\n .none {\n pointer-events: none;\n opacity: 0.25;\n }\n`;\nexport const style = css`\n .close {\n position: absolute;\n inset-block-start: 0;\n inset-inline-end: 0;\n z-index: 1;\n color: #fff;\n transition: transform var(--transition-duration);\n cursor: pointer;\n transform: scale(0);\n\n &::before {\n padding: 0 16px;\n font-size: 24px;\n content: '⛌';\n line-height: 46px;\n }\n }\n\n .portal {\n position: fixed;\n z-index: 99999;\n display: flex;\n justify-content: center;\n align-items: center;\n\n &::before {\n position: absolute;\n z-index: -1;\n background: var(--img) center/cover no-repeat;\n content: '';\n inline-size: 100%;\n block-size: 100%;\n pointer-events: none;\n opacity: 0.5;\n }\n\n &::after {\n position: absolute;\n z-index: -1;\n content: '';\n inline-size: 100%;\n block-size: 100%;\n pointer-events: none;\n backdrop-filter: blur(50px);\n }\n\n &:hover {\n .close {\n transform: scale(1);\n }\n }\n }\n\n .open {\n animation: photo-in var(--transition-duration) forwards;\n }\n\n .closeing {\n animation: photo-out var(--transition-duration) forwards;\n }\n\n @keyframes photo-in {\n 0% {\n pointer-events: none;\n }\n\n 100% {\n inline-size: 100vi;\n block-size: 100vb;\n inset-block-start: 0;\n inset-inline-start: 0;\n }\n }\n\n @keyframes photo-out {\n from {\n inline-size: 100vi;\n block-size: 100vb;\n inset-block-start: 0;\n inset-inline-start: 0;\n }\n\n to {\n pointer-events: none;\n }\n }\n`;\n"],"names":["imgCss","style","css"],"mappings":"+JAEaA,MAAM,mBAANA,GAaAC,KAAK,mBAALA,qBAfO,eAEPD,EAASE,GAAAA,KAAG,CAAA,CAAC;;;;;;;;;;;;AAY1B,CAAC,CACYD,EAAQC,GAAAA,KAAG,CAAA,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuFzB,CAAC"}