@wc-kit/core 0.0.1 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.es.js","sources":["../src/styles/base.css.ts","../src/components/button/wc-button.styles.ts","../src/components/button/wc-button.ts","../src/components/button-group/wc-button-group.styles.ts","../src/components/button-group/wc-button-group.ts","../src/icons/library.ts","../src/components/icon/wc-icon.styles.ts","../src/components/icon/wc-icon.ts","../src/common/form-associated-mixin.ts","../src/i18n/locales/en-us.ts","../src/i18n/locales/zh-cn.ts","../src/i18n/localize.ts","../src/i18n/localize-controller.ts","../src/components/input/wc-input.styles.ts","../src/components/input/wc-input.ts","../src/components/textarea/wc-textarea.styles.ts","../src/components/textarea/wc-textarea.ts","../src/components/checkbox/wc-checkbox.styles.ts","../src/components/checkbox/wc-checkbox.ts","../src/components/radio/wc-radio.styles.ts","../src/components/radio/wc-radio.ts","../src/components/switch/wc-switch.styles.ts","../src/components/switch/wc-switch.ts","../src/components/select/wc-option.styles.ts","../src/components/select/wc-option.ts","../src/components/select/wc-select.styles.ts","../src/components/select/wc-select.ts","../src/components/slider/wc-slider.styles.ts","../src/components/slider/wc-slider.ts","../src/components/input-number/wc-input-number.styles.ts","../src/components/input-number/wc-input-number.ts","../src/components/date-picker/wc-date-picker.styles.ts","../src/components/date-picker/wc-date-picker.ts","../src/components/form/wc-form.styles.ts","../src/components/form/wc-form.ts","../src/components/form/wc-form-item.ts","../src/components/divider/wc-divider.styles.ts","../src/components/divider/wc-divider.ts","../src/components/tag/wc-tag.styles.ts","../src/components/tag/wc-tag.ts","../src/components/avatar/wc-avatar.styles.ts","../src/components/avatar/wc-avatar.ts","../src/components/space/wc-space.styles.ts","../src/components/space/wc-space.ts","../src/components/layout/wc-layout.styles.ts","../src/components/layout/wc-row.ts","../src/components/typography/wc-text.styles.ts","../src/components/typography/wc-text.ts","../src/common/overlay-side-effects.ts","../src/components/dialog/wc-dialog.styles.ts","../src/components/dialog/wc-dialog.ts","../src/components/drawer/wc-drawer.styles.ts","../src/components/drawer/wc-drawer.ts","../src/components/message/wc-message.styles.ts","../src/components/message/wc-message.ts","../src/components/message/message.ts","../src/common/position.ts","../src/components/tooltip/wc-tooltip.styles.ts","../src/components/tooltip/wc-tooltip.ts","../src/components/popconfirm/wc-popconfirm.styles.ts","../src/components/popconfirm/wc-popconfirm.ts","../src/components/tabs/wc-tabs.styles.ts","../src/components/tabs/wc-tab.styles.ts","../src/components/tabs/wc-tab.ts","../src/components/tabs/wc-tabs.ts","../src/components/breadcrumb/wc-breadcrumb.styles.ts","../src/components/breadcrumb/wc-breadcrumb.ts","../src/components/breadcrumb/wc-breadcrumb-item.ts","../src/components/pagination/wc-pagination.styles.ts","../src/components/pagination/wc-pagination.ts","../src/components/badge/wc-badge.styles.ts","../src/components/badge/wc-badge.ts","../src/components/empty/wc-empty.styles.ts","../src/components/empty/wc-empty.ts","../src/components/progress/wc-progress.styles.ts","../src/components/progress/wc-progress.ts","../src/components/card/wc-card.styles.ts","../src/components/card/wc-card.ts","../src/components/list/wc-list.styles.ts","../src/components/list/wc-list.ts","../src/components/list/wc-list-item.ts","../src/components/table/wc-table.styles.ts","../src/components/table/wc-table.ts","../src/components/image/wc-image.styles.ts","../src/components/image/wc-image.ts","../src/components/upload/wc-upload.styles.ts","../src/components/upload/wc-upload.ts","../src/icons/arrow-left.ts","../src/icons/arrow-right.ts","../src/icons/calendar.ts","../src/icons/check.ts","../src/icons/chevron-down.ts","../src/icons/chevron-left.ts","../src/icons/chevron-right.ts","../src/icons/chevron-up.ts","../src/icons/close.ts","../src/icons/error.ts","../src/icons/file.ts","../src/icons/image-off.ts","../src/icons/info.ts","../src/icons/loader.ts","../src/icons/minus.ts","../src/icons/plus.ts","../src/icons/rotate-cw.ts","../src/icons/search.ts","../src/icons/upload.ts","../src/icons/warning.ts","../src/icons/zoom-in.ts","../src/icons/zoom-out.ts","../src/icons/index.ts","../src/theme/theme.ts"],"sourcesContent":["import { css } from 'lit';\n\n/**\n * 组件共享基础样式,每个组件的 static styles 中首先引入。\n */\nexport const baseStyles = css`\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n :host {\n display: inline-block;\n font-family: var(--wc-font-family);\n font-size: var(--wc-font-size-medium);\n line-height: var(--wc-line-height-base);\n color: var(--wc-color-text);\n -webkit-tap-highlight-color: transparent;\n }\n\n :host([hidden]) {\n display: none;\n }\n\n :focus-visible {\n outline: 2px solid var(--wc-color-focus-ring);\n outline-offset: 2px;\n }\n\n :focus:not(:focus-visible) {\n outline: none;\n }\n`;\n","import { css } from 'lit';\n\nexport const buttonStyles = css`\n :host {\n display: inline-block;\n /* component 层令牌:引用 semantic 层,允许按实例覆盖 */\n --wc-button-height: 32px;\n --wc-button-padding-x: var(--wc-space-4);\n --wc-button-font-size: var(--wc-font-size-medium);\n --wc-button-radius: var(--wc-radius-medium);\n }\n\n :host([size='small']) {\n --wc-button-height: 24px;\n --wc-button-padding-x: var(--wc-space-2);\n --wc-button-font-size: var(--wc-font-size-small);\n }\n\n :host([size='large']) {\n --wc-button-height: 40px;\n --wc-button-padding-x: 20px;\n --wc-button-font-size: var(--wc-font-size-large);\n }\n\n :host([block]) {\n display: block;\n width: 100%;\n }\n\n .button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--wc-space-1);\n width: 100%;\n height: var(--wc-button-height);\n padding: 0 var(--wc-button-padding-x);\n border: 1px solid transparent;\n border-radius: var(--wc-button-radius);\n font-family: inherit;\n font-size: var(--wc-button-font-size);\n line-height: 1;\n cursor: pointer;\n user-select: none;\n transition:\n background-color var(--wc-duration-fast) var(--wc-easing-standard),\n border-color var(--wc-duration-fast) var(--wc-easing-standard),\n color var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .button:disabled {\n cursor: not-allowed;\n }\n\n .icon[hidden] {\n display: none;\n }\n\n /* 纯图标按钮:宽度收为与高度相等的正方形 */\n :host(.wc-button--icon-only) .button {\n width: var(--wc-button-height);\n padding: 0;\n }\n\n /* ---- theme 语义色变量:base 实色底与 outline/dashed/text/link 前景色统一从这里取 ---- */\n :host {\n --wc-button-theme-color: var(--wc-color-primary);\n --wc-button-theme-hover: var(--wc-color-primary-hover);\n --wc-button-theme-active: var(--wc-color-primary-active);\n }\n :host([theme='success']) {\n --wc-button-theme-color: var(--wc-color-success);\n --wc-button-theme-hover: var(--wc-color-success-dark);\n --wc-button-theme-active: var(--wc-color-success-dark);\n }\n :host([theme='warning']) {\n --wc-button-theme-color: var(--wc-color-warning);\n --wc-button-theme-hover: var(--wc-color-warning-dark);\n --wc-button-theme-active: var(--wc-color-warning-dark);\n }\n :host([theme='danger']) {\n --wc-button-theme-color: var(--wc-color-error);\n --wc-button-theme-hover: var(--wc-color-error-dark);\n --wc-button-theme-active: var(--wc-color-error-dark);\n }\n\n /* ---- theme: default ---- */\n :host([variant='base']) .button {\n background-color: var(--wc-color-bg-container);\n border-color: var(--wc-color-border);\n color: var(--wc-color-text);\n }\n :host([theme='default'][variant='base']) .button:hover:not(:disabled) {\n border-color: var(--wc-button-theme-color);\n color: var(--wc-button-theme-color);\n }\n\n /* ---- theme: primary / success / warning / danger 的 base 变体:实色底 ---- */\n :host([theme='primary'][variant='base']) .button,\n :host([theme='success'][variant='base']) .button,\n :host([theme='warning'][variant='base']) .button,\n :host([theme='danger'][variant='base']) .button {\n background-color: var(--wc-button-theme-color);\n border-color: var(--wc-button-theme-color);\n color: var(--wc-color-text-anti);\n }\n :host([theme='primary'][variant='base']) .button:hover:not(:disabled),\n :host([theme='success'][variant='base']) .button:hover:not(:disabled),\n :host([theme='warning'][variant='base']) .button:hover:not(:disabled),\n :host([theme='danger'][variant='base']) .button:hover:not(:disabled) {\n background-color: var(--wc-button-theme-hover);\n border-color: var(--wc-button-theme-hover);\n color: var(--wc-color-text-anti);\n }\n :host([theme='primary'][variant='base']) .button:active:not(:disabled),\n :host([theme='success'][variant='base']) .button:active:not(:disabled),\n :host([theme='warning'][variant='base']) .button:active:not(:disabled),\n :host([theme='danger'][variant='base']) .button:active:not(:disabled) {\n background-color: var(--wc-button-theme-active);\n border-color: var(--wc-button-theme-active);\n color: var(--wc-color-text-anti);\n }\n\n /* ---- variant: outline / dashed(继承 theme 色) ---- */\n :host([variant='outline']) .button,\n :host([variant='dashed']) .button {\n background-color: transparent;\n border-color: var(--wc-button-theme-color);\n color: var(--wc-button-theme-color);\n }\n :host([variant='dashed']) .button {\n border-style: dashed;\n }\n :host([variant='outline']) .button:hover:not(:disabled),\n :host([variant='dashed']) .button:hover:not(:disabled) {\n background-color: var(--wc-button-theme-hover);\n border-color: var(--wc-button-theme-hover);\n color: var(--wc-color-text-anti);\n }\n\n /* ---- variant: text ---- */\n :host([variant='text']) .button {\n background-color: transparent;\n border-color: transparent;\n color: var(--wc-button-theme-color);\n }\n :host([variant='text']) .button:hover:not(:disabled) {\n background-color: var(--wc-color-bg);\n }\n\n /* ---- variant: link ---- */\n :host([variant='link']) .button {\n background-color: transparent;\n border-color: transparent;\n color: var(--wc-button-theme-color);\n }\n :host([variant='link']) .button:hover:not(:disabled) {\n color: var(--wc-button-theme-hover);\n text-decoration: underline;\n }\n\n /* ---- 禁用态 ---- */\n .button:disabled {\n background-color: var(--wc-color-bg-disabled);\n border-color: transparent;\n color: var(--wc-color-text-disabled);\n }\n\n /* ---- 加载态 spinner ---- */\n .button[aria-busy='true'] .content {\n opacity: 0.7;\n }\n`;\n","import { LitElement, html } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { buttonStyles } from './wc-button.styles';\n\nexport type wcButtonTheme = 'default' | 'primary' | 'success' | 'warning' | 'danger';\nexport type wcButtonVariant = 'base' | 'outline' | 'dashed' | 'text' | 'link';\nexport type wcButtonSize = 'small' | 'medium' | 'large';\nexport type wcButtonIconPosition = 'start' | 'end';\n\n/**\n * 按钮\n *\n * @slot - 按钮内容\n * @slot icon - 图标(位置由 iconPosition 控制)\n * @csspart base - 按钮根元素\n * @csspart icon - 图标容器\n * @csspart content - 文案容器\n * @cssprop --wc-button-height - 按钮高度\n */\nexport class wcButton extends LitElement {\n static styles = [baseStyles, buttonStyles];\n\n /** 组件风格(语义色) */\n @property({ reflect: true }) theme: wcButtonTheme = 'default';\n\n /** 按钮形式 */\n @property({ reflect: true }) variant: wcButtonVariant = 'base';\n\n /** 尺寸 */\n @property({ reflect: true }) size: wcButtonSize = 'medium';\n\n /** 图标位置:start 左 / end 右 */\n @property({ reflect: true, attribute: 'icon-position' }) iconPosition: wcButtonIconPosition =\n 'start';\n\n /** 是否为块级元素 */\n @property({ type: Boolean, reflect: true }) block = false;\n\n /** 禁用状态 */\n @property({ type: Boolean, reflect: true }) disabled = false;\n\n /** 加载状态 */\n @property({ type: Boolean, reflect: true }) loading = false;\n\n private handleClick(e: MouseEvent): void {\n // 禁用/加载时拦截点击:原生按钮 disabled 已拦截禁用态,这里兜底加载态\n if (this.loading) {\n e.preventDefault();\n e.stopImmediatePropagation();\n }\n }\n\n /** 是否有图标(icon 插槽检测) */\n private _hasIcon = false;\n\n /** 是否有文案(默认插槽检测),两者决定纯图标方形态 */\n private _hasText = false;\n\n render() {\n const icon = html`<span class=\"icon\" part=\"icon\" ?hidden=${!this._hasIcon}>\n <slot name=\"icon\" @slotchange=${this._onIconSlotChange}></slot>\n </span>`;\n const content = html`<span class=\"content\" part=\"content\"\n ><slot @slotchange=${this._onTextSlotChange}></slot\n ></span>`;\n return html`\n <button\n part=\"base\"\n class=\"button\"\n ?disabled=${this.disabled || this.loading}\n aria-disabled=${this.disabled || this.loading}\n aria-busy=${this.loading}\n @click=${this.handleClick}\n >\n ${this.iconPosition === 'end' ? [content, icon] : [icon, content]}\n </button>\n `;\n }\n\n private _onIconSlotChange(e: Event): void {\n this._hasIcon = (e.target as HTMLSlotElement).assignedElements({ flatten: true }).length > 0;\n this._syncIconOnly();\n this.requestUpdate();\n }\n\n private _onTextSlotChange(e: Event): void {\n const nodes = (e.target as HTMLSlotElement).assignedNodes({ flatten: true });\n this._hasText = nodes.some((n) => (n.textContent ?? '').trim().length > 0);\n this._syncIconOnly();\n this.requestUpdate();\n }\n\n /** 纯图标(有 icon 无文案)时收为正方形 */\n private _syncIconOnly(): void {\n this.classList.toggle('wc-button--icon-only', this._hasIcon && !this._hasText);\n }\n}\n\nif (!customElements.get('wc-button')) {\n customElements.define('wc-button', wcButton);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-button': wcButton;\n }\n}\n","import { css } from 'lit';\n\nexport const buttonGroupStyles = css`\n :host {\n display: inline-block;\n\n /* component 层令牌:首尾按钮保留的圆角 */\n --wc-button-group-radius: var(--wc-radius-medium);\n }\n\n .group {\n display: inline-flex;\n vertical-align: middle;\n }\n\n /*\n * ::slotted 只能作用于子 wc-button 的宿主元素,圆角与边距通过\n * --wc-button-radius 自定义属性穿透进按钮的 Shadow DOM\n *(外层作用域对宿主的声明优先于组件内 :host 声明)。\n * 注意令牌名不能与按钮自身的 --wc-button-radius 同名,否则自引用失效。\n */\n ::slotted(wc-button) {\n --wc-button-radius: 0;\n position: relative;\n }\n\n /* 相邻边框合并:后一个左移 1px 压在前一个边框上 */\n ::slotted(wc-button:not(:first-child)) {\n margin-left: -1px;\n }\n\n /* 悬停/聚焦的上层按钮边框完整可见 */\n ::slotted(wc-button:hover),\n ::slotted(wc-button:focus-within) {\n z-index: 1;\n }\n\n ::slotted(wc-button:first-child) {\n --wc-button-radius: var(--wc-button-group-radius) 0 0 var(--wc-button-group-radius);\n }\n\n ::slotted(wc-button:last-child) {\n --wc-button-radius: 0 var(--wc-button-group-radius) var(--wc-button-group-radius) 0;\n }\n\n ::slotted(wc-button:only-child) {\n --wc-button-radius: var(--wc-button-group-radius);\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { baseStyles } from '../../styles/base.css';\nimport { buttonGroupStyles } from './wc-button-group.styles';\n\n/**\n * 按钮分组。包裹多个 `wc-button` 形成组合:中间按钮去圆角、相邻边框合并,\n * 首尾按钮保留外侧圆角。仅接受 `wc-button` 作为直接子元素。\n *\n * @slot - wc-button 子元素\n * @csspart base - 分组容器\n * @cssprop --wc-button-group-radius - 覆盖首尾按钮保留的圆角\n */\nexport class wcButtonGroup extends LitElement {\n static styles = [baseStyles, buttonGroupStyles];\n\n render() {\n return html`<div class=\"group\" part=\"base\"><slot></slot></div>`;\n }\n}\n\nif (!customElements.get('wc-button-group')) {\n customElements.define('wc-button-group', wcButtonGroup);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-button-group': wcButtonGroup;\n }\n}\n","/**\n * 图标注册系统\n *\n * 两条注册路径:\n * 1. registerIcon(name, svg) —— 同步注册表,本地 SVG 字符串,单图标单文件可 tree-shaking\n * 2. registerIconLibrary(name, lib) —— 分组图标库,resolver 支持返回 Promise(CDN 懒加载),\n * 可选 mutator 统一调整注入前的 SVG 根元素(如强制 stroke 风格)\n *\n * 安全约定:register* 属于受信 API,SVG 内容不做消毒,\n * 禁止将用户输入直接作为 SVG 来源(同 Shoelace 的做法)。\n */\nexport interface WcIconData {\n name: string;\n svg: string;\n}\n\nexport interface WcIconLibrary {\n /** 给定图标名返回 SVG 字符串;支持返回 Promise 实现懒加载 */\n resolver: (name: string) => string | Promise<string>;\n /** 可选:对解析后的 SVG 根元素做统一调整(在注入 Shadow DOM 之前执行) */\n mutator?: (svg: SVGSVGElement) => void;\n}\n\n/** 同步注册表:内置与用户本地图标 */\nconst registry = new Map<string, string>();\n\n/** 分组图标库 */\nconst libraries = new Map<string, WcIconLibrary>();\n\n/** 解析结果缓存,key 为 `${library}:${name}`,避免同一图标重复请求/解析 */\nconst cache = new Map<string, Promise<string>>();\n\n/** 注册变化监听:解决「组件首渲染早于图标注册」的时序竞态(未命中后可订阅重试) */\nconst registerListeners = new Set<() => void>();\n\n/** 订阅注册变化,返回取消订阅函数 */\nexport function onIconRegister(cb: () => void): () => void {\n registerListeners.add(cb);\n return () => registerListeners.delete(cb);\n}\n\nfunction notifyRegister(): void {\n // 必须快照后遍历:回调(wc-icon 的重试 loadIcon)会同步退订/重订,\n // 直接遍历 Set 会把新增项也纳入迭代,造成无限同步循环卡死页面\n for (const cb of [...registerListeners]) cb();\n}\n\n/** 注册本地图标(同步),同名覆盖 */\nexport function registerIcon(name: string, svg: string): void {\n registry.set(name, svg);\n notifyRegister();\n}\n\nexport function getIcon(name: string): string | undefined {\n return registry.get(name);\n}\n\n/** 注册分组图标库,同名覆盖。'default' 为内置保留库名 */\nexport function registerIconLibrary(name: string, library: WcIconLibrary): void {\n libraries.set(name, library);\n notifyRegister();\n}\n\nexport function getIconLibrary(name: string): WcIconLibrary | undefined {\n return libraries.get(name);\n}\n\n/**\n * 图标数据工厂:统一 24×24 viewBox 与 lucide 风格默认属性(currentColor 描边)。\n * 内置图标统一用它生成,保证风格一致。\n */\nexport function createIcon(name: string, content: string, viewBox = '0 0 24 24'): WcIconData {\n return {\n name,\n svg:\n `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"${viewBox}\" fill=\"none\" ` +\n `stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">` +\n `${content}</svg>`,\n };\n}\n\n// 默认库:走同步注册表\nregisterIconLibrary('default', {\n resolver: (name) => registry.get(name) ?? '',\n});\n\n/**\n * 解析图标为 SVG 字符串(带缓存与竞态隔离)。\n * 找不到时返回空字符串,开发环境下输出警告。\n */\nexport async function resolveIcon(libraryName: string, iconName: string): Promise<string> {\n const library = libraries.get(libraryName);\n if (!library) {\n if (import.meta.env?.DEV) {\n console.warn(`[wc-icon] 未注册的图标库 \"${libraryName}\"`);\n }\n return '';\n }\n\n const cacheKey = `${libraryName}:${iconName}`;\n let pending = cache.get(cacheKey);\n if (!pending) {\n pending = Promise.resolve(library.resolver(iconName)).catch((err: unknown) => {\n if (import.meta.env?.DEV) {\n console.warn(`[wc-icon] 图标 \"${libraryName}:${iconName}\" 加载失败`, err);\n }\n return '';\n });\n cache.set(cacheKey, pending);\n }\n\n const raw = await pending;\n if (!raw) {\n // 未命中不缓存,否则注册晚于首渲染时重试永远拿到空的旧结果\n cache.delete(cacheKey);\n if (import.meta.env?.DEV && registry.size === 0 && libraryName === 'default') {\n console.warn(\n `[wc-icon] 未找到图标 \"${iconName}\",且注册表为空。` +\n `请先调用 registerBuiltinIcons() 或 registerIcon()`,\n );\n }\n return '';\n }\n\n if (library.mutator && typeof DOMParser !== 'undefined') {\n const doc = new DOMParser().parseFromString(raw, 'text/html');\n const svg = doc.querySelector('svg');\n if (svg) {\n library.mutator(svg as unknown as SVGSVGElement);\n return svg.outerHTML;\n }\n }\n return raw;\n}\n","import { css } from 'lit';\n\nexport const iconStyles = css`\n :host {\n display: inline-flex;\n /* 尺寸默认 1em,跟随 font-size 缩放;颜色继承 currentColor */\n width: 1em;\n height: 1em;\n flex-shrink: 0;\n line-height: 1;\n }\n\n [part='base'] {\n display: flex;\n width: 100%;\n height: 100%;\n align-items: center;\n justify-content: center;\n }\n\n svg {\n display: block;\n width: 100%;\n height: 100%;\n /* 不设 fill:描边图标由 SVG 根的 fill=\"none\" 决定(CSS 会覆盖 presentation attribute,\n 设 fill: currentColor 会把闭合形状整体填充导致发糊);填充型图标由各自 SVG 声明。\n 颜色统一走 color → stroke=\"currentColor\" 继承。 */\n color: currentColor;\n pointer-events: none;\n }\n\n :host([spin]) svg,\n :host([pulse]) svg {\n transform-origin: center;\n animation: wc-spin var(--wc-duration-slow, 1s) linear infinite;\n }\n\n /* pulse:旋转 + 缓动呼吸感,用于加载中区分度更高的场景 */\n :host([pulse]) svg {\n animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);\n }\n\n @keyframes wc-spin {\n from {\n rotate: 0deg;\n }\n to {\n rotate: 360deg;\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n :host([spin]) svg,\n :host([pulse]) svg {\n animation: none;\n }\n }\n`;\n","import { LitElement, html, nothing } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { unsafeSVG } from 'lit/directives/unsafe-svg.js';\nimport type { PropertyValues } from 'lit';\nimport { baseStyles } from '../../styles/base.css.js';\nimport { onIconRegister, resolveIcon } from '../../icons/library.js';\nimport { iconStyles } from './wc-icon.styles.js';\n\n/**\n * 图标\n *\n * 三种来源(优先级从高到低):`src`(URL 直连)> `name` + `library`(图标库解析)。\n * 内置图标需先调用 `registerBuiltinIcons()`;自定义库用 `registerIconLibrary()`。\n *\n * @slot - 无(内容由 name/src 解析而来)\n * @csspart base - 图标容器\n * @cssprop --wc-icon-size - 覆盖图标尺寸(默认 1em)\n */\nexport class WcIcon extends LitElement {\n static styles = [baseStyles, iconStyles];\n\n /** 图标名(在 library 对应的图标库中查找) */\n @property() name = '';\n\n /** 直接指定 SVG 地址,优先级高于 name */\n @property() src = '';\n\n /** 图标库名称,默认走同步注册表 */\n @property() library = 'default';\n\n /** 无障碍描述文案;提供时 role=img + aria-label,否则对读屏隐藏 */\n @property() label = '';\n\n /** 旋转动画(加载中) */\n @property({ type: Boolean, reflect: true }) spin = false;\n\n /** 缓动旋转动画 */\n @property({ type: Boolean, reflect: true }) pulse = false;\n\n @state() private svg = '';\n\n /** 竞态守卫:name 快速切换时只采纳最后一次解析结果 */\n private requestId = 0;\n\n /** 图标未注册时的订阅句柄(注册后重试) */\n private unwatchRegister: (() => void) | undefined;\n\n protected willUpdate(changed: PropertyValues<this>): void {\n if (changed.has('src') || changed.has('name') || changed.has('library')) {\n void this.loadIcon();\n }\n }\n\n disconnectedCallback(): void {\n this.unwatchRegister?.();\n }\n\n private async loadIcon(): Promise<void> {\n this.unwatchRegister?.();\n this.unwatchRegister = undefined;\n const requestId = ++this.requestId;\n // 先订阅再解析:注册通知可能整个落在解析的 await 间隙里(如 registerBuiltinIcons\n // 晚于首渲染),后订阅会错过通知导致图标永久空白;解析成功后立即退订\n const unwatch =\n this.name && !this.src\n ? onIconRegister(() => {\n void this.loadIcon();\n })\n : null;\n let raw = '';\n if (this.src) {\n raw = await this.fetchSrc(this.src);\n } else if (this.name) {\n raw = await resolveIcon(this.library, this.name);\n }\n if (requestId !== this.requestId) {\n unwatch?.();\n return;\n }\n if (raw || !unwatch) {\n unwatch?.();\n } else {\n this.unwatchRegister = unwatch;\n }\n this.svg = raw;\n }\n\n private async fetchSrc(url: string): Promise<string> {\n if (typeof fetch !== 'function') {\n return '';\n }\n try {\n const res = await fetch(url);\n if (!res.ok) {\n return '';\n }\n return await res.text();\n } catch {\n return '';\n }\n }\n\n render() {\n return html`\n <span\n part=\"base\"\n role=${this.label ? 'img' : 'presentation'}\n aria-label=${this.label || nothing}\n aria-hidden=${this.label ? nothing : 'true'}\n >${this.svg ? unsafeSVG(this.svg) : nothing}</span\n >\n `;\n }\n}\n\nif (!customElements.get('wc-icon')) {\n customElements.define('wc-icon', WcIcon);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-icon': WcIcon;\n }\n}\n","import type { LitElement } from 'lit';\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\ntype Constructor<T = Record<string, unknown>> = new (...args: any[]) => T;\n\n/** FormAssociatedMixin 为子类附加的成员(类型层),便于子类与使用者获得完整类型 */\nexport interface FormAssociatedMembers {\n /** 提交到表单的字段名 */\n name: string;\n /** 禁用状态,reflect 以支持外部 CSS 选择(如 wc-input[disabled]) */\n disabled: boolean;\n /** ElementInternals 实例,子类用于 setFormValue / setValidity */\n internals: ElementInternals;\n /** 表单控件的当前值 */\n value: unknown;\n /** 默认值,子类可覆写 */\n readonly defaultValue: unknown;\n /** 表单重置回调 */\n formResetCallback(): void;\n}\n\n/**\n * 表单关联 mixin:让组件通过 ElementInternals 接入原生 <form>。\n * 提供 name/disabled 属性与表单重置回调,符合 RULES.md 第 7 条。\n * 注意:Lit 会沿原型链合并 static properties,子类的 @property 不受影响。\n */\nexport function FormAssociatedMixin<T extends Constructor<LitElement>>(Base: T) {\n class FormAssociatedElement extends Base {\n static formAssociated = true;\n\n static properties = {\n name: { type: String },\n disabled: { type: Boolean, reflect: true },\n };\n\n declare name: string;\n declare disabled: boolean;\n\n internals!: ElementInternals;\n\n constructor(...args: any[]) {\n super(...args);\n this.name = '';\n this.disabled = false;\n this.internals = (this as unknown as LitElement).attachInternals();\n }\n\n /** 表单控件的当前值,表单类组件必须实现 */\n get value(): unknown {\n return undefined;\n }\n\n set value(_v: unknown) {\n // 由子类覆写\n }\n\n /** 表单重置时恢复默认值,子类按需覆写 */\n formResetCallback(): void {\n this.value = this.defaultValue;\n }\n\n /** 默认值,子类可覆写 */\n get defaultValue(): unknown {\n return undefined;\n }\n }\n\n return FormAssociatedElement as unknown as T & Constructor<FormAssociatedMembers>;\n}\n","import type { WcTranslations } from '../types.js';\n\nexport const enUS: WcTranslations = {\n 'select.placeholder': 'Select',\n 'select.empty': 'No data',\n 'pagination.total': '{total} items in total',\n 'pagination.prev': 'Previous page',\n 'pagination.next': 'Next page',\n 'pagination.label': 'Pagination',\n 'pagination.page': 'Page {page}',\n 'pagination.jumpTo': 'Go to',\n 'pagination.pageUnit': 'Page',\n 'dialog.confirm': 'Confirm',\n 'dialog.cancel': 'Cancel',\n 'empty.noData': 'No data',\n 'table.empty': 'No data in table',\n 'input.clear': 'Clear',\n 'inputNumber.increment': 'Increment',\n 'inputNumber.decrement': 'Decrement',\n 'datePicker.placeholder': 'Select date',\n 'datePicker.today': 'Today',\n 'datePicker.prevYear': 'Previous year',\n 'datePicker.prevMonth': 'Previous month',\n 'datePicker.nextMonth': 'Next month',\n 'datePicker.nextYear': 'Next year',\n 'form.required': '{name} is required',\n 'form.min': '{name} must be no less than {min}',\n 'form.max': '{name} must be no greater than {max}',\n 'form.minLength': '{name} must be at least {minLength} characters',\n 'form.maxLength': '{name} must be at most {maxLength} characters',\n 'form.pattern': '{name} format is invalid',\n 'form.invalid': '{name} is invalid',\n 'tag.close': 'Remove',\n 'dialog.close': 'Close',\n 'message.close': 'Close',\n 'breadcrumb.label': 'Breadcrumb',\n 'image.loadError': 'Failed to load image',\n 'image.preview': 'Preview',\n 'image.zoomIn': 'Zoom in',\n 'image.zoomOut': 'Zoom out',\n 'image.rotate': 'Rotate',\n 'image.reset': 'Reset',\n 'image.close': 'Close',\n 'upload.upload': 'Upload',\n 'upload.clickOrDrag': 'Click or drag file here to upload',\n 'upload.failed': 'Upload failed',\n 'upload.retry': 'Retry',\n 'upload.remove': 'Remove',\n 'upload.preview': 'Preview',\n};\n","import type { WcTranslations } from '../types.js';\n\nexport const zhCN: WcTranslations = {\n 'select.placeholder': '请选择',\n 'select.empty': '暂无数据',\n 'pagination.total': '共 {total} 条',\n 'pagination.prev': '上一页',\n 'pagination.next': '下一页',\n 'pagination.label': '分页导航',\n 'pagination.page': '第 {page} 页',\n 'pagination.jumpTo': '跳至',\n 'pagination.pageUnit': '页',\n 'dialog.confirm': '确认',\n 'dialog.cancel': '取消',\n 'empty.noData': '暂无数据',\n 'table.empty': '表格暂无数据',\n 'input.clear': '清空',\n 'inputNumber.increment': '增加',\n 'inputNumber.decrement': '减少',\n 'datePicker.placeholder': '请选择日期',\n 'datePicker.today': '今天',\n 'datePicker.prevYear': '上一年',\n 'datePicker.prevMonth': '上个月',\n 'datePicker.nextMonth': '下个月',\n 'datePicker.nextYear': '下一年',\n 'form.required': '{name}不能为空',\n 'form.min': '{name}不能小于{min}',\n 'form.max': '{name}不能大于{max}',\n 'form.minLength': '{name}至少{minLength}个字符',\n 'form.maxLength': '{name}最多{maxLength}个字符',\n 'form.pattern': '{name}格式不正确',\n 'form.invalid': '{name}校验不通过',\n 'tag.close': '删除',\n 'dialog.close': '关闭',\n 'message.close': '关闭',\n 'breadcrumb.label': '面包屑导航',\n 'image.loadError': '图片加载失败',\n 'image.preview': '预览',\n 'image.zoomIn': '放大',\n 'image.zoomOut': '缩小',\n 'image.rotate': '旋转',\n 'image.reset': '重置',\n 'image.close': '关闭',\n 'upload.upload': '上传文件',\n 'upload.clickOrDrag': '点击或拖拽文件到此处上传',\n 'upload.failed': '上传失败',\n 'upload.retry': '重新上传',\n 'upload.remove': '移除',\n 'upload.preview': '预览',\n};\n","import { enUS } from './locales/en-us.js';\nimport { zhCN } from './locales/zh-cn.js';\nimport type { WcPartialTranslations, WcTranslations } from './types.js';\n\nexport type { WcPartialTranslations, WcTranslations } from './types.js';\n\n/** 语言切换事件名,LocalizeController 监听此事件触发组件重渲染 */\nexport const LANGUAGE_CHANGE_EVENT = 'wc-language-change';\n\nconst registry = new Map<string, WcTranslations>([\n ['zh-CN', { ...zhCN }],\n ['en-US', { ...enUS }],\n]);\n\nlet currentLocale = 'zh-CN';\n\n/**\n * 注册或合并语言包。同名语言会做浅合并(可覆盖内置文案)。\n * @example registerLocale('ja-JP', { 'dialog.confirm': '確認', 'dialog.cancel': 'キャンセル' })\n */\nexport function registerLocale(name: string, translations: WcPartialTranslations): void {\n const existing = registry.get(name);\n registry.set(name, Object.assign({}, existing, translations));\n if (name === currentLocale) {\n dispatchLanguageChange();\n }\n}\n\n/** 设置全局语言(BCP 47 格式,如 'zh-CN' / 'en-US'),未注册时回退到基础语言匹配 */\nexport function setLocale(name: string): void {\n if (!/^[a-zA-Z]{2,3}(-[a-zA-Z0-9]+)*$/.test(name)) {\n throw new Error(`[wc] 无效的语言标识: \"${name}\",需符合 BCP 47 格式,如 zh-CN`);\n }\n if (name === currentLocale) {\n return;\n }\n currentLocale = name;\n dispatchLanguageChange();\n}\n\nexport function getLocale(): string {\n return currentLocale;\n}\n\n/** 解析可用的已注册语言:精确匹配 -> 基础语言匹配 -> 默认语言 */\nexport function resolveLocale(name: string): string {\n if (registry.has(name)) {\n return name;\n }\n const base = name.split('-')[0]?.toLowerCase();\n for (const key of registry.keys()) {\n if (key.split('-')[0]?.toLowerCase() === base) {\n return key;\n }\n }\n return 'zh-CN';\n}\n\n/** 取文案:当前语言 -> 默认语言 -> key 本身,并做 {var} 插值 */\nexport function getTerm(\n localeName: string,\n key: string,\n vars?: Record<string, string | number>,\n): string {\n const messages = registry.get(resolveLocale(localeName));\n const fallback = registry.get('zh-CN');\n let text = messages?.[key] ?? fallback?.[key] ?? key;\n if (vars) {\n text = text.replace(/\\{(\\w+)\\}/g, (match, varName: string) =>\n varName in vars ? String(vars[varName]) : match,\n );\n }\n return text;\n}\n\nexport function getRegisteredLocales(): string[] {\n return [...registry.keys()];\n}\n\nfunction dispatchLanguageChange(): void {\n document.dispatchEvent(\n new CustomEvent(LANGUAGE_CHANGE_EVENT, {\n detail: { locale: currentLocale },\n bubbles: true,\n composed: true,\n }),\n );\n}\n","import type { ReactiveController, ReactiveElement } from 'lit';\nimport { getLocale, getTerm, LANGUAGE_CHANGE_EVENT, resolveLocale } from './localize.js';\n\n/**\n * 组件国际化控制器。\n * 文案解析优先级:元素 lang 属性 > 全局 setLocale > 默认语言 zh-CN。\n * 全局语言切换时自动触发宿主组件重渲染。\n *\n * @example\n * ```ts\n * class WcSelect extends LitElement {\n * private localize = new LocalizeController(this);\n * render() {\n * return html`<span>${this.localize.term('select.placeholder')}</span>`;\n * }\n * }\n * ```\n */\nexport class LocalizeController implements ReactiveController {\n private host: ReactiveElement;\n\n constructor(host: ReactiveElement) {\n this.host = host;\n host.addController(this);\n }\n\n hostConnected(): void {\n document.addEventListener(LANGUAGE_CHANGE_EVENT, this.handleLanguageChange);\n }\n\n hostDisconnected(): void {\n document.removeEventListener(LANGUAGE_CHANGE_EVENT, this.handleLanguageChange);\n }\n\n /** 取文案,支持 {var} 插值 */\n term(key: string, vars?: Record<string, string | number>): string {\n return getTerm(this.resolvedLocale, key, vars);\n }\n\n /** 按当前语言格式化日期 */\n date(value: Date | number, options?: Intl.DateTimeFormatOptions & { locale?: string }): string {\n const { locale: localeOverride, ...formatOptions } = options ?? {};\n return new Intl.DateTimeFormat(localeOverride ?? this.resolvedLocale, formatOptions).format(\n value,\n );\n }\n\n /** 按当前语言格式化数字 */\n number(value: number, options?: Intl.NumberFormatOptions & { locale?: string }): string {\n const { locale: localeOverride, ...formatOptions } = options ?? {};\n return new Intl.NumberFormat(localeOverride ?? this.resolvedLocale, formatOptions).format(\n value,\n );\n }\n\n /** 元素 lang 属性优先,其次全局语言 */\n private get resolvedLocale(): string {\n const lang = (this.host as HTMLElement).getAttribute('lang');\n return lang ? resolveLocale(lang) : getLocale();\n }\n\n private handleLanguageChange = (): void => {\n this.host.requestUpdate();\n };\n}\n","import { css } from 'lit';\n\nexport const inputStyles = css`\n :host {\n display: inline-block;\n width: 240px;\n\n /* component 层令牌 */\n --wc-input-height: 32px;\n --wc-input-padding-x: var(--wc-space-2);\n --wc-input-font-size: var(--wc-font-size-medium);\n --wc-input-radius: var(--wc-radius-medium);\n }\n\n :host([size='small']) {\n --wc-input-height: 24px;\n --wc-input-padding-x: var(--wc-space-1);\n --wc-input-font-size: var(--wc-font-size-small);\n }\n\n :host([size='large']) {\n --wc-input-height: 40px;\n --wc-input-padding-x: var(--wc-space-3);\n --wc-input-font-size: var(--wc-font-size-large);\n }\n\n .input {\n display: inline-flex;\n align-items: center;\n gap: var(--wc-space-1);\n width: 100%;\n height: var(--wc-input-height);\n padding: 0 var(--wc-input-padding-x);\n background-color: var(--wc-color-bg-container);\n border: 1px solid var(--wc-color-border);\n border-radius: var(--wc-input-radius);\n transition:\n border-color var(--wc-duration-fast) var(--wc-easing-standard),\n box-shadow var(--wc-duration-fast) var(--wc-easing-standard),\n background-color var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n /* 焦点态:外层容器统一呈现,内层去掉原生 outline 避免双重 */\n .input:focus-within {\n border-color: var(--wc-color-primary);\n box-shadow: 0 0 0 2px var(--wc-color-focus-ring);\n }\n\n .inner {\n flex: 1;\n min-width: 0;\n height: 100%;\n font-family: inherit;\n font-size: var(--wc-input-font-size);\n color: var(--wc-color-text);\n background: transparent;\n border: none;\n outline: none;\n caret-color: var(--wc-color-primary);\n }\n\n .inner::placeholder {\n color: var(--wc-color-text-placeholder);\n }\n\n .inner:disabled {\n cursor: not-allowed;\n }\n\n .affix {\n display: inline-flex;\n align-items: center;\n color: var(--wc-color-text-placeholder);\n flex-shrink: 0;\n }\n\n .affix[hidden] {\n display: none;\n }\n\n .clear {\n width: 16px;\n height: 16px;\n justify-content: center;\n padding: 0;\n border: none;\n border-radius: var(--wc-radius-circle);\n background: transparent;\n color: var(--wc-color-text-placeholder);\n cursor: pointer;\n }\n\n /* wc-icon 的 :host 自带 text 色,这里让叉号跟随按钮的灰阶 */\n .clear wc-icon {\n color: inherit;\n }\n\n .clear:hover {\n color: var(--wc-color-text-secondary);\n }\n\n /* ---- 校验状态 ---- */\n :host([status='success']) .input {\n border-color: var(--wc-color-success);\n }\n\n :host([status='warning']) .input {\n border-color: var(--wc-color-warning);\n }\n\n :host([status='error']) .input {\n border-color: var(--wc-color-error);\n }\n\n :host([status='error']) .input:focus-within {\n border-color: var(--wc-color-error);\n box-shadow: 0 0 0 2px var(--wc-color-error-light);\n }\n\n /* ---- 禁用 / 只读 ---- */\n :host([disabled]) .input {\n background-color: var(--wc-color-bg-disabled);\n border-color: transparent;\n cursor: not-allowed;\n }\n\n :host([disabled]) .inner {\n color: var(--wc-color-text-disabled);\n }\n\n :host([readonly]) .input {\n border-style: dashed;\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { FormAssociatedMixin } from '../../common/form-associated-mixin';\nimport { LocalizeController } from '../../i18n/localize-controller';\nimport '../icon/wc-icon.js';\nimport { inputStyles } from './wc-input.styles';\n\nexport type wcInputSize = 'small' | 'medium' | 'large';\nexport type wcInputStatus = 'default' | 'success' | 'warning' | 'error';\n\n/**\n * 输入框\n *\n * @slot prefix - 前置内容(图标、文字等)\n * @slot suffix - 后置内容(清除按钮之外的区域)\n * @csspart base - 外层容器\n * @csspart input - 原生输入框\n * @csspart clear-button - 清除按钮\n * @cssprop --wc-input-height - 输入框高度\n * @fires wc-input - 输入时触发,detail.value\n * @fires wc-change - 值变更提交时触发(失焦/回车),detail.value\n * @fires wc-clear - 点击清除按钮后触发\n */\nexport class wcInput extends FormAssociatedMixin(LitElement) {\n static styles = [baseStyles, inputStyles];\n\n private _value = '';\n\n /** 输入框的值(响应式属性,同时作为表单值提交) */\n @property()\n get value(): string {\n return this._value;\n }\n\n set value(v: string) {\n const old = this._value;\n this._value = v ?? '';\n this.requestUpdate('value', old);\n }\n\n /** 输入框类型(text/password/tel/url/search 等原生类型) */\n @property() type = 'text';\n\n /** 尺寸 */\n @property({ reflect: true }) size: wcInputSize = 'medium';\n\n /** 占位提示 */\n @property() placeholder = '';\n\n /** 无障碍标签(等价原生 aria-label) */\n @property() label = '';\n\n /** 最大输入长度 */\n @property({ type: Number }) maxlength?: number;\n\n /** 只读 */\n @property({ type: Boolean, reflect: true }) readonly = false;\n\n /** 显示清除按钮(有值且非禁用/只读时) */\n @property({ type: Boolean, reflect: true }) clearable = false;\n\n /** 校验状态(影响边框色) */\n @property({ reflect: true }) status: wcInputStatus = 'default';\n\n private localize = new LocalizeController(this);\n\n override get defaultValue(): unknown {\n return this.getAttribute('value') ?? '';\n }\n\n protected override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (changed.has('value')) {\n this.internals.setFormValue(this.value || null);\n }\n }\n\n override formResetCallback(): void {\n super.formResetCallback();\n this.internals.setFormValue(this.value || null);\n }\n\n private handleInput(e: Event): void {\n const target = e.target as HTMLInputElement;\n this.value = target.value;\n this.dispatchEvent(\n new CustomEvent('wc-input', {\n detail: { value: this.value },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private handleChange(): void {\n this.dispatchEvent(\n new CustomEvent('wc-change', {\n detail: { value: this.value },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private handleClear(e: MouseEvent): void {\n // 阻止 mousedown 导致 input 失焦\n e.preventDefault();\n this.value = '';\n this.dispatchEvent(new CustomEvent('wc-clear', { bubbles: true, composed: true }));\n this.dispatchEvent(\n new CustomEvent('wc-change', { detail: { value: '' }, bubbles: true, composed: true }),\n );\n this.requestUpdate();\n // 清除后保持焦点\n this.shadowRoot!.querySelector('input')?.focus();\n }\n\n render() {\n const showClear = this.clearable && this.value && !this.disabled && !this.readonly;\n return html`\n <div class=\"input\" part=\"base\">\n <span class=\"affix prefix\" part=\"prefix\" ?hidden=${!this._hasPrefix}>\n <slot name=\"prefix\" @slotchange=${this._onPrefixSlotChange}></slot>\n </span>\n <input\n part=\"input\"\n class=\"inner\"\n .value=${this.value}\n type=${this.type}\n ?disabled=${this.disabled}\n ?readonly=${this.readonly}\n placeholder=${this.placeholder}\n maxlength=${this.maxlength ?? -1}\n aria-label=${this.label || undefined}\n @input=${this.handleInput}\n @change=${this.handleChange}\n />\n ${\n showClear\n ? html`\n <button\n type=\"button\"\n class=\"affix clear\"\n part=\"clear-button\"\n tabindex=\"-1\"\n aria-label=${this.localize.term('input.clear')}\n @mousedown=${this.handleClear}\n >\n <wc-icon name=\"close\"></wc-icon>\n </button>\n `\n : ''\n }\n <span class=\"affix suffix\" part=\"suffix\" ?hidden=${!this._hasSuffix}>\n <slot name=\"suffix\" @slotchange=${this._onSuffixSlotChange}></slot>\n </span>\n </div>\n `;\n }\n\n private _hasPrefix = false;\n private _hasSuffix = false;\n\n private _onPrefixSlotChange(e: Event): void {\n this._hasPrefix = (e.target as HTMLSlotElement).assignedElements({ flatten: true }).length > 0;\n this.requestUpdate();\n }\n\n private _onSuffixSlotChange(e: Event): void {\n this._hasSuffix = (e.target as HTMLSlotElement).assignedElements({ flatten: true }).length > 0;\n this.requestUpdate();\n }\n}\n\nif (!customElements.get('wc-input')) {\n customElements.define('wc-input', wcInput);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-input': wcInput;\n }\n}\n","import { css } from 'lit';\n\nexport const textareaStyles = css`\n :host {\n display: inline-block;\n width: 320px;\n\n /* component 层令牌 */\n --wc-textarea-min-height: 80px;\n --wc-textarea-padding-y: var(--wc-space-2);\n --wc-textarea-padding-x: var(--wc-space-2);\n --wc-textarea-font-size: var(--wc-font-size-medium);\n --wc-textarea-radius: var(--wc-radius-medium);\n }\n\n .textarea {\n position: relative;\n display: inline-flex;\n width: 100%;\n min-height: var(--wc-textarea-min-height);\n background-color: var(--wc-color-bg-container);\n border: 1px solid var(--wc-color-border);\n border-radius: var(--wc-textarea-radius);\n transition:\n border-color var(--wc-duration-fast) var(--wc-easing-standard),\n box-shadow var(--wc-duration-fast) var(--wc-easing-standard),\n background-color var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .textarea:focus-within {\n border-color: var(--wc-color-primary);\n box-shadow: 0 0 0 2px var(--wc-color-focus-ring);\n }\n\n .inner {\n flex: 1;\n width: 100%;\n padding: var(--wc-textarea-padding-y) var(--wc-textarea-padding-x);\n font-family: inherit;\n font-size: var(--wc-textarea-font-size);\n line-height: var(--wc-line-height-base);\n color: var(--wc-color-text);\n background: transparent;\n border: none;\n outline: none;\n resize: vertical;\n caret-color: var(--wc-color-primary);\n }\n\n /* autosize 时接管高度,禁用手动拉伸 */\n :host([autosize]) .inner {\n resize: none;\n overflow: hidden;\n }\n\n .inner::placeholder {\n color: var(--wc-color-text-placeholder);\n }\n\n .inner:disabled {\n cursor: not-allowed;\n }\n\n .count {\n position: absolute;\n right: var(--wc-textarea-padding-x);\n bottom: var(--wc-textarea-padding-y);\n font-size: var(--wc-font-size-small);\n color: var(--wc-color-text-placeholder);\n background: var(--wc-color-bg-container);\n pointer-events: none;\n }\n\n :host([status='success']) .textarea {\n border-color: var(--wc-color-success);\n }\n\n :host([status='warning']) .textarea {\n border-color: var(--wc-color-warning);\n }\n\n :host([status='error']) .textarea {\n border-color: var(--wc-color-error);\n }\n\n :host([status='error']) .textarea:focus-within {\n border-color: var(--wc-color-error);\n box-shadow: 0 0 0 2px var(--wc-color-error-light);\n }\n\n :host([disabled]) .textarea {\n background-color: var(--wc-color-bg-disabled);\n border-color: transparent;\n cursor: not-allowed;\n }\n\n :host([disabled]) .inner {\n color: var(--wc-color-text-disabled);\n }\n\n :host([readonly]) .textarea {\n border-style: dashed;\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { FormAssociatedMixin } from '../../common/form-associated-mixin';\nimport '../icon/wc-icon.js';\nimport { textareaStyles } from './wc-textarea.styles';\n\nexport type wcTextareaStatus = 'default' | 'success' | 'warning' | 'error';\n\n/**\n * 多行文本框\n *\n * @csspart base - 外层容器\n * @csspart textarea - 原生多行输入框\n * @csspart count - 字数统计\n * @cssprop --wc-textarea-min-height - 最小高度\n * @fires wc-input - 输入时触发,detail.value\n * @fires wc-change - 值变更提交时触发(失焦),detail.value\n */\nexport class wcTextarea extends FormAssociatedMixin(LitElement) {\n static styles = [baseStyles, textareaStyles];\n\n private _value = '';\n\n /** 文本框的值(响应式属性,同时作为表单值提交) */\n @property()\n get value(): string {\n return this._value;\n }\n\n set value(v: string) {\n const old = this._value;\n this._value = v ?? '';\n this.requestUpdate('value', old);\n }\n\n /** 占位提示 */\n @property() placeholder = '';\n\n /** 无障碍标签(等价原生 aria-label) */\n @property() label = '';\n\n /** 最大输入长度,设置后显示字数统计 */\n @property({ type: Number }) maxlength?: number;\n\n /** 默认行数(autosize 关闭时生效) */\n @property({ type: Number }) rows = 3;\n\n /** 自动按内容调整高度 */\n @property({ type: Boolean, reflect: true }) autosize = false;\n\n /** 只读 */\n @property({ type: Boolean, reflect: true }) readonly = false;\n\n /** 校验状态(影响边框色) */\n @property({ reflect: true }) status: wcTextareaStatus = 'default';\n\n override get defaultValue(): unknown {\n return this.getAttribute('value') ?? '';\n }\n\n protected override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (changed.has('value')) {\n this.internals.setFormValue(this.value || null);\n }\n if (changed.has('value') && this.autosize) {\n this.autoResize();\n }\n }\n\n override formResetCallback(): void {\n super.formResetCallback();\n this.internals.setFormValue(this.value || null);\n }\n\n private handleInput(e: Event): void {\n const target = e.target as HTMLTextAreaElement;\n this.value = target.value;\n this.dispatchEvent(\n new CustomEvent('wc-input', {\n detail: { value: this.value },\n bubbles: true,\n composed: true,\n }),\n );\n if (this.autosize) {\n this.autoResize();\n }\n }\n\n private handleChange(): void {\n this.dispatchEvent(\n new CustomEvent('wc-change', {\n detail: { value: this.value },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n /** 按内容自适应高度:先回到 auto 再取 scrollHeight */\n private autoResize(): void {\n const ta = this.shadowRoot!.querySelector('textarea');\n if (!ta) return;\n ta.style.height = 'auto';\n ta.style.height = `${ta.scrollHeight}px`;\n }\n\n render() {\n return html`\n <div class=\"textarea\" part=\"base\">\n <textarea\n part=\"textarea\"\n class=\"inner\"\n .value=${this.value}\n rows=${this.rows}\n ?disabled=${this.disabled}\n ?readonly=${this.readonly}\n placeholder=${this.placeholder}\n maxlength=${this.maxlength ?? -1}\n aria-label=${this.label || undefined}\n @input=${this.handleInput}\n @change=${this.handleChange}\n ></textarea>\n ${\n this.maxlength\n ? html`<span class=\"count\" part=\"count\">${this.value.length}/${this.maxlength}</span>`\n : ''\n }\n </div>\n `;\n }\n}\n\nif (!customElements.get('wc-textarea')) {\n customElements.define('wc-textarea', wcTextarea);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-textarea': wcTextarea;\n }\n}\n","import { css } from 'lit';\n\nexport const checkboxStyles = css`\n :host {\n display: inline-block;\n\n /* component 层令牌 */\n --wc-checkbox-size: 16px;\n --wc-checkbox-radius: var(--wc-radius-small);\n }\n\n .checkbox {\n display: inline-flex;\n align-items: center;\n gap: var(--wc-space-2);\n font-size: var(--wc-font-size-medium);\n color: var(--wc-color-text);\n cursor: pointer;\n user-select: none;\n }\n\n /* 原生 input 隐藏但保持可聚焦(键盘空格切换) */\n .native {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: 0;\n opacity: 0;\n pointer-events: none;\n }\n\n .box {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wc-checkbox-size);\n height: var(--wc-checkbox-size);\n background-color: var(--wc-color-bg-container);\n border: 1px solid var(--wc-color-border-strong);\n border-radius: var(--wc-checkbox-radius);\n color: var(--wc-color-text-anti);\n flex-shrink: 0;\n transition:\n background-color var(--wc-duration-fast) var(--wc-easing-standard),\n border-color var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .check {\n width: 12px;\n height: 12px;\n opacity: 0;\n transform: scale(0.5);\n transition:\n opacity var(--wc-duration-fast) var(--wc-easing-standard),\n transform var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .dash {\n position: absolute;\n width: 8px;\n height: 2px;\n border-radius: 1px;\n background: currentColor;\n opacity: 0;\n transform: scale(0.5);\n transition:\n opacity var(--wc-duration-fast) var(--wc-easing-standard),\n transform var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n /* 键盘焦点环 */\n .native:focus-visible + .box {\n box-shadow: 0 0 0 2px var(--wc-color-focus-ring);\n }\n\n /* 选中态 */\n :host([checked]) .box {\n background-color: var(--wc-color-primary);\n border-color: var(--wc-color-primary);\n }\n\n :host([checked]) .check {\n opacity: 1;\n transform: scale(1);\n }\n\n /* 半选态(优先于选中态图标) */\n :host([indeterminate]) .box {\n background-color: var(--wc-color-primary);\n border-color: var(--wc-color-primary);\n }\n\n :host([indeterminate]) .check {\n opacity: 0;\n }\n\n :host([indeterminate]) .dash {\n opacity: 1;\n transform: scale(1);\n }\n\n /* 悬停 */\n .checkbox:hover .box:not(.native:disabled + .box) {\n border-color: var(--wc-color-primary);\n }\n\n /* 禁用 */\n :host([disabled]) .checkbox {\n cursor: not-allowed;\n color: var(--wc-color-text-disabled);\n }\n\n :host([disabled]) .box {\n background-color: var(--wc-color-bg-disabled);\n border-color: var(--wc-color-border);\n }\n\n :host([disabled][checked]) .box,\n :host([disabled][indeterminate]) .box {\n background-color: var(--wc-color-border);\n border-color: var(--wc-color-border);\n color: var(--wc-color-text-disabled);\n }\n\n .label {\n line-height: var(--wc-line-height-base);\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { FormAssociatedMixin } from '../../common/form-associated-mixin';\nimport { checkboxStyles } from './wc-checkbox.styles';\n\n/**\n * 复选框\n *\n * @slot - 标签文本\n * @csspart base - 外层容器\n * @csspart box - 方框指示器\n * @csspart label - 标签文本容器\n * @fires wc-change - 选中状态变化时触发,detail.checked / detail.value\n */\nexport class wcCheckbox extends FormAssociatedMixin(LitElement) {\n static styles = [baseStyles, checkboxStyles];\n\n /** 选中状态 */\n @property({ type: Boolean, reflect: true }) checked = false;\n\n /** 半选状态(样式上的不确定态,不改变 checked) */\n @property({ type: Boolean, reflect: true }) indeterminate = false;\n\n /** 选中时提交到表单的值 */\n @property() value = 'on';\n\n /** 无障碍标签(无默认插槽文本时使用) */\n @property() label = '';\n\n /** 表单重置基准:构造时的初始选中态 */\n private initialChecked = false;\n\n constructor() {\n super();\n this.initialChecked = this.hasAttribute('checked');\n }\n\n override get defaultValue(): unknown {\n return this.initialChecked ? this.value : null;\n }\n\n protected override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (changed.has('checked') || changed.has('value')) {\n this.internals.setFormValue(this.checked ? this.value : null);\n }\n }\n\n override formResetCallback(): void {\n super.formResetCallback();\n this.checked = this.initialChecked;\n this.internals.setFormValue(this.checked ? this.value : null);\n }\n\n private handleChange(e: Event): void {\n const input = e.target as HTMLInputElement;\n // 用户交互后解除半选态\n this.indeterminate = false;\n this.checked = input.checked;\n this.dispatchEvent(\n new CustomEvent('wc-change', {\n detail: { checked: this.checked, value: this.value },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n render() {\n return html`\n <label class=\"checkbox\" part=\"base\">\n <input\n type=\"checkbox\"\n class=\"native\"\n .checked=${this.checked}\n .indeterminate=${this.indeterminate}\n ?disabled=${this.disabled}\n aria-label=${this.label || undefined}\n @change=${this.handleChange}\n />\n <span class=\"box\" part=\"box\" aria-hidden=\"true\">\n <svg class=\"check\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M3 8.5L6.5 12L13 4.5\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n <span class=\"dash\"></span>\n </span>\n <span class=\"label\" part=\"label\"><slot></slot></span>\n </label>\n `;\n }\n}\n\nif (!customElements.get('wc-checkbox')) {\n customElements.define('wc-checkbox', wcCheckbox);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-checkbox': wcCheckbox;\n }\n}\n","import { css } from 'lit';\n\nexport const radioStyles = css`\n :host {\n display: inline-block;\n\n /* component 层令牌 */\n --wc-radio-size: 16px;\n }\n\n .radio {\n display: inline-flex;\n align-items: center;\n gap: var(--wc-space-2);\n font-size: var(--wc-font-size-medium);\n color: var(--wc-color-text);\n cursor: pointer;\n user-select: none;\n }\n\n /* 原生 input 隐藏但保持可聚焦(键盘方向键切换) */\n .native {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: 0;\n opacity: 0;\n pointer-events: none;\n }\n\n .dot {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wc-radio-size);\n height: var(--wc-radio-size);\n background-color: var(--wc-color-bg-container);\n border: 1px solid var(--wc-color-border-strong);\n border-radius: var(--wc-radius-circle);\n flex-shrink: 0;\n transition: border-color var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .inner {\n width: calc(var(--wc-radio-size) / 2 - 1px);\n height: calc(var(--wc-radio-size) / 2 - 1px);\n border-radius: var(--wc-radius-circle);\n background-color: var(--wc-color-primary);\n opacity: 0;\n transform: scale(0);\n transition:\n opacity var(--wc-duration-fast) var(--wc-easing-standard),\n transform var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .native:focus-visible + .dot {\n box-shadow: 0 0 0 2px var(--wc-color-focus-ring);\n }\n\n :host([checked]) .dot {\n border-color: var(--wc-color-primary);\n }\n\n :host([checked]) .inner {\n opacity: 1;\n transform: scale(1);\n }\n\n .radio:hover .dot {\n border-color: var(--wc-color-primary);\n }\n\n :host([disabled]) .radio {\n cursor: not-allowed;\n color: var(--wc-color-text-disabled);\n }\n\n :host([disabled]) .dot {\n background-color: var(--wc-color-bg-disabled);\n border-color: var(--wc-color-border);\n }\n\n :host([disabled][checked]) .dot {\n border-color: var(--wc-color-border);\n }\n\n :host([disabled][checked]) .inner {\n background-color: var(--wc-color-text-disabled);\n }\n\n .label {\n line-height: var(--wc-line-height-base);\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { FormAssociatedMixin } from '../../common/form-associated-mixin';\nimport { radioStyles } from './wc-radio.styles';\n\n/**\n * 单选框。同名(name)的 wc-radio 在同一表单内自动互斥分组,\n * 分组行为由浏览器的 form-associated 单选机制保证。\n *\n * @slot - 标签文本\n * @csspart base - 外层容器\n * @csspart dot - 圆点指示器\n * @csspart label - 标签文本容器\n * @fires wc-change - 选中时触发,detail.value\n */\nexport class wcRadio extends FormAssociatedMixin(LitElement) {\n static styles = [baseStyles, radioStyles];\n\n /** 选中状态 */\n @property({ type: Boolean, reflect: true }) checked = false;\n\n /** 选中时提交到表单的值 */\n @property() value = '';\n\n /** 无障碍标签(无默认插槽文本时使用) */\n @property() label = '';\n\n /** 表单重置基准:构造时的初始选中态 */\n private initialChecked = false;\n\n constructor() {\n super();\n this.initialChecked = this.hasAttribute('checked');\n }\n\n override get defaultValue(): unknown {\n return this.initialChecked ? this.value : null;\n }\n\n protected override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (changed.has('checked') || changed.has('value')) {\n this.internals.setFormValue(this.checked ? this.value : null);\n }\n }\n\n override formResetCallback(): void {\n super.formResetCallback();\n this.checked = this.initialChecked;\n this.internals.setFormValue(this.checked ? this.value : null);\n }\n\n private handleChange(e: Event): void {\n const input = e.target as HTMLInputElement;\n this.checked = input.checked;\n this.dispatchEvent(\n new CustomEvent('wc-change', {\n detail: { value: this.value },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n render() {\n return html`\n <label class=\"radio\" part=\"base\">\n <input\n type=\"radio\"\n class=\"native\"\n .checked=${this.checked}\n ?disabled=${this.disabled}\n aria-label=${this.label || undefined}\n @change=${this.handleChange}\n />\n <span class=\"dot\" part=\"dot\" aria-hidden=\"true\"><span class=\"inner\"></span></span>\n <span class=\"label\" part=\"label\"><slot></slot></span>\n </label>\n `;\n }\n}\n\nif (!customElements.get('wc-radio')) {\n customElements.define('wc-radio', wcRadio);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-radio': wcRadio;\n }\n}\n","import { css } from 'lit';\n\nexport const switchStyles = css`\n :host {\n display: inline-block;\n\n /* component 层令牌 */\n --wc-switch-width: 40px;\n --wc-switch-height: 22px;\n --wc-switch-thumb: 18px;\n }\n\n .switch {\n display: inline-flex;\n align-items: center;\n gap: var(--wc-space-2);\n font-size: var(--wc-font-size-medium);\n color: var(--wc-color-text);\n cursor: pointer;\n user-select: none;\n }\n\n /* 原生 input 隐藏但保持可聚焦(键盘空格切换) */\n .native {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: 0;\n opacity: 0;\n pointer-events: none;\n }\n\n .track {\n position: relative;\n display: inline-flex;\n align-items: center;\n width: var(--wc-switch-width);\n height: var(--wc-switch-height);\n padding: 2px;\n background-color: var(--wc-color-gray-300);\n border-radius: var(--wc-radius-round);\n flex-shrink: 0;\n transition: background-color var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .thumb {\n width: var(--wc-switch-thumb);\n height: var(--wc-switch-thumb);\n border-radius: var(--wc-radius-circle);\n background-color: var(--wc-color-text-anti);\n box-shadow: var(--wc-shadow-1);\n transform: translateX(0);\n transition: transform var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .native:focus-visible + .track {\n box-shadow: 0 0 0 2px var(--wc-color-focus-ring);\n }\n\n :host([checked]) .track {\n background-color: var(--wc-color-primary);\n }\n\n :host([checked]) .thumb {\n transform: translateX(calc(var(--wc-switch-width) - var(--wc-switch-height)));\n }\n\n .switch:hover .track {\n background-color: var(--wc-color-gray-400);\n }\n\n :host([checked]) .switch:hover .track {\n background-color: var(--wc-color-primary-hover);\n }\n\n :host([disabled]) .switch {\n cursor: not-allowed;\n color: var(--wc-color-text-disabled);\n }\n\n :host([disabled]) .track {\n background-color: var(--wc-color-bg-disabled);\n }\n\n :host([disabled]) .thumb {\n background-color: var(--wc-color-gray-100);\n box-shadow: none;\n }\n\n .label {\n line-height: var(--wc-line-height-base);\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { FormAssociatedMixin } from '../../common/form-associated-mixin';\nimport { switchStyles } from './wc-switch.styles';\n\n/**\n * 开关\n *\n * @slot - 标签文本\n * @csspart base - 外层容器\n * @csspart track - 轨道\n * @csspart thumb - 滑块\n * @csspart label - 标签文本容器\n * @fires wc-change - 切换时触发,detail.checked\n */\nexport class wcSwitch extends FormAssociatedMixin(LitElement) {\n static styles = [baseStyles, switchStyles];\n\n /** 开启状态 */\n @property({ type: Boolean, reflect: true }) checked = false;\n\n /** 开启时提交到表单的值 */\n @property() checkedValue = 'on';\n\n /** 关闭时提交到表单的值(为空则不提交) */\n @property() uncheckedValue = '';\n\n /** 无障碍标签(无默认插槽文本时使用) */\n @property() label = '';\n\n /** 表单重置基准:构造时的初始状态 */\n private initialChecked = false;\n\n constructor() {\n super();\n this.initialChecked = this.hasAttribute('checked');\n }\n\n override get defaultValue(): unknown {\n return this.initialChecked ? this.checkedValue : this.uncheckedValue || null;\n }\n\n protected override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (changed.has('checked') || changed.has('checkedValue') || changed.has('uncheckedValue')) {\n this.internals.setFormValue(this.checked ? this.checkedValue : this.uncheckedValue || null);\n }\n }\n\n override formResetCallback(): void {\n super.formResetCallback();\n this.checked = this.initialChecked;\n this.internals.setFormValue(this.checked ? this.checkedValue : this.uncheckedValue || null);\n }\n\n private handleChange(e: Event): void {\n const input = e.target as HTMLInputElement;\n this.checked = input.checked;\n this.dispatchEvent(\n new CustomEvent('wc-change', {\n detail: { checked: this.checked },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n render() {\n return html`\n <label class=\"switch\" part=\"base\">\n <input\n type=\"checkbox\"\n role=\"switch\"\n class=\"native\"\n .checked=${this.checked}\n ?disabled=${this.disabled}\n aria-label=${this.label || undefined}\n @change=${this.handleChange}\n />\n <span class=\"track\" part=\"track\" aria-hidden=\"true\">\n <span class=\"thumb\" part=\"thumb\"></span>\n </span>\n <span class=\"label\" part=\"label\"><slot></slot></span>\n </label>\n `;\n }\n}\n\nif (!customElements.get('wc-switch')) {\n customElements.define('wc-switch', wcSwitch);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-switch': wcSwitch;\n }\n}\n","import { css } from 'lit';\n\nexport const optionStyles = css`\n :host {\n display: block;\n }\n\n .option {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--wc-space-2);\n padding: 0 var(--wc-space-3);\n height: 32px;\n font-size: var(--wc-font-size-medium);\n color: var(--wc-color-text);\n cursor: pointer;\n user-select: none;\n transition: background-color var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .text {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .check {\n width: 14px;\n height: 14px;\n color: var(--wc-color-primary);\n flex-shrink: 0;\n opacity: 0;\n }\n\n :host([selected]) .check {\n opacity: 1;\n }\n\n :host([selected]:not([active])) .text {\n color: var(--wc-color-primary);\n font-weight: var(--wc-font-weight-medium);\n }\n\n :host(:hover:not([disabled])) .option,\n :host([active]:not([disabled])) .option {\n background-color: var(--wc-color-bg-hover);\n }\n\n :host([disabled]) .option {\n color: var(--wc-color-text-disabled);\n cursor: not-allowed;\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { optionStyles } from './wc-option.styles';\n\n/**\n * 选项,必须作为 wc-select 的子元素使用。\n *\n * @slot - 选项文本\n * @csspart base - 选项根元素\n */\nexport class wcOption extends LitElement {\n static styles = [optionStyles];\n\n /** 选项值 */\n @property({ reflect: true }) value = '';\n\n /** 禁用 */\n @property({ type: Boolean, reflect: true }) disabled = false;\n\n /** 选中态(由 wc-select 管理,一般无需手动设置) */\n @property({ type: Boolean, reflect: true }) selected = false;\n\n /** 键盘导航高亮态(由 wc-select 管理) */\n @property({ type: Boolean, reflect: true }) active = false;\n\n /** 选项文本 */\n get label(): string {\n return (this.textContent ?? '').trim();\n }\n\n render() {\n return html`\n <div class=\"option\" part=\"base\" role=\"option\" aria-selected=${this.selected}>\n <span class=\"text\"><slot></slot></span>\n <svg class=\"check\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M3 8.5L6.5 12L13 4.5\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </div>\n `;\n }\n}\n\nif (!customElements.get('wc-option')) {\n customElements.define('wc-option', wcOption);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-option': wcOption;\n }\n}\n","import { css } from 'lit';\n\nexport const selectStyles = css`\n :host {\n display: inline-block;\n width: 240px;\n\n /* component 层令牌 */\n --wc-select-height: 32px;\n --wc-select-padding-x: var(--wc-space-2);\n --wc-select-font-size: var(--wc-font-size-medium);\n --wc-select-radius: var(--wc-radius-medium);\n --wc-select-panel-max-height: 280px;\n }\n\n :host([size='small']) {\n --wc-select-height: 24px;\n --wc-select-padding-x: var(--wc-space-1);\n --wc-select-font-size: var(--wc-font-size-small);\n }\n\n :host([size='large']) {\n --wc-select-height: 40px;\n --wc-select-padding-x: var(--wc-space-3);\n --wc-select-font-size: var(--wc-font-size-large);\n }\n\n .select {\n position: relative;\n display: inline-block;\n width: 100%;\n }\n\n .trigger {\n display: inline-flex;\n align-items: center;\n gap: var(--wc-space-1);\n width: 100%;\n height: var(--wc-select-height);\n padding: 0 var(--wc-select-padding-x);\n background-color: var(--wc-color-bg-container);\n border: 1px solid var(--wc-color-border);\n border-radius: var(--wc-select-radius);\n cursor: pointer;\n user-select: none;\n transition:\n border-color var(--wc-duration-fast) var(--wc-easing-standard),\n box-shadow var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n /* 与 input 的 focus-within 对齐:键盘聚焦或展开时均呈现焦点视觉 */\n .trigger:focus-visible,\n :host([open]) .trigger {\n outline: none;\n border-color: var(--wc-color-primary);\n box-shadow: 0 0 0 2px var(--wc-color-focus-ring);\n }\n\n .value {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--wc-select-font-size);\n color: var(--wc-color-text);\n }\n\n .value.placeholder {\n color: var(--wc-color-text-placeholder);\n }\n\n .arrow {\n font-size: 16px;\n color: var(--wc-color-text-placeholder);\n flex-shrink: 0;\n transition: transform var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n :host([open]) .arrow {\n transform: rotate(180deg);\n }\n\n .clear {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n font-size: 16px;\n color: var(--wc-color-text-placeholder);\n border-radius: var(--wc-radius-circle);\n flex-shrink: 0;\n opacity: 0;\n transition: opacity var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .clear:hover {\n color: var(--wc-color-text-secondary);\n }\n\n /* 悬停触发器时显示清除按钮 */\n .trigger:hover .clear,\n .trigger:focus-visible .clear {\n opacity: 1;\n }\n\n /* 有清除按钮时悬停隐藏箭头,避免拥挤 */\n .trigger:hover .clear + .arrow {\n display: none;\n }\n\n .panel {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n z-index: var(--wc-z-index-dropdown);\n width: 100%;\n max-height: var(--wc-select-panel-max-height);\n overflow-y: auto;\n padding: var(--wc-space-1) 0;\n background-color: var(--wc-color-bg-container);\n border: 1px solid var(--wc-color-border);\n border-radius: var(--wc-select-radius);\n box-shadow: var(--wc-shadow-2);\n }\n\n .panel[hidden] {\n display: none;\n }\n\n .empty {\n padding: var(--wc-space-4) var(--wc-space-3);\n font-size: var(--wc-font-size-medium);\n color: var(--wc-color-text-placeholder);\n text-align: center;\n }\n\n /* ---- 校验状态 ---- */\n :host([status='success']) .trigger {\n border-color: var(--wc-color-success);\n }\n\n :host([status='warning']) .trigger {\n border-color: var(--wc-color-warning);\n }\n\n :host([status='error']) .trigger {\n border-color: var(--wc-color-error);\n }\n\n :host([status='error']) .trigger:focus-visible,\n :host([status='error'][open]) .trigger {\n border-color: var(--wc-color-error);\n box-shadow: 0 0 0 2px var(--wc-color-error-light);\n }\n\n /* ---- 禁用 ---- */\n :host([disabled]) .trigger {\n background-color: var(--wc-color-bg-disabled);\n border-color: transparent;\n cursor: not-allowed;\n }\n\n :host([disabled]) .value {\n color: var(--wc-color-text-disabled);\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { FormAssociatedMixin } from '../../common/form-associated-mixin';\nimport { LocalizeController } from '../../i18n/localize-controller';\nimport '../icon/wc-icon.js';\nimport './wc-option.js';\nimport { selectStyles } from './wc-select.styles';\nimport type { wcOption } from './wc-option.js';\n\nexport type wcSelectSize = 'small' | 'medium' | 'large';\nexport type wcSelectStatus = 'default' | 'success' | 'warning' | 'error';\n\n/**\n * 选择器(单选)\n *\n * @slot - 默认插槽,放置 <wc-option>\n * @csspart base - 外层容器\n * @csspart trigger - 触发器\n * @csspart value - 选中文本\n * @csspart panel - 下拉面板\n * @cssprop --wc-select-height - 触发器高度\n * @fires wc-change - 选中值变化时触发,detail.value / detail.label\n * @fires wc-clear - 点击清除按钮后触发\n */\nexport class wcSelect extends FormAssociatedMixin(LitElement) {\n static styles = [baseStyles, selectStyles];\n\n private _value = '';\n\n /** 当前选中值 */\n @property()\n get value(): string {\n return this._value;\n }\n\n set value(v: string) {\n const old = this._value;\n this._value = v ?? '';\n this.requestUpdate('value', old);\n }\n\n /** 占位提示,默认取 i18n 文案 */\n @property() placeholder = '';\n\n /** 尺寸 */\n @property({ reflect: true }) size: wcSelectSize = 'medium';\n\n /** 校验状态(影响边框色) */\n @property({ reflect: true }) status: wcSelectStatus = 'default';\n\n /** 可清除 */\n @property({ type: Boolean, reflect: true }) clearable = false;\n\n /** 下拉面板是否展开(内部状态) */\n @property({ type: Boolean, reflect: true }) open = false;\n\n /** 键盘导航高亮索引(-1 表示无) */\n private activeIndex = -1;\n\n private localize = new LocalizeController(this);\n\n private uid = `wc-select-${Math.random().toString(36).slice(2, 8)}`;\n\n private assignedOptions: wcOption[] = [];\n\n constructor() {\n super();\n this.addEventListener('keydown', this.handleKeydown);\n }\n\n override get defaultValue(): unknown {\n return this.getAttribute('value') ?? '';\n }\n\n protected override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (changed.has('value')) {\n this.syncOptions();\n this.internals.setFormValue(this.value || null);\n }\n }\n\n override formResetCallback(): void {\n super.formResetCallback();\n this.value = String(this.defaultValue ?? '');\n this.internals.setFormValue(this.value || null);\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n document.addEventListener('click', this.onDocumentClick);\n }\n\n override disconnectedCallback(): void {\n document.removeEventListener('click', this.onDocumentClick);\n super.disconnectedCallback();\n }\n\n /** 面板中的选项列表 */\n private get enabledOptions(): wcOption[] {\n return this.assignedOptions.filter((o) => !o.disabled);\n }\n\n private get selectedLabel(): string {\n return this.assignedOptions.find((o) => o.value === this.value)?.label ?? '';\n }\n\n private get displayText(): string {\n return this.value\n ? this.selectedLabel\n : this.placeholder || this.localize.term('select.placeholder');\n }\n\n private onSlotChange(e: Event): void {\n this.assignedOptions = (e.target as HTMLSlotElement)\n .assignedElements()\n .filter((el): el is wcOption => el.tagName === 'WC-OPTION');\n // 为键盘导航分配 id\n this.assignedOptions.forEach((o, i) => o.setAttribute('id', `${this.uid}-opt-${i}`));\n this.syncOptions();\n this.requestUpdate();\n }\n\n private syncOptions(): void {\n for (const o of this.assignedOptions) {\n o.selected = !o.disabled && o.value === this.value;\n }\n }\n\n /* ---------- 开合 ---------- */\n\n private show(): void {\n if (this.disabled || this.open) return;\n this.open = true;\n // 高亮定位到已选中项,否则第一项\n const selectedIdx = this.enabledOptions.findIndex((o) => o.value === this.value);\n this.activeIndex = selectedIdx >= 0 ? selectedIdx : this.enabledOptions.length ? 0 : -1;\n this.scrollToActive();\n }\n\n private hide(): void {\n if (!this.open) return;\n this.open = false;\n this.activeIndex = -1;\n }\n\n private toggle(): void {\n if (this.open) {\n this.hide();\n } else {\n this.show();\n }\n }\n\n private onDocumentClick = (e: MouseEvent): void => {\n if (!(e.composedPath() as Array<EventTarget>).includes(this)) {\n this.hide();\n }\n };\n\n private onTriggerClick(): void {\n this.toggle();\n }\n\n private onPanelClick(e: MouseEvent): void {\n const opt = (e.target as Element).closest('wc-option') as wcOption | null;\n if (opt && !opt.disabled) {\n this.selectOption(opt);\n }\n }\n\n private selectOption(opt: wcOption): void {\n this.value = opt.value;\n this.hide();\n this.dispatchEvent(\n new CustomEvent('wc-change', {\n detail: { value: this.value, label: opt.label },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private handleClear(e: MouseEvent): void {\n e.preventDefault();\n e.stopPropagation();\n this.value = '';\n this.hide();\n this.dispatchEvent(new CustomEvent('wc-clear', { bubbles: true, composed: true }));\n this.dispatchEvent(\n new CustomEvent('wc-change', {\n detail: { value: '', label: '' },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n /* ---------- 键盘导航 ---------- */\n\n private handleKeydown = (e: KeyboardEvent): void => {\n if (this.disabled) return;\n switch (e.key) {\n case 'Enter':\n case ' ':\n e.preventDefault();\n if (this.open && this.activeIndex >= 0) {\n const opt = this.enabledOptions[this.activeIndex];\n if (opt) this.selectOption(opt);\n } else {\n this.show();\n }\n break;\n case 'Escape':\n e.preventDefault();\n this.hide();\n break;\n case 'ArrowDown':\n e.preventDefault();\n if (!this.open) {\n this.show();\n } else if (this.enabledOptions.length) {\n this.activeIndex = (this.activeIndex + 1) % this.enabledOptions.length;\n this.scrollToActive();\n }\n break;\n case 'ArrowUp':\n e.preventDefault();\n if (!this.open) {\n this.show();\n } else if (this.enabledOptions.length) {\n const n = this.enabledOptions.length;\n this.activeIndex = (this.activeIndex - 1 + n) % n;\n this.scrollToActive();\n }\n break;\n case 'Home':\n if (this.open && this.enabledOptions.length) {\n e.preventDefault();\n this.activeIndex = 0;\n this.scrollToActive();\n }\n break;\n case 'End':\n if (this.open && this.enabledOptions.length) {\n e.preventDefault();\n this.activeIndex = this.enabledOptions.length - 1;\n this.scrollToActive();\n }\n break;\n case 'Tab':\n this.hide();\n break;\n }\n };\n\n private scrollToActive(): void {\n // 同步高亮态到选项元素\n for (const o of this.assignedOptions) {\n o.active = false;\n }\n const active = this.enabledOptions[this.activeIndex];\n if (active) active.active = true;\n this.updateComplete.then(() => {\n // jsdom 未实现 scrollIntoView\n if (active && typeof active.scrollIntoView === 'function') {\n active.scrollIntoView({ block: 'nearest' });\n }\n });\n }\n\n render() {\n const activeOption = this.activeIndex >= 0 ? this.enabledOptions[this.activeIndex] : undefined;\n const activeId = activeOption\n ? `${this.uid}-opt-${this.assignedOptions.indexOf(activeOption)}`\n : '';\n const showClear = this.clearable && this.value && !this.disabled;\n return html`\n <div class=\"select\" part=\"base\">\n <div\n class=\"trigger\"\n part=\"trigger\"\n role=\"combobox\"\n tabindex=${this.disabled ? -1 : 0}\n aria-haspopup=\"listbox\"\n aria-expanded=${this.open}\n aria-disabled=${this.disabled}\n aria-controls=${this.open ? `${this.uid}-panel` : undefined}\n aria-activedescendant=${this.open && activeId ? activeId : undefined}\n @click=${this.onTriggerClick}\n >\n <span class=\"value ${this.value ? '' : 'placeholder'}\" part=\"value\"\n >${this.displayText}</span\n >\n ${\n showClear\n ? html`\n <span\n class=\"clear\"\n part=\"clear-button\"\n role=\"button\"\n aria-label=${this.localize.term('input.clear')}\n @mousedown=${(e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n @click=${this.handleClear}\n >\n <wc-icon name=\"close\"></wc-icon>\n </span>\n `\n : ''\n }\n <wc-icon name=\"chevron-down\" class=\"arrow\"></wc-icon>\n </div>\n <div\n class=\"panel\"\n part=\"panel\"\n id=\"${this.uid}-panel\"\n role=\"listbox\"\n ?hidden=${!this.open}\n @click=${this.onPanelClick}\n >\n <slot @slotchange=${this.onSlotChange}></slot>\n ${\n this.assignedOptions.length === 0\n ? html`<div class=\"empty\">${this.localize.term('select.empty')}</div>`\n : ''\n }\n </div>\n </div>\n `;\n }\n}\n\nif (!customElements.get('wc-select')) {\n customElements.define('wc-select', wcSelect);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-select': wcSelect;\n }\n}\n","import { css } from 'lit';\n\nexport const sliderStyles = css`\n :host {\n display: inline-block;\n width: 240px;\n\n /* component 层令牌 */\n --wc-slider-height: 20px;\n --wc-slider-track-height: 4px;\n --wc-slider-thumb-size: 16px;\n }\n\n .slider {\n position: relative;\n display: inline-flex;\n align-items: center;\n width: 100%;\n height: var(--wc-slider-height);\n touch-action: none;\n }\n\n .track {\n width: 100%;\n height: var(--wc-slider-track-height);\n background-color: var(--wc-color-gray-200);\n border-radius: var(--wc-radius-round);\n overflow: hidden;\n }\n\n .fill {\n height: 100%;\n background-color: var(--wc-color-primary);\n transition: width var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .thumb {\n position: absolute;\n top: 50%;\n width: var(--wc-slider-thumb-size);\n height: var(--wc-slider-thumb-size);\n background-color: var(--wc-color-bg-container);\n border: 2px solid var(--wc-color-primary);\n border-radius: var(--wc-radius-circle);\n box-shadow: var(--wc-shadow-1);\n box-sizing: border-box;\n pointer-events: none;\n transform: translate(-50%, -50%);\n transition: left var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n /* 原生 range 覆盖整个区域接收交互,视觉隐藏 */\n .native {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n margin: 0;\n opacity: 0;\n cursor: pointer;\n }\n\n .native:focus-visible ~ .thumb {\n box-shadow: 0 0 0 2px var(--wc-color-focus-ring);\n }\n\n .native:disabled {\n cursor: not-allowed;\n }\n\n :host([disabled]) .track {\n background-color: var(--wc-color-bg-disabled);\n }\n\n :host([disabled]) .fill {\n background-color: var(--wc-color-border);\n }\n\n :host([disabled]) .thumb {\n border-color: var(--wc-color-border);\n box-shadow: none;\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { FormAssociatedMixin } from '../../common/form-associated-mixin';\nimport { sliderStyles } from './wc-slider.styles';\n\n/**\n * 滑块(单值)。键盘导航与 a11y 由隐藏的原生 input[type=range] 提供\n * (方向键 ±step、PageUp/Down 翻页、Home/End 边界)。\n *\n * @csspart base - 外层容器\n * @csspart track - 轨道\n * @csspart fill - 已滑过部分\n * @csspart thumb - 滑块按钮\n * @fires wc-input - 拖动过程中持续触发,detail.value\n * @fires wc-change - 松手提交时触发,detail.value\n */\nexport class wcSlider extends FormAssociatedMixin(LitElement) {\n static styles = [baseStyles, sliderStyles];\n\n private _value = 0;\n\n /** 当前值 */\n @property({ type: Number })\n get value(): number {\n return this._value;\n }\n\n set value(v: number) {\n const old = this._value;\n this._value = this.clamp(v);\n this.requestUpdate('value', old);\n }\n\n /** 最小值 */\n @property({ type: Number }) min = 0;\n\n /** 最大值 */\n @property({ type: Number }) max = 100;\n\n /** 步长 */\n @property({ type: Number }) step = 1;\n\n /** 无障碍标签 */\n @property() label = '';\n\n /** 按 step 取整并夹在 [min, max] 区间 */\n private clamp(v: number): number {\n if (Number.isNaN(v)) return this._value;\n const stepped = Math.round((v - this.min) / this.step) * this.step + this.min;\n const fixed = Number(stepped.toFixed(10));\n return Math.min(this.max, Math.max(this.min, fixed));\n }\n\n private get percent(): number {\n if (this.max === this.min) return 0;\n return ((this.value - this.min) / (this.max - this.min)) * 100;\n }\n\n override get defaultValue(): unknown {\n const attr = this.getAttribute('value');\n return attr ? Number(attr) : 0;\n }\n\n protected override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (changed.has('value')) {\n this.internals.setFormValue(String(this.value));\n }\n }\n\n override formResetCallback(): void {\n super.formResetCallback();\n this.value = Number(this.defaultValue ?? 0);\n this.internals.setFormValue(String(this.value));\n }\n\n private handleInput(e: Event): void {\n const input = e.target as HTMLInputElement;\n this.value = Number(input.value);\n this.dispatchEvent(\n new CustomEvent('wc-input', {\n detail: { value: this.value },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private handleChange(): void {\n this.dispatchEvent(\n new CustomEvent('wc-change', {\n detail: { value: this.value },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n render() {\n return html`\n <div class=\"slider\" part=\"base\">\n <div class=\"track\" part=\"track\">\n <div class=\"fill\" part=\"fill\" style=\"width: ${this.percent}%\"></div>\n </div>\n <div class=\"thumb\" part=\"thumb\" style=\"left: ${this.percent}%\"></div>\n <input\n type=\"range\"\n class=\"native\"\n min=${this.min}\n max=${this.max}\n step=${this.step}\n .value=${String(this.value)}\n ?disabled=${this.disabled}\n aria-label=${this.label || undefined}\n @input=${this.handleInput}\n @change=${this.handleChange}\n />\n </div>\n `;\n }\n}\n\nif (!customElements.get('wc-slider')) {\n customElements.define('wc-slider', wcSlider);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-slider': wcSlider;\n }\n}\n","import { css } from 'lit';\n\nexport const inputNumberStyles = css`\n :host {\n display: inline-block;\n width: 144px;\n\n /* component 层令牌 */\n --wc-input-number-height: 32px;\n --wc-input-number-padding-x: var(--wc-space-2);\n --wc-input-number-font-size: var(--wc-font-size-medium);\n --wc-input-number-radius: var(--wc-radius-medium);\n --wc-input-number-step-width: 28px;\n }\n\n :host([size='small']) {\n --wc-input-number-height: 24px;\n --wc-input-number-padding-x: var(--wc-space-1);\n --wc-input-number-font-size: var(--wc-font-size-small);\n --wc-input-number-step-width: 24px;\n }\n\n :host([size='large']) {\n --wc-input-number-height: 40px;\n --wc-input-number-padding-x: var(--wc-space-3);\n --wc-input-number-font-size: var(--wc-font-size-large);\n --wc-input-number-step-width: 32px;\n }\n\n .number {\n display: flex;\n align-items: stretch;\n width: 100%;\n height: var(--wc-input-number-height);\n background-color: var(--wc-color-bg-container);\n border: 1px solid var(--wc-color-border);\n border-radius: var(--wc-input-number-radius);\n transition:\n border-color var(--wc-duration-fast) var(--wc-easing-standard),\n box-shadow var(--wc-duration-fast) var(--wc-easing-standard),\n background-color var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .number:focus-within {\n border-color: var(--wc-color-primary);\n box-shadow: 0 0 0 2px var(--wc-color-focus-ring);\n }\n\n .inner {\n flex: 1;\n min-width: 0;\n padding: 0 var(--wc-input-number-padding-x);\n font-family: inherit;\n font-size: var(--wc-input-number-font-size);\n color: var(--wc-color-text);\n text-align: center;\n background: transparent;\n border: none;\n outline: none;\n caret-color: var(--wc-color-primary);\n }\n\n :host([theme='column']) .inner,\n :host([theme='normal']) .inner {\n text-align: inherit;\n }\n\n .inner::placeholder {\n color: var(--wc-color-text-placeholder);\n }\n\n .inner:disabled {\n cursor: not-allowed;\n }\n\n .step {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: var(--wc-input-number-step-width);\n padding: 0;\n color: var(--wc-color-text-secondary);\n cursor: pointer;\n background: transparent;\n border: none;\n border-radius: 0;\n transition:\n background-color var(--wc-duration-fast) var(--wc-easing-standard),\n color var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .step:hover:not(:disabled):not(:active) {\n color: var(--wc-color-primary);\n background-color: var(--wc-color-bg-hover);\n }\n\n .step:active:not(:disabled) {\n color: var(--wc-color-primary-active);\n }\n\n .step:disabled {\n color: var(--wc-color-text-disabled);\n cursor: not-allowed;\n }\n\n .step wc-icon {\n pointer-events: none;\n }\n\n /* ---- column 主题:步进按钮右侧纵向堆叠 ---- */\n .stepper {\n display: flex;\n flex-direction: column;\n flex-shrink: 0;\n width: 22px;\n border-left: 1px solid var(--wc-color-border);\n }\n\n :host([theme='column']) .step {\n flex: 1;\n width: 100%;\n }\n\n :host([theme='column']) .step wc-icon {\n font-size: 10px;\n }\n\n .stepper .step + .step {\n border-top: 1px solid var(--wc-color-border);\n }\n\n /* row 主题:左右两个按钮与边框衔接处不留圆角缝隙 */\n :host([theme='row']) .number {\n overflow: hidden;\n }\n\n /* ---- 校验状态 ---- */\n :host([status='success']) .number {\n border-color: var(--wc-color-success);\n }\n\n :host([status='warning']) .number {\n border-color: var(--wc-color-warning);\n }\n\n :host([status='error']) .number {\n border-color: var(--wc-color-error);\n }\n\n :host([status='error']) .number:focus-within {\n border-color: var(--wc-color-error);\n box-shadow: 0 0 0 2px var(--wc-color-error-light);\n }\n\n /* ---- 禁用 / 只读 ---- */\n :host([disabled]) .number {\n background-color: var(--wc-color-bg-disabled);\n border-color: transparent;\n cursor: not-allowed;\n }\n\n :host([disabled]) .inner {\n color: var(--wc-color-text-disabled);\n }\n\n :host([readonly]) .number {\n border-style: dashed;\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { FormAssociatedMixin } from '../../common/form-associated-mixin';\nimport { LocalizeController } from '../../i18n/localize-controller';\nimport '../icon/wc-icon.js';\nimport { inputNumberStyles } from './wc-input-number.styles';\n\nexport type wcInputNumberTheme = 'row' | 'column' | 'normal';\nexport type wcInputNumberSize = 'small' | 'medium' | 'large';\nexport type wcInputNumberStatus = 'default' | 'success' | 'warning' | 'error';\n\n/**\n * 数字输入框。取整逻辑复用 Slider 的 clamp(按 step 取整 + 浮点修正),\n * 骨架复用 Input 的 affix 布局;步进按钮与键盘(↑/↓)共用 stepBy。\n *\n * @slot - 无\n * @csspart base - 外层容器\n * @csspart input - 原生输入框\n * @csspart increment-button - 增加按钮\n * @csspart decrement-button - 减少按钮\n * @cssprop --wc-input-number-height - 高度\n * @fires wc-input - 手动输入时持续触发,detail.value 为解析结果(非法时为 NaN)\n * @fires wc-change - 值提交时触发(失焦/回车/步进),detail.value\n */\nexport class wcInputNumber extends FormAssociatedMixin(LitElement) {\n static styles = [baseStyles, inputNumberStyles];\n\n private _value = 0;\n\n /** 当前值 */\n @property({ type: Number })\n get value(): number {\n return this._value;\n }\n\n set value(v: number) {\n const old = this._value;\n this._value = this.clamp(v);\n this.requestUpdate('value', old);\n }\n\n /** 最小值 */\n @property({ type: Number }) min = -Infinity;\n\n /** 最大值 */\n @property({ type: Number }) max = Infinity;\n\n /** 步长 */\n @property({ type: Number }) step = 1;\n\n /** 步进按钮布局:row 左右 / column 右侧纵排 / normal 不显示 */\n @property({ reflect: true }) theme: wcInputNumberTheme = 'row';\n\n /** 尺寸 */\n @property({ reflect: true }) size: wcInputNumberSize = 'medium';\n\n /** 占位提示 */\n @property() placeholder = '';\n\n /** 无障碍标签(等价原生 aria-label) */\n @property() label = '';\n\n /** 只读 */\n @property({ type: Boolean, reflect: true }) readonly = false;\n\n /** 校验状态(影响边框色) */\n @property({ reflect: true }) status: wcInputNumberStatus = 'default';\n\n private localize = new LocalizeController(this);\n\n /** 编辑态标记:true 时输入框显示 _text,不受 value 同步干扰 */\n private _editing = false;\n\n /** 编辑中的原始文本 */\n private _text = '';\n\n /** 按 step 取整并夹在 [min, max] 区间(与 Slider 同一套算法,额外处理 ±Infinity 边界) */\n private clamp(v: number): number {\n if (Number.isNaN(v)) return this._value;\n // min 为 -Infinity 时 (v - min) 溢出为 Infinity,改以 0 为对齐基准\n const stepped = Number.isFinite(this.min)\n ? Math.round((v - this.min) / this.step) * this.step + this.min\n : Math.round(v / this.step) * this.step;\n const fixed = Number(stepped.toFixed(10));\n return Math.min(this.max, Math.max(this.min, fixed));\n }\n\n private formatValue(): string {\n return String(this._value);\n }\n\n override get defaultValue(): unknown {\n const attr = this.getAttribute('value');\n return attr ? Number(attr) : 0;\n }\n\n protected override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (changed.has('value')) {\n this.internals.setFormValue(String(this.value));\n }\n }\n\n override formResetCallback(): void {\n super.formResetCallback();\n this.value = Number(this.defaultValue ?? 0);\n this.internals.setFormValue(String(this.value));\n }\n\n /** 步进:按钮点击与 ↑/↓ 键盘共用;值未变化时不派发事件 */\n private stepBy(direction: 1 | -1): void {\n if (this.disabled || this.readonly) return;\n const next = this.clamp(this.value + direction * this.step);\n if (next === this.value) return;\n this.value = next;\n this.internals.setFormValue(String(this.value));\n this.dispatchEvent(\n new CustomEvent('wc-change', {\n detail: { value: this.value },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n /** 提交编辑中的文本:空/非法回退当前值,合法则取整夹紧后提交 */\n private commit(): void {\n if (!this._editing) return;\n this._editing = false;\n this._text = '';\n const raw = this.shadowRoot!.querySelector<HTMLInputElement>('.inner')!.value.trim();\n const parsed = Number(raw);\n const next = raw === '' || Number.isNaN(parsed) ? this._value : this.clamp(parsed);\n this.requestUpdate();\n if (next === this._value) return;\n this.value = next;\n this.internals.setFormValue(String(this.value));\n this.dispatchEvent(\n new CustomEvent('wc-change', {\n detail: { value: this.value },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private handleFocus(): void {\n this._editing = true;\n this._text = this.formatValue();\n this.requestUpdate();\n }\n\n private handleBlur(): void {\n this.commit();\n }\n\n private handleInput(e: Event): void {\n const input = e.target as HTMLInputElement;\n this._text = input.value;\n this.dispatchEvent(\n new CustomEvent('wc-input', {\n detail: { value: Number(input.value), text: input.value },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private handleKeydown(e: KeyboardEvent): void {\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n this.stepBy(1);\n } else if (e.key === 'ArrowDown') {\n e.preventDefault();\n this.stepBy(-1);\n } else if (e.key === 'Enter') {\n this.commit();\n }\n }\n\n private get canDecrement(): boolean {\n return !this.disabled && !this.readonly && this.value > this.min;\n }\n\n private get canIncrement(): boolean {\n return !this.disabled && !this.readonly && this.value < this.max;\n }\n\n render() {\n const stepBtn = (dir: 1 | -1) => {\n const increment = dir === 1;\n return html`\n <button\n type=\"button\"\n class=\"step ${increment ? 'plus' : 'minus'}\"\n part=${increment ? 'increment-button' : 'decrement-button'}\n tabindex=\"-1\"\n ?disabled=${increment ? !this.canIncrement : !this.canDecrement}\n aria-label=${this.localize.term(increment ? 'inputNumber.increment' : 'inputNumber.decrement')}\n @click=${() => this.stepBy(dir)}\n >\n <wc-icon name=${increment ? 'plus' : 'minus'}></wc-icon>\n </button>\n `;\n };\n\n const inner = html`\n <input\n part=\"input\"\n class=\"inner\"\n type=\"text\"\n inputmode=\"decimal\"\n .value=${this._editing ? this._text : this.formatValue()}\n ?disabled=${this.disabled}\n ?readonly=${this.readonly}\n placeholder=${this.placeholder}\n aria-label=${this.label || undefined}\n @focus=${this.handleFocus}\n @blur=${this.handleBlur}\n @input=${this.handleInput}\n @keydown=${this.handleKeydown}\n />\n `;\n\n if (this.theme === 'normal') {\n return html`<div class=\"number\" part=\"base\">${inner}</div>`;\n }\n if (this.theme === 'column') {\n return html`\n <div class=\"number\" part=\"base\">\n ${inner}\n <span class=\"stepper\" part=\"stepper\"> ${stepBtn(1)}${stepBtn(-1)} </span>\n </div>\n `;\n }\n return html` <div class=\"number\" part=\"base\">${stepBtn(-1)}${inner}${stepBtn(1)}</div> `;\n }\n}\n\nif (!customElements.get('wc-input-number')) {\n customElements.define('wc-input-number', wcInputNumber);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-input-number': wcInputNumber;\n }\n}\n","import { css } from 'lit';\n\nexport const datePickerStyles = css`\n :host {\n display: inline-block;\n width: 240px;\n\n /* component 层令牌 */\n --wc-date-picker-height: 32px;\n --wc-date-picker-padding-x: var(--wc-space-2);\n --wc-date-picker-font-size: var(--wc-font-size-medium);\n --wc-date-picker-radius: var(--wc-radius-medium);\n --wc-date-picker-cell-size: 32px;\n }\n\n :host([size='small']) {\n --wc-date-picker-height: 24px;\n --wc-date-picker-padding-x: var(--wc-space-1);\n --wc-date-picker-font-size: var(--wc-font-size-small);\n --wc-date-picker-cell-size: 28px;\n }\n\n :host([size='large']) {\n --wc-date-picker-height: 40px;\n --wc-date-picker-padding-x: var(--wc-space-3);\n --wc-date-picker-font-size: var(--wc-font-size-large);\n --wc-date-picker-cell-size: 36px;\n }\n\n .picker {\n position: relative;\n display: inline-block;\n width: 100%;\n }\n\n .trigger {\n display: inline-flex;\n align-items: center;\n gap: var(--wc-space-1);\n width: 100%;\n height: var(--wc-date-picker-height);\n padding: 0 var(--wc-date-picker-padding-x);\n background-color: var(--wc-color-bg-container);\n border: 1px solid var(--wc-color-border);\n border-radius: var(--wc-date-picker-radius);\n cursor: pointer;\n user-select: none;\n transition:\n border-color var(--wc-duration-fast) var(--wc-easing-standard),\n box-shadow var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .trigger:focus-visible {\n outline: none;\n border-color: var(--wc-color-primary);\n box-shadow: 0 0 0 2px var(--wc-color-focus-ring);\n }\n\n .value {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--wc-date-picker-font-size);\n color: var(--wc-color-text);\n }\n\n .value.placeholder {\n color: var(--wc-color-text-placeholder);\n }\n\n .icon {\n font-size: 16px;\n color: var(--wc-color-text-placeholder);\n flex-shrink: 0;\n }\n\n .clear {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n font-size: 16px;\n color: var(--wc-color-text-placeholder);\n border-radius: var(--wc-radius-circle);\n flex-shrink: 0;\n opacity: 0;\n transition: opacity var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .clear:hover {\n color: var(--wc-color-text-secondary);\n }\n\n .trigger:hover .clear,\n .trigger:focus-visible .clear {\n opacity: 1;\n }\n\n .trigger:hover .clear + .icon {\n display: none;\n }\n\n /* ---- 日历面板 ---- */\n .panel {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n z-index: var(--wc-z-index-dropdown);\n padding: var(--wc-space-3);\n background-color: var(--wc-color-bg-container);\n border: 1px solid var(--wc-color-border);\n border-radius: var(--wc-date-picker-radius);\n box-shadow: var(--wc-shadow-2);\n }\n\n .panel[hidden] {\n display: none;\n }\n\n .header {\n display: flex;\n align-items: center;\n gap: var(--wc-space-1);\n margin-bottom: var(--wc-space-2);\n }\n\n .month-label {\n flex: 1;\n min-width: 0;\n font-size: var(--wc-font-size-medium);\n font-weight: var(--wc-font-weight-medium, 500);\n color: var(--wc-color-text);\n text-align: center;\n white-space: nowrap;\n }\n\n .nav {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n padding: 0;\n font-size: 12px;\n color: var(--wc-color-text-secondary);\n cursor: pointer;\n background: transparent;\n border: none;\n border-radius: var(--wc-radius-small);\n transition:\n background-color var(--wc-duration-fast) var(--wc-easing-standard),\n color var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .nav wc-icon + wc-icon {\n margin-left: -10px;\n }\n\n .nav:hover {\n color: var(--wc-color-primary);\n background-color: var(--wc-color-bg-hover);\n }\n\n .grid {\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .row {\n display: grid;\n grid-template-columns: repeat(7, var(--wc-date-picker-cell-size));\n }\n\n .cell {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wc-date-picker-cell-size);\n height: var(--wc-date-picker-cell-size);\n box-sizing: border-box;\n font-size: var(--wc-font-size-small);\n color: var(--wc-color-text);\n border: 1px solid transparent;\n border-radius: var(--wc-radius-circle);\n user-select: none;\n }\n\n .cell.weekday {\n height: auto;\n color: var(--wc-color-text-placeholder);\n cursor: default;\n }\n\n .cell.day {\n cursor: pointer;\n transition:\n background-color var(--wc-duration-fast) var(--wc-easing-standard),\n color var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .cell.day:hover {\n background-color: var(--wc-color-bg-hover);\n }\n\n .cell.day.out {\n color: var(--wc-color-text-placeholder);\n }\n\n .cell.day.today {\n border-color: var(--wc-color-primary);\n color: var(--wc-color-primary);\n }\n\n .cell.day.active {\n box-shadow: inset 0 0 0 1px var(--wc-color-primary);\n }\n\n .cell.day.selected {\n background-color: var(--wc-color-primary);\n color: var(--wc-color-text-anti);\n }\n\n .cell.day.selected.today {\n border-color: var(--wc-color-primary);\n color: var(--wc-color-text-anti);\n }\n\n .footer {\n display: flex;\n justify-content: flex-end;\n margin-top: var(--wc-space-2);\n padding-top: var(--wc-space-2);\n border-top: 1px solid var(--wc-color-border);\n }\n\n .today {\n padding: 2px var(--wc-space-2);\n font-size: var(--wc-font-size-small);\n color: var(--wc-color-primary);\n cursor: pointer;\n background: transparent;\n border: none;\n border-radius: var(--wc-radius-small);\n transition: background-color var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .today:hover {\n background-color: var(--wc-color-primary-light);\n }\n\n /* ---- 校验状态 ---- */\n :host([status='success']) .trigger {\n border-color: var(--wc-color-success);\n }\n\n :host([status='warning']) .trigger {\n border-color: var(--wc-color-warning);\n }\n\n :host([status='error']) .trigger {\n border-color: var(--wc-color-error);\n }\n\n :host([status='error']) .trigger:focus-visible {\n border-color: var(--wc-color-error);\n box-shadow: 0 0 0 2px var(--wc-color-error-light);\n }\n\n /* ---- 禁用 / 只读 ---- */\n :host([disabled]) .trigger {\n background-color: var(--wc-color-bg-disabled);\n border-color: transparent;\n cursor: not-allowed;\n }\n\n :host([disabled]) .value {\n color: var(--wc-color-text-disabled);\n }\n\n :host([readonly]) .trigger {\n border-style: dashed;\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { FormAssociatedMixin } from '../../common/form-associated-mixin';\nimport { LocalizeController } from '../../i18n/localize-controller';\nimport '../icon/wc-icon.js';\nimport { datePickerStyles } from './wc-date-picker.styles';\n\nexport type wcDatePickerSize = 'small' | 'medium' | 'large';\nexport type wcDatePickerStatus = 'default' | 'success' | 'warning' | 'error';\n\ninterface CalendarCell {\n /** ISO 日期 YYYY-MM-DD */\n iso: string;\n /** 显示的日号 */\n day: number;\n /** 是否属于当前视图月份 */\n inMonth: boolean;\n /** 是否今天 */\n isToday: boolean;\n}\n\n/* ---------- 日期工具(本地时区,避免 UTC 偏移问题) ---------- */\n\nfunction pad2(n: number): string {\n return String(n).padStart(2, '0');\n}\n\nfunction formatDate(d: Date): string {\n return `${d.getFullYear()}-${pad2(d.getMonth() + 1)}-${pad2(d.getDate())}`;\n}\n\nfunction parseDate(iso: string): Date | null {\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(iso);\n if (!m) return null;\n const d = new Date(Number(m[1]), Number(m[2]) - 1, Number(m[3]));\n return Number.isNaN(d.getTime()) ? null : d;\n}\n\nfunction addDays(d: Date, days: number): Date {\n return new Date(d.getFullYear(), d.getMonth(), d.getDate() + days);\n}\n\n/**\n * 日期选择器。面板开合、document 点击关闭与 aria-activedescendant 键盘模式\n * 复用 Select 的方案;日期运算全部基于本地时区。\n *\n * @csspart base - 外层容器\n * @csspart trigger - 触发器\n * @csspart panel - 日历面板\n * @cssprop --wc-date-picker-height - 触发器高度\n * @fires wc-change - 选中日期变化时触发,detail.value(YYYY-MM-DD)\n * @fires wc-clear - 点击清除按钮后触发\n */\nexport class wcDatePicker extends FormAssociatedMixin(LitElement) {\n static styles = [baseStyles, datePickerStyles];\n\n private _value = '';\n\n /** 当前选中值(YYYY-MM-DD) */\n @property()\n get value(): string {\n return this._value;\n }\n\n set value(v: string) {\n const old = this._value;\n this._value = v && parseDate(v) ? v : '';\n this.requestUpdate('value', old);\n }\n\n /** 占位提示,默认取 i18n 文案 */\n @property() placeholder = '';\n\n /** 无障碍标签 */\n @property() label = '';\n\n /** 尺寸 */\n @property({ reflect: true }) size: wcDatePickerSize = 'medium';\n\n /** 校验状态(影响边框色) */\n @property({ reflect: true }) status: wcDatePickerStatus = 'default';\n\n /** 可清除 */\n @property({ type: Boolean, reflect: true }) clearable = false;\n\n /** 只读 */\n @property({ type: Boolean, reflect: true }) readonly = false;\n\n /** 一周从周几开始:0 周日(默认)~ 6 周六 */\n @property({ type: Number, attribute: 'first-day-of-week' }) firstDayOfWeek = 0;\n\n /** 面板是否展开(内部状态) */\n @property({ type: Boolean, reflect: true }) open = false;\n\n /** 日历视图的年(内部状态) */\n private viewYear = new Date().getFullYear();\n\n /** 日历视图的月 0~11(内部状态) */\n private viewMonth = new Date().getMonth();\n\n /** 键盘导航高亮的日期(内部状态) */\n private activeIso = '';\n\n private localize = new LocalizeController(this);\n\n private uid = `wc-date-picker-${Math.random().toString(36).slice(2, 8)}`;\n\n constructor() {\n super();\n this.addEventListener('keydown', this.handleKeydown);\n }\n\n override get defaultValue(): unknown {\n return this.getAttribute('value') ?? '';\n }\n\n protected override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (changed.has('value')) {\n this.internals.setFormValue(this.value || null);\n }\n }\n\n override formResetCallback(): void {\n super.formResetCallback();\n this.value = String(this.defaultValue ?? '');\n this.internals.setFormValue(this.value || null);\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n document.addEventListener('click', this.onDocumentClick);\n }\n\n override disconnectedCallback(): void {\n document.removeEventListener('click', this.onDocumentClick);\n super.disconnectedCallback();\n }\n\n /* ---------- 开合(同 Select 模式) ---------- */\n\n private show(): void {\n if (this.disabled || this.readonly || this.open) return;\n this.open = true;\n // 视图与高亮定位到已选日期,否则今天\n const base = parseDate(this.value) ?? new Date();\n this.viewYear = base.getFullYear();\n this.viewMonth = base.getMonth();\n this.activeIso = formatDate(base);\n }\n\n private hide(): void {\n if (!this.open) return;\n this.open = false;\n this.activeIso = '';\n }\n\n private toggle(): void {\n if (this.open) {\n this.hide();\n } else {\n this.show();\n }\n }\n\n private onDocumentClick = (e: MouseEvent): void => {\n if (!(e.composedPath() as Array<EventTarget>).includes(this)) {\n this.hide();\n }\n };\n\n /* ---------- 日历视图 ---------- */\n\n private setView(year: number, month: number): void {\n this.viewYear = year;\n this.viewMonth = month;\n this.requestUpdate();\n }\n\n private prevMonth(): void {\n const m = this.viewMonth === 0 ? 11 : this.viewMonth - 1;\n const y = this.viewMonth === 0 ? this.viewYear - 1 : this.viewYear;\n this.setView(y, m);\n }\n\n private nextMonth(): void {\n const m = this.viewMonth === 11 ? 0 : this.viewMonth + 1;\n const y = this.viewMonth === 11 ? this.viewYear + 1 : this.viewYear;\n this.setView(y, m);\n }\n\n private prevYear(): void {\n this.setView(this.viewYear - 1, this.viewMonth);\n }\n\n private nextYear(): void {\n this.setView(this.viewYear + 1, this.viewMonth);\n }\n\n /** 6 行 × 7 列 = 42 格,含前后月补位日期 */\n private get calendarCells(): CalendarCell[] {\n const first = new Date(this.viewYear, this.viewMonth, 1);\n const startOffset = (first.getDay() - this.firstDayOfWeek + 7) % 7;\n const start = new Date(this.viewYear, this.viewMonth, 1 - startOffset);\n const todayIso = formatDate(new Date());\n const cells: CalendarCell[] = [];\n for (let i = 0; i < 42; i++) {\n const d = addDays(start, i);\n const iso = formatDate(d);\n cells.push({\n iso,\n day: d.getDate(),\n inMonth: d.getMonth() === this.viewMonth,\n isToday: iso === todayIso,\n });\n }\n return cells;\n }\n\n /** 表头星期标签,顺序按 firstDayOfWeek 旋转(Intl 本地化,中文取单字「日一二三四五六」) */\n private get weekdayLabels(): string[] {\n // 2023-01-01 是周日,作为基准依次取星期窄名\n return Array.from({ length: 7 }, (_, i) =>\n this.localize.date(new Date(2023, 0, 1 + ((this.firstDayOfWeek + i) % 7)), {\n weekday: 'narrow',\n }),\n );\n }\n\n private get monthLabel(): string {\n return this.localize.date(new Date(this.viewYear, this.viewMonth, 1), {\n year: 'numeric',\n month: 'long',\n });\n }\n\n /* ---------- 选择 ---------- */\n\n private selectDate(iso: string): void {\n this.value = iso;\n this.hide();\n this.dispatchEvent(\n new CustomEvent('wc-change', { detail: { value: iso }, bubbles: true, composed: true }),\n );\n }\n\n private handleClear(e: MouseEvent): void {\n e.preventDefault();\n e.stopPropagation();\n this.value = '';\n this.hide();\n this.dispatchEvent(new CustomEvent('wc-clear', { bubbles: true, composed: true }));\n this.dispatchEvent(\n new CustomEvent('wc-change', { detail: { value: '' }, bubbles: true, composed: true }),\n );\n }\n\n private selectToday(): void {\n this.selectDate(formatDate(new Date()));\n }\n\n private onCellClick(e: MouseEvent): void {\n const cell = (e.target as Element).closest<HTMLElement>('[data-iso]');\n if (cell?.dataset.iso) this.selectDate(cell.dataset.iso);\n }\n\n /* ---------- 键盘导航(activedescendant 模式,同 Select) ---------- */\n\n private moveActive(delta: number): void {\n if (!this.open) return;\n const base = parseDate(this.activeIso) ?? new Date();\n const next = addDays(base, delta);\n const iso = formatDate(next);\n this.activeIso = iso;\n // 跨月时同步翻页视图\n if (next.getFullYear() !== this.viewYear || next.getMonth() !== this.viewMonth) {\n this.setView(next.getFullYear(), next.getMonth());\n } else {\n this.requestUpdate();\n }\n }\n\n private handleKeydown = (e: KeyboardEvent): void => {\n if (this.disabled || this.readonly) return;\n switch (e.key) {\n case 'Enter':\n case ' ':\n e.preventDefault();\n if (this.open && this.activeIso) {\n this.selectDate(this.activeIso);\n } else {\n this.show();\n }\n break;\n case 'Escape':\n e.preventDefault();\n this.hide();\n break;\n case 'ArrowLeft':\n e.preventDefault();\n if (this.open) this.moveActive(-1);\n else this.show();\n break;\n case 'ArrowRight':\n e.preventDefault();\n if (this.open) this.moveActive(1);\n else this.show();\n break;\n case 'ArrowUp':\n e.preventDefault();\n if (this.open) this.moveActive(-7);\n else this.show();\n break;\n case 'ArrowDown':\n e.preventDefault();\n if (this.open) this.moveActive(7);\n else this.show();\n break;\n case 'Home':\n if (this.open) {\n e.preventDefault();\n this.moveActive(-7);\n }\n break;\n case 'End':\n if (this.open) {\n e.preventDefault();\n this.moveActive(7);\n }\n break;\n case 'Tab':\n this.hide();\n break;\n }\n };\n\n render() {\n const showClear = this.clearable && this.value && !this.disabled && !this.readonly;\n const cells = this.open ? this.calendarCells : [];\n const rows: CalendarCell[][] = [];\n for (let i = 0; i < cells.length; i += 7) rows.push(cells.slice(i, i + 7));\n\n return html`\n <div class=\"picker\" part=\"base\">\n <div\n class=\"trigger\"\n part=\"trigger\"\n role=\"combobox\"\n tabindex=${this.disabled ? -1 : 0}\n aria-haspopup=\"grid\"\n aria-expanded=${this.open}\n aria-disabled=${this.disabled}\n aria-label=${this.label || undefined}\n aria-controls=${this.open ? `${this.uid}-panel` : undefined}\n aria-activedescendant=${\n this.open && this.activeIso ? `${this.uid}-cell-${this.activeIso}` : undefined\n }\n @click=${this.toggle}\n >\n <span class=\"value ${this.value ? '' : 'placeholder'}\" part=\"value\"\n >${this.value || this.placeholder || this.localize.term('datePicker.placeholder')}</span\n >\n ${\n showClear\n ? html`\n <span\n class=\"clear\"\n part=\"clear-button\"\n role=\"button\"\n aria-label=${this.localize.term('input.clear')}\n @mousedown=${(e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n @click=${this.handleClear}\n >\n <wc-icon name=\"close\"></wc-icon>\n </span>\n `\n : ''\n }\n <wc-icon name=\"calendar\" class=\"icon\"></wc-icon>\n </div>\n <div\n class=\"panel\"\n part=\"panel\"\n id=\"${this.uid}-panel\"\n role=\"dialog\"\n aria-label=${this.label || this.localize.term('datePicker.placeholder')}\n ?hidden=${!this.open}\n >\n <div class=\"header\" part=\"header\">\n <button\n type=\"button\"\n class=\"nav\"\n part=\"prev-year-button\"\n tabindex=\"-1\"\n aria-label=${this.localize.term('datePicker.prevYear')}\n @click=${this.prevYear}\n >\n <wc-icon name=\"chevron-left\"></wc-icon><wc-icon name=\"chevron-left\"></wc-icon>\n </button>\n <button\n type=\"button\"\n class=\"nav\"\n part=\"prev-month-button\"\n tabindex=\"-1\"\n aria-label=${this.localize.term('datePicker.prevMonth')}\n @click=${this.prevMonth}\n >\n <wc-icon name=\"chevron-left\"></wc-icon>\n </button>\n <span class=\"month-label\" part=\"month-label\">${this.monthLabel}</span>\n <button\n type=\"button\"\n class=\"nav\"\n part=\"next-month-button\"\n tabindex=\"-1\"\n aria-label=${this.localize.term('datePicker.nextMonth')}\n @click=${this.nextMonth}\n >\n <wc-icon name=\"chevron-right\"></wc-icon>\n </button>\n <button\n type=\"button\"\n class=\"nav\"\n part=\"next-year-button\"\n tabindex=\"-1\"\n aria-label=${this.localize.term('datePicker.nextYear')}\n @click=${this.nextYear}\n >\n <wc-icon name=\"chevron-right\"></wc-icon><wc-icon name=\"chevron-right\"></wc-icon>\n </button>\n </div>\n <div class=\"grid\" part=\"grid\" role=\"grid\">\n <div class=\"row weekdays\" role=\"row\">\n ${this.weekdayLabels.map(\n (w) => html`<span class=\"cell weekday\" role=\"columnheader\">${w}</span>`,\n )}\n </div>\n ${rows.map(\n (row) => html`\n <div class=\"row\" role=\"row\">\n ${row.map(\n (c) => html`\n <span\n class=\"cell day ${c.inMonth ? '' : 'out'} ${\n c.iso === this.value ? 'selected' : ''\n } ${c.iso === this.activeIso ? 'active' : ''}\"\n role=\"gridcell\"\n data-iso=${c.iso}\n id=\"${this.uid}-cell-${c.iso}\"\n aria-selected=${c.iso === this.value}\n @click=${this.onCellClick}\n >${c.day}</span\n >\n `,\n )}\n </div>\n `,\n )}\n </div>\n <div class=\"footer\" part=\"footer\">\n <button\n type=\"button\"\n class=\"today\"\n part=\"today-button\"\n tabindex=\"-1\"\n @click=${this.selectToday}\n >\n ${this.localize.term('datePicker.today')}\n </button>\n </div>\n </div>\n </div>\n `;\n }\n}\n\nif (!customElements.get('wc-date-picker')) {\n customElements.define('wc-date-picker', wcDatePicker);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-date-picker': wcDatePicker;\n }\n}\n","import { css } from 'lit';\n\n/** wc-form 与 wc-form-item 共用样式 */\nexport const formStyles = css`\n :host {\n display: block;\n }\n\n .form {\n margin: 0;\n padding: 0;\n }\n\n .item {\n display: grid;\n grid-template-columns: var(--wc-form-label-width, 80px) 1fr;\n gap: var(--wc-space-2);\n align-items: start;\n margin-bottom: var(--wc-space-4);\n }\n\n .label {\n padding-right: var(--wc-space-2);\n font-size: var(--wc-font-size-medium);\n line-height: var(--wc-form-line-height, 32px);\n color: var(--wc-color-text);\n text-align: right;\n overflow-wrap: break-word;\n }\n\n .asterisk {\n margin-right: 2px;\n color: var(--wc-color-error);\n }\n\n .asterisk[hidden] {\n display: none;\n }\n\n .control {\n min-width: 0;\n }\n\n .error {\n margin-top: var(--wc-space-1);\n font-size: var(--wc-font-size-small);\n color: var(--wc-color-error);\n }\n\n .error[hidden] {\n display: none;\n }\n\n :host([disabled]) .label {\n color: var(--wc-color-text-disabled);\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { baseStyles } from '../../styles/base.css';\nimport { formStyles } from './wc-form.styles';\nimport type { FormValidateResult } from './types.js';\nimport type { wcFormItem } from './wc-form-item.js';\n\n/**\n * 表单容器:拦截提交做整体校验,聚合校验结果。\n *\n * 用法:\n * ```html\n * <wc-form>\n * <wc-form-item label=\"用户名\" name=\"username\" required>\n * <wc-input></wc-input>\n * </wc-form-item>\n * <wc-button theme=\"primary\" type=\"submit\">提交</wc-button>\n * </wc-form>\n * ```\n * 点击 `wc-button[type=submit]` / `wc-button[type=reset]` 会触发提交流程 /\n * 重置(事件委托,按钮可以是任意层级后代)。\n *\n * @slot - 放置 wc-form-item 与按钮\n * @csspart form - 原生 form 容器\n * @fires wc-submit - 提交时触发(无论校验是否通过),detail 为 FormValidateResult\n */\nexport class wcForm extends LitElement {\n static styles = [baseStyles, formStyles];\n\n constructor() {\n super();\n this.addEventListener('click', this.onHostClick);\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n // form 元素在 shadow 内,submit 会冒泡(composed)到宿主\n this.addEventListener('submit', this.onSubmit);\n }\n\n /** 全部表单项 */\n getItems(): wcFormItem[] {\n const slot = this.shadowRoot!.querySelector('slot');\n return (slot?.assignedElements() ?? []).filter(\n (el): el is wcFormItem => el.tagName === 'WC-FORM-ITEM',\n );\n }\n\n /** 按字段名取表单项 */\n getItem(name: string): wcFormItem | undefined {\n return this.getItems().find((item) => item.name === name);\n }\n\n /** 整体校验:逐项执行并聚合结果,失败时聚焦第一个错误控件 */\n async validate(): Promise<FormValidateResult> {\n const errors: Record<string, string> = {};\n for (const item of this.getItems()) {\n const message = await item.validate();\n if (message) errors[item.name || `field-${Object.keys(errors).length}`] = message;\n }\n const firstError = Object.values(errors)[0] ?? '';\n if (firstError) this.focusFirstError();\n return { valid: Object.keys(errors).length === 0, errors, firstError };\n }\n\n /** 重置全部表单项(恢复控件默认值并清除错误) */\n reset(): void {\n for (const item of this.getItems()) {\n item.reset();\n }\n }\n\n /** 触发提交流程(等同点击 submit 按钮) */\n async submit(): Promise<void> {\n const result = await this.validate();\n this.dispatchEvent(\n new CustomEvent('wc-submit', { detail: result, bubbles: true, composed: true }),\n );\n }\n\n private onSubmit = (e: Event): void => {\n e.preventDefault();\n void this.submit();\n };\n\n /** 委托处理 wc-button[type=submit|reset](控件在各自 shadow 内,需用 composedPath) */\n private onHostClick = (e: MouseEvent): void => {\n const button = (e.composedPath() as Element[]).find(\n (el) => el instanceof Element && el.tagName === 'WC-BUTTON',\n );\n if (!button) return;\n const type = button.getAttribute('type');\n if (type === 'submit') {\n e.preventDefault();\n void this.submit();\n } else if (type === 'reset') {\n e.preventDefault();\n this.reset();\n }\n };\n\n private focusFirstError(): void {\n const control = this.getItems().find((i) => i.error)?.control as HTMLElement | undefined;\n if (!control || typeof control.focus !== 'function') return;\n control.focus();\n if (document.activeElement !== control) {\n // 自定义元素根不可聚焦时,退而聚焦其 shadow 内的原生控件\n const inner = control.shadowRoot?.querySelector<HTMLElement>(\n 'input, textarea, button, [tabindex]',\n );\n inner?.focus();\n }\n }\n\n render() {\n return html`\n <form class=\"form\" part=\"form\" novalidate>\n <slot></slot>\n </form>\n `;\n }\n}\n\nif (!customElements.get('wc-form')) {\n customElements.define('wc-form', wcForm);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-form': wcForm;\n }\n}\n","import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { LocalizeController } from '../../i18n/localize-controller';\nimport { formStyles } from './wc-form.styles';\nimport type { FormRule } from './types.js';\n\n/**\n * 表单项:label + 控件插槽 + 错误消息。\n * 控件取插槽第一个元素;自家组件(wc-input 等)与原生 input/select/textarea 均可。\n *\n * @slot - 放置单个表单控件\n * @csspart base - 外层容器\n * @csspart label - 标签\n * @csspart error - 错误消息\n * @cssprop --wc-form-label-width - 标签列宽\n */\nexport class wcFormItem extends LitElement {\n static styles = [baseStyles, formStyles];\n\n /** 字段名(提交与校验结果映射的键) */\n @property() name = '';\n\n /** 标签文本 */\n @property() label = '';\n\n /** 必填(等价 rules=[{required:true}],同时渲染红色星号) */\n @property({ type: Boolean, reflect: true }) required = false;\n\n /** 数值下限 */\n @property({ type: Number }) min?: number;\n\n /** 数值上限 */\n @property({ type: Number }) max?: number;\n\n /** 字符串最小长度 */\n @property({ type: Number, attribute: 'min-length' }) minLength?: number;\n\n /** 字符串最大长度 */\n @property({ type: Number, attribute: 'max-length' }) maxLength?: number;\n\n /** 正则校验 */\n @property() pattern = '';\n\n /** 完整规则列表(attribute:false,含自定义 validator 时用 JS 设置) */\n @property({ attribute: false }) rules: FormRule[] = [];\n\n /** 当前错误消息(空表示通过) */\n private _error = '';\n\n get error(): string {\n return this._error;\n }\n\n private localize = new LocalizeController(this);\n\n constructor() {\n super();\n // 控件交互后重新校验:wc-change 冒泡组合事件;blur 不冒泡但 composed,需捕获\n this.addEventListener('wc-change', this.onControlInteract);\n this.addEventListener('blur', this.onControlInteract, true);\n }\n\n /** 插槽第一个元素,即表单控件 */\n get control(): Element | null {\n return this.shadowRoot!.querySelector('slot')?.assignedElements()[0] ?? null;\n }\n\n /** 读取控件值:兼容自家组件与原生表单元素 */\n get controlValue(): unknown {\n const c = this.control as { value?: unknown } | null;\n return c?.value ?? '';\n }\n\n /** 声明式属性 + rules 合并后的生效规则 */\n private get effectiveRules(): FormRule[] {\n const rules: FormRule[] = [];\n if (this.required) rules.push({ required: true });\n if (this.min !== undefined) rules.push({ min: this.min });\n if (this.max !== undefined) rules.push({ max: this.max });\n if (this.minLength !== undefined) rules.push({ minLength: this.minLength });\n if (this.maxLength !== undefined) rules.push({ maxLength: this.maxLength });\n if (this.pattern) rules.push({ pattern: this.pattern });\n return [...rules, ...this.rules];\n }\n\n private onControlInteract = (): void => {\n void this.validate();\n };\n\n /** 校验当前值:返回错误消息(空字符串表示通过),同时更新错误显示与控件状态 */\n async validate(): Promise<string> {\n const value = this.controlValue;\n for (const rule of this.effectiveRules) {\n const failed = await this.checkRule(rule, value);\n if (failed) {\n this.setError(failed);\n return failed;\n }\n }\n this.clearError();\n return '';\n }\n\n private async checkRule(rule: FormRule, value: unknown): Promise<string> {\n const name = this.label || this.name || '';\n const fail = (key: string, vars?: Record<string, string | number>) =>\n rule.message ?? this.localize.term(key, { name, ...vars });\n const empty = value === '' || value == null || (Array.isArray(value) && value.length === 0);\n\n if (rule.required && empty) return fail('form.required');\n if (empty) return '';\n if (rule.min !== undefined && Number(value) < rule.min)\n return fail('form.min', { min: rule.min });\n if (rule.max !== undefined && Number(value) > rule.max)\n return fail('form.max', { max: rule.max });\n if (rule.minLength !== undefined && String(value).length < rule.minLength)\n return fail('form.minLength', { minLength: rule.minLength });\n if (rule.maxLength !== undefined && String(value).length > rule.maxLength)\n return fail('form.maxLength', { maxLength: rule.maxLength });\n if (rule.pattern) {\n const re = typeof rule.pattern === 'string' ? new RegExp(rule.pattern) : rule.pattern;\n if (!re.test(String(value))) return fail('form.pattern');\n }\n if (rule.validator) {\n const result = await rule.validator(value);\n if (result === false) return fail('form.invalid');\n if (typeof result === 'string' && result) return result;\n }\n return '';\n }\n\n private setError(message: string): void {\n this._error = message;\n this.applyControlStatus();\n this.requestUpdate();\n }\n\n /** 清除错误显示,并恢复控件校验状态 */\n clearError(): void {\n if (!this._error) return;\n this._error = '';\n this.applyControlStatus();\n this.requestUpdate();\n }\n\n /** 把校验状态同步到控件(自家组件有 status 属性,原生控件跳过) */\n private applyControlStatus(): void {\n const c = this.control as { status?: string } | null;\n if (c && 'status' in c) c.status = this._error ? 'error' : 'default';\n }\n\n /** 重置控件值并清除错误(自家组件走 formResetCallback,原生控件清空 value) */\n reset(): void {\n const c = this.control as {\n formResetCallback?: () => void;\n value?: unknown;\n } | null;\n if (!c) return;\n if (typeof c.formResetCallback === 'function') {\n c.formResetCallback();\n } else if ('value' in c) {\n c.value = '';\n }\n this.clearError();\n }\n\n render() {\n return html`\n <div class=\"item\" part=\"base\">\n <label class=\"label\" part=\"label\">\n <span class=\"asterisk\" ?hidden=${!this.required}>*</span>${this.label}\n </label>\n <div class=\"control\" part=\"control\">\n <slot></slot>\n <div class=\"error\" part=\"error\" role=\"alert\" ?hidden=${!this._error}>${this._error}</div>\n </div>\n </div>\n `;\n }\n}\n\nif (!customElements.get('wc-form-item')) {\n customElements.define('wc-form-item', wcFormItem);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-form-item': wcFormItem;\n }\n}\n","import { css } from 'lit';\n\nexport const dividerStyles = css`\n :host {\n display: block;\n\n /* component 层令牌 */\n --wc-divider-color: var(--wc-color-border);\n --wc-divider-text-gap: var(--wc-space-3);\n }\n\n :host([vertical]) {\n display: inline-block;\n }\n\n .divider {\n display: flex;\n align-items: center;\n gap: var(--wc-divider-text-gap);\n margin: var(--wc-space-4) 0;\n }\n\n .content {\n flex-shrink: 0;\n font-size: var(--wc-font-size-medium);\n color: var(--wc-color-text-secondary);\n white-space: nowrap;\n }\n\n .content[hidden] {\n display: none;\n }\n\n .line {\n display: block;\n flex: 1;\n /* 不能用 height: 0 + 背景——0 高度画不出背景色,实线会不可见 */\n height: 1px;\n background-color: var(--wc-divider-color);\n }\n\n :host([dashed]) .line {\n height: 0;\n background: none;\n border-top: 1px dashed var(--wc-divider-color);\n }\n\n .line.vertical {\n display: inline-block;\n flex: none;\n width: 1px;\n height: 1em;\n margin: 0 var(--wc-space-2);\n vertical-align: middle;\n }\n\n :host([dashed]) .line.vertical {\n width: 0;\n height: 1em;\n background: none;\n border-left: 1px dashed var(--wc-divider-color);\n }\n\n /* 文案对齐:一侧线固定短 */\n .align-left .line.start {\n flex: 0 0 var(--wc-space-4);\n }\n\n .align-right .line.end {\n flex: 0 0 var(--wc-space-4);\n }\n\n .align-left .content {\n order: -1;\n }\n\n :host([vertical]) .divider {\n margin: 0;\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { dividerStyles } from './wc-divider.styles';\n\nexport type wcDividerAlign = 'left' | 'center' | 'right';\n\n/**\n * 分隔线。水平模式可携带文案(文案位置由 align 控制),\n * vertical 时渲染竖向分隔(忽略插槽内容)。\n *\n * @slot - 分隔线文案\n * @csspart base - 外层容器\n * @csspart line - 分隔线\n */\nexport class wcDivider extends LitElement {\n static styles = [baseStyles, dividerStyles];\n\n /** 虚线 */\n @property({ type: Boolean, reflect: true }) dashed = false;\n\n /** 水平模式下文案位置 */\n @property({ reflect: true }) align: wcDividerAlign = 'center';\n\n /** 竖向分隔线 */\n @property({ type: Boolean, reflect: true }) vertical = false;\n\n /** 是否有插槽文案(slotchange 检测) */\n private _hasContent = false;\n\n private onSlotChange(e: Event): void {\n this._hasContent = (e.target as HTMLSlotElement).assignedNodes({ flatten: true }).length > 0;\n this.requestUpdate();\n }\n\n render() {\n if (this.vertical) {\n return html`<span class=\"line vertical\" part=\"line\"></span>`;\n }\n return html`\n <div class=\"divider ${`align-${this.align}`}\" part=\"base\">\n <span class=\"line start\" part=\"line\"></span>\n <span class=\"content\" part=\"content\" ?hidden=${!this._hasContent}>\n <slot @slotchange=${this.onSlotChange}></slot>\n </span>\n <span class=\"line end\" part=\"line\"></span>\n </div>\n `;\n }\n}\n\nif (!customElements.get('wc-divider')) {\n customElements.define('wc-divider', wcDivider);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-divider': wcDivider;\n }\n}\n","import { css } from 'lit';\n\nexport const tagStyles = css`\n :host {\n display: inline-block;\n\n /* component 层令牌 */\n --wc-tag-height: 24px;\n --wc-tag-font-size: var(--wc-font-size-small);\n --wc-tag-padding-x: var(--wc-space-2);\n --wc-tag-radius: var(--wc-radius-small);\n }\n\n :host([size='small']) {\n --wc-tag-height: 20px;\n --wc-tag-font-size: var(--wc-font-size-small);\n --wc-tag-padding-x: var(--wc-space-1);\n }\n\n :host([size='large']) {\n --wc-tag-height: 28px;\n --wc-tag-font-size: var(--wc-font-size-medium);\n --wc-tag-padding-x: var(--wc-space-2);\n }\n\n .tag {\n display: inline-flex;\n align-items: center;\n gap: var(--wc-space-1);\n height: var(--wc-tag-height);\n padding: 0 var(--wc-tag-padding-x);\n font-size: var(--wc-tag-font-size);\n line-height: 1;\n white-space: nowrap;\n border: 1px solid transparent;\n border-radius: var(--wc-tag-radius);\n box-sizing: border-box;\n transition: opacity var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .icon {\n display: inline-flex;\n align-items: center;\n font-size: 1em;\n }\n\n /* 未分配图标时 slot 渲染占位 fallback,隐藏以消除多余间隙 */\n .icon:has(.icon-placeholder) {\n display: none;\n }\n\n /* ---- 关闭按钮 ---- */\n .close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 14px;\n height: 14px;\n padding: 0;\n font-size: 10px;\n color: inherit;\n cursor: pointer;\n background: transparent;\n border: none;\n border-radius: var(--wc-radius-circle);\n transition: background-color var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .close:hover {\n background-color: var(--wc-color-overlay-hover);\n }\n\n .close wc-icon {\n pointer-events: none;\n }\n\n /* ---- default 主题 ---- */\n :host([theme='default']) .tag {\n color: var(--wc-color-text);\n background-color: var(--wc-color-bg-container-secondary);\n border-color: var(--wc-color-border);\n }\n\n /* ---- 语义色 × light 浅底(默认 variant) ---- */\n :host([theme='primary']) .tag {\n color: var(--wc-color-primary);\n background-color: var(--wc-color-primary-light);\n }\n\n :host([theme='success']) .tag {\n color: var(--wc-color-success);\n background-color: var(--wc-color-success-bg);\n }\n\n :host([theme='warning']) .tag {\n color: var(--wc-color-warning);\n background-color: var(--wc-color-warning-bg);\n }\n\n :host([theme='danger']) .tag {\n color: var(--wc-color-error);\n background-color: var(--wc-color-error-bg);\n }\n\n /* ---- dark 实底 ---- */\n :host([variant='dark'][theme='default']) .tag {\n color: var(--wc-color-text-anti);\n background-color: var(--wc-color-text-secondary);\n border-color: transparent;\n }\n\n :host([variant='dark'][theme='primary']) .tag {\n color: var(--wc-color-text-anti);\n background-color: var(--wc-color-primary);\n }\n\n :host([variant='dark'][theme='success']) .tag {\n color: var(--wc-color-text-anti);\n background-color: var(--wc-color-success);\n }\n\n :host([variant='dark'][theme='warning']) .tag {\n color: var(--wc-color-text-anti);\n background-color: var(--wc-color-warning);\n }\n\n :host([variant='dark'][theme='danger']) .tag {\n color: var(--wc-color-text-anti);\n background-color: var(--wc-color-error);\n }\n\n /* ---- outline 描边 ---- */\n :host([variant='outline']) .tag {\n background-color: transparent;\n }\n\n :host([variant='outline'][theme='default']) .tag {\n border-color: var(--wc-color-border);\n }\n\n :host([variant='outline'][theme='primary']) .tag {\n border-color: var(--wc-color-primary);\n }\n\n :host([variant='outline'][theme='success']) .tag {\n border-color: var(--wc-color-success);\n }\n\n :host([variant='outline'][theme='warning']) .tag {\n border-color: var(--wc-color-warning);\n }\n\n :host([variant='outline'][theme='danger']) .tag {\n border-color: var(--wc-color-error);\n }\n\n /* ---- 禁用 ---- */\n :host([disabled]) .tag {\n cursor: not-allowed;\n opacity: 0.5;\n }\n\n :host([disabled]) .close {\n cursor: not-allowed;\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { LocalizeController } from '../../i18n/localize-controller';\nimport '../icon/wc-icon.js';\nimport { tagStyles } from './wc-tag.styles';\n\nexport type wcTagTheme = 'default' | 'primary' | 'success' | 'warning' | 'danger';\nexport type wcTagSize = 'small' | 'medium' | 'large';\nexport type wcTagVariant = 'dark' | 'light' | 'outline';\n\n/**\n * 标签。closable 时展示关闭按钮,点击派发 wc-close(是否移除由使用方控制)。\n *\n * @slot - 标签内容\n * @slot icon - 前置图标\n * @csspart base - 标签主体\n * @csspart close-button - 关闭按钮\n * @fires wc-close - 点击关闭按钮后触发\n */\nexport class wcTag extends LitElement {\n static styles = [baseStyles, tagStyles];\n\n /** 语义色 */\n @property({ reflect: true }) theme: wcTagTheme = 'default';\n\n /** 尺寸 */\n @property({ reflect: true }) size: wcTagSize = 'medium';\n\n /** 填充风格:dark 实底 / light 浅底 / outline 描边 */\n @property({ reflect: true }) variant: wcTagVariant = 'light';\n\n /** 可关闭 */\n @property({ type: Boolean, reflect: true }) closable = false;\n\n /** 禁用 */\n @property({ type: Boolean, reflect: true }) disabled = false;\n\n private localize = new LocalizeController(this);\n\n private handleClose(e: MouseEvent): void {\n e.stopPropagation();\n if (this.disabled) return;\n this.dispatchEvent(new CustomEvent('wc-close', { bubbles: true, composed: true }));\n }\n\n render() {\n return html`\n <span class=\"tag\" part=\"base\">\n <slot name=\"icon\" class=\"icon\"><span class=\"icon-placeholder\"></span></slot>\n <slot></slot>\n ${\n this.closable\n ? html`\n <button\n type=\"button\"\n class=\"close\"\n part=\"close-button\"\n tabindex=\"-1\"\n ?disabled=${this.disabled}\n aria-label=${this.localize.term('tag.close')}\n @click=${this.handleClose}\n >\n <wc-icon name=\"close\"></wc-icon>\n </button>\n `\n : ''\n }\n </span>\n `;\n }\n}\n\nif (!customElements.get('wc-tag')) {\n customElements.define('wc-tag', wcTag);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-tag': wcTag;\n }\n}\n","import { css } from 'lit';\n\nexport const avatarStyles = css`\n :host {\n display: inline-block;\n\n /* component 层令牌(预设档位会覆写) */\n --wc-avatar-size: 32px;\n --wc-avatar-font-size: var(--wc-font-size-medium);\n }\n\n .avatar {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n width: var(--wc-avatar-size);\n height: var(--wc-avatar-size);\n font-size: var(--wc-avatar-font-size);\n color: var(--wc-color-text);\n white-space: nowrap;\n user-select: none;\n background-color: var(--wc-color-bg-container-secondary);\n }\n\n .avatar.small {\n --wc-avatar-size: 24px;\n --wc-avatar-font-size: var(--wc-font-size-small);\n }\n\n .avatar.large {\n --wc-avatar-size: 40px;\n --wc-avatar-font-size: var(--wc-font-size-large);\n }\n\n .avatar.shape-circle {\n border-radius: var(--wc-radius-circle);\n }\n\n .avatar.shape-round {\n border-radius: var(--wc-radius-large);\n }\n\n .avatar.shape-square {\n border-radius: var(--wc-radius-small);\n }\n\n .avatar ::slotted(img) {\n display: block;\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n\n .avatar ::slotted(wc-icon) {\n color: var(--wc-color-text-placeholder);\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { avatarStyles } from './wc-avatar.styles';\n\nexport type wcAvatarShape = 'circle' | 'round' | 'square';\nexport type wcAvatarSize = 'small' | 'medium' | 'large';\n\nconst PRESET_SIZES: wcAvatarSize[] = ['small', 'medium', 'large'];\n\n/**\n * 头像。内容放默认插槽(文字 / wc-icon / img 均可)。\n * size 除三档预设外,也接受任意 CSS 尺寸(如 \"48px\" 或纯数字按 px 处理)。\n *\n * @slot - 头像内容\n * @csspart base - 头像主体\n * @cssprop --wc-avatar-size - 自定义尺寸时也可直接覆写此变量\n */\nexport class wcAvatar extends LitElement {\n static styles = [baseStyles, avatarStyles];\n\n /** 尺寸:预设档位或 CSS 尺寸值(纯数字按 px) */\n @property() size: wcAvatarSize | string = 'medium';\n\n /** 形状 */\n @property({ reflect: true }) shape: wcAvatarShape = 'circle';\n\n private get isPreset(): boolean {\n return PRESET_SIZES.includes(this.size as wcAvatarSize);\n }\n\n private get customStyle(): string {\n if (this.isPreset) return '';\n const raw = this.size.trim();\n const size = /^\\d+$/.test(raw) ? `${raw}px` : raw;\n return `--wc-avatar-size:${size};--wc-avatar-font-size:${size}`;\n }\n\n render() {\n return html`\n <div\n class=\"avatar ${this.isPreset ? this.size : 'custom'} shape-${this.shape}\"\n part=\"base\"\n style=${this.customStyle}\n >\n <slot></slot>\n </div>\n `;\n }\n}\n\nif (!customElements.get('wc-avatar')) {\n customElements.define('wc-avatar', wcAvatar);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-avatar': wcAvatar;\n }\n}\n","import { css } from 'lit';\n\nexport const spaceStyles = css`\n :host {\n display: inline-block;\n }\n\n :host([direction='vertical']) {\n display: block;\n }\n\n .space {\n display: flex;\n gap: var(--wc-space-gap, var(--wc-space-4));\n }\n\n /* slot 透明化,让 slotted 子元素直接成为 flex item,gap 才能生效 */\n .space slot {\n display: contents;\n }\n\n :host([direction='vertical']) .space {\n flex-direction: column;\n }\n\n :host([wrap]) .space {\n flex-wrap: wrap;\n }\n\n .align-start {\n align-items: flex-start;\n }\n\n .align-center {\n align-items: center;\n }\n\n .align-end {\n align-items: flex-end;\n }\n\n .align-baseline {\n align-items: baseline;\n }\n\n .align-stretch {\n align-items: stretch;\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { spaceStyles } from './wc-space.styles';\n\nexport type wcSpaceDirection = 'horizontal' | 'vertical';\nexport type wcSpaceAlign = 'start' | 'center' | 'end' | 'baseline';\n\n/** 预设间距档位 → 语义令牌 */\nconst PRESET_SIZES: Record<string, string> = {\n small: 'var(--wc-space-2)',\n medium: 'var(--wc-space-4)',\n large: 'var(--wc-space-6)',\n};\n\n/**\n * 间距容器:为子元素批量提供间距(gap 实现,不产生额外 DOM 包裹)。\n * size 支持预设档位、纯数字(按 px)或任意 CSS 尺寸值。\n *\n * @slot - 任意子元素\n * @csspart base - 间距容器\n * @cssprop --wc-space-gap - 也可直接覆写间距\n */\nexport class wcSpace extends LitElement {\n static styles = [baseStyles, spaceStyles];\n\n /** 间距:small / medium / large / 纯数字(px)/ CSS 尺寸值 */\n @property() size: keyof typeof PRESET_SIZES | string = 'medium';\n\n /** 排列方向 */\n @property({ reflect: true }) direction: wcSpaceDirection = 'horizontal';\n\n /** 对齐方式 */\n @property({ reflect: true }) align?: wcSpaceAlign;\n\n /** 允许换行 */\n @property({ type: Boolean, reflect: true }) wrap = false;\n\n private get gapValue(): string {\n const preset = PRESET_SIZES[this.size];\n if (preset) return preset;\n const raw = this.size.trim();\n return /^\\d+$/.test(raw) ? `${raw}px` : raw;\n }\n\n render() {\n return html`\n <div\n class=\"space ${`align-${this.align ?? (this.direction === 'vertical' ? 'stretch' : 'center')}`}\"\n part=\"base\"\n style=${`--wc-space-gap:${this.gapValue}`}\n >\n <slot></slot>\n </div>\n `;\n }\n}\n\nif (!customElements.get('wc-space')) {\n customElements.define('wc-space', wcSpace);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-space': wcSpace;\n }\n}\n","import { css } from 'lit';\n\nexport const layoutStyles = css`\n :host {\n display: block;\n }\n\n wc-row,\n :host(wc-row) {\n display: block;\n }\n\n wc-col,\n :host(wc-col) {\n display: contents;\n }\n\n .row {\n display: flex;\n column-gap: var(--wc-row-gutter, 0);\n }\n\n .row slot {\n display: contents;\n }\n\n :host([wrap]) .row {\n flex-wrap: wrap;\n }\n\n .justify-start {\n justify-content: flex-start;\n }\n\n .justify-center {\n justify-content: center;\n }\n\n .justify-end {\n justify-content: flex-end;\n }\n\n .justify-space-between {\n justify-content: space-between;\n }\n\n .justify-space-around {\n justify-content: space-around;\n }\n\n .justify-space-evenly {\n justify-content: space-evenly;\n }\n\n .align-top {\n align-items: flex-start;\n }\n\n .align-middle {\n align-items: center;\n }\n\n .align-bottom {\n align-items: flex-end;\n }\n\n .align-stretch {\n align-items: stretch;\n }\n\n .col {\n box-sizing: border-box;\n min-width: 0;\n padding-right: calc(var(--wc-row-gutter, 0) / 2);\n padding-left: calc(var(--wc-row-gutter, 0) / 2);\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { layoutStyles } from './wc-layout.styles';\n\nexport type wcRowJustify =\n | 'start'\n | 'center'\n | 'end'\n | 'space-between'\n | 'space-around'\n | 'space-evenly';\n\nexport type wcRowAlign = 'top' | 'middle' | 'bottom' | 'stretch';\n\n/**\n * 行容器:flex 布局,配合 wc-col 的 span/offset 实现栅格。\n * gutter 为列间距(column-gap,px)。\n *\n * @slot - 放置 wc-col\n * @csspart base - 行容器\n */\nexport class wcRow extends LitElement {\n static styles = [baseStyles, layoutStyles];\n\n /** 列间距(px) */\n @property({ type: Number }) gutter = 0;\n\n /** 水平对齐 */\n @property({ reflect: true }) justify: wcRowJustify = 'start';\n\n /** 垂直对齐 */\n @property({ reflect: true }) align: wcRowAlign = 'top';\n\n /** 允许换行 */\n @property({ type: Boolean, reflect: true }) wrap = false;\n\n render() {\n return html`\n <div\n class=\"row ${`justify-${this.justify} align-${this.align}`}\"\n part=\"base\"\n style=${this.gutter ? `--wc-row-gutter:${this.gutter}px` : ''}\n >\n <slot></slot>\n </div>\n `;\n }\n}\n\n/**\n * 列容器:24 栅格。span 占几列,offset 左侧空几列。\n * host 以 display:contents 参与行布局,实际盒模型由内部 .col 呈现。\n *\n * @slot - 列内容\n * @csspart base - 列容器\n */\nexport class wcCol extends LitElement {\n static styles = [baseStyles, layoutStyles];\n\n /** 占据列数(1~24) */\n @property({ type: Number }) span = 24;\n\n /** 左侧偏移列数(1~23) */\n @property({ type: Number }) offset = 0;\n\n private get widthPercent(): string {\n const span = Math.min(24, Math.max(1, Math.round(this.span) || 24));\n return `${((span / 24) * 100).toFixed(4)}%`;\n }\n\n private get offsetPercent(): string {\n const offset = Math.min(23, Math.max(0, Math.round(this.offset) || 0));\n return `${((offset / 24) * 100).toFixed(4)}%`;\n }\n\n render() {\n return html`\n <div\n class=\"col\"\n part=\"base\"\n style=${`width:${this.widthPercent};margin-left:${this.offsetPercent}`}\n >\n <slot></slot>\n </div>\n `;\n }\n}\n\nif (!customElements.get('wc-row')) {\n customElements.define('wc-row', wcRow);\n}\n\nif (!customElements.get('wc-col')) {\n customElements.define('wc-col', wcCol);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-row': wcRow;\n 'wc-col': wcCol;\n }\n}\n","import { css } from 'lit';\n\nexport const typographyStyles = css`\n :host {\n display: inline;\n }\n\n :host([variant='heading']) {\n display: block;\n }\n\n .text {\n color: var(--wc-color-text);\n font-size: var(--wc-font-size-medium);\n line-height: var(--wc-font-line-height, 1.6);\n }\n\n .text slot {\n display: contents;\n }\n\n /* ---- 标题级别(h4~h6 无对应全局令牌,组件层补齐) ---- */\n .heading {\n font-weight: var(--wc-font-weight-semibold);\n line-height: 1.4;\n color: var(--wc-color-text);\n }\n\n .level-1 {\n font-size: var(--wc-font-size-h1);\n }\n\n .level-2 {\n font-size: var(--wc-font-size-h2);\n }\n\n .level-3 {\n font-size: var(--wc-font-size-h3);\n }\n\n .level-4 {\n font-size: var(--wc-font-size-large);\n }\n\n .level-5 {\n font-size: var(--wc-font-size-medium);\n }\n\n .level-6 {\n font-size: var(--wc-font-size-medium);\n font-weight: var(--wc-font-weight-medium);\n }\n\n /* ---- 语义色 ---- */\n :host([type='secondary']) .text {\n color: var(--wc-color-text-secondary);\n }\n\n :host([type='success']) .text {\n color: var(--wc-color-success);\n }\n\n :host([type='warning']) .text {\n color: var(--wc-color-warning);\n }\n\n :host([type='danger']) .text {\n color: var(--wc-color-error);\n }\n\n /* ---- 禁用 ---- */\n :host([disabled]) .text {\n color: var(--wc-color-text-disabled);\n cursor: not-allowed;\n user-select: none;\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { typographyStyles } from './wc-text.styles';\n\nexport type wcTextVariant = 'text' | 'heading';\nexport type wcTextType = 'default' | 'secondary' | 'success' | 'warning' | 'danger';\n\n/**\n * 排版文本。text 为正文;heading 按 level(1~6)渲染对应语义与字号,\n * 输出 role=\"heading\" + aria-level,保持无障碍语义。\n *\n * @slot - 文本内容\n * @csspart base - 文本容器\n */\nexport class wcText extends LitElement {\n static styles = [baseStyles, typographyStyles];\n\n /** 变体:正文 / 标题 */\n @property({ reflect: true }) variant: wcTextVariant = 'text';\n\n /** 标题级别(仅 heading 生效,1~6,默认 3) */\n @property({ type: Number }) level = 3;\n\n /** 语义色 */\n @property({ reflect: true }) type: wcTextType = 'default';\n\n /** 禁用态(灰字 + not-allowed) */\n @property({ type: Boolean, reflect: true }) disabled = false;\n\n private get headingLevel(): number {\n const n = Math.round(this.level);\n return Math.min(6, Math.max(1, Number.isNaN(n) ? 3 : n));\n }\n\n render() {\n if (this.variant === 'heading') {\n const level = this.headingLevel;\n return html`\n <div class=\"text heading level-${level}\" part=\"base\" role=\"heading\" aria-level=${level}>\n <slot></slot>\n </div>\n `;\n }\n return html`<span class=\"text\" part=\"base\"><slot></slot></span>`;\n }\n}\n\nif (!customElements.get('wc-text')) {\n customElements.define('wc-text', wcText);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-text': wcText;\n }\n}\n","import type { LitElement } from 'lit';\n\n/** 参与滚动锁计数的模态弹层元素 */\nconst MODAL_SELECTOR = 'wc-dialog, wc-drawer';\n\nexport interface OverlaySideEffectsHooks {\n /** Escape 触发的关闭请求(reason 固定 'escape') */\n requestClose: (reason: string) => void;\n}\n\n/**\n * 模态弹层打开副作用:Escape 关闭、焦点陷阱与归还、body 滚动锁。\n * 滚动锁按文档内打开的弹层数量判断(DOM 驱动,dialog/drawer 互相计数),\n * 同一弹层的 bind/unbind 由 bound 标志防重入\n * (带 open 属性创建时 connectedCallback 与首次 updated 都会触发 bind)。\n */\nexport class OverlaySideEffects {\n private bound = false;\n private prevFocused: Element | null = null;\n private prevBodyOverflow = '';\n\n constructor(\n private host: LitElement,\n private hooks: OverlaySideEffectsHooks,\n ) {}\n\n /** 文档内除宿主外仍打开的模态弹层数 */\n private otherOpenOverlays(): number {\n let count = 0;\n document.querySelectorAll(MODAL_SELECTOR).forEach((el) => {\n if (el !== this.host && (el as unknown as { open?: boolean }).open) count += 1;\n });\n return count;\n }\n\n private onDocumentKeydown = (e: KeyboardEvent): void => {\n if (e.key === 'Escape') {\n e.stopPropagation();\n this.hooks.requestClose('escape');\n } else if (e.key === 'Tab') {\n this.trapFocus(e);\n }\n };\n\n /** 焦点陷阱:Tab 循环限制在弹层内(shadow + light DOM) */\n trapFocus(e: KeyboardEvent): void {\n const focusables = [\n ...Array.from(\n this.host.shadowRoot!.querySelectorAll<HTMLElement>(\n 'button, [href], [tabindex]:not([tabindex=\"-1\"])',\n ),\n ),\n ...Array.from(\n this.host.querySelectorAll<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\n ),\n ),\n ].filter((el) => !el.hasAttribute('disabled') && el.offsetParent !== null);\n if (focusables.length === 0) return;\n const first = focusables[0]!;\n const last = focusables[focusables.length - 1]!;\n const active = this.host.shadowRoot!.activeElement ?? document.activeElement;\n if (e.shiftKey && (active === first || !this.host.contains(active as Node))) {\n e.preventDefault();\n last.focus();\n } else if (!e.shiftKey && active === last) {\n e.preventDefault();\n first.focus();\n }\n }\n\n bind(): void {\n if (this.bound) return;\n this.bound = true;\n // 记录打开前的焦点元素,关闭时归还\n this.prevFocused = document.activeElement;\n document.addEventListener('keydown', this.onDocumentKeydown, true);\n // body 滚动锁:仅当自己是唯一打开的弹层时加锁\n if (this.otherOpenOverlays() === 0) {\n this.prevBodyOverflow = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n }\n // 初始焦点:关闭按钮 > 弹层本体\n queueMicrotask(() => {\n const target =\n this.host.shadowRoot?.querySelector<HTMLElement>('[part=\"close-button\"]') ??\n this.host.shadowRoot?.querySelector<HTMLElement>('[role=\"dialog\"]');\n target?.focus();\n });\n }\n\n unbind(): void {\n if (!this.bound) return;\n this.bound = false;\n document.removeEventListener('keydown', this.onDocumentKeydown, true);\n // 还有其他弹层开着时不解锁\n if (this.otherOpenOverlays() === 0) {\n document.body.style.overflow = this.prevBodyOverflow;\n }\n // 归还焦点\n if (this.prevFocused && (this.prevFocused as HTMLElement).focus) {\n (this.prevFocused as HTMLElement).focus();\n this.prevFocused = null;\n }\n }\n}\n","import { css } from 'lit';\n\nexport const dialogStyles = css`\n :host {\n display: contents;\n\n /* component 层令牌 */\n --wc-dialog-width: 520px;\n }\n\n .overlay {\n position: fixed;\n inset: 0;\n z-index: var(--wc-z-index-modal);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--wc-space-4);\n background: var(--wc-color-mask);\n animation: wc-dialog-fade var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .overlay[hidden] {\n display: none;\n }\n\n .dialog {\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n width: min(var(--wc-dialog-width), 100%);\n max-height: calc(100vh - var(--wc-space-8));\n overflow: hidden;\n background-color: var(--wc-color-bg-container);\n border-radius: var(--wc-radius-xlarge);\n box-shadow: var(--wc-shadow-3);\n animation: wc-dialog-in var(--wc-duration-medium) var(--wc-easing-standard);\n outline: none;\n }\n\n .header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--wc-space-2);\n padding: var(--wc-space-4) var(--wc-space-6) 0;\n }\n\n .title {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n font-size: var(--wc-font-size-large);\n font-weight: var(--wc-font-weight-semibold);\n color: var(--wc-color-text);\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .close {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n padding: var(--wc-space-1);\n font-size: var(--wc-font-size-medium);\n color: var(--wc-color-text-placeholder);\n cursor: pointer;\n background: transparent;\n border: none;\n border-radius: var(--wc-radius-small);\n transition:\n color var(--wc-duration-fast) var(--wc-easing-standard),\n background-color var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .close:hover {\n color: var(--wc-color-text);\n background-color: var(--wc-color-bg-hover);\n }\n\n .body {\n flex: 1;\n min-height: 0;\n padding: var(--wc-space-4) var(--wc-space-6);\n overflow-y: auto;\n font-size: var(--wc-font-size-medium);\n color: var(--wc-color-text);\n }\n\n .footer {\n display: flex;\n gap: var(--wc-space-2);\n justify-content: flex-end;\n padding: var(--wc-space-2) var(--wc-space-6) var(--wc-space-4);\n }\n\n .footer slot {\n display: contents;\n }\n\n @keyframes wc-dialog-fade {\n from {\n opacity: 0;\n }\n\n to {\n opacity: 1;\n }\n }\n\n @keyframes wc-dialog-in {\n from {\n transform: translateY(-8px) scale(0.98);\n opacity: 0;\n }\n\n to {\n transform: none;\n opacity: 1;\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n .overlay,\n .dialog {\n animation: none;\n }\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { OverlaySideEffects } from '../../common/overlay-side-effects';\nimport { LocalizeController } from '../../i18n/localize-controller';\nimport '../button/wc-button.js';\nimport '../icon/wc-icon.js';\nimport { dialogStyles } from './wc-dialog.styles';\n\nexport type wcDialogCloseReason = 'close-btn' | 'overlay' | 'escape' | 'confirm' | 'cancel' | 'api';\n\n/**\n * 模态对话框。通过 open 属性或 show()/close() 控制;页头/页脚均可换插槽。\n * 关闭统一走可取消的 wc-close 事件(preventDefault 可阻止关闭)。\n *\n * @slot - 对话框内容\n * @slot header - 自定义页头(覆盖 header 属性)\n * @slot footer - 自定义页脚(覆盖默认确认/取消按钮)\n * @csspart overlay - 遮罩层\n * @csspart base - 对话框主体\n * @csspart header - 页头\n * @csspart body - 内容区\n * @csspart footer - 页脚\n * @cssprop --wc-dialog-width - 对话框宽度(默认 520px)\n * @fires wc-open - 打开后触发\n * @fires wc-close - 请求关闭时触发(可取消,detail.reason 标识来源)\n * @fires wc-confirm - 点击默认确认按钮触发(确认后自动请求关闭)\n * @fires wc-cancel - 点击默认取消按钮触发(取消后自动请求关闭)\n */\nexport class wcDialog extends LitElement {\n static styles = [baseStyles, dialogStyles];\n\n /** 是否打开 */\n @property({ type: Boolean, reflect: true }) open = false;\n\n /** 页头标题(header 插槽优先) */\n @property() header = '';\n\n /** 是否展示页脚(默认确认/取消) */\n @property({ type: Boolean }) footer = true;\n\n /** 展示右上角关闭按钮 */\n @property({ type: Boolean, reflect: true }) closable = true;\n\n /** 点击遮罩关闭 */\n @property({ type: Boolean, attribute: 'close-on-overlay-click' }) closeOnOverlayClick = false;\n\n /** 对话框宽度(纯数字按 px) */\n @property() width = '';\n\n private localize = new LocalizeController(this);\n\n /** 打开副作用:Escape / 焦点陷阱 / 滚动锁(与 Drawer 共用) */\n private overlay = new OverlaySideEffects(this, {\n requestClose: (reason) => this.requestClose(reason as wcDialogCloseReason),\n });\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (this.open) this.overlay.bind();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.overlay.unbind();\n }\n\n /** 打开对话框 */\n show(): void {\n if (this.open) return;\n this.open = true;\n }\n\n /** 请求关闭(发出可取消的 wc-close) */\n requestClose(reason: wcDialogCloseReason = 'api'): void {\n const accepted = this.dispatchEvent(\n new CustomEvent('wc-close', {\n detail: { reason },\n bubbles: true,\n composed: true,\n cancelable: true,\n }),\n );\n if (accepted) this.open = false;\n }\n\n /** 默认确认:派发 wc-confirm 并关闭 */\n confirm(): void {\n this.dispatchEvent(new CustomEvent('wc-confirm', { bubbles: true, composed: true }));\n this.requestClose('confirm');\n }\n\n /** 默认取消:派发 wc-cancel 并关闭 */\n cancel(): void {\n this.dispatchEvent(new CustomEvent('wc-cancel', { bubbles: true, composed: true }));\n this.requestClose('cancel');\n }\n\n protected override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (!changed.has('open')) return;\n if (this.open) {\n this.dispatchEvent(new CustomEvent('wc-open', { bubbles: true, composed: true }));\n this.overlay.bind();\n } else {\n this.overlay.unbind();\n }\n }\n\n private onOverlayClick(e: MouseEvent): void {\n if (e.target !== e.currentTarget) return;\n if (this.closeOnOverlayClick) this.requestClose('overlay');\n }\n\n private widthStyle(): string {\n if (!this.width) return '';\n const raw = this.width.trim();\n const size = /^\\d+$/.test(raw) ? `${raw}px` : raw;\n return `--wc-dialog-width:${size}`;\n }\n\n render() {\n return html`\n <div class=\"overlay\" part=\"overlay\" ?hidden=${!this.open} @click=${this.onOverlayClick}>\n <div\n class=\"dialog\"\n part=\"base\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=${this.header || 'dialog'}\n tabindex=\"-1\"\n style=${this.widthStyle()}\n >\n ${\n this.header || this.closable\n ? html`\n <div class=\"header\" part=\"header\">\n <div class=\"title\"><slot name=\"header\">${this.header}</slot></div>\n ${\n this.closable\n ? html`\n <button\n type=\"button\"\n class=\"close\"\n part=\"close-button\"\n aria-label=${this.localize.term('dialog.close')}\n @click=${() => this.requestClose('close-btn')}\n >\n <wc-icon name=\"close\"></wc-icon>\n </button>\n `\n : ''\n }\n </div>\n `\n : ''\n }\n <div class=\"body\" part=\"body\"><slot></slot></div>\n ${\n this.footer\n ? html`\n <div class=\"footer\" part=\"footer\">\n <slot name=\"footer\">\n <wc-button @click=${() => this.cancel()}>\n ${this.localize.term('dialog.cancel')}\n </wc-button>\n <wc-button theme=\"primary\" @click=${() => this.confirm()}>\n ${this.localize.term('dialog.confirm')}\n </wc-button>\n </slot>\n </div>\n `\n : ''\n }\n </div>\n </div>\n `;\n }\n}\n\nif (!customElements.get('wc-dialog')) {\n customElements.define('wc-dialog', wcDialog);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-dialog': wcDialog;\n }\n}\n","import { css } from 'lit';\n\nexport const drawerStyles = css`\n :host {\n display: contents;\n\n /* component 层令牌 */\n --wc-drawer-size: 500px;\n }\n\n .overlay {\n position: fixed;\n inset: 0;\n z-index: var(--wc-z-index-drawer);\n background: var(--wc-color-mask);\n animation: wc-drawer-fade var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .overlay[hidden] {\n display: none;\n }\n\n .drawer {\n position: absolute;\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n overflow: hidden;\n background-color: var(--wc-color-bg-container);\n box-shadow: var(--wc-shadow-2);\n outline: none;\n animation: wc-drawer-in var(--wc-duration-medium) var(--wc-easing-standard);\n }\n\n /* ---- 四个方向 ---- */\n .placement-right {\n inset: 0 0 0 auto;\n width: min(var(--wc-drawer-size), 100%);\n height: 100%;\n --wc-drawer-from: translateX(100%);\n }\n\n .placement-left {\n inset: 0 auto 0 0;\n width: min(var(--wc-drawer-size), 100%);\n height: 100%;\n --wc-drawer-from: translateX(-100%);\n }\n\n .placement-bottom {\n inset: auto 0 0 0;\n width: 100%;\n height: var(--wc-drawer-size);\n --wc-drawer-from: translateY(100%);\n }\n\n .placement-top {\n inset: 0 0 auto 0;\n width: 100%;\n height: var(--wc-drawer-size);\n --wc-drawer-from: translateY(-100%);\n }\n\n /* ---- 页头 ---- */\n .header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--wc-space-2);\n padding: var(--wc-space-4) var(--wc-space-6) 0;\n }\n\n .title {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n font-size: var(--wc-font-size-large);\n font-weight: var(--wc-font-weight-semibold);\n color: var(--wc-color-text);\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .close {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n padding: var(--wc-space-1);\n font-size: var(--wc-font-size-medium);\n color: var(--wc-color-text-placeholder);\n cursor: pointer;\n background: transparent;\n border: none;\n border-radius: var(--wc-radius-small);\n transition:\n color var(--wc-duration-fast) var(--wc-easing-standard),\n background-color var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .close:hover {\n color: var(--wc-color-text);\n background-color: var(--wc-color-bg-hover);\n }\n\n /* ---- 内容区 ---- */\n .body {\n flex: 1;\n min-height: 0;\n padding: var(--wc-space-4) var(--wc-space-6);\n overflow-y: auto;\n font-size: var(--wc-font-size-medium);\n color: var(--wc-color-text);\n }\n\n /* ---- 页脚 ---- */\n .footer {\n display: flex;\n gap: var(--wc-space-2);\n justify-content: flex-end;\n padding: var(--wc-space-2) var(--wc-space-6) var(--wc-space-4);\n }\n\n .footer slot {\n display: contents;\n }\n\n @keyframes wc-drawer-fade {\n from {\n opacity: 0;\n }\n\n to {\n opacity: 1;\n }\n }\n\n @keyframes wc-drawer-in {\n from {\n transform: var(--wc-drawer-from, translateX(100%));\n }\n\n to {\n transform: none;\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n .overlay,\n .drawer {\n animation: none;\n }\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { OverlaySideEffects } from '../../common/overlay-side-effects';\nimport { LocalizeController } from '../../i18n/localize-controller';\nimport '../button/wc-button.js';\nimport '../icon/wc-icon.js';\nimport { drawerStyles } from './wc-drawer.styles';\n\nexport type wcDrawerPlacement = 'left' | 'right' | 'top' | 'bottom';\nexport type wcDrawerCloseReason = 'close-btn' | 'overlay' | 'escape' | 'confirm' | 'cancel' | 'api';\n\n/** 预设尺寸档位(左右为宽,上下为高) */\nconst PRESET_SIZES: Record<string, string> = {\n small: '300px',\n medium: '500px',\n large: '760px',\n};\n\n/**\n * 抽屉:从屏幕边缘滑出的模态面板,复用 Dialog 的弹层副作用\n * (Escape / 焦点陷阱与归还 / 跨弹层滚动锁)。\n * 关闭统一走可取消的 wc-close 事件(preventDefault 可阻止关闭)。\n *\n * @slot - 抽屉内容\n * @slot header - 自定义页头(覆盖 header 属性)\n * @slot footer - 自定义页脚(覆盖默认确认/取消按钮)\n * @csspart overlay - 遮罩层\n * @csspart base - 抽屉面板\n * @csspart header - 页头\n * @csspart body - 内容区\n * @csspart footer - 页脚\n * @cssprop --wc-drawer-size - 面板尺寸(placement 决定是宽还是高)\n * @fires wc-open - 打开后触发\n * @fires wc-close - 请求关闭时触发(可取消,detail.reason 标识来源)\n * @fires wc-confirm - 点击默认确认按钮触发(确认后自动请求关闭)\n * @fires wc-cancel - 点击默认取消按钮触发(取消后自动请求关闭)\n */\nexport class wcDrawer extends LitElement {\n static styles = [baseStyles, drawerStyles];\n\n /** 是否打开 */\n @property({ type: Boolean, reflect: true }) open = false;\n\n /** 弹出边缘 */\n @property({ reflect: true }) placement: wcDrawerPlacement = 'right';\n\n /** 面板尺寸:small / medium / large / 纯数字(px)/ CSS 尺寸值 */\n @property() size: keyof typeof PRESET_SIZES | string = 'medium';\n\n /** 页头标题(header 插槽优先) */\n @property() header = '';\n\n /** 是否展示页脚(默认确认/取消) */\n @property({ type: Boolean }) footer = true;\n\n /** 展示关闭按钮 */\n @property({ type: Boolean, reflect: true }) closable = true;\n\n /** 点击遮罩关闭(抽屉默认开启) */\n @property({ type: Boolean, attribute: 'close-on-overlay-click' }) closeOnOverlayClick = true;\n\n private localize = new LocalizeController(this);\n\n /** 打开副作用:Escape / 焦点陷阱 / 滚动锁(与 Dialog 共用) */\n private overlay = new OverlaySideEffects(this, {\n requestClose: (reason) => this.requestClose(reason as wcDrawerCloseReason),\n });\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (this.open) this.overlay.bind();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.overlay.unbind();\n }\n\n /** 打开抽屉 */\n show(): void {\n if (this.open) return;\n this.open = true;\n }\n\n /** 请求关闭(发出可取消的 wc-close) */\n requestClose(reason: wcDrawerCloseReason = 'api'): void {\n const accepted = this.dispatchEvent(\n new CustomEvent('wc-close', {\n detail: { reason },\n bubbles: true,\n composed: true,\n cancelable: true,\n }),\n );\n if (accepted) this.open = false;\n }\n\n /** 默认确认:派发 wc-confirm 并关闭 */\n confirm(): void {\n this.dispatchEvent(new CustomEvent('wc-confirm', { bubbles: true, composed: true }));\n this.requestClose('confirm');\n }\n\n /** 默认取消:派发 wc-cancel 并关闭 */\n cancel(): void {\n this.dispatchEvent(new CustomEvent('wc-cancel', { bubbles: true, composed: true }));\n this.requestClose('cancel');\n }\n\n protected override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (!changed.has('open')) return;\n if (this.open) {\n this.dispatchEvent(new CustomEvent('wc-open', { bubbles: true, composed: true }));\n this.overlay.bind();\n } else {\n this.overlay.unbind();\n }\n }\n\n private onOverlayClick(e: MouseEvent): void {\n if (e.target !== e.currentTarget) return;\n if (this.closeOnOverlayClick) this.requestClose('overlay');\n }\n\n private sizeStyle(): string {\n const preset = PRESET_SIZES[this.size];\n const raw = preset ?? this.size.trim();\n const size = /^\\d+$/.test(raw) ? `${raw}px` : raw;\n return `--wc-drawer-size:${size}`;\n }\n\n render() {\n return html`\n <div class=\"overlay\" part=\"overlay\" ?hidden=${!this.open} @click=${this.onOverlayClick}>\n <div\n class=\"drawer placement-${this.placement}\"\n part=\"base\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=${this.header || 'drawer'}\n tabindex=\"-1\"\n style=${this.sizeStyle()}\n >\n ${\n this.header || this.closable\n ? html`\n <div class=\"header\" part=\"header\">\n <div class=\"title\"><slot name=\"header\">${this.header}</slot></div>\n ${\n this.closable\n ? html`\n <button\n type=\"button\"\n class=\"close\"\n part=\"close-button\"\n aria-label=${this.localize.term('dialog.close')}\n @click=${() => this.requestClose('close-btn')}\n >\n <wc-icon name=\"close\"></wc-icon>\n </button>\n `\n : ''\n }\n </div>\n `\n : ''\n }\n <div class=\"body\" part=\"body\"><slot></slot></div>\n ${\n this.footer\n ? html`\n <div class=\"footer\" part=\"footer\">\n <slot name=\"footer\">\n <wc-button @click=${() => this.cancel()}>\n ${this.localize.term('dialog.cancel')}\n </wc-button>\n <wc-button theme=\"primary\" @click=${() => this.confirm()}>\n ${this.localize.term('dialog.confirm')}\n </wc-button>\n </slot>\n </div>\n `\n : ''\n }\n </div>\n </div>\n `;\n }\n}\n\nif (!customElements.get('wc-drawer')) {\n customElements.define('wc-drawer', wcDrawer);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-drawer': wcDrawer;\n }\n}\n","import { css } from 'lit';\n\nexport const messageStyles = css`\n :host {\n display: block;\n pointer-events: auto;\n }\n\n .message {\n display: flex;\n align-items: flex-start;\n gap: var(--wc-space-2);\n box-sizing: border-box;\n min-width: 240px;\n max-width: 480px;\n margin: 0 auto var(--wc-space-2);\n padding: var(--wc-space-2) var(--wc-space-4);\n font-size: var(--wc-font-size-medium);\n line-height: var(--wc-font-line-height, 1.6);\n color: var(--wc-color-text);\n background-color: var(--wc-color-bg-container);\n border-radius: var(--wc-radius-medium);\n box-shadow: var(--wc-shadow-2);\n animation: wc-message-in var(--wc-duration-medium) var(--wc-easing-standard);\n }\n\n .icon {\n flex-shrink: 0;\n margin-top: 2px;\n font-size: var(--wc-font-size-large);\n }\n\n .icon.success {\n color: var(--wc-color-success);\n }\n\n .icon.error {\n color: var(--wc-color-error);\n }\n\n .icon.warning {\n color: var(--wc-color-warning);\n }\n\n .icon.info,\n .icon.loading {\n color: var(--wc-color-primary);\n }\n\n .content {\n flex: 1;\n min-width: 0;\n overflow-wrap: anywhere;\n }\n\n .close {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n padding: 0;\n font-size: var(--wc-font-size-medium);\n color: var(--wc-color-text-placeholder);\n cursor: pointer;\n background: transparent;\n border: none;\n border-radius: var(--wc-radius-small);\n transition: color var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .close:hover {\n color: var(--wc-color-text);\n }\n\n @keyframes wc-message-in {\n from {\n transform: translateY(-100%);\n opacity: 0;\n }\n\n to {\n transform: none;\n opacity: 1;\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n .message {\n animation: none;\n }\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { LocalizeController } from '../../i18n/localize-controller';\nimport '../icon/wc-icon.js';\nimport { messageStyles } from './wc-message.styles';\n\nexport type wcMessageTheme = 'info' | 'success' | 'warning' | 'error' | 'loading';\n\n/** 主题 → 内置图标 */\nconst THEME_ICONS: Record<wcMessageTheme, string> = {\n info: 'info',\n success: 'check',\n warning: 'warning',\n error: 'error',\n loading: 'loader',\n};\n\n/**\n * 全局提示(单条)。常规用法是命令式 API `message.success('...')`,\n * 也可以声明式书写(content 属性或默认插槽,duration 控制自动关闭)。\n * 关闭时派发 wc-close 并将自身从 DOM 移除。\n *\n * @slot - 提示内容(覆盖 content 属性)\n * @slot icon - 覆盖主题图标\n * @csspart base - 提示条\n * @csspart icon - 主题图标\n * @csspart content - 内容\n * @csspart close-button - 关闭按钮\n * @fires wc-close - 关闭时触发(之后组件从 DOM 移除)\n */\nexport class wcMessage extends LitElement {\n static styles = [baseStyles, messageStyles];\n\n /** 提示类型 */\n @property({ reflect: true }) theme: wcMessageTheme = 'info';\n\n /** 提示内容 */\n @property() content = '';\n\n /** 自动关闭时长(ms),0 表示不自动关闭 */\n @property({ type: Number }) duration = 3000;\n\n /** 显示关闭按钮 */\n @property({ type: Boolean, reflect: true }) closable = false;\n\n private localize = new LocalizeController(this);\n\n private autoCloseTimer: ReturnType<typeof setTimeout> | null = null;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.startAutoClose();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.stopAutoClose();\n }\n\n private startAutoClose(): void {\n if (this.duration <= 0 || this.autoCloseTimer !== null) return;\n this.autoCloseTimer = setTimeout(() => this.close(), this.duration);\n }\n\n private stopAutoClose(): void {\n if (this.autoCloseTimer !== null) {\n clearTimeout(this.autoCloseTimer);\n this.autoCloseTimer = null;\n }\n }\n\n /** 关闭:派发 wc-close 并从 DOM 移除自身 */\n close(): void {\n this.stopAutoClose();\n this.dispatchEvent(new CustomEvent('wc-close', { bubbles: true, composed: true }));\n this.remove();\n }\n\n render() {\n const icon = THEME_ICONS[this.theme] ?? 'info';\n return html`\n <div class=\"message\" part=\"base\" role=\"status\" aria-live=\"polite\">\n <wc-icon\n class=\"icon ${this.theme}\"\n part=\"icon\"\n name=${icon}\n ?spin=${this.theme === 'loading'}\n ></wc-icon>\n <div class=\"content\" part=\"content\"><slot>${this.content}</slot></div>\n ${\n this.closable\n ? html`\n <button\n type=\"button\"\n class=\"close\"\n part=\"close-button\"\n aria-label=${this.localize.term('message.close')}\n @click=${() => this.close()}\n >\n <wc-icon name=\"close\"></wc-icon>\n </button>\n `\n : ''\n }\n </div>\n `;\n }\n}\n\nif (!customElements.get('wc-message')) {\n customElements.define('wc-message', wcMessage);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-message': wcMessage;\n }\n}\n","import type { wcMessage, wcMessageTheme } from './wc-message.js';\nimport './wc-message.js';\n\nexport interface WcMessageOptions {\n /** 提示类型,默认 info */\n theme?: wcMessageTheme;\n /** 自动关闭时长(ms),默认 3000,0 表示不自动关闭 */\n duration?: number;\n /** 显示关闭按钮,默认 false */\n closable?: boolean;\n /** 关闭回调 */\n onClose?: () => void;\n}\n\nlet container: HTMLDivElement | null = null;\n\n/** 全局消息容器(单例):固定顶部居中,纵向堆叠 */\nfunction ensureContainer(): HTMLDivElement {\n if (container && container.isConnected) return container;\n container = document.createElement('div');\n container.className = 'wc-message-container';\n const zIndex = parseFloat(\n getComputedStyle(document.documentElement).getPropertyValue('--wc-z-index-message'),\n );\n container.style.cssText = [\n 'position:fixed',\n 'top:var(--wc-space-4, 16px)',\n 'left:0',\n 'right:0',\n 'display:flex',\n 'flex-direction:column',\n 'align-items:center',\n 'pointer-events:none',\n `z-index:${Number.isFinite(zIndex) && zIndex > 0 ? zIndex : 1500}`,\n ].join(';');\n document.body.appendChild(container);\n return container;\n}\n\n/** 命令式消息入口:message.success('已保存') */\nfunction showMessage(content: string, options: WcMessageOptions = {}): wcMessage {\n const el = document.createElement('wc-message') as wcMessage;\n el.theme = options.theme ?? 'info';\n el.content = content;\n if (options.duration !== undefined) el.duration = options.duration;\n if (options.closable !== undefined) el.closable = options.closable;\n if (options.onClose) el.addEventListener('wc-close', () => options.onClose!());\n ensureContainer().appendChild(el);\n return el;\n}\n\nexport const message = {\n /** 普通信息 */\n info: (content: string, options?: WcMessageOptions) =>\n showMessage(content, { ...options, theme: 'info' }),\n /** 成功 */\n success: (content: string, options?: WcMessageOptions) =>\n showMessage(content, { ...options, theme: 'success' }),\n /** 警告 */\n warning: (content: string, options?: WcMessageOptions) =>\n showMessage(content, { ...options, theme: 'warning' }),\n /** 错误 */\n error: (content: string, options?: WcMessageOptions) =>\n showMessage(content, { ...options, theme: 'error' }),\n /** 加载中(不自动关闭,需手动 close 或传 duration) */\n loading: (content: string, options?: WcMessageOptions) =>\n showMessage(content, { duration: 0, closable: false, ...options, theme: 'loading' }),\n /** 完整配置入口 */\n show: showMessage,\n};\n","/**\n * 弹层定位引擎(零依赖,纯函数)。\n * 输入锚点/弹层/视口的矩形,输出弹层坐标、最终 placement 与箭头偏移。\n * 不够空间时沿主轴翻转(top↔bottom、left↔right),再向视口内夹紧;\n * Tooltip / Popconfirm 等浮层组件共用。\n */\n\nexport type WcPlacementBase = 'top' | 'bottom' | 'left' | 'right';\nexport type WcPlacementAlign = 'start' | 'end';\n\nexport type WcPlacement = WcPlacementBase | `${WcPlacementBase}-start` | `${WcPlacementBase}-end`;\n\nexport interface WcRect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface WcPositionResult {\n /** 弹层 left(px,position:fixed) */\n x: number;\n /** 弹层 top(px,position:fixed) */\n y: number;\n /** 翻转后的最终 placement */\n placement: WcPlacement;\n /** 箭头中心距弹层起始边(左或上)的偏移(px) */\n arrowOffset: number;\n}\n\n/** 弹层与锚点的间距 */\nexport const POSITION_GAP = 8;\n\n/** 箭头中心距弹层边缘的最小/最大留白 */\nexport const ARROW_INSET = 12;\n\nexport function splitPlacement(placement: WcPlacement): {\n base: WcPlacementBase;\n align?: WcPlacementAlign;\n} {\n const index = placement.indexOf('-');\n if (index === -1) return { base: placement as WcPlacementBase };\n return {\n base: placement.slice(0, index) as WcPlacementBase,\n align: placement.slice(index + 1) as WcPlacementAlign,\n };\n}\n\nfunction oppositeBase(base: WcPlacementBase): WcPlacementBase {\n switch (base) {\n case 'top':\n return 'bottom';\n case 'bottom':\n return 'top';\n case 'left':\n return 'right';\n case 'right':\n return 'left';\n }\n}\n\n/** 主轴方向该侧是否放得下 */\nfunction fitsOnSide(\n base: WcPlacementBase,\n anchor: WcRect,\n panel: WcRect,\n viewport: WcRect,\n): boolean {\n switch (base) {\n case 'top':\n return anchor.y - panel.height - POSITION_GAP >= viewport.y;\n case 'bottom':\n return anchor.y + anchor.height + panel.height + POSITION_GAP <= viewport.y + viewport.height;\n case 'left':\n return anchor.x - panel.width - POSITION_GAP >= viewport.x;\n case 'right':\n return anchor.x + anchor.width + panel.width + POSITION_GAP <= viewport.x + viewport.width;\n }\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n // 下限优先:弹层大于视口时 max 可能小于 min,保证不产生负偏移\n return Math.max(min, Math.min(value, max));\n}\n\n/**\n * 计算 fixed 定位坐标。\n * @param anchor 锚点矩形(getBoundingClientRect)\n * @param panel 弹层矩形(需已渲染可测量;不可见时可 visibility:hidden,不能 display:none)\n * @param viewport 可用视口矩形(window.innerWidth/innerHeight 构造)\n * @param preferred 期望 placement\n */\nexport function computePosition(\n anchor: WcRect,\n panel: WcRect,\n viewport: WcRect,\n preferred: WcPlacement,\n): WcPositionResult {\n const { base, align } = splitPlacement(preferred);\n let useBase = base;\n if (\n !fitsOnSide(base, anchor, panel, viewport) &&\n fitsOnSide(oppositeBase(base), anchor, panel, viewport)\n ) {\n useBase = oppositeBase(base);\n }\n\n // 交叉轴对齐坐标(未夹紧)\n const alignStart = align === 'start';\n const alignEnd = align === 'end';\n let x: number;\n let y: number;\n\n const alignCross = (anchorStart: number, anchorSize: number, panelSize: number): number => {\n if (alignStart) return anchorStart;\n if (alignEnd) return anchorStart + anchorSize - panelSize;\n return anchorStart + anchorSize / 2 - panelSize / 2;\n };\n\n if (useBase === 'top' || useBase === 'bottom') {\n x = alignCross(anchor.x, anchor.width, panel.width);\n y =\n useBase === 'top'\n ? anchor.y - panel.height - POSITION_GAP\n : anchor.y + anchor.height + POSITION_GAP;\n } else {\n y = alignCross(anchor.y, anchor.height, panel.height);\n x =\n useBase === 'left'\n ? anchor.x - panel.width - POSITION_GAP\n : anchor.x + anchor.width + POSITION_GAP;\n }\n\n // 向视口内夹紧\n x = clamp(x, viewport.x, viewport.x + viewport.width - panel.width);\n y = clamp(y, viewport.y, viewport.y + viewport.height - panel.height);\n\n // 箭头:位于弹层朝向锚点的边上,中心对准锚点中心(夹紧留白)\n const anchorCrossCenter =\n useBase === 'top' || useBase === 'bottom'\n ? anchor.x + anchor.width / 2 - x\n : anchor.y + anchor.height / 2 - y;\n const maxOffset =\n (useBase === 'top' || useBase === 'bottom' ? panel.width : panel.height) - ARROW_INSET;\n const arrowOffset = clamp(anchorCrossCenter, ARROW_INSET, Math.max(ARROW_INSET, maxOffset));\n\n const placement: WcPlacement = align ? `${useBase}-${align}` : useBase;\n return { x, y, placement, arrowOffset };\n}\n","import { css } from 'lit';\n\nexport const tooltipStyles = css`\n :host {\n display: inline-block;\n\n /* component 层令牌 */\n --wc-tooltip-max-width: 240px;\n --wc-tooltip-arrow-offset: 50%;\n }\n\n .trigger {\n display: inline-flex;\n }\n\n .panel {\n position: fixed;\n z-index: var(--wc-z-index-tooltip);\n box-sizing: border-box;\n max-width: var(--wc-tooltip-max-width);\n padding: var(--wc-space-2) var(--wc-space-3);\n font-size: var(--wc-font-size-small);\n line-height: var(--wc-font-line-height, 1.6);\n color: var(--wc-color-text-anti);\n background-color: var(--wc-color-gray-900);\n border-radius: var(--wc-radius-small);\n box-shadow: var(--wc-shadow-2);\n opacity: 0;\n visibility: hidden;\n transform: scale(0.96);\n transition:\n opacity var(--wc-duration-fast) var(--wc-easing-standard),\n transform var(--wc-duration-fast) var(--wc-easing-standard),\n visibility var(--wc-duration-fast);\n }\n\n .panel[data-open] {\n opacity: 1;\n visibility: visible;\n transform: none;\n }\n\n .body {\n overflow-wrap: anywhere;\n }\n\n /* ---- 箭头:8px 旋转正方形,贴在朝向锚点的一边 ---- */\n .arrow {\n position: absolute;\n width: 8px;\n height: 8px;\n background-color: inherit;\n transform: rotate(45deg);\n }\n\n .side-top .arrow {\n left: var(--wc-tooltip-arrow-offset);\n bottom: -4px;\n margin-left: -4px;\n }\n\n .side-bottom .arrow {\n left: var(--wc-tooltip-arrow-offset);\n top: -4px;\n margin-left: -4px;\n }\n\n .side-left .arrow {\n top: var(--wc-tooltip-arrow-offset);\n right: -4px;\n margin-top: -4px;\n }\n\n .side-right .arrow {\n top: var(--wc-tooltip-arrow-offset);\n left: -4px;\n margin-top: -4px;\n }\n\n @media (prefers-reduced-motion: reduce) {\n .panel {\n transition: none;\n }\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { computePosition, splitPlacement, type WcPlacement } from '../../common/position';\nimport '../icon/wc-icon.js';\nimport { tooltipStyles } from './wc-tooltip.styles';\n\nexport type wcTooltipTrigger = 'hover' | 'click' | 'manual';\n\n/** 显示/隐藏防抖延迟(ms) */\nconst SHOW_DELAY = 100;\nconst HIDE_DELAY = 150;\n\nlet tooltipUid = 0;\n\n/**\n * 文字提示:悬浮/聚焦触发,auto-placement 会在空间不足时自动翻转方向。\n * content 属性或 content 插槽提供内容;trigger=\"manual\" 时用 show()/hide() 控制。\n *\n * @slot - 触发元素\n * @slot content - 富文本内容(覆盖 content 属性)\n * @csspart trigger - 触发区\n * @csspart base - 提示面板\n * @csspart arrow - 箭头\n * @cssprop --wc-tooltip-max-width - 面板最大宽度(默认 240px)\n * @fires wc-show - 开始显示时触发\n * @fires wc-hide - 开始隐藏时触发\n */\nexport class wcTooltip extends LitElement {\n static styles = [baseStyles, tooltipStyles];\n\n /** 提示内容 */\n @property() content = '';\n\n /** 期望弹出方向(空间不足自动翻转) */\n @property() placement: WcPlacement = 'top';\n\n /** 触发方式:hover(含 focus)/ click / manual */\n @property({ reflect: true }) trigger: wcTooltipTrigger = 'hover';\n\n /** 当前是否可见 */\n @property({ type: Boolean, reflect: true }) open = false;\n\n private panelId = `wc-tooltip-panel-${++tooltipUid}`;\n\n private showTimer: ReturnType<typeof setTimeout> | null = null;\n private hideTimer: ReturnType<typeof setTimeout> | null = null;\n\n private onDocumentClick = (e: Event): void => {\n if (e.composedPath().includes(this)) return;\n this.hide();\n };\n\n override connectedCallback(): void {\n super.connectedCallback();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.clearTimers();\n document.removeEventListener('click', this.onDocumentClick, true);\n }\n\n /** 显示(manual 模式或编程调用) */\n show(): void {\n this.clearTimers();\n this.showTimer = setTimeout(() => {\n if (!this.open) {\n this.open = true;\n this.dispatchEvent(new CustomEvent('wc-show', { bubbles: true, composed: true }));\n }\n }, SHOW_DELAY);\n }\n\n /** 隐藏 */\n hide(): void {\n this.clearTimers();\n this.hideTimer = setTimeout(() => {\n if (this.open) {\n this.open = false;\n this.dispatchEvent(new CustomEvent('wc-hide', { bubbles: true, composed: true }));\n }\n }, HIDE_DELAY);\n }\n\n private clearTimers(): void {\n if (this.showTimer !== null) {\n clearTimeout(this.showTimer);\n this.showTimer = null;\n }\n if (this.hideTimer !== null) {\n clearTimeout(this.hideTimer);\n this.hideTimer = null;\n }\n }\n\n private onTriggerEnter(): void {\n if (this.trigger !== 'hover') return;\n this.show();\n }\n\n private onTriggerLeave(): void {\n if (this.trigger !== 'hover') return;\n this.hide();\n }\n\n private onTriggerClick(e: Event): void {\n if (this.trigger !== 'click') return;\n // 避免点击触发元素本身触发 document 关闭逻辑\n e.stopPropagation();\n if (this.open) this.hide();\n else this.show();\n }\n\n private onTriggerKeydown(e: KeyboardEvent): void {\n if (this.trigger === 'click' && e.key === 'Escape' && this.open) {\n this.hide();\n }\n }\n\n protected override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n // open 变化后:click 模式挂/卸 document 点击关闭\n if (changed.has('open')) {\n if (this.open && this.trigger === 'click') {\n document.addEventListener('click', this.onDocumentClick, true);\n } else if (!this.open) {\n document.removeEventListener('click', this.onDocumentClick, true);\n }\n if (this.open) this.position();\n }\n }\n\n /** 计算并应用 fixed 定位与箭头偏移 */\n private position(): void {\n const panel = this.shadowRoot!.querySelector<HTMLElement>('.panel');\n if (!panel) return;\n const anchor = this.getBoundingClientRect();\n const panelRect = panel.getBoundingClientRect();\n const viewport = { x: 0, y: 0, width: window.innerWidth, height: window.innerHeight };\n const result = computePosition(anchor, panelRect, viewport, this.placement);\n panel.style.left = `${result.x}px`;\n panel.style.top = `${result.y}px`;\n panel.dataset.placement = result.placement;\n panel.style.setProperty('--wc-tooltip-arrow-offset', `${result.arrowOffset}px`);\n }\n\n render() {\n const { base } = splitPlacement(this.placement);\n return html`\n <span\n class=\"trigger\"\n part=\"trigger\"\n aria-describedby=${this.panelId}\n @mouseenter=${this.onTriggerEnter}\n @mouseleave=${this.onTriggerLeave}\n @focusin=${this.onTriggerEnter}\n @focusout=${this.onTriggerLeave}\n @click=${this.onTriggerClick}\n @keydown=${this.onTriggerKeydown}\n >\n <slot></slot>\n </span>\n <div\n class=\"panel side-${base}\"\n part=\"base\"\n id=${this.panelId}\n role=\"tooltip\"\n ?data-open=${this.open}\n >\n <div class=\"arrow\" part=\"arrow\"></div>\n <div class=\"body\"><slot name=\"content\">${this.content}</slot></div>\n </div>\n `;\n }\n}\n\nif (!customElements.get('wc-tooltip')) {\n customElements.define('wc-tooltip', wcTooltip);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-tooltip': wcTooltip;\n }\n}\n","import { css } from 'lit';\n\nexport const popconfirmStyles = css`\n :host {\n display: inline-block;\n\n /* component 层令牌 */\n --wc-popconfirm-width: 240px;\n --wc-popconfirm-arrow-offset: 50%;\n }\n\n .trigger {\n display: inline-flex;\n }\n\n .panel {\n position: fixed;\n z-index: var(--wc-z-index-tooltip);\n box-sizing: border-box;\n width: var(--wc-popconfirm-width);\n padding: var(--wc-space-4);\n font-size: var(--wc-font-size-medium);\n line-height: var(--wc-font-line-height, 1.6);\n color: var(--wc-color-text);\n background-color: var(--wc-color-bg-container);\n border-radius: var(--wc-radius-medium);\n box-shadow: var(--wc-shadow-2);\n opacity: 0;\n visibility: hidden;\n transform: scale(0.96);\n transition:\n opacity var(--wc-duration-fast) var(--wc-easing-standard),\n transform var(--wc-duration-fast) var(--wc-easing-standard),\n visibility var(--wc-duration-fast);\n }\n\n .panel[data-open] {\n opacity: 1;\n visibility: visible;\n transform: none;\n }\n\n .main {\n display: flex;\n align-items: flex-start;\n gap: var(--wc-space-2);\n }\n\n .icon {\n flex-shrink: 0;\n margin-top: 2px;\n font-size: var(--wc-font-size-large);\n color: var(--wc-color-warning);\n }\n\n .content {\n flex: 1;\n min-width: 0;\n overflow-wrap: anywhere;\n }\n\n .actions {\n display: flex;\n gap: var(--wc-space-2);\n justify-content: flex-end;\n margin-top: var(--wc-space-3);\n }\n\n /* ---- 箭头(同 Tooltip) ---- */\n .arrow {\n position: absolute;\n width: 8px;\n height: 8px;\n background-color: inherit;\n transform: rotate(45deg);\n }\n\n .side-top .arrow {\n left: var(--wc-popconfirm-arrow-offset);\n bottom: -4px;\n margin-left: -4px;\n }\n\n .side-bottom .arrow {\n left: var(--wc-popconfirm-arrow-offset);\n top: -4px;\n margin-left: -4px;\n }\n\n .side-left .arrow {\n top: var(--wc-popconfirm-arrow-offset);\n right: -4px;\n margin-top: -4px;\n }\n\n .side-right .arrow {\n top: var(--wc-popconfirm-arrow-offset);\n left: -4px;\n margin-top: -4px;\n }\n\n @media (prefers-reduced-motion: reduce) {\n .panel {\n transition: none;\n }\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { computePosition, splitPlacement, type WcPlacement } from '../../common/position';\nimport { LocalizeController } from '../../i18n/localize-controller';\nimport '../button/wc-button.js';\nimport '../icon/wc-icon.js';\nimport { popconfirmStyles } from './wc-popconfirm.styles';\n\nlet popconfirmUid = 0;\n\n/**\n * 气泡确认:点击触发的二次确认浮层。\n * 定位复用 position.ts(空间不足自动翻转),确认/取消派发 wc-confirm / wc-cancel\n * 并自动关闭。点击外部或 Esc 也会关闭。\n *\n * @slot - 触发元素\n * @slot content - 确认文案(覆盖 content 属性)\n * @csspart trigger - 触发区\n * @csspart base - 气泡面板\n * @csspart icon - 提示图标\n * @csspart actions - 按钮区\n * @fires wc-confirm - 点击确认(之后自动关闭)\n * @fires wc-cancel - 点击取消 / 外部点击 / Esc(之后自动关闭)\n */\nexport class wcPopconfirm extends LitElement {\n static styles = [baseStyles, popconfirmStyles];\n\n /** 确认文案 */\n @property() content = '';\n\n /** 期望弹出方向(空间不足自动翻转) */\n @property() placement: WcPlacement = 'top';\n\n /** 确认按钮文案(默认 i18n「确认」) */\n @property({ attribute: 'confirm-text' }) confirmText = '';\n\n /** 取消按钮文案(默认 i18n「取消」) */\n @property({ attribute: 'cancel-text' }) cancelText = '';\n\n /** 确认按钮主题(primary/danger 等,透传 wc-button) */\n @property() theme = 'primary';\n\n /** 图标名称(内置图标名,空字符串隐藏) */\n @property() icon = 'warning';\n\n /** 当前是否打开 */\n @property({ type: Boolean, reflect: true }) open = false;\n\n private panelId = `wc-popconfirm-panel-${++popconfirmUid}`;\n\n private localize = new LocalizeController(this);\n\n private onDocumentClick = (e: Event): void => {\n if (e.composedPath().includes(this)) return;\n this.cancel('outside');\n };\n\n private onDocumentKeydown = (e: KeyboardEvent): void => {\n if (e.key === 'Escape') {\n e.stopPropagation();\n this.cancel('escape');\n }\n };\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.unbindSideEffects();\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n // 带 open 属性创建时 show() 不会执行,副作用需在此绑定\n if (this.open) this.bindSideEffects();\n }\n\n /** 打开气泡 */\n show(): void {\n if (this.open) return;\n this.open = true;\n this.bindSideEffects();\n }\n\n /** 关闭气泡(不派发事件) */\n hide(): void {\n if (!this.open) return;\n this.open = false;\n this.unbindSideEffects();\n }\n\n /** 确认:派发 wc-confirm 并关闭 */\n confirm(): void {\n this.dispatchEvent(new CustomEvent('wc-confirm', { bubbles: true, composed: true }));\n this.hide();\n }\n\n /** 取消:派发 wc-cancel 并关闭 */\n cancel(reason: 'button' | 'outside' | 'escape' = 'button'): void {\n if (!this.open) return;\n this.dispatchEvent(\n new CustomEvent('wc-cancel', { detail: { reason }, bubbles: true, composed: true }),\n );\n this.hide();\n }\n\n private bindSideEffects(): void {\n document.addEventListener('click', this.onDocumentClick, true);\n document.addEventListener('keydown', this.onDocumentKeydown, true);\n // 焦点移到确认按钮;关闭时归还给触发元素\n queueMicrotask(() => {\n this.shadowRoot!.querySelector<HTMLElement>('[part=\"confirm-button\"]')?.focus();\n });\n }\n\n private unbindSideEffects(): void {\n document.removeEventListener('click', this.onDocumentClick, true);\n document.removeEventListener('keydown', this.onDocumentKeydown, true);\n this.shadowRoot!.querySelector<HTMLElement>('.trigger')?.focus();\n }\n\n protected override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (!changed.has('open')) return;\n if (this.open) {\n this.bindSideEffects();\n this.position();\n } else {\n this.unbindSideEffects();\n }\n }\n\n /** 计算并应用 fixed 定位与箭头偏移(同 Tooltip) */\n private position(): void {\n const panel = this.shadowRoot!.querySelector<HTMLElement>('.panel');\n if (!panel) return;\n const anchor = this.getBoundingClientRect();\n const panelRect = panel.getBoundingClientRect();\n const viewport = { x: 0, y: 0, width: window.innerWidth, height: window.innerHeight };\n const result = computePosition(anchor, panelRect, viewport, this.placement);\n panel.style.left = `${result.x}px`;\n panel.style.top = `${result.y}px`;\n panel.dataset.placement = result.placement;\n panel.style.setProperty('--wc-popconfirm-arrow-offset', `${result.arrowOffset}px`);\n }\n\n private onTriggerClick(e: Event): void {\n // 防止触发元素的点击冒泡到 document 立即又关闭\n e.stopPropagation();\n if (this.open) this.hide();\n else this.show();\n }\n\n render() {\n const { base } = splitPlacement(this.placement);\n return html`\n <span\n class=\"trigger\"\n part=\"trigger\"\n tabindex=\"0\"\n role=\"button\"\n aria-describedby=${this.open ? this.panelId : ''}\n @click=${this.onTriggerClick}\n @keydown=${(e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n this.onTriggerClick(e);\n }\n }}\n >\n <slot></slot>\n </span>\n <div\n class=\"panel side-${base}\"\n part=\"base\"\n id=${this.panelId}\n role=\"dialog\"\n aria-label=${this.content || 'popconfirm'}\n ?data-open=${this.open}\n >\n <div class=\"arrow\" part=\"arrow\"></div>\n <div class=\"main\">\n ${this.icon ? html`<wc-icon class=\"icon\" part=\"icon\" name=${this.icon}></wc-icon>` : ''}\n <div class=\"content\"><slot name=\"content\">${this.content}</slot></div>\n </div>\n <div class=\"actions\" part=\"actions\">\n <wc-button size=\"small\" @click=${() => this.cancel('button')}>\n ${this.cancelText || this.localize.term('dialog.cancel')}\n </wc-button>\n <wc-button\n size=\"small\"\n theme=${this.theme}\n part=\"confirm-button\"\n @click=${() => this.confirm()}\n >\n ${this.confirmText || this.localize.term('dialog.confirm')}\n </wc-button>\n </div>\n </div>\n `;\n }\n}\n\nif (!customElements.get('wc-popconfirm')) {\n customElements.define('wc-popconfirm', wcPopconfirm);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-popconfirm': wcPopconfirm;\n }\n}\n","import { css } from 'lit';\n\nexport const tabsStyles = css`\n :host {\n display: block;\n }\n\n .bar {\n display: flex;\n gap: var(--wc-space-2);\n border-bottom: 1px solid var(--wc-color-border);\n }\n\n .tab {\n position: relative;\n padding: var(--wc-space-2) var(--wc-space-4);\n font-size: var(--wc-font-size-medium);\n line-height: var(--wc-font-line-height, 1.6);\n color: var(--wc-color-text);\n cursor: pointer;\n background: transparent;\n border: none;\n outline: none;\n transition:\n color var(--wc-duration-fast) var(--wc-easing-standard),\n background-color var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .tab::after {\n content: '';\n position: absolute;\n right: var(--wc-space-3);\n bottom: -1px;\n left: var(--wc-space-3);\n height: 2px;\n background-color: var(--wc-color-primary);\n border-radius: var(--wc-radius-small);\n opacity: 0;\n transform: scaleX(0.4);\n transition:\n opacity var(--wc-duration-fast) var(--wc-easing-standard),\n transform var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .tab:hover {\n color: var(--wc-color-primary);\n background-color: var(--wc-color-bg-hover);\n }\n\n .tab[aria-selected='true'] {\n color: var(--wc-color-primary);\n font-weight: var(--wc-font-weight-semibold);\n }\n\n .tab[aria-selected='true']::after {\n opacity: 1;\n transform: none;\n }\n\n .tab:focus-visible {\n box-shadow: 0 0 0 2px var(--wc-color-focus-ring);\n }\n\n .tab[data-disabled] {\n color: var(--wc-color-text-disabled);\n cursor: not-allowed;\n background-color: transparent;\n }\n`;\n","import { css } from 'lit';\n\nexport const tabStyles = css`\n :host {\n display: block;\n padding-top: var(--wc-space-3);\n font-size: var(--wc-font-size-medium);\n line-height: var(--wc-font-line-height, 1.6);\n color: var(--wc-color-text);\n }\n\n :host(:not([active])) {\n display: none;\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { tabStyles } from './wc-tab.styles';\n\n/**\n * 标签页面板:作为 <wc-tabs> 的子元素声明一个标签页。\n * label 显示在标签栏,value 用于匹配激活态(缺省按索引),\n * 内容仅在激活时显示。\n *\n * @slot - 面板内容\n * @csspart panel - 面板容器\n */\nexport class wcTab extends LitElement {\n static styles = [baseStyles, tabStyles];\n\n /** 匹配 wc-tabs.value 的唯一值(缺省按索引) */\n @property() value = '';\n\n /** 标签栏显示文本 */\n @property() label = '';\n\n /** 禁用(不可选中,键盘导航跳过) */\n @property({ type: Boolean, reflect: true }) disabled = false;\n\n /** 激活态,由 wc-tabs 同步(host 据此显隐) */\n @property({ type: Boolean, reflect: true }) active = false;\n\n render() {\n return html`<div class=\"panel\" part=\"panel\" role=\"tabpanel\" aria-label=${this.label}>\n <slot></slot>\n </div>`;\n }\n}\n\nif (!customElements.get('wc-tab')) {\n customElements.define('wc-tab', wcTab);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-tab': wcTab;\n }\n}\n","import { html, LitElement, nothing } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { tabsStyles } from './wc-tabs.styles';\nimport './wc-tab.js';\nimport type { wcTab } from './wc-tab.js';\n\nexport type wcTabsChangeDetail = { value: string };\n\n/** 标签栏单项元数据 */\ninterface TabMeta {\n value: string;\n label: string;\n disabled: boolean;\n element: wcTab;\n}\n\n/**\n * 标签页容器:子元素 <wc-tab>(label/value/disabled)声明标签页,\n * 点击或键盘(←/→/Home/End,自动激活)切换,派发 wc-change。\n *\n * @slot - <wc-tab> 子元素\n * @csspart bar - 标签栏\n * @csspart tab - 单个标签\n * @fires wc-change - 激活标签变化时触发,detail.value\n */\nexport class wcTabs extends LitElement {\n static styles = [baseStyles, tabsStyles];\n\n /** 激活标签的 value */\n @property({ reflect: true }) value = '';\n\n private tabs: TabMeta[] = [];\n\n private uid = `wc-tabs-${Math.random().toString(36).slice(2, 8)}`;\n\n /** 子元素 label/value/disabled 变化时刷新标签栏 */\n private mutationObserver = new MutationObserver(() => this.collectTabs());\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.mutationObserver.observe(this, {\n childList: true,\n // subtree: true 使 attributeFilter 也能监视子元素 label/value/disabled 变化\n subtree: true,\n attributes: true,\n attributeFilter: ['label', 'value', 'disabled'],\n });\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.mutationObserver.disconnect();\n }\n\n private collectTabs(): void {\n const children = Array.from(this.querySelectorAll<wcTab>('wc-tab'));\n this.tabs = children.map((element, index) => ({\n value: element.value || String(index),\n label: element.label || element.textContent?.trim() || String(index + 1),\n disabled: element.disabled,\n element,\n }));\n this.requestUpdate();\n this.syncActive();\n }\n\n /** 把 value 同步到子元素的 active 标志(驱动面板显隐) */\n private syncActive(): void {\n if (!this.value && this.tabs.length > 0 && !this.tabs.some((t) => t.value === this.value)) {\n this.value = this.tabs[0]!.value;\n }\n for (const tab of this.tabs) {\n tab.element.active = tab.value === this.value;\n }\n }\n\n protected override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (changed.has('value')) this.syncActive();\n }\n\n private select(value: string): void {\n if (value === this.value) return;\n const tab = this.tabs.find((t) => t.value === value);\n if (!tab || tab.disabled) return;\n this.value = value;\n this.dispatchEvent(\n new CustomEvent<wcTabsChangeDetail>('wc-change', {\n detail: { value },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private onTablistKeydown(e: KeyboardEvent): void {\n const selectable = this.tabs.filter((t) => !t.disabled);\n if (selectable.length === 0) return;\n const currentIndex = Math.max(\n 0,\n selectable.findIndex((t) => t.value === this.value),\n );\n let next: TabMeta | undefined;\n switch (e.key) {\n case 'ArrowRight':\n case 'ArrowDown':\n next = selectable[(currentIndex + 1) % selectable.length];\n break;\n case 'ArrowLeft':\n case 'ArrowUp':\n next = selectable[(currentIndex - 1 + selectable.length) % selectable.length];\n break;\n case 'Home':\n next = selectable[0];\n break;\n case 'End':\n next = selectable[selectable.length - 1];\n break;\n default:\n return;\n }\n e.preventDefault();\n if (next) {\n this.select(next.value);\n this.focusTab(next.value);\n }\n }\n\n /** 焦点移到指定标签按钮(roving tabindex 的焦点跟随) */\n private focusTab(value: string): void {\n // jsdom 未实现 CSS.escape,用本地转义(属性选择器只需处理引号和反斜杠)\n const escaped = value.replace(/[\"\\\\]/g, '\\\\$&');\n this.shadowRoot!.querySelector<HTMLButtonElement>(`[data-value=\"${escaped}\"]`)?.focus();\n }\n\n render() {\n return html`\n <div class=\"bar\" part=\"bar\" role=\"tablist\" @keydown=${this.onTablistKeydown}>\n ${this.tabs.map(\n (tab) => html`\n <button\n type=\"button\"\n class=\"tab\"\n part=\"tab\"\n role=\"tab\"\n data-value=${tab.value}\n id=${`${this.uid}-tab-${tab.value}`}\n aria-selected=${tab.value === this.value ? 'true' : 'false'}\n aria-disabled=${tab.disabled ? 'true' : 'false'}\n tabindex=${tab.value === this.value ? '0' : '-1'}\n ?data-disabled=${tab.disabled}\n @click=${() => this.select(tab.value)}\n >\n ${tab.label}\n </button>\n `,\n )}\n </div>\n ${this.tabs.length > 0 ? html`<slot @slotchange=${this.collectTabs}></slot>` : nothing}\n `;\n }\n}\n\nif (!customElements.get('wc-tabs')) {\n customElements.define('wc-tabs', wcTabs);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-tabs': wcTabs;\n }\n}\n","import { css } from 'lit';\n\nexport const breadcrumbStyles = css`\n :host {\n display: block;\n }\n\n /* 条目由 shadow 渲染,light-DOM 子元素仅用于收集元数据 */\n slot {\n display: none;\n }\n\n .list {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wc-space-1);\n margin: 0;\n padding: 0;\n list-style: none;\n font-size: var(--wc-font-size-medium);\n }\n\n .item {\n display: inline-flex;\n align-items: center;\n }\n\n .separator {\n display: inline-flex;\n align-items: center;\n color: var(--wc-color-text-placeholder);\n user-select: none;\n }\n\n .link {\n color: var(--wc-color-text-secondary);\n text-decoration: none;\n cursor: pointer;\n transition: color var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .link:hover {\n color: var(--wc-color-primary);\n }\n\n .link[data-disabled] {\n color: var(--wc-color-text-disabled);\n cursor: not-allowed;\n }\n\n .link[data-disabled]:hover {\n color: var(--wc-color-text-disabled);\n }\n\n .current {\n color: var(--wc-color-text);\n font-weight: var(--wc-font-weight-medium);\n }\n`;\n","import { html, LitElement, nothing, type TemplateResult } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { LocalizeController } from '../../i18n/localize-controller';\nimport { breadcrumbStyles } from './wc-breadcrumb.styles';\n\ninterface ItemMeta {\n label: string;\n href: string;\n disabled: boolean;\n index: number;\n}\n\n/**\n * 面包屑。子条目用 light-DOM 的 <wc-breadcrumb-item> 声明,由容器收集后在\n * shadow 中统一渲染:最后一项为当前页(aria-current=\"page\"),中间项可点击\n * 并派发 wc-select,带 href 的条目渲染为原生 <a>(点击后正常跳转)。\n *\n * @example\n * ```html\n * <wc-breadcrumb separator=\"/\">\n * <wc-breadcrumb-item href=\"/\">首页</wc-breadcrumb-item>\n * <wc-breadcrumb-item href=\"/list\" disabled>列表</wc-breadcrumb-item>\n * <wc-breadcrumb-item>详情</wc-breadcrumb-item>\n * </wc-breadcrumb>\n * ```\n *\n * @csspart nav - 导航容器\n * @csspart list - ol 列表\n * @csspart item - 条目\n * @csspart separator - 分隔符\n * @csspart link - 可点击条目\n * @csspart current - 当前页条目\n * @fires wc-select - 点击中间项时派发(detail: { index, label, href })\n */\nexport class wcBreadcrumb extends LitElement {\n static styles = [baseStyles, breadcrumbStyles];\n\n /** 分隔符文本 */\n @property() separator = '/';\n\n private items: ItemMeta[] = [];\n\n private localize = new LocalizeController(this);\n\n /** 子条目 href/disabled 变化时刷新渲染 */\n private mutationObserver = new MutationObserver(() => this.collectItems());\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.mutationObserver.observe(this, {\n childList: true,\n // subtree: true 使 attributeFilter 也能监视子元素 href/disabled 变化\n subtree: true,\n attributes: true,\n attributeFilter: ['href', 'disabled'],\n });\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.mutationObserver.disconnect();\n }\n\n private collectItems(): void {\n const children = Array.from(this.querySelectorAll<HTMLElement>('wc-breadcrumb-item'));\n this.items = children.map((element, index) => ({\n label: element.textContent?.trim() || String(index + 1),\n href: element.getAttribute('href') || '',\n disabled: element.hasAttribute('disabled'),\n index,\n }));\n this.requestUpdate();\n }\n\n private onSelect(item: ItemMeta): void {\n this.dispatchEvent(\n new CustomEvent('wc-select', {\n detail: { index: item.index, label: item.label, href: item.href },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private renderItem(item: ItemMeta, isLast: boolean): TemplateResult {\n if (isLast) {\n return html`<span class=\"current\" part=\"current\" aria-current=\"page\">${item.label}</span>`;\n }\n if (item.disabled) {\n return html`<span class=\"link\" data-disabled aria-disabled=\"true\">${item.label}</span>`;\n }\n if (item.href) {\n return html`<a class=\"link\" part=\"link\" href=${item.href} @click=${() => this.onSelect(item)}\n >${item.label}</a\n >`;\n }\n return html`<span class=\"link\" part=\"link\" @click=${() => this.onSelect(item)}\n >${item.label}</span\n >`;\n }\n\n protected override render(): TemplateResult {\n const last = this.items.length - 1;\n return html`\n <nav class=\"nav\" part=\"nav\" aria-label=${this.localize.term('breadcrumb.label')}>\n <ol class=\"list\" part=\"list\">\n ${this.items.map((item, index) => {\n return html`\n <li class=\"item\" part=\"item\">${this.renderItem(item, index === last)}</li>\n ${\n index < last\n ? html`<li class=\"separator\" part=\"separator\" aria-hidden=\"true\">\n ${this.separator}\n </li>`\n : nothing\n }\n `;\n })}\n </ol>\n <slot @slotchange=${this.collectItems}></slot>\n </nav>\n `;\n }\n}\n\nif (!customElements.get('wc-breadcrumb')) {\n customElements.define('wc-breadcrumb', wcBreadcrumb);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-breadcrumb': wcBreadcrumb;\n }\n}\n","import { html, LitElement, type TemplateResult } from 'lit';\nimport { property } from 'lit/decorators.js';\n\n/**\n * 面包屑条目(light-DOM 子元素)。内容由 wc-breadcrumb 在其 shadow 中统一渲染,\n * 条目自身不产出可见内容。label 取元素的文本内容。\n */\nexport class wcBreadcrumbItem extends LitElement {\n /** 目标链接(有值渲染为 <a>,否则为可点击文本) */\n @property() href = '';\n\n /** 禁用(仅中间项有意义,最后一项始终渲染为当前页文本) */\n @property({ type: Boolean, reflect: true }) disabled = false;\n\n protected override render(): TemplateResult {\n // 条目由 wc-breadcrumb 收集渲染,自身不产出内容\n return html``;\n }\n}\n\nif (!customElements.get('wc-breadcrumb-item')) {\n customElements.define('wc-breadcrumb-item', wcBreadcrumbItem);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-breadcrumb-item': wcBreadcrumbItem;\n }\n}\n","import { css } from 'lit';\n\nexport const paginationStyles = css`\n :host {\n display: block;\n }\n\n .pagination {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wc-space-1);\n font-size: var(--wc-font-size-medium);\n }\n\n .total {\n margin-right: var(--wc-space-2);\n color: var(--wc-color-text-secondary);\n }\n\n .page-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 32px;\n height: 32px;\n padding: 0 var(--wc-space-2);\n color: var(--wc-color-text);\n font: inherit;\n background: transparent;\n border: none;\n border-radius: var(--wc-radius-small);\n cursor: pointer;\n transition:\n color var(--wc-duration-fast) var(--wc-easing-standard),\n background-color var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .page-button:hover:not(:disabled) {\n color: var(--wc-color-primary);\n background-color: var(--wc-color-bg-hover);\n }\n\n .page-button:disabled {\n color: var(--wc-color-text-disabled);\n cursor: not-allowed;\n background: transparent;\n }\n\n .page-button[aria-current='page'] {\n color: var(--wc-color-primary);\n font-weight: var(--wc-font-weight-medium);\n background-color: var(--wc-color-primary-light);\n }\n\n .ellipsis {\n min-width: 32px;\n color: var(--wc-color-text-placeholder);\n letter-spacing: 1px;\n text-align: center;\n user-select: none;\n }\n\n .jumper {\n display: inline-flex;\n align-items: center;\n gap: var(--wc-space-2);\n margin-left: var(--wc-space-2);\n color: var(--wc-color-text-secondary);\n }\n\n .jumper-input {\n width: 56px;\n height: 32px;\n padding: 0 var(--wc-space-2);\n font: inherit;\n color: var(--wc-color-text);\n text-align: center;\n background: transparent;\n border: 1px solid var(--wc-color-border);\n border-radius: var(--wc-radius-small);\n }\n\n .jumper-input:focus {\n outline: none;\n border-color: var(--wc-color-primary);\n }\n\n .jumper-input:disabled {\n color: var(--wc-color-text-disabled);\n background-color: var(--wc-color-bg-disabled, var(--wc-color-bg-hover));\n cursor: not-allowed;\n }\n`;\n","import { html, LitElement, nothing, type TemplateResult } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { LocalizeController } from '../../i18n/localize-controller';\nimport '../icon/wc-icon.js';\nimport { paginationStyles } from './wc-pagination.styles';\n\ntype PageItem = number | 'ellipsis-prev' | 'ellipsis-next';\n\n/**\n * 分页。由 total / page-size 推导总页数,页码过多时按 folded-page-count 折叠\n * 为「1 … 中间窗 … 末页」。页码切换派发 wc-change(detail: { current, previous }),\n * total/page-size 变化导致越界时静默夹紧 current(不派发事件)。\n *\n * @example\n * ```html\n * <wc-pagination total=\"200\" current=\"1\" show-total show-jumper></wc-pagination>\n * ```\n *\n * @csspart nav - 导航容器\n * @csspart total - 总条数\n * @csspart prev / next - 前后翻页按钮\n * @csspart page - 页码按钮\n * @csspart ellipsis - 省略号\n * @csspart jumper - 跳页区\n * @csspart jumper-input - 跳页输入框\n * @fires wc-change - 页码变化后触发(含用户点击与跳页输入)\n */\nexport class wcPagination extends LitElement {\n static styles = [baseStyles, paginationStyles];\n\n /** 数据总条数 */\n @property({ type: Number }) total = 0;\n\n /** 每页条数 */\n @property({ type: Number, attribute: 'page-size' }) pageSize = 10;\n\n /** 当前页(1 开始) */\n @property({ type: Number, reflect: true }) current = 1;\n\n /** 折叠时中间窗口显示的页码数量 */\n @property({ type: Number, attribute: 'folded-page-count' }) foldedPageCount = 5;\n\n /** 显示总条数 */\n @property({ type: Boolean, attribute: 'show-total' }) showTotal = false;\n\n /** 显示跳页输入框(Enter 跳转,自动夹紧到有效范围) */\n @property({ type: Boolean, attribute: 'show-jumper' }) showJumper = false;\n\n /** 整体禁用 */\n @property({ type: Boolean, reflect: true }) disabled = false;\n\n private localize = new LocalizeController(this);\n\n /** 总页数 */\n get pageCount(): number {\n return Math.max(1, Math.ceil(this.total / Math.max(1, this.pageSize)));\n }\n\n private select(page: number): void {\n const clamped = Math.min(this.pageCount, Math.max(1, Math.floor(page)));\n if (this.disabled || clamped === this.current) return;\n const previous = this.current;\n this.current = clamped;\n this.dispatchEvent(\n new CustomEvent('wc-change', {\n detail: { current: clamped, previous },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n protected override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n // total/page-size 变化后当前页可能越界,静默夹紧(不派发事件)\n if ((changed.has('total') || changed.has('pageSize')) && this.current > this.pageCount) {\n this.current = this.pageCount;\n }\n }\n\n /** 页码序列:1 … 中间窗口 … 末页,空间充足时全部展开 */\n private getPageItems(): PageItem[] {\n const pageCount = this.pageCount;\n const folded = Math.max(1, this.foldedPageCount);\n if (pageCount <= folded + 2) {\n return Array.from({ length: pageCount }, (_, i) => i + 1);\n }\n let start = Math.max(2, this.current - Math.floor(folded / 2));\n const end = Math.min(pageCount - 1, start + folded - 1);\n start = Math.max(2, end - folded + 1);\n const items: PageItem[] = [1];\n if (start > 2) items.push('ellipsis-prev');\n for (let i = start; i <= end; i++) items.push(i);\n if (end < pageCount - 1) items.push('ellipsis-next');\n items.push(pageCount);\n return items;\n }\n\n private onJumperKeydown(e: KeyboardEvent): void {\n if (e.key !== 'Enter') return;\n const input = e.target as HTMLInputElement;\n const page = Number.parseInt(input.value, 10);\n if (Number.isNaN(page)) return;\n this.select(page);\n input.value = String(this.current);\n }\n\n protected override render(): TemplateResult {\n const prevDisabled = this.disabled || this.current <= 1;\n const nextDisabled = this.disabled || this.current >= this.pageCount;\n return html`\n <nav class=\"pagination\" part=\"nav\" aria-label=${this.localize.term('pagination.label')}>\n ${\n this.showTotal\n ? html`<span class=\"total\" part=\"total\">\n ${this.localize.term('pagination.total', { total: this.total })}\n </span>`\n : nothing\n }\n <button\n type=\"button\"\n class=\"page-button\"\n part=\"prev\"\n ?disabled=${prevDisabled}\n aria-label=${this.localize.term('pagination.prev')}\n @click=${() => this.select(this.current - 1)}\n >\n <wc-icon name=\"chevron-left\"></wc-icon>\n </button>\n ${this.getPageItems().map((item) =>\n typeof item !== 'number'\n ? html`<span class=\"ellipsis\" part=\"ellipsis\" aria-hidden=\"true\">•••</span>`\n : html`<button\n type=\"button\"\n class=\"page-button\"\n part=\"page\"\n ?disabled=${this.disabled}\n aria-label=${this.localize.term('pagination.page', { page: item })}\n aria-current=${item === this.current ? 'page' : nothing}\n @click=${() => this.select(item)}\n >\n ${item}\n </button>`,\n )}\n <button\n type=\"button\"\n class=\"page-button\"\n part=\"next\"\n ?disabled=${nextDisabled}\n aria-label=${this.localize.term('pagination.next')}\n @click=${() => this.select(this.current + 1)}\n >\n <wc-icon name=\"chevron-right\"></wc-icon>\n </button>\n ${\n this.showJumper\n ? html`<span class=\"jumper\" part=\"jumper\">\n ${this.localize.term('pagination.jumpTo')}\n <input\n type=\"text\"\n class=\"jumper-input\"\n part=\"jumper-input\"\n ?disabled=${this.disabled}\n aria-label=${this.localize.term('pagination.jumpTo')}\n @keydown=${this.onJumperKeydown}\n />\n ${this.localize.term('pagination.pageUnit')}\n </span>`\n : nothing\n }\n </nav>\n `;\n }\n}\n\nif (!customElements.get('wc-pagination')) {\n customElements.define('wc-pagination', wcPagination);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-pagination': wcPagination;\n }\n}\n","import { css } from 'lit';\n\nexport const badgeStyles = css`\n :host {\n position: relative;\n display: inline-flex;\n }\n\n .badge {\n position: absolute;\n top: 0;\n right: 0;\n z-index: var(--wc-z-index-popover, 1);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 16px;\n height: 16px;\n padding: 0 4px;\n color: var(--wc-color-text-anti);\n font-size: var(--wc-font-size-xsmall);\n line-height: 1;\n white-space: nowrap;\n background-color: var(--wc-color-error);\n border-radius: var(--wc-radius-round);\n transform: translate(50%, -50%);\n }\n\n :host([dot]) .badge {\n min-width: 6px;\n width: 6px;\n height: 6px;\n padding: 0;\n }\n\n :host([theme='primary']) .badge {\n background-color: var(--wc-color-primary);\n }\n\n :host([theme='success']) .badge {\n background-color: var(--wc-color-success);\n }\n\n :host([theme='warning']) .badge {\n background-color: var(--wc-color-warning);\n }\n\n :host([theme='danger']) .badge {\n background-color: var(--wc-color-error);\n }\n`;\n","import { html, LitElement, nothing, type TemplateResult } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { badgeStyles } from './wc-badge.styles';\n\nexport type wcBadgeTheme = 'primary' | 'success' | 'warning' | 'danger';\n\n/**\n * 徽标。出现在右上角的数字或圆点标记:包裹内容时悬浮于其右上角,\n * 无内容时独立展示。count 超过 max 显示「max+」,count 为 0 时隐藏\n * (dot 模式恒显示)。\n *\n * @example\n * ```html\n * <wc-badge count=\"5\"><wc-icon name=\"search\"></wc-icon></wc-badge>\n * <wc-badge dot></wc-badge>\n * ```\n *\n * @slot - 被标记的内容(可空,空时独立展示)\n * @csspart badge - 徽标本体\n */\nexport class wcBadge extends LitElement {\n static styles = [baseStyles, badgeStyles];\n\n /** 徽标数字(<= 0 隐藏) */\n @property({ type: Number }) count = 0;\n\n /** 数字上限,超出显示「max+」 */\n @property({ type: Number }) max = 99;\n\n /** 圆点模式(忽略 count,恒显示) */\n @property({ type: Boolean, reflect: true }) dot = false;\n\n /** 语义色 */\n @property({ reflect: true }) theme: wcBadgeTheme = 'danger';\n\n /** 实际展示的数字文本 */\n private get displayCount(): string {\n if (this.count > this.max) return `${this.max}+`;\n return String(Math.max(0, this.count));\n }\n\n protected override render(): TemplateResult {\n const visible = this.dot || this.count > 0;\n return html`\n <slot></slot>\n ${\n visible\n ? html`<sup class=\"badge\" part=\"badge\">${this.dot ? nothing : this.displayCount}</sup>`\n : nothing\n }\n `;\n }\n}\n\nif (!customElements.get('wc-badge')) {\n customElements.define('wc-badge', wcBadge);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-badge': wcBadge;\n }\n}\n","import { css } from 'lit';\n\nexport const emptyStyles = css`\n :host {\n display: block;\n }\n\n .empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: var(--wc-space-8) var(--wc-space-4);\n text-align: center;\n }\n\n .icon {\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--wc-color-text-placeholder);\n }\n\n /* 默认占位图形:圆角方块 + 内嵌虚线圆,柔和示意「空」 */\n .placeholder {\n position: relative;\n display: block;\n width: 56px;\n height: 56px;\n background-color: var(--wc-color-bg-hover);\n border-radius: var(--wc-radius-xlarge);\n }\n\n .placeholder::after {\n content: '';\n position: absolute;\n top: 50%;\n left: 50%;\n width: 24px;\n height: 24px;\n border: 2px dashed var(--wc-color-text-placeholder);\n border-radius: var(--wc-radius-circle);\n transform: translate(-50%, -50%);\n }\n\n .description {\n margin-top: var(--wc-space-3);\n color: var(--wc-color-text-secondary);\n font-size: var(--wc-font-size-medium);\n }\n\n .action {\n margin-top: var(--wc-space-4);\n }\n\n .action:empty {\n display: none;\n }\n`;\n","import { html, LitElement, type TemplateResult } from 'lit';\nimport { baseStyles } from '../../styles/base.css';\nimport { LocalizeController } from '../../i18n/localize-controller';\nimport { emptyStyles } from './wc-empty.styles';\n\n/**\n * 空状态。默认展示占位图形 + 「暂无数据」文案,均可用插槽自定义,\n * 另有 action 插槽放置操作按钮(如重试)。\n *\n * @example\n * ```html\n * <wc-empty>\n * <wc-button slot=\"action\" theme=\"primary\">重新加载</wc-button>\n * </wc-empty>\n * ```\n *\n * @slot - 描述文案(默认 i18n「暂无数据」)\n * @slot icon - 自定义占位图形\n * @slot action - 操作区\n * @csspart base - 容器\n * @csspart icon - 占位图形区\n * @csspart description - 描述文案区\n * @csspart action - 操作区\n */\nexport class wcEmpty extends LitElement {\n static styles = [baseStyles, emptyStyles];\n\n private localize = new LocalizeController(this);\n\n protected override render(): TemplateResult {\n return html`\n <div class=\"empty\" part=\"base\">\n <div class=\"icon\" part=\"icon\">\n <slot name=\"icon\"><span class=\"placeholder\"></span></slot>\n </div>\n <div class=\"description\" part=\"description\">\n <slot>${this.localize.term('empty.noData')}</slot>\n </div>\n <div class=\"action\" part=\"action\">\n <slot name=\"action\"></slot>\n </div>\n </div>\n `;\n }\n}\n\nif (!customElements.get('wc-empty')) {\n customElements.define('wc-empty', wcEmpty);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-empty': wcEmpty;\n }\n}\n","import { css } from 'lit';\n\nexport const progressStyles = css`\n :host {\n display: block;\n }\n\n /* ---- line ---- */\n .line {\n display: flex;\n align-items: center;\n gap: var(--wc-space-2);\n }\n\n .track {\n position: relative;\n flex: 1;\n overflow: hidden;\n background-color: var(--wc-color-bg-hover);\n border-radius: var(--wc-radius-round);\n }\n\n .indicator {\n height: 100%;\n background-color: var(--wc-color-primary);\n border-radius: var(--wc-radius-round);\n transition: width var(--wc-duration-slow, 300ms) var(--wc-easing-standard);\n }\n\n :host([status='success']) .indicator {\n background-color: var(--wc-color-success);\n }\n\n :host([status='warning']) .indicator {\n background-color: var(--wc-color-warning);\n }\n\n :host([status='error']) .indicator {\n background-color: var(--wc-color-error);\n }\n\n .label {\n display: inline-flex;\n align-items: center;\n gap: 2px;\n color: var(--wc-color-text-secondary);\n font-size: var(--wc-font-size-small);\n line-height: 1;\n white-space: nowrap;\n }\n\n :host([status='success']) .label {\n color: var(--wc-color-success);\n }\n\n :host([status='error']) .label {\n color: var(--wc-color-error);\n }\n\n .label wc-icon {\n --icon-size: 1em;\n }\n\n /* ---- circle ---- */\n .circle-wrap {\n position: relative;\n display: inline-block;\n width: 72px;\n height: 72px;\n }\n\n .circle {\n display: block;\n width: 100%;\n height: 100%;\n }\n\n .circle .track {\n fill: none;\n stroke: var(--wc-color-bg-hover);\n stroke-width: 6;\n }\n\n .circle .indicator {\n fill: none;\n stroke: var(--wc-color-primary);\n stroke-width: 6;\n stroke-linecap: round;\n transition: stroke-dashoffset var(--wc-duration-slow, 300ms) var(--wc-easing-standard);\n }\n\n :host([status='success']) .circle .indicator {\n stroke: var(--wc-color-success);\n }\n\n :host([status='warning']) .circle .indicator {\n stroke: var(--wc-color-warning);\n }\n\n :host([status='error']) .circle .indicator {\n stroke: var(--wc-color-error);\n }\n\n .circle-label {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--wc-color-text);\n font-size: var(--wc-font-size-small);\n }\n\n .circle-label .label {\n color: inherit;\n }\n`;\n","import { html, LitElement, nothing, type TemplateResult } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport '../icon/wc-icon.js';\nimport { progressStyles } from './wc-progress.styles';\n\nexport type wcProgressTheme = 'line' | 'circle';\nexport type wcProgressStatus = 'normal' | 'success' | 'warning' | 'error';\n\nconst CIRCLE_RADIUS = 32;\nconst CIRCLE_CIRCUMFERENCE = 2 * Math.PI * CIRCLE_RADIUS;\n\n/**\n * 进度条。line 线形 / circle 环形两种主题,value 取 0-100 自动夹紧;\n * status 语义色会同步指示条与标签(success/error 附带状态图标)。\n *\n * @example\n * ```html\n * <wc-progress value=\"60\"></wc-progress>\n * <wc-progress theme=\"circle\" value=\"80\" status=\"success\"></wc-progress>\n * ```\n *\n * @csspart base - 容器\n * @csspart track - 轨道\n * @csspart indicator - 指示条\n * @csspart label - 标签\n */\nexport class wcProgress extends LitElement {\n static styles = [baseStyles, progressStyles];\n\n /** 进度值 0-100(自动夹紧) */\n @property({ type: Number }) value = 0;\n\n /** 主题:line 线形 / circle 环形 */\n @property({ reflect: true }) theme: wcProgressTheme = 'line';\n\n /** 状态色(normal/success/warning/error,附带状态图标) */\n @property({ reflect: true }) status: wcProgressStatus = 'normal';\n\n /** 是否显示标签文本 */\n @property({ type: Boolean, attribute: 'show-label' }) showLabel = true;\n\n /** 线形轨道粗细(px) */\n @property({ type: Number, attribute: 'stroke-width' }) strokeWidth = 6;\n\n /** 自定义标签文本(默认显示百分比) */\n @property() label = '';\n\n /** 夹紧后的百分比 */\n private get percent(): number {\n return Math.min(100, Math.max(0, this.value));\n }\n\n /** 标签文本:label 属性优先,否则百分比 */\n private get labelText(): string {\n return this.label || `${Math.round(this.percent)}%`;\n }\n\n private renderStatusLabel(): TemplateResult | typeof nothing {\n if (!this.showLabel) return nothing;\n // 注意 nothing 是 truthy 符号,必须先算出图标名再判空串\n const iconName = this.status === 'success' ? 'check' : this.status === 'error' ? 'close' : '';\n return html`<span class=\"label\" part=\"label\">\n ${iconName ? html`<wc-icon name=${iconName}></wc-icon>` : nothing}${this.labelText}\n </span>`;\n }\n\n private renderLine(): TemplateResult {\n return html`<div class=\"line\" part=\"base\">\n <div\n class=\"track\"\n part=\"track\"\n role=\"progressbar\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n aria-valuenow=${Math.round(this.percent)}\n aria-label=${this.labelText}\n style=\"height: ${this.strokeWidth}px\"\n >\n <div class=\"indicator\" part=\"indicator\" style=\"width: ${this.percent}%\"></div>\n </div>\n ${this.renderStatusLabel()}\n </div>`;\n }\n\n private renderCircle(): TemplateResult {\n return html`<div class=\"circle-wrap\" part=\"base\">\n <svg\n class=\"circle\"\n viewBox=\"0 0 72 72\"\n role=\"progressbar\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n aria-valuenow=${Math.round(this.percent)}\n aria-label=${this.labelText}\n >\n <circle class=\"track\" part=\"track\" cx=\"36\" cy=\"36\" r=\"${CIRCLE_RADIUS}\"></circle>\n <circle\n class=\"indicator\"\n part=\"indicator\"\n cx=\"36\"\n cy=\"36\"\n r=\"${CIRCLE_RADIUS}\"\n stroke-dasharray=\"${CIRCLE_CIRCUMFERENCE}\"\n stroke-dashoffset=${CIRCLE_CIRCUMFERENCE * (1 - this.percent / 100)}\n transform=\"rotate(-90 36 36)\"\n ></circle>\n </svg>\n <div class=\"circle-label\">${this.renderStatusLabel()}</div>\n </div>`;\n }\n\n protected override render(): TemplateResult {\n return this.theme === 'circle' ? this.renderCircle() : this.renderLine();\n }\n}\n\nif (!customElements.get('wc-progress')) {\n customElements.define('wc-progress', wcProgress);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-progress': wcProgress;\n }\n}\n","import { css } from 'lit';\n\nexport const cardStyles = css`\n :host {\n display: block;\n }\n\n /* display:flex 类会覆盖 [hidden] 的 UA 样式,显式关闭 */\n [hidden] {\n display: none !important;\n }\n\n .card {\n background-color: var(--wc-color-bg-container);\n border-radius: var(--wc-radius-large);\n transition: box-shadow var(--wc-duration-base, 200ms) var(--wc-easing-standard);\n }\n\n :host([bordered]) .card {\n border: 1px solid var(--wc-color-border);\n }\n\n :host([hoverable]) .card:hover {\n box-shadow: var(--wc-shadow-2);\n }\n\n .header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--wc-space-2);\n padding: var(--wc-space-4) var(--wc-space-4) 0;\n }\n\n .titles {\n min-width: 0;\n }\n\n .title {\n color: var(--wc-color-text);\n font-size: var(--wc-font-size-large);\n font-weight: var(--wc-font-weight-medium);\n line-height: 1.5;\n }\n\n .subtitle {\n margin-top: 2px;\n color: var(--wc-color-text-secondary);\n font-size: var(--wc-font-size-small);\n }\n\n .actions {\n flex-shrink: 0;\n }\n\n .body {\n padding: var(--wc-space-4);\n color: var(--wc-color-text);\n font-size: var(--wc-font-size-medium);\n }\n\n .footer {\n padding: var(--wc-space-3) var(--wc-space-4);\n border-top: 1px solid var(--wc-color-border);\n }\n`;\n","import { html, LitElement, nothing, type TemplateResult } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { cardStyles } from './wc-card.styles';\n\n/**\n * 卡片。header 区由 title / subtitle 属性或 header 插槽组成,actions 插槽\n * 放标题右侧操作区,footer 插槽放底部操作区(有内容才渲染对应区域)。\n *\n * @example\n * ```html\n * <wc-card title=\"卡片标题\" subtitle=\"副标题\" hoverable>\n * <p>卡片内容</p>\n * <wc-button slot=\"footer\" theme=\"primary\">操作</wc-button>\n * </wc-card>\n * ```\n *\n * @slot - 卡片内容\n * @slot header - 自定义整个头部(覆盖 title/subtitle)\n * @slot actions - 头部右侧操作区\n * @slot footer - 底部操作区\n * @csspart base - 卡片容器\n * @csspart header - 头部\n * @csspart title - 标题\n * @csspart subtitle - 副标题\n * @csspart actions - 头部操作区\n * @csspart body - 内容区\n * @csspart footer - 底部\n */\nexport class wcCard extends LitElement {\n static styles = [baseStyles, cardStyles];\n\n /** 卡片标题 */\n @property() title = '';\n\n /** 副标题(title 右侧小字) */\n @property() subtitle = '';\n\n /** 显示边框 */\n @property({ type: Boolean, reflect: true }) bordered = true;\n\n /** 悬浮时展示阴影 */\n @property({ type: Boolean, reflect: true }) hoverable = false;\n\n @state() private hasHeaderSlot = false;\n\n @state() private hasActions = false;\n\n @state() private hasFooter = false;\n\n private onSlotChange(e: Event): void {\n const slot = e.target as HTMLSlotElement;\n const has = slot.assignedElements().length > 0;\n if (slot.name === 'header') this.hasHeaderSlot = has;\n else if (slot.name === 'actions') this.hasActions = has;\n else if (slot.name === 'footer') this.hasFooter = has;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n // 首渲染前的种子状态(slotchange 只在已渲染的 slot 上触发)\n this.hasHeaderSlot = this.querySelector('[slot=\"header\"]') !== null;\n this.hasActions = this.querySelector('[slot=\"actions\"]') !== null;\n this.hasFooter = this.querySelector('[slot=\"footer\"]') !== null;\n }\n\n private renderHeader(): TemplateResult {\n const showHeader = Boolean(\n this.title || this.subtitle || this.hasHeaderSlot || this.hasActions,\n );\n return html`<div class=\"header\" part=\"header\" ?hidden=${!showHeader}>\n <div class=\"titles\" ?hidden=${this.hasHeaderSlot}>\n ${this.title ? html`<div class=\"title\" part=\"title\">${this.title}</div>` : nothing}\n ${\n this.subtitle\n ? html`<div class=\"subtitle\" part=\"subtitle\">${this.subtitle}</div>`\n : nothing\n }\n </div>\n <slot name=\"header\" @slotchange=${this.onSlotChange} ?hidden=${!this.hasHeaderSlot}></slot>\n <div class=\"actions\" part=\"actions\" ?hidden=${!this.hasActions}>\n <slot name=\"actions\" @slotchange=${this.onSlotChange}></slot>\n </div>\n </div>`;\n }\n\n protected override render(): TemplateResult {\n return html`<div class=\"card\" part=\"base\">\n ${this.renderHeader()}\n <div class=\"body\" part=\"body\"><slot></slot></div>\n <div class=\"footer\" part=\"footer\" ?hidden=${!this.hasFooter}>\n <slot name=\"footer\" @slotchange=${this.onSlotChange}></slot>\n </div>\n </div>`;\n }\n}\n\nif (!customElements.get('wc-card')) {\n customElements.define('wc-card', wcCard);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-card': wcCard;\n }\n}\n","import { css } from 'lit';\n\nexport const listStyles = css`\n :host {\n display: block;\n }\n\n /* display:flex/grid 类会覆盖 [hidden] 的 UA 样式,显式关闭 */\n [hidden] {\n display: none !important;\n }\n\n .list {\n margin: 0;\n padding: 0;\n list-style: none;\n color: var(--wc-color-text);\n font-size: var(--wc-font-size-medium);\n }\n\n /* 通过 ::slotted 为 light-DOM 条目提供统一样式 */\n ::slotted(wc-list-item) {\n display: block;\n padding: var(--wc-space-3) var(--wc-space-4);\n }\n\n ::slotted(wc-list-item:not(:last-child)) {\n border-bottom: 1px solid var(--wc-color-border);\n }\n\n :host([striped]) ::slotted(wc-list-item:nth-child(even)) {\n background-color: var(--wc-color-bg-container-secondary);\n }\n\n :host([hoverable]) ::slotted(wc-list-item:hover) {\n background-color: var(--wc-color-bg-hover);\n }\n\n :host([size='small']) ::slotted(wc-list-item) {\n padding: var(--wc-space-2) var(--wc-space-4);\n }\n\n :host([size='large']) ::slotted(wc-list-item) {\n padding: var(--wc-space-4) var(--wc-space-4);\n }\n\n .empty {\n padding: var(--wc-space-2) 0;\n }\n`;\n","import { html, LitElement, type TemplateResult } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport '../empty/wc-empty.js';\nimport { listStyles } from './wc-list.styles';\n\nexport type wcListSize = 'small' | 'medium' | 'large';\n\n/**\n * 列表。子条目用 light-DOM 的 <wc-list-item> 声明,容器通过 ::slotted\n * 提供分隔线 / 斑马纹 / 悬浮反馈;无条目时回退渲染 empty 插槽(默认\n * <wc-empty>)。\n *\n * @example\n * ```html\n * <wc-list striped hoverable>\n * <wc-list-item>条目一</wc-list-item>\n * <wc-list-item>条目二</wc-list-item>\n * </wc-list>\n * ```\n *\n * @slot - 列表条目(wc-list-item)\n * @slot empty - 空状态(默认渲染 wc-empty)\n * @csspart base - 列表容器\n * @csspart empty - 空状态区\n */\nexport class wcList extends LitElement {\n static styles = [baseStyles, listStyles];\n\n /** 条目密度 */\n @property({ reflect: true }) size: wcListSize = 'medium';\n\n /** 斑马纹 */\n @property({ type: Boolean, reflect: true }) striped = false;\n\n /** 条目悬浮高亮 */\n @property({ type: Boolean, reflect: true }) hoverable = false;\n\n @state() private itemCount = 0;\n\n private onSlotChange(e: Event): void {\n const slot = e.target as HTMLSlotElement;\n // 只统计默认插槽;empty 具名插槽的变化不影响条目计数\n if (slot.name !== '') return;\n this.itemCount = slot.assignedElements().length;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n // 首渲染前的种子状态(slotchange 只在已渲染的 slot 上触发)\n this.itemCount = this.querySelectorAll('wc-list-item').length;\n }\n\n protected override render(): TemplateResult {\n // 两个分支恒渲染(hidden 切换),保证 slot 元素始终存在、slotchange 可触发\n return html`\n <ul class=\"list\" part=\"base\" role=\"list\" ?hidden=${this.itemCount === 0}>\n <slot @slotchange=${this.onSlotChange}></slot>\n </ul>\n <div class=\"empty\" part=\"empty\" ?hidden=${this.itemCount > 0}>\n <slot name=\"empty\" @slotchange=${this.onSlotChange}><wc-empty></wc-empty></slot>\n </div>\n `;\n }\n}\n\nif (!customElements.get('wc-list')) {\n customElements.define('wc-list', wcList);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-list': wcList;\n }\n}\n","import { html, LitElement, type TemplateResult } from 'lit';\nimport { baseStyles } from '../../styles/base.css';\n\n/**\n * 列表条目。内容直接放在 light-DOM 中,样式(内边距 / 分隔线 / 斑马纹 /\n * 悬浮反馈)由父级 wc-list 通过 ::slotted 统一提供,条目自身仅负责分发内容。\n *\n * @slot - 条目内容(任意元素)\n */\nexport class wcListItem extends LitElement {\n static styles = [baseStyles];\n\n protected override render(): TemplateResult {\n return html`<slot></slot>`;\n }\n}\n\nif (!customElements.get('wc-list-item')) {\n customElements.define('wc-list-item', wcListItem);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-list-item': wcListItem;\n }\n}\n","import { css } from 'lit';\n\nexport const tableStyles = css`\n :host {\n display: block;\n }\n\n [hidden] {\n display: none !important;\n }\n\n .wrapper {\n position: relative;\n color: var(--wc-color-text);\n font-size: var(--wc-font-size-medium);\n }\n\n table {\n width: 100%;\n border-collapse: collapse;\n text-align: left;\n }\n\n th,\n td {\n padding: var(--wc-space-3) var(--wc-space-3);\n border-bottom: 1px solid var(--wc-color-border);\n font-weight: normal;\n }\n\n th {\n color: var(--wc-color-text-secondary);\n font-weight: var(--wc-font-weight-medium);\n background-color: var(--wc-color-bg-container-secondary);\n white-space: nowrap;\n user-select: none;\n }\n\n :host([bordered]) th,\n :host([bordered]) td {\n border: 1px solid var(--wc-color-border);\n }\n\n :host([size='small']) th,\n :host([size='small']) td {\n padding: var(--wc-space-2) var(--wc-space-2);\n }\n\n :host([size='large']) th,\n :host([size='large']) td {\n padding: var(--wc-space-4) var(--wc-space-3);\n }\n\n :host([striped]) tbody tr:nth-child(even) td {\n background-color: var(--wc-color-bg-container-secondary);\n }\n\n tbody tr {\n transition: background-color var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n tbody tr:hover td {\n background-color: var(--wc-color-bg-hover);\n }\n\n :host([striped]) tbody tr:nth-child(even):hover td {\n background-color: var(--wc-color-bg-hover);\n }\n\n th.sortable {\n cursor: pointer;\n }\n\n th.sortable:hover {\n color: var(--wc-color-primary);\n }\n\n th.sorted {\n color: var(--wc-color-primary);\n }\n\n .th-inner {\n display: inline-flex;\n align-items: center;\n gap: var(--wc-space-1);\n }\n\n .sort {\n display: inline-flex;\n flex-direction: column;\n gap: 0;\n color: var(--wc-color-text-placeholder);\n }\n\n .sort wc-icon {\n display: block;\n height: 0.5em;\n pointer-events: none;\n }\n\n .sort wc-icon.active {\n color: var(--wc-color-primary);\n }\n\n td[ellipsis] {\n max-width: 0;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n .align-left {\n text-align: left;\n }\n\n .align-right {\n text-align: right;\n }\n\n .align-center {\n text-align: center;\n }\n\n .empty {\n padding: var(--wc-space-4) 0;\n }\n\n .loading {\n position: absolute;\n inset: 0;\n z-index: var(--wc-z-index-popover, 1);\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--wc-color-primary);\n /* 随容器底色自适应明暗主题 */\n background-color: color-mix(in srgb, var(--wc-color-bg-container) 70%, transparent);\n }\n`;\n","import { html, LitElement, nothing, type TemplateResult } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport '../empty/wc-empty.js';\nimport '../icon/wc-icon.js';\nimport { tableStyles } from './wc-table.styles';\n\nexport type wcTableAlign = 'left' | 'right' | 'center';\nexport type wcTableSize = 'small' | 'medium' | 'large';\nexport type wcSortOrder = 'asc' | 'desc' | null;\n\nexport interface wcTableColumn {\n /** 对应 data 行的字段名 */\n key: string;\n /** 表头标题 */\n title: string;\n /** 列宽(px 数值或任意 CSS 宽度) */\n width?: number | string;\n /** 单元格对齐(默认左对齐) */\n align?: wcTableAlign;\n /** 是否可点击排序(升 → 降 → 取消循环) */\n sortable?: boolean;\n /** 超宽省略(title 提示完整内容) */\n ellipsis?: boolean;\n /** 自定义单元格渲染(返回模板或文本) */\n render?: (row: wcTableRow, index: number) => TemplateResult | string | number;\n}\n\nexport type wcTableRow = Record<string, unknown>;\n\n/**\n * 表格。columns + data 驱动的纯展示表格:可排序列点击循环升/降/取消\n * (派发 wc-sort),行点击派发 wc-row-click;空数据回退 wc-empty\n * (empty 插槽可覆盖),loading 属性叠加加载遮罩。\n *\n * @example\n * ```html\n * <wc-table id=\"demo\"></wc-table>\n * <script>\n * demo.columns = [\n * { key: 'name', title: '姓名', sortable: true },\n * { key: 'age', title: '年龄', align: 'right', width: 100 },\n * ];\n * demo.data = [{ name: '张三', age: 18 }];\n * </script>\n * ```\n *\n * @slot empty - 空状态(默认渲染 wc-empty)\n * @csspart wrapper - 外层容器(loading 遮罩的定位父级)\n * @csspart table - table 元素\n * @csspart head - thead\n * @csspart body - tbody\n * @csspart sort - 排序图标区\n * @csspart empty - 空状态区\n * @csspart loading - 加载遮罩\n * @fires wc-sort - 点击可排序列头后派发(detail: { key, order })\n * @fires wc-row-click - 点击数据行后派发(detail: { row, index })\n */\nexport class wcTable extends LitElement {\n static styles = [baseStyles, tableStyles];\n\n /** 列配置 */\n @property({ type: Array }) columns: wcTableColumn[] = [];\n\n /** 行数据 */\n @property({ type: Array }) data: wcTableRow[] = [];\n\n /** 斑马纹 */\n @property({ type: Boolean, reflect: true }) striped = false;\n\n /** 全边框 */\n @property({ type: Boolean, reflect: true }) bordered = false;\n\n /** 密度 */\n @property({ reflect: true }) size: wcTableSize = 'medium';\n\n /** 加载中(叠加遮罩) */\n @property({ type: Boolean, reflect: true }) loading = false;\n\n @state() private sortKey = '';\n\n @state() private sortOrder: wcSortOrder = null;\n\n private onSlotChange = (): void => this.requestUpdate();\n\n /** 排序后的展示数据 */\n private get displayData(): wcTableRow[] {\n if (!this.sortKey || !this.sortOrder) return this.data;\n const dir = this.sortOrder === 'asc' ? 1 : -1;\n return [...this.data].sort((a, b) => {\n const va = a[this.sortKey];\n const vb = b[this.sortKey];\n // 空值恒排末尾\n if (va == null) return 1;\n if (vb == null) return -1;\n if (typeof va === 'number' && typeof vb === 'number') return (va - vb) * dir;\n return String(va).localeCompare(String(vb), 'zh-CN') * dir;\n });\n }\n\n private onHeaderClick(col: wcTableColumn): void {\n if (!col.sortable) return;\n const cycle: Record<string, wcSortOrder> = { '': 'asc', asc: 'desc', desc: null };\n this.sortOrder = this.sortKey === col.key ? (cycle[this.sortOrder ?? ''] ?? null) : 'asc';\n this.sortKey = this.sortOrder === null ? '' : col.key;\n this.dispatchEvent(\n new CustomEvent('wc-sort', {\n detail: { key: this.sortKey, order: this.sortOrder },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private cellContent(col: wcTableColumn, row: wcTableRow, index: number): TemplateResult | string {\n const rendered = col.render?.(row, index);\n if (rendered != null && rendered !== '') {\n return typeof rendered === 'object' ? rendered : String(rendered);\n }\n const value = row[col.key];\n return value == null ? '' : String(value);\n }\n\n private renderHead(): TemplateResult {\n return html`<thead part=\"head\">\n <tr>\n ${this.columns.map((col) => {\n const isSorted = this.sortKey === col.key && this.sortOrder !== null;\n return html`<th\n part=\"th\"\n scope=\"col\"\n style=${\n col.width != null\n ? `width: ${typeof col.width === 'number' ? `${col.width}px` : col.width}`\n : nothing\n }\n class=${\n [\n col.align ? `align-${col.align}` : '',\n col.sortable ? 'sortable' : '',\n isSorted ? 'sorted' : '',\n ].join(' ') || nothing\n }\n aria-sort=${\n isSorted ? (this.sortOrder === 'asc' ? 'ascending' : 'descending') : nothing\n }\n @click=${() => this.onHeaderClick(col)}\n >\n <div class=\"th-inner\">\n ${col.title}\n ${\n col.sortable\n ? html`<span class=\"sort\" part=\"sort\">\n <wc-icon\n class=${this.sortKey === col.key && this.sortOrder === 'asc' ? 'active' : ''}\n name=\"chevron-up\"\n ></wc-icon>\n <wc-icon\n class=${this.sortKey === col.key && this.sortOrder === 'desc' ? 'active' : ''}\n name=\"chevron-down\"\n ></wc-icon>\n </span>`\n : nothing\n }\n </div>\n </th>`;\n })}\n </tr>\n </thead>`;\n }\n\n protected override render(): TemplateResult {\n const hasData = this.data.length > 0;\n return html`<div class=\"wrapper\" part=\"wrapper\">\n <table part=\"table\">\n ${this.renderHead()}\n <tbody part=\"body\" ?hidden=${!hasData}>\n ${this.displayData.map(\n (row, index) => html`<tr\n part=\"row\"\n @click=${() =>\n this.dispatchEvent(\n new CustomEvent('wc-row-click', {\n detail: { row, index },\n bubbles: true,\n composed: true,\n }),\n )}\n >\n ${this.columns.map(\n (col) => html`<td\n part=\"td\"\n class=${col.align ? `align-${col.align}` : nothing}\n ?ellipsis=${col.ellipsis === true}\n title=${col.ellipsis ? String(row[col.key] ?? '') : nothing}\n >\n ${this.cellContent(col, row, index)}\n </td>`,\n )}\n </tr>`,\n )}\n </tbody>\n </table>\n <div class=\"empty\" part=\"empty\" ?hidden=${hasData}>\n <slot name=\"empty\" @slotchange=${this.onSlotChange}><wc-empty></wc-empty></slot>\n </div>\n ${\n this.loading\n ? html`<div class=\"loading\" part=\"loading\">\n <wc-icon name=\"loader\" spin label=\"加载中\"></wc-icon>\n </div>`\n : nothing\n }\n </div>`;\n }\n}\n\nif (!customElements.get('wc-table')) {\n customElements.define('wc-table', wcTable);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-table': wcTable;\n }\n}\n","import { css } from 'lit';\n\nexport const imageStyles = css`\n :host {\n --wc-image-bg: var(--wc-color-bg-container-secondary);\n --wc-image-radius: var(--wc-radius-medium);\n --wc-image-mask-bg: rgb(0 0 0 / 75%);\n --wc-image-tool-bg: rgb(255 255 255 / 16%);\n --wc-image-tool-bg-hover: rgb(255 255 255 / 28%);\n --wc-image-tool-color: #fff;\n display: inline-block;\n vertical-align: middle;\n }\n\n .frame {\n position: relative;\n width: var(--wc-image-width, 240px);\n height: var(--wc-image-height, 160px);\n overflow: hidden;\n background: var(--wc-image-bg);\n }\n\n :host([shape='rounded']) .frame {\n border-radius: var(--wc-image-radius);\n }\n\n :host([shape='circle']) .frame {\n border-radius: 50%;\n }\n\n .frame img {\n display: block;\n width: 100%;\n height: 100%;\n }\n\n /* 点击触发层:仅在开启预览且加载成功时出现 */\n .trigger {\n position: absolute;\n inset: 0;\n z-index: 1;\n cursor: zoom-in;\n }\n\n .trigger:focus-visible {\n outline: 2px solid var(--wc-color-primary);\n outline-offset: -2px;\n }\n\n /* 加载中 / 失败占位层 */\n .layer {\n position: absolute;\n inset: 0;\n z-index: 0;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--wc-space-2);\n color: var(--wc-color-text-placeholder);\n font-size: var(--wc-font-size-small);\n }\n\n /* 大图预览浮层 */\n .overlay {\n position: fixed;\n inset: 0;\n z-index: var(--wc-z-index-modal);\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--wc-image-mask-bg);\n animation: wc-image-fade var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .stage {\n display: flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n cursor: grab;\n }\n\n .stage.dragging {\n cursor: grabbing;\n }\n\n .stage img {\n max-width: 90vw;\n max-height: 90vh;\n user-select: none;\n transition: transform var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .stage.dragging img {\n transition: none;\n }\n\n .toolbar {\n position: absolute;\n left: 50%;\n bottom: var(--wc-space-6);\n transform: translateX(-50%);\n display: flex;\n align-items: center;\n gap: var(--wc-space-1);\n padding: var(--wc-space-2) var(--wc-space-3);\n background: var(--wc-image-tool-bg);\n border-radius: var(--wc-radius-circle);\n backdrop-filter: blur(4px);\n }\n\n .toolbar button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n border: none;\n border-radius: 50%;\n background: transparent;\n color: var(--wc-image-tool-color);\n font-size: var(--wc-font-size-small);\n cursor: pointer;\n transition: background var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .toolbar button:hover {\n background: var(--wc-image-tool-bg-hover);\n }\n\n @keyframes wc-image-fade {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { OverlaySideEffects } from '../../common/overlay-side-effects';\nimport { LocalizeController } from '../../i18n/localize-controller';\nimport '../icon/wc-icon.js';\nimport { imageStyles } from './wc-image.styles';\n\nexport type wcImageStatus = 'loading' | 'loaded' | 'error';\nexport type wcImageFit = 'contain' | 'cover' | 'fill' | 'none' | 'scale-down';\nexport type wcImageShape = 'square' | 'rounded' | 'circle';\n\n/** 缩放范围与步长 */\nconst SCALE_MIN = 0.25;\nconst SCALE_MAX = 5;\nconst SCALE_STEP = 0.25;\n\n/**\n * 图片。支持加载/失败占位、fallback 替代图、懒加载与全屏大图预览(缩放/旋转/拖拽平移)。\n * 组件默认尺寸 240x160,可通过 CSS 设置宿主尺寸或覆写 --wc-image-width/height。\n *\n * @slot - 无(预留)\n * @csspart base - 图片容器\n * @csspart image - 实际图片\n * @csspart overlay - 预览遮罩层\n * @csspart preview-image - 预览大图\n * @csspart toolbar - 预览工具栏\n * @cssprop --wc-image-width - 图片宽度(默认 240px)\n * @cssprop --wc-image-height - 图片高度(默认 160px)\n * @cssprop --wc-image-bg - 加载中/失败占位背景\n * @cssprop --wc-image-mask-bg - 预览遮罩背景色\n * @fires wc-load - 图片加载成功时触发\n * @fires wc-error - 图片加载失败时触发\n * @fires wc-preview-open - 打开预览后触发\n * @fires wc-preview-close - 请求关闭预览时触发(可取消,detail.reason 标识来源)\n */\nexport class wcImage extends LitElement {\n static styles = [baseStyles, imageStyles];\n\n /** 图片地址 */\n @property() src = '';\n\n /** 原生 alt 描述 */\n @property() alt = '';\n\n /** 填充模式(同 object-fit) */\n @property() fit: wcImageFit = 'fill';\n\n /** 图片位置(同 object-position) */\n @property() position = 'center';\n\n /** 圆角形状 */\n @property({ reflect: true }) shape: wcImageShape = 'square';\n\n /** 懒加载:滚动进入视口后再发起请求 */\n @property({ type: Boolean }) lazy = false;\n\n /** 点击图片打开全屏预览 */\n @property({ type: Boolean, reflect: true }) preview = false;\n\n /** 预览大图地址(默认取 src) */\n @property({ attribute: 'preview-src' }) previewSrc = '';\n\n /** 加载失败时的替代图片地址 */\n @property() fallback = '';\n\n @state() private status: wcImageStatus = 'loading';\n\n /** 懒加载是否已触发(触发后才真正渲染 img) */\n @state() private shouldLoad = false;\n\n @state() private fallbackFailed = false;\n\n @state() private previewOpen = false;\n\n @state() private scale = 1;\n\n @state() private rotate = 0;\n\n @state() private x = 0;\n\n @state() private y = 0;\n\n @state() private dragging = false;\n\n private localize = new LocalizeController(this);\n\n /** 预览副作用:Escape 关闭 / 焦点陷阱 / 滚动锁(与 Dialog 共用) */\n private overlay = new OverlaySideEffects(this, {\n requestClose: () => this.requestClosePreview('escape'),\n });\n\n private io: IntersectionObserver | null = null;\n\n private dragStartX = 0;\n\n private dragStartY = 0;\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (this.lazy && typeof IntersectionObserver !== 'undefined') {\n this.io = new IntersectionObserver((entries) => {\n if (entries.some((e) => e.isIntersecting)) {\n this.startLoad();\n this.io?.disconnect();\n }\n });\n this.io.observe(this);\n } else {\n this.startLoad();\n }\n if (this.previewOpen) this.overlay.bind();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.io?.disconnect();\n this.overlay.unbind();\n }\n\n protected override willUpdate(changed: Map<string, unknown>): void {\n super.willUpdate(changed);\n // src 变更后重新走加载流程(须在 render 前重置状态)\n if (changed.has('src')) {\n this.status = 'loading';\n this.fallbackFailed = false;\n }\n }\n\n protected override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (changed.has('previewOpen')) {\n if (this.previewOpen) {\n this.dispatchEvent(new CustomEvent('wc-preview-open', { bubbles: true, composed: true }));\n this.overlay.bind();\n } else {\n this.overlay.unbind();\n }\n }\n }\n\n private startLoad(): void {\n if (this.shouldLoad) return;\n this.shouldLoad = true;\n }\n\n private onImgLoad(): void {\n this.status = 'loaded';\n this.dispatchEvent(\n new CustomEvent('wc-load', { detail: { src: this.src }, bubbles: true, composed: true }),\n );\n }\n\n private onImgError(): void {\n this.status = 'error';\n this.dispatchEvent(\n new CustomEvent('wc-error', { detail: { src: this.src }, bubbles: true, composed: true }),\n );\n }\n\n /** 打开全屏预览(需开启 preview 且加载成功) */\n openPreview(): void {\n if (!this.preview || this.status !== 'loaded') return;\n this.resetTransform();\n this.previewOpen = true;\n }\n\n /** 请求关闭预览(发出可取消的 wc-preview-close) */\n requestClosePreview(reason: 'overlay' | 'escape' | 'close-btn' | 'api' = 'api'): void {\n if (!this.previewOpen) return;\n const accepted = this.dispatchEvent(\n new CustomEvent('wc-preview-close', {\n detail: { reason },\n bubbles: true,\n composed: true,\n cancelable: true,\n }),\n );\n if (accepted) this.previewOpen = false;\n }\n\n private zoomBy(delta: number): void {\n const next = Math.round((this.scale + delta) * 100) / 100;\n this.scale = Math.min(SCALE_MAX, Math.max(SCALE_MIN, next));\n }\n\n private rotateBy(): void {\n this.rotate = (this.rotate + 90) % 360;\n }\n\n private resetTransform(): void {\n this.scale = 1;\n this.rotate = 0;\n this.x = 0;\n this.y = 0;\n }\n\n private onOverlayWheel(e: WheelEvent): void {\n e.preventDefault();\n this.zoomBy(e.deltaY < 0 ? SCALE_STEP : -SCALE_STEP);\n }\n\n private onStagePointerDown(e: PointerEvent): void {\n if (e.button !== 0) return;\n this.dragging = true;\n this.dragStartX = e.clientX - this.x;\n this.dragStartY = e.clientY - this.y;\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n }\n\n private onStagePointerMove(e: PointerEvent): void {\n if (!this.dragging) return;\n this.x = e.clientX - this.dragStartX;\n this.y = e.clientY - this.dragStartY;\n }\n\n private onStagePointerUp(): void {\n this.dragging = false;\n }\n\n private onTriggerKeydown(e: KeyboardEvent): void {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n this.openPreview();\n }\n }\n\n private imgStyle(): string {\n return `object-fit:${this.fit};object-position:${this.position}`;\n }\n\n private previewStyle(): string {\n return `transform:translate(${this.x}px, ${this.y}px) scale(${this.scale}) rotate(${this.rotate}deg)`;\n }\n\n render() {\n const effectivePreviewSrc = this.previewSrc || this.src;\n return html`\n <div class=\"frame\" part=\"base\">\n ${\n this.shouldLoad && this.status !== 'error'\n ? html`<img\n part=\"image\"\n src=${this.src}\n alt=${this.alt}\n style=${this.imgStyle()}\n @load=${this.onImgLoad}\n @error=${this.onImgError}\n />`\n : ''\n }\n ${\n this.status === 'error' && this.fallback && !this.fallbackFailed\n ? html`<img\n part=\"image\"\n src=${this.fallback}\n alt=${this.alt}\n style=${this.imgStyle()}\n @error=${() => (this.fallbackFailed = true)}\n />`\n : ''\n }\n ${\n this.status === 'loading'\n ? html`<div class=\"layer\">\n <wc-icon name=\"loader\" spin></wc-icon>\n </div>`\n : ''\n }\n ${\n this.status === 'error' && (!this.fallback || this.fallbackFailed)\n ? html`<div class=\"layer\">\n <wc-icon name=\"image-off\"></wc-icon>\n <span>${this.localize.term('image.loadError')}</span>\n </div>`\n : ''\n }\n ${\n this.preview && this.status === 'loaded'\n ? html`<div\n class=\"trigger\"\n role=\"button\"\n tabindex=\"0\"\n aria-label=${this.localize.term('image.preview')}\n @click=${() => this.openPreview()}\n @keydown=${this.onTriggerKeydown}\n ></div>`\n : ''\n }\n </div>\n ${\n this.previewOpen\n ? html`<div\n class=\"overlay\"\n part=\"overlay\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=${this.localize.term('image.preview')}\n tabindex=\"-1\"\n @wheel=${this.onOverlayWheel}\n @click=${(e: MouseEvent) => {\n if (e.target === e.currentTarget) this.requestClosePreview('overlay');\n }}\n >\n <div\n class=\"stage ${this.dragging ? 'dragging' : ''}\"\n @pointerdown=${this.onStagePointerDown}\n @pointermove=${this.onStagePointerMove}\n @pointerup=${this.onStagePointerUp}\n @pointercancel=${this.onStagePointerUp}\n >\n <img\n part=\"preview-image\"\n src=${effectivePreviewSrc}\n alt=${this.alt}\n draggable=\"false\"\n style=${this.previewStyle()}\n />\n </div>\n <div class=\"toolbar\" part=\"toolbar\">\n <button\n type=\"button\"\n aria-label=${this.localize.term('image.zoomIn')}\n @click=${() => this.zoomBy(SCALE_STEP)}\n >\n <wc-icon name=\"zoom-in\"></wc-icon>\n </button>\n <button\n type=\"button\"\n aria-label=${this.localize.term('image.zoomOut')}\n @click=${() => this.zoomBy(-SCALE_STEP)}\n >\n <wc-icon name=\"zoom-out\"></wc-icon>\n </button>\n <button\n type=\"button\"\n aria-label=${this.localize.term('image.rotate')}\n @click=${() => this.rotateBy()}\n >\n <wc-icon name=\"rotate-cw\"></wc-icon>\n </button>\n <button\n type=\"button\"\n aria-label=${this.localize.term('image.reset')}\n title=${this.localize.term('image.reset')}\n @click=${() => this.resetTransform()}\n >\n 1:1\n </button>\n <button\n type=\"button\"\n part=\"close-button\"\n aria-label=${this.localize.term('image.close')}\n @click=${() => this.requestClosePreview('close-btn')}\n >\n <wc-icon name=\"close\"></wc-icon>\n </button>\n </div>\n </div>`\n : ''\n }\n `;\n }\n}\n\nif (!customElements.get('wc-image')) {\n customElements.define('wc-image', wcImage);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-image': wcImage;\n }\n}\n","import { css } from 'lit';\n\nexport const uploadStyles = css`\n :host {\n display: block;\n\n /* component 层令牌 */\n --wc-upload-font-size: var(--wc-font-size-medium);\n --wc-upload-radius: var(--wc-radius-medium);\n --wc-upload-dragger-bg: var(--wc-color-bg-container);\n }\n\n .hidden-input {\n display: none;\n }\n\n /* ---- 默认触发按钮 ---- */\n .trigger-wrap {\n display: flex;\n align-items: center;\n gap: var(--wc-space-2);\n }\n\n .trigger {\n display: inline-flex;\n align-items: center;\n gap: var(--wc-space-1);\n height: 32px;\n padding: 0 var(--wc-space-3);\n font-family: inherit;\n font-size: var(--wc-upload-font-size);\n color: var(--wc-color-text);\n background-color: var(--wc-color-bg-container);\n border: 1px solid var(--wc-color-border);\n border-radius: var(--wc-upload-radius);\n cursor: pointer;\n user-select: none;\n transition:\n border-color var(--wc-duration-fast) var(--wc-easing-standard),\n color var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .trigger:hover:not(:disabled) {\n border-color: var(--wc-color-primary);\n color: var(--wc-color-primary);\n }\n\n .trigger:disabled {\n background-color: var(--wc-color-bg-disabled);\n border-color: transparent;\n color: var(--wc-color-text-disabled);\n cursor: not-allowed;\n }\n\n /* ---- 拖拽区域 ---- */\n .dragger {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: var(--wc-space-6) var(--wc-space-4);\n background-color: var(--wc-upload-dragger-bg);\n border: 1px dashed var(--wc-color-border);\n border-radius: var(--wc-upload-radius);\n cursor: pointer;\n user-select: none;\n text-align: center;\n transition:\n border-color var(--wc-duration-fast) var(--wc-easing-standard),\n background-color var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .dragger:hover:not([aria-disabled='true']),\n .dragger.drag-over {\n border-color: var(--wc-color-primary);\n background-color: var(--wc-color-bg-hover);\n }\n\n .dragger[aria-disabled='true'] {\n cursor: not-allowed;\n color: var(--wc-color-text-disabled);\n }\n\n .dragger-icon {\n font-size: 28px;\n color: var(--wc-color-text-placeholder);\n }\n\n .dragger:hover:not([aria-disabled='true']) .dragger-icon,\n .dragger.drag-over .dragger-icon {\n color: var(--wc-color-primary);\n }\n\n .dragger-text {\n margin-top: var(--wc-space-2);\n font-size: var(--wc-upload-font-size);\n color: var(--wc-color-text);\n }\n\n /* ---- 提示文字(tip 插槽) ---- */\n .tip {\n display: inline-block;\n margin-top: var(--wc-space-1);\n font-size: var(--wc-font-size-small);\n color: var(--wc-color-text-placeholder);\n }\n\n .tip:empty {\n display: none;\n }\n\n /* ---- 文件列表 ---- */\n .list {\n margin: var(--wc-space-2) 0 0;\n padding: 0;\n list-style: none;\n }\n\n .item {\n padding: var(--wc-space-1) var(--wc-space-2);\n border-radius: var(--wc-radius-small);\n transition: background-color var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .item:hover {\n background-color: var(--wc-color-bg-hover);\n }\n\n .row {\n display: flex;\n align-items: center;\n gap: var(--wc-space-2);\n min-height: 24px;\n }\n\n .type-icon {\n font-size: 16px;\n color: var(--wc-color-text-placeholder);\n flex-shrink: 0;\n }\n\n .item.success .type-icon {\n color: var(--wc-color-success);\n }\n\n .item.error .type-icon {\n color: var(--wc-color-error);\n }\n\n .name {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--wc-upload-font-size);\n color: var(--wc-color-text);\n }\n\n .name.link {\n color: var(--wc-color-primary);\n cursor: pointer;\n }\n\n .name.link:hover {\n text-decoration: underline;\n }\n\n .size,\n .percent,\n .fail-text {\n flex-shrink: 0;\n font-size: var(--wc-font-size-small);\n color: var(--wc-color-text-placeholder);\n }\n\n .fail-text {\n color: var(--wc-color-error);\n }\n\n .status-icon {\n font-size: 16px;\n flex-shrink: 0;\n }\n\n .status-icon.success {\n color: var(--wc-color-success);\n }\n\n .status-icon.error {\n color: var(--wc-color-error);\n }\n\n .status-icon.waiting {\n color: var(--wc-color-text-placeholder);\n }\n\n .icon-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n background: transparent;\n border: none;\n cursor: pointer;\n }\n\n .remove {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n padding: 0;\n background: transparent;\n border: none;\n border-radius: var(--wc-radius-circle);\n color: var(--wc-color-text-placeholder);\n cursor: pointer;\n flex-shrink: 0;\n }\n\n /* wc-icon 的 :host 自带 text 色,这里让叉号跟随按钮的灰阶 */\n .remove wc-icon {\n color: inherit;\n }\n\n .remove:hover {\n color: var(--wc-color-text-secondary);\n }\n\n .bar {\n margin: var(--wc-space-1) 0 0 var(--wc-space-6);\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { LocalizeController } from '../../i18n/localize-controller';\nimport '../icon/wc-icon.js';\nimport '../progress/wc-progress.js';\nimport { uploadStyles } from './wc-upload.styles';\n\nexport type wcUploadFileStatus = 'waiting' | 'uploading' | 'success' | 'error';\n\n/** 文件条目:选择/拖拽加入的文件与上传状态 */\nexport interface wcUploadFile {\n /** 唯一标识,由组件生成(列表以引用不可变方式更新,回调需按 uid 定位) */\n uid: string;\n /** 原始 File 对象(选择/拖拽进来时存在) */\n raw?: File;\n /** 文件名 */\n name: string;\n /** 文件大小(字节) */\n size?: number;\n /** 上传进度 0-100 */\n percent?: number;\n /** 上传状态 */\n status: wcUploadFileStatus;\n /** 文件访问地址(成功响应含 url 字段时自动提取,也可手动赋值;有点击预览) */\n url?: string;\n /** 服务端响应内容 */\n response?: unknown;\n}\n\n/** 自定义上传方法:通过回调驱动进度/成功/失败 */\nexport type wcUploadRequestMethod = (\n file: wcUploadFile,\n options: {\n onProgress: (percent: number) => void;\n onSuccess: (response?: unknown) => void;\n onError: (message?: string) => void;\n },\n) => void;\n\n/**\n * 上传。支持点击/拖拽选择文件、max 数量限制、进度展示(内嵌 wc-progress)、\n * 失败重试与文件列表管理;通过 action(XHR POST FormData)或 requestMethod(自定义上传)实现上传。\n *\n * @slot tip - 提示说明,显示在触发区下方\n * @csspart base - 外层容器\n * @csspart trigger - 默认触发按钮(非拖拽模式)\n * @csspart dragger - 拖拽区域(draggable 模式)\n * @csspart list - 文件列表\n * @csspart item - 文件条目\n * @cssprop --wc-upload-radius - 触发区/拖拽区圆角(默认 --wc-radius-medium)\n * @cssprop --wc-upload-dragger-bg - 拖拽区背景色\n * @fires wc-select - 选择/拖入文件后触发,detail.files 为原始 File 数组\n * @fires wc-change - 文件列表变化时触发,detail.files 为当前列表\n * @fires wc-progress - 上传进度变化时触发,detail: { file, percent }\n * @fires wc-success - 单个文件上传成功时触发,detail: { file, response }\n * @fires wc-error - 单个文件上传失败时触发,detail: { file, message }\n * @fires wc-remove - 移除文件时触发(可取消,detail: { file, index })\n * @fires wc-exceed - 超出 max 数量限制时触发,detail: { files, max }\n * @fires wc-preview - 点击带 url 的文件名时触发,detail.file\n */\nexport class wcUpload extends LitElement {\n static styles = [baseStyles, uploadStyles];\n\n /** 上传地址(设置后以内置 XHR 上传,POST FormData,字段名取 name) */\n @property() action = '';\n\n /** FormData 字段名 */\n @property() name = 'file';\n\n /** 接受的文件类型(原生 accept) */\n @property() accept = '';\n\n /** 是否支持多选 */\n @property({ type: Boolean }) multiple = false;\n\n /** 最大文件数量,0 表示不限制 */\n @property({ type: Number }) max = 0;\n\n /** 拖拽上传模式:渲染大面积拖拽区域 */\n @property({ type: Boolean, reflect: true }) draggable = false;\n\n /** 选择文件后自动开始上传;设为 false 时通过 submit() 手动触发 */\n @property({\n type: Boolean,\n reflect: true,\n attribute: 'auto-upload',\n converter: (value) => (value == null ? true : value !== 'false'),\n })\n autoUpload = true;\n\n /** 是否禁用 */\n @property({ type: Boolean, reflect: true }) disabled = false;\n\n /** 自定义上传方法(属性型,仅 JS 赋值;设置后优先于 action) */\n @property({ attribute: false })\n requestMethod: wcUploadRequestMethod | null = null;\n\n /** 当前文件列表(组件内部维护,可读取用于回显/提交) */\n @state() files: wcUploadFile[] = [];\n\n @state() private dragOver = false;\n\n private localize = new LocalizeController(this);\n\n /** 进行中的 XHR(按文件 uid 键控),用于移除文件时中断 */\n private xhrMap = new Map<string, XMLHttpRequest>();\n\n private uidCounter = 0;\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n for (const xhr of this.xhrMap.values()) xhr.abort();\n this.xhrMap.clear();\n }\n\n /* ---------- 公开方法 ---------- */\n\n /** 手动上传全部 waiting 状态的文件(autoUpload=false 时使用) */\n submit(): void {\n for (const file of this.files) {\n if (file.status === 'waiting') this.startUpload(file);\n }\n }\n\n /** 清空文件列表并中断进行中的上传 */\n clearFiles(): void {\n for (const xhr of this.xhrMap.values()) xhr.abort();\n this.xhrMap.clear();\n if (!this.files.length) return;\n this.files = [];\n this.emitChange();\n }\n\n private nextUid(): string {\n this.uidCounter += 1;\n return `wc-upload-file-${this.uidCounter}`;\n }\n\n /* ---------- 选择与拖拽 ---------- */\n\n private pick(): void {\n if (this.disabled) return;\n const input = this.shadowRoot?.querySelector<HTMLInputElement>('input[type=\"file\"]');\n input?.click();\n }\n\n private onInputChange(e: Event): void {\n const input = e.target as HTMLInputElement;\n if (input.files?.length) this.addFiles(input.files);\n input.value = '';\n }\n\n private onDragOver(e: DragEvent): void {\n e.preventDefault();\n if (!this.disabled) this.dragOver = true;\n }\n\n private onDragLeave(): void {\n this.dragOver = false;\n }\n\n private onDrop(e: DragEvent): void {\n e.preventDefault();\n this.dragOver = false;\n if (this.disabled) return;\n if (e.dataTransfer?.files?.length) this.addFiles(e.dataTransfer.files);\n }\n\n private onDraggerKeydown(e: KeyboardEvent): void {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n this.pick();\n }\n }\n\n private addFiles(list: FileList | File[]): void {\n const incoming = Array.from(list);\n if (!incoming.length) return;\n let allowed = incoming;\n if (this.max > 0) {\n const remaining = this.max - this.files.length;\n if (remaining < incoming.length) {\n const rejected = incoming.slice(Math.max(0, remaining));\n this.dispatchEvent(\n new CustomEvent('wc-exceed', {\n detail: { files: rejected, max: this.max },\n bubbles: true,\n composed: true,\n }),\n );\n allowed = incoming.slice(0, Math.max(0, remaining));\n }\n }\n if (!allowed.length) return;\n const items: wcUploadFile[] = allowed.map((raw) => ({\n uid: this.nextUid(),\n raw,\n name: raw.name,\n size: raw.size,\n percent: 0,\n status: 'waiting',\n }));\n this.files = [...this.files, ...items];\n this.dispatchEvent(\n new CustomEvent('wc-select', {\n detail: { files: allowed },\n bubbles: true,\n composed: true,\n }),\n );\n this.emitChange();\n if (this.autoUpload) {\n for (const item of items) this.startUpload(item);\n }\n }\n\n /* ---------- 上传流程 ---------- */\n\n private startUpload(file: wcUploadFile): void {\n if (this.disabled || file.status === 'uploading') return;\n if (!this.action && !this.requestMethod) {\n console.warn('[wc-upload] 未配置 action 或 requestMethod,文件保持待上传状态');\n return;\n }\n this.updateFile(file, { status: 'uploading', percent: 0 });\n if (this.requestMethod) {\n this.requestMethod(file, {\n onProgress: (percent) => this.handleProgress(file, percent),\n onSuccess: (response) => this.handleSuccess(file, response),\n onError: (message) => this.handleError(file, message),\n });\n } else {\n this.uploadWithXhr(file);\n }\n }\n\n private uploadWithXhr(file: wcUploadFile): void {\n const xhr = new XMLHttpRequest();\n this.xhrMap.set(file.uid, xhr);\n const form = new FormData();\n form.append(this.name, file.raw as File);\n xhr.open('POST', this.action);\n xhr.upload.onprogress = (e) => {\n if (e.lengthComputable) this.handleProgress(file, (e.loaded / e.total) * 100);\n };\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n let response: unknown = xhr.responseText;\n try {\n response = JSON.parse(xhr.responseText);\n } catch {\n /* 非 JSON 响应保留原始文本 */\n }\n this.handleSuccess(file, response);\n } else {\n this.handleError(file, `HTTP ${xhr.status}`);\n }\n };\n xhr.onerror = () => this.handleError(file, 'network error');\n xhr.send(form);\n }\n\n private handleProgress(file: wcUploadFile, percent: number): void {\n const clamped = Math.min(100, Math.max(0, Math.round(percent)));\n this.updateFile(file, { percent: clamped });\n this.dispatchEvent(\n new CustomEvent('wc-progress', {\n detail: { file: this.snapshot(file), percent: clamped },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private handleSuccess(file: wcUploadFile, response?: unknown): void {\n this.xhrMap.delete(file.uid);\n // 约定:响应为对象且含 url 字符串字段时自动提取为文件地址\n const url =\n typeof (response as { url?: unknown } | null)?.url === 'string'\n ? (response as { url: string }).url\n : undefined;\n this.updateFile(file, { status: 'success', percent: 100, response, url });\n this.dispatchEvent(\n new CustomEvent('wc-success', {\n detail: { file: this.snapshot(file), response },\n bubbles: true,\n composed: true,\n }),\n );\n this.emitChange();\n }\n\n private handleError(file: wcUploadFile, message?: string): void {\n this.xhrMap.delete(file.uid);\n this.updateFile(file, { status: 'error' });\n this.dispatchEvent(\n new CustomEvent('wc-error', {\n detail: { file: this.snapshot(file), message },\n bubbles: true,\n composed: true,\n }),\n );\n this.emitChange();\n }\n\n /* ---------- 列表操作 ---------- */\n\n private removeFile(index: number): void {\n const file = this.files[index];\n if (!file) return;\n const accepted = this.dispatchEvent(\n new CustomEvent('wc-remove', {\n detail: { file, index },\n bubbles: true,\n composed: true,\n cancelable: true,\n }),\n );\n if (!accepted) return;\n this.xhrMap.get(file.uid)?.abort();\n this.xhrMap.delete(file.uid);\n this.files = this.files.filter((_, i) => i !== index);\n this.emitChange();\n }\n\n private retry(file: wcUploadFile): void {\n if (file.status !== 'error') return;\n this.startUpload(file);\n }\n\n private onNameClick(file: wcUploadFile): void {\n if (!file.url) return;\n this.dispatchEvent(\n new CustomEvent('wc-preview', { detail: { file }, bubbles: true, composed: true }),\n );\n }\n\n private updateFile(file: wcUploadFile, patch: Partial<wcUploadFile>): void {\n this.files = this.files.map((f) => (f.uid === file.uid ? { ...f, ...patch } : f));\n }\n\n private snapshot(file: wcUploadFile): wcUploadFile {\n return this.files.find((f) => f.uid === file.uid) ?? file;\n }\n\n private emitChange(): void {\n this.dispatchEvent(\n new CustomEvent('wc-change', {\n detail: { files: [...this.files] },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private formatSize(size?: number): string {\n if (size == null) return '';\n if (size < 1024) return `${size} B`;\n if (size < 1024 * 1024) return `${(size / 1024).toFixed(1)} KB`;\n return `${(size / 1024 / 1024).toFixed(1)} MB`;\n }\n\n render() {\n return html`\n <div class=\"upload\" part=\"base\">\n <input\n class=\"hidden-input\"\n type=\"file\"\n accept=${this.accept}\n ?multiple=${this.multiple}\n ?disabled=${this.disabled}\n @change=${this.onInputChange}\n />\n ${\n this.draggable\n ? html`<div\n class=\"dragger ${this.dragOver ? 'drag-over' : ''}\"\n part=\"dragger\"\n role=\"button\"\n tabindex=${this.disabled ? -1 : 0}\n aria-disabled=${this.disabled}\n @click=${this.pick}\n @keydown=${this.onDraggerKeydown}\n @dragover=${this.onDragOver}\n @dragleave=${this.onDragLeave}\n @drop=${this.onDrop}\n >\n <wc-icon name=\"upload\" class=\"dragger-icon\"></wc-icon>\n <span class=\"dragger-text\">${this.localize.term('upload.clickOrDrag')}</span>\n <span class=\"tip\"><slot name=\"tip\"></slot></span>\n </div>`\n : html`<div class=\"trigger-wrap\">\n <button\n type=\"button\"\n class=\"trigger\"\n part=\"trigger\"\n ?disabled=${this.disabled}\n @click=${this.pick}\n >\n <wc-icon name=\"upload\"></wc-icon>\n <span>${this.localize.term('upload.upload')}</span>\n </button>\n <span class=\"tip\"><slot name=\"tip\"></slot></span>\n </div>`\n }\n ${\n this.files.length\n ? html`<ul class=\"list\" part=\"list\">\n ${this.files.map(\n (file, index) => html`\n <li class=\"item ${file.status}\" part=\"item\">\n <div class=\"row\">\n <wc-icon name=\"file\" class=\"type-icon\"></wc-icon>\n <span\n class=\"name ${file.url ? 'link' : ''}\"\n title=${file.name}\n role=${file.url ? 'button' : undefined}\n tabindex=${file.url ? 0 : undefined}\n @click=${() => this.onNameClick(file)}\n @keydown=${(e: KeyboardEvent) => {\n if (file.url && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault();\n this.onNameClick(file);\n }\n }}\n >${file.name}</span\n >\n ${\n file.status === 'uploading'\n ? html`<span class=\"percent\">${Math.round(file.percent ?? 0)}%</span>`\n : file.status === 'error'\n ? html`<span class=\"fail-text\"\n >${this.localize.term('upload.failed')}</span\n >`\n : html`<span class=\"size\">${this.formatSize(file.size)}</span>`\n }\n ${\n file.status === 'success'\n ? html`<wc-icon name=\"check\" class=\"status-icon success\"></wc-icon>`\n : file.status === 'error'\n ? html`<button\n type=\"button\"\n class=\"icon-btn\"\n title=${this.localize.term('upload.retry')}\n aria-label=${this.localize.term('upload.retry')}\n @click=${() => this.retry(file)}\n >\n <wc-icon name=\"error\" class=\"status-icon error\"></wc-icon>\n </button>`\n : file.status === 'waiting'\n ? html`<wc-icon\n name=\"loader\"\n spin\n class=\"status-icon waiting\"\n ></wc-icon>`\n : ''\n }\n <button\n type=\"button\"\n class=\"remove\"\n part=\"remove-button\"\n aria-label=${this.localize.term('upload.remove')}\n @click=${() => this.removeFile(index)}\n >\n <wc-icon name=\"close\"></wc-icon>\n </button>\n </div>\n ${\n file.status === 'uploading'\n ? html`<wc-progress\n class=\"bar\"\n value=${file.percent ?? 0}\n stroke-width=\"4\"\n ?show-label=${false}\n ></wc-progress>`\n : ''\n }\n </li>\n `,\n )}\n </ul>`\n : ''\n }\n </div>\n `;\n }\n}\n\nif (!customElements.get('wc-upload')) {\n customElements.define('wc-upload', wcUpload);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-upload': wcUpload;\n }\n}\n","import { createIcon } from './library.js';\n\n/** 向左箭头 */\nexport const arrowLeft = createIcon('arrow-left', '<path d=\"M19 12H5\"/><path d=\"m12 19-7-7 7-7\"/>');\n","import { createIcon } from './library.js';\n\n/** 向右箭头 */\nexport const arrowRight = createIcon(\n 'arrow-right',\n '<path d=\"M5 12h14\"/><path d=\"m12 5 7 7-7 7\"/>',\n);\n","import { createIcon } from './library.js';\n\n/** 日历(日期选择器用) */\nexport const calendar = createIcon(\n 'calendar',\n '<rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"/><path d=\"M16 2v4\"/><path d=\"M8 2v4\"/><path d=\"M3 10h18\"/>',\n);\n","import { createIcon } from './library.js';\n\n/** 对勾 */\nexport const check = createIcon('check', '<polyline points=\"20 6 9 17 4 12\"/>');\n","import { createIcon } from './library.js';\n\n/** 下箭头(下拉展开) */\nexport const chevronDown = createIcon('chevron-down', '<path d=\"m6 9 6 6 6-6\"/>');\n","import { createIcon } from './library.js';\n\n/** 左箭头 */\nexport const chevronLeft = createIcon('chevron-left', '<path d=\"m15 18-6-6 6-6\"/>');\n","import { createIcon } from './library.js';\n\n/** 右箭头 */\nexport const chevronRight = createIcon('chevron-right', '<path d=\"m9 18 6-6-6-6\"/>');\n","import { createIcon } from './library.js';\n\n/** 上箭头(收起) */\nexport const chevronUp = createIcon('chevron-up', '<path d=\"m18 15-6-6-6 6\"/>');\n","import { createIcon } from './library.js';\n\n/** 关闭/叉号 */\nexport const close = createIcon('close', '<path d=\"M18 6 6 18\"/><path d=\"m6 6 12 12\"/>');\n","import { createIcon } from './library.js';\n\n/** 错误圆叉 */\nexport const error = createIcon(\n 'error',\n '<circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\"/><line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\"/>',\n);\n","import { createIcon } from './library.js';\n\nexport const file = createIcon(\n 'file',\n '<path d=\"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\"/><path d=\"M14 2v4a2 2 0 0 0 2 2h4\"/>',\n);\n","import { createIcon } from './library.js';\n\nexport const imageOff = createIcon(\n 'image-off',\n '<path d=\"m2 2 20 20\"/><path d=\"M10.41 10.17a2 2 0 0 1-2.24 2.24\"/><path d=\"M21 15V5a2 2 0 0 0-2-2H7\"/><path d=\"M3.59 3.59A2 2 0 0 0 3 5v14a2 2 0 0 0 2 2h14a2 2 0 0 0 1.41-.59\"/><path d=\"m21 15-5-5L5 21\"/>',\n);\n","import { createIcon } from './library.js';\n\n/** 信息提示 */\nexport const info = createIcon(\n 'info',\n '<circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"/><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"/>',\n);\n","import { createIcon } from './library.js';\n\n/** 加载圈(配合 wc-icon spin 属性旋转) */\nexport const loader = createIcon('loader', '<path d=\"M21 12a9 9 0 1 1-6.219-8.56\"/>');\n","import { createIcon } from './library.js';\n\n/** 减号 */\nexport const minus = createIcon('minus', '<path d=\"M5 12h14\"/>');\n","import { createIcon } from './library.js';\n\n/** 加号 */\nexport const plus = createIcon('plus', '<path d=\"M5 12h14\"/><path d=\"M12 5v14\"/>');\n","import { createIcon } from './library.js';\n\nexport const rotateCw = createIcon(\n 'rotate-cw',\n '<path d=\"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8\"/><path d=\"M21 3v5h-5\"/>',\n);\n","import { createIcon } from './library.js';\n\n/** 搜索/放大镜 */\nexport const search = createIcon(\n 'search',\n '<circle cx=\"11\" cy=\"11\" r=\"8\"/><path d=\"m21 21-4.3-4.3\"/>',\n);\n","import { createIcon } from './library.js';\n\nexport const upload = createIcon(\n 'upload',\n '<path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"/><polyline points=\"17 8 12 3 7 8\"/><line x1=\"12\" x2=\"12\" y1=\"3\" y2=\"15\"/>',\n);\n","import { createIcon } from './library.js';\n\n/** 警告三角 */\nexport const warning = createIcon(\n 'warning',\n '<path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"/><line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"/><line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"/>',\n);\n","import { createIcon } from './library.js';\n\nexport const zoomIn = createIcon(\n 'zoom-in',\n '<circle cx=\"11\" cy=\"11\" r=\"8\"/><path d=\"m21 21-4.35-4.35\"/><path d=\"M11 8v6\"/><path d=\"M8 11h6\"/>',\n);\n","import { createIcon } from './library.js';\n\nexport const zoomOut = createIcon(\n 'zoom-out',\n '<circle cx=\"11\" cy=\"11\" r=\"8\"/><path d=\"m21 21-4.35-4.35\"/><path d=\"M8 11h6\"/>',\n);\n","import { registerIcon } from './library.js';\nimport type { WcIconData } from './library.js';\nimport { arrowLeft } from './arrow-left.js';\nimport { arrowRight } from './arrow-right.js';\nimport { calendar } from './calendar.js';\nimport { check } from './check.js';\nimport { chevronDown } from './chevron-down.js';\nimport { chevronLeft } from './chevron-left.js';\nimport { chevronRight } from './chevron-right.js';\nimport { chevronUp } from './chevron-up.js';\nimport { close } from './close.js';\nimport { error } from './error.js';\nimport { file } from './file.js';\nimport { imageOff } from './image-off.js';\nimport { info } from './info.js';\nimport { loader } from './loader.js';\nimport { minus } from './minus.js';\nimport { plus } from './plus.js';\nimport { rotateCw } from './rotate-cw.js';\nimport { search } from './search.js';\nimport { upload } from './upload.js';\nimport { warning } from './warning.js';\nimport { zoomIn } from './zoom-in.js';\nimport { zoomOut } from './zoom-out.js';\n\nexport type { WcIconData } from './library.js';\nexport * from './library.js';\n\nexport { arrowLeft } from './arrow-left.js';\nexport { arrowRight } from './arrow-right.js';\nexport { calendar } from './calendar.js';\nexport { check } from './check.js';\nexport { chevronDown } from './chevron-down.js';\nexport { chevronLeft } from './chevron-left.js';\nexport { chevronRight } from './chevron-right.js';\nexport { chevronUp } from './chevron-up.js';\nexport { close } from './close.js';\nexport { error } from './error.js';\nexport { file } from './file.js';\nexport { imageOff } from './image-off.js';\nexport { info } from './info.js';\nexport { loader } from './loader.js';\nexport { minus } from './minus.js';\nexport { plus } from './plus.js';\nexport { rotateCw } from './rotate-cw.js';\nexport { search } from './search.js';\nexport { upload } from './upload.js';\nexport { warning } from './warning.js';\nexport { zoomIn } from './zoom-in.js';\nexport { zoomOut } from './zoom-out.js';\n\n/** 全部内置图标,供 registerBuiltinIcons 批量注册 */\nexport const builtinIcons: WcIconData[] = [\n arrowLeft,\n arrowRight,\n calendar,\n check,\n chevronDown,\n chevronLeft,\n chevronRight,\n chevronUp,\n close,\n error,\n file,\n imageOff,\n info,\n loader,\n minus,\n plus,\n rotateCw,\n search,\n upload,\n warning,\n zoomIn,\n zoomOut,\n];\n\n/**\n * 批量注册全部内置图标(22 个)。\n * 应用入口调用一次即可;也可以从各图标文件单独 import + registerIcon 按需注册。\n */\nexport function registerBuiltinIcons(): void {\n for (const icon of builtinIcons) {\n registerIcon(icon.name, icon.svg);\n }\n}\n","/**\n * 主题切换控制:通过 documentElement 上的 data-theme 属性驱动 tokens.css\n * 的 semantic 层覆盖(见 RULES.md 第 5 条)。\n *\n * @example\n * setTheme('dark'); // 手动切暗色\n * setTheme('auto', { persist: true }); // 跟随系统并写入 localStorage\n * initTheme(); // 应用启动时恢复持久化主题\n */\n\nexport type WcTheme = 'light' | 'dark' | 'auto';\n\n/** 主题变更事件名,detail 携带实际生效主题(light | dark) */\nexport const THEME_CHANGE_EVENT = 'wc-theme-change';\n\nconst STORAGE_KEY = 'wc-theme';\n\nlet currentTheme: WcTheme = 'light';\nlet mediaQuery: MediaQueryList | null = null;\n\nfunction getSystemTheme(): 'light' | 'dark' {\n if (typeof window !== 'undefined' && typeof window.matchMedia === 'function') {\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n }\n return 'light';\n}\n\n/** 实际生效的主题('auto' 解析为系统偏好) */\nexport function getEffectiveTheme(): 'light' | 'dark' {\n return currentTheme === 'auto' ? getSystemTheme() : currentTheme;\n}\n\nexport function getTheme(): WcTheme {\n return currentTheme;\n}\n\n/**\n * 设置主题。\n * @param theme 'light' | 'dark' | 'auto'(跟随系统 prefers-color-scheme)\n * @param options.persist 为 true 时写入 localStorage,配合 initTheme() 恢复\n */\nexport function setTheme(theme: WcTheme, options?: { persist?: boolean }): void {\n if (theme !== 'light' && theme !== 'dark' && theme !== 'auto') {\n throw new Error(`[wc] 无效主题: \"${String(theme)}\",可选 light | dark | auto`);\n }\n currentTheme = theme;\n\n if (typeof localStorage !== 'undefined') {\n if (options?.persist) {\n localStorage.setItem(STORAGE_KEY, theme);\n } else {\n localStorage.removeItem(STORAGE_KEY);\n }\n }\n\n syncAutoListener();\n applyTheme();\n}\n\n/** 应用启动时调用:恢复 localStorage 中持久化的主题(无记录则跟随系统) */\nexport function initTheme(): void {\n let stored: string | null = null;\n if (typeof localStorage !== 'undefined') {\n stored = localStorage.getItem(STORAGE_KEY);\n }\n setTheme(stored === 'light' || stored === 'dark' || stored === 'auto' ? stored : 'auto');\n}\n\nfunction syncAutoListener(): void {\n const shouldListen = currentTheme === 'auto' && typeof window.matchMedia === 'function';\n if (shouldListen && !mediaQuery) {\n mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n mediaQuery.addEventListener('change', applyTheme);\n } else if (!shouldListen && mediaQuery) {\n mediaQuery.removeEventListener('change', applyTheme);\n mediaQuery = null;\n }\n}\n\nfunction applyTheme(): void {\n const effective = getEffectiveTheme();\n if (typeof document !== 'undefined') {\n document.documentElement.dataset.theme = effective;\n }\n document.dispatchEvent(\n new CustomEvent(THEME_CHANGE_EVENT, {\n detail: { theme: currentTheme, effective },\n bubbles: true,\n composed: true,\n }),\n );\n}\n"],"names":["baseStyles","css","buttonStyles","_wcButton","LitElement","icon","html","content","nodes","n","wcButton","__decorateClass","property","buttonGroupStyles","_wcButtonGroup","wcButtonGroup","registry","libraries","cache","registerListeners","onIconRegister","cb","notifyRegister","registerIcon","name","svg","getIcon","registerIconLibrary","library","getIconLibrary","createIcon","viewBox","resolveIcon","libraryName","iconName","cacheKey","pending","err","raw","iconStyles","_WcIcon","changed","requestId","unwatch","url","res","nothing","unsafeSVG","WcIcon","state","FormAssociatedMixin","Base","_FormAssociatedElement","args","_v","FormAssociatedElement","enUS","zhCN","LANGUAGE_CHANGE_EVENT","currentLocale","registerLocale","translations","existing","dispatchLanguageChange","setLocale","getLocale","resolveLocale","base","key","getTerm","localeName","vars","messages","fallback","text","match","varName","getRegisteredLocales","LocalizeController","host","value","options","localeOverride","formatOptions","lang","inputStyles","_wcInput","v","old","target","showClear","wcInput","textareaStyles","_wcTextarea","ta","wcTextarea","checkboxStyles","_wcCheckbox","input","wcCheckbox","radioStyles","_wcRadio","wcRadio","switchStyles","_wcSwitch","wcSwitch","optionStyles","_wcOption","wcOption","selectStyles","_wcSelect","opt","o","el","i","selectedIdx","active","activeOption","activeId","e","wcSelect","sliderStyles","_wcSlider","stepped","fixed","attr","wcSlider","inputNumberStyles","_wcInputNumber","direction","next","parsed","stepBtn","dir","increment","inner","wcInputNumber","datePickerStyles","pad2","formatDate","d","parseDate","iso","m","addDays","days","_wcDatePicker","year","month","y","startOffset","start","todayIso","cells","_","cell","delta","rows","w","row","c","wcDatePicker","formStyles","_wcForm","button","type","item","errors","message","firstError","result","control","wcForm","_wcFormItem","rules","rule","failed","fail","empty","wcFormItem","dividerStyles","_wcDivider","wcDivider","tagStyles","_wcTag","wcTag","avatarStyles","PRESET_SIZES","_wcAvatar","size","wcAvatar","spaceStyles","_wcSpace","preset","wcSpace","layoutStyles","_wcRow","wcRow","_wcCol","wcCol","typographyStyles","_wcText","level","wcText","MODAL_SELECTOR","OverlaySideEffects","hooks","count","focusables","first","last","dialogStyles","_wcDialog","reason","wcDialog","drawerStyles","_wcDrawer","wcDrawer","messageStyles","THEME_ICONS","_wcMessage","wcMessage","container","ensureContainer","zIndex","showMessage","POSITION_GAP","ARROW_INSET","splitPlacement","placement","index","oppositeBase","fitsOnSide","anchor","panel","viewport","clamp","min","max","computePosition","preferred","align","useBase","alignStart","alignEnd","x","alignCross","anchorStart","anchorSize","panelSize","anchorCrossCenter","maxOffset","arrowOffset","tooltipStyles","SHOW_DELAY","HIDE_DELAY","tooltipUid","_wcTooltip","panelRect","wcTooltip","popconfirmStyles","popconfirmUid","_wcPopconfirm","wcPopconfirm","tabsStyles","tabStyles","_wcTab","wcTab","_wcTabs","children","element","t","tab","selectable","currentIndex","escaped","wcTabs","breadcrumbStyles","_wcBreadcrumb","isLast","wcBreadcrumb","wcBreadcrumbItem","paginationStyles","_wcPagination","page","clamped","previous","pageCount","folded","end","items","prevDisabled","nextDisabled","wcPagination","badgeStyles","_wcBadge","visible","wcBadge","emptyStyles","_wcEmpty","wcEmpty","progressStyles","CIRCLE_RADIUS","CIRCLE_CIRCUMFERENCE","_wcProgress","wcProgress","cardStyles","_wcCard","slot","has","showHeader","wcCard","listStyles","_wcList","wcList","_wcListItem","wcListItem","tableStyles","_wcTable","a","b","va","vb","col","cycle","rendered","isSorted","hasData","wcTable","imageStyles","SCALE_MIN","SCALE_MAX","SCALE_STEP","_wcImage","entries","effectivePreviewSrc","wcImage","uploadStyles","_wcUpload","xhr","file","list","incoming","allowed","remaining","rejected","percent","response","form","patch","f","wcUpload","arrowLeft","arrowRight","calendar","check","chevronDown","chevronLeft","chevronRight","chevronUp","close","error","imageOff","info","loader","minus","plus","rotateCw","search","upload","warning","zoomIn","zoomOut","builtinIcons","registerBuiltinIcons","THEME_CHANGE_EVENT","STORAGE_KEY","currentTheme","mediaQuery","getSystemTheme","getEffectiveTheme","getTheme","setTheme","theme","syncAutoListener","applyTheme","initTheme","stored","shouldListen","effective"],"mappings":"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"}
1
+ {"version":3,"file":"index.es.js","sources":["../src/styles/base.css.ts","../src/icons/library.ts","../src/components/icon/wc-icon.styles.ts","../src/components/icon/wc-icon.ts","../src/components/button/wc-button.styles.ts","../src/components/button/wc-button.ts","../src/components/button-group/wc-button-group.styles.ts","../src/components/button-group/wc-button-group.ts","../src/common/form-associated-mixin.ts","../src/i18n/locales/en-us.ts","../src/i18n/locales/zh-cn.ts","../src/i18n/localize.ts","../src/i18n/localize-controller.ts","../src/components/input/wc-input.styles.ts","../src/components/input/wc-input.ts","../src/components/textarea/wc-textarea.styles.ts","../src/components/textarea/wc-textarea.ts","../src/components/checkbox/wc-checkbox.styles.ts","../src/components/checkbox/wc-checkbox.ts","../src/components/radio/wc-radio.styles.ts","../src/components/radio/wc-radio.ts","../src/components/switch/wc-switch.styles.ts","../src/components/switch/wc-switch.ts","../src/components/select/wc-option.styles.ts","../src/components/select/wc-option.ts","../src/components/select/wc-select.styles.ts","../src/components/select/wc-select.ts","../src/components/slider/wc-slider.styles.ts","../src/components/slider/wc-slider.ts","../src/components/input-number/wc-input-number.styles.ts","../src/components/input-number/wc-input-number.ts","../src/components/date-picker/wc-date-picker.styles.ts","../src/components/date-picker/wc-date-picker.ts","../src/components/form/wc-form.styles.ts","../src/components/form/wc-form.ts","../src/components/form/wc-form-item.ts","../src/components/divider/wc-divider.styles.ts","../src/components/divider/wc-divider.ts","../src/components/tag/wc-tag.styles.ts","../src/components/tag/wc-tag.ts","../src/components/avatar/wc-avatar.styles.ts","../src/components/avatar/wc-avatar.ts","../src/components/space/wc-space.styles.ts","../src/components/space/wc-space.ts","../src/components/layout/wc-layout.styles.ts","../src/components/layout/wc-row.ts","../src/components/typography/wc-text.styles.ts","../src/components/typography/wc-text.ts","../src/common/overlay-side-effects.ts","../src/components/dialog/wc-dialog.styles.ts","../src/components/dialog/wc-dialog.ts","../src/components/drawer/wc-drawer.styles.ts","../src/components/drawer/wc-drawer.ts","../src/components/message/wc-message.styles.ts","../src/components/message/wc-message.ts","../src/components/message/message.ts","../src/common/position.ts","../src/components/tooltip/wc-tooltip.styles.ts","../src/components/tooltip/wc-tooltip.ts","../src/components/popconfirm/wc-popconfirm.styles.ts","../src/components/popconfirm/wc-popconfirm.ts","../src/components/dropdown/wc-dropdown-item.styles.ts","../src/components/dropdown/wc-dropdown-item.ts","../src/components/dropdown/wc-dropdown.styles.ts","../src/components/dropdown/wc-dropdown.ts","../src/components/split-button/wc-split-button.styles.ts","../src/components/split-button/wc-split-button.ts","../src/components/float-button/wc-float-button.styles.ts","../src/components/float-button/wc-float-button.ts","../src/components/float-button/wc-float-button-group.styles.ts","../src/components/float-button/wc-float-button-group.ts","../src/components/tabs/wc-tabs.styles.ts","../src/components/tabs/wc-tab.styles.ts","../src/components/tabs/wc-tab.ts","../src/components/tabs/wc-tabs.ts","../src/components/breadcrumb/wc-breadcrumb.styles.ts","../src/components/breadcrumb/wc-breadcrumb.ts","../src/components/breadcrumb/wc-breadcrumb-item.ts","../src/components/pagination/wc-pagination.styles.ts","../src/components/pagination/wc-pagination.ts","../src/components/badge/wc-badge.styles.ts","../src/components/badge/wc-badge.ts","../src/components/empty/wc-empty.styles.ts","../src/components/empty/wc-empty.ts","../src/components/progress/wc-progress.styles.ts","../src/components/progress/wc-progress.ts","../src/components/card/wc-card.styles.ts","../src/components/card/wc-card.ts","../src/components/list/wc-list.styles.ts","../src/components/list/wc-list.ts","../src/components/list/wc-list-item.ts","../src/components/table/wc-table.styles.ts","../src/components/table/wc-table.ts","../src/components/image/wc-image.styles.ts","../src/components/image/wc-image.ts","../src/components/upload/wc-upload.styles.ts","../src/components/upload/wc-upload.ts","../src/icons/feather-icons.ts","../src/icons/arrow-left.ts","../src/icons/arrow-right.ts","../src/icons/arrow-up.ts","../src/icons/calendar.ts","../src/icons/check.ts","../src/icons/chevron-down.ts","../src/icons/chevron-left.ts","../src/icons/chevron-right.ts","../src/icons/chevron-up.ts","../src/icons/close.ts","../src/icons/error.ts","../src/icons/file.ts","../src/icons/image-off.ts","../src/icons/info.ts","../src/icons/loader.ts","../src/icons/minus.ts","../src/icons/plus.ts","../src/icons/rotate-cw.ts","../src/icons/search.ts","../src/icons/upload.ts","../src/icons/warning.ts","../src/icons/zoom-in.ts","../src/icons/zoom-out.ts","../src/icons/index.ts","../src/theme/theme.ts"],"sourcesContent":["import { css } from 'lit';\n\n/**\n * 组件共享基础样式,每个组件的 static styles 中首先引入。\n */\nexport const baseStyles = css`\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n :host {\n display: inline-block;\n font-family: var(--wc-font-family);\n font-size: var(--wc-font-size-medium);\n line-height: var(--wc-line-height-base);\n color: var(--wc-color-text);\n -webkit-tap-highlight-color: transparent;\n }\n\n :host([hidden]) {\n display: none;\n }\n\n :focus-visible {\n outline: 2px solid var(--wc-color-focus-ring);\n outline-offset: 2px;\n }\n\n :focus:not(:focus-visible) {\n outline: none;\n }\n`;\n","/**\n * 图标注册系统\n *\n * 两条注册路径:\n * 1. registerIcon(name, svg) —— 同步注册表,本地 SVG 字符串,单图标单文件可 tree-shaking\n * 2. registerIconLibrary(name, lib) —— 分组图标库,resolver 支持返回 Promise(CDN 懒加载),\n * 可选 mutator 统一调整注入前的 SVG 根元素(如强制 stroke 风格)\n *\n * 安全约定:register* 属于受信 API,SVG 内容不做消毒,\n * 禁止将用户输入直接作为 SVG 来源(同 Shoelace 的做法)。\n */\nexport interface WcIconData {\n name: string;\n svg: string;\n}\n\nexport interface WcIconLibrary {\n /** 给定图标名返回 SVG 字符串;支持返回 Promise 实现懒加载 */\n resolver: (name: string) => string | Promise<string>;\n /** 可选:对解析后的 SVG 根元素做统一调整(在注入 Shadow DOM 之前执行) */\n mutator?: (svg: SVGSVGElement) => void;\n}\n\n/** 同步注册表:内置与用户本地图标 */\nconst registry = new Map<string, string>();\n\n/** 分组图标库 */\nconst libraries = new Map<string, WcIconLibrary>();\n\n/** 解析结果缓存,key 为 `${library}:${name}`,避免同一图标重复请求/解析 */\nconst cache = new Map<string, Promise<string>>();\n\n/** 注册变化监听:解决「组件首渲染早于图标注册」的时序竞态(未命中后可订阅重试) */\nconst registerListeners = new Set<() => void>();\n\n/** 订阅注册变化,返回取消订阅函数 */\nexport function onIconRegister(cb: () => void): () => void {\n registerListeners.add(cb);\n return () => registerListeners.delete(cb);\n}\n\nfunction notifyRegister(): void {\n // 必须快照后遍历:回调(wc-icon 的重试 loadIcon)会同步退订/重订,\n // 直接遍历 Set 会把新增项也纳入迭代,造成无限同步循环卡死页面\n for (const cb of [...registerListeners]) cb();\n}\n\n/** 注册本地图标(同步),同名覆盖 */\nexport function registerIcon(name: string, svg: string): void {\n registry.set(name, svg);\n notifyRegister();\n}\n\nexport function getIcon(name: string): string | undefined {\n return registry.get(name);\n}\n\n/** 注册分组图标库,同名覆盖。'default' 为内置保留库名 */\nexport function registerIconLibrary(name: string, library: WcIconLibrary): void {\n libraries.set(name, library);\n notifyRegister();\n}\n\nexport function getIconLibrary(name: string): WcIconLibrary | undefined {\n return libraries.get(name);\n}\n\n/**\n * 图标数据工厂:统一 24×24 viewBox 与 lucide 风格默认属性(currentColor 描边)。\n * 内置图标统一用它生成,保证风格一致。\n */\nexport function createIcon(name: string, content: string, viewBox = '0 0 24 24'): WcIconData {\n return {\n name,\n svg:\n `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"${viewBox}\" fill=\"none\" ` +\n `stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">` +\n `${content}</svg>`,\n };\n}\n\n// 默认库:走同步注册表\nregisterIconLibrary('default', {\n resolver: (name) => registry.get(name) ?? '',\n});\n\n/**\n * 解析图标为 SVG 字符串(带缓存与竞态隔离)。\n * 找不到时返回空字符串,开发环境下输出警告。\n */\nexport async function resolveIcon(libraryName: string, iconName: string): Promise<string> {\n const library = libraries.get(libraryName);\n if (!library) {\n if (import.meta.env?.DEV) {\n console.warn(`[wc-icon] 未注册的图标库 \"${libraryName}\"`);\n }\n return '';\n }\n\n const cacheKey = `${libraryName}:${iconName}`;\n let pending = cache.get(cacheKey);\n if (!pending) {\n pending = Promise.resolve(library.resolver(iconName)).catch((err: unknown) => {\n if (import.meta.env?.DEV) {\n console.warn(`[wc-icon] 图标 \"${libraryName}:${iconName}\" 加载失败`, err);\n }\n return '';\n });\n cache.set(cacheKey, pending);\n }\n\n const raw = await pending;\n if (!raw) {\n // 未命中不缓存,否则注册晚于首渲染时重试永远拿到空的旧结果\n cache.delete(cacheKey);\n if (import.meta.env?.DEV && registry.size === 0 && libraryName === 'default') {\n console.warn(\n `[wc-icon] 未找到图标 \"${iconName}\",且注册表为空。` +\n `请先调用 registerBuiltinIcons() 或 registerIcon()`,\n );\n }\n return '';\n }\n\n if (library.mutator && typeof DOMParser !== 'undefined') {\n const doc = new DOMParser().parseFromString(raw, 'text/html');\n const svg = doc.querySelector('svg');\n if (svg) {\n library.mutator(svg as unknown as SVGSVGElement);\n return svg.outerHTML;\n }\n }\n return raw;\n}\n","import { css } from 'lit';\n\nexport const iconStyles = css`\n :host {\n display: inline-flex;\n /*\n * 覆盖 baseStyles 的 :host { color: var(--wc-color-text) }——组件自身 :host\n * 声明的优先级高于继承,不改为 inherit 的话,图标放进实色按钮等深色上下文\n * 时会被强制成文字色而非跟随 currentColor(currentColor → stroke 继承链断裂)。\n */\n color: inherit;\n /* 尺寸默认 1em,跟随 font-size 缩放;颜色继承 currentColor */\n width: 1em;\n height: 1em;\n flex-shrink: 0;\n line-height: 1;\n }\n\n [part='base'] {\n display: flex;\n width: 100%;\n height: 100%;\n align-items: center;\n justify-content: center;\n }\n\n svg {\n display: block;\n width: 100%;\n height: 100%;\n /* 不设 fill:描边图标由 SVG 根的 fill=\"none\" 决定(CSS 会覆盖 presentation attribute,\n 设 fill: currentColor 会把闭合形状整体填充导致发糊);填充型图标由各自 SVG 声明。\n 颜色统一走 color → stroke=\"currentColor\" 继承。 */\n color: currentColor;\n pointer-events: none;\n }\n\n :host([spin]) svg,\n :host([pulse]) svg {\n transform-origin: center;\n animation: wc-spin var(--wc-duration-slow, 1s) linear infinite;\n }\n\n /* pulse:旋转 + 缓动呼吸感,用于加载中区分度更高的场景 */\n :host([pulse]) svg {\n animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);\n }\n\n @keyframes wc-spin {\n from {\n rotate: 0deg;\n }\n to {\n rotate: 360deg;\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n :host([spin]) svg,\n :host([pulse]) svg {\n animation: none;\n }\n }\n`;\n","import { LitElement, html, nothing } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { unsafeSVG } from 'lit/directives/unsafe-svg.js';\nimport type { PropertyValues } from 'lit';\nimport { baseStyles } from '../../styles/base.css.js';\nimport { onIconRegister, resolveIcon } from '../../icons/library.js';\nimport { iconStyles } from './wc-icon.styles.js';\n\n/**\n * 图标\n *\n * 三种来源(优先级从高到低):`src`(URL 直连)> `name` + `library`(图标库解析)。\n * 内置图标需先调用 `registerBuiltinIcons()`;自定义库用 `registerIconLibrary()`。\n *\n * @slot - 无(内容由 name/src 解析而来)\n * @csspart base - 图标容器\n * @cssprop --wc-icon-size - 覆盖图标尺寸(默认 1em)\n */\nexport class WcIcon extends LitElement {\n static styles = [baseStyles, iconStyles];\n\n /** 图标名(在 library 对应的图标库中查找) */\n @property() name = '';\n\n /** 直接指定 SVG 地址,优先级高于 name */\n @property() src = '';\n\n /** 图标库名称,默认走同步注册表 */\n @property() library = 'default';\n\n /** 无障碍描述文案;提供时 role=img + aria-label,否则对读屏隐藏 */\n @property() label = '';\n\n /** 旋转动画(加载中) */\n @property({ type: Boolean, reflect: true }) spin = false;\n\n /** 缓动旋转动画 */\n @property({ type: Boolean, reflect: true }) pulse = false;\n\n @state() private svg = '';\n\n /** 竞态守卫:name 快速切换时只采纳最后一次解析结果 */\n private requestId = 0;\n\n /** 图标未注册时的订阅句柄(注册后重试) */\n private unwatchRegister: (() => void) | undefined;\n\n protected willUpdate(changed: PropertyValues<this>): void {\n if (changed.has('src') || changed.has('name') || changed.has('library')) {\n void this.loadIcon();\n }\n }\n\n disconnectedCallback(): void {\n this.unwatchRegister?.();\n }\n\n private async loadIcon(): Promise<void> {\n this.unwatchRegister?.();\n this.unwatchRegister = undefined;\n const requestId = ++this.requestId;\n // 先订阅再解析:注册通知可能整个落在解析的 await 间隙里(如 registerBuiltinIcons\n // 晚于首渲染),后订阅会错过通知导致图标永久空白;解析成功后立即退订\n const unwatch =\n this.name && !this.src\n ? onIconRegister(() => {\n void this.loadIcon();\n })\n : null;\n let raw = '';\n if (this.src) {\n raw = await this.fetchSrc(this.src);\n } else if (this.name) {\n raw = await resolveIcon(this.library, this.name);\n }\n if (requestId !== this.requestId) {\n unwatch?.();\n return;\n }\n if (raw || !unwatch) {\n unwatch?.();\n } else {\n this.unwatchRegister = unwatch;\n }\n this.svg = raw;\n }\n\n private async fetchSrc(url: string): Promise<string> {\n if (typeof fetch !== 'function') {\n return '';\n }\n try {\n const res = await fetch(url);\n if (!res.ok) {\n return '';\n }\n return await res.text();\n } catch {\n return '';\n }\n }\n\n render() {\n return html`\n <span\n part=\"base\"\n role=${this.label ? 'img' : 'presentation'}\n aria-label=${this.label || nothing}\n aria-hidden=${this.label ? nothing : 'true'}\n >${this.svg ? unsafeSVG(this.svg) : nothing}</span\n >\n `;\n }\n}\n\nif (!customElements.get('wc-icon')) {\n customElements.define('wc-icon', WcIcon);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-icon': WcIcon;\n }\n}\n","import { css } from 'lit';\n\nexport const buttonStyles = css`\n :host {\n display: inline-block;\n /* component 层令牌:引用 semantic 层,允许按实例覆盖 */\n --wc-button-height: 32px;\n --wc-button-padding-x: var(--wc-space-4);\n --wc-button-font-size: var(--wc-font-size-medium);\n --wc-button-radius: var(--wc-radius-medium);\n }\n\n :host([size='small']) {\n --wc-button-height: 24px;\n --wc-button-padding-x: var(--wc-space-2);\n --wc-button-font-size: var(--wc-font-size-small);\n }\n\n :host([size='large']) {\n --wc-button-height: 40px;\n --wc-button-padding-x: 20px;\n --wc-button-font-size: var(--wc-font-size-large);\n }\n\n :host([block]) {\n display: block;\n width: 100%;\n }\n\n .button {\n /* 波纹 span 需按按钮定位且裁剪在圆角内;outline 聚焦环不受 overflow 影响 */\n position: relative;\n overflow: hidden;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--wc-space-1);\n width: 100%;\n height: var(--wc-button-height);\n padding: 0 var(--wc-button-padding-x);\n border: 1px solid transparent;\n border-radius: var(--wc-button-radius);\n font-family: inherit;\n font-size: var(--wc-button-font-size);\n line-height: 1;\n cursor: pointer;\n user-select: none;\n transition:\n background-color var(--wc-duration-fast) var(--wc-easing-standard),\n border-color var(--wc-duration-fast) var(--wc-easing-standard),\n color var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n /* 聚焦环 offset 可被外层上下文覆写(如 button-group 内改为 -2px 内嵌,\n 避免光环叠在相邻按钮上);同名规则晚于 baseStyles 生效 */\n :focus-visible {\n outline-offset: var(--wc-button-focus-ring-offset, 2px);\n }\n\n .button:disabled {\n cursor: not-allowed;\n }\n\n /*\n * 图标容器必须显式 flex 居中:默认 inline 的 span 内部按行内盒基线摆放\n * inline-flex 图标,基线取图标底边,行盒被字体 descent 撑高 → 图标偏移 1-2px。\n * z-index: 1 保证内容在波纹之上。\n */\n .icon {\n position: relative;\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .content {\n position: relative;\n z-index: 1;\n }\n\n .icon[hidden] {\n display: none;\n }\n\n /* 纯图标按钮:宽度收为与高度相等的正方形 */\n :host(.wc-button--icon-only) .button {\n width: var(--wc-button-height);\n padding: 0;\n }\n\n /* ---- theme 语义色变量:base 实色底与 outline/dashed/text/link 前景色统一从这里取 ---- */\n :host {\n --wc-button-theme-color: var(--wc-color-primary);\n --wc-button-theme-hover: var(--wc-color-primary-hover);\n --wc-button-theme-active: var(--wc-color-primary-active);\n }\n :host([theme='success']) {\n --wc-button-theme-color: var(--wc-color-success);\n --wc-button-theme-hover: var(--wc-color-success-dark);\n --wc-button-theme-active: var(--wc-color-success-dark);\n }\n :host([theme='warning']) {\n --wc-button-theme-color: var(--wc-color-warning);\n --wc-button-theme-hover: var(--wc-color-warning-dark);\n --wc-button-theme-active: var(--wc-color-warning-dark);\n }\n :host([theme='danger']) {\n --wc-button-theme-color: var(--wc-color-error);\n --wc-button-theme-hover: var(--wc-color-error-dark);\n --wc-button-theme-active: var(--wc-color-error-dark);\n }\n\n /* ---- theme: default ---- */\n :host([type='base']) .button {\n background-color: var(--wc-color-bg-container);\n border-color: var(--wc-color-border);\n color: var(--wc-color-text);\n }\n :host([theme='default'][type='base']) .button:hover:not(:disabled) {\n border-color: var(--wc-button-theme-color);\n color: var(--wc-button-theme-color);\n }\n\n /* ---- theme: primary / success / warning / danger 的 base 变体:实色底 ---- */\n :host([theme='primary'][type='base']) .button,\n :host([theme='success'][type='base']) .button,\n :host([theme='warning'][type='base']) .button,\n :host([theme='danger'][type='base']) .button {\n background-color: var(--wc-button-theme-color);\n border-color: var(--wc-button-theme-color);\n color: var(--wc-color-text-anti);\n }\n :host([theme='primary'][type='base']) .button:hover:not(:disabled),\n :host([theme='success'][type='base']) .button:hover:not(:disabled),\n :host([theme='warning'][type='base']) .button:hover:not(:disabled),\n :host([theme='danger'][type='base']) .button:hover:not(:disabled) {\n background-color: var(--wc-button-theme-hover);\n border-color: var(--wc-button-theme-hover);\n color: var(--wc-color-text-anti);\n }\n :host([theme='primary'][type='base']) .button:active:not(:disabled),\n :host([theme='success'][type='base']) .button:active:not(:disabled),\n :host([theme='warning'][type='base']) .button:active:not(:disabled),\n :host([theme='danger'][type='base']) .button:active:not(:disabled) {\n background-color: var(--wc-button-theme-active);\n border-color: var(--wc-button-theme-active);\n color: var(--wc-color-text-anti);\n }\n\n /* ---- type: outline / dashed(继承 theme 色) ---- */\n :host([type='outline']) .button,\n :host([type='dashed']) .button {\n background-color: transparent;\n border-color: var(--wc-button-theme-color);\n color: var(--wc-button-theme-color);\n }\n :host([type='dashed']) .button {\n border-style: dashed;\n }\n :host([type='outline']) .button:hover:not(:disabled),\n :host([type='dashed']) .button:hover:not(:disabled) {\n background-color: var(--wc-button-theme-hover);\n border-color: var(--wc-button-theme-hover);\n color: var(--wc-color-text-anti);\n }\n\n /* ---- type: text ---- */\n :host([type='text']) .button {\n background-color: transparent;\n border-color: transparent;\n color: var(--wc-button-theme-color);\n }\n :host([type='text']) .button:hover:not(:disabled) {\n background-color: var(--wc-color-bg);\n }\n\n /* ---- type: link ---- */\n :host([type='link']) .button {\n background-color: transparent;\n border-color: transparent;\n color: var(--wc-button-theme-color);\n }\n :host([type='link']) .button:hover:not(:disabled) {\n color: var(--wc-button-theme-hover);\n }\n\n /* ---- ghost 幽灵模式(透明底 + 主题色边框/文字,用于深色背景) ----\n base 变体换透明底;outline/dashed 本就透明,仅把悬停实色填充换成半透明淡底;\n :not 链保证禁用态不受影响 */\n :host([ghost][type='base']:not([disabled]):not([loading])) .button {\n background-color: transparent;\n border-color: var(--wc-button-theme-color);\n color: var(--wc-button-theme-color);\n }\n :host([ghost][type='base']:not([disabled]):not([loading])) .button:hover:not(:disabled),\n :host([ghost][type='outline']:not([disabled]):not([loading])) .button:hover:not(:disabled),\n :host([ghost][type='dashed']:not([disabled]):not([loading])) .button:hover:not(:disabled) {\n background-color: var(\n --wc-button-ghost-hover-bg,\n color-mix(in srgb, var(--wc-button-theme-color) 12%, transparent)\n );\n border-color: var(--wc-button-theme-color);\n color: var(--wc-button-theme-color);\n }\n\n /* ---- gradient 渐变底(仅 base 变体且非 default 主题) ----\n 主题色与 hover 色明度相差太小(肉眼近似纯色),端点改用 color-mix 混白提亮\n 拉开对比;background-image 不可 transition,与 antd 一致不做渐变过渡 */\n :host([gradient][type='base']:not([theme='default']):not([disabled]):not([loading])) .button {\n background-image: linear-gradient(\n 135deg,\n color-mix(in srgb, var(--wc-button-theme-color) 65%, #fff),\n var(--wc-button-theme-color)\n );\n }\n :host([gradient][type='base']:not([theme='default']):not([disabled]):not([loading]))\n .button:hover:not(:disabled) {\n background-image: linear-gradient(\n 135deg,\n color-mix(in srgb, var(--wc-button-theme-hover) 65%, #fff),\n var(--wc-button-theme-hover)\n );\n }\n\n /* ---- ripple 点击波纹(span.ripple 由 handleClick 动态插入) ---- */\n .ripple {\n position: absolute;\n z-index: 0;\n border-radius: 50%;\n pointer-events: none;\n background-color: var(\n --wc-button-ripple-color,\n color-mix(in srgb, currentColor 45%, transparent)\n );\n transform: scale(0);\n opacity: 0.6;\n animation: wc-ripple var(--wc-button-ripple-duration, 600ms) var(--wc-easing-standard) forwards;\n }\n\n @keyframes wc-ripple {\n to {\n transform: scale(1);\n opacity: 0;\n }\n }\n\n /* 减弱动态效果:不渲染波纹动画(span 停留在 scale(0) 不可见) */\n @media (prefers-reduced-motion: reduce) {\n .ripple {\n animation: none;\n }\n }\n\n /* ---- 禁用态 ---- */\n .button:disabled {\n background-color: var(--wc-color-bg-disabled);\n border-color: transparent;\n color: var(--wc-color-text-disabled);\n }\n\n /* ---- 加载态 spinner ---- */\n .button[aria-busy='true'] .content {\n opacity: 0.7;\n }\n`;\n","import { LitElement, html } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport '../icon/wc-icon.js';\nimport { buttonStyles } from './wc-button.styles';\n\nexport type wcButtonTheme = 'default' | 'primary' | 'success' | 'warning' | 'danger';\nexport type wcButtonType = 'base' | 'outline' | 'dashed' | 'text' | 'link';\nexport type wcButtonSize = 'small' | 'medium' | 'large';\nexport type wcButtonIconPosition = 'start' | 'end';\n\n/**\n * 按钮\n *\n * @slot - 按钮内容\n * @slot icon - 图标(位置由 iconPosition 控制;loading 时被 spinner 替换)\n * @csspart base - 按钮根元素\n * @csspart icon - 图标容器\n * @csspart content - 文案容器\n * @cssprop --wc-button-height - 按钮高度\n * @cssprop --wc-button-ghost-hover-bg - ghost 模式悬停淡底色\n * @cssprop --wc-button-ripple-color - 波纹颜色(默认 currentColor 45% 透明度)\n * @cssprop --wc-button-ripple-duration - 波纹扩散时长(默认 600ms)\n */\nexport class wcButton extends LitElement {\n static styles = [baseStyles, buttonStyles];\n\n /** 组件风格(语义色) */\n @property({ reflect: true }) theme: wcButtonTheme = 'default';\n\n /** 按钮类型(形式) */\n @property({ reflect: true }) type: wcButtonType = 'base';\n\n /** 原生按钮行为:submit / reset 仅在 wc-form 内触发提交 / 重置 */\n @property({ reflect: true, attribute: 'html-type' }) htmlType: 'button' | 'submit' | 'reset' =\n 'button';\n\n /** 尺寸 */\n @property({ reflect: true }) size: wcButtonSize = 'medium';\n\n /** 图标位置:start 左 / end 右 */\n @property({ reflect: true, attribute: 'icon-position' }) iconPosition: wcButtonIconPosition =\n 'start';\n\n /** 是否为块级元素 */\n @property({ type: Boolean, reflect: true }) block = false;\n\n /** 禁用状态 */\n @property({ type: Boolean, reflect: true }) disabled = false;\n\n /** 加载状态 */\n @property({ type: Boolean, reflect: true }) loading = false;\n\n /** 幽灵模式:透明底 + 主题色边框/文字(用于深色背景;outline/dashed 悬停改为半透明淡底) */\n @property({ type: Boolean, reflect: true }) ghost = false;\n\n /** 渐变底:实色按钮改为主题色线性渐变(仅 base 变体且非 default 主题生效) */\n @property({ type: Boolean, reflect: true }) gradient = false;\n\n /** 点击波纹效果 */\n @property({ type: Boolean, reflect: true }) ripple = false;\n\n private handleClick(e: MouseEvent): void {\n // 禁用/加载时拦截点击:原生按钮 disabled 已拦截禁用态,这里兜底加载态\n if (this.loading) {\n e.preventDefault();\n e.stopImmediatePropagation();\n return;\n }\n if (this.ripple) {\n this._spawnRipple(e);\n }\n }\n\n /*\n * 点击波纹:动态 span 从点击点扩散(伪元素无法按点击点定位,且并发点击\n * 会互相打断)。键盘触发(clientX/Y 均为 0)时从中心扩散。\n */\n private _spawnRipple(e: MouseEvent): void {\n const button = this.shadowRoot!.querySelector<HTMLElement>('.button');\n if (!button) return;\n const rect = button.getBoundingClientRect();\n const diameter = Math.max(rect.width, rect.height) * 2;\n const cx = e.clientX || rect.left + rect.width / 2;\n const cy = e.clientY || rect.top + rect.height / 2;\n const span = document.createElement('span');\n span.className = 'ripple';\n span.style.width = `${diameter}px`;\n span.style.height = `${diameter}px`;\n span.style.left = `${cx - rect.left - diameter / 2}px`;\n span.style.top = `${cy - rect.top - diameter / 2}px`;\n span.addEventListener('animationend', () => span.remove());\n button.appendChild(span);\n }\n\n /** 是否有图标(icon 插槽检测) */\n private _hasIcon = false;\n\n /** 是否有文案(默认插槽检测),两者决定纯图标方形态 */\n private _hasText = false;\n\n render() {\n /*\n * loading 时 spinner 替换 icon 插槽(对齐 antd 行为);无图标按钮也显示\n * spinner,因此 hidden 条件要放行 loading 态\n */\n const icon = html`<span class=\"icon\" part=\"icon\" ?hidden=${!this._hasIcon && !this.loading}>\n ${\n this.loading\n ? html`<wc-icon class=\"spinner\" name=\"loader\" spin></wc-icon>`\n : html`<slot name=\"icon\" @slotchange=${this._onIconSlotChange}></slot>`\n }\n </span>`;\n const content = html`<span class=\"content\" part=\"content\"\n ><slot @slotchange=${this._onTextSlotChange}></slot\n ></span>`;\n return html`\n <button\n part=\"base\"\n class=\"button\"\n type=${this.htmlType}\n ?disabled=${this.disabled || this.loading}\n aria-disabled=${this.disabled || this.loading}\n aria-busy=${this.loading}\n @click=${this.handleClick}\n >\n ${this.iconPosition === 'end' ? [content, icon] : [icon, content]}\n </button>\n `;\n }\n\n private _onIconSlotChange(e: Event): void {\n this._hasIcon = (e.target as HTMLSlotElement).assignedElements({ flatten: true }).length > 0;\n this._syncIconOnly();\n this.requestUpdate();\n }\n\n private _onTextSlotChange(e: Event): void {\n const nodes = (e.target as HTMLSlotElement).assignedNodes({ flatten: true });\n this._hasText = nodes.some((n) => (n.textContent ?? '').trim().length > 0);\n this._syncIconOnly();\n this.requestUpdate();\n }\n\n /** 纯图标(有 icon 无文案)时收为正方形 */\n private _syncIconOnly(): void {\n this.classList.toggle('wc-button--icon-only', this._hasIcon && !this._hasText);\n }\n}\n\nif (!customElements.get('wc-button')) {\n customElements.define('wc-button', wcButton);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-button': wcButton;\n }\n}\n","import { css } from 'lit';\n\nexport const buttonGroupStyles = css`\n :host {\n display: inline-block;\n\n /* component 层令牌:首尾按钮保留的圆角 */\n --wc-button-group-radius: var(--wc-radius-medium);\n }\n\n .group {\n display: inline-flex;\n vertical-align: middle;\n }\n\n /*\n * ::slotted 只能作用于子 wc-button 的宿主元素,圆角与边距通过\n * --wc-button-radius 自定义属性穿透进按钮的 Shadow DOM\n *(外层作用域对宿主的声明优先于组件内 :host 声明)。\n * 注意令牌名不能与按钮自身的 --wc-button-radius 同名,否则自引用失效。\n */\n ::slotted(wc-button) {\n --wc-button-radius: 0;\n /* 聚焦环内嵌:光环画在按钮边缘内侧,避免叠在相邻按钮上造成割裂感 */\n --wc-button-focus-ring-offset: -2px;\n position: relative;\n }\n\n /* 边距合并由组件用内联样式实现(见 _syncMargins),CSS 声明会被外层 reset 压过 */\n\n /* 悬停/聚焦的上层按钮边框完整可见 */\n ::slotted(wc-button:hover),\n ::slotted(wc-button:focus-within) {\n z-index: 1;\n }\n\n ::slotted(wc-button:first-child) {\n --wc-button-radius: var(--wc-button-group-radius) 0 0 var(--wc-button-group-radius);\n }\n\n ::slotted(wc-button:last-child) {\n --wc-button-radius: 0 var(--wc-button-group-radius) var(--wc-button-group-radius) 0;\n }\n\n ::slotted(wc-button:only-child) {\n --wc-button-radius: var(--wc-button-group-radius);\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { baseStyles } from '../../styles/base.css';\nimport { buttonGroupStyles } from './wc-button-group.styles';\n\n/**\n * 按钮分组。包裹多个 `wc-button` 形成组合:中间按钮去圆角、相邻边框合并,\n * 首尾按钮保留外侧圆角。仅接受 `wc-button` 作为直接子元素。\n *\n * @slot - wc-button 子元素\n * @csspart base - 分组容器\n * @cssprop --wc-button-group-radius - 覆盖首尾按钮保留的圆角\n */\nexport class wcButtonGroup extends LitElement {\n static styles = [baseStyles, buttonGroupStyles];\n\n render() {\n return html`<div class=\"group\" part=\"base\">\n <slot @slotchange=${this._syncMargins}></slot>\n </div>`;\n }\n\n /*\n * 相邻边框合并必须用内联样式:CSS 规则(::slotted margin-left)会被宿主页面\n * 的全局 reset(如 * { margin: 0 })覆盖——外层文档样式对 slotted 元素\n * 永远优先于 ::slotted 声明。内联样式优先级最高,且 slotchange 时同步。\n */\n private _syncMargins(e: Event) {\n const els = (e.target as HTMLSlotElement).assignedElements({ flatten: true }) as HTMLElement[];\n for (let i = 0; i < els.length; i++) {\n els[i]!.style.marginLeft = i > 0 ? '-1px' : '';\n }\n }\n}\n\nif (!customElements.get('wc-button-group')) {\n customElements.define('wc-button-group', wcButtonGroup);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-button-group': wcButtonGroup;\n }\n}\n","import type { LitElement } from 'lit';\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\ntype Constructor<T = Record<string, unknown>> = new (...args: any[]) => T;\n\n/** FormAssociatedMixin 为子类附加的成员(类型层),便于子类与使用者获得完整类型 */\nexport interface FormAssociatedMembers {\n /** 提交到表单的字段名 */\n name: string;\n /** 禁用状态,reflect 以支持外部 CSS 选择(如 wc-input[disabled]) */\n disabled: boolean;\n /** ElementInternals 实例,子类用于 setFormValue / setValidity */\n internals: ElementInternals;\n /** 表单控件的当前值 */\n value: unknown;\n /** 默认值,子类可覆写 */\n readonly defaultValue: unknown;\n /** 表单重置回调 */\n formResetCallback(): void;\n}\n\n/**\n * 表单关联 mixin:让组件通过 ElementInternals 接入原生 <form>。\n * 提供 name/disabled 属性与表单重置回调,符合 RULES.md 第 7 条。\n * 注意:Lit 会沿原型链合并 static properties,子类的 @property 不受影响。\n */\nexport function FormAssociatedMixin<T extends Constructor<LitElement>>(Base: T) {\n class FormAssociatedElement extends Base {\n static formAssociated = true;\n\n static properties = {\n name: { type: String },\n disabled: { type: Boolean, reflect: true },\n };\n\n declare name: string;\n declare disabled: boolean;\n\n internals!: ElementInternals;\n\n constructor(...args: any[]) {\n super(...args);\n this.name = '';\n this.disabled = false;\n this.internals = (this as unknown as LitElement).attachInternals();\n }\n\n /** 表单控件的当前值,表单类组件必须实现 */\n get value(): unknown {\n return undefined;\n }\n\n set value(_v: unknown) {\n // 由子类覆写\n }\n\n /** 表单重置时恢复默认值,子类按需覆写 */\n formResetCallback(): void {\n this.value = this.defaultValue;\n }\n\n /** 默认值,子类可覆写 */\n get defaultValue(): unknown {\n return undefined;\n }\n }\n\n return FormAssociatedElement as unknown as T & Constructor<FormAssociatedMembers>;\n}\n","import type { WcTranslations } from '../types.js';\n\nexport const enUS: WcTranslations = {\n 'select.placeholder': 'Select',\n 'select.empty': 'No data',\n 'pagination.total': '{total} items in total',\n 'pagination.prev': 'Previous page',\n 'pagination.next': 'Next page',\n 'pagination.label': 'Pagination',\n 'pagination.page': 'Page {page}',\n 'pagination.jumpTo': 'Go to',\n 'pagination.pageUnit': 'Page',\n 'dialog.confirm': 'Confirm',\n 'dialog.cancel': 'Cancel',\n 'empty.noData': 'No data',\n 'table.empty': 'No data in table',\n 'input.clear': 'Clear',\n 'inputNumber.increment': 'Increment',\n 'inputNumber.decrement': 'Decrement',\n 'datePicker.placeholder': 'Select date',\n 'datePicker.today': 'Today',\n 'datePicker.prevYear': 'Previous year',\n 'datePicker.prevMonth': 'Previous month',\n 'datePicker.nextMonth': 'Next month',\n 'datePicker.nextYear': 'Next year',\n 'form.required': '{name} is required',\n 'form.min': '{name} must be no less than {min}',\n 'form.max': '{name} must be no greater than {max}',\n 'form.minLength': '{name} must be at least {minLength} characters',\n 'form.maxLength': '{name} must be at most {maxLength} characters',\n 'form.pattern': '{name} format is invalid',\n 'form.invalid': '{name} is invalid',\n 'tag.close': 'Remove',\n 'dropdown.more': 'More options',\n 'floatbutton.backtop': 'Back to top',\n 'floatbutton.menu': 'More actions',\n 'dialog.close': 'Close',\n 'message.close': 'Close',\n 'breadcrumb.label': 'Breadcrumb',\n 'image.loadError': 'Failed to load image',\n 'image.preview': 'Preview',\n 'image.zoomIn': 'Zoom in',\n 'image.zoomOut': 'Zoom out',\n 'image.rotate': 'Rotate',\n 'image.reset': 'Reset',\n 'image.close': 'Close',\n 'upload.upload': 'Upload',\n 'upload.clickOrDrag': 'Click or drag file here to upload',\n 'upload.failed': 'Upload failed',\n 'upload.retry': 'Retry',\n 'upload.remove': 'Remove',\n 'upload.preview': 'Preview',\n};\n","import type { WcTranslations } from '../types.js';\n\nexport const zhCN: WcTranslations = {\n 'select.placeholder': '请选择',\n 'select.empty': '暂无数据',\n 'pagination.total': '共 {total} 条',\n 'pagination.prev': '上一页',\n 'pagination.next': '下一页',\n 'pagination.label': '分页导航',\n 'pagination.page': '第 {page} 页',\n 'pagination.jumpTo': '跳至',\n 'pagination.pageUnit': '页',\n 'dialog.confirm': '确认',\n 'dialog.cancel': '取消',\n 'empty.noData': '暂无数据',\n 'table.empty': '表格暂无数据',\n 'input.clear': '清空',\n 'inputNumber.increment': '增加',\n 'inputNumber.decrement': '减少',\n 'datePicker.placeholder': '请选择日期',\n 'datePicker.today': '今天',\n 'datePicker.prevYear': '上一年',\n 'datePicker.prevMonth': '上个月',\n 'datePicker.nextMonth': '下个月',\n 'datePicker.nextYear': '下一年',\n 'form.required': '{name}不能为空',\n 'form.min': '{name}不能小于{min}',\n 'form.max': '{name}不能大于{max}',\n 'form.minLength': '{name}至少{minLength}个字符',\n 'form.maxLength': '{name}最多{maxLength}个字符',\n 'form.pattern': '{name}格式不正确',\n 'form.invalid': '{name}校验不通过',\n 'tag.close': '删除',\n 'dropdown.more': '更多选项',\n 'floatbutton.backtop': '回到顶部',\n 'floatbutton.menu': '更多操作',\n 'dialog.close': '关闭',\n 'message.close': '关闭',\n 'breadcrumb.label': '面包屑导航',\n 'image.loadError': '图片加载失败',\n 'image.preview': '预览',\n 'image.zoomIn': '放大',\n 'image.zoomOut': '缩小',\n 'image.rotate': '旋转',\n 'image.reset': '重置',\n 'image.close': '关闭',\n 'upload.upload': '上传文件',\n 'upload.clickOrDrag': '点击或拖拽文件到此处上传',\n 'upload.failed': '上传失败',\n 'upload.retry': '重新上传',\n 'upload.remove': '移除',\n 'upload.preview': '预览',\n};\n","import { enUS } from './locales/en-us.js';\nimport { zhCN } from './locales/zh-cn.js';\nimport type { WcPartialTranslations, WcTranslations } from './types.js';\n\nexport type { WcPartialTranslations, WcTranslations } from './types.js';\n\n/** 语言切换事件名,LocalizeController 监听此事件触发组件重渲染 */\nexport const LANGUAGE_CHANGE_EVENT = 'wc-language-change';\n\nconst registry = new Map<string, WcTranslations>([\n ['zh-CN', { ...zhCN }],\n ['en-US', { ...enUS }],\n]);\n\nlet currentLocale = 'zh-CN';\n\n/**\n * 注册或合并语言包。同名语言会做浅合并(可覆盖内置文案)。\n * @example registerLocale('ja-JP', { 'dialog.confirm': '確認', 'dialog.cancel': 'キャンセル' })\n */\nexport function registerLocale(name: string, translations: WcPartialTranslations): void {\n const existing = registry.get(name);\n registry.set(name, Object.assign({}, existing, translations));\n if (name === currentLocale) {\n dispatchLanguageChange();\n }\n}\n\n/** 设置全局语言(BCP 47 格式,如 'zh-CN' / 'en-US'),未注册时回退到基础语言匹配 */\nexport function setLocale(name: string): void {\n if (!/^[a-zA-Z]{2,3}(-[a-zA-Z0-9]+)*$/.test(name)) {\n throw new Error(`[wc] 无效的语言标识: \"${name}\",需符合 BCP 47 格式,如 zh-CN`);\n }\n if (name === currentLocale) {\n return;\n }\n currentLocale = name;\n dispatchLanguageChange();\n}\n\nexport function getLocale(): string {\n return currentLocale;\n}\n\n/** 解析可用的已注册语言:精确匹配 -> 基础语言匹配 -> 默认语言 */\nexport function resolveLocale(name: string): string {\n if (registry.has(name)) {\n return name;\n }\n const base = name.split('-')[0]?.toLowerCase();\n for (const key of registry.keys()) {\n if (key.split('-')[0]?.toLowerCase() === base) {\n return key;\n }\n }\n return 'zh-CN';\n}\n\n/** 取文案:当前语言 -> 默认语言 -> key 本身,并做 {var} 插值 */\nexport function getTerm(\n localeName: string,\n key: string,\n vars?: Record<string, string | number>,\n): string {\n const messages = registry.get(resolveLocale(localeName));\n const fallback = registry.get('zh-CN');\n let text = messages?.[key] ?? fallback?.[key] ?? key;\n if (vars) {\n text = text.replace(/\\{(\\w+)\\}/g, (match, varName: string) =>\n varName in vars ? String(vars[varName]) : match,\n );\n }\n return text;\n}\n\nexport function getRegisteredLocales(): string[] {\n return [...registry.keys()];\n}\n\nfunction dispatchLanguageChange(): void {\n document.dispatchEvent(\n new CustomEvent(LANGUAGE_CHANGE_EVENT, {\n detail: { locale: currentLocale },\n bubbles: true,\n composed: true,\n }),\n );\n}\n","import type { ReactiveController, ReactiveElement } from 'lit';\nimport { getLocale, getTerm, LANGUAGE_CHANGE_EVENT, resolveLocale } from './localize.js';\n\n/**\n * 组件国际化控制器。\n * 文案解析优先级:元素 lang 属性 > 全局 setLocale > 默认语言 zh-CN。\n * 全局语言切换时自动触发宿主组件重渲染。\n *\n * @example\n * ```ts\n * class WcSelect extends LitElement {\n * private localize = new LocalizeController(this);\n * render() {\n * return html`<span>${this.localize.term('select.placeholder')}</span>`;\n * }\n * }\n * ```\n */\nexport class LocalizeController implements ReactiveController {\n private host: ReactiveElement;\n\n constructor(host: ReactiveElement) {\n this.host = host;\n host.addController(this);\n }\n\n hostConnected(): void {\n document.addEventListener(LANGUAGE_CHANGE_EVENT, this.handleLanguageChange);\n }\n\n hostDisconnected(): void {\n document.removeEventListener(LANGUAGE_CHANGE_EVENT, this.handleLanguageChange);\n }\n\n /** 取文案,支持 {var} 插值 */\n term(key: string, vars?: Record<string, string | number>): string {\n return getTerm(this.resolvedLocale, key, vars);\n }\n\n /** 按当前语言格式化日期 */\n date(value: Date | number, options?: Intl.DateTimeFormatOptions & { locale?: string }): string {\n const { locale: localeOverride, ...formatOptions } = options ?? {};\n return new Intl.DateTimeFormat(localeOverride ?? this.resolvedLocale, formatOptions).format(\n value,\n );\n }\n\n /** 按当前语言格式化数字 */\n number(value: number, options?: Intl.NumberFormatOptions & { locale?: string }): string {\n const { locale: localeOverride, ...formatOptions } = options ?? {};\n return new Intl.NumberFormat(localeOverride ?? this.resolvedLocale, formatOptions).format(\n value,\n );\n }\n\n /** 元素 lang 属性优先,其次全局语言 */\n private get resolvedLocale(): string {\n const lang = (this.host as HTMLElement).getAttribute('lang');\n return lang ? resolveLocale(lang) : getLocale();\n }\n\n private handleLanguageChange = (): void => {\n this.host.requestUpdate();\n };\n}\n","import { css } from 'lit';\n\nexport const inputStyles = css`\n :host {\n display: inline-block;\n width: 240px;\n\n /* component 层令牌 */\n --wc-input-height: 32px;\n --wc-input-padding-x: var(--wc-space-2);\n --wc-input-font-size: var(--wc-font-size-medium);\n --wc-input-radius: var(--wc-radius-medium);\n }\n\n :host([size='small']) {\n --wc-input-height: 24px;\n --wc-input-padding-x: var(--wc-space-1);\n --wc-input-font-size: var(--wc-font-size-small);\n }\n\n :host([size='large']) {\n --wc-input-height: 40px;\n --wc-input-padding-x: var(--wc-space-3);\n --wc-input-font-size: var(--wc-font-size-large);\n }\n\n .input {\n display: inline-flex;\n align-items: center;\n gap: var(--wc-space-1);\n width: 100%;\n height: var(--wc-input-height);\n padding: 0 var(--wc-input-padding-x);\n background-color: var(--wc-color-bg-container);\n border: 1px solid var(--wc-color-border);\n border-radius: var(--wc-input-radius);\n transition:\n border-color var(--wc-duration-fast) var(--wc-easing-standard),\n box-shadow var(--wc-duration-fast) var(--wc-easing-standard),\n background-color var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n /* 焦点态:外层容器统一呈现,内层去掉原生 outline 避免双重 */\n .input:focus-within {\n border-color: var(--wc-color-primary);\n box-shadow: 0 0 0 2px var(--wc-color-focus-ring);\n }\n\n .inner {\n flex: 1;\n min-width: 0;\n height: 100%;\n font-family: inherit;\n font-size: var(--wc-input-font-size);\n color: var(--wc-color-text);\n background: transparent;\n border: none;\n outline: none;\n caret-color: var(--wc-color-primary);\n }\n\n .inner::placeholder {\n color: var(--wc-color-text-placeholder);\n }\n\n .inner:disabled {\n cursor: not-allowed;\n }\n\n .affix {\n display: inline-flex;\n align-items: center;\n color: var(--wc-color-text-placeholder);\n flex-shrink: 0;\n }\n\n .affix[hidden] {\n display: none;\n }\n\n .clear {\n width: 16px;\n height: 16px;\n justify-content: center;\n padding: 0;\n border: none;\n border-radius: var(--wc-radius-circle);\n background: transparent;\n color: var(--wc-color-text-placeholder);\n cursor: pointer;\n }\n\n /* wc-icon 的 :host 自带 text 色,这里让叉号跟随按钮的灰阶 */\n .clear wc-icon {\n color: inherit;\n }\n\n .clear:hover {\n color: var(--wc-color-text-secondary);\n }\n\n /* ---- 校验状态 ---- */\n :host([status='success']) .input {\n border-color: var(--wc-color-success);\n }\n\n :host([status='warning']) .input {\n border-color: var(--wc-color-warning);\n }\n\n :host([status='error']) .input {\n border-color: var(--wc-color-error);\n }\n\n :host([status='error']) .input:focus-within {\n border-color: var(--wc-color-error);\n box-shadow: 0 0 0 2px var(--wc-color-error-light);\n }\n\n /* ---- 禁用 / 只读 ---- */\n :host([disabled]) .input {\n background-color: var(--wc-color-bg-disabled);\n border-color: transparent;\n cursor: not-allowed;\n }\n\n :host([disabled]) .inner {\n color: var(--wc-color-text-disabled);\n }\n\n :host([readonly]) .input {\n border-style: dashed;\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { FormAssociatedMixin } from '../../common/form-associated-mixin';\nimport { LocalizeController } from '../../i18n/localize-controller';\nimport '../icon/wc-icon.js';\nimport { inputStyles } from './wc-input.styles';\n\nexport type wcInputSize = 'small' | 'medium' | 'large';\nexport type wcInputStatus = 'default' | 'success' | 'warning' | 'error';\n\n/**\n * 输入框\n *\n * @slot prefix - 前置内容(图标、文字等)\n * @slot suffix - 后置内容(清除按钮之外的区域)\n * @csspart base - 外层容器\n * @csspart input - 原生输入框\n * @csspart clear-button - 清除按钮\n * @cssprop --wc-input-height - 输入框高度\n * @fires wc-input - 输入时触发,detail.value\n * @fires wc-change - 值变更提交时触发(失焦/回车),detail.value\n * @fires wc-clear - 点击清除按钮后触发\n */\nexport class wcInput extends FormAssociatedMixin(LitElement) {\n static styles = [baseStyles, inputStyles];\n\n private _value = '';\n\n /** 输入框的值(响应式属性,同时作为表单值提交) */\n @property()\n get value(): string {\n return this._value;\n }\n\n set value(v: string) {\n const old = this._value;\n this._value = v ?? '';\n this.requestUpdate('value', old);\n }\n\n /** 输入框类型(text/password/tel/url/search 等原生类型) */\n @property() type = 'text';\n\n /** 尺寸 */\n @property({ reflect: true }) size: wcInputSize = 'medium';\n\n /** 占位提示 */\n @property() placeholder = '';\n\n /** 无障碍标签(等价原生 aria-label) */\n @property() label = '';\n\n /** 最大输入长度 */\n @property({ type: Number }) maxlength?: number;\n\n /** 只读 */\n @property({ type: Boolean, reflect: true }) readonly = false;\n\n /** 显示清除按钮(有值且非禁用/只读时) */\n @property({ type: Boolean, reflect: true }) clearable = false;\n\n /** 校验状态(影响边框色) */\n @property({ reflect: true }) status: wcInputStatus = 'default';\n\n private localize = new LocalizeController(this);\n\n override get defaultValue(): unknown {\n return this.getAttribute('value') ?? '';\n }\n\n protected override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (changed.has('value')) {\n this.internals.setFormValue(this.value || null);\n }\n }\n\n override formResetCallback(): void {\n super.formResetCallback();\n this.internals.setFormValue(this.value || null);\n }\n\n private handleInput(e: Event): void {\n const target = e.target as HTMLInputElement;\n this.value = target.value;\n this.dispatchEvent(\n new CustomEvent('wc-input', {\n detail: { value: this.value },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private handleChange(): void {\n this.dispatchEvent(\n new CustomEvent('wc-change', {\n detail: { value: this.value },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private handleClear(e: MouseEvent): void {\n // 阻止 mousedown 导致 input 失焦\n e.preventDefault();\n this.value = '';\n this.dispatchEvent(new CustomEvent('wc-clear', { bubbles: true, composed: true }));\n this.dispatchEvent(\n new CustomEvent('wc-change', { detail: { value: '' }, bubbles: true, composed: true }),\n );\n this.requestUpdate();\n // 清除后保持焦点\n this.shadowRoot!.querySelector('input')?.focus();\n }\n\n render() {\n const showClear = this.clearable && this.value && !this.disabled && !this.readonly;\n return html`\n <div class=\"input\" part=\"base\">\n <span class=\"affix prefix\" part=\"prefix\" ?hidden=${!this._hasPrefix}>\n <slot name=\"prefix\" @slotchange=${this._onPrefixSlotChange}></slot>\n </span>\n <input\n part=\"input\"\n class=\"inner\"\n .value=${this.value}\n type=${this.type}\n ?disabled=${this.disabled}\n ?readonly=${this.readonly}\n placeholder=${this.placeholder}\n maxlength=${this.maxlength ?? -1}\n aria-label=${this.label || undefined}\n @input=${this.handleInput}\n @change=${this.handleChange}\n />\n ${\n showClear\n ? html`\n <button\n type=\"button\"\n class=\"affix clear\"\n part=\"clear-button\"\n tabindex=\"-1\"\n aria-label=${this.localize.term('input.clear')}\n @mousedown=${this.handleClear}\n >\n <wc-icon name=\"close\"></wc-icon>\n </button>\n `\n : ''\n }\n <span class=\"affix suffix\" part=\"suffix\" ?hidden=${!this._hasSuffix}>\n <slot name=\"suffix\" @slotchange=${this._onSuffixSlotChange}></slot>\n </span>\n </div>\n `;\n }\n\n private _hasPrefix = false;\n private _hasSuffix = false;\n\n private _onPrefixSlotChange(e: Event): void {\n this._hasPrefix = (e.target as HTMLSlotElement).assignedElements({ flatten: true }).length > 0;\n this.requestUpdate();\n }\n\n private _onSuffixSlotChange(e: Event): void {\n this._hasSuffix = (e.target as HTMLSlotElement).assignedElements({ flatten: true }).length > 0;\n this.requestUpdate();\n }\n}\n\nif (!customElements.get('wc-input')) {\n customElements.define('wc-input', wcInput);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-input': wcInput;\n }\n}\n","import { css } from 'lit';\n\nexport const textareaStyles = css`\n :host {\n display: inline-block;\n width: 320px;\n\n /* component 层令牌 */\n --wc-textarea-min-height: 80px;\n --wc-textarea-padding-y: var(--wc-space-2);\n --wc-textarea-padding-x: var(--wc-space-2);\n --wc-textarea-font-size: var(--wc-font-size-medium);\n --wc-textarea-radius: var(--wc-radius-medium);\n }\n\n .textarea {\n position: relative;\n display: inline-flex;\n width: 100%;\n min-height: var(--wc-textarea-min-height);\n background-color: var(--wc-color-bg-container);\n border: 1px solid var(--wc-color-border);\n border-radius: var(--wc-textarea-radius);\n transition:\n border-color var(--wc-duration-fast) var(--wc-easing-standard),\n box-shadow var(--wc-duration-fast) var(--wc-easing-standard),\n background-color var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .textarea:focus-within {\n border-color: var(--wc-color-primary);\n box-shadow: 0 0 0 2px var(--wc-color-focus-ring);\n }\n\n .inner {\n flex: 1;\n width: 100%;\n padding: var(--wc-textarea-padding-y) var(--wc-textarea-padding-x);\n font-family: inherit;\n font-size: var(--wc-textarea-font-size);\n line-height: var(--wc-line-height-base);\n color: var(--wc-color-text);\n background: transparent;\n border: none;\n outline: none;\n resize: vertical;\n caret-color: var(--wc-color-primary);\n }\n\n /* autosize 时接管高度,禁用手动拉伸 */\n :host([autosize]) .inner {\n resize: none;\n overflow: hidden;\n }\n\n .inner::placeholder {\n color: var(--wc-color-text-placeholder);\n }\n\n .inner:disabled {\n cursor: not-allowed;\n }\n\n .count {\n position: absolute;\n right: var(--wc-textarea-padding-x);\n bottom: var(--wc-textarea-padding-y);\n font-size: var(--wc-font-size-small);\n color: var(--wc-color-text-placeholder);\n background: var(--wc-color-bg-container);\n pointer-events: none;\n }\n\n :host([status='success']) .textarea {\n border-color: var(--wc-color-success);\n }\n\n :host([status='warning']) .textarea {\n border-color: var(--wc-color-warning);\n }\n\n :host([status='error']) .textarea {\n border-color: var(--wc-color-error);\n }\n\n :host([status='error']) .textarea:focus-within {\n border-color: var(--wc-color-error);\n box-shadow: 0 0 0 2px var(--wc-color-error-light);\n }\n\n :host([disabled]) .textarea {\n background-color: var(--wc-color-bg-disabled);\n border-color: transparent;\n cursor: not-allowed;\n }\n\n :host([disabled]) .inner {\n color: var(--wc-color-text-disabled);\n }\n\n :host([readonly]) .textarea {\n border-style: dashed;\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { FormAssociatedMixin } from '../../common/form-associated-mixin';\nimport '../icon/wc-icon.js';\nimport { textareaStyles } from './wc-textarea.styles';\n\nexport type wcTextareaStatus = 'default' | 'success' | 'warning' | 'error';\n\n/**\n * 多行文本框\n *\n * @csspart base - 外层容器\n * @csspart textarea - 原生多行输入框\n * @csspart count - 字数统计\n * @cssprop --wc-textarea-min-height - 最小高度\n * @fires wc-input - 输入时触发,detail.value\n * @fires wc-change - 值变更提交时触发(失焦),detail.value\n */\nexport class wcTextarea extends FormAssociatedMixin(LitElement) {\n static styles = [baseStyles, textareaStyles];\n\n private _value = '';\n\n /** 文本框的值(响应式属性,同时作为表单值提交) */\n @property()\n get value(): string {\n return this._value;\n }\n\n set value(v: string) {\n const old = this._value;\n this._value = v ?? '';\n this.requestUpdate('value', old);\n }\n\n /** 占位提示 */\n @property() placeholder = '';\n\n /** 无障碍标签(等价原生 aria-label) */\n @property() label = '';\n\n /** 最大输入长度,设置后显示字数统计 */\n @property({ type: Number }) maxlength?: number;\n\n /** 默认行数(autosize 关闭时生效) */\n @property({ type: Number }) rows = 3;\n\n /** 自动按内容调整高度 */\n @property({ type: Boolean, reflect: true }) autosize = false;\n\n /** 只读 */\n @property({ type: Boolean, reflect: true }) readonly = false;\n\n /** 校验状态(影响边框色) */\n @property({ reflect: true }) status: wcTextareaStatus = 'default';\n\n override get defaultValue(): unknown {\n return this.getAttribute('value') ?? '';\n }\n\n protected override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (changed.has('value')) {\n this.internals.setFormValue(this.value || null);\n }\n if (changed.has('value') && this.autosize) {\n this.autoResize();\n }\n }\n\n override formResetCallback(): void {\n super.formResetCallback();\n this.internals.setFormValue(this.value || null);\n }\n\n private handleInput(e: Event): void {\n const target = e.target as HTMLTextAreaElement;\n this.value = target.value;\n this.dispatchEvent(\n new CustomEvent('wc-input', {\n detail: { value: this.value },\n bubbles: true,\n composed: true,\n }),\n );\n if (this.autosize) {\n this.autoResize();\n }\n }\n\n private handleChange(): void {\n this.dispatchEvent(\n new CustomEvent('wc-change', {\n detail: { value: this.value },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n /** 按内容自适应高度:先回到 auto 再取 scrollHeight */\n private autoResize(): void {\n const ta = this.shadowRoot!.querySelector('textarea');\n if (!ta) return;\n ta.style.height = 'auto';\n ta.style.height = `${ta.scrollHeight}px`;\n }\n\n render() {\n return html`\n <div class=\"textarea\" part=\"base\">\n <textarea\n part=\"textarea\"\n class=\"inner\"\n .value=${this.value}\n rows=${this.rows}\n ?disabled=${this.disabled}\n ?readonly=${this.readonly}\n placeholder=${this.placeholder}\n maxlength=${this.maxlength ?? -1}\n aria-label=${this.label || undefined}\n @input=${this.handleInput}\n @change=${this.handleChange}\n ></textarea>\n ${\n this.maxlength\n ? html`<span class=\"count\" part=\"count\">${this.value.length}/${this.maxlength}</span>`\n : ''\n }\n </div>\n `;\n }\n}\n\nif (!customElements.get('wc-textarea')) {\n customElements.define('wc-textarea', wcTextarea);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-textarea': wcTextarea;\n }\n}\n","import { css } from 'lit';\n\nexport const checkboxStyles = css`\n :host {\n display: inline-block;\n\n /* component 层令牌 */\n --wc-checkbox-size: 16px;\n --wc-checkbox-radius: var(--wc-radius-small);\n }\n\n .checkbox {\n display: inline-flex;\n align-items: center;\n gap: var(--wc-space-2);\n font-size: var(--wc-font-size-medium);\n color: var(--wc-color-text);\n cursor: pointer;\n user-select: none;\n }\n\n /* 原生 input 隐藏但保持可聚焦(键盘空格切换) */\n .native {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: 0;\n opacity: 0;\n pointer-events: none;\n }\n\n .box {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wc-checkbox-size);\n height: var(--wc-checkbox-size);\n background-color: var(--wc-color-bg-container);\n border: 1px solid var(--wc-color-border-strong);\n border-radius: var(--wc-checkbox-radius);\n color: var(--wc-color-text-anti);\n flex-shrink: 0;\n transition:\n background-color var(--wc-duration-fast) var(--wc-easing-standard),\n border-color var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .check {\n width: 12px;\n height: 12px;\n opacity: 0;\n transform: scale(0.5);\n transition:\n opacity var(--wc-duration-fast) var(--wc-easing-standard),\n transform var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .dash {\n position: absolute;\n width: 8px;\n height: 2px;\n border-radius: 1px;\n background: currentColor;\n opacity: 0;\n transform: scale(0.5);\n transition:\n opacity var(--wc-duration-fast) var(--wc-easing-standard),\n transform var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n /* 键盘焦点环 */\n .native:focus-visible + .box {\n box-shadow: 0 0 0 2px var(--wc-color-focus-ring);\n }\n\n /* 选中态 */\n :host([checked]) .box {\n background-color: var(--wc-color-primary);\n border-color: var(--wc-color-primary);\n }\n\n :host([checked]) .check {\n opacity: 1;\n transform: scale(1);\n }\n\n /* 半选态(优先于选中态图标) */\n :host([indeterminate]) .box {\n background-color: var(--wc-color-primary);\n border-color: var(--wc-color-primary);\n }\n\n :host([indeterminate]) .check {\n opacity: 0;\n }\n\n :host([indeterminate]) .dash {\n opacity: 1;\n transform: scale(1);\n }\n\n /* 悬停 */\n .checkbox:hover .box:not(.native:disabled + .box) {\n border-color: var(--wc-color-primary);\n }\n\n /* 禁用 */\n :host([disabled]) .checkbox {\n cursor: not-allowed;\n color: var(--wc-color-text-disabled);\n }\n\n :host([disabled]) .box {\n background-color: var(--wc-color-bg-disabled);\n border-color: var(--wc-color-border);\n }\n\n :host([disabled][checked]) .box,\n :host([disabled][indeterminate]) .box {\n background-color: var(--wc-color-border);\n border-color: var(--wc-color-border);\n color: var(--wc-color-text-disabled);\n }\n\n .label {\n line-height: var(--wc-line-height-base);\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { FormAssociatedMixin } from '../../common/form-associated-mixin';\nimport { checkboxStyles } from './wc-checkbox.styles';\n\n/**\n * 复选框\n *\n * @slot - 标签文本\n * @csspart base - 外层容器\n * @csspart box - 方框指示器\n * @csspart label - 标签文本容器\n * @fires wc-change - 选中状态变化时触发,detail.checked / detail.value\n */\nexport class wcCheckbox extends FormAssociatedMixin(LitElement) {\n static styles = [baseStyles, checkboxStyles];\n\n /** 选中状态 */\n @property({ type: Boolean, reflect: true }) checked = false;\n\n /** 半选状态(样式上的不确定态,不改变 checked) */\n @property({ type: Boolean, reflect: true }) indeterminate = false;\n\n /** 选中时提交到表单的值 */\n @property() value = 'on';\n\n /** 无障碍标签(无默认插槽文本时使用) */\n @property() label = '';\n\n /** 表单重置基准:构造时的初始选中态 */\n private initialChecked = false;\n\n constructor() {\n super();\n this.initialChecked = this.hasAttribute('checked');\n }\n\n override get defaultValue(): unknown {\n return this.initialChecked ? this.value : null;\n }\n\n protected override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (changed.has('checked') || changed.has('value')) {\n this.internals.setFormValue(this.checked ? this.value : null);\n }\n }\n\n override formResetCallback(): void {\n super.formResetCallback();\n this.checked = this.initialChecked;\n this.internals.setFormValue(this.checked ? this.value : null);\n }\n\n private handleChange(e: Event): void {\n const input = e.target as HTMLInputElement;\n // 用户交互后解除半选态\n this.indeterminate = false;\n this.checked = input.checked;\n this.dispatchEvent(\n new CustomEvent('wc-change', {\n detail: { checked: this.checked, value: this.value },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n render() {\n return html`\n <label class=\"checkbox\" part=\"base\">\n <input\n type=\"checkbox\"\n class=\"native\"\n .checked=${this.checked}\n .indeterminate=${this.indeterminate}\n ?disabled=${this.disabled}\n aria-label=${this.label || undefined}\n @change=${this.handleChange}\n />\n <span class=\"box\" part=\"box\" aria-hidden=\"true\">\n <svg class=\"check\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M3 8.5L6.5 12L13 4.5\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n <span class=\"dash\"></span>\n </span>\n <span class=\"label\" part=\"label\"><slot></slot></span>\n </label>\n `;\n }\n}\n\nif (!customElements.get('wc-checkbox')) {\n customElements.define('wc-checkbox', wcCheckbox);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-checkbox': wcCheckbox;\n }\n}\n","import { css } from 'lit';\n\nexport const radioStyles = css`\n :host {\n display: inline-block;\n\n /* component 层令牌 */\n --wc-radio-size: 16px;\n }\n\n .radio {\n display: inline-flex;\n align-items: center;\n gap: var(--wc-space-2);\n font-size: var(--wc-font-size-medium);\n color: var(--wc-color-text);\n cursor: pointer;\n user-select: none;\n }\n\n /* 原生 input 隐藏但保持可聚焦(键盘方向键切换) */\n .native {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: 0;\n opacity: 0;\n pointer-events: none;\n }\n\n .dot {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wc-radio-size);\n height: var(--wc-radio-size);\n background-color: var(--wc-color-bg-container);\n border: 1px solid var(--wc-color-border-strong);\n border-radius: var(--wc-radius-circle);\n flex-shrink: 0;\n transition: border-color var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .inner {\n width: calc(var(--wc-radio-size) / 2 - 1px);\n height: calc(var(--wc-radio-size) / 2 - 1px);\n border-radius: var(--wc-radius-circle);\n background-color: var(--wc-color-primary);\n opacity: 0;\n transform: scale(0);\n transition:\n opacity var(--wc-duration-fast) var(--wc-easing-standard),\n transform var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .native:focus-visible + .dot {\n box-shadow: 0 0 0 2px var(--wc-color-focus-ring);\n }\n\n :host([checked]) .dot {\n border-color: var(--wc-color-primary);\n }\n\n :host([checked]) .inner {\n opacity: 1;\n transform: scale(1);\n }\n\n .radio:hover .dot {\n border-color: var(--wc-color-primary);\n }\n\n :host([disabled]) .radio {\n cursor: not-allowed;\n color: var(--wc-color-text-disabled);\n }\n\n :host([disabled]) .dot {\n background-color: var(--wc-color-bg-disabled);\n border-color: var(--wc-color-border);\n }\n\n :host([disabled][checked]) .dot {\n border-color: var(--wc-color-border);\n }\n\n :host([disabled][checked]) .inner {\n background-color: var(--wc-color-text-disabled);\n }\n\n .label {\n line-height: var(--wc-line-height-base);\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { FormAssociatedMixin } from '../../common/form-associated-mixin';\nimport { radioStyles } from './wc-radio.styles';\n\n/**\n * 单选框。同名(name)的 wc-radio 在同一表单内自动互斥分组,\n * 分组行为由浏览器的 form-associated 单选机制保证。\n *\n * @slot - 标签文本\n * @csspart base - 外层容器\n * @csspart dot - 圆点指示器\n * @csspart label - 标签文本容器\n * @fires wc-change - 选中时触发,detail.value\n */\nexport class wcRadio extends FormAssociatedMixin(LitElement) {\n static styles = [baseStyles, radioStyles];\n\n /** 选中状态 */\n @property({ type: Boolean, reflect: true }) checked = false;\n\n /** 选中时提交到表单的值 */\n @property() value = '';\n\n /** 无障碍标签(无默认插槽文本时使用) */\n @property() label = '';\n\n /** 表单重置基准:构造时的初始选中态 */\n private initialChecked = false;\n\n constructor() {\n super();\n this.initialChecked = this.hasAttribute('checked');\n }\n\n override get defaultValue(): unknown {\n return this.initialChecked ? this.value : null;\n }\n\n protected override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (changed.has('checked') || changed.has('value')) {\n this.internals.setFormValue(this.checked ? this.value : null);\n }\n }\n\n override formResetCallback(): void {\n super.formResetCallback();\n this.checked = this.initialChecked;\n this.internals.setFormValue(this.checked ? this.value : null);\n }\n\n private handleChange(e: Event): void {\n const input = e.target as HTMLInputElement;\n this.checked = input.checked;\n this.dispatchEvent(\n new CustomEvent('wc-change', {\n detail: { value: this.value },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n render() {\n return html`\n <label class=\"radio\" part=\"base\">\n <input\n type=\"radio\"\n class=\"native\"\n .checked=${this.checked}\n ?disabled=${this.disabled}\n aria-label=${this.label || undefined}\n @change=${this.handleChange}\n />\n <span class=\"dot\" part=\"dot\" aria-hidden=\"true\"><span class=\"inner\"></span></span>\n <span class=\"label\" part=\"label\"><slot></slot></span>\n </label>\n `;\n }\n}\n\nif (!customElements.get('wc-radio')) {\n customElements.define('wc-radio', wcRadio);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-radio': wcRadio;\n }\n}\n","import { css } from 'lit';\n\nexport const switchStyles = css`\n :host {\n display: inline-block;\n\n /* component 层令牌 */\n --wc-switch-width: 40px;\n --wc-switch-height: 22px;\n --wc-switch-thumb: 18px;\n }\n\n .switch {\n display: inline-flex;\n align-items: center;\n gap: var(--wc-space-2);\n font-size: var(--wc-font-size-medium);\n color: var(--wc-color-text);\n cursor: pointer;\n user-select: none;\n }\n\n /* 原生 input 隐藏但保持可聚焦(键盘空格切换) */\n .native {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: 0;\n opacity: 0;\n pointer-events: none;\n }\n\n .track {\n position: relative;\n display: inline-flex;\n align-items: center;\n width: var(--wc-switch-width);\n height: var(--wc-switch-height);\n padding: 2px;\n background-color: var(--wc-color-gray-300);\n border-radius: var(--wc-radius-round);\n flex-shrink: 0;\n transition: background-color var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .thumb {\n width: var(--wc-switch-thumb);\n height: var(--wc-switch-thumb);\n border-radius: var(--wc-radius-circle);\n background-color: var(--wc-color-text-anti);\n box-shadow: var(--wc-shadow-1);\n transform: translateX(0);\n transition: transform var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .native:focus-visible + .track {\n box-shadow: 0 0 0 2px var(--wc-color-focus-ring);\n }\n\n :host([checked]) .track {\n background-color: var(--wc-color-primary);\n }\n\n :host([checked]) .thumb {\n transform: translateX(calc(var(--wc-switch-width) - var(--wc-switch-height)));\n }\n\n .switch:hover .track {\n background-color: var(--wc-color-gray-400);\n }\n\n :host([checked]) .switch:hover .track {\n background-color: var(--wc-color-primary-hover);\n }\n\n :host([disabled]) .switch {\n cursor: not-allowed;\n color: var(--wc-color-text-disabled);\n }\n\n :host([disabled]) .track {\n background-color: var(--wc-color-bg-disabled);\n }\n\n :host([disabled]) .thumb {\n background-color: var(--wc-color-gray-100);\n box-shadow: none;\n }\n\n .label {\n line-height: var(--wc-line-height-base);\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { FormAssociatedMixin } from '../../common/form-associated-mixin';\nimport { switchStyles } from './wc-switch.styles';\n\n/**\n * 开关\n *\n * @slot - 标签文本\n * @csspart base - 外层容器\n * @csspart track - 轨道\n * @csspart thumb - 滑块\n * @csspart label - 标签文本容器\n * @fires wc-change - 切换时触发,detail.checked\n */\nexport class wcSwitch extends FormAssociatedMixin(LitElement) {\n static styles = [baseStyles, switchStyles];\n\n /** 开启状态 */\n @property({ type: Boolean, reflect: true }) checked = false;\n\n /** 开启时提交到表单的值 */\n @property() checkedValue = 'on';\n\n /** 关闭时提交到表单的值(为空则不提交) */\n @property() uncheckedValue = '';\n\n /** 无障碍标签(无默认插槽文本时使用) */\n @property() label = '';\n\n /** 表单重置基准:构造时的初始状态 */\n private initialChecked = false;\n\n constructor() {\n super();\n this.initialChecked = this.hasAttribute('checked');\n }\n\n override get defaultValue(): unknown {\n return this.initialChecked ? this.checkedValue : this.uncheckedValue || null;\n }\n\n protected override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (changed.has('checked') || changed.has('checkedValue') || changed.has('uncheckedValue')) {\n this.internals.setFormValue(this.checked ? this.checkedValue : this.uncheckedValue || null);\n }\n }\n\n override formResetCallback(): void {\n super.formResetCallback();\n this.checked = this.initialChecked;\n this.internals.setFormValue(this.checked ? this.checkedValue : this.uncheckedValue || null);\n }\n\n private handleChange(e: Event): void {\n const input = e.target as HTMLInputElement;\n this.checked = input.checked;\n this.dispatchEvent(\n new CustomEvent('wc-change', {\n detail: { checked: this.checked },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n render() {\n return html`\n <label class=\"switch\" part=\"base\">\n <input\n type=\"checkbox\"\n role=\"switch\"\n class=\"native\"\n .checked=${this.checked}\n ?disabled=${this.disabled}\n aria-label=${this.label || undefined}\n @change=${this.handleChange}\n />\n <span class=\"track\" part=\"track\" aria-hidden=\"true\">\n <span class=\"thumb\" part=\"thumb\"></span>\n </span>\n <span class=\"label\" part=\"label\"><slot></slot></span>\n </label>\n `;\n }\n}\n\nif (!customElements.get('wc-switch')) {\n customElements.define('wc-switch', wcSwitch);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-switch': wcSwitch;\n }\n}\n","import { css } from 'lit';\n\nexport const optionStyles = css`\n :host {\n display: block;\n }\n\n .option {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--wc-space-2);\n padding: 0 var(--wc-space-3);\n height: 32px;\n font-size: var(--wc-font-size-medium);\n color: var(--wc-color-text);\n cursor: pointer;\n user-select: none;\n transition: background-color var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .text {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .check {\n width: 14px;\n height: 14px;\n color: var(--wc-color-primary);\n flex-shrink: 0;\n opacity: 0;\n }\n\n :host([selected]) .check {\n opacity: 1;\n }\n\n :host([selected]:not([active])) .text {\n color: var(--wc-color-primary);\n font-weight: var(--wc-font-weight-medium);\n }\n\n :host(:hover:not([disabled])) .option,\n :host([active]:not([disabled])) .option {\n background-color: var(--wc-color-bg-hover);\n }\n\n :host([disabled]) .option {\n color: var(--wc-color-text-disabled);\n cursor: not-allowed;\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { optionStyles } from './wc-option.styles';\n\n/**\n * 选项,必须作为 wc-select 的子元素使用。\n *\n * @slot - 选项文本\n * @csspart base - 选项根元素\n */\nexport class wcOption extends LitElement {\n static styles = [optionStyles];\n\n /** 选项值 */\n @property({ reflect: true }) value = '';\n\n /** 禁用 */\n @property({ type: Boolean, reflect: true }) disabled = false;\n\n /** 选中态(由 wc-select 管理,一般无需手动设置) */\n @property({ type: Boolean, reflect: true }) selected = false;\n\n /** 键盘导航高亮态(由 wc-select 管理) */\n @property({ type: Boolean, reflect: true }) active = false;\n\n /** 选项文本 */\n get label(): string {\n return (this.textContent ?? '').trim();\n }\n\n render() {\n return html`\n <div class=\"option\" part=\"base\" role=\"option\" aria-selected=${this.selected}>\n <span class=\"text\"><slot></slot></span>\n <svg class=\"check\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M3 8.5L6.5 12L13 4.5\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </div>\n `;\n }\n}\n\nif (!customElements.get('wc-option')) {\n customElements.define('wc-option', wcOption);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-option': wcOption;\n }\n}\n","import { css } from 'lit';\n\nexport const selectStyles = css`\n :host {\n display: inline-block;\n width: 240px;\n\n /* component 层令牌 */\n --wc-select-height: 32px;\n --wc-select-padding-x: var(--wc-space-2);\n --wc-select-font-size: var(--wc-font-size-medium);\n --wc-select-radius: var(--wc-radius-medium);\n --wc-select-panel-max-height: 280px;\n }\n\n :host([size='small']) {\n --wc-select-height: 24px;\n --wc-select-padding-x: var(--wc-space-1);\n --wc-select-font-size: var(--wc-font-size-small);\n }\n\n :host([size='large']) {\n --wc-select-height: 40px;\n --wc-select-padding-x: var(--wc-space-3);\n --wc-select-font-size: var(--wc-font-size-large);\n }\n\n .select {\n position: relative;\n display: inline-block;\n width: 100%;\n }\n\n .trigger {\n display: inline-flex;\n align-items: center;\n gap: var(--wc-space-1);\n width: 100%;\n height: var(--wc-select-height);\n padding: 0 var(--wc-select-padding-x);\n background-color: var(--wc-color-bg-container);\n border: 1px solid var(--wc-color-border);\n border-radius: var(--wc-select-radius);\n cursor: pointer;\n user-select: none;\n transition:\n border-color var(--wc-duration-fast) var(--wc-easing-standard),\n box-shadow var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n /* 与 input 的 focus-within 对齐:键盘聚焦或展开时均呈现焦点视觉 */\n .trigger:focus-visible,\n :host([open]) .trigger {\n outline: none;\n border-color: var(--wc-color-primary);\n box-shadow: 0 0 0 2px var(--wc-color-focus-ring);\n }\n\n .value {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--wc-select-font-size);\n color: var(--wc-color-text);\n }\n\n .value.placeholder {\n color: var(--wc-color-text-placeholder);\n }\n\n .arrow {\n font-size: 16px;\n color: var(--wc-color-text-placeholder);\n flex-shrink: 0;\n transition: transform var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n :host([open]) .arrow {\n transform: rotate(180deg);\n }\n\n .clear {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n font-size: 16px;\n color: var(--wc-color-text-placeholder);\n border-radius: var(--wc-radius-circle);\n flex-shrink: 0;\n opacity: 0;\n transition: opacity var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .clear:hover {\n color: var(--wc-color-text-secondary);\n }\n\n /* 悬停触发器时显示清除按钮 */\n .trigger:hover .clear,\n .trigger:focus-visible .clear {\n opacity: 1;\n }\n\n /* 有清除按钮时悬停隐藏箭头,避免拥挤 */\n .trigger:hover .clear + .arrow {\n display: none;\n }\n\n .panel {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n z-index: var(--wc-z-index-dropdown);\n width: 100%;\n max-height: var(--wc-select-panel-max-height);\n overflow-y: auto;\n padding: var(--wc-space-1) 0;\n background-color: var(--wc-color-bg-container);\n border: 1px solid var(--wc-color-border);\n border-radius: var(--wc-select-radius);\n box-shadow: var(--wc-shadow-2);\n }\n\n .panel[hidden] {\n display: none;\n }\n\n .empty {\n padding: var(--wc-space-4) var(--wc-space-3);\n font-size: var(--wc-font-size-medium);\n color: var(--wc-color-text-placeholder);\n text-align: center;\n }\n\n /* ---- 校验状态 ---- */\n :host([status='success']) .trigger {\n border-color: var(--wc-color-success);\n }\n\n :host([status='warning']) .trigger {\n border-color: var(--wc-color-warning);\n }\n\n :host([status='error']) .trigger {\n border-color: var(--wc-color-error);\n }\n\n :host([status='error']) .trigger:focus-visible,\n :host([status='error'][open]) .trigger {\n border-color: var(--wc-color-error);\n box-shadow: 0 0 0 2px var(--wc-color-error-light);\n }\n\n /* ---- 禁用 ---- */\n :host([disabled]) .trigger {\n background-color: var(--wc-color-bg-disabled);\n border-color: transparent;\n cursor: not-allowed;\n }\n\n :host([disabled]) .value {\n color: var(--wc-color-text-disabled);\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { FormAssociatedMixin } from '../../common/form-associated-mixin';\nimport { LocalizeController } from '../../i18n/localize-controller';\nimport '../icon/wc-icon.js';\nimport './wc-option.js';\nimport { selectStyles } from './wc-select.styles';\nimport type { wcOption } from './wc-option.js';\n\nexport type wcSelectSize = 'small' | 'medium' | 'large';\nexport type wcSelectStatus = 'default' | 'success' | 'warning' | 'error';\n\n/**\n * 选择器(单选)\n *\n * @slot - 默认插槽,放置 <wc-option>\n * @csspart base - 外层容器\n * @csspart trigger - 触发器\n * @csspart value - 选中文本\n * @csspart panel - 下拉面板\n * @cssprop --wc-select-height - 触发器高度\n * @fires wc-change - 选中值变化时触发,detail.value / detail.label\n * @fires wc-clear - 点击清除按钮后触发\n */\nexport class wcSelect extends FormAssociatedMixin(LitElement) {\n static styles = [baseStyles, selectStyles];\n\n private _value = '';\n\n /** 当前选中值 */\n @property()\n get value(): string {\n return this._value;\n }\n\n set value(v: string) {\n const old = this._value;\n this._value = v ?? '';\n this.requestUpdate('value', old);\n }\n\n /** 占位提示,默认取 i18n 文案 */\n @property() placeholder = '';\n\n /** 尺寸 */\n @property({ reflect: true }) size: wcSelectSize = 'medium';\n\n /** 校验状态(影响边框色) */\n @property({ reflect: true }) status: wcSelectStatus = 'default';\n\n /** 可清除 */\n @property({ type: Boolean, reflect: true }) clearable = false;\n\n /** 下拉面板是否展开(内部状态) */\n @property({ type: Boolean, reflect: true }) open = false;\n\n /** 键盘导航高亮索引(-1 表示无) */\n private activeIndex = -1;\n\n private localize = new LocalizeController(this);\n\n private uid = `wc-select-${Math.random().toString(36).slice(2, 8)}`;\n\n private assignedOptions: wcOption[] = [];\n\n constructor() {\n super();\n this.addEventListener('keydown', this.handleKeydown);\n }\n\n override get defaultValue(): unknown {\n return this.getAttribute('value') ?? '';\n }\n\n protected override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (changed.has('value')) {\n this.syncOptions();\n this.internals.setFormValue(this.value || null);\n }\n }\n\n override formResetCallback(): void {\n super.formResetCallback();\n this.value = String(this.defaultValue ?? '');\n this.internals.setFormValue(this.value || null);\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n document.addEventListener('click', this.onDocumentClick);\n }\n\n override disconnectedCallback(): void {\n document.removeEventListener('click', this.onDocumentClick);\n super.disconnectedCallback();\n }\n\n /** 面板中的选项列表 */\n private get enabledOptions(): wcOption[] {\n return this.assignedOptions.filter((o) => !o.disabled);\n }\n\n private get selectedLabel(): string {\n return this.assignedOptions.find((o) => o.value === this.value)?.label ?? '';\n }\n\n private get displayText(): string {\n return this.value\n ? this.selectedLabel\n : this.placeholder || this.localize.term('select.placeholder');\n }\n\n private onSlotChange(e: Event): void {\n this.assignedOptions = (e.target as HTMLSlotElement)\n .assignedElements()\n .filter((el): el is wcOption => el.tagName === 'WC-OPTION');\n // 为键盘导航分配 id\n this.assignedOptions.forEach((o, i) => o.setAttribute('id', `${this.uid}-opt-${i}`));\n this.syncOptions();\n this.requestUpdate();\n }\n\n private syncOptions(): void {\n for (const o of this.assignedOptions) {\n o.selected = !o.disabled && o.value === this.value;\n }\n }\n\n /* ---------- 开合 ---------- */\n\n private show(): void {\n if (this.disabled || this.open) return;\n this.open = true;\n // 高亮定位到已选中项,否则第一项\n const selectedIdx = this.enabledOptions.findIndex((o) => o.value === this.value);\n this.activeIndex = selectedIdx >= 0 ? selectedIdx : this.enabledOptions.length ? 0 : -1;\n this.scrollToActive();\n }\n\n private hide(): void {\n if (!this.open) return;\n this.open = false;\n this.activeIndex = -1;\n }\n\n private toggle(): void {\n if (this.open) {\n this.hide();\n } else {\n this.show();\n }\n }\n\n private onDocumentClick = (e: MouseEvent): void => {\n if (!(e.composedPath() as Array<EventTarget>).includes(this)) {\n this.hide();\n }\n };\n\n private onTriggerClick(): void {\n this.toggle();\n }\n\n private onPanelClick(e: MouseEvent): void {\n const opt = (e.target as Element).closest('wc-option') as wcOption | null;\n if (opt && !opt.disabled) {\n this.selectOption(opt);\n }\n }\n\n private selectOption(opt: wcOption): void {\n this.value = opt.value;\n this.hide();\n this.dispatchEvent(\n new CustomEvent('wc-change', {\n detail: { value: this.value, label: opt.label },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private handleClear(e: MouseEvent): void {\n e.preventDefault();\n e.stopPropagation();\n this.value = '';\n this.hide();\n this.dispatchEvent(new CustomEvent('wc-clear', { bubbles: true, composed: true }));\n this.dispatchEvent(\n new CustomEvent('wc-change', {\n detail: { value: '', label: '' },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n /* ---------- 键盘导航 ---------- */\n\n private handleKeydown = (e: KeyboardEvent): void => {\n if (this.disabled) return;\n switch (e.key) {\n case 'Enter':\n case ' ':\n e.preventDefault();\n if (this.open && this.activeIndex >= 0) {\n const opt = this.enabledOptions[this.activeIndex];\n if (opt) this.selectOption(opt);\n } else {\n this.show();\n }\n break;\n case 'Escape':\n e.preventDefault();\n this.hide();\n break;\n case 'ArrowDown':\n e.preventDefault();\n if (!this.open) {\n this.show();\n } else if (this.enabledOptions.length) {\n this.activeIndex = (this.activeIndex + 1) % this.enabledOptions.length;\n this.scrollToActive();\n }\n break;\n case 'ArrowUp':\n e.preventDefault();\n if (!this.open) {\n this.show();\n } else if (this.enabledOptions.length) {\n const n = this.enabledOptions.length;\n this.activeIndex = (this.activeIndex - 1 + n) % n;\n this.scrollToActive();\n }\n break;\n case 'Home':\n if (this.open && this.enabledOptions.length) {\n e.preventDefault();\n this.activeIndex = 0;\n this.scrollToActive();\n }\n break;\n case 'End':\n if (this.open && this.enabledOptions.length) {\n e.preventDefault();\n this.activeIndex = this.enabledOptions.length - 1;\n this.scrollToActive();\n }\n break;\n case 'Tab':\n this.hide();\n break;\n }\n };\n\n private scrollToActive(): void {\n // 同步高亮态到选项元素\n for (const o of this.assignedOptions) {\n o.active = false;\n }\n const active = this.enabledOptions[this.activeIndex];\n if (active) active.active = true;\n this.updateComplete.then(() => {\n // jsdom 未实现 scrollIntoView\n if (active && typeof active.scrollIntoView === 'function') {\n active.scrollIntoView({ block: 'nearest' });\n }\n });\n }\n\n render() {\n const activeOption = this.activeIndex >= 0 ? this.enabledOptions[this.activeIndex] : undefined;\n const activeId = activeOption\n ? `${this.uid}-opt-${this.assignedOptions.indexOf(activeOption)}`\n : '';\n const showClear = this.clearable && this.value && !this.disabled;\n return html`\n <div class=\"select\" part=\"base\">\n <div\n class=\"trigger\"\n part=\"trigger\"\n role=\"combobox\"\n tabindex=${this.disabled ? -1 : 0}\n aria-haspopup=\"listbox\"\n aria-expanded=${this.open}\n aria-disabled=${this.disabled}\n aria-controls=${this.open ? `${this.uid}-panel` : undefined}\n aria-activedescendant=${this.open && activeId ? activeId : undefined}\n @click=${this.onTriggerClick}\n >\n <span class=\"value ${this.value ? '' : 'placeholder'}\" part=\"value\"\n >${this.displayText}</span\n >\n ${\n showClear\n ? html`\n <span\n class=\"clear\"\n part=\"clear-button\"\n role=\"button\"\n aria-label=${this.localize.term('input.clear')}\n @mousedown=${(e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n @click=${this.handleClear}\n >\n <wc-icon name=\"close\"></wc-icon>\n </span>\n `\n : ''\n }\n <wc-icon name=\"chevron-down\" class=\"arrow\"></wc-icon>\n </div>\n <div\n class=\"panel\"\n part=\"panel\"\n id=\"${this.uid}-panel\"\n role=\"listbox\"\n ?hidden=${!this.open}\n @click=${this.onPanelClick}\n >\n <slot @slotchange=${this.onSlotChange}></slot>\n ${\n this.assignedOptions.length === 0\n ? html`<div class=\"empty\">${this.localize.term('select.empty')}</div>`\n : ''\n }\n </div>\n </div>\n `;\n }\n}\n\nif (!customElements.get('wc-select')) {\n customElements.define('wc-select', wcSelect);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-select': wcSelect;\n }\n}\n","import { css } from 'lit';\n\nexport const sliderStyles = css`\n :host {\n display: inline-block;\n width: 240px;\n\n /* component 层令牌 */\n --wc-slider-height: 20px;\n --wc-slider-track-height: 4px;\n --wc-slider-thumb-size: 16px;\n }\n\n .slider {\n position: relative;\n display: inline-flex;\n align-items: center;\n width: 100%;\n height: var(--wc-slider-height);\n touch-action: none;\n }\n\n .track {\n width: 100%;\n height: var(--wc-slider-track-height);\n background-color: var(--wc-color-gray-200);\n border-radius: var(--wc-radius-round);\n overflow: hidden;\n }\n\n .fill {\n height: 100%;\n background-color: var(--wc-color-primary);\n transition: width var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .thumb {\n position: absolute;\n top: 50%;\n width: var(--wc-slider-thumb-size);\n height: var(--wc-slider-thumb-size);\n background-color: var(--wc-color-bg-container);\n border: 2px solid var(--wc-color-primary);\n border-radius: var(--wc-radius-circle);\n box-shadow: var(--wc-shadow-1);\n box-sizing: border-box;\n pointer-events: none;\n transform: translate(-50%, -50%);\n transition: left var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n /* 原生 range 覆盖整个区域接收交互,视觉隐藏 */\n .native {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n margin: 0;\n opacity: 0;\n cursor: pointer;\n }\n\n .native:focus-visible ~ .thumb {\n box-shadow: 0 0 0 2px var(--wc-color-focus-ring);\n }\n\n .native:disabled {\n cursor: not-allowed;\n }\n\n :host([disabled]) .track {\n background-color: var(--wc-color-bg-disabled);\n }\n\n :host([disabled]) .fill {\n background-color: var(--wc-color-border);\n }\n\n :host([disabled]) .thumb {\n border-color: var(--wc-color-border);\n box-shadow: none;\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { FormAssociatedMixin } from '../../common/form-associated-mixin';\nimport { sliderStyles } from './wc-slider.styles';\n\n/**\n * 滑块(单值)。键盘导航与 a11y 由隐藏的原生 input[type=range] 提供\n * (方向键 ±step、PageUp/Down 翻页、Home/End 边界)。\n *\n * @csspart base - 外层容器\n * @csspart track - 轨道\n * @csspart fill - 已滑过部分\n * @csspart thumb - 滑块按钮\n * @fires wc-input - 拖动过程中持续触发,detail.value\n * @fires wc-change - 松手提交时触发,detail.value\n */\nexport class wcSlider extends FormAssociatedMixin(LitElement) {\n static styles = [baseStyles, sliderStyles];\n\n private _value = 0;\n\n /** 当前值 */\n @property({ type: Number })\n get value(): number {\n return this._value;\n }\n\n set value(v: number) {\n const old = this._value;\n this._value = this.clamp(v);\n this.requestUpdate('value', old);\n }\n\n /** 最小值 */\n @property({ type: Number }) min = 0;\n\n /** 最大值 */\n @property({ type: Number }) max = 100;\n\n /** 步长 */\n @property({ type: Number }) step = 1;\n\n /** 无障碍标签 */\n @property() label = '';\n\n /** 按 step 取整并夹在 [min, max] 区间 */\n private clamp(v: number): number {\n if (Number.isNaN(v)) return this._value;\n const stepped = Math.round((v - this.min) / this.step) * this.step + this.min;\n const fixed = Number(stepped.toFixed(10));\n return Math.min(this.max, Math.max(this.min, fixed));\n }\n\n private get percent(): number {\n if (this.max === this.min) return 0;\n return ((this.value - this.min) / (this.max - this.min)) * 100;\n }\n\n override get defaultValue(): unknown {\n const attr = this.getAttribute('value');\n return attr ? Number(attr) : 0;\n }\n\n protected override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (changed.has('value')) {\n this.internals.setFormValue(String(this.value));\n }\n }\n\n override formResetCallback(): void {\n super.formResetCallback();\n this.value = Number(this.defaultValue ?? 0);\n this.internals.setFormValue(String(this.value));\n }\n\n private handleInput(e: Event): void {\n const input = e.target as HTMLInputElement;\n this.value = Number(input.value);\n this.dispatchEvent(\n new CustomEvent('wc-input', {\n detail: { value: this.value },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private handleChange(): void {\n this.dispatchEvent(\n new CustomEvent('wc-change', {\n detail: { value: this.value },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n render() {\n return html`\n <div class=\"slider\" part=\"base\">\n <div class=\"track\" part=\"track\">\n <div class=\"fill\" part=\"fill\" style=\"width: ${this.percent}%\"></div>\n </div>\n <div class=\"thumb\" part=\"thumb\" style=\"left: ${this.percent}%\"></div>\n <input\n type=\"range\"\n class=\"native\"\n min=${this.min}\n max=${this.max}\n step=${this.step}\n .value=${String(this.value)}\n ?disabled=${this.disabled}\n aria-label=${this.label || undefined}\n @input=${this.handleInput}\n @change=${this.handleChange}\n />\n </div>\n `;\n }\n}\n\nif (!customElements.get('wc-slider')) {\n customElements.define('wc-slider', wcSlider);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-slider': wcSlider;\n }\n}\n","import { css } from 'lit';\n\nexport const inputNumberStyles = css`\n :host {\n display: inline-block;\n width: 144px;\n\n /* component 层令牌 */\n --wc-input-number-height: 32px;\n --wc-input-number-padding-x: var(--wc-space-2);\n --wc-input-number-font-size: var(--wc-font-size-medium);\n --wc-input-number-radius: var(--wc-radius-medium);\n --wc-input-number-step-width: 28px;\n }\n\n :host([size='small']) {\n --wc-input-number-height: 24px;\n --wc-input-number-padding-x: var(--wc-space-1);\n --wc-input-number-font-size: var(--wc-font-size-small);\n --wc-input-number-step-width: 24px;\n }\n\n :host([size='large']) {\n --wc-input-number-height: 40px;\n --wc-input-number-padding-x: var(--wc-space-3);\n --wc-input-number-font-size: var(--wc-font-size-large);\n --wc-input-number-step-width: 32px;\n }\n\n .number {\n display: flex;\n align-items: stretch;\n width: 100%;\n height: var(--wc-input-number-height);\n background-color: var(--wc-color-bg-container);\n border: 1px solid var(--wc-color-border);\n border-radius: var(--wc-input-number-radius);\n transition:\n border-color var(--wc-duration-fast) var(--wc-easing-standard),\n box-shadow var(--wc-duration-fast) var(--wc-easing-standard),\n background-color var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .number:focus-within {\n border-color: var(--wc-color-primary);\n box-shadow: 0 0 0 2px var(--wc-color-focus-ring);\n }\n\n .inner {\n flex: 1;\n min-width: 0;\n padding: 0 var(--wc-input-number-padding-x);\n font-family: inherit;\n font-size: var(--wc-input-number-font-size);\n color: var(--wc-color-text);\n text-align: center;\n background: transparent;\n border: none;\n outline: none;\n caret-color: var(--wc-color-primary);\n }\n\n :host([theme='column']) .inner,\n :host([theme='normal']) .inner {\n text-align: inherit;\n }\n\n .inner::placeholder {\n color: var(--wc-color-text-placeholder);\n }\n\n .inner:disabled {\n cursor: not-allowed;\n }\n\n .step {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: var(--wc-input-number-step-width);\n padding: 0;\n color: var(--wc-color-text-secondary);\n cursor: pointer;\n background: transparent;\n border: none;\n border-radius: 0;\n transition:\n background-color var(--wc-duration-fast) var(--wc-easing-standard),\n color var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .step:hover:not(:disabled):not(:active) {\n color: var(--wc-color-primary);\n background-color: var(--wc-color-bg-hover);\n }\n\n .step:active:not(:disabled) {\n color: var(--wc-color-primary-active);\n }\n\n .step:disabled {\n color: var(--wc-color-text-disabled);\n cursor: not-allowed;\n }\n\n .step wc-icon {\n pointer-events: none;\n }\n\n /* ---- column 主题:步进按钮右侧纵向堆叠 ---- */\n .stepper {\n display: flex;\n flex-direction: column;\n flex-shrink: 0;\n width: 22px;\n border-left: 1px solid var(--wc-color-border);\n }\n\n :host([theme='column']) .step {\n flex: 1;\n width: 100%;\n }\n\n :host([theme='column']) .step wc-icon {\n font-size: 10px;\n }\n\n .stepper .step + .step {\n border-top: 1px solid var(--wc-color-border);\n }\n\n /* row 主题:左右两个按钮与边框衔接处不留圆角缝隙 */\n :host([theme='row']) .number {\n overflow: hidden;\n }\n\n /* ---- 校验状态 ---- */\n :host([status='success']) .number {\n border-color: var(--wc-color-success);\n }\n\n :host([status='warning']) .number {\n border-color: var(--wc-color-warning);\n }\n\n :host([status='error']) .number {\n border-color: var(--wc-color-error);\n }\n\n :host([status='error']) .number:focus-within {\n border-color: var(--wc-color-error);\n box-shadow: 0 0 0 2px var(--wc-color-error-light);\n }\n\n /* ---- 禁用 / 只读 ---- */\n :host([disabled]) .number {\n background-color: var(--wc-color-bg-disabled);\n border-color: transparent;\n cursor: not-allowed;\n }\n\n :host([disabled]) .inner {\n color: var(--wc-color-text-disabled);\n }\n\n :host([readonly]) .number {\n border-style: dashed;\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { FormAssociatedMixin } from '../../common/form-associated-mixin';\nimport { LocalizeController } from '../../i18n/localize-controller';\nimport '../icon/wc-icon.js';\nimport { inputNumberStyles } from './wc-input-number.styles';\n\nexport type wcInputNumberTheme = 'row' | 'column' | 'normal';\nexport type wcInputNumberSize = 'small' | 'medium' | 'large';\nexport type wcInputNumberStatus = 'default' | 'success' | 'warning' | 'error';\n\n/**\n * 数字输入框。取整逻辑复用 Slider 的 clamp(按 step 取整 + 浮点修正),\n * 骨架复用 Input 的 affix 布局;步进按钮与键盘(↑/↓)共用 stepBy。\n *\n * @slot - 无\n * @csspart base - 外层容器\n * @csspart input - 原生输入框\n * @csspart increment-button - 增加按钮\n * @csspart decrement-button - 减少按钮\n * @cssprop --wc-input-number-height - 高度\n * @fires wc-input - 手动输入时持续触发,detail.value 为解析结果(非法时为 NaN)\n * @fires wc-change - 值提交时触发(失焦/回车/步进),detail.value\n */\nexport class wcInputNumber extends FormAssociatedMixin(LitElement) {\n static styles = [baseStyles, inputNumberStyles];\n\n private _value = 0;\n\n /** 当前值 */\n @property({ type: Number })\n get value(): number {\n return this._value;\n }\n\n set value(v: number) {\n const old = this._value;\n this._value = this.clamp(v);\n this.requestUpdate('value', old);\n }\n\n /** 最小值 */\n @property({ type: Number }) min = -Infinity;\n\n /** 最大值 */\n @property({ type: Number }) max = Infinity;\n\n /** 步长 */\n @property({ type: Number }) step = 1;\n\n /** 步进按钮布局:row 左右 / column 右侧纵排 / normal 不显示 */\n @property({ reflect: true }) theme: wcInputNumberTheme = 'row';\n\n /** 尺寸 */\n @property({ reflect: true }) size: wcInputNumberSize = 'medium';\n\n /** 占位提示 */\n @property() placeholder = '';\n\n /** 无障碍标签(等价原生 aria-label) */\n @property() label = '';\n\n /** 只读 */\n @property({ type: Boolean, reflect: true }) readonly = false;\n\n /** 校验状态(影响边框色) */\n @property({ reflect: true }) status: wcInputNumberStatus = 'default';\n\n private localize = new LocalizeController(this);\n\n /** 编辑态标记:true 时输入框显示 _text,不受 value 同步干扰 */\n private _editing = false;\n\n /** 编辑中的原始文本 */\n private _text = '';\n\n /** 按 step 取整并夹在 [min, max] 区间(与 Slider 同一套算法,额外处理 ±Infinity 边界) */\n private clamp(v: number): number {\n if (Number.isNaN(v)) return this._value;\n // min 为 -Infinity 时 (v - min) 溢出为 Infinity,改以 0 为对齐基准\n const stepped = Number.isFinite(this.min)\n ? Math.round((v - this.min) / this.step) * this.step + this.min\n : Math.round(v / this.step) * this.step;\n const fixed = Number(stepped.toFixed(10));\n return Math.min(this.max, Math.max(this.min, fixed));\n }\n\n private formatValue(): string {\n return String(this._value);\n }\n\n override get defaultValue(): unknown {\n const attr = this.getAttribute('value');\n return attr ? Number(attr) : 0;\n }\n\n protected override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (changed.has('value')) {\n this.internals.setFormValue(String(this.value));\n }\n }\n\n override formResetCallback(): void {\n super.formResetCallback();\n this.value = Number(this.defaultValue ?? 0);\n this.internals.setFormValue(String(this.value));\n }\n\n /** 步进:按钮点击与 ↑/↓ 键盘共用;值未变化时不派发事件 */\n private stepBy(direction: 1 | -1): void {\n if (this.disabled || this.readonly) return;\n const next = this.clamp(this.value + direction * this.step);\n if (next === this.value) return;\n this.value = next;\n this.internals.setFormValue(String(this.value));\n this.dispatchEvent(\n new CustomEvent('wc-change', {\n detail: { value: this.value },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n /** 提交编辑中的文本:空/非法回退当前值,合法则取整夹紧后提交 */\n private commit(): void {\n if (!this._editing) return;\n this._editing = false;\n this._text = '';\n const raw = this.shadowRoot!.querySelector<HTMLInputElement>('.inner')!.value.trim();\n const parsed = Number(raw);\n const next = raw === '' || Number.isNaN(parsed) ? this._value : this.clamp(parsed);\n this.requestUpdate();\n if (next === this._value) return;\n this.value = next;\n this.internals.setFormValue(String(this.value));\n this.dispatchEvent(\n new CustomEvent('wc-change', {\n detail: { value: this.value },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private handleFocus(): void {\n this._editing = true;\n this._text = this.formatValue();\n this.requestUpdate();\n }\n\n private handleBlur(): void {\n this.commit();\n }\n\n private handleInput(e: Event): void {\n const input = e.target as HTMLInputElement;\n this._text = input.value;\n this.dispatchEvent(\n new CustomEvent('wc-input', {\n detail: { value: Number(input.value), text: input.value },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private handleKeydown(e: KeyboardEvent): void {\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n this.stepBy(1);\n } else if (e.key === 'ArrowDown') {\n e.preventDefault();\n this.stepBy(-1);\n } else if (e.key === 'Enter') {\n this.commit();\n }\n }\n\n private get canDecrement(): boolean {\n return !this.disabled && !this.readonly && this.value > this.min;\n }\n\n private get canIncrement(): boolean {\n return !this.disabled && !this.readonly && this.value < this.max;\n }\n\n render() {\n const stepBtn = (dir: 1 | -1) => {\n const increment = dir === 1;\n return html`\n <button\n type=\"button\"\n class=\"step ${increment ? 'plus' : 'minus'}\"\n part=${increment ? 'increment-button' : 'decrement-button'}\n tabindex=\"-1\"\n ?disabled=${increment ? !this.canIncrement : !this.canDecrement}\n aria-label=${this.localize.term(increment ? 'inputNumber.increment' : 'inputNumber.decrement')}\n @click=${() => this.stepBy(dir)}\n >\n <wc-icon name=${increment ? 'plus' : 'minus'}></wc-icon>\n </button>\n `;\n };\n\n const inner = html`\n <input\n part=\"input\"\n class=\"inner\"\n type=\"text\"\n inputmode=\"decimal\"\n .value=${this._editing ? this._text : this.formatValue()}\n ?disabled=${this.disabled}\n ?readonly=${this.readonly}\n placeholder=${this.placeholder}\n aria-label=${this.label || undefined}\n @focus=${this.handleFocus}\n @blur=${this.handleBlur}\n @input=${this.handleInput}\n @keydown=${this.handleKeydown}\n />\n `;\n\n if (this.theme === 'normal') {\n return html`<div class=\"number\" part=\"base\">${inner}</div>`;\n }\n if (this.theme === 'column') {\n return html`\n <div class=\"number\" part=\"base\">\n ${inner}\n <span class=\"stepper\" part=\"stepper\"> ${stepBtn(1)}${stepBtn(-1)} </span>\n </div>\n `;\n }\n return html` <div class=\"number\" part=\"base\">${stepBtn(-1)}${inner}${stepBtn(1)}</div> `;\n }\n}\n\nif (!customElements.get('wc-input-number')) {\n customElements.define('wc-input-number', wcInputNumber);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-input-number': wcInputNumber;\n }\n}\n","import { css } from 'lit';\n\nexport const datePickerStyles = css`\n :host {\n display: inline-block;\n width: 240px;\n\n /* component 层令牌 */\n --wc-date-picker-height: 32px;\n --wc-date-picker-padding-x: var(--wc-space-2);\n --wc-date-picker-font-size: var(--wc-font-size-medium);\n --wc-date-picker-radius: var(--wc-radius-medium);\n --wc-date-picker-cell-size: 32px;\n }\n\n :host([size='small']) {\n --wc-date-picker-height: 24px;\n --wc-date-picker-padding-x: var(--wc-space-1);\n --wc-date-picker-font-size: var(--wc-font-size-small);\n --wc-date-picker-cell-size: 28px;\n }\n\n :host([size='large']) {\n --wc-date-picker-height: 40px;\n --wc-date-picker-padding-x: var(--wc-space-3);\n --wc-date-picker-font-size: var(--wc-font-size-large);\n --wc-date-picker-cell-size: 36px;\n }\n\n .picker {\n position: relative;\n display: inline-block;\n width: 100%;\n }\n\n .trigger {\n display: inline-flex;\n align-items: center;\n gap: var(--wc-space-1);\n width: 100%;\n height: var(--wc-date-picker-height);\n padding: 0 var(--wc-date-picker-padding-x);\n background-color: var(--wc-color-bg-container);\n border: 1px solid var(--wc-color-border);\n border-radius: var(--wc-date-picker-radius);\n cursor: pointer;\n user-select: none;\n transition:\n border-color var(--wc-duration-fast) var(--wc-easing-standard),\n box-shadow var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .trigger:focus-visible {\n outline: none;\n border-color: var(--wc-color-primary);\n box-shadow: 0 0 0 2px var(--wc-color-focus-ring);\n }\n\n .value {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--wc-date-picker-font-size);\n color: var(--wc-color-text);\n }\n\n .value.placeholder {\n color: var(--wc-color-text-placeholder);\n }\n\n .icon {\n font-size: 16px;\n color: var(--wc-color-text-placeholder);\n flex-shrink: 0;\n }\n\n .clear {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n font-size: 16px;\n color: var(--wc-color-text-placeholder);\n border-radius: var(--wc-radius-circle);\n flex-shrink: 0;\n opacity: 0;\n transition: opacity var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .clear:hover {\n color: var(--wc-color-text-secondary);\n }\n\n .trigger:hover .clear,\n .trigger:focus-visible .clear {\n opacity: 1;\n }\n\n .trigger:hover .clear + .icon {\n display: none;\n }\n\n /* ---- 日历面板 ---- */\n .panel {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n z-index: var(--wc-z-index-dropdown);\n padding: var(--wc-space-3);\n background-color: var(--wc-color-bg-container);\n border: 1px solid var(--wc-color-border);\n border-radius: var(--wc-date-picker-radius);\n box-shadow: var(--wc-shadow-2);\n }\n\n .panel[hidden] {\n display: none;\n }\n\n .header {\n display: flex;\n align-items: center;\n gap: var(--wc-space-1);\n margin-bottom: var(--wc-space-2);\n }\n\n .month-label {\n flex: 1;\n min-width: 0;\n font-size: var(--wc-font-size-medium);\n font-weight: var(--wc-font-weight-medium, 500);\n color: var(--wc-color-text);\n text-align: center;\n white-space: nowrap;\n }\n\n .nav {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n padding: 0;\n font-size: 12px;\n color: var(--wc-color-text-secondary);\n cursor: pointer;\n background: transparent;\n border: none;\n border-radius: var(--wc-radius-small);\n transition:\n background-color var(--wc-duration-fast) var(--wc-easing-standard),\n color var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .nav wc-icon + wc-icon {\n margin-left: -10px;\n }\n\n .nav:hover {\n color: var(--wc-color-primary);\n background-color: var(--wc-color-bg-hover);\n }\n\n .grid {\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .row {\n display: grid;\n grid-template-columns: repeat(7, var(--wc-date-picker-cell-size));\n }\n\n .cell {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wc-date-picker-cell-size);\n height: var(--wc-date-picker-cell-size);\n box-sizing: border-box;\n font-size: var(--wc-font-size-small);\n color: var(--wc-color-text);\n border: 1px solid transparent;\n border-radius: var(--wc-radius-circle);\n user-select: none;\n }\n\n .cell.weekday {\n height: auto;\n color: var(--wc-color-text-placeholder);\n cursor: default;\n }\n\n .cell.day {\n cursor: pointer;\n transition:\n background-color var(--wc-duration-fast) var(--wc-easing-standard),\n color var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .cell.day:hover {\n background-color: var(--wc-color-bg-hover);\n }\n\n .cell.day.out {\n color: var(--wc-color-text-placeholder);\n }\n\n .cell.day.today {\n border-color: var(--wc-color-primary);\n color: var(--wc-color-primary);\n }\n\n .cell.day.active {\n box-shadow: inset 0 0 0 1px var(--wc-color-primary);\n }\n\n .cell.day.selected {\n background-color: var(--wc-color-primary);\n color: var(--wc-color-text-anti);\n }\n\n .cell.day.selected.today {\n border-color: var(--wc-color-primary);\n color: var(--wc-color-text-anti);\n }\n\n .footer {\n display: flex;\n justify-content: flex-end;\n margin-top: var(--wc-space-2);\n padding-top: var(--wc-space-2);\n border-top: 1px solid var(--wc-color-border);\n }\n\n .today {\n padding: 2px var(--wc-space-2);\n font-size: var(--wc-font-size-small);\n color: var(--wc-color-primary);\n cursor: pointer;\n background: transparent;\n border: none;\n border-radius: var(--wc-radius-small);\n transition: background-color var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .today:hover {\n background-color: var(--wc-color-primary-light);\n }\n\n /* ---- 校验状态 ---- */\n :host([status='success']) .trigger {\n border-color: var(--wc-color-success);\n }\n\n :host([status='warning']) .trigger {\n border-color: var(--wc-color-warning);\n }\n\n :host([status='error']) .trigger {\n border-color: var(--wc-color-error);\n }\n\n :host([status='error']) .trigger:focus-visible {\n border-color: var(--wc-color-error);\n box-shadow: 0 0 0 2px var(--wc-color-error-light);\n }\n\n /* ---- 禁用 / 只读 ---- */\n :host([disabled]) .trigger {\n background-color: var(--wc-color-bg-disabled);\n border-color: transparent;\n cursor: not-allowed;\n }\n\n :host([disabled]) .value {\n color: var(--wc-color-text-disabled);\n }\n\n :host([readonly]) .trigger {\n border-style: dashed;\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { FormAssociatedMixin } from '../../common/form-associated-mixin';\nimport { LocalizeController } from '../../i18n/localize-controller';\nimport '../icon/wc-icon.js';\nimport { datePickerStyles } from './wc-date-picker.styles';\n\nexport type wcDatePickerSize = 'small' | 'medium' | 'large';\nexport type wcDatePickerStatus = 'default' | 'success' | 'warning' | 'error';\n\ninterface CalendarCell {\n /** ISO 日期 YYYY-MM-DD */\n iso: string;\n /** 显示的日号 */\n day: number;\n /** 是否属于当前视图月份 */\n inMonth: boolean;\n /** 是否今天 */\n isToday: boolean;\n}\n\n/* ---------- 日期工具(本地时区,避免 UTC 偏移问题) ---------- */\n\nfunction pad2(n: number): string {\n return String(n).padStart(2, '0');\n}\n\nfunction formatDate(d: Date): string {\n return `${d.getFullYear()}-${pad2(d.getMonth() + 1)}-${pad2(d.getDate())}`;\n}\n\nfunction parseDate(iso: string): Date | null {\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(iso);\n if (!m) return null;\n const d = new Date(Number(m[1]), Number(m[2]) - 1, Number(m[3]));\n return Number.isNaN(d.getTime()) ? null : d;\n}\n\nfunction addDays(d: Date, days: number): Date {\n return new Date(d.getFullYear(), d.getMonth(), d.getDate() + days);\n}\n\n/**\n * 日期选择器。面板开合、document 点击关闭与 aria-activedescendant 键盘模式\n * 复用 Select 的方案;日期运算全部基于本地时区。\n *\n * @csspart base - 外层容器\n * @csspart trigger - 触发器\n * @csspart panel - 日历面板\n * @cssprop --wc-date-picker-height - 触发器高度\n * @fires wc-change - 选中日期变化时触发,detail.value(YYYY-MM-DD)\n * @fires wc-clear - 点击清除按钮后触发\n */\nexport class wcDatePicker extends FormAssociatedMixin(LitElement) {\n static styles = [baseStyles, datePickerStyles];\n\n private _value = '';\n\n /** 当前选中值(YYYY-MM-DD) */\n @property()\n get value(): string {\n return this._value;\n }\n\n set value(v: string) {\n const old = this._value;\n this._value = v && parseDate(v) ? v : '';\n this.requestUpdate('value', old);\n }\n\n /** 占位提示,默认取 i18n 文案 */\n @property() placeholder = '';\n\n /** 无障碍标签 */\n @property() label = '';\n\n /** 尺寸 */\n @property({ reflect: true }) size: wcDatePickerSize = 'medium';\n\n /** 校验状态(影响边框色) */\n @property({ reflect: true }) status: wcDatePickerStatus = 'default';\n\n /** 可清除 */\n @property({ type: Boolean, reflect: true }) clearable = false;\n\n /** 只读 */\n @property({ type: Boolean, reflect: true }) readonly = false;\n\n /** 一周从周几开始:0 周日(默认)~ 6 周六 */\n @property({ type: Number, attribute: 'first-day-of-week' }) firstDayOfWeek = 0;\n\n /** 面板是否展开(内部状态) */\n @property({ type: Boolean, reflect: true }) open = false;\n\n /** 日历视图的年(内部状态) */\n private viewYear = new Date().getFullYear();\n\n /** 日历视图的月 0~11(内部状态) */\n private viewMonth = new Date().getMonth();\n\n /** 键盘导航高亮的日期(内部状态) */\n private activeIso = '';\n\n private localize = new LocalizeController(this);\n\n private uid = `wc-date-picker-${Math.random().toString(36).slice(2, 8)}`;\n\n constructor() {\n super();\n this.addEventListener('keydown', this.handleKeydown);\n }\n\n override get defaultValue(): unknown {\n return this.getAttribute('value') ?? '';\n }\n\n protected override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (changed.has('value')) {\n this.internals.setFormValue(this.value || null);\n }\n }\n\n override formResetCallback(): void {\n super.formResetCallback();\n this.value = String(this.defaultValue ?? '');\n this.internals.setFormValue(this.value || null);\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n document.addEventListener('click', this.onDocumentClick);\n }\n\n override disconnectedCallback(): void {\n document.removeEventListener('click', this.onDocumentClick);\n super.disconnectedCallback();\n }\n\n /* ---------- 开合(同 Select 模式) ---------- */\n\n private show(): void {\n if (this.disabled || this.readonly || this.open) return;\n this.open = true;\n // 视图与高亮定位到已选日期,否则今天\n const base = parseDate(this.value) ?? new Date();\n this.viewYear = base.getFullYear();\n this.viewMonth = base.getMonth();\n this.activeIso = formatDate(base);\n }\n\n private hide(): void {\n if (!this.open) return;\n this.open = false;\n this.activeIso = '';\n }\n\n private toggle(): void {\n if (this.open) {\n this.hide();\n } else {\n this.show();\n }\n }\n\n private onDocumentClick = (e: MouseEvent): void => {\n if (!(e.composedPath() as Array<EventTarget>).includes(this)) {\n this.hide();\n }\n };\n\n /* ---------- 日历视图 ---------- */\n\n private setView(year: number, month: number): void {\n this.viewYear = year;\n this.viewMonth = month;\n this.requestUpdate();\n }\n\n private prevMonth(): void {\n const m = this.viewMonth === 0 ? 11 : this.viewMonth - 1;\n const y = this.viewMonth === 0 ? this.viewYear - 1 : this.viewYear;\n this.setView(y, m);\n }\n\n private nextMonth(): void {\n const m = this.viewMonth === 11 ? 0 : this.viewMonth + 1;\n const y = this.viewMonth === 11 ? this.viewYear + 1 : this.viewYear;\n this.setView(y, m);\n }\n\n private prevYear(): void {\n this.setView(this.viewYear - 1, this.viewMonth);\n }\n\n private nextYear(): void {\n this.setView(this.viewYear + 1, this.viewMonth);\n }\n\n /** 6 行 × 7 列 = 42 格,含前后月补位日期 */\n private get calendarCells(): CalendarCell[] {\n const first = new Date(this.viewYear, this.viewMonth, 1);\n const startOffset = (first.getDay() - this.firstDayOfWeek + 7) % 7;\n const start = new Date(this.viewYear, this.viewMonth, 1 - startOffset);\n const todayIso = formatDate(new Date());\n const cells: CalendarCell[] = [];\n for (let i = 0; i < 42; i++) {\n const d = addDays(start, i);\n const iso = formatDate(d);\n cells.push({\n iso,\n day: d.getDate(),\n inMonth: d.getMonth() === this.viewMonth,\n isToday: iso === todayIso,\n });\n }\n return cells;\n }\n\n /** 表头星期标签,顺序按 firstDayOfWeek 旋转(Intl 本地化,中文取单字「日一二三四五六」) */\n private get weekdayLabels(): string[] {\n // 2023-01-01 是周日,作为基准依次取星期窄名\n return Array.from({ length: 7 }, (_, i) =>\n this.localize.date(new Date(2023, 0, 1 + ((this.firstDayOfWeek + i) % 7)), {\n weekday: 'narrow',\n }),\n );\n }\n\n private get monthLabel(): string {\n return this.localize.date(new Date(this.viewYear, this.viewMonth, 1), {\n year: 'numeric',\n month: 'long',\n });\n }\n\n /* ---------- 选择 ---------- */\n\n private selectDate(iso: string): void {\n this.value = iso;\n this.hide();\n this.dispatchEvent(\n new CustomEvent('wc-change', { detail: { value: iso }, bubbles: true, composed: true }),\n );\n }\n\n private handleClear(e: MouseEvent): void {\n e.preventDefault();\n e.stopPropagation();\n this.value = '';\n this.hide();\n this.dispatchEvent(new CustomEvent('wc-clear', { bubbles: true, composed: true }));\n this.dispatchEvent(\n new CustomEvent('wc-change', { detail: { value: '' }, bubbles: true, composed: true }),\n );\n }\n\n private selectToday(): void {\n this.selectDate(formatDate(new Date()));\n }\n\n private onCellClick(e: MouseEvent): void {\n const cell = (e.target as Element).closest<HTMLElement>('[data-iso]');\n if (cell?.dataset.iso) this.selectDate(cell.dataset.iso);\n }\n\n /* ---------- 键盘导航(activedescendant 模式,同 Select) ---------- */\n\n private moveActive(delta: number): void {\n if (!this.open) return;\n const base = parseDate(this.activeIso) ?? new Date();\n const next = addDays(base, delta);\n const iso = formatDate(next);\n this.activeIso = iso;\n // 跨月时同步翻页视图\n if (next.getFullYear() !== this.viewYear || next.getMonth() !== this.viewMonth) {\n this.setView(next.getFullYear(), next.getMonth());\n } else {\n this.requestUpdate();\n }\n }\n\n private handleKeydown = (e: KeyboardEvent): void => {\n if (this.disabled || this.readonly) return;\n switch (e.key) {\n case 'Enter':\n case ' ':\n e.preventDefault();\n if (this.open && this.activeIso) {\n this.selectDate(this.activeIso);\n } else {\n this.show();\n }\n break;\n case 'Escape':\n e.preventDefault();\n this.hide();\n break;\n case 'ArrowLeft':\n e.preventDefault();\n if (this.open) this.moveActive(-1);\n else this.show();\n break;\n case 'ArrowRight':\n e.preventDefault();\n if (this.open) this.moveActive(1);\n else this.show();\n break;\n case 'ArrowUp':\n e.preventDefault();\n if (this.open) this.moveActive(-7);\n else this.show();\n break;\n case 'ArrowDown':\n e.preventDefault();\n if (this.open) this.moveActive(7);\n else this.show();\n break;\n case 'Home':\n if (this.open) {\n e.preventDefault();\n this.moveActive(-7);\n }\n break;\n case 'End':\n if (this.open) {\n e.preventDefault();\n this.moveActive(7);\n }\n break;\n case 'Tab':\n this.hide();\n break;\n }\n };\n\n render() {\n const showClear = this.clearable && this.value && !this.disabled && !this.readonly;\n const cells = this.open ? this.calendarCells : [];\n const rows: CalendarCell[][] = [];\n for (let i = 0; i < cells.length; i += 7) rows.push(cells.slice(i, i + 7));\n\n return html`\n <div class=\"picker\" part=\"base\">\n <div\n class=\"trigger\"\n part=\"trigger\"\n role=\"combobox\"\n tabindex=${this.disabled ? -1 : 0}\n aria-haspopup=\"grid\"\n aria-expanded=${this.open}\n aria-disabled=${this.disabled}\n aria-label=${this.label || undefined}\n aria-controls=${this.open ? `${this.uid}-panel` : undefined}\n aria-activedescendant=${\n this.open && this.activeIso ? `${this.uid}-cell-${this.activeIso}` : undefined\n }\n @click=${this.toggle}\n >\n <span class=\"value ${this.value ? '' : 'placeholder'}\" part=\"value\"\n >${this.value || this.placeholder || this.localize.term('datePicker.placeholder')}</span\n >\n ${\n showClear\n ? html`\n <span\n class=\"clear\"\n part=\"clear-button\"\n role=\"button\"\n aria-label=${this.localize.term('input.clear')}\n @mousedown=${(e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n @click=${this.handleClear}\n >\n <wc-icon name=\"close\"></wc-icon>\n </span>\n `\n : ''\n }\n <wc-icon name=\"calendar\" class=\"icon\"></wc-icon>\n </div>\n <div\n class=\"panel\"\n part=\"panel\"\n id=\"${this.uid}-panel\"\n role=\"dialog\"\n aria-label=${this.label || this.localize.term('datePicker.placeholder')}\n ?hidden=${!this.open}\n >\n <div class=\"header\" part=\"header\">\n <button\n type=\"button\"\n class=\"nav\"\n part=\"prev-year-button\"\n tabindex=\"-1\"\n aria-label=${this.localize.term('datePicker.prevYear')}\n @click=${this.prevYear}\n >\n <wc-icon name=\"chevron-left\"></wc-icon><wc-icon name=\"chevron-left\"></wc-icon>\n </button>\n <button\n type=\"button\"\n class=\"nav\"\n part=\"prev-month-button\"\n tabindex=\"-1\"\n aria-label=${this.localize.term('datePicker.prevMonth')}\n @click=${this.prevMonth}\n >\n <wc-icon name=\"chevron-left\"></wc-icon>\n </button>\n <span class=\"month-label\" part=\"month-label\">${this.monthLabel}</span>\n <button\n type=\"button\"\n class=\"nav\"\n part=\"next-month-button\"\n tabindex=\"-1\"\n aria-label=${this.localize.term('datePicker.nextMonth')}\n @click=${this.nextMonth}\n >\n <wc-icon name=\"chevron-right\"></wc-icon>\n </button>\n <button\n type=\"button\"\n class=\"nav\"\n part=\"next-year-button\"\n tabindex=\"-1\"\n aria-label=${this.localize.term('datePicker.nextYear')}\n @click=${this.nextYear}\n >\n <wc-icon name=\"chevron-right\"></wc-icon><wc-icon name=\"chevron-right\"></wc-icon>\n </button>\n </div>\n <div class=\"grid\" part=\"grid\" role=\"grid\">\n <div class=\"row weekdays\" role=\"row\">\n ${this.weekdayLabels.map(\n (w) => html`<span class=\"cell weekday\" role=\"columnheader\">${w}</span>`,\n )}\n </div>\n ${rows.map(\n (row) => html`\n <div class=\"row\" role=\"row\">\n ${row.map(\n (c) => html`\n <span\n class=\"cell day ${c.inMonth ? '' : 'out'} ${\n c.iso === this.value ? 'selected' : ''\n } ${c.iso === this.activeIso ? 'active' : ''}\"\n role=\"gridcell\"\n data-iso=${c.iso}\n id=\"${this.uid}-cell-${c.iso}\"\n aria-selected=${c.iso === this.value}\n @click=${this.onCellClick}\n >${c.day}</span\n >\n `,\n )}\n </div>\n `,\n )}\n </div>\n <div class=\"footer\" part=\"footer\">\n <button\n type=\"button\"\n class=\"today\"\n part=\"today-button\"\n tabindex=\"-1\"\n @click=${this.selectToday}\n >\n ${this.localize.term('datePicker.today')}\n </button>\n </div>\n </div>\n </div>\n `;\n }\n}\n\nif (!customElements.get('wc-date-picker')) {\n customElements.define('wc-date-picker', wcDatePicker);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-date-picker': wcDatePicker;\n }\n}\n","import { css } from 'lit';\n\n/** wc-form 与 wc-form-item 共用样式 */\nexport const formStyles = css`\n :host {\n display: block;\n }\n\n .form {\n margin: 0;\n padding: 0;\n }\n\n .item {\n display: grid;\n grid-template-columns: var(--wc-form-label-width, 80px) 1fr;\n gap: var(--wc-space-2);\n align-items: start;\n margin-bottom: var(--wc-space-4);\n }\n\n .label {\n padding-right: var(--wc-space-2);\n font-size: var(--wc-font-size-medium);\n line-height: var(--wc-form-line-height, 32px);\n color: var(--wc-color-text);\n text-align: right;\n overflow-wrap: break-word;\n }\n\n .asterisk {\n margin-right: 2px;\n color: var(--wc-color-error);\n }\n\n .asterisk[hidden] {\n display: none;\n }\n\n .control {\n min-width: 0;\n }\n\n .error {\n margin-top: var(--wc-space-1);\n font-size: var(--wc-font-size-small);\n color: var(--wc-color-error);\n }\n\n .error[hidden] {\n display: none;\n }\n\n :host([disabled]) .label {\n color: var(--wc-color-text-disabled);\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { baseStyles } from '../../styles/base.css';\nimport { formStyles } from './wc-form.styles';\nimport type { FormValidateResult } from './types.js';\nimport type { wcFormItem } from './wc-form-item.js';\n\n/**\n * 表单容器:拦截提交做整体校验,聚合校验结果。\n *\n * 用法:\n * ```html\n * <wc-form>\n * <wc-form-item label=\"用户名\" name=\"username\" required>\n * <wc-input></wc-input>\n * </wc-form-item>\n * <wc-button theme=\"primary\" html-type=\"submit\">提交</wc-button>\n * </wc-form>\n * ```\n * 点击 `wc-button[html-type=submit]` / `wc-button[html-type=reset]` 会触发提交流程 /\n * 重置(事件委托,按钮可以是任意层级后代)。\n *\n * @slot - 放置 wc-form-item 与按钮\n * @csspart form - 原生 form 容器\n * @fires wc-submit - 提交时触发(无论校验是否通过),detail 为 FormValidateResult\n */\nexport class wcForm extends LitElement {\n static styles = [baseStyles, formStyles];\n\n constructor() {\n super();\n this.addEventListener('click', this.onHostClick);\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n // form 元素在 shadow 内,submit 会冒泡(composed)到宿主\n this.addEventListener('submit', this.onSubmit);\n }\n\n /** 全部表单项 */\n getItems(): wcFormItem[] {\n const slot = this.shadowRoot!.querySelector('slot');\n return (slot?.assignedElements() ?? []).filter(\n (el): el is wcFormItem => el.tagName === 'WC-FORM-ITEM',\n );\n }\n\n /** 按字段名取表单项 */\n getItem(name: string): wcFormItem | undefined {\n return this.getItems().find((item) => item.name === name);\n }\n\n /** 整体校验:逐项执行并聚合结果,失败时聚焦第一个错误控件 */\n async validate(): Promise<FormValidateResult> {\n const errors: Record<string, string> = {};\n for (const item of this.getItems()) {\n const message = await item.validate();\n if (message) errors[item.name || `field-${Object.keys(errors).length}`] = message;\n }\n const firstError = Object.values(errors)[0] ?? '';\n if (firstError) this.focusFirstError();\n return { valid: Object.keys(errors).length === 0, errors, firstError };\n }\n\n /** 重置全部表单项(恢复控件默认值并清除错误) */\n reset(): void {\n for (const item of this.getItems()) {\n item.reset();\n }\n }\n\n /** 触发提交流程(等同点击 submit 按钮) */\n async submit(): Promise<void> {\n const result = await this.validate();\n this.dispatchEvent(\n new CustomEvent('wc-submit', { detail: result, bubbles: true, composed: true }),\n );\n }\n\n private onSubmit = (e: Event): void => {\n e.preventDefault();\n void this.submit();\n };\n\n /** 委托处理 wc-button[html-type=submit|reset](控件在各自 shadow 内,需用 composedPath) */\n private onHostClick = (e: MouseEvent): void => {\n const button = (e.composedPath() as Element[]).find(\n (el) => el instanceof Element && el.tagName === 'WC-BUTTON',\n );\n if (!button) return;\n const type = button.getAttribute('html-type');\n if (type === 'submit') {\n e.preventDefault();\n void this.submit();\n } else if (type === 'reset') {\n e.preventDefault();\n this.reset();\n }\n };\n\n private focusFirstError(): void {\n const control = this.getItems().find((i) => i.error)?.control as HTMLElement | undefined;\n if (!control || typeof control.focus !== 'function') return;\n control.focus();\n if (document.activeElement !== control) {\n // 自定义元素根不可聚焦时,退而聚焦其 shadow 内的原生控件\n const inner = control.shadowRoot?.querySelector<HTMLElement>(\n 'input, textarea, button, [tabindex]',\n );\n inner?.focus();\n }\n }\n\n render() {\n return html`\n <form class=\"form\" part=\"form\" novalidate>\n <slot></slot>\n </form>\n `;\n }\n}\n\nif (!customElements.get('wc-form')) {\n customElements.define('wc-form', wcForm);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-form': wcForm;\n }\n}\n","import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { LocalizeController } from '../../i18n/localize-controller';\nimport { formStyles } from './wc-form.styles';\nimport type { FormRule } from './types.js';\n\n/**\n * 表单项:label + 控件插槽 + 错误消息。\n * 控件取插槽第一个元素;自家组件(wc-input 等)与原生 input/select/textarea 均可。\n *\n * @slot - 放置单个表单控件\n * @csspart base - 外层容器\n * @csspart label - 标签\n * @csspart error - 错误消息\n * @cssprop --wc-form-label-width - 标签列宽\n */\nexport class wcFormItem extends LitElement {\n static styles = [baseStyles, formStyles];\n\n /** 字段名(提交与校验结果映射的键) */\n @property() name = '';\n\n /** 标签文本 */\n @property() label = '';\n\n /** 必填(等价 rules=[{required:true}],同时渲染红色星号) */\n @property({ type: Boolean, reflect: true }) required = false;\n\n /** 数值下限 */\n @property({ type: Number }) min?: number;\n\n /** 数值上限 */\n @property({ type: Number }) max?: number;\n\n /** 字符串最小长度 */\n @property({ type: Number, attribute: 'min-length' }) minLength?: number;\n\n /** 字符串最大长度 */\n @property({ type: Number, attribute: 'max-length' }) maxLength?: number;\n\n /** 正则校验 */\n @property() pattern = '';\n\n /** 完整规则列表(attribute:false,含自定义 validator 时用 JS 设置) */\n @property({ attribute: false }) rules: FormRule[] = [];\n\n /** 当前错误消息(空表示通过) */\n private _error = '';\n\n get error(): string {\n return this._error;\n }\n\n private localize = new LocalizeController(this);\n\n constructor() {\n super();\n // 控件交互后重新校验:wc-change 冒泡组合事件;blur 不冒泡但 composed,需捕获\n this.addEventListener('wc-change', this.onControlInteract);\n this.addEventListener('blur', this.onControlInteract, true);\n }\n\n /** 插槽第一个元素,即表单控件 */\n get control(): Element | null {\n return this.shadowRoot!.querySelector('slot')?.assignedElements()[0] ?? null;\n }\n\n /** 读取控件值:兼容自家组件与原生表单元素 */\n get controlValue(): unknown {\n const c = this.control as { value?: unknown } | null;\n return c?.value ?? '';\n }\n\n /** 声明式属性 + rules 合并后的生效规则 */\n private get effectiveRules(): FormRule[] {\n const rules: FormRule[] = [];\n if (this.required) rules.push({ required: true });\n if (this.min !== undefined) rules.push({ min: this.min });\n if (this.max !== undefined) rules.push({ max: this.max });\n if (this.minLength !== undefined) rules.push({ minLength: this.minLength });\n if (this.maxLength !== undefined) rules.push({ maxLength: this.maxLength });\n if (this.pattern) rules.push({ pattern: this.pattern });\n return [...rules, ...this.rules];\n }\n\n private onControlInteract = (): void => {\n void this.validate();\n };\n\n /** 校验当前值:返回错误消息(空字符串表示通过),同时更新错误显示与控件状态 */\n async validate(): Promise<string> {\n const value = this.controlValue;\n for (const rule of this.effectiveRules) {\n const failed = await this.checkRule(rule, value);\n if (failed) {\n this.setError(failed);\n return failed;\n }\n }\n this.clearError();\n return '';\n }\n\n private async checkRule(rule: FormRule, value: unknown): Promise<string> {\n const name = this.label || this.name || '';\n const fail = (key: string, vars?: Record<string, string | number>) =>\n rule.message ?? this.localize.term(key, { name, ...vars });\n const empty = value === '' || value == null || (Array.isArray(value) && value.length === 0);\n\n if (rule.required && empty) return fail('form.required');\n if (empty) return '';\n if (rule.min !== undefined && Number(value) < rule.min)\n return fail('form.min', { min: rule.min });\n if (rule.max !== undefined && Number(value) > rule.max)\n return fail('form.max', { max: rule.max });\n if (rule.minLength !== undefined && String(value).length < rule.minLength)\n return fail('form.minLength', { minLength: rule.minLength });\n if (rule.maxLength !== undefined && String(value).length > rule.maxLength)\n return fail('form.maxLength', { maxLength: rule.maxLength });\n if (rule.pattern) {\n const re = typeof rule.pattern === 'string' ? new RegExp(rule.pattern) : rule.pattern;\n if (!re.test(String(value))) return fail('form.pattern');\n }\n if (rule.validator) {\n const result = await rule.validator(value);\n if (result === false) return fail('form.invalid');\n if (typeof result === 'string' && result) return result;\n }\n return '';\n }\n\n private setError(message: string): void {\n this._error = message;\n this.applyControlStatus();\n this.requestUpdate();\n }\n\n /** 清除错误显示,并恢复控件校验状态 */\n clearError(): void {\n if (!this._error) return;\n this._error = '';\n this.applyControlStatus();\n this.requestUpdate();\n }\n\n /** 把校验状态同步到控件(自家组件有 status 属性,原生控件跳过) */\n private applyControlStatus(): void {\n const c = this.control as { status?: string } | null;\n if (c && 'status' in c) c.status = this._error ? 'error' : 'default';\n }\n\n /** 重置控件值并清除错误(自家组件走 formResetCallback,原生控件清空 value) */\n reset(): void {\n const c = this.control as {\n formResetCallback?: () => void;\n value?: unknown;\n } | null;\n if (!c) return;\n if (typeof c.formResetCallback === 'function') {\n c.formResetCallback();\n } else if ('value' in c) {\n c.value = '';\n }\n this.clearError();\n }\n\n render() {\n return html`\n <div class=\"item\" part=\"base\">\n <label class=\"label\" part=\"label\">\n <span class=\"asterisk\" ?hidden=${!this.required}>*</span>${this.label}\n </label>\n <div class=\"control\" part=\"control\">\n <slot></slot>\n <div class=\"error\" part=\"error\" role=\"alert\" ?hidden=${!this._error}>${this._error}</div>\n </div>\n </div>\n `;\n }\n}\n\nif (!customElements.get('wc-form-item')) {\n customElements.define('wc-form-item', wcFormItem);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-form-item': wcFormItem;\n }\n}\n","import { css } from 'lit';\n\nexport const dividerStyles = css`\n :host {\n display: block;\n\n /* component 层令牌 */\n --wc-divider-color: var(--wc-color-border);\n --wc-divider-text-gap: var(--wc-space-3);\n }\n\n :host([vertical]) {\n display: inline-block;\n }\n\n .divider {\n display: flex;\n align-items: center;\n gap: var(--wc-divider-text-gap);\n margin: var(--wc-space-4) 0;\n }\n\n .content {\n flex-shrink: 0;\n font-size: var(--wc-font-size-medium);\n color: var(--wc-color-text-secondary);\n white-space: nowrap;\n }\n\n .content[hidden] {\n display: none;\n }\n\n .line {\n display: block;\n flex: 1;\n /* 不能用 height: 0 + 背景——0 高度画不出背景色,实线会不可见 */\n height: 1px;\n background-color: var(--wc-divider-color);\n }\n\n :host([dashed]) .line {\n height: 0;\n background: none;\n border-top: 1px dashed var(--wc-divider-color);\n }\n\n .line.vertical {\n display: inline-block;\n flex: none;\n width: 1px;\n height: 1em;\n margin: 0 var(--wc-space-2);\n vertical-align: middle;\n }\n\n :host([dashed]) .line.vertical {\n width: 0;\n height: 1em;\n background: none;\n border-left: 1px dashed var(--wc-divider-color);\n }\n\n /* 文案对齐:一侧线固定短 */\n .align-left .line.start {\n flex: 0 0 var(--wc-space-4);\n }\n\n .align-right .line.end {\n flex: 0 0 var(--wc-space-4);\n }\n\n .align-left .content {\n order: -1;\n }\n\n :host([vertical]) .divider {\n margin: 0;\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { dividerStyles } from './wc-divider.styles';\n\nexport type wcDividerAlign = 'left' | 'center' | 'right';\n\n/**\n * 分隔线。水平模式可携带文案(文案位置由 align 控制),\n * vertical 时渲染竖向分隔(忽略插槽内容)。\n *\n * @slot - 分隔线文案\n * @csspart base - 外层容器\n * @csspart line - 分隔线\n */\nexport class wcDivider extends LitElement {\n static styles = [baseStyles, dividerStyles];\n\n /** 虚线 */\n @property({ type: Boolean, reflect: true }) dashed = false;\n\n /** 水平模式下文案位置 */\n @property({ reflect: true }) align: wcDividerAlign = 'center';\n\n /** 竖向分隔线 */\n @property({ type: Boolean, reflect: true }) vertical = false;\n\n /** 是否有插槽文案(slotchange 检测) */\n private _hasContent = false;\n\n private onSlotChange(e: Event): void {\n this._hasContent = (e.target as HTMLSlotElement).assignedNodes({ flatten: true }).length > 0;\n this.requestUpdate();\n }\n\n render() {\n if (this.vertical) {\n return html`<span class=\"line vertical\" part=\"line\"></span>`;\n }\n return html`\n <div class=\"divider ${`align-${this.align}`}\" part=\"base\">\n <span class=\"line start\" part=\"line\"></span>\n <span class=\"content\" part=\"content\" ?hidden=${!this._hasContent}>\n <slot @slotchange=${this.onSlotChange}></slot>\n </span>\n <span class=\"line end\" part=\"line\"></span>\n </div>\n `;\n }\n}\n\nif (!customElements.get('wc-divider')) {\n customElements.define('wc-divider', wcDivider);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-divider': wcDivider;\n }\n}\n","import { css } from 'lit';\n\nexport const tagStyles = css`\n :host {\n display: inline-block;\n\n /* component 层令牌 */\n --wc-tag-height: 24px;\n --wc-tag-font-size: var(--wc-font-size-small);\n --wc-tag-padding-x: var(--wc-space-2);\n --wc-tag-radius: var(--wc-radius-small);\n }\n\n :host([size='small']) {\n --wc-tag-height: 20px;\n --wc-tag-font-size: var(--wc-font-size-small);\n --wc-tag-padding-x: var(--wc-space-1);\n }\n\n :host([size='large']) {\n --wc-tag-height: 28px;\n --wc-tag-font-size: var(--wc-font-size-medium);\n --wc-tag-padding-x: var(--wc-space-2);\n }\n\n .tag {\n display: inline-flex;\n align-items: center;\n gap: var(--wc-space-1);\n height: var(--wc-tag-height);\n padding: 0 var(--wc-tag-padding-x);\n font-size: var(--wc-tag-font-size);\n line-height: 1;\n white-space: nowrap;\n border: 1px solid transparent;\n border-radius: var(--wc-tag-radius);\n box-sizing: border-box;\n transition: opacity var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .icon {\n display: inline-flex;\n align-items: center;\n font-size: 1em;\n }\n\n /* 未分配图标时 slot 渲染占位 fallback,隐藏以消除多余间隙 */\n .icon:has(.icon-placeholder) {\n display: none;\n }\n\n /* ---- 关闭按钮 ---- */\n .close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 14px;\n height: 14px;\n padding: 0;\n font-size: 10px;\n color: inherit;\n cursor: pointer;\n background: transparent;\n border: none;\n border-radius: var(--wc-radius-circle);\n transition: background-color var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .close:hover {\n background-color: var(--wc-color-overlay-hover);\n }\n\n .close wc-icon {\n pointer-events: none;\n }\n\n /* ---- default 主题 ---- */\n :host([theme='default']) .tag {\n color: var(--wc-color-text);\n background-color: var(--wc-color-bg-container-secondary);\n border-color: var(--wc-color-border);\n }\n\n /* ---- 语义色 × light 浅底(默认 type) ---- */\n :host([theme='primary']) .tag {\n color: var(--wc-color-primary);\n background-color: var(--wc-color-primary-light);\n }\n\n :host([theme='success']) .tag {\n color: var(--wc-color-success);\n background-color: var(--wc-color-success-bg);\n }\n\n :host([theme='warning']) .tag {\n color: var(--wc-color-warning);\n background-color: var(--wc-color-warning-bg);\n }\n\n :host([theme='danger']) .tag {\n color: var(--wc-color-error);\n background-color: var(--wc-color-error-bg);\n }\n\n /* ---- dark 实底 ---- */\n :host([type='dark'][theme='default']) .tag {\n color: var(--wc-color-text-anti);\n background-color: var(--wc-color-text-secondary);\n border-color: transparent;\n }\n\n :host([type='dark'][theme='primary']) .tag {\n color: var(--wc-color-text-anti);\n background-color: var(--wc-color-primary);\n }\n\n :host([type='dark'][theme='success']) .tag {\n color: var(--wc-color-text-anti);\n background-color: var(--wc-color-success);\n }\n\n :host([type='dark'][theme='warning']) .tag {\n color: var(--wc-color-text-anti);\n background-color: var(--wc-color-warning);\n }\n\n :host([type='dark'][theme='danger']) .tag {\n color: var(--wc-color-text-anti);\n background-color: var(--wc-color-error);\n }\n\n /* ---- outline 描边 ---- */\n :host([type='outline']) .tag {\n background-color: transparent;\n }\n\n :host([type='outline'][theme='default']) .tag {\n border-color: var(--wc-color-border);\n }\n\n :host([type='outline'][theme='primary']) .tag {\n border-color: var(--wc-color-primary);\n }\n\n :host([type='outline'][theme='success']) .tag {\n border-color: var(--wc-color-success);\n }\n\n :host([type='outline'][theme='warning']) .tag {\n border-color: var(--wc-color-warning);\n }\n\n :host([type='outline'][theme='danger']) .tag {\n border-color: var(--wc-color-error);\n }\n\n /* ---- 禁用 ---- */\n :host([disabled]) .tag {\n cursor: not-allowed;\n opacity: 0.5;\n }\n\n :host([disabled]) .close {\n cursor: not-allowed;\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { LocalizeController } from '../../i18n/localize-controller';\nimport '../icon/wc-icon.js';\nimport { tagStyles } from './wc-tag.styles';\n\nexport type wcTagTheme = 'default' | 'primary' | 'success' | 'warning' | 'danger';\nexport type wcTagSize = 'small' | 'medium' | 'large';\nexport type wcTagType = 'dark' | 'light' | 'outline';\n\n/**\n * 标签。closable 时展示关闭按钮,点击派发 wc-close(是否移除由使用方控制)。\n *\n * @slot - 标签内容\n * @slot icon - 前置图标\n * @csspart base - 标签主体\n * @csspart close-button - 关闭按钮\n * @fires wc-close - 点击关闭按钮后触发\n */\nexport class wcTag extends LitElement {\n static styles = [baseStyles, tagStyles];\n\n /** 语义色 */\n @property({ reflect: true }) theme: wcTagTheme = 'default';\n\n /** 尺寸 */\n @property({ reflect: true }) size: wcTagSize = 'medium';\n\n /** 填充风格:dark 实底 / light 浅底 / outline 描边 */\n @property({ reflect: true }) type: wcTagType = 'light';\n\n /** 可关闭 */\n @property({ type: Boolean, reflect: true }) closable = false;\n\n /** 禁用 */\n @property({ type: Boolean, reflect: true }) disabled = false;\n\n private localize = new LocalizeController(this);\n\n private handleClose(e: MouseEvent): void {\n e.stopPropagation();\n if (this.disabled) return;\n this.dispatchEvent(new CustomEvent('wc-close', { bubbles: true, composed: true }));\n }\n\n render() {\n return html`\n <span class=\"tag\" part=\"base\">\n <slot name=\"icon\" class=\"icon\"><span class=\"icon-placeholder\"></span></slot>\n <slot></slot>\n ${\n this.closable\n ? html`\n <button\n type=\"button\"\n class=\"close\"\n part=\"close-button\"\n tabindex=\"-1\"\n ?disabled=${this.disabled}\n aria-label=${this.localize.term('tag.close')}\n @click=${this.handleClose}\n >\n <wc-icon name=\"close\"></wc-icon>\n </button>\n `\n : ''\n }\n </span>\n `;\n }\n}\n\nif (!customElements.get('wc-tag')) {\n customElements.define('wc-tag', wcTag);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-tag': wcTag;\n }\n}\n","import { css } from 'lit';\n\nexport const avatarStyles = css`\n :host {\n display: inline-block;\n\n /* component 层令牌(预设档位会覆写) */\n --wc-avatar-size: 32px;\n --wc-avatar-font-size: var(--wc-font-size-medium);\n }\n\n .avatar {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n width: var(--wc-avatar-size);\n height: var(--wc-avatar-size);\n font-size: var(--wc-avatar-font-size);\n color: var(--wc-color-text);\n white-space: nowrap;\n user-select: none;\n background-color: var(--wc-color-bg-container-secondary);\n }\n\n .avatar.small {\n --wc-avatar-size: 24px;\n --wc-avatar-font-size: var(--wc-font-size-small);\n }\n\n .avatar.large {\n --wc-avatar-size: 40px;\n --wc-avatar-font-size: var(--wc-font-size-large);\n }\n\n .avatar.shape-circle {\n border-radius: var(--wc-radius-circle);\n }\n\n .avatar.shape-round {\n border-radius: var(--wc-radius-large);\n }\n\n .avatar.shape-square {\n border-radius: var(--wc-radius-small);\n }\n\n .avatar ::slotted(img) {\n display: block;\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n\n .avatar ::slotted(wc-icon) {\n color: var(--wc-color-text-placeholder);\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { avatarStyles } from './wc-avatar.styles';\n\nexport type wcAvatarShape = 'circle' | 'round' | 'square';\nexport type wcAvatarSize = 'small' | 'medium' | 'large';\n\nconst PRESET_SIZES: wcAvatarSize[] = ['small', 'medium', 'large'];\n\n/**\n * 头像。内容放默认插槽(文字 / wc-icon / img 均可)。\n * size 除三档预设外,也接受任意 CSS 尺寸(如 \"48px\" 或纯数字按 px 处理)。\n *\n * @slot - 头像内容\n * @csspart base - 头像主体\n * @cssprop --wc-avatar-size - 自定义尺寸时也可直接覆写此变量\n */\nexport class wcAvatar extends LitElement {\n static styles = [baseStyles, avatarStyles];\n\n /** 尺寸:预设档位或 CSS 尺寸值(纯数字按 px) */\n @property() size: wcAvatarSize | string = 'medium';\n\n /** 形状 */\n @property({ reflect: true }) shape: wcAvatarShape = 'circle';\n\n private get isPreset(): boolean {\n return PRESET_SIZES.includes(this.size as wcAvatarSize);\n }\n\n private get customStyle(): string {\n if (this.isPreset) return '';\n const raw = this.size.trim();\n const size = /^\\d+$/.test(raw) ? `${raw}px` : raw;\n return `--wc-avatar-size:${size};--wc-avatar-font-size:${size}`;\n }\n\n render() {\n return html`\n <div\n class=\"avatar ${this.isPreset ? this.size : 'custom'} shape-${this.shape}\"\n part=\"base\"\n style=${this.customStyle}\n >\n <slot></slot>\n </div>\n `;\n }\n}\n\nif (!customElements.get('wc-avatar')) {\n customElements.define('wc-avatar', wcAvatar);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-avatar': wcAvatar;\n }\n}\n","import { css } from 'lit';\n\nexport const spaceStyles = css`\n :host {\n display: inline-block;\n }\n\n :host([direction='vertical']) {\n display: block;\n }\n\n .space {\n display: flex;\n gap: var(--wc-space-gap, var(--wc-space-4));\n }\n\n /* slot 透明化,让 slotted 子元素直接成为 flex item,gap 才能生效 */\n .space slot {\n display: contents;\n }\n\n :host([direction='vertical']) .space {\n flex-direction: column;\n }\n\n :host([wrap]) .space {\n flex-wrap: wrap;\n }\n\n .align-start {\n align-items: flex-start;\n }\n\n .align-center {\n align-items: center;\n }\n\n .align-end {\n align-items: flex-end;\n }\n\n .align-baseline {\n align-items: baseline;\n }\n\n .align-stretch {\n align-items: stretch;\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { spaceStyles } from './wc-space.styles';\n\nexport type wcSpaceDirection = 'horizontal' | 'vertical';\nexport type wcSpaceAlign = 'start' | 'center' | 'end' | 'baseline';\n\n/** 预设间距档位 → 语义令牌 */\nconst PRESET_SIZES: Record<string, string> = {\n small: 'var(--wc-space-2)',\n medium: 'var(--wc-space-4)',\n large: 'var(--wc-space-6)',\n};\n\n/**\n * 间距容器:为子元素批量提供间距(gap 实现,不产生额外 DOM 包裹)。\n * size 支持预设档位、纯数字(按 px)或任意 CSS 尺寸值。\n *\n * @slot - 任意子元素\n * @csspart base - 间距容器\n * @cssprop --wc-space-gap - 也可直接覆写间距\n */\nexport class wcSpace extends LitElement {\n static styles = [baseStyles, spaceStyles];\n\n /** 间距:small / medium / large / 纯数字(px)/ CSS 尺寸值 */\n @property() size: keyof typeof PRESET_SIZES | string = 'medium';\n\n /** 排列方向 */\n @property({ reflect: true }) direction: wcSpaceDirection = 'horizontal';\n\n /** 对齐方式 */\n @property({ reflect: true }) align?: wcSpaceAlign;\n\n /** 允许换行 */\n @property({ type: Boolean, reflect: true }) wrap = false;\n\n private get gapValue(): string {\n const preset = PRESET_SIZES[this.size];\n if (preset) return preset;\n const raw = this.size.trim();\n return /^\\d+$/.test(raw) ? `${raw}px` : raw;\n }\n\n render() {\n return html`\n <div\n class=\"space ${`align-${this.align ?? (this.direction === 'vertical' ? 'stretch' : 'center')}`}\"\n part=\"base\"\n style=${`--wc-space-gap:${this.gapValue}`}\n >\n <slot></slot>\n </div>\n `;\n }\n}\n\nif (!customElements.get('wc-space')) {\n customElements.define('wc-space', wcSpace);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-space': wcSpace;\n }\n}\n","import { css } from 'lit';\n\nexport const layoutStyles = css`\n :host {\n display: block;\n }\n\n wc-row,\n :host(wc-row) {\n display: block;\n }\n\n wc-col,\n :host(wc-col) {\n display: contents;\n }\n\n .row {\n display: flex;\n column-gap: var(--wc-row-gutter, 0);\n }\n\n .row slot {\n display: contents;\n }\n\n :host([wrap]) .row {\n flex-wrap: wrap;\n }\n\n .justify-start {\n justify-content: flex-start;\n }\n\n .justify-center {\n justify-content: center;\n }\n\n .justify-end {\n justify-content: flex-end;\n }\n\n .justify-space-between {\n justify-content: space-between;\n }\n\n .justify-space-around {\n justify-content: space-around;\n }\n\n .justify-space-evenly {\n justify-content: space-evenly;\n }\n\n .align-top {\n align-items: flex-start;\n }\n\n .align-middle {\n align-items: center;\n }\n\n .align-bottom {\n align-items: flex-end;\n }\n\n .align-stretch {\n align-items: stretch;\n }\n\n .col {\n box-sizing: border-box;\n min-width: 0;\n padding-right: calc(var(--wc-row-gutter, 0) / 2);\n padding-left: calc(var(--wc-row-gutter, 0) / 2);\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { layoutStyles } from './wc-layout.styles';\n\nexport type wcRowJustify =\n | 'start'\n | 'center'\n | 'end'\n | 'space-between'\n | 'space-around'\n | 'space-evenly';\n\nexport type wcRowAlign = 'top' | 'middle' | 'bottom' | 'stretch';\n\n/**\n * 行容器:flex 布局,配合 wc-col 的 span/offset 实现栅格。\n * gutter 为列间距(column-gap,px)。\n *\n * @slot - 放置 wc-col\n * @csspart base - 行容器\n */\nexport class wcRow extends LitElement {\n static styles = [baseStyles, layoutStyles];\n\n /** 列间距(px) */\n @property({ type: Number }) gutter = 0;\n\n /** 水平对齐 */\n @property({ reflect: true }) justify: wcRowJustify = 'start';\n\n /** 垂直对齐 */\n @property({ reflect: true }) align: wcRowAlign = 'top';\n\n /** 允许换行 */\n @property({ type: Boolean, reflect: true }) wrap = false;\n\n render() {\n return html`\n <div\n class=\"row ${`justify-${this.justify} align-${this.align}`}\"\n part=\"base\"\n style=${this.gutter ? `--wc-row-gutter:${this.gutter}px` : ''}\n >\n <slot></slot>\n </div>\n `;\n }\n}\n\n/**\n * 列容器:24 栅格。span 占几列,offset 左侧空几列。\n * host 以 display:contents 参与行布局,实际盒模型由内部 .col 呈现。\n *\n * @slot - 列内容\n * @csspart base - 列容器\n */\nexport class wcCol extends LitElement {\n static styles = [baseStyles, layoutStyles];\n\n /** 占据列数(1~24) */\n @property({ type: Number }) span = 24;\n\n /** 左侧偏移列数(1~23) */\n @property({ type: Number }) offset = 0;\n\n private get widthPercent(): string {\n const span = Math.min(24, Math.max(1, Math.round(this.span) || 24));\n return `${((span / 24) * 100).toFixed(4)}%`;\n }\n\n private get offsetPercent(): string {\n const offset = Math.min(23, Math.max(0, Math.round(this.offset) || 0));\n return `${((offset / 24) * 100).toFixed(4)}%`;\n }\n\n render() {\n return html`\n <div\n class=\"col\"\n part=\"base\"\n style=${`width:${this.widthPercent};margin-left:${this.offsetPercent}`}\n >\n <slot></slot>\n </div>\n `;\n }\n}\n\nif (!customElements.get('wc-row')) {\n customElements.define('wc-row', wcRow);\n}\n\nif (!customElements.get('wc-col')) {\n customElements.define('wc-col', wcCol);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-row': wcRow;\n 'wc-col': wcCol;\n }\n}\n","import { css } from 'lit';\n\nexport const typographyStyles = css`\n :host {\n display: inline;\n }\n\n :host([type='heading']) {\n display: block;\n }\n\n .text {\n color: var(--wc-color-text);\n font-size: var(--wc-font-size-medium);\n line-height: var(--wc-font-line-height, 1.6);\n }\n\n .text slot {\n display: contents;\n }\n\n /* ---- 标题级别(h4~h6 无对应全局令牌,组件层补齐) ---- */\n .heading {\n font-weight: var(--wc-font-weight-semibold);\n line-height: 1.4;\n color: var(--wc-color-text);\n }\n\n .level-1 {\n font-size: var(--wc-font-size-h1);\n }\n\n .level-2 {\n font-size: var(--wc-font-size-h2);\n }\n\n .level-3 {\n font-size: var(--wc-font-size-h3);\n }\n\n .level-4 {\n font-size: var(--wc-font-size-large);\n }\n\n .level-5 {\n font-size: var(--wc-font-size-medium);\n }\n\n .level-6 {\n font-size: var(--wc-font-size-medium);\n font-weight: var(--wc-font-weight-medium);\n }\n\n /* ---- 语义色 ---- */\n :host([theme='secondary']) .text {\n color: var(--wc-color-text-secondary);\n }\n\n :host([theme='success']) .text {\n color: var(--wc-color-success);\n }\n\n :host([theme='warning']) .text {\n color: var(--wc-color-warning);\n }\n\n :host([theme='danger']) .text {\n color: var(--wc-color-error);\n }\n\n /* ---- 禁用 ---- */\n :host([disabled]) .text {\n color: var(--wc-color-text-disabled);\n cursor: not-allowed;\n user-select: none;\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { typographyStyles } from './wc-text.styles';\n\nexport type wcTextType = 'text' | 'heading';\nexport type wcTextTheme = 'default' | 'secondary' | 'success' | 'warning' | 'danger';\n\n/**\n * 排版文本。text 为正文;heading 按 level(1~6)渲染对应语义与字号,\n * 输出 role=\"heading\" + aria-level,保持无障碍语义。\n *\n * @slot - 文本内容\n * @csspart base - 文本容器\n */\nexport class wcText extends LitElement {\n static styles = [baseStyles, typographyStyles];\n\n /** 类型:正文 / 标题 */\n @property({ reflect: true }) type: wcTextType = 'text';\n\n /** 标题级别(仅 heading 生效,1~6,默认 3) */\n @property({ type: Number }) level = 3;\n\n /** 语义色 */\n @property({ reflect: true }) theme: wcTextTheme = 'default';\n\n /** 禁用态(灰字 + not-allowed) */\n @property({ type: Boolean, reflect: true }) disabled = false;\n\n private get headingLevel(): number {\n const n = Math.round(this.level);\n return Math.min(6, Math.max(1, Number.isNaN(n) ? 3 : n));\n }\n\n render() {\n if (this.type === 'heading') {\n const level = this.headingLevel;\n return html`\n <div class=\"text heading level-${level}\" part=\"base\" role=\"heading\" aria-level=${level}>\n <slot></slot>\n </div>\n `;\n }\n return html`<span class=\"text\" part=\"base\"><slot></slot></span>`;\n }\n}\n\nif (!customElements.get('wc-text')) {\n customElements.define('wc-text', wcText);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-text': wcText;\n }\n}\n","import type { LitElement } from 'lit';\n\n/** 参与滚动锁计数的模态弹层元素 */\nconst MODAL_SELECTOR = 'wc-dialog, wc-drawer';\n\nexport interface OverlaySideEffectsHooks {\n /** Escape 触发的关闭请求(reason 固定 'escape') */\n requestClose: (reason: string) => void;\n}\n\n/**\n * 模态弹层打开副作用:Escape 关闭、焦点陷阱与归还、body 滚动锁。\n * 滚动锁按文档内打开的弹层数量判断(DOM 驱动,dialog/drawer 互相计数),\n * 同一弹层的 bind/unbind 由 bound 标志防重入\n * (带 open 属性创建时 connectedCallback 与首次 updated 都会触发 bind)。\n */\nexport class OverlaySideEffects {\n private bound = false;\n private prevFocused: Element | null = null;\n private prevBodyOverflow = '';\n\n constructor(\n private host: LitElement,\n private hooks: OverlaySideEffectsHooks,\n ) {}\n\n /** 文档内除宿主外仍打开的模态弹层数 */\n private otherOpenOverlays(): number {\n let count = 0;\n document.querySelectorAll(MODAL_SELECTOR).forEach((el) => {\n if (el !== this.host && (el as unknown as { open?: boolean }).open) count += 1;\n });\n return count;\n }\n\n private onDocumentKeydown = (e: KeyboardEvent): void => {\n if (e.key === 'Escape') {\n e.stopPropagation();\n this.hooks.requestClose('escape');\n } else if (e.key === 'Tab') {\n this.trapFocus(e);\n }\n };\n\n /** 焦点陷阱:Tab 循环限制在弹层内(shadow + light DOM) */\n trapFocus(e: KeyboardEvent): void {\n const focusables = [\n ...Array.from(\n this.host.shadowRoot!.querySelectorAll<HTMLElement>(\n 'button, [href], [tabindex]:not([tabindex=\"-1\"])',\n ),\n ),\n ...Array.from(\n this.host.querySelectorAll<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\n ),\n ),\n ].filter((el) => !el.hasAttribute('disabled') && el.offsetParent !== null);\n if (focusables.length === 0) return;\n const first = focusables[0]!;\n const last = focusables[focusables.length - 1]!;\n const active = this.host.shadowRoot!.activeElement ?? document.activeElement;\n if (e.shiftKey && (active === first || !this.host.contains(active as Node))) {\n e.preventDefault();\n last.focus();\n } else if (!e.shiftKey && active === last) {\n e.preventDefault();\n first.focus();\n }\n }\n\n bind(): void {\n if (this.bound) return;\n this.bound = true;\n // 记录打开前的焦点元素,关闭时归还\n this.prevFocused = document.activeElement;\n document.addEventListener('keydown', this.onDocumentKeydown, true);\n // body 滚动锁:仅当自己是唯一打开的弹层时加锁\n if (this.otherOpenOverlays() === 0) {\n this.prevBodyOverflow = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n }\n // 初始焦点:关闭按钮 > 弹层本体\n queueMicrotask(() => {\n const target =\n this.host.shadowRoot?.querySelector<HTMLElement>('[part=\"close-button\"]') ??\n this.host.shadowRoot?.querySelector<HTMLElement>('[role=\"dialog\"]');\n target?.focus();\n });\n }\n\n unbind(): void {\n if (!this.bound) return;\n this.bound = false;\n document.removeEventListener('keydown', this.onDocumentKeydown, true);\n // 还有其他弹层开着时不解锁\n if (this.otherOpenOverlays() === 0) {\n document.body.style.overflow = this.prevBodyOverflow;\n }\n // 归还焦点\n if (this.prevFocused && (this.prevFocused as HTMLElement).focus) {\n (this.prevFocused as HTMLElement).focus();\n this.prevFocused = null;\n }\n }\n}\n","import { css } from 'lit';\n\nexport const dialogStyles = css`\n :host {\n display: contents;\n\n /* component 层令牌 */\n --wc-dialog-width: 520px;\n }\n\n .overlay {\n position: fixed;\n inset: 0;\n z-index: var(--wc-z-index-modal);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--wc-space-4);\n background: var(--wc-color-mask);\n animation: wc-dialog-fade var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .overlay[hidden] {\n display: none;\n }\n\n .dialog {\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n width: min(var(--wc-dialog-width), 100%);\n max-height: calc(100vh - var(--wc-space-8));\n overflow: hidden;\n background-color: var(--wc-color-bg-container);\n border-radius: var(--wc-radius-xlarge);\n box-shadow: var(--wc-shadow-3);\n animation: wc-dialog-in var(--wc-duration-medium) var(--wc-easing-standard);\n outline: none;\n }\n\n .header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--wc-space-2);\n padding: var(--wc-space-4) var(--wc-space-6) 0;\n }\n\n .title {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n font-size: var(--wc-font-size-large);\n font-weight: var(--wc-font-weight-semibold);\n color: var(--wc-color-text);\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .close {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n padding: var(--wc-space-1);\n font-size: var(--wc-font-size-medium);\n color: var(--wc-color-text-placeholder);\n cursor: pointer;\n background: transparent;\n border: none;\n border-radius: var(--wc-radius-small);\n transition:\n color var(--wc-duration-fast) var(--wc-easing-standard),\n background-color var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .close:hover {\n color: var(--wc-color-text);\n background-color: var(--wc-color-bg-hover);\n }\n\n .body {\n flex: 1;\n min-height: 0;\n padding: var(--wc-space-4) var(--wc-space-6);\n overflow-y: auto;\n font-size: var(--wc-font-size-medium);\n color: var(--wc-color-text);\n }\n\n .footer {\n display: flex;\n gap: var(--wc-space-2);\n justify-content: flex-end;\n padding: var(--wc-space-2) var(--wc-space-6) var(--wc-space-4);\n }\n\n .footer slot {\n display: contents;\n }\n\n @keyframes wc-dialog-fade {\n from {\n opacity: 0;\n }\n\n to {\n opacity: 1;\n }\n }\n\n @keyframes wc-dialog-in {\n from {\n transform: translateY(-8px) scale(0.98);\n opacity: 0;\n }\n\n to {\n transform: none;\n opacity: 1;\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n .overlay,\n .dialog {\n animation: none;\n }\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { OverlaySideEffects } from '../../common/overlay-side-effects';\nimport { LocalizeController } from '../../i18n/localize-controller';\nimport '../button/wc-button.js';\nimport '../icon/wc-icon.js';\nimport { dialogStyles } from './wc-dialog.styles';\n\nexport type wcDialogCloseReason = 'close-btn' | 'overlay' | 'escape' | 'confirm' | 'cancel' | 'api';\n\n/**\n * 模态对话框。通过 open 属性或 show()/close() 控制;页头/页脚均可换插槽。\n * 关闭统一走可取消的 wc-close 事件(preventDefault 可阻止关闭)。\n *\n * @slot - 对话框内容\n * @slot header - 自定义页头(覆盖 header 属性)\n * @slot footer - 自定义页脚(覆盖默认确认/取消按钮)\n * @csspart overlay - 遮罩层\n * @csspart base - 对话框主体\n * @csspart header - 页头\n * @csspart body - 内容区\n * @csspart footer - 页脚\n * @cssprop --wc-dialog-width - 对话框宽度(默认 520px)\n * @fires wc-open - 打开后触发\n * @fires wc-close - 请求关闭时触发(可取消,detail.reason 标识来源)\n * @fires wc-confirm - 点击默认确认按钮触发(确认后自动请求关闭)\n * @fires wc-cancel - 点击默认取消按钮触发(取消后自动请求关闭)\n */\nexport class wcDialog extends LitElement {\n static styles = [baseStyles, dialogStyles];\n\n /** 是否打开 */\n @property({ type: Boolean, reflect: true }) open = false;\n\n /** 页头标题(header 插槽优先) */\n @property() header = '';\n\n /** 是否展示页脚(默认确认/取消) */\n @property({ type: Boolean }) footer = true;\n\n /** 展示右上角关闭按钮 */\n @property({ type: Boolean, reflect: true }) closable = true;\n\n /** 点击遮罩关闭 */\n @property({ type: Boolean, attribute: 'close-on-overlay-click' }) closeOnOverlayClick = false;\n\n /** 对话框宽度(纯数字按 px) */\n @property() width = '';\n\n private localize = new LocalizeController(this);\n\n /** 打开副作用:Escape / 焦点陷阱 / 滚动锁(与 Drawer 共用) */\n private overlay = new OverlaySideEffects(this, {\n requestClose: (reason) => this.requestClose(reason as wcDialogCloseReason),\n });\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (this.open) this.overlay.bind();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.overlay.unbind();\n }\n\n /** 打开对话框 */\n show(): void {\n if (this.open) return;\n this.open = true;\n }\n\n /** 请求关闭(发出可取消的 wc-close) */\n requestClose(reason: wcDialogCloseReason = 'api'): void {\n const accepted = this.dispatchEvent(\n new CustomEvent('wc-close', {\n detail: { reason },\n bubbles: true,\n composed: true,\n cancelable: true,\n }),\n );\n if (accepted) this.open = false;\n }\n\n /** 默认确认:派发 wc-confirm 并关闭 */\n confirm(): void {\n this.dispatchEvent(new CustomEvent('wc-confirm', { bubbles: true, composed: true }));\n this.requestClose('confirm');\n }\n\n /** 默认取消:派发 wc-cancel 并关闭 */\n cancel(): void {\n this.dispatchEvent(new CustomEvent('wc-cancel', { bubbles: true, composed: true }));\n this.requestClose('cancel');\n }\n\n protected override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (!changed.has('open')) return;\n if (this.open) {\n this.dispatchEvent(new CustomEvent('wc-open', { bubbles: true, composed: true }));\n this.overlay.bind();\n } else {\n this.overlay.unbind();\n }\n }\n\n private onOverlayClick(e: MouseEvent): void {\n if (e.target !== e.currentTarget) return;\n if (this.closeOnOverlayClick) this.requestClose('overlay');\n }\n\n private widthStyle(): string {\n if (!this.width) return '';\n const raw = this.width.trim();\n const size = /^\\d+$/.test(raw) ? `${raw}px` : raw;\n return `--wc-dialog-width:${size}`;\n }\n\n render() {\n return html`\n <div class=\"overlay\" part=\"overlay\" ?hidden=${!this.open} @click=${this.onOverlayClick}>\n <div\n class=\"dialog\"\n part=\"base\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=${this.header || 'dialog'}\n tabindex=\"-1\"\n style=${this.widthStyle()}\n >\n ${\n this.header || this.closable\n ? html`\n <div class=\"header\" part=\"header\">\n <div class=\"title\"><slot name=\"header\">${this.header}</slot></div>\n ${\n this.closable\n ? html`\n <button\n type=\"button\"\n class=\"close\"\n part=\"close-button\"\n aria-label=${this.localize.term('dialog.close')}\n @click=${() => this.requestClose('close-btn')}\n >\n <wc-icon name=\"close\"></wc-icon>\n </button>\n `\n : ''\n }\n </div>\n `\n : ''\n }\n <div class=\"body\" part=\"body\"><slot></slot></div>\n ${\n this.footer\n ? html`\n <div class=\"footer\" part=\"footer\">\n <slot name=\"footer\">\n <wc-button @click=${() => this.cancel()}>\n ${this.localize.term('dialog.cancel')}\n </wc-button>\n <wc-button theme=\"primary\" @click=${() => this.confirm()}>\n ${this.localize.term('dialog.confirm')}\n </wc-button>\n </slot>\n </div>\n `\n : ''\n }\n </div>\n </div>\n `;\n }\n}\n\nif (!customElements.get('wc-dialog')) {\n customElements.define('wc-dialog', wcDialog);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-dialog': wcDialog;\n }\n}\n","import { css } from 'lit';\n\nexport const drawerStyles = css`\n :host {\n display: contents;\n\n /* component 层令牌 */\n --wc-drawer-size: 500px;\n }\n\n .overlay {\n position: fixed;\n inset: 0;\n z-index: var(--wc-z-index-drawer);\n background: var(--wc-color-mask);\n animation: wc-drawer-fade var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .overlay[hidden] {\n display: none;\n }\n\n .drawer {\n position: absolute;\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n overflow: hidden;\n background-color: var(--wc-color-bg-container);\n box-shadow: var(--wc-shadow-2);\n outline: none;\n animation: wc-drawer-in var(--wc-duration-medium) var(--wc-easing-standard);\n }\n\n /* ---- 四个方向 ---- */\n .placement-right {\n inset: 0 0 0 auto;\n width: min(var(--wc-drawer-size), 100%);\n height: 100%;\n --wc-drawer-from: translateX(100%);\n }\n\n .placement-left {\n inset: 0 auto 0 0;\n width: min(var(--wc-drawer-size), 100%);\n height: 100%;\n --wc-drawer-from: translateX(-100%);\n }\n\n .placement-bottom {\n inset: auto 0 0 0;\n width: 100%;\n height: var(--wc-drawer-size);\n --wc-drawer-from: translateY(100%);\n }\n\n .placement-top {\n inset: 0 0 auto 0;\n width: 100%;\n height: var(--wc-drawer-size);\n --wc-drawer-from: translateY(-100%);\n }\n\n /* ---- 页头 ---- */\n .header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--wc-space-2);\n padding: var(--wc-space-4) var(--wc-space-6) 0;\n }\n\n .title {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n font-size: var(--wc-font-size-large);\n font-weight: var(--wc-font-weight-semibold);\n color: var(--wc-color-text);\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .close {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n padding: var(--wc-space-1);\n font-size: var(--wc-font-size-medium);\n color: var(--wc-color-text-placeholder);\n cursor: pointer;\n background: transparent;\n border: none;\n border-radius: var(--wc-radius-small);\n transition:\n color var(--wc-duration-fast) var(--wc-easing-standard),\n background-color var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .close:hover {\n color: var(--wc-color-text);\n background-color: var(--wc-color-bg-hover);\n }\n\n /* ---- 内容区 ---- */\n .body {\n flex: 1;\n min-height: 0;\n padding: var(--wc-space-4) var(--wc-space-6);\n overflow-y: auto;\n font-size: var(--wc-font-size-medium);\n color: var(--wc-color-text);\n }\n\n /* ---- 页脚 ---- */\n .footer {\n display: flex;\n gap: var(--wc-space-2);\n justify-content: flex-end;\n padding: var(--wc-space-2) var(--wc-space-6) var(--wc-space-4);\n }\n\n .footer slot {\n display: contents;\n }\n\n @keyframes wc-drawer-fade {\n from {\n opacity: 0;\n }\n\n to {\n opacity: 1;\n }\n }\n\n @keyframes wc-drawer-in {\n from {\n transform: var(--wc-drawer-from, translateX(100%));\n }\n\n to {\n transform: none;\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n .overlay,\n .drawer {\n animation: none;\n }\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { OverlaySideEffects } from '../../common/overlay-side-effects';\nimport { LocalizeController } from '../../i18n/localize-controller';\nimport '../button/wc-button.js';\nimport '../icon/wc-icon.js';\nimport { drawerStyles } from './wc-drawer.styles';\n\nexport type wcDrawerPlacement = 'left' | 'right' | 'top' | 'bottom';\nexport type wcDrawerCloseReason = 'close-btn' | 'overlay' | 'escape' | 'confirm' | 'cancel' | 'api';\n\n/** 预设尺寸档位(左右为宽,上下为高) */\nconst PRESET_SIZES: Record<string, string> = {\n small: '300px',\n medium: '500px',\n large: '760px',\n};\n\n/**\n * 抽屉:从屏幕边缘滑出的模态面板,复用 Dialog 的弹层副作用\n * (Escape / 焦点陷阱与归还 / 跨弹层滚动锁)。\n * 关闭统一走可取消的 wc-close 事件(preventDefault 可阻止关闭)。\n *\n * @slot - 抽屉内容\n * @slot header - 自定义页头(覆盖 header 属性)\n * @slot footer - 自定义页脚(覆盖默认确认/取消按钮)\n * @csspart overlay - 遮罩层\n * @csspart base - 抽屉面板\n * @csspart header - 页头\n * @csspart body - 内容区\n * @csspart footer - 页脚\n * @cssprop --wc-drawer-size - 面板尺寸(placement 决定是宽还是高)\n * @fires wc-open - 打开后触发\n * @fires wc-close - 请求关闭时触发(可取消,detail.reason 标识来源)\n * @fires wc-confirm - 点击默认确认按钮触发(确认后自动请求关闭)\n * @fires wc-cancel - 点击默认取消按钮触发(取消后自动请求关闭)\n */\nexport class wcDrawer extends LitElement {\n static styles = [baseStyles, drawerStyles];\n\n /** 是否打开 */\n @property({ type: Boolean, reflect: true }) open = false;\n\n /** 弹出边缘 */\n @property({ reflect: true }) placement: wcDrawerPlacement = 'right';\n\n /** 面板尺寸:small / medium / large / 纯数字(px)/ CSS 尺寸值 */\n @property() size: keyof typeof PRESET_SIZES | string = 'medium';\n\n /** 页头标题(header 插槽优先) */\n @property() header = '';\n\n /** 是否展示页脚(默认确认/取消) */\n @property({ type: Boolean }) footer = true;\n\n /** 展示关闭按钮 */\n @property({ type: Boolean, reflect: true }) closable = true;\n\n /** 点击遮罩关闭(抽屉默认开启) */\n @property({ type: Boolean, attribute: 'close-on-overlay-click' }) closeOnOverlayClick = true;\n\n private localize = new LocalizeController(this);\n\n /** 打开副作用:Escape / 焦点陷阱 / 滚动锁(与 Dialog 共用) */\n private overlay = new OverlaySideEffects(this, {\n requestClose: (reason) => this.requestClose(reason as wcDrawerCloseReason),\n });\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (this.open) this.overlay.bind();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.overlay.unbind();\n }\n\n /** 打开抽屉 */\n show(): void {\n if (this.open) return;\n this.open = true;\n }\n\n /** 请求关闭(发出可取消的 wc-close) */\n requestClose(reason: wcDrawerCloseReason = 'api'): void {\n const accepted = this.dispatchEvent(\n new CustomEvent('wc-close', {\n detail: { reason },\n bubbles: true,\n composed: true,\n cancelable: true,\n }),\n );\n if (accepted) this.open = false;\n }\n\n /** 默认确认:派发 wc-confirm 并关闭 */\n confirm(): void {\n this.dispatchEvent(new CustomEvent('wc-confirm', { bubbles: true, composed: true }));\n this.requestClose('confirm');\n }\n\n /** 默认取消:派发 wc-cancel 并关闭 */\n cancel(): void {\n this.dispatchEvent(new CustomEvent('wc-cancel', { bubbles: true, composed: true }));\n this.requestClose('cancel');\n }\n\n protected override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (!changed.has('open')) return;\n if (this.open) {\n this.dispatchEvent(new CustomEvent('wc-open', { bubbles: true, composed: true }));\n this.overlay.bind();\n } else {\n this.overlay.unbind();\n }\n }\n\n private onOverlayClick(e: MouseEvent): void {\n if (e.target !== e.currentTarget) return;\n if (this.closeOnOverlayClick) this.requestClose('overlay');\n }\n\n private sizeStyle(): string {\n const preset = PRESET_SIZES[this.size];\n const raw = preset ?? this.size.trim();\n const size = /^\\d+$/.test(raw) ? `${raw}px` : raw;\n return `--wc-drawer-size:${size}`;\n }\n\n render() {\n return html`\n <div class=\"overlay\" part=\"overlay\" ?hidden=${!this.open} @click=${this.onOverlayClick}>\n <div\n class=\"drawer placement-${this.placement}\"\n part=\"base\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=${this.header || 'drawer'}\n tabindex=\"-1\"\n style=${this.sizeStyle()}\n >\n ${\n this.header || this.closable\n ? html`\n <div class=\"header\" part=\"header\">\n <div class=\"title\"><slot name=\"header\">${this.header}</slot></div>\n ${\n this.closable\n ? html`\n <button\n type=\"button\"\n class=\"close\"\n part=\"close-button\"\n aria-label=${this.localize.term('dialog.close')}\n @click=${() => this.requestClose('close-btn')}\n >\n <wc-icon name=\"close\"></wc-icon>\n </button>\n `\n : ''\n }\n </div>\n `\n : ''\n }\n <div class=\"body\" part=\"body\"><slot></slot></div>\n ${\n this.footer\n ? html`\n <div class=\"footer\" part=\"footer\">\n <slot name=\"footer\">\n <wc-button @click=${() => this.cancel()}>\n ${this.localize.term('dialog.cancel')}\n </wc-button>\n <wc-button theme=\"primary\" @click=${() => this.confirm()}>\n ${this.localize.term('dialog.confirm')}\n </wc-button>\n </slot>\n </div>\n `\n : ''\n }\n </div>\n </div>\n `;\n }\n}\n\nif (!customElements.get('wc-drawer')) {\n customElements.define('wc-drawer', wcDrawer);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-drawer': wcDrawer;\n }\n}\n","import { css } from 'lit';\n\nexport const messageStyles = css`\n :host {\n display: block;\n pointer-events: auto;\n }\n\n .message {\n display: flex;\n align-items: flex-start;\n gap: var(--wc-space-2);\n box-sizing: border-box;\n min-width: 240px;\n max-width: 480px;\n margin: 0 auto var(--wc-space-2);\n padding: var(--wc-space-2) var(--wc-space-4);\n font-size: var(--wc-font-size-medium);\n line-height: var(--wc-font-line-height, 1.6);\n color: var(--wc-color-text);\n background-color: var(--wc-color-bg-container);\n border-radius: var(--wc-radius-medium);\n box-shadow: var(--wc-shadow-2);\n animation: wc-message-in var(--wc-duration-medium) var(--wc-easing-standard);\n }\n\n .icon {\n flex-shrink: 0;\n margin-top: 2px;\n font-size: var(--wc-font-size-large);\n }\n\n .icon.success {\n color: var(--wc-color-success);\n }\n\n .icon.error {\n color: var(--wc-color-error);\n }\n\n .icon.warning {\n color: var(--wc-color-warning);\n }\n\n .icon.info,\n .icon.loading {\n color: var(--wc-color-primary);\n }\n\n .content {\n flex: 1;\n min-width: 0;\n overflow-wrap: anywhere;\n }\n\n .close {\n display: inline-flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n padding: 0;\n font-size: var(--wc-font-size-medium);\n color: var(--wc-color-text-placeholder);\n cursor: pointer;\n background: transparent;\n border: none;\n border-radius: var(--wc-radius-small);\n transition: color var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .close:hover {\n color: var(--wc-color-text);\n }\n\n @keyframes wc-message-in {\n from {\n transform: translateY(-100%);\n opacity: 0;\n }\n\n to {\n transform: none;\n opacity: 1;\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n .message {\n animation: none;\n }\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { LocalizeController } from '../../i18n/localize-controller';\nimport '../icon/wc-icon.js';\nimport { messageStyles } from './wc-message.styles';\n\nexport type wcMessageTheme = 'info' | 'success' | 'warning' | 'error' | 'loading';\n\n/** 主题 → 内置图标 */\nconst THEME_ICONS: Record<wcMessageTheme, string> = {\n info: 'info',\n success: 'check',\n warning: 'warning',\n error: 'error',\n loading: 'loader',\n};\n\n/**\n * 全局提示(单条)。常规用法是命令式 API `message.success('...')`,\n * 也可以声明式书写(content 属性或默认插槽,duration 控制自动关闭)。\n * 关闭时派发 wc-close 并将自身从 DOM 移除。\n *\n * @slot - 提示内容(覆盖 content 属性)\n * @slot icon - 覆盖主题图标\n * @csspart base - 提示条\n * @csspart icon - 主题图标\n * @csspart content - 内容\n * @csspart close-button - 关闭按钮\n * @fires wc-close - 关闭时触发(之后组件从 DOM 移除)\n */\nexport class wcMessage extends LitElement {\n static styles = [baseStyles, messageStyles];\n\n /** 提示类型 */\n @property({ reflect: true }) theme: wcMessageTheme = 'info';\n\n /** 提示内容 */\n @property() content = '';\n\n /** 自动关闭时长(ms),0 表示不自动关闭 */\n @property({ type: Number }) duration = 3000;\n\n /** 显示关闭按钮 */\n @property({ type: Boolean, reflect: true }) closable = false;\n\n private localize = new LocalizeController(this);\n\n private autoCloseTimer: ReturnType<typeof setTimeout> | null = null;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.startAutoClose();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.stopAutoClose();\n }\n\n private startAutoClose(): void {\n if (this.duration <= 0 || this.autoCloseTimer !== null) return;\n this.autoCloseTimer = setTimeout(() => this.close(), this.duration);\n }\n\n private stopAutoClose(): void {\n if (this.autoCloseTimer !== null) {\n clearTimeout(this.autoCloseTimer);\n this.autoCloseTimer = null;\n }\n }\n\n /** 关闭:派发 wc-close 并从 DOM 移除自身 */\n close(): void {\n this.stopAutoClose();\n this.dispatchEvent(new CustomEvent('wc-close', { bubbles: true, composed: true }));\n this.remove();\n }\n\n render() {\n const icon = THEME_ICONS[this.theme] ?? 'info';\n return html`\n <div class=\"message\" part=\"base\" role=\"status\" aria-live=\"polite\">\n <wc-icon\n class=\"icon ${this.theme}\"\n part=\"icon\"\n name=${icon}\n ?spin=${this.theme === 'loading'}\n ></wc-icon>\n <div class=\"content\" part=\"content\"><slot>${this.content}</slot></div>\n ${\n this.closable\n ? html`\n <button\n type=\"button\"\n class=\"close\"\n part=\"close-button\"\n aria-label=${this.localize.term('message.close')}\n @click=${() => this.close()}\n >\n <wc-icon name=\"close\"></wc-icon>\n </button>\n `\n : ''\n }\n </div>\n `;\n }\n}\n\nif (!customElements.get('wc-message')) {\n customElements.define('wc-message', wcMessage);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-message': wcMessage;\n }\n}\n","import type { wcMessage, wcMessageTheme } from './wc-message.js';\nimport './wc-message.js';\n\nexport interface WcMessageOptions {\n /** 提示类型,默认 info */\n theme?: wcMessageTheme;\n /** 自动关闭时长(ms),默认 3000,0 表示不自动关闭 */\n duration?: number;\n /** 显示关闭按钮,默认 false */\n closable?: boolean;\n /** 关闭回调 */\n onClose?: () => void;\n}\n\nlet container: HTMLDivElement | null = null;\n\n/** 全局消息容器(单例):固定顶部居中,纵向堆叠 */\nfunction ensureContainer(): HTMLDivElement {\n if (container && container.isConnected) return container;\n container = document.createElement('div');\n container.className = 'wc-message-container';\n const zIndex = parseFloat(\n getComputedStyle(document.documentElement).getPropertyValue('--wc-z-index-message'),\n );\n container.style.cssText = [\n 'position:fixed',\n 'top:var(--wc-space-4, 16px)',\n 'left:0',\n 'right:0',\n 'display:flex',\n 'flex-direction:column',\n 'align-items:center',\n 'pointer-events:none',\n `z-index:${Number.isFinite(zIndex) && zIndex > 0 ? zIndex : 1500}`,\n ].join(';');\n document.body.appendChild(container);\n return container;\n}\n\n/** 命令式消息入口:message.success('已保存') */\nfunction showMessage(content: string, options: WcMessageOptions = {}): wcMessage {\n const el = document.createElement('wc-message') as wcMessage;\n el.theme = options.theme ?? 'info';\n el.content = content;\n if (options.duration !== undefined) el.duration = options.duration;\n if (options.closable !== undefined) el.closable = options.closable;\n if (options.onClose) el.addEventListener('wc-close', () => options.onClose!());\n ensureContainer().appendChild(el);\n return el;\n}\n\nexport const message = {\n /** 普通信息 */\n info: (content: string, options?: WcMessageOptions) =>\n showMessage(content, { ...options, theme: 'info' }),\n /** 成功 */\n success: (content: string, options?: WcMessageOptions) =>\n showMessage(content, { ...options, theme: 'success' }),\n /** 警告 */\n warning: (content: string, options?: WcMessageOptions) =>\n showMessage(content, { ...options, theme: 'warning' }),\n /** 错误 */\n error: (content: string, options?: WcMessageOptions) =>\n showMessage(content, { ...options, theme: 'error' }),\n /** 加载中(不自动关闭,需手动 close 或传 duration) */\n loading: (content: string, options?: WcMessageOptions) =>\n showMessage(content, { duration: 0, closable: false, ...options, theme: 'loading' }),\n /** 完整配置入口 */\n show: showMessage,\n};\n","/**\n * 弹层定位引擎(零依赖,纯函数)。\n * 输入锚点/弹层/视口的矩形,输出弹层坐标、最终 placement 与箭头偏移。\n * 不够空间时沿主轴翻转(top↔bottom、left↔right),再向视口内夹紧;\n * Tooltip / Popconfirm 等浮层组件共用。\n */\n\nexport type WcPlacementBase = 'top' | 'bottom' | 'left' | 'right';\nexport type WcPlacementAlign = 'start' | 'end';\n\nexport type WcPlacement = WcPlacementBase | `${WcPlacementBase}-start` | `${WcPlacementBase}-end`;\n\nexport interface WcRect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface WcPositionResult {\n /** 弹层 left(px,position:fixed) */\n x: number;\n /** 弹层 top(px,position:fixed) */\n y: number;\n /** 翻转后的最终 placement */\n placement: WcPlacement;\n /** 箭头中心距弹层起始边(左或上)的偏移(px) */\n arrowOffset: number;\n}\n\n/** 弹层与锚点的间距 */\nexport const POSITION_GAP = 8;\n\n/** 箭头中心距弹层边缘的最小/最大留白 */\nexport const ARROW_INSET = 12;\n\nexport function splitPlacement(placement: WcPlacement): {\n base: WcPlacementBase;\n align?: WcPlacementAlign;\n} {\n const index = placement.indexOf('-');\n if (index === -1) return { base: placement as WcPlacementBase };\n return {\n base: placement.slice(0, index) as WcPlacementBase,\n align: placement.slice(index + 1) as WcPlacementAlign,\n };\n}\n\nfunction oppositeBase(base: WcPlacementBase): WcPlacementBase {\n switch (base) {\n case 'top':\n return 'bottom';\n case 'bottom':\n return 'top';\n case 'left':\n return 'right';\n case 'right':\n return 'left';\n }\n}\n\n/** 主轴方向该侧是否放得下 */\nfunction fitsOnSide(\n base: WcPlacementBase,\n anchor: WcRect,\n panel: WcRect,\n viewport: WcRect,\n): boolean {\n switch (base) {\n case 'top':\n return anchor.y - panel.height - POSITION_GAP >= viewport.y;\n case 'bottom':\n return anchor.y + anchor.height + panel.height + POSITION_GAP <= viewport.y + viewport.height;\n case 'left':\n return anchor.x - panel.width - POSITION_GAP >= viewport.x;\n case 'right':\n return anchor.x + anchor.width + panel.width + POSITION_GAP <= viewport.x + viewport.width;\n }\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n // 下限优先:弹层大于视口时 max 可能小于 min,保证不产生负偏移\n return Math.max(min, Math.min(value, max));\n}\n\n/**\n * 计算 fixed 定位坐标。\n * @param anchor 锚点矩形(getBoundingClientRect)\n * @param panel 弹层矩形(需已渲染可测量;不可见时可 visibility:hidden,不能 display:none)\n * @param viewport 可用视口矩形(window.innerWidth/innerHeight 构造)\n * @param preferred 期望 placement\n */\nexport function computePosition(\n anchor: WcRect,\n panel: WcRect,\n viewport: WcRect,\n preferred: WcPlacement,\n): WcPositionResult {\n const { base, align } = splitPlacement(preferred);\n let useBase = base;\n if (\n !fitsOnSide(base, anchor, panel, viewport) &&\n fitsOnSide(oppositeBase(base), anchor, panel, viewport)\n ) {\n useBase = oppositeBase(base);\n }\n\n // 交叉轴对齐坐标(未夹紧)\n const alignStart = align === 'start';\n const alignEnd = align === 'end';\n let x: number;\n let y: number;\n\n const alignCross = (anchorStart: number, anchorSize: number, panelSize: number): number => {\n if (alignStart) return anchorStart;\n if (alignEnd) return anchorStart + anchorSize - panelSize;\n return anchorStart + anchorSize / 2 - panelSize / 2;\n };\n\n if (useBase === 'top' || useBase === 'bottom') {\n x = alignCross(anchor.x, anchor.width, panel.width);\n y =\n useBase === 'top'\n ? anchor.y - panel.height - POSITION_GAP\n : anchor.y + anchor.height + POSITION_GAP;\n } else {\n y = alignCross(anchor.y, anchor.height, panel.height);\n x =\n useBase === 'left'\n ? anchor.x - panel.width - POSITION_GAP\n : anchor.x + anchor.width + POSITION_GAP;\n }\n\n // 向视口内夹紧\n x = clamp(x, viewport.x, viewport.x + viewport.width - panel.width);\n y = clamp(y, viewport.y, viewport.y + viewport.height - panel.height);\n\n // 箭头:位于弹层朝向锚点的边上,中心对准锚点中心(夹紧留白)\n const anchorCrossCenter =\n useBase === 'top' || useBase === 'bottom'\n ? anchor.x + anchor.width / 2 - x\n : anchor.y + anchor.height / 2 - y;\n const maxOffset =\n (useBase === 'top' || useBase === 'bottom' ? panel.width : panel.height) - ARROW_INSET;\n const arrowOffset = clamp(anchorCrossCenter, ARROW_INSET, Math.max(ARROW_INSET, maxOffset));\n\n const placement: WcPlacement = align ? `${useBase}-${align}` : useBase;\n return { x, y, placement, arrowOffset };\n}\n","import { css } from 'lit';\n\nexport const tooltipStyles = css`\n :host {\n display: inline-block;\n\n /* component 层令牌 */\n --wc-tooltip-max-width: 240px;\n --wc-tooltip-arrow-offset: 50%;\n }\n\n .trigger {\n display: inline-flex;\n }\n\n .panel {\n position: fixed;\n z-index: var(--wc-z-index-tooltip);\n box-sizing: border-box;\n max-width: var(--wc-tooltip-max-width);\n padding: var(--wc-space-2) var(--wc-space-3);\n font-size: var(--wc-font-size-small);\n line-height: var(--wc-font-line-height, 1.6);\n color: var(--wc-color-text-anti);\n background-color: var(--wc-color-gray-900);\n border-radius: var(--wc-radius-small);\n box-shadow: var(--wc-shadow-2);\n opacity: 0;\n visibility: hidden;\n transform: scale(0.96);\n transition:\n opacity var(--wc-duration-fast) var(--wc-easing-standard),\n transform var(--wc-duration-fast) var(--wc-easing-standard),\n visibility var(--wc-duration-fast);\n }\n\n .panel[data-open] {\n opacity: 1;\n visibility: visible;\n transform: none;\n }\n\n .body {\n overflow-wrap: anywhere;\n }\n\n /* ---- 箭头:8px 旋转正方形,贴在朝向锚点的一边 ---- */\n .arrow {\n position: absolute;\n width: 8px;\n height: 8px;\n background-color: inherit;\n transform: rotate(45deg);\n }\n\n .side-top .arrow {\n left: var(--wc-tooltip-arrow-offset);\n bottom: -4px;\n margin-left: -4px;\n }\n\n .side-bottom .arrow {\n left: var(--wc-tooltip-arrow-offset);\n top: -4px;\n margin-left: -4px;\n }\n\n .side-left .arrow {\n top: var(--wc-tooltip-arrow-offset);\n right: -4px;\n margin-top: -4px;\n }\n\n .side-right .arrow {\n top: var(--wc-tooltip-arrow-offset);\n left: -4px;\n margin-top: -4px;\n }\n\n @media (prefers-reduced-motion: reduce) {\n .panel {\n transition: none;\n }\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { computePosition, splitPlacement, type WcPlacement } from '../../common/position';\nimport '../icon/wc-icon.js';\nimport { tooltipStyles } from './wc-tooltip.styles';\n\nexport type wcTooltipTrigger = 'hover' | 'click' | 'manual';\n\n/** 显示/隐藏防抖延迟(ms) */\nconst SHOW_DELAY = 100;\nconst HIDE_DELAY = 150;\n\nlet tooltipUid = 0;\n\n/**\n * 文字提示:悬浮/聚焦触发,auto-placement 会在空间不足时自动翻转方向。\n * content 属性或 content 插槽提供内容;trigger=\"manual\" 时用 show()/hide() 控制。\n *\n * @slot - 触发元素\n * @slot content - 富文本内容(覆盖 content 属性)\n * @csspart trigger - 触发区\n * @csspart base - 提示面板\n * @csspart arrow - 箭头\n * @cssprop --wc-tooltip-max-width - 面板最大宽度(默认 240px)\n * @fires wc-show - 开始显示时触发\n * @fires wc-hide - 开始隐藏时触发\n */\nexport class wcTooltip extends LitElement {\n static styles = [baseStyles, tooltipStyles];\n\n /** 提示内容 */\n @property() content = '';\n\n /** 期望弹出方向(空间不足自动翻转) */\n @property() placement: WcPlacement = 'top';\n\n /** 触发方式:hover(含 focus)/ click / manual */\n @property({ reflect: true }) trigger: wcTooltipTrigger = 'hover';\n\n /** 当前是否可见 */\n @property({ type: Boolean, reflect: true }) open = false;\n\n private panelId = `wc-tooltip-panel-${++tooltipUid}`;\n\n private showTimer: ReturnType<typeof setTimeout> | null = null;\n private hideTimer: ReturnType<typeof setTimeout> | null = null;\n\n private onDocumentClick = (e: Event): void => {\n if (e.composedPath().includes(this)) return;\n this.hide();\n };\n\n override connectedCallback(): void {\n super.connectedCallback();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.clearTimers();\n document.removeEventListener('click', this.onDocumentClick, true);\n }\n\n /** 显示(manual 模式或编程调用) */\n show(): void {\n this.clearTimers();\n this.showTimer = setTimeout(() => {\n if (!this.open) {\n this.open = true;\n this.dispatchEvent(new CustomEvent('wc-show', { bubbles: true, composed: true }));\n }\n }, SHOW_DELAY);\n }\n\n /** 隐藏 */\n hide(): void {\n this.clearTimers();\n this.hideTimer = setTimeout(() => {\n if (this.open) {\n this.open = false;\n this.dispatchEvent(new CustomEvent('wc-hide', { bubbles: true, composed: true }));\n }\n }, HIDE_DELAY);\n }\n\n private clearTimers(): void {\n if (this.showTimer !== null) {\n clearTimeout(this.showTimer);\n this.showTimer = null;\n }\n if (this.hideTimer !== null) {\n clearTimeout(this.hideTimer);\n this.hideTimer = null;\n }\n }\n\n private onTriggerEnter(): void {\n if (this.trigger !== 'hover') return;\n this.show();\n }\n\n private onTriggerLeave(): void {\n if (this.trigger !== 'hover') return;\n this.hide();\n }\n\n private onTriggerClick(e: Event): void {\n if (this.trigger !== 'click') return;\n // 避免点击触发元素本身触发 document 关闭逻辑\n e.stopPropagation();\n if (this.open) this.hide();\n else this.show();\n }\n\n private onTriggerKeydown(e: KeyboardEvent): void {\n if (this.trigger === 'click' && e.key === 'Escape' && this.open) {\n this.hide();\n }\n }\n\n protected override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n // open 变化后:click 模式挂/卸 document 点击关闭\n if (changed.has('open')) {\n if (this.open && this.trigger === 'click') {\n document.addEventListener('click', this.onDocumentClick, true);\n } else if (!this.open) {\n document.removeEventListener('click', this.onDocumentClick, true);\n }\n if (this.open) this.position();\n }\n }\n\n /** 计算并应用 fixed 定位与箭头偏移 */\n private position(): void {\n const panel = this.shadowRoot!.querySelector<HTMLElement>('.panel');\n if (!panel) return;\n const anchor = this.getBoundingClientRect();\n const panelRect = panel.getBoundingClientRect();\n const viewport = { x: 0, y: 0, width: window.innerWidth, height: window.innerHeight };\n const result = computePosition(anchor, panelRect, viewport, this.placement);\n panel.style.left = `${result.x}px`;\n panel.style.top = `${result.y}px`;\n panel.dataset.placement = result.placement;\n panel.style.setProperty('--wc-tooltip-arrow-offset', `${result.arrowOffset}px`);\n }\n\n render() {\n const { base } = splitPlacement(this.placement);\n return html`\n <span\n class=\"trigger\"\n part=\"trigger\"\n aria-describedby=${this.panelId}\n @mouseenter=${this.onTriggerEnter}\n @mouseleave=${this.onTriggerLeave}\n @focusin=${this.onTriggerEnter}\n @focusout=${this.onTriggerLeave}\n @click=${this.onTriggerClick}\n @keydown=${this.onTriggerKeydown}\n >\n <slot></slot>\n </span>\n <div\n class=\"panel side-${base}\"\n part=\"base\"\n id=${this.panelId}\n role=\"tooltip\"\n ?data-open=${this.open}\n >\n <div class=\"arrow\" part=\"arrow\"></div>\n <div class=\"body\"><slot name=\"content\">${this.content}</slot></div>\n </div>\n `;\n }\n}\n\nif (!customElements.get('wc-tooltip')) {\n customElements.define('wc-tooltip', wcTooltip);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-tooltip': wcTooltip;\n }\n}\n","import { css } from 'lit';\n\nexport const popconfirmStyles = css`\n :host {\n display: inline-block;\n\n /* component 层令牌 */\n --wc-popconfirm-width: 240px;\n --wc-popconfirm-arrow-offset: 50%;\n }\n\n .trigger {\n display: inline-flex;\n }\n\n .panel {\n position: fixed;\n z-index: var(--wc-z-index-tooltip);\n box-sizing: border-box;\n width: var(--wc-popconfirm-width);\n padding: var(--wc-space-4);\n font-size: var(--wc-font-size-medium);\n line-height: var(--wc-font-line-height, 1.6);\n color: var(--wc-color-text);\n background-color: var(--wc-color-bg-container);\n border-radius: var(--wc-radius-medium);\n box-shadow: var(--wc-shadow-2);\n opacity: 0;\n visibility: hidden;\n transform: scale(0.96);\n transition:\n opacity var(--wc-duration-fast) var(--wc-easing-standard),\n transform var(--wc-duration-fast) var(--wc-easing-standard),\n visibility var(--wc-duration-fast);\n }\n\n .panel[data-open] {\n opacity: 1;\n visibility: visible;\n transform: none;\n }\n\n .main {\n display: flex;\n align-items: flex-start;\n gap: var(--wc-space-2);\n }\n\n .icon {\n flex-shrink: 0;\n margin-top: 2px;\n font-size: var(--wc-font-size-large);\n color: var(--wc-color-warning);\n }\n\n .content {\n flex: 1;\n min-width: 0;\n overflow-wrap: anywhere;\n }\n\n .actions {\n display: flex;\n gap: var(--wc-space-2);\n justify-content: flex-end;\n margin-top: var(--wc-space-3);\n }\n\n /* ---- 箭头(同 Tooltip) ---- */\n .arrow {\n position: absolute;\n width: 8px;\n height: 8px;\n background-color: inherit;\n transform: rotate(45deg);\n }\n\n .side-top .arrow {\n left: var(--wc-popconfirm-arrow-offset);\n bottom: -4px;\n margin-left: -4px;\n }\n\n .side-bottom .arrow {\n left: var(--wc-popconfirm-arrow-offset);\n top: -4px;\n margin-left: -4px;\n }\n\n .side-left .arrow {\n top: var(--wc-popconfirm-arrow-offset);\n right: -4px;\n margin-top: -4px;\n }\n\n .side-right .arrow {\n top: var(--wc-popconfirm-arrow-offset);\n left: -4px;\n margin-top: -4px;\n }\n\n @media (prefers-reduced-motion: reduce) {\n .panel {\n transition: none;\n }\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { computePosition, splitPlacement, type WcPlacement } from '../../common/position';\nimport { LocalizeController } from '../../i18n/localize-controller';\nimport '../button/wc-button.js';\nimport '../icon/wc-icon.js';\nimport { popconfirmStyles } from './wc-popconfirm.styles';\n\nlet popconfirmUid = 0;\n\n/**\n * 气泡确认:点击触发的二次确认浮层。\n * 定位复用 position.ts(空间不足自动翻转),确认/取消派发 wc-confirm / wc-cancel\n * 并自动关闭。点击外部或 Esc 也会关闭。\n *\n * @slot - 触发元素\n * @slot content - 确认文案(覆盖 content 属性)\n * @csspart trigger - 触发区\n * @csspart base - 气泡面板\n * @csspart icon - 提示图标\n * @csspart actions - 按钮区\n * @fires wc-confirm - 点击确认(之后自动关闭)\n * @fires wc-cancel - 点击取消 / 外部点击 / Esc(之后自动关闭)\n */\nexport class wcPopconfirm extends LitElement {\n static styles = [baseStyles, popconfirmStyles];\n\n /** 确认文案 */\n @property() content = '';\n\n /** 期望弹出方向(空间不足自动翻转) */\n @property() placement: WcPlacement = 'top';\n\n /** 确认按钮文案(默认 i18n「确认」) */\n @property({ attribute: 'confirm-text' }) confirmText = '';\n\n /** 取消按钮文案(默认 i18n「取消」) */\n @property({ attribute: 'cancel-text' }) cancelText = '';\n\n /** 确认按钮主题(primary/danger 等,透传 wc-button) */\n @property() theme = 'primary';\n\n /** 图标名称(内置图标名,空字符串隐藏) */\n @property() icon = 'warning';\n\n /** 当前是否打开 */\n @property({ type: Boolean, reflect: true }) open = false;\n\n private panelId = `wc-popconfirm-panel-${++popconfirmUid}`;\n\n private localize = new LocalizeController(this);\n\n private onDocumentClick = (e: Event): void => {\n if (e.composedPath().includes(this)) return;\n this.cancel('outside');\n };\n\n private onDocumentKeydown = (e: KeyboardEvent): void => {\n if (e.key === 'Escape') {\n e.stopPropagation();\n this.cancel('escape');\n }\n };\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.unbindSideEffects();\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n // 带 open 属性创建时 show() 不会执行,副作用需在此绑定\n if (this.open) this.bindSideEffects();\n }\n\n /** 打开气泡 */\n show(): void {\n if (this.open) return;\n this.open = true;\n this.bindSideEffects();\n }\n\n /** 关闭气泡(不派发事件) */\n hide(): void {\n if (!this.open) return;\n this.open = false;\n this.unbindSideEffects();\n }\n\n /** 确认:派发 wc-confirm 并关闭 */\n confirm(): void {\n this.dispatchEvent(new CustomEvent('wc-confirm', { bubbles: true, composed: true }));\n this.hide();\n }\n\n /** 取消:派发 wc-cancel 并关闭 */\n cancel(reason: 'button' | 'outside' | 'escape' = 'button'): void {\n if (!this.open) return;\n this.dispatchEvent(\n new CustomEvent('wc-cancel', { detail: { reason }, bubbles: true, composed: true }),\n );\n this.hide();\n }\n\n private bindSideEffects(): void {\n document.addEventListener('click', this.onDocumentClick, true);\n document.addEventListener('keydown', this.onDocumentKeydown, true);\n // 焦点移到确认按钮;关闭时归还给触发元素\n queueMicrotask(() => {\n this.shadowRoot!.querySelector<HTMLElement>('[part=\"confirm-button\"]')?.focus();\n });\n }\n\n private unbindSideEffects(): void {\n document.removeEventListener('click', this.onDocumentClick, true);\n document.removeEventListener('keydown', this.onDocumentKeydown, true);\n this.shadowRoot!.querySelector<HTMLElement>('.trigger')?.focus();\n }\n\n protected override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (!changed.has('open')) return;\n if (this.open) {\n this.bindSideEffects();\n this.position();\n } else {\n this.unbindSideEffects();\n }\n }\n\n /** 计算并应用 fixed 定位与箭头偏移(同 Tooltip) */\n private position(): void {\n const panel = this.shadowRoot!.querySelector<HTMLElement>('.panel');\n if (!panel) return;\n const anchor = this.getBoundingClientRect();\n const panelRect = panel.getBoundingClientRect();\n const viewport = { x: 0, y: 0, width: window.innerWidth, height: window.innerHeight };\n const result = computePosition(anchor, panelRect, viewport, this.placement);\n panel.style.left = `${result.x}px`;\n panel.style.top = `${result.y}px`;\n panel.dataset.placement = result.placement;\n panel.style.setProperty('--wc-popconfirm-arrow-offset', `${result.arrowOffset}px`);\n }\n\n private onTriggerClick(e: Event): void {\n // 防止触发元素的点击冒泡到 document 立即又关闭\n e.stopPropagation();\n if (this.open) this.hide();\n else this.show();\n }\n\n render() {\n const { base } = splitPlacement(this.placement);\n return html`\n <span\n class=\"trigger\"\n part=\"trigger\"\n tabindex=\"0\"\n role=\"button\"\n aria-describedby=${this.open ? this.panelId : ''}\n @click=${this.onTriggerClick}\n @keydown=${(e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n this.onTriggerClick(e);\n }\n }}\n >\n <slot></slot>\n </span>\n <div\n class=\"panel side-${base}\"\n part=\"base\"\n id=${this.panelId}\n role=\"dialog\"\n aria-label=${this.content || 'popconfirm'}\n ?data-open=${this.open}\n >\n <div class=\"arrow\" part=\"arrow\"></div>\n <div class=\"main\">\n ${this.icon ? html`<wc-icon class=\"icon\" part=\"icon\" name=${this.icon}></wc-icon>` : ''}\n <div class=\"content\"><slot name=\"content\">${this.content}</slot></div>\n </div>\n <div class=\"actions\" part=\"actions\">\n <wc-button size=\"small\" @click=${() => this.cancel('button')}>\n ${this.cancelText || this.localize.term('dialog.cancel')}\n </wc-button>\n <wc-button\n size=\"small\"\n theme=${this.theme}\n part=\"confirm-button\"\n @click=${() => this.confirm()}\n >\n ${this.confirmText || this.localize.term('dialog.confirm')}\n </wc-button>\n </div>\n </div>\n `;\n }\n}\n\nif (!customElements.get('wc-popconfirm')) {\n customElements.define('wc-popconfirm', wcPopconfirm);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-popconfirm': wcPopconfirm;\n }\n}\n","import { css } from 'lit';\n\nexport const dropdownItemStyles = css`\n :host {\n display: block;\n }\n\n .item {\n display: flex;\n align-items: center;\n gap: var(--wc-space-2);\n padding: 0 var(--wc-space-3);\n height: 32px;\n font-size: var(--wc-font-size-medium);\n color: var(--wc-color-text);\n cursor: pointer;\n user-select: none;\n transition: background-color var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .text {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n :host(:hover:not([disabled]):not([divider])) .item,\n :host([active]:not([disabled]):not([divider])) .item {\n background-color: var(--wc-color-bg-hover);\n }\n\n :host([danger]:not([disabled])) .item {\n color: var(--wc-color-error);\n }\n\n :host([disabled]) .item {\n color: var(--wc-color-text-disabled);\n cursor: not-allowed;\n }\n\n /* 分隔线:不响应 hover / danger */\n :host([divider]) .item {\n display: block;\n height: 1px;\n min-height: 1px;\n padding: 0;\n margin: var(--wc-space-1) 0;\n overflow: hidden;\n background-color: var(--wc-color-border);\n cursor: default;\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { dropdownItemStyles } from './wc-dropdown-item.styles';\n\n/**\n * 下拉菜单项,必须作为 wc-dropdown 的子元素使用。\n * `divider` 属性渲染为分隔线(忽略内容与 danger/disabled)。\n *\n * @slot - 菜单项文本\n * @csspart base - 菜单项根元素\n */\nexport class wcDropdownItem extends LitElement {\n static styles = [dropdownItemStyles];\n\n /** 菜单项值(随 wc-select 事件的 detail.value 抛出) */\n @property({ reflect: true }) value = '';\n\n /** 禁用 */\n @property({ type: Boolean, reflect: true }) disabled = false;\n\n /** 危险操作(红色文字) */\n @property({ type: Boolean, reflect: true }) danger = false;\n\n /** 渲染为分隔线 */\n @property({ type: Boolean, reflect: true }) divider = false;\n\n /** 键盘导航高亮态(由 wc-dropdown 管理) */\n @property({ type: Boolean, reflect: true }) active = false;\n\n /** 菜单项文本 */\n get label(): string {\n return (this.textContent ?? '').trim();\n }\n\n render() {\n if (this.divider) {\n return html`<div class=\"item\" part=\"base\" role=\"separator\"></div>`;\n }\n return html`\n <div\n class=\"item\"\n part=\"base\"\n role=\"menuitem\"\n aria-disabled=${this.disabled}\n aria-label=${this.label}\n >\n <span class=\"text\"><slot></slot></span>\n </div>\n `;\n }\n}\n\nif (!customElements.get('wc-dropdown-item')) {\n customElements.define('wc-dropdown-item', wcDropdownItem);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-dropdown-item': wcDropdownItem;\n }\n}\n","import { css } from 'lit';\n\nexport const dropdownStyles = css`\n :host {\n display: inline-block;\n\n /* component 层令牌 */\n --wc-dropdown-min-width: 120px;\n --wc-dropdown-max-height: 280px;\n --wc-dropdown-radius: var(--wc-radius-medium);\n }\n\n .trigger {\n display: inline-flex;\n }\n\n .panel {\n position: fixed;\n z-index: var(--wc-z-index-dropdown);\n box-sizing: border-box;\n min-width: var(--wc-dropdown-min-width);\n max-height: var(--wc-dropdown-max-height);\n overflow-y: auto;\n padding: var(--wc-space-1) 0;\n font-size: var(--wc-font-size-medium);\n background-color: var(--wc-color-bg-container);\n border: 1px solid var(--wc-color-border);\n border-radius: var(--wc-dropdown-radius);\n box-shadow: var(--wc-shadow-2);\n opacity: 0;\n visibility: hidden;\n transform: scale(0.96);\n transform-origin: top;\n transition:\n opacity var(--wc-duration-fast) var(--wc-easing-standard),\n transform var(--wc-duration-fast) var(--wc-easing-standard),\n visibility var(--wc-duration-fast);\n }\n\n /* visibility:hidden 而非 display:none:面板需保持可测量供定位引擎使用 */\n .panel[data-open] {\n opacity: 1;\n visibility: visible;\n transform: none;\n }\n\n .empty {\n padding: var(--wc-space-4) var(--wc-space-3);\n color: var(--wc-color-text-placeholder);\n text-align: center;\n }\n\n @media (prefers-reduced-motion: reduce) {\n .panel {\n transition: none;\n }\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { computePosition, type WcPlacement } from '../../common/position';\nimport './wc-dropdown-item.js';\nimport { dropdownStyles } from './wc-dropdown.styles';\nimport type { wcDropdownItem } from './wc-dropdown-item.js';\n\nlet dropdownUid = 0;\n\n/**\n * 下拉菜单:点击触发元素弹出菜单面板(fixed 定位,空间不足自动翻转)。\n * 触发元素放 `slot=\"trigger\"`,菜单项用 `wc-dropdown-item` 作为默认子元素;\n * 支持键盘导航(↑↓ 移动高亮、Enter 选中、Esc 关闭)与点击外部关闭。\n *\n * @slot trigger - 触发元素\n * @slot - 菜单项(wc-dropdown-item)\n * @csspart trigger - 触发区\n * @csspart base - 菜单面板\n * @fires wc-open - 菜单展开\n * @fires wc-close - 菜单关闭,detail.reason: 'outside' | 'escape' | 'select' | 'toggle'\n * @fires wc-select - 选中菜单项,detail.value / detail.label(之后自动关闭)\n * @cssprop --wc-dropdown-min-width - 面板最小宽度(默认 120px)\n * @cssprop --wc-dropdown-max-height - 面板最大高度(默认 280px)\n */\nexport class wcDropdown extends LitElement {\n static styles = [baseStyles, dropdownStyles];\n\n /** 期望弹出方向(空间不足自动翻转) */\n @property() placement: WcPlacement = 'bottom-start';\n\n /** 当前是否打开 */\n @property({ type: Boolean, reflect: true }) open = false;\n\n /** 禁用(触发器不响应点击/键盘) */\n @property({ type: Boolean, reflect: true }) disabled = false;\n\n private panelId = `wc-dropdown-panel-${++dropdownUid}`;\n\n private itemUid = `wc-dropdown-item-${++dropdownUid}`;\n\n private activeIndex = -1;\n\n private assignedItems: wcDropdownItem[] = [];\n\n constructor() {\n super();\n this.addEventListener('keydown', this.handleKeydown);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.unbindSideEffects();\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n // 带 open 属性创建时 show() 不会执行,副作用需在此绑定\n if (this.open) this.bindSideEffects();\n }\n\n /** 面板中的可用菜单项列表 */\n private get enabledItems(): wcDropdownItem[] {\n return this.assignedItems.filter((o) => !o.disabled && !o.divider);\n }\n\n /* ---------- 开合 ---------- */\n\n /** 打开菜单 */\n show(): void {\n if (this.disabled || this.open) return;\n this.open = true;\n this.activeIndex = this.enabledItems.length ? 0 : -1;\n this.syncActive();\n this.bindSideEffects();\n this.dispatchEvent(new CustomEvent('wc-open', { bubbles: true, composed: true }));\n }\n\n /** 关闭菜单(不派发事件) */\n hide(): void {\n if (!this.open) return;\n this.open = false;\n this.activeIndex = -1;\n this.syncActive();\n this.unbindSideEffects();\n }\n\n /** 切换开合 */\n toggle(): void {\n if (this.open) {\n this.hide();\n this.emitClose('toggle');\n } else {\n this.show();\n }\n }\n\n private emitClose(reason: 'outside' | 'escape' | 'select' | 'toggle'): void {\n this.dispatchEvent(\n new CustomEvent('wc-close', { detail: { reason }, bubbles: true, composed: true }),\n );\n }\n\n private onDocumentClick = (e: Event): void => {\n if ((e.composedPath() as Array<EventTarget>).includes(this)) return;\n const wasOpen = this.open;\n this.hide();\n if (wasOpen) this.emitClose('outside');\n };\n\n private bindSideEffects(): void {\n document.addEventListener('click', this.onDocumentClick, true);\n this.updateComplete.then(() => this.position());\n }\n\n private unbindSideEffects(): void {\n document.removeEventListener('click', this.onDocumentClick, true);\n }\n\n protected override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (changed.has('open') && this.open) {\n this.position();\n }\n }\n\n /** 计算并应用 fixed 定位(同 Popconfirm,无箭头) */\n private position(): void {\n const panel = this.shadowRoot!.querySelector<HTMLElement>('.panel');\n if (!panel) return;\n const anchor = this.getBoundingClientRect();\n const panelRect = panel.getBoundingClientRect();\n const viewport = { x: 0, y: 0, width: window.innerWidth, height: window.innerHeight };\n const result = computePosition(anchor, panelRect, viewport, this.placement);\n panel.style.left = `${result.x}px`;\n panel.style.top = `${result.y}px`;\n }\n\n /* ---------- 菜单项 ---------- */\n\n private onSlotChange(e: Event): void {\n // flatten: 菜单项可能来自嵌套 slot 链(如 wc-split-button 的透传 slot)\n this.assignedItems = (e.target as HTMLSlotElement)\n .assignedElements({ flatten: true })\n .filter((el): el is wcDropdownItem => el.tagName === 'WC-DROPDOWN-ITEM');\n // 为键盘导航分配 id(aria-activedescendant 使用)\n this.assignedItems.forEach((o, i) => o.setAttribute('id', `${this.itemUid}-${i}`));\n this.syncActive();\n this.requestUpdate();\n }\n\n private syncActive(): void {\n for (const o of this.assignedItems) {\n o.active = false;\n }\n const active = this.enabledItems[this.activeIndex];\n if (active) active.active = true;\n if (active && typeof active.scrollIntoView === 'function') {\n // jsdom 未实现 scrollIntoView\n active.scrollIntoView({ block: 'nearest' });\n }\n }\n\n private onPanelClick(e: Event): void {\n const target = e.target as Element;\n const item = target.closest?.('wc-dropdown-item') as wcDropdownItem | null;\n if (item && !item.disabled && !item.divider) {\n this.selectItem(item);\n }\n }\n\n private selectItem(item: wcDropdownItem): void {\n this.hide();\n this.dispatchEvent(\n new CustomEvent('wc-select', {\n detail: { value: item.value, label: item.label },\n bubbles: true,\n composed: true,\n }),\n );\n this.emitClose('select');\n }\n\n private onTriggerClick(e: Event): void {\n // 防止触发元素的点击冒泡到 document 立即又关闭\n e.stopPropagation();\n if (this.disabled) return;\n this.toggle();\n }\n\n /* ---------- 键盘导航(模式同 wc-select) ---------- */\n\n private handleKeydown = (e: KeyboardEvent): void => {\n if (this.disabled) return;\n switch (e.key) {\n case 'Enter':\n case ' ':\n e.preventDefault();\n if (this.open && this.activeIndex >= 0) {\n const item = this.enabledItems[this.activeIndex];\n if (item) this.selectItem(item);\n } else {\n this.show();\n }\n break;\n case 'Escape':\n if (this.open) {\n e.preventDefault();\n this.hide();\n this.emitClose('escape');\n }\n break;\n case 'ArrowDown':\n e.preventDefault();\n if (!this.open) {\n this.show();\n } else if (this.enabledItems.length) {\n this.activeIndex = (this.activeIndex + 1) % this.enabledItems.length;\n this.syncActive();\n }\n break;\n case 'ArrowUp':\n e.preventDefault();\n if (!this.open) {\n this.show();\n } else if (this.enabledItems.length) {\n const n = this.enabledItems.length;\n this.activeIndex = (this.activeIndex - 1 + n) % n;\n this.syncActive();\n }\n break;\n case 'Home':\n if (this.open && this.enabledItems.length) {\n e.preventDefault();\n this.activeIndex = 0;\n this.syncActive();\n }\n break;\n case 'End':\n if (this.open && this.enabledItems.length) {\n e.preventDefault();\n this.activeIndex = this.enabledItems.length - 1;\n this.syncActive();\n }\n break;\n case 'Tab': {\n const wasOpen = this.open;\n this.hide();\n if (wasOpen) this.emitClose('escape');\n break;\n }\n }\n };\n\n render() {\n const activeItem = this.activeIndex >= 0 ? this.enabledItems[this.activeIndex] : undefined;\n const activeId = activeItem ? `${this.itemUid}-${this.assignedItems.indexOf(activeItem)}` : '';\n return html`\n <span\n class=\"trigger\"\n part=\"trigger\"\n tabindex=${this.disabled ? -1 : 0}\n role=\"button\"\n aria-haspopup=\"menu\"\n aria-expanded=${this.open}\n aria-disabled=${this.disabled}\n aria-controls=${this.open ? this.panelId : undefined}\n aria-activedescendant=${this.open && activeId ? activeId : undefined}\n @click=${this.onTriggerClick}\n >\n <slot name=\"trigger\"></slot>\n </span>\n <div\n class=\"panel\"\n part=\"base\"\n id=${this.panelId}\n role=\"menu\"\n ?data-open=${this.open}\n @click=${this.onPanelClick}\n >\n <slot @slotchange=${this.onSlotChange}></slot>\n ${this.assignedItems.length === 0 ? html`<div class=\"empty\">暂无数据</div>` : ''}\n </div>\n `;\n }\n}\n\nif (!customElements.get('wc-dropdown')) {\n customElements.define('wc-dropdown', wcDropdown);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-dropdown': wcDropdown;\n }\n}\n","import { css } from 'lit';\n\nexport const splitButtonStyles = css`\n :host {\n display: inline-block;\n\n /* component 层令牌:首尾圆角可覆写;聚焦环内嵌避免叠在相邻半边上 */\n --wc-split-button-radius: var(--wc-radius-medium);\n --wc-button-focus-ring-offset: -2px;\n }\n\n .group {\n display: inline-flex;\n vertical-align: middle;\n }\n\n /* 内部按钮去圆角、由两端各留单侧圆角(shadow 内部元素,普通选择器即可) */\n .main-btn {\n --wc-button-radius: var(--wc-split-button-radius) 0 0 var(--wc-split-button-radius);\n }\n\n .arrow-btn {\n --wc-button-radius: 0 var(--wc-split-button-radius) var(--wc-split-button-radius) 0;\n margin-left: -1px;\n }\n\n /* 悬停/聚焦的上层半边边框完整可见 */\n .main-btn:hover,\n .main-btn:focus-within {\n z-index: 1;\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { LocalizeController } from '../../i18n/localize-controller';\nimport type { WcPlacement } from '../../common/position';\nimport '../button/wc-button.js';\nimport '../dropdown/wc-dropdown.js';\nimport '../icon/wc-icon.js';\nimport { splitButtonStyles } from './wc-split-button.styles';\n\nexport type wcSplitButtonTheme = 'default' | 'primary' | 'success' | 'warning' | 'danger';\nexport type wcSplitButtonType = 'base' | 'outline' | 'dashed' | 'text' | 'link';\nexport type wcSplitButtonSize = 'small' | 'medium' | 'large';\n\n/**\n * 组合按钮:主操作按钮 + 下拉箭头(形态对齐 antd Dropdown.Button)。\n * 左侧主按钮派发 `wc-main-click`,右侧箭头派发 `wc-arrow-click` 并展开\n * 内置下拉菜单。菜单项用 `wc-dropdown-item` 作为默认子元素传入。\n *\n * @slot - 主按钮文案\n * @slot -(wc-dropdown-item 菜单项,自动进入下拉面板)\n * @csspart base - 组合容器\n * @cssprop --wc-split-button-radius - 两端保留的圆角\n * @fires wc-main-click - 点击主按钮\n * @fires wc-arrow-click - 点击下拉箭头(菜单随之开合)\n */\nexport class wcSplitButton extends LitElement {\n static styles = [baseStyles, splitButtonStyles];\n\n /** 按钮风格(透传两枚按钮) */\n @property({ reflect: true }) theme: wcSplitButtonTheme = 'default';\n\n /** 按钮类型(透传两枚按钮) */\n @property({ reflect: true }) type: wcSplitButtonType = 'base';\n\n /** 尺寸(透传两枚按钮) */\n @property({ reflect: true }) size: wcSplitButtonSize = 'medium';\n\n /** 下拉弹出方向 */\n @property({ reflect: true }) placement: WcPlacement = 'bottom-end';\n\n /** 禁用(透传两枚按钮与下拉) */\n @property({ type: Boolean, reflect: true }) disabled = false;\n\n /** 加载中(透传两枚按钮) */\n @property({ type: Boolean, reflect: true }) loading = false;\n\n /** 幽灵模式(透传两枚按钮) */\n @property({ type: Boolean, reflect: true }) ghost = false;\n\n /** 渐变底(透传两枚按钮) */\n @property({ type: Boolean, reflect: true }) gradient = false;\n\n /** 点击波纹(透传两枚按钮) */\n @property({ type: Boolean, reflect: true }) ripple = false;\n\n private localize = new LocalizeController(this);\n\n private observer: MutationObserver | null = null;\n\n private get dropdown(): import('../dropdown/wc-dropdown.js').wcDropdown | null {\n return this.shadowRoot!.querySelector('wc-dropdown');\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.syncItemSlots();\n // 后续动态增删菜单项时自动补 slot(子元素变更只发生在宿主上,无需 subtree)\n this.observer = new MutationObserver(() => this.syncItemSlots());\n this.observer.observe(this, { childList: true });\n }\n\n override disconnectedCallback(): void {\n this.observer?.disconnect();\n this.observer = null;\n super.disconnectedCallback();\n }\n\n /*\n * 菜单项走命名 slot=\"menu\",避免与主按钮的默认 slot 争抢内容——两个默认\n * slot 时全部默认内容都会落进树序第一个。其余默认内容(文案)留给主按钮。\n */\n private syncItemSlots(): void {\n for (const child of this.children) {\n if (child.tagName === 'WC-DROPDOWN-ITEM' && !child.slot) {\n child.slot = 'menu';\n }\n }\n }\n\n /** 主按钮点击:拦截原生冒泡,改派 wc-main-click */\n private onMainClick(e: Event): void {\n e.stopPropagation();\n this.dispatchEvent(new CustomEvent('wc-main-click', { bubbles: true, composed: true }));\n }\n\n /** 箭头点击:拦截原生冒泡(避免污染业务层),手动开合下拉并派发 wc-arrow-click */\n private onArrowClick(e: Event): void {\n e.stopPropagation();\n this.dropdown?.toggle();\n this.dispatchEvent(new CustomEvent('wc-arrow-click', { bubbles: true, composed: true }));\n }\n\n render() {\n return html`\n <span class=\"group\" part=\"base\">\n <wc-button\n class=\"main-btn\"\n theme=${this.theme}\n type=${this.type}\n size=${this.size}\n ?disabled=${this.disabled}\n ?loading=${this.loading}\n ?ghost=${this.ghost}\n ?gradient=${this.gradient}\n ?ripple=${this.ripple}\n @click=${this.onMainClick}\n ><slot></slot\n ></wc-button>\n <wc-dropdown .placement=${this.placement} ?disabled=${this.disabled}>\n <wc-button\n class=\"arrow-btn\"\n theme=${this.theme}\n type=${this.type}\n size=${this.size}\n ?disabled=${this.disabled}\n ?loading=${this.loading}\n ?ghost=${this.ghost}\n ?gradient=${this.gradient}\n ?ripple=${this.ripple}\n aria-label=${this.localize.term('dropdown.more')}\n @click=${this.onArrowClick}\n >\n <wc-icon slot=\"icon\" name=\"chevron-down\"></wc-icon>\n </wc-button>\n <slot name=\"menu\"></slot>\n </wc-dropdown>\n </span>\n `;\n }\n}\n\nif (!customElements.get('wc-split-button')) {\n customElements.define('wc-split-button', wcSplitButton);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-split-button': wcSplitButton;\n }\n}\n","import { css } from 'lit';\n\nexport const floatButtonStyles = css`\n :host {\n position: fixed;\n bottom: var(--wc-float-button-bottom, 24px);\n right: var(--wc-float-button-right, 24px);\n z-index: var(--wc-z-index-fab);\n display: inline-flex;\n\n /* component 层令牌 */\n --wc-float-button-size: 40px;\n }\n\n /* 回到顶部预设:未达滚动阈值时整体隐藏 */\n :host([backtop]:not([data-visible])) {\n display: none;\n }\n\n .fab {\n position: relative;\n box-sizing: border-box;\n display: inline-flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 2px;\n width: var(--wc-float-button-size);\n height: var(--wc-float-button-size);\n padding: 0;\n color: var(--wc-color-text);\n font-size: var(--wc-font-size-medium);\n text-decoration: none;\n background-color: var(--wc-color-bg-container);\n border: 1px solid var(--wc-color-border);\n border-radius: var(--wc-radius-round);\n box-shadow: var(--wc-shadow-2);\n cursor: pointer;\n transition:\n color var(--wc-duration-fast) var(--wc-easing-standard),\n border-color var(--wc-duration-fast) var(--wc-easing-standard),\n box-shadow var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .fab:hover {\n color: var(--wc-color-primary);\n border-color: var(--wc-color-primary);\n }\n\n .fab:focus-visible {\n outline: var(--wc-color-focus-ring) solid 2px;\n outline-offset: 2px;\n }\n\n .ico {\n /* flex 化:wc-icon 是 inline-flex 无文本基线(基线=底边),行内摆放会被\n 字体 descent 撑高行盒导致图标偏上(同 wc-button .icon 的教训) */\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: var(--wc-font-size-h3);\n line-height: 1;\n }\n\n .desc {\n max-width: calc(var(--wc-float-button-size) - 8px);\n overflow: hidden;\n font-size: var(--wc-font-size-xsmall);\n line-height: 1.2;\n text-align: center;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n :host([shape='square']) .fab {\n border-radius: var(--wc-radius-medium);\n }\n\n :host([type='primary']) .fab {\n color: var(--wc-color-text-anti);\n background-color: var(--wc-color-primary);\n border-color: var(--wc-color-primary);\n }\n\n :host([type='primary']) .fab:hover {\n background-color: var(--wc-color-primary-hover);\n border-color: var(--wc-color-primary-hover);\n }\n\n :host([disabled]) .fab {\n color: var(--wc-color-text-disabled);\n background-color: var(--wc-color-bg-disabled);\n border-color: var(--wc-color-border);\n box-shadow: none;\n cursor: not-allowed;\n pointer-events: none;\n }\n\n .badge {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 1;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 16px;\n height: 16px;\n padding: 0 4px;\n color: var(--wc-color-text-anti);\n font-size: var(--wc-font-size-xsmall);\n line-height: 1;\n white-space: nowrap;\n background-color: var(--wc-color-error);\n border-radius: var(--wc-radius-round);\n transform: translate(50%, -50%);\n }\n\n :host([dot]) .badge {\n min-width: 6px;\n width: 6px;\n height: 6px;\n padding: 0;\n }\n\n /* 内建 tooltip 气泡(轻量版:无箭头,fixed 定位于按钮左侧) */\n .tip {\n position: fixed;\n z-index: var(--wc-z-index-tooltip);\n max-width: 200px;\n padding: var(--wc-space-1) var(--wc-space-2);\n color: var(--wc-color-text-anti);\n font-size: var(--wc-font-size-xsmall);\n white-space: nowrap;\n background-color: var(--wc-color-gray-900);\n border-radius: var(--wc-radius-small);\n opacity: 0;\n visibility: hidden;\n transition:\n opacity var(--wc-duration-fast) var(--wc-easing-standard),\n visibility var(--wc-duration-fast);\n }\n\n .tip[data-open] {\n opacity: 1;\n visibility: visible;\n }\n\n @media (prefers-reduced-motion: reduce) {\n .fab,\n .tip {\n transition: none;\n }\n }\n`;\n","import { html, LitElement, nothing, type TemplateResult } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { LocalizeController } from '../../i18n/localize-controller';\nimport { POSITION_GAP } from '../../common/position';\nimport '../icon/wc-icon.js';\nimport { floatButtonStyles } from './wc-float-button.styles';\n\nexport type wcFloatButtonShape = 'circle' | 'square';\nexport type wcFloatButtonType = 'default' | 'primary';\n\nlet floatButtonUid = 0;\n\n/** tooltip 显示/隐藏防抖延迟(ms) */\nconst SHOW_DELAY = 100;\nconst HIDE_DELAY = 150;\n\n/**\n * 悬浮按钮:固定在视口角落的圆形/方形操作按钮(形态对齐 antd FloatButton)。\n * 有 href 渲染链接,dot/count 渲染右上角徽标,tooltip 悬浮显示气泡;\n * backtop 为「回到顶部」预设——滚动超过 visibility-height 才显示,点击滚回顶部。\n * 组合用法见 wc-float-button-group。\n *\n * @example\n * ```html\n * <wc-float-button icon=\"plus\" tooltip=\"新增\"></wc-float-button>\n * <wc-float-button backtop></wc-float-button>\n * ```\n *\n * @slot icon - 图标(覆盖 icon 属性)\n * @slot - 文字描述(覆盖 description 属性)\n * @csspart base - 按钮本体\n * @csspart badge - 徽标\n * @cssprop --wc-float-button-bottom - 距视口底部距离(默认 24px)\n * @cssprop --wc-float-button-right - 距视口右侧距离(默认 24px)\n * @cssprop --wc-float-button-size - 按钮尺寸(默认 40px)\n */\nexport class wcFloatButton extends LitElement {\n static styles = [baseStyles, floatButtonStyles];\n\n /** 形状 */\n @property({ reflect: true }) shape: wcFloatButtonShape = 'circle';\n\n /** 类型:default 白底 / primary 主题色底 */\n @property({ reflect: true }) type: wcFloatButtonType = 'default';\n\n /** 图标名称(内置图标库) */\n @property() icon = '';\n\n /** 文字描述(square 形状下显示在图标下方) */\n @property() description = '';\n\n /** 悬浮提示内容(backtop 时缺省为「回到顶部」) */\n @property() tooltip = '';\n\n /** 链接地址(有值渲染 <a>,否则渲染 <button>) */\n @property() href = '';\n\n /** 链接打开方式(仅 href 存在时生效) */\n @property() target = '';\n\n /** 禁用 */\n @property({ type: Boolean, reflect: true }) disabled = false;\n\n /** 右上角红点(忽略 count,恒显示) */\n @property({ type: Boolean, reflect: true }) dot = false;\n\n /** 右上角徽标数字(<= 0 隐藏) */\n @property({ type: Number }) count = 0;\n\n /** 徽标数字上限,超出显示「max+」 */\n @property({ type: Number }) max = 99;\n\n /** 回到顶部预设 */\n @property({ type: Boolean, reflect: true }) backtop = false;\n\n /** 回到顶部:滚动超过该距离(px)才显示 */\n @property({ type: Number, attribute: 'visibility-height' }) visibilityHeight = 400;\n\n private localize = new LocalizeController(this);\n\n private tipId = `wc-float-button-tip-${++floatButtonUid}`;\n\n /** icon/description 插槽是否有内容(空容器会撑出 flex gap 偏移,需隐藏) */\n @state() private _hasIcon = false;\n\n @state() private _hasText = false;\n\n private onIconSlotChange(e: Event): void {\n this._hasIcon = (e.target as HTMLSlotElement).assignedNodes({ flatten: true }).length > 0;\n }\n\n private onTextSlotChange(e: Event): void {\n // 过滤纯空白文本节点(嵌套写法/模板缩进会产生,会让空 desc 参与布局挤偏图标)\n const nodes = (e.target as HTMLSlotElement).assignedNodes({ flatten: true });\n this._hasText = nodes.some((n) => (n.textContent ?? '').trim() !== '');\n }\n\n private showTimer: ReturnType<typeof setTimeout> | null = null;\n private hideTimer: ReturnType<typeof setTimeout> | null = null;\n\n private onScroll = (): void => {\n this.toggleAttribute('data-visible', window.scrollY > this.visibilityHeight);\n };\n\n private onDocumentClick = (e: Event): void => {\n if (e.composedPath().includes(this)) return;\n this.hideTip();\n };\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (this.backtop) this.bindBacktop();\n }\n\n override disconnectedCallback(): void {\n this.unbindBacktop();\n this.unbindOutsideClose();\n this.clearTimers();\n super.disconnectedCallback();\n }\n\n protected override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (changed.has('backtop')) {\n if (this.backtop) this.bindBacktop();\n else {\n this.unbindBacktop();\n this.removeAttribute('data-visible');\n }\n }\n if (changed.has('tooltip') && this.tooltipIsOpen) {\n this.updateComplete.then(() => this.positionTip());\n }\n }\n\n private bindBacktop(): void {\n window.addEventListener('scroll', this.onScroll, { passive: true });\n this.onScroll();\n }\n\n private unbindBacktop(): void {\n window.removeEventListener('scroll', this.onScroll);\n }\n\n /* ---------- 内建 tooltip ---------- */\n\n private tooltipIsOpen = false;\n\n /** 实际展示的提示文本(backtop 缺省取 i18n 文案) */\n private get effectiveTooltip(): string {\n if (this.backtop && !this.tooltip) return this.localize.term('floatbutton.backtop');\n return this.tooltip;\n }\n\n private showTip(): void {\n if (!this.effectiveTooltip || this.disabled) return;\n this.clearTimers();\n this.showTimer = setTimeout(() => {\n if (this.tooltipIsOpen) return;\n this.tooltipIsOpen = true;\n this.bindOutsideClose();\n this.updateComplete.then(() => this.positionTip());\n this.requestUpdate();\n }, SHOW_DELAY);\n }\n\n private hideTip(): void {\n this.clearTimers();\n this.hideTimer = setTimeout(() => {\n if (!this.tooltipIsOpen) return;\n this.tooltipIsOpen = false;\n this.unbindOutsideClose();\n this.requestUpdate();\n }, HIDE_DELAY);\n }\n\n /** 气泡 fixed 定位于按钮左侧,垂直居中(空间不足贴边时夹近视口) */\n private positionTip(): void {\n const tip = this.shadowRoot!.querySelector<HTMLElement>('.tip');\n if (!tip) return;\n const rect = this.getBoundingClientRect();\n tip.style.visibility = 'hidden';\n tip.style.left = '0px';\n tip.style.top = '0px';\n const tipRect = tip.getBoundingClientRect();\n const x = rect.left - tipRect.width - POSITION_GAP;\n const y = rect.top + rect.height / 2 - tipRect.height / 2;\n tip.style.left = `${Math.max(POSITION_GAP, x)}px`;\n tip.style.top = `${Math.min(Math.max(POSITION_GAP, y), window.innerHeight - tipRect.height - POSITION_GAP)}px`;\n tip.style.visibility = '';\n }\n\n private bindOutsideClose(): void {\n document.addEventListener('click', this.onDocumentClick, true);\n }\n\n private unbindOutsideClose(): void {\n document.removeEventListener('click', this.onDocumentClick, true);\n }\n\n private clearTimers(): void {\n if (this.showTimer !== null) {\n clearTimeout(this.showTimer);\n this.showTimer = null;\n }\n if (this.hideTimer !== null) {\n clearTimeout(this.hideTimer);\n this.hideTimer = null;\n }\n }\n\n /* ---------- 点击 ---------- */\n\n private onClick(e: MouseEvent): void {\n if (this.disabled) return;\n if (this.backtop) {\n e.preventDefault();\n window.scrollTo({ top: 0, behavior: 'smooth' });\n }\n }\n\n /** 实际展示的徽标文本 */\n private get displayCount(): string {\n if (this.count > this.max) return `${this.max}+`;\n return String(Math.max(0, this.count));\n }\n\n render(): TemplateResult {\n const badgeVisible = this.dot || this.count > 0;\n const tip = this.effectiveTooltip;\n // backtop 缺省内建 arrow-up 图标(未被 icon 属性 / icon 插槽覆盖时)\n const effectiveIcon = this.icon || (this.backtop ? 'arrow-up' : '');\n const icon = html`\n <span class=\"ico\" part=\"icon\" ?hidden=${!effectiveIcon && !this._hasIcon}>\n ${\n effectiveIcon\n ? html`<wc-icon name=${effectiveIcon}></wc-icon>`\n : html`<slot name=\"icon\" @slotchange=${this.onIconSlotChange}></slot>`\n }\n </span>\n `;\n const inner = html`${icon}<span\n class=\"desc\"\n part=\"description\"\n ?hidden=${!this.description && !this._hasText}\n ><slot @slotchange=${this.onTextSlotChange}>${this.description}</slot></span\n >`;\n const fab =\n this.href && !this.disabled\n ? html`<a\n class=\"fab\"\n part=\"base\"\n href=${this.href}\n target=${this.target || nothing}\n rel=${this.target === '_blank' ? 'noopener noreferrer' : nothing}\n aria-describedby=${this.tooltipIsOpen ? this.tipId : nothing}\n @mouseenter=${this.showTip}\n @mouseleave=${this.hideTip}\n @focusin=${this.showTip}\n @focusout=${this.hideTip}\n @click=${this.onClick}\n >${inner}</a\n >`\n : html`<button\n class=\"fab\"\n part=\"base\"\n type=\"button\"\n ?disabled=${this.disabled}\n aria-describedby=${this.tooltipIsOpen ? this.tipId : nothing}\n @mouseenter=${this.showTip}\n @mouseleave=${this.hideTip}\n @focusin=${this.showTip}\n @focusout=${this.hideTip}\n @click=${this.onClick}\n >\n ${inner}\n </button>`;\n\n return html`${fab}\n ${\n badgeVisible\n ? html`<sup class=\"badge\" part=\"badge\">${this.dot ? nothing : this.displayCount}</sup>`\n : nothing\n }\n ${\n tip\n ? html`<div\n class=\"tip\"\n part=\"tooltip\"\n role=\"tooltip\"\n id=${this.tipId}\n ?data-open=${this.tooltipIsOpen}\n >\n ${tip}\n </div>`\n : nothing\n }`;\n }\n}\n\nif (!customElements.get('wc-float-button')) {\n customElements.define('wc-float-button', wcFloatButton);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-float-button': wcFloatButton;\n }\n}\n","import { css } from 'lit';\n\nexport const floatButtonGroupStyles = css`\n :host {\n position: fixed;\n bottom: var(--wc-float-button-bottom, 24px);\n right: var(--wc-float-button-right, 24px);\n z-index: var(--wc-z-index-fab);\n display: inline-flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wc-float-button-gap, 8px);\n\n /* component 层令牌 */\n --wc-float-button-gap: 8px;\n }\n\n /*\n * 子按钮自身 :host 是 fixed 定位(standalone 用),进组后必须改随布局——\n * 外层 shadow 树的声明优先于内层 :host,这里再加内联样式双保险(slotchange 同步)\n */\n .trigger-btn {\n position: static;\n z-index: auto;\n }\n\n ::slotted(wc-float-button) {\n position: static;\n z-index: auto;\n }\n\n .trigger-ico {\n transition: transform var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n /* 展开时 plus 旋转成 × */\n :host([open]) .trigger-ico {\n transform: rotate(45deg);\n }\n\n .items {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wc-float-button-gap, 8px);\n }\n\n /* trigger 模式:面板悬浮于触发按钮上方(absolute 脱离布局,收起不影响定位) */\n :host([trigger]) .items {\n position: absolute;\n right: 0;\n bottom: calc(100% + var(--wc-float-button-gap, 8px));\n opacity: 0;\n visibility: hidden;\n transform: translateY(6px) scale(0.9);\n transform-origin: bottom center;\n transition:\n opacity var(--wc-duration-fast) var(--wc-easing-standard),\n transform var(--wc-duration-fast) var(--wc-easing-standard),\n visibility var(--wc-duration-fast);\n }\n\n :host([trigger]) .items[data-open] {\n opacity: 1;\n visibility: visible;\n transform: none;\n }\n\n @media (prefers-reduced-motion: reduce) {\n .items,\n .trigger-ico {\n transition: none;\n }\n }\n`;\n","import { html, LitElement, nothing, type TemplateResult } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { LocalizeController } from '../../i18n/localize-controller';\nimport '../icon/wc-icon.js';\nimport './wc-float-button.js';\nimport { floatButtonGroupStyles } from './wc-float-button-group.styles';\nimport type { wcFloatButtonShape } from './wc-float-button.js';\n\nexport type wcFloatButtonGroupTrigger = '' | 'click' | 'hover';\n\n/**\n * 悬浮按钮组:子元素 `wc-float-button` 垂直堆叠于宿主上方(形态对齐\n * antd FloatButton.Group,但按钮间用间距分离)。trigger=\"click\"/\"hover\"\n * 时变为 speed-dial:收起只显示触发按钮(plus 展开时旋转成 ×),点击/悬浮展开。\n * group 的 shape 会同步给未显式设置 shape 的子按钮。\n *\n * @example\n * ```html\n * <wc-float-button-group trigger=\"click\">\n * <wc-float-button icon=\"plus\" tooltip=\"新增\"></wc-float-button>\n * <wc-float-button icon=\"search\" tooltip=\"搜索\"></wc-float-button>\n * </wc-float-button-group>\n * ```\n *\n * @slot - 子按钮(wc-float-button)\n * @csspart trigger - 触发按钮(仅 trigger 模式)\n * @csspart items - 子按钮容器\n * @cssprop --wc-float-button-bottom - 距视口底部距离(默认 24px)\n * @cssprop --wc-float-button-right - 距视口右侧距离(默认 24px)\n * @cssprop --wc-float-button-gap - 按钮间距(默认 8px)\n * @fires wc-open - 展开\n * @fires wc-close - 收起,detail.reason: 'outside' | 'escape' | 'toggle'\n */\nexport class wcFloatButtonGroup extends LitElement {\n static styles = [baseStyles, floatButtonGroupStyles];\n\n /** 形状(同步给未显式设置 shape 的子按钮与触发按钮) */\n @property({ reflect: true }) shape: wcFloatButtonShape = 'circle';\n\n /** 触发方式:空 = 子按钮常显堆叠 */\n @property({ reflect: true }) trigger: wcFloatButtonGroupTrigger = '';\n\n /** 当前是否展开(仅 trigger 模式生效) */\n @property({ type: Boolean, reflect: true }) open = false;\n\n /** 触发按钮图标(默认 plus) */\n @property() icon = '';\n\n private localize = new LocalizeController(this);\n\n constructor() {\n super();\n this.addEventListener('keydown', this.handleKeydown);\n // mouseenter/leave 不冒泡,直接挂宿主(speed-dial 悬浮开合)\n this.addEventListener('mouseenter', this.onHostMouseenter);\n this.addEventListener('mouseleave', this.onHostMouseleave);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.unbindOutsideClose();\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n // 带 open 属性创建时 show() 不会执行,副作用需在此绑定\n if (this.open && this.trigger === 'click') this.bindOutsideClose();\n }\n\n /* ---------- 开合 ---------- */\n\n /** 展开(仅 trigger 模式) */\n show(): void {\n if (!this.trigger || this.open) return;\n this.open = true;\n if (this.trigger === 'click') this.bindOutsideClose();\n this.dispatchEvent(new CustomEvent('wc-open', { bubbles: true, composed: true }));\n }\n\n /** 收起(不派发事件) */\n hide(): void {\n if (!this.open) return;\n this.open = false;\n this.unbindOutsideClose();\n }\n\n /** 切换开合 */\n toggle(): void {\n if (this.open) {\n this.hide();\n this.emitClose('toggle');\n } else {\n this.show();\n }\n }\n\n private emitClose(reason: 'outside' | 'escape' | 'toggle'): void {\n this.dispatchEvent(\n new CustomEvent('wc-close', { detail: { reason }, bubbles: true, composed: true }),\n );\n }\n\n private onDocumentClick = (e: Event): void => {\n if ((e.composedPath() as Array<EventTarget>).includes(this)) return;\n const wasOpen = this.open;\n this.hide();\n if (wasOpen) this.emitClose('outside');\n };\n\n private bindOutsideClose(): void {\n document.addEventListener('click', this.onDocumentClick, true);\n }\n\n private unbindOutsideClose(): void {\n document.removeEventListener('click', this.onDocumentClick, true);\n }\n\n private handleKeydown = (e: KeyboardEvent): void => {\n if (e.key === 'Escape' && this.open) {\n this.hide();\n this.emitClose('escape');\n }\n };\n\n private onTriggerClick(): void {\n if (this.trigger !== 'click') return;\n this.toggle();\n }\n\n private onHostMouseenter(): void {\n if (this.trigger === 'hover') this.show();\n }\n\n private onHostMouseleave(): void {\n if (this.trigger === 'hover') {\n const wasOpen = this.open;\n this.hide();\n if (wasOpen) this.emitClose('toggle');\n }\n }\n\n /* ---------- 子按钮 shape 同步 ---------- */\n\n private onSlotChange(e: Event): void {\n this.syncShapes((e.target as HTMLSlotElement).assignedElements());\n }\n\n private syncShapes(els: Element[]): void {\n for (const el of els) {\n if (el.tagName === 'WC-FLOAT-BUTTON' && !el.hasAttribute('shape')) {\n el.setAttribute('shape', this.shape);\n }\n }\n }\n\n protected override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (changed.has('shape')) {\n const slot = this.shadowRoot!.querySelector('slot');\n if (slot) this.syncShapes(slot.assignedElements());\n }\n }\n\n render(): TemplateResult {\n return html`\n ${\n this.trigger\n ? html`<wc-float-button\n class=\"trigger-btn\"\n part=\"trigger\"\n shape=${this.shape}\n aria-expanded=${this.open}\n aria-label=${this.localize.term('floatbutton.menu')}\n @click=${this.onTriggerClick}\n >\n <wc-icon slot=\"icon\" class=\"trigger-ico\" name=${this.icon || 'plus'}></wc-icon>\n </wc-float-button>`\n : nothing\n }\n <div class=\"items\" part=\"items\" ?data-open=${!this.trigger || this.open}>\n <slot @slotchange=${this.onSlotChange}></slot>\n </div>\n `;\n }\n}\n\nif (!customElements.get('wc-float-button-group')) {\n customElements.define('wc-float-button-group', wcFloatButtonGroup);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-float-button-group': wcFloatButtonGroup;\n }\n}\n","import { css } from 'lit';\n\nexport const tabsStyles = css`\n :host {\n display: block;\n }\n\n .bar {\n display: flex;\n gap: var(--wc-space-2);\n border-bottom: 1px solid var(--wc-color-border);\n }\n\n .tab {\n position: relative;\n padding: var(--wc-space-2) var(--wc-space-4);\n font-size: var(--wc-font-size-medium);\n line-height: var(--wc-font-line-height, 1.6);\n color: var(--wc-color-text);\n cursor: pointer;\n background: transparent;\n border: none;\n outline: none;\n transition:\n color var(--wc-duration-fast) var(--wc-easing-standard),\n background-color var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .tab::after {\n content: '';\n position: absolute;\n right: var(--wc-space-3);\n bottom: -1px;\n left: var(--wc-space-3);\n height: 2px;\n background-color: var(--wc-color-primary);\n border-radius: var(--wc-radius-small);\n opacity: 0;\n transform: scaleX(0.4);\n transition:\n opacity var(--wc-duration-fast) var(--wc-easing-standard),\n transform var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .tab:hover {\n color: var(--wc-color-primary);\n background-color: var(--wc-color-bg-hover);\n }\n\n .tab[aria-selected='true'] {\n color: var(--wc-color-primary);\n font-weight: var(--wc-font-weight-semibold);\n }\n\n .tab[aria-selected='true']::after {\n opacity: 1;\n transform: none;\n }\n\n .tab:focus-visible {\n box-shadow: 0 0 0 2px var(--wc-color-focus-ring);\n }\n\n .tab[data-disabled] {\n color: var(--wc-color-text-disabled);\n cursor: not-allowed;\n background-color: transparent;\n }\n`;\n","import { css } from 'lit';\n\nexport const tabStyles = css`\n :host {\n display: block;\n padding-top: var(--wc-space-3);\n font-size: var(--wc-font-size-medium);\n line-height: var(--wc-font-line-height, 1.6);\n color: var(--wc-color-text);\n }\n\n :host(:not([active])) {\n display: none;\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { tabStyles } from './wc-tab.styles';\n\n/**\n * 标签页面板:作为 <wc-tabs> 的子元素声明一个标签页。\n * label 显示在标签栏,value 用于匹配激活态(缺省按索引),\n * 内容仅在激活时显示。\n *\n * @slot - 面板内容\n * @csspart panel - 面板容器\n */\nexport class wcTab extends LitElement {\n static styles = [baseStyles, tabStyles];\n\n /** 匹配 wc-tabs.value 的唯一值(缺省按索引) */\n @property() value = '';\n\n /** 标签栏显示文本 */\n @property() label = '';\n\n /** 禁用(不可选中,键盘导航跳过) */\n @property({ type: Boolean, reflect: true }) disabled = false;\n\n /** 激活态,由 wc-tabs 同步(host 据此显隐) */\n @property({ type: Boolean, reflect: true }) active = false;\n\n render() {\n return html`<div class=\"panel\" part=\"panel\" role=\"tabpanel\" aria-label=${this.label}>\n <slot></slot>\n </div>`;\n }\n}\n\nif (!customElements.get('wc-tab')) {\n customElements.define('wc-tab', wcTab);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-tab': wcTab;\n }\n}\n","import { html, LitElement, nothing } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { tabsStyles } from './wc-tabs.styles';\nimport './wc-tab.js';\nimport type { wcTab } from './wc-tab.js';\n\nexport type wcTabsChangeDetail = { value: string };\n\n/** 标签栏单项元数据 */\ninterface TabMeta {\n value: string;\n label: string;\n disabled: boolean;\n element: wcTab;\n}\n\n/**\n * 标签页容器:子元素 <wc-tab>(label/value/disabled)声明标签页,\n * 点击或键盘(←/→/Home/End,自动激活)切换,派发 wc-change。\n *\n * @slot - <wc-tab> 子元素\n * @csspart bar - 标签栏\n * @csspart tab - 单个标签\n * @fires wc-change - 激活标签变化时触发,detail.value\n */\nexport class wcTabs extends LitElement {\n static styles = [baseStyles, tabsStyles];\n\n /** 激活标签的 value */\n @property({ reflect: true }) value = '';\n\n private tabs: TabMeta[] = [];\n\n private uid = `wc-tabs-${Math.random().toString(36).slice(2, 8)}`;\n\n /** 子元素 label/value/disabled 变化时刷新标签栏 */\n private mutationObserver = new MutationObserver(() => this.collectTabs());\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.mutationObserver.observe(this, {\n childList: true,\n // subtree: true 使 attributeFilter 也能监视子元素 label/value/disabled 变化\n subtree: true,\n attributes: true,\n attributeFilter: ['label', 'value', 'disabled'],\n });\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.mutationObserver.disconnect();\n }\n\n private collectTabs(): void {\n const children = Array.from(this.querySelectorAll<wcTab>('wc-tab'));\n this.tabs = children.map((element, index) => ({\n value: element.value || String(index),\n label: element.label || element.textContent?.trim() || String(index + 1),\n disabled: element.disabled,\n element,\n }));\n this.requestUpdate();\n this.syncActive();\n }\n\n /** 把 value 同步到子元素的 active 标志(驱动面板显隐) */\n private syncActive(): void {\n if (!this.value && this.tabs.length > 0 && !this.tabs.some((t) => t.value === this.value)) {\n this.value = this.tabs[0]!.value;\n }\n for (const tab of this.tabs) {\n tab.element.active = tab.value === this.value;\n }\n }\n\n protected override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (changed.has('value')) this.syncActive();\n }\n\n private select(value: string): void {\n if (value === this.value) return;\n const tab = this.tabs.find((t) => t.value === value);\n if (!tab || tab.disabled) return;\n this.value = value;\n this.dispatchEvent(\n new CustomEvent<wcTabsChangeDetail>('wc-change', {\n detail: { value },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private onTablistKeydown(e: KeyboardEvent): void {\n const selectable = this.tabs.filter((t) => !t.disabled);\n if (selectable.length === 0) return;\n const currentIndex = Math.max(\n 0,\n selectable.findIndex((t) => t.value === this.value),\n );\n let next: TabMeta | undefined;\n switch (e.key) {\n case 'ArrowRight':\n case 'ArrowDown':\n next = selectable[(currentIndex + 1) % selectable.length];\n break;\n case 'ArrowLeft':\n case 'ArrowUp':\n next = selectable[(currentIndex - 1 + selectable.length) % selectable.length];\n break;\n case 'Home':\n next = selectable[0];\n break;\n case 'End':\n next = selectable[selectable.length - 1];\n break;\n default:\n return;\n }\n e.preventDefault();\n if (next) {\n this.select(next.value);\n this.focusTab(next.value);\n }\n }\n\n /** 焦点移到指定标签按钮(roving tabindex 的焦点跟随) */\n private focusTab(value: string): void {\n // jsdom 未实现 CSS.escape,用本地转义(属性选择器只需处理引号和反斜杠)\n const escaped = value.replace(/[\"\\\\]/g, '\\\\$&');\n this.shadowRoot!.querySelector<HTMLButtonElement>(`[data-value=\"${escaped}\"]`)?.focus();\n }\n\n render() {\n return html`\n <div class=\"bar\" part=\"bar\" role=\"tablist\" @keydown=${this.onTablistKeydown}>\n ${this.tabs.map(\n (tab) => html`\n <button\n type=\"button\"\n class=\"tab\"\n part=\"tab\"\n role=\"tab\"\n data-value=${tab.value}\n id=${`${this.uid}-tab-${tab.value}`}\n aria-selected=${tab.value === this.value ? 'true' : 'false'}\n aria-disabled=${tab.disabled ? 'true' : 'false'}\n tabindex=${tab.value === this.value ? '0' : '-1'}\n ?data-disabled=${tab.disabled}\n @click=${() => this.select(tab.value)}\n >\n ${tab.label}\n </button>\n `,\n )}\n </div>\n ${this.tabs.length > 0 ? html`<slot @slotchange=${this.collectTabs}></slot>` : nothing}\n `;\n }\n}\n\nif (!customElements.get('wc-tabs')) {\n customElements.define('wc-tabs', wcTabs);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-tabs': wcTabs;\n }\n}\n","import { css } from 'lit';\n\nexport const breadcrumbStyles = css`\n :host {\n display: block;\n }\n\n /* 条目由 shadow 渲染,light-DOM 子元素仅用于收集元数据 */\n slot {\n display: none;\n }\n\n .list {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wc-space-1);\n margin: 0;\n padding: 0;\n list-style: none;\n font-size: var(--wc-font-size-medium);\n }\n\n .item {\n display: inline-flex;\n align-items: center;\n }\n\n .separator {\n display: inline-flex;\n align-items: center;\n color: var(--wc-color-text-placeholder);\n user-select: none;\n }\n\n .link {\n color: var(--wc-color-text-secondary);\n text-decoration: none;\n cursor: pointer;\n transition: color var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .link:hover {\n color: var(--wc-color-primary);\n }\n\n .link[data-disabled] {\n color: var(--wc-color-text-disabled);\n cursor: not-allowed;\n }\n\n .link[data-disabled]:hover {\n color: var(--wc-color-text-disabled);\n }\n\n .current {\n color: var(--wc-color-text);\n font-weight: var(--wc-font-weight-medium);\n }\n`;\n","import { html, LitElement, nothing, type TemplateResult } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { LocalizeController } from '../../i18n/localize-controller';\nimport { breadcrumbStyles } from './wc-breadcrumb.styles';\n\ninterface ItemMeta {\n label: string;\n href: string;\n disabled: boolean;\n index: number;\n}\n\n/**\n * 面包屑。子条目用 light-DOM 的 <wc-breadcrumb-item> 声明,由容器收集后在\n * shadow 中统一渲染:最后一项为当前页(aria-current=\"page\"),中间项可点击\n * 并派发 wc-select,带 href 的条目渲染为原生 <a>(点击后正常跳转)。\n *\n * @example\n * ```html\n * <wc-breadcrumb separator=\"/\">\n * <wc-breadcrumb-item href=\"/\">首页</wc-breadcrumb-item>\n * <wc-breadcrumb-item href=\"/list\" disabled>列表</wc-breadcrumb-item>\n * <wc-breadcrumb-item>详情</wc-breadcrumb-item>\n * </wc-breadcrumb>\n * ```\n *\n * @csspart nav - 导航容器\n * @csspart list - ol 列表\n * @csspart item - 条目\n * @csspart separator - 分隔符\n * @csspart link - 可点击条目\n * @csspart current - 当前页条目\n * @fires wc-select - 点击中间项时派发(detail: { index, label, href })\n */\nexport class wcBreadcrumb extends LitElement {\n static styles = [baseStyles, breadcrumbStyles];\n\n /** 分隔符文本 */\n @property() separator = '/';\n\n private items: ItemMeta[] = [];\n\n private localize = new LocalizeController(this);\n\n /** 子条目 href/disabled 变化时刷新渲染 */\n private mutationObserver = new MutationObserver(() => this.collectItems());\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.mutationObserver.observe(this, {\n childList: true,\n // subtree: true 使 attributeFilter 也能监视子元素 href/disabled 变化\n subtree: true,\n attributes: true,\n attributeFilter: ['href', 'disabled'],\n });\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.mutationObserver.disconnect();\n }\n\n private collectItems(): void {\n const children = Array.from(this.querySelectorAll<HTMLElement>('wc-breadcrumb-item'));\n this.items = children.map((element, index) => ({\n label: element.textContent?.trim() || String(index + 1),\n href: element.getAttribute('href') || '',\n disabled: element.hasAttribute('disabled'),\n index,\n }));\n this.requestUpdate();\n }\n\n private onSelect(item: ItemMeta): void {\n this.dispatchEvent(\n new CustomEvent('wc-select', {\n detail: { index: item.index, label: item.label, href: item.href },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private renderItem(item: ItemMeta, isLast: boolean): TemplateResult {\n if (isLast) {\n return html`<span class=\"current\" part=\"current\" aria-current=\"page\">${item.label}</span>`;\n }\n if (item.disabled) {\n return html`<span class=\"link\" data-disabled aria-disabled=\"true\">${item.label}</span>`;\n }\n if (item.href) {\n return html`<a class=\"link\" part=\"link\" href=${item.href} @click=${() => this.onSelect(item)}\n >${item.label}</a\n >`;\n }\n return html`<span class=\"link\" part=\"link\" @click=${() => this.onSelect(item)}\n >${item.label}</span\n >`;\n }\n\n protected override render(): TemplateResult {\n const last = this.items.length - 1;\n return html`\n <nav class=\"nav\" part=\"nav\" aria-label=${this.localize.term('breadcrumb.label')}>\n <ol class=\"list\" part=\"list\">\n ${this.items.map((item, index) => {\n return html`\n <li class=\"item\" part=\"item\">${this.renderItem(item, index === last)}</li>\n ${\n index < last\n ? html`<li class=\"separator\" part=\"separator\" aria-hidden=\"true\">\n ${this.separator}\n </li>`\n : nothing\n }\n `;\n })}\n </ol>\n <slot @slotchange=${this.collectItems}></slot>\n </nav>\n `;\n }\n}\n\nif (!customElements.get('wc-breadcrumb')) {\n customElements.define('wc-breadcrumb', wcBreadcrumb);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-breadcrumb': wcBreadcrumb;\n }\n}\n","import { html, LitElement, type TemplateResult } from 'lit';\nimport { property } from 'lit/decorators.js';\n\n/**\n * 面包屑条目(light-DOM 子元素)。内容由 wc-breadcrumb 在其 shadow 中统一渲染,\n * 条目自身不产出可见内容。label 取元素的文本内容。\n */\nexport class wcBreadcrumbItem extends LitElement {\n /** 目标链接(有值渲染为 <a>,否则为可点击文本) */\n @property() href = '';\n\n /** 禁用(仅中间项有意义,最后一项始终渲染为当前页文本) */\n @property({ type: Boolean, reflect: true }) disabled = false;\n\n protected override render(): TemplateResult {\n // 条目由 wc-breadcrumb 收集渲染,自身不产出内容\n return html``;\n }\n}\n\nif (!customElements.get('wc-breadcrumb-item')) {\n customElements.define('wc-breadcrumb-item', wcBreadcrumbItem);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-breadcrumb-item': wcBreadcrumbItem;\n }\n}\n","import { css } from 'lit';\n\nexport const paginationStyles = css`\n :host {\n display: block;\n }\n\n .pagination {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wc-space-1);\n font-size: var(--wc-font-size-medium);\n }\n\n .total {\n margin-right: var(--wc-space-2);\n color: var(--wc-color-text-secondary);\n }\n\n .page-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 32px;\n height: 32px;\n padding: 0 var(--wc-space-2);\n color: var(--wc-color-text);\n font: inherit;\n background: transparent;\n border: none;\n border-radius: var(--wc-radius-small);\n cursor: pointer;\n transition:\n color var(--wc-duration-fast) var(--wc-easing-standard),\n background-color var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .page-button:hover:not(:disabled) {\n color: var(--wc-color-primary);\n background-color: var(--wc-color-bg-hover);\n }\n\n .page-button:disabled {\n color: var(--wc-color-text-disabled);\n cursor: not-allowed;\n background: transparent;\n }\n\n .page-button[aria-current='page'] {\n color: var(--wc-color-primary);\n font-weight: var(--wc-font-weight-medium);\n background-color: var(--wc-color-primary-light);\n }\n\n .ellipsis {\n min-width: 32px;\n color: var(--wc-color-text-placeholder);\n letter-spacing: 1px;\n text-align: center;\n user-select: none;\n }\n\n .jumper {\n display: inline-flex;\n align-items: center;\n gap: var(--wc-space-2);\n margin-left: var(--wc-space-2);\n color: var(--wc-color-text-secondary);\n }\n\n .jumper-input {\n width: 56px;\n height: 32px;\n padding: 0 var(--wc-space-2);\n font: inherit;\n color: var(--wc-color-text);\n text-align: center;\n background: transparent;\n border: 1px solid var(--wc-color-border);\n border-radius: var(--wc-radius-small);\n }\n\n .jumper-input:focus {\n outline: none;\n border-color: var(--wc-color-primary);\n }\n\n .jumper-input:disabled {\n color: var(--wc-color-text-disabled);\n background-color: var(--wc-color-bg-disabled, var(--wc-color-bg-hover));\n cursor: not-allowed;\n }\n`;\n","import { html, LitElement, nothing, type TemplateResult } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { LocalizeController } from '../../i18n/localize-controller';\nimport '../icon/wc-icon.js';\nimport { paginationStyles } from './wc-pagination.styles';\n\ntype PageItem = number | 'ellipsis-prev' | 'ellipsis-next';\n\n/**\n * 分页。由 total / page-size 推导总页数,页码过多时按 folded-page-count 折叠\n * 为「1 … 中间窗 … 末页」。页码切换派发 wc-change(detail: { current, previous }),\n * total/page-size 变化导致越界时静默夹紧 current(不派发事件)。\n *\n * @example\n * ```html\n * <wc-pagination total=\"200\" current=\"1\" show-total show-jumper></wc-pagination>\n * ```\n *\n * @csspart nav - 导航容器\n * @csspart total - 总条数\n * @csspart prev / next - 前后翻页按钮\n * @csspart page - 页码按钮\n * @csspart ellipsis - 省略号\n * @csspart jumper - 跳页区\n * @csspart jumper-input - 跳页输入框\n * @fires wc-change - 页码变化后触发(含用户点击与跳页输入)\n */\nexport class wcPagination extends LitElement {\n static styles = [baseStyles, paginationStyles];\n\n /** 数据总条数 */\n @property({ type: Number }) total = 0;\n\n /** 每页条数 */\n @property({ type: Number, attribute: 'page-size' }) pageSize = 10;\n\n /** 当前页(1 开始) */\n @property({ type: Number, reflect: true }) current = 1;\n\n /** 折叠时中间窗口显示的页码数量 */\n @property({ type: Number, attribute: 'folded-page-count' }) foldedPageCount = 5;\n\n /** 显示总条数 */\n @property({ type: Boolean, attribute: 'show-total' }) showTotal = false;\n\n /** 显示跳页输入框(Enter 跳转,自动夹紧到有效范围) */\n @property({ type: Boolean, attribute: 'show-jumper' }) showJumper = false;\n\n /** 整体禁用 */\n @property({ type: Boolean, reflect: true }) disabled = false;\n\n private localize = new LocalizeController(this);\n\n /** 总页数 */\n get pageCount(): number {\n return Math.max(1, Math.ceil(this.total / Math.max(1, this.pageSize)));\n }\n\n private select(page: number): void {\n const clamped = Math.min(this.pageCount, Math.max(1, Math.floor(page)));\n if (this.disabled || clamped === this.current) return;\n const previous = this.current;\n this.current = clamped;\n this.dispatchEvent(\n new CustomEvent('wc-change', {\n detail: { current: clamped, previous },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n protected override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n // total/page-size 变化后当前页可能越界,静默夹紧(不派发事件)\n if ((changed.has('total') || changed.has('pageSize')) && this.current > this.pageCount) {\n this.current = this.pageCount;\n }\n }\n\n /** 页码序列:1 … 中间窗口 … 末页,空间充足时全部展开 */\n private getPageItems(): PageItem[] {\n const pageCount = this.pageCount;\n const folded = Math.max(1, this.foldedPageCount);\n if (pageCount <= folded + 2) {\n return Array.from({ length: pageCount }, (_, i) => i + 1);\n }\n let start = Math.max(2, this.current - Math.floor(folded / 2));\n const end = Math.min(pageCount - 1, start + folded - 1);\n start = Math.max(2, end - folded + 1);\n const items: PageItem[] = [1];\n if (start > 2) items.push('ellipsis-prev');\n for (let i = start; i <= end; i++) items.push(i);\n if (end < pageCount - 1) items.push('ellipsis-next');\n items.push(pageCount);\n return items;\n }\n\n private onJumperKeydown(e: KeyboardEvent): void {\n if (e.key !== 'Enter') return;\n const input = e.target as HTMLInputElement;\n const page = Number.parseInt(input.value, 10);\n if (Number.isNaN(page)) return;\n this.select(page);\n input.value = String(this.current);\n }\n\n protected override render(): TemplateResult {\n const prevDisabled = this.disabled || this.current <= 1;\n const nextDisabled = this.disabled || this.current >= this.pageCount;\n return html`\n <nav class=\"pagination\" part=\"nav\" aria-label=${this.localize.term('pagination.label')}>\n ${\n this.showTotal\n ? html`<span class=\"total\" part=\"total\">\n ${this.localize.term('pagination.total', { total: this.total })}\n </span>`\n : nothing\n }\n <button\n type=\"button\"\n class=\"page-button\"\n part=\"prev\"\n ?disabled=${prevDisabled}\n aria-label=${this.localize.term('pagination.prev')}\n @click=${() => this.select(this.current - 1)}\n >\n <wc-icon name=\"chevron-left\"></wc-icon>\n </button>\n ${this.getPageItems().map((item) =>\n typeof item !== 'number'\n ? html`<span class=\"ellipsis\" part=\"ellipsis\" aria-hidden=\"true\">•••</span>`\n : html`<button\n type=\"button\"\n class=\"page-button\"\n part=\"page\"\n ?disabled=${this.disabled}\n aria-label=${this.localize.term('pagination.page', { page: item })}\n aria-current=${item === this.current ? 'page' : nothing}\n @click=${() => this.select(item)}\n >\n ${item}\n </button>`,\n )}\n <button\n type=\"button\"\n class=\"page-button\"\n part=\"next\"\n ?disabled=${nextDisabled}\n aria-label=${this.localize.term('pagination.next')}\n @click=${() => this.select(this.current + 1)}\n >\n <wc-icon name=\"chevron-right\"></wc-icon>\n </button>\n ${\n this.showJumper\n ? html`<span class=\"jumper\" part=\"jumper\">\n ${this.localize.term('pagination.jumpTo')}\n <input\n type=\"text\"\n class=\"jumper-input\"\n part=\"jumper-input\"\n ?disabled=${this.disabled}\n aria-label=${this.localize.term('pagination.jumpTo')}\n @keydown=${this.onJumperKeydown}\n />\n ${this.localize.term('pagination.pageUnit')}\n </span>`\n : nothing\n }\n </nav>\n `;\n }\n}\n\nif (!customElements.get('wc-pagination')) {\n customElements.define('wc-pagination', wcPagination);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-pagination': wcPagination;\n }\n}\n","import { css } from 'lit';\n\nexport const badgeStyles = css`\n :host {\n position: relative;\n display: inline-flex;\n }\n\n .badge {\n position: absolute;\n top: 0;\n right: 0;\n z-index: var(--wc-z-index-popover, 1);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 16px;\n height: 16px;\n padding: 0 4px;\n color: var(--wc-color-text-anti);\n font-size: var(--wc-font-size-xsmall);\n line-height: 1;\n white-space: nowrap;\n background-color: var(--wc-color-error);\n border-radius: var(--wc-radius-round);\n transform: translate(50%, -50%);\n }\n\n :host([dot]) .badge {\n min-width: 6px;\n width: 6px;\n height: 6px;\n padding: 0;\n }\n\n :host([theme='primary']) .badge {\n background-color: var(--wc-color-primary);\n }\n\n :host([theme='success']) .badge {\n background-color: var(--wc-color-success);\n }\n\n :host([theme='warning']) .badge {\n background-color: var(--wc-color-warning);\n }\n\n :host([theme='danger']) .badge {\n background-color: var(--wc-color-error);\n }\n`;\n","import { html, LitElement, nothing, type TemplateResult } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { badgeStyles } from './wc-badge.styles';\n\nexport type wcBadgeTheme = 'primary' | 'success' | 'warning' | 'danger';\n\n/**\n * 徽标。出现在右上角的数字或圆点标记:包裹内容时悬浮于其右上角,\n * 无内容时独立展示。count 超过 max 显示「max+」,count 为 0 时隐藏\n * (dot 模式恒显示)。\n *\n * @example\n * ```html\n * <wc-badge count=\"5\"><wc-icon name=\"search\"></wc-icon></wc-badge>\n * <wc-badge dot></wc-badge>\n * ```\n *\n * @slot - 被标记的内容(可空,空时独立展示)\n * @csspart badge - 徽标本体\n */\nexport class wcBadge extends LitElement {\n static styles = [baseStyles, badgeStyles];\n\n /** 徽标数字(<= 0 隐藏) */\n @property({ type: Number }) count = 0;\n\n /** 数字上限,超出显示「max+」 */\n @property({ type: Number }) max = 99;\n\n /** 圆点模式(忽略 count,恒显示) */\n @property({ type: Boolean, reflect: true }) dot = false;\n\n /** 语义色 */\n @property({ reflect: true }) theme: wcBadgeTheme = 'danger';\n\n /** 实际展示的数字文本 */\n private get displayCount(): string {\n if (this.count > this.max) return `${this.max}+`;\n return String(Math.max(0, this.count));\n }\n\n protected override render(): TemplateResult {\n const visible = this.dot || this.count > 0;\n return html`\n <slot></slot>\n ${\n visible\n ? html`<sup class=\"badge\" part=\"badge\">${this.dot ? nothing : this.displayCount}</sup>`\n : nothing\n }\n `;\n }\n}\n\nif (!customElements.get('wc-badge')) {\n customElements.define('wc-badge', wcBadge);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-badge': wcBadge;\n }\n}\n","import { css } from 'lit';\n\nexport const emptyStyles = css`\n :host {\n display: block;\n }\n\n .empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: var(--wc-space-8) var(--wc-space-4);\n text-align: center;\n }\n\n .icon {\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--wc-color-text-placeholder);\n }\n\n /* 默认占位图形:圆角方块 + 内嵌虚线圆,柔和示意「空」 */\n .placeholder {\n position: relative;\n display: block;\n width: 56px;\n height: 56px;\n background-color: var(--wc-color-bg-hover);\n border-radius: var(--wc-radius-xlarge);\n }\n\n .placeholder::after {\n content: '';\n position: absolute;\n top: 50%;\n left: 50%;\n width: 24px;\n height: 24px;\n border: 2px dashed var(--wc-color-text-placeholder);\n border-radius: var(--wc-radius-circle);\n transform: translate(-50%, -50%);\n }\n\n .description {\n margin-top: var(--wc-space-3);\n color: var(--wc-color-text-secondary);\n font-size: var(--wc-font-size-medium);\n }\n\n .action {\n margin-top: var(--wc-space-4);\n }\n\n .action:empty {\n display: none;\n }\n`;\n","import { html, LitElement, type TemplateResult } from 'lit';\nimport { baseStyles } from '../../styles/base.css';\nimport { LocalizeController } from '../../i18n/localize-controller';\nimport { emptyStyles } from './wc-empty.styles';\n\n/**\n * 空状态。默认展示占位图形 + 「暂无数据」文案,均可用插槽自定义,\n * 另有 action 插槽放置操作按钮(如重试)。\n *\n * @example\n * ```html\n * <wc-empty>\n * <wc-button slot=\"action\" theme=\"primary\">重新加载</wc-button>\n * </wc-empty>\n * ```\n *\n * @slot - 描述文案(默认 i18n「暂无数据」)\n * @slot icon - 自定义占位图形\n * @slot action - 操作区\n * @csspart base - 容器\n * @csspart icon - 占位图形区\n * @csspart description - 描述文案区\n * @csspart action - 操作区\n */\nexport class wcEmpty extends LitElement {\n static styles = [baseStyles, emptyStyles];\n\n private localize = new LocalizeController(this);\n\n protected override render(): TemplateResult {\n return html`\n <div class=\"empty\" part=\"base\">\n <div class=\"icon\" part=\"icon\">\n <slot name=\"icon\"><span class=\"placeholder\"></span></slot>\n </div>\n <div class=\"description\" part=\"description\">\n <slot>${this.localize.term('empty.noData')}</slot>\n </div>\n <div class=\"action\" part=\"action\">\n <slot name=\"action\"></slot>\n </div>\n </div>\n `;\n }\n}\n\nif (!customElements.get('wc-empty')) {\n customElements.define('wc-empty', wcEmpty);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-empty': wcEmpty;\n }\n}\n","import { css } from 'lit';\n\nexport const progressStyles = css`\n :host {\n display: block;\n }\n\n /* ---- line ---- */\n .line {\n display: flex;\n align-items: center;\n gap: var(--wc-space-2);\n }\n\n .track {\n position: relative;\n flex: 1;\n overflow: hidden;\n background-color: var(--wc-color-bg-hover);\n border-radius: var(--wc-radius-round);\n }\n\n .indicator {\n height: 100%;\n background-color: var(--wc-color-primary);\n border-radius: var(--wc-radius-round);\n transition: width var(--wc-duration-slow, 300ms) var(--wc-easing-standard);\n }\n\n :host([status='success']) .indicator {\n background-color: var(--wc-color-success);\n }\n\n :host([status='warning']) .indicator {\n background-color: var(--wc-color-warning);\n }\n\n :host([status='error']) .indicator {\n background-color: var(--wc-color-error);\n }\n\n .label {\n display: inline-flex;\n align-items: center;\n gap: 2px;\n color: var(--wc-color-text-secondary);\n font-size: var(--wc-font-size-small);\n line-height: 1;\n white-space: nowrap;\n }\n\n :host([status='success']) .label {\n color: var(--wc-color-success);\n }\n\n :host([status='error']) .label {\n color: var(--wc-color-error);\n }\n\n .label wc-icon {\n --icon-size: 1em;\n }\n\n /* ---- circle ---- */\n .circle-wrap {\n position: relative;\n display: inline-block;\n width: 72px;\n height: 72px;\n }\n\n .circle {\n display: block;\n width: 100%;\n height: 100%;\n }\n\n .circle .track {\n fill: none;\n stroke: var(--wc-color-bg-hover);\n stroke-width: 6;\n }\n\n .circle .indicator {\n fill: none;\n stroke: var(--wc-color-primary);\n stroke-width: 6;\n stroke-linecap: round;\n transition: stroke-dashoffset var(--wc-duration-slow, 300ms) var(--wc-easing-standard);\n }\n\n :host([status='success']) .circle .indicator {\n stroke: var(--wc-color-success);\n }\n\n :host([status='warning']) .circle .indicator {\n stroke: var(--wc-color-warning);\n }\n\n :host([status='error']) .circle .indicator {\n stroke: var(--wc-color-error);\n }\n\n .circle-label {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--wc-color-text);\n font-size: var(--wc-font-size-small);\n }\n\n .circle-label .label {\n color: inherit;\n }\n`;\n","import { html, LitElement, nothing, type TemplateResult } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport '../icon/wc-icon.js';\nimport { progressStyles } from './wc-progress.styles';\n\nexport type wcProgressTheme = 'line' | 'circle';\nexport type wcProgressStatus = 'normal' | 'success' | 'warning' | 'error';\n\nconst CIRCLE_RADIUS = 32;\nconst CIRCLE_CIRCUMFERENCE = 2 * Math.PI * CIRCLE_RADIUS;\n\n/**\n * 进度条。line 线形 / circle 环形两种主题,value 取 0-100 自动夹紧;\n * status 语义色会同步指示条与标签(success/error 附带状态图标)。\n *\n * @example\n * ```html\n * <wc-progress value=\"60\"></wc-progress>\n * <wc-progress theme=\"circle\" value=\"80\" status=\"success\"></wc-progress>\n * ```\n *\n * @csspart base - 容器\n * @csspart track - 轨道\n * @csspart indicator - 指示条\n * @csspart label - 标签\n */\nexport class wcProgress extends LitElement {\n static styles = [baseStyles, progressStyles];\n\n /** 进度值 0-100(自动夹紧) */\n @property({ type: Number }) value = 0;\n\n /** 主题:line 线形 / circle 环形 */\n @property({ reflect: true }) theme: wcProgressTheme = 'line';\n\n /** 状态色(normal/success/warning/error,附带状态图标) */\n @property({ reflect: true }) status: wcProgressStatus = 'normal';\n\n /** 是否显示标签文本 */\n @property({ type: Boolean, attribute: 'show-label' }) showLabel = true;\n\n /** 线形轨道粗细(px) */\n @property({ type: Number, attribute: 'stroke-width' }) strokeWidth = 6;\n\n /** 自定义标签文本(默认显示百分比) */\n @property() label = '';\n\n /** 夹紧后的百分比 */\n private get percent(): number {\n return Math.min(100, Math.max(0, this.value));\n }\n\n /** 标签文本:label 属性优先,否则百分比 */\n private get labelText(): string {\n return this.label || `${Math.round(this.percent)}%`;\n }\n\n private renderStatusLabel(): TemplateResult | typeof nothing {\n if (!this.showLabel) return nothing;\n // 注意 nothing 是 truthy 符号,必须先算出图标名再判空串\n const iconName = this.status === 'success' ? 'check' : this.status === 'error' ? 'close' : '';\n return html`<span class=\"label\" part=\"label\">\n ${iconName ? html`<wc-icon name=${iconName}></wc-icon>` : nothing}${this.labelText}\n </span>`;\n }\n\n private renderLine(): TemplateResult {\n return html`<div class=\"line\" part=\"base\">\n <div\n class=\"track\"\n part=\"track\"\n role=\"progressbar\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n aria-valuenow=${Math.round(this.percent)}\n aria-label=${this.labelText}\n style=\"height: ${this.strokeWidth}px\"\n >\n <div class=\"indicator\" part=\"indicator\" style=\"width: ${this.percent}%\"></div>\n </div>\n ${this.renderStatusLabel()}\n </div>`;\n }\n\n private renderCircle(): TemplateResult {\n return html`<div class=\"circle-wrap\" part=\"base\">\n <svg\n class=\"circle\"\n viewBox=\"0 0 72 72\"\n role=\"progressbar\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n aria-valuenow=${Math.round(this.percent)}\n aria-label=${this.labelText}\n >\n <circle class=\"track\" part=\"track\" cx=\"36\" cy=\"36\" r=\"${CIRCLE_RADIUS}\"></circle>\n <circle\n class=\"indicator\"\n part=\"indicator\"\n cx=\"36\"\n cy=\"36\"\n r=\"${CIRCLE_RADIUS}\"\n stroke-dasharray=\"${CIRCLE_CIRCUMFERENCE}\"\n stroke-dashoffset=${CIRCLE_CIRCUMFERENCE * (1 - this.percent / 100)}\n transform=\"rotate(-90 36 36)\"\n ></circle>\n </svg>\n <div class=\"circle-label\">${this.renderStatusLabel()}</div>\n </div>`;\n }\n\n protected override render(): TemplateResult {\n return this.theme === 'circle' ? this.renderCircle() : this.renderLine();\n }\n}\n\nif (!customElements.get('wc-progress')) {\n customElements.define('wc-progress', wcProgress);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-progress': wcProgress;\n }\n}\n","import { css } from 'lit';\n\nexport const cardStyles = css`\n :host {\n display: block;\n --wc-card-radius: var(--wc-radius-medium);\n }\n\n /* display:flex 类会覆盖 [hidden] 的 UA 样式,显式关闭 */\n [hidden] {\n display: none !important;\n }\n\n .card {\n background-color: var(--wc-color-bg-container);\n border-radius: var(--wc-card-radius);\n transition: box-shadow var(--wc-duration-base, 200ms) var(--wc-easing-standard);\n }\n\n :host([bordered]) .card {\n border: 1px solid var(--wc-color-border);\n }\n\n :host([hoverable]) .card:hover {\n box-shadow: var(--wc-shadow-2);\n }\n\n .header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--wc-space-2);\n padding: var(--wc-space-4) var(--wc-space-4) 0;\n }\n\n .titles {\n min-width: 0;\n }\n\n .title {\n color: var(--wc-color-text);\n font-size: var(--wc-font-size-large);\n font-weight: var(--wc-font-weight-medium);\n line-height: 1.5;\n }\n\n .subtitle {\n margin-top: 2px;\n color: var(--wc-color-text-secondary);\n font-size: var(--wc-font-size-small);\n }\n\n .actions {\n flex-shrink: 0;\n }\n\n .body {\n padding: var(--wc-space-4);\n color: var(--wc-color-text);\n font-size: var(--wc-font-size-medium);\n }\n\n .footer {\n padding: var(--wc-space-3) var(--wc-space-4);\n border-top: 1px solid var(--wc-color-border);\n }\n`;\n","import { html, LitElement, nothing, type TemplateResult } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { cardStyles } from './wc-card.styles';\n\n/**\n * 卡片。header 区由 title / subtitle 属性或 header 插槽组成,actions 插槽\n * 放标题右侧操作区,footer 插槽放底部操作区(有内容才渲染对应区域)。\n *\n * @example\n * ```html\n * <wc-card title=\"卡片标题\" subtitle=\"副标题\" hoverable>\n * <p>卡片内容</p>\n * <wc-button slot=\"footer\" theme=\"primary\">操作</wc-button>\n * </wc-card>\n * ```\n *\n * @slot - 卡片内容\n * @slot header - 自定义整个头部(覆盖 title/subtitle)\n * @slot actions - 头部右侧操作区\n * @slot footer - 底部操作区\n * @csspart base - 卡片容器\n * @csspart header - 头部\n * @csspart title - 标题\n * @csspart subtitle - 副标题\n * @csspart actions - 头部操作区\n * @csspart body - 内容区\n * @csspart footer - 底部\n * @cssprop --wc-card-radius - 卡片圆角(默认 --wc-radius-medium)\n */\nexport class wcCard extends LitElement {\n static styles = [baseStyles, cardStyles];\n\n /** 卡片标题 */\n @property() title = '';\n\n /** 副标题(title 右侧小字) */\n @property() subtitle = '';\n\n /** 显示边框 */\n @property({ type: Boolean, reflect: true }) bordered = true;\n\n /** 悬浮时展示阴影 */\n @property({ type: Boolean, reflect: true }) hoverable = false;\n\n @state() private hasHeaderSlot = false;\n\n @state() private hasActions = false;\n\n @state() private hasFooter = false;\n\n private onSlotChange(e: Event): void {\n const slot = e.target as HTMLSlotElement;\n const has = slot.assignedElements().length > 0;\n if (slot.name === 'header') this.hasHeaderSlot = has;\n else if (slot.name === 'actions') this.hasActions = has;\n else if (slot.name === 'footer') this.hasFooter = has;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n // 首渲染前的种子状态(slotchange 只在已渲染的 slot 上触发)\n this.hasHeaderSlot = this.querySelector('[slot=\"header\"]') !== null;\n this.hasActions = this.querySelector('[slot=\"actions\"]') !== null;\n this.hasFooter = this.querySelector('[slot=\"footer\"]') !== null;\n }\n\n private renderHeader(): TemplateResult {\n const showHeader = Boolean(\n this.title || this.subtitle || this.hasHeaderSlot || this.hasActions,\n );\n return html`<div class=\"header\" part=\"header\" ?hidden=${!showHeader}>\n <div class=\"titles\" ?hidden=${this.hasHeaderSlot}>\n ${this.title ? html`<div class=\"title\" part=\"title\">${this.title}</div>` : nothing}\n ${\n this.subtitle\n ? html`<div class=\"subtitle\" part=\"subtitle\">${this.subtitle}</div>`\n : nothing\n }\n </div>\n <slot name=\"header\" @slotchange=${this.onSlotChange} ?hidden=${!this.hasHeaderSlot}></slot>\n <div class=\"actions\" part=\"actions\" ?hidden=${!this.hasActions}>\n <slot name=\"actions\" @slotchange=${this.onSlotChange}></slot>\n </div>\n </div>`;\n }\n\n protected override render(): TemplateResult {\n return html`<div class=\"card\" part=\"base\">\n ${this.renderHeader()}\n <div class=\"body\" part=\"body\"><slot></slot></div>\n <div class=\"footer\" part=\"footer\" ?hidden=${!this.hasFooter}>\n <slot name=\"footer\" @slotchange=${this.onSlotChange}></slot>\n </div>\n </div>`;\n }\n}\n\nif (!customElements.get('wc-card')) {\n customElements.define('wc-card', wcCard);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-card': wcCard;\n }\n}\n","import { css } from 'lit';\n\nexport const listStyles = css`\n :host {\n display: block;\n --wc-list-radius: var(--wc-radius-medium);\n }\n\n /* display:flex 类会覆盖 [hidden] 的 UA 样式,显式关闭 */\n [hidden] {\n display: none !important;\n }\n\n .list {\n margin: 0;\n padding: 0;\n list-style: none;\n color: var(--wc-color-text);\n font-size: var(--wc-font-size-medium);\n border-radius: var(--wc-list-radius);\n /* 裁剪条目背景(striped/hover)避免溢出圆角 */\n overflow: hidden;\n }\n\n /* 通过 ::slotted 为 light-DOM 条目提供统一样式 */\n ::slotted(wc-list-item) {\n display: block;\n padding: var(--wc-space-3) var(--wc-space-4);\n }\n\n ::slotted(wc-list-item:not(:last-child)) {\n border-bottom: 1px solid var(--wc-color-border);\n }\n\n :host([striped]) ::slotted(wc-list-item:nth-child(even)) {\n background-color: var(--wc-color-bg-container-secondary);\n }\n\n :host([hoverable]) ::slotted(wc-list-item:hover) {\n background-color: var(--wc-color-bg-hover);\n }\n\n :host([size='small']) ::slotted(wc-list-item) {\n padding: var(--wc-space-2) var(--wc-space-4);\n }\n\n :host([size='large']) ::slotted(wc-list-item) {\n padding: var(--wc-space-4) var(--wc-space-4);\n }\n\n .empty {\n padding: var(--wc-space-2) 0;\n }\n`;\n","import { html, LitElement, type TemplateResult } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport '../empty/wc-empty.js';\nimport { listStyles } from './wc-list.styles';\n\nexport type wcListSize = 'small' | 'medium' | 'large';\n\n/**\n * 列表。子条目用 light-DOM 的 <wc-list-item> 声明,容器通过 ::slotted\n * 提供分隔线 / 斑马纹 / 悬浮反馈;无条目时回退渲染 empty 插槽(默认\n * <wc-empty>)。\n *\n * @example\n * ```html\n * <wc-list striped hoverable>\n * <wc-list-item>条目一</wc-list-item>\n * <wc-list-item>条目二</wc-list-item>\n * </wc-list>\n * ```\n *\n * @slot - 列表条目(wc-list-item)\n * @slot empty - 空状态(默认渲染 wc-empty)\n * @csspart base - 列表容器\n * @csspart empty - 空状态区\n * @cssprop --wc-list-radius - 列表圆角(默认 --wc-radius-medium)\n */\nexport class wcList extends LitElement {\n static styles = [baseStyles, listStyles];\n\n /** 条目密度 */\n @property({ reflect: true }) size: wcListSize = 'medium';\n\n /** 斑马纹 */\n @property({ type: Boolean, reflect: true }) striped = false;\n\n /** 条目悬浮高亮 */\n @property({ type: Boolean, reflect: true }) hoverable = false;\n\n @state() private itemCount = 0;\n\n private onSlotChange(e: Event): void {\n const slot = e.target as HTMLSlotElement;\n // 只统计默认插槽;empty 具名插槽的变化不影响条目计数\n if (slot.name !== '') return;\n this.itemCount = slot.assignedElements().length;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n // 首渲染前的种子状态(slotchange 只在已渲染的 slot 上触发)\n this.itemCount = this.querySelectorAll('wc-list-item').length;\n }\n\n protected override render(): TemplateResult {\n // 两个分支恒渲染(hidden 切换),保证 slot 元素始终存在、slotchange 可触发\n return html`\n <ul class=\"list\" part=\"base\" role=\"list\" ?hidden=${this.itemCount === 0}>\n <slot @slotchange=${this.onSlotChange}></slot>\n </ul>\n <div class=\"empty\" part=\"empty\" ?hidden=${this.itemCount > 0}>\n <slot name=\"empty\" @slotchange=${this.onSlotChange}><wc-empty></wc-empty></slot>\n </div>\n `;\n }\n}\n\nif (!customElements.get('wc-list')) {\n customElements.define('wc-list', wcList);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-list': wcList;\n }\n}\n","import { html, LitElement, type TemplateResult } from 'lit';\nimport { baseStyles } from '../../styles/base.css';\n\n/**\n * 列表条目。内容直接放在 light-DOM 中,样式(内边距 / 分隔线 / 斑马纹 /\n * 悬浮反馈)由父级 wc-list 通过 ::slotted 统一提供,条目自身仅负责分发内容。\n *\n * @slot - 条目内容(任意元素)\n */\nexport class wcListItem extends LitElement {\n static styles = [baseStyles];\n\n protected override render(): TemplateResult {\n return html`<slot></slot>`;\n }\n}\n\nif (!customElements.get('wc-list-item')) {\n customElements.define('wc-list-item', wcListItem);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-list-item': wcListItem;\n }\n}\n","import { css } from 'lit';\n\nexport const tableStyles = css`\n :host {\n display: block;\n }\n\n [hidden] {\n display: none !important;\n }\n\n .wrapper {\n position: relative;\n color: var(--wc-color-text);\n font-size: var(--wc-font-size-medium);\n }\n\n table {\n width: 100%;\n border-collapse: collapse;\n text-align: left;\n }\n\n th,\n td {\n padding: var(--wc-space-3) var(--wc-space-3);\n border-bottom: 1px solid var(--wc-color-border);\n font-weight: normal;\n }\n\n th {\n color: var(--wc-color-text-secondary);\n font-weight: var(--wc-font-weight-medium);\n background-color: var(--wc-color-bg-container-secondary);\n white-space: nowrap;\n user-select: none;\n }\n\n :host([bordered]) th,\n :host([bordered]) td {\n border: 1px solid var(--wc-color-border);\n }\n\n :host([size='small']) th,\n :host([size='small']) td {\n padding: var(--wc-space-2) var(--wc-space-2);\n }\n\n :host([size='large']) th,\n :host([size='large']) td {\n padding: var(--wc-space-4) var(--wc-space-3);\n }\n\n :host([striped]) tbody tr:nth-child(even) td {\n background-color: var(--wc-color-bg-container-secondary);\n }\n\n tbody tr {\n transition: background-color var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n tbody tr:hover td {\n background-color: var(--wc-color-bg-hover);\n }\n\n :host([striped]) tbody tr:nth-child(even):hover td {\n background-color: var(--wc-color-bg-hover);\n }\n\n th.sortable {\n cursor: pointer;\n }\n\n th.sortable:hover {\n color: var(--wc-color-primary);\n }\n\n th.sorted {\n color: var(--wc-color-primary);\n }\n\n .th-inner {\n display: inline-flex;\n align-items: center;\n gap: var(--wc-space-1);\n }\n\n .sort {\n display: inline-flex;\n flex-direction: column;\n gap: 0;\n color: var(--wc-color-text-placeholder);\n }\n\n .sort wc-icon {\n display: block;\n height: 0.5em;\n pointer-events: none;\n }\n\n .sort wc-icon.active {\n color: var(--wc-color-primary);\n }\n\n td[ellipsis] {\n max-width: 0;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n .align-left {\n text-align: left;\n }\n\n .align-right {\n text-align: right;\n }\n\n .align-center {\n text-align: center;\n }\n\n .empty {\n padding: var(--wc-space-4) 0;\n }\n\n .loading {\n position: absolute;\n inset: 0;\n z-index: var(--wc-z-index-popover, 1);\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--wc-color-primary);\n /* 随容器底色自适应明暗主题 */\n background-color: color-mix(in srgb, var(--wc-color-bg-container) 70%, transparent);\n }\n`;\n","import { html, LitElement, nothing, type TemplateResult } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport '../empty/wc-empty.js';\nimport '../icon/wc-icon.js';\nimport { tableStyles } from './wc-table.styles';\n\nexport type wcTableAlign = 'left' | 'right' | 'center';\nexport type wcTableSize = 'small' | 'medium' | 'large';\nexport type wcSortOrder = 'asc' | 'desc' | null;\n\nexport interface wcTableColumn {\n /** 对应 data 行的字段名 */\n key: string;\n /** 表头标题 */\n title: string;\n /** 列宽(px 数值或任意 CSS 宽度) */\n width?: number | string;\n /** 单元格对齐(默认左对齐) */\n align?: wcTableAlign;\n /** 是否可点击排序(升 → 降 → 取消循环) */\n sortable?: boolean;\n /** 超宽省略(title 提示完整内容) */\n ellipsis?: boolean;\n /** 自定义单元格渲染(返回模板或文本) */\n render?: (row: wcTableRow, index: number) => TemplateResult | string | number;\n}\n\nexport type wcTableRow = Record<string, unknown>;\n\n/**\n * 表格。columns + data 驱动的纯展示表格:可排序列点击循环升/降/取消\n * (派发 wc-sort),行点击派发 wc-row-click;空数据回退 wc-empty\n * (empty 插槽可覆盖),loading 属性叠加加载遮罩。\n *\n * @example\n * ```html\n * <wc-table id=\"demo\"></wc-table>\n * <script>\n * demo.columns = [\n * { key: 'name', title: '姓名', sortable: true },\n * { key: 'age', title: '年龄', align: 'right', width: 100 },\n * ];\n * demo.data = [{ name: '张三', age: 18 }];\n * </script>\n * ```\n *\n * @slot empty - 空状态(默认渲染 wc-empty)\n * @csspart wrapper - 外层容器(loading 遮罩的定位父级)\n * @csspart table - table 元素\n * @csspart head - thead\n * @csspart body - tbody\n * @csspart sort - 排序图标区\n * @csspart empty - 空状态区\n * @csspart loading - 加载遮罩\n * @fires wc-sort - 点击可排序列头后派发(detail: { key, order })\n * @fires wc-row-click - 点击数据行后派发(detail: { row, index })\n */\nexport class wcTable extends LitElement {\n static styles = [baseStyles, tableStyles];\n\n /** 列配置 */\n @property({ type: Array }) columns: wcTableColumn[] = [];\n\n /** 行数据 */\n @property({ type: Array }) data: wcTableRow[] = [];\n\n /** 斑马纹 */\n @property({ type: Boolean, reflect: true }) striped = false;\n\n /** 全边框 */\n @property({ type: Boolean, reflect: true }) bordered = false;\n\n /** 密度 */\n @property({ reflect: true }) size: wcTableSize = 'medium';\n\n /** 加载中(叠加遮罩) */\n @property({ type: Boolean, reflect: true }) loading = false;\n\n @state() private sortKey = '';\n\n @state() private sortOrder: wcSortOrder = null;\n\n private onSlotChange = (): void => this.requestUpdate();\n\n /** 排序后的展示数据 */\n private get displayData(): wcTableRow[] {\n if (!this.sortKey || !this.sortOrder) return this.data;\n const dir = this.sortOrder === 'asc' ? 1 : -1;\n return [...this.data].sort((a, b) => {\n const va = a[this.sortKey];\n const vb = b[this.sortKey];\n // 空值恒排末尾\n if (va == null) return 1;\n if (vb == null) return -1;\n if (typeof va === 'number' && typeof vb === 'number') return (va - vb) * dir;\n return String(va).localeCompare(String(vb), 'zh-CN') * dir;\n });\n }\n\n private onHeaderClick(col: wcTableColumn): void {\n if (!col.sortable) return;\n const cycle: Record<string, wcSortOrder> = { '': 'asc', asc: 'desc', desc: null };\n this.sortOrder = this.sortKey === col.key ? (cycle[this.sortOrder ?? ''] ?? null) : 'asc';\n this.sortKey = this.sortOrder === null ? '' : col.key;\n this.dispatchEvent(\n new CustomEvent('wc-sort', {\n detail: { key: this.sortKey, order: this.sortOrder },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private cellContent(col: wcTableColumn, row: wcTableRow, index: number): TemplateResult | string {\n const rendered = col.render?.(row, index);\n if (rendered != null && rendered !== '') {\n return typeof rendered === 'object' ? rendered : String(rendered);\n }\n const value = row[col.key];\n return value == null ? '' : String(value);\n }\n\n private renderHead(): TemplateResult {\n return html`<thead part=\"head\">\n <tr>\n ${this.columns.map((col) => {\n const isSorted = this.sortKey === col.key && this.sortOrder !== null;\n return html`<th\n part=\"th\"\n scope=\"col\"\n style=${\n col.width != null\n ? `width: ${typeof col.width === 'number' ? `${col.width}px` : col.width}`\n : nothing\n }\n class=${\n [\n col.align ? `align-${col.align}` : '',\n col.sortable ? 'sortable' : '',\n isSorted ? 'sorted' : '',\n ].join(' ') || nothing\n }\n aria-sort=${\n isSorted ? (this.sortOrder === 'asc' ? 'ascending' : 'descending') : nothing\n }\n @click=${() => this.onHeaderClick(col)}\n >\n <div class=\"th-inner\">\n ${col.title}\n ${\n col.sortable\n ? html`<span class=\"sort\" part=\"sort\">\n <wc-icon\n class=${this.sortKey === col.key && this.sortOrder === 'asc' ? 'active' : ''}\n name=\"chevron-up\"\n ></wc-icon>\n <wc-icon\n class=${this.sortKey === col.key && this.sortOrder === 'desc' ? 'active' : ''}\n name=\"chevron-down\"\n ></wc-icon>\n </span>`\n : nothing\n }\n </div>\n </th>`;\n })}\n </tr>\n </thead>`;\n }\n\n protected override render(): TemplateResult {\n const hasData = this.data.length > 0;\n return html`<div class=\"wrapper\" part=\"wrapper\">\n <table part=\"table\">\n ${this.renderHead()}\n <tbody part=\"body\" ?hidden=${!hasData}>\n ${this.displayData.map(\n (row, index) => html`<tr\n part=\"row\"\n @click=${() =>\n this.dispatchEvent(\n new CustomEvent('wc-row-click', {\n detail: { row, index },\n bubbles: true,\n composed: true,\n }),\n )}\n >\n ${this.columns.map(\n (col) => html`<td\n part=\"td\"\n class=${col.align ? `align-${col.align}` : nothing}\n ?ellipsis=${col.ellipsis === true}\n title=${col.ellipsis ? String(row[col.key] ?? '') : nothing}\n >\n ${this.cellContent(col, row, index)}\n </td>`,\n )}\n </tr>`,\n )}\n </tbody>\n </table>\n <div class=\"empty\" part=\"empty\" ?hidden=${hasData}>\n <slot name=\"empty\" @slotchange=${this.onSlotChange}><wc-empty></wc-empty></slot>\n </div>\n ${\n this.loading\n ? html`<div class=\"loading\" part=\"loading\">\n <wc-icon name=\"loader\" spin label=\"加载中\"></wc-icon>\n </div>`\n : nothing\n }\n </div>`;\n }\n}\n\nif (!customElements.get('wc-table')) {\n customElements.define('wc-table', wcTable);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-table': wcTable;\n }\n}\n","import { css } from 'lit';\n\nexport const imageStyles = css`\n :host {\n --wc-image-bg: var(--wc-color-bg-container-secondary);\n --wc-image-radius: var(--wc-radius-medium);\n --wc-image-mask-bg: rgb(0 0 0 / 75%);\n --wc-image-tool-bg: rgb(255 255 255 / 16%);\n --wc-image-tool-bg-hover: rgb(255 255 255 / 28%);\n --wc-image-tool-color: #fff;\n display: inline-block;\n vertical-align: middle;\n }\n\n .frame {\n position: relative;\n width: var(--wc-image-width, 240px);\n height: var(--wc-image-height, 160px);\n overflow: hidden;\n background: var(--wc-image-bg);\n }\n\n :host([shape='rounded']) .frame {\n border-radius: var(--wc-image-radius);\n }\n\n :host([shape='circle']) .frame {\n border-radius: 50%;\n }\n\n .frame img {\n display: block;\n width: 100%;\n height: 100%;\n }\n\n /* 点击触发层:仅在开启预览且加载成功时出现 */\n .trigger {\n position: absolute;\n inset: 0;\n z-index: 1;\n cursor: zoom-in;\n }\n\n .trigger:focus-visible {\n outline: 2px solid var(--wc-color-primary);\n outline-offset: -2px;\n }\n\n /* 加载中 / 失败占位层 */\n .layer {\n position: absolute;\n inset: 0;\n z-index: 0;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--wc-space-2);\n color: var(--wc-color-text-placeholder);\n font-size: var(--wc-font-size-small);\n }\n\n /* 大图预览浮层 */\n .overlay {\n position: fixed;\n inset: 0;\n z-index: var(--wc-z-index-modal);\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--wc-image-mask-bg);\n animation: wc-image-fade var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .stage {\n display: flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n cursor: grab;\n }\n\n .stage.dragging {\n cursor: grabbing;\n }\n\n .stage img {\n max-width: 90vw;\n max-height: 90vh;\n user-select: none;\n transition: transform var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .stage.dragging img {\n transition: none;\n }\n\n .toolbar {\n position: absolute;\n left: 50%;\n bottom: var(--wc-space-6);\n transform: translateX(-50%);\n display: flex;\n align-items: center;\n gap: var(--wc-space-1);\n padding: var(--wc-space-2) var(--wc-space-3);\n background: var(--wc-image-tool-bg);\n border-radius: var(--wc-radius-circle);\n backdrop-filter: blur(4px);\n }\n\n .toolbar button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n border: none;\n border-radius: 50%;\n background: transparent;\n color: var(--wc-image-tool-color);\n font-size: var(--wc-font-size-small);\n cursor: pointer;\n transition: background var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .toolbar button:hover {\n background: var(--wc-image-tool-bg-hover);\n }\n\n @keyframes wc-image-fade {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { OverlaySideEffects } from '../../common/overlay-side-effects';\nimport { LocalizeController } from '../../i18n/localize-controller';\nimport '../icon/wc-icon.js';\nimport { imageStyles } from './wc-image.styles';\n\nexport type wcImageStatus = 'loading' | 'loaded' | 'error';\nexport type wcImageFit = 'contain' | 'cover' | 'fill' | 'none' | 'scale-down';\nexport type wcImageShape = 'square' | 'rounded' | 'circle';\n\n/** 缩放范围与步长 */\nconst SCALE_MIN = 0.25;\nconst SCALE_MAX = 5;\nconst SCALE_STEP = 0.25;\n\n/**\n * 图片。支持加载/失败占位、fallback 替代图、懒加载与全屏大图预览(缩放/旋转/拖拽平移)。\n * 组件默认尺寸 240x160,可通过 CSS 设置宿主尺寸或覆写 --wc-image-width/height。\n *\n * @slot - 无(预留)\n * @csspart base - 图片容器\n * @csspart image - 实际图片\n * @csspart overlay - 预览遮罩层\n * @csspart preview-image - 预览大图\n * @csspart toolbar - 预览工具栏\n * @cssprop --wc-image-width - 图片宽度(默认 240px)\n * @cssprop --wc-image-height - 图片高度(默认 160px)\n * @cssprop --wc-image-bg - 加载中/失败占位背景\n * @cssprop --wc-image-mask-bg - 预览遮罩背景色\n * @fires wc-load - 图片加载成功时触发\n * @fires wc-error - 图片加载失败时触发\n * @fires wc-preview-open - 打开预览后触发\n * @fires wc-preview-close - 请求关闭预览时触发(可取消,detail.reason 标识来源)\n */\nexport class wcImage extends LitElement {\n static styles = [baseStyles, imageStyles];\n\n /** 图片地址 */\n @property() src = '';\n\n /** 原生 alt 描述 */\n @property() alt = '';\n\n /** 填充模式(同 object-fit) */\n @property() fit: wcImageFit = 'fill';\n\n /** 图片位置(同 object-position) */\n @property() position = 'center';\n\n /** 圆角形状 */\n @property({ reflect: true }) shape: wcImageShape = 'square';\n\n /** 懒加载:滚动进入视口后再发起请求 */\n @property({ type: Boolean }) lazy = false;\n\n /** 点击图片打开全屏预览 */\n @property({ type: Boolean, reflect: true }) preview = false;\n\n /** 预览大图地址(默认取 src) */\n @property({ attribute: 'preview-src' }) previewSrc = '';\n\n /** 加载失败时的替代图片地址 */\n @property() fallback = '';\n\n @state() private status: wcImageStatus = 'loading';\n\n /** 懒加载是否已触发(触发后才真正渲染 img) */\n @state() private shouldLoad = false;\n\n @state() private fallbackFailed = false;\n\n @state() private previewOpen = false;\n\n @state() private scale = 1;\n\n @state() private rotate = 0;\n\n @state() private x = 0;\n\n @state() private y = 0;\n\n @state() private dragging = false;\n\n private localize = new LocalizeController(this);\n\n /** 预览副作用:Escape 关闭 / 焦点陷阱 / 滚动锁(与 Dialog 共用) */\n private overlay = new OverlaySideEffects(this, {\n requestClose: () => this.requestClosePreview('escape'),\n });\n\n private io: IntersectionObserver | null = null;\n\n private dragStartX = 0;\n\n private dragStartY = 0;\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (this.lazy && typeof IntersectionObserver !== 'undefined') {\n this.io = new IntersectionObserver((entries) => {\n if (entries.some((e) => e.isIntersecting)) {\n this.startLoad();\n this.io?.disconnect();\n }\n });\n this.io.observe(this);\n } else {\n this.startLoad();\n }\n if (this.previewOpen) this.overlay.bind();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.io?.disconnect();\n this.overlay.unbind();\n }\n\n protected override willUpdate(changed: Map<string, unknown>): void {\n super.willUpdate(changed);\n // src 变更后重新走加载流程(须在 render 前重置状态)\n if (changed.has('src')) {\n this.status = 'loading';\n this.fallbackFailed = false;\n }\n }\n\n protected override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (changed.has('previewOpen')) {\n if (this.previewOpen) {\n this.dispatchEvent(new CustomEvent('wc-preview-open', { bubbles: true, composed: true }));\n this.overlay.bind();\n } else {\n this.overlay.unbind();\n }\n }\n }\n\n private startLoad(): void {\n if (this.shouldLoad) return;\n this.shouldLoad = true;\n }\n\n private onImgLoad(): void {\n this.status = 'loaded';\n this.dispatchEvent(\n new CustomEvent('wc-load', { detail: { src: this.src }, bubbles: true, composed: true }),\n );\n }\n\n private onImgError(): void {\n this.status = 'error';\n this.dispatchEvent(\n new CustomEvent('wc-error', { detail: { src: this.src }, bubbles: true, composed: true }),\n );\n }\n\n /** 打开全屏预览(需开启 preview 且加载成功) */\n openPreview(): void {\n if (!this.preview || this.status !== 'loaded') return;\n this.resetTransform();\n this.previewOpen = true;\n }\n\n /** 请求关闭预览(发出可取消的 wc-preview-close) */\n requestClosePreview(reason: 'overlay' | 'escape' | 'close-btn' | 'api' = 'api'): void {\n if (!this.previewOpen) return;\n const accepted = this.dispatchEvent(\n new CustomEvent('wc-preview-close', {\n detail: { reason },\n bubbles: true,\n composed: true,\n cancelable: true,\n }),\n );\n if (accepted) this.previewOpen = false;\n }\n\n private zoomBy(delta: number): void {\n const next = Math.round((this.scale + delta) * 100) / 100;\n this.scale = Math.min(SCALE_MAX, Math.max(SCALE_MIN, next));\n }\n\n private rotateBy(): void {\n this.rotate = (this.rotate + 90) % 360;\n }\n\n private resetTransform(): void {\n this.scale = 1;\n this.rotate = 0;\n this.x = 0;\n this.y = 0;\n }\n\n private onOverlayWheel(e: WheelEvent): void {\n e.preventDefault();\n this.zoomBy(e.deltaY < 0 ? SCALE_STEP : -SCALE_STEP);\n }\n\n private onStagePointerDown(e: PointerEvent): void {\n if (e.button !== 0) return;\n this.dragging = true;\n this.dragStartX = e.clientX - this.x;\n this.dragStartY = e.clientY - this.y;\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n }\n\n private onStagePointerMove(e: PointerEvent): void {\n if (!this.dragging) return;\n this.x = e.clientX - this.dragStartX;\n this.y = e.clientY - this.dragStartY;\n }\n\n private onStagePointerUp(): void {\n this.dragging = false;\n }\n\n private onTriggerKeydown(e: KeyboardEvent): void {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n this.openPreview();\n }\n }\n\n private imgStyle(): string {\n return `object-fit:${this.fit};object-position:${this.position}`;\n }\n\n private previewStyle(): string {\n return `transform:translate(${this.x}px, ${this.y}px) scale(${this.scale}) rotate(${this.rotate}deg)`;\n }\n\n render() {\n const effectivePreviewSrc = this.previewSrc || this.src;\n return html`\n <div class=\"frame\" part=\"base\">\n ${\n this.shouldLoad && this.status !== 'error'\n ? html`<img\n part=\"image\"\n src=${this.src}\n alt=${this.alt}\n style=${this.imgStyle()}\n @load=${this.onImgLoad}\n @error=${this.onImgError}\n />`\n : ''\n }\n ${\n this.status === 'error' && this.fallback && !this.fallbackFailed\n ? html`<img\n part=\"image\"\n src=${this.fallback}\n alt=${this.alt}\n style=${this.imgStyle()}\n @error=${() => (this.fallbackFailed = true)}\n />`\n : ''\n }\n ${\n this.status === 'loading'\n ? html`<div class=\"layer\">\n <wc-icon name=\"loader\" spin></wc-icon>\n </div>`\n : ''\n }\n ${\n this.status === 'error' && (!this.fallback || this.fallbackFailed)\n ? html`<div class=\"layer\">\n <wc-icon name=\"image-off\"></wc-icon>\n <span>${this.localize.term('image.loadError')}</span>\n </div>`\n : ''\n }\n ${\n this.preview && this.status === 'loaded'\n ? html`<div\n class=\"trigger\"\n role=\"button\"\n tabindex=\"0\"\n aria-label=${this.localize.term('image.preview')}\n @click=${() => this.openPreview()}\n @keydown=${this.onTriggerKeydown}\n ></div>`\n : ''\n }\n </div>\n ${\n this.previewOpen\n ? html`<div\n class=\"overlay\"\n part=\"overlay\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=${this.localize.term('image.preview')}\n tabindex=\"-1\"\n @wheel=${this.onOverlayWheel}\n @click=${(e: MouseEvent) => {\n if (e.target === e.currentTarget) this.requestClosePreview('overlay');\n }}\n >\n <div\n class=\"stage ${this.dragging ? 'dragging' : ''}\"\n @pointerdown=${this.onStagePointerDown}\n @pointermove=${this.onStagePointerMove}\n @pointerup=${this.onStagePointerUp}\n @pointercancel=${this.onStagePointerUp}\n >\n <img\n part=\"preview-image\"\n src=${effectivePreviewSrc}\n alt=${this.alt}\n draggable=\"false\"\n style=${this.previewStyle()}\n />\n </div>\n <div class=\"toolbar\" part=\"toolbar\">\n <button\n type=\"button\"\n aria-label=${this.localize.term('image.zoomIn')}\n @click=${() => this.zoomBy(SCALE_STEP)}\n >\n <wc-icon name=\"zoom-in\"></wc-icon>\n </button>\n <button\n type=\"button\"\n aria-label=${this.localize.term('image.zoomOut')}\n @click=${() => this.zoomBy(-SCALE_STEP)}\n >\n <wc-icon name=\"zoom-out\"></wc-icon>\n </button>\n <button\n type=\"button\"\n aria-label=${this.localize.term('image.rotate')}\n @click=${() => this.rotateBy()}\n >\n <wc-icon name=\"rotate-cw\"></wc-icon>\n </button>\n <button\n type=\"button\"\n aria-label=${this.localize.term('image.reset')}\n title=${this.localize.term('image.reset')}\n @click=${() => this.resetTransform()}\n >\n 1:1\n </button>\n <button\n type=\"button\"\n part=\"close-button\"\n aria-label=${this.localize.term('image.close')}\n @click=${() => this.requestClosePreview('close-btn')}\n >\n <wc-icon name=\"close\"></wc-icon>\n </button>\n </div>\n </div>`\n : ''\n }\n `;\n }\n}\n\nif (!customElements.get('wc-image')) {\n customElements.define('wc-image', wcImage);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-image': wcImage;\n }\n}\n","import { css } from 'lit';\n\nexport const uploadStyles = css`\n :host {\n display: block;\n\n /* component 层令牌 */\n --wc-upload-font-size: var(--wc-font-size-medium);\n --wc-upload-radius: var(--wc-radius-medium);\n --wc-upload-dragger-bg: var(--wc-color-bg-container);\n }\n\n .hidden-input {\n display: none;\n }\n\n /* ---- 默认触发按钮 ---- */\n .trigger-wrap {\n display: flex;\n align-items: center;\n gap: var(--wc-space-2);\n }\n\n .trigger {\n display: inline-flex;\n align-items: center;\n gap: var(--wc-space-1);\n height: 32px;\n padding: 0 var(--wc-space-3);\n font-family: inherit;\n font-size: var(--wc-upload-font-size);\n color: var(--wc-color-text);\n background-color: var(--wc-color-bg-container);\n border: 1px solid var(--wc-color-border);\n border-radius: var(--wc-upload-radius);\n cursor: pointer;\n user-select: none;\n transition:\n border-color var(--wc-duration-fast) var(--wc-easing-standard),\n color var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .trigger:hover:not(:disabled) {\n border-color: var(--wc-color-primary);\n color: var(--wc-color-primary);\n }\n\n .trigger:disabled {\n background-color: var(--wc-color-bg-disabled);\n border-color: transparent;\n color: var(--wc-color-text-disabled);\n cursor: not-allowed;\n }\n\n /* ---- 拖拽区域 ---- */\n .dragger {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: var(--wc-space-6) var(--wc-space-4);\n background-color: var(--wc-upload-dragger-bg);\n border: 1px dashed var(--wc-color-border);\n border-radius: var(--wc-upload-radius);\n cursor: pointer;\n user-select: none;\n text-align: center;\n transition:\n border-color var(--wc-duration-fast) var(--wc-easing-standard),\n background-color var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .dragger:hover:not([aria-disabled='true']),\n .dragger.drag-over {\n border-color: var(--wc-color-primary);\n background-color: var(--wc-color-bg-hover);\n }\n\n .dragger[aria-disabled='true'] {\n cursor: not-allowed;\n color: var(--wc-color-text-disabled);\n }\n\n .dragger-icon {\n font-size: 28px;\n color: var(--wc-color-text-placeholder);\n }\n\n .dragger:hover:not([aria-disabled='true']) .dragger-icon,\n .dragger.drag-over .dragger-icon {\n color: var(--wc-color-primary);\n }\n\n .dragger-text {\n margin-top: var(--wc-space-2);\n font-size: var(--wc-upload-font-size);\n color: var(--wc-color-text);\n }\n\n /* ---- 提示文字(tip 插槽) ---- */\n .tip {\n display: inline-block;\n margin-top: var(--wc-space-1);\n font-size: var(--wc-font-size-small);\n color: var(--wc-color-text-placeholder);\n }\n\n .tip:empty {\n display: none;\n }\n\n /* ---- 文件列表 ---- */\n .list {\n margin: var(--wc-space-2) 0 0;\n padding: 0;\n list-style: none;\n }\n\n .item {\n padding: var(--wc-space-1) var(--wc-space-2);\n border-radius: var(--wc-radius-small);\n transition: background-color var(--wc-duration-fast) var(--wc-easing-standard);\n }\n\n .item:hover {\n background-color: var(--wc-color-bg-hover);\n }\n\n .row {\n display: flex;\n align-items: center;\n gap: var(--wc-space-2);\n min-height: 24px;\n }\n\n .type-icon {\n font-size: 16px;\n color: var(--wc-color-text-placeholder);\n flex-shrink: 0;\n }\n\n .item.success .type-icon {\n color: var(--wc-color-success);\n }\n\n .item.error .type-icon {\n color: var(--wc-color-error);\n }\n\n .name {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--wc-upload-font-size);\n color: var(--wc-color-text);\n }\n\n .name.link {\n color: var(--wc-color-primary);\n cursor: pointer;\n }\n\n .name.link:hover {\n text-decoration: underline;\n }\n\n .size,\n .percent,\n .fail-text {\n flex-shrink: 0;\n font-size: var(--wc-font-size-small);\n color: var(--wc-color-text-placeholder);\n }\n\n .fail-text {\n color: var(--wc-color-error);\n }\n\n .status-icon {\n font-size: 16px;\n flex-shrink: 0;\n }\n\n .status-icon.success {\n color: var(--wc-color-success);\n }\n\n .status-icon.error {\n color: var(--wc-color-error);\n }\n\n .status-icon.waiting {\n color: var(--wc-color-text-placeholder);\n }\n\n .icon-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n background: transparent;\n border: none;\n cursor: pointer;\n }\n\n .remove {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n padding: 0;\n background: transparent;\n border: none;\n border-radius: var(--wc-radius-circle);\n color: var(--wc-color-text-placeholder);\n cursor: pointer;\n flex-shrink: 0;\n }\n\n /* wc-icon 的 :host 自带 text 色,这里让叉号跟随按钮的灰阶 */\n .remove wc-icon {\n color: inherit;\n }\n\n .remove:hover {\n color: var(--wc-color-text-secondary);\n }\n\n .bar {\n margin: var(--wc-space-1) 0 0 var(--wc-space-6);\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { baseStyles } from '../../styles/base.css';\nimport { LocalizeController } from '../../i18n/localize-controller';\nimport '../icon/wc-icon.js';\nimport '../progress/wc-progress.js';\nimport { uploadStyles } from './wc-upload.styles';\n\nexport type wcUploadFileStatus = 'waiting' | 'uploading' | 'success' | 'error';\n\n/** 文件条目:选择/拖拽加入的文件与上传状态 */\nexport interface wcUploadFile {\n /** 唯一标识,由组件生成(列表以引用不可变方式更新,回调需按 uid 定位) */\n uid: string;\n /** 原始 File 对象(选择/拖拽进来时存在) */\n raw?: File;\n /** 文件名 */\n name: string;\n /** 文件大小(字节) */\n size?: number;\n /** 上传进度 0-100 */\n percent?: number;\n /** 上传状态 */\n status: wcUploadFileStatus;\n /** 文件访问地址(成功响应含 url 字段时自动提取,也可手动赋值;有点击预览) */\n url?: string;\n /** 服务端响应内容 */\n response?: unknown;\n}\n\n/** 自定义上传方法:通过回调驱动进度/成功/失败 */\nexport type wcUploadRequestMethod = (\n file: wcUploadFile,\n options: {\n onProgress: (percent: number) => void;\n onSuccess: (response?: unknown) => void;\n onError: (message?: string) => void;\n },\n) => void;\n\n/**\n * 上传。支持点击/拖拽选择文件、max 数量限制、进度展示(内嵌 wc-progress)、\n * 失败重试与文件列表管理;通过 action(XHR POST FormData)或 requestMethod(自定义上传)实现上传。\n *\n * @slot tip - 提示说明,显示在触发区下方\n * @csspart base - 外层容器\n * @csspart trigger - 默认触发按钮(非拖拽模式)\n * @csspart dragger - 拖拽区域(draggable 模式)\n * @csspart list - 文件列表\n * @csspart item - 文件条目\n * @cssprop --wc-upload-radius - 触发区/拖拽区圆角(默认 --wc-radius-medium)\n * @cssprop --wc-upload-dragger-bg - 拖拽区背景色\n * @fires wc-select - 选择/拖入文件后触发,detail.files 为原始 File 数组\n * @fires wc-change - 文件列表变化时触发,detail.files 为当前列表\n * @fires wc-progress - 上传进度变化时触发,detail: { file, percent }\n * @fires wc-success - 单个文件上传成功时触发,detail: { file, response }\n * @fires wc-error - 单个文件上传失败时触发,detail: { file, message }\n * @fires wc-remove - 移除文件时触发(可取消,detail: { file, index })\n * @fires wc-exceed - 超出 max 数量限制时触发,detail: { files, max }\n * @fires wc-preview - 点击带 url 的文件名时触发,detail.file\n */\nexport class wcUpload extends LitElement {\n static styles = [baseStyles, uploadStyles];\n\n /** 上传地址(设置后以内置 XHR 上传,POST FormData,字段名取 name) */\n @property() action = '';\n\n /** FormData 字段名 */\n @property() name = 'file';\n\n /** 接受的文件类型(原生 accept) */\n @property() accept = '';\n\n /** 是否支持多选 */\n @property({ type: Boolean }) multiple = false;\n\n /** 最大文件数量,0 表示不限制 */\n @property({ type: Number }) max = 0;\n\n /** 拖拽上传模式:渲染大面积拖拽区域 */\n @property({ type: Boolean, reflect: true }) draggable = false;\n\n /** 选择文件后自动开始上传;设为 false 时通过 submit() 手动触发 */\n @property({\n type: Boolean,\n reflect: true,\n attribute: 'auto-upload',\n converter: (value) => (value == null ? true : value !== 'false'),\n })\n autoUpload = true;\n\n /** 是否禁用 */\n @property({ type: Boolean, reflect: true }) disabled = false;\n\n /** 自定义上传方法(属性型,仅 JS 赋值;设置后优先于 action) */\n @property({ attribute: false })\n requestMethod: wcUploadRequestMethod | null = null;\n\n /** 当前文件列表(组件内部维护,可读取用于回显/提交) */\n @state() files: wcUploadFile[] = [];\n\n @state() private dragOver = false;\n\n private localize = new LocalizeController(this);\n\n /** 进行中的 XHR(按文件 uid 键控),用于移除文件时中断 */\n private xhrMap = new Map<string, XMLHttpRequest>();\n\n private uidCounter = 0;\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n for (const xhr of this.xhrMap.values()) xhr.abort();\n this.xhrMap.clear();\n }\n\n /* ---------- 公开方法 ---------- */\n\n /** 手动上传全部 waiting 状态的文件(autoUpload=false 时使用) */\n submit(): void {\n for (const file of this.files) {\n if (file.status === 'waiting') this.startUpload(file);\n }\n }\n\n /** 清空文件列表并中断进行中的上传 */\n clearFiles(): void {\n for (const xhr of this.xhrMap.values()) xhr.abort();\n this.xhrMap.clear();\n if (!this.files.length) return;\n this.files = [];\n this.emitChange();\n }\n\n private nextUid(): string {\n this.uidCounter += 1;\n return `wc-upload-file-${this.uidCounter}`;\n }\n\n /* ---------- 选择与拖拽 ---------- */\n\n private pick(): void {\n if (this.disabled) return;\n const input = this.shadowRoot?.querySelector<HTMLInputElement>('input[type=\"file\"]');\n input?.click();\n }\n\n private onInputChange(e: Event): void {\n const input = e.target as HTMLInputElement;\n if (input.files?.length) this.addFiles(input.files);\n input.value = '';\n }\n\n private onDragOver(e: DragEvent): void {\n e.preventDefault();\n if (!this.disabled) this.dragOver = true;\n }\n\n private onDragLeave(): void {\n this.dragOver = false;\n }\n\n private onDrop(e: DragEvent): void {\n e.preventDefault();\n this.dragOver = false;\n if (this.disabled) return;\n if (e.dataTransfer?.files?.length) this.addFiles(e.dataTransfer.files);\n }\n\n private onDraggerKeydown(e: KeyboardEvent): void {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n this.pick();\n }\n }\n\n private addFiles(list: FileList | File[]): void {\n const incoming = Array.from(list);\n if (!incoming.length) return;\n let allowed = incoming;\n if (this.max > 0) {\n const remaining = this.max - this.files.length;\n if (remaining < incoming.length) {\n const rejected = incoming.slice(Math.max(0, remaining));\n this.dispatchEvent(\n new CustomEvent('wc-exceed', {\n detail: { files: rejected, max: this.max },\n bubbles: true,\n composed: true,\n }),\n );\n allowed = incoming.slice(0, Math.max(0, remaining));\n }\n }\n if (!allowed.length) return;\n const items: wcUploadFile[] = allowed.map((raw) => ({\n uid: this.nextUid(),\n raw,\n name: raw.name,\n size: raw.size,\n percent: 0,\n status: 'waiting',\n }));\n this.files = [...this.files, ...items];\n this.dispatchEvent(\n new CustomEvent('wc-select', {\n detail: { files: allowed },\n bubbles: true,\n composed: true,\n }),\n );\n this.emitChange();\n if (this.autoUpload) {\n for (const item of items) this.startUpload(item);\n }\n }\n\n /* ---------- 上传流程 ---------- */\n\n private startUpload(file: wcUploadFile): void {\n if (this.disabled || file.status === 'uploading') return;\n if (!this.action && !this.requestMethod) {\n console.warn('[wc-upload] 未配置 action 或 requestMethod,文件保持待上传状态');\n return;\n }\n this.updateFile(file, { status: 'uploading', percent: 0 });\n if (this.requestMethod) {\n this.requestMethod(file, {\n onProgress: (percent) => this.handleProgress(file, percent),\n onSuccess: (response) => this.handleSuccess(file, response),\n onError: (message) => this.handleError(file, message),\n });\n } else {\n this.uploadWithXhr(file);\n }\n }\n\n private uploadWithXhr(file: wcUploadFile): void {\n const xhr = new XMLHttpRequest();\n this.xhrMap.set(file.uid, xhr);\n const form = new FormData();\n form.append(this.name, file.raw as File);\n xhr.open('POST', this.action);\n xhr.upload.onprogress = (e) => {\n if (e.lengthComputable) this.handleProgress(file, (e.loaded / e.total) * 100);\n };\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n let response: unknown = xhr.responseText;\n try {\n response = JSON.parse(xhr.responseText);\n } catch {\n /* 非 JSON 响应保留原始文本 */\n }\n this.handleSuccess(file, response);\n } else {\n this.handleError(file, `HTTP ${xhr.status}`);\n }\n };\n xhr.onerror = () => this.handleError(file, 'network error');\n xhr.send(form);\n }\n\n private handleProgress(file: wcUploadFile, percent: number): void {\n const clamped = Math.min(100, Math.max(0, Math.round(percent)));\n this.updateFile(file, { percent: clamped });\n this.dispatchEvent(\n new CustomEvent('wc-progress', {\n detail: { file: this.snapshot(file), percent: clamped },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private handleSuccess(file: wcUploadFile, response?: unknown): void {\n this.xhrMap.delete(file.uid);\n // 约定:响应为对象且含 url 字符串字段时自动提取为文件地址\n const url =\n typeof (response as { url?: unknown } | null)?.url === 'string'\n ? (response as { url: string }).url\n : undefined;\n this.updateFile(file, { status: 'success', percent: 100, response, url });\n this.dispatchEvent(\n new CustomEvent('wc-success', {\n detail: { file: this.snapshot(file), response },\n bubbles: true,\n composed: true,\n }),\n );\n this.emitChange();\n }\n\n private handleError(file: wcUploadFile, message?: string): void {\n this.xhrMap.delete(file.uid);\n this.updateFile(file, { status: 'error' });\n this.dispatchEvent(\n new CustomEvent('wc-error', {\n detail: { file: this.snapshot(file), message },\n bubbles: true,\n composed: true,\n }),\n );\n this.emitChange();\n }\n\n /* ---------- 列表操作 ---------- */\n\n private removeFile(index: number): void {\n const file = this.files[index];\n if (!file) return;\n const accepted = this.dispatchEvent(\n new CustomEvent('wc-remove', {\n detail: { file, index },\n bubbles: true,\n composed: true,\n cancelable: true,\n }),\n );\n if (!accepted) return;\n this.xhrMap.get(file.uid)?.abort();\n this.xhrMap.delete(file.uid);\n this.files = this.files.filter((_, i) => i !== index);\n this.emitChange();\n }\n\n private retry(file: wcUploadFile): void {\n if (file.status !== 'error') return;\n this.startUpload(file);\n }\n\n private onNameClick(file: wcUploadFile): void {\n if (!file.url) return;\n this.dispatchEvent(\n new CustomEvent('wc-preview', { detail: { file }, bubbles: true, composed: true }),\n );\n }\n\n private updateFile(file: wcUploadFile, patch: Partial<wcUploadFile>): void {\n this.files = this.files.map((f) => (f.uid === file.uid ? { ...f, ...patch } : f));\n }\n\n private snapshot(file: wcUploadFile): wcUploadFile {\n return this.files.find((f) => f.uid === file.uid) ?? file;\n }\n\n private emitChange(): void {\n this.dispatchEvent(\n new CustomEvent('wc-change', {\n detail: { files: [...this.files] },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private formatSize(size?: number): string {\n if (size == null) return '';\n if (size < 1024) return `${size} B`;\n if (size < 1024 * 1024) return `${(size / 1024).toFixed(1)} KB`;\n return `${(size / 1024 / 1024).toFixed(1)} MB`;\n }\n\n render() {\n return html`\n <div class=\"upload\" part=\"base\">\n <input\n class=\"hidden-input\"\n type=\"file\"\n accept=${this.accept}\n ?multiple=${this.multiple}\n ?disabled=${this.disabled}\n @change=${this.onInputChange}\n />\n ${\n this.draggable\n ? html`<div\n class=\"dragger ${this.dragOver ? 'drag-over' : ''}\"\n part=\"dragger\"\n role=\"button\"\n tabindex=${this.disabled ? -1 : 0}\n aria-disabled=${this.disabled}\n @click=${this.pick}\n @keydown=${this.onDraggerKeydown}\n @dragover=${this.onDragOver}\n @dragleave=${this.onDragLeave}\n @drop=${this.onDrop}\n >\n <wc-icon name=\"upload\" class=\"dragger-icon\"></wc-icon>\n <span class=\"dragger-text\">${this.localize.term('upload.clickOrDrag')}</span>\n <span class=\"tip\"><slot name=\"tip\"></slot></span>\n </div>`\n : html`<div class=\"trigger-wrap\">\n <button\n type=\"button\"\n class=\"trigger\"\n part=\"trigger\"\n ?disabled=${this.disabled}\n @click=${this.pick}\n >\n <wc-icon name=\"upload\"></wc-icon>\n <span>${this.localize.term('upload.upload')}</span>\n </button>\n <span class=\"tip\"><slot name=\"tip\"></slot></span>\n </div>`\n }\n ${\n this.files.length\n ? html`<ul class=\"list\" part=\"list\">\n ${this.files.map(\n (file, index) => html`\n <li class=\"item ${file.status}\" part=\"item\">\n <div class=\"row\">\n <wc-icon name=\"file\" class=\"type-icon\"></wc-icon>\n <span\n class=\"name ${file.url ? 'link' : ''}\"\n title=${file.name}\n role=${file.url ? 'button' : undefined}\n tabindex=${file.url ? 0 : undefined}\n @click=${() => this.onNameClick(file)}\n @keydown=${(e: KeyboardEvent) => {\n if (file.url && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault();\n this.onNameClick(file);\n }\n }}\n >${file.name}</span\n >\n ${\n file.status === 'uploading'\n ? html`<span class=\"percent\">${Math.round(file.percent ?? 0)}%</span>`\n : file.status === 'error'\n ? html`<span class=\"fail-text\"\n >${this.localize.term('upload.failed')}</span\n >`\n : html`<span class=\"size\">${this.formatSize(file.size)}</span>`\n }\n ${\n file.status === 'success'\n ? html`<wc-icon name=\"check\" class=\"status-icon success\"></wc-icon>`\n : file.status === 'error'\n ? html`<button\n type=\"button\"\n class=\"icon-btn\"\n title=${this.localize.term('upload.retry')}\n aria-label=${this.localize.term('upload.retry')}\n @click=${() => this.retry(file)}\n >\n <wc-icon name=\"error\" class=\"status-icon error\"></wc-icon>\n </button>`\n : file.status === 'waiting'\n ? html`<wc-icon\n name=\"loader\"\n spin\n class=\"status-icon waiting\"\n ></wc-icon>`\n : ''\n }\n <button\n type=\"button\"\n class=\"remove\"\n part=\"remove-button\"\n aria-label=${this.localize.term('upload.remove')}\n @click=${() => this.removeFile(index)}\n >\n <wc-icon name=\"close\"></wc-icon>\n </button>\n </div>\n ${\n file.status === 'uploading'\n ? html`<wc-progress\n class=\"bar\"\n value=${file.percent ?? 0}\n stroke-width=\"4\"\n ?show-label=${false}\n ></wc-progress>`\n : ''\n }\n </li>\n `,\n )}\n </ul>`\n : ''\n }\n </div>\n `;\n }\n}\n\nif (!customElements.get('wc-upload')) {\n customElements.define('wc-upload', wcUpload);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'wc-upload': wcUpload;\n }\n}\n","/**\n * Feather Icons v4.29.2 全量内置(脚本生成,勿手工编辑)。\n * 与手挑内置图标(icons/index.ts)重名的以手挑版本为准,此处已剔除。\n */\nimport { createIcon } from './library.js';\nimport type { WcIconData } from './library.js';\n\nexport const featherIcons: WcIconData[] = [\n createIcon('activity', '<polyline points=\"22 12 18 12 15 21 9 3 6 12 2 12\"></polyline>'),\n createIcon(\n 'airplay',\n '<path d=\"M5 17H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2h-1\"></path><polygon points=\"12 15 17 21 7 21 12 15\"></polygon>',\n ),\n createIcon(\n 'alert-circle',\n '<circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line>',\n ),\n createIcon(\n 'alert-octagon',\n '<polygon points=\"7.86 2 16.14 2 22 7.86 22 16.14 16.14 22 7.86 22 2 16.14 2 7.86 7.86 2\"></polygon><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line>',\n ),\n createIcon(\n 'alert-triangle',\n '<path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"></path><line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"></line><line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"></line>',\n ),\n createIcon(\n 'align-center',\n '<line x1=\"18\" y1=\"10\" x2=\"6\" y2=\"10\"></line><line x1=\"21\" y1=\"6\" x2=\"3\" y2=\"6\"></line><line x1=\"21\" y1=\"14\" x2=\"3\" y2=\"14\"></line><line x1=\"18\" y1=\"18\" x2=\"6\" y2=\"18\"></line>',\n ),\n createIcon(\n 'align-justify',\n '<line x1=\"21\" y1=\"10\" x2=\"3\" y2=\"10\"></line><line x1=\"21\" y1=\"6\" x2=\"3\" y2=\"6\"></line><line x1=\"21\" y1=\"14\" x2=\"3\" y2=\"14\"></line><line x1=\"21\" y1=\"18\" x2=\"3\" y2=\"18\"></line>',\n ),\n createIcon(\n 'align-left',\n '<line x1=\"17\" y1=\"10\" x2=\"3\" y2=\"10\"></line><line x1=\"21\" y1=\"6\" x2=\"3\" y2=\"6\"></line><line x1=\"21\" y1=\"14\" x2=\"3\" y2=\"14\"></line><line x1=\"17\" y1=\"18\" x2=\"3\" y2=\"18\"></line>',\n ),\n createIcon(\n 'align-right',\n '<line x1=\"21\" y1=\"10\" x2=\"7\" y2=\"10\"></line><line x1=\"21\" y1=\"6\" x2=\"3\" y2=\"6\"></line><line x1=\"21\" y1=\"14\" x2=\"3\" y2=\"14\"></line><line x1=\"21\" y1=\"18\" x2=\"7\" y2=\"18\"></line>',\n ),\n createIcon(\n 'anchor',\n '<circle cx=\"12\" cy=\"5\" r=\"3\"></circle><line x1=\"12\" y1=\"22\" x2=\"12\" y2=\"8\"></line><path d=\"M5 12H2a10 10 0 0 0 20 0h-3\"></path>',\n ),\n createIcon(\n 'aperture',\n '<circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"14.31\" y1=\"8\" x2=\"20.05\" y2=\"17.94\"></line><line x1=\"9.69\" y1=\"8\" x2=\"21.17\" y2=\"8\"></line><line x1=\"7.38\" y1=\"12\" x2=\"13.12\" y2=\"2.06\"></line><line x1=\"9.69\" y1=\"16\" x2=\"3.95\" y2=\"6.06\"></line><line x1=\"14.31\" y1=\"16\" x2=\"2.83\" y2=\"16\"></line><line x1=\"16.62\" y1=\"12\" x2=\"10.88\" y2=\"21.94\"></line>',\n ),\n createIcon(\n 'archive',\n '<polyline points=\"21 8 21 21 3 21 3 8\"></polyline><rect x=\"1\" y=\"3\" width=\"22\" height=\"5\"></rect><line x1=\"10\" y1=\"12\" x2=\"14\" y2=\"12\"></line>',\n ),\n createIcon(\n 'arrow-down-circle',\n '<circle cx=\"12\" cy=\"12\" r=\"10\"></circle><polyline points=\"8 12 12 16 16 12\"></polyline><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"16\"></line>',\n ),\n createIcon(\n 'arrow-down-left',\n '<line x1=\"17\" y1=\"7\" x2=\"7\" y2=\"17\"></line><polyline points=\"17 17 7 17 7 7\"></polyline>',\n ),\n createIcon(\n 'arrow-down-right',\n '<line x1=\"7\" y1=\"7\" x2=\"17\" y2=\"17\"></line><polyline points=\"17 7 17 17 7 17\"></polyline>',\n ),\n createIcon(\n 'arrow-down',\n '<line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"></line><polyline points=\"19 12 12 19 5 12\"></polyline>',\n ),\n createIcon(\n 'arrow-left-circle',\n '<circle cx=\"12\" cy=\"12\" r=\"10\"></circle><polyline points=\"12 8 8 12 12 16\"></polyline><line x1=\"16\" y1=\"12\" x2=\"8\" y2=\"12\"></line>',\n ),\n createIcon(\n 'arrow-right-circle',\n '<circle cx=\"12\" cy=\"12\" r=\"10\"></circle><polyline points=\"12 16 16 12 12 8\"></polyline><line x1=\"8\" y1=\"12\" x2=\"16\" y2=\"12\"></line>',\n ),\n createIcon(\n 'arrow-up-circle',\n '<circle cx=\"12\" cy=\"12\" r=\"10\"></circle><polyline points=\"16 12 12 8 8 12\"></polyline><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"8\"></line>',\n ),\n createIcon(\n 'arrow-up-left',\n '<line x1=\"17\" y1=\"17\" x2=\"7\" y2=\"7\"></line><polyline points=\"7 17 7 7 17 7\"></polyline>',\n ),\n createIcon(\n 'arrow-up-right',\n '<line x1=\"7\" y1=\"17\" x2=\"17\" y2=\"7\"></line><polyline points=\"7 7 17 7 17 17\"></polyline>',\n ),\n createIcon(\n 'at-sign',\n '<circle cx=\"12\" cy=\"12\" r=\"4\"></circle><path d=\"M16 8v5a3 3 0 0 0 6 0v-1a10 10 0 1 0-3.92 7.94\"></path>',\n ),\n createIcon(\n 'award',\n '<circle cx=\"12\" cy=\"8\" r=\"7\"></circle><polyline points=\"8.21 13.89 7 23 12 20 17 23 15.79 13.88\"></polyline>',\n ),\n createIcon(\n 'bar-chart-2',\n '<line x1=\"18\" y1=\"20\" x2=\"18\" y2=\"10\"></line><line x1=\"12\" y1=\"20\" x2=\"12\" y2=\"4\"></line><line x1=\"6\" y1=\"20\" x2=\"6\" y2=\"14\"></line>',\n ),\n createIcon(\n 'bar-chart',\n '<line x1=\"12\" y1=\"20\" x2=\"12\" y2=\"10\"></line><line x1=\"18\" y1=\"20\" x2=\"18\" y2=\"4\"></line><line x1=\"6\" y1=\"20\" x2=\"6\" y2=\"16\"></line>',\n ),\n createIcon(\n 'battery-charging',\n '<path d=\"M5 18H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h3.19M15 6h2a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2h-3.19\"></path><line x1=\"23\" y1=\"13\" x2=\"23\" y2=\"11\"></line><polyline points=\"11 6 7 12 13 12 9 18\"></polyline>',\n ),\n createIcon(\n 'battery',\n '<rect x=\"1\" y=\"6\" width=\"18\" height=\"12\" rx=\"2\" ry=\"2\"></rect><line x1=\"23\" y1=\"13\" x2=\"23\" y2=\"11\"></line>',\n ),\n createIcon(\n 'bell-off',\n '<path d=\"M13.73 21a2 2 0 0 1-3.46 0\"></path><path d=\"M18.63 13A17.89 17.89 0 0 1 18 8\"></path><path d=\"M6.26 6.26A5.86 5.86 0 0 0 6 8c0 7-3 9-3 9h14\"></path><path d=\"M18 8a6 6 0 0 0-9.33-5\"></path><line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\"></line>',\n ),\n createIcon(\n 'bell',\n '<path d=\"M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9\"></path><path d=\"M13.73 21a2 2 0 0 1-3.46 0\"></path>',\n ),\n createIcon(\n 'bluetooth',\n '<polyline points=\"6.5 6.5 17.5 17.5 12 23 12 1 17.5 6.5 6.5 17.5\"></polyline>',\n ),\n createIcon(\n 'bold',\n '<path d=\"M6 4h8a4 4 0 0 1 4 4 4 4 0 0 1-4 4H6z\"></path><path d=\"M6 12h9a4 4 0 0 1 4 4 4 4 0 0 1-4 4H6z\"></path>',\n ),\n createIcon(\n 'book-open',\n '<path d=\"M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z\"></path><path d=\"M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z\"></path>',\n ),\n createIcon(\n 'book',\n '<path d=\"M4 19.5A2.5 2.5 0 0 1 6.5 17H20\"></path><path d=\"M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z\"></path>',\n ),\n createIcon('bookmark', '<path d=\"M19 21l-7-5-7 5V5a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2z\"></path>'),\n createIcon(\n 'box',\n '<path d=\"M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z\"></path><polyline points=\"3.27 6.96 12 12.01 20.73 6.96\"></polyline><line x1=\"12\" y1=\"22.08\" x2=\"12\" y2=\"12\"></line>',\n ),\n createIcon(\n 'briefcase',\n '<rect x=\"2\" y=\"7\" width=\"20\" height=\"14\" rx=\"2\" ry=\"2\"></rect><path d=\"M16 21V5a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16\"></path>',\n ),\n createIcon(\n 'camera-off',\n '<line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\"></line><path d=\"M21 21H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h3m3-3h6l2 3h4a2 2 0 0 1 2 2v9.34m-7.72-2.06a4 4 0 1 1-5.56-5.56\"></path>',\n ),\n createIcon(\n 'camera',\n '<path d=\"M23 19a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h4l2-3h6l2 3h4a2 2 0 0 1 2 2z\"></path><circle cx=\"12\" cy=\"13\" r=\"4\"></circle>',\n ),\n createIcon(\n 'cast',\n '<path d=\"M2 16.1A5 5 0 0 1 5.9 20M2 12.05A9 9 0 0 1 9.95 20M2 8V6a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2h-6\"></path><line x1=\"2\" y1=\"20\" x2=\"2.01\" y2=\"20\"></line>',\n ),\n createIcon(\n 'check-circle',\n '<path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\"></path><polyline points=\"22 4 12 14.01 9 11.01\"></polyline>',\n ),\n createIcon(\n 'check-square',\n '<polyline points=\"9 11 12 14 22 4\"></polyline><path d=\"M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11\"></path>',\n ),\n createIcon(\n 'chevrons-down',\n '<polyline points=\"7 13 12 18 17 13\"></polyline><polyline points=\"7 6 12 11 17 6\"></polyline>',\n ),\n createIcon(\n 'chevrons-left',\n '<polyline points=\"11 17 6 12 11 7\"></polyline><polyline points=\"18 17 13 12 18 7\"></polyline>',\n ),\n createIcon(\n 'chevrons-right',\n '<polyline points=\"13 17 18 12 13 7\"></polyline><polyline points=\"6 17 11 12 6 7\"></polyline>',\n ),\n createIcon(\n 'chevrons-up',\n '<polyline points=\"17 11 12 6 7 11\"></polyline><polyline points=\"17 18 12 13 7 18\"></polyline>',\n ),\n createIcon(\n 'chrome',\n '<circle cx=\"12\" cy=\"12\" r=\"10\"></circle><circle cx=\"12\" cy=\"12\" r=\"4\"></circle><line x1=\"21.17\" y1=\"8\" x2=\"12\" y2=\"8\"></line><line x1=\"3.95\" y1=\"6.06\" x2=\"8.54\" y2=\"14\"></line><line x1=\"10.88\" y1=\"21.94\" x2=\"15.46\" y2=\"14\"></line>',\n ),\n createIcon('circle', '<circle cx=\"12\" cy=\"12\" r=\"10\"></circle>'),\n createIcon(\n 'clipboard',\n '<path d=\"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2\"></path><rect x=\"8\" y=\"2\" width=\"8\" height=\"4\" rx=\"1\" ry=\"1\"></rect>',\n ),\n createIcon(\n 'clock',\n '<circle cx=\"12\" cy=\"12\" r=\"10\"></circle><polyline points=\"12 6 12 12 16 14\"></polyline>',\n ),\n createIcon(\n 'cloud-drizzle',\n '<line x1=\"8\" y1=\"19\" x2=\"8\" y2=\"21\"></line><line x1=\"8\" y1=\"13\" x2=\"8\" y2=\"15\"></line><line x1=\"16\" y1=\"19\" x2=\"16\" y2=\"21\"></line><line x1=\"16\" y1=\"13\" x2=\"16\" y2=\"15\"></line><line x1=\"12\" y1=\"21\" x2=\"12\" y2=\"23\"></line><line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"17\"></line><path d=\"M20 16.58A5 5 0 0 0 18 7h-1.26A8 8 0 1 0 4 15.25\"></path>',\n ),\n createIcon(\n 'cloud-lightning',\n '<path d=\"M19 16.9A5 5 0 0 0 18 7h-1.26a8 8 0 1 0-11.62 9\"></path><polyline points=\"13 11 9 17 15 17 11 23\"></polyline>',\n ),\n createIcon(\n 'cloud-off',\n '<path d=\"M22.61 16.95A5 5 0 0 0 18 10h-1.26a8 8 0 0 0-7.05-6M5 5a8 8 0 0 0 4 15h9a5 5 0 0 0 1.7-.3\"></path><line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\"></line>',\n ),\n createIcon(\n 'cloud-rain',\n '<line x1=\"16\" y1=\"13\" x2=\"16\" y2=\"21\"></line><line x1=\"8\" y1=\"13\" x2=\"8\" y2=\"21\"></line><line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"23\"></line><path d=\"M20 16.58A5 5 0 0 0 18 7h-1.26A8 8 0 1 0 4 15.25\"></path>',\n ),\n createIcon(\n 'cloud-snow',\n '<path d=\"M20 17.58A5 5 0 0 0 18 8h-1.26A8 8 0 1 0 4 16.25\"></path><line x1=\"8\" y1=\"16\" x2=\"8.01\" y2=\"16\"></line><line x1=\"8\" y1=\"20\" x2=\"8.01\" y2=\"20\"></line><line x1=\"12\" y1=\"18\" x2=\"12.01\" y2=\"18\"></line><line x1=\"12\" y1=\"22\" x2=\"12.01\" y2=\"22\"></line><line x1=\"16\" y1=\"16\" x2=\"16.01\" y2=\"16\"></line><line x1=\"16\" y1=\"20\" x2=\"16.01\" y2=\"20\"></line>',\n ),\n createIcon('cloud', '<path d=\"M18 10h-1.26A8 8 0 1 0 9 20h9a5 5 0 0 0 0-10z\"></path>'),\n createIcon(\n 'code',\n '<polyline points=\"16 18 22 12 16 6\"></polyline><polyline points=\"8 6 2 12 8 18\"></polyline>',\n ),\n createIcon(\n 'codepen',\n '<polygon points=\"12 2 22 8.5 22 15.5 12 22 2 15.5 2 8.5 12 2\"></polygon><line x1=\"12\" y1=\"22\" x2=\"12\" y2=\"15.5\"></line><polyline points=\"22 8.5 12 15.5 2 8.5\"></polyline><polyline points=\"2 15.5 12 8.5 22 15.5\"></polyline><line x1=\"12\" y1=\"2\" x2=\"12\" y2=\"8.5\"></line>',\n ),\n createIcon(\n 'codesandbox',\n '<path d=\"M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z\"></path><polyline points=\"7.5 4.21 12 6.81 16.5 4.21\"></polyline><polyline points=\"7.5 19.79 7.5 14.6 3 12\"></polyline><polyline points=\"21 12 16.5 14.6 16.5 19.79\"></polyline><polyline points=\"3.27 6.96 12 12.01 20.73 6.96\"></polyline><line x1=\"12\" y1=\"22.08\" x2=\"12\" y2=\"12\"></line>',\n ),\n createIcon(\n 'coffee',\n '<path d=\"M18 8h1a4 4 0 0 1 0 8h-1\"></path><path d=\"M2 8h16v9a4 4 0 0 1-4 4H6a4 4 0 0 1-4-4V8z\"></path><line x1=\"6\" y1=\"1\" x2=\"6\" y2=\"4\"></line><line x1=\"10\" y1=\"1\" x2=\"10\" y2=\"4\"></line><line x1=\"14\" y1=\"1\" x2=\"14\" y2=\"4\"></line>',\n ),\n createIcon(\n 'columns',\n '<path d=\"M12 3h7a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-7m0-18H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h7m0-18v18\"></path>',\n ),\n createIcon(\n 'command',\n '<path d=\"M18 3a3 3 0 0 0-3 3v12a3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0-3-3H6a3 3 0 0 0-3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3V6a3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3h12a3 3 0 0 0 3-3 3 3 0 0 0-3-3z\"></path>',\n ),\n createIcon(\n 'compass',\n '<circle cx=\"12\" cy=\"12\" r=\"10\"></circle><polygon points=\"16.24 7.76 14.12 14.12 7.76 16.24 9.88 9.88 16.24 7.76\"></polygon>',\n ),\n createIcon(\n 'copy',\n '<rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"></rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"></path>',\n ),\n createIcon(\n 'corner-down-left',\n '<polyline points=\"9 10 4 15 9 20\"></polyline><path d=\"M20 4v7a4 4 0 0 1-4 4H4\"></path>',\n ),\n createIcon(\n 'corner-down-right',\n '<polyline points=\"15 10 20 15 15 20\"></polyline><path d=\"M4 4v7a4 4 0 0 0 4 4h12\"></path>',\n ),\n createIcon(\n 'corner-left-down',\n '<polyline points=\"14 15 9 20 4 15\"></polyline><path d=\"M20 4h-7a4 4 0 0 0-4 4v12\"></path>',\n ),\n createIcon(\n 'corner-left-up',\n '<polyline points=\"14 9 9 4 4 9\"></polyline><path d=\"M20 20h-7a4 4 0 0 1-4-4V4\"></path>',\n ),\n createIcon(\n 'corner-right-down',\n '<polyline points=\"10 15 15 20 20 15\"></polyline><path d=\"M4 4h7a4 4 0 0 1 4 4v12\"></path>',\n ),\n createIcon(\n 'corner-right-up',\n '<polyline points=\"10 9 15 4 20 9\"></polyline><path d=\"M4 20h7a4 4 0 0 0 4-4V4\"></path>',\n ),\n createIcon(\n 'corner-up-left',\n '<polyline points=\"9 14 4 9 9 4\"></polyline><path d=\"M20 20v-7a4 4 0 0 0-4-4H4\"></path>',\n ),\n createIcon(\n 'corner-up-right',\n '<polyline points=\"15 14 20 9 15 4\"></polyline><path d=\"M4 20v-7a4 4 0 0 1 4-4h12\"></path>',\n ),\n createIcon(\n 'cpu',\n '<rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"2\" ry=\"2\"></rect><rect x=\"9\" y=\"9\" width=\"6\" height=\"6\"></rect><line x1=\"9\" y1=\"1\" x2=\"9\" y2=\"4\"></line><line x1=\"15\" y1=\"1\" x2=\"15\" y2=\"4\"></line><line x1=\"9\" y1=\"20\" x2=\"9\" y2=\"23\"></line><line x1=\"15\" y1=\"20\" x2=\"15\" y2=\"23\"></line><line x1=\"20\" y1=\"9\" x2=\"23\" y2=\"9\"></line><line x1=\"20\" y1=\"14\" x2=\"23\" y2=\"14\"></line><line x1=\"1\" y1=\"9\" x2=\"4\" y2=\"9\"></line><line x1=\"1\" y1=\"14\" x2=\"4\" y2=\"14\"></line>',\n ),\n createIcon(\n 'credit-card',\n '<rect x=\"1\" y=\"4\" width=\"22\" height=\"16\" rx=\"2\" ry=\"2\"></rect><line x1=\"1\" y1=\"10\" x2=\"23\" y2=\"10\"></line>',\n ),\n createIcon(\n 'crop',\n '<path d=\"M6.13 1L6 16a2 2 0 0 0 2 2h15\"></path><path d=\"M1 6.13L16 6a2 2 0 0 1 2 2v15\"></path>',\n ),\n createIcon(\n 'crosshair',\n '<circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"22\" y1=\"12\" x2=\"18\" y2=\"12\"></line><line x1=\"6\" y1=\"12\" x2=\"2\" y2=\"12\"></line><line x1=\"12\" y1=\"6\" x2=\"12\" y2=\"2\"></line><line x1=\"12\" y1=\"22\" x2=\"12\" y2=\"18\"></line>',\n ),\n createIcon(\n 'database',\n '<ellipse cx=\"12\" cy=\"5\" rx=\"9\" ry=\"3\"></ellipse><path d=\"M21 12c0 1.66-4 3-9 3s-9-1.34-9-3\"></path><path d=\"M3 5v14c0 1.66 4 3 9 3s9-1.34 9-3V5\"></path>',\n ),\n createIcon(\n 'delete',\n '<path d=\"M21 4H8l-7 8 7 8h13a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2z\"></path><line x1=\"18\" y1=\"9\" x2=\"12\" y2=\"15\"></line><line x1=\"12\" y1=\"9\" x2=\"18\" y2=\"15\"></line>',\n ),\n createIcon(\n 'disc',\n '<circle cx=\"12\" cy=\"12\" r=\"10\"></circle><circle cx=\"12\" cy=\"12\" r=\"3\"></circle>',\n ),\n createIcon(\n 'divide-circle',\n '<line x1=\"8\" y1=\"12\" x2=\"16\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"16\"></line><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"8\"></line><circle cx=\"12\" cy=\"12\" r=\"10\"></circle>',\n ),\n createIcon(\n 'divide-square',\n '<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect><line x1=\"8\" y1=\"12\" x2=\"16\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"16\"></line><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"8\"></line>',\n ),\n createIcon(\n 'divide',\n '<circle cx=\"12\" cy=\"6\" r=\"2\"></circle><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"></line><circle cx=\"12\" cy=\"18\" r=\"2\"></circle>',\n ),\n createIcon(\n 'dollar-sign',\n '<line x1=\"12\" y1=\"1\" x2=\"12\" y2=\"23\"></line><path d=\"M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6\"></path>',\n ),\n createIcon(\n 'download-cloud',\n '<polyline points=\"8 17 12 21 16 17\"></polyline><line x1=\"12\" y1=\"12\" x2=\"12\" y2=\"21\"></line><path d=\"M20.88 18.09A5 5 0 0 0 18 9h-1.26A8 8 0 1 0 3 16.29\"></path>',\n ),\n createIcon(\n 'download',\n '<path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"></path><polyline points=\"7 10 12 15 17 10\"></polyline><line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"></line>',\n ),\n createIcon(\n 'dribbble',\n '<circle cx=\"12\" cy=\"12\" r=\"10\"></circle><path d=\"M8.56 2.75c4.37 6.03 6.02 9.42 8.03 17.72m2.54-15.38c-3.72 4.35-8.94 5.66-16.88 5.85m19.5 1.9c-3.5-.93-6.63-.82-8.94 0-2.58.92-5.01 2.86-7.44 6.32\"></path>',\n ),\n createIcon('droplet', '<path d=\"M12 2.69l5.66 5.66a8 8 0 1 1-11.31 0z\"></path>'),\n createIcon('edit-2', '<path d=\"M17 3a2.828 2.828 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5L17 3z\"></path>'),\n createIcon(\n 'edit-3',\n '<path d=\"M12 20h9\"></path><path d=\"M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4L16.5 3.5z\"></path>',\n ),\n createIcon(\n 'edit',\n '<path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"></path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"></path>',\n ),\n createIcon(\n 'external-link',\n '<path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"></path><polyline points=\"15 3 21 3 21 9\"></polyline><line x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"></line>',\n ),\n createIcon(\n 'eye-off',\n '<path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24\"></path><line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\"></line>',\n ),\n createIcon(\n 'eye',\n '<path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\"></path><circle cx=\"12\" cy=\"12\" r=\"3\"></circle>',\n ),\n createIcon(\n 'facebook',\n '<path d=\"M18 2h-3a5 5 0 0 0-5 5v3H7v4h3v8h4v-8h3l1-4h-4V7a1 1 0 0 1 1-1h3z\"></path>',\n ),\n createIcon(\n 'fast-forward',\n '<polygon points=\"13 19 22 12 13 5 13 19\"></polygon><polygon points=\"2 19 11 12 2 5 2 19\"></polygon>',\n ),\n createIcon(\n 'feather',\n '<path d=\"M20.24 12.24a6 6 0 0 0-8.49-8.49L5 10.5V19h8.5z\"></path><line x1=\"16\" y1=\"8\" x2=\"2\" y2=\"22\"></line><line x1=\"17.5\" y1=\"15\" x2=\"9\" y2=\"15\"></line>',\n ),\n createIcon(\n 'figma',\n '<path d=\"M5 5.5A3.5 3.5 0 0 1 8.5 2H12v7H8.5A3.5 3.5 0 0 1 5 5.5z\"></path><path d=\"M12 2h3.5a3.5 3.5 0 1 1 0 7H12V2z\"></path><path d=\"M12 12.5a3.5 3.5 0 1 1 7 0 3.5 3.5 0 1 1-7 0z\"></path><path d=\"M5 19.5A3.5 3.5 0 0 1 8.5 16H12v3.5a3.5 3.5 0 1 1-7 0z\"></path><path d=\"M5 12.5A3.5 3.5 0 0 1 8.5 9H12v7H8.5A3.5 3.5 0 0 1 5 12.5z\"></path>',\n ),\n createIcon(\n 'file-minus',\n '<path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"></path><polyline points=\"14 2 14 8 20 8\"></polyline><line x1=\"9\" y1=\"15\" x2=\"15\" y2=\"15\"></line>',\n ),\n createIcon(\n 'file-plus',\n '<path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"></path><polyline points=\"14 2 14 8 20 8\"></polyline><line x1=\"12\" y1=\"18\" x2=\"12\" y2=\"12\"></line><line x1=\"9\" y1=\"15\" x2=\"15\" y2=\"15\"></line>',\n ),\n createIcon(\n 'file-text',\n '<path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"></path><polyline points=\"14 2 14 8 20 8\"></polyline><line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\"></line><line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\"></line><polyline points=\"10 9 9 9 8 9\"></polyline>',\n ),\n createIcon(\n 'film',\n '<rect x=\"2\" y=\"2\" width=\"20\" height=\"20\" rx=\"2.18\" ry=\"2.18\"></rect><line x1=\"7\" y1=\"2\" x2=\"7\" y2=\"22\"></line><line x1=\"17\" y1=\"2\" x2=\"17\" y2=\"22\"></line><line x1=\"2\" y1=\"12\" x2=\"22\" y2=\"12\"></line><line x1=\"2\" y1=\"7\" x2=\"7\" y2=\"7\"></line><line x1=\"2\" y1=\"17\" x2=\"7\" y2=\"17\"></line><line x1=\"17\" y1=\"17\" x2=\"22\" y2=\"17\"></line><line x1=\"17\" y1=\"7\" x2=\"22\" y2=\"7\"></line>',\n ),\n createIcon('filter', '<polygon points=\"22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3\"></polygon>'),\n createIcon(\n 'flag',\n '<path d=\"M4 15s1-1 4-1 5 2 8 2 4-1 4-1V3s-1 1-4 1-5-2-8-2-4 1-4 1z\"></path><line x1=\"4\" y1=\"22\" x2=\"4\" y2=\"15\"></line>',\n ),\n createIcon(\n 'folder-minus',\n '<path d=\"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z\"></path><line x1=\"9\" y1=\"14\" x2=\"15\" y2=\"14\"></line>',\n ),\n createIcon(\n 'folder-plus',\n '<path d=\"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z\"></path><line x1=\"12\" y1=\"11\" x2=\"12\" y2=\"17\"></line><line x1=\"9\" y1=\"14\" x2=\"15\" y2=\"14\"></line>',\n ),\n createIcon(\n 'folder',\n '<path d=\"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z\"></path>',\n ),\n createIcon('framer', '<path d=\"M5 16V9h14V2H5l14 14h-7m-7 0l7 7v-7m-7 0h7\"></path>'),\n createIcon(\n 'frown',\n '<circle cx=\"12\" cy=\"12\" r=\"10\"></circle><path d=\"M16 16s-1.5-2-4-2-4 2-4 2\"></path><line x1=\"9\" y1=\"9\" x2=\"9.01\" y2=\"9\"></line><line x1=\"15\" y1=\"9\" x2=\"15.01\" y2=\"9\"></line>',\n ),\n createIcon(\n 'gift',\n '<polyline points=\"20 12 20 22 4 22 4 12\"></polyline><rect x=\"2\" y=\"7\" width=\"20\" height=\"5\"></rect><line x1=\"12\" y1=\"22\" x2=\"12\" y2=\"7\"></line><path d=\"M12 7H7.5a2.5 2.5 0 0 1 0-5C11 2 12 7 12 7z\"></path><path d=\"M12 7h4.5a2.5 2.5 0 0 0 0-5C13 2 12 7 12 7z\"></path>',\n ),\n createIcon(\n 'git-branch',\n '<line x1=\"6\" y1=\"3\" x2=\"6\" y2=\"15\"></line><circle cx=\"18\" cy=\"6\" r=\"3\"></circle><circle cx=\"6\" cy=\"18\" r=\"3\"></circle><path d=\"M18 9a9 9 0 0 1-9 9\"></path>',\n ),\n createIcon(\n 'git-commit',\n '<circle cx=\"12\" cy=\"12\" r=\"4\"></circle><line x1=\"1.05\" y1=\"12\" x2=\"7\" y2=\"12\"></line><line x1=\"17.01\" y1=\"12\" x2=\"22.96\" y2=\"12\"></line>',\n ),\n createIcon(\n 'git-merge',\n '<circle cx=\"18\" cy=\"18\" r=\"3\"></circle><circle cx=\"6\" cy=\"6\" r=\"3\"></circle><path d=\"M6 21V9a9 9 0 0 0 9 9\"></path>',\n ),\n createIcon(\n 'git-pull-request',\n '<circle cx=\"18\" cy=\"18\" r=\"3\"></circle><circle cx=\"6\" cy=\"6\" r=\"3\"></circle><path d=\"M13 6h3a2 2 0 0 1 2 2v7\"></path><line x1=\"6\" y1=\"9\" x2=\"6\" y2=\"21\"></line>',\n ),\n createIcon(\n 'github',\n '<path d=\"M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22\"></path>',\n ),\n createIcon(\n 'gitlab',\n '<path d=\"M22.65 14.39L12 22.13 1.35 14.39a.84.84 0 0 1-.3-.94l1.22-3.78 2.44-7.51A.42.42 0 0 1 4.82 2a.43.43 0 0 1 .58 0 .42.42 0 0 1 .11.18l2.44 7.49h8.1l2.44-7.51A.42.42 0 0 1 18.6 2a.43.43 0 0 1 .58 0 .42.42 0 0 1 .11.18l2.44 7.51L23 13.45a.84.84 0 0 1-.35.94z\"></path>',\n ),\n createIcon(\n 'globe',\n '<circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"2\" y1=\"12\" x2=\"22\" y2=\"12\"></line><path d=\"M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z\"></path>',\n ),\n createIcon(\n 'grid',\n '<rect x=\"3\" y=\"3\" width=\"7\" height=\"7\"></rect><rect x=\"14\" y=\"3\" width=\"7\" height=\"7\"></rect><rect x=\"14\" y=\"14\" width=\"7\" height=\"7\"></rect><rect x=\"3\" y=\"14\" width=\"7\" height=\"7\"></rect>',\n ),\n createIcon(\n 'hard-drive',\n '<line x1=\"22\" y1=\"12\" x2=\"2\" y2=\"12\"></line><path d=\"M5.45 5.11L2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z\"></path><line x1=\"6\" y1=\"16\" x2=\"6.01\" y2=\"16\"></line><line x1=\"10\" y1=\"16\" x2=\"10.01\" y2=\"16\"></line>',\n ),\n createIcon(\n 'hash',\n '<line x1=\"4\" y1=\"9\" x2=\"20\" y2=\"9\"></line><line x1=\"4\" y1=\"15\" x2=\"20\" y2=\"15\"></line><line x1=\"10\" y1=\"3\" x2=\"8\" y2=\"21\"></line><line x1=\"16\" y1=\"3\" x2=\"14\" y2=\"21\"></line>',\n ),\n createIcon(\n 'headphones',\n '<path d=\"M3 18v-6a9 9 0 0 1 18 0v6\"></path><path d=\"M21 19a2 2 0 0 1-2 2h-1a2 2 0 0 1-2-2v-3a2 2 0 0 1 2-2h3zM3 19a2 2 0 0 0 2 2h1a2 2 0 0 0 2-2v-3a2 2 0 0 0-2-2H3z\"></path>',\n ),\n createIcon(\n 'heart',\n '<path d=\"M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z\"></path>',\n ),\n createIcon(\n 'help-circle',\n '<circle cx=\"12\" cy=\"12\" r=\"10\"></circle><path d=\"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\"></path><line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"></line>',\n ),\n createIcon(\n 'hexagon',\n '<path d=\"M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z\"></path>',\n ),\n createIcon(\n 'home',\n '<path d=\"M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\"></path><polyline points=\"9 22 9 12 15 12 15 22\"></polyline>',\n ),\n createIcon(\n 'image',\n '<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect><circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\"></circle><polyline points=\"21 15 16 10 5 21\"></polyline>',\n ),\n createIcon(\n 'inbox',\n '<polyline points=\"22 12 16 12 14 15 10 15 8 12 2 12\"></polyline><path d=\"M5.45 5.11L2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z\"></path>',\n ),\n createIcon(\n 'instagram',\n '<rect x=\"2\" y=\"2\" width=\"20\" height=\"20\" rx=\"5\" ry=\"5\"></rect><path d=\"M16 11.37A4 4 0 1 1 12.63 8 4 4 0 0 1 16 11.37z\"></path><line x1=\"17.5\" y1=\"6.5\" x2=\"17.51\" y2=\"6.5\"></line>',\n ),\n createIcon(\n 'italic',\n '<line x1=\"19\" y1=\"4\" x2=\"10\" y2=\"4\"></line><line x1=\"14\" y1=\"20\" x2=\"5\" y2=\"20\"></line><line x1=\"15\" y1=\"4\" x2=\"9\" y2=\"20\"></line>',\n ),\n createIcon(\n 'key',\n '<path d=\"M21 2l-2 2m-7.61 7.61a5.5 5.5 0 1 1-7.778 7.778 5.5 5.5 0 0 1 7.777-7.777zm0 0L15.5 7.5m0 0l3 3L22 7l-3-3m-3.5 3.5L19 4\"></path>',\n ),\n createIcon(\n 'layers',\n '<polygon points=\"12 2 2 7 12 12 22 7 12 2\"></polygon><polyline points=\"2 17 12 22 22 17\"></polyline><polyline points=\"2 12 12 17 22 12\"></polyline>',\n ),\n createIcon(\n 'layout',\n '<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect><line x1=\"3\" y1=\"9\" x2=\"21\" y2=\"9\"></line><line x1=\"9\" y1=\"21\" x2=\"9\" y2=\"9\"></line>',\n ),\n createIcon(\n 'life-buoy',\n '<circle cx=\"12\" cy=\"12\" r=\"10\"></circle><circle cx=\"12\" cy=\"12\" r=\"4\"></circle><line x1=\"4.93\" y1=\"4.93\" x2=\"9.17\" y2=\"9.17\"></line><line x1=\"14.83\" y1=\"14.83\" x2=\"19.07\" y2=\"19.07\"></line><line x1=\"14.83\" y1=\"9.17\" x2=\"19.07\" y2=\"4.93\"></line><line x1=\"14.83\" y1=\"9.17\" x2=\"18.36\" y2=\"5.64\"></line><line x1=\"4.93\" y1=\"19.07\" x2=\"9.17\" y2=\"14.83\"></line>',\n ),\n createIcon(\n 'link-2',\n '<path d=\"M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3\"></path><line x1=\"8\" y1=\"12\" x2=\"16\" y2=\"12\"></line>',\n ),\n createIcon(\n 'link',\n '<path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"></path><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"></path>',\n ),\n createIcon(\n 'linkedin',\n '<path d=\"M16 8a6 6 0 0 1 6 6v7h-4v-7a2 2 0 0 0-2-2 2 2 0 0 0-2 2v7h-4v-7a6 6 0 0 1 6-6z\"></path><rect x=\"2\" y=\"9\" width=\"4\" height=\"12\"></rect><circle cx=\"4\" cy=\"4\" r=\"2\"></circle>',\n ),\n createIcon(\n 'list',\n '<line x1=\"8\" y1=\"6\" x2=\"21\" y2=\"6\"></line><line x1=\"8\" y1=\"12\" x2=\"21\" y2=\"12\"></line><line x1=\"8\" y1=\"18\" x2=\"21\" y2=\"18\"></line><line x1=\"3\" y1=\"6\" x2=\"3.01\" y2=\"6\"></line><line x1=\"3\" y1=\"12\" x2=\"3.01\" y2=\"12\"></line><line x1=\"3\" y1=\"18\" x2=\"3.01\" y2=\"18\"></line>',\n ),\n createIcon(\n 'lock',\n '<rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\"></rect><path d=\"M7 11V7a5 5 0 0 1 10 0v4\"></path>',\n ),\n createIcon(\n 'log-in',\n '<path d=\"M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4\"></path><polyline points=\"10 17 15 12 10 7\"></polyline><line x1=\"15\" y1=\"12\" x2=\"3\" y2=\"12\"></line>',\n ),\n createIcon(\n 'log-out',\n '<path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\"></path><polyline points=\"16 17 21 12 16 7\"></polyline><line x1=\"21\" y1=\"12\" x2=\"9\" y2=\"12\"></line>',\n ),\n createIcon(\n 'mail',\n '<path d=\"M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z\"></path><polyline points=\"22,6 12,13 2,6\"></polyline>',\n ),\n createIcon(\n 'map-pin',\n '<path d=\"M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z\"></path><circle cx=\"12\" cy=\"10\" r=\"3\"></circle>',\n ),\n createIcon(\n 'map',\n '<polygon points=\"1 6 1 22 8 18 16 22 23 18 23 2 16 6 8 2 1 6\"></polygon><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"18\"></line><line x1=\"16\" y1=\"6\" x2=\"16\" y2=\"22\"></line>',\n ),\n createIcon(\n 'maximize-2',\n '<polyline points=\"15 3 21 3 21 9\"></polyline><polyline points=\"9 21 3 21 3 15\"></polyline><line x1=\"21\" y1=\"3\" x2=\"14\" y2=\"10\"></line><line x1=\"3\" y1=\"21\" x2=\"10\" y2=\"14\"></line>',\n ),\n createIcon(\n 'maximize',\n '<path d=\"M8 3H5a2 2 0 0 0-2 2v3m18 0V5a2 2 0 0 0-2-2h-3m0 18h3a2 2 0 0 0 2-2v-3M3 16v3a2 2 0 0 0 2 2h3\"></path>',\n ),\n createIcon(\n 'meh',\n '<circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"8\" y1=\"15\" x2=\"16\" y2=\"15\"></line><line x1=\"9\" y1=\"9\" x2=\"9.01\" y2=\"9\"></line><line x1=\"15\" y1=\"9\" x2=\"15.01\" y2=\"9\"></line>',\n ),\n createIcon(\n 'menu',\n '<line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\"></line><line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"></line><line x1=\"3\" y1=\"18\" x2=\"21\" y2=\"18\"></line>',\n ),\n createIcon(\n 'message-circle',\n '<path d=\"M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z\"></path>',\n ),\n createIcon(\n 'message-square',\n '<path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\"></path>',\n ),\n createIcon(\n 'mic-off',\n '<line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\"></line><path d=\"M9 9v3a3 3 0 0 0 5.12 2.12M15 9.34V4a3 3 0 0 0-5.94-.6\"></path><path d=\"M17 16.95A7 7 0 0 1 5 12v-2m14 0v2a7 7 0 0 1-.11 1.23\"></path><line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"23\"></line><line x1=\"8\" y1=\"23\" x2=\"16\" y2=\"23\"></line>',\n ),\n createIcon(\n 'mic',\n '<path d=\"M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z\"></path><path d=\"M19 10v2a7 7 0 0 1-14 0v-2\"></path><line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"23\"></line><line x1=\"8\" y1=\"23\" x2=\"16\" y2=\"23\"></line>',\n ),\n createIcon(\n 'minimize-2',\n '<polyline points=\"4 14 10 14 10 20\"></polyline><polyline points=\"20 10 14 10 14 4\"></polyline><line x1=\"14\" y1=\"10\" x2=\"21\" y2=\"3\"></line><line x1=\"3\" y1=\"21\" x2=\"10\" y2=\"14\"></line>',\n ),\n createIcon(\n 'minimize',\n '<path d=\"M8 3v3a2 2 0 0 1-2 2H3m18 0h-3a2 2 0 0 1-2-2V3m0 18v-3a2 2 0 0 1 2-2h3M3 16h3a2 2 0 0 1 2 2v3\"></path>',\n ),\n createIcon(\n 'minus-circle',\n '<circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"8\" y1=\"12\" x2=\"16\" y2=\"12\"></line>',\n ),\n createIcon(\n 'minus-square',\n '<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect><line x1=\"8\" y1=\"12\" x2=\"16\" y2=\"12\"></line>',\n ),\n createIcon(\n 'monitor',\n '<rect x=\"2\" y=\"3\" width=\"20\" height=\"14\" rx=\"2\" ry=\"2\"></rect><line x1=\"8\" y1=\"21\" x2=\"16\" y2=\"21\"></line><line x1=\"12\" y1=\"17\" x2=\"12\" y2=\"21\"></line>',\n ),\n createIcon('moon', '<path d=\"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z\"></path>'),\n createIcon(\n 'more-horizontal',\n '<circle cx=\"12\" cy=\"12\" r=\"1\"></circle><circle cx=\"19\" cy=\"12\" r=\"1\"></circle><circle cx=\"5\" cy=\"12\" r=\"1\"></circle>',\n ),\n createIcon(\n 'more-vertical',\n '<circle cx=\"12\" cy=\"12\" r=\"1\"></circle><circle cx=\"12\" cy=\"5\" r=\"1\"></circle><circle cx=\"12\" cy=\"19\" r=\"1\"></circle>',\n ),\n createIcon(\n 'mouse-pointer',\n '<path d=\"M3 3l7.07 16.97 2.51-7.39 7.39-2.51L3 3z\"></path><path d=\"M13 13l6 6\"></path>',\n ),\n createIcon(\n 'move',\n '<polyline points=\"5 9 2 12 5 15\"></polyline><polyline points=\"9 5 12 2 15 5\"></polyline><polyline points=\"15 19 12 22 9 19\"></polyline><polyline points=\"19 9 22 12 19 15\"></polyline><line x1=\"2\" y1=\"12\" x2=\"22\" y2=\"12\"></line><line x1=\"12\" y1=\"2\" x2=\"12\" y2=\"22\"></line>',\n ),\n createIcon(\n 'music',\n '<path d=\"M9 18V5l12-2v13\"></path><circle cx=\"6\" cy=\"18\" r=\"3\"></circle><circle cx=\"18\" cy=\"16\" r=\"3\"></circle>',\n ),\n createIcon('navigation-2', '<polygon points=\"12 2 19 21 12 17 5 21 12 2\"></polygon>'),\n createIcon('navigation', '<polygon points=\"3 11 22 2 13 21 11 13 3 11\"></polygon>'),\n createIcon(\n 'octagon',\n '<polygon points=\"7.86 2 16.14 2 22 7.86 22 16.14 16.14 22 7.86 22 2 16.14 2 7.86 7.86 2\"></polygon>',\n ),\n createIcon(\n 'package',\n '<line x1=\"16.5\" y1=\"9.4\" x2=\"7.5\" y2=\"4.21\"></line><path d=\"M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z\"></path><polyline points=\"3.27 6.96 12 12.01 20.73 6.96\"></polyline><line x1=\"12\" y1=\"22.08\" x2=\"12\" y2=\"12\"></line>',\n ),\n createIcon(\n 'paperclip',\n '<path d=\"M21.44 11.05l-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48\"></path>',\n ),\n createIcon(\n 'pause-circle',\n '<circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"10\" y1=\"15\" x2=\"10\" y2=\"9\"></line><line x1=\"14\" y1=\"15\" x2=\"14\" y2=\"9\"></line>',\n ),\n createIcon(\n 'pause',\n '<rect x=\"6\" y=\"4\" width=\"4\" height=\"16\"></rect><rect x=\"14\" y=\"4\" width=\"4\" height=\"16\"></rect>',\n ),\n createIcon(\n 'pen-tool',\n '<path d=\"M12 19l7-7 3 3-7 7-3-3z\"></path><path d=\"M18 13l-1.5-7.5L2 2l3.5 14.5L13 18l5-5z\"></path><path d=\"M2 2l7.586 7.586\"></path><circle cx=\"11\" cy=\"11\" r=\"2\"></circle>',\n ),\n createIcon(\n 'percent',\n '<line x1=\"19\" y1=\"5\" x2=\"5\" y2=\"19\"></line><circle cx=\"6.5\" cy=\"6.5\" r=\"2.5\"></circle><circle cx=\"17.5\" cy=\"17.5\" r=\"2.5\"></circle>',\n ),\n createIcon(\n 'phone-call',\n '<path d=\"M15.05 5A5 5 0 0 1 19 8.95M15.05 1A9 9 0 0 1 23 8.94m-1 7.98v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z\"></path>',\n ),\n createIcon(\n 'phone-forwarded',\n '<polyline points=\"19 1 23 5 19 9\"></polyline><line x1=\"15\" y1=\"5\" x2=\"23\" y2=\"5\"></line><path d=\"M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z\"></path>',\n ),\n createIcon(\n 'phone-incoming',\n '<polyline points=\"16 2 16 8 22 8\"></polyline><line x1=\"23\" y1=\"1\" x2=\"16\" y2=\"8\"></line><path d=\"M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z\"></path>',\n ),\n createIcon(\n 'phone-missed',\n '<line x1=\"23\" y1=\"1\" x2=\"17\" y2=\"7\"></line><line x1=\"17\" y1=\"1\" x2=\"23\" y2=\"7\"></line><path d=\"M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z\"></path>',\n ),\n createIcon(\n 'phone-off',\n '<path d=\"M10.68 13.31a16 16 0 0 0 3.41 2.6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7 2 2 0 0 1 1.72 2v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.42 19.42 0 0 1-3.33-2.67m-2.67-3.34a19.79 19.79 0 0 1-3.07-8.63A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91\"></path><line x1=\"23\" y1=\"1\" x2=\"1\" y2=\"23\"></line>',\n ),\n createIcon(\n 'phone-outgoing',\n '<polyline points=\"23 7 23 1 17 1\"></polyline><line x1=\"16\" y1=\"8\" x2=\"23\" y2=\"1\"></line><path d=\"M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z\"></path>',\n ),\n createIcon(\n 'phone',\n '<path d=\"M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z\"></path>',\n ),\n createIcon(\n 'pie-chart',\n '<path d=\"M21.21 15.89A10 10 0 1 1 8 2.83\"></path><path d=\"M22 12A10 10 0 0 0 12 2v10z\"></path>',\n ),\n createIcon(\n 'play-circle',\n '<circle cx=\"12\" cy=\"12\" r=\"10\"></circle><polygon points=\"10 8 16 12 10 16 10 8\"></polygon>',\n ),\n createIcon('play', '<polygon points=\"5 3 19 12 5 21 5 3\"></polygon>'),\n createIcon(\n 'plus-circle',\n '<circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"16\"></line><line x1=\"8\" y1=\"12\" x2=\"16\" y2=\"12\"></line>',\n ),\n createIcon(\n 'plus-square',\n '<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"16\"></line><line x1=\"8\" y1=\"12\" x2=\"16\" y2=\"12\"></line>',\n ),\n createIcon(\n 'pocket',\n '<path d=\"M4 3h16a2 2 0 0 1 2 2v6a10 10 0 0 1-10 10A10 10 0 0 1 2 11V5a2 2 0 0 1 2-2z\"></path><polyline points=\"8 10 12 14 16 10\"></polyline>',\n ),\n createIcon(\n 'power',\n '<path d=\"M18.36 6.64a9 9 0 1 1-12.73 0\"></path><line x1=\"12\" y1=\"2\" x2=\"12\" y2=\"12\"></line>',\n ),\n createIcon(\n 'printer',\n '<polyline points=\"6 9 6 2 18 2 18 9\"></polyline><path d=\"M6 18H4a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-2\"></path><rect x=\"6\" y=\"14\" width=\"12\" height=\"8\"></rect>',\n ),\n createIcon(\n 'radio',\n '<circle cx=\"12\" cy=\"12\" r=\"2\"></circle><path d=\"M16.24 7.76a6 6 0 0 1 0 8.49m-8.48-.01a6 6 0 0 1 0-8.49m11.31-2.82a10 10 0 0 1 0 14.14m-14.14 0a10 10 0 0 1 0-14.14\"></path>',\n ),\n createIcon(\n 'refresh-ccw',\n '<polyline points=\"1 4 1 10 7 10\"></polyline><polyline points=\"23 20 23 14 17 14\"></polyline><path d=\"M20.49 9A9 9 0 0 0 5.64 5.64L1 10m22 4l-4.64 4.36A9 9 0 0 1 3.51 15\"></path>',\n ),\n createIcon(\n 'refresh-cw',\n '<polyline points=\"23 4 23 10 17 10\"></polyline><polyline points=\"1 20 1 14 7 14\"></polyline><path d=\"M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15\"></path>',\n ),\n createIcon(\n 'repeat',\n '<polyline points=\"17 1 21 5 17 9\"></polyline><path d=\"M3 11V9a4 4 0 0 1 4-4h14\"></path><polyline points=\"7 23 3 19 7 15\"></polyline><path d=\"M21 13v2a4 4 0 0 1-4 4H3\"></path>',\n ),\n createIcon(\n 'rewind',\n '<polygon points=\"11 19 2 12 11 5 11 19\"></polygon><polygon points=\"22 19 13 12 22 5 22 19\"></polygon>',\n ),\n createIcon(\n 'rotate-ccw',\n '<polyline points=\"1 4 1 10 7 10\"></polyline><path d=\"M3.51 15a9 9 0 1 0 2.13-9.36L1 10\"></path>',\n ),\n createIcon(\n 'rss',\n '<path d=\"M4 11a9 9 0 0 1 9 9\"></path><path d=\"M4 4a16 16 0 0 1 16 16\"></path><circle cx=\"5\" cy=\"19\" r=\"1\"></circle>',\n ),\n createIcon(\n 'save',\n '<path d=\"M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z\"></path><polyline points=\"17 21 17 13 7 13 7 21\"></polyline><polyline points=\"7 3 7 8 15 8\"></polyline>',\n ),\n createIcon(\n 'scissors',\n '<circle cx=\"6\" cy=\"6\" r=\"3\"></circle><circle cx=\"6\" cy=\"18\" r=\"3\"></circle><line x1=\"20\" y1=\"4\" x2=\"8.12\" y2=\"15.88\"></line><line x1=\"14.47\" y1=\"14.48\" x2=\"20\" y2=\"20\"></line><line x1=\"8.12\" y1=\"8.12\" x2=\"12\" y2=\"12\"></line>',\n ),\n createIcon(\n 'send',\n '<line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\"></line><polygon points=\"22 2 15 22 11 13 2 9 22 2\"></polygon>',\n ),\n createIcon(\n 'server',\n '<rect x=\"2\" y=\"2\" width=\"20\" height=\"8\" rx=\"2\" ry=\"2\"></rect><rect x=\"2\" y=\"14\" width=\"20\" height=\"8\" rx=\"2\" ry=\"2\"></rect><line x1=\"6\" y1=\"6\" x2=\"6.01\" y2=\"6\"></line><line x1=\"6\" y1=\"18\" x2=\"6.01\" y2=\"18\"></line>',\n ),\n createIcon(\n 'settings',\n '<circle cx=\"12\" cy=\"12\" r=\"3\"></circle><path d=\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z\"></path>',\n ),\n createIcon(\n 'share-2',\n '<circle cx=\"18\" cy=\"5\" r=\"3\"></circle><circle cx=\"6\" cy=\"12\" r=\"3\"></circle><circle cx=\"18\" cy=\"19\" r=\"3\"></circle><line x1=\"8.59\" y1=\"13.51\" x2=\"15.42\" y2=\"17.49\"></line><line x1=\"15.41\" y1=\"6.51\" x2=\"8.59\" y2=\"10.49\"></line>',\n ),\n createIcon(\n 'share',\n '<path d=\"M4 12v8a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8\"></path><polyline points=\"16 6 12 2 8 6\"></polyline><line x1=\"12\" y1=\"2\" x2=\"12\" y2=\"15\"></line>',\n ),\n createIcon(\n 'shield-off',\n '<path d=\"M19.69 14a6.9 6.9 0 0 0 .31-2V5l-8-3-3.16 1.18\"></path><path d=\"M4.73 4.73L4 5v7c0 6 8 10 8 10a20.29 20.29 0 0 0 5.62-4.38\"></path><line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\"></line>',\n ),\n createIcon('shield', '<path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\"></path>'),\n createIcon(\n 'shopping-bag',\n '<path d=\"M6 2L3 6v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6l-3-4z\"></path><line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"></line><path d=\"M16 10a4 4 0 0 1-8 0\"></path>',\n ),\n createIcon(\n 'shopping-cart',\n '<circle cx=\"9\" cy=\"21\" r=\"1\"></circle><circle cx=\"20\" cy=\"21\" r=\"1\"></circle><path d=\"M1 1h4l2.68 13.39a2 2 0 0 0 2 1.61h9.72a2 2 0 0 0 2-1.61L23 6H6\"></path>',\n ),\n createIcon(\n 'shuffle',\n '<polyline points=\"16 3 21 3 21 8\"></polyline><line x1=\"4\" y1=\"20\" x2=\"21\" y2=\"3\"></line><polyline points=\"21 16 21 21 16 21\"></polyline><line x1=\"15\" y1=\"15\" x2=\"21\" y2=\"21\"></line><line x1=\"4\" y1=\"4\" x2=\"9\" y2=\"9\"></line>',\n ),\n createIcon(\n 'sidebar',\n '<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect><line x1=\"9\" y1=\"3\" x2=\"9\" y2=\"21\"></line>',\n ),\n createIcon(\n 'skip-back',\n '<polygon points=\"19 20 9 12 19 4 19 20\"></polygon><line x1=\"5\" y1=\"19\" x2=\"5\" y2=\"5\"></line>',\n ),\n createIcon(\n 'skip-forward',\n '<polygon points=\"5 4 15 12 5 20 5 4\"></polygon><line x1=\"19\" y1=\"5\" x2=\"19\" y2=\"19\"></line>',\n ),\n createIcon(\n 'slack',\n '<path d=\"M14.5 10c-.83 0-1.5-.67-1.5-1.5v-5c0-.83.67-1.5 1.5-1.5s1.5.67 1.5 1.5v5c0 .83-.67 1.5-1.5 1.5z\"></path><path d=\"M20.5 10H19V8.5c0-.83.67-1.5 1.5-1.5s1.5.67 1.5 1.5-.67 1.5-1.5 1.5z\"></path><path d=\"M9.5 14c.83 0 1.5.67 1.5 1.5v5c0 .83-.67 1.5-1.5 1.5S8 21.33 8 20.5v-5c0-.83.67-1.5 1.5-1.5z\"></path><path d=\"M3.5 14H5v1.5c0 .83-.67 1.5-1.5 1.5S2 16.33 2 15.5 2.67 14 3.5 14z\"></path><path d=\"M14 14.5c0-.83.67-1.5 1.5-1.5h5c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5h-5c-.83 0-1.5-.67-1.5-1.5z\"></path><path d=\"M15.5 19H14v1.5c0 .83.67 1.5 1.5 1.5s1.5-.67 1.5-1.5-.67-1.5-1.5-1.5z\"></path><path d=\"M10 9.5C10 8.67 9.33 8 8.5 8h-5C2.67 8 2 8.67 2 9.5S2.67 11 3.5 11h5c.83 0 1.5-.67 1.5-1.5z\"></path><path d=\"M8.5 5H10V3.5C10 2.67 9.33 2 8.5 2S7 2.67 7 3.5 7.67 5 8.5 5z\"></path>',\n ),\n createIcon(\n 'slash',\n '<circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"4.93\" y1=\"4.93\" x2=\"19.07\" y2=\"19.07\"></line>',\n ),\n createIcon(\n 'sliders',\n '<line x1=\"4\" y1=\"21\" x2=\"4\" y2=\"14\"></line><line x1=\"4\" y1=\"10\" x2=\"4\" y2=\"3\"></line><line x1=\"12\" y1=\"21\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"3\"></line><line x1=\"20\" y1=\"21\" x2=\"20\" y2=\"16\"></line><line x1=\"20\" y1=\"12\" x2=\"20\" y2=\"3\"></line><line x1=\"1\" y1=\"14\" x2=\"7\" y2=\"14\"></line><line x1=\"9\" y1=\"8\" x2=\"15\" y2=\"8\"></line><line x1=\"17\" y1=\"16\" x2=\"23\" y2=\"16\"></line>',\n ),\n createIcon(\n 'smartphone',\n '<rect x=\"5\" y=\"2\" width=\"14\" height=\"20\" rx=\"2\" ry=\"2\"></rect><line x1=\"12\" y1=\"18\" x2=\"12.01\" y2=\"18\"></line>',\n ),\n createIcon(\n 'smile',\n '<circle cx=\"12\" cy=\"12\" r=\"10\"></circle><path d=\"M8 14s1.5 2 4 2 4-2 4-2\"></path><line x1=\"9\" y1=\"9\" x2=\"9.01\" y2=\"9\"></line><line x1=\"15\" y1=\"9\" x2=\"15.01\" y2=\"9\"></line>',\n ),\n createIcon(\n 'speaker',\n '<rect x=\"4\" y=\"2\" width=\"16\" height=\"20\" rx=\"2\" ry=\"2\"></rect><circle cx=\"12\" cy=\"14\" r=\"4\"></circle><line x1=\"12\" y1=\"6\" x2=\"12.01\" y2=\"6\"></line>',\n ),\n createIcon('square', '<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect>'),\n createIcon(\n 'star',\n '<polygon points=\"12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2\"></polygon>',\n ),\n createIcon(\n 'stop-circle',\n '<circle cx=\"12\" cy=\"12\" r=\"10\"></circle><rect x=\"9\" y=\"9\" width=\"6\" height=\"6\"></rect>',\n ),\n createIcon(\n 'sun',\n '<circle cx=\"12\" cy=\"12\" r=\"5\"></circle><line x1=\"12\" y1=\"1\" x2=\"12\" y2=\"3\"></line><line x1=\"12\" y1=\"21\" x2=\"12\" y2=\"23\"></line><line x1=\"4.22\" y1=\"4.22\" x2=\"5.64\" y2=\"5.64\"></line><line x1=\"18.36\" y1=\"18.36\" x2=\"19.78\" y2=\"19.78\"></line><line x1=\"1\" y1=\"12\" x2=\"3\" y2=\"12\"></line><line x1=\"21\" y1=\"12\" x2=\"23\" y2=\"12\"></line><line x1=\"4.22\" y1=\"19.78\" x2=\"5.64\" y2=\"18.36\"></line><line x1=\"18.36\" y1=\"5.64\" x2=\"19.78\" y2=\"4.22\"></line>',\n ),\n createIcon(\n 'sunrise',\n '<path d=\"M17 18a5 5 0 0 0-10 0\"></path><line x1=\"12\" y1=\"2\" x2=\"12\" y2=\"9\"></line><line x1=\"4.22\" y1=\"10.22\" x2=\"5.64\" y2=\"11.64\"></line><line x1=\"1\" y1=\"18\" x2=\"3\" y2=\"18\"></line><line x1=\"21\" y1=\"18\" x2=\"23\" y2=\"18\"></line><line x1=\"18.36\" y1=\"11.64\" x2=\"19.78\" y2=\"10.22\"></line><line x1=\"23\" y1=\"22\" x2=\"1\" y2=\"22\"></line><polyline points=\"8 6 12 2 16 6\"></polyline>',\n ),\n createIcon(\n 'sunset',\n '<path d=\"M17 18a5 5 0 0 0-10 0\"></path><line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"2\"></line><line x1=\"4.22\" y1=\"10.22\" x2=\"5.64\" y2=\"11.64\"></line><line x1=\"1\" y1=\"18\" x2=\"3\" y2=\"18\"></line><line x1=\"21\" y1=\"18\" x2=\"23\" y2=\"18\"></line><line x1=\"18.36\" y1=\"11.64\" x2=\"19.78\" y2=\"10.22\"></line><line x1=\"23\" y1=\"22\" x2=\"1\" y2=\"22\"></line><polyline points=\"16 5 12 9 8 5\"></polyline>',\n ),\n createIcon(\n 'table',\n '<path d=\"M9 3H5a2 2 0 0 0-2 2v4m6-6h10a2 2 0 0 1 2 2v4M9 3v18m0 0h10a2 2 0 0 0 2-2V9M9 21H5a2 2 0 0 1-2-2V9m0 0h18\"></path>',\n ),\n createIcon(\n 'tablet',\n '<rect x=\"4\" y=\"2\" width=\"16\" height=\"20\" rx=\"2\" ry=\"2\"></rect><line x1=\"12\" y1=\"18\" x2=\"12.01\" y2=\"18\"></line>',\n ),\n createIcon(\n 'tag',\n '<path d=\"M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z\"></path><line x1=\"7\" y1=\"7\" x2=\"7.01\" y2=\"7\"></line>',\n ),\n createIcon(\n 'target',\n '<circle cx=\"12\" cy=\"12\" r=\"10\"></circle><circle cx=\"12\" cy=\"12\" r=\"6\"></circle><circle cx=\"12\" cy=\"12\" r=\"2\"></circle>',\n ),\n createIcon(\n 'terminal',\n '<polyline points=\"4 17 10 11 4 5\"></polyline><line x1=\"12\" y1=\"19\" x2=\"20\" y2=\"19\"></line>',\n ),\n createIcon(\n 'thermometer',\n '<path d=\"M14 14.76V3.5a2.5 2.5 0 0 0-5 0v11.26a4.5 4.5 0 1 0 5 0z\"></path>',\n ),\n createIcon(\n 'thumbs-down',\n '<path d=\"M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17\"></path>',\n ),\n createIcon(\n 'thumbs-up',\n '<path d=\"M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3\"></path>',\n ),\n createIcon(\n 'toggle-left',\n '<rect x=\"1\" y=\"5\" width=\"22\" height=\"14\" rx=\"7\" ry=\"7\"></rect><circle cx=\"8\" cy=\"12\" r=\"3\"></circle>',\n ),\n createIcon(\n 'toggle-right',\n '<rect x=\"1\" y=\"5\" width=\"22\" height=\"14\" rx=\"7\" ry=\"7\"></rect><circle cx=\"16\" cy=\"12\" r=\"3\"></circle>',\n ),\n createIcon(\n 'tool',\n '<path d=\"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z\"></path>',\n ),\n createIcon(\n 'trash-2',\n '<polyline points=\"3 6 5 6 21 6\"></polyline><path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\"></path><line x1=\"10\" y1=\"11\" x2=\"10\" y2=\"17\"></line><line x1=\"14\" y1=\"11\" x2=\"14\" y2=\"17\"></line>',\n ),\n createIcon(\n 'trash',\n '<polyline points=\"3 6 5 6 21 6\"></polyline><path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\"></path>',\n ),\n createIcon(\n 'trello',\n '<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect><rect x=\"7\" y=\"7\" width=\"3\" height=\"9\"></rect><rect x=\"14\" y=\"7\" width=\"3\" height=\"5\"></rect>',\n ),\n createIcon(\n 'trending-down',\n '<polyline points=\"23 18 13.5 8.5 8.5 13.5 1 6\"></polyline><polyline points=\"17 18 23 18 23 12\"></polyline>',\n ),\n createIcon(\n 'trending-up',\n '<polyline points=\"23 6 13.5 15.5 8.5 10.5 1 18\"></polyline><polyline points=\"17 6 23 6 23 12\"></polyline>',\n ),\n createIcon(\n 'triangle',\n '<path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"></path>',\n ),\n createIcon(\n 'truck',\n '<rect x=\"1\" y=\"3\" width=\"15\" height=\"13\"></rect><polygon points=\"16 8 20 8 23 11 23 16 16 16 16 8\"></polygon><circle cx=\"5.5\" cy=\"18.5\" r=\"2.5\"></circle><circle cx=\"18.5\" cy=\"18.5\" r=\"2.5\"></circle>',\n ),\n createIcon(\n 'tv',\n '<rect x=\"2\" y=\"7\" width=\"20\" height=\"15\" rx=\"2\" ry=\"2\"></rect><polyline points=\"17 2 12 7 7 2\"></polyline>',\n ),\n createIcon('twitch', '<path d=\"M21 2H3v16h5v4l4-4h5l4-4V2zm-10 9V7m5 4V7\"></path>'),\n createIcon(\n 'twitter',\n '<path d=\"M23 3a10.9 10.9 0 0 1-3.14 1.53 4.48 4.48 0 0 0-7.86 3v1A10.66 10.66 0 0 1 3 4s-4 9 5 13a11.64 11.64 0 0 1-7 2c9 5 20 0 20-11.5a4.5 4.5 0 0 0-.08-.83A7.72 7.72 0 0 0 23 3z\"></path>',\n ),\n createIcon(\n 'type',\n '<polyline points=\"4 7 4 4 20 4 20 7\"></polyline><line x1=\"9\" y1=\"20\" x2=\"15\" y2=\"20\"></line><line x1=\"12\" y1=\"4\" x2=\"12\" y2=\"20\"></line>',\n ),\n createIcon('umbrella', '<path d=\"M23 12a11.05 11.05 0 0 0-22 0zm-5 7a3 3 0 0 1-6 0v-7\"></path>'),\n createIcon(\n 'underline',\n '<path d=\"M6 3v7a6 6 0 0 0 6 6 6 6 0 0 0 6-6V3\"></path><line x1=\"4\" y1=\"21\" x2=\"20\" y2=\"21\"></line>',\n ),\n createIcon(\n 'unlock',\n '<rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\"></rect><path d=\"M7 11V7a5 5 0 0 1 9.9-1\"></path>',\n ),\n createIcon(\n 'upload-cloud',\n '<polyline points=\"16 16 12 12 8 16\"></polyline><line x1=\"12\" y1=\"12\" x2=\"12\" y2=\"21\"></line><path d=\"M20.39 18.39A5 5 0 0 0 18 9h-1.26A8 8 0 1 0 3 16.3\"></path><polyline points=\"16 16 12 12 8 16\"></polyline>',\n ),\n createIcon(\n 'user-check',\n '<path d=\"M16 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2\"></path><circle cx=\"8.5\" cy=\"7\" r=\"4\"></circle><polyline points=\"17 11 19 13 23 9\"></polyline>',\n ),\n createIcon(\n 'user-minus',\n '<path d=\"M16 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2\"></path><circle cx=\"8.5\" cy=\"7\" r=\"4\"></circle><line x1=\"23\" y1=\"11\" x2=\"17\" y2=\"11\"></line>',\n ),\n createIcon(\n 'user-plus',\n '<path d=\"M16 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2\"></path><circle cx=\"8.5\" cy=\"7\" r=\"4\"></circle><line x1=\"20\" y1=\"8\" x2=\"20\" y2=\"14\"></line><line x1=\"23\" y1=\"11\" x2=\"17\" y2=\"11\"></line>',\n ),\n createIcon(\n 'user-x',\n '<path d=\"M16 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2\"></path><circle cx=\"8.5\" cy=\"7\" r=\"4\"></circle><line x1=\"18\" y1=\"8\" x2=\"23\" y2=\"13\"></line><line x1=\"23\" y1=\"8\" x2=\"18\" y2=\"13\"></line>',\n ),\n createIcon(\n 'user',\n '<path d=\"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2\"></path><circle cx=\"12\" cy=\"7\" r=\"4\"></circle>',\n ),\n createIcon(\n 'users',\n '<path d=\"M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2\"></path><circle cx=\"9\" cy=\"7\" r=\"4\"></circle><path d=\"M23 21v-2a4 4 0 0 0-3-3.87\"></path><path d=\"M16 3.13a4 4 0 0 1 0 7.75\"></path>',\n ),\n createIcon(\n 'video-off',\n '<path d=\"M16 16v1a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V7a2 2 0 0 1 2-2h2m5.66 0H14a2 2 0 0 1 2 2v3.34l1 1L23 7v10\"></path><line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\"></line>',\n ),\n createIcon(\n 'video',\n '<polygon points=\"23 7 16 12 23 17 23 7\"></polygon><rect x=\"1\" y=\"5\" width=\"15\" height=\"14\" rx=\"2\" ry=\"2\"></rect>',\n ),\n createIcon(\n 'voicemail',\n '<circle cx=\"5.5\" cy=\"11.5\" r=\"4.5\"></circle><circle cx=\"18.5\" cy=\"11.5\" r=\"4.5\"></circle><line x1=\"5.5\" y1=\"16\" x2=\"18.5\" y2=\"16\"></line>',\n ),\n createIcon(\n 'volume-1',\n '<polygon points=\"11 5 6 9 2 9 2 15 6 15 11 19 11 5\"></polygon><path d=\"M15.54 8.46a5 5 0 0 1 0 7.07\"></path>',\n ),\n createIcon(\n 'volume-2',\n '<polygon points=\"11 5 6 9 2 9 2 15 6 15 11 19 11 5\"></polygon><path d=\"M19.07 4.93a10 10 0 0 1 0 14.14M15.54 8.46a5 5 0 0 1 0 7.07\"></path>',\n ),\n createIcon(\n 'volume-x',\n '<polygon points=\"11 5 6 9 2 9 2 15 6 15 11 19 11 5\"></polygon><line x1=\"23\" y1=\"9\" x2=\"17\" y2=\"15\"></line><line x1=\"17\" y1=\"9\" x2=\"23\" y2=\"15\"></line>',\n ),\n createIcon('volume', '<polygon points=\"11 5 6 9 2 9 2 15 6 15 11 19 11 5\"></polygon>'),\n createIcon(\n 'watch',\n '<circle cx=\"12\" cy=\"12\" r=\"7\"></circle><polyline points=\"12 9 12 12 13.5 13.5\"></polyline><path d=\"M16.51 17.35l-.35 3.83a2 2 0 0 1-2 1.82H9.83a2 2 0 0 1-2-1.82l-.35-3.83m.01-10.7l.35-3.83A2 2 0 0 1 9.83 1h4.35a2 2 0 0 1 2 1.82l.35 3.83\"></path>',\n ),\n createIcon(\n 'wifi-off',\n '<line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\"></line><path d=\"M16.72 11.06A10.94 10.94 0 0 1 19 12.55\"></path><path d=\"M5 12.55a10.94 10.94 0 0 1 5.17-2.39\"></path><path d=\"M10.71 5.05A16 16 0 0 1 22.58 9\"></path><path d=\"M1.42 9a15.91 15.91 0 0 1 4.7-2.88\"></path><path d=\"M8.53 16.11a6 6 0 0 1 6.95 0\"></path><line x1=\"12\" y1=\"20\" x2=\"12.01\" y2=\"20\"></line>',\n ),\n createIcon(\n 'wifi',\n '<path d=\"M5 12.55a11 11 0 0 1 14.08 0\"></path><path d=\"M1.42 9a16 16 0 0 1 21.16 0\"></path><path d=\"M8.53 16.11a6 6 0 0 1 6.95 0\"></path><line x1=\"12\" y1=\"20\" x2=\"12.01\" y2=\"20\"></line>',\n ),\n createIcon(\n 'wind',\n '<path d=\"M9.59 4.59A2 2 0 1 1 11 8H2m10.59 11.41A2 2 0 1 0 14 16H2m15.73-8.27A2.5 2.5 0 1 1 19.5 12H2\"></path>',\n ),\n createIcon(\n 'x-circle',\n '<circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\"></line><line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\"></line>',\n ),\n createIcon(\n 'x-octagon',\n '<polygon points=\"7.86 2 16.14 2 22 7.86 22 16.14 16.14 22 7.86 22 2 16.14 2 7.86 7.86 2\"></polygon><line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\"></line><line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\"></line>',\n ),\n createIcon(\n 'x-square',\n '<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect><line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\"></line><line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\"></line>',\n ),\n createIcon(\n 'x',\n '<line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>',\n ),\n createIcon(\n 'youtube',\n '<path d=\"M22.54 6.42a2.78 2.78 0 0 0-1.94-2C18.88 4 12 4 12 4s-6.88 0-8.6.46a2.78 2.78 0 0 0-1.94 2A29 29 0 0 0 1 11.75a29 29 0 0 0 .46 5.33A2.78 2.78 0 0 0 3.4 19c1.72.46 8.6.46 8.6.46s6.88 0 8.6-.46a2.78 2.78 0 0 0 1.94-2 29 29 0 0 0 .46-5.25 29 29 0 0 0-.46-5.33z\"></path><polygon points=\"9.75 15.02 15.5 11.75 9.75 8.48 9.75 15.02\"></polygon>',\n ),\n createIcon(\n 'zap-off',\n '<polyline points=\"12.41 6.75 13 2 10.57 4.92\"></polyline><polyline points=\"18.57 12.91 21 10 15.66 10\"></polyline><polyline points=\"8 8 3 14 12 14 11 22 16 16\"></polyline><line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\"></line>',\n ),\n createIcon('zap', '<polygon points=\"13 2 3 14 12 14 11 22 21 10 12 10 13 2\"></polygon>'),\n];\n","import { createIcon } from './library.js';\n\n/** 向左箭头 */\nexport const arrowLeft = createIcon('arrow-left', '<path d=\"M19 12H5\"/><path d=\"m12 19-7-7 7-7\"/>');\n","import { createIcon } from './library.js';\n\n/** 向右箭头 */\nexport const arrowRight = createIcon(\n 'arrow-right',\n '<path d=\"M5 12h14\"/><path d=\"m12 5 7 7-7 7\"/>',\n);\n","import { createIcon } from './library.js';\n\n/** 回到顶部(顶部横线 + 上箭头,vertical-align-top 风格) */\nexport const arrowUp = createIcon(\n 'arrow-up',\n '<path d=\"M12 19V5\"/><path d=\"m5 12 7-7 7 7\"/><path d=\"M5 4h14\"/>',\n);\n","import { createIcon } from './library.js';\n\n/** 日历(日期选择器用) */\nexport const calendar = createIcon(\n 'calendar',\n '<rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"/><path d=\"M16 2v4\"/><path d=\"M8 2v4\"/><path d=\"M3 10h18\"/>',\n);\n","import { createIcon } from './library.js';\n\n/** 对勾 */\nexport const check = createIcon('check', '<polyline points=\"20 6 9 17 4 12\"/>');\n","import { createIcon } from './library.js';\n\n/** 下箭头(下拉展开) */\nexport const chevronDown = createIcon('chevron-down', '<path d=\"m6 9 6 6 6-6\"/>');\n","import { createIcon } from './library.js';\n\n/** 左箭头 */\nexport const chevronLeft = createIcon('chevron-left', '<path d=\"m15 18-6-6 6-6\"/>');\n","import { createIcon } from './library.js';\n\n/** 右箭头 */\nexport const chevronRight = createIcon('chevron-right', '<path d=\"m9 18 6-6-6-6\"/>');\n","import { createIcon } from './library.js';\n\n/** 上箭头(收起) */\nexport const chevronUp = createIcon('chevron-up', '<path d=\"m18 15-6-6-6 6\"/>');\n","import { createIcon } from './library.js';\n\n/** 关闭/叉号 */\nexport const close = createIcon('close', '<path d=\"M18 6 6 18\"/><path d=\"m6 6 12 12\"/>');\n","import { createIcon } from './library.js';\n\n/** 错误圆叉 */\nexport const error = createIcon(\n 'error',\n '<circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\"/><line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\"/>',\n);\n","import { createIcon } from './library.js';\n\nexport const file = createIcon(\n 'file',\n '<path d=\"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\"/><path d=\"M14 2v4a2 2 0 0 0 2 2h4\"/>',\n);\n","import { createIcon } from './library.js';\n\nexport const imageOff = createIcon(\n 'image-off',\n '<path d=\"m2 2 20 20\"/><path d=\"M10.41 10.17a2 2 0 0 1-2.24 2.24\"/><path d=\"M21 15V5a2 2 0 0 0-2-2H7\"/><path d=\"M3.59 3.59A2 2 0 0 0 3 5v14a2 2 0 0 0 2 2h14a2 2 0 0 0 1.41-.59\"/><path d=\"m21 15-5-5L5 21\"/>',\n);\n","import { createIcon } from './library.js';\n\n/** 信息提示 */\nexport const info = createIcon(\n 'info',\n '<circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"/><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"/>',\n);\n","import { createIcon } from './library.js';\n\n/** 加载圈(配合 wc-icon spin 属性旋转) */\nexport const loader = createIcon('loader', '<path d=\"M21 12a9 9 0 1 1-6.219-8.56\"/>');\n","import { createIcon } from './library.js';\n\n/** 减号 */\nexport const minus = createIcon('minus', '<path d=\"M5 12h14\"/>');\n","import { createIcon } from './library.js';\n\n/** 加号 */\nexport const plus = createIcon('plus', '<path d=\"M5 12h14\"/><path d=\"M12 5v14\"/>');\n","import { createIcon } from './library.js';\n\nexport const rotateCw = createIcon(\n 'rotate-cw',\n '<path d=\"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8\"/><path d=\"M21 3v5h-5\"/>',\n);\n","import { createIcon } from './library.js';\n\n/** 搜索/放大镜 */\nexport const search = createIcon(\n 'search',\n '<circle cx=\"11\" cy=\"11\" r=\"8\"/><path d=\"m21 21-4.3-4.3\"/>',\n);\n","import { createIcon } from './library.js';\n\nexport const upload = createIcon(\n 'upload',\n '<path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"/><polyline points=\"17 8 12 3 7 8\"/><line x1=\"12\" x2=\"12\" y1=\"3\" y2=\"15\"/>',\n);\n","import { createIcon } from './library.js';\n\n/** 警告三角 */\nexport const warning = createIcon(\n 'warning',\n '<path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"/><line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"/><line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"/>',\n);\n","import { createIcon } from './library.js';\n\nexport const zoomIn = createIcon(\n 'zoom-in',\n '<circle cx=\"11\" cy=\"11\" r=\"8\"/><path d=\"m21 21-4.35-4.35\"/><path d=\"M11 8v6\"/><path d=\"M8 11h6\"/>',\n);\n","import { createIcon } from './library.js';\n\nexport const zoomOut = createIcon(\n 'zoom-out',\n '<circle cx=\"11\" cy=\"11\" r=\"8\"/><path d=\"m21 21-4.35-4.35\"/><path d=\"M8 11h6\"/>',\n);\n","import { registerIcon } from './library.js';\nimport type { WcIconData } from './library.js';\nimport { featherIcons } from './feather-icons.js';\nimport { arrowLeft } from './arrow-left.js';\nimport { arrowRight } from './arrow-right.js';\nimport { arrowUp } from './arrow-up.js';\nimport { calendar } from './calendar.js';\nimport { check } from './check.js';\nimport { chevronDown } from './chevron-down.js';\nimport { chevronLeft } from './chevron-left.js';\nimport { chevronRight } from './chevron-right.js';\nimport { chevronUp } from './chevron-up.js';\nimport { close } from './close.js';\nimport { error } from './error.js';\nimport { file } from './file.js';\nimport { imageOff } from './image-off.js';\nimport { info } from './info.js';\nimport { loader } from './loader.js';\nimport { minus } from './minus.js';\nimport { plus } from './plus.js';\nimport { rotateCw } from './rotate-cw.js';\nimport { search } from './search.js';\nimport { upload } from './upload.js';\nimport { warning } from './warning.js';\nimport { zoomIn } from './zoom-in.js';\nimport { zoomOut } from './zoom-out.js';\n\nexport type { WcIconData } from './library.js';\nexport * from './library.js';\n\nexport { arrowLeft } from './arrow-left.js';\nexport { arrowRight } from './arrow-right.js';\nexport { arrowUp } from './arrow-up.js';\nexport { calendar } from './calendar.js';\nexport { check } from './check.js';\nexport { chevronDown } from './chevron-down.js';\nexport { chevronLeft } from './chevron-left.js';\nexport { chevronRight } from './chevron-right.js';\nexport { chevronUp } from './chevron-up.js';\nexport { close } from './close.js';\nexport { error } from './error.js';\nexport { file } from './file.js';\nexport { imageOff } from './image-off.js';\nexport { info } from './info.js';\nexport { loader } from './loader.js';\nexport { minus } from './minus.js';\nexport { plus } from './plus.js';\nexport { rotateCw } from './rotate-cw.js';\nexport { search } from './search.js';\nexport { upload } from './upload.js';\nexport { warning } from './warning.js';\nexport { zoomIn } from './zoom-in.js';\nexport { zoomOut } from './zoom-out.js';\n\n/** 手挑内置图标(组件内部依赖 + 高频图标;与 Feather 全集重名时以这些为准) */\nexport const builtinIcons: WcIconData[] = [\n arrowLeft,\n arrowRight,\n arrowUp,\n calendar,\n check,\n chevronDown,\n chevronLeft,\n chevronRight,\n chevronUp,\n close,\n error,\n file,\n imageOff,\n info,\n loader,\n minus,\n plus,\n rotateCw,\n search,\n upload,\n warning,\n zoomIn,\n zoomOut,\n];\n\n/** Feather 全集中与手挑重名的名称(registerBuiltinIcons 剔除,避免覆盖手挑版本) */\nconst preferredNames = new Set(builtinIcons.map((icon) => icon.name));\n\n/** 全部内置图标 = 手挑优先版 + Feather 全集其余,供 registerBuiltinIcons 批量注册 */\nexport const builtinIconsWithFeather: WcIconData[] = [\n ...builtinIcons,\n ...featherIcons.filter((icon) => !preferredNames.has(icon.name)),\n];\n\n/**\n * 批量注册全部内置图标(手挑 23 个 + Feather 其余 268 个 = 291 个)。\n * 应用入口调用一次即可;也可以从各图标文件单独 import + registerIcon 按需注册。\n */\nexport function registerBuiltinIcons(): void {\n for (const icon of builtinIconsWithFeather) {\n registerIcon(icon.name, icon.svg);\n }\n}\n","/**\n * 主题切换控制:通过 documentElement 上的 data-theme 属性驱动 tokens.css\n * 的 semantic 层覆盖(见 RULES.md 第 5 条)。\n *\n * @example\n * setTheme('dark'); // 手动切暗色\n * setTheme('auto', { persist: true }); // 跟随系统并写入 localStorage\n * initTheme(); // 应用启动时恢复持久化主题\n */\n\nexport type WcTheme = 'light' | 'dark' | 'auto';\n\n/** 主题变更事件名,detail 携带实际生效主题(light | dark) */\nexport const THEME_CHANGE_EVENT = 'wc-theme-change';\n\nconst STORAGE_KEY = 'wc-theme';\n\nlet currentTheme: WcTheme = 'light';\nlet mediaQuery: MediaQueryList | null = null;\n\nfunction getSystemTheme(): 'light' | 'dark' {\n if (typeof window !== 'undefined' && typeof window.matchMedia === 'function') {\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n }\n return 'light';\n}\n\n/** 实际生效的主题('auto' 解析为系统偏好) */\nexport function getEffectiveTheme(): 'light' | 'dark' {\n return currentTheme === 'auto' ? getSystemTheme() : currentTheme;\n}\n\nexport function getTheme(): WcTheme {\n return currentTheme;\n}\n\n/**\n * 设置主题。\n * @param theme 'light' | 'dark' | 'auto'(跟随系统 prefers-color-scheme)\n * @param options.persist 为 true 时写入 localStorage,配合 initTheme() 恢复\n */\nexport function setTheme(theme: WcTheme, options?: { persist?: boolean }): void {\n if (theme !== 'light' && theme !== 'dark' && theme !== 'auto') {\n throw new Error(`[wc] 无效主题: \"${String(theme)}\",可选 light | dark | auto`);\n }\n currentTheme = theme;\n\n if (typeof localStorage !== 'undefined') {\n if (options?.persist) {\n localStorage.setItem(STORAGE_KEY, theme);\n } else {\n localStorage.removeItem(STORAGE_KEY);\n }\n }\n\n syncAutoListener();\n applyTheme();\n}\n\n/** 应用启动时调用:恢复 localStorage 中持久化的主题(无记录则跟随系统) */\nexport function initTheme(): void {\n let stored: string | null = null;\n if (typeof localStorage !== 'undefined') {\n stored = localStorage.getItem(STORAGE_KEY);\n }\n setTheme(stored === 'light' || stored === 'dark' || stored === 'auto' ? stored : 'auto');\n}\n\nfunction syncAutoListener(): void {\n const shouldListen = currentTheme === 'auto' && typeof window.matchMedia === 'function';\n if (shouldListen && !mediaQuery) {\n mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n mediaQuery.addEventListener('change', applyTheme);\n } else if (!shouldListen && mediaQuery) {\n mediaQuery.removeEventListener('change', applyTheme);\n mediaQuery = null;\n }\n}\n\nfunction applyTheme(): void {\n const effective = getEffectiveTheme();\n if (typeof document !== 'undefined') {\n document.documentElement.dataset.theme = effective;\n }\n document.dispatchEvent(\n new CustomEvent(THEME_CHANGE_EVENT, {\n detail: { theme: currentTheme, effective },\n bubbles: true,\n composed: true,\n }),\n );\n}\n"],"names":["baseStyles","css","registry","libraries","cache","registerListeners","onIconRegister","cb","notifyRegister","registerIcon","name","svg","getIcon","registerIconLibrary","library","getIconLibrary","createIcon","content","viewBox","resolveIcon","libraryName","iconName","cacheKey","pending","err","raw","iconStyles","_WcIcon","LitElement","changed","requestId","unwatch","url","res","html","nothing","unsafeSVG","WcIcon","__decorateClass","property","state","buttonStyles","_wcButton","button","rect","diameter","cx","cy","span","icon","nodes","n","wcButton","buttonGroupStyles","_wcButtonGroup","els","i","wcButtonGroup","FormAssociatedMixin","Base","_FormAssociatedElement","args","_v","FormAssociatedElement","enUS","zhCN","LANGUAGE_CHANGE_EVENT","currentLocale","registerLocale","translations","existing","dispatchLanguageChange","setLocale","getLocale","resolveLocale","base","key","getTerm","localeName","vars","messages","fallback","text","match","varName","getRegisteredLocales","LocalizeController","host","value","options","localeOverride","formatOptions","lang","inputStyles","_wcInput","v","old","target","showClear","wcInput","textareaStyles","_wcTextarea","ta","wcTextarea","checkboxStyles","_wcCheckbox","input","wcCheckbox","radioStyles","_wcRadio","wcRadio","switchStyles","_wcSwitch","wcSwitch","optionStyles","_wcOption","wcOption","selectStyles","_wcSelect","opt","o","el","selectedIdx","active","activeOption","activeId","e","wcSelect","sliderStyles","_wcSlider","stepped","fixed","attr","wcSlider","inputNumberStyles","_wcInputNumber","direction","next","parsed","stepBtn","dir","increment","inner","wcInputNumber","datePickerStyles","pad2","formatDate","d","parseDate","iso","m","addDays","days","_wcDatePicker","year","month","y","startOffset","start","todayIso","cells","_","cell","delta","rows","w","row","c","wcDatePicker","formStyles","_wcForm","type","item","errors","message","firstError","result","control","wcForm","_wcFormItem","rules","rule","failed","fail","empty","wcFormItem","dividerStyles","_wcDivider","wcDivider","tagStyles","_wcTag","wcTag","avatarStyles","PRESET_SIZES","_wcAvatar","size","wcAvatar","spaceStyles","_wcSpace","preset","wcSpace","layoutStyles","_wcRow","wcRow","_wcCol","wcCol","typographyStyles","_wcText","level","wcText","MODAL_SELECTOR","OverlaySideEffects","hooks","count","focusables","first","last","dialogStyles","_wcDialog","reason","wcDialog","drawerStyles","_wcDrawer","wcDrawer","messageStyles","THEME_ICONS","_wcMessage","wcMessage","container","ensureContainer","zIndex","showMessage","POSITION_GAP","ARROW_INSET","splitPlacement","placement","index","oppositeBase","fitsOnSide","anchor","panel","viewport","clamp","min","max","computePosition","preferred","align","useBase","alignStart","alignEnd","x","alignCross","anchorStart","anchorSize","panelSize","anchorCrossCenter","maxOffset","arrowOffset","tooltipStyles","SHOW_DELAY","HIDE_DELAY","tooltipUid","_wcTooltip","panelRect","wcTooltip","popconfirmStyles","popconfirmUid","_wcPopconfirm","wcPopconfirm","dropdownItemStyles","_wcDropdownItem","wcDropdownItem","dropdownStyles","dropdownUid","_wcDropdown","wasOpen","activeItem","wcDropdown","splitButtonStyles","_wcSplitButton","child","wcSplitButton","floatButtonStyles","floatButtonUid","_wcFloatButton","tip","tipRect","badgeVisible","effectiveIcon","fab","wcFloatButton","floatButtonGroupStyles","_wcFloatButtonGroup","slot","wcFloatButtonGroup","tabsStyles","tabStyles","_wcTab","wcTab","_wcTabs","children","element","t","tab","selectable","currentIndex","escaped","wcTabs","breadcrumbStyles","_wcBreadcrumb","isLast","wcBreadcrumb","wcBreadcrumbItem","paginationStyles","_wcPagination","page","clamped","previous","pageCount","folded","end","items","prevDisabled","nextDisabled","wcPagination","badgeStyles","_wcBadge","visible","wcBadge","emptyStyles","_wcEmpty","wcEmpty","progressStyles","CIRCLE_RADIUS","CIRCLE_CIRCUMFERENCE","_wcProgress","wcProgress","cardStyles","_wcCard","has","showHeader","wcCard","listStyles","_wcList","wcList","_wcListItem","wcListItem","tableStyles","_wcTable","a","b","va","vb","col","cycle","rendered","isSorted","hasData","wcTable","imageStyles","SCALE_MIN","SCALE_MAX","SCALE_STEP","_wcImage","entries","effectivePreviewSrc","wcImage","uploadStyles","_wcUpload","xhr","file","list","incoming","allowed","remaining","rejected","percent","response","form","patch","f","wcUpload","featherIcons","arrowLeft","arrowRight","arrowUp","calendar","check","chevronDown","chevronLeft","chevronRight","chevronUp","close","error","imageOff","info","loader","minus","plus","rotateCw","search","upload","warning","zoomIn","zoomOut","builtinIcons","preferredNames","builtinIconsWithFeather","registerBuiltinIcons","THEME_CHANGE_EVENT","STORAGE_KEY","currentTheme","mediaQuery","getSystemTheme","getEffectiveTheme","getTheme","setTheme","theme","syncAutoListener","applyTheme","initTheme","stored","shouldListen","effective"],"mappings":"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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;ACsBrB,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AA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA,EAAW,YAAY,qEAAqE;AAAA,EAC5FA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,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CA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA,EAAW,QAAQ,mEAAmE;AAAA,EACtFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA;AAAA,IACE;AAAA,IACA;AAAA,EAAA;AAAA,EAEFA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"}