griffincss-ui 0.25.0-dev → 0.26.1
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/dist/griffincss-ui-scoped.css +1 -1
- package/dist/griffincss-ui.css +1 -1
- package/dist/griffincss-ui.js +1 -1
- package/dist/griffincss-ui.js.map +1 -1
- package/dist/griffinjs-core.js +1 -1
- package/dist/griffinjs-core.js.map +1 -1
- package/dist/griffinjs-dialog.js +1 -1
- package/dist/griffinjs-dialog.js.map +1 -1
- package/dist/griffinjs-dropdown.js +1 -1
- package/dist/griffinjs-dropdown.js.map +1 -1
- package/dist/griffinjs-fields.css +1 -1
- package/dist/griffinjs-fields.js +1 -1
- package/dist/griffinjs-fields.js.map +1 -1
- package/dist/griffinjs-loader.js +3 -0
- package/dist/griffinjs-loader.js.map +1 -0
- package/dist/griffinjs-megamenu.js +1 -1
- package/dist/griffinjs-megamenu.js.map +1 -1
- package/dist/griffinjs-validate.js +1 -1
- package/dist/griffinjs-validate.js.map +1 -1
- package/dist/griffinjs.css +1 -1
- package/dist/griffinjs.js +1 -1
- package/dist/griffinjs.js.map +1 -1
- package/package.json +4 -3
- package/scss/_accordion.scss +5 -2
- package/scss/_alert.scss +1 -1
- package/scss/_card.scss +33 -7
- package/scss/_choice.scss +36 -4
- package/scss/_dropdown.scss +7 -3
- package/scss/_form.scss +42 -1
- package/scss/_menu.scss +4 -1
- package/scss/_modal.scss +44 -7
- package/scss/_nav.scss +5 -2
- package/scss/_rating.scss +7 -1
- package/scss/_table.scss +91 -0
- package/scss/_tabs.scss +4 -1
- package/scss/griffincss-ui-scoped.scss +17 -7
- package/scss/griffincss-ui.scss +16 -10
- package/scss/griffinjs/_track.scss +43 -4
- package/scss/griffinjs/fields/_number.scss +9 -11
- package/scss/griffinjs/fields/fields.scss +1 -1
- package/scss/griffinjs/griffinjs.scss +1 -1
- package/src/griffincss-ui.js +2 -2
- package/src/griffinjs/core/griffinjs-core.js +57 -11
- package/src/griffinjs/core/loader.js +124 -0
- package/src/griffinjs/fields/validate.js +24 -3
- package/src/griffinjs/widgets/dialog.js +67 -2
- package/src/griffinjs/widgets/dropdown.js +94 -4
- package/src/griffinjs/widgets/megamenu.js +90 -5
|
@@ -27,7 +27,16 @@
|
|
|
27
27
|
* закрывает и возвращает фокус на заголовок;
|
|
28
28
|
* * закрытие щелчком мимо полосы и уходом фокуса;
|
|
29
29
|
* * ajax-панели: data-gr-src на пункте грузится при первом открытии,
|
|
30
|
-
* состояния loading → ready | error пишутся на
|
|
30
|
+
* состояния loading → ready | error пишутся на пункт;
|
|
31
|
+
* * закрытие с состоянием (Этап 48d): панель, чей уход тема анимирует,
|
|
32
|
+
* не пропадает в первом же кадре — на пункт ставится
|
|
33
|
+
* data-gr-state="closing", open снимается по transitionend/animationend
|
|
34
|
+
* самой панели или по таймауту в длительность --gr-transition плюс
|
|
35
|
+
* 50 мс. Щелчок по заголовку открытого пункта идёт тем же путём.
|
|
36
|
+
* Во всех браузерах, без развилки по ::details-content: Firefox 153
|
|
37
|
+
* поддерживает селектор и allow-discrete, но закрытие не анимирует —
|
|
38
|
+
* замер в browser/closing.spec.mjs (решение владельца 2026-09-21).
|
|
39
|
+
* CSS слоя переходов не задаёт — при 0s закрывается сразу.
|
|
31
40
|
*
|
|
32
41
|
* Пункт — <details>, не вложенный в другой <details> полосы, с панелью
|
|
33
42
|
* после <summary>. Переключатель шапки (.gr-nav-toggle) панели не имеет
|
|
@@ -89,6 +98,18 @@
|
|
|
89
98
|
return document.activeElement === node;
|
|
90
99
|
}
|
|
91
100
|
|
|
101
|
+
// Длительность --gr-transition у узла, мс: «0.2s ease» → 200, «150ms» → 150,
|
|
102
|
+
// пусто или 0s → 0. Одно чтение вычисленного стиля при закрытии.
|
|
103
|
+
function duration(node) {
|
|
104
|
+
var value = '';
|
|
105
|
+
|
|
106
|
+
try { value = getComputedStyle(node).getPropertyValue('--gr-transition'); } catch (e) { /* без CSSOM */ }
|
|
107
|
+
|
|
108
|
+
var m = /(\d*\.?\d+)(m?s)/.exec(value);
|
|
109
|
+
|
|
110
|
+
return m ? parseFloat(m[1]) * (m[2] === 's' ? 1000 : 1) : 0;
|
|
111
|
+
}
|
|
112
|
+
|
|
92
113
|
G.defineWidget('megamenu', { needs: ['media'] }, function (el, opts) {
|
|
93
114
|
var o = G.merge(DEFAULTS, opts);
|
|
94
115
|
var attrs = G.recorder();
|
|
@@ -159,6 +180,7 @@
|
|
|
159
180
|
setAttr(item.summary, 'aria-expanded', item.el.open ? 'true' : 'false');
|
|
160
181
|
|
|
161
182
|
listen(item.el, 'toggle', function () { sync(item); });
|
|
183
|
+
listen(item.summary, 'click', function (event) { onSummaryClick(event, item); });
|
|
162
184
|
}
|
|
163
185
|
|
|
164
186
|
function sync(item) {
|
|
@@ -166,10 +188,13 @@
|
|
|
166
188
|
|
|
167
189
|
setAttr(item.summary, 'aria-expanded', isOpen ? 'true' : 'false');
|
|
168
190
|
|
|
169
|
-
if (!isOpen)
|
|
191
|
+
if (!isOpen) {
|
|
192
|
+
settleClosing(item);
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
170
195
|
|
|
171
196
|
for (var i = 0; i < items.length; i++) {
|
|
172
|
-
if (items[i] !== item
|
|
197
|
+
if (items[i] !== item) close(items[i]);
|
|
173
198
|
}
|
|
174
199
|
|
|
175
200
|
load(item);
|
|
@@ -177,11 +202,69 @@
|
|
|
177
202
|
|
|
178
203
|
function open(item) {
|
|
179
204
|
cancelTimers();
|
|
180
|
-
if (
|
|
205
|
+
if (!item) return;
|
|
206
|
+
|
|
207
|
+
// Указатель вернулся на закрывающийся пункт — он остаётся открытым.
|
|
208
|
+
if (item.closing) {
|
|
209
|
+
settleClosing(item);
|
|
210
|
+
setAttr(item.el, 'data-gr-state', item.was);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
if (!item.el.open) item.el.open = true;
|
|
181
214
|
}
|
|
182
215
|
|
|
216
|
+
// --- Закрытие с состоянием closing ----------------------------------------
|
|
217
|
+
|
|
218
|
+
// open снимается не сразу: пункт получает data-gr-state="closing", и его
|
|
219
|
+
// панель уходит переходом темы; конец — transitionend/animationend самой
|
|
220
|
+
// панели (не потомка) или таймаут. Прежнее состояние пункта (ajax:
|
|
221
|
+
// ready | error) возвращается на место.
|
|
183
222
|
function close(item) {
|
|
184
|
-
if (item
|
|
223
|
+
if (!item || !item.el.open || item.closing) return;
|
|
224
|
+
|
|
225
|
+
var wait = duration(item.panel);
|
|
226
|
+
|
|
227
|
+
if (!wait) {
|
|
228
|
+
item.el.open = false;
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
item.was = item.el.getAttribute('data-gr-state');
|
|
233
|
+
item.onEnd = function (event) { if (event.target === item.panel) finishClosing(item); };
|
|
234
|
+
item.closing = setTimeout(function () { finishClosing(item); }, wait + 50);
|
|
235
|
+
|
|
236
|
+
item.panel.addEventListener('transitionend', item.onEnd);
|
|
237
|
+
item.panel.addEventListener('animationend', item.onEnd);
|
|
238
|
+
setAttr(item.el, 'data-gr-state', 'closing');
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
function settleClosing(item) {
|
|
242
|
+
if (!item.closing) return;
|
|
243
|
+
|
|
244
|
+
clearTimeout(item.closing);
|
|
245
|
+
item.closing = null;
|
|
246
|
+
item.panel.removeEventListener('transitionend', item.onEnd);
|
|
247
|
+
item.panel.removeEventListener('animationend', item.onEnd);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
function finishClosing(item) {
|
|
251
|
+
if (!item.closing) return;
|
|
252
|
+
|
|
253
|
+
settleClosing(item);
|
|
254
|
+
setAttr(item.el, 'data-gr-state', item.was);
|
|
255
|
+
item.el.open = false;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// Щелчок (и Enter/Space) по заголовку открытого пункта: платформа сняла бы
|
|
259
|
+
// open в тот же кадр — перехватывается и идёт через closing. Щелчок
|
|
260
|
+
// по закрывающемуся пункту — передумали: он остаётся открытым.
|
|
261
|
+
function onSummaryClick(event, item) {
|
|
262
|
+
if (!item.el.open) return;
|
|
263
|
+
|
|
264
|
+
event.preventDefault();
|
|
265
|
+
|
|
266
|
+
if (item.closing) open(item);
|
|
267
|
+
else close(item);
|
|
185
268
|
}
|
|
186
269
|
|
|
187
270
|
function closeAll() {
|
|
@@ -284,6 +367,7 @@
|
|
|
284
367
|
if (item === active || item === pending) {
|
|
285
368
|
if (closeTimer) clearTimeout(closeTimer);
|
|
286
369
|
closeTimer = null;
|
|
370
|
+
if (item.closing) open(item);
|
|
287
371
|
return;
|
|
288
372
|
}
|
|
289
373
|
|
|
@@ -456,6 +540,7 @@
|
|
|
456
540
|
|
|
457
541
|
function destroy() {
|
|
458
542
|
cancelTimers();
|
|
543
|
+
for (var i = 0; i < items.length; i++) finishClosing(items[i]);
|
|
459
544
|
if (unmedia) unmedia();
|
|
460
545
|
events.removeAll();
|
|
461
546
|
attrs.restore();
|