UNPKG

16.1 kBJavaScriptView Raw
1"use strict";
2
3require("core-js/modules/es.symbol.js");
4
5require("core-js/modules/es.symbol.description.js");
6
7require("core-js/modules/es.symbol.iterator.js");
8
9require("core-js/modules/es.array.iterator.js");
10
11require("core-js/modules/es.string.iterator.js");
12
13require("core-js/modules/web.dom-collections.iterator.js");
14
15require("core-js/modules/es.array.slice.js");
16
17require("core-js/modules/es.function.name.js");
18
19require("core-js/modules/es.array.from.js");
20
21require("core-js/modules/es.promise.js");
22
23Object.defineProperty(exports, "__esModule", {
24 value: true
25});
26exports.isMacLike = exports.init = exports.defaultShortcuts = exports.controlOrMetaKey = void 0;
27exports.keys = keys;
28
29require("regenerator-runtime/runtime.js");
30
31require("core-js/modules/es.regexp.exec.js");
32
33require("core-js/modules/es.string.match.js");
34
35require("core-js/modules/es.object.keys.js");
36
37require("core-js/modules/es.object.freeze.js");
38
39require("core-js/modules/es.object.assign.js");
40
41require("core-js/modules/es.object.to-string.js");
42
43require("core-js/modules/web.dom-collections.for-each.js");
44
45require("core-js/modules/es.object.entries.js");
46
47require("core-js/modules/es.array.concat.js");
48
49require("core-js/modules/es.array.find.js");
50
51var _global = _interopRequireDefault(require("global"));
52
53var _coreEvents = require("@storybook/core-events");
54
55var _shortcut = require("../lib/shortcut");
56
57var _layout = require("./layout");
58
59function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
60
61function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
62
63function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
64
65function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
66
67function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
68
69function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
70
71function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
72
73function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
74
75function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
76
77function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
78
79var navigator = _global.default.navigator,
80 document = _global.default.document;
81
82var isMacLike = function isMacLike() {
83 return navigator && navigator.platform ? !!navigator.platform.match(/(Mac|iPhone|iPod|iPad)/i) : false;
84};
85
86exports.isMacLike = isMacLike;
87
88var controlOrMetaKey = function controlOrMetaKey() {
89 return isMacLike() ? 'meta' : 'control';
90};
91
92exports.controlOrMetaKey = controlOrMetaKey;
93
94function keys(o) {
95 return Object.keys(o);
96}
97
98var defaultShortcuts = Object.freeze({
99 fullScreen: ['F'],
100 togglePanel: ['A'],
101 panelPosition: ['D'],
102 toggleNav: ['S'],
103 toolbar: ['T'],
104 search: ['/'],
105 focusNav: ['1'],
106 focusIframe: ['2'],
107 focusPanel: ['3'],
108 prevComponent: ['alt', 'ArrowUp'],
109 nextComponent: ['alt', 'ArrowDown'],
110 prevStory: ['alt', 'ArrowLeft'],
111 nextStory: ['alt', 'ArrowRight'],
112 shortcutsPage: [controlOrMetaKey(), 'shift', ','],
113 aboutPage: [','],
114 escape: ['escape'],
115 // This one is not customizable
116 collapseAll: [controlOrMetaKey(), 'shift', 'ArrowUp'],
117 expandAll: [controlOrMetaKey(), 'shift', 'ArrowDown']
118});
119exports.defaultShortcuts = defaultShortcuts;
120var addonsShortcuts = {};
121
122function focusInInput(event) {
123 return /input|textarea/i.test(event.target.tagName) || event.target.getAttribute('contenteditable') !== null;
124}
125
126var init = function init(_ref) {
127 var store = _ref.store,
128 fullAPI = _ref.fullAPI;
129 var api = {
130 // Getting and setting shortcuts
131 getShortcutKeys: function getShortcutKeys() {
132 return store.getState().shortcuts;
133 },
134 getDefaultShortcuts: function getDefaultShortcuts() {
135 return Object.assign({}, defaultShortcuts, api.getAddonsShortcutDefaults());
136 },
137 getAddonsShortcuts: function getAddonsShortcuts() {
138 return addonsShortcuts;
139 },
140 getAddonsShortcutLabels: function getAddonsShortcutLabels() {
141 var labels = {};
142 Object.entries(api.getAddonsShortcuts()).forEach(function (_ref2) {
143 var _ref3 = _slicedToArray(_ref2, 2),
144 actionName = _ref3[0],
145 label = _ref3[1].label;
146
147 labels[actionName] = label;
148 });
149 return labels;
150 },
151 getAddonsShortcutDefaults: function getAddonsShortcutDefaults() {
152 var defaults = {};
153 Object.entries(api.getAddonsShortcuts()).forEach(function (_ref4) {
154 var _ref5 = _slicedToArray(_ref4, 2),
155 actionName = _ref5[0],
156 defaultShortcut = _ref5[1].defaultShortcut;
157
158 defaults[actionName] = defaultShortcut;
159 });
160 return defaults;
161 },
162 setShortcuts: function setShortcuts(shortcuts) {
163 return _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
164 return regeneratorRuntime.wrap(function _callee$(_context) {
165 while (1) {
166 switch (_context.prev = _context.next) {
167 case 0:
168 _context.next = 2;
169 return store.setState({
170 shortcuts: shortcuts
171 }, {
172 persistence: 'permanent'
173 });
174
175 case 2:
176 return _context.abrupt("return", shortcuts);
177
178 case 3:
179 case "end":
180 return _context.stop();
181 }
182 }
183 }, _callee);
184 }))();
185 },
186 restoreAllDefaultShortcuts: function restoreAllDefaultShortcuts() {
187 return _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {
188 return regeneratorRuntime.wrap(function _callee2$(_context2) {
189 while (1) {
190 switch (_context2.prev = _context2.next) {
191 case 0:
192 return _context2.abrupt("return", api.setShortcuts(api.getDefaultShortcuts()));
193
194 case 1:
195 case "end":
196 return _context2.stop();
197 }
198 }
199 }, _callee2);
200 }))();
201 },
202 setShortcut: function setShortcut(action, value) {
203 return _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() {
204 var shortcuts;
205 return regeneratorRuntime.wrap(function _callee3$(_context3) {
206 while (1) {
207 switch (_context3.prev = _context3.next) {
208 case 0:
209 shortcuts = api.getShortcutKeys();
210 _context3.next = 3;
211 return api.setShortcuts(Object.assign({}, shortcuts, _defineProperty({}, action, value)));
212
213 case 3:
214 return _context3.abrupt("return", value);
215
216 case 4:
217 case "end":
218 return _context3.stop();
219 }
220 }
221 }, _callee3);
222 }))();
223 },
224 setAddonShortcut: function setAddonShortcut(addon, shortcut) {
225 return _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee4() {
226 var shortcuts;
227 return regeneratorRuntime.wrap(function _callee4$(_context4) {
228 while (1) {
229 switch (_context4.prev = _context4.next) {
230 case 0:
231 shortcuts = api.getShortcutKeys();
232 _context4.next = 3;
233 return api.setShortcuts(Object.assign({}, shortcuts, _defineProperty({}, "".concat(addon, "-").concat(shortcut.actionName), shortcut.defaultShortcut)));
234
235 case 3:
236 addonsShortcuts["".concat(addon, "-").concat(shortcut.actionName)] = shortcut;
237 return _context4.abrupt("return", shortcut);
238
239 case 5:
240 case "end":
241 return _context4.stop();
242 }
243 }
244 }, _callee4);
245 }))();
246 },
247 restoreDefaultShortcut: function restoreDefaultShortcut(action) {
248 return _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee5() {
249 var defaultShortcut;
250 return regeneratorRuntime.wrap(function _callee5$(_context5) {
251 while (1) {
252 switch (_context5.prev = _context5.next) {
253 case 0:
254 defaultShortcut = api.getDefaultShortcuts()[action];
255 return _context5.abrupt("return", api.setShortcut(action, defaultShortcut));
256
257 case 2:
258 case "end":
259 return _context5.stop();
260 }
261 }
262 }, _callee5);
263 }))();
264 },
265 // Listening to shortcut events
266 handleKeydownEvent: function handleKeydownEvent(event) {
267 var shortcut = (0, _shortcut.eventToShortcut)(event);
268 var shortcuts = api.getShortcutKeys();
269 var actions = keys(shortcuts);
270 var matchedFeature = actions.find(function (feature) {
271 return (0, _shortcut.shortcutMatchesShortcut)(shortcut, shortcuts[feature]);
272 });
273
274 if (matchedFeature) {
275 // Event.prototype.preventDefault is missing when received from the MessageChannel.
276 if (event !== null && event !== void 0 && event.preventDefault) event.preventDefault();
277 api.handleShortcutFeature(matchedFeature);
278 }
279 },
280 // warning: event might not have a full prototype chain because it may originate from the channel
281 handleShortcutFeature: function handleShortcutFeature(feature) {
282 var _store$getState = store.getState(),
283 _store$getState$layou = _store$getState.layout,
284 isFullscreen = _store$getState$layou.isFullscreen,
285 showNav = _store$getState$layou.showNav,
286 showPanel = _store$getState$layou.showPanel,
287 enableShortcuts = _store$getState.ui.enableShortcuts;
288
289 if (!enableShortcuts) {
290 return;
291 }
292
293 switch (feature) {
294 case 'escape':
295 {
296 if (isFullscreen) {
297 fullAPI.toggleFullscreen();
298 } else if (!showNav) {
299 fullAPI.toggleNav();
300 }
301
302 break;
303 }
304
305 case 'focusNav':
306 {
307 if (isFullscreen) {
308 fullAPI.toggleFullscreen();
309 }
310
311 if (!showNav) {
312 fullAPI.toggleNav();
313 }
314
315 fullAPI.focusOnUIElement(_layout.focusableUIElements.storyListMenu);
316 break;
317 }
318
319 case 'search':
320 {
321 if (isFullscreen) {
322 fullAPI.toggleFullscreen();
323 }
324
325 if (!showNav) {
326 fullAPI.toggleNav();
327 }
328
329 setTimeout(function () {
330 fullAPI.focusOnUIElement(_layout.focusableUIElements.storySearchField, true);
331 }, 0);
332 break;
333 }
334
335 case 'focusIframe':
336 {
337 var element = document.getElementById('storybook-preview-iframe');
338
339 if (element) {
340 try {
341 // should be like a channel message and all that, but yolo for now
342 element.contentWindow.focus();
343 } catch (e) {//
344 }
345 }
346
347 break;
348 }
349
350 case 'focusPanel':
351 {
352 if (isFullscreen) {
353 fullAPI.toggleFullscreen();
354 }
355
356 if (!showPanel) {
357 fullAPI.togglePanel();
358 }
359
360 fullAPI.focusOnUIElement(_layout.focusableUIElements.storyPanelRoot);
361 break;
362 }
363
364 case 'nextStory':
365 {
366 fullAPI.jumpToStory(1);
367 break;
368 }
369
370 case 'prevStory':
371 {
372 fullAPI.jumpToStory(-1);
373 break;
374 }
375
376 case 'nextComponent':
377 {
378 fullAPI.jumpToComponent(1);
379 break;
380 }
381
382 case 'prevComponent':
383 {
384 fullAPI.jumpToComponent(-1);
385 break;
386 }
387
388 case 'fullScreen':
389 {
390 fullAPI.toggleFullscreen();
391 break;
392 }
393
394 case 'togglePanel':
395 {
396 if (isFullscreen) {
397 fullAPI.toggleFullscreen();
398 fullAPI.resetLayout();
399 }
400
401 fullAPI.togglePanel();
402 break;
403 }
404
405 case 'toggleNav':
406 {
407 if (isFullscreen) {
408 fullAPI.toggleFullscreen();
409 fullAPI.resetLayout();
410 }
411
412 fullAPI.toggleNav();
413 break;
414 }
415
416 case 'toolbar':
417 {
418 fullAPI.toggleToolbar();
419 break;
420 }
421
422 case 'panelPosition':
423 {
424 if (isFullscreen) {
425 fullAPI.toggleFullscreen();
426 }
427
428 if (!showPanel) {
429 fullAPI.togglePanel();
430 }
431
432 fullAPI.togglePanelPosition();
433 break;
434 }
435
436 case 'aboutPage':
437 {
438 fullAPI.navigate('/settings/about');
439 break;
440 }
441
442 case 'shortcutsPage':
443 {
444 fullAPI.navigate('/settings/shortcuts');
445 break;
446 }
447
448 case 'collapseAll':
449 {
450 fullAPI.collapseAll();
451 break;
452 }
453
454 case 'expandAll':
455 {
456 fullAPI.expandAll();
457 break;
458 }
459
460 default:
461 addonsShortcuts[feature].action();
462 break;
463 }
464 }
465 };
466
467 var _store$getState2 = store.getState(),
468 _store$getState2$shor = _store$getState2.shortcuts,
469 persistedShortcuts = _store$getState2$shor === void 0 ? defaultShortcuts : _store$getState2$shor;
470
471 var state = {
472 // Any saved shortcuts that are still in our set of defaults
473 shortcuts: keys(defaultShortcuts).reduce(function (acc, key) {
474 return Object.assign({}, acc, _defineProperty({}, key, persistedShortcuts[key] || defaultShortcuts[key]));
475 }, defaultShortcuts)
476 };
477
478 var initModule = function initModule() {
479 // Listen for keydown events in the manager
480 document.addEventListener('keydown', function (event) {
481 if (!focusInInput(event)) {
482 fullAPI.handleKeydownEvent(event);
483 }
484 }); // Also listen to keydown events sent over the channel
485
486 fullAPI.on(_coreEvents.PREVIEW_KEYDOWN, function (data) {
487 fullAPI.handleKeydownEvent(data.event);
488 });
489 };
490
491 return {
492 api: api,
493 state: state,
494 init: initModule
495 };
496};
497
498exports.init = init;
\No newline at end of file