diff --git a/package.json b/package.json
index d35f9b88..a4006cb6 100644
--- a/package.json
+++ b/package.json
@@ -71,15 +71,16 @@
"build:demo:watch": "vite build --mode demo --watch",
"build:icons": "node ./tools/generate-sprite",
"lint": "eslint ./src --ext .js || true",
- "test": "node --experimental-test-snapshots --require ./tools/test-setup.cjs --test --no-warnings src/**/*.test.js",
- "test:updateSnapshots": "node --experimental-test-snapshots --test-update-snapshots --require ./tools/test-setup.cjs --test --no-warnings src/**/*.test.js",
- "test:ci": "yarn test --coverage",
+ "test": "node --experimental-test-snapshots --require ./tools/test-setup.cjs --test --no-warnings src/**/*.test.{js,mjs}",
+ "test:updateSnapshots": "node --experimental-test-snapshots --test-update-snapshots --require ./tools/test-setup.cjs --test --no-warnings src/**/*.test.{js,mjs}",
+ "test:ci": "npm test --coverage",
"start": "npm-run-all build:icons dev",
"semantic-release": "semantic-release --ci --debug",
"copy:lang": "node ./tools/copy-directory.mjs ./node_modules/formeo-i18n/dist/lang ./src/demo/assets/lang",
"travis-deploy-once": "travis-deploy-once --pro",
- "prepush": "yarn test",
- "defaults": "webpack-defaults"
+ "prepush": "npm test",
+ "prepare": "lefthook install",
+ "postmerge": "lefthook install"
},
"devDependencies": {
"@biomejs/biome": "^1.9.3",
diff --git a/src/lib/js/common/dom.js b/src/lib/js/common/dom.js
index a255a123..3a2850c8 100644
--- a/src/lib/js/common/dom.js
+++ b/src/lib/js/common/dom.js
@@ -23,6 +23,8 @@ const iconFontTemplates = {
fontello: icon => `${icon}`,
}
+const inputTags = new Set(['input', 'textarea', 'select'])
+
/**
* General purpose markup utilities and generator.
*/
@@ -31,20 +33,12 @@ class DOM {
* Set defaults, store references to key elements
* like stages, rows, columns etc
*/
- constructor() {
- this.options = Object.create(null)
- this.styleSheet = (() => {
- const style = document.createElement('style')
- style.setAttribute('media', 'screen')
- style.setAttribute('type', 'text/css')
- style.appendChild(document.createTextNode(''))
- document.head.appendChild(style)
- return style.sheet
- })()
+ constructor(options = Object.create(null)) {
+ this.options = options
}
set setOptions(options) {
- this.options = merge(Object.assign({}, this.options, options))
+ this.options = merge(this.options, options)
}
/**
@@ -52,14 +46,18 @@ class DOM {
* @param {Object|String} elem
* @return {Object} valid element object
*/
- processTagName(elem) {
+ processTagName(elemArg) {
+ let elem = elemArg
let tagName
if (typeof elem === 'string') {
tagName = elem
elem = { tag: tagName }
+ return elem
}
+
if (elem.attrs) {
const { tag, ...restAttrs } = elem.attrs
+ // this is used for interchangeable tagNames like h1, h2, h3 etc
if (tag) {
if (typeof tag === 'string') {
tagName = tag
@@ -92,12 +90,11 @@ class DOM {
* @return {Object} DOM Object
*/
create = (elemArg, isPreview = false) => {
- let elem = elemArg
- if (!elem) {
+ if (!elemArg) {
return
}
- elem = this.processTagName(elem)
+ const { className, options, ...elem } = this.processTagName(elemArg)
const _this = this
let childType
const { tag } = elem
@@ -147,41 +144,29 @@ class DOM {
processed.push('tag')
// check for root className property
- if (elem.className) {
- const { className } = elem
- elem.attrs = Object.assign({}, elem.attrs, { className })
- delete elem.className
+ if (className) {
+ elem.attrs = { ...elem.attrs, className }
}
- // Append Element Content
- if (elem.options) {
- let { options } = elem
- options = this.processOptions(options, elem, isPreview)
+ if (options) {
+ const processedOptions = this.processOptions(options, elem, isPreview)
if (this.holdsContent(element) && tag !== 'button') {
// mainly used for