uikit
Version:
UIkit is a lightweight and modular front-end framework for developing fast and powerful web interfaces.
102 lines (66 loc) • 2.61 kB
JavaScript
import {$$, assign, camelize, fastdom, hyphenate, isPlainObject, memoize, startsWith} from 'uikit-util';
export default function (UIkit) {
const DATA = UIkit.data;
const components = {};
UIkit.component = function (name, options) {
const id = hyphenate(name);
name = camelize(id);
if (!options) {
if (isPlainObject(components[name])) {
components[name] = UIkit.extend(components[name]);
}
return components[name];
}
UIkit[name] = function (element, data) {
const component = UIkit.component(name);
return component.options.functional
? new component({data: isPlainObject(element) ? element : [...arguments]})
: !element ? init(element) : $$(element).map(init)[0];
function init(element) {
const instance = UIkit.getComponent(element, name);
if (instance) {
if (!data) {
return instance;
} else {
instance.$destroy();
}
}
return new component({el: element, data});
}
};
const opt = isPlainObject(options) ? assign({}, options) : options.options;
opt.name = name;
if (opt.install) {
opt.install(UIkit, opt, name);
}
if (UIkit._initialized && !opt.functional) {
fastdom.read(() => UIkit[name](`[uk-${id}],[data-uk-${id}]`));
}
return components[name] = isPlainObject(options) ? opt : options;
};
UIkit.getComponents = element => element && element[DATA] || {};
UIkit.getComponent = (element, name) => UIkit.getComponents(element)[name];
UIkit.connect = node => {
if (node[DATA]) {
for (const name in node[DATA]) {
node[DATA][name]._callConnected();
}
}
for (let i = 0; i < node.attributes.length; i++) {
const name = getComponentName(node.attributes[i].name);
if (name && name in components) {
UIkit[name](node);
}
}
};
UIkit.disconnect = node => {
for (const name in node[DATA]) {
node[DATA][name]._callDisconnected();
}
};
}
export const getComponentName = memoize(attribute => {
return startsWith(attribute, 'uk-') || startsWith(attribute, 'data-uk-')
? camelize(attribute.replace('data-uk-', '').replace('uk-', ''))
: false;
});