@tduniec/plugin-template-designer-foundation 0.1.9 → 0.1.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,17 @@
1
+ ## [0.1.11](https://github.com/tduniec/template-designer-plugin/compare/template-designer-foundation-v0.1.10...template-designer-foundation-v0.1.11) (2026-02-15)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * fix doubleclick editor ([#67](https://github.com/tduniec/template-designer-plugin/issues/67)) ([587f573](https://github.com/tduniec/template-designer-plugin/commit/587f573af29e48f4d3f0e36312bdef3af6689cf8))
7
+
8
+ ## [0.1.10](https://github.com/tduniec/template-designer-plugin/compare/template-designer-foundation-v0.1.9...template-designer-foundation-v0.1.10) (2026-01-30)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * **template-designer:** adding template-designer-pro banner ([#66](https://github.com/tduniec/template-designer-plugin/issues/66)) ([19a39af](https://github.com/tduniec/template-designer-plugin/commit/19a39af2a52312c52d044e5520dec2860335a01d))
14
+
1
15
  ## [0.1.9](https://github.com/tduniec/template-designer-plugin/compare/template-designer-foundation-v0.1.8...template-designer-foundation-v0.1.9) (2026-01-25)
2
16
 
3
17
 
@@ -66,14 +66,14 @@ const useFieldEditor = () => {
66
66
  "password"
67
67
  ];
68
68
  const isTextual = !type || editableTypes.includes(type);
69
- if (!isTextual || !target.value) {
69
+ if (!isTextual) {
70
70
  return;
71
71
  }
72
72
  event.stopPropagation();
73
73
  openEditor(target);
74
74
  return;
75
75
  }
76
- if (target instanceof HTMLTextAreaElement && !target.readOnly && !target.disabled && target.value) {
76
+ if (target instanceof HTMLTextAreaElement && !target.readOnly && !target.disabled) {
77
77
  event.stopPropagation();
78
78
  openEditor(target);
79
79
  }
@@ -1 +1 @@
1
- {"version":3,"file":"useFieldEditor.esm.js","sources":["../../../src/components/TemplateDesigner/useFieldEditor.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\n\ntype EditorState = null | {\n target: HTMLInputElement | HTMLTextAreaElement;\n label: string;\n initialValue: string;\n};\n\nconst resolveLabel = (element: HTMLInputElement | HTMLTextAreaElement) =>\n element.getAttribute(\"aria-label\") ??\n element.name ??\n element.placeholder ??\n \"Field editor\";\n\n/**\n * Provides a modal-friendly editing experience for readonly-looking inputs\n * by letting users double-click any text field and edit its value centrally.\n */\nexport const useFieldEditor = () => {\n const [editorState, setEditorState] = useState<EditorState>(null);\n const interactionRootRef = useRef<HTMLDivElement | null>(null);\n\n const closeEditor = useCallback(() => {\n setEditorState(null);\n }, []);\n\n const applyEditorValue = useCallback(\n (value: string) => {\n const current = editorState;\n if (!current) {\n return;\n }\n\n const setNativeValue = (\n element: HTMLInputElement | HTMLTextAreaElement,\n nextValue: string\n ) => {\n const valueSetter = Object.getOwnPropertyDescriptor(\n element,\n \"value\"\n )?.set;\n const prototype = Object.getPrototypeOf(element);\n const prototypeValueSetter = Object.getOwnPropertyDescriptor(\n prototype,\n \"value\"\n )?.set;\n\n if (valueSetter && valueSetter !== prototypeValueSetter) {\n prototypeValueSetter?.call(element, nextValue);\n } else if (valueSetter) {\n valueSetter.call(element, nextValue);\n } else {\n // eslint-disable-next-line no-param-reassign\n element.value = nextValue;\n }\n };\n\n setNativeValue(current.target, value);\n current.target.dispatchEvent(new Event(\"input\", { bubbles: true }));\n closeEditor();\n },\n [closeEditor, editorState]\n );\n\n const openEditor = useCallback(\n (target: HTMLInputElement | HTMLTextAreaElement) => {\n setEditorState({\n target,\n label: resolveLabel(target),\n initialValue: target.value,\n });\n },\n []\n );\n\n useEffect(() => {\n const root = interactionRootRef.current;\n if (!root) {\n return undefined;\n }\n\n const handleDoubleClick = (event: MouseEvent) => {\n const target = event.target;\n if (\n target instanceof HTMLInputElement &&\n !target.readOnly &&\n !target.disabled\n ) {\n const type = target.type?.toLowerCase();\n const editableTypes = [\n \"text\",\n \"search\",\n \"url\",\n \"tel\",\n \"email\",\n \"number\",\n \"password\",\n ];\n const isTextual = !type || editableTypes.includes(type);\n if (!isTextual || !target.value) {\n return;\n }\n event.stopPropagation();\n openEditor(target);\n return;\n }\n if (\n target instanceof HTMLTextAreaElement &&\n !target.readOnly &&\n !target.disabled &&\n target.value\n ) {\n event.stopPropagation();\n openEditor(target);\n }\n };\n\n root.addEventListener(\"dblclick\", handleDoubleClick, true);\n return () => {\n root.removeEventListener(\"dblclick\", handleDoubleClick, true);\n };\n }, [openEditor]);\n\n return {\n editorState,\n interactionRootRef,\n closeEditor,\n applyEditorValue,\n };\n};\n"],"names":[],"mappings":";;AAQA,MAAM,YAAA,GAAe,CAAC,OAAA,KACpB,OAAA,CAAQ,YAAA,CAAa,YAAY,CAAA,IACjC,OAAA,CAAQ,IAAA,IACR,OAAA,CAAQ,WAAA,IACR,cAAA;AAMK,MAAM,iBAAiB,MAAM;AAClC,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAsB,IAAI,CAAA;AAChE,EAAA,MAAM,kBAAA,GAAqB,OAA8B,IAAI,CAAA;AAE7D,EAAA,MAAM,WAAA,GAAc,YAAY,MAAM;AACpC,IAAA,cAAA,CAAe,IAAI,CAAA;AAAA,EACrB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,gBAAA,GAAmB,WAAA;AAAA,IACvB,CAAC,KAAA,KAAkB;AACjB,MAAA,MAAM,OAAA,GAAU,WAAA;AAChB,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,cAAA,GAAiB,CACrB,OAAA,EACA,SAAA,KACG;AACH,QAAA,MAAM,cAAc,MAAA,CAAO,wBAAA;AAAA,UACzB,OAAA;AAAA,UACA;AAAA,SACF,EAAG,GAAA;AACH,QAAA,MAAM,SAAA,GAAY,MAAA,CAAO,cAAA,CAAe,OAAO,CAAA;AAC/C,QAAA,MAAM,uBAAuB,MAAA,CAAO,wBAAA;AAAA,UAClC,SAAA;AAAA,UACA;AAAA,SACF,EAAG,GAAA;AAEH,QAAA,IAAI,WAAA,IAAe,gBAAgB,oBAAA,EAAsB;AACvD,UAAA,oBAAA,EAAsB,IAAA,CAAK,SAAS,SAAS,CAAA;AAAA,QAC/C,WAAW,WAAA,EAAa;AACtB,UAAA,WAAA,CAAY,IAAA,CAAK,SAAS,SAAS,CAAA;AAAA,QACrC,CAAA,MAAO;AAEL,UAAA,OAAA,CAAQ,KAAA,GAAQ,SAAA;AAAA,QAClB;AAAA,MACF,CAAA;AAEA,MAAA,cAAA,CAAe,OAAA,CAAQ,QAAQ,KAAK,CAAA;AACpC,MAAA,OAAA,CAAQ,MAAA,CAAO,cAAc,IAAI,KAAA,CAAM,SAAS,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAClE,MAAA,WAAA,EAAY;AAAA,IACd,CAAA;AAAA,IACA,CAAC,aAAa,WAAW;AAAA,GAC3B;AAEA,EAAA,MAAM,UAAA,GAAa,WAAA;AAAA,IACjB,CAAC,MAAA,KAAmD;AAClD,MAAA,cAAA,CAAe;AAAA,QACb,MAAA;AAAA,QACA,KAAA,EAAO,aAAa,MAAM,CAAA;AAAA,QAC1B,cAAc,MAAA,CAAO;AAAA,OACtB,CAAA;AAAA,IACH,CAAA;AAAA,IACA;AAAC,GACH;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,OAAO,kBAAA,CAAmB,OAAA;AAChC,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,iBAAA,GAAoB,CAAC,KAAA,KAAsB;AAC/C,MAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AACrB,MAAA,IACE,kBAAkB,gBAAA,IAClB,CAAC,OAAO,QAAA,IACR,CAAC,OAAO,QAAA,EACR;AACA,QAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,EAAM,WAAA,EAAY;AACtC,QAAA,MAAM,aAAA,GAAgB;AAAA,UACpB,MAAA;AAAA,UACA,QAAA;AAAA,UACA,KAAA;AAAA,UACA,KAAA;AAAA,UACA,OAAA;AAAA,UACA,QAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,MAAM,SAAA,GAAY,CAAC,IAAA,IAAQ,aAAA,CAAc,SAAS,IAAI,CAAA;AACtD,QAAA,IAAI,CAAC,SAAA,IAAa,CAAC,MAAA,CAAO,KAAA,EAAO;AAC/B,UAAA;AAAA,QACF;AACA,QAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,QAAA,UAAA,CAAW,MAAM,CAAA;AACjB,QAAA;AAAA,MACF;AACA,MAAA,IACE,MAAA,YAAkB,uBAClB,CAAC,MAAA,CAAO,YACR,CAAC,MAAA,CAAO,QAAA,IACR,MAAA,CAAO,KAAA,EACP;AACA,QAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,QAAA,UAAA,CAAW,MAAM,CAAA;AAAA,MACnB;AAAA,IACF,CAAA;AAEA,IAAA,IAAA,CAAK,gBAAA,CAAiB,UAAA,EAAY,iBAAA,EAAmB,IAAI,CAAA;AACzD,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,mBAAA,CAAoB,UAAA,EAAY,iBAAA,EAAmB,IAAI,CAAA;AAAA,IAC9D,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,OAAO;AAAA,IACL,WAAA;AAAA,IACA,kBAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
1
+ {"version":3,"file":"useFieldEditor.esm.js","sources":["../../../src/components/TemplateDesigner/useFieldEditor.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\n\ntype EditorState = null | {\n target: HTMLInputElement | HTMLTextAreaElement;\n label: string;\n initialValue: string;\n};\n\nconst resolveLabel = (element: HTMLInputElement | HTMLTextAreaElement) =>\n element.getAttribute(\"aria-label\") ??\n element.name ??\n element.placeholder ??\n \"Field editor\";\n\n/**\n * Provides a modal-friendly editing experience for readonly-looking inputs\n * by letting users double-click any text field and edit its value centrally.\n */\nexport const useFieldEditor = () => {\n const [editorState, setEditorState] = useState<EditorState>(null);\n const interactionRootRef = useRef<HTMLDivElement | null>(null);\n\n const closeEditor = useCallback(() => {\n setEditorState(null);\n }, []);\n\n const applyEditorValue = useCallback(\n (value: string) => {\n const current = editorState;\n if (!current) {\n return;\n }\n\n const setNativeValue = (\n element: HTMLInputElement | HTMLTextAreaElement,\n nextValue: string\n ) => {\n const valueSetter = Object.getOwnPropertyDescriptor(\n element,\n \"value\"\n )?.set;\n const prototype = Object.getPrototypeOf(element);\n const prototypeValueSetter = Object.getOwnPropertyDescriptor(\n prototype,\n \"value\"\n )?.set;\n\n if (valueSetter && valueSetter !== prototypeValueSetter) {\n prototypeValueSetter?.call(element, nextValue);\n } else if (valueSetter) {\n valueSetter.call(element, nextValue);\n } else {\n // eslint-disable-next-line no-param-reassign\n element.value = nextValue;\n }\n };\n\n setNativeValue(current.target, value);\n current.target.dispatchEvent(new Event(\"input\", { bubbles: true }));\n closeEditor();\n },\n [closeEditor, editorState]\n );\n\n const openEditor = useCallback(\n (target: HTMLInputElement | HTMLTextAreaElement) => {\n setEditorState({\n target,\n label: resolveLabel(target),\n initialValue: target.value,\n });\n },\n []\n );\n\n useEffect(() => {\n const root = interactionRootRef.current;\n if (!root) {\n return undefined;\n }\n\n const handleDoubleClick = (event: MouseEvent) => {\n const target = event.target;\n if (\n target instanceof HTMLInputElement &&\n !target.readOnly &&\n !target.disabled\n ) {\n const type = target.type?.toLowerCase();\n const editableTypes = [\n \"text\",\n \"search\",\n \"url\",\n \"tel\",\n \"email\",\n \"number\",\n \"password\",\n ];\n const isTextual = !type || editableTypes.includes(type);\n if (!isTextual) {\n return;\n }\n event.stopPropagation();\n openEditor(target);\n return;\n }\n if (\n target instanceof HTMLTextAreaElement &&\n !target.readOnly &&\n !target.disabled\n ) {\n event.stopPropagation();\n openEditor(target);\n }\n };\n\n root.addEventListener(\"dblclick\", handleDoubleClick, true);\n return () => {\n root.removeEventListener(\"dblclick\", handleDoubleClick, true);\n };\n }, [openEditor]);\n\n return {\n editorState,\n interactionRootRef,\n closeEditor,\n applyEditorValue,\n };\n};\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tduniec/plugin-template-designer-foundation",
3
- "version": "0.1.9",
3
+ "version": "0.1.11",
4
4
  "license": "Apache-2.0",
5
5
  "main": "./dist/index.esm.js",
6
6
  "types": "./dist/index.d.ts",