@onetype/framework 2.0.53 → 2.0.55

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 (150) hide show
  1. package/addons/float/popup/css/popup.css +2 -2
  2. package/addons/render/directives/front/functions/process.js +3 -1
  3. package/addons/render/directives/front/items/self/160-slot.js +9 -1
  4. package/addons/render/editor/addon.js +13 -0
  5. package/addons/render/editor/functions/block/add.js +57 -0
  6. package/addons/render/editor/functions/block/delete.js +32 -0
  7. package/addons/render/editor/functions/block/find.js +30 -0
  8. package/addons/render/editor/functions/render/block.js +114 -0
  9. package/addons/render/editor/functions/render/blocks.js +31 -0
  10. package/addons/render/editor/items/elements/editor.js +69 -0
  11. package/addons/render/editor/items/self/paragraph.js +21 -0
  12. package/addons/render/editor/styles/editor.css +252 -0
  13. package/addons/render/elements/front/functions/types/colors/badge.js +19 -0
  14. package/addons/render/elements/front/functions/types/colors/status.js +24 -0
  15. package/addons/render/elements/front/functions/types/escape.js +8 -0
  16. package/addons/render/elements/front/functions/types/format/currency.js +16 -0
  17. package/addons/render/elements/front/functions/types/format/date.js +16 -0
  18. package/addons/render/elements/front/functions/types/format/number.js +24 -0
  19. package/addons/render/elements/front/functions/types/format/timeago.js +43 -0
  20. package/addons/render/elements/front/functions/types/render/avatar.js +10 -0
  21. package/addons/render/elements/front/functions/types/render/badge.js +17 -0
  22. package/addons/render/elements/front/functions/types/render/boolean.js +8 -0
  23. package/addons/render/elements/front/functions/types/render/chip.js +6 -0
  24. package/addons/render/elements/front/functions/types/render/currency.js +7 -0
  25. package/addons/render/elements/front/functions/types/render/date.js +6 -0
  26. package/addons/render/elements/front/functions/types/render/description.js +12 -0
  27. package/addons/render/elements/front/functions/types/render/group.js +11 -0
  28. package/addons/render/elements/front/functions/types/render/icon.js +8 -0
  29. package/addons/render/elements/front/functions/types/render/image.js +9 -0
  30. package/addons/render/elements/front/functions/types/render/link.js +8 -0
  31. package/addons/render/elements/front/functions/types/render/media.js +16 -0
  32. package/addons/render/elements/front/functions/types/render/metric.js +13 -0
  33. package/addons/render/elements/front/functions/types/render/number.js +6 -0
  34. package/addons/render/elements/front/functions/types/render/progress.js +13 -0
  35. package/addons/render/elements/front/functions/types/render/status.js +12 -0
  36. package/addons/render/elements/front/functions/types/render/tag.js +6 -0
  37. package/addons/render/elements/front/functions/types/render/tags.js +11 -0
  38. package/addons/render/elements/front/functions/types/render/text.js +8 -0
  39. package/addons/render/elements/front/functions/types/render/timeago.js +6 -0
  40. package/addons/render/elements/front/functions/types/render.js +16 -0
  41. package/addons/render/elements/front/items/directives/element.js +8 -3
  42. package/addons/render/elements/front/items/self/cards/info/info.css +499 -0
  43. package/addons/render/elements/front/items/self/cards/info/info.js +224 -0
  44. package/addons/render/elements/front/items/self/cards/item/item.css +614 -0
  45. package/addons/render/elements/front/items/self/cards/item/item.js +200 -0
  46. package/addons/render/elements/front/items/self/cards/pricing/pricing.css +318 -46
  47. package/addons/render/elements/front/items/self/cards/pricing/pricing.js +81 -30
  48. package/addons/render/elements/front/items/self/cards/profile/profile.css +446 -0
  49. package/addons/render/elements/front/items/self/cards/profile/profile.js +186 -0
  50. package/addons/render/elements/front/items/self/cards/share/share.css +445 -0
  51. package/addons/render/elements/front/items/self/cards/share/share.js +316 -0
  52. package/addons/render/elements/front/items/self/cards/stat/stat.css +356 -0
  53. package/addons/render/elements/front/items/self/cards/stat/stat.js +146 -0
  54. package/addons/render/elements/front/items/self/charts/bar/bar.css +263 -0
  55. package/addons/render/elements/front/items/self/charts/bar/bar.js +156 -0
  56. package/addons/render/elements/front/items/self/charts/donut/donut.css +222 -0
  57. package/addons/render/elements/front/items/self/charts/donut/donut.js +164 -0
  58. package/addons/render/elements/front/items/self/charts/line/line.css +229 -0
  59. package/addons/render/elements/front/items/self/charts/line/line.js +249 -0
  60. package/addons/render/elements/front/items/self/charts/sparkline/sparkline.css +102 -0
  61. package/addons/render/elements/front/items/self/charts/sparkline/sparkline.js +164 -0
  62. package/addons/render/elements/front/items/self/core/builder/builder.css +71 -116
  63. package/addons/render/elements/front/items/self/core/builder/builder.js +212 -127
  64. package/addons/render/elements/front/items/self/core/repeater/repeater.css +338 -71
  65. package/addons/render/elements/front/items/self/core/repeater/repeater.js +191 -44
  66. package/addons/render/elements/front/items/self/data/filters/filters.css +541 -0
  67. package/addons/render/elements/front/items/self/data/filters/filters.js +504 -0
  68. package/addons/render/elements/front/items/self/data/table/table.css +588 -0
  69. package/addons/render/elements/front/items/self/data/table/table.js +589 -0
  70. package/addons/render/elements/front/items/self/form/button/button.css +430 -103
  71. package/addons/render/elements/front/items/self/form/button/button.js +109 -101
  72. package/addons/render/elements/front/items/self/form/checkbox/checkbox.css +356 -39
  73. package/addons/render/elements/front/items/self/form/checkbox/checkbox.js +109 -75
  74. package/addons/render/elements/front/items/self/form/color/color.css +255 -61
  75. package/addons/render/elements/front/items/self/form/color/color.js +135 -41
  76. package/addons/render/elements/front/items/self/form/date/date.css +289 -38
  77. package/addons/render/elements/front/items/self/form/date/date.js +108 -24
  78. package/addons/render/elements/front/items/self/form/editor/editor.css +447 -0
  79. package/addons/render/elements/front/items/self/form/editor/editor.js +794 -0
  80. package/addons/render/elements/front/items/self/form/field/field.css +160 -29
  81. package/addons/render/elements/front/items/self/form/field/field.js +36 -16
  82. package/addons/render/elements/front/items/self/form/input/input.css +272 -32
  83. package/addons/render/elements/front/items/self/form/input/input.js +324 -124
  84. package/addons/render/elements/front/items/self/form/radio/radio.css +310 -45
  85. package/addons/render/elements/front/items/self/form/radio/radio.js +99 -80
  86. package/addons/render/elements/front/items/self/form/rating/rating.css +234 -57
  87. package/addons/render/elements/front/items/self/form/rating/rating.js +216 -86
  88. package/addons/render/elements/front/items/self/form/section/section.css +247 -32
  89. package/addons/render/elements/front/items/self/form/section/section.js +53 -16
  90. package/addons/render/elements/front/items/self/form/select/select.css +362 -64
  91. package/addons/render/elements/front/items/self/form/select/select.js +156 -30
  92. package/addons/render/elements/front/items/self/form/slider/slider.css +331 -123
  93. package/addons/render/elements/front/items/self/form/slider/slider.js +124 -26
  94. package/addons/render/elements/front/items/self/form/tags/tags.css +328 -53
  95. package/addons/render/elements/front/items/self/form/tags/tags.js +155 -28
  96. package/addons/render/elements/front/items/self/form/textarea/textarea.css +128 -27
  97. package/addons/render/elements/front/items/self/form/textarea/textarea.js +172 -113
  98. package/addons/render/elements/front/items/self/form/toggle/toggle.css +239 -39
  99. package/addons/render/elements/front/items/self/form/toggle/toggle.js +32 -17
  100. package/addons/render/elements/front/items/self/form/transfer/transfer.css +377 -0
  101. package/addons/render/elements/front/items/self/form/transfer/transfer.js +453 -0
  102. package/addons/render/elements/front/items/self/form/upload/upload.css +408 -0
  103. package/addons/render/elements/front/items/self/form/upload/upload.js +469 -0
  104. package/addons/render/elements/front/items/self/global/accordion/accordion.css +377 -0
  105. package/addons/render/elements/front/items/self/global/accordion/accordion.js +135 -0
  106. package/addons/render/elements/front/items/self/global/code/code.css +207 -44
  107. package/addons/render/elements/front/items/self/global/code/code.js +327 -19
  108. package/addons/render/elements/front/items/self/global/gallery/gallery.css +521 -0
  109. package/addons/render/elements/front/items/self/global/gallery/gallery.js +291 -0
  110. package/addons/render/elements/front/items/self/global/heading/heading.css +151 -49
  111. package/addons/render/elements/front/items/self/global/heading/heading.js +30 -15
  112. package/addons/render/elements/front/items/self/global/markdown/markdown.css +284 -135
  113. package/addons/render/elements/front/items/self/global/markdown/markdown.js +35 -5
  114. package/addons/render/elements/front/items/self/global/menu/menu.css +311 -56
  115. package/addons/render/elements/front/items/self/global/menu/menu.js +95 -47
  116. package/addons/render/elements/front/items/self/global/notice/notice.css +263 -23
  117. package/addons/render/elements/front/items/self/global/notice/notice.js +51 -11
  118. package/addons/render/elements/front/items/self/global/parameters/parameters.css +276 -33
  119. package/addons/render/elements/front/items/self/global/parameters/parameters.js +86 -16
  120. package/addons/render/elements/front/items/self/global/tags/tags.css +215 -29
  121. package/addons/render/elements/front/items/self/global/tags/tags.js +91 -17
  122. package/addons/render/elements/front/items/self/navigation/dock/dock.css +221 -0
  123. package/addons/render/elements/front/items/self/navigation/dock/dock.js +134 -0
  124. package/addons/render/elements/front/items/self/navigation/footer/footer.css +356 -0
  125. package/addons/render/elements/front/items/self/navigation/footer/footer.js +219 -0
  126. package/addons/render/elements/front/items/self/navigation/navbar/navbar.css +736 -76
  127. package/addons/render/elements/front/items/self/navigation/navbar/navbar.js +437 -29
  128. package/addons/render/elements/front/items/self/navigation/sidebar/sidebar.css +327 -196
  129. package/addons/render/elements/front/items/self/navigation/sidebar/sidebar.js +115 -62
  130. package/addons/render/elements/front/items/self/navigation/steps/steps.css +345 -0
  131. package/addons/render/elements/front/items/self/navigation/steps/steps.js +113 -0
  132. package/addons/render/elements/front/items/self/navigation/tabs/tabs.css +362 -33
  133. package/addons/render/elements/front/items/self/navigation/tabs/tabs.js +62 -19
  134. package/addons/render/elements/front/items/self/status/code/code.css +83 -12
  135. package/addons/render/elements/front/items/self/status/code/code.js +15 -4
  136. package/addons/render/elements/front/items/self/status/empty/empty.css +95 -15
  137. package/addons/render/elements/front/items/self/status/empty/empty.js +17 -12
  138. package/addons/render/elements/front/items/self/status/error/error.css +99 -14
  139. package/addons/render/elements/front/items/self/status/error/error.js +21 -11
  140. package/addons/render/elements/front/items/self/status/loading/loading.css +85 -14
  141. package/addons/render/elements/front/items/self/status/loading/loading.js +5 -6
  142. package/addons/render/elements/front/styles/types.css +363 -0
  143. package/instructions.txt +28 -0
  144. package/lib/load.js +1 -0
  145. package/lib/styles/reset.css +89 -76
  146. package/package.json +1 -1
  147. package/addons/render/elements/front/items/self/form/editor-markdown/editor-markdown.css +0 -410
  148. package/addons/render/elements/front/items/self/form/editor-markdown/editor-markdown.js +0 -191
  149. package/addons/render/elements/front/items/self/global/faq/faq.css +0 -98
  150. package/addons/render/elements/front/items/self/global/faq/faq.js +0 -56
@@ -6,12 +6,6 @@
6
6
  width: 100%;
7
7
  }
8
8
 
9
- .e-4a1a1973 .e-4a1a1973
10
- {
11
- flex-direction: column;
12
- padding-left: var(--ot-spacing-m);
13
- }
14
-
15
9
  /* Holder */
16
10
 
17
11
  .e-4a1a1973 > .holder
@@ -19,13 +13,11 @@
19
13
  display: flex;
20
14
  flex-direction: column;
21
15
  width: 100%;
22
- padding: var(--ot-spacing-x) 0;
23
- border: 1px solid transparent;
24
- border-radius: var(--ot-radius-m);
25
- overflow: hidden;
16
+ padding: var(--ot-spacing-x);
17
+ gap: 1px;
26
18
  }
27
19
 
28
- /* Entry */
20
+ /* ===== ENTRY ===== */
29
21
 
30
22
  .e-4a1a1973 .entry
31
23
  {
@@ -33,24 +25,30 @@
33
25
  flex-direction: column;
34
26
  }
35
27
 
36
- /* Content (clickable row) */
28
+ /* ===== CONTENT (clickable row) ===== */
37
29
 
38
30
  .e-4a1a1973 .entry > .content
39
31
  {
40
32
  display: flex;
41
33
  align-items: center;
42
34
  gap: var(--ot-spacing-s);
43
- padding: 0 var(--ot-spacing-m);
44
- padding-left: calc(var(--ot-spacing-m) + var(--ot-spacing-m) * var(--depth, 0));
45
- height: var(--ot-height-m);
35
+ padding: 0 var(--ot-spacing-s);
36
+ min-height: var(--ot-height-m);
37
+ background: transparent;
38
+ border: none;
39
+ border-radius: var(--ot-radius-s);
46
40
  cursor: pointer;
47
41
  user-select: none;
48
- transition: background 0.1s ease;
42
+ text-decoration: none;
43
+ font-family: var(--ot-font-primary);
44
+ text-align: left;
45
+ width: 100%;
46
+ transition: background 0.15s cubic-bezier(0.22, 1, 0.36, 1), color 0.15s cubic-bezier(0.22, 1, 0.36, 1);
49
47
  }
50
48
 
51
49
  .e-4a1a1973 .entry > .content:hover
52
50
  {
53
- background: var(--ot-bg-1-hover);
51
+ background: var(--ot-bg-2-hover);
54
52
  }
55
53
 
56
54
  .e-4a1a1973 .entry.disabled > .content
@@ -64,110 +62,367 @@
64
62
 
65
63
  .e-4a1a1973 .entry > .content > .icon
66
64
  {
67
- font-size: var(--ot-size-m);
68
- color: var(--ot-text-2);
65
+ display: flex;
66
+ align-items: center;
67
+ justify-content: center;
69
68
  width: 20px;
70
- text-align: center;
69
+ font-size: 18px;
70
+ color: var(--ot-text-2);
71
71
  flex-shrink: 0;
72
72
  }
73
73
 
74
- /* Label */
74
+ /* Text */
75
75
 
76
- .e-4a1a1973 .entry > .content > .label
76
+ .e-4a1a1973 .entry > .content > .text
77
77
  {
78
- font-size: var(--ot-size-m);
79
- color: var(--ot-text-1);
78
+ display: flex;
79
+ flex-direction: column;
80
+ gap: 1px;
80
81
  flex: 1;
82
+ min-width: 0;
83
+ }
84
+
85
+ .e-4a1a1973 .entry > .content > .text > .label
86
+ {
87
+ font-size: 13px;
88
+ font-weight: 500;
89
+ color: var(--ot-text-1);
90
+ white-space: nowrap;
91
+ overflow: hidden;
92
+ text-overflow: ellipsis;
93
+ }
94
+
95
+ .e-4a1a1973 .entry > .content > .text > .description
96
+ {
97
+ font-size: 11.5px;
98
+ color: var(--ot-text-3);
99
+ line-height: 1.35;
81
100
  white-space: nowrap;
82
101
  overflow: hidden;
83
102
  text-overflow: ellipsis;
84
103
  }
85
104
 
105
+ /* Badge */
106
+
107
+ .e-4a1a1973 .entry > .content > .badge
108
+ {
109
+ display: inline-flex;
110
+ align-items: center;
111
+ justify-content: center;
112
+ min-width: 20px;
113
+ height: 18px;
114
+ padding: 0 6px;
115
+ background: var(--ot-brand);
116
+ color: white;
117
+ border-radius: 100px;
118
+ font-size: 10px;
119
+ font-weight: 700;
120
+ font-family: var(--ot-font-primary);
121
+ flex-shrink: 0;
122
+ }
123
+
86
124
  /* Shortcut */
87
125
 
88
126
  .e-4a1a1973 .entry > .content > .shortcut
89
127
  {
90
- font-size: var(--ot-size-s);
128
+ display: inline-flex;
129
+ align-items: center;
130
+ padding: 2px 6px;
131
+ border-radius: var(--ot-radius-s);
132
+ background: var(--ot-bg-3);
91
133
  color: var(--ot-text-2);
92
- opacity: 0.6;
93
- flex-shrink: 0;
94
- margin-left: var(--ot-spacing-l);
134
+ font-family: ui-monospace, 'SF Mono', Menlo, monospace;
135
+ font-size: 10.5px;
136
+ font-weight: 500;
95
137
  letter-spacing: 0.02em;
138
+ flex-shrink: 0;
139
+ margin-left: auto;
96
140
  }
97
141
 
98
- /* Arrow */
142
+ /* Trailing right icon */
143
+
144
+ .e-4a1a1973 .entry > .content > .icon-right
145
+ {
146
+ font-size: 16px;
147
+ color: var(--ot-text-3);
148
+ flex-shrink: 0;
149
+ margin-left: auto;
150
+ }
151
+
152
+ .e-4a1a1973 .entry > .content > .shortcut + .icon-right,
153
+ .e-4a1a1973 .entry > .content > .badge + .icon-right,
154
+ .e-4a1a1973 .entry > .content > .badge + .shortcut
155
+ {
156
+ margin-left: 0;
157
+ }
158
+
159
+ /* Arrow (for submenu parents) */
99
160
 
100
161
  .e-4a1a1973 .entry > .content > .arrow
101
162
  {
102
- font-size: var(--ot-size-m);
103
- color: var(--ot-text-2);
163
+ font-size: 18px;
164
+ color: var(--ot-text-3);
104
165
  flex-shrink: 0;
105
166
  margin-left: auto;
106
- transition: color 0.15s ease;
167
+ transition: transform 0.25s cubic-bezier(0.22, 1, 0.36, 1), color 0.15s;
107
168
  }
108
169
 
109
170
  .e-4a1a1973 .entry.open > .content > .arrow
110
171
  {
111
- color: var(--ot-text-1);
172
+ transform: rotate(180deg);
173
+ color: var(--ot-brand);
174
+ }
175
+
176
+ /* ===== STATES ===== */
177
+
178
+ /* Active */
179
+
180
+ .e-4a1a1973 .entry.active > .content
181
+ {
182
+ background: var(--ot-brand-opacity);
183
+ }
184
+
185
+ .e-4a1a1973 .entry.active > .content > .icon,
186
+ .e-4a1a1973 .entry.active > .content > .text > .label
187
+ {
188
+ color: var(--ot-brand);
189
+ }
190
+
191
+ .e-4a1a1973 .entry.active > .content > .icon
192
+ {
193
+ font-variation-settings: 'FILL' 0, 'wght' 500;
194
+ }
195
+
196
+ /* Danger */
197
+
198
+ .e-4a1a1973 .entry.danger > .content > .icon,
199
+ .e-4a1a1973 .entry.danger > .content > .text > .label
200
+ {
201
+ color: var(--ot-red);
202
+ }
203
+
204
+ .e-4a1a1973 .entry.danger > .content:hover
205
+ {
206
+ background: var(--ot-red-opacity);
207
+ }
208
+
209
+ .e-4a1a1973 .entry.danger > .content:hover > .icon,
210
+ .e-4a1a1973 .entry.danger > .content:hover > .text > .label
211
+ {
212
+ color: var(--ot-red);
112
213
  }
113
214
 
114
- /* Separator */
215
+ /* Color accents */
216
+
217
+ .e-4a1a1973 .entry.color-brand > .content > .icon { color: var(--ot-brand); }
218
+ .e-4a1a1973 .entry.color-blue > .content > .icon { color: var(--ot-blue); }
219
+ .e-4a1a1973 .entry.color-red > .content > .icon { color: var(--ot-red); }
220
+ .e-4a1a1973 .entry.color-orange > .content > .icon { color: var(--ot-orange); }
221
+ .e-4a1a1973 .entry.color-green > .content > .icon { color: var(--ot-green); }
222
+
223
+ /* ===== SEPARATOR ===== */
224
+
225
+ .e-4a1a1973 .entry.separator
226
+ {
227
+ padding: var(--ot-spacing-x) 0;
228
+ }
115
229
 
116
230
  .e-4a1a1973 .entry > .separator
117
231
  {
118
232
  height: 1px;
119
- margin: var(--ot-spacing-x) var(--ot-spacing-m);
120
233
  background: var(--ot-bg-2-border);
234
+ margin: 0 var(--ot-spacing-s);
121
235
  }
122
236
 
123
- /* Header */
237
+ /* ===== HEADER ===== */
124
238
 
125
239
  .e-4a1a1973 .entry > .header
126
240
  {
127
- font-size: var(--ot-size-s);
128
- font-weight: 600;
129
- color: var(--ot-text-2);
241
+ font-size: 10.5px;
242
+ font-weight: 700;
243
+ text-transform: uppercase;
244
+ letter-spacing: 0.08em;
245
+ color: var(--ot-text-3);
130
246
  padding: var(--ot-spacing-s) var(--ot-spacing-m) var(--ot-spacing-x);
131
247
  user-select: none;
132
- text-transform: uppercase;
133
- letter-spacing: 0.04em;
248
+ font-family: var(--ot-font-primary);
249
+ }
250
+
251
+ /* ===== SUBMENU (nested) ===== */
252
+
253
+ .e-4a1a1973 .entry > .submenu
254
+ {
255
+ padding-left: calc(20px + var(--ot-spacing-s));
256
+ animation: e-4a1a1973-reveal 0.25s cubic-bezier(0.22, 1, 0.36, 1);
257
+ }
258
+
259
+ @keyframes e-4a1a1973-reveal
260
+ {
261
+ from { opacity: 0; transform: translateY(-4px); }
262
+ to { opacity: 1; transform: translateY(0); }
263
+ }
264
+
265
+ /* ===== STYLE: DEFAULT ===== */
266
+
267
+ .e-4a1a1973 > .holder.default
268
+ {
269
+ background: var(--ot-bg-2);
270
+ border: 1px solid var(--ot-bg-2-border);
271
+ border-radius: var(--ot-radius-m);
272
+ }
273
+
274
+ /* ===== STYLE: CONTEXTUAL (floating) ===== */
275
+
276
+ .e-4a1a1973 > .holder.contextual
277
+ {
278
+ background: var(--ot-bg-1);
279
+ border: 1px solid var(--ot-bg-1-border);
280
+ border-radius: var(--ot-radius-m);
281
+ box-shadow: 0 12px 40px -12px rgba(20, 20, 30, 0.18), 0 4px 12px -4px rgba(20, 20, 30, 0.08);
282
+ min-width: 220px;
134
283
  }
135
284
 
136
- /* Background variants */
285
+ /* ===== STYLE: FLUSH (no container) ===== */
286
+
287
+ .e-4a1a1973 > .holder.flush
288
+ {
289
+ background: transparent;
290
+ border: none;
291
+ border-radius: 0;
292
+ padding: 0;
293
+ }
294
+
295
+ /* ===== STYLE: BORDERED (border only) ===== */
296
+
297
+ .e-4a1a1973 > .holder.bordered
298
+ {
299
+ background: transparent;
300
+ border: 1px solid var(--ot-bg-2-border);
301
+ border-radius: var(--ot-radius-m);
302
+ }
303
+
304
+ /* ===== BACKGROUNDS ===== */
137
305
 
138
306
  .e-4a1a1973 > .holder.bg-1 { background: var(--ot-bg-1); border-color: var(--ot-bg-1-border); }
139
307
  .e-4a1a1973 > .holder.bg-1 .entry > .content:hover { background: var(--ot-bg-1-hover); }
308
+ .e-4a1a1973 > .holder.bg-1 .entry > .content > .shortcut { background: var(--ot-bg-2); }
140
309
  .e-4a1a1973 > .holder.bg-1 .entry > .separator { background: var(--ot-bg-1-border); }
141
310
 
142
311
  .e-4a1a1973 > .holder.bg-2 { background: var(--ot-bg-2); border-color: var(--ot-bg-2-border); }
143
312
  .e-4a1a1973 > .holder.bg-2 .entry > .content:hover { background: var(--ot-bg-2-hover); }
313
+ .e-4a1a1973 > .holder.bg-2 .entry > .content > .shortcut { background: var(--ot-bg-1); }
144
314
  .e-4a1a1973 > .holder.bg-2 .entry > .separator { background: var(--ot-bg-2-border); }
145
315
 
146
316
  .e-4a1a1973 > .holder.bg-3 { background: var(--ot-bg-3); border-color: var(--ot-bg-3-border); }
147
317
  .e-4a1a1973 > .holder.bg-3 .entry > .content:hover { background: var(--ot-bg-3-hover); }
318
+ .e-4a1a1973 > .holder.bg-3 .entry > .content > .shortcut { background: var(--ot-bg-2); }
148
319
  .e-4a1a1973 > .holder.bg-3 .entry > .separator { background: var(--ot-bg-3-border); }
149
320
 
150
321
  .e-4a1a1973 > .holder.bg-4 { background: var(--ot-bg-4); border-color: var(--ot-bg-4-border); }
151
322
  .e-4a1a1973 > .holder.bg-4 .entry > .content:hover { background: var(--ot-bg-4-hover); }
323
+ .e-4a1a1973 > .holder.bg-4 .entry > .content > .shortcut { background: var(--ot-bg-3); }
152
324
  .e-4a1a1973 > .holder.bg-4 .entry > .separator { background: var(--ot-bg-4-border); }
153
325
 
154
- /* Border variant */
326
+ /* ===== BORDERS ===== */
155
327
 
156
328
  .e-4a1a1973 > .holder.border { border: 1px solid var(--ot-bg-2-border); }
329
+ .e-4a1a1973 > .holder.border-top { border-top: 1px solid var(--ot-bg-2-border); }
330
+ .e-4a1a1973 > .holder.border-right { border-right: 1px solid var(--ot-bg-2-border); }
331
+ .e-4a1a1973 > .holder.border-bottom { border-bottom: 1px solid var(--ot-bg-2-border); }
332
+ .e-4a1a1973 > .holder.border-left { border-left: 1px solid var(--ot-bg-2-border); }
333
+
334
+ .e-4a1a1973 > .holder.bg-1.border,
335
+ .e-4a1a1973 > .holder.bg-1.border-top,
336
+ .e-4a1a1973 > .holder.bg-1.border-right,
337
+ .e-4a1a1973 > .holder.bg-1.border-bottom,
338
+ .e-4a1a1973 > .holder.bg-1.border-left { border-color: var(--ot-bg-1-border); }
339
+
340
+ .e-4a1a1973 > .holder.bg-2.border,
341
+ .e-4a1a1973 > .holder.bg-2.border-top,
342
+ .e-4a1a1973 > .holder.bg-2.border-right,
343
+ .e-4a1a1973 > .holder.bg-2.border-bottom,
344
+ .e-4a1a1973 > .holder.bg-2.border-left { border-color: var(--ot-bg-2-border); }
345
+
346
+ .e-4a1a1973 > .holder.bg-3.border,
347
+ .e-4a1a1973 > .holder.bg-3.border-top,
348
+ .e-4a1a1973 > .holder.bg-3.border-right,
349
+ .e-4a1a1973 > .holder.bg-3.border-bottom,
350
+ .e-4a1a1973 > .holder.bg-3.border-left { border-color: var(--ot-bg-3-border); }
351
+
352
+ .e-4a1a1973 > .holder.bg-4.border,
353
+ .e-4a1a1973 > .holder.bg-4.border-top,
354
+ .e-4a1a1973 > .holder.bg-4.border-right,
355
+ .e-4a1a1973 > .holder.bg-4.border-bottom,
356
+ .e-4a1a1973 > .holder.bg-4.border-left { border-color: var(--ot-bg-4-border); }
357
+
358
+ /* ===== SIZES ===== */
359
+
360
+ .e-4a1a1973 > .holder.size-s .entry > .content
361
+ {
362
+ min-height: var(--ot-height-s);
363
+ padding: 0 var(--ot-spacing-x);
364
+ gap: var(--ot-spacing-x);
365
+ }
157
366
 
158
- /* Size variants */
367
+ .e-4a1a1973 > .holder.size-s .entry > .content > .icon
368
+ {
369
+ width: 16px;
370
+ font-size: 15px;
371
+ }
159
372
 
160
- .e-4a1a1973 > .holder.size-s .entry > .content { height: var(--ot-height-s); padding: 0 var(--ot-spacing-s); gap: var(--ot-spacing-x); }
161
- .e-4a1a1973 > .holder.size-s .entry > .content > .icon { font-size: var(--ot-size-s); width: 16px; }
162
- .e-4a1a1973 > .holder.size-s .entry > .content > .label { font-size: var(--ot-size-s); }
163
- .e-4a1a1973 > .holder.size-s .entry > .content > .shortcut { font-size: 10px; }
164
- .e-4a1a1973 > .holder.size-s .entry > .header { font-size: 10px; padding: var(--ot-spacing-x) var(--ot-spacing-s) 2px; }
165
- .e-4a1a1973 > .holder.size-s .entry > .separator { margin: 2px var(--ot-spacing-s); }
373
+ .e-4a1a1973 > .holder.size-s .entry > .content > .text > .label
374
+ {
375
+ font-size: 12px;
376
+ }
166
377
 
167
- .e-4a1a1973 > .holder.size-m .entry > .content { height: var(--ot-height-m); }
378
+ .e-4a1a1973 > .holder.size-s .entry > .content > .text > .description
379
+ {
380
+ font-size: 10.5px;
381
+ }
168
382
 
169
- .e-4a1a1973 > .holder.size-l .entry > .content { height: var(--ot-height-l); padding: 0 var(--ot-spacing-l); gap: var(--ot-spacing-m); }
170
- .e-4a1a1973 > .holder.size-l .entry > .content > .icon { font-size: var(--ot-size-l); width: 28px; }
171
- .e-4a1a1973 > .holder.size-l .entry > .content > .label { font-size: var(--ot-size-m); }
172
- .e-4a1a1973 > .holder.size-l .entry > .header { font-size: var(--ot-size-s); padding: var(--ot-spacing-m) var(--ot-spacing-l) var(--ot-spacing-x); }
173
- .e-4a1a1973 > .holder.size-l .entry > .separator { margin: var(--ot-spacing-x) var(--ot-spacing-l); }
383
+ .e-4a1a1973 > .holder.size-s .entry > .content > .shortcut
384
+ {
385
+ font-size: 10px;
386
+ padding: 1px 5px;
387
+ }
388
+
389
+ .e-4a1a1973 > .holder.size-s .entry > .header
390
+ {
391
+ font-size: 9.5px;
392
+ padding: var(--ot-spacing-x) var(--ot-spacing-s) 2px;
393
+ }
394
+
395
+ .e-4a1a1973 > .holder.size-l .entry > .content
396
+ {
397
+ min-height: var(--ot-height-l);
398
+ padding: 0 var(--ot-spacing-m);
399
+ gap: var(--ot-spacing-m);
400
+ }
401
+
402
+ .e-4a1a1973 > .holder.size-l .entry > .content > .icon
403
+ {
404
+ width: 24px;
405
+ font-size: 22px;
406
+ }
407
+
408
+ .e-4a1a1973 > .holder.size-l .entry > .content > .text > .label
409
+ {
410
+ font-size: 14px;
411
+ }
412
+
413
+ .e-4a1a1973 > .holder.size-l .entry > .content > .text > .description
414
+ {
415
+ font-size: 12.5px;
416
+ }
417
+
418
+ .e-4a1a1973 > .holder.size-l .entry > .content > .shortcut
419
+ {
420
+ font-size: 11.5px;
421
+ padding: 3px 8px;
422
+ }
423
+
424
+ .e-4a1a1973 > .holder.size-l .entry > .header
425
+ {
426
+ font-size: 11.5px;
427
+ padding: var(--ot-spacing-m) var(--ot-spacing-l) var(--ot-spacing-x);
428
+ }
@@ -4,7 +4,7 @@ onetype.AddonReady('elements', (elements) =>
4
4
  id: 'global-menu',
5
5
  icon: 'menu',
6
6
  name: 'Menu',
7
- description: 'Multi-level menu with icons, shortcuts, headers and separators.',
7
+ description: 'Premium menu with icons, descriptions, shortcuts, badges, nested items and multiple styles.',
8
8
  category: 'Global',
9
9
  author: 'OneType',
10
10
  config: {
@@ -14,13 +14,22 @@ onetype.AddonReady('elements', (elements) =>
14
14
  each: {
15
15
  type: 'object',
16
16
  config: {
17
- type: { type: 'string', value: 'action', options: ['action', 'separator', 'header'] },
18
- icon: { type: 'string', value: '' },
19
- label: { type: 'string', value: '' },
20
- value: { type: 'string', value: '' },
21
- shortcut: { type: 'string', value: '' },
22
- disabled: { type: 'boolean', value: false },
23
- items: { type: 'array', value: [] }
17
+ type: { type: 'string', value: 'action', options: ['action', 'link', 'separator', 'header'] },
18
+ id: { type: 'string' },
19
+ label: { type: 'string' },
20
+ description: { type: 'string' },
21
+ icon: { type: 'string' },
22
+ iconRight: { type: 'string' },
23
+ shortcut: { type: 'string' },
24
+ badge: { type: 'string|number' },
25
+ value: { type: 'string' },
26
+ href: { type: 'string' },
27
+ target: { type: 'string' },
28
+ active: { type: 'boolean' },
29
+ disabled: { type: 'boolean' },
30
+ danger: { type: 'boolean' },
31
+ color: { type: 'string', options: ['brand', 'blue', 'red', 'orange', 'green'] },
32
+ items: { type: 'array' }
24
33
  }
25
34
  }
26
35
  },
@@ -30,8 +39,8 @@ onetype.AddonReady('elements', (elements) =>
30
39
  },
31
40
  variant: {
32
41
  type: 'array',
33
- value: ['bg-2', 'size-m'],
34
- options: ['bg-1', 'bg-2', 'bg-3', 'bg-4', 'border', 'size-s', 'size-m', 'size-l']
42
+ value: ['default', 'size-m'],
43
+ options: ['default', 'contextual', 'flush', 'bordered', 'bg-1', 'bg-2', 'bg-3', 'bg-4', 'border', 'border-top', 'border-right', 'border-bottom', 'border-left', 'size-s', 'size-m', 'size-l']
35
44
  },
36
45
  _select: {
37
46
  type: 'function'
@@ -39,63 +48,102 @@ onetype.AddonReady('elements', (elements) =>
39
48
  },
40
49
  render: function()
41
50
  {
51
+ const styles = ['default', 'contextual', 'flush', 'bordered'];
52
+ const hasStyle = this.variant.some(v => styles.includes(v));
53
+
54
+ if(!hasStyle)
55
+ {
56
+ this.variant = ['default', ...this.variant];
57
+ }
58
+
42
59
  this.opened = {};
43
60
 
44
- this.toggle = (index) =>
61
+ this.hasChildren = (item) =>
45
62
  {
46
- this.opened[index] = !this.opened[index];
47
- this.Update();
63
+ return item.items && item.items.length > 0;
48
64
  };
49
65
 
50
- this.isOpen = (index) =>
66
+ this.isOpen = (id) =>
51
67
  {
52
- return !!this.opened[index];
68
+ return !!this.opened[id];
53
69
  };
54
70
 
55
- this.select = (item) =>
71
+ this.toggle = (item, event) =>
56
72
  {
57
- if (item.disabled)
73
+ if(item.disabled)
58
74
  {
59
75
  return;
60
76
  }
61
77
 
62
- if (this._select)
63
- {
64
- this._select({ value: item.value || item.label });
65
- }
78
+ this.opened[item.id || item.label] = !this.opened[item.id || item.label];
79
+ this.Update();
66
80
  };
67
81
 
68
- this.hasChildren = (item) =>
82
+ this.select = (item, event) =>
69
83
  {
70
- return item.items && item.items.length > 0;
71
- };
84
+ if(item.disabled)
85
+ {
86
+ return;
87
+ }
72
88
 
73
- const items = `
74
- <div ot-for="item, index in items" :class="'entry ' + item.type + (item.disabled ? ' disabled' : '') + (hasChildren(item) ? ' parent' : '') + (isOpen(index) ? ' open' : '')">
75
- <div ot-if="item.type === 'separator'" class="separator"></div>
76
- <div ot-if="item.type === 'header'" class="header">{{ item.label }}</div>
77
- <div ot-if="item.type === 'action' && hasChildren(item)" class="content" ot-click="toggle(index)">
78
- <i ot-if="item.icon" class="icon">{{ item.icon }}</i>
79
- <span class="label">{{ item.label }}</span>
80
- <i class="arrow">{{ isOpen(index) ? 'expand_less' : 'expand_more' }}</i>
81
- </div>
82
- <div ot-if="item.type === 'action' && !hasChildren(item)" class="content" ot-click="select(item)">
83
- <i ot-if="item.icon" class="icon">{{ item.icon }}</i>
84
- <span class="label">{{ item.label }}</span>
85
- <span ot-if="item.shortcut" class="shortcut">{{ item.shortcut }}</span>
86
- </div>
87
- <e-global-menu ot-if="hasChildren(item) && isOpen(index)" :items="item.items" :depth="depth + 1" :_select="_select" :style="'--depth: ' + (depth + 1)"></e-global-menu>
88
- </div>
89
- `;
89
+ if(this.hasChildren(item))
90
+ {
91
+ this.toggle(item, event);
92
+ return;
93
+ }
90
94
 
91
- if (this.depth > 0)
92
- {
93
- return items;
94
- }
95
+ if(this._select)
96
+ {
97
+ this._select({ event, value: item.value || item.id || item.label });
98
+ }
99
+ };
95
100
 
96
- return `
101
+ return /* html */ `
97
102
  <div :class="'holder ' + variant.join(' ')">
98
- ${items}
103
+ <div
104
+ ot-for="item in items"
105
+ :class="'entry ' + item.type + (item.disabled ? ' disabled' : '') + (item.active ? ' active' : '') + (item.danger ? ' danger' : '') + (item.color ? ' color-' + item.color : '') + (hasChildren(item) ? ' parent' : '') + (isOpen(item.id || item.label) ? ' open' : '')"
106
+ >
107
+ <div ot-if="item.type === 'separator'" class="separator"></div>
108
+
109
+ <div ot-if="item.type === 'header'" class="header">{{ item.label }}</div>
110
+
111
+ <a
112
+ ot-if="(item.type === 'action' || item.type === 'link') && !hasChildren(item)"
113
+ :href="item.href || 'javascript:void(0)'"
114
+ :target="item.target"
115
+ class="content"
116
+ ot-click="(event) => select(item, event)"
117
+ >
118
+ <i ot-if="item.icon" class="icon">{{ item.icon }}</i>
119
+ <div class="text">
120
+ <span class="label">{{ item.label }}</span>
121
+ <span ot-if="item.description" class="description">{{ item.description }}</span>
122
+ </div>
123
+ <span ot-if="item.badge" class="badge">{{ item.badge }}</span>
124
+ <span ot-if="item.shortcut" class="shortcut">{{ item.shortcut }}</span>
125
+ <i ot-if="item.iconRight" class="icon-right">{{ item.iconRight }}</i>
126
+ </a>
127
+
128
+ <button
129
+ ot-if="item.type === 'action' && hasChildren(item)"
130
+ type="button"
131
+ class="content"
132
+ ot-click="(event) => toggle(item, event)"
133
+ >
134
+ <i ot-if="item.icon" class="icon">{{ item.icon }}</i>
135
+ <div class="text">
136
+ <span class="label">{{ item.label }}</span>
137
+ <span ot-if="item.description" class="description">{{ item.description }}</span>
138
+ </div>
139
+ <span ot-if="item.badge" class="badge">{{ item.badge }}</span>
140
+ <i class="arrow">expand_more</i>
141
+ </button>
142
+
143
+ <div ot-if="hasChildren(item) && isOpen(item.id || item.label)" class="submenu">
144
+ <e-global-menu :items="item.items" :depth="depth + 1" :_select="_select" :variant="['flush', 'size-' + (variant.find(v => v.startsWith('size-')) || 'size-m').replace('size-', '')]"></e-global-menu>
145
+ </div>
146
+ </div>
99
147
  </div>
100
148
  `;
101
149
  }