Greasy Fork is available in English.
shortcuts to create DDS library component HTML
当前为
此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.greasyfork.icu/scripts/454586/1120027/Online%20IDE%20DDS%20Create.js
const create = {
actionMenu: (options = {}) => {
const classAm = options.class || ``;
const trigger = options.trigger || {};
const dataAlignment = options[`data-alignment`] || `start`;
if (!options.trigger) {
options.trigger = {};
}
if (!options.trigger.class) {
options.trigger.class = `dds__button--secondary`;
}
if (!options.trigger.text) {
options.trigger.text = `Actions`;
}
const id = options.id || `actionMenu${pen.utils.random()}`;
const useChevron = options.useChevron || false;
const noo = {};
noo.actionMenu = pen.utils.createElement(`div`, {
id: id,
class: `dds__action-menu ${classAm}`,
'data-trigger': `#${id}--trigger`,
'data-dds': `action-menu`,
'data-alignment': dataAlignment,
});
noo.trigger = pen.utils.createElement(`button`, {
id: noo.actionMenu.getAttribute(`data-trigger`).replace(`#`, ''),
type: `button`,
class: `dds__button ${trigger.class}`,
});
noo.trigger.appendChild(pen.utils.createElement(`span`, {
class: `ddsc__action-menu__trigger-label`,
text: trigger.text
}));
if (useChevron) {
const handleActionClick = (e) => {
e.target.querySelector(`.dds__icon`).classList.toggle(`action-rotated`);
}
noo.chevron = pen.utils.createElement(`i`, {
class: `dds__icon dds__icon--chevron-down action-chevron`,
});
noo.trigger.appendChild(noo.chevron);
create.listener(`#${id}`, `ddsActionMenuOpenEvent`, handleActionClick);
create.listener(`#${id}`, `ddsActionMenuCloseEvent`, handleActionClick);
}
noo.container = pen.utils.createElement(`div`, {
class: `dds__action-menu__container`,
tabindex: `-1`,
role: `presentation`,
'aria-hidden': `true`,
});
noo.menu = pen.utils.createElement(`div`, {
class: `dds__action-menu__menu`,
role: `menu`,
tabindex: `-1`,
});
noo.menuLi = pen.utils.createElement(`li`, {
role: `presentation`,
});
noo.group = pen.utils.createElement(`span`, {
id: `${id}--group`
});
noo.groupUl = pen.utils.createElement(`ul`, {
id: `${id}--groupUl`,
class: `ddsc__action-menu--groupUl`,
role: `group`,
'aria-labelledby': noo.group.getAttribute(`id`)
});
noo.actionMenu.appendChild(noo.trigger);
noo.actionMenu.appendChild(noo.container);
noo.container.appendChild(noo.menu);
noo.menu.appendChild(noo.menuLi);
noo.menuLi.appendChild(noo.group);
noo.group.appendChild(noo.groupUl);
// Adding a method to the element doesn't seem to be work
// const observerDefs = [
// {
// selector: `#${id}`,
// callback: (elem) => {
// elem.addItem = (itemOptions) => {
// document.getElementById(`${id}--groupUl`).appendChild(create.actionMenuItem(itemOptions));
// };
// }
// }
// ];
// createObserver(observerDefs);
return noo.actionMenu;
},
actionMenuItem: (options = {}) => {
const noo = {};
const label = options.text || `Item Text`;
const asOption = options[`data-value`] != null || false;
const dataValue = options[`data-value`] || undefined;
const id = `${label.replace(/[^0-9a-zA-Z]+/, ``)}_${pen.utils.random()}`;
noo.item = pen.utils.createElement(`li`, {
class: asOption ? `dds__action-menu__option` : `dds__action-menu__item`,
role: `none`,
});
noo.itemButton = pen.utils.createElement(`button`, {
id: id,
type: `button`,
role: asOption ? `menuitemcheckbox` : `menuitem`,
tabindex: `-1`,
'aria-disabled': `false`,
'aria-checked': `false`,
'data-value': dataValue,
});
noo.itemSvg = pen.utils.createElement(`svg`, {
class: `dds__action-menu__icon`,
'aria-hidden': `true`,
});
noo.itemSvgUse = pen.utils.createElement(`use`, {
'xlink:href': `#dds__icon--copy-alt`,
});
noo.itemText = pen.utils.createElement(`span`, {
text: label,
});
noo.item.appendChild(noo.itemButton);
noo.itemButton.appendChild(noo.itemSvg);
noo.itemButton.appendChild(noo.itemText);
noo.itemSvg.appendChild(noo.itemSvgUse);
if (options.onclick) {
create.listener(`#${id}`, `click`, options.onclick);
}
return noo.item;
},
button: (options = {}) => {
const id = options.id || `button_${pen.utils.random()}`;
const bClass = options.class || ``;
const bText = options.text || `Button`;
const iconIsString = options.icon && typeof options.icon === `string`;
const iconObjectName = !iconIsString && options.icon ? options.icon.name : undefined;
const iconObjectClass = !iconIsString && options.icon && options.icon.class ? options.icon.class : ``;
const bIcon = {
name: iconIsString ? options.icon : iconObjectName,
class: iconObjectClass
};
const noo = {};
noo.button = pen.utils.createElement(`button`, {
id: id,
class: `dds__button ${bClass}`,
type: `button`,
text: bText,
});
if (bIcon.name) {
noo.icon = pen.utils.createElement(`i`, {
class: `dds__icon dds__icon--${bIcon.name} ${bIcon.class}`,
'aria-hidden': `true`,
});
if (options.icon.class.indexOf(`--end`) > -1) {
noo.button.appendChild(noo.icon);
} else {
noo.button.prepend(noo.icon);
}
}
if (options.onclick) {
create.listener(`#${id}`, `click`, options.onclick);
}
return noo.button;
},
listener: function (selector, event, handler) {
let rootElement = document.querySelector('body');
//since the root element is set to be body for our current dealings
rootElement.addEventListener(event, function (evt) {
var targetElement = evt.target;
while (targetElement != null) {
if (targetElement.matches(selector)) {
handler(evt);
return;
}
targetElement = targetElement.parentElement;
}
},
true
);
},
popover: (options = {}) => {
const id = options.id || `popover_${pen.utils.random()}`;
const dataTrigger = options['data-trigger'] || undefined;
const dataPlacement = options['data-placement'] || `bottom-end`;
const classPo = options.class || ``;
const callback = options.callback || undefined;
const arrow = options.arrow === undefined ? true : options.arrow;
const close = options.close === undefined ? true : options.close;
if (!dataTrigger) {
console.error(`Send a data-trigger with a value like "#your-element-id"`);
return;
}
if (!arrow) {
// if (dataPlacement.indexOf(`bottom`) > -1) {
// pen.utils.addStyle(`#${id} { top: -12px;}`);
// } else if (dataPlacement.indexOf(`top`) > -1) {
// pen.utils.addStyle(`#${id} { top: 12px;}`);
// } else if (dataPlacement.indexOf(`left`) > -1) {
// pen.utils.addStyle(`#${id} { left: 12px;}`);
// } else if (dataPlacement.indexOf(`right`) > -1) {
// pen.utils.addStyle(`#${id} { left: -12px;}`);
// }
pen.utils.addStyle(`#${id} .dds__popover__pointer { display: none !important;}`);
}
if (!close) {
pen.utils.addStyle(`#${id} .dds__popover__close { display: none !important;}`);
}
if (!options.title) {
pen.utils.addStyle(`#${id} .dds__popover__header { display: none !important;}`);
}
const nooPopover = pen.utils.createElement(`div`, {
id: id,
class: `dds__popover ${classPo}`,
role: `dialog`,
'aria-labelledby': `${id}--title`,
'data-placement': dataPlacement,
'data-dds': `popover`,
'data-trigger': dataTrigger,
});
const nooContent = pen.utils.createElement(`div`, {
class: `dds__popover__content`,
});
const nooHeader = pen.utils.createElement(`div`, {
class: `dds__popover__header`,
});
const nooHeadline = pen.utils.createElement(`h6`, {
id: `${id}--title`,
class: `dds__popover__headline`,
text: options.title,
});
const nooBody = pen.utils.createElement(`div`, {
class: `dds__popover__body`,
text: options.body,
});
if (callback) {
callback(nooBody);
}
nooPopover.appendChild(nooContent);
nooContent.appendChild(nooHeader);
nooContent.appendChild(nooBody);
nooHeader.appendChild(nooHeadline);
return nooPopover;
},
radioButton: (options = {}) => {
const id = options.id || `radiobutton_${pen.utils.random()}`;
const componentClass = options.class || ``;
const legend = options.legend || ``;
const nooSet = pen.utils.createElement(`fieldset`, {
class: `dds__fieldset dds__radio-button-group ${componentClass}`,
role: `radiogroup`,
});
if (options.required) {
nooSet.setAttribute(`required`, true);
nooSet.setAttribute(`aria-required`, true);
}
const nooLegend = pen.utils.createElement(`legend`, {
text: legend,
})
if (legend) nooSet.appendChild(nooLegend);
options.buttons.forEach((radio, rIndex) => {
const radioClass = radio.class || ``;
const radioValue = radio.value || ``;
const radioLabel = radio.label || ``;
const nooButton = pen.utils.createElement(`div`, {
class: `dds__radio-button ${radioClass}`,
});
const nooInput = pen.utils.createElement(`input`, {
class: `dds__radio-button__input`,
type: `radio`,
name: `${id}--button-name`,
id: `${id}--button${rIndex}`,
value: radioValue,
});
const nooLabel = pen.utils.createElement(`label`, {
class: `dds__radio-button__label`,
id: `${id}--button-label${rIndex}`,
for: `${id}--button${rIndex}`,
text: radioLabel,
});
nooButton.appendChild(nooInput);
nooButton.appendChild(nooLabel);
nooSet.appendChild(nooButton);
});
const nooError = pen.utils.createElement(`div`, {
id: `${id}--error`,
class: `dds__invalid-feedback`,
text: options.error || ``,
});
nooSet.appendChild(nooError);
return nooSet;
},
textInput: (options = {}) => {
const id = options.id || `textinput_${pen.utils.random()}`;
const componentClass = options.class || ``;
const nooTextInput = pen.utils.createElement(`div`, {
id: id,
class: `dds__text-input ${componentClass}`,
});
const nooLabel = pen.utils.createElement(`label`, {
label: `${id}--label`,
for: `${id}--input`,
text: options.label,
});
const nooWrapper = pen.utils.createElement(`div`, {
class: `dds__input-text__wrapper`,
});
const nooInput = pen.utils.createElement(`input`, {
type: `text`,
class: `dds__input-text`,
name: `${id}--input`,
id: `${id}--input`,
'aria-labelledby': `{$id}--input`,
});
if (options.required) {
nooInput.setAttribute(`required`, true);
}
if (options[`max-length`]) {
nooInput.setAttribute(`max-length`, options[`max-length`]);
}
const nooHelper = pen.utils.createElement(`small`, {
id: `${id}--helper`,
class: `dds__input-text__helper ${!options.helper ? `dds__d-none` : ``}`,
text: options.helper,
});
const nooError = pen.utils.createElement(`div`, {
id: `${id}--error`,
class: `dds__invalid-feedback ${!options.error ? `dds__d-none` : ``}`,
text: options.error,
});
if (!options.helper) {
pen.utils.addStyle(`#${id} { margin-top: -12px; margin-bottom: 9px;}`);
}
nooTextInput.appendChild(nooLabel);
nooTextInput.appendChild(nooWrapper);
nooWrapper.appendChild(nooInput);
nooWrapper.appendChild(nooHelper);
nooWrapper.appendChild(nooError);
return nooTextInput;
},
}