vanilla-jui 1.4.5 → 1.4.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/README.md +6 -0
  2. package/dist/index.d.ts +1273 -1896
  3. package/dist/index.js +1 -1
  4. package/dist/index.umd.js +1 -1
  5. package/dist/style.css +1 -1
  6. package/package.json +21 -2
  7. package/src/components/accordion.ts +297 -216
  8. package/src/components/flow.ts +222 -258
  9. package/src/components/form.ts +44 -102
  10. package/src/components/menu.ts +268 -356
  11. package/src/components/modal.ts +181 -641
  12. package/src/components/offcanvas.ts +225 -106
  13. package/src/components/pagination.ts +296 -326
  14. package/src/components/sticky.ts +55 -54
  15. package/src/components/swiper.ts +237 -247
  16. package/src/components/tabs.ts +278 -271
  17. package/src/components/toc.ts +42 -46
  18. package/src/core/Component.ts +69 -47
  19. package/src/css/accordion.css +2 -2
  20. package/src/css/animation.css +1 -5
  21. package/src/css/avatar.css +1 -1
  22. package/src/css/badge.css +1 -1
  23. package/src/css/breadcrumb.css +9 -10
  24. package/src/css/button.css +1 -1
  25. package/src/css/card.css +2 -2
  26. package/src/css/color.css +974 -1002
  27. package/src/css/color_p3.css +974 -1004
  28. package/src/css/components.css +1 -1
  29. package/src/css/content.css +72 -63
  30. package/src/css/drop.css +1 -1
  31. package/src/css/editor.css +14 -14
  32. package/src/css/flow.css +4 -14
  33. package/src/css/font.css +5 -4
  34. package/src/css/form.css +76 -52
  35. package/src/css/gradient.css +299 -222
  36. package/src/css/icon.css +57 -57
  37. package/src/css/index.css +1 -1
  38. package/src/css/layout.css +13 -10
  39. package/src/css/loading.css +60 -12
  40. package/src/css/menu.css +262 -188
  41. package/src/css/modal.css +1 -1
  42. package/src/css/offcanvas.css +9 -13
  43. package/src/css/pagination.css +5 -1
  44. package/src/css/popup.css +1 -1
  45. package/src/css/skeleton.css +3 -2
  46. package/src/css/status.css +2 -3
  47. package/src/css/swiper.css +1 -1
  48. package/src/css/table.css +1 -1
  49. package/src/css/tabs.css +12 -11
  50. package/src/css/tag.css +1 -1
  51. package/src/css/theme-palette.css +19 -5
  52. package/src/css/themes/default/accordion.css +61 -61
  53. package/src/css/themes/default/avatar.css +54 -54
  54. package/src/css/themes/default/badge.css +62 -62
  55. package/src/css/themes/default/breadcrumb.css +23 -23
  56. package/src/css/themes/default/button.css +203 -203
  57. package/src/css/themes/default/content.css +53 -53
  58. package/src/css/themes/default/drop.css +10 -10
  59. package/src/css/themes/default/editor.css +9 -9
  60. package/src/css/themes/default/index.css +1 -1
  61. package/src/css/themes/default/loading.css +26 -20
  62. package/src/css/themes/default/menu.css +75 -11
  63. package/src/css/themes/default/modal.css +32 -36
  64. package/src/css/themes/default/pagination.css +7 -7
  65. package/src/css/themes/default/popup.css +6 -6
  66. package/src/css/themes/default/swiper.css +32 -32
  67. package/src/css/themes/default/table.css +16 -16
  68. package/src/css/themes/default/tabs.css +30 -30
  69. package/src/css/themes/default/tag.css +71 -71
  70. package/src/css/themes/default/theme-palette.css +11 -11
  71. package/src/css/themes/default/tip.css +42 -42
  72. package/src/css/themes/default/toast.css +60 -60
  73. package/src/css/themes/default/toolbar.css +23 -29
  74. package/src/css/themes/default/tooltip.css +43 -13
  75. package/src/css/themes/index.css +1 -1
  76. package/src/css/tip.css +2 -2
  77. package/src/css/toast.css +3 -3
  78. package/src/css/tokens.css +12 -17
  79. package/src/css/toolbar.css +9 -10
  80. package/src/css/tooltip.css +3 -2
  81. package/src/index.ts +22 -19
  82. package/src/{components → primitives}/drop.ts +58 -49
  83. package/src/{components → primitives}/icons.ts +1 -1
  84. package/src/primitives/loading.ts +23 -0
  85. package/src/primitives/parabola.ts +388 -0
  86. package/src/primitives/popup.ts +61 -0
  87. package/src/{components → primitives}/theme.ts +89 -57
  88. package/src/{components → primitives}/toast.ts +18 -25
  89. package/src/{components → primitives}/tooltip.ts +100 -25
  90. package/src/utilities/browser.ts +23 -49
  91. package/src/utilities/class-name.ts +5 -0
  92. package/src/utilities/dom.ts +14 -32
  93. package/src/utilities/function.ts +4 -0
  94. package/src/utilities/http.ts +7 -7
  95. package/src/utilities/id.ts +57 -0
  96. package/src/utilities/object.ts +5 -0
  97. package/src/utilities/timer.ts +38 -0
  98. package/src/utilities/types.ts +420 -0
  99. package/src/{components → validation}/validator.ts +64 -53
  100. package/src/components/parabola.ts +0 -335
  101. package/src/utilities/cache.ts +0 -57
  102. package/src/utilities/core.ts +0 -614
  103. package/src/utilities/storage.ts +0 -46
package/src/css/menu.css CHANGED
@@ -2,8 +2,8 @@
2
2
  .j-menu {
3
3
  width: 100%;
4
4
  white-space: nowrap;
5
- overflow-y: hidden;
6
5
  overflow-x: auto;
6
+ overflow-y: hidden;
7
7
  -webkit-overflow-scrolling: touch;
8
8
  scroll-behavior: smooth;
9
9
  -ms-overflow-style: none;
@@ -65,10 +65,10 @@
65
65
  padding: var(--menu-item-padding);
66
66
  height: var(--menu-item-height);
67
67
  line-height: var(--menu-item-line-height);
68
- border-width: var(--border-width, 1px);
69
- border-style: var(--border-style, solid);
70
- border-color: var(--button-border-color, transparent);
71
- border-radius: var(--button-border-radius, var(--radius-md));
68
+ border-width: var(--menu-item-border-width);
69
+ border-style: var(--menu-item-border-style);
70
+ border-color: var(--menu-item-border-color);
71
+ border-radius: var(--menu-item-border-radius);
72
72
  }
73
73
 
74
74
  .j-menu .menu .menu-item a .el-icon,
@@ -77,11 +77,11 @@
77
77
  height: var(--menu-item-icon-size);
78
78
  }
79
79
 
80
- .j-menu .menu .menu-item.menu-item-has-children>a {
80
+ .j-menu .menu .menu-item.menu-item-has-children > a {
81
81
  pointer-events: none;
82
82
  }
83
83
 
84
- .j-menu .menu .menu-item.menu-item-has-children>a::after {
84
+ .j-menu .menu .menu-item.menu-item-has-children > a::after {
85
85
  content: '';
86
86
  width: 0;
87
87
  height: 0;
@@ -93,7 +93,7 @@
93
93
  transition: transform 0.2s ease-in-out;
94
94
  }
95
95
 
96
- .j-menu .menu .menu-item.menu-item-has-children:hover>a::after {
96
+ .j-menu .menu .menu-item.menu-item-has-children:hover > a::after {
97
97
  transform: rotate(180deg);
98
98
  }
99
99
 
@@ -103,12 +103,14 @@
103
103
  position: absolute;
104
104
  transform: translateY(1px);
105
105
  padding: var(--s2) 0;
106
- background-color: var(--ui-surface-subtle);
107
- border: 1px solid var(--ui-border);
108
- border-radius: var(--radius-md);
109
- min-width: 120px;
110
- max-width: 240px;
111
- box-shadow: var(--shadow-sm);
106
+ background: var(--sub-menu-bg);
107
+ border-width: var(--sub-menu-border-width);
108
+ border-style: var(--sub-menu-border-style);
109
+ border-color: var(--sub-menu-border-color);
110
+ border-radius: var(--sub-menu-border-radius);
111
+ min-width: var(--sub-menu-min-width);
112
+ max-width: var(--sub-menu-max-width);
113
+ box-shadow: var(--sub-menu-box-shadow);
112
114
  }
113
115
 
114
116
  .j-menu .menu .menu-item .sub-menu .menu-item a {
@@ -125,32 +127,47 @@
125
127
  }
126
128
 
127
129
  .j-menu .menu .menu-item .sub-menu .menu-item:hover a {
128
- background-color: var(--tone-solid);
129
- color: var(--tone-fg);
130
- outline: 1px solid var(--tone-solid);
130
+ background: var(--sub-menu-item-hover-bg);
131
+ color: var(--sub-menu-item-hover-fg);
132
+ outline-width: var(--sub-menu-item-hover-outline-width);
133
+ outline-style: var(--sub-menu-item-hover-outline-style);
134
+ outline-color: var(--sub-menu-item-hover-outline-color);
131
135
  }
132
136
 
133
137
  /* menu status */
134
138
  .j-menu .menu .menu-item a:hover,
135
- .j-menu .menu .menu-item.menu-item-has-children:hover>a {
139
+ .j-menu .menu .menu-item.menu-item-has-children:hover > a {
136
140
  text-decoration: none;
137
- background-color: var(--tone-soft);
138
- color: var(--tone-text);
141
+ background: var(--menu-item-hover-bg);
142
+ color: var(--menu-item-hover-fg);
139
143
  }
140
144
 
141
- .j-menu .menu>.menu-item.current-menu-item>a {
142
- color: var(--tone-solid);
145
+ .j-menu .menu > .menu-item.current-menu-item > a {
146
+ color: var(--menu-link-current-fg);
143
147
  }
144
148
 
145
- .j-menu .menu .menu-item.current-menu-item>.sub-menu>.menu-item:not(.current-menu-item) a {
149
+ .j-menu
150
+ .menu
151
+ .menu-item.current-menu-item
152
+ > .sub-menu
153
+ > .menu-item:not(.current-menu-item)
154
+ a {
146
155
  color: inherit;
147
156
  }
148
157
 
149
- .j-menu .menu-item.current-menu-item>.sub-menu>.menu-item:not(.current-menu-item):hover a {
158
+ .j-menu
159
+ .menu-item.current-menu-item
160
+ > .sub-menu
161
+ > .menu-item:not(.current-menu-item):hover
162
+ a {
150
163
  color: var(--tone-fg);
151
164
  }
152
165
 
153
- .j-menu .menu-item.menu-item-has-children:hover>.sub-menu>.menu-item.current-menu-item a {
166
+ .j-menu
167
+ .menu-item.menu-item-has-children:hover
168
+ > .sub-menu
169
+ > .menu-item.current-menu-item
170
+ a {
154
171
  color: var(--tone-fg);
155
172
  background-color: var(--tone-solid);
156
173
  outline: 1px solid var(--tone-solid);
@@ -158,27 +175,27 @@
158
175
 
159
176
  /* error status */
160
177
  .j-menu .menu .menu-item:not(:has(a)):hover,
161
- .j-mobile-menu .menu .menu-item:not(:has(a)):hover {
162
- background-color: var(--state-danger-subtle);
178
+ .j-menu[data-menu-type='mobile'] .menu .menu-item:not(:has(a)):hover {
179
+ background: var(--menu-item-error-bg);
163
180
  border-radius: var(--space);
164
181
  }
165
182
 
166
183
  .j-menu .menu .menu-item:not(:has(a)):hover::after,
167
- .j-mobile-menu .menu .menu-item:not(:has(a)):hover::after {
184
+ .j-menu[data-menu-type='mobile'] .menu .menu-item:not(:has(a)):hover::after {
168
185
  content: 'Error';
169
186
  position: absolute;
170
187
  top: 0;
171
188
  right: 0;
172
- background-color: var(--state-danger);
173
- color: var(--state-danger-fg);
174
- font-size: var(--font-size-sm);
175
- padding: 0 var(--space);
189
+ background: var(--menu-item-error-tip-bg);
190
+ color: var(--menu-item-error-tip-fg);
191
+ font-size: var(--menu-item-error-tip-font-size);
192
+ padding: var(--menu-item-error-tip-padding);
176
193
  border-radius: var(--space);
177
194
  }
178
195
 
179
196
  /* menu extensions */
180
197
  /* list card menu */
181
- .j-menu .menu-item.menu-item-has-children.list-card-menu:hover>.sub-menu {
198
+ .j-menu .menu-item.menu-item-has-children.list-card-menu:hover > .sub-menu {
182
199
  min-width: 240px;
183
200
  max-width: 360px;
184
201
  width: auto;
@@ -187,7 +204,7 @@
187
204
  transform: translateX(-20%) translateY(1px);
188
205
  }
189
206
 
190
- .j-menu .menu-item.list-card-menu>.sub-menu>.menu-item>a {
207
+ .j-menu .menu-item.list-card-menu > .sub-menu > .menu-item > a {
191
208
  overflow: hidden;
192
209
  display: -webkit-box;
193
210
  -webkit-box-orient: vertical;
@@ -198,7 +215,9 @@
198
215
  }
199
216
 
200
217
  /* advanced card menu */
201
- .j-menu .menu-item.menu-item-has-children.advanced-card-menu:hover>.sub-menu {
218
+ .j-menu
219
+ .menu-item.menu-item-has-children.advanced-card-menu:hover
220
+ > .sub-menu {
202
221
  display: grid;
203
222
  grid-template-columns: repeat(6, 1fr);
204
223
  grid-template-rows: repeat(6, 1fr);
@@ -210,148 +229,167 @@
210
229
  transform: translateX(-33.33%) translateY(1px);
211
230
  }
212
231
 
213
- .j-menu .menu-item.menu-item-has-children.advanced-card-menu:hover>.sub-menu img {
232
+ .j-menu
233
+ .menu-item.menu-item-has-children.advanced-card-menu:hover
234
+ > .sub-menu
235
+ img {
214
236
  margin: 0;
215
237
  }
216
238
 
217
- .j-menu .menu-item.menu-item-has-children.advanced-card-menu:hover>.sub-menu>.menu-item:nth-child(1) {
239
+ .j-menu
240
+ .menu-item.menu-item-has-children.advanced-card-menu:hover
241
+ > .sub-menu
242
+ > .menu-item:nth-child(1) {
218
243
  grid-area: 1 / 1 / 2 / 3;
219
244
  }
220
245
 
221
- .j-menu .menu-item.menu-item-has-children.advanced-card-menu:hover>.sub-menu>.menu-item:nth-child(2) {
246
+ .j-menu
247
+ .menu-item.menu-item-has-children.advanced-card-menu:hover
248
+ > .sub-menu
249
+ > .menu-item:nth-child(2) {
222
250
  grid-area: 1 / 3 / 4 / 5;
223
251
  }
224
252
 
225
- .j-menu .menu-item.menu-item-has-children.advanced-card-menu:hover>.sub-menu>.menu-item:nth-child(3) {
253
+ .j-menu
254
+ .menu-item.menu-item-has-children.advanced-card-menu:hover
255
+ > .sub-menu
256
+ > .menu-item:nth-child(3) {
226
257
  grid-area: 1 / 5 / 4 / 7;
227
258
  }
228
259
 
229
- .j-menu .menu-item.menu-item-has-children.advanced-card-menu:hover>.sub-menu>.menu-item:nth-child(4) {
260
+ .j-menu
261
+ .menu-item.menu-item-has-children.advanced-card-menu:hover
262
+ > .sub-menu
263
+ > .menu-item:nth-child(4) {
230
264
  grid-area: 2 / 1 / 3 / 3;
231
265
  }
232
266
 
233
- .j-menu .menu-item.menu-item-has-children.advanced-card-menu:hover>.sub-menu>.menu-item:nth-child(5) {
267
+ .j-menu
268
+ .menu-item.menu-item-has-children.advanced-card-menu:hover
269
+ > .sub-menu
270
+ > .menu-item:nth-child(5) {
234
271
  grid-area: 3 / 1 / 4 / 3;
235
272
  }
236
273
 
237
- .j-menu .menu-item.menu-item-has-children.advanced-card-menu:hover>.sub-menu>.menu-item:nth-child(6) {
274
+ .j-menu
275
+ .menu-item.menu-item-has-children.advanced-card-menu:hover
276
+ > .sub-menu
277
+ > .menu-item:nth-child(6) {
238
278
  grid-area: 4 / 1 / 5 / 3;
239
279
  }
240
280
 
241
- .j-menu .menu-item.menu-item-has-children.advanced-card-menu:hover>.sub-menu>.menu-item:nth-child(7) {
281
+ .j-menu
282
+ .menu-item.menu-item-has-children.advanced-card-menu:hover
283
+ > .sub-menu
284
+ > .menu-item:nth-child(7) {
242
285
  grid-area: 4 / 3 / 7 / 5;
243
286
  }
244
287
 
245
- .j-menu .menu-item.menu-item-has-children.advanced-card-menu:hover>.sub-menu>.menu-item:nth-child(8) {
288
+ .j-menu
289
+ .menu-item.menu-item-has-children.advanced-card-menu:hover
290
+ > .sub-menu
291
+ > .menu-item:nth-child(8) {
246
292
  grid-area: 4 / 5 / 7 / 7;
247
293
  }
248
294
 
249
- .j-menu .menu-item.menu-item-has-children.advanced-card-menu:hover>.sub-menu>.menu-item:nth-child(9) {
295
+ .j-menu
296
+ .menu-item.menu-item-has-children.advanced-card-menu:hover
297
+ > .sub-menu
298
+ > .menu-item:nth-child(9) {
250
299
  grid-area: 5 / 1 / 6 / 3;
251
300
  }
252
301
 
253
- .j-menu .menu-item.menu-item-has-children.advanced-card-menu:hover>.sub-menu>.menu-item:nth-child(10) {
302
+ .j-menu
303
+ .menu-item.menu-item-has-children.advanced-card-menu:hover
304
+ > .sub-menu
305
+ > .menu-item:nth-child(10) {
254
306
  grid-area: 6 / 1 / 7 / 3;
255
307
  }
256
308
 
257
- .j-menu .menu-item.menu-item-has-children.advanced-card-menu:hover>.sub-menu>.menu-item:nth-child(2) a,
258
- .j-menu .menu-item.menu-item-has-children.advanced-card-menu:hover>.sub-menu>.menu-item:nth-child(3) a,
259
- .j-menu .menu-item.menu-item-has-children.advanced-card-menu:hover>.sub-menu>.menu-item:nth-child(7) a,
260
- .j-menu .menu-item.menu-item-has-children.advanced-card-menu:hover>.sub-menu>.menu-item:nth-child(8) a {
309
+ .j-menu
310
+ .menu-item.menu-item-has-children.advanced-card-menu:hover
311
+ > .sub-menu
312
+ > .menu-item:nth-child(2)
313
+ a,
314
+ .j-menu
315
+ .menu-item.menu-item-has-children.advanced-card-menu:hover
316
+ > .sub-menu
317
+ > .menu-item:nth-child(3)
318
+ a,
319
+ .j-menu
320
+ .menu-item.menu-item-has-children.advanced-card-menu:hover
321
+ > .sub-menu
322
+ > .menu-item:nth-child(7)
323
+ a,
324
+ .j-menu
325
+ .menu-item.menu-item-has-children.advanced-card-menu:hover
326
+ > .sub-menu
327
+ > .menu-item:nth-child(8)
328
+ a {
261
329
  padding: 0;
262
330
  }
263
331
 
264
- .j-menu .menu-item.menu-item-has-children.advanced-card-menu:hover>.sub-menu>.menu-item:nth-child(2) a:hover,
265
- .j-menu .menu-item.menu-item-has-children.advanced-card-menu:hover>.sub-menu>.menu-item:nth-child(3) a:hover,
266
- .j-menu .menu-item.menu-item-has-children.advanced-card-menu:hover>.sub-menu>.menu-item:nth-child(7) a:hover,
267
- .j-menu .menu-item.menu-item-has-children.advanced-card-menu:hover>.sub-menu>.menu-item:nth-child(8) a:hover {
332
+ .j-menu
333
+ .menu-item.menu-item-has-children.advanced-card-menu:hover
334
+ > .sub-menu
335
+ > .menu-item:nth-child(2)
336
+ a:hover,
337
+ .j-menu
338
+ .menu-item.menu-item-has-children.advanced-card-menu:hover
339
+ > .sub-menu
340
+ > .menu-item:nth-child(3)
341
+ a:hover,
342
+ .j-menu
343
+ .menu-item.menu-item-has-children.advanced-card-menu:hover
344
+ > .sub-menu
345
+ > .menu-item:nth-child(7)
346
+ a:hover,
347
+ .j-menu
348
+ .menu-item.menu-item-has-children.advanced-card-menu:hover
349
+ > .sub-menu
350
+ > .menu-item:nth-child(8)
351
+ a:hover {
268
352
  background-color: transparent;
269
353
  outline-color: transparent;
270
354
  }
271
355
 
272
356
  /* mobile menu */
273
- .j-mobile-menu {
274
- width: 100%;
275
- white-space: nowrap;
357
+ .j-menu[data-menu-type='mobile'] {
358
+ background: var(--ui-bg);
276
359
  overflow-x: hidden;
277
360
  overflow-y: auto;
278
- -webkit-overflow-scrolling: touch;
279
- scroll-behavior: smooth;
280
- -ms-overflow-style: none;
281
- scrollbar-width: none;
282
- user-select: none;
283
- background-color: var(--ui-bg);
284
- }
285
-
286
- .j-mobile-menu::-webkit-scrollbar {
287
- display: none;
361
+ scrollbar-width: thin;
362
+ scrollbar-color: var(--ui-border) transparent;
288
363
  }
289
364
 
290
- .j-mobile-menu ol,
291
- .j-mobile-menu ul,
292
- .j-mobile-menu ol li,
293
- .j-mobile-menu ul li {
294
- list-style: none;
295
- margin: 0;
296
- padding: 0;
297
- }
298
-
299
- .j-mobile-menu .menu {
300
- display: flex;
365
+ .j-menu[data-menu-type='mobile'] .menu {
301
366
  flex-direction: column;
302
367
  align-items: flex-start;
303
368
  position: relative;
304
369
  }
305
370
 
306
- .j-mobile-menu .menu .menu-item {
371
+ .j-menu[data-menu-type='mobile'] .menu .menu-item {
307
372
  width: 100%;
308
- flex-shrink: 0;
309
- font-size: var(--font-size-md);
310
- font-weight: var(--font-medium);
311
373
  }
312
374
 
313
- .j-mobile-menu .menu .menu-item:not(:has(a)) {
314
- padding: var(--button-padding, 0.5rem 1rem);
315
- height: var(--button-height, var(--el-height-xl));
316
- text-decoration: underline;
317
- text-decoration-style: wavy;
318
- text-decoration-color: var(--state-danger);
319
- text-underline-offset: 4px;
320
- position: relative;
321
- cursor: help;
375
+ .j-menu[data-menu-type='mobile'] .menu .menu-item:not(:has(a)) {
376
+ padding: var(--menu-item-padding);
322
377
  }
323
378
 
324
- .j-mobile-menu .menu .menu-item a {
325
- display: flex;
379
+ .j-menu[data-menu-type='mobile'] .menu .menu-item a {
326
380
  justify-content: flex-start;
327
- align-items: center;
328
381
  flex-wrap: wrap;
329
382
  gap: var(--s2);
330
383
  white-space: normal;
331
- appearance: button;
332
- touch-action: manipulation;
333
- color: currentColor;
334
384
  min-height: var(--el-height-2xl);
335
- padding: var(--s2) var(--s4);
336
- line-height: var(--line-height-paragraph);
337
385
  position: relative;
338
- text-decoration: none;
339
- }
340
-
341
- .j-mobile-menu .menu .menu-item a .menu-text {
342
386
  line-height: var(--line-height-paragraph);
343
387
  }
344
388
 
345
- .j-mobile-menu .menu .menu-item a .el-icon,
346
- .j-mobile-menu .menu .menu-item a svg {
347
- width: var(--font-size-lg);
348
- height: var(--font-size-lg);
349
- }
350
-
351
- .j-mobile-menu .menu .menu-item.menu-item-has-children>a::after {
352
- content: '';
353
- width: 0;
354
- height: 0;
389
+ .j-menu[data-menu-type='mobile']
390
+ .menu
391
+ .menu-item.menu-item-has-children
392
+ > a::after {
355
393
  vertical-align: middle;
356
394
  position: absolute;
357
395
  right: 1rem;
@@ -361,9 +399,15 @@
361
399
  border-top: 4px solid transparent;
362
400
  }
363
401
 
364
- .j-mobile-menu .menu .menu-item .sub-menu {
402
+ .j-menu[data-menu-type='mobile']
403
+ .menu
404
+ .menu-item.menu-item-has-children:hover
405
+ > a::after {
406
+ transform: none;
407
+ }
408
+
409
+ .j-menu[data-menu-type='mobile'] .menu .menu-item .sub-menu {
365
410
  display: block;
366
- position: absolute;
367
411
  top: 0;
368
412
  left: 0;
369
413
  width: 100%;
@@ -375,18 +419,23 @@
375
419
  visibility 0.3s ease-in-out;
376
420
 
377
421
  max-width: 100%;
378
- background-color: var(--ui-bg);
422
+ background: var(--ui-bg);
379
423
  z-index: -1;
380
424
  }
381
425
 
382
- .j-mobile-menu>.menu>.menu-item:hover>a,
383
- .j-mobile-menu>.menu>.menu-item.menu-item-has-children .sub-menu>.menu-item:hover>a {
384
- background-color: var(--tone-solid);
385
- color: var(--tone-fg);
386
- text-decoration: none;
426
+ .j-menu[data-menu-type='mobile'] .menu .sub-menu .menu-item:hover a {
427
+ background: var(--menu-item-hover-bg);
428
+ color: var(--menu-item-hover-bg);
387
429
  }
388
430
 
389
- .j-mobile-menu .menu .menu-item.menu-item-has-children.is-active>.sub-menu {
431
+ .j-menu[data-menu-type='mobile'] .menu .menu-item:active {
432
+ background: var(--menu-item-active-bg);
433
+ }
434
+
435
+ .j-menu[data-menu-type='mobile']
436
+ .menu
437
+ .menu-item.menu-item-has-children.is-active
438
+ > .sub-menu {
390
439
  visibility: visible;
391
440
  opacity: 1;
392
441
  transform: translateX(0);
@@ -395,96 +444,81 @@
395
444
  }
396
445
 
397
446
  /* bottom menu */
398
- .j-bottom-menu {
399
- width: 100%;
400
- white-space: nowrap;
401
- user-select: none;
447
+ .j-menu[data-menu-type='bottom'] {
402
448
  position: fixed;
403
449
  bottom: 0;
404
450
  left: 0;
451
+ overflow: visible;
452
+ background: var(--ui-bg);
453
+ z-index: var(--z-submenu);
405
454
  }
406
455
 
407
- .j-bottom-menu ol,
408
- .j-bottom-menu ul,
409
- .j-bottom-menu ol li,
410
- .j-bottom-menu ul li {
411
- list-style: none;
412
- margin: 0;
413
- padding: 0;
414
- }
415
-
416
- .j-bottom-menu .menu {
456
+ .j-menu[data-menu-type='bottom'] .menu {
417
457
  position: relative;
418
- display: flex;
419
458
  justify-content: space-between;
420
- align-items: center;
421
459
  gap: 1px;
422
460
  border-top: 1px solid var(--ui-border-subtle);
423
- background: linear-gradient(to bottom,
424
- var(--ui-bg-subtle) 20%,
425
- var(--ui-border) 40%,
426
- var(--ui-outline) 50%,
427
- var(--ui-border) 60%,
428
- var(--ui-bg-subtle) 80%);
429
- font-size: var(--font-size-md);
461
+ background: var(--menu-bg);
430
462
  }
431
463
 
432
- .j-bottom-menu .menu .menu-item {
464
+ .j-menu[data-menu-type='bottom'] .menu .menu-item {
465
+ flex-shrink: unset;
433
466
  width: 100%;
434
467
  display: flex;
435
468
  justify-content: center;
436
469
  align-items: center;
437
- background-color: var(--ui-surface-subtle);
470
+ background: var(--menu-item-bg);
438
471
  }
439
472
 
440
- .j-bottom-menu .menu .menu-item>a {
473
+ .j-menu[data-menu-type='bottom'] .menu .menu-item a {
441
474
  width: 100%;
442
- text-align: center;
443
- text-decoration: none;
444
- height: var(--el-height-2xl);
445
- display: flex;
446
- justify-content: center;
447
- align-items: center;
448
- gap: var(--space);
475
+ height: var(--menu-item-height);
449
476
  color: var(--ui-fg);
450
- padding: calc(var(--space) * 1.5);
451
- }
452
-
453
- .j-bottom-menu .menu .menu-item a .el-icon,
454
- .j-bottom-menu .menu .menu-item a svg {
455
- width: var(--font-size-lg);
456
- height: var(--font-size-lg);
457
477
  }
458
478
 
459
- .j-bottom-menu>.menu>.menu-item.menu-item-has-children>a::after {
479
+ .j-menu[data-menu-type='bottom']
480
+ > .menu
481
+ > .menu-item.menu-item-has-children
482
+ > a::after {
460
483
  content: '☰';
461
484
  font-size: var(--font-size-sm);
485
+ margin-left: unset;
486
+ border: unset;
487
+ width: unset;
488
+ height: unset;
489
+ transition: unset;
490
+ }
491
+
492
+ .j-menu[data-menu-type='bottom']
493
+ > .menu
494
+ .menu-item.menu-item-has-children:hover
495
+ > a::after {
496
+ transform: none;
497
+ }
498
+
499
+ .j-menu[data-menu-type='bottom'] .menu .menu-item.current-menu-parent > a,
500
+ .j-menu[data-menu-type='bottom'] .menu .menu-item.current-menu-item > a,
501
+ .j-menu[data-menu-type='bottom']
502
+ .menu
503
+ .menu-item.menu-item-has-children.is-active
504
+ > a {
505
+ color: var(--tone-solid);
462
506
  }
463
507
 
464
- .j-bottom-menu .menu .menu-item.current-menu-parent>a,
465
- .j-bottom-menu .menu .menu-item.current-menu-item>a,
466
- .j-bottom-menu .menu .menu-item.menu-item-has-children.is-active>a {
467
- background: var(--tone-subtle);
468
- }
469
-
470
- .j-bottom-menu .menu .menu-item.menu-item-has-children>.sub-menu {
508
+ .j-menu[data-menu-type='bottom']
509
+ .menu
510
+ .menu-item.menu-item-has-children
511
+ > .sub-menu {
471
512
  opacity: 0;
472
513
  visibility: hidden;
473
- background: linear-gradient(to right,
474
- var(--ui-surface-subtle) 20%,
475
- var(--ui-border) 40%,
476
- var(--ui-outline) 50%,
477
- var(--ui-border) 60%,
478
- var(--ui-surface-subtle) 80%);
479
- border: 1px solid var(--ui-border-subtle);
480
514
  display: flex;
481
515
  flex-direction: column;
482
516
  align-items: center;
483
517
  justify-content: center;
484
518
  gap: 1px;
519
+ padding-block: 0;
485
520
  min-width: var(--columns-6xs);
486
521
  max-width: var(--columns-2xs);
487
- position: absolute;
488
522
  left: 50%;
489
523
  transform: translateX(-50%);
490
524
  bottom: calc(100% + var(--space));
@@ -493,18 +527,58 @@
493
527
  opacity 0.3s ease-in-out;
494
528
  }
495
529
 
496
- .j-bottom-menu .menu .menu-item.menu-item-has-children.is-active>.sub-menu {
530
+ .j-menu[data-menu-type='bottom']
531
+ .menu
532
+ .menu-item.menu-item-has-children.is-active
533
+ > .sub-menu {
497
534
  opacity: 1;
498
535
  visibility: visible;
499
536
  }
500
537
 
501
- .j-bottom-menu .menu .menu-item.menu-item-has-children>.sub-menu>.menu-item {
502
- background-color: var(--ui-surface-subtle);
538
+ .j-menu[data-menu-type='bottom']
539
+ .menu
540
+ .menu-item.menu-item-has-children
541
+ > .sub-menu
542
+ > .menu-item {
503
543
  white-space: normal;
544
+ border: 1px solid transparent;
545
+ }
546
+
547
+ .j-menu[data-menu-type='bottom']
548
+ .menu
549
+ .menu-item.menu-item-has-children
550
+ > .sub-menu
551
+ > .menu-item
552
+ > a {
553
+ min-height: var(--menu-item-height);
554
+ justify-content: center;
555
+ }
556
+
557
+ .j-menu[data-menu-type='bottom']
558
+ .menu
559
+ .menu-item.menu-item-has-children
560
+ > .sub-menu
561
+ > .menu-item:first-of-type {
562
+ border-top-left-radius: var(--sub-menu-border-radius);
563
+ border-top-right-radius: var(--sub-menu-border-radius);
564
+ }
565
+
566
+ .j-menu[data-menu-type='bottom']
567
+ .menu
568
+ .menu-item.menu-item-has-children
569
+ > .sub-menu
570
+ > .menu-item:last-of-type {
571
+ border-bottom-left-radius: var(--sub-menu-border-radius);
572
+ border-bottom-right-radius: var(--sub-menu-border-radius);
504
573
  }
505
574
 
506
- .j-bottom-menu .menu .menu-item.menu-item-has-children>.sub-menu>.menu-item>a {
507
- padding: calc(var(--space) * 1.5) var(--s3);
575
+ .j-menu[data-menu-type='bottom'] .menu .menu-item:not(:has(a)):hover {
576
+ background: var(--menu-item-bg);
577
+ }
578
+
579
+ .j-menu[data-menu-type='bottom'] .menu .menu-item:not(:has(a)):hover:after {
580
+ top: -0.5rem;
581
+ right: unset;
508
582
  }
509
583
 
510
584
  /* drop menu */
@@ -529,7 +603,7 @@
529
603
  .drop-menu .menu-item a {
530
604
  display: flex;
531
605
  align-items: center;
532
- gap: var(--drop-menu-item-gap, var(--s2));
606
+ gap: var(--s2);
533
607
  width: 100%;
534
608
  padding: var(--space) var(--s2);
535
609
  text-decoration: none;
@@ -549,13 +623,13 @@
549
623
 
550
624
  .drop-menu .el-icon,
551
625
  .drop-menu svg {
552
- width: var(--drop-menu-icon-size, var(--s4));
553
- height: var(--drop-menu-icon-size, var(--s4));
626
+ width: var(--font-size-lg);
627
+ height: var(--font-size-lg);
554
628
  }
555
629
 
556
630
  .drop-menu .menu-item.menu-heading {
557
- padding: var(--menu-item-heading, var(--space) var(--s2));
631
+ padding: var(--space) var(--s2);
558
632
  color: var(--ui-fg-soft);
559
633
  font-size: var(--font-size-sm);
560
634
  }
561
- }
635
+ }