UNPKG

nice-ui

Version:

React design system, components, and utilities

64 lines (63 loc) 2.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.addPlaceholderPlugin = addPlaceholderPlugin; /** * This adds `placeholder` prop to CodeMirror config. * * @param CodeMirror */ function addPlaceholderPlugin(CodeMirror) { CodeMirror.defineOption('placeholder', '', (cm, val, old) => { const prev = old && old !== CodeMirror.Init; if (val && !prev) { cm.on('blur', onBlur); cm.on('change', onChange); cm.on('swapDoc', onChange); onChange(cm); } else if (!val && prev) { cm.off('blur', onBlur); cm.off('change', onChange); cm.off('swapDoc', onChange); clearPlaceholder(cm); const wrapper = cm.getWrapperElement(); wrapper.className = wrapper.className.replace(' CodeMirror-empty', ''); } if (val && !cm.hasFocus()) onBlur(cm); }); function clearPlaceholder(cm) { if (cm.state.placeholder) { cm.state.placeholder.parentNode.removeChild(cm.state.placeholder); cm.state.placeholder = null; } } function setPlaceholder(cm) { clearPlaceholder(cm); const elt = (cm.state.placeholder = document.createElement('pre')); elt.style.cssText = 'height: 0; overflow: visible'; elt.style.direction = cm.getOption('direction'); elt.className = 'CodeMirror-placeholder CodeMirror-line-like'; let placeHolder = cm.getOption('placeholder'); if (typeof placeHolder === 'string') placeHolder = document.createTextNode(placeHolder); elt.appendChild(placeHolder); cm.display.lineSpace.insertBefore(elt, cm.display.lineSpace.firstChild); } function onBlur(cm) { if (isEmpty(cm)) setPlaceholder(cm); } function onChange(cm) { const wrapper = cm.getWrapperElement(); const empty = isEmpty(cm); wrapper.className = wrapper.className.replace(' CodeMirror-empty', '') + (empty ? ' CodeMirror-empty' : ''); if (empty) setPlaceholder(cm); else clearPlaceholder(cm); } function isEmpty(cm) { return cm.lineCount() === 1 && cm.getLine(0) === ''; } }