@@ -93,6 +93,153 @@ class ViewportSizes extends BaseComponent {
93
93
}
94
94
}
95
95
96
+ /**
97
+ * Get a random number between minViewportWidth and maxViewportWidth
98
+ */
99
+ getRangeRandomNumber ( ) {
100
+ return getRandom (
101
+ minViewportWidth ,
102
+ // Do not evaluate a number higher than the clientWidth of the Iframe
103
+ // to prevent having max size multiple times
104
+ maxViewportWidth > this . iframe . clientWidth
105
+ ? this . iframe . clientWidth
106
+ : maxViewportWidth
107
+ ) ;
108
+ }
109
+
110
+ /**
111
+ * Start the disco mode, which means in a specific interval resize
112
+ * the iframe random between minViewportWidth and maxViewportWidth
113
+ */
114
+ startDisco ( ) {
115
+ this . discoMode = true ;
116
+ this . discoId = setInterval ( this . disco . bind ( this ) , 1000 ) ;
117
+ }
118
+
119
+ /**
120
+ * Stop the disco mode
121
+ */
122
+ killDisco ( ) {
123
+ this . discoMode = false ;
124
+ clearInterval ( this . discoId ) ;
125
+ this . discoID = null ;
126
+ }
127
+
128
+ /**
129
+ * Action to resize the Iframe in disco mode
130
+ */
131
+ disco ( ) {
132
+ this . iframe . sizeiframe ( this . getRangeRandomNumber ( ) , true ) ;
133
+ }
134
+
135
+ /**
136
+ * Start the Hay! mode, which means the iframe is growing slowly
137
+ * from minViewportWidth to maxViewportWidth
138
+ */
139
+ startHay ( ) {
140
+ this . hayMode = true ;
141
+ this . hayId = setInterval ( this . hay . bind ( this ) , 100 ) ;
142
+ }
143
+
144
+ /**
145
+ * Stop the Hay! Mode
146
+ */
147
+ killHay ( ) {
148
+ this . hayMode = false ;
149
+ clearInterval ( this . hayId ) ;
150
+ this . hayId = null ;
151
+ }
152
+
153
+ /**
154
+ * Action to resize the Iframe in Hay! mode
155
+ */
156
+ hay ( ) {
157
+ this . iframe . sizeiframe ( store . getState ( ) . app . viewportPx + 1 , true ) ;
158
+ }
159
+
160
+ /**
161
+ * Litte workaround for Firefox Bug.
162
+ *
163
+ * On QWERTZ keyboards the e.altKey and e.ctrlKey will
164
+ * not be set if you click on a key that has a specific
165
+ * secondary or third char at ALT + ...
166
+ *
167
+ * @param {KeyboardEvent } e the keyevent
168
+ */
169
+ handleKeyDownEvent ( e ) {
170
+ if ( e . key === 'Control' ) {
171
+ this . controlIsPressed = true ;
172
+ }
173
+ if ( e . key === 'Alt' ) {
174
+ this . altIsPressed = true ;
175
+ }
176
+ }
177
+
178
+ /**
179
+ * https://patternlab.io/docs/advanced-keyboard-shortcuts.html
180
+ *
181
+ * Why use these specific key combinations?
182
+ * Works on QUERTZ, QUERTY and AZERTY keyboard and they are no
183
+ * reserved browser functionality key combinations.
184
+ *
185
+ * QUERTY https://en.wikipedia.org/wiki/QWERTY
186
+ * QUERTZ https://en.wikipedia.org/wiki/QWERTZ
187
+ * AZERTY https://en.wikipedia.org/wiki/AZERTY
188
+ *
189
+ * Chromium
190
+ * https://support.google.com/chrome/answer/157179?hl=en
191
+ *
192
+ * Firefox
193
+ * https://support.mozilla.org/en-US/kb/keyboard-shortcuts-perform-firefox-tasks-quickly
194
+ *
195
+ * @param {KeyboardEvent } e the keyevent
196
+
197
+ */
198
+ handleKeyCombination ( e ) {
199
+ const ctrlKey = this . controlIsPressed ;
200
+ const altKey = this . altIsPressed ;
201
+
202
+ if ( ctrlKey && altKey && ( e . code === 'Digit0' || e . code === 'Numpad0' ) ) {
203
+ this . resizeViewport ( this . sizes . ZERO ) ;
204
+ } else if ( ctrlKey && altKey && e . code === 'KeyS' ) {
205
+ this . resizeViewport ( this . sizes . SMALL ) ;
206
+ } else if ( ctrlKey && altKey && e . code === 'KeyM' ) {
207
+ this . resizeViewport ( this . sizes . MEDIUM ) ;
208
+ } else if ( ctrlKey && altKey && e . code === 'KeyL' ) {
209
+ this . resizeViewport ( this . sizes . LARGE ) ;
210
+ } else if ( ctrlKey && altKey && e . code === 'KeyF' ) {
211
+ this . resizeViewport ( this . sizes . FULL ) ;
212
+ } else if ( ctrlKey && altKey && e . code === 'KeyR' ) {
213
+ this . resizeViewport ( this . sizes . RANDOM ) ;
214
+ } else if ( ctrlKey && altKey && e . code === 'KeyD' ) {
215
+ this . resizeViewport ( this . sizes . DISCO ) ;
216
+ } else if ( ctrlKey && altKey && e . code === 'KeyH' ) {
217
+ this . resizeViewport ( this . sizes . HAY ) ;
218
+ }
219
+
220
+ if ( e . key === 'Control' ) {
221
+ this . controlIsPressed = false ;
222
+ }
223
+ if ( e . key === 'Alt' ) {
224
+ this . altIsPressed = false ;
225
+ }
226
+ }
227
+
228
+ /**
229
+ * Interpret and handle the received message input
230
+ *
231
+ * @param {MessageEvent } e A message received by a target object.
232
+ */
233
+ receiveIframeMessage ( e ) {
234
+ const data = iframeMsgDataExtraction ( e ) ;
235
+
236
+ if ( data . event && data . event === 'patternLab.iframeKeyDownEvent' ) {
237
+ this . handleKeyDownEvent ( data ) ;
238
+ } else if ( data . event && data . event === 'patternLab.iframeKeyUpEvent' ) {
239
+ this . handleKeyCombination ( data ) ;
240
+ }
241
+ }
242
+
96
243
rendered ( ) {
97
244
this . iframe = document . querySelector ( 'pl-iframe' ) ;
98
245
this . iframeElem = document . querySelector ( 'pl-iframe iframe' ) ;
0 commit comments