@gzmjs/ui-basic 0.2.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/000-helper/attr.d.ts +61 -0
- package/dist/000-helper/center.d.ts +23 -0
- package/dist/000-helper/corner.d.ts +25 -0
- package/dist/000-helper/element.d.ts +30 -0
- package/dist/000-helper/helper.d.ts +12 -0
- package/dist/000-helper/lang.d.ts +93 -0
- package/dist/000-helper/style.d.ts +27 -0
- package/dist/000-helper/theme.d.ts +7 -0
- package/dist/003-accessory/badge.d.ts +17 -0
- package/dist/003-accessory/close.d.ts +15 -0
- package/dist/003-accessory/icon.d.ts +18 -0
- package/dist/003-accessory/iconCache.d.ts +3 -0
- package/dist/011-dialog/circle.d.ts +24 -0
- package/dist/011-dialog/dialog.d.ts +12 -0
- package/dist/011-dialog/show.d.ts +10 -0
- package/dist/index.d.ts +15 -0
- package/dist/ui-basic.es.js +0 -1
- package/dist/ui-basic.es.js.map +1 -1
- package/package.json +2 -2
- package/dist/ui-basic.d.ts +0 -418
package/dist/ui-basic.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui-basic.es.js","sources":["../src/000-helper/attr.ts","../src/000-helper/center.ts","../src/000-helper/corner.ts","../src/000-helper/element.ts","../src/000-helper/helper.ts","../src/000-helper/lang.ts","../src/000-helper/style.ts","../src/000-helper/theme.ts","../src/003-accessory/badge.ts","../src/003-accessory/close.ts","../src/003-accessory/iconCache.ts","../src/003-accessory/icon.ts","../src/011-dialog/circle.ts","../src/011-dialog/dialog.ts","../src/011-dialog/show.ts"],"sourcesContent":["export function getSnakeCaseName(propName: string): string {\r\n return propName.replace(/([A-Z])/g, (match) => `-${match.toLowerCase()}`);\r\n}\r\n\r\n/**\r\n * 基于:\r\n * 1 - Atribute 属性(A属性)的特性,具体请看 /try/WC/attr.html\r\n * 2 - auto-accessor 装饰器的特性,具体请看 /try/ts/auto-accessor.ts\r\n * \r\n * 对于所有的 auto-accessor 装饰器生成的属性,属性的类型与默认值必须按如下定义:\r\n * 1 - 目前支持三种类型: 整数、布尔 和 字符串。其中字符串是万金油,因为 ts 中经常用字符串来定义联合类型,如 'a' | 'b' 等。\r\n * 2 - 每种数据类型都支持两种方式:\r\n * a - 与 undefined 联合,默认值是 void 0\r\n * b - 不与 undefined 联合,编译器要求必须初始化,那么不要在构造函数中初始化。因为构造函数中调用的是 set() 会导致设置 A 属性,导致 createElement() 异常。\r\n * 3 - 开发组件的时候 P属性 优先使用与 undefined 的联合类型,也就不需要默认值。可以将默认值写在 get() 时,如 this.propName ?? default。\r\n */\r\n\r\n/**\r\n * @strAttr\r\n * accessor propName: V = '';\r\n * 或者\r\n * @strAttr\r\n * accessor propName: V | undefined;\r\n */\r\nexport function strAttr<This extends HTMLElement, V>(_: ClassAccessorDecoratorTarget<This, V>, context: ClassAccessorDecoratorContext<This, V>) {\r\n const propName = String(context.name);\r\n const attrName = getSnakeCaseName(propName);\r\n let initValue: unknown = void 0;\r\n\r\n return {\r\n get(this: This): V {\r\n const ret = this.getAttribute(attrName);\r\n return (ret === null ? initValue : ret) as V;\r\n },\r\n set(this: This, value: V) {\r\n //console.log(propName, 'set', value);\r\n if (value ?? false) {\r\n this.setAttribute(attrName, String(value));\r\n }\r\n else {\r\n this.removeAttribute(attrName);\r\n }\r\n },\r\n init(this: This, value: V): V {\r\n initValue = value;\r\n return value;\r\n }\r\n }\r\n}\r\n\r\ntype BoolOrUndef = boolean | undefined;\r\ntype BoolType = boolean | BoolOrUndef;\r\n\r\n/**\r\n * @boolAttr\r\n * accessor propName: boolean = false;\r\n * 或者\r\n * @boolAttr\r\n * accessor propName: boolean | undefined;\r\n */\r\nexport function boolAttr<This extends HTMLElement, V extends BoolType>(_: ClassAccessorDecoratorTarget<This, V>, context: ClassAccessorDecoratorContext<This, V>) {\r\n const propName = String(context.name);\r\n const attrName = getSnakeCaseName(propName);\r\n let initValue: boolean | undefined = void 0;\r\n\r\n return {\r\n get(this: This): V {\r\n return (this.hasAttribute(attrName) || initValue) as V;\r\n },\r\n set(this: This, value: V) {\r\n //console.log(propName, 'set', value);\r\n if (value) {\r\n this.setAttribute(attrName, '');\r\n }\r\n else {\r\n this.removeAttribute(attrName);\r\n }\r\n },\r\n init(this: This, value: V): V {\r\n initValue = value;\r\n return value;\r\n }\r\n }\r\n}\r\n\r\ntype NumOrUndef = number | undefined;\r\ntype NumType = number | NumOrUndef;\r\n\r\n/**\r\n * @intAttr\r\n * accessor propName: number | undefined;\r\n * 或者\r\n * @intAttr\r\n * accessor propName: number = 12345;\r\n */\r\nexport function intAttr<This extends HTMLElement, V extends NumType>(_: ClassAccessorDecoratorTarget<This, V>, context: ClassAccessorDecoratorContext<This, V>) {\r\n const propName = String(context.name);\r\n const attrName = getSnakeCaseName(propName);\r\n let initValue: number | undefined = void 0;\r\n\r\n return {\r\n get(this: This): V {\r\n const attr = this.getAttribute(attrName);\r\n return (attr === null ? initValue : Number(attr)) as V;\r\n },\r\n set(this: This, value: V) {\r\n if (value !== void 0 && !Number.isNaN(value)) {\r\n this.setAttribute(attrName, Number(value).toString());\r\n }\r\n else {\r\n this.removeAttribute(attrName);\r\n }\r\n },\r\n init(this: This, value: V): V {\r\n initValue = value;\r\n return value;\r\n }\r\n }\r\n}\r\n\r\ntype StrArrayOrUndef = string[] | undefined;\r\ntype StrArrayType = string[] | StrArrayOrUndef;\r\nexport function saAttr<This extends HTMLElement, V extends StrArrayType>(_: ClassAccessorDecoratorTarget<This, V>, context: ClassAccessorDecoratorContext<This, V>) {\r\n const propName = String(context.name);\r\n const attrName = getSnakeCaseName(propName);\r\n let initValue: string[] | undefined = void 0;\r\n\r\n return {\r\n get(this: This): V {\r\n const attr = this.getAttribute(attrName);\r\n return (attr === null ? initValue : attr.split(',')) as V;\r\n },\r\n set(this: This, value: V) {\r\n if (value && value.length > 0) {\r\n this.setAttribute(attrName, value.join(','));\r\n }\r\n else {\r\n this.removeAttribute(attrName);\r\n }\r\n },\r\n init(this: This, value: V): V {\r\n initValue = value;\r\n return value;\r\n }\r\n }\r\n}","export const borders = ['bottom', 'top', 'right', 'left'] as const;//次序是优先级\r\nexport type AttachBorder = typeof borders[number];\r\ntype Space = {\r\n [key in AttachBorder | 'width' | 'height']: number;\r\n}\r\nconst dialogTagName = 'DIALOG';\r\nfunction getContainer($el: Element): HTMLElement {\r\n const root = $el.getRootNode();\r\n if (root instanceof ShadowRoot) {\r\n return getContainer(root.host);\r\n }\r\n return $el.closest(dialogTagName) ?? document.body;\r\n}\r\nexport const attachBorderAttributeName = 'gzm-attach-border';\r\n\r\nexport interface TransitionPopup {\r\n doTransition: boolean;\r\n beforeOpenTransition?: () => void;\r\n afterOpenTransition?: () => void;\r\n};\r\n\r\n/**\r\n * 检查 $ppp 的定位设置,必须是 fixed。\r\n * 虽然 fixed 和 absolute 都允许绝对定位,但是在网页出现滚动栏时,定位算法不同。\r\n * fixed 无需考虑网页滚动栏,但是 absolute 需要。\r\n * 为了简化,这里强制要求 fixed,因为 popover 的使用默认是 fixed。\r\n * @param $ppp \r\n */\r\nfunction checkPopupPosition($ppp: HTMLElement) {\r\n if (!$ppp.getAttribute('popover')) {\r\n $ppp.setAttribute('popover', '');\r\n }\r\n if ($ppp.isConnected) {\r\n const p = getComputedStyle($ppp).position;\r\n if (p !== 'fixed') {\r\n throw new Error('popup 的样式定位必须是 fixed');\r\n }\r\n }\r\n}\r\n\r\nexport class CenterHelper {\r\n constructor($tooltip: HTMLElement & TransitionPopup, $attachTo: HTMLElement, attachBorder: AttachBorder) {\r\n this.$tt = $tooltip; \r\n this.$attachTo = $attachTo;\r\n this.realBorder = this.#attachBorder = attachBorder;\r\n }\r\n $tt: HTMLElement & TransitionPopup;\r\n $attachTo: HTMLElement;\r\n #attachBorder: AttachBorder;\r\n\r\n #space?: Space;\r\n\r\n //最终计算结果\r\n realBorder: AttachBorder;\r\n x = 0;\r\n y = 0;\r\n marginLeft = '';\r\n marginTop = '';\r\n\r\n //$tt 的宽度和高度\r\n ttWidth = 0;\r\n ttHeight = 0;\r\n\r\n pos($tt = this.$tt) {\r\n this.#checkParent();\r\n this.#calcCoordinates();\r\n\r\n $tt.setAttribute(attachBorderAttributeName, this.realBorder);\r\n $tt.style.top = Math.ceil(this.y) + 'px';\r\n $tt.style.left = Math.ceil(this.x) + 'px';\r\n\r\n this.#ani($tt);\r\n }\r\n #ani($tt = this.$tt, rb = this.realBorder) {\r\n if (!$tt.doTransition) return;\r\n if (rb !== 'bottom' && rb !== 'right') return;//因为 $tt 是通过 top/left 定位的。\r\n \r\n const {width, height} = $tt.getBoundingClientRect();\r\n \r\n $tt.style.transitionDuration = '200ms';\r\n $tt.style.transitionProperty = 'width,height';\r\n $tt.beforeOpenTransition?.();\r\n $tt.ontransitionend = () => {\r\n $tt.ontransitionend = null;\r\n $tt.afterOpenTransition?.();\r\n\r\n if (rb === 'bottom') {\r\n $tt.style.height = '';\r\n }\r\n else if (rb === 'right') {\r\n $tt.style.width = '';\r\n }\r\n }\r\n\r\n let s = 0;\r\n if (rb === 'bottom') {\r\n $tt.style.height = '0';\r\n $tt.style.width = width + 'px';\r\n\r\n s = $tt.offsetHeight; //强制要求绘制,这样才会有动画\r\n $tt.style.height = height + 'px';\r\n }\r\n else if (rb === 'right') {\r\n $tt.style.width = '0';\r\n $tt.style.height = height + 'px';\r\n\r\n s = $tt.offsetWidth; //强制要求绘制,这样才会有动画\r\n $tt.style.width = width + 'px';\r\n }\r\n return s;\r\n }\r\n\r\n /**\r\n * 计算 popup 显示的 top/left 以及需要调整箭头位置\r\n */\r\n #calcCoordinates() {\r\n this.#calcSpace();\r\n const border = this.#getRealAttachBorder();\r\n //console.debug('CAFTooltipPosHelper attach border = ' + border);\r\n\r\n if (border === 'top' || border === 'bottom') {\r\n this.#calcBorderY();\r\n this.#calcPointerX();\r\n }\r\n else {\r\n this.#calcBorderX();\r\n this.#calcPointerY();\r\n }\r\n }\r\n\r\n #checkParent($tt = this.$tt, $attachTo = this.$attachTo) {\r\n const $c = getContainer($attachTo);\r\n \r\n if ($tt.isConnected) {\r\n const $pc = getContainer($tt);\r\n if ($pc !== $c) {\r\n $c.append($tt);\r\n }\r\n }\r\n else {\r\n $c.append($tt);\r\n }\r\n checkPopupPosition($tt);\r\n //发现 showPopover 不接收一个参数!?所以无法传入 {source: $attachTo},也就没有办法使用 css anchor positioning 了。\r\n $tt.showPopover();\r\n \r\n //已经显示就读取其宽度\r\n const r = $tt.getBoundingClientRect();\r\n this.ttWidth = r.width;\r\n this.ttHeight = r.height;\r\n }\r\n\r\n #calcSpace($attachTo = this.$attachTo) {\r\n const rect = $attachTo.getBoundingClientRect();\r\n const $dd = document.documentElement;\r\n const r = $dd.getBoundingClientRect();\r\n\r\n //直接利用 rect,其中还记录了 width, height 可以为之后的计算所用!\r\n const s = {\r\n top: rect.top - r.top,\r\n left: rect.left - r.left,\r\n width: rect.width,\r\n height: rect.height,\r\n right: r.right - rect.right - ($dd.offsetWidth - $dd.clientWidth),\r\n bottom: r.bottom - rect.bottom - ($dd.offsetHeight - $dd.clientHeight)\r\n };\r\n this.#space = s;\r\n //console.debug('CAFTooltipPosHelper available space:');\r\n //console.debug(this.#space);\r\n //console.debug(r.right, rect.right, ($dd.offsetWidth - $dd.clientWidth));\r\n }\r\n\r\n /**\r\n * 判断一种停靠方式是否有足够的空间。\r\n * @returns 数字 = 空间 - 占用尺寸后的剩余\r\n */\r\n #calcBorderSpace(border: AttachBorder, space = this.#space!): number {\r\n const sp = space[border];\r\n const sz = (border === 'top' || border === 'bottom') ? this.ttHeight : this.ttWidth;\r\n return sp - sz;\r\n }\r\n\r\n /**\r\n * 判断应该停靠在哪一条边。\r\n * @returns 'top'/'left'/'right'/'bottom' \r\n */\r\n #getRealAttachBorder(): AttachBorder {\r\n let ret = this.#attachBorder; //调用方有设置\r\n if (ret) {\r\n if (this.#calcBorderSpace(ret) >= 0) {\r\n return this.realBorder = ret;\r\n }\r\n }\r\n //依次计算,哪一个 border 停靠后剩余的空间最大\r\n let empty = -99999; //确保下面的循环至少一次满足 if(s>empty),循环结束后 ret 就不会空。\r\n for (const b of borders) {\r\n const s = this.#calcBorderSpace(b);\r\n if (s > empty) {\r\n empty = s;\r\n ret = b;\r\n }\r\n };\r\n return this.realBorder = ret;\r\n }\r\n\r\n /**\r\n * 计算停靠在上下边框时的y\r\n */\r\n #calcBorderY(realBorder = this.realBorder, space = this.#space!) {\r\n let y = space.top; //attachTo 距离 body.top\r\n\r\n y = realBorder === 'top' \r\n ? y - this.ttHeight\r\n : y + space.height; //space.height 是 attachTo 的高度\r\n \r\n this.y = y;\r\n }\r\n /**\r\n * 计算停靠在上下边框时的x。\r\n * 默认是中间对齐,但当宽度太大时,需要调整水平位置。\r\n */\r\n #calcPointerX(space = this.#space!) {\r\n //先计算中间对齐时,左右超过 attachTo 的长度。\r\n const w = (this.ttWidth - space.width) / 2;\r\n const x = space.left - w; //默认中间对齐时的 x\r\n\r\n if (w <= space.left && w <= space.right //左右空间都足够\r\n || w > space.left && w > space.right) { //左右空间都不够,说明已经this宽度已经大于窗口宽度\r\n \r\n //仍然使用默认的中间对齐,无需调整 marginLeft\r\n this.x = x;\r\n this.marginLeft = '';\r\n return;\r\n }\r\n\r\n if (w > space.left) { //左侧空间不够\r\n this.x = 0; //贴着窗口的左边 x + (w - space.left)\r\n this.marginLeft = (space.left - w) + 'px';\r\n return;\r\n }\r\n\r\n //右侧空间不够\r\n const left = (w - space.right);//向左调整的距离\r\n this.x = x - left; //贴着窗口的右边\r\n this.marginLeft = left + 'px';\r\n //console.log(x, w, space.right, this.x);\r\n }\r\n /**\r\n * 计算停靠在左右边框时的x\r\n */\r\n #calcBorderX(realBorder = this.realBorder, space = this.#space!) {\r\n let x = space.left; //attachTo 距离 body.left\r\n\r\n x = realBorder === 'left' \r\n ? x - this.ttWidth\r\n : x + space.width; //space.width 是 attachTo 的宽度\r\n \r\n this.x = x;\r\n }\r\n /**\r\n * 计算停靠在左右边框时的y。\r\n * 默认是中间对齐,但当高度太大时,需要调整垂直位置。\r\n */\r\n #calcPointerY(space = this.#space!) {\r\n //先计算中间对齐时,上下超过 attachTo 的长度。\r\n const h = (this.ttHeight - space.height) / 2;\r\n const y = space.top - h; //默认中间对齐时的 y\r\n\r\n if (h <= space.top && h <= space.bottom //上下空间都足够\r\n || h > space.top && h > space.bottom) { //上下空间都不够,说明已经this高度已经大于窗口高度\r\n \r\n //仍然使用默认的中间对齐,无需调整 marginTop\r\n this.y = y;\r\n this.marginTop = '';\r\n return;\r\n }\r\n\r\n if (h > space.top) { //上侧空间不够\r\n this.y = 0; //贴着窗口的顶边 y + (h - space.top)\r\n this.marginTop = (space.top - h) + 'px';\r\n return;\r\n }\r\n\r\n //下侧空间不够\r\n this.y = y - (h - space.bottom); //贴着窗口的底边\r\n this.marginTop = (h - space.bottom) + 'px';\r\n }\r\n}\r\n","/**\r\n * 因为 tsconfig.json erasableSyntaxOnly 所以不能使用枚举。\r\n * xy\r\n * 00 - 左上角 = 0\r\n * 01 - 左下角 = 1\r\n * 10 - 右上角 = 10\r\n * 11 - 右下角 = 11\r\n */\r\nexport const xy = {\r\n leftTop: 0,\r\n leftBottom: 1,\r\n rightTop: 10,\r\n rightBottom: 11,\r\n} as const;\r\nexport type Corner = typeof xy[keyof typeof xy];\r\nexport function isLeftCorner(c: Corner): boolean {\r\n return c < 10;\r\n}\r\nexport function isTopCorner(c: Corner): boolean {\r\n return c % 10 === 0;\r\n}\r\nexport function makeCorner(isLeft: boolean, isTop: boolean): Corner {\r\n const x = isLeft ? 0 : 10;\r\n const y = isTop ? 0 : 1;\r\n return (x + y) as Corner;\r\n}\r\n\r\ntype CornerPair = {popupCorner: Corner, attachCorner: Corner, height?: number, width?: number};\r\n\r\nconst dialogTagName = 'DIALOG';\r\nfunction getContainer($el: Element): HTMLElement {\r\n const root = $el.getRootNode();\r\n if (root instanceof ShadowRoot) {\r\n return getContainer(root.host);\r\n }\r\n return $el.closest(dialogTagName) ?? document.documentElement;\r\n}\r\n\r\n/**\r\n * 检查 $ppp 的定位设置,必须是 fixed。\r\n * 虽然 fixed 和 absolute 都允许绝对定位,但是在网页出现滚动栏时,定位算法不同。\r\n * fixed 无需考虑网页滚动栏,但是 absolute 需要。\r\n * 为了简化,这里强制要求 fixed,因为 popover 的使用默认是 fixed。\r\n * @param $ppp \r\n */\r\nfunction checkPopupPosition($ppp: HTMLElement) {\r\n if (!$ppp.getAttribute('popover')) {\r\n $ppp.setAttribute('popover', '');\r\n }\r\n if ($ppp.isConnected) {\r\n const p = getComputedStyle($ppp).position;\r\n if (p !== 'fixed') {\r\n throw new Error('popup 的样式定位必须是 fixed');\r\n }\r\n }\r\n}\r\n\r\nexport class CornerHelper {\r\n constructor($popup: HTMLElement, popupCorner: Corner, $attachTo: HTMLElement, attachCorner: Corner) {\r\n this.$popup = $popup;\r\n this.#popupCorner = popupCorner;\r\n this.$attachTo = $attachTo;\r\n this.#attachCorner = attachCorner;\r\n }\r\n readonly $popup: HTMLElement;\r\n readonly $attachTo: HTMLElement;\r\n\r\n #popupCorner: Corner;\r\n #attachCorner: Corner;\r\n \r\n public pos() {\r\n this.#checkParent();\r\n const top = this.#tryGetVerticalCorner();\r\n const left = this.#tryGetHorizontalCorner();\r\n\r\n const $ppp = this.$popup;\r\n if (top !== undefined && left !== undefined) {\r\n //说明水平和垂直方向上都明确了,无需再根据 popupCorner 来计算\r\n $ppp.style.top = top + 'px';\r\n $ppp.style.left = left + 'px';\r\n $ppp.style.right = 'auto';\r\n $ppp.style.bottom = 'auto';\r\n }\r\n else {\r\n const {x,y} = this.#calcAttachPoint();\r\n this.#place(x, y);\r\n\r\n //可能只有一个方向上指定了坐标,先根据 popupCorner 挂靠,然后再设置坐标。\r\n if (top !== undefined) {\r\n $ppp.style.top = top + 'px';\r\n }\r\n else if (left !== undefined) {\r\n $ppp.style.left = left + 'px';\r\n }\r\n }\r\n\r\n $ppp.style.boxShadow = `var(--gzm-corner-shadow-${this.#popupCorner})`;\r\n }\r\n\r\n #checkParent($ppp = this.$popup, $attachTo = this.$attachTo) {\r\n const $c = getContainer($attachTo);\r\n \r\n if ($ppp.isConnected) {\r\n const $pc = getContainer($ppp);\r\n if ($pc !== $c) {\r\n $c.append($ppp);\r\n }\r\n }\r\n else {\r\n $c.append($ppp);\r\n }\r\n checkPopupPosition($ppp);\r\n //发现 showPopover 不接收一个参数!?所以无法传入 {source: $attachTo},也就没有办法使用 css anchor positioning 了。\r\n $ppp.showPopover();\r\n }\r\n\r\n /**\r\n * 计算位置\r\n * @returns\r\n */\r\n #place(x: number, y: number) {\r\n const dde = document.documentElement; //不能使用 window,因为 window.innerWidth = dde.clientWidth + 滚动条宽度。\r\n const $ppp = this.$popup;\r\n switch(this.#popupCorner) {\r\n case 0:\r\n $ppp.style.right = 'auto';\r\n $ppp.style.bottom = 'auto';\r\n\r\n $ppp.style.left = x + 'px';\r\n $ppp.style.top = y + 'px';\r\n break;\r\n case 1:\r\n $ppp.style.right = 'auto';\r\n $ppp.style.top = 'auto';\r\n\r\n $ppp.style.left = x + 'px';\r\n $ppp.style.bottom = (dde.clientHeight - y) + 'px';\r\n break;\r\n case 10:\r\n $ppp.style.left = 'auto';\r\n $ppp.style.bottom = 'auto';\r\n\r\n $ppp.style.right = (dde.clientWidth - x) + 'px';\r\n $ppp.style.top = y + 'px';\r\n break;\r\n case 11:\r\n $ppp.style.left = 'auto';\r\n $ppp.style.top = 'auto';\r\n\r\n $ppp.style.right = (dde.clientWidth - x) + 'px';\r\n $ppp.style.bottom = (dde.clientHeight - y) + 'px';\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * 计算 attach-to 元素上挂靠点的坐标\r\n * @returns \r\n */\r\n #calcAttachPoint(): {x: number, y: number} {\r\n const rect = this.$attachTo.getBoundingClientRect();\r\n\r\n //$attachTo 左上角相对于视口左上角的坐标。\r\n let x = rect.x;\r\n let y = rect.y;\r\n\r\n switch(this.#attachCorner) {\r\n case 1:\r\n y += rect.height;\r\n break;\r\n case 10:\r\n x += rect.width;\r\n break;\r\n case 11:\r\n x += rect.width;\r\n y += rect.height;\r\n break;\r\n }\r\n return {x,y};\r\n }\r\n\r\n /**\r\n * 计算挂靠点,直接覆盖原始的 #popupCorner 和 #attachCorner。\r\n * @returns {top, bottom} 如果不为空,说明无法计算挂高点,那么直接计算 popup 的坐标返回。\r\n */\r\n #tryGetVerticalCorner(): number | undefined {\r\n const dde = document.documentElement;\r\n\r\n //垂直方向,popup 的高度在小于窗口高度的情况下,自动调整挂靠点。\r\n const oh = this.$popup.offsetHeight;\r\n if (oh >= dde.clientHeight) {\r\n //大于窗口高度,放弃治疗\r\n return;\r\n }\r\n\r\n //计算所有的挂靠点,和它们允许的高度。\r\n const corners = this.#calcVertialCornerAndSpace();\r\n \r\n //首先找到当前设置的挂靠点,这种组合是一定存在的,具体请参考 #calcVerticalCorner()\r\n const h = corners.find(c => c.popupCorner === this.#popupCorner && c.attachCorner === this.#attachCorner)!.height!;\r\n if (oh <= h) {\r\n //初始的 attachCorner, popupCorner 就能够提供足够的高度\r\n return;\r\n }\r\n\r\n //$popup 的高度大于 要求的挂靠点,需要在 cs 中寻找一个可用尺寸最大的挂靠点。\r\n const c = corners.sort((a,b) => b.height! - a.height!)[0]!;\r\n if (oh <= c.height!) {\r\n this.#popupCorner = c.popupCorner;\r\n this.#attachCorner = c.attachCorner;\r\n return;\r\n }\r\n\r\n //执行到这里说明:根据挂靠点没有一个有足够的高度,但是popup本身却小于窗口高度,为了能够完整显示直接计算 top/bottom\r\n let ret = 0;\r\n if (c.popupCorner % 10 === 0) {\r\n //$popup 用 top 去挂靠,向上移动一点,让 bottom 露出来\r\n ret = dde.clientHeight - oh;\r\n }\r\n else {\r\n //$popup 用 bottom 挂靠,向下移动一点,让头露出来。\r\n }\r\n return ret;\r\n }\r\n \r\n /**\r\n * 计算 attach-to 元素多个挂靠点和可用垂直空间的关系。\r\n */\r\n #calcVertialCornerAndSpace(): CornerPair[] {\r\n const corners = this.#calcVerticalCorner();\r\n\r\n //开始计算\r\n const rect = this.$attachTo.getBoundingClientRect();\r\n for (const c of corners) {\r\n this.#calcVerticalSpace(c, rect);\r\n }\r\n return corners;\r\n }\r\n\r\n /**\r\n * 在垂直方向上,attach-to 和 $popup 都有 2 个选项 top 和 bottom,组合在一起就是 4 个选项。\r\n * 这里就需要将 4 个组合的可用垂直空间计算出来。\r\n * \r\n * 虽然这里计算的是垂直方向,但是仍然要把水平方向的一个因素考虑进来:\r\n * 当 attach-to 和 $popup 是左侧对齐-挂靠点都在左侧,或者是右侧对齐时,上面4个组合中的2个会导致 attach-to 和 $popup 重叠在一起。\r\n * 即左上角、右上角重叠 和 左下角、右下角重叠。\r\n * 当原来就是重叠的,这里只计算重叠的。如果原来不是重叠的,则不计算重叠的。\r\n * @returns \r\n */\r\n #calcVerticalCorner(): CornerPair[] {\r\n //先把 4 种组合生成,因为 x 是10位数,y 是个位数,这里计算垂直角,所以十位数都不变,只改变个位数。 \r\n // < 10 代表左侧,即左上角和左下角。 > 10 代表右侧,即右上角和右下角。\r\n\r\n const pc = this.#popupCorner;\r\n const cornersOfPopup: Corner[] = pc < 10 ? [0,1]: [10,11];\r\n const ac = this.#attachCorner;\r\n const cornersOfAttach: Corner[] = ac < 10 ? [0,1]: [10,11];\r\n\r\n // 合成 4 种可能性。\r\n let four: CornerPair[] = [];\r\n for (const popupCorner of cornersOfPopup) {\r\n for (const attachCorner of cornersOfAttach) {\r\n four.push({popupCorner, attachCorner});\r\n }\r\n }\r\n\r\n //判断是否同侧,都是左侧或者都是右侧,这种情况下会发生重叠。\r\n if (pc < 10 && ac < 10 || pc >= 10 && ac >= 10) {\r\n //根据原来的设置是否发生重叠来排除无需计算的组合。\r\n if (pc === ac) {\r\n //原来就是重叠的,所以排除不重叠的\r\n four = four.filter(f => f.popupCorner === f.attachCorner);\r\n }\r\n else {\r\n //排除重叠的\r\n four = four.filter(f => f.popupCorner !== f.attachCorner);\r\n }\r\n }\r\n return four;\r\n }\r\n /**\r\n * 计算挂靠点可用垂直空间\r\n */\r\n #calcVerticalSpace(cp: CornerPair, attachToRect: DOMRect): void {\r\n const dde = document.documentElement;\r\n const y = attachToRect.y;\r\n\r\n if (cp.popupCorner % 10 === 0) {\r\n //$popup 用 top 去挂靠\r\n if (cp.attachCorner % 10 === 0) {\r\n //也是 top\r\n cp.height = dde.clientHeight - y;\r\n }\r\n else {\r\n //bottom\r\n cp.height = dde.clientHeight - (y + attachToRect.height);\r\n }\r\n }\r\n else {\r\n //$popup 用 bottom 去挂靠\r\n if (cp.attachCorner % 10 === 0) {\r\n //是 top\r\n cp.height = y;\r\n }\r\n else {\r\n cp.height = y + attachToRect.height;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 注释参考:tryGetVerticalCorner\r\n */\r\n #tryGetHorizontalCorner() {\r\n const dde = document.documentElement;\r\n\r\n //水平方向,popup 的宽度在小于窗口宽度的情况下,自动调整挂靠点。\r\n const ow = this.$popup.offsetWidth;\r\n if (ow >= dde.clientWidth) {\r\n //大于窗口宽度,放弃治疗\r\n return;\r\n }\r\n\r\n //计算所有的挂靠点,和它们允许的高度。\r\n const corners = this.#calcHorizontalCornerAndSpace();\r\n \r\n //首先找到当前设置的挂靠点\r\n const w = corners.find(c => c.popupCorner === this.#popupCorner && c.attachCorner === this.#attachCorner)!.width!;\r\n if (ow <= w) {\r\n //初始的 attachCorner, popupCorner 就能够提供足够的宽度\r\n return;\r\n }\r\n\r\n //$popup 的宽度大于 要求的挂靠点,需要在 cs 中寻找一个可用尺寸最大的挂靠点。\r\n const c = corners.sort((a,b) => b.width! - a.width!)[0]!;\r\n if (ow <= c.width!) {\r\n this.#popupCorner = c.popupCorner;\r\n this.#attachCorner = c.attachCorner;\r\n return;\r\n }\r\n\r\n //执行到这里说明:根据挂靠点没有一个有足够的宽度,但是popup本身却小于窗口宽度,为了能够完整显示直接计算 left/right\r\n let ret = 0;\r\n if (c.popupCorner < 10) {\r\n //$popup 用 left 去挂靠,向左移动一点,让 right 露出来\r\n ret = dde.clientWidth - ow;\r\n }\r\n else {\r\n //$popup 用 right 挂靠,向右移动一点,让头露出来。\r\n }\r\n return ret;\r\n }\r\n\r\n /**\r\n * 注释参考:#calcVertialCornerAndSpace\r\n * @returns \r\n */\r\n #calcHorizontalCornerAndSpace(): CornerPair[] {\r\n const corners = this.#calcHorizontalCorner();\r\n\r\n //开始计算\r\n const rect = this.$attachTo.getBoundingClientRect();\r\n for (const c of corners) {\r\n this.#calcHorizontalSpace(c, rect);\r\n }\r\n return corners;\r\n }\r\n\r\n /**\r\n * 注释参考:#calcVerticalCorner\r\n * @returns\r\n */\r\n #calcHorizontalCorner(): CornerPair[] {\r\n //先把 4 种组合生成,即 attach-popupCorner 和 popupCorner 的个位数都不变,只改变十位数。\r\n // % 10 === 0 代表 top 否则就是 bottom。\r\n\r\n const pc = this.#popupCorner;\r\n const cornersOfPopup: Corner[] = pc % 10 === 0 ? [0,10]: [1,11];\r\n const ac = this.#attachCorner;\r\n const cornersOfAttach: Corner[] = ac % 10 === 0 ? [0,10]: [1,11];\r\n\r\n let four: CornerPair[] = [];\r\n for (const popupCorner of cornersOfPopup) {\r\n for (const attachCorner of cornersOfAttach) {\r\n four.push({popupCorner, attachCorner});\r\n }\r\n }\r\n\r\n //判断是否同侧,都是top或者都是bottom,这种情况下会发生重叠。\r\n if (pc % 10 === ac % 10) {\r\n //根据原来的设置是否发生重叠来排除无需计算的组合。\r\n if (pc === ac) {\r\n //原来就是重叠的,所以排除不重叠的\r\n four = four.filter(f => f.popupCorner === f.attachCorner);\r\n }\r\n else {\r\n //排除重叠的\r\n four = four.filter(f => f.popupCorner !== f.attachCorner);\r\n }\r\n }\r\n return four;\r\n }\r\n\r\n /**\r\n * 注释参考:#calcVerticalSpace\r\n * @param {popupCorner, attachCorner} cs \r\n */\r\n #calcHorizontalSpace(cs: CornerPair, attachToRect: DOMRect) {\r\n const dde = document.documentElement;\r\n const x = attachToRect.x;\r\n\r\n if (cs.popupCorner < 10) {\r\n //$popup 用 left 去挂靠\r\n if (cs.attachCorner < 10) {\r\n //也是 left\r\n cs.width = dde.clientWidth - x;\r\n }\r\n else {\r\n //right\r\n cs.width = dde.clientWidth - (x + attachToRect.width);\r\n }\r\n }\r\n else {\r\n //$popup 用 right 去挂靠\r\n if (cs.attachCorner < 10) {\r\n //是 left\r\n cs.width = x;\r\n }\r\n else {\r\n cs.width = x + attachToRect.width;\r\n }\r\n }\r\n }\r\n}\r\n","type CustomElement = {\r\n tagName: string, \r\n style?: CSSStyleSheet\r\n mutableAttributes?: readonly string[],\r\n\r\n /**\r\n * 必须在 mutableAttributes 不为空时才有效。\r\n * key 是 mutableAttributes 中的一员,value 是组件的属性名称(数组)\r\n */\r\n copyAttributes?: Record<string, string | string[]>\r\n};\r\nexport function defineElement(ele: CustomElement) {\r\n return function(constructor: CustomElementConstructor, ctx: ClassDecoratorContext) {\r\n ctx.addInitializer(function () {\r\n defineCustomElement(constructor, ele);\r\n });\r\n }\r\n}\r\nfunction defineCustomElement(constructor: CustomElementConstructor, ele: CustomElement) {\r\n const tagName = ele.tagName.toLowerCase();\r\n if (customElements.get(tagName)) {\r\n throw new Error(tagName + ' already defined');\r\n }\r\n\r\n if (ele.mutableAttributes) {\r\n observedAttributes(constructor, ele.mutableAttributes, ele.copyAttributes);\r\n }\r\n\r\n customElements.define(tagName, constructor);\r\n\r\n if (ele.style) {\r\n document.adoptedStyleSheets.push(ele.style);\r\n }\r\n}\r\n/**\r\n * observedAttributes 和 attributeChangedCallback 都必须在 customElements.define() 之前就定义好。\r\n * 其中 observedAttributes 在 customElements.define() 中就会被调用。\r\n */\r\nfunction observedAttributes(constructor: CustomElementConstructor, mutableAttributes: readonly string[], copyAttributes?: Record<string, string | string[]>) {\r\n Reflect.set(constructor, 'observedAttributes', mutableAttributes); //static get() 不是必须的!\r\n\r\n if (!constructor.prototype.attributeChangedCallback) {//033-tooltip.ts 中 Tooltip 就有自己的 attributeChangedCallback\r\n constructor.prototype.attributeChangedCallback = attributeChangedCallback;\r\n }\r\n\r\n if (copyAttributes) {\r\n for (const p in copyAttributes) {\r\n if (!mutableAttributes.includes(p)) { \r\n throw new Error(`${constructor.name} 的属性 ${p} 不属于 mutableAttributes。`);\r\n }\r\n }\r\n\r\n //为了在 attributeChangedCallback 中实现属性复制\r\n Reflect.set(constructor, staticCopyAttributesProperty, copyAttributes);\r\n }\r\n}\r\n\r\n// #region 属性复制\r\nconst staticCopyAttributesProperty = 'gzmCopyAttributes';\r\n\r\nfunction getAttributeSetHandlerName(name: string) : string {\r\n return '_' + name.replaceAll('-', '_') + '_set';\r\n}\r\n\r\n/**\r\n * \r\n * @param this - 指向 HTML 元素对象\r\n * @param name \r\n * @param oldValue \r\n * @param newValue \r\n */\r\nfunction attributeChangedCallback(this: HTMLElement, name: string, oldValue: string | null, newValue: string | null): void {\r\n if (staticCopyAttributesProperty in this.constructor) {\r\n const cas = this.constructor[staticCopyAttributesProperty] as Record<string, string | string[]>;\r\n if (cas) {\r\n if (name in cas) {\r\n const ele = cas[name];\r\n if (ele) {\r\n doCopyAttributes.call(this, name, newValue, ele);\r\n }\r\n }\r\n }\r\n }\r\n\r\n const funcName = getAttributeSetHandlerName(name);\r\n const func = Reflect.get(this, funcName);\r\n if (typeof func === 'function') {\r\n func.call(this, newValue, oldValue); //99.9% 情况下只需要 newValue\r\n }\r\n}\r\n\r\n/**\r\n * \r\n * @param this - 指向 HTML 元素对象\r\n * @param attr \r\n * @param ele \r\n */\r\nfunction doCopyAttributes(this: HTMLElement, attr: string, newValue: string | null, ele: string | string[]) {\r\n ele = typeof(ele) === 'string' ? [ele] : ele; \r\n for(const e of ele) {\r\n const $ele = Reflect.get(this, e) as HTMLElement;\r\n if ($ele) {\r\n if (newValue === null) { // === null,说明调用了 removeAttribute\r\n $ele.removeAttribute(attr);\r\n }\r\n else {\r\n $ele.setAttribute(attr, newValue);\r\n }\r\n }\r\n }\r\n}\r\n// #endregion\r\n\r\n//#region 组件定义属性变化函数的时候总是忘记参数的类型是 string | null,而不只是 string\r\n\r\n/**\r\n * 模拟 string.replaceAll() 方法\r\n */\r\ntype ReplaceAll<Str extends string, From extends string, To extends string> = \r\n From extends \"\" ? Str : \r\n Str extends `${infer Prefix}${From}${infer Suffix}` ? `${Prefix}${To}${ReplaceAll<Suffix, From, To>}` : Str;\r\n\r\n/**\r\n * 模拟 getAttributeSetHandlerName(name) 的逻辑\r\n */\r\ntype GetAttributeSetHandlerName<Name extends string> = `_${ReplaceAll<Name, '-', '_'>}_set`;\r\n\r\n/**\r\n * 对于每一个有 mutableAttributes 的组件,都必须实现下面这个类型。\r\n * 其中 T 是 typeof mutableAttributes[number]\r\n * 如果同时也有 copyAttributes,那么需要排除 copyAttributes 中的属性:\r\n * Exclude<typeof mutableAttributes[number], keyof typeof copyAttributes>。\r\n * 050-tree.ts 就是这么做到。\r\n */\r\nexport type AttributeHandlers<T extends string> = {\r\n [K in T as GetAttributeSetHandlerName<K>]: <P extends string>(nv: P | null, ov: P | null) => void;\r\n}\r\n//#endregion","/**\r\n * 防抖\r\n * @param func \r\n * @param wait \r\n * @returns \r\n */\r\nexport function debounce<T extends (...args: unknown[]) => unknown>(func: T, wait: number = 200): (...args: Parameters<T>) => void {\r\n let timeout: number | null = null;\r\n \r\n return function(this: unknown, ...args: Parameters<T>) {\r\n if (timeout) clearTimeout(timeout);\r\n timeout = window.setTimeout(() => {\r\n timeout = null;\r\n func.apply(this, args);\r\n }, wait);\r\n };\r\n}\r\n\r\n/**\r\n * 生成一个随机 ID 字符串,极大概率唯一\r\n * @returns \r\n */\r\nexport function generateId() : string {\r\n //36 进制(用 0-9 + a-z 共 36 个字符表示,是 JavaScript 支持的最大进制)\r\n return Math.random().toString(36).slice(2);\r\n //return crypto.randomUUID();\r\n}","//#region 全局文本\r\nconst zh = {\r\n close: '关闭',\r\n true: '✔️',\r\n false: '❌',\r\n undefined: '未定义',\r\n default: '默认',\r\n valueMissing: '请填写此字段。', //input 验证 required 的默认错误信息。\r\n count: '计数',\r\n min: '最小',\r\n max: '最大',\r\n sum: '合计',\r\n avg: '平均',\r\n hide: '隐藏',\r\n del: '删除',\r\n asc: '升序',\r\n desc: '降序',\r\n ok: '确定',\r\n cancel: '取消',\r\n waiting: '正在处理中,请稍候...',\r\n confirming: '请确认:{0} ?',\r\n completed: '已完成',\r\n error: '错误',\r\n attention: '注意',\r\n noMenuSet: '未设置菜单!?',\r\n readonly: '只读',\r\n} as const; //必须,这样下面的 TextProxy<T> 才能正确标注,T 就是 (typeof zh)。\r\nconst en = {\r\n true: '✔️',\r\n false: '❌',\r\n valueMissing: 'Please fill in this field.', //input 验证 required 的默认错误信息。\r\n del: 'delete',\r\n asc: 'ascending',\r\n desc: 'descending',\r\n waiting: 'Processing, please wait...',\r\n confirming: 'Please confirm: {0} ?',\r\n noMenuSet: 'No menu to display!?',\r\n} as unknown as typeof zh; //必须,否则无法匹配 createText() 的参数类型 Record<string, typeof zh>\r\nexport const globalTexts = {zh, en};\r\n//#endregion\r\n\r\n//#region Proxy\r\n/**\r\n * 如果一个 lang 属性的元素都没有找到,那么就默认是中文。\r\n */\r\nconst defaultLangChain = ['zh'];\r\n\r\ntype LangTexts = {[lang: string]: {[prop: string]: string}};\r\n\r\n//两个数组中的项都是优先级高的在前面\r\ntype ProxyTarget = {\r\n texts: LangTexts[], \r\n\r\n /**\r\n * 下面两个至少要有一个,如果设置了 langs,那么 $ele 就没有用了。\r\n * $ele 用于读取其(以及上级元素)的 lang 属性,因为生成 Proxy 的时候 $ele 可能 isConnected = false,也就是只能使用 <html>.lang。\r\n * 所以当 connectedCallback() 之后,读取一次实际的 lang。\r\n * 不过也只读取一次,也就是说之后 lang 属性被修改了,是不会再次读取的。且 ui 中已经生成的文本也不会改变!\r\n */\r\n langs?: string[],\r\n $ele?: HTMLElement,\r\n};\r\n\r\nconst bindHtmlElement = 'bindHtmlElement';\r\ntype BindableTextProxy = {\r\n [bindHtmlElement]: <P>(this: P, $ele: HTMLElement) => P;\r\n};\r\nfunction getTargetTxt(target: ProxyTarget, property: string, receiver: unknown) \r\n : string //基本的纯文本\r\n | ((...args: unknown[]) => string) //带有参数的合成文本\r\n | BindableTextProxy[typeof bindHtmlElement]\r\n{\r\n if (property === bindHtmlElement) {\r\n return function<P>(this: P, $ele: HTMLElement) {\r\n target.$ele = $ele;\r\n target.langs = void 0;\r\n return receiver as P;\r\n };\r\n }\r\n\r\n let {langs, $ele} = target;\r\n if (!langs) {\r\n if ($ele) {\r\n if ($ele.isConnected) {\r\n $ele = findLangElement($ele);\r\n if ($ele) {\r\n langs = target.langs = createLangArray($ele.lang);\r\n target.$ele = void 0;\r\n }\r\n }\r\n }\r\n }\r\n langs ??= defaultLangChain;\r\n const texts = target.texts;\r\n\r\n for (let i = 0; i < langs.length; i++) {\r\n const lang = langs[i];\r\n if (!lang) {\r\n continue;\r\n }\r\n for (let j = 0; j < texts.length; j++) {\r\n const txt = texts[j];\r\n if (!txt) {\r\n continue;\r\n }\r\n if (lang in txt) {\r\n const langTxts = txt[lang];\r\n if (langTxts && property in langTxts) {\r\n let ret = langTxts[property];\r\n if (ret) {\r\n if (!ret.includes('{0}')) {\r\n return ret;\r\n }\r\n return (...args: unknown[]): string => {\r\n args = args.flat();\r\n for (let i = 0; i < args.length; i++) {\r\n const a = args[i];\r\n const r = \"{\" + i + \"}\";\r\n ret = ret!.replaceAll(r, String(a));\r\n }\r\n return ret!;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return property;\r\n}\r\n//#endregion\r\n\r\n//#region 生成文本\r\ntype IncludesCurlyZero<T extends string> = T extends `${string}{0}${string}` ? (...args: unknown[]) => string : string;\r\ntype TextProxy<T> = {\r\n [K in keyof T]: T[K] extends string ? IncludesCurlyZero<T[K]> : never;\r\n}; //& Record<string, string>;//Record<,> 用于 [] 动态调用属性\r\ntype GlobalTextProxy = TextProxy<typeof zh>;//注意其中 confirming 的类型是函数。\r\ntype JoinedText<T extends Record<string, unknown>[]> = \r\n T extends [Record<string, infer First>, ...infer Rest]\r\n ? TextProxy<First> & JoinedText<Rest extends Record<string, unknown>[] ? Rest : []>\r\n : unknown; \r\n\r\nexport function createText<T extends Record<string, unknown>[]>(this: unknown, ...txts: T): JoinedText<T> & BindableTextProxy {\r\n /**\r\n * 虽然可以通过 .call(this) 传入 this 参数,但是此函数的返回类型是由传入类型决定的。\r\n * 用 .call(this) 会丢失传入参数的类型,因此无法得到希望的返回类型!\r\n */\r\n const target: ProxyTarget = {\r\n texts: txts.filter(t => t).map(t => t as LangTexts),\r\n };\r\n if (document.documentElement.lang) {\r\n //暂时用网页定义的 lang,如果之后调用了 bindHtmlElement() 再修改。\r\n target.langs = createLangArray(document.documentElement.lang);\r\n }\r\n return new Proxy(target, {\r\n get: getTargetTxt\r\n }) as unknown as JoinedText<T> & BindableTextProxy;\r\n}\r\nexport const GT: GlobalTextProxy = createText(globalTexts);\r\n\r\n/**\r\n * 如果 lang='zh-CN',返回 ['zh-CN', 'zh']\r\n * @param {*} lang \r\n * @returns 返回一个数组,定义最明确(-最多的)的放在前面\r\n */\r\nfunction createLangArray(lang: string): string[] {\r\n if (!lang) {\r\n return defaultLangChain;\r\n }\r\n const sa = lang.split('-');\r\n const ret = [lang];\r\n for (let i = sa.length - 1; i > 0; i--) {\r\n const tmp = sa.slice(0, i); //https://devdocs.io/javascript/global_objects/array/slice\r\n ret.push(tmp.join('-'));\r\n }\r\n return ret;\r\n}\r\n\r\n/**\r\n * 查找定义了 lang 的元素,一般网页的 <html> 上定义,所以需要向上追溯。\r\n * 会追溯到 <html>\r\n */\r\nfunction findLangElement($ele: Element): HTMLElement | undefined {\r\n if ($ele instanceof HTMLElement && $ele.lang) return $ele;\r\n\r\n if (!$ele.isConnected) return findLangElement(document.body);\r\n\r\n const $p = $ele.closest('*[lang]');\r\n if ($p instanceof HTMLElement && $p.lang) {\r\n return $p;\r\n } \r\n \r\n const sr = $ele.getRootNode();\r\n if (sr instanceof ShadowRoot) {\r\n return findLangElement(sr.host);\r\n }\r\n \r\n return void 0;\r\n}\r\n//#endregion","export type Rules = {[prop: string]: string }\r\nexport type Style = {[selector: string]: Rules | string }\r\n\r\n//todo: 以后尝试: https://styled-components.com/docs\r\n\r\nexport function createStyleSheet(style: Style): CSSStyleSheet {\r\n const sheet = new CSSStyleSheet();\r\n for (const selector in style) {\r\n const rules = style[selector];\r\n if (typeof rules === 'string') {\r\n //rules 本身不要 {},以方便两套 rules 合并在一起。\r\n sheet.insertRule(`${selector} { ${rules} }`);\r\n }\r\n else if (rules) {\r\n const ruleStr = formatRules(rules);\r\n sheet.insertRule(`${selector} { ${ruleStr} }`);\r\n }\r\n }\r\n return sheet;\r\n}\r\nfunction formatRules(rules: Rules): string {\r\n let ruleStr = '';\r\n for (const prop in rules) {\r\n ruleStr += `${prop}: ${rules[prop]}; `;\r\n }\r\n return ruleStr;\r\n}\r\nexport function getElementRules(tagName: string, ...ruleNames: string[]): Rules {\r\n const $ele = document.createElement(tagName);\r\n document.body.append($ele);\r\n const cs = getComputedStyle($ele);\r\n\r\n const ret: Rules = {};\r\n ruleNames.forEach(x => {\r\n if (x in cs) {\r\n ret[x] = Reflect.get(cs, x);\r\n }\r\n });\r\n\r\n $ele.remove();\r\n return ret;\r\n}\r\n\r\n/* <button> <input> 有 disabled 属性,能够匹配 :disabled 伪类选择器,\r\n但是自定义元素 <gzm-btn-click> 即使添加了 disabled 属性,仍然无法匹配 :disabled 伪类选择器。\r\n所以这里使用 [disabled],而不是 :disabled。\r\n另外 display:contents 元素添加 disabled 属性后,样式效果不明显,所以加上 >* 让其子元素也变灰并禁止点击。\r\n*/\r\nconst disabledStyle = {\r\n '[disabled], [disabled]>*': `\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n pointer-events: none;\r\n user-select: none;\r\n `\r\n};\r\n\r\n/**\r\n * 主要是字体的设置,应该作为网页 reset 的一部分。\r\n * 不设置 :host 的字体,具体请看 style-font.md\r\n * 因为此项目开发的是组件,所以用不到。\r\n * \r\n * 以下内容是通过 tailwind.css 获得,具体方法;\r\n * 访问:/try/tailwind/test.html,在浏览器开发工具的源代码选中 /src/style.css\r\n *//*\r\nconst reset = {\r\n html: `\r\n tab-size: 4;\r\n line-height: 1.5;\r\n -webkit-text-size-adjust: 100%;\r\n -webkit-tap-highlight-color: transparent;\r\n font-family: var(--default-font-family, ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\");\r\n font-feature-settings: var(--default-font-feature-settings, normal);\r\n font-variation-settings: var(--default-font-variation-settings, normal);\r\n `,\r\n 'button, input, select, optgroup, textarea, ::file-selector-button': `\r\n font: inherit;\r\n font-feature-settings: inherit;\r\n font-variation-settings: inherit;\r\n letter-spacing: inherit;\r\n color: inherit;\r\n border-radius: 0;\r\n background-color: transparent;\r\n opacity: 1;\r\n `\r\n};*/\r\n\r\n/**\r\n * 从 dist/assets/index.css 中提取的样式。\r\n * 找到其中的 @layer base,然后开始做减法。\r\n * 1 - 去掉不用的伪类,如 ::file-selector-button, ::-webkit-*。\r\n * 2 - 去掉具体的 tag 定义,如 hr, h1-6, button, 因为多半用不到。\r\n */\r\nexport const baseStyle = createStyleSheet({\r\n '*, :after, :before, ::backdrop': `\r\n box-sizing: border-box;\r\n border: 0 solid;\r\n margin: 0;\r\n padding: 0;\r\n `,\r\n \r\n //因其语义价值成为强调内容的优先选择\r\n strong: `\r\n font-weight: bolder;\r\n `,\r\n\r\n //适用于语义化标注次要内容。默认字体大小为16px,75%=12px,也是能够正常显示的最小字体。\r\n small: `\r\n font-size: 75%;\r\n `,\r\n \r\n '[hidden]:where(:not([hidden=\"until-found\"]))': `\r\n display: none !important;\r\n `,\r\n\r\n //这个不属于 base,但我认为有用\r\n ...disabledStyle,\r\n});\r\n\r\nexport const gzmHeader = `\r\n background: var(--gzm-header-background);\r\n border: var(--gzm-header-border);\r\n color: var(--gzm-header-txt-color);\r\n`;\r\nexport const gzmFrame = `\r\n background: var(--gzm-content-background);\r\n color: var(--gzm-content-txt-color);\r\n border-radius: 0.5rem;\r\n border: var(--gzm-btn-border);\r\n padding: 0.5rem;\r\n`;\r\nexport const utilityStyle = createStyleSheet({\r\n '.gzm-frame': gzmFrame,\r\n '.gzm-header': gzmHeader,\r\n\r\n //txt-btn\r\n '.gzm-txt-btn': {\r\n cursor: 'pointer',\r\n 'font-weight': 'bolder',\r\n 'border-radius': '0.25rem',\r\n 'padding-inline': '0.25rem',\r\n 'white-space': 'nowrap',\r\n background:'transparent',\r\n color: 'inherit',\r\n 'font-size': 'inherit',\r\n 'outline-offset': '-1px',//当按钮所在父元素的padding不够,导致outline无法全部显示出来。\r\n },\r\n '.gzm-txt-btn:hover': {\r\n color:'var(--gzm-h-btn-txt-color)',\r\n outline:'var(--gzm-h-btn-border)',\r\n background:'var(--gzm-h-btn-background)',\r\n },\r\n '.gzm-txt-btn:active': {\r\n color:'var(--gzm-a-btn-txt-color) !important',\r\n outline:'var(--gzm-a-btn-border) !important',\r\n background:'var(--gzm-a-btn-background) !important',\r\n },\r\n\r\n //直接在 document 中使用 gzm-btn-*,且 disabled = true 时,靠这个生效\r\n ...disabledStyle,\r\n});\r\n//对于 SPA 而言,总有一个 root 组件,这个 root 组件替代了网页,utility 需要添加到 root 组件中去。\r\n//document.adoptedStyleSheets.push(utility);\r\n\r\nexport function createTxtBtn(txt: string) {\r\n const $btn = document.createElement('button');\r\n $btn.type = 'button';\r\n $btn.className = 'gzm-txt-btn';\r\n $btn.textContent = txt;\r\n return $btn;\r\n}\r\nexport function isTxtBtn($btn: HTMLElement): boolean {\r\n return $btn.classList.contains('gzm-txt-btn');\r\n}","import * as CSS from './style';\r\n\r\nconst defaultTheme: CSS.Style = {\r\n ':root': `\r\n --gzm-border-color: rgb(197,197,197);\r\n\r\n --gzm-btn-background: rgb(246,246,246);\r\n --gzm-btn-border: 1px solid var(--gzm-border-color);\r\n --gzm-btn-txt-color: rgb(69,69,69);\r\n\r\n --gzm-h-btn-background: rgb(237,237,237);\r\n --gzm-h-btn-border: 1px solid rgb(204,204,204);\r\n --gzm-h-btn-txt-color: rgb(43,43,43);\r\n\r\n --gzm-a-btn-background: rgb(0,127,255);\r\n --gzm-a-btn-border: 1px solid rgb(0,62,255);\r\n --gzm-a-btn-txt-color: rgb(255,255,255);\r\n\r\n --gzm-header-background: rgb(233,233,233);\r\n --gzm-header-border: 1px solid rgb(221,221,221);\r\n --gzm-header-txt-color: rgb(51,51,51);\r\n\r\n --gzm-background-color: rgb(255,255,255);\r\n\r\n --gzm-content-background: var(--gzm-background-color);\r\n --gzm-content-txt-color: rgb(51,51,51);\r\n\r\n --gzm-error-txt-color: #d34d17;\r\n\r\n --gzm-badge-background: rgb(253,223,223);\r\n --gzm-badge-txt-color: rgb(95,63,63);\r\n \r\n --gzm-shadow-color: rgb(102,102,102);\r\n\r\n --gzm-corner-shadow-11:-7px -7px 7px var(--gzm-shadow-color);\r\n --gzm-corner-shadow-0:7px 7px 7px var(--gzm-shadow-color);\r\n --gzm-corner-shadow-10:-7px 7px 7px var(--gzm-shadow-color);\r\n --gzm-corner-shadow-1:7px -7px 7px var(--gzm-shadow-color);\r\n\r\n --gzm-shadow-top: drop-shadow(0px -2px 4px var(--gzm-shadow-color));\r\n --gzm-shadow-left: drop-shadow(-2px 0px 4px var(--gzm-shadow-color));\r\n --gzm-shadow-right: drop-shadow(2px 0px 4px var(--gzm-shadow-color));\r\n --gzm-shadow-bottom: drop-shadow(0px 2px 4px var(--gzm-shadow-color));\r\n\r\n --gzm-switch-background: #999;\r\n --gzm-switch-check-background: #67c93d;\r\n `,\r\n ':root dialog::backdrop': `\r\n background: rgb(170,170,170);\r\n opacity: 0.8;\r\n `\r\n};\r\ndocument.adoptedStyleSheets.push(CSS.createStyleSheet(defaultTheme));\r\n\r\nconst themeLocalStorageKey = 'gzm-ui-basic-theme';\r\nexport const htmlThemeAttr = 'gzm-theme'; //<html> 中控制主题的属性\r\n\r\nexport const allThemes: {readonly name:string, readonly label:string}[] = [];\r\n\r\nexport function getCurrentTheme(): string {\r\n return localStorage.getItem(themeLocalStorageKey) ?? '';\r\n /* 其他主题总是在此模块之后装载,而 getCurrentTheme() 在此模块就会被调用,所以不要检查。\r\n if (ret) {\r\n if (allThemes.some(theme => theme.name === ret)) {\r\n return ret;\r\n }\r\n }\r\n return '';*/\r\n}\r\nexport function setCurrentTheme(themeName: string): boolean { \r\n if (themeName && !allThemes.some(theme => theme.name === themeName)) {\r\n return false;\r\n }\r\n localStorage.setItem(themeLocalStorageKey, themeName);\r\n document.documentElement.setAttribute(htmlThemeAttr, themeName);\r\n return true;\r\n}\r\n\r\n//网页加载时执行\r\nconst ct = getCurrentTheme();\r\nif (ct) {\r\n //网页中可能写了 <html gzm-theme=\"xxx\"></html>,所以不要用默认的主题来覆盖网页中的设置。\r\n document.documentElement.setAttribute(htmlThemeAttr, ct);\r\n}\r\n\r\n//一个console网页设置了主题,其他console网页也会跟着变化\r\nwindow.addEventListener('storage', (event: StorageEvent) => {\r\n if (event.key === themeLocalStorageKey && event.newValue) {\r\n document.documentElement.setAttribute(htmlThemeAttr, event.newValue);\r\n }\r\n});","import * as ELE from '../000-helper/element';\r\nimport * as CSS from '../000-helper/style';\r\nimport * as ATR from '../000-helper/attr';\r\n\r\nexport const tagName = 'GZM-BADGE';\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [tagName]: Badge;\r\n }\r\n}\r\n\r\nconst styleSheet = CSS.createStyleSheet({\r\n ':host': `\r\n height: 1rem;\r\n border-radius: 50%;\r\n padding: 0 0.25rem !important;\r\n\r\n color: var(--gzm-badge-txt-color);\r\n background: var(--gzm-badge-background);\r\n\r\n line-height: 1rem;\r\n\r\n font-family: PingFang SC, Microsoft YaHei, Hiragino Sans GB, Heiti SC, sans-serif;\r\n font-size: 0.75rem;\r\n font-weight: bolder;\r\n `,\r\n});\r\nconst cornerStyleSheet = CSS.createStyleSheet({\r\n ':host': `\r\n transform: translate(33%, -33%);\r\n position: absolute;\r\n top: 0px;\r\n right: 0px;\r\n z-index: 1;\r\n `\r\n});\r\nconst mutableAttributes = ['badge', 'corner'] as const;\r\n\r\n@ELE.defineElement({tagName, mutableAttributes})\r\nexport class Badge extends HTMLElement implements ELE.AttributeHandlers<typeof mutableAttributes[number]> {\r\n constructor() {\r\n super();\r\n const sr = this.attachShadow({mode: 'open'});\r\n sr.adoptedStyleSheets = [CSS.baseStyle, styleSheet];\r\n }\r\n declare readonly shadowRoot: ShadowRoot;\r\n\r\n _badge_set(badge: string | null): void {\r\n this.shadowRoot.innerHTML = badge ?? '';\r\n }\r\n _corner_set(): void {\r\n this.shadowRoot.adoptedStyleSheets = this.corner ? [CSS.baseStyle, styleSheet, cornerStyleSheet] : [CSS.baseStyle, styleSheet];\r\n }\r\n\r\n @ATR.strAttr\r\n accessor badge: string | undefined;\r\n\r\n @ATR.boolAttr\r\n accessor corner: boolean | undefined;\r\n}","import * as ELE from '../000-helper/element';\r\nimport * as CSS from '../000-helper/style';\r\nimport * as ATR from '../000-helper/attr';\r\n\r\nexport const tagName = 'GZM-CLOSE-BTN';\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [tagName]: CloseBtn;\r\n }\r\n}\r\n\r\nconst styleSheet = CSS.createStyleSheet({\r\n ':host': `\r\n font-family: ui-sans-serif, system-ui, sans-serif;\r\n font-size: 0.75rem;\r\n font-weight: bold;\r\n line-height: 1rem;\r\n display: inline-block;\r\n `,\r\n div: `\r\n border-radius: 9999px;\r\n padding-inline: 0.25rem;\r\n padding-block: 0px;\r\n `, \r\n [`div:hover`]: {\r\n color: 'var(--gzm-badge-txt-color)',\r\n background: 'var(--gzm-badge-background)',\r\n cursor: 'pointer',\r\n },\r\n});\r\nconst cornerStyleSheet = CSS.createStyleSheet({\r\n ':host': `\r\n position: absolute;\r\n right: 0px;\r\n top: 0px;\r\n `\r\n});\r\n\r\nconst mutableAttributes = ['corner'] as const;\r\n\r\n@ELE.defineElement({tagName, mutableAttributes})\r\nexport class CloseBtn extends HTMLElement implements ELE.AttributeHandlers<typeof mutableAttributes[number]> {\r\n constructor() {\r\n super();\r\n const root = this.attachShadow({mode: 'open'});\r\n root.adoptedStyleSheets = [CSS.baseStyle, styleSheet];\r\n root.innerHTML = '<div>\\u2573</div>';\r\n }\r\n declare readonly shadowRoot: ShadowRoot;\r\n\r\n // #region 属性\r\n _corner_set(): void {\r\n this.shadowRoot.adoptedStyleSheets = this.corner ? [CSS.baseStyle, styleSheet, cornerStyleSheet] : [CSS.baseStyle, styleSheet];\r\n }\r\n \r\n @ATR.boolAttr\r\n accessor corner: boolean | undefined;\r\n // #endregion\r\n}","/*\r\n 这个 icon 的功能有 2 个:\r\n 1 - 识别图片的格式,并自动显示:unicode 字符、各种图片、SVG 图片。\r\n 其中图片和 SVG 图片又分为 url 路径和 data/image 两种情况。\r\n 2 - 自动适应文字的高度\r\n 例如:如果文字是 16px 高,那么 icon 也会是 16px 高。\r\n 如果文字是 20px 高,那么 icon 也会是 20px 高。\r\n*/\r\n\r\nexport const iconCache: {[key: string]: string | HTMLImageElement /*| SVGSymbolElement*/} = {\r\n};\r\n","import * as ELE from '../000-helper/element';\r\nimport * as ATR from '../000-helper/attr';\r\nimport * as CSS from '../000-helper/style';\r\nimport { iconCache } from './iconCache';\r\n\r\nconst style = CSS.createStyleSheet({\r\n //防止网页中没有定义这些字体。如'⚙'在没有 Emoji 字体加持的情况下,显示非常难看。\r\n //默认不要 inline-block,选中一行包含 icon 的文字时,可以看出明显区别。\r\n ':host': `\r\n /*display: inline-block;*/\r\n font-family: \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\r\n `,\r\n //height - 相对于父元素的字体高度,这是关键!\r\n 'img, svg' : `\r\n width: 1em;\r\n height: 1em;\r\n vertical-align: middle;\r\n color: inherit;\r\n `,\r\n});\r\n\r\nexport const tagName = 'GZM-ICON';\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [tagName]: Icon;\r\n }\r\n}\r\nconst mutableAttributes = ['icon'] as const;\r\n@ELE.defineElement({tagName, mutableAttributes})\r\nexport class Icon extends HTMLElement implements ELE.AttributeHandlers<typeof mutableAttributes[number]> {\r\n constructor() {\r\n super();\r\n const sr = this.attachShadow({ mode: 'open' });\r\n //CSS.base 中定义了 Emoji 字体,对于显示 Unicode 如 '⚙' 非常重要!\r\n sr.adoptedStyleSheets = [CSS.baseStyle, style];\r\n }\r\n declare readonly shadowRoot: ShadowRoot;\r\n\r\n #showStr(icon: string): boolean {\r\n return this.setSvg(icon) || this.setImg(icon);\r\n }\r\n public setImg(icon: string): boolean {\r\n if (icon.startsWith('data:image/') //svg 也可以用这种方式\r\n || (icon.includes('.') && icon.includes('/'))) {//用 URL 类来识别路径会将 unicode 字符也当成路径\r\n this.shadowRoot.innerHTML = `<img src=\"${icon}\" alt=\"icon\">`;\r\n return true;\r\n }\r\n return false;\r\n }\r\n public setSvg(icon: string): boolean {\r\n if (icon.startsWith('<svg ')) {\r\n this.shadowRoot.innerHTML = icon;\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n #showCache(p: string): boolean {\r\n const cache = iconCache[p];\r\n if (!cache) return false;\r\n\r\n if (typeof(cache) === 'string') {\r\n return this.#showStr(cache);\r\n }\r\n\r\n if (cache instanceof HTMLImageElement) {\r\n return this.setImg(cache.src);\r\n }\r\n\r\n return false;\r\n }\r\n\r\n #showUnicode(icon: string): void {\r\n this.shadowRoot.textContent = icon;\r\n }\r\n\r\n // #region 属性\r\n _icon_set(icon: string | null): void {\r\n if (icon) {\r\n void (this.#showStr(icon) || this.#showCache(icon) || this.#showUnicode(icon));\r\n }\r\n else {\r\n this.shadowRoot.innerHTML = '';\r\n }\r\n }\r\n\r\n @ATR.strAttr\r\n accessor icon: string | undefined;\r\n // #endregion\r\n}","import * as ATR from '../000-helper/attr';\r\nimport * as ELE from '../000-helper/element';\r\n\r\n//以下都是基于 viewBox=\"0 0 400 400\" 的坐标系计算的。\r\nconst svg = `\r\n<svg width=\"100%\" height=\"100%\" viewBox=\"0 0 400 400\">\r\n <circle fill=\"none\" stroke=\"#68e534\" stroke-width=\"20\" cy=\"200\" cx=\"200\" r=\"190\" stroke-linecap=\"round\" transform=\"rotate(-90 200 200)\"></circle>\r\n <polyline fill=\"none\" stroke=\"#68e534\" stroke-width=\"24\" points=\"88,214 173,284 304,138\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</svg>\r\n`;\r\nconst circleLength = 1194; //圆的周长\r\nconst polylineLength = 350; //线段的长度\r\nexport const tagName = 'GZM-CHECK-CIRCLE';\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [tagName]: CheckCircle;\r\n }\r\n}\r\nconst mutableAttributes = ['size'] as const;\r\n/**\r\n * https://www.bilibili.com/video/BV17w4m1D7xi\r\n * https://devdocs.io/svg/attribute/stroke-dasharray\r\n * https://devdocs.io/svg/attribute/stroke-dashoffset\r\n */\r\n@ELE.defineElement({tagName, mutableAttributes})\r\nexport class CheckCircle extends HTMLElement implements ELE.AttributeHandlers<typeof mutableAttributes[number]> {\r\n connectedCallback() {\r\n this.#notInline();\r\n \r\n this.innerHTML = svg;\r\n this.$circle = this.querySelector('circle')!;\r\n this.$polyline = this.querySelector('polyline')!;\r\n this.#init();\r\n }\r\n\r\n $circle?: SVGCircleElement;\r\n $polyline?: SVGPolylineElement;\r\n\r\n /**\r\n * svg 是 block 元素,如果父元素 this 不是 block 元素,那么 svg 设置的 width 和 height = 100% 就无效。\r\n */\r\n #notInline() {\r\n const computedStyle = window.getComputedStyle(this);\r\n if (computedStyle.display === 'inline') {\r\n this.style.display = 'inline-block';\r\n }\r\n }\r\n\r\n #init() {\r\n const $c = this.$circle!;\r\n $c.style.strokeDasharray = circleLength.toString(); //圆的周长\r\n $c.style.strokeDashoffset = circleLength.toString(); //1194-看到的是gap(空白),0看到的是线段(线段的长度strokeDasharray等于周长,所以就是一整个圆)\r\n $c.style.transitionProperty = 'stroke-dashoffset';\r\n\r\n const $p = this.$polyline!;\r\n $p.style.strokeDasharray = polylineLength.toString(); //线段的长度\r\n $p.style.strokeDashoffset = polylineLength.toString(); //0看到的是线段,350看到的是gap(空白)\r\n $p.style.transitionProperty = 'stroke-dashoffset';\r\n }\r\n\r\n play() {\r\n const d = 3000; //动画持续时间,默认 3 秒钟。\r\n let dur = this.duration ?? d;\r\n if (dur <= 0) {\r\n dur = d;\r\n }\r\n const durCircle = Math.floor(dur / (circleLength + polylineLength) * circleLength);\r\n const durPolyline = dur - durCircle;\r\n\r\n const $c = this.$circle!;\r\n $c.style.transitionDuration = `${durCircle}ms`;\r\n const $p = this.$polyline!;\r\n $p.style.transitionDuration = `${durPolyline}ms`;\r\n\r\n return new Promise(resolve => {\r\n /**\r\n * 注意:下面这一段代码有些奇怪,需要额外解释一下:\r\n * 在015-dialog.mjs 中,showWaiting() 返回的 complete() 方法中,生成了 check-circle,然后调用 play() 方法。\r\n * 如果没有下面这行代码,那么 check-circle 会显示一个绿色的圈,但是没有动画效果,且 polyline 也不会显示。\r\n * 猜测是因为之前设置了 circle.style.strokeDashoffset 并没有起作用,所以需要强制浏览器重新计算一下。 \r\n */\r\n void window.getComputedStyle($c).strokeDashoffset;\r\n //console.log('$c transitionDuration:', computedStyle.strokeDashoffset);\r\n\r\n $c.style.strokeDashoffset = (circleLength * 2).toString(); //顺时针,设置为 0 效果是逆时针。\r\n $c.ontransitionend = () => {\r\n //console.log('circle transitionend');\r\n\r\n $p.style.strokeDashoffset = '0';\r\n $p.ontransitionend = () => {\r\n //console.log('polyline transitionend');\r\n resolve(void 0);\r\n };\r\n };\r\n });\r\n }\r\n\r\n // #region 属性\r\n @ATR.strAttr\r\n accessor size: string | undefined;\r\n\r\n @ATR.intAttr\r\n accessor duration: number | undefined;\r\n\r\n _size_set(nv: string | null) {\r\n nv = nv ?? '';\r\n this.style.width = nv;\r\n this.style.height = nv;\r\n this.style.aspectRatio = '1 / 1';\r\n }\r\n // #endregion\r\n}","import {GT} from '../000-helper/lang';\r\nimport * as CCS from '../000-helper/style';\r\n\r\nexport interface DialogOptions {\r\n reusable?: boolean;\r\n resizable?: boolean; //允许用户调整对话框大小,默认 false\r\n title?: string;\r\n movable?: boolean; //拖动标题栏,移动整个对话框\r\n $body?: HTMLElement;\r\n width?: string;\r\n height?: string;\r\n okHandler?: ($dlg: HTMLDialogElement) => void;\r\n}\r\n\r\nexport function createDialog(options: DialogOptions): HTMLDialogElement {\r\n const $dlg = document.createElement('dialog');\r\n $dlg.className = 'gzm-frame gzm-dlg';\r\n\r\n if (!options.reusable) {\r\n removeWhenClose($dlg);\r\n }\r\n if (options.resizable) {\r\n $dlg.setAttribute('resize', '');\r\n }\r\n if (options.title) {\r\n const $header = setDefaultHeader($dlg, options.title);\r\n\r\n if (options.movable) {\r\n setHeaderMovable($dlg, $header);\r\n }\r\n } \r\n if (options.okHandler) {\r\n setDefaultFooter($dlg, options.okHandler);\r\n }\r\n if (options.$body) {\r\n setBody($dlg, options.$body);\r\n }\r\n if (options.width) {\r\n $dlg.style.width = options.width;\r\n }\r\n if (options.height) {\r\n $dlg.style.height = options.height;\r\n }\r\n\r\n document.body.appendChild($dlg);\r\n return $dlg;\r\n}\r\n\r\nexport function showDockRightModalDlg(options: DialogOptions): HTMLDialogElement {\r\n const $dlg = createDialog(options);\r\n dockRight($dlg);\r\n $dlg.showModal();\r\n return $dlg;\r\n}\r\n\r\nfunction dockRight($dlg: HTMLDialogElement) {\r\n $dlg.setAttribute('dock', 'right');\r\n\r\n Reflect.set($dlg, 'slideOut', slideOutRight);\r\n \r\n $dlg.onkeydown = e => {\r\n if (e.key === 'Escape') {\r\n //console.log(e.key);\r\n e.preventDefault();// 阻止 dialog 的默认关闭行为\r\n slideOutRight.apply($dlg);\r\n }\r\n };\r\n\r\n //beforetoggle 事件只能阻止open对话框,不能阻止closed对话框,具体看:https://devdocs.io/dom/htmlelement/beforetoggle_event\r\n\r\n $dlg.ontoggle = (e: ToggleEvent) => {\r\n if (e.newState === 'open') {\r\n $dlg.style.transform = 'translateX(0)';\r\n }\r\n };\r\n}\r\n\r\nfunction slideOutRight(this: HTMLDialogElement) {\r\n this.style.transform = 'translateX(100%)';\r\n this.ontransitionend = () => {\r\n this.close();\r\n this.ontransitionend = null;\r\n }\r\n}\r\n\r\nfunction removeWhenClose($dlg: HTMLDialogElement) {\r\n $dlg.onclose = () => {\r\n $dlg.remove();\r\n }\r\n}\r\n\r\nfunction setDefaultHeader($dlg: HTMLDialogElement, dlgTitle: string): HTMLElement {\r\n let $header = $dlg.querySelector('header');\r\n if (!$header) {\r\n $header = document.createElement('header');\r\n $header.className = 'gzm-header';\r\n $dlg.appendChild($header);\r\n }\r\n $header.innerHTML = `<strong>${dlgTitle}</strong><div class='gzm-txt-btn'>✕</div>`;//没有使用 CSS.createTxtBtn() 不默认获得焦点\r\n const $closeBtn = $header.querySelector('.gzm-txt-btn')! as HTMLElement;\r\n $closeBtn.onclick = () => closeDlg($dlg);\r\n return $header as HTMLElement;\r\n}\r\n\r\nfunction setDefaultFooter($dlg: HTMLDialogElement, okHandler: (dlg: HTMLDialogElement) => void) {\r\n let $footer = $dlg.querySelector('footer');\r\n if (!$footer) {\r\n $footer = document.createElement('footer');\r\n $dlg.appendChild($footer);\r\n }\r\n else {\r\n $footer.innerHTML = '';\r\n }\r\n\r\n const $cancelBtn = document.createElement('button');\r\n $cancelBtn.textContent = GT.cancel;\r\n $cancelBtn.onclick = () => closeDlg($dlg);\r\n\r\n const $okBtn = document.createElement('button');\r\n $okBtn.textContent = GT.ok;\r\n $okBtn.onclick = () => okHandler($dlg);\r\n\r\n $footer.append($cancelBtn, $okBtn);\r\n}\r\n\r\nfunction setHeaderMovable($dlg: HTMLDialogElement, $header: HTMLElement) {\r\n $header.style.cursor = 'move';\r\n\r\n let userSelect: string;\r\n const firstMove = () => {//第一次 mousemove 时做一些清理工作\r\n if (userSelect) {\r\n return;\r\n }\r\n\r\n const style = window.getComputedStyle($dlg)\r\n userSelect = style.getPropertyValue('user-select');\r\n \r\n $dlg.style.userSelect = 'none'; //防止任何元素、文本被选中\r\n $dlg.style.margin = '0'; //对话框显示的时候默认居中,chrome 会自动设置 margin,这里要清除掉。\r\n };\r\n\r\n $header.onmousedown = (e: MouseEvent) => {\r\n const $t = e.target as Element;\r\n if ($t.classList.contains('gzm-txt-btn')) return;\r\n \r\n const rect = $dlg.getBoundingClientRect();\r\n const offsetX = e.clientX - rect.left; //鼠标点击位置相对于对话框左上角的偏移\r\n const offsetY = e.clientY - rect.top;\r\n\r\n const move = (me: MouseEvent) => {\r\n firstMove();\r\n\r\n let left = me.clientX - offsetX;\r\n left = Math.max(0, left);\r\n left = Math.min(document.documentElement.clientWidth - rect.width, left);\r\n\r\n let top = me.clientY - offsetY;\r\n top = Math.max(0, top);\r\n top = Math.min(document.documentElement.clientHeight - rect.height, top);\r\n\r\n //console.log(left, top);\r\n\r\n $dlg.style.left = left + 'px';\r\n $dlg.style.top = top + 'px';\r\n };\r\n const up = () => {\r\n document.removeEventListener('mousemove', move);\r\n document.removeEventListener('mouseup', up);\r\n \r\n if (userSelect) {\r\n $dlg.style.userSelect = userSelect;\r\n userSelect = '';\r\n }\r\n };\r\n document.addEventListener('mousemove', move);\r\n document.addEventListener('mouseup', up);\r\n };\r\n}\r\n\r\nfunction setBody($dlg: HTMLDialogElement, $body: HTMLElement) {\r\n $dlg.appendChild($body);\r\n}\r\n\r\nfunction closeDlg($dlg: HTMLDialogElement) {\r\n if ('slideOut' in $dlg && typeof $dlg.slideOut === 'function') {\r\n $dlg.slideOut();\r\n return;\r\n }\r\n $dlg.close();\r\n}\r\n\r\nconst className = '.gzm-dlg';\r\nconst styleSheet = CCS.createStyleSheet({\r\n [className]: `\r\n max-width:100vw;\r\n max-height:100vh;\r\n margin:auto;\r\n padding:0.25rem;/*gzm-frame 中有 p-2,直接放在 .dlg 中不起作用!*/\r\n `,\r\n /* resize: attr(resize, \"both\"); 可惜不起作用,否则就可以设置元素的属性来控制 */ \r\n [className + '[resize]']: `\r\n resize: both;\r\n border-bottom-right-radius: 0;/*会在右下角显示调整尺寸的句柄*/\r\n `,\r\n [className + '[dock]']: `\r\n transition-property:transform;\r\n transition-duration:750ms;\r\n margin:0;/*<dialog> 浏览器样式有 margin,会阻止 dock*/\r\n `,\r\n /*<dialog> open 才会显示,显示后才启用 grid,否则会阻止 <dialog> 关闭,因为关闭就是 display:none;*/\r\n [className + '[open]']: `\r\n display: grid;\r\n grid-template-columns: 1fr;\r\n grid-template-rows: auto 1fr auto;\r\n gap: 0.25rem;\r\n overflow: hidden;\r\n outline-style: none; /*不要显示一圈黑框*/\r\n `,\r\n [className + '[dock=right]']: `\r\n top: 0px; \r\n height: 100vh; \r\n left: auto; \r\n right: 0; \r\n transform: translateX(100%);\r\n `,\r\n [className + '>header']: `\r\n grid-row: 1;\r\n border-radius: 0.5rem; \r\n gap: 1rem;\r\n padding-inline: 1rem;\r\n padding-block: 0.5rem;\r\n display: flex;\r\n align-items: center;\r\n `,\r\n /*对话框标题*/\r\n [className + '>header>strong']: `\r\n flex: auto;\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n `,\r\n [className + '>footer']: `\r\n grid-row: -1;\r\n border-top: var(--gzm-btn-border);\r\n padding-inline: 1rem;\r\n padding-block: 0.75rem;\r\n display: flex;\r\n justify-content: space-between;\r\n `,\r\n /*footer 中的确定取消按钮*/\r\n [className + '>footer>button']: `\r\n font: inherit;\r\n line-height: inherit;\r\n color: var(--gzm-btn-txt-color);\r\n background: var(--gzm-btn-background);\r\n border: var(--gzm-btn-border);\r\n border-radius: 0.5rem;\r\n padding: 0.375rem 0.75rem;\r\n `,\r\n [className + '>footer>button:hover']: `\r\n color: var(--gzm-h-btn-txt-color);\r\n background: var(--gzm-h-btn-background);\r\n border: var(--gzm-h-btn-border);\r\n `,\r\n [className + '>footer>button:active']: `\r\n color: var(--gzm-a-btn-txt-color) !important;\r\n background: var(--gzm-a-btn-background) !important;\r\n border: var(--gzm-a-btn-border) !important;\r\n `,\r\n});\r\ndocument.adoptedStyleSheets.push(styleSheet);","import {GT} from '../000-helper/lang';\r\nimport { createDialog } from './dialog'\r\nimport * as CC from './circle';\r\n\r\nconst emojis = [\"🕛\", \"🕐\", \"🕑\", \"🕒\", \"🕓\", \"🕔\", \"🕕\", \"🕖\", \"🕗\", \"🕘\", \"🕙\", \"🕚\"];\r\n\r\nexport function showWaiting(title: string, msg?: string) {\r\n const $p = document.createElement('p');\r\n $p.style.margin = '1rem';\r\n $p.style.fontSize = 'xxx-large';\r\n $p.textContent = emojis[0]!;\r\n\r\n const $cap = document.createElement('figcaption');\r\n $cap.textContent = msg ?? GT.waiting;\r\n\r\n const $fig = document.createElement('figure');\r\n $fig.style.margin = '1rem';\r\n $fig.style.textAlign = 'center';\r\n $fig.append($p, $cap);\r\n\r\n const $dlg = createDialog({\r\n title,\r\n movable: true,\r\n $body: $fig,\r\n });\r\n $dlg.showModal();\r\n\r\n //对话框的大小默认是根据内容自动调整的,所以下面 complete/error 重新设置 cap.textContent 时会导致宽度变小。\r\n //为了防止这种情况,这里将宽度固定下来。\r\n $fig.style.width = Math.floor($fig.offsetWidth / 0.618) + 'px';\r\n\r\n let index = 0;\r\n const handle = window.setInterval(() => {\r\n if (index < 0 || !$dlg.parentElement) {\r\n window.clearInterval(handle);\r\n return;\r\n }\r\n index = (index + 1) % emojis.length;\r\n $p.textContent = emojis[index]!;\r\n }, 1000);\r\n\r\n return {\r\n $dlg,\r\n async complete(msg = GT.completed) {\r\n $cap.textContent = msg;\r\n this.setTitle(GT.completed);\r\n\r\n index = -1; //退出上面的 setInterval\r\n\r\n const $cc = document.createElement(CC.tagName);\r\n $cc.size = \"100px\";\r\n $cc.duration = 1500;\r\n $p.replaceWith($cc);\r\n\r\n await $cc.play();\r\n this.$dlg.close();\r\n },\r\n error(e: object | string = GT.error) {\r\n index = -1; //退出上面的 setInterval\r\n\r\n $p.textContent = '👮';//https://www.compart.com/en/unicode/U+1F46E\r\n\r\n if (typeof e === 'string') {\r\n $cap.textContent = e;\r\n }\r\n else if ('message' in e) {\r\n //e.toString(); 相当于 `${e.name}: ${e.message}` https://devdocs.io/javascript/global_objects/error\r\n $cap.textContent = String(e.message);\r\n }\r\n else {\r\n $cap.textContent = String(e);\r\n }\r\n $cap.style.color = 'var(--gzm-error-txt-color)';\r\n this.setTitle(GT.error);\r\n },\r\n alert(msg: string) {\r\n index = -1; //退出上面的 setInterval\r\n\r\n $p.textContent = '🙋';\r\n $cap.innerHTML = `<strong>${msg}</strong>`;\r\n this.setTitle(GT.attention);\r\n },\r\n close() {\r\n this.$dlg.close();\r\n },\r\n setTitle(title: string) {\r\n const $s = this.$dlg.querySelector(':scope > header:first-child > strong:first-child');\r\n if ($s) {\r\n $s.textContent = title;\r\n }\r\n }\r\n };\r\n}\r\nexport function showError(errMsg: string) {\r\n const $p = document.createElement('p');\r\n $p.style.margin = '1rem';\r\n $p.style.fontSize = 'xxx-large';\r\n $p.textContent = '👮';//https://www.compart.com/en/unicode/U+1F46E\r\n\r\n const $cap = document.createElement('figcaption');\r\n $cap.textContent = errMsg;\r\n $cap.style.color = 'var(--gzm-error-txt-color)';\r\n\r\n const $fig = document.createElement('figure');\r\n $fig.style.margin = '1rem';\r\n $fig.style.textAlign = 'center';\r\n $fig.append($p, $cap);\r\n\r\n const $dlg = createDialog({\r\n title: GT.error,\r\n movable: true,\r\n $body: $fig,\r\n });\r\n $dlg.showModal();\r\n return $dlg;\r\n}\r\nexport function showAlert(msg: string) {\r\n const $p = document.createElement('p');\r\n $p.style.margin = '1rem';\r\n $p.style.fontSize = 'xxx-large';\r\n $p.textContent = '🙋';\r\n\r\n const $cap = document.createElement('figcaption');\r\n $cap.innerHTML = `<strong>${msg}</strong>`;\r\n\r\n const $fig = document.createElement('figure');\r\n $fig.style.margin = '1rem';\r\n $fig.style.textAlign = 'center';\r\n $fig.append($p, $cap);\r\n\r\n const $dlg = createDialog({\r\n title: GT.attention,\r\n movable: true,\r\n $body: $fig,\r\n });\r\n $dlg.showModal();\r\n return $dlg;\r\n}\r\n"],"names":["dialogTagName","getContainer","checkPopupPosition","c","tagName","mutableAttributes","$ele","i","style","CSS.createStyleSheet","_corner_dec","_a","_init","_corner","styleSheet","cornerStyleSheet","ELE.defineElement","ATR.strAttr","ATR.boolAttr","__privateAdd","__runInitializers","CSS.baseStyle","__decoratorStart","__decorateElement","__privateMethod","ATR.intAttr","CCS.createStyleSheet","msg","CC.tagName","title"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ui-basic.es.js","sources":["../src/000-helper/attr.ts","../src/000-helper/center.ts","../src/000-helper/corner.ts","../src/000-helper/element.ts","../src/000-helper/helper.ts","../src/000-helper/lang.ts","../src/000-helper/style.ts","../src/000-helper/theme.ts","../src/003-accessory/badge.ts","../src/003-accessory/close.ts","../src/003-accessory/iconCache.ts","../src/003-accessory/icon.ts","../src/011-dialog/circle.ts","../src/011-dialog/dialog.ts","../src/011-dialog/show.ts"],"sourcesContent":["export function getSnakeCaseName(propName: string): string {\r\n return propName.replace(/([A-Z])/g, (match) => `-${match.toLowerCase()}`);\r\n}\r\n\r\n/**\r\n * 基于:\r\n * 1 - Atribute 属性(A属性)的特性,具体请看 /try/WC/attr.html\r\n * 2 - auto-accessor 装饰器的特性,具体请看 /try/ts/auto-accessor.ts\r\n * \r\n * 对于所有的 auto-accessor 装饰器生成的属性,属性的类型与默认值必须按如下定义:\r\n * 1 - 目前支持三种类型: 整数、布尔 和 字符串。其中字符串是万金油,因为 ts 中经常用字符串来定义联合类型,如 'a' | 'b' 等。\r\n * 2 - 每种数据类型都支持两种方式:\r\n * a - 与 undefined 联合,默认值是 void 0\r\n * b - 不与 undefined 联合,编译器要求必须初始化,那么不要在构造函数中初始化。因为构造函数中调用的是 set() 会导致设置 A 属性,导致 createElement() 异常。\r\n * 3 - 开发组件的时候 P属性 优先使用与 undefined 的联合类型,也就不需要默认值。可以将默认值写在 get() 时,如 this.propName ?? default。\r\n */\r\n\r\n/**\r\n * @strAttr\r\n * accessor propName: V = '';\r\n * 或者\r\n * @strAttr\r\n * accessor propName: V | undefined;\r\n */\r\nexport function strAttr<This extends HTMLElement, V>(_: ClassAccessorDecoratorTarget<This, V>, context: ClassAccessorDecoratorContext<This, V>) {\r\n const propName = String(context.name);\r\n const attrName = getSnakeCaseName(propName);\r\n let initValue: unknown = void 0;\r\n\r\n return {\r\n get(this: This): V {\r\n const ret = this.getAttribute(attrName);\r\n return (ret === null ? initValue : ret) as V;\r\n },\r\n set(this: This, value: V) {\r\n //console.log(propName, 'set', value);\r\n if (value ?? false) {\r\n this.setAttribute(attrName, String(value));\r\n }\r\n else {\r\n this.removeAttribute(attrName);\r\n }\r\n },\r\n init(this: This, value: V): V {\r\n initValue = value;\r\n return value;\r\n }\r\n }\r\n}\r\n\r\ntype BoolOrUndef = boolean | undefined;\r\ntype BoolType = boolean | BoolOrUndef;\r\n\r\n/**\r\n * @boolAttr\r\n * accessor propName: boolean = false;\r\n * 或者\r\n * @boolAttr\r\n * accessor propName: boolean | undefined;\r\n */\r\nexport function boolAttr<This extends HTMLElement, V extends BoolType>(_: ClassAccessorDecoratorTarget<This, V>, context: ClassAccessorDecoratorContext<This, V>) {\r\n const propName = String(context.name);\r\n const attrName = getSnakeCaseName(propName);\r\n let initValue: boolean | undefined = void 0;\r\n\r\n return {\r\n get(this: This): V {\r\n return (this.hasAttribute(attrName) || initValue) as V;\r\n },\r\n set(this: This, value: V) {\r\n //console.log(propName, 'set', value);\r\n if (value) {\r\n this.setAttribute(attrName, '');\r\n }\r\n else {\r\n this.removeAttribute(attrName);\r\n }\r\n },\r\n init(this: This, value: V): V {\r\n initValue = value;\r\n return value;\r\n }\r\n }\r\n}\r\n\r\ntype NumOrUndef = number | undefined;\r\ntype NumType = number | NumOrUndef;\r\n\r\n/**\r\n * @intAttr\r\n * accessor propName: number | undefined;\r\n * 或者\r\n * @intAttr\r\n * accessor propName: number = 12345;\r\n */\r\nexport function intAttr<This extends HTMLElement, V extends NumType>(_: ClassAccessorDecoratorTarget<This, V>, context: ClassAccessorDecoratorContext<This, V>) {\r\n const propName = String(context.name);\r\n const attrName = getSnakeCaseName(propName);\r\n let initValue: number | undefined = void 0;\r\n\r\n return {\r\n get(this: This): V {\r\n const attr = this.getAttribute(attrName);\r\n return (attr === null ? initValue : Number(attr)) as V;\r\n },\r\n set(this: This, value: V) {\r\n if (value !== void 0 && !Number.isNaN(value)) {\r\n this.setAttribute(attrName, Number(value).toString());\r\n }\r\n else {\r\n this.removeAttribute(attrName);\r\n }\r\n },\r\n init(this: This, value: V): V {\r\n initValue = value;\r\n return value;\r\n }\r\n }\r\n}\r\n\r\ntype StrArrayOrUndef = string[] | undefined;\r\ntype StrArrayType = string[] | StrArrayOrUndef;\r\nexport function saAttr<This extends HTMLElement, V extends StrArrayType>(_: ClassAccessorDecoratorTarget<This, V>, context: ClassAccessorDecoratorContext<This, V>) {\r\n const propName = String(context.name);\r\n const attrName = getSnakeCaseName(propName);\r\n let initValue: string[] | undefined = void 0;\r\n\r\n return {\r\n get(this: This): V {\r\n const attr = this.getAttribute(attrName);\r\n return (attr === null ? initValue : attr.split(',')) as V;\r\n },\r\n set(this: This, value: V) {\r\n if (value && value.length > 0) {\r\n this.setAttribute(attrName, value.join(','));\r\n }\r\n else {\r\n this.removeAttribute(attrName);\r\n }\r\n },\r\n init(this: This, value: V): V {\r\n initValue = value;\r\n return value;\r\n }\r\n }\r\n}","const borders = ['bottom', 'top', 'right', 'left'] as const;//次序是优先级\r\nexport type AttachBorder = typeof borders[number];\r\ntype Space = {\r\n [key in AttachBorder | 'width' | 'height']: number;\r\n}\r\nconst dialogTagName = 'DIALOG';\r\nfunction getContainer($el: Element): HTMLElement {\r\n const root = $el.getRootNode();\r\n if (root instanceof ShadowRoot) {\r\n return getContainer(root.host);\r\n }\r\n return $el.closest(dialogTagName) ?? document.body;\r\n}\r\nexport const attachBorderAttributeName = 'gzm-attach-border';\r\n\r\nexport interface TransitionPopup {\r\n doTransition: boolean;\r\n beforeOpenTransition?: () => void;\r\n afterOpenTransition?: () => void;\r\n};\r\n\r\n/**\r\n * 检查 $ppp 的定位设置,必须是 fixed。\r\n * 虽然 fixed 和 absolute 都允许绝对定位,但是在网页出现滚动栏时,定位算法不同。\r\n * fixed 无需考虑网页滚动栏,但是 absolute 需要。\r\n * 为了简化,这里强制要求 fixed,因为 popover 的使用默认是 fixed。\r\n * @param $ppp \r\n */\r\nfunction checkPopupPosition($ppp: HTMLElement) {\r\n if (!$ppp.getAttribute('popover')) {\r\n $ppp.setAttribute('popover', '');\r\n }\r\n if ($ppp.isConnected) {\r\n const p = getComputedStyle($ppp).position;\r\n if (p !== 'fixed') {\r\n throw new Error('popup 的样式定位必须是 fixed');\r\n }\r\n }\r\n}\r\n\r\nexport class CenterHelper {\r\n constructor($tooltip: HTMLElement & TransitionPopup, $attachTo: HTMLElement, attachBorder: AttachBorder) {\r\n this.$tt = $tooltip; \r\n this.$attachTo = $attachTo;\r\n this.realBorder = this.#attachBorder = attachBorder;\r\n }\r\n $tt: HTMLElement & TransitionPopup;\r\n $attachTo: HTMLElement;\r\n #attachBorder: AttachBorder;\r\n\r\n #space?: Space;\r\n\r\n //最终计算结果\r\n realBorder: AttachBorder;\r\n x = 0;\r\n y = 0;\r\n marginLeft = '';\r\n marginTop = '';\r\n\r\n //$tt 的宽度和高度\r\n ttWidth = 0;\r\n ttHeight = 0;\r\n\r\n pos($tt = this.$tt) {\r\n this.#checkParent();\r\n this.#calcCoordinates();\r\n\r\n $tt.setAttribute(attachBorderAttributeName, this.realBorder);\r\n $tt.style.top = Math.ceil(this.y) + 'px';\r\n $tt.style.left = Math.ceil(this.x) + 'px';\r\n\r\n this.#ani($tt);\r\n }\r\n #ani($tt = this.$tt, rb = this.realBorder) {\r\n if (!$tt.doTransition) return;\r\n if (rb !== 'bottom' && rb !== 'right') return;//因为 $tt 是通过 top/left 定位的。\r\n \r\n const {width, height} = $tt.getBoundingClientRect();\r\n \r\n $tt.style.transitionDuration = '200ms';\r\n $tt.style.transitionProperty = 'width,height';\r\n $tt.beforeOpenTransition?.();\r\n $tt.ontransitionend = () => {\r\n $tt.ontransitionend = null;\r\n $tt.afterOpenTransition?.();\r\n\r\n if (rb === 'bottom') {\r\n $tt.style.height = '';\r\n }\r\n else if (rb === 'right') {\r\n $tt.style.width = '';\r\n }\r\n }\r\n\r\n let s = 0;\r\n if (rb === 'bottom') {\r\n $tt.style.height = '0';\r\n $tt.style.width = width + 'px';\r\n\r\n s = $tt.offsetHeight; //强制要求绘制,这样才会有动画\r\n $tt.style.height = height + 'px';\r\n }\r\n else if (rb === 'right') {\r\n $tt.style.width = '0';\r\n $tt.style.height = height + 'px';\r\n\r\n s = $tt.offsetWidth; //强制要求绘制,这样才会有动画\r\n $tt.style.width = width + 'px';\r\n }\r\n return s;\r\n }\r\n\r\n /**\r\n * 计算 popup 显示的 top/left 以及需要调整箭头位置\r\n */\r\n #calcCoordinates() {\r\n this.#calcSpace();\r\n const border = this.#getRealAttachBorder();\r\n //console.debug('CAFTooltipPosHelper attach border = ' + border);\r\n\r\n if (border === 'top' || border === 'bottom') {\r\n this.#calcBorderY();\r\n this.#calcPointerX();\r\n }\r\n else {\r\n this.#calcBorderX();\r\n this.#calcPointerY();\r\n }\r\n }\r\n\r\n #checkParent($tt = this.$tt, $attachTo = this.$attachTo) {\r\n const $c = getContainer($attachTo);\r\n \r\n if ($tt.isConnected) {\r\n const $pc = getContainer($tt);\r\n if ($pc !== $c) {\r\n $c.append($tt);\r\n }\r\n }\r\n else {\r\n $c.append($tt);\r\n }\r\n checkPopupPosition($tt);\r\n //发现 showPopover 不接收一个参数!?所以无法传入 {source: $attachTo},也就没有办法使用 css anchor positioning 了。\r\n $tt.showPopover();\r\n \r\n //已经显示就读取其宽度\r\n const r = $tt.getBoundingClientRect();\r\n this.ttWidth = r.width;\r\n this.ttHeight = r.height;\r\n }\r\n\r\n #calcSpace($attachTo = this.$attachTo) {\r\n const rect = $attachTo.getBoundingClientRect();\r\n const $dd = document.documentElement;\r\n const r = $dd.getBoundingClientRect();\r\n\r\n //直接利用 rect,其中还记录了 width, height 可以为之后的计算所用!\r\n const s = {\r\n top: rect.top - r.top,\r\n left: rect.left - r.left,\r\n width: rect.width,\r\n height: rect.height,\r\n right: r.right - rect.right - ($dd.offsetWidth - $dd.clientWidth),\r\n bottom: r.bottom - rect.bottom - ($dd.offsetHeight - $dd.clientHeight)\r\n };\r\n this.#space = s;\r\n //console.debug('CAFTooltipPosHelper available space:');\r\n //console.debug(this.#space);\r\n //console.debug(r.right, rect.right, ($dd.offsetWidth - $dd.clientWidth));\r\n }\r\n\r\n /**\r\n * 判断一种停靠方式是否有足够的空间。\r\n * @returns 数字 = 空间 - 占用尺寸后的剩余\r\n */\r\n #calcBorderSpace(border: AttachBorder, space = this.#space!): number {\r\n const sp = space[border];\r\n const sz = (border === 'top' || border === 'bottom') ? this.ttHeight : this.ttWidth;\r\n return sp - sz;\r\n }\r\n\r\n /**\r\n * 判断应该停靠在哪一条边。\r\n * @returns 'top'/'left'/'right'/'bottom' \r\n */\r\n #getRealAttachBorder(): AttachBorder {\r\n let ret = this.#attachBorder; //调用方有设置\r\n if (ret) {\r\n if (this.#calcBorderSpace(ret) >= 0) {\r\n return this.realBorder = ret;\r\n }\r\n }\r\n //依次计算,哪一个 border 停靠后剩余的空间最大\r\n let empty = -99999; //确保下面的循环至少一次满足 if(s>empty),循环结束后 ret 就不会空。\r\n for (const b of borders) {\r\n const s = this.#calcBorderSpace(b);\r\n if (s > empty) {\r\n empty = s;\r\n ret = b;\r\n }\r\n };\r\n return this.realBorder = ret;\r\n }\r\n\r\n /**\r\n * 计算停靠在上下边框时的y\r\n */\r\n #calcBorderY(realBorder = this.realBorder, space = this.#space!) {\r\n let y = space.top; //attachTo 距离 body.top\r\n\r\n y = realBorder === 'top' \r\n ? y - this.ttHeight\r\n : y + space.height; //space.height 是 attachTo 的高度\r\n \r\n this.y = y;\r\n }\r\n /**\r\n * 计算停靠在上下边框时的x。\r\n * 默认是中间对齐,但当宽度太大时,需要调整水平位置。\r\n */\r\n #calcPointerX(space = this.#space!) {\r\n //先计算中间对齐时,左右超过 attachTo 的长度。\r\n const w = (this.ttWidth - space.width) / 2;\r\n const x = space.left - w; //默认中间对齐时的 x\r\n\r\n if (w <= space.left && w <= space.right //左右空间都足够\r\n || w > space.left && w > space.right) { //左右空间都不够,说明已经this宽度已经大于窗口宽度\r\n \r\n //仍然使用默认的中间对齐,无需调整 marginLeft\r\n this.x = x;\r\n this.marginLeft = '';\r\n return;\r\n }\r\n\r\n if (w > space.left) { //左侧空间不够\r\n this.x = 0; //贴着窗口的左边 x + (w - space.left)\r\n this.marginLeft = (space.left - w) + 'px';\r\n return;\r\n }\r\n\r\n //右侧空间不够\r\n const left = (w - space.right);//向左调整的距离\r\n this.x = x - left; //贴着窗口的右边\r\n this.marginLeft = left + 'px';\r\n //console.log(x, w, space.right, this.x);\r\n }\r\n /**\r\n * 计算停靠在左右边框时的x\r\n */\r\n #calcBorderX(realBorder = this.realBorder, space = this.#space!) {\r\n let x = space.left; //attachTo 距离 body.left\r\n\r\n x = realBorder === 'left' \r\n ? x - this.ttWidth\r\n : x + space.width; //space.width 是 attachTo 的宽度\r\n \r\n this.x = x;\r\n }\r\n /**\r\n * 计算停靠在左右边框时的y。\r\n * 默认是中间对齐,但当高度太大时,需要调整垂直位置。\r\n */\r\n #calcPointerY(space = this.#space!) {\r\n //先计算中间对齐时,上下超过 attachTo 的长度。\r\n const h = (this.ttHeight - space.height) / 2;\r\n const y = space.top - h; //默认中间对齐时的 y\r\n\r\n if (h <= space.top && h <= space.bottom //上下空间都足够\r\n || h > space.top && h > space.bottom) { //上下空间都不够,说明已经this高度已经大于窗口高度\r\n \r\n //仍然使用默认的中间对齐,无需调整 marginTop\r\n this.y = y;\r\n this.marginTop = '';\r\n return;\r\n }\r\n\r\n if (h > space.top) { //上侧空间不够\r\n this.y = 0; //贴着窗口的顶边 y + (h - space.top)\r\n this.marginTop = (space.top - h) + 'px';\r\n return;\r\n }\r\n\r\n //下侧空间不够\r\n this.y = y - (h - space.bottom); //贴着窗口的底边\r\n this.marginTop = (h - space.bottom) + 'px';\r\n }\r\n}\r\n","/**\r\n * 因为 tsconfig.json erasableSyntaxOnly 所以不能使用枚举。\r\n * xy\r\n * 00 - 左上角 = 0\r\n * 01 - 左下角 = 1\r\n * 10 - 右上角 = 10\r\n * 11 - 右下角 = 11\r\n */\r\nexport const xy = {\r\n leftTop: 0,\r\n leftBottom: 1,\r\n rightTop: 10,\r\n rightBottom: 11,\r\n} as const;\r\nexport type Corner = typeof xy[keyof typeof xy];\r\nexport function isLeftCorner(c: Corner): boolean {\r\n return c < 10;\r\n}\r\nexport function isTopCorner(c: Corner): boolean {\r\n return c % 10 === 0;\r\n}\r\nexport function makeCorner(isLeft: boolean, isTop: boolean): Corner {\r\n const x = isLeft ? 0 : 10;\r\n const y = isTop ? 0 : 1;\r\n return (x + y) as Corner;\r\n}\r\n\r\ntype CornerPair = {popupCorner: Corner, attachCorner: Corner, height?: number, width?: number};\r\n\r\nconst dialogTagName = 'DIALOG';\r\nfunction getContainer($el: Element): HTMLElement {\r\n const root = $el.getRootNode();\r\n if (root instanceof ShadowRoot) {\r\n return getContainer(root.host);\r\n }\r\n return $el.closest(dialogTagName) ?? document.documentElement;\r\n}\r\n\r\n/**\r\n * 检查 $ppp 的定位设置,必须是 fixed。\r\n * 虽然 fixed 和 absolute 都允许绝对定位,但是在网页出现滚动栏时,定位算法不同。\r\n * fixed 无需考虑网页滚动栏,但是 absolute 需要。\r\n * 为了简化,这里强制要求 fixed,因为 popover 的使用默认是 fixed。\r\n * @param $ppp \r\n */\r\nfunction checkPopupPosition($ppp: HTMLElement) {\r\n if (!$ppp.getAttribute('popover')) {\r\n $ppp.setAttribute('popover', '');\r\n }\r\n if ($ppp.isConnected) {\r\n const p = getComputedStyle($ppp).position;\r\n if (p !== 'fixed') {\r\n throw new Error('popup 的样式定位必须是 fixed');\r\n }\r\n }\r\n}\r\n\r\nexport class CornerHelper {\r\n constructor($popup: HTMLElement, popupCorner: Corner, $attachTo: HTMLElement, attachCorner: Corner) {\r\n this.$popup = $popup;\r\n this.#popupCorner = popupCorner;\r\n this.$attachTo = $attachTo;\r\n this.#attachCorner = attachCorner;\r\n }\r\n readonly $popup: HTMLElement;\r\n readonly $attachTo: HTMLElement;\r\n\r\n #popupCorner: Corner;\r\n #attachCorner: Corner;\r\n \r\n public pos() {\r\n this.#checkParent();\r\n const top = this.#tryGetVerticalCorner();\r\n const left = this.#tryGetHorizontalCorner();\r\n\r\n const $ppp = this.$popup;\r\n if (top !== undefined && left !== undefined) {\r\n //说明水平和垂直方向上都明确了,无需再根据 popupCorner 来计算\r\n $ppp.style.top = top + 'px';\r\n $ppp.style.left = left + 'px';\r\n $ppp.style.right = 'auto';\r\n $ppp.style.bottom = 'auto';\r\n }\r\n else {\r\n const {x,y} = this.#calcAttachPoint();\r\n this.#place(x, y);\r\n\r\n //可能只有一个方向上指定了坐标,先根据 popupCorner 挂靠,然后再设置坐标。\r\n if (top !== undefined) {\r\n $ppp.style.top = top + 'px';\r\n }\r\n else if (left !== undefined) {\r\n $ppp.style.left = left + 'px';\r\n }\r\n }\r\n\r\n $ppp.style.boxShadow = `var(--gzm-corner-shadow-${this.#popupCorner})`;\r\n }\r\n\r\n #checkParent($ppp = this.$popup, $attachTo = this.$attachTo) {\r\n const $c = getContainer($attachTo);\r\n \r\n if ($ppp.isConnected) {\r\n const $pc = getContainer($ppp);\r\n if ($pc !== $c) {\r\n $c.append($ppp);\r\n }\r\n }\r\n else {\r\n $c.append($ppp);\r\n }\r\n checkPopupPosition($ppp);\r\n //发现 showPopover 不接收一个参数!?所以无法传入 {source: $attachTo},也就没有办法使用 css anchor positioning 了。\r\n $ppp.showPopover();\r\n }\r\n\r\n /**\r\n * 计算位置\r\n * @returns\r\n */\r\n #place(x: number, y: number) {\r\n const dde = document.documentElement; //不能使用 window,因为 window.innerWidth = dde.clientWidth + 滚动条宽度。\r\n const $ppp = this.$popup;\r\n switch(this.#popupCorner) {\r\n case 0:\r\n $ppp.style.right = 'auto';\r\n $ppp.style.bottom = 'auto';\r\n\r\n $ppp.style.left = x + 'px';\r\n $ppp.style.top = y + 'px';\r\n break;\r\n case 1:\r\n $ppp.style.right = 'auto';\r\n $ppp.style.top = 'auto';\r\n\r\n $ppp.style.left = x + 'px';\r\n $ppp.style.bottom = (dde.clientHeight - y) + 'px';\r\n break;\r\n case 10:\r\n $ppp.style.left = 'auto';\r\n $ppp.style.bottom = 'auto';\r\n\r\n $ppp.style.right = (dde.clientWidth - x) + 'px';\r\n $ppp.style.top = y + 'px';\r\n break;\r\n case 11:\r\n $ppp.style.left = 'auto';\r\n $ppp.style.top = 'auto';\r\n\r\n $ppp.style.right = (dde.clientWidth - x) + 'px';\r\n $ppp.style.bottom = (dde.clientHeight - y) + 'px';\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * 计算 attach-to 元素上挂靠点的坐标\r\n * @returns \r\n */\r\n #calcAttachPoint(): {x: number, y: number} {\r\n const rect = this.$attachTo.getBoundingClientRect();\r\n\r\n //$attachTo 左上角相对于视口左上角的坐标。\r\n let x = rect.x;\r\n let y = rect.y;\r\n\r\n switch(this.#attachCorner) {\r\n case 1:\r\n y += rect.height;\r\n break;\r\n case 10:\r\n x += rect.width;\r\n break;\r\n case 11:\r\n x += rect.width;\r\n y += rect.height;\r\n break;\r\n }\r\n return {x,y};\r\n }\r\n\r\n /**\r\n * 计算挂靠点,直接覆盖原始的 #popupCorner 和 #attachCorner。\r\n * @returns {top, bottom} 如果不为空,说明无法计算挂高点,那么直接计算 popup 的坐标返回。\r\n */\r\n #tryGetVerticalCorner(): number | undefined {\r\n const dde = document.documentElement;\r\n\r\n //垂直方向,popup 的高度在小于窗口高度的情况下,自动调整挂靠点。\r\n const oh = this.$popup.offsetHeight;\r\n if (oh >= dde.clientHeight) {\r\n //大于窗口高度,放弃治疗\r\n return;\r\n }\r\n\r\n //计算所有的挂靠点,和它们允许的高度。\r\n const corners = this.#calcVertialCornerAndSpace();\r\n \r\n //首先找到当前设置的挂靠点,这种组合是一定存在的,具体请参考 #calcVerticalCorner()\r\n const h = corners.find(c => c.popupCorner === this.#popupCorner && c.attachCorner === this.#attachCorner)!.height!;\r\n if (oh <= h) {\r\n //初始的 attachCorner, popupCorner 就能够提供足够的高度\r\n return;\r\n }\r\n\r\n //$popup 的高度大于 要求的挂靠点,需要在 cs 中寻找一个可用尺寸最大的挂靠点。\r\n const c = corners.sort((a,b) => b.height! - a.height!)[0]!;\r\n if (oh <= c.height!) {\r\n this.#popupCorner = c.popupCorner;\r\n this.#attachCorner = c.attachCorner;\r\n return;\r\n }\r\n\r\n //执行到这里说明:根据挂靠点没有一个有足够的高度,但是popup本身却小于窗口高度,为了能够完整显示直接计算 top/bottom\r\n let ret = 0;\r\n if (c.popupCorner % 10 === 0) {\r\n //$popup 用 top 去挂靠,向上移动一点,让 bottom 露出来\r\n ret = dde.clientHeight - oh;\r\n }\r\n else {\r\n //$popup 用 bottom 挂靠,向下移动一点,让头露出来。\r\n }\r\n return ret;\r\n }\r\n \r\n /**\r\n * 计算 attach-to 元素多个挂靠点和可用垂直空间的关系。\r\n */\r\n #calcVertialCornerAndSpace(): CornerPair[] {\r\n const corners = this.#calcVerticalCorner();\r\n\r\n //开始计算\r\n const rect = this.$attachTo.getBoundingClientRect();\r\n for (const c of corners) {\r\n this.#calcVerticalSpace(c, rect);\r\n }\r\n return corners;\r\n }\r\n\r\n /**\r\n * 在垂直方向上,attach-to 和 $popup 都有 2 个选项 top 和 bottom,组合在一起就是 4 个选项。\r\n * 这里就需要将 4 个组合的可用垂直空间计算出来。\r\n * \r\n * 虽然这里计算的是垂直方向,但是仍然要把水平方向的一个因素考虑进来:\r\n * 当 attach-to 和 $popup 是左侧对齐-挂靠点都在左侧,或者是右侧对齐时,上面4个组合中的2个会导致 attach-to 和 $popup 重叠在一起。\r\n * 即左上角、右上角重叠 和 左下角、右下角重叠。\r\n * 当原来就是重叠的,这里只计算重叠的。如果原来不是重叠的,则不计算重叠的。\r\n * @returns \r\n */\r\n #calcVerticalCorner(): CornerPair[] {\r\n //先把 4 种组合生成,因为 x 是10位数,y 是个位数,这里计算垂直角,所以十位数都不变,只改变个位数。 \r\n // < 10 代表左侧,即左上角和左下角。 > 10 代表右侧,即右上角和右下角。\r\n\r\n const pc = this.#popupCorner;\r\n const cornersOfPopup: Corner[] = pc < 10 ? [0,1]: [10,11];\r\n const ac = this.#attachCorner;\r\n const cornersOfAttach: Corner[] = ac < 10 ? [0,1]: [10,11];\r\n\r\n // 合成 4 种可能性。\r\n let four: CornerPair[] = [];\r\n for (const popupCorner of cornersOfPopup) {\r\n for (const attachCorner of cornersOfAttach) {\r\n four.push({popupCorner, attachCorner});\r\n }\r\n }\r\n\r\n //判断是否同侧,都是左侧或者都是右侧,这种情况下会发生重叠。\r\n if (pc < 10 && ac < 10 || pc >= 10 && ac >= 10) {\r\n //根据原来的设置是否发生重叠来排除无需计算的组合。\r\n if (pc === ac) {\r\n //原来就是重叠的,所以排除不重叠的\r\n four = four.filter(f => f.popupCorner === f.attachCorner);\r\n }\r\n else {\r\n //排除重叠的\r\n four = four.filter(f => f.popupCorner !== f.attachCorner);\r\n }\r\n }\r\n return four;\r\n }\r\n /**\r\n * 计算挂靠点可用垂直空间\r\n */\r\n #calcVerticalSpace(cp: CornerPair, attachToRect: DOMRect): void {\r\n const dde = document.documentElement;\r\n const y = attachToRect.y;\r\n\r\n if (cp.popupCorner % 10 === 0) {\r\n //$popup 用 top 去挂靠\r\n if (cp.attachCorner % 10 === 0) {\r\n //也是 top\r\n cp.height = dde.clientHeight - y;\r\n }\r\n else {\r\n //bottom\r\n cp.height = dde.clientHeight - (y + attachToRect.height);\r\n }\r\n }\r\n else {\r\n //$popup 用 bottom 去挂靠\r\n if (cp.attachCorner % 10 === 0) {\r\n //是 top\r\n cp.height = y;\r\n }\r\n else {\r\n cp.height = y + attachToRect.height;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 注释参考:tryGetVerticalCorner\r\n */\r\n #tryGetHorizontalCorner() {\r\n const dde = document.documentElement;\r\n\r\n //水平方向,popup 的宽度在小于窗口宽度的情况下,自动调整挂靠点。\r\n const ow = this.$popup.offsetWidth;\r\n if (ow >= dde.clientWidth) {\r\n //大于窗口宽度,放弃治疗\r\n return;\r\n }\r\n\r\n //计算所有的挂靠点,和它们允许的高度。\r\n const corners = this.#calcHorizontalCornerAndSpace();\r\n \r\n //首先找到当前设置的挂靠点\r\n const w = corners.find(c => c.popupCorner === this.#popupCorner && c.attachCorner === this.#attachCorner)!.width!;\r\n if (ow <= w) {\r\n //初始的 attachCorner, popupCorner 就能够提供足够的宽度\r\n return;\r\n }\r\n\r\n //$popup 的宽度大于 要求的挂靠点,需要在 cs 中寻找一个可用尺寸最大的挂靠点。\r\n const c = corners.sort((a,b) => b.width! - a.width!)[0]!;\r\n if (ow <= c.width!) {\r\n this.#popupCorner = c.popupCorner;\r\n this.#attachCorner = c.attachCorner;\r\n return;\r\n }\r\n\r\n //执行到这里说明:根据挂靠点没有一个有足够的宽度,但是popup本身却小于窗口宽度,为了能够完整显示直接计算 left/right\r\n let ret = 0;\r\n if (c.popupCorner < 10) {\r\n //$popup 用 left 去挂靠,向左移动一点,让 right 露出来\r\n ret = dde.clientWidth - ow;\r\n }\r\n else {\r\n //$popup 用 right 挂靠,向右移动一点,让头露出来。\r\n }\r\n return ret;\r\n }\r\n\r\n /**\r\n * 注释参考:#calcVertialCornerAndSpace\r\n * @returns \r\n */\r\n #calcHorizontalCornerAndSpace(): CornerPair[] {\r\n const corners = this.#calcHorizontalCorner();\r\n\r\n //开始计算\r\n const rect = this.$attachTo.getBoundingClientRect();\r\n for (const c of corners) {\r\n this.#calcHorizontalSpace(c, rect);\r\n }\r\n return corners;\r\n }\r\n\r\n /**\r\n * 注释参考:#calcVerticalCorner\r\n * @returns\r\n */\r\n #calcHorizontalCorner(): CornerPair[] {\r\n //先把 4 种组合生成,即 attach-popupCorner 和 popupCorner 的个位数都不变,只改变十位数。\r\n // % 10 === 0 代表 top 否则就是 bottom。\r\n\r\n const pc = this.#popupCorner;\r\n const cornersOfPopup: Corner[] = pc % 10 === 0 ? [0,10]: [1,11];\r\n const ac = this.#attachCorner;\r\n const cornersOfAttach: Corner[] = ac % 10 === 0 ? [0,10]: [1,11];\r\n\r\n let four: CornerPair[] = [];\r\n for (const popupCorner of cornersOfPopup) {\r\n for (const attachCorner of cornersOfAttach) {\r\n four.push({popupCorner, attachCorner});\r\n }\r\n }\r\n\r\n //判断是否同侧,都是top或者都是bottom,这种情况下会发生重叠。\r\n if (pc % 10 === ac % 10) {\r\n //根据原来的设置是否发生重叠来排除无需计算的组合。\r\n if (pc === ac) {\r\n //原来就是重叠的,所以排除不重叠的\r\n four = four.filter(f => f.popupCorner === f.attachCorner);\r\n }\r\n else {\r\n //排除重叠的\r\n four = four.filter(f => f.popupCorner !== f.attachCorner);\r\n }\r\n }\r\n return four;\r\n }\r\n\r\n /**\r\n * 注释参考:#calcVerticalSpace\r\n * @param {popupCorner, attachCorner} cs \r\n */\r\n #calcHorizontalSpace(cs: CornerPair, attachToRect: DOMRect) {\r\n const dde = document.documentElement;\r\n const x = attachToRect.x;\r\n\r\n if (cs.popupCorner < 10) {\r\n //$popup 用 left 去挂靠\r\n if (cs.attachCorner < 10) {\r\n //也是 left\r\n cs.width = dde.clientWidth - x;\r\n }\r\n else {\r\n //right\r\n cs.width = dde.clientWidth - (x + attachToRect.width);\r\n }\r\n }\r\n else {\r\n //$popup 用 right 去挂靠\r\n if (cs.attachCorner < 10) {\r\n //是 left\r\n cs.width = x;\r\n }\r\n else {\r\n cs.width = x + attachToRect.width;\r\n }\r\n }\r\n }\r\n}\r\n","type CustomElement = {\r\n tagName: string, \r\n style?: CSSStyleSheet\r\n mutableAttributes?: readonly string[],\r\n\r\n /**\r\n * 必须在 mutableAttributes 不为空时才有效。\r\n * key 是 mutableAttributes 中的一员,value 是组件的属性名称(数组)\r\n */\r\n copyAttributes?: Record<string, string | string[]>\r\n};\r\nexport function defineElement(ele: CustomElement) {\r\n return function(constructor: CustomElementConstructor, ctx: ClassDecoratorContext) {\r\n ctx.addInitializer(function () {\r\n defineCustomElement(constructor, ele);\r\n });\r\n }\r\n}\r\nfunction defineCustomElement(constructor: CustomElementConstructor, ele: CustomElement) {\r\n const tagName = ele.tagName.toLowerCase();\r\n if (customElements.get(tagName)) {\r\n throw new Error(tagName + ' already defined');\r\n }\r\n\r\n if (ele.mutableAttributes) {\r\n observedAttributes(constructor, ele.mutableAttributes, ele.copyAttributes);\r\n }\r\n\r\n customElements.define(tagName, constructor);\r\n\r\n if (ele.style) {\r\n document.adoptedStyleSheets.push(ele.style);\r\n }\r\n}\r\n/**\r\n * observedAttributes 和 attributeChangedCallback 都必须在 customElements.define() 之前就定义好。\r\n * 其中 observedAttributes 在 customElements.define() 中就会被调用。\r\n */\r\nfunction observedAttributes(constructor: CustomElementConstructor, mutableAttributes: readonly string[], copyAttributes?: Record<string, string | string[]>) {\r\n Reflect.set(constructor, 'observedAttributes', mutableAttributes); //static get() 不是必须的!\r\n\r\n if (!constructor.prototype.attributeChangedCallback) {//033-tooltip.ts 中 Tooltip 就有自己的 attributeChangedCallback\r\n constructor.prototype.attributeChangedCallback = attributeChangedCallback;\r\n }\r\n\r\n if (copyAttributes) {\r\n for (const p in copyAttributes) {\r\n if (!mutableAttributes.includes(p)) { \r\n throw new Error(`${constructor.name} 的属性 ${p} 不属于 mutableAttributes。`);\r\n }\r\n }\r\n\r\n //为了在 attributeChangedCallback 中实现属性复制\r\n Reflect.set(constructor, staticCopyAttributesProperty, copyAttributes);\r\n }\r\n}\r\n\r\n// #region 属性复制\r\nconst staticCopyAttributesProperty = 'gzmCopyAttributes';\r\n\r\nfunction getAttributeSetHandlerName(name: string) : string {\r\n return '_' + name.replaceAll('-', '_') + '_set';\r\n}\r\n\r\n/**\r\n * \r\n * @param this - 指向 HTML 元素对象\r\n * @param name \r\n * @param oldValue \r\n * @param newValue \r\n */\r\nfunction attributeChangedCallback(this: HTMLElement, name: string, oldValue: string | null, newValue: string | null): void {\r\n if (staticCopyAttributesProperty in this.constructor) {\r\n const cas = this.constructor[staticCopyAttributesProperty] as Record<string, string | string[]>;\r\n if (cas) {\r\n if (name in cas) {\r\n const ele = cas[name];\r\n if (ele) {\r\n doCopyAttributes.call(this, name, newValue, ele);\r\n }\r\n }\r\n }\r\n }\r\n\r\n const funcName = getAttributeSetHandlerName(name);\r\n const func = Reflect.get(this, funcName);\r\n if (typeof func === 'function') {\r\n func.call(this, newValue, oldValue); //99.9% 情况下只需要 newValue\r\n }\r\n}\r\n\r\n/**\r\n * \r\n * @param this - 指向 HTML 元素对象\r\n * @param attr \r\n * @param ele \r\n */\r\nfunction doCopyAttributes(this: HTMLElement, attr: string, newValue: string | null, ele: string | string[]) {\r\n ele = typeof(ele) === 'string' ? [ele] : ele; \r\n for(const e of ele) {\r\n const $ele = Reflect.get(this, e) as HTMLElement;\r\n if ($ele) {\r\n if (newValue === null) { // === null,说明调用了 removeAttribute\r\n $ele.removeAttribute(attr);\r\n }\r\n else {\r\n $ele.setAttribute(attr, newValue);\r\n }\r\n }\r\n }\r\n}\r\n// #endregion\r\n\r\n//#region 组件定义属性变化函数的时候总是忘记参数的类型是 string | null,而不只是 string\r\n\r\n/**\r\n * 模拟 string.replaceAll() 方法\r\n */\r\ntype ReplaceAll<Str extends string, From extends string, To extends string> = \r\n From extends \"\" ? Str : \r\n Str extends `${infer Prefix}${From}${infer Suffix}` ? `${Prefix}${To}${ReplaceAll<Suffix, From, To>}` : Str;\r\n\r\n/**\r\n * 模拟 getAttributeSetHandlerName(name) 的逻辑\r\n */\r\ntype GetAttributeSetHandlerName<Name extends string> = `_${ReplaceAll<Name, '-', '_'>}_set`;\r\n\r\n/**\r\n * 对于每一个有 mutableAttributes 的组件,都必须实现下面这个类型。\r\n * 其中 T 是 typeof mutableAttributes[number]\r\n * 如果同时也有 copyAttributes,那么需要排除 copyAttributes 中的属性:\r\n * Exclude<typeof mutableAttributes[number], keyof typeof copyAttributes>。\r\n * 050-tree.ts 就是这么做到。\r\n */\r\nexport type AttributeHandlers<T extends string> = {\r\n [K in T as GetAttributeSetHandlerName<K>]: <P extends string>(nv: P | null, ov: P | null) => void;\r\n}\r\n//#endregion","/**\r\n * 防抖\r\n * @param func \r\n * @param wait \r\n * @returns \r\n */\r\nexport function debounce<T extends (...args: unknown[]) => unknown>(func: T, wait: number = 200): (...args: Parameters<T>) => void {\r\n let timeout: number | null = null;\r\n \r\n return function(this: unknown, ...args: Parameters<T>) {\r\n if (timeout) clearTimeout(timeout);\r\n timeout = window.setTimeout(() => {\r\n timeout = null;\r\n func.apply(this, args);\r\n }, wait);\r\n };\r\n}\r\n\r\n/**\r\n * 生成一个随机 ID 字符串,极大概率唯一\r\n * @returns \r\n */\r\nexport function generateId() : string {\r\n //36 进制(用 0-9 + a-z 共 36 个字符表示,是 JavaScript 支持的最大进制)\r\n return Math.random().toString(36).slice(2);\r\n //return crypto.randomUUID();\r\n}","//#region 全局文本\r\nconst zh = {\r\n close: '关闭',\r\n true: '✔️',\r\n false: '❌',\r\n undefined: '未定义',\r\n default: '默认',\r\n valueMissing: '请填写此字段。', //input 验证 required 的默认错误信息。\r\n count: '计数',\r\n min: '最小',\r\n max: '最大',\r\n sum: '合计',\r\n avg: '平均',\r\n hide: '隐藏',\r\n del: '删除',\r\n asc: '升序',\r\n desc: '降序',\r\n ok: '确定',\r\n cancel: '取消',\r\n waiting: '正在处理中,请稍候...',\r\n confirming: '请确认:{0} ?',\r\n completed: '已完成',\r\n error: '错误',\r\n attention: '注意',\r\n noMenuSet: '未设置菜单!?',\r\n readonly: '只读',\r\n} as const; //必须,这样下面的 TextProxy<T> 才能正确标注,T 就是 (typeof zh)。\r\nconst en = {\r\n true: '✔️',\r\n false: '❌',\r\n valueMissing: 'Please fill in this field.', //input 验证 required 的默认错误信息。\r\n del: 'delete',\r\n asc: 'ascending',\r\n desc: 'descending',\r\n waiting: 'Processing, please wait...',\r\n confirming: 'Please confirm: {0} ?',\r\n noMenuSet: 'No menu to display!?',\r\n} as unknown as typeof zh; //必须,否则无法匹配 createText() 的参数类型 Record<string, typeof zh>\r\nexport const globalTexts = {zh, en};\r\n//#endregion\r\n\r\n//#region Proxy\r\n/**\r\n * 如果一个 lang 属性的元素都没有找到,那么就默认是中文。\r\n */\r\nconst defaultLangChain = ['zh'];\r\n\r\ntype LangTexts = {[lang: string]: {[prop: string]: string}};\r\n\r\n//两个数组中的项都是优先级高的在前面\r\ntype ProxyTarget = {\r\n texts: LangTexts[], \r\n\r\n /**\r\n * 下面两个至少要有一个,如果设置了 langs,那么 $ele 就没有用了。\r\n * $ele 用于读取其(以及上级元素)的 lang 属性,因为生成 Proxy 的时候 $ele 可能 isConnected = false,也就是只能使用 <html>.lang。\r\n * 所以当 connectedCallback() 之后,读取一次实际的 lang。\r\n * 不过也只读取一次,也就是说之后 lang 属性被修改了,是不会再次读取的。且 ui 中已经生成的文本也不会改变!\r\n */\r\n langs?: string[],\r\n $ele?: HTMLElement,\r\n};\r\n\r\nconst bindHtmlElement = 'bindHtmlElement';\r\ntype BindableTextProxy = {\r\n [bindHtmlElement]: <P>(this: P, $ele: HTMLElement) => P;\r\n};\r\nfunction getTargetTxt(target: ProxyTarget, property: string, receiver: unknown) \r\n : string //基本的纯文本\r\n | ((...args: unknown[]) => string) //带有参数的合成文本\r\n | BindableTextProxy[typeof bindHtmlElement]\r\n{\r\n if (property === bindHtmlElement) {\r\n return function<P>(this: P, $ele: HTMLElement) {\r\n target.$ele = $ele;\r\n target.langs = void 0;\r\n return receiver as P;\r\n };\r\n }\r\n\r\n let {langs, $ele} = target;\r\n if (!langs) {\r\n if ($ele) {\r\n if ($ele.isConnected) {\r\n $ele = findLangElement($ele);\r\n if ($ele) {\r\n langs = target.langs = createLangArray($ele.lang);\r\n target.$ele = void 0;\r\n }\r\n }\r\n }\r\n }\r\n langs ??= defaultLangChain;\r\n const texts = target.texts;\r\n\r\n for (let i = 0; i < langs.length; i++) {\r\n const lang = langs[i];\r\n if (!lang) {\r\n continue;\r\n }\r\n for (let j = 0; j < texts.length; j++) {\r\n const txt = texts[j];\r\n if (!txt) {\r\n continue;\r\n }\r\n if (lang in txt) {\r\n const langTxts = txt[lang];\r\n if (langTxts && property in langTxts) {\r\n let ret = langTxts[property];\r\n if (ret) {\r\n if (!ret.includes('{0}')) {\r\n return ret;\r\n }\r\n return (...args: unknown[]): string => {\r\n args = args.flat();\r\n for (let i = 0; i < args.length; i++) {\r\n const a = args[i];\r\n const r = \"{\" + i + \"}\";\r\n ret = ret!.replaceAll(r, String(a));\r\n }\r\n return ret!;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return property;\r\n}\r\n//#endregion\r\n\r\n//#region 生成文本\r\ntype IncludesCurlyZero<T extends string> = T extends `${string}{0}${string}` ? (...args: unknown[]) => string : string;\r\ntype TextProxy<T> = {\r\n [K in keyof T]: T[K] extends string ? IncludesCurlyZero<T[K]> : never;\r\n}; //& Record<string, string>;//Record<,> 用于 [] 动态调用属性\r\ntype GlobalTextProxy = TextProxy<typeof zh>;//注意其中 confirming 的类型是函数。\r\ntype JoinedText<T extends Record<string, unknown>[]> = \r\n T extends [Record<string, infer First>, ...infer Rest]\r\n ? TextProxy<First> & JoinedText<Rest extends Record<string, unknown>[] ? Rest : []>\r\n : unknown; \r\n\r\nexport function createText<T extends Record<string, unknown>[]>(this: unknown, ...txts: T): JoinedText<T> & BindableTextProxy {\r\n /**\r\n * 虽然可以通过 .call(this) 传入 this 参数,但是此函数的返回类型是由传入类型决定的。\r\n * 用 .call(this) 会丢失传入参数的类型,因此无法得到希望的返回类型!\r\n */\r\n const target: ProxyTarget = {\r\n texts: txts.filter(t => t).map(t => t as LangTexts),\r\n };\r\n if (document.documentElement.lang) {\r\n //暂时用网页定义的 lang,如果之后调用了 bindHtmlElement() 再修改。\r\n target.langs = createLangArray(document.documentElement.lang);\r\n }\r\n return new Proxy(target, {\r\n get: getTargetTxt\r\n }) as unknown as JoinedText<T> & BindableTextProxy;\r\n}\r\nexport const GT: GlobalTextProxy = createText(globalTexts);\r\n\r\n/**\r\n * 如果 lang='zh-CN',返回 ['zh-CN', 'zh']\r\n * @param {*} lang \r\n * @returns 返回一个数组,定义最明确(-最多的)的放在前面\r\n */\r\nfunction createLangArray(lang: string): string[] {\r\n if (!lang) {\r\n return defaultLangChain;\r\n }\r\n const sa = lang.split('-');\r\n const ret = [lang];\r\n for (let i = sa.length - 1; i > 0; i--) {\r\n const tmp = sa.slice(0, i); //https://devdocs.io/javascript/global_objects/array/slice\r\n ret.push(tmp.join('-'));\r\n }\r\n return ret;\r\n}\r\n\r\n/**\r\n * 查找定义了 lang 的元素,一般网页的 <html> 上定义,所以需要向上追溯。\r\n * 会追溯到 <html>\r\n */\r\nfunction findLangElement($ele: Element): HTMLElement | undefined {\r\n if ($ele instanceof HTMLElement && $ele.lang) return $ele;\r\n\r\n if (!$ele.isConnected) return findLangElement(document.body);\r\n\r\n const $p = $ele.closest('*[lang]');\r\n if ($p instanceof HTMLElement && $p.lang) {\r\n return $p;\r\n } \r\n \r\n const sr = $ele.getRootNode();\r\n if (sr instanceof ShadowRoot) {\r\n return findLangElement(sr.host);\r\n }\r\n \r\n return void 0;\r\n}\r\n//#endregion","export type Rules = {[prop: string]: string }\r\nexport type Style = {[selector: string]: Rules | string }\r\n\r\n//todo: 以后尝试: https://styled-components.com/docs\r\n\r\nexport function createStyleSheet(style: Style): CSSStyleSheet {\r\n const sheet = new CSSStyleSheet();\r\n for (const selector in style) {\r\n const rules = style[selector];\r\n if (typeof rules === 'string') {\r\n //rules 本身不要 {},以方便两套 rules 合并在一起。\r\n sheet.insertRule(`${selector} { ${rules} }`);\r\n }\r\n else if (rules) {\r\n const ruleStr = formatRules(rules);\r\n sheet.insertRule(`${selector} { ${ruleStr} }`);\r\n }\r\n }\r\n return sheet;\r\n}\r\nfunction formatRules(rules: Rules): string {\r\n let ruleStr = '';\r\n for (const prop in rules) {\r\n ruleStr += `${prop}: ${rules[prop]}; `;\r\n }\r\n return ruleStr;\r\n}\r\nexport function getElementRules(tagName: string, ...ruleNames: string[]): Rules {\r\n const $ele = document.createElement(tagName);\r\n document.body.append($ele);\r\n const cs = getComputedStyle($ele);\r\n\r\n const ret: Rules = {};\r\n ruleNames.forEach(x => {\r\n if (x in cs) {\r\n ret[x] = Reflect.get(cs, x);\r\n }\r\n });\r\n\r\n $ele.remove();\r\n return ret;\r\n}\r\n\r\n/* <button> <input> 有 disabled 属性,能够匹配 :disabled 伪类选择器,\r\n但是自定义元素 <gzm-btn-click> 即使添加了 disabled 属性,仍然无法匹配 :disabled 伪类选择器。\r\n所以这里使用 [disabled],而不是 :disabled。\r\n另外 display:contents 元素添加 disabled 属性后,样式效果不明显,所以加上 >* 让其子元素也变灰并禁止点击。\r\n*/\r\nconst disabledStyle = {\r\n '[disabled], [disabled]>*': `\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n pointer-events: none;\r\n user-select: none;\r\n `\r\n};\r\n\r\n/**\r\n * 主要是字体的设置,应该作为网页 reset 的一部分。\r\n * 不设置 :host 的字体,具体请看 style-font.md\r\n * 因为此项目开发的是组件,所以用不到。\r\n * \r\n * 以下内容是通过 tailwind.css 获得,具体方法;\r\n * 访问:/try/tailwind/test.html,在浏览器开发工具的源代码选中 /src/style.css\r\n *//*\r\nconst reset = {\r\n html: `\r\n tab-size: 4;\r\n line-height: 1.5;\r\n -webkit-text-size-adjust: 100%;\r\n -webkit-tap-highlight-color: transparent;\r\n font-family: var(--default-font-family, ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\");\r\n font-feature-settings: var(--default-font-feature-settings, normal);\r\n font-variation-settings: var(--default-font-variation-settings, normal);\r\n `,\r\n 'button, input, select, optgroup, textarea, ::file-selector-button': `\r\n font: inherit;\r\n font-feature-settings: inherit;\r\n font-variation-settings: inherit;\r\n letter-spacing: inherit;\r\n color: inherit;\r\n border-radius: 0;\r\n background-color: transparent;\r\n opacity: 1;\r\n `\r\n};*/\r\n\r\n/**\r\n * 从 dist/assets/index.css 中提取的样式。\r\n * 找到其中的 @layer base,然后开始做减法。\r\n * 1 - 去掉不用的伪类,如 ::file-selector-button, ::-webkit-*。\r\n * 2 - 去掉具体的 tag 定义,如 hr, h1-6, button, 因为多半用不到。\r\n */\r\nexport const baseStyle = createStyleSheet({\r\n '*, :after, :before, ::backdrop': `\r\n box-sizing: border-box;\r\n border: 0 solid;\r\n margin: 0;\r\n padding: 0;\r\n `,\r\n \r\n //因其语义价值成为强调内容的优先选择\r\n strong: `\r\n font-weight: bolder;\r\n `,\r\n\r\n //适用于语义化标注次要内容。默认字体大小为16px,75%=12px,也是能够正常显示的最小字体。\r\n small: `\r\n font-size: 75%;\r\n `,\r\n \r\n '[hidden]:where(:not([hidden=\"until-found\"]))': `\r\n display: none !important;\r\n `,\r\n\r\n //这个不属于 base,但我认为有用\r\n ...disabledStyle,\r\n});\r\n\r\nexport const gzmHeader = `\r\n background: var(--gzm-header-background);\r\n border: var(--gzm-header-border);\r\n color: var(--gzm-header-txt-color);\r\n`;\r\nexport const gzmFrame = `\r\n background: var(--gzm-content-background);\r\n color: var(--gzm-content-txt-color);\r\n border-radius: 0.5rem;\r\n border: var(--gzm-btn-border);\r\n padding: 0.5rem;\r\n`;\r\nexport const utilityStyle = createStyleSheet({\r\n '.gzm-frame': gzmFrame,\r\n '.gzm-header': gzmHeader,\r\n\r\n //txt-btn\r\n '.gzm-txt-btn': {\r\n cursor: 'pointer',\r\n 'font-weight': 'bolder',\r\n 'border-radius': '0.25rem',\r\n 'padding-inline': '0.25rem',\r\n 'white-space': 'nowrap',\r\n background:'transparent',\r\n color: 'inherit',\r\n 'font-size': 'inherit',\r\n 'outline-offset': '-1px',//当按钮所在父元素的padding不够,导致outline无法全部显示出来。\r\n },\r\n '.gzm-txt-btn:hover': {\r\n color:'var(--gzm-h-btn-txt-color)',\r\n outline:'var(--gzm-h-btn-border)',\r\n background:'var(--gzm-h-btn-background)',\r\n },\r\n '.gzm-txt-btn:active': {\r\n color:'var(--gzm-a-btn-txt-color) !important',\r\n outline:'var(--gzm-a-btn-border) !important',\r\n background:'var(--gzm-a-btn-background) !important',\r\n },\r\n\r\n //直接在 document 中使用 gzm-btn-*,且 disabled = true 时,靠这个生效\r\n ...disabledStyle,\r\n});\r\n//对于 SPA 而言,总有一个 root 组件,这个 root 组件替代了网页,utility 需要添加到 root 组件中去。\r\n//document.adoptedStyleSheets.push(utility);\r\n\r\nexport function createTxtBtn(txt: string) {\r\n const $btn = document.createElement('button');\r\n $btn.type = 'button';\r\n $btn.className = 'gzm-txt-btn';\r\n $btn.textContent = txt;\r\n return $btn;\r\n}\r\nexport function isTxtBtn($btn: HTMLElement): boolean {\r\n return $btn.classList.contains('gzm-txt-btn');\r\n}","import * as CSS from './style';\r\n\r\nconst defaultTheme: CSS.Style = {\r\n ':root': `\r\n --gzm-border-color: rgb(197,197,197);\r\n\r\n --gzm-btn-background: rgb(246,246,246);\r\n --gzm-btn-border: 1px solid var(--gzm-border-color);\r\n --gzm-btn-txt-color: rgb(69,69,69);\r\n\r\n --gzm-h-btn-background: rgb(237,237,237);\r\n --gzm-h-btn-border: 1px solid rgb(204,204,204);\r\n --gzm-h-btn-txt-color: rgb(43,43,43);\r\n\r\n --gzm-a-btn-background: rgb(0,127,255);\r\n --gzm-a-btn-border: 1px solid rgb(0,62,255);\r\n --gzm-a-btn-txt-color: rgb(255,255,255);\r\n\r\n --gzm-header-background: rgb(233,233,233);\r\n --gzm-header-border: 1px solid rgb(221,221,221);\r\n --gzm-header-txt-color: rgb(51,51,51);\r\n\r\n --gzm-background-color: rgb(255,255,255);\r\n\r\n --gzm-content-background: var(--gzm-background-color);\r\n --gzm-content-txt-color: rgb(51,51,51);\r\n\r\n --gzm-error-txt-color: #d34d17;\r\n\r\n --gzm-badge-background: rgb(253,223,223);\r\n --gzm-badge-txt-color: rgb(95,63,63);\r\n \r\n --gzm-shadow-color: rgb(102,102,102);\r\n\r\n --gzm-corner-shadow-11:-7px -7px 7px var(--gzm-shadow-color);\r\n --gzm-corner-shadow-0:7px 7px 7px var(--gzm-shadow-color);\r\n --gzm-corner-shadow-10:-7px 7px 7px var(--gzm-shadow-color);\r\n --gzm-corner-shadow-1:7px -7px 7px var(--gzm-shadow-color);\r\n\r\n --gzm-shadow-top: drop-shadow(0px -2px 4px var(--gzm-shadow-color));\r\n --gzm-shadow-left: drop-shadow(-2px 0px 4px var(--gzm-shadow-color));\r\n --gzm-shadow-right: drop-shadow(2px 0px 4px var(--gzm-shadow-color));\r\n --gzm-shadow-bottom: drop-shadow(0px 2px 4px var(--gzm-shadow-color));\r\n\r\n --gzm-switch-background: #999;\r\n --gzm-switch-check-background: #67c93d;\r\n `,\r\n ':root dialog::backdrop': `\r\n background: rgb(170,170,170);\r\n opacity: 0.8;\r\n `\r\n};\r\ndocument.adoptedStyleSheets.push(CSS.createStyleSheet(defaultTheme));\r\n\r\nconst themeLocalStorageKey = 'gzm-ui-basic-theme';\r\nexport const htmlThemeAttr = 'gzm-theme'; //<html> 中控制主题的属性\r\n\r\nexport const allThemes: {readonly name:string, readonly label:string}[] = [];\r\n\r\nexport function getCurrentTheme(): string {\r\n return localStorage.getItem(themeLocalStorageKey) ?? '';\r\n /* 其他主题总是在此模块之后装载,而 getCurrentTheme() 在此模块就会被调用,所以不要检查。\r\n if (ret) {\r\n if (allThemes.some(theme => theme.name === ret)) {\r\n return ret;\r\n }\r\n }\r\n return '';*/\r\n}\r\nexport function setCurrentTheme(themeName: string): boolean { \r\n if (themeName && !allThemes.some(theme => theme.name === themeName)) {\r\n return false;\r\n }\r\n localStorage.setItem(themeLocalStorageKey, themeName);\r\n document.documentElement.setAttribute(htmlThemeAttr, themeName);\r\n return true;\r\n}\r\n\r\n//网页加载时执行\r\nconst ct = getCurrentTheme();\r\nif (ct) {\r\n //网页中可能写了 <html gzm-theme=\"xxx\"></html>,所以不要用默认的主题来覆盖网页中的设置。\r\n document.documentElement.setAttribute(htmlThemeAttr, ct);\r\n}\r\n\r\n//一个console网页设置了主题,其他console网页也会跟着变化\r\nwindow.addEventListener('storage', (event: StorageEvent) => {\r\n if (event.key === themeLocalStorageKey && event.newValue) {\r\n document.documentElement.setAttribute(htmlThemeAttr, event.newValue);\r\n }\r\n});","import * as ELE from '../000-helper/element';\r\nimport * as CSS from '../000-helper/style';\r\nimport * as ATR from '../000-helper/attr';\r\n\r\nexport const tagName = 'GZM-BADGE';\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [tagName]: Badge;\r\n }\r\n}\r\n\r\nconst styleSheet = CSS.createStyleSheet({\r\n ':host': `\r\n height: 1rem;\r\n border-radius: 50%;\r\n padding: 0 0.25rem !important;\r\n\r\n color: var(--gzm-badge-txt-color);\r\n background: var(--gzm-badge-background);\r\n\r\n line-height: 1rem;\r\n\r\n font-family: PingFang SC, Microsoft YaHei, Hiragino Sans GB, Heiti SC, sans-serif;\r\n font-size: 0.75rem;\r\n font-weight: bolder;\r\n `,\r\n});\r\nconst cornerStyleSheet = CSS.createStyleSheet({\r\n ':host': `\r\n transform: translate(33%, -33%);\r\n position: absolute;\r\n top: 0px;\r\n right: 0px;\r\n z-index: 1;\r\n `\r\n});\r\nconst mutableAttributes = ['badge', 'corner'] as const;\r\n\r\n@ELE.defineElement({tagName, mutableAttributes})\r\nexport class Badge extends HTMLElement implements ELE.AttributeHandlers<typeof mutableAttributes[number]> {\r\n constructor() {\r\n super();\r\n const sr = this.attachShadow({mode: 'open'});\r\n sr.adoptedStyleSheets = [CSS.baseStyle, styleSheet];\r\n }\r\n declare readonly shadowRoot: ShadowRoot;\r\n\r\n _badge_set(badge: string | null): void {\r\n this.shadowRoot.innerHTML = badge ?? '';\r\n }\r\n _corner_set(): void {\r\n this.shadowRoot.adoptedStyleSheets = this.corner ? [CSS.baseStyle, styleSheet, cornerStyleSheet] : [CSS.baseStyle, styleSheet];\r\n }\r\n\r\n @ATR.strAttr\r\n accessor badge: string | undefined;\r\n\r\n @ATR.boolAttr\r\n accessor corner: boolean | undefined;\r\n}","import * as ELE from '../000-helper/element';\r\nimport * as CSS from '../000-helper/style';\r\nimport * as ATR from '../000-helper/attr';\r\n\r\nexport const tagName = 'GZM-CLOSE-BTN';\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [tagName]: CloseBtn;\r\n }\r\n}\r\n\r\nconst styleSheet = CSS.createStyleSheet({\r\n ':host': `\r\n font-family: ui-sans-serif, system-ui, sans-serif;\r\n font-size: 0.75rem;\r\n font-weight: bold;\r\n line-height: 1rem;\r\n display: inline-block;\r\n `,\r\n div: `\r\n border-radius: 9999px;\r\n padding-inline: 0.25rem;\r\n padding-block: 0px;\r\n `, \r\n [`div:hover`]: {\r\n color: 'var(--gzm-badge-txt-color)',\r\n background: 'var(--gzm-badge-background)',\r\n cursor: 'pointer',\r\n },\r\n});\r\nconst cornerStyleSheet = CSS.createStyleSheet({\r\n ':host': `\r\n position: absolute;\r\n right: 0px;\r\n top: 0px;\r\n `\r\n});\r\n\r\nconst mutableAttributes = ['corner'] as const;\r\n\r\n@ELE.defineElement({tagName, mutableAttributes})\r\nexport class CloseBtn extends HTMLElement implements ELE.AttributeHandlers<typeof mutableAttributes[number]> {\r\n constructor() {\r\n super();\r\n const root = this.attachShadow({mode: 'open'});\r\n root.adoptedStyleSheets = [CSS.baseStyle, styleSheet];\r\n root.innerHTML = '<div>\\u2573</div>';\r\n }\r\n declare readonly shadowRoot: ShadowRoot;\r\n\r\n // #region 属性\r\n _corner_set(): void {\r\n this.shadowRoot.adoptedStyleSheets = this.corner ? [CSS.baseStyle, styleSheet, cornerStyleSheet] : [CSS.baseStyle, styleSheet];\r\n }\r\n \r\n @ATR.boolAttr\r\n accessor corner: boolean | undefined;\r\n // #endregion\r\n}","/*\r\n 这个 icon 的功能有 2 个:\r\n 1 - 识别图片的格式,并自动显示:unicode 字符、各种图片、SVG 图片。\r\n 其中图片和 SVG 图片又分为 url 路径和 data/image 两种情况。\r\n 2 - 自动适应文字的高度\r\n 例如:如果文字是 16px 高,那么 icon 也会是 16px 高。\r\n 如果文字是 20px 高,那么 icon 也会是 20px 高。\r\n*/\r\n\r\nexport const iconCache: {[key: string]: string | HTMLImageElement /*| SVGSymbolElement*/} = {\r\n};\r\n","import * as ELE from '../000-helper/element';\r\nimport * as ATR from '../000-helper/attr';\r\nimport * as CSS from '../000-helper/style';\r\nimport { iconCache } from './iconCache';\r\n\r\nconst style = CSS.createStyleSheet({\r\n //防止网页中没有定义这些字体。如'⚙'在没有 Emoji 字体加持的情况下,显示非常难看。\r\n //默认不要 inline-block,选中一行包含 icon 的文字时,可以看出明显区别。\r\n ':host': `\r\n /*display: inline-block;*/\r\n font-family: \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\r\n `,\r\n //height - 相对于父元素的字体高度,这是关键!\r\n 'img, svg' : `\r\n width: 1em;\r\n height: 1em;\r\n vertical-align: middle;\r\n color: inherit;\r\n `,\r\n});\r\n\r\nexport const tagName = 'GZM-ICON';\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [tagName]: Icon;\r\n }\r\n}\r\nconst mutableAttributes = ['icon'] as const;\r\n@ELE.defineElement({tagName, mutableAttributes})\r\nexport class Icon extends HTMLElement implements ELE.AttributeHandlers<typeof mutableAttributes[number]> {\r\n constructor() {\r\n super();\r\n const sr = this.attachShadow({ mode: 'open' });\r\n //CSS.base 中定义了 Emoji 字体,对于显示 Unicode 如 '⚙' 非常重要!\r\n sr.adoptedStyleSheets = [CSS.baseStyle, style];\r\n }\r\n declare readonly shadowRoot: ShadowRoot;\r\n\r\n #showStr(icon: string): boolean {\r\n return this.setSvg(icon) || this.setImg(icon);\r\n }\r\n public setImg(icon: string): boolean {\r\n if (icon.startsWith('data:image/') //svg 也可以用这种方式\r\n || (icon.includes('.') && icon.includes('/'))) {//用 URL 类来识别路径会将 unicode 字符也当成路径\r\n this.shadowRoot.innerHTML = `<img src=\"${icon}\" alt=\"icon\">`;\r\n return true;\r\n }\r\n return false;\r\n }\r\n public setSvg(icon: string): boolean {\r\n if (icon.startsWith('<svg ')) {\r\n this.shadowRoot.innerHTML = icon;\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n #showCache(p: string): boolean {\r\n const cache = iconCache[p];\r\n if (!cache) return false;\r\n\r\n if (typeof(cache) === 'string') {\r\n return this.#showStr(cache);\r\n }\r\n\r\n if (cache instanceof HTMLImageElement) {\r\n return this.setImg(cache.src);\r\n }\r\n\r\n return false;\r\n }\r\n\r\n #showUnicode(icon: string): void {\r\n this.shadowRoot.textContent = icon;\r\n }\r\n\r\n // #region 属性\r\n _icon_set(icon: string | null): void {\r\n if (icon) {\r\n void (this.#showStr(icon) || this.#showCache(icon) || this.#showUnicode(icon));\r\n }\r\n else {\r\n this.shadowRoot.innerHTML = '';\r\n }\r\n }\r\n\r\n @ATR.strAttr\r\n accessor icon: string | undefined;\r\n // #endregion\r\n}","import * as ATR from '../000-helper/attr';\r\nimport * as ELE from '../000-helper/element';\r\n\r\n//以下都是基于 viewBox=\"0 0 400 400\" 的坐标系计算的。\r\nconst svg = `\r\n<svg width=\"100%\" height=\"100%\" viewBox=\"0 0 400 400\">\r\n <circle fill=\"none\" stroke=\"#68e534\" stroke-width=\"20\" cy=\"200\" cx=\"200\" r=\"190\" stroke-linecap=\"round\" transform=\"rotate(-90 200 200)\"></circle>\r\n <polyline fill=\"none\" stroke=\"#68e534\" stroke-width=\"24\" points=\"88,214 173,284 304,138\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</svg>\r\n`;\r\nconst circleLength = 1194; //圆的周长\r\nconst polylineLength = 350; //线段的长度\r\nexport const tagName = 'GZM-CHECK-CIRCLE';\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [tagName]: CheckCircle;\r\n }\r\n}\r\nconst mutableAttributes = ['size'] as const;\r\n/**\r\n * https://www.bilibili.com/video/BV17w4m1D7xi\r\n * https://devdocs.io/svg/attribute/stroke-dasharray\r\n * https://devdocs.io/svg/attribute/stroke-dashoffset\r\n */\r\n@ELE.defineElement({tagName, mutableAttributes})\r\nexport class CheckCircle extends HTMLElement implements ELE.AttributeHandlers<typeof mutableAttributes[number]> {\r\n connectedCallback() {\r\n this.#notInline();\r\n \r\n this.innerHTML = svg;\r\n this.$circle = this.querySelector('circle')!;\r\n this.$polyline = this.querySelector('polyline')!;\r\n this.#init();\r\n }\r\n\r\n $circle?: SVGCircleElement;\r\n $polyline?: SVGPolylineElement;\r\n\r\n /**\r\n * svg 是 block 元素,如果父元素 this 不是 block 元素,那么 svg 设置的 width 和 height = 100% 就无效。\r\n */\r\n #notInline() {\r\n const computedStyle = window.getComputedStyle(this);\r\n if (computedStyle.display === 'inline') {\r\n this.style.display = 'inline-block';\r\n }\r\n }\r\n\r\n #init() {\r\n const $c = this.$circle!;\r\n $c.style.strokeDasharray = circleLength.toString(); //圆的周长\r\n $c.style.strokeDashoffset = circleLength.toString(); //1194-看到的是gap(空白),0看到的是线段(线段的长度strokeDasharray等于周长,所以就是一整个圆)\r\n $c.style.transitionProperty = 'stroke-dashoffset';\r\n\r\n const $p = this.$polyline!;\r\n $p.style.strokeDasharray = polylineLength.toString(); //线段的长度\r\n $p.style.strokeDashoffset = polylineLength.toString(); //0看到的是线段,350看到的是gap(空白)\r\n $p.style.transitionProperty = 'stroke-dashoffset';\r\n }\r\n\r\n play() {\r\n const d = 3000; //动画持续时间,默认 3 秒钟。\r\n let dur = this.duration ?? d;\r\n if (dur <= 0) {\r\n dur = d;\r\n }\r\n const durCircle = Math.floor(dur / (circleLength + polylineLength) * circleLength);\r\n const durPolyline = dur - durCircle;\r\n\r\n const $c = this.$circle!;\r\n $c.style.transitionDuration = `${durCircle}ms`;\r\n const $p = this.$polyline!;\r\n $p.style.transitionDuration = `${durPolyline}ms`;\r\n\r\n return new Promise(resolve => {\r\n /**\r\n * 注意:下面这一段代码有些奇怪,需要额外解释一下:\r\n * 在015-dialog.mjs 中,showWaiting() 返回的 complete() 方法中,生成了 check-circle,然后调用 play() 方法。\r\n * 如果没有下面这行代码,那么 check-circle 会显示一个绿色的圈,但是没有动画效果,且 polyline 也不会显示。\r\n * 猜测是因为之前设置了 circle.style.strokeDashoffset 并没有起作用,所以需要强制浏览器重新计算一下。 \r\n */\r\n void window.getComputedStyle($c).strokeDashoffset;\r\n //console.log('$c transitionDuration:', computedStyle.strokeDashoffset);\r\n\r\n $c.style.strokeDashoffset = (circleLength * 2).toString(); //顺时针,设置为 0 效果是逆时针。\r\n $c.ontransitionend = () => {\r\n //console.log('circle transitionend');\r\n\r\n $p.style.strokeDashoffset = '0';\r\n $p.ontransitionend = () => {\r\n //console.log('polyline transitionend');\r\n resolve(void 0);\r\n };\r\n };\r\n });\r\n }\r\n\r\n // #region 属性\r\n @ATR.strAttr\r\n accessor size: string | undefined;\r\n\r\n @ATR.intAttr\r\n accessor duration: number | undefined;\r\n\r\n _size_set(nv: string | null) {\r\n nv = nv ?? '';\r\n this.style.width = nv;\r\n this.style.height = nv;\r\n this.style.aspectRatio = '1 / 1';\r\n }\r\n // #endregion\r\n}","import {GT} from '../000-helper/lang';\r\nimport * as CCS from '../000-helper/style';\r\n\r\nexport interface DialogOptions {\r\n reusable?: boolean;\r\n resizable?: boolean; //允许用户调整对话框大小,默认 false\r\n title?: string;\r\n movable?: boolean; //拖动标题栏,移动整个对话框\r\n $body?: HTMLElement;\r\n width?: string;\r\n height?: string;\r\n okHandler?: ($dlg: HTMLDialogElement) => void;\r\n}\r\n\r\nexport function createDialog(options: DialogOptions): HTMLDialogElement {\r\n const $dlg = document.createElement('dialog');\r\n $dlg.className = 'gzm-frame gzm-dlg';\r\n\r\n if (!options.reusable) {\r\n removeWhenClose($dlg);\r\n }\r\n if (options.resizable) {\r\n $dlg.setAttribute('resize', '');\r\n }\r\n if (options.title) {\r\n const $header = setDefaultHeader($dlg, options.title);\r\n\r\n if (options.movable) {\r\n setHeaderMovable($dlg, $header);\r\n }\r\n } \r\n if (options.okHandler) {\r\n setDefaultFooter($dlg, options.okHandler);\r\n }\r\n if (options.$body) {\r\n setBody($dlg, options.$body);\r\n }\r\n if (options.width) {\r\n $dlg.style.width = options.width;\r\n }\r\n if (options.height) {\r\n $dlg.style.height = options.height;\r\n }\r\n\r\n document.body.appendChild($dlg);\r\n return $dlg;\r\n}\r\n\r\nexport function showDockRightModalDlg(options: DialogOptions): HTMLDialogElement {\r\n const $dlg = createDialog(options);\r\n dockRight($dlg);\r\n $dlg.showModal();\r\n return $dlg;\r\n}\r\n\r\nfunction dockRight($dlg: HTMLDialogElement) {\r\n $dlg.setAttribute('dock', 'right');\r\n\r\n Reflect.set($dlg, 'slideOut', slideOutRight);\r\n \r\n $dlg.onkeydown = e => {\r\n if (e.key === 'Escape') {\r\n //console.log(e.key);\r\n e.preventDefault();// 阻止 dialog 的默认关闭行为\r\n slideOutRight.apply($dlg);\r\n }\r\n };\r\n\r\n //beforetoggle 事件只能阻止open对话框,不能阻止closed对话框,具体看:https://devdocs.io/dom/htmlelement/beforetoggle_event\r\n\r\n $dlg.ontoggle = (e: ToggleEvent) => {\r\n if (e.newState === 'open') {\r\n $dlg.style.transform = 'translateX(0)';\r\n }\r\n };\r\n}\r\n\r\nfunction slideOutRight(this: HTMLDialogElement) {\r\n this.style.transform = 'translateX(100%)';\r\n this.ontransitionend = () => {\r\n this.close();\r\n this.ontransitionend = null;\r\n }\r\n}\r\n\r\nfunction removeWhenClose($dlg: HTMLDialogElement) {\r\n $dlg.onclose = () => {\r\n $dlg.remove();\r\n }\r\n}\r\n\r\nfunction setDefaultHeader($dlg: HTMLDialogElement, dlgTitle: string): HTMLElement {\r\n let $header = $dlg.querySelector('header');\r\n if (!$header) {\r\n $header = document.createElement('header');\r\n $header.className = 'gzm-header';\r\n $dlg.appendChild($header);\r\n }\r\n $header.innerHTML = `<strong>${dlgTitle}</strong><div class='gzm-txt-btn'>✕</div>`;//没有使用 CSS.createTxtBtn() 不默认获得焦点\r\n const $closeBtn = $header.querySelector('.gzm-txt-btn')! as HTMLElement;\r\n $closeBtn.onclick = () => closeDlg($dlg);\r\n return $header as HTMLElement;\r\n}\r\n\r\nfunction setDefaultFooter($dlg: HTMLDialogElement, okHandler: (dlg: HTMLDialogElement) => void) {\r\n let $footer = $dlg.querySelector('footer');\r\n if (!$footer) {\r\n $footer = document.createElement('footer');\r\n $dlg.appendChild($footer);\r\n }\r\n else {\r\n $footer.innerHTML = '';\r\n }\r\n\r\n const $cancelBtn = document.createElement('button');\r\n $cancelBtn.textContent = GT.cancel;\r\n $cancelBtn.onclick = () => closeDlg($dlg);\r\n\r\n const $okBtn = document.createElement('button');\r\n $okBtn.textContent = GT.ok;\r\n $okBtn.onclick = () => okHandler($dlg);\r\n\r\n $footer.append($cancelBtn, $okBtn);\r\n}\r\n\r\nfunction setHeaderMovable($dlg: HTMLDialogElement, $header: HTMLElement) {\r\n $header.style.cursor = 'move';\r\n\r\n let userSelect: string;\r\n const firstMove = () => {//第一次 mousemove 时做一些清理工作\r\n if (userSelect) {\r\n return;\r\n }\r\n\r\n const style = window.getComputedStyle($dlg)\r\n userSelect = style.getPropertyValue('user-select');\r\n \r\n $dlg.style.userSelect = 'none'; //防止任何元素、文本被选中\r\n $dlg.style.margin = '0'; //对话框显示的时候默认居中,chrome 会自动设置 margin,这里要清除掉。\r\n };\r\n\r\n $header.onmousedown = (e: MouseEvent) => {\r\n const $t = e.target as Element;\r\n if ($t.classList.contains('gzm-txt-btn')) return;\r\n \r\n const rect = $dlg.getBoundingClientRect();\r\n const offsetX = e.clientX - rect.left; //鼠标点击位置相对于对话框左上角的偏移\r\n const offsetY = e.clientY - rect.top;\r\n\r\n const move = (me: MouseEvent) => {\r\n firstMove();\r\n\r\n let left = me.clientX - offsetX;\r\n left = Math.max(0, left);\r\n left = Math.min(document.documentElement.clientWidth - rect.width, left);\r\n\r\n let top = me.clientY - offsetY;\r\n top = Math.max(0, top);\r\n top = Math.min(document.documentElement.clientHeight - rect.height, top);\r\n\r\n //console.log(left, top);\r\n\r\n $dlg.style.left = left + 'px';\r\n $dlg.style.top = top + 'px';\r\n };\r\n const up = () => {\r\n document.removeEventListener('mousemove', move);\r\n document.removeEventListener('mouseup', up);\r\n \r\n if (userSelect) {\r\n $dlg.style.userSelect = userSelect;\r\n userSelect = '';\r\n }\r\n };\r\n document.addEventListener('mousemove', move);\r\n document.addEventListener('mouseup', up);\r\n };\r\n}\r\n\r\nfunction setBody($dlg: HTMLDialogElement, $body: HTMLElement) {\r\n $dlg.appendChild($body);\r\n}\r\n\r\nfunction closeDlg($dlg: HTMLDialogElement) {\r\n if ('slideOut' in $dlg && typeof $dlg.slideOut === 'function') {\r\n $dlg.slideOut();\r\n return;\r\n }\r\n $dlg.close();\r\n}\r\n\r\nconst className = '.gzm-dlg';\r\nconst styleSheet = CCS.createStyleSheet({\r\n [className]: `\r\n max-width:100vw;\r\n max-height:100vh;\r\n margin:auto;\r\n padding:0.25rem;/*gzm-frame 中有 p-2,直接放在 .dlg 中不起作用!*/\r\n `,\r\n /* resize: attr(resize, \"both\"); 可惜不起作用,否则就可以设置元素的属性来控制 */ \r\n [className + '[resize]']: `\r\n resize: both;\r\n border-bottom-right-radius: 0;/*会在右下角显示调整尺寸的句柄*/\r\n `,\r\n [className + '[dock]']: `\r\n transition-property:transform;\r\n transition-duration:750ms;\r\n margin:0;/*<dialog> 浏览器样式有 margin,会阻止 dock*/\r\n `,\r\n /*<dialog> open 才会显示,显示后才启用 grid,否则会阻止 <dialog> 关闭,因为关闭就是 display:none;*/\r\n [className + '[open]']: `\r\n display: grid;\r\n grid-template-columns: 1fr;\r\n grid-template-rows: auto 1fr auto;\r\n gap: 0.25rem;\r\n overflow: hidden;\r\n outline-style: none; /*不要显示一圈黑框*/\r\n `,\r\n [className + '[dock=right]']: `\r\n top: 0px; \r\n height: 100vh; \r\n left: auto; \r\n right: 0; \r\n transform: translateX(100%);\r\n `,\r\n [className + '>header']: `\r\n grid-row: 1;\r\n border-radius: 0.5rem; \r\n gap: 1rem;\r\n padding-inline: 1rem;\r\n padding-block: 0.5rem;\r\n display: flex;\r\n align-items: center;\r\n `,\r\n /*对话框标题*/\r\n [className + '>header>strong']: `\r\n flex: auto;\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n `,\r\n [className + '>footer']: `\r\n grid-row: -1;\r\n border-top: var(--gzm-btn-border);\r\n padding-inline: 1rem;\r\n padding-block: 0.75rem;\r\n display: flex;\r\n justify-content: space-between;\r\n `,\r\n /*footer 中的确定取消按钮*/\r\n [className + '>footer>button']: `\r\n font: inherit;\r\n line-height: inherit;\r\n color: var(--gzm-btn-txt-color);\r\n background: var(--gzm-btn-background);\r\n border: var(--gzm-btn-border);\r\n border-radius: 0.5rem;\r\n padding: 0.375rem 0.75rem;\r\n `,\r\n [className + '>footer>button:hover']: `\r\n color: var(--gzm-h-btn-txt-color);\r\n background: var(--gzm-h-btn-background);\r\n border: var(--gzm-h-btn-border);\r\n `,\r\n [className + '>footer>button:active']: `\r\n color: var(--gzm-a-btn-txt-color) !important;\r\n background: var(--gzm-a-btn-background) !important;\r\n border: var(--gzm-a-btn-border) !important;\r\n `,\r\n});\r\ndocument.adoptedStyleSheets.push(styleSheet);","import {GT} from '../000-helper/lang';\r\nimport { createDialog } from './dialog'\r\nimport * as CC from './circle';\r\n\r\nconst emojis = [\"🕛\", \"🕐\", \"🕑\", \"🕒\", \"🕓\", \"🕔\", \"🕕\", \"🕖\", \"🕗\", \"🕘\", \"🕙\", \"🕚\"];\r\n\r\nexport function showWaiting(title: string, msg?: string) {\r\n const $p = document.createElement('p');\r\n $p.style.margin = '1rem';\r\n $p.style.fontSize = 'xxx-large';\r\n $p.textContent = emojis[0]!;\r\n\r\n const $cap = document.createElement('figcaption');\r\n $cap.textContent = msg ?? GT.waiting;\r\n\r\n const $fig = document.createElement('figure');\r\n $fig.style.margin = '1rem';\r\n $fig.style.textAlign = 'center';\r\n $fig.append($p, $cap);\r\n\r\n const $dlg = createDialog({\r\n title,\r\n movable: true,\r\n $body: $fig,\r\n });\r\n $dlg.showModal();\r\n\r\n //对话框的大小默认是根据内容自动调整的,所以下面 complete/error 重新设置 cap.textContent 时会导致宽度变小。\r\n //为了防止这种情况,这里将宽度固定下来。\r\n $fig.style.width = Math.floor($fig.offsetWidth / 0.618) + 'px';\r\n\r\n let index = 0;\r\n const handle = window.setInterval(() => {\r\n if (index < 0 || !$dlg.parentElement) {\r\n window.clearInterval(handle);\r\n return;\r\n }\r\n index = (index + 1) % emojis.length;\r\n $p.textContent = emojis[index]!;\r\n }, 1000);\r\n\r\n return {\r\n $dlg,\r\n async complete(msg = GT.completed) {\r\n $cap.textContent = msg;\r\n this.setTitle(GT.completed);\r\n\r\n index = -1; //退出上面的 setInterval\r\n\r\n const $cc = document.createElement(CC.tagName);\r\n $cc.size = \"100px\";\r\n $cc.duration = 1500;\r\n $p.replaceWith($cc);\r\n\r\n await $cc.play();\r\n this.$dlg.close();\r\n },\r\n error(e: object | string = GT.error) {\r\n index = -1; //退出上面的 setInterval\r\n\r\n $p.textContent = '👮';//https://www.compart.com/en/unicode/U+1F46E\r\n\r\n if (typeof e === 'string') {\r\n $cap.textContent = e;\r\n }\r\n else if ('message' in e) {\r\n //e.toString(); 相当于 `${e.name}: ${e.message}` https://devdocs.io/javascript/global_objects/error\r\n $cap.textContent = String(e.message);\r\n }\r\n else {\r\n $cap.textContent = String(e);\r\n }\r\n $cap.style.color = 'var(--gzm-error-txt-color)';\r\n this.setTitle(GT.error);\r\n },\r\n alert(msg: string) {\r\n index = -1; //退出上面的 setInterval\r\n\r\n $p.textContent = '🙋';\r\n $cap.innerHTML = `<strong>${msg}</strong>`;\r\n this.setTitle(GT.attention);\r\n },\r\n close() {\r\n this.$dlg.close();\r\n },\r\n setTitle(title: string) {\r\n const $s = this.$dlg.querySelector(':scope > header:first-child > strong:first-child');\r\n if ($s) {\r\n $s.textContent = title;\r\n }\r\n }\r\n };\r\n}\r\nexport function showError(errMsg: string) {\r\n const $p = document.createElement('p');\r\n $p.style.margin = '1rem';\r\n $p.style.fontSize = 'xxx-large';\r\n $p.textContent = '👮';//https://www.compart.com/en/unicode/U+1F46E\r\n\r\n const $cap = document.createElement('figcaption');\r\n $cap.textContent = errMsg;\r\n $cap.style.color = 'var(--gzm-error-txt-color)';\r\n\r\n const $fig = document.createElement('figure');\r\n $fig.style.margin = '1rem';\r\n $fig.style.textAlign = 'center';\r\n $fig.append($p, $cap);\r\n\r\n const $dlg = createDialog({\r\n title: GT.error,\r\n movable: true,\r\n $body: $fig,\r\n });\r\n $dlg.showModal();\r\n return $dlg;\r\n}\r\nexport function showAlert(msg: string) {\r\n const $p = document.createElement('p');\r\n $p.style.margin = '1rem';\r\n $p.style.fontSize = 'xxx-large';\r\n $p.textContent = '🙋';\r\n\r\n const $cap = document.createElement('figcaption');\r\n $cap.innerHTML = `<strong>${msg}</strong>`;\r\n\r\n const $fig = document.createElement('figure');\r\n $fig.style.margin = '1rem';\r\n $fig.style.textAlign = 'center';\r\n $fig.append($p, $cap);\r\n\r\n const $dlg = createDialog({\r\n title: GT.attention,\r\n movable: true,\r\n $body: $fig,\r\n });\r\n $dlg.showModal();\r\n return $dlg;\r\n}\r\n"],"names":["dialogTagName","getContainer","checkPopupPosition","c","tagName","mutableAttributes","$ele","i","style","CSS.createStyleSheet","_corner_dec","_a","_init","_corner","styleSheet","cornerStyleSheet","ELE.defineElement","ATR.strAttr","ATR.boolAttr","__privateAdd","__runInitializers","CSS.baseStyle","__decoratorStart","__decorateElement","__privateMethod","ATR.intAttr","CCS.createStyleSheet","msg","CC.tagName","title"],"mappings":"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"}
|
package/package.json
CHANGED