123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- // Copyright (c) Jupyter Development Team.
- // Distributed under the terms of the Modified BSD License.
- /**
- * A namespace for node styling.
- */
- export
- namespace Styling {
- /**
- * Style a node and its child elements with the default tag names.
- *
- * @param node - The base node.
- *
- * @param className - The optional CSS class to add to styled nodes.
- */
- export
- function styleNode(node: HTMLElement, className=''): void {
- styleNodeByTag(node, 'select', className);
- styleNodeByTag(node, 'input', className);
- styleNodeByTag(node, 'button', className);
- }
- /**
- * Style a node and its elements that have a given tag name.
- *
- * @param node - The base node.
- *
- * @param tagName - The html tag name to style.
- *
- * @param className - The optional CSS class to add to styled nodes.
- */
- export
- function styleNodeByTag(node: HTMLElement, tagName: string, className=''): void {
- if (node.localName === tagName) {
- node.classList.add('jp-mod-styled');
- }
- if (node.localName === 'select') {
- wrapSelect(node as HTMLSelectElement);
- }
- let nodes = node.getElementsByTagName(tagName);
- for (let i = 0; i < nodes.length; i++) {
- let child = nodes[i];
- child.classList.add('jp-mod-styled');
- if (className) {
- child.classList.add(className);
- }
- if (tagName === 'select') {
- wrapSelect(child as HTMLSelectElement);
- }
- }
- }
- /**
- * Wrap a select node.
- */
- export
- function wrapSelect(node: HTMLSelectElement): HTMLElement {
- let wrapper = document.createElement('div');
- wrapper.classList.add('jp-select-wrapper');
- node.addEventListener('focus', Private.onFocus);
- node.addEventListener('blur', Private.onFocus);
- node.classList.add('jp-mod-styled');
- if (node.parentElement) {
- node.parentElement.replaceChild(wrapper, node);
- }
- wrapper.appendChild(node);
- return wrapper;
- }
- }
- /**
- * The namespace for module private data.
- */
- namespace Private {
- /**
- * Handle a focus event on a styled select.
- */
- export
- function onFocus(event: FocusEvent): void {
- let target = event.target as Element;
- let parent = target.parentElement;
- if (event.type === 'focus') {
- parent.classList.add('jp-mod-focused');
- } else {
- parent.classList.remove('jp-mod-focused');
- }
- }
- }
|