"use strict"; (function (f) { if (typeof exports === "object" && typeof module !== "undefined") { module.exports = f(); } else if (typeof define === "function" && define.amd) { define([], f); } else { var g;if (typeof window !== "undefined") { g = window; } else if (typeof global !== "undefined") { g = global; } else if (typeof self !== "undefined") { g = self; } else { g = this; }g.GaiaHeader = f(); } })(function () { var define, module, exports;return (function e(t, n, r) { function s(o, u) { if (!n[o]) { if (!t[o]) { var a = typeof require == "function" && require;if (!u && a) return a(o, !0);if (i) return i(o, !0);var f = new Error("Cannot find module '" + o + "'");throw (f.code = "MODULE_NOT_FOUND", f); }var l = n[o] = { exports: {} };t[o][0].call(l.exports, function (e) { var n = t[o][1][e];return s(n ? n : e); }, l, l.exports, e, t, n, r); }return n[o].exports; }var i = typeof require == "function" && require;for (var o = 0; o < r.length; o++) s(r[o]);return s; })({ 1: [function (require, module, exports) { ;(function (define) { define(function (require, exports, module) { 'use strict'; /** * Simple logger. * * @return {Function} */ var debug = 0 ? console.log.bind(console) : function () {}; /** * Global canvas cache. * * @type {Object} */ var cache = {}; /** * Default min/max font-size. * * @type {Number} */ var MIN = 16; var MAX = 24; /** * The number of pixels to subtract from * the given `config.space` to ensure * HTML text doesn't overflow container. * * Ideally we would use 1px, but in some * cases italicised text in canvas is ~2px * longer than the same text in HTML. * * http://bugzil.la/1126391 * * @type {Number} */ var BUFFER = 3; /** * Get the font-size that closest fits * the given space with the given font. * * Config: * * - {String} `text` The text string * - {String} `font` Font shorthand string * - {Number} `space` Width (px) to fit the text into * - {Number} `min` Min font-size (px) (optional) * - {Number} `max` Max font-size (px) (optional) * * @param {Object} config * @return {Object} {fontSize,overflowing,textWidth} */ module.exports = function (config) { debug('font fit', config); var space = config.space - BUFFER; var min = config.min || MIN; var max = config.max || MAX; var text = trim(config.text); var fontSize = max; var textWidth; var font; do { font = config.font.replace(/\d+px/, fontSize + 'px'); textWidth = getTextWidth(text, font); } while (textWidth > space && fontSize !== min && fontSize--); return { textWidth: textWidth, fontSize: fontSize, overflowing: textWidth > space }; }; /** * Get the width of the given text * with the given font style. * * @param {String} text * @param {String} font (CSS shorthand) * @return {Number} (px) */ function getTextWidth(text, font) { var ctx = getCanvasContext(font); var width = ctx.measureText(text).width; debug('got text width', width); return width; } /** * Get a canvas context configured * to the given font style. * * @param {String} font * @return {CanvasRenderingContext2D} */ function getCanvasContext(font) { debug('get canvas context', font); var cached = cache[font]; if (cached) { return cached; } var canvas = document.createElement('canvas'); canvas.setAttribute('moz-opaque', 'true'); canvas.setAttribute('width', '1px'); canvas.setAttribute('height', '1px'); debug('created canvas', canvas); var ctx = canvas.getContext('2d', { willReadFrequently: true }); ctx.font = font; return cache[font] = ctx; } /** * Trim leading, trailing * and excess whitespace. * * @param {String} text * @return {String} */ function trim(text) { return text.replace(/\s+/g, ' ').trim(); } }); })(typeof define == 'function' && define.amd ? define : (function (n, w) { 'use strict';return typeof module == 'object' ? function (c) { c(require, exports, module); } : function (c) { var m = { exports: {} };c(function (n) { return w[n]; }, m.exports, m);w[n] = m.exports; }; })('font-fit', this)); }, {}], 2: [function (require, module, exports) { /* globals define */ ;(function (define) { 'use strict';define(function (require, exports, module) { /** * Locals */ var textContent = Object.getOwnPropertyDescriptor(Node.prototype, 'textContent'); var innerHTML = Object.getOwnPropertyDescriptor(Element.prototype, 'innerHTML'); var removeAttribute = Element.prototype.removeAttribute; var setAttribute = Element.prototype.setAttribute; var noop = function noop() {}; /** * Register a new component. * * @param {String} name * @param {Object} props * @return {constructor} * @public */ exports.register = function (name, props) { var baseProto = getBaseProto(props["extends"]); var template = props.template || baseProto.templateString; // Components are extensible by default but can be declared // as non extensible as an optimization to avoid // storing the template strings var extensible = props.extensible = props.hasOwnProperty('extensible') ? props.extensible : true; // Clean up delete props["extends"]; // Pull out CSS that needs to be in the light-dom if (template) { // Stores the string to be reprocessed when // a new component extends this one if (extensible && props.template) { props.templateString = props.template; } var output = processCss(template, name); props.template = document.createElement('template'); props.template.innerHTML = output.template; props.lightCss = output.lightCss; props.globalCss = props.globalCss || ''; props.globalCss += output.globalCss; } // Inject global CSS into the document, // and delete as no longer needed injectGlobalCss(props.globalCss); delete props.globalCss; // Merge base getter/setter attributes with the user's, // then define the property descriptors on the prototype. var descriptors = mixin(props.attrs || {}, base.descriptors); // Store the orginal descriptors somewhere // a little more private and delete the original props._attrs = props.attrs; delete props.attrs; // Create the prototype, extended from base and // define the descriptors directly on the prototype var proto = createProto(baseProto, props); Object.defineProperties(proto, descriptors); // Register the custom-element and return the constructor try { return document.registerElement(name, { prototype: proto }); } catch (e) { if (e.name !== 'NotSupportedError') { throw e; } } }; var base = { properties: { GaiaComponent: true, attributeChanged: noop, attached: noop, detached: noop, created: noop, createdCallback: function createdCallback() { if (this.dirObserver) { addDirObserver(); } injectLightCss(this); this.created(); }, /** * It is very common to want to keep object * properties in-sync with attributes, * for example: * * el.value = 'foo'; * el.setAttribute('value', 'foo'); * * So we support an object on the prototype * named 'attrs' to provide a consistent * way for component authors to define * these properties. When an attribute * changes we keep the attr[name] * up-to-date. * * @param {String} name * @param {String||null} from * @param {String||null} to */ attributeChangedCallback: function attributeChangedCallback(name, from, to) { var prop = toCamelCase(name); if (this._attrs && this._attrs[prop]) { this[prop] = to; } this.attributeChanged(name, from, to); }, attachedCallback: function attachedCallback() { if (this.dirObserver) { this.setInnerDirAttributes = setInnerDirAttributes.bind(null, this); document.addEventListener('dirchanged', this.setInnerDirAttributes); } this.attached(); }, detachedCallback: function detachedCallback() { if (this.dirObserver) { document.removeEventListener('dirchanged', this.setInnerDirAttributes); } this.detached(); }, /** * A convenient method for setting up * a shadow-root using the defined template. * * @return {ShadowRoot} */ setupShadowRoot: function setupShadowRoot() { if (!this.template) { return; } var node = document.importNode(this.template.content, true); this.createShadowRoot().appendChild(node); if (this.dirObserver) { setInnerDirAttributes(this); } return this.shadowRoot; }, /** * Sets an attribute internally * and externally. This is so that * we can style internal shadow-dom * content. * * @param {String} name * @param {String} value */ setAttr: function setAttr(name, value) { var internal = this.shadowRoot.firstElementChild; setAttribute.call(internal, name, value); setAttribute.call(this, name, value); }, /** * Removes an attribute internally * and externally. This is so that * we can style internal shadow-dom * content. * * @param {String} name * @param {String} value */ removeAttr: function removeAttr(name) { var internal = this.shadowRoot.firstElementChild; removeAttribute.call(internal, name); removeAttribute.call(this, name); } }, descriptors: { textContent: { set: function set(value) { textContent.set.call(this, value); if (this.lightStyle) { this.appendChild(this.lightStyle); } }, get: function get() { return textContent.get(); } }, innerHTML: { set: function set(value) { innerHTML.set.call(this, value); if (this.lightStyle) { this.appendChild(this.lightStyle); } }, get: innerHTML.get } } }; /** * The default base prototype to use * when `extends` is undefined. * * @type {Object} */ var defaultPrototype = createProto(HTMLElement.prototype, base.properties); /** * Returns a suitable prototype based * on the object passed. * * @private * @param {HTMLElementPrototype|undefined} proto * @return {HTMLElementPrototype} */ function getBaseProto(proto) { if (!proto) { return defaultPrototype; } proto = proto.prototype || proto; return !proto.GaiaComponent ? createProto(proto, base.properties) : proto; } /** * Extends the given proto and mixes * in the given properties. * * @private * @param {Object} proto * @param {Object} props * @return {Object} */ function createProto(proto, props) { return mixin(Object.create(proto), props); } /** * Detects presence of shadow-dom * CSS selectors. * * @private * @return {Boolean} */ var hasShadowCSS = (function () { var div = document.createElement('div'); try { div.querySelector(':host');div.querySelector('::content');return true; } catch (e) { return false; } })(); /** * Regexs used to extract shadow-css * * @type {Object} */ var regex = { shadowCss: /(?:\:host|\:\:content)[^{]*\{[^}]*\}/g, ':host': /(?:\:host)/g, ':host()': /\:host\((.+)\)(?: \:\:content)?/g, ':host-context': /\:host-context\((.+)\)([^{,]+)?/g, '::content': /(?:\:\:content)/g }; /** * Extracts the :host and ::content rules * from the shadow-dom CSS and rewrites * them to work from the ", // Test hook nextTick: nextTick }); /** * Utils */ /** * Determines whether passed element * contributes to the layout in gaia-header. * * Children with `[l10n-action]` get distributed * inside the action-button so don't occupy * space before the `