-
Notifications
You must be signed in to change notification settings - Fork 97
/
scripts-es5.js.map
1 lines (1 loc) · 264 KB
/
scripts-es5.js.map
1
{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///../home-assistant-polymer/src/common/dom/apply_themes_on_element.ts","webpack:///../home-assistant-polymer/src/common/entity/compute_domain.ts","webpack:///../home-assistant-polymer/src/common/entity/compute_state_domain.ts","webpack:///../home-assistant-polymer/src/common/dom/dynamic_content_updater.ts","webpack:///../home-assistant-polymer/src/common/entity/supports-feature.ts","webpack:///../home-assistant-polymer/src/common/const.ts","webpack:///../src/lib/directive.ts","webpack:///../src/lib/dom.ts","webpack:///../src/lib/part.ts","webpack:///../src/lib/template.ts","webpack:///../src/lib/template-instance.ts","webpack:///../src/lib/template-result.ts","webpack:///../src/lib/parts.ts","webpack:///../src/lib/default-template-processor.ts","webpack:///../src/lib/template-factory.ts","webpack:///../src/lib/render.ts","webpack:///src/lit-html.ts","webpack:///../src/lib/modify-template.ts","webpack:///../src/lib/shady-render.ts","webpack:///../src/lib/updating-element.ts","webpack:///../src/lib/css-tag.ts","webpack:///src/lit-element.ts","webpack:///./src/elements/ha-config-custom-ui.js","webpack:///./src/utils/version.js","webpack:///../home-assistant-polymer/src/util/hass-attributes-util.js","webpack:///./src/utils/hass-attribute-util.js","webpack:///./src/utils/hooks.js","webpack:///../home-assistant-polymer/src/common/entity/get_view_entities.ts","webpack:///../home-assistant-polymer/src/common/entity/get_group_entities.ts","webpack:///./node_modules/@polymer/polymer/lib/utils/html-tag.js","webpack:///./src/elements/cui-base-element.js","webpack:///./src/elements/dynamic-element.js","webpack:///./src/elements/ha-themed-slider.js","webpack:///./src/elements/state-card-with-slider.js","webpack:///./src/elements/state-card-without-slider.js","webpack:///./src/elements/state-card-custom-ui.js","webpack:///../home-assistant-polymer/src/common/entity/state_card_type.ts","webpack:///../home-assistant-polymer/src/common/entity/can_toggle_state.ts","webpack:///../home-assistant-polymer/src/common/entity/can_toggle_domain.ts","webpack:///./src/elements/dynamic-with-extra.js","webpack:///./node_modules/@polymer/polymer/lib/utils/boot.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","r","value","n","__esModule","default","object","property","prototype","hasOwnProperty","p","s","__webpack_exports__","_defineProperty","obj","key","writable","applyThemesOnElement","element","themes","localTheme","updateMeta","arguments","length","_themes","themeName","default_theme","styles","theme","keys","forEach","prefixedKey","updateStyles","window","ShadyCSS","styleSubtree","meta","document","querySelector","hasAttribute","setAttribute","getAttribute","themeColor","computeDomain","entityId","substr","indexOf","computeStateDomain","stateObj","entity_id","dynamicContentUpdater","root","newElementTag","attributes","customEl","rootEl","lastChild","tagName","removeChild","createElement","toLowerCase","setProperties","parentNode","appendChild","supportsFeature","feature","supported_features","DOMAINS_WITH_CARD","Set","directives","WeakMap","isDirective","has","isCEPolyfill","customElements","polyfillWrapFlushCallback","removeNodes","container","startNode","endNode","node","nextSibling","noChange","nothing","marker","concat","String","Math","random","slice","nodeMarker","markerRegex","RegExp","Template","result","_this","this","parts","index","partIndex","nodesToRemove","_prepareTemplate","template","content","walker","createTreeWalker","lastPartIndex","nextNode","currentNode","nodeType","hasAttributes","count","stringForPart","strings","lastAttributeNameRegex","exec","attributeLookupName","split","push","type","removeAttribute","data","parent","_strings","lastIndex","_i","insertBefore","createMarker","createTextNode","_parent","previousSibling","_i2","_i3","isTemplatePartActive","part","createComment","_defineProperties","target","props","descriptor","template_instance_TemplateInstance","TemplateInstance","processor","options","_parts","Constructor","values","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_step","_iterator","Symbol","iterator","next","done","setValue","err","return","_iteratorNormalCompletion2","_didIteratorError2","_iteratorError2","_step2","_iterator2","_part","commit","fragment","cloneNode","importNode","nodeIndex","_prepareInstance","_part2","handleTextExpression","insertAfterNode","_this$_parts","apply","arr","Array","isArray","arr2","handleAttributeExpressions","iter","toString","from","TypeError","nodeName","adoptNode","upgrade","template_result_defineProperties","template_result_TemplateResult","TemplateResult","instance","template_result_classCallCheck","protoProps","endIndex","html","match","innerHTML","getHTML","staticProps","parts_possibleConstructorReturn","self","parts_typeof","ReferenceError","parts_get","receiver","Reflect","base","parts_getPrototypeOf","desc","getOwnPropertyDescriptor","setPrototypeOf","getPrototypeOf","__proto__","parts_inherits","subClass","superClass","create","constructor","parts_classCallCheck","parts_defineProperties","parts_createClass","isPrimitive","AttributeCommitter","dirty","_createPart","parts_AttributePart","text","v","t","_getValue","AttributePart","comitter","committer","directive","parts_NodePart","NodePart","_pendingValue","ref","_insert","_commitText","_commitTemplateResult","Node","_commitNode","_commitIterable","clear","templateFactory","update","_clone","itemPart","itemParts","item","appendIntoPart","insertAfterPart","parts_BooleanAttributePart","BooleanAttributePart","Error","PropertyCommitter","_AttributeCommitter","single","PropertyPart","_AttributePart","eventOptionsSupported","parts_options","capture","addEventListener","removeEventListener","_e","parts_EventPart","EventPart","eventName","eventContext","_this2","_boundHandleEvent","e","handleEvent","newListener","oldListener","shouldRemoveListener","once","passive","shouldAddListener","_options","getOptions","event","defaultTemplateProcessor","DefaultTemplateProcessor","prefix","templateCache","templateCaches","stringsArray","keyString","Map","set","join","getTemplateElement","render_parts","litHtmlVersions","walkerNodeFilter","removeNodesFromTemplate","modify_template_nextActiveIndexInTemplateParts","removeCount","nodesToRemoveInTemplate","currentRemovingNode","countNodes","getTemplateCacheKey","scopeName","compatibleShadyCSSVersion","prepareTemplateDom","console","warn","TEMPLATE_TYPES","shadyRenderSet","JSCompiler_renameProperty","prop","_obj","defaultConverter","toAttribute","Boolean","JSON","stringify","fromAttribute","Number","parse","notEqual","old","defaultPropertyDeclaration","attribute","converter","reflect","hasChanged","microtaskPromise","Promise","resolve","UpdatingElement","_HTMLElement","updating_element_getPrototypeOf","_updateState","_instanceProperties","_updatePromise","_hasConnectedResolver","_changedProperties","_reflectingProperties","initialize","fn","_enqueueUpdate2","updating_element_setPrototypeOf","_wrapNativeSuper","HTMLElement","_this6","_classProperties","superProperties","k","_ensureClassProperties","noAccessor","updating_element_typeof","oldValue","_requestUpdate","finalized","superCtor","finalize","_attributeToPropertyMap","properties","propKeys","updating_element_toConsumableArray","getOwnPropertyNames","getOwnPropertySymbols","createProperty","_this7","attr","_attributeNameForProperty","_saveInstanceProperties","_v","_this3","_attributeToProperty","ctor","attrValue","_propertyValueToAttribute","propName","_propertyValueFromAttribute","shouldRequestUpdate","_valueHasChanged","_hasRequestedUpdate","_enqueueUpdate","updateComplete","regeneratorRuntime","mark","_callee","reject","previousUpdatePromise","_this4","wrap","_context","prev","res","rej","t0","catch","_hasConnected","performUpdate","t1","stop","args","gen","_next","asyncGeneratorStep","_throw","_applyInstanceProperties","shouldUpdate","changedProperties","_markUpdated","firstUpdated","updated","_this5","size","_propertyToAttribute","supportsAdoptingStyleSheets","Document","CSSStyleSheet","litElementVersions","lit_element_LitElement","_UpdatingElement","LitElement","lit_element_getPrototypeOf","lit_element_setPrototypeOf","lit_element_get","_styles","_getUniqueStyles","userStyles","flat","Infinity","arrayFlat","flattenStyles","reduceRight","add","unshift","renderRoot","createRenderRoot","ShadowRoot","adoptStyles","attachShadow","mode","nativeShadow","adoptedStyleSheets","map","styleSheet","_needsShimAdoptedStyleSheets","ScopingShim","prepareAdoptedCssText","cssText","localName","hasUpdated","styleElement","templateResult","render","style","textContent","lit_element_defineProperties","ha_config_custom_ui_typeof","_templateObject","raw","freeze","defineProperties","ha_config_custom_ui_defineProperties","ha_config_custom_ui_get","ha_config_custom_ui_getPrototypeOf","ha_config_custom_ui_setPrototypeOf","hasRendered","needsScoping","firstScopeRender","renderContainer","createDocumentFragment","firstChild","assign","appendInto","cacheKey","delete","renderedDOM","querySelectorAll","condensedStyle","templates","refNode","insertCount","walkerIndex","prepareTemplateStyles","_style","removes","shady_render_prepareTemplateStyles","host","ha_config_custom_ui_HaConfigCustomUi","isWide","observer","_len","_key","_backHandler","oldval","newval","nameChanged","HaConfigCustomUi","customUI","getName","setName","history","back","CustomEvent","dispatchEvent","define","hassAttributeUtil","binary_sensor","cover","sensor","switch","string","json","icon","boolean","array","key-value","LOGIC_STATE_ATTRIBUTES","entity_picture","friendly_name","description","emulated_hue","domains","emulated_hue_name","haaska_hidden","haaska_name","homebridge_hidden","homebridge_name","attribution","custom_ui_more_info","custom_ui_state_card","device_class","DOMAIN_DEVICE_CLASS","hidden","assumed_state","initial_state","unit_of_measurement","hass_attributes_util","SUPPORTED_SLIDER_MODES","customUiAttributes","group","device","state","_stateDisplay","control_element","state_card_mode","light","climate","*","state_card_custom_ui_secondary","badges_list","show_last_changed","hide_control","extra_data_template","extra_badge","stretch_slider","slider_theme","confirm_controls","confirm_controls_show_lock","hide_in_default_view","icon_color","init","UNKNOWN_TYPE","domHost","elem","getRootNode","DocumentFragment","lightOrShadow","selector","shadowRoot","getElementHierarchy","hierarchy","shift","getContext","groupEntity","states","reverse","findMatch","find","option","maybeChangeObjectByDevice","applyAttributes","maybeChangeObjectByGroup","context","_setKeep","_cui_keep","maybeApplyTemplateAttributes","hass","newAttributes","hasGlobal","hasChanges","computeTemplate","untemplated_attributes","untemplated_state","untemplated_stateDisplay","maybeApplyTemplates","newResult","checkAttributes","last_changed","maybeChangeObject","inDialog","allowHidden","fixGroupTitles","homeAssistantMain","haCards","$","main","card","setTimeout","controlColumns","columns","partialCards","f","handleWindowChange","_updateColumns","mqls","mql","removeListener","width","matchMedia","addListener","bind","useCustomizer","customizer","hide_attributes","updateConfigPanel","location","pathname","startsWith","haPanelConfig","haConfigNavigation","localize","cuiPatch","_originalComputeLoaded","_computeLoaded","_originalComputeCaption","_computeCaption","_originalComputeDescription","_computeDescription","page","pages","some","conf","domain","caption","loaded","getHaConfigCustomUi","haConfigCustomUi","ironPages","lastElementChild","select","visible","display","routerOptions","routes","customui","tag","load","installStatesHook","whenDefined","then","homeAssistant","_updateHass","originalUpdate","entity","newEntity","_themeWaiters","waiter","stateChanged","installPartialCards","_defaultViewFilter","excludes","excludeEntityId","view","viewEntities","entities","groupEntities","grEntityId","grEntity","filter","id","installActionName","elementName","klass","action_name","__data","installHaStateLabelBadge","haStateLabelBadge","startInterval","installStateBadge","stateBadge","_updateIconAppearance","originalUpdateIconAppearance","backgroundImage","color","originalUpdated","changedProps","_icon","installHaAttributes","haAttributes","computeFiltersArray","extraFilters","installHaFormCustomize","haFormCustomize","haFormCustomizeInitDone","_computeSingleAttribute","secondary","config","_initOpenObject","getNewAttributesOptions","localAttributes","globalAttributes","existingAttributes","includes","filterFromAttributes","sort","installClassHooks","classInitDone","initDone","runHooks","log","CUSTOM_UI_LIST","version","url","localStorage","getItem","setItem","functionBody","Function","SyntaxError","message","LiteralString","html_tag_html","reduce","acc","idx","HTMLTemplateElement","literalValue","cui_base_element","_superClass","CuiBaseElement","cui_base_element_getPrototypeOf","cui_base_element_setPrototypeOf","controlElement","extra","computed","extras","cui_base_element_defineProperties","dynamic_element_typeof","dynamic_element_defineProperties","dynamic_element_getPrototypeOf","dynamic_element_setPrototypeOf","loadCustomUI","DynamicElement","_Polymer$Element","Polymer","Element","toUpperCase","ha_themed_slider_loadCustomUI","HaThemedSlider","ha_themed_slider_getPrototypeOf","ha_themed_slider_setPrototypeOf","ha_themed_slider_templateObject","min","max","pin","isOn","disableOffWhenMin","notify","disableReportWhenNotChanged","_themedMin","ha_themed_slider_get","_computeAttribute","computeEnabledThemedReportWhenNotChanged","slider","_keyBindings","_enabledThemedReportWhenNotChanged","def","themedMin","ev","stopPropagation","state_card_with_slider_loadCustomUI","StateCardWithSlider","_CuiBaseElement","state_card_with_slider_getPrototypeOf","state_card_with_slider_setPrototypeOf","state_card_with_slider_templateObject","serviceMin","serviceMax","valueName","setValueName","nameOn","sliderValue","stretchSlider","breakSlider","hideSlider","lineTooLong","minLineBreak","maxLineBreak","showSlider","state_card_with_slider_get","_onIronResize","_isConnected","_waitForLayout","_setMode","_frameId","readyToCompute","requestAnimationFrame","prevBreakSlider","prevHideSlider","containerWidth","clientWidth","containerHeight","clientHeight","stateHeight","parseInt","param","isNaN","path","_slicedToArray","composedPath","callService","state_card_without_slider_loadCustomUI","StateCardWithoutSlider","state_card_without_slider_getPrototypeOf","state_card_without_slider_setPrototypeOf","state_card_without_slider_templateObject","state_card_without_slider_defineProperties","state_card_custom_ui_loadCustomUI","SHOW_LAST_CHANGED_BLACKLISTED_CARDS","DOMAIN_TO_SLIDER_SUPPORT","TYPE_TO_CONTROL","toggle","StateCardCustomUi","state_card_custom_ui_getPrototypeOf","state_card_custom_ui_setPrototypeOf","state_card_custom_ui_get","classList","contains","_container","setProperty","_isAttached","inputChanged","margin","padding","params","text-align","fontSize","modifiedObj","themeTarget","maybeHideEntity","applyThemes","regularMode_","badgeMode","cleanBadgeStyle","customStateCardType","originalStateCardType","services","control","stateCardType","secondaryStateCardType","sliderEligible_","min_temp","max_temp","DynamicWithExtra","_customElements$get","dynamic_with_extra_getPrototypeOf","dynamic_with_extra_setPrototypeOf","dynamic_with_extra_templateObject","extraObj","_attached","extraObjVisible","dynamic_with_extra_get","attached","extraBadges","extraBadge","unit","blacklist","blacklist_states","test","_entityDisplay","haLocalize","pointerEvents","lock","opacity"],"mappings":"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","file":"scripts-es5.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","/**\n * Apply a theme to an element by setting the CSS variables on it.\n *\n * element: Element to apply theme on.\n * themes: HASS Theme information\n * localTheme: selected theme.\n * updateMeta: boolean if we should update the theme-color meta element.\n */\nexport default function applyThemesOnElement(\n element,\n themes,\n localTheme,\n updateMeta = false\n) {\n if (!element._themes) {\n element._themes = {};\n }\n let themeName = themes.default_theme;\n if (localTheme === \"default\" || (localTheme && themes.themes[localTheme])) {\n themeName = localTheme;\n }\n const styles = { ...element._themes };\n if (themeName !== \"default\") {\n const theme = themes.themes[themeName];\n Object.keys(theme).forEach((key) => {\n const prefixedKey = \"--\" + key;\n element._themes[prefixedKey] = \"\";\n styles[prefixedKey] = theme[key];\n });\n }\n if (element.updateStyles) {\n element.updateStyles(styles);\n } else if (window.ShadyCSS) {\n // implement updateStyles() method of Polemer elements\n window.ShadyCSS.styleSubtree(/** @type {!HTMLElement} */ (element), styles);\n }\n\n if (!updateMeta) {\n return;\n }\n\n const meta = document.querySelector(\"meta[name=theme-color]\");\n if (meta) {\n if (!meta.hasAttribute(\"default-content\")) {\n meta.setAttribute(\"default-content\", meta.getAttribute(\"content\")!);\n }\n const themeColor =\n styles[\"--primary-color\"] || meta.getAttribute(\"default-content\");\n meta.setAttribute(\"content\", themeColor);\n }\n}\n","export default function computeDomain(entityId: string): string {\n return entityId.substr(0, entityId.indexOf(\".\"));\n}\n","import { HassEntity } from \"home-assistant-js-websocket\";\nimport computeDomain from \"./compute_domain\";\n\nexport default function computeStateDomain(stateObj: HassEntity) {\n return computeDomain(stateObj.entity_id);\n}\n","/**\n * Update root's child element to be newElementTag replacing another existing child if any.\n * Copy attributes into the child element.\n */\nexport default function dynamicContentUpdater(root, newElementTag, attributes) {\n const rootEl = root;\n let customEl;\n\n if (rootEl.lastChild && rootEl.lastChild.tagName === newElementTag) {\n customEl = rootEl.lastChild;\n } else {\n if (rootEl.lastChild) {\n rootEl.removeChild(rootEl.lastChild);\n }\n // Creating an element with upper case works fine in Chrome, but in FF it doesn't immediately\n // become a defined Custom Element. Polymer does that in some later pass.\n customEl = document.createElement(newElementTag.toLowerCase());\n }\n\n if (customEl.setProperties) {\n customEl.setProperties(attributes);\n } else {\n // If custom element definition wasn't loaded yet - setProperties would be\n // missing, but no harm in setting attributes one-by-one then.\n Object.keys(attributes).forEach((key) => {\n customEl[key] = attributes[key];\n });\n }\n\n if (customEl.parentNode === null) {\n rootEl.appendChild(customEl);\n }\n}\n","import { HassEntity } from \"home-assistant-js-websocket\";\n\nexport const supportsFeature = (\n stateObj: HassEntity,\n feature: number\n): boolean => {\n // tslint:disable-next-line:no-bitwise\n return (stateObj.attributes.supported_features! & feature) !== 0;\n};\n","/** Constants to be used in the frontend. */\n\n// Constants should be alphabetically sorted by name.\n// Arrays with values should be alphabetically sorted if order doesn't matter.\n// Each constant should have a description what it is supposed to be used for.\n\n/** Icon to use when no icon specified for domain. */\nexport const DEFAULT_DOMAIN_ICON = \"hass:bookmark\";\n\n/** Panel to show when no panel is picked. */\nexport const DEFAULT_PANEL = \"lovelace\";\n\n/** Domains that have a state card. */\nexport const DOMAINS_WITH_CARD = [\n \"climate\",\n \"cover\",\n \"configurator\",\n \"input_select\",\n \"input_number\",\n \"input_text\",\n \"lock\",\n \"media_player\",\n \"scene\",\n \"script\",\n \"timer\",\n \"vacuum\",\n \"water_heater\",\n \"weblink\",\n];\n\n/** Domains with separate more info dialog. */\nexport const DOMAINS_WITH_MORE_INFO = [\n \"alarm_control_panel\",\n \"automation\",\n \"camera\",\n \"climate\",\n \"configurator\",\n \"cover\",\n \"fan\",\n \"group\",\n \"history_graph\",\n \"input_datetime\",\n \"light\",\n \"lock\",\n \"media_player\",\n \"script\",\n \"sun\",\n \"updater\",\n \"vacuum\",\n \"water_heater\",\n \"weather\",\n];\n\n/** Domains that show no more info dialog. */\nexport const DOMAINS_HIDE_MORE_INFO = [\n \"input_number\",\n \"input_select\",\n \"input_text\",\n \"scene\",\n \"weblink\",\n];\n\n/** Domains that should have the history hidden in the more info dialog. */\nexport const DOMAINS_MORE_INFO_NO_HISTORY = [\n \"camera\",\n \"configurator\",\n \"history_graph\",\n \"scene\",\n];\n\n/** States that we consider \"off\". */\nexport const STATES_OFF = [\"closed\", \"locked\", \"off\"];\n\n/** Domains where we allow toggle in Lovelace. */\nexport const DOMAINS_TOGGLE = new Set([\n \"fan\",\n \"input_boolean\",\n \"light\",\n \"switch\",\n \"group\",\n \"automation\",\n]);\n\n/** Temperature units. */\nexport const UNIT_C = \"°C\";\nexport const UNIT_F = \"°F\";\n\n/** Entity ID of the default view. */\nexport const DEFAULT_VIEW_ENTITY_ID = \"group.default_view\";\n","/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * @module lit-html\n */\n\nimport {Part} from './part.js';\n\nconst directives = new WeakMap<object, true>();\n\n// tslint:disable-next-line:no-any\nexport type DirectiveFactory = (...args: any[]) => object;\n\nexport type DirectiveFn = (part: Part) => void;\n\n/**\n * Brands a function as a directive so that lit-html will call the function\n * during template rendering, rather than passing as a value.\n *\n * @param f The directive factory function. Must be a function that returns a\n * function of the signature `(part: Part) => void`. The returned function will\n * be called with the part object\n *\n * @example\n *\n * ```\n * import {directive, html} from 'lit-html';\n *\n * const immutable = directive((v) => (part) => {\n * if (part.value !== v) {\n * part.setValue(v)\n * }\n * });\n * ```\n */\n// tslint:disable-next-line:no-any\nexport const directive = <F extends DirectiveFactory>(f: F): F =>\n ((...args: unknown[]) => {\n const d = f(...args);\n directives.set(d, true);\n return d;\n }) as F;\n\nexport const isDirective = (o: unknown): o is DirectiveFn => {\n return typeof o === 'function' && directives.has(o);\n};\n","/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * @module lit-html\n */\n\ninterface MaybePolyfilledCe extends CustomElementRegistry {\n polyfillWrapFlushCallback?: object;\n}\n\n/**\n * True if the custom elements polyfill is in use.\n */\nexport const isCEPolyfill = window.customElements !== undefined &&\n (window.customElements as MaybePolyfilledCe).polyfillWrapFlushCallback !==\n undefined;\n\n/**\n * Reparents nodes, starting from `startNode` (inclusive) to `endNode`\n * (exclusive), into another container (could be the same container), before\n * `beforeNode`. If `beforeNode` is null, it appends the nodes to the\n * container.\n */\nexport const reparentNodes =\n (container: Node,\n start: Node|null,\n end: Node|null = null,\n before: Node|null = null): void => {\n let node = start;\n while (node !== end) {\n const n = node!.nextSibling;\n container.insertBefore(node!, before as Node);\n node = n;\n }\n };\n\n/**\n * Removes nodes, starting from `startNode` (inclusive) to `endNode`\n * (exclusive), from `container`.\n */\nexport const removeNodes =\n (container: Node, startNode: Node|null, endNode: Node|null = null):\n void => {\n let node = startNode;\n while (node !== endNode) {\n const n = node!.nextSibling;\n container.removeChild(node!);\n node = n;\n }\n };\n","/**\n * @license\n * Copyright (c) 2018 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * @module lit-html\n */\n\n/**\n * The Part interface represents a dynamic part of a template instance rendered\n * by lit-html.\n */\nexport interface Part {\n value: unknown;\n\n /**\n * Sets the current part value, but does not write it to the DOM.\n * @param value The value that will be committed.\n */\n setValue(value: unknown): void;\n\n /**\n * Commits the current part value, cause it to actually be written to the DOM.\n */\n commit(): void;\n}\n\n/**\n * A sentinel value that signals that a value was handled by a directive and\n * should not be written to the DOM.\n */\nexport const noChange: object = {};\n\n/**\n * A sentinel value that signals a NodePart to fully clear its content.\n */\nexport const nothing = {};\n","/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * @module lit-html\n */\n\nimport {TemplateResult} from './template-result.js';\n\n/**\n * An expression marker with embedded unique key to avoid collision with\n * possible text in templates.\n */\nexport const marker = `{{lit-${String(Math.random()).slice(2)}}}`;\n\n/**\n * An expression marker used text-positions, multi-binding attributes, and\n * attributes with markup-like text values.\n */\nexport const nodeMarker = `<!--${marker}-->`;\n\nexport const markerRegex = new RegExp(`${marker}|${nodeMarker}`);\n\n/**\n * Suffix appended to all bound attribute names.\n */\nexport const boundAttributeSuffix = '$lit$';\n\n/**\n * An updateable Template that tracks the location of dynamic parts.\n */\nexport class Template {\n parts: TemplatePart[] = [];\n element: HTMLTemplateElement;\n\n constructor(result: TemplateResult, element: HTMLTemplateElement) {\n this.element = element;\n let index = -1;\n let partIndex = 0;\n const nodesToRemove: Node[] = [];\n const _prepareTemplate = (template: HTMLTemplateElement) => {\n const content = template.content;\n // Edge needs all 4 parameters present; IE11 needs 3rd parameter to be\n // null\n const walker = document.createTreeWalker(\n content,\n 133 /* NodeFilter.SHOW_{ELEMENT|COMMENT|TEXT} */,\n null,\n false);\n // Keeps track of the last index associated with a part. We try to delete\n // unnecessary nodes, but we never want to associate two different parts\n // to the same index. They must have a constant node between.\n let lastPartIndex = 0;\n while (walker.nextNode()) {\n index++;\n const node = walker.currentNode as Element | Comment | Text;\n if (node.nodeType === 1 /* Node.ELEMENT_NODE */) {\n if ((node as Element).hasAttributes()) {\n const attributes = (node as Element).attributes;\n // Per\n // https://developer.mozilla.org/en-US/docs/Web/API/NamedNodeMap,\n // attributes are not guaranteed to be returned in document order.\n // In particular, Edge/IE can return them out of order, so we cannot\n // assume a correspondance between part index and attribute index.\n let count = 0;\n for (let i = 0; i < attributes.length; i++) {\n if (attributes[i].value.indexOf(marker) >= 0) {\n count++;\n }\n }\n while (count-- > 0) {\n // Get the template literal section leading up to the first\n // expression in this attribute\n const stringForPart = result.strings[partIndex];\n // Find the attribute name\n const name = lastAttributeNameRegex.exec(stringForPart)![2];\n // Find the corresponding attribute\n // All bound attributes have had a suffix added in\n // TemplateResult#getHTML to opt out of special attribute\n // handling. To look up the attribute value we also need to add\n // the suffix.\n const attributeLookupName =\n name.toLowerCase() + boundAttributeSuffix;\n const attributeValue =\n (node as Element).getAttribute(attributeLookupName)!;\n const strings = attributeValue.split(markerRegex);\n this.parts.push({type: 'attribute', index, name, strings});\n (node as Element).removeAttribute(attributeLookupName);\n partIndex += strings.length - 1;\n }\n }\n if ((node as Element).tagName === 'TEMPLATE') {\n _prepareTemplate(node as HTMLTemplateElement);\n }\n } else if (node.nodeType === 3 /* Node.TEXT_NODE */) {\n const data = (node as Text).data!;\n if (data.indexOf(marker) >= 0) {\n const parent = node.parentNode!;\n const strings = data.split(markerRegex);\n const lastIndex = strings.length - 1;\n // Generate a new text node for each literal section\n // These nodes are also used as the markers for node parts\n for (let i = 0; i < lastIndex; i++) {\n parent.insertBefore(\n (strings[i] === '') ? createMarker() :\n document.createTextNode(strings[i]),\n node);\n this.parts.push({type: 'node', index: ++index});\n }\n // If there's no text, we must insert a comment to mark our place.\n // Else, we can trust it will stick around after cloning.\n if (strings[lastIndex] === '') {\n parent.insertBefore(createMarker(), node);\n nodesToRemove.push(node);\n } else {\n (node as Text).data = strings[lastIndex];\n }\n // We have a part for each match found\n partIndex += lastIndex;\n }\n } else if (node.nodeType === 8 /* Node.COMMENT_NODE */) {\n if ((node as Comment).data === marker) {\n const parent = node.parentNode!;\n // Add a new marker node to be the startNode of the Part if any of\n // the following are true:\n // * We don't have a previousSibling\n // * The previousSibling is already the start of a previous part\n if (node.previousSibling === null || index === lastPartIndex) {\n index++;\n parent.insertBefore(createMarker(), node);\n }\n lastPartIndex = index;\n this.parts.push({type: 'node', index});\n // If we don't have a nextSibling, keep this node so we have an end.\n // Else, we can remove it to save future costs.\n if (node.nextSibling === null) {\n (node as Comment).data = '';\n } else {\n nodesToRemove.push(node);\n index--;\n }\n partIndex++;\n } else {\n let i = -1;\n while ((i = (node as Comment).data!.indexOf(marker, i + 1)) !==\n -1) {\n // Comment node has a binding marker inside, make an inactive part\n // The binding won't work, but subsequent bindings will\n // TODO (justinfagnani): consider whether it's even worth it to\n // make bindings in comments work\n this.parts.push({type: 'node', index: -1});\n }\n }\n }\n }\n };\n _prepareTemplate(element);\n // Remove text binding nodes after the walk to not disturb the TreeWalker\n for (const n of nodesToRemove) {\n n.parentNode!.removeChild(n);\n }\n }\n}\n\n/**\n * A placeholder for a dynamic expression in an HTML template.\n *\n * There are two built-in part types: AttributePart and NodePart. NodeParts\n * always represent a single dynamic expression, while AttributeParts may\n * represent as many expressions are contained in the attribute.\n *\n * A Template's parts are mutable, so parts can be replaced or modified\n * (possibly to implement different template semantics). The contract is that\n * parts can only be replaced, not removed, added or reordered, and parts must\n * always consume the correct number of values in their `update()` method.\n *\n * TODO(justinfagnani): That requirement is a little fragile. A\n * TemplateInstance could instead be more careful about which values it gives\n * to Part.update().\n */\nexport type TemplatePart = {\n type: 'node',\n index: number\n}|{type: 'attribute', index: number, name: string, strings: string[]};\n\nexport const isTemplatePartActive = (part: TemplatePart) => part.index !== -1;\n\n// Allows `document.createComment('')` to be renamed for a\n// small manual size-savings.\nexport const createMarker = () => document.createComment('');\n\n/**\n * This regex extracts the attribute name preceding an attribute-position\n * expression. It does this by matching the syntax allowed for attributes\n * against the string literal directly preceding the expression, assuming that\n * the expression is in an attribute-value position.\n *\n * See attributes in the HTML spec:\n * https://www.w3.org/TR/html5/syntax.html#attributes-0\n *\n * \"\\0-\\x1F\\x7F-\\x9F\" are Unicode control characters\n *\n * \" \\x09\\x0a\\x0c\\x0d\" are HTML space characters:\n * https://www.w3.org/TR/html5/infrastructure.html#space-character\n *\n * So an attribute is:\n * * The name: any character except a control character, space character, ('),\n * (\"), \">\", \"=\", or \"/\"\n * * Followed by zero or more space characters\n * * Followed by \"=\"\n * * Followed by zero or more space characters\n * * Followed by:\n * * Any character except space, ('), (\"), \"<\", \">\", \"=\", (`), or\n * * (\") then any non-(\"), or\n * * (') then any non-(')\n */\nexport const lastAttributeNameRegex =\n /([ \\x09\\x0a\\x0c\\x0d])([^\\0-\\x1F\\x7F-\\x9F \\x09\\x0a\\x0c\\x0d\"'>=/]+)([ \\x09\\x0a\\x0c\\x0d]*=[ \\x09\\x0a\\x0c\\x0d]*(?:[^ \\x09\\x0a\\x0c\\x0d\"'`<>=]*|\"[^\"]*|'[^']*))$/;\n","/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * @module lit-html\n */\n\nimport {isCEPolyfill} from './dom.js';\nimport {Part} from './part.js';\nimport {RenderOptions} from './render-options.js';\nimport {TemplateProcessor} from './template-processor.js';\nimport {isTemplatePartActive, Template} from './template.js';\n\n/**\n * An instance of a `Template` that can be attached to the DOM and updated\n * with new values.\n */\nexport class TemplateInstance {\n _parts: Array<Part|undefined> = [];\n processor: TemplateProcessor;\n options: RenderOptions;\n template: Template;\n\n constructor(\n template: Template, processor: TemplateProcessor,\n options: RenderOptions) {\n this.template = template;\n this.processor = processor;\n this.options = options;\n }\n\n update(values: unknown[]) {\n let i = 0;\n for (const part of this._parts) {\n if (part !== undefined) {\n part.setValue(values[i]);\n }\n i++;\n }\n for (const part of this._parts) {\n if (part !== undefined) {\n part.commit();\n }\n }\n }\n\n _clone(): DocumentFragment {\n // When using the Custom Elements polyfill, clone the node, rather than\n // importing it, to keep the fragment in the template's document. This\n // leaves the fragment inert so custom elements won't upgrade and\n // potentially modify their contents by creating a polyfilled ShadowRoot\n // while we traverse the tree.\n const fragment = isCEPolyfill ?\n this.template.element.content.cloneNode(true) as DocumentFragment :\n document.importNode(this.template.element.content, true);\n\n const parts = this.template.parts;\n let partIndex = 0;\n let nodeIndex = 0;\n const _prepareInstance = (fragment: DocumentFragment) => {\n // Edge needs all 4 parameters present; IE11 needs 3rd parameter to be\n // null\n const walker = document.createTreeWalker(\n fragment,\n 133 /* NodeFilter.SHOW_{ELEMENT|COMMENT|TEXT} */,\n null,\n false);\n let node = walker.nextNode();\n // Loop through all the nodes and parts of a template\n while (partIndex < parts.length && node !== null) {\n const part = parts[partIndex];\n // Consecutive Parts may have the same node index, in the case of\n // multiple bound attributes on an element. So each iteration we either\n // increment the nodeIndex, if we aren't on a node with a part, or the\n // partIndex if we are. By not incrementing the nodeIndex when we find a\n // part, we allow for the next part to be associated with the current\n // node if neccessasry.\n if (!isTemplatePartActive(part)) {\n this._parts.push(undefined);\n partIndex++;\n } else if (nodeIndex === part.index) {\n if (part.type === 'node') {\n const part = this.processor.handleTextExpression(this.options);\n part.insertAfterNode(node.previousSibling!);\n this._parts.push(part);\n } else {\n this._parts.push(...this.processor.handleAttributeExpressions(\n node as Element, part.name, part.strings, this.options));\n }\n partIndex++;\n } else {\n nodeIndex++;\n if (node.nodeName === 'TEMPLATE') {\n _prepareInstance((node as HTMLTemplateElement).content);\n }\n node = walker.nextNode();\n }\n }\n };\n _prepareInstance(fragment);\n if (isCEPolyfill) {\n document.adoptNode(fragment);\n customElements.upgrade(fragment);\n }\n return fragment;\n }\n}\n","/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * @module lit-html\n */\n\nimport {reparentNodes} from './dom.js';\nimport {TemplateProcessor} from './template-processor.js';\nimport {boundAttributeSuffix, lastAttributeNameRegex, marker, nodeMarker} from './template.js';\n\n/**\n * The return type of `html`, which holds a Template and the values from\n * interpolated expressions.\n */\nexport class TemplateResult {\n strings: TemplateStringsArray;\n values: unknown[];\n type: string;\n processor: TemplateProcessor;\n\n constructor(\n strings: TemplateStringsArray, values: unknown[], type: string,\n processor: TemplateProcessor) {\n this.strings = strings;\n this.values = values;\n this.type = type;\n this.processor = processor;\n }\n\n /**\n * Returns a string of HTML used to create a `<template>` element.\n */\n getHTML(): string {\n const endIndex = this.strings.length - 1;\n let html = '';\n for (let i = 0; i < endIndex; i++) {\n const s = this.strings[i];\n // This exec() call does two things:\n // 1) Appends a suffix to the bound attribute name to opt out of special\n // attribute value parsing that IE11 and Edge do, like for style and\n // many SVG attributes. The Template class also appends the same suffix\n // when looking up attributes to create Parts.\n // 2) Adds an unquoted-attribute-safe marker for the first expression in\n // an attribute. Subsequent attribute expressions will use node markers,\n // and this is safe since attributes with multiple expressions are\n // guaranteed to be quoted.\n const match = lastAttributeNameRegex.exec(s);\n if (match) {\n // We're starting a new bound attribute.\n // Add the safe attribute suffix, and use unquoted-attribute-safe\n // marker.\n html += s.substr(0, match.index) + match[1] + match[2] +\n boundAttributeSuffix + match[3] + marker;\n } else {\n // We're either in a bound node, or trailing bound attribute.\n // Either way, nodeMarker is safe to use.\n html += s + nodeMarker;\n }\n }\n return html + this.strings[endIndex];\n }\n\n getTemplateElement(): HTMLTemplateElement {\n const template = document.createElement('template');\n template.innerHTML = this.getHTML();\n return template;\n }\n}\n\n/**\n * A TemplateResult for SVG fragments.\n *\n * This class wraps HTMl in an `<svg>` tag in order to parse its contents in the\n * SVG namespace, then modifies the template to remove the `<svg>` tag so that\n * clones only container the original fragment.\n */\nexport class SVGTemplateResult extends TemplateResult {\n getHTML(): string {\n return `<svg>${super.getHTML()}</svg>`;\n }\n\n getTemplateElement(): HTMLTemplateElement {\n const template = super.getTemplateElement();\n const content = template.content;\n const svgElement = content.firstChild!;\n content.removeChild(svgElement);\n reparentNodes(content, svgElement.firstChild);\n return template;\n }\n}\n","/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * @module lit-html\n */\n\nimport {isDirective} from './directive.js';\nimport {removeNodes} from './dom.js';\nimport {noChange, nothing, Part} from './part.js';\nimport {RenderOptions} from './render-options.js';\nimport {TemplateInstance} from './template-instance.js';\nimport {TemplateResult} from './template-result.js';\nimport {createMarker} from './template.js';\n\n// https://tc39.github.io/ecma262/#sec-typeof-operator\nexport type Primitive = null|undefined|boolean|number|string|Symbol|bigint;\nexport const isPrimitive = (value: unknown): value is Primitive => {\n return (\n value === null ||\n !(typeof value === 'object' || typeof value === 'function'));\n};\n\n/**\n * Sets attribute values for AttributeParts, so that the value is only set once\n * even if there are multiple parts for an attribute.\n */\nexport class AttributeCommitter {\n element: Element;\n name: string;\n strings: string[];\n parts: AttributePart[];\n dirty = true;\n\n constructor(element: Element, name: string, strings: string[]) {\n this.element = element;\n this.name = name;\n this.strings = strings;\n this.parts = [];\n for (let i = 0; i < strings.length - 1; i++) {\n this.parts[i] = this._createPart();\n }\n }\n\n /**\n * Creates a single part. Override this to create a differnt type of part.\n */\n protected _createPart(): AttributePart {\n return new AttributePart(this);\n }\n\n protected _getValue(): unknown {\n const strings = this.strings;\n const l = strings.length - 1;\n let text = '';\n\n for (let i = 0; i < l; i++) {\n text += strings[i];\n const part = this.parts[i];\n if (part !== undefined) {\n const v = part.value;\n if (v != null &&\n (Array.isArray(v) ||\n // tslint:disable-next-line:no-any\n typeof v !== 'string' && (v as any)[Symbol.iterator])) {\n for (const t of v as Iterable<unknown>) {\n text += typeof t === 'string' ? t : String(t);\n }\n } else {\n text += typeof v === 'string' ? v : String(v);\n }\n }\n }\n\n text += strings[l];\n return text;\n }\n\n commit(): void {\n if (this.dirty) {\n this.dirty = false;\n this.element.setAttribute(this.name, this._getValue() as string);\n }\n }\n}\n\nexport class AttributePart implements Part {\n committer: AttributeCommitter;\n value: unknown = undefined;\n\n constructor(comitter: AttributeCommitter) {\n this.committer = comitter;\n }\n\n setValue(value: unknown): void {\n if (value !== noChange && (!isPrimitive(value) || value !== this.value)) {\n this.value = value;\n // If the value is a not a directive, dirty the committer so that it'll\n // call setAttribute. If the value is a directive, it'll dirty the\n // committer if it calls setValue().\n if (!isDirective(value)) {\n this.committer.dirty = true;\n }\n }\n }\n\n commit() {\n while (isDirective(this.value)) {\n const directive = this.value;\n this.value = noChange;\n directive(this);\n }\n if (this.value === noChange) {\n return;\n }\n this.committer.commit();\n }\n}\n\nexport class NodePart implements Part {\n options: RenderOptions;\n startNode!: Node;\n endNode!: Node;\n value: unknown = undefined;\n _pendingValue: unknown = undefined;\n\n constructor(options: RenderOptions) {\n this.options = options;\n }\n\n /**\n * Inserts this part into a container.\n *\n * This part must be empty, as its contents are not automatically moved.\n */\n appendInto(container: Node) {\n this.startNode = container.appendChild(createMarker());\n this.endNode = container.appendChild(createMarker());\n }\n\n /**\n * Inserts this part between `ref` and `ref`'s next sibling. Both `ref` and\n * its next sibling must be static, unchanging nodes such as those that appear\n * in a literal section of a template.\n *\n * This part must be empty, as its contents are not automatically moved.\n */\n insertAfterNode(ref: Node) {\n this.startNode = ref;\n this.endNode = ref.nextSibling!;\n }\n\n /**\n * Appends this part into a parent part.\n *\n * This part must be empty, as its contents are not automatically moved.\n */\n appendIntoPart(part: NodePart) {\n part._insert(this.startNode = createMarker());\n part._insert(this.endNode = createMarker());\n }\n\n /**\n * Appends this part after `ref`\n *\n * This part must be empty, as its contents are not automatically moved.\n */\n insertAfterPart(ref: NodePart) {\n ref._insert(this.startNode = createMarker());\n this.endNode = ref.endNode;\n ref.endNode = this.startNode;\n }\n\n setValue(value: unknown): void {\n this._pendingValue = value;\n }\n\n commit() {\n while (isDirective(this._pendingValue)) {\n const directive = this._pendingValue;\n this._pendingValue = noChange;\n directive(this);\n }\n const value = this._pendingValue;\n if (value === noChange) {\n return;\n }\n if (isPrimitive(value)) {\n if (value !== this.value) {\n this._commitText(value);\n }\n } else if (value instanceof TemplateResult) {\n this._commitTemplateResult(value);\n } else if (value instanceof Node) {\n this._commitNode(value);\n } else if (\n Array.isArray(value) ||\n // tslint:disable-next-line:no-any\n (value as any)[Symbol.iterator]) {\n this._commitIterable(value as Iterable<unknown>);\n } else if (value === nothing) {\n this.value = nothing;\n this.clear();\n } else {\n // Fallback, will render the string representation\n this._commitText(value);\n }\n }\n\n private _insert(node: Node) {\n this.endNode.parentNode!.insertBefore(node, this.endNode);\n }\n\n private _commitNode(value: Node): void {\n if (this.value === value) {\n return;\n }\n this.clear();\n this._insert(value);\n this.value = value;\n }\n\n private _commitText(value: unknown): void {\n const node = this.startNode.nextSibling!;\n value = value == null ? '' : value;\n if (node === this.endNode.previousSibling &&\n node.nodeType === 3 /* Node.TEXT_NODE */) {\n // If we only have a single text node between the markers, we can just\n // set its value, rather than replacing it.\n // TODO(justinfagnani): Can we just check if this.value is primitive?\n (node as Text).data = value as string;\n } else {\n this._commitNode(document.createTextNode(\n typeof value === 'string' ? value : String(value)));\n }\n this.value = value;\n }\n\n private _commitTemplateResult(value: TemplateResult): void {\n const template = this.options.templateFactory(value);\n if (this.value instanceof TemplateInstance &&\n this.value.template === template) {\n this.value.update(value.values);\n } else {\n // Make sure we propagate the template processor from the TemplateResult\n // so that we use its syntax extension, etc. The template factory comes\n // from the render function options so that it can control template\n // caching and preprocessing.\n const instance =\n new TemplateInstance(template, value.processor, this.options);\n const fragment = instance._clone();\n instance.update(value.values);\n this._commitNode(fragment);\n this.value = instance;\n }\n }\n\n private _commitIterable(value: Iterable<unknown>): void {\n // For an Iterable, we create a new InstancePart per item, then set its\n // value to the item. This is a little bit of overhead for every item in\n // an Iterable, but it lets us recurse easily and efficiently update Arrays\n // of TemplateResults that will be commonly returned from expressions like:\n // array.map((i) => html`${i}`), by reusing existing TemplateInstances.\n\n // If _value is an array, then the previous render was of an\n // iterable and _value will contain the NodeParts from the previous\n // render. If _value is not an array, clear this part and make a new\n // array for NodeParts.\n if (!Array.isArray(this.value)) {\n this.value = [];\n this.clear();\n }\n\n // Lets us keep track of how many items we stamped so we can clear leftover\n // items from a previous render\n const itemParts = this.value as NodePart[];\n let partIndex = 0;\n let itemPart: NodePart|undefined;\n\n for (const item of value) {\n // Try to reuse an existing part\n itemPart = itemParts[partIndex];\n\n // If no existing part, create a new one\n if (itemPart === undefined) {\n itemPart = new NodePart(this.options);\n itemParts.push(itemPart);\n if (partIndex === 0) {\n itemPart.appendIntoPart(this);\n } else {\n itemPart.insertAfterPart(itemParts[partIndex - 1]);\n }\n }\n itemPart.setValue(item);\n itemPart.commit();\n partIndex++;\n }\n\n if (partIndex < itemParts.length) {\n // Truncate the parts array so _value reflects the current state\n itemParts.length = partIndex;\n this.clear(itemPart && itemPart!.endNode);\n }\n }\n\n clear(startNode: Node = this.startNode) {\n removeNodes(\n this.startNode.parentNode!, startNode.nextSibling!, this.endNode);\n }\n}\n\n/**\n * Implements a boolean attribute, roughly as defined in the HTML\n * specification.\n *\n * If the value is truthy, then the attribute is present with a value of\n * ''. If the value is falsey, the attribute is removed.\n */\nexport class BooleanAttributePart implements Part {\n element: Element;\n name: string;\n strings: string[];\n value: unknown = undefined;\n _pendingValue: unknown = undefined;\n\n constructor(element: Element, name: string, strings: string[]) {\n if (strings.length !== 2 || strings[0] !== '' || strings[1] !== '') {\n throw new Error(\n 'Boolean attributes can only contain a single expression');\n }\n this.element = element;\n this.name = name;\n this.strings = strings;\n }\n\n setValue(value: unknown): void {\n this._pendingValue = value;\n }\n\n commit() {\n while (isDirective(this._pendingValue)) {\n const directive = this._pendingValue;\n this._pendingValue = noChange;\n directive(this);\n }\n if (this._pendingValue === noChange) {\n return;\n }\n const value = !!this._pendingValue;\n if (this.value !== value) {\n if (value) {\n this.element.setAttribute(this.name, '');\n } else {\n this.element.removeAttribute(this.name);\n }\n }\n this.value = value;\n this._pendingValue = noChange;\n }\n}\n\n/**\n * Sets attribute values for PropertyParts, so that the value is only set once\n * even if there are multiple parts for a property.\n *\n * If an expression controls the whole property value, then the value is simply\n * assigned to the property under control. If there are string literals or\n * multiple expressions, then the strings are expressions are interpolated into\n * a string first.\n */\nexport class PropertyCommitter extends AttributeCommitter {\n single: boolean;\n\n constructor(element: Element, name: string, strings: string[]) {\n super(element, name, strings);\n this.single =\n (strings.length === 2 && strings[0] === '' && strings[1] === '');\n }\n\n protected _createPart(): PropertyPart {\n return new PropertyPart(this);\n }\n\n _getValue() {\n if (this.single) {\n return this.parts[0].value;\n }\n return super._getValue();\n }\n\n commit(): void {\n if (this.dirty) {\n this.dirty = false;\n // tslint:disable-next-line:no-any\n (this.element as any)[this.name] = this._getValue();\n }\n }\n}\n\nexport class PropertyPart extends AttributePart {}\n\n// Detect event listener options support. If the `capture` property is read\n// from the options object, then options are supported. If not, then the thrid\n// argument to add/removeEventListener is interpreted as the boolean capture\n// value so we should only pass the `capture` property.\nlet eventOptionsSupported = false;\n\ntry {\n const options = {\n get capture() {\n eventOptionsSupported = true;\n return false;\n }\n };\n // tslint:disable-next-line:no-any\n window.addEventListener('test', options as any, options);\n // tslint:disable-next-line:no-any\n window.removeEventListener('test', options as any, options);\n} catch (_e) {\n}\n\n\ntype EventHandlerWithOptions =\n EventListenerOrEventListenerObject&Partial<AddEventListenerOptions>;\nexport class EventPart implements Part {\n element: Element;\n eventName: string;\n eventContext?: EventTarget;\n value: undefined|EventHandlerWithOptions = undefined;\n _options?: AddEventListenerOptions;\n _pendingValue: undefined|EventHandlerWithOptions = undefined;\n _boundHandleEvent: (event: Event) => void;\n\n constructor(element: Element, eventName: string, eventContext?: EventTarget) {\n this.element = element;\n this.eventName = eventName;\n this.eventContext = eventContext;\n this._boundHandleEvent = (e) => this.handleEvent(e);\n }\n\n setValue(value: undefined|EventHandlerWithOptions): void {\n this._pendingValue = value;\n }\n\n commit() {\n while (isDirective(this._pendingValue)) {\n const directive = this._pendingValue;\n this._pendingValue = noChange as EventHandlerWithOptions;\n directive(this);\n }\n if (this._pendingValue === noChange) {\n return;\n }\n\n const newListener = this._pendingValue;\n const oldListener = this.value;\n const shouldRemoveListener = newListener == null ||\n oldListener != null &&\n (newListener.capture !== oldListener.capture ||\n newListener.once !== oldListener.once ||\n newListener.passive !== oldListener.passive);\n const shouldAddListener =\n newListener != null && (oldListener == null || shouldRemoveListener);\n\n if (shouldRemoveListener) {\n this.element.removeEventListener(\n this.eventName, this._boundHandleEvent, this._options);\n }\n if (shouldAddListener) {\n this._options = getOptions(newListener);\n this.element.addEventListener(\n this.eventName, this._boundHandleEvent, this._options);\n }\n this.value = newListener;\n this._pendingValue = noChange as EventHandlerWithOptions;\n }\n\n handleEvent(event: Event) {\n if (typeof this.value === 'function') {\n this.value.call(this.eventContext || this.element, event);\n } else {\n (this.value as EventListenerObject).handleEvent(event);\n }\n }\n}\n\n// We copy options because of the inconsistent behavior of browsers when reading\n// the third argument of add/removeEventListener. IE11 doesn't support options\n// at all. Chrome 41 only reads `capture` if the argument is an object.\nconst getOptions = (o: AddEventListenerOptions|undefined) => o &&\n (eventOptionsSupported ?\n {capture: o.capture, passive: o.passive, once: o.once} :\n o.capture as AddEventListenerOptions);\n","/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * @module lit-html\n */\n\nimport {Part} from './part.js';\nimport {AttributeCommitter, BooleanAttributePart, EventPart, NodePart, PropertyCommitter} from './parts.js';\nimport {RenderOptions} from './render-options.js';\nimport {TemplateProcessor} from './template-processor.js';\n\n/**\n * Creates Parts when a template is instantiated.\n */\nexport class DefaultTemplateProcessor implements TemplateProcessor {\n /**\n * Create parts for an attribute-position binding, given the event, attribute\n * name, and string literals.\n *\n * @param element The element containing the binding\n * @param name The attribute name\n * @param strings The string literals. There are always at least two strings,\n * event for fully-controlled bindings with a single expression.\n */\n handleAttributeExpressions(\n element: Element, name: string, strings: string[],\n options: RenderOptions): Part[] {\n const prefix = name[0];\n if (prefix === '.') {\n const comitter = new PropertyCommitter(element, name.slice(1), strings);\n return comitter.parts;\n }\n if (prefix === '@') {\n return [new EventPart(element, name.slice(1), options.eventContext)];\n }\n if (prefix === '?') {\n return [new BooleanAttributePart(element, name.slice(1), strings)];\n }\n const comitter = new AttributeCommitter(element, name, strings);\n return comitter.parts;\n }\n /**\n * Create parts for a text-position binding.\n * @param templateFactory\n */\n handleTextExpression(options: RenderOptions) {\n return new NodePart(options);\n }\n}\n\nexport const defaultTemplateProcessor = new DefaultTemplateProcessor();\n","/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * @module lit-html\n */\n\nimport {TemplateResult} from './template-result.js';\nimport {marker, Template} from './template.js';\n\n/**\n * A function type that creates a Template from a TemplateResult.\n *\n * This is a hook into the template-creation process for rendering that\n * requires some modification of templates before they're used, like ShadyCSS,\n * which must add classes to elements and remove styles.\n *\n * Templates should be cached as aggressively as possible, so that many\n * TemplateResults produced from the same expression only do the work of\n * creating the Template the first time.\n *\n * Templates are usually cached by TemplateResult.strings and\n * TemplateResult.type, but may be cached by other keys if this function\n * modifies the template.\n *\n * Note that currently TemplateFactories must not add, remove, or reorder\n * expressions, because there is no way to describe such a modification\n * to render() so that values are interpolated to the correct place in the\n * template instances.\n */\nexport type TemplateFactory = (result: TemplateResult) => Template;\n\n/**\n * The default TemplateFactory which caches Templates keyed on\n * result.type and result.strings.\n */\nexport function templateFactory(result: TemplateResult) {\n let templateCache = templateCaches.get(result.type);\n if (templateCache === undefined) {\n templateCache = {\n stringsArray: new WeakMap<TemplateStringsArray, Template>(),\n keyString: new Map<string, Template>()\n };\n templateCaches.set(result.type, templateCache);\n }\n\n let template = templateCache.stringsArray.get(result.strings);\n if (template !== undefined) {\n return template;\n }\n\n // If the TemplateStringsArray is new, generate a key from the strings\n // This key is shared between all templates with identical content\n const key = result.strings.join(marker);\n\n // Check if we already have a Template for this key\n template = templateCache.keyString.get(key);\n if (template === undefined) {\n // If we have not seen this key before, create a new Template\n template = new Template(result, result.getTemplateElement());\n // Cache the Template for this key\n templateCache.keyString.set(key, template);\n }\n\n // Cache all future queries for this TemplateStringsArray\n templateCache.stringsArray.set(result.strings, template);\n return template;\n}\n\n/**\n * The first argument to JS template tags retain identity across multiple\n * calls to a tag for the same literal, so we can cache work done per literal\n * in a Map.\n *\n * Safari currently has a bug which occasionally breaks this behaviour, so we\n * need to cache the Template at two levels. We first cache the\n * TemplateStringsArray, and if that fails, we cache a key constructed by\n * joining the strings array.\n */\nexport type templateCache = {\n stringsArray: WeakMap<TemplateStringsArray, Template>;\n keyString: Map<string, Template>;\n};\n\nexport const templateCaches = new Map<string, templateCache>();\n","/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * @module lit-html\n */\n\nimport {removeNodes} from './dom.js';\nimport {NodePart} from './parts.js';\nimport {RenderOptions} from './render-options.js';\nimport {templateFactory} from './template-factory.js';\nimport {TemplateResult} from './template-result.js';\n\nexport const parts = new WeakMap<Node, NodePart>();\n\n/**\n * Renders a template to a container.\n *\n * To update a container with new values, reevaluate the template literal and\n * call `render` with the new result.\n *\n * @param result a TemplateResult created by evaluating a template tag like\n * `html` or `svg`.\n * @param container A DOM parent to render to. The entire contents are either\n * replaced, or efficiently updated if the same result type was previous\n * rendered there.\n * @param options RenderOptions for the entire render tree rendered to this\n * container. Render options must *not* change between renders to the same\n * container, as those changes will not effect previously rendered DOM.\n */\nexport const render =\n (result: TemplateResult,\n container: Element|DocumentFragment,\n options?: Partial<RenderOptions>) => {\n let part = parts.get(container);\n if (part === undefined) {\n removeNodes(container, container.firstChild);\n parts.set(container, part = new NodePart({\n templateFactory,\n ...options,\n }));\n part.appendInto(container);\n }\n part.setValue(result);\n part.commit();\n };\n","/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n\n/**\n *\n * Main lit-html module.\n *\n * Main exports:\n *\n * - [[html]]\n * - [[svg]]\n * - [[render]]\n *\n * @module lit-html\n * @preferred\n */\n\n/**\n * Do not remove this comment; it keeps typedoc from misplacing the module\n * docs.\n */\nimport {defaultTemplateProcessor} from './lib/default-template-processor.js';\nimport {SVGTemplateResult, TemplateResult} from './lib/template-result.js';\n\nexport {DefaultTemplateProcessor, defaultTemplateProcessor} from './lib/default-template-processor.js';\nexport {directive, DirectiveFn, isDirective} from './lib/directive.js';\n// TODO(justinfagnani): remove line when we get NodePart moving methods\nexport {removeNodes, reparentNodes} from './lib/dom.js';\nexport {noChange, nothing, Part} from './lib/part.js';\nexport {AttributeCommitter, AttributePart, BooleanAttributePart, EventPart, isPrimitive, NodePart, PropertyCommitter, PropertyPart} from './lib/parts.js';\nexport {RenderOptions} from './lib/render-options.js';\nexport {parts, render} from './lib/render.js';\nexport {templateCaches, templateFactory} from './lib/template-factory.js';\nexport {TemplateInstance} from './lib/template-instance.js';\nexport {TemplateProcessor} from './lib/template-processor.js';\nexport {SVGTemplateResult, TemplateResult} from './lib/template-result.js';\nexport {createMarker, isTemplatePartActive, Template} from './lib/template.js';\n\ndeclare global {\n interface Window {\n litHtmlVersions: string[];\n }\n}\n\n// IMPORTANT: do not change the property name or the assignment expression.\n// This line will be used in regexes to search for lit-html usage.\n// TODO(justinfagnani): inject version number at build time\n(window['litHtmlVersions'] || (window['litHtmlVersions'] = [])).push('1.0.0');\n\n/**\n * Interprets a template literal as an HTML template that can efficiently\n * render to and update a container.\n */\nexport const html = (strings: TemplateStringsArray, ...values: unknown[]) =>\n new TemplateResult(strings, values, 'html', defaultTemplateProcessor);\n\n/**\n * Interprets a template literal as an SVG template that can efficiently\n * render to and update a container.\n */\nexport const svg = (strings: TemplateStringsArray, ...values: unknown[]) =>\n new SVGTemplateResult(strings, values, 'svg', defaultTemplateProcessor);\n","/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * @module shady-render\n */\n\nimport {isTemplatePartActive, Template, TemplatePart} from './template.js';\n\nconst walkerNodeFilter = 133 /* NodeFilter.SHOW_{ELEMENT|COMMENT|TEXT} */;\n\n/**\n * Removes the list of nodes from a Template safely. In addition to removing\n * nodes from the Template, the Template part indices are updated to match\n * the mutated Template DOM.\n *\n * As the template is walked the removal state is tracked and\n * part indices are adjusted as needed.\n *\n * div\n * div#1 (remove) <-- start removing (removing node is div#1)\n * div\n * div#2 (remove) <-- continue removing (removing node is still div#1)\n * div\n * div <-- stop removing since previous sibling is the removing node (div#1,\n * removed 4 nodes)\n */\nexport function removeNodesFromTemplate(\n template: Template, nodesToRemove: Set<Node>) {\n const {element: {content}, parts} = template;\n const walker =\n document.createTreeWalker(content, walkerNodeFilter, null, false);\n let partIndex = nextActiveIndexInTemplateParts(parts);\n let part = parts[partIndex];\n let nodeIndex = -1;\n let removeCount = 0;\n const nodesToRemoveInTemplate = [];\n let currentRemovingNode: Node|null = null;\n while (walker.nextNode()) {\n nodeIndex++;\n const node = walker.currentNode as Element;\n // End removal if stepped past the removing node\n if (node.previousSibling === currentRemovingNode) {\n currentRemovingNode = null;\n }\n // A node to remove was found in the template\n if (nodesToRemove.has(node)) {\n nodesToRemoveInTemplate.push(node);\n // Track node we're removing\n if (currentRemovingNode === null) {\n currentRemovingNode = node;\n }\n }\n // When removing, increment count by which to adjust subsequent part indices\n if (currentRemovingNode !== null) {\n removeCount++;\n }\n while (part !== undefined && part.index === nodeIndex) {\n // If part is in a removed node deactivate it by setting index to -1 or\n // adjust the index as needed.\n part.index = currentRemovingNode !== null ? -1 : part.index - removeCount;\n // go to the next active part.\n partIndex = nextActiveIndexInTemplateParts(parts, partIndex);\n part = parts[partIndex];\n }\n }\n nodesToRemoveInTemplate.forEach((n) => n.parentNode!.removeChild(n));\n}\n\nconst countNodes = (node: Node) => {\n let count = (node.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) ? 0 : 1;\n const walker = document.createTreeWalker(node, walkerNodeFilter, null, false);\n while (walker.nextNode()) {\n count++;\n }\n return count;\n};\n\nconst nextActiveIndexInTemplateParts =\n (parts: TemplatePart[], startIndex: number = -1) => {\n for (let i = startIndex + 1; i < parts.length; i++) {\n const part = parts[i];\n if (isTemplatePartActive(part)) {\n return i;\n }\n }\n return -1;\n };\n\n/**\n * Inserts the given node into the Template, optionally before the given\n * refNode. In addition to inserting the node into the Template, the Template\n * part indices are updated to match the mutated Template DOM.\n */\nexport function insertNodeIntoTemplate(\n template: Template, node: Node, refNode: Node|null = null) {\n const {element: {content}, parts} = template;\n // If there's no refNode, then put node at end of template.\n // No part indices need to be shifted in this case.\n if (refNode === null || refNode === undefined) {\n content.appendChild(node);\n return;\n }\n const walker =\n document.createTreeWalker(content, walkerNodeFilter, null, false);\n let partIndex = nextActiveIndexInTemplateParts(parts);\n let insertCount = 0;\n let walkerIndex = -1;\n while (walker.nextNode()) {\n walkerIndex++;\n const walkerNode = walker.currentNode as Element;\n if (walkerNode === refNode) {\n insertCount = countNodes(node);\n refNode.parentNode!.insertBefore(node, refNode);\n }\n while (partIndex !== -1 && parts[partIndex].index === walkerIndex) {\n // If we've inserted the node, simply adjust all subsequent parts\n if (insertCount > 0) {\n while (partIndex !== -1) {\n parts[partIndex].index += insertCount;\n partIndex = nextActiveIndexInTemplateParts(parts, partIndex);\n }\n return;\n }\n partIndex = nextActiveIndexInTemplateParts(parts, partIndex);\n }\n }\n}\n","/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * Module to add shady DOM/shady CSS polyfill support to lit-html template\n * rendering. See the [[render]] method for details.\n *\n * @module shady-render\n * @preferred\n */\n\n/**\n * Do not remove this comment; it keeps typedoc from misplacing the module\n * docs.\n */\nimport {removeNodes} from './dom.js';\nimport {insertNodeIntoTemplate, removeNodesFromTemplate} from './modify-template.js';\nimport {RenderOptions} from './render-options.js';\nimport {parts, render as litRender} from './render.js';\nimport {templateCaches} from './template-factory.js';\nimport {TemplateInstance} from './template-instance.js';\nimport {TemplateResult} from './template-result.js';\nimport {marker, Template} from './template.js';\n\nexport {html, svg, TemplateResult} from '../lit-html.js';\n\n// Get a key to lookup in `templateCaches`.\nconst getTemplateCacheKey = (type: string, scopeName: string) =>\n `${type}--${scopeName}`;\n\nlet compatibleShadyCSSVersion = true;\n\nif (typeof window.ShadyCSS === 'undefined') {\n compatibleShadyCSSVersion = false;\n} else if (typeof window.ShadyCSS.prepareTemplateDom === 'undefined') {\n console.warn(\n `Incompatible ShadyCSS version detected.` +\n `Please update to at least @webcomponents/webcomponentsjs@2.0.2 and` +\n `@webcomponents/shadycss@1.3.1.`);\n compatibleShadyCSSVersion = false;\n}\n\n/**\n * Template factory which scopes template DOM using ShadyCSS.\n * @param scopeName {string}\n */\nconst shadyTemplateFactory = (scopeName: string) =>\n (result: TemplateResult) => {\n const cacheKey = getTemplateCacheKey(result.type, scopeName);\n let templateCache = templateCaches.get(cacheKey);\n if (templateCache === undefined) {\n templateCache = {\n stringsArray: new WeakMap<TemplateStringsArray, Template>(),\n keyString: new Map<string, Template>()\n };\n templateCaches.set(cacheKey, templateCache);\n }\n\n let template = templateCache.stringsArray.get(result.strings);\n if (template !== undefined) {\n return template;\n }\n\n const key = result.strings.join(marker);\n template = templateCache.keyString.get(key);\n if (template === undefined) {\n const element = result.getTemplateElement();\n if (compatibleShadyCSSVersion) {\n window.ShadyCSS!.prepareTemplateDom(element, scopeName);\n }\n template = new Template(result, element);\n templateCache.keyString.set(key, template);\n }\n templateCache.stringsArray.set(result.strings, template);\n return template;\n };\n\nconst TEMPLATE_TYPES = ['html', 'svg'];\n\n/**\n * Removes all style elements from Templates for the given scopeName.\n */\nconst removeStylesFromLitTemplates = (scopeName: string) => {\n TEMPLATE_TYPES.forEach((type) => {\n const templates = templateCaches.get(getTemplateCacheKey(type, scopeName));\n if (templates !== undefined) {\n templates.keyString.forEach((template) => {\n const {element: {content}} = template;\n // IE 11 doesn't support the iterable param Set constructor\n const styles = new Set<Element>();\n Array.from(content.querySelectorAll('style')).forEach((s: Element) => {\n styles.add(s);\n });\n removeNodesFromTemplate(template, styles);\n });\n }\n });\n};\n\nconst shadyRenderSet = new Set<string>();\n\n/**\n * For the given scope name, ensures that ShadyCSS style scoping is performed.\n * This is done just once per scope name so the fragment and template cannot\n * be modified.\n * (1) extracts styles from the rendered fragment and hands them to ShadyCSS\n * to be scoped and appended to the document\n * (2) removes style elements from all lit-html Templates for this scope name.\n *\n * Note, <style> elements can only be placed into templates for the\n * initial rendering of the scope. If <style> elements are included in templates\n * dynamically rendered to the scope (after the first scope render), they will\n * not be scoped and the <style> will be left in the template and rendered\n * output.\n */\nconst prepareTemplateStyles =\n (renderedDOM: DocumentFragment, template: Template, scopeName: string) => {\n shadyRenderSet.add(scopeName);\n // Move styles out of rendered DOM and store.\n const styles = renderedDOM.querySelectorAll('style');\n // If there are no styles, skip unnecessary work\n if (styles.length === 0) {\n // Ensure prepareTemplateStyles is called to support adding\n // styles via `prepareAdoptedCssText` since that requires that\n // `prepareTemplateStyles` is called.\n window.ShadyCSS!.prepareTemplateStyles(template.element, scopeName);\n return;\n }\n const condensedStyle = document.createElement('style');\n // Collect styles into a single style. This helps us make sure ShadyCSS\n // manipulations will not prevent us from being able to fix up template\n // part indices.\n // NOTE: collecting styles is inefficient for browsers but ShadyCSS\n // currently does this anyway. When it does not, this should be changed.\n for (let i = 0; i < styles.length; i++) {\n const style = styles[i];\n style.parentNode!.removeChild(style);\n condensedStyle.textContent! += style.textContent;\n }\n // Remove styles from nested templates in this scope.\n removeStylesFromLitTemplates(scopeName);\n // And then put the condensed style into the \"root\" template passed in as\n // `template`.\n insertNodeIntoTemplate(\n template, condensedStyle, template.element.content.firstChild);\n // Note, it's important that ShadyCSS gets the template that `lit-html`\n // will actually render so that it can update the style inside when\n // needed (e.g. @apply native Shadow DOM case).\n window.ShadyCSS!.prepareTemplateStyles(template.element, scopeName);\n if (window.ShadyCSS!.nativeShadow) {\n // When in native Shadow DOM, re-add styling to rendered content using\n // the style ShadyCSS produced.\n const style = template.element.content.querySelector('style')!;\n renderedDOM.insertBefore(style.cloneNode(true), renderedDOM.firstChild);\n } else {\n // When not in native Shadow DOM, at this point ShadyCSS will have\n // removed the style from the lit template and parts will be broken as a\n // result. To fix this, we put back the style node ShadyCSS removed\n // and then tell lit to remove that node from the template.\n // NOTE, ShadyCSS creates its own style so we can safely add/remove\n // `condensedStyle` here.\n template.element.content.insertBefore(\n condensedStyle, template.element.content.firstChild);\n const removes = new Set();\n removes.add(condensedStyle);\n removeNodesFromTemplate(template, removes);\n }\n };\n\nexport interface ShadyRenderOptions extends Partial<RenderOptions> {\n scopeName: string;\n}\n\n/**\n * Extension to the standard `render` method which supports rendering\n * to ShadowRoots when the ShadyDOM (https://github.com/webcomponents/shadydom)\n * and ShadyCSS (https://github.com/webcomponents/shadycss) polyfills are used\n * or when the webcomponentsjs\n * (https://github.com/webcomponents/webcomponentsjs) polyfill is used.\n *\n * Adds a `scopeName` option which is used to scope element DOM and stylesheets\n * when native ShadowDOM is unavailable. The `scopeName` will be added to\n * the class attribute of all rendered DOM. In addition, any style elements will\n * be automatically re-written with this `scopeName` selector and moved out\n * of the rendered DOM and into the document `<head>`.\n *\n * It is common to use this render method in conjunction with a custom element\n * which renders a shadowRoot. When this is done, typically the element's\n * `localName` should be used as the `scopeName`.\n *\n * In addition to DOM scoping, ShadyCSS also supports a basic shim for css\n * custom properties (needed only on older browsers like IE11) and a shim for\n * a deprecated feature called `@apply` that supports applying a set of css\n * custom properties to a given location.\n *\n * Usage considerations:\n *\n * * Part values in `<style>` elements are only applied the first time a given\n * `scopeName` renders. Subsequent changes to parts in style elements will have\n * no effect. Because of this, parts in style elements should only be used for\n * values that will never change, for example parts that set scope-wide theme\n * values or parts which render shared style elements.\n *\n * * Note, due to a limitation of the ShadyDOM polyfill, rendering in a\n * custom element's `constructor` is not supported. Instead rendering should\n * either done asynchronously, for example at microtask timing (for example\n * `Promise.resolve()`), or be deferred until the first time the element's\n * `connectedCallback` runs.\n *\n * Usage considerations when using shimmed custom properties or `@apply`:\n *\n * * Whenever any dynamic changes are made which affect\n * css custom properties, `ShadyCSS.styleElement(element)` must be called\n * to update the element. There are two cases when this is needed:\n * (1) the element is connected to a new parent, (2) a class is added to the\n * element that causes it to match different custom properties.\n * To address the first case when rendering a custom element, `styleElement`\n * should be called in the element's `connectedCallback`.\n *\n * * Shimmed custom properties may only be defined either for an entire\n * shadowRoot (for example, in a `:host` rule) or via a rule that directly\n * matches an element with a shadowRoot. In other words, instead of flowing from\n * parent to child as do native css custom properties, shimmed custom properties\n * flow only from shadowRoots to nested shadowRoots.\n *\n * * When using `@apply` mixing css shorthand property names with\n * non-shorthand names (for example `border` and `border-width`) is not\n * supported.\n */\nexport const render =\n (result: TemplateResult,\n container: Element|DocumentFragment,\n options: ShadyRenderOptions) => {\n const scopeName = options.scopeName;\n const hasRendered = parts.has(container);\n const needsScoping = container instanceof ShadowRoot &&\n compatibleShadyCSSVersion && result instanceof TemplateResult;\n // Handle first render to a scope specially...\n const firstScopeRender = needsScoping && !shadyRenderSet.has(scopeName);\n // On first scope render, render into a fragment; this cannot be a single\n // fragment that is reused since nested renders can occur synchronously.\n const renderContainer =\n firstScopeRender ? document.createDocumentFragment() : container;\n litRender(\n result,\n renderContainer,\n {templateFactory: shadyTemplateFactory(scopeName), ...options} as\n RenderOptions);\n // When performing first scope render,\n // (1) We've rendered into a fragment so that there's a chance to\n // `prepareTemplateStyles` before sub-elements hit the DOM\n // (which might cause them to render based on a common pattern of\n // rendering in a custom element's `connectedCallback`);\n // (2) Scope the template with ShadyCSS one time only for this scope.\n // (3) Render the fragment into the container and make sure the\n // container knows its `part` is the one we just rendered. This ensures\n // DOM will be re-used on subsequent renders.\n if (firstScopeRender) {\n const part = parts.get(renderContainer)!;\n parts.delete(renderContainer);\n if (part.value instanceof TemplateInstance) {\n prepareTemplateStyles(\n renderContainer as DocumentFragment,\n part.value.template,\n scopeName);\n }\n removeNodes(container, container.firstChild);\n container.appendChild(renderContainer);\n parts.set(container, part);\n }\n // After elements have hit the DOM, update styling if this is the\n // initial render to this container.\n // This is needed whenever dynamic changes are made so it would be\n // safest to do every render; however, this would regress performance\n // so we leave it up to the user to call `ShadyCSSS.styleElement`\n // for dynamic changes.\n if (!hasRendered && needsScoping) {\n window.ShadyCSS!.styleElement((container as ShadowRoot).host);\n }\n };\n","/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * When using Closure Compiler, JSCompiler_renameProperty(property, object) is\n * replaced at compile time by the munged name for object[property]. We cannot\n * alias this function, so we have to use a small shim that has the same\n * behavior when not compiling.\n */\nwindow.JSCompiler_renameProperty =\n <P extends PropertyKey>(prop: P, _obj: unknown): P => prop;\n\ndeclare global {\n var JSCompiler_renameProperty: <P extends PropertyKey>(\n prop: P, _obj: unknown) => P;\n\n interface Window {\n JSCompiler_renameProperty: typeof JSCompiler_renameProperty;\n }\n}\n\n/**\n * Converts property values to and from attribute values.\n */\nexport interface ComplexAttributeConverter<Type = unknown, TypeHint = unknown> {\n /**\n * Function called to convert an attribute value to a property\n * value.\n */\n fromAttribute?(value: string|null, type?: TypeHint): Type;\n\n /**\n * Function called to convert a property value to an attribute\n * value.\n *\n * It returns unknown instead of string, to be compatible with\n * https://github.com/WICG/trusted-types (and similar efforts).\n */\n toAttribute?(value: Type, type?: TypeHint): unknown;\n}\n\ntype AttributeConverter<Type = unknown, TypeHint = unknown> =\n ComplexAttributeConverter<Type>|((value: string, type?: TypeHint) => Type);\n\n/**\n * Defines options for a property accessor.\n */\nexport interface PropertyDeclaration<Type = unknown, TypeHint = unknown> {\n /**\n * Indicates how and whether the property becomes an observed attribute.\n * If the value is `false`, the property is not added to `observedAttributes`.\n * If true or absent, the lowercased property name is observed (e.g. `fooBar`\n * becomes `foobar`). If a string, the string value is observed (e.g\n * `attribute: 'foo-bar'`).\n */\n readonly attribute?: boolean|string;\n\n /**\n * Indicates the type of the property. This is used only as a hint for the\n * `converter` to determine how to convert the attribute\n * to/from a property.\n */\n readonly type?: TypeHint;\n\n /**\n * Indicates how to convert the attribute to/from a property. If this value\n * is a function, it is used to convert the attribute value a the property\n * value. If it's an object, it can have keys for `fromAttribute` and\n * `toAttribute`. If no `toAttribute` function is provided and\n * `reflect` is set to `true`, the property value is set directly to the\n * attribute. A default `converter` is used if none is provided; it supports\n * `Boolean`, `String`, `Number`, `Object`, and `Array`. Note,\n * when a property changes and the converter is used to update the attribute,\n * the property is never updated again as a result of the attribute changing,\n * and vice versa.\n */\n readonly converter?: AttributeConverter<Type, TypeHint>;\n\n /**\n * Indicates if the property should reflect to an attribute.\n * If `true`, when the property is set, the attribute is set using the\n * attribute name determined according to the rules for the `attribute`\n * property option and the value of the property converted using the rules\n * from the `converter` property option.\n */\n readonly reflect?: boolean;\n\n /**\n * A function that indicates if a property should be considered changed when\n * it is set. The function should take the `newValue` and `oldValue` and\n * return `true` if an update should be requested.\n */\n hasChanged?(value: Type, oldValue: Type): boolean;\n\n /**\n * Indicates whether an accessor will be created for this property. By\n * default, an accessor will be generated for this property that requests an\n * update when set. If this flag is `true`, no accessor will be created, and\n * it will be the user's responsibility to call\n * `this.requestUpdate(propertyName, oldValue)` to request an update when\n * the property changes.\n */\n readonly noAccessor?: boolean;\n}\n\n/**\n * Map of properties to PropertyDeclaration options. For each property an\n * accessor is made, and the property is processed according to the\n * PropertyDeclaration options.\n */\nexport interface PropertyDeclarations {\n readonly [key: string]: PropertyDeclaration;\n}\n\ntype PropertyDeclarationMap = Map<PropertyKey, PropertyDeclaration>;\n\ntype AttributeMap = Map<string, PropertyKey>;\n\nexport type PropertyValues = Map<PropertyKey, unknown>;\n\nexport const defaultConverter: ComplexAttributeConverter = {\n\n toAttribute(value: unknown, type?: unknown): unknown {\n switch (type) {\n case Boolean:\n return value ? '' : null;\n case Object:\n case Array:\n // if the value is `null` or `undefined` pass this through\n // to allow removing/no change behavior.\n return value == null ? value : JSON.stringify(value);\n }\n return value;\n },\n\n fromAttribute(value: string|null, type?: unknown) {\n switch (type) {\n case Boolean:\n return value !== null;\n case Number:\n return value === null ? null : Number(value);\n case Object:\n case Array:\n return JSON.parse(value!);\n }\n return value;\n }\n\n};\n\nexport interface HasChanged {\n (value: unknown, old: unknown): boolean;\n}\n\n/**\n * Change function that returns true if `value` is different from `oldValue`.\n * This method is used as the default for a property's `hasChanged` function.\n */\nexport const notEqual: HasChanged = (value: unknown, old: unknown): boolean => {\n // This ensures (old==NaN, value==NaN) always returns false\n return old !== value && (old === old || value === value);\n};\n\nconst defaultPropertyDeclaration: PropertyDeclaration = {\n attribute: true,\n type: String,\n converter: defaultConverter,\n reflect: false,\n hasChanged: notEqual\n};\n\nconst microtaskPromise = Promise.resolve(true);\n\nconst STATE_HAS_UPDATED = 1;\nconst STATE_UPDATE_REQUESTED = 1 << 2;\nconst STATE_IS_REFLECTING_TO_ATTRIBUTE = 1 << 3;\nconst STATE_IS_REFLECTING_TO_PROPERTY = 1 << 4;\nconst STATE_HAS_CONNECTED = 1 << 5;\ntype UpdateState = typeof STATE_HAS_UPDATED|typeof STATE_UPDATE_REQUESTED|\n typeof STATE_IS_REFLECTING_TO_ATTRIBUTE|\n typeof STATE_IS_REFLECTING_TO_PROPERTY|typeof STATE_HAS_CONNECTED;\n\n/**\n * Base element class which manages element properties and attributes. When\n * properties change, the `update` method is asynchronously called. This method\n * should be supplied by subclassers to render updates as desired.\n */\nexport abstract class UpdatingElement extends HTMLElement {\n /*\n * Due to closure compiler ES6 compilation bugs, @nocollapse is required on\n * all static methods and properties with initializers. Reference:\n * - https://github.com/google/closure-compiler/issues/1776\n */\n\n /**\n * Maps attribute names to properties; for example `foobar` attribute to\n * `fooBar` property. Created lazily on user subclasses when finalizing the\n * class.\n */\n private static _attributeToPropertyMap: AttributeMap;\n\n /**\n * Marks class as having finished creating properties.\n */\n protected static finalized = true;\n\n /**\n * Memoized list of all class properties, including any superclass properties.\n * Created lazily on user subclasses when finalizing the class.\n */\n private static _classProperties?: PropertyDeclarationMap;\n\n /**\n * User-supplied object that maps property names to `PropertyDeclaration`\n * objects containing options for configuring the property.\n */\n static properties: PropertyDeclarations;\n\n /**\n * Returns a list of attributes corresponding to the registered properties.\n * @nocollapse\n */\n static get observedAttributes() {\n // note: piggy backing on this to ensure we're finalized.\n this.finalize();\n const attributes: string[] = [];\n // Use forEach so this works even if for/of loops are compiled to for loops\n // expecting arrays\n this._classProperties!.forEach((v, p) => {\n const attr = this._attributeNameForProperty(p, v);\n if (attr !== undefined) {\n this._attributeToPropertyMap.set(attr, p);\n attributes.push(attr);\n }\n });\n return attributes;\n }\n\n /**\n * Ensures the private `_classProperties` property metadata is created.\n * In addition to `finalize` this is also called in `createProperty` to\n * ensure the `@property` decorator can add property metadata.\n */\n /** @nocollapse */\n private static _ensureClassProperties() {\n // ensure private storage for property declarations.\n if (!this.hasOwnProperty(\n JSCompiler_renameProperty('_classProperties', this))) {\n this._classProperties = new Map();\n // NOTE: Workaround IE11 not supporting Map constructor argument.\n const superProperties: PropertyDeclarationMap =\n Object.getPrototypeOf(this)._classProperties;\n if (superProperties !== undefined) {\n superProperties.forEach(\n (v: PropertyDeclaration, k: PropertyKey) =>\n this._classProperties!.set(k, v));\n }\n }\n }\n\n /**\n * Creates a property accessor on the element prototype if one does not exist.\n * The property setter calls the property's `hasChanged` property option\n * or uses a strict identity check to determine whether or not to request\n * an update.\n * @nocollapse\n */\n static createProperty(\n name: PropertyKey,\n options: PropertyDeclaration = defaultPropertyDeclaration) {\n // Note, since this can be called by the `@property` decorator which\n // is called before `finalize`, we ensure storage exists for property\n // metadata.\n this._ensureClassProperties();\n this._classProperties!.set(name, options);\n // Do not generate an accessor if the prototype already has one, since\n // it would be lost otherwise and that would never be the user's intention;\n // Instead, we expect users to call `requestUpdate` themselves from\n // user-defined accessors. Note that if the super has an accessor we will\n // still overwrite it\n if (options.noAccessor || this.prototype.hasOwnProperty(name)) {\n return;\n }\n const key = typeof name === 'symbol' ? Symbol() : `__${name}`;\n Object.defineProperty(this.prototype, name, {\n // tslint:disable-next-line:no-any no symbol in index\n get(): any {\n return this[key];\n },\n set(this: UpdatingElement, value: unknown) {\n // tslint:disable-next-line:no-any no symbol in index\n const oldValue = (this as any)[name];\n // tslint:disable-next-line:no-any no symbol in index\n (this as any)[key] = value;\n this._requestUpdate(name, oldValue);\n },\n configurable: true,\n enumerable: true\n });\n }\n\n /**\n * Creates property accessors for registered properties and ensures\n * any superclasses are also finalized.\n * @nocollapse\n */\n protected static finalize() {\n if (this.hasOwnProperty(JSCompiler_renameProperty('finalized', this)) &&\n this.finalized) {\n return;\n }\n // finalize any superclasses\n const superCtor = Object.getPrototypeOf(this);\n if (typeof superCtor.finalize === 'function') {\n superCtor.finalize();\n }\n this.finalized = true;\n this._ensureClassProperties();\n // initialize Map populated in observedAttributes\n this._attributeToPropertyMap = new Map();\n // make any properties\n // Note, only process \"own\" properties since this element will inherit\n // any properties defined on the superClass, and finalization ensures\n // the entire prototype chain is finalized.\n if (this.hasOwnProperty(JSCompiler_renameProperty('properties', this))) {\n const props = this.properties;\n // support symbols in properties (IE11 does not support this)\n const propKeys = [\n ...Object.getOwnPropertyNames(props),\n ...(typeof Object.getOwnPropertySymbols === 'function') ?\n Object.getOwnPropertySymbols(props) :\n []\n ];\n // This for/of is ok because propKeys is an array\n for (const p of propKeys) {\n // note, use of `any` is due to TypeSript lack of support for symbol in\n // index types\n // tslint:disable-next-line:no-any no symbol in index\n this.createProperty(p, (props as any)[p]);\n }\n }\n }\n\n /**\n * Returns the property name for the given attribute `name`.\n * @nocollapse\n */\n private static _attributeNameForProperty(\n name: PropertyKey, options: PropertyDeclaration) {\n const attribute = options.attribute;\n return attribute === false ?\n undefined :\n (typeof attribute === 'string' ?\n attribute :\n (typeof name === 'string' ? name.toLowerCase() : undefined));\n }\n\n /**\n * Returns true if a property should request an update.\n * Called when a property value is set and uses the `hasChanged`\n * option for the property if present or a strict identity check.\n * @nocollapse\n */\n private static _valueHasChanged(\n value: unknown, old: unknown, hasChanged: HasChanged = notEqual) {\n return hasChanged(value, old);\n }\n\n /**\n * Returns the property value for the given attribute value.\n * Called via the `attributeChangedCallback` and uses the property's\n * `converter` or `converter.fromAttribute` property option.\n * @nocollapse\n */\n private static _propertyValueFromAttribute(\n value: string|null, options: PropertyDeclaration) {\n const type = options.type;\n const converter = options.converter || defaultConverter;\n const fromAttribute =\n (typeof converter === 'function' ? converter : converter.fromAttribute);\n return fromAttribute ? fromAttribute(value, type) : value;\n }\n\n /**\n * Returns the attribute value for the given property value. If this\n * returns undefined, the property will *not* be reflected to an attribute.\n * If this returns null, the attribute will be removed, otherwise the\n * attribute will be set to the value.\n * This uses the property's `reflect` and `type.toAttribute` property options.\n * @nocollapse\n */\n private static _propertyValueToAttribute(\n value: unknown, options: PropertyDeclaration) {\n if (options.reflect === undefined) {\n return;\n }\n const type = options.type;\n const converter = options.converter;\n const toAttribute =\n converter && (converter as ComplexAttributeConverter).toAttribute ||\n defaultConverter.toAttribute;\n return toAttribute!(value, type);\n }\n\n private _updateState: UpdateState = 0;\n private _instanceProperties: PropertyValues|undefined = undefined;\n private _updatePromise: Promise<unknown> = microtaskPromise;\n private _hasConnectedResolver: (() => void)|undefined = undefined;\n\n /**\n * Map with keys for any properties that have changed since the last\n * update cycle with previous values.\n */\n private _changedProperties: PropertyValues = new Map();\n\n /**\n * Map with keys of properties that should be reflected when updated.\n */\n private _reflectingProperties: Map<PropertyKey, PropertyDeclaration>|\n undefined = undefined;\n\n constructor() {\n super();\n this.initialize();\n }\n\n /**\n * Performs element initialization. By default captures any pre-set values for\n * registered properties.\n */\n protected initialize() {\n this._saveInstanceProperties();\n // ensures first update will be caught by an early access of `updateComplete`\n this._requestUpdate();\n }\n\n /**\n * Fixes any properties set on the instance before upgrade time.\n * Otherwise these would shadow the accessor and break these properties.\n * The properties are stored in a Map which is played back after the\n * constructor runs. Note, on very old versions of Safari (<=9) or Chrome\n * (<=41), properties created for native platform properties like (`id` or\n * `name`) may not have default values set in the element constructor. On\n * these browsers native properties appear on instances and therefore their\n * default value will overwrite any element default (e.g. if the element sets\n * this.id = 'id' in the constructor, the 'id' will become '' since this is\n * the native platform default).\n */\n private _saveInstanceProperties() {\n // Use forEach so this works even if for/of loops are compiled to for loops\n // expecting arrays\n (this.constructor as typeof UpdatingElement)\n ._classProperties!.forEach((_v, p) => {\n if (this.hasOwnProperty(p)) {\n const value = this[p as keyof this];\n delete this[p as keyof this];\n if (!this._instanceProperties) {\n this._instanceProperties = new Map();\n }\n this._instanceProperties.set(p, value);\n }\n });\n }\n\n /**\n * Applies previously saved instance properties.\n */\n private _applyInstanceProperties() {\n // Use forEach so this works even if for/of loops are compiled to for loops\n // expecting arrays\n // tslint:disable-next-line:no-any\n this._instanceProperties!.forEach((v, p) => (this as any)[p] = v);\n this._instanceProperties = undefined;\n }\n\n connectedCallback() {\n this._updateState = this._updateState | STATE_HAS_CONNECTED;\n // Ensure first connection completes an update. Updates cannot complete before\n // connection and if one is pending connection the `_hasConnectionResolver`\n // will exist. If so, resolve it to complete the update, otherwise\n // requestUpdate.\n if (this._hasConnectedResolver) {\n this._hasConnectedResolver();\n this._hasConnectedResolver = undefined;\n }\n }\n\n /**\n * Allows for `super.disconnectedCallback()` in extensions while\n * reserving the possibility of making non-breaking feature additions\n * when disconnecting at some point in the future.\n */\n disconnectedCallback() {\n }\n\n /**\n * Synchronizes property values when attributes change.\n */\n attributeChangedCallback(name: string, old: string|null, value: string|null) {\n if (old !== value) {\n this._attributeToProperty(name, value);\n }\n }\n\n private _propertyToAttribute(\n name: PropertyKey, value: unknown,\n options: PropertyDeclaration = defaultPropertyDeclaration) {\n const ctor = (this.constructor as typeof UpdatingElement);\n const attr = ctor._attributeNameForProperty(name, options);\n if (attr !== undefined) {\n const attrValue = ctor._propertyValueToAttribute(value, options);\n // an undefined value does not change the attribute.\n if (attrValue === undefined) {\n return;\n }\n // Track if the property is being reflected to avoid\n // setting the property again via `attributeChangedCallback`. Note:\n // 1. this takes advantage of the fact that the callback is synchronous.\n // 2. will behave incorrectly if multiple attributes are in the reaction\n // stack at time of calling. However, since we process attributes\n // in `update` this should not be possible (or an extreme corner case\n // that we'd like to discover).\n // mark state reflecting\n this._updateState = this._updateState | STATE_IS_REFLECTING_TO_ATTRIBUTE;\n if (attrValue == null) {\n this.removeAttribute(attr);\n } else {\n this.setAttribute(attr, attrValue as string);\n }\n // mark state not reflecting\n this._updateState = this._updateState & ~STATE_IS_REFLECTING_TO_ATTRIBUTE;\n }\n }\n\n private _attributeToProperty(name: string, value: string|null) {\n // Use tracking info to avoid deserializing attribute value if it was\n // just set from a property setter.\n if (this._updateState & STATE_IS_REFLECTING_TO_ATTRIBUTE) {\n return;\n }\n const ctor = (this.constructor as typeof UpdatingElement);\n const propName = ctor._attributeToPropertyMap.get(name);\n if (propName !== undefined) {\n const options =\n ctor._classProperties!.get(propName) || defaultPropertyDeclaration;\n // mark state reflecting\n this._updateState = this._updateState | STATE_IS_REFLECTING_TO_PROPERTY;\n this[propName as keyof this] =\n // tslint:disable-next-line:no-any\n ctor._propertyValueFromAttribute(value, options) as any;\n // mark state not reflecting\n this._updateState = this._updateState & ~STATE_IS_REFLECTING_TO_PROPERTY;\n }\n }\n\n /**\n * This private version of `requestUpdate` does not access or return the\n * `updateComplete` promise. This promise can be overridden and is therefore\n * not free to access.\n */\n private _requestUpdate(name?: PropertyKey, oldValue?: unknown) {\n let shouldRequestUpdate = true;\n // If we have a property key, perform property update steps.\n if (name !== undefined) {\n const ctor = this.constructor as typeof UpdatingElement;\n const options =\n ctor._classProperties!.get(name) || defaultPropertyDeclaration;\n if (ctor._valueHasChanged(\n this[name as keyof this], oldValue, options.hasChanged)) {\n if (!this._changedProperties.has(name)) {\n this._changedProperties.set(name, oldValue);\n }\n // Add to reflecting properties set.\n // Note, it's important that every change has a chance to add the\n // property to `_reflectingProperties`. This ensures setting\n // attribute + property reflects correctly.\n if (options.reflect === true &&\n !(this._updateState & STATE_IS_REFLECTING_TO_PROPERTY)) {\n if (this._reflectingProperties === undefined) {\n this._reflectingProperties = new Map();\n }\n this._reflectingProperties.set(name, options);\n }\n } else {\n // Abort the request if the property should not be considered changed.\n shouldRequestUpdate = false;\n }\n }\n if (!this._hasRequestedUpdate && shouldRequestUpdate) {\n this._enqueueUpdate();\n }\n }\n\n /**\n * Requests an update which is processed asynchronously. This should\n * be called when an element should update based on some state not triggered\n * by setting a property. In this case, pass no arguments. It should also be\n * called when manually implementing a property setter. In this case, pass the\n * property `name` and `oldValue` to ensure that any configured property\n * options are honored. Returns the `updateComplete` Promise which is resolved\n * when the update completes.\n *\n * @param name {PropertyKey} (optional) name of requesting property\n * @param oldValue {any} (optional) old value of requesting property\n * @returns {Promise} A Promise that is resolved when the update completes.\n */\n requestUpdate(name?: PropertyKey, oldValue?: unknown) {\n this._requestUpdate(name, oldValue);\n return this.updateComplete;\n }\n\n /**\n * Sets up the element to asynchronously update.\n */\n private async _enqueueUpdate() {\n // Mark state updating...\n this._updateState = this._updateState | STATE_UPDATE_REQUESTED;\n let resolve!: (r: boolean) => void;\n let reject!: (e: Error) => void;\n const previousUpdatePromise = this._updatePromise;\n this._updatePromise = new Promise((res, rej) => {\n resolve = res;\n reject = rej;\n });\n try {\n // Ensure any previous update has resolved before updating.\n // This `await` also ensures that property changes are batched.\n await previousUpdatePromise;\n } catch (e) {\n // Ignore any previous errors. We only care that the previous cycle is\n // done. Any error should have been handled in the previous update.\n }\n // Make sure the element has connected before updating.\n if (!this._hasConnected) {\n await new Promise((res) => this._hasConnectedResolver = res);\n }\n try {\n const result = this.performUpdate();\n // If `performUpdate` returns a Promise, we await it. This is done to\n // enable coordinating updates with a scheduler. Note, the result is\n // checked to avoid delaying an additional microtask unless we need to.\n if (result != null) {\n await result;\n }\n } catch (e) {\n reject(e);\n }\n resolve(!this._hasRequestedUpdate);\n }\n\n private get _hasConnected() {\n return (this._updateState & STATE_HAS_CONNECTED);\n }\n\n private get _hasRequestedUpdate() {\n return (this._updateState & STATE_UPDATE_REQUESTED);\n }\n\n protected get hasUpdated() {\n return (this._updateState & STATE_HAS_UPDATED);\n }\n\n /**\n * Performs an element update. Note, if an exception is thrown during the\n * update, `firstUpdated` and `updated` will not be called.\n *\n * You can override this method to change the timing of updates. If this\n * method is overridden, `super.performUpdate()` must be called.\n *\n * For instance, to schedule updates to occur just before the next frame:\n *\n * ```\n * protected async performUpdate(): Promise<unknown> {\n * await new Promise((resolve) => requestAnimationFrame(() => resolve()));\n * super.performUpdate();\n * }\n * ```\n */\n protected performUpdate(): void|Promise<unknown> {\n // Mixin instance properties once, if they exist.\n if (this._instanceProperties) {\n this._applyInstanceProperties();\n }\n let shouldUpdate = false;\n const changedProperties = this._changedProperties;\n try {\n shouldUpdate = this.shouldUpdate(changedProperties);\n if (shouldUpdate) {\n this.update(changedProperties);\n }\n } catch (e) {\n // Prevent `firstUpdated` and `updated` from running when there's an\n // update exception.\n shouldUpdate = false;\n throw e;\n } finally {\n // Ensure element can accept additional updates after an exception.\n this._markUpdated();\n }\n if (shouldUpdate) {\n if (!(this._updateState & STATE_HAS_UPDATED)) {\n this._updateState = this._updateState | STATE_HAS_UPDATED;\n this.firstUpdated(changedProperties);\n }\n this.updated(changedProperties);\n }\n }\n\n private _markUpdated() {\n this._changedProperties = new Map();\n this._updateState = this._updateState & ~STATE_UPDATE_REQUESTED;\n }\n\n /**\n * Returns a Promise that resolves when the element has completed updating.\n * The Promise value is a boolean that is `true` if the element completed the\n * update without triggering another update. The Promise result is `false` if\n * a property was set inside `updated()`. If the Promise is rejected, an\n * exception was thrown during the update. This getter can be implemented to\n * await additional state. For example, it is sometimes useful to await a\n * rendered element before fulfilling this Promise. To do this, first await\n * `super.updateComplete` then any subsequent state.\n *\n * @returns {Promise} The Promise returns a boolean that indicates if the\n * update resolved without triggering another update.\n */\n get updateComplete() {\n return this._updatePromise;\n }\n\n /**\n * Controls whether or not `update` should be called when the element requests\n * an update. By default, this method always returns `true`, but this can be\n * customized to control when to update.\n *\n * * @param _changedProperties Map of changed properties with old values\n */\n protected shouldUpdate(_changedProperties: PropertyValues): boolean {\n return true;\n }\n\n /**\n * Updates the element. This method reflects property values to attributes.\n * It can be overridden to render and keep updated element DOM.\n * Setting properties inside this method will *not* trigger\n * another update.\n *\n * * @param _changedProperties Map of changed properties with old values\n */\n protected update(_changedProperties: PropertyValues) {\n if (this._reflectingProperties !== undefined &&\n this._reflectingProperties.size > 0) {\n // Use forEach so this works even if for/of loops are compiled to for\n // loops expecting arrays\n this._reflectingProperties.forEach(\n (v, k) => this._propertyToAttribute(k, this[k as keyof this], v));\n this._reflectingProperties = undefined;\n }\n }\n\n /**\n * Invoked whenever the element is updated. Implement to perform\n * post-updating tasks via DOM APIs, for example, focusing an element.\n *\n * Setting properties inside this method will trigger the element to update\n * again after this update cycle completes.\n *\n * * @param _changedProperties Map of changed properties with old values\n */\n protected updated(_changedProperties: PropertyValues) {\n }\n\n /**\n * Invoked when the element is first updated. Implement to perform one time\n * work on the element after update.\n *\n * Setting properties inside this method will trigger the element to update\n * again after this update cycle completes.\n *\n * * @param _changedProperties Map of changed properties with old values\n */\n protected firstUpdated(_changedProperties: PropertyValues) {\n }\n}\n","/**\n@license\nCopyright (c) 2019 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\n\nexport const supportsAdoptingStyleSheets =\n ('adoptedStyleSheets' in Document.prototype) &&\n ('replace' in CSSStyleSheet.prototype);\n\nconst constructionToken = Symbol();\n\nexport class CSSResult {\n _styleSheet?: CSSStyleSheet|null;\n\n readonly cssText: string;\n\n constructor(cssText: string, safeToken: symbol) {\n if (safeToken !== constructionToken) {\n throw new Error(\n 'CSSResult is not constructable. Use `unsafeCSS` or `css` instead.');\n }\n this.cssText = cssText;\n }\n\n // Note, this is a getter so that it's lazy. In practice, this means\n // stylesheets are not created until the first element instance is made.\n get styleSheet(): CSSStyleSheet|null {\n if (this._styleSheet === undefined) {\n // Note, if `adoptedStyleSheets` is supported then we assume CSSStyleSheet\n // is constructable.\n if (supportsAdoptingStyleSheets) {\n this._styleSheet = new CSSStyleSheet();\n this._styleSheet.replaceSync(this.cssText);\n } else {\n this._styleSheet = null;\n }\n }\n return this._styleSheet;\n }\n\n toString(): string {\n return this.cssText;\n }\n}\n\n/**\n * Wrap a value for interpolation in a css tagged template literal.\n *\n * This is unsafe because untrusted CSS text can be used to phone home\n * or exfiltrate data to an attacker controlled site. Take care to only use\n * this with trusted input.\n */\nexport const unsafeCSS = (value: unknown) => {\n return new CSSResult(String(value), constructionToken);\n};\n\nconst textFromCSSResult = (value: CSSResult) => {\n if (value instanceof CSSResult) {\n return value.cssText;\n } else {\n throw new Error(\n `Value passed to 'css' function must be a 'css' function result: ${\n value}. Use 'unsafeCSS' to pass non-literal values, but\n take care to ensure page security.`);\n }\n};\n\n/**\n * Template tag which which can be used with LitElement's `style` property to\n * set element styles. For security reasons, only literal string values may be\n * used. To incorporate non-literal values `unsafeCSS` may be used inside a\n * template string part.\n */\nexport const css = (strings: TemplateStringsArray, ...values: CSSResult[]) => {\n const cssText = values.reduce(\n (acc, v, idx) => acc + textFromCSSResult(v) + strings[idx + 1],\n strings[0]);\n return new CSSResult(cssText, constructionToken);\n};\n","/**\n * @license\n * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at\n * http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at\n * http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at\n * http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at\n * http://polymer.github.io/PATENTS.txt\n */\nimport {TemplateResult} from 'lit-html';\nimport {render} from 'lit-html/lib/shady-render.js';\n\nimport {PropertyValues, UpdatingElement} from './lib/updating-element.js';\n\nexport * from './lib/updating-element.js';\nexport * from './lib/decorators.js';\nexport {html, svg, TemplateResult, SVGTemplateResult} from 'lit-html/lit-html.js';\nimport {supportsAdoptingStyleSheets, CSSResult} from './lib/css-tag.js';\nexport * from './lib/css-tag.js';\n\ndeclare global {\n interface Window {\n litElementVersions: string[];\n }\n}\n\n// IMPORTANT: do not change the property name or the assignment expression.\n// This line will be used in regexes to search for LitElement usage.\n// TODO(justinfagnani): inject version number at build time\n(window['litElementVersions'] || (window['litElementVersions'] = []))\n .push('2.0.1');\n\nexport interface CSSResultArray extends Array<CSSResult|CSSResultArray> {}\n\n/**\n * Minimal implementation of Array.prototype.flat\n * @param arr the array to flatten\n * @param result the accumlated result\n */\nfunction arrayFlat(\n styles: CSSResultArray, result: CSSResult[] = []): CSSResult[] {\n for (let i = 0, length = styles.length; i < length; i++) {\n const value = styles[i];\n if (Array.isArray(value)) {\n arrayFlat(value, result);\n } else {\n result.push(value);\n }\n }\n return result;\n}\n\n/** Deeply flattens styles array. Uses native flat if available. */\nconst flattenStyles = (styles: CSSResultArray): CSSResult[] =>\n styles.flat ? styles.flat(Infinity) : arrayFlat(styles);\n\nexport class LitElement extends UpdatingElement {\n /**\n * Ensure this class is marked as `finalized` as an optimization ensuring\n * it will not needlessly try to `finalize`.\n */\n protected static finalized = true;\n\n /**\n * Render method used to render the lit-html TemplateResult to the element's\n * DOM.\n * @param {TemplateResult} Template to render.\n * @param {Element|DocumentFragment} Node into which to render.\n * @param {String} Element name.\n * @nocollapse\n */\n static render = render;\n\n /**\n * Array of styles to apply to the element. The styles should be defined\n * using the `css` tag function.\n */\n static styles?: CSSResult|CSSResultArray;\n\n private static _styles: CSSResult[]|undefined;\n\n /** @nocollapse */\n protected static finalize() {\n super.finalize();\n // Prepare styling that is stamped at first render time. Styling\n // is built from user provided `styles` or is inherited from the superclass.\n this._styles =\n this.hasOwnProperty(JSCompiler_renameProperty('styles', this)) ?\n this._getUniqueStyles() :\n this._styles || [];\n }\n\n /** @nocollapse */\n private static _getUniqueStyles(): CSSResult[] {\n // Take care not to call `this.styles` multiple times since this generates\n // new CSSResults each time.\n // TODO(sorvell): Since we do not cache CSSResults by input, any\n // shared styles will generate new stylesheet objects, which is wasteful.\n // This should be addressed when a browser ships constructable\n // stylesheets.\n const userStyles = this.styles;\n const styles: CSSResult[] = [];\n if (Array.isArray(userStyles)) {\n const flatStyles = flattenStyles(userStyles);\n // As a performance optimization to avoid duplicated styling that can\n // occur especially when composing via subclassing, de-duplicate styles\n // preserving the last item in the list. The last item is kept to\n // try to preserve cascade order with the assumption that it's most\n // important that last added styles override previous styles.\n const styleSet = flatStyles.reduceRight((set, s) => {\n set.add(s);\n // on IE set.add does not return the set.\n return set;\n }, new Set<CSSResult>());\n // Array.from does not work on Set in IE\n styleSet.forEach((v) => styles.unshift(v));\n } else if (userStyles) {\n styles.push(userStyles);\n }\n return styles;\n }\n\n private _needsShimAdoptedStyleSheets?: boolean;\n\n /**\n * Node or ShadowRoot into which element DOM should be rendered. Defaults\n * to an open shadowRoot.\n */\n readonly renderRoot!: Element|DocumentFragment;\n\n /**\n * Performs element initialization. By default this calls `createRenderRoot`\n * to create the element `renderRoot` node and captures any pre-set values for\n * registered properties.\n */\n protected initialize() {\n super.initialize();\n (this as {renderRoot: Element | DocumentFragment}).renderRoot =\n this.createRenderRoot();\n // Note, if renderRoot is not a shadowRoot, styles would/could apply to the\n // element's getRootNode(). While this could be done, we're choosing not to\n // support this now since it would require different logic around de-duping.\n if (window.ShadowRoot && this.renderRoot instanceof window.ShadowRoot) {\n this.adoptStyles();\n }\n }\n\n /**\n * Returns the node into which the element should render and by default\n * creates and returns an open shadowRoot. Implement to customize where the\n * element's DOM is rendered. For example, to render into the element's\n * childNodes, return `this`.\n * @returns {Element|DocumentFragment} Returns a node into which to render.\n */\n protected createRenderRoot(): Element|ShadowRoot {\n return this.attachShadow({mode: 'open'});\n }\n\n /**\n * Applies styling to the element shadowRoot using the `static get styles`\n * property. Styling will apply using `shadowRoot.adoptedStyleSheets` where\n * available and will fallback otherwise. When Shadow DOM is polyfilled,\n * ShadyCSS scopes styles and adds them to the document. When Shadow DOM\n * is available but `adoptedStyleSheets` is not, styles are appended to the\n * end of the `shadowRoot` to [mimic spec\n * behavior](https://wicg.github.io/construct-stylesheets/#using-constructed-stylesheets).\n */\n protected adoptStyles() {\n const styles = (this.constructor as typeof LitElement)._styles!;\n if (styles.length === 0) {\n return;\n }\n // There are three separate cases here based on Shadow DOM support.\n // (1) shadowRoot polyfilled: use ShadyCSS\n // (2) shadowRoot.adoptedStyleSheets available: use it.\n // (3) shadowRoot.adoptedStyleSheets polyfilled: append styles after\n // rendering\n if (window.ShadyCSS !== undefined && !window.ShadyCSS.nativeShadow) {\n window.ShadyCSS.ScopingShim.prepareAdoptedCssText(\n styles.map((s) => s.cssText), this.localName);\n } else if (supportsAdoptingStyleSheets) {\n (this.renderRoot as ShadowRoot).adoptedStyleSheets =\n styles.map((s) => s.styleSheet!);\n } else {\n // This must be done after rendering so the actual style insertion is done\n // in `update`.\n this._needsShimAdoptedStyleSheets = true;\n }\n }\n\n connectedCallback() {\n super.connectedCallback();\n // Note, first update/render handles styleElement so we only call this if\n // connected after first update.\n if (this.hasUpdated && window.ShadyCSS !== undefined) {\n window.ShadyCSS.styleElement(this);\n }\n }\n\n /**\n * Updates the element. This method reflects property values to attributes\n * and calls `render` to render DOM via lit-html. Setting properties inside\n * this method will *not* trigger another update.\n * * @param _changedProperties Map of changed properties with old values\n */\n protected update(changedProperties: PropertyValues) {\n super.update(changedProperties);\n const templateResult = this.render() as unknown;\n if (templateResult instanceof TemplateResult) {\n (this.constructor as typeof LitElement)\n .render(\n templateResult,\n this.renderRoot,\n {scopeName: this.localName, eventContext: this});\n }\n // When native Shadow DOM is used but adoptedStyles are not supported,\n // insert styling after rendering to ensure adoptedStyles have highest\n // priority.\n if (this._needsShimAdoptedStyleSheets) {\n this._needsShimAdoptedStyleSheets = false;\n (this.constructor as typeof LitElement)._styles!.forEach((s) => {\n const style = document.createElement('style');\n style.textContent = s.cssText;\n this.renderRoot.appendChild(style);\n });\n }\n }\n\n /**\n * Invoked on each update to perform rendering tasks. This method must return\n * a lit-html TemplateResult. Setting properties inside this method will *not*\n * trigger the element to update.\n */\n protected render(): TemplateResult|void {\n }\n}\n","import { LitElement, html } from 'lit-element';\nimport '../utils/hooks.js';\n\n/**\n * @extends HTMLElement\n */\nclass HaConfigCustomUi extends LitElement {\n render() {\n return html`\n <style include=\"ha-style\"></style>\n <app-header-layout has-scrolling-region>\n <app-header slot=\"header\" fixed>\n <app-toolbar>\n <paper-icon-button\n icon='hass:arrow-left'\n @click=\"${this._backHandler}\"\n ></paper-icon-button>\n <div main-title>Custom UI settings</div>\n </app-toolbar>\n </app-header>\n\n <ha-config-section .is-wide=\"${this.isWide}\">\n <paper-card heading='Device name'>\n <div class='card-content'>\n Set device name so that you can reference it in per-device settings\n <paper-input\n label='Name'\n .value=\"@{this.name}\"\n ></paper-input>\n </div>\n </paper-card>\n </ha-config-section>\n </app-header-layout>\n `;\n }\n\n static get properties() {\n return {\n isWide: {\n type: Boolean,\n attribute: 'is-wide',\n },\n\n name: {\n type: String,\n reflect: true,\n observer: 'nameChanged',\n },\n };\n }\n\n attributeChangedCallback(name, oldval, newval) {\n if (name === 'name') {\n this.nameChanged(newval);\n }\n super.attributeChangedCallback(name, oldval, newval);\n }\n\n connectedCallback() {\n super.connectedCallback();\n this.name = window.customUI.getName();\n }\n\n nameChanged(name) {\n window.customUI.setName(name);\n }\n\n _backHandler() {\n window.history.back();\n const event = new CustomEvent('location-changed');\n this.dispatchEvent(event);\n }\n}\ncustomElements.define('ha-config-custom-ui', HaConfigCustomUi);\n","export default '20190518';\n","const hassAttributeUtil = {};\n\nhassAttributeUtil.DOMAIN_DEVICE_CLASS = {\n binary_sensor: [\n \"battery\",\n \"cold\",\n \"connectivity\",\n \"door\",\n \"garage_door\",\n \"gas\",\n \"heat\",\n \"light\",\n \"lock\",\n \"moisture\",\n \"motion\",\n \"moving\",\n \"occupancy\",\n \"opening\",\n \"plug\",\n \"power\",\n \"presence\",\n \"problem\",\n \"safety\",\n \"smoke\",\n \"sound\",\n \"vibration\",\n \"window\",\n ],\n cover: [\n \"awning\",\n \"blind\",\n \"curtain\",\n \"damper\",\n \"door\",\n \"garage\",\n \"shade\",\n \"shutter\",\n \"window\",\n ],\n sensor: [\n \"battery\",\n \"humidity\",\n \"illuminance\",\n \"temperature\",\n \"pressure\",\n \"power\",\n \"signal_strength\",\n ],\n switch: [\"switch\", \"outlet\"],\n};\n\nhassAttributeUtil.UNKNOWN_TYPE = \"json\";\nhassAttributeUtil.ADD_TYPE = \"key-value\";\n\nhassAttributeUtil.TYPE_TO_TAG = {\n string: \"ha-customize-string\",\n json: \"ha-customize-string\",\n icon: \"ha-customize-icon\",\n boolean: \"ha-customize-boolean\",\n array: \"ha-customize-array\",\n \"key-value\": \"ha-customize-key-value\",\n};\n\n// Attributes here serve dual purpose:\n// 1) Any key of this object won't be shown in more-info window.\n// 2) Any key which has value other than undefined will appear in customization\n// config according to its value.\nhassAttributeUtil.LOGIC_STATE_ATTRIBUTES = hassAttributeUtil.LOGIC_STATE_ATTRIBUTES || {\n entity_picture: undefined,\n friendly_name: { type: \"string\", description: \"Name\" },\n icon: { type: \"icon\" },\n emulated_hue: {\n type: \"boolean\",\n domains: [\"emulated_hue\"],\n },\n emulated_hue_name: {\n type: \"string\",\n domains: [\"emulated_hue\"],\n },\n haaska_hidden: undefined,\n haaska_name: undefined,\n homebridge_hidden: { type: \"boolean\" },\n homebridge_name: { type: \"string\" },\n supported_features: undefined,\n attribution: undefined,\n custom_ui_more_info: { type: \"string\" },\n custom_ui_state_card: { type: \"string\" },\n device_class: {\n type: \"array\",\n options: hassAttributeUtil.DOMAIN_DEVICE_CLASS,\n description: \"Device class\",\n domains: [\"binary_sensor\", \"cover\", \"sensor\", \"switch\"],\n },\n hidden: { type: \"boolean\", description: \"Hide from UI\" },\n assumed_state: {\n type: \"boolean\",\n domains: [\n \"switch\",\n \"light\",\n \"cover\",\n \"climate\",\n \"fan\",\n \"group\",\n \"water_heater\",\n ],\n },\n initial_state: {\n type: \"string\",\n domains: [\"automation\"],\n },\n unit_of_measurement: { type: \"string\" },\n};\n\nexport default hassAttributeUtil;\n","import hassAttributesUtil from '../../home-assistant-polymer/src/util/hass-attributes-util.js';\n\nwindow.hassAttributeUtil = window.hassAttributeUtil || {};\nconst SUPPORTED_SLIDER_MODES = [\n 'single-line', 'break-slider', 'break-slider-toggle', 'hide-slider', 'no-slider',\n];\n\nconst customUiAttributes = {\n group: undefined,\n device: undefined,\n templates: undefined,\n state: undefined,\n _stateDisplay: undefined,\n control_element: { type: 'string' },\n state_card_mode: {\n type: 'array',\n options: {\n light: SUPPORTED_SLIDER_MODES.concat('badges'),\n cover: SUPPORTED_SLIDER_MODES.concat('badges'),\n climate: SUPPORTED_SLIDER_MODES.concat('badges'),\n '*': ['badges'],\n },\n },\n state_card_custom_ui_secondary: { type: 'string' },\n badges_list: { type: 'json' },\n show_last_changed: { type: 'boolean' },\n hide_control: { type: 'boolean' },\n extra_data_template: { type: 'string' },\n extra_badge: { type: 'json' },\n stretch_slider: { type: 'boolean' },\n slider_theme: { type: 'json' },\n theme: { type: 'string' },\n confirm_controls: { type: 'boolean' },\n confirm_controls_show_lock: { type: 'boolean' },\n hide_in_default_view: { type: 'boolean' },\n icon_color: { type: 'string' },\n};\nwindow.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES = hassAttributesUtil.LOGIC_STATE_ATTRIBUTES;\nwindow.hassAttributeUtil.UNKNOWN_TYPE = hassAttributesUtil.UNKNOWN_TYPE;\nObject.assign(window.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES, customUiAttributes);\n","import applyThemesOnElement from '../../home-assistant-polymer/src/common/dom/apply_themes_on_element.ts';\nimport computeStateDomain from '../../home-assistant-polymer/src/common/entity/compute_state_domain.ts';\nimport getViewEntities from '../../home-assistant-polymer/src/common/entity/get_view_entities.ts';\n\nimport '../elements/ha-config-custom-ui.js';\nimport VERSION from './version.js';\nimport './hass-attribute-util.js';\n\nwindow.customUI = window.customUI || {\n SUPPORTED_SLIDER_MODES: [\n 'single-line', 'break-slider', 'break-slider-toggle', 'hide-slider', 'no-slider',\n ],\n\n domHost(elem) {\n if (elem === document) return null;\n const root = elem.getRootNode();\n return (root instanceof DocumentFragment) ? /** @type {ShadowRoot} */ (root).host : root;\n },\n\n lightOrShadow(elem, selector) {\n return elem.shadowRoot ?\n elem.shadowRoot.querySelector(selector) :\n elem.querySelector(selector);\n },\n\n getElementHierarchy(root, hierarchy) {\n if (root === null) return null;\n const elem = hierarchy.shift();\n if (elem) {\n return window.customUI.getElementHierarchy(\n window.customUI.lightOrShadow(root, elem), hierarchy);\n }\n return root;\n },\n\n getContext(elem) {\n if (elem._context === undefined) {\n elem._context = [];\n for (let element = (elem.tagName === 'HA-ENTITIES-CARD' ? window.customUI.domHost(elem) : elem);\n element; element = window.customUI.domHost(element)) {\n switch (element.tagName) {\n case 'HA-ENTITIES-CARD':\n if (element.groupEntity) {\n elem._context.push(element.groupEntity.entity_id);\n } else if (element.groupEntity === false && element.states && element.states.length) {\n elem._context.push(`group.${computeStateDomain(element.states[0])}`);\n }\n break;\n case 'MORE-INFO-GROUP':\n case 'STATE-CARD-CONTENT':\n if (element.stateObj) {\n elem._context.push(element.stateObj.entity_id);\n }\n break;\n case 'HA-CARDS':\n elem._context.push(element.getAttribute('data-view') || 'default_view');\n break;\n // no default\n }\n }\n elem._context.reverse();\n }\n return elem._context;\n },\n\n findMatch(key, options) {\n if (!options) return null;\n if (options[key]) return key;\n return Object.keys(options).find(option => key.match(`^${option}$`));\n },\n\n maybeChangeObjectByDevice(stateObj) {\n const name = window.customUI.getName();\n if (!name) return stateObj;\n const match = this.findMatch(name, stateObj.attributes.device);\n if (!match) return stateObj;\n const attributes = Object.assign({}, stateObj.attributes.device[match]);\n\n if (!Object.keys(attributes).length) return stateObj;\n return window.customUI.applyAttributes(stateObj, attributes);\n },\n\n maybeChangeObjectByGroup(elem, stateObj) {\n const context = window.customUI.getContext(elem);\n if (!context) return stateObj;\n\n if (!stateObj.attributes.group) {\n return stateObj;\n }\n const attributes = {};\n context.forEach((c) => {\n const match = this.findMatch(c, stateObj.attributes.group);\n if (stateObj.attributes.group[match]) {\n Object.assign(attributes, stateObj.attributes.group[match]);\n }\n });\n\n if (!Object.keys(attributes).length) return stateObj;\n\n return window.customUI.applyAttributes(stateObj, attributes);\n },\n\n _setKeep(obj, value) {\n if (obj._cui_keep === undefined) {\n obj._cui_keep = value;\n } else {\n obj._cui_keep = obj._cui_keep && value;\n }\n },\n\n maybeApplyTemplateAttributes(hass, states, stateObj, attributes) {\n if (!attributes.templates) {\n window.customUI._setKeep(stateObj, true);\n return stateObj;\n }\n const newAttributes = {};\n let hasGlobal = false;\n let hasChanges = false;\n Object.keys(attributes.templates).forEach((key) => {\n const template = attributes.templates[key];\n if (template.match(/\\b(entities|hass)\\b/)) {\n hasGlobal = true;\n }\n const value = window.customUI.computeTemplate(\n template, hass, states, stateObj, attributes,\n (stateObj.untemplated_attributes && stateObj.untemplated_attributes[key]) ||\n attributes[key],\n stateObj.untemplated_state || stateObj.state);\n // In case of null don't set the value.\n if (value === null) return;\n newAttributes[key] = value;\n if (key === 'state') {\n if (value !== stateObj.state) {\n hasChanges = true;\n }\n } else if (key === '_stateDisplay') {\n if (value !== stateObj._stateDisplay) {\n hasChanges = true;\n }\n } else if (value !== attributes[key]) {\n hasChanges = true;\n }\n });\n window.customUI._setKeep(stateObj, !hasGlobal);\n if (!hasChanges) {\n return stateObj;\n }\n if (stateObj.attributes === attributes) {\n // We are operating on real attributes. Replace them.\n const result = window.customUI.applyAttributes(stateObj, newAttributes);\n if (Object.prototype.hasOwnProperty.call(newAttributes, 'state')) {\n if (newAttributes.state !== null) {\n result.state = String(newAttributes.state);\n result.untemplated_state = stateObj.state;\n }\n }\n if (Object.prototype.hasOwnProperty.call(newAttributes, '_stateDisplay')) {\n result._stateDisplay = newAttributes._stateDisplay;\n result.untemplated_stateDisplay = stateObj._stateDisplay;\n }\n window.customUI._setKeep(result, !hasGlobal);\n return result;\n }\n // Operating on context-aware attributes. Return shallow copy of object.\n return Object.assign({}, stateObj);\n },\n\n maybeApplyTemplates(hass, states, stateObj) {\n const newResult = window.customUI.maybeApplyTemplateAttributes(\n hass, states, stateObj, stateObj.attributes);\n let hasChanges = (newResult !== stateObj);\n\n function checkAttributes(obj) {\n if (!obj) return;\n Object.values(obj).forEach((attributes) => {\n const result = window.customUI.maybeApplyTemplateAttributes(\n hass, states, newResult, attributes);\n hasChanges |= (result !== newResult);\n });\n checkAttributes(obj.device);\n checkAttributes(obj.group);\n }\n\n checkAttributes(stateObj.attributes.device);\n checkAttributes(stateObj.attributes.group);\n if (newResult !== stateObj) return newResult;\n if (hasChanges) {\n return Object.assign({}, stateObj);\n }\n return stateObj;\n },\n\n applyAttributes(stateObj, attributes) {\n return {\n entity_id: stateObj.entity_id,\n state: stateObj.state,\n attributes: Object.assign({}, stateObj.attributes, attributes),\n untemplated_attributes: stateObj.attributes,\n last_changed: stateObj.last_changed,\n };\n },\n\n maybeChangeObject(elem, stateObj, inDialog, allowHidden) {\n if (inDialog) return stateObj;\n let obj = window.customUI.maybeChangeObjectByDevice(stateObj);\n obj = window.customUI.maybeChangeObjectByGroup(elem, obj);\n obj = window.customUI.maybeApplyTemplateAttributes(\n elem.hass, elem.hass.states, obj, obj.attributes);\n\n if (obj !== stateObj && obj.attributes.hidden && allowHidden) {\n return null;\n }\n return obj;\n },\n\n fixGroupTitles() {\n const homeAssistantMain = window.customUI.getElementHierarchy(document, [\n 'home-assistant',\n 'home-assistant-main']);\n if (homeAssistantMain === null) {\n // DOM not ready. Wait 1 second.\n window.setTimeout(window.customUI.fixGroupTitles, 1000);\n return;\n }\n\n const haCards = window.customUI.getElementHierarchy(homeAssistantMain, [\n 'partial-cards',\n 'ha-cards[view-visible]']);\n if (haCards === null) return;\n const main = window.customUI.lightOrShadow(haCards, '.main') || haCards.$.main;\n const cards = main.querySelectorAll('ha-entities-card');\n cards.forEach((card) => {\n if (card.groupEntity) {\n const obj = window.customUI.maybeChangeObject(\n card,\n card.groupEntity,\n false /* inDialog */,\n false /* allowHidden */);\n if (obj !== card.groupEntity && obj.attributes.friendly_name) {\n const nameElem = window.customUI.lightOrShadow(card, '.name');\n nameElem.textContent = obj.attributes.friendly_name;\n }\n }\n });\n },\n\n controlColumns(columns) {\n const partialCards = window.customUI.getElementHierarchy(document, [\n 'home-assistant',\n 'home-assistant-main',\n 'partial-cards']);\n if (partialCards === null) {\n // DOM not ready. Wait 1 second.\n window.setTimeout(\n window.customUI.controlColumns.bind(null, columns),\n 1000);\n return;\n }\n // Function renamed from handleWindowChange to _updateColumns on 3.7.18\n const f = partialCards.handleWindowChange || partialCards._updateColumns;\n partialCards.mqls.forEach((mql) => {\n mql.removeListener(f);\n });\n partialCards.mqls = columns.map((width) => {\n const mql = window.matchMedia(`(min-width: ${width}px)`);\n mql.addListener(f);\n return mql;\n });\n f();\n },\n\n useCustomizer() {\n const main = window.customUI.lightOrShadow(document, 'home-assistant');\n const customizer = main.hass.states['customizer.customizer'];\n if (!customizer) return;\n if (customizer.attributes.columns) {\n window.customUI.controlColumns(customizer.attributes.columns);\n }\n if (customizer.attributes.hide_attributes) {\n if (window.hassAttributeUtil && window.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES) {\n customizer.attributes.hide_attributes.forEach((attr) => {\n if (!Object.prototype.hasOwnProperty.call(\n window.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES, attr)) {\n window.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES[attr] = undefined;\n }\n });\n }\n }\n },\n\n updateConfigPanel() {\n if (!window.location.pathname.startsWith('/config')) return;\n const haPanelConfig = window.customUI.getElementHierarchy(document, [\n 'home-assistant',\n 'home-assistant-main',\n 'partial-panel-resolver',\n 'ha-panel-config']);\n if (!haPanelConfig) {\n // DOM not ready. Wait 100ms.\n window.setTimeout(window.customUI.updateConfigPanel, 100);\n return;\n }\n const haConfigNavigation = window.customUI.getElementHierarchy(haPanelConfig, [\n 'ha-config-dashboard',\n 'ha-config-navigation']);\n if (haConfigNavigation) {\n // HaConfigNavigation started using localize on 21.01.2018\n if (haConfigNavigation.localize && !haConfigNavigation.cuiPatch) {\n haConfigNavigation.cuiPatch = true;\n haConfigNavigation._originalComputeLoaded = haConfigNavigation._computeLoaded;\n haConfigNavigation._originalComputeCaption = haConfigNavigation._computeCaption;\n haConfigNavigation._originalComputeDescription = haConfigNavigation._computeDescription;\n haConfigNavigation._computeLoaded = (hass, page) =>\n page === 'customui' || haConfigNavigation._originalComputeLoaded(hass, page);\n haConfigNavigation._computeCaption = (page, localize) =>\n (page === 'customui' ? 'Custom UI' : haConfigNavigation._originalComputeCaption(page, localize));\n haConfigNavigation._computeDescription = (page, localize) =>\n (page === 'customui' ? 'SetUI tweaks' : haConfigNavigation._originalComputeDescription(page, localize));\n }\n if (!haConfigNavigation.pages.some(conf => conf === 'customui' || conf.domain === 'customui')) {\n haConfigNavigation.push('pages', haConfigNavigation.localize ? 'customui' : {\n domain: 'customui',\n caption: 'Custom UI',\n description: 'Set UI tweaks.',\n loaded: true,\n });\n }\n }\n const getHaConfigCustomUi = () => {\n const haConfigCustomUi = document.createElement('ha-config-custom-ui');\n haConfigCustomUi.isWide = haPanelConfig.isWide;\n haConfigCustomUi.setAttribute('page-name', 'customui');\n return haConfigCustomUi;\n };\n\n const ironPages = window.customUI.lightOrShadow(haPanelConfig, 'iron-pages');\n if (ironPages) {\n if (ironPages.lastElementChild.tagName !== 'HA-CONFIG-CUSTOM-UI') {\n const haConfigCustomUi = getHaConfigCustomUi();\n ironPages.appendChild(haConfigCustomUi);\n ironPages.addEventListener('iron-items-changed', () => {\n if (window.location.pathname.startsWith('/config/customui')) {\n ironPages.select('customui');\n }\n });\n }\n } else if (haPanelConfig.shadowRoot) {\n const root = haPanelConfig.shadowRoot || haPanelConfig;\n if (root.lastElementChild.tagName !== 'HA-CONFIG-CUSTOM-UI') {\n const haConfigCustomUi = getHaConfigCustomUi();\n root.appendChild(haConfigCustomUi);\n }\n const visible = window.location.pathname.startsWith('/config/customui');\n root.lastElementChild.style.display = visible ? '' : 'none';\n } else if (haPanelConfig.routerOptions && haPanelConfig.routerOptions.routes) {\n if (!haPanelConfig.routerOptions.routes.customui) {\n haPanelConfig.routerOptions.routes.customui = {\n tag: 'ha-config-custom-ui',\n load: () => Promise.resolve(),\n };\n // CustomUI panel is the entrypoint, so we need to reload the page.\n if (window.location.pathname.startsWith('/config/customui')) {\n haPanelConfig.update(new Map([['route', undefined]]));\n }\n }\n }\n },\n\n installStatesHook() {\n customElements.whenDefined('home-assistant').then(() => {\n const homeAssistant = customElements.get('home-assistant');\n if (!homeAssistant || !homeAssistant.prototype._updateHass) return;\n const originalUpdate = homeAssistant.prototype._updateHass;\n homeAssistant.prototype._updateHass = function update(obj) {\n // Use named function to preserve 'this'.\n const { hass } = this;\n if (obj.states) {\n Object.keys(obj.states).forEach((key) => {\n const entity = obj.states[key];\n if (entity._cui_keep) return;\n const newEntity = window.customUI.maybeApplyTemplates(hass, obj.states, entity);\n if (hass.states && entity !== hass.states[key]) {\n // New state arrived. Put modified state in.\n obj.states[key] = newEntity;\n } else if (entity !== newEntity) {\n // It's the same state but contents changed due to other state changes.\n obj.states[key] = newEntity;\n }\n });\n }\n originalUpdate.call(this, obj);\n if (obj.themes && hass._themeWaiters) {\n hass._themeWaiters.forEach(waiter => waiter.stateChanged(waiter.state));\n hass._themeWaiters = undefined;\n }\n };\n const main = window.customUI.lightOrShadow(document, 'home-assistant');\n if (main.hass && main.hass.states) {\n main._updateHass({ states: main.hass.states });\n }\n });\n },\n\n installPartialCards() {\n customElements.whenDefined('partial-cards').then(() => {\n const partialCards = customElements.get('partial-cards');\n if (!partialCards || !partialCards.prototype._defaultViewFilter) return;\n partialCards.prototype._defaultViewFilter = (hass, entityId) => {\n if (hass.states[entityId].attributes.hidden) return false;\n const excludes = {};\n Object.values(hass.states).forEach((entity) => {\n if (entity.attributes && entity.attributes.hide_in_default_view) {\n const excludeEntityId = entity.entity_id;\n if (excludes[excludeEntityId]) return;\n excludes[excludeEntityId] = entity;\n if (entity.attributes.view) {\n const viewEntities = getViewEntities(hass.states, entity);\n Object.keys(viewEntities)\n .filter(\n id => viewEntities[id].attributes.hide_in_default_view !== false)\n .forEach((id) => {\n excludes[id] = viewEntities[id];\n });\n }\n }\n });\n return !excludes[entityId];\n };\n });\n },\n\n // Allows changing the 'Execute' / 'Activate' text on script/scene cards.\n installActionName(elementName) {\n customElements.whenDefined(elementName).then(() => {\n const klass = customElements.get(elementName);\n if (!klass || !klass.prototype) return;\n Object.defineProperty(klass.prototype, 'localize', {\n get() {\n function customLocalize(v) {\n if (this.stateObj && this.stateObj.attributes &&\n this.stateObj.attributes.action_name) {\n return this.stateObj.attributes.action_name;\n }\n return this.__data.localize(v);\n }\n return customLocalize;\n },\n set() {},\n });\n });\n },\n\n // Allows theming \"regular\" top badges.\n installHaStateLabelBadge() {\n customElements.whenDefined('ha-state-label-badge').then(() => {\n const haStateLabelBadge = customElements.get('ha-state-label-badge');\n if (!haStateLabelBadge || !haStateLabelBadge.prototype.stateChanged) return;\n // Use named function to preserve 'this'.\n haStateLabelBadge.prototype.stateChanged = function update(stateObj) {\n // TODO: Call window.customUI.maybeChangeObject\n if (stateObj.attributes.theme) {\n if (this.hass.themes === null) {\n this.hass._themeWaiters = this.hass._themeWaiters || [];\n this.hass._themeWaiters.push(this);\n } else {\n applyThemesOnElement(\n this,\n this.hass.themes || { default_theme: 'default', themes: {} },\n stateObj.attributes.theme || 'default');\n }\n }\n this.updateStyles();\n if (this.startInterval) {\n // Added on 19.1.2018\n this.startInterval(stateObj);\n }\n };\n });\n },\n\n installStateBadge() {\n customElements.whenDefined('state-badge').then(() => {\n const stateBadge = customElements.get('state-badge');\n if (!stateBadge) return;\n if (stateBadge.prototype._updateIconAppearance) {\n const originalUpdateIconAppearance = stateBadge.prototype._updateIconAppearance;\n // Use named function to preserve 'this'.\n stateBadge.prototype._updateIconAppearance = function customUpdateIconAppearance(stateObj) {\n if (stateObj.attributes.icon_color && !stateObj.attributes.entity_picture) {\n this.style.backgroundImage = '';\n Object.assign(this.$.icon.style, {\n color: stateObj.attributes.icon_color,\n filter: '',\n });\n } else {\n originalUpdateIconAppearance.call(this, stateObj);\n }\n };\n } else if (stateBadge.prototype.updated) {\n const originalUpdated = stateBadge.prototype.updated;\n // Use named function to preserve 'this'.\n stateBadge.prototype.updated = function customUpdated(changedProps) {\n if (!changedProps.has('stateObj')) return;\n const { stateObj } = this;\n if (stateObj.attributes.icon_color && !stateObj.attributes.entity_picture) {\n this.style.backgroundImage = '';\n Object.assign(this._icon.style, {\n color: stateObj.attributes.icon_color,\n filter: '',\n });\n } else {\n originalUpdated.call(this, changedProps);\n }\n };\n }\n });\n },\n\n installHaAttributes() {\n customElements.whenDefined('ha-attributes').then(() => {\n const haAttributes = customElements.get('ha-attributes');\n if (!haAttributes || !haAttributes.prototype.computeFiltersArray ||\n !window.hassAttributeUtil) return;\n // Use named function to preserve 'this'.\n haAttributes.prototype.computeFiltersArray =\n function customComputeFiltersArray(extraFilters) {\n return Object.keys(window.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES).concat(\n extraFilters ? extraFilters.split(',') : []);\n };\n });\n },\n\n installHaFormCustomize() {\n if (!window.location.pathname.startsWith('/config')) return;\n customElements.whenDefined('ha-form-customize').then(() => {\n const haFormCustomize = customElements.get('ha-form-customize');\n if (!haFormCustomize) {\n // DOM not ready. Wait 100ms.\n window.setTimeout(window.customUI.installHaFormCustomize, 100);\n return;\n }\n if (window.customUI.haFormCustomizeInitDone) return;\n window.customUI.haFormCustomizeInitDone = true;\n\n if (!window.hassAttributeUtil) return;\n if (haFormCustomize.prototype._computeSingleAttribute) {\n // Use named function to preserve 'this'.\n haFormCustomize.prototype._computeSingleAttribute =\n function customComputeSingleAttribute(key, value, secondary) {\n const config = window.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES[key]\n || { type: window.hassAttributeUtil.UNKNOWN_TYPE };\n return this._initOpenObject(key, config.type === 'json' ? JSON.stringify(value) : value, secondary, config);\n };\n }\n if (haFormCustomize.prototype.getNewAttributesOptions) {\n // Use named function to preserve 'this'.\n haFormCustomize.prototype.getNewAttributesOptions =\n function customgetNewAttributesOptions(\n localAttributes, globalAttributes, existingAttributes, newAttributes) {\n const knownKeys =\n Object.keys(window.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES)\n .filter((key) => {\n const conf = window.hassAttributeUtil.LOGIC_STATE_ATTRIBUTES[key];\n return conf && (!conf.domains || !this.entity ||\n conf.domains.includes(computeStateDomain(this.entity)));\n })\n .filter(this.filterFromAttributes(localAttributes))\n .filter(this.filterFromAttributes(globalAttributes))\n .filter(this.filterFromAttributes(existingAttributes))\n .filter(this.filterFromAttributes(newAttributes));\n return knownKeys.sort().concat('Other');\n };\n }\n });\n },\n\n installClassHooks() {\n if (window.customUI.classInitDone) return;\n window.customUI.classInitDone = true;\n window.customUI.installPartialCards();\n window.customUI.installStatesHook();\n window.customUI.installHaStateLabelBadge();\n window.customUI.installStateBadge();\n window.customUI.installHaAttributes();\n window.customUI.installActionName('state-card-scene');\n window.customUI.installActionName('state-card-script');\n },\n\n init() {\n if (window.customUI.initDone) return;\n window.customUI.installClassHooks();\n const main = window.customUI.lightOrShadow(document, 'home-assistant');\n if (!main.hass || !main.hass.states) {\n // Connection wasn't made yet. Try in 1 second.\n window.setTimeout(window.customUI.init, 1000);\n return;\n }\n window.customUI.initDone = true;\n\n window.customUI.useCustomizer();\n\n window.customUI.runHooks();\n window.addEventListener('location-changed', window.setTimeout.bind(null, window.customUI.runHooks, 100));\n /* eslint-disable no-console */\n console.log(`Loaded CustomUI ${VERSION}`);\n /* eslint-enable no-console */\n if (!window.CUSTOM_UI_LIST) {\n window.CUSTOM_UI_LIST = [];\n }\n window.CUSTOM_UI_LIST.push({\n name: 'CustomUI',\n version: VERSION,\n url: 'https://github.com/andrey-git/home-assistant-custom-ui',\n });\n },\n\n runHooks() {\n window.customUI.fixGroupTitles();\n window.customUI.updateConfigPanel();\n window.customUI.installHaFormCustomize();\n },\n\n getName() {\n return window.localStorage.getItem('ha-device-name') || '';\n },\n\n setName(name) {\n window.localStorage.setItem('ha-device-name', name || '');\n },\n\n computeTemplate(template, hass, entities, entity, attributes, attribute, state) {\n const functionBody = (template.indexOf('return') >= 0) ? template : `return \\`${template}\\`;`;\n try {\n /* eslint-disable no-new-func */\n const func = new Function(\n 'hass', 'entities', 'entity', 'attributes', 'attribute', 'state', functionBody);\n /* eslint-enable no-new-func */\n return func(hass, entities, entity, attributes, attribute, state);\n } catch (e) {\n /* eslint-disable no-console */\n if ((e instanceof SyntaxError) || e instanceof ReferenceError) {\n console.warn(`${e.name}: ${e.message} in template ${functionBody}`);\n return null;\n }\n /* eslint-enable no-console */\n throw e;\n }\n },\n};\nwindow.customUI.init();\n","import { HassEntities } from \"home-assistant-js-websocket\";\nimport computeDomain from \"./compute_domain\";\nimport getGroupEntities from \"./get_group_entities\";\nimport { GroupEntity } from \"../../types\";\n\n// Return an object containing all entities that the view will show\n// including embedded groups.\nexport default function getViewEntities(\n entities: HassEntities,\n view: GroupEntity\n): HassEntities {\n const viewEntities = {};\n\n view.attributes.entity_id.forEach((entityId) => {\n const entity = entities[entityId];\n\n if (entity && !entity.attributes.hidden) {\n viewEntities[entity.entity_id] = entity;\n\n if (computeDomain(entity.entity_id) === \"group\") {\n const groupEntities = getGroupEntities(entities, entity as GroupEntity);\n\n Object.keys(groupEntities).forEach((grEntityId) => {\n const grEntity = groupEntities[grEntityId];\n\n if (!grEntity.attributes.hidden) {\n viewEntities[grEntityId] = grEntity;\n }\n });\n }\n }\n });\n\n return viewEntities;\n}\n","import { HassEntities } from \"home-assistant-js-websocket\";\nimport { GroupEntity } from \"../../types\";\n\nexport default function getGroupEntities(\n entities: HassEntities,\n group: GroupEntity\n) {\n const result = {};\n\n group.attributes.entity_id.forEach((entityId) => {\n const entity = entities[entityId];\n\n if (entity) {\n result[entity.entity_id] = entity;\n }\n });\n\n return result;\n}\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nimport './boot.js';\n\n/**\n * Class representing a static string value which can be used to filter\n * strings by asseting that they have been created via this class. The\n * `value` property returns the string passed to the constructor.\n */\nclass LiteralString {\n constructor(string) {\n /** @type {string} */\n this.value = string.toString();\n }\n /**\n * @return {string} LiteralString string value\n */\n toString() {\n return this.value;\n }\n}\n\n/**\n * @param {*} value Object to stringify into HTML\n * @return {string} HTML stringified form of `obj`\n */\nfunction literalValue(value) {\n if (value instanceof LiteralString) {\n return /** @type {!LiteralString} */(value).value;\n } else {\n throw new Error(\n `non-literal value passed to Polymer's htmlLiteral function: ${value}`\n );\n }\n}\n\n/**\n * @param {*} value Object to stringify into HTML\n * @return {string} HTML stringified form of `obj`\n */\nfunction htmlValue(value) {\n if (value instanceof HTMLTemplateElement) {\n return /** @type {!HTMLTemplateElement } */(value).innerHTML;\n } else if (value instanceof LiteralString) {\n return literalValue(value);\n } else {\n throw new Error(\n `non-template value passed to Polymer's html function: ${value}`);\n }\n}\n\n/**\n * A template literal tag that creates an HTML <template> element from the\n * contents of the string.\n *\n * This allows you to write a Polymer Template in JavaScript.\n *\n * Templates can be composed by interpolating `HTMLTemplateElement`s in\n * expressions in the JavaScript template literal. The nested template's\n * `innerHTML` is included in the containing template. The only other\n * values allowed in expressions are those returned from `htmlLiteral`\n * which ensures only literal values from JS source ever reach the HTML, to\n * guard against XSS risks.\n *\n * All other values are disallowed in expressions to help prevent XSS\n * attacks; however, `htmlLiteral` can be used to compose static\n * string values into templates. This is useful to compose strings into\n * places that do not accept html, like the css text of a `style`\n * element.\n *\n * Example:\n *\n * static get template() {\n * return html`\n * <style>:host{ content:\"...\" }</style>\n * <div class=\"shadowed\">${this.partialTemplate}</div>\n * ${super.template}\n * `;\n * }\n * static get partialTemplate() { return html`<span>Partial!</span>`; }\n *\n * @param {!ITemplateArray} strings Constant parts of tagged template literal\n * @param {...*} values Variable parts of tagged template literal\n * @return {!HTMLTemplateElement} Constructed HTMLTemplateElement\n */\nexport const html = function html(strings, ...values) {\n const template = /** @type {!HTMLTemplateElement} */(document.createElement('template'));\n template.innerHTML = values.reduce((acc, v, idx) =>\n acc + htmlValue(v) + strings[idx + 1], strings[0]);\n return template;\n};\n\n/**\n * An html literal tag that can be used with `html` to compose.\n * a literal string.\n *\n * Example:\n *\n * static get template() {\n * return html`\n * <style>\n * :host { display: block; }\n * ${this.styleTemplate()}\n * </style>\n * <div class=\"shadowed\">${staticValue}</div>\n * ${super.template}\n * `;\n * }\n * static get styleTemplate() {\n * return htmlLiteral`.shadowed { background: gray; }`;\n * }\n *\n * @param {!ITemplateArray} strings Constant parts of tagged template literal\n * @param {...*} values Variable parts of tagged template literal\n * @return {!LiteralString} Constructed literal string\n */\nexport const htmlLiteral = function(strings, ...values) {\n return new LiteralString(values.reduce((acc, v, idx) =>\n acc + literalValue(v) + strings[idx + 1], strings[0]));\n};\n","import '../utils/hooks.js';\n\nexport default (superClass) => {\n /**\n * @extends HTMLElement\n */\n class CuiBaseElement extends superClass {\n static get properties() {\n return {\n hass: Object,\n inDialog: {\n type: Boolean,\n value: false,\n },\n stateObj: Object,\n controlElement: String,\n extra: {\n type: Array,\n computed: 'computeExtra(hass, stateObj)',\n },\n };\n }\n\n computeExtra(hass, stateObj) {\n let extras = stateObj.attributes.extra_data_template;\n if (extras) {\n if (!Array.isArray(extras)) {\n extras = [extras];\n }\n return extras.map(extra => window.customUI.computeTemplate(\n extra,\n hass,\n hass.states,\n stateObj,\n stateObj.attributes,\n /* attribute= */ undefined,\n stateObj.state,\n )).filter(result => result !== null);\n }\n return [];\n }\n\n showLastChanged(stateObj, inDialog, extra) {\n if (inDialog) return true;\n if (extra.length) return false;\n return !!stateObj.attributes.show_last_changed;\n }\n\n hasExtra(extra) {\n return extra.length > 0;\n }\n }\n return CuiBaseElement;\n};\n","import dynamicContentUpdater from '../../home-assistant-polymer/src/common/dom/dynamic_content_updater.ts';\n\nfunction loadCustomUI() {\n /**\n * @extends HTMLElement\n */\n class DynamicElement extends Polymer.Element {\n static get properties() {\n return {\n hass: Object,\n stateObj: Object,\n elementName: String,\n\n inDialog: {\n type: Boolean,\n value: false,\n },\n };\n }\n\n static get observers() {\n return [\n 'observerFunc(hass, stateObj, elementName, inDialog)',\n ];\n }\n\n observerFunc(hass, stateObj, elementName, inDialog) {\n dynamicContentUpdater(\n this,\n elementName ? elementName.toUpperCase() : 'DIV',\n { hass, stateObj, inDialog });\n }\n }\n customElements.define('dynamic-element', DynamicElement);\n}\nif (Polymer && Polymer.Element && customElements.get('home-assistant')) {\n loadCustomUI();\n} else {\n customElements.whenDefined('home-assistant').then(() => loadCustomUI());\n}\n","import { html } from '@polymer/polymer/lib/utils/html-tag.js';\n\nfunction loadCustomUI() {\n /**\n * @extends HTMLElement\n */\n class HaThemedSlider extends Polymer.Element {\n static get template() {\n return html`\n <style>\n :host {\n margin: var(--ha-themed-slider-margin, initial);\n }\n .disable-off-when-min {\n --paper-slider-pin-start-color: var(--paper-slider-pin-color);\n }\n\n .disable-off-when-min.is-on {\n --paper-slider-knob-start-color: var(--paper-slider-knob-color);\n --paper-slider-knob-start-border-color: var(--paper-slider-knob-color);\n }\n paper-slider {\n margin: 4px 0;\n max-width: 100%;\n min-width: 100px;\n width: var(--ha-paper-slider-width, 200px);\n }\n </style>\n\n <paper-slider\n id='slider'\n min='[[_themedMin]]'\n max='[[_computeAttribute(theme, \"max\", max)]]'\n pin='[[_computeAttribute(theme, \"pin\", pin)]]'\n class$='[[computeClass(theme, isOn, _themedMin)]]' value='[[value]]'\n on-change='valueChanged'>\n </paper-slider>\n `;\n }\n\n ready() {\n super.ready();\n this.disableOffWhenMin = !this._computeAttribute(this.theme, 'off_when_min', !this.disableOffWhenMin);\n this.computeEnabledThemedReportWhenNotChanged(this.theme, this.disableReportWhenNotChanged);\n }\n\n connectedCallback() {\n super.connectedCallback();\n this.$.slider._keyBindings = this.$.slider._keyBindings || {};\n }\n\n static get properties() {\n return {\n min: {\n type: Number,\n value: 0,\n },\n max: {\n type: Number,\n value: 100,\n },\n pin: {\n type: Boolean,\n value: false,\n },\n isOn: {\n type: Boolean,\n value: false,\n },\n disableOffWhenMin: {\n type: Boolean,\n value: false,\n notify: true,\n },\n disableReportWhenNotChanged: {\n type: Boolean,\n value: false,\n },\n\n theme: Object,\n value: {\n type: Number,\n notify: true,\n },\n _themedMin: {\n type: Number,\n computed: '_computeAttribute(theme, \"min\", min)',\n },\n };\n }\n\n static get observers() {\n return [\n 'computeEnabledThemedReportWhenNotChanged(theme, disableReportWhenNotChanged)',\n ];\n }\n\n computeEnabledThemedReportWhenNotChanged(theme, disableReportWhenNotChanged) {\n this._enabledThemedReportWhenNotChanged = this._computeAttribute(\n theme, 'report_when_not_changed', !disableReportWhenNotChanged);\n }\n\n _computeAttribute(theme, attr, def) {\n if (theme) {\n if (attr in theme) {\n return theme[attr];\n }\n }\n return def;\n }\n\n computeClass(theme, isOn, themedMin) {\n let result = '';\n if (isOn) {\n result += 'is-on ';\n }\n if (this._computeAttribute(theme, 'off_when_min', !this.disableOffWhenMin) || themedMin === 0) {\n // If offWhenMin is enabled don't customize.\n return '';\n }\n return `${result}disable-off-when-min`;\n }\n\n valueChanged(ev) {\n if (!this._enabledThemedReportWhenNotChanged && this.value === ev.target.value) {\n ev.stopPropagation();\n return;\n }\n this.value = ev.target.value;\n }\n }\n customElements.define('ha-themed-slider', HaThemedSlider);\n}\nif (Polymer && Polymer.Element && customElements.get('home-assistant')) {\n loadCustomUI();\n} else {\n customElements.whenDefined('home-assistant').then(() => loadCustomUI());\n}\n","import { html } from '@polymer/polymer/lib/utils/html-tag.js';\nimport CuiBaseElement from './cui-base-element.js';\nimport './dynamic-with-extra.js';\nimport './ha-themed-slider.js';\n\nfunction loadCustomUI() {\n /**\n * @extends HTMLElement\n */\n class StateCardWithSlider extends CuiBaseElement(Polymer.Element) {\n static get template() {\n return html`\n <style is=\"custom-style\" include=\"iron-flex iron-flex-alignment iron-flex-factors\"></style>\n <style>\n #container {\n position: relative;\n }\n .second-line, .state-and-toggle, .state-info {\n max-width: 100%;\n }\n .nowrap .state-and-toggle {\n overflow: hidden;\n flex-grow: 0;\n }\n .nowrap .second-line {\n overflow: hidden;\n }\n\n .second-line {\n padding-top: 20px;\n padding-bottom: 16px;\n margin-top: -20px;\n margin-bottom: -16px;\n }\n .stretch .second-line, .stretch ha-themed-slider {\n width: 100%;\n --ha-paper-slider-width: 100%;\n }\n .nowrap .state-info {\n min-width: initial;\n }\n ha-themed-slider, .top-wrapper {\n min-width: 100px;\n max-width: 100%;\n }\n .top-wrapper.stretch {\n display: block;\n }\n\n .hidden {\n display: none;\n }\n </style>\n\n <div id='container' class$='horizontal layout flex top-wrapper [[_computeWrapClass(mode, stretchSlider, lineTooLong, inDialog)]]'>\n <div class='horizontal layout justified flex-auto state-and-toggle'>\n <state-info\n class='state-info flex-auto'\n hass='[[hass]]'\n state-obj='[[stateObj]]'\n in-dialog='[[showLastChanged(stateObj, inDialog, extra)]]'\n secondary-line$='[[hasExtra(extra)]]'\n >\n <template is='dom-repeat' items='[[extra]]'>\n <div>[[item]]</div>\n </template>\n </state-info>\n <template is='dom-if' if='[[breakSlider]]' class='hidden'>\n <dynamic-with-extra hass='[[hass]]' state-obj='[[stateObj]]' control-element='[[controlElement]]' in-dialog='[[inDialog]]'></dynamic-with-extra>\n </template>\n </div>\n <template is='dom-if' if='[[showSlider]]' restamp>\n <div class='horizontal layout flex-auto end-justified second-line'>\n <ha-themed-slider\n id='slider'\n max=[[max]]\n min=[[min]]\n theme='[[stateObj.attributes.slider_theme]]'\n is-on='[[isOn(stateObj, nameOn)]]'\n value='{{sliderValue}}'\n disable-off-when-min='{{disableOffWhenMin}}'\n on-change='sliderChanged'\n on-click='stopPropagation'>\n </ha-themed-slider>\n <template is='dom-if' if='[[!breakSlider]]'>\n <dynamic-with-extra hass='[[hass]]' state-obj='[[stateObj]]' control-element='[[controlElement]]' in-dialog='[[inDialog]]'></dynamic-with-extra>\n </template>\n </div>\n </template>\n </div>\n `;\n }\n\n static get properties() {\n return {\n domain: String,\n serviceMin: String,\n serviceMax: String,\n valueName: String,\n setValueName: String,\n nameOn: { type: String, value: 'on' },\n min: { type: Number, value: 0 },\n max: { type: Number, value: 255 },\n\n sliderValue: {\n type: Number,\n value: 0,\n },\n disableOffWhenMin: Boolean,\n mode: String,\n stretchSlider: {\n type: Boolean,\n value: false,\n },\n breakSlider: {\n type: Boolean,\n value: false,\n },\n hideSlider: {\n type: Boolean,\n value: false,\n },\n lineTooLong: {\n type: Boolean,\n value: false,\n },\n minLineBreak: Number,\n maxLineBreak: Number,\n showSlider: {\n type: Number,\n computed: '_showSlider(inDialog, stateObj, hideSlider)',\n },\n };\n }\n\n ready() {\n super.ready();\n this._onIronResize = this._onIronResize.bind(this);\n }\n\n connectedCallback() {\n super.connectedCallback();\n this._isConnected = true;\n window.addEventListener('resize', this._onIronResize);\n this._waitForLayout();\n }\n\n disconnectedCallback() {\n window.removeEventListener('resize', this._onIronResize);\n this._isConnected = false;\n super.disconnectedCallback();\n }\n\n static get observers() {\n return [\n 'stateObjChanged(stateObj, nameOn, valueName)',\n ];\n }\n\n _waitForLayout() {\n if (!this._isConnected) return;\n this._setMode();\n if (this._frameId) return;\n this.readyToCompute = false;\n this._frameId = window.requestAnimationFrame(() => {\n this._frameId = null;\n this.readyToCompute = true;\n this._onIronResize();\n });\n }\n\n _setMode() {\n const obj = {\n hideSlider: this.mode === 'hide-slider' && this.lineTooLong,\n breakSlider:\n (this.mode === 'break-slider' || this.mode === 'hide-slider') &&\n this.lineTooLong,\n };\n if (!this.showSlider) {\n obj.breakSlider = true;\n }\n this.setProperties(obj);\n }\n\n _onIronResize() {\n if (!this.readyToCompute) return;\n if (this.mode === 'no-slider') {\n this.setProperties({\n hideSlider: true,\n breakSlider: true,\n });\n return;\n }\n const prevBreakSlider = this.breakSlider;\n const prevHideSlider = this.hideSlider;\n this.setProperties({\n lineTooLong: false,\n hideSlider: false,\n breakSlider: false,\n });\n const { container } = this.$;\n const containerWidth = container.clientWidth;\n if (containerWidth === 0) return;\n if (containerWidth <= this.minLineBreak) {\n this.lineTooLong = true;\n } else if (containerWidth >= this.maxLineBreak) {\n this.lineTooLong = false;\n } else {\n if (prevHideSlider && this.mode === 'hide-slider') {\n // We need to unhide the slider in order to recalculate height.\n this._waitForLayout();\n return;\n }\n const containerHeight = container.clientHeight;\n const stateHeight = this.root.querySelector('.state-info').clientHeight;\n this.lineTooLong = containerHeight > stateHeight * 1.5;\n if (this.lineTooLong) {\n this.minLineBreak = containerWidth;\n } else if (!prevBreakSlider) {\n this.maxLineBreak = containerWidth;\n }\n }\n this._setMode();\n }\n\n _computeWrapClass(mode, stretchSlider, lineTooLong, inDialog) {\n if (inDialog) {\n return '';\n }\n if (mode === 'single-line') {\n return 'nowrap';\n }\n if (stretchSlider && lineTooLong) {\n return 'stretch wrap';\n }\n return 'wrap';\n }\n\n _showSlider(inDialog, stateObj, hideSlider) {\n if (inDialog || hideSlider) {\n return false;\n }\n return true;\n }\n\n sliderChanged(ev) {\n const value = parseInt(ev.target.value, 10);\n const param = { entity_id: this.stateObj.entity_id };\n if (Number.isNaN(value)) return;\n let target = this.root.querySelector('#slider');\n if (ev.target !== target) {\n // No Shadow DOM - we have access to original target.\n ({ target } = ev);\n } else if (ev.path) {\n [target] = ev.path;\n } else if (ev.composedPath) {\n [target] = ev.composedPath();\n }\n if (value === 0 || (value <= target.min && !this.disableOffWhenMin)) {\n this.hass.callService(this.domain, this.serviceMin, param);\n } else {\n param[this.setValueName || this.valueName] = value;\n this.hass.callService(this.domain, this.serviceMax, param);\n }\n }\n\n stateObjChanged(stateObj, nameOn, valueName) {\n const obj = {\n sliderValue: this.isOn(stateObj, nameOn) ? stateObj.attributes[valueName] : 0,\n };\n if (stateObj) {\n Object.assign(obj, {\n minLineBreak: 0,\n maxLineBreak: 999,\n hideSlider: false,\n breakSlider: false,\n lineTooLong: false,\n mode: stateObj.attributes.state_card_mode,\n stretchSlider: !!stateObj.attributes.stretch_slider,\n });\n }\n this.setProperties(obj);\n if (stateObj) {\n this._waitForLayout();\n }\n }\n\n isOn(stateObj, nameOn) {\n return stateObj && (!nameOn || stateObj.state === nameOn);\n }\n\n stopPropagation(ev) {\n ev.stopPropagation();\n }\n }\n customElements.define('state-card-with-slider', StateCardWithSlider);\n}\nif (Polymer && Polymer.Element && customElements.get('home-assistant')) {\n loadCustomUI();\n} else {\n customElements.whenDefined('home-assistant').then(() => loadCustomUI());\n}\n","import { html } from '@polymer/polymer/lib/utils/html-tag.js';\nimport CuiBaseElement from './cui-base-element.js';\nimport './dynamic-with-extra.js';\n\nfunction loadCustomUI() {\n /**\n * @extends HTMLElement\n */\n class StateCardWithoutSlider extends CuiBaseElement(Polymer.Element) {\n static get template() {\n return html`\n <style is=\"custom-style\" include=\"iron-flex iron-flex-alignment\"></style>\n <style>\n #container {\n position: relative;\n }\n </style>\n\n <div id='container' class='horizontal layout justified'>\n <state-info\n hass='[[hass]]'\n class='state-info'\n state-obj='[[stateObj]]'\n in-dialog='[[showLastChanged(stateObj, inDialog, extra)]]'\n secondary-line$='[[hasExtra(extra)]]'>\n <template is='dom-repeat' items='[[extra]]'>\n <div>[[item]]</div>\n </template>\n </state-info>\n <dynamic-with-extra\n hass='[[hass]]'\n state-obj='[[stateObj]]'\n control-element='[[controlElement]]'\n in-dialog='[[inDialog]]'>\n </dynamic-with-extra>\n </div>\n `;\n }\n }\n customElements.define('state-card-without-slider', StateCardWithoutSlider);\n}\nif (Polymer && Polymer.Element && customElements.get('home-assistant')) {\n loadCustomUI();\n} else {\n customElements.whenDefined('home-assistant').then(() => loadCustomUI());\n}\n","import applyThemesOnElement from '../../home-assistant-polymer/src/common/dom/apply_themes_on_element.ts';\nimport computeStateDomain from '../../home-assistant-polymer/src/common/entity/compute_state_domain.ts';\nimport dynamicContentUpdater from '../../home-assistant-polymer/src/common/dom/dynamic_content_updater.ts';\nimport stateCardType from '../../home-assistant-polymer/src/common/entity/state_card_type.ts';\n\nimport '../utils/hooks.js';\nimport './state-card-with-slider.js';\nimport './state-card-without-slider.js';\n\nfunction loadCustomUI() {\n const SHOW_LAST_CHANGED_BLACKLISTED_CARDS = ['configurator'];\n const DOMAIN_TO_SLIDER_SUPPORT = {\n light: 1, // SUPPORT_BRIGHTNESS\n cover: 4, // SUPPORT_SET_POSITION\n climate: 1, // SUPPORT_TARGET_TEMPERATURE\n };\n const TYPE_TO_CONTROL = {\n toggle: 'ha-entity-toggle',\n display: '',\n cover: 'ha-cover-controls',\n };\n\n /**\n * @extends HTMLElement\n */\n class StateCardCustomUi extends Polymer.Element {\n static get properties() {\n return {\n hass: Object,\n\n inDialog: {\n type: Boolean,\n value: false,\n },\n\n stateObj: Object,\n };\n }\n\n static get observers() {\n return [\n 'inputChanged(hass, inDialog, stateObj)',\n ];\n }\n\n connectedCallback() {\n super.connectedCallback();\n const container = this.parentNode.parentNode;\n if (container.tagName === 'DIV' &&\n (container.classList.contains('state') || container.classList.contains('child-card'))) {\n this._container = container;\n\n // Since this doesn't actually change the background - no need to clear it.\n container.style.setProperty(\n 'background-color', 'var(--paper-card-background-color, inherit)');\n\n // Polyfill 'updateStyles'.\n if (!container.updateStyles) {\n container.updateStyles = (styles) => {\n Object.keys(styles).forEach((key) => {\n container.style.setProperty(key, styles[key]);\n });\n };\n }\n }\n this._isAttached = true;\n this.inputChanged(this.hass, this.inDialog, this.stateObj);\n }\n\n disconnectedCallback() {\n this._isAttached = false;\n if (this._container) {\n this._container.updateStyles({ display: '', margin: '', padding: '' });\n applyThemesOnElement(\n this._container, this.hass.themes || { default_theme: 'default', themes: {} }, 'default');\n this._container = null;\n }\n super.disconnectedCallback();\n }\n\n badgeMode(hass, stateObj, domain) {\n const states = [];\n if (domain === 'group') {\n stateObj.attributes.entity_id.forEach((id) => {\n const state = hass.states[id];\n if (!state) {\n /* eslint-disable no-console */\n console.warn(`Unknown ID ${id} in group ${stateObj.entity_id}`);\n /* eslint-enable no-console */\n return;\n }\n if (!stateObj.attributes.badges_list ||\n stateObj.attributes.badges_list.includes(state.entity_id)) {\n states.push(window.customUI.maybeChangeObject(\n this, state, false /* inDialog */, false /* allowHidden */));\n }\n });\n } else {\n states.push(stateObj);\n if (this._container) {\n this._container.style.display = 'inline-block';\n const params = { display: 'inline-block' };\n if (this._container.classList.contains('state')) {\n params.margin = 'var(--ha-badges-card-margin, 0)';\n }\n this.updateStyles(params);\n }\n }\n dynamicContentUpdater(\n this,\n 'HA-BADGES-CARD',\n { hass, states });\n if (this._container) {\n this._container.updateStyles({\n width: 'var(--ha-badges-card-width, initial)',\n 'text-align': 'var(--ha-badges-card-text-align, initial)',\n });\n }\n this.lastChild.style.fontSize = '85%';\n\n // Since this variable only affects badges mode - no need to clean it up.\n this.style.setProperty('--ha-state-label-badge-margin-bottom', '0');\n }\n\n cleanBadgeStyle() {\n if (this._container) {\n this._container.updateStyles({\n display: '',\n width: '',\n 'text-align': '',\n });\n }\n this.updateStyles({ display: '', margin: '' });\n }\n\n applyThemes(hass, modifiedObj) {\n let themeTarget = this;\n let themeName = 'default';\n if (this._container) {\n themeTarget = this._container;\n }\n if (modifiedObj.attributes.theme) {\n themeName = modifiedObj.attributes.theme;\n }\n applyThemesOnElement(\n themeTarget, hass.themes || { default_theme: 'default', themes: {} }, themeName);\n }\n\n maybeHideEntity(modifiedObj) {\n if (!modifiedObj) {\n if (this.lastChild) {\n this.removeChild(this.lastChild);\n }\n if (this._container) {\n this._container.updateStyles({ margin: '0', padding: '0' });\n }\n return true;\n }\n if (this._container) {\n this._container.updateStyles({ margin: '', padding: '' });\n }\n return false;\n }\n\n sliderEligible_(domain, obj, inDialog) {\n if (inDialog) return false;\n return DOMAIN_TO_SLIDER_SUPPORT[domain] &&\n (DOMAIN_TO_SLIDER_SUPPORT[domain] & obj.attributes.supported_features) &&\n obj.attributes.state_card_mode && obj.attributes.state_card_mode !== 'no-slider';\n }\n\n inputChanged(hass, inDialog, stateObj) {\n if (!stateObj || !hass || !this._isAttached) return;\n const domain = computeStateDomain(stateObj);\n const modifiedObj = window.customUI.maybeChangeObject(\n this, stateObj, inDialog, true /* allowHidden */);\n\n if (this.maybeHideEntity(modifiedObj)) return;\n\n this.applyThemes(hass, modifiedObj);\n\n if (!inDialog && modifiedObj.attributes.state_card_mode === 'badges') {\n this.badgeMode(hass, modifiedObj, domain);\n } else {\n this.regularMode_(hass, inDialog, modifiedObj, domain);\n }\n }\n\n regularMode_(hass, inDialog, stateObj, domain) {\n this.cleanBadgeStyle();\n\n const params = {\n hass,\n stateObj,\n inDialog,\n };\n const originalStateCardType = stateCardType(hass, stateObj);\n let customStateCardType;\n const secondaryStateCardType = stateObj.attributes.state_card_custom_ui_secondary;\n\n if (domain === 'light' && this.sliderEligible_(domain, stateObj, inDialog)) {\n Object.assign(params, {\n controlElement: 'ha-entity-toggle',\n serviceMin: 'turn_off',\n serviceMax: 'turn_on',\n valueName: 'brightness',\n domain,\n });\n customStateCardType = 'state-card-with-slider';\n } else if (domain === 'cover' && this.sliderEligible_(domain, stateObj, inDialog)) {\n Object.assign(params, {\n controlElement: 'ha-cover-controls',\n max: 100,\n serviceMin: 'close_cover',\n serviceMax: 'set_cover_position',\n setValueName: 'position',\n valueName: 'current_position',\n nameOn: 'open',\n domain,\n });\n customStateCardType = 'state-card-with-slider';\n } else if (domain === 'climate' && this.sliderEligible_(domain, stateObj, inDialog)) {\n Object.assign(params, {\n controlElement: 'ha-climate-state',\n min: stateObj.attributes.min_temp || -100,\n max: stateObj.attributes.max_temp || 200,\n serviceMin: 'set_temperature',\n serviceMax: 'set_temperature',\n valueName: 'temperature',\n nameOn: '',\n domain,\n });\n customStateCardType = 'state-card-with-slider';\n } else if (TYPE_TO_CONTROL[originalStateCardType] !== undefined) {\n params.controlElement = TYPE_TO_CONTROL[originalStateCardType];\n customStateCardType = 'state-card-without-slider';\n } else if (stateObj.attributes.show_last_changed &&\n !SHOW_LAST_CHANGED_BLACKLISTED_CARDS.includes(originalStateCardType)) {\n params.inDialog = true;\n }\n if (stateObj.state === 'unavailable') {\n params.controlElement = '';\n }\n if (stateObj.attributes.control_element !== undefined) {\n params.controlElement = stateObj.attributes.control_element;\n }\n\n dynamicContentUpdater(\n this,\n (secondaryStateCardType || customStateCardType || `STATE-CARD-${originalStateCardType}`).toUpperCase(),\n params);\n }\n }\n customElements.define('state-card-custom-ui', StateCardCustomUi);\n}\nif (Polymer && Polymer.Element && customElements.get('home-assistant')) {\n loadCustomUI();\n} else {\n customElements.whenDefined('home-assistant').then(() => loadCustomUI());\n}\n","import { HassEntity } from \"home-assistant-js-websocket\";\nimport canToggleState from \"./can_toggle_state\";\nimport computeStateDomain from \"./compute_state_domain\";\nimport { DOMAINS_WITH_CARD } from \"../const\";\nimport { HomeAssistant } from \"../../types\";\n\nexport default function stateCardType(\n hass: HomeAssistant,\n stateObj: HassEntity\n) {\n if (stateObj.state === \"unavailable\") {\n return \"display\";\n }\n\n const domain = computeStateDomain(stateObj);\n\n if (DOMAINS_WITH_CARD.includes(domain)) {\n return domain;\n }\n if (\n canToggleState(hass, stateObj) &&\n stateObj.attributes.control !== \"hidden\"\n ) {\n return \"toggle\";\n }\n return \"display\";\n}\n","import { HassEntity } from \"home-assistant-js-websocket\";\nimport canToggleDomain from \"./can_toggle_domain\";\nimport computeStateDomain from \"./compute_state_domain\";\nimport { HomeAssistant } from \"../../types\";\nimport { supportsFeature } from \"./supports-feature\";\n\nexport default function canToggleState(\n hass: HomeAssistant,\n stateObj: HassEntity\n) {\n const domain = computeStateDomain(stateObj);\n if (domain === \"group\") {\n return stateObj.state === \"on\" || stateObj.state === \"off\";\n }\n if (domain === \"climate\") {\n return supportsFeature(stateObj, 4096);\n }\n\n return canToggleDomain(hass, domain);\n}\n","import { HomeAssistant } from \"../../types\";\n\nexport default function canToggleDomain(hass: HomeAssistant, domain: string) {\n const services = hass.services[domain];\n if (!services) {\n return false;\n }\n\n if (domain === \"lock\") {\n return \"lock\" in services;\n }\n if (domain === \"cover\") {\n return \"open_cover\" in services;\n }\n return \"turn_on\" in services;\n}\n","import { html } from '@polymer/polymer/lib/utils/html-tag.js';\nimport applyThemesOnElement from '../../home-assistant-polymer/src/common/dom/apply_themes_on_element.ts';\n\nimport './dynamic-element.js';\nimport '../utils/hooks.js';\n\ncustomElements.whenDefined('state-card-display').then(() => {\n /**\n * @extends HTMLElement\n */\n class DynamicWithExtra extends customElements.get('state-card-display') {\n static get template() {\n return html`\n <style is=\"custom-style\" include=\"iron-flex iron-flex-alignment iron-flex-factors\"></style>\n <style>\n :host {\n display: inline-block;\n }\n .control-wrapper {\n margin: -4px -16px -4px 0;\n padding: 4px 16px;\n }\n ha-state-label-badge {\n margin-left: 8px;\n }\n dynamic-element {\n display: block;\n text-align: right;\n }\n #overlay {\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n text-align: right;\n z-index: 1;\n }\n #lock {\n margin-top: 8px;\n opacity: 0.3;\n margin-right: 7px;\n }\n #lock.ha-cover-controls {\n margin-right: 52px;\n background-color: white;\n }\n .extra {\n margin-bottom: -16px;\n --ha-label-badge-size: 36px;\n --ha-label-badge-font-size: 1.2em;\n }\n .state {\n @apply --paper-font-body1;\n color: var(--primary-text-color);\n margin-left: 16px;\n text-align: right;\n line-height: 40px;\n }\n </style>\n <div class$='[[extraClass(extraObjVisible)]] horizontal layout'>\n <template is='dom-if' if='[[extraObjVisible]]'>\n <template is='dom-repeat'\n items='[[extraObj]]'\n on-dom-change='extraDomChanged'>\n <ha-state-label-badge hass='[[hass]]' state='[[item]]'></ha-state-label-badge>\n </template>\n </template>\n <template is='dom-if' if='[[_showControl(inDialog, stateObj)]]'>\n <template is='dom-if' if='[[controlElement]]'>\n <div class=\"control-wrapper\">\n <dynamic-element\n class='flex'\n state-obj=\"[[stateObj]]\"\n hass='[[hass]]'\n element-name='[[controlElement]]'>\n </dynamic-element>\n <template is='dom-if' if='[[isConfirmControls(stateObj)]]'>\n <div id=\"overlay\" on-click='clickHandler'>\n <template is='dom-if' if='[[stateObj.attributes.confirm_controls_show_lock]]'>\n <iron-icon id=\"lock\" class$=\"[[controlElement]]\" icon=\"mdi:lock-outline\"></iron-icon>\n </template>\n </div>\n </template>\n </div>\n </template>\n <template is='dom-if' if='[[!controlElement]]'>\n <div class='state'>[[computeStateDisplay(stateObj)]]</div>\n </template>\n </template>\n </div>\n `;\n }\n\n static get properties() {\n return {\n hass: Object,\n inDialog: {\n type: Boolean,\n value: false,\n },\n stateObj: Object,\n controlElement: String,\n extraObj: {\n type: Array,\n computed: 'computeExtra(hass, stateObj, _attached)',\n },\n _attached: Boolean,\n extraObjVisible: {\n type: Boolean,\n computed: 'computeExtraVisible(extraObj, inDialog)',\n },\n };\n }\n\n connectedCallback() {\n super.connectedCallback();\n this._attached = true;\n }\n\n disconnectedCallback() {\n this._isAttached = false;\n super.disconnectedCallback();\n }\n\n computeExtra(hass, stateObj, attached) {\n if (!stateObj.attributes.extra_badge || !attached) return [];\n let extraBadges = stateObj.attributes.extra_badge;\n if (!Array.isArray(extraBadges)) {\n extraBadges = [extraBadges];\n }\n return extraBadges.map((extraBadge) => {\n let result = null;\n if (extraBadge.entity_id && hass.states[extraBadge.entity_id]) {\n result = Object.assign({}, window.customUI.maybeChangeObject(\n this, hass.states[extraBadge.entity_id], this.inDialog,\n /* allowHidden= */false));\n } else if (extraBadge.attribute &&\n stateObj.attributes[extraBadge.attribute] !== undefined) {\n result = {\n state: String(stateObj.attributes[extraBadge.attribute]),\n entity_id: 'none.none',\n attributes: { unit_of_measurement: extraBadge.unit },\n };\n }\n if (!result) return null;\n let blacklist = extraBadge.blacklist_states;\n if (blacklist !== undefined) {\n if (!Array.isArray(blacklist)) {\n blacklist = [blacklist];\n }\n if (blacklist.some(v => RegExp(v).test(result.state.toString()))) {\n return null;\n }\n }\n result._entityDisplay = '';\n result.attributes = Object.assign({}, { friendly_name: '' });\n return result;\n }).filter(extraBadge => extraBadge != null);\n }\n\n computeExtraVisible(extraObj, inDialog) {\n if (inDialog || !extraObj) return false;\n return extraObj.length !== 0;\n }\n\n extraClass(extraObjVisible) {\n return extraObjVisible ? 'extra' : '';\n }\n\n _showControl(inDialog, stateObj) {\n if (inDialog) return true;\n return !stateObj.attributes.hide_control;\n }\n\n computeStateDisplay(stateObj) {\n // haLocalize removed in 0.61\n return super.computeStateDisplay(this.haLocalize || this.localize, stateObj);\n }\n\n isConfirmControls(stateObj) {\n return stateObj.attributes.confirm_controls ||\n stateObj.attributes.confirm_controls_show_lock;\n }\n\n clickHandler(e) {\n this.root.querySelector('#overlay').style.pointerEvents = 'none';\n const lock = this.root.querySelector('#lock');\n if (lock) {\n lock.icon = 'mdi:lock-open-outline';\n lock.style.opacity = '0.1';\n }\n window.setTimeout(() => {\n this.root.querySelector('#overlay').style.pointerEvents = '';\n if (lock) {\n lock.icon = 'mdi:lock-outline';\n lock.style.opacity = '';\n }\n }, 5000);\n e.stopPropagation();\n }\n\n applyThemes(hass, element, stateObj) {\n const themeName = stateObj.attributes.theme || 'default';\n applyThemesOnElement(\n element, hass.themes || { default_theme: 'default', themes: {} }, themeName);\n }\n\n extraDomChanged() {\n this.root.querySelectorAll('ha-state-label-badge')\n .forEach((elem) => {\n this.applyThemes(this.hass, elem, elem.state);\n });\n }\n }\n customElements.define('dynamic-with-extra', DynamicWithExtra);\n});\n","/**\n@license\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n\nwindow.JSCompiler_renameProperty = function(prop) { return prop; };\n"],"sourceRoot":""}