griffincss-ui 0.16.0 → 0.19.0
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.js +1 -1
- package/dist/griffincss-ui.js.map +1 -1
- package/package.json +3 -3
- package/src/griffincss-ui.js +126 -102
package/dist/griffincss-ui.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
/*! Griffincss UI | MIT | https://gitverse.ru/BarneyScott/GriffinCSS */
|
|
2
|
-
|
|
2
|
+
(()=>{"use strict";var t=(()=>{var t="data-gr-dismiss",e=["top-start","top-end","bottom-start","bottom-end"],r=["info","success","warning","danger"],n="data-gr-tabs",o=!1,i=null;function a(t){i=t.target}var u={};function s(t,e,r){u[t]||(u[t]=[]),u[t].push({selector:e,handler:r})}function l(t){for(var e=u[t.type]||[],r=0;r<e.length;r++){var n=c(t.target,e[r].selector);if(n&&!0===e[r].handler(t,n))return}}function c(t,e){if(!t)return null;if("function"==typeof t.closest)return t.closest(e);for(var r=t;r;){if("function"==typeof r.matches&&r.matches(e))return r;r=r.parentNode}return null}function f(t){"undefined"!=typeof console&&console.warn&&console.warn("Griffincss UI: "+t)}function d(t,e){var r=document.createElement(t);return e&&e.split(" ").forEach(t=>{r.classList.add(t)}),r}function g(t,e,r){return-1===t.indexOf(e)?r:e}function v(t,e,r){try{(e&&"function"==typeof e.dispatchEvent?e:document).dispatchEvent(new CustomEvent(t,{detail:r,bubbles:!0}))}catch(t){}}function b(t){return!!t&&(t.classList&&t.classList.contains("gr-toast")?(h(t),!0):("function"==typeof t.remove&&t.remove(),!0))}function p(t,e){t.grToastRest=e,t.grToastFrom=y(),t.grToastTimer=setTimeout(()=>{h(t)},e)}function m(t){t.grToastTimer&&(clearTimeout(t.grToastTimer),t.grToastTimer=null)}function y(){return"undefined"!=typeof Date&&Date.now?Date.now():0}function h(t){t.grToastLeaving||(t.grToastLeaving=!0,m(t),t.classList&&t.classList.add("gr-toast-leaving"),setTimeout(()=>{"function"==typeof t.remove&&t.remove()},300))}function A(t,e){(t=>{t&&!t.grToastLeaving&&t.grToastTimer&&(m(t),t.grToastRest=Math.max(0,t.grToastRest-(y()-t.grToastFrom)))})(e)}function T(t,e){((t,e)=>{for(var r=e;r;){if(r===t)return!0;r=r.parentNode}return!1})(e,t.relatedTarget)||(t=>{!t||t.grToastLeaving||t.grToastTimer||t.grToastRest&&p(t,t.grToastRest)})(e)}var w=0;function L(t){for(var e=(t||document).querySelectorAll("["+n+"]"),r=0;r<e.length;r++)C(e[r]);return G}function C(t){var e=t.querySelectorAll(".gr-tab");if(e.length){var r=t.querySelectorAll(".gr-tablist");r.length&&r[0].setAttribute("role","tablist");for(var n=0,o=0;o<e.length;o++){var i=e[o],a=S(i);i.setAttribute("role","tab"),i.getAttribute("id")||i.setAttribute("id","gr-tab-"+ ++w),a&&(i.setAttribute("aria-controls",a.getAttribute("id")),a.setAttribute("role","tabpanel"),a.setAttribute("aria-labelledby",i.getAttribute("id")),a.setAttribute("tabindex","0")),(i.hasAttribute("aria-current")||"true"===i.getAttribute("aria-selected"))&&(n=o)}x(e,n,!1,!0)}}function S(t){var e=t.getAttribute("href"),r=t.getAttribute("aria-controls");return!r&&e&&"#"===e.charAt(0)&&(r=e.slice(1)),r?document.getElementById(r):null}function x(t,e,r,n){for(var o=0;o<t.length;o++){var i=t[o],a=o===e,u=S(i);i.setAttribute("aria-selected",a?"true":"false"),i.setAttribute("tabindex",a?"0":"-1"),i.removeAttribute("aria-current"),u&&(a?u.removeAttribute("hidden"):u.setAttribute("hidden",""))}r&&"function"==typeof t[e].focus&&t[e].focus(),n||v("griffincss:tabchange",t[e],{index:e,tab:t[e],panel:S(t[e])})}function D(t){return"true"===t.getAttribute("aria-disabled")||t.hasAttribute("disabled")}function E(t,e,r){for(var n=e,o=0;o<t.length;o++)if(!D(t[n=(n+r+t.length)%t.length]))return n;return e}function q(t,e){return E(t,e>0?-1:t.length,e)}function R(t,e){return Array.prototype.indexOf.call(t,e)}function k(){return o||(o=!0,O("addEventListener")),G}function O(t){for(var e in document[t]("pointerdown",a,!0),u)Object.prototype.hasOwnProperty.call(u,e)&&document[t](e,l)}s("click","["+t+"]",(e,r)=>{var n=r.getAttribute(t),o=n?"function"==typeof document.querySelector?document.querySelector(n):null:c(r,".gr-toast,.gr-alert,.gr-tag");return o?(b(o),!0):(f("крестику нечего закрывать: ни цели в data-gr-dismiss, ни сообщения вокруг"),!0)}),s("click",".gr-tab",(t,e)=>{var r=c(e,"["+n+"]");if(!r)return!1;if(D(e))return"function"==typeof t.preventDefault&&t.preventDefault(),!0;var o=r.querySelectorAll(".gr-tab"),i=R(o,e);return-1!==i&&("function"==typeof t.preventDefault&&t.preventDefault(),x(o,i,!1),!0)}),s("click","dialog[data-gr-overlay-close]",(t,e)=>!(t.target!==e||"function"!=typeof e.close||null!==i&&i!==e||!((t,e)=>{if("function"!=typeof t.getBoundingClientRect)return!1;var r=t.getBoundingClientRect();return!(!r||!r.width&&!r.height||"number"!=typeof e.clientX||"number"!=typeof e.clientY||0===e.clientX&&0===e.clientY||!(e.clientX<r.left||e.clientX>r.right||e.clientY<r.top||e.clientY>r.bottom))})(e,t)||(e.close("overlay"),0))),s("keydown",".gr-tab",(t,e)=>{var r=c(e,"["+n+"]");if(!r)return!1;var o=r.querySelectorAll(".gr-tab"),i=R(o,e);if(-1===i)return!1;var a=i,u=t.key;if("ArrowRight"===u||"ArrowDown"===u)a=E(o,i,1);else if("ArrowLeft"===u||"ArrowUp"===u)a=E(o,i,-1);else if("Home"===u)a=q(o,1);else{if("End"!==u)return!1;a=q(o,-1)}return"function"==typeof t.preventDefault&&t.preventDefault(),x(o,a,!0),!0}),s("pointerover",".gr-toast",A),s("focusin",".gr-toast",A),s("pointerout",".gr-toast",T),s("focusout",".gr-toast",T);var G={start:k,destroy:()=>o?(o=!1,i=null,O("removeEventListener"),G):G,toast:(n,o)=>{var i=g(r,(o=o||{}).status,""),a=g(e,o.position,"bottom-end"),u=void 0===o.assertive?"danger"===i:!!o.assertive;i&&!o.title&&f('тост со статусом "'+i+'" без title: статус остался одним цветом, а он не переживает чёрно-белую печать и дальтонизм');var s=((e,r,n)=>{var o=d("div",n?"gr-toast gr-toast-"+n:"gr-toast");if(r.icon){var i=d("span","gr-toast-icon");i.setAttribute("aria-hidden","true"),i.textContent=r.icon,o.appendChild(i)}var a=d("div","gr-toast-body");if(r.title){var u=d("strong","gr-toast-title");u.textContent=r.title,a.appendChild(u)}var s=d("span");if(s.textContent=null==e?"":String(e),a.appendChild(s),o.appendChild(a),!1!==r.dismissible){var l=d("button","gr-btn gr-btn-icon gr-btn-ghost gr-btn-sm");l.setAttribute("type","button"),l.setAttribute(t,""),l.setAttribute("aria-label",r.closeLabel||"Закрыть"),l.textContent="×",o.appendChild(l)}return o})(n,o,i);((t,e)=>{for(var r=e?"assertive":"polite",n="gr-toast-region-"+t,o=document.querySelectorAll(".gr-toast-region"),i=0;i<o.length;i++){var a=o[i];if(a.classList.contains(n)&&a.getAttribute("aria-live")===r)return a}var u=d("div","gr-toast-region "+n);return u.setAttribute("aria-live",r),u.setAttribute("role",e?"alert":"status"),document.body.appendChild(u),u})(a,u).appendChild(s);var l=void 0===o.timeout?5e3:Number(o.timeout);return l>0&&p(s,l),v("griffincss:toast",s,{node:s,status:i||null,position:a}),s},dismiss:b,tabs:L,version:"0.19.0",_autoStart:()=>{try{var t=document.currentScript;if(t&&"false"===t.getAttribute("data-auto"))return}catch(t){}"loading"!==document.readyState?(k(),L()):document.addEventListener("DOMContentLoaded",()=>{k(),L()})}};return G})();"object"==typeof module&&module.exports&&(module.exports=t),"undefined"!=typeof window&&"undefined"!=typeof document&&(window.Griffincss||(window.Griffincss={}),window.Griffincss.ui=t,t._autoStart())})();
|
|
3
3
|
//# sourceMappingURL=griffincss-ui.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["api","DISMISS_ATTR","TOAST_POSITIONS","TOAST_STATUSES","TABS_ATTR","started","pressed","onPointerDown","event","target","
|
|
1
|
+
{"version":3,"names":["api","DISMISS_ATTR","TOAST_POSITIONS","TOAST_STATUSES","TABS_ATTR","started","pressed","onPointerDown","event","target","registry","register","type","selector","handler","push","dispatch","entries","i","length","node","closest","current","matches","parentNode","warn","message","console","element","tag","className","document","createElement","split","forEach","name","classList","add","oneOf","list","value","fallback","indexOf","emitEvent","detail","dispatchEvent","CustomEvent","bubbles","e","dismiss","contains","leave","remove","startTimer","rest","grToastRest","grToastFrom","now","grToastTimer","setTimeout","stopTimer","clearTimeout","Date","grToastLeaving","onToastEnter","Math","max","pauseToast","onToastLeave","root","relatedTarget","resumeToast","tabsSeq","initTabs","groups","querySelectorAll","initGroup","publicApi","group","tabs","lists","setAttribute","selected","tab","panel","panelOf","getAttribute","hasAttribute","select","href","id","charAt","slice","getElementById","index","focus","silent","on","removeAttribute","disabled","step","from","delta","edge","indexOfNode","Array","prototype","call","start","listen","method","Object","hasOwnProperty","trigger","querySelector","preventDefault","dialog","close","getBoundingClientRect","rect","width","height","clientX","clientY","left","right","top","bottom","outsideBox","next","key","destroy","toast","text","options","status","position","urgent","undefined","assertive","title","icon","textContent","appendChild","body","line","String","dismissible","closeLabel","buildToast","live","wanted","existing","region","created","ensureRegion","timeout","Number","version","_autoStart","script","currentScript","readyState","addEventListener","factory","module","exports","window","Griffincss","ui"],"sources":["src/griffincss-ui.js"],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "griffincss-ui",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.19.0",
|
|
4
4
|
"description": "Griffincss UI — компоненты интерфейса: кнопки, поля, карточки, таблицы, статусы; на токенах ядра, с обеими темами и режимом для слабовидящих",
|
|
5
5
|
"homepage": "https://gitverse.ru/BarneyScott/GriffinCSS",
|
|
6
6
|
"repository": {
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"src/"
|
|
32
32
|
],
|
|
33
33
|
"peerDependencies": {
|
|
34
|
-
"griffincss-core": "^0.
|
|
34
|
+
"griffincss-core": "^0.19.0"
|
|
35
35
|
},
|
|
36
36
|
"keywords": [
|
|
37
37
|
"css",
|
|
@@ -48,6 +48,6 @@
|
|
|
48
48
|
"build": "npm run build:css && npm run build:scoped && npm run build:js",
|
|
49
49
|
"build:css": "sass scss/griffincss-ui.scss dist/griffincss-ui.css --load-path=../../node_modules --style=compressed --no-source-map",
|
|
50
50
|
"build:scoped": "sass scss/griffincss-ui-scoped.scss dist/griffincss-ui-scoped.css --load-path=../../node_modules --style=compressed --no-source-map",
|
|
51
|
-
"build:js": "terser src/griffincss-ui.js -c passes=3 -m --comments false --format \"preamble='/*! Griffincss UI | MIT | https://gitverse.ru/BarneyScott/GriffinCSS */'\" --source-map \"url='griffincss-ui.js.map'\" -o dist/griffincss-ui.js"
|
|
51
|
+
"build:js": "terser src/griffincss-ui.js -c passes=3,ecma=2020,unsafe_arrows=true -m --ecma 2020 --comments false --format \"preamble='/*! Griffincss UI | MIT | https://gitverse.ru/BarneyScott/GriffinCSS */'\" --source-map \"url='griffincss-ui.js.map'\" -o dist/griffincss-ui.js"
|
|
52
52
|
}
|
|
53
53
|
}
|
package/src/griffincss-ui.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Griffincss UI — Runtime v0.
|
|
2
|
+
* Griffincss UI — Runtime v0.19.0
|
|
3
3
|
* Опциональный рантайм пакета компонентов. Делает ровно то, чего платформа
|
|
4
4
|
* не даёт вовсе; всё, что умеют <details>, <dialog> и Popover API, остаётся
|
|
5
5
|
* за ними. Без этого файла компоненты работают — просто без перечисленного.
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
})(function () {
|
|
51
51
|
'use strict';
|
|
52
52
|
|
|
53
|
-
var VERSION = '0.
|
|
53
|
+
var VERSION = '0.19.0';
|
|
54
54
|
|
|
55
55
|
var OVERLAY_ATTR = 'data-gr-overlay-close';
|
|
56
56
|
|
|
@@ -84,10 +84,6 @@
|
|
|
84
84
|
// начатое в окне и законченное за его краем, щелчком по подложке не является.
|
|
85
85
|
var pressed = null;
|
|
86
86
|
|
|
87
|
-
function isDialog(node) {
|
|
88
|
-
return !!node && node.tagName === 'DIALOG' && typeof node.close === 'function';
|
|
89
|
-
}
|
|
90
|
-
|
|
91
87
|
// Щелчок по подложке приходит на сам <dialog>: подложка — его псевдоэлемент,
|
|
92
88
|
// собственной цели у неё нет. Отличить её от полей окна можно только
|
|
93
89
|
// по координатам.
|
|
@@ -118,27 +114,46 @@
|
|
|
118
114
|
pressed = event.target;
|
|
119
115
|
}
|
|
120
116
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
117
|
+
// Щелчок по подложке: обе половины щелчка пришлись на сам <dialog>
|
|
118
|
+
// и легли вне его прямоугольника. closest здесь недостаточен — щелчок
|
|
119
|
+
// по содержимому окна тоже нашёл бы диалог, поэтому цель события
|
|
120
|
+
// сверяется с найденным узлом напрямую. Что это <dialog>, гарантирует
|
|
121
|
+
// селектор регистрации; проверить остаётся только наличие close().
|
|
122
|
+
function onOverlayClick(event, dialog) {
|
|
123
|
+
if (event.target !== dialog) return false;
|
|
124
|
+
if (typeof dialog.close !== 'function') return false;
|
|
125
|
+
if (pressed !== null && pressed !== dialog) return false;
|
|
126
|
+
if (!outsideBox(dialog, event)) return false;
|
|
126
127
|
|
|
127
|
-
|
|
128
|
-
dismissFrom(trigger);
|
|
129
|
-
return;
|
|
130
|
-
}
|
|
128
|
+
dialog.close(OVERLAY_REASON);
|
|
131
129
|
|
|
132
|
-
|
|
130
|
+
return true;
|
|
131
|
+
}
|
|
133
132
|
|
|
134
|
-
|
|
133
|
+
// --- Реестр делегирования ---------------------------------------------------
|
|
135
134
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
135
|
+
// Компонент объявляет {событие, селектор, обработчик}; диспетчер один
|
|
136
|
+
// на тип события. Обработчик получает (event, node) — node найден
|
|
137
|
+
// closest по селектору — и возвращает true, когда событие обработано
|
|
138
|
+
// и очередь дальше не идёт. Порядок регистрации значим: крестик внутри
|
|
139
|
+
// окна не должен считаться щелчком по подложке, а вкладка-ссылка
|
|
140
|
+
// не должна уводить страницу к якорю.
|
|
141
|
+
var registry = {}; // тип события → [{selector, handler}]
|
|
140
142
|
|
|
141
|
-
|
|
143
|
+
function register(type, selector, handler) {
|
|
144
|
+
if (!registry[type]) registry[type] = [];
|
|
145
|
+
|
|
146
|
+
registry[type].push({ selector: selector, handler: handler });
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function dispatch(event) {
|
|
150
|
+
var entries = registry[event.type] || [];
|
|
151
|
+
|
|
152
|
+
for (var i = 0; i < entries.length; i++) {
|
|
153
|
+
var node = closest(event.target, entries[i].selector);
|
|
154
|
+
|
|
155
|
+
if (node && entries[i].handler(event, node) === true) return;
|
|
156
|
+
}
|
|
142
157
|
}
|
|
143
158
|
|
|
144
159
|
// --- Общее ------------------------------------------------------------------
|
|
@@ -172,23 +187,36 @@
|
|
|
172
187
|
}
|
|
173
188
|
|
|
174
189
|
function warn(message) {
|
|
175
|
-
if (typeof console !== 'undefined' && console
|
|
176
|
-
console.warn('Griffincss UI: ' + message);
|
|
177
|
-
}
|
|
190
|
+
if (typeof console !== 'undefined' && console.warn) console.warn('Griffincss UI: ' + message);
|
|
178
191
|
}
|
|
179
192
|
|
|
180
193
|
function element(tag, className) {
|
|
181
194
|
var node = document.createElement(tag);
|
|
182
195
|
|
|
183
196
|
if (className) {
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
for (var i = 0; i < names.length; i++) node.classList.add(names[i]);
|
|
197
|
+
className.split(' ').forEach(function (name) { node.classList.add(name); });
|
|
187
198
|
}
|
|
188
199
|
|
|
189
200
|
return node;
|
|
190
201
|
}
|
|
191
202
|
|
|
203
|
+
// Значение из закрытого списка или дефолт: чужое значение не должно
|
|
204
|
+
// уехать в имя класса.
|
|
205
|
+
function oneOf(list, value, fallback) {
|
|
206
|
+
return list.indexOf(value) === -1 ? fallback : value;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// Событие компонента — по образцу griffincss:themechange у рантайма
|
|
210
|
+
// темы. Диспетчеризуется на самом узле со всплытием; если окружение
|
|
211
|
+
// не даёт dispatchEvent на узле, уходит с документа.
|
|
212
|
+
function emitEvent(name, node, detail) {
|
|
213
|
+
try {
|
|
214
|
+
var target = node && typeof node.dispatchEvent === 'function' ? node : document;
|
|
215
|
+
|
|
216
|
+
target.dispatchEvent(new CustomEvent(name, { detail: detail, bubbles: true }));
|
|
217
|
+
} catch (e) { /* окружение без CustomEvent */ }
|
|
218
|
+
}
|
|
219
|
+
|
|
192
220
|
// --- Закрытие крестиком -----------------------------------------------------
|
|
193
221
|
|
|
194
222
|
// Цель задаётся значением атрибута, если она не предок кнопки:
|
|
@@ -196,8 +224,10 @@
|
|
|
196
224
|
// <button data-gr-dismiss="#banner">×</button>
|
|
197
225
|
//
|
|
198
226
|
// Пустое значение — обычный случай: убрать ближайшее сообщение,
|
|
199
|
-
// внутри которого стоит сам крестик.
|
|
200
|
-
|
|
227
|
+
// внутри которого стоит сам крестик. Сигнатура — как у обработчика
|
|
228
|
+
// реестра: регистрируется напрямую, и щелчок по крестику обработан
|
|
229
|
+
// всегда, даже когда закрывать оказалось нечего.
|
|
230
|
+
function dismissFrom(event, trigger) {
|
|
201
231
|
var selector = trigger.getAttribute(DISMISS_ATTR);
|
|
202
232
|
var target = selector
|
|
203
233
|
? (typeof document.querySelector === 'function' ? document.querySelector(selector) : null)
|
|
@@ -205,10 +235,12 @@
|
|
|
205
235
|
|
|
206
236
|
if (!target) {
|
|
207
237
|
warn('крестику нечего закрывать: ни цели в data-gr-dismiss, ни сообщения вокруг');
|
|
208
|
-
return;
|
|
238
|
+
return true;
|
|
209
239
|
}
|
|
210
240
|
|
|
211
241
|
dismiss(target);
|
|
242
|
+
|
|
243
|
+
return true;
|
|
212
244
|
}
|
|
213
245
|
|
|
214
246
|
// Тост уходит движением — у него для этого есть класс и переход;
|
|
@@ -303,8 +335,8 @@
|
|
|
303
335
|
function toast(text, options) {
|
|
304
336
|
options = options || {};
|
|
305
337
|
|
|
306
|
-
var status =
|
|
307
|
-
var position =
|
|
338
|
+
var status = oneOf(TOAST_STATUSES, options.status, '');
|
|
339
|
+
var position = oneOf(TOAST_POSITIONS, options.position, 'bottom-end');
|
|
308
340
|
|
|
309
341
|
// Срочность по умолчанию выводится из статуса: ошибка перебивает
|
|
310
342
|
// текущее чтение, остальное ждёт своей очереди.
|
|
@@ -323,15 +355,9 @@
|
|
|
323
355
|
|
|
324
356
|
if (timeout > 0) startTimer(node, timeout);
|
|
325
357
|
|
|
326
|
-
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
function indexOf(list, value) {
|
|
330
|
-
for (var i = 0; i < list.length; i++) {
|
|
331
|
-
if (list[i] === value) return i;
|
|
332
|
-
}
|
|
358
|
+
emitEvent('griffincss:toast', node, { node: node, status: status || null, position: position });
|
|
333
359
|
|
|
334
|
-
return
|
|
360
|
+
return node;
|
|
335
361
|
}
|
|
336
362
|
|
|
337
363
|
// Таймер живёт на самом узле: тостов на экране бывает несколько,
|
|
@@ -384,31 +410,17 @@
|
|
|
384
410
|
}, TOAST_LEAVE);
|
|
385
411
|
}
|
|
386
412
|
|
|
387
|
-
// pointerover / pointerout, а не enter / leave
|
|
388
|
-
//
|
|
389
|
-
//
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
function onPointerOut(event) {
|
|
395
|
-
var node = closest(event.target, '.gr-toast');
|
|
396
|
-
|
|
397
|
-
if (!node || contains(node, event.relatedTarget)) return;
|
|
398
|
-
|
|
399
|
-
resumeToast(node);
|
|
413
|
+
// pointerover / pointerout и focusin / focusout, а не enter / leave и
|
|
414
|
+
// focus / blur: эти всплывают, и хватает одного слушателя на документ.
|
|
415
|
+
// Пара обработчиков одна на указатель и фокус — реестр вешает её на оба
|
|
416
|
+
// типа события. Переход между частями одного тоста — не уход:
|
|
417
|
+
// relatedTarget внутри того же узла.
|
|
418
|
+
function onToastEnter(event, node) {
|
|
419
|
+
pauseToast(node);
|
|
400
420
|
}
|
|
401
421
|
|
|
402
|
-
function
|
|
403
|
-
|
|
404
|
-
}
|
|
405
|
-
|
|
406
|
-
function onFocusOut(event) {
|
|
407
|
-
var node = closest(event.target, '.gr-toast');
|
|
408
|
-
|
|
409
|
-
if (!node || contains(node, event.relatedTarget)) return;
|
|
410
|
-
|
|
411
|
-
resumeToast(node);
|
|
422
|
+
function onToastLeave(event, node) {
|
|
423
|
+
if (!contains(node, event.relatedTarget)) resumeToast(node);
|
|
412
424
|
}
|
|
413
425
|
|
|
414
426
|
// --- Вкладки ----------------------------------------------------------------
|
|
@@ -465,7 +477,9 @@
|
|
|
465
477
|
}
|
|
466
478
|
}
|
|
467
479
|
|
|
468
|
-
|
|
480
|
+
// Тихий выбор: расстановка ролей при инициализации — не действие
|
|
481
|
+
// пользователя, события о ней не шлются.
|
|
482
|
+
select(tabs, selected, false, true);
|
|
469
483
|
}
|
|
470
484
|
|
|
471
485
|
// Панель — по href="#id" у ссылки или по aria-controls у кнопки.
|
|
@@ -479,7 +493,7 @@
|
|
|
479
493
|
return document.getElementById(id);
|
|
480
494
|
}
|
|
481
495
|
|
|
482
|
-
function select(tabs, index, focus) {
|
|
496
|
+
function select(tabs, index, focus, silent) {
|
|
483
497
|
for (var i = 0; i < tabs.length; i++) {
|
|
484
498
|
var tab = tabs[i];
|
|
485
499
|
var on = i === index;
|
|
@@ -500,6 +514,14 @@
|
|
|
500
514
|
}
|
|
501
515
|
|
|
502
516
|
if (focus && typeof tabs[index].focus === 'function') tabs[index].focus();
|
|
517
|
+
|
|
518
|
+
if (!silent) {
|
|
519
|
+
emitEvent('griffincss:tabchange', tabs[index], {
|
|
520
|
+
index: index,
|
|
521
|
+
tab: tabs[index],
|
|
522
|
+
panel: panelOf(tabs[index])
|
|
523
|
+
});
|
|
524
|
+
}
|
|
503
525
|
}
|
|
504
526
|
|
|
505
527
|
function disabled(tab) {
|
|
@@ -526,21 +548,17 @@
|
|
|
526
548
|
return step(tabs, index, delta);
|
|
527
549
|
}
|
|
528
550
|
|
|
529
|
-
function
|
|
530
|
-
var tab = closest(event.target, '.gr-tab');
|
|
531
|
-
|
|
532
|
-
if (!tab) return;
|
|
533
|
-
|
|
551
|
+
function onTabKeyDown(event, tab) {
|
|
534
552
|
var group = closest(tab, '[' + TABS_ATTR + ']');
|
|
535
553
|
|
|
536
|
-
if (!group) return;
|
|
554
|
+
if (!group) return false;
|
|
537
555
|
|
|
538
556
|
// Список читается заново: вкладки добавляют и убирают вместе
|
|
539
557
|
// с разметкой, и запомненный при инициализации массив устарел бы молча.
|
|
540
558
|
var tabs = group.querySelectorAll('.gr-tab');
|
|
541
559
|
var current = indexOfNode(tabs, tab);
|
|
542
560
|
|
|
543
|
-
if (current === -1) return;
|
|
561
|
+
if (current === -1) return false;
|
|
544
562
|
|
|
545
563
|
var next = current;
|
|
546
564
|
var key = event.key;
|
|
@@ -551,20 +569,18 @@
|
|
|
551
569
|
else if (key === 'ArrowLeft' || key === 'ArrowUp') next = step(tabs, current, -1);
|
|
552
570
|
else if (key === 'Home') next = edge(tabs, 1);
|
|
553
571
|
else if (key === 'End') next = edge(tabs, -1);
|
|
554
|
-
else return;
|
|
572
|
+
else return false;
|
|
555
573
|
|
|
556
574
|
if (typeof event.preventDefault === 'function') event.preventDefault();
|
|
557
575
|
|
|
558
576
|
select(tabs, next, true);
|
|
577
|
+
|
|
578
|
+
return true;
|
|
559
579
|
}
|
|
560
580
|
|
|
561
581
|
// Щелчок по вкладке-ссылке переключает панель, а не уводит страницу
|
|
562
582
|
// к якорю: прыжок сдвинул бы ряд вкладок за верхний край экрана.
|
|
563
|
-
function onTabClick(event) {
|
|
564
|
-
var tab = closest(event.target, '.gr-tab');
|
|
565
|
-
|
|
566
|
-
if (!tab) return false;
|
|
567
|
-
|
|
583
|
+
function onTabClick(event, tab) {
|
|
568
584
|
var group = closest(tab, '[' + TABS_ATTR + ']');
|
|
569
585
|
|
|
570
586
|
if (!group) return false;
|
|
@@ -584,12 +600,9 @@
|
|
|
584
600
|
return true;
|
|
585
601
|
}
|
|
586
602
|
|
|
603
|
+
// NodeList не имеет indexOf, но массивный метод работает по нему.
|
|
587
604
|
function indexOfNode(list, node) {
|
|
588
|
-
|
|
589
|
-
if (list[i] === node) return i;
|
|
590
|
-
}
|
|
591
|
-
|
|
592
|
-
return -1;
|
|
605
|
+
return Array.prototype.indexOf.call(list, node);
|
|
593
606
|
}
|
|
594
607
|
|
|
595
608
|
// Один делегированный обработчик на документ, а не по слушателю на окно:
|
|
@@ -599,17 +612,7 @@
|
|
|
599
612
|
if (started) return publicApi;
|
|
600
613
|
|
|
601
614
|
started = true;
|
|
602
|
-
|
|
603
|
-
document.addEventListener('click', onClick);
|
|
604
|
-
document.addEventListener('keydown', onKeyDown);
|
|
605
|
-
|
|
606
|
-
// pointerover / pointerout и focusin / focusout всплывают, в отличие
|
|
607
|
-
// от enter / leave и focus / blur: одного слушателя на документ хватает
|
|
608
|
-
// на все тосты сразу, включая ещё не созданные.
|
|
609
|
-
document.addEventListener('pointerover', onPointerOver);
|
|
610
|
-
document.addEventListener('pointerout', onPointerOut);
|
|
611
|
-
document.addEventListener('focusin', onFocusIn);
|
|
612
|
-
document.addEventListener('focusout', onFocusOut);
|
|
615
|
+
listen('addEventListener');
|
|
613
616
|
|
|
614
617
|
return publicApi;
|
|
615
618
|
}
|
|
@@ -619,17 +622,38 @@
|
|
|
619
622
|
|
|
620
623
|
started = false;
|
|
621
624
|
pressed = null;
|
|
622
|
-
|
|
623
|
-
document.removeEventListener('click', onClick);
|
|
624
|
-
document.removeEventListener('keydown', onKeyDown);
|
|
625
|
-
document.removeEventListener('pointerover', onPointerOver);
|
|
626
|
-
document.removeEventListener('pointerout', onPointerOut);
|
|
627
|
-
document.removeEventListener('focusin', onFocusIn);
|
|
628
|
-
document.removeEventListener('focusout', onFocusOut);
|
|
625
|
+
listen('removeEventListener');
|
|
629
626
|
|
|
630
627
|
return publicApi;
|
|
631
628
|
}
|
|
632
629
|
|
|
630
|
+
// Подписка и отписка — один список: диспетчер на каждый тип события
|
|
631
|
+
// из реестра плюс перехват нажатия для щелчка по подложке.
|
|
632
|
+
function listen(method) {
|
|
633
|
+
document[method]('pointerdown', onPointerDown, true);
|
|
634
|
+
|
|
635
|
+
for (var type in registry) {
|
|
636
|
+
if (Object.prototype.hasOwnProperty.call(registry, type)) {
|
|
637
|
+
document[method](type, dispatch);
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
// --- Регистрация компонентов ------------------------------------------------
|
|
643
|
+
|
|
644
|
+
// Порядок значим: крестик внутри окна — не щелчок по подложке,
|
|
645
|
+
// вкладка перехватывает щелчок раньше, чем он дойдёт до окна.
|
|
646
|
+
register('click', '[' + DISMISS_ATTR + ']', dismissFrom);
|
|
647
|
+
register('click', '.gr-tab', onTabClick);
|
|
648
|
+
register('click', 'dialog[' + OVERLAY_ATTR + ']', onOverlayClick);
|
|
649
|
+
|
|
650
|
+
register('keydown', '.gr-tab', onTabKeyDown);
|
|
651
|
+
|
|
652
|
+
register('pointerover', '.gr-toast', onToastEnter);
|
|
653
|
+
register('focusin', '.gr-toast', onToastEnter);
|
|
654
|
+
register('pointerout', '.gr-toast', onToastLeave);
|
|
655
|
+
register('focusout', '.gr-toast', onToastLeave);
|
|
656
|
+
|
|
633
657
|
// Автостарт: только в браузере и только если его не отключили атрибутом
|
|
634
658
|
// data-auto="false" на теге <script>.
|
|
635
659
|
function autoStart() {
|