@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.
- package/ENGINEERING_REVIEW.md +3 -0
- package/README.md +70 -85
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/configurable-cross-menu.css +1 -1
- package/dist/configurable-cross-menu.css.map +1 -1
- package/dist/configurable-cross-menu.js +1 -1
- package/dist/configurable-cross-menu.js.map +1 -1
- package/dist/crossMenu.d.ts.map +1 -1
- package/package.json +2 -2
package/ENGINEERING_REVIEW.md
CHANGED
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
|
|
28
|
+
pnpm i @woisol-g/configurable-cross-menu
|
|
26
29
|
```
|
|
27
30
|
|
|
28
31
|
如果你使用 npm:
|
|
29
32
|
|
|
30
33
|
```bash
|
|
31
|
-
npm
|
|
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
|
-
|
|
70
|
+
另外为了确保居中样式正确,需要确保 body 存在下面的样式
|
|
71
|
+
```css
|
|
72
|
+
body {
|
|
73
|
+
margin: 0;
|
|
74
|
+
padding: 0;
|
|
75
|
+
box-sizing: border-box;
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
这部分样式没有内置在组件包里,以免和你的项目样式发生冲突。
|
|
70
79
|
|
|
71
|
-
|
|
80
|
+
### 2. CDN 引入
|
|
81
|
+
|
|
82
|
+
可以直接使用 jsDelivr:
|
|
72
83
|
|
|
73
84
|
```html
|
|
74
|
-
|
|
75
|
-
<
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
</
|
|
85
|
-
|
|
86
|
-
|
|
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`
|
|
146
|
-
| `startingDirections`
|
|
147
|
-
| `style.width`
|
|
148
|
-
| `style.background.menuColor`
|
|
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`
|
|
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
|
-
|
|
231
|
-
- 当前实际逻辑仍然使用内置硬编码键位
|
|
232
|
-
- 这部分已在工程评审文档中列为重点改进项
|
|
217
|
+
配置键位以后便可以通过键盘操作来选择菜单项,触发对应的链接或动作。
|
|
233
218
|
|
|
234
219
|
## 本地开发
|
|
235
220
|
|
package/dist/config.d.ts
CHANGED
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,KAAK,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AAC/B,KAAK,QAAQ,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAAC;AAC1D,MAAM,MAAM,aAAa,GAAG,IAAI,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AAE7D,UAAU,YAAY;IAGpB,IAAI,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACzD,KAAK,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,QAAQ,CAAA;KAAE,CAAC;IAC9D,QAAQ,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,QAAQ,CAAA;KAAE,CAAC;IACjE,KAAK,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC;QAAC,KAAK,EAAE,QAAQ,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;
|
|
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:
|
|
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,"'")+"'"}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=""";break;case 38:r="&";break;case 60:r="<";break;case 62:r=">";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,"'")+"'"}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=""";break;case 38:r="&";break;case 60:r="<";break;case 62:r=">";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, ''') + \"'\";\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 = '"';\n break;\n case 38:\n escape = '&';\n break;\n case 60:\n escape = '<';\n break;\n case 62:\n escape = '>';\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, ''') + \"'\";\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 = '"';\n break;\n case 38:\n escape = '&';\n break;\n case 60:\n escape = '<';\n break;\n case 62:\n escape = '>';\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":""}
|
package/dist/crossMenu.d.ts.map
CHANGED
|
@@ -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,
|
|
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.
|
|
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
|
+
}
|