@humuchen/mac-ui 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +940 -0
- package/dist/favicon.svg +1 -0
- package/dist/mac-ui.cjs.js +12367 -0
- package/dist/mac-ui.cjs.js.map +1 -0
- package/dist/mac-ui.es.js +18444 -0
- package/dist/mac-ui.es.js.map +1 -0
- package/dist/mac-ui.umd.js +12367 -0
- package/dist/mac-ui.umd.js.map +1 -0
- package/dist/types/components/alert/index.d.ts +1 -0
- package/dist/types/components/alert/mac-alert.d.ts +38 -0
- package/dist/types/components/alert/mac-alert.stories.d.ts +15 -0
- package/dist/types/components/animation/animations.d.ts +97 -0
- package/dist/types/components/animation/index.d.ts +3 -0
- package/dist/types/components/animation/mac-animation.d.ts +67 -0
- package/dist/types/components/animation/mac-animation.stories.d.ts +9 -0
- package/dist/types/components/button/index.d.ts +1 -0
- package/dist/types/components/button/mac-button.d.ts +37 -0
- package/dist/types/components/button/mac-button.stories.d.ts +14 -0
- package/dist/types/components/card/index.d.ts +1 -0
- package/dist/types/components/card/mac-card.d.ts +38 -0
- package/dist/types/components/card/mac-card.stories.d.ts +14 -0
- package/dist/types/components/carousel/index.d.ts +1 -0
- package/dist/types/components/carousel/mac-carousel.d.ts +105 -0
- package/dist/types/components/carousel/mac-carousel.stories.d.ts +18 -0
- package/dist/types/components/checkbox/index.d.ts +2 -0
- package/dist/types/components/checkbox/mac-checkbox.d.ts +94 -0
- package/dist/types/components/checkbox/mac-checkbox.stories.d.ts +17 -0
- package/dist/types/components/config-provider/index.d.ts +1 -0
- package/dist/types/components/config-provider/mac-config-provider.d.ts +23 -0
- package/dist/types/components/config-provider/mac-config-provider.stories.d.ts +12 -0
- package/dist/types/components/confirm/index.d.ts +2 -0
- package/dist/types/components/confirm/mac-confirm.d.ts +86 -0
- package/dist/types/components/confirm/mac-confirm.stories.d.ts +15 -0
- package/dist/types/components/data-table/index.d.ts +2 -0
- package/dist/types/components/data-table/mac-data-table.d.ts +212 -0
- package/dist/types/components/data-table/mac-data-table.stories.d.ts +18 -0
- package/dist/types/components/date-picker/date-picker-utils.d.ts +13 -0
- package/dist/types/components/date-picker/index.d.ts +3 -0
- package/dist/types/components/date-picker/mac-date-picker.d.ts +72 -0
- package/dist/types/components/date-picker/mac-date-picker.stories.d.ts +28 -0
- package/dist/types/components/date-picker/mac-date-range-picker.d.ts +58 -0
- package/dist/types/components/date-picker/mac-date-range-picker.stories.d.ts +13 -0
- package/dist/types/components/descriptions/mac-descriptions.d.ts +99 -0
- package/dist/types/components/descriptions/mac-descriptions.stories.d.ts +21 -0
- package/dist/types/components/desktop/index.d.ts +2 -0
- package/dist/types/components/desktop/mac-desktop.d.ts +88 -0
- package/dist/types/components/desktop/mac-desktop.stories.d.ts +17 -0
- package/dist/types/components/desktop-icon/index.d.ts +1 -0
- package/dist/types/components/desktop-icon/mac-desktop-icon.d.ts +46 -0
- package/dist/types/components/desktop-icon/mac-desktop-icon.stories.d.ts +8 -0
- package/dist/types/components/dock/index.d.ts +2 -0
- package/dist/types/components/dock/mac-dock-item.d.ts +37 -0
- package/dist/types/components/dock/mac-dock.d.ts +74 -0
- package/dist/types/components/dock/mac-dock.stories.d.ts +13 -0
- package/dist/types/components/drawer/mac-drawer.d.ts +87 -0
- package/dist/types/components/drawer/mac-drawer.stories.d.ts +15 -0
- package/dist/types/components/dropdown/index.d.ts +2 -0
- package/dist/types/components/dropdown/mac-dropdown.d.ts +77 -0
- package/dist/types/components/dropdown/mac-dropdown.stories.d.ts +13 -0
- package/dist/types/components/dynamic-tags/index.d.ts +1 -0
- package/dist/types/components/dynamic-tags/mac-dynamic-tags.d.ts +64 -0
- package/dist/types/components/dynamic-tags/mac-dynamic-tags.stories.d.ts +16 -0
- package/dist/types/components/form/index.d.ts +3 -0
- package/dist/types/components/form/mac-form-item.d.ts +67 -0
- package/dist/types/components/form/mac-form.d.ts +64 -0
- package/dist/types/components/form/mac-form.stories.d.ts +18 -0
- package/dist/types/components/group-button/index.d.ts +2 -0
- package/dist/types/components/group-button/mac-group-button.d.ts +50 -0
- package/dist/types/components/group-button/mac-group-button.stories.d.ts +13 -0
- package/dist/types/components/infinite-scroll/index.d.ts +1 -0
- package/dist/types/components/infinite-scroll/mac-infinite-scroll.d.ts +57 -0
- package/dist/types/components/infinite-scroll/mac-infinite-scroll.stories.d.ts +11 -0
- package/dist/types/components/input/index.d.ts +1 -0
- package/dist/types/components/input/mac-input.d.ts +73 -0
- package/dist/types/components/input/mac-input.stories.d.ts +19 -0
- package/dist/types/components/input-number/index.d.ts +1 -0
- package/dist/types/components/input-number/mac-input-number.d.ts +81 -0
- package/dist/types/components/input-number/mac-input-number.stories.d.ts +18 -0
- package/dist/types/components/lazy-image/index.d.ts +1 -0
- package/dist/types/components/lazy-image/mac-lazy-image.d.ts +86 -0
- package/dist/types/components/lazy-image/mac-lazy-image.stories.d.ts +15 -0
- package/dist/types/components/menu/index.d.ts +2 -0
- package/dist/types/components/menu/mac-menu.d.ts +63 -0
- package/dist/types/components/menu/mac-menu.stories.d.ts +11 -0
- package/dist/types/components/modal/index.d.ts +1 -0
- package/dist/types/components/modal/mac-modal.d.ts +96 -0
- package/dist/types/components/modal/mac-modal.stories.d.ts +12 -0
- package/dist/types/components/number-animation/mac-number-animation.d.ts +64 -0
- package/dist/types/components/number-animation/mac-number-animation.stories.d.ts +15 -0
- package/dist/types/components/popconfirm/mac-popconfirm.d.ts +77 -0
- package/dist/types/components/popconfirm/mac-popconfirm.stories.d.ts +14 -0
- package/dist/types/components/progress/index.d.ts +1 -0
- package/dist/types/components/progress/mac-progress.d.ts +76 -0
- package/dist/types/components/progress/mac-progress.stories.d.ts +25 -0
- package/dist/types/components/radio/index.d.ts +2 -0
- package/dist/types/components/radio/mac-radio.d.ts +90 -0
- package/dist/types/components/radio/mac-radio.stories.d.ts +17 -0
- package/dist/types/components/rating/mac-rating.d.ts +56 -0
- package/dist/types/components/rating/mac-rating.stories.d.ts +15 -0
- package/dist/types/components/select/index.d.ts +1 -0
- package/dist/types/components/select/mac-select.d.ts +97 -0
- package/dist/types/components/select/mac-select.stories.d.ts +18 -0
- package/dist/types/components/split/index.d.ts +1 -0
- package/dist/types/components/split/mac-split.d.ts +69 -0
- package/dist/types/components/split/mac-split.stories.d.ts +13 -0
- package/dist/types/components/tabs/mac-tabs.d.ts +119 -0
- package/dist/types/components/tabs/mac-tabs.stories.d.ts +15 -0
- package/dist/types/components/tag/index.d.ts +1 -0
- package/dist/types/components/tag/mac-tag.d.ts +40 -0
- package/dist/types/components/tag/mac-tag.stories.d.ts +20 -0
- package/dist/types/components/text-ellipsis/mac-text-ellipsis.d.ts +47 -0
- package/dist/types/components/text-ellipsis/mac-text-ellipsis.stories.d.ts +15 -0
- package/dist/types/components/tree/index.d.ts +2 -0
- package/dist/types/components/tree/mac-tree.d.ts +79 -0
- package/dist/types/components/tree/mac-tree.stories.d.ts +12 -0
- package/dist/types/components/tree-select/index.d.ts +2 -0
- package/dist/types/components/tree-select/mac-tree-select.d.ts +59 -0
- package/dist/types/components/tree-select/mac-tree-select.stories.d.ts +19 -0
- package/dist/types/internal/base-element.d.ts +18 -0
- package/dist/types/internal/property-converters.d.ts +7 -0
- package/dist/types/mac-ui.d.ts +60 -0
- package/dist/types/styles/shared-styles.d.ts +2 -0
- package/dist/types/styles/theme.d.ts +11 -0
- package/dist/types/test/setup.d.ts +1 -0
- package/package.json +86 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mac-ui.es.js","names":["t","t","e","s","o","n","r","i","S","c","i","e","h","r","o","n","a","c","l","p","d","u","f","b","y","t","s","o","e","t","r","n","r","t","e","e","t","e","r","t","t","i","e","o","e","s","t","r","t"],"sources":["../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/decorators/custom-element.js","../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/css-tag.js","../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/reactive-element.js","../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/decorators/property.js","../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/decorators/state.js","../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/decorators/base.js","../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/decorators/query.js","../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/decorators/query-all.js","../src/internal/base-element.ts","../src/components/config-provider/mac-config-provider.ts","../src/styles/shared-styles.ts","../src/styles/theme.ts","../src/components/button/mac-button.ts","../src/components/card/mac-card.ts","../src/components/input/mac-input.ts","../src/internal/property-converters.ts","../src/components/input-number/mac-input-number.ts","../src/components/form/mac-form.ts","../src/components/form/mac-form-item.ts","../src/components/radio/mac-radio.ts","../src/components/checkbox/mac-checkbox.ts","../src/components/date-picker/date-picker-utils.ts","../src/components/date-picker/mac-date-picker.ts","../src/components/date-picker/mac-date-range-picker.ts","../src/components/select/mac-select.ts","../src/components/tree-select/mac-tree-select.ts","../src/components/tree/mac-tree.ts","../src/components/desktop-icon/mac-desktop-icon.ts","../src/components/desktop/mac-desktop.ts","../src/components/dock/mac-dock-item.ts","../src/components/dock/mac-dock.ts","../src/components/modal/mac-modal.ts","../src/components/confirm/mac-confirm.ts","../src/components/group-button/mac-group-button.ts","../src/components/dropdown/mac-dropdown.ts","../src/components/menu/mac-menu.ts","../src/components/text-ellipsis/mac-text-ellipsis.ts","../src/components/rating/mac-rating.ts","../src/components/descriptions/mac-descriptions.ts","../src/components/number-animation/mac-number-animation.ts","../src/components/tabs/mac-tabs.ts","../src/components/drawer/mac-drawer.ts","../src/components/popconfirm/mac-popconfirm.ts","../src/components/split/mac-split.ts","../src/components/lazy-image/mac-lazy-image.ts","../src/components/infinite-scroll/mac-infinite-scroll.ts","../src/components/tag/mac-tag.ts","../src/components/dynamic-tags/mac-dynamic-tags.ts","../src/components/carousel/mac-carousel.ts","../src/components/progress/mac-progress.ts","../src/components/alert/mac-alert.ts","../src/components/animation/animations.ts","../src/components/animation/mac-animation.ts","../node_modules/.pnpm/lit-html@3.3.3/node_modules/lit-html/lit-html.js","../node_modules/.pnpm/lit-html@3.3.3/node_modules/lit-html/directive.js","../node_modules/.pnpm/lit-html@3.3.3/node_modules/lit-html/directives/class-map.js","../node_modules/.pnpm/lit-html@3.3.3/node_modules/lit-html/directives/if-defined.js","../src/components/data-table/mac-data-table.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=t=>(e,o)=>{void 0!==o?o.addInitializer(()=>{customElements.define(t,e)}):customElements.define(t,e)};export{t as customElement};\n//# sourceMappingURL=custom-element.js.map\n","/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow)&&\"adoptedStyleSheets\"in Document.prototype&&\"replace\"in CSSStyleSheet.prototype,s=Symbol(),o=new WeakMap;class n{constructor(t,e,o){if(this._$cssResult$=!0,o!==s)throw Error(\"CSSResult is not constructable. Use `unsafeCSS` or `css` instead.\");this.cssText=t,this.t=e}get styleSheet(){let t=this.o;const s=this.t;if(e&&void 0===t){const e=void 0!==s&&1===s.length;e&&(t=o.get(s)),void 0===t&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),e&&o.set(s,t))}return t}toString(){return this.cssText}}const r=t=>new n(\"string\"==typeof t?t:t+\"\",void 0,s),i=(t,...e)=>{const o=1===t.length?t[0]:e.reduce((e,s,o)=>e+(t=>{if(!0===t._$cssResult$)return t.cssText;if(\"number\"==typeof t)return t;throw Error(\"Value passed to 'css' function must be a 'css' function result: \"+t+\". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.\")})(s)+t[o+1],t[0]);return new n(o,t,s)},S=(s,o)=>{if(e)s.adoptedStyleSheets=o.map(t=>t instanceof CSSStyleSheet?t:t.styleSheet);else for(const e of o){const o=document.createElement(\"style\"),n=t.litNonce;void 0!==n&&o.setAttribute(\"nonce\",n),o.textContent=e.cssText,s.appendChild(o)}},c=e?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e=\"\";for(const s of t.cssRules)e+=s.cssText;return r(e)})(t):t;export{n as CSSResult,S as adoptStyles,i as css,c as getCompatibleStyle,e as supportsAdoptingStyleSheets,r as unsafeCSS};\n//# sourceMappingURL=css-tag.js.map\n","import{getCompatibleStyle as t,adoptStyles as s}from\"./css-tag.js\";export{CSSResult,css,supportsAdoptingStyleSheets,unsafeCSS}from\"./css-tag.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const{is:i,defineProperty:e,getOwnPropertyDescriptor:h,getOwnPropertyNames:r,getOwnPropertySymbols:o,getPrototypeOf:n}=Object,a=globalThis,c=a.trustedTypes,l=c?c.emptyScript:\"\",p=a.reactiveElementPolyfillSupport,d=(t,s)=>t,u={toAttribute(t,s){switch(s){case Boolean:t=t?l:null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,s){let i=t;switch(s){case Boolean:i=null!==t;break;case Number:i=null===t?null:Number(t);break;case Object:case Array:try{i=JSON.parse(t)}catch(t){i=null}}return i}},f=(t,s)=>!i(t,s),b={attribute:!0,type:String,converter:u,reflect:!1,useDefault:!1,hasChanged:f};Symbol.metadata??=Symbol(\"metadata\"),a.litPropertyMetadata??=new WeakMap;class y extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,s=b){if(s.state&&(s.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(t)&&((s=Object.create(s)).wrapped=!0),this.elementProperties.set(t,s),!s.noAccessor){const i=Symbol(),h=this.getPropertyDescriptor(t,i,s);void 0!==h&&e(this.prototype,t,h)}}static getPropertyDescriptor(t,s,i){const{get:e,set:r}=h(this.prototype,t)??{get(){return this[s]},set(t){this[s]=t}};return{get:e,set(s){const h=e?.call(this);r?.call(this,s),this.requestUpdate(t,h,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??b}static _$Ei(){if(this.hasOwnProperty(d(\"elementProperties\")))return;const t=n(this);t.finalize(),void 0!==t.l&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(d(\"finalized\")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(d(\"properties\"))){const t=this.properties,s=[...r(t),...o(t)];for(const i of s)this.createProperty(i,t[i])}const t=this[Symbol.metadata];if(null!==t){const s=litPropertyMetadata.get(t);if(void 0!==s)for(const[t,i]of s)this.elementProperties.set(t,i)}this._$Eh=new Map;for(const[t,s]of this.elementProperties){const i=this._$Eu(t,s);void 0!==i&&this._$Eh.set(i,t)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(s){const i=[];if(Array.isArray(s)){const e=new Set(s.flat(1/0).reverse());for(const s of e)i.unshift(t(s))}else void 0!==s&&i.push(t(s));return i}static _$Eu(t,s){const i=s.attribute;return!1===i?void 0:\"string\"==typeof i?i:\"string\"==typeof t?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(t=>this.enableUpdating=t),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(t=>t(this))}addController(t){(this._$EO??=new Set).add(t),void 0!==this.renderRoot&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){const t=new Map,s=this.constructor.elementProperties;for(const i of s.keys())this.hasOwnProperty(i)&&(t.set(i,this[i]),delete this[i]);t.size>0&&(this._$Ep=t)}createRenderRoot(){const t=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return s(t,this.constructor.elementStyles),t}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(t=>t.hostConnected?.())}enableUpdating(t){}disconnectedCallback(){this._$EO?.forEach(t=>t.hostDisconnected?.())}attributeChangedCallback(t,s,i){this._$AK(t,i)}_$ET(t,s){const i=this.constructor.elementProperties.get(t),e=this.constructor._$Eu(t,i);if(void 0!==e&&!0===i.reflect){const h=(void 0!==i.converter?.toAttribute?i.converter:u).toAttribute(s,i.type);this._$Em=t,null==h?this.removeAttribute(e):this.setAttribute(e,h),this._$Em=null}}_$AK(t,s){const i=this.constructor,e=i._$Eh.get(t);if(void 0!==e&&this._$Em!==e){const t=i.getPropertyOptions(e),h=\"function\"==typeof t.converter?{fromAttribute:t.converter}:void 0!==t.converter?.fromAttribute?t.converter:u;this._$Em=e;const r=h.fromAttribute(s,t.type);this[e]=r??this._$Ej?.get(e)??r,this._$Em=null}}requestUpdate(t,s,i,e=!1,h){if(void 0!==t){const r=this.constructor;if(!1===e&&(h=this[t]),i??=r.getPropertyOptions(t),!((i.hasChanged??f)(h,s)||i.useDefault&&i.reflect&&h===this._$Ej?.get(t)&&!this.hasAttribute(r._$Eu(t,i))))return;this.C(t,s,i)}!1===this.isUpdatePending&&(this._$ES=this._$EP())}C(t,s,{useDefault:i,reflect:e,wrapped:h},r){i&&!(this._$Ej??=new Map).has(t)&&(this._$Ej.set(t,r??s??this[t]),!0!==h||void 0!==r)||(this._$AL.has(t)||(this.hasUpdated||i||(s=void 0),this._$AL.set(t,s)),!0===e&&this._$Em!==t&&(this._$Eq??=new Set).add(t))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(t){Promise.reject(t)}const t=this.scheduleUpdate();return null!=t&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(const[t,s]of this._$Ep)this[t]=s;this._$Ep=void 0}const t=this.constructor.elementProperties;if(t.size>0)for(const[s,i]of t){const{wrapped:t}=i,e=this[s];!0!==t||this._$AL.has(s)||void 0===e||this.C(s,void 0,i,e)}}let t=!1;const s=this._$AL;try{t=this.shouldUpdate(s),t?(this.willUpdate(s),this._$EO?.forEach(t=>t.hostUpdate?.()),this.update(s)):this._$EM()}catch(s){throw t=!1,this._$EM(),s}t&&this._$AE(s)}willUpdate(t){}_$AE(t){this._$EO?.forEach(t=>t.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(t){return!0}update(t){this._$Eq&&=this._$Eq.forEach(t=>this._$ET(t,this[t])),this._$EM()}updated(t){}firstUpdated(t){}}y.elementStyles=[],y.shadowRootOptions={mode:\"open\"},y[d(\"elementProperties\")]=new Map,y[d(\"finalized\")]=new Map,p?.({ReactiveElement:y}),(a.reactiveElementVersions??=[]).push(\"2.1.2\");export{y as ReactiveElement,s as adoptStyles,u as defaultConverter,t as getCompatibleStyle,f as notEqual};\n//# sourceMappingURL=reactive-element.js.map\n","import{notEqual as t,defaultConverter as e}from\"../reactive-element.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const o={attribute:!0,type:String,converter:e,reflect:!1,hasChanged:t},r=(t=o,e,r)=>{const{kind:n,metadata:i}=r;let s=globalThis.litPropertyMetadata.get(i);if(void 0===s&&globalThis.litPropertyMetadata.set(i,s=new Map),\"setter\"===n&&((t=Object.create(t)).wrapped=!0),s.set(r.name,t),\"accessor\"===n){const{name:o}=r;return{set(r){const n=e.get.call(this);e.set.call(this,r),this.requestUpdate(o,n,t,!0,r)},init(e){return void 0!==e&&this.C(o,void 0,t,e),e}}}if(\"setter\"===n){const{name:o}=r;return function(r){const n=this[o];e.call(this,r),this.requestUpdate(o,n,t,!0,r)}}throw Error(\"Unsupported decorator location: \"+n)};function n(t){return(e,o)=>\"object\"==typeof o?r(t,e,o):((t,e,o)=>{const r=e.hasOwnProperty(o);return e.constructor.createProperty(o,t),r?Object.getOwnPropertyDescriptor(e,o):void 0})(t,e,o)}export{n as property,r as standardProperty};\n//# sourceMappingURL=property.js.map\n","import{property as t}from\"./property.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */function r(r){return t({...r,state:!0,attribute:!1})}export{r as state};\n//# sourceMappingURL=state.js.map\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst e=(e,t,c)=>(c.configurable=!0,c.enumerable=!0,Reflect.decorate&&\"object\"!=typeof t&&Object.defineProperty(e,t,c),c);export{e as desc};\n//# sourceMappingURL=base.js.map\n","import{desc as t}from\"./base.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */function e(e,r){return(n,s,i)=>{const o=t=>t.renderRoot?.querySelector(e)??null;if(r){const{get:e,set:r}=\"object\"==typeof s?n:i??(()=>{const t=Symbol();return{get(){return this[t]},set(e){this[t]=e}}})();return t(n,s,{get(){let t=e.call(this);return void 0===t&&(t=o(this),(null!==t||this.hasUpdated)&&r.call(this,t)),t}})}return t(n,s,{get(){return o(this)}})}}export{e as query};\n//# sourceMappingURL=query.js.map\n","import{desc as t}from\"./base.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nlet e;function r(r){return(n,o)=>t(n,o,{get(){return(this.renderRoot??(e??=document.createDocumentFragment())).querySelectorAll(r)}})}export{r as queryAll};\n//# sourceMappingURL=query-all.js.map\n","import { LitElement, PropertyValues } from 'lit'\r\nimport { state, property } from 'lit/decorators.js'\r\n\r\nexport abstract class BaseElement extends LitElement {\r\n static override shadowRootOptions: ShadowRootInit = {\r\n mode: 'open',\r\n delegatesFocus: true,\r\n }\r\n\r\n /** Component-level theme override. Takes precedence over mac-config-provider. */\r\n @property({ reflect: true }) theme?: 'light' | 'dark'\r\n\r\n @state() private _globalSize?: 'sm' | 'md' | 'lg'\r\n @state() private _globalTheme?: 'light' | 'dark'\r\n\r\n private _configProvider: HTMLElement | null = null\r\n private _configObserver: MutationObserver | null = null\r\n\r\n override connectedCallback() {\r\n super.connectedCallback()\r\n this._configProvider = this._findConfigProvider()\r\n if (this._configProvider) {\r\n this._readConfigFromProvider()\r\n this._configObserver = new MutationObserver(() => this._readConfigFromProvider())\r\n this._configObserver.observe(this._configProvider, { attributes: true })\r\n }\r\n }\r\n\r\n override disconnectedCallback() {\r\n super.disconnectedCallback()\r\n if (this._configObserver) {\r\n this._configObserver.disconnect()\r\n this._configObserver = null\r\n }\r\n this._configProvider = null\r\n }\r\n\r\n private _findConfigProvider(): HTMLElement | null {\r\n // Walk the light-DOM ancestry; the element itself is the starting node.\r\n // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n let el: Element | null = this\r\n while (el) {\r\n if (el.tagName.toLowerCase() === 'mac-config-provider') {\r\n return el as HTMLElement\r\n }\r\n el = el.parentElement\r\n }\r\n return null\r\n }\r\n\r\n private _readConfigFromProvider() {\r\n if (!this._configProvider) return\r\n const size = this._configProvider.getAttribute('size') as 'sm' | 'md' | 'lg' | null\r\n const theme = this._configProvider.getAttribute('data-theme') as 'light' | 'dark' | null\r\n this._globalSize = size ?? undefined\r\n this._globalTheme = theme ?? undefined\r\n }\r\n\r\n protected get _resolvedSize(): 'sm' | 'md' | 'lg' {\r\n return (\r\n ((this as unknown as Record<string, unknown>).size as 'sm' | 'md' | 'lg' | undefined) ??\r\n this._globalSize ??\r\n 'md'\r\n )\r\n }\r\n\r\n protected get _resolvedTheme(): 'light' | 'dark' | undefined {\r\n return this.theme ?? this._globalTheme ?? undefined\r\n }\r\n\r\n override update(changedProperties: PropertyValues) {\r\n const theme = this._resolvedTheme\r\n if (theme) {\r\n this.setAttribute('data-theme', theme)\r\n } else {\r\n this.removeAttribute('data-theme')\r\n }\r\n super.update(changedProperties)\r\n }\r\n\r\n protected emit(name: string, options?: CustomEventInit): void {\r\n this.dispatchEvent(\r\n new CustomEvent(name, {\r\n bubbles: true,\r\n composed: true,\r\n ...options,\r\n }),\r\n )\r\n }\r\n}\r\n","import { html, css } from 'lit'\r\nimport { property, customElement } from 'lit/decorators.js'\r\nimport { BaseElement } from '../../internal/base-element'\r\n\r\n/**\r\n * @tag mac-config-provider\r\n * @summary 将主题和尺寸设置传递给子组件的配置提供者。\r\n *\r\n * @slot - 将继承配置的子组件。\r\n */\r\n@customElement('mac-config-provider')\r\nexport class MacConfigProvider extends BaseElement {\r\n static override styles = [\r\n css`\r\n :host {\r\n display: contents;\r\n }\r\n `,\r\n ]\r\n\r\n /** 全局主题:'light'、'dark' 或 'auto'(跟随系统偏好)。 */\r\n @property({ reflect: true }) theme: 'light' | 'dark' = 'light'\r\n\r\n /** 全局尺寸:'sm'、'md' 或 'lg'。 */\r\n @property({ reflect: true }) size: 'sm' | 'md' | 'lg' = 'md'\r\n\r\n override connectedCallback() {\r\n super.connectedCallback()\r\n this._updateDataAttributes()\r\n }\r\n\r\n override updated(changed: Map<string, unknown>) {\r\n if (changed.has('theme') || changed.has('size')) {\r\n this._updateDataAttributes()\r\n }\r\n }\r\n\r\n private _updateDataAttributes() {\r\n this.setAttribute('data-theme', this.theme)\r\n // if (this.theme === 'auto') {\r\n // this.removeAttribute('data-theme')\r\n // } else {\r\n // this.setAttribute('data-theme', this.theme)\r\n // }\r\n }\r\n\r\n override render() {\r\n return html`<slot></slot>`\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'mac-config-provider': MacConfigProvider\r\n }\r\n}\r\n","import { css, CSSResult } from 'lit'\r\n\r\nexport const sharedStyles: CSSResult = css`\r\n :host {\r\n box-sizing: border-box;\r\n /* 移动端触控优化:移除点击高亮(各组件可按需覆盖) */\r\n -webkit-tap-highlight-color: transparent;\r\n }\r\n\r\n :host *,\r\n :host *::before,\r\n :host *::after {\r\n box-sizing: border-box;\r\n }\r\n\r\n :host([hidden]) {\r\n display: none !important;\r\n }\r\n\r\n /* ═══════════════════════════════════════════════════════════════\r\n 响应式触控优化 —— 仅移动端生效,PC 端零影响\r\n ═══════════════════════════════════════════════════════════════ */\r\n @media (max-width: 768px) {\r\n :host {\r\n /* 支持刘海屏 / 异形屏安全区(配合 viewport-fit=cover) */\r\n --md-safe-area-top: env(safe-area-inset-top, 0px);\r\n --md-safe-area-bottom: env(safe-area-inset-bottom, 0px);\r\n --md-safe-area-left: env(safe-area-inset-left, 0px);\r\n --md-safe-area-right: env(safe-area-inset-right, 0px);\r\n }\r\n\r\n /* 交互元素:防止双击缩放、消除 300ms 延迟感 */\r\n :host([role='button']),\r\n :host(button),\r\n :host([data-touch]) {\r\n touch-action: manipulation;\r\n }\r\n }\r\n`\r\n","import { css, CSSResult } from 'lit'\r\n\r\n/**\r\n * Theme tokens following the naming convention:\r\n * --{size}-{component}-{part}-{state}\r\n *\r\n * size: sm | md | lg\r\n * component: button | input | select | dropdown | card | dialog | dock | glass | mac | icon | tooltip | text-shadow | magnify | indicator | separator | color | spacing | radius | font | transition | opacity\r\n * part: container | item | label | trigger | tag | shortcut | arrow | divider | separator | highlight | shadow | bg | border | padding | font-size\r\n * state: hover | active | focus | disabled | danger | error | success | dark (optional)\r\n */\r\nexport const themeTokens: CSSResult = css`\r\n :host {\r\n /* ═══════════════════════════════════════════════════\r\n 基础颜色 --{size}-color-{part}-{state}\r\n ═══════════════════════════════════════════════════ */\r\n --md-color-primary: #3b82f6;\r\n --md-color-primary-hover: #2563eb;\r\n --md-color-primary-active: #1d4ed8;\r\n --md-color-success: #22c55e;\r\n --md-color-warning: #f59e0b;\r\n --md-color-danger: #ef4444;\r\n --md-color-text: #1f2937;\r\n --md-color-text-secondary: #6b7280;\r\n --md-color-border: #d1d5db;\r\n --md-color-bg: #ffffff;\r\n --md-color-bg-secondary: #f9fafb;\r\n\r\n /* ═══════════════════════════════════════════════════\r\n 间距 --{size}-spacing-{part}\r\n ═══════════════════════════════════════════════════ */\r\n --md-spacing-xs: 4px;\r\n --md-spacing-sm: 8px;\r\n --md-spacing-md: 12px;\r\n --md-spacing-lg: 16px;\r\n --md-spacing-xl: 24px;\r\n --md-spacing-2xl: 48px;\r\n\r\n /* ═══════════════════════════════════════════════════\r\n 圆角 --{size}-radius-{part}\r\n ═══════════════════════════════════════════════════ */\r\n --md-radius-sm: 4px;\r\n --md-radius-md: 6px;\r\n --md-radius-lg: 8px;\r\n --md-radius-dock: 18px;\r\n --md-radius-menu: 10px;\r\n --md-radius-icon: 12px;\r\n --md-radius-icon-lg: 14px;\r\n\r\n /* ═══════════════════════════════════════════════════\r\n 字体 --{size}-font-{part}\r\n ═══════════════════════════════════════════════════ */\r\n --md-font-family:\r\n -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'Helvetica Neue', sans-serif;\r\n --md-font-size-xs: 11px;\r\n --md-font-size-sm: 12px;\r\n --md-font-size-menu: 13px;\r\n --md-font-size-base: 14px;\r\n --md-font-size-lg: 16px;\r\n --md-font-size-icon: 22px;\r\n --md-font-size-icon-lg: 24px;\r\n\r\n /* ═══════════════════════════════════════════════════\r\n 过渡 --{size}-transition-{part}\r\n ═══════════════════════════════════════════════════ */\r\n --md-transition-fast: 150ms ease;\r\n --md-transition-normal: 250ms ease;\r\n --md-transition-magnify: 180ms cubic-bezier(0.25, 0.46, 0.45, 0.94);\r\n --md-transition-menu: 80ms ease;\r\n --md-transition-drag: 200ms ease;\r\n\r\n /* ═══════════════════════════════════════════════════\r\n 透明度 --{size}-opacity-{part}\r\n ═══════════════════════════════════════════════════ */\r\n --md-opacity-hover: 0.06;\r\n --md-opacity-drag: 0.3;\r\n --md-opacity-shortcut: 0.5;\r\n --md-opacity-shortcut-hover: 0.7;\r\n --md-opacity-indicator: 0.7;\r\n\r\n /* ═══════════════════════════════════════════════════\r\n Button 按钮 --{size}-button-{part}-{state}\r\n ═══════════════════════════════════════════════════ */\r\n /* sm */\r\n --sm-button-padding-vertical: var(--md-spacing-xs);\r\n --sm-button-padding-horizontal: var(--md-spacing-sm);\r\n --sm-button-font-size: var(--md-font-size-sm);\r\n --sm-button-gap: var(--md-spacing-xs);\r\n --sm-button-radius: var(--md-radius-md);\r\n\r\n /* md (default) */\r\n --md-button-padding-vertical: var(--md-spacing-sm);\r\n --md-button-padding-horizontal: var(--md-spacing-lg);\r\n --md-button-font-size: var(--md-font-size-base);\r\n --md-button-gap: var(--md-spacing-xs);\r\n --md-button-radius: var(--md-radius-md);\r\n\r\n /* lg */\r\n --lg-button-padding-vertical: var(--md-spacing-md);\r\n --lg-button-padding-horizontal: var(--md-spacing-xl);\r\n --lg-button-font-size: var(--md-font-size-lg);\r\n --lg-button-gap: var(--md-spacing-sm);\r\n --lg-button-radius: var(--md-radius-md);\r\n\r\n /* ═══════════════════════════════════════════════════\r\n Input 输入框 --{size}-input-{part}-{state}\r\n ═══════════════════════════════════════════════════ */\r\n /* sm */\r\n --sm-input-padding-vertical: var(--md-spacing-xs);\r\n --sm-input-padding-horizontal: var(--md-spacing-sm);\r\n --sm-input-font-size: var(--md-font-size-sm);\r\n --sm-input-radius: var(--md-radius-md);\r\n\r\n /* md (default) */\r\n --md-input-padding-vertical: var(--md-spacing-sm);\r\n --md-input-padding-horizontal: var(--md-spacing-md);\r\n --md-input-font-size: var(--md-font-size-base);\r\n --md-input-radius: var(--md-radius-md);\r\n\r\n /* lg */\r\n --lg-input-padding-vertical: var(--md-spacing-md);\r\n --lg-input-padding-horizontal: var(--md-spacing-lg);\r\n --lg-input-font-size: var(--md-font-size-lg);\r\n --lg-input-radius: var(--md-radius-md);\r\n\r\n /* ═══════════════════════════════════════════════════\r\n Radio 单选框 --{size}-radio-{part}-{state}\r\n ═══════════════════════════════════════════════════ */\r\n /* sm */\r\n --sm-radio-size: 14px;\r\n --sm-radio-dot-size: 6px;\r\n --sm-radio-gap: 6px;\r\n --sm-radio-font-size: var(--md-font-size-sm);\r\n\r\n /* md (default) */\r\n --md-radio-size: 18px;\r\n --md-radio-dot-size: 8px;\r\n --md-radio-gap: 8px;\r\n --md-radio-font-size: var(--md-font-size-base);\r\n\r\n /* lg */\r\n --lg-radio-size: 22px;\r\n --lg-radio-dot-size: 10px;\r\n --lg-radio-gap: 10px;\r\n --lg-radio-font-size: var(--md-font-size-lg);\r\n\r\n /* radio 颜色 */\r\n --md-radio-bg: transparent;\r\n --md-radio-bg-active: var(--md-color-primary);\r\n --md-radio-border-color: var(--md-color-border);\r\n --md-radio-border-hover-color: var(--md-color-text-secondary);\r\n --md-radio-border-active-color: var(--md-color-primary);\r\n --md-radio-border-active-hover-color: var(--md-color-primary-hover);\r\n --md-radio-dot-color: #fff;\r\n --md-radio-label-color: var(--md-color-text);\r\n --md-radio-label-hover-color: var(--md-color-text);\r\n --md-radio-group-gap: var(--md-spacing-md);\r\n\r\n /* ═══════════════════════════════════════════════════\r\n Checkbox 复选框 --{size}-checkbox-{part}-{state}\r\n ═══════════════════════════════════════════════════ */\r\n --md-checkbox-bg: transparent;\r\n --md-checkbox-bg-active: var(--md-color-primary);\r\n --md-checkbox-border-color: var(--md-color-border);\r\n --md-checkbox-border-hover-color: var(--md-color-text-secondary);\r\n --md-checkbox-border-active-color: var(--md-color-primary);\r\n --md-checkbox-border-active-hover-color: var(--md-color-primary-hover);\r\n --md-checkbox-check-color: #fff;\r\n --md-checkbox-label-color: var(--md-color-text);\r\n --md-checkbox-label-hover-color: var(--md-color-text);\r\n --md-checkbox-group-gap: var(--md-spacing-md);\r\n\r\n /* ═══════════════════════════════════════════════════\r\n Select 选择器 --{size}-select-{part}-{state}\r\n ═══════════════════════════════════════════════════ */\r\n /* sm */\r\n --sm-select-trigger-padding-vertical: var(--md-spacing-xs);\r\n --sm-select-trigger-padding-horizontal: var(--md-spacing-sm);\r\n --sm-select-trigger-font-size: var(--md-font-size-sm);\r\n --sm-select-trigger-min-height: 28px;\r\n --sm-select-trigger-radius: var(--md-radius-md);\r\n\r\n /* md (default) */\r\n --md-select-trigger-padding-vertical: var(--md-spacing-sm);\r\n --md-select-trigger-padding-horizontal: var(--md-spacing-md);\r\n --md-select-trigger-font-size: var(--md-font-size-base);\r\n --md-select-trigger-min-height: 32px;\r\n --md-select-trigger-radius: var(--md-radius-md);\r\n\r\n /* lg */\r\n --lg-select-trigger-padding-vertical: var(--md-spacing-md);\r\n --lg-select-trigger-padding-horizontal: var(--md-spacing-lg);\r\n --lg-select-trigger-font-size: var(--md-font-size-lg);\r\n --lg-select-trigger-min-height: 40px;\r\n --lg-select-trigger-radius: var(--md-radius-md);\r\n\r\n /* select 状态颜色 */\r\n --md-select-item-hover-bg: rgba(0, 122, 255, 0.05);\r\n --md-select-item-selected-bg: rgba(0, 122, 255, 0.08);\r\n --md-select-item-focused-bg: rgba(0, 122, 255, 0.1);\r\n --md-select-tag-bg: rgba(0, 122, 255, 0.1);\r\n --md-select-tag-text: #007aff;\r\n --md-select-container-focus-shadow:\r\n 0 0 0 3px rgba(0, 122, 255, 0.1), 0 2px 8px rgba(0, 122, 255, 0.08);\r\n --md-select-container-focus-border: rgba(0, 122, 255, 0.5);\r\n --md-select-container-focus-glass-shadow:\r\n 0 0 0 3px rgba(0, 122, 255, 0.15), 0 4px 12px rgba(0, 0, 0, 0.15);\r\n\r\n /* select 暗色模式 */\r\n --md-select-item-dark-hover-bg: rgba(255, 255, 255, 0.05);\r\n --md-select-item-dark-selected-bg: rgba(0, 122, 255, 0.15);\r\n --md-select-item-dark-focused-bg: rgba(255, 255, 255, 0.08);\r\n --md-select-tag-dark-bg: rgba(0, 122, 255, 0.2);\r\n --md-select-container-dark-bg: rgba(30, 30, 30, 0.95);\r\n --md-select-container-dark-border: rgba(255, 255, 255, 0.1);\r\n --md-select-container-dark-filled-bg: rgba(255, 255, 255, 0.05);\r\n --md-select-container-dark-glass-bg: rgba(255, 255, 255, 0.05);\r\n --md-select-clear-dark-bg: rgba(255, 255, 255, 0.1);\r\n --md-select-clear-dark-hover-bg: rgba(255, 255, 255, 0.15);\r\n\r\n /* ═══════════════════════════════════════════════════\r\n DatePicker 日期选择器 --{size}-date-picker-{part}-{state}\r\n ═══════════════════════════════════════════════════ */\r\n /* sm */\r\n --sm-date-picker-panel-width: 264px;\r\n --sm-date-picker-panel-padding: 12px;\r\n --sm-date-picker-day-height: 28px;\r\n --sm-date-picker-day-width: 28px;\r\n --sm-date-picker-nav-btn-size: 24px;\r\n --sm-date-picker-header-font-size: 14px;\r\n --sm-date-picker-header-margin-bottom: 10px;\r\n --sm-date-picker-week-num-width: 28px;\r\n --sm-date-picker-week-num-height: 28px;\r\n --sm-date-picker-weekday-font-size: 10px;\r\n --sm-date-picker-grid-cell-height: 40px;\r\n --sm-date-picker-year-cell-height: 34px;\r\n --sm-date-picker-time-input-width: 42px;\r\n --sm-date-picker-footer-margin-top: 10px;\r\n --sm-date-picker-grid-gap: 6px;\r\n --sm-date-picker-day-gap: 2px;\r\n --sm-date-picker-panel-border-radius: 10px;\r\n\r\n /* md (default) */\r\n --md-date-picker-panel-width: 288px;\r\n --md-date-picker-panel-padding: 16px;\r\n --md-date-picker-day-height: 32px;\r\n --md-date-picker-day-width: 32px;\r\n --md-date-picker-nav-btn-size: 28px;\r\n --md-date-picker-header-font-size: 15px;\r\n --md-date-picker-header-margin-bottom: 12px;\r\n --md-date-picker-week-num-width: 32px;\r\n --md-date-picker-week-num-height: 32px;\r\n --md-date-picker-weekday-font-size: 11px;\r\n --md-date-picker-grid-cell-height: 48px;\r\n --md-date-picker-year-cell-height: 40px;\r\n --md-date-picker-time-input-width: 48px;\r\n --md-date-picker-footer-margin-top: 12px;\r\n --md-date-picker-grid-gap: 8px;\r\n --md-date-picker-day-gap: 2px;\r\n --md-date-picker-panel-border-radius: 12px;\r\n\r\n /* lg */\r\n --lg-date-picker-panel-width: 320px;\r\n --lg-date-picker-panel-padding: 20px;\r\n --lg-date-picker-day-height: 38px;\r\n --lg-date-picker-day-width: 32px;\r\n --lg-date-picker-nav-btn-size: 32px;\r\n --lg-date-picker-header-font-size: 16px;\r\n --lg-date-picker-header-margin-bottom: 14px;\r\n --lg-date-picker-week-num-width: 38px;\r\n --lg-date-picker-week-num-height: 38px;\r\n --lg-date-picker-weekday-font-size: 12px;\r\n --lg-date-picker-grid-cell-height: 56px;\r\n --lg-date-picker-year-cell-height: 46px;\r\n --lg-date-picker-time-input-width: 54px;\r\n --lg-date-picker-footer-margin-top: 14px;\r\n --lg-date-picker-grid-gap: 10px;\r\n --lg-date-picker-day-gap: 2px;\r\n --lg-date-picker-panel-border-radius: 14px;\r\n\r\n /* ═══════════════════════════════════════════════════\r\n Dropdown 下拉菜单 --{size}-dropdown-{part}-{state}\r\n ═══════════════════════════════════════════════════ */\r\n /* sm */\r\n --sm-dropdown-item-padding-vertical: 4px;\r\n --sm-dropdown-item-padding-horizontal: var(--md-spacing-sm);\r\n --sm-dropdown-item-font-size: var(--md-font-size-sm);\r\n --sm-dropdown-container-padding: var(--md-spacing-xs);\r\n --sm-dropdown-container-radius: var(--md-radius-menu);\r\n\r\n /* md (default) */\r\n --md-dropdown-item-padding-vertical: 6px;\r\n --md-dropdown-item-padding-horizontal: var(--md-spacing-md);\r\n --md-dropdown-item-font-size: var(--md-font-size-menu);\r\n --md-dropdown-container-padding: var(--md-spacing-xs);\r\n --md-dropdown-container-radius: var(--md-radius-menu);\r\n\r\n /* lg */\r\n --lg-dropdown-item-padding-vertical: 8px;\r\n --lg-dropdown-item-padding-horizontal: var(--md-spacing-lg);\r\n --lg-dropdown-item-font-size: var(--md-font-size-base);\r\n --lg-dropdown-container-padding: var(--md-spacing-sm);\r\n --lg-dropdown-container-radius: var(--md-radius-menu);\r\n\r\n /* dropdown 状态颜色 */\r\n --md-dropdown-container-bg: rgba(246, 246, 246, 0.72);\r\n --md-dropdown-container-border: rgba(255, 255, 255, 0.25);\r\n --md-dropdown-container-shadow: 0 8px 40px rgba(0, 0, 0, 0.14), 0 2px 12px rgba(0, 0, 0, 0.08);\r\n --md-dropdown-item-hover-bg: rgba(0, 122, 255, 0.18);\r\n --md-dropdown-item-active-bg: rgba(0, 122, 255, 0.82);\r\n --md-dropdown-item-active-hover-bg: rgba(0, 88, 208, 0.88);\r\n --md-dropdown-item-active-color: #fff;\r\n --md-dropdown-item-color: #1d1d1f;\r\n --md-dropdown-item-danger-color: rgba(220, 53, 46, 0.8);\r\n --md-dropdown-item-danger-hover-bg: rgba(220, 53, 46, 0.15);\r\n --md-dropdown-item-disabled-opacity: 0.4;\r\n --md-dropdown-shortcut-color: #6b7280;\r\n --md-dropdown-arrow-color: #6b7280;\r\n --md-dropdown-divider-color: rgba(0, 0, 0, 0.08);\r\n\r\n /* dropdown 暗色模式 */\r\n --md-dropdown-container-dark-bg: rgba(40, 40, 40, 0.85);\r\n --md-dropdown-item-dark-hover-bg: rgba(255, 255, 255, 0.08);\r\n --md-dropdown-item-dark-active-bg: rgba(0, 122, 255, 0.82);\r\n --md-dropdown-item-dark-color: #e0e0e0;\r\n --md-dropdown-shortcut-dark-color: #8e8ea0;\r\n --md-dropdown-divider-dark-color: rgba(255, 255, 255, 0.08);\r\n\r\n /* ═══════════════════════════════════════════════════\r\n Card 卡片 --{size}-card-{part}-{state}\r\n ═══════════════════════════════════════════════════ */\r\n --md-card-container-bg: var(--md-color-bg);\r\n --md-card-container-border: var(--md-color-border);\r\n --md-card-container-radius: var(--md-radius-lg);\r\n --md-card-body-padding: var(--md-spacing-lg);\r\n --md-card-header-padding: var(--md-spacing-lg);\r\n --md-card-footer-padding: var(--md-spacing-lg);\r\n --md-card-close-inset: var(--md-spacing-lg);\r\n --md-card-close-radius: var(--md-radius-sm);\r\n\r\n /* ═══════════════════════════════════════════════════\r\n Modal 模态框 --{size}-modal-{part}-{state}\r\n ═══════════════════════════════════════════════════ */\r\n --md-modal-min-width: 280px;\r\n --md-modal-min-height: 160px;\r\n --md-modal-container-radius: var(--md-radius-dock);\r\n --md-modal-container-bg: var(--md-glass-menu-bg);\r\n --md-modal-container-shadow: 0 22px 70px rgba(0, 0, 0, 0.28), 0 0 0 0.5px rgba(0, 0, 0, 0.12);\r\n --md-modal-header-padding: 0 var(--md-spacing-md);\r\n --md-modal-header-bg: rgba(255, 255, 255, 0.06);\r\n --md-modal-header-border: var(--md-glass-separator);\r\n --md-modal-header-height: 38px;\r\n --md-modal-body-padding: var(--md-spacing-lg);\r\n --md-modal-body-font-size: var(--md-font-size-base);\r\n --md-modal-title-font-size: var(--md-font-size-menu);\r\n --md-modal-title-color: var(--md-mac-text-primary);\r\n --md-modal-title-align: center;\r\n --md-modal-title-inactive-color: rgba(29, 29, 31, 0.4);\r\n --md-modal-traffic-close-bg: #ff5f57;\r\n --md-modal-traffic-minimize-bg: #febc2e;\r\n --md-modal-traffic-maximize-bg: #28c840;\r\n --md-modal-traffic-border: rgba(0, 0, 0, 0.12);\r\n --md-modal-traffic-inactive-bg: #d4d4d4;\r\n --md-modal-traffic-close-stroke: #4d0000;\r\n --md-modal-traffic-minimize-stroke: #995700;\r\n --md-modal-traffic-maximize-stroke: #006500;\r\n --md-modal-resize-border: rgba(0, 0, 0, 0.18);\r\n --md-modal-footer-padding: var(--md-spacing-sm) var(--md-spacing-lg);\r\n --md-modal-footer-bg: rgba(255, 255, 255, 0.04);\r\n --md-modal-footer-border: var(--md-glass-separator);\r\n --md-modal-footer-font-size: var(--md-font-size-sm);\r\n --md-modal-footer-color: var(--md-mac-text-primary);\r\n --md-modal-footer-btn-padding: 5px 14px;\r\n --md-modal-footer-btn-radius: var(--md-radius-md);\r\n --md-modal-footer-btn-font-size: var(--md-font-size-sm);\r\n --md-modal-footer-btn-gap: var(--md-spacing-sm);\r\n --md-modal-footer-cancel-bg: rgba(255, 255, 255, 0.5);\r\n --md-modal-footer-cancel-border: rgba(0, 0, 0, 0.1);\r\n --md-modal-footer-cancel-color: var(--md-mac-text-primary);\r\n --md-modal-footer-cancel-hover-bg: rgba(255, 255, 255, 0.75);\r\n --md-modal-footer-ok-bg: var(--md-color-primary);\r\n --md-modal-footer-ok-color: #fff;\r\n --md-modal-footer-ok-hover-bg: var(--md-color-primary-hover);\r\n\r\n /* modal 暗色模式 */\r\n --md-modal-container-dark-bg: rgba(40, 40, 40, 0.85);\r\n --md-modal-container-dark-shadow:\r\n 0 22px 70px rgba(0, 0, 0, 0.5), 0 0 0 0.5px rgba(255, 255, 255, 0.08);\r\n --md-modal-header-dark-bg: rgba(255, 255, 255, 0.04);\r\n --md-modal-header-dark-border: rgba(255, 255, 255, 0.08);\r\n --md-modal-title-dark-color: rgba(255, 255, 255, 0.92);\r\n --md-modal-title-dark-inactive-color: rgba(255, 255, 255, 0.3);\r\n --md-modal-body-dark-color: rgba(255, 255, 255, 0.88);\r\n --md-modal-resize-dark-border: rgba(255, 255, 255, 0.2);\r\n --md-modal-footer-dark-bg: rgba(255, 255, 255, 0.03);\r\n --md-modal-footer-dark-border: rgba(255, 255, 255, 0.08);\r\n --md-modal-footer-dark-color: rgba(255, 255, 255, 0.88);\r\n --md-modal-footer-cancel-dark-bg: rgba(255, 255, 255, 0.08);\r\n --md-modal-footer-cancel-dark-border: rgba(255, 255, 255, 0.12);\r\n --md-modal-footer-cancel-dark-color: rgba(255, 255, 255, 0.88);\r\n --md-modal-footer-cancel-dark-hover-bg: rgba(255, 255, 255, 0.12);\r\n --md-modal-footer-ok-dark-hover-bg: var(--md-color-primary-hover);\r\n\r\n /* ═══════════════════════════════════════════════════\r\n GroupButton 按钮组 --{size}-group-button-{part}-{state}\r\n ═══════════════════════════════════════════════════ */\r\n /* sm */\r\n --sm-group-button-item-padding-vertical: var(--md-spacing-xs);\r\n --sm-group-button-item-padding-horizontal: var(--md-spacing-md);\r\n --sm-group-button-item-font-size: var(--md-font-size-sm);\r\n --sm-group-button-container-radius: var(--md-radius-lg);\r\n\r\n /* md (default) */\r\n --md-group-button-item-padding-vertical: var(--md-spacing-sm);\r\n --md-group-button-item-padding-horizontal: var(--md-spacing-lg);\r\n --md-group-button-item-font-size: var(--md-font-size-menu);\r\n --md-group-button-container-radius: var(--md-radius-lg);\r\n\r\n /* lg */\r\n --lg-group-button-item-padding-vertical: var(--md-spacing-md);\r\n --lg-group-button-item-padding-horizontal: var(--md-spacing-xl);\r\n --lg-group-button-item-font-size: var(--md-font-size-base);\r\n --lg-group-button-container-radius: var(--md-radius-lg);\r\n\r\n /* group-button 状态颜色 */\r\n --md-group-button-item-color: var(--md-mac-text-primary);\r\n --md-group-button-item-active-color: var(--md-mac-accent);\r\n --md-group-button-item-selected-color: var(--md-mac-text-white);\r\n --md-group-button-item-selected-bg: var(--md-mac-selection-label-bg);\r\n --md-group-button-item-focus-outline: var(--md-mac-accent);\r\n\r\n /* ═══════════════════════════════════════════════════\r\n Dock 停靠栏 --{size}-dock-{part}-{state}\r\n ═══════════════════════════════════════════════════ */\r\n --md-dock-container-padding: 4px 8px 4px;\r\n --md-dock-container-radius: var(--md-radius-dock);\r\n --md-dock-container-gap: 12px;\r\n --md-dock-container-bottom: 8px;\r\n --md-dock-container-shadow: 0 8px 40px rgba(0, 0, 0, 0.18), 0 2px 8px rgba(0, 0, 0, 0.08);\r\n --md-dock-separator-width: 1px;\r\n --md-dock-separator-height: 40px;\r\n --md-dock-separator-color: rgba(255, 255, 255, 0.18);\r\n --md-dock-separator-margin: 0 6px;\r\n --md-dock-item-hover-bg: var(--md-mac-accent-hover);\r\n --md-dock-item-hover-color: var(--md-mac-text-white);\r\n --md-dock-item-hover-shadow: 0 1px 4px rgba(0, 88, 208, 0.25);\r\n --md-dock-item-danger-bg: var(--md-mac-danger);\r\n --md-dock-item-danger-shadow: 0 1px 4px rgba(220, 53, 46, 0.25);\r\n --md-dock-item-danger-text: var(--md-mac-danger-text);\r\n --md-dock-item-danger-border: var(--md-mac-danger-border);\r\n --md-dock-item-danger-dropzone-bg: var(--md-mac-danger-bg);\r\n --md-dock-item-font-size: var(--md-font-size-lg);\r\n --md-dock-icon-size: 48px;\r\n --md-dock-icon-size-desktop: 56px;\r\n --md-dock-icon-wrapper-width: 80px;\r\n --md-dock-indicator-size: 4px;\r\n --md-dock-indicator-margin-top: 2px;\r\n --md-dock-magnify-range: 120px;\r\n --md-dock-magnify-scale: 1.6;\r\n --md-dock-magnify-threshold: 5px;\r\n\r\n /* ═══════════════════════════════════════════════════\r\n Glass 毛玻璃 --{size}-glass-{part}-{state}\r\n ═══════════════════════════════════════════════════ */\r\n --md-glass-container-bg: rgba(255, 255, 255, 0.12);\r\n --md-glass-container-border: rgba(255, 255, 255, 0.2);\r\n --md-glass-highlight-top: rgba(255, 255, 255, 0.25);\r\n --md-glass-highlight-bottom: rgba(255, 255, 255, 0.05);\r\n --md-glass-menu-bg: rgba(246, 246, 246, 0.72);\r\n --md-glass-menu-border: rgba(255, 255, 255, 0.25);\r\n --md-glass-menu-highlight: rgba(255, 255, 255, 0.35);\r\n --md-glass-separator: rgba(0, 0, 0, 0.08);\r\n --md-glass-blur: 40px;\r\n --md-glass-saturate: 200%;\r\n\r\n /* ═══════════════════════════════════════════════════\r\n macOS 风格 --{size}-mac-{part}-{state}\r\n ═══════════════════════════════════════════════════ */\r\n --md-mac-accent: #0058d0;\r\n --md-mac-accent-hover: rgba(0, 88, 208, 0.88);\r\n --md-mac-danger: rgba(220, 53, 46, 0.88);\r\n --md-mac-danger-bg: rgba(220, 53, 46, 0.15);\r\n --md-mac-danger-border: rgba(220, 53, 46, 0.4);\r\n --md-mac-danger-text: rgba(220, 53, 46, 0.8);\r\n --md-mac-selection: rgba(0, 122, 255, 0.18);\r\n --md-mac-selection-border: rgba(0, 122, 255, 0.35);\r\n --md-mac-selection-label-bg: rgba(0, 122, 255, 0.82);\r\n --md-mac-selection-rect-border: rgba(15, 43, 74, 0.5);\r\n --md-mac-selection-rect-bg: rgba(0, 122, 255, 0.08);\r\n --md-mac-selection-rect-inner: rgba(0, 122, 255, 0.12);\r\n --md-mac-text-primary: #1d1d1f;\r\n --md-mac-text-white: #fff;\r\n --md-mac-text-white-soft: rgba(255, 255, 255, 0.92);\r\n\r\n /* ═══════════════════════════════════════════════════\r\n Icon 图标 --{size}-icon-{part}-{state}\r\n ═══════════════════════════════════════════════════ */\r\n --md-icon-size: 48px;\r\n --md-icon-size-desktop: 56px;\r\n --md-icon-shadow: 0 2px 6px rgba(0, 0, 0, 0.18);\r\n --md-icon-hover-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);\r\n --md-icon-active-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\r\n --md-icon-drag-shadow: 0 12px 24px rgba(0, 0, 0, 0.35);\r\n --md-icon-ghost-shadow: 0 8px 24px rgba(0, 0, 0, 0.35);\r\n --md-icon-desktop-drag-shadow: 0 8px 32px rgba(0, 0, 0, 0.28), 0 2px 8px rgba(0, 0, 0, 0.12);\r\n --md-icon-inset-top: rgba(255, 255, 255, 0.18);\r\n --md-icon-inset-bottom: rgba(0, 0, 0, 0.12);\r\n --md-icon-inset-top-soft: rgba(255, 255, 255, 0.15);\r\n --md-icon-inset-bottom-soft: rgba(0, 0, 0, 0.1);\r\n\r\n /* ═══════════════════════════════════════════════════\r\n Menu 菜单 --{size}-menu-{part}-{state}\r\n ═══════════════════════════════════════════════════ */\r\n --md-menu-shadow: 0 8px 40px rgba(0, 0, 0, 0.14), 0 2px 12px rgba(0, 0, 0, 0.08);\r\n --md-menu-item-hover-shadow: 0 1px 4px rgba(0, 88, 208, 0.25);\r\n --md-menu-item-danger-hover-shadow: 0 1px 4px rgba(220, 53, 46, 0.25);\r\n\r\n /* ═══════════════════════════════════════════════════\r\n Tooltip 提示 --{size}-tooltip-{part}-{state}\r\n ═══════════════════════════════════════════════════ */\r\n --md-tooltip-bg: rgba(30, 30, 30, 0.82);\r\n --md-tooltip-blur: 16px;\r\n --md-tooltip-border: rgba(255, 255, 255, 0.12);\r\n --md-tooltip-shadow: 0 2px 12px rgba(0, 0, 0, 0.2);\r\n --md-tooltip-offset: -32px;\r\n\r\n /* ═══════════════════════════════════════════════════\r\n TextEllipsis 文本省略 --{size}-ellipsis-{part}-{state}\r\n ═══════════════════════════════════════════════════ */\r\n --md-ellipsis-color: var(--md-color-text);\r\n --md-ellipsis-expand-color: var(--md-color-primary);\r\n --md-ellipsis-tooltip-bg: var(--md-tooltip-bg);\r\n --md-ellipsis-tooltip-color: #fff;\r\n\r\n /* ═══════════════════════════════════════════════════\r\n Rating 评分 --{size}-rating-{part}-{state}\r\n ═══════════════════════════════════════════════════ */\r\n --md-rating-icon-size: var(--md-icon-size-lg);\r\n --md-rating-gap: var(--md-spacing-xs);\r\n --md-rating-color-active: var(--md-color-warning);\r\n --md-rating-color-inactive: var(--md-color-border);\r\n --md-rating-color-hover: var(--md-color-warning);\r\n --md-rating-color-disabled: var(--md-color-border);\r\n\r\n /* sm */\r\n --sm-rating-icon-size: var(--md-icon-size-sm);\r\n --sm-rating-gap: 2px;\r\n\r\n /* lg */\r\n --lg-rating-icon-size: var(--md-icon-size-xl, 36px);\r\n --lg-rating-gap: var(--md-spacing-sm);\r\n\r\n /* dark */\r\n --md-rating-color-dark-active: #fbbf24;\r\n --md-rating-color-dark-inactive: #4b5563;\r\n --md-rating-color-dark-hover: #fcd34d;\r\n\r\n /* ═══════════════════════════════════════════════════\r\n Descriptions 描述 --{size}-descriptions-{part}-{state}\r\n ═══════════════════════════════════════════════════ */\r\n --md-descriptions-container-bg: var(--md-glass-menu-bg);\r\n --md-descriptions-container-border: var(--md-glass-separator);\r\n --md-descriptions-container-radius: var(--md-radius-dock);\r\n --md-descriptions-container-shadow: var(--md-menu-shadow);\r\n --md-descriptions-header-padding: var(--md-spacing-md) var(--md-spacing-lg);\r\n --md-descriptions-header-border: var(--md-glass-separator);\r\n --md-descriptions-title-font-size: var(--md-font-size-menu);\r\n --md-descriptions-title-color: var(--md-color-text);\r\n --md-descriptions-label-color: var(--md-color-text-secondary);\r\n --md-descriptions-label-bg: rgba(0, 0, 0, 0.02);\r\n --md-descriptions-label-width: 120px;\r\n --md-descriptions-value-color: var(--md-color-text);\r\n --md-descriptions-value-bg: transparent;\r\n --md-descriptions-row-border: var(--md-glass-separator);\r\n --md-descriptions-cell-padding: var(--md-spacing-sm) var(--md-spacing-lg);\r\n\r\n /* sm */\r\n --sm-descriptions-cell-padding: var(--md-spacing-xs) var(--md-spacing-md);\r\n --sm-descriptions-label-width: 100px;\r\n\r\n /* lg */\r\n --lg-descriptions-cell-padding: var(--md-spacing-md) var(--md-spacing-xl);\r\n --lg-descriptions-label-width: 140px;\r\n\r\n /* dark */\r\n --md-descriptions-container-dark-bg: rgba(40, 40, 40, 0.85);\r\n --md-descriptions-container-dark-border: rgba(255, 255, 255, 0.08);\r\n --md-descriptions-header-dark-border: rgba(255, 255, 255, 0.08);\r\n --md-descriptions-title-dark-color: rgba(255, 255, 255, 0.92);\r\n --md-descriptions-label-dark-color: rgba(255, 255, 255, 0.55);\r\n --md-descriptions-label-dark-bg: rgba(255, 255, 255, 0.04);\r\n --md-descriptions-value-dark-color: rgba(255, 255, 255, 0.88);\r\n --md-descriptions-row-dark-border: rgba(255, 255, 255, 0.06);\r\n\r\n /* ═══════════════════════════════════════════════════\r\n NumberAnimation 数值动画 --{size}-number-animation-{part}-{state}\r\n ═══════════════════════════════════════════════════ */\r\n --md-number-animation-font-size: var(--md-font-size-display, 48px);\r\n --md-number-animation-color: var(--md-color-text);\r\n --md-number-animation-font-weight: 600;\r\n --md-number-animation-font-family: var(--md-font-family);\r\n --md-number-animation-prefix-color: var(--md-color-text-secondary);\r\n --md-number-animation-suffix-color: var(--md-color-text-secondary);\r\n\r\n /* sm */\r\n --sm-number-animation-font-size: var(--md-font-size-xl, 24px);\r\n\r\n /* md */\r\n --md-number-animation-font-size-md: var(--md-font-size-display, 48px);\r\n\r\n /* lg */\r\n --lg-number-animation-font-size: var(--md-font-size-hero, 72px);\r\n\r\n /* dark */\r\n --md-number-animation-color-dark: rgba(255, 255, 255, 0.92);\r\n --md-number-animation-prefix-dark-color: rgba(255, 255, 255, 0.55);\r\n --md-number-animation-suffix-dark-color: rgba(255, 255, 255, 0.55);\r\n\r\n /* ═══════════════════════════════════════════════════\r\n TextShadow 文字阴影 --{size}-text-shadow-{part}\r\n ═══════════════════════════════════════════════════ */\r\n --md-text-shadow-label: 0 1px 4px rgba(0, 0, 0, 0.55);\r\n --md-text-shadow-none: none;\r\n\r\n /* ═══════════════════════════════════════════════════\r\n Tabs 标签页 --{size}-tabs-{part}-{state}\r\n ═══════════════════════════════════════════════════ */\r\n /* sm */\r\n --sm-tabs-item-padding-vertical: var(--md-spacing-xs);\r\n --sm-tabs-item-padding-horizontal: var(--md-spacing-sm);\r\n --sm-tabs-item-font-size: var(--md-font-size-sm);\r\n --sm-tabs-item-gap: 2px;\r\n --sm-tabs-pane-padding: var(--md-spacing-md) 0;\r\n\r\n /* md (default) */\r\n --md-tabs-item-padding-vertical: var(--md-spacing-sm);\r\n --md-tabs-item-padding-horizontal: var(--md-spacing-md);\r\n --md-tabs-item-font-size: var(--md-font-size-base);\r\n --md-tabs-item-gap: var(--md-spacing-xs);\r\n --md-tabs-pane-padding: var(--md-spacing-lg) 0;\r\n\r\n /* lg */\r\n --lg-tabs-item-padding-vertical: var(--md-spacing-md);\r\n --lg-tabs-item-padding-horizontal: var(--md-spacing-lg);\r\n --lg-tabs-item-font-size: var(--md-font-size-lg);\r\n --lg-tabs-item-gap: var(--md-spacing-sm);\r\n --lg-tabs-pane-padding: var(--md-spacing-xl) 0;\r\n\r\n /* tabs 状态颜色 */\r\n --md-tabs-item-color: var(--md-color-text-secondary);\r\n --md-tabs-item-hover-color: var(--md-color-text);\r\n --md-tabs-item-active-color: var(--md-mac-accent);\r\n --md-tabs-item-disabled-color: var(--md-color-text-secondary);\r\n --md-tabs-indicator-color: var(--md-mac-accent);\r\n --md-tabs-indicator-height: 2px;\r\n --md-tabs-indicator-radius: 1px;\r\n --md-tabs-close-color: var(--md-color-text-secondary);\r\n --md-tabs-close-hover-color: var(--md-color-text);\r\n --md-tabs-close-hover-bg: rgba(0, 0, 0, 0.06);\r\n --md-tabs-add-color: var(--md-color-text-secondary);\r\n --md-tabs-add-hover-color: var(--md-color-text);\r\n --md-tabs-add-hover-bg: rgba(0, 0, 0, 0.06);\r\n --md-tabs-nav-border: var(--md-glass-separator);\r\n\r\n /* tabs segment 类型 */\r\n --md-tabs-segment-bg: rgba(0, 0, 0, 0.04);\r\n --md-tabs-segment-item-color: var(--md-color-text-secondary);\r\n --md-tabs-segment-item-active-bg: var(--md-color-bg);\r\n --md-tabs-segment-item-active-color: var(--md-color-text);\r\n --md-tabs-segment-item-hover-bg: rgba(0, 0, 0, 0.04);\r\n --md-tabs-segment-radius: var(--md-radius-md);\r\n\r\n /* tabs 暗色模式 */\r\n --md-tabs-item-dark-color: rgba(255, 255, 255, 0.55);\r\n --md-tabs-item-dark-hover-color: rgba(255, 255, 255, 0.88);\r\n --md-tabs-item-dark-active-color: rgba(0, 122, 255, 0.9);\r\n --md-tabs-item-dark-disabled-color: rgba(255, 255, 255, 0.3);\r\n --md-tabs-indicator-dark-color: rgba(0, 122, 255, 0.9);\r\n --md-tabs-close-dark-color: rgba(255, 255, 255, 0.4);\r\n --md-tabs-close-dark-hover-color: rgba(255, 255, 255, 0.8);\r\n --md-tabs-close-dark-hover-bg: rgba(255, 255, 255, 0.08);\r\n --md-tabs-add-dark-color: rgba(255, 255, 255, 0.4);\r\n --md-tabs-add-dark-hover-color: rgba(255, 255, 255, 0.8);\r\n --md-tabs-add-dark-hover-bg: rgba(255, 255, 255, 0.08);\r\n --md-tabs-nav-dark-border: rgba(255, 255, 255, 0.08);\r\n --md-tabs-segment-dark-bg: rgba(255, 255, 255, 0.06);\r\n --md-tabs-segment-item-dark-color: rgba(255, 255, 255, 0.55);\r\n --md-tabs-segment-item-dark-active-bg: rgba(255, 255, 255, 0.12);\r\n --md-tabs-segment-item-dark-active-color: rgba(255, 255, 255, 0.92);\r\n --md-tabs-segment-item-dark-hover-bg: rgba(255, 255, 255, 0.08);\r\n\r\n /* ═══════════════════════════════════════════════════\r\n Drawer 抽屉 --md-drawer-{part}-{state}\r\n ═══════════════════════════════════════════════════ */\r\n --md-drawer-bg: rgba(246, 246, 246, 0.88);\r\n --md-drawer-border: rgba(0, 0, 0, 0.06);\r\n --md-drawer-shadow: -8px 0 40px rgba(0, 0, 0, 0.1), -2px 0 12px rgba(0, 0, 0, 0.06);\r\n --md-drawer-header-padding: var(--md-spacing-md) var(--md-spacing-lg);\r\n --md-drawer-header-border: rgba(0, 0, 0, 0.06);\r\n --md-drawer-title-font-size: var(--md-font-size-lg);\r\n --md-drawer-title-color: var(--md-color-text);\r\n --md-drawer-body-padding: var(--md-spacing-lg);\r\n --md-drawer-footer-padding: var(--md-spacing-md) var(--md-spacing-lg);\r\n --md-drawer-footer-border: rgba(0, 0, 0, 0.06);\r\n --md-drawer-close-color: var(--md-color-text-secondary);\r\n --md-drawer-close-hover-bg: rgba(0, 0, 0, 0.06);\r\n --md-drawer-mask-bg: rgba(0, 0, 0, 0.3);\r\n --md-drawer-radius: var(--md-radius-lg);\r\n\r\n /* drawer 暗色模式 */\r\n --md-drawer-dark-bg: rgba(40, 40, 40, 0.92);\r\n --md-drawer-dark-border: rgba(255, 255, 255, 0.08);\r\n --md-drawer-dark-shadow: -8px 0 40px rgba(0, 0, 0, 0.3), -2px 0 12px rgba(0, 0, 0, 0.2);\r\n --md-drawer-header-dark-border: rgba(255, 255, 255, 0.06);\r\n --md-drawer-title-dark-color: rgba(255, 255, 255, 0.92);\r\n --md-drawer-footer-dark-border: rgba(255, 255, 255, 0.06);\r\n --md-drawer-close-dark-color: rgba(255, 255, 255, 0.55);\r\n --md-drawer-close-dark-hover-bg: rgba(255, 255, 255, 0.08);\r\n --md-drawer-mask-dark-bg: rgba(0, 0, 0, 0.5);\r\n\r\n /* ═══════════════════════════════════════════════════\r\n Popconfirm 弹出确认 --md-popconfirm-{part}-{state}\r\n ═══════════════════════════════════════════════════ */\r\n --md-popconfirm-bg: rgba(246, 246, 246, 0.88);\r\n --md-popconfirm-border: rgba(0, 0, 0, 0.06);\r\n --md-popconfirm-shadow: 0 8px 40px rgba(0, 0, 0, 0.12), 0 2px 12px rgba(0, 0, 0, 0.06);\r\n --md-popconfirm-radius: var(--md-radius-lg);\r\n --md-popconfirm-padding: var(--md-spacing-lg);\r\n --md-popconfirm-icon-color: #f5a623;\r\n --md-popconfirm-title-color: var(--md-color-text);\r\n --md-popconfirm-title-font-size: var(--md-font-size-base);\r\n --md-popconfirm-desc-color: var(--md-color-text-secondary);\r\n --md-popconfirm-desc-font-size: var(--md-font-size-sm);\r\n --md-popconfirm-btn-gap: var(--md-spacing-sm);\r\n\r\n /* popconfirm 暗色模式 */\r\n --md-popconfirm-dark-bg: rgba(40, 40, 40, 0.92);\r\n --md-popconfirm-dark-border: rgba(255, 255, 255, 0.08);\r\n --md-popconfirm-dark-shadow: 0 8px 40px rgba(0, 0, 0, 0.3), 0 2px 12px rgba(0, 0, 0, 0.2);\r\n --md-popconfirm-title-dark-color: rgba(255, 255, 255, 0.92);\r\n --md-popconfirm-desc-dark-color: rgba(255, 255, 255, 0.45);\r\n\r\n /* ═══════════════════════════════════════════════════\r\n Confirm 确认弹框 --md-confirm-{part}-{state}\r\n ═══════════════════════════════════════════════════ */\r\n --md-confirm-mask-bg: rgba(0, 0, 0, 0.35);\r\n --md-confirm-bg: rgba(246, 246, 246, 0.88);\r\n --md-confirm-shadow: 0 22px 70px rgba(0, 0, 0, 0.28), 0 0 0 0.5px rgba(0, 0, 0, 0.12);\r\n --md-confirm-border: rgba(255, 255, 255, 0.25);\r\n --md-confirm-radius: var(--md-radius-dock);\r\n --md-confirm-title-padding: var(--md-spacing-md) var(--md-spacing-lg);\r\n --md-confirm-title-border: var(--md-glass-separator);\r\n --md-confirm-title-font-size: var(--md-font-size-menu);\r\n --md-confirm-title-color: var(--md-mac-text-primary);\r\n --md-confirm-body-padding: var(--md-spacing-lg);\r\n --md-confirm-body-color: var(--md-mac-text-primary);\r\n --md-confirm-body-font-size: var(--md-font-size-base);\r\n --md-confirm-icon-color: #f5a623;\r\n --md-confirm-footer-padding: var(--md-spacing-sm) var(--md-spacing-lg);\r\n --md-confirm-footer-border: var(--md-glass-separator);\r\n --md-confirm-btn-gap: var(--md-spacing-sm);\r\n --md-confirm-btn-padding: 5px 14px;\r\n --md-confirm-btn-radius: var(--md-radius-md);\r\n --md-confirm-btn-font-size: var(--md-font-size-sm);\r\n --md-confirm-cancel-bg: rgba(255, 255, 255, 0.5);\r\n --md-confirm-cancel-border: rgba(0, 0, 0, 0.1);\r\n --md-confirm-cancel-color: var(--md-mac-text-primary);\r\n --md-confirm-cancel-hover-bg: rgba(255, 255, 255, 0.75);\r\n --md-confirm-ok-bg: var(--md-color-primary);\r\n --md-confirm-ok-color: #fff;\r\n --md-confirm-ok-hover-bg: var(--md-color-primary-hover);\r\n --md-confirm-danger-bg: var(--md-color-danger);\r\n --md-confirm-danger-color: #fff;\r\n --md-confirm-danger-hover-bg: #dc2626;\r\n\r\n /* confirm 暗色模式 */\r\n --md-confirm-dark-bg: rgba(40, 40, 40, 0.92);\r\n --md-confirm-dark-shadow: 0 22px 70px rgba(0, 0, 0, 0.5), 0 0 0 0.5px rgba(255, 255, 255, 0.08);\r\n --md-confirm-dark-border: rgba(255, 255, 255, 0.08);\r\n --md-confirm-dark-title-color: rgba(255, 255, 255, 0.92);\r\n --md-confirm-dark-title-border: rgba(255, 255, 255, 0.08);\r\n --md-confirm-dark-body-color: rgba(255, 255, 255, 0.88);\r\n --md-confirm-dark-footer-border: rgba(255, 255, 255, 0.08);\r\n --md-confirm-dark-cancel-bg: rgba(255, 255, 255, 0.08);\r\n --md-confirm-dark-cancel-border: rgba(255, 255, 255, 0.12);\r\n --md-confirm-dark-cancel-color: rgba(255, 255, 255, 0.88);\r\n --md-confirm-dark-cancel-hover-bg: rgba(255, 255, 255, 0.12);\r\n --md-confirm-dark-ok-hover-bg: var(--md-color-primary-hover);\r\n\r\n /* ═══════════════════════════════════════════════════\r\n Split 面板分割 --md-split-{part}-{state}\r\n ═══════════════════════════════════════════════════ */\r\n --md-split-resizer-size: 1px;\r\n --md-split-resizer-color: var(--md-color-border);\r\n --md-split-resizer-hover-color: var(--md-color-primary);\r\n --md-split-resizer-handle-bg: var(--md-color-bg-secondary);\r\n --md-split-resizer-handle-dot-color: var(--md-color-text-secondary);\r\n\r\n /* ═══════════════════════════════════════════════════\r\n Alert 警示信息 --md-alert-{part}-{state}\r\n ═══════════════════════════════════════════════════ */\r\n --md-alert-padding: var(--md-spacing-sm) var(--md-spacing-md);\r\n --md-alert-radius: var(--md-radius-md);\r\n --md-alert-font-size: var(--md-font-size-base);\r\n --md-alert-title-font-size: var(--md-font-size-base);\r\n --md-alert-gap: var(--md-spacing-sm);\r\n --md-alert-content-gap: var(--md-spacing-xs);\r\n --md-alert-icon-size: 18px;\r\n --md-alert-close-size: 20px;\r\n --md-alert-close-icon-size: 14px;\r\n --md-alert-close-radius: var(--md-radius-sm);\r\n --md-alert-close-hover-bg: rgba(0, 0, 0, 0.06);\r\n\r\n /* alert default */\r\n --md-alert-default-bg: var(--md-color-bg-secondary);\r\n --md-alert-default-border: var(--md-color-border);\r\n --md-alert-default-icon: var(--md-color-text-secondary);\r\n --md-alert-default-title: var(--md-color-text);\r\n --md-alert-default-content: var(--md-color-text-secondary);\r\n\r\n /* alert primary */\r\n --md-alert-primary-bg: rgba(0, 122, 255, 0.06);\r\n --md-alert-primary-border: rgba(0, 122, 255, 0.2);\r\n --md-alert-primary-icon: #007aff;\r\n --md-alert-primary-title: #0058d0;\r\n --md-alert-primary-content: #0058d0;\r\n\r\n /* alert success */\r\n --md-alert-success-bg: rgba(34, 197, 94, 0.06);\r\n --md-alert-success-border: rgba(34, 197, 94, 0.2);\r\n --md-alert-success-icon: #16a34a;\r\n --md-alert-success-title: #15803d;\r\n --md-alert-success-content: #15803d;\r\n\r\n /* alert warning */\r\n --md-alert-warning-bg: rgba(245, 158, 11, 0.06);\r\n --md-alert-warning-border: rgba(245, 158, 11, 0.2);\r\n --md-alert-warning-icon: #d97706;\r\n --md-alert-warning-title: #b45309;\r\n --md-alert-warning-content: #b45309;\r\n\r\n /* alert error */\r\n --md-alert-error-bg: rgba(239, 68, 68, 0.06);\r\n --md-alert-error-border: rgba(239, 68, 68, 0.2);\r\n --md-alert-error-icon: #dc2626;\r\n --md-alert-error-title: #b91c1c;\r\n --md-alert-error-content: #b91c1c;\r\n\r\n /* alert info */\r\n --md-alert-info-bg: rgba(107, 114, 128, 0.06);\r\n --md-alert-info-border: rgba(107, 114, 128, 0.2);\r\n --md-alert-info-icon: #4b5563;\r\n --md-alert-info-title: #374151;\r\n --md-alert-info-content: #374151;\r\n\r\n /* ═══════════════════════════════════════════════════\r\n LazyImage 图片懒加载 --md-lazy-image-{part}-{state}\r\n ═══════════════════════════════════════════════════ */\r\n --md-lazy-image-object-fit: cover;\r\n --md-lazy-image-placeholder-bg: var(--md-color-bg-secondary);\r\n --md-lazy-image-placeholder-color: var(--md-color-text-secondary);\r\n --md-lazy-image-placeholder-icon-size: 32px;\r\n --md-lazy-image-error-icon-size: 32px;\r\n --md-lazy-image-shimmer-bg: rgba(255, 255, 255, 0.5);\r\n --md-lazy-image-hover-scale: 1.05;\r\n --md-lazy-image-hover-duration: 300ms;\r\n --md-lazy-image-hover-easing: ease-out;\r\n --md-lazy-image-hover-filter: none;\r\n --md-lazy-image-preview-bg: rgba(0, 0, 0, 0.85);\r\n --md-lazy-image-preview-duration: 250ms;\r\n\r\n /* ═══════════════════════════════════════════════════\r\n InfiniteScroll 无限滚动 --md-infinite-scroll-{part}-{state}\r\n ═══════════════════════════════════════════════════ */\r\n --md-infinite-scroll-padding: var(--md-spacing-md);\r\n --md-infinite-scroll-color: var(--md-color-text-secondary);\r\n --md-infinite-scroll-font-size: var(--md-font-size-sm);\r\n --md-infinite-scroll-gap: var(--md-spacing-sm);\r\n --md-infinite-scroll-spinner-size: 16px;\r\n\r\n /* ═══════════════════════════════════════════════════\r\n Carousel 轮播图 --md-carousel-{part}-{state}\r\n ═══════════════════════════════════════════════════ */\r\n --md-carousel-arrow-size: 36px;\r\n --md-carousel-arrow-bg: rgba(255, 255, 255, 0.72);\r\n --md-carousel-arrow-color: var(--md-mac-text-primary);\r\n --md-carousel-arrow-hover-bg: rgba(255, 255, 255, 0.92);\r\n --md-carousel-arrow-offset: 12px;\r\n --md-carousel-dot-size: 8px;\r\n --md-carousel-dot-active-width: 20px;\r\n --md-carousel-dot-active-radius: 4px;\r\n --md-carousel-dot-bg: rgba(255, 255, 255, 0.5);\r\n --md-carousel-dot-hover-bg: rgba(255, 255, 255, 0.75);\r\n --md-carousel-dot-active-bg: rgba(255, 255, 255, 0.92);\r\n --md-carousel-dot-gap: 8px;\r\n --md-carousel-dots-offset: 16px;\r\n --md-carousel-line-width: 16px;\r\n --md-carousel-line-height: 3px;\r\n --md-carousel-line-radius: 2px;\r\n --md-carousel-line-active-width: 24px;\r\n\r\n /* ═══════════════════════════════════════════════════\r\n Progress 进度条 --{size}-progress-{part}-{state}\r\n ═══════════════════════════════════════════════════ */\r\n --md-progress-height: 8px;\r\n --md-progress-radius: 4px;\r\n --md-progress-track-bg: var(--md-color-bg-secondary);\r\n --md-progress-fill-default: var(--md-color-primary);\r\n --md-progress-fill-success: var(--md-color-success);\r\n --md-progress-fill-warning: var(--md-color-warning);\r\n --md-progress-fill-error: var(--md-color-danger);\r\n --md-progress-text-color: var(--md-color-text-secondary);\r\n --md-progress-text-gap: var(--md-spacing-sm);\r\n --md-progress-text-min-width: 40px;\r\n --md-progress-circle-text-size: var(--md-font-size-lg);\r\n --md-progress-circle-text-weight: 500;\r\n\r\n /* sm */\r\n --sm-progress-height: 4px;\r\n --sm-progress-font-size: var(--md-font-size-xs);\r\n\r\n /* md (default) */\r\n --md-progress-height: 8px;\r\n --md-progress-font-size: var(--md-font-size-sm);\r\n\r\n /* lg */\r\n --lg-progress-height: 12px;\r\n --lg-progress-font-size: var(--md-font-size-base);\r\n\r\n /* ═══════════════════════════════════════════════════\r\n Tree 树 --md-tree-{part}-{state}\r\n ═══════════════════════════════════════════════════ */\r\n --md-tree-node-padding: 6px 10px;\r\n --md-tree-node-hover-bg: rgba(0, 122, 255, 0.06);\r\n --md-tree-node-selected-bg: rgba(0, 122, 255, 0.1);\r\n --md-tree-node-selected-hover-bg: rgba(0, 122, 255, 0.14);\r\n --md-tree-node-selected-color: var(--md-color-primary);\r\n --md-tree-disabled-opacity: 0.4;\r\n --md-tree-indent: 20px;\r\n\r\n /* ═══════════════════════════════════════════════════\r\n Tag 标签 --{size}-tag-{part}-{state}\r\n ═══════════════════════════════════════════════════ */\r\n /* sm */\r\n --sm-tag-padding-vertical: 1px;\r\n --sm-tag-padding-horizontal: 6px;\r\n --sm-tag-font-size: var(--md-font-size-xs);\r\n --sm-tag-gap: 2px;\r\n --sm-tag-radius: var(--md-radius-sm);\r\n --sm-tag-round-radius: 10px;\r\n --sm-tag-closable-padding-right: 4px;\r\n --sm-tag-close-size: 12px;\r\n\r\n /* md (default) */\r\n --md-tag-padding-vertical: 2px;\r\n --md-tag-padding-horizontal: 8px;\r\n --md-tag-font-size: var(--md-font-size-sm);\r\n --md-tag-gap: 4px;\r\n --md-tag-radius: var(--md-radius-sm);\r\n --md-tag-round-radius: 12px;\r\n --md-tag-closable-padding-right: 6px;\r\n --md-tag-close-size: 14px;\r\n\r\n /* lg */\r\n --lg-tag-padding-vertical: 4px;\r\n --lg-tag-padding-horizontal: 12px;\r\n --lg-tag-font-size: var(--md-font-size-base);\r\n --lg-tag-gap: 6px;\r\n --lg-tag-radius: var(--md-radius-md);\r\n --lg-tag-round-radius: 16px;\r\n --lg-tag-closable-padding-right: 8px;\r\n --lg-tag-close-size: 16px;\r\n\r\n /* tag default */\r\n --md-tag-default-bg: var(--md-color-bg-secondary);\r\n --md-tag-default-text: var(--md-color-text);\r\n --md-tag-default-border: var(--md-color-border);\r\n --md-tag-default-close-hover-bg: rgba(0, 0, 0, 0.06);\r\n --md-tag-default-close-hover-color: var(--md-color-text);\r\n\r\n /* tag primary */\r\n --md-tag-primary-bg: rgba(0, 122, 255, 0.1);\r\n --md-tag-primary-text: #007aff;\r\n --md-tag-primary-border: rgba(0, 122, 255, 0.2);\r\n --md-tag-primary-close-hover-bg: rgba(0, 122, 255, 0.15);\r\n --md-tag-primary-close-hover-color: #0058d0;\r\n\r\n /* tag success */\r\n --md-tag-success-bg: rgba(34, 197, 94, 0.1);\r\n --md-tag-success-text: #16a34a;\r\n --md-tag-success-border: rgba(34, 197, 94, 0.2);\r\n --md-tag-success-close-hover-bg: rgba(34, 197, 94, 0.15);\r\n --md-tag-success-close-hover-color: #15803d;\r\n\r\n /* tag warning */\r\n --md-tag-warning-bg: rgba(245, 158, 11, 0.1);\r\n --md-tag-warning-text: #d97706;\r\n --md-tag-warning-border: rgba(245, 158, 11, 0.2);\r\n --md-tag-warning-close-hover-bg: rgba(245, 158, 11, 0.15);\r\n --md-tag-warning-close-hover-color: #b45309;\r\n\r\n /* tag danger */\r\n --md-tag-danger-bg: rgba(239, 68, 68, 0.1);\r\n --md-tag-danger-text: #dc2626;\r\n --md-tag-danger-border: rgba(239, 68, 68, 0.2);\r\n --md-tag-danger-close-hover-bg: rgba(239, 68, 68, 0.15);\r\n --md-tag-danger-close-hover-color: #b91c1c;\r\n\r\n /* tag info */\r\n --md-tag-info-bg: rgba(107, 114, 128, 0.1);\r\n --md-tag-info-text: #4b5563;\r\n --md-tag-info-border: rgba(107, 114, 128, 0.2);\r\n --md-tag-info-close-hover-bg: rgba(107, 114, 128, 0.15);\r\n --md-tag-info-close-hover-color: #374151;\r\n\r\n /* ═══════════════════════════════════════════════════\r\n DataTable 数据表格 --{size}-data-table-{part}-{state}\r\n ═══════════════════════════════════════════════════ */\r\n --md-data-table-container-bg: var(--md-color-bg);\r\n --md-data-table-container-border: var(--md-color-border);\r\n --md-data-table-container-radius: var(--md-radius-lg);\r\n --md-data-table-header-bg: var(--md-color-bg-secondary);\r\n --md-data-table-header-color: var(--md-color-text-secondary);\r\n --md-data-table-header-font-size: var(--md-font-size-sm);\r\n --md-data-table-header-font-weight: 600;\r\n --md-data-table-row-bg: transparent;\r\n --md-data-table-row-color: var(--md-color-text);\r\n --md-data-table-row-font-size: var(--md-font-size-base);\r\n --md-data-table-row-hover-bg: rgba(0, 122, 255, 0.05);\r\n --md-data-table-row-selected-bg: rgba(0, 122, 255, 0.08);\r\n --md-data-table-row-selected-hover-bg: rgba(0, 122, 255, 0.12);\r\n --md-data-table-row-striped-bg: rgba(0, 0, 0, 0.02);\r\n --md-data-table-row-border: var(--md-glass-separator);\r\n --md-data-table-cell-padding: var(--md-spacing-sm) var(--md-spacing-md);\r\n --md-data-table-cell-border: var(--md-glass-separator);\r\n --md-data-table-cell-color: var(--md-color-text);\r\n --md-data-table-footer-bg: var(--md-color-bg-secondary);\r\n --md-data-table-footer-border: var(--md-glass-separator);\r\n --md-data-table-footer-padding: var(--md-spacing-sm) var(--md-spacing-md);\r\n --md-data-table-empty-color: var(--md-color-text-secondary);\r\n --md-data-table-empty-font-size: var(--md-font-size-base);\r\n --md-data-table-empty-padding: var(--md-spacing-2xl) var(--md-spacing-md);\r\n --md-data-table-sort-color: var(--md-color-text-secondary);\r\n --md-data-table-sort-active-color: var(--md-color-primary);\r\n --md-data-table-sort-hover-color: var(--md-color-text);\r\n\r\n /* sm */\r\n --sm-data-table-cell-padding: var(--md-spacing-xs) var(--md-spacing-sm);\r\n --sm-data-table-header-font-size: var(--md-font-size-xs);\r\n --sm-data-table-row-font-size: var(--md-font-size-sm);\r\n\r\n /* lg */\r\n --lg-data-table-cell-padding: var(--md-spacing-md) var(--md-spacing-lg);\r\n --lg-data-table-header-font-size: var(--md-font-size-base);\r\n --lg-data-table-row-font-size: var(--md-font-size-lg);\r\n\r\n /* pagination */\r\n --md-data-table-pagination-padding: var(--md-spacing-sm) var(--md-spacing-md);\r\n --md-data-table-pagination-gap: var(--md-spacing-sm);\r\n --md-data-table-pagination-color: var(--md-color-text-secondary);\r\n --md-data-table-pagination-font-size: var(--md-font-size-sm);\r\n --md-data-table-pagination-item-min-width: 32px;\r\n --md-data-table-pagination-item-height: 32px;\r\n --md-data-table-pagination-item-radius: var(--md-radius-md);\r\n --md-data-table-pagination-item-bg: transparent;\r\n --md-data-table-pagination-item-border: var(--md-color-border);\r\n --md-data-table-pagination-item-color: var(--md-color-text);\r\n --md-data-table-pagination-item-hover-bg: rgba(0, 122, 255, 0.06);\r\n --md-data-table-pagination-item-hover-border: var(--md-color-primary);\r\n --md-data-table-pagination-item-active-bg: var(--md-color-primary);\r\n --md-data-table-pagination-item-active-border: var(--md-color-primary);\r\n --md-data-table-pagination-item-active-color: #fff;\r\n --md-data-table-pagination-item-disabled-opacity: 0.4;\r\n --md-data-table-pagination-ellipsis-color: var(--md-color-text-secondary);\r\n --md-data-table-pagination-jumper-input-width: 56px;\r\n --md-data-table-pagination-size-select-width: 96px;\r\n }\r\n\r\n /* ═══════════════════════════════════════════════════════════════════\r\n 响应式适配 —— 移动端 (≤ 768px)\r\n ──────────────────────────────────────────────────────────────────\r\n 策略:通过 :host 内的 @media 覆盖尺寸类 CSS 变量。由于每个组件\r\n 都引入 themeTokens,此块会自动作用于所有组件,PC 端 (>768px)\r\n 完全不受影响。\r\n 触控目标遵循 Apple HIG / Material 规范:最小 44px。\r\n 输入框字体 16px 以防止 iOS 聚焦缩放。\r\n ═══════════════════════════════════════════════════════════════════ */\r\n @media (max-width: 768px) {\r\n :host {\r\n /* 基础间距:移动端略微放大,便于手指操作 */\r\n --md-spacing-xs: 6px;\r\n --md-spacing-sm: 10px;\r\n --md-spacing-md: 14px;\r\n --md-spacing-lg: 18px;\r\n --md-spacing-xl: 26px;\r\n\r\n /* 基础字号:保证可读性 */\r\n --md-font-size-xs: 12px;\r\n --md-font-size-sm: 13px;\r\n --md-font-size-menu: 14px;\r\n --md-font-size-base: 16px; /* 16px 防止 iOS 输入聚焦缩放 */\r\n --md-font-size-lg: 17px;\r\n\r\n /* Button —— 统一放大触控目标至 ≥ 44px */\r\n --sm-button-padding-vertical: 10px;\r\n --sm-button-padding-horizontal: 14px;\r\n --sm-button-font-size: var(--md-font-size-sm);\r\n --md-button-padding-vertical: 12px;\r\n --md-button-padding-horizontal: 18px;\r\n --md-button-font-size: var(--md-font-size-base);\r\n --lg-button-padding-vertical: 14px;\r\n --lg-button-padding-horizontal: 22px;\r\n --lg-button-font-size: var(--md-font-size-lg);\r\n\r\n /* Input —— 16px 字号 + ≥ 44px 高度 */\r\n --sm-input-padding-vertical: 10px;\r\n --sm-input-padding-horizontal: 12px;\r\n --sm-input-font-size: 16px;\r\n --md-input-padding-vertical: 12px;\r\n --md-input-padding-horizontal: 14px;\r\n --md-input-font-size: 16px;\r\n --lg-input-padding-vertical: 14px;\r\n --lg-input-padding-horizontal: 16px;\r\n --lg-input-font-size: 17px;\r\n\r\n /* Select 触发器 —— ≥ 44px */\r\n --sm-select-trigger-padding-vertical: 10px;\r\n --sm-select-trigger-padding-horizontal: 12px;\r\n --sm-select-trigger-font-size: 16px;\r\n --sm-select-trigger-min-height: 44px;\r\n --md-select-trigger-padding-vertical: 12px;\r\n --md-select-trigger-padding-horizontal: 14px;\r\n --md-select-trigger-font-size: 16px;\r\n --md-select-trigger-min-height: 44px;\r\n --lg-select-trigger-padding-vertical: 14px;\r\n --lg-select-trigger-padding-horizontal: 16px;\r\n --lg-select-trigger-font-size: 17px;\r\n --lg-select-trigger-min-height: 48px;\r\n\r\n /* Dropdown 菜单项 —— 增大触控区域 */\r\n --sm-dropdown-item-padding-vertical: 12px;\r\n --sm-dropdown-item-padding-horizontal: 16px;\r\n --sm-dropdown-item-font-size: var(--md-font-size-base);\r\n --md-dropdown-item-padding-vertical: 13px;\r\n --md-dropdown-item-padding-horizontal: 16px;\r\n --md-dropdown-item-font-size: var(--md-font-size-base);\r\n --lg-dropdown-item-padding-vertical: 14px;\r\n --lg-dropdown-item-padding-horizontal: 18px;\r\n --lg-dropdown-item-font-size: var(--md-font-size-lg);\r\n\r\n /* Radio / Checkbox —— 增大点击区域 */\r\n --sm-radio-size: 18px;\r\n --sm-radio-dot-size: 8px;\r\n --sm-radio-gap: 10px;\r\n --md-radio-size: 22px;\r\n --md-radio-dot-size: 10px;\r\n --md-radio-gap: 12px;\r\n --lg-radio-size: 26px;\r\n --lg-radio-dot-size: 12px;\r\n --lg-radio-gap: 14px;\r\n\r\n /* Tabs —— 增大触控目标 */\r\n --sm-tabs-item-padding-vertical: 10px;\r\n --sm-tabs-item-padding-horizontal: 14px;\r\n --sm-tabs-item-font-size: var(--md-font-size-base);\r\n --md-tabs-item-padding-vertical: 12px;\r\n --md-tabs-item-padding-horizontal: 16px;\r\n --md-tabs-item-font-size: var(--md-font-size-base);\r\n --lg-tabs-item-padding-vertical: 14px;\r\n --lg-tabs-item-padding-horizontal: 18px;\r\n --lg-tabs-item-font-size: var(--md-font-size-lg);\r\n\r\n /* GroupButton —— 增大触控目标 */\r\n --sm-group-button-item-padding-vertical: 10px;\r\n --sm-group-button-item-padding-horizontal: 16px;\r\n --md-group-button-item-padding-vertical: 12px;\r\n --md-group-button-item-padding-horizontal: 18px;\r\n --lg-group-button-item-padding-vertical: 14px;\r\n --lg-group-button-item-padding-horizontal: 22px;\r\n\r\n /* Tag —— 略微放大便于点击关闭按钮 */\r\n --sm-tag-padding-vertical: 3px;\r\n --sm-tag-padding-horizontal: 8px;\r\n --sm-tag-close-size: 16px;\r\n --md-tag-padding-vertical: 4px;\r\n --md-tag-padding-horizontal: 10px;\r\n --md-tag-close-size: 18px;\r\n --lg-tag-padding-vertical: 6px;\r\n --lg-tag-padding-horizontal: 14px;\r\n --lg-tag-close-size: 20px;\r\n\r\n /* Modal —— 移动端占满视口,圆角缩小 */\r\n --md-modal-min-width: 0;\r\n --md-modal-min-height: 0;\r\n --md-modal-container-radius: var(--md-radius-md);\r\n --md-modal-header-height: 44px;\r\n --md-modal-body-padding: var(--md-spacing-md);\r\n --md-modal-footer-btn-padding: 8px 18px;\r\n --md-modal-footer-btn-font-size: var(--md-font-size-base);\r\n\r\n /* Drawer —— 移动端窄屏更宽 */\r\n --md-drawer-header-padding: var(--md-spacing-md) var(--md-spacing-md);\r\n --md-drawer-body-padding: var(--md-spacing-md);\r\n --md-drawer-footer-padding: var(--md-spacing-md) var(--md-spacing-md);\r\n --md-drawer-title-font-size: var(--md-font-size-lg);\r\n\r\n /* Confirm —— 移动端更宽 */\r\n --md-confirm-title-padding: var(--md-spacing-md) var(--md-spacing-md);\r\n --md-confirm-body-padding: var(--md-spacing-md);\r\n --md-confirm-footer-padding: var(--md-spacing-sm) var(--md-spacing-md);\r\n --md-confirm-btn-padding: 8px 18px;\r\n --md-confirm-btn-font-size: var(--md-font-size-base);\r\n\r\n /* Tree 节点 —— 增大触控 */\r\n --md-tree-node-padding: 12px 12px;\r\n --md-tree-indent: 24px;\r\n\r\n /* Carousel 箭头 —— 增大触控 */\r\n --md-carousel-arrow-size: 44px;\r\n --md-carousel-arrow-offset: 8px;\r\n --md-carousel-dot-size: 10px;\r\n --md-carousel-dots-offset: 14px;\r\n\r\n /* Alert —— 增大内边距 */\r\n --md-alert-padding: var(--md-spacing-md) var(--md-spacing-md);\r\n --md-alert-close-size: 28px;\r\n --md-alert-close-icon-size: 16px;\r\n --md-alert-icon-size: 22px;\r\n\r\n /* Popconfirm —— 增大触控 */\r\n --md-popconfirm-btn-padding: 8px 16px;\r\n --md-popconfirm-btn-font-size: var(--md-font-size-base);\r\n\r\n /* InputNumber —— 与 input 一致 */\r\n --md-input-number-btn-size: 36px;\r\n\r\n /* DataTable —— 移动端增大触控目标 */\r\n --md-data-table-cell-padding: var(--md-spacing-sm) var(--md-spacing-sm);\r\n --md-data-table-pagination-item-min-width: 44px;\r\n --md-data-table-pagination-item-height: 44px;\r\n --md-data-table-pagination-font-size: var(--md-font-size-base);\r\n --md-data-table-pagination-jumper-input-width: 64px;\r\n --md-data-table-pagination-size-select-width: 110px;\r\n }\r\n }\r\n\r\n /* ═══════════════════════════════════════════════════════════════════\r\n 超小屏手机 (≤ 480px) —— 进一步紧凑化\r\n ═══════════════════════════════════════════════════════════════════ */\r\n @media (max-width: 480px) {\r\n :host {\r\n --md-spacing-lg: 16px;\r\n --md-spacing-xl: 22px;\r\n /* 超小屏下水平内边距收紧,避免内容溢出 */\r\n --md-button-padding-horizontal: 16px;\r\n --md-input-padding-horizontal: 12px;\r\n --md-select-trigger-padding-horizontal: 12px;\r\n }\r\n }\r\n\r\n :host([data-theme='dark']) {\r\n /* 基础颜色 */\r\n --md-color-text: rgba(255, 255, 255, 0.92);\r\n --md-color-text-secondary: rgba(255, 255, 255, 0.55);\r\n --md-color-border: rgba(255, 255, 255, 0.1);\r\n --md-color-bg: rgba(30, 30, 30, 0.95);\r\n --md-color-bg-secondary: rgba(255, 255, 255, 0.05);\r\n\r\n /* Glass 毛玻璃 */\r\n --md-glass-menu-bg: rgba(40, 40, 40, 0.85);\r\n --md-glass-separator: rgba(255, 255, 255, 0.08);\r\n\r\n /* macOS 风格 */\r\n --md-mac-text-primary: rgba(255, 255, 255, 0.92);\r\n\r\n /* DataTable 暗色模式 */\r\n --md-data-table-row-hover-bg: rgba(255, 255, 255, 0.06);\r\n --md-data-table-row-selected-bg: rgba(0, 122, 255, 0.16);\r\n --md-data-table-row-selected-hover-bg: rgba(0, 122, 255, 0.22);\r\n --md-data-table-row-striped-bg: rgba(255, 255, 255, 0.03);\r\n --md-data-table-pagination-item-hover-bg: rgba(255, 255, 255, 0.08);\r\n }\r\n`\r\n","import { html, css, nothing } from 'lit'\r\nimport { property, customElement } from 'lit/decorators.js'\r\nimport { BaseElement } from '../../internal/base-element'\r\nimport { sharedStyles } from '../../styles/shared-styles'\r\nimport { themeTokens } from '../../styles/theme'\r\n\r\n/**\r\n * @tag mac-button\r\n * @summary 一个多功能的按钮组件。\r\n *\r\n * @slot - 按钮的文本标签。\r\n * @slot prefix - 标签前的内容。\r\n * @slot suffix - 标签后的内容。\r\n *\r\n * @csspart base - 按钮的基础容器。\r\n * @csspart label - 按钮的标签。\r\n * @csspart prefix - 前缀容器。\r\n * @csspart suffix - 后缀容器。\r\n *\r\n * @event mac-click - 点击按钮时触发。\r\n */\r\n@customElement('mac-button')\r\nexport class MacButton extends BaseElement {\r\n static override styles = [\r\n themeTokens,\r\n sharedStyles,\r\n css`\r\n :host {\r\n display: inline-block;\r\n }\r\n\r\n .button {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n gap: var(--md-button-gap);\r\n padding: var(--md-button-padding-vertical) var(--md-button-padding-horizontal);\r\n font-size: var(--md-button-font-size);\r\n font-family: inherit;\r\n line-height: 1.5;\r\n border-radius: var(--md-button-radius);\r\n border: 1px solid transparent;\r\n cursor: pointer;\r\n transition: all var(--md-transition-fast);\r\n user-select: none;\r\n white-space: nowrap;\r\n }\r\n\r\n .button:focus-visible {\r\n outline: 2px solid var(--md-color-primary);\r\n outline-offset: 2px;\r\n }\r\n\r\n /* 变体 */\r\n .button--primary {\r\n background-color: var(--md-color-primary);\r\n color: #fff;\r\n }\r\n\r\n .button--primary:hover {\r\n background-color: var(--md-color-primary-hover);\r\n }\r\n\r\n .button--primary:active {\r\n background-color: var(--md-color-primary-active);\r\n }\r\n\r\n .button--secondary {\r\n background-color: transparent;\r\n color: var(--md-color-text);\r\n border-color: var(--md-color-border);\r\n }\r\n\r\n .button--secondary:hover {\r\n color: var(--md-color-primary);\r\n border-color: var(--md-color-primary);\r\n }\r\n\r\n .button--text {\r\n background-color: transparent;\r\n color: var(--md-color-text);\r\n padding: var(--md-button-padding-vertical) var(--md-button-padding-vertical);\r\n }\r\n\r\n .button--text:hover {\r\n color: var(--md-color-primary);\r\n background-color: var(--md-color-bg-secondary);\r\n }\r\n\r\n /* 尺寸 */\r\n .button--sm {\r\n padding: var(--sm-button-padding-vertical) var(--sm-button-padding-horizontal);\r\n font-size: var(--sm-button-font-size);\r\n gap: var(--sm-button-gap);\r\n border-radius: var(--sm-button-radius);\r\n }\r\n\r\n .button--lg {\r\n padding: var(--lg-button-padding-vertical) var(--lg-button-padding-horizontal);\r\n font-size: var(--lg-button-font-size);\r\n gap: var(--lg-button-gap);\r\n border-radius: var(--lg-button-radius);\r\n }\r\n\r\n /* 禁用 */\r\n .button:disabled {\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n pointer-events: none;\r\n }\r\n\r\n /* 加载中 */\r\n .button--loading {\r\n pointer-events: none;\r\n }\r\n\r\n .spinner {\r\n width: 14px;\r\n height: 14px;\r\n border: 2px solid currentColor;\r\n border-right-color: transparent;\r\n border-radius: 50%;\r\n animation: spin 0.6s linear infinite;\r\n }\r\n\r\n @keyframes spin {\r\n to {\r\n transform: rotate(360deg);\r\n }\r\n }\r\n `,\r\n ]\r\n\r\n /** 按钮的变体样式。 */\r\n @property({ reflect: true }) variant: 'primary' | 'secondary' | 'text' = 'primary'\r\n\r\n /** 按钮的尺寸。 */\r\n @property({ reflect: true }) size?: 'sm' | 'md' | 'lg'\r\n\r\n /** 禁用按钮。 */\r\n @property({ type: Boolean, reflect: true }) disabled = false\r\n\r\n /** 显示加载动画。 */\r\n @property({ type: Boolean, reflect: true }) loading = false\r\n\r\n /** 按钮的类型(表单行为)。 */\r\n @property() type: 'button' | 'submit' | 'reset' = 'button'\r\n\r\n override willUpdate() {\r\n const size = this._resolvedSize\r\n if (this.getAttribute('size') !== size) {\r\n this.setAttribute('size', size)\r\n }\r\n const theme = this._resolvedTheme\r\n if (theme) {\r\n this.setAttribute('data-theme', theme)\r\n } else {\r\n this.removeAttribute('data-theme')\r\n }\r\n }\r\n\r\n override render() {\r\n const isDisabled = this.disabled || this.loading\r\n const size = this._resolvedSize\r\n\r\n return html`\r\n <button\r\n part=\"base\"\r\n class=\"button button--${this.variant} button--${size} ${\r\n this.loading ? 'button--loading' : ''\r\n }\"\r\n ?disabled=${isDisabled}\r\n type=${this.type}\r\n @click=${this._handleClick}\r\n >\r\n ${this.loading ? html`<span class=\"spinner\" part=\"spinner\"></span>` : nothing}\r\n <slot name=\"prefix\" part=\"prefix\"></slot>\r\n <slot part=\"label\"></slot>\r\n <slot name=\"suffix\" part=\"suffix\"></slot>\r\n </button>\r\n `\r\n }\r\n\r\n private _handleClick() {\r\n this.emit('mac-click')\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'mac-button': MacButton\r\n }\r\n}\r\n","import { html, css } from 'lit'\r\nimport { property, customElement } from 'lit/decorators.js'\r\nimport { BaseElement } from '../../internal/base-element'\r\nimport { sharedStyles } from '../../styles/shared-styles'\r\nimport { themeTokens } from '../../styles/theme'\r\n\r\n/**\r\n * @tag mac-card\r\n * @summary macOS 风格的卡片容器组件。\r\n *\r\n * @slot - 卡片的主体内容。\r\n * @slot header - 卡片的头部。\r\n * @slot footer - 卡片的底部。\r\n * @slot media - 卡片的媒体区域(顶部)。\r\n *\r\n * @csspart base - 卡片的基础容器。\r\n * @csspart header - 头部容器。\r\n * @csspart body - 主体容器。\r\n * @csspart footer - 底部容器。\r\n * @csspart media - 媒体容器。\r\n */\r\n@customElement('mac-card')\r\nexport class MacCard extends BaseElement {\r\n static override styles = [\r\n themeTokens,\r\n sharedStyles,\r\n css`\r\n :host {\r\n display: block;\r\n }\r\n\r\n /* ════════════════════════════════════════════════════════\r\n 卡片基础容器\r\n ════════════════════════════════════════════════════════ */\r\n .card {\r\n position: relative;\r\n background-color: var(--md-color-bg);\r\n border-radius: 12px;\r\n overflow: hidden;\r\n transition:\r\n transform 240ms cubic-bezier(0.34, 1.56, 0.64, 1),\r\n box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1),\r\n border-color 200ms ease,\r\n background-color 200ms ease;\r\n }\r\n\r\n /* ════════════════════════════════════════════════════════\r\n 变体:默认\r\n ════════════════════════════════════════════════════════ */\r\n .card--default {\r\n border: 1px solid rgba(0, 0, 0, 0.06);\r\n box-shadow:\r\n 0 0.5px 1px rgba(0, 0, 0, 0.04),\r\n 0 1px 2px rgba(0, 0, 0, 0.04),\r\n 0 2px 4px rgba(0, 0, 0, 0.02);\r\n }\r\n\r\n /* ════════════════════════════════════════════════════════\r\n 变体:悬浮\r\n ════════════════════════════════════════════════════════ */\r\n .card--elevated {\r\n border: none;\r\n box-shadow:\r\n 0 1px 1px rgba(0, 0, 0, 0.02),\r\n 0 2px 2px rgba(0, 0, 0, 0.02),\r\n 0 4px 4px rgba(0, 0, 0, 0.02),\r\n 0 8px 8px rgba(0, 0, 0, 0.02),\r\n 0 16px 16px rgba(0, 0, 0, 0.02),\r\n 0 0 0 1px rgba(0, 0, 0, 0.03);\r\n }\r\n\r\n /* ════════════════════════════════════════════════════════\r\n 变体:毛玻璃\r\n ════════════════════════════════════════════════════════ */\r\n .card--glass {\r\n background: rgba(255, 255, 255, 0.72);\r\n backdrop-filter: blur(20px) saturate(180%);\r\n -webkit-backdrop-filter: blur(20px) saturate(180%);\r\n border: 1px solid rgba(255, 255, 255, 0.2);\r\n box-shadow:\r\n inset 0 1px 0 rgba(255, 255, 255, 0.4),\r\n inset 0 -1px 0 rgba(0, 0, 0, 0.02),\r\n 0 1px 3px rgba(0, 0, 0, 0.06),\r\n 0 8px 24px rgba(0, 0, 0, 0.08);\r\n }\r\n\r\n /* ════════════════════════════════════════════════════════\r\n 变体:描边\r\n ════════════════════════════════════════════════════════ */\r\n .card--outlined {\r\n background: transparent;\r\n border: 1.5px solid rgba(0, 0, 0, 0.08);\r\n box-shadow: none;\r\n }\r\n\r\n /* ════════════════════════════════════════════════════════\r\n 变体:渐变\r\n ════════════════════════════════════════════════════════ */\r\n .card--gradient {\r\n border: none;\r\n background: linear-gradient(\r\n 135deg,\r\n rgba(0, 122, 255, 0.06) 0%,\r\n rgba(88, 86, 214, 0.06) 50%,\r\n rgba(191, 90, 242, 0.06) 100%\r\n );\r\n box-shadow:\r\n 0 1px 2px rgba(0, 122, 255, 0.04),\r\n 0 4px 12px rgba(0, 122, 255, 0.06),\r\n inset 0 1px 0 rgba(255, 255, 255, 0.6);\r\n }\r\n\r\n /* ════════════════════════════════════════════════════════\r\n 悬停效果 - 按变体区分\r\n ════════════════════════════════════════════════════════ */\r\n .card--hoverable:hover {\r\n transform: translateY(-4px) scale(1.01);\r\n }\r\n\r\n .card--default.card--hoverable:hover {\r\n border-color: rgba(0, 122, 255, 0.2);\r\n box-shadow:\r\n 0 4px 8px rgba(0, 0, 0, 0.04),\r\n 0 8px 16px rgba(0, 0, 0, 0.04),\r\n 0 16px 32px rgba(0, 0, 0, 0.04);\r\n }\r\n\r\n .card--elevated.card--hoverable:hover {\r\n box-shadow:\r\n 0 2px 2px rgba(0, 0, 0, 0.02),\r\n 0 4px 4px rgba(0, 0, 0, 0.02),\r\n 0 8px 8px rgba(0, 0, 0, 0.02),\r\n 0 16px 16px rgba(0, 0, 0, 0.02),\r\n 0 32px 32px rgba(0, 0, 0, 0.04),\r\n 0 0 0 1px rgba(0, 122, 255, 0.1);\r\n }\r\n\r\n .card--glass.card--hoverable:hover {\r\n background: rgba(255, 255, 255, 0.82);\r\n border-color: rgba(255, 255, 255, 0.3);\r\n box-shadow:\r\n inset 0 1px 0 rgba(255, 255, 255, 0.5),\r\n 0 4px 12px rgba(0, 0, 0, 0.08),\r\n 0 16px 48px rgba(0, 0, 0, 0.12);\r\n }\r\n\r\n .card--outlined.card--hoverable:hover {\r\n border-color: var(--md-color-primary);\r\n border-width: 2px;\r\n box-shadow: 0 0 0 3px rgba(0, 122, 255, 0.1);\r\n }\r\n\r\n .card--gradient.card--hoverable:hover {\r\n background: linear-gradient(\r\n 135deg,\r\n rgba(0, 122, 255, 0.1) 0%,\r\n rgba(88, 86, 214, 0.1) 50%,\r\n rgba(191, 90, 242, 0.1) 100%\r\n );\r\n box-shadow:\r\n 0 4px 16px rgba(0, 122, 255, 0.12),\r\n 0 8px 32px rgba(88, 86, 214, 0.08),\r\n inset 0 1px 0 rgba(255, 255, 255, 0.7);\r\n }\r\n\r\n /* ════════════════════════════════════════════════════════\r\n 可点击 / 激活状态\r\n ════════════════════════════════════════════════════════ */\r\n .card--clickable {\r\n cursor: pointer;\r\n user-select: none;\r\n }\r\n\r\n .card--clickable:active {\r\n transform: translateY(0) scale(0.98);\r\n transition:\r\n transform 120ms cubic-bezier(0.34, 1.56, 0.64, 1),\r\n box-shadow 120ms ease;\r\n }\r\n\r\n .card--clickable:focus-visible {\r\n outline: none;\r\n box-shadow:\r\n 0 0 0 3px rgba(0, 122, 255, 0.2),\r\n 0 1px 3px rgba(0, 0, 0, 0.04),\r\n 0 4px 8px rgba(0, 0, 0, 0.02);\r\n }\r\n\r\n /* ════════════════════════════════════════════════════════\r\n 媒体区域\r\n ════════════════════════════════════════════════════════ */\r\n .card__media {\r\n position: relative;\r\n overflow: hidden;\r\n background: linear-gradient(135deg, #f8fafc 0%, #e2e8f0 50%, #f1f5f9 100%);\r\n }\r\n\r\n .card__media::before {\r\n content: '';\r\n position: absolute;\r\n inset: 0;\r\n background: linear-gradient(\r\n 180deg,\r\n transparent 0%,\r\n transparent 50%,\r\n rgba(0, 0, 0, 0.02) 100%\r\n );\r\n pointer-events: none;\r\n z-index: 1;\r\n }\r\n\r\n .card--hoverable:hover .card__media::after {\r\n content: '';\r\n position: absolute;\r\n inset: 0;\r\n background: rgba(0, 122, 255, 0.04);\r\n pointer-events: none;\r\n z-index: 2;\r\n }\r\n\r\n .card__media--ratio-16-9 {\r\n padding-bottom: 56.25%;\r\n }\r\n\r\n .card__media--ratio-4-3 {\r\n padding-bottom: 75%;\r\n }\r\n\r\n .card__media--ratio-1-1 {\r\n padding-bottom: 100%;\r\n }\r\n\r\n .card__media-content {\r\n position: absolute;\r\n inset: 0;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n z-index: 0;\r\n }\r\n\r\n .card__media-content ::slotted(img) {\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n transition: transform 320ms cubic-bezier(0.34, 1.56, 0.64, 1);\r\n }\r\n\r\n .card--hoverable:hover .card__media-content ::slotted(img) {\r\n transform: scale(1.03);\r\n }\r\n\r\n /* ════════════════════════════════════════════════════════\r\n 头部区域\r\n ════════════════════════════════════════════════════════ */\r\n ::slotted([slot='header']) {\r\n display: block;\r\n }\r\n\r\n .card__header-wrapper {\r\n padding: 16px 20px 12px;\r\n border-bottom: 1px solid rgba(0, 0, 0, 0.04);\r\n background: linear-gradient(180deg, rgba(255, 255, 255, 0.5) 0%, transparent 100%);\r\n }\r\n\r\n /* ════════════════════════════════════════════════════════\r\n 主体区域\r\n ════════════════════════════════════════════════════════ */\r\n .card__body {\r\n padding: 20px;\r\n line-height: 1.6;\r\n color: var(--md-color-text);\r\n }\r\n\r\n .card__body ::slotted(h1),\r\n .card__body ::slotted(h2),\r\n .card__body ::slotted(h3) {\r\n margin: 0 0 8px;\r\n font-weight: 600;\r\n color: var(--md-color-text);\r\n }\r\n\r\n .card__body ::slotted(p) {\r\n margin: 0 0 12px;\r\n color: var(--md-color-text-secondary);\r\n }\r\n\r\n .card__body ::slotted(p:last-child) {\r\n margin-bottom: 0;\r\n }\r\n\r\n /* ════════════════════════════════════════════════════════\r\n 底部区域\r\n ════════════════════════════════════════════════════════ */\r\n ::slotted([slot='footer']) {\r\n display: block;\r\n }\r\n\r\n .card__footer-wrapper {\r\n padding: 12px 20px 16px;\r\n border-top: 1px solid rgba(0, 0, 0, 0.04);\r\n background: linear-gradient(180deg, transparent 0%, rgba(0, 0, 0, 0.01) 100%);\r\n }\r\n\r\n /* 毛玻璃变体头部/底部 */\r\n .card--glass .card__header-wrapper,\r\n .card--glass .card__footer-wrapper {\r\n border-color: rgba(255, 255, 255, 0.1);\r\n background: rgba(255, 255, 255, 0.08);\r\n }\r\n\r\n /* 渐变变体头部/底部 */\r\n .card--gradient .card__header-wrapper {\r\n border-color: rgba(0, 122, 255, 0.08);\r\n background: rgba(255, 255, 255, 0.3);\r\n }\r\n\r\n .card--gradient .card__footer-wrapper {\r\n border-color: rgba(191, 90, 242, 0.08);\r\n background: rgba(255, 255, 255, 0.2);\r\n }\r\n\r\n /* ════════════════════════════════════════════════════════\r\n 强调边框\r\n ════════════════════════════════════════════════════════ */\r\n .card--accent-top::before {\r\n content: '';\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n height: 3px;\r\n background: linear-gradient(90deg, #007aff 0%, #5856d6 50%, #bf5af2 100%);\r\n border-radius: 12px 12px 0 0;\r\n z-index: 10;\r\n }\r\n\r\n .card--accent-left::before {\r\n content: '';\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n bottom: 0;\r\n width: 3px;\r\n background: linear-gradient(180deg, #007aff 0%, #5856d6 50%, #bf5af2 100%);\r\n border-radius: 12px 0 0 12px;\r\n z-index: 10;\r\n }\r\n\r\n /* ════════════════════════════════════════════════════════\r\n 加载状态\r\n ════════════════════════════════════════════════════════ */\r\n .card--loading {\r\n pointer-events: none;\r\n }\r\n\r\n .card--loading .card__body,\r\n .card--loading ::slotted([slot='header']),\r\n .card--loading ::slotted([slot='footer']) {\r\n position: relative;\r\n color: transparent !important;\r\n }\r\n\r\n .card--loading .card__body::before,\r\n .card--loading ::slotted([slot='header'])::before,\r\n .card--loading ::slotted([slot='footer'])::before {\r\n content: '';\r\n position: absolute;\r\n inset: 0;\r\n background: linear-gradient(\r\n 90deg,\r\n rgba(0, 0, 0, 0.02) 0%,\r\n rgba(0, 0, 0, 0.06) 20%,\r\n rgba(0, 0, 0, 0.1) 40%,\r\n rgba(0, 0, 0, 0.06) 60%,\r\n rgba(0, 0, 0, 0.02) 100%\r\n );\r\n background-size: 200% 100%;\r\n animation: shimmer 1.8s ease-in-out infinite;\r\n border-radius: 6px;\r\n }\r\n\r\n @keyframes shimmer {\r\n 0% {\r\n background-position: 200% 0;\r\n }\r\n 100% {\r\n background-position: -200% 0;\r\n }\r\n }\r\n\r\n /* ════════════════════════════════════════════════════════\r\n 响应式设计\r\n ════════════════════════════════════════════════════════ */\r\n @media (max-width: 768px) {\r\n .card {\r\n border-radius: 10px;\r\n }\r\n\r\n .card__body {\r\n padding: 16px;\r\n }\r\n\r\n .card__header-wrapper {\r\n padding: 14px 16px 10px;\r\n }\r\n\r\n .card__footer-wrapper {\r\n padding: 10px 16px 14px;\r\n }\r\n\r\n .card--accent-top::before {\r\n height: 2.5px;\r\n }\r\n\r\n .card--accent-left::before {\r\n width: 2.5px;\r\n }\r\n\r\n /* 在移动端减少变换强度 */\r\n .card--hoverable:hover {\r\n transform: translateY(-2px) scale(1.005);\r\n }\r\n\r\n .card--clickable:active {\r\n transform: scale(0.99);\r\n }\r\n }\r\n\r\n @media (max-width: 480px) {\r\n .card__body {\r\n padding: 14px;\r\n }\r\n\r\n .card__header-wrapper {\r\n padding: 12px 14px 8px;\r\n }\r\n\r\n .card__footer-wrapper {\r\n padding: 8px 14px 12px;\r\n }\r\n }\r\n\r\n /* ════════════════════════════════════════════════════════\r\n 暗黑模式\r\n ════════════════════════════════════════════════════════ */\r\n :host([data-theme='dark']) .card--default {\r\n background: rgba(255, 255, 255, 0.04);\r\n border-color: rgba(255, 255, 255, 0.08);\r\n box-shadow:\r\n 0 1px 2px rgba(0, 0, 0, 0.2),\r\n 0 2px 4px rgba(0, 0, 0, 0.15);\r\n }\r\n\r\n :host([data-theme='dark']) .card--elevated {\r\n background: rgba(255, 255, 255, 0.06);\r\n box-shadow:\r\n 0 2px 2px rgba(0, 0, 0, 0.1),\r\n 0 4px 4px rgba(0, 0, 0, 0.1),\r\n 0 8px 8px rgba(0, 0, 0, 0.08),\r\n 0 16px 16px rgba(0, 0, 0, 0.06),\r\n 0 0 0 1px rgba(255, 255, 255, 0.04);\r\n }\r\n\r\n :host([data-theme='dark']) .card--glass {\r\n background: rgba(30, 30, 30, 0.72);\r\n border-color: rgba(255, 255, 255, 0.08);\r\n box-shadow:\r\n inset 0 1px 0 rgba(255, 255, 255, 0.06),\r\n 0 4px 16px rgba(0, 0, 0, 0.3);\r\n }\r\n\r\n :host([data-theme='dark']) .card--outlined {\r\n border-color: rgba(255, 255, 255, 0.12);\r\n }\r\n\r\n :host([data-theme='dark']) .card--gradient {\r\n background: linear-gradient(\r\n 135deg,\r\n rgba(0, 122, 255, 0.12) 0%,\r\n rgba(88, 86, 214, 0.12) 50%,\r\n rgba(191, 90, 242, 0.12) 100%\r\n );\r\n box-shadow:\r\n 0 2px 8px rgba(0, 122, 255, 0.1),\r\n inset 0 1px 0 rgba(255, 255, 255, 0.08);\r\n }\r\n\r\n :host([data-theme='dark']) .card--default.card--hoverable:hover {\r\n border-color: rgba(0, 122, 255, 0.3);\r\n box-shadow:\r\n 0 4px 8px rgba(0, 0, 0, 0.25),\r\n 0 8px 16px rgba(0, 0, 0, 0.2);\r\n }\r\n\r\n :host([data-theme='dark']) .card--elevated.card--hoverable:hover {\r\n box-shadow:\r\n 0 4px 4px rgba(0, 0, 0, 0.15),\r\n 0 8px 8px rgba(0, 0, 0, 0.12),\r\n 0 16px 16px rgba(0, 0, 0, 0.1),\r\n 0 32px 32px rgba(0, 0, 0, 0.08),\r\n 0 0 0 1px rgba(0, 122, 255, 0.15);\r\n }\r\n\r\n :host([data-theme='dark']) .card--glass.card--hoverable:hover {\r\n background: rgba(40, 40, 40, 0.82);\r\n border-color: rgba(255, 255, 255, 0.12);\r\n box-shadow:\r\n inset 0 1px 0 rgba(255, 255, 255, 0.1),\r\n 0 8px 24px rgba(0, 0, 0, 0.4);\r\n }\r\n\r\n :host([data-theme='dark']) .card--outlined.card--hoverable:hover {\r\n border-color: var(--md-color-primary);\r\n }\r\n\r\n :host([data-theme='dark']) .card--gradient.card--hoverable:hover {\r\n background: linear-gradient(\r\n 135deg,\r\n rgba(0, 122, 255, 0.18) 0%,\r\n rgba(88, 86, 214, 0.18) 50%,\r\n rgba(191, 90, 242, 0.18) 100%\r\n );\r\n }\r\n\r\n :host([data-theme='dark']) .card__header-wrapper,\r\n :host([data-theme='dark']) .card__footer-wrapper {\r\n border-color: rgba(255, 255, 255, 0.06);\r\n background: rgba(255, 255, 255, 0.02);\r\n }\r\n\r\n :host([data-theme='dark']) .card--glass .card__header-wrapper,\r\n :host([data-theme='dark']) .card--glass .card__footer-wrapper {\r\n border-color: rgba(255, 255, 255, 0.06);\r\n background: rgba(255, 255, 255, 0.04);\r\n }\r\n\r\n :host([data-theme='dark']) .card__media {\r\n background: linear-gradient(135deg, #1a1a2e 0%, #16213e 50%, #1a1a2e 100%);\r\n }\r\n\r\n :host([data-theme='dark']) .card--loading .card__body::before,\r\n :host([data-theme='dark']) .card--loading ::slotted([slot='header'])::before,\r\n :host([data-theme='dark']) .card--loading ::slotted([slot='footer'])::before {\r\n background: linear-gradient(\r\n 90deg,\r\n rgba(255, 255, 255, 0.02) 0%,\r\n rgba(255, 255, 255, 0.06) 20%,\r\n rgba(255, 255, 255, 0.1) 40%,\r\n rgba(255, 255, 255, 0.06) 60%,\r\n rgba(255, 255, 255, 0.02) 100%\r\n );\r\n background-size: 200% 100%;\r\n }\r\n\r\n :host([data-theme='dark']) .card--accent-top::before {\r\n background: linear-gradient(90deg, #0a84ff 0%, #5e5ce6 50%, #bf5af2 100%);\r\n }\r\n\r\n :host([data-theme='dark']) .card--accent-left::before {\r\n background: linear-gradient(180deg, #0a84ff 0%, #5e5ce6 50%, #bf5af2 100%);\r\n }\r\n\r\n :host([data-theme='dark']) .card--clickable:focus-visible {\r\n box-shadow:\r\n 0 0 0 3px rgba(10, 132, 255, 0.3),\r\n 0 2px 4px rgba(0, 0, 0, 0.2);\r\n }\r\n `,\r\n ]\r\n\r\n /** 卡片的视觉变体。 */\r\n @property({ reflect: true }) variant: 'default' | 'elevated' | 'glass' | 'outlined' | 'gradient' =\r\n 'default'\r\n\r\n /** 卡片是否有悬停效果。 */\r\n @property({ type: Boolean, reflect: true }) hoverable = false\r\n\r\n /** 卡片是否可点击。 */\r\n @property({ type: Boolean, reflect: true }) clickable = false\r\n\r\n /** 显示加载状态。 */\r\n @property({ type: Boolean, reflect: true }) loading = false\r\n\r\n /** 添加强调边框。 */\r\n @property({ reflect: true }) accent?: 'top' | 'left'\r\n\r\n /** 媒体宽高比。 */\r\n @property({ reflect: true }) mediaRatio?: '16-9' | '4-3' | '1-1'\r\n\r\n override willUpdate() {\r\n const theme = this._resolvedTheme\r\n if (theme) {\r\n this.setAttribute('data-theme', theme)\r\n } else {\r\n this.removeAttribute('data-theme')\r\n }\r\n }\r\n\r\n override render() {\r\n const classes = [\r\n 'card',\r\n `card--${this.variant}`,\r\n this.hoverable ? 'card--hoverable' : '',\r\n this.clickable ? 'card--clickable' : '',\r\n this.loading ? 'card--loading' : '',\r\n this.accent ? `card--accent-${this.accent}` : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ')\r\n\r\n return html`\r\n <div part=\"base\" class=${classes}>\r\n <div\r\n part=\"media\"\r\n class=\"card__media ${this.mediaRatio ? `card__media--ratio-${this.mediaRatio}` : ''}\"\r\n >\r\n <div class=\"card__media-content\">\r\n <slot name=\"media\"></slot>\r\n </div>\r\n </div>\r\n <div class=\"card__header-wrapper\" part=\"header\">\r\n <slot name=\"header\"></slot>\r\n </div>\r\n <div class=\"card__body\" part=\"body\">\r\n <slot></slot>\r\n </div>\r\n <div class=\"card__footer-wrapper\" part=\"footer\">\r\n <slot name=\"footer\"></slot>\r\n </div>\r\n </div>\r\n `\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'mac-card': MacCard\r\n }\r\n}\r\n","import { html, css, nothing } from 'lit'\r\nimport { property, customElement, state, query } from 'lit/decorators.js'\r\nimport { BaseElement } from '../../internal/base-element'\r\nimport { sharedStyles } from '../../styles/shared-styles'\r\nimport { themeTokens } from '../../styles/theme'\r\n\r\n/**\r\n * @tag mac-input\r\n * @summary macOS 风格的文本输入组件。\r\n *\r\n * @slot prefix - 输入框前的内容。\r\n * @slot suffix - 输入框后的内容。\r\n *\r\n * @csspart base - 输入框的基础容器。\r\n * @csspart input - 原生输入元素。\r\n * @csspart label - 标签元素。\r\n * @csspart helper-text - 辅助文本元素。\r\n */\r\n@customElement('mac-input')\r\nexport class MacInput extends BaseElement {\r\n static override styles = [\r\n themeTokens,\r\n sharedStyles,\r\n css`\r\n :host {\r\n display: block;\r\n }\r\n\r\n .input-wrapper {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--md-spacing-xs);\r\n }\r\n\r\n /* 变体 */\r\n .input-container {\r\n position: relative;\r\n display: flex;\r\n align-items: center;\r\n border-radius: var(--md-radius-md);\r\n background-color: var(--md-color-bg);\r\n transition: all 200ms cubic-bezier(0.4, 0, 0.2, 1);\r\n overflow: hidden;\r\n }\r\n\r\n .input-container--default {\r\n border: 1px solid var(--md-color-border);\r\n }\r\n\r\n .input-container--filled {\r\n border: none;\r\n background: rgba(0, 0, 0, 0.03);\r\n }\r\n\r\n .input-container--glass {\r\n border: 1px solid rgba(255, 255, 255, 0.2);\r\n background: rgba(255, 255, 255, 0.08);\r\n backdrop-filter: blur(10px) saturate(180%);\r\n -webkit-backdrop-filter: blur(10px) saturate(180%);\r\n }\r\n\r\n .input-container--underline {\r\n border: none;\r\n border-bottom: 2px solid var(--md-color-border);\r\n border-radius: 0;\r\n background: transparent;\r\n }\r\n\r\n /* 聚焦状态 */\r\n .input-container--default:focus-within {\r\n border-color: var(--md-color-primary);\r\n box-shadow:\r\n 0 0 0 3px rgba(0, 122, 255, 0.1),\r\n 0 2px 8px rgba(0, 122, 255, 0.08);\r\n }\r\n\r\n .input-container--filled:focus-within {\r\n background: rgba(0, 0, 0, 0.05);\r\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\r\n }\r\n\r\n .input-container--glass:focus-within {\r\n border-color: rgba(0, 122, 255, 0.5);\r\n background: rgba(255, 255, 255, 0.12);\r\n box-shadow:\r\n 0 0 0 3px rgba(0, 122, 255, 0.15),\r\n 0 4px 12px rgba(0, 0, 0, 0.15);\r\n }\r\n\r\n .input-container--underline:focus-within {\r\n border-bottom-color: var(--md-color-primary);\r\n box-shadow: none;\r\n }\r\n\r\n /* 错误状态 */\r\n .input-container--error.input-container--default {\r\n border-color: var(--md-color-danger);\r\n }\r\n\r\n .input-container--error.input-container--default:focus-within {\r\n box-shadow:\r\n 0 0 0 3px rgba(255, 59, 48, 0.1),\r\n 0 2px 8px rgba(255, 59, 48, 0.08);\r\n }\r\n\r\n .input-container--error.input-container--underline {\r\n border-bottom-color: var(--md-color-danger);\r\n }\r\n\r\n /* 成功状态 */\r\n .input-container--success.input-container--default {\r\n border-color: var(--md-color-success);\r\n }\r\n\r\n .input-container--success.input-container--default:focus-within {\r\n box-shadow:\r\n 0 0 0 3px rgba(52, 199, 89, 0.1),\r\n 0 2px 8px rgba(52, 199, 89, 0.08);\r\n }\r\n\r\n .input-container--success.input-container--underline {\r\n border-bottom-color: var(--md-color-success);\r\n }\r\n\r\n /* 禁用状态 */\r\n .input-container--disabled {\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n background-color: var(--md-color-bg-secondary);\r\n }\r\n\r\n /* 输入框 */\r\n .input {\r\n flex: 1;\r\n border: none;\r\n outline: none;\r\n padding: var(--md-input-padding-vertical) var(--md-input-padding-horizontal);\r\n font-size: var(--md-input-font-size);\r\n font-family: inherit;\r\n color: var(--md-color-text);\r\n background: transparent;\r\n min-width: 0;\r\n }\r\n\r\n .input::placeholder {\r\n color: var(--md-color-text-secondary);\r\n transition: opacity 200ms;\r\n }\r\n\r\n .input:focus::placeholder {\r\n opacity: 0.6;\r\n }\r\n\r\n .input:disabled {\r\n cursor: not-allowed;\r\n }\r\n\r\n /* 插槽 */\r\n ::slotted([slot='prefix']),\r\n ::slotted([slot='suffix']) {\r\n display: flex;\r\n align-items: center;\r\n padding: 0 var(--md-spacing-sm);\r\n color: var(--md-color-text-secondary);\r\n }\r\n\r\n /* 标签 */\r\n .label {\r\n font-size: var(--md-font-size-base);\r\n color: var(--md-color-text);\r\n font-weight: 500;\r\n transition: color 200ms;\r\n }\r\n\r\n .label--required::after {\r\n content: ' *';\r\n color: var(--md-color-danger);\r\n }\r\n\r\n /* 浮动标签 */\r\n .input-wrapper--floating {\r\n position: relative;\r\n }\r\n\r\n .input-wrapper--floating .input-container {\r\n padding-top: 20px;\r\n }\r\n\r\n .input-wrapper--floating .input {\r\n padding-top: 8px;\r\n }\r\n\r\n .floating-label {\r\n position: absolute;\r\n left: var(--md-spacing-md);\r\n top: 50%;\r\n transform: translateY(-50%);\r\n font-size: var(--md-font-size-base);\r\n color: var(--md-color-text-secondary);\r\n pointer-events: none;\r\n transition: all 200ms cubic-bezier(0.4, 0, 0.2, 1);\r\n background: transparent;\r\n padding: 0 4px;\r\n }\r\n\r\n .input-wrapper--floating .input:focus ~ .floating-label,\r\n .input-wrapper--floating .input:not(:placeholder-shown) ~ .floating-label {\r\n top: 12px;\r\n transform: translateY(0);\r\n font-size: 12px;\r\n color: var(--md-color-primary);\r\n }\r\n\r\n .input-wrapper--floating .input-container--error .input:focus ~ .floating-label,\r\n .input-wrapper--floating\r\n .input-container--error\r\n .input:not(:placeholder-shown)\r\n ~ .floating-label {\r\n color: var(--md-color-danger);\r\n }\r\n\r\n /* 辅助文本 */\r\n .helper-text {\r\n font-size: var(--md-font-size-sm);\r\n color: var(--md-color-text-secondary);\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n }\r\n\r\n .helper-text--error {\r\n color: var(--md-color-danger);\r\n }\r\n\r\n .helper-text--success {\r\n color: var(--md-color-success);\r\n }\r\n\r\n /* 字符计数器 */\r\n .char-counter {\r\n font-size: 12px;\r\n color: var(--md-color-text-secondary);\r\n margin-left: auto;\r\n opacity: 0.7;\r\n }\r\n\r\n .char-counter--warning {\r\n color: var(--md-color-warning);\r\n }\r\n\r\n .char-counter--error {\r\n color: var(--md-color-danger);\r\n }\r\n\r\n /* 清除按钮 */\r\n .clear-button {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 20px;\r\n height: 20px;\r\n margin-right: var(--md-spacing-sm);\r\n border: none;\r\n background: rgba(0, 0, 0, 0.06);\r\n border-radius: 50%;\r\n cursor: pointer;\r\n color: var(--md-color-text-secondary);\r\n font-size: 12px;\r\n transition: all 200ms;\r\n padding: 0;\r\n }\r\n\r\n .clear-button:hover {\r\n background: rgba(0, 0, 0, 0.1);\r\n color: var(--md-color-text);\r\n }\r\n\r\n /* 密码切换 */\r\n .password-toggle {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 24px;\r\n height: 24px;\r\n margin-right: var(--md-spacing-sm);\r\n border: none;\r\n background: transparent;\r\n cursor: pointer;\r\n color: var(--md-color-text-secondary);\r\n font-size: 16px;\r\n transition: color 200ms;\r\n padding: 0;\r\n }\r\n\r\n .password-toggle:hover {\r\n color: var(--md-color-text);\r\n }\r\n\r\n /* 加载状态 */\r\n .input-container--loading {\r\n pointer-events: none;\r\n }\r\n\r\n .loading-spinner {\r\n display: inline-block;\r\n width: 16px;\r\n height: 16px;\r\n margin-right: var(--md-spacing-sm);\r\n border: 2px solid rgba(0, 0, 0, 0.1);\r\n border-top-color: var(--md-color-primary);\r\n border-radius: 50%;\r\n animation: spin 0.8s linear infinite;\r\n }\r\n\r\n @keyframes spin {\r\n to {\r\n transform: rotate(360deg);\r\n }\r\n }\r\n\r\n /* 尺寸 */\r\n .input-container--sm .input {\r\n padding: var(--sm-input-padding-vertical) var(--sm-input-padding-horizontal);\r\n font-size: var(--sm-input-font-size);\r\n }\r\n\r\n .input-container--lg .input {\r\n padding: var(--lg-input-padding-vertical) var(--lg-input-padding-horizontal);\r\n font-size: var(--lg-input-font-size);\r\n }\r\n\r\n :host([data-theme='dark']) .input-container--filled {\r\n background: rgba(255, 255, 255, 0.05);\r\n }\r\n\r\n :host([data-theme='dark']) .input-container--filled:focus-within {\r\n background: rgba(255, 255, 255, 0.08);\r\n }\r\n\r\n :host([data-theme='dark']) .input-container--glass {\r\n background: rgba(255, 255, 255, 0.05);\r\n }\r\n\r\n :host([data-theme='dark']) .input-container--glass:focus-within {\r\n background: rgba(255, 255, 255, 0.08);\r\n }\r\n\r\n :host([data-theme='dark']) .clear-button {\r\n background: rgba(255, 255, 255, 0.1);\r\n }\r\n\r\n :host([data-theme='dark']) .clear-button:hover {\r\n background: rgba(255, 255, 255, 0.15);\r\n }\r\n\r\n :host([data-theme='dark']) .loading-spinner {\r\n border-color: rgba(255, 255, 255, 0.2);\r\n border-top-color: var(--md-color-primary);\r\n }\r\n `,\r\n ]\r\n\r\n /** 输入框的值。 */\r\n @property({ type: String }) value = ''\r\n\r\n /** 输入框的占位符。 */\r\n @property() placeholder = ''\r\n\r\n /** 输入框的类型。 */\r\n @property() type: 'text' | 'password' | 'email' | 'number' | 'tel' | 'url' = 'text'\r\n\r\n /** 输入框的尺寸。 */\r\n @property({ reflect: true }) size?: 'sm' | 'md' | 'lg'\r\n\r\n /** 视觉变体。 */\r\n @property({ reflect: true }) variant: 'default' | 'filled' | 'glass' | 'underline' = 'default'\r\n\r\n /** 输入框的标签。 */\r\n @property() label = ''\r\n\r\n /** 显示必填指示器。 */\r\n @property({ type: Boolean }) required = false\r\n\r\n /** 禁用输入框。 */\r\n @property({ type: Boolean, reflect: true }) disabled = false\r\n\r\n /** 使输入框只读。 */\r\n @property({ type: Boolean }) readonly = false\r\n\r\n /** 输入框的错误状态。 */\r\n @property({ type: Boolean, reflect: true }) error = false\r\n\r\n /** 输入框的成功状态。 */\r\n @property({ type: Boolean, reflect: true }) success = false\r\n\r\n /** 输入框的辅助文本。 */\r\n @property({ attribute: 'helper-text' }) helperText = ''\r\n\r\n /** 输入框的名称(用于表单)。 */\r\n @property() name = ''\r\n\r\n /** 显示清除按钮。 */\r\n @property({ type: Boolean, attribute: 'clearable' }) clearable = false\r\n\r\n /** 显示密码切换按钮。 */\r\n @property({ type: Boolean, attribute: 'show-password-toggle' }) showPasswordToggle = false\r\n\r\n /** 显示字符计数器。 */\r\n @property({ type: Boolean, attribute: 'show-char-counter' }) showCharCounter = false\r\n\r\n /** 最大字符长度。 */\r\n @property({ type: Number, attribute: 'max-length' }) maxLength?: number\r\n\r\n /** 显示加载状态。 */\r\n @property({ type: Boolean, reflect: true }) loading = false\r\n\r\n /** 启用浮动标签。 */\r\n @property({ type: Boolean }) floating = false\r\n\r\n @state() private _hasFocus = false\r\n\r\n @state() private _showPassword = false\r\n\r\n @query('#input') private _input!: HTMLInputElement\r\n\r\n override willUpdate() {\r\n const size = this._resolvedSize\r\n if (this.getAttribute('size') !== size) {\r\n this.setAttribute('size', size)\r\n }\r\n const theme = this._resolvedTheme\r\n if (theme) {\r\n this.setAttribute('data-theme', theme)\r\n } else {\r\n this.removeAttribute('data-theme')\r\n }\r\n }\r\n\r\n override render() {\r\n const showClearButton = this.clearable && this.value && !this.disabled && !this.readonly\r\n const showPasswordToggle = this.showPasswordToggle && this.type === 'password' && !this.disabled\r\n const showCharCounter = this.showCharCounter && this.maxLength\r\n const charCount = this.value.length\r\n const isNearLimit = this.maxLength && charCount > this.maxLength * 0.8\r\n const isOverLimit = this.maxLength && charCount > this.maxLength\r\n\r\n const inputType = this.type === 'password' && this._showPassword ? 'text' : this.type\r\n const size = this._resolvedSize\r\n\r\n return html`\r\n <div class=\"input-wrapper ${this.floating ? 'input-wrapper--floating' : ''}\" part=\"base\">\r\n ${\r\n this.label && !this.floating\r\n ? html`\r\n <label\r\n class=\"label ${this.required ? 'label--required' : ''}\"\r\n part=\"label\"\r\n for=\"input\"\r\n >\r\n ${this.label}\r\n </label>\r\n `\r\n : nothing\r\n }\r\n <div\r\n class=\"input-container\r\n input-container--${this.variant}\r\n input-container--${size}\r\n ${this.error ? 'input-container--error' : ''}\r\n ${this.success ? 'input-container--success' : ''}\r\n ${this.disabled ? 'input-container--disabled' : ''}\r\n ${this.loading ? 'input-container--loading' : ''}\"\r\n >\r\n <slot name=\"prefix\"></slot>\r\n <input\r\n id=\"input\"\r\n part=\"input\"\r\n class=\"input\"\r\n type=${inputType}\r\n placeholder=${this.floating ? ' ' : this.placeholder}\r\n .value=${this.value}\r\n ?disabled=${this.disabled}\r\n ?readonly=${this.readonly}\r\n ?required=${this.required}\r\n maxlength=${this.maxLength || ''}\r\n name=${this.name || ''}\r\n @input=${this._handleInput}\r\n @focus=${this._handleFocus}\r\n @blur=${this._handleBlur}\r\n />\r\n ${\r\n this.floating && this.label\r\n ? html`\r\n <label class=\"floating-label ${this.required ? 'label--required' : ''}\">\r\n ${this.label}\r\n </label>\r\n `\r\n : nothing\r\n }\r\n ${this.loading ? html`<span class=\"loading-spinner\"></span>` : nothing}\r\n ${\r\n showPasswordToggle\r\n ? html`\r\n <button\r\n class=\"password-toggle\"\r\n type=\"button\"\r\n @click=${this._togglePassword}\r\n tabindex=\"-1\"\r\n >\r\n ${this._showPassword ? '🙈' : '👁️'}\r\n </button>\r\n `\r\n : nothing\r\n }\r\n ${\r\n showClearButton\r\n ? html`\r\n <button\r\n class=\"clear-button\"\r\n type=\"button\"\r\n @click=${this._clearInput}\r\n tabindex=\"-1\"\r\n >\r\n ✕\r\n </button>\r\n `\r\n : nothing\r\n }\r\n <slot name=\"suffix\"></slot>\r\n </div>\r\n <div style=\"display: flex; align-items: center; gap: 8px;\">\r\n ${\r\n this.helperText\r\n ? html`\r\n <div\r\n class=\"helper-text\r\n ${this.error ? 'helper-text--error' : ''}\r\n ${this.success ? 'helper-text--success' : ''}\"\r\n part=\"helper-text\"\r\n >\r\n ${this.helperText}\r\n </div>\r\n `\r\n : nothing\r\n }\r\n ${\r\n showCharCounter\r\n ? html`\r\n <div\r\n class=\"char-counter\r\n ${isOverLimit ? 'char-counter--error' : ''}\r\n ${isNearLimit && !isOverLimit ? 'char-counter--warning' : ''}\"\r\n >\r\n ${charCount}/${this.maxLength}\r\n </div>\r\n `\r\n : nothing\r\n }\r\n </div>\r\n </div>\r\n `\r\n }\r\n\r\n private _handleInput(e: Event) {\r\n const target = e.target as HTMLInputElement\r\n this.value = target.value\r\n this.emit('mac-input', { detail: { value: this.value } })\r\n }\r\n\r\n private _handleFocus() {\r\n this._hasFocus = true\r\n this.emit('mac-focus')\r\n }\r\n\r\n private _handleBlur() {\r\n this._hasFocus = false\r\n this.emit('mac-blur')\r\n }\r\n\r\n private _clearInput() {\r\n this.value = ''\r\n this._input.value = ''\r\n this.emit('mac-input', { detail: { value: '' } })\r\n this._input.focus()\r\n }\r\n\r\n private _togglePassword() {\r\n this._showPassword = !this._showPassword\r\n }\r\n\r\n /** 设置输入框焦点。 */\r\n override focus() {\r\n this._input?.focus()\r\n }\r\n\r\n /** 移除输入框焦点。 */\r\n override blur() {\r\n this._input?.blur()\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'mac-input': MacInput\r\n }\r\n}\r\n","import type { PropertyDeclaration } from 'lit'\r\n\r\n/**\r\n * Boolean converter that accepts both HTML boolean syntax (`disabled`) and the\r\n * explicit string form (`disabled=\"false\"`). This is useful for templates\r\n * generated by server-side renderers and keeps the public attributes intuitive.\r\n */\r\nexport const booleanAttribute: Pick<PropertyDeclaration, 'converter'>['converter'] = {\r\n fromAttribute: (value: string | null) => value !== null && value !== 'false',\r\n toAttribute: (value: boolean) => (value ? '' : null),\r\n}\r\n","import { html, css, nothing } from 'lit'\r\nimport { property, customElement, state, query } from 'lit/decorators.js'\r\nimport { BaseElement } from '../../internal/base-element'\r\nimport { sharedStyles } from '../../styles/shared-styles'\r\nimport { themeTokens } from '../../styles/theme'\r\nimport { booleanAttribute } from '../../internal/property-converters'\r\n\r\n/**\r\n * @tag mac-input-number\r\n * @summary macOS 风格的数字输入组件。\r\n *\r\n * @slot prefix - 输入框前的内容。\r\n * @slot suffix - 输入框后的内容。\r\n *\r\n * @csspart base - 输入框的基础容器。\r\n * @csspart input - 原生输入元素。\r\n * @csspart buttons - 步进按钮容器。\r\n * @csspart button-plus - 加号步进按钮。\r\n * @csspart button-minus - 减号步进按钮。\r\n */\r\n@customElement('mac-input-number')\r\nexport class MacInputNumber extends BaseElement {\r\n static override styles = [\r\n themeTokens,\r\n sharedStyles,\r\n css`\r\n :host {\r\n display: block;\r\n }\r\n\r\n .input-wrapper {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--md-spacing-xs);\r\n }\r\n\r\n .input-container {\r\n position: relative;\r\n display: flex;\r\n align-items: center;\r\n border-radius: var(--md-radius-md);\r\n background-color: var(--md-color-bg);\r\n transition: all 200ms cubic-bezier(0.4, 0, 0.2, 1);\r\n overflow: hidden;\r\n }\r\n\r\n .input-container--default {\r\n border: 1px solid var(--md-color-border);\r\n }\r\n\r\n .input-container--filled {\r\n border: none;\r\n background: rgba(0, 0, 0, 0.03);\r\n }\r\n\r\n .input-container--glass {\r\n border: 1px solid rgba(255, 255, 255, 0.2);\r\n background: rgba(255, 255, 255, 0.08);\r\n backdrop-filter: blur(10px) saturate(180%);\r\n -webkit-backdrop-filter: blur(10px) saturate(180%);\r\n }\r\n\r\n .input-container--underline {\r\n border: none;\r\n border-bottom: 2px solid var(--md-color-border);\r\n border-radius: 0;\r\n background: transparent;\r\n }\r\n\r\n /* 聚焦状态 */\r\n .input-container--default:focus-within {\r\n border-color: var(--md-color-primary);\r\n box-shadow:\r\n 0 0 0 3px rgba(0, 122, 255, 0.1),\r\n 0 2px 8px rgba(0, 122, 255, 0.08);\r\n }\r\n\r\n .input-container--filled:focus-within {\r\n background: rgba(0, 0, 0, 0.05);\r\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\r\n }\r\n\r\n .input-container--glass:focus-within {\r\n border-color: rgba(0, 122, 255, 0.5);\r\n background: rgba(255, 255, 255, 0.12);\r\n box-shadow:\r\n 0 0 0 3px rgba(0, 122, 255, 0.15),\r\n 0 4px 12px rgba(0, 0, 0, 0.15);\r\n }\r\n\r\n .input-container--underline:focus-within {\r\n border-bottom-color: var(--md-color-primary);\r\n box-shadow: none;\r\n }\r\n\r\n /* 错误状态 */\r\n .input-container--error.input-container--default {\r\n border-color: var(--md-color-danger);\r\n }\r\n\r\n .input-container--error.input-container--default:focus-within {\r\n box-shadow:\r\n 0 0 0 3px rgba(255, 59, 48, 0.1),\r\n 0 2px 8px rgba(255, 59, 48, 0.08);\r\n }\r\n\r\n .input-container--error.input-container--underline {\r\n border-bottom-color: var(--md-color-danger);\r\n }\r\n\r\n /* 成功状态 */\r\n .input-container--success.input-container--default {\r\n border-color: var(--md-color-success);\r\n }\r\n\r\n .input-container--success.input-container--default:focus-within {\r\n box-shadow:\r\n 0 0 0 3px rgba(52, 199, 89, 0.1),\r\n 0 2px 8px rgba(52, 199, 89, 0.08);\r\n }\r\n\r\n .input-container--success.input-container--underline {\r\n border-bottom-color: var(--md-color-success);\r\n }\r\n\r\n /* 警告状态 */\r\n .input-container--warning.input-container--default {\r\n border-color: var(--md-color-warning);\r\n }\r\n\r\n .input-container--warning.input-container--default:focus-within {\r\n box-shadow:\r\n 0 0 0 3px rgba(245, 158, 11, 0.1),\r\n 0 2px 8px rgba(245, 158, 11, 0.08);\r\n }\r\n\r\n .input-container--warning.input-container--underline {\r\n border-bottom-color: var(--md-color-warning);\r\n }\r\n\r\n /* 禁用状态 */\r\n .input-container--disabled {\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n background-color: var(--md-color-bg-secondary);\r\n }\r\n\r\n /* 输入框 */\r\n .input {\r\n flex: 1;\r\n border: none;\r\n outline: none;\r\n padding: var(--md-input-padding-vertical) var(--md-input-padding-horizontal);\r\n font-size: var(--md-input-font-size);\r\n font-family: inherit;\r\n color: var(--md-color-text);\r\n background: transparent;\r\n min-width: 0;\r\n text-align: left;\r\n }\r\n\r\n .input::placeholder {\r\n color: var(--md-color-text-secondary);\r\n transition: opacity 200ms;\r\n }\r\n\r\n .input:focus::placeholder {\r\n opacity: 0.6;\r\n }\r\n\r\n .input:disabled {\r\n cursor: not-allowed;\r\n }\r\n\r\n /* 插槽 */\r\n ::slotted([slot='prefix']),\r\n ::slotted([slot='suffix']) {\r\n display: flex;\r\n align-items: center;\r\n padding: 0 var(--md-spacing-sm);\r\n color: var(--md-color-text-secondary);\r\n }\r\n\r\n /* 步进按钮 */\r\n .buttons {\r\n display: flex;\r\n flex-direction: column;\r\n border-left: 1px solid var(--md-color-border);\r\n height: 100%;\r\n min-height: 28px;\r\n }\r\n\r\n .button-step {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n flex: 1;\r\n width: 24px;\r\n border: none;\r\n background: transparent;\r\n cursor: pointer;\r\n color: var(--md-color-text-secondary);\r\n padding: 0;\r\n transition: all 150ms;\r\n }\r\n\r\n .button-step:hover:not(:disabled) {\r\n background: rgba(0, 0, 0, 0.04);\r\n color: var(--md-color-text);\r\n }\r\n\r\n .button-step:active:not(:disabled) {\r\n background: rgba(0, 0, 0, 0.08);\r\n }\r\n\r\n .button-step:disabled {\r\n cursor: not-allowed;\r\n opacity: 0.4;\r\n }\r\n\r\n .button-step svg {\r\n width: 10px;\r\n height: 10px;\r\n }\r\n\r\n .button-step--plus {\r\n border-bottom: 1px solid var(--md-color-border);\r\n }\r\n\r\n /* 外部按钮 */\r\n .buttons--outside {\r\n flex-direction: row;\r\n border-left: none;\r\n gap: var(--md-spacing-xs);\r\n padding: 0 var(--md-spacing-xs);\r\n }\r\n\r\n .buttons--outside .button-step {\r\n width: 28px;\r\n height: 28px;\r\n border-radius: var(--md-radius-sm);\r\n background: var(--md-color-bg-secondary);\r\n border: 1px solid var(--md-color-border);\r\n }\r\n\r\n .buttons--outside .button-step:hover:not(:disabled) {\r\n background: var(--md-color-bg);\r\n border-color: var(--md-color-primary);\r\n color: var(--md-color-primary);\r\n }\r\n\r\n .buttons--outside .button-step--plus {\r\n border-bottom: 1px solid var(--md-color-border);\r\n }\r\n\r\n /* 清除按钮 */\r\n .clear-button {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 20px;\r\n height: 20px;\r\n margin-right: var(--md-spacing-sm);\r\n border: none;\r\n background: rgba(0, 0, 0, 0.06);\r\n border-radius: 50%;\r\n cursor: pointer;\r\n color: var(--md-color-text-secondary);\r\n font-size: 12px;\r\n transition: all 200ms;\r\n padding: 0;\r\n }\r\n\r\n .clear-button:hover {\r\n background: rgba(0, 0, 0, 0.1);\r\n color: var(--md-color-text);\r\n }\r\n\r\n /* 尺寸 */\r\n .input-container--sm .input {\r\n padding: var(--sm-input-padding-vertical) var(--sm-input-padding-horizontal);\r\n font-size: var(--sm-input-font-size);\r\n }\r\n\r\n .input-container--lg .input {\r\n padding: var(--lg-input-padding-vertical) var(--lg-input-padding-horizontal);\r\n font-size: var(--lg-input-font-size);\r\n }\r\n\r\n .input-container--sm .buttons {\r\n min-height: 24px;\r\n }\r\n\r\n .input-container--sm .button-step {\r\n width: 20px;\r\n }\r\n\r\n .input-container--lg .buttons {\r\n min-height: 36px;\r\n }\r\n\r\n .input-container--lg .button-step {\r\n width: 28px;\r\n }\r\n\r\n :host([data-theme='dark']) .input-container--filled {\r\n background: rgba(255, 255, 255, 0.05);\r\n }\r\n\r\n :host([data-theme='dark']) .input-container--filled:focus-within {\r\n background: rgba(255, 255, 255, 0.08);\r\n }\r\n\r\n :host([data-theme='dark']) .input-container--glass {\r\n background: rgba(255, 255, 255, 0.05);\r\n }\r\n\r\n :host([data-theme='dark']) .input-container--glass:focus-within {\r\n background: rgba(255, 255, 255, 0.08);\r\n }\r\n\r\n :host([data-theme='dark']) .button-step:hover:not(:disabled) {\r\n background: rgba(255, 255, 255, 0.08);\r\n }\r\n\r\n :host([data-theme='dark']) .button-step:active:not(:disabled) {\r\n background: rgba(255, 255, 255, 0.12);\r\n }\r\n\r\n :host([data-theme='dark']) .buttons--outside .button-step {\r\n background: rgba(255, 255, 255, 0.05);\r\n border-color: rgba(255, 255, 255, 0.1);\r\n }\r\n\r\n :host([data-theme='dark']) .clear-button {\r\n background: rgba(255, 255, 255, 0.1);\r\n }\r\n\r\n :host([data-theme='dark']) .clear-button:hover {\r\n background: rgba(255, 255, 255, 0.15);\r\n }\r\n `,\r\n ]\r\n\r\n /** 输入框的值。 */\r\n @property({ type: Number }) value?: number\r\n\r\n /** 非受控模式的默认值。 */\r\n @property({ type: Number, attribute: 'default-value' }) defaultValue?: number\r\n\r\n /** 最小值。 */\r\n @property({ type: Number }) min?: number\r\n\r\n /** 最大值。 */\r\n @property({ type: Number }) max?: number\r\n\r\n /** 步进值。 */\r\n @property({ type: Number }) step = 1\r\n\r\n /** 精度(小数位数)。 */\r\n @property({ type: Number }) precision?: number\r\n\r\n /** 输入框的占位符。 */\r\n @property() placeholder = ''\r\n\r\n /** 输入框的尺寸。 */\r\n @property({ reflect: true }) size?: 'sm' | 'md' | 'lg'\r\n\r\n /** 视觉变体。 */\r\n @property({ reflect: true }) variant: 'default' | 'filled' | 'glass' | 'underline' = 'default'\r\n\r\n /** 输入框的状态。 */\r\n @property({ reflect: true }) status?: 'error' | 'warning' | 'success'\r\n\r\n /** 禁用输入框。 */\r\n @property({ type: Boolean, reflect: true }) disabled = false\r\n\r\n /** 使输入框只读。 */\r\n @property({ type: Boolean }) readonly = false\r\n\r\n /** 显示步进按钮。 */\r\n @property({ converter: booleanAttribute, attribute: 'show-button' }) showButton = true\r\n\r\n /** 按钮位置。 */\r\n @property({ attribute: 'button-placement' }) buttonPlacement: 'inside' | 'outside' = 'inside'\r\n\r\n /** 显示清除按钮。 */\r\n @property({ type: Boolean }) clearable = false\r\n\r\n /** 输入框的名称(用于表单)。 */\r\n @property() name = ''\r\n\r\n /** 启用键盘控制(方向键、Page Up/Down)。 */\r\n @property({ type: Boolean }) keyboard = true\r\n\r\n @state() private _displayValue = ''\r\n\r\n @state() private _hasFocus = false\r\n\r\n @query('#input') private _input!: HTMLInputElement\r\n\r\n private get _isControlled(): boolean {\r\n return this.hasAttribute('value')\r\n }\r\n\r\n private get _resolvedValue(): number | undefined {\r\n return this._isControlled ? this.value : this.defaultValue\r\n }\r\n\r\n override connectedCallback() {\r\n super.connectedCallback()\r\n // 同步默认值到 DOM,以便 CSS :host([attr]) 选择器生效\r\n if (!this.hasAttribute('variant')) {\r\n this.setAttribute('variant', 'default')\r\n }\r\n this._syncDisplayValue()\r\n }\r\n\r\n override willUpdate(changed: Map<string, unknown>) {\r\n const size = this._resolvedSize\r\n if (this.getAttribute('size') !== size) {\r\n this.setAttribute('size', size)\r\n }\r\n const theme = this._resolvedTheme\r\n if (theme) {\r\n this.setAttribute('data-theme', theme)\r\n } else {\r\n this.removeAttribute('data-theme')\r\n }\r\n if (changed.has('value') || changed.has('defaultValue')) {\r\n this._syncDisplayValue()\r\n }\r\n }\r\n\r\n private _syncDisplayValue() {\r\n const val = this._resolvedValue\r\n this._displayValue = val !== undefined && val !== null ? this._formatValue(val) : ''\r\n }\r\n\r\n private _formatValue(val: number): string {\r\n if (this.precision !== undefined && this.precision >= 0) {\r\n return val.toFixed(this.precision)\r\n }\r\n return String(val)\r\n }\r\n\r\n private _parseValue(str: string): number | undefined {\r\n const trimmed = str.trim()\r\n if (trimmed === '' || trimmed === '-') return undefined\r\n const num = Number(trimmed)\r\n return Number.isNaN(num) ? undefined : num\r\n }\r\n\r\n private _clampAndRound(val: number): number {\r\n let result = val\r\n if (this.min !== undefined) result = Math.max(this.min, result)\r\n if (this.max !== undefined) result = Math.min(this.max, result)\r\n if (this.precision !== undefined && this.precision >= 0) {\r\n const factor = Math.pow(10, this.precision)\r\n result = Math.round(result * factor) / factor\r\n }\r\n return result\r\n }\r\n\r\n private _stepValue(direction: number) {\r\n if (this.disabled || this.readonly) return\r\n const current = this._resolvedValue ?? 0\r\n const newVal = this._clampAndRound(current + direction * this.step)\r\n this._setValue(newVal)\r\n this.emit('mac-change', { detail: { value: newVal } })\r\n }\r\n\r\n private _setValue(val: number | undefined) {\r\n if (this._isControlled) {\r\n // Update the local value immediately as well as notifying the owner.\r\n // This keeps imperative actions such as clear usable before the next\r\n // controlled-model update arrives.\r\n this.value = val\r\n this.emit('mac-input-number', { detail: { value: val } })\r\n } else {\r\n this.defaultValue = val\r\n this.emit('mac-input-number', { detail: { value: val } })\r\n }\r\n }\r\n\r\n private _handleInput(e: Event) {\r\n const target = e.target as HTMLInputElement\r\n const raw = target.value\r\n\r\n // 输入时允许空值、减号和小数点\r\n if (raw === '' || raw === '-' || raw === '-.') {\r\n this._displayValue = raw\r\n if (!this._isControlled) {\r\n this.defaultValue = undefined\r\n }\r\n this.emit('mac-input-number', { detail: { value: undefined } })\r\n return\r\n }\r\n\r\n const num = this._parseValue(raw)\r\n if (num !== undefined) {\r\n const clamped = this._clampAndRound(num)\r\n this._setValue(clamped)\r\n }\r\n }\r\n\r\n private _handleChange() {\r\n const num = this._parseValue(this._displayValue)\r\n if (num !== undefined) {\r\n const clamped = this._clampAndRound(num)\r\n if (clamped !== num) {\r\n this._setValue(clamped)\r\n }\r\n }\r\n this.emit('mac-change', { detail: { value: this._resolvedValue } })\r\n }\r\n\r\n private _handleFocus() {\r\n this._hasFocus = true\r\n this.emit('mac-focus')\r\n }\r\n\r\n private _handleBlur() {\r\n this._hasFocus = false\r\n this._handleChange()\r\n this.emit('mac-blur')\r\n }\r\n\r\n private _handleKeydown(e: KeyboardEvent) {\r\n if (!this.keyboard || this.disabled || this.readonly) return\r\n\r\n switch (e.key) {\r\n case 'ArrowUp':\r\n e.preventDefault()\r\n this._stepValue(1)\r\n break\r\n case 'ArrowDown':\r\n e.preventDefault()\r\n this._stepValue(-1)\r\n break\r\n case 'PageUp':\r\n e.preventDefault()\r\n this._stepValue(10)\r\n break\r\n case 'PageDown':\r\n e.preventDefault()\r\n this._stepValue(-10)\r\n break\r\n case 'Home':\r\n if (this.min !== undefined) {\r\n e.preventDefault()\r\n this._setValue(this.min)\r\n this.emit('mac-change', { detail: { value: this.min } })\r\n }\r\n break\r\n case 'End':\r\n if (this.max !== undefined) {\r\n e.preventDefault()\r\n this._setValue(this.max)\r\n this.emit('mac-change', { detail: { value: this.max } })\r\n }\r\n break\r\n }\r\n }\r\n\r\n private _clearInput() {\r\n this._setValue(undefined)\r\n this._displayValue = ''\r\n if (this._input) {\r\n this._input.value = ''\r\n this._input.focus()\r\n }\r\n this.emit('mac-change', { detail: { value: undefined } })\r\n }\r\n\r\n private _renderButtons() {\r\n if (!this.showButton) return nothing\r\n\r\n const isPlusDisabled =\r\n this.disabled || (this.max !== undefined && (this._resolvedValue ?? 0) >= this.max)\r\n const isMinusDisabled =\r\n this.disabled || (this.min !== undefined && (this._resolvedValue ?? 0) <= this.min)\r\n\r\n const buttons = html`\r\n <div\r\n part=\"buttons\"\r\n class=\"buttons ${this.buttonPlacement === 'outside' ? 'buttons--outside' : ''}\"\r\n >\r\n <button\r\n part=\"button-plus\"\r\n class=\"button-step button-step--plus\"\r\n type=\"button\"\r\n ?disabled=${isPlusDisabled}\r\n tabindex=\"-1\"\r\n @click=${() => this._stepValue(1)}\r\n >\r\n <svg\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"3\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <path d=\"M12 5v14M5 12h14\" />\r\n </svg>\r\n </button>\r\n <button\r\n part=\"button-minus\"\r\n class=\"button-step\"\r\n type=\"button\"\r\n ?disabled=${isMinusDisabled}\r\n tabindex=\"-1\"\r\n @click=${() => this._stepValue(-1)}\r\n >\r\n <svg\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"3\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <path d=\"M5 12h14\" />\r\n </svg>\r\n </button>\r\n </div>\r\n `\r\n\r\n if (this.buttonPlacement === 'outside') {\r\n return html`<div style=\"display:flex;align-items:center;\">${buttons}</div>`\r\n }\r\n return buttons\r\n }\r\n\r\n override render() {\r\n const showClearButton = this.clearable && this._resolvedValue !== undefined && !this.disabled\r\n const size = this._resolvedSize\r\n\r\n return html`\r\n <div class=\"input-wrapper\" part=\"base\">\r\n <div\r\n class=\"input-container\r\n input-container--${this.variant}\r\n input-container--${size}\r\n ${this.status === 'error' ? 'input-container--error' : ''}\r\n ${this.status === 'success' ? 'input-container--success' : ''}\r\n ${this.status === 'warning' ? 'input-container--warning' : ''}\r\n ${this.disabled ? 'input-container--disabled' : ''}\"\r\n >\r\n <slot name=\"prefix\"></slot>\r\n <input\r\n id=\"input\"\r\n part=\"input\"\r\n class=\"input\"\r\n type=\"text\"\r\n inputmode=\"decimal\"\r\n placeholder=${this.placeholder}\r\n .value=${this._displayValue}\r\n ?disabled=${this.disabled}\r\n ?readonly=${this.readonly}\r\n name=${this.name || ''}\r\n @input=${this._handleInput}\r\n @change=${this._handleChange}\r\n @focus=${this._handleFocus}\r\n @blur=${this._handleBlur}\r\n @keydown=${this._handleKeydown}\r\n />\r\n ${\r\n showClearButton\r\n ? html`\r\n <button\r\n class=\"clear-button\"\r\n type=\"button\"\r\n @click=${this._clearInput}\r\n tabindex=\"-1\"\r\n >\r\n ✕\r\n </button>\r\n `\r\n : nothing\r\n }\r\n ${this.buttonPlacement === 'inside' ? this._renderButtons() : nothing}\r\n <slot name=\"suffix\"></slot>\r\n </div>\r\n ${\r\n this.buttonPlacement === 'outside'\r\n ? html`<div style=\"display:flex;align-items:center;margin-top:var(--md-spacing-xs);\">\r\n ${this._renderButtons()}\r\n </div>`\r\n : nothing\r\n }\r\n </div>\r\n `\r\n }\r\n\r\n /** 设置输入框焦点。 */\r\n override focus() {\r\n this._input?.focus()\r\n }\r\n\r\n /** 移除输入框焦点。 */\r\n override blur() {\r\n this._input?.blur()\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'mac-input-number': MacInputNumber\r\n }\r\n}\r\n","import { html, css } from 'lit'\r\nimport { property, customElement } from 'lit/decorators.js'\r\nimport { BaseElement } from '../../internal/base-element'\r\nimport { sharedStyles } from '../../styles/shared-styles'\r\nimport { themeTokens } from '../../styles/theme'\r\nimport type { MacFormItem } from './mac-form-item'\r\n\r\nexport interface FormRule {\r\n required?: boolean\r\n message?: string\r\n trigger?: 'blur' | 'change' | 'input' | ('blur' | 'change' | 'input')[]\r\n validator?: (value: unknown) => boolean | string | Promise<boolean | string>\r\n min?: number\r\n max?: number\r\n len?: number\r\n pattern?: RegExp\r\n type?: 'string' | 'number' | 'boolean' | 'array' | 'email' | 'url' | 'date'\r\n}\r\n\r\n/**\r\n * @tag mac-form\r\n * @summary 一个表单组件,用于收集和验证用户输入。\r\n *\r\n * @slot - 表单项和控件。\r\n *\r\n * @csspart base - 表单的基础容器。\r\n *\r\n * @event mac-change - 字段值变化时触发。Detail: { model, path, value }\r\n * @event mac-submit - 表单提交时触发。Detail: { model }\r\n */\r\n@customElement('mac-form')\r\nexport class MacForm extends BaseElement {\r\n static override styles = [\r\n themeTokens,\r\n sharedStyles,\r\n css`\r\n :host {\r\n display: block;\r\n }\r\n\r\n .form {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--md-form-gap, var(--md-spacing-md));\r\n }\r\n `,\r\n ]\r\n\r\n /** 表单数据模型。 */\r\n @property({ type: Object }) model: Record<string, unknown> = {}\r\n\r\n /** 验证规则。 */\r\n @property({ type: Object }) rules: Record<string, FormRule | FormRule[]> = {}\r\n\r\n /** 标签宽度。 */\r\n @property({ attribute: 'label-width' }) labelWidth = '80px'\r\n\r\n /** 标签对齐方式。 */\r\n @property({ attribute: 'label-align' }) labelAlign: 'left' | 'right' | 'top' = 'right'\r\n\r\n /** 是否显示标签。 */\r\n @property({ type: Boolean, attribute: 'show-label' }) showLabel = true\r\n\r\n /** 是否显示反馈(错误信息)。 */\r\n @property({ type: Boolean, attribute: 'show-feedback' }) showFeedback = true\r\n\r\n /** 表单尺寸。 */\r\n @property({ reflect: true }) size?: 'sm' | 'md' | 'lg'\r\n\r\n /** 禁用所有表单项。 */\r\n @property({ type: Boolean, reflect: true }) disabled = false\r\n\r\n private _items: MacFormItem[] = []\r\n\r\n override willUpdate() {\r\n const size = this._resolvedSize\r\n if (this.getAttribute('size') !== size) {\r\n this.setAttribute('size', size)\r\n }\r\n const theme = this._resolvedTheme\r\n if (theme) {\r\n this.setAttribute('data-theme', theme)\r\n } else {\r\n this.removeAttribute('data-theme')\r\n }\r\n }\r\n\r\n _registerItem(item: MacFormItem) {\r\n if (!this._items.includes(item)) {\r\n this._items.push(item)\r\n }\r\n }\r\n\r\n _unregisterItem(item: MacFormItem) {\r\n const index = this._items.indexOf(item)\r\n if (index > -1) {\r\n this._items.splice(index, 1)\r\n }\r\n }\r\n\r\n /** 根据路径获取字段值。 */\r\n getValue(path: string): unknown {\r\n return this.model[path]\r\n }\r\n\r\n /** 根据路径设置字段值。 */\r\n setValue(path: string, value: unknown) {\r\n this.model = { ...this.model, [path]: value }\r\n this.emit('mac-change', { detail: { model: this.model, path, value } })\r\n }\r\n\r\n /** 验证所有表单项。 */\r\n async validate(): Promise<boolean> {\r\n const results = await Promise.all(this._items.map((item) => item.validate()))\r\n return results.every((r) => r)\r\n }\r\n\r\n /** 重置所有表单项的验证状态。 */\r\n reset() {\r\n this._items.forEach((item) => item.reset())\r\n }\r\n\r\n /** 清空表单模型。 */\r\n clear() {\r\n this.model = {}\r\n this.reset()\r\n this.emit('mac-change', { detail: { model: this.model, path: '', value: undefined } })\r\n }\r\n\r\n override render() {\r\n return html`\r\n <form\r\n part=\"base\"\r\n class=\"form\"\r\n @submit=${this._handleSubmit}\r\n style=\"--md-form-label-width: ${this.labelWidth}; --md-form-label-align: ${\r\n this.labelAlign\r\n };\"\r\n >\r\n <slot></slot>\r\n </form>\r\n `\r\n }\r\n\r\n private _handleSubmit(e: SubmitEvent) {\r\n e.preventDefault()\r\n this.emit('mac-submit', { detail: { model: this.model } })\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'mac-form': MacForm\r\n }\r\n}\r\n","import { html, css, nothing } from 'lit'\r\nimport { property, customElement, state } from 'lit/decorators.js'\r\nimport { BaseElement } from '../../internal/base-element'\r\nimport { sharedStyles } from '../../styles/shared-styles'\r\nimport { themeTokens } from '../../styles/theme'\r\nimport type { MacForm, FormRule } from './mac-form'\r\n\r\n/**\r\n * @tag mac-form-item\r\n * @summary A form item component for wrapping form controls with label and validation.\r\n *\r\n * @slot - The form control element.\r\n *\r\n * @csspart base - The form item's base container.\r\n * @csspart label - The label element.\r\n * @csspart content - The content wrapper.\r\n * @csspart error - The error message element.\r\n */\r\n@customElement('mac-form-item')\r\nexport class MacFormItem extends BaseElement {\r\n static override styles = [\r\n themeTokens,\r\n sharedStyles,\r\n css`\r\n :host {\r\n display: block;\r\n }\r\n\r\n .form-item {\r\n display: flex;\r\n align-items: flex-start;\r\n gap: var(--md-form-item-gap, var(--md-spacing-sm));\r\n }\r\n\r\n .form-item--top {\r\n flex-direction: column;\r\n gap: var(--md-spacing-xs);\r\n }\r\n\r\n .form-item--top .form-item__label {\r\n width: auto !important;\r\n text-align: left !important;\r\n padding-top: 0 !important;\r\n }\r\n\r\n .form-item__label {\r\n flex-shrink: 0;\r\n width: var(--md-form-label-width, 80px);\r\n text-align: var(--md-form-label-align, right);\r\n font-size: var(--md-form-label-font-size, var(--md-font-size-base));\r\n color: var(--md-form-label-color, var(--md-color-text));\r\n line-height: var(--md-form-control-height, 32px);\r\n padding-top: var(--md-form-label-padding-top, 0px);\r\n transition: color 200ms;\r\n }\r\n\r\n .form-item__label--left {\r\n text-align: left;\r\n }\r\n\r\n .form-item__label--right {\r\n text-align: right;\r\n }\r\n\r\n .form-item__label--top {\r\n text-align: left;\r\n }\r\n\r\n .form-item__content {\r\n flex: 1;\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--md-spacing-xs);\r\n min-width: 0;\r\n }\r\n\r\n .form-item__error {\r\n font-size: var(--md-font-size-sm);\r\n color: var(--md-color-danger);\r\n line-height: 1.4;\r\n animation: slideIn 200ms ease;\r\n }\r\n\r\n @keyframes slideIn {\r\n from {\r\n opacity: 0;\r\n transform: translateY(-4px);\r\n }\r\n to {\r\n opacity: 1;\r\n transform: translateY(0);\r\n }\r\n }\r\n\r\n .required {\r\n color: var(--md-color-danger);\r\n margin-right: 2px;\r\n }\r\n\r\n /* Size overrides */\r\n :host([size='sm']) .form-item__label {\r\n font-size: var(--md-font-size-sm);\r\n line-height: 28px;\r\n }\r\n\r\n :host([size='lg']) .form-item__label {\r\n font-size: var(--md-font-size-lg);\r\n line-height: 40px;\r\n }\r\n\r\n :host([data-theme='dark']) .form-item__label {\r\n color: rgba(255, 255, 255, 0.92);\r\n }\r\n\r\n /* ─── 响应式:移动端标签堆叠为顶部对齐 ─── */\r\n @media (max-width: 768px) {\r\n .form-item {\r\n /* 强制纵向排列,标签在控件上方 */\r\n flex-direction: column;\r\n gap: var(--md-spacing-xs);\r\n }\r\n .form-item__label {\r\n width: auto !important;\r\n text-align: left !important;\r\n padding-top: 0 !important;\r\n line-height: 1.4;\r\n font-size: 16px;\r\n }\r\n }\r\n `,\r\n ]\r\n\r\n /** The item's label. */\r\n @property() label = ''\r\n\r\n /** The field path in the model. */\r\n @property() path = ''\r\n\r\n /** Validation rule(s). */\r\n @property({ type: Object }) rule?: FormRule | FormRule[]\r\n\r\n /** Whether the field is required. */\r\n @property({ type: Boolean }) required = false\r\n\r\n /** Whether to show the label. */\r\n @property({ type: Boolean, attribute: 'show-label' }) showLabel?: boolean\r\n\r\n /** Whether to show feedback (error messages). */\r\n @property({ type: Boolean, attribute: 'show-feedback' }) showFeedback?: boolean\r\n\r\n /** The item's size. */\r\n @property({ reflect: true }) size?: 'sm' | 'md' | 'lg'\r\n\r\n /** Disables the item. */\r\n @property({ type: Boolean, reflect: true }) disabled = false\r\n\r\n @state() private _errorMessage = ''\r\n\r\n private _form?: MacForm\r\n private _control?: HTMLElement\r\n private _mutationObserver?: MutationObserver\r\n\r\n override connectedCallback() {\r\n super.connectedCallback()\r\n this._form = this._findForm()\r\n this._form?._registerItem(this)\r\n this._mutationObserver = new MutationObserver(() => this._attachListeners())\r\n this._mutationObserver.observe(this, { childList: true, subtree: true })\r\n }\r\n\r\n override disconnectedCallback() {\r\n super.disconnectedCallback()\r\n this._form?._unregisterItem(this)\r\n if (this._control) {\r\n this._control.removeEventListener('mac-change', this._handleChange as EventListener)\r\n this._control.removeEventListener('mac-input', this._handleInput as EventListener)\r\n this._control.removeEventListener('mac-blur', this._handleBlur as EventListener)\r\n }\r\n this._mutationObserver?.disconnect()\r\n }\r\n\r\n override updated() {\r\n this._attachListeners()\r\n this._syncValueToControl()\r\n this._syncDisabledToControl()\r\n this._syncSizeToControl()\r\n }\r\n\r\n private _findForm(): MacForm | undefined {\r\n // Walk the light-DOM ancestry; the element itself is the starting node.\r\n // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n let el: Element | null = this\r\n while (el) {\r\n if (el.tagName.toLowerCase() === 'mac-form') {\r\n return el as MacForm\r\n }\r\n el = el.parentElement\r\n }\r\n return undefined\r\n }\r\n\r\n private _findControl(): HTMLElement | undefined {\r\n const slot = this.shadowRoot?.querySelector('slot:not([name])') as HTMLSlotElement | undefined\r\n if (!slot) return undefined\r\n const assigned = slot.assignedElements({ flatten: true })\r\n for (const el of assigned) {\r\n const found = this._findFirstControl(el as HTMLElement)\r\n if (found) return found\r\n }\r\n return undefined\r\n }\r\n\r\n private _findFirstControl(el: HTMLElement): HTMLElement | undefined {\r\n const tag = el.tagName.toLowerCase()\r\n if (tag === 'mac-form-item') return undefined\r\n if (\r\n [\r\n 'mac-input',\r\n 'mac-input-number',\r\n 'mac-select',\r\n 'mac-radio-group',\r\n 'mac-radio',\r\n 'mac-dynamic-tags',\r\n ].includes(tag)\r\n ) {\r\n return el\r\n }\r\n const children = Array.from(el.children) as HTMLElement[]\r\n for (const child of children) {\r\n const found = this._findFirstControl(child)\r\n if (found) return found\r\n }\r\n return undefined\r\n }\r\n\r\n private _getValue(): unknown {\r\n if (this._form && this.path) {\r\n return this._form.getValue(this.path)\r\n }\r\n return undefined\r\n }\r\n\r\n private _syncValueToControl() {\r\n const control = this._findControl()\r\n if (!control || !this.path) return\r\n const value = this._getValue()\r\n if ('value' in control && (control as any).value !== value) {\r\n ;(control as any).value = value ?? ''\r\n }\r\n }\r\n\r\n private _syncDisabledToControl() {\r\n const control = this._findControl()\r\n if (!control) return\r\n const disabled = this.disabled || this._form?.disabled\r\n if ('disabled' in control) {\r\n ;(control as any).disabled = !!disabled\r\n }\r\n }\r\n\r\n private _syncSizeToControl() {\r\n const control = this._findControl()\r\n if (!control) return\r\n const size = this.size || this._form?.size\r\n if (size && 'size' in control) {\r\n ;(control as any).size = size\r\n }\r\n }\r\n\r\n private _attachListeners() {\r\n const control = this._findControl()\r\n if (!control || this._control === control) return\r\n if (this._control) {\r\n this._control.removeEventListener('mac-change', this._handleChange as EventListener)\r\n this._control.removeEventListener('mac-input', this._handleInput as EventListener)\r\n this._control.removeEventListener('mac-blur', this._handleBlur as EventListener)\r\n }\r\n this._control = control\r\n control.addEventListener('mac-change', this._handleChange as EventListener)\r\n control.addEventListener('mac-input', this._handleInput as EventListener)\r\n control.addEventListener('mac-blur', this._handleBlur as EventListener)\r\n }\r\n\r\n private _handleChange = (e: CustomEvent) => {\r\n const value = e.detail?.value\r\n this._updateValue(value)\r\n this.validate('change')\r\n }\r\n\r\n private _handleInput = (e: CustomEvent) => {\r\n const value = e.detail?.value\r\n this._updateValue(value)\r\n this.validate('input')\r\n }\r\n\r\n private _handleBlur = () => {\r\n this.validate('blur')\r\n }\r\n\r\n private _updateValue(value: unknown) {\r\n if (this._form && this.path) {\r\n this._form.setValue(this.path, value)\r\n }\r\n }\r\n\r\n private _setControlStatus(status: 'error' | 'success' | undefined) {\r\n const control = this._findControl()\r\n if (!control) return\r\n // Boolean error / success (input, select)\r\n if ('error' in control) {\r\n ;(control as any).error = status === 'error'\r\n }\r\n if ('success' in control) {\r\n ;(control as any).success = status === 'success'\r\n }\r\n // Status string (input-number)\r\n if ('status' in control) {\r\n ;(control as any).status = status\r\n }\r\n }\r\n\r\n /** Validates the form item. */\r\n async validate(trigger?: 'blur' | 'change' | 'input'): Promise<boolean> {\r\n const rules = this._resolvedRules\r\n if (!rules || rules.length === 0) {\r\n this._errorMessage = ''\r\n this._setControlStatus(undefined)\r\n return true\r\n }\r\n\r\n const value = this._getValue()\r\n\r\n for (const rule of rules) {\r\n const triggers = Array.isArray(rule.trigger) ? rule.trigger : [rule.trigger || 'change']\r\n if (trigger && !triggers.includes(trigger)) continue\r\n\r\n // required\r\n if (rule.required) {\r\n const isEmpty =\r\n value === undefined ||\r\n value === null ||\r\n value === '' ||\r\n (Array.isArray(value) && value.length === 0)\r\n if (isEmpty) {\r\n this._errorMessage = rule.message || `${this.label || this.path} 是必填项`\r\n this._setControlStatus('error')\r\n return false\r\n }\r\n }\r\n\r\n // Skip other checks if value is empty and not required\r\n if (\r\n value === undefined ||\r\n value === null ||\r\n value === '' ||\r\n (Array.isArray(value) && value.length === 0)\r\n ) {\r\n continue\r\n }\r\n\r\n // type\r\n if (rule.type) {\r\n const valid = this._checkType(value, rule.type)\r\n if (!valid) {\r\n this._errorMessage = rule.message || `${this.label || this.path} 格式不正确`\r\n this._setControlStatus('error')\r\n return false\r\n }\r\n }\r\n\r\n // min / max\r\n if (rule.min !== undefined || rule.max !== undefined) {\r\n const len =\r\n typeof value === 'string'\r\n ? value.length\r\n : Array.isArray(value)\r\n ? value.length\r\n : Number(value)\r\n if (rule.min !== undefined && len < rule.min) {\r\n this._errorMessage = rule.message || `${this.label || this.path} 不能小于 ${rule.min}`\r\n this._setControlStatus('error')\r\n return false\r\n }\r\n if (rule.max !== undefined && len > rule.max) {\r\n this._errorMessage = rule.message || `${this.label || this.path} 不能大于 ${rule.max}`\r\n this._setControlStatus('error')\r\n return false\r\n }\r\n }\r\n\r\n // len\r\n if (rule.len !== undefined) {\r\n const len =\r\n typeof value === 'string'\r\n ? value.length\r\n : Array.isArray(value)\r\n ? value.length\r\n : Number(value)\r\n if (len !== rule.len) {\r\n this._errorMessage = rule.message || `${this.label || this.path} 长度必须为 ${rule.len}`\r\n this._setControlStatus('error')\r\n return false\r\n }\r\n }\r\n\r\n // pattern\r\n if (rule.pattern && typeof value === 'string') {\r\n if (!rule.pattern.test(value)) {\r\n this._errorMessage = rule.message || `${this.label || this.path} 格式不正确`\r\n this._setControlStatus('error')\r\n return false\r\n }\r\n }\r\n\r\n // validator\r\n if (rule.validator) {\r\n try {\r\n const result = await rule.validator(value)\r\n if (result !== true) {\r\n this._errorMessage =\r\n typeof result === 'string'\r\n ? result\r\n : rule.message || `${this.label || this.path} 验证失败`\r\n this._setControlStatus('error')\r\n return false\r\n }\r\n } catch {\r\n this._errorMessage = rule.message || `${this.label || this.path} 验证失败`\r\n this._setControlStatus('error')\r\n return false\r\n }\r\n }\r\n }\r\n\r\n this._errorMessage = ''\r\n this._setControlStatus('success')\r\n return true\r\n }\r\n\r\n /** Resets the validation state. */\r\n reset() {\r\n this._errorMessage = ''\r\n this._setControlStatus(undefined)\r\n }\r\n\r\n private _checkType(value: unknown, type: string): boolean {\r\n switch (type) {\r\n case 'string':\r\n return typeof value === 'string'\r\n case 'number':\r\n return typeof value === 'number'\r\n case 'boolean':\r\n return typeof value === 'boolean'\r\n case 'array':\r\n return Array.isArray(value)\r\n case 'email':\r\n return typeof value === 'string' && /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value)\r\n case 'url':\r\n return typeof value === 'string' && /^https?:\\/\\/.+/.test(value)\r\n case 'date':\r\n return value instanceof Date || !isNaN(Date.parse(String(value)))\r\n default:\r\n return true\r\n }\r\n }\r\n\r\n private get _resolvedRules(): FormRule[] {\r\n const rules: FormRule[] = []\r\n if (this.required) {\r\n rules.push({ required: true, message: `${this.label || this.path} 是必填项` })\r\n }\r\n if (this.rule) {\r\n rules.push(...(Array.isArray(this.rule) ? this.rule : [this.rule]))\r\n }\r\n if (this._form && this.path && this._form.rules[this.path]) {\r\n const formRules = this._form.rules[this.path]\r\n rules.push(...(Array.isArray(formRules) ? formRules : [formRules]))\r\n }\r\n return rules\r\n }\r\n\r\n private get _showLabel(): boolean {\r\n return this.showLabel !== undefined ? this.showLabel : (this._form?.showLabel ?? true)\r\n }\r\n\r\n private get _showFeedback(): boolean {\r\n return this.showFeedback !== undefined ? this.showFeedback : (this._form?.showFeedback ?? true)\r\n }\r\n\r\n private get _labelAlign(): 'left' | 'right' | 'top' {\r\n return (this._form?.labelAlign as 'left' | 'right' | 'top') || 'right'\r\n }\r\n\r\n override render() {\r\n const labelAlign = this._labelAlign\r\n const isTop = labelAlign === 'top'\r\n\r\n return html`\r\n <div part=\"base\" class=\"form-item ${isTop ? 'form-item--top' : ''}\">\r\n ${\r\n this._showLabel && this.label\r\n ? html`\r\n <label part=\"label\" class=\"form-item__label form-item__label--${labelAlign}\">\r\n ${\r\n this.required || this._resolvedRules.some((r) => r.required)\r\n ? html`<span class=\"required\">*</span>`\r\n : nothing\r\n }\r\n ${this.label}\r\n </label>\r\n `\r\n : nothing\r\n }\r\n <div part=\"content\" class=\"form-item__content\">\r\n <slot></slot>\r\n ${\r\n this._showFeedback && this._errorMessage\r\n ? html`<div part=\"error\" class=\"form-item__error\">${this._errorMessage}</div>`\r\n : nothing\r\n }\r\n </div>\r\n </div>\r\n `\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'mac-form-item': MacFormItem\r\n }\r\n}\r\n","import { html, css, nothing } from 'lit'\r\nimport { property, customElement, state } from 'lit/decorators.js'\r\nimport { BaseElement } from '../../internal/base-element'\r\nimport { sharedStyles } from '../../styles/shared-styles'\r\nimport { themeTokens } from '../../styles/theme'\r\n\r\n/**\r\n * @tag mac-radio\r\n * @summary macOS 风格的单选按钮组件。\r\n *\r\n * @slot - 单选按钮的标签。\r\n *\r\n * @csspart base - 单选按钮的基础容器。\r\n * @csspart control - 单选按钮控制圆圈。\r\n * @csspart label - 标签元素。\r\n */\r\n@customElement('mac-radio')\r\nexport class MacRadio extends BaseElement {\r\n static override styles = [\r\n themeTokens,\r\n sharedStyles,\r\n css`\r\n :host {\r\n display: inline-flex;\r\n }\r\n\r\n .radio {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: var(--md-radio-gap);\r\n cursor: pointer;\r\n user-select: none;\r\n transition: opacity var(--md-transition-fast);\r\n }\r\n\r\n .radio--disabled {\r\n cursor: not-allowed;\r\n opacity: 0.5;\r\n }\r\n\r\n /* 控制 */\r\n .control {\r\n position: relative;\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n flex-shrink: 0;\r\n width: var(--md-radio-size);\r\n height: var(--md-radio-size);\r\n border-radius: 50%;\r\n border: 2px solid var(--md-radio-border-color);\r\n background: var(--md-radio-bg);\r\n transition:\r\n border-color var(--md-transition-fast),\r\n background var(--md-transition-fast);\r\n }\r\n\r\n .radio:hover:not(.radio--disabled) .control {\r\n border-color: var(--md-radio-border-hover-color);\r\n }\r\n\r\n .radio--checked .control {\r\n border-color: var(--md-radio-border-active-color);\r\n background: var(--md-radio-bg-active);\r\n }\r\n\r\n .radio--checked:hover:not(.radio--disabled) .control {\r\n border-color: var(--md-radio-border-active-hover-color);\r\n }\r\n\r\n /* 内部圆点 */\r\n .control::after {\r\n content: '';\r\n width: var(--md-radio-dot-size);\r\n height: var(--md-radio-dot-size);\r\n border-radius: 50%;\r\n background: var(--md-radio-dot-color);\r\n transform: scale(0);\r\n transition: transform var(--md-transition-fast);\r\n }\r\n\r\n .radio--checked .control::after {\r\n transform: scale(1);\r\n }\r\n\r\n /* 聚焦 */\r\n .radio:focus-visible .control {\r\n outline: 2px solid var(--md-color-primary);\r\n outline-offset: 2px;\r\n }\r\n\r\n /* 标签 */\r\n .label {\r\n font-size: var(--md-radio-font-size);\r\n color: var(--md-radio-label-color);\r\n transition: color var(--md-transition-fast);\r\n }\r\n\r\n .radio:hover:not(.radio--disabled) .label {\r\n color: var(--md-radio-label-hover-color);\r\n }\r\n\r\n /* 尺寸 — md 是 :host 默认值,仅覆盖 sm/lg */\r\n :host {\r\n --md-radio-size: 18px;\r\n --md-radio-dot-size: 8px;\r\n --md-radio-gap: 8px;\r\n --md-radio-font-size: var(--md-font-size-base);\r\n }\r\n\r\n :host([size='sm']) {\r\n --md-radio-size: 14px;\r\n --md-radio-dot-size: 6px;\r\n --md-radio-gap: 6px;\r\n --md-radio-font-size: var(--md-font-size-sm);\r\n }\r\n\r\n :host([size='lg']) {\r\n --md-radio-size: 22px;\r\n --md-radio-dot-size: 10px;\r\n --md-radio-gap: 10px;\r\n --md-radio-font-size: var(--md-font-size-lg);\r\n }\r\n `,\r\n ]\r\n\r\n /** 单选按钮的值。 */\r\n @property() value = ''\r\n\r\n /** 单选按钮是否选中(受控)。 */\r\n @property({ type: Boolean, reflect: true }) checked = false\r\n\r\n /** 单选按钮默认是否选中(非受控)。 */\r\n @property({ type: Boolean, attribute: 'default-checked' }) defaultChecked = false\r\n\r\n /** 禁用单选按钮。 */\r\n @property({ type: Boolean, reflect: true }) disabled = false\r\n\r\n /** 单选按钮的标签文本。 */\r\n @property() label = ''\r\n\r\n /** 单选按钮的尺寸。 */\r\n @property({ reflect: true }) size?: 'sm' | 'md' | 'lg'\r\n\r\n @state() private _groupValue?: string\r\n\r\n private get _isControlled(): boolean {\r\n return this.hasAttribute('checked')\r\n }\r\n\r\n private get _isChecked(): boolean {\r\n if (this._groupValue !== undefined) {\r\n return this._groupValue === this.value\r\n }\r\n return this._isControlled ? this.checked : this.defaultChecked\r\n }\r\n\r\n override connectedCallback() {\r\n super.connectedCallback()\r\n // 同步默认尺寸到 DOM,以便 CSS :host([size]) 选择器生效\r\n const resolvedSize = this._resolvedSize\r\n if (!this.hasAttribute('size') && resolvedSize !== 'md') {\r\n this.setAttribute('size', resolvedSize)\r\n }\r\n this._registerToGroup()\r\n }\r\n\r\n override disconnectedCallback() {\r\n super.disconnectedCallback()\r\n this._unregisterFromGroup()\r\n }\r\n\r\n private _registerToGroup() {\r\n const group = this._findGroup()\r\n if (group) {\r\n group._registerRadio(this)\r\n }\r\n }\r\n\r\n private _unregisterFromGroup() {\r\n const group = this._findGroup()\r\n if (group) {\r\n group._unregisterRadio(this)\r\n }\r\n }\r\n\r\n private _findGroup(): MacRadioGroup | null {\r\n // Walk the light-DOM ancestry; the element itself is the starting node.\r\n // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n let el: Element | null = this\r\n while (el) {\r\n if (el.tagName.toLowerCase() === 'mac-radio-group') {\r\n return el as MacRadioGroup\r\n }\r\n el = el.parentElement\r\n }\r\n return null\r\n }\r\n\r\n /** 由父级组调用以同步值。 */\r\n _setGroupValue(value: string | undefined) {\r\n this._groupValue = value\r\n }\r\n\r\n private _handleClick() {\r\n if (this.disabled) return\r\n if (this._isChecked) return // 单选按钮无法通过点击取消选中\r\n\r\n const group = this._findGroup()\r\n if (group) {\r\n group._selectValue(this.value)\r\n } else {\r\n if (!this._isControlled) {\r\n this.defaultChecked = true\r\n }\r\n this.emit('mac-change', { detail: { value: this.value, checked: true } })\r\n }\r\n }\r\n\r\n private _handleKeydown(e: KeyboardEvent) {\r\n if (e.key === ' ' || e.key === 'Enter') {\r\n e.preventDefault()\r\n this._handleClick()\r\n }\r\n }\r\n\r\n override render() {\r\n const isChecked = this._isChecked\r\n\r\n return html`\r\n <div\r\n part=\"base\"\r\n class=\"radio ${isChecked ? 'radio--checked' : ''} ${this.disabled ? 'radio--disabled' : ''}\"\r\n tabindex=${this.disabled ? '-1' : '0'}\r\n role=\"radio\"\r\n aria-checked=${isChecked}\r\n @click=${this._handleClick}\r\n @keydown=${this._handleKeydown}\r\n >\r\n <span part=\"control\" class=\"control\"></span>\r\n ${\r\n this.label\r\n ? html`<span part=\"label\" class=\"label\">${this.label}</span>`\r\n : html`<span part=\"label\" class=\"label\"><slot></slot></span>`\r\n }\r\n </div>\r\n `\r\n }\r\n}\r\n\r\nexport interface RadioOption {\r\n value: string\r\n label: string\r\n disabled?: boolean\r\n}\r\n\r\n/**\r\n * @tag mac-radio-group\r\n * @summary macOS 风格的单选按钮组组件。\r\n *\r\n * @slot - 默认插槽,用于 mac-radio 元素。\r\n *\r\n * @csspart base - 组的基础容器。\r\n *\r\n * @event mac-change - 选中值变化时触发。\r\n */\r\n@customElement('mac-radio-group')\r\nexport class MacRadioGroup extends BaseElement {\r\n static override styles = [\r\n themeTokens,\r\n sharedStyles,\r\n css`\r\n :host {\r\n display: block;\r\n }\r\n\r\n .group {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: var(--md-radio-group-gap);\r\n }\r\n\r\n .group--vertical {\r\n flex-direction: column;\r\n }\r\n\r\n .group--horizontal {\r\n flex-direction: row;\r\n align-items: center;\r\n }\r\n `,\r\n ]\r\n\r\n /** 组的值(受控)。 */\r\n @property() value?: string\r\n\r\n /** 默认值(非受控)。 */\r\n @property({ attribute: 'default-value' }) defaultValue?: string\r\n\r\n /** 单选按钮 name 属性。 */\r\n @property() name = ''\r\n\r\n /** 组的尺寸。 */\r\n @property({ reflect: true }) size?: 'sm' | 'md' | 'lg'\r\n\r\n /** 禁用组内所有单选按钮。 */\r\n @property({ type: Boolean, reflect: true }) disabled = false\r\n\r\n /** 布局方向。 */\r\n @property({ reflect: true }) direction: 'horizontal' | 'vertical' = 'horizontal'\r\n\r\n /** 简化使用的选项数组。 */\r\n @property({ type: Array }) options?: RadioOption[]\r\n\r\n private _radios: MacRadio[] = []\r\n\r\n private get _isControlled(): boolean {\r\n return this.hasAttribute('value')\r\n }\r\n\r\n private get _resolvedValue(): string | undefined {\r\n return this._isControlled ? this.value : this.defaultValue\r\n }\r\n\r\n override connectedCallback() {\r\n super.connectedCallback()\r\n if (!this.hasAttribute('direction')) {\r\n this.setAttribute('direction', 'horizontal')\r\n }\r\n }\r\n\r\n override updated() {\r\n this._syncRadios()\r\n this._applyGroupProps()\r\n }\r\n\r\n _registerRadio(radio: MacRadio) {\r\n if (!this._radios.includes(radio)) {\r\n this._radios.push(radio)\r\n radio._setGroupValue(this._resolvedValue)\r\n }\r\n this._applyPropsToRadio(radio)\r\n }\r\n\r\n private _applyGroupProps() {\r\n this._radios.forEach((radio) => this._applyPropsToRadio(radio))\r\n }\r\n\r\n private _applyPropsToRadio(radio: MacRadio) {\r\n // 应用组级尺寸\r\n if (this.size) {\r\n radio.setAttribute('size', this.size)\r\n }\r\n // 应用组级禁用状态\r\n if (this.disabled) {\r\n radio.disabled = true\r\n } else if (!radio.hasAttribute('disabled')) {\r\n radio.disabled = false\r\n }\r\n }\r\n\r\n _unregisterRadio(radio: MacRadio) {\r\n const index = this._radios.indexOf(radio)\r\n if (index !== -1) {\r\n this._radios.splice(index, 1)\r\n }\r\n }\r\n\r\n _selectValue(value: string) {\r\n if (this._isControlled) {\r\n this.emit('mac-change', { detail: { value } })\r\n } else {\r\n this.defaultValue = value\r\n this._syncRadios()\r\n this.emit('mac-change', { detail: { value } })\r\n }\r\n }\r\n\r\n private _syncRadios() {\r\n const val = this._resolvedValue\r\n this._radios.forEach((radio) => {\r\n radio._setGroupValue(val)\r\n })\r\n }\r\n\r\n private _handleSlotChange() {\r\n // 插槽内容变化时重新注册单选按钮\r\n this._radios = []\r\n const radios = this.querySelectorAll('mac-radio')\r\n radios.forEach((radio) => this._registerRadio(radio as MacRadio))\r\n this._syncRadios()\r\n }\r\n\r\n override render() {\r\n const hasSlotContent = !this.options || this.options.length === 0\r\n\r\n return html`\r\n <div\r\n part=\"base\"\r\n class=\"group group--${this.direction}\"\r\n role=\"radiogroup\"\r\n aria-disabled=${this.disabled}\r\n >\r\n ${this.options?.map(\r\n (option) => html`\r\n <mac-radio\r\n .value=${option.value}\r\n .label=${option.label}\r\n .disabled=${option.disabled || this.disabled}\r\n .size=${this.size}\r\n ></mac-radio>\r\n `,\r\n )}\r\n ${hasSlotContent ? html`<slot @slotchange=${this._handleSlotChange}></slot>` : nothing}\r\n </div>\r\n `\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'mac-radio': MacRadio\r\n 'mac-radio-group': MacRadioGroup\r\n }\r\n}\r\n","import { html, css, nothing } from 'lit'\r\nimport { property, customElement, state } from 'lit/decorators.js'\r\nimport { BaseElement } from '../../internal/base-element'\r\nimport { sharedStyles } from '../../styles/shared-styles'\r\nimport { themeTokens } from '../../styles/theme'\r\n\r\n/**\r\n * @tag mac-checkbox\r\n * @summary macOS 风格的复选框组件。\r\n *\r\n * @slot - 复选框的标签。\r\n *\r\n * @csspart base - 复选框的基础容器。\r\n * @csspart control - 复选框的控制框。\r\n * @csspart label - 标签元素。\r\n */\r\n@customElement('mac-checkbox')\r\nexport class MacCheckbox extends BaseElement {\r\n static override styles = [\r\n themeTokens,\r\n sharedStyles,\r\n css`\r\n :host {\r\n display: inline-flex;\r\n }\r\n\r\n .checkbox {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: var(--md-checkbox-gap);\r\n cursor: pointer;\r\n user-select: none;\r\n transition: opacity var(--md-transition-fast);\r\n }\r\n\r\n .checkbox--disabled {\r\n cursor: not-allowed;\r\n opacity: 0.5;\r\n }\r\n\r\n /* 控制框 */\r\n .control {\r\n position: relative;\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n flex-shrink: 0;\r\n width: var(--md-checkbox-size);\r\n height: var(--md-checkbox-size);\r\n border-radius: var(--md-checkbox-radius);\r\n border: 2px solid var(--md-checkbox-border-color);\r\n background: var(--md-checkbox-bg);\r\n transition:\r\n border-color var(--md-transition-fast),\r\n background var(--md-transition-fast);\r\n }\r\n\r\n .checkbox:hover:not(.checkbox--disabled) .control {\r\n border-color: var(--md-checkbox-border-hover-color);\r\n }\r\n\r\n .checkbox--checked .control,\r\n .checkbox--indeterminate .control {\r\n border-color: var(--md-checkbox-border-active-color);\r\n background: var(--md-checkbox-bg-active);\r\n }\r\n\r\n .checkbox--checked:hover:not(.checkbox--disabled) .control,\r\n .checkbox--indeterminate:hover:not(.checkbox--disabled) .control {\r\n border-color: var(--md-checkbox-border-active-hover-color);\r\n }\r\n\r\n /* 对勾标记 */\r\n .control::after {\r\n content: '';\r\n position: absolute;\r\n width: 55%;\r\n height: 30%;\r\n border-left: 2px solid var(--md-checkbox-check-color);\r\n border-bottom: 2px solid var(--md-checkbox-check-color);\r\n transform: rotate(-45deg) scale(0);\r\n margin-top: -1px;\r\n transition: transform var(--md-transition-fast);\r\n }\r\n\r\n .checkbox--checked .control::after {\r\n transform: rotate(-45deg) scale(1);\r\n }\r\n\r\n /* 半选横线 */\r\n .control::before {\r\n content: '';\r\n position: absolute;\r\n width: 60%;\r\n height: 2px;\r\n background: var(--md-checkbox-check-color);\r\n transform: scaleX(0);\r\n transition: transform var(--md-transition-fast);\r\n }\r\n\r\n .checkbox--indeterminate .control::before {\r\n transform: scaleX(1);\r\n }\r\n\r\n .checkbox--indeterminate .control::after {\r\n transform: rotate(-45deg) scale(0);\r\n }\r\n\r\n /* 聚焦 */\r\n .checkbox:focus-visible .control {\r\n outline: 2px solid var(--md-color-primary);\r\n outline-offset: 2px;\r\n }\r\n\r\n /* 标签 */\r\n .label {\r\n font-size: var(--md-checkbox-font-size);\r\n color: var(--md-checkbox-label-color);\r\n transition: color var(--md-transition-fast);\r\n }\r\n\r\n .checkbox:hover:not(.checkbox--disabled) .label {\r\n color: var(--md-checkbox-label-hover-color);\r\n }\r\n\r\n /* 尺寸 — md 是 :host 上的默认值,仅覆盖 sm/lg */\r\n :host {\r\n --md-checkbox-size: 18px;\r\n --md-checkbox-gap: 8px;\r\n --md-checkbox-font-size: var(--md-font-size-base);\r\n --md-checkbox-radius: 4px;\r\n }\r\n\r\n :host([size='sm']) {\r\n --md-checkbox-size: 14px;\r\n --md-checkbox-gap: 6px;\r\n --md-checkbox-font-size: var(--md-font-size-sm);\r\n --md-checkbox-radius: 3px;\r\n }\r\n\r\n :host([size='lg']) {\r\n --md-checkbox-size: 22px;\r\n --md-checkbox-gap: 10px;\r\n --md-checkbox-font-size: var(--md-font-size-lg);\r\n --md-checkbox-radius: 5px;\r\n }\r\n `,\r\n ]\r\n\r\n /** 复选框的值。 */\r\n @property() value = ''\r\n\r\n /** 复选框是否被选中(受控模式)。 */\r\n @property({ type: Boolean, reflect: true }) checked = false\r\n\r\n /** 复选框默认是否被选中(非受控模式)。 */\r\n @property({ type: Boolean, attribute: 'default-checked' }) defaultChecked = false\r\n\r\n /** 复选框是否处于半选状态。 */\r\n @property({ type: Boolean, reflect: true }) indeterminate = false\r\n\r\n /** 禁用复选框。 */\r\n @property({ type: Boolean, reflect: true }) disabled = false\r\n\r\n /** 复选框的标签文本。 */\r\n @property() label = ''\r\n\r\n /** 复选框的尺寸。 */\r\n @property({ reflect: true }) size?: 'sm' | 'md' | 'lg'\r\n\r\n @state() private _groupValue?: string[]\r\n\r\n private get _isControlled(): boolean {\r\n return this.hasAttribute('checked')\r\n }\r\n\r\n private get _isChecked(): boolean {\r\n if (this._groupValue !== undefined) {\r\n return this._groupValue.includes(this.value)\r\n }\r\n return this._isControlled ? this.checked : this.defaultChecked\r\n }\r\n\r\n override connectedCallback() {\r\n super.connectedCallback()\r\n const resolvedSize = this._resolvedSize\r\n if (!this.hasAttribute('size') && resolvedSize !== 'md') {\r\n this.setAttribute('size', resolvedSize)\r\n }\r\n this._registerToGroup()\r\n }\r\n\r\n override disconnectedCallback() {\r\n super.disconnectedCallback()\r\n this._unregisterFromGroup()\r\n }\r\n\r\n private _registerToGroup() {\r\n const group = this._findGroup()\r\n if (group) {\r\n group._registerCheckbox(this)\r\n }\r\n }\r\n\r\n private _unregisterFromGroup() {\r\n const group = this._findGroup()\r\n if (group) {\r\n group._unregisterCheckbox(this)\r\n }\r\n }\r\n\r\n private _findGroup(): MacCheckboxGroup | null {\r\n // Walk the light-DOM ancestry; the element itself is the starting node.\r\n // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n let el: Element | null = this\r\n while (el) {\r\n if (el.tagName.toLowerCase() === 'mac-checkbox-group') {\r\n return el as MacCheckboxGroup\r\n }\r\n el = el.parentElement\r\n }\r\n return null\r\n }\r\n\r\n /** 由父组调用以同步值。 */\r\n _setGroupValue(value: string[] | undefined) {\r\n this._groupValue = value\r\n }\r\n\r\n private _handleClick() {\r\n if (this.disabled) return\r\n const group = this._findGroup()\r\n const newChecked = !this._isChecked\r\n\r\n if (group) {\r\n group._toggleValue(this.value, newChecked)\r\n } else {\r\n if (!this._isControlled) {\r\n this.defaultChecked = newChecked\r\n }\r\n this.indeterminate = false\r\n this.emit('mac-change', { detail: { value: this.value, checked: newChecked } })\r\n }\r\n }\r\n\r\n private _handleKeydown(e: KeyboardEvent) {\r\n if (e.key === ' ' || e.key === 'Enter') {\r\n e.preventDefault()\r\n this._handleClick()\r\n }\r\n }\r\n\r\n override render() {\r\n const isChecked = this._isChecked\r\n const isIndeterminate = this.indeterminate && !isChecked\r\n\r\n return html`\r\n <div\r\n part=\"base\"\r\n class=\"checkbox\r\n ${isChecked ? 'checkbox--checked' : ''}\r\n ${isIndeterminate ? 'checkbox--indeterminate' : ''}\r\n ${this.disabled ? 'checkbox--disabled' : ''}\"\r\n tabindex=${this.disabled ? '-1' : '0'}\r\n role=\"checkbox\"\r\n aria-checked=${isIndeterminate ? 'mixed' : isChecked}\r\n @click=${this._handleClick}\r\n @keydown=${this._handleKeydown}\r\n >\r\n <span part=\"control\" class=\"control\"></span>\r\n ${\r\n this.label\r\n ? html`<span part=\"label\" class=\"label\">${this.label}</span>`\r\n : html`<span part=\"label\" class=\"label\"><slot></slot></span>`\r\n }\r\n </div>\r\n `\r\n }\r\n}\r\n\r\nexport interface CheckboxOption {\r\n value: string\r\n label: string\r\n disabled?: boolean\r\n}\r\n\r\n/**\r\n * @tag mac-checkbox-group\r\n * @summary macOS 风格的复选框组组件。\r\n *\r\n * @slot - 用于放置 mac-checkbox 元素的默认插槽。\r\n *\r\n * @csspart base - 组的基础容器。\r\n *\r\n * @event mac-change - 选中值变化时触发。\r\n */\r\n@customElement('mac-checkbox-group')\r\nexport class MacCheckboxGroup extends BaseElement {\r\n static override styles = [\r\n themeTokens,\r\n sharedStyles,\r\n css`\r\n :host {\r\n display: block;\r\n }\r\n\r\n .group {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: var(--md-checkbox-group-gap);\r\n }\r\n\r\n .group--vertical {\r\n flex-direction: column;\r\n }\r\n\r\n .group--horizontal {\r\n flex-direction: row;\r\n align-items: center;\r\n }\r\n `,\r\n ]\r\n\r\n /** 组的值(受控模式)。 */\r\n @property({ type: Array }) value: string[] = []\r\n\r\n /** 默认值(非受控模式)。 */\r\n @property({ type: Array, attribute: 'default-value' }) defaultValue: string[] = []\r\n\r\n /** 复选框的 name 属性。 */\r\n @property() name = ''\r\n\r\n /** 组的尺寸。 */\r\n @property({ reflect: true }) size?: 'sm' | 'md' | 'lg'\r\n\r\n /** 禁用组内所有复选框。 */\r\n @property({ type: Boolean, reflect: true }) disabled = false\r\n\r\n /** 布局方向。 */\r\n @property({ reflect: true }) direction: 'horizontal' | 'vertical' = 'horizontal'\r\n\r\n /** 简化用法时的选项数组。 */\r\n @property({ type: Array }) options?: CheckboxOption[]\r\n\r\n /** 最大可选数量。 */\r\n @property({ type: Number }) max?: number\r\n\r\n private _checkboxes: MacCheckbox[] = []\r\n\r\n private get _isControlled(): boolean {\r\n return this.hasAttribute('value')\r\n }\r\n\r\n private get _resolvedValue(): string[] {\r\n return this._isControlled ? this.value : this.defaultValue\r\n }\r\n\r\n override connectedCallback() {\r\n super.connectedCallback()\r\n if (!this.hasAttribute('direction')) {\r\n this.setAttribute('direction', 'horizontal')\r\n }\r\n }\r\n\r\n override updated() {\r\n this._syncCheckboxes()\r\n this._applyGroupProps()\r\n }\r\n\r\n _registerCheckbox(checkbox: MacCheckbox) {\r\n if (!this._checkboxes.includes(checkbox)) {\r\n this._checkboxes.push(checkbox)\r\n checkbox._setGroupValue(this._resolvedValue)\r\n }\r\n this._applyPropsToCheckbox(checkbox)\r\n }\r\n\r\n private _applyGroupProps() {\r\n this._checkboxes.forEach((cb) => this._applyPropsToCheckbox(cb))\r\n }\r\n\r\n private _applyPropsToCheckbox(checkbox: MacCheckbox) {\r\n if (this.size) {\r\n checkbox.setAttribute('size', this.size)\r\n }\r\n if (this.disabled) {\r\n checkbox.disabled = true\r\n } else if (!checkbox.hasAttribute('disabled')) {\r\n checkbox.disabled = false\r\n }\r\n }\r\n\r\n _unregisterCheckbox(checkbox: MacCheckbox) {\r\n const index = this._checkboxes.indexOf(checkbox)\r\n if (index !== -1) {\r\n this._checkboxes.splice(index, 1)\r\n }\r\n }\r\n\r\n _toggleValue(value: string, checked: boolean) {\r\n let newValue: string[]\r\n if (checked) {\r\n if (this.max && this._resolvedValue.length >= this.max) {\r\n return\r\n }\r\n newValue = [...this._resolvedValue, value]\r\n } else {\r\n newValue = this._resolvedValue.filter((v) => v !== value)\r\n }\r\n\r\n if (this._isControlled) {\r\n this.emit('mac-change', { detail: { value: newValue } })\r\n } else {\r\n this.defaultValue = newValue\r\n this._syncCheckboxes()\r\n this.emit('mac-change', { detail: { value: newValue } })\r\n }\r\n }\r\n\r\n private _syncCheckboxes() {\r\n const val = this._resolvedValue\r\n this._checkboxes.forEach((cb) => {\r\n cb._setGroupValue(val)\r\n })\r\n }\r\n\r\n private _handleSlotChange() {\r\n this._checkboxes = []\r\n const checkboxes = this.querySelectorAll('mac-checkbox')\r\n checkboxes.forEach((cb) => this._registerCheckbox(cb as MacCheckbox))\r\n this._syncCheckboxes()\r\n }\r\n\r\n override render() {\r\n const hasSlotContent = !this.options || this.options.length === 0\r\n\r\n return html`\r\n <div\r\n part=\"base\"\r\n class=\"group group--${this.direction}\"\r\n role=\"group\"\r\n aria-disabled=${this.disabled}\r\n >\r\n ${this.options?.map(\r\n (option) => html`\r\n <mac-checkbox\r\n .value=${option.value}\r\n .label=${option.label}\r\n .disabled=${option.disabled || this.disabled}\r\n .size=${this.size}\r\n ></mac-checkbox>\r\n `,\r\n )}\r\n ${hasSlotContent ? html`<slot @slotchange=${this._handleSlotChange}></slot>` : nothing}\r\n </div>\r\n `\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'mac-checkbox': MacCheckbox\r\n 'mac-checkbox-group': MacCheckboxGroup\r\n }\r\n}\r\n","export const pad = (n: number) => String(n).padStart(2, '0')\r\n\r\nexport function fmtDate(d: Date, f: string) {\r\n return f\r\n .replace('YYYY', String(d.getFullYear()))\r\n .replace('MM', pad(d.getMonth() + 1))\r\n .replace('DD', pad(d.getDate()))\r\n .replace('HH', pad(d.getHours()))\r\n .replace('mm', pad(d.getMinutes()))\r\n .replace('ss', pad(d.getSeconds()))\r\n}\r\n\r\nexport function prsDate(s: string, f: string): Date | null {\r\n if (!s) return null\r\n if (f.startsWith('YYYY-MM-DD HH')) {\r\n const m = s.match(/^(\\d{4})-(\\d{2})-(\\d{2}) (\\d{2}):(\\d{2}):(\\d{2})$/)\r\n if (m) {\r\n const [, y, M, d, h, mi, se] = m.map(Number)\r\n const date = new Date(y, M - 1, d, h, mi, se)\r\n if (date.getFullYear() === y && date.getMonth() === M - 1 && date.getDate() === d) return date\r\n }\r\n }\r\n const m = s.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/)\r\n if (m) {\r\n const [, y, M, d] = m.map(Number)\r\n const date = new Date(y, M - 1, d)\r\n if (date.getFullYear() === y && date.getMonth() === M - 1 && date.getDate() === d) return date\r\n }\r\n const d = new Date(s)\r\n return isNaN(d.getTime()) ? null : d\r\n}\r\n\r\nexport function sameDay(a: Date, b: Date) {\r\n return (\r\n a.getFullYear() === b.getFullYear() &&\r\n a.getMonth() === b.getMonth() &&\r\n a.getDate() === b.getDate()\r\n )\r\n}\r\n\r\nexport function weekStart(d: Date) {\r\n const x = new Date(d)\r\n x.setDate(x.getDate() - x.getDay())\r\n x.setHours(0, 0, 0, 0)\r\n return x\r\n}\r\n\r\nexport function weekNumber(d: Date) {\r\n const s = weekStart(d)\r\n const y = new Date(s.getFullYear(), 0, 1)\r\n return Math.ceil(((s.getTime() - y.getTime()) / 86400000 + 1) / 7)\r\n}\r\n\r\nexport function calDays(y: number, m: number) {\r\n const f = new Date(y, m, 1).getDay()\r\n const p = new Date(y, m, 0).getDate()\r\n const l = new Date(y, m + 1, 0).getDate()\r\n const d: { date: Date; cur: boolean }[] = []\r\n for (let i = f - 1; i >= 0; i--) d.push({ date: new Date(y, m - 1, p - i), cur: false })\r\n for (let i = 1; i <= l; i++) d.push({ date: new Date(y, m, i), cur: true })\r\n for (let i = 1; d.length < 42; i++) d.push({ date: new Date(y, m + 1, i), cur: false })\r\n return d\r\n}\r\n\r\nexport const WDS = ['日', '一', '二', '三', '四', '五', '六']\r\nexport const MNS = [\r\n '1月',\r\n '2月',\r\n '3月',\r\n '4月',\r\n '5月',\r\n '6月',\r\n '7月',\r\n '8月',\r\n '9月',\r\n '10月',\r\n '11月',\r\n '12月',\r\n]\r\nexport const QNS = ['第一季度', '第二季度', '第三季度', '第四季度']\r\n","import { html, css, nothing, render } from 'lit'\r\nimport { property, customElement, state, query } from 'lit/decorators.js'\r\nimport { BaseElement } from '../../internal/base-element'\r\nimport { sharedStyles } from '../../styles/shared-styles'\r\nimport { themeTokens } from '../../styles/theme'\r\nimport {\r\n pad,\r\n fmtDate,\r\n prsDate,\r\n sameDay,\r\n weekStart,\r\n weekNumber,\r\n calDays,\r\n WDS,\r\n MNS,\r\n QNS,\r\n} from './date-picker-utils'\r\n\r\nexport type PickerType = 'date' | 'datetime' | 'year' | 'quarter' | 'week'\r\nexport type PanelView = 'day' | 'month' | 'year'\r\n\r\n@customElement('mac-date-picker')\r\nexport class MacDatePicker extends BaseElement {\r\n static override styles = [\r\n themeTokens,\r\n sharedStyles,\r\n css`\r\n :host {\r\n display: block;\r\n }\r\n .picker {\r\n position: relative;\r\n }\r\n\r\n .picker-trigger {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: var(--md-spacing-sm);\r\n padding: var(--md-select-trigger-padding-vertical)\r\n var(--md-select-trigger-padding-horizontal);\r\n border-radius: var(--md-radius-lg);\r\n background: var(--md-color-bg);\r\n cursor: pointer;\r\n transition: all 200ms cubic-bezier(0.4, 0, 0.2, 1);\r\n user-select: none;\r\n min-height: var(--md-select-trigger-min-height);\r\n border: 1px solid var(--md-color-border);\r\n }\r\n .picker-trigger:hover:not(.picker-trigger--disabled) {\r\n border-color: var(--md-color-primary);\r\n }\r\n .picker-trigger.open,\r\n .picker-trigger:focus-within {\r\n border-color: var(--md-color-primary);\r\n box-shadow:\r\n 0 0 0 3px rgba(0, 122, 255, 0.1),\r\n 0 2px 8px rgba(0, 122, 255, 0.08);\r\n }\r\n .picker-trigger--disabled {\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n pointer-events: none;\r\n background: var(--md-color-bg-secondary);\r\n }\r\n .picker-trigger--error {\r\n border-color: var(--md-color-danger);\r\n }\r\n .picker-trigger--error.open,\r\n .picker-trigger--error:focus-within {\r\n box-shadow:\r\n 0 0 0 3px rgba(255, 59, 48, 0.1),\r\n 0 2px 8px rgba(255, 59, 48, 0.08);\r\n }\r\n .picker-trigger--success {\r\n border-color: var(--md-color-success);\r\n }\r\n .picker-value {\r\n flex: 1;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n }\r\n .picker-placeholder {\r\n color: #9ca3af;\r\n }\r\n .picker-icon {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 20px;\r\n height: 20px;\r\n color: #9ca3af;\r\n flex-shrink: 0;\r\n }\r\n .picker-icon ::slotted(*) {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n }\r\n .picker-clear {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 18px;\r\n height: 18px;\r\n border: none;\r\n background: rgba(0, 0, 0, 0.06);\r\n border-radius: 50%;\r\n cursor: pointer;\r\n color: var(--md-color-text-secondary);\r\n font-size: 10px;\r\n transition: all 200ms;\r\n padding: 0;\r\n flex-shrink: 0;\r\n }\r\n .picker-clear:hover {\r\n background: rgba(0, 0, 0, 0.1);\r\n color: var(--md-color-text);\r\n }\r\n\r\n /* 内联面板模式(当 panel=true 时) */\r\n .picker-panel--inline {\r\n position: static;\r\n opacity: 1;\r\n transform: none;\r\n pointer-events: auto;\r\n box-shadow: none;\r\n width: var(--md-date-picker-panel-width);\r\n background: var(--md-color-bg);\r\n border: 1px solid var(--md-color-border);\r\n border-radius: var(--md-date-picker-panel-border-radius);\r\n padding: var(--md-date-picker-panel-padding);\r\n }\r\n\r\n .panel-header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n margin-bottom: var(--md-date-picker-header-margin-bottom);\r\n }\r\n .panel-header-title {\r\n font-size: var(--md-date-picker-header-font-size);\r\n font-weight: 600;\r\n color: var(--md-color-text);\r\n cursor: pointer;\r\n padding: 2px 8px;\r\n border-radius: var(--md-radius-md);\r\n transition: background 150ms;\r\n }\r\n .panel-header-title:hover {\r\n background: rgba(0, 0, 0, 0.04);\r\n }\r\n .panel-nav {\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n }\r\n .panel-nav-btn {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: var(--md-date-picker-nav-btn-size);\r\n height: var(--md-date-picker-nav-btn-size);\r\n border: none;\r\n background: transparent;\r\n border-radius: 50%;\r\n cursor: pointer;\r\n color: var(--md-color-text-secondary);\r\n transition: all 150ms;\r\n padding: 0;\r\n }\r\n .panel-nav-btn:hover {\r\n background: rgba(0, 0, 0, 0.06);\r\n color: var(--md-color-text);\r\n }\r\n\r\n .panel-weekdays {\r\n display: grid;\r\n grid-template-columns: var(--md-date-picker-week-num-width) repeat(7, 1fr);\r\n gap: var(--md-date-picker-day-gap);\r\n margin-bottom: 4px;\r\n }\r\n .panel-weekdays--no-week {\r\n grid-template-columns: repeat(7, 1fr);\r\n }\r\n .weekday {\r\n text-align: center;\r\n font-size: var(--md-date-picker-weekday-font-size);\r\n font-weight: 500;\r\n color: #9ca3af;\r\n padding: 4px 0;\r\n }\r\n\r\n .panel-days {\r\n display: grid;\r\n grid-template-columns: var(--md-date-picker-week-num-width) repeat(7, 1fr);\r\n gap: var(--md-date-picker-day-gap);\r\n }\r\n .panel-days--no-week {\r\n grid-template-columns: repeat(7, 1fr);\r\n }\r\n .week-num {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n height: var(--md-date-picker-week-num-height);\r\n font-size: 10px;\r\n color: var(--md-color-text-secondary);\r\n opacity: 0.5;\r\n cursor: pointer;\r\n border: none;\r\n background: transparent;\r\n padding: 0;\r\n border-radius: var(--md-radius-sm);\r\n }\r\n .week-num:hover {\r\n color: var(--md-color-primary);\r\n opacity: 1;\r\n background: rgba(0, 122, 255, 0.06);\r\n }\r\n .day {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: var(--md-date-picker-day-width);\r\n height: var(--md-date-picker-day-height);\r\n border: none;\r\n background: transparent;\r\n border-radius: var(--md-radius-sm);\r\n cursor: pointer;\r\n font-size: var(--md-font-size-sm);\r\n color: var(--md-color-text);\r\n transition: all 150ms;\r\n padding: 0;\r\n }\r\n .day:hover:not(.day--disabled):not(.day--today):not(.day--in-range) {\r\n background: rgba(0, 122, 255, 0.1);\r\n border-radius: 50%;\r\n }\r\n .day--other {\r\n color: var(--md-color-text-secondary);\r\n opacity: 0.35;\r\n }\r\n .day--today {\r\n background: var(--md-color-primary);\r\n color: #fff;\r\n border-radius: 50%;\r\n }\r\n .day--today:hover {\r\n background: var(--md-color-primary-hover);\r\n }\r\n .day--selected {\r\n color: var(--md-color-primary);\r\n font-weight: 600;\r\n border: 1px solid var(--md-color-primary);\r\n border-radius: 50%;\r\n }\r\n .day--disabled {\r\n opacity: 0.3;\r\n cursor: not-allowed;\r\n text-decoration: line-through;\r\n }\r\n .day--in-range {\r\n background: rgba(0, 122, 255, 0.08);\r\n border-radius: 0;\r\n }\r\n .day--range-start {\r\n background: var(--md-color-primary);\r\n color: #fff;\r\n border-radius: 50% 0 0 50%;\r\n }\r\n .day--range-end {\r\n background: var(--md-color-primary);\r\n color: #fff;\r\n border-radius: 0 50% 50% 0;\r\n }\r\n\r\n .panel-grid {\r\n display: grid;\r\n grid-template-columns: repeat(3, 1fr);\r\n gap: var(--md-date-picker-grid-gap);\r\n }\r\n .grid-cell {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n height: var(--md-date-picker-grid-cell-height);\r\n border: none;\r\n background: transparent;\r\n border-radius: var(--md-radius-lg);\r\n cursor: pointer;\r\n font-size: var(--md-font-size-sm);\r\n color: var(--md-color-text);\r\n transition: all 150ms;\r\n padding: 0;\r\n }\r\n .grid-cell:hover:not(.grid-cell--disabled):not(.grid-cell--selected) {\r\n background: rgba(0, 122, 255, 0.1);\r\n }\r\n .grid-cell--selected {\r\n background: var(--md-color-primary);\r\n color: #fff;\r\n }\r\n .grid-cell--selected:hover {\r\n background: var(--md-color-primary-hover);\r\n }\r\n .grid-cell--disabled {\r\n opacity: 0.3;\r\n cursor: not-allowed;\r\n }\r\n\r\n .panel-year-grid {\r\n display: grid;\r\n grid-template-columns: repeat(4, 1fr);\r\n gap: var(--md-date-picker-grid-gap);\r\n }\r\n .year-cell {\r\n height: var(--md-date-picker-year-cell-height);\r\n font-size: var(--md-font-size-sm);\r\n }\r\n\r\n .time-row {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--md-spacing-xs);\r\n margin-top: var(--md-date-picker-footer-margin-top);\r\n padding-top: var(--md-date-picker-footer-margin-top);\r\n border-top: 1px solid var(--md-color-border);\r\n justify-content: center;\r\n }\r\n .time-input {\r\n width: var(--md-date-picker-time-input-width);\r\n padding: 6px 4px;\r\n border: 1px solid var(--md-color-border);\r\n border-radius: var(--md-radius-md);\r\n font-size: var(--md-font-size-sm);\r\n text-align: center;\r\n color: var(--md-color-text);\r\n background: var(--md-color-bg);\r\n outline: none;\r\n transition: border-color 200ms;\r\n }\r\n .time-input:focus {\r\n border-color: var(--md-color-primary);\r\n }\r\n .time-sep {\r\n color: var(--md-color-text-secondary);\r\n font-size: var(--md-font-size-sm);\r\n }\r\n\r\n .panel-footer {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n margin-top: var(--md-date-picker-footer-margin-top);\r\n padding-top: var(--md-date-picker-footer-margin-top);\r\n border-top: 1px solid var(--md-color-border);\r\n }\r\n .panel-footer-btn {\r\n font-size: var(--md-font-size-sm);\r\n color: var(--md-color-primary);\r\n background: transparent;\r\n border: none;\r\n cursor: pointer;\r\n padding: 4px 12px;\r\n border-radius: var(--md-radius-md);\r\n transition: background 150ms;\r\n }\r\n .panel-footer-btn:hover {\r\n background: rgba(0, 122, 255, 0.08);\r\n }\r\n\r\n .picker-trigger--sm {\r\n padding: var(--sm-select-trigger-padding-vertical)\r\n var(--sm-select-trigger-padding-horizontal);\r\n font-size: var(--sm-select-trigger-font-size);\r\n min-height: var(--sm-select-trigger-min-height);\r\n }\r\n .picker-trigger--lg {\r\n padding: var(--lg-select-trigger-padding-vertical)\r\n var(--lg-select-trigger-padding-horizontal);\r\n font-size: var(--lg-select-trigger-font-size);\r\n min-height: var(--lg-select-trigger-min-height);\r\n }\r\n\r\n :host([size='sm']) {\r\n --md-date-picker-panel-width: var(--sm-date-picker-panel-width);\r\n --md-date-picker-panel-padding: var(--sm-date-picker-panel-padding);\r\n --md-date-picker-panel-border-radius: var(--sm-date-picker-panel-border-radius);\r\n --md-date-picker-day-width: var(--sm-date-picker-day-width);\r\n --md-date-picker-day-height: var(--sm-date-picker-day-height);\r\n --md-date-picker-nav-btn-size: var(--sm-date-picker-nav-btn-size);\r\n --md-date-picker-header-font-size: var(--sm-date-picker-header-font-size);\r\n --md-date-picker-header-margin-bottom: var(--sm-date-picker-header-margin-bottom);\r\n --md-date-picker-week-num-width: var(--sm-date-picker-week-num-width);\r\n --md-date-picker-week-num-height: var(--sm-date-picker-week-num-height);\r\n --md-date-picker-weekday-font-size: var(--sm-date-picker-weekday-font-size);\r\n --md-date-picker-grid-gap: var(--sm-date-picker-grid-gap);\r\n --md-date-picker-grid-cell-height: var(--sm-date-picker-grid-cell-height);\r\n --md-date-picker-year-cell-height: var(--sm-date-picker-year-cell-height);\r\n --md-date-picker-time-input-width: var(--sm-date-picker-time-input-width);\r\n --md-date-picker-footer-margin-top: var(--sm-date-picker-footer-margin-top);\r\n --md-date-picker-day-gap: var(--sm-date-picker-day-gap);\r\n }\r\n :host([size='lg']) {\r\n --md-date-picker-panel-width: var(--lg-date-picker-panel-width);\r\n --md-date-picker-panel-padding: var(--lg-date-picker-panel-padding);\r\n --md-date-picker-panel-border-radius: var(--lg-date-picker-panel-border-radius);\r\n --md-date-picker-day-height: var(--lg-date-picker-day-height);\r\n --md-date-picker-day-height: var(--lg-date-picker-day-width);\r\n --md-date-picker-nav-btn-size: var(--lg-date-picker-nav-btn-size);\r\n --md-date-picker-header-font-size: var(--lg-date-picker-header-font-size);\r\n --md-date-picker-header-margin-bottom: var(--lg-date-picker-header-margin-bottom);\r\n --md-date-picker-week-num-width: var(--lg-date-picker-week-num-width);\r\n --md-date-picker-week-num-height: var(--lg-date-picker-week-num-height);\r\n --md-date-picker-weekday-font-size: var(--lg-date-picker-weekday-font-size);\r\n --md-date-picker-grid-gap: var(--lg-date-picker-grid-gap);\r\n --md-date-picker-grid-cell-height: var(--lg-date-picker-grid-cell-height);\r\n --md-date-picker-year-cell-height: var(--lg-date-picker-year-cell-height);\r\n --md-date-picker-time-input-width: var(--lg-date-picker-time-input-width);\r\n --md-date-picker-footer-margin-top: var(--lg-date-picker-footer-margin-top);\r\n --md-date-picker-day-gap: var(--lg-date-picker-day-gap);\r\n }\r\n\r\n :host([data-theme='dark']) .picker-clear {\r\n background: rgba(255, 255, 255, 0.1);\r\n }\r\n :host([data-theme='dark']) .picker-clear:hover {\r\n background: rgba(255, 255, 255, 0.15);\r\n }\r\n :host([data-theme='dark']) .panel-nav-btn:hover {\r\n background: rgba(255, 255, 255, 0.08);\r\n }\r\n :host([data-theme='dark']) .day--today {\r\n background: var(--md-color-primary);\r\n }\r\n :host([data-theme='dark']) .grid-cell--selected {\r\n background: var(--md-color-primary);\r\n }\r\n :host([data-theme='dark']) .panel-footer-btn:hover {\r\n background: rgba(0, 122, 255, 0.15);\r\n }\r\n :host([data-theme='dark']) .time-input {\r\n background: var(--md-color-bg);\r\n border-color: var(--md-color-border);\r\n color: var(--md-color-text);\r\n }\r\n `,\r\n ]\r\n\r\n @property() value = ''\r\n @property({ attribute: 'default-value' }) defaultValue = ''\r\n @property() format = 'YYYY-MM-DD'\r\n @property() placeholder = '选择日期'\r\n @property({ type: Boolean, reflect: true }) disabled = false\r\n @property({ reflect: true }) size?: 'sm' | 'md' | 'lg'\r\n @property({ type: Boolean }) clearable = false\r\n @property({ type: Boolean, reflect: true }) error = false\r\n @property({ type: Boolean, reflect: true }) success = false\r\n @property({ attribute: false }) disabledDate?: (date: Date) => boolean\r\n @property({ reflect: true }) type: PickerType = 'date'\r\n @property({ type: Boolean, reflect: true }) panel = false\r\n @property({\r\n attribute: 'show-footer',\r\n converter: {\r\n fromAttribute: (value: string | null) => {\r\n if (value === null) return true\r\n return value !== 'false'\r\n },\r\n toAttribute: (value: boolean) => (value ? null : 'false'),\r\n },\r\n })\r\n showFooter = true\r\n\r\n @state() private _open = false\r\n @state() private _view = new Date()\r\n @state() private _panelView: PanelView = 'day'\r\n @state() private _hh = 0\r\n @state() private _mm = 0\r\n @state() private _ss = 0\r\n\r\n @query('.picker-trigger') private _trigger!: HTMLElement\r\n\r\n private _portalEl: HTMLElement | null = null\r\n private _portalId = `mac-date-picker-portal-${Math.random().toString(36).substr(2, 9)}`\r\n private _scrollHandler: (() => void) | null = null\r\n\r\n private get _ctrl() {\r\n return this.hasAttribute('value')\r\n }\r\n private get _resVal() {\r\n return this._ctrl ? this.value : this.defaultValue\r\n }\r\n private get _selDate() {\r\n return prsDate(this._resVal, this.format)\r\n }\r\n\r\n private static _stylesInjected = false\r\n private static _injectPortalStyles() {\r\n if (MacDatePicker._stylesInjected) return\r\n MacDatePicker._stylesInjected = true\r\n\r\n const style = document.createElement('style')\r\n style.id = 'mac-date-picker-portal-styles'\r\n style.textContent = `\r\n /* 为 portal 定义 CSS 变量(以防未被继承) */\r\n .mac-date-picker-portal {\r\n --md-color-primary: #3b82f6;\r\n --md-color-primary-hover: #2563eb;\r\n --md-color-primary-active: #1d4ed8;\r\n --md-color-success: #22c55e;\r\n --md-color-warning: #f59e0b;\r\n --md-color-danger: #ef4444;\r\n --md-color-text: #1f2937;\r\n --md-color-text-secondary: #6b7280;\r\n --md-color-border: #d1d5db;\r\n --md-color-bg: #ffffff;\r\n --md-color-bg-secondary: #f9fafb;\r\n\r\n --md-spacing-xs: 4px;\r\n --md-spacing-sm: 8px;\r\n --md-spacing-md: 12px;\r\n --md-spacing-lg: 16px;\r\n\r\n --md-radius-sm: 4px;\r\n --md-radius-md: 6px;\r\n --md-radius-lg: 8px;\r\n\r\n --md-font-size-xs: 11px;\r\n --md-font-size-sm: 12px;\r\n --md-font-size-base: 14px;\r\n --md-font-size-lg: 16px;\r\n\r\n /* DatePicker 尺寸变量(默认 md) */\r\n --dp-panel-width: 288px;\r\n --dp-panel-padding: 16px;\r\n --dp-panel-border-radius: 12px;\r\n --dp-day-height: 32px;\r\n --dp-nav-btn-size: 28px;\r\n --dp-header-font-size: 15px;\r\n --dp-header-margin-bottom: 12px;\r\n --dp-week-num-width: 32px;\r\n --dp-week-num-height: 32px;\r\n --dp-weekday-font-size: 11px;\r\n --dp-grid-gap: 8px;\r\n --dp-grid-cell-height: 48px;\r\n --dp-year-cell-height: 40px;\r\n --dp-time-input-width: 48px;\r\n --dp-footer-margin-top: 12px;\r\n --dp-day-gap: 2px;\r\n\r\n position: fixed;\r\n width: var(--dp-panel-width);\r\n background: var(--md-color-bg);\r\n border: 1px solid var(--md-color-border);\r\n border-radius: var(--dp-panel-border-radius);\r\n box-shadow: 0 12px 40px rgba(0, 0, 0, 0.12), 0 4px 12px rgba(0, 0, 0, 0.08);\r\n z-index: 99999;\r\n opacity: 0;\r\n transform: translateY(-8px) scale(0.96);\r\n pointer-events: none;\r\n transition: opacity 200ms cubic-bezier(0.4, 0, 0.2, 1), transform 200ms cubic-bezier(0.4, 0, 0.2, 1);\r\n padding: var(--dp-panel-padding);\r\n font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Display', 'SF Pro Text', 'Helvetica Neue', sans-serif;\r\n }\r\n .mac-date-picker-portal[data-size='sm'] {\r\n --dp-panel-width: 264px;\r\n --dp-panel-padding: 12px;\r\n --dp-panel-border-radius: 10px;\r\n --dp-day-height: 28px;\r\n --dp-nav-btn-size: 24px;\r\n --dp-header-font-size: 14px;\r\n --dp-header-margin-bottom: 10px;\r\n --dp-week-num-width: 28px;\r\n --dp-week-num-height: 28px;\r\n --dp-weekday-font-size: 10px;\r\n --dp-grid-gap: 6px;\r\n --dp-grid-cell-height: 40px;\r\n --dp-year-cell-height: 34px;\r\n --dp-time-input-width: 42px;\r\n --dp-footer-margin-top: 10px;\r\n }\r\n .mac-date-picker-portal[data-size='lg'] {\r\n --dp-panel-width: 320px;\r\n --dp-panel-padding: 20px;\r\n --dp-panel-border-radius: 14px;\r\n --dp-day-height: 38px;\r\n --dp-nav-btn-size: 32px;\r\n --dp-header-font-size: 16px;\r\n --dp-header-margin-bottom: 14px;\r\n --dp-week-num-width: 38px;\r\n --dp-week-num-height: 38px;\r\n --dp-weekday-font-size: 12px;\r\n --dp-grid-gap: 10px;\r\n --dp-grid-cell-height: 56px;\r\n --dp-year-cell-height: 46px;\r\n --dp-time-input-width: 54px;\r\n --dp-footer-margin-top: 14px;\r\n }\r\n .mac-date-picker-portal.open {\r\n opacity: 1;\r\n transform: translateY(0) scale(1);\r\n pointer-events: auto;\r\n }\r\n\r\n /* 面板内容样式 */\r\n .mac-date-picker-portal .panel-header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n margin-bottom: var(--dp-header-margin-bottom);\r\n }\r\n .mac-date-picker-portal .panel-header-title {\r\n font-size: var(--dp-header-font-size);\r\n font-weight: 600;\r\n color: var(--md-color-text);\r\n cursor: pointer;\r\n padding: 2px 8px;\r\n border-radius: var(--md-radius-md);\r\n transition: background 150ms;\r\n }\r\n .mac-date-picker-portal .panel-header-title:hover {\r\n background: rgba(0, 0, 0, 0.04);\r\n }\r\n .mac-date-picker-portal .panel-nav {\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n }\r\n .mac-date-picker-portal .panel-nav-btn {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: var(--dp-nav-btn-size);\r\n height: var(--dp-nav-btn-size);\r\n border: none;\r\n background: transparent;\r\n border-radius: 50%;\r\n cursor: pointer;\r\n color: var(--md-color-text-secondary);\r\n transition: all 150ms;\r\n padding: 0;\r\n }\r\n .mac-date-picker-portal .panel-nav-btn:hover {\r\n background: rgba(0, 0, 0, 0.06);\r\n color: var(--md-color-text);\r\n }\r\n\r\n .mac-date-picker-portal .panel-weekdays {\r\n display: grid;\r\n grid-template-columns: var(--dp-week-num-width) repeat(7, 1fr);\r\n gap: var(--dp-day-gap);\r\n margin-bottom: 4px;\r\n }\r\n .mac-date-picker-portal .panel-weekdays--no-week {\r\n grid-template-columns: repeat(7, 1fr);\r\n }\r\n .mac-date-picker-portal .weekday {\r\n text-align: center;\r\n font-size: var(--dp-weekday-font-size);\r\n font-weight: 500;\r\n color: #9ca3af;\r\n padding: 4px 0;\r\n }\r\n\r\n .mac-date-picker-portal .panel-days {\r\n display: grid;\r\n grid-template-columns: var(--dp-week-num-width) repeat(7, 1fr);\r\n gap: var(--dp-day-gap);\r\n }\r\n .mac-date-picker-portal .panel-days--no-week {\r\n grid-template-columns: repeat(7, 1fr);\r\n }\r\n .mac-date-picker-portal .week-num {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n height: var(--dp-week-num-height);\r\n font-size: 10px;\r\n color: var(--md-color-text-secondary);\r\n opacity: 0.5;\r\n cursor: pointer;\r\n border: none;\r\n background: transparent;\r\n padding: 0;\r\n border-radius: var(--md-radius-sm);\r\n }\r\n .mac-date-picker-portal .week-num:hover {\r\n color: var(--md-color-primary);\r\n opacity: 1;\r\n background: rgba(0, 122, 255, 0.06);\r\n }\r\n .mac-date-picker-portal .day {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n height: var(--dp-day-height);\r\n border: none;\r\n background: transparent;\r\n border-radius: var(--md-radius-sm);\r\n cursor: pointer;\r\n font-size: var(--md-font-size-sm);\r\n color: var(--md-color-text);\r\n transition: all 150ms;\r\n padding: 0;\r\n }\r\n .mac-date-picker-portal .day:hover:not(.day--disabled):not(.day--today):not(.day--in-range) {\r\n background: rgba(0, 122, 255, 0.1);\r\n border-radius: 50%;\r\n }\r\n .mac-date-picker-portal .day--other {\r\n color: var(--md-color-text-secondary);\r\n opacity: 0.35;\r\n }\r\n .mac-date-picker-portal .day--today {\r\n background: var(--md-color-primary);\r\n color: #fff;\r\n border-radius: 50%;\r\n }\r\n .mac-date-picker-portal .day--today:hover {\r\n background: var(--md-color-primary-hover);\r\n }\r\n .mac-date-picker-portal .day--selected {\r\n color: var(--md-color-primary);\r\n font-weight: 600;\r\n border: 1px solid var(--md-color-primary);\r\n border-radius: 50%;\r\n }\r\n .mac-date-picker-portal .day--disabled {\r\n opacity: 0.3;\r\n cursor: not-allowed;\r\n text-decoration: line-through;\r\n }\r\n .mac-date-picker-portal .day--in-range {\r\n background: rgba(0, 122, 255, 0.08);\r\n border-radius: 0;\r\n }\r\n .mac-date-picker-portal .day--range-start {\r\n background: var(--md-color-primary);\r\n color: #fff;\r\n border-radius: 50% 0 0 50%;\r\n }\r\n .mac-date-picker-portal .day--range-end {\r\n background: var(--md-color-primary);\r\n color: #fff;\r\n border-radius: 0 50% 50% 0;\r\n }\r\n\r\n .mac-date-picker-portal .panel-grid {\r\n display: grid;\r\n grid-template-columns: repeat(3, 1fr);\r\n gap: var(--dp-grid-gap);\r\n }\r\n .mac-date-picker-portal .grid-cell {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n height: var(--dp-grid-cell-height);\r\n border: none;\r\n background: transparent;\r\n border-radius: var(--md-radius-lg);\r\n cursor: pointer;\r\n font-size: var(--md-font-size-sm);\r\n color: var(--md-color-text);\r\n transition: all 150ms;\r\n padding: 0;\r\n }\r\n .mac-date-picker-portal .grid-cell:hover:not(.grid-cell--disabled):not(.grid-cell--selected) {\r\n background: rgba(0, 122, 255, 0.1);\r\n }\r\n .mac-date-picker-portal .grid-cell--selected {\r\n background: var(--md-color-primary);\r\n color: #fff;\r\n }\r\n .mac-date-picker-portal .grid-cell--selected:hover {\r\n background: var(--md-color-primary-hover);\r\n }\r\n .mac-date-picker-portal .grid-cell--disabled {\r\n opacity: 0.3;\r\n cursor: not-allowed;\r\n }\r\n\r\n .mac-date-picker-portal .panel-year-grid {\r\n display: grid;\r\n grid-template-columns: repeat(4, 1fr);\r\n gap: var(--dp-grid-gap);\r\n }\r\n .mac-date-picker-portal .year-cell {\r\n height: var(--dp-year-cell-height);\r\n font-size: var(--md-font-size-sm);\r\n }\r\n\r\n .mac-date-picker-portal .time-row {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--md-spacing-xs);\r\n margin-top: var(--dp-footer-margin-top);\r\n padding-top: var(--dp-footer-margin-top);\r\n border-top: 1px solid var(--md-color-border);\r\n justify-content: center;\r\n }\r\n .mac-date-picker-portal .time-input {\r\n width: var(--dp-time-input-width);\r\n padding: 6px 4px;\r\n border: 1px solid var(--md-color-border);\r\n border-radius: var(--md-radius-md);\r\n font-size: var(--md-font-size-sm);\r\n text-align: center;\r\n color: var(--md-color-text);\r\n background: var(--md-color-bg);\r\n outline: none;\r\n transition: border-color 200ms;\r\n }\r\n .mac-date-picker-portal .time-input:focus {\r\n border-color: var(--md-color-primary);\r\n }\r\n .mac-date-picker-portal .time-sep {\r\n color: var(--md-color-text-secondary);\r\n font-size: var(--md-font-size-sm);\r\n }\r\n\r\n .mac-date-picker-portal .panel-footer {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n margin-top: var(--dp-footer-margin-top);\r\n padding-top: var(--dp-footer-margin-top);\r\n border-top: 1px solid var(--md-color-border);\r\n }\r\n .mac-date-picker-portal .panel-footer-btn {\r\n font-size: var(--md-font-size-sm);\r\n color: var(--md-color-primary);\r\n background: transparent;\r\n border: none;\r\n cursor: pointer;\r\n padding: 4px 12px;\r\n border-radius: var(--md-radius-md);\r\n transition: background 150ms;\r\n }\r\n .mac-date-picker-portal .panel-footer-btn:hover {\r\n background: rgba(0, 122, 255, 0.08);\r\n }\r\n\r\n /* 深色主题 */\r\n .mac-date-picker-portal[data-theme='dark'] {\r\n --md-color-text: #ffffff;\r\n --md-color-text-secondary: rgba(255, 255, 255, 0.6);\r\n --md-color-border: rgba(255, 255, 255, 0.1);\r\n --md-color-bg: rgba(30, 30, 30, 0.95);\r\n --md-color-bg-secondary: rgba(255, 255, 255, 0.05);\r\n background: var(--md-color-bg);\r\n border-color: var(--md-color-border);\r\n }\r\n .mac-date-picker-portal[data-theme='dark'] .panel-nav-btn:hover {\r\n background: rgba(255, 255, 255, 0.08);\r\n }\r\n .mac-date-picker-portal[data-theme='dark'] .day--today {\r\n background: var(--md-color-primary);\r\n }\r\n .mac-date-picker-portal[data-theme='dark'] .grid-cell--selected {\r\n background: var(--md-color-primary);\r\n }\r\n .mac-date-picker-portal[data-theme='dark'] .panel-footer-btn:hover {\r\n background: rgba(0, 122, 255, 0.15);\r\n }\r\n .mac-date-picker-portal[data-theme='dark'] .time-input {\r\n background: var(--md-color-bg);\r\n border-color: var(--md-color-border);\r\n color: var(--md-color-text);\r\n }\r\n `\r\n document.head.appendChild(style)\r\n }\r\n\r\n override willUpdate() {\r\n const s = this._resolvedSize\r\n if (this.getAttribute('size') !== s) this.setAttribute('size', s)\r\n const t = this._resolvedTheme\r\n t ? this.setAttribute('data-theme', t) : this.removeAttribute('data-theme')\r\n if (this._portalEl) {\r\n this._portalEl.setAttribute('data-size', s)\r\n const width = s === 'sm' ? 264 : s === 'lg' ? 320 : 288\r\n this._portalEl.style.width = `${width}px`\r\n }\r\n }\r\n\r\n override connectedCallback() {\r\n super.connectedCallback()\r\n MacDatePicker._injectPortalStyles()\r\n const d = this._selDate\r\n if (d) {\r\n this._view = new Date(d.getFullYear(), d.getMonth(), 1)\r\n this._syncTime(d)\r\n }\r\n if (!this.panel) document.addEventListener('click', this._onDocClick)\r\n }\r\n override disconnectedCallback() {\r\n super.disconnectedCallback()\r\n document.removeEventListener('click', this._onDocClick)\r\n this._removeScrollListener()\r\n this._removePortal()\r\n }\r\n\r\n private _addScrollListener() {\r\n if (this._scrollHandler) return\r\n this._scrollHandler = () => {\r\n if (this._open && this._portalEl && this._trigger) {\r\n const rect = this._trigger.getBoundingClientRect()\r\n this._portalEl.style.left = `${rect.left}px`\r\n this._portalEl.style.top = `${rect.bottom + 6}px`\r\n }\r\n }\r\n window.addEventListener('scroll', this._scrollHandler, true)\r\n window.addEventListener('resize', this._scrollHandler)\r\n }\r\n\r\n private _removeScrollListener() {\r\n if (this._scrollHandler) {\r\n window.removeEventListener('scroll', this._scrollHandler, true)\r\n window.removeEventListener('resize', this._scrollHandler)\r\n this._scrollHandler = null\r\n }\r\n }\r\n\r\n private _onDocClick = (e: Event) => {\r\n if (!this._open) return\r\n\r\n const path = e.composedPath()\r\n // 如果点击位置同时在触发器和 portal 之外,则关闭\r\n const isInsideTrigger = path.includes(this)\r\n const isInsidePortal = this._portalEl && path.includes(this._portalEl)\r\n\r\n if (!isInsideTrigger && !isInsidePortal) {\r\n this._close()\r\n }\r\n }\r\n private _toggle() {\r\n if (this.disabled || this.panel) return\r\n this._open ? this._close() : this._openPanel()\r\n }\r\n private _openPanel() {\r\n this._open = true\r\n const d = this._selDate\r\n if (d) {\r\n this._view = new Date(d.getFullYear(), d.getMonth(), 1)\r\n this._syncTime(d)\r\n }\r\n this._panelView = this.type === 'year' || this.type === 'quarter' ? 'year' : 'day'\r\n this._createPortal()\r\n }\r\n private _close() {\r\n if (this.panel) return\r\n this._open = false\r\n this._panelView = 'day'\r\n this._removePortal()\r\n }\r\n\r\n private _createPortal() {\r\n this._removePortal()\r\n\r\n if (!this._trigger) return\r\n\r\n const rect = this._trigger.getBoundingClientRect()\r\n const portal = document.createElement('div')\r\n portal.id = this._portalId\r\n portal.className = 'mac-date-picker-portal'\r\n portal.setAttribute('role', 'dialog')\r\n portal.setAttribute('aria-label', '日期选择器')\r\n\r\n const theme = this._resolvedTheme\r\n if (theme) {\r\n portal.setAttribute('data-theme', theme)\r\n }\r\n\r\n const size = this._resolvedSize\r\n portal.setAttribute('data-size', size)\r\n\r\n // 位置\r\n const left = rect.left\r\n const top = rect.bottom + 6\r\n const width = size === 'sm' ? 264 : size === 'lg' ? 320 : 288\r\n\r\n portal.style.left = `${left}px`\r\n portal.style.top = `${top}px`\r\n portal.style.width = `${width}px`\r\n\r\n document.body.appendChild(portal)\r\n this._portalEl = portal\r\n\r\n // 渲染初始内容\r\n this._updatePortalContent()\r\n\r\n // 添加滚动监听器以更新位置\r\n this._addScrollListener()\r\n\r\n // Mark it open immediately so programmatic consumers can query it in the\r\n // same task; the animation is still scheduled for the next frame.\r\n portal.classList.add('open')\r\n requestAnimationFrame(() => portal.classList.add('open'))\r\n }\r\n\r\n private _removePortal() {\r\n this._removeScrollListener()\r\n if (this._portalEl) {\r\n this._portalEl.classList.remove('open')\r\n const el = this._portalEl\r\n setTimeout(() => {\r\n if (el.parentNode) {\r\n el.parentNode.removeChild(el)\r\n }\r\n }, 200)\r\n this._portalEl = null\r\n }\r\n }\r\n private _syncTime(d: Date) {\r\n this._hh = d.getHours()\r\n this._mm = d.getMinutes()\r\n this._ss = d.getSeconds()\r\n }\r\n\r\n private _emit(str: string, date: Date | null) {\r\n this.emit('mac-change', { detail: { value: str, date } })\r\n }\r\n\r\n private _pick(date: Date, close = true) {\r\n if (this.disabledDate && this.disabledDate(date)) return\r\n let str = fmtDate(date, this.format)\r\n if (this.type === 'week') {\r\n const ws = weekStart(date)\r\n str = fmtDate(ws, this.format)\r\n date = ws\r\n }\r\n if (this._ctrl) this._emit(str, date)\r\n else {\r\n this.defaultValue = str\r\n this._emit(str, date)\r\n }\r\n if (close && !this.panel) this._close()\r\n }\r\n\r\n private _pickQuarter(y: number, q: number) {\r\n const date = new Date(y, q * 3, 1)\r\n const str = `${y}-Q${q + 1}`\r\n if (this._ctrl) this._emit(str, date)\r\n else {\r\n this.defaultValue = str\r\n this._emit(str, date)\r\n }\r\n this._close()\r\n }\r\n\r\n private _pickYear(y: number) {\r\n if (this.type === 'year') {\r\n const date = new Date(y, 0, 1)\r\n const str = String(y)\r\n if (this._ctrl) this._emit(str, date)\r\n else {\r\n this.defaultValue = str\r\n this._emit(str, date)\r\n }\r\n this._close()\r\n } else {\r\n this._view = new Date(y, (this._view ?? new Date()).getMonth(), 1)\r\n this._panelView = this.type === 'quarter' ? 'year' : 'month'\r\n }\r\n }\r\n\r\n private _pickMonth(m: number) {\r\n this._view = new Date((this._view ?? new Date()).getFullYear(), m, 1)\r\n this._panelView = 'day'\r\n }\r\n\r\n private _prev = () => {\r\n if (this._panelView === 'year')\r\n this._view = new Date((this._view ?? new Date()).getFullYear() - 12, 0, 1)\r\n else if (this._panelView === 'month')\r\n this._view = new Date((this._view ?? new Date()).getFullYear() - 1, 0, 1)\r\n else\r\n this._view = new Date(\r\n (this._view ?? new Date()).getFullYear(),\r\n (this._view ?? new Date()).getMonth() - 1,\r\n 1,\r\n )\r\n }\r\n private _next = () => {\r\n if (this._panelView === 'year')\r\n this._view = new Date((this._view ?? new Date()).getFullYear() + 12, 0, 1)\r\n else if (this._panelView === 'month')\r\n this._view = new Date((this._view ?? new Date()).getFullYear() + 1, 0, 1)\r\n else\r\n this._view = new Date(\r\n (this._view ?? new Date()).getFullYear(),\r\n (this._view ?? new Date()).getMonth() + 1,\r\n 1,\r\n )\r\n }\r\n\r\n private _today() {\r\n this._pick(new Date())\r\n }\r\n private _clear(e: Event) {\r\n e.stopPropagation()\r\n if (this._ctrl) this._emit('', null)\r\n else {\r\n this.defaultValue = ''\r\n this._emit('', null)\r\n }\r\n }\r\n\r\n private _timeChange(which: 'h' | 'm' | 's', v: string) {\r\n const n = parseInt(v, 10)\r\n if (isNaN(n)) return\r\n if (which === 'h') this._hh = Math.max(0, Math.min(23, n))\r\n if (which === 'm') this._mm = Math.max(0, Math.min(59, n))\r\n if (which === 's') this._ss = Math.max(0, Math.min(59, n))\r\n const d = this._selDate\r\n if (d) {\r\n const nd = new Date(d.getFullYear(), d.getMonth(), d.getDate(), this._hh, this._mm, this._ss)\r\n const str = fmtDate(nd, this.format)\r\n if (this._ctrl) this._emit(str, nd)\r\n else {\r\n this.defaultValue = str\r\n this._emit(str, nd)\r\n }\r\n }\r\n }\r\n\r\n private _onKey(e: KeyboardEvent) {\r\n if (this.disabled || this.panel) return\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n e.preventDefault()\r\n this._toggle()\r\n }\r\n if (e.key === 'Escape') this._close()\r\n }\r\n\r\n /* ── 渲染辅助函数 ── */\r\n private _renderHeader(title: string, clickable = false) {\r\n return html`\r\n <div class=\"panel-header\">\r\n <span\r\n class=\"panel-header-title\"\r\n ?clickable=${clickable}\r\n @click=${clickable ? () => (this._panelView = 'month') : undefined}\r\n >${title}</span\r\n >\r\n <div class=\"panel-nav\">\r\n <button class=\"panel-nav-btn\" @click=${this._prev} tabindex=\"-1\" type=\"button\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M10 4l-4 4 4 4\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" />\r\n </svg>\r\n </button>\r\n <button class=\"panel-nav-btn\" @click=${this._next} tabindex=\"-1\" type=\"button\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M6 4l4 4-4 4\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" />\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n `\r\n }\r\n\r\n private _renderDays() {\r\n const vy = (this._view ?? new Date()).getFullYear(),\r\n vm = (this._view ?? new Date()).getMonth()\r\n const days = calDays(vy, vm)\r\n const sel = this._selDate\r\n const today = new Date()\r\n const isWeek = this.type === 'week'\r\n const selWeek = sel && isWeek ? weekStart(sel) : null\r\n\r\n const rows: { wn: number; days: typeof days }[] = []\r\n for (let i = 0; i < days.length; i += 7) {\r\n rows.push({ wn: weekNumber(days[i].date), days: days.slice(i, i + 7) })\r\n }\r\n\r\n return html`\r\n <div class=\"panel-weekdays ${isWeek ? '' : 'panel-weekdays--no-week'}\">\r\n ${isWeek ? html`<div class=\"weekday\"></div>` : nothing}\r\n ${WDS.map((w) => html`<div class=\"weekday\">${w}</div>`)}\r\n </div>\r\n ${rows.map(\r\n (r) => html`\r\n <div class=\"panel-days ${isWeek ? '' : 'panel-days--no-week'}\">\r\n ${\r\n isWeek\r\n ? html`<button\r\n class=\"week-num\"\r\n @click=${() => this._pick(r.days[0].date)}\r\n type=\"button\"\r\n >\r\n W${r.wn}\r\n </button>`\r\n : nothing\r\n }\r\n ${r.days.map((d) => {\r\n const isSel = sel && (isWeek ? sameDay(d.date, selWeek!) : sameDay(d.date, sel))\r\n const isTod = sameDay(d.date, today)\r\n const dis = this.disabledDate ? this.disabledDate(d.date) : false\r\n return html`<button\r\n class=\"day ${d.cur ? '' : 'day--other'} ${isTod ? 'day--today' : ''} ${\r\n isSel ? 'day--selected' : ''\r\n } ${dis ? 'day--disabled' : ''}\"\r\n @click=${() => !dis && this._pick(d.date)}\r\n type=\"button\"\r\n tabindex=\"-1\"\r\n >\r\n ${d.date.getDate()}\r\n </button>`\r\n })}\r\n </div>\r\n `,\r\n )}\r\n `\r\n }\r\n\r\n private _renderMonths() {\r\n const y = (this._view ?? new Date()).getFullYear()\r\n const sel = this._selDate\r\n return html`\r\n ${this._renderHeader(`${y}年`)}\r\n <div class=\"panel-grid\">\r\n ${MNS.map((m, i) => {\r\n const isSel = sel && sel.getFullYear() === y && sel.getMonth() === i\r\n return html`<button\r\n class=\"grid-cell ${isSel ? 'grid-cell--selected' : ''}\"\r\n @click=${() => this._pickMonth(i)}\r\n type=\"button\"\r\n >\r\n ${m}\r\n </button>`\r\n })}\r\n </div>\r\n `\r\n }\r\n\r\n private _renderYears() {\r\n const sy = (this._view ?? new Date()).getFullYear() - 6\r\n const sel = this._selDate\r\n const selY = sel ? sel.getFullYear() : null\r\n return html`\r\n ${this._renderHeader(`${sy} - ${sy + 11}`)}\r\n <div class=\"panel-year-grid\">\r\n ${Array.from({ length: 12 }, (_, i) => {\r\n const y = sy + i\r\n const isSel = selY === y\r\n return html`<button\r\n class=\"grid-cell year-cell ${isSel ? 'grid-cell--selected' : ''}\"\r\n @click=${() => this._pickYear(y)}\r\n type=\"button\"\r\n >\r\n ${y}\r\n </button>`\r\n })}\r\n </div>\r\n `\r\n }\r\n\r\n private _renderQuarters() {\r\n const y = (this._view ?? new Date()).getFullYear()\r\n const qv = this._resVal\r\n return html`\r\n ${this._renderHeader(`${y}年`)}\r\n <div class=\"panel-grid\">\r\n ${QNS.map((q, i) => {\r\n const isSel = qv === `${y}-Q${i + 1}`\r\n return html`<button\r\n class=\"grid-cell ${isSel ? 'grid-cell--selected' : ''}\"\r\n @click=${() => this._pickQuarter(y, i)}\r\n type=\"button\"\r\n >\r\n ${q}\r\n </button>`\r\n })}\r\n </div>\r\n `\r\n }\r\n\r\n private _renderTime() {\r\n if (this.type !== 'datetime') return nothing\r\n return html`\r\n <div class=\"time-row\">\r\n <input\r\n class=\"time-input\"\r\n type=\"number\"\r\n min=\"0\"\r\n max=\"23\"\r\n .value=${pad(this._hh)}\r\n @change=${(e: Event) => this._timeChange('h', (e.target as HTMLInputElement).value)}\r\n />\r\n <span class=\"time-sep\">:</span>\r\n <input\r\n class=\"time-input\"\r\n type=\"number\"\r\n min=\"0\"\r\n max=\"59\"\r\n .value=${pad(this._mm)}\r\n @change=${(e: Event) => this._timeChange('m', (e.target as HTMLInputElement).value)}\r\n />\r\n <span class=\"time-sep\">:</span>\r\n <input\r\n class=\"time-input\"\r\n type=\"number\"\r\n min=\"0\"\r\n max=\"59\"\r\n .value=${pad(this._ss)}\r\n @change=${(e: Event) => this._timeChange('s', (e.target as HTMLInputElement).value)}\r\n />\r\n </div>\r\n `\r\n }\r\n\r\n private _renderFooter() {\r\n return html`\r\n <div class=\"panel-footer\">\r\n <button class=\"panel-footer-btn\" @click=${this._today} type=\"button\">今天</button>\r\n ${\r\n this.clearable\r\n ? html`<button class=\"panel-footer-btn\" @click=${this._clear} type=\"button\">\r\n 清空\r\n </button>`\r\n : nothing\r\n }\r\n </div>\r\n `\r\n }\r\n\r\n override updated(changedProperties: Map<string, unknown>) {\r\n super.updated(changedProperties)\r\n // 状态变化时更新 portal 内容\r\n if (this._open && this._portalEl && !this.panel) {\r\n this._updatePortalContent()\r\n }\r\n }\r\n\r\n private _updatePortalContent() {\r\n if (!this._portalEl) return\r\n\r\n const title =\r\n this._panelView === 'year'\r\n ? '选择年份'\r\n : this._panelView === 'month'\r\n ? `${(this._view ?? new Date()).getFullYear()}年`\r\n : `${(this._view ?? new Date()).getFullYear()}年${(this._view ?? new Date()).getMonth() + 1}月`\r\n\r\n const footer = this.showFooter ? this._renderFooter() : nothing\r\n const panelContent =\r\n this.type === 'quarter'\r\n ? html`${this._renderQuarters()}${footer}`\r\n : this._panelView === 'year'\r\n ? html`${this._renderYears()}${footer}`\r\n : this._panelView === 'month'\r\n ? html`${this._renderMonths()}${footer}`\r\n : html`${this._renderHeader(\r\n title,\r\n true,\r\n )}${this._renderDays()}${this._renderTime()}${footer}`\r\n\r\n // 使用 Lit 的 render 函数渲染到 portal(同步)\r\n render(panelContent, this._portalEl)\r\n }\r\n\r\n override render() {\r\n const val = this._resVal,\r\n has = !!val,\r\n size = this._resolvedSize\r\n\r\n if (this.panel) {\r\n const title =\r\n this._panelView === 'year'\r\n ? '选择年份'\r\n : this._panelView === 'month'\r\n ? `${(this._view ?? new Date()).getFullYear()}年`\r\n : `${(this._view ?? new Date()).getFullYear()}年${(this._view ?? new Date()).getMonth() + 1}月`\r\n\r\n const footer = this.showFooter ? this._renderFooter() : nothing\r\n const panelContent =\r\n this.type === 'quarter'\r\n ? html`${this._renderQuarters()}${footer}`\r\n : this._panelView === 'year'\r\n ? html`${this._renderYears()}${footer}`\r\n : this._panelView === 'month'\r\n ? html`${this._renderMonths()}${footer}`\r\n : html`${this._renderHeader(\r\n title,\r\n true,\r\n )}${this._renderDays()}${this._renderTime()}${footer}`\r\n\r\n return html`\r\n <div class=\"picker\" part=\"base\">\r\n <div class=\"picker-panel picker-panel--inline\" part=\"panel\">${panelContent}</div>\r\n </div>\r\n `\r\n }\r\n\r\n return html`\r\n <div class=\"picker\" part=\"base\">\r\n <div\r\n class=\"picker-trigger picker-trigger--${size} ${this._open ? 'open' : ''} ${\r\n this.error ? 'picker-trigger--error' : ''\r\n } ${this.success ? 'picker-trigger--success' : ''} ${\r\n this.disabled ? 'picker-trigger--disabled' : ''\r\n }\"\r\n part=\"trigger\"\r\n @click=${this._toggle}\r\n @keydown=${this._onKey}\r\n tabindex=${this.disabled ? '-1' : '0'}\r\n role=\"combobox\"\r\n aria-expanded=${this._open}\r\n >\r\n <span class=\"picker-value ${has ? '' : 'picker-placeholder'}\"\r\n >${has ? val : this.placeholder}</span\r\n >\r\n <div style=\"display:flex;align-items:center;gap:6px;\">\r\n ${\r\n this.clearable && has && !this.disabled\r\n ? html`<button\r\n class=\"picker-clear\"\r\n @click=${this._clear}\r\n tabindex=\"-1\"\r\n type=\"button\"\r\n >\r\n ✕\r\n </button>`\r\n : nothing\r\n }\r\n <span class=\"picker-icon\">\r\n <slot name=\"icon\">\r\n <svg\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 16 16\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.5\"\r\n >\r\n <rect x=\"2\" y=\"3\" width=\"12\" height=\"11\" rx=\"1.5\" />\r\n <path d=\"M2 7h12\" />\r\n <path d=\"M5 1.5v3M11 1.5v3\" />\r\n </svg>\r\n </slot>\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n `\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'mac-date-picker': MacDatePicker\r\n }\r\n}\r\n","import { html, css, nothing, render } from 'lit'\r\nimport { property, customElement, state, query } from 'lit/decorators.js'\r\nimport { BaseElement } from '../../internal/base-element'\r\nimport { sharedStyles } from '../../styles/shared-styles'\r\nimport { themeTokens } from '../../styles/theme'\r\nimport { fmtDate, prsDate, sameDay, calDays, WDS } from './date-picker-utils'\r\n\r\nfunction inRange(d: Date, s?: Date, e?: Date) {\r\n if (!s || !e) return false\r\n const t = new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime()\r\n const a = new Date(s.getFullYear(), s.getMonth(), s.getDate()).getTime()\r\n const b = new Date(e.getFullYear(), e.getMonth(), e.getDate()).getTime()\r\n return t >= Math.min(a, b) && t <= Math.max(a, b)\r\n}\r\n\r\n@customElement('mac-date-range-picker')\r\nexport class MacDateRangePicker extends BaseElement {\r\n static override styles = [\r\n themeTokens,\r\n sharedStyles,\r\n css`\r\n :host {\r\n display: block;\r\n }\r\n .picker {\r\n position: relative;\r\n }\r\n .picker-trigger {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: var(--md-spacing-sm);\r\n padding: var(--md-select-trigger-padding-vertical)\r\n var(--md-select-trigger-padding-horizontal);\r\n border-radius: var(--md-radius-lg);\r\n background: var(--md-color-bg);\r\n cursor: pointer;\r\n transition: all 200ms cubic-bezier(0.4, 0, 0.2, 1);\r\n user-select: none;\r\n min-height: var(--md-select-trigger-min-height);\r\n border: 1px solid var(--md-color-border);\r\n }\r\n .picker-trigger:hover:not(.picker-trigger--disabled) {\r\n border-color: var(--md-color-primary);\r\n }\r\n .picker-trigger.open,\r\n .picker-trigger:focus-within {\r\n border-color: var(--md-color-primary);\r\n box-shadow:\r\n 0 0 0 3px rgba(0, 122, 255, 0.1),\r\n 0 2px 8px rgba(0, 122, 255, 0.08);\r\n }\r\n .picker-trigger--disabled {\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n pointer-events: none;\r\n background: var(--md-color-bg-secondary);\r\n }\r\n .picker-trigger--error {\r\n border-color: var(--md-color-danger);\r\n }\r\n .picker-trigger--error.open,\r\n .picker-trigger--error:focus-within {\r\n box-shadow:\r\n 0 0 0 3px rgba(255, 59, 48, 0.1),\r\n 0 2px 8px rgba(255, 59, 48, 0.08);\r\n }\r\n .picker-trigger--success {\r\n border-color: var(--md-color-success);\r\n }\r\n .picker-value {\r\n flex: 1;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n }\r\n .picker-placeholder {\r\n color: #9ca3af;\r\n }\r\n .picker-icon {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 20px;\r\n height: 20px;\r\n color: #9ca3af;\r\n transition: transform 200ms;\r\n flex-shrink: 0;\r\n }\r\n .picker-trigger.open .picker-icon {\r\n transform: rotate(180deg);\r\n }\r\n .picker-clear {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 18px;\r\n height: 18px;\r\n border: none;\r\n background: rgba(0, 0, 0, 0.06);\r\n border-radius: 50%;\r\n cursor: pointer;\r\n color: var(--md-color-text-secondary);\r\n font-size: 10px;\r\n transition: all 200ms;\r\n padding: 0;\r\n flex-shrink: 0;\r\n }\r\n .picker-clear:hover {\r\n background: rgba(0, 0, 0, 0.1);\r\n color: var(--md-color-text);\r\n }\r\n\r\n .picker-trigger--sm {\r\n padding: var(--sm-select-trigger-padding-vertical)\r\n var(--sm-select-trigger-padding-horizontal);\r\n font-size: var(--sm-select-trigger-font-size);\r\n min-height: var(--sm-select-trigger-min-height);\r\n }\r\n .picker-trigger--lg {\r\n padding: var(--lg-select-trigger-padding-vertical)\r\n var(--lg-select-trigger-padding-horizontal);\r\n font-size: var(--lg-select-trigger-font-size);\r\n min-height: var(--lg-select-trigger-min-height);\r\n }\r\n\r\n :host([data-theme='dark']) .picker-clear {\r\n background: rgba(255, 255, 255, 0.1);\r\n }\r\n :host([data-theme='dark']) .picker-clear:hover {\r\n background: rgba(255, 255, 255, 0.15);\r\n }\r\n `,\r\n ]\r\n\r\n @property({ type: Array }) value: [string, string] = ['', '']\r\n @property({ type: Array, attribute: 'default-value' }) defaultValue: [string, string] = ['', '']\r\n @property() format = 'YYYY-MM-DD'\r\n @property() placeholder = 'Select range'\r\n @property({ type: Boolean, reflect: true }) disabled = false\r\n @property({ reflect: true }) size?: 'sm' | 'md' | 'lg'\r\n @property({ type: Boolean }) clearable = false\r\n @property({ type: Boolean, reflect: true }) error = false\r\n @property({ type: Boolean, reflect: true }) success = false\r\n @property({ attribute: false }) disabledDate?: (date: Date) => boolean\r\n\r\n @state() private _open = false\r\n @state() private _lView = new Date()\r\n @state() private _rView = new Date(new Date().getFullYear(), new Date().getMonth() + 1, 1)\r\n @state() private _hoverDate?: Date\r\n\r\n @query('.picker-trigger') private _trigger!: HTMLElement\r\n\r\n private _portalEl: HTMLElement | null = null\r\n private _portalId = `mac-date-range-picker-portal-${Math.random().toString(36).substr(2, 9)}`\r\n private _scrollHandler: (() => void) | null = null\r\n\r\n private get _ctrl() {\r\n return this.hasAttribute('value')\r\n }\r\n private get _res() {\r\n return this._ctrl ? this.value : this.defaultValue\r\n }\r\n private get _s() {\r\n return prsDate(this._res[0], this.format)\r\n }\r\n private get _e() {\r\n return prsDate(this._res[1], this.format)\r\n }\r\n private get _hasStart() {\r\n return !!this._res[0]\r\n }\r\n private get _hasEnd() {\r\n return !!this._res[1]\r\n }\r\n\r\n private static _stylesInjected = false\r\n private static _injectPortalStyles() {\r\n if (MacDateRangePicker._stylesInjected) return\r\n MacDateRangePicker._stylesInjected = true\r\n\r\n const style = document.createElement('style')\r\n style.id = 'mac-date-range-picker-portal-styles'\r\n style.textContent = `\r\n /* Define CSS variables for portal (in case they're not inherited) */\r\n .mac-date-range-picker-portal {\r\n --md-color-primary: #3b82f6;\r\n --md-color-primary-hover: #2563eb;\r\n --md-color-primary-active: #1d4ed8;\r\n --md-color-success: #22c55e;\r\n --md-color-warning: #f59e0b;\r\n --md-color-danger: #ef4444;\r\n --md-color-text: #1f2937;\r\n --md-color-text-secondary: #6b7280;\r\n --md-color-border: #d1d5db;\r\n --md-color-bg: #ffffff;\r\n --md-color-bg-secondary: #f9fafb;\r\n\r\n --md-spacing-xs: 4px;\r\n --md-spacing-sm: 8px;\r\n --md-spacing-md: 12px;\r\n --md-spacing-lg: 16px;\r\n\r\n --md-radius-sm: 4px;\r\n --md-radius-md: 6px;\r\n --md-radius-lg: 8px;\r\n\r\n --md-font-size-xs: 11px;\r\n --md-font-size-sm: 12px;\r\n --md-font-size-base: 14px;\r\n --md-font-size-lg: 16px;\r\n\r\n /* DatePicker 尺寸变量(默认 md) */\r\n --dp-panel-padding: 16px;\r\n --dp-panel-border-radius: 12px;\r\n --dp-panel-col-width: 252px;\r\n --dp-day-height: 32px;\r\n --dp-nav-btn-size: 28px;\r\n --dp-header-font-size: 15px;\r\n --dp-header-margin-bottom: 12px;\r\n --dp-weekday-font-size: 11px;\r\n --dp-day-gap: 2px;\r\n --dp-footer-margin-top: 12px;\r\n\r\n position: fixed;\r\n display: flex;\r\n gap: var(--md-spacing-md);\r\n background: var(--md-color-bg);\r\n border: 1px solid var(--md-color-border);\r\n border-radius: var(--dp-panel-border-radius);\r\n box-shadow: 0 12px 40px rgba(0, 0, 0, 0.12), 0 4px 12px rgba(0, 0, 0, 0.08);\r\n z-index: 99999;\r\n opacity: 0;\r\n transform: translateY(-8px) scale(0.96);\r\n pointer-events: none;\r\n transition: opacity 200ms cubic-bezier(0.4, 0, 0.2, 1), transform 200ms cubic-bezier(0.4, 0, 0.2, 1);\r\n padding: var(--dp-panel-padding);\r\n font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Display', 'SF Pro Text', 'Helvetica Neue', sans-serif;\r\n }\r\n .mac-date-range-picker-portal[data-size='sm'] {\r\n --dp-panel-padding: 12px;\r\n --dp-panel-border-radius: 10px;\r\n --dp-panel-col-width: 228px;\r\n --dp-day-height: 28px;\r\n --dp-nav-btn-size: 24px;\r\n --dp-header-font-size: 14px;\r\n --dp-header-margin-bottom: 10px;\r\n --dp-weekday-font-size: 10px;\r\n --dp-footer-margin-top: 10px;\r\n }\r\n .mac-date-range-picker-portal[data-size='lg'] {\r\n --dp-panel-padding: 20px;\r\n --dp-panel-border-radius: 14px;\r\n --dp-panel-col-width: 280px;\r\n --dp-day-height: 38px;\r\n --dp-nav-btn-size: 32px;\r\n --dp-header-font-size: 16px;\r\n --dp-header-margin-bottom: 14px;\r\n --dp-weekday-font-size: 12px;\r\n --dp-footer-margin-top: 14px;\r\n }\r\n .mac-date-range-picker-portal.open {\r\n opacity: 1;\r\n transform: translateY(0) scale(1);\r\n pointer-events: auto;\r\n }\r\n .mac-date-range-picker-portal .panel-col {\r\n width: var(--dp-panel-col-width);\r\n }\r\n\r\n .mac-date-range-picker-portal .panel-header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n margin-bottom: var(--dp-header-margin-bottom);\r\n }\r\n .mac-date-range-picker-portal .panel-header-title {\r\n font-size: var(--dp-header-font-size);\r\n font-weight: 600;\r\n color: var(--md-color-text);\r\n }\r\n .mac-date-range-picker-portal .panel-nav {\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n }\r\n .mac-date-range-picker-portal .panel-nav-btn {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: var(--dp-nav-btn-size);\r\n height: var(--dp-nav-btn-size);\r\n border: none;\r\n background: transparent;\r\n border-radius: 50%;\r\n cursor: pointer;\r\n color: var(--md-color-text-secondary);\r\n transition: all 150ms;\r\n padding: 0;\r\n }\r\n .mac-date-range-picker-portal .panel-nav-btn:hover {\r\n background: rgba(0, 0, 0, 0.06);\r\n color: var(--md-color-text);\r\n }\r\n\r\n .mac-date-range-picker-portal .panel-weekdays {\r\n display: grid;\r\n grid-template-columns: repeat(7, 1fr);\r\n gap: var(--dp-day-gap);\r\n margin-bottom: 4px;\r\n }\r\n .mac-date-range-picker-portal .weekday {\r\n text-align: center;\r\n font-size: var(--dp-weekday-font-size);\r\n font-weight: 500;\r\n color: #9ca3af;\r\n padding: 4px 0;\r\n }\r\n .mac-date-range-picker-portal .panel-days {\r\n display: grid;\r\n grid-template-columns: repeat(7, 1fr);\r\n gap: var(--dp-day-gap);\r\n }\r\n .mac-date-range-picker-portal .day {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n height: var(--dp-day-height);\r\n border: none;\r\n background: transparent;\r\n border-radius: var(--md-radius-sm);\r\n cursor: pointer;\r\n font-size: var(--md-font-size-sm);\r\n color: var(--md-color-text);\r\n transition: all 150ms;\r\n padding: 0;\r\n }\r\n .mac-date-range-picker-portal .day:hover:not(.day--disabled):not(.day--selected):not(.day--in-range) {\r\n background: rgba(0, 122, 255, 0.1);\r\n border-radius: 50%;\r\n }\r\n .mac-date-range-picker-portal .day--other {\r\n color: var(--md-color-text-secondary);\r\n opacity: 0.35;\r\n }\r\n .mac-date-range-picker-portal .day--today {\r\n color: var(--md-color-primary);\r\n font-weight: 600;\r\n border: 1px solid var(--md-color-primary);\r\n border-radius: 50%;\r\n }\r\n .mac-date-range-picker-portal .day--selected {\r\n background: var(--md-color-primary);\r\n color: #fff;\r\n border-radius: 50%;\r\n }\r\n .mac-date-range-picker-portal .day--selected:hover {\r\n background: var(--md-color-primary-hover);\r\n }\r\n .mac-date-range-picker-portal .day--in-range {\r\n background: rgba(0, 122, 255, 0.08);\r\n border-radius: 0;\r\n }\r\n .mac-date-range-picker-portal .day--range-start {\r\n background: var(--md-color-primary);\r\n color: #fff;\r\n border-radius: 50% 0 0 50%;\r\n }\r\n .mac-date-range-picker-portal .day--range-end {\r\n background: var(--md-color-primary);\r\n color: #fff;\r\n border-radius: 0 50% 50% 0;\r\n }\r\n .mac-date-range-picker-portal .day--disabled {\r\n opacity: 0.3;\r\n cursor: not-allowed;\r\n text-decoration: line-through;\r\n }\r\n\r\n .mac-date-range-picker-portal .panel-footer {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n margin-top: var(--dp-footer-margin-top);\r\n padding-top: var(--dp-footer-margin-top);\r\n border-top: 1px solid var(--md-color-border);\r\n }\r\n .mac-date-range-picker-portal .panel-footer-btn {\r\n font-size: var(--md-font-size-sm);\r\n color: var(--md-color-primary);\r\n background: transparent;\r\n border: none;\r\n cursor: pointer;\r\n padding: 4px 12px;\r\n border-radius: var(--md-radius-md);\r\n transition: background 150ms;\r\n }\r\n .mac-date-range-picker-portal .panel-footer-btn:hover {\r\n background: rgba(0, 122, 255, 0.08);\r\n }\r\n\r\n /* Dark theme */\r\n .mac-date-range-picker-portal[data-theme='dark'] {\r\n --md-color-text: #ffffff;\r\n --md-color-text-secondary: rgba(255, 255, 255, 0.6);\r\n --md-color-border: rgba(255, 255, 255, 0.1);\r\n --md-color-bg: rgba(30, 30, 30, 0.95);\r\n --md-color-bg-secondary: rgba(255, 255, 255, 0.05);\r\n background: var(--md-color-bg);\r\n border-color: var(--md-color-border);\r\n }\r\n .mac-date-range-picker-portal[data-theme='dark'] .panel-nav-btn:hover {\r\n background: rgba(255, 255, 255, 0.08);\r\n }\r\n .mac-date-range-picker-portal[data-theme='dark'] .day--selected {\r\n background: var(--md-color-primary);\r\n }\r\n .mac-date-range-picker-portal[data-theme='dark'] .day--range-start,\r\n .mac-date-range-picker-portal[data-theme='dark'] .day--range-end {\r\n background: var(--md-color-primary);\r\n }\r\n .mac-date-range-picker-portal[data-theme='dark'] .panel-footer-btn:hover {\r\n background: rgba(0, 122, 255, 0.15);\r\n }\r\n `\r\n document.head.appendChild(style)\r\n }\r\n\r\n override willUpdate() {\r\n const s = this._resolvedSize\r\n if (this.getAttribute('size') !== s) this.setAttribute('size', s)\r\n const t = this._resolvedTheme\r\n t ? this.setAttribute('data-theme', t) : this.removeAttribute('data-theme')\r\n if (this._portalEl) {\r\n this._portalEl.setAttribute('data-size', s)\r\n const width = s === 'sm' ? 500 : s === 'lg' ? 600 : 540\r\n this._portalEl.style.width = `${width}px`\r\n }\r\n }\r\n\r\n override connectedCallback() {\r\n super.connectedCallback()\r\n MacDateRangePicker._injectPortalStyles()\r\n const s = this._s,\r\n e = this._e\r\n if (s) this._lView = new Date(s.getFullYear(), s.getMonth(), 1)\r\n if (e) this._rView = new Date(e.getFullYear(), e.getMonth(), 1)\r\n else\r\n this._rView = new Date(\r\n (this._lView ?? new Date()).getFullYear(),\r\n (this._lView ?? new Date()).getMonth() + 1,\r\n 1,\r\n )\r\n document.addEventListener('click', this._onDoc)\r\n }\r\n override disconnectedCallback() {\r\n super.disconnectedCallback()\r\n document.removeEventListener('click', this._onDoc)\r\n this._removeScrollListener()\r\n this._removePortal()\r\n }\r\n\r\n private _addScrollListener() {\r\n if (this._scrollHandler) return\r\n this._scrollHandler = () => {\r\n if (this._open && this._portalEl && this._trigger) {\r\n const rect = this._trigger.getBoundingClientRect()\r\n this._portalEl.style.left = `${rect.left}px`\r\n this._portalEl.style.top = `${rect.bottom + 6}px`\r\n }\r\n }\r\n window.addEventListener('scroll', this._scrollHandler, true)\r\n window.addEventListener('resize', this._scrollHandler)\r\n }\r\n\r\n private _removeScrollListener() {\r\n if (this._scrollHandler) {\r\n window.removeEventListener('scroll', this._scrollHandler, true)\r\n window.removeEventListener('resize', this._scrollHandler)\r\n this._scrollHandler = null\r\n }\r\n }\r\n\r\n private _onDoc = (e: Event) => {\r\n if (!this._open) return\r\n\r\n const path = e.composedPath()\r\n // Close if click is outside both the trigger and the portal\r\n const isInsideTrigger = path.includes(this)\r\n const isInsidePortal = this._portalEl && path.includes(this._portalEl)\r\n\r\n if (!isInsideTrigger && !isInsidePortal) {\r\n this._close()\r\n }\r\n }\r\n private _toggle() {\r\n if (this.disabled) return\r\n this._open ? this._close() : this._openP()\r\n }\r\n private _openP() {\r\n this._open = true\r\n const s = this._s,\r\n e = this._e\r\n if (s) this._lView = new Date(s.getFullYear(), s.getMonth(), 1)\r\n if (e) this._rView = new Date(e.getFullYear(), e.getMonth(), 1)\r\n else\r\n this._rView = new Date(\r\n (this._lView ?? new Date()).getFullYear(),\r\n (this._lView ?? new Date()).getMonth() + 1,\r\n 1,\r\n )\r\n this._createPortal()\r\n }\r\n private _close() {\r\n this._open = false\r\n this._hoverDate = undefined\r\n this._removePortal()\r\n }\r\n\r\n private _createPortal() {\r\n this._removePortal()\r\n\r\n if (!this._trigger) return\r\n\r\n const rect = this._trigger.getBoundingClientRect()\r\n const portal = document.createElement('div')\r\n portal.id = this._portalId\r\n portal.className = 'mac-date-range-picker-portal'\r\n portal.setAttribute('role', 'dialog')\r\n portal.setAttribute('aria-label', 'Date range picker')\r\n\r\n const theme = this._resolvedTheme\r\n if (theme) {\r\n portal.setAttribute('data-theme', theme)\r\n }\r\n\r\n const size = this._resolvedSize\r\n portal.setAttribute('data-size', size)\r\n\r\n // Position - center under trigger\r\n const left = rect.left\r\n const top = rect.bottom + 6\r\n const width = size === 'sm' ? 500 : size === 'lg' ? 600 : 540 // Two panels width\r\n\r\n portal.style.left = `${left}px`\r\n portal.style.top = `${top}px`\r\n portal.style.width = `${width}px`\r\n\r\n document.body.appendChild(portal)\r\n this._portalEl = portal\r\n\r\n // Render initial content\r\n this._updatePortalContent()\r\n\r\n // Add scroll listener for position updates\r\n this._addScrollListener()\r\n\r\n // Make the portal queryable immediately, then let the next frame preserve\r\n // the normal transition behavior.\r\n portal.classList.add('open')\r\n requestAnimationFrame(() => portal.classList.add('open'))\r\n }\r\n\r\n private _removePortal() {\r\n this._removeScrollListener()\r\n if (this._portalEl) {\r\n this._portalEl.classList.remove('open')\r\n const el = this._portalEl\r\n setTimeout(() => {\r\n if (el.parentNode) {\r\n el.parentNode.removeChild(el)\r\n }\r\n }, 200)\r\n this._portalEl = null\r\n }\r\n }\r\n\r\n private _updatePortalContent() {\r\n if (!this._portalEl) return\r\n\r\n const content = html`\r\n ${this._renderCal(this._lView, this._prevL, this._nextL)}\r\n ${this._renderCal(this._rView, this._prevR, this._nextR)}\r\n `\r\n\r\n // Render to portal using Lit's render function (synchronous)\r\n render(content, this._portalEl)\r\n }\r\n\r\n private _emit() {\r\n const r = this._ctrl ? this.value : this.defaultValue\r\n this.emit('mac-change', { detail: { value: r, start: r[0], end: r[1] } })\r\n }\r\n\r\n private _pick(date: Date) {\r\n if (this.disabledDate && this.disabledDate(date)) return\r\n const str = fmtDate(date, this.format)\r\n let nv: [string, string]\r\n if (!this._hasStart || (this._hasStart && this._hasEnd)) {\r\n nv = [str, '']\r\n } else {\r\n const s = this._s!\r\n if (date.getTime() < s.getTime()) nv = [str, this._res[0]]\r\n else nv = [this._res[0], str]\r\n this._close()\r\n }\r\n if (this._ctrl) {\r\n this.value = nv\r\n this._emit()\r\n } else {\r\n this.defaultValue = nv\r\n this._emit()\r\n }\r\n // Update portal content after state change\r\n this._updatePortalContent()\r\n }\r\n\r\n private _prevL = () => {\r\n this._lView = new Date(\r\n (this._lView ?? new Date()).getFullYear(),\r\n (this._lView ?? new Date()).getMonth() - 1,\r\n 1,\r\n )\r\n this._updatePortalContent()\r\n }\r\n private _nextL = () => {\r\n this._lView = new Date(\r\n (this._lView ?? new Date()).getFullYear(),\r\n (this._lView ?? new Date()).getMonth() + 1,\r\n 1,\r\n )\r\n this._updatePortalContent()\r\n }\r\n private _prevR = () => {\r\n this._rView = new Date(\r\n (this._rView ?? new Date()).getFullYear(),\r\n (this._rView ?? new Date()).getMonth() - 1,\r\n 1,\r\n )\r\n this._updatePortalContent()\r\n }\r\n private _nextR = () => {\r\n this._rView = new Date(\r\n (this._rView ?? new Date()).getFullYear(),\r\n (this._rView ?? new Date()).getMonth() + 1,\r\n 1,\r\n )\r\n this._updatePortalContent()\r\n }\r\n\r\n private _clear(e: Event) {\r\n e.stopPropagation()\r\n if (this._ctrl) {\r\n this.value = ['', '']\r\n this._emit()\r\n } else {\r\n this.defaultValue = ['', '']\r\n this._emit()\r\n }\r\n }\r\n\r\n private _onKey(e: KeyboardEvent) {\r\n if (this.disabled) return\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n e.preventDefault()\r\n this._toggle()\r\n }\r\n if (e.key === 'Escape') this._close()\r\n }\r\n\r\n private _renderCal(view: Date, prev: () => void, next: () => void) {\r\n const vy = view.getFullYear(),\r\n vm = view.getMonth()\r\n const days = calDays(vy, vm)\r\n const s = this._s,\r\n e = this._e,\r\n h = this._hoverDate\r\n const today = new Date()\r\n const hasBoth = this._hasStart && this._hasEnd\r\n const selecting = this._hasStart && !this._hasEnd\r\n\r\n return html`\r\n <div class=\"panel-col\">\r\n <div class=\"panel-header\">\r\n <span class=\"panel-header-title\">${vy}年${vm + 1}月</span>\r\n <div class=\"panel-nav\">\r\n <button class=\"panel-nav-btn\" @click=${prev} tabindex=\"-1\" type=\"button\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M10 4l-4 4 4 4\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" />\r\n </svg>\r\n </button>\r\n <button class=\"panel-nav-btn\" @click=${next} tabindex=\"-1\" type=\"button\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M6 4l4 4-4 4\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" />\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"panel-weekdays\">${WDS.map((w) => html`<div class=\"weekday\">${w}</div>`)}</div>\r\n <div class=\"panel-days\">\r\n ${days.map((d) => {\r\n const isS = s && sameDay(d.date, s)\r\n const isE = e && sameDay(d.date, e)\r\n const isT = sameDay(d.date, today)\r\n const dis = this.disabledDate ? this.disabledDate(d.date) : false\r\n const inR = hasBoth && inRange(d.date, s!, e!)\r\n const preview = selecting && h && inRange(d.date, s!, h)\r\n const range = inR || preview\r\n const start =\r\n isS || (preview && h && s && h.getTime() < s.getTime() && sameDay(d.date, h))\r\n const end =\r\n isE || (preview && h && s && h.getTime() >= s.getTime() && sameDay(d.date, h))\r\n return html`<button\r\n class=\"day ${d.cur ? '' : 'day--other'} ${isT ? 'day--today' : ''} ${\r\n start ? 'day--range-start' : ''\r\n } ${end ? 'day--range-end' : ''} ${\r\n range && !start && !end ? 'day--in-range' : ''\r\n } ${dis ? 'day--disabled' : ''}\"\r\n @click=${() => !dis && this._pick(d.date)}\r\n @mouseenter=${() => {\r\n this._hoverDate = d.date\r\n this._updatePortalContent()\r\n }}\r\n type=\"button\"\r\n tabindex=\"-1\"\r\n >\r\n ${d.date.getDate()}\r\n </button>`\r\n })}\r\n </div>\r\n </div>\r\n `\r\n }\r\n\r\n override updated(changedProperties: Map<string, unknown>) {\r\n super.updated(changedProperties)\r\n // Update portal content when state changes\r\n if (this._open && this._portalEl) {\r\n this._updatePortalContent()\r\n }\r\n }\r\n\r\n override render() {\r\n const val = this._res,\r\n has = val[0] || val[1]\r\n const txt = val[0] && val[1] ? `${val[0]} ~ ${val[1]}` : val[0] || val[1] || ''\r\n const size = this._resolvedSize\r\n\r\n return html`\r\n <div class=\"picker\" part=\"base\">\r\n <div\r\n class=\"picker-trigger picker-trigger--${size} ${this._open ? 'open' : ''} ${\r\n this.error ? 'picker-trigger--error' : ''\r\n } ${this.success ? 'picker-trigger--success' : ''} ${\r\n this.disabled ? 'picker-trigger--disabled' : ''\r\n }\"\r\n part=\"trigger\"\r\n @click=${this._toggle}\r\n @keydown=${this._onKey}\r\n tabindex=${this.disabled ? '-1' : '0'}\r\n role=\"combobox\"\r\n aria-expanded=${this._open}\r\n >\r\n <span class=\"picker-value ${txt ? '' : 'picker-placeholder'}\"\r\n >${txt || this.placeholder}</span\r\n >\r\n <div style=\"display:flex;align-items:center;gap:6px;\">\r\n ${\r\n this.clearable && has && !this.disabled\r\n ? html`<button\r\n class=\"picker-clear\"\r\n @click=${this._clear}\r\n tabindex=\"-1\"\r\n type=\"button\"\r\n >\r\n ✕\r\n </button>`\r\n : nothing\r\n }\r\n <span class=\"picker-icon\"\r\n ><svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M4 6l4 4 4-4\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" /></svg\r\n ></span>\r\n </div>\r\n </div>\r\n </div>\r\n `\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'mac-date-range-picker': MacDateRangePicker\r\n }\r\n}\r\n","import { html, css, nothing } from 'lit'\r\nimport { property, customElement, state, query } from 'lit/decorators.js'\r\nimport { BaseElement } from '../../internal/base-element'\r\nimport { sharedStyles } from '../../styles/shared-styles'\r\nimport { themeTokens } from '../../styles/theme'\r\n\r\nexport interface SelectOption {\r\n value: string\r\n label: string\r\n disabled?: boolean\r\n icon?: string\r\n description?: string\r\n}\r\n\r\nexport interface OptionGroup {\r\n label: string\r\n options: SelectOption[]\r\n}\r\n\r\n/**\r\n * @tag mac-select\r\n * @summary macOS 风格的下拉选择组件。\r\n *\r\n * @csspart base - 选择器的基础容器。\r\n * @csspart trigger - 触发按钮。\r\n * @csspart dropdown - 下拉菜单。\r\n * @csspart option - 下拉菜单中的选项。\r\n */\r\n@customElement('mac-select')\r\nexport class MacSelect extends BaseElement {\r\n static override styles = [\r\n themeTokens,\r\n sharedStyles,\r\n css`\r\n :host {\r\n display: block;\r\n }\r\n\r\n .select-wrapper {\r\n position: relative;\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--md-spacing-xs);\r\n }\r\n\r\n /* 触发按钮 */\r\n .select-trigger {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: var(--md-spacing-sm);\r\n padding: var(--md-select-trigger-padding-vertical)\r\n var(--md-select-trigger-padding-horizontal);\r\n border-radius: var(--md-select-trigger-radius);\r\n background-color: var(--md-color-bg);\r\n cursor: pointer;\r\n transition:\r\n border-color var(--md-transition-normal),\r\n background var(--md-transition-normal),\r\n box-shadow var(--md-transition-normal);\r\n user-select: none;\r\n min-height: var(--md-select-trigger-min-height);\r\n }\r\n\r\n .select-trigger--default {\r\n border: 1px solid var(--md-color-border);\r\n }\r\n\r\n .select-trigger--filled {\r\n border: none;\r\n background: rgba(0, 0, 0, 0.03);\r\n }\r\n\r\n .select-trigger--glass {\r\n border: 1px solid rgba(255, 255, 255, 0.2);\r\n background: rgba(255, 255, 255, 0.08);\r\n backdrop-filter: blur(10px) saturate(180%);\r\n -webkit-backdrop-filter: blur(10px) saturate(180%);\r\n }\r\n\r\n /* 聚焦状态 */\r\n .select-trigger--default:focus-within,\r\n .select-trigger--default.open {\r\n border-color: var(--md-color-primary);\r\n box-shadow: var(--md-select-container-focus-shadow);\r\n }\r\n\r\n .select-trigger--filled:focus-within,\r\n .select-trigger--filled.open {\r\n background: rgba(0, 0, 0, 0.05);\r\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\r\n }\r\n\r\n .select-trigger--glass:focus-within,\r\n .select-trigger--glass.open {\r\n border-color: var(--md-select-container-focus-border);\r\n background: rgba(255, 255, 255, 0.12);\r\n box-shadow: var(--md-select-container-focus-glass-shadow);\r\n }\r\n\r\n /* 错误和成功状态 */\r\n .select-trigger--error.select-trigger--default {\r\n border-color: var(--md-color-danger);\r\n }\r\n\r\n .select-trigger--success.select-trigger--default {\r\n border-color: var(--md-color-success);\r\n }\r\n\r\n /* 禁用状态 */\r\n .select-trigger--disabled {\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n pointer-events: none;\r\n }\r\n\r\n /* 选中值显示 */\r\n .select-value {\r\n flex: 1;\r\n display: flex;\r\n align-items: center;\r\n gap: var(--md-spacing-sm);\r\n overflow: hidden;\r\n }\r\n\r\n .select-placeholder {\r\n color: var(--md-color-text-secondary);\r\n }\r\n\r\n .select-value-text {\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n }\r\n\r\n /* 多选标签 */\r\n .select-tags {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: 4px;\r\n flex: 1;\r\n }\r\n\r\n .select-tag {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 4px;\r\n padding: 2px 8px;\r\n background: var(--md-select-tag-bg);\r\n border-radius: 12px;\r\n font-size: 12px;\r\n color: var(--md-select-tag-text);\r\n }\r\n\r\n .select-tag-remove {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 14px;\r\n height: 14px;\r\n border: none;\r\n background: rgba(0, 0, 0, 0.1);\r\n border-radius: 50%;\r\n cursor: pointer;\r\n font-size: 10px;\r\n color: inherit;\r\n padding: 0;\r\n transition: background var(--md-transition-fast);\r\n }\r\n\r\n .select-tag-remove:hover {\r\n background: rgba(0, 0, 0, 0.15);\r\n }\r\n\r\n /* 箭头图标 */\r\n .select-arrow {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 20px;\r\n height: 20px;\r\n transition: transform var(--md-transition-normal);\r\n color: var(--md-color-text-secondary);\r\n }\r\n\r\n .select-trigger.open .select-arrow {\r\n transform: rotate(180deg);\r\n }\r\n\r\n /* 清除按钮 */\r\n .select-clear {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 20px;\r\n height: 20px;\r\n border: none;\r\n background: rgba(0, 0, 0, 0.06);\r\n border-radius: 50%;\r\n cursor: pointer;\r\n color: var(--md-color-text-secondary);\r\n font-size: 12px;\r\n transition:\r\n background var(--md-transition-fast),\r\n color var(--md-transition-fast);\r\n padding: 0;\r\n }\r\n\r\n .select-clear:hover {\r\n background: rgba(0, 0, 0, 0.1);\r\n color: var(--md-color-text);\r\n }\r\n\r\n /* 下拉菜单 */\r\n .select-dropdown {\r\n position: absolute;\r\n top: calc(100% + 4px);\r\n left: 0;\r\n right: 0;\r\n min-width: 100%;\r\n max-height: 300px;\r\n overflow-y: auto;\r\n background: var(--md-color-bg);\r\n border: 1px solid var(--md-color-border);\r\n border-radius: var(--md-radius-md);\r\n box-shadow:\r\n 0 4px 16px rgba(0, 0, 0, 0.12),\r\n 0 2px 8px rgba(0, 0, 0, 0.08);\r\n z-index: 99999;\r\n opacity: 0;\r\n transform: translateY(-8px);\r\n pointer-events: none;\r\n transition:\r\n opacity var(--md-transition-normal),\r\n transform var(--md-transition-normal);\r\n }\r\n\r\n .select-dropdown.open {\r\n opacity: 1;\r\n transform: translateY(0);\r\n pointer-events: auto;\r\n }\r\n\r\n /* 搜索输入框 */\r\n .select-search {\r\n padding: var(--md-spacing-sm);\r\n border-bottom: 1px solid var(--md-color-border);\r\n position: sticky;\r\n top: 0;\r\n background: var(--md-color-bg);\r\n z-index: 1;\r\n }\r\n\r\n .select-search-input {\r\n width: 100%;\r\n padding: var(--md-spacing-xs) var(--md-spacing-sm);\r\n border: 1px solid var(--md-color-border);\r\n border-radius: var(--md-radius-sm);\r\n font-size: 14px;\r\n outline: none;\r\n transition: border-color var(--md-transition-normal);\r\n }\r\n\r\n .select-search-input:focus {\r\n border-color: var(--md-color-primary);\r\n }\r\n\r\n /* 选项分组 */\r\n .select-group-label {\r\n padding: var(--md-spacing-xs) var(--md-spacing-md);\r\n font-size: 12px;\r\n font-weight: 600;\r\n color: var(--md-color-text-secondary);\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n background: rgba(0, 0, 0, 0.02);\r\n position: sticky;\r\n top: 0;\r\n }\r\n\r\n .select-group-label:first-child {\r\n border-radius: var(--md-radius-md) var(--md-radius-md) 0 0;\r\n }\r\n\r\n /* 选项 */\r\n .select-option {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--md-spacing-sm);\r\n padding: var(--md-spacing-sm) var(--md-spacing-md);\r\n cursor: pointer;\r\n transition: background var(--md-transition-fast);\r\n position: relative;\r\n }\r\n\r\n .select-option:hover {\r\n background: var(--md-select-item-hover-bg);\r\n }\r\n\r\n .select-option.selected {\r\n background: var(--md-select-item-selected-bg);\r\n }\r\n\r\n .select-option.focused {\r\n background: var(--md-select-item-focused-bg);\r\n }\r\n\r\n .select-option.disabled {\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n pointer-events: none;\r\n }\r\n\r\n .select-option-icon {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 20px;\r\n height: 20px;\r\n font-size: 16px;\r\n }\r\n\r\n .select-option-content {\r\n flex: 1;\r\n min-width: 0;\r\n }\r\n\r\n .select-option-label {\r\n font-size: 14px;\r\n color: var(--md-color-text);\r\n }\r\n\r\n .select-option-description {\r\n font-size: 12px;\r\n color: var(--md-color-text-secondary);\r\n margin-top: 2px;\r\n }\r\n\r\n .select-option-check {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 18px;\r\n height: 18px;\r\n color: var(--md-color-primary);\r\n font-size: 14px;\r\n }\r\n\r\n /* 空状态 */\r\n .select-empty {\r\n padding: var(--md-spacing-lg);\r\n text-align: center;\r\n color: var(--md-color-text-secondary);\r\n }\r\n\r\n /* 加载状态 */\r\n .select-loading {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n padding: var(--md-spacing-lg);\r\n }\r\n\r\n .loading-spinner {\r\n width: 20px;\r\n height: 20px;\r\n border: 2px solid rgba(0, 0, 0, 0.1);\r\n border-top-color: var(--md-color-primary);\r\n border-radius: 50%;\r\n animation: spin 0.8s linear infinite;\r\n }\r\n\r\n @keyframes spin {\r\n to {\r\n transform: rotate(360deg);\r\n }\r\n }\r\n\r\n /* 标签 */\r\n .select-label {\r\n font-size: var(--md-font-size-base);\r\n color: var(--md-color-text);\r\n font-weight: 500;\r\n }\r\n\r\n .select-label--required::after {\r\n content: ' *';\r\n color: var(--md-color-danger);\r\n }\r\n\r\n /* 辅助文本 */\r\n .select-helper-text {\r\n font-size: var(--md-font-size-sm);\r\n color: var(--md-color-text-secondary);\r\n }\r\n\r\n .select-helper-text--error {\r\n color: var(--md-color-danger);\r\n }\r\n\r\n .select-helper-text--success {\r\n color: var(--md-color-success);\r\n }\r\n\r\n /* 尺寸 */\r\n .select-trigger--sm {\r\n padding: var(--sm-select-trigger-padding-vertical)\r\n var(--sm-select-trigger-padding-horizontal);\r\n font-size: var(--sm-select-trigger-font-size);\r\n min-height: var(--sm-select-trigger-min-height);\r\n }\r\n\r\n .select-trigger--lg {\r\n padding: var(--lg-select-trigger-padding-vertical)\r\n var(--lg-select-trigger-padding-horizontal);\r\n font-size: var(--lg-select-trigger-font-size);\r\n min-height: var(--lg-select-trigger-min-height);\r\n }\r\n\r\n :host([data-theme='dark']) .select-trigger--filled {\r\n background: var(--md-select-container-dark-filled-bg);\r\n }\r\n\r\n :host([data-theme='dark']) .select-trigger--glass {\r\n background: var(--md-select-container-dark-glass-bg);\r\n }\r\n\r\n :host([data-theme='dark']) .select-dropdown {\r\n background: var(--md-select-container-dark-bg);\r\n border-color: var(--md-select-container-dark-border);\r\n }\r\n\r\n :host([data-theme='dark']) .select-option:hover {\r\n background: var(--md-select-item-dark-hover-bg);\r\n }\r\n\r\n :host([data-theme='dark']) .select-option.selected {\r\n background: var(--md-select-item-dark-selected-bg);\r\n }\r\n\r\n :host([data-theme='dark']) .select-option.focused {\r\n background: var(--md-select-item-dark-focused-bg);\r\n }\r\n\r\n :host([data-theme='dark']) .select-tag {\r\n background: var(--md-select-tag-dark-bg);\r\n }\r\n\r\n :host([data-theme='dark']) .select-clear {\r\n background: var(--md-select-clear-dark-bg);\r\n }\r\n\r\n :host([data-theme='dark']) .select-clear:hover {\r\n background: var(--md-select-clear-dark-hover-bg);\r\n }\r\n\r\n /* ─── 响应式:移动端适配 ─── */\r\n @media (max-width: 768px) {\r\n /* 下拉面板增大最大高度,方便触控滚动选择 */\r\n .select-dropdown {\r\n max-height: 50vh;\r\n }\r\n /* 搜索框字号 16px 防止 iOS 聚焦缩放 */\r\n .select-search-input {\r\n font-size: 16px;\r\n padding: 10px 12px;\r\n }\r\n /* 选项触控目标 ≥ 44px */\r\n .select-option {\r\n padding: 12px var(--md-spacing-md);\r\n font-size: 16px;\r\n }\r\n .select-option-label {\r\n font-size: 16px;\r\n }\r\n .select-option-description {\r\n font-size: 13px;\r\n }\r\n .select-option-icon {\r\n width: 24px;\r\n height: 24px;\r\n font-size: 20px;\r\n }\r\n .select-option-check {\r\n width: 22px;\r\n height: 22px;\r\n font-size: 18px;\r\n }\r\n .select-group-label {\r\n font-size: 13px;\r\n padding: 10px var(--md-spacing-md);\r\n }\r\n }\r\n `,\r\n ]\r\n\r\n /** 选择器的值(单选:string,多选:string[])。 */\r\n @property({ type: String }) value: string | string[] = ''\r\n\r\n /** 选择器的占位符。 */\r\n @property() placeholder = 'Select an option'\r\n\r\n /** 选择器的选项。 */\r\n @property({ type: Array }) options: SelectOption[] = []\r\n\r\n /** 选项分组。 */\r\n @property({ type: Array }) groups: OptionGroup[] = []\r\n\r\n /** 选择器的尺寸。 */\r\n @property({ reflect: true }) size?: 'sm' | 'md' | 'lg'\r\n\r\n /** 视觉变体。 */\r\n @property({ reflect: true }) variant: 'default' | 'filled' | 'glass' = 'default'\r\n\r\n /** 选择器的标签。 */\r\n @property() label = ''\r\n\r\n /** 显示必填指示器。 */\r\n @property({ type: Boolean }) required = false\r\n\r\n /** 禁用选择器。 */\r\n @property({ type: Boolean, reflect: true }) disabled = false\r\n\r\n /** 选择器的错误状态。 */\r\n @property({ type: Boolean, reflect: true }) error = false\r\n\r\n /** 选择器的成功状态。 */\r\n @property({ type: Boolean, reflect: true }) success = false\r\n\r\n /** 选择器的辅助文本。 */\r\n @property({ attribute: 'helper-text' }) helperText = ''\r\n\r\n /** 启用多选。 */\r\n @property({ type: Boolean }) multiple = false\r\n\r\n /** 显示清除按钮。 */\r\n @property({ type: Boolean }) clearable = false\r\n\r\n /** 启用搜索功能。 */\r\n @property({ type: Boolean }) searchable = false\r\n\r\n /** 显示加载状态。 */\r\n @property({ type: Boolean }) loading = false\r\n\r\n /** 搜索输入框的占位符。 */\r\n @property({ attribute: 'search-placeholder' }) searchPlaceholder = 'Search...'\r\n\r\n /** 无选项时的空文本。 */\r\n @property({ attribute: 'empty-text' }) emptyText = 'No options available'\r\n\r\n @state() private _open = false\r\n\r\n @state() private _searchQuery = ''\r\n\r\n @state() private _focusedIndex = -1\r\n\r\n @query('.select-trigger') private _trigger!: HTMLElement\r\n\r\n private _portalEl: HTMLElement | null = null\r\n private _portalId = `mac-select-portal-${Math.random().toString(36).substr(2, 9)}`\r\n private _scrollHandler: (() => void) | null = null\r\n\r\n private static _stylesInjected = false\r\n private static _injectPortalStyles() {\r\n if (MacSelect._stylesInjected) return\r\n MacSelect._stylesInjected = true\r\n\r\n // 向 :root 注入全局 CSS 变量,以便 portal 可以访问\r\n const vars = document.createElement('style')\r\n vars.id = 'mac-select-theme-vars'\r\n vars.textContent = `\r\n :root {\r\n /* 字体 */\r\n --md-font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Display', 'SF Pro Text', 'Helvetica Neue', sans-serif;\r\n\r\n /* 间距 */\r\n --md-spacing-xs: 4px;\r\n --md-spacing-sm: 8px;\r\n --md-spacing-md: 12px;\r\n\r\n /* 圆角 */\r\n --md-radius-sm: 4px;\r\n --md-radius-md: 6px;\r\n\r\n /* 字号 */\r\n --md-font-size-xs: 11px;\r\n --md-font-size-sm: 12px;\r\n --md-font-size-menu: 13px;\r\n\r\n /* 过渡 */\r\n --md-transition-fast: 150ms ease;\r\n\r\n /* 颜色 */\r\n --md-color-bg: #ffffff;\r\n --md-color-border: #d1d5db;\r\n --md-color-text: #1f2937;\r\n --md-color-text-secondary: #6b7280;\r\n --md-color-primary: #3b82f6;\r\n\r\n /* 选择器专属 */\r\n --md-select-item-hover-bg: rgba(0, 122, 255, 0.05);\r\n --md-select-item-selected-bg: rgba(0, 122, 255, 0.08);\r\n --md-select-item-focused-bg: rgba(0, 122, 255, 0.1);\r\n\r\n /* 深色主题颜色 */\r\n --md-color-dark-bg: rgba(30, 30, 30, 0.95);\r\n --md-color-dark-border: rgba(255, 255, 255, 0.1);\r\n --md-color-dark-text: #f5f5f7;\r\n --md-color-dark-text-secondary: #98989d;\r\n --md-select-item-dark-hover-bg: rgba(255, 255, 255, 0.08);\r\n --md-select-item-dark-selected-bg: rgba(0, 122, 255, 0.15);\r\n }\r\n `\r\n document.head.appendChild(vars)\r\n\r\n const style = document.createElement('style')\r\n style.id = 'mac-select-portal-styles'\r\n style.textContent = `\r\n .mac-select-portal {\r\n position: fixed;\r\n min-width: 100px;\r\n max-height: 300px;\r\n overflow-y: auto;\r\n background: var(--md-color-bg);\r\n border: 1px solid var(--md-color-border);\r\n border-radius: var(--md-radius-md);\r\n box-shadow:\r\n 0 4px 16px rgba(0, 0, 0, 0.12),\r\n 0 2px 8px rgba(0, 0, 0, 0.08);\r\n z-index: 99999;\r\n opacity: 0;\r\n transform: translateY(-8px);\r\n pointer-events: none;\r\n transition:\r\n opacity var(--md-transition-fast),\r\n transform var(--md-transition-fast);\r\n font-family: var(--md-font-family);\r\n }\r\n .mac-select-portal.open {\r\n opacity: 1;\r\n transform: translateY(0);\r\n pointer-events: auto;\r\n }\r\n\r\n /* 搜索 */\r\n .mac-select-portal .select-search {\r\n padding: var(--md-spacing-sm);\r\n border-bottom: 1px solid var(--md-color-border);\r\n }\r\n .mac-select-portal .select-search-input {\r\n width: 100%;\r\n padding: var(--md-spacing-xs) var(--md-spacing-sm);\r\n border: 1px solid var(--md-color-border);\r\n border-radius: var(--md-radius-sm);\r\n font-size: var(--md-font-size-menu);\r\n background: var(--md-color-bg);\r\n color: var(--md-color-text);\r\n outline: none;\r\n }\r\n .mac-select-portal .select-search-input:focus {\r\n border-color: var(--md-color-primary);\r\n }\r\n\r\n /* 选项 */\r\n .mac-select-portal .select-options {\r\n padding: var(--md-spacing-xs) 0;\r\n }\r\n .mac-select-portal .select-group-label {\r\n padding: var(--md-spacing-xs) var(--md-spacing-md);\r\n font-size: var(--md-font-size-xs);\r\n font-weight: 600;\r\n color: var(--md-color-text-secondary);\r\n user-select: none;\r\n }\r\n .mac-select-portal .select-option {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--md-spacing-sm);\r\n padding: var(--md-spacing-sm) var(--md-spacing-md);\r\n cursor: pointer;\r\n transition: background var(--md-transition-fast);\r\n user-select: none;\r\n }\r\n .mac-select-portal .select-option:hover:not(.disabled) {\r\n background: var(--md-select-item-hover-bg);\r\n }\r\n .mac-select-portal .select-option.focused {\r\n background: var(--md-select-item-focused-bg);\r\n }\r\n .mac-select-portal .select-option.selected {\r\n background: var(--md-select-item-selected-bg);\r\n }\r\n .mac-select-portal .select-option.disabled {\r\n opacity: 0.4;\r\n cursor: not-allowed;\r\n }\r\n .mac-select-portal .select-option-icon {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 20px;\r\n height: 20px;\r\n font-size: 16px;\r\n }\r\n .mac-select-portal .select-option-content {\r\n flex: 1;\r\n }\r\n .mac-select-portal .select-option-label {\r\n font-size: var(--md-font-size-menu);\r\n color: var(--md-color-text);\r\n }\r\n .mac-select-portal .select-option-description {\r\n font-size: var(--md-font-size-xs);\r\n color: var(--md-color-text-secondary);\r\n margin-top: 2px;\r\n }\r\n\r\n /* 空状态 */\r\n .mac-select-portal .select-empty {\r\n padding: var(--md-spacing-lg) var(--md-spacing-md);\r\n text-align: center;\r\n color: var(--md-color-text-secondary);\r\n font-size: var(--md-font-size-sm);\r\n }\r\n\r\n /* 深色主题 */\r\n .mac-select-portal[data-theme='dark'] {\r\n background: var(--md-color-dark-bg);\r\n border-color: var(--md-color-dark-border);\r\n }\r\n .mac-select-portal[data-theme='dark'] .select-search {\r\n border-bottom-color: var(--md-color-dark-border);\r\n }\r\n .mac-select-portal[data-theme='dark'] .select-search-input {\r\n background: rgba(30, 30, 30, 0.9);\r\n border-color: rgba(255, 255, 255, 0.15);\r\n color: var(--md-color-dark-text);\r\n }\r\n .mac-select-portal[data-theme='dark'] .select-group-label {\r\n color: var(--md-color-dark-text-secondary);\r\n }\r\n .mac-select-portal[data-theme='dark'] .select-option:hover:not(.disabled) {\r\n background: var(--md-select-item-dark-hover-bg);\r\n }\r\n .mac-select-portal[data-theme='dark'] .select-option.selected {\r\n background: var(--md-select-item-dark-selected-bg);\r\n }\r\n .mac-select-portal[data-theme='dark'] .select-option-label {\r\n color: var(--md-color-dark-text);\r\n }\r\n .mac-select-portal[data-theme='dark'] .select-option-description {\r\n color: var(--md-color-dark-text-secondary);\r\n }\r\n .mac-select-portal[data-theme='dark'] .select-empty {\r\n color: var(--md-color-dark-text-secondary);\r\n }\r\n `\r\n document.head.appendChild(style)\r\n }\r\n\r\n private _handleDocumentClick = (e: Event) => {\r\n const path = e.composedPath()\r\n if (!path.includes(this)) {\r\n this._close()\r\n }\r\n }\r\n\r\n override connectedCallback() {\r\n super.connectedCallback()\r\n MacSelect._injectPortalStyles()\r\n document.addEventListener('click', this._handleDocumentClick)\r\n }\r\n\r\n override disconnectedCallback() {\r\n super.disconnectedCallback()\r\n document.removeEventListener('click', this._handleDocumentClick)\r\n this._removeScrollListener()\r\n this._removePortal()\r\n }\r\n\r\n private _addScrollListener() {\r\n if (this._scrollHandler) return\r\n this._scrollHandler = () => {\r\n if (this._open && this._portalEl && this._trigger) {\r\n const rect = this._trigger.getBoundingClientRect()\r\n this._portalEl.style.left = `${rect.left}px`\r\n this._portalEl.style.top = `${rect.bottom + 4}px`\r\n }\r\n }\r\n window.addEventListener('scroll', this._scrollHandler, true)\r\n window.addEventListener('resize', this._scrollHandler)\r\n }\r\n\r\n private _removeScrollListener() {\r\n if (this._scrollHandler) {\r\n window.removeEventListener('scroll', this._scrollHandler, true)\r\n window.removeEventListener('resize', this._scrollHandler)\r\n this._scrollHandler = null\r\n }\r\n }\r\n\r\n private _toggle() {\r\n if (this.disabled) return\r\n this._open ? this._close() : this._openDropdown()\r\n }\r\n\r\n private _openDropdown() {\r\n this._open = true\r\n this._focusedIndex = -1\r\n this._createPortal()\r\n }\r\n\r\n private _close() {\r\n this._open = false\r\n this._searchQuery = ''\r\n this._focusedIndex = -1\r\n this._removePortal()\r\n }\r\n\r\n private _createPortal() {\r\n this._removePortal()\r\n\r\n if (!this._trigger) return\r\n\r\n const rect = this._trigger.getBoundingClientRect()\r\n const portal = document.createElement('div')\r\n portal.id = this._portalId\r\n portal.className = 'mac-select-portal'\r\n portal.setAttribute('role', 'listbox')\r\n portal.setAttribute('part', 'dropdown')\r\n portal.setAttribute('aria-multiselectable', String(this.multiple))\r\n\r\n const theme = this._resolvedTheme\r\n if (theme) {\r\n portal.setAttribute('data-theme', theme)\r\n }\r\n\r\n // 位置\r\n const left = rect.left\r\n const top = rect.bottom + 4\r\n const width = rect.width\r\n\r\n portal.style.left = `${left}px`\r\n portal.style.top = `${top}px`\r\n portal.style.width = `${width}px`\r\n\r\n // 渲染下拉内容\r\n portal.innerHTML = this._renderDropdownHTML()\r\n\r\n document.body.appendChild(portal)\r\n this._portalEl = portal\r\n\r\n // 绑定事件\r\n this._bindPortalEvents(portal)\r\n\r\n // 添加滚动监听器以更新位置\r\n this._addScrollListener()\r\n\r\n // 进入动画\r\n requestAnimationFrame(() => {\r\n portal.classList.add('open')\r\n })\r\n }\r\n\r\n private _removePortal() {\r\n this._removeScrollListener()\r\n if (this._portalEl) {\r\n this._portalEl.classList.remove('open')\r\n const el = this._portalEl\r\n setTimeout(() => {\r\n if (el.parentNode) {\r\n el.parentNode.removeChild(el)\r\n }\r\n }, 200)\r\n this._portalEl = null\r\n }\r\n }\r\n\r\n private _renderDropdownHTML(): string {\r\n const filteredOptions = this._getFilteredOptions()\r\n\r\n let html = ''\r\n\r\n // 搜索框\r\n if (this.searchable) {\r\n html += `\r\n <div class=\"select-search\">\r\n <input\r\n class=\"select-search-input\"\r\n type=\"text\"\r\n placeholder=\"${this.searchPlaceholder}\"\r\n data-search-input\r\n />\r\n </div>\r\n `\r\n }\r\n\r\n // 空状态\r\n if (filteredOptions.length === 0) {\r\n html += `<div class=\"select-empty\">${this.emptyText}</div>`\r\n } else {\r\n // 选项列表\r\n html += '<div class=\"select-options\">'\r\n filteredOptions.forEach((item, index) => {\r\n if ('type' in item && item.type === 'group') {\r\n html += `<div class=\"select-group-label\">${item.label}</div>`\r\n } else {\r\n const option = item as SelectOption\r\n const isSelected = this._isSelected(option.value)\r\n const classes = [\r\n 'select-option',\r\n isSelected ? 'select-option--selected' : '',\r\n option.disabled ? 'select-option--disabled' : '',\r\n index === this._focusedIndex ? 'focused' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ')\r\n\r\n html += `\r\n <div\r\n class=\"${classes}\"\r\n data-value=\"${option.value}\"\r\n data-index=\"${index}\"\r\n data-disabled=\"${!!option.disabled}\"\r\n role=\"option\"\r\n aria-selected=\"${isSelected}\"\r\n aria-disabled=\"${!!option.disabled}\"\r\n >\r\n ${option.icon ? `<span class=\"select-option-icon\">${option.icon}</span>` : ''}\r\n <span class=\"select-option-label\">${option.label}</span>\r\n ${option.description ? `<span class=\"select-option-description\">${option.description}</span>` : ''}\r\n </div>\r\n `\r\n }\r\n })\r\n html += '</div>'\r\n }\r\n\r\n return html\r\n }\r\n\r\n private _bindPortalEvents(portal: HTMLElement) {\r\n // 搜索输入框事件\r\n const searchInput = portal.querySelector('[data-search-input]') as HTMLInputElement | null\r\n if (searchInput) {\r\n searchInput.value = this._searchQuery\r\n searchInput.addEventListener('input', (e) => {\r\n this._searchQuery = searchInput.value\r\n this._focusedIndex = -1\r\n // 重新渲染下拉内容\r\n portal.innerHTML = this._renderDropdownHTML()\r\n this._bindPortalEvents(portal)\r\n })\r\n searchInput.addEventListener('keydown', (e) => {\r\n e.stopPropagation()\r\n this._handleKeyDown(e)\r\n })\r\n // 聚焦搜索输入框\r\n requestAnimationFrame(() => {\r\n searchInput.focus()\r\n })\r\n }\r\n\r\n // 选项点击事件\r\n portal.addEventListener('click', (e) => {\r\n const target = (e.target as HTMLElement).closest('.select-option') as HTMLElement | null\r\n if (!target) return\r\n\r\n const isDisabled = target.dataset.disabled === 'true'\r\n if (isDisabled) return\r\n\r\n const value = target.dataset.value\r\n if (value) {\r\n const option = this._getAllOptions().find((o) => o.value === value)\r\n if (option) {\r\n this._selectOption(option)\r\n // 多选时重新渲染(更新选中状态)\r\n if (this.multiple) {\r\n portal.innerHTML = this._renderDropdownHTML()\r\n this._bindPortalEvents(portal)\r\n }\r\n }\r\n }\r\n })\r\n }\r\n\r\n private _getAllOptions(): SelectOption[] {\r\n if (this.groups.length > 0) {\r\n return this.groups.flatMap((g) => g.options)\r\n }\r\n return this.options\r\n }\r\n\r\n private _getFilteredOptions(): (SelectOption | { type: 'group'; label: string })[] {\r\n const allOptions = this._getAllOptions()\r\n const filtered = this._searchQuery\r\n ? allOptions.filter(\r\n (opt) =>\r\n opt.label.toLowerCase().includes(this._searchQuery.toLowerCase()) ||\r\n opt.value.toLowerCase().includes(this._searchQuery.toLowerCase()),\r\n )\r\n : allOptions\r\n\r\n if (this.groups.length > 0 && !this._searchQuery) {\r\n const result: (SelectOption | { type: 'group'; label: string })[] = []\r\n this.groups.forEach((group) => {\r\n result.push({ type: 'group', label: group.label })\r\n result.push(...group.options)\r\n })\r\n return result\r\n }\r\n\r\n return filtered\r\n }\r\n\r\n private _isSelected(value: string): boolean {\r\n if (this.multiple) {\r\n return Array.isArray(this.value) && this.value.includes(value)\r\n }\r\n return this.value === value\r\n }\r\n\r\n private _selectOption(option: SelectOption) {\r\n if (option.disabled) return\r\n\r\n if (this.multiple) {\r\n const currentValue = Array.isArray(this.value) ? [...this.value] : []\r\n const index = currentValue.indexOf(option.value)\r\n\r\n if (index > -1) {\r\n currentValue.splice(index, 1)\r\n } else {\r\n currentValue.push(option.value)\r\n }\r\n\r\n this.value = currentValue\r\n this.emit('mac-change', { detail: { value: currentValue } })\r\n } else {\r\n this.value = option.value\r\n this._close()\r\n this.emit('mac-change', { detail: { value: option.value } })\r\n }\r\n }\r\n\r\n private _removeTag(value: string, e: Event) {\r\n e.stopPropagation()\r\n if (Array.isArray(this.value)) {\r\n const newValue = this.value.filter((v) => v !== value)\r\n this.value = newValue\r\n this.emit('mac-change', { detail: { value: newValue } })\r\n }\r\n }\r\n\r\n private _clear(e: Event) {\r\n e.stopPropagation()\r\n this.value = this.multiple ? [] : ''\r\n this.emit('mac-change', { detail: { value: this.value } })\r\n }\r\n\r\n private _handleKeyDown(e: KeyboardEvent) {\r\n if (this.disabled) return\r\n\r\n const filteredOptions = this._getFilteredOptions().filter(\r\n (item): item is SelectOption => 'value' in item,\r\n )\r\n\r\n switch (e.key) {\r\n case 'Enter':\r\n case ' ':\r\n e.preventDefault()\r\n if (this._open && this._focusedIndex > -1) {\r\n const option = filteredOptions[this._focusedIndex]\r\n if (option) this._selectOption(option)\r\n } else {\r\n this._toggle()\r\n }\r\n break\r\n\r\n case 'Escape':\r\n this._close()\r\n break\r\n\r\n case 'ArrowDown':\r\n e.preventDefault()\r\n if (!this._open) {\r\n this._openDropdown()\r\n } else {\r\n this._focusedIndex = Math.min(this._focusedIndex + 1, filteredOptions.length - 1)\r\n this._scrollToOption()\r\n }\r\n break\r\n\r\n case 'ArrowUp':\r\n e.preventDefault()\r\n if (this._open) {\r\n this._focusedIndex = Math.max(this._focusedIndex - 1, 0)\r\n this._scrollToOption()\r\n }\r\n break\r\n\r\n case 'Tab':\r\n this._close()\r\n break\r\n }\r\n }\r\n\r\n private _scrollToOption() {\r\n const option = this._portalEl?.querySelector('.select-option.focused') as HTMLElement\r\n if (option) {\r\n option.scrollIntoView({ block: 'nearest' })\r\n }\r\n }\r\n\r\n private _getDisplayValue(): string {\r\n if (this.multiple && Array.isArray(this.value)) {\r\n if (this.value.length === 0) return ''\r\n return `${this.value.length} selected`\r\n }\r\n\r\n const option = this._getAllOptions().find((opt) => opt.value === this.value)\r\n return option?.label || ''\r\n }\r\n\r\n override willUpdate() {\r\n const size = this._resolvedSize\r\n if (this.getAttribute('size') !== size) {\r\n this.setAttribute('size', size)\r\n }\r\n const theme = this._resolvedTheme\r\n if (theme) {\r\n this.setAttribute('data-theme', theme)\r\n } else {\r\n this.removeAttribute('data-theme')\r\n }\r\n }\r\n\r\n override render() {\r\n const displayValue = this._getDisplayValue()\r\n const hasValue = this.multiple\r\n ? Array.isArray(this.value) && this.value.length > 0\r\n : this.value !== ''\r\n const filteredOptions = this._getFilteredOptions()\r\n const size = this._resolvedSize\r\n\r\n return html`\r\n <div class=\"select-wrapper\" part=\"base\">\r\n ${\r\n this.label\r\n ? html`\r\n <label class=\"select-label ${this.required ? 'select-label--required' : ''}\">\r\n ${this.label}\r\n </label>\r\n `\r\n : nothing\r\n }\r\n\r\n <div\r\n class=\"select-trigger\r\n select-trigger--${this.variant}\r\n select-trigger--${size}\r\n ${this._open ? 'open' : ''}\r\n ${this.error ? 'select-trigger--error' : ''}\r\n ${this.success ? 'select-trigger--success' : ''}\r\n ${this.disabled ? 'select-trigger--disabled' : ''}\"\r\n part=\"trigger\"\r\n @click=${this._toggle}\r\n @keydown=${this._handleKeyDown}\r\n tabindex=${this.disabled ? '-1' : '0'}\r\n role=\"combobox\"\r\n aria-expanded=${this._open}\r\n aria-haspopup=\"listbox\"\r\n >\r\n <div class=\"select-value\">\r\n ${\r\n this.multiple && Array.isArray(this.value) && this.value.length > 0\r\n ? html`\r\n <div class=\"select-tags\">\r\n ${this.value.map((v) => {\r\n const opt = this._getAllOptions().find((o) => o.value === v)\r\n return html`\r\n <span class=\"select-tag\">\r\n ${opt?.icon ? html`<span>${opt.icon}</span>` : nothing}\r\n ${opt?.label || v}\r\n <button\r\n class=\"select-tag-remove\"\r\n @click=${(e: Event) => this._removeTag(v, e)}\r\n >\r\n ✕\r\n </button>\r\n </span>\r\n `\r\n })}\r\n </div>\r\n `\r\n : hasValue\r\n ? html`\r\n ${(() => {\r\n const opt = this._getAllOptions().find((o) => o.value === this.value)\r\n return html`\r\n ${\r\n opt?.icon\r\n ? html`<span class=\"select-option-icon\">${opt.icon}</span>`\r\n : nothing\r\n }\r\n <span class=\"select-value-text\">${displayValue}</span>\r\n `\r\n })()}\r\n `\r\n : html`<span class=\"select-placeholder\">${this.placeholder}</span>`\r\n }\r\n </div>\r\n\r\n <div style=\"display: flex; align-items: center; gap: 8px;\">\r\n ${\r\n this.clearable && hasValue && !this.disabled\r\n ? html`\r\n <button class=\"select-clear\" @click=${this._clear} tabindex=\"-1\">✕</button>\r\n `\r\n : nothing\r\n }\r\n\r\n <span class=\"select-arrow\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M4 6l4 4 4-4\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n ${\r\n this.helperText\r\n ? html`\r\n <div\r\n class=\"select-helper-text\r\n ${this.error ? 'select-helper-text--error' : ''}\r\n ${this.success ? 'select-helper-text--success' : ''}\"\r\n >\r\n ${this.helperText}\r\n </div>\r\n `\r\n : nothing\r\n }\r\n </div>\r\n `\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'mac-select': MacSelect\r\n }\r\n}\r\n","import { html, css, nothing } from 'lit'\r\nimport { property, customElement, state } from 'lit/decorators.js'\r\nimport { BaseElement } from '../../internal/base-element'\r\nimport { sharedStyles } from '../../styles/shared-styles'\r\nimport { themeTokens } from '../../styles/theme'\r\n\r\nexport interface TreeOption {\r\n value: string\r\n label: string\r\n disabled?: boolean\r\n children?: TreeOption[]\r\n}\r\n\r\ntype CheckState = 'unchecked' | 'half-checked' | 'checked'\r\n\r\n@customElement('mac-tree-select')\r\nexport class MacTreeSelect extends BaseElement {\r\n static override styles = [\r\n themeTokens,\r\n sharedStyles,\r\n css`\r\n :host {\r\n display: block;\r\n }\r\n .tree-select {\r\n position: relative;\r\n }\r\n\r\n /* 触发器 */\r\n .tree-trigger {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: var(--md-spacing-sm);\r\n padding: var(--md-select-trigger-padding-vertical)\r\n var(--md-select-trigger-padding-horizontal);\r\n border-radius: var(--md-radius-lg);\r\n background: var(--md-color-bg);\r\n cursor: pointer;\r\n transition: all 200ms cubic-bezier(0.4, 0, 0.2, 1);\r\n user-select: none;\r\n min-height: var(--md-select-trigger-min-height);\r\n border: 1px solid var(--md-color-border);\r\n }\r\n .tree-trigger:hover:not(.tree-trigger--disabled) {\r\n border-color: var(--md-color-primary);\r\n }\r\n .tree-trigger.open,\r\n .tree-trigger:focus-within {\r\n border-color: var(--md-color-primary);\r\n box-shadow:\r\n 0 0 0 3px rgba(0, 122, 255, 0.1),\r\n 0 2px 8px rgba(0, 122, 255, 0.08);\r\n }\r\n .tree-trigger--disabled {\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n pointer-events: none;\r\n background: var(--md-color-bg-secondary);\r\n }\r\n .tree-trigger--error {\r\n border-color: var(--md-color-danger);\r\n }\r\n .tree-trigger--error.open,\r\n .tree-trigger--error:focus-within {\r\n box-shadow:\r\n 0 0 0 3px rgba(255, 59, 48, 0.1),\r\n 0 2px 8px rgba(255, 59, 48, 0.08);\r\n }\r\n .tree-trigger--success {\r\n border-color: var(--md-color-success);\r\n }\r\n\r\n .tree-value {\r\n flex: 1;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n }\r\n .tree-placeholder {\r\n color: #9ca3af;\r\n }\r\n\r\n .tree-tags {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: 4px;\r\n flex: 1;\r\n }\r\n .tree-tag {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 4px;\r\n padding: 2px 8px;\r\n background: var(--md-select-tag-bg);\r\n border-radius: 12px;\r\n font-size: 12px;\r\n color: var(--md-select-tag-text);\r\n }\r\n .tree-tag-remove {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 14px;\r\n height: 14px;\r\n border: none;\r\n background: rgba(0, 0, 0, 0.1);\r\n border-radius: 50%;\r\n cursor: pointer;\r\n font-size: 10px;\r\n color: inherit;\r\n padding: 0;\r\n transition: background 200ms;\r\n }\r\n .tree-tag-remove:hover {\r\n background: rgba(0, 0, 0, 0.15);\r\n }\r\n\r\n .tree-actions {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n }\r\n .tree-clear {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 18px;\r\n height: 18px;\r\n border: none;\r\n background: rgba(0, 0, 0, 0.06);\r\n border-radius: 50%;\r\n cursor: pointer;\r\n color: var(--md-color-text-secondary);\r\n font-size: 10px;\r\n transition: all 200ms;\r\n padding: 0;\r\n flex-shrink: 0;\r\n }\r\n .tree-clear:hover {\r\n background: rgba(0, 0, 0, 0.1);\r\n color: var(--md-color-text);\r\n }\r\n .tree-arrow {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 20px;\r\n height: 20px;\r\n color: #9ca3af;\r\n transition: transform 200ms;\r\n flex-shrink: 0;\r\n }\r\n .tree-trigger.open .tree-arrow {\r\n transform: rotate(180deg);\r\n }\r\n\r\n /* 下拉面板 */\r\n .tree-dropdown {\r\n position: absolute;\r\n top: calc(100% + 6px);\r\n left: 0;\r\n width: 320px;\r\n max-height: 400px;\r\n overflow-y: auto;\r\n background: var(--md-color-bg);\r\n border: 1px solid var(--md-color-border);\r\n border-radius: 12px;\r\n box-shadow:\r\n 0 12px 40px rgba(0, 0, 0, 0.12),\r\n 0 4px 12px rgba(0, 0, 0, 0.08);\r\n z-index: 99999;\r\n opacity: 0;\r\n transform: translateY(-8px) scale(0.96);\r\n pointer-events: none;\r\n transition: all 200ms cubic-bezier(0.4, 0, 0.2, 1);\r\n padding: 12px;\r\n }\r\n .tree-dropdown.open {\r\n opacity: 1;\r\n transform: translateY(0) scale(1);\r\n pointer-events: auto;\r\n }\r\n .tree-dropdown--inline {\r\n position: static;\r\n opacity: 1;\r\n transform: none;\r\n pointer-events: auto;\r\n box-shadow: none;\r\n }\r\n\r\n /* 搜索 */\r\n .tree-search {\r\n padding-bottom: 8px;\r\n margin-bottom: 8px;\r\n border-bottom: 1px solid var(--md-color-border);\r\n }\r\n .tree-search-input {\r\n width: 100%;\r\n padding: 6px 10px;\r\n border: 1px solid var(--md-color-border);\r\n border-radius: var(--md-radius-md);\r\n font-size: var(--md-font-size-sm);\r\n outline: none;\r\n transition: border-color 200ms;\r\n background: var(--md-color-bg);\r\n color: var(--md-color-text);\r\n box-sizing: border-box;\r\n }\r\n .tree-search-input:focus {\r\n border-color: var(--md-color-primary);\r\n }\r\n\r\n /* 树节点 */\r\n .tree-node {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n padding: 7px 10px;\r\n border-radius: var(--md-radius-md);\r\n cursor: pointer;\r\n transition: background 150ms;\r\n user-select: none;\r\n margin: 1px 0;\r\n }\r\n .tree-node:hover:not(.tree-node--disabled) {\r\n background: rgba(0, 122, 255, 0.06);\r\n }\r\n .tree-node--selected {\r\n background: rgba(0, 122, 255, 0.1);\r\n color: var(--md-color-primary);\r\n }\r\n .tree-node--disabled {\r\n opacity: 0.4;\r\n cursor: not-allowed;\r\n }\r\n\r\n .tree-toggle {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 20px;\r\n height: 20px;\r\n border: none;\r\n background: transparent;\r\n cursor: pointer;\r\n color: var(--md-color-text-secondary);\r\n padding: 0;\r\n flex-shrink: 0;\r\n transition: transform 150ms;\r\n border-radius: var(--md-radius-sm);\r\n }\r\n .tree-toggle:hover {\r\n background: rgba(0, 0, 0, 0.04);\r\n color: var(--md-color-text);\r\n }\r\n .tree-toggle--expanded {\r\n transform: rotate(90deg);\r\n }\r\n .tree-toggle--placeholder {\r\n visibility: hidden;\r\n pointer-events: none;\r\n }\r\n\r\n .tree-checkbox {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 18px;\r\n height: 18px;\r\n border: 2px solid var(--md-color-border);\r\n border-radius: 5px;\r\n cursor: pointer;\r\n flex-shrink: 0;\r\n transition: all 150ms;\r\n position: relative;\r\n }\r\n .tree-checkbox:hover {\r\n border-color: var(--md-color-primary);\r\n }\r\n .tree-checkbox--checked {\r\n background: var(--md-color-primary);\r\n border-color: var(--md-color-primary);\r\n }\r\n .tree-checkbox--half {\r\n background: var(--md-color-primary);\r\n border-color: var(--md-color-primary);\r\n }\r\n .tree-checkbox--half::after {\r\n content: '';\r\n display: block;\r\n width: 9px;\r\n height: 2.5px;\r\n background: #fff;\r\n border-radius: 1.5px;\r\n }\r\n .tree-checkbox--checked::after {\r\n content: '';\r\n display: block;\r\n width: 5px;\r\n height: 9px;\r\n border: solid #fff;\r\n border-width: 0 2px 2px 0;\r\n transform: rotate(45deg);\r\n margin-bottom: 2px;\r\n }\r\n\r\n .tree-label {\r\n flex: 1;\r\n font-size: var(--md-font-size-sm);\r\n color: var(--md-color-text);\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n }\r\n .tree-node--selected .tree-label {\r\n color: var(--md-color-primary);\r\n font-weight: 600;\r\n }\r\n\r\n .tree-children {\r\n padding-left: 0;\r\n }\r\n\r\n /* 空状态 */\r\n .tree-empty {\r\n padding: 24px;\r\n text-align: center;\r\n color: var(--md-color-text-secondary);\r\n font-size: var(--md-font-size-sm);\r\n }\r\n\r\n /* 尺寸 */\r\n .tree-trigger--sm {\r\n padding: var(--sm-select-trigger-padding-vertical)\r\n var(--sm-select-trigger-padding-horizontal);\r\n font-size: var(--sm-select-trigger-font-size);\r\n min-height: var(--sm-select-trigger-min-height);\r\n }\r\n .tree-trigger--lg {\r\n padding: var(--lg-select-trigger-padding-vertical)\r\n var(--lg-select-trigger-padding-horizontal);\r\n font-size: var(--lg-select-trigger-font-size);\r\n min-height: var(--lg-select-trigger-min-height);\r\n }\r\n\r\n :host([data-theme='dark']) .tree-clear {\r\n background: rgba(255, 255, 255, 0.1);\r\n }\r\n :host([data-theme='dark']) .tree-clear:hover {\r\n background: rgba(255, 255, 255, 0.15);\r\n }\r\n :host([data-theme='dark']) .tree-tag {\r\n background: var(--md-select-tag-dark-bg);\r\n }\r\n :host([data-theme='dark']) .tree-toggle:hover {\r\n color: var(--md-color-text);\r\n }\r\n :host([data-theme='dark']) .tree-search-input {\r\n background: var(--md-color-bg);\r\n border-color: var(--md-color-border);\r\n color: var(--md-color-text);\r\n }\r\n `,\r\n ]\r\n\r\n @property({ type: Array }) options: TreeOption[] = []\r\n @property() value: string | string[] = ''\r\n @property({ attribute: 'default-value' }) defaultValue: string | string[] = ''\r\n @property() placeholder = 'Select'\r\n @property({ reflect: true }) size?: 'sm' | 'md' | 'lg'\r\n @property({ type: Boolean, reflect: true }) disabled = false\r\n @property({ type: Boolean, reflect: true }) error = false\r\n @property({ type: Boolean, reflect: true }) success = false\r\n @property({ type: Boolean }) clearable = false\r\n @property({ type: Boolean }) multiple = false\r\n @property({ type: Boolean }) searchable = false\r\n @property({ type: Boolean, reflect: true }) panel = false\r\n @property({ type: Boolean, attribute: 'checkable' }) checkable = false\r\n @property({ type: Boolean, attribute: 'default-expand-all' }) defaultExpandAll = false\r\n @property({ attribute: 'search-placeholder' }) searchPlaceholder = 'Search...'\r\n @property({ attribute: 'empty-text' }) emptyText = 'No data'\r\n\r\n @state() private _open = false\r\n @state() private _expandedKeys = new Set<string>()\r\n @state() private _searchQuery = ''\r\n\r\n private get _ctrl() {\r\n return this.hasAttribute('value')\r\n }\r\n private get _resVal(): string | string[] {\r\n return this._ctrl ? this.value : this.defaultValue\r\n }\r\n\r\n override connectedCallback() {\r\n super.connectedCallback()\r\n if (this.defaultExpandAll) {\r\n this._expandAll(this.options)\r\n }\r\n if (!this.panel) document.addEventListener('click', this._onDocClick)\r\n }\r\n\r\n override disconnectedCallback() {\r\n super.disconnectedCallback()\r\n document.removeEventListener('click', this._onDocClick)\r\n }\r\n\r\n private _onDocClick = (e: Event) => {\r\n if (!e.composedPath().includes(this)) this._close()\r\n }\r\n\r\n private _toggle() {\r\n if (this.disabled || this.panel) return\r\n this._open ? this._close() : this._openDropdown()\r\n }\r\n\r\n private _openDropdown() {\r\n this._open = true\r\n }\r\n\r\n private _close() {\r\n if (this.panel) return\r\n this._open = false\r\n this._searchQuery = ''\r\n }\r\n\r\n private _expandAll(opts: TreeOption[]) {\r\n for (const opt of opts) {\r\n if (opt.children && opt.children.length > 0) {\r\n this._expandedKeys.add(opt.value)\r\n this._expandAll(opt.children)\r\n }\r\n }\r\n }\r\n\r\n /* ── Value helpers ── */\r\n private _getSelectedSet(): Set<string> {\r\n const v = this._resVal\r\n if (this.multiple) {\r\n return new Set(Array.isArray(v) ? v : v ? [v] : [])\r\n }\r\n return v ? new Set([v as string]) : new Set()\r\n }\r\n\r\n private _getLabel(value: string): string {\r\n const find = (opts: TreeOption[]): string | undefined => {\r\n for (const opt of opts) {\r\n if (opt.value === value) return opt.label\r\n if (opt.children) {\r\n const found = find(opt.children)\r\n if (found) return found\r\n }\r\n }\r\n return undefined\r\n }\r\n return find(this.options) || value\r\n }\r\n\r\n private _isSelected(value: string): boolean {\r\n return this._getSelectedSet().has(value)\r\n }\r\n\r\n private _getCheckState(opt: TreeOption): CheckState {\r\n const selected = this._getSelectedSet()\r\n if (!opt.children || opt.children.length === 0) {\r\n return selected.has(opt.value) ? 'checked' : 'unchecked'\r\n }\r\n const childrenStates = opt.children.map((c) => this._getCheckState(c))\r\n if (childrenStates.every((s) => s === 'checked')) return 'checked'\r\n if (childrenStates.some((s) => s === 'checked' || s === 'half-checked')) return 'half-checked'\r\n return 'unchecked'\r\n }\r\n\r\n /* ── Selection ── */\r\n private _select(value: string, _label: string) {\r\n if (this.multiple) {\r\n const set = this._getSelectedSet()\r\n if (set.has(value)) {\r\n set.delete(value)\r\n } else {\r\n set.add(value)\r\n }\r\n const arr = Array.from(set)\r\n if (this._ctrl) this._emit(arr)\r\n else {\r\n this.defaultValue = arr\r\n this._emit(arr)\r\n }\r\n } else {\r\n if (this._ctrl) this._emit(value)\r\n else {\r\n this.defaultValue = value\r\n this._emit(value)\r\n }\r\n this._close()\r\n }\r\n }\r\n\r\n private _toggleCheck(opt: TreeOption) {\r\n const state = this._getCheckState(opt)\r\n const shouldCheck = state !== 'checked'\r\n const set = this._getSelectedSet()\r\n\r\n const toggleNode = (o: TreeOption) => {\r\n if (o.disabled) return\r\n if (shouldCheck) {\r\n set.add(o.value)\r\n } else {\r\n set.delete(o.value)\r\n }\r\n if (o.children) {\r\n o.children.forEach(toggleNode)\r\n }\r\n }\r\n\r\n toggleNode(opt)\r\n\r\n const arr = Array.from(set)\r\n if (this._ctrl) this._emit(arr)\r\n else {\r\n this.defaultValue = arr\r\n this._emit(arr)\r\n }\r\n }\r\n\r\n private _removeTag(value: string, e: Event) {\r\n e.stopPropagation()\r\n if (this.multiple) {\r\n const set = this._getSelectedSet()\r\n set.delete(value)\r\n const arr = Array.from(set)\r\n if (this._ctrl) this._emit(arr)\r\n else {\r\n this.defaultValue = arr\r\n this._emit(arr)\r\n }\r\n }\r\n }\r\n\r\n private _clear(e: Event) {\r\n e.stopPropagation()\r\n if (this.multiple) {\r\n if (this._ctrl) this._emit([])\r\n else {\r\n this.defaultValue = []\r\n this._emit([])\r\n }\r\n } else {\r\n if (this._ctrl) this._emit('')\r\n else {\r\n this.defaultValue = ''\r\n this._emit('')\r\n }\r\n }\r\n }\r\n\r\n private _emit(value: string | string[]) {\r\n this.emit('mac-change', { detail: { value } })\r\n }\r\n\r\n /* ── Expand / Collapse ── */\r\n private _toggleExpand(value: string, e: Event) {\r\n e.stopPropagation()\r\n if (this._expandedKeys.has(value)) {\r\n this._expandedKeys.delete(value)\r\n } else {\r\n this._expandedKeys.add(value)\r\n }\r\n this.requestUpdate()\r\n }\r\n\r\n /* ── Search ── */\r\n private _filterOptions(opts: TreeOption[], query: string): TreeOption[] {\r\n const q = query.toLowerCase()\r\n const result: TreeOption[] = []\r\n\r\n for (const opt of opts) {\r\n const matchLabel = opt.label.toLowerCase().includes(q)\r\n const matchValue = opt.value.toLowerCase().includes(q)\r\n const selfMatch = matchLabel || matchValue\r\n\r\n if (!opt.children || opt.children.length === 0) {\r\n if (selfMatch) result.push(opt)\r\n continue\r\n }\r\n\r\n const childMatches = this._filterOptions(opt.children, query)\r\n if (selfMatch || childMatches.length > 0) {\r\n result.push({ ...opt, children: childMatches })\r\n // 筛选时自动展开\r\n this._expandedKeys.add(opt.value)\r\n }\r\n }\r\n\r\n return result\r\n }\r\n\r\n /* ── Keyboard ── */\r\n private _onKey(e: KeyboardEvent) {\r\n if (this.disabled || this.panel) return\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n e.preventDefault()\r\n this._toggle()\r\n }\r\n if (e.key === 'Escape') this._close()\r\n }\r\n\r\n /* ── Render helpers ── */\r\n private _renderNode(opt: TreeOption, depth = 0): ReturnType<typeof html> {\r\n const hasChildren = opt.children && opt.children.length > 0\r\n const expanded = this._expandedKeys.has(opt.value)\r\n const selected = this._isSelected(opt.value)\r\n const checkState = this.multiple && this.checkable ? this._getCheckState(opt) : undefined\r\n const showCheck = this.multiple && this.checkable\r\n\r\n return html`\r\n <div>\r\n <div\r\n class=\"tree-node ${selected ? 'tree-node--selected' : ''} ${\r\n opt.disabled ? 'tree-node--disabled' : ''\r\n }\"\r\n style=\"padding-left: ${depth * 16}px\"\r\n @click=${() => {\r\n if (opt.disabled) return\r\n if (showCheck) {\r\n this._toggleCheck(opt)\r\n } else {\r\n this._select(opt.value, opt.label)\r\n }\r\n }}\r\n >\r\n <button\r\n class=\"tree-toggle ${hasChildren ? '' : 'tree-toggle--placeholder'} ${\r\n expanded ? 'tree-toggle--expanded' : ''\r\n }\"\r\n @click=${hasChildren ? (e: Event) => this._toggleExpand(opt.value, e) : undefined}\r\n tabindex=\"-1\"\r\n type=\"button\"\r\n >\r\n ${\r\n hasChildren\r\n ? html`<svg width=\"12\" height=\"12\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M6 4l4 4-4 4\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" />\r\n </svg>`\r\n : nothing\r\n }\r\n </button>\r\n\r\n ${\r\n showCheck\r\n ? html`\r\n <span\r\n class=\"tree-checkbox ${\r\n checkState === 'checked'\r\n ? 'tree-checkbox--checked'\r\n : checkState === 'half-checked'\r\n ? 'tree-checkbox--half'\r\n : ''\r\n }\"\r\n @click=${(e: Event) => {\r\n e.stopPropagation()\r\n if (!opt.disabled) this._toggleCheck(opt)\r\n }}\r\n ></span>\r\n `\r\n : nothing\r\n }\r\n\r\n <span class=\"tree-label\">${opt.label}</span>\r\n </div>\r\n\r\n ${\r\n hasChildren && expanded\r\n ? html`<div class=\"tree-children\">\r\n ${opt.children!.map((c) => this._renderNode(c, depth + 1))}\r\n </div>`\r\n : nothing\r\n }\r\n </div>\r\n `\r\n }\r\n\r\n private _renderTrigger() {\r\n const val = this._resVal\r\n const hasValue = this.multiple ? Array.isArray(val) && val.length > 0 : val !== ''\r\n const size = this._resolvedSize\r\n\r\n const display = this.multiple\r\n ? Array.isArray(val) && val.length > 0\r\n ? html`\r\n <div class=\"tree-tags\">\r\n ${val.map(\r\n (v) => html`\r\n <span class=\"tree-tag\">\r\n ${this._getLabel(v)}\r\n <button\r\n class=\"tree-tag-remove\"\r\n @click=${(e: Event) => this._removeTag(v, e)}\r\n tabindex=\"-1\"\r\n type=\"button\"\r\n >\r\n ✕\r\n </button>\r\n </span>\r\n `,\r\n )}\r\n </div>\r\n `\r\n : html`<span class=\"tree-placeholder\">${this.placeholder}</span>`\r\n : hasValue\r\n ? html`<span class=\"tree-value\">${this._getLabel(val as string)}</span>`\r\n : html`<span class=\"tree-placeholder\">${this.placeholder}</span>`\r\n\r\n return html`\r\n <div\r\n class=\"tree-trigger tree-trigger--${size} ${this._open ? 'open' : ''} ${\r\n this.error ? 'tree-trigger--error' : ''\r\n } ${this.success ? 'tree-trigger--success' : ''} ${\r\n this.disabled ? 'tree-trigger--disabled' : ''\r\n }\"\r\n part=\"trigger\"\r\n @click=${this._toggle}\r\n @keydown=${this._onKey}\r\n tabindex=${this.disabled ? '-1' : '0'}\r\n role=\"combobox\"\r\n aria-expanded=${this._open}\r\n >\r\n <div class=\"tree-value\">${display}</div>\r\n <div class=\"tree-actions\">\r\n ${\r\n this.clearable && hasValue && !this.disabled\r\n ? html`<button class=\"tree-clear\" @click=${this._clear} tabindex=\"-1\" type=\"button\">\r\n ✕\r\n </button>`\r\n : nothing\r\n }\r\n <span class=\"tree-arrow\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M4 6l4 4 4-4\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" />\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n `\r\n }\r\n\r\n private _renderDropdown() {\r\n const filtered = this._searchQuery\r\n ? this._filterOptions([...this.options], this._searchQuery)\r\n : this.options\r\n\r\n return html`\r\n <div\r\n class=\"tree-dropdown ${this._open ? 'open' : ''} ${\r\n this.panel ? 'tree-dropdown--inline' : ''\r\n }\"\r\n part=\"dropdown\"\r\n >\r\n ${\r\n this.searchable\r\n ? html`\r\n <div class=\"tree-search\">\r\n <input\r\n class=\"tree-search-input\"\r\n type=\"text\"\r\n placeholder=${this.searchPlaceholder}\r\n .value=${this._searchQuery}\r\n @input=${(e: Event) => {\r\n this._searchQuery = (e.target as HTMLInputElement).value\r\n }}\r\n @keydown=${(e: KeyboardEvent) => e.stopPropagation()}\r\n />\r\n </div>\r\n `\r\n : nothing\r\n }\r\n ${\r\n filtered.length === 0\r\n ? html`<div class=\"tree-empty\">${this.emptyText}</div>`\r\n : filtered.map((opt) => this._renderNode(opt))\r\n }\r\n </div>\r\n `\r\n }\r\n\r\n override render() {\r\n return html`\r\n <div class=\"tree-select\" part=\"base\">\r\n ${this.panel ? nothing : this._renderTrigger()} ${this._renderDropdown()}\r\n </div>\r\n `\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'mac-tree-select': MacTreeSelect\r\n }\r\n}\r\n","import { html, css, nothing, type TemplateResult } from 'lit'\r\nimport { property, customElement, state } from 'lit/decorators.js'\r\nimport { BaseElement } from '../../internal/base-element'\r\nimport { sharedStyles } from '../../styles/shared-styles'\r\nimport { themeTokens } from '../../styles/theme'\r\n\r\nexport interface TreeNodeData {\r\n key: string\r\n label: string\r\n disabled?: boolean\r\n children?: TreeNodeData[]\r\n [key: string]: unknown\r\n}\r\n\r\ntype CheckState = 'unchecked' | 'half-checked' | 'checked'\r\n\r\n/**\r\n * @tag mac-tree\r\n * @summary 用于展示层级数据的树形组件。\r\n *\r\n * @csspart node - 树节点行。\r\n * @csspart node-label - 节点标签文本。\r\n * @csspart toggle - 展开/收起切换按钮。\r\n * @csspart checkbox - 复选框元素。\r\n * @csspart children - 子节点容器。\r\n */\r\n@customElement('mac-tree')\r\nexport class MacTree extends BaseElement {\r\n static override styles = [\r\n themeTokens,\r\n sharedStyles,\r\n css`\r\n :host {\r\n display: block;\r\n font-family: var(--md-font-family);\r\n }\r\n\r\n .tree {\r\n list-style: none;\r\n margin: 0;\r\n padding: 0;\r\n }\r\n\r\n .tree-node {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--md-spacing-xs);\r\n padding: var(--md-tree-node-padding);\r\n border-radius: var(--md-radius-md);\r\n cursor: pointer;\r\n transition: background var(--md-transition-fast);\r\n user-select: none;\r\n margin: 1px 0;\r\n }\r\n\r\n .tree-node:hover:not(.tree-node--disabled) {\r\n background: var(--md-tree-node-hover-bg);\r\n }\r\n\r\n .tree-node--selected {\r\n background: var(--md-tree-node-selected-bg);\r\n color: var(--md-tree-node-selected-color);\r\n }\r\n\r\n .tree-node--selected:hover:not(.tree-node--disabled) {\r\n background: var(--md-tree-node-selected-hover-bg);\r\n }\r\n\r\n .tree-node--disabled {\r\n opacity: var(--md-tree-disabled-opacity);\r\n cursor: not-allowed;\r\n }\r\n\r\n /* 切换按钮 */\r\n .tree-toggle {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 20px;\r\n height: 20px;\r\n border: none;\r\n background: transparent;\r\n cursor: pointer;\r\n color: var(--md-color-text-secondary);\r\n padding: 0;\r\n flex-shrink: 0;\r\n transition: transform var(--md-transition-fast);\r\n border-radius: var(--md-radius-sm);\r\n }\r\n\r\n .tree-toggle:hover {\r\n background: rgba(0, 0, 0, 0.04);\r\n color: var(--md-color-text);\r\n }\r\n\r\n .tree-toggle--expanded {\r\n transform: rotate(90deg);\r\n }\r\n\r\n .tree-toggle--placeholder {\r\n visibility: hidden;\r\n pointer-events: none;\r\n }\r\n\r\n /* 复选框 */\r\n .tree-checkbox {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 16px;\r\n height: 16px;\r\n border: 2px solid var(--md-color-border);\r\n border-radius: 4px;\r\n cursor: pointer;\r\n flex-shrink: 0;\r\n transition: all var(--md-transition-fast);\r\n position: relative;\r\n }\r\n\r\n .tree-checkbox:hover {\r\n border-color: var(--md-color-primary);\r\n }\r\n\r\n .tree-checkbox--checked {\r\n background: var(--md-color-primary);\r\n border-color: var(--md-color-primary);\r\n }\r\n\r\n .tree-checkbox--half {\r\n background: var(--md-color-primary);\r\n border-color: var(--md-color-primary);\r\n }\r\n\r\n .tree-checkbox--half::after {\r\n content: '';\r\n display: block;\r\n width: 8px;\r\n height: 2px;\r\n background: #fff;\r\n border-radius: 1px;\r\n }\r\n\r\n .tree-checkbox--checked::after {\r\n content: '';\r\n display: block;\r\n width: 4px;\r\n height: 8px;\r\n border: solid #fff;\r\n border-width: 0 2px 2px 0;\r\n transform: rotate(45deg);\r\n margin-bottom: 1px;\r\n }\r\n\r\n /* 标签 */\r\n .tree-label {\r\n flex: 1;\r\n font-size: var(--md-font-size-base);\r\n color: var(--md-color-text);\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n }\r\n\r\n .tree-node--selected .tree-label {\r\n color: var(--md-tree-node-selected-color);\r\n font-weight: 500;\r\n }\r\n\r\n /* 子节点 */\r\n .tree-children {\r\n list-style: none;\r\n margin: 0;\r\n padding: 0;\r\n padding-left: var(--md-tree-indent);\r\n }\r\n\r\n /* 连接线 */\r\n .tree-line .tree-children {\r\n position: relative;\r\n }\r\n\r\n .tree-line .tree-children::before {\r\n content: '';\r\n position: absolute;\r\n left: 10px;\r\n top: 0;\r\n bottom: 0;\r\n width: 1px;\r\n background: var(--md-color-border);\r\n }\r\n\r\n .tree-line .tree-node {\r\n position: relative;\r\n }\r\n\r\n .tree-line .tree-node::before {\r\n content: '';\r\n position: absolute;\r\n left: -12px;\r\n top: 50%;\r\n width: 10px;\r\n height: 1px;\r\n background: var(--md-color-border);\r\n }\r\n\r\n /* 空状态 */\r\n .tree-empty {\r\n padding: var(--md-spacing-lg);\r\n text-align: center;\r\n color: var(--md-color-text-secondary);\r\n font-size: var(--md-font-size-sm);\r\n }\r\n\r\n /* 深色模式 */\r\n :host([data-theme='dark']) .tree-toggle:hover {\r\n color: var(--md-color-text);\r\n }\r\n\r\n :host([data-theme='dark']) .tree-checkbox {\r\n border-color: var(--md-color-border);\r\n }\r\n `,\r\n ]\r\n\r\n /** 树形数据数组。 */\r\n @property({ type: Array }) data: TreeNodeData[] = []\r\n\r\n /** 当前展开的节点键(受控)。 */\r\n @property({ type: Array }) expandedKeys: string[] = []\r\n\r\n /** 当前选中的节点键(受控)。 */\r\n @property({ type: Array }) selectedKeys: string[] = []\r\n\r\n /** 当前勾选的节点键(受控,用于可勾选模式)。 */\r\n @property({ type: Array }) checkedKeys: string[] = []\r\n\r\n /** 默认展开的节点键(非受控)。 */\r\n @property({ type: Array, attribute: 'default-expanded-keys' }) defaultExpandedKeys: string[] = []\r\n\r\n /** 默认选中的节点键(非受控)。 */\r\n @property({ type: Array, attribute: 'default-selected-keys' }) defaultSelectedKeys: string[] = []\r\n\r\n /** 默认勾选的节点键(非受控)。 */\r\n @property({ type: Array, attribute: 'default-checked-keys' }) defaultCheckedKeys: string[] = []\r\n\r\n /** 是否默认展开所有节点。 */\r\n @property({ type: Boolean, attribute: 'default-expand-all' }) defaultExpandAll = false\r\n\r\n /** 是否显示复选框。 */\r\n @property({ type: Boolean }) checkable = false\r\n\r\n /** 是否允许多选。 */\r\n @property({ type: Boolean }) multiple = false\r\n\r\n /** 节点是否可选中。 */\r\n @property({ type: Boolean }) selectable = true\r\n\r\n /** 是否显示连接线。 */\r\n @property({ type: Boolean, attribute: 'show-line' }) showLine = false\r\n\r\n /** 整行节点是否可点击以进行选择。 */\r\n @property({ type: Boolean, attribute: 'block-node' }) blockNode = true\r\n\r\n /** 无数据时的空文本。 */\r\n @property({ attribute: 'empty-text' }) emptyText = 'No data'\r\n\r\n @state() private _innerExpandedKeys = new Set<string>()\r\n @state() private _innerSelectedKeys = new Set<string>()\r\n @state() private _innerCheckedKeys = new Set<string>()\r\n @state() private _innerHalfCheckedKeys = new Set<string>()\r\n\r\n private _controlledExpanded = false\r\n private _controlledSelected = false\r\n private _controlledChecked = false\r\n\r\n override connectedCallback() {\r\n super.connectedCallback()\r\n this._controlledExpanded = this.hasAttribute('expanded-keys')\r\n this._controlledSelected = this.hasAttribute('selected-keys')\r\n this._controlledChecked = this.hasAttribute('checked-keys')\r\n\r\n // 从默认值初始化\r\n if (this.defaultExpandAll) {\r\n this._expandAll(this.data)\r\n } else if (this.defaultExpandedKeys.length > 0) {\r\n this._innerExpandedKeys = new Set(this.defaultExpandedKeys)\r\n }\r\n if (this.defaultSelectedKeys.length > 0) {\r\n this._innerSelectedKeys = new Set(this.defaultSelectedKeys)\r\n }\r\n if (this.defaultCheckedKeys.length > 0) {\r\n this._innerCheckedKeys = new Set(this.defaultCheckedKeys)\r\n this._updateHalfCheckedKeys()\r\n }\r\n }\r\n\r\n override willUpdate(changedProps: Map<string, unknown>) {\r\n super.willUpdate(changedProps)\r\n if (this._controlledExpanded && changedProps.has('expandedKeys')) {\r\n this._innerExpandedKeys = new Set(this.expandedKeys)\r\n }\r\n if (this._controlledSelected && changedProps.has('selectedKeys')) {\r\n this._innerSelectedKeys = new Set(this.selectedKeys)\r\n }\r\n if (this._controlledChecked && changedProps.has('checkedKeys')) {\r\n this._innerCheckedKeys = new Set(this.checkedKeys)\r\n this._updateHalfCheckedKeys()\r\n }\r\n }\r\n\r\n /* ── 键获取器 ── */\r\n private get _expanded(): Set<string> {\r\n return this._controlledExpanded ? new Set(this.expandedKeys) : this._innerExpandedKeys\r\n }\r\n\r\n private get _selected(): Set<string> {\r\n return this._controlledSelected ? new Set(this.selectedKeys) : this._innerSelectedKeys\r\n }\r\n\r\n private get _checked(): Set<string> {\r\n return this._controlledChecked ? new Set(this.checkedKeys) : this._innerCheckedKeys\r\n }\r\n\r\n /* ── 树辅助方法 ── */\r\n private _expandAll(nodes: TreeNodeData[]) {\r\n for (const node of nodes) {\r\n if (node.children && node.children.length > 0) {\r\n this._innerExpandedKeys.add(node.key)\r\n this._expandAll(node.children)\r\n }\r\n }\r\n }\r\n\r\n private _findNode(key: string, nodes: TreeNodeData[]): TreeNodeData | undefined {\r\n for (const node of nodes) {\r\n if (node.key === key) return node\r\n if (node.children) {\r\n const found = this._findNode(key, node.children)\r\n if (found) return found\r\n }\r\n }\r\n return undefined\r\n }\r\n\r\n private _getParentKey(\r\n key: string,\r\n nodes: TreeNodeData[],\r\n parentKey?: string,\r\n ): string | undefined {\r\n for (const node of nodes) {\r\n if (node.key === key) return parentKey\r\n if (node.children) {\r\n const found = this._getParentKey(key, node.children, node.key)\r\n if (found !== undefined) return found\r\n }\r\n }\r\n return undefined\r\n }\r\n\r\n /* ── 勾选状态 ── */\r\n private _getCheckState(node: TreeNodeData): CheckState {\r\n const checked = this._checked\r\n if (!node.children || node.children.length === 0) {\r\n return checked.has(node.key) ? 'checked' : 'unchecked'\r\n }\r\n const childStates = node.children.map((c) => this._getCheckState(c))\r\n if (childStates.every((s) => s === 'checked')) return 'checked'\r\n if (childStates.some((s) => s === 'checked' || s === 'half-checked')) return 'half-checked'\r\n return 'unchecked'\r\n }\r\n\r\n private _updateHalfCheckedKeys() {\r\n const half = new Set<string>()\r\n const walk = (nodes: TreeNodeData[]) => {\r\n for (const node of nodes) {\r\n if (node.children && node.children.length > 0) {\r\n const state = this._getCheckState(node)\r\n if (state === 'half-checked') {\r\n half.add(node.key)\r\n }\r\n walk(node.children)\r\n }\r\n }\r\n }\r\n walk(this.data)\r\n this._innerHalfCheckedKeys = half\r\n }\r\n\r\n /* ── 操作 ── */\r\n private _toggleExpand(key: string) {\r\n const node = this._findNode(key, this.data)\r\n if (!node) return\r\n\r\n const expanded = this._expanded\r\n const isExpanding = !expanded.has(key)\r\n\r\n if (!this._controlledExpanded) {\r\n if (isExpanding) {\r\n this._innerExpandedKeys.add(key)\r\n } else {\r\n this._innerExpandedKeys.delete(key)\r\n }\r\n this.requestUpdate()\r\n }\r\n\r\n const newExpanded = isExpanding\r\n ? new Set([...expanded, key])\r\n : new Set([...expanded].filter((k) => k !== key))\r\n\r\n this.emit('mac-expand', {\r\n detail: {\r\n key,\r\n expanded: isExpanding,\r\n expandedKeys: Array.from(newExpanded),\r\n node,\r\n },\r\n })\r\n }\r\n\r\n private _toggleSelect(key: string) {\r\n const node = this._findNode(key, this.data)\r\n if (!node || node.disabled) return\r\n\r\n const selected = this._selected\r\n const isSelected = selected.has(key)\r\n\r\n if (!this._controlledSelected) {\r\n if (this.multiple) {\r\n if (isSelected) {\r\n this._innerSelectedKeys.delete(key)\r\n } else {\r\n this._innerSelectedKeys.add(key)\r\n }\r\n } else {\r\n this._innerSelectedKeys = isSelected ? new Set() : new Set([key])\r\n }\r\n this.requestUpdate()\r\n }\r\n\r\n const newSelected = this.multiple\r\n ? isSelected\r\n ? new Set([...selected].filter((k) => k !== key))\r\n : new Set([...selected, key])\r\n : isSelected\r\n ? new Set<string>()\r\n : new Set([key])\r\n\r\n this.emit('mac-select', {\r\n detail: {\r\n key,\r\n selected: !isSelected,\r\n selectedKeys: Array.from(newSelected),\r\n node,\r\n },\r\n })\r\n }\r\n\r\n private _toggleCheck(key: string) {\r\n const node = this._findNode(key, this.data)\r\n if (!node || node.disabled) return\r\n\r\n const checked = this._checked\r\n const shouldCheck = !checked.has(key)\r\n\r\n if (!this._controlledChecked) {\r\n const newChecked = new Set(checked)\r\n const toggleNode = (n: TreeNodeData) => {\r\n if (n.disabled) return\r\n if (shouldCheck) {\r\n newChecked.add(n.key)\r\n } else {\r\n newChecked.delete(n.key)\r\n }\r\n if (n.children) {\r\n n.children.forEach(toggleNode)\r\n }\r\n }\r\n toggleNode(node)\r\n\r\n // 更新祖先节点\r\n const updateAncestor = (childKey: string) => {\r\n const parentKey = this._getParentKey(childKey, this.data)\r\n if (!parentKey) return\r\n const parent = this._findNode(parentKey, this.data)\r\n if (!parent || !parent.children) return\r\n\r\n const allChecked = parent.children.every((c) => c.disabled || newChecked.has(c.key))\r\n\r\n if (allChecked) {\r\n newChecked.add(parentKey)\r\n } else {\r\n newChecked.delete(parentKey)\r\n }\r\n\r\n updateAncestor(parentKey)\r\n }\r\n\r\n updateAncestor(key)\r\n\r\n this._innerCheckedKeys = newChecked\r\n this._updateHalfCheckedKeys()\r\n this.requestUpdate()\r\n }\r\n\r\n const newChecked = this._controlledChecked ? checked : this._innerCheckedKeys\r\n\r\n this.emit('mac-check', {\r\n detail: {\r\n key,\r\n checked: shouldCheck,\r\n checkedKeys: Array.from(newChecked),\r\n halfCheckedKeys: Array.from(this._innerHalfCheckedKeys),\r\n node,\r\n },\r\n })\r\n }\r\n\r\n /* ── 渲染 ── */\r\n private _renderToggle(node: TreeNodeData, expanded: boolean) {\r\n const hasChildren = node.children && node.children.length > 0\r\n return html`\r\n <button\r\n class=\"tree-toggle ${hasChildren ? '' : 'tree-toggle--placeholder'} ${\r\n expanded ? 'tree-toggle--expanded' : ''\r\n }\"\r\n part=\"toggle\"\r\n @click=${\r\n hasChildren\r\n ? (e: Event) => {\r\n e.stopPropagation()\r\n this._toggleExpand(node.key)\r\n }\r\n : undefined\r\n }\r\n tabindex=\"-1\"\r\n type=\"button\"\r\n >\r\n ${\r\n hasChildren\r\n ? html`<svg width=\"12\" height=\"12\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M6 4l4 4-4 4\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" />\r\n </svg>`\r\n : nothing\r\n }\r\n </button>\r\n `\r\n }\r\n\r\n private _renderCheckbox(node: TreeNodeData) {\r\n const state = this._getCheckState(node)\r\n const className =\r\n state === 'checked'\r\n ? 'tree-checkbox--checked'\r\n : state === 'half-checked'\r\n ? 'tree-checkbox--half'\r\n : ''\r\n\r\n return html`\r\n <span\r\n class=\"tree-checkbox ${className}\"\r\n part=\"checkbox\"\r\n @click=${(e: Event) => {\r\n e.stopPropagation()\r\n this._toggleCheck(node.key)\r\n }}\r\n ></span>\r\n `\r\n }\r\n\r\n private _renderNode(node: TreeNodeData, depth = 0): TemplateResult | typeof nothing {\r\n const expanded = this._expanded.has(node.key)\r\n const selected = this._selected.has(node.key)\r\n const hasChildren = node.children && node.children.length > 0\r\n\r\n const onNodeClick = () => {\r\n if (node.disabled) return\r\n if (this.checkable && this.blockNode) {\r\n this._toggleCheck(node.key)\r\n } else if (this.selectable) {\r\n this._toggleSelect(node.key)\r\n }\r\n }\r\n\r\n return html`\r\n <li>\r\n <div\r\n class=\"tree-node ${selected ? 'tree-node--selected' : ''} ${\r\n node.disabled ? 'tree-node--disabled' : ''\r\n }\"\r\n part=\"node\"\r\n @click=${onNodeClick}\r\n >\r\n ${this._renderToggle(node, expanded)}\r\n ${this.checkable ? this._renderCheckbox(node) : nothing}\r\n <span class=\"tree-label\" part=\"node-label\">${node.label}</span>\r\n </div>\r\n ${\r\n hasChildren && expanded\r\n ? html`\r\n <ul class=\"tree-children\" part=\"children\">\r\n ${node.children!.map((child) => this._renderNode(child, depth + 1))}\r\n </ul>\r\n `\r\n : nothing\r\n }\r\n </li>\r\n `\r\n }\r\n\r\n override render() {\r\n if (!this.data || this.data.length === 0) {\r\n return html`<div class=\"tree-empty\">${this.emptyText}</div>`\r\n }\r\n\r\n return html`\r\n <ul class=\"tree ${this.showLine ? 'tree-line' : ''}\" part=\"base\">\r\n ${this.data.map((node) => this._renderNode(node))}\r\n </ul>\r\n `\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'mac-tree': MacTree\r\n }\r\n}\r\n","import { html, css } from 'lit'\r\nimport { property, customElement } from 'lit/decorators.js'\r\nimport { BaseElement } from '../../internal/base-element'\r\nimport { sharedStyles } from '../../styles/shared-styles'\r\nimport { themeTokens } from '../../styles/theme'\r\n\r\n/**\r\n * @tag mac-desktop-icon\r\n * @summary 带有选中状态的 macOS 风格桌面图标。\r\n *\r\n * @slot - 图标的视觉内容(图片、svg 等)。\r\n *\r\n * @csspart base - 图标的基础容器。\r\n * @csspart icon - 图标图像区域。\r\n * @csspart label - 标签文本区域。\r\n *\r\n * @event mac-icon-dblclick - 双击时触发。Detail: { iconId }\r\n */\r\n@customElement('mac-desktop-icon')\r\nexport class MacDesktopIcon extends BaseElement {\r\n /** 自增计数器,用于为未指定 iconId 的图标自动生成唯一标识 */\r\n private static _autoIdCounter = 0\r\n\r\n static override styles = [\r\n themeTokens,\r\n sharedStyles,\r\n css`\r\n :host {\r\n display: inline-flex;\r\n flex-direction: column;\r\n align-items: center;\r\n width: var(--md-icon-wrapper-width);\r\n cursor: default;\r\n user-select: none;\r\n -webkit-user-select: none;\r\n position: absolute;\r\n z-index: 1;\r\n }\r\n\r\n :host([selected]) {\r\n z-index: 2;\r\n }\r\n\r\n :host([dragging]) {\r\n z-index: 100;\r\n }\r\n\r\n .icon-wrapper {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n gap: var(--md-spacing-xs);\r\n padding: 6px var(--md-spacing-xs);\r\n border-radius: var(--md-radius-lg);\r\n transition:\r\n background-color var(--md-transition-fast),\r\n box-shadow var(--md-transition-fast);\r\n width: 100%;\r\n cursor: pointer;\r\n }\r\n\r\n :host(:hover) .icon-wrapper {\r\n background-color: rgba(255, 255, 255, var(--md-opacity-hover));\r\n }\r\n\r\n :host([selected]) .icon-wrapper {\r\n background-color: var(--md-mac-selection);\r\n box-shadow: inset 0 0 0 0.5px var(--md-mac-selection-border);\r\n }\r\n\r\n :host([dragging]) .icon-wrapper {\r\n background-color: var(--md-mac-selection-rect-inner);\r\n box-shadow: var(--md-shadow-desktop-icon-drag);\r\n }\r\n\r\n .icon-image {\r\n width: var(--md-icon-size-desktop);\r\n height: var(--md-icon-size-desktop);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n border-radius: var(--md-radius-icon-lg);\r\n overflow: hidden;\r\n filter: drop-shadow(var(--md-shadow-icon));\r\n transition: transform var(--md-transition-magnify);\r\n }\r\n\r\n :host(:active) .icon-image {\r\n transform: scale(0.9);\r\n }\r\n\r\n :host([dragging]) .icon-image {\r\n transform: scale(1.04);\r\n filter: drop-shadow(var(--md-shadow-icon-drag));\r\n }\r\n\r\n .icon-image ::slotted(img) {\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n border-radius: var(--md-radius-icon-lg);\r\n }\r\n\r\n .icon-image ::slotted(svg) {\r\n width: 100%;\r\n height: 100%;\r\n }\r\n\r\n .icon-label {\r\n font-family: var(--md-font-family);\r\n font-size: var(--md-font-size-xs);\r\n line-height: 1.35;\r\n text-align: center;\r\n letter-spacing: 0.01em;\r\n color: var(--md-mac-text-white-soft);\r\n max-width: 76px;\r\n word-wrap: break-word;\r\n overflow-wrap: break-word;\r\n text-shadow: var(--md-text-shadow-label);\r\n padding: 1px 5px;\r\n border-radius: var(--md-radius-sm);\r\n transition: all var(--md-transition-fast);\r\n }\r\n\r\n :host([selected]) .icon-label {\r\n background-color: var(--md-mac-selection-label-bg);\r\n color: var(--md-mac-text-white);\r\n text-shadow: var(--md-text-shadow-none);\r\n box-shadow: 0 1px 3px rgba(0, 122, 255, 0.3);\r\n }\r\n\r\n .default-icon {\r\n width: var(--md-icon-size-desktop);\r\n height: var(--md-icon-size-desktop);\r\n border-radius: var(--md-radius-icon-lg);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n font-size: var(--md-font-size-icon-lg);\r\n color: var(--md-mac-text-white);\r\n font-weight: 600;\r\n background: var(--icon-color, var(--md-color-primary));\r\n box-shadow:\r\n inset 0 1px 0 var(--md-icon-inset-top-soft),\r\n inset 0 -1px 0 var(--md-icon-inset-bottom-soft),\r\n 0 1px 3px rgba(0, 0, 0, 0.12);\r\n }\r\n `,\r\n ]\r\n\r\n /** 图标标签文本 */\r\n @property({ reflect: true }) label = ''\r\n\r\n /** 图标标识符 */\r\n @property({ reflect: true }) iconId = ''\r\n\r\n /** 图标是否被选中 */\r\n @property({ type: Boolean, reflect: true }) selected = false\r\n\r\n /** 图标是否正在被拖拽 */\r\n @property({ type: Boolean, reflect: true }) dragging = false\r\n\r\n /** 图标 X 坐标 */\r\n @property({ type: Number }) x = 0\r\n\r\n /** 图标 Y 坐标 */\r\n @property({ type: Number }) y = 0\r\n\r\n /** 默认占位符的图标颜色 */\r\n @property({ reflect: true }) color = '#007AFF'\r\n\r\n private _clickTimer: ReturnType<typeof setTimeout> | null = null\r\n private _clickCount = 0\r\n\r\n override connectedCallback(): void {\r\n super.connectedCallback()\r\n // 若未指定 iconId,自动生成唯一标识,避免多个图标共享空字符串导致选择/拖动异常\r\n if (!this.iconId) {\r\n this.iconId = `__auto_${MacDesktopIcon._autoIdCounter++}`\r\n }\r\n this.style.position = 'absolute'\r\n this._updatePosition()\r\n }\r\n\r\n override updated(changed: Map<string, unknown>): void {\r\n if (changed.has('x') || changed.has('y')) {\r\n this._updatePosition()\r\n }\r\n }\r\n\r\n private _updatePosition(): void {\r\n this.style.left = `${this.x}px`\r\n this.style.top = `${this.y}px`\r\n }\r\n\r\n override render() {\r\n return html`\r\n <div\r\n class=\"icon-wrapper\"\r\n part=\"base\"\r\n @mousedown=${this._handleMouseDown}\r\n @touchstart=${this._handleTouchStart}\r\n >\r\n <div class=\"icon-image\" part=\"icon\">\r\n <slot>\r\n <div\r\n class=\"default-icon\"\r\n style=\"--icon-color: ${this.color}; background: var(--icon-color)\"\r\n >\r\n ${this.label ? this.label.charAt(0).toUpperCase() : '?'}\r\n </div>\r\n </slot>\r\n </div>\r\n <span class=\"icon-label\" part=\"label\">${this.label}</span>\r\n </div>\r\n `\r\n }\r\n\r\n private _handleMouseDown(e: MouseEvent): void {\r\n if (e.button !== 0) return\r\n // 不阻止冒泡,让桌面组件通过 composedPath() 识别图标\r\n e.preventDefault()\r\n\r\n this._handleClick()\r\n }\r\n\r\n private _handleTouchStart(e: TouchEvent): void {\r\n if (e.touches.length !== 1) return\r\n e.preventDefault()\r\n\r\n this._handleClick()\r\n }\r\n\r\n private _handleClick(): void {\r\n this._clickCount++\r\n if (this._clickCount === 1) {\r\n this._clickTimer = setTimeout(() => {\r\n this._clickCount = 0\r\n }, 350)\r\n } else if (this._clickCount === 2) {\r\n if (this._clickTimer) clearTimeout(this._clickTimer)\r\n this._clickCount = 0\r\n this.emit('mac-icon-dblclick', {\r\n detail: { iconId: this.iconId },\r\n })\r\n }\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'mac-desktop-icon': MacDesktopIcon\r\n }\r\n}\r\n","import { html, css } from 'lit'\r\nimport { property, customElement, query } from 'lit/decorators.js'\r\nimport { BaseElement } from '../../internal/base-element'\r\nimport { sharedStyles } from '../../styles/shared-styles'\r\nimport { themeTokens } from '../../styles/theme'\r\nimport type { MacDesktopIcon } from '../desktop-icon/mac-desktop-icon'\r\n\r\nexport interface DesktopIconData {\r\n id: string\r\n label: string\r\n color?: string\r\n x?: number\r\n y?: number\r\n iconSrc?: string\r\n}\r\n\r\n/**\r\n * @tag mac-desktop\r\n * @summary 带有图标布局、拖拽管理和集成 Dock 的 macOS 风格桌面容器。\r\n *\r\n * @slot - 用于放置 mac-desktop-icon 元素的默认插槽。\r\n * @slot wallpaper - 自定义壁纸内容。\r\n * @slot dock - Dock 栏内容(mac-dock-item 元素)。\r\n *\r\n * @csspart base - 桌面基础容器。\r\n * @csspart wallpaper - 壁纸层。\r\n * @csspart dock - Dock 容器区域。\r\n *\r\n * @event mac-layout-change - 布局模式变化时触发。\r\n * @event mac-icons-reorder - 图标重新排序时触发。\r\n */\r\n@customElement('mac-desktop')\r\nexport class MacDesktop extends BaseElement {\r\n static override styles = [\r\n themeTokens,\r\n sharedStyles,\r\n css`\r\n :host {\r\n display: block;\r\n position: relative;\r\n width: 100%;\r\n height: 100%;\r\n overflow: hidden;\r\n }\r\n\r\n .desktop {\r\n position: relative;\r\n width: 100%;\r\n height: 100%;\r\n background-size: cover;\r\n background-position: center;\r\n border-radius: var(--md-radius-lg);\r\n overflow: hidden;\r\n display: flex;\r\n flex-direction: column;\r\n }\r\n\r\n .desktop-wallpaper {\r\n position: absolute;\r\n inset: 0;\r\n z-index: 0;\r\n }\r\n\r\n .desktop-wallpaper ::slotted(*) {\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n }\r\n\r\n .desktop-icons {\r\n position: relative;\r\n z-index: 1;\r\n flex: 1;\r\n width: 100%;\r\n }\r\n\r\n /* ─── Dock 区域 ─── */\r\n\r\n .desktop-dock {\r\n position: relative;\r\n z-index: 100;\r\n display: flex;\r\n justify-content: center;\r\n padding-bottom: var(--md-dock-dock-bottom);\r\n flex-shrink: 0;\r\n }\r\n\r\n .desktop-dock ::slotted(mac-dock) {\r\n width: auto;\r\n }\r\n\r\n /* ─── 选择框(液态玻璃) ─── */\r\n\r\n .selection-rect {\r\n position: absolute;\r\n border: 0.5px solid var(--md-mac-selection-rect-border);\r\n background: var(--md-mac-selection-rect-bg);\r\n backdrop-filter: blur(2px) saturate(120%);\r\n -webkit-backdrop-filter: blur(2px) saturate(120%);\r\n border-radius: var(--md-radius-sm);\r\n z-index: 50;\r\n pointer-events: none;\r\n display: none;\r\n box-shadow: inset 0 0 0 0.5px var(--md-mac-selection-rect-inner);\r\n }\r\n\r\n .selection-rect.active {\r\n display: block;\r\n }\r\n\r\n /* ─── 右键菜单(液态玻璃) ─── */\r\n\r\n .context-menu {\r\n position: absolute;\r\n z-index: 200;\r\n min-width: 220px;\r\n background: var(--md-glass-menu-bg);\r\n backdrop-filter: blur(var(--md-glass-blur)) saturate(var(--md-glass-saturate));\r\n -webkit-backdrop-filter: blur(var(--md-glass-blur)) saturate(var(--md-glass-saturate));\r\n border-radius: var(--md-dock-container-radius);\r\n padding: var(--md-dock-container-padding);\r\n box-shadow:\r\n var(--md-shadow-menu),\r\n inset 0 0 0 0.5px var(--md-glass-menu-border),\r\n inset 0 1px 0 var(--md-glass-menu-highlight);\r\n font-family: var(--md-font-family);\r\n font-size: var(--md-font-size-menu);\r\n color: var(--md-mac-text-primary);\r\n display: none;\r\n letter-spacing: -0.01em;\r\n }\r\n\r\n .context-menu.visible {\r\n display: block;\r\n }\r\n\r\n .context-menu-item {\r\n padding: var(--md-spacing-xs) 14px;\r\n cursor: default;\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: var(--md-dock-container-gap);\r\n border-radius: var(--md-dock-container-radius);\r\n margin: 0 var(--md-spacing-xs);\r\n transition:\r\n background-color var(--md-transition-menu),\r\n color var(--md-transition-menu);\r\n }\r\n\r\n .context-menu-item:hover {\r\n background: var(--md-dock-item-hover-bg);\r\n color: var(--md-dock-item-hover-color);\r\n box-shadow: var(--md-dock-item-hover-shadow);\r\n }\r\n\r\n .context-menu-item .shortcut {\r\n font-size: var(--md-font-size-sm);\r\n opacity: var(--md-opacity-shortcut);\r\n font-family: var(--md-font-family);\r\n }\r\n\r\n .context-menu-item:hover .shortcut {\r\n opacity: var(--md-opacity-shortcut-hover);\r\n color: rgba(255, 255, 255, 0.85);\r\n }\r\n\r\n .context-menu-separator {\r\n height: var(--md-dock-separator-width);\r\n background: var(--md-dock-separator-color);\r\n margin: var(--md-dock-separator-margin);\r\n }\r\n `,\r\n ]\r\n\r\n /** 布局模式 */\r\n @property({ reflect: true }) layout: 'vertical' | 'horizontal' = 'vertical'\r\n\r\n /** 网格单元大小,单位为像素 */\r\n @property({ type: Number }) cellSize = 90\r\n\r\n /** 网格间距,单位为像素 */\r\n @property({ type: Number }) spacing = 8\r\n\r\n /** 桌面边缘内边距 */\r\n @property({ type: Number }) padding = 16\r\n\r\n /** 壁纸图片 URL */\r\n @property({ reflect: true }) wallpaper = ''\r\n\r\n /** 是否显示 Dock */\r\n @property({ type: Boolean, reflect: true }) showDock = true\r\n\r\n @query('.selection-rect')\r\n private _selectionRect!: HTMLDivElement\r\n\r\n @query('.context-menu')\r\n private _contextMenu!: HTMLDivElement\r\n\r\n @query('.desktop-icons')\r\n private _desktopIcons!: HTMLDivElement\r\n\r\n // 选择状态\r\n private _selectedIds: Set<string> = new Set()\r\n\r\n // 选择框状态\r\n private _isSelecting = false\r\n private _selStartX = 0\r\n private _selStartY = 0\r\n\r\n // 拖拽状态\r\n private _isDragging = false\r\n private _draggingIcons: Map<MacDesktopIcon, { startX: number; startY: number }> = new Map()\r\n private _dragPointerStartX = 0\r\n private _dragPointerStartY = 0\r\n private _hasDragMoved = false\r\n private _dragCleanup: (() => void) | null = null\r\n\r\n // 选择拖拽清理\r\n private _selDragCleanup: (() => void) | null = null\r\n\r\n override firstUpdated(): void {\r\n this._arrangeIcons()\r\n }\r\n\r\n override updated(changed: Map<string, unknown>): void {\r\n if (changed.has('layout')) {\r\n this._arrangeIcons()\r\n }\r\n }\r\n\r\n private _getIconElements(): MacDesktopIcon[] {\r\n return Array.from(this.querySelectorAll('mac-desktop-icon')) as MacDesktopIcon[]\r\n }\r\n\r\n /**\r\n * 通过 composedPath 在事件路径中查找 mac-desktop-icon 元素。\r\n * 这是跨越 Shadow DOM 边界识别事件目标的最可靠方式。\r\n */\r\n private _findIconInComposedPath(path: EventTarget[]): MacDesktopIcon | null {\r\n for (const target of path) {\r\n if (target instanceof HTMLElement && target.tagName === 'MAC-DESKTOP-ICON') {\r\n return target as MacDesktopIcon\r\n }\r\n }\r\n return null\r\n }\r\n\r\n /** 根据当前布局模式排列图标 */\r\n private _arrangeIcons(): void {\r\n const icons = this._getIconElements()\r\n if (icons.length === 0) return\r\n\r\n const desktopRect = this._desktopIcons?.getBoundingClientRect()\r\n if (!desktopRect || desktopRect.width === 0) return\r\n\r\n const { width, height } = desktopRect\r\n const { cellSize, spacing, padding } = this\r\n\r\n if (this.layout === 'vertical') {\r\n const maxPerCol = Math.floor((height - padding * 2 + spacing) / (cellSize + spacing))\r\n icons.forEach((icon, i) => {\r\n const col = Math.floor(i / maxPerCol)\r\n const row = i % maxPerCol\r\n icon.x = padding + col * (cellSize + spacing)\r\n icon.y = padding + row * (cellSize + spacing)\r\n })\r\n } else {\r\n const maxPerRow = Math.floor((width - padding * 2 + spacing) / (cellSize + spacing))\r\n icons.forEach((icon, i) => {\r\n const row = Math.floor(i / maxPerRow)\r\n const col = i % maxPerRow\r\n icon.x = padding + col * (cellSize + spacing)\r\n icon.y = padding + row * (cellSize + spacing)\r\n })\r\n }\r\n\r\n this.emit('mac-icons-reorder', { detail: { layout: this.layout } })\r\n }\r\n\r\n // ─── 选择 ───\r\n\r\n private _selectIcon(iconId: string, additive: boolean): void {\r\n if (!additive) {\r\n this._selectedIds.clear()\r\n }\r\n this._selectedIds.add(iconId)\r\n this._applySelection()\r\n }\r\n\r\n private _deselectAll(): void {\r\n this._selectedIds.clear()\r\n this._applySelection()\r\n }\r\n\r\n private _applySelection(): void {\r\n this._getIconElements().forEach((icon) => {\r\n icon.selected = this._selectedIds.has(icon.iconId)\r\n })\r\n }\r\n\r\n // ─── 选择框 ───\r\n\r\n private _startSelection(clientX: number, clientY: number): void {\r\n const rect = this._desktopIcons.getBoundingClientRect()\r\n this._isSelecting = true\r\n this._selStartX = clientX - rect.left\r\n this._selStartY = clientY - rect.top\r\n this._selectionRect.classList.add('active')\r\n this._updateSelectionRect(this._selStartX, this._selStartY, 0, 0)\r\n }\r\n\r\n private _updateSelectionRect(x: number, y: number, w: number, h: number): void {\r\n const sr = this._selectionRect\r\n sr.style.left = `${x}px`\r\n sr.style.top = `${y}px`\r\n sr.style.width = `${w}px`\r\n sr.style.height = `${h}px`\r\n }\r\n\r\n private _endSelection(): void {\r\n this._isSelecting = false\r\n this._selectionRect.classList.remove('active')\r\n }\r\n\r\n private _checkSelectionOverlap(sx: number, sy: number, sw: number, sh: number): void {\r\n const desktopRect = this._desktopIcons.getBoundingClientRect()\r\n this._getIconElements().forEach((icon) => {\r\n const iconRect = icon.getBoundingClientRect()\r\n const ix = iconRect.left - desktopRect.left\r\n const iy = iconRect.top - desktopRect.top\r\n const iw = iconRect.width\r\n const ih = iconRect.height\r\n\r\n const overlaps = ix < sx + sw && ix + iw > sx && iy < sy + sh && iy + ih > sy\r\n if (overlaps) {\r\n this._selectedIds.add(icon.iconId)\r\n } else {\r\n this._selectedIds.delete(icon.iconId)\r\n }\r\n })\r\n this._applySelection()\r\n }\r\n\r\n // ─── 图标拖拽 ───\r\n\r\n private _startIconDrag(clickedIcon: MacDesktopIcon, clientX: number, clientY: number): void {\r\n const iconId = clickedIcon.iconId\r\n\r\n if (!this._selectedIds.has(iconId)) {\r\n this._selectIcon(iconId, false)\r\n }\r\n\r\n this._draggingIcons.clear()\r\n this._isDragging = true\r\n this._hasDragMoved = false\r\n this._dragPointerStartX = clientX\r\n this._dragPointerStartY = clientY\r\n\r\n this._getIconElements().forEach((icon) => {\r\n if (this._selectedIds.has(icon.iconId)) {\r\n this._draggingIcons.set(icon, { startX: icon.x, startY: icon.y })\r\n }\r\n })\r\n\r\n const onMove = (ev: MouseEvent | TouchEvent) => {\r\n ev.preventDefault()\r\n const cx = 'touches' in ev ? ev.touches[0].clientX : ev.clientX\r\n const cy = 'touches' in ev ? ev.touches[0].clientY : ev.clientY\r\n const dx = cx - this._dragPointerStartX\r\n const dy = cy - this._dragPointerStartY\r\n\r\n if (!this._hasDragMoved && (Math.abs(dx) > 3 || Math.abs(dy) > 3)) {\r\n this._hasDragMoved = true\r\n this._draggingIcons.forEach((_pos, icon) => {\r\n icon.dragging = true\r\n })\r\n }\r\n\r\n if (this._hasDragMoved) {\r\n this._draggingIcons.forEach((startPos, icon) => {\r\n icon.x = Math.max(0, startPos.startX + dx)\r\n icon.y = Math.max(0, startPos.startY + dy)\r\n })\r\n }\r\n }\r\n\r\n const onUp = () => {\r\n document.removeEventListener('mousemove', onMove)\r\n document.removeEventListener('mouseup', onUp)\r\n document.removeEventListener('touchmove', onMove)\r\n document.removeEventListener('touchend', onUp)\r\n\r\n this._draggingIcons.forEach((_pos, icon) => {\r\n icon.dragging = false\r\n })\r\n\r\n this._isDragging = false\r\n this._draggingIcons.clear()\r\n this._dragCleanup = null\r\n }\r\n\r\n document.addEventListener('mousemove', onMove)\r\n document.addEventListener('mouseup', onUp)\r\n document.addEventListener('touchmove', onMove, { passive: false })\r\n document.addEventListener('touchend', onUp)\r\n\r\n this._dragCleanup = onUp\r\n }\r\n\r\n // ─── 右键菜单 ───\r\n\r\n private _showContextMenu(x: number, y: number): void {\r\n const menu = this._contextMenu\r\n const container = this._desktopIcons\r\n const containerRect = container.getBoundingClientRect()\r\n\r\n menu.classList.add('visible')\r\n\r\n // 边界检测:菜单显示后再测量实际尺寸\r\n const menuRect = menu.getBoundingClientRect()\r\n const menuW = menuRect.width\r\n const menuH = menuRect.height\r\n const containerW = containerRect.width\r\n const containerH = containerRect.height\r\n\r\n // 右边溢出\r\n if (x + menuW > containerW) {\r\n x = containerW - menuW - 4\r\n }\r\n // 左边溢出\r\n if (x < 4) {\r\n x = 4\r\n }\r\n // 下边溢出\r\n if (y + menuH > containerH) {\r\n y = y - menuH\r\n }\r\n // 上边溢出\r\n if (y < 4) {\r\n y = 4\r\n }\r\n\r\n menu.style.left = `${x}px`\r\n menu.style.top = `${y}px`\r\n }\r\n\r\n private _hideContextMenu(): void {\r\n this._contextMenu.classList.remove('visible')\r\n }\r\n\r\n // ─── 渲染 ───\r\n\r\n override render() {\r\n return html`\r\n <div class=\"desktop\" part=\"base\" @contextmenu=${this._onContextMenu}>\r\n <div class=\"desktop-wallpaper\" part=\"wallpaper\">\r\n ${\r\n this.wallpaper\r\n ? html`<img\r\n src=\"${this.wallpaper}\"\r\n alt=\"\"\r\n style=\"width:100%;height:100%;object-fit:cover;\"\r\n />`\r\n : html`<slot name=\"wallpaper\"></slot>`\r\n }\r\n </div>\r\n\r\n <div class=\"desktop-icons\" @mousedown=${this._onDesktopMouseDown}>\r\n <slot></slot>\r\n </div>\r\n\r\n ${\r\n this.showDock\r\n ? html`\r\n <div class=\"desktop-dock\" part=\"dock\">\r\n <slot name=\"dock\"></slot>\r\n </div>\r\n `\r\n : ''\r\n }\r\n\r\n <div class=\"selection-rect\"></div>\r\n\r\n <div class=\"context-menu\">\r\n <div class=\"context-menu-item\" @click=${this._onArrangeVertical}>按垂直方向排列</div>\r\n <div class=\"context-menu-item\" @click=${this._onArrangeHorizontal}>按水平方向排列</div>\r\n <div class=\"context-menu-separator\"></div>\r\n <div class=\"context-menu-item\" @click=${this._onCleanUp}>整理图标</div>\r\n <div class=\"context-menu-separator\"></div>\r\n <div class=\"context-menu-item\" @click=${this._onSelectAll}>\r\n 全选\r\n <span class=\"shortcut\">⌘A</span>\r\n </div>\r\n </div>\r\n </div>\r\n `\r\n }\r\n\r\n // ─── 事件处理 ───\r\n\r\n private _onDesktopMouseDown(e: MouseEvent): void {\r\n if (e.button !== 0) return\r\n\r\n const iconEl = this._findIconInComposedPath(e.composedPath())\r\n\r\n if (iconEl) {\r\n this._hideContextMenu()\r\n\r\n const iconId = iconEl.iconId\r\n const shiftKey = e.shiftKey\r\n\r\n if (shiftKey) {\r\n if (this._selectedIds.has(iconId)) {\r\n this._selectedIds.delete(iconId)\r\n } else {\r\n this._selectedIds.add(iconId)\r\n }\r\n this._applySelection()\r\n } else if (!this._selectedIds.has(iconId)) {\r\n this._selectIcon(iconId, false)\r\n }\r\n\r\n this._startIconDrag(iconEl, e.clientX, e.clientY)\r\n } else {\r\n this._hideContextMenu()\r\n this._deselectAll()\r\n this._startSelection(e.clientX, e.clientY)\r\n\r\n const onMove = (ev: MouseEvent) => {\r\n if (!this._isSelecting) return\r\n const rect = this._desktopIcons.getBoundingClientRect()\r\n const cx = ev.clientX - rect.left\r\n const cy = ev.clientY - rect.top\r\n\r\n const x = Math.min(this._selStartX, cx)\r\n const y = Math.min(this._selStartY, cy)\r\n const w = Math.abs(cx - this._selStartX)\r\n const h = Math.abs(cy - this._selStartY)\r\n\r\n this._updateSelectionRect(x, y, w, h)\r\n this._checkSelectionOverlap(x, y, w, h)\r\n }\r\n\r\n const onUp = () => {\r\n document.removeEventListener('mousemove', onMove)\r\n document.removeEventListener('mouseup', onUp)\r\n this._endSelection()\r\n this._selDragCleanup = null\r\n }\r\n\r\n document.addEventListener('mousemove', onMove)\r\n document.addEventListener('mouseup', onUp)\r\n this._selDragCleanup = onUp\r\n }\r\n }\r\n\r\n private _onContextMenu(e: MouseEvent): void {\r\n e.preventDefault()\r\n const rect = this._desktopIcons.getBoundingClientRect()\r\n this._showContextMenu(e.clientX - rect.left, e.clientY - rect.top)\r\n }\r\n\r\n // 右键菜单操作\r\n private _onArrangeVertical(): void {\r\n this.layout = 'vertical'\r\n this._arrangeIcons()\r\n this._hideContextMenu()\r\n this.emit('mac-layout-change', { detail: { layout: 'vertical' } })\r\n }\r\n\r\n private _onArrangeHorizontal(): void {\r\n this.layout = 'horizontal'\r\n this._arrangeIcons()\r\n this._hideContextMenu()\r\n this.emit('mac-layout-change', { detail: { layout: 'horizontal' } })\r\n }\r\n\r\n private _onCleanUp(): void {\r\n this._arrangeIcons()\r\n this._hideContextMenu()\r\n }\r\n\r\n private _onSelectAll(): void {\r\n this._selectedIds.clear()\r\n this._getIconElements().forEach((icon) => this._selectedIds.add(icon.iconId))\r\n this._applySelection()\r\n this._hideContextMenu()\r\n }\r\n\r\n // ─── 生命周期 ───\r\n\r\n override connectedCallback(): void {\r\n super.connectedCallback()\r\n document.addEventListener('click', this._globalClickHandler)\r\n }\r\n\r\n override disconnectedCallback(): void {\r\n super.disconnectedCallback()\r\n document.removeEventListener('click', this._globalClickHandler)\r\n this._dragCleanup?.()\r\n this._selDragCleanup?.()\r\n }\r\n\r\n private _globalClickHandler = (e: MouseEvent): void => {\r\n if (!this.contains(e.target as Node)) {\r\n this._hideContextMenu()\r\n }\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'mac-desktop': MacDesktop\r\n }\r\n}\r\n","import { html, css } from 'lit'\r\nimport { property, customElement } from 'lit/decorators.js'\r\nimport { BaseElement } from '../../internal/base-element'\r\nimport { sharedStyles } from '../../styles/shared-styles'\r\nimport { themeTokens } from '../../styles/theme'\r\n\r\n/**\r\n * @tag mac-dock-item\r\n * @summary A macOS-style dock item with icon, label, and bounce animation.\r\n *\r\n * @slot - The icon's visual content (image, svg, etc.).\r\n *\r\n * @csspart base - The dock item container.\r\n * @csspart icon - The icon image area.\r\n * @csspart label - The tooltip label.\r\n * @csspart indicator - The running indicator dot.\r\n *\r\n * @event mac-dock-item-click - Emitted on click. Detail: { itemId }\r\n */\r\n@customElement('mac-dock-item')\r\nexport class MacDockItem extends BaseElement {\r\n static override styles = [\r\n themeTokens,\r\n sharedStyles,\r\n css`\r\n :host {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n cursor: default;\r\n user-select: none;\r\n -webkit-user-select: none;\r\n position: relative;\r\n transition: transform var(--md-transition-magnify);\r\n will-change: transform;\r\n }\r\n\r\n .dock-item-icon {\r\n width: var(--md-icon-size);\r\n height: var(--md-icon-size);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n border-radius: var(--md-radius-icon);\r\n overflow: hidden;\r\n filter: drop-shadow(var(--md-shadow-icon));\r\n transition: filter var(--md-transition-magnify);\r\n cursor: pointer;\r\n }\r\n\r\n :host(:hover) .dock-item-icon {\r\n filter: drop-shadow(var(--md-shadow-icon-hover));\r\n }\r\n\r\n :host(:active) .dock-item-icon {\r\n filter: drop-shadow(var(--md-shadow-icon-active));\r\n }\r\n\r\n .dock-item-icon ::slotted(img) {\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n border-radius: var(--md-radius-icon);\r\n }\r\n\r\n .dock-item-icon ::slotted(svg) {\r\n width: 100%;\r\n height: 100%;\r\n }\r\n\r\n .default-icon {\r\n width: var(--md-icon-size);\r\n height: var(--md-icon-size);\r\n border-radius: var(--md-radius-icon);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n font-size: var(--md-font-size-icon);\r\n color: var(--md-mac-text-white);\r\n font-weight: 600;\r\n background: var(--dock-item-color, var(--md-color-primary));\r\n box-shadow:\r\n inset 0 1px 0 var(--md-icon-inset-top),\r\n inset 0 -1px 0 var(--md-icon-inset-bottom),\r\n 0 1px 4px rgba(0, 0, 0, 0.14);\r\n }\r\n\r\n /* ─── Tooltip Label ─── */\r\n\r\n .dock-item-label {\r\n position: absolute;\r\n top: var(--md-tooltip-offset);\r\n left: 50%;\r\n transform: translateX(-50%) scale(0.85);\r\n white-space: nowrap;\r\n font-family: var(--md-font-family);\r\n font-size: var(--md-font-size-sm);\r\n line-height: 1.3;\r\n letter-spacing: -0.01em;\r\n color: var(--md-mac-text-white);\r\n background: var(--md-tooltip-bg);\r\n backdrop-filter: blur(var(--md-tooltip-blur)) saturate(180%);\r\n -webkit-backdrop-filter: blur(var(--md-tooltip-blur)) saturate(180%);\r\n padding: var(--md-spacing-xs) 10px;\r\n border-radius: var(--md-radius-sm);\r\n box-shadow:\r\n var(--md-tooltip-shadow),\r\n inset 0 0 0 0.5px var(--md-tooltip-border);\r\n pointer-events: none;\r\n opacity: 0;\r\n transition:\r\n opacity 120ms ease,\r\n transform 120ms ease;\r\n }\r\n\r\n .dock-item-label::after {\r\n content: '';\r\n position: absolute;\r\n bottom: -4px;\r\n left: 50%;\r\n transform: translateX(-50%);\r\n width: 8px;\r\n height: 8px;\r\n background: var(--md-tooltip-bg);\r\n border-radius: 0 0 2px 2px;\r\n clip-path: polygon(0 0, 100% 0, 50% 100%);\r\n }\r\n\r\n :host(:hover) .dock-item-label {\r\n opacity: 1;\r\n transform: translateX(-50%) scale(1);\r\n }\r\n\r\n /* ─── Running Indicator ─── */\r\n\r\n .dock-indicator {\r\n width: var(--md-indicator-size);\r\n height: var(--md-indicator-size);\r\n border-radius: 50%;\r\n background: rgba(255, 255, 255, var(--md-opacity-indicator));\r\n margin-top: var(--md-indicator-margin-top);\r\n opacity: 0;\r\n transition: opacity var(--md-transition-fast);\r\n }\r\n\r\n :host([running]) .dock-indicator {\r\n opacity: 1;\r\n }\r\n\r\n /* ─── Bounce Animation ─── */\r\n\r\n :host([bouncing]) {\r\n animation: dock-bounce 1s ease;\r\n }\r\n\r\n @keyframes dock-bounce {\r\n 0% {\r\n transform: translateY(0);\r\n }\r\n 25% {\r\n transform: translateY(-24px);\r\n }\r\n 50% {\r\n transform: translateY(0);\r\n }\r\n 75% {\r\n transform: translateY(-12px);\r\n }\r\n 100% {\r\n transform: translateY(0);\r\n }\r\n }\r\n `,\r\n ]\r\n\r\n /** Item identifier */\r\n @property({ reflect: true }) itemId = ''\r\n\r\n /** Item label (tooltip) */\r\n @property({ reflect: true }) label = ''\r\n\r\n /** Icon color for default placeholder */\r\n @property({ reflect: true }) color = '#007AFF'\r\n\r\n /** Whether the app is running */\r\n @property({ type: Boolean, reflect: true }) running = false\r\n\r\n /** Whether the icon is currently bouncing */\r\n @property({ type: Boolean, reflect: true }) bouncing = false\r\n\r\n override render() {\r\n return html`\r\n <div class=\"dock-item-icon\" part=\"icon\">\r\n <slot>\r\n <div\r\n class=\"default-icon\"\r\n style=\"--dock-item-color: ${this.color}; background: var(--dock-item-color)\"\r\n >\r\n ${this.label ? this.label.charAt(0).toUpperCase() : '?'}\r\n </div>\r\n </slot>\r\n </div>\r\n <div class=\"dock-item-label\" part=\"label\">${this.label}</div>\r\n <div class=\"dock-indicator\" part=\"indicator\"></div>\r\n `\r\n }\r\n\r\n override connectedCallback(): void {\r\n super.connectedCallback()\r\n this.addEventListener('click', this._handleClick)\r\n this.addEventListener('animationend', this._onBounceEnd)\r\n }\r\n\r\n override disconnectedCallback(): void {\r\n super.disconnectedCallback()\r\n this.removeEventListener('click', this._handleClick)\r\n this.removeEventListener('animationend', this._onBounceEnd)\r\n }\r\n\r\n private _handleClick(): void {\r\n this.bouncing = true\r\n this.emit('mac-dock-item-click', { detail: { itemId: this.itemId } })\r\n }\r\n\r\n private _onBounceEnd(): void {\r\n this.bouncing = false\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'mac-dock-item': MacDockItem\r\n }\r\n}\r\n","import { html, css } from 'lit'\r\nimport { property, customElement, query } from 'lit/decorators.js'\r\nimport { BaseElement } from '../../internal/base-element'\r\nimport { sharedStyles } from '../../styles/shared-styles'\r\nimport { themeTokens } from '../../styles/theme'\r\nimport type { MacDockItem } from './mac-dock-item'\r\n\r\n/**\r\n * @tag mac-dock\r\n * @summary 带有液态玻璃背景、放大效果、右键菜单和拖拽移除功能的 macOS 27 Golden Gate 风格 Dock。\r\n *\r\n * @slot - 用于放置 mac-dock-item 元素的默认插槽。\r\n * @slot separator - 区域之间的自定义分隔符内容。\r\n *\r\n * @csspart base - Dock 容器。\r\n * @csspart glass - 液态玻璃背景层。\r\n * @csspart items - 项目容器。\r\n *\r\n * @event mac-dock-item-click - 从 dock 项目转发。Detail: { itemId }\r\n * @event mac-dock-item-remove - 项目被移除时触发。Detail: { itemId }\r\n */\r\n@customElement('mac-dock')\r\nexport class MacDock extends BaseElement {\r\n static override styles = [\r\n themeTokens,\r\n sharedStyles,\r\n css`\r\n :host {\r\n display: flex;\r\n justify-content: center;\r\n position: relative;\r\n z-index: 100;\r\n }\r\n\r\n .dock {\r\n position: relative;\r\n display: flex;\r\n align-items: flex-end;\r\n padding: var(--md-dock-padding);\r\n border-radius: var(--md-radius-dock);\r\n }\r\n\r\n /* ─── 液态玻璃背景 ─── */\r\n\r\n .dock-glass {\r\n position: absolute;\r\n inset: 0;\r\n border-radius: var(--md-radius-dock);\r\n background: var(--md-glass-bg);\r\n backdrop-filter: blur(var(--md-glass-blur)) saturate(var(--md-glass-saturate));\r\n -webkit-backdrop-filter: blur(var(--md-glass-blur)) saturate(var(--md-glass-saturate));\r\n border: 0.5px solid var(--md-glass-border);\r\n box-shadow:\r\n var(--md-shadow-dock),\r\n inset 0 1px 0 var(--md-glass-highlight-top),\r\n inset 0 -0.5px 0 var(--md-glass-highlight-bottom);\r\n pointer-events: none;\r\n z-index: -1;\r\n }\r\n\r\n /* ─── 项目容器 ─── */\r\n\r\n .dock-items {\r\n display: flex;\r\n align-items: flex-end;\r\n gap: var(--md-dock-gap);\r\n }\r\n\r\n /* ─── 分隔符 ─── */\r\n\r\n .dock-separator {\r\n width: var(--md-separator-width);\r\n height: var(--md-separator-height);\r\n background: var(--md-separator-color);\r\n margin: var(--md-separator-margin);\r\n align-self: center;\r\n border-radius: 1px;\r\n flex-shrink: 0;\r\n }\r\n\r\n /* ─── 右键菜单(液态玻璃) ─── */\r\n\r\n .dock-context-menu {\r\n position: fixed;\r\n z-index: 200;\r\n min-width: 200px;\r\n background: var(--md-glass-menu-bg);\r\n backdrop-filter: blur(var(--md-glass-blur)) saturate(var(--md-glass-saturate));\r\n -webkit-backdrop-filter: blur(var(--md-glass-blur)) saturate(var(--md-glass-saturate));\r\n border-radius: var(--md-dock-container-radius);\r\n padding: var(--md-dock-container-padding);\r\n box-shadow:\r\n var(--md-shadow-menu),\r\n inset 0 0 0 0.5px var(--md-glass-menu-border),\r\n inset 0 1px 0 var(--md-glass-menu-highlight);\r\n font-family: var(--md-font-family);\r\n font-size: var(--md-font-size-menu);\r\n color: var(--md-mac-text-primary);\r\n display: none;\r\n letter-spacing: -0.01em;\r\n }\r\n\r\n .dock-context-menu.visible {\r\n display: block;\r\n }\r\n\r\n .dock-context-menu-item {\r\n padding: var(--md-spacing-xs) 14px;\r\n cursor: default;\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: var(--md-dock-container-gap);\r\n border-radius: var(--md-dock-container-radius);\r\n margin: 0 var(--md-spacing-xs);\r\n transition:\r\n background-color var(--md-transition-menu),\r\n color var(--md-transition-menu);\r\n }\r\n\r\n .dock-context-menu-item:hover {\r\n background: var(--md-dock-item-hover-bg);\r\n color: var(--md-dock-item-hover-color);\r\n box-shadow: var(--md-dock-item-hover-shadow);\r\n }\r\n\r\n .dock-context-menu-item.danger:hover {\r\n background: var(--md-dock-item-danger-bg);\r\n box-shadow: var(--md-dock-item-danger-shadow);\r\n }\r\n\r\n .dock-context-menu-separator {\r\n height: var(--md-dock-separator-width);\r\n background: var(--md-dock-separator-color);\r\n margin: var(--md-dock-separator-margin);\r\n }\r\n\r\n /* ─── 拖拽移除区域 ─── */\r\n .drag-remove-indicator {\r\n position: fixed;\r\n top: 50%;\r\n left: 50%;\r\n transform: translate(-50%, -50%) scale(0.9);\r\n background: var(--md-dock-item-danger-dropzone-bg);\r\n backdrop-filter: blur(20px) saturate(180%);\r\n -webkit-backdrop-filter: blur(20px) saturate(180%);\r\n border: 2px dashed var(--md-dock-item-danger-border);\r\n border-radius: 20px;\r\n padding: var(--md-spacing-xl) var(--md-spacing-2xl);\r\n font-family: var(--md-font-family);\r\n font-size: var(--md-dock-item-font-size);\r\n color: var(--md-dock-item-danger-text);\r\n opacity: 0;\r\n transition:\r\n opacity var(--md-transition-drag),\r\n transform var(--md-transition-drag);\r\n pointer-events: none;\r\n }\r\n /* ─── 拖拽中的项目幽灵 ─── */\r\n\r\n :host {\r\n --dock-drag-opacity: 1;\r\n }\r\n\r\n /* ─── 放置指示器 ─── */\r\n\r\n ::slotted(.drop-indicator) {\r\n width: 3px;\r\n height: var(--md-icon-size, 48px);\r\n background: var(--md-mac-accent, #007aff);\r\n border-radius: 2px;\r\n align-self: center;\r\n margin: 0 2px;\r\n box-shadow: 0 0 6px rgba(0, 122, 255, 0.5);\r\n }\r\n `,\r\n ]\r\n\r\n /** 放大比例因子(1.0 = 不放大) */\r\n @property({ type: Number }) magnification = 1.6\r\n\r\n /** 基础图标大小,单位为像素 */\r\n @property({ type: Number }) iconSize = 48\r\n\r\n /** 放大范围,单位为像素(影响邻近项目的光标距离) */\r\n @property({ type: Number }) magnifyRange = 120\r\n\r\n /** Dock 的位置 */\r\n @property({ reflect: true }) position: 'bottom' | 'left' | 'right' = 'bottom'\r\n\r\n @query('.dock-items')\r\n private _dockItems!: HTMLDivElement\r\n\r\n @query('.dock-context-menu')\r\n private _contextMenu!: HTMLDivElement\r\n\r\n private _isHovering = false\r\n private _rafId: number | null = null\r\n\r\n // 右键菜单状态\r\n private _contextMenuItem: MacDockItem | null = null\r\n\r\n // 拖拽移除状态\r\n private _isDragging = false\r\n private _dragItem: MacDockItem | null = null\r\n private _dragStartX = 0\r\n private _dragStartY = 0\r\n private _dragOffsetX = 0\r\n private _dragOffsetY = 0\r\n private _hasDragMoved = false\r\n private _dragGhost: HTMLElement | null = null\r\n private _lastMoveEvent: MouseEvent | null = null\r\n private _dragCleanup: (() => void) | null = null\r\n\r\n override connectedCallback(): void {\r\n super.connectedCallback()\r\n this.addEventListener('mac-dock-item-click', this._forwardItemClick as EventListener)\r\n }\r\n\r\n override disconnectedCallback(): void {\r\n super.disconnectedCallback()\r\n this.removeEventListener('mac-dock-item-click', this._forwardItemClick as EventListener)\r\n if (this._rafId) cancelAnimationFrame(this._rafId)\r\n document.removeEventListener('click', this._globalClickHandler)\r\n this._dragCleanup?.()\r\n }\r\n\r\n private _forwardItemClick(e: CustomEvent): void {\r\n this.emit('mac-dock-item-click', { detail: e.detail })\r\n }\r\n\r\n private _getDockItems(): MacDockItem[] {\r\n return Array.from(this.querySelectorAll('mac-dock-item')) as MacDockItem[]\r\n }\r\n\r\n private _findDockItemInPath(path: EventTarget[]): MacDockItem | null {\r\n for (const target of path) {\r\n if (target instanceof HTMLElement && target.tagName === 'MAC-DOCK-ITEM') {\r\n return target as MacDockItem\r\n }\r\n }\r\n return null\r\n }\r\n\r\n /**\r\n * 核心放大算法:根据鼠标位置计算每个图标的缩放比例。\r\n * 使用高斯分布,距离鼠标越近的图标放大越多,实现 macOS 风格的平滑放大效果。\r\n */\r\n private _applyMagnification(clientX: number, clientY: number): void {\r\n const items = this._getDockItems()\r\n if (items.length === 0) return\r\n\r\n const isHorizontal = this.position === 'bottom'\r\n const cursorPos = isHorizontal ? clientX : clientY\r\n\r\n items.forEach((item) => {\r\n if (item === this._dragItem) return\r\n const itemRect = item.getBoundingClientRect()\r\n const itemCenter = isHorizontal\r\n ? itemRect.left + itemRect.width / 2\r\n : itemRect.top + itemRect.height / 2\r\n\r\n const distance = Math.abs(cursorPos - itemCenter)\r\n const maxDist = this.magnifyRange\r\n\r\n let scale = 1\r\n if (distance < maxDist) {\r\n const ratio = distance / maxDist\r\n scale = 1 + (this.magnification - 1) * (0.5 + 0.5 * Math.cos(ratio * Math.PI))\r\n }\r\n\r\n item.style.transform = `scale(${scale})`\r\n item.style.transformOrigin = isHorizontal ? 'bottom center' : 'center left'\r\n\r\n // 放大时增加水平 margin,撑开图标间距\r\n const extraMargin = (scale - 1) * this.iconSize * 0.3\r\n if (isHorizontal) {\r\n item.style.marginLeft = `${extraMargin}px`\r\n item.style.marginRight = `${extraMargin}px`\r\n } else {\r\n item.style.marginTop = `${extraMargin}px`\r\n item.style.marginBottom = `${extraMargin}px`\r\n }\r\n })\r\n }\r\n\r\n private _resetMagnification(): void {\r\n const items = this._getDockItems()\r\n items.forEach((item) => {\r\n item.style.transform = 'scale(1)'\r\n item.style.marginLeft = ''\r\n item.style.marginRight = ''\r\n item.style.marginTop = ''\r\n item.style.marginBottom = ''\r\n })\r\n }\r\n\r\n // ─── 右键菜单(通过事件委托) ───\r\n\r\n private _onDockContextMenu(e: MouseEvent): void {\r\n e.stopPropagation()\r\n e.preventDefault()\r\n const item = this._findDockItemInPath(e.composedPath())\r\n if (!item) return\r\n\r\n this._contextMenuItem = item\r\n let x = e.clientX\r\n let y = e.clientY\r\n\r\n this._contextMenu.classList.add('visible')\r\n\r\n // 边界检测:菜单显示后再测量实际尺寸\r\n const menuRect = this._contextMenu.getBoundingClientRect()\r\n const menuW = menuRect.width\r\n const menuH = menuRect.height\r\n\r\n // 右边溢出\r\n if (x + menuW > window.innerWidth) {\r\n x = window.innerWidth - menuW - 4\r\n }\r\n // 左边溢出\r\n if (x < 4) {\r\n x = 4\r\n }\r\n // 下边溢出\r\n if (y + menuH > window.innerHeight) {\r\n y = y - menuH\r\n }\r\n // 上边溢出\r\n if (y < 4) {\r\n y = 4\r\n }\r\n\r\n this._contextMenu.style.left = `${x}px`\r\n this._contextMenu.style.top = `${y}px`\r\n\r\n document.addEventListener('click', this._globalClickHandler, { once: true })\r\n }\r\n\r\n private _globalClickHandler = (e: MouseEvent): void => {\r\n if (!this.contains(e.target as Node)) {\r\n this._hideContextMenu()\r\n }\r\n }\r\n\r\n private _hideContextMenu(): void {\r\n this._contextMenu?.classList.remove('visible')\r\n this._contextMenuItem = null\r\n }\r\n\r\n private _onContextMenuOpen(): void {\r\n // macOS \"选项\" 占位符\r\n }\r\n\r\n private _onContextRemoveFromDock(): void {\r\n if (this._contextMenuItem) {\r\n const itemId = this._contextMenuItem.itemId\r\n this.emit('mac-dock-item-remove', { detail: { itemId } })\r\n this._contextMenuItem.remove()\r\n }\r\n this._hideContextMenu()\r\n }\r\n\r\n // ─── 拖拽移除(通过 mousedown 事件委托) ───\r\n\r\n private _cleanupDrag(): void {\r\n if (this._dragCleanup) {\r\n this._dragCleanup()\r\n this._dragCleanup = null\r\n }\r\n }\r\n\r\n private _onDockMouseDown(e: MouseEvent): void {\r\n this._hideContextMenu()\r\n if (e.button !== 0) return\r\n\r\n const item = this._findDockItemInPath(e.composedPath())\r\n if (!item) return\r\n\r\n // 阻止事件冒泡到 desktop 组件触发框选\r\n e.stopPropagation()\r\n\r\n // 清理之前的拖拽状态和监听器\r\n this._cleanupDrag()\r\n\r\n this._dragItem = item\r\n this._dragStartX = e.clientX\r\n this._dragStartY = e.clientY\r\n this._hasDragMoved = false\r\n this._isDragging = false\r\n\r\n // 记录鼠标在图标内的偏移比例(0~1)\r\n const itemRect = item.getBoundingClientRect()\r\n this._dragOffsetX = (e.clientX - itemRect.left) / itemRect.width\r\n this._dragOffsetY = (e.clientY - itemRect.top) / itemRect.height\r\n\r\n const onMove = (ev: MouseEvent) => {\r\n this._lastMoveEvent = ev\r\n const dx = ev.clientX - this._dragStartX\r\n const dy = ev.clientY - this._dragStartY\r\n\r\n if (!this._hasDragMoved && (Math.abs(dx) > 5 || Math.abs(dy) > 5)) {\r\n this._hasDragMoved = true\r\n this._isDragging = true\r\n this._resetMagnification()\r\n this._createDragGhost(item)\r\n item.style.opacity = '0.3'\r\n }\r\n\r\n if (this._hasDragMoved && this._dragGhost) {\r\n const ghostSize = 48\r\n this._dragGhost.style.left = `${ev.clientX - ghostSize * this._dragOffsetX}px`\r\n this._dragGhost.style.top = `${ev.clientY - ghostSize * this._dragOffsetY}px`\r\n\r\n const dockRect = this.getBoundingClientRect()\r\n const isOutsideDock =\r\n ev.clientX < dockRect.left ||\r\n ev.clientX > dockRect.right ||\r\n ev.clientY < dockRect.top - 20 ||\r\n ev.clientY > dockRect.bottom + 20\r\n\r\n const removeZone = this.shadowRoot?.querySelector('.drag-remove-zone')\r\n if (removeZone) {\r\n removeZone.classList.toggle('active', isOutsideDock)\r\n }\r\n\r\n // 拖拽排序:检测目标位置\r\n if (!isOutsideDock) {\r\n this._updateDropIndicator(ev.clientX)\r\n } else {\r\n this._removeDropIndicator()\r\n }\r\n }\r\n }\r\n\r\n const onUp = () => {\r\n document.removeEventListener('mousemove', onMove)\r\n document.removeEventListener('mouseup', onUp)\r\n this._dragCleanup = null\r\n\r\n if (this._hasDragMoved) {\r\n const dockRect = this.getBoundingClientRect()\r\n const lastMoveEvent = this._lastMoveEvent\r\n const isOutsideDock = lastMoveEvent\r\n ? lastMoveEvent.clientX < dockRect.left ||\r\n lastMoveEvent.clientX > dockRect.right ||\r\n lastMoveEvent.clientY < dockRect.top - 20 ||\r\n lastMoveEvent.clientY > dockRect.bottom + 20\r\n : false\r\n\r\n if (isOutsideDock && this._dragItem) {\r\n const itemId = this._dragItem.itemId\r\n this.emit('mac-dock-item-remove', { detail: { itemId } })\r\n this._dragItem.remove()\r\n } else if (this._dragItem) {\r\n // 在 dock 内放下:执行排序\r\n const targetItem = this._findDropTarget(lastMoveEvent?.clientX ?? 0)\r\n if (targetItem && targetItem !== this._dragItem) {\r\n const items = this._getDockItems()\r\n const dragIdx = items.indexOf(this._dragItem)\r\n const targetIdx = items.indexOf(targetItem)\r\n if (dragIdx < targetIdx) {\r\n this.insertBefore(this._dragItem, targetItem.nextSibling)\r\n } else {\r\n this.insertBefore(this._dragItem, targetItem)\r\n }\r\n this.emit('mac-dock-item-reorder', {\r\n detail: {\r\n itemId: this._dragItem.itemId,\r\n targetItemId: targetItem.itemId,\r\n },\r\n })\r\n }\r\n this._dragItem.style.opacity = '1'\r\n }\r\n\r\n this._removeDragGhost()\r\n this._removeDropIndicator()\r\n const removeZone = this.shadowRoot?.querySelector('.drag-remove-zone')\r\n if (removeZone) removeZone.classList.remove('active')\r\n }\r\n\r\n this._isDragging = false\r\n this._dragItem = null\r\n this._hasDragMoved = false\r\n this._lastMoveEvent = null\r\n }\r\n\r\n this._dragCleanup = () => {\r\n document.removeEventListener('mousemove', onMove)\r\n document.removeEventListener('mouseup', onUp)\r\n if (this._dragItem) {\r\n this._dragItem.style.opacity = '1'\r\n }\r\n this._removeDragGhost()\r\n this._removeDropIndicator()\r\n const removeZone = this.shadowRoot?.querySelector('.drag-remove-zone')\r\n if (removeZone) removeZone.classList.remove('active')\r\n this._isDragging = false\r\n this._dragItem = null\r\n this._hasDragMoved = false\r\n this._lastMoveEvent = null\r\n }\r\n\r\n document.addEventListener('mousemove', onMove)\r\n document.addEventListener('mouseup', onUp)\r\n }\r\n\r\n private _createDragGhost(item: MacDockItem): void {\r\n const ghost = document.createElement('div')\r\n const iconRect = this._dragItem?.shadowRoot\r\n ?.querySelector('.dock-item-icon')\r\n ?.getBoundingClientRect() ?? { left: 0, top: 0 }\r\n\r\n ghost.style.cssText = `\r\n position: fixed;\r\n z-index: 10000;\r\n pointer-events: none;\r\n width: 48px;\r\n height: 48px;\r\n left: ${iconRect.left}px;\r\n top: ${iconRect.top}px;\r\n border-radius: 12px;\r\n filter: drop-shadow(0 8px 24px rgba(0, 0, 0, 0.35));\r\n transition: none;\r\n `\r\n\r\n // 复制图标视觉内容\r\n const iconEl = item.shadowRoot?.querySelector('.default-icon') as HTMLElement | null\r\n if (iconEl) {\r\n const clone = iconEl.cloneNode(true) as HTMLElement\r\n clone.style.cssText = `\r\n width: 48px;\r\n height: 48px;\r\n border-radius: 12px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n font-size: 22px;\r\n color: #fff;\r\n font-weight: 600;\r\n background: ${item.color};\r\n box-shadow: inset 0 1px 0 rgba(255,255,255,0.18), inset 0 -1px 0 rgba(0,0,0,0.12);\r\n `\r\n ghost.appendChild(clone)\r\n } else {\r\n // 自定义图标(slot 内容):用 canvas 截图\r\n const iconContainer = item.shadowRoot?.querySelector('.dock-item-icon') as HTMLElement | null\r\n if (iconContainer) {\r\n const slotted = iconContainer.querySelector('slot')\r\n if (slotted && slotted.assignedNodes().length > 0) {\r\n const img = slotted.assignedNodes().find((n) => n instanceof HTMLImageElement) as\r\n HTMLImageElement | undefined\r\n if (img) {\r\n const imgClone = document.createElement('img')\r\n imgClone.src = img.src\r\n imgClone.style.cssText = 'width:48px;height:48px;object-fit:cover;border-radius:12px;'\r\n ghost.appendChild(imgClone)\r\n }\r\n }\r\n }\r\n }\r\n\r\n document.body.appendChild(ghost)\r\n this._dragGhost = ghost\r\n }\r\n\r\n private _removeDragGhost(): void {\r\n if (this._dragGhost) {\r\n this._dragGhost.remove()\r\n this._dragGhost = null\r\n }\r\n }\r\n\r\n // ─── 放置指示器与重新排序 ───\r\n\r\n private _dropIndicator: HTMLDivElement | null = null\r\n\r\n private _findDropTarget(clientX: number): MacDockItem | null {\r\n const items = this._getDockItems().filter((i) => i !== this._dragItem)\r\n if (items.length === 0) return null\r\n\r\n let closest: MacDockItem | null = null\r\n let closestDist = Infinity\r\n\r\n for (const item of items) {\r\n const rect = item.getBoundingClientRect()\r\n const center = rect.left + rect.width / 2\r\n const dist = Math.abs(clientX - center)\r\n if (dist < closestDist) {\r\n closestDist = dist\r\n closest = item\r\n }\r\n }\r\n return closest\r\n }\r\n\r\n private _updateDropIndicator(clientX: number): void {\r\n const targetItem = this._findDropTarget(clientX)\r\n if (!targetItem || targetItem === this._dragItem) {\r\n this._removeDropIndicator()\r\n return\r\n }\r\n\r\n if (!this._dropIndicator) {\r\n this._dropIndicator = document.createElement('div')\r\n this._dropIndicator.className = 'drop-indicator'\r\n }\r\n\r\n const targetRect = targetItem.getBoundingClientRect()\r\n const targetCenter = targetRect.left + targetRect.width / 2\r\n const insertBefore = clientX < targetCenter\r\n\r\n // 将指示器插入到 slot 容器中(light DOM)\r\n if (insertBefore) {\r\n targetItem.parentNode?.insertBefore(this._dropIndicator, targetItem)\r\n } else {\r\n targetItem.parentNode?.insertBefore(this._dropIndicator, targetItem.nextSibling)\r\n }\r\n }\r\n\r\n private _removeDropIndicator(): void {\r\n if (this._dropIndicator) {\r\n this._dropIndicator.remove()\r\n this._dropIndicator = null\r\n }\r\n }\r\n\r\n // ─── 事件处理 ───\r\n\r\n private _onMouseMove(e: MouseEvent): void {\r\n if (!this._isHovering || this._isDragging) return\r\n this._applyMagnification(e.clientX, e.clientY)\r\n }\r\n\r\n private _onMouseEnter(): void {\r\n this._isHovering = true\r\n }\r\n\r\n private _onMouseLeave(): void {\r\n this._isHovering = false\r\n this._resetMagnification()\r\n }\r\n\r\n override render() {\r\n return html`\r\n <div\r\n class=\"dock\"\r\n part=\"base\"\r\n @mousemove=${this._onMouseMove}\r\n @mouseenter=${this._onMouseEnter}\r\n @mouseleave=${this._onMouseLeave}\r\n @mousedown=${this._onDockMouseDown}\r\n @contextmenu=${this._onDockContextMenu}\r\n >\r\n <div class=\"dock-glass\" part=\"glass\"></div>\r\n <div class=\"dock-items\" part=\"items\">\r\n <slot></slot>\r\n </div>\r\n\r\n <!-- Right-click context menu -->\r\n <div class=\"dock-context-menu\">\r\n <div class=\"dock-context-menu-item\" @click=${this._onContextMenuOpen}>选项</div>\r\n <div class=\"dock-context-menu-separator\"></div>\r\n <div class=\"dock-context-menu-item danger\" @click=${this._onContextRemoveFromDock}>\r\n 从 Dock 中移除\r\n </div>\r\n </div>\r\n </div>\r\n `\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'mac-dock': MacDock\r\n }\r\n}\r\n","import { html, css } from 'lit'\r\nimport { property, customElement } from 'lit/decorators.js'\r\nimport { BaseElement } from '../../internal/base-element'\r\nimport { sharedStyles } from '../../styles/shared-styles'\r\nimport { themeTokens } from '../../styles/theme'\r\n\r\n/**\r\n * @tag mac-modal\r\n * @summary macOS 风格的模态框/窗口,支持标题栏、拖拽和调整大小。\r\n *\r\n * @slot - 模态框内容区。\r\n * @slot titlebar - 自定义标题栏内容(替换默认标题和按钮)。\r\n * @slot footer - 自定义底部内容。\r\n *\r\n * @csspart base - 模态框容器。\r\n * @csspart titlebar - 标题栏区域。\r\n * @csspart title - 标题文本。\r\n * @csspart body - 内容区域。\r\n * @csspart footer - 底部区域。\r\n * @csspart resize-handle - 右下角调整大小手柄。\r\n *\r\n * @event mac-modal-close - 点击关闭按钮时触发。\r\n * @event mac-modal-minimize - 点击最小化按钮时触发。\r\n * @event mac-modal-maximize - 点击最大化/全屏按钮时触发。\r\n * @event mac-modal-move - 模态框移动时触发。Detail: { x, y }\r\n * @event mac-modal-resize - 模态框调整大小时触发。Detail: { width, height }\r\n * @event mac-modal-ok - 点击默认确认按钮时触发。\r\n * @event mac-modal-cancel - 点击默认取消按钮时触发。\r\n */\r\n@customElement('mac-modal')\r\nexport class MacModal extends BaseElement {\r\n static override styles = [\r\n themeTokens,\r\n sharedStyles,\r\n css`\r\n :host {\r\n display: block;\r\n position: fixed;\r\n min-width: var(--md-modal-min-width);\r\n min-height: var(--md-modal-min-height);\r\n border-radius: var(--md-modal-container-radius);\r\n overflow: hidden;\r\n box-shadow: var(--md-modal-container-shadow);\r\n font-family: var(--md-font-family);\r\n }\r\n\r\n .modal {\r\n display: flex;\r\n flex-direction: column;\r\n width: 100%;\r\n height: 100%;\r\n background: var(--md-modal-container-bg);\r\n backdrop-filter: blur(var(--md-glass-blur)) saturate(var(--md-glass-saturate));\r\n -webkit-backdrop-filter: blur(var(--md-glass-blur)) saturate(var(--md-glass-saturate));\r\n border-radius: var(--md-modal-container-radius);\r\n overflow: hidden;\r\n }\r\n\r\n /* ─── 标题栏 ─── */\r\n\r\n .titlebar {\r\n display: flex;\r\n align-items: center;\r\n height: var(--md-modal-header-height);\r\n padding: var(--md-modal-header-padding);\r\n background: var(--md-modal-header-bg);\r\n border-bottom: 0.5px solid var(--md-modal-header-border);\r\n cursor: default;\r\n user-select: none;\r\n -webkit-user-select: none;\r\n flex-shrink: 0;\r\n }\r\n\r\n .traffic-lights {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n margin-right: var(--md-spacing-md);\r\n }\r\n\r\n .traffic-light {\r\n width: 12px;\r\n height: 12px;\r\n border-radius: 50%;\r\n cursor: pointer;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n transition: filter var(--md-transition-fast);\r\n border: 0.5px solid var(--md-modal-traffic-border);\r\n }\r\n\r\n .traffic-light:hover {\r\n filter: brightness(0.85);\r\n }\r\n\r\n .traffic-light svg {\r\n width: 8px;\r\n height: 8px;\r\n opacity: 0;\r\n transition: opacity var(--md-transition-fast);\r\n }\r\n\r\n .titlebar:hover .traffic-light svg {\r\n opacity: 1;\r\n }\r\n\r\n .traffic-light--close {\r\n background: var(--md-modal-traffic-close-bg);\r\n }\r\n\r\n .traffic-light--minimize {\r\n background: var(--md-modal-traffic-minimize-bg);\r\n }\r\n\r\n .traffic-light--maximize {\r\n background: var(--md-modal-traffic-maximize-bg);\r\n }\r\n\r\n .title {\r\n flex: 1;\r\n text-align: var(--md-modal-title-align);\r\n font-size: var(--md-modal-title-font-size);\r\n font-weight: 500;\r\n color: var(--md-modal-title-color);\r\n letter-spacing: -0.01em;\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n }\r\n\r\n .titlebar-spacer {\r\n width: 54px;\r\n flex-shrink: 0;\r\n }\r\n\r\n /* ─── 内容区 ─── */\r\n\r\n .body {\r\n flex: 1;\r\n overflow: auto;\r\n padding: var(--md-modal-body-padding);\r\n color: var(--md-modal-title-color);\r\n font-size: var(--md-modal-body-font-size);\r\n line-height: 1.5;\r\n }\r\n\r\n /* ─── 底部 ─── */\r\n\r\n .footer {\r\n display: flex;\r\n align-items: center;\r\n justify-content: flex-end;\r\n padding: var(--md-modal-footer-padding);\r\n background: var(--md-modal-footer-bg);\r\n border-top: 0.5px solid var(--md-modal-footer-border);\r\n font-size: var(--md-modal-footer-font-size);\r\n color: var(--md-modal-footer-color);\r\n flex-shrink: 0;\r\n gap: var(--md-modal-footer-btn-gap);\r\n }\r\n\r\n .footer-actions {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--md-modal-footer-btn-gap);\r\n }\r\n\r\n .footer-btn {\r\n padding: var(--md-modal-footer-btn-padding);\r\n border-radius: var(--md-modal-footer-btn-radius);\r\n font-size: var(--md-modal-footer-btn-font-size);\r\n font-family: inherit;\r\n cursor: pointer;\r\n transition: background var(--md-transition-fast);\r\n border: none;\r\n outline: none;\r\n }\r\n\r\n .footer-btn--cancel {\r\n background: var(--md-modal-footer-cancel-bg);\r\n border: 0.5px solid var(--md-modal-footer-cancel-border);\r\n color: var(--md-modal-footer-cancel-color);\r\n }\r\n\r\n .footer-btn--cancel:hover {\r\n background: var(--md-modal-footer-cancel-hover-bg);\r\n }\r\n\r\n .footer-btn--ok {\r\n background: var(--md-modal-footer-ok-bg);\r\n color: var(--md-modal-footer-ok-color);\r\n }\r\n\r\n .footer-btn--ok:hover {\r\n background: var(--md-modal-footer-ok-hover-bg);\r\n }\r\n\r\n ::slotted([slot='footer']) {\r\n display: contents;\r\n }\r\n\r\n /* ─── 调整大小手柄 ─── */\r\n\r\n .resize-handle {\r\n position: absolute;\r\n right: 0;\r\n bottom: 0;\r\n width: 16px;\r\n height: 16px;\r\n cursor: nwse-resize;\r\n z-index: 10;\r\n }\r\n\r\n .resize-handle::after {\r\n content: '';\r\n position: absolute;\r\n right: 4px;\r\n bottom: 4px;\r\n width: 8px;\r\n height: 8px;\r\n border-right: 2px solid var(--md-modal-resize-border);\r\n border-bottom: 2px solid var(--md-modal-resize-border);\r\n }\r\n\r\n /* ─── 边缘调整大小手柄 ─── */\r\n\r\n .resize-n {\r\n position: absolute;\r\n top: 0;\r\n left: 8px;\r\n right: 8px;\r\n height: 4px;\r\n cursor: ns-resize;\r\n }\r\n\r\n .resize-s {\r\n position: absolute;\r\n bottom: 0;\r\n left: 8px;\r\n right: 8px;\r\n height: 4px;\r\n cursor: ns-resize;\r\n }\r\n\r\n .resize-e {\r\n position: absolute;\r\n top: 8px;\r\n right: 0;\r\n bottom: 8px;\r\n width: 4px;\r\n cursor: ew-resize;\r\n }\r\n\r\n .resize-w {\r\n position: absolute;\r\n top: 8px;\r\n left: 0;\r\n bottom: 8px;\r\n width: 4px;\r\n cursor: ew-resize;\r\n }\r\n\r\n .resize-ne {\r\n position: absolute;\r\n top: 0;\r\n right: 0;\r\n width: 8px;\r\n height: 8px;\r\n cursor: nesw-resize;\r\n }\r\n\r\n .resize-nw {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n width: 8px;\r\n height: 8px;\r\n cursor: nwse-resize;\r\n }\r\n\r\n .resize-se {\r\n position: absolute;\r\n right: 0;\r\n bottom: 0;\r\n width: 16px;\r\n height: 16px;\r\n cursor: nwse-resize;\r\n }\r\n\r\n .resize-sw {\r\n position: absolute;\r\n bottom: 0;\r\n left: 0;\r\n width: 8px;\r\n height: 8px;\r\n cursor: nesw-resize;\r\n }\r\n\r\n /* ─── 最小化 ─── */\r\n\r\n :host([minimized]) .body,\r\n :host([minimized]) .footer {\r\n display: none;\r\n }\r\n\r\n /* ─── 最大化 ─── */\r\n\r\n :host([maximized]) {\r\n border-radius: 0;\r\n }\r\n\r\n :host([maximized]) .modal {\r\n border-radius: 0;\r\n }\r\n\r\n :host([maximized]) .resize-handle,\r\n :host([maximized]) .resize-n,\r\n :host([maximized]) .resize-s,\r\n :host([maximized]) .resize-e,\r\n :host([maximized]) .resize-w,\r\n :host([maximized]) .resize-ne,\r\n :host([maximized]) .resize-nw,\r\n :host([maximized]) .resize-se,\r\n :host([maximized]) .resize-sw {\r\n display: none;\r\n }\r\n\r\n /* ─── 非激活状态 ─── */\r\n\r\n :host(:not([active])) .titlebar {\r\n background: rgba(255, 255, 255, 0.03);\r\n }\r\n\r\n :host(:not([active])) .traffic-light {\r\n background: var(--md-modal-traffic-inactive-bg) !important;\r\n }\r\n\r\n :host(:not([active])) .traffic-light svg {\r\n opacity: 0 !important;\r\n }\r\n\r\n :host(:not([active])) .title {\r\n color: var(--md-modal-title-inactive-color);\r\n }\r\n\r\n /* ─── 深色模式 ─── */\r\n\r\n :host([data-theme='dark']) {\r\n box-shadow: var(--md-modal-container-dark-shadow);\r\n }\r\n\r\n :host([data-theme='dark']) .modal {\r\n background: var(--md-modal-container-dark-bg);\r\n }\r\n\r\n :host([data-theme='dark']) .titlebar {\r\n background: var(--md-modal-header-dark-bg);\r\n border-bottom-color: var(--md-modal-header-dark-border);\r\n }\r\n\r\n :host([data-theme='dark']) .title {\r\n color: var(--md-modal-title-dark-color);\r\n }\r\n\r\n :host([data-theme='dark']) .body {\r\n color: var(--md-modal-body-dark-color);\r\n }\r\n\r\n :host([data-theme='dark']) .footer {\r\n background: var(--md-modal-footer-dark-bg);\r\n border-top-color: var(--md-modal-footer-dark-border);\r\n color: var(--md-modal-footer-dark-color);\r\n }\r\n\r\n :host([data-theme='dark']) .footer-btn--cancel {\r\n background: var(--md-modal-footer-cancel-dark-bg);\r\n border-color: var(--md-modal-footer-cancel-dark-border);\r\n color: var(--md-modal-footer-cancel-dark-color);\r\n }\r\n\r\n :host([data-theme='dark']) .footer-btn--cancel:hover {\r\n background: var(--md-modal-footer-cancel-dark-hover-bg);\r\n }\r\n\r\n :host([data-theme='dark']) .footer-btn--ok:hover {\r\n background: var(--md-modal-footer-ok-dark-hover-bg);\r\n }\r\n\r\n :host([data-theme='dark']:not([active])) .titlebar {\r\n background: rgba(255, 255, 255, 0.02);\r\n }\r\n\r\n :host([data-theme='dark']:not([active])) .title {\r\n color: var(--md-modal-title-dark-inactive-color);\r\n }\r\n\r\n :host([data-theme='dark']) .resize-handle::after {\r\n border-right-color: var(--md-modal-resize-dark-border);\r\n border-bottom-color: var(--md-modal-resize-dark-border);\r\n }\r\n\r\n /* ─── 浅色模式(通过 data-theme=\"light\" 手动设置,覆盖系统深色模式) ─── */\r\n\r\n :host([data-theme='light']) .titlebar {\r\n background: var(--md-modal-header-bg);\r\n border-bottom-color: var(--md-modal-header-border);\r\n }\r\n\r\n :host([data-theme='light']) .title {\r\n color: var(--md-modal-title-color);\r\n }\r\n\r\n :host([data-theme='light']) .body {\r\n color: var(--md-modal-title-color);\r\n }\r\n\r\n :host([data-theme='light']:not([active])) .titlebar {\r\n background: rgba(255, 255, 255, 0.03);\r\n }\r\n\r\n :host([data-theme='light']:not([active])) .title {\r\n color: var(--md-modal-title-inactive-color);\r\n }\r\n\r\n :host([data-theme='light']) .resize-handle::after {\r\n border-right-color: var(--md-modal-resize-border);\r\n border-bottom-color: var(--md-modal-resize-border);\r\n }\r\n\r\n /* ─── 响应式:移动端全屏化 ─── */\r\n @media (max-width: 768px) {\r\n :host {\r\n /* 占满视口,预留安全区 */\r\n top: var(--md-safe-area-top, 0px);\r\n left: var(--md-safe-area-left, 0px);\r\n right: var(--md-safe-area-right, 0px);\r\n bottom: var(--md-safe-area-bottom, 0px);\r\n width: auto;\r\n max-width: 100%;\r\n max-height: 100%;\r\n border-radius: 0;\r\n }\r\n\r\n :host .modal {\r\n border-radius: 0;\r\n }\r\n\r\n /* 触屏无需调整尺寸手柄 */\r\n .resize-handle,\r\n .resize-n,\r\n .resize-s,\r\n .resize-e,\r\n .resize-w,\r\n .resize-ne,\r\n .resize-nw,\r\n .resize-se,\r\n .resize-sw {\r\n display: none;\r\n }\r\n\r\n /* 标题栏增高以适配触控 */\r\n .traffic-lights {\r\n gap: 10px;\r\n }\r\n\r\n .traffic-light {\r\n width: 14px;\r\n height: 14px;\r\n }\r\n\r\n .traffic-light svg {\r\n width: 9px;\r\n height: 9px;\r\n }\r\n\r\n .titlebar-spacer {\r\n width: 64px;\r\n }\r\n\r\n /* 底部按钮拉宽,便于点击 */\r\n .footer {\r\n padding-top: var(--md-spacing-sm);\r\n padding-bottom: var(--md-spacing-sm);\r\n }\r\n\r\n .footer-btn {\r\n min-height: 40px;\r\n }\r\n }\r\n `,\r\n ]\r\n\r\n /** 模态框标题 */\r\n @property({ reflect: true }) title = ''\r\n\r\n /** 模态框标题文本对齐方式 */\r\n @property({ reflect: true }) titleAlign = 'center'\r\n\r\n override willUpdate(): void {\r\n const theme = this._resolvedTheme\r\n if (theme) {\r\n this.setAttribute('data-theme', theme)\r\n } else {\r\n this.removeAttribute('data-theme')\r\n }\r\n this.style.setProperty('--md-modal-title-align', this.titleAlign)\r\n }\r\n\r\n override updated(changed: Map<string, unknown>): void {\r\n if (changed.has('x') || changed.has('y')) {\r\n this._updatePosition()\r\n }\r\n if (changed.has('width') || changed.has('height')) {\r\n this._updateSize()\r\n }\r\n }\r\n\r\n /** 模态框左侧位置 */\r\n @property({ type: Number }) x = 100\r\n\r\n /** 模态框顶部位置 */\r\n @property({ type: Number }) y = 100\r\n\r\n /** 模态框宽度 */\r\n @property({ type: Number }) width = 480\r\n\r\n /** 模态框高度 */\r\n @property({ type: Number }) height = 360\r\n\r\n /** 模态框是否激活(聚焦) */\r\n @property({ type: Boolean, reflect: true }) active = true\r\n\r\n /** 模态框是否可拖拽 */\r\n @property({ type: Boolean }) draggable = true\r\n\r\n /** 模态框是否可调整大小 */\r\n @property({ type: Boolean }) resizable = true\r\n\r\n /** 是否显示红绿灯按钮 */\r\n @property({ type: Boolean }) showButtons = true\r\n\r\n /** 是否显示底部区域 */\r\n @property({ type: Boolean }) showFooter = true\r\n\r\n /** 调整大小时的最小宽度 */\r\n @property({ type: Number }) minWidth = 280\r\n\r\n /** 调整大小时的最小高度 */\r\n @property({ type: Number }) minHeight = 160\r\n\r\n /** 模态框是否最小化 */\r\n @property({ type: Boolean, reflect: true }) minimized = false\r\n\r\n /** 模态框是否最大化 */\r\n @property({ type: Boolean, reflect: true }) maximized = false\r\n\r\n // 拖拽状态\r\n private _isDragging = false\r\n private _dragStartX = 0\r\n private _dragStartY = 0\r\n private _dragOffsetX = 0\r\n private _dragOffsetY = 0\r\n\r\n // 调整大小状态\r\n private _isResizing = false\r\n private _resizeDir = ''\r\n private _resizeStartX = 0\r\n private _resizeStartY = 0\r\n private _resizeStartW = 0\r\n private _resizeStartH = 0\r\n private _resizeStartLeft = 0\r\n private _resizeStartTop = 0\r\n\r\n // 拖拽/调整大小清理\r\n private _dragCleanup: (() => void) | null = null\r\n private _resizeCleanup: (() => void) | null = null\r\n\r\n // 最小化/最大化恢复时保存的状态\r\n private _prevX = 100\r\n private _prevY = 100\r\n private _prevWidth = 480\r\n private _prevHeight = 360\r\n\r\n private _onWindowResize = () => {\r\n if (this.maximized) {\r\n this.width = window.innerWidth\r\n this.height = window.innerHeight\r\n }\r\n }\r\n\r\n override connectedCallback(): void {\r\n super.connectedCallback()\r\n this._updatePosition()\r\n this._updateSize()\r\n window.addEventListener('resize', this._onWindowResize)\r\n }\r\n\r\n override disconnectedCallback(): void {\r\n super.disconnectedCallback()\r\n this._dragCleanup?.()\r\n this._resizeCleanup?.()\r\n window.removeEventListener('resize', this._onWindowResize)\r\n }\r\n\r\n private _updatePosition(): void {\r\n this.style.left = `${this.x}px`\r\n this.style.top = `${this.y}px`\r\n }\r\n\r\n private _updateSize(): void {\r\n this.style.width = `${this.width}px`\r\n this.style.height = `${this.height}px`\r\n }\r\n\r\n // ─── 拖拽 ───\r\n\r\n private _onTitleBarMouseDown(e: MouseEvent): void {\r\n if (!this.draggable || e.button !== 0 || this.maximized) return\r\n // 忽略红绿灯按钮上的点击\r\n if ((e.target as HTMLElement).closest('.traffic-light')) return\r\n\r\n e.preventDefault()\r\n this._isDragging = true\r\n this._dragStartX = e.clientX\r\n this._dragStartY = e.clientY\r\n this._dragOffsetX = this.x\r\n this._dragOffsetY = this.y\r\n\r\n this.emit('mac-modal-focus')\r\n\r\n const onMove = (ev: MouseEvent) => {\r\n if (!this._isDragging) return\r\n const dx = ev.clientX - this._dragStartX\r\n const dy = ev.clientY - this._dragStartY\r\n this.x = this._dragOffsetX + dx\r\n this.y = this._dragOffsetY + dy\r\n this.emit('mac-modal-move', { detail: { x: this.x, y: this.y } })\r\n }\r\n\r\n const onUp = () => {\r\n this._isDragging = false\r\n document.removeEventListener('mousemove', onMove)\r\n document.removeEventListener('mouseup', onUp)\r\n this._dragCleanup = null\r\n }\r\n\r\n document.addEventListener('mousemove', onMove)\r\n document.addEventListener('mouseup', onUp)\r\n this._dragCleanup = onUp\r\n }\r\n\r\n // ─── 调整大小 ───\r\n\r\n private _onResizeMouseDown(dir: string, e: MouseEvent): void {\r\n if (!this.resizable || e.button !== 0) return\r\n e.preventDefault()\r\n e.stopPropagation()\r\n\r\n this._isResizing = true\r\n this._resizeDir = dir\r\n this._resizeStartX = e.clientX\r\n this._resizeStartY = e.clientY\r\n this._resizeStartW = this.width\r\n this._resizeStartH = this.height\r\n this._resizeStartLeft = this.x\r\n this._resizeStartTop = this.y\r\n\r\n const onMove = (ev: MouseEvent) => {\r\n if (!this._isResizing) return\r\n const dx = ev.clientX - this._resizeStartX\r\n const dy = ev.clientY - this._resizeStartY\r\n const dir = this._resizeDir\r\n\r\n let newW = this._resizeStartW\r\n let newH = this._resizeStartH\r\n let newX = this._resizeStartLeft\r\n let newY = this._resizeStartTop\r\n\r\n // 水平方向\r\n if (dir.includes('e')) {\r\n newW = Math.max(this.minWidth, this._resizeStartW + dx)\r\n }\r\n if (dir.includes('w')) {\r\n const proposedW = this._resizeStartW - dx\r\n if (proposedW >= this.minWidth) {\r\n newW = proposedW\r\n newX = this._resizeStartLeft + dx\r\n } else {\r\n newW = this.minWidth\r\n newX = this._resizeStartLeft + (this._resizeStartW - this.minWidth)\r\n }\r\n }\r\n\r\n // 垂直方向\r\n if (dir.includes('s')) {\r\n newH = Math.max(this.minHeight, this._resizeStartH + dy)\r\n }\r\n if (dir.includes('n')) {\r\n const proposedH = this._resizeStartH - dy\r\n if (proposedH >= this.minHeight) {\r\n newH = proposedH\r\n newY = this._resizeStartTop + dy\r\n } else {\r\n newH = this.minHeight\r\n newY = this._resizeStartTop + (this._resizeStartH - this.minHeight)\r\n }\r\n }\r\n\r\n this.width = newW\r\n this.height = newH\r\n this.x = newX\r\n this.y = newY\r\n this.emit('mac-modal-resize', { detail: { width: this.width, height: this.height } })\r\n }\r\n\r\n const onUp = () => {\r\n this._isResizing = false\r\n document.removeEventListener('mousemove', onMove)\r\n document.removeEventListener('mouseup', onUp)\r\n this._resizeCleanup = null\r\n }\r\n\r\n document.addEventListener('mousemove', onMove)\r\n document.addEventListener('mouseup', onUp)\r\n this._resizeCleanup = onUp\r\n }\r\n\r\n // ─── 红绿灯按钮 ───\r\n\r\n private _onClose(): void {\r\n this.emit('mac-modal-close')\r\n }\r\n\r\n private _onMinimize(): void {\r\n if (this.minimized) {\r\n this.minimized = false\r\n this.width = this._prevWidth\r\n this.height = this._prevHeight\r\n this.x = this._prevX\r\n this.y = this._prevY\r\n } else {\r\n if (!this.maximized) {\r\n this._prevWidth = this.width\r\n this._prevHeight = this.height\r\n this._prevX = this.x\r\n this._prevY = this.y\r\n }\r\n this.maximized = false\r\n this.minimized = true\r\n this.height = 38\r\n }\r\n this.emit('mac-modal-minimize')\r\n }\r\n\r\n private _onMaximize(): void {\r\n if (this.maximized) {\r\n this.maximized = false\r\n this.width = this._prevWidth\r\n this.height = this._prevHeight\r\n this.x = this._prevX\r\n this.y = this._prevY\r\n } else {\r\n if (!this.minimized) {\r\n this._prevWidth = this.width\r\n this._prevHeight = this.height\r\n this._prevX = this.x\r\n this._prevY = this.y\r\n }\r\n this.minimized = false\r\n this.maximized = true\r\n this.x = 0\r\n this.y = 0\r\n this.width = window.innerWidth\r\n this.height = window.innerHeight\r\n }\r\n this.emit('mac-modal-maximize')\r\n }\r\n\r\n private _onCancel(): void {\r\n this.emit('mac-modal-cancel')\r\n }\r\n\r\n private _onOk(): void {\r\n this.emit('mac-modal-ok')\r\n }\r\n\r\n // ─── 渲染 ───\r\n\r\n override render() {\r\n return html`\r\n <div class=\"modal\" part=\"base\">\r\n <div class=\"titlebar\" part=\"titlebar\" @mousedown=${this._onTitleBarMouseDown}>\r\n ${\r\n this.showButtons\r\n ? html`\r\n <div class=\"traffic-lights\">\r\n <div\r\n class=\"traffic-light traffic-light--close\"\r\n @click=${this._onClose}\r\n title=\"关闭\"\r\n >\r\n <svg viewBox=\"0 0 12 12\">\r\n <line\r\n x1=\"3\"\r\n y1=\"3\"\r\n x2=\"9\"\r\n y2=\"9\"\r\n stroke=\"var(--md-modal-traffic-close-stroke)\"\r\n stroke-width=\"1.2\"\r\n />\r\n <line\r\n x1=\"9\"\r\n y1=\"3\"\r\n x2=\"3\"\r\n y2=\"9\"\r\n stroke=\"var(--md-modal-traffic-close-stroke)\"\r\n stroke-width=\"1.2\"\r\n />\r\n </svg>\r\n </div>\r\n <div\r\n class=\"traffic-light traffic-light--minimize\"\r\n @click=${this._onMinimize}\r\n title=${this.minimized ? '恢复' : '最小化'}\r\n >\r\n <svg viewBox=\"0 0 12 12\">\r\n <line\r\n x1=\"3\"\r\n y1=\"6\"\r\n x2=\"9\"\r\n y2=\"6\"\r\n stroke=\"var(--md-modal-traffic-minimize-stroke)\"\r\n stroke-width=\"1.2\"\r\n />\r\n </svg>\r\n </div>\r\n <div\r\n class=\"traffic-light traffic-light--maximize\"\r\n @click=${this._onMaximize}\r\n title=${this.maximized ? '恢复' : '全屏'}\r\n >\r\n ${\r\n this.maximized\r\n ? html`\r\n <svg viewBox=\"0 0 12 12\">\r\n <polyline\r\n points=\"7.5,2 10,2 10,4.5\"\r\n fill=\"none\"\r\n stroke=\"var(--md-modal-traffic-maximize-stroke)\"\r\n stroke-width=\"1.2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n <polyline\r\n points=\"4.5,10 2,10 2,7.5\"\r\n fill=\"none\"\r\n stroke=\"var(--md-modal-traffic-maximize-stroke)\"\r\n stroke-width=\"1.2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n `\r\n : html`\r\n <svg viewBox=\"0 0 12 12\">\r\n <polyline\r\n points=\"4.5,2 2,2 2,4.5\"\r\n fill=\"none\"\r\n stroke=\"var(--md-modal-traffic-maximize-stroke)\"\r\n stroke-width=\"1.2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n <polyline\r\n points=\"7.5,10 10,10 10,7.5\"\r\n fill=\"none\"\r\n stroke=\"var(--md-modal-traffic-maximize-stroke)\"\r\n stroke-width=\"1.2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n `\r\n }\r\n </div>\r\n </div>\r\n `\r\n : ''\r\n }\r\n <div class=\"title\" part=\"title\">${this.title}</div>\r\n ${this.showButtons ? html`<div class=\"titlebar-spacer\"></div>` : ''}\r\n </div>\r\n\r\n <div class=\"body\" part=\"body\">\r\n <slot></slot>\r\n </div>\r\n\r\n ${\r\n this.showFooter\r\n ? html`\r\n <div class=\"footer\" part=\"footer\">\r\n <slot name=\"footer\">\r\n <div class=\"footer-actions\">\r\n <button class=\"footer-btn footer-btn--cancel\" @click=${this._onCancel}>\r\n 取消\r\n </button>\r\n <button class=\"footer-btn footer-btn--ok\" @click=${this._onOk}>确认</button>\r\n </div>\r\n </slot>\r\n </div>\r\n `\r\n : ''\r\n }\r\n ${\r\n this.resizable\r\n ? html`\r\n <div\r\n class=\"resize-n\"\r\n @mousedown=${(e: MouseEvent) => this._onResizeMouseDown('n', e)}\r\n ></div>\r\n <div\r\n class=\"resize-s\"\r\n @mousedown=${(e: MouseEvent) => this._onResizeMouseDown('s', e)}\r\n ></div>\r\n <div\r\n class=\"resize-e\"\r\n @mousedown=${(e: MouseEvent) => this._onResizeMouseDown('e', e)}\r\n ></div>\r\n <div\r\n class=\"resize-w\"\r\n @mousedown=${(e: MouseEvent) => this._onResizeMouseDown('w', e)}\r\n ></div>\r\n <div\r\n class=\"resize-ne\"\r\n @mousedown=${(e: MouseEvent) => this._onResizeMouseDown('ne', e)}\r\n ></div>\r\n <div\r\n class=\"resize-nw\"\r\n @mousedown=${(e: MouseEvent) => this._onResizeMouseDown('nw', e)}\r\n ></div>\r\n <div\r\n class=\"resize-se\"\r\n @mousedown=${(e: MouseEvent) => this._onResizeMouseDown('se', e)}\r\n ></div>\r\n <div\r\n class=\"resize-sw\"\r\n @mousedown=${(e: MouseEvent) => this._onResizeMouseDown('sw', e)}\r\n ></div>\r\n <div\r\n class=\"resize-handle\"\r\n part=\"resize-handle\"\r\n @mousedown=${(e: MouseEvent) => this._onResizeMouseDown('se', e)}\r\n ></div>\r\n `\r\n : ''\r\n }\r\n </div>\r\n `\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'mac-modal': MacModal\r\n }\r\n}\r\n","import { html, css } from 'lit'\r\nimport { property, customElement } from 'lit/decorators.js'\r\nimport { BaseElement } from '../../internal/base-element'\r\nimport { booleanAttribute } from '../../internal/property-converters'\r\nimport { sharedStyles } from '../../styles/shared-styles'\r\nimport { themeTokens } from '../../styles/theme'\r\n\r\nexport interface ConfirmOptions {\r\n title?: string\r\n content?: string\r\n confirmText?: string\r\n cancelText?: string\r\n danger?: boolean\r\n showIcon?: boolean\r\n width?: string | number\r\n maskClosable?: boolean\r\n theme?: 'light' | 'dark'\r\n titleAlign?: 'left' | 'center' | 'right'\r\n showDivider?: boolean\r\n onOk?: () => void\r\n onCancel?: () => void\r\n}\r\n\r\n/**\r\n * @tag mac-confirm\r\n * @summary 带遮罩和居中内容的 macOS 风格确认对话框。\r\n *\r\n * @slot - 对话框主体内容(替换 content 属性)。\r\n * @slot footer - 自定义底部内容(替换默认按钮)。\r\n *\r\n * @csspart mask - 遮罩/覆盖层元素。\r\n * @csspart container - 对话框容器。\r\n * @csspart title - 标题文本。\r\n * @csspart body - 主体内容区域。\r\n * @csspart footer - 底部区域。\r\n *\r\n * @event mac-confirm-open - 对话框打开时触发。\r\n * @event mac-confirm-close - 对话框关闭时触发。\r\n * @event mac-confirm-ok - 点击确定按钮时触发。\r\n * @event mac-confirm-cancel - 点击取消按钮时触发。\r\n */\r\n@customElement('mac-confirm')\r\nexport class MacConfirm extends BaseElement {\r\n static override styles = [\r\n themeTokens,\r\n sharedStyles,\r\n css`\r\n :host {\r\n display: none;\r\n position: fixed;\r\n inset: 0;\r\n z-index: 99999;\r\n align-items: center;\r\n justify-content: center;\r\n font-family: var(--md-font-family);\r\n }\r\n\r\n :host([visible]) {\r\n display: flex;\r\n }\r\n\r\n .mask {\r\n position: absolute;\r\n inset: 0;\r\n background: var(--md-confirm-mask-bg);\r\n opacity: 0;\r\n transition: opacity var(--md-transition-normal);\r\n }\r\n\r\n :host([visible]) .mask {\r\n opacity: 1;\r\n }\r\n\r\n .container {\r\n position: relative;\r\n display: flex;\r\n flex-direction: column;\r\n width: var(--md-confirm-width);\r\n max-width: calc(100vw - 32px);\r\n max-height: calc(100vh - 32px);\r\n background: var(--md-confirm-bg);\r\n backdrop-filter: blur(var(--md-glass-blur)) saturate(var(--md-glass-saturate));\r\n -webkit-backdrop-filter: blur(var(--md-glass-blur)) saturate(var(--md-glass-saturate));\r\n border-radius: var(--md-confirm-radius);\r\n box-shadow: var(--md-confirm-shadow);\r\n border: 0.5px solid var(--md-confirm-border);\r\n overflow: hidden;\r\n transform: scale(0.92);\r\n opacity: 0;\r\n transition:\r\n transform var(--md-transition-normal),\r\n opacity var(--md-transition-normal);\r\n }\r\n\r\n :host([visible]) .container {\r\n transform: scale(1);\r\n opacity: 1;\r\n }\r\n\r\n /* 标题 */\r\n .titlebar {\r\n display: flex;\r\n align-items: center;\r\n padding: var(--md-confirm-title-padding);\r\n border-bottom: 0.5px solid transparent;\r\n min-height: 44px;\r\n gap: 8px;\r\n }\r\n\r\n .titlebar--divided {\r\n border-bottom-color: var(--md-confirm-title-border);\r\n }\r\n\r\n .titlebar--left {\r\n justify-content: flex-start;\r\n }\r\n\r\n .titlebar--center {\r\n justify-content: center;\r\n }\r\n\r\n .titlebar--right {\r\n justify-content: flex-end;\r\n }\r\n\r\n .titlebar-icon {\r\n flex-shrink: 0;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 20px;\r\n height: 20px;\r\n color: var(--md-confirm-icon-color);\r\n }\r\n\r\n .titlebar-icon svg {\r\n width: 20px;\r\n height: 20px;\r\n }\r\n\r\n .titlebar-icon--danger {\r\n color: var(--md-color-danger);\r\n }\r\n\r\n .title {\r\n font-size: var(--md-confirm-title-font-size);\r\n font-weight: 500;\r\n color: var(--md-confirm-title-color);\r\n line-height: 1.4;\r\n }\r\n\r\n /* 主体 */\r\n .body {\r\n flex: 1;\r\n overflow: auto;\r\n padding: var(--md-confirm-body-padding);\r\n color: var(--md-confirm-body-color);\r\n font-size: var(--md-confirm-body-font-size);\r\n line-height: 1.6;\r\n }\r\n\r\n /* 底部 */\r\n .footer {\r\n display: flex;\r\n align-items: center;\r\n justify-content: flex-end;\r\n padding: var(--md-confirm-footer-padding);\r\n border-top: 0.5px solid transparent;\r\n gap: var(--md-confirm-btn-gap);\r\n flex-shrink: 0;\r\n }\r\n\r\n .footer--divided {\r\n border-top-color: var(--md-confirm-footer-border);\r\n }\r\n\r\n .footer-btn {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n padding: var(--md-confirm-btn-padding);\r\n border-radius: var(--md-confirm-btn-radius);\r\n font-size: var(--md-confirm-btn-font-size);\r\n font-family: inherit;\r\n cursor: pointer;\r\n transition:\r\n background var(--md-transition-fast),\r\n border-color var(--md-transition-fast);\r\n border: 0.5px solid transparent;\r\n outline: none;\r\n white-space: nowrap;\r\n line-height: 1.5;\r\n }\r\n\r\n .footer-btn--cancel {\r\n background: var(--md-confirm-cancel-bg);\r\n border-color: var(--md-confirm-cancel-border);\r\n color: var(--md-confirm-cancel-color);\r\n }\r\n\r\n .footer-btn--cancel:hover {\r\n background: var(--md-confirm-cancel-hover-bg);\r\n }\r\n\r\n .footer-btn--ok {\r\n background: var(--md-confirm-ok-bg);\r\n color: var(--md-confirm-ok-color);\r\n border-color: transparent;\r\n }\r\n\r\n .footer-btn--ok:hover {\r\n background: var(--md-confirm-ok-hover-bg);\r\n }\r\n\r\n .footer-btn--danger {\r\n background: var(--md-confirm-danger-bg);\r\n color: var(--md-confirm-danger-color);\r\n }\r\n\r\n .footer-btn--danger:hover {\r\n background: var(--md-confirm-danger-hover-bg);\r\n }\r\n\r\n /* 暗黑模式 */\r\n :host([data-theme='dark']) .container {\r\n background: var(--md-confirm-dark-bg);\r\n box-shadow: var(--md-confirm-dark-shadow);\r\n border-color: var(--md-confirm-dark-border);\r\n }\r\n\r\n :host([data-theme='dark']) .title {\r\n color: var(--md-confirm-dark-title-color);\r\n }\r\n\r\n :host([data-theme='dark']) .body {\r\n color: var(--md-confirm-dark-body-color);\r\n }\r\n\r\n :host([data-theme='dark']) .titlebar--divided {\r\n border-bottom-color: var(--md-confirm-dark-title-border);\r\n }\r\n\r\n :host([data-theme='dark']) .footer--divided {\r\n border-top-color: var(--md-confirm-dark-footer-border);\r\n }\r\n\r\n :host([data-theme='dark']) .footer-btn--cancel {\r\n background: var(--md-confirm-dark-cancel-bg);\r\n border-color: var(--md-confirm-dark-cancel-border);\r\n color: var(--md-confirm-dark-cancel-color);\r\n }\r\n\r\n :host([data-theme='dark']) .footer-btn--cancel:hover {\r\n background: var(--md-confirm-dark-cancel-hover-bg);\r\n }\r\n\r\n :host([data-theme='dark']) .footer-btn--ok:hover {\r\n background: var(--md-confirm-dark-ok-hover-bg);\r\n }\r\n `,\r\n ]\r\n\r\n /** 对话框标题文本 */\r\n @property({ reflect: true }) title = ''\r\n\r\n /** 对话框标题对齐方式:left | center | right */\r\n @property({ reflect: true }) titleAlign: 'left' | 'center' | 'right' = 'left'\r\n\r\n /** 对话框主体内容文本 */\r\n @property() content = ''\r\n\r\n /** 确认按钮文本 */\r\n @property({ attribute: 'confirm-text' }) confirmText = '确认'\r\n\r\n /** 取消按钮文本 */\r\n @property({ attribute: 'cancel-text' }) cancelText = '取消'\r\n\r\n /** 确认按钮是否使用危险样式 */\r\n @property({ type: Boolean }) danger = false\r\n\r\n /** 是否显示图标 */\r\n @property({ type: Boolean, attribute: 'show-icon' }) showIcon = true\r\n\r\n /** 对话框宽度,例如 '420px' 或 420 */\r\n @property() width: string | number = '420px'\r\n\r\n /** 对话框是否可见 */\r\n @property({ type: Boolean, reflect: true }) visible = false\r\n\r\n /** 点击遮罩是否关闭对话框 */\r\n @property({ type: Boolean, attribute: 'mask-closable' }) maskClosable = true\r\n\r\n /** 是否在标题/主体和主体/底部之间显示分隔线 */\r\n @property({ converter: booleanAttribute, attribute: 'show-divider', reflect: true }) showDivider =\r\n true\r\n\r\n override willUpdate(): void {\r\n const theme = this._resolvedTheme\r\n if (theme) {\r\n this.setAttribute('data-theme', theme)\r\n } else {\r\n this.removeAttribute('data-theme')\r\n }\r\n }\r\n\r\n override connectedCallback(): void {\r\n super.connectedCallback()\r\n document.addEventListener('keydown', this._handleKeyDown)\r\n }\r\n\r\n override disconnectedCallback(): void {\r\n super.disconnectedCallback()\r\n document.removeEventListener('keydown', this._handleKeyDown)\r\n }\r\n\r\n private _handleKeyDown = (e: KeyboardEvent): void => {\r\n if (e.key === 'Escape' && this.visible) {\r\n e.preventDefault()\r\n this._cancel()\r\n }\r\n }\r\n\r\n private _onMaskClick(): void {\r\n if (this.maskClosable) {\r\n this._cancel()\r\n }\r\n }\r\n\r\n private _onOk(): void {\r\n this.emit('mac-confirm-ok')\r\n this.close()\r\n }\r\n\r\n private _onCancel(): void {\r\n this._cancel()\r\n }\r\n\r\n private _cancel(): void {\r\n this.emit('mac-confirm-cancel')\r\n this.close()\r\n }\r\n\r\n /** 打开对话框 */\r\n open(): void {\r\n if (this.visible) return\r\n this.visible = true\r\n this.emit('mac-confirm-open')\r\n }\r\n\r\n /** 关闭对话框 */\r\n close(): void {\r\n if (!this.visible) return\r\n this.visible = false\r\n this.emit('mac-confirm-close')\r\n }\r\n\r\n private _resolvedWidth(): string {\r\n const w = this.width\r\n if (typeof w === 'number') return `${w}px`\r\n return w\r\n }\r\n\r\n // ─── 静态命令式 API ───\r\n\r\n private static _activeInstance: MacConfirm | null = null\r\n\r\n /**\r\n * 以命令式方式打开确认对话框。\r\n * 返回一个 Promise,解析为 true(确定)或 false(取消)。\r\n */\r\n static open(options: ConfirmOptions): Promise<boolean> {\r\n return new Promise((resolve) => {\r\n MacConfirm.close()\r\n\r\n const el = document.createElement('mac-confirm') as MacConfirm\r\n if (options.title !== undefined) el.title = options.title\r\n if (options.content !== undefined) el.content = options.content\r\n if (options.confirmText !== undefined) el.confirmText = options.confirmText\r\n if (options.cancelText !== undefined) el.cancelText = options.cancelText\r\n if (options.danger !== undefined) el.danger = options.danger\r\n if (options.showIcon !== undefined) el.showIcon = options.showIcon\r\n if (options.width !== undefined) el.width = options.width\r\n if (options.maskClosable !== undefined) el.maskClosable = options.maskClosable\r\n if (options.theme !== undefined) el.theme = options.theme\r\n if (options.titleAlign !== undefined) el.titleAlign = options.titleAlign\r\n if (options.showDivider !== undefined) el.showDivider = options.showDivider\r\n\r\n const onOk = () => {\r\n cleanup()\r\n options.onOk?.()\r\n resolve(true)\r\n }\r\n const onCancel = () => {\r\n cleanup()\r\n options.onCancel?.()\r\n resolve(false)\r\n }\r\n const onClose = () => {\r\n // 如果未明确点击确定/取消而关闭(例如点击遮罩),则视为取消\r\n setTimeout(() => {\r\n if (MacConfirm._activeInstance === el) {\r\n cleanup()\r\n options.onCancel?.()\r\n resolve(false)\r\n }\r\n }, 0)\r\n }\r\n\r\n const cleanup = () => {\r\n el.removeEventListener('mac-confirm-ok', onOk)\r\n el.removeEventListener('mac-confirm-cancel', onCancel)\r\n el.removeEventListener('mac-confirm-close', onClose)\r\n if (el.parentNode) {\r\n el.parentNode.removeChild(el)\r\n }\r\n if (MacConfirm._activeInstance === el) {\r\n MacConfirm._activeInstance = null\r\n }\r\n }\r\n\r\n el.addEventListener('mac-confirm-ok', onOk)\r\n el.addEventListener('mac-confirm-cancel', onCancel)\r\n el.addEventListener('mac-confirm-close', onClose)\r\n\r\n document.body.appendChild(el)\r\n MacConfirm._activeInstance = el\r\n el.open()\r\n })\r\n }\r\n\r\n /** 关闭当前活动的命令式对话框 */\r\n static close(): void {\r\n if (MacConfirm._activeInstance) {\r\n MacConfirm._activeInstance.close()\r\n if (MacConfirm._activeInstance.parentNode) {\r\n MacConfirm._activeInstance.parentNode.removeChild(MacConfirm._activeInstance)\r\n }\r\n MacConfirm._activeInstance = null\r\n }\r\n }\r\n\r\n override render() {\r\n const width = this._resolvedWidth()\r\n\r\n return html`\r\n <div class=\"mask\" part=\"mask\" @click=${this._onMaskClick}></div>\r\n <div class=\"container\" part=\"container\" style=\"--md-confirm-width: ${width}\">\r\n ${\r\n this.title\r\n ? html`\r\n <div\r\n class=\"titlebar titlebar--${this.titleAlign} ${\r\n this.showDivider ? 'titlebar--divided' : ''\r\n }\"\r\n part=\"titlebar\"\r\n >\r\n ${\r\n this.showIcon\r\n ? html`\r\n <div\r\n class=\"titlebar-icon ${this.danger ? 'titlebar-icon--danger' : ''}\"\r\n part=\"titlebar-icon\"\r\n >\r\n ${\r\n this.danger\r\n ? html`<svg viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path\r\n d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm-1-13h2v6h-2zm0 8h2v2h-2z\"\r\n />\r\n </svg>`\r\n : html`<svg viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path\r\n d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm-1-13h2v6h-2zm0 8h2v2h-2z\"\r\n />\r\n </svg>`\r\n }\r\n </div>\r\n `\r\n : ''\r\n }\r\n <div class=\"title\" part=\"title\">${this.title}</div>\r\n </div>\r\n `\r\n : ''\r\n }\r\n <div class=\"body\" part=\"body\">\r\n <slot>\r\n ${this.content ? html`<div class=\"content\" part=\"content\">${this.content}</div>` : ''}\r\n </slot>\r\n </div>\r\n <div class=\"footer ${this.showDivider ? 'footer--divided' : ''}\" part=\"footer\">\r\n <slot name=\"footer\">\r\n <button class=\"footer-btn footer-btn--cancel\" @click=${this._onCancel}>\r\n ${this.cancelText}\r\n </button>\r\n <button\r\n class=\"footer-btn footer-btn--ok ${this.danger ? 'footer-btn--danger' : ''}\"\r\n @click=${this._onOk}\r\n >\r\n ${this.confirmText}\r\n </button>\r\n </slot>\r\n </div>\r\n </div>\r\n `\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'mac-confirm': MacConfirm\r\n }\r\n}\r\n","import { html, css, PropertyValues } from 'lit'\r\nimport { property, customElement, query, queryAll } from 'lit/decorators.js'\r\nimport { BaseElement } from '../../internal/base-element'\r\nimport { sharedStyles } from '../../styles/shared-styles'\r\nimport { themeTokens } from '../../styles/theme'\r\n\r\nexport interface GroupButtonItem {\r\n value: string\r\n label: string\r\n disabled?: boolean\r\n}\r\n\r\n/**\r\n * @tag mac-group-button\r\n * @summary 一个 macOS 风格的分段控制组件。\r\n *\r\n * @slot - 默认插槽,用于分组按钮项。\r\n *\r\n * @csspart container - 主容器。\r\n * @csspart slider - 滑动背景指示器。\r\n * @csspart button - 单个按钮元素。\r\n *\r\n * @event mac-change - 选中值变化时触发。\r\n */\r\n@customElement('mac-group-button')\r\nexport class MacGroupButton extends BaseElement {\r\n static override styles = [\r\n themeTokens,\r\n sharedStyles,\r\n css`\r\n :host {\r\n display: inline-block;\r\n }\r\n\r\n .group-container {\r\n position: relative;\r\n display: inline-flex;\r\n align-items: center;\r\n background: var(--md-glass-bg);\r\n backdrop-filter: blur(var(--md-glass-blur)) saturate(var(--md-glass-saturate));\r\n -webkit-backdrop-filter: blur(var(--md-glass-blur)) saturate(var(--md-glass-saturate));\r\n border: 1px solid var(--md-glass-border);\r\n border-radius: var(--md-group-button-container-radius);\r\n padding: 3px;\r\n box-shadow:\r\n inset 0 1px 0 var(--md-glass-highlight-top),\r\n inset 0 -1px 0 var(--md-glass-highlight-bottom),\r\n var(--md-shadow-menu);\r\n overflow: hidden;\r\n }\r\n\r\n .slider {\r\n position: absolute;\r\n top: 3px;\r\n left: 3px;\r\n height: calc(100% - 6px);\r\n background: var(--md-group-button-item-selected-bg);\r\n border-radius: calc(var(--md-group-button-container-radius) - 2px);\r\n box-shadow:\r\n 0 1px 3px rgba(0, 0, 0, 0.12),\r\n 0 1px 2px rgba(0, 0, 0, 0.08);\r\n transition:\r\n transform 280ms cubic-bezier(0.4, 0, 0.2, 1),\r\n width 280ms cubic-bezier(0.4, 0, 0.2, 1);\r\n will-change: transform, width;\r\n z-index: 1;\r\n }\r\n\r\n .button-wrapper {\r\n position: relative;\r\n z-index: 2;\r\n }\r\n\r\n .button {\r\n position: relative;\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n padding: var(--md-group-button-item-padding-vertical)\r\n var(--md-group-button-item-padding-horizontal);\r\n font-size: var(--md-group-button-item-font-size);\r\n font-family: var(--md-font-family);\r\n font-weight: 500;\r\n line-height: 1.4;\r\n color: var(--md-group-button-item-color);\r\n background: transparent;\r\n border: none;\r\n border-radius: calc(var(--md-group-button-container-radius) - 2px);\r\n cursor: pointer;\r\n transition:\r\n color 150ms ease,\r\n opacity 150ms ease;\r\n user-select: none;\r\n white-space: nowrap;\r\n -webkit-font-smoothing: antialiased;\r\n }\r\n\r\n .button:hover:not(.button--selected):not(:disabled) {\r\n color: var(--md-group-button-item-active-color);\r\n }\r\n\r\n .button--selected {\r\n color: var(--md-group-button-item-selected-color);\r\n text-shadow: 0 -0.5px 0 rgba(0, 0, 0, 0.15);\r\n }\r\n\r\n .button:disabled {\r\n opacity: 0.4;\r\n cursor: not-allowed;\r\n }\r\n\r\n .button:focus-visible {\r\n outline: 2px solid var(--md-group-button-item-focus-outline);\r\n outline-offset: 2px;\r\n }\r\n\r\n /* 尺寸 */\r\n :host([size='sm']) .button {\r\n padding: var(--sm-group-button-item-padding-vertical)\r\n var(--sm-group-button-item-padding-horizontal);\r\n font-size: var(--sm-group-button-item-font-size);\r\n }\r\n\r\n :host([size='lg']) .button {\r\n padding: var(--lg-group-button-item-padding-vertical)\r\n var(--lg-group-button-item-padding-horizontal);\r\n font-size: var(--lg-group-button-item-font-size);\r\n }\r\n\r\n :host([data-theme='dark']) .group-container {\r\n background: rgba(255, 255, 255, 0.08);\r\n border-color: rgba(255, 255, 255, 0.15);\r\n }\r\n\r\n :host([data-theme='dark']) .button {\r\n color: rgba(255, 255, 255, 0.85);\r\n }\r\n\r\n :host([data-theme='dark']) .button:hover:not(.button--selected):not(:disabled) {\r\n color: var(--md-mac-text-white);\r\n }\r\n `,\r\n ]\r\n\r\n /** 按钮项数组。 */\r\n @property({ type: Array }) items: GroupButtonItem[] = []\r\n\r\n /** 当前选中的值。 */\r\n @property({ reflect: true }) value = ''\r\n\r\n /** 按钮的尺寸。 */\r\n @property({ reflect: true }) size?: 'sm' | 'md' | 'lg'\r\n\r\n /** 禁用所有按钮。 */\r\n @property({ type: Boolean, reflect: true }) disabled = false\r\n\r\n @query('.slider') private slider!: HTMLElement\r\n @queryAll('.button') private buttons!: NodeListOf<HTMLButtonElement>\r\n\r\n private _selectedIndex = 0\r\n\r\n override willUpdate() {\r\n const size = this._resolvedSize\r\n if (this.getAttribute('size') !== size) {\r\n this.setAttribute('size', size)\r\n }\r\n const theme = this._resolvedTheme\r\n if (theme) {\r\n this.setAttribute('data-theme', theme)\r\n } else {\r\n this.removeAttribute('data-theme')\r\n }\r\n }\r\n\r\n protected override firstUpdated(changedProperties: PropertyValues) {\r\n super.firstUpdated(changedProperties)\r\n\r\n // 如果未提供初始值则设置\r\n this._setInitialValue()\r\n\r\n // 渲染后更新滑块位置\r\n requestAnimationFrame(() => {\r\n this._updateSliderPosition(false)\r\n })\r\n }\r\n\r\n protected override updated(changedProperties: PropertyValues) {\r\n super.updated(changedProperties)\r\n\r\n if (changedProperties.has('items')) {\r\n // 当项更新时设置初始值\r\n this._setInitialValue()\r\n }\r\n\r\n if (changedProperties.has('value') || changedProperties.has('items')) {\r\n requestAnimationFrame(() => {\r\n this._updateSliderPosition(true)\r\n })\r\n }\r\n }\r\n\r\n private _setInitialValue() {\r\n if (!this.value && this.items.length > 0) {\r\n const enabledItem = this.items.find((item) => !item.disabled)\r\n if (enabledItem) {\r\n this.value = enabledItem.value\r\n }\r\n }\r\n }\r\n\r\n private _updateSliderPosition(animate: boolean) {\r\n if (!this.slider || !this.buttons || this.buttons.length === 0) return\r\n\r\n const selectedIndex = this.items.findIndex((item) => item.value === this.value)\r\n if (selectedIndex === -1) return\r\n\r\n this._selectedIndex = selectedIndex\r\n const button = this.buttons[selectedIndex]\r\n if (!button) return\r\n\r\n if (!animate) {\r\n this.slider.style.transition = 'none'\r\n } else {\r\n this.slider.style.transition =\r\n 'transform 280ms cubic-bezier(0.4, 0, 0.2, 1), width 280ms cubic-bezier(0.4, 0, 0.2, 1)'\r\n }\r\n\r\n // 使用 offsetLeft 获取按钮相对于容器的位置\r\n const offset = button.offsetLeft\r\n\r\n this.slider.style.width = `${button.offsetWidth}px`\r\n this.slider.style.transform = `translateX(${offset}px)`\r\n\r\n // 强制重排以确保过渡动画生效\r\n if (!animate) {\r\n this.slider.offsetHeight\r\n this.slider.style.transition =\r\n 'transform 280ms cubic-bezier(0.4, 0, 0.2, 1), width 280ms cubic-bezier(0.4, 0, 0.2, 1)'\r\n }\r\n }\r\n\r\n private _handleButtonClick(item: GroupButtonItem, index: number) {\r\n if (item.disabled || this.disabled) return\r\n\r\n if (this.value !== item.value) {\r\n this.value = item.value\r\n this._selectedIndex = index\r\n this.emit('mac-change', {\r\n detail: {\r\n value: this.value,\r\n item,\r\n index,\r\n },\r\n })\r\n }\r\n }\r\n\r\n private _handleKeyDown(event: KeyboardEvent, item: GroupButtonItem, index: number) {\r\n if (this.disabled) return\r\n\r\n let newIndex: number\r\n\r\n switch (event.key) {\r\n case 'ArrowLeft':\r\n case 'ArrowUp':\r\n event.preventDefault()\r\n newIndex = this._getPreviousEnabledIndex(index)\r\n break\r\n case 'ArrowRight':\r\n case 'ArrowDown':\r\n event.preventDefault()\r\n newIndex = this._getNextEnabledIndex(index)\r\n break\r\n case 'Home':\r\n event.preventDefault()\r\n newIndex = this._getFirstEnabledIndex()\r\n break\r\n case 'End':\r\n event.preventDefault()\r\n newIndex = this._getLastEnabledIndex()\r\n break\r\n case ' ':\r\n case 'Enter':\r\n event.preventDefault()\r\n this._handleButtonClick(item, index)\r\n return\r\n default:\r\n return\r\n }\r\n\r\n if (newIndex !== index && newIndex !== -1) {\r\n const newItem = this.items[newIndex]\r\n this._handleButtonClick(newItem, newIndex)\r\n ;(this.buttons[newIndex] as HTMLButtonElement)?.focus()\r\n }\r\n }\r\n\r\n private _getPreviousEnabledIndex(currentIndex: number): number {\r\n for (let i = currentIndex - 1; i >= 0; i--) {\r\n if (!this.items[i].disabled) return i\r\n }\r\n return currentIndex\r\n }\r\n\r\n private _getNextEnabledIndex(currentIndex: number): number {\r\n for (let i = currentIndex + 1; i < this.items.length; i++) {\r\n if (!this.items[i].disabled) return i\r\n }\r\n return currentIndex\r\n }\r\n\r\n private _getFirstEnabledIndex(): number {\r\n for (let i = 0; i < this.items.length; i++) {\r\n if (!this.items[i].disabled) return i\r\n }\r\n return 0\r\n }\r\n\r\n private _getLastEnabledIndex(): number {\r\n for (let i = this.items.length - 1; i >= 0; i--) {\r\n if (!this.items[i].disabled) return i\r\n }\r\n return this.items.length - 1\r\n }\r\n\r\n override render() {\r\n return html`\r\n <div part=\"container\" class=\"group-container\" role=\"radiogroup\">\r\n <div part=\"slider\" class=\"slider\"></div>\r\n <div class=\"button-wrapper\">\r\n ${this.items.map(\r\n (item, index) => html`\r\n <button\r\n part=\"button\"\r\n class=\"button ${this.value === item.value ? 'button--selected' : ''}\"\r\n ?disabled=${this.disabled || item.disabled}\r\n role=\"radio\"\r\n aria-checked=${this.value === item.value}\r\n tabindex=${this.value === item.value ? '0' : '-1'}\r\n @click=${() => this._handleButtonClick(item, index)}\r\n @keydown=${(e: KeyboardEvent) => this._handleKeyDown(e, item, index)}\r\n >\r\n ${item.label}\r\n </button>\r\n `,\r\n )}\r\n </div>\r\n </div>\r\n `\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'mac-group-button': MacGroupButton\r\n }\r\n}\r\n","import { html, css } from 'lit'\r\nimport { property, customElement, state } from 'lit/decorators.js'\r\nimport { BaseElement } from '../../internal/base-element'\r\nimport { sharedStyles } from '../../styles/shared-styles'\r\nimport { themeTokens } from '../../styles/theme'\r\n\r\nexport interface DropdownItem {\r\n value: string\r\n label: string\r\n icon?: string\r\n disabled?: boolean\r\n danger?: boolean\r\n shortcut?: string\r\n divider?: boolean\r\n children?: DropdownItem[]\r\n}\r\n\r\n/**\r\n * @tag mac-dropdown\r\n * @summary 一个 macOS 风格的下拉菜单组件。\r\n *\r\n * @slot trigger - 触发下拉菜单打开的元素。\r\n *\r\n * @csspart base - 下拉菜单的基础容器。\r\n * @csspart menu - 下拉菜单。\r\n * @csspart item - 菜单项。\r\n */\r\n@customElement('mac-dropdown')\r\nexport class MacDropdown extends BaseElement {\r\n static override styles = [\r\n themeTokens,\r\n sharedStyles,\r\n css`\r\n :host {\r\n display: inline-block;\r\n }\r\n\r\n .dropdown {\r\n position: relative;\r\n display: inline-block;\r\n }\r\n\r\n .dropdown-trigger {\r\n display: inline-flex;\r\n cursor: pointer;\r\n }\r\n `,\r\n ]\r\n\r\n /** 菜单项。 */\r\n @property({ type: Array }) items: DropdownItem[] = []\r\n\r\n /** 下拉菜单的位置。 */\r\n @property() placement: 'bottom-start' | 'bottom-end' | 'top-start' | 'top-end' = 'bottom-start'\r\n\r\n /** 当前激活/选中的值。 */\r\n @property({ type: String }) value = ''\r\n\r\n /** 禁用下拉菜单。 */\r\n @property({ type: Boolean, reflect: true }) disabled = false\r\n\r\n /** 悬停时打开下拉菜单。 */\r\n @property({ type: Boolean, attribute: 'open-on-hover' }) openOnHover = false\r\n\r\n /** 悬停延迟(毫秒)。 */\r\n @property({ type: Number, attribute: 'hover-delay' }) hoverDelay = 150\r\n\r\n /** 触发模式:click、contextmenu 或 both。 */\r\n @property() trigger: 'click' | 'contextmenu' | 'both' = 'click'\r\n\r\n @state() private _open = false\r\n\r\n private _hoverTimeout: ReturnType<typeof setTimeout> | null = null\r\n private _menuEl: HTMLElement | null = null\r\n private _menuId = `dropdown-menu-${Math.random().toString(36).slice(2, 9)}`\r\n private _scrollHandler: (() => void) | null = null\r\n private _triggerEl: HTMLElement | null = null\r\n\r\n /** 为 portal 菜单注入的样式(挂载到 body)。 */\r\n private static _portalStylesInjected = false\r\n\r\n private static _injectPortalStyles() {\r\n if (MacDropdown._portalStylesInjected) return\r\n MacDropdown._portalStylesInjected = true\r\n\r\n // 向 :root 注入主题变量,以便 portal 菜单(挂载到 body)可以访问\r\n const vars = document.createElement('style')\r\n vars.id = 'mac-dropdown-theme-vars'\r\n vars.textContent = `\r\n :root {\r\n /* 间距系统 - 更精细的间距层次 */\r\n --md-spacing-xs: 4px;\r\n --md-spacing-sm: 8px;\r\n --md-spacing-md: 12px;\r\n --md-spacing-lg: 16px;\r\n --md-spacing-xl: 20px;\r\n --md-spacing-container: 5px;\r\n\r\n /* 圆角系统 - 更柔和的圆角 */\r\n --md-radius-sm: 4px;\r\n --md-radius-md: 6px;\r\n --md-radius-lg: 8px;\r\n --md-radius-xl: 12px;\r\n --md-radius-menu: 8px;\r\n\r\n /* 毛玻璃效果 - 更精致的模糊 */\r\n --md-glass-blur: 50px;\r\n --md-glass-saturate: 180%;\r\n --md-glass-brightness: 1.05;\r\n\r\n /* 字体系统 */\r\n --md-font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Display', 'SF Pro Text', 'Helvetica Neue', sans-serif;\r\n --md-font-size-xs: 11px;\r\n --md-font-size-sm: 12px;\r\n --md-font-size-menu: 13px;\r\n --md-font-size-lg: 15px;\r\n --md-font-weight-regular: 400;\r\n --md-font-weight-medium: 500;\r\n\r\n /* 动画系统 - macOS27 标准动画曲线 */\r\n --md-transition-fast: 150ms ease;\r\n --md-transition-menu: 250ms ease;\r\n --md-transition-slow: 250ms ease;\r\n\r\n /* Light Mode - 更精致的配色 */\r\n --md-dropdown-container-bg: rgba(255, 255, 255, 0.78);\r\n --md-dropdown-container-border: rgba(0, 0, 0, 0.04);\r\n --md-dropdown-container-shadow: \r\n 0 0 0 1px rgba(0, 0, 0, 0.05),\r\n 0 2px 4px rgba(0, 0, 0, 0.04),\r\n 0 8px 16px rgba(0, 0, 0, 0.08),\r\n 0 24px 48px rgba(0, 0, 0, 0.12);\r\n --md-dropdown-container-padding: 5px;\r\n\r\n --md-dropdown-item-padding: 6px 12px;\r\n --md-dropdown-item-gap: 10px;\r\n --md-dropdown-item-hover-bg: rgba(0, 122, 255, 0.12);\r\n --md-dropdown-item-active-bg: rgba(0, 122, 255, 0.9);\r\n --md-dropdown-item-active-hover-bg: rgba(0, 100, 200, 0.95);\r\n --md-dropdown-item-active-color: #ffffff;\r\n --md-dropdown-item-color: #1d1d1f;\r\n --md-dropdown-item-danger-color: #ff3b30;\r\n --md-dropdown-item-danger-hover-bg: rgba(255, 59, 48, 0.1);\r\n --md-dropdown-item-disabled-opacity: 0.35;\r\n\r\n --md-dropdown-shortcut-color: #86868b;\r\n --md-dropdown-arrow-color: #86868b;\r\n --md-dropdown-divider-color: rgba(0, 0, 0, 0.06);\r\n --md-dropdown-divider-margin: 5px 10px;\r\n\r\n /* Dark Mode - 更深邃的暗色模式 */\r\n --md-dropdown-container-dark-bg: rgba(30, 30, 30, 0.92);\r\n --md-dropdown-container-dark-border: rgba(255, 255, 255, 0.08);\r\n --md-dropdown-container-dark-shadow:\r\n 0 0 0 1px rgba(255, 255, 255, 0.05),\r\n 0 2px 4px rgba(0, 0, 0, 0.3),\r\n 0 8px 16px rgba(0, 0, 0, 0.4),\r\n 0 24px 48px rgba(0, 0, 0, 0.5);\r\n\r\n --md-dropdown-item-dark-hover-bg: rgba(255, 255, 255, 0.1);\r\n --md-dropdown-item-dark-active-bg: rgba(10, 132, 255, 0.95);\r\n --md-dropdown-item-dark-color: #f5f5f7;\r\n --md-dropdown-shortcut-dark-color: #98989d;\r\n --md-dropdown-divider-dark-color: rgba(255, 255, 255, 0.06);\r\n\r\n --md-mac-text-white-soft: rgba(255, 255, 255, 0.95);\r\n }\r\n `\r\n document.head.appendChild(vars)\r\n\r\n const style = document.createElement('style')\r\n style.id = 'mac-dropdown-portal-styles'\r\n style.textContent = `\r\n .mac-dropdown-portal {\r\n position: fixed;\r\n min-width: 180px;\r\n max-width: 280px;\r\n padding: var(--md-dropdown-container-padding);\r\n background: var(--md-dropdown-container-bg);\r\n backdrop-filter: blur(var(--md-glass-blur)) saturate(var(--md-glass-saturate)) brightness(var(--md-glass-brightness));\r\n -webkit-backdrop-filter: blur(var(--md-glass-blur)) saturate(var(--md-glass-saturate)) brightness(var(--md-glass-brightness));\r\n border: 0.5px solid var(--md-dropdown-container-border);\r\n border-radius: var(--md-radius-menu);\r\n box-shadow: var(--md-dropdown-container-shadow);\r\n z-index: 99999;\r\n opacity: 0;\r\n transform: scale(0.95) translateY(-8px);\r\n pointer-events: none;\r\n transition:\r\n opacity var(--md-transition-menu),\r\n transform var(--md-transition-menu),\r\n box-shadow var(--md-transition-slow);\r\n font-family: var(--md-font-family);\r\n -webkit-font-smoothing: antialiased;\r\n -moz-osx-font-smoothing: grayscale;\r\n }\r\n\r\n .mac-dropdown-portal.open {\r\n opacity: 1;\r\n transform: scale(1) translateY(0);\r\n pointer-events: auto;\r\n box-shadow:\r\n 0 0 0 1px rgba(0, 0, 0, 0.06),\r\n 0 4px 8px rgba(0, 0, 0, 0.06),\r\n 0 12px 24px rgba(0, 0, 0, 0.1),\r\n 0 32px 64px rgba(0, 0, 0, 0.15);\r\n }\r\n\r\n .mac-dropdown-portal.animating-up {\r\n transform-origin: bottom left;\r\n }\r\n\r\n .mac-dropdown-portal.animating-up-end {\r\n transform-origin: bottom right;\r\n }\r\n\r\n .mac-dropdown-portal .dropdown-item {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--md-dropdown-item-gap);\r\n padding: var(--md-dropdown-item-padding);\r\n border-radius: var(--md-radius-sm);\r\n cursor: pointer;\r\n transition: background var(--md-transition-fast);\r\n user-select: none;\r\n white-space: nowrap;\r\n position: relative;\r\n font-size: var(--md-font-size-menu);\r\n font-weight: var(--md-font-weight-regular);\r\n line-height: 1.5;\r\n color: var(--md-dropdown-item-color);\r\n outline: none;\r\n }\r\n\r\n .mac-dropdown-portal .dropdown-item:hover:not(.disabled) {\r\n background: var(--md-dropdown-item-hover-bg);\r\n }\r\n\r\n .mac-dropdown-portal .dropdown-item:focus-visible:not(.disabled) {\r\n background: var(--md-dropdown-item-hover-bg);\r\n box-shadow: inset 0 0 0 1px rgba(0, 122, 255, 0.3);\r\n }\r\n\r\n .mac-dropdown-portal .dropdown-item.active {\r\n background: var(--md-dropdown-item-active-bg);\r\n color: var(--md-dropdown-item-active-color);\r\n font-weight: var(--md-font-weight-medium);\r\n }\r\n\r\n .mac-dropdown-portal .dropdown-item.active:hover {\r\n background: var(--md-dropdown-item-active-hover-bg);\r\n }\r\n\r\n .mac-dropdown-portal .dropdown-item.active:focus-visible {\r\n background: var(--md-dropdown-item-active-hover-bg);\r\n box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.3);\r\n }\r\n\r\n .mac-dropdown-portal .dropdown-item.disabled {\r\n opacity: var(--md-dropdown-item-disabled-opacity);\r\n cursor: not-allowed;\r\n color: var(--md-dropdown-item-color);\r\n }\r\n\r\n .mac-dropdown-portal .dropdown-item.danger {\r\n color: var(--md-dropdown-item-danger-color);\r\n }\r\n\r\n .mac-dropdown-portal .dropdown-item.danger:hover:not(.disabled) {\r\n background: var(--md-dropdown-item-danger-hover-bg);\r\n color: var(--md-dropdown-item-danger-color);\r\n }\r\n\r\n .mac-dropdown-portal .dropdown-item-icon {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 16px;\r\n height: 16px;\r\n font-size: 14px;\r\n flex-shrink: 0;\r\n opacity: 0.9;\r\n }\r\n\r\n .mac-dropdown-portal .dropdown-item.active .dropdown-item-icon {\r\n opacity: 1;\r\n }\r\n\r\n .mac-dropdown-portal .dropdown-item-label {\r\n flex: 1;\r\n min-width: 0;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n }\r\n\r\n .mac-dropdown-portal .dropdown-item-shortcut {\r\n font-size: var(--md-font-size-xs);\r\n color: var(--md-dropdown-shortcut-color);\r\n margin-left: auto;\r\n padding-left: var(--md-spacing-lg);\r\n opacity: 0.7;\r\n font-weight: var(--md-font-weight-medium);\r\n }\r\n\r\n .mac-dropdown-portal .dropdown-item.active .dropdown-item-shortcut {\r\n color: var(--md-mac-text-white-soft);\r\n opacity: 0.9;\r\n }\r\n\r\n .mac-dropdown-portal .dropdown-item-arrow {\r\n display: flex;\r\n align-items: center;\r\n margin-left: auto;\r\n padding-left: var(--md-spacing-sm);\r\n color: var(--md-dropdown-arrow-color);\r\n opacity: 0.6;\r\n font-size: 12px;\r\n }\r\n\r\n .mac-dropdown-portal .dropdown-item.active .dropdown-item-arrow {\r\n color: var(--md-mac-text-white-soft);\r\n opacity: 0.9;\r\n }\r\n\r\n .mac-dropdown-portal .dropdown-divider {\r\n height: 1px;\r\n background: var(--md-dropdown-divider-color);\r\n margin: var(--md-dropdown-divider-margin);\r\n }\r\n\r\n /* 子菜单 */\r\n .mac-dropdown-portal .dropdown-submenu {\r\n position: relative;\r\n }\r\n\r\n .mac-dropdown-portal .dropdown-submenu > .mac-dropdown-submenu-portal {\r\n position: fixed;\r\n min-width: 180px;\r\n max-width: 280px;\r\n padding: var(--md-dropdown-container-padding);\r\n background: var(--md-dropdown-container-bg);\r\n backdrop-filter: blur(var(--md-glass-blur)) saturate(var(--md-glass-saturate)) brightness(var(--md-glass-brightness));\r\n -webkit-backdrop-filter: blur(var(--md-glass-blur)) saturate(var(--md-glass-saturate)) brightness(var(--md-glass-brightness));\r\n border: 0.5px solid var(--md-dropdown-container-border);\r\n border-radius: var(--md-radius-menu);\r\n box-shadow: var(--md-dropdown-container-shadow);\r\n z-index: 100000;\r\n opacity: 0;\r\n transform: scale(0.95) translateX(-6px);\r\n transform-origin: top left;\r\n pointer-events: none;\r\n transition:\r\n opacity var(--md-transition-menu),\r\n transform var(--md-transition-menu);\r\n -webkit-font-smoothing: antialiased;\r\n -moz-osx-font-smoothing: grayscale;\r\n }\r\n\r\n .mac-dropdown-portal .dropdown-submenu:hover > .mac-dropdown-submenu-portal {\r\n opacity: 1;\r\n transform: scale(1) translateX(0);\r\n pointer-events: auto;\r\n }\r\n\r\n /* 深色模式 */\r\n .mac-dropdown-portal[data-theme='dark'],\r\n .mac-dropdown-portal[data-theme='dark'] .dropdown-submenu > .mac-dropdown-submenu-portal {\r\n background: var(--md-dropdown-container-dark-bg);\r\n border-color: var(--md-dropdown-container-dark-border);\r\n box-shadow: var(--md-dropdown-container-dark-shadow);\r\n }\r\n\r\n .mac-dropdown-portal[data-theme='dark'].open {\r\n box-shadow:\r\n 0 0 0 1px rgba(255, 255, 255, 0.08),\r\n 0 4px 8px rgba(0, 0, 0, 0.4),\r\n 0 12px 24px rgba(0, 0, 0, 0.5),\r\n 0 32px 64px rgba(0, 0, 0, 0.6);\r\n }\r\n\r\n .mac-dropdown-portal[data-theme='dark'] .dropdown-item:hover:not(.disabled) {\r\n background: var(--md-dropdown-item-dark-hover-bg);\r\n }\r\n\r\n .mac-dropdown-portal[data-theme='dark'] .dropdown-item:focus-visible:not(.disabled) {\r\n background: var(--md-dropdown-item-dark-hover-bg);\r\n box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.2);\r\n }\r\n\r\n .mac-dropdown-portal[data-theme='dark'] .dropdown-item.active {\r\n background: var(--md-dropdown-item-dark-active-bg);\r\n color: var(--md-dropdown-item-active-color);\r\n }\r\n\r\n .mac-dropdown-portal[data-theme='dark'] .dropdown-item.active:hover {\r\n background: var(--md-dropdown-item-dark-active-bg);\r\n }\r\n\r\n .mac-dropdown-portal[data-theme='dark'] .dropdown-item.danger:hover:not(.disabled) {\r\n background: rgba(255, 59, 48, 0.15);\r\n }\r\n\r\n .mac-dropdown-portal[data-theme='dark'] .dropdown-divider {\r\n background: var(--md-dropdown-divider-dark-color);\r\n }\r\n\r\n .mac-dropdown-portal[data-theme='dark'] .dropdown-item {\r\n color: var(--md-dropdown-item-dark-color);\r\n }\r\n\r\n .mac-dropdown-portal[data-theme='dark'] .dropdown-item-shortcut {\r\n color: var(--md-dropdown-shortcut-dark-color);\r\n }\r\n\r\n .mac-dropdown-portal[data-theme='dark'] .dropdown-item-arrow {\r\n color: var(--md-dropdown-shortcut-dark-color);\r\n }\r\n\r\n /* ─── 响应式:移动端浮层更宽 + 触控目标更大 ─── */\r\n @media (max-width: 768px) {\r\n .mac-dropdown-portal {\r\n min-width: calc(100vw - 32px) !important;\r\n max-width: calc(100vw - 32px) !important;\r\n border-radius: var(--md-radius-xl);\r\n }\r\n\r\n .mac-dropdown-portal .dropdown-item {\r\n padding: 12px 16px !important;\r\n font-size: var(--md-font-size-lg) !important;\r\n gap: var(--md-spacing-md);\r\n }\r\n\r\n .mac-dropdown-portal .dropdown-item-icon {\r\n width: 20px;\r\n height: 20px;\r\n font-size: 16px;\r\n }\r\n\r\n .mac-dropdown-portal .dropdown-item-shortcut {\r\n font-size: var(--md-font-size-sm);\r\n }\r\n\r\n .mac-dropdown-portal .dropdown-submenu > .mac-dropdown-submenu-portal {\r\n min-width: calc(100vw - 32px) !important;\r\n max-width: calc(100vw - 32px) !important;\r\n }\r\n }\r\n `\r\n document.head.appendChild(style)\r\n }\r\n\r\n override connectedCallback() {\r\n super.connectedCallback()\r\n MacDropdown._injectPortalStyles()\r\n document.addEventListener('mousedown', this._handleDocumentClick)\r\n document.addEventListener('keydown', this._handleKeyDown)\r\n }\r\n\r\n override disconnectedCallback() {\r\n super.disconnectedCallback()\r\n document.removeEventListener('mousedown', this._handleDocumentClick)\r\n document.removeEventListener('keydown', this._handleKeyDown)\r\n this._removeScrollListener()\r\n this._removeMenu()\r\n if (this._hoverTimeout) clearTimeout(this._hoverTimeout)\r\n }\r\n\r\n private _addScrollListener() {\r\n if (this._scrollHandler) return\r\n this._scrollHandler = () => {\r\n if (this._open && this._menuEl && this._triggerEl) {\r\n const anchorRect = this._triggerEl.getBoundingClientRect()\r\n const { left, top } = this._calcPosition(anchorRect)\r\n this._menuEl.style.left = `${left}px`\r\n this._menuEl.style.top = `${top}px`\r\n }\r\n }\r\n window.addEventListener('scroll', this._scrollHandler, true)\r\n window.addEventListener('resize', this._scrollHandler)\r\n }\r\n\r\n private _removeScrollListener() {\r\n if (this._scrollHandler) {\r\n window.removeEventListener('scroll', this._scrollHandler, true)\r\n window.removeEventListener('resize', this._scrollHandler)\r\n this._scrollHandler = null\r\n }\r\n }\r\n\r\n private _handleDocumentClick = (e: Event) => {\r\n if (!this._open || !this._menuEl) return\r\n const target = e.target as Node\r\n // 检查点击是否在菜单或宿主元素内\r\n if (this._menuEl.contains(target) || this.contains(target)) return\r\n this._close()\r\n }\r\n\r\n private _handleKeyDown = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape' && this._open) {\r\n e.preventDefault()\r\n this._close()\r\n }\r\n }\r\n\r\n private _openMenu() {\r\n if (this.disabled) return\r\n this._open = true\r\n this._createMenu()\r\n this.emit('mac-dropdown-open')\r\n }\r\n\r\n private _close() {\r\n if (!this._open) return\r\n this._open = false\r\n this._removeMenu()\r\n this.emit('mac-dropdown-close')\r\n }\r\n\r\n private _toggle() {\r\n this._open ? this._close() : this._openMenu()\r\n }\r\n\r\n private _handleTriggerClick(e: Event) {\r\n if (this.trigger === 'contextmenu') return\r\n e.preventDefault()\r\n this._toggle()\r\n }\r\n\r\n private _handleContextMenu(e: Event) {\r\n if (this.trigger === 'click') return\r\n e.preventDefault()\r\n e.stopPropagation()\r\n\r\n const ce = e as MouseEvent\r\n this._open = true\r\n this._createMenu({ x: ce.clientX, y: ce.clientY })\r\n this.emit('mac-dropdown-open')\r\n }\r\n\r\n private _handleMouseEnter() {\r\n if (!this.openOnHover) return\r\n if (this._hoverTimeout) clearTimeout(this._hoverTimeout)\r\n this._hoverTimeout = setTimeout(() => this._openMenu(), this.hoverDelay)\r\n }\r\n\r\n private _handleMouseLeave() {\r\n if (!this.openOnHover) return\r\n if (this._hoverTimeout) clearTimeout(this._hoverTimeout)\r\n this._hoverTimeout = setTimeout(() => this._close(), 200)\r\n }\r\n\r\n private _selectItem(item: DropdownItem) {\r\n if (item.disabled) return\r\n if (item.children) return\r\n\r\n this.value = item.value\r\n this._close()\r\n this.emit('mac-dropdown-select', { detail: { value: item.value, item } })\r\n }\r\n\r\n /**\r\n * 根据触发元素或显式坐标计算菜单位置。\r\n * 自动调整以保持在视口内。\r\n */\r\n private _calcPosition(\r\n anchorRect?: DOMRect,\r\n explicitPos?: { x: number; y: number },\r\n ): {\r\n left: number\r\n top: number\r\n placement: string\r\n } {\r\n const vw = window.innerWidth\r\n const vh = window.innerHeight\r\n // 移动端:浮层宽度为视口宽 - 32px(与 CSS media query 一致),水平居中\r\n const isMobile = vw <= 768\r\n const menuWidth = isMobile ? vw - 32 : 220 // estimated min-width\r\n const menuHeight = this.items.length * 32 + 8 // estimated height\r\n\r\n if (explicitPos) {\r\n // Context menu: position at click point, adjust to viewport\r\n let left = isMobile ? 16 : explicitPos.x\r\n let top = explicitPos.y\r\n\r\n if (left + menuWidth > vw - 8) left = vw - menuWidth - 8\r\n if (top + menuHeight > vh - 8) top = vh - menuHeight - 8\r\n if (left < 8) left = 8\r\n if (top < 8) top = 8\r\n\r\n return { left, top, placement: 'context' }\r\n }\r\n\r\n if (!anchorRect) return { left: 0, top: 0, placement: this.placement }\r\n\r\n let left = 0\r\n let top: number\r\n let placement = this.placement\r\n\r\n const gap = 4\r\n\r\n // 移动端:忽略 placement 的水平对齐,统一水平居中\r\n if (isMobile) {\r\n left = Math.max(8, (vw - menuWidth) / 2)\r\n }\r\n\r\n switch (placement) {\r\n case 'bottom-start':\r\n if (!isMobile) left = anchorRect.left\r\n top = anchorRect.bottom + gap\r\n break\r\n case 'bottom-end':\r\n if (!isMobile) left = anchorRect.right - menuWidth\r\n top = anchorRect.bottom + gap\r\n break\r\n case 'top-start':\r\n if (!isMobile) left = anchorRect.left\r\n top = anchorRect.top - menuHeight - gap\r\n break\r\n case 'top-end':\r\n if (!isMobile) left = anchorRect.right - menuWidth\r\n top = anchorRect.top - menuHeight - gap\r\n break\r\n default:\r\n if (!isMobile) left = anchorRect.left\r\n top = anchorRect.bottom + gap\r\n }\r\n\r\n // Auto-flip: if bottom overflows, flip to top\r\n if ((placement === 'bottom-start' || placement === 'bottom-end') && top + menuHeight > vh - 8) {\r\n top = anchorRect.top - menuHeight - gap\r\n placement = placement.replace('bottom', 'top') as typeof placement\r\n }\r\n // Auto-flip: if top overflows, flip to bottom\r\n if ((placement === 'top-start' || placement === 'top-end') && top < 8) {\r\n top = anchorRect.bottom + gap\r\n placement = placement.replace('top', 'bottom') as typeof placement\r\n }\r\n // Horizontal: if overflows right, shift left\r\n if (left + menuWidth > vw - 8) {\r\n left = vw - menuWidth - 8\r\n }\r\n // Horizontal: if overflows left, shift right\r\n if (left < 8) {\r\n left = 8\r\n }\r\n\r\n return { left, top, placement }\r\n }\r\n\r\n private _createMenu(explicitPos?: { x: number; y: number }) {\r\n this._removeMenu()\r\n\r\n const triggerEl = this.shadowRoot?.querySelector('.dropdown-trigger')\r\n this._triggerEl = triggerEl as HTMLElement\r\n const anchorRect = triggerEl?.getBoundingClientRect()\r\n\r\n const { left, top, placement } = this._calcPosition(anchorRect, explicitPos)\r\n\r\n const menu = document.createElement('div')\r\n menu.id = this._menuId\r\n menu.className = 'mac-dropdown-portal'\r\n menu.setAttribute('role', 'menu')\r\n menu.setAttribute('part', 'menu')\r\n const theme = this._resolvedTheme\r\n if (theme) {\r\n menu.setAttribute('data-theme', theme)\r\n }\r\n if (placement.startsWith('top')) {\r\n menu.classList.add('animating-up')\r\n }\r\n if (placement.endsWith('end')) {\r\n menu.classList.add('animating-up-end')\r\n }\r\n\r\n menu.innerHTML = this._renderItemsHTML(this.items)\r\n\r\n // 位置\r\n menu.style.left = `${left}px`\r\n menu.style.top = `${top}px`\r\n\r\n document.body.appendChild(menu)\r\n this._menuEl = menu\r\n\r\n // 绑定菜单项事件\r\n this._bindMenuEvents(menu)\r\n\r\n // 添加滚动监听器以更新位置\r\n if (!explicitPos) {\r\n this._addScrollListener()\r\n }\r\n\r\n // 在下一帧执行进入动画\r\n requestAnimationFrame(() => {\r\n // Re-calculate position with actual menu dimensions\r\n if (explicitPos) {\r\n const menuRect = menu.getBoundingClientRect()\r\n const vw = window.innerWidth\r\n const vh = window.innerHeight\r\n let newLeft = left\r\n let newTop = top\r\n if (newLeft + menuRect.width > vw - 8) newLeft = vw - menuRect.width - 8\r\n if (newTop + menuRect.height > vh - 8) newTop = vh - menuRect.height - 8\r\n if (newLeft < 8) newLeft = 8\r\n if (newTop < 8) newTop = 8\r\n menu.style.left = `${newLeft}px`\r\n menu.style.top = `${newTop}px`\r\n } else if (anchorRect) {\r\n // Re-adjust with actual menu size\r\n const menuRect = menu.getBoundingClientRect()\r\n const vw = window.innerWidth\r\n const vh = window.innerHeight\r\n let newLeft = left\r\n let newTop = top\r\n if (newLeft + menuRect.width > vw - 8) newLeft = vw - menuRect.width - 8\r\n if (newTop + menuRect.height > vh - 8) {\r\n newTop = (anchorRect as DOMRect).top - menuRect.height - 4\r\n menu.classList.add('animating-up')\r\n }\r\n if (newLeft < 8) newLeft = 8\r\n if (newTop < 8) newTop = 8\r\n menu.style.left = `${newLeft}px`\r\n menu.style.top = `${newTop}px`\r\n }\r\n\r\n menu.classList.add('open')\r\n })\r\n }\r\n\r\n private _removeMenu() {\r\n this._removeScrollListener()\r\n this._triggerEl = null\r\n if (this._menuEl) {\r\n this._menuEl.classList.remove('open')\r\n const el = this._menuEl\r\n // 等待动画完成后移除\r\n setTimeout(() => {\r\n if (el.parentNode) el.parentNode.removeChild(el)\r\n }, 150)\r\n this._menuEl = null\r\n }\r\n }\r\n\r\n private _renderItemsHTML(items: DropdownItem[]): string {\r\n return items\r\n .map((item) => {\r\n if (item.divider) {\r\n return '<div class=\"dropdown-divider\"></div>'\r\n }\r\n\r\n const isActive = this.value === item.value\r\n const hasChildren = item.children && item.children.length > 0\r\n\r\n const classes = [\r\n 'dropdown-item',\r\n isActive ? 'active' : '',\r\n item.disabled ? 'disabled' : '',\r\n item.danger ? 'danger' : '',\r\n hasChildren ? 'dropdown-submenu' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ')\r\n\r\n const iconHTML = item.icon ? `<span class=\"dropdown-item-icon\">${item.icon}</span>` : ''\r\n const shortcutHTML =\r\n item.shortcut && !hasChildren\r\n ? `<span class=\"dropdown-item-shortcut\">${item.shortcut}</span>`\r\n : ''\r\n const arrowHTML = hasChildren\r\n ? `<span class=\"dropdown-item-arrow\"><svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"currentColor\"><path d=\"M4.5 2.5l3.5 3.5-3.5 3.5\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\"/></svg></span>`\r\n : ''\r\n const submenuHTML = hasChildren\r\n ? `<div class=\"mac-dropdown-submenu-portal\" role=\"menu\">${this._renderItemsHTML(item.children!)}</div>`\r\n : ''\r\n\r\n return `<div class=\"${classes}\" data-value=\"${item.value}\" data-disabled=\"${!!item.disabled}\" data-has-children=\"${!!hasChildren}\" role=\"menuitem\" aria-disabled=\"${!!item.disabled}\" aria-haspopup=\"${!!hasChildren}\">${iconHTML}<span class=\"dropdown-item-label\">${item.label}</span>${shortcutHTML}${arrowHTML}${submenuHTML}</div>`\r\n })\r\n .join('')\r\n }\r\n\r\n private _bindMenuEvents(menu: HTMLElement) {\r\n // 悬停保活:当 open-on-hover 时,鼠标进入 portal 菜单时取消关闭超时\r\n menu.addEventListener('mouseenter', () => {\r\n if (this.openOnHover && this._hoverTimeout) {\r\n clearTimeout(this._hoverTimeout)\r\n this._hoverTimeout = null\r\n }\r\n })\r\n menu.addEventListener('mouseleave', () => {\r\n if (this.openOnHover) {\r\n if (this._hoverTimeout) clearTimeout(this._hoverTimeout)\r\n this._hoverTimeout = setTimeout(() => this._close(), 200)\r\n }\r\n })\r\n\r\n menu.addEventListener('click', (e: Event) => {\r\n const target = (e.target as HTMLElement).closest('.dropdown-item') as HTMLElement | null\r\n if (!target) return\r\n\r\n const isDisabled = target.dataset.disabled === 'true'\r\n const hasChildren = target.dataset.hasChildren === 'true'\r\n if (isDisabled || hasChildren) return\r\n\r\n const value = target.dataset.value\r\n if (value) {\r\n const item = this._findItem(this.items, value)\r\n if (item) this._selectItem(item)\r\n }\r\n })\r\n\r\n // 悬停时子菜单位置\r\n menu.addEventListener('mouseover', (e: Event) => {\r\n const target = (e.target as HTMLElement).closest('.dropdown-submenu') as HTMLElement | null\r\n if (!target) return\r\n\r\n const submenu = target.querySelector('.mac-dropdown-submenu-portal') as HTMLElement | null\r\n if (!submenu) return\r\n\r\n // 相对于父项定位子菜单\r\n const itemRect = target.getBoundingClientRect()\r\n const vw = window.innerWidth\r\n const vh = window.innerHeight\r\n\r\n let subLeft = itemRect.right + 2\r\n let subTop = itemRect.top - 4\r\n\r\n // 如果右侧溢出,则在左侧显示\r\n if (subLeft + 220 > vw) {\r\n subLeft = itemRect.left - 220 - 2\r\n }\r\n // 如果底部溢出\r\n requestAnimationFrame(() => {\r\n const subRect = submenu.getBoundingClientRect()\r\n if (subTop + subRect.height > vh - 8) {\r\n subTop = vh - subRect.height - 8\r\n }\r\n if (subTop < 8) subTop = 8\r\n submenu.style.left = `${subLeft}px`\r\n submenu.style.top = `${subTop}px`\r\n })\r\n })\r\n }\r\n\r\n private _findItem(items: DropdownItem[], value: string): DropdownItem | null {\r\n for (const item of items) {\r\n if (item.value === value) return item\r\n if (item.children) {\r\n const found = this._findItem(item.children, value)\r\n if (found) return found\r\n }\r\n }\r\n return null\r\n }\r\n\r\n override render() {\r\n return html`\r\n <div\r\n class=\"dropdown\"\r\n part=\"base\"\r\n @mouseenter=${this._handleMouseEnter}\r\n @mouseleave=${this._handleMouseLeave}\r\n >\r\n <div\r\n class=\"dropdown-trigger\"\r\n @click=${this._handleTriggerClick}\r\n @contextmenu=${this._handleContextMenu}\r\n >\r\n <slot name=\"trigger\"></slot>\r\n </div>\r\n </div>\r\n `\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'mac-dropdown': MacDropdown\r\n }\r\n}\r\n","import { html, css } from 'lit'\r\nimport { property, customElement, state } from 'lit/decorators.js'\r\nimport type { PropertyValues } from 'lit'\r\nimport { BaseElement } from '../../internal/base-element'\r\nimport { sharedStyles } from '../../styles/shared-styles'\r\nimport { themeTokens } from '../../styles/theme'\r\nimport type { DropdownItem } from '../dropdown/mac-dropdown'\r\n\r\n/**\r\n * @tag mac-menu\r\n * @summary 一个独立的菜单组件,可以在任何位置显示。\r\n *\r\n * @csspart base - 菜单的基础容器。\r\n * @csspart item - 菜单项。\r\n */\r\n@customElement('mac-menu')\r\nexport class MacMenu extends BaseElement {\r\n static override styles = [\r\n themeTokens,\r\n sharedStyles,\r\n css`\r\n :host {\r\n display: none;\r\n position: fixed;\r\n z-index: 99999;\r\n }\r\n\r\n :host([visible]) {\r\n display: block;\r\n }\r\n `,\r\n ]\r\n\r\n /** 菜单项。 */\r\n @property({ type: Array }) items: DropdownItem[] = []\r\n\r\n /** 当前激活/选中的值。 */\r\n @property({ type: String }) value = ''\r\n\r\n /** 菜单是否可见。 */\r\n @property({ type: Boolean, reflect: true }) visible = false\r\n\r\n /** 菜单位置(x 坐标)。 */\r\n @property({ type: Number }) x = 0\r\n\r\n /** 菜单位置(y 坐标)。 */\r\n @property({ type: Number }) y = 0\r\n\r\n @state() private _menuEl: HTMLElement | null = null\r\n @state() private _submenuOpen: string | null = null\r\n\r\n private static _stylesInjected = false\r\n private _scrollHandler: ((e: Event) => void) | null = null\r\n private _resizeHandler: (() => void) | null = null\r\n\r\n /**\r\n * 在指定位置显示菜单,使用给定的项。\r\n * @param x - X 坐标\r\n * @param y - Y 坐标\r\n * @param items - 要显示的菜单项\r\n */\r\n show(x: number, y: number, items?: DropdownItem[]) {\r\n if (items) this.items = items\r\n this.x = x\r\n this.y = y\r\n this.visible = true\r\n this._createMenu()\r\n this._addScrollListener()\r\n this.emit('mac-menu-open')\r\n }\r\n\r\n /**\r\n * 隐藏菜单。\r\n */\r\n hide() {\r\n this.visible = false\r\n this._removeScrollListener()\r\n this._removeMenu()\r\n this.emit('mac-menu-close')\r\n }\r\n\r\n /**\r\n * 切换菜单可见性。\r\n */\r\n toggle(x: number, y: number, items?: DropdownItem[]) {\r\n if (this.visible) {\r\n this.hide()\r\n } else {\r\n this.show(x, y, items)\r\n }\r\n }\r\n\r\n override connectedCallback() {\r\n super.connectedCallback()\r\n MacMenu._injectStyles()\r\n document.addEventListener('mousedown', this._handleDocumentClick)\r\n document.addEventListener('keydown', this._handleKeyDown)\r\n }\r\n\r\n override disconnectedCallback() {\r\n super.disconnectedCallback()\r\n document.removeEventListener('mousedown', this._handleDocumentClick)\r\n document.removeEventListener('keydown', this._handleKeyDown)\r\n this._removeScrollListener()\r\n this._removeMenu()\r\n }\r\n\r\n override willUpdate(changedProperties: PropertyValues) {\r\n super.willUpdate(changedProperties)\r\n // 主题变化时同步更新已打开的 portal\r\n if (this._menuEl) {\r\n const theme = this._getPortalTheme()\r\n const currentTheme = this._menuEl.getAttribute('data-theme')\r\n if (theme !== currentTheme) {\r\n if (theme) {\r\n this._menuEl.setAttribute('data-theme', theme)\r\n } else {\r\n this._menuEl.removeAttribute('data-theme')\r\n }\r\n }\r\n }\r\n }\r\n\r\n private static _injectStyles() {\r\n if (MacMenu._stylesInjected) return\r\n MacMenu._stylesInjected = true\r\n\r\n // 菜单专属主题变量\r\n const vars = document.createElement('style')\r\n vars.id = 'mac-menu-theme-vars'\r\n vars.textContent = `\r\n :root {\r\n /* 菜单专属变量(仅定义 theme.ts 中不存在的变量) */\r\n --md-spacing-container: 5px;\r\n --md-glass-brightness: 1.05;\r\n\r\n --md-menu-container-bg: rgba(255, 255, 255, 0.78);\r\n --md-menu-container-border: rgba(0, 0, 0, 0.04);\r\n --md-menu-container-shadow:\r\n 0 0 0 1px rgba(0, 0, 0, 0.05),\r\n 0 2px 4px rgba(0, 0, 0, 0.04),\r\n 0 8px 16px rgba(0, 0, 0, 0.08),\r\n 0 24px 48px rgba(0, 0, 0, 0.12);\r\n\r\n --md-menu-item-padding: 6px 12px;\r\n --md-menu-item-gap: 10px;\r\n --md-menu-item-hover-bg: rgba(0, 122, 255, 0.12);\r\n --md-menu-item-active-bg: rgba(0, 122, 255, 0.9);\r\n --md-menu-item-active-color: #ffffff;\r\n --md-menu-item-color: #1d1d1f;\r\n --md-menu-item-danger-color: #ff3b30;\r\n --md-menu-item-danger-hover-bg: rgba(255, 59, 48, 0.1);\r\n --md-menu-item-disabled-opacity: 0.35;\r\n\r\n --md-menu-shortcut-color: #86868b;\r\n --md-menu-arrow-color: #86868b;\r\n --md-menu-divider-color: rgba(0, 0, 0, 0.06);\r\n --md-menu-divider-margin: 5px 10px;\r\n\r\n /* 深色模式 */\r\n --md-menu-container-dark-bg: rgba(30, 30, 30, 0.92);\r\n --md-menu-container-dark-border: rgba(255, 255, 255, 0.08);\r\n --md-menu-item-dark-hover-bg: rgba(255, 255, 255, 0.1);\r\n --md-menu-item-dark-active-bg: rgba(10, 132, 255, 0.95);\r\n --md-menu-item-dark-color: #f5f5f7;\r\n --md-menu-shortcut-dark-color: #98989d;\r\n --md-menu-divider-dark-color: rgba(255, 255, 255, 0.06);\r\n\r\n --md-mac-text-white-soft: rgba(255, 255, 255, 0.95);\r\n }\r\n `\r\n document.head.appendChild(vars)\r\n\r\n const style = document.createElement('style')\r\n style.id = 'mac-menu-portal-styles'\r\n style.textContent = `\r\n .mac-menu-portal {\r\n position: fixed;\r\n min-width: 180px;\r\n max-width: 280px;\r\n padding: var(--md-spacing-container);\r\n background: var(--md-menu-container-bg);\r\n backdrop-filter: blur(var(--md-glass-blur)) saturate(var(--md-glass-saturate)) brightness(var(--md-glass-brightness));\r\n -webkit-backdrop-filter: blur(var(--md-glass-blur)) saturate(var(--md-glass-saturate)) brightness(var(--md-glass-brightness));\r\n border: 0.5px solid var(--md-menu-container-border);\r\n border-radius: var(--md-radius-menu);\r\n box-shadow: var(--md-menu-container-shadow);\r\n z-index: 99999;\r\n opacity: 0;\r\n transform: scale(0.95) translateY(-8px);\r\n pointer-events: none;\r\n transition:\r\n opacity var(--md-transition-menu),\r\n transform var(--md-transition-menu);\r\n font-family: var(--md-font-family);\r\n -webkit-font-smoothing: antialiased;\r\n -moz-osx-font-smoothing: grayscale;\r\n }\r\n\r\n .mac-menu-portal.open {\r\n opacity: 1;\r\n transform: scale(1) translateY(0);\r\n pointer-events: auto;\r\n box-shadow:\r\n 0 0 0 1px rgba(0, 0, 0, 0.06),\r\n 0 4px 8px rgba(0, 0, 0, 0.06),\r\n 0 12px 24px rgba(0, 0, 0, 0.1),\r\n 0 32px 64px rgba(0, 0, 0, 0.15);\r\n }\r\n\r\n .mac-menu-portal .menu-item {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--md-menu-item-gap);\r\n padding: var(--md-menu-item-padding);\r\n border-radius: var(--md-radius-sm);\r\n cursor: pointer;\r\n transition: background var(--md-transition-fast);\r\n user-select: none;\r\n white-space: nowrap;\r\n position: relative;\r\n font-size: var(--md-font-size-menu);\r\n font-weight: var(--md-font-weight-regular);\r\n line-height: 1.5;\r\n color: var(--md-menu-item-color);\r\n outline: none;\r\n }\r\n\r\n .mac-menu-portal .menu-item:hover:not(.disabled) {\r\n background: var(--md-menu-item-hover-bg);\r\n }\r\n\r\n .mac-menu-portal .menu-item:focus-visible:not(.disabled) {\r\n background: var(--md-menu-item-hover-bg);\r\n box-shadow: inset 0 0 0 1px rgba(0, 122, 255, 0.3);\r\n }\r\n\r\n .mac-menu-portal .menu-item.active {\r\n background: var(--md-menu-item-active-bg);\r\n color: var(--md-menu-item-active-color);\r\n font-weight: var(--md-font-weight-medium);\r\n }\r\n\r\n .mac-menu-portal .menu-item.active:hover {\r\n background: rgba(0, 100, 200, 0.95);\r\n }\r\n\r\n .mac-menu-portal .menu-item.disabled {\r\n opacity: var(--md-menu-item-disabled-opacity);\r\n cursor: not-allowed;\r\n }\r\n\r\n .mac-menu-portal .menu-item.danger {\r\n color: var(--md-menu-item-danger-color);\r\n }\r\n\r\n .mac-menu-portal .menu-item.danger:hover:not(.disabled) {\r\n background: var(--md-menu-item-danger-hover-bg);\r\n }\r\n\r\n .mac-menu-portal .menu-item-icon {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 16px;\r\n height: 16px;\r\n font-size: 14px;\r\n flex-shrink: 0;\r\n opacity: 0.9;\r\n }\r\n\r\n .mac-menu-portal .menu-item.active .menu-item-icon {\r\n opacity: 1;\r\n }\r\n\r\n .mac-menu-portal .menu-item-label {\r\n flex: 1;\r\n min-width: 0;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n }\r\n\r\n .mac-menu-portal .menu-item-shortcut {\r\n font-size: var(--md-font-size-xs);\r\n color: var(--md-menu-shortcut-color);\r\n margin-left: auto;\r\n padding-left: var(--md-spacing-lg);\r\n opacity: 0.7;\r\n font-weight: var(--md-font-weight-medium);\r\n }\r\n\r\n .mac-menu-portal .menu-item.active .menu-item-shortcut {\r\n color: var(--md-mac-text-white-soft);\r\n opacity: 0.9;\r\n }\r\n\r\n .mac-menu-portal .menu-item-arrow {\r\n display: flex;\r\n align-items: center;\r\n margin-left: auto;\r\n padding-left: var(--md-spacing-sm);\r\n color: var(--md-menu-arrow-color);\r\n opacity: 0.6;\r\n font-size: 12px;\r\n }\r\n\r\n .mac-menu-portal .menu-item.active .menu-item-arrow {\r\n color: var(--md-mac-text-white-soft);\r\n opacity: 0.9;\r\n }\r\n\r\n .mac-menu-portal .menu-divider {\r\n height: 1px;\r\n background: var(--md-menu-divider-color);\r\n margin: var(--md-menu-divider-margin);\r\n }\r\n\r\n /* 深色模式 */\r\n .mac-menu-portal[data-theme='dark'] {\r\n background: var(--md-menu-container-dark-bg);\r\n border-color: var(--md-menu-container-dark-border);\r\n box-shadow:\r\n 0 0 0 1px rgba(255, 255, 255, 0.05),\r\n 0 2px 4px rgba(0, 0, 0, 0.3),\r\n 0 8px 16px rgba(0, 0, 0, 0.4),\r\n 0 24px 48px rgba(0, 0, 0, 0.5);\r\n }\r\n\r\n .mac-menu-portal[data-theme='dark'].open {\r\n box-shadow:\r\n 0 0 0 1px rgba(255, 255, 255, 0.08),\r\n 0 4px 8px rgba(0, 0, 0, 0.4),\r\n 0 12px 24px rgba(0, 0, 0, 0.5),\r\n 0 32px 64px rgba(0, 0, 0, 0.6);\r\n }\r\n\r\n .mac-menu-portal[data-theme='dark'] .menu-item:hover:not(.disabled) {\r\n background: var(--md-menu-item-dark-hover-bg);\r\n }\r\n\r\n .mac-menu-portal[data-theme='dark'] .menu-item:focus-visible:not(.disabled) {\r\n background: var(--md-menu-item-dark-hover-bg);\r\n box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.2);\r\n }\r\n\r\n .mac-menu-portal[data-theme='dark'] .menu-item.active {\r\n background: var(--md-menu-item-dark-active-bg);\r\n color: var(--md-menu-item-active-color);\r\n }\r\n\r\n .mac-menu-portal[data-theme='dark'] .menu-item.active:hover {\r\n background: var(--md-menu-item-dark-active-bg);\r\n }\r\n\r\n .mac-menu-portal[data-theme='dark'] .menu-item.danger:hover:not(.disabled) {\r\n background: rgba(255, 59, 48, 0.15);\r\n }\r\n\r\n .mac-menu-portal[data-theme='dark'] .menu-divider {\r\n background: var(--md-menu-divider-dark-color);\r\n }\r\n\r\n .mac-menu-portal[data-theme='dark'] .menu-item {\r\n color: var(--md-menu-item-dark-color);\r\n }\r\n\r\n .mac-menu-portal[data-theme='dark'] .menu-item-shortcut {\r\n color: var(--md-menu-shortcut-dark-color);\r\n }\r\n\r\n .mac-menu-portal[data-theme='dark'] .menu-item-arrow {\r\n color: var(--md-menu-shortcut-dark-color);\r\n }\r\n\r\n /* 移动端适配 */\r\n @media (max-width: 768px) {\r\n .mac-menu-portal {\r\n min-width: calc(100vw - 32px) !important;\r\n max-width: calc(100vw - 32px) !important;\r\n border-radius: 12px;\r\n }\r\n\r\n .mac-menu-portal .menu-item {\r\n padding: 12px 16px !important;\r\n font-size: var(--md-font-size-lg) !important;\r\n gap: var(--md-spacing-md);\r\n }\r\n\r\n .mac-menu-portal .menu-item-icon {\r\n width: 20px;\r\n height: 20px;\r\n font-size: 16px;\r\n }\r\n }\r\n `\r\n document.head.appendChild(style)\r\n }\r\n\r\n private _handleDocumentClick = (e: Event) => {\r\n if (!this.visible || !this._menuEl) return\r\n const target = e.target as Node\r\n if (this._menuEl.contains(target) || this.contains(target)) return\r\n this.hide()\r\n }\r\n\r\n private _handleKeyDown = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape' && this.visible) {\r\n e.preventDefault()\r\n this.hide()\r\n }\r\n }\r\n\r\n private _getPortalTheme(): 'light' | 'dark' | undefined {\r\n const resolvedTheme = this._resolvedTheme\r\n if (resolvedTheme) return resolvedTheme\r\n\r\n const docTheme = document.documentElement.getAttribute('data-theme') as 'light' | 'dark' | null\r\n if (docTheme) return docTheme\r\n\r\n const bodyTheme = document.body.getAttribute('data-theme') as 'light' | 'dark' | null\r\n if (bodyTheme) return bodyTheme\r\n\r\n return undefined\r\n }\r\n\r\n private _addScrollListener() {\r\n if (this._scrollHandler) return\r\n\r\n this._scrollHandler = (e: Event) => {\r\n if (this.visible && this._menuEl && !this._menuEl.contains(e.target as Node)) {\r\n this.hide()\r\n }\r\n }\r\n\r\n this._resizeHandler = () => {\r\n if (this.visible) {\r\n this.hide()\r\n }\r\n }\r\n\r\n window.addEventListener('scroll', this._scrollHandler, true)\r\n window.addEventListener('resize', this._resizeHandler)\r\n }\r\n\r\n private _removeScrollListener() {\r\n if (this._scrollHandler) {\r\n window.removeEventListener('scroll', this._scrollHandler, true)\r\n this._scrollHandler = null\r\n }\r\n if (this._resizeHandler) {\r\n window.removeEventListener('resize', this._resizeHandler)\r\n this._resizeHandler = null\r\n }\r\n }\r\n\r\n private _createMenu() {\r\n this._removeMenu()\r\n\r\n const menu = document.createElement('div')\r\n menu.className = 'mac-menu-portal open'\r\n const theme = this._getPortalTheme()\r\n if (theme) {\r\n menu.setAttribute('data-theme', theme)\r\n }\r\n\r\n menu.innerHTML = this._renderItems()\r\n\r\n // 计算位置\r\n const pos = this._calcPosition()\r\n menu.style.left = `${pos.left}px`\r\n menu.style.top = `${pos.top}px`\r\n\r\n document.body.appendChild(menu)\r\n this._menuEl = menu\r\n\r\n // 为项附加事件监听器\r\n this._attachItemListeners(menu)\r\n }\r\n\r\n private _removeMenu() {\r\n if (this._menuEl) {\r\n this._menuEl.remove()\r\n this._menuEl = null\r\n }\r\n }\r\n\r\n private _calcPosition() {\r\n const vw = window.innerWidth\r\n const vh = window.innerHeight\r\n const isMobile = vw <= 768\r\n const menuWidth = isMobile ? vw - 32 : 220\r\n const menuHeight = this.items.length * 32 + 8\r\n\r\n let left = isMobile ? 16 : this.x\r\n let top = this.y\r\n\r\n // 调整到视口内\r\n if (left + menuWidth > vw - 8) left = vw - menuWidth - 8\r\n if (top + menuHeight > vh - 8) top = vh - menuHeight - 8\r\n if (left < 8) left = 8\r\n if (top < 8) top = 8\r\n\r\n return { left, top }\r\n }\r\n\r\n private _renderItems(): string {\r\n return this.items\r\n .map((item) => {\r\n if (item.divider) {\r\n return '<div class=\"menu-divider\"></div>'\r\n }\r\n\r\n const classes = ['menu-item']\r\n if (item.disabled) classes.push('disabled')\r\n if (item.danger) classes.push('danger')\r\n if (item.value === this.value) classes.push('active')\r\n\r\n return `\r\n <div class=\"${classes.join(' ')}\" data-value=\"${item.value}\">\r\n ${item.icon ? `<span class=\"menu-item-icon\">${item.icon}</span>` : ''}\r\n <span class=\"menu-item-label\">${item.label}</span>\r\n ${item.shortcut ? `<span class=\"menu-item-shortcut\">${item.shortcut}</span>` : ''}\r\n </div>\r\n `\r\n })\r\n .join('')\r\n }\r\n\r\n private _attachItemListeners(menu: HTMLElement) {\r\n const items = menu.querySelectorAll('.menu-item:not(.disabled)')\r\n items.forEach((item) => {\r\n item.addEventListener('click', (e) => {\r\n const value = (item as HTMLElement).dataset.value!\r\n const menuItem = this.items.find((i) => i.value === value)\r\n if (menuItem && !menuItem.disabled && !menuItem.children) {\r\n this.value = value\r\n this.hide()\r\n this.emit('mac-menu-select', { detail: { value, item: menuItem } })\r\n }\r\n })\r\n })\r\n }\r\n\r\n override render() {\r\n return html``\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'mac-menu': MacMenu\r\n }\r\n}\r\n","import { html, css } from 'lit'\r\nimport { property, customElement, state } from 'lit/decorators.js'\r\nimport { BaseElement } from '../../internal/base-element'\r\nimport { sharedStyles } from '../../styles/shared-styles'\r\nimport { themeTokens } from '../../styles/theme'\r\n\r\n/**\r\n * @tag mac-text-ellipsis\r\n * @summary 支持行数限制、点击展开和提示框的文本省略组件。\r\n *\r\n * @slot - 文本内容的默认插槽。\r\n * @slot tooltip - 文本被截断时悬停显示的自定义提示框内容。\r\n * 如果未提供且 `tooltip` 为 `true`,则将使用完整文本作为提示框内容。\r\n *\r\n * @cssproperty --md-ellipsis-color - 文本颜色。\r\n * @cssproperty --md-ellipsis-expand-color - 展开触发链接的颜色。\r\n * @cssproperty --md-ellipsis-tooltip-bg - 提示框背景色。\r\n * @cssproperty --md-ellipsis-tooltip-color - 提示框文本颜色。\r\n *\r\n * @event mac-ellipsis-expand - 文本展开或收起时触发。`detail: { expanded: boolean }`\r\n */\r\n@customElement('mac-text-ellipsis')\r\nexport class MacTextEllipsis extends BaseElement {\r\n static override styles = [\r\n themeTokens,\r\n sharedStyles,\r\n css`\r\n :host {\r\n display: block;\r\n --md-ellipsis-color: var(--md-color-text);\r\n --md-ellipsis-expand-color: var(--md-color-primary);\r\n --md-ellipsis-tooltip-bg: var(--md-tooltip-bg);\r\n --md-ellipsis-tooltip-color: #fff;\r\n }\r\n\r\n .ellipsis-wrapper {\r\n position: relative;\r\n color: var(--md-ellipsis-color);\r\n font-size: var(--md-font-size-base);\r\n line-height: 1.5;\r\n word-break: break-word;\r\n }\r\n\r\n .ellipsis-content {\r\n display: -webkit-box;\r\n -webkit-box-orient: vertical;\r\n overflow: hidden;\r\n transition: max-height var(--md-transition-normal);\r\n }\r\n\r\n .ellipsis-content.clamped {\r\n -webkit-line-clamp: var(--_line-clamp);\r\n }\r\n\r\n .ellipsis-content.expanded {\r\n display: block;\r\n -webkit-line-clamp: unset;\r\n }\r\n\r\n .ellipsis-content.clickable {\r\n cursor: pointer;\r\n }\r\n\r\n /* 提示框 */\r\n .tooltip-wrapper {\r\n position: relative;\r\n display: inline;\r\n }\r\n\r\n .tooltip-popup {\r\n position: fixed;\r\n z-index: 99999;\r\n max-width: 320px;\r\n padding: 6px 10px;\r\n background: var(--md-ellipsis-tooltip-bg);\r\n backdrop-filter: blur(var(--md-tooltip-blur));\r\n -webkit-backdrop-filter: blur(var(--md-tooltip-blur));\r\n border: 1px solid var(--md-tooltip-border);\r\n border-radius: var(--md-radius-md);\r\n box-shadow: var(--md-tooltip-shadow);\r\n color: var(--md-ellipsis-tooltip-color);\r\n font-size: var(--md-font-size-sm);\r\n line-height: 1.5;\r\n word-break: break-word;\r\n white-space: pre-wrap;\r\n pointer-events: none;\r\n opacity: 0;\r\n transform: translateY(4px);\r\n transition:\r\n opacity 120ms ease,\r\n transform 120ms ease;\r\n }\r\n\r\n .tooltip-popup.visible {\r\n opacity: 1;\r\n transform: translateY(0);\r\n }\r\n `,\r\n ]\r\n\r\n /** 截断前显示的最大行数。 */\r\n @property({ type: Number, attribute: 'line-clamp' }) lineClamp = 3\r\n\r\n /** 如何触发展开。'click' 显示展开链接;'none' 禁用展开。 */\r\n @property({ attribute: 'expand-trigger' }) expandTrigger: 'click' | 'none' = 'none'\r\n\r\n /** 文本当前是否已展开。 */\r\n @property({ type: Boolean, reflect: true }) expanded = false\r\n\r\n /** 文本被截断时悬停是否显示提示框。 */\r\n @property({ type: Boolean }) tooltip = false\r\n\r\n @state() private _isTruncated = false\r\n @state() private _tooltipVisible = false\r\n\r\n private _contentEl: HTMLElement | null = null\r\n private _tooltipEl: HTMLElement | null = null\r\n private _tooltipSlot: HTMLSlotElement | null = null\r\n\r\n override firstUpdated() {\r\n this._contentEl = this.renderRoot.querySelector('.ellipsis-content')\r\n this._checkTruncation()\r\n this._tooltipSlot = this.renderRoot.querySelector('slot[name=\"tooltip\"]')\r\n this._tooltipSlot?.addEventListener('slotchange', () => this._checkTruncation())\r\n }\r\n\r\n override updated(changed: Map<string, unknown>) {\r\n if (changed.has('lineClamp') || changed.has('expanded')) {\r\n this._checkTruncation()\r\n }\r\n }\r\n\r\n private _checkTruncation() {\r\n if (!this._contentEl) return\r\n // 临时移除限制以测量完整高度\r\n const hadClamp = this._contentEl.classList.contains('clamped')\r\n this._contentEl.classList.remove('clamped')\r\n this._contentEl.classList.add('expanded')\r\n const fullHeight = this._contentEl.scrollHeight\r\n this._contentEl.classList.remove('expanded')\r\n if (hadClamp) this._contentEl.classList.add('clamped')\r\n\r\n const lineHeight = parseFloat(getComputedStyle(this._contentEl).lineHeight) || 21\r\n const clampedHeight = lineHeight * this.lineClamp\r\n this._isTruncated = fullHeight > clampedHeight + 2\r\n }\r\n\r\n private _handleContentClick() {\r\n if (this.expandTrigger !== 'click' || !this._isTruncated) return\r\n this.expanded = !this.expanded\r\n this.emit('mac-ellipsis-expand', { detail: { expanded: this.expanded } })\r\n }\r\n\r\n // --- 提示框 ---\r\n private _handleMouseEnter() {\r\n if (!this._isTruncated || this.expanded) return\r\n // 如果存在自定义插槽内容或启用了 tooltip 属性,则显示提示框\r\n const hasCustomTooltip = (this._tooltipSlot?.assignedNodes() ?? []).length > 0\r\n if (!hasCustomTooltip && !this.tooltip) return\r\n this._showTooltip()\r\n }\r\n\r\n private _handleMouseLeave() {\r\n this._hideTooltip()\r\n }\r\n\r\n private _showTooltip() {\r\n if (this._tooltipVisible) return\r\n this._tooltipVisible = true\r\n\r\n // 创建提示框 portal\r\n if (!this._tooltipEl) {\r\n this._tooltipEl = document.createElement('div')\r\n this._tooltipEl.className = 'mac-ellipsis-tooltip-portal'\r\n this._tooltipEl.style.cssText = `\r\n position: fixed;\r\n z-index: 99999;\r\n max-width: 320px;\r\n padding: 6px 10px;\r\n background: var(--md-ellipsis-tooltip-bg, rgba(30,30,30,0.82));\r\n backdrop-filter: blur(16px);\r\n -webkit-backdrop-filter: blur(16px);\r\n border: 1px solid rgba(255,255,255,0.12);\r\n border-radius: 6px;\r\n box-shadow: 0 2px 12px rgba(0,0,0,0.2);\r\n color: #fff;\r\n font-size: 12px;\r\n line-height: 1.5;\r\n word-break: break-word;\r\n white-space: pre-wrap;\r\n pointer-events: none;\r\n opacity: 0;\r\n transform: translateY(4px);\r\n transition: opacity 120ms ease, transform 120ms ease;\r\n `\r\n document.body.appendChild(this._tooltipEl)\r\n }\r\n\r\n // 获取提示框内容:优先使用自定义插槽,否则使用完整文本\r\n const tooltipNodes = this._tooltipSlot?.assignedNodes() ?? []\r\n const content = tooltipNodes.length\r\n ? tooltipNodes\r\n .map((n) => (n instanceof Element ? n.innerHTML : (n.textContent ?? '')))\r\n .join('')\r\n : (this.textContent ?? '')\r\n this._tooltipEl.innerHTML = content\r\n\r\n // 位置\r\n const rect = this.getBoundingClientRect()\r\n this._tooltipEl.style.left = `${rect.left}px`\r\n this._tooltipEl.style.top = `${rect.bottom + 6}px`\r\n\r\n requestAnimationFrame(() => {\r\n if (!this._tooltipEl) return\r\n // 如果溢出视口则调整\r\n const tipRect = this._tooltipEl.getBoundingClientRect()\r\n if (tipRect.right > window.innerWidth - 8) {\r\n this._tooltipEl.style.left = `${window.innerWidth - tipRect.width - 8}px`\r\n }\r\n if (tipRect.bottom > window.innerHeight - 8) {\r\n this._tooltipEl.style.top = `${rect.top - tipRect.height - 6}px`\r\n }\r\n this._tooltipEl.style.opacity = '1'\r\n this._tooltipEl.style.transform = 'translateY(0)'\r\n })\r\n }\r\n\r\n private _hideTooltip() {\r\n if (!this._tooltipEl || !this._tooltipVisible) return\r\n this._tooltipVisible = false\r\n this._tooltipEl.style.opacity = '0'\r\n this._tooltipEl.style.transform = 'translateY(4px)'\r\n }\r\n\r\n override disconnectedCallback() {\r\n super.disconnectedCallback()\r\n this._hideTooltip()\r\n if (this._tooltipEl) {\r\n this._tooltipEl.remove()\r\n this._tooltipEl = null\r\n }\r\n }\r\n\r\n override render() {\r\n const isClamped = this._isTruncated && !this.expanded\r\n const isClickable = this.expandTrigger === 'click' && this._isTruncated\r\n\r\n return html`\r\n <div\r\n class=\"ellipsis-wrapper\"\r\n @mouseenter=${this._handleMouseEnter}\r\n @mouseleave=${this._handleMouseLeave}\r\n >\r\n <div\r\n class=\"ellipsis-content ${isClamped ? 'clamped' : ''} ${\r\n this.expanded ? 'expanded' : ''\r\n } ${isClickable ? 'clickable' : ''}\"\r\n style=\"--_line-clamp: ${this.lineClamp}\"\r\n @click=${this._handleContentClick}\r\n >\r\n <slot></slot>\r\n </div>\r\n </div>\r\n\r\n <slot name=\"tooltip\" style=\"display:none\"></slot>\r\n `\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'mac-text-ellipsis': MacTextEllipsis\r\n }\r\n}\r\n","import { html, css, nothing, svg, SVGTemplateResult } from 'lit'\r\nimport { property, customElement, state } from 'lit/decorators.js'\r\nimport { BaseElement } from '../../internal/base-element'\r\nimport { sharedStyles } from '../../styles/shared-styles'\r\nimport { themeTokens } from '../../styles/theme'\r\n\r\n/**\r\n * @tag mac-rating\r\n * @summary macOS 风格的评分组件,支持自定义图标。\r\n *\r\n * @slot icon-empty - 空状态时的自定义图标。\r\n * @slot icon-half - 半填充状态时的自定义图标。\r\n * @slot icon-full - 全填充状态时的自定义图标。\r\n *\r\n * @cssproperty --md-rating-icon-size - 每个评分图标的大小。\r\n * @cssproperty --md-rating-gap - 图标之间的间距。\r\n * @cssproperty --md-rating-color-active - 激活(已填充)图标的颜色。\r\n * @cssproperty --md-rating-color-inactive - 未激活(空)图标的颜色。\r\n * @cssproperty --md-rating-color-hover - 悬停时图标的颜色。\r\n * @cssproperty --md-rating-color-disabled - 禁用时的颜色。\r\n *\r\n * @event mac-rating-change - 评分值变化时触发。`detail: { value: number }`\r\n */\r\n@customElement('mac-rating')\r\nexport class MacRating extends BaseElement {\r\n static override styles = [\r\n themeTokens,\r\n sharedStyles,\r\n css`\r\n :host {\r\n display: inline-flex;\r\n align-items: center;\r\n cursor: pointer;\r\n --md-rating-icon-size: var(--md-icon-size-lg, 24px);\r\n --md-rating-gap: var(--md-spacing-xs, 4px);\r\n --md-rating-color-active: var(--md-color-warning, #f59e0b);\r\n --md-rating-color-inactive: var(--md-color-border, #d1d5db);\r\n --md-rating-color-hover: var(--md-color-warning, #f59e0b);\r\n --md-rating-color-disabled: var(--md-color-border, #d1d5db);\r\n }\r\n\r\n :host([disabled]) {\r\n cursor: not-allowed;\r\n pointer-events: none;\r\n }\r\n\r\n .rating {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: var(--md-rating-gap);\r\n }\r\n\r\n .icon-wrapper {\r\n position: relative;\r\n width: var(--md-rating-icon-size);\r\n height: var(--md-rating-icon-size);\r\n flex-shrink: 0;\r\n }\r\n\r\n .icon-layer {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n transition:\r\n transform 0.15s cubic-bezier(0.4, 0, 0.2, 1),\r\n color 0.15s cubic-bezier(0.4, 0, 0.2, 1);\r\n }\r\n\r\n .icon-layer svg {\r\n width: 100%;\r\n height: 100%;\r\n }\r\n\r\n .icon-layer--empty {\r\n color: var(--md-rating-color-inactive);\r\n }\r\n\r\n .icon-layer--full {\r\n color: var(--md-rating-color-active);\r\n clip-path: inset(0 0 0 0);\r\n }\r\n\r\n .icon-layer--half {\r\n color: var(--md-rating-color-active);\r\n clip-path: inset(0 50% 0 0);\r\n }\r\n\r\n .icon-layer--hover {\r\n color: var(--md-rating-color-hover);\r\n transform: scale(1.15);\r\n }\r\n\r\n :host([disabled]) .icon-layer--full,\r\n :host([disabled]) .icon-layer--half {\r\n color: var(--md-rating-color-disabled);\r\n }\r\n\r\n /* Clickable zones */\r\n .click-zone {\r\n position: absolute;\r\n top: 0;\r\n height: 100%;\r\n z-index: 1;\r\n cursor: pointer;\r\n }\r\n\r\n .click-zone--left {\r\n left: 0;\r\n width: 50%;\r\n }\r\n\r\n .click-zone--right {\r\n right: 0;\r\n width: 50%;\r\n }\r\n\r\n :host([disabled]) .click-zone {\r\n cursor: not-allowed;\r\n }\r\n\r\n /* Label */\r\n .label {\r\n margin-left: var(--md-rating-gap);\r\n font-size: var(--md-font-size-base, 14px);\r\n color: var(--md-color-text-secondary, #6b7280);\r\n user-select: none;\r\n -webkit-user-select: none;\r\n }\r\n\r\n :host([disabled]) .label {\r\n opacity: 0.5;\r\n }\r\n\r\n /* Dark Mode */\r\n :host([data-theme='dark']) {\r\n --md-rating-color-inactive: var(--md-rating-color-dark-inactive, #4b5563);\r\n --md-rating-color-disabled: var(--md-rating-color-dark-inactive, #4b5563);\r\n }\r\n `,\r\n ]\r\n\r\n /** 当前评分值(支持半星,如 3.5) */\r\n @property({ type: Number }) value = 0\r\n\r\n /** 最大评分数量 */\r\n @property({ type: Number }) max = 5\r\n\r\n /** 是否允许半星选择 */\r\n @property({ type: Boolean }) allowHalf = false\r\n\r\n /** 评分是否为只读 */\r\n @property({ type: Boolean, reflect: true }) readonly = false\r\n\r\n /** 评分是否禁用 */\r\n @property({ type: Boolean, reflect: true }) disabled = false\r\n\r\n /** 是否显示数值标签 */\r\n @property({ type: Boolean }) showValue = false\r\n\r\n /** 图标形状:star, heart, circle, flame, thumb */\r\n @property() icon: 'star' | 'heart' | 'circle' | 'flame' | 'thumb' = 'star'\r\n\r\n /** 自定义空图标插槽名(覆盖内置图标) */\r\n @property() iconEmpty = ''\r\n\r\n /** 自定义半图标插槽名(覆盖内置图标) */\r\n @property() iconHalf = ''\r\n\r\n /** 自定义满图标插槽名(覆盖内置图标) */\r\n @property() iconFull = ''\r\n\r\n @state() private _hoverValue: number | null = null\r\n\r\n // 图标 SVG 路径\r\n private static readonly _icons: Record<string, SVGTemplateResult> = {\r\n star: svg`<path d=\"M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z\"/>`,\r\n heart: svg`<path d=\"M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z\"/>`,\r\n circle: svg`<circle cx=\"12\" cy=\"12\" r=\"10\"/>`,\r\n flame: svg`<path d=\"M12 23c-4.97 0-9-3.13-9-7 0-2.38 1.41-4.56 3.5-5.8C6.17 7.82 6 5.39 7.23 3.5 8.5 1.56 10.76 1 12 1c0 0-1.5 3-1.5 5.5 0 1.5.67 2.5 2 3 1.33.5 2.5-.5 2.5-2 0-1-.5-2.5-1.5-3.5 2.5 1 4.5 3.5 4.5 6.5 0 1.5-.5 3-1.5 4 1-1 1.5-2.5 1.5-4 0-3-2-5.5-4.5-6.5 1 1 1.5 2.5 1.5 3.5 0 1.5-1.17 2.5-2.5 2-1.33-.5-2-1.5-2-3C9.5 4 11 1 12 1c1.24 0 3.5.56 4.77 2.5C18 5.39 17.83 7.82 17.5 10.2 19.59 11.44 21 13.62 21 16c0 3.87-4.03 7-9 7z\"/>`,\r\n thumb: svg`<path d=\"M2 20h2c.55 0 1-.45 1-1v-9c0-.55-.45-1-1-1H2v11zm19.83-7.12c.11-.25.17-.52.17-.8V11c0-1.1-.9-2-2-2h-5.5l.92-4.65c.05-.22.02-.46-.08-.66-.23-.45-.52-.86-.88-1.22L14 2 7.59 8.41C7.21 8.79 7 9.3 7 9.83v7.84C7 18.95 8.05 20 9.34 20h8.11c.7 0 1.36-.37 1.72-.97l2.66-6.15z\"/>`,\r\n }\r\n\r\n private _getIconSvg(): SVGTemplateResult {\r\n return MacRating._icons[this.icon] ?? MacRating._icons.star\r\n }\r\n\r\n private _renderIconLayer(_className: string): SVGTemplateResult {\r\n return svg`\r\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" stroke=\"none\">\r\n ${this._getIconSvg()}\r\n </svg>\r\n `\r\n }\r\n\r\n override willUpdate() {\r\n const theme = this._resolvedTheme\r\n if (theme) {\r\n this.setAttribute('data-theme', theme)\r\n } else {\r\n this.removeAttribute('data-theme')\r\n }\r\n }\r\n\r\n private _getDisplayValue(): number {\r\n return this._hoverValue ?? this.value\r\n }\r\n\r\n private _onMouseEnter(index: number, half: 'left' | 'right'): void {\r\n if (this.readonly || this.disabled) return\r\n if (this.allowHalf) {\r\n this._hoverValue = half === 'left' ? index - 0.5 : index\r\n } else {\r\n this._hoverValue = index\r\n }\r\n }\r\n\r\n private _onMouseLeave(): void {\r\n if (this.readonly || this.disabled) return\r\n this._hoverValue = null\r\n }\r\n\r\n private _onClick(index: number, half: 'left' | 'right'): void {\r\n if (this.readonly || this.disabled) return\r\n let newValue: number\r\n if (this.allowHalf) {\r\n newValue = half === 'left' ? index - 0.5 : index\r\n } else {\r\n newValue = index\r\n }\r\n // 点击相同值以清除\r\n if (newValue === this.value) {\r\n this.value = 0\r\n } else {\r\n this.value = newValue\r\n }\r\n this.emit('mac-rating-change', { detail: { value: this.value } })\r\n }\r\n\r\n override render() {\r\n const displayValue = this._getDisplayValue()\r\n const isInteractive = !this.readonly && !this.disabled\r\n\r\n return html`\r\n <div class=\"rating\" @mouseleave=${isInteractive ? this._onMouseLeave : nothing}>\r\n ${Array.from({ length: this.max }, (_, i) => {\r\n const index = i + 1\r\n const filled = displayValue >= index\r\n const halfFilled = !filled && displayValue >= index - 0.5\r\n const isHovered = this._hoverValue !== null && index <= this._hoverValue\r\n const isHalfHovered =\r\n this._hoverValue !== null &&\r\n !filled &&\r\n index - 0.5 <= this._hoverValue &&\r\n index > this._hoverValue - 0.5\r\n\r\n return html`\r\n <div class=\"icon-wrapper\">\r\n <!-- 空图层(始终可见) -->\r\n <div class=\"icon-layer icon-layer--empty\">${this._renderIconLayer('empty')}</div>\r\n\r\n ${\r\n halfFilled || isHalfHovered\r\n ? html`\r\n <div\r\n class=\"icon-layer icon-layer--half ${isHovered ? 'icon-layer--hover' : ''}\"\r\n >\r\n ${this._renderIconLayer('half')}\r\n </div>\r\n `\r\n : nothing\r\n }\r\n ${\r\n filled\r\n ? html`\r\n <div\r\n class=\"icon-layer icon-layer--full ${isHovered ? 'icon-layer--hover' : ''}\"\r\n >\r\n ${this._renderIconLayer('full')}\r\n </div>\r\n `\r\n : nothing\r\n }\r\n ${\r\n isInteractive\r\n ? html`\r\n <div\r\n class=\"click-zone click-zone--left\"\r\n @mouseenter=${() => this._onMouseEnter(index, 'left')}\r\n @click=${() => this._onClick(index, 'left')}\r\n ></div>\r\n <div\r\n class=\"click-zone click-zone--right\"\r\n @mouseenter=${() => this._onMouseEnter(index, 'right')}\r\n @click=${() => this._onClick(index, 'right')}\r\n ></div>\r\n `\r\n : nothing\r\n }\r\n </div>\r\n `\r\n })}\r\n ${\r\n this.showValue\r\n ? html`<span class=\"label\">${displayValue.toFixed(this.allowHalf ? 1 : 0)}</span>`\r\n : nothing\r\n }\r\n </div>\r\n `\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'mac-rating': MacRating\r\n }\r\n}\r\n","import { html, css, nothing } from 'lit'\r\nimport { property, customElement } from 'lit/decorators.js'\r\nimport { BaseElement } from '../../internal/base-element'\r\nimport { sharedStyles } from '../../styles/shared-styles'\r\nimport { themeTokens } from '../../styles/theme'\r\n\r\nexport interface DescriptionItem {\r\n label: string\r\n value: string\r\n span?: number\r\n labelStyle?: string\r\n contentStyle?: string\r\n}\r\n\r\n/**\r\n * @tag mac-descriptions\r\n * @summary A macOS-style descriptions list component for displaying key-value pairs.\r\n *\r\n * @slot - Default slot for mac-description-item elements.\r\n * @slot title - Custom title content.\r\n * @slot extra - Extra content in the header (e.g. actions).\r\n *\r\n * @cssproperty --md-descriptions-container-bg - Container background.\r\n * @cssproperty --md-descriptions-container-border - Container border color.\r\n * @cssproperty --md-descriptions-container-radius - Container border radius.\r\n * @cssproperty --md-descriptions-container-shadow - Container shadow.\r\n * @cssproperty --md-descriptions-header-padding - Header padding.\r\n * @cssproperty --md-descriptions-header-border - Header bottom border.\r\n * @cssproperty --md-descriptions-title-font-size - Title font size.\r\n * @cssproperty --md-descriptions-title-color - Title text color.\r\n * @cssproperty --md-descriptions-label-color - Label text color.\r\n * @cssproperty --md-descriptions-label-bg - Label background.\r\n * @cssproperty --md-descriptions-label-width - Label width (left placement).\r\n * @cssproperty --md-descriptions-value-color - Value text color.\r\n * @cssproperty --md-descriptions-value-bg - Value background.\r\n * @cssproperty --md-descriptions-row-border - Row separator border.\r\n * @cssproperty --md-descriptions-cell-padding - Cell padding.\r\n * @cssproperty --md-descriptions-separator-color - Separator color.\r\n */\r\n@customElement('mac-descriptions')\r\nexport class MacDescriptions extends BaseElement {\r\n static override styles = [\r\n themeTokens,\r\n sharedStyles,\r\n css`\r\n :host {\r\n display: block;\r\n --md-descriptions-container-bg: var(--md-glass-menu-bg);\r\n --md-descriptions-container-border: var(--md-glass-separator);\r\n --md-descriptions-container-radius: var(--md-radius-dock);\r\n --md-descriptions-container-shadow: var(--md-menu-shadow);\r\n --md-descriptions-header-padding: var(--md-spacing-md) var(--md-spacing-lg);\r\n --md-descriptions-header-border: var(--md-glass-separator);\r\n --md-descriptions-title-font-size: var(--md-font-size-menu);\r\n --md-descriptions-title-color: var(--md-color-text);\r\n --md-descriptions-label-color: var(--md-color-text-secondary);\r\n --md-descriptions-label-bg: rgba(0, 0, 0, 0.02);\r\n --md-descriptions-label-width: 120px;\r\n --md-descriptions-value-color: var(--md-color-text);\r\n --md-descriptions-value-bg: transparent;\r\n --md-descriptions-row-border: var(--md-glass-separator);\r\n --md-descriptions-cell-padding: var(--md-spacing-sm) var(--md-spacing-lg);\r\n --md-descriptions-separator-color: var(--md-color-text-secondary);\r\n }\r\n\r\n .container {\r\n background: var(--md-descriptions-container-bg);\r\n backdrop-filter: blur(var(--md-glass-blur)) saturate(var(--md-glass-saturate));\r\n -webkit-backdrop-filter: blur(var(--md-glass-blur)) saturate(var(--md-glass-saturate));\r\n border: 0.5px solid var(--md-descriptions-container-border);\r\n border-radius: var(--md-descriptions-container-radius);\r\n box-shadow: var(--md-descriptions-container-shadow);\r\n overflow: hidden;\r\n }\r\n\r\n /* ─── Header ─── */\r\n\r\n .header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: var(--md-descriptions-header-padding);\r\n border-bottom: 0.5px solid var(--md-descriptions-header-border);\r\n }\r\n\r\n .header:empty {\r\n display: none;\r\n }\r\n\r\n .title {\r\n font-size: var(--md-descriptions-title-font-size);\r\n font-weight: 600;\r\n color: var(--md-descriptions-title-color);\r\n letter-spacing: -0.01em;\r\n }\r\n\r\n .extra {\r\n margin-left: auto;\r\n }\r\n\r\n /* ─── Table Layout (label-placement: left, bordered) ─── */\r\n\r\n .table {\r\n width: 100%;\r\n border-collapse: collapse;\r\n table-layout: fixed;\r\n }\r\n\r\n .table tr:not(:last-child) td {\r\n border-bottom: 0.5px solid var(--md-descriptions-row-border);\r\n }\r\n\r\n .label-cell {\r\n color: var(--md-descriptions-label-color);\r\n background: var(--md-descriptions-label-bg);\r\n padding: var(--md-descriptions-cell-padding);\r\n font-size: var(--md-font-size-sm);\r\n white-space: nowrap;\r\n vertical-align: top;\r\n width: var(--md-descriptions-label-width);\r\n }\r\n\r\n .value-cell {\r\n color: var(--md-descriptions-value-color);\r\n background: var(--md-descriptions-value-bg);\r\n padding: var(--md-descriptions-cell-padding);\r\n font-size: var(--md-font-size-base);\r\n vertical-align: top;\r\n word-break: break-word;\r\n }\r\n\r\n /* ─── Left placement (non-bordered): inline label: value ─── */\r\n\r\n .left-list {\r\n display: flex;\r\n flex-direction: column;\r\n }\r\n\r\n .left-item {\r\n display: flex;\r\n align-items: baseline;\r\n padding: var(--md-descriptions-cell-padding);\r\n }\r\n\r\n .left-item:not(:last-child) {\r\n border-bottom: 0.5px solid var(--md-descriptions-row-border);\r\n }\r\n\r\n .left-label {\r\n color: var(--md-descriptions-label-color);\r\n font-size: var(--md-font-size-sm);\r\n white-space: nowrap;\r\n min-width: var(--md-descriptions-label-width);\r\n max-width: var(--md-descriptions-label-width);\r\n flex-shrink: 0;\r\n }\r\n\r\n .left-separator {\r\n color: var(--md-descriptions-separator-color);\r\n margin: 0 var(--md-spacing-xs);\r\n flex-shrink: 0;\r\n }\r\n\r\n .left-value {\r\n color: var(--md-descriptions-value-color);\r\n font-size: var(--md-font-size-base);\r\n flex: 1;\r\n word-break: break-word;\r\n }\r\n\r\n /* ─── Top placement: grid layout ─── */\r\n\r\n .top-grid {\r\n display: grid;\r\n gap: 0;\r\n }\r\n\r\n .top-item {\r\n padding: var(--md-descriptions-cell-padding);\r\n }\r\n\r\n .top-item:not(:last-child) {\r\n border-bottom: 0.5px solid var(--md-descriptions-row-border);\r\n }\r\n\r\n .top-label {\r\n color: var(--md-descriptions-label-color);\r\n font-size: var(--md-font-size-sm);\r\n margin-bottom: var(--md-spacing-xs);\r\n }\r\n\r\n .top-value {\r\n color: var(--md-descriptions-value-color);\r\n font-size: var(--md-font-size-base);\r\n word-break: break-word;\r\n }\r\n\r\n /* ─── Top placement bordered: table with labels above ─── */\r\n\r\n .top-table {\r\n width: 100%;\r\n border-collapse: collapse;\r\n table-layout: fixed;\r\n }\r\n\r\n .top-table td {\r\n padding: var(--md-descriptions-cell-padding);\r\n vertical-align: top;\r\n border-right: 0.5px solid var(--md-descriptions-row-border);\r\n border-bottom: 0.5px solid var(--md-descriptions-row-border);\r\n }\r\n\r\n .top-table tr:last-child td {\r\n border-bottom: none;\r\n }\r\n\r\n .top-table td:last-child {\r\n border-right: none;\r\n }\r\n\r\n .top-table .top-table-label {\r\n color: var(--md-descriptions-label-color);\r\n font-size: var(--md-font-size-sm);\r\n background: var(--md-descriptions-label-bg);\r\n border-bottom: 0.5px solid var(--md-descriptions-row-border);\r\n padding: calc(var(--md-descriptions-cell-padding) * 0.6) var(--md-descriptions-cell-padding);\r\n }\r\n\r\n .top-table .top-table-value {\r\n color: var(--md-descriptions-value-color);\r\n font-size: var(--md-font-size-base);\r\n word-break: break-word;\r\n }\r\n\r\n /* ─── Bordered variant (left placement) ─── */\r\n\r\n :host([bordered]) .label-cell,\r\n :host([bordered]) .value-cell {\r\n border-right: 0.5px solid var(--md-descriptions-row-border);\r\n }\r\n\r\n :host([bordered]) .label-cell:last-child,\r\n :host([bordered]) .value-cell:last-child {\r\n border-right: none;\r\n }\r\n\r\n :host([bordered]) .left-item {\r\n background: var(--md-descriptions-label-bg);\r\n }\r\n\r\n :host([bordered]) .left-value {\r\n background: var(--md-descriptions-value-bg);\r\n padding-left: var(--md-spacing-lg);\r\n }\r\n\r\n /* ─── Label alignment ─── */\r\n\r\n :host([label-align='left']) .label-cell,\r\n :host([label-align='left']) .left-label {\r\n text-align: left;\r\n }\r\n\r\n :host([label-align='center']) .label-cell,\r\n :host([label-align='center']) .left-label {\r\n text-align: center;\r\n }\r\n\r\n :host([label-align='right']) .label-cell,\r\n :host([label-align='right']) .left-label {\r\n text-align: right;\r\n }\r\n\r\n :host([label-align='left']) .top-label,\r\n :host([label-align='left']) .top-table-label {\r\n text-align: left;\r\n }\r\n\r\n :host([label-align='center']) .top-label,\r\n :host([label-align='center']) .top-table-label {\r\n text-align: center;\r\n }\r\n\r\n :host([label-align='right']) .top-label,\r\n :host([label-align='right']) .top-table-label {\r\n text-align: right;\r\n }\r\n\r\n /* ─── Size: sm ─── */\r\n\r\n :host([size='sm']) {\r\n --md-descriptions-cell-padding: var(--md-spacing-xs) var(--md-spacing-md);\r\n --md-descriptions-label-width: 100px;\r\n }\r\n\r\n /* ─── Size: lg ─── */\r\n\r\n :host([size='lg']) {\r\n --md-descriptions-cell-padding: var(--md-spacing-md) var(--md-spacing-xl);\r\n --md-descriptions-label-width: 140px;\r\n }\r\n\r\n :host([data-theme='dark']) {\r\n --md-descriptions-container-bg: rgba(40, 40, 40, 0.85);\r\n --md-descriptions-container-border: rgba(255, 255, 255, 0.08);\r\n --md-descriptions-header-border: rgba(255, 255, 255, 0.08);\r\n --md-descriptions-title-color: rgba(255, 255, 255, 0.92);\r\n --md-descriptions-label-color: rgba(255, 255, 255, 0.55);\r\n --md-descriptions-label-bg: rgba(255, 255, 255, 0.04);\r\n --md-descriptions-value-color: rgba(255, 255, 255, 0.88);\r\n --md-descriptions-row-border: rgba(255, 255, 255, 0.06);\r\n --md-descriptions-separator-color: rgba(255, 255, 255, 0.55);\r\n }\r\n\r\n :host([data-theme='light']) {\r\n --md-descriptions-container-bg: var(--md-glass-menu-bg);\r\n --md-descriptions-container-border: var(--md-glass-separator);\r\n --md-descriptions-header-border: var(--md-glass-separator);\r\n --md-descriptions-title-color: var(--md-color-text);\r\n --md-descriptions-label-color: var(--md-color-text-secondary);\r\n --md-descriptions-label-bg: rgba(0, 0, 0, 0.02);\r\n --md-descriptions-value-color: var(--md-color-text);\r\n --md-descriptions-row-border: var(--md-glass-separator);\r\n --md-descriptions-separator-color: var(--md-color-text-secondary);\r\n }\r\n `,\r\n ]\r\n\r\n /** Label placement: 'left' shows label beside value, 'top' shows label above value */\r\n @property({ attribute: 'label-placement', reflect: true }) labelPlacement: 'left' | 'top' = 'left'\r\n\r\n /** Label text alignment */\r\n @property({ attribute: 'label-align', reflect: true }) labelAlign: 'left' | 'center' | 'right' =\r\n 'left'\r\n\r\n /** Number of columns per row */\r\n @property({ type: Number }) column = 3\r\n\r\n /** Component size */\r\n @property({ reflect: true }) size?: 'sm' | 'md' | 'lg'\r\n\r\n /** Whether to show bordered style */\r\n @property({ type: Boolean, reflect: true }) bordered = false\r\n\r\n /** Title text */\r\n @property() title = ''\r\n\r\n /** Separator between label and value (only for label-placement='left' and not bordered) */\r\n @property() separator = ':'\r\n\r\n /** Data items (alternative to slot) */\r\n @property({ type: Array }) items: DescriptionItem[] = []\r\n\r\n override willUpdate() {\r\n const size = this._resolvedSize\r\n if (this.getAttribute('size') !== size) {\r\n this.setAttribute('size', size)\r\n }\r\n const theme = this._resolvedTheme\r\n if (theme) {\r\n this.setAttribute('data-theme', theme)\r\n } else {\r\n this.removeAttribute('data-theme')\r\n }\r\n }\r\n\r\n private _getItems(): DescriptionItem[] {\r\n if (this.items && this.items.length > 0) {\r\n return this.items\r\n }\r\n const slotItems: DescriptionItem[] = []\r\n const slotted = this.querySelectorAll('mac-description-item')\r\n slotted.forEach((el) => {\r\n slotItems.push({\r\n label: el.getAttribute('label') || '',\r\n value: el.getAttribute('value') || el.textContent?.trim() || '',\r\n span: Number(el.getAttribute('span')) || 1,\r\n labelStyle: el.getAttribute('label-style') || undefined,\r\n contentStyle: el.getAttribute('content-style') || undefined,\r\n })\r\n })\r\n return slotItems\r\n }\r\n\r\n private _renderHeader() {\r\n const hasTitle = this.title || this.querySelector('[slot=\"title\"]')\r\n const hasExtra = this.querySelector('[slot=\"extra\"]')\r\n if (!hasTitle && !hasExtra) return nothing\r\n\r\n return html`\r\n <div class=\"header\">\r\n <div class=\"title\">\r\n <slot name=\"title\">${this.title}</slot>\r\n </div>\r\n <div class=\"extra\">\r\n <slot name=\"extra\"></slot>\r\n </div>\r\n </div>\r\n `\r\n }\r\n\r\n /**\r\n * Build rows from items respecting column count and span.\r\n * Each row is an array of { item, effectiveSpan }.\r\n */\r\n private _buildRows(): { item: DescriptionItem; effectiveSpan: number }[][] {\r\n const items = this._getItems()\r\n const colCount = this.column\r\n const rows: { item: DescriptionItem; effectiveSpan: number }[][] = []\r\n\r\n let currentRow: { item: DescriptionItem; effectiveSpan: number }[] = []\r\n let currentSpan = 0\r\n\r\n for (const item of items) {\r\n const span = Math.min(item.span || 1, colCount)\r\n if (currentSpan + span > colCount) {\r\n rows.push(currentRow)\r\n currentRow = [{ item, effectiveSpan: span }]\r\n currentSpan = span\r\n } else {\r\n currentRow.push({ item, effectiveSpan: span })\r\n currentSpan += span\r\n }\r\n }\r\n if (currentRow.length > 0) {\r\n rows.push(currentRow)\r\n }\r\n\r\n return rows\r\n }\r\n\r\n /** label-placement: left + bordered → table with label | value columns */\r\n private _renderLeftBordered() {\r\n const rows = this._buildRows()\r\n\r\n return html`\r\n <table class=\"table\">\r\n ${rows.map(\r\n (row) => html`\r\n <tr>\r\n ${row.map(\r\n ({ item, effectiveSpan }) => html`\r\n <td class=\"label-cell\" style=${item.labelStyle || ''}>${item.label}</td>\r\n <td\r\n class=\"value-cell\"\r\n colspan=${effectiveSpan * 2 - 1}\r\n style=${item.contentStyle || ''}\r\n >\r\n ${item.value}\r\n </td>\r\n `,\r\n )}\r\n </tr>\r\n `,\r\n )}\r\n </table>\r\n `\r\n }\r\n\r\n /** label-placement: left + not bordered → inline label: value list */\r\n private _renderLeftNonBordered() {\r\n const items = this._getItems()\r\n\r\n return html`\r\n <div class=\"left-list\">\r\n ${items.map(\r\n (item) => html`\r\n <div class=\"left-item\">\r\n <div class=\"left-label\" style=${item.labelStyle || ''}>${item.label}</div>\r\n <span class=\"left-separator\">${this.separator}</span>\r\n <div class=\"left-value\" style=${item.contentStyle || ''}>${item.value}</div>\r\n </div>\r\n `,\r\n )}\r\n </div>\r\n `\r\n }\r\n\r\n /** label-placement: top + bordered → table with label row above value row */\r\n private _renderTopBordered() {\r\n const rows = this._buildRows()\r\n const colCount = this.column\r\n\r\n return html`\r\n <table class=\"top-table\">\r\n ${rows.map(\r\n (row) => html`\r\n <tr>\r\n ${row.map(\r\n ({ item, effectiveSpan }) => html`\r\n <td\r\n class=\"top-table-label\"\r\n colspan=${effectiveSpan}\r\n style=${item.labelStyle || ''}\r\n >\r\n ${item.label}\r\n </td>\r\n `,\r\n )}\r\n ${\r\n row.length < colCount\r\n ? html`<td\r\n colspan=${colCount - row.reduce((s, r) => s + r.effectiveSpan, 0)}\r\n ></td>`\r\n : nothing\r\n }\r\n </tr>\r\n <tr>\r\n ${row.map(\r\n ({ item, effectiveSpan }) => html`\r\n <td\r\n class=\"top-table-value\"\r\n colspan=${effectiveSpan}\r\n style=${item.contentStyle || ''}\r\n >\r\n ${item.value}\r\n </td>\r\n `,\r\n )}\r\n ${\r\n row.length < colCount\r\n ? html`<td\r\n colspan=${colCount - row.reduce((s, r) => s + r.effectiveSpan, 0)}\r\n ></td>`\r\n : nothing\r\n }\r\n </tr>\r\n `,\r\n )}\r\n </table>\r\n `\r\n }\r\n\r\n /** label-placement: top + not bordered → grid with label above value */\r\n private _renderTopNonBordered() {\r\n const rows = this._buildRows()\r\n const colCount = this.column\r\n\r\n return html`\r\n <div class=\"top-grid\" style=\"grid-template-columns: repeat(${colCount}, 1fr)\">\r\n ${rows.map((row) =>\r\n row.map(\r\n ({ item, effectiveSpan }) => html`\r\n <div class=\"top-item\" style=\"grid-column: span ${effectiveSpan}\">\r\n <div class=\"top-label\" style=${item.labelStyle || ''}>${item.label}</div>\r\n <div class=\"top-value\" style=${item.contentStyle || ''}>${item.value}</div>\r\n </div>\r\n `,\r\n ),\r\n )}\r\n </div>\r\n `\r\n }\r\n\r\n override render() {\r\n const body =\r\n this.labelPlacement === 'top'\r\n ? this.bordered\r\n ? this._renderTopBordered()\r\n : this._renderTopNonBordered()\r\n : this.bordered\r\n ? this._renderLeftBordered()\r\n : this._renderLeftNonBordered()\r\n\r\n return html`\r\n <div class=\"container\">\r\n ${this._renderHeader()} ${body}\r\n <slot style=\"display:none\"></slot>\r\n </div>\r\n `\r\n }\r\n}\r\n\r\n/**\r\n * @tag mac-description-item\r\n * @summary A child item for mac-descriptions (used in slot mode).\r\n *\r\n * @property label - Label text\r\n * @property value - Value text (alternative to text content)\r\n * @property span - Number of columns this item spans\r\n * @property label-style - Custom CSS style for the label\r\n * @property content-style - Custom CSS style for the content\r\n */\r\n@customElement('mac-description-item')\r\nexport class MacDescriptionItem extends BaseElement {\r\n static override styles = [\r\n css`\r\n :host {\r\n display: none;\r\n }\r\n `,\r\n ]\r\n\r\n /** Label text */\r\n @property() label = ''\r\n\r\n /** Value text (alternative to text content) */\r\n @property() value = ''\r\n\r\n /** Number of columns this item spans */\r\n @property({ type: Number }) span = 1\r\n\r\n /** Custom CSS style for the label */\r\n @property({ attribute: 'label-style' }) labelStyle = ''\r\n\r\n /** Custom CSS style for the content */\r\n @property({ attribute: 'content-style' }) contentStyle = ''\r\n\r\n override render() {\r\n return html`<slot></slot>`\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'mac-descriptions': MacDescriptions\r\n 'mac-description-item': MacDescriptionItem\r\n }\r\n}\r\n","import { html, css } from 'lit'\r\nimport { property, customElement, state } from 'lit/decorators.js'\r\nimport { BaseElement } from '../../internal/base-element'\r\nimport { sharedStyles } from '../../styles/shared-styles'\r\nimport { themeTokens } from '../../styles/theme'\r\n\r\ntype EasingFn = (t: number) => number\r\n\r\nconst EASING_MAP: Record<string, EasingFn> = {\r\n linear: (t) => t,\r\n easeIn: (t) => t * t,\r\n easeOut: (t) => t * (2 - t),\r\n easeInOut: (t) => (t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t),\r\n}\r\n\r\n/**\r\n * @tag mac-number-animation\r\n * @summary 数字动画组件,在数值之间平滑过渡。\r\n *\r\n * @slot prefix - 数字前的内容(例如货币符号)。\r\n * @slot suffix - 数字后的内容(例如单位文本)。\r\n *\r\n * @cssproperty --md-number-animation-font-size - 数字字体大小。\r\n * @cssproperty --md-number-animation-color - 数字文字颜色。\r\n * @cssproperty --md-number-animation-font-weight - 数字字重。\r\n * @cssproperty --md-number-animation-font-family - 数字字体。\r\n * @cssproperty --md-number-animation-prefix-color - 前缀文字颜色。\r\n * @cssproperty --md-number-animation-suffix-color - 后缀文字颜色。\r\n *\r\n * @event mac-number-animation-start - 动画开始时触发。`detail: { from, to }`\r\n * @event mac-number-animation-finish - 动画结束时触发。`detail: { value }`\r\n */\r\n@customElement('mac-number-animation')\r\nexport class MacNumberAnimation extends BaseElement {\r\n static override styles = [\r\n themeTokens,\r\n sharedStyles,\r\n css`\r\n :host {\r\n display: inline-flex;\r\n align-items: baseline;\r\n --md-number-animation-font-size: var(--md-font-size-display, 48px);\r\n --md-number-animation-color: var(--md-color-text);\r\n --md-number-animation-font-weight: 600;\r\n --md-number-animation-font-family: var(--md-font-family);\r\n --md-number-animation-prefix-color: var(--md-color-text-secondary);\r\n --md-number-animation-suffix-color: var(--md-color-text-secondary);\r\n }\r\n\r\n .number-animation {\r\n display: inline-flex;\r\n align-items: baseline;\r\n font-variant-numeric: tabular-nums;\r\n }\r\n\r\n .prefix,\r\n .suffix {\r\n font-size: calc(var(--md-number-animation-font-size) * 0.45);\r\n color: var(--md-number-animation-prefix-color);\r\n font-weight: 400;\r\n }\r\n\r\n .suffix {\r\n color: var(--md-number-animation-suffix-color);\r\n }\r\n\r\n .value {\r\n font-size: var(--md-number-animation-font-size);\r\n font-weight: var(--md-number-animation-font-weight);\r\n font-family: var(--md-number-animation-font-family);\r\n color: var(--md-number-animation-color);\r\n line-height: 1;\r\n letter-spacing: -0.02em;\r\n }\r\n\r\n /* ─── 尺寸:sm ─── */\r\n\r\n :host([size='sm']) {\r\n --md-number-animation-font-size: var(--md-font-size-xl, 24px);\r\n }\r\n\r\n /* ─── 尺寸:md ─── */\r\n\r\n :host([size='md']) {\r\n --md-number-animation-font-size: var(--md-font-size-display, 48px);\r\n }\r\n\r\n /* ─── 尺寸:lg ─── */\r\n\r\n :host([size='lg']) {\r\n --md-number-animation-font-size: var(--md-font-size-hero, 72px);\r\n }\r\n\r\n /* ─── 深色模式 ─── */\r\n\r\n :host([data-theme='dark']) {\r\n --md-number-animation-color: rgba(255, 255, 255, 0.92);\r\n --md-number-animation-prefix-color: rgba(255, 255, 255, 0.55);\r\n --md-number-animation-suffix-color: rgba(255, 255, 255, 0.55);\r\n }\r\n\r\n :host([data-theme='light']) {\r\n --md-number-animation-color: var(--md-color-text);\r\n --md-number-animation-prefix-color: var(--md-color-text-secondary);\r\n --md-number-animation-suffix-color: var(--md-color-text-secondary);\r\n }\r\n `,\r\n ]\r\n\r\n /** 动画目标值 */\r\n @property({ type: Number }) to = 0\r\n\r\n /** 起始值 */\r\n @property({ type: Number }) from = 0\r\n\r\n /** 动画时长(毫秒) */\r\n @property({ type: Number }) duration = 2000\r\n\r\n /** 小数位数 */\r\n @property({ type: Number }) precision = 0\r\n\r\n /** 千位分隔符字符 */\r\n @property() separator = ''\r\n\r\n /** 缓动函数名称 */\r\n @property() easing: 'linear' | 'easeIn' | 'easeOut' | 'easeInOut' = 'easeOut'\r\n\r\n /** 连接时是否自动开始动画 */\r\n @property({ type: Boolean }) autoplay = true\r\n\r\n /** 前缀文本(替代插槽) */\r\n @property() prefix = ''\r\n\r\n /** 后缀文本(替代插槽) */\r\n @property() suffix = ''\r\n\r\n /** 组件尺寸 */\r\n @property({ reflect: true }) size?: 'sm' | 'md' | 'lg'\r\n\r\n /** 动画完成时的回调(可作为属性设置) */\r\n @property({ attribute: false }) onFinish?: (value: number) => void\r\n\r\n @state() private _displayValue = 0\r\n\r\n private _rafId: number | null = null\r\n private _startTime: number | null = null\r\n private _isAnimating = false\r\n\r\n override willUpdate() {\r\n const size = this._resolvedSize\r\n if (this.getAttribute('size') !== size) {\r\n this.setAttribute('size', size)\r\n }\r\n const theme = this._resolvedTheme\r\n if (theme) {\r\n this.setAttribute('data-theme', theme)\r\n } else {\r\n this.removeAttribute('data-theme')\r\n }\r\n }\r\n\r\n override updated(changed: Map<string, unknown>): void {\r\n // 当 `to` 或 `from` 变化时重新动画\r\n if (changed.has('to') || changed.has('from')) {\r\n if (this.autoplay && this._isAnimating === false) {\r\n this.start()\r\n }\r\n }\r\n }\r\n\r\n override connectedCallback(): void {\r\n super.connectedCallback()\r\n if (this.autoplay) {\r\n this._displayValue = this.from\r\n requestAnimationFrame(() => this.start())\r\n } else {\r\n this._displayValue = this.to\r\n }\r\n }\r\n\r\n override disconnectedCallback(): void {\r\n super.disconnectedCallback()\r\n this._stopAnimation()\r\n }\r\n\r\n /** 开始动画 */\r\n start(): void {\r\n this._stopAnimation()\r\n this._displayValue = this.from\r\n this._startTime = null\r\n this._isAnimating = true\r\n this.emit('mac-number-animation-start', { detail: { from: this.from, to: this.to } })\r\n this._rafId = requestAnimationFrame((t) => this._animate(t))\r\n }\r\n\r\n /** 重置到起始值 */\r\n reset(): void {\r\n this._stopAnimation()\r\n this._displayValue = this.from\r\n this._isAnimating = false\r\n }\r\n\r\n private _stopAnimation(): void {\r\n if (this._rafId !== null) {\r\n cancelAnimationFrame(this._rafId)\r\n this._rafId = null\r\n }\r\n this._isAnimating = false\r\n }\r\n\r\n private _animate(timestamp: number): void {\r\n if (this._startTime === null) {\r\n this._startTime = timestamp\r\n }\r\n\r\n const elapsed = timestamp - this._startTime\r\n const progress = Math.min(elapsed / this.duration, 1)\r\n const easingFn = EASING_MAP[this.easing] || EASING_MAP.easeOut\r\n const easedProgress = easingFn(progress)\r\n\r\n this._displayValue = this.from + (this.to - this.from) * easedProgress\r\n\r\n if (progress < 1) {\r\n this._rafId = requestAnimationFrame((t) => this._animate(t))\r\n } else {\r\n this._displayValue = this.to\r\n this._isAnimating = false\r\n this.emit('mac-number-animation-finish', { detail: { value: this.to } })\r\n this.onFinish?.(this.to)\r\n }\r\n\r\n this.requestUpdate()\r\n }\r\n\r\n private _formatNumber(value: number): string {\r\n const fixed = value.toFixed(this.precision)\r\n if (!this.separator) return fixed\r\n\r\n const [intPart, decPart] = fixed.split('.')\r\n const formatted = intPart!.replace(/\\B(?=(\\d{3})+(?!\\d))/g, this.separator)\r\n return decPart !== undefined ? `${formatted}.${decPart}` : formatted\r\n }\r\n\r\n override render() {\r\n const hasPrefixSlot = this.querySelector('[slot=\"prefix\"]')\r\n const hasSuffixSlot = this.querySelector('[slot=\"suffix\"]')\r\n\r\n return html`\r\n <span class=\"number-animation\">\r\n ${\r\n hasPrefixSlot\r\n ? html`<span class=\"prefix\"><slot name=\"prefix\"></slot></span>`\r\n : this.prefix\r\n ? html`<span class=\"prefix\">${this.prefix}</span>`\r\n : ''\r\n }\r\n\r\n <span class=\"value\">${this._formatNumber(this._displayValue)}</span>\r\n\r\n ${\r\n hasSuffixSlot\r\n ? html`<span class=\"suffix\"><slot name=\"suffix\"></slot></span>`\r\n : this.suffix\r\n ? html`<span class=\"suffix\">${this.suffix}</span>`\r\n : ''\r\n }\r\n </span>\r\n `\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'mac-number-animation': MacNumberAnimation\r\n }\r\n}\r\n","import { html, css, nothing } from 'lit'\r\nimport { property, customElement, state, query } from 'lit/decorators.js'\r\nimport { BaseElement } from '../../internal/base-element'\r\nimport { sharedStyles } from '../../styles/shared-styles'\r\nimport { themeTokens } from '../../styles/theme'\r\n\r\nexport interface TabItem {\r\n /** 唯一键 */\r\n key: string\r\n /** 标签文本 */\r\n label: string\r\n /** 标签是否禁用 */\r\n disabled?: boolean\r\n /** 标签是否可关闭 */\r\n closable?: boolean\r\n}\r\n\r\n/**\r\n * @tag mac-tabs\r\n * @summary macOS 风格的标签页组件,带带动画指示器。\r\n *\r\n * @slot - 用于放置 mac-tab-pane 元素的默认插槽。\r\n * @slot prefix - 标签导航前的内容。\r\n * @slot suffix - 标签导航后的内容。\r\n *\r\n * @cssproperty --md-tabs-nav-bg - Tab navigation bar background.\r\n * @cssproperty --md-tabs-nav-border - Tab navigation bar bottom border.\r\n * @cssproperty --md-tabs-nav-padding - Tab navigation bar padding.\r\n * @cssproperty --md-tabs-item-color - Tab item text color.\r\n * @cssproperty --md-tabs-item-hover-color - Tab item hover text color.\r\n * @cssproperty --md-tabs-item-active-color - Tab item active text color.\r\n * @cssproperty --md-tabs-item-disabled-color - Tab item disabled text color.\r\n * @cssproperty --md-tabs-item-padding - Tab item padding.\r\n * @cssproperty --md-tabs-item-font-size - Tab item font size.\r\n * @cssproperty --md-tabs-item-gap - Gap between tab items.\r\n * @cssproperty --md-tabs-indicator-color - Active indicator color.\r\n * @cssproperty --md-tabs-indicator-height - Active indicator height.\r\n * @cssproperty --md-tabs-indicator-radius - Active indicator radius.\r\n * @cssproperty --md-tabs-pane-padding - Tab pane content padding.\r\n * @cssproperty --md-tabs-close-color - Close icon color.\r\n * @cssproperty --md-tabs-close-hover-color - Close icon hover color.\r\n * @cssproperty --md-tabs-close-hover-bg - Close icon hover background.\r\n * @cssproperty --md-tabs-add-color - Add icon color.\r\n * @cssproperty --md-tabs-add-hover-color - Add icon hover color.\r\n * @cssproperty --md-tabs-add-hover-bg - Add icon hover background.\r\n * @cssproperty --md-tabs-segment-bg - Segment type background.\r\n * @cssproperty --md-tabs-segment-item-color - Segment item text color.\r\n * @cssproperty --md-tabs-segment-item-active-bg - Segment active item background.\r\n * @cssproperty --md-tabs-segment-item-active-color - Segment active item text color.\r\n * @cssproperty --md-tabs-segment-item-hover-bg - Segment item hover background.\r\n * @cssproperty --md-tabs-segment-radius - Segment container radius.\r\n *\r\n * @event mac-tabs-change - 激活标签变化时触发。`detail: { key: string }`\r\n * @event mac-tabs-close - 标签关闭时触发。`detail: { key: string }`\r\n * @event mac-tabs-add - 点击添加按钮时触发。\r\n */\r\n@customElement('mac-tabs')\r\nexport class MacTabs extends BaseElement {\r\n static override styles = [\r\n themeTokens,\r\n sharedStyles,\r\n css`\r\n :host {\r\n display: flex;\r\n flex-direction: column;\r\n --md-tabs-nav-bg: transparent;\r\n --md-tabs-nav-border: var(--md-glass-separator);\r\n --md-tabs-nav-padding: 0 var(--md-spacing-lg);\r\n --md-tabs-item-color: var(--md-color-text-secondary);\r\n --md-tabs-item-hover-color: var(--md-color-text);\r\n --md-tabs-item-active-color: var(--md-mac-accent);\r\n --md-tabs-item-disabled-color: var(--md-color-text-secondary);\r\n --md-tabs-item-padding: var(--md-spacing-sm) var(--md-spacing-md);\r\n --md-tabs-item-font-size: var(--md-font-size-base);\r\n --md-tabs-item-gap: var(--md-spacing-xs);\r\n --md-tabs-indicator-color: var(--md-mac-accent);\r\n --md-tabs-indicator-height: 2px;\r\n --md-tabs-indicator-radius: 1px;\r\n --md-tabs-pane-padding: var(--md-spacing-lg) 0;\r\n --md-tabs-close-color: var(--md-color-text-secondary);\r\n --md-tabs-close-hover-color: var(--md-color-text);\r\n --md-tabs-close-hover-bg: rgba(0, 0, 0, 0.06);\r\n --md-tabs-add-color: var(--md-color-text-secondary);\r\n --md-tabs-add-hover-color: var(--md-color-text);\r\n --md-tabs-add-hover-bg: rgba(0, 0, 0, 0.06);\r\n --md-tabs-segment-bg: rgba(0, 0, 0, 0.04);\r\n --md-tabs-segment-item-color: var(--md-color-text-secondary);\r\n --md-tabs-segment-item-active-bg: var(--md-color-bg);\r\n --md-tabs-segment-item-active-color: var(--md-color-text);\r\n --md-tabs-segment-item-hover-bg: rgba(0, 0, 0, 0.04);\r\n --md-tabs-segment-radius: var(--md-radius-md);\r\n }\r\n\r\n /* ─── 导航栏 ─── */\r\n\r\n .nav {\r\n display: flex;\r\n align-items: center;\r\n background: var(--md-tabs-nav-bg);\r\n padding: var(--md-tabs-nav-padding);\r\n position: relative;\r\n }\r\n\r\n .nav-content {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--md-tabs-item-gap);\r\n position: relative;\r\n flex: 1;\r\n overflow-x: auto;\r\n scrollbar-width: none;\r\n }\r\n\r\n .nav-content::-webkit-scrollbar {\r\n display: none;\r\n }\r\n\r\n /* ─── 标签项 ─── */\r\n\r\n .tab-item {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--md-spacing-xs);\r\n padding: var(--md-tabs-item-padding);\r\n font-size: var(--md-tabs-item-font-size);\r\n color: var(--md-tabs-item-color);\r\n cursor: pointer;\r\n white-space: nowrap;\r\n user-select: none;\r\n border-radius: var(--md-radius-sm);\r\n transition:\r\n color var(--md-transition-fast),\r\n background var(--md-transition-fast);\r\n position: relative;\r\n flex-shrink: 0;\r\n }\r\n\r\n .tab-item:hover {\r\n color: var(--md-tabs-item-hover-color);\r\n }\r\n\r\n .tab-item.active {\r\n color: var(--md-tabs-item-active-color);\r\n }\r\n\r\n .tab-item.disabled {\r\n color: var(--md-tabs-item-disabled-color);\r\n opacity: 0.4;\r\n cursor: not-allowed;\r\n }\r\n\r\n .tab-item.disabled:hover {\r\n color: var(--md-tabs-item-disabled-color);\r\n }\r\n\r\n /* ─── 关闭按钮 ─── */\r\n\r\n .close-btn {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 16px;\r\n height: 16px;\r\n border-radius: 50%;\r\n color: var(--md-tabs-close-color);\r\n transition:\r\n color var(--md-transition-fast),\r\n background var(--md-transition-fast);\r\n margin-left: 2px;\r\n flex-shrink: 0;\r\n }\r\n\r\n .close-btn:hover {\r\n color: var(--md-tabs-close-hover-color);\r\n background: var(--md-tabs-close-hover-bg);\r\n }\r\n\r\n .close-btn svg {\r\n width: 10px;\r\n height: 10px;\r\n }\r\n\r\n /* ─── 添加按钮 ─── */\r\n\r\n .add-btn {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 28px;\r\n height: 28px;\r\n border-radius: var(--md-radius-sm);\r\n color: var(--md-tabs-add-color);\r\n cursor: pointer;\r\n transition:\r\n color var(--md-transition-fast),\r\n background var(--md-transition-fast);\r\n flex-shrink: 0;\r\n }\r\n\r\n .add-btn:hover {\r\n color: var(--md-tabs-add-hover-color);\r\n background: var(--md-tabs-add-hover-bg);\r\n }\r\n\r\n .add-btn svg {\r\n width: 14px;\r\n height: 14px;\r\n }\r\n\r\n /* ─── 线条指示器 ─── */\r\n\r\n .indicator {\r\n position: absolute;\r\n bottom: 0;\r\n height: var(--md-tabs-indicator-height);\r\n background: var(--md-tabs-indicator-color);\r\n border-radius: var(--md-tabs-indicator-radius);\r\n transition:\r\n left var(--md-transition-normal),\r\n width var(--md-transition-normal);\r\n pointer-events: none;\r\n }\r\n\r\n /* ─── 线条类型:导航栏底部边框 ─── */\r\n\r\n :host([type='line']) .nav {\r\n border-bottom: 0.5px solid var(--md-tabs-nav-border);\r\n }\r\n\r\n /* ─── 卡片类型 ─── */\r\n\r\n :host([type='card']) .tab-item {\r\n background: rgba(0, 0, 0, 0.03);\r\n border: 0.5px solid var(--md-tabs-nav-border);\r\n border-bottom: none;\r\n border-radius: var(--md-radius-md) var(--md-radius-md) 0 0;\r\n margin-bottom: -0.5px;\r\n }\r\n\r\n :host([type='card']) .tab-item.active {\r\n background: var(--md-color-bg);\r\n border-bottom: 0.5px solid var(--md-color-bg);\r\n }\r\n\r\n :host([type='card']) .nav {\r\n border-bottom: 0.5px solid var(--md-tabs-nav-border);\r\n }\r\n\r\n :host([type='card']) .indicator {\r\n display: none;\r\n }\r\n\r\n /* ─── 分段类型 ─── */\r\n\r\n :host([type='segment']) .nav {\r\n padding: var(--md-spacing-xs);\r\n background: var(--md-tabs-segment-bg);\r\n border-radius: var(--md-tabs-segment-radius);\r\n border-bottom: none;\r\n }\r\n\r\n :host([type='segment']) .nav-content {\r\n gap: 0;\r\n }\r\n\r\n :host([type='segment']) .tab-item {\r\n padding: var(--md-spacing-xs) var(--md-spacing-lg);\r\n color: var(--md-tabs-segment-item-color);\r\n border-radius: var(--md-radius-sm);\r\n font-size: var(--md-font-size-sm);\r\n }\r\n\r\n :host([type='segment']) .tab-item:hover {\r\n background: var(--md-tabs-segment-item-hover-bg);\r\n color: var(--md-tabs-segment-item-color);\r\n }\r\n\r\n :host([type='segment']) .tab-item.active {\r\n background: var(--md-tabs-segment-item-active-bg);\r\n color: var(--md-tabs-segment-item-active-color);\r\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);\r\n }\r\n\r\n :host([type='segment']) .indicator {\r\n display: none;\r\n }\r\n\r\n /* ─── 标签面板 ─── */\r\n\r\n .pane-container {\r\n padding: var(--md-tabs-pane-padding);\r\n }\r\n\r\n /* ─── 尺寸:小 ─── */\r\n\r\n :host([size='sm']) {\r\n --md-tabs-item-padding: var(--md-spacing-xs) var(--md-spacing-sm);\r\n --md-tabs-item-font-size: var(--md-font-size-sm);\r\n --md-tabs-item-gap: 2px;\r\n --md-tabs-pane-padding: var(--md-spacing-md) 0;\r\n }\r\n\r\n /* ─── 尺寸:大 ─── */\r\n\r\n :host([size='lg']) {\r\n --md-tabs-item-padding: var(--md-spacing-md) var(--md-spacing-lg);\r\n --md-tabs-item-font-size: var(--md-font-size-lg);\r\n --md-tabs-item-gap: var(--md-spacing-sm);\r\n --md-tabs-pane-padding: var(--md-spacing-xl) 0;\r\n }\r\n\r\n :host([data-theme='dark']) {\r\n --md-tabs-nav-border: rgba(255, 255, 255, 0.08);\r\n --md-tabs-item-color: rgba(255, 255, 255, 0.55);\r\n --md-tabs-item-hover-color: rgba(255, 255, 255, 0.88);\r\n --md-tabs-item-active-color: rgba(0, 122, 255, 0.9);\r\n --md-tabs-item-disabled-color: rgba(255, 255, 255, 0.3);\r\n --md-tabs-indicator-color: rgba(0, 122, 255, 0.9);\r\n --md-tabs-close-color: rgba(255, 255, 255, 0.4);\r\n --md-tabs-close-hover-color: rgba(255, 255, 255, 0.8);\r\n --md-tabs-close-hover-bg: rgba(255, 255, 255, 0.08);\r\n --md-tabs-add-color: rgba(255, 255, 255, 0.4);\r\n --md-tabs-add-hover-color: rgba(255, 255, 255, 0.8);\r\n --md-tabs-add-hover-bg: rgba(255, 255, 255, 0.08);\r\n --md-tabs-segment-bg: rgba(255, 255, 255, 0.06);\r\n --md-tabs-segment-item-color: rgba(255, 255, 255, 0.55);\r\n --md-tabs-segment-item-active-bg: rgba(255, 255, 255, 0.12);\r\n --md-tabs-segment-item-active-color: rgba(255, 255, 255, 0.92);\r\n --md-tabs-segment-item-hover-bg: rgba(255, 255, 255, 0.08);\r\n }\r\n\r\n :host([data-theme='light']) {\r\n --md-tabs-nav-border: var(--md-glass-separator);\r\n --md-tabs-item-color: var(--md-color-text-secondary);\r\n --md-tabs-item-hover-color: var(--md-color-text);\r\n --md-tabs-item-active-color: var(--md-mac-accent);\r\n --md-tabs-item-disabled-color: var(--md-color-text-secondary);\r\n --md-tabs-indicator-color: var(--md-mac-accent);\r\n --md-tabs-close-color: var(--md-color-text-secondary);\r\n --md-tabs-close-hover-color: var(--md-color-text);\r\n --md-tabs-close-hover-bg: rgba(0, 0, 0, 0.06);\r\n --md-tabs-add-color: var(--md-color-text-secondary);\r\n --md-tabs-add-hover-color: var(--md-color-text);\r\n --md-tabs-add-hover-bg: rgba(0, 0, 0, 0.06);\r\n --md-tabs-segment-bg: rgba(0, 0, 0, 0.04);\r\n --md-tabs-segment-item-color: var(--md-color-text-secondary);\r\n --md-tabs-segment-item-active-bg: var(--md-color-bg);\r\n --md-tabs-segment-item-active-color: var(--md-color-text);\r\n --md-tabs-segment-item-hover-bg: rgba(0, 0, 0, 0.04);\r\n }\r\n\r\n /* ─── 响应式:移动端适配 ─── */\r\n @media (max-width: 768px) {\r\n .nav-content {\r\n /* 触屏惯性滚动 */\r\n -webkit-overflow-scrolling: touch;\r\n /* 允许触控横向滚动但禁用纵向 */\r\n touch-action: pan-x;\r\n scroll-snap-type: x proximity;\r\n }\r\n .tab-item {\r\n /* 接近 44px 触控目标,由 theme.ts 的 padding 变量已放大 */\r\n scroll-snap-align: start;\r\n }\r\n /* segment 类型:移动端允许换行,避免长文本被截断 */\r\n :host([type='segment']) .nav-content {\r\n flex-wrap: wrap;\r\n overflow-x: visible;\r\n }\r\n }\r\n `,\r\n ]\r\n\r\n /** 标签类型:line(下划线指示器)、card(卡片标签)、segment(分段控制器) */\r\n @property({ reflect: true }) type: 'line' | 'card' | 'segment' = 'line'\r\n\r\n /** 组件尺寸 */\r\n @property({ reflect: true }) size?: 'sm' | 'md' | 'lg'\r\n\r\n /** 激活标签的键(受控模式) */\r\n @property() value = ''\r\n\r\n /** 默认激活标签的键(非受控模式) */\r\n @property({ attribute: 'default-value' }) defaultValue = ''\r\n\r\n /** 标签是否可关闭 */\r\n @property({ type: Boolean }) closable = false\r\n\r\n /** 是否显示添加按钮 */\r\n @property({ type: Boolean }) addable = false\r\n\r\n /** 是否启用标签切换动画 */\r\n @property({ type: Boolean }) animated = true\r\n\r\n /** 触发模式:click 或 hover */\r\n @property() trigger: 'click' | 'hover' = 'click'\r\n\r\n /** 标签项数据(替代插槽方式) */\r\n @property({ type: Array }) items: TabItem[] = []\r\n\r\n @state() private _activeKey = ''\r\n\r\n @query('.nav-content') private _navContent!: HTMLElement\r\n\r\n override willUpdate() {\r\n const size = this._resolvedSize\r\n if (this.getAttribute('size') !== size) {\r\n this.setAttribute('size', size)\r\n }\r\n const theme = this._resolvedTheme\r\n if (theme) {\r\n this.setAttribute('data-theme', theme)\r\n } else {\r\n this.removeAttribute('data-theme')\r\n }\r\n }\r\n\r\n override connectedCallback(): void {\r\n super.connectedCallback()\r\n }\r\n\r\n override updated(changed: Map<string, unknown>): void {\r\n if (changed.has('value')) {\r\n this._activeKey = this.value\r\n }\r\n if (changed.has('items') || changed.has('value') || changed.has('_activeKey')) {\r\n this.updateComplete.then(() => {\r\n this._updateIndicator()\r\n this._syncPanes()\r\n })\r\n }\r\n }\r\n\r\n override firstUpdated(): void {\r\n this._initActiveKey()\r\n this.updateComplete.then(() => {\r\n this._updateIndicator()\r\n this._syncPanes()\r\n })\r\n }\r\n\r\n private _initActiveKey(): void {\r\n if (this.value) {\r\n this._activeKey = this.value\r\n return\r\n }\r\n if (this._activeKey) return // 已初始化\r\n\r\n if (this.defaultValue) {\r\n this._activeKey = this.defaultValue\r\n } else {\r\n const items = this._getItems()\r\n if (items.length > 0) {\r\n this._activeKey = items[0].key\r\n }\r\n }\r\n }\r\n\r\n private _getItems(): TabItem[] {\r\n if (this.items && this.items.length > 0) {\r\n return this.items\r\n }\r\n const slotItems: TabItem[] = []\r\n const slotted = this.querySelectorAll('mac-tab-pane')\r\n slotted.forEach((el) => {\r\n slotItems.push({\r\n key: el.getAttribute('tab-key') || '',\r\n label: el.getAttribute('label') || '',\r\n disabled: el.hasAttribute('disabled'),\r\n closable: el.hasAttribute('closable'),\r\n })\r\n })\r\n return slotItems\r\n }\r\n\r\n private _getActiveKey(): string {\r\n return this.value || this._activeKey\r\n }\r\n\r\n private _selectTab(key: string): void {\r\n const items = this._getItems()\r\n const item = items.find((i) => i.key === key)\r\n if (!item || item.disabled) return\r\n\r\n if (!this.value) {\r\n this._activeKey = key\r\n }\r\n this.emit('mac-tabs-change', { detail: { key } })\r\n }\r\n\r\n private _closeTab(key: string, e: Event): void {\r\n e.stopPropagation()\r\n this.emit('mac-tabs-close', { detail: { key } })\r\n }\r\n\r\n private _handleAdd(): void {\r\n this.emit('mac-tabs-add')\r\n }\r\n\r\n private _handleTabHover(key: string): void {\r\n if (this.trigger !== 'hover') return\r\n this._selectTab(key)\r\n }\r\n\r\n private _updateIndicator(): void {\r\n if (this.type === 'card' || this.type === 'segment') return\r\n if (!this.animated) return\r\n\r\n const navContent = this._navContent\r\n if (!navContent) return\r\n\r\n const activeKey = this._getActiveKey()\r\n const tabEls = navContent.querySelectorAll('.tab-item')\r\n let activeEl: Element | null = null\r\n\r\n tabEls.forEach((el) => {\r\n if ((el as HTMLElement).dataset.key === activeKey) {\r\n activeEl = el\r\n }\r\n })\r\n\r\n const indicator = navContent.querySelector('.indicator') as HTMLElement | null\r\n if (!indicator || !activeEl) return\r\n\r\n const navRect = navContent.getBoundingClientRect()\r\n const activeRect = (activeEl as HTMLElement).getBoundingClientRect()\r\n\r\n indicator.style.left = `${activeRect.left - navRect.left + navContent.scrollLeft}px`\r\n indicator.style.width = `${activeRect.width}px`\r\n }\r\n\r\n private _syncPanes(): void {\r\n const activeKey = this._getActiveKey()\r\n const panes = this.querySelectorAll('mac-tab-pane')\r\n panes.forEach((pane) => {\r\n const paneKey = pane.getAttribute('tab-key') || ''\r\n if (paneKey === activeKey) {\r\n pane.setAttribute('active', '')\r\n } else {\r\n pane.removeAttribute('active')\r\n }\r\n })\r\n }\r\n\r\n private _renderCloseBtn(item: TabItem) {\r\n if (!this.closable && !item.closable) return nothing\r\n\r\n return html`\r\n <span class=\"close-btn\" @click=${(e: Event) => this._closeTab(item.key, e)}>\r\n <svg\r\n viewBox=\"0 0 12 12\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.5\"\r\n stroke-linecap=\"round\"\r\n >\r\n <path d=\"M3 3l6 6M9 3l-6 6\" />\r\n </svg>\r\n </span>\r\n `\r\n }\r\n\r\n private _renderAddBtn() {\r\n if (!this.addable) return nothing\r\n\r\n return html`\r\n <span class=\"add-btn\" @click=${() => this._handleAdd()}>\r\n <svg\r\n viewBox=\"0 0 16 16\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.5\"\r\n stroke-linecap=\"round\"\r\n >\r\n <path d=\"M8 3v10M3 8h10\" />\r\n </svg>\r\n </span>\r\n `\r\n }\r\n\r\n private _renderNav() {\r\n const items = this._getItems()\r\n const activeKey = this._getActiveKey()\r\n\r\n return html`\r\n <div class=\"nav\">\r\n <slot name=\"prefix\"></slot>\r\n <div class=\"nav-content\">\r\n ${items.map(\r\n (item) => html`\r\n <div\r\n class=\"tab-item ${item.key === activeKey ? 'active' : ''} ${\r\n item.disabled ? 'disabled' : ''\r\n }\"\r\n data-key=${item.key}\r\n @click=${() => this._selectTab(item.key)}\r\n @mouseenter=${() => this._handleTabHover(item.key)}\r\n >\r\n <span class=\"tab-label\">${item.label}</span>\r\n ${this._renderCloseBtn(item)}\r\n </div>\r\n `,\r\n )}\r\n ${this.type === 'line' && this.animated ? html`<div class=\"indicator\"></div>` : nothing}\r\n </div>\r\n ${this._renderAddBtn()}\r\n <slot name=\"suffix\"></slot>\r\n </div>\r\n `\r\n }\r\n\r\n override render() {\r\n return html`\r\n ${this._renderNav()}\r\n <div class=\"pane-container\">\r\n <slot></slot>\r\n </div>\r\n `\r\n }\r\n}\r\n\r\n/**\r\n * @tag mac-tab-pane\r\n * @summary mac-tabs 的子面板(用于插槽模式)。\r\n *\r\n * @property tab-key - 与标签匹配的唯一键。\r\n * @property label - 标签文本。\r\n * @property disabled - 标签是否禁用。\r\n * @property closable - 标签是否可关闭。\r\n */\r\n@customElement('mac-tab-pane')\r\nexport class MacTabPane extends BaseElement {\r\n static override styles = [\r\n css`\r\n :host {\r\n display: none;\r\n }\r\n\r\n :host([active]) {\r\n display: block;\r\n }\r\n `,\r\n ]\r\n\r\n /** 唯一键 */\r\n @property({ attribute: 'tab-key' }) tabKey = ''\r\n\r\n /** 标签文本 */\r\n @property() label = ''\r\n\r\n /** 标签是否禁用 */\r\n @property({ type: Boolean, reflect: true }) disabled = false\r\n\r\n /** 标签是否可关闭 */\r\n @property({ type: Boolean }) closable = false\r\n\r\n /** 此面板当前是否激活(由 mac-tabs 管理) */\r\n @property({ type: Boolean, reflect: true }) active = false\r\n\r\n override render() {\r\n return html`<slot></slot>`\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'mac-tabs': MacTabs\r\n 'mac-tab-pane': MacTabPane\r\n }\r\n}\r\n","import { html, css } from 'lit'\r\nimport { property, customElement, state } from 'lit/decorators.js'\r\nimport { BaseElement } from '../../internal/base-element'\r\nimport { sharedStyles } from '../../styles/shared-styles'\r\nimport { themeTokens } from '../../styles/theme'\r\n\r\n/**\r\n * @tag mac-drawer\r\n * @summary 一个 macOS 风格的抽屉组件,从视口边缘滑入。\r\n *\r\n * @slot - 默认插槽,用于抽屉内容。\r\n * @slot header - 自定义头部内容(替换默认标题和关闭按钮)。\r\n * @slot footer - 底部内容(例如操作按钮)。\r\n *\r\n * @cssproperty --md-drawer-bg - 抽屉面板背景。\r\n * @cssproperty --md-drawer-border - 抽屉面板边框。\r\n * @cssproperty --md-drawer-shadow - 抽屉面板阴影。\r\n * @cssproperty --md-drawer-header-padding - 头部内边距。\r\n * @cssproperty --md-drawer-header-border - 头部底边框。\r\n * @cssproperty --md-drawer-title-font-size - 标题字体大小。\r\n * @cssproperty --md-drawer-title-color - 标题文字颜色。\r\n * @cssproperty --md-drawer-body-padding - 内容区内边距。\r\n * @cssproperty --md-drawer-footer-padding - 底部内边距。\r\n * @cssproperty --md-drawer-footer-border - 底部顶边框。\r\n * @cssproperty --md-drawer-close-color - 关闭图标颜色。\r\n * @cssproperty --md-drawer-close-hover-bg - 关闭图标悬停背景。\r\n * @cssproperty --md-drawer-mask-bg - 遮罩层背景。\r\n * @cssproperty --md-drawer-radius - 抽屉圆角(暴露边缘)。\r\n *\r\n * @event mac-drawer-open - 抽屉打开后触发。\r\n * @event mac-drawer-close - 抽屉关闭后触发。\r\n * @event mac-drawer-after-open - 打开动画完成后触发。\r\n * @event mac-drawer-after-close - 关闭动画完成后触发。\r\n */\r\n@customElement('mac-drawer')\r\nexport class MacDrawer extends BaseElement {\r\n static override styles = [\r\n themeTokens,\r\n sharedStyles,\r\n css`\r\n :host {\r\n display: block;\r\n --md-drawer-bg: rgba(246, 246, 246, 0.88);\r\n --md-drawer-border: rgba(0, 0, 0, 0.06);\r\n --md-drawer-shadow: -8px 0 40px rgba(0, 0, 0, 0.1), -2px 0 12px rgba(0, 0, 0, 0.06);\r\n --md-drawer-header-padding: var(--md-spacing-md) var(--md-spacing-lg);\r\n --md-drawer-header-border: rgba(0, 0, 0, 0.06);\r\n --md-drawer-title-font-size: var(--md-font-size-lg);\r\n --md-drawer-title-color: var(--md-color-text);\r\n --md-drawer-body-padding: var(--md-spacing-lg);\r\n --md-drawer-footer-padding: var(--md-spacing-md) var(--md-spacing-lg);\r\n --md-drawer-footer-border: rgba(0, 0, 0, 0.06);\r\n --md-drawer-close-color: var(--md-color-text-secondary);\r\n --md-drawer-close-hover-bg: rgba(0, 0, 0, 0.06);\r\n --md-drawer-mask-bg: rgba(0, 0, 0, 0.3);\r\n --md-drawer-radius: var(--md-radius-lg);\r\n }\r\n\r\n /* ─── 遮罩层 ─── */\r\n\r\n .mask {\r\n position: fixed;\r\n inset: 0;\r\n z-index: 99998;\r\n background: var(--md-drawer-mask-bg);\r\n opacity: 0;\r\n transition: opacity 250ms cubic-bezier(0.4, 0, 0.2, 1);\r\n pointer-events: none;\r\n }\r\n\r\n .mask.visible {\r\n opacity: 1;\r\n pointer-events: auto;\r\n }\r\n\r\n .mask.transparent {\r\n background: transparent;\r\n pointer-events: auto;\r\n }\r\n\r\n /* ─── 抽屉面板 ─── */\r\n\r\n .panel {\r\n position: fixed;\r\n z-index: 99999;\r\n background: var(--md-drawer-bg);\r\n backdrop-filter: blur(var(--md-glass-blur)) saturate(var(--md-glass-saturate));\r\n -webkit-backdrop-filter: blur(var(--md-glass-blur)) saturate(var(--md-glass-saturate));\r\n border: 0.5px solid var(--md-drawer-border);\r\n display: flex;\r\n flex-direction: column;\r\n overflow: hidden;\r\n transition: transform 250ms cubic-bezier(0.4, 0, 0.2, 1);\r\n }\r\n\r\n /* ─── 位置方向 ─── */\r\n\r\n .panel.right {\r\n top: 0;\r\n right: 0;\r\n bottom: 0;\r\n height: 100%;\r\n border-radius: var(--md-drawer-radius) 0 0 var(--md-drawer-radius);\r\n box-shadow: var(--md-drawer-shadow);\r\n transform: translateX(100%);\r\n }\r\n\r\n .panel.right.open {\r\n transform: translateX(0);\r\n }\r\n\r\n .panel.left {\r\n top: 0;\r\n left: 0;\r\n bottom: 0;\r\n height: 100%;\r\n border-radius: 0 var(--md-drawer-radius) var(--md-drawer-radius) 0;\r\n box-shadow:\r\n 8px 0 40px rgba(0, 0, 0, 0.1),\r\n 2px 0 12px rgba(0, 0, 0, 0.06);\r\n transform: translateX(-100%);\r\n }\r\n\r\n .panel.left.open {\r\n transform: translateX(0);\r\n }\r\n\r\n .panel.top {\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n width: 100%;\r\n border-radius: 0 0 var(--md-drawer-radius) var(--md-drawer-radius);\r\n box-shadow:\r\n 0 8px 40px rgba(0, 0, 0, 0.1),\r\n 0 2px 12px rgba(0, 0, 0, 0.06);\r\n transform: translateY(-100%);\r\n }\r\n\r\n .panel.top.open {\r\n transform: translateY(0);\r\n }\r\n\r\n .panel.bottom {\r\n bottom: 0;\r\n left: 0;\r\n right: 0;\r\n width: 100%;\r\n border-radius: var(--md-drawer-radius) var(--md-drawer-radius) 0 0;\r\n box-shadow:\r\n 0 -8px 40px rgba(0, 0, 0, 0.1),\r\n 0 -2px 12px rgba(0, 0, 0, 0.06);\r\n transform: translateY(100%);\r\n }\r\n\r\n .panel.bottom.open {\r\n transform: translateY(0);\r\n }\r\n\r\n /* ─── 头部 ─── */\r\n\r\n .header {\r\n display: flex;\r\n align-items: center;\r\n padding: var(--md-drawer-header-padding);\r\n border-bottom: 0.5px solid var(--md-drawer-header-border);\r\n flex-shrink: 0;\r\n }\r\n\r\n .header:empty {\r\n display: none;\r\n }\r\n\r\n .title {\r\n flex: 1;\r\n font-size: var(--md-drawer-title-font-size);\r\n font-weight: 600;\r\n color: var(--md-drawer-title-color);\r\n letter-spacing: -0.01em;\r\n }\r\n\r\n .close-btn {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 28px;\r\n height: 28px;\r\n border-radius: var(--md-radius-sm);\r\n color: var(--md-drawer-close-color);\r\n cursor: pointer;\r\n transition:\r\n background var(--md-transition-fast),\r\n color var(--md-transition-fast);\r\n flex-shrink: 0;\r\n margin-left: var(--md-spacing-sm);\r\n }\r\n\r\n .close-btn:hover {\r\n background: var(--md-drawer-close-hover-bg);\r\n color: var(--md-drawer-title-color);\r\n }\r\n\r\n .close-btn svg {\r\n width: 16px;\r\n height: 16px;\r\n }\r\n\r\n /* ─── 内容区 ─── */\r\n\r\n .body {\r\n flex: 1;\r\n overflow-y: auto;\r\n padding: var(--md-drawer-body-padding);\r\n }\r\n\r\n /* ─── 底部 ─── */\r\n\r\n .footer {\r\n display: flex;\r\n align-items: center;\r\n justify-content: flex-end;\r\n gap: var(--md-spacing-sm);\r\n padding: var(--md-drawer-footer-padding);\r\n border-top: 0.5px solid var(--md-drawer-footer-border);\r\n flex-shrink: 0;\r\n }\r\n\r\n .footer:empty {\r\n display: none;\r\n }\r\n\r\n /* ─── 调整大小手柄 ─── */\r\n\r\n .resize-handle {\r\n position: absolute;\r\n z-index: 10;\r\n }\r\n\r\n .resize-handle.right {\r\n left: 0;\r\n top: 0;\r\n bottom: 0;\r\n width: 4px;\r\n cursor: ew-resize;\r\n }\r\n\r\n .resize-handle.left {\r\n right: 0;\r\n top: 0;\r\n bottom: 0;\r\n width: 4px;\r\n cursor: ew-resize;\r\n }\r\n\r\n .resize-handle.top {\r\n bottom: 0;\r\n left: 0;\r\n right: 0;\r\n height: 4px;\r\n cursor: ns-resize;\r\n }\r\n\r\n .resize-handle.bottom {\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n height: 4px;\r\n cursor: ns-resize;\r\n }\r\n\r\n :host([data-theme='dark']) {\r\n --md-drawer-bg: rgba(40, 40, 40, 0.92);\r\n --md-drawer-border: rgba(255, 255, 255, 0.08);\r\n --md-drawer-shadow: -8px 0 40px rgba(0, 0, 0, 0.3), -2px 0 12px rgba(0, 0, 0, 0.2);\r\n --md-drawer-header-border: rgba(255, 255, 255, 0.06);\r\n --md-drawer-title-color: rgba(255, 255, 255, 0.92);\r\n --md-drawer-footer-border: rgba(255, 255, 255, 0.06);\r\n --md-drawer-close-color: rgba(255, 255, 255, 0.55);\r\n --md-drawer-close-hover-bg: rgba(255, 255, 255, 0.08);\r\n --md-drawer-mask-bg: rgba(0, 0, 0, 0.5);\r\n }\r\n\r\n :host([data-theme='light']) {\r\n --md-drawer-bg: rgba(246, 246, 246, 0.88);\r\n --md-drawer-border: rgba(0, 0, 0, 0.06);\r\n --md-drawer-shadow: -8px 0 40px rgba(0, 0, 0, 0.1), -2px 0 12px rgba(0, 0, 0, 0.06);\r\n --md-drawer-header-border: rgba(0, 0, 0, 0.06);\r\n --md-drawer-title-color: var(--md-color-text);\r\n --md-drawer-footer-border: rgba(0, 0, 0, 0.06);\r\n --md-drawer-close-color: var(--md-color-text-secondary);\r\n --md-drawer-close-hover-bg: rgba(0, 0, 0, 0.06);\r\n --md-drawer-mask-bg: rgba(0, 0, 0, 0.3);\r\n }\r\n `,\r\n ]\r\n\r\n /** 抽屉是否打开 */\r\n @property({ type: Boolean, reflect: true }) open = false\r\n\r\n /** 抽屉放置方向 */\r\n @property({ reflect: true }) placement: 'top' | 'right' | 'bottom' | 'left' = 'right'\r\n\r\n /** 抽屉标题 */\r\n @property() title = ''\r\n\r\n /** 抽屉宽度(用于左/右放置) */\r\n @property({ type: String }) width = '360px'\r\n\r\n /** 抽屉高度(用于上/下放置) */\r\n @property({ type: String }) height = '360px'\r\n\r\n /** 是否显示关闭按钮 */\r\n @property({ type: Boolean }) closable = true\r\n\r\n /** 点击遮罩是否关闭抽屉 */\r\n @property({ type: Boolean, attribute: 'mask-closable' }) maskClosable = true\r\n\r\n /** 是否显示遮罩层 */\r\n @property({ attribute: 'show-mask' }) showMask: boolean | 'transparent' = true\r\n\r\n /** 按 ESC 键是否关闭抽屉 */\r\n @property({ type: Boolean, attribute: 'close-on-esc' }) closeOnEsc = true\r\n\r\n /** 抽屉是否可调整大小 */\r\n @property({ type: Boolean }) resizable = false\r\n\r\n /** 调整大小时的最小宽度(左/右) */\r\n @property({ type: String, attribute: 'min-width' }) minWidth = '200px'\r\n\r\n /** 调整大小时的最大宽度(左/右) */\r\n @property({ type: String, attribute: 'max-width' }) maxWidth = '80vw'\r\n\r\n /** 调整大小时的最小高度(上/下) */\r\n @property({ type: String, attribute: 'min-height' }) minHeight = '200px'\r\n\r\n /** 调整大小时的最大高度(上/下) */\r\n @property({ type: String, attribute: 'max-height' }) maxHeight = '80vh'\r\n\r\n @state() private _isOpen = false\r\n\r\n // Portal 元素\r\n private _maskEl: HTMLElement | null = null\r\n private _panelEl: HTMLElement | null = null\r\n\r\n // 调整大小状态\r\n private _isResizing = false\r\n private _resizeStartX = 0\r\n private _resizeStartY = 0\r\n private _resizeStartSize = 0\r\n\r\n // 样式注入\r\n private static _stylesInjected = false\r\n\r\n override willUpdate(): void {\r\n const theme = this._resolvedTheme\r\n if (theme) {\r\n this.setAttribute('data-theme', theme)\r\n } else {\r\n this.removeAttribute('data-theme')\r\n }\r\n }\r\n\r\n override updated(changed: Map<string, unknown>): void {\r\n if (changed.has('open')) {\r\n if (this.open && !this._isOpen) {\r\n this._show()\r\n } else if (!this.open && this._isOpen) {\r\n this._hide()\r\n }\r\n }\r\n }\r\n\r\n override disconnectedCallback(): void {\r\n super.disconnectedCallback()\r\n this._removePortal()\r\n document.removeEventListener('keydown', this._handleKeyDown)\r\n }\r\n\r\n private _injectStyles(): void {\r\n if (MacDrawer._stylesInjected) return\r\n MacDrawer._stylesInjected = true\r\n\r\n const style = document.createElement('style')\r\n style.id = 'mac-drawer-portal-styles'\r\n style.textContent = `\r\n .mac-drawer-mask {\r\n position: fixed;\r\n inset: 0;\r\n z-index: 99998;\r\n background: var(--md-drawer-mask-bg, rgba(0, 0, 0, 0.3));\r\n opacity: 0;\r\n transition: opacity 250ms cubic-bezier(0.4, 0, 0.2, 1);\r\n pointer-events: none;\r\n }\r\n .mac-drawer-mask.visible {\r\n opacity: 1;\r\n pointer-events: auto;\r\n }\r\n .mac-drawer-mask.transparent {\r\n background: transparent;\r\n pointer-events: auto;\r\n }\r\n .mac-drawer-panel {\r\n position: fixed;\r\n z-index: 99999;\r\n background: var(--md-drawer-bg, rgba(246, 246, 246, 0.88));\r\n backdrop-filter: blur(40px) saturate(200%);\r\n -webkit-backdrop-filter: blur(40px) saturate(200%);\r\n border: 0.5px solid var(--md-drawer-border, rgba(0, 0, 0, 0.06));\r\n display: flex;\r\n flex-direction: column;\r\n overflow: hidden;\r\n transition: transform 300ms cubic-bezier(0.4, 0, 0.2, 1);\r\n }\r\n .mac-drawer-panel.right {\r\n top: 0; right: 0; bottom: 0;\r\n border-radius: 12px 0 0 12px;\r\n box-shadow: -8px 0 40px rgba(0,0,0,0.1), -2px 0 12px rgba(0,0,0,0.06);\r\n transform: translateX(100%);\r\n }\r\n .mac-drawer-panel.left {\r\n top: 0; left: 0; bottom: 0;\r\n border-radius: 0 12px 12px 0;\r\n box-shadow: 8px 0 40px rgba(0,0,0,0.1), 2px 0 12px rgba(0,0,0,0.06);\r\n transform: translateX(-100%);\r\n }\r\n .mac-drawer-panel.top {\r\n top: 0; left: 0; right: 0;\r\n border-radius: 0 0 12px 12px;\r\n box-shadow: 0 8px 40px rgba(0,0,0,0.1), 0 2px 12px rgba(0,0,0,0.06);\r\n transform: translateY(-100%);\r\n }\r\n .mac-drawer-panel.bottom {\r\n bottom: 0; left: 0; right: 0;\r\n border-radius: 12px 12px 0 0;\r\n box-shadow: 0 -8px 40px rgba(0,0,0,0.1), 0 -2px 12px rgba(0,0,0,0.06);\r\n transform: translateY(100%);\r\n }\r\n .mac-drawer-panel.open {\r\n transform: translateX(0) translateY(0);\r\n }\r\n .mac-drawer-header {\r\n display: flex;\r\n align-items: center;\r\n padding: 12px 20px;\r\n border-bottom: 0.5px solid var(--md-drawer-header-border, rgba(0,0,0,0.06));\r\n flex-shrink: 0;\r\n }\r\n .mac-drawer-title {\r\n flex: 1;\r\n font-size: 15px;\r\n font-weight: 600;\r\n color: var(--md-drawer-title-color, rgba(0,0,0,0.88));\r\n letter-spacing: -0.01em;\r\n }\r\n .mac-drawer-close {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 28px;\r\n height: 28px;\r\n border-radius: 6px;\r\n color: var(--md-drawer-close-color, rgba(0,0,0,0.45));\r\n cursor: pointer;\r\n transition: background 150ms, color 150ms;\r\n flex-shrink: 0;\r\n margin-left: 8px;\r\n background: none;\r\n border: none;\r\n padding: 0;\r\n }\r\n .mac-drawer-close:hover {\r\n background: var(--md-drawer-close-hover-bg, rgba(0,0,0,0.06));\r\n color: var(--md-drawer-title-color, rgba(0,0,0,0.88));\r\n }\r\n .mac-drawer-close svg {\r\n width: 16px;\r\n height: 16px;\r\n }\r\n .mac-drawer-body {\r\n flex: 1;\r\n overflow-y: auto;\r\n padding: 20px;\r\n }\r\n .mac-drawer-footer {\r\n display: flex;\r\n align-items: center;\r\n justify-content: flex-end;\r\n gap: 8px;\r\n padding: 12px 20px;\r\n border-top: 0.5px solid var(--md-drawer-footer-border, rgba(0,0,0,0.06));\r\n flex-shrink: 0;\r\n }\r\n .mac-drawer-footer:empty {\r\n display: none;\r\n }\r\n .mac-drawer-resize {\r\n position: absolute;\r\n z-index: 10;\r\n }\r\n .mac-drawer-resize.right {\r\n left: 0; top: 0; bottom: 0;\r\n width: 4px;\r\n cursor: ew-resize;\r\n }\r\n .mac-drawer-resize.left {\r\n right: 0; top: 0; bottom: 0;\r\n width: 4px;\r\n cursor: ew-resize;\r\n }\r\n .mac-drawer-resize.top {\r\n bottom: 0; left: 0; right: 0;\r\n height: 4px;\r\n cursor: ns-resize;\r\n }\r\n .mac-drawer-resize.bottom {\r\n top: 0; left: 0; right: 0;\r\n height: 4px;\r\n cursor: ns-resize;\r\n }\r\n\r\n /* ─── 响应式:移动端窄屏全宽 + 安全区适配 ─── */\r\n @media (max-width: 768px) {\r\n .mac-drawer-panel.right,\r\n .mac-drawer-panel.left {\r\n /* 覆盖 JS 内联 width,移动端占满大部分屏宽 */\r\n width: 100% !important;\r\n max-width: 100% !important;\r\n border-radius: 0;\r\n }\r\n .mac-drawer-panel.right {\r\n padding-left: max(env(safe-area-inset-left, 0px), 0px);\r\n }\r\n .mac-drawer-panel.left {\r\n padding-right: max(env(safe-area-inset-right, 0px), 0px);\r\n }\r\n .mac-drawer-panel.top {\r\n padding-bottom: env(safe-area-inset-top, 0px);\r\n }\r\n .mac-drawer-panel.bottom {\r\n /* 底部抽屉预留 Home 指示条安全区 */\r\n padding-bottom: env(safe-area-inset-bottom, 0px);\r\n }\r\n .mac-drawer-header {\r\n padding: 14px 16px;\r\n }\r\n .mac-drawer-title {\r\n font-size: 17px;\r\n }\r\n .mac-drawer-close {\r\n width: 36px;\r\n height: 36px;\r\n }\r\n .mac-drawer-body {\r\n padding: 16px;\r\n }\r\n .mac-drawer-footer {\r\n padding: 14px 16px;\r\n }\r\n .mac-drawer-resize {\r\n /* 触屏无需手动 resize */\r\n display: none;\r\n }\r\n }\r\n `\r\n document.head.appendChild(style)\r\n }\r\n\r\n private _applyThemeVars(): void {\r\n const isDark = this._resolvedTheme === 'dark'\r\n\r\n if (isDark) {\r\n document.documentElement.style.setProperty('--md-drawer-bg', 'rgba(40, 40, 40, 0.92)')\r\n document.documentElement.style.setProperty('--md-drawer-border', 'rgba(255, 255, 255, 0.08)')\r\n document.documentElement.style.setProperty(\r\n '--md-drawer-header-border',\r\n 'rgba(255, 255, 255, 0.06)',\r\n )\r\n document.documentElement.style.setProperty(\r\n '--md-drawer-title-color',\r\n 'rgba(255, 255, 255, 0.92)',\r\n )\r\n document.documentElement.style.setProperty(\r\n '--md-drawer-footer-border',\r\n 'rgba(255, 255, 255, 0.06)',\r\n )\r\n document.documentElement.style.setProperty(\r\n '--md-drawer-close-color',\r\n 'rgba(255, 255, 255, 0.55)',\r\n )\r\n document.documentElement.style.setProperty(\r\n '--md-drawer-close-hover-bg',\r\n 'rgba(255, 255, 255, 0.08)',\r\n )\r\n document.documentElement.style.setProperty('--md-drawer-mask-bg', 'rgba(0, 0, 0, 0.5)')\r\n } else {\r\n document.documentElement.style.setProperty('--md-drawer-bg', 'rgba(246, 246, 246, 0.88)')\r\n document.documentElement.style.setProperty('--md-drawer-border', 'rgba(0, 0, 0, 0.06)')\r\n document.documentElement.style.setProperty('--md-drawer-header-border', 'rgba(0, 0, 0, 0.06)')\r\n document.documentElement.style.setProperty('--md-drawer-title-color', 'rgba(0, 0, 0, 0.88)')\r\n document.documentElement.style.setProperty('--md-drawer-footer-border', 'rgba(0, 0, 0, 0.06)')\r\n document.documentElement.style.setProperty('--md-drawer-close-color', 'rgba(0, 0, 0, 0.45)')\r\n document.documentElement.style.setProperty(\r\n '--md-drawer-close-hover-bg',\r\n 'rgba(0, 0, 0, 0.06)',\r\n )\r\n document.documentElement.style.setProperty('--md-drawer-mask-bg', 'rgba(0, 0, 0, 0.3)')\r\n }\r\n }\r\n\r\n private _show(): void {\r\n this._injectStyles()\r\n this._applyThemeVars()\r\n this._createPortal()\r\n this._isOpen = true\r\n document.addEventListener('keydown', this._handleKeyDown)\r\n document.body.style.overflow = 'hidden'\r\n\r\n requestAnimationFrame(() => {\r\n if (this._maskEl) {\r\n this._maskEl.classList.add('visible')\r\n }\r\n if (this._panelEl) {\r\n this._panelEl.classList.add('open')\r\n }\r\n })\r\n\r\n this.emit('mac-drawer-open')\r\n\r\n setTimeout(() => {\r\n this.emit('mac-drawer-after-open')\r\n }, 300)\r\n }\r\n\r\n private _hide(): void {\r\n if (!this._isOpen) return\r\n\r\n if (this._maskEl) {\r\n this._maskEl.classList.remove('visible')\r\n }\r\n if (this._panelEl) {\r\n this._panelEl.classList.remove('open')\r\n }\r\n\r\n this._isOpen = false\r\n document.removeEventListener('keydown', this._handleKeyDown)\r\n document.body.style.overflow = ''\r\n\r\n this.emit('mac-drawer-close')\r\n\r\n setTimeout(() => {\r\n this._removePortal()\r\n this.emit('mac-drawer-after-close')\r\n }, 300)\r\n }\r\n\r\n private _createPortal(): void {\r\n this._removePortal()\r\n\r\n // 遮罩层\r\n const mask = document.createElement('div')\r\n mask.className = 'mac-drawer-mask'\r\n if (this.showMask === 'transparent') {\r\n mask.classList.add('transparent')\r\n } else if (this.showMask === false) {\r\n mask.style.display = 'none'\r\n }\r\n mask.addEventListener('click', () => {\r\n if (this.maskClosable) {\r\n this._close()\r\n }\r\n })\r\n document.body.appendChild(mask)\r\n this._maskEl = mask\r\n\r\n // 面板\r\n const panel = document.createElement('div')\r\n panel.className = `mac-drawer-panel ${this.placement}`\r\n\r\n // 设置大小\r\n if (this.placement === 'left' || this.placement === 'right') {\r\n panel.style.width = this.width\r\n } else {\r\n panel.style.height = this.height\r\n }\r\n\r\n // 头部\r\n const header = document.createElement('div')\r\n header.className = 'mac-drawer-header'\r\n\r\n const titleEl = document.createElement('div')\r\n titleEl.className = 'mac-drawer-title'\r\n titleEl.textContent = this.title\r\n header.appendChild(titleEl)\r\n\r\n if (this.closable) {\r\n const closeBtn = document.createElement('button')\r\n closeBtn.className = 'mac-drawer-close'\r\n closeBtn.innerHTML = `<svg viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"><path d=\"M4 4l8 8M12 4l-8 8\"/></svg>`\r\n closeBtn.addEventListener('click', () => this._close())\r\n header.appendChild(closeBtn)\r\n }\r\n\r\n panel.appendChild(header)\r\n\r\n // 内容区 - 插槽内容将被移到这里\r\n const body = document.createElement('div')\r\n body.className = 'mac-drawer-body'\r\n\r\n // 将插槽子元素移动到 portal 内容区\r\n const children = Array.from(this.childNodes).filter(\r\n (node) => !((node as Element).slot === 'header' || (node as Element).slot === 'footer'),\r\n )\r\n children.forEach((child) => body.appendChild(child))\r\n this._slottedChildren = children\r\n\r\n panel.appendChild(body)\r\n\r\n // 底部\r\n const footerSlot = this.querySelector('[slot=\"footer\"]')\r\n if (footerSlot) {\r\n const footer = document.createElement('div')\r\n footer.className = 'mac-drawer-footer'\r\n footer.appendChild(footerSlot.cloneNode(true))\r\n panel.appendChild(footer)\r\n }\r\n\r\n // 调整大小手柄\r\n if (this.resizable) {\r\n const resizeHandle = document.createElement('div')\r\n resizeHandle.className = `mac-drawer-resize ${this.placement}`\r\n resizeHandle.addEventListener('mousedown', (e) => this._onResizeStart(e))\r\n panel.appendChild(resizeHandle)\r\n }\r\n\r\n document.body.appendChild(panel)\r\n this._panelEl = panel\r\n }\r\n\r\n private _slottedChildren: Node[] = []\r\n\r\n private _removePortal(): void {\r\n // 将子元素返回到原始宿主\r\n if (this._slottedChildren.length > 0) {\r\n this._slottedChildren.forEach((child) => {\r\n if (child.parentNode) {\r\n child.parentNode.removeChild(child)\r\n }\r\n this.appendChild(child)\r\n })\r\n this._slottedChildren = []\r\n }\r\n\r\n if (this._maskEl) {\r\n this._maskEl.remove()\r\n this._maskEl = null\r\n }\r\n if (this._panelEl) {\r\n this._panelEl.remove()\r\n this._panelEl = null\r\n }\r\n }\r\n\r\n private _close(): void {\r\n this.open = false\r\n this._hide()\r\n }\r\n\r\n private _handleKeyDown = (e: KeyboardEvent): void => {\r\n if (e.key === 'Escape' && this.closeOnEsc && this._isOpen) {\r\n e.preventDefault()\r\n this._close()\r\n }\r\n }\r\n\r\n // ─── 调整大小 ───\r\n\r\n private _onResizeStart(e: MouseEvent): void {\r\n if (e.button !== 0) return\r\n e.preventDefault()\r\n\r\n this._isResizing = true\r\n this._resizeStartX = e.clientX\r\n this._resizeStartY = e.clientY\r\n\r\n const panel = this._panelEl\r\n if (!panel) return\r\n\r\n if (this.placement === 'left' || this.placement === 'right') {\r\n this._resizeStartSize = panel.offsetWidth\r\n } else {\r\n this._resizeStartSize = panel.offsetHeight\r\n }\r\n\r\n const onMove = (ev: MouseEvent) => {\r\n if (!this._isResizing || !this._panelEl) return\r\n\r\n const dx = ev.clientX - this._resizeStartX\r\n const dy = ev.clientY - this._resizeStartY\r\n\r\n if (this.placement === 'right') {\r\n const newWidth = Math.max(\r\n parseInt(this.minWidth),\r\n Math.min(parseInt(this.maxWidth), this._resizeStartSize - dx),\r\n )\r\n this._panelEl.style.width = `${newWidth}px`\r\n } else if (this.placement === 'left') {\r\n const newWidth = Math.max(\r\n parseInt(this.minWidth),\r\n Math.min(parseInt(this.maxWidth), this._resizeStartSize + dx),\r\n )\r\n this._panelEl.style.width = `${newWidth}px`\r\n } else if (this.placement === 'bottom') {\r\n const newHeight = Math.max(\r\n parseInt(this.minHeight),\r\n Math.min(parseInt(this.maxHeight), this._resizeStartSize - dy),\r\n )\r\n this._panelEl.style.height = `${newHeight}px`\r\n } else if (this.placement === 'top') {\r\n const newHeight = Math.max(\r\n parseInt(this.minHeight),\r\n Math.min(parseInt(this.maxHeight), this._resizeStartSize + dy),\r\n )\r\n this._panelEl.style.height = `${newHeight}px`\r\n }\r\n }\r\n\r\n const onUp = () => {\r\n this._isResizing = false\r\n document.removeEventListener('mousemove', onMove)\r\n document.removeEventListener('mouseup', onUp)\r\n }\r\n\r\n document.addEventListener('mousemove', onMove)\r\n document.addEventListener('mouseup', onUp)\r\n }\r\n\r\n override render() {\r\n // 组件自身 DOM 不渲染任何内容;内容通过 portal 挂载到 body\r\n return html`<slot style=\"display:none\"></slot>`\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'mac-drawer': MacDrawer\r\n }\r\n}\r\n","import { html, css } from 'lit'\r\nimport { property, customElement, state } from 'lit/decorators.js'\r\nimport { BaseElement } from '../../internal/base-element'\r\nimport { sharedStyles } from '../../styles/shared-styles'\r\nimport { themeTokens } from '../../styles/theme'\r\n\r\n/**\r\n * @tag mac-popconfirm\r\n * @summary macOS 风格的气泡确认组件。\r\n *\r\n * @slot - 触发元素。\r\n * @slot action - 自定义操作按钮(替换默认确认/取消按钮)。\r\n *\r\n * @cssproperty --md-popconfirm-bg - 气泡背景。\r\n * @cssproperty --md-popconfirm-border - 气泡边框。\r\n * @cssproperty --md-popconfirm-shadow - 气泡阴影。\r\n * @cssproperty --md-popconfirm-radius - 气泡圆角。\r\n * @cssproperty --md-popconfirm-padding - 气泡内边距。\r\n * @cssproperty --md-popconfirm-icon-color - 图标颜色。\r\n * @cssproperty --md-popconfirm-title-color - 标题文字颜色。\r\n * @cssproperty --md-popconfirm-title-font-size - 标题字体大小。\r\n * @cssproperty --md-popconfirm-desc-color - 描述文字颜色。\r\n * @cssproperty --md-popconfirm-desc-font-size - 描述字体大小。\r\n * @cssproperty --md-popconfirm-btn-gap - 操作按钮间距。\r\n *\r\n * @event mac-popconfirm-confirm - 点击确认按钮时触发。\r\n * @event mac-popconfirm-cancel - 点击取消按钮时触发。\r\n * @event mac-popconfirm-open - 气泡打开时触发。\r\n * @event mac-popconfirm-close - 气泡关闭时触发。\r\n */\r\n@customElement('mac-popconfirm')\r\nexport class MacPopconfirm extends BaseElement {\r\n static override styles = [\r\n themeTokens,\r\n sharedStyles,\r\n css`\r\n :host {\r\n display: inline-block;\r\n --md-popconfirm-bg: rgba(246, 246, 246, 0.88);\r\n --md-popconfirm-border: rgba(0, 0, 0, 0.06);\r\n --md-popconfirm-shadow: 0 8px 40px rgba(0, 0, 0, 0.12), 0 2px 12px rgba(0, 0, 0, 0.06);\r\n --md-popconfirm-radius: var(--md-radius-lg);\r\n --md-popconfirm-padding: var(--md-spacing-lg);\r\n --md-popconfirm-icon-color: #f5a623;\r\n --md-popconfirm-title-color: var(--md-color-text);\r\n --md-popconfirm-title-font-size: var(--md-font-size-base);\r\n --md-popconfirm-desc-color: var(--md-color-text-secondary);\r\n --md-popconfirm-desc-font-size: var(--md-font-size-sm);\r\n --md-popconfirm-btn-gap: var(--md-spacing-sm);\r\n }\r\n\r\n .trigger {\r\n display: inline-flex;\r\n cursor: pointer;\r\n }\r\n `,\r\n ]\r\n\r\n /** 确认标题文本 */\r\n @property() title = ''\r\n\r\n /** 确认描述文本 */\r\n @property() description = ''\r\n\r\n /** 确认按钮文本 */\r\n @property({ attribute: 'confirm-text' }) confirmText = '确认'\r\n\r\n /** 取消按钮文本 */\r\n @property({ attribute: 'cancel-text' }) cancelText = '取消'\r\n\r\n /** 确认按钮是否为危险样式 */\r\n @property({ type: Boolean, attribute: 'danger' }) danger = false\r\n\r\n /** 是否显示图标 */\r\n @property({ type: Boolean, attribute: 'show-icon' }) showIcon = true\r\n\r\n /** 气泡位置 */\r\n @property() placement:\r\n | 'top'\r\n | 'top-start'\r\n | 'top-end'\r\n | 'bottom'\r\n | 'bottom-start'\r\n | 'bottom-end'\r\n | 'left'\r\n | 'left-start'\r\n | 'left-end'\r\n | 'right'\r\n | 'right-start'\r\n | 'right-end' = 'top'\r\n\r\n /** 触发模式 */\r\n @property() trigger: 'click' | 'hover' = 'click'\r\n\r\n /** 是否禁用气泡确认 */\r\n @property({ type: Boolean }) disabled = false\r\n\r\n /** 气泡宽度 */\r\n @property({ type: String }) width = '240px'\r\n\r\n @state() private _visible = false\r\n\r\n private _popoverEl: HTMLElement | null = null\r\n private _hoverTimeout: ReturnType<typeof setTimeout> | null = null\r\n private _popoverId = `popconfirm-${Math.random().toString(36).slice(2, 9)}`\r\n\r\n private static _portalStylesInjected = false\r\n\r\n override connectedCallback(): void {\r\n super.connectedCallback()\r\n MacPopconfirm._injectPortalStyles()\r\n document.addEventListener('mousedown', this._handleDocumentClick)\r\n document.addEventListener('keydown', this._handleKeyDown)\r\n }\r\n\r\n override disconnectedCallback(): void {\r\n super.disconnectedCallback()\r\n document.removeEventListener('mousedown', this._handleDocumentClick)\r\n document.removeEventListener('keydown', this._handleKeyDown)\r\n this._removePopover()\r\n if (this._hoverTimeout) clearTimeout(this._hoverTimeout)\r\n }\r\n\r\n override willUpdate(): void {\r\n const theme = this._resolvedTheme\r\n if (theme) {\r\n this.setAttribute('data-theme', theme)\r\n } else {\r\n this.removeAttribute('data-theme')\r\n }\r\n }\r\n\r\n private static _injectPortalStyles(): void {\r\n if (MacPopconfirm._portalStylesInjected) return\r\n MacPopconfirm._portalStylesInjected = true\r\n\r\n const style = document.createElement('style')\r\n style.id = 'mac-popconfirm-portal-styles'\r\n style.textContent = `\r\n .mac-popconfirm-portal {\r\n position: fixed;\r\n z-index: 99999;\r\n min-width: 200px;\r\n background: var(--md-popconfirm-bg, rgba(246, 246, 246, 0.88));\r\n backdrop-filter: blur(40px) saturate(200%);\r\n -webkit-backdrop-filter: blur(40px) saturate(200%);\r\n border: 0.5px solid var(--md-popconfirm-border, rgba(0, 0, 0, 0.06));\r\n border-radius: var(--md-popconfirm-radius, 12px);\r\n box-shadow: var(--md-popconfirm-shadow, 0 8px 40px rgba(0, 0, 0, 0.12), 0 2px 12px rgba(0, 0, 0, 0.06));\r\n padding: var(--md-popconfirm-padding, 16px);\r\n opacity: 0;\r\n transform: scale(0.96);\r\n pointer-events: none;\r\n transition: opacity 180ms cubic-bezier(0.4, 0, 0.2, 1),\r\n transform 180ms cubic-bezier(0.4, 0, 0.2, 1);\r\n font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'Helvetica Neue', sans-serif;\r\n }\r\n\r\n .mac-popconfirm-portal.visible {\r\n opacity: 1;\r\n transform: scale(1);\r\n pointer-events: auto;\r\n }\r\n\r\n /* 箭头 */\r\n .mac-popconfirm-portal .popconfirm-arrow {\r\n position: absolute;\r\n width: 10px;\r\n height: 10px;\r\n background: var(--md-popconfirm-bg, rgba(246, 246, 246, 0.88));\r\n border: 0.5px solid var(--md-popconfirm-border, rgba(0, 0, 0, 0.06));\r\n transform: rotate(45deg);\r\n }\r\n\r\n .mac-popconfirm-portal[data-placement^=\"top\"] .popconfirm-arrow {\r\n bottom: -5.5px;\r\n border-top: none;\r\n border-left: none;\r\n }\r\n\r\n .mac-popconfirm-portal[data-placement^=\"bottom\"] .popconfirm-arrow {\r\n top: -5.5px;\r\n border-bottom: none;\r\n border-right: none;\r\n }\r\n\r\n .mac-popconfirm-portal[data-placement^=\"left\"] .popconfirm-arrow {\r\n right: -5.5px;\r\n border-bottom: none;\r\n border-left: none;\r\n }\r\n\r\n .mac-popconfirm-portal[data-placement^=\"right\"] .popconfirm-arrow {\r\n left: -5.5px;\r\n border-top: none;\r\n border-right: none;\r\n }\r\n\r\n /* 内容 */\r\n .mac-popconfirm-portal .popconfirm-body {\r\n display: flex;\r\n gap: 10px;\r\n }\r\n\r\n .mac-popconfirm-portal .popconfirm-icon {\r\n flex-shrink: 0;\r\n display: flex;\r\n align-items: flex-start;\r\n padding-top: 1px;\r\n color: var(--md-popconfirm-icon-color, #f5a623);\r\n }\r\n\r\n .mac-popconfirm-portal .popconfirm-icon svg {\r\n width: 18px;\r\n height: 18px;\r\n }\r\n\r\n .mac-popconfirm-portal .popconfirm-content {\r\n flex: 1;\r\n min-width: 0;\r\n }\r\n\r\n .mac-popconfirm-portal .popconfirm-title {\r\n font-size: var(--md-popconfirm-title-font-size, 14px);\r\n font-weight: 500;\r\n color: var(--md-popconfirm-title-color, rgba(0, 0, 0, 0.88));\r\n line-height: 1.5;\r\n }\r\n\r\n .mac-popconfirm-portal .popconfirm-desc {\r\n font-size: var(--md-popconfirm-desc-font-size, 13px);\r\n color: var(--md-popconfirm-desc-color, rgba(0, 0, 0, 0.45));\r\n line-height: 1.5;\r\n margin-top: 4px;\r\n }\r\n\r\n .mac-popconfirm-portal .popconfirm-actions {\r\n display: flex;\r\n align-items: center;\r\n justify-content: flex-end;\r\n gap: var(--md-popconfirm-btn-gap, 8px);\r\n margin-top: 12px;\r\n }\r\n\r\n .mac-popconfirm-portal .popconfirm-btn {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n height: 28px;\r\n padding: 0 14px;\r\n border-radius: 6px;\r\n font-size: 13px;\r\n font-weight: 400;\r\n cursor: pointer;\r\n transition: background 150ms, color 150ms, border-color 150ms;\r\n border: 0.5px solid rgba(0, 0, 0, 0.12);\r\n background: rgba(255, 255, 255, 0.8);\r\n color: rgba(0, 0, 0, 0.88);\r\n white-space: nowrap;\r\n user-select: none;\r\n }\r\n\r\n .mac-popconfirm-portal .popconfirm-btn:hover {\r\n background: rgba(255, 255, 255, 1);\r\n }\r\n\r\n .mac-popconfirm-portal .popconfirm-btn:active {\r\n background: rgba(240, 240, 240, 0.9);\r\n }\r\n\r\n .mac-popconfirm-portal .popconfirm-btn-confirm {\r\n background: rgba(0, 122, 255, 0.88);\r\n color: #fff;\r\n border-color: transparent;\r\n }\r\n\r\n .mac-popconfirm-portal .popconfirm-btn-confirm:hover {\r\n background: rgba(0, 100, 220, 0.92);\r\n }\r\n\r\n .mac-popconfirm-portal .popconfirm-btn-confirm:active {\r\n background: rgba(0, 80, 190, 0.95);\r\n }\r\n\r\n .mac-popconfirm-portal .popconfirm-btn-danger {\r\n background: rgba(220, 53, 46, 0.88);\r\n color: #fff;\r\n border-color: transparent;\r\n }\r\n\r\n .mac-popconfirm-portal .popconfirm-btn-danger:hover {\r\n background: rgba(200, 40, 35, 0.92);\r\n }\r\n\r\n .mac-popconfirm-portal .popconfirm-btn-danger:active {\r\n background: rgba(180, 30, 25, 0.95);\r\n }\r\n\r\n .mac-popconfirm-portal[data-theme='dark'] {\r\n --md-popconfirm-bg: rgba(40, 40, 40, 0.92);\r\n --md-popconfirm-border: rgba(255, 255, 255, 0.08);\r\n --md-popconfirm-shadow: 0 8px 40px rgba(0, 0, 0, 0.3), 0 2px 12px rgba(0, 0, 0, 0.2);\r\n --md-popconfirm-title-color: rgba(255, 255, 255, 0.92);\r\n --md-popconfirm-desc-color: rgba(255, 255, 255, 0.45);\r\n --md-popconfirm-icon-color: #f5a623;\r\n }\r\n\r\n .mac-popconfirm-portal[data-theme='dark'] .popconfirm-arrow {\r\n background: rgba(40, 40, 40, 0.92);\r\n border-color: rgba(255, 255, 255, 0.08);\r\n }\r\n\r\n .mac-popconfirm-portal[data-theme='dark'] .popconfirm-btn {\r\n background: rgba(255, 255, 255, 0.08);\r\n color: rgba(255, 255, 255, 0.88);\r\n border-color: rgba(255, 255, 255, 0.12);\r\n }\r\n\r\n .mac-popconfirm-portal[data-theme='dark'] .popconfirm-btn:hover {\r\n background: rgba(255, 255, 255, 0.12);\r\n }\r\n `\r\n document.head.appendChild(style)\r\n }\r\n\r\n private _applyThemeVars(): void {\r\n const isDark = this._resolvedTheme === 'dark'\r\n\r\n const root = this._popoverEl || document.documentElement\r\n if (isDark) {\r\n root.style.setProperty('--md-popconfirm-bg', 'rgba(40, 40, 40, 0.92)')\r\n root.style.setProperty('--md-popconfirm-border', 'rgba(255, 255, 255, 0.08)')\r\n root.style.setProperty(\r\n '--md-popconfirm-shadow',\r\n '0 8px 40px rgba(0,0,0,0.3), 0 2px 12px rgba(0,0,0,0.2)',\r\n )\r\n root.style.setProperty('--md-popconfirm-title-color', 'rgba(255, 255, 255, 0.92)')\r\n root.style.setProperty('--md-popconfirm-desc-color', 'rgba(255, 255, 255, 0.45)')\r\n } else {\r\n root.style.setProperty('--md-popconfirm-bg', 'rgba(246, 246, 246, 0.88)')\r\n root.style.setProperty('--md-popconfirm-border', 'rgba(0, 0, 0, 0.06)')\r\n root.style.setProperty(\r\n '--md-popconfirm-shadow',\r\n '0 8px 40px rgba(0,0,0,0.12), 0 2px 12px rgba(0,0,0,0.06)',\r\n )\r\n root.style.setProperty('--md-popconfirm-title-color', 'rgba(0, 0, 0, 0.88)')\r\n root.style.setProperty('--md-popconfirm-desc-color', 'rgba(0, 0, 0, 0.45)')\r\n }\r\n }\r\n\r\n // ─── 事件处理器 ───\r\n\r\n private _handleDocumentClick = (e: Event): void => {\r\n if (!this._visible || !this._popoverEl) return\r\n const target = e.target as Node\r\n if (this._popoverEl.contains(target) || this.contains(target)) return\r\n this._hide()\r\n }\r\n\r\n private _handleKeyDown = (e: KeyboardEvent): void => {\r\n if (e.key === 'Escape' && this._visible) {\r\n e.preventDefault()\r\n this._cancel()\r\n }\r\n }\r\n\r\n private _handleTriggerClick(e: Event): void {\r\n if (this.disabled) return\r\n if (this.trigger !== 'click') return\r\n e.preventDefault()\r\n this._visible ? this._hide() : this._show()\r\n }\r\n\r\n private _handleMouseEnter(): void {\r\n if (this.disabled || this.trigger !== 'hover') return\r\n if (this._hoverTimeout) clearTimeout(this._hoverTimeout)\r\n this._hoverTimeout = setTimeout(() => this._show(), 150)\r\n }\r\n\r\n private _handleMouseLeave(): void {\r\n if (this.trigger !== 'hover') return\r\n if (this._hoverTimeout) clearTimeout(this._hoverTimeout)\r\n this._hoverTimeout = setTimeout(() => this._hide(), 200)\r\n }\r\n\r\n // ─── 显示/隐藏 ───\r\n\r\n private _show(): void {\r\n if (this._visible) return\r\n this._visible = true\r\n this._createPopover()\r\n this.emit('mac-popconfirm-open')\r\n }\r\n\r\n private _hide(): void {\r\n if (!this._visible) return\r\n this._visible = false\r\n this._removePopover()\r\n this.emit('mac-popconfirm-close')\r\n }\r\n\r\n private _confirm(): void {\r\n this.emit('mac-popconfirm-confirm')\r\n this._hide()\r\n }\r\n\r\n private _cancel(): void {\r\n this.emit('mac-popconfirm-cancel')\r\n this._hide()\r\n }\r\n\r\n // ─── 定位 ───\r\n\r\n private _calcPosition(\r\n anchorRect: DOMRect,\r\n popoverRect: { width: number; height: number },\r\n ): { left: number; top: number; adjustedPlacement: string } {\r\n const gap = 10\r\n const pw = popoverRect.width\r\n const ph = popoverRect.height\r\n const vw = window.innerWidth\r\n const vh = window.innerHeight\r\n\r\n let left = 0\r\n let top = 0\r\n let adjustedPlacement: MacPopconfirm['placement'] = this.placement\r\n\r\n const place = (placement: string) => {\r\n switch (placement) {\r\n case 'top':\r\n left = anchorRect.left + anchorRect.width / 2 - pw / 2\r\n top = anchorRect.top - ph - gap\r\n break\r\n case 'top-start':\r\n left = anchorRect.left\r\n top = anchorRect.top - ph - gap\r\n break\r\n case 'top-end':\r\n left = anchorRect.right - pw\r\n top = anchorRect.top - ph - gap\r\n break\r\n case 'bottom':\r\n left = anchorRect.left + anchorRect.width / 2 - pw / 2\r\n top = anchorRect.bottom + gap\r\n break\r\n case 'bottom-start':\r\n left = anchorRect.left\r\n top = anchorRect.bottom + gap\r\n break\r\n case 'bottom-end':\r\n left = anchorRect.right - pw\r\n top = anchorRect.bottom + gap\r\n break\r\n case 'left':\r\n left = anchorRect.left - pw - gap\r\n top = anchorRect.top + anchorRect.height / 2 - ph / 2\r\n break\r\n case 'left-start':\r\n left = anchorRect.left - pw - gap\r\n top = anchorRect.top\r\n break\r\n case 'left-end':\r\n left = anchorRect.left - pw - gap\r\n top = anchorRect.bottom - ph\r\n break\r\n case 'right':\r\n left = anchorRect.right + gap\r\n top = anchorRect.top + anchorRect.height / 2 - ph / 2\r\n break\r\n case 'right-start':\r\n left = anchorRect.right + gap\r\n top = anchorRect.top\r\n break\r\n case 'right-end':\r\n left = anchorRect.right + gap\r\n top = anchorRect.bottom - ph\r\n break\r\n }\r\n }\r\n\r\n place(this.placement)\r\n\r\n // 自动翻转:如果溢出视口,尝试相反位置\r\n const isTop = this.placement.startsWith('top')\r\n const isBottom = this.placement.startsWith('bottom')\r\n const isLeft = this.placement.startsWith('left')\r\n const isRight = this.placement.startsWith('right')\r\n\r\n if (isTop && top < 8) {\r\n const flipped = this.placement.replace('top', 'bottom') as MacPopconfirm['placement']\r\n const prevTop = top\r\n place(flipped)\r\n if (top + ph <= vh - 8) {\r\n adjustedPlacement = flipped\r\n } else {\r\n top = prevTop // revert\r\n }\r\n } else if (isBottom && top + ph > vh - 8) {\r\n const flipped = this.placement.replace('bottom', 'top') as MacPopconfirm['placement']\r\n const prevTop = top\r\n place(flipped)\r\n if (top >= 8) {\r\n adjustedPlacement = flipped\r\n } else {\r\n top = prevTop\r\n }\r\n } else if (isLeft && left < 8) {\r\n const flipped = this.placement.replace('left', 'right') as MacPopconfirm['placement']\r\n const prevLeft = left\r\n place(flipped)\r\n if (left + pw <= vw - 8) {\r\n adjustedPlacement = flipped\r\n } else {\r\n left = prevLeft\r\n }\r\n } else if (isRight && left + pw > vw - 8) {\r\n const flipped = this.placement.replace('right', 'left') as MacPopconfirm['placement']\r\n const prevLeft = left\r\n place(flipped)\r\n if (left >= 8) {\r\n adjustedPlacement = flipped\r\n } else {\r\n left = prevLeft\r\n }\r\n }\r\n\r\n // 限制在视口内\r\n if (left + pw > vw - 8) left = vw - pw - 8\r\n if (left < 8) left = 8\r\n if (top + ph > vh - 8) top = vh - ph - 8\r\n if (top < 8) top = 8\r\n\r\n return { left, top, adjustedPlacement }\r\n }\r\n\r\n private _positionArrow(popover: HTMLElement, anchorRect: DOMRect): void {\r\n const arrow = popover.querySelector('.popconfirm-arrow') as HTMLElement\r\n if (!arrow) return\r\n\r\n const popoverRect = popover.getBoundingClientRect()\r\n const placement = popover.getAttribute('data-placement') || this.placement\r\n\r\n arrow.style.left = ''\r\n arrow.style.top = ''\r\n arrow.style.right = ''\r\n arrow.style.bottom = ''\r\n\r\n const arrowSize = 10\r\n const halfArrow = arrowSize / 2\r\n const padding = 14 // min distance from edge\r\n\r\n if (placement.startsWith('top') || placement.startsWith('bottom')) {\r\n const anchorCenter = anchorRect.left + anchorRect.width / 2\r\n let arrowLeft = anchorCenter - popoverRect.left - halfArrow\r\n arrowLeft = Math.max(padding, Math.min(popoverRect.width - padding - arrowSize, arrowLeft))\r\n arrow.style.left = `${arrowLeft}px`\r\n } else {\r\n const anchorCenter = anchorRect.top + anchorRect.height / 2\r\n let arrowTop = anchorCenter - popoverRect.top - halfArrow\r\n arrowTop = Math.max(padding, Math.min(popoverRect.height - padding - arrowSize, arrowTop))\r\n arrow.style.top = `${arrowTop}px`\r\n }\r\n }\r\n\r\n // ─── Portal ───\r\n\r\n private _createPopover(): void {\r\n this._removePopover()\r\n\r\n const triggerEl = this.shadowRoot?.querySelector('.trigger')\r\n const anchorRect = triggerEl?.getBoundingClientRect()\r\n if (!anchorRect) return\r\n\r\n const popover = document.createElement('div')\r\n popover.id = this._popoverId\r\n popover.className = 'mac-popconfirm-portal'\r\n popover.setAttribute('data-placement', this.placement)\r\n const resolvedTheme = this._resolvedTheme\r\n if (resolvedTheme) {\r\n popover.setAttribute('data-theme', resolvedTheme)\r\n }\r\n popover.style.width = this.width\r\n\r\n // 箭头\r\n const arrow = document.createElement('div')\r\n arrow.className = 'popconfirm-arrow'\r\n popover.appendChild(arrow)\r\n\r\n // 主体\r\n const body = document.createElement('div')\r\n body.className = 'popconfirm-body'\r\n\r\n // 图标\r\n if (this.showIcon) {\r\n const iconWrap = document.createElement('div')\r\n iconWrap.className = 'popconfirm-icon'\r\n iconWrap.innerHTML = `<svg viewBox=\"0 0 18 18\" fill=\"currentColor\"><path d=\"M9 2.5a6.5 6.5 0 100 13 6.5 6.5 0 000-13zM9 1a8 8 0 110 16A8 8 0 019 1zm-.25 4.5a.75.75 0 011.5 0v4a.75.75 0 01-1.5 0v-4zM9 12a1 1 0 100 2 1 1 0 000-2z\"/></svg>`\r\n body.appendChild(iconWrap)\r\n }\r\n\r\n // 内容\r\n const content = document.createElement('div')\r\n content.className = 'popconfirm-content'\r\n\r\n if (this.title) {\r\n const titleEl = document.createElement('div')\r\n titleEl.className = 'popconfirm-title'\r\n titleEl.textContent = this.title\r\n content.appendChild(titleEl)\r\n }\r\n\r\n if (this.description) {\r\n const descEl = document.createElement('div')\r\n descEl.className = 'popconfirm-desc'\r\n descEl.textContent = this.description\r\n content.appendChild(descEl)\r\n }\r\n\r\n body.appendChild(content)\r\n popover.appendChild(body)\r\n\r\n // 操作按钮\r\n const actions = document.createElement('div')\r\n actions.className = 'popconfirm-actions'\r\n\r\n // 检查自定义操作插槽\r\n const customActionSlot = this.querySelector('[slot=\"action\"]')\r\n if (customActionSlot) {\r\n actions.appendChild(customActionSlot.cloneNode(true))\r\n } else {\r\n // 取消按钮\r\n const cancelBtn = document.createElement('button')\r\n cancelBtn.className = 'popconfirm-btn popconfirm-btn-cancel'\r\n cancelBtn.textContent = this.cancelText\r\n cancelBtn.addEventListener('click', () => this._cancel())\r\n actions.appendChild(cancelBtn)\r\n\r\n // 确认按钮\r\n const confirmBtn = document.createElement('button')\r\n confirmBtn.className = `popconfirm-btn popconfirm-btn-confirm${this.danger ? ' popconfirm-btn-danger' : ''}`\r\n confirmBtn.textContent = this.confirmText\r\n confirmBtn.addEventListener('click', () => this._confirm())\r\n actions.appendChild(confirmBtn)\r\n }\r\n\r\n popover.appendChild(actions)\r\n\r\n // 悬停保活\r\n popover.addEventListener('mouseenter', () => {\r\n if (this.trigger === 'hover' && this._hoverTimeout) {\r\n clearTimeout(this._hoverTimeout)\r\n this._hoverTimeout = null\r\n }\r\n })\r\n popover.addEventListener('mouseleave', () => {\r\n if (this.trigger === 'hover') {\r\n if (this._hoverTimeout) clearTimeout(this._hoverTimeout)\r\n this._hoverTimeout = setTimeout(() => this._hide(), 200)\r\n }\r\n })\r\n\r\n // 先不可见渲染以测量实际尺寸\r\n popover.style.visibility = 'hidden'\r\n popover.style.left = '-9999px'\r\n popover.style.top = '-9999px'\r\n document.body.appendChild(popover)\r\n this._popoverEl = popover\r\n\r\n // 测量并定位\r\n requestAnimationFrame(() => {\r\n if (!this._popoverEl) return\r\n const popoverRect = popover.getBoundingClientRect()\r\n const { left, top, adjustedPlacement } = this._calcPosition(anchorRect, {\r\n width: popoverRect.width,\r\n height: popoverRect.height,\r\n })\r\n\r\n popover.setAttribute('data-placement', adjustedPlacement)\r\n popover.style.left = `${left}px`\r\n popover.style.top = `${top}px`\r\n popover.style.visibility = ''\r\n\r\n this._positionArrow(popover, anchorRect)\r\n popover.classList.add('visible')\r\n })\r\n }\r\n\r\n private _removePopover(): void {\r\n if (this._popoverEl) {\r\n this._popoverEl.classList.remove('visible')\r\n const el = this._popoverEl\r\n setTimeout(() => {\r\n if (el.parentNode) el.parentNode.removeChild(el)\r\n }, 180)\r\n this._popoverEl = null\r\n }\r\n }\r\n\r\n override render() {\r\n return html`\r\n <div\r\n class=\"trigger\"\r\n @click=${this._handleTriggerClick}\r\n @mouseenter=${this._handleMouseEnter}\r\n @mouseleave=${this._handleMouseLeave}\r\n >\r\n <slot></slot>\r\n </div>\r\n `\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'mac-popconfirm': MacPopconfirm\r\n }\r\n}\r\n","import { html, css } from 'lit'\r\nimport { property, customElement, state, query } from 'lit/decorators.js'\r\nimport { BaseElement } from '../../internal/base-element'\r\nimport { sharedStyles } from '../../styles/shared-styles'\r\nimport { themeTokens } from '../../styles/theme'\r\n\r\n/**\r\n * @tag mac-split-pane\r\n * @summary 在 mac-split 内部使用的窗格容器。\r\n *\r\n * @slot - 窗格的内容。\r\n *\r\n * @csspart base - 窗格的基础容器。\r\n */\r\n@customElement('mac-split-pane')\r\nexport class MacSplitPane extends BaseElement {\r\n static override styles = [\r\n themeTokens,\r\n sharedStyles,\r\n css`\r\n :host {\r\n display: block;\r\n overflow: hidden;\r\n }\r\n\r\n .pane {\r\n width: 100%;\r\n height: 100%;\r\n overflow: auto;\r\n }\r\n `,\r\n ]\r\n\r\n override render() {\r\n return html`\r\n <div part=\"base\" class=\"pane\">\r\n <slot></slot>\r\n </div>\r\n `\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'mac-split-pane': MacSplitPane\r\n }\r\n}\r\n\r\n/**\r\n * @tag mac-split\r\n * @summary macOS 风格的可调整分割面板组件。\r\n *\r\n * @slot first - 第一个面板的内容。\r\n * @slot second - 第二个面板的内容。\r\n *\r\n * @csspart base - 分割容器。\r\n * @csspart first - 第一个面板的包装器。\r\n * @csspart second - 第二个面板的包装器。\r\n * @csspart resizer - 可拖拽的调整条。\r\n * @csspart resizer-line - 调整条内的视觉线条。\r\n *\r\n * @event mac-split-change - 分割值变化时触发。`detail: { value: number }`\r\n * @event mac-split-drag-start - 开始拖拽时触发。\r\n * @event mac-split-drag-end - 拖拽结束时触发。\r\n */\r\n@customElement('mac-split')\r\nexport class MacSplit extends BaseElement {\r\n static override styles = [\r\n themeTokens,\r\n sharedStyles,\r\n css`\r\n :host {\r\n display: block;\r\n width: 100%;\r\n height: 100%;\r\n }\r\n\r\n .split {\r\n display: grid;\r\n width: 100%;\r\n height: 100%;\r\n overflow: hidden;\r\n }\r\n\r\n .split--horizontal {\r\n grid-template-columns:\r\n var(--_first-size, 50%) var(--md-split-resizer-size, 1px)\r\n 1fr;\r\n }\r\n\r\n .split--vertical {\r\n grid-template-rows:\r\n var(--_first-size, 50%) var(--md-split-resizer-size, 1px)\r\n 1fr;\r\n }\r\n\r\n .panel {\r\n overflow: hidden;\r\n min-width: 0;\r\n min-height: 0;\r\n }\r\n\r\n .resizer {\r\n position: relative;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n background: transparent;\r\n user-select: none;\r\n touch-action: none;\r\n z-index: 1;\r\n }\r\n\r\n .split--horizontal .resizer {\r\n cursor: col-resize;\r\n width: var(--md-split-resizer-size, 1px);\r\n }\r\n\r\n .split--vertical .resizer {\r\n cursor: row-resize;\r\n height: var(--md-split-resizer-size, 1px);\r\n }\r\n\r\n .resizer__line {\r\n background: var(--md-split-resizer-color, var(--md-color-border));\r\n transition: background var(--md-transition-fast);\r\n }\r\n\r\n .split--horizontal .resizer__line {\r\n width: 1px;\r\n height: 100%;\r\n }\r\n\r\n .split--vertical .resizer__line {\r\n width: 100%;\r\n height: 1px;\r\n }\r\n\r\n .resizer:hover .resizer__line,\r\n .resizer--dragging .resizer__line {\r\n background: var(--md-split-resizer-hover-color, var(--md-color-primary));\r\n }\r\n\r\n .split--horizontal .resizer:hover .resizer__line,\r\n .split--horizontal .resizer--dragging .resizer__line {\r\n width: 2px;\r\n }\r\n\r\n .split--vertical .resizer:hover .resizer__line,\r\n .split--vertical .resizer--dragging .resizer__line {\r\n height: 2px;\r\n }\r\n\r\n .resizer__handle {\r\n position: absolute;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n border-radius: var(--md-radius-sm);\r\n background: var(--md-split-resizer-handle-bg, transparent);\r\n opacity: 0;\r\n transition: opacity var(--md-transition-fast);\r\n }\r\n\r\n .split--horizontal .resizer__handle {\r\n width: 8px;\r\n height: 24px;\r\n }\r\n\r\n .split--vertical .resizer__handle {\r\n width: 24px;\r\n height: 8px;\r\n }\r\n\r\n .resizer:hover .resizer__handle,\r\n .resizer--dragging .resizer__handle {\r\n opacity: 1;\r\n background: var(--md-split-resizer-handle-bg, var(--md-color-bg-secondary));\r\n }\r\n\r\n .resizer__handle-dots {\r\n display: flex;\r\n gap: 2px;\r\n }\r\n\r\n .split--horizontal .resizer__handle-dots {\r\n flex-direction: column;\r\n }\r\n\r\n .resizer__handle-dot {\r\n width: 3px;\r\n height: 3px;\r\n border-radius: 50%;\r\n background: var(--md-split-resizer-handle-dot-color, var(--md-color-text-secondary));\r\n }\r\n\r\n :host([disabled]) .resizer {\r\n cursor: default;\r\n pointer-events: none;\r\n }\r\n\r\n :host([disabled]) .resizer__line {\r\n background: var(--md-split-resizer-color, var(--md-color-border));\r\n }\r\n `,\r\n ]\r\n\r\n /** 分割方向。 */\r\n @property({ reflect: true }) direction: 'horizontal' | 'vertical' = 'horizontal'\r\n\r\n /** 初始分割值,比例(0-1)或像素。 */\r\n @property({ type: Number }) split = 0.5\r\n\r\n /** 分割值的单位:'ratio'(0-1)或 'pixel'。 */\r\n @property({ reflect: true }) unit: 'ratio' | 'pixel' = 'ratio'\r\n\r\n /** 第一个面板的最小尺寸(像素)。 */\r\n @property({ type: Number }) min = 0\r\n\r\n /** 第一个面板的最大尺寸(像素)。0 表示无限制。 */\r\n @property({ type: Number }) max = 0\r\n\r\n /** 禁用调整大小。 */\r\n @property({ type: Boolean, reflect: true }) disabled = false\r\n\r\n @state() private _dragging = false\r\n @state() private _currentSplit = this.split\r\n\r\n @query('.split') private _splitRef!: HTMLElement\r\n @query('.resizer') private _resizerRef!: HTMLElement\r\n\r\n override connectedCallback() {\r\n super.connectedCallback()\r\n this._currentSplit = this.split\r\n }\r\n\r\n override firstUpdated() {\r\n this._updateFirstSize()\r\n }\r\n\r\n override updated(changedProperties: Map<string, unknown>) {\r\n super.updated(changedProperties)\r\n if (changedProperties.has('split')) {\r\n this._currentSplit = this.split\r\n this._updateFirstSize()\r\n }\r\n if (changedProperties.has('direction')) {\r\n this._updateFirstSize()\r\n }\r\n }\r\n\r\n private _updateFirstSize() {\r\n let sizeValue: string\r\n if (this.unit === 'pixel') {\r\n sizeValue = `${this._currentSplit}px`\r\n } else {\r\n sizeValue = `${this._currentSplit * 100}%`\r\n }\r\n this.style.setProperty('--_first-size', sizeValue)\r\n }\r\n\r\n private _onResizerMouseDown(e: MouseEvent) {\r\n if (this.disabled) return\r\n e.preventDefault()\r\n this._dragging = true\r\n this.emit('mac-split-drag-start')\r\n\r\n document.addEventListener('mousemove', this._onDocumentMouseMove)\r\n document.addEventListener('mouseup', this._onDocumentMouseUp)\r\n }\r\n\r\n private _onDocumentMouseMove = (e: MouseEvent) => {\r\n if (!this._dragging) return\r\n\r\n const rect = this.getBoundingClientRect()\r\n let newSize: number\r\n\r\n if (this.direction === 'horizontal') {\r\n newSize = e.clientX - rect.left\r\n } else {\r\n newSize = e.clientY - rect.top\r\n }\r\n\r\n // 应用最小/最大约束\r\n if (this.min > 0) {\r\n newSize = Math.max(newSize, this.min)\r\n }\r\n if (this.max > 0) {\r\n newSize = Math.min(newSize, this.max)\r\n }\r\n\r\n // 转换为单位值\r\n if (this.unit === 'ratio') {\r\n const total = this.direction === 'horizontal' ? rect.width : rect.height\r\n if (total > 0) {\r\n newSize = newSize / total\r\n }\r\n }\r\n\r\n this._currentSplit = newSize\r\n this._updateFirstSize()\r\n this.emit('mac-split-change', { detail: { value: newSize } })\r\n }\r\n\r\n private _onDocumentMouseUp = () => {\r\n if (!this._dragging) return\r\n this._dragging = false\r\n this.emit('mac-split-drag-end')\r\n document.removeEventListener('mousemove', this._onDocumentMouseMove)\r\n document.removeEventListener('mouseup', this._onDocumentMouseUp)\r\n }\r\n\r\n override disconnectedCallback() {\r\n super.disconnectedCallback()\r\n document.removeEventListener('mousemove', this._onDocumentMouseMove)\r\n document.removeEventListener('mouseup', this._onDocumentMouseUp)\r\n }\r\n\r\n override render() {\r\n const directionClass = `split--${this.direction}`\r\n\r\n return html`\r\n <div part=\"base\" class=\"split ${directionClass}\">\r\n <div part=\"first\" class=\"panel\">\r\n <slot name=\"first\"></slot>\r\n </div>\r\n <div\r\n part=\"resizer\"\r\n class=\"resizer ${this._dragging ? 'resizer--dragging' : ''}\"\r\n @mousedown=${this._onResizerMouseDown}\r\n >\r\n <div part=\"resizer-line\" class=\"resizer__line\"></div>\r\n <div class=\"resizer__handle\">\r\n <div class=\"resizer__handle-dots\">\r\n <div class=\"resizer__handle-dot\"></div>\r\n <div class=\"resizer__handle-dot\"></div>\r\n <div class=\"resizer__handle-dot\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n <div part=\"second\" class=\"panel\">\r\n <slot name=\"second\"></slot>\r\n </div>\r\n </div>\r\n `\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'mac-split': MacSplit\r\n 'mac-split-pane': MacSplitPane\r\n }\r\n}\r\n","import { html, css, nothing } from 'lit'\r\nimport { property, customElement, state } from 'lit/decorators.js'\r\nimport { BaseElement } from '../../internal/base-element'\r\nimport { sharedStyles } from '../../styles/shared-styles'\r\nimport { themeTokens } from '../../styles/theme'\r\n\r\n/**\r\n * @tag mac-lazy-image\r\n * @summary 懒加载图片组件,支持占位图、错误状态、悬停动画和点击预览。\r\n *\r\n * @slot placeholder - 加载时显示的自定义占位内容。\r\n * @slot error - 图片加载失败时显示的自定义错误内容。\r\n *\r\n * @csspart image - 图片元素。\r\n * @csspart placeholder - 占位容器。\r\n * @csspart error - 错误容器。\r\n * @csspart preview-overlay - 预览遮罩容器。\r\n * @csspart preview-image - 预览图片元素。\r\n *\r\n * @cssproperty --md-lazy-image-object-fit - 对象适配样式。\r\n * @cssproperty --md-lazy-image-placeholder-bg - 占位背景颜色。\r\n * @cssproperty --md-lazy-image-placeholder-color - 占位图标颜色。\r\n * @cssproperty --md-lazy-image-placeholder-icon-size - 占位图标大小。\r\n * @cssproperty --md-lazy-image-error-icon-size - 错误图标大小。\r\n * @cssproperty --md-lazy-image-shimmer-bg - 微光动画高亮颜色。\r\n * @cssproperty --md-lazy-image-hover-scale - 悬停缩放变换(默认:1.05)。\r\n * @cssproperty --md-lazy-image-hover-duration - 悬停动画时长(默认:300ms)。\r\n * @cssproperty --md-lazy-image-hover-easing - 悬停动画缓动(默认:ease-out)。\r\n * @cssproperty --md-lazy-image-hover-filter - 悬停滤镜效果(默认:none)。\r\n * @cssproperty --md-lazy-image-preview-bg - 预览遮罩背景(默认:rgba(0,0,0,0.85))。\r\n * @cssproperty --md-lazy-image-preview-duration - 预览打开/关闭动画时长(默认:250ms)。\r\n *\r\n * @event mac-load - 图片成功加载时触发。\r\n * @event mac-error - 图片加载失败时触发。\r\n * @event mac-preview-open - 预览遮罩打开时触发。\r\n * @event mac-preview-close - 预览遮罩关闭时触发。\r\n */\r\n@customElement('mac-lazy-image')\r\nexport class MacLazyImage extends BaseElement {\r\n static override styles = [\r\n themeTokens,\r\n sharedStyles,\r\n css`\r\n :host {\r\n display: inline-block;\r\n position: relative;\r\n overflow: hidden;\r\n }\r\n\r\n :host([preview-enabled]) {\r\n cursor: pointer;\r\n }\r\n\r\n .container {\r\n position: relative;\r\n width: 100%;\r\n height: 100%;\r\n overflow: hidden;\r\n }\r\n\r\n .image {\r\n display: block;\r\n width: 100%;\r\n height: 100%;\r\n opacity: 0;\r\n transition:\r\n opacity var(--md-transition-normal),\r\n transform var(--md-lazy-image-hover-duration, 300ms)\r\n var(--md-lazy-image-hover-easing, ease-out),\r\n filter var(--md-lazy-image-hover-duration, 300ms)\r\n var(--md-lazy-image-hover-easing, ease-out);\r\n object-fit: var(--md-lazy-image-object-fit, cover);\r\n }\r\n\r\n .image.loaded {\r\n opacity: 1;\r\n }\r\n\r\n .container:hover .image.loaded {\r\n transform: scale(var(--md-lazy-image-hover-scale, 1.05));\r\n filter: var(--md-lazy-image-hover-filter, none);\r\n }\r\n\r\n .placeholder,\r\n .error {\r\n position: absolute;\r\n inset: 0;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n background: var(--md-lazy-image-placeholder-bg, var(--md-color-bg-secondary));\r\n color: var(--md-lazy-image-placeholder-color, var(--md-color-text-secondary));\r\n transition: opacity var(--md-transition-normal);\r\n }\r\n\r\n .placeholder.hidden,\r\n .error.hidden {\r\n opacity: 0;\r\n pointer-events: none;\r\n }\r\n\r\n .placeholder-icon {\r\n width: var(--md-lazy-image-placeholder-icon-size, 32px);\r\n height: var(--md-lazy-image-placeholder-icon-size, 32px);\r\n opacity: 0.4;\r\n }\r\n\r\n .error-icon {\r\n width: var(--md-lazy-image-error-icon-size, 32px);\r\n height: var(--md-lazy-image-error-icon-size, 32px);\r\n opacity: 0.4;\r\n }\r\n\r\n /* 加载微光效果 */\r\n .placeholder.shimmer {\r\n background: linear-gradient(\r\n 90deg,\r\n var(--md-lazy-image-placeholder-bg, var(--md-color-bg-secondary)) 25%,\r\n var(--md-lazy-image-shimmer-bg, rgba(255, 255, 255, 0.5)) 50%,\r\n var(--md-lazy-image-placeholder-bg, var(--md-color-bg-secondary)) 75%\r\n );\r\n background-size: 200% 100%;\r\n animation: shimmer 1.5s infinite;\r\n }\r\n\r\n @keyframes shimmer {\r\n 0% {\r\n background-position: 200% 0;\r\n }\r\n 100% {\r\n background-position: -200% 0;\r\n }\r\n }\r\n\r\n /* ─── 预览遮罩层 ─── */\r\n\r\n .preview-overlay {\r\n position: fixed;\r\n inset: 0;\r\n z-index: 9999;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n background: var(--md-lazy-image-preview-bg, rgba(0, 0, 0, 0.85));\r\n backdrop-filter: blur(12px);\r\n -webkit-backdrop-filter: blur(12px);\r\n opacity: 0;\r\n visibility: hidden;\r\n transition:\r\n opacity var(--md-lazy-image-preview-duration, 250ms) ease,\r\n visibility var(--md-lazy-image-preview-duration, 250ms) ease;\r\n cursor: zoom-out;\r\n }\r\n\r\n .preview-overlay.open {\r\n opacity: 1;\r\n visibility: visible;\r\n }\r\n\r\n .preview-image {\r\n max-width: 90vw;\r\n max-height: 90vh;\r\n object-fit: contain;\r\n border-radius: var(--md-radius-md);\r\n box-shadow: 0 24px 80px rgba(0, 0, 0, 0.4);\r\n transform: scale(0.9);\r\n transition: transform var(--md-lazy-image-preview-duration, 250ms)\r\n cubic-bezier(0.16, 1, 0.3, 1);\r\n cursor: default;\r\n pointer-events: none;\r\n user-select: none;\r\n -webkit-user-drag: none;\r\n }\r\n\r\n .preview-overlay.open .preview-image {\r\n transform: scale(1);\r\n }\r\n\r\n .preview-close {\r\n position: absolute;\r\n top: 20px;\r\n right: 20px;\r\n width: 40px;\r\n height: 40px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n border-radius: 50%;\r\n background: rgba(255, 255, 255, 0.1);\r\n color: rgba(255, 255, 255, 0.8);\r\n cursor: pointer;\r\n transition:\r\n background var(--md-transition-fast),\r\n color var(--md-transition-fast);\r\n backdrop-filter: blur(8px);\r\n -webkit-backdrop-filter: blur(8px);\r\n }\r\n\r\n .preview-close:hover {\r\n background: rgba(255, 255, 255, 0.2);\r\n color: #fff;\r\n }\r\n\r\n .preview-close svg {\r\n width: 20px;\r\n height: 20px;\r\n }\r\n `,\r\n ]\r\n\r\n /** 图片源地址。 */\r\n @property() src = ''\r\n\r\n /** 图片替代文本。 */\r\n @property() alt = ''\r\n\r\n /** 图片宽度。 */\r\n @property() width?: string\r\n\r\n /** 图片高度。 */\r\n @property() height?: string\r\n\r\n /** CSS object-fit 值。 */\r\n @property({ attribute: 'object-fit' }) objectFit:\r\n 'cover' | 'contain' | 'fill' | 'none' | 'scale-down' = 'cover'\r\n\r\n /** 加载时显示的占位图片地址。 */\r\n @property() placeholder?: string\r\n\r\n /** IntersectionObserver 的 rootMargin。 */\r\n @property({ attribute: 'root-margin' }) rootMargin = '0px'\r\n\r\n /** IntersectionObserver 的 threshold。 */\r\n @property({ type: Number }) threshold = 0\r\n\r\n /** 是否启用点击预览。 */\r\n @property({ type: Boolean }) preview = false\r\n\r\n /** 预览模式的图片地址。未设置时回退到 src。 */\r\n @property({ attribute: 'preview-src' }) previewSrc = ''\r\n\r\n @state() private _loaded = false\r\n @state() private _loading = false\r\n @state() private _error = false\r\n @state() private _inView = false\r\n @state() private _previewOpen = false\r\n @state() private _previewAnimating = false\r\n\r\n private _observer?: IntersectionObserver\r\n private _imgEl?: HTMLImageElement\r\n private _onKeydownBound = this._onKeydown.bind(this)\r\n\r\n override connectedCallback() {\r\n super.connectedCallback()\r\n this._setupObserver()\r\n this._updatePreviewAttr()\r\n }\r\n\r\n override disconnectedCallback() {\r\n super.disconnectedCallback()\r\n this._cleanupObserver()\r\n if (this._previewOpen) {\r\n this._closePreview()\r\n }\r\n }\r\n\r\n override willUpdate(changedProperties: Map<string, unknown>) {\r\n super.willUpdate(changedProperties)\r\n if (changedProperties.has('preview')) {\r\n this._updatePreviewAttr()\r\n }\r\n }\r\n\r\n private _updatePreviewAttr() {\r\n if (this.preview) {\r\n this.setAttribute('preview-enabled', '')\r\n } else {\r\n this.removeAttribute('preview-enabled')\r\n }\r\n }\r\n\r\n private _setupObserver() {\r\n if (this._observer) return\r\n this._observer = new IntersectionObserver(\r\n (entries) => {\r\n const entry = entries[0]\r\n if (entry.isIntersecting) {\r\n this._inView = true\r\n this._loadImage()\r\n this._cleanupObserver()\r\n }\r\n },\r\n {\r\n rootMargin: this.rootMargin,\r\n threshold: this.threshold,\r\n },\r\n )\r\n this._observer.observe(this)\r\n }\r\n\r\n private _cleanupObserver() {\r\n if (this._observer) {\r\n this._observer.disconnect()\r\n this._observer = undefined\r\n }\r\n }\r\n\r\n private _loadImage() {\r\n if (!this.src || this._loaded || this._loading) return\r\n\r\n this._loading = true\r\n this._error = false\r\n\r\n const img = new Image()\r\n this._imgEl = img\r\n\r\n img.onload = () => {\r\n this._loading = false\r\n this._loaded = true\r\n this._error = false\r\n this.emit('mac-load')\r\n }\r\n\r\n img.onerror = () => {\r\n this._loading = false\r\n this._loaded = false\r\n this._error = true\r\n this.emit('mac-error')\r\n }\r\n\r\n img.src = this.src\r\n }\r\n\r\n override render() {\r\n const width = this.width ?? nothing\r\n const height = this.height ?? nothing\r\n\r\n return html`\r\n <div\r\n class=\"container\"\r\n style=\"width: ${width}; height: ${height};\"\r\n @click=${this._onImageClick}\r\n >\r\n ${this._renderImage()} ${this._renderPlaceholder()} ${this._renderError()}\r\n </div>\r\n ${this._renderPreview()}\r\n `\r\n }\r\n\r\n private _onImageClick() {\r\n if (!this.preview || !this._loaded) return\r\n this._openPreview()\r\n }\r\n\r\n private _openPreview() {\r\n if (this._previewOpen) return\r\n this._previewOpen = true\r\n this._previewAnimating = true\r\n this.emit('mac-preview-open')\r\n document.addEventListener('keydown', this._onKeydownBound)\r\n requestAnimationFrame(() => {\r\n requestAnimationFrame(() => {\r\n this._previewAnimating = false\r\n })\r\n })\r\n }\r\n\r\n private _closePreview() {\r\n if (!this._previewOpen) return\r\n this._previewAnimating = true\r\n requestAnimationFrame(() => {\r\n this._previewOpen = false\r\n this._previewAnimating = false\r\n this.emit('mac-preview-close')\r\n document.removeEventListener('keydown', this._onKeydownBound)\r\n })\r\n }\r\n\r\n private _onKeydown(e: KeyboardEvent) {\r\n if (e.key === 'Escape') {\r\n this._closePreview()\r\n }\r\n }\r\n\r\n private _onPreviewBgClick(e: MouseEvent) {\r\n if (e.target === e.currentTarget) {\r\n this._closePreview()\r\n }\r\n }\r\n\r\n private _renderPreview() {\r\n if (!this.preview) return nothing\r\n\r\n const previewUrl = this.previewSrc || this.src\r\n\r\n return html`\r\n <div\r\n part=\"preview-overlay\"\r\n class=\"preview-overlay ${this._previewOpen ? 'open' : ''} ${\r\n this._previewAnimating ? 'animating' : ''\r\n }\"\r\n @click=${this._onPreviewBgClick}\r\n >\r\n <img part=\"preview-image\" class=\"preview-image\" src=${previewUrl} alt=${this.alt} />\r\n <div class=\"preview-close\" @click=${this._closePreview} title=\"关闭 (Esc)\">\r\n <svg\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\r\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\r\n </svg>\r\n </div>\r\n </div>\r\n `\r\n }\r\n\r\n private _renderImage() {\r\n if (!this._loaded) return nothing\r\n\r\n return html`\r\n <img\r\n part=\"image\"\r\n class=\"image loaded\"\r\n src=${this.src}\r\n alt=${this.alt}\r\n style=\"object-fit: ${this.objectFit};\"\r\n />\r\n `\r\n }\r\n\r\n private _renderPlaceholder() {\r\n if (this._loaded || this._error) {\r\n return nothing\r\n }\r\n\r\n const hasPlaceholderSlot = this.querySelector('[slot=\"placeholder\"]') !== null\r\n const hasPlaceholderSrc = !!this.placeholder\r\n\r\n return html`\r\n <div\r\n part=\"placeholder\"\r\n class=\"placeholder ${!hasPlaceholderSlot && !hasPlaceholderSrc ? 'shimmer' : ''}\"\r\n >\r\n ${\r\n hasPlaceholderSlot\r\n ? html`<slot name=\"placeholder\"></slot>`\r\n : hasPlaceholderSrc\r\n ? html`<img\r\n src=${this.placeholder!}\r\n alt=\"\"\r\n style=\"width: 100%; height: 100%; object-fit: ${this.objectFit}; opacity: 0.6;\"\r\n />`\r\n : html`\r\n <svg\r\n class=\"placeholder-icon\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect>\r\n <circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\"></circle>\r\n <polyline points=\"21 15 16 10 5 21\"></polyline>\r\n </svg>\r\n `\r\n }\r\n </div>\r\n `\r\n }\r\n\r\n private _renderError() {\r\n if (!this._error) return nothing\r\n\r\n const hasErrorSlot = this.querySelector('[slot=\"error\"]') !== null\r\n\r\n return html`\r\n <div part=\"error\" class=\"error\">\r\n ${\r\n hasErrorSlot\r\n ? html`<slot name=\"error\"></slot>`\r\n : html`\r\n <svg\r\n class=\"error-icon\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect>\r\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\"></line>\r\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\"></line>\r\n </svg>\r\n `\r\n }\r\n </div>\r\n `\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'mac-lazy-image': MacLazyImage\r\n }\r\n}\r\n","import { html, css, nothing } from 'lit'\r\nimport { property, customElement, state } from 'lit/decorators.js'\r\nimport { BaseElement } from '../../internal/base-element'\r\nimport { sharedStyles } from '../../styles/shared-styles'\r\nimport { themeTokens } from '../../styles/theme'\r\n\r\n/**\r\n * @tag mac-infinite-scroll\r\n * @summary 无限滚动组件,滚动到底部时触发加载更多数据。\r\n *\r\n * @slot - 默认插槽,用于列表内容。\r\n * @slot loading - 自定义加载指示器内容。\r\n * @slot finished - 没有更多数据时显示的自定义内容。\r\n * @slot error - 加载失败时显示的自定义内容。添加点击监听器以触发重试。\r\n *\r\n * @csspart loading - 加载状态容器。\r\n * @csspart finished - 完成状态容器。\r\n * @csspart error - 错误状态容器。\r\n *\r\n * @cssproperty --md-infinite-scroll-padding - 状态区域内边距。\r\n * @cssproperty --md-infinite-scroll-color - 状态文字颜色。\r\n * @cssproperty --md-infinite-scroll-font-size - 状态字体大小。\r\n * @cssproperty --md-infinite-scroll-gap - 旋转器与文字之间的间距。\r\n * @cssproperty --md-infinite-scroll-spinner-size - 旋转器大小。\r\n *\r\n * @event mac-load-more - 应该加载更多数据时触发。\r\n * @event mac-retry - 点击重试按钮时触发。\r\n */\r\n@customElement('mac-infinite-scroll')\r\nexport class MacInfiniteScroll extends BaseElement {\r\n static override styles = [\r\n themeTokens,\r\n sharedStyles,\r\n css`\r\n :host {\r\n display: block;\r\n height: 100%;\r\n overflow: auto;\r\n }\r\n\r\n .scroll-container {\r\n min-height: 100%;\r\n }\r\n\r\n .sentinel {\r\n height: 1px;\r\n }\r\n\r\n .status {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n padding: var(--md-infinite-scroll-padding, var(--md-spacing-md));\r\n color: var(--md-infinite-scroll-color, var(--md-color-text-secondary));\r\n font-size: var(--md-infinite-scroll-font-size, var(--md-font-size-sm));\r\n gap: var(--md-infinite-scroll-gap, var(--md-spacing-sm));\r\n }\r\n\r\n .loading-spinner {\r\n width: var(--md-infinite-scroll-spinner-size, 16px);\r\n height: var(--md-infinite-scroll-spinner-size, 16px);\r\n border: 2px solid currentColor;\r\n border-right-color: transparent;\r\n border-radius: 50%;\r\n animation: spin 0.6s linear infinite;\r\n }\r\n\r\n .retry-btn {\r\n cursor: pointer;\r\n color: var(--md-color-primary);\r\n text-decoration: underline;\r\n }\r\n\r\n @keyframes spin {\r\n to {\r\n transform: rotate(360deg);\r\n }\r\n }\r\n `,\r\n ]\r\n\r\n /** 是否还有更多数据可加载。 */\r\n @property({ type: Boolean }) hasMore = true\r\n\r\n /** 当前是否正在加载数据。 */\r\n @property({ type: Boolean }) loading = false\r\n\r\n /** 上次加载尝试是否失败。 */\r\n @property({ type: Boolean }) error = false\r\n\r\n /** 距离底部触发加载的像素距离。 */\r\n @property({ type: Number }) threshold = 100\r\n\r\n /** 挂载后是否立即检查,当内容未填满容器时。 */\r\n @property({ type: Boolean, attribute: 'immediate-check' }) immediateCheck = true\r\n\r\n /** 是否禁用自动加载。 */\r\n @property({ type: Boolean }) disabled = false\r\n\r\n @state() private _internalLoading = false\r\n\r\n private _observer?: IntersectionObserver\r\n private _sentinelEl?: HTMLElement\r\n\r\n override firstUpdated() {\r\n this._sentinelEl = this.renderRoot.querySelector('.sentinel') as HTMLElement\r\n this._setupObserver()\r\n if (this.immediateCheck) {\r\n requestAnimationFrame(() => this._checkIfNeedLoad())\r\n }\r\n }\r\n\r\n override updated(changed: Map<string, unknown>) {\r\n if (\r\n changed.has('disabled') ||\r\n changed.has('hasMore') ||\r\n changed.has('loading') ||\r\n changed.has('error')\r\n ) {\r\n if (!this.disabled && this.hasMore && !this.loading && !this.error) {\r\n requestAnimationFrame(() => this._checkIfNeedLoad())\r\n }\r\n }\r\n }\r\n\r\n override disconnectedCallback() {\r\n super.disconnectedCallback()\r\n this._cleanupObserver()\r\n }\r\n\r\n private _setupObserver() {\r\n if (!this._sentinelEl) return\r\n this._cleanupObserver()\r\n\r\n if (typeof IntersectionObserver !== 'undefined') {\r\n const rootMargin = `${this.threshold}px`\r\n this._observer = new IntersectionObserver(\r\n (entries) => {\r\n const entry = entries[0]\r\n if (entry.isIntersecting) {\r\n this._tryLoadMore()\r\n }\r\n },\r\n {\r\n root: this,\r\n rootMargin: `0px 0px ${rootMargin} 0px`,\r\n threshold: 0,\r\n },\r\n )\r\n this._observer.observe(this._sentinelEl)\r\n } else {\r\n // 对于不支持 IntersectionObserver 的环境的降级处理\r\n this.addEventListener('scroll', this._handleScroll)\r\n }\r\n }\r\n\r\n private _cleanupObserver() {\r\n if (this._observer) {\r\n this._observer.disconnect()\r\n this._observer = undefined\r\n }\r\n this.removeEventListener('scroll', this._handleScroll)\r\n }\r\n\r\n private _handleScroll = () => {\r\n if (this.disabled || !this.hasMore || this.loading || this.error || this._internalLoading)\r\n return\r\n const scrollBottom = this.scrollTop + this.clientHeight\r\n if (scrollBottom >= this.scrollHeight - this.threshold) {\r\n this._tryLoadMore()\r\n }\r\n }\r\n\r\n private _checkIfNeedLoad() {\r\n if (!this.hasMore || this.loading || this.error || this.disabled || this._internalLoading)\r\n return\r\n // 如果内容未填满容器,触发加载\r\n if (this.scrollHeight <= this.clientHeight) {\r\n this._tryLoadMore()\r\n }\r\n }\r\n\r\n private _tryLoadMore() {\r\n if (!this.hasMore || this.loading || this.error || this.disabled || this._internalLoading)\r\n return\r\n this._internalLoading = true\r\n this.emit('mac-load-more')\r\n // 短暂延迟后重置内部加载状态,以防止快速重新触发\r\n // 如果使用者未及时设置 loading=true\r\n setTimeout(() => {\r\n this._internalLoading = false\r\n }, 100)\r\n }\r\n\r\n private _handleRetry() {\r\n this.emit('mac-retry')\r\n }\r\n\r\n override render() {\r\n const hasLoadingSlot = this.querySelector('[slot=\"loading\"]') !== null\r\n const hasFinishedSlot = this.querySelector('[slot=\"finished\"]') !== null\r\n const hasErrorSlot = this.querySelector('[slot=\"error\"]') !== null\r\n\r\n return html`\r\n <div class=\"scroll-container\">\r\n <slot></slot>\r\n <div class=\"sentinel\"></div>\r\n ${this._renderStatus(hasLoadingSlot, hasFinishedSlot, hasErrorSlot)}\r\n </div>\r\n `\r\n }\r\n\r\n private _renderStatus(hasLoadingSlot: boolean, hasFinishedSlot: boolean, hasErrorSlot: boolean) {\r\n if (this.loading) {\r\n return html`\r\n <div class=\"status\" part=\"loading\">\r\n ${\r\n hasLoadingSlot\r\n ? html`<slot name=\"loading\"></slot>`\r\n : html`<span class=\"loading-spinner\"></span><span>加载中...</span>`\r\n }\r\n </div>\r\n `\r\n }\r\n\r\n if (this.error) {\r\n return html`\r\n <div class=\"status\" part=\"error\">\r\n ${\r\n hasErrorSlot\r\n ? html`<slot name=\"error\"></slot>`\r\n : html`<span>加载失败</span\r\n ><span class=\"retry-btn\" @click=${this._handleRetry}>重试</span>`\r\n }\r\n </div>\r\n `\r\n }\r\n\r\n if (!this.hasMore) {\r\n return html`\r\n <div class=\"status\" part=\"finished\">\r\n ${hasFinishedSlot ? html`<slot name=\"finished\"></slot>` : html`<span>没有更多数据</span>`}\r\n </div>\r\n `\r\n }\r\n\r\n return nothing\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'mac-infinite-scroll': MacInfiniteScroll\r\n }\r\n}\r\n","import { html, css, nothing } from 'lit'\r\nimport { property, customElement } from 'lit/decorators.js'\r\nimport { BaseElement } from '../../internal/base-element'\r\nimport { sharedStyles } from '../../styles/shared-styles'\r\nimport { themeTokens } from '../../styles/theme'\r\n\r\n/**\r\n * @tag mac-tag\r\n * @summary 用于标签和分类的标记组件。\r\n *\r\n * @slot - 标签的文本内容。\r\n * @slot prefix - 标签前的内容。\r\n * @slot suffix - 标签后的内容。\r\n *\r\n * @csspart base - 标签的基础容器。\r\n * @csspart label - 标签的文本。\r\n * @csspart prefix - 前缀容器。\r\n * @csspart suffix - 后缀容器。\r\n * @csspart close - 关闭按钮。\r\n *\r\n * @event mac-close - 点击关闭按钮时触发。\r\n */\r\n@customElement('mac-tag')\r\nexport class MacTag extends BaseElement {\r\n static override styles = [\r\n themeTokens,\r\n sharedStyles,\r\n css`\r\n :host {\r\n display: inline-block;\r\n }\r\n\r\n .tag {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n gap: var(--md-tag-gap);\r\n padding: var(--md-tag-padding-vertical) var(--md-tag-padding-horizontal);\r\n font-size: var(--md-tag-font-size);\r\n font-family: inherit;\r\n line-height: 1.5;\r\n border-radius: var(--md-tag-radius);\r\n border: 1px solid transparent;\r\n transition: all var(--md-transition-fast);\r\n user-select: none;\r\n white-space: nowrap;\r\n cursor: default;\r\n }\r\n\r\n .tag--round {\r\n border-radius: var(--md-tag-round-radius);\r\n }\r\n\r\n .tag--closable {\r\n padding-right: var(--md-tag-closable-padding-right);\r\n }\r\n\r\n /* 类型 */\r\n .tag--default {\r\n background-color: var(--md-tag-default-bg);\r\n color: var(--md-tag-default-text);\r\n border-color: var(--md-tag-default-border);\r\n }\r\n\r\n .tag--default .close:hover {\r\n background-color: var(--md-tag-default-close-hover-bg);\r\n color: var(--md-tag-default-close-hover-color);\r\n }\r\n\r\n .tag--primary {\r\n background-color: var(--md-tag-primary-bg);\r\n color: var(--md-tag-primary-text);\r\n border-color: var(--md-tag-primary-border);\r\n }\r\n\r\n .tag--primary .close:hover {\r\n background-color: var(--md-tag-primary-close-hover-bg);\r\n color: var(--md-tag-primary-close-hover-color);\r\n }\r\n\r\n .tag--success {\r\n background-color: var(--md-tag-success-bg);\r\n color: var(--md-tag-success-text);\r\n border-color: var(--md-tag-success-border);\r\n }\r\n\r\n .tag--success .close:hover {\r\n background-color: var(--md-tag-success-close-hover-bg);\r\n color: var(--md-tag-success-close-hover-color);\r\n }\r\n\r\n .tag--warning {\r\n background-color: var(--md-tag-warning-bg);\r\n color: var(--md-tag-warning-text);\r\n border-color: var(--md-tag-warning-border);\r\n }\r\n\r\n .tag--warning .close:hover {\r\n background-color: var(--md-tag-warning-close-hover-bg);\r\n color: var(--md-tag-warning-close-hover-color);\r\n }\r\n\r\n .tag--danger {\r\n background-color: var(--md-tag-danger-bg);\r\n color: var(--md-tag-danger-text);\r\n border-color: var(--md-tag-danger-border);\r\n }\r\n\r\n .tag--danger .close:hover {\r\n background-color: var(--md-tag-danger-close-hover-bg);\r\n color: var(--md-tag-danger-close-hover-color);\r\n }\r\n\r\n .tag--info {\r\n background-color: var(--md-tag-info-bg);\r\n color: var(--md-tag-info-text);\r\n border-color: var(--md-tag-info-border);\r\n }\r\n\r\n .tag--info .close:hover {\r\n background-color: var(--md-tag-info-close-hover-bg);\r\n color: var(--md-tag-info-close-hover-color);\r\n }\r\n\r\n /* 无边框 */\r\n .tag--borderless {\r\n border-color: transparent;\r\n }\r\n\r\n /* 尺寸 */\r\n .tag--sm {\r\n padding: var(--sm-tag-padding-vertical) var(--sm-tag-padding-horizontal);\r\n font-size: var(--sm-tag-font-size);\r\n gap: var(--sm-tag-gap);\r\n border-radius: var(--sm-tag-radius);\r\n }\r\n\r\n .tag--sm.tag--round {\r\n border-radius: var(--sm-tag-round-radius);\r\n }\r\n\r\n .tag--sm.tag--closable {\r\n padding-right: var(--sm-tag-closable-padding-right);\r\n }\r\n\r\n .tag--lg {\r\n padding: var(--lg-tag-padding-vertical) var(--lg-tag-padding-horizontal);\r\n font-size: var(--lg-tag-font-size);\r\n gap: var(--lg-tag-gap);\r\n border-radius: var(--lg-tag-radius);\r\n }\r\n\r\n .tag--lg.tag--round {\r\n border-radius: var(--lg-tag-round-radius);\r\n }\r\n\r\n .tag--lg.tag--closable {\r\n padding-right: var(--lg-tag-closable-padding-right);\r\n }\r\n\r\n /* 禁用状态 */\r\n .tag--disabled {\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n pointer-events: none;\r\n }\r\n\r\n /* 关闭按钮 */\r\n .close {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: var(--md-tag-close-size);\r\n height: var(--md-tag-close-size);\r\n margin-left: 2px;\r\n padding: 0;\r\n border: none;\r\n border-radius: 50%;\r\n background: transparent;\r\n cursor: pointer;\r\n font-size: inherit;\r\n line-height: 1;\r\n color: inherit;\r\n opacity: 0.7;\r\n transition: all var(--md-transition-fast);\r\n }\r\n\r\n .close:hover {\r\n opacity: 1;\r\n }\r\n\r\n .close:focus-visible {\r\n outline: 2px solid currentColor;\r\n outline-offset: 1px;\r\n }\r\n\r\n .tag--sm .close {\r\n width: var(--sm-tag-close-size);\r\n height: var(--sm-tag-close-size);\r\n }\r\n\r\n .tag--lg .close {\r\n width: var(--lg-tag-close-size);\r\n height: var(--lg-tag-close-size);\r\n }\r\n `,\r\n ]\r\n\r\n /** 标签的类型样式。 */\r\n @property({ reflect: true }) type:\r\n 'default' | 'primary' | 'success' | 'warning' | 'danger' | 'info' = 'default'\r\n\r\n /** 标签的尺寸。 */\r\n @property({ reflect: true }) size?: 'sm' | 'md' | 'lg'\r\n\r\n /** 标签是否可关闭。 */\r\n @property({ type: Boolean, reflect: true }) closable = false\r\n\r\n /** 标签是否为圆角。 */\r\n @property({ type: Boolean, reflect: true }) round = false\r\n\r\n /** 标签是否有边框。 */\r\n @property({ type: Boolean, reflect: true }) bordered = true\r\n\r\n /** 禁用标签。 */\r\n @property({ type: Boolean, reflect: true }) disabled = false\r\n\r\n override willUpdate() {\r\n const size = this._resolvedSize\r\n if (this.getAttribute('size') !== size) {\r\n this.setAttribute('size', size)\r\n }\r\n const theme = this._resolvedTheme\r\n if (theme) {\r\n this.setAttribute('data-theme', theme)\r\n } else {\r\n this.removeAttribute('data-theme')\r\n }\r\n }\r\n\r\n override render() {\r\n const size = this._resolvedSize\r\n\r\n return html`\r\n <span\r\n part=\"base\"\r\n class=\"tag tag--${this.type} tag--${size} ${this.round ? 'tag--round' : ''} ${\r\n this.closable ? 'tag--closable' : ''\r\n } ${this.disabled ? 'tag--disabled' : ''} ${this.bordered ? '' : 'tag--borderless'}\"\r\n >\r\n <slot name=\"prefix\" part=\"prefix\"></slot>\r\n <slot part=\"label\"></slot>\r\n <slot name=\"suffix\" part=\"suffix\"></slot>\r\n ${\r\n this.closable\r\n ? html`\r\n <button\r\n part=\"close\"\r\n class=\"close\"\r\n type=\"button\"\r\n aria-label=\"Close\"\r\n @click=${this._handleClose}\r\n >\r\n <svg\r\n width=\"1em\"\r\n height=\"1em\"\r\n viewBox=\"0 0 16 16\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M4 4L12 12M12 4L4 12\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.5\"\r\n stroke-linecap=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n `\r\n : nothing\r\n }\r\n </span>\r\n `\r\n }\r\n\r\n private _handleClose(e: Event) {\r\n e.stopPropagation()\r\n this.emit('mac-close')\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'mac-tag': MacTag\r\n }\r\n}\r\n","import { html, css, nothing } from 'lit'\r\nimport { property, customElement, state, query } from 'lit/decorators.js'\r\nimport { BaseElement } from '../../internal/base-element'\r\nimport { sharedStyles } from '../../styles/shared-styles'\r\nimport { themeTokens } from '../../styles/theme'\r\n\r\n/**\r\n * @tag mac-dynamic-tags\r\n * @summary 一个动态标签组件,用于添加和删除标签。\r\n *\r\n * @slot - 自定义标签渲染。通过 data-value 和 data-index 属性接收标签数据。\r\n *\r\n * @csspart container - 标签容器。\r\n * @csspart tag - 每个标签元素。\r\n * @csspart input - 用于添加标签的输入框。\r\n * @csspart add-button - 输入框隐藏时显示的添加按钮。\r\n *\r\n * @event mac-update - 值变化时触发。Detail: { value: string[] }\r\n * @event mac-add - 添加标签时触发。Detail: { value: string, index: number }\r\n * @event mac-remove - 删除标签时触发。Detail: { value: string, index: number }\r\n */\r\n@customElement('mac-dynamic-tags')\r\nexport class MacDynamicTags extends BaseElement {\r\n static override styles = [\r\n themeTokens,\r\n sharedStyles,\r\n css`\r\n :host {\r\n display: block;\r\n }\r\n\r\n .container {\r\n display: flex;\r\n flex-wrap: wrap;\r\n align-items: center;\r\n gap: var(--md-dynamic-tags-gap, var(--md-spacing-sm));\r\n }\r\n\r\n .tag-wrapper {\r\n display: inline-flex;\r\n align-items: center;\r\n }\r\n\r\n /* 用于添加标签的内联输入框 */\r\n .input {\r\n display: inline-block;\r\n border: 1px solid var(--md-color-border);\r\n border-radius: var(--md-radius-md);\r\n background-color: var(--md-color-bg);\r\n padding: var(--md-dynamic-tags-input-padding-vertical, 2px)\r\n var(--md-dynamic-tags-input-padding-horizontal, 8px);\r\n font-size: var(--md-dynamic-tags-input-font-size, var(--md-font-size-sm));\r\n font-family: inherit;\r\n color: var(--md-color-text);\r\n outline: none;\r\n min-width: 60px;\r\n width: auto;\r\n transition: all 200ms cubic-bezier(0.4, 0, 0.2, 1);\r\n }\r\n\r\n .input:focus {\r\n border-color: var(--md-color-primary);\r\n box-shadow:\r\n 0 0 0 3px rgba(0, 122, 255, 0.1),\r\n 0 2px 8px rgba(0, 122, 255, 0.08);\r\n }\r\n\r\n .input::placeholder {\r\n color: var(--md-color-text-secondary);\r\n }\r\n\r\n .input:disabled {\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n background-color: var(--md-color-bg-secondary);\r\n }\r\n\r\n /* 添加按钮 */\r\n .add-button {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n gap: var(--md-tag-gap);\r\n padding: var(--md-tag-padding-vertical) var(--md-tag-padding-horizontal);\r\n font-size: var(--md-tag-font-size);\r\n font-family: inherit;\r\n line-height: 1.5;\r\n border-radius: var(--md-tag-radius);\r\n border: 1px dashed var(--md-color-border);\r\n background-color: transparent;\r\n color: var(--md-color-text-secondary);\r\n cursor: pointer;\r\n transition: all var(--md-transition-fast);\r\n white-space: nowrap;\r\n user-select: none;\r\n }\r\n\r\n .add-button:hover {\r\n border-color: var(--md-color-primary);\r\n color: var(--md-color-primary);\r\n }\r\n\r\n .add-button:disabled {\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n }\r\n\r\n /* 输入框和添加按钮的尺寸覆盖 */\r\n :host([size='sm']) .input {\r\n --md-dynamic-tags-input-padding-vertical: 1px;\r\n --md-dynamic-tags-input-padding-horizontal: 6px;\r\n --md-dynamic-tags-input-font-size: var(--md-font-size-xs);\r\n }\r\n\r\n :host([size='sm']) .add-button {\r\n padding: 1px 6px;\r\n font-size: var(--md-font-size-xs);\r\n gap: 2px;\r\n border-radius: var(--md-radius-sm);\r\n }\r\n\r\n :host([size='lg']) .input {\r\n --md-dynamic-tags-input-padding-vertical: 4px;\r\n --md-dynamic-tags-input-padding-horizontal: 12px;\r\n --md-dynamic-tags-input-font-size: var(--md-font-size-base);\r\n }\r\n\r\n :host([size='lg']) .add-button {\r\n padding: 4px 12px;\r\n font-size: var(--md-font-size-base);\r\n gap: 6px;\r\n border-radius: var(--md-radius-md);\r\n }\r\n\r\n /* 禁用状态 */\r\n .container--disabled {\r\n opacity: 0.6;\r\n pointer-events: none;\r\n }\r\n `,\r\n ]\r\n\r\n /** 标签的值(受控)。 */\r\n @property({ type: Array }) value: string[] = []\r\n\r\n /** 标签的默认值(非受控)。 */\r\n @property({ type: Array, attribute: 'default-value' }) defaultValue: string[] = []\r\n\r\n /** 禁用组件。 */\r\n @property({ type: Boolean, reflect: true }) disabled = false\r\n\r\n /** 标签的最大数量。 */\r\n @property({ type: Number }) max?: number\r\n\r\n /** 标签的尺寸。 */\r\n @property({ reflect: true }) size?: 'sm' | 'md' | 'lg'\r\n\r\n /** 标签的类型。 */\r\n @property({ reflect: true }) type:\r\n 'default' | 'primary' | 'success' | 'warning' | 'danger' | 'info' = 'default'\r\n\r\n /** 标签是否圆角。 */\r\n @property({ type: Boolean, reflect: true }) round = false\r\n\r\n /** 标签是否有边框。 */\r\n @property({ type: Boolean, reflect: true }) bordered = true\r\n\r\n /** 标签是否可关闭。 */\r\n @property({ type: Boolean, reflect: true }) closable = true\r\n\r\n /** 输入框的占位符。 */\r\n @property({ attribute: 'input-placeholder' }) inputPlaceholder = ''\r\n\r\n /** 输入框的最大长度。 */\r\n @property({ type: Number, attribute: 'input-max-length' }) inputMaxLength?: number\r\n\r\n @state() private _inputVisible = false\r\n @state() private _inputValue = ''\r\n @state() private _internalValue: string[] = []\r\n\r\n @query('.input') private _inputRef!: HTMLInputElement\r\n\r\n private get _isControlled(): boolean {\r\n return this.hasAttribute('value')\r\n }\r\n\r\n private get _resolvedValue(): string[] {\r\n return this._isControlled ? this.value : this._internalValue\r\n }\r\n\r\n private get _hasSlot(): boolean {\r\n return (\r\n this.querySelector(':scope > [slot]') !== null ||\r\n this.querySelector(':scope > :not([slot])') !== null\r\n )\r\n }\r\n\r\n override connectedCallback() {\r\n super.connectedCallback()\r\n if (!this._isControlled) {\r\n this._internalValue = [...this.defaultValue]\r\n }\r\n }\r\n\r\n override willUpdate() {\r\n const size = this._resolvedSize\r\n if (this.getAttribute('size') !== size) {\r\n this.setAttribute('size', size)\r\n }\r\n const theme = this._resolvedTheme\r\n if (theme) {\r\n this.setAttribute('data-theme', theme)\r\n } else {\r\n this.removeAttribute('data-theme')\r\n }\r\n }\r\n\r\n override updated(changed: Map<string | number | symbol, unknown>) {\r\n super.updated(changed)\r\n if (this._inputVisible && this._inputRef) {\r\n this._inputRef.focus()\r\n }\r\n }\r\n\r\n override render() {\r\n const tags = this._resolvedValue\r\n const showInput = this._inputVisible\r\n const showAddButton = !showInput && (!this.max || tags.length < this.max)\r\n\r\n return html`\r\n <div part=\"container\" class=\"container ${this.disabled ? 'container--disabled' : ''}\">\r\n ${tags.map(\r\n (tag, index) => html`\r\n <div class=\"tag-wrapper\" part=\"tag\" data-value=\"${tag}\" data-index=\"${index}\">\r\n <mac-tag\r\n size=${this._resolvedSize}\r\n type=${this.type}\r\n ?round=${this.round}\r\n ?bordered=${this.bordered}\r\n ?closable=${this.closable}\r\n ?disabled=${this.disabled}\r\n @mac-close=${() => this._handleRemove(tag, index)}\r\n >\r\n ${tag}\r\n </mac-tag>\r\n </div>\r\n `,\r\n )}\r\n ${\r\n showInput\r\n ? html`\r\n <input\r\n part=\"input\"\r\n class=\"input\"\r\n type=\"text\"\r\n .value=${this._inputValue}\r\n placeholder=${this.inputPlaceholder || '请输入'}\r\n ?disabled=${this.disabled}\r\n maxlength=${this.inputMaxLength || ''}\r\n @input=${this._handleInputChange}\r\n @keydown=${this._handleInputKeydown}\r\n @blur=${this._handleInputBlur}\r\n />\r\n `\r\n : nothing\r\n }\r\n ${\r\n showAddButton\r\n ? html`\r\n <button\r\n part=\"add-button\"\r\n class=\"add-button\"\r\n type=\"button\"\r\n ?disabled=${this.disabled}\r\n @click=${this._showInput}\r\n >\r\n <svg\r\n width=\"1em\"\r\n height=\"1em\"\r\n viewBox=\"0 0 16 16\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M8 2v12M2 8h12\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.5\"\r\n stroke-linecap=\"round\"\r\n />\r\n </svg>\r\n 添加\r\n </button>\r\n `\r\n : nothing\r\n }\r\n </div>\r\n `\r\n }\r\n\r\n private _showInput() {\r\n if (this.disabled) return\r\n this._inputVisible = true\r\n this._inputValue = ''\r\n }\r\n\r\n private _hideInput() {\r\n this._inputVisible = false\r\n this._inputValue = ''\r\n }\r\n\r\n private _handleInputChange(e: Event) {\r\n const target = e.target as HTMLInputElement\r\n this._inputValue = target.value\r\n }\r\n\r\n private _handleInputKeydown(e: KeyboardEvent) {\r\n if (e.key === 'Enter') {\r\n e.preventDefault()\r\n this._addTag()\r\n } else if (e.key === 'Escape') {\r\n this._hideInput()\r\n }\r\n }\r\n\r\n private _handleInputBlur() {\r\n // 延迟以允许其他元素上的点击事件处理\r\n setTimeout(() => {\r\n if (this._inputValue.trim()) {\r\n this._addTag()\r\n } else {\r\n this._hideInput()\r\n }\r\n }, 150)\r\n }\r\n\r\n private _addTag() {\r\n const raw = this._inputValue.trim()\r\n if (!raw) {\r\n this._hideInput()\r\n return\r\n }\r\n // 防止重复\r\n if (this._resolvedValue.includes(raw)) {\r\n this._hideInput()\r\n return\r\n }\r\n if (this.max && this._resolvedValue.length >= this.max) {\r\n this._hideInput()\r\n return\r\n }\r\n\r\n const newValue = [...this._resolvedValue, raw]\r\n const index = newValue.length - 1\r\n\r\n if (!this._isControlled) {\r\n this._internalValue = newValue\r\n }\r\n\r\n this.emit('mac-add', { detail: { value: raw, index } })\r\n this.emit('mac-update', { detail: { value: newValue } })\r\n this._hideInput()\r\n }\r\n\r\n private _handleRemove(tag: string, index: number) {\r\n if (this.disabled) return\r\n const newValue = this._resolvedValue.filter((_, i) => i !== index)\r\n\r\n if (!this._isControlled) {\r\n this._internalValue = newValue\r\n }\r\n\r\n this.emit('mac-remove', { detail: { value: tag, index } })\r\n this.emit('mac-update', { detail: { value: newValue } })\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'mac-dynamic-tags': MacDynamicTags\r\n }\r\n}\r\n","import { html, css, nothing, svg } from 'lit'\r\nimport { property, customElement, state, query } from 'lit/decorators.js'\r\nimport { BaseElement } from '../../internal/base-element'\r\nimport { sharedStyles } from '../../styles/shared-styles'\r\nimport { themeTokens } from '../../styles/theme'\r\nimport { booleanAttribute } from '../../internal/property-converters'\r\n\r\n/**\r\n * @tag mac-carousel-item\r\n * @summary mac-carousel 的幻灯片项。\r\n *\r\n * @slot - 幻灯片内容。\r\n */\r\n@customElement('mac-carousel-item')\r\nexport class MacCarouselItem extends BaseElement {\r\n static override styles = [\r\n css`\r\n :host {\r\n display: block;\r\n flex-shrink: 0;\r\n width: 100%;\r\n height: 100%;\r\n }\r\n `,\r\n ]\r\n\r\n override render() {\r\n return html`<slot></slot>`\r\n }\r\n}\r\n\r\n/**\r\n * @tag mac-carousel\r\n * @summary 用于循环展示内容的轮播组件。\r\n *\r\n * @slot - 用于放置 mac-carousel-item 元素的默认插槽。\r\n *\r\n * @csspart base - 轮播的基础容器。\r\n * @csspart track - 滑动轨道容器。\r\n * @csspart arrow - 导航箭头。\r\n * @csspart dots - 指示器圆点容器。\r\n * @csspart dot - 单个指示器圆点。\r\n *\r\n * @event mac-carousel-change - 当前幻灯片变化时触发。`detail: { index: number, fromIndex: number }`\r\n */\r\n@customElement('mac-carousel')\r\nexport class MacCarousel extends BaseElement {\r\n static override styles = [\r\n themeTokens,\r\n sharedStyles,\r\n css`\r\n :host {\r\n display: block;\r\n position: relative;\r\n overflow: hidden;\r\n --mac-carousel-slides-per-view: 1;\r\n }\r\n\r\n .carousel {\r\n position: relative;\r\n width: 100%;\r\n height: 100%;\r\n overflow: hidden;\r\n }\r\n\r\n /* ─── 滑动效果 ─── */\r\n .track--slide {\r\n display: flex;\r\n width: 100%;\r\n height: 100%;\r\n will-change: transform;\r\n }\r\n\r\n :host([direction='vertical']) .track--slide {\r\n flex-direction: column;\r\n }\r\n\r\n .track--slide ::slotted(mac-carousel-item) {\r\n flex-shrink: 0;\r\n width: calc(100% / var(--mac-carousel-slides-per-view));\r\n height: 100%;\r\n }\r\n\r\n :host([direction='vertical']) .track--slide ::slotted(mac-carousel-item) {\r\n width: 100%;\r\n height: calc(100% / var(--mac-carousel-slides-per-view));\r\n }\r\n\r\n /* ─── 淡入淡出效果 ─── */\r\n .track--fade {\r\n position: relative;\r\n width: 100%;\r\n height: 100%;\r\n }\r\n\r\n .track--fade ::slotted(mac-carousel-item) {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n width: calc(100% / var(--mac-carousel-slides-per-view));\r\n height: 100%;\r\n opacity: 0;\r\n transition: opacity var(--md-transition-normal);\r\n z-index: 0;\r\n }\r\n\r\n :host([direction='vertical']) .track--fade ::slotted(mac-carousel-item) {\r\n width: 100%;\r\n height: calc(100% / var(--mac-carousel-slides-per-view));\r\n }\r\n\r\n .track--fade ::slotted(mac-carousel-item.active) {\r\n opacity: 1;\r\n z-index: 1;\r\n }\r\n\r\n /* ─── 自定义效果 ─── */\r\n .track--custom {\r\n display: flex;\r\n width: 100%;\r\n height: 100%;\r\n }\r\n\r\n :host([direction='vertical']) .track--custom {\r\n flex-direction: column;\r\n }\r\n\r\n .track--custom ::slotted(mac-carousel-item) {\r\n flex-shrink: 0;\r\n width: calc(100% / var(--mac-carousel-slides-per-view));\r\n height: 100%;\r\n }\r\n\r\n :host([direction='vertical']) .track--custom ::slotted(mac-carousel-item) {\r\n width: 100%;\r\n height: calc(100% / var(--mac-carousel-slides-per-view));\r\n }\r\n\r\n /* ─── 箭头 ─── */\r\n .arrow {\r\n position: absolute;\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: var(--md-carousel-arrow-size);\r\n height: var(--md-carousel-arrow-size);\r\n border-radius: 50%;\r\n background: var(--md-carousel-arrow-bg);\r\n color: var(--md-carousel-arrow-color);\r\n border: none;\r\n cursor: pointer;\r\n opacity: 0.7;\r\n transition:\r\n opacity var(--md-transition-fast),\r\n background var(--md-transition-fast);\r\n z-index: 10;\r\n backdrop-filter: blur(8px);\r\n -webkit-backdrop-filter: blur(8px);\r\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.12);\r\n pointer-events: auto;\r\n }\r\n\r\n .arrow:hover {\r\n opacity: 1;\r\n background: var(--md-carousel-arrow-hover-bg);\r\n }\r\n\r\n .arrow:focus-visible {\r\n outline: 2px solid var(--md-color-primary);\r\n outline-offset: 2px;\r\n }\r\n\r\n .arrow svg {\r\n width: 18px;\r\n height: 18px;\r\n }\r\n\r\n /* 水平箭头 */\r\n :host([direction='horizontal']) .arrow--prev {\r\n top: 50%;\r\n left: var(--md-carousel-arrow-offset);\r\n transform: translateY(-50%);\r\n }\r\n\r\n :host([direction='horizontal']) .arrow--next {\r\n top: 50%;\r\n right: var(--md-carousel-arrow-offset);\r\n transform: translateY(-50%);\r\n }\r\n\r\n /* 垂直箭头 */\r\n :host([direction='vertical']) .arrow--prev {\r\n top: var(--md-carousel-arrow-offset);\r\n left: 50%;\r\n transform: translateX(-50%);\r\n }\r\n\r\n :host([direction='vertical']) .arrow--next {\r\n bottom: var(--md-carousel-arrow-offset);\r\n left: 50%;\r\n transform: translateX(-50%);\r\n }\r\n\r\n /* ─── 圆点 ─── */\r\n .dots {\r\n position: absolute;\r\n display: flex;\r\n align-items: center;\r\n gap: var(--md-carousel-dot-gap);\r\n z-index: 10;\r\n }\r\n\r\n .dot {\r\n cursor: pointer;\r\n transition: all var(--md-transition-fast);\r\n border: none;\r\n background: var(--md-carousel-dot-bg);\r\n padding: 0;\r\n }\r\n\r\n .dot:hover {\r\n background: var(--md-carousel-dot-hover-bg);\r\n }\r\n\r\n .dot--active {\r\n background: var(--md-carousel-dot-active-bg);\r\n }\r\n\r\n /* 圆点类型:圆点 */\r\n .dot--dot {\r\n width: var(--md-carousel-dot-size);\r\n height: var(--md-carousel-dot-size);\r\n border-radius: 50%;\r\n }\r\n\r\n .dot--dot.dot--active {\r\n width: var(--md-carousel-dot-active-width);\r\n border-radius: var(--md-carousel-dot-active-radius);\r\n }\r\n\r\n /* 圆点类型:线条 */\r\n .dot--line {\r\n width: var(--md-carousel-line-width);\r\n height: var(--md-carousel-line-height);\r\n border-radius: var(--md-carousel-line-radius);\r\n }\r\n\r\n .dot--line.dot--active {\r\n width: var(--md-carousel-line-active-width);\r\n }\r\n\r\n /* 水平方向的圆点位置 */\r\n :host([direction='horizontal'][dot-position='top']) .dots {\r\n top: var(--md-carousel-dots-offset);\r\n left: 50%;\r\n transform: translateX(-50%);\r\n }\r\n\r\n :host([direction='horizontal'][dot-position='bottom']) .dots {\r\n bottom: var(--md-carousel-dots-offset);\r\n left: 50%;\r\n transform: translateX(-50%);\r\n }\r\n\r\n :host([direction='horizontal'][dot-position='left']) .dots {\r\n left: var(--md-carousel-dots-offset);\r\n top: 50%;\r\n transform: translateY(-50%);\r\n flex-direction: column;\r\n }\r\n\r\n :host([direction='horizontal'][dot-position='right']) .dots {\r\n right: var(--md-carousel-dots-offset);\r\n top: 50%;\r\n transform: translateY(-50%);\r\n flex-direction: column;\r\n }\r\n\r\n /* 垂直方向的圆点位置 */\r\n :host([direction='vertical'][dot-position='top']) .dots {\r\n top: var(--md-carousel-dots-offset);\r\n left: 50%;\r\n transform: translateX(-50%);\r\n }\r\n\r\n :host([direction='vertical'][dot-position='bottom']) .dots {\r\n bottom: var(--md-carousel-dots-offset);\r\n left: 50%;\r\n transform: translateX(-50%);\r\n }\r\n\r\n :host([direction='vertical'][dot-position='left']) .dots {\r\n left: var(--md-carousel-dots-offset);\r\n top: 50%;\r\n transform: translateY(-50%);\r\n flex-direction: column;\r\n }\r\n\r\n :host([direction='vertical'][dot-position='right']) .dots {\r\n right: var(--md-carousel-dots-offset);\r\n top: 50%;\r\n transform: translateY(-50%);\r\n flex-direction: column;\r\n }\r\n `,\r\n ]\r\n\r\n /** 当前激活的幻灯片索引(受控模式)。 */\r\n @property({ type: Number, attribute: 'current-index' }) currentIndex = 0\r\n\r\n /** 默认激活的幻灯片索引(非受控模式)。 */\r\n @property({ type: Number, attribute: 'default-index' }) defaultIndex = 0\r\n\r\n /** 是否自动播放。 */\r\n @property({ type: Boolean }) autoplay = false\r\n\r\n /** 自动播放间隔,单位为毫秒。 */\r\n @property({ type: Number }) interval = 5000\r\n\r\n /** 是否循环播放。 */\r\n @property({ converter: booleanAttribute }) loop = true\r\n\r\n /** 滑动方向。 */\r\n @property({ reflect: true }) direction: 'horizontal' | 'vertical' = 'horizontal'\r\n\r\n /** 过渡效果。 */\r\n @property({ reflect: true }) effect: 'slide' | 'fade' | 'custom' = 'slide'\r\n\r\n /** 每次显示的幻灯片数量。 */\r\n @property({ type: Number, attribute: 'slides-per-view', reflect: true }) slidesPerView = 1\r\n\r\n /** 是否显示导航箭头。 */\r\n @property({ converter: booleanAttribute, attribute: 'show-arrow' }) showArrow = true\r\n\r\n /** 是否显示指示器圆点。 */\r\n @property({ converter: booleanAttribute, attribute: 'show-dots' }) showDots = true\r\n\r\n /** 指示器圆点样式。 */\r\n @property({ attribute: 'dot-type' }) dotType: 'dot' | 'line' = 'dot'\r\n\r\n /** 指示器圆点的位置。 */\r\n @property({ attribute: 'dot-position', reflect: true }) dotPosition:\r\n 'top' | 'bottom' | 'left' | 'right' = 'bottom'\r\n\r\n /** 轮播是否可拖拽。 */\r\n @property({ type: Boolean }) draggable = false\r\n\r\n /** 是否支持键盘导航。 */\r\n @property({ type: Boolean }) keyboard = false\r\n\r\n /** 是否支持鼠标滚轮导航。 */\r\n @property({ type: Boolean }) wheel = false\r\n\r\n /** 幻灯片过渡时长,单位为毫秒。 */\r\n @property({ type: Number, attribute: 'transition-duration' }) transitionDuration = 300\r\n\r\n @state() private _activeIndex = 0\r\n @state() private _slideCount = 0\r\n @state() private _isDragging = false\r\n @state() private _dragOffset = 0\r\n\r\n @query('.track') private _track!: HTMLElement\r\n\r\n private _autoplayTimer: ReturnType<typeof setInterval> | null = null\r\n private _dragStartPos = 0\r\n private _dragStartIndex = 0\r\n private _isWheeling = false\r\n\r\n private get _isControlled(): boolean {\r\n return this.hasAttribute('current-index')\r\n }\r\n\r\n get _resolvedIndex(): number {\r\n return this._isControlled ? this.currentIndex : this._activeIndex\r\n }\r\n\r\n override connectedCallback() {\r\n super.connectedCallback()\r\n // 将默认值同步到 DOM,以便 CSS :host([attr]) 选择器匹配\r\n if (!this.hasAttribute('direction')) {\r\n this.setAttribute('direction', 'horizontal')\r\n }\r\n if (!this.hasAttribute('dot-position')) {\r\n this.setAttribute('dot-position', 'bottom')\r\n }\r\n this._updateSlideCount()\r\n this._initActiveIndex()\r\n this._startAutoplay()\r\n if (this.keyboard) {\r\n this.addEventListener('keydown', this._handleKeydown)\r\n this.setAttribute('tabindex', '0')\r\n }\r\n if (this.wheel) {\r\n this.addEventListener('wheel', this._handleWheel, { passive: false })\r\n }\r\n }\r\n\r\n override disconnectedCallback() {\r\n super.disconnectedCallback()\r\n this._stopAutoplay()\r\n if (this.keyboard) {\r\n this.removeEventListener('keydown', this._handleKeydown)\r\n }\r\n if (this.wheel) {\r\n this.removeEventListener('wheel', this._handleWheel)\r\n }\r\n }\r\n\r\n override willUpdate(changed: Map<string, unknown>) {\r\n if (changed.has('currentIndex')) {\r\n this._activeIndex = this.currentIndex\r\n }\r\n if (changed.has('slidesPerView') && this.slidesPerView > 0) {\r\n this.style.setProperty('--mac-carousel-slides-per-view', String(this.slidesPerView))\r\n }\r\n const theme = this._resolvedTheme\r\n if (theme) {\r\n this.setAttribute('data-theme', theme)\r\n } else {\r\n this.removeAttribute('data-theme')\r\n }\r\n }\r\n\r\n override updated(changed: Map<string, unknown>) {\r\n if (changed.has('autoplay')) {\r\n this.autoplay ? this._startAutoplay() : this._stopAutoplay()\r\n }\r\n if (changed.has('interval')) {\r\n this._stopAutoplay()\r\n this._startAutoplay()\r\n }\r\n if (changed.has('slidesPerView')) {\r\n this._applyTransform()\r\n }\r\n if (changed.has('effect')) {\r\n this._syncFadeActiveClass()\r\n }\r\n if (changed.has('wheel')) {\r\n if (this.wheel) {\r\n this.addEventListener('wheel', this._handleWheel, { passive: false })\r\n } else {\r\n this.removeEventListener('wheel', this._handleWheel)\r\n }\r\n }\r\n if (changed.has('keyboard')) {\r\n if (this.keyboard) {\r\n this.addEventListener('keydown', this._handleKeydown)\r\n this.setAttribute('tabindex', '0')\r\n } else {\r\n this.removeEventListener('keydown', this._handleKeydown)\r\n this.removeAttribute('tabindex')\r\n }\r\n }\r\n this._applyTransform()\r\n }\r\n\r\n private _getItems(): Element[] {\r\n return Array.from(this.querySelectorAll(':scope > mac-carousel-item'))\r\n }\r\n\r\n private _updateSlideCount() {\r\n this._slideCount = this._getItems().length\r\n }\r\n\r\n private _initActiveIndex() {\r\n if (this._isControlled) {\r\n this._activeIndex = this.currentIndex\r\n } else if (this.defaultIndex > 0) {\r\n this._activeIndex = Math.min(this.defaultIndex, Math.max(0, this._slideCount - 1))\r\n }\r\n }\r\n\r\n private _handleSlotChange() {\r\n this._updateSlideCount()\r\n this._syncFadeActiveClass()\r\n if (this.autoplay && this._slideCount > 1) {\r\n this._startAutoplay()\r\n }\r\n this.requestUpdate()\r\n }\r\n\r\n private _applyTransform() {\r\n if (!this._track) return\r\n if (this.effect === 'fade' || this.effect === 'custom') {\r\n this._track.style.transform = ''\r\n this._track.style.transition = ''\r\n return\r\n }\r\n const index = this._resolvedIndex\r\n const offset = this._isDragging ? this._dragOffset : 0\r\n const step = 100 / this.slidesPerView\r\n\r\n if (this.direction === 'horizontal') {\r\n const translateX = -(index * step) + offset\r\n this._track.style.transform = `translateX(${translateX}%)`\r\n } else {\r\n const translateY = -(index * step) + offset\r\n this._track.style.transform = `translateY(${translateY}%)`\r\n }\r\n\r\n if (this._isDragging) {\r\n this._track.style.transition = 'none'\r\n } else {\r\n this._track.style.transition = `transform ${this.transitionDuration}ms ease`\r\n }\r\n }\r\n\r\n private _syncFadeActiveClass() {\r\n const items = this._getItems()\r\n if (this.effect !== 'fade') {\r\n items.forEach((item) => item.classList.remove('active'))\r\n return\r\n }\r\n const activeIndex = this._resolvedIndex\r\n items.forEach((item, i) => {\r\n if (i === activeIndex) {\r\n item.classList.add('active')\r\n } else {\r\n item.classList.remove('active')\r\n }\r\n })\r\n }\r\n\r\n private _goTo(index: number, _fromUser = false) {\r\n const count = this._slideCount\r\n if (count <= 0) return\r\n\r\n let target = index\r\n if (this.loop) {\r\n if (target < 0) target = count - 1\r\n if (target >= count) target = 0\r\n } else {\r\n target = Math.max(0, Math.min(count - 1, target))\r\n }\r\n\r\n const fromIndex = this._resolvedIndex\r\n // At either end in non-looping mode, navigation is a no-op.\r\n if (target === fromIndex) return\r\n\r\n if (!this._isControlled) {\r\n this._activeIndex = target\r\n }\r\n\r\n this.emit('mac-carousel-change', {\r\n detail: { index: target, fromIndex },\r\n })\r\n\r\n this._syncFadeActiveClass()\r\n this.requestUpdate()\r\n }\r\n\r\n private _prev() {\r\n this._goTo(this._resolvedIndex - 1, true)\r\n }\r\n\r\n private _next() {\r\n this._goTo(this._resolvedIndex + 1, true)\r\n }\r\n\r\n private _startAutoplay() {\r\n if (!this.autoplay || this._slideCount <= 1) return\r\n this._stopAutoplay()\r\n this._autoplayTimer = setInterval(() => {\r\n this._next()\r\n }, this.interval)\r\n }\r\n\r\n private _stopAutoplay() {\r\n if (this._autoplayTimer) {\r\n clearInterval(this._autoplayTimer)\r\n this._autoplayTimer = null\r\n }\r\n }\r\n\r\n private _handleMouseEnter() {\r\n if (this.autoplay) this._stopAutoplay()\r\n }\r\n\r\n private _handleMouseLeave() {\r\n if (this.autoplay && !this._isDragging) {\r\n this._startAutoplay()\r\n }\r\n if (this._isDragging) {\r\n this._endDrag()\r\n }\r\n }\r\n\r\n /* ─── 拖拽 ─── */\r\n\r\n private _startDrag(clientPos: number) {\r\n if (!this.draggable || this._slideCount <= 1 || this.effect === 'fade') return\r\n this._isDragging = true\r\n this._dragStartPos = clientPos\r\n this._dragStartIndex = this._resolvedIndex\r\n this._dragOffset = 0\r\n this._stopAutoplay()\r\n this._applyTransform()\r\n }\r\n\r\n private _moveDrag(clientPos: number) {\r\n if (!this._isDragging) return\r\n const rect = this.getBoundingClientRect()\r\n const size = this.direction === 'horizontal' ? rect.width : rect.height\r\n if (size === 0) return\r\n const delta = clientPos - this._dragStartPos\r\n this._dragOffset = (delta / size) * 100\r\n this._applyTransform()\r\n }\r\n\r\n private _endDrag() {\r\n if (!this._isDragging) return\r\n this._isDragging = false\r\n\r\n const threshold = 20\r\n if (this._dragOffset > threshold) {\r\n this._goTo(this._dragStartIndex - 1, true)\r\n } else if (this._dragOffset < -threshold) {\r\n this._goTo(this._dragStartIndex + 1, true)\r\n } else {\r\n this._goTo(this._dragStartIndex, true)\r\n }\r\n this._dragOffset = 0\r\n this._applyTransform()\r\n\r\n if (this.autoplay) this._startAutoplay()\r\n }\r\n\r\n private _onPointerDown = (e: PointerEvent) => {\r\n if (!this.draggable) return\r\n ;(e.target as HTMLElement).setPointerCapture?.(e.pointerId)\r\n this._startDrag(this.direction === 'horizontal' ? e.clientX : e.clientY)\r\n }\r\n\r\n private _onPointerMove = (e: PointerEvent) => {\r\n this._moveDrag(this.direction === 'horizontal' ? e.clientX : e.clientY)\r\n }\r\n\r\n private _onPointerUp = () => {\r\n this._endDrag()\r\n }\r\n\r\n /* ─── 键盘 ─── */\r\n\r\n private _handleKeydown = (e: KeyboardEvent) => {\r\n const isHorizontal = this.direction === 'horizontal'\r\n if ((isHorizontal && e.key === 'ArrowLeft') || (!isHorizontal && e.key === 'ArrowUp')) {\r\n e.preventDefault()\r\n this._prev()\r\n } else if (\r\n (isHorizontal && e.key === 'ArrowRight') ||\r\n (!isHorizontal && e.key === 'ArrowDown')\r\n ) {\r\n e.preventDefault()\r\n this._next()\r\n }\r\n }\r\n\r\n /* ─── 滚轮 ─── */\r\n\r\n private _handleWheel = (e: WheelEvent) => {\r\n if (!this.wheel || this._isWheeling) return\r\n e.preventDefault()\r\n\r\n const isHorizontal = this.direction === 'horizontal'\r\n const delta = isHorizontal ? e.deltaX : e.deltaY\r\n if (Math.abs(delta) < 20) return\r\n\r\n this._isWheeling = true\r\n if (delta > 0) {\r\n this._next()\r\n } else {\r\n this._prev()\r\n }\r\n\r\n setTimeout(() => {\r\n this._isWheeling = false\r\n }, this.transitionDuration + 100)\r\n }\r\n\r\n /* ─── 渲染 ─── */\r\n\r\n private _renderArrow(direction: 'prev' | 'next') {\r\n const isPrev = direction === 'prev'\r\n const isVertical = this.direction === 'vertical'\r\n\r\n return html`\r\n <button\r\n part=\"arrow\"\r\n class=\"arrow arrow--${direction}\"\r\n type=\"button\"\r\n aria-label=${isPrev ? '上一张幻灯片' : '下一张幻灯片'}\r\n @click=${() => (isPrev ? this._prev() : this._next())}\r\n >\r\n <svg\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n ${\r\n isVertical\r\n ? isPrev\r\n ? svg`<path d=\"M12 19V5M5 12l7-7 7 7\" />`\r\n : svg`<path d=\"M12 5v14M5 12l7 7 7-7\" />`\r\n : isPrev\r\n ? svg`<path d=\"M15 18l-6-6 6-6\" />`\r\n : svg`<path d=\"M9 18l6-6-6-6\" />`\r\n }\r\n </svg>\r\n </button>\r\n `\r\n }\r\n\r\n private _renderDots() {\r\n if (!this.showDots || this._slideCount <= 1) return nothing\r\n\r\n return html`\r\n <div part=\"dots\" class=\"dots\">\r\n ${Array.from(\r\n { length: this._slideCount },\r\n (_, i) => html`\r\n <button\r\n part=\"dot\"\r\n class=\"dot dot--${this.dotType} ${i === this._resolvedIndex ? 'dot--active' : ''}\"\r\n type=\"button\"\r\n aria-label=\"跳转到第 ${i + 1} 张幻灯片\"\r\n aria-current=${i === this._resolvedIndex ? 'true' : 'false'}\r\n @click=${() => this._goTo(i, true)}\r\n ></button>\r\n `,\r\n )}\r\n </div>\r\n `\r\n }\r\n\r\n override render() {\r\n const trackClass = `track track--${this.effect}`\r\n\r\n return html`\r\n <div\r\n part=\"base\"\r\n class=\"carousel\"\r\n @mouseenter=${this._handleMouseEnter}\r\n @mouseleave=${this._handleMouseLeave}\r\n @pointerdown=${this.draggable ? this._onPointerDown : nothing}\r\n @pointermove=${this.draggable ? this._onPointerMove : nothing}\r\n @pointerup=${this.draggable ? this._onPointerUp : nothing}\r\n >\r\n <div part=\"track\" class=\"${trackClass}\">\r\n <slot @slotchange=${this._handleSlotChange}></slot>\r\n </div>\r\n ${this.showArrow && this._slideCount > 1 ? this._renderArrow('prev') : nothing}\r\n ${this.showArrow && this._slideCount > 1 ? this._renderArrow('next') : nothing}\r\n ${this._renderDots()}\r\n </div>\r\n `\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'mac-carousel': MacCarousel\r\n 'mac-carousel-item': MacCarouselItem\r\n }\r\n}\r\n","import { html, css, nothing, svg } from 'lit'\r\nimport { property, customElement } from 'lit/decorators.js'\r\nimport { BaseElement } from '../../internal/base-element'\r\nimport { sharedStyles } from '../../styles/shared-styles'\r\nimport { themeTokens } from '../../styles/theme'\r\n\r\nexport interface CircleConfig {\r\n percentage: number\r\n color?: string\r\n strokeWidth?: number\r\n}\r\n\r\nexport interface GradientStop {\r\n color: string\r\n offset?: number\r\n}\r\n\r\nexport interface GradientConfig {\r\n from?: string\r\n to?: string\r\n angle?: number\r\n stops?: GradientStop[]\r\n}\r\n\r\n/**\r\n * @tag mac-progress\r\n * @summary 进度组件,用于显示完成状态。\r\n *\r\n * @csspart track - 进度轨道容器。\r\n * @csspart fill - 进度填充指示器。\r\n * @csspart text - 进度文本标签。\r\n *\r\n * @cssproperty --mac-progress-track-bg - 轨道背景颜色。\r\n * @cssproperty --mac-progress-fill-color - 填充指示器颜色。\r\n */\r\n@customElement('mac-progress')\r\nexport class MacProgress extends BaseElement {\r\n static override styles = [\r\n themeTokens,\r\n sharedStyles,\r\n css`\r\n :host {\r\n display: block;\r\n font-family: var(--md-font-family);\r\n }\r\n\r\n /* ═══════════════════════════════════════════════════\r\n 线性进度条\r\n ═══════════════════════════════════════════════════ */\r\n .progress-line {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--md-progress-text-gap);\r\n width: 100%;\r\n }\r\n\r\n .progress-line--sm {\r\n --_progress-height: var(--sm-progress-height);\r\n --_progress-font-size: var(--sm-progress-font-size);\r\n }\r\n\r\n .progress-line--md {\r\n --_progress-height: var(--md-progress-height);\r\n --_progress-font-size: var(--md-progress-font-size);\r\n }\r\n\r\n .progress-line--lg {\r\n --_progress-height: var(--lg-progress-height);\r\n --_progress-font-size: var(--lg-progress-font-size);\r\n }\r\n\r\n .progress-line__track {\r\n flex: 1;\r\n height: var(--_progress-height);\r\n background-color: var(--md-progress-track-bg);\r\n border-radius: var(--md-progress-radius);\r\n overflow: hidden;\r\n }\r\n\r\n .progress-line__fill {\r\n height: 100%;\r\n border-radius: var(--md-progress-radius);\r\n background-color: var(--md-progress-fill-default);\r\n transition: width var(--md-transition-normal);\r\n }\r\n\r\n .progress-line__fill--success {\r\n background-color: var(--md-progress-fill-success);\r\n }\r\n\r\n .progress-line__fill--warning {\r\n background-color: var(--md-progress-fill-warning);\r\n }\r\n\r\n .progress-line__fill--error {\r\n background-color: var(--md-progress-fill-error);\r\n }\r\n\r\n .progress-line__text {\r\n font-size: var(--_progress-font-size);\r\n color: var(--md-progress-text-color);\r\n min-width: var(--md-progress-text-min-width);\r\n text-align: right;\r\n white-space: nowrap;\r\n }\r\n\r\n /* 线性进度条的处理动画 */\r\n .progress-line__fill--processing {\r\n background-image: linear-gradient(\r\n 90deg,\r\n rgba(255, 255, 255, 0.15) 25%,\r\n transparent 25%,\r\n transparent 50%,\r\n rgba(255, 255, 255, 0.15) 50%,\r\n rgba(255, 255, 255, 0.15) 75%,\r\n transparent 75%,\r\n transparent\r\n );\r\n background-size: 24px 24px;\r\n animation: progress-line-stripes 1s linear infinite;\r\n }\r\n\r\n @keyframes progress-line-stripes {\r\n 0% {\r\n background-position: 0 0;\r\n }\r\n 100% {\r\n background-position: 24px 0;\r\n }\r\n }\r\n\r\n /* ═══════════════════════════════════════════════════\r\n 环形进度条\r\n ═══════════════════════════════════════════════════ */\r\n .progress-circle {\r\n position: relative;\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n }\r\n\r\n .progress-circle__svg {\r\n transform: rotate(-90deg);\r\n }\r\n\r\n .progress-circle__track {\r\n fill: none;\r\n stroke: var(--md-progress-track-bg);\r\n }\r\n\r\n .progress-circle__fill {\r\n fill: none;\r\n stroke: var(--md-progress-fill-default);\r\n transition: stroke-dashoffset var(--md-transition-normal);\r\n stroke-linecap: round;\r\n }\r\n\r\n .progress-circle__fill--success {\r\n stroke: var(--md-progress-fill-success);\r\n }\r\n\r\n .progress-circle__fill--warning {\r\n stroke: var(--md-progress-fill-warning);\r\n }\r\n\r\n .progress-circle__fill--error {\r\n stroke: var(--md-progress-fill-error);\r\n }\r\n\r\n .progress-circle__text {\r\n position: absolute;\r\n font-size: var(--md-progress-circle-text-size);\r\n color: var(--md-progress-text-color);\r\n font-weight: var(--md-progress-circle-text-weight);\r\n }\r\n\r\n /* 环形进度条的处理动画 */\r\n .progress-circle__fill--processing {\r\n animation: progress-circle-spin 2s linear infinite;\r\n transform-origin: center;\r\n }\r\n\r\n @keyframes progress-circle-spin {\r\n 0% {\r\n transform: rotate(0deg);\r\n }\r\n 100% {\r\n transform: rotate(360deg);\r\n }\r\n }\r\n `,\r\n ]\r\n\r\n /** 当前进度百分比(0-100)。 */\r\n @property({ type: Number }) percentage = 0\r\n\r\n /** 进度指示器类型。 */\r\n @property({ reflect: true }) type: 'line' | 'circle' = 'line'\r\n\r\n /** 进度状态。 */\r\n @property({ reflect: true }) status: 'default' | 'success' | 'warning' | 'error' = 'default'\r\n\r\n /** 进度组件尺寸。 */\r\n @property({ reflect: true }) size: 'sm' | 'md' | 'lg' = 'md'\r\n\r\n /** 是否显示百分比文本。 */\r\n @property({ type: Boolean, reflect: true }) showText = true\r\n\r\n /** 进度是否处于处理状态(显示动画)。 */\r\n @property({ type: Boolean, reflect: true }) processing = false\r\n\r\n /** 进度填充的自定义颜色。覆盖状态颜色。 */\r\n @property() color?: string\r\n\r\n /** 环形进度条的描边宽度(像素)。 */\r\n @property({ type: Number }) strokeWidth = 6\r\n\r\n /** 环形进度条的宽度/高度(像素)。 */\r\n @property({ type: Number }) width = 120\r\n\r\n /**\r\n * 多环配置的嵌套环形显示。\r\n * 每项定义一个环,包含百分比、可选颜色和可选描边宽度。\r\n * 设置时渲染多个同心环,而非单个圆环。\r\n */\r\n @property({ type: Array }) circles?: CircleConfig[]\r\n\r\n /**\r\n * 进度填充的渐变配置。\r\n * 设置时,为填充应用线性渐变。\r\n * 环形类型使用 SVG linearGradient。\r\n * 线性类型使用 CSS linear-gradient。\r\n */\r\n @property({ type: Object }) gradient?: GradientConfig\r\n\r\n private get _normalizedPercentage(): number {\r\n return Math.max(0, Math.min(100, this.percentage))\r\n }\r\n\r\n private get _progressSize(): 'sm' | 'md' | 'lg' {\r\n return this.size ?? 'md'\r\n }\r\n\r\n private get _fillColor(): string {\r\n if (this.color) return this.color\r\n return ''\r\n }\r\n\r\n private _hasGradient(): boolean {\r\n if (!this.gradient) return false\r\n if (this.gradient.stops && this.gradient.stops.length >= 2) return true\r\n return !!this.gradient.from && !!this.gradient.to\r\n }\r\n\r\n private _getGradientId(index = 0): string {\r\n return `mac-progress-gradient-${index}`\r\n }\r\n\r\n private _renderGradientDefs(circleIndex = 0) {\r\n if (!this._hasGradient()) return nothing\r\n const grad = this.gradient!\r\n const angle = (grad.angle ?? 0) * (Math.PI / 180)\r\n const x1 = 50 - 50 * Math.cos(angle)\r\n const y1 = 50 - 50 * Math.sin(angle)\r\n const x2 = 50 + 50 * Math.cos(angle)\r\n const y2 = 50 + 50 * Math.sin(angle)\r\n const id = this._getGradientId(circleIndex)\r\n\r\n const stops =\r\n grad.stops && grad.stops.length >= 2\r\n ? grad.stops\r\n : [\r\n { color: grad.from!, offset: 0 },\r\n { color: grad.to!, offset: 100 },\r\n ]\r\n\r\n return svg`\r\n <linearGradient id=\"${id}\" x1=\"${x1}%\" y1=\"${y1}%\" x2=\"${x2}%\" y2=\"${y2}%\">\r\n ${stops.map((s) => svg`<stop offset=\"${s.offset ?? 0}%\" stop-color=\"${s.color}\" />`)}\r\n </linearGradient>\r\n `\r\n }\r\n\r\n private _renderLine() {\r\n const size = this._progressSize\r\n const pct = this._normalizedPercentage\r\n const fillColor = this._fillColor\r\n const hasGradient = this._hasGradient()\r\n\r\n let fillStyle = ''\r\n if (hasGradient) {\r\n const grad = this.gradient!\r\n const angle = grad.angle ?? 0\r\n const stops =\r\n grad.stops && grad.stops.length >= 2\r\n ? grad.stops\r\n : [\r\n { color: grad.from!, offset: 0 },\r\n { color: grad.to!, offset: 100 },\r\n ]\r\n const stopStr = stops.map((s) => `${s.color} ${s.offset ?? 0}%`).join(', ')\r\n fillStyle = `background: linear-gradient(${angle}deg, ${stopStr})`\r\n } else if (fillColor) {\r\n fillStyle = `background-color: ${fillColor}`\r\n }\r\n\r\n return html`\r\n <div class=\"progress-line progress-line--${size}\">\r\n <div class=\"progress-line__track\" part=\"track\">\r\n <div\r\n class=\"progress-line__fill progress-line__fill--${this.status} ${\r\n this.processing ? 'progress-line__fill--processing' : ''\r\n }\"\r\n part=\"fill\"\r\n style=\"width: ${this.processing ? '100%' : pct + '%'}; ${fillStyle}\"\r\n ></div>\r\n </div>\r\n ${\r\n this.showText && !this.processing\r\n ? html`<span class=\"progress-line__text\" part=\"text\">${pct}%</span>`\r\n : nothing\r\n }\r\n </div>\r\n `\r\n }\r\n\r\n private _renderCircle() {\r\n const w = this.width\r\n\r\n if (this.circles && this.circles.length > 0) {\r\n return this._renderMultiCircle()\r\n }\r\n\r\n const pct = this._normalizedPercentage\r\n const sw = this.strokeWidth\r\n const r = (w - sw) / 2\r\n const c = 2 * Math.PI * r\r\n const offset = c - (pct / 100) * c\r\n const fillColor = this._fillColor\r\n const hasGradient = this._hasGradient()\r\n const gradientId = this._getGradientId(0)\r\n\r\n let strokeValue = ''\r\n if (hasGradient) {\r\n strokeValue = `url(#${gradientId})`\r\n } else if (fillColor) {\r\n strokeValue = fillColor\r\n }\r\n\r\n return html`\r\n <div class=\"progress-circle\" style=\"width: ${w}px; height: ${w}px;\">\r\n <svg class=\"progress-circle__svg\" width=\"${w}\" height=\"${w}\" viewBox=\"0 0 ${w} ${w}\">\r\n <defs>${this._renderGradientDefs(0)}</defs>\r\n <circle\r\n class=\"progress-circle__track\"\r\n part=\"track\"\r\n cx=\"${w / 2}\"\r\n cy=\"${w / 2}\"\r\n r=\"${r}\"\r\n stroke-width=\"${sw}\"\r\n />\r\n <circle\r\n class=\"progress-circle__fill progress-circle__fill--${this.status} ${\r\n this.processing ? 'progress-circle__fill--processing' : ''\r\n }\"\r\n part=\"fill\"\r\n cx=\"${w / 2}\"\r\n cy=\"${w / 2}\"\r\n r=\"${r}\"\r\n stroke-width=\"${sw}\"\r\n stroke-dasharray=\"${this.processing ? c * 0.25 + ' ' + c * 0.75 : c}\"\r\n stroke-dashoffset=\"${this.processing ? c * 0.125 : offset}\"\r\n stroke=\"${strokeValue}\"\r\n />\r\n </svg>\r\n ${\r\n this.showText\r\n ? html`<span class=\"progress-circle__text\" part=\"text\"\r\n ><slot name=\"text\">${pct}%</slot></span\r\n >`\r\n : nothing\r\n }\r\n </div>\r\n `\r\n }\r\n\r\n private _renderMultiCircle() {\r\n const w = this.width\r\n const circles = this.circles!\r\n const gap = 4\r\n const padding = 2\r\n const strokeWidths = circles.map((c) => c.strokeWidth ?? this.strokeWidth)\r\n\r\n // 计算各环半径:index=0 是最外层(最大半径),向内逐层递减\r\n const radii: number[] = []\r\n radii[0] = (w - strokeWidths[0]) / 2 - padding\r\n for (let i = 1; i < circles.length; i++) {\r\n radii[i] = radii[i - 1] - strokeWidths[i - 1] / 2 - gap - strokeWidths[i] / 2\r\n }\r\n\r\n return html`\r\n <div class=\"progress-circle\" style=\"width: ${w}px; height: ${w}px;\">\r\n <svg class=\"progress-circle__svg\" width=\"${w}\" height=\"${w}\" viewBox=\"0 0 ${w} ${w}\">\r\n <defs>${circles.map((_, i) => this._renderGradientDefs(i))}</defs>\r\n ${circles.map((circle, index) => {\r\n const sw = strokeWidths[index]\r\n const r = radii[index]\r\n const c = 2 * Math.PI * r\r\n const pct = Math.max(0, Math.min(100, circle.percentage))\r\n const offset = c - (pct / 100) * c\r\n const hasGradient = this._hasGradient()\r\n const gradientId = this._getGradientId(index)\r\n\r\n let strokeValue = ''\r\n if (circle.color) {\r\n strokeValue = circle.color\r\n } else if (hasGradient) {\r\n strokeValue = `url(#${gradientId})`\r\n }\r\n\r\n // processing 动画仅作用于最内环(数组最后一个)\r\n const isProcessing = this.processing && index === circles.length - 1\r\n return svg`\r\n <circle\r\n class=\"progress-circle__track\"\r\n cx=\"${w / 2}\"\r\n cy=\"${w / 2}\"\r\n r=\"${r}\"\r\n stroke-width=\"${sw}\"\r\n />\r\n <circle\r\n class=\"progress-circle__fill ${\r\n isProcessing ? 'progress-circle__fill--processing' : ''\r\n }\"\r\n cx=\"${w / 2}\"\r\n cy=\"${w / 2}\"\r\n r=\"${r}\"\r\n stroke-width=\"${sw}\"\r\n stroke-dasharray=\"${isProcessing ? c * 0.25 + ' ' + c * 0.75 : c}\"\r\n stroke-dashoffset=\"${isProcessing ? c * 0.125 : offset}\"\r\n stroke=\"${strokeValue}\"\r\n stroke-linecap=\"round\"\r\n />\r\n `\r\n })}\r\n </svg>\r\n ${\r\n this.showText && !this.processing\r\n ? html`<span class=\"progress-circle__text\" part=\"text\"\r\n ><slot name=\"text\">${this._normalizedPercentage}%</slot></span\r\n >`\r\n : nothing\r\n }\r\n </div>\r\n `\r\n }\r\n\r\n override render() {\r\n return this.type === 'circle' ? this._renderCircle() : this._renderLine()\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'mac-progress': MacProgress\r\n }\r\n}\r\n","import { html, css, nothing } from 'lit'\r\nimport { property, customElement } from 'lit/decorators.js'\r\nimport { BaseElement } from '../../internal/base-element'\r\nimport { sharedStyles } from '../../styles/shared-styles'\r\nimport { themeTokens } from '../../styles/theme'\r\n\r\n/**\r\n * @tag mac-alert\r\n * @summary 用于显示警告消息的提示组件。\r\n *\r\n * @slot - 提示的描述内容。\r\n * @slot icon - 自定义图标内容。\r\n * @slot action - 显示在右侧的操作内容。\r\n *\r\n * @csspart base - 提示的基础容器。\r\n * @csspart icon - 图标容器。\r\n * @csspart title - 标题文本。\r\n * @csspart content - 描述内容。\r\n * @csspart close - 关闭按钮。\r\n *\r\n * @event mac-close - 点击关闭按钮时触发。\r\n */\r\n@customElement('mac-alert')\r\nexport class MacAlert extends BaseElement {\r\n static override styles = [\r\n themeTokens,\r\n sharedStyles,\r\n css`\r\n :host {\r\n display: block;\r\n font-family: var(--md-font-family);\r\n }\r\n\r\n .alert {\r\n display: flex;\r\n align-items: flex-start;\r\n gap: var(--md-alert-gap);\r\n padding: var(--md-alert-padding);\r\n border-radius: var(--md-alert-radius);\r\n font-size: var(--md-alert-font-size);\r\n line-height: 1.5;\r\n transition: all var(--md-transition-fast);\r\n }\r\n\r\n .alert--bordered {\r\n border: 1px solid var(--md-alert-border-color);\r\n }\r\n\r\n .alert--borderless {\r\n border-color: transparent;\r\n }\r\n\r\n /* 类型 */\r\n .alert--default {\r\n background-color: var(--md-alert-default-bg);\r\n --md-alert-border-color: var(--md-alert-default-border);\r\n --md-alert-icon-color: var(--md-alert-default-icon);\r\n --md-alert-title-color: var(--md-alert-default-title);\r\n --md-alert-content-color: var(--md-alert-default-content);\r\n }\r\n\r\n .alert--primary {\r\n background-color: var(--md-alert-primary-bg);\r\n --md-alert-border-color: var(--md-alert-primary-border);\r\n --md-alert-icon-color: var(--md-alert-primary-icon);\r\n --md-alert-title-color: var(--md-alert-primary-title);\r\n --md-alert-content-color: var(--md-alert-primary-content);\r\n }\r\n\r\n .alert--success {\r\n background-color: var(--md-alert-success-bg);\r\n --md-alert-border-color: var(--md-alert-success-border);\r\n --md-alert-icon-color: var(--md-alert-success-icon);\r\n --md-alert-title-color: var(--md-alert-success-title);\r\n --md-alert-content-color: var(--md-alert-success-content);\r\n }\r\n\r\n .alert--warning {\r\n background-color: var(--md-alert-warning-bg);\r\n --md-alert-border-color: var(--md-alert-warning-border);\r\n --md-alert-icon-color: var(--md-alert-warning-icon);\r\n --md-alert-title-color: var(--md-alert-warning-title);\r\n --md-alert-content-color: var(--md-alert-warning-content);\r\n }\r\n\r\n .alert--error {\r\n background-color: var(--md-alert-error-bg);\r\n --md-alert-border-color: var(--md-alert-error-border);\r\n --md-alert-icon-color: var(--md-alert-error-icon);\r\n --md-alert-title-color: var(--md-alert-error-title);\r\n --md-alert-content-color: var(--md-alert-error-content);\r\n }\r\n\r\n .alert--info {\r\n background-color: var(--md-alert-info-bg);\r\n --md-alert-border-color: var(--md-alert-info-border);\r\n --md-alert-icon-color: var(--md-alert-info-icon);\r\n --md-alert-title-color: var(--md-alert-info-title);\r\n --md-alert-content-color: var(--md-alert-info-content);\r\n }\r\n\r\n /* 图标 */\r\n .alert__icon {\r\n flex-shrink: 0;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: var(--md-alert-icon-size);\r\n height: var(--md-alert-icon-size);\r\n margin-top: 1px;\r\n color: var(--md-alert-icon-color);\r\n }\r\n\r\n .alert__icon ::slotted(*),\r\n .alert__icon svg {\r\n width: var(--md-alert-icon-size);\r\n height: var(--md-alert-icon-size);\r\n }\r\n\r\n /* 内容区域 */\r\n .alert__content {\r\n flex: 1;\r\n min-width: 0;\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--md-alert-content-gap);\r\n }\r\n\r\n .alert__title {\r\n font-weight: 500;\r\n color: var(--md-alert-title-color);\r\n font-size: var(--md-alert-title-font-size);\r\n line-height: 1.4;\r\n }\r\n\r\n .alert__description {\r\n color: var(--md-alert-content-color);\r\n line-height: 1.6;\r\n }\r\n\r\n /* 操作 */\r\n .alert__action {\r\n flex-shrink: 0;\r\n display: flex;\r\n align-items: center;\r\n margin-left: auto;\r\n padding-left: var(--md-alert-gap);\r\n }\r\n\r\n /* 关闭按钮 */\r\n .alert__close {\r\n flex-shrink: 0;\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: var(--md-alert-close-size);\r\n height: var(--md-alert-close-size);\r\n margin-top: 1px;\r\n margin-left: auto;\r\n padding: 0;\r\n border: none;\r\n border-radius: var(--md-alert-close-radius);\r\n background: transparent;\r\n cursor: pointer;\r\n color: var(--md-alert-content-color);\r\n opacity: 0.6;\r\n transition: all var(--md-transition-fast);\r\n }\r\n\r\n .alert__close:hover {\r\n opacity: 1;\r\n background-color: var(--md-alert-close-hover-bg);\r\n }\r\n\r\n .alert__close:focus-visible {\r\n outline: 2px solid var(--md-color-primary);\r\n outline-offset: 1px;\r\n }\r\n\r\n .alert__close svg {\r\n width: var(--md-alert-close-icon-size);\r\n height: var(--md-alert-close-icon-size);\r\n }\r\n `,\r\n ]\r\n\r\n /** 提示的类型样式。 */\r\n @property({ reflect: true }) type:\r\n 'default' | 'primary' | 'success' | 'warning' | 'error' | 'info' = 'default'\r\n\r\n /** 提示的标题。 */\r\n @property({ reflect: true }) title = ''\r\n\r\n /** 提示是否有边框。 */\r\n @property({ type: Boolean, reflect: true }) bordered = true\r\n\r\n /** 是否显示图标。 */\r\n @property({ type: Boolean, attribute: 'show-icon', reflect: true }) showIcon = true\r\n\r\n /** 提示是否可以关闭。 */\r\n @property({ type: Boolean, reflect: true }) closable = false\r\n\r\n private get _defaultIcon() {\r\n switch (this.type) {\r\n case 'success':\r\n return html`<svg\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\" />\r\n <polyline points=\"22 4 12 14.01 9 11.01\" />\r\n </svg>`\r\n case 'warning':\r\n return html`<svg\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <path\r\n 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\"\r\n />\r\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" />\r\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\r\n </svg>`\r\n case 'error':\r\n return html`<svg\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\r\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\" />\r\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\" />\r\n </svg>`\r\n case 'info':\r\n case 'primary':\r\n return html`<svg\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\r\n <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\" />\r\n <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\" />\r\n </svg>`\r\n default:\r\n return html`<svg\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\r\n <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\" />\r\n <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\" />\r\n </svg>`\r\n }\r\n }\r\n\r\n private _handleClose(e: Event) {\r\n e.stopPropagation()\r\n this.emit('mac-close')\r\n }\r\n\r\n override render() {\r\n const hasIcon = this.showIcon\r\n const hasTitle = this.title.length > 0\r\n\r\n return html`\r\n <div\r\n part=\"base\"\r\n class=\"alert alert--${this.type} ${this.bordered ? 'alert--bordered' : 'alert--borderless'}\"\r\n role=\"alert\"\r\n >\r\n ${\r\n hasIcon\r\n ? html`\r\n <div class=\"alert__icon\" part=\"icon\">\r\n <slot name=\"icon\">${this._defaultIcon}</slot>\r\n </div>\r\n `\r\n : nothing\r\n }\r\n <div class=\"alert__content\" part=\"content\">\r\n ${hasTitle ? html`<div class=\"alert__title\" part=\"title\">${this.title}</div>` : nothing}\r\n <div class=\"alert__description\">\r\n <slot></slot>\r\n </div>\r\n </div>\r\n <slot name=\"action\" part=\"action\"></slot>\r\n ${\r\n this.closable\r\n ? html`\r\n <button\r\n part=\"close\"\r\n class=\"alert__close\"\r\n type=\"button\"\r\n aria-label=\"Close\"\r\n @click=${this._handleClose}\r\n >\r\n <svg viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M4 4L12 12M12 4L4 12\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.5\"\r\n stroke-linecap=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n `\r\n : nothing\r\n }\r\n </div>\r\n `\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'mac-alert': MacAlert\r\n }\r\n}\r\n","import { css, CSSResult } from 'lit'\r\n\r\n/**\r\n * 动画分类\r\n */\r\nexport type AnimationCategory = 'fade' | 'scale' | 'rotate' | 'slide' | 'bounce' | 'special'\r\n\r\n/**\r\n * 单个动画定义\r\n */\r\nexport interface AnimationDefinition {\r\n /** 动画名称(用于 type 属性匹配) */\r\n name: string\r\n /** 效果描述 */\r\n description: string\r\n /** 所属分类 */\r\n category: AnimationCategory\r\n /** @keyframes 规则的纯 CSS 文本(不含 @keyframes 包裹层之外的任何选择器) */\r\n keyframes: string\r\n /** 是否为退场动画(to 隐藏) */\r\n exit?: boolean\r\n}\r\n\r\n/* ═══════════════════════════════════════════════════════════════\r\n 内置动画 keyframes 文本\r\n ═══════════════════════════════════════════════════════════════ */\r\nconst KF = {\r\n fadeIn: `@keyframes mac-fadeIn { from { opacity: 0; } to { opacity: 1; } }`,\r\n fadeOut: `@keyframes mac-fadeOut { from { opacity: 1; } to { opacity: 0; } }`,\r\n fadeInUp: `@keyframes mac-fadeInUp { from { opacity: 0; transform: translate3d(0, 100%, 0); } to { opacity: 1; transform: translate3d(0, 0, 0); } }`,\r\n fadeInDown: `@keyframes mac-fadeInDown { from { opacity: 0; transform: translate3d(0, -100%, 0); } to { opacity: 1; transform: translate3d(0, 0, 0); } }`,\r\n fadeInLeft: `@keyframes mac-fadeInLeft { from { opacity: 0; transform: translate3d(-100%, 0, 0); } to { opacity: 1; transform: translate3d(0, 0, 0); } }`,\r\n fadeInRight: `@keyframes mac-fadeInRight { from { opacity: 0; transform: translate3d(100%, 0, 0); } to { opacity: 1; transform: translate3d(0, 0, 0); } }`,\r\n zoomIn: `@keyframes mac-zoomIn { from { opacity: 0; transform: scale3d(0.3, 0.3, 0.3); } to { opacity: 1; transform: scale3d(1, 1, 1); } }`,\r\n zoomOut: `@keyframes mac-zoomOut { from { opacity: 1; transform: scale3d(1, 1, 1); } to { opacity: 0; transform: scale3d(0.3, 0.3, 0.3); } }`,\r\n scaleIn: `@keyframes mac-scaleIn { from { transform: scale(0); } to { transform: scale(1); } }`,\r\n rotateIn: `@keyframes mac-rotateIn { from { transform-origin: center; transform: rotate3d(0, 0, 1, -200deg); opacity: 0; } to { transform-origin: center; transform: translate3d(0, 0, 0); opacity: 1; } }`,\r\n flip: `@keyframes mac-flip { from { transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, -360deg); animation-timing-function: ease-out; } 40% { transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, -190deg); animation-timing-function: ease-out; } 50% { transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, -170deg); animation-timing-function: ease-in; } 80% { transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, 0); animation-timing-function: ease-in; } to { transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, 0); animation-timing-function: ease-in; } }`,\r\n rotateInDownLeft: `@keyframes mac-rotateInDownLeft { from { transform-origin: left bottom; transform: rotate3d(0, 0, 1, -45deg); opacity: 0; } to { transform-origin: left bottom; transform: translate3d(0, 0, 0); opacity: 1; } }`,\r\n bounce: `@keyframes mac-bounce { from, 20%, 53%, 80%, to { animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); transform: translate3d(0, 0, 0); } 40%, 43% { animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); transform: translate3d(0, -30px, 0); } 70% { animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); transform: translate3d(0, -15px, 0); } 90% { transform: translate3d(0, -4px, 0); } }`,\r\n bounceIn: `@keyframes mac-bounceIn { from, 20%, 40%, 60%, 80%, to { animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); } 0% { opacity: 0; transform: scale3d(0.3, 0.3, 0.3); } 20% { transform: scale3d(1.1, 1.1, 1.1); } 40% { transform: scale3d(0.9, 0.9, 0.9); } 60% { opacity: 1; transform: scale3d(1.03, 1.03, 1.03); } 80% { transform: scale3d(0.97, 0.97, 0.97); } to { opacity: 1; transform: scale3d(1, 1, 1); } }`,\r\n slideInLeft: `@keyframes mac-slideInLeft { from { transform: translate3d(-100%, 0, 0); visibility: visible; } to { transform: translate3d(0, 0, 0); } }`,\r\n slideInRight: `@keyframes mac-slideInRight { from { transform: translate3d(100%, 0, 0); visibility: visible; } to { transform: translate3d(0, 0, 0); } }`,\r\n slideInUp: `@keyframes mac-slideInUp { from { transform: translate3d(0, 100%, 0); visibility: visible; } to { transform: translate3d(0, 0, 0); } }`,\r\n slideInDown: `@keyframes mac-slideInDown { from { transform: translate3d(0, -100%, 0); visibility: visible; } to { transform: translate3d(0, 0, 0); } }`,\r\n shake: `@keyframes mac-shake { from, to { transform: translate3d(0, 0, 0); } 10%, 30%, 50%, 70%, 90% { transform: translate3d(-10px, 0, 0); } 20%, 40%, 60%, 80% { transform: translate3d(10px, 0, 0); } }`,\r\n pulse: `@keyframes mac-pulse { from { transform: scale3d(1, 1, 1); } 50% { transform: scale3d(1.05, 1.05, 1.05); } to { transform: scale3d(1, 1, 1); } }`,\r\n flash: `@keyframes mac-flash { from, 50%, to { opacity: 1; } 25%, 75% { opacity: 0; } }`,\r\n swing: `@keyframes mac-swing { 20% { transform: rotate3d(0, 0, 1, 15deg); } 40% { transform: rotate3d(0, 0, 1, -10deg); } 60% { transform: rotate3d(0, 0, 1, 5deg); } 80% { transform: rotate3d(0, 0, 1, -5deg); } to { transform: rotate3d(0, 0, 1, 0); } }`,\r\n wobble: `@keyframes mac-wobble { from { transform: translate3d(0, 0, 0); } 15% { transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); } 30% { transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); } 45% { transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); } 60% { transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); } 75% { transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); } to { transform: translate3d(0, 0, 0); } }`,\r\n jello: `@keyframes mac-jello { from, 11.1%, to { transform: translate3d(0, 0, 0); } 22.2% { transform: skewX(-12.5deg) skewY(-12.5deg); } 33.3% { transform: skewX(6.25deg) skewY(6.25deg); } 44.4% { transform: skewX(-3.125deg) skewY(-3.125deg); } 55.5% { transform: skewX(1.5625deg) skewY(1.5625deg); } 66.6% { transform: skewX(-0.78125deg) skewY(-0.78125deg); } 77.7% { transform: skewX(0.390625deg) skewY(0.390625deg); } 88.8% { transform: skewX(-0.1953125deg) skewY(-0.1953125deg); } }`,\r\n rubberBand: `@keyframes mac-rubberBand { from { transform: scale3d(1, 1, 1); } 30% { transform: scale3d(1.25, 0.75, 1); } 40% { transform: scale3d(0.75, 1.25, 1); } 50% { transform: scale3d(1.15, 0.85, 1); } 65% { transform: scale3d(0.95, 1.05, 1); } 75% { transform: scale3d(1.05, 0.95, 1); } to { transform: scale3d(1, 1, 1); } }`,\r\n tada: `@keyframes mac-tada { from { transform: scale3d(1, 1, 1); } 10%, 20% { transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg); } 30%, 50%, 70%, 90% { transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); } 40%, 60%, 80% { transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); } to { transform: scale3d(1, 1, 1); } }`,\r\n rollIn: `@keyframes mac-rollIn { from { opacity: 0; transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); } to { opacity: 1; transform: translate3d(0, 0, 0); } }`,\r\n lightSpeedIn: `@keyframes mac-lightSpeedIn { from { transform: translate3d(100%, 0, 0) skewX(-30deg); opacity: 0; } 60% { transform: skewX(20deg); opacity: 1; } 80% { transform: skewX(-5deg); opacity: 1; } to { transform: translate3d(0, 0, 0); opacity: 1; } }`,\r\n heartBeat: `@keyframes mac-heartBeat { 0% { transform: scale(1); } 14% { transform: scale(1.3); } 28% { transform: scale(1); } 42% { transform: scale(1.3); } 70% { transform: scale(1); } }`,\r\n} as const\r\n\r\n/* ═══════════════════════════════════════════════════════════════\r\n 内置动画清单(27 种)\r\n ═══════════════════════════════════════════════════════════════ */\r\nexport const BUILT_IN: AnimationDefinition[] = [\r\n // 淡入淡出\r\n { name: 'fadeIn', description: '透明度从 0 到 1 淡入', category: 'fade', keyframes: KF.fadeIn },\r\n {\r\n name: 'fadeOut',\r\n description: '透明度从 1 到 0 淡出',\r\n category: 'fade',\r\n keyframes: KF.fadeOut,\r\n exit: true,\r\n },\r\n {\r\n name: 'fadeInUp',\r\n description: '从下方淡入并向上平移',\r\n category: 'fade',\r\n keyframes: KF.fadeInUp,\r\n },\r\n {\r\n name: 'fadeInDown',\r\n description: '从上方淡入并向下平移',\r\n category: 'fade',\r\n keyframes: KF.fadeInDown,\r\n },\r\n {\r\n name: 'fadeInLeft',\r\n description: '从左侧淡入并向右平移',\r\n category: 'fade',\r\n keyframes: KF.fadeInLeft,\r\n },\r\n {\r\n name: 'fadeInRight',\r\n description: '从右侧淡入并向左平移',\r\n category: 'fade',\r\n keyframes: KF.fadeInRight,\r\n },\r\n // 缩放\r\n { name: 'zoomIn', description: '从 0.3 倍缩放并淡入', category: 'scale', keyframes: KF.zoomIn },\r\n {\r\n name: 'zoomOut',\r\n description: '缩小到 0.3 倍并淡出',\r\n category: 'scale',\r\n keyframes: KF.zoomOut,\r\n exit: true,\r\n },\r\n {\r\n name: 'scaleIn',\r\n description: '从 0 缩放到 1 弹性放大',\r\n category: 'scale',\r\n keyframes: KF.scaleIn,\r\n },\r\n // 旋转 / 翻转\r\n {\r\n name: 'rotateIn',\r\n description: '从 -200deg 旋转淡入',\r\n category: 'rotate',\r\n keyframes: KF.rotateIn,\r\n },\r\n { name: 'flip', description: '3D Y 轴翻转', category: 'rotate', keyframes: KF.flip },\r\n {\r\n name: 'rotateInDownLeft',\r\n description: '以左下角为原点旋转淡入',\r\n category: 'rotate',\r\n keyframes: KF.rotateInDownLeft,\r\n },\r\n // 平移 / 滑动\r\n { name: 'slideInLeft', description: '从左侧滑入', category: 'slide', keyframes: KF.slideInLeft },\r\n {\r\n name: 'slideInRight',\r\n description: '从右侧滑入',\r\n category: 'slide',\r\n keyframes: KF.slideInRight,\r\n },\r\n { name: 'slideInUp', description: '从下方滑入', category: 'slide', keyframes: KF.slideInUp },\r\n { name: 'slideInDown', description: '从上方滑入', category: 'slide', keyframes: KF.slideInDown },\r\n // 弹跳\r\n { name: 'bounce', description: '垂直弹跳', category: 'bounce', keyframes: KF.bounce },\r\n { name: 'bounceIn', description: '弹性缩放淡入', category: 'bounce', keyframes: KF.bounceIn },\r\n // 特殊效果\r\n { name: 'shake', description: '水平抖动', category: 'special', keyframes: KF.shake },\r\n { name: 'pulse', description: '轻微脉冲缩放', category: 'special', keyframes: KF.pulse },\r\n { name: 'flash', description: '透明度闪烁', category: 'special', keyframes: KF.flash },\r\n { name: 'swing', description: '钟摆式摆动', category: 'special', keyframes: KF.swing },\r\n { name: 'wobble', description: '摇摆并旋转', category: 'special', keyframes: KF.wobble },\r\n { name: 'jello', description: '果冻形变', category: 'special', keyframes: KF.jello },\r\n { name: 'rubberBand', description: '橡皮筋拉伸', category: 'special', keyframes: KF.rubberBand },\r\n { name: 'tada', description: '缩放旋转强调', category: 'special', keyframes: KF.tada },\r\n { name: 'rollIn', description: '从左侧滚动旋转淡入', category: 'special', keyframes: KF.rollIn },\r\n {\r\n name: 'lightSpeedIn',\r\n description: '光速斜切淡入',\r\n category: 'special',\r\n keyframes: KF.lightSpeedIn,\r\n },\r\n { name: 'heartBeat', description: '心跳缩放', category: 'special', keyframes: KF.heartBeat },\r\n]\r\n\r\n/** 内置动画名称集合(用于判断是否需要动态注入 keyframes) */\r\nexport const BUILT_IN_ANIMATION_NAMES: ReadonlySet<string> = new Set(BUILT_IN.map((d) => d.name))\r\n\r\n/* ═══════════════════════════════════════════════════════════════\r\n 注册表(支持运行时扩展)\r\n ═══════════════════════════════════════════════════════════════ */\r\nconst registry = new Map<string, AnimationDefinition>()\r\n\r\nfor (const def of BUILT_IN) {\r\n registry.set(def.name, def)\r\n}\r\n\r\n/**\r\n * 注册自定义动画(可扩展性入口)\r\n *\r\n * @example\r\n * ```ts\r\n * registerAnimation({\r\n * name: 'myFade',\r\n * description: '自定义淡入',\r\n * category: 'fade',\r\n * keyframes: '@keyframes mac-myFade { from { opacity: 0; } to { opacity: 1; } }',\r\n * })\r\n * ```\r\n * 注册后即可通过 `<mac-animation type=\"myFade\">` 使用。\r\n */\r\nexport function registerAnimation(def: AnimationDefinition): void {\r\n if (!def.name) {\r\n throw new Error('[mac-animation] 动画名称不能为空')\r\n }\r\n registry.set(def.name, def)\r\n}\r\n\r\n/**\r\n * 根据名称获取动画定义,未找到时返回 undefined\r\n */\r\nexport function getAnimation(name: string): AnimationDefinition | undefined {\r\n return registry.get(name)\r\n}\r\n\r\n/**\r\n * 判断动画是否已注册\r\n */\r\nexport function hasAnimation(name: string): boolean {\r\n return registry.has(name)\r\n}\r\n\r\n/**\r\n * 获取所有已注册动画名称列表\r\n */\r\nexport function getAnimationNames(): string[] {\r\n return Array.from(registry.keys())\r\n}\r\n\r\n/**\r\n * 获取所有已注册动画定义\r\n */\r\nexport function getAllAnimations(): AnimationDefinition[] {\r\n return Array.from(registry.values())\r\n}\r\n\r\n/* ═══════════════════════════════════════════════════════════════\r\n 样式类模式:聚合所有 @keyframes 的 CSSResult\r\n ═══════════════════════════════════════════════════════════════ */\r\nconst allKeyframesText = BUILT_IN.map((d) => d.keyframes).join('\\n')\r\n\r\n/**\r\n * 所有内置动画的 @keyframes(供 HOC 组件注入 Shadow DOM)。\r\n */\r\nexport const builtInKeyframes: CSSResult = css([\r\n allKeyframesText,\r\n] as unknown as TemplateStringsArray)\r\n\r\n/**\r\n * 样式类模式的完整样式表:\r\n * - 包含所有 @keyframes\r\n * - 为每个动画生成 `.mac-anim-{name}` 类,使用合理的默认参数\r\n *\r\n * 使用方式(在任意自定义元素中 adoptedStyleSheets 或 css`` 拼接):\r\n * ```ts\r\n * import { animationStyleSheet } from '@hy/mac-ui'\r\n * ```\r\n * 也可直接在普通 HTML 中通过 `<style>` 注入 `animationStyleSheet.cssText`。\r\n */\r\nconst classesText =\r\n allKeyframesText +\r\n '\\n' +\r\n BUILT_IN.map((d) => `.mac-anim-${d.name} { animation-name: mac-${d.name}; }`).join('\\n')\r\n\r\nexport const animationStyleSheet: CSSResult = css([classesText] as unknown as TemplateStringsArray)\r\n\r\n/**\r\n * 动画参数接口\r\n */\r\nexport interface AnimationOptions {\r\n /** 动画时长,如 '1s' / '500ms' */\r\n duration?: string\r\n /** 延迟时间 */\r\n delay?: string\r\n /** 重复次数,数字或 'infinite' */\r\n iterationCount?: number | 'infinite'\r\n /** 方向 */\r\n direction?: 'normal' | 'reverse' | 'alternate' | 'alternate-reverse'\r\n /** 填充模式 */\r\n fillMode?: 'none' | 'forwards' | 'backwards' | 'both'\r\n /** 缓动函数 */\r\n timingFunction?: string\r\n /** 是否暂停 */\r\n paused?: boolean\r\n}\r\n\r\n/**\r\n * 根据动画名称与参数生成 inline `animation` 简写字符串。\r\n * 用于「样式类模式」下动态控制单个元素。\r\n *\r\n * @example\r\n * ```ts\r\n * el.style.animation = buildAnimationShorthand('fadeIn', { duration: '0.5s' })\r\n * ```\r\n */\r\nexport function buildAnimationShorthand(name: string, options: AnimationOptions = {}): string {\r\n const def = getAnimation(name)\r\n if (!def) {\r\n return ''\r\n }\r\n const parts = [\r\n `mac-${def.name}`,\r\n options.duration ?? '250ms',\r\n options.timingFunction ?? 'ease',\r\n options.delay ?? '0s',\r\n String(options.iterationCount ?? 1),\r\n options.direction ?? 'normal',\r\n options.fillMode ?? 'both',\r\n options.paused ? 'paused' : 'running',\r\n ]\r\n return parts.join(' ')\r\n}\r\n\r\n/**\r\n * 生成可直接用于 `style` 属性的对象形式(camelCase)。\r\n *\r\n * @example\r\n * ```ts\r\n * html`<div style=${styleMap(getAnimationStyleObject('bounce', { duration: '0.8s' }))}></div>`\r\n * ```\r\n */\r\nexport function getAnimationStyleObject(\r\n name: string,\r\n options: AnimationOptions = {},\r\n): Record<string, string> {\r\n const def = getAnimation(name)\r\n if (!def) {\r\n return {}\r\n }\r\n return {\r\n animationName: `mac-${def.name}`,\r\n animationDuration: options.duration ?? '250ms',\r\n animationTimingFunction: options.timingFunction ?? 'ease',\r\n animationDelay: options.delay ?? '0s',\r\n animationIterationCount: String(options.iterationCount ?? 1),\r\n animationDirection: options.direction ?? 'normal',\r\n animationFillMode: options.fillMode ?? 'both',\r\n animationPlayState: options.paused ? 'paused' : 'running',\r\n }\r\n}\r\n","import { html, css, PropertyValues, nothing } from 'lit'\r\nimport { property, customElement, query } from 'lit/decorators.js'\r\nimport { BaseElement } from '../../internal/base-element'\r\nimport { sharedStyles } from '../../styles/shared-styles'\r\nimport {\r\n builtInKeyframes,\r\n getAnimation,\r\n BUILT_IN_ANIMATION_NAMES,\r\n type AnimationOptions,\r\n} from './animations'\r\n\r\n/**\r\n * @tag mac-animation\r\n * @summary 动画容器组件(高阶组件模式)。\r\n *\r\n * 将需要应用动画的目标元素放在 `<mac-animation>` 内部,被包裹内容将自动应用指定动画。\r\n * 同时支持「样式类模式」—— 导出 `animationStyleSheet` / `buildAnimationShorthand` / `getAnimationStyleObject`。\r\n *\r\n * @slot - 需要应用动画的目标内容\r\n *\r\n * @event mac-animation-start - 动画开始时触发\r\n * @event mac-animation-end - 动画结束时触发\r\n * @event mac-animation-iteration - 动画每次重复时触发\r\n *\r\n * @csspart wrapper - 包裹动画内容的容器\r\n */\r\n@customElement('mac-animation')\r\nexport class MacAnimation extends BaseElement {\r\n static override styles = [\r\n sharedStyles,\r\n builtInKeyframes,\r\n css`\r\n :host {\r\n display: inline-block;\r\n }\r\n .mac-anim-wrapper {\r\n display: inline-block;\r\n /* 硬件加速:减少动画抖动 */\r\n will-change: transform, opacity;\r\n backface-visibility: hidden;\r\n }\r\n :host([block]) {\r\n display: block;\r\n }\r\n :host([block]) .mac-anim-wrapper {\r\n display: block;\r\n }\r\n `,\r\n ]\r\n\r\n /** 动画类型名称(内置 27 种,或通过 registerAnimation 注册的自定义动画) */\r\n @property({ reflect: true }) type = 'fadeIn'\r\n\r\n /** 动画时长,如 '1s' / '500ms' */\r\n @property() duration = '1s'\r\n\r\n /** 延迟时间 */\r\n @property() delay = '0s'\r\n\r\n /** 重复次数:数字或 'infinite' */\r\n @property() iterationCount: number | 'infinite' = 1\r\n\r\n /** 动画方向 */\r\n @property() direction: 'normal' | 'reverse' | 'alternate' | 'alternate-reverse' = 'normal'\r\n\r\n /** 填充模式 */\r\n @property() fillMode: 'none' | 'forwards' | 'backwards' | 'both' = 'both'\r\n\r\n /** 缓动函数 */\r\n @property() timingFunction = 'ease'\r\n\r\n /** 是否暂停(暂停 / 继续控制) */\r\n @property({ type: Boolean, reflect: true }) paused = false\r\n\r\n /** 是否以块级元素渲染(默认 inline-block) */\r\n @property({ type: Boolean, reflect: true }) block = false\r\n\r\n /** 动画结束后是否自动移除动画样式(便于反复触发) */\r\n @property({ type: Boolean }) autoClear = false\r\n\r\n @query('.mac-anim-wrapper') private _wrapper!: HTMLElement\r\n\r\n /** 用于强制重启动画的内部计数 */\r\n private _runToken = 0\r\n\r\n override updated(changed: PropertyValues) {\r\n super.updated(changed)\r\n // 属性变更后,将动画样式同步到包裹元素\r\n this._applyAnimation()\r\n }\r\n\r\n /** 当前动画是否可用 */\r\n private _resolveAnimation() {\r\n const def = getAnimation(this.type)\r\n return def\r\n }\r\n\r\n /** 计算并应用 inline animation 样式 */\r\n private _applyAnimation() {\r\n const wrapper = this._wrapper\r\n if (!wrapper) return\r\n\r\n const def = this._resolveAnimation()\r\n if (!def) {\r\n wrapper.style.animation = ''\r\n return\r\n }\r\n\r\n const opts: AnimationOptions = {\r\n duration: this.duration,\r\n delay: this.delay,\r\n iterationCount: this.iterationCount,\r\n direction: this.direction,\r\n fillMode: this.fillMode,\r\n timingFunction: this.timingFunction,\r\n paused: this.paused,\r\n }\r\n\r\n const parts = [\r\n `mac-${def.name}`,\r\n opts.duration ?? '1s',\r\n opts.timingFunction ?? 'ease',\r\n opts.delay ?? '0s',\r\n String(opts.iterationCount ?? 1),\r\n opts.direction ?? 'normal',\r\n opts.fillMode ?? 'both',\r\n opts.paused ? 'paused' : 'running',\r\n ]\r\n wrapper.style.animation = parts.join(' ')\r\n }\r\n\r\n /** 渲染自定义(非内置)动画的 keyframes 到 Shadow DOM */\r\n private _renderCustomKeyframes() {\r\n const def = this._resolveAnimation()\r\n if (!def) return nothing\r\n // 内置动画已存在于静态 styles,无需重复注入\r\n if (BUILT_IN_ANIMATION_NAMES.has(def.name)) return nothing\r\n return html`<style>\r\n ${def.keyframes}\r\n </style>`\r\n }\r\n\r\n override render() {\r\n return html`\r\n ${this._renderCustomKeyframes()}\r\n <div\r\n class=\"mac-anim-wrapper\"\r\n part=\"wrapper\"\r\n data-run=${this._runToken}\r\n @animationstart=${this._onAnimationStart}\r\n @animationiteration=${this._onAnimationIteration}\r\n @animationend=${this._onAnimationEnd}\r\n >\r\n <slot></slot>\r\n </div>\r\n `\r\n }\r\n\r\n /* ─────────── 生命周期事件 ─────────── */\r\n private _onAnimationStart = () => {\r\n this.emit('mac-animation-start')\r\n }\r\n\r\n private _onAnimationIteration = () => {\r\n this.emit('mac-animation-iteration')\r\n }\r\n\r\n private _onAnimationEnd = () => {\r\n this.emit('mac-animation-end')\r\n if (this.autoClear) {\r\n // 保留终态视觉,仅移除动画以允许后续 restart\r\n this._wrapper?.style.setProperty('animation', 'none')\r\n }\r\n }\r\n\r\n /* ─────────── 公共方法(暂停 / 继续 / 重启 / 停止) ─────────── */\r\n\r\n /** 暂停动画 */\r\n public pause() {\r\n if (!this.paused) this.paused = true\r\n }\r\n\r\n /** 继续动画 */\r\n public resume() {\r\n if (this.paused) this.paused = false\r\n }\r\n\r\n /** 重启动画(从头开始播放一次) */\r\n public restart() {\r\n const wrapper = this._wrapper\r\n if (!wrapper) return\r\n // 先移除动画并强制回流,再重新应用\r\n wrapper.style.animation = 'none'\r\n // 强制 reflow\r\n void wrapper.offsetWidth\r\n this._runToken++\r\n this._applyAnimation()\r\n }\r\n\r\n /** 停止动画并清除样式 */\r\n public stop() {\r\n const wrapper = this._wrapper\r\n if (wrapper) wrapper.style.animation = 'none'\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'mac-animation': MacAnimation\r\n }\r\n}\r\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=globalThis,i=t=>t,s=t.trustedTypes,e=s?s.createPolicy(\"lit-html\",{createHTML:t=>t}):void 0,h=\"$lit$\",o=`lit$${Math.random().toFixed(9).slice(2)}$`,n=\"?\"+o,r=`<${n}>`,l=document,c=()=>l.createComment(\"\"),a=t=>null===t||\"object\"!=typeof t&&\"function\"!=typeof t,u=Array.isArray,d=t=>u(t)||\"function\"==typeof t?.[Symbol.iterator],f=\"[ \\t\\n\\f\\r]\",v=/<(?:(!--|\\/[^a-zA-Z])|(\\/?[a-zA-Z][^>\\s]*)|(\\/?$))/g,_=/-->/g,m=/>/g,p=RegExp(`>|${f}(?:([^\\\\s\"'>=/]+)(${f}*=${f}*(?:[^ \\t\\n\\f\\r\"'\\`<>=]|(\"|')|))|$)`,\"g\"),g=/'/g,$=/\"/g,y=/^(?:script|style|textarea|title)$/i,x=t=>(i,...s)=>({_$litType$:t,strings:i,values:s}),b=x(1),w=x(2),T=x(3),E=Symbol.for(\"lit-noChange\"),A=Symbol.for(\"lit-nothing\"),C=new WeakMap,P=l.createTreeWalker(l,129);function V(t,i){if(!u(t)||!t.hasOwnProperty(\"raw\"))throw Error(\"invalid template strings array\");return void 0!==e?e.createHTML(i):i}const N=(t,i)=>{const s=t.length-1,e=[];let n,l=2===i?\"<svg>\":3===i?\"<math>\":\"\",c=v;for(let i=0;i<s;i++){const s=t[i];let a,u,d=-1,f=0;for(;f<s.length&&(c.lastIndex=f,u=c.exec(s),null!==u);)f=c.lastIndex,c===v?\"!--\"===u[1]?c=_:void 0!==u[1]?c=m:void 0!==u[2]?(y.test(u[2])&&(n=RegExp(\"</\"+u[2],\"g\")),c=p):void 0!==u[3]&&(c=p):c===p?\">\"===u[0]?(c=n??v,d=-1):void 0===u[1]?d=-2:(d=c.lastIndex-u[2].length,a=u[1],c=void 0===u[3]?p:'\"'===u[3]?$:g):c===$||c===g?c=p:c===_||c===m?c=v:(c=p,n=void 0);const x=c===p&&t[i+1].startsWith(\"/>\")?\" \":\"\";l+=c===v?s+r:d>=0?(e.push(a),s.slice(0,d)+h+s.slice(d)+o+x):s+o+(-2===d?i:x)}return[V(t,l+(t[s]||\"<?>\")+(2===i?\"</svg>\":3===i?\"</math>\":\"\")),e]};class S{constructor({strings:t,_$litType$:i},e){let r;this.parts=[];let l=0,a=0;const u=t.length-1,d=this.parts,[f,v]=N(t,i);if(this.el=S.createElement(f,e),P.currentNode=this.el.content,2===i||3===i){const t=this.el.content.firstChild;t.replaceWith(...t.childNodes)}for(;null!==(r=P.nextNode())&&d.length<u;){if(1===r.nodeType){if(r.hasAttributes())for(const t of r.getAttributeNames())if(t.endsWith(h)){const i=v[a++],s=r.getAttribute(t).split(o),e=/([.?@])?(.*)/.exec(i);d.push({type:1,index:l,name:e[2],strings:s,ctor:\".\"===e[1]?I:\"?\"===e[1]?L:\"@\"===e[1]?z:H}),r.removeAttribute(t)}else t.startsWith(o)&&(d.push({type:6,index:l}),r.removeAttribute(t));if(y.test(r.tagName)){const t=r.textContent.split(o),i=t.length-1;if(i>0){r.textContent=s?s.emptyScript:\"\";for(let s=0;s<i;s++)r.append(t[s],c()),P.nextNode(),d.push({type:2,index:++l});r.append(t[i],c())}}}else if(8===r.nodeType)if(r.data===n)d.push({type:2,index:l});else{let t=-1;for(;-1!==(t=r.data.indexOf(o,t+1));)d.push({type:7,index:l}),t+=o.length-1}l++}}static createElement(t,i){const s=l.createElement(\"template\");return s.innerHTML=t,s}}function M(t,i,s=t,e){if(i===E)return i;let h=void 0!==e?s._$Co?.[e]:s._$Cl;const o=a(i)?void 0:i._$litDirective$;return h?.constructor!==o&&(h?._$AO?.(!1),void 0===o?h=void 0:(h=new o(t),h._$AT(t,s,e)),void 0!==e?(s._$Co??=[])[e]=h:s._$Cl=h),void 0!==h&&(i=M(t,h._$AS(t,i.values),h,e)),i}class R{constructor(t,i){this._$AV=[],this._$AN=void 0,this._$AD=t,this._$AM=i}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(t){const{el:{content:i},parts:s}=this._$AD,e=(t?.creationScope??l).importNode(i,!0);P.currentNode=e;let h=P.nextNode(),o=0,n=0,r=s[0];for(;void 0!==r;){if(o===r.index){let i;2===r.type?i=new k(h,h.nextSibling,this,t):1===r.type?i=new r.ctor(h,r.name,r.strings,this,t):6===r.type&&(i=new Z(h,this,t)),this._$AV.push(i),r=s[++n]}o!==r?.index&&(h=P.nextNode(),o++)}return P.currentNode=l,e}p(t){let i=0;for(const s of this._$AV)void 0!==s&&(void 0!==s.strings?(s._$AI(t,s,i),i+=s.strings.length-2):s._$AI(t[i])),i++}}class k{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(t,i,s,e){this.type=2,this._$AH=A,this._$AN=void 0,this._$AA=t,this._$AB=i,this._$AM=s,this.options=e,this._$Cv=e?.isConnected??!0}get parentNode(){let t=this._$AA.parentNode;const i=this._$AM;return void 0!==i&&11===t?.nodeType&&(t=i.parentNode),t}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(t,i=this){t=M(this,t,i),a(t)?t===A||null==t||\"\"===t?(this._$AH!==A&&this._$AR(),this._$AH=A):t!==this._$AH&&t!==E&&this._(t):void 0!==t._$litType$?this.$(t):void 0!==t.nodeType?this.T(t):d(t)?this.k(t):this._(t)}O(t){return this._$AA.parentNode.insertBefore(t,this._$AB)}T(t){this._$AH!==t&&(this._$AR(),this._$AH=this.O(t))}_(t){this._$AH!==A&&a(this._$AH)?this._$AA.nextSibling.data=t:this.T(l.createTextNode(t)),this._$AH=t}$(t){const{values:i,_$litType$:s}=t,e=\"number\"==typeof s?this._$AC(t):(void 0===s.el&&(s.el=S.createElement(V(s.h,s.h[0]),this.options)),s);if(this._$AH?._$AD===e)this._$AH.p(i);else{const t=new R(e,this),s=t.u(this.options);t.p(i),this.T(s),this._$AH=t}}_$AC(t){let i=C.get(t.strings);return void 0===i&&C.set(t.strings,i=new S(t)),i}k(t){u(this._$AH)||(this._$AH=[],this._$AR());const i=this._$AH;let s,e=0;for(const h of t)e===i.length?i.push(s=new k(this.O(c()),this.O(c()),this,this.options)):s=i[e],s._$AI(h),e++;e<i.length&&(this._$AR(s&&s._$AB.nextSibling,e),i.length=e)}_$AR(t=this._$AA.nextSibling,s){for(this._$AP?.(!1,!0,s);t!==this._$AB;){const s=i(t).nextSibling;i(t).remove(),t=s}}setConnected(t){void 0===this._$AM&&(this._$Cv=t,this._$AP?.(t))}}class H{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(t,i,s,e,h){this.type=1,this._$AH=A,this._$AN=void 0,this.element=t,this.name=i,this._$AM=e,this.options=h,s.length>2||\"\"!==s[0]||\"\"!==s[1]?(this._$AH=Array(s.length-1).fill(new String),this.strings=s):this._$AH=A}_$AI(t,i=this,s,e){const h=this.strings;let o=!1;if(void 0===h)t=M(this,t,i,0),o=!a(t)||t!==this._$AH&&t!==E,o&&(this._$AH=t);else{const e=t;let n,r;for(t=h[0],n=0;n<h.length-1;n++)r=M(this,e[s+n],i,n),r===E&&(r=this._$AH[n]),o||=!a(r)||r!==this._$AH[n],r===A?t=A:t!==A&&(t+=(r??\"\")+h[n+1]),this._$AH[n]=r}o&&!e&&this.j(t)}j(t){t===A?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,t??\"\")}}class I extends H{constructor(){super(...arguments),this.type=3}j(t){this.element[this.name]=t===A?void 0:t}}class L extends H{constructor(){super(...arguments),this.type=4}j(t){this.element.toggleAttribute(this.name,!!t&&t!==A)}}class z extends H{constructor(t,i,s,e,h){super(t,i,s,e,h),this.type=5}_$AI(t,i=this){if((t=M(this,t,i,0)??A)===E)return;const s=this._$AH,e=t===A&&s!==A||t.capture!==s.capture||t.once!==s.once||t.passive!==s.passive,h=t!==A&&(s===A||e);e&&this.element.removeEventListener(this.name,this,s),h&&this.element.addEventListener(this.name,this,t),this._$AH=t}handleEvent(t){\"function\"==typeof this._$AH?this._$AH.call(this.options?.host??this.element,t):this._$AH.handleEvent(t)}}class Z{constructor(t,i,s){this.element=t,this.type=6,this._$AN=void 0,this._$AM=i,this.options=s}get _$AU(){return this._$AM._$AU}_$AI(t){M(this,t)}}const j={M:h,P:o,A:n,C:1,L:N,R,D:d,V:M,I:k,H,N:L,U:z,B:I,F:Z},B=t.litHtmlPolyfillSupport;B?.(S,k),(t.litHtmlVersions??=[]).push(\"3.3.3\");const D=(t,i,s)=>{const e=s?.renderBefore??i;let h=e._$litPart$;if(void 0===h){const t=s?.renderBefore??null;e._$litPart$=h=new k(i.insertBefore(c(),t),t,void 0,s??{})}return h._$AI(t),h};export{j as _$LH,b as html,T as mathml,E as noChange,A as nothing,D as render,w as svg};\n//# sourceMappingURL=lit-html.js.map\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t={ATTRIBUTE:1,CHILD:2,PROPERTY:3,BOOLEAN_ATTRIBUTE:4,EVENT:5,ELEMENT:6},e=t=>(...e)=>({_$litDirective$:t,values:e});class i{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,e,i){this._$Ct=t,this._$AM=e,this._$Ci=i}_$AS(t,e){return this.update(t,e)}update(t,e){return this.render(...e)}}export{i as Directive,t as PartType,e as directive};\n//# sourceMappingURL=directive.js.map\n","import{noChange as t}from\"../lit-html.js\";import{directive as s,Directive as i,PartType as r}from\"../directive.js\";\n/**\n * @license\n * Copyright 2018 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const e=s(class extends i{constructor(t){if(super(t),t.type!==r.ATTRIBUTE||\"class\"!==t.name||t.strings?.length>2)throw Error(\"`classMap()` can only be used in the `class` attribute and must be the only part in the attribute.\")}render(t){return\" \"+Object.keys(t).filter(s=>t[s]).join(\" \")+\" \"}update(s,[i]){if(void 0===this.st){this.st=new Set,void 0!==s.strings&&(this.nt=new Set(s.strings.join(\" \").split(/\\s/).filter(t=>\"\"!==t)));for(const t in i)i[t]&&!this.nt?.has(t)&&this.st.add(t);return this.render(i)}const r=s.element.classList;for(const t of this.st)t in i||(r.remove(t),this.st.delete(t));for(const t in i){const s=!!i[t];s===this.st.has(t)||this.nt?.has(t)||(s?(r.add(t),this.st.add(t)):(r.remove(t),this.st.delete(t)))}return t}});export{e as classMap};\n//# sourceMappingURL=class-map.js.map\n","import{nothing as t}from\"../lit-html.js\";\n/**\n * @license\n * Copyright 2018 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const o=o=>o??t;export{o as ifDefined};\n//# sourceMappingURL=if-defined.js.map\n","import { html, css, nothing, svg } from 'lit'\r\nimport { property, customElement, state } from 'lit/decorators.js'\r\nimport { classMap } from 'lit/directives/class-map.js'\r\nimport { ifDefined } from 'lit/directives/if-defined.js'\r\nimport { BaseElement } from '../../internal/base-element'\r\nimport { sharedStyles } from '../../styles/shared-styles'\r\nimport { themeTokens } from '../../styles/theme'\r\n\r\nexport type DataTableSortOrder = 'asc' | 'desc'\r\n\r\n/**\r\n * 数据表格列定义\r\n */\r\nexport interface DataTableColumn<T = any> {\r\n /** 列唯一标识 */\r\n key: string\r\n /** 列标题 */\r\n title: string\r\n /** 数据字段名(缺省时取 key) */\r\n dataIndex?: string\r\n /** 列宽 */\r\n width?: string | number\r\n /** 对齐方式 */\r\n align?: 'left' | 'center' | 'right'\r\n /** 是否可排序 */\r\n sortable?: boolean\r\n /** 支持的排序方向,默认 ['asc','desc'](含取消) */\r\n sortDirections?: DataTableSortOrder[]\r\n /** 默认排序方向 */\r\n defaultSortOrder?: DataTableSortOrder\r\n /** 本地排序比较函数 */\r\n sorter?: (a: T, b: T) => number\r\n /** 自定义单元格渲染 */\r\n render?: (row: T, index: number, column: DataTableColumn<T>) => unknown\r\n /** 单元格内容超出省略 */\r\n ellipsis?: boolean\r\n}\r\n\r\n/**\r\n * 分页配置\r\n */\r\nexport interface DataTablePagination {\r\n /** 当前页(受控) */\r\n current?: number\r\n /** 每页条数(受控) */\r\n pageSize?: number\r\n /** 默认当前页(非受控) */\r\n defaultCurrent?: number\r\n /** 默认每页条数(非受控) */\r\n defaultPageSize?: number\r\n /** 总条数(远程模式必填) */\r\n total?: number\r\n /** 可选每页条数 */\r\n pageSizeOptions?: number[]\r\n /** 显示条数选择器 */\r\n showSizeChanger?: boolean\r\n /** 显示快速跳页输入框 */\r\n showQuickJumper?: boolean\r\n /** 显示总条数 */\r\n showTotal?: boolean\r\n /** 简洁模式 */\r\n simple?: boolean\r\n /** 禁用分页 */\r\n disabled?: boolean\r\n /** 总条数文案前缀,默认「共 」 */\r\n prefix?: string\r\n}\r\n\r\n/**\r\n * 行选择配置\r\n */\r\nexport interface DataTableRowSelection<T = any> {\r\n /** 选择类型,默认 checkbox */\r\n type?: 'checkbox' | 'radio'\r\n /** 选中行 key(受控) */\r\n selectedRowKeys?: Array<string | number>\r\n /** 行复选框属性 */\r\n getCheckboxProps?: (row: T, index: number) => { disabled?: boolean }\r\n /** 禁用全部选择 */\r\n disabled?: boolean\r\n}\r\n\r\nexport interface DataTableSortInfo {\r\n columnKey: string\r\n order: DataTableSortOrder\r\n}\r\n\r\n/**\r\n * mac-data-table-change 事件详情\r\n */\r\nexport interface DataTableChangeDetail {\r\n page: number\r\n pageSize: number\r\n sorter: DataTableSortInfo | null\r\n}\r\n\r\n/**\r\n * mac-data-table-select 事件详情\r\n */\r\nexport interface DataTableSelectDetail<T = any> {\r\n selectedRowKeys: Array<string | number>\r\n selectedRows: T[]\r\n changedRow?: T\r\n changedRowKey?: string | number\r\n type: 'single' | 'multiple' | 'all'\r\n}\r\n\r\n/**\r\n * mac-data-table-sort 事件详情\r\n */\r\nexport interface DataTableSortDetail {\r\n sorter: DataTableSortInfo | null\r\n}\r\n\r\n/**\r\n * mac-data-table-row-click 事件详情\r\n */\r\nexport interface DataTableRowClickDetail<T = any> {\r\n row: T\r\n index: number\r\n}\r\n\r\nconst ICON = {\r\n chevronLeft: svg`<svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path d=\"M15 6l-6 6 6 6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>`,\r\n chevronRight: svg`<svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path d=\"M9 6l6 6-6 6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>`,\r\n caretUp: svg`<svg viewBox=\"0 0 24 24\" width=\"10\" height=\"10\" aria-hidden=\"true\"><path d=\"M6 14l6-6 6 6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>`,\r\n caretDown: svg`<svg viewBox=\"0 0 24 24\" width=\"10\" height=\"10\" aria-hidden=\"true\"><path d=\"M6 10l6 6 6-6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>`,\r\n}\r\n\r\n/**\r\n * @tag mac-data-table\r\n * @summary macOS 风格数据表格组件,支持可配置分页、排序与行选择。\r\n *\r\n * @slot title - 表格上方标题区域。\r\n * @slot footer - 分页上方底部区域(汇总等)。\r\n * @slot empty - 自定义空数据内容。\r\n *\r\n * @cssproperty --md-data-table-container-bg - 容器背景。\r\n * @cssproperty --md-data-table-container-border - 容器边框。\r\n * @cssproperty --md-data-table-container-radius - 容器圆角。\r\n * @cssproperty --md-data-table-header-bg - 表头背景。\r\n * @cssproperty --md-data-table-header-color - 表头文字颜色。\r\n * @cssproperty --md-data-table-row-hover-bg - 行悬停背景。\r\n * @cssproperty --md-data-table-row-selected-bg - 选中行背景。\r\n * @cssproperty --md-data-table-cell-padding - 单元格内边距。\r\n * @cssproperty --md-data-table-pagination-item-active-bg - 分页激活背景。\r\n *\r\n * @event mac-data-table-change - 分页或排序变化时触发。`detail: { page, pageSize, sorter }`\r\n * @event mac-data-table-select - 行选择变化时触发。`detail: { selectedRowKeys, selectedRows, type }`\r\n * @event mac-data-table-sort - 排序变化时触发。`detail: { sorter }`\r\n * @event mac-data-table-row-click - 行点击时触发。`detail: { row, index }`\r\n */\r\n@customElement('mac-data-table')\r\nexport class MacDataTable extends BaseElement {\r\n static override styles = [\r\n themeTokens,\r\n sharedStyles,\r\n css`\r\n :host {\r\n display: block;\r\n --md-data-table-container-bg: var(--md-color-bg);\r\n --md-data-table-container-border: var(--md-color-border);\r\n --md-data-table-container-radius: var(--md-radius-lg);\r\n }\r\n\r\n .container {\r\n background: var(--md-data-table-container-bg);\r\n border: 0.5px solid var(--md-data-table-container-border);\r\n border-radius: var(--md-data-table-container-radius);\r\n overflow: hidden;\r\n position: relative;\r\n }\r\n\r\n /* ─── Title slot ─── */\r\n .title-bar {\r\n padding: var(--md-spacing-md) var(--md-spacing-lg);\r\n border-bottom: 0.5px solid var(--md-data-table-cell-border);\r\n }\r\n .title-bar:empty {\r\n display: none;\r\n }\r\n\r\n /* ─── Table scroll wrapper ─── */\r\n .table-wrapper {\r\n overflow-x: auto;\r\n -webkit-overflow-scrolling: touch;\r\n }\r\n\r\n table {\r\n width: 100%;\r\n border-collapse: collapse;\r\n table-layout: auto;\r\n }\r\n\r\n thead th {\r\n background: var(--md-data-table-header-bg);\r\n color: var(--md-data-table-header-color);\r\n font-size: var(--md-data-table-header-font-size);\r\n font-weight: var(--md-data-table-header-font-weight);\r\n text-align: left;\r\n padding: var(--md-data-table-cell-padding);\r\n border-bottom: 0.5px solid var(--md-data-table-cell-border);\r\n white-space: nowrap;\r\n user-select: none;\r\n vertical-align: middle;\r\n }\r\n\r\n :host([sticky]) thead th {\r\n position: sticky;\r\n top: 0;\r\n z-index: 2;\r\n }\r\n\r\n tbody td {\r\n padding: var(--md-data-table-cell-padding);\r\n color: var(--md-data-table-cell-color);\r\n font-size: var(--md-data-table-row-font-size);\r\n border-bottom: 0.5px solid var(--md-data-table-cell-border);\r\n vertical-align: middle;\r\n }\r\n\r\n tbody tr:last-child td {\r\n border-bottom: none;\r\n }\r\n\r\n :host([bordered]) tbody td,\r\n :host([bordered]) thead th {\r\n border-right: 0.5px solid var(--md-data-table-cell-border);\r\n }\r\n :host([bordered]) tbody td:last-child,\r\n :host([bordered]) thead th:last-child {\r\n border-right: none;\r\n }\r\n\r\n tbody tr {\r\n background: var(--md-data-table-row-bg);\r\n transition: background var(--md-transition-fast);\r\n }\r\n tbody tr:hover {\r\n background: var(--md-data-table-row-hover-bg);\r\n }\r\n :host([striped]) tbody tr:nth-child(even) {\r\n background: var(--md-data-table-row-striped-bg);\r\n }\r\n :host([striped]) tbody tr:nth-child(even):hover {\r\n background: var(--md-data-table-row-hover-bg);\r\n }\r\n tbody tr.row-selected {\r\n background: var(--md-data-table-row-selected-bg);\r\n }\r\n tbody tr.row-selected:hover {\r\n background: var(--md-data-table-row-selected-hover-bg);\r\n }\r\n\r\n .cell {\r\n display: block;\r\n }\r\n .cell--ellipsis {\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n max-width: 100%;\r\n }\r\n\r\n .col-left {\r\n text-align: left;\r\n }\r\n .col-center {\r\n text-align: center;\r\n }\r\n .col-right {\r\n text-align: right;\r\n }\r\n\r\n /* ─── Sort indicator ─── */\r\n .th-inner {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: var(--md-spacing-xs);\r\n }\r\n .sort-trigger {\r\n display: inline-flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n cursor: pointer;\r\n line-height: 0;\r\n color: var(--md-data-table-sort-color);\r\n }\r\n .sort-trigger:hover {\r\n color: var(--md-data-table-sort-hover-color);\r\n }\r\n .sort-trigger .caret {\r\n opacity: 0.45;\r\n }\r\n .sort-trigger .caret.active {\r\n opacity: 1;\r\n color: var(--md-data-table-sort-active-color);\r\n }\r\n th.sortable {\r\n cursor: pointer;\r\n }\r\n\r\n /* ─── Selection checkbox / radio ─── */\r\n .checkbox,\r\n .radio {\r\n appearance: none;\r\n -webkit-appearance: none;\r\n width: 16px;\r\n height: 16px;\r\n margin: 0;\r\n border: 1.5px solid var(--md-color-border);\r\n background: transparent;\r\n cursor: pointer;\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n transition: all var(--md-transition-fast);\r\n flex-shrink: 0;\r\n vertical-align: middle;\r\n }\r\n .checkbox {\r\n border-radius: var(--md-radius-sm);\r\n }\r\n .radio {\r\n border-radius: 50%;\r\n }\r\n .checkbox:hover,\r\n .radio:hover {\r\n border-color: var(--md-color-primary);\r\n }\r\n .checkbox:checked,\r\n .checkbox:indeterminate {\r\n background: var(--md-color-primary);\r\n border-color: var(--md-color-primary);\r\n }\r\n .radio:checked {\r\n border-color: var(--md-color-primary);\r\n }\r\n .checkbox:checked::after {\r\n content: '';\r\n width: 9px;\r\n height: 5px;\r\n border-left: 2px solid #fff;\r\n border-bottom: 2px solid #fff;\r\n transform: rotate(-45deg) translate(1px, -1px);\r\n }\r\n .checkbox:indeterminate::after {\r\n content: '';\r\n width: 8px;\r\n height: 2px;\r\n background: #fff;\r\n }\r\n .radio:checked::after {\r\n content: '';\r\n width: 7px;\r\n height: 7px;\r\n border-radius: 50%;\r\n background: var(--md-color-primary);\r\n }\r\n .checkbox:disabled,\r\n .radio:disabled {\r\n cursor: not-allowed;\r\n opacity: 0.4;\r\n }\r\n\r\n .selection-cell {\r\n width: 40px;\r\n text-align: center;\r\n }\r\n\r\n /* ─── Empty / Loading ─── */\r\n .empty {\r\n text-align: center;\r\n color: var(--md-data-table-empty-color);\r\n font-size: var(--md-data-table-empty-font-size);\r\n padding: var(--md-data-table-empty-padding);\r\n }\r\n .empty td {\r\n border-bottom: none;\r\n }\r\n\r\n .loading-mask {\r\n position: absolute;\r\n inset: 0;\r\n background: rgba(255, 255, 255, 0.55);\r\n backdrop-filter: blur(2px);\r\n -webkit-backdrop-filter: blur(2px);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n z-index: 5;\r\n }\r\n :host([data-theme='dark']) .loading-mask {\r\n background: rgba(30, 30, 30, 0.55);\r\n }\r\n .spinner {\r\n width: 28px;\r\n height: 28px;\r\n border: 2.5px solid rgba(0, 122, 255, 0.2);\r\n border-top-color: var(--md-color-primary);\r\n border-radius: 50%;\r\n animation: mac-dt-spin 0.7s linear infinite;\r\n }\r\n @keyframes mac-dt-spin {\r\n to {\r\n transform: rotate(360deg);\r\n }\r\n }\r\n\r\n /* ─── Footer slot ─── */\r\n .footer-slot {\r\n padding: var(--md-data-table-footer-padding);\r\n border-top: 0.5px solid var(--md-data-table-footer-border);\r\n background: var(--md-data-table-footer-bg);\r\n }\r\n .footer-slot:empty {\r\n display: none;\r\n }\r\n\r\n /* ─── Pagination ─── */\r\n .pagination {\r\n display: flex;\r\n align-items: center;\r\n flex-wrap: wrap;\r\n gap: var(--md-data-table-pagination-gap);\r\n padding: var(--md-data-table-pagination-padding);\r\n border-top: 0.5px solid var(--md-data-table-footer-border);\r\n background: var(--md-data-table-footer-bg);\r\n }\r\n .pagination--simple {\r\n justify-content: space-between;\r\n }\r\n\r\n .pagination-total {\r\n color: var(--md-data-table-pagination-color);\r\n font-size: var(--md-data-table-pagination-font-size);\r\n margin-right: auto;\r\n }\r\n\r\n .pagination-list {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--md-spacing-xs);\r\n }\r\n\r\n .pg-btn {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n min-width: var(--md-data-table-pagination-item-min-width);\r\n height: var(--md-data-table-pagination-item-height);\r\n padding: 0 var(--md-spacing-xs);\r\n border: 0.5px solid var(--md-data-table-pagination-item-border);\r\n border-radius: var(--md-data-table-pagination-item-radius);\r\n background: var(--md-data-table-pagination-item-bg);\r\n color: var(--md-data-table-pagination-item-color);\r\n font-size: var(--md-data-table-pagination-font-size);\r\n cursor: pointer;\r\n transition: all var(--md-transition-fast);\r\n user-select: none;\r\n line-height: 1;\r\n }\r\n .pg-btn:hover:not(:disabled):not(.active) {\r\n background: var(--md-data-table-pagination-item-hover-bg);\r\n border-color: var(--md-data-table-pagination-item-hover-border);\r\n }\r\n .pg-btn.active {\r\n background: var(--md-data-table-pagination-item-active-bg);\r\n border-color: var(--md-data-table-pagination-item-active-border);\r\n color: var(--md-data-table-pagination-item-active-color);\r\n cursor: default;\r\n }\r\n .pg-btn:disabled {\r\n opacity: var(--md-data-table-pagination-item-disabled-opacity);\r\n cursor: not-allowed;\r\n }\r\n .pg-ellipsis {\r\n min-width: var(--md-data-table-pagination-item-min-width);\r\n height: var(--md-data-table-pagination-item-height);\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n color: var(--md-data-table-pagination-ellipsis-color);\r\n }\r\n\r\n .pg-size,\r\n .pg-jumper {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: var(--md-spacing-xs);\r\n color: var(--md-data-table-pagination-color);\r\n font-size: var(--md-data-table-pagination-font-size);\r\n }\r\n\r\n .pg-size select {\r\n height: var(--md-data-table-pagination-item-height);\r\n min-width: var(--md-data-table-pagination-size-select-width);\r\n padding: 0 var(--md-spacing-xs);\r\n border: 0.5px solid var(--md-data-table-pagination-item-border);\r\n border-radius: var(--md-data-table-pagination-item-radius);\r\n background: var(--md-data-table-pagination-item-bg);\r\n color: var(--md-data-table-pagination-item-color);\r\n font-size: var(--md-data-table-pagination-font-size);\r\n cursor: pointer;\r\n }\r\n .pg-size select:focus {\r\n outline: none;\r\n border-color: var(--md-color-primary);\r\n }\r\n\r\n .pg-jumper input {\r\n width: var(--md-data-table-pagination-jumper-input-width);\r\n height: var(--md-data-table-pagination-item-height);\r\n padding: 0 var(--md-spacing-xs);\r\n border: 0.5px solid var(--md-data-table-pagination-item-border);\r\n border-radius: var(--md-data-table-pagination-item-radius);\r\n background: var(--md-data-table-pagination-item-bg);\r\n color: var(--md-data-table-pagination-item-color);\r\n font-size: var(--md-data-table-pagination-font-size);\r\n text-align: center;\r\n }\r\n .pg-jumper input:focus {\r\n outline: none;\r\n border-color: var(--md-color-primary);\r\n }\r\n\r\n .pagination--disabled .pg-btn,\r\n .pagination--disabled select,\r\n .pagination--disabled input {\r\n pointer-events: none;\r\n opacity: var(--md-data-table-pagination-item-disabled-opacity);\r\n }\r\n\r\n .pg-simple-input {\r\n width: 48px;\r\n height: var(--md-data-table-pagination-item-height);\r\n text-align: center;\r\n border: 0.5px solid var(--md-data-table-pagination-item-border);\r\n border-radius: var(--md-data-table-pagination-item-radius);\r\n background: var(--md-data-table-pagination-item-bg);\r\n color: var(--md-data-table-pagination-item-color);\r\n font-size: var(--md-data-table-pagination-font-size);\r\n }\r\n .pg-simple-input:focus {\r\n outline: none;\r\n border-color: var(--md-color-primary);\r\n }\r\n .pg-simple-slash {\r\n color: var(--md-data-table-pagination-color);\r\n font-size: var(--md-data-table-pagination-font-size);\r\n }\r\n\r\n /* ─── Size variants ─── */\r\n :host([size='sm']) {\r\n --md-data-table-cell-padding: var(--sm-data-table-cell-padding);\r\n --md-data-table-header-font-size: var(--sm-data-table-header-font-size);\r\n --md-data-table-row-font-size: var(--sm-data-table-row-font-size);\r\n }\r\n :host([size='lg']) {\r\n --md-data-table-cell-padding: var(--lg-data-table-cell-padding);\r\n --md-data-table-header-font-size: var(--lg-data-table-header-font-size);\r\n --md-data-table-row-font-size: var(--lg-data-table-row-font-size);\r\n }\r\n\r\n /* ─── Dark theme ─── */\r\n :host([data-theme='dark']) {\r\n --md-data-table-container-bg: rgba(40, 40, 40, 0.85);\r\n --md-data-table-container-border: rgba(255, 255, 255, 0.08);\r\n --md-data-table-header-bg: rgba(255, 255, 255, 0.04);\r\n --md-data-table-header-color: rgba(255, 255, 255, 0.55);\r\n --md-data-table-cell-color: rgba(255, 255, 255, 0.88);\r\n --md-data-table-cell-border: rgba(255, 255, 255, 0.06);\r\n --md-data-table-footer-border: rgba(255, 255, 255, 0.08);\r\n --md-data-table-footer-bg: rgba(255, 255, 255, 0.03);\r\n --md-data-table-empty-color: rgba(255, 255, 255, 0.45);\r\n --md-data-table-pagination-item-border: rgba(255, 255, 255, 0.12);\r\n --md-data-table-pagination-color: rgba(255, 255, 255, 0.55);\r\n }\r\n\r\n /* ─── Mobile ─── */\r\n @media (max-width: 768px) {\r\n .pagination {\r\n justify-content: center;\r\n }\r\n .pagination-total {\r\n width: 100%;\r\n text-align: center;\r\n margin-right: 0;\r\n }\r\n }\r\n `,\r\n ]\r\n\r\n /** 列定义 */\r\n @property({ type: Array }) columns: DataTableColumn[] = []\r\n\r\n /** 数据源 */\r\n @property({ type: Array }) data: any[] = []\r\n\r\n /** 行 key 字段名或取值函数(缺省用索引) */\r\n @property({ attribute: 'row-key' }) rowKey?: string | ((record: any) => string | number)\r\n\r\n /** 行类名生成函数 */\r\n @property() rowClassName?: (row: any, index: number) => string\r\n\r\n /** 分页配置:false 关闭,true 默认开启,对象为详细配置 */\r\n @property({ attribute: false }) pagination: boolean | DataTablePagination = true\r\n\r\n /** 行选择配置 */\r\n @property({ attribute: false }) rowSelection?: DataTableRowSelection\r\n\r\n /** 远程模式:组件不本地分页/排序,仅触发事件由外部处理 */\r\n @property({ type: Boolean, reflect: true }) remote = false\r\n\r\n /** 边框样式 */\r\n @property({ type: Boolean, reflect: true }) bordered = false\r\n\r\n /** 斑马纹 */\r\n @property({ type: Boolean, reflect: true }) striped = false\r\n\r\n /** 表头吸顶 */\r\n @property({ type: Boolean, reflect: true }) sticky = false\r\n\r\n /** 加载中 */\r\n @property({ type: Boolean, reflect: true }) loading = false\r\n\r\n /** 空数据文案 */\r\n @property({ attribute: 'empty-text' }) emptyText = '暂无数据'\r\n\r\n /** 组件尺寸 */\r\n @property({ reflect: true }) size?: 'sm' | 'md' | 'lg'\r\n\r\n @state() private _internalPage = 1\r\n @state() private _internalPageSize = 10\r\n @state() private _internalSelectedKeys: Array<string | number> = []\r\n @state() private _sortColumn: string | null = null\r\n @state() private _sortOrder: DataTableSortOrder | null = null\r\n @state() private _processedData: any[] = []\r\n\r\n private _sortInitialized = false\r\n\r\n override connectedCallback() {\r\n super.connectedCallback()\r\n this._initDefaults()\r\n }\r\n\r\n override willUpdate(changed: Map<string, unknown>) {\r\n const size = this._resolvedSize\r\n if (this.getAttribute('size') !== size) {\r\n this.setAttribute('size', size)\r\n }\r\n const theme = this._resolvedTheme\r\n if (theme) {\r\n this.setAttribute('data-theme', theme)\r\n } else {\r\n this.removeAttribute('data-theme')\r\n }\r\n\r\n this._initDefaults()\r\n\r\n // Initialize default sort before computing processed data so the first\r\n // render already reflects the default sort order.\r\n if (!this._sortInitialized && this.columns?.length) {\r\n const col = this.columns.find((c) => c.defaultSortOrder)\r\n if (col) {\r\n this._sortColumn = col.key\r\n this._sortOrder = col.defaultSortOrder!\r\n }\r\n this._sortInitialized = true\r\n }\r\n\r\n if (\r\n changed.has('data') ||\r\n changed.has('columns') ||\r\n changed.has('_sortColumn') ||\r\n changed.has('_sortOrder') ||\r\n changed.has('remote')\r\n ) {\r\n this._processedData = this._computeProcessedData()\r\n }\r\n\r\n if (changed.has('data') || changed.has('_internalPageSize') || changed.has('pagination')) {\r\n this._clampPage()\r\n }\r\n }\r\n\r\n private _initDefaults() {\r\n const cfg = this._paginationConfig\r\n if (cfg) {\r\n if (this._internalPage === 1 && typeof cfg.defaultCurrent === 'number') {\r\n this._internalPage = cfg.defaultCurrent\r\n }\r\n if (this._internalPageSize === 10 && typeof cfg.defaultPageSize === 'number') {\r\n this._internalPageSize = cfg.defaultPageSize\r\n }\r\n }\r\n }\r\n\r\n // ─── Pagination getters ───\r\n\r\n private get _paginationConfig(): DataTablePagination | null {\r\n if (this.pagination === false || this.pagination == null) return null\r\n if (this.pagination === true) return {}\r\n return this.pagination\r\n }\r\n\r\n private get _isPageControlled(): boolean {\r\n const cfg = this._paginationConfig\r\n return !!cfg && typeof cfg.current === 'number'\r\n }\r\n\r\n private get _isPageSizeControlled(): boolean {\r\n const cfg = this._paginationConfig\r\n return !!cfg && typeof cfg.pageSize === 'number'\r\n }\r\n\r\n private get _effectivePage(): number {\r\n const cfg = this._paginationConfig\r\n if (cfg && typeof cfg.current === 'number') return cfg.current\r\n return this._internalPage\r\n }\r\n\r\n private get _effectivePageSize(): number {\r\n const cfg = this._paginationConfig\r\n if (cfg && typeof cfg.pageSize === 'number') return cfg.pageSize\r\n return this._internalPageSize\r\n }\r\n\r\n private get _effectiveTotal(): number {\r\n const cfg = this._paginationConfig\r\n if (cfg && typeof cfg.total === 'number') return cfg.total\r\n return this._processedData.length\r\n }\r\n\r\n private get _pageCount(): number {\r\n return Math.max(1, Math.ceil(this._effectiveTotal / this._effectivePageSize))\r\n }\r\n\r\n private _clampPage() {\r\n const cfg = this._paginationConfig\r\n if (!cfg) return\r\n const pageCount = this._pageCount\r\n if (this._internalPage > pageCount) this._internalPage = pageCount\r\n if (this._internalPage < 1) this._internalPage = 1\r\n }\r\n\r\n // ─── Data processing ───\r\n\r\n private _computeProcessedData(): any[] {\r\n if (this.remote || !this._sortColumn || !this._sortOrder) return this.data ?? []\r\n const col = this.columns?.find((c) => c.key === this._sortColumn)\r\n if (!col?.sorter) return this.data ?? []\r\n const sorted = [...(this.data ?? [])]\r\n sorted.sort((a, b) => {\r\n const r = col.sorter!(a, b)\r\n return this._sortOrder === 'desc' ? -r : r\r\n })\r\n return sorted\r\n }\r\n\r\n private get _displayEntries(): { row: any; index: number }[] {\r\n const source = this.remote ? this.data : this._processedData\r\n const arr = source ?? []\r\n const cfg = this._paginationConfig\r\n if (!cfg || this.remote) {\r\n return arr.map((row, index) => ({ row, index }))\r\n }\r\n const start = (this._effectivePage - 1) * this._effectivePageSize\r\n const end = start + this._effectivePageSize\r\n const entries: { row: any; index: number }[] = []\r\n for (let i = start; i < Math.min(end, arr.length); i++) {\r\n entries.push({ row: arr[i], index: i })\r\n }\r\n return entries\r\n }\r\n\r\n private get _currentSortInfo(): DataTableSortInfo | null {\r\n if (!this._sortColumn || !this._sortOrder) return null\r\n return { columnKey: this._sortColumn, order: this._sortOrder }\r\n }\r\n\r\n // ─── Row key & selection ───\r\n\r\n private _getRowKey(row: any, index: number): string | number {\r\n if (typeof this.rowKey === 'function') return this.rowKey(row)\r\n if (typeof this.rowKey === 'string') return row?.[this.rowKey]\r\n return index\r\n }\r\n\r\n private get _isSelectionControlled(): boolean {\r\n return !!this.rowSelection && Array.isArray(this.rowSelection.selectedRowKeys)\r\n }\r\n\r\n private get _selectedKeys(): Array<string | number> {\r\n if (this._isSelectionControlled) return this.rowSelection!.selectedRowKeys!\r\n return this._internalSelectedKeys\r\n }\r\n\r\n private get _selectedKeySet(): Set<string | number> {\r\n return new Set(this._selectedKeys)\r\n }\r\n\r\n private _isRowDisabled(row: any, index: number): boolean {\r\n return !!this.rowSelection?.getCheckboxProps?.(row, index)?.disabled\r\n }\r\n\r\n private _emitSelect(\r\n selectedRowKeys: Array<string | number>,\r\n type: 'single' | 'multiple' | 'all',\r\n changedRow?: any,\r\n changedRowKey?: string | number,\r\n ) {\r\n const keySet = new Set(selectedRowKeys)\r\n const source = this.remote ? this.data : this._processedData\r\n const selectedRows = (source ?? []).filter(\r\n (r, i) => keySet.has(this._getRowKey(r, i)),\r\n )\r\n if (!this._isSelectionControlled) {\r\n this._internalSelectedKeys = selectedRowKeys\r\n }\r\n this.emit('mac-data-table-select', {\r\n detail: { selectedRowKeys, selectedRows, type, changedRow, changedRowKey },\r\n })\r\n }\r\n\r\n private _handleRowSelect(row: any, index: number, checked: boolean) {\r\n const key = this._getRowKey(row, index)\r\n const selType = this.rowSelection?.type ?? 'checkbox'\r\n if (selType === 'radio') {\r\n this._emitSelect([key], 'single', row, key)\r\n return\r\n }\r\n const cur = new Set(this._selectedKeys)\r\n if (checked) cur.add(key)\r\n else cur.delete(key)\r\n this._emitSelect([...cur], 'multiple', row, key)\r\n }\r\n\r\n private _handleSelectAll(checked: boolean) {\r\n const source = this.remote ? this.data : this._processedData\r\n let newKeys: Array<string | number>\r\n if (checked) {\r\n newKeys = []\r\n ;(source ?? []).forEach((r, i) => {\r\n if (!this._isRowDisabled(r, i)) newKeys.push(this._getRowKey(r, i))\r\n })\r\n } else {\r\n newKeys = []\r\n }\r\n this._emitSelect(newKeys, 'all')\r\n }\r\n\r\n // ─── Sort ───\r\n\r\n private _handleSortClick(col: DataTableColumn) {\r\n if (!col.sortable) return\r\n const directions = col.sortDirections ?? ['asc', 'desc']\r\n let nextOrder: DataTableSortOrder | null\r\n if (this._sortColumn === col.key && this._sortOrder) {\r\n const idx = directions.indexOf(this._sortOrder)\r\n nextOrder = idx >= 0 && idx < directions.length - 1 ? directions[idx + 1] : null\r\n } else {\r\n nextOrder = directions[0] ?? null\r\n }\r\n this._sortColumn = nextOrder ? col.key : null\r\n this._sortOrder = nextOrder\r\n if (!this._isPageControlled) this._internalPage = 1\r\n const sorter = this._currentSortInfo\r\n this.emit('mac-data-table-sort', { detail: { sorter } })\r\n this.emit('mac-data-table-change', {\r\n detail: { page: 1, pageSize: this._effectivePageSize, sorter },\r\n })\r\n }\r\n\r\n // ─── Pagination actions ───\r\n\r\n private _gotoPage(page: number, pageSize?: number) {\r\n const cfg = this._paginationConfig\r\n if (!cfg || cfg.disabled) return\r\n const newSize = pageSize ?? this._effectivePageSize\r\n const sizeChanged = newSize !== this._effectivePageSize\r\n const pageCount = Math.max(1, Math.ceil(this._effectiveTotal / newSize))\r\n let target = sizeChanged ? 1 : page\r\n target = Math.min(Math.max(1, target), pageCount)\r\n if (!this._isPageControlled) this._internalPage = target\r\n if (!this._isPageSizeControlled) this._internalPageSize = newSize\r\n this.emit('mac-data-table-change', {\r\n detail: {\r\n page: target,\r\n pageSize: newSize,\r\n sorter: this._currentSortInfo,\r\n },\r\n })\r\n }\r\n\r\n private _handleQuickJumper(e: KeyboardEvent) {\r\n if (e.key !== 'Enter') return\r\n const input = e.target as HTMLInputElement\r\n const val = parseInt(input.value, 10)\r\n if (!Number.isNaN(val)) {\r\n this._gotoPage(val)\r\n }\r\n input.value = ''\r\n }\r\n\r\n private _handleSimpleJumper(e: KeyboardEvent) {\r\n if (e.key !== 'Enter') return\r\n const input = e.target as HTMLInputElement\r\n const val = parseInt(input.value, 10)\r\n if (!Number.isNaN(val)) {\r\n this._gotoPage(val)\r\n }\r\n }\r\n\r\n private _handleSizeChange(e: Event) {\r\n const select = e.target as HTMLSelectElement\r\n const val = parseInt(select.value, 10)\r\n if (!Number.isNaN(val)) this._gotoPage(this._effectivePage, val)\r\n }\r\n\r\n // ─── Page list computation ───\r\n\r\n private _getPageList(): Array<number | 'ellipsis'> {\r\n const pageCount = this._pageCount\r\n const current = this._effectivePage\r\n if (pageCount <= 7) {\r\n return Array.from({ length: pageCount }, (_, i) => i + 1)\r\n }\r\n const pages: Array<number | 'ellipsis'> = [1]\r\n const left = Math.max(2, current - 1)\r\n const right = Math.min(pageCount - 1, current + 1)\r\n if (left > 2) pages.push('ellipsis')\r\n for (let i = left; i <= right; i++) pages.push(i)\r\n if (right < pageCount - 1) pages.push('ellipsis')\r\n pages.push(pageCount)\r\n return pages\r\n }\r\n\r\n // ─── Cell rendering ───\r\n\r\n private _renderCellContent(row: any, index: number, col: DataTableColumn): unknown {\r\n if (col.render) {\r\n return col.render(row, index, col)\r\n }\r\n const field = col.dataIndex ?? col.key\r\n const val = row?.[field]\r\n return val == null ? '' : String(val)\r\n }\r\n\r\n private _alignClass(align?: string): string {\r\n return align === 'center' ? 'col-center' : align === 'right' ? 'col-right' : 'col-left'\r\n }\r\n\r\n private _widthStyle(width?: string | number): string | undefined {\r\n if (width == null) return undefined\r\n return typeof width === 'number' ? `${width}px` : width\r\n }\r\n\r\n // ─── Render ───\r\n\r\n override render() {\r\n const hasSelection = !!this.rowSelection\r\n const entries = this._displayEntries\r\n const isEmpty = entries.length === 0\r\n\r\n return html`\r\n <div class=\"container\">\r\n <div class=\"title-bar\"><slot name=\"title\"></slot></div>\r\n <div class=\"table-wrapper\">\r\n <table>\r\n ${this._renderHeader(hasSelection)}\r\n <tbody>\r\n ${isEmpty\r\n ? html`<tr class=\"empty\">\r\n <td colspan=${this._colspan(hasSelection)}>\r\n <slot name=\"empty\">${this.emptyText}</slot>\r\n </td>\r\n </tr>`\r\n : entries.map(({ row, index }) => this._renderRow(row, index, hasSelection))}\r\n </tbody>\r\n </table>\r\n </div>\r\n <div class=\"footer-slot\"><slot name=\"footer\"></slot></div>\r\n ${this._renderPagination()}\r\n ${this.loading\r\n ? html`<div class=\"loading-mask\"><div class=\"spinner\"></div></div>`\r\n : nothing}\r\n </div>\r\n `\r\n }\r\n\r\n private _colspan(hasSelection: boolean): number {\r\n return this.columns.length + (hasSelection ? 1 : 0)\r\n }\r\n\r\n private _renderHeader(hasSelection: boolean) {\r\n if (!this.columns?.length) return nothing\r\n return html`\r\n <thead>\r\n <tr>\r\n ${hasSelection ? this._renderSelectionHeader() : nothing}\r\n ${this.columns.map((col) => this._renderTh(col))}\r\n </tr>\r\n </thead>\r\n `\r\n }\r\n\r\n private _renderSelectionHeader() {\r\n const selType = this.rowSelection?.type ?? 'checkbox'\r\n if (selType === 'radio') {\r\n return html`<th class=\"selection-cell\"></th>`\r\n }\r\n const source = this.remote ? this.data : this._processedData\r\n const selectable = (source ?? [])\r\n .map((r, i) => ({ key: this._getRowKey(r, i), disabled: this._isRowDisabled(r, i) }))\r\n .filter((x) => !x.disabled)\r\n const keySet = this._selectedKeySet\r\n const checkedCount = selectable.filter((s) => keySet.has(s.key)).length\r\n const allChecked = selectable.length > 0 && checkedCount === selectable.length\r\n const indeterminate = checkedCount > 0 && checkedCount < selectable.length\r\n return html`\r\n <th class=\"selection-cell\">\r\n <input\r\n type=\"checkbox\"\r\n class=\"checkbox\"\r\n .checked=${allChecked}\r\n .indeterminate=${indeterminate}\r\n ?disabled=${this.rowSelection?.disabled || selectable.length === 0}\r\n @change=${(e: Event) =>\r\n this._handleSelectAll((e.target as HTMLInputElement).checked)}\r\n />\r\n </th>\r\n `\r\n }\r\n\r\n private _renderTh(col: DataTableColumn) {\r\n const isActive = this._sortColumn === col.key\r\n const order = isActive ? this._sortOrder : null\r\n const alignClass = this._alignClass(col.align)\r\n const thClasses = classMap({\r\n sortable: !!col.sortable,\r\n [alignClass]: true,\r\n })\r\n\r\n return html`\r\n <th\r\n class=${thClasses}\r\n style=${ifDefined(this._widthStyle(col.width) ? `width: ${this._widthStyle(col.width)}` : undefined)}\r\n @click=${() => this._handleSortClick(col)}\r\n >\r\n <span class=\"th-inner\">\r\n <span>${col.title}</span>\r\n ${col.sortable\r\n ? html`<span class=\"sort-trigger\">\r\n <span class=${classMap({ caret: true, active: isActive && order === 'asc' })}>\r\n ${ICON.caretUp}\r\n </span>\r\n <span class=${classMap({ caret: true, active: isActive && order === 'desc' })}>\r\n ${ICON.caretDown}\r\n </span>\r\n </span>`\r\n : nothing}\r\n </span>\r\n </th>\r\n `\r\n }\r\n\r\n private _renderRow(row: any, index: number, hasSelection: boolean) {\r\n const key = this._getRowKey(row, index)\r\n const selected = this._selectedKeySet.has(key)\r\n const customClass = this.rowClassName?.(row, index) ?? ''\r\n const classes = classMap({\r\n 'row-selected': selected,\r\n [customClass]: !!customClass,\r\n })\r\n\r\n return html`\r\n <tr\r\n class=${classes}\r\n @click=${() =>\r\n this.emit('mac-data-table-row-click', { detail: { row, index } })}\r\n >\r\n ${hasSelection ? this._renderSelectionCell(row, index, selected) : nothing}\r\n ${this.columns.map((col) => this._renderTd(row, index, col))}\r\n </tr>\r\n `\r\n }\r\n\r\n private _renderSelectionCell(row: any, index: number, selected: boolean) {\r\n const selType = this.rowSelection?.type ?? 'checkbox'\r\n const disabled = this._isRowDisabled(row, index) || !!this.rowSelection?.disabled\r\n return html`\r\n <td class=\"selection-cell\">\r\n <input\r\n type=${selType === 'radio' ? 'radio' : 'checkbox'}\r\n class=${selType === 'radio' ? 'radio' : 'checkbox'}\r\n .checked=${selected}\r\n ?disabled=${disabled}\r\n @click=${(e: Event) => e.stopPropagation()}\r\n @change=${(e: Event) => {\r\n if (selType === 'radio') {\r\n if (!disabled) this._handleRowSelect(row, index, true)\r\n } else {\r\n this._handleRowSelect(row, index, (e.target as HTMLInputElement).checked)\r\n }\r\n }}\r\n />\r\n </td>\r\n `\r\n }\r\n\r\n private _renderTd(row: any, index: number, col: DataTableColumn) {\r\n const alignClass = this._alignClass(col.align)\r\n const content = this._renderCellContent(row, index, col)\r\n const cellClass = col.ellipsis\r\n ? `cell cell--ellipsis ${alignClass}`\r\n : `cell ${alignClass}`\r\n const titleAttr = col.ellipsis && typeof content === 'string' ? content : undefined\r\n\r\n return html`\r\n <td class=${alignClass} style=${ifDefined(this._widthStyle(col.width) ? `width: ${this._widthStyle(col.width)}` : undefined)}>\r\n <span class=${cellClass} title=${ifDefined(titleAttr)}>${content}</span>\r\n </td>\r\n `\r\n }\r\n\r\n // ─── Pagination render ───\r\n\r\n private _renderPagination() {\r\n const cfg = this._paginationConfig\r\n if (!cfg) return nothing\r\n\r\n const current = this._effectivePage\r\n const pageSize = this._effectivePageSize\r\n const total = this._effectiveTotal\r\n const pageCount = this._pageCount\r\n const disabled = !!cfg.disabled\r\n const pageSizeOptions = cfg.pageSizeOptions ?? [10, 20, 50, 100]\r\n const showSizeChanger = cfg.showSizeChanger ?? pageSizeOptions.length > 1\r\n const showQuickJumper = cfg.showQuickJumper ?? false\r\n const showTotal = cfg.showTotal ?? true\r\n const simple = cfg.simple ?? false\r\n const prefix = cfg.prefix ?? '共 '\r\n\r\n const prevDisabled = disabled || current <= 1\r\n const nextDisabled = disabled || current >= pageCount\r\n\r\n if (simple) {\r\n return html`\r\n <div class=${classMap({ pagination: true, 'pagination--simple': true, 'pagination--disabled': disabled })}>\r\n <button\r\n class=\"pg-btn\"\r\n ?disabled=${prevDisabled}\r\n @click=${() => this._gotoPage(current - 1)}\r\n aria-label=\"上一页\"\r\n >\r\n ${ICON.chevronLeft}\r\n </button>\r\n <span class=\"pg-simple-wrap\" style=\"display:inline-flex;align-items:center;gap:6px;\">\r\n <input\r\n class=\"pg-simple-input\"\r\n type=\"number\"\r\n min=\"1\"\r\n max=${pageCount}\r\n .value=${String(current)}\r\n ?disabled=${disabled}\r\n @keydown=${this._handleSimpleJumper}\r\n />\r\n <span class=\"pg-simple-slash\">/ ${pageCount}</span>\r\n </span>\r\n <button\r\n class=\"pg-btn\"\r\n ?disabled=${nextDisabled}\r\n @click=${() => this._gotoPage(current + 1)}\r\n aria-label=\"下一页\"\r\n >\r\n ${ICON.chevronRight}\r\n </button>\r\n </div>\r\n `\r\n }\r\n\r\n const pageList = this._getPageList()\r\n const start = total === 0 ? 0 : (current - 1) * pageSize + 1\r\n const end = Math.min(current * pageSize, total)\r\n\r\n return html`\r\n <div class=${classMap({ pagination: true, 'pagination--disabled': disabled })}>\r\n ${showTotal\r\n ? html`<span class=\"pagination-total\"\r\n >${prefix}${total} 条${total > 0 ? ` · 第 ${start}-${end} 条` : ''}</span\r\n >`\r\n : nothing}\r\n <div class=\"pagination-list\">\r\n <button\r\n class=\"pg-btn\"\r\n ?disabled=${prevDisabled}\r\n @click=${() => this._gotoPage(current - 1)}\r\n aria-label=\"上一页\"\r\n >\r\n ${ICON.chevronLeft}\r\n </button>\r\n ${pageList.map((p) =>\r\n p === 'ellipsis'\r\n ? html`<span class=\"pg-ellipsis\">…</span>`\r\n : html`<button\r\n class=${classMap({ 'pg-btn': true, active: p === current })}\r\n ?disabled=${disabled}\r\n @click=${() => this._gotoPage(p as number)}\r\n >\r\n ${p}\r\n </button>`,\r\n )}\r\n <button\r\n class=\"pg-btn\"\r\n ?disabled=${nextDisabled}\r\n @click=${() => this._gotoPage(current + 1)}\r\n aria-label=\"下一页\"\r\n >\r\n ${ICON.chevronRight}\r\n </button>\r\n </div>\r\n ${showSizeChanger\r\n ? html`<span class=\"pg-size\">\r\n <select\r\n ?disabled=${disabled}\r\n @change=${this._handleSizeChange}\r\n .value=${String(pageSize)}\r\n >\r\n ${pageSizeOptions.map(\r\n (opt) =>\r\n html`<option value=${opt} ?selected=${opt === pageSize}>\r\n ${opt} 条/页\r\n </option>`,\r\n )}\r\n </select>\r\n </span>`\r\n : nothing}\r\n ${showQuickJumper\r\n ? html`<span class=\"pg-jumper\">\r\n 跳至<input\r\n type=\"number\"\r\n min=\"1\"\r\n ?disabled=${disabled}\r\n @keydown=${this._handleQuickJumper}\r\n />页\r\n </span>`\r\n : nothing}\r\n </div>\r\n `\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'mac-data-table': MacDataTable\r\n }\r\n}\r\n"],"x_google_ignoreList":[0,1,2,3,4,5,6,7,53,54,55,56],"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;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;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;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;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;AAAA,GCW/B,KAAA,cAAwB,EAAY;AAAA;gCAgHgC,2BAMlB,mBAGD,gBAGJ;AAAA;;kBA3HzB;AAAA,MACvB;AAAA,MACA;AAAA,MACA;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,IAyGF;AAAA;EAiBA,aAAsB;AACpB,UAAM,IAAO,KAAK;AAClB,IAAI,KAAK,aAAa,MAAM,MAAM,KAChC,KAAK,aAAa,QAAQ,CAAI;AAEhC,UAAM,IAAQ,KAAK;AACnB,IAAI,IACF,KAAK,aAAa,cAAc,CAAK,IAErC,KAAK,gBAAgB,YAAY;AAAA,EAErC;AAAA,EAEA,SAAkB;AAChB,UAAM,IAAa,KAAK,YAAY,KAAK,SACnC,IAAO,KAAK;AAElB,WAAO;AAAA;AAAA;AAAA,gCAGqB,KAAK,OAAA,YAAmB,CAAA,IAC9C,KAAK,UAAU,oBAAoB,EAAA;AAAA,oBAEzB,CAAA;AAAA,eACL,KAAK,IAAA;AAAA,iBACH,KAAK,YAAA;AAAA;AAAA,UAEZ,KAAK,UAAU,kDAAqD,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM5E;AAAA,EAEA,eAAuB;AACrB,SAAK,KAAK,WAAW;AAAA,EACvB;AACF;GApDG,EAAS,EAAE,SAAS,GAAK,CAAC,CAAA,GAAA,GAAA,WAAA,WAAA,MAAA;GAG1B,EAAS,EAAE,SAAS,GAAK,CAAC,CAAA,GAAA,GAAA,WAAA,QAAA,MAAA;GAG1B,EAAS;AAAA,EAAE,MAAM;AAAA,EAAS,SAAS;AAAK,CAAC,CAAA,GAAA,GAAA,WAAA,YAAA,MAAA;GAGzC,EAAS;AAAA,EAAE,MAAM;AAAA,EAAS,SAAS;AAAK,CAAC,CAAA,GAAA,GAAA,WAAA,WAAA,MAAA;GAGzC,EAAS,CAAA,GAAA,GAAA,WAAA,QAAA,MAAA;QA7HX,EAAc,YAAY,CAAA,GAAA,EAAA;ACCpB,IAAA,KAAA,cAAsB,EAAY;AAAA;gCAuiBrC,4BAGsD,qBAGA,mBAGF;AAAA;;kBA/iB7B;AAAA,MACvB;AAAA,MACA;AAAA,MACA;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;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;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AAA;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,IAuaF;AAAA;EAuCA,IAAY,QAAQ;AAClB,WAAO,KAA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;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;AAAA;AAAA;AAAA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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;AAAA;AAAA;AA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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;AAAA;AAAA;AAAA;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"}
|