{"version":3,"file":"icons.cjs","sources":["../src/icons.ts"],"sourcesContent":["/**\n * Copyright 2023 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\nexport type IconProvider = (iconId: string) => HTMLElement | URL | string;\n\nexport enum MaterialIconsStyle {\n  FILLED = 'filled',\n  OUTLINED = 'outlined',\n  ROUNDED = 'rounded',\n  SHARP = 'sharp',\n  TWOTONE = 'twotone'\n}\n\n/** The options for the MaterialIcons icon-provider. */\nexport type MaterialIconsOptions = {\n  /** The material icon style to use. */\n  style: MaterialIconsStyle;\n  /**\n   * Wether or not to automatically append the required stylesheet for the\n   * icon-font.\n   */\n  appendFontStylesheet: boolean;\n};\n\nconst DEFAULT_OPTIONS: MaterialIconsOptions = {\n  style: MaterialIconsStyle.FILLED,\n  appendFontStylesheet: true\n};\n\nconst materialIconsClasses = {\n  [MaterialIconsStyle.FILLED]: 'material-icons',\n  [MaterialIconsStyle.OUTLINED]: 'material-icons-outlined',\n  [MaterialIconsStyle.ROUNDED]: 'material-icons-round',\n  [MaterialIconsStyle.SHARP]: 'material-icons-sharp',\n  [MaterialIconsStyle.TWOTONE]: 'material-icons-two-tone'\n};\n\nconst materialIconsGFontsFamily = {\n  [MaterialIconsStyle.FILLED]: 'Material Icons',\n  [MaterialIconsStyle.OUTLINED]: 'Material Icons Outlined',\n  [MaterialIconsStyle.ROUNDED]: 'Material Icons Round',\n  [MaterialIconsStyle.SHARP]: 'Material Icons Sharp',\n  [MaterialIconsStyle.TWOTONE]: 'Material Icons Two Tone'\n};\n\nconst GFONTS_BASE_URL = 'https://fonts.googleapis.com/css2';\n\n/**\n * Creates the MaterialIcons icon-provider. This will load the appropriate\n * material icons font if it's not detected and return the icon-provider\n * function that creates the dom-elements for the requested icon.\n *\n * @param options\n */\nexport function MaterialIcons(\n  options?: Partial<MaterialIconsOptions>\n): IconProvider {\n  const optionsWithDefaults: MaterialIconsOptions = {\n    ...DEFAULT_OPTIONS,\n    ...options\n  };\n\n  console.info('initialize MaterialIcons icon provider');\n\n  // fixme: add support for self-hosted fonts\n  const requestedFamily = materialIconsGFontsFamily[optionsWithDefaults.style];\n  if (\n    optionsWithDefaults.appendFontStylesheet &&\n    !isFontLoaded(requestedFamily)\n  ) {\n    console.info(`loading font-family '${requestedFamily}'`);\n    appendFontStylesheet(requestedFamily);\n  } else {\n    console.info(`font-family '${requestedFamily}' already loaded`);\n  }\n\n  return iconId =>\n    createSpan(materialIconsClasses[optionsWithDefaults.style], iconId, {\n      fontSize: 'calc(15px * var(--marker-scale, 1.0))'\n    });\n}\n\n/**\n * Creates the PlaceIcons icon provider. This provider will use the SVG-icons\n * for the places API.\n */\nexport function PlaceIcons(): IconProvider {\n  return iconId =>\n    new URL(\n      `https://maps.gstatic.com/mapfiles/place_api/icons/v2/${iconId}_pinlet.svg`\n    );\n}\n\n/**\n * Creates the span element for the specified icon.\n *\n * @param className\n * @param content\n * @param styles\n */\nfunction createSpan(\n  className: string,\n  content: string,\n  styles: Record<string, string | number> | null = null\n): HTMLElement {\n  const el = document.createElement('span');\n\n  el.className = className;\n  el.textContent = content;\n\n  Object.assign(el.style, styles);\n\n  return el;\n}\n\n/**\n * Checks existing google fonts link tags for the specified material-icons\n * font-family.\n *\n * @param family\n */\nfunction isFontLoaded(family: string): boolean {\n  const fontStylesheets = Array.from<HTMLLinkElement>(\n    document.querySelectorAll(\n      'link[rel=\"stylesheet\"][href*=\"fonts.googleapis.com\"]'\n    )\n  );\n\n  for (const stylesheet of fontStylesheets) {\n    const url = new URL(stylesheet.href);\n\n    let families = url.pathname.endsWith('css2')\n      ? url.searchParams.getAll('family')\n      : url.searchParams.get('family')?.split('|') || [];\n\n    families = families.map(s =>\n      s.includes(':') ? s.slice(0, s.indexOf(':')) : s\n    );\n\n    if (families.includes(family)) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\n/**\n * Appends the stylesheet to load the specified font-family.\n *\n * @param family\n */\nfunction appendFontStylesheet(family: string) {\n  const url = new URL(GFONTS_BASE_URL);\n  url.searchParams.append('family', family);\n  url.searchParams.set('display', 'block');\n\n  const linkEl = document.createElement('link');\n  linkEl.rel = 'stylesheet';\n  linkEl.href = url.toString();\n\n  document.head.appendChild(linkEl);\n}\n"],"names":["_materialIconsClasses","_materialIconsGFontsF","MaterialIconsStyle","DEFAULT_OPTIONS","style","FILLED","appendFontStylesheet","materialIconsClasses","OUTLINED","ROUNDED","SHARP","TWOTONE","materialIconsGFontsFamily","options","optionsWithDefaults","_extends","console","info","requestedFamily","family","_i","_fontStylesheets","Array","from","document","querySelectorAll","length","_url$searchParams$get","url","URL","href","families","pathname","endsWith","searchParams","getAll","get","split","map","s","includes","slice","indexOf","isFontLoaded","append","set","linkEl","createElement","rel","toString","head","appendChild","iconId","className","content","styles","el","textContent","Object","assign","createSpan","fontSize"],"mappings":"oOAkBA,IAAAA,EAAAC,EAAYC,EAAAA,mCAAAA,EAAAA,QAAkBA,qBAAlBA,QAAkBA,mBAM7B,KALC,OAAA,SACAA,EAAA,SAAA,WACAA,EAAA,QAAA,UACAA,EAAA,MAAA,QACAA,EAAA,QAAA,UAcF,IAAMC,EAAwC,CAC5CC,MAAOF,QAAkBA,mBAACG,OAC1BC,sBAAsB,GAGlBC,IAAoBP,EAAA,CAAA,GACvBE,2BAAmBG,QAAS,iBAAgBL,EAC5CE,2BAAmBM,UAAW,0BAAyBR,EACvDE,2BAAmBO,SAAU,uBAAsBT,EACnDE,QAAAA,mBAAmBQ,OAAQ,uBAAsBV,EACjDE,QAAAA,mBAAmBS,SAAU,0BAAyBX,GAGnDY,IAAyBX,EAAAA,CAAAA,GAC5BC,QAAAA,mBAAmBG,QAAS,iBAAgBJ,EAC5CC,QAAkBA,mBAACM,UAAW,0BAAyBP,EACvDC,QAAkBA,mBAACO,SAAU,uBAAsBR,EACnDC,QAAkBA,mBAACQ,OAAQ,uBAAsBT,EACjDC,QAAkBA,mBAACS,SAAU,0BAAyBV,kCAavDY,GAEA,IAAMC,EAAmBC,EACpBZ,GAAAA,EACAU,GAGLG,QAAQC,KAAK,0CAGb,IAAMC,EAAkBN,EAA0BE,EAAoBV,OAWtE,OATEU,EAAoBR,uBAsDxB,SAAsBa,GAOpB,IANA,IAMAC,EAAAC,EAAAA,EANwBC,MAAMC,KAC5BC,SAASC,iBACP,yDAIoCL,EAAAC,EAAAK,OAAAN,IAAE,KAAAO,EAClCC,EAAM,IAAIC,IADGR,EAAAD,GACYU,MAE3BC,EAAWH,EAAII,SAASC,SAAS,QACjCL,EAAIM,aAAaC,OAAO,WACxBR,OAAAA,EAAAC,EAAIM,aAAaE,IAAI,gBAArBT,EAAAA,EAAgCU,MAAM,OAAQ,GAMlD,IAJAN,EAAWA,EAASO,IAAI,SAAAC,GACtB,OAAAA,EAAEC,SAAS,KAAOD,EAAEE,MAAM,EAAGF,EAAEG,QAAQ,MAAQH,CAAC,IAGrCC,SAASrB,GACpB,OACF,CACF,CAEA,OACF,CAAA,CA7EKwB,CAAazB,IAEdF,QAAQC,KAAI,wBAAyBC,EAAe,KAkFxD,SAA8BC,GAC5B,IAAMS,EAAM,IAAIC,IA5GM,qCA6GtBD,EAAIM,aAAaU,OAAO,SAAUzB,GAClCS,EAAIM,aAAaW,IAAI,UAAW,SAEhC,IAAMC,EAAStB,SAASuB,cAAc,QACtCD,EAAOE,IAAM,aACbF,EAAOhB,KAAOF,EAAIqB,WAElBzB,SAAS0B,KAAKC,YAAYL,EAC5B,CA3FIxC,CAAqBY,IAErBF,QAAQC,KAAqBC,gBAAAA,EAAiC,6BAGzDkC,GAAM,OAwBf,SACEC,EACAC,EACAC,YAAAA,IAAAA,EAAiD,MAEjD,IAAMC,EAAKhC,SAASuB,cAAc,QAOlC,OALAS,EAAGH,UAAYA,EACfG,EAAGC,YAAcH,EAEjBI,OAAOC,OAAOH,EAAGpD,MAAOmD,GAEjBC,CACT,CApCII,CAAWrD,EAAqBO,EAAoBV,OAAQgD,EAAQ,CAClES,SAAU,yCACV,CACN,gCAOE,OAAO,SAAAT,GACL,OAAA,IAAIvB,4DACsDuB,EAAM,cAC/D,CACL"}