@woisol-g/configurable-cross-menu 1.0.0 → 1.0.2

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.
@@ -412,3 +412,6 @@
412
412
  3. 最后再做 API 打磨和结构重构
413
413
 
414
414
  这个顺序很重要,因为它能让你的优化过程从“凭感觉改代码”变成“有证据、有边界地演进工程”。
415
+
416
+ ## 人工补充
417
+ * 似乎 publish 时 webpack 打包产物依然包含 SourceMap
package/README.md CHANGED
@@ -17,24 +17,23 @@
17
17
  - 首次发布清单:[docs/publish-checklist.md](./docs/publish-checklist.md)
18
18
  - 英文副文档:[README.en.md](./README.en.md)
19
19
 
20
- ## 安装
20
+ ## 快速开始
21
+
22
+
23
+ ### 1. 在构建工具项目中使用
21
24
 
22
25
  推荐的 npm 包名是:
23
26
 
24
27
  ```bash
25
- pnpm add @woisol-g/configurable-cross-menu
28
+ pnpm i @woisol-g/configurable-cross-menu
26
29
  ```
27
30
 
28
31
  如果你使用 npm:
29
32
 
30
33
  ```bash
31
- npm install @woisol-g/configurable-cross-menu
34
+ npm i @woisol-g/configurable-cross-menu
32
35
  ```
33
36
 
34
- ## 快速开始
35
-
36
- ### 1. 在构建工具项目中使用
37
-
38
37
  ```ts
39
38
  import { CCM } from '@woisol-g/configurable-cross-menu';
40
39
  import '@woisol-g/configurable-cross-menu/styles.css';
@@ -62,62 +61,50 @@ ccm.render([
62
61
  ]);
63
62
  ```
64
63
 
64
+ 在 html 中提供一个对应 selector(例如上面 container 配置项的 `#ccm-con`)的容器:
65
+
65
66
  ```html
66
67
  <div id="ccm-con"></div>
67
68
  ```
68
69
 
69
- ### 2. 在浏览器中直接引入
70
+ 另外为了确保居中样式正确,需要确保 body 存在下面的样式
71
+ ```css
72
+ body {
73
+ margin: 0;
74
+ padding: 0;
75
+ box-sizing: border-box;
76
+ }
77
+ ```
78
+ 这部分样式没有内置在组件包里,以免和你的项目样式发生冲突。
70
79
 
71
- 发布后可以直接使用 jsDelivr:
80
+ ### 2. CDN 引入
81
+
82
+ 可以直接使用 jsDelivr:
72
83
 
73
84
  ```html
74
- <!DOCTYPE html>
75
- <html lang="zh-CN">
76
- <head>
77
- <meta charset="UTF-8" />
78
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
79
- <title>CCM Demo</title>
80
- <link
81
- rel="stylesheet"
82
- href="https://cdn.jsdelivr.net/npm/@woisol-g/configurable-cross-menu@latest/dist/configurable-cross-menu.css"
83
- />
84
- </head>
85
- <body>
86
- <div id="ccm-con"></div>
87
-
88
- <script src="https://cdn.jsdelivr.net/npm/@woisol-g/configurable-cross-menu@latest/dist/configurable-cross-menu.js"></script>
89
- <script>
90
- const { CCM } = globalThis.ConfigurableCrossMenu || {};
91
-
92
- if (!CCM) {
93
- throw new Error('ConfigurableCrossMenu failed to load.');
94
- }
95
-
96
- const ccm = new CCM(
97
- {
98
- container: '#ccm-con',
99
- style: {
100
- center: {
101
- title: { content: 'C C M' },
102
- subtitle: { content: 'Configurable Cross Menu' },
103
- style: { direction: 'column' },
104
- },
105
- },
106
- },
107
- true,
108
- );
109
-
110
- ccm.render([
111
- { direction: 'up', label: 'Home', url: '#home' },
112
- { direction: 'right', label: 'About', url: '#about' },
113
- { direction: 'down', label: 'Contact', url: '#contact' },
114
- { direction: 'left', label: 'Settings', action: () => console.log('Settings') },
115
- ]);
116
- </script>
117
- </body>
118
- </html>
85
+ <head>
86
+ <link rel="stylesheet"
87
+ href="https://cdn.jsdelivr.net/npm/@woisol-g/configurable-cross-menu@latest/dist/configurable-cross-menu.css" />
88
+ <!-- 要求外部的最小样式,由于可能和您的项目冲突不在包中内置 -->
89
+ <style>
90
+ body {
91
+ margin: 0;
92
+ padding: 0;
93
+ box-sizing: border-box;
94
+ }
95
+ </style>
96
+ </head>
97
+ <div id="ccm-con"></div>
119
98
  ```
120
99
 
100
+ 项目中提供了一个最小配置的示例在 [minidemo.html](./minidemo.html),你应当可以直接打开它来查看效果和参考用法。
101
+
102
+ ### 在页面上添加其它元素
103
+
104
+ 目前由于 CCM 在页面上居中的方式是使用 absolute 结合 100svw 100svh 的 div.ccm-con 容器定位,如果需要添加额外内容,请同样通过 absolute 或 fixed 等不占用文档流的方式添加,除非你希望它们显示在页面下方需要滚动才能看到。\
105
+ 也不建议直接在 CCM 的容器里添加内容,因为 CCM 在进行渲染时会先将其清空……
106
+
107
+
121
108
  ## 公开 API
122
109
 
123
110
  ### `new CCM(config, useDefaultKeyBindings?)`
@@ -140,22 +127,22 @@ ccm.render([
140
127
 
141
128
  下面是当前版本最常用的配置字段说明。更完整的默认值可以参考 [`src/config.ts`](./src/config.ts)。
142
129
 
143
- | 字段 | 说明 |
144
- | --- | --- |
145
- | `container` | 菜单挂载容器选择器,默认是 `#ccm-con` |
146
- | `startingDirections` | 当前版本中已存在于配置类型中,但暂未形成完整对外行为 |
147
- | `style.width` | 菜单整体宽度相关变量 |
148
- | `style.background.menuColor` | 菜单背景色,支持字符串或 `{ light, dark }` |
149
- | `style.background.centerColor` | 中心区域背景色 |
150
- | `style.background.opacity` | 背景透明度 |
151
- | `style.background.blur` | 背景模糊强度 |
152
- | `style.center` | 中心区域配置,支持默认内容或自定义渲染 |
153
- | `style.menu.length` | 菜单项伸展长度 |
154
- | `style.menu.color` | 菜单项前景色 |
155
- | `style.menu.radius` | 菜单项圆角 |
156
- | `style.showAnimation.center.duration` | 中心区域展示动画时长 |
157
- | `style.showAnimation.menu.durationPerItem` | 菜单项分批出现的间隔时长 |
158
- | `keyBindings` | 类型中已预留,当前实现仍以内置键位逻辑为主 |
130
+ | 字段 | 说明 |
131
+ | ------------------------------------------ | ---------------------------------------------------- |
132
+ | `container` | 菜单挂载容器选择器,默认是 `#ccm-con` |
133
+ | `startingDirections` | 当前版本中已存在于配置类型中,但暂未形成完整对外行为 |
134
+ | `style.width` | 菜单整体宽度相关变量 |
135
+ | `style.background.menuColor` | 菜单背景色,支持字符串或 `{ light, dark }` |
136
+ | `style.background.centerColor` | 中心区域背景色 |
137
+ | `style.background.opacity` | 背景透明度 |
138
+ | `style.background.blur` | 背景模糊强度 |
139
+ | `style.center` | 中心区域配置,支持默认内容或自定义渲染 |
140
+ | `style.menu.length` | 菜单项伸展长度 |
141
+ | `style.menu.color` | 菜单项前景色 |
142
+ | `style.menu.radius` | 菜单项圆角 |
143
+ | `style.showAnimation.center.duration` | 中心区域展示动画时长 |
144
+ | `style.showAnimation.menu.durationPerItem` | 菜单项分批出现的间隔时长 |
145
+ | `keyBindings` | 类型中已预留,当前实现仍以内置键位逻辑为主 |
159
146
 
160
147
  ## 菜单项格式
161
148
 
@@ -185,16 +172,16 @@ ccm.render([
185
172
 
186
173
  ### 菜单项字段说明
187
174
 
188
- | 字段 | 说明 |
189
- | --- | --- |
190
- | `direction` | `up` / `right` / `down` / `left` |
191
- | `label` | 菜单文本 |
192
- | `size` | 字号或尺寸 |
193
- | `bgColor` | 单项背景色 |
194
- | `offset` | 相对中心的偏移距离 |
195
- | `hoverOffset` | hover 时额外偏移 |
196
- | `url` | 链接型菜单项使用 |
197
- | `action` | 动作型菜单项使用 |
175
+ | 字段 | 说明 |
176
+ | ------------- | -------------------------------- |
177
+ | `direction` | `up` / `right` / `down` / `left` |
178
+ | `label` | 菜单文本 |
179
+ | `size` | 字号或尺寸 |
180
+ | `bgColor` | 单项背景色 |
181
+ | `offset` | 相对中心的偏移距离 |
182
+ | `hoverOffset` | hover 时额外偏移 |
183
+ | `url` | 链接型菜单项使用 |
184
+ | `action` | 动作型菜单项使用 |
198
185
 
199
186
  ## 自定义中心区域
200
187
 
@@ -218,18 +205,16 @@ const ccm = new CCM({
218
205
 
219
206
  ## 键盘操作
220
207
 
221
- 当前版本内置了以下键位:
208
+ 可以通过 CCM 构造函数中 `useDefaultKeyBindings` 参数启用默认的键盘操作,目前为:
222
209
 
223
210
  - `W` / `ArrowUp`
224
211
  - `D` / `ArrowRight`
225
212
  - `S` / `ArrowDown`
226
213
  - `A` / `ArrowLeft`
227
214
 
228
- 已知情况:
215
+ 你也可以手动在 config.keyBindings 中覆盖默认键位。
229
216
 
230
- - 类型系统中存在 `keyBindings` 配置
231
- - 当前实际逻辑仍然使用内置硬编码键位
232
- - 这部分已在工程评审文档中列为重点改进项
217
+ 配置键位以后便可以通过键盘操作来选择菜单项,触发对应的链接或动作。
233
218
 
234
219
  ## 本地开发
235
220
 
package/dist/config.d.ts CHANGED
@@ -25,6 +25,7 @@ interface CenterConfig {
25
25
  color: CSSColor;
26
26
  borderSize?: CSSSize;
27
27
  radius?: CSSSize;
28
+ parallaxEffect?: boolean;
28
29
  };
29
30
  }
30
31
  interface CenterCustom {
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -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:translate3d(calc(var(--ccm-parallax-x) * -0.08), calc(var(--ccm-parallax-y) * -0.08), 0) scale(0.4)}100%{filter:opacity(1);transform: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: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: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: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:relative;overflow:hidden;z-index:2;padding:12px 20px;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: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}.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;width:100%;height:100%;transition:padding .3s ease}.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-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{min-height:100svh;max-height:100svh;overflow:hidden;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}
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,8GAGF,KACE,kBACA,6GA+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,8GAGF,IACE,oBACA,iCAGF,IACE,kCACA,+GAGF,KACE,kBACA,kCACA,6GClLJ,YACE,gBACA,iBACA,kBACA,mBACA,kBACA,gBAEA,UACA,kBAEA,qFACA,6CAEA,qIACA,oCAGA,sDACA,8CACA,mGACA,8DACA,aACA,SACA,sBACA,uBACA,mBACA,wGAEA,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,6CC/FF,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,cAEA,WACA,YACA,4BC/FN,SACE,sBACA,sBACA,mBACA,mBAOA,SACA,UACA,sBACA,WAKA,4BACA,mFACA,oCAIA,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: 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-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: 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: 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: 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: relative;\n overflow: hidden;\n // isolation: isolate;\n z-index: 2;\n padding: 12px 20px;\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: 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\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-con {\n --ccm-parallax-x: 0px;\n --ccm-parallax-y: 0px;\n --ccm-tilt-x: 0deg;\n --ccm-tilt-y: 0deg;\n // max-width: 100lvw;\n // max-height: 100lvh;\n // width: 100lvw;\n // height: 100lvh;\n // perspective 和 overflow 互斥,前者会设置 overflow: flat\n // overflow: hidden;\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 &.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,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,kBACA,kBACA,gBAEA,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 min-height: 100svh;\n max-height: 100svh;\n overflow: hidden;\n // height: 100%;\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,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:()=>a});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}},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);async function s(e,t=5,n=1e3){try{return await e()}catch(i){if(t<=0)throw i;return await new Promise(e=>setTimeout(e,n)),s(e,t-1,2*n)}}class a{get config(){return this._config}set config(e){this._config={...this._config,...e}}get container(){var e;return this._containerEle&&(null===(e=document.querySelector(this.config.container))||void 0===e?void 0:e.isSameNode(this._containerEle))||(this._containerEle=document.querySelector(this.config.container)),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){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(),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()}}updateCSS(){var e,t,n,i,o,r,c,l,s,a,u,d;this.container.classList.add("ccm-con");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}),i=document.querySelector(this.config.container);if(!i)throw new Error(`Container element not found for selector: ${this.config.container}`);i.insertAdjacentHTML("beforeend",n)}registerParallaxEffect(){const e=async()=>{const e=document.body;if(await s(()=>Promise.resolve(this.container),10,500),!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})};"loading"===document.readyState?document.addEventListener("DOMContentLoaded",e):e()}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="",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.body;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})());
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/utils/utils.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 }; // 图标和文字的排列方式,默认为 'column'(图标在上,文字在下),'row'(图标在左,文字在右)\n}\n\ninterface CenterCustom {\n // 方式2:完全自定义\n render: () => HTMLElement;\n}\n\n// 用 discriminated union 替代 union of objects\nexport type CenterStyle =\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 }, // 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]","export async function retry<T>(\n fn: () => Promise<T>,\n retries = 5,\n delay = 1000,\n): Promise<T> {\n try {\n return await fn();\n } catch (err) {\n if (retries <= 0) throw err;\n await new Promise(r => setTimeout(r, delay));\n return retry(fn, retries - 1, delay * 2);\n }\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 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 // 销毁旧的菜单\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 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 * 更新 CSS\n */\n updateCSS(): void {\n // throw new Error('Not implemented yet');\n this.container.classList.add('ccm-con');\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 const container = document.querySelector(this.config.container);\n if (!container) {\n throw new Error(`Container element not found for selector: ${this.config.container}`);\n }\n // if (container.hasChildNodes()) {\n // console.warn(`Container element for selector: ${this.config.container} is not empty. Existing content will be preserved.`);\n // }\n container.insertAdjacentHTML('beforeend', centerHtml);\n }\n\n /**\n * 视差效果注册\n */\n registerParallaxEffect(): void {\n const init = async () => {\n const parallaxCon = document.body;\n // const this.container = this.container;\n await retry(() => Promise.resolve(this.container), 10, 500);\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 if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', init);\n } else {\n init();\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","menu","showAnimation","duration","durationPerItem","keyBindings","mergeConfig","config","origin","base","dc","uc","async","retry","fn","retries","delay","Promise","setTimeout","CCM","_config","_containerEle","document","querySelector","isSameNode","constructor","useDefaultKeyBindings","items","initialized","selectAwaitingDirection","selectAwaitingTimer","selectAwaitDelayMS","merged","w","s","arrowup","arrowright","arrowdown","arrowleft","CCMConfigBuilder","destroy","console","error","updateCSS","registerParallaxEffect","registerKeyboardEvents","renderCenter","renderMenuItems","classList","add","head","styleEle","createElement","cl","c","cd","numOrStr","v","innerHTML","borderSize","appendChild","groupedItems","item","delegateFunctions","forEach","funcHash","random","toString","substr","__ccm_dispatch_func","func","warn","_delay","group","_createMenuItem","rotateOffset","menuItemHTML","up","right","down","left","insertAdjacentHTML","customCenterEle","HTMLElement","centerHtml","init","parallaxCon","body","resolve","reduceMotion","matchMedia","matches","canHover","latestPointerEvent","ticking","update","rect","getBoundingClientRect","nx","clientX","ny","clientY","top","height","setProperty","toFixed","reset","addEventListener","event","requestAnimationFrame","passive","readyState","toLowerCase","preventDefault","_ccmHandlePress","_clear","selectingItems","querySelectorAll","remove","_ccmClearSelecting","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 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.body;\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","body","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 +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,gBAMZ;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;IAiCrF;;OAEG;IACH,SAAS,IAAI,IAAI;IAqDjB;;OAEG;IAEH,eAAe,IAAI,IAAI;IAgDvB,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,SAAI,EAAE,CAAC,SAAI;IAYvD;;OAEG;IACH,YAAY,IAAI,IAAI;IAsBpB;;OAEG;IACH,sBAAsB,IAAI,IAAI;IAiE9B;;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,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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@woisol-g/configurable-cross-menu",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
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",
@@ -81,4 +81,4 @@
81
81
  "husky": "^9.1.7",
82
82
  "pug": "^3.0.4"
83
83
  }
84
- }
84
+ }