UNPKG

@public-ui/react

Version:

React framework adapter for KoliBri - The accessible HTML-Standard.

308 lines (296 loc) 12.7 kB
'use strict'; const React = require('react'); function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e.default : e; } const React__default = /*#__PURE__*/_interopDefaultCompat(React); const dashToPascalCase = (str) => str.toLowerCase().split("-").map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1)).join(""); const camelToDashCase = (str) => str.replace(/([A-Z])/g, (m) => `-${m[0].toLowerCase()}`); const attachProps = (node, newProps, oldProps = {}) => { if (node instanceof Element) { const className = getClassName(node.classList, newProps, oldProps); if (className !== "") { node.className = className; } Object.keys(newProps).forEach((name) => { if (name === "children" || name === "style" || name === "ref" || name === "class" || name === "className" || name === "forwardedRef") { return; } if (name.indexOf("on") === 0 && name[2] === name[2].toUpperCase()) { const eventName = name.substring(2); const eventNameLc = eventName[0].toLowerCase() + eventName.substring(1); if (!isCoveredByReact(eventNameLc)) { syncEvent(node, eventNameLc, newProps[name]); } } else { node[name] = newProps[name]; const propType = typeof newProps[name]; if (propType === "string") { node.setAttribute(camelToDashCase(name), newProps[name]); } } }); } }; const getClassName = (classList, newProps, oldProps) => { const newClassProp = newProps.className || newProps.class; const oldClassProp = oldProps.className || oldProps.class; const currentClasses = arrayToMap(classList); const incomingPropClasses = arrayToMap(newClassProp ? newClassProp.split(" ") : []); const oldPropClasses = arrayToMap(oldClassProp ? oldClassProp.split(" ") : []); const finalClassNames = []; currentClasses.forEach((currentClass) => { if (incomingPropClasses.has(currentClass)) { finalClassNames.push(currentClass); incomingPropClasses.delete(currentClass); } else if (!oldPropClasses.has(currentClass)) { finalClassNames.push(currentClass); } }); incomingPropClasses.forEach((s) => finalClassNames.push(s)); return finalClassNames.join(" "); }; const transformReactEventName = (eventNameSuffix) => { switch (eventNameSuffix) { case "doubleclick": return "dblclick"; } return eventNameSuffix; }; /** * Checks if an event is supported in the current execution environment. * @license Modernizr 3.0.0pre (Custom Build) | MIT */ const isCoveredByReact = (eventNameSuffix) => { if (typeof document === "undefined") { return true; } else { const eventName = "on" + transformReactEventName(eventNameSuffix); let isSupported = eventName in document; if (!isSupported) { const element = document.createElement("div"); element.setAttribute(eventName, "return;"); isSupported = typeof element[eventName] === "function"; } return isSupported; } }; const syncEvent = (node, eventName, newEventHandler) => { const eventStore = node.__events || (node.__events = {}); const oldEventHandler = eventStore[eventName]; if (oldEventHandler) { node.removeEventListener(eventName, oldEventHandler); } node.addEventListener( eventName, eventStore[eventName] = function handler(e) { if (newEventHandler) { newEventHandler.call(this, e); } } ); }; const arrayToMap = (arr) => { const map = /* @__PURE__ */ new Map(); arr.forEach((s) => map.set(s, s)); return map; }; let tagNameTransformer; const setTagNameTransformer = (_tagNameTransformer) => { tagNameTransformer = _tagNameTransformer; }; const setRef = (ref, value) => { if (typeof ref === "function") { ref(value); } else if (ref != null) { ref.current = value; } }; const mergeRefs = (...refs) => { return (value) => { refs.forEach((ref) => { setRef(ref, value); }); }; }; const createForwardRef = (ReactComponent, displayName) => { const forwardRef = (props, ref) => { return /* @__PURE__ */ React__default.createElement(ReactComponent, { ...props, forwardedRef: ref }); }; forwardRef.displayName = displayName; return React__default.forwardRef(forwardRef); }; const createReactComponent = (tagName, ReactComponentContext, manipulatePropsFunction, defineCustomElement) => { if (defineCustomElement !== void 0) { defineCustomElement(); } const displayName = dashToPascalCase(tagName); const ReactComponent = class extends React__default.Component { constructor(props) { super(props); this.setComponentElRef = (element) => { this.componentEl = element; }; } componentDidMount() { this.componentDidUpdate(this.props); } componentDidUpdate(prevProps) { attachProps(this.componentEl, this.props, prevProps); } render() { const { children, forwardedRef, style, className, ref, ...cProps } = this.props; let propsToPass = Object.keys(cProps).reduce((acc, name) => { const value = cProps[name]; if (name.indexOf("on") === 0 && name[2] === name[2].toUpperCase()) { const eventName = name.substring(2).toLowerCase(); if (typeof document !== "undefined" && isCoveredByReact(eventName)) { acc[name] = value; } } else { const type = typeof value; if (type === "string" || type === "boolean" || type === "number") { acc[camelToDashCase(name)] = value; } } return acc; }, {}); if (manipulatePropsFunction) { propsToPass = manipulatePropsFunction(this.props, propsToPass); } const newProps = { ...propsToPass, ref: mergeRefs(forwardedRef, this.setComponentElRef), style }; const newTagName = typeof tagNameTransformer === "function" ? tagNameTransformer(tagName) : tagName; return React.createElement(newTagName, newProps, children); } static get displayName() { return displayName; } }; if (ReactComponentContext) { ReactComponent.contextType = ReactComponentContext; } return createForwardRef(ReactComponent, displayName); }; const KolAbbr = /* @__PURE__ */ createReactComponent("kol-abbr"); const KolAccordion = /* @__PURE__ */ createReactComponent("kol-accordion"); const KolAlert = /* @__PURE__ */ createReactComponent("kol-alert"); const KolAvatar = /* @__PURE__ */ createReactComponent("kol-avatar"); const KolBadge = /* @__PURE__ */ createReactComponent("kol-badge"); const KolBreadcrumb = /* @__PURE__ */ createReactComponent("kol-breadcrumb"); const KolButton = /* @__PURE__ */ createReactComponent("kol-button"); const KolButtonGroup = /* @__PURE__ */ createReactComponent("kol-button-group"); const KolButtonLink = /* @__PURE__ */ createReactComponent("kol-button-link"); const KolCard = /* @__PURE__ */ createReactComponent("kol-card"); const KolCombobox = /* @__PURE__ */ createReactComponent("kol-combobox"); const KolDetails = /* @__PURE__ */ createReactComponent("kol-details"); const KolDrawer = /* @__PURE__ */ createReactComponent("kol-drawer"); const KolForm = /* @__PURE__ */ createReactComponent("kol-form"); const KolHeading = /* @__PURE__ */ createReactComponent("kol-heading"); const KolIcon = /* @__PURE__ */ createReactComponent("kol-icon"); const KolImage = /* @__PURE__ */ createReactComponent("kol-image"); const KolIndentedText = /* @__PURE__ */ createReactComponent("kol-indented-text"); const KolInputCheckbox = /* @__PURE__ */ createReactComponent("kol-input-checkbox"); const KolInputColor = /* @__PURE__ */ createReactComponent("kol-input-color"); const KolInputDate = /* @__PURE__ */ createReactComponent("kol-input-date"); const KolInputEmail = /* @__PURE__ */ createReactComponent("kol-input-email"); const KolInputFile = /* @__PURE__ */ createReactComponent("kol-input-file"); const KolInputNumber = /* @__PURE__ */ createReactComponent("kol-input-number"); const KolInputPassword = /* @__PURE__ */ createReactComponent("kol-input-password"); const KolInputRadio = /* @__PURE__ */ createReactComponent("kol-input-radio"); const KolInputRange = /* @__PURE__ */ createReactComponent("kol-input-range"); const KolInputText = /* @__PURE__ */ createReactComponent("kol-input-text"); const KolKolibri = /* @__PURE__ */ createReactComponent("kol-kolibri"); const KolLink = /* @__PURE__ */ createReactComponent("kol-link"); const KolLinkButton = /* @__PURE__ */ createReactComponent("kol-link-button"); const KolLinkGroup = /* @__PURE__ */ createReactComponent("kol-link-group"); const KolLogo = /* @__PURE__ */ createReactComponent("kol-logo"); const KolModal = /* @__PURE__ */ createReactComponent("kol-modal"); const KolNav = /* @__PURE__ */ createReactComponent("kol-nav"); const KolPagination = /* @__PURE__ */ createReactComponent("kol-pagination"); const KolPopoverButton = /* @__PURE__ */ createReactComponent("kol-popover-button"); const KolProgress = /* @__PURE__ */ createReactComponent("kol-progress"); const KolQuote = /* @__PURE__ */ createReactComponent("kol-quote"); const KolSelect = /* @__PURE__ */ createReactComponent("kol-select"); const KolSingleSelect = /* @__PURE__ */ createReactComponent("kol-single-select"); const KolSkipNav = /* @__PURE__ */ createReactComponent("kol-skip-nav"); const KolSpin = /* @__PURE__ */ createReactComponent("kol-spin"); const KolSplitButton = /* @__PURE__ */ createReactComponent("kol-split-button"); const KolSymbol = /* @__PURE__ */ createReactComponent("kol-symbol"); const KolTable = /* @__PURE__ */ createReactComponent("kol-table"); const KolTableStateful = /* @__PURE__ */ createReactComponent("kol-table-stateful"); const KolTableStateless = /* @__PURE__ */ createReactComponent("kol-table-stateless"); const KolTabs = /* @__PURE__ */ createReactComponent("kol-tabs"); const KolTextarea = /* @__PURE__ */ createReactComponent("kol-textarea"); const KolToastContainer = /* @__PURE__ */ createReactComponent("kol-toast-container"); const KolToolbar = /* @__PURE__ */ createReactComponent("kol-toolbar"); const KolTree = /* @__PURE__ */ createReactComponent("kol-tree"); const KolTreeItem = /* @__PURE__ */ createReactComponent("kol-tree-item"); const KolTreeItemWc = /* @__PURE__ */ createReactComponent("kol-tree-item-wc"); const KolVersion = /* @__PURE__ */ createReactComponent("kol-version"); function createReactRenderElement(hostElement) { const renderElement = document.createElement("div"); renderElement.setAttribute("role", "presentation"); hostElement.innerHTML = ""; hostElement.appendChild(renderElement); return renderElement; } exports.KolAbbr = KolAbbr; exports.KolAccordion = KolAccordion; exports.KolAlert = KolAlert; exports.KolAvatar = KolAvatar; exports.KolBadge = KolBadge; exports.KolBreadcrumb = KolBreadcrumb; exports.KolButton = KolButton; exports.KolButtonGroup = KolButtonGroup; exports.KolButtonLink = KolButtonLink; exports.KolCard = KolCard; exports.KolCombobox = KolCombobox; exports.KolDetails = KolDetails; exports.KolDrawer = KolDrawer; exports.KolForm = KolForm; exports.KolHeading = KolHeading; exports.KolIcon = KolIcon; exports.KolImage = KolImage; exports.KolIndentedText = KolIndentedText; exports.KolInputCheckbox = KolInputCheckbox; exports.KolInputColor = KolInputColor; exports.KolInputDate = KolInputDate; exports.KolInputEmail = KolInputEmail; exports.KolInputFile = KolInputFile; exports.KolInputNumber = KolInputNumber; exports.KolInputPassword = KolInputPassword; exports.KolInputRadio = KolInputRadio; exports.KolInputRange = KolInputRange; exports.KolInputText = KolInputText; exports.KolKolibri = KolKolibri; exports.KolLink = KolLink; exports.KolLinkButton = KolLinkButton; exports.KolLinkGroup = KolLinkGroup; exports.KolLogo = KolLogo; exports.KolModal = KolModal; exports.KolNav = KolNav; exports.KolPagination = KolPagination; exports.KolPopoverButton = KolPopoverButton; exports.KolProgress = KolProgress; exports.KolQuote = KolQuote; exports.KolSelect = KolSelect; exports.KolSingleSelect = KolSingleSelect; exports.KolSkipNav = KolSkipNav; exports.KolSpin = KolSpin; exports.KolSplitButton = KolSplitButton; exports.KolSymbol = KolSymbol; exports.KolTable = KolTable; exports.KolTableStateful = KolTableStateful; exports.KolTableStateless = KolTableStateless; exports.KolTabs = KolTabs; exports.KolTextarea = KolTextarea; exports.KolToastContainer = KolToastContainer; exports.KolToolbar = KolToolbar; exports.KolTree = KolTree; exports.KolTreeItem = KolTreeItem; exports.KolTreeItemWc = KolTreeItemWc; exports.KolVersion = KolVersion; exports.createReactRenderElement = createReactRenderElement; exports.setTagNameTransformer = setTagNameTransformer;