PageSourceSearch

https://carolineangell.com/js/respond.js

js carolineangell.com collected 2026-09-27 08:20:58 UTC 9,748 bytes, 342 lines download raw bytes

1/*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas. Dual MIT/BSD license */
2/*! NOTE: If you're already including a window.matchMedia polyfill via Modernizr or otherwise, you don't need this part */
3
4window.matchMedia = window.matchMedia || (function( doc, undefined ) {
5
6  "use strict";
7
8  var bool,
9      docElem = doc.documentElement,
10      refNode = docElem.firstElementChild || docElem.firstChild,
11      // fakeBody required for <FF4 when executed in <head>
12      fakeBody = doc.createElement( "body" ),
13      div = doc.createElement( "div" );
14
15  div.id = "mq-test-1";
16  div.style.cssText = "position:absolute;top:-100em";
17  fakeBody.style.background = "none";
18  fakeBody.appendChild(div);
19
20  return function(q){
21
22    div.innerHTML = "&shy;<style media=\"" + q + "\"> #mq-test-1 { width: 42px; }</style>";
23
24    docElem.insertBefore( fakeBody, refNode );
25    bool = div.offsetWidth === 42;
26    docElem.removeChild( fakeBody );
27
28    return {
29      matches: bool,
30      media: q
31    };
32
33  };
34
35}( document ));
36
37
38
39
40
41/*! Respond.js v1.3.0: min/max-width media query polyfill. (c) Scott Jehl. MIT/GPLv2 Lic. j.mp/respondjs  */
42(function( win ){
43
44	"use strict";
45
46	//exposed namespace
47	var respond = {};
48	win.respond = respond;
49	
50	//define update even in native-mq-supporting browsers, to avoid errors
51	respond.update = function(){};
52	
53	//expose media query support flag for external use
54	respond.mediaQueriesSupported	= win.matchMedia && win.matchMedia( "only all" ).matches;
55	
56	//if media queries are supported, exit here
57	if( respond.mediaQueriesSupported ){
58		return;
59	}
60	
61	//define vars
62	var doc = win.document,
63		docElem = doc.documentElement,
64		mediastyles = [],
65		rules = [],
66		appendedEls = [],
67		parsedSheets = {},
68		resizeThrottle = 30,
69		head = doc.getElementsByTagName( "head" )[0] || docElem,
70		base = doc.getElementsByTagName( "base" )[0],
71		links = head.getElementsByTagName( "link" ),
72		requestQueue = [],
73		
74		//loop stylesheets, send text content to translate
75		ripCSS = function(){
76
77			for( var i = 0; i < links.length; i++ ){
78				var sheet = links[ i ],
79				href = sheet.href,
80				media = sheet.media,
81				isCSS = sheet.rel && sheet.rel.toLowerCase() === "stylesheet";
82
83				//only links plz and prevent re-parsing
84				if( !!href && isCSS && !parsedSheets[ href ] ){
85					// selectivizr exposes css through the rawCssText expando
86					if (sheet.styleSheet && sheet.styleSheet.rawCssText) {
87						translate( sheet.styleSheet.rawCssText, href, media );
88						parsedSheets[ href ] = true;
89					} else {
90						if( (!/^([a-zA-Z:]*\/\/)/.test( href ) && !base) ||
91							href.replace( RegExp.$1, "" ).split( "/" )[0] === win.location.host ){
92							requestQueue.push( {
93								href: href,
94								media: media
95							} );
96						}
97					}
98				}
99			}
100			makeRequests();
101		},
102		
103		//recurse through request queue, get css text
104		makeRequests	= function(){
105			if( requestQueue.length ){
106				var thisRequest = requestQueue.shift();
107				
108				ajax( thisRequest.href, function( styles ){
109					translate( styles, thisRequest.href, thisRequest.media );
110					parsedSheets[ thisRequest.href ] = true;
111
112					// by wrapping recursive function call in setTimeout 
113					// we prevent "Stack overflow" error in IE7
114					win.setTimeout(function(){ makeRequests(); },0);
115				} );
116			}
117		},
118		
119		//find media blocks in css text, convert to style blocks
120		translate = function( styles, href, media ){
121			var qs = styles.match(  /@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi ),
122				ql = qs && qs.length || 0;
123
124			//try to get CSS path
125			href = href.substring( 0, href.lastIndexOf( "/" ) );
126
127			var repUrls	= function( css ){
128					return css.replace( /(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g, "$1" + href + "$2$3" );
129				},
130				useMedia = !ql && media;
131
132			//if path exists, tack on trailing slash
133			if( href.length ){ href += "/"; }	
134				
135			//if no internal queries exist, but media attr does, use that	
136			//note: this currently lacks support for situations where a media attr is specified on a link AND
137				//its associated stylesheet has internal CSS media queries.
138				//In those cases, the media attribute will currently be ignored.
139			if( useMedia ){
140				ql = 1;
141			}
142
143			for( var i = 0; i < ql; i++ ){
144				var fullq, thisq, eachq, eql;
145
146				//media attr
147				if( useMedia ){
148					fullq = media;
149					rules.push( repUrls( styles ) );
150				}
151				//parse for styles
152				else{
153					fullq = qs[ i ].match( /@media *([^\{]+)\{([\S\s]+?)$/ ) && RegExp.$1;
154					rules.push( RegExp.$2 && repUrls( RegExp.$2 ) );
155				}
156				
157				eachq = fullq.split( "," );
158				eql	= eachq.length;
159					
160				for( var j = 0; j < eql; j++ ){
161					thisq = eachq[ j ];
162					mediastyles.push( { 
163						media : thisq.split( "(" )[ 0 ].match( /(only\s+)?([a-zA-Z]+)\s?/ ) && RegExp.$2 || "all",
164						rules : rules.length - 1,
165						hasquery : thisq.indexOf("(") > -1,
166						minw : thisq.match( /\(\s*min\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/ ) && parseFloat( RegExp.$1 ) + ( RegExp.$2 || "" ), 
167						maxw : thisq.match( /\(\s*max\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/ ) && parseFloat( RegExp.$1 ) + ( RegExp.$2 || "" )
168					} );
169				}	
170			}
171
172			applyMedia();
173		},
174        
175		lastCall,
176		
177		resizeDefer,
178		
179		// returns the value of 1em in pixels
180		getEmValue = function() {
181			var ret,
182				div = doc.createElement('div'),
183				body = doc.body,
184				fakeUsed = false;
185									
186			div.style.cssText = "position:absolute;font-size:1em;width:1em";
187					
188			if( !body ){
189				body = fakeUsed = doc.createElement( "body" );
190				body.style.background = "none";
191			}
192					
193			body.appendChild( div );
194								
195			docElem.insertBefore( body, docElem.firstChild );
196								
197			ret = div.offsetWidth;
198								
199			if( fakeUsed ){
200				docElem.removeChild( body );
201			}
202			else {
203				body.removeChild( div );
204			}
205			
206			//also update eminpx before returning
207			ret = eminpx = parseFloat(ret);
208								
209			return ret;
210		},
211		
212		//cached container for 1em value, populated the first time it's needed 
213		eminpx,
214		
215		//enable/disable styles
216		applyMedia = function( fromResize ){
217			var name = "clientWidth",
218				docElemProp = docElem[ name ],
219				currWidth = doc.compatMode === "CSS1Compat" && docElemProp || doc.body[ name ] || docElemProp,
220				styleBlocks	= {},
221				lastLink = links[ links.length-1 ],
222				now = (new Date()).getTime();
223
224			//throttle resize calls	
225			if( fromResize && lastCall && now - lastCall < resizeThrottle ){
226				win.clearTimeout( resizeDefer );
227				resizeDefer = win.setTimeout( applyMedia, resizeThrottle );
228				return;
229			}
230			else {
231				lastCall = now;
232			}
233										
234			for( var i in mediastyles ){
235				if( mediastyles.hasOwnProperty( i ) ){
236					var thisstyle = mediastyles[ i ],
237						min = thisstyle.minw,
238						max = thisstyle.maxw,
239						minnull = min === null,
240						maxnull = max === null,
241						em = "em";
242					
243					if( !!min ){
244						min = parseFloat( min ) * ( min.indexOf( em ) > -1 ? ( eminpx || getEmValue() ) : 1 );
245					}
246					if( !!max ){
247						max = parseFloat( max ) * ( max.indexOf( em ) > -1 ? ( eminpx || getEmValue() ) : 1 );
248					}
249					
250					// if there's no media query at all (the () part), or min or max is not null, and if either is present, they're true
251					if( !thisstyle.hasquery || ( !minnull || !maxnull ) && ( minnull || currWidth >= min ) && ( maxnull || currWidth <= max ) ){
252						if( !styleBlocks[ thisstyle.media ] ){
253							styleBlocks[ thisstyle.media ] = [];
254						}
255						styleBlocks[ thisstyle.media ].push( rules[ thisstyle.rules ] );
256					}
257				}
258			}
259			
260			//remove any existing respond style element(s)
261			for( var j in appendedEls ){
262				if( appendedEls.hasOwnProperty( j ) ){
263					if( appendedEls[ j ] && appendedEls[ j ].parentNode === head ){
264						head.removeChild( appendedEls[ j ] );
265					}
266				}
267			}
268			
269			//inject active styles, grouped by media type
270			for( var k in styleBlocks ){
271				if( styleBlocks.hasOwnProperty( k ) ){
272					var ss = doc.createElement( "style" ),
273						css = styleBlocks[ k ].join( "\n" );
274					
275					ss.type = "text/css";	
276					ss.media = k;
277					
278					//originally, ss was appended to a documentFragment and sheets were appended in bulk.
279					//this caused crashes in IE in a number of circumstances, such as when the HTML element had a bg image set, so appending beforehand seems best. Thanks to @dvelyk for the initial research on this one!
280					head.insertBefore( ss, lastLink.nextSibling );
281					
282					if ( ss.styleSheet ){ 
283						ss.styleSheet.cssText = css;
284					}
285					else {
286						ss.appendChild( doc.createTextNode( css ) );
287					}
288
289					//push to appendedEls to track for later removal
290					appendedEls.push( ss );
291				}
292			}
293		},
294		//tweaked Ajax functions from Quirksmode
295		ajax = function( url, callback ) {
296			var req = xmlHttp();
297			if (!req){
298				return;
299			}	
300			req.open( "GET", url, true );
301			req.onreadystatechange = function () {
302				if ( req.readyState !== 4 || req.status !== 200 && req.status !== 304 ){
303					return;
304				}
305				callback( req.responseText );
306			};
307			if ( req.readyState === 4 ){
308				return;
309			}
310			req.send( null );
311		},
312		//define ajax obj 
313		xmlHttp = (function() {
314			var xmlhttpmethod = false;	
315			try {
316				xmlhttpmethod = new win.XMLHttpRequest();
317			}
318			catch( e ){
319				xmlhttpmethod = new win.ActiveXObject( "Microsoft.XMLHTTP" );
320			}
321			return function(){
322				return xmlhttpmethod;
323			};
324		})();
325	
326	//translate CSS
327	ripCSS();
328	
329	//expose update for re-running respond later on
330	respond.update = ripCSS;
331	
332	//adjust on resize
333	function callMedia(){
334		applyMedia( true );
335	}
336	if( win.addEventListener ){
337		win.addEventListener( "resize", callMedia, false );
338	}
339	else if( win.attachEvent ){
340		win.attachEvent( "onresize", callMedia );
341	}
342})(this);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.