Greasy Fork

Greasy Fork is available in English.

Online IDE DDS Create

shortcuts to create DDS library component HTML

当前为 2022-11-22 提交的版本,查看 最新版本

此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.greasyfork.icu/scripts/454586/1120027/Online%20IDE%20DDS%20Create.js

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

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;
    },
}