@ideal-postcodes/address-finder
Version:
Address Finder JS library backed by the Ideal Postcodes UK address search API
64 lines (63 loc) • 3.28 kB
JavaScript
import { idpcState, loadStyle, isString, injectStyle, } from "@ideal-postcodes/jsutil";
/**
* Default CSS
*
* @hidden
*/
const d = `.idpc_af.hidden{display:none}div.idpc_autocomplete{position:relative;margin:0!important;padding:0;border:0;color:#28282b;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}div.idpc_autocomplete>input{display:block}div.idpc_af{position:absolute;left:0;z-index:2000;min-width:100%;box-sizing:border-box;border-radius:3px;background:#fff;border:1px solid rgba(0,0,0,.3);box-shadow:.05em .2em .6em rgba(0,0,0,.2);text-shadow:none;padding:0;margin-top:2px}div.idpc_af>ul{list-style:none;padding:0;max-height:250px;overflow-y:scroll;margin:0!important}div.idpc_af>ul>li{position:relative;padding:.2em .5em;cursor:pointer;margin:0!important}div.idpc_toolbar{padding:.3em .5em;border-top:1px solid rgba(0,0,0,.3);text-align:right}div.idpc_af>ul>li:hover{background-color:#e5e4e2}div.idpc_af>ul>li.idpc_error{padding:.5em;text-align:center;cursor:default!important}div.idpc_af>ul>li.idpc_error:hover{background:#fff;cursor:default!important}div.idpc_af>ul>li[aria-selected=true]{background-color:#e5e4e2;z-index:3000}div.idpc_autocomplete>.idpc-unhide{font-size:.9em;text-decoration:underline;cursor:pointer}div.idpc_af>div>span{padding:.2em .5em;border-radius:3px;cursor:pointer;font-size:110%}span.idpc_icon{font-size:1.2em;line-height:1em;vertical-align:middle}div.idpc_toolbar>span span.idpc_country{margin-right:.3em;max-width:0;font-size:.9em;-webkit-transition:max-width .5s ease-out;transition:max-width .5s ease-out;display:inline-block;vertical-align:middle;white-space:nowrap;overflow:hidden}div.idpc_autocomplete>div>div>span:hover span.idpc_country{max-width:7em}div.idpc_autocomplete>div>div>span:hover{background-color:#e5e4e2;-webkit-transition:background-color .5s ease;-ms-transition:background-color .5s ease;transition:background-color .5s ease}`;
/**
* Injects CSS style into DOM
*
* Idempotent
*
* @hidden
*/
export const addStyle = (c) => {
const style = c.options.injectStyle;
if (!style)
return;
const g = idpcState();
if (!g.afstyle)
g.afstyle = {};
if (isString(style) && !g.afstyle[style]) {
g.afstyle[style] = true;
const link = loadStyle(style, c.document);
c.document.head.appendChild(link);
return link;
}
if (style === true && !g.afstyle[""]) {
g.afstyle[""] = true;
return injectStyle(d, c.document);
}
return;
};
/**
* Returns a negative offset which can be used to correctly align input box
* @hidden
*/
export const computeOffset = (c) => {
let offset;
const input = c.input;
if (c.options.alignToInput === false)
return {};
try {
const w = c.options.document.defaultView;
if (!w)
return {};
offset = w.getComputedStyle(input).marginBottom;
}
catch (_) {
return {};
}
if (!offset)
return {};
const nOffset = parseInt(offset.replace("px", ""), 10);
if (isNaN(nOffset))
return {};
if (nOffset === 0)
return {};
const negativeOffset = nOffset * -1 + c.options.offset;
return {
marginTop: negativeOffset + "px",
};
};