@woisol-g/configurable-cross-menu 1.0.3 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,3 +1,3 @@
1
- @keyframes ccm-center-aurora{0%{transform:translate(-50%, -50%) rotate(0deg) scale(1)}50%{transform:translate(-50%, -50%) rotate(180deg) scale(1.08)}100%{transform:translate(-50%, -50%) rotate(360deg) scale(1)}}@keyframes ccm-center-sheen{0%{transform:translateX(-120%)}55%{transform:translateX(130%)}100%{transform:translateX(130%)}}@media(prefers-reduced-motion: reduce){.ccm-con{transform:none;transition:none}.ccm-con .ccm-center{transition:none;transform:none}.ccm-con .ccm-center::before,.ccm-con .ccm-center::after{animation:none}}@keyframes ccm-item-show-rotate{0%{filter:opacity(0) blur(20px);transform:translate(-50%, -50%) rotate(calc(var(--ccm-item-deg) - 90deg)) translateX(0) translateY(0) scale(0.5)}40%{filter:opacity(0.55) blur(10px)}100%{filter:opacity(0.5);transform:translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(var(--ccm-item-x)) translateY(calc(var(--ccm-item-y) * -1)) scale(1)}}@keyframes ccm-item-show-rotate-down{0%{filter:opacity(0) blur(20px);transform:translate(-50%, -50%) rotate(calc(var(--ccm-item-deg) - 90deg)) translateX(0) translateY(0) scale(0.5)}40%{filter:opacity(0.55) blur(10px)}100%{filter:opacity(0.5);transform:translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(calc(var(--ccm-item-x) * -1)) translateY(var(--ccm-item-y)) scale(1)}}@keyframes ccm-center-show{0%{filter:opacity(0.2) blur(20px);transform:translate(-50%, -50%) translate3d(calc(var(--ccm-parallax-x) * -0.08), calc(var(--ccm-parallax-y) * -0.08), 0) scale(0.4)}100%{filter:opacity(1);transform:translate(-50%, -50%) translate3d(calc(var(--ccm-parallax-x) * -0.08), calc(var(--ccm-parallax-y) * -0.08), 0) scale(1)}}@keyframes ccm-item-show-ripple{0%{filter:opacity(0);transform:translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(0) translateY(0) scale(0.6)}70%{filter:opacity(0.55);transform:translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(calc(var(--ccm-item-x) * 1.05)) translateY(calc(var(--ccm-item-y) * -1.05)) scale(1.05)}100%{filter:opacity(0.5);transform:translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(var(--ccm-item-x)) translateY(calc(var(--ccm-item-y) * -1)) scale(1)}}@keyframes ccm-item-show-ripple-down{0%{filter:opacity(0);transform:translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(0) translateY(0) scale(0.6)}70%{filter:opacity(0.55);transform:translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(calc(var(--ccm-item-x) * -1.05)) translateY(calc(var(--ccm-item-y) * 1.05)) scale(1.05)}100%{filter:opacity(0.5);transform:translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(calc(var(--ccm-item-x) * -1)) translateY(var(--ccm-item-y)) scale(1)}}@keyframes ccm-center-expand{0%{filter:opacity(0);clip-path:circle(0% at 50% 50%);transform:translate(-50%, -50%) translate3d(calc(var(--ccm-parallax-x) * -0.08), calc(var(--ccm-parallax-y) * -0.08), 0) scale(0.9)}40%{filter:opacity(0.7);clip-path:circle(60% at 50% 50%)}70%{clip-path:circle(120% at 50% 50%);transform:translate(-50%, -50%) translate3d(calc(var(--ccm-parallax-x) * -0.08), calc(var(--ccm-parallax-y) * -0.08), 0) scale(1.03)}100%{filter:opacity(1);clip-path:circle(200% at 50% 50%);transform:translate(-50%, -50%) translate3d(calc(var(--ccm-parallax-x) * -0.08), calc(var(--ccm-parallax-y) * -0.08), 0) scale(1)}}.ccm-center{min-width:150px;min-height:150px;width:fit-content;height:fit-content;position:absolute;overflow:hidden;z-index:2;padding:12px 20px;left:50%;top:50%;border:var(--ccm-center-border-size, 0px) solid var(--ccm-center-border-color, #333);border-radius:var(--ccm-center-radius, 20px);background-color:color-mix(in srgb, var(--ccm-bg-center-color, hsl(0, 0%, 100%)) calc(var(--ccm-bg-opacity, 1) * 100%), transparent);box-shadow:0 4px 8px rgba(0,0,0,.1);-webkit-backdrop-filter:blur(var(--ccm-bg-blur, 0px));backdrop-filter:blur(var(--ccm-bg-blur, 0px));transform:translate(-50%, -50%) translate3d(calc(var(--ccm-parallax-x) * -0.08), calc(var(--ccm-parallax-y) * -0.08), 0);transition:transform 220ms ease-out,box-shadow 220ms ease-out;display:flex;gap:.5em;flex-direction:column;justify-content:center;align-items:center;animation:ccm-center-show var(--ccm-center-show-duration, 500ms) cubic-bezier(0.3, 0.3, 0.4, 1.15) none;pointer-events:none}.ccm-center.column{gap:.5em;flex-direction:column}.ccm-center.row{gap:.8em;flex-direction:row}.ccm-center::before{content:"";position:absolute;top:50%;left:50%;width:260%;height:260%;z-index:0;background:radial-gradient(circle at 22% 32%, hsla(194, 90%, 68%, 0.45) 0%, transparent 45%),radial-gradient(circle at 78% 72%, hsla(328, 95%, 68%, 0.35) 0%, transparent 40%),radial-gradient(circle at 50% 50%, hsla(42, 95%, 72%, 0.25) 0%, transparent 56%);transform-origin:center;transform:translate(-50%, -50%);animation:ccm-center-aurora 13s linear infinite;pointer-events:none}.ccm-center::after{content:"";position:absolute;inset:0;z-index:0;opacity:.22;background:linear-gradient(115deg, transparent 22%, rgba(255, 255, 255, 0.85) 49%, transparent 78%);transform:translateX(-120%);animation:ccm-center-sheen 7s ease-in-out infinite;pointer-events:none}.ccm-center img,.ccm-center h3,.ccm-center p{width:fit-content;margin:0 auto}.ccm-center img{display:block;width:var(--ccm-center-icon-size, 100px);height:var(--ccm-center-icon-size, 100px);border-radius:var(--ccm-center-icon-radius, calc(var(--ccm-center-radius, 25%) * 0.8))}.ccm-center h3{font-size:var(--ccm-center-title-size, 30px);color:var(--ccm-center-title-color, #333)}.ccm-center p{font-size:var(--ccm-center-subtitle-size, 15px);color:var(--ccm-center-subtitle-color, #666)}.ccm-items{--ccm-item-y: calc(var(--ccm-item-offset, 0px) + 100px);--ccm-item-hover-shift: var(--ccm-item-hover-offset, 30px);min-height:max(var(--ccm-menu-length, 0),80px);padding:12px 2px;background-color:var(--ccm-item-bg-color, var(--ccm-bg-menu-color, hsl(0, 0%, 93%)));border:0px solid rgba(0,0,0,0);border-radius:var(--ccm-items-radius, 10px);position:absolute;left:50%;top:50%;box-shadow:0 4px 8px rgba(0,0,0,.1);transform:translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(var(--ccm-item-x)) translateY(calc(var(--ccm-item-y) * -1));transition:padding .3s ease,filter .3s ease,transform .5s cubic-bezier(0.175, 0.885, 0.32, 1.275),border .3s ease;color:var(--ccm-menu-color, hsl(0, 0%, 20%));white-space:nowrap;font-size:var(--ccm-item-size, 30px);writing-mode:vertical-rl;text-orientation:mixed;text-align:center;will-change:transform;filter:opacity(0.5);animation:ccm-item-show-rotate 1s cubic-bezier(0.3, 0.3, 0.4, 1.15) none}.ccm-items.right{writing-mode:sideways-lr}.ccm-items.left{writing-mode:sideways-rl}.ccm-items.down{transform:translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(calc(var(--ccm-item-x) * -1)) translateY(var(--ccm-item-y));writing-mode:vertical-lr;animation:ccm-item-show-rotate-down 1s cubic-bezier(0.3, 0.3, 0.4, 1.15) none}.ccm-items.selecting,.ccm-items:hover,.ccm-items:focus,.ccm-items:active{filter:opacity(1);padding:25px 10px;box-shadow:0 6px 12px rgba(0,0,0,.15);transform:translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(var(--ccm-item-x)) translateY(calc(var(--ccm-item-y) * -1 - var(--ccm-item-hover-shift))) scale(1.08);border:var(--ccm-center-border-size, 2px) solid var(--ccm-center-border-color, #333);z-index:1}.ccm-items.selecting.down,.ccm-items:hover.down,.ccm-items:focus.down,.ccm-items:active.down{transform:translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(var(--ccm-item-x)) translateY(calc(var(--ccm-item-y) + var(--ccm-item-hover-shift))) scale(1.08)}.ccm-items:has(a){padding:0}.ccm-items:has(a) a{padding:12px 2px}.ccm-items.selecting:has(a),.ccm-items:hover:has(a),.ccm-items:focus:has(a),.ccm-items:active:has(a){padding:0}.ccm-items.selecting:has(a) a,.ccm-items:hover:has(a) a,.ccm-items:focus:has(a) a,.ccm-items:active:has(a) a{padding:25px 10px}.ccm-items a{color:inherit;text-decoration:none;display:block;transition:padding .3s ease}.ccm-full-page{width:100svw;min-height:100svh;max-height:100svh;overflow:hidden;position:fixed;left:0;top:0;display:flex;align-items:center;justify-content:center}.ccm-con{--ccm-parallax-x: 0px;--ccm-parallax-y: 0px;--ccm-tilt-x: 0deg;--ccm-tilt-y: 0deg;margin:0;padding:0;box-sizing:border-box;z-index:10;transform-style:preserve-3d;transform:perspective(300px) rotateX(var(--ccm-tilt-y)) rotateY(var(--ccm-tilt-x));transition:transform 180ms ease-out}.ccm-con.row{flex-direction:row}.ccm-con *{margin:0}.ccm-con *:focus-visible{outline:none}
1
+ @keyframes ccm-center-aurora{0%{transform:translate(-50%, -50%) rotate(0deg) scale(1)}50%{transform:translate(-50%, -50%) rotate(180deg) scale(1.08)}100%{transform:translate(-50%, -50%) rotate(360deg) scale(1)}}@keyframes ccm-center-sheen{0%{transform:translateX(-120%)}55%{transform:translateX(130%)}100%{transform:translateX(130%)}}@media(prefers-reduced-motion: reduce){.ccm-con{transform:none;transition:none}.ccm-con .ccm-center{transition:none;transform:none}.ccm-con .ccm-center::before,.ccm-con .ccm-center::after{animation:none}}@keyframes ccm-item-show-rotate{0%{filter:opacity(0) blur(20px);transform:translate(-50%, -50%) rotate(calc(var(--ccm-item-deg) - 90deg)) translateX(0) translateY(0) scale(0.5)}40%{filter:opacity(0.55) blur(10px)}100%{filter:opacity(0.5);transform:translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(var(--ccm-item-x)) translateY(calc(var(--ccm-item-y) * -1)) scale(1)}}@keyframes ccm-item-show-rotate-down{0%{filter:opacity(0) blur(20px);transform:translate(-50%, -50%) rotate(calc(var(--ccm-item-deg) - 90deg)) translateX(0) translateY(0) scale(0.5)}40%{filter:opacity(0.55) blur(10px)}100%{filter:opacity(0.5);transform:translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(calc(var(--ccm-item-x) * -1)) translateY(var(--ccm-item-y)) scale(1)}}@keyframes ccm-item-hide-rotate{0%{filter:opacity(0.5);transform:translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(var(--ccm-item-x)) translateY(calc(var(--ccm-item-y) * -1)) scale(1)}100%{filter:opacity(0) blur(20px);transform:translate(-50%, -50%) rotate(calc(var(--ccm-item-deg) - 90deg)) translateX(0) translateY(0) scale(0.5)}}@keyframes ccm-item-hide-rotate-down{0%{filter:opacity(0.5);transform:translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(calc(var(--ccm-item-x) * -1)) translateY(var(--ccm-item-y)) scale(1)}100%{filter:opacity(0) blur(20px);transform:translate(-50%, -50%) rotate(calc(var(--ccm-item-deg) - 90deg)) translateX(0) translateY(0) scale(0.5)}}@keyframes ccm-center-show{0%{filter:opacity(0.2) blur(20px);transform:translate(-50%, -50%) translate3d(calc(var(--ccm-parallax-x) * -0.08), calc(var(--ccm-parallax-y) * -0.08), 0) scale(0.4)}100%{filter:opacity(1);transform:translate(-50%, -50%) translate3d(calc(var(--ccm-parallax-x) * -0.08), calc(var(--ccm-parallax-y) * -0.08), 0) scale(1)}}@keyframes ccm-center-hide{0%{filter:opacity(1);transform:translate(-50%, -50%) translate3d(calc(var(--ccm-parallax-x) * -0.08), calc(var(--ccm-parallax-y) * -0.08), 0) scale(1)}100%{filter:opacity(0);transform:translate(-50%, -50%) translate3d(calc(var(--ccm-parallax-x) * -0.08), calc(var(--ccm-parallax-y) * -0.08), 0) scale(0.4)}}@keyframes ccm-item-show-ripple{0%{filter:opacity(0);transform:translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(0) translateY(0) scale(0.6)}70%{filter:opacity(0.55);transform:translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(calc(var(--ccm-item-x) * 1.05)) translateY(calc(var(--ccm-item-y) * -1.05)) scale(1.05)}100%{filter:opacity(0.5);transform:translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(var(--ccm-item-x)) translateY(calc(var(--ccm-item-y) * -1)) scale(1)}}@keyframes ccm-item-show-ripple-down{0%{filter:opacity(0);transform:translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(0) translateY(0) scale(0.6)}70%{filter:opacity(0.55);transform:translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(calc(var(--ccm-item-x) * -1.05)) translateY(calc(var(--ccm-item-y) * 1.05)) scale(1.05)}100%{filter:opacity(0.5);transform:translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(calc(var(--ccm-item-x) * -1)) translateY(var(--ccm-item-y)) scale(1)}}@keyframes ccm-center-expand{0%{filter:opacity(0);clip-path:circle(0% at 50% 50%);transform:translate(-50%, -50%) translate3d(calc(var(--ccm-parallax-x) * -0.08), calc(var(--ccm-parallax-y) * -0.08), 0) scale(0.9)}40%{filter:opacity(0.7);clip-path:circle(60% at 50% 50%)}70%{clip-path:circle(120% at 50% 50%);transform:translate(-50%, -50%) translate3d(calc(var(--ccm-parallax-x) * -0.08), calc(var(--ccm-parallax-y) * -0.08), 0) scale(1.03)}100%{filter:opacity(1);clip-path:circle(200% at 50% 50%);transform:translate(-50%, -50%) translate3d(calc(var(--ccm-parallax-x) * -0.08), calc(var(--ccm-parallax-y) * -0.08), 0) scale(1)}}.ccm-center{min-width:150px;min-height:150px;width:fit-content;height:fit-content;position:absolute;overflow:hidden;z-index:2;padding:12px 20px;left:50%;top:50%;border:var(--ccm-center-border-size, 0px) solid var(--ccm-center-border-color, #333);border-radius:var(--ccm-center-radius, 20px);background-color:color-mix(in srgb, var(--ccm-bg-center-color, hsl(0, 0%, 100%)) calc(var(--ccm-bg-opacity, 1) * 100%), transparent);box-shadow:0 4px 8px rgba(0,0,0,.1);-webkit-backdrop-filter:blur(var(--ccm-bg-blur, 0px));backdrop-filter:blur(var(--ccm-bg-blur, 0px));transform:translate(-50%, -50%) translate3d(calc(var(--ccm-parallax-x) * -0.08), calc(var(--ccm-parallax-y) * -0.08), 0);transition:transform 220ms ease-out,box-shadow 220ms ease-out;display:flex;gap:.5em;flex-direction:column;justify-content:center;align-items:center;animation:ccm-center-show var(--ccm-center-show-duration, 500ms) cubic-bezier(0.3, 0.3, 0.4, 1.15) none;pointer-events:none}.ccm-center.column{gap:.5em;flex-direction:column}.ccm-center.row{gap:.8em;flex-direction:row}.ccm-center::before{content:"";position:absolute;top:50%;left:50%;width:260%;height:260%;z-index:0;background:radial-gradient(circle at 22% 32%, hsla(194, 90%, 68%, 0.45) 0%, transparent 45%),radial-gradient(circle at 78% 72%, hsla(328, 95%, 68%, 0.35) 0%, transparent 40%),radial-gradient(circle at 50% 50%, hsla(42, 95%, 72%, 0.25) 0%, transparent 56%);transform-origin:center;transform:translate(-50%, -50%);animation:ccm-center-aurora 13s linear infinite;pointer-events:none}.ccm-center::after{content:"";position:absolute;inset:0;z-index:0;opacity:.22;background:linear-gradient(115deg, transparent 22%, rgba(255, 255, 255, 0.85) 49%, transparent 78%);transform:translateX(-120%);animation:ccm-center-sheen 7s ease-in-out infinite;pointer-events:none}.ccm-center img,.ccm-center h3,.ccm-center p{width:fit-content;margin:0 auto}.ccm-center img{display:block;width:var(--ccm-center-icon-size, 100px);height:var(--ccm-center-icon-size, 100px);border-radius:var(--ccm-center-icon-radius, calc(var(--ccm-center-radius, 25%) * 0.8))}.ccm-center h3{font-size:var(--ccm-center-title-size, 30px);color:var(--ccm-center-title-color, #333)}.ccm-center p{font-size:var(--ccm-center-subtitle-size, 15px);color:var(--ccm-center-subtitle-color, #666)}.ccm-items{--ccm-item-y: calc(var(--ccm-item-offset, 0px) + 100px);--ccm-item-hover-shift: var(--ccm-item-hover-offset, 30px);min-height:max(var(--ccm-menu-length, 0),80px);padding:12px 2px;background-color:var(--ccm-item-bg-color, var(--ccm-bg-menu-color, hsl(0, 0%, 93%)));border:0px solid rgba(0,0,0,0);border-radius:var(--ccm-items-radius, 10px);position:absolute;left:50%;top:50%;box-shadow:0 4px 8px rgba(0,0,0,.1);transform:translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(var(--ccm-item-x)) translateY(calc(var(--ccm-item-y) * -1));transition:padding .3s ease,filter .3s ease,transform .5s cubic-bezier(0.175, 0.885, 0.32, 1.275),border .3s ease;color:var(--ccm-menu-color, hsl(0, 0%, 20%));white-space:nowrap;font-size:var(--ccm-item-size, 30px);writing-mode:vertical-rl;text-orientation:mixed;text-align:center;will-change:transform;filter:opacity(0.5);animation:ccm-item-show-rotate 1s cubic-bezier(0.3, 0.3, 0.4, 1.15) none}.ccm-items.right{writing-mode:sideways-lr}.ccm-items.left{writing-mode:sideways-rl}.ccm-items.down{transform:translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(calc(var(--ccm-item-x) * -1)) translateY(var(--ccm-item-y));writing-mode:vertical-lr;animation:ccm-item-show-rotate-down 1s cubic-bezier(0.3, 0.3, 0.4, 1.15) none}.ccm-items.selecting,.ccm-items:hover,.ccm-items:focus,.ccm-items:active{filter:opacity(1);padding:25px 10px;box-shadow:0 6px 12px rgba(0,0,0,.15);transform:translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(var(--ccm-item-x)) translateY(calc(var(--ccm-item-y) * -1 - var(--ccm-item-hover-shift))) scale(1.08);border:var(--ccm-center-border-size, 2px) solid var(--ccm-center-border-color, #333);z-index:1}.ccm-items.selecting.down,.ccm-items:hover.down,.ccm-items:focus.down,.ccm-items:active.down{transform:translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(var(--ccm-item-x)) translateY(calc(var(--ccm-item-y) + var(--ccm-item-hover-shift))) scale(1.08)}.ccm-items:has(a){padding:0}.ccm-items:has(a) a{padding:12px 2px}.ccm-items.selecting:has(a),.ccm-items:hover:has(a),.ccm-items:focus:has(a),.ccm-items:active:has(a){padding:0}.ccm-items.selecting:has(a) a,.ccm-items:hover:has(a) a,.ccm-items:focus:has(a) a,.ccm-items:active:has(a) a{padding:25px 10px}.ccm-items a{color:inherit;text-decoration:none;display:block;transition:padding .3s ease}.ccm-full-page{width:100svw;min-height:100svh;max-height:100svh;overflow:hidden;position:fixed;left:0;top:0;display:flex;align-items:center;justify-content:center;z-index:-9999}.ccm-con{--ccm-parallax-x: 0px;--ccm-parallax-y: 0px;--ccm-tilt-x: 0deg;--ccm-tilt-y: 0deg;margin:0;padding:0;box-sizing:border-box;z-index:10;transform-style:preserve-3d;transform:perspective(300px) rotateX(var(--ccm-tilt-y)) rotateY(var(--ccm-tilt-x));transition:transform 180ms ease-out}.ccm-con.row{flex-direction:row}.ccm-con *{margin:0}.ccm-con *:focus-visible{outline:none}.ccm-con.close .ccm-center{animation:ccm-center-hide .5s ease-out forwards}.ccm-con.close .ccm-items{animation:ccm-item-hide-rotate .5s ease-out forwards}.ccm-con.close .ccm-items.down{animation:ccm-item-hide-rotate-down 1s cubic-bezier(0.3, 0.3, 0.4, 1.15) forwards}
2
2
 
3
3
  /*# sourceMappingURL=configurable-cross-menu.css.map*/
@@ -1 +1 @@
1
- {"version":3,"file":"configurable-cross-menu.css","mappings":"AAAA,6BACE,GACE,sDAGF,IACE,2DAGF,KACE,yDAIJ,4BACE,GACE,4BAGF,IACE,2BAGF,KACE,4BAIJ,uCACE,SACE,eACA,gBAEA,qBACE,gBACA,eAEA,yDAEE,gBAUR,gCACE,GACE,6BACA,iHAGF,IACE,gCAIF,KAEE,oBACA,6IAIJ,qCACE,GACE,6BACA,iHAGF,IACE,gCAIF,KACE,oBACA,6IAIJ,2BACE,GACE,+BAEA,oIAGF,KACE,kBACA,mIA+BJ,gCACE,GACE,kBACA,mGAGF,IACE,qBACA,+JAGF,KACE,oBACA,6IAIJ,qCACE,GACE,kBACA,mGAGF,IACE,qBACA,+JAGF,KACE,oBACA,6IAIJ,6BACE,GACE,kBACA,gCACA,oIAGF,IACE,oBACA,iCAGF,IACE,kCACA,qIAGF,KACE,kBACA,kCACA,mIClLJ,YACE,gBACA,iBACA,kBACA,mBACA,kBACA,gBAEA,UACA,kBAEA,SACA,QAEA,qFACA,6CAEA,qIACA,oCAGA,sDACA,8CACA,yHACA,8DACA,aACA,SACA,sBACA,uBACA,mBACA,wGAEA,oBAEA,mBACE,SACA,sBAGF,gBACE,SACA,mBAGF,oBACE,WACA,kBACA,QACA,SACA,WACA,YACA,UACA,+PACE,CAGF,wBACA,gCACA,gDACA,oBAGF,mBACE,WACA,kBACA,QACA,UACA,YACA,mGACE,CACF,4BACA,mDACA,oBAGF,6CAKE,kBACA,cAGF,gBACE,cACA,yCACA,0CACA,uFAKF,eACE,6CACA,0CAGF,cACE,gDACA,6CCpGF,WACE,wDACA,2DAGA,+CACA,iBACA,qFACA,+BACA,4CACA,kBACA,SACA,QACA,oCACA,mIACA,kHAIA,6CACA,mBACA,qCACA,yBACA,uBACA,kBAEA,sBACA,oBAGA,yEAKA,iBACE,yBAGF,gBACE,yBAGF,gBACE,mIACA,yBACA,8EASF,yEAIE,kBACA,kBACA,sCACA,6KACA,qFACA,UAEA,6FACE,wKAKJ,kBACE,UAEA,oBACE,iBAIJ,qGAIE,UAEA,6GACE,kBAIJ,aAEE,cACA,qBACA,cAIA,4BC/FN,eACE,aACA,kBACA,kBACA,gBAEA,eACA,OACA,MACA,aACA,mBACA,uBAGF,SACE,sBACA,sBACA,mBACA,mBAaA,SACA,UACA,sBACA,WAKA,4BACA,mFACA,oCAKA,aACE,mBAGF,WACE,SAIA,yBACE,a","sources":["webpack://ConfigurableCrossMenu/./src/styles/animation.scss","webpack://ConfigurableCrossMenu/./src/styles/ccm-center.scss","webpack://ConfigurableCrossMenu/./src/styles/ccm-items.scss","webpack://ConfigurableCrossMenu/./src/styles/index.scss"],"sourcesContent":["@keyframes ccm-center-aurora {\n 0% {\n transform: translate(-50%, -50%) rotate(0deg) scale(1);\n }\n\n 50% {\n transform: translate(-50%, -50%) rotate(180deg) scale(1.08);\n }\n\n 100% {\n transform: translate(-50%, -50%) rotate(360deg) scale(1);\n }\n}\n\n@keyframes ccm-center-sheen {\n 0% {\n transform: translateX(-120%);\n }\n\n 55% {\n transform: translateX(130%);\n }\n\n 100% {\n transform: translateX(130%);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .ccm-con {\n transform: none;\n transition: none;\n\n .ccm-center {\n transition: none;\n transform: none;\n\n &::before,\n &::after {\n animation: none;\n }\n }\n\n // .ccm-items {\n // transition: none;\n // }\n }\n}\n\n@keyframes ccm-item-show-rotate {\n 0% {\n filter: opacity(0) blur(20px);\n transform: translate(-50%, -50%) rotate(calc(var(--ccm-item-deg) - 90deg)) translateX(0) translateY(0) scale(0.5);\n }\n\n 40% {\n filter: opacity(0.55) blur(10px);\n // transform: translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(calc(var(--ccm-item-x) * 1.05)) translateY(calc(var(--ccm-item-y) * -1.05)) scale(1.05);\n }\n\n 100% {\n // 比默认高 0.1 试试?\n filter: opacity(0.5);\n transform: translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(var(--ccm-item-x)) translateY(calc(var(--ccm-item-y) * -1)) scale(1);\n }\n}\n\n@keyframes ccm-item-show-rotate-down {\n 0% {\n filter: opacity(0) blur(20px);\n transform: translate(-50%, -50%) rotate(calc(var(--ccm-item-deg) - 90deg)) translateX(0) translateY(0) scale(0.5);\n }\n\n 40% {\n filter: opacity(0.55) blur(10px);\n // transform: translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(calc(var(--ccm-item-x) * 1.05)) translateY(calc(var(--ccm-item-y) * -1.05)) scale(1.05);\n }\n\n 100% {\n filter: opacity(0.5);\n transform: translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(calc(var(--ccm-item-x) * -1)) translateY(var(--ccm-item-y)) scale(1);\n }\n}\n\n@keyframes ccm-center-show {\n 0% {\n filter: opacity(0.2) blur(20px);\n // transform: translate3d(calc(var(--ccm-parallax-x) * -0.08), calc(var(--ccm-parallax-y) * -0.08), 0) scale(1.3);\n transform: translate(-50%, -50%) translate3d(calc(var(--ccm-parallax-x) * -0.08), calc(var(--ccm-parallax-y) * -0.08), 0) scale(0.4);\n }\n\n 100% {\n filter: opacity(1);\n transform: translate(-50%, -50%) translate3d(calc(var(--ccm-parallax-x) * -0.08), calc(var(--ccm-parallax-y) * -0.08), 0) scale(1);\n }\n}\n\n// 其它可能的方案\n// @keyframes ccm-item-show-rotate {\n// 0% {\n// filter: opacity(0);\n// transform: translate(-50%, -50%) rotate(calc(var(--ccm-item-deg) - 180deg)) translateX(0) translateY(0) scale(0.5);\n// }\n\n// 100% {\n// // 比默认高 0.1 试试?\n// filter: opacity(0.5);\n// transform: translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(var(--ccm-item-x)) translateY(calc(var(--ccm-item-y) * -1)) scale(1);\n// }\n// }\n\n// @keyframes ccm-center-show {\n// 0% {\n// filter: opacity(0);\n// transform: translate3d(calc(var(--ccm-parallax-x) * -0.08), calc(var(--ccm-parallax-y) * -0.08), 0) scale(0.4);\n// }\n\n// 100% {\n// filter: opacity(1);\n// transform: translate3d(calc(var(--ccm-parallax-x) * -0.08), calc(var(--ccm-parallax-y) * -0.08), 0) scale(1);\n// }\n// }\n\n\n@keyframes ccm-item-show-ripple {\n 0% {\n filter: opacity(0);\n transform: translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(0) translateY(0) scale(0.6);\n }\n\n 70% {\n filter: opacity(0.55);\n transform: translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(calc(var(--ccm-item-x) * 1.05)) translateY(calc(var(--ccm-item-y) * -1.05)) scale(1.05);\n }\n\n 100% {\n filter: opacity(0.5);\n transform: translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(var(--ccm-item-x)) translateY(calc(var(--ccm-item-y) * -1)) scale(1);\n }\n}\n\n@keyframes ccm-item-show-ripple-down {\n 0% {\n filter: opacity(0);\n transform: translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(0) translateY(0) scale(0.6);\n }\n\n 70% {\n filter: opacity(0.55);\n transform: translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(calc(var(--ccm-item-x) * -1.05)) translateY(calc(var(--ccm-item-y) * 1.05)) scale(1.05);\n }\n\n 100% {\n filter: opacity(0.5);\n transform: translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(calc(var(--ccm-item-x) * -1)) translateY(var(--ccm-item-y)) scale(1);\n }\n}\n\n@keyframes ccm-center-expand {\n 0% {\n filter: opacity(0);\n clip-path: circle(0% at 50% 50%);\n transform: translate(-50%, -50%) translate3d(calc(var(--ccm-parallax-x) * -0.08), calc(var(--ccm-parallax-y) * -0.08), 0) scale(0.9);\n }\n\n 40% {\n filter: opacity(0.7);\n clip-path: circle(60% at 50% 50%);\n }\n\n 70% {\n clip-path: circle(120% at 50% 50%);\n transform: translate(-50%, -50%) translate3d(calc(var(--ccm-parallax-x) * -0.08), calc(var(--ccm-parallax-y) * -0.08), 0) scale(1.03);\n }\n\n 100% {\n filter: opacity(1);\n clip-path: circle(200% at 50% 50%);\n transform: translate(-50%, -50%) translate3d(calc(var(--ccm-parallax-x) * -0.08), calc(var(--ccm-parallax-y) * -0.08), 0) scale(1);\n }\n}",".ccm-center {\n min-width: 150px;\n min-height: 150px;\n width: fit-content;\n height: fit-content;\n position: absolute;\n overflow: hidden;\n // isolation: isolate;\n z-index: 2;\n padding: 12px 20px;\n // margin: 0 auto;\n left: 50%;\n top: 50%;\n // padding: min(calc(var(--ccm-center-radius) - 8), 12px) 20px;\n border: var(--ccm-center-border-size, 0px) solid var(--ccm-center-border-color, #333);\n border-radius: var(--ccm-center-radius, 20px);\n // background-color: var(--ccm-bg-center-color / var(--ccm-bg-opacity, 1), hsl(0, 0%, 100%));\n background-color: color-mix(in srgb, var(--ccm-bg-center-color, hsl(0, 0%, 100%)) calc(var(--ccm-bg-opacity, 1) * 100%), transparent);\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);\n // 又踩坑…… opacity 和 blur 不兼容……\n // opacity: var(--ccm-bg-opacity, 1);\n -webkit-backdrop-filter: blur(var(--ccm-bg-blur, 0px));\n backdrop-filter: blur(var(--ccm-bg-blur, 0px));\n transform: translate(-50%, -50%) translate3d(calc(var(--ccm-parallax-x) * -0.08), calc(var(--ccm-parallax-y) * -0.08), 0);\n transition: transform 220ms ease-out, box-shadow 220ms ease-out;\n display: flex;\n gap: 0.5em;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n animation: ccm-center-show var(--ccm-center-show-duration, 500ms) cubic-bezier(0.30, 0.30, 0.40, 1.15) none;\n // 依然不能去否则在 center 处 hover 依然抽搐\n pointer-events: none;\n\n &.column {\n gap: 0.5em;\n flex-direction: column;\n }\n\n &.row {\n gap: 0.8em;\n flex-direction: row;\n }\n\n &::before {\n content: \"\";\n position: absolute;\n top: 50%;\n left: 50%;\n width: 260%;\n height: 260%;\n z-index: 0;\n background:\n radial-gradient(circle at 22% 32%, hsl(194 90% 68% / 0.45) 0%, transparent 45%),\n radial-gradient(circle at 78% 72%, hsl(328 95% 68% / 0.35) 0%, transparent 40%),\n radial-gradient(circle at 50% 50%, hsl(42 95% 72% / 0.25) 0%, transparent 56%);\n transform-origin: center;\n transform: translate(-50%, -50%);\n animation: ccm-center-aurora 13s linear infinite;\n pointer-events: none;\n }\n\n &::after {\n content: \"\";\n position: absolute;\n inset: 0;\n z-index: 0;\n opacity: 0.22;\n background:\n linear-gradient(115deg, transparent 22%, rgb(255 255 255 / 0.85) 49%, transparent 78%);\n transform: translateX(-120%);\n animation: ccm-center-sheen 7s ease-in-out infinite;\n pointer-events: none;\n }\n\n img,\n h3,\n p {\n // position: relative;\n // z-index: 1;\n width: fit-content;\n margin: 0 auto;\n }\n\n img {\n display: block;\n width: var(--ccm-center-icon-size, 100px);\n height: var(--ccm-center-icon-size, 100px);\n border-radius: var(--ccm-center-icon-radius, calc(var(--ccm-center-radius, 25%) * 0.8));\n // object-fit: cover;\n // overflow: hidden;\n }\n\n h3 {\n font-size: var(--ccm-center-title-size, 30px);\n color: var(--ccm-center-title-color, #333);\n }\n\n p {\n font-size: var(--ccm-center-subtitle-size, 15px);\n color: var(--ccm-center-subtitle-color, #666);\n }\n}"," .ccm-items {\n --ccm-item-y: calc(var(--ccm-item-offset, 0px) + 100px);\n --ccm-item-hover-shift: var(--ccm-item-hover-offset, 30px);\n // --ccm-item-hover-shift: calc(var(--ccm-item-hover-offset, 0px) + 15px);\n // --ccm-item-hover-shift: clamp(15px, 30%, 72px);\n min-height: max(var(--ccm-menu-length, 0), 80px);\n padding: 12px 2px;\n background-color: var(--ccm-item-bg-color, var(--ccm-bg-menu-color, hsl(0, 0%, 93%)));\n border: 0px solid transparent;\n border-radius: var(--ccm-items-radius, 10px);\n position: absolute;\n left: 50%;\n top: 50%;\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);\n transform: translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(var(--ccm-item-x)) translateY(calc(var(--ccm-item-y) * -1));\n transition: padding 0.3s ease,\n filter 0.3s ease,\n transform 0.5s cubic-bezier(0.175, 0.885, 0.32, 1.275),\n border 0.3s ease;\n color: var(--ccm-menu-color, hsl(0, 0%, 20%));\n white-space: nowrap;\n font-size: var(--ccm-item-size, 30px);\n writing-mode: vertical-rl;\n text-orientation: mixed;\n text-align: center;\n // 指明元素将要发生的变化,以便浏览器可以提前做好优化,提升动画性能。一般已经尽力优化作为最后手段,过多使用可能导致内存占用 https: //developer.mozilla.org/zh-CN/docs/Web/CSS/Reference/Properties/will-change\n will-change: transform;\n filter: opacity(0.5);\n // 不能用 forward 否则结束后保留动画状态 hover 的 translate 不生效\n // https: //cubic-bezier.tupulin.com/#cubic-bezier(0.30,0.30,0.40,1.15)\n animation: ccm-item-show-rotate 1s cubic-bezier(0.30, 0.30, 0.40, 1.15) none;\n\n &.up {}\n\n // haiku 4.5 都补不出来的属性😋\n &.right {\n writing-mode: sideways-lr;\n }\n\n &.left {\n writing-mode: sideways-rl;\n }\n\n &.down {\n transform: translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(calc(var(--ccm-item-x) * -1)) translateY(var(--ccm-item-y));\n writing-mode: vertical-lr;\n animation: ccm-item-show-rotate-down 1s cubic-bezier(0.30, 0.30, 0.40, 1.15) none;\n }\n\n // &.selecting:not(:hover):not(:focus):not(:active) {\n // // padding: 20px 8px;\n // border: 0px;\n // filter: opacity(0.8);\n // }\n\n &.selecting,\n &:hover,\n &:focus,\n &:active {\n filter: opacity(1);\n padding: 25px 10px;\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.15);\n transform: translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(var(--ccm-item-x)) translateY(calc(var(--ccm-item-y) * -1 - var(--ccm-item-hover-shift))) scale(1.08);\n border: var(--ccm-center-border-size, 2px) solid var(--ccm-center-border-color, #333);\n z-index: 1;\n\n &.down {\n transform: translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(var(--ccm-item-x)) translateY(calc(var(--ccm-item-y) + var(--ccm-item-hover-shift))) scale(1.08);\n }\n }\n\n // 判断子元素!\n &:has(a) {\n padding: 0;\n\n a {\n padding: 12px 2px;\n }\n }\n\n &.selecting:has(a),\n &:hover:has(a),\n &:focus:has(a),\n &:active:has(a) {\n padding: 0;\n\n a {\n padding: 25px 10px;\n }\n }\n\n a {\n // hhh 666\n color: inherit;\n text-decoration: none;\n display: block;\n // 搞不懂 width 默认……\n // width: 100%;\n // height: 100%;\n transition: padding 0.3s ease;\n }\n }","@use 'animation' as *;\n@use 'ccm-center' as center;\n@use 'ccm-items' as items;\n\n.ccm-full-page {\n width: 100svw;\n min-height: 100svh;\n max-height: 100svh;\n overflow: hidden;\n // height: 100%;\n position: fixed;\n left: 0;\n top: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.ccm-con {\n --ccm-parallax-x: 0px;\n --ccm-parallax-y: 0px;\n --ccm-tilt-x: 0deg;\n --ccm-tilt-y: 0deg;\n // max-width: 100svw;\n // max-height: 100svh;\n // width: 100svw;\n // height: 100svh;\n // width: 100%;\n // height: 100%;\n // perspective 和 overflow 互斥,前者会设置 overflow: flat\n // overflow: hidden;\n // margin 最多只能水平居中\n // width: 1;\n // height: 1;\n // margin: auto;\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n z-index: 10;\n // display: flex;\n // place-items: center;\n // flex-direction: column;\n // overflow: hidden;\n transform-style: preserve-3d;\n transform: perspective(300px) rotateX(var(--ccm-tilt-y)) rotateY(var(--ccm-tilt-x));\n transition: transform 180ms ease-out;\n // opacity: var(--ccm-bg-opacity, 1);\n // backdrop-filter: blur(var(--ccm-bg-blur, 0px));\n\n\n &.row {\n flex-direction: row;\n }\n\n * {\n margin: 0;\n // 不知为何这个优先级这么高\n // padding: 0;\n\n &:focus-visible {\n outline: none;\n }\n }\n\n .ccm-center {\n // 别问问就是报错要加上 !optional\n @extend center !optional;\n }\n\n .ccm-items {\n @extend items !optional;\n }\n\n}"],"names":[],"sourceRoot":""}
1
+ {"version":3,"file":"configurable-cross-menu.css","mappings":"AAAA,6BACE,GACE,sDAGF,IACE,2DAGF,KACE,yDAIJ,4BACE,GACE,4BAGF,IACE,2BAGF,KACE,4BAIJ,uCACE,SACE,eACA,gBAEA,qBACE,gBACA,eAEA,yDAEE,gBAUR,gCACE,GACE,6BACA,iHAGF,IACE,gCAIF,KAEE,oBACA,6IAIJ,qCACE,GACE,6BACA,iHAGF,IACE,gCAIF,KACE,oBACA,6IAIJ,gCACE,GACE,oBACA,4IAGF,KACE,6BACA,kHAIJ,qCACE,GACE,oBACA,4IAGF,KACE,6BACA,kHAIJ,2BACE,GACE,+BAEA,oIAGF,KACE,kBACA,mIAIJ,2BACE,GACE,kBACA,kIAGF,KACE,kBACA,qIA+BJ,gCACE,GACE,kBACA,mGAGF,IACE,qBACA,+JAGF,KACE,oBACA,6IAIJ,qCACE,GACE,kBACA,mGAGF,IACE,qBACA,+JAGF,KACE,oBACA,6IAIJ,6BACE,GACE,kBACA,gCACA,oIAGF,IACE,oBACA,iCAGF,IACE,kCACA,qIAGF,KACE,kBACA,kCACA,mICtNJ,YACE,gBACA,iBACA,kBACA,mBACA,kBACA,gBAEA,UACA,kBAEA,SACA,QAEA,qFACA,6CAEA,qIACA,oCAGA,sDACA,8CACA,yHACA,8DACA,aACA,SACA,sBACA,uBACA,mBACA,wGAEA,oBAEA,mBACE,SACA,sBAGF,gBACE,SACA,mBAGF,oBACE,WACA,kBACA,QACA,SACA,WACA,YACA,UACA,+PACE,CAGF,wBACA,gCACA,gDACA,oBAGF,mBACE,WACA,kBACA,QACA,UACA,YACA,mGACE,CACF,4BACA,mDACA,oBAGF,6CAKE,kBACA,cAGF,gBACE,cACA,yCACA,0CACA,uFAKF,eACE,6CACA,0CAGF,cACE,gDACA,6CCpGF,WACE,wDACA,2DAGA,+CACA,iBACA,qFACA,+BACA,4CACA,kBACA,SACA,QACA,oCACA,mIACA,kHAIA,6CACA,mBACA,qCACA,yBACA,uBACA,kBAEA,sBACA,oBAGA,yEAKA,iBACE,yBAGF,gBACE,yBAGF,gBACE,mIACA,yBACA,8EASF,yEAIE,kBACA,kBACA,sCACA,6KACA,qFACA,UAEA,6FACE,wKAKJ,kBACE,UAEA,oBACE,iBAIJ,qGAIE,UAEA,6GACE,kBAIJ,aAEE,cACA,qBACA,cAIA,4BC/FN,eACE,aACA,kBACA,kBACA,gBAEA,eACA,OACA,MACA,aACA,mBACA,uBACA,cAGF,SACE,sBACA,sBACA,mBACA,mBAaA,SACA,UACA,sBACA,WAKA,4BACA,mFACA,oCAKA,aACE,mBAGF,WACE,SAIA,yBACE,aAcF,2BACE,gDAGF,0BACE,qDAEA,+BACE,kF","sources":["webpack://ConfigurableCrossMenu/./src/styles/animation.scss","webpack://ConfigurableCrossMenu/./src/styles/ccm-center.scss","webpack://ConfigurableCrossMenu/./src/styles/ccm-items.scss","webpack://ConfigurableCrossMenu/./src/styles/index.scss"],"sourcesContent":["@keyframes ccm-center-aurora {\n 0% {\n transform: translate(-50%, -50%) rotate(0deg) scale(1);\n }\n\n 50% {\n transform: translate(-50%, -50%) rotate(180deg) scale(1.08);\n }\n\n 100% {\n transform: translate(-50%, -50%) rotate(360deg) scale(1);\n }\n}\n\n@keyframes ccm-center-sheen {\n 0% {\n transform: translateX(-120%);\n }\n\n 55% {\n transform: translateX(130%);\n }\n\n 100% {\n transform: translateX(130%);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .ccm-con {\n transform: none;\n transition: none;\n\n .ccm-center {\n transition: none;\n transform: none;\n\n &::before,\n &::after {\n animation: none;\n }\n }\n\n // .ccm-items {\n // transition: none;\n // }\n }\n}\n\n@keyframes ccm-item-show-rotate {\n 0% {\n filter: opacity(0) blur(20px);\n transform: translate(-50%, -50%) rotate(calc(var(--ccm-item-deg) - 90deg)) translateX(0) translateY(0) scale(0.5);\n }\n\n 40% {\n filter: opacity(0.55) blur(10px);\n // transform: translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(calc(var(--ccm-item-x) * 1.05)) translateY(calc(var(--ccm-item-y) * -1.05)) scale(1.05);\n }\n\n 100% {\n // 比默认高 0.1 试试?\n filter: opacity(0.5);\n transform: translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(var(--ccm-item-x)) translateY(calc(var(--ccm-item-y) * -1)) scale(1);\n }\n}\n\n@keyframes ccm-item-show-rotate-down {\n 0% {\n filter: opacity(0) blur(20px);\n transform: translate(-50%, -50%) rotate(calc(var(--ccm-item-deg) - 90deg)) translateX(0) translateY(0) scale(0.5);\n }\n\n 40% {\n filter: opacity(0.55) blur(10px);\n // transform: translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(calc(var(--ccm-item-x) * 1.05)) translateY(calc(var(--ccm-item-y) * -1.05)) scale(1.05);\n }\n\n 100% {\n filter: opacity(0.5);\n transform: translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(calc(var(--ccm-item-x) * -1)) translateY(var(--ccm-item-y)) scale(1);\n }\n}\n\n@keyframes ccm-item-hide-rotate {\n 0% {\n filter: opacity(0.5);\n transform: translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(var(--ccm-item-x)) translateY(calc(var(--ccm-item-y) * -1)) scale(1);\n }\n\n 100% {\n filter: opacity(0) blur(20px);\n transform: translate(-50%, -50%) rotate(calc(var(--ccm-item-deg) - 90deg)) translateX(0) translateY(0) scale(0.5);\n }\n}\n\n@keyframes ccm-item-hide-rotate-down {\n 0% {\n filter: opacity(0.5);\n transform: translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(calc(var(--ccm-item-x) * -1)) translateY(var(--ccm-item-y)) scale(1);\n }\n\n 100% {\n filter: opacity(0) blur(20px);\n transform: translate(-50%, -50%) rotate(calc(var(--ccm-item-deg) - 90deg)) translateX(0) translateY(0) scale(0.5);\n }\n}\n\n@keyframes ccm-center-show {\n 0% {\n filter: opacity(0.2) blur(20px);\n // transform: translate3d(calc(var(--ccm-parallax-x) * -0.08), calc(var(--ccm-parallax-y) * -0.08), 0) scale(1.3);\n transform: translate(-50%, -50%) translate3d(calc(var(--ccm-parallax-x) * -0.08), calc(var(--ccm-parallax-y) * -0.08), 0) scale(0.4);\n }\n\n 100% {\n filter: opacity(1);\n transform: translate(-50%, -50%) translate3d(calc(var(--ccm-parallax-x) * -0.08), calc(var(--ccm-parallax-y) * -0.08), 0) scale(1);\n }\n}\n\n@keyframes ccm-center-hide {\n 0% {\n filter: opacity(1);\n transform: translate(-50%, -50%) translate3d(calc(var(--ccm-parallax-x) * -0.08), calc(var(--ccm-parallax-y) * -0.08), 0) scale(1);\n }\n\n 100% {\n filter: opacity(0);\n transform: translate(-50%, -50%) translate3d(calc(var(--ccm-parallax-x) * -0.08), calc(var(--ccm-parallax-y) * -0.08), 0) scale(0.4);\n }\n}\n\n// 其它可能的方案\n// @keyframes ccm-item-show-rotate {\n// 0% {\n// filter: opacity(0);\n// transform: translate(-50%, -50%) rotate(calc(var(--ccm-item-deg) - 180deg)) translateX(0) translateY(0) scale(0.5);\n// }\n\n// 100% {\n// // 比默认高 0.1 试试?\n// filter: opacity(0.5);\n// transform: translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(var(--ccm-item-x)) translateY(calc(var(--ccm-item-y) * -1)) scale(1);\n// }\n// }\n\n// @keyframes ccm-center-show {\n// 0% {\n// filter: opacity(0);\n// transform: translate3d(calc(var(--ccm-parallax-x) * -0.08), calc(var(--ccm-parallax-y) * -0.08), 0) scale(0.4);\n// }\n\n// 100% {\n// filter: opacity(1);\n// transform: translate3d(calc(var(--ccm-parallax-x) * -0.08), calc(var(--ccm-parallax-y) * -0.08), 0) scale(1);\n// }\n// }\n\n\n@keyframes ccm-item-show-ripple {\n 0% {\n filter: opacity(0);\n transform: translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(0) translateY(0) scale(0.6);\n }\n\n 70% {\n filter: opacity(0.55);\n transform: translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(calc(var(--ccm-item-x) * 1.05)) translateY(calc(var(--ccm-item-y) * -1.05)) scale(1.05);\n }\n\n 100% {\n filter: opacity(0.5);\n transform: translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(var(--ccm-item-x)) translateY(calc(var(--ccm-item-y) * -1)) scale(1);\n }\n}\n\n@keyframes ccm-item-show-ripple-down {\n 0% {\n filter: opacity(0);\n transform: translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(0) translateY(0) scale(0.6);\n }\n\n 70% {\n filter: opacity(0.55);\n transform: translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(calc(var(--ccm-item-x) * -1.05)) translateY(calc(var(--ccm-item-y) * 1.05)) scale(1.05);\n }\n\n 100% {\n filter: opacity(0.5);\n transform: translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(calc(var(--ccm-item-x) * -1)) translateY(var(--ccm-item-y)) scale(1);\n }\n}\n\n@keyframes ccm-center-expand {\n 0% {\n filter: opacity(0);\n clip-path: circle(0% at 50% 50%);\n transform: translate(-50%, -50%) translate3d(calc(var(--ccm-parallax-x) * -0.08), calc(var(--ccm-parallax-y) * -0.08), 0) scale(0.9);\n }\n\n 40% {\n filter: opacity(0.7);\n clip-path: circle(60% at 50% 50%);\n }\n\n 70% {\n clip-path: circle(120% at 50% 50%);\n transform: translate(-50%, -50%) translate3d(calc(var(--ccm-parallax-x) * -0.08), calc(var(--ccm-parallax-y) * -0.08), 0) scale(1.03);\n }\n\n 100% {\n filter: opacity(1);\n clip-path: circle(200% at 50% 50%);\n transform: translate(-50%, -50%) translate3d(calc(var(--ccm-parallax-x) * -0.08), calc(var(--ccm-parallax-y) * -0.08), 0) scale(1);\n }\n}",".ccm-center {\n min-width: 150px;\n min-height: 150px;\n width: fit-content;\n height: fit-content;\n position: absolute;\n overflow: hidden;\n // isolation: isolate;\n z-index: 2;\n padding: 12px 20px;\n // margin: 0 auto;\n left: 50%;\n top: 50%;\n // padding: min(calc(var(--ccm-center-radius) - 8), 12px) 20px;\n border: var(--ccm-center-border-size, 0px) solid var(--ccm-center-border-color, #333);\n border-radius: var(--ccm-center-radius, 20px);\n // background-color: var(--ccm-bg-center-color / var(--ccm-bg-opacity, 1), hsl(0, 0%, 100%));\n background-color: color-mix(in srgb, var(--ccm-bg-center-color, hsl(0, 0%, 100%)) calc(var(--ccm-bg-opacity, 1) * 100%), transparent);\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);\n // 又踩坑…… opacity 和 blur 不兼容……\n // opacity: var(--ccm-bg-opacity, 1);\n -webkit-backdrop-filter: blur(var(--ccm-bg-blur, 0px));\n backdrop-filter: blur(var(--ccm-bg-blur, 0px));\n transform: translate(-50%, -50%) translate3d(calc(var(--ccm-parallax-x) * -0.08), calc(var(--ccm-parallax-y) * -0.08), 0);\n transition: transform 220ms ease-out, box-shadow 220ms ease-out;\n display: flex;\n gap: 0.5em;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n animation: ccm-center-show var(--ccm-center-show-duration, 500ms) cubic-bezier(0.30, 0.30, 0.40, 1.15) none;\n // 依然不能去否则在 center 处 hover 依然抽搐\n pointer-events: none;\n\n &.column {\n gap: 0.5em;\n flex-direction: column;\n }\n\n &.row {\n gap: 0.8em;\n flex-direction: row;\n }\n\n &::before {\n content: \"\";\n position: absolute;\n top: 50%;\n left: 50%;\n width: 260%;\n height: 260%;\n z-index: 0;\n background:\n radial-gradient(circle at 22% 32%, hsl(194 90% 68% / 0.45) 0%, transparent 45%),\n radial-gradient(circle at 78% 72%, hsl(328 95% 68% / 0.35) 0%, transparent 40%),\n radial-gradient(circle at 50% 50%, hsl(42 95% 72% / 0.25) 0%, transparent 56%);\n transform-origin: center;\n transform: translate(-50%, -50%);\n animation: ccm-center-aurora 13s linear infinite;\n pointer-events: none;\n }\n\n &::after {\n content: \"\";\n position: absolute;\n inset: 0;\n z-index: 0;\n opacity: 0.22;\n background:\n linear-gradient(115deg, transparent 22%, rgb(255 255 255 / 0.85) 49%, transparent 78%);\n transform: translateX(-120%);\n animation: ccm-center-sheen 7s ease-in-out infinite;\n pointer-events: none;\n }\n\n img,\n h3,\n p {\n // position: relative;\n // z-index: 1;\n width: fit-content;\n margin: 0 auto;\n }\n\n img {\n display: block;\n width: var(--ccm-center-icon-size, 100px);\n height: var(--ccm-center-icon-size, 100px);\n border-radius: var(--ccm-center-icon-radius, calc(var(--ccm-center-radius, 25%) * 0.8));\n // object-fit: cover;\n // overflow: hidden;\n }\n\n h3 {\n font-size: var(--ccm-center-title-size, 30px);\n color: var(--ccm-center-title-color, #333);\n }\n\n p {\n font-size: var(--ccm-center-subtitle-size, 15px);\n color: var(--ccm-center-subtitle-color, #666);\n }\n}"," .ccm-items {\n --ccm-item-y: calc(var(--ccm-item-offset, 0px) + 100px);\n --ccm-item-hover-shift: var(--ccm-item-hover-offset, 30px);\n // --ccm-item-hover-shift: calc(var(--ccm-item-hover-offset, 0px) + 15px);\n // --ccm-item-hover-shift: clamp(15px, 30%, 72px);\n min-height: max(var(--ccm-menu-length, 0), 80px);\n padding: 12px 2px;\n background-color: var(--ccm-item-bg-color, var(--ccm-bg-menu-color, hsl(0, 0%, 93%)));\n border: 0px solid transparent;\n border-radius: var(--ccm-items-radius, 10px);\n position: absolute;\n left: 50%;\n top: 50%;\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);\n transform: translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(var(--ccm-item-x)) translateY(calc(var(--ccm-item-y) * -1));\n transition: padding 0.3s ease,\n filter 0.3s ease,\n transform 0.5s cubic-bezier(0.175, 0.885, 0.32, 1.275),\n border 0.3s ease;\n color: var(--ccm-menu-color, hsl(0, 0%, 20%));\n white-space: nowrap;\n font-size: var(--ccm-item-size, 30px);\n writing-mode: vertical-rl;\n text-orientation: mixed;\n text-align: center;\n // 指明元素将要发生的变化,以便浏览器可以提前做好优化,提升动画性能。一般已经尽力优化作为最后手段,过多使用可能导致内存占用 https: //developer.mozilla.org/zh-CN/docs/Web/CSS/Reference/Properties/will-change\n will-change: transform;\n filter: opacity(0.5);\n // 不能用 forward 否则结束后保留动画状态 hover 的 translate 不生效\n // https: //cubic-bezier.tupulin.com/#cubic-bezier(0.30,0.30,0.40,1.15)\n animation: ccm-item-show-rotate 1s cubic-bezier(0.30, 0.30, 0.40, 1.15) none;\n\n &.up {}\n\n // haiku 4.5 都补不出来的属性😋\n &.right {\n writing-mode: sideways-lr;\n }\n\n &.left {\n writing-mode: sideways-rl;\n }\n\n &.down {\n transform: translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(calc(var(--ccm-item-x) * -1)) translateY(var(--ccm-item-y));\n writing-mode: vertical-lr;\n animation: ccm-item-show-rotate-down 1s cubic-bezier(0.30, 0.30, 0.40, 1.15) none;\n }\n\n // &.selecting:not(:hover):not(:focus):not(:active) {\n // // padding: 20px 8px;\n // border: 0px;\n // filter: opacity(0.8);\n // }\n\n &.selecting,\n &:hover,\n &:focus,\n &:active {\n filter: opacity(1);\n padding: 25px 10px;\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.15);\n transform: translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(var(--ccm-item-x)) translateY(calc(var(--ccm-item-y) * -1 - var(--ccm-item-hover-shift))) scale(1.08);\n border: var(--ccm-center-border-size, 2px) solid var(--ccm-center-border-color, #333);\n z-index: 1;\n\n &.down {\n transform: translate(-50%, -50%) rotate(var(--ccm-item-deg)) translateX(var(--ccm-item-x)) translateY(calc(var(--ccm-item-y) + var(--ccm-item-hover-shift))) scale(1.08);\n }\n }\n\n // 判断子元素!\n &:has(a) {\n padding: 0;\n\n a {\n padding: 12px 2px;\n }\n }\n\n &.selecting:has(a),\n &:hover:has(a),\n &:focus:has(a),\n &:active:has(a) {\n padding: 0;\n\n a {\n padding: 25px 10px;\n }\n }\n\n a {\n // hhh 666\n color: inherit;\n text-decoration: none;\n display: block;\n // 搞不懂 width 默认……\n // width: 100%;\n // height: 100%;\n transition: padding 0.3s ease;\n }\n }","@use 'animation' as *;\n@use 'ccm-center' as center;\n@use 'ccm-items' as items;\n\n.ccm-full-page {\n width: 100svw;\n min-height: 100svh;\n max-height: 100svh;\n overflow: hidden;\n // height: 100%;\n position: fixed;\n left: 0;\n top: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: -9999;\n}\n\n.ccm-con {\n --ccm-parallax-x: 0px;\n --ccm-parallax-y: 0px;\n --ccm-tilt-x: 0deg;\n --ccm-tilt-y: 0deg;\n // max-width: 100svw;\n // max-height: 100svh;\n // width: 100svw;\n // height: 100svh;\n // width: 100%;\n // height: 100%;\n // perspective 和 overflow 互斥,前者会设置 overflow: flat\n // overflow: hidden;\n // margin 最多只能水平居中\n // width: 1;\n // height: 1;\n // margin: auto;\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n z-index: 10;\n // display: flex;\n // place-items: center;\n // flex-direction: column;\n // overflow: hidden;\n transform-style: preserve-3d;\n transform: perspective(300px) rotateX(var(--ccm-tilt-y)) rotateY(var(--ccm-tilt-x));\n transition: transform 180ms ease-out;\n // opacity: var(--ccm-bg-opacity, 1);\n // backdrop-filter: blur(var(--ccm-bg-blur, 0px));\n\n\n &.row {\n flex-direction: row;\n }\n\n * {\n margin: 0;\n // 不知为何这个优先级这么高\n // padding: 0;\n\n &:focus-visible {\n outline: none;\n }\n }\n\n .ccm-center {\n // 别问问就是报错要加上 !optional\n @extend center !optional;\n }\n\n .ccm-items {\n @extend items !optional;\n }\n\n &.close {\n .ccm-center {\n animation: ccm-center-hide 0.5s ease-out forwards;\n }\n\n .ccm-items {\n animation: ccm-item-hide-rotate 0.5s ease-out forwards;\n\n &.down {\n animation: ccm-item-hide-rotate-down 1s cubic-bezier(0.30, 0.30, 0.40, 1.15) forwards;\n }\n }\n }\n\n}"],"names":[],"sourceRoot":""}
@@ -1,2 +1,2 @@
1
- !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.ConfigurableCrossMenu=t():e.ConfigurableCrossMenu=t()}(globalThis,()=>(()=>{var e={711(e,t,n){var i=n(561);e.exports=function(e){var t,n="",o=e||{};return function(e,o,r,c,l){n+='<div class="ccm-center">',r?n+="\x3c!-- 自定义渲染的内容会通过 JS 插入--\x3e":(l||o)&&(o&&(n=n+"<img"+i.attr("src",o,!0,!0)+' alt="icon">'),l&&(n=n+"<div"+i.attr("class",i.classes(["column"===e?"col":"row"],[!0]),!1,!0)+"><h3>"+i.escape(null==(t=l)?"":t)+"</h3>",c&&(n=n+"<p>"+i.escape(null==(t=c)?"":t)+"</p>"),n+="</div>")),n+="</div>"}.call(this,"direction"in o?o.direction:"undefined"!=typeof direction?direction:void 0,"icon"in o?o.icon:"undefined"!=typeof icon?icon:void 0,"render"in o?o.render:"undefined"!=typeof render?render:void 0,"subtitle"in o?o.subtitle:"undefined"!=typeof subtitle?subtitle:void 0,"title"in o?o.title:"undefined"!=typeof title?title:void 0),n}},548(e,t,n){var i=n(561);e.exports=function(e){var t,n="",o=e||{};return function(e,o,r,c,l,s,a,u,d,f,h){const m=[null!=d&&`--ccm-item-size:${d}`,null!=u&&`--ccm-item-deg:${u}`,null!=h&&`--ccm-item-x:${h}`,null!=a&&`--ccm-item-offset:${a}`,null!=l&&`--ccm-item-hover-offset:${l}`,null!=r&&`--ccm-item-bg-color:${r}`].filter(e).join(";");n=n+"<button"+(i.attr("class",i.classes([`ccm-items ${c}`],[!0]),!1,!0)+i.attr("onclick",o,!0,!0)+i.attr("style",i.style(m),!0,!0))+">",f?n=n+"<a"+i.attr("href",f,!0,!0)+' rel="noopener noreferrer">'+i.escape(null==(t=s)?"":t)+"</a>":n+=i.escape(null==(t=s)?"":t),n+="</button>"}.call(this,"Boolean"in o?o.Boolean:"undefined"!=typeof Boolean?Boolean:void 0,"action"in o?o.action:"undefined"!=typeof action?action:void 0,"bgColor"in o?o.bgColor:"undefined"!=typeof bgColor?bgColor:void 0,"direction"in o?o.direction:"undefined"!=typeof direction?direction:void 0,"hoverOffset"in o?o.hoverOffset:"undefined"!=typeof hoverOffset?hoverOffset:void 0,"label"in o?o.label:"undefined"!=typeof label?label:void 0,"offset"in o?o.offset:"undefined"!=typeof offset?offset:void 0,"rotate"in o?o.rotate:"undefined"!=typeof rotate?rotate:void 0,"size"in o?o.size:"undefined"!=typeof size?size:void 0,"url"in o?o.url:"undefined"!=typeof url?url:void 0,"x"in o?o.x:"undefined"!=typeof x?x:void 0),n}},561(e,t,n){"use strict";var i=Object.prototype.hasOwnProperty;function o(e,t){return Array.isArray(e)?function(e,t){for(var n,i="",r="",c=Array.isArray(t),l=0;l<e.length;l++)(n=o(e[l]))&&(c&&t[l]&&(n=s(n)),i=i+r+n,r=" ");return i}(e,t):e&&"object"==typeof e?function(e){var t="",n="";for(var o in e)o&&e[o]&&i.call(e,o)&&(t=t+n+o,n=" ");return t}(e):e||""}function r(e){if(!e)return"";if("object"==typeof e){var t="";for(var n in e)i.call(e,n)&&(t=t+n+":"+e[n]+";");return t}return e+""}function c(e,t,n,i){if(!1===t||null==t||!t&&("class"===e||"style"===e))return"";if(!0===t)return" "+(i?e:e+'="'+e+'"');var o=typeof t;return"object"!==o&&"function"!==o||"function"!=typeof t.toJSON||(t=t.toJSON()),"string"==typeof t||(t=JSON.stringify(t),n||-1===t.indexOf('"'))?(n&&(t=s(t))," "+e+'="'+t+'"'):" "+e+"='"+t.replace(/'/g,"&#39;")+"'"}t.merge=function e(t,n){if(1===arguments.length){for(var i=t[0],o=1;o<t.length;o++)i=e(i,t[o]);return i}for(var c in n)if("class"===c){var l=t[c]||[];t[c]=(Array.isArray(l)?l:[l]).concat(n[c]||[])}else if("style"===c){l=(l=r(t[c]))&&";"!==l[l.length-1]?l+";":l;var s=r(n[c]);s=s&&";"!==s[s.length-1]?s+";":s,t[c]=l+s}else t[c]=n[c];return t},t.classes=o,t.style=r,t.attr=c,t.attrs=function(e,t){var n="";for(var l in e)if(i.call(e,l)){var s=e[l];if("class"===l){n=c(l,s=o(s),!1,t)+n;continue}"style"===l&&(s=r(s)),n+=c(l,s,!1,t)}return n};var l=/["&<>]/;function s(e){var t=""+e,n=l.exec(t);if(!n)return e;var i,o,r,c="";for(i=n.index,o=0;i<t.length;i++){switch(t.charCodeAt(i)){case 34:r="&quot;";break;case 38:r="&amp;";break;case 60:r="&lt;";break;case 62:r="&gt;";break;default:continue}o!==i&&(c+=t.substring(o,i)),o=i+1,c+=r}return o!==i?c+t.substring(o,i):c}t.escape=s,t.rethrow=function e(t,i,o,r){if(!(t instanceof Error))throw t;if(!("undefined"==typeof window&&i||r))throw t.message+=" on line "+o,t;var c,l,s,a;try{r=r||n(354).readFileSync(i,{encoding:"utf8"}),c=3,l=r.split("\n"),s=Math.max(o-c,0),a=Math.min(l.length,o+c)}catch(n){return t.message+=" - could not read from "+i+" ("+n.message+")",void e(t,null,o)}c=l.slice(s,a).map(function(e,t){var n=t+s+1;return(n==o?" > ":" ")+n+"| "+e}).join("\n"),t.path=i;try{t.message=(i||"Pug")+":"+o+"\n"+c+"\n\n"+t.message}catch(e){}throw t}},354(){}},t={};function n(i){var o=t[i];if(void 0!==o)return o.exports;var r=t[i]={exports:{}};return e[i](r,r.exports,n),r.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var i in t)n.o(t,i)&&!n.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var i={};return(()=>{"use strict";n.r(i),n.d(i,{CCM:()=>s});const e={container:"#ccm-con",startingDirections:"up",style:{width:200,radius:50,background:{menuColor:{light:"hsl(0, 0%, 93%)",dark:"hsl(0, 0%, 30%)"},centerColor:{light:"hsl(0, 0%, 100%)",dark:"hsl(0, 0%, 50%)"},opacity:.5,blur:3},center:{title:{content:"CCM",size:16,color:{light:"hsl(0, 0%, 20%)",dark:"hsl(0, 0%, 90%)"},radius:"5%"},subtitle:{content:"Configurable Cross Menu",size:12,color:{light:"hsl(0, 0%, 50%)",dark:"hsl(0, 0%, 80%)"}},style:{direction:"column",color:{light:"hsl(0, 0%, 20%)",dark:"hsl(0, 0%, 90%)"},radius:20,parallaxEffect:!0}},menu:{length:100,color:{light:"hsl(0, 0%, 40%)",dark:"hsl(0, 0%, 60%)"},radius:8},showAnimation:{center:{duration:500},menu:{durationPerItem:100}}},keyBindings:{}};function t(e,t){var n,i,o,r,c,l;const s=t;return{...s,...e,style:{...s.style,...e.style,background:{...s.style.background,...null===(n=e.style)||void 0===n?void 0:n.background},menu:{...s.style.menu,...null===(i=e.style)||void 0===i?void 0:i.menu},center:(()=>{var t;const n="render"in s.style.center?void 0:s.style.center,i=null===(t=e.style)||void 0===t?void 0:t.center;return i?"render"in i?i:{...i,style:{...null==n?void 0:n.style,...i.style}}:s.style.center})(),showAnimation:{center:{...s.style.showAnimation.center,...null===(r=null===(o=e.style)||void 0===o?void 0:o.showAnimation)||void 0===r?void 0:r.center},menu:{...s.style.showAnimation.menu,...null===(l=null===(c=e.style)||void 0===c?void 0:c.showAnimation)||void 0===l?void 0:l.menu}}}}}var o=n(711),r=n.n(o),c=n(548),l=n.n(c);class s{get config(){return this._config}set config(e){this._config={...this._config,...e}}get container(){var e;return this._containerEle&&document.querySelector(".ccm-con")||(this._containerEle=document.createElement("div"),this._containerEle.classList.add("ccm-con"),null===(e=document.querySelector(this.config.container))||void 0===e||e.appendChild(this._containerEle)),this._containerEle}constructor(n,i=!0){this.items=[],this.initialized=!1,this._containerEle=null,this.selectAwaitingDirection=null,this.selectAwaitingTimer=null,this.selectAwaitDelayMS=5e3,this._config=function(n,i){const o=t(n,e);return i&&(o.keyBindings={w:"up",d:"right",s:"down",a:"left",arrowup:"up",arrowright:"right",arrowdown:"down",arrowleft:"left"}),o}(n,i)}render(e=[],n,i){const o=async()=>{var o;try{this.destroy()}catch(e){console.error("Error during previous CCM destroy:",e)}e&&(this.items=e),i&&(this._config=t(i,this._config)),n&&(this.config.container=n),this.initialized||(this.initialized=!0,this.updateCSS(),"style"in this.config.style.center&&(null===(o=this.config.style.center.style)||void 0===o?void 0:o.parallaxEffect)&&this.registerParallaxEffect(),this.registerKeyboardEvents());try{this.renderCenter(),setTimeout(()=>{this.renderMenuItems()},Math.max(0,this.config.style.showAnimation.center.duration-500))}catch(e){console.error("Error rendering CCM:",e),this.destroy()}};"loading"===document.readyState?document.addEventListener("DOMContentLoaded",o):o()}updateCSS(){var e,t,n,i,o,r,c,l,s,a,u,d;document.querySelector(this.config.container).classList.add("ccm-full-page");const f=document.head,h=this.config.style,m=document.createElement("style"),g=e=>e?"string"==typeof e?e:e.light:"",y=e=>{var t;return e?"string"==typeof e?e:null!==(t=e.dark)&&void 0!==t?t:e.light:""},v=e=>null!=e?"number"==typeof e?`${e}px`:e:"",p="render"in h.center?null:h.center,b=(e,t)=>null!=t&&""!==t?` ${e}: ${t};`:"";m.innerHTML=[":root {",b("--ccm-width",v(h.width)),b("--ccm-bg-menu-color",g(h.background.menuColor)),b("--ccm-bg-center-color",g(h.background.centerColor)),b("--ccm-bg-opacity",h.background.opacity),null!=h.background.blur?` --ccm-bg-blur: ${h.background.blur}px;`:"",null!=(null===(e=null==p?void 0:p.icon)||void 0===e?void 0:e.size)?` --ccm-center-icon-size: ${v(p.icon.size)};`:"",null!=(null===(t=null==p?void 0:p.title)||void 0===t?void 0:t.size)?` --ccm-center-title-size: ${v(p.title.size)};`:"",(null===(n=null==p?void 0:p.title)||void 0===n?void 0:n.color)?b("--ccm-center-title-color",g(p.title.color)):"",null!=(null===(i=null==p?void 0:p.subtitle)||void 0===i?void 0:i.size)?` --ccm-center-subtitle-size: ${v(p.subtitle.size)};`:"",(null===(o=null==p?void 0:p.subtitle)||void 0===o?void 0:o.color)?b("--ccm-center-subtitle-color",g(p.subtitle.color)):"",null!=(null===(r=null==p?void 0:p.style)||void 0===r?void 0:r.borderSize)?` --ccm-center-border-size: ${v(p.style.borderSize)};`:"",(null===(c=null==p?void 0:p.style)||void 0===c?void 0:c.color)?b("--ccm-center-border-color",g(p.style.color)):"",null!=(null===(l=null==p?void 0:p.style)||void 0===l?void 0:l.radius)?` --ccm-center-radius: ${v(p.style.radius)};`:"",b("--ccm-menu-length",v(h.menu.length)),b("--ccm-menu-color",g(h.menu.color)),null!=h.menu.radius?` --ccm-menu-radius: ${v(h.menu.radius)};`:"","}","",".dark {",b("--ccm-bg-menu-color",y(h.background.menuColor)),b("--ccm-bg-center-color",y(h.background.centerColor)),(null===(s=null==p?void 0:p.title)||void 0===s?void 0:s.color)?b("--ccm-center-title-color",y(p.title.color)):"",(null===(a=null==p?void 0:p.subtitle)||void 0===a?void 0:a.color)?b("--ccm-center-subtitle-color",y(p.subtitle.color)):"",(null===(u=null==p?void 0:p.style)||void 0===u?void 0:u.color)?b("--ccm-center-border-color",y(p.style.color)):"",b("--ccm-menu-color",y(h.menu.color)),(null===(d=null==p?void 0:p.style)||void 0===d?void 0:d.color)?b("color",y(p.style.color)):"","}",h.showAnimation.menu.durationPerItem?`--ccm-menu-show-duration: ${h.showAnimation.menu.durationPerItem}ms`:"",h.showAnimation.center.duration?`--ccm-center-show-duration: ${h.showAnimation.center.duration}ms`:""].filter(Boolean).join("\n"),f.appendChild(m)}renderMenuItems(){const e=this.items,t=[e.filter(e=>"up"===e.direction),e.filter(e=>"right"===e.direction),e.filter(e=>"down"===e.direction),e.filter(e=>"left"===e.direction)],n={};e.forEach(e=>{if("function"==typeof e.action){const t=Math.random().toString(36).substr(2,9);n[t]=e.action,e.action=`__ccm_dispatch_func('${t}')`}}),window.__ccm_dispatch_func=function(e){const t=n[e];t?t():console.warn(`No function found for hash: ${e}`)},(async()=>{var e;const n=null!==(e=this.config.style.showAnimation.menu.durationPerItem)&&void 0!==e?e:0;for(const e of t)0!==e.length&&(await new Promise(e=>setTimeout(e,n)),1===e.length?this._createMenuItem(e[0]):2===e.length&&(this._createMenuItem(e[0],-20,6),await new Promise(e=>setTimeout(e,n)),this._createMenuItem(e[1],20,-6)))})()}_createMenuItem(e,t=0,n=0){const i=l()({...e,action:e.action,rotate:`${{up:0,right:90,down:0,left:270}[e.direction]+t}deg`,x:`${n}px`});this.container.insertAdjacentHTML("beforeend",i)}renderCenter(){var e,t;if(this.config.style.center.render&&"function"==typeof this.config.style.center.render){const e=this.config.style.center.render();if(!(e instanceof HTMLElement))throw new Error("Custom center render function must return an HTMLElement");return void this.container.appendChild(e)}const n=r()({title:this.config.style.center.title.content,subtitle:null===(e=this.config.style.center.subtitle)||void 0===e?void 0:e.content,icon:null===(t=this.config.style.center.icon)||void 0===t?void 0:t.url});this.container.insertAdjacentHTML("beforeend",n)}registerParallaxEffect(){const e=document.querySelector(this.config.container);if(!e||!this.container)throw new Error("Parallax container or CCM container not found");const t=window.matchMedia("(prefers-reduced-motion: reduce)").matches,n=window.matchMedia("(hover: hover) and (pointer: fine)").matches;if(t||!n)return;let i=null,o=!1;const r=()=>{if(!i)return;const t=e.getBoundingClientRect(),n=2*((i.clientX-t.left)/t.width-.5),o=2*((i.clientY-t.top)/t.height-.5);this.container.style.setProperty("--ccm-parallax-x",`${(80*n).toFixed(2)}px`),this.container.style.setProperty("--ccm-parallax-y",`${(80*o).toFixed(2)}px`),this.container.style.setProperty("--ccm-tilt-x",`${(25*n).toFixed(2)}deg`),this.container.style.setProperty("--ccm-tilt-y",`${(20*-o).toFixed(2)}deg`)},c=()=>{this.container.style.setProperty("--ccm-parallax-x","0px"),this.container.style.setProperty("--ccm-parallax-y","0px"),this.container.style.setProperty("--ccm-tilt-x","0deg"),this.container.style.setProperty("--ccm-tilt-y","0deg")};e.addEventListener("pointermove",e=>{i=e,o||(o=!0,requestAnimationFrame(()=>{r(),o=!1}))},{passive:!0}),e.addEventListener("pointerleave",()=>{i=null,requestAnimationFrame(c)},{passive:!0})}registerKeyboardEvents(){document.addEventListener("keydown",e=>{const t=e.key.toLowerCase(),n=this.config.keyBindings[t];n&&(e.preventDefault(),this._ccmHandlePress(n))})}_clear(){const e=document.querySelectorAll(".ccm-items.selecting");this.selectAwaitingDirection=null,e.forEach(e=>{e.classList.remove("selecting")})}_ccmClearSelecting(e=!1){this.selectAwaitingTimer&&(clearTimeout(this.selectAwaitingTimer),this.selectAwaitingTimer=null),e?this.selectAwaitingTimer=setTimeout(()=>this._clear(),!0===e?this.selectAwaitDelayMS:e):this._clear()}_ccmHandlePress(e){if(!e)throw new Error("direction is required");if(null!==this.selectAwaitingDirection){if(e===this.selectAwaitingDirection)return void this._ccmClearSelecting(!0);if(this._ccmTriggerAwaitingSelection(e))return;this._ccmClearSelecting()}const t=document.querySelectorAll(`.ccm-items.${e}`);if(t)if(t.forEach(e=>{e.classList.add("selecting")}),t.length>1)this.selectAwaitingDirection=e,this._ccmClearSelecting(!0);else if(1===t.length){const e=t[0];e.firstElementChild?e.children[0].click():e.click(),this._ccmClearSelecting(500)}}_ccmIsVertical(e){return!!e&&["up","down"].includes(e)}_ccmIsHorizontal(e){return!!e&&["left","right"].includes(e)}_ccmTriggerAwaitingSelection(e){var t,n;const i=document.querySelectorAll(`.ccm-items.${this.selectAwaitingDirection}`);if(0===i.length)return!1;const o=this._ccmIsVertical(this.selectAwaitingDirection);if(!(o?this._ccmIsHorizontal(e):this._ccmIsVertical(e)))return this._ccmClearSelecting(),!0;const r=Array.from(i).sort((e,t)=>{const n=e.getBoundingClientRect(),i=t.getBoundingClientRect();return o?n.left-i.left:n.top-i.top}),c=o?"left"===e?r[0]:r[r.length-1]:"up"===e?r[0]:r[r.length-1];return!!c&&(null===(n=null!==(t=c.firstElementChild)&&void 0!==t?t:c)||void 0===n||n.click(),this._ccmClearSelecting(1e3),!0)}destroy(){const e=document.querySelector(this.config.container);e&&(e.innerHTML="",this.selectAwaitingDirection=null,this.selectAwaitingTimer&&(clearTimeout(this.selectAwaitingTimer),this.selectAwaitingTimer=null),this.items=[])}}})(),i})());
1
+ !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.ConfigurableCrossMenu=t():e.ConfigurableCrossMenu=t()}(globalThis,()=>(()=>{var e={711(e,t,n){var i=n(561);e.exports=function(e){var t,n="",r=e||{};return function(e,r,o,l,c){n+='<div class="ccm-center">',o?n+="\x3c!-- 自定义渲染的内容会通过 JS 插入--\x3e":(c||r)&&(r&&(n=n+"<img"+i.attr("src",r,!0,!0)+' alt="icon">'),c&&(n=n+"<div"+i.attr("class",i.classes(["column"===e?"col":"row"],[!0]),!1,!0)+"><h3>"+i.escape(null==(t=c)?"":t)+"</h3>",l&&(n=n+"<p>"+i.escape(null==(t=l)?"":t)+"</p>"),n+="</div>")),n+="</div>"}.call(this,"direction"in r?r.direction:"undefined"!=typeof direction?direction:void 0,"icon"in r?r.icon:"undefined"!=typeof icon?icon:void 0,"render"in r?r.render:"undefined"!=typeof render?render:void 0,"subtitle"in r?r.subtitle:"undefined"!=typeof subtitle?subtitle:void 0,"title"in r?r.title:"undefined"!=typeof title?title:void 0),n}},548(e,t,n){var i=n(561);e.exports=function(e){var t,n="",r=e||{};return function(e,r,o,l,c,s,a,d,u,h,f){const m=[null!=u&&`--ccm-item-size:${u}`,null!=d&&`--ccm-item-deg:${d}`,null!=f&&`--ccm-item-x:${f}`,null!=a&&`--ccm-item-offset:${a}`,null!=c&&`--ccm-item-hover-offset:${c}`,null!=o&&`--ccm-item-bg-color:${o}`].filter(e).join(";");n=n+"<button"+(i.attr("class",i.classes([`ccm-items ${l}`],[!0]),!1,!0)+i.attr("onclick",r,!0,!0)+i.attr("style",i.style(m),!0,!0))+">",h?n=n+"<a"+i.attr("href",h,!0,!0)+' rel="noopener noreferrer">'+i.escape(null==(t=s)?"":t)+"</a>":n+=i.escape(null==(t=s)?"":t),n+="</button>"}.call(this,"Boolean"in r?r.Boolean:"undefined"!=typeof Boolean?Boolean:void 0,"action"in r?r.action:"undefined"!=typeof action?action:void 0,"bgColor"in r?r.bgColor:"undefined"!=typeof bgColor?bgColor:void 0,"direction"in r?r.direction:"undefined"!=typeof direction?direction:void 0,"hoverOffset"in r?r.hoverOffset:"undefined"!=typeof hoverOffset?hoverOffset:void 0,"label"in r?r.label:"undefined"!=typeof label?label:void 0,"offset"in r?r.offset:"undefined"!=typeof offset?offset:void 0,"rotate"in r?r.rotate:"undefined"!=typeof rotate?rotate:void 0,"size"in r?r.size:"undefined"!=typeof size?size:void 0,"url"in r?r.url:"undefined"!=typeof url?url:void 0,"x"in r?r.x:"undefined"!=typeof x?x:void 0),n}},561(e,t,n){"use strict";var i=Object.prototype.hasOwnProperty;function r(e,t){return Array.isArray(e)?function(e,t){for(var n,i="",o="",l=Array.isArray(t),c=0;c<e.length;c++)(n=r(e[c]))&&(l&&t[c]&&(n=s(n)),i=i+o+n,o=" ");return i}(e,t):e&&"object"==typeof e?function(e){var t="",n="";for(var r in e)r&&e[r]&&i.call(e,r)&&(t=t+n+r,n=" ");return t}(e):e||""}function o(e){if(!e)return"";if("object"==typeof e){var t="";for(var n in e)i.call(e,n)&&(t=t+n+":"+e[n]+";");return t}return e+""}function l(e,t,n,i){if(!1===t||null==t||!t&&("class"===e||"style"===e))return"";if(!0===t)return" "+(i?e:e+'="'+e+'"');var r=typeof t;return"object"!==r&&"function"!==r||"function"!=typeof t.toJSON||(t=t.toJSON()),"string"==typeof t||(t=JSON.stringify(t),n||-1===t.indexOf('"'))?(n&&(t=s(t))," "+e+'="'+t+'"'):" "+e+"='"+t.replace(/'/g,"&#39;")+"'"}t.merge=function e(t,n){if(1===arguments.length){for(var i=t[0],r=1;r<t.length;r++)i=e(i,t[r]);return i}for(var l in n)if("class"===l){var c=t[l]||[];t[l]=(Array.isArray(c)?c:[c]).concat(n[l]||[])}else if("style"===l){c=(c=o(t[l]))&&";"!==c[c.length-1]?c+";":c;var s=o(n[l]);s=s&&";"!==s[s.length-1]?s+";":s,t[l]=c+s}else t[l]=n[l];return t},t.classes=r,t.style=o,t.attr=l,t.attrs=function(e,t){var n="";for(var c in e)if(i.call(e,c)){var s=e[c];if("class"===c){n=l(c,s=r(s),!1,t)+n;continue}"style"===c&&(s=o(s)),n+=l(c,s,!1,t)}return n};var c=/["&<>]/;function s(e){var t=""+e,n=c.exec(t);if(!n)return e;var i,r,o,l="";for(i=n.index,r=0;i<t.length;i++){switch(t.charCodeAt(i)){case 34:o="&quot;";break;case 38:o="&amp;";break;case 60:o="&lt;";break;case 62:o="&gt;";break;default:continue}r!==i&&(l+=t.substring(r,i)),r=i+1,l+=o}return r!==i?l+t.substring(r,i):l}t.escape=s,t.rethrow=function e(t,i,r,o){if(!(t instanceof Error))throw t;if(!("undefined"==typeof window&&i||o))throw t.message+=" on line "+r,t;var l,c,s,a;try{o=o||n(354).readFileSync(i,{encoding:"utf8"}),l=3,c=o.split("\n"),s=Math.max(r-l,0),a=Math.min(c.length,r+l)}catch(n){return t.message+=" - could not read from "+i+" ("+n.message+")",void e(t,null,r)}l=c.slice(s,a).map(function(e,t){var n=t+s+1;return(n==r?" > ":" ")+n+"| "+e}).join("\n"),t.path=i;try{t.message=(i||"Pug")+":"+r+"\n"+l+"\n\n"+t.message}catch(e){}throw t}},354(){}},t={};function n(i){var r=t[i];if(void 0!==r)return r.exports;var o=t[i]={exports:{}};return e[i](o,o.exports,n),o.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var i in t)n.o(t,i)&&!n.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var i={};return(()=>{"use strict";n.r(i),n.d(i,{CCM:()=>s});const e={container:"#ccm-con",startingDirections:"up",style:{width:200,radius:50,background:{menuColor:{light:"hsl(0, 0%, 93%)",dark:"hsl(0, 0%, 30%)"},centerColor:{light:"hsl(0, 0%, 100%)",dark:"hsl(0, 0%, 50%)"},opacity:.5,blur:3},center:{title:{content:"CCM",size:16,color:{light:"hsl(0, 0%, 20%)",dark:"hsl(0, 0%, 90%)"},radius:"5%"},subtitle:{content:"Configurable Cross Menu",size:12,color:{light:"hsl(0, 0%, 50%)",dark:"hsl(0, 0%, 80%)"}},style:{direction:"column",color:{light:"hsl(0, 0%, 20%)",dark:"hsl(0, 0%, 90%)"},radius:20,parallaxEffect:!0}},menu:{length:100,color:{light:"hsl(0, 0%, 40%)",dark:"hsl(0, 0%, 60%)"},radius:8},showAnimation:{center:{duration:500},menu:{durationPerItem:100}}},keyBindings:{}};function t(e,t){var n,i,r,o,l,c;const s=t;return{...s,...e,style:{...s.style,...e.style,background:{...s.style.background,...null===(n=e.style)||void 0===n?void 0:n.background},menu:{...s.style.menu,...null===(i=e.style)||void 0===i?void 0:i.menu},center:(()=>{var t;const n="render"in s.style.center?void 0:s.style.center,i=null===(t=e.style)||void 0===t?void 0:t.center;return i?"render"in i?i:{...i,style:{...null==n?void 0:n.style,...i.style}}:s.style.center})(),showAnimation:{center:{...s.style.showAnimation.center,...null===(o=null===(r=e.style)||void 0===r?void 0:r.showAnimation)||void 0===o?void 0:o.center},menu:{...s.style.showAnimation.menu,...null===(c=null===(l=e.style)||void 0===l?void 0:l.showAnimation)||void 0===c?void 0:c.menu}}}}}var r=n(711),o=n.n(r),l=n(548),c=n.n(l);class s{get config(){return this._config}set config(e){this._config={...this._config,...e}}get container(){var e;return this._containerEle&&document.querySelector(".ccm-con")||(this._containerEle=document.createElement("div"),this._containerEle.classList.add("ccm-con"),null===(e=document.querySelector(this.config.container))||void 0===e||e.appendChild(this._containerEle)),this._containerEle}constructor(n,i=!0){this.items=[],this.initialized=!1,this._containerEle=null,this.parallaxPointerMove=null,this.parallaxPointerLeave=null,this.keydownHandler=null,this.selectAwaitingDirection=null,this.selectAwaitingTimer=null,this.selectAwaitDelayMS=5e3,this._config=function(n,i){const r=t(n,e);return i&&(r.keyBindings={w:"up",d:"right",s:"down",a:"left",arrowup:"up",arrowright:"right",arrowdown:"down",arrowleft:"left"}),r}(n,i)}render(e=[],n,i){const r=async()=>{var r;try{this.destroy()}catch(e){console.error("Error during previous CCM destroy:",e)}e&&(this.items=e),i&&(this._config=t(i,this._config)),n&&(this.config.container=n),this.initialized||(this.initialized=!0,this.updateCSS(),"style"in this.config.style.center&&(null===(r=this.config.style.center.style)||void 0===r?void 0:r.parallaxEffect)&&this.registerParallaxEffect(),this.registerKeyboardEvents());try{this.renderCenter(),setTimeout(()=>{this.renderMenuItems()},Math.max(0,this.config.style.showAnimation.center.duration-500))}catch(e){console.error("Error rendering CCM:",e),this.destroy()}};"loading"===document.readyState?document.addEventListener("DOMContentLoaded",r):r()}toggle(){"complete"===document.readyState&&(this.container.classList.contains("close")?this._open():this._close())}_close(){this.container.classList.add("close"),this.unregisterParallaxEffect(),this.unregisterKeyboardEvents()}_open(){var e;this.container.classList.remove("close"),"style"in this.config.style.center&&(null===(e=this.config.style.center.style)||void 0===e?void 0:e.parallaxEffect)&&this.registerParallaxEffect(),this.registerKeyboardEvents()}updateCSS(){var e,t,n,i,r,o,l,c,s,a,d,u;document.querySelector(this.config.container).classList.add("ccm-full-page");const h=document.head,f=this.config.style,m=document.createElement("style"),g=e=>e?"string"==typeof e?e:e.light:"",v=e=>{var t;return e?"string"==typeof e?e:null!==(t=e.dark)&&void 0!==t?t:e.light:""},y=e=>null!=e?"number"==typeof e?`${e}px`:e:"",p="render"in f.center?null:f.center,b=(e,t)=>null!=t&&""!==t?` ${e}: ${t};`:"";m.innerHTML=[":root {",b("--ccm-width",y(f.width)),b("--ccm-bg-menu-color",g(f.background.menuColor)),b("--ccm-bg-center-color",g(f.background.centerColor)),b("--ccm-bg-opacity",f.background.opacity),null!=f.background.blur?` --ccm-bg-blur: ${f.background.blur}px;`:"",null!=(null===(e=null==p?void 0:p.icon)||void 0===e?void 0:e.size)?` --ccm-center-icon-size: ${y(p.icon.size)};`:"",null!=(null===(t=null==p?void 0:p.title)||void 0===t?void 0:t.size)?` --ccm-center-title-size: ${y(p.title.size)};`:"",(null===(n=null==p?void 0:p.title)||void 0===n?void 0:n.color)?b("--ccm-center-title-color",g(p.title.color)):"",null!=(null===(i=null==p?void 0:p.subtitle)||void 0===i?void 0:i.size)?` --ccm-center-subtitle-size: ${y(p.subtitle.size)};`:"",(null===(r=null==p?void 0:p.subtitle)||void 0===r?void 0:r.color)?b("--ccm-center-subtitle-color",g(p.subtitle.color)):"",null!=(null===(o=null==p?void 0:p.style)||void 0===o?void 0:o.borderSize)?` --ccm-center-border-size: ${y(p.style.borderSize)};`:"",(null===(l=null==p?void 0:p.style)||void 0===l?void 0:l.color)?b("--ccm-center-border-color",g(p.style.color)):"",null!=(null===(c=null==p?void 0:p.style)||void 0===c?void 0:c.radius)?` --ccm-center-radius: ${y(p.style.radius)};`:"",b("--ccm-menu-length",y(f.menu.length)),b("--ccm-menu-color",g(f.menu.color)),null!=f.menu.radius?` --ccm-menu-radius: ${y(f.menu.radius)};`:"","}","",".dark {",b("--ccm-bg-menu-color",v(f.background.menuColor)),b("--ccm-bg-center-color",v(f.background.centerColor)),(null===(s=null==p?void 0:p.title)||void 0===s?void 0:s.color)?b("--ccm-center-title-color",v(p.title.color)):"",(null===(a=null==p?void 0:p.subtitle)||void 0===a?void 0:a.color)?b("--ccm-center-subtitle-color",v(p.subtitle.color)):"",(null===(d=null==p?void 0:p.style)||void 0===d?void 0:d.color)?b("--ccm-center-border-color",v(p.style.color)):"",b("--ccm-menu-color",v(f.menu.color)),(null===(u=null==p?void 0:p.style)||void 0===u?void 0:u.color)?b("color",v(p.style.color)):"","}",f.showAnimation.menu.durationPerItem?`--ccm-menu-show-duration: ${f.showAnimation.menu.durationPerItem}ms`:"",f.showAnimation.center.duration?`--ccm-center-show-duration: ${f.showAnimation.center.duration}ms`:""].filter(Boolean).join("\n"),h.appendChild(m)}renderMenuItems(){const e=this.items,t=[e.filter(e=>"up"===e.direction),e.filter(e=>"right"===e.direction),e.filter(e=>"down"===e.direction),e.filter(e=>"left"===e.direction)],n={};e.forEach(e=>{if("function"==typeof e.action){const t=Math.random().toString(36).substr(2,9);n[t]=e.action,e.action=`__ccm_dispatch_func('${t}')`}}),window.__ccm_dispatch_func=function(e){const t=n[e];t?t():console.warn(`No function found for hash: ${e}`)},(async()=>{var e;const n=null!==(e=this.config.style.showAnimation.menu.durationPerItem)&&void 0!==e?e:0;for(const e of t)0!==e.length&&(await new Promise(e=>setTimeout(e,n)),1===e.length?this._createMenuItem(e[0]):2===e.length&&(this._createMenuItem(e[0],-20,6),await new Promise(e=>setTimeout(e,n)),this._createMenuItem(e[1],20,-6)))})()}_createMenuItem(e,t=0,n=0){const i=c()({...e,action:e.action,rotate:`${{up:0,right:90,down:0,left:270}[e.direction]+t}deg`,x:`${n}px`});this.container.insertAdjacentHTML("beforeend",i)}renderCenter(){var e,t;if(this.config.style.center.render&&"function"==typeof this.config.style.center.render){const e=this.config.style.center.render();if(!(e instanceof HTMLElement))throw new Error("Custom center render function must return an HTMLElement");return void this.container.appendChild(e)}const n=o()({title:this.config.style.center.title.content,subtitle:null===(e=this.config.style.center.subtitle)||void 0===e?void 0:e.content,icon:null===(t=this.config.style.center.icon)||void 0===t?void 0:t.url});this.container.insertAdjacentHTML("beforeend",n)}registerParallaxEffect(){const e=document.querySelector(this.config.container);if(!e||!this.container)throw new Error("Parallax container or CCM container not found");const t=window.matchMedia("(prefers-reduced-motion: reduce)").matches,n=window.matchMedia("(hover: hover) and (pointer: fine)").matches;if(t||!n)return;let i=null,r=!1;const o=()=>{if(!i)return;const t=e.getBoundingClientRect(),n=2*((i.clientX-t.left)/t.width-.5),r=2*((i.clientY-t.top)/t.height-.5);this.container.style.setProperty("--ccm-parallax-x",`${(80*n).toFixed(2)}px`),this.container.style.setProperty("--ccm-parallax-y",`${(80*r).toFixed(2)}px`),this.container.style.setProperty("--ccm-tilt-x",`${(25*n).toFixed(2)}deg`),this.container.style.setProperty("--ccm-tilt-y",`${(20*-r).toFixed(2)}deg`)},l=()=>{this.container.style.setProperty("--ccm-parallax-x","0px"),this.container.style.setProperty("--ccm-parallax-y","0px"),this.container.style.setProperty("--ccm-tilt-x","0deg"),this.container.style.setProperty("--ccm-tilt-y","0deg")};this.parallaxPointerMove=e=>{i=e,r||(r=!0,requestAnimationFrame(()=>{o(),r=!1}))},this.parallaxPointerLeave=()=>{i=null,requestAnimationFrame(l)},e.addEventListener("pointermove",this.parallaxPointerMove,{passive:!0}),e.addEventListener("pointerleave",this.parallaxPointerLeave,{passive:!0})}unregisterParallaxEffect(){const e=document.querySelector(this.config.container);if(!e||!this.container)throw new Error("Parallax container or CCM container not found");this.parallaxPointerMove&&(e.removeEventListener("pointermove",this.parallaxPointerMove),this.parallaxPointerMove=null),this.parallaxPointerLeave&&(e.removeEventListener("pointerleave",this.parallaxPointerLeave),this.parallaxPointerLeave=null)}registerKeyboardEvents(){this.keydownHandler=e=>{const t=e.key.toLowerCase(),n=this.config.keyBindings[t];n&&(e.preventDefault(),this._ccmHandlePress(n))},document.addEventListener("keydown",this.keydownHandler)}unregisterKeyboardEvents(){this.keydownHandler&&(document.removeEventListener("keydown",this.keydownHandler),this.keydownHandler=null)}_clear(){const e=document.querySelectorAll(".ccm-items.selecting");this.selectAwaitingDirection=null,e.forEach(e=>{e.classList.remove("selecting")})}_ccmClearSelecting(e=!1){this.selectAwaitingTimer&&(clearTimeout(this.selectAwaitingTimer),this.selectAwaitingTimer=null),e?this.selectAwaitingTimer=setTimeout(()=>this._clear(),!0===e?this.selectAwaitDelayMS:e):this._clear()}_ccmHandlePress(e){if(!e)throw new Error("direction is required");if(null!==this.selectAwaitingDirection){if(e===this.selectAwaitingDirection)return void this._ccmClearSelecting(!0);if(this._ccmTriggerAwaitingSelection(e))return;this._ccmClearSelecting()}const t=document.querySelectorAll(`.ccm-items.${e}`);if(t)if(t.forEach(e=>{e.classList.add("selecting")}),t.length>1)this.selectAwaitingDirection=e,this._ccmClearSelecting(!0);else if(1===t.length){const e=t[0];e.firstElementChild?e.children[0].click():e.click(),this._ccmClearSelecting(500)}}_ccmIsVertical(e){return!!e&&["up","down"].includes(e)}_ccmIsHorizontal(e){return!!e&&["left","right"].includes(e)}_ccmTriggerAwaitingSelection(e){var t,n;const i=document.querySelectorAll(`.ccm-items.${this.selectAwaitingDirection}`);if(0===i.length)return!1;const r=this._ccmIsVertical(this.selectAwaitingDirection);if(!(r?this._ccmIsHorizontal(e):this._ccmIsVertical(e)))return this._ccmClearSelecting(),!0;const o=Array.from(i).sort((e,t)=>{const n=e.getBoundingClientRect(),i=t.getBoundingClientRect();return r?n.left-i.left:n.top-i.top}),l=r?"left"===e?o[0]:o[o.length-1]:"up"===e?o[0]:o[o.length-1];return!!l&&(null===(n=null!==(t=l.firstElementChild)&&void 0!==t?t:l)||void 0===n||n.click(),this._ccmClearSelecting(1e3),!0)}destroy(){this.initialized=!1,this.unregisterParallaxEffect(),this.unregisterKeyboardEvents();const e=document.querySelector(this.config.container);e&&(e.innerHTML="",this._containerEle=null,this.selectAwaitingDirection=null,this.selectAwaitingTimer&&(clearTimeout(this.selectAwaitingTimer),this.selectAwaitingTimer=null),this.items=[])}}})(),i})());
2
2
  //# sourceMappingURL=configurable-cross-menu.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"configurable-cross-menu.js","mappings":"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","sources":["webpack://ConfigurableCrossMenu/webpack/universalModuleDefinition","webpack://ConfigurableCrossMenu/./src/templates/center.pug","webpack://ConfigurableCrossMenu/./src/templates/menuItem.pug","webpack://ConfigurableCrossMenu/./node_modules/.pnpm/pug-runtime@3.0.1/node_modules/pug-runtime/index.js","webpack://ConfigurableCrossMenu/webpack/bootstrap","webpack://ConfigurableCrossMenu/webpack/runtime/compat get default export","webpack://ConfigurableCrossMenu/webpack/runtime/define property getters","webpack://ConfigurableCrossMenu/webpack/runtime/hasOwnProperty shorthand","webpack://ConfigurableCrossMenu/webpack/runtime/make namespace object","webpack://ConfigurableCrossMenu/./src/config.ts","webpack://ConfigurableCrossMenu/./src/crossMenu.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ConfigurableCrossMenu\"] = factory();\n\telse\n\t\troot[\"ConfigurableCrossMenu\"] = factory();\n})(globalThis, () => {\nreturn ","var pug = require(\"!../../node_modules/.pnpm/pug@3.0.4/node_modules/pug-runtime/index.js\");\n\nfunction template(locals) {var pug_html = \"\", pug_mixins = {}, pug_interp;;\n var locals_for_with = (locals || {});\n \n (function (direction, icon, render, subtitle, title) {\n pug_html = pug_html + \"\\u003Cdiv class=\\\"ccm-center\\\"\\u003E\";\nif (render) {\npug_html = pug_html + \"\\u003C!-- 自定义渲染的内容会通过 JS 插入--\\u003E\";\n}\nelse\nif (title || icon) {\nif (icon) {\npug_html = pug_html + \"\\u003Cimg\" + (pug.attr(\"src\", icon, true, true)+\" alt=\\\"icon\\\"\") + \"\\u003E\";\n}\nif (title) {\npug_html = pug_html + \"\\u003Cdiv\" + (pug.attr(\"class\", pug.classes([direction === 'column'? 'col': 'row'], [true]), false, true)) + \"\\u003E\\u003Ch3\\u003E\" + (pug.escape(null == (pug_interp = title) ? \"\" : pug_interp)) + \"\\u003C\\u002Fh3\\u003E\";\nif (subtitle) {\npug_html = pug_html + \"\\u003Cp\\u003E\" + (pug.escape(null == (pug_interp = subtitle) ? \"\" : pug_interp)) + \"\\u003C\\u002Fp\\u003E\";\n}\npug_html = pug_html + \"\\u003C\\u002Fdiv\\u003E\";\n}\n}\npug_html = pug_html + \"\\u003C\\u002Fdiv\\u003E\";\n }.call(this, \"direction\" in locals_for_with ?\n locals_for_with.direction :\n typeof direction !== 'undefined' ? direction : undefined, \"icon\" in locals_for_with ?\n locals_for_with.icon :\n typeof icon !== 'undefined' ? icon : undefined, \"render\" in locals_for_with ?\n locals_for_with.render :\n typeof render !== 'undefined' ? render : undefined, \"subtitle\" in locals_for_with ?\n locals_for_with.subtitle :\n typeof subtitle !== 'undefined' ? subtitle : undefined, \"title\" in locals_for_with ?\n locals_for_with.title :\n typeof title !== 'undefined' ? title : undefined));\n ;;return pug_html;};\nmodule.exports = template;","var pug = require(\"!../../node_modules/.pnpm/pug@3.0.4/node_modules/pug-runtime/index.js\");\n\nfunction template(locals) {var pug_html = \"\", pug_mixins = {}, pug_interp;;\n var locals_for_with = (locals || {});\n \n (function (Boolean, action, bgColor, direction, hoverOffset, label, offset, rotate, size, url, x) {\n const styleParts = [size != null && `--ccm-item-size:${size}`, rotate != null && `--ccm-item-deg:${rotate}`, x != null && `--ccm-item-x:${x}`, offset != null && `--ccm-item-offset:${offset}`, hoverOffset != null && `--ccm-item-hover-offset:${hoverOffset}`, bgColor != null && `--ccm-item-bg-color:${bgColor}`].filter(Boolean).join(';')\npug_html = pug_html + \"\\u003Cbutton\" + (pug.attr(\"class\", pug.classes([`ccm-items ${direction}`], [true]), false, true)+pug.attr(\"onclick\", action, true, true)+pug.attr(\"style\", pug.style(styleParts), true, true)) + \"\\u003E\";\nif (url) {\npug_html = pug_html + \"\\u003Ca\" + (pug.attr(\"href\", url, true, true)+\" rel=\\\"noopener noreferrer\\\"\") + \"\\u003E\" + (pug.escape(null == (pug_interp = label) ? \"\" : pug_interp)) + \"\\u003C\\u002Fa\\u003E\";\n}\nelse {\npug_html = pug_html + (pug.escape(null == (pug_interp = label) ? \"\" : pug_interp));\n}\npug_html = pug_html + \"\\u003C\\u002Fbutton\\u003E\";\n }.call(this, \"Boolean\" in locals_for_with ?\n locals_for_with.Boolean :\n typeof Boolean !== 'undefined' ? Boolean : undefined, \"action\" in locals_for_with ?\n locals_for_with.action :\n typeof action !== 'undefined' ? action : undefined, \"bgColor\" in locals_for_with ?\n locals_for_with.bgColor :\n typeof bgColor !== 'undefined' ? bgColor : undefined, \"direction\" in locals_for_with ?\n locals_for_with.direction :\n typeof direction !== 'undefined' ? direction : undefined, \"hoverOffset\" in locals_for_with ?\n locals_for_with.hoverOffset :\n typeof hoverOffset !== 'undefined' ? hoverOffset : undefined, \"label\" in locals_for_with ?\n locals_for_with.label :\n typeof label !== 'undefined' ? label : undefined, \"offset\" in locals_for_with ?\n locals_for_with.offset :\n typeof offset !== 'undefined' ? offset : undefined, \"rotate\" in locals_for_with ?\n locals_for_with.rotate :\n typeof rotate !== 'undefined' ? rotate : undefined, \"size\" in locals_for_with ?\n locals_for_with.size :\n typeof size !== 'undefined' ? size : undefined, \"url\" in locals_for_with ?\n locals_for_with.url :\n typeof url !== 'undefined' ? url : undefined, \"x\" in locals_for_with ?\n locals_for_with.x :\n typeof x !== 'undefined' ? x : undefined));\n ;;return pug_html;};\nmodule.exports = template;","'use strict';\n\nvar pug_has_own_property = Object.prototype.hasOwnProperty;\n\n/**\n * Merge two attribute objects giving precedence\n * to values in object `b`. Classes are special-cased\n * allowing for arrays and merging/joining appropriately\n * resulting in a string.\n *\n * @param {Object} a\n * @param {Object} b\n * @return {Object} a\n * @api private\n */\n\nexports.merge = pug_merge;\nfunction pug_merge(a, b) {\n if (arguments.length === 1) {\n var attrs = a[0];\n for (var i = 1; i < a.length; i++) {\n attrs = pug_merge(attrs, a[i]);\n }\n return attrs;\n }\n\n for (var key in b) {\n if (key === 'class') {\n var valA = a[key] || [];\n a[key] = (Array.isArray(valA) ? valA : [valA]).concat(b[key] || []);\n } else if (key === 'style') {\n var valA = pug_style(a[key]);\n valA = valA && valA[valA.length - 1] !== ';' ? valA + ';' : valA;\n var valB = pug_style(b[key]);\n valB = valB && valB[valB.length - 1] !== ';' ? valB + ';' : valB;\n a[key] = valA + valB;\n } else {\n a[key] = b[key];\n }\n }\n\n return a;\n}\n\n/**\n * Process array, object, or string as a string of classes delimited by a space.\n *\n * If `val` is an array, all members of it and its subarrays are counted as\n * classes. If `escaping` is an array, then whether or not the item in `val` is\n * escaped depends on the corresponding item in `escaping`. If `escaping` is\n * not an array, no escaping is done.\n *\n * If `val` is an object, all the keys whose value is truthy are counted as\n * classes. No escaping is done.\n *\n * If `val` is a string, it is counted as a class. No escaping is done.\n *\n * @param {(Array.<string>|Object.<string, boolean>|string)} val\n * @param {?Array.<string>} escaping\n * @return {String}\n */\nexports.classes = pug_classes;\nfunction pug_classes_array(val, escaping) {\n var classString = '',\n className,\n padding = '',\n escapeEnabled = Array.isArray(escaping);\n for (var i = 0; i < val.length; i++) {\n className = pug_classes(val[i]);\n if (!className) continue;\n escapeEnabled && escaping[i] && (className = pug_escape(className));\n classString = classString + padding + className;\n padding = ' ';\n }\n return classString;\n}\nfunction pug_classes_object(val) {\n var classString = '',\n padding = '';\n for (var key in val) {\n if (key && val[key] && pug_has_own_property.call(val, key)) {\n classString = classString + padding + key;\n padding = ' ';\n }\n }\n return classString;\n}\nfunction pug_classes(val, escaping) {\n if (Array.isArray(val)) {\n return pug_classes_array(val, escaping);\n } else if (val && typeof val === 'object') {\n return pug_classes_object(val);\n } else {\n return val || '';\n }\n}\n\n/**\n * Convert object or string to a string of CSS styles delimited by a semicolon.\n *\n * @param {(Object.<string, string>|string)} val\n * @return {String}\n */\n\nexports.style = pug_style;\nfunction pug_style(val) {\n if (!val) return '';\n if (typeof val === 'object') {\n var out = '';\n for (var style in val) {\n /* istanbul ignore else */\n if (pug_has_own_property.call(val, style)) {\n out = out + style + ':' + val[style] + ';';\n }\n }\n return out;\n } else {\n return val + '';\n }\n}\n\n/**\n * Render the given attribute.\n *\n * @param {String} key\n * @param {String} val\n * @param {Boolean} escaped\n * @param {Boolean} terse\n * @return {String}\n */\nexports.attr = pug_attr;\nfunction pug_attr(key, val, escaped, terse) {\n if (\n val === false ||\n val == null ||\n (!val && (key === 'class' || key === 'style'))\n ) {\n return '';\n }\n if (val === true) {\n return ' ' + (terse ? key : key + '=\"' + key + '\"');\n }\n var type = typeof val;\n if (\n (type === 'object' || type === 'function') &&\n typeof val.toJSON === 'function'\n ) {\n val = val.toJSON();\n }\n if (typeof val !== 'string') {\n val = JSON.stringify(val);\n if (!escaped && val.indexOf('\"') !== -1) {\n return ' ' + key + \"='\" + val.replace(/'/g, '&#39;') + \"'\";\n }\n }\n if (escaped) val = pug_escape(val);\n return ' ' + key + '=\"' + val + '\"';\n}\n\n/**\n * Render the given attributes object.\n *\n * @param {Object} obj\n * @param {Object} terse whether to use HTML5 terse boolean attributes\n * @return {String}\n */\nexports.attrs = pug_attrs;\nfunction pug_attrs(obj, terse) {\n var attrs = '';\n\n for (var key in obj) {\n if (pug_has_own_property.call(obj, key)) {\n var val = obj[key];\n\n if ('class' === key) {\n val = pug_classes(val);\n attrs = pug_attr(key, val, false, terse) + attrs;\n continue;\n }\n if ('style' === key) {\n val = pug_style(val);\n }\n attrs += pug_attr(key, val, false, terse);\n }\n }\n\n return attrs;\n}\n\n/**\n * Escape the given string of `html`.\n *\n * @param {String} html\n * @return {String}\n * @api private\n */\n\nvar pug_match_html = /[\"&<>]/;\nexports.escape = pug_escape;\nfunction pug_escape(_html) {\n var html = '' + _html;\n var regexResult = pug_match_html.exec(html);\n if (!regexResult) return _html;\n\n var result = '';\n var i, lastIndex, escape;\n for (i = regexResult.index, lastIndex = 0; i < html.length; i++) {\n switch (html.charCodeAt(i)) {\n case 34:\n escape = '&quot;';\n break;\n case 38:\n escape = '&amp;';\n break;\n case 60:\n escape = '&lt;';\n break;\n case 62:\n escape = '&gt;';\n break;\n default:\n continue;\n }\n if (lastIndex !== i) result += html.substring(lastIndex, i);\n lastIndex = i + 1;\n result += escape;\n }\n if (lastIndex !== i) return result + html.substring(lastIndex, i);\n else return result;\n}\n\n/**\n * Re-throw the given `err` in context to the\n * the pug in `filename` at the given `lineno`.\n *\n * @param {Error} err\n * @param {String} filename\n * @param {String} lineno\n * @param {String} str original source\n * @api private\n */\n\nexports.rethrow = pug_rethrow;\nfunction pug_rethrow(err, filename, lineno, str) {\n if (!(err instanceof Error)) throw err;\n if ((typeof window != 'undefined' || !filename) && !str) {\n err.message += ' on line ' + lineno;\n throw err;\n }\n var context, lines, start, end;\n try {\n str = str || require('fs').readFileSync(filename, {encoding: 'utf8'});\n context = 3;\n lines = str.split('\\n');\n start = Math.max(lineno - context, 0);\n end = Math.min(lines.length, lineno + context);\n } catch (ex) {\n err.message +=\n ' - could not read from ' + filename + ' (' + ex.message + ')';\n pug_rethrow(err, null, lineno);\n return;\n }\n\n // Error context\n context = lines\n .slice(start, end)\n .map(function(line, i) {\n var curr = i + start + 1;\n return (curr == lineno ? ' > ' : ' ') + curr + '| ' + line;\n })\n .join('\\n');\n\n // Alter exception message\n err.path = filename;\n try {\n err.message =\n (filename || 'Pug') +\n ':' +\n lineno +\n '\\n' +\n context +\n '\\n\\n' +\n err.message;\n } catch (e) {}\n throw err;\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","type CSSSize = string | number;\ntype CSSColor = { light: string, dark?: string } | string; // 支持单一颜色字符串或根据主题自动切换的颜色对象\nexport type MenuDirection = 'up' | 'right' | 'down' | 'left';\n\ninterface CenterConfig {\n // 方式1:预设图标 + 文字\n // icon radius 默认为 center radius 的 80%,可以通过此处覆盖\n icon?: { url: string; size?: CSSSize, radius?: CSSSize };\n title?: { content: string; size?: CSSSize, color?: CSSColor };\n subtitle?: { content: string; size?: CSSSize, color?: CSSColor };\n style?: { direction?: 'column' | 'row', color: CSSColor, borderSize?: CSSSize, radius?: CSSSize, parallaxEffect?: boolean }; // 图标和文字的排列方式,默认为 'column'(图标在上,文字在下),'row'(图标在左,文字在右)\n}\n\ninterface CenterCustom {\n // 方式2:完全自定义\n render: () => HTMLElement;\n}\n\n// 用 discriminated union 替代 union of objects\nexport type CenterStyle =\n // | CenterConfig\n | (CenterConfig & { render?: never })\n | CenterCustom;\n\ntype MenuStyle = {}\n\nexport type MenuItem = {\n direction: MenuDirection,\n label: string,\n size?: CSSSize,\n bgColor?: CSSColor,\n offset?: CSSSize, // 菜单项相对于中心的偏移距离,默认偏移 50px,可能需要手动调整\n hoverOffset?: CSSSize, // 鼠标悬停时菜单项的额外偏移距离,默认为 15px,可能需要手动调整\n} & ({\n url?: string\n action?: never\n} | {\n action: () => void | Promise<void>\n url?: never\n});\n\nexport interface CCMConfig {\n container: string, // 菜单挂载的容器\n startingDirections: MenuDirection,\n style: {\n width: CSSSize, // ?这是干啥的?弃用?\n // radius: CSSSize,\n background: {\n menuColor?: CSSColor,\n centerColor?: CSSColor,\n opacity?: number\n blur?: number,\n }\n center: CenterStyle,\n menu: {\n length: CSSSize, // 菜单长度\n color?: CSSColor,\n radius?: CSSSize,\n }\n showAnimation: {\n center: {\n duration: number, // 设置 0 关闭\n }\n menu: {\n durationPerItem: number, // 设置 0 关闭\n }\n },\n }\n // items: MenuItem[],\n keyBindings: Partial<Record<string, MenuDirection>>\n}\n\n\n\nconst defaultConfig = {\n container: \"#ccm-con\",\n startingDirections: 'up',\n style: {\n width: 200,\n radius: 50,\n background: {\n menuColor: { light: 'hsl(0, 0%, 93%)', dark: 'hsl(0, 0%, 30%)' },\n // ~~现在不需要注意了 | 注意,如果需要 blur 效果,必须在背景色中使用 alpha 通道(如 rgba 或 hsla),下方的 opacity 为整个元素的透明度与 blur 无关\n centerColor: { light: 'hsl(0, 0%, 100%)', dark: 'hsl(0, 0%, 50%)' },\n opacity: 0.5,\n blur: 3,\n },\n center: {\n title: { content: 'CCM', size: 16, color: { light: 'hsl(0, 0%, 20%)', dark: 'hsl(0, 0%, 90%)' }, radius: '5%' },\n subtitle: { content: 'Configurable Cross Menu', size: 12, color: { light: 'hsl(0, 0%, 50%)', dark: 'hsl(0, 0%, 80%)' } },\n //TODO color 没有实现\n style: { direction: 'column', color: { light: 'hsl(0, 0%, 20%)', dark: 'hsl(0, 0%, 90%)' }, radius: 20, parallaxEffect: true }, // borderSize: 2, borderColor: 'hsl(0, 0%, 80%)',\n },\n menu: {\n length: 100,\n\n color: { light: 'hsl(0, 0%, 40%)', dark: 'hsl(0, 0%, 60%)' },\n radius: 8,\n },\n showAnimation: {\n center: {\n duration: 500,\n },\n menu: {\n durationPerItem: 100,\n }\n }\n },\n // items: [],\n keyBindings: {}\n} as CCMConfig;\n\n// export function mergeConfig(config: Partial<CCMConfig>): CCMConfig;\n// export function mergeConfig(config: Partial<CCMConfig>, origin: CCMConfig): CCMConfig;\nexport function mergeConfig(config: Partial<CCMConfig>, origin: CCMConfig): CCMConfig {\n // let base: CCMConfig;\n // if (origin) {\n // base = origin;\n // } else {\n // // @ts-expect-error this\n // if ('config' in this) {\n // // @ts-expect-error this\n // base = this.config;\n // } else {\n // throw new Error('No origin config provided and this.config is not available');\n // }\n // }\n const base = origin;\n return {\n ...base,\n ...config,\n style: {\n ...base.style,\n ...config.style,\n background: { ...base.style.background, ...config.style?.background },\n menu: { ...base.style.menu, ...config.style?.menu },\n center: (() => {\n const dc = 'render' in base.style.center ? undefined : base.style.center;\n const uc = config.style?.center;\n if (!uc) return base.style.center;\n if ('render' in uc) return uc;\n return { ...uc, style: { ...dc?.style, ...uc.style } as NonNullable<typeof uc.style> };\n })(),\n showAnimation: {\n center: { ...base.style.showAnimation.center, ...config.style?.showAnimation?.center },\n menu: { ...base.style.showAnimation.menu, ...config.style?.showAnimation?.menu },\n },\n },\n }\n}\n\nexport function CCMConfigBuilder(config: Partial<CCMConfig>): CCMConfig;\nexport function CCMConfigBuilder(config: Partial<CCMConfig>, useDefaultKeyBindings: boolean): CCMConfig;\nexport function CCMConfigBuilder(config: Partial<CCMConfig>, useDefaultKeyBindings?: boolean): CCMConfig {\n const merged: CCMConfig = mergeConfig(config, defaultConfig);\n if (useDefaultKeyBindings) merged.keyBindings = {\n w: 'up',\n d: 'right',\n s: 'down',\n a: 'left',\n arrowup: 'up',\n arrowright: 'right',\n arrowdown: 'down',\n arrowleft: 'left',\n };\n return merged;\n}\n\n// export { CCMConfigBuilder };\n\nconst testItems: MenuItem[] = [\n { direction: 'up', label: 'Up Item', action: () => alert('Up') },\n { direction: 'right', label: 'Right Item', action: () => alert('Right') },\n { direction: 'down', label: 'Down Item1', action: () => alert('Down') },\n { direction: 'down', label: 'Down Item2', url: 'https://bilibili.com' },\n { direction: 'left', label: 'Left Item', action: () => alert('Left') },\n]","import { CCMConfigBuilder, mergeConfig, type CCMConfig, type MenuDirection, type MenuItem } from \"./config\";\n// import * as pug from \"pug\";\nimport centerTemplate from './templates/center.pug';\nimport menuItemTemplate from './templates/menuItem.pug';\nimport { retry } from \"./utils/utils\";\n\n/**\n * 配置化十字菜单库\n *\n * 使用方式:\n * const ccm = new CCM({ ... });\n * ccm.render();\n */\nexport class CCM {\n private _config: CCMConfig;\n private items: MenuItem[] = [];\n // private crossMenu: CrossMenu | null = null;\n private initialized = false;\n private _containerEle: HTMLElement | null = null;\n\n get config(): CCMConfig {\n return this._config;\n }\n\n set config(config: Partial<CCMConfig>) {\n this._config = { ...this._config, ...config };\n }\n\n get container() {\n // 666 isSameNode\n // if (!this._containerEle || !(document.querySelector(this.config.container) as HTMLElement)?.isSameNode(this._containerEle)) {\n // this._containerEle = document.querySelector(this.config.container) as HTMLElement;\n // }\n if (!this._containerEle || !document.querySelector(\".ccm-con\")) {\n //! 一层 div 视差效果就不会导致 menu 悬浮抽搐了???\n this._containerEle = document.createElement('div');\n this._containerEle.classList.add('ccm-con');\n document.querySelector(this.config.container)?.appendChild(this._containerEle);\n }\n return this._containerEle;\n }\n\n constructor(\n config: Partial<CCMConfig>,\n useDefaultKeyBindings: boolean = true,\n ) {\n this._config = CCMConfigBuilder(config, useDefaultKeyBindings);\n }\n\n /**\n * 渲染菜单\n * container 参数有点多余了但显式放出来又有必要\n */\n render(items: MenuItem[] = [], container?: string, config?: Partial<CCMConfig>): void {\n const init = async () => {\n // 销毁旧的菜单\n try {\n this.destroy();\n } catch (err) {\n console.error('Error during previous CCM destroy:', err);\n }\n\n if (items) this.items = items;\n // 原本用的 call this,但是 ts 的重载误认为两个参数是重载 2 然后需要三个参数(?)还是直接传 this.config\n if (config) this._config = mergeConfig(config, this._config);\n if (container) this.config.container = container;\n\n if (!this.initialized) {\n this.initialized = true;\n this.updateCSS();\n if ('style' in this.config.style.center && this.config.style.center.style?.parallaxEffect)\n this.registerParallaxEffect();\n this.registerKeyboardEvents()\n }\n\n try {\n // 渲染中心元素\n this.renderCenter();\n setTimeout(() => {\n // 渲染菜单项\n this.renderMenuItems();\n // 好奇怪为什么设 0 了都好像还是慢点……\n }, Math.max(0, this.config.style.showAnimation.center.duration - 500));\n } catch (error) {\n console.error('Error rendering CCM:', error);\n this.destroy();\n }\n\n };\n // 哦哦是喔已经加载完了哈哈\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', init);\n } else {\n init();\n }\n }\n /**\n * 更新 CSS\n */\n updateCSS(): void {\n // throw new Error('Not implemented yet');\n // this.container.classList.add('ccm-con');\n\n document.querySelector(this.config.container)!.classList.add('ccm-full-page');\n\n const head = document.head;\n const style = this.config.style;\n const styleEle = document.createElement('style');\n // styleEle.type = 'text/css'; // type 弃用\n const cl = (c: typeof style.background.menuColor) => !c ? '' : typeof c === 'string' ? c : c.light;\n const cd = (c: typeof style.background.menuColor) => !c ? '' : typeof c === 'string' ? c : (c.dark ?? c.light);\n const numOrStr = (val: string | number | undefined) => val != null ? typeof val === 'number' ? `${val}px` : val : '';\n const center = 'render' in style.center ? null : style.center;\n const v = (prop: string, val: string | number | null | undefined) => val != null && val !== '' ? ` ${prop}: ${val};` : '';\n // 这部分非常适合 vibe……\n // 确实这种数组 + '' + filter(Boolean) 的方式不错的\n styleEle.innerHTML = [\n `:root {`,\n v('--ccm-width', numOrStr(style.width)),\n v('--ccm-bg-menu-color', cl(style.background.menuColor)),\n v('--ccm-bg-center-color', cl(style.background.centerColor)),\n v('--ccm-bg-opacity', style.background.opacity),\n style.background.blur != null ? ` --ccm-bg-blur: ${style.background.blur}px;` : '',\n center?.icon?.size != null ? ` --ccm-center-icon-size: ${numOrStr(center.icon.size)};` : '',\n center?.title?.size != null ? ` --ccm-center-title-size: ${numOrStr(center.title.size)};` : '',\n center?.title?.color ? v('--ccm-center-title-color', cl(center.title.color)) : '',\n center?.subtitle?.size != null ? ` --ccm-center-subtitle-size: ${numOrStr(center.subtitle.size)};` : '',\n center?.subtitle?.color ? v('--ccm-center-subtitle-color', cl(center.subtitle.color)) : '',\n center?.style?.borderSize != null ? ` --ccm-center-border-size: ${numOrStr(center.style.borderSize)};` : '',\n center?.style?.color ? v('--ccm-center-border-color', cl(center.style.color)) : '',\n center?.style?.radius != null ? ` --ccm-center-radius: ${numOrStr(center.style.radius)};` : '',\n v('--ccm-menu-length', numOrStr(style.menu.length)),\n v('--ccm-menu-color', cl(style.menu.color)),\n style.menu.radius != null ? ` --ccm-menu-radius: ${numOrStr(style.menu.radius)};` : '',\n `}`,\n ``,\n `.dark {`,\n v('--ccm-bg-menu-color', cd(style.background.menuColor)),\n v('--ccm-bg-center-color', cd(style.background.centerColor)),\n center?.title?.color ? v('--ccm-center-title-color', cd(center.title.color)) : '',\n center?.subtitle?.color ? v('--ccm-center-subtitle-color', cd(center.subtitle.color)) : '',\n center?.style?.color ? v('--ccm-center-border-color', cd(center.style.color)) : '',\n v('--ccm-menu-color', cd(style.menu.color)),\n center?.style?.color ? v('color', cd(center.style.color)) : '',\n `}`,\n style.showAnimation.menu.durationPerItem ? `--ccm-menu-show-duration: ${style.showAnimation.menu.durationPerItem}ms` : '',\n style.showAnimation.center.duration ? `--ccm-center-show-duration: ${style.showAnimation.center.duration}ms` : '',\n ].filter(Boolean).join('\\n');\n head.appendChild(styleEle);\n\n // 引入打包 CSS?\n }\n // TODO 把 render 和 注册类 拆分出去……\n\n /**\n * 渲染菜单项\n */\n\n renderMenuItems(): void {\n // throw new Error('Not implemented yet');\n const items = this.items;\n const groupedItems = [\n items.filter(item => item.direction === 'up'),\n items.filter(item => item.direction === 'right'),\n items.filter(item => item.direction === 'down'),\n items.filter(item => item.direction === 'left'),\n ];\n const delegateFunctions: Record<string, () => void | Promise<void>> = {}\n items.forEach(item => {\n if (typeof item.action === 'function') {\n const funcHash = Math.random().toString(36).substr(2, 9);\n delegateFunctions[funcHash] = item.action;\n // @ts-expect-error bad type\n item.action = `__ccm_dispatch_func('${funcHash}')`;\n }\n });\n // var __ccm_dispatch_func = function (funcHash:string) {\n //@ts-expect-error windows has no attr\n window.__ccm_dispatch_func = function (funcHash: string) {\n // console.log(`Dispatching function for hash: ${funcHash}`);\n const func = delegateFunctions[funcHash];\n if (func) {\n func();\n } else {\n console.warn(`No function found for hash: ${funcHash}`);\n }\n };\n\n\n (async () => {\n const _delay = this.config.style.showAnimation.menu.durationPerItem ?? 0;\n for (const group of groupedItems) {\n if (group.length === 0) continue;\n await new Promise<void>(r => setTimeout(r, _delay));\n if (group.length === 1) {\n this._createMenuItem(group[0]!);\n } else if (group.length === 2) {\n this._createMenuItem(group[0]!, -20, 6);\n await new Promise<void>(r => setTimeout(r, _delay));\n this._createMenuItem(group[1]!, 20, -6);\n }\n }\n })();\n\n }\n // menuItemTemplate = pug.compileFile('/templates/menuItem.pug')\n _createMenuItem(item: MenuItem, rotateOffset = 0, x = 0) {\n const degMap = {\n up: 0,\n right: 90,\n down: 0,\n left: 270,\n };\n // 此时确实是 string……\n const menuItemHTML = menuItemTemplate({ ...item, action: item.action as unknown as string, rotate: `${degMap[item.direction] + rotateOffset}deg`, x: `${x}px` });\n this.container.insertAdjacentHTML('beforeend', menuItemHTML);\n }\n\n /**\n * 渲染中心元素\n */\n renderCenter(): void {\n // throw new Error('Not implemented yet');\n if (this.config.style.center.render && typeof this.config.style.center.render === 'function') {\n const customCenterEle = this.config.style.center.render()\n if (customCenterEle instanceof HTMLElement) {\n this.container.appendChild(customCenterEle);\n } else {\n throw new Error('Custom center render function must return an HTMLElement');\n }\n return;\n }\n const centerHtml = centerTemplate({ title: this.config.style.center.title!.content, subtitle: this.config.style.center.subtitle?.content, icon: this.config.style.center.icon?.url });\n this.container.insertAdjacentHTML('beforeend', centerHtml);\n }\n\n /**\n * 视差效果注册\n */\n registerParallaxEffect(): void {\n const parallaxCon = document.querySelector(this.config.container) as HTMLElement;\n // const this.container = this.container;\n if (!parallaxCon || !this.container) {\n throw new Error('Parallax container or CCM container not found');\n };\n\n const reduceMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n const canHover = window.matchMedia('(hover: hover) and (pointer: fine)').matches;\n if (reduceMotion || !canHover) return;\n\n let latestPointerEvent: PointerEvent | null = null;\n let ticking = false;\n\n const update = () => {\n if (!latestPointerEvent) return;\n\n const rect = parallaxCon.getBoundingClientRect();\n const nx = ((latestPointerEvent.clientX - rect.left) / rect.width - 0.5) * 2;\n const ny = ((latestPointerEvent.clientY - rect.top) / rect.height - 0.5) * 2;\n\n this.container.style.setProperty('--ccm-parallax-x', `${(nx * 80).toFixed(2)}px`);\n this.container.style.setProperty('--ccm-parallax-y', `${(ny * 80).toFixed(2)}px`);\n this.container.style.setProperty('--ccm-tilt-x', `${(nx * 25).toFixed(2)}deg`);\n this.container.style.setProperty('--ccm-tilt-y', `${(-ny * 20).toFixed(2)}deg`);\n };\n\n const reset = () => {\n this.container.style.setProperty('--ccm-parallax-x', '0px');\n this.container.style.setProperty('--ccm-parallax-y', '0px');\n this.container.style.setProperty('--ccm-tilt-x', '0deg');\n this.container.style.setProperty('--ccm-tilt-y', '0deg');\n };\n\n const onPointerMove = (event: PointerEvent) => {\n latestPointerEvent = event;\n if (ticking) return;\n\n ticking = true;\n requestAnimationFrame(() => {\n update();\n ticking = false;\n });\n };\n\n const onPointerLeave = () => {\n latestPointerEvent = null;\n requestAnimationFrame(reset);\n };\n\n // 据说如果只是简单变量读写浏览器已经做了优化可以不加 requestAnimationFrame\n // 还是得加,不加动画抽搐\n parallaxCon.addEventListener('pointermove', onPointerMove, { passive: true });\n parallaxCon.addEventListener('pointerleave', onPointerLeave, { passive: true });\n\n }\n\n /**\n * 注册键盘事件\n */\n selectAwaitingDirection: MenuDirection | null = null;\n selectAwaitingTimer: ReturnType<typeof setTimeout> | null = null;\n selectAwaitDelayMS = 5000;\n registerKeyboardEvents(): void {\n document.addEventListener('keydown', (event) => {\n const key = event.key.toLowerCase();\n // const keyMap: { [key: string]: MenuDirection } = {\n // w: 'up',\n // arrowup: 'up',\n // d: 'right',\n // arrowright: 'right',\n // s: 'down',\n // arrowdown: 'down',\n // a: 'left',\n // arrowleft: 'left'\n // };\n\n const direction = this.config.keyBindings[key];\n if (direction) {\n event.preventDefault();\n this._ccmHandlePress(direction);\n }\n\n });\n\n }\n /**\n * 通用清理选择状态工具函数\n */\n private _clear() {\n const selectingItems = document.querySelectorAll(`.ccm-items.selecting`);\n this.selectAwaitingDirection = null;\n\n selectingItems.forEach(item => {\n item.classList.remove('selecting');\n })\n }\n private _ccmClearSelecting(delay: boolean | number = false) {\n if (this.selectAwaitingTimer) {\n clearTimeout(this.selectAwaitingTimer);\n this.selectAwaitingTimer = null;\n }\n if (delay) {\n this.selectAwaitingTimer = setTimeout(() => this._clear(), delay === true ? this.selectAwaitDelayMS : delay);\n } else {\n this._clear();\n }\n }\n /**\n * 按下事件通用处理\n */\n private _ccmHandlePress(direction: MenuDirection) {\n if (!direction) throw new Error('direction is required');\n\n // 重复点击重置选择 timer\n if (this.selectAwaitingDirection !== null) {\n if (direction === this.selectAwaitingDirection) {\n this._ccmClearSelecting(true);\n return;\n }\n\n\n if (this._ccmTriggerAwaitingSelection(direction)) {\n return;\n }\n\n this._ccmClearSelecting();\n }\n\n\n const menuItems = document.querySelectorAll(`.ccm-items.${direction}`);\n if (!menuItems) {\n return\n }\n menuItems.forEach(item => {\n item.classList.add('selecting');\n });\n // 如果有多个 up 菜单项,进入选择状态,等待用户再次点击确认选择哪个菜单项\n if (menuItems.length > 1) {\n this.selectAwaitingDirection = direction;\n this._ccmClearSelecting(true);\n } else if (menuItems.length === 1) {\n // 只有一个 up 菜单项,直接触发点击\n const item = menuItems[0]!;\n // ~~是的,有 hasChildNodes 的……\n // hasChildNodes 在有纯文本时也为 true……\n if (item.firstElementChild) {\n (item.children[0] as HTMLElement).click();\n } else {\n (item as HTMLElement).click();\n }\n\n this._ccmClearSelecting(500);\n }\n }\n private _ccmIsVertical(direction: MenuDirection | null) {\n if (!direction) return false;\n return ['up', 'down'].includes(direction);\n }\n private _ccmIsHorizontal(direction: MenuDirection | null) {\n if (!direction) return false;\n return ['left', 'right'].includes(direction);\n }\n\n private _ccmTriggerAwaitingSelection(direction: MenuDirection) {\n // if (!ccmSelectAwaitingDirection) {\n // return false;\n // }\n\n const selectingItems = document.querySelectorAll(`.ccm-items.${this.selectAwaitingDirection}`);\n if (selectingItems.length === 0) {\n return false;\n }\n\n const awaitingIsVertical = this._ccmIsVertical(this.selectAwaitingDirection);\n const canResolveByCrossAxis = awaitingIsVertical\n ? this._ccmIsHorizontal(direction)\n : this._ccmIsVertical(direction);\n\n // 点击了选择方向的对向,清除选择\n if (!canResolveByCrossAxis) {\n this._ccmClearSelecting();\n return true;\n }\n\n // 对不起不能直接借用……\n // const orderedItems = [].sort.call(selectingItems, (leftItem, rightItem) => {\n const orderedItems = Array.from(selectingItems).sort((leftItem, rightItem) => {\n const leftRect = leftItem.getBoundingClientRect();\n const rightRect = rightItem.getBoundingClientRect();\n\n return awaitingIsVertical\n ? leftRect.left - rightRect.left\n : leftRect.top - rightRect.top;\n });\n\n const targetItem = awaitingIsVertical\n ? (direction === 'left' ? orderedItems[0] : orderedItems[orderedItems.length - 1])\n : (direction === 'up' ? orderedItems[0] : orderedItems[orderedItems.length - 1]);\n\n if (!targetItem) {\n return false;\n }\n\n ((targetItem.firstElementChild ?? targetItem) as HTMLElement)?.click();\n this._ccmClearSelecting(1000);\n return true;\n }\n\n /**\n * 销毁菜单\n */\n destroy(): void {\n const container = document.querySelector(this.config.container);\n if (!container) return;\n container.innerHTML = '';\n\n this.selectAwaitingDirection = null;\n\n if (this.selectAwaitingTimer) {\n clearTimeout(this.selectAwaitingTimer);\n this.selectAwaitingTimer = null;\n }\n\n this.items = [];\n\n // document.removeEventListener('keydown', this._ccmHandlePress as any);\n // 这里没有保存事件监听函数的引用,所以无法正确移除事件监听,暂时不处理了,反正页面刷新了就没了\n // if (this.crossMenu) {\n // this.crossMenu.destroy();\n // this.crossMenu = null;\n // }\n }\n}\n\nexport type { CCMConfig };\n"],"names":["root","factory","exports","module","define","amd","globalThis","pug","locals","pug_interp","pug_html","locals_for_with","direction","icon","render","subtitle","title","attr","classes","escape","call","this","undefined","Boolean","action","bgColor","hoverOffset","label","offset","rotate","size","url","x","styleParts","filter","join","style","pug_has_own_property","Object","prototype","hasOwnProperty","pug_classes","val","escaping","Array","isArray","className","classString","padding","escapeEnabled","i","length","pug_escape","pug_classes_array","key","pug_classes_object","pug_style","out","pug_attr","escaped","terse","type","toJSON","JSON","stringify","indexOf","replace","merge","pug_merge","a","b","arguments","attrs","valA","concat","valB","obj","pug_match_html","_html","html","regexResult","exec","lastIndex","result","index","charCodeAt","substring","rethrow","pug_rethrow","err","filename","lineno","str","Error","window","message","context","lines","start","end","encoding","split","Math","max","min","ex","slice","map","line","curr","path","e","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","n","getter","__esModule","d","definition","o","defineProperty","enumerable","get","prop","r","Symbol","toStringTag","value","defaultConfig","container","startingDirections","width","radius","background","menuColor","light","dark","centerColor","opacity","blur","center","content","color","parallaxEffect","menu","showAnimation","duration","durationPerItem","keyBindings","mergeConfig","config","origin","base","dc","uc","CCM","_config","_containerEle","document","querySelector","createElement","classList","add","appendChild","constructor","useDefaultKeyBindings","items","initialized","selectAwaitingDirection","selectAwaitingTimer","selectAwaitDelayMS","merged","w","s","arrowup","arrowright","arrowdown","arrowleft","CCMConfigBuilder","init","async","destroy","console","error","updateCSS","registerParallaxEffect","registerKeyboardEvents","renderCenter","setTimeout","renderMenuItems","readyState","addEventListener","head","styleEle","cl","c","cd","numOrStr","v","innerHTML","borderSize","groupedItems","item","delegateFunctions","forEach","funcHash","random","toString","substr","__ccm_dispatch_func","func","warn","_delay","group","Promise","_createMenuItem","rotateOffset","menuItemHTML","up","right","down","left","insertAdjacentHTML","customCenterEle","HTMLElement","centerHtml","parallaxCon","reduceMotion","matchMedia","matches","canHover","latestPointerEvent","ticking","update","rect","getBoundingClientRect","nx","clientX","ny","clientY","top","height","setProperty","toFixed","reset","event","requestAnimationFrame","passive","toLowerCase","preventDefault","_ccmHandlePress","_clear","selectingItems","querySelectorAll","remove","_ccmClearSelecting","delay","clearTimeout","_ccmTriggerAwaitingSelection","menuItems","firstElementChild","children","click","_ccmIsVertical","includes","_ccmIsHorizontal","awaitingIsVertical","orderedItems","from","sort","leftItem","rightItem","leftRect","rightRect","targetItem"],"sourceRoot":""}
1
+ {"version":3,"file":"configurable-cross-menu.js","mappings":"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","sources":["webpack://ConfigurableCrossMenu/webpack/universalModuleDefinition","webpack://ConfigurableCrossMenu/./src/templates/center.pug","webpack://ConfigurableCrossMenu/./src/templates/menuItem.pug","webpack://ConfigurableCrossMenu/./node_modules/.pnpm/pug-runtime@3.0.1/node_modules/pug-runtime/index.js","webpack://ConfigurableCrossMenu/webpack/bootstrap","webpack://ConfigurableCrossMenu/webpack/runtime/compat get default export","webpack://ConfigurableCrossMenu/webpack/runtime/define property getters","webpack://ConfigurableCrossMenu/webpack/runtime/hasOwnProperty shorthand","webpack://ConfigurableCrossMenu/webpack/runtime/make namespace object","webpack://ConfigurableCrossMenu/./src/config.ts","webpack://ConfigurableCrossMenu/./src/crossMenu.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ConfigurableCrossMenu\"] = factory();\n\telse\n\t\troot[\"ConfigurableCrossMenu\"] = factory();\n})(globalThis, () => {\nreturn ","var pug = require(\"!../../node_modules/.pnpm/pug@3.0.4/node_modules/pug-runtime/index.js\");\n\nfunction template(locals) {var pug_html = \"\", pug_mixins = {}, pug_interp;;\n var locals_for_with = (locals || {});\n \n (function (direction, icon, render, subtitle, title) {\n pug_html = pug_html + \"\\u003Cdiv class=\\\"ccm-center\\\"\\u003E\";\nif (render) {\npug_html = pug_html + \"\\u003C!-- 自定义渲染的内容会通过 JS 插入--\\u003E\";\n}\nelse\nif (title || icon) {\nif (icon) {\npug_html = pug_html + \"\\u003Cimg\" + (pug.attr(\"src\", icon, true, true)+\" alt=\\\"icon\\\"\") + \"\\u003E\";\n}\nif (title) {\npug_html = pug_html + \"\\u003Cdiv\" + (pug.attr(\"class\", pug.classes([direction === 'column'? 'col': 'row'], [true]), false, true)) + \"\\u003E\\u003Ch3\\u003E\" + (pug.escape(null == (pug_interp = title) ? \"\" : pug_interp)) + \"\\u003C\\u002Fh3\\u003E\";\nif (subtitle) {\npug_html = pug_html + \"\\u003Cp\\u003E\" + (pug.escape(null == (pug_interp = subtitle) ? \"\" : pug_interp)) + \"\\u003C\\u002Fp\\u003E\";\n}\npug_html = pug_html + \"\\u003C\\u002Fdiv\\u003E\";\n}\n}\npug_html = pug_html + \"\\u003C\\u002Fdiv\\u003E\";\n }.call(this, \"direction\" in locals_for_with ?\n locals_for_with.direction :\n typeof direction !== 'undefined' ? direction : undefined, \"icon\" in locals_for_with ?\n locals_for_with.icon :\n typeof icon !== 'undefined' ? icon : undefined, \"render\" in locals_for_with ?\n locals_for_with.render :\n typeof render !== 'undefined' ? render : undefined, \"subtitle\" in locals_for_with ?\n locals_for_with.subtitle :\n typeof subtitle !== 'undefined' ? subtitle : undefined, \"title\" in locals_for_with ?\n locals_for_with.title :\n typeof title !== 'undefined' ? title : undefined));\n ;;return pug_html;};\nmodule.exports = template;","var pug = require(\"!../../node_modules/.pnpm/pug@3.0.4/node_modules/pug-runtime/index.js\");\n\nfunction template(locals) {var pug_html = \"\", pug_mixins = {}, pug_interp;;\n var locals_for_with = (locals || {});\n \n (function (Boolean, action, bgColor, direction, hoverOffset, label, offset, rotate, size, url, x) {\n const styleParts = [size != null && `--ccm-item-size:${size}`, rotate != null && `--ccm-item-deg:${rotate}`, x != null && `--ccm-item-x:${x}`, offset != null && `--ccm-item-offset:${offset}`, hoverOffset != null && `--ccm-item-hover-offset:${hoverOffset}`, bgColor != null && `--ccm-item-bg-color:${bgColor}`].filter(Boolean).join(';')\npug_html = pug_html + \"\\u003Cbutton\" + (pug.attr(\"class\", pug.classes([`ccm-items ${direction}`], [true]), false, true)+pug.attr(\"onclick\", action, true, true)+pug.attr(\"style\", pug.style(styleParts), true, true)) + \"\\u003E\";\nif (url) {\npug_html = pug_html + \"\\u003Ca\" + (pug.attr(\"href\", url, true, true)+\" rel=\\\"noopener noreferrer\\\"\") + \"\\u003E\" + (pug.escape(null == (pug_interp = label) ? \"\" : pug_interp)) + \"\\u003C\\u002Fa\\u003E\";\n}\nelse {\npug_html = pug_html + (pug.escape(null == (pug_interp = label) ? \"\" : pug_interp));\n}\npug_html = pug_html + \"\\u003C\\u002Fbutton\\u003E\";\n }.call(this, \"Boolean\" in locals_for_with ?\n locals_for_with.Boolean :\n typeof Boolean !== 'undefined' ? Boolean : undefined, \"action\" in locals_for_with ?\n locals_for_with.action :\n typeof action !== 'undefined' ? action : undefined, \"bgColor\" in locals_for_with ?\n locals_for_with.bgColor :\n typeof bgColor !== 'undefined' ? bgColor : undefined, \"direction\" in locals_for_with ?\n locals_for_with.direction :\n typeof direction !== 'undefined' ? direction : undefined, \"hoverOffset\" in locals_for_with ?\n locals_for_with.hoverOffset :\n typeof hoverOffset !== 'undefined' ? hoverOffset : undefined, \"label\" in locals_for_with ?\n locals_for_with.label :\n typeof label !== 'undefined' ? label : undefined, \"offset\" in locals_for_with ?\n locals_for_with.offset :\n typeof offset !== 'undefined' ? offset : undefined, \"rotate\" in locals_for_with ?\n locals_for_with.rotate :\n typeof rotate !== 'undefined' ? rotate : undefined, \"size\" in locals_for_with ?\n locals_for_with.size :\n typeof size !== 'undefined' ? size : undefined, \"url\" in locals_for_with ?\n locals_for_with.url :\n typeof url !== 'undefined' ? url : undefined, \"x\" in locals_for_with ?\n locals_for_with.x :\n typeof x !== 'undefined' ? x : undefined));\n ;;return pug_html;};\nmodule.exports = template;","'use strict';\n\nvar pug_has_own_property = Object.prototype.hasOwnProperty;\n\n/**\n * Merge two attribute objects giving precedence\n * to values in object `b`. Classes are special-cased\n * allowing for arrays and merging/joining appropriately\n * resulting in a string.\n *\n * @param {Object} a\n * @param {Object} b\n * @return {Object} a\n * @api private\n */\n\nexports.merge = pug_merge;\nfunction pug_merge(a, b) {\n if (arguments.length === 1) {\n var attrs = a[0];\n for (var i = 1; i < a.length; i++) {\n attrs = pug_merge(attrs, a[i]);\n }\n return attrs;\n }\n\n for (var key in b) {\n if (key === 'class') {\n var valA = a[key] || [];\n a[key] = (Array.isArray(valA) ? valA : [valA]).concat(b[key] || []);\n } else if (key === 'style') {\n var valA = pug_style(a[key]);\n valA = valA && valA[valA.length - 1] !== ';' ? valA + ';' : valA;\n var valB = pug_style(b[key]);\n valB = valB && valB[valB.length - 1] !== ';' ? valB + ';' : valB;\n a[key] = valA + valB;\n } else {\n a[key] = b[key];\n }\n }\n\n return a;\n}\n\n/**\n * Process array, object, or string as a string of classes delimited by a space.\n *\n * If `val` is an array, all members of it and its subarrays are counted as\n * classes. If `escaping` is an array, then whether or not the item in `val` is\n * escaped depends on the corresponding item in `escaping`. If `escaping` is\n * not an array, no escaping is done.\n *\n * If `val` is an object, all the keys whose value is truthy are counted as\n * classes. No escaping is done.\n *\n * If `val` is a string, it is counted as a class. No escaping is done.\n *\n * @param {(Array.<string>|Object.<string, boolean>|string)} val\n * @param {?Array.<string>} escaping\n * @return {String}\n */\nexports.classes = pug_classes;\nfunction pug_classes_array(val, escaping) {\n var classString = '',\n className,\n padding = '',\n escapeEnabled = Array.isArray(escaping);\n for (var i = 0; i < val.length; i++) {\n className = pug_classes(val[i]);\n if (!className) continue;\n escapeEnabled && escaping[i] && (className = pug_escape(className));\n classString = classString + padding + className;\n padding = ' ';\n }\n return classString;\n}\nfunction pug_classes_object(val) {\n var classString = '',\n padding = '';\n for (var key in val) {\n if (key && val[key] && pug_has_own_property.call(val, key)) {\n classString = classString + padding + key;\n padding = ' ';\n }\n }\n return classString;\n}\nfunction pug_classes(val, escaping) {\n if (Array.isArray(val)) {\n return pug_classes_array(val, escaping);\n } else if (val && typeof val === 'object') {\n return pug_classes_object(val);\n } else {\n return val || '';\n }\n}\n\n/**\n * Convert object or string to a string of CSS styles delimited by a semicolon.\n *\n * @param {(Object.<string, string>|string)} val\n * @return {String}\n */\n\nexports.style = pug_style;\nfunction pug_style(val) {\n if (!val) return '';\n if (typeof val === 'object') {\n var out = '';\n for (var style in val) {\n /* istanbul ignore else */\n if (pug_has_own_property.call(val, style)) {\n out = out + style + ':' + val[style] + ';';\n }\n }\n return out;\n } else {\n return val + '';\n }\n}\n\n/**\n * Render the given attribute.\n *\n * @param {String} key\n * @param {String} val\n * @param {Boolean} escaped\n * @param {Boolean} terse\n * @return {String}\n */\nexports.attr = pug_attr;\nfunction pug_attr(key, val, escaped, terse) {\n if (\n val === false ||\n val == null ||\n (!val && (key === 'class' || key === 'style'))\n ) {\n return '';\n }\n if (val === true) {\n return ' ' + (terse ? key : key + '=\"' + key + '\"');\n }\n var type = typeof val;\n if (\n (type === 'object' || type === 'function') &&\n typeof val.toJSON === 'function'\n ) {\n val = val.toJSON();\n }\n if (typeof val !== 'string') {\n val = JSON.stringify(val);\n if (!escaped && val.indexOf('\"') !== -1) {\n return ' ' + key + \"='\" + val.replace(/'/g, '&#39;') + \"'\";\n }\n }\n if (escaped) val = pug_escape(val);\n return ' ' + key + '=\"' + val + '\"';\n}\n\n/**\n * Render the given attributes object.\n *\n * @param {Object} obj\n * @param {Object} terse whether to use HTML5 terse boolean attributes\n * @return {String}\n */\nexports.attrs = pug_attrs;\nfunction pug_attrs(obj, terse) {\n var attrs = '';\n\n for (var key in obj) {\n if (pug_has_own_property.call(obj, key)) {\n var val = obj[key];\n\n if ('class' === key) {\n val = pug_classes(val);\n attrs = pug_attr(key, val, false, terse) + attrs;\n continue;\n }\n if ('style' === key) {\n val = pug_style(val);\n }\n attrs += pug_attr(key, val, false, terse);\n }\n }\n\n return attrs;\n}\n\n/**\n * Escape the given string of `html`.\n *\n * @param {String} html\n * @return {String}\n * @api private\n */\n\nvar pug_match_html = /[\"&<>]/;\nexports.escape = pug_escape;\nfunction pug_escape(_html) {\n var html = '' + _html;\n var regexResult = pug_match_html.exec(html);\n if (!regexResult) return _html;\n\n var result = '';\n var i, lastIndex, escape;\n for (i = regexResult.index, lastIndex = 0; i < html.length; i++) {\n switch (html.charCodeAt(i)) {\n case 34:\n escape = '&quot;';\n break;\n case 38:\n escape = '&amp;';\n break;\n case 60:\n escape = '&lt;';\n break;\n case 62:\n escape = '&gt;';\n break;\n default:\n continue;\n }\n if (lastIndex !== i) result += html.substring(lastIndex, i);\n lastIndex = i + 1;\n result += escape;\n }\n if (lastIndex !== i) return result + html.substring(lastIndex, i);\n else return result;\n}\n\n/**\n * Re-throw the given `err` in context to the\n * the pug in `filename` at the given `lineno`.\n *\n * @param {Error} err\n * @param {String} filename\n * @param {String} lineno\n * @param {String} str original source\n * @api private\n */\n\nexports.rethrow = pug_rethrow;\nfunction pug_rethrow(err, filename, lineno, str) {\n if (!(err instanceof Error)) throw err;\n if ((typeof window != 'undefined' || !filename) && !str) {\n err.message += ' on line ' + lineno;\n throw err;\n }\n var context, lines, start, end;\n try {\n str = str || require('fs').readFileSync(filename, {encoding: 'utf8'});\n context = 3;\n lines = str.split('\\n');\n start = Math.max(lineno - context, 0);\n end = Math.min(lines.length, lineno + context);\n } catch (ex) {\n err.message +=\n ' - could not read from ' + filename + ' (' + ex.message + ')';\n pug_rethrow(err, null, lineno);\n return;\n }\n\n // Error context\n context = lines\n .slice(start, end)\n .map(function(line, i) {\n var curr = i + start + 1;\n return (curr == lineno ? ' > ' : ' ') + curr + '| ' + line;\n })\n .join('\\n');\n\n // Alter exception message\n err.path = filename;\n try {\n err.message =\n (filename || 'Pug') +\n ':' +\n lineno +\n '\\n' +\n context +\n '\\n\\n' +\n err.message;\n } catch (e) {}\n throw err;\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","type CSSSize = string | number;\ntype CSSColor = { light: string, dark?: string } | string; // 支持单一颜色字符串或根据主题自动切换的颜色对象\nexport type MenuDirection = 'up' | 'right' | 'down' | 'left';\n\ninterface CenterConfig {\n // 方式1:预设图标 + 文字\n // icon radius 默认为 center radius 的 80%,可以通过此处覆盖\n icon?: { url: string; size?: CSSSize, radius?: CSSSize };\n title?: { content: string; size?: CSSSize, color?: CSSColor };\n subtitle?: { content: string; size?: CSSSize, color?: CSSColor };\n style?: { direction?: 'column' | 'row', color: CSSColor, borderSize?: CSSSize, radius?: CSSSize, parallaxEffect?: boolean }; // 图标和文字的排列方式,默认为 'column'(图标在上,文字在下),'row'(图标在左,文字在右)\n}\n\ninterface CenterCustom {\n // 方式2:完全自定义\n render: () => HTMLElement;\n}\n\n// 用 discriminated union 替代 union of objects\nexport type CenterStyle =\n // | CenterConfig\n | (CenterConfig & { render?: never })\n | CenterCustom;\n\ntype MenuStyle = {}\n\nexport type MenuItem = {\n direction: MenuDirection,\n label: string,\n size?: CSSSize,\n bgColor?: CSSColor,\n offset?: CSSSize, // 菜单项相对于中心的偏移距离,默认偏移 50px,可能需要手动调整\n hoverOffset?: CSSSize, // 鼠标悬停时菜单项的额外偏移距离,默认为 15px,可能需要手动调整\n} & ({\n url?: string\n action?: never\n} | {\n action: () => void | Promise<void>\n url?: never\n});\n\nexport interface CCMConfig {\n container: string, // 菜单挂载的容器\n startingDirections: MenuDirection,\n style: {\n width: CSSSize, // ?这是干啥的?弃用?\n // radius: CSSSize,\n background: {\n menuColor?: CSSColor,\n centerColor?: CSSColor,\n opacity?: number\n blur?: number,\n }\n center: CenterStyle,\n menu: {\n length: CSSSize, // 菜单长度\n color?: CSSColor,\n radius?: CSSSize,\n }\n showAnimation: {\n center: {\n duration: number, // 设置 0 关闭\n }\n menu: {\n durationPerItem: number, // 设置 0 关闭\n }\n },\n }\n // items: MenuItem[],\n keyBindings: Partial<Record<string, MenuDirection>>\n}\n\n\n\nconst defaultConfig = {\n container: \"#ccm-con\",\n startingDirections: 'up',\n style: {\n width: 200,\n radius: 50,\n background: {\n menuColor: { light: 'hsl(0, 0%, 93%)', dark: 'hsl(0, 0%, 30%)' },\n // ~~现在不需要注意了 | 注意,如果需要 blur 效果,必须在背景色中使用 alpha 通道(如 rgba 或 hsla),下方的 opacity 为整个元素的透明度与 blur 无关\n centerColor: { light: 'hsl(0, 0%, 100%)', dark: 'hsl(0, 0%, 50%)' },\n opacity: 0.5,\n blur: 3,\n },\n center: {\n title: { content: 'CCM', size: 16, color: { light: 'hsl(0, 0%, 20%)', dark: 'hsl(0, 0%, 90%)' }, radius: '5%' },\n subtitle: { content: 'Configurable Cross Menu', size: 12, color: { light: 'hsl(0, 0%, 50%)', dark: 'hsl(0, 0%, 80%)' } },\n //TODO color 没有实现\n style: { direction: 'column', color: { light: 'hsl(0, 0%, 20%)', dark: 'hsl(0, 0%, 90%)' }, radius: 20, parallaxEffect: true }, // borderSize: 2, borderColor: 'hsl(0, 0%, 80%)',\n },\n menu: {\n length: 100,\n\n color: { light: 'hsl(0, 0%, 40%)', dark: 'hsl(0, 0%, 60%)' },\n radius: 8,\n },\n showAnimation: {\n center: {\n duration: 500,\n },\n menu: {\n durationPerItem: 100,\n }\n }\n },\n // items: [],\n keyBindings: {}\n} as CCMConfig;\n\n// export function mergeConfig(config: Partial<CCMConfig>): CCMConfig;\n// export function mergeConfig(config: Partial<CCMConfig>, origin: CCMConfig): CCMConfig;\nexport function mergeConfig(config: Partial<CCMConfig>, origin: CCMConfig): CCMConfig {\n // let base: CCMConfig;\n // if (origin) {\n // base = origin;\n // } else {\n // // @ts-expect-error this\n // if ('config' in this) {\n // // @ts-expect-error this\n // base = this.config;\n // } else {\n // throw new Error('No origin config provided and this.config is not available');\n // }\n // }\n const base = origin;\n return {\n ...base,\n ...config,\n style: {\n ...base.style,\n ...config.style,\n background: { ...base.style.background, ...config.style?.background },\n menu: { ...base.style.menu, ...config.style?.menu },\n center: (() => {\n const dc = 'render' in base.style.center ? undefined : base.style.center;\n const uc = config.style?.center;\n if (!uc) return base.style.center;\n if ('render' in uc) return uc;\n return { ...uc, style: { ...dc?.style, ...uc.style } as NonNullable<typeof uc.style> };\n })(),\n showAnimation: {\n center: { ...base.style.showAnimation.center, ...config.style?.showAnimation?.center },\n menu: { ...base.style.showAnimation.menu, ...config.style?.showAnimation?.menu },\n },\n },\n }\n}\n\nexport function CCMConfigBuilder(config: Partial<CCMConfig>): CCMConfig;\nexport function CCMConfigBuilder(config: Partial<CCMConfig>, useDefaultKeyBindings: boolean): CCMConfig;\nexport function CCMConfigBuilder(config: Partial<CCMConfig>, useDefaultKeyBindings?: boolean): CCMConfig {\n const merged: CCMConfig = mergeConfig(config, defaultConfig);\n if (useDefaultKeyBindings) merged.keyBindings = {\n w: 'up',\n d: 'right',\n s: 'down',\n a: 'left',\n arrowup: 'up',\n arrowright: 'right',\n arrowdown: 'down',\n arrowleft: 'left',\n };\n return merged;\n}\n\n// export { CCMConfigBuilder };\n\nconst testItems: MenuItem[] = [\n { direction: 'up', label: 'Up Item', action: () => alert('Up') },\n { direction: 'right', label: 'Right Item', action: () => alert('Right') },\n { direction: 'down', label: 'Down Item1', action: () => alert('Down') },\n { direction: 'down', label: 'Down Item2', url: 'https://bilibili.com' },\n { direction: 'left', label: 'Left Item', action: () => alert('Left') },\n]","import { CCMConfigBuilder, mergeConfig, type CCMConfig, type MenuDirection, type MenuItem } from \"./config\";\n// import * as pug from \"pug\";\nimport centerTemplate from './templates/center.pug';\nimport menuItemTemplate from './templates/menuItem.pug';\nimport { retry } from \"./utils/utils\";\n\n/**\n * 配置化十字菜单库\n *\n * 使用方式:\n * const ccm = new CCM({ ... });\n * ccm.render();\n */\nexport class CCM {\n private _config: CCMConfig;\n private items: MenuItem[] = [];\n // private crossMenu: CrossMenu | null = null;\n private initialized = false;\n private _containerEle: HTMLElement | null = null;\n\n private parallaxPointerMove: ((event: PointerEvent) => void) | null = null;\n private parallaxPointerLeave: (() => void) | null = null;\n private keydownHandler: ((event: KeyboardEvent) => void) | null = null;\n\n get config(): CCMConfig {\n return this._config;\n }\n\n set config(config: Partial<CCMConfig>) {\n this._config = { ...this._config, ...config };\n }\n\n get container() {\n // 666 isSameNode\n // if (!this._containerEle || !(document.querySelector(this.config.container) as HTMLElement)?.isSameNode(this._containerEle)) {\n // this._containerEle = document.querySelector(this.config.container) as HTMLElement;\n // }\n\n // 明确,container 依然是 .ccm-con,config.container 是外层的 ccm-full-page\n if (!this._containerEle || !document.querySelector(\".ccm-con\")) {\n //! 一层 div 视差效果就不会导致 menu 悬浮抽搐了???\n this._containerEle = document.createElement('div');\n this._containerEle.classList.add('ccm-con');\n document.querySelector(this.config.container)?.appendChild(this._containerEle);\n }\n return this._containerEle;\n }\n\n constructor(\n config: Partial<CCMConfig>,\n useDefaultKeyBindings: boolean = true,\n ) {\n this._config = CCMConfigBuilder(config, useDefaultKeyBindings);\n }\n\n /**\n * 渲染菜单\n * container 参数有点多余了但显式放出来又有必要\n */\n render(items: MenuItem[] = [], container?: string, config?: Partial<CCMConfig>): void {\n const init = async () => {\n // 销毁旧的菜单\n try {\n this.destroy();\n } catch (err) {\n console.error('Error during previous CCM destroy:', err);\n }\n\n if (items) this.items = items;\n // 原本用的 call this,但是 ts 的重载误认为两个参数是重载 2 然后需要三个参数(?)还是直接传 this.config\n if (config) this._config = mergeConfig(config, this._config);\n if (container) this.config.container = container;\n\n if (!this.initialized) {\n this.initialized = true;\n this.updateCSS();\n if ('style' in this.config.style.center && this.config.style.center.style?.parallaxEffect)\n this.registerParallaxEffect();\n this.registerKeyboardEvents()\n }\n\n try {\n // 渲染中心元素\n this.renderCenter();\n setTimeout(() => {\n // 渲染菜单项\n this.renderMenuItems();\n // 好奇怪为什么设 0 了都好像还是慢点……\n }, Math.max(0, this.config.style.showAnimation.center.duration - 500));\n } catch (error) {\n console.error('Error rendering CCM:', error);\n this.destroy();\n }\n\n };\n // 哦哦是喔已经加载完了哈哈\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', init);\n } else {\n init();\n }\n }\n\n /**\n * toggle 显示隐藏\n */\n toggle(): void {\n // if (document.readyState === 'loading') return\n //~~ 用这个导致测试失败 并非\n if (document.readyState !== 'complete') return\n if (this.container.classList.contains('close')) {\n this._open();\n } else {\n this._close();\n }\n }\n /**\n * 关闭\n */\n _close(): void {\n this.container.classList.add('close');\n this.unregisterParallaxEffect();\n this.unregisterKeyboardEvents();\n }\n /**\n * 打开\n */\n _open(): void {\n this.container.classList.remove('close');\n if ('style' in this.config.style.center && this.config.style.center.style?.parallaxEffect) {\n this.registerParallaxEffect();\n }\n this.registerKeyboardEvents();\n }\n\n /**\n * 更新 CSS\n */\n updateCSS(): void {\n // throw new Error('Not implemented yet');\n // this.container.classList.add('ccm-con');\n\n document.querySelector(this.config.container)!.classList.add('ccm-full-page');\n\n const head = document.head;\n const style = this.config.style;\n const styleEle = document.createElement('style');\n // styleEle.type = 'text/css'; // type 弃用\n const cl = (c: typeof style.background.menuColor) => !c ? '' : typeof c === 'string' ? c : c.light;\n const cd = (c: typeof style.background.menuColor) => !c ? '' : typeof c === 'string' ? c : (c.dark ?? c.light);\n const numOrStr = (val: string | number | undefined) => val != null ? typeof val === 'number' ? `${val}px` : val : '';\n const center = 'render' in style.center ? null : style.center;\n const v = (prop: string, val: string | number | null | undefined) => val != null && val !== '' ? ` ${prop}: ${val};` : '';\n // 这部分非常适合 vibe……\n // 确实这种数组 + '' + filter(Boolean) 的方式不错的\n styleEle.innerHTML = [\n `:root {`,\n v('--ccm-width', numOrStr(style.width)),\n v('--ccm-bg-menu-color', cl(style.background.menuColor)),\n v('--ccm-bg-center-color', cl(style.background.centerColor)),\n v('--ccm-bg-opacity', style.background.opacity),\n style.background.blur != null ? ` --ccm-bg-blur: ${style.background.blur}px;` : '',\n center?.icon?.size != null ? ` --ccm-center-icon-size: ${numOrStr(center.icon.size)};` : '',\n center?.title?.size != null ? ` --ccm-center-title-size: ${numOrStr(center.title.size)};` : '',\n center?.title?.color ? v('--ccm-center-title-color', cl(center.title.color)) : '',\n center?.subtitle?.size != null ? ` --ccm-center-subtitle-size: ${numOrStr(center.subtitle.size)};` : '',\n center?.subtitle?.color ? v('--ccm-center-subtitle-color', cl(center.subtitle.color)) : '',\n center?.style?.borderSize != null ? ` --ccm-center-border-size: ${numOrStr(center.style.borderSize)};` : '',\n center?.style?.color ? v('--ccm-center-border-color', cl(center.style.color)) : '',\n center?.style?.radius != null ? ` --ccm-center-radius: ${numOrStr(center.style.radius)};` : '',\n v('--ccm-menu-length', numOrStr(style.menu.length)),\n v('--ccm-menu-color', cl(style.menu.color)),\n style.menu.radius != null ? ` --ccm-menu-radius: ${numOrStr(style.menu.radius)};` : '',\n `}`,\n ``,\n `.dark {`,\n v('--ccm-bg-menu-color', cd(style.background.menuColor)),\n v('--ccm-bg-center-color', cd(style.background.centerColor)),\n center?.title?.color ? v('--ccm-center-title-color', cd(center.title.color)) : '',\n center?.subtitle?.color ? v('--ccm-center-subtitle-color', cd(center.subtitle.color)) : '',\n center?.style?.color ? v('--ccm-center-border-color', cd(center.style.color)) : '',\n v('--ccm-menu-color', cd(style.menu.color)),\n center?.style?.color ? v('color', cd(center.style.color)) : '',\n `}`,\n style.showAnimation.menu.durationPerItem ? `--ccm-menu-show-duration: ${style.showAnimation.menu.durationPerItem}ms` : '',\n style.showAnimation.center.duration ? `--ccm-center-show-duration: ${style.showAnimation.center.duration}ms` : '',\n ].filter(Boolean).join('\\n');\n head.appendChild(styleEle);\n\n // 引入打包 CSS?\n }\n // TODO 把 render 和 注册类 拆分出去……\n\n /**\n * 渲染菜单项\n */\n\n renderMenuItems(): void {\n // throw new Error('Not implemented yet');\n const items = this.items;\n const groupedItems = [\n items.filter(item => item.direction === 'up'),\n items.filter(item => item.direction === 'right'),\n items.filter(item => item.direction === 'down'),\n items.filter(item => item.direction === 'left'),\n ];\n const delegateFunctions: Record<string, () => void | Promise<void>> = {}\n items.forEach(item => {\n if (typeof item.action === 'function') {\n const funcHash = Math.random().toString(36).substr(2, 9);\n delegateFunctions[funcHash] = item.action;\n // @ts-expect-error bad type\n item.action = `__ccm_dispatch_func('${funcHash}')`;\n }\n });\n // var __ccm_dispatch_func = function (funcHash:string) {\n //@ts-expect-error windows has no attr\n window.__ccm_dispatch_func = function (funcHash: string) {\n // console.log(`Dispatching function for hash: ${funcHash}`);\n const func = delegateFunctions[funcHash];\n if (func) {\n func();\n } else {\n console.warn(`No function found for hash: ${funcHash}`);\n }\n };\n\n\n (async () => {\n const _delay = this.config.style.showAnimation.menu.durationPerItem ?? 0;\n for (const group of groupedItems) {\n if (group.length === 0) continue;\n await new Promise<void>(r => setTimeout(r, _delay));\n if (group.length === 1) {\n this._createMenuItem(group[0]!);\n } else if (group.length === 2) {\n this._createMenuItem(group[0]!, -20, 6);\n await new Promise<void>(r => setTimeout(r, _delay));\n this._createMenuItem(group[1]!, 20, -6);\n }\n }\n })();\n\n }\n // menuItemTemplate = pug.compileFile('/templates/menuItem.pug')\n _createMenuItem(item: MenuItem, rotateOffset = 0, x = 0) {\n const degMap = {\n up: 0,\n right: 90,\n down: 0,\n left: 270,\n };\n // 此时确实是 string……\n const menuItemHTML = menuItemTemplate({ ...item, action: item.action as unknown as string, rotate: `${degMap[item.direction] + rotateOffset}deg`, x: `${x}px` });\n this.container.insertAdjacentHTML('beforeend', menuItemHTML);\n }\n\n /**\n * 渲染中心元素\n */\n renderCenter(): void {\n // throw new Error('Not implemented yet');\n if (this.config.style.center.render && typeof this.config.style.center.render === 'function') {\n const customCenterEle = this.config.style.center.render()\n if (customCenterEle instanceof HTMLElement) {\n this.container.appendChild(customCenterEle);\n } else {\n throw new Error('Custom center render function must return an HTMLElement');\n }\n return;\n }\n const centerHtml = centerTemplate({ title: this.config.style.center.title!.content, subtitle: this.config.style.center.subtitle?.content, icon: this.config.style.center.icon?.url });\n this.container.insertAdjacentHTML('beforeend', centerHtml);\n }\n\n /**\n * 视差效果注册\n */\n registerParallaxEffect(): void {\n const parallaxCon = document.querySelector(this.config.container) as HTMLElement;\n // const this.container = this.container;\n if (!parallaxCon || !this.container) {\n throw new Error('Parallax container or CCM container not found');\n };\n\n const reduceMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n const canHover = window.matchMedia('(hover: hover) and (pointer: fine)').matches;\n if (reduceMotion || !canHover) return;\n\n let latestPointerEvent: PointerEvent | null = null;\n let ticking = false;\n\n const update = () => {\n if (!latestPointerEvent) return;\n\n const rect = parallaxCon.getBoundingClientRect();\n const nx = ((latestPointerEvent.clientX - rect.left) / rect.width - 0.5) * 2;\n const ny = ((latestPointerEvent.clientY - rect.top) / rect.height - 0.5) * 2;\n\n this.container.style.setProperty('--ccm-parallax-x', `${(nx * 80).toFixed(2)}px`);\n this.container.style.setProperty('--ccm-parallax-y', `${(ny * 80).toFixed(2)}px`);\n this.container.style.setProperty('--ccm-tilt-x', `${(nx * 25).toFixed(2)}deg`);\n this.container.style.setProperty('--ccm-tilt-y', `${(-ny * 20).toFixed(2)}deg`);\n };\n\n const reset = () => {\n this.container.style.setProperty('--ccm-parallax-x', '0px');\n this.container.style.setProperty('--ccm-parallax-y', '0px');\n this.container.style.setProperty('--ccm-tilt-x', '0deg');\n this.container.style.setProperty('--ccm-tilt-y', '0deg');\n };\n\n this.parallaxPointerMove = (event: PointerEvent) => {\n latestPointerEvent = event;\n if (ticking) return;\n\n ticking = true;\n requestAnimationFrame(() => {\n update();\n ticking = false;\n });\n };\n\n this.parallaxPointerLeave = () => {\n latestPointerEvent = null;\n requestAnimationFrame(reset);\n };\n\n // 据说如果只是简单变量读写浏览器已经做了优化可以不加 requestAnimationFrame\n // 还是得加,不加动画抽搐\n parallaxCon.addEventListener('pointermove', this.parallaxPointerMove, { passive: true });\n parallaxCon.addEventListener('pointerleave', this.parallaxPointerLeave, { passive: true });\n }\n /**\n * 注销\n */\n unregisterParallaxEffect(): void {\n const parallaxCon = document.querySelector(this.config.container) as HTMLElement;\n if (!parallaxCon || !this.container) {\n throw new Error('Parallax container or CCM container not found');\n }\n if (this.parallaxPointerMove) {\n parallaxCon.removeEventListener('pointermove', this.parallaxPointerMove);\n this.parallaxPointerMove = null;\n }\n if (this.parallaxPointerLeave) {\n parallaxCon.removeEventListener('pointerleave', this.parallaxPointerLeave);\n this.parallaxPointerLeave = null;\n }\n }\n\n /**\n * 注册键盘事件\n */\n selectAwaitingDirection: MenuDirection | null = null;\n selectAwaitingTimer: ReturnType<typeof setTimeout> | null = null;\n selectAwaitDelayMS = 5000;\n registerKeyboardEvents(): void {\n this.keydownHandler = (event: KeyboardEvent) => {\n const key = event.key.toLowerCase();\n // const keyMap: { [key: string]: MenuDirection } = {\n // w: 'up',\n // arrowup: 'up',\n // d: 'right',\n // arrowright: 'right',\n // s: 'down',\n // arrowdown: 'down',\n // a: 'left',\n // arrowleft: 'left'\n // };\n\n const direction = this.config.keyBindings[key];\n if (direction) {\n event.preventDefault();\n this._ccmHandlePress(direction);\n }\n }\n document.addEventListener('keydown', this.keydownHandler);\n\n }\n /**\n * 注销\n */\n unregisterKeyboardEvents(): void {\n if (this.keydownHandler) {\n document.removeEventListener('keydown', this.keydownHandler);\n this.keydownHandler = null;\n }\n }\n\n /**\n * 通用清理选择状态工具函数\n */\n private _clear() {\n const selectingItems = document.querySelectorAll(`.ccm-items.selecting`);\n this.selectAwaitingDirection = null;\n\n selectingItems.forEach(item => {\n item.classList.remove('selecting');\n })\n }\n private _ccmClearSelecting(delay: boolean | number = false) {\n if (this.selectAwaitingTimer) {\n clearTimeout(this.selectAwaitingTimer);\n this.selectAwaitingTimer = null;\n }\n if (delay) {\n this.selectAwaitingTimer = setTimeout(() => this._clear(), delay === true ? this.selectAwaitDelayMS : delay);\n } else {\n this._clear();\n }\n }\n /**\n * 按下事件通用处理\n */\n private _ccmHandlePress(direction: MenuDirection) {\n if (!direction) throw new Error('direction is required');\n\n // 重复点击重置选择 timer\n if (this.selectAwaitingDirection !== null) {\n if (direction === this.selectAwaitingDirection) {\n this._ccmClearSelecting(true);\n return;\n }\n\n\n if (this._ccmTriggerAwaitingSelection(direction)) {\n return;\n }\n\n this._ccmClearSelecting();\n }\n\n\n const menuItems = document.querySelectorAll(`.ccm-items.${direction}`);\n if (!menuItems) {\n return\n }\n menuItems.forEach(item => {\n item.classList.add('selecting');\n });\n // 如果有多个 up 菜单项,进入选择状态,等待用户再次点击确认选择哪个菜单项\n if (menuItems.length > 1) {\n this.selectAwaitingDirection = direction;\n this._ccmClearSelecting(true);\n } else if (menuItems.length === 1) {\n // 只有一个 up 菜单项,直接触发点击\n const item = menuItems[0]!;\n // ~~是的,有 hasChildNodes 的……\n // hasChildNodes 在有纯文本时也为 true……\n if (item.firstElementChild) {\n (item.children[0] as HTMLElement).click();\n } else {\n (item as HTMLElement).click();\n }\n\n this._ccmClearSelecting(500);\n }\n }\n private _ccmIsVertical(direction: MenuDirection | null) {\n if (!direction) return false;\n return ['up', 'down'].includes(direction);\n }\n private _ccmIsHorizontal(direction: MenuDirection | null) {\n if (!direction) return false;\n return ['left', 'right'].includes(direction);\n }\n\n private _ccmTriggerAwaitingSelection(direction: MenuDirection) {\n // if (!ccmSelectAwaitingDirection) {\n // return false;\n // }\n\n const selectingItems = document.querySelectorAll(`.ccm-items.${this.selectAwaitingDirection}`);\n if (selectingItems.length === 0) {\n return false;\n }\n\n const awaitingIsVertical = this._ccmIsVertical(this.selectAwaitingDirection);\n const canResolveByCrossAxis = awaitingIsVertical\n ? this._ccmIsHorizontal(direction)\n : this._ccmIsVertical(direction);\n\n // 点击了选择方向的对向,清除选择\n if (!canResolveByCrossAxis) {\n this._ccmClearSelecting();\n return true;\n }\n\n // 对不起不能直接借用……\n // const orderedItems = [].sort.call(selectingItems, (leftItem, rightItem) => {\n const orderedItems = Array.from(selectingItems).sort((leftItem, rightItem) => {\n const leftRect = leftItem.getBoundingClientRect();\n const rightRect = rightItem.getBoundingClientRect();\n\n return awaitingIsVertical\n ? leftRect.left - rightRect.left\n : leftRect.top - rightRect.top;\n });\n\n const targetItem = awaitingIsVertical\n ? (direction === 'left' ? orderedItems[0] : orderedItems[orderedItems.length - 1])\n : (direction === 'up' ? orderedItems[0] : orderedItems[orderedItems.length - 1]);\n\n if (!targetItem) {\n return false;\n }\n\n ((targetItem.firstElementChild ?? targetItem) as HTMLElement)?.click();\n this._ccmClearSelecting(1000);\n return true;\n }\n\n /**\n * 销毁菜单\n */\n destroy(): void {\n this.initialized = false;\n // 是的没错……在销毁 innerHTML 以后以后再访问 container 就新建了导致测试不通过\n this.unregisterParallaxEffect();\n this.unregisterKeyboardEvents();\n\n const container = document.querySelector(this.config.container);\n if (!container) return;\n\n container.innerHTML = '';\n this._containerEle = null;\n\n this.selectAwaitingDirection = null;\n\n if (this.selectAwaitingTimer) {\n clearTimeout(this.selectAwaitingTimer);\n this.selectAwaitingTimer = null;\n }\n\n this.items = [];\n\n // document.removeEventListener('keydown', this._ccmHandlePress as any);\n // 这里没有保存事件监听函数的引用,所以无法正确移除事件监听,暂时不处理了,反正页面刷新了就没了\n // if (this.crossMenu) {\n // this.crossMenu.destroy();\n // this.crossMenu = null;\n // }\n }\n}\n\nexport type { CCMConfig };\n"],"names":["root","factory","exports","module","define","amd","globalThis","pug","locals","pug_interp","pug_html","locals_for_with","direction","icon","render","subtitle","title","attr","classes","escape","call","this","undefined","Boolean","action","bgColor","hoverOffset","label","offset","rotate","size","url","x","styleParts","filter","join","style","pug_has_own_property","Object","prototype","hasOwnProperty","pug_classes","val","escaping","Array","isArray","className","classString","padding","escapeEnabled","i","length","pug_escape","pug_classes_array","key","pug_classes_object","pug_style","out","pug_attr","escaped","terse","type","toJSON","JSON","stringify","indexOf","replace","merge","pug_merge","a","b","arguments","attrs","valA","concat","valB","obj","pug_match_html","_html","html","regexResult","exec","lastIndex","result","index","charCodeAt","substring","rethrow","pug_rethrow","err","filename","lineno","str","Error","window","message","context","lines","start","end","encoding","split","Math","max","min","ex","slice","map","line","curr","path","e","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","n","getter","__esModule","d","definition","o","defineProperty","enumerable","get","prop","r","Symbol","toStringTag","value","defaultConfig","container","startingDirections","width","radius","background","menuColor","light","dark","centerColor","opacity","blur","center","content","color","parallaxEffect","menu","showAnimation","duration","durationPerItem","keyBindings","mergeConfig","config","origin","base","dc","uc","CCM","_config","_containerEle","document","querySelector","createElement","classList","add","appendChild","constructor","useDefaultKeyBindings","items","initialized","parallaxPointerMove","parallaxPointerLeave","keydownHandler","selectAwaitingDirection","selectAwaitingTimer","selectAwaitDelayMS","merged","w","s","arrowup","arrowright","arrowdown","arrowleft","CCMConfigBuilder","init","async","destroy","console","error","updateCSS","registerParallaxEffect","registerKeyboardEvents","renderCenter","setTimeout","renderMenuItems","readyState","addEventListener","toggle","contains","_open","_close","unregisterParallaxEffect","unregisterKeyboardEvents","remove","head","styleEle","cl","c","cd","numOrStr","v","innerHTML","borderSize","groupedItems","item","delegateFunctions","forEach","funcHash","random","toString","substr","__ccm_dispatch_func","func","warn","_delay","group","Promise","_createMenuItem","rotateOffset","menuItemHTML","up","right","down","left","insertAdjacentHTML","customCenterEle","HTMLElement","centerHtml","parallaxCon","reduceMotion","matchMedia","matches","canHover","latestPointerEvent","ticking","update","rect","getBoundingClientRect","nx","clientX","ny","clientY","top","height","setProperty","toFixed","reset","event","requestAnimationFrame","passive","removeEventListener","toLowerCase","preventDefault","_ccmHandlePress","_clear","selectingItems","querySelectorAll","_ccmClearSelecting","delay","clearTimeout","_ccmTriggerAwaitingSelection","menuItems","firstElementChild","children","click","_ccmIsVertical","includes","_ccmIsHorizontal","awaitingIsVertical","orderedItems","from","sort","leftItem","rightItem","leftRect","rightRect","targetItem"],"sourceRoot":""}
@@ -11,6 +11,9 @@ export declare class CCM {
11
11
  private items;
12
12
  private initialized;
13
13
  private _containerEle;
14
+ private parallaxPointerMove;
15
+ private parallaxPointerLeave;
16
+ private keydownHandler;
14
17
  get config(): CCMConfig;
15
18
  set config(config: Partial<CCMConfig>);
16
19
  get container(): HTMLElement;
@@ -20,6 +23,18 @@ export declare class CCM {
20
23
  * container 参数有点多余了但显式放出来又有必要
21
24
  */
22
25
  render(items?: MenuItem[], container?: string, config?: Partial<CCMConfig>): void;
26
+ /**
27
+ * toggle 显示隐藏
28
+ */
29
+ toggle(): void;
30
+ /**
31
+ * 关闭
32
+ */
33
+ _close(): void;
34
+ /**
35
+ * 打开
36
+ */
37
+ _open(): void;
23
38
  /**
24
39
  * 更新 CSS
25
40
  */
@@ -37,6 +52,10 @@ export declare class CCM {
37
52
  * 视差效果注册
38
53
  */
39
54
  registerParallaxEffect(): void;
55
+ /**
56
+ * 注销
57
+ */
58
+ unregisterParallaxEffect(): void;
40
59
  /**
41
60
  * 注册键盘事件
42
61
  */
@@ -44,6 +63,10 @@ export declare class CCM {
44
63
  selectAwaitingTimer: ReturnType<typeof setTimeout> | null;
45
64
  selectAwaitDelayMS: number;
46
65
  registerKeyboardEvents(): void;
66
+ /**
67
+ * 注销
68
+ */
69
+ unregisterKeyboardEvents(): void;
47
70
  /**
48
71
  * 通用清理选择状态工具函数
49
72
  */
@@ -1 +1 @@
1
- {"version":3,"file":"crossMenu.d.ts","sourceRoot":"","sources":["../src/crossMenu.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiC,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAC;AAM5G;;;;;;GAMG;AACH,qBAAa,GAAG;IACd,OAAO,CAAC,OAAO,CAAY;IAC3B,OAAO,CAAC,KAAK,CAAkB;IAE/B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,aAAa,CAA4B;IAEjD,IAAI,MAAM,IAAI,SAAS,CAEtB;IAED,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,EAEpC;IAED,IAAI,SAAS,gBAYZ;gBAGC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,EAC1B,qBAAqB,GAAE,OAAc;IAKvC;;;OAGG;IACH,MAAM,CAAC,KAAK,GAAE,QAAQ,EAAO,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI;IA2CrF;;OAEG;IACH,SAAS,IAAI,IAAI;IAuDjB;;OAEG;IAEH,eAAe,IAAI,IAAI;IAgDvB,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,SAAI,EAAE,CAAC,SAAI;IAYvD;;OAEG;IACH,YAAY,IAAI,IAAI;IAepB;;OAEG;IACH,sBAAsB,IAAI,IAAI;IAyD9B;;OAEG;IACH,uBAAuB,EAAE,aAAa,GAAG,IAAI,CAAQ;IACrD,mBAAmB,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,IAAI,CAAQ;IACjE,kBAAkB,SAAQ;IAC1B,sBAAsB,IAAI,IAAI;IAuB9B;;MAEE;IACF,OAAO,CAAC,MAAM;IAQd,OAAO,CAAC,kBAAkB;IAW1B;;OAEG;IACH,OAAO,CAAC,eAAe;IA4CvB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,4BAA4B;IA6CpC;;OAEG;IACH,OAAO,IAAI,IAAI;CAqBhB;AAED,YAAY,EAAE,SAAS,EAAE,CAAC"}
1
+ {"version":3,"file":"crossMenu.d.ts","sourceRoot":"","sources":["../src/crossMenu.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiC,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAC;AAM5G;;;;;;GAMG;AACH,qBAAa,GAAG;IACd,OAAO,CAAC,OAAO,CAAY;IAC3B,OAAO,CAAC,KAAK,CAAkB;IAE/B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,aAAa,CAA4B;IAEjD,OAAO,CAAC,mBAAmB,CAAgD;IAC3E,OAAO,CAAC,oBAAoB,CAA6B;IACzD,OAAO,CAAC,cAAc,CAAiD;IAEvE,IAAI,MAAM,IAAI,SAAS,CAEtB;IAED,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,EAEpC;IAED,IAAI,SAAS,gBAcZ;gBAGC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,EAC1B,qBAAqB,GAAE,OAAc;IAKvC;;;OAGG;IACH,MAAM,CAAC,KAAK,GAAE,QAAQ,EAAO,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI;IA4CrF;;OAEG;IACH,MAAM,IAAI,IAAI;IAUd;;OAEG;IACH,MAAM,IAAI,IAAI;IAKd;;OAEG;IACH,KAAK,IAAI,IAAI;IAQb;;OAEG;IACH,SAAS,IAAI,IAAI;IAuDjB;;OAEG;IAEH,eAAe,IAAI,IAAI;IAgDvB,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,SAAI,EAAE,CAAC,SAAI;IAYvD;;OAEG;IACH,YAAY,IAAI,IAAI;IAepB;;OAEG;IACH,sBAAsB,IAAI,IAAI;IAuD9B;;OAEG;IACH,wBAAwB,IAAI,IAAI;IAehC;;OAEG;IACH,uBAAuB,EAAE,aAAa,GAAG,IAAI,CAAQ;IACrD,mBAAmB,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,IAAI,CAAQ;IACjE,kBAAkB,SAAQ;IAC1B,sBAAsB,IAAI,IAAI;IAuB9B;;OAEG;IACH,wBAAwB,IAAI,IAAI;IAOhC;;MAEE;IACF,OAAO,CAAC,MAAM;IAQd,OAAO,CAAC,kBAAkB;IAW1B;;OAEG;IACH,OAAO,CAAC,eAAe;IA4CvB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,4BAA4B;IA6CpC;;OAEG;IACH,OAAO,IAAI,IAAI;CA4BhB;AAED,YAAY,EAAE,SAAS,EAAE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@woisol-g/configurable-cross-menu",
3
- "version": "1.0.3",
3
+ "version": "1.0.4",
4
4
  "description": "A highly configurable animated cross menu for web pages.",
5
5
  "main": "dist/configurable-cross-menu.js",
6
6
  "types": "dist/index.d.ts",