@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.
Files changed (125) hide show
  1. package/README.md +940 -0
  2. package/dist/favicon.svg +1 -0
  3. package/dist/mac-ui.cjs.js +12367 -0
  4. package/dist/mac-ui.cjs.js.map +1 -0
  5. package/dist/mac-ui.es.js +18444 -0
  6. package/dist/mac-ui.es.js.map +1 -0
  7. package/dist/mac-ui.umd.js +12367 -0
  8. package/dist/mac-ui.umd.js.map +1 -0
  9. package/dist/types/components/alert/index.d.ts +1 -0
  10. package/dist/types/components/alert/mac-alert.d.ts +38 -0
  11. package/dist/types/components/alert/mac-alert.stories.d.ts +15 -0
  12. package/dist/types/components/animation/animations.d.ts +97 -0
  13. package/dist/types/components/animation/index.d.ts +3 -0
  14. package/dist/types/components/animation/mac-animation.d.ts +67 -0
  15. package/dist/types/components/animation/mac-animation.stories.d.ts +9 -0
  16. package/dist/types/components/button/index.d.ts +1 -0
  17. package/dist/types/components/button/mac-button.d.ts +37 -0
  18. package/dist/types/components/button/mac-button.stories.d.ts +14 -0
  19. package/dist/types/components/card/index.d.ts +1 -0
  20. package/dist/types/components/card/mac-card.d.ts +38 -0
  21. package/dist/types/components/card/mac-card.stories.d.ts +14 -0
  22. package/dist/types/components/carousel/index.d.ts +1 -0
  23. package/dist/types/components/carousel/mac-carousel.d.ts +105 -0
  24. package/dist/types/components/carousel/mac-carousel.stories.d.ts +18 -0
  25. package/dist/types/components/checkbox/index.d.ts +2 -0
  26. package/dist/types/components/checkbox/mac-checkbox.d.ts +94 -0
  27. package/dist/types/components/checkbox/mac-checkbox.stories.d.ts +17 -0
  28. package/dist/types/components/config-provider/index.d.ts +1 -0
  29. package/dist/types/components/config-provider/mac-config-provider.d.ts +23 -0
  30. package/dist/types/components/config-provider/mac-config-provider.stories.d.ts +12 -0
  31. package/dist/types/components/confirm/index.d.ts +2 -0
  32. package/dist/types/components/confirm/mac-confirm.d.ts +86 -0
  33. package/dist/types/components/confirm/mac-confirm.stories.d.ts +15 -0
  34. package/dist/types/components/data-table/index.d.ts +2 -0
  35. package/dist/types/components/data-table/mac-data-table.d.ts +212 -0
  36. package/dist/types/components/data-table/mac-data-table.stories.d.ts +18 -0
  37. package/dist/types/components/date-picker/date-picker-utils.d.ts +13 -0
  38. package/dist/types/components/date-picker/index.d.ts +3 -0
  39. package/dist/types/components/date-picker/mac-date-picker.d.ts +72 -0
  40. package/dist/types/components/date-picker/mac-date-picker.stories.d.ts +28 -0
  41. package/dist/types/components/date-picker/mac-date-range-picker.d.ts +58 -0
  42. package/dist/types/components/date-picker/mac-date-range-picker.stories.d.ts +13 -0
  43. package/dist/types/components/descriptions/mac-descriptions.d.ts +99 -0
  44. package/dist/types/components/descriptions/mac-descriptions.stories.d.ts +21 -0
  45. package/dist/types/components/desktop/index.d.ts +2 -0
  46. package/dist/types/components/desktop/mac-desktop.d.ts +88 -0
  47. package/dist/types/components/desktop/mac-desktop.stories.d.ts +17 -0
  48. package/dist/types/components/desktop-icon/index.d.ts +1 -0
  49. package/dist/types/components/desktop-icon/mac-desktop-icon.d.ts +46 -0
  50. package/dist/types/components/desktop-icon/mac-desktop-icon.stories.d.ts +8 -0
  51. package/dist/types/components/dock/index.d.ts +2 -0
  52. package/dist/types/components/dock/mac-dock-item.d.ts +37 -0
  53. package/dist/types/components/dock/mac-dock.d.ts +74 -0
  54. package/dist/types/components/dock/mac-dock.stories.d.ts +13 -0
  55. package/dist/types/components/drawer/mac-drawer.d.ts +87 -0
  56. package/dist/types/components/drawer/mac-drawer.stories.d.ts +15 -0
  57. package/dist/types/components/dropdown/index.d.ts +2 -0
  58. package/dist/types/components/dropdown/mac-dropdown.d.ts +77 -0
  59. package/dist/types/components/dropdown/mac-dropdown.stories.d.ts +13 -0
  60. package/dist/types/components/dynamic-tags/index.d.ts +1 -0
  61. package/dist/types/components/dynamic-tags/mac-dynamic-tags.d.ts +64 -0
  62. package/dist/types/components/dynamic-tags/mac-dynamic-tags.stories.d.ts +16 -0
  63. package/dist/types/components/form/index.d.ts +3 -0
  64. package/dist/types/components/form/mac-form-item.d.ts +67 -0
  65. package/dist/types/components/form/mac-form.d.ts +64 -0
  66. package/dist/types/components/form/mac-form.stories.d.ts +18 -0
  67. package/dist/types/components/group-button/index.d.ts +2 -0
  68. package/dist/types/components/group-button/mac-group-button.d.ts +50 -0
  69. package/dist/types/components/group-button/mac-group-button.stories.d.ts +13 -0
  70. package/dist/types/components/infinite-scroll/index.d.ts +1 -0
  71. package/dist/types/components/infinite-scroll/mac-infinite-scroll.d.ts +57 -0
  72. package/dist/types/components/infinite-scroll/mac-infinite-scroll.stories.d.ts +11 -0
  73. package/dist/types/components/input/index.d.ts +1 -0
  74. package/dist/types/components/input/mac-input.d.ts +73 -0
  75. package/dist/types/components/input/mac-input.stories.d.ts +19 -0
  76. package/dist/types/components/input-number/index.d.ts +1 -0
  77. package/dist/types/components/input-number/mac-input-number.d.ts +81 -0
  78. package/dist/types/components/input-number/mac-input-number.stories.d.ts +18 -0
  79. package/dist/types/components/lazy-image/index.d.ts +1 -0
  80. package/dist/types/components/lazy-image/mac-lazy-image.d.ts +86 -0
  81. package/dist/types/components/lazy-image/mac-lazy-image.stories.d.ts +15 -0
  82. package/dist/types/components/menu/index.d.ts +2 -0
  83. package/dist/types/components/menu/mac-menu.d.ts +63 -0
  84. package/dist/types/components/menu/mac-menu.stories.d.ts +11 -0
  85. package/dist/types/components/modal/index.d.ts +1 -0
  86. package/dist/types/components/modal/mac-modal.d.ts +96 -0
  87. package/dist/types/components/modal/mac-modal.stories.d.ts +12 -0
  88. package/dist/types/components/number-animation/mac-number-animation.d.ts +64 -0
  89. package/dist/types/components/number-animation/mac-number-animation.stories.d.ts +15 -0
  90. package/dist/types/components/popconfirm/mac-popconfirm.d.ts +77 -0
  91. package/dist/types/components/popconfirm/mac-popconfirm.stories.d.ts +14 -0
  92. package/dist/types/components/progress/index.d.ts +1 -0
  93. package/dist/types/components/progress/mac-progress.d.ts +76 -0
  94. package/dist/types/components/progress/mac-progress.stories.d.ts +25 -0
  95. package/dist/types/components/radio/index.d.ts +2 -0
  96. package/dist/types/components/radio/mac-radio.d.ts +90 -0
  97. package/dist/types/components/radio/mac-radio.stories.d.ts +17 -0
  98. package/dist/types/components/rating/mac-rating.d.ts +56 -0
  99. package/dist/types/components/rating/mac-rating.stories.d.ts +15 -0
  100. package/dist/types/components/select/index.d.ts +1 -0
  101. package/dist/types/components/select/mac-select.d.ts +97 -0
  102. package/dist/types/components/select/mac-select.stories.d.ts +18 -0
  103. package/dist/types/components/split/index.d.ts +1 -0
  104. package/dist/types/components/split/mac-split.d.ts +69 -0
  105. package/dist/types/components/split/mac-split.stories.d.ts +13 -0
  106. package/dist/types/components/tabs/mac-tabs.d.ts +119 -0
  107. package/dist/types/components/tabs/mac-tabs.stories.d.ts +15 -0
  108. package/dist/types/components/tag/index.d.ts +1 -0
  109. package/dist/types/components/tag/mac-tag.d.ts +40 -0
  110. package/dist/types/components/tag/mac-tag.stories.d.ts +20 -0
  111. package/dist/types/components/text-ellipsis/mac-text-ellipsis.d.ts +47 -0
  112. package/dist/types/components/text-ellipsis/mac-text-ellipsis.stories.d.ts +15 -0
  113. package/dist/types/components/tree/index.d.ts +2 -0
  114. package/dist/types/components/tree/mac-tree.d.ts +79 -0
  115. package/dist/types/components/tree/mac-tree.stories.d.ts +12 -0
  116. package/dist/types/components/tree-select/index.d.ts +2 -0
  117. package/dist/types/components/tree-select/mac-tree-select.d.ts +59 -0
  118. package/dist/types/components/tree-select/mac-tree-select.stories.d.ts +19 -0
  119. package/dist/types/internal/base-element.d.ts +18 -0
  120. package/dist/types/internal/property-converters.d.ts +7 -0
  121. package/dist/types/mac-ui.d.ts +60 -0
  122. package/dist/types/styles/shared-styles.d.ts +2 -0
  123. package/dist/types/styles/theme.d.ts +11 -0
  124. package/dist/types/test/setup.d.ts +1 -0
  125. package/package.json +86 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mac-ui.umd.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;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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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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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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B,cAGnC,kBAGI,eAG8B,CAAC,qBArT9B,CACvB,EACA,EACA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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,mBAGK,CAAC,kBAEjB,sBAtVL,CACvB,EACA,EACA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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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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"}