@xihan-ui/web-components 1.1.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4706 -6
- package/README.md +10 -3
- package/custom-elements.json +36929 -19159
- package/dist/backgrounds.d.ts +7 -7
- package/dist/backgrounds.d.ts.map +1 -1
- package/dist/backgrounds.js +8 -8
- package/dist/backgrounds.js.map +1 -1
- package/dist/{config-Cz16-P4i.d.ts → config-etfwIorI.d.ts} +17 -8
- package/dist/config-etfwIorI.d.ts.map +1 -0
- package/dist/define.d.ts +8383 -4143
- package/dist/define.d.ts.map +1 -1
- package/dist/define.js +11235 -5943
- package/dist/define.js.map +1 -1
- package/dist/{element-b0p0Q8Py.js → element-BKQR3ce3.js} +4 -4
- package/dist/element-BKQR3ce3.js.map +1 -0
- package/dist/{element-DRoFjrYO.d.ts → element-DFbmhZLP.d.ts} +3 -3
- package/dist/{element-DRoFjrYO.d.ts.map → element-DFbmhZLP.d.ts.map} +1 -1
- package/dist/index.d.ts +11 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/{machine-controller-DE6edQbK.js → machine-controller-C1ffftux.js} +35 -29
- package/dist/machine-controller-C1ffftux.js.map +1 -0
- package/dist/registry-DR6I2_zF.js.map +1 -1
- package/dist/services.d.ts +184 -0
- package/dist/services.d.ts.map +1 -0
- package/dist/services.js +701 -0
- package/dist/services.js.map +1 -0
- package/dist/toast-BTlM12YF.js +1405 -0
- package/dist/toast-BTlM12YF.js.map +1 -0
- package/dist/{types-BvWWqMd_.d.ts → types-C1Bybm6P.d.ts} +2 -2
- package/dist/{types-BvWWqMd_.d.ts.map → types-C1Bybm6P.d.ts.map} +1 -1
- package/package.json +23 -17
- package/dist/config-Cz16-P4i.d.ts.map +0 -1
- package/dist/element-b0p0Q8Py.js.map +0 -1
- package/dist/machine-controller-DE6edQbK.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"services.js","names":["VERSION"],"sources":["../src/services/glyph.ts","../src/services/host.ts","../src/services/register.ts","../src/services/dialog-service.ts","../src/services/loading-bar-service.ts","../src/services/notification-service.ts","../src/services/toast-service.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 命令式服务默认模板用的装饰图形:加载弧线。\n// 纯装饰(aria-hidden),读屏内容由标题与描述承担。\n\nconst SVG_NS = 'http://www.w3.org/2000/svg'\n\n/** 旋转的加载弧线;转动动画由外层容器(如按钮的 indicator 部件)提供。 */\nexport function spinArc(size = '1em'): SVGElement {\n const svg = document.createElementNS(SVG_NS, 'svg')\n svg.setAttribute('viewBox', '0 0 16 16')\n svg.setAttribute('width', size)\n svg.setAttribute('height', size)\n svg.setAttribute('aria-hidden', 'true')\n svg.style.display = 'block'\n\n const circle = document.createElementNS(SVG_NS, 'circle')\n circle.setAttribute('cx', '8')\n circle.setAttribute('cy', '8')\n circle.setAttribute('r', '6.5')\n circle.setAttribute('fill', 'none')\n circle.setAttribute('stroke', 'currentColor')\n circle.setAttribute('stroke-width', '2')\n circle.setAttribute('stroke-linecap', 'round')\n circle.setAttribute('stroke-dasharray', '30')\n circle.setAttribute('stroke-dashoffset', '22')\n svg.appendChild(circle)\n return svg\n}\n","/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 host 相关实现。\n\nimport type { ReactiveControllerHost } from '../reactive'\nimport { DIAGNOSTIC_CODES, ensurePortalRoot, reportDiagnostic } from '@xihan-ui/core'\n\n/**\n * 命令式服务的宿主容器。未提供 target 时在浮层落点下新建一个,dispose 时连同容器一起移除。\n */\nexport function createServiceHolder(target?: HTMLElement): { holder: HTMLElement, release: () => void } {\n if (target)\n return { holder: target, release: () => {} }\n const holder = document.createElement('div')\n ensurePortalRoot(document).appendChild(holder)\n return { holder, release: () => holder.remove() }\n}\n\n/**\n * 供没有元素的状态机使用的最小反应宿主。\n *\n * 轻提示的堆叠在库中没有对应的自定义元素(堆叠位置是整个服务的口径,\n * 不是逐页各挂一份),因此队列状态机没有可依附的元素。状态机只要求宿主在状态变化时\n * 被唤醒一次,这里就只兑现这一件事:把重绘排进微任务,同一拍内的多次写入合并为一次。\n */\nexport function createServiceReactiveHost(render: () => void): ReactiveControllerHost {\n let scheduled = false\n let settle: (() => void) | null = null\n let pending: Promise<boolean> | null = null\n\n const flush = (): void => {\n scheduled = false\n const done = settle\n settle = null\n pending = null\n render()\n done?.()\n }\n\n return {\n addController: () => {},\n removeController: () => {},\n requestUpdate: () => {\n if (scheduled)\n return\n scheduled = true\n queueMicrotask(flush)\n },\n get updateComplete(): Promise<boolean> {\n if (!scheduled)\n return Promise.resolve(true)\n pending ??= new Promise<boolean>((resolve) => {\n settle = () => resolve(!scheduled)\n })\n return pending\n },\n }\n}\n\n/**\n * 服务无法建立时发一条诊断并返回 false,由调用方整体惰化。\n *\n * 这几个服务是从路由守卫、请求拦截器等位置懒建的:这些位置抛异常,\n * 后果不是提示未弹出而是整次导航失败、整站白屏。一条轻提示不应有这种权力。\n */\nexport function reportServiceFailure(service: string, error: unknown): false {\n reportDiagnostic({\n code: DIAGNOSTIC_CODES.warn,\n level: 'warn',\n message: `[xh] ${service} 的宿主没建起来,这个服务本次退化成空操作。`,\n detail: { service, error },\n })\n return false\n}\n\n/** 建一个带角色标记的节点:作者在声明式用法里手写的那一份,服务自己生成。 */\nexport function partNode<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n part: string,\n): HTMLElementTagNameMap[K] {\n const el = document.createElement(tag)\n el.dataset.xhPart = part\n return el\n}\n","/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 提供 register 相关实现。\n\nimport { version as VERSION } from '../../package.json'\nimport { XhButtonElement } from '../elements/button'\nimport { XhDialogElement } from '../elements/dialog'\nimport { XhLoadingBarElement } from '../elements/loading-bar'\nimport { XhNotificationElement, XhNotificationItemElement } from '../elements/notification'\nimport { XhToastElement } from '../elements/toast'\nimport { defineElement } from '../runtime/registry'\n\n/**\n * 服务用到的那几个元素在服务建起来时注册。\n *\n * 服务自己生成节点,作者不写标签,因此不能要求他先 import `/define`;\n * 注册表是幂等的,已经注册过的原样跳过。\n */\nexport function defineFeedbackElements(): void {\n defineElement('xh-toast', XhToastElement, VERSION)\n defineElement('xh-notification', XhNotificationElement, VERSION)\n defineElement('xh-notification-item', XhNotificationItemElement, VERSION)\n defineElement('xh-dialog', XhDialogElement, VERSION)\n defineElement('xh-button', XhButtonElement, VERSION)\n defineElement('xh-loading-bar', XhLoadingBarElement, VERSION)\n}\n","/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 全局命令式确认框服务:confirm/info/success/warning/error 一次调用弹出,\n// 自带标题徽记、正文与按钮行。同一时刻只挂一个对话框,后来的排队顺次弹出,\n// 避开多层模态叠加。onOk 返回 Promise 时确认钮自动进入 pending 并拦住关闭,\n// 失败保持打开以便重试或取消。\nimport type { Tone } from '@xihan-ui/core'\nimport type { DialogServiceBadge, DialogServiceControllerSpec, DialogServiceRequest } from '@xihan-ui/headless'\nimport type { XhButtonElement } from '../elements/button'\nimport type { XhDialogElement } from '../elements/dialog'\nimport type { AlertOptions, ConfirmOptions, DialogActionError, DialogBody, DialogService, DialogServiceOptions } from './types'\nimport { ensurePortalRoot } from '@xihan-ui/core'\nimport { createDialogServiceController, dialogServiceBadgeTone } from '@xihan-ui/headless'\nimport { spinArc } from './glyph'\nimport { partNode } from './host'\nimport { defineFeedbackElements } from './register'\n\ninterface Spec extends DialogServiceControllerSpec {\n title: string\n content?: DialogBody\n tone: Tone\n okText: string\n cancelText: string\n showCancel: boolean\n /** 标题旁的类型徽记(预设档用),confirm 不带。 */\n badge?: DialogServiceBadge\n onOk?: () => unknown\n onActionError?: (error: DialogActionError) => void | Promise<void>\n}\n\nexport function createDialogService(options: DialogServiceOptions = {}): DialogService {\n if (typeof document === 'undefined')\n throw new Error('createDialogService 需要 document;SSR 里请等到客户端再创建')\n\n const defaults = { okText: options.okText ?? 'OK', cancelText: options.cancelText ?? 'Cancel' }\n const holder = options.target ?? document.createElement('div')\n const release = (): void => {\n if (!options.target)\n holder.remove()\n }\n let hostFailure: { cause: unknown } | null = null\n try {\n defineFeedbackElements()\n if (!options.target)\n ensurePortalRoot(document).appendChild(holder)\n if (holder.nodeType !== 1 || holder.ownerDocument !== document || !holder.isConnected)\n throw new Error('DialogService target 必须是当前文档中已连接的元素')\n }\n catch (cause) {\n hostFailure = { cause }\n }\n\n const dialog = document.createElement('xh-dialog') as XhDialogElement\n // 告知类弹窗一律 alertdialog:点外面不关,得明确按一下才算读过\n dialog.setAttribute('role', 'alertdialog')\n dialog.modal = true\n\n const backdrop = partNode('div', 'backdrop')\n const positioner = partNode('div', 'positioner')\n const content = partNode('div', 'content')\n const header = partNode('div', 'header')\n // 徽记留空:那一枚字形由皮肤按 data-tone 画在伪元素上,模板不塞图形\n const indicator = partNode('div', 'indicator')\n const title = partNode('div', 'title')\n const body = partNode('div', 'body')\n const description = partNode('div', 'description')\n const errorMessage = document.createElement('p')\n errorMessage.setAttribute('role', 'alert')\n errorMessage.style.color = 'var(--xh-fg-danger)'\n errorMessage.hidden = true\n const footer = partNode('div', 'footer')\n const cancel = document.createElement('xh-button') as XhButtonElement\n const cancelRoot = partNode('button', 'root')\n const cancelLabel = partNode('span', 'label')\n const ok = document.createElement('xh-button') as XhButtonElement\n const okRoot = partNode('button', 'root')\n const okIndicator = partNode('span', 'indicator')\n const okLabel = partNode('span', 'label')\n\n header.append(indicator, title)\n body.append(description, errorMessage)\n cancelRoot.append(cancelLabel)\n cancel.append(cancelRoot)\n cancel.variant = 'ghost'\n okRoot.append(okIndicator, okLabel)\n ok.append(okRoot)\n ok.variant = 'solid'\n footer.append(cancel, ok)\n content.append(header, body, footer)\n positioner.append(content)\n dialog.append(backdrop, positioner)\n\n const controller = createDialogServiceController<Spec>({ onStateChange: () => paint() })\n\n if (!hostFailure) {\n try {\n holder.appendChild(dialog)\n }\n catch (cause) {\n hostFailure = { cause }\n release()\n }\n }\n function paintContent(): void {\n const serviceState = controller.state\n const spec = serviceState.current?.spec\n if (!spec)\n return\n title.textContent = spec.title\n indicator.hidden = spec.badge == null\n if (spec.badge)\n indicator.setAttribute('data-tone', dialogServiceBadgeTone(spec.badge))\n else\n indicator.removeAttribute('data-tone')\n // 串走 description 部件(读屏的 aria-describedby 接在它上面),\n // 渲染函数拿到正文节点自己往里写\n if (typeof spec.content === 'function') {\n description.replaceChildren()\n spec.content(description)\n }\n else {\n description.textContent = spec.content ?? ''\n }\n cancel.hidden = !spec.showCancel\n cancel.disabled = serviceState.busy\n cancelLabel.textContent = spec.cancelText\n ok.tone = spec.tone\n ok.loading = serviceState.busy\n okIndicator.replaceChildren(...(serviceState.busy ? [spinArc()] : []))\n okLabel.textContent = serviceState.busy ? `${spec.okText}…` : spec.okText\n errorMessage.hidden = serviceState.actionError === null\n errorMessage.textContent = serviceState.actionError ? options.actionErrorText ?? 'Action failed. Please try again.' : ''\n // 忙的时候 Esc 也拦住:正在提交的那一下不该被一个按键撤销\n dialog.closeOnEscape = !serviceState.busy\n }\n\n function failHost(cause: unknown): void {\n controller.fail(cause)\n }\n\n let exitRequest: DialogServiceRequest<Spec> | null = null\n let exitListener: (() => void) | null = null\n function syncExitListener(): void {\n const request = controller.state.exiting\n if (request === exitRequest)\n return\n if (exitListener)\n dialog.removeEventListener('exit-complete', exitListener)\n exitRequest = request\n exitListener = request ? () => void controller.finishExit(request) : null\n if (exitListener)\n dialog.addEventListener('exit-complete', exitListener, { once: true })\n }\n\n function paint(): void {\n try {\n paintContent()\n syncExitListener()\n dialog.open = controller.state.open\n }\n catch (cause) {\n failHost(cause)\n }\n }\n if (hostFailure)\n controller.fail(hostFailure.cause)\n\n // 元素侧的关闭(Esc 等)从这里回来:未定的一律按取消结\n const onOpenChange = (event: Event): void => {\n const detail = (event as CustomEvent<{ open: boolean }>).detail\n if (detail?.open)\n return\n controller.close(false)\n }\n dialog.addEventListener('open-change', onOpenChange)\n\n const onCancel = (): void => {\n if (!controller.state.busy)\n controller.close(false)\n }\n const onOk = (): void => {\n void controller.confirmCurrent()\n }\n cancelRoot.addEventListener('click', onCancel)\n okRoot.addEventListener('click', onOk)\n\n const alert = (badge: DialogServiceBadge, tone: Tone) => async (opts: AlertOptions): Promise<void> => {\n await controller.request({\n title: opts.title,\n content: opts.content,\n tone,\n okText: opts.okText ?? defaults.okText,\n cancelText: defaults.cancelText,\n showCancel: false,\n badge,\n onOk: opts.onOk,\n onActionError: opts.onActionError,\n })\n }\n\n return {\n get actionError() { return controller.state.actionError },\n confirm: (opts: ConfirmOptions) => controller.request({\n title: opts.title,\n content: opts.content,\n tone: opts.tone ?? 'brand',\n okText: opts.okText ?? defaults.okText,\n cancelText: opts.cancelText ?? defaults.cancelText,\n showCancel: true,\n badge: opts.badge,\n onOk: opts.onOk,\n onActionError: opts.onActionError,\n }),\n info: alert('info', 'info'),\n success: alert('success', 'success'),\n warning: alert('warning', 'warning'),\n error: alert('error', 'danger'),\n dispose: () => {\n controller.dispose()\n dialog.removeEventListener('open-change', onOpenChange)\n if (exitListener)\n dialog.removeEventListener('exit-complete', exitListener)\n cancelRoot.removeEventListener('click', onCancel)\n okRoot.removeEventListener('click', onOk)\n dialog.remove()\n release()\n },\n }\n}\n","/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 全局命令式顶部进度条:自带一个挂到浮层落点的 `<xh-loading-bar>`,\n// start/finish 在任意模块作用域可调(路由守卫、请求拦截器),不要求调用点在文档树的某一处。\n// 页面结构里的组合用法仍直接写 `<xh-loading-bar>`。\nimport type { LoadingBarServiceControllerState } from '@xihan-ui/headless'\nimport type { XhLoadingBarElement } from '../elements/loading-bar'\nimport type { LoadingBarService, LoadingBarServiceOptions } from './types'\nimport { createLoadingBarServiceController } from '@xihan-ui/headless'\nimport { createServiceHolder, partNode, reportServiceFailure } from './host'\nimport { defineFeedbackElements } from './register'\n\nexport function createLoadingBarService(options: LoadingBarServiceOptions = {}): LoadingBarService {\n if (typeof document === 'undefined')\n throw new Error('createLoadingBarService 需要 document;SSR 里请等到客户端再创建')\n\n defineFeedbackElements()\n\n const { target, tone = 'brand', errorTone = 'danger', translations, ...barProps } = options\n const { holder, release } = createServiceHolder(target)\n\n const bar = document.createElement('xh-loading-bar') as XhLoadingBarElement\n const root = partNode('div', 'root')\n const track = partNode('div', 'track')\n const range = partNode('div', 'range')\n track.appendChild(range)\n root.appendChild(track)\n bar.appendChild(root)\n\n bar.height = barProps.height\n bar.trickle = barProps.trickle\n bar.trickleSpeed = barProps.trickleSpeed\n bar.minimum = barProps.minimum\n bar.fadeDuration = barProps.fadeDuration\n bar.translations = translations\n\n let mounted = true\n try {\n holder.appendChild(bar)\n }\n catch (error) {\n mounted = reportServiceFailure('loading-bar', error)\n release()\n }\n\n const apply = (state: LoadingBarServiceControllerState): void => {\n bar.tone = state.tone\n bar.value = state.value\n bar.loading = state.pending > 0\n }\n const controller = createLoadingBarServiceController({ tone, errorTone, onStateChange: apply })\n if (!mounted)\n controller.dispose()\n\n return {\n start: controller.start,\n finish: controller.finish,\n error: controller.error,\n finishAll: controller.finishAll,\n set: controller.set,\n dispose: () => {\n controller.dispose()\n bar.remove()\n release()\n },\n }\n}\n","/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 全局命令式通知服务:自带一个挂到浮层落点的 `<xh-notification>` 与默认模板。\n//\n// 通知常常不是从某个组件里发出来的——推送连接的回调、后台任务的收尾、拦截器里的\n// 一条系统消息,调用点都在文档树之外。队列由这个元素持有,业务代码只管发。\n//\n// 队列要长在页面结构里(比如通知中心那一栏自己排版)时,直接写 `<xh-notification>`,\n// 那是另一条路,两者不共享队列。\nimport type { NotificationOptions, NotificationPlacement, ResolvedNotification } from '@xihan-ui/headless'\nimport type { XhNotificationElement, XhNotificationItemElement } from '../elements/notification'\nimport type {\n NotificationCreateOptions,\n NotificationMessageOptions,\n NotificationService,\n NotificationServiceOptions,\n} from './types'\nimport { createFeedbackServiceController, NOTIFICATION_PLACEMENT, NOTIFICATION_PLACEMENTS, resolveFeedbackServiceTitle } from '@xihan-ui/headless'\nimport { createServiceHolder, partNode, reportServiceFailure } from './host'\nimport { defineFeedbackElements } from './register'\n\nexport function createNotificationService(options: NotificationServiceOptions = {}): NotificationService {\n if (typeof document === 'undefined')\n throw new Error('createNotificationService 需要 document;SSR 里请等到客户端再创建')\n\n defineFeedbackElements()\n\n const { target, translations, ...queueProps } = options\n const { holder, release } = createServiceHolder(target)\n\n const queue = document.createElement('xh-notification') as XhNotificationElement\n const root = partNode('div', 'root')\n queue.appendChild(root)\n\n const groups = new Map<NotificationPlacement, HTMLElement>()\n const nodes = new Map<string, XhNotificationItemElement>()\n const shapes = new Map<string, string>()\n let mounted = true\n const controller = createFeedbackServiceController<NotificationOptions, Partial<NotificationOptions>>({\n name: 'notification',\n dismissOnUnmounted: false,\n onStateChange: () => render(),\n })\n\n queue.placement = queueProps.placement\n queue.max = queueProps.max\n queue.dedupe = queueProps.dedupe\n queue.gap = queueProps.gap\n queue.duration = queueProps.duration\n queue.removeDelay = queueProps.removeDelay\n queue.pauseOnPageIdle = queueProps.pauseOnPageIdle\n queue.translations = translations\n\n // 默认那一摞先建出来:group 是元素契约里的必需部件,一条通知都没有时也得在\n ensureGroup(queueProps.placement ?? NOTIFICATION_PLACEMENT).hidden = true\n\n try {\n holder.appendChild(queue)\n }\n catch (error) {\n mounted = reportServiceFailure('notification', error)\n release()\n }\n if (mounted) {\n controller.attach({\n create: opts => queue.create(opts),\n update: (id, opts) => queue.updateItem(id, opts),\n dismiss: id => queue.dismiss(id),\n dismissAll: () => queue.dismissAll(),\n })\n }\n\n /**\n * 堆叠区。每个位置一个,按九宫格固定顺序插入 root:\n * 不按出现次序,否则同一批通知更换先后就会让整块界面重排。\n */\n function ensureGroup(placement: NotificationPlacement): HTMLElement {\n const existing = groups.get(placement)\n if (existing)\n return existing\n const group = partNode('div', 'group')\n group.setAttribute('placement', placement)\n groups.set(placement, group)\n const order = NOTIFICATION_PLACEMENTS.indexOf(placement)\n const after = NOTIFICATION_PLACEMENTS\n .slice(order + 1)\n .map(name => groups.get(name))\n .find(node => node != null)\n root.insertBefore(group, after ?? null)\n return group\n }\n\n function ensureNode(item: ResolvedNotification): XhNotificationItemElement {\n let node = nodes.get(item.id)\n if (!node) {\n node = document.createElement('xh-notification-item') as XhNotificationItemElement\n nodes.set(item.id, node)\n }\n const shape = `${item.closable ? 'c' : ''}${item.actionLabel ? 'a' : ''}`\n if (shapes.get(item.id) !== shape) {\n shapes.set(item.id, shape)\n const card = partNode('div', 'item')\n // 四个节点平铺:两列网格与右上角那颗叉都归皮肤,模板套一层行容器只会与它打架。\n // 指示符与说明都恒渲染——皮肤的 :empty 规则负责把空盒收走,\n // 而 aria-describedby 无条件指着说明那一个,节点缺席就成了悬空引用\n card.appendChild(partNode('div', 'item-indicator'))\n card.appendChild(partNode('div', 'item-title'))\n card.appendChild(partNode('div', 'item-description'))\n if (item.actionLabel)\n card.appendChild(partNode('button', 'item-action-trigger'))\n if (item.closable)\n card.appendChild(partNode('button', 'item-close-trigger'))\n node.replaceChildren(card)\n }\n const action = node.querySelector<HTMLElement>('[data-xh-part=\"item-action-trigger\"]')\n if (action && action.textContent !== (item.actionLabel ?? ''))\n action.textContent = item.actionLabel ?? ''\n\n node.itemId = item.id\n node.titleText = resolveFeedbackServiceTitle(item)\n node.description = item.description\n node.tone = item.tone\n node.loading = item.loading\n node.duration = item.duration\n node.removeDelay = item.removeDelay\n node.closable = item.closable\n node.pauseOnPageIdle = item.pauseOnPageIdle\n node.paused = controller.state.paused\n node.translations = translations\n return node\n }\n\n function render(): void {\n if (!mounted)\n return\n const items = queue.visibleNotifications\n controller.syncItems(items.map(item => item.id))\n const living = new Set(items.map(item => item.id))\n for (const [id, node] of nodes) {\n if (living.has(id))\n continue\n node.remove()\n nodes.delete(id)\n shapes.delete(id)\n }\n for (const placement of queue.placements)\n ensureGroup(placement)\n for (const [placement, group] of groups) {\n const list = queue.getItemsByPlacement(placement)\n // 空掉的那一摞收起而不是撤走:地标念不出内容就该退出无障碍树,\n // 但默认那一摞是元素契约里的必需部件,撤了整个通知就不再接线\n group.hidden = list.length === 0\n let previous: Element | null = null\n for (const item of list) {\n const node = ensureNode(item)\n const anchor: Element | null = previous ? previous.nextElementSibling : group.firstElementChild\n if (anchor !== node)\n group.insertBefore(node, anchor)\n previous = node\n }\n }\n }\n\n /** 队列一变化就重绘。元素自己发出该事件,服务不必再监视状态机。 */\n const onItems = (): void => render()\n /** 走完退场的那条从队列里删掉;元素自己也收这条,这里只清回调表。 */\n const onStatus = (event: Event): void => {\n const detail = (event as CustomEvent<{ id: string, status: string }>).detail\n if (detail?.status === 'unmounted')\n controller.unmounted(detail.id)\n }\n const onPress = (event: Event): void => {\n const el = event.target as Element | null\n if (el?.tagName.toLowerCase() !== 'xh-notification-item')\n return\n const id = (el as XhNotificationItemElement).itemId\n if (id)\n controller.invokeAction(id)\n }\n queue.addEventListener('items-change', onItems)\n queue.addEventListener('status-change', onStatus)\n queue.addEventListener('action', onPress)\n\n /** 入队一条;回调另存一张表,队列记录里只留文案。 */\n const create = (opts: NotificationCreateOptions = {}): string => {\n const { onAction, ...record } = opts\n const id = controller.create(record, onAction)\n render()\n return id\n }\n\n const sugar = (tone: NotificationCreateOptions['tone']) =>\n (title: string, opts: NotificationMessageOptions = {}): string => create({ ...opts, tone, title })\n\n return {\n create,\n update: (id, opts) => {\n controller.update(id, opts)\n render()\n },\n dismiss: (id) => {\n controller.dismiss(id)\n render()\n },\n dismissAll: () => {\n controller.dismissAll()\n render()\n },\n info: sugar('info'),\n success: sugar('success'),\n warning: sugar('warning'),\n danger: sugar('danger'),\n pauseAll: controller.pauseAll,\n resumeAll: controller.resumeAll,\n dispose: () => {\n mounted = false\n queue.removeEventListener('items-change', onItems)\n queue.removeEventListener('status-change', onStatus)\n queue.removeEventListener('action', onPress)\n controller.dispose()\n nodes.clear()\n shapes.clear()\n groups.clear()\n queue.remove()\n release()\n },\n }\n}\n","/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 全局命令式轻提示服务:自带一个挂到浮层落点的宿主容器与默认模板,\n// info/success 等命令在任意模块作用域可调(请求拦截器、store),不要求调用点在文档树的某一处。\n//\n// 摞落在哪儿是整个服务的口径,因此库里没有对应的自定义元素;\n// 队列跑的是 notification 那台队列机器,上限、挤条与合并计数全库一份实现。\nimport type { Service } from '@xihan-ui/core'\nimport type { NotificationApi, NotificationSchema, ToastOptions, ToastRecord, ToastTone } from '@xihan-ui/headless'\nimport type { XhToastElement } from '../elements/toast'\nimport type { ToastCreateOptions, ToastMessageOptions, ToastPromiseOptions, ToastService, ToastServiceOptions } from './types'\nimport { createService, DATA_INERT_EXEMPT } from '@xihan-ui/core'\nimport {\n connectNotification,\n createFeedbackServiceController,\n createToastStackController,\n notificationMachine,\n resolveToastServiceItem,\n TOAST_GAP,\n TOAST_MAX,\n TOAST_PLACEMENT,\n toastAnatomy,\n visibleNotifications,\n} from '@xihan-ui/headless'\nimport { withXhConfig } from '../config'\nimport { wcNormalize } from '../dom/normalize'\nimport { createLitRuntime } from '../runtime/lit-runtime'\nimport { createServiceHolder, createServiceReactiveHost, partNode, reportServiceFailure } from './host'\nimport { defineFeedbackElements } from './register'\n\nconst parts = toastAnatomy.build()\n\nexport function createToastService(options: ToastServiceOptions = {}): ToastService {\n if (typeof document === 'undefined')\n throw new Error('createToastService 需要 document;SSR 里请等到客户端再创建')\n\n defineFeedbackElements()\n\n const {\n target,\n placement = TOAST_PLACEMENT,\n gap = TOAST_GAP,\n max = TOAST_MAX,\n dedupe,\n toastTranslations,\n ...defaults\n } = options\n const serviceDefaults = {\n ...defaults,\n pauseOnPageIdle: defaults.pauseOnPageIdle ?? true,\n }\n const { holder, release } = createServiceHolder(target)\n\n // 摞没有对应的自定义元素,属性直接从解剖里取\n const group = document.createElement('div')\n for (const [name, value] of Object.entries(parts.group.attrs))\n group.setAttribute(name, String(value))\n group.setAttribute('data-placement', placement)\n // 模态浮层给背景施加 inert 时跳过这一摞:轻提示画在遮罩之上,\n // 一并罩住就成了看得见、点不动、读屏也跳过\n group.setAttribute(DATA_INERT_EXEMPT, '')\n holder.appendChild(group)\n\n const nodes = new Map<string, XhToastElement>()\n // 这一条当下渲染成了什么形状;变了才重搭子节点,没变只刷属性\n const shapes = new Map<string, string>()\n const controller = createFeedbackServiceController<ToastOptions, Partial<ToastOptions>>({\n name: 'toast',\n idPrefix: 'toast',\n onStateChange: () => render(),\n })\n const stack = createToastStackController({\n group,\n gap,\n placement,\n onInteractionChange: active => active ? controller.pauseAll() : controller.resumeAll(),\n })\n\n const machineProps = (): Partial<NotificationSchema['props']> => withXhConfig('notification', {\n placement,\n max,\n dedupe,\n duration: serviceDefaults.duration,\n removeDelay: serviceDefaults.removeDelay,\n pauseOnPageIdle: serviceDefaults.pauseOnPageIdle,\n }, holder)\n\n const host = createServiceReactiveHost(() => render())\n const runtime = createLitRuntime(host)\n let service: Service<NotificationSchema> | null = null\n try {\n service = createService(notificationMachine, { props: machineProps, runtime })\n runtime.mount()\n }\n catch (error) {\n reportServiceFailure('toast', error)\n service = null\n release()\n }\n\n const api = (): NotificationApi | null => (service ? connectNotification(service, wcNormalize) : null)\n if (service) {\n controller.attach({\n create: opts => api()!.create(opts),\n update: (id, opts) => api()!.update(id, opts),\n dismiss: id => api()!.dismiss(id),\n dismissAll: () => api()!.dismissAll(),\n })\n }\n\n function ensureNode(item: ToastRecord): XhToastElement {\n const resolved = resolveToastServiceItem(item, serviceDefaults)\n let node = nodes.get(item.id)\n if (!node) {\n node = document.createElement('xh-toast') as XhToastElement\n nodes.set(item.id, node)\n }\n const shape = `${resolved.closable ? 'c' : ''}${resolved.actionLabel ? 'a' : ''}${resolved.description ? 'd' : ''}`\n if (shapes.get(item.id) !== shape) {\n shapes.set(item.id, shape)\n const root = partNode('div', 'root')\n root.appendChild(partNode('span', 'indicator'))\n const content = partNode('div', 'content')\n content.appendChild(partNode('div', 'title'))\n if (resolved.description)\n content.appendChild(partNode('div', 'description'))\n root.appendChild(content)\n if (resolved.actionLabel)\n root.appendChild(partNode('button', 'action-trigger'))\n if (resolved.closable)\n root.appendChild(partNode('button', 'close-trigger'))\n node.replaceChildren(root)\n }\n const action = node.querySelector<HTMLElement>('[data-xh-part=\"action-trigger\"]')\n if (action && action.textContent !== (resolved.actionLabel ?? ''))\n action.textContent = resolved.actionLabel ?? ''\n\n node.toastId = resolved.id\n node.titleText = resolved.title\n node.descriptionText = resolved.description\n node.tone = resolved.tone\n node.loading = resolved.loading\n node.duration = resolved.duration\n node.removeDelay = resolved.removeDelay\n node.closable = resolved.closable\n node.pauseOnPageIdle = resolved.pauseOnPageIdle\n node.paused = controller.state.paused\n node.translations = toastTranslations\n return node\n }\n\n /** 队列里没有的节点撤掉,剩下的按记录刷一遍属性并排到该在的位置。 */\n function render(): void {\n if (!service)\n return\n const items = visibleNotifications(service.context.get('items'), max, placement)\n controller.syncItems(items.map(item => item.id))\n const living = new Set(items.map(item => item.id))\n for (const [id, node] of nodes) {\n if (living.has(id))\n continue\n node.remove()\n nodes.delete(id)\n shapes.delete(id)\n }\n group.setAttribute('data-count', String(items.length))\n // 队列空着时整面定位面撤掉:留着白白多一个罩住整块视口的合成层\n group.toggleAttribute('hidden', items.length === 0)\n\n let previous: Element | null = null\n for (const item of items) {\n const node = ensureNode(item)\n // 队列顺序就是视觉顺序:位置对不上就搬过去,对得上不动它\n const anchor: Element | null = previous ? previous.nextElementSibling : group.firstElementChild\n if (anchor !== node)\n group.insertBefore(node, anchor)\n previous = node\n }\n }\n\n /** 走完退场的那条从队列里删掉。 */\n const onStatus = (event: Event): void => {\n const el = event.target as Element | null\n if (el?.tagName.toLowerCase() !== 'xh-toast')\n return\n const detail = (event as CustomEvent<{ id: string, status: string }>).detail\n if (detail?.status === 'unmounted')\n controller.unmounted(detail.id)\n }\n /** 行内动作按 id 现查那张回调表。 */\n const onPress = (event: Event): void => {\n const el = event.target as Element | null\n if (el?.tagName.toLowerCase() !== 'xh-toast')\n return\n const detail = (event as CustomEvent<{ id: string }>).detail\n if (detail?.id)\n controller.invokeAction(detail.id)\n }\n group.addEventListener('status-change', onStatus)\n group.addEventListener('action', onPress)\n\n /** 入队一条;回调另存一张表,队列记录里只留文案。 */\n const create = (opts: ToastCreateOptions = {}): string => {\n const { onAction, ...record } = opts\n return controller.create(record, onAction)\n }\n\n const sugar = (tone: ToastTone) => (message: string, opts: ToastMessageOptions = {}): string =>\n create({ ...opts, tone, title: message })\n\n return {\n create,\n update: controller.update,\n dismiss: controller.dismiss,\n dismissAll: controller.dismissAll,\n info: sugar('info'),\n success: sugar('success'),\n warning: sugar('warning'),\n danger: sugar('danger'),\n loading: (message, opts = {}) => create({ ...opts, loading: true, title: message }),\n promise: <T>(input: Promise<T> | (() => Promise<T>), opts: ToastPromiseOptions<T>): Promise<T> => {\n const { loading, success, error, ...rest } = opts\n const running = typeof input === 'function' ? input() : input\n const { onAction, ...record } = rest\n return controller.trackPromise(\n running,\n { ...record, loading: true, title: loading },\n value => ({ loading: false, tone: 'success', title: typeof success === 'function' ? success(value) : success }),\n reason => ({ loading: false, tone: 'danger', title: typeof error === 'function' ? error(reason) : error }),\n onAction,\n )\n },\n pauseAll: controller.pauseAll,\n resumeAll: controller.resumeAll,\n dispose: () => {\n stack.dispose()\n group.removeEventListener('status-change', onStatus)\n group.removeEventListener('action', onPress)\n controller.dispose()\n runtime.unmount()\n service = null\n nodes.clear()\n shapes.clear()\n group.remove()\n release()\n },\n }\n}\n"],"mappings":"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"}
|