OLD | NEW |
| (Empty) |
1 | |
2 | |
3 Polymer('core-drawer-panel', { | |
4 | |
5 /** | |
6 * Fired when the narrow layout changes. | |
7 * | |
8 * @event core-responsive-change | |
9 * @param {Object} detail | |
10 * @param {boolean} detail.narrow true if the panel is in narrow layout. | |
11 */ | |
12 | |
13 /** | |
14 * Fired when the selected panel changes. | |
15 * | |
16 * Listening for this event is an alternative to observing changes in the `s
elected` attribute. | |
17 * This event is fired both when a panel is selected and deselected. | |
18 * The `isSelected` detail property contains the selection state. | |
19 * | |
20 * @event core-select | |
21 * @param {Object} detail | |
22 * @param {boolean} detail.isSelected true for selection and false for desel
ection | |
23 * @param {Object} detail.item the panel that the event refers to | |
24 */ | |
25 | |
26 publish: { | |
27 | |
28 /** | |
29 * Width of the drawer panel. | |
30 * | |
31 * @attribute drawerWidth | |
32 * @type string | |
33 * @default '256px' | |
34 */ | |
35 drawerWidth: '256px', | |
36 | |
37 /** | |
38 * Max-width when the panel changes to narrow layout. | |
39 * | |
40 * @attribute responsiveWidth | |
41 * @type string | |
42 * @default '640px' | |
43 */ | |
44 responsiveWidth: '640px', | |
45 | |
46 /** | |
47 * The panel that is being selected. `drawer` for the drawer panel and | |
48 * `main` for the main panel. | |
49 * | |
50 * @attribute selected | |
51 * @type string | |
52 * @default null | |
53 */ | |
54 selected: {value: null, reflect: true}, | |
55 | |
56 /** | |
57 * The panel to be selected when `core-drawer-panel` changes to narrow | |
58 * layout. | |
59 * | |
60 * @attribute defaultSelected | |
61 * @type string | |
62 * @default 'main' | |
63 */ | |
64 defaultSelected: 'main', | |
65 | |
66 /** | |
67 * Returns true if the panel is in narrow layout. This is useful if you | |
68 * need to show/hide elements based on the layout. | |
69 * | |
70 * @attribute narrow | |
71 * @type boolean | |
72 * @default false | |
73 */ | |
74 narrow: {value: false, reflect: true}, | |
75 | |
76 /** | |
77 * If true, position the drawer to the right. | |
78 * | |
79 * @attribute rightDrawer | |
80 * @type boolean | |
81 * @default false | |
82 */ | |
83 rightDrawer: false, | |
84 | |
85 /** | |
86 * If true, swipe to open/close the drawer is disabled. | |
87 * | |
88 * @attribute disableSwipe | |
89 * @type boolean | |
90 * @default false | |
91 */ | |
92 disableSwipe: false, | |
93 | |
94 /** | |
95 * If true, ignore `responsiveWidth` setting and force the narrow layout. | |
96 * | |
97 * @attribute forceNarrow | |
98 * @type boolean | |
99 * @default false | |
100 */ | |
101 forceNarrow: false | |
102 }, | |
103 | |
104 eventDelegates: { | |
105 trackstart: 'trackStart', | |
106 trackx: 'trackx', | |
107 trackend: 'trackEnd', | |
108 down: 'downHandler', | |
109 up: 'upHandler', | |
110 tap: 'tapHandler' | |
111 }, | |
112 | |
113 // Whether the transition is enabled. | |
114 transition: false, | |
115 | |
116 // How many pixels on the side of the screen are sensitive to edge swipes an
d peek. | |
117 edgeSwipeSensitivity: 15, | |
118 | |
119 // Whether the drawer is peeking out from the edge. | |
120 peeking: false, | |
121 | |
122 // Whether the user is dragging the drawer interactively. | |
123 dragging: false, | |
124 | |
125 // Whether the browser has support for the transform CSS property. | |
126 hasTransform: true, | |
127 | |
128 // Whether the browser has support for the will-change CSS property. | |
129 hasWillChange: true, | |
130 | |
131 // The attribute on elements that should toggle the drawer on tap, also | |
132 // elements will automatically be hidden in wide layout. | |
133 toggleAttribute: 'core-drawer-toggle', | |
134 | |
135 created: function() { | |
136 this.hasTransform = 'transform' in this.style; | |
137 this.hasWillChange = 'willChange' in this.style; | |
138 }, | |
139 | |
140 domReady: function() { | |
141 // to avoid transition at the beginning e.g. page loads | |
142 // NOTE: domReady is already raf delayed and delaying another frame | |
143 // ensures a layout has occurred. | |
144 this.async(function() { | |
145 this.transition = true; | |
146 }); | |
147 }, | |
148 | |
149 /** | |
150 * Toggles the panel open and closed. | |
151 * | |
152 * @method togglePanel | |
153 */ | |
154 togglePanel: function() { | |
155 this.selected = this.isMainSelected() ? 'drawer' : 'main'; | |
156 }, | |
157 | |
158 /** | |
159 * Opens the drawer. | |
160 * | |
161 * @method openDrawer | |
162 */ | |
163 openDrawer: function() { | |
164 this.selected = 'drawer'; | |
165 }, | |
166 | |
167 /** | |
168 * Closes the drawer. | |
169 * | |
170 * @method closeDrawer | |
171 */ | |
172 closeDrawer: function() { | |
173 this.selected = 'main'; | |
174 }, | |
175 | |
176 queryMatchesChanged: function() { | |
177 this.narrow = this.queryMatches || this.forceNarrow; | |
178 if (this.narrow) { | |
179 this.selected = this.defaultSelected; | |
180 } | |
181 this.setAttribute('touch-action', this.swipeAllowed() ? 'pan-y' : ''); | |
182 this.fire('core-responsive-change', {narrow: this.narrow}); | |
183 }, | |
184 | |
185 forceNarrowChanged: function() { | |
186 this.queryMatchesChanged(); | |
187 }, | |
188 | |
189 swipeAllowed: function() { | |
190 return this.narrow && !this.disableSwipe; | |
191 }, | |
192 | |
193 isMainSelected: function() { | |
194 return this.selected === 'main'; | |
195 }, | |
196 | |
197 startEdgePeek: function() { | |
198 this.width = this.$.drawer.offsetWidth; | |
199 this.moveDrawer(this.translateXForDeltaX(this.rightDrawer ? | |
200 -this.edgeSwipeSensitivity : this.edgeSwipeSensitivity)); | |
201 this.peeking = true; | |
202 }, | |
203 | |
204 stopEdgePeak: function() { | |
205 if (this.peeking) { | |
206 this.peeking = false; | |
207 this.moveDrawer(null); | |
208 } | |
209 }, | |
210 | |
211 downHandler: function(e) { | |
212 if (!this.dragging && this.isMainSelected() && this.isEdgeTouch(e)) { | |
213 this.startEdgePeek(); | |
214 } | |
215 }, | |
216 | |
217 upHandler: function(e) { | |
218 this.stopEdgePeak(); | |
219 }, | |
220 | |
221 tapHandler: function(e) { | |
222 if (e.target && this.toggleAttribute && | |
223 e.target.hasAttribute(this.toggleAttribute)) { | |
224 this.togglePanel(); | |
225 } | |
226 }, | |
227 | |
228 isEdgeTouch: function(e) { | |
229 return this.swipeAllowed() && (this.rightDrawer ? | |
230 e.pageX >= this.offsetWidth - this.edgeSwipeSensitivity : | |
231 e.pageX <= this.edgeSwipeSensitivity); | |
232 }, | |
233 | |
234 trackStart : function(e) { | |
235 if (this.swipeAllowed()) { | |
236 this.dragging = true; | |
237 | |
238 if (this.isMainSelected()) { | |
239 this.dragging = this.peeking || this.isEdgeTouch(e); | |
240 } | |
241 | |
242 if (this.dragging) { | |
243 this.width = this.$.drawer.offsetWidth; | |
244 this.transition = false; | |
245 e.preventTap(); | |
246 } | |
247 } | |
248 }, | |
249 | |
250 translateXForDeltaX: function(deltaX) { | |
251 var isMain = this.isMainSelected(); | |
252 if (this.rightDrawer) { | |
253 return Math.max(0, isMain ? this.width + deltaX : deltaX); | |
254 } else { | |
255 return Math.min(0, isMain ? deltaX - this.width : deltaX); | |
256 } | |
257 }, | |
258 | |
259 trackx : function(e) { | |
260 if (this.dragging) { | |
261 if (this.peeking) { | |
262 if (Math.abs(e.dx) <= this.edgeSwipeSensitivity) { | |
263 return; // Ignore trackx until we move past the edge peek. | |
264 } | |
265 this.peeking = false; | |
266 } | |
267 this.moveDrawer(this.translateXForDeltaX(e.dx)); | |
268 } | |
269 }, | |
270 | |
271 trackEnd : function(e) { | |
272 if (this.dragging) { | |
273 this.dragging = false; | |
274 this.transition = true; | |
275 this.moveDrawer(null); | |
276 | |
277 if (this.rightDrawer) { | |
278 this.selected = e.xDirection > 0 ? 'main' : 'drawer'; | |
279 } else { | |
280 this.selected = e.xDirection > 0 ? 'drawer' : 'main'; | |
281 } | |
282 } | |
283 }, | |
284 | |
285 transformForTranslateX: function(translateX) { | |
286 if (translateX === null) { | |
287 return ''; | |
288 } | |
289 return this.hasWillChange ? 'translateX(' + translateX + 'px)' : | |
290 'translate3d(' + translateX + 'px, 0, 0)'; | |
291 }, | |
292 | |
293 moveDrawer: function(translateX) { | |
294 var s = this.$.drawer.style; | |
295 | |
296 if (this.hasTransform) { | |
297 s.transform = this.transformForTranslateX(translateX); | |
298 } else { | |
299 s.webkitTransform = this.transformForTranslateX(translateX); | |
300 } | |
301 } | |
302 | |
303 }); | |
304 | |
OLD | NEW |