@bpmn-io/form-js-playground 0.8.0-alpha.1 → 0.8.0

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/dist/index.cjs CHANGED
@@ -7,9 +7,12 @@ var fileDrop = require('file-drops');
7
7
  var mitt = require('mitt');
8
8
  var hooks = require('preact/hooks');
9
9
  var download = require('downloadjs');
10
- var formJs = require('@bpmn-io/form-js');
10
+ var classNames = require('classnames');
11
+ var formJsViewer = require('@bpmn-io/form-js-viewer');
12
+ var formJsEditor = require('@bpmn-io/form-js-editor');
11
13
  var jsxRuntime = require('preact/jsx-runtime');
12
- var basicSetup = require('@codemirror/basic-setup');
14
+ var codemirror = require('codemirror');
15
+ var view = require('@codemirror/view');
13
16
  var state = require('@codemirror/state');
14
17
  var langJson = require('@codemirror/lang-json');
15
18
 
@@ -18,6 +21,7 @@ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'defau
18
21
  var fileDrop__default = /*#__PURE__*/_interopDefaultLegacy(fileDrop);
19
22
  var mitt__default = /*#__PURE__*/_interopDefaultLegacy(mitt);
20
23
  var download__default = /*#__PURE__*/_interopDefaultLegacy(download);
24
+ var classNames__default = /*#__PURE__*/_interopDefaultLegacy(classNames);
21
25
 
22
26
  function Modal(props) {
23
27
  hooks.useEffect(() => {
@@ -123,53 +127,53 @@ function JSONEditor(options = {}) {
123
127
  function createState(doc, extensions = []) {
124
128
  return state.EditorState.create({
125
129
  doc,
126
- extensions: [basicSetup.basicSetup, language, tabSize, ...extensions]
130
+ extensions: [codemirror.basicSetup, language, tabSize, ...extensions]
127
131
  });
128
132
  }
129
133
 
130
134
  function createView(readonly) {
131
- const updateListener = basicSetup.EditorView.updateListener.of(update => {
135
+ const updateListener = view.EditorView.updateListener.of(update => {
132
136
  if (update.docChanged) {
133
137
  emitter.emit('changed', {
134
138
  value: update.view.state.doc.toString()
135
139
  });
136
140
  }
137
141
  });
138
- const editable = basicSetup.EditorView.editable.of(!readonly);
139
- const view = new basicSetup.EditorView({
142
+ const editable = view.EditorView.editable.of(!readonly);
143
+ const view$1 = new view.EditorView({
140
144
  state: createState('', [updateListener, editable])
141
145
  });
142
146
 
143
- view.setValue = function (value) {
147
+ view$1.setValue = function (value) {
144
148
  this.setState(createState(value, [updateListener, editable]));
145
149
  };
146
150
 
147
- return view;
151
+ return view$1;
148
152
  }
149
153
 
150
- const view = createView(readonly);
154
+ const view$1 = createView(readonly);
151
155
 
152
156
  this.setValue = function (value) {
153
- view.setValue(value);
157
+ view$1.setValue(value);
154
158
  };
155
159
 
156
160
  this.getValue = function () {
157
- return view.state.doc.toString();
161
+ return view$1.state.doc.toString();
158
162
  };
159
163
 
160
164
  this.on = emitter.on;
161
165
  this.off = emitter.off;
162
166
 
163
167
  this.attachTo = function (container) {
164
- container.appendChild(view.dom);
168
+ container.appendChild(view$1.dom);
165
169
  };
166
170
 
167
171
  this.destroy = function () {
168
- if (view.dom.parentNode) {
169
- view.dom.parentNode.removeChild(view.dom);
172
+ if (view$1.dom.parentNode) {
173
+ view$1.dom.parentNode.removeChild(view$1.dom);
170
174
  }
171
175
 
172
- view.destroy();
176
+ view$1.destroy();
173
177
  };
174
178
  }
175
179
 
@@ -206,23 +210,45 @@ Section.HeaderItem = function (props) {
206
210
  };
207
211
 
208
212
  function PlaygroundRoot(props) {
213
+ const {
214
+ actions: actionsConfig = {},
215
+ editor: editorConfig = {},
216
+ emit
217
+ } = props;
218
+ const {
219
+ display: displayActions = true
220
+ } = actionsConfig;
221
+ const {
222
+ inlinePropertiesPanel = true
223
+ } = editorConfig;
209
224
  const paletteContainerRef = hooks.useRef();
210
225
  const editorContainerRef = hooks.useRef();
211
226
  const formContainerRef = hooks.useRef();
212
227
  const dataContainerRef = hooks.useRef();
213
228
  const resultContainerRef = hooks.useRef();
229
+ const propertiesPanelContainerRef = hooks.useRef();
230
+ const paletteRef = hooks.useRef();
214
231
  const formEditorRef = hooks.useRef();
215
232
  const formRef = hooks.useRef();
216
233
  const dataEditorRef = hooks.useRef();
217
234
  const resultViewRef = hooks.useRef();
235
+ const propertiesPanelRef = hooks.useRef();
218
236
  const [showEmbed, setShowEmbed] = hooks.useState(false);
219
237
  const [initialData] = hooks.useState(props.data || {});
220
238
  const [initialSchema, setInitialSchema] = hooks.useState(props.schema);
221
239
  const [data, setData] = hooks.useState(props.data || {});
222
240
  const [schema, setSchema] = hooks.useState(props.schema);
223
- const [resultData, setResultData] = hooks.useState(props.data || {});
241
+ const [resultData, setResultData] = hooks.useState(props.data || {}); // pipe to playground API
242
+
224
243
  hooks.useEffect(() => {
225
244
  props.onInit({
245
+ attachDataContainer: node => dataEditorRef.current.attachTo(node),
246
+ attachEditorContainer: node => formEditorRef.current.attachTo(node),
247
+ attachFormContainer: node => formRef.current.attachTo(node),
248
+ attachPaletteContainer: node => paletteRef.current.attachTo(node),
249
+ attachPropertiesPanelContainer: node => propertiesPanelRef.current.attachTo(node),
250
+ attachResultContainer: node => resultViewRef.current.attachTo(node),
251
+ get: (name, strict) => formEditorRef.current.get(name, strict),
226
252
  setSchema: setInitialSchema
227
253
  });
228
254
  });
@@ -237,18 +263,27 @@ function PlaygroundRoot(props) {
237
263
  readonly: true,
238
264
  value: toJSON(resultData)
239
265
  });
240
- const form = formRef.current = new formJs.Form();
241
- const formEditor = formEditorRef.current = new formJs.FormEditor({
266
+ const form = formRef.current = new formJsViewer.Form();
267
+ const formEditor = formEditorRef.current = new formJsEditor.FormEditor({
242
268
  renderer: {
243
269
  compact: true
244
270
  },
245
271
  palette: {
246
272
  parent: paletteContainerRef.current
273
+ },
274
+ propertiesPanel: {
275
+ parent: !inlinePropertiesPanel && propertiesPanelContainerRef.current
247
276
  }
248
277
  });
278
+ paletteRef.current = formEditor.get('palette');
279
+ propertiesPanelRef.current = formEditor.get('propertiesPanel');
249
280
  formEditor.on('changed', () => {
250
281
  setSchema(formEditor.getSchema());
251
282
  });
283
+ formEditor.on('formEditor.rendered', () => {
284
+ // notifiy interested parties after render
285
+ emit('formPlayground.rendered');
286
+ });
252
287
  form.on('changed', event => {
253
288
  setResultData(event.data);
254
289
  });
@@ -301,7 +336,9 @@ function PlaygroundRoot(props) {
301
336
  setShowEmbed(true);
302
337
  }, []);
303
338
  return jsxRuntime.jsxs("div", {
304
- class: "fjs-container fjs-pgl-root",
339
+ class: classNames__default['default']('fjs-container', 'fjs-pgl-root', {
340
+ 'fjs-pgl-inline-editor-panel': inlinePropertiesPanel
341
+ }),
305
342
  children: [jsxRuntime.jsx("div", {
306
343
  class: "fjs-pgl-modals",
307
344
  children: showEmbed ? jsxRuntime.jsx(EmbedModal, {
@@ -316,14 +353,14 @@ function PlaygroundRoot(props) {
316
353
  class: "fjs-pgl-main",
317
354
  children: [jsxRuntime.jsxs(Section, {
318
355
  name: "Form Definition",
319
- children: [jsxRuntime.jsx(Section.HeaderItem, {
356
+ children: [displayActions && jsxRuntime.jsx(Section.HeaderItem, {
320
357
  children: jsxRuntime.jsx("button", {
321
358
  class: "fjs-pgl-button",
322
359
  title: "Download form definition",
323
360
  onClick: handleDownload,
324
361
  children: "Download"
325
362
  })
326
- }), jsxRuntime.jsx(Section.HeaderItem, {
363
+ }), displayActions && jsxRuntime.jsx(Section.HeaderItem, {
327
364
  children: jsxRuntime.jsx("button", {
328
365
  class: "fjs-pgl-button",
329
366
  onClick: showEmbedModal,
@@ -352,6 +389,9 @@ function PlaygroundRoot(props) {
352
389
  class: "fjs-pgl-text-container"
353
390
  })
354
391
  })]
392
+ }), jsxRuntime.jsx("div", {
393
+ class: "fjs-pgl-properties-container",
394
+ ref: propertiesPanelContainerRef
355
395
  })]
356
396
  });
357
397
  } // helpers ///////////////
@@ -364,7 +404,8 @@ function Playground(options) {
364
404
  const {
365
405
  container: parent,
366
406
  schema,
367
- data
407
+ data,
408
+ ...rest
368
409
  } = options;
369
410
  const emitter = mitt__default['default']();
370
411
  let state = {
@@ -374,7 +415,11 @@ function Playground(options) {
374
415
  let ref;
375
416
  const container = document.createElement('div');
376
417
  container.classList.add('fjs-pgl-parent');
377
- parent.appendChild(container);
418
+
419
+ if (parent) {
420
+ parent.appendChild(container);
421
+ }
422
+
378
423
  const handleDrop = fileDrop__default['default']('Drop a form file', function (files) {
379
424
  const file = files[0];
380
425
 
@@ -385,12 +430,25 @@ function Playground(options) {
385
430
  }
386
431
  }
387
432
  });
433
+
434
+ const withRef = function (fn) {
435
+ return function (...args) {
436
+ if (!ref) {
437
+ throw new Error('Playground is not initialized.');
438
+ }
439
+
440
+ fn(...args);
441
+ };
442
+ };
443
+
388
444
  container.addEventListener('dragover', handleDrop);
389
445
  preact.render(jsxRuntime.jsx(PlaygroundRoot, {
390
446
  schema: schema,
391
447
  data: data,
392
448
  onStateChanged: _state => state = _state,
393
- onInit: _ref => ref = _ref
449
+ onInit: _ref => ref = _ref,
450
+ emit: emitter.emit,
451
+ ...rest
394
452
  }), container);
395
453
  this.on = emitter.on;
396
454
  this.off = emitter.off;
@@ -410,9 +468,32 @@ function Playground(options) {
410
468
  return ref.setSchema(schema);
411
469
  };
412
470
 
471
+ this.get = function (name, strict) {
472
+ return ref.get(name, strict);
473
+ };
474
+
413
475
  this.destroy = function () {
414
476
  this.emit('destroy');
415
477
  };
478
+
479
+ this.attachEditorContainer = withRef(function (node) {
480
+ return ref.attachEditorContainer(node);
481
+ });
482
+ this.attachPreviewContainer = withRef(function (node) {
483
+ return ref.attachFormContainer(node);
484
+ });
485
+ this.attachDataContainer = withRef(function (node) {
486
+ return ref.attachDataContainer(node);
487
+ });
488
+ this.attachResultContainer = withRef(function (node) {
489
+ return ref.attachResultContainer(node);
490
+ });
491
+ this.attachPaletteContainer = withRef(function (node) {
492
+ return ref.attachPaletteContainer(node);
493
+ });
494
+ this.attachPropertiesPanelContainer = withRef(function (node) {
495
+ return ref.attachPropertiesPanelContainer(node);
496
+ });
416
497
  }
417
498
 
418
499
  exports.Playground = Playground;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/components/Modal.js","../src/components/EmbedModal.js","../src/components/JSONEditor.js","../src/components/Section.js","../src/components/PlaygroundRoot.js","../src/Playground.js"],"sourcesContent":["import { useEffect } from 'preact/hooks';\n\nexport function Modal(props) {\n\n useEffect(() => {\n function handleKey(event) {\n\n if (event.key === 'Escape') {\n event.stopPropagation();\n\n props.onClose();\n }\n }\n\n document.addEventListener('keydown', handleKey);\n\n return () => {\n document.removeEventListener('keydown', handleKey);\n };\n });\n\n return (\n <div class=\"fjs-pgl-modal\">\n <div class=\"fjs-pgl-modal-backdrop\" onClick={ props.onClose }></div>\n <div class=\"fjs-pgl-modal-content\">\n <h1 class=\"fjs-pgl-modal-header\">{ props.name }</h1>\n <div class=\"fjs-pgl-modal-body\">\n { props.children }\n </div>\n <div class=\"fjs-pgl-modal-footer\">\n <button class=\"fjs-pgl-button fjs-pgl-button-default\" onClick={ props.onClose }>Close</button>\n </div>\n </div>\n </div>\n );\n}\n","import { useEffect, useRef } from 'preact/hooks';\n\nimport { Modal } from './Modal';\n\n\nexport function EmbedModal(props) {\n\n const schema = serializeValue(props.schema);\n const data = serializeValue(props.data || {});\n\n const fieldRef = useRef();\n\n const snippet = `<!-- styles needed for rendering -->\n<link rel=\"stylesheet\" href=\"https://unpkg.com/@bpmn-io/form-js@0.2.4/dist/assets/form-js.css\">\n\n<!-- container to render the form into -->\n<div class=\"fjs-pgl-form-container\"></div>\n\n<!-- scripts needed for embedding -->\n<script src=\"https://unpkg.com/@bpmn-io/form-js@0.2.4/dist/form-viewer.umd.js\"></script>\n\n<!-- actual script to instantiate the form and load form schema + data -->\n<script>\n const data = JSON.parse(${data});\n const schema = JSON.parse(${schema});\n\n const form = new FormViewer.Form({\n container: document.querySelector(\".fjs-pgl-form-container\")\n });\n\n form.on(\"submit\", (event) => {\n console.log(event.data, event.errors);\n });\n\n form.importSchema(schema, data).catch(err => {\n console.error(\"Failed to render form\", err);\n });\n</script>\n `.trim();\n\n useEffect(() => {\n fieldRef.current.select();\n });\n\n return (\n <Modal name=\"Embed form\" onClose={ props.onClose }>\n <p>Use the following HTML snippet to embed your form with <a href=\"https://github.com/bpmn-io/form-js\">form-js</a>:</p>\n\n <textarea spellCheck=\"false\" ref={ fieldRef }>{snippet}</textarea>\n </Modal>\n );\n}\n\n\n// helpers ///////////\n\nfunction serializeValue(obj) {\n return JSON.stringify(JSON.stringify(obj)).replace(/</g, '&lt;').replace(/>/g, '&gt;');\n}","import mitt from 'mitt';\n\nimport { basicSetup, EditorView } from '@codemirror/basic-setup';\nimport { EditorState, Compartment } from '@codemirror/state';\nimport { json } from '@codemirror/lang-json';\n\n\nexport function JSONEditor(options = {}) {\n\n const emitter = mitt();\n\n const {\n readonly = false\n } = options;\n\n let language = new Compartment().of(json());\n let tabSize = new Compartment().of(EditorState.tabSize.of(2));\n\n function createState(doc, extensions = []) {\n return EditorState.create({\n doc,\n extensions: [\n basicSetup,\n language,\n tabSize,\n ...extensions\n ]\n });\n }\n\n function createView(readonly) {\n\n const updateListener = EditorView.updateListener.of(update => {\n if (update.docChanged) {\n emitter.emit('changed', {\n value: update.view.state.doc.toString()\n });\n }\n });\n\n const editable = EditorView.editable.of(!readonly);\n\n const view = new EditorView({\n state: createState('', [ updateListener, editable ])\n });\n\n view.setValue = function(value) {\n this.setState(createState(value, [ updateListener, editable ]));\n };\n\n return view;\n }\n\n const view = createView(readonly);\n\n this.setValue = function(value) {\n view.setValue(value);\n };\n\n this.getValue = function() {\n return view.state.doc.toString();\n };\n\n this.on = emitter.on;\n this.off = emitter.off;\n\n this.attachTo = function(container) {\n container.appendChild(view.dom);\n };\n\n this.destroy = function() {\n if (view.dom.parentNode) {\n view.dom.parentNode.removeChild(view.dom);\n }\n\n view.destroy();\n };\n}\n","export function Section(props) {\n\n const elements =\n Array.isArray(props.children)\n ? props.children :\n [ props.children ];\n\n const {\n headerItems,\n children\n } = elements.reduce((_, child) => {\n const bucket =\n child.type === Section.HeaderItem\n ? _.headerItems\n : _.children;\n\n bucket.push(child);\n\n return _;\n }, { headerItems: [], children: [] });\n\n return (\n <div class=\"fjs-pgl-section\">\n <h1 class=\"header\">{ props.name } { headerItems.length ? <span class=\"header-items\">{ headerItems }</span> : null }</h1>\n <div class=\"body\">\n { children }\n </div>\n </div>\n );\n}\n\nSection.HeaderItem = function(props) {\n return props.children;\n};","import { useRef, useEffect, useState, useCallback } from 'preact/hooks';\n\nimport download from 'downloadjs';\n\nimport {\n Form,\n FormEditor\n} from '@bpmn-io/form-js';\n\nimport { EmbedModal } from './EmbedModal';\nimport { JSONEditor } from './JSONEditor';\nimport { Section } from './Section';\n\n\nimport './FileDrop.css';\nimport './PlaygroundRoot.css';\n\n\nexport function PlaygroundRoot(props) {\n\n const paletteContainerRef = useRef();\n const editorContainerRef = useRef();\n const formContainerRef = useRef();\n const dataContainerRef = useRef();\n const resultContainerRef = useRef();\n\n const formEditorRef = useRef();\n const formRef = useRef();\n const dataEditorRef = useRef();\n const resultViewRef = useRef();\n\n const [ showEmbed, setShowEmbed ] = useState(false);\n\n const [ initialData ] = useState(props.data || {});\n const [ initialSchema, setInitialSchema ] = useState(props.schema);\n\n const [ data, setData ] = useState(props.data || {});\n const [ schema, setSchema ] = useState(props.schema);\n\n const [ resultData, setResultData ] = useState(props.data || {});\n\n useEffect(() => {\n props.onInit({\n setSchema: setInitialSchema\n });\n });\n\n useEffect(() => {\n setInitialSchema(props.schema || {});\n }, [ props.schema ]);\n\n useEffect(() => {\n const dataEditor = dataEditorRef.current = new JSONEditor({\n value: toJSON(data)\n });\n\n const resultView = resultViewRef.current = new JSONEditor({\n readonly: true,\n value: toJSON(resultData)\n });\n\n const form = formRef.current = new Form();\n const formEditor = formEditorRef.current = new FormEditor({\n renderer: {\n compact: true\n },\n palette: {\n parent: paletteContainerRef.current\n }\n });\n\n formEditor.on('changed', () => {\n setSchema(formEditor.getSchema());\n });\n\n form.on('changed', event => {\n setResultData(event.data);\n });\n\n dataEditor.on('changed', event => {\n try {\n setData(JSON.parse(event.value));\n } catch (err) {\n\n // TODO(nikku): indicate JSON parse error\n }\n });\n\n const formContainer = formContainerRef.current;\n const editorContainer = editorContainerRef.current;\n const dataContainer = dataContainerRef.current;\n const resultContainer = resultContainerRef.current;\n\n dataEditor.attachTo(dataContainer);\n resultView.attachTo(resultContainer);\n form.attachTo(formContainer);\n formEditor.attachTo(editorContainer);\n\n return () => {\n dataEditor.destroy();\n resultView.destroy();\n form.destroy();\n formEditor.destroy();\n };\n }, []);\n\n useEffect(() => {\n dataEditorRef.current.setValue(toJSON(initialData));\n }, [ initialData ]);\n\n useEffect(() => {\n formEditorRef.current.importSchema(initialSchema);\n }, [ initialSchema ]);\n\n useEffect(() => {\n formRef.current.importSchema(schema, data);\n }, [ schema, data ]);\n\n useEffect(() => {\n resultViewRef.current.setValue(toJSON(resultData));\n }, [ resultData ]);\n\n useEffect(() => {\n props.onStateChanged({\n schema,\n data\n });\n }, [ schema, data ]);\n\n const handleDownload = useCallback(() => {\n\n download(JSON.stringify(schema, null, ' '), 'form.json', 'text/json');\n }, [ schema ]);\n\n const hideEmbedModal = useCallback(() => {\n setShowEmbed(false);\n }, []);\n\n const showEmbedModal = useCallback(() => {\n setShowEmbed(true);\n }, []);\n\n return (\n <div class=\"fjs-container fjs-pgl-root\">\n <div class=\"fjs-pgl-modals\">\n { showEmbed ? <EmbedModal schema={ schema } data={ data } onClose={ hideEmbedModal } /> : null }\n </div>\n <div class=\"fjs-pgl-palette-container\" ref={ paletteContainerRef } />\n <div class=\"fjs-pgl-main\">\n\n <Section name=\"Form Definition\">\n <Section.HeaderItem>\n <button\n class=\"fjs-pgl-button\"\n title=\"Download form definition\"\n onClick={ handleDownload }\n >Download</button>\n </Section.HeaderItem>\n <Section.HeaderItem>\n <button\n class=\"fjs-pgl-button\"\n onClick={ showEmbedModal }\n >Embed</button>\n </Section.HeaderItem>\n <div ref={ editorContainerRef } class=\"fjs-pgl-form-container\"></div>\n </Section>\n <Section name=\"Form Preview\">\n <div ref={ formContainerRef } class=\"fjs-pgl-form-container\"></div>\n </Section>\n <Section name=\"Form Data (Input)\">\n <div ref={ dataContainerRef } class=\"fjs-pgl-text-container\"></div>\n </Section>\n <Section name=\"Form Data (Submit)\">\n <div ref={ resultContainerRef } class=\"fjs-pgl-text-container\"></div>\n </Section>\n </div>\n </div>\n );\n}\n\n\n// helpers ///////////////\n\nfunction toJSON(obj) {\n return JSON.stringify(obj, null, ' ');\n}","import { render } from 'preact';\n\nimport fileDrop from 'file-drops';\n\nimport mitt from 'mitt';\n\nimport { PlaygroundRoot } from './components/PlaygroundRoot';\n\n\nexport default function Playground(options) {\n\n const {\n container: parent,\n schema,\n data\n } = options;\n\n const emitter = mitt();\n\n let state = { data, schema };\n let ref;\n\n const container = document.createElement('div');\n\n container.classList.add('fjs-pgl-parent');\n\n parent.appendChild(container);\n\n const handleDrop = fileDrop('Drop a form file', function(files) {\n const file = files[0];\n\n if (file) {\n try {\n ref.setSchema(JSON.parse(file.contents));\n } catch (err) {\n\n // TODO(nikku): indicate JSON parse error\n }\n }\n });\n\n container.addEventListener('dragover', handleDrop);\n\n render(\n <PlaygroundRoot\n schema={ schema }\n data={ data }\n onStateChanged={ (_state) => state = _state }\n onInit={ _ref => ref = _ref }\n />,\n container\n );\n\n this.on = emitter.on;\n this.off = emitter.off;\n\n this.emit = emitter.emit;\n\n this.on('destroy', function() {\n render(null, container);\n });\n\n this.on('destroy', function() {\n parent.removeChild(container);\n });\n\n this.getState = function() {\n return state;\n };\n\n this.setSchema = function(schema) {\n return ref.setSchema(schema);\n };\n\n this.destroy = function() {\n this.emit('destroy');\n };\n}"],"names":["Modal","props","useEffect","handleKey","event","key","stopPropagation","onClose","document","addEventListener","removeEventListener","_jsxs","_jsx","name","children","EmbedModal","schema","serializeValue","data","fieldRef","useRef","snippet","trim","current","select","obj","JSON","stringify","replace","JSONEditor","options","emitter","mitt","readonly","language","Compartment","of","json","tabSize","EditorState","createState","doc","extensions","create","basicSetup","createView","updateListener","EditorView","update","docChanged","emit","value","view","state","toString","editable","setValue","setState","getValue","on","off","attachTo","container","appendChild","dom","destroy","parentNode","removeChild","Section","elements","Array","isArray","headerItems","reduce","_","child","bucket","type","HeaderItem","push","length","PlaygroundRoot","paletteContainerRef","editorContainerRef","formContainerRef","dataContainerRef","resultContainerRef","formEditorRef","formRef","dataEditorRef","resultViewRef","showEmbed","setShowEmbed","useState","initialData","initialSchema","setInitialSchema","setData","setSchema","resultData","setResultData","onInit","dataEditor","toJSON","resultView","form","Form","formEditor","FormEditor","renderer","compact","palette","parent","getSchema","parse","err","formContainer","editorContainer","dataContainer","resultContainer","importSchema","onStateChanged","handleDownload","useCallback","download","hideEmbedModal","showEmbedModal","Playground","ref","createElement","classList","add","handleDrop","fileDrop","files","file","contents","render","_state","_ref","getState"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/components/Modal.js","../src/components/EmbedModal.js","../src/components/JSONEditor.js","../src/components/Section.js","../src/components/PlaygroundRoot.js","../src/Playground.js"],"sourcesContent":["import { useEffect } from 'preact/hooks';\r\n\r\nexport function Modal(props) {\r\n\r\n useEffect(() => {\r\n function handleKey(event) {\r\n\r\n if (event.key === 'Escape') {\r\n event.stopPropagation();\r\n\r\n props.onClose();\r\n }\r\n }\r\n\r\n document.addEventListener('keydown', handleKey);\r\n\r\n return () => {\r\n document.removeEventListener('keydown', handleKey);\r\n };\r\n });\r\n\r\n return (\r\n <div class=\"fjs-pgl-modal\">\r\n <div class=\"fjs-pgl-modal-backdrop\" onClick={ props.onClose }></div>\r\n <div class=\"fjs-pgl-modal-content\">\r\n <h1 class=\"fjs-pgl-modal-header\">{ props.name }</h1>\r\n <div class=\"fjs-pgl-modal-body\">\r\n { props.children }\r\n </div>\r\n <div class=\"fjs-pgl-modal-footer\">\r\n <button class=\"fjs-pgl-button fjs-pgl-button-default\" onClick={ props.onClose }>Close</button>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { useEffect, useRef } from 'preact/hooks';\r\n\r\nimport { Modal } from './Modal';\r\n\r\n\r\nexport function EmbedModal(props) {\r\n\r\n const schema = serializeValue(props.schema);\r\n const data = serializeValue(props.data || {});\r\n\r\n const fieldRef = useRef();\r\n\r\n const snippet = `<!-- styles needed for rendering -->\r\n<link rel=\"stylesheet\" href=\"https://unpkg.com/@bpmn-io/form-js@0.2.4/dist/assets/form-js.css\">\r\n\r\n<!-- container to render the form into -->\r\n<div class=\"fjs-pgl-form-container\"></div>\r\n\r\n<!-- scripts needed for embedding -->\r\n<script src=\"https://unpkg.com/@bpmn-io/form-js@0.2.4/dist/form-viewer.umd.js\"></script>\r\n\r\n<!-- actual script to instantiate the form and load form schema + data -->\r\n<script>\r\n const data = JSON.parse(${data});\r\n const schema = JSON.parse(${schema});\r\n\r\n const form = new FormViewer.Form({\r\n container: document.querySelector(\".fjs-pgl-form-container\")\r\n });\r\n\r\n form.on(\"submit\", (event) => {\r\n console.log(event.data, event.errors);\r\n });\r\n\r\n form.importSchema(schema, data).catch(err => {\r\n console.error(\"Failed to render form\", err);\r\n });\r\n</script>\r\n `.trim();\r\n\r\n useEffect(() => {\r\n fieldRef.current.select();\r\n });\r\n\r\n return (\r\n <Modal name=\"Embed form\" onClose={ props.onClose }>\r\n <p>Use the following HTML snippet to embed your form with <a href=\"https://github.com/bpmn-io/form-js\">form-js</a>:</p>\r\n\r\n <textarea spellCheck=\"false\" ref={ fieldRef }>{snippet}</textarea>\r\n </Modal>\r\n );\r\n}\r\n\r\n\r\n// helpers ///////////\r\n\r\nfunction serializeValue(obj) {\r\n return JSON.stringify(JSON.stringify(obj)).replace(/</g, '&lt;').replace(/>/g, '&gt;');\r\n}","import mitt from 'mitt';\r\n\r\nimport { basicSetup } from 'codemirror';\r\nimport { EditorView } from '@codemirror/view';\r\nimport { EditorState, Compartment } from '@codemirror/state';\r\nimport { json } from '@codemirror/lang-json';\r\n\r\n\r\nexport function JSONEditor(options = {}) {\r\n\r\n const emitter = mitt();\r\n\r\n const {\r\n readonly = false\r\n } = options;\r\n\r\n let language = new Compartment().of(json());\r\n let tabSize = new Compartment().of(EditorState.tabSize.of(2));\r\n\r\n function createState(doc, extensions = []) {\r\n return EditorState.create({\r\n doc,\r\n extensions: [\r\n basicSetup,\r\n language,\r\n tabSize,\r\n ...extensions\r\n ]\r\n });\r\n }\r\n\r\n function createView(readonly) {\r\n\r\n const updateListener = EditorView.updateListener.of(update => {\r\n if (update.docChanged) {\r\n emitter.emit('changed', {\r\n value: update.view.state.doc.toString()\r\n });\r\n }\r\n });\r\n\r\n const editable = EditorView.editable.of(!readonly);\r\n\r\n const view = new EditorView({\r\n state: createState('', [ updateListener, editable ])\r\n });\r\n\r\n view.setValue = function(value) {\r\n this.setState(createState(value, [ updateListener, editable ]));\r\n };\r\n\r\n return view;\r\n }\r\n\r\n const view = createView(readonly);\r\n\r\n this.setValue = function(value) {\r\n view.setValue(value);\r\n };\r\n\r\n this.getValue = function() {\r\n return view.state.doc.toString();\r\n };\r\n\r\n this.on = emitter.on;\r\n this.off = emitter.off;\r\n\r\n this.attachTo = function(container) {\r\n container.appendChild(view.dom);\r\n };\r\n\r\n this.destroy = function() {\r\n if (view.dom.parentNode) {\r\n view.dom.parentNode.removeChild(view.dom);\r\n }\r\n\r\n view.destroy();\r\n };\r\n}\r\n","export function Section(props) {\r\n\r\n const elements =\r\n Array.isArray(props.children)\r\n ? props.children :\r\n [ props.children ];\r\n\r\n const {\r\n headerItems,\r\n children\r\n } = elements.reduce((_, child) => {\r\n const bucket =\r\n child.type === Section.HeaderItem\r\n ? _.headerItems\r\n : _.children;\r\n\r\n bucket.push(child);\r\n\r\n return _;\r\n }, { headerItems: [], children: [] });\r\n\r\n return (\r\n <div class=\"fjs-pgl-section\">\r\n <h1 class=\"header\">{ props.name } { headerItems.length ? <span class=\"header-items\">{ headerItems }</span> : null }</h1>\r\n <div class=\"body\">\r\n { children }\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nSection.HeaderItem = function(props) {\r\n return props.children;\r\n};","import { useRef, useEffect, useState, useCallback } from 'preact/hooks';\r\n\r\nimport download from 'downloadjs';\r\n\r\nimport classNames from 'classnames';\r\n\r\nimport {\r\n Form\r\n} from '@bpmn-io/form-js-viewer';\r\n\r\nimport {\r\n FormEditor\r\n} from '@bpmn-io/form-js-editor';\r\n\r\nimport { EmbedModal } from './EmbedModal';\r\nimport { JSONEditor } from './JSONEditor';\r\nimport { Section } from './Section';\r\n\r\n\r\nimport './FileDrop.css';\r\nimport './PlaygroundRoot.css';\r\n\r\n\r\nexport function PlaygroundRoot(props) {\r\n\r\n const {\r\n actions: actionsConfig = {},\r\n editor: editorConfig = {},\r\n emit\r\n } = props;\r\n\r\n const {\r\n display: displayActions = true\r\n } = actionsConfig;\r\n\r\n const {\r\n inlinePropertiesPanel = true\r\n } = editorConfig;\r\n\r\n const paletteContainerRef = useRef();\r\n const editorContainerRef = useRef();\r\n const formContainerRef = useRef();\r\n const dataContainerRef = useRef();\r\n const resultContainerRef = useRef();\r\n const propertiesPanelContainerRef = useRef();\r\n\r\n const paletteRef = useRef();\r\n const formEditorRef = useRef();\r\n const formRef = useRef();\r\n const dataEditorRef = useRef();\r\n const resultViewRef = useRef();\r\n const propertiesPanelRef = useRef();\r\n\r\n const [ showEmbed, setShowEmbed ] = useState(false);\r\n\r\n const [ initialData ] = useState(props.data || {});\r\n const [ initialSchema, setInitialSchema ] = useState(props.schema);\r\n\r\n const [ data, setData ] = useState(props.data || {});\r\n const [ schema, setSchema ] = useState(props.schema);\r\n\r\n const [ resultData, setResultData ] = useState(props.data || {});\r\n\r\n // pipe to playground API\r\n useEffect(() => {\r\n props.onInit({\r\n attachDataContainer: (node) => dataEditorRef.current.attachTo(node),\r\n attachEditorContainer: (node) => formEditorRef.current.attachTo(node),\r\n attachFormContainer: (node) => formRef.current.attachTo(node),\r\n attachPaletteContainer: (node) => paletteRef.current.attachTo(node),\r\n attachPropertiesPanelContainer: (node) => propertiesPanelRef.current.attachTo(node),\r\n attachResultContainer: (node) => resultViewRef.current.attachTo(node),\r\n get: (name, strict) => formEditorRef.current.get(name, strict),\r\n setSchema: setInitialSchema\r\n });\r\n });\r\n\r\n useEffect(() => {\r\n setInitialSchema(props.schema || {});\r\n }, [ props.schema ]);\r\n\r\n useEffect(() => {\r\n const dataEditor = dataEditorRef.current = new JSONEditor({\r\n value: toJSON(data)\r\n });\r\n\r\n const resultView = resultViewRef.current = new JSONEditor({\r\n readonly: true,\r\n value: toJSON(resultData)\r\n });\r\n\r\n const form = formRef.current = new Form();\r\n const formEditor = formEditorRef.current = new FormEditor({\r\n renderer: {\r\n compact: true\r\n },\r\n palette: {\r\n parent: paletteContainerRef.current\r\n },\r\n propertiesPanel: {\r\n parent: !inlinePropertiesPanel && propertiesPanelContainerRef.current\r\n }\r\n });\r\n\r\n paletteRef.current = formEditor.get('palette');\r\n propertiesPanelRef.current = formEditor.get('propertiesPanel');\r\n\r\n formEditor.on('changed', () => {\r\n setSchema(formEditor.getSchema());\r\n });\r\n\r\n formEditor.on('formEditor.rendered', () => {\r\n\r\n // notifiy interested parties after render\r\n emit('formPlayground.rendered');\r\n });\r\n\r\n form.on('changed', event => {\r\n setResultData(event.data);\r\n });\r\n\r\n dataEditor.on('changed', event => {\r\n try {\r\n setData(JSON.parse(event.value));\r\n } catch (err) {\r\n\r\n // TODO(nikku): indicate JSON parse error\r\n }\r\n });\r\n\r\n const formContainer = formContainerRef.current;\r\n const editorContainer = editorContainerRef.current;\r\n const dataContainer = dataContainerRef.current;\r\n const resultContainer = resultContainerRef.current;\r\n\r\n dataEditor.attachTo(dataContainer);\r\n resultView.attachTo(resultContainer);\r\n form.attachTo(formContainer);\r\n formEditor.attachTo(editorContainer);\r\n\r\n return () => {\r\n dataEditor.destroy();\r\n resultView.destroy();\r\n form.destroy();\r\n formEditor.destroy();\r\n };\r\n }, []);\r\n\r\n useEffect(() => {\r\n dataEditorRef.current.setValue(toJSON(initialData));\r\n }, [ initialData ]);\r\n\r\n useEffect(() => {\r\n formEditorRef.current.importSchema(initialSchema);\r\n }, [ initialSchema ]);\r\n\r\n useEffect(() => {\r\n formRef.current.importSchema(schema, data);\r\n }, [ schema, data ]);\r\n\r\n useEffect(() => {\r\n resultViewRef.current.setValue(toJSON(resultData));\r\n }, [ resultData ]);\r\n\r\n useEffect(() => {\r\n props.onStateChanged({\r\n schema,\r\n data\r\n });\r\n }, [ schema, data ]);\r\n\r\n const handleDownload = useCallback(() => {\r\n\r\n download(JSON.stringify(schema, null, ' '), 'form.json', 'text/json');\r\n }, [ schema ]);\r\n\r\n const hideEmbedModal = useCallback(() => {\r\n setShowEmbed(false);\r\n }, []);\r\n\r\n const showEmbedModal = useCallback(() => {\r\n setShowEmbed(true);\r\n }, []);\r\n\r\n return (\r\n <div class={ classNames(\r\n 'fjs-container',\r\n 'fjs-pgl-root',\r\n { 'fjs-pgl-inline-editor-panel': inlinePropertiesPanel }) }>\r\n <div class=\"fjs-pgl-modals\">\r\n { showEmbed ? <EmbedModal schema={ schema } data={ data } onClose={ hideEmbedModal } /> : null }\r\n </div>\r\n <div class=\"fjs-pgl-palette-container\" ref={ paletteContainerRef } />\r\n <div class=\"fjs-pgl-main\">\r\n\r\n <Section name=\"Form Definition\">\r\n\r\n {\r\n displayActions && <Section.HeaderItem>\r\n <button\r\n class=\"fjs-pgl-button\"\r\n title=\"Download form definition\"\r\n onClick={ handleDownload }\r\n >Download</button>\r\n </Section.HeaderItem>\r\n }\r\n\r\n {\r\n displayActions && <Section.HeaderItem>\r\n <button\r\n class=\"fjs-pgl-button\"\r\n onClick={ showEmbedModal }\r\n >Embed</button>\r\n </Section.HeaderItem>\r\n }\r\n\r\n <div ref={ editorContainerRef } class=\"fjs-pgl-form-container\"></div>\r\n </Section>\r\n <Section name=\"Form Preview\">\r\n <div ref={ formContainerRef } class=\"fjs-pgl-form-container\"></div>\r\n </Section>\r\n <Section name=\"Form Data (Input)\">\r\n <div ref={ dataContainerRef } class=\"fjs-pgl-text-container\"></div>\r\n </Section>\r\n <Section name=\"Form Data (Submit)\">\r\n <div ref={ resultContainerRef } class=\"fjs-pgl-text-container\"></div>\r\n </Section>\r\n </div>\r\n <div class=\"fjs-pgl-properties-container\" ref={ propertiesPanelContainerRef } />\r\n </div>\r\n );\r\n}\r\n\r\n\r\n// helpers ///////////////\r\n\r\nfunction toJSON(obj) {\r\n return JSON.stringify(obj, null, ' ');\r\n}","import { render } from 'preact';\r\n\r\nimport fileDrop from 'file-drops';\r\n\r\nimport mitt from 'mitt';\r\n\r\nimport { PlaygroundRoot } from './components/PlaygroundRoot';\r\n\r\n/**\r\n * @typedef { {\r\n * container?: Element,\r\n * schema: any,\r\n * data: any,\r\n * editor?: { inlinePropertiesPanel: Boolean }\r\n * actions?: { display: Boolean }\r\n * } } FormPlaygroundOptions\r\n */\r\n\r\n/**\r\n * @param {FormPlaygroundOptions} options\r\n */\r\nexport default function Playground(options) {\r\n\r\n const {\r\n container: parent,\r\n schema,\r\n data,\r\n ...rest\r\n } = options;\r\n\r\n const emitter = mitt();\r\n\r\n let state = { data, schema };\r\n let ref;\r\n\r\n const container = document.createElement('div');\r\n\r\n container.classList.add('fjs-pgl-parent');\r\n\r\n if (parent) {\r\n parent.appendChild(container);\r\n }\r\n\r\n const handleDrop = fileDrop('Drop a form file', function(files) {\r\n const file = files[0];\r\n\r\n if (file) {\r\n try {\r\n ref.setSchema(JSON.parse(file.contents));\r\n } catch (err) {\r\n\r\n // TODO(nikku): indicate JSON parse error\r\n }\r\n }\r\n });\r\n\r\n const withRef = function(fn) {\r\n return function(...args) {\r\n if (!ref) {\r\n throw new Error('Playground is not initialized.');\r\n }\r\n\r\n fn(...args);\r\n };\r\n };\r\n\r\n container.addEventListener('dragover', handleDrop);\r\n\r\n render(\r\n <PlaygroundRoot\r\n schema={ schema }\r\n data={ data }\r\n onStateChanged={ (_state) => state = _state }\r\n onInit={ _ref => ref = _ref }\r\n emit={ emitter.emit }\r\n { ...rest }\r\n />,\r\n container\r\n );\r\n\r\n this.on = emitter.on;\r\n this.off = emitter.off;\r\n\r\n this.emit = emitter.emit;\r\n\r\n this.on('destroy', function() {\r\n render(null, container);\r\n });\r\n\r\n this.on('destroy', function() {\r\n parent.removeChild(container);\r\n });\r\n\r\n this.getState = function() {\r\n return state;\r\n };\r\n\r\n this.setSchema = function(schema) {\r\n return ref.setSchema(schema);\r\n };\r\n\r\n this.get = function(name, strict) {\r\n return ref.get(name, strict);\r\n };\r\n\r\n this.destroy = function() {\r\n this.emit('destroy');\r\n };\r\n\r\n this.attachEditorContainer = withRef(function(node) {\r\n return ref.attachEditorContainer(node);\r\n });\r\n\r\n this.attachPreviewContainer = withRef(function(node) {\r\n return ref.attachFormContainer(node);\r\n });\r\n\r\n this.attachDataContainer = withRef(function(node) {\r\n return ref.attachDataContainer(node);\r\n });\r\n\r\n this.attachResultContainer = withRef(function(node) {\r\n return ref.attachResultContainer(node);\r\n });\r\n\r\n this.attachPaletteContainer = withRef(function(node) {\r\n return ref.attachPaletteContainer(node);\r\n });\r\n\r\n this.attachPropertiesPanelContainer = withRef(function(node) {\r\n return ref.attachPropertiesPanelContainer(node);\r\n });\r\n}"],"names":["Modal","props","useEffect","handleKey","event","key","stopPropagation","onClose","document","addEventListener","removeEventListener","_jsxs","_jsx","name","children","EmbedModal","schema","serializeValue","data","fieldRef","useRef","snippet","trim","current","select","obj","JSON","stringify","replace","JSONEditor","options","emitter","mitt","readonly","language","Compartment","of","json","tabSize","EditorState","createState","doc","extensions","create","basicSetup","createView","updateListener","EditorView","update","docChanged","emit","value","view","state","toString","editable","setValue","setState","getValue","on","off","attachTo","container","appendChild","dom","destroy","parentNode","removeChild","Section","elements","Array","isArray","headerItems","reduce","_","child","bucket","type","HeaderItem","push","length","PlaygroundRoot","actions","actionsConfig","editor","editorConfig","display","displayActions","inlinePropertiesPanel","paletteContainerRef","editorContainerRef","formContainerRef","dataContainerRef","resultContainerRef","propertiesPanelContainerRef","paletteRef","formEditorRef","formRef","dataEditorRef","resultViewRef","propertiesPanelRef","showEmbed","setShowEmbed","useState","initialData","initialSchema","setInitialSchema","setData","setSchema","resultData","setResultData","onInit","attachDataContainer","node","attachEditorContainer","attachFormContainer","attachPaletteContainer","attachPropertiesPanelContainer","attachResultContainer","get","strict","dataEditor","toJSON","resultView","form","Form","formEditor","FormEditor","renderer","compact","palette","parent","propertiesPanel","getSchema","parse","err","formContainer","editorContainer","dataContainer","resultContainer","importSchema","onStateChanged","handleDownload","useCallback","download","hideEmbedModal","showEmbedModal","classNames","Playground","rest","ref","createElement","classList","add","handleDrop","fileDrop","files","file","contents","withRef","fn","args","Error","render","_state","_ref","getState","attachPreviewContainer"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAEO,SAASA,KAAT,CAAeC,KAAf,EAAsB;EAE3BC,eAAS,CAAC,MAAM;IACd,SAASC,SAAT,CAAmBC,KAAnB,EAA0B;MAExB,IAAIA,KAAK,CAACC,GAAN,KAAc,QAAlB,EAA4B;QAC1BD,KAAK,CAACE,eAAN;QAEAL,KAAK,CAACM,OAAN;;;;IAIJC,QAAQ,CAACC,gBAAT,CAA0B,SAA1B,EAAqCN,SAArC;IAEA,OAAO,MAAM;MACXK,QAAQ,CAACE,mBAAT,CAA6B,SAA7B,EAAwCP,SAAxC;KADF;GAZO,CAAT;EAiBA,OACEQ;IAAK,KAAK,EAAC,eAAX;IAAA,WACEC;MAAK,KAAK,EAAC,wBAAX;MAAoC,OAAO,EAAGX,KAAK,CAACM;MADtD,EAEEI;MAAK,KAAK,EAAC,uBAAX;MAAA,WACEC;QAAI,KAAK,EAAC,sBAAV;QAAA,UAAmCX,KAAK,CAACY;QAD3C,EAEED;QAAK,KAAK,EAAC,oBAAX;QAAA,UACIX,KAAK,CAACa;QAHZ,EAKEF;QAAK,KAAK,EAAC,sBAAX;QAAA,UACEA;UAAQ,KAAK,EAAC,uCAAd;UAAsD,OAAO,EAAGX,KAAK,CAACM,OAAtE;UAAA;;QANJ;MAFF;IADF;AAcD;;AC9BM,SAASQ,UAAT,CAAoBd,KAApB,EAA2B;EAEhC,MAAMe,MAAM,GAAGC,cAAc,CAAChB,KAAK,CAACe,MAAP,CAA7B;EACA,MAAME,IAAI,GAAGD,cAAc,CAAChB,KAAK,CAACiB,IAAN,IAAc,EAAf,CAA3B;EAEA,MAAMC,QAAQ,GAAGC,YAAM,EAAvB;EAEA,MAAMC,OAAO,GAAI;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4BH,IAAK;AACjC,8BAA8BF,MAAO;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GA1BkB,CA0BdM,IA1Bc,EAAhB;EA4BApB,eAAS,CAAC,MAAM;IACdiB,QAAQ,CAACI,OAAT,CAAiBC,MAAjB;GADO,CAAT;EAIA,OACEb,gBAAC,KAAD;IAAO,IAAI,EAAC,YAAZ;IAAyB,OAAO,EAAGV,KAAK,CAACM,OAAzC;IAAA,WACEI;MAAA,sEAA0DC;QAAG,IAAI,EAAC,oCAAR;QAAA;QAA1D;MADF,EAGEA;MAAU,UAAU,EAAC,OAArB;MAA6B,GAAG,EAAGO,QAAnC;MAAA,UAA+CE;MAHjD;IADF;AAOD;;AAKD,SAASJ,cAAT,CAAwBQ,GAAxB,EAA6B;EAC3B,OAAOC,IAAI,CAACC,SAAL,CAAeD,IAAI,CAACC,SAAL,CAAeF,GAAf,CAAf,EAAoCG,OAApC,CAA4C,IAA5C,EAAkD,MAAlD,EAA0DA,OAA1D,CAAkE,IAAlE,EAAwE,MAAxE,CAAP;AACD;;AClDM,SAASC,UAAT,CAAoBC,OAAO,GAAG,EAA9B,EAAkC;EAEvC,MAAMC,OAAO,GAAGC,wBAAI,EAApB;EAEA,MAAM;IACJC,QAAQ,GAAG;MACTH,OAFJ;EAIA,IAAII,QAAQ,GAAG,IAAIC,iBAAJ,GAAkBC,EAAlB,CAAqBC,aAAI,EAAzB,CAAf;EACA,IAAIC,OAAO,GAAG,IAAIH,iBAAJ,GAAkBC,EAAlB,CAAqBG,iBAAW,CAACD,OAAZ,CAAoBF,EAApB,CAAuB,CAAvB,CAArB,CAAd;;EAEA,SAASI,WAAT,CAAqBC,GAArB,EAA0BC,UAAU,GAAG,EAAvC,EAA2C;IACzC,OAAOH,iBAAW,CAACI,MAAZ,CAAmB;MACxBF,GADwB;MAExBC,UAAU,EAAE,CACVE,qBADU,EAEVV,QAFU,EAGVI,OAHU,EAIV,GAAGI,UAJO;KAFP,CAAP;;;EAWF,SAASG,UAAT,CAAoBZ,QAApB,EAA8B;IAE5B,MAAMa,cAAc,GAAGC,eAAU,CAACD,cAAX,CAA0BV,EAA1B,CAA6BY,MAAM,IAAI;MAC5D,IAAIA,MAAM,CAACC,UAAX,EAAuB;QACrBlB,OAAO,CAACmB,IAAR,CAAa,SAAb,EAAwB;UACtBC,KAAK,EAAEH,MAAM,CAACI,IAAP,CAAYC,KAAZ,CAAkBZ,GAAlB,CAAsBa,QAAtB;SADT;;KAFmB,CAAvB;IAQA,MAAMC,QAAQ,GAAGR,eAAU,CAACQ,QAAX,CAAoBnB,EAApB,CAAuB,CAACH,QAAxB,CAAjB;IAEA,MAAMmB,MAAI,GAAG,IAAIL,eAAJ,CAAe;MAC1BM,KAAK,EAAEb,WAAW,CAAC,EAAD,EAAK,CAAEM,cAAF,EAAkBS,QAAlB,CAAL;KADP,CAAb;;IAIAH,MAAI,CAACI,QAAL,GAAgB,UAASL,KAAT,EAAgB;MAC9B,KAAKM,QAAL,CAAcjB,WAAW,CAACW,KAAD,EAAQ,CAAEL,cAAF,EAAkBS,QAAlB,CAAR,CAAzB;KADF;;IAIA,OAAOH,MAAP;;;EAGF,MAAMA,MAAI,GAAGP,UAAU,CAACZ,QAAD,CAAvB;;EAEA,KAAKuB,QAAL,GAAgB,UAASL,KAAT,EAAgB;IAC9BC,MAAI,CAACI,QAAL,CAAcL,KAAd;GADF;;EAIA,KAAKO,QAAL,GAAgB,YAAW;IACzB,OAAON,MAAI,CAACC,KAAL,CAAWZ,GAAX,CAAea,QAAf,EAAP;GADF;;EAIA,KAAKK,EAAL,GAAU5B,OAAO,CAAC4B,EAAlB;EACA,KAAKC,GAAL,GAAW7B,OAAO,CAAC6B,GAAnB;;EAEA,KAAKC,QAAL,GAAgB,UAASC,SAAT,EAAoB;IAClCA,SAAS,CAACC,WAAV,CAAsBX,MAAI,CAACY,GAA3B;GADF;;EAIA,KAAKC,OAAL,GAAe,YAAW;IACxB,IAAIb,MAAI,CAACY,GAAL,CAASE,UAAb,EAAyB;MACvBd,MAAI,CAACY,GAAL,CAASE,UAAT,CAAoBC,WAApB,CAAgCf,MAAI,CAACY,GAArC;;;IAGFZ,MAAI,CAACa,OAAL;GALF;AAOD;;AC9EM,SAASG,OAAT,CAAiBnE,KAAjB,EAAwB;EAE7B,MAAMoE,QAAQ,GACZC,KAAK,CAACC,OAAN,CAActE,KAAK,CAACa,QAApB,IACIb,KAAK,CAACa,QADV,GAEE,CAAEb,KAAK,CAACa,QAAR,CAHJ;EAKA,MAAM;IACJ0D,WADI;IAEJ1D;MACEuD,QAAQ,CAACI,MAAT,CAAgB,CAACC,CAAD,EAAIC,KAAJ,KAAc;IAChC,MAAMC,MAAM,GACVD,KAAK,CAACE,IAAN,KAAeT,OAAO,CAACU,UAAvB,GACIJ,CAAC,CAACF,WADN,GAEIE,CAAC,CAAC5D,QAHR;IAKA8D,MAAM,CAACG,IAAP,CAAYJ,KAAZ;IAEA,OAAOD,CAAP;GARE,EASD;IAAEF,WAAW,EAAE,EAAf;IAAmB1D,QAAQ,EAAE;GAT5B,CAHJ;EAcA,OACEH;IAAK,KAAK,EAAC,iBAAX;IAAA,WACEA;MAAI,KAAK,EAAC,QAAV;MAAA,WAAqBV,KAAK,CAACY,IAA3B,OAAoC2D,WAAW,CAACQ,MAAZ,GAAqBpE;QAAM,KAAK,EAAC,cAAZ;QAAA,UAA6B4D;QAAlD,GAAyE,IAA7G;MADF,EAEE5D;MAAK,KAAK,EAAC,MAAX;MAAA,UACIE;MAHN;IADF;AAQD;;AAEDsD,OAAO,CAACU,UAAR,GAAqB,UAAS7E,KAAT,EAAgB;EACnC,OAAOA,KAAK,CAACa,QAAb;AACD,CAFD;;ACRO,SAASmE,cAAT,CAAwBhF,KAAxB,EAA+B;EAEpC,MAAM;IACJiF,OAAO,EAAEC,aAAa,GAAG,EADrB;IAEJC,MAAM,EAAEC,YAAY,GAAG,EAFnB;IAGJnC;MACEjD,KAJJ;EAMA,MAAM;IACJqF,OAAO,EAAEC,cAAc,GAAG;MACxBJ,aAFJ;EAIA,MAAM;IACJK,qBAAqB,GAAG;MACtBH,YAFJ;EAIA,MAAMI,mBAAmB,GAAGrE,YAAM,EAAlC;EACA,MAAMsE,kBAAkB,GAAGtE,YAAM,EAAjC;EACA,MAAMuE,gBAAgB,GAAGvE,YAAM,EAA/B;EACA,MAAMwE,gBAAgB,GAAGxE,YAAM,EAA/B;EACA,MAAMyE,kBAAkB,GAAGzE,YAAM,EAAjC;EACA,MAAM0E,2BAA2B,GAAG1E,YAAM,EAA1C;EAEA,MAAM2E,UAAU,GAAG3E,YAAM,EAAzB;EACA,MAAM4E,aAAa,GAAG5E,YAAM,EAA5B;EACA,MAAM6E,OAAO,GAAG7E,YAAM,EAAtB;EACA,MAAM8E,aAAa,GAAG9E,YAAM,EAA5B;EACA,MAAM+E,aAAa,GAAG/E,YAAM,EAA5B;EACA,MAAMgF,kBAAkB,GAAGhF,YAAM,EAAjC;EAEA,MAAM,CAAEiF,SAAF,EAAaC,YAAb,IAA8BC,cAAQ,CAAC,KAAD,CAA5C;EAEA,MAAM,CAAEC,WAAF,IAAkBD,cAAQ,CAACtG,KAAK,CAACiB,IAAN,IAAc,EAAf,CAAhC;EACA,MAAM,CAAEuF,aAAF,EAAiBC,gBAAjB,IAAsCH,cAAQ,CAACtG,KAAK,CAACe,MAAP,CAApD;EAEA,MAAM,CAAEE,IAAF,EAAQyF,OAAR,IAAoBJ,cAAQ,CAACtG,KAAK,CAACiB,IAAN,IAAc,EAAf,CAAlC;EACA,MAAM,CAAEF,MAAF,EAAU4F,SAAV,IAAwBL,cAAQ,CAACtG,KAAK,CAACe,MAAP,CAAtC;EAEA,MAAM,CAAE6F,UAAF,EAAcC,aAAd,IAAgCP,cAAQ,CAACtG,KAAK,CAACiB,IAAN,IAAc,EAAf,CAA9C,CAtCoC;;EAyCpChB,eAAS,CAAC,MAAM;IACdD,KAAK,CAAC8G,MAAN,CAAa;MACXC,mBAAmB,EAAGC,IAAD,IAAUf,aAAa,CAAC3E,OAAd,CAAsBsC,QAAtB,CAA+BoD,IAA/B,CADpB;MAEXC,qBAAqB,EAAGD,IAAD,IAAUjB,aAAa,CAACzE,OAAd,CAAsBsC,QAAtB,CAA+BoD,IAA/B,CAFtB;MAGXE,mBAAmB,EAAGF,IAAD,IAAUhB,OAAO,CAAC1E,OAAR,CAAgBsC,QAAhB,CAAyBoD,IAAzB,CAHpB;MAIXG,sBAAsB,EAAGH,IAAD,IAAUlB,UAAU,CAACxE,OAAX,CAAmBsC,QAAnB,CAA4BoD,IAA5B,CAJvB;MAKXI,8BAA8B,EAAGJ,IAAD,IAAUb,kBAAkB,CAAC7E,OAAnB,CAA2BsC,QAA3B,CAAoCoD,IAApC,CAL/B;MAMXK,qBAAqB,EAAGL,IAAD,IAAUd,aAAa,CAAC5E,OAAd,CAAsBsC,QAAtB,CAA+BoD,IAA/B,CANtB;MAOXM,GAAG,EAAE,CAAC1G,IAAD,EAAO2G,MAAP,KAAkBxB,aAAa,CAACzE,OAAd,CAAsBgG,GAAtB,CAA0B1G,IAA1B,EAAgC2G,MAAhC,CAPZ;MAQXZ,SAAS,EAAEF;KARb;GADO,CAAT;EAaAxG,eAAS,CAAC,MAAM;IACdwG,gBAAgB,CAACzG,KAAK,CAACe,MAAN,IAAgB,EAAjB,CAAhB;GADO,EAEN,CAAEf,KAAK,CAACe,MAAR,CAFM,CAAT;EAIAd,eAAS,CAAC,MAAM;IACd,MAAMuH,UAAU,GAAGvB,aAAa,CAAC3E,OAAd,GAAwB,IAAIM,UAAJ,CAAe;MACxDsB,KAAK,EAAEuE,MAAM,CAACxG,IAAD;KAD4B,CAA3C;IAIA,MAAMyG,UAAU,GAAGxB,aAAa,CAAC5E,OAAd,GAAwB,IAAIM,UAAJ,CAAe;MACxDI,QAAQ,EAAE,IAD8C;MAExDkB,KAAK,EAAEuE,MAAM,CAACb,UAAD;KAF4B,CAA3C;IAKA,MAAMe,IAAI,GAAG3B,OAAO,CAAC1E,OAAR,GAAkB,IAAIsG,iBAAJ,EAA/B;IACA,MAAMC,UAAU,GAAG9B,aAAa,CAACzE,OAAd,GAAwB,IAAIwG,uBAAJ,CAAe;MACxDC,QAAQ,EAAE;QACRC,OAAO,EAAE;OAF6C;MAIxDC,OAAO,EAAE;QACPC,MAAM,EAAE1C,mBAAmB,CAAClE;OAL0B;MAOxD6G,eAAe,EAAE;QACfD,MAAM,EAAE,CAAC3C,qBAAD,IAA0BM,2BAA2B,CAACvE;;KARvB,CAA3C;IAYAwE,UAAU,CAACxE,OAAX,GAAqBuG,UAAU,CAACP,GAAX,CAAe,SAAf,CAArB;IACAnB,kBAAkB,CAAC7E,OAAnB,GAA6BuG,UAAU,CAACP,GAAX,CAAe,iBAAf,CAA7B;IAEAO,UAAU,CAACnE,EAAX,CAAc,SAAd,EAAyB,MAAM;MAC7BiD,SAAS,CAACkB,UAAU,CAACO,SAAX,EAAD,CAAT;KADF;IAIAP,UAAU,CAACnE,EAAX,CAAc,qBAAd,EAAqC,MAAM;;MAGzCT,IAAI,CAAC,yBAAD,CAAJ;KAHF;IAMA0E,IAAI,CAACjE,EAAL,CAAQ,SAAR,EAAmBvD,KAAK,IAAI;MAC1B0G,aAAa,CAAC1G,KAAK,CAACc,IAAP,CAAb;KADF;IAIAuG,UAAU,CAAC9D,EAAX,CAAc,SAAd,EAAyBvD,KAAK,IAAI;MAChC,IAAI;QACFuG,OAAO,CAACjF,IAAI,CAAC4G,KAAL,CAAWlI,KAAK,CAAC+C,KAAjB,CAAD,CAAP;OADF,CAEE,OAAOoF,GAAP,EAAY;;KAHhB;IASA,MAAMC,aAAa,GAAG7C,gBAAgB,CAACpE,OAAvC;IACA,MAAMkH,eAAe,GAAG/C,kBAAkB,CAACnE,OAA3C;IACA,MAAMmH,aAAa,GAAG9C,gBAAgB,CAACrE,OAAvC;IACA,MAAMoH,eAAe,GAAG9C,kBAAkB,CAACtE,OAA3C;IAEAkG,UAAU,CAAC5D,QAAX,CAAoB6E,aAApB;IACAf,UAAU,CAAC9D,QAAX,CAAoB8E,eAApB;IACAf,IAAI,CAAC/D,QAAL,CAAc2E,aAAd;IACAV,UAAU,CAACjE,QAAX,CAAoB4E,eAApB;IAEA,OAAO,MAAM;MACXhB,UAAU,CAACxD,OAAX;MACA0D,UAAU,CAAC1D,OAAX;MACA2D,IAAI,CAAC3D,OAAL;MACA6D,UAAU,CAAC7D,OAAX;KAJF;GA3DO,EAiEN,EAjEM,CAAT;EAmEA/D,eAAS,CAAC,MAAM;IACdgG,aAAa,CAAC3E,OAAd,CAAsBiC,QAAtB,CAA+BkE,MAAM,CAAClB,WAAD,CAArC;GADO,EAEN,CAAEA,WAAF,CAFM,CAAT;EAIAtG,eAAS,CAAC,MAAM;IACd8F,aAAa,CAACzE,OAAd,CAAsBqH,YAAtB,CAAmCnC,aAAnC;GADO,EAEN,CAAEA,aAAF,CAFM,CAAT;EAIAvG,eAAS,CAAC,MAAM;IACd+F,OAAO,CAAC1E,OAAR,CAAgBqH,YAAhB,CAA6B5H,MAA7B,EAAqCE,IAArC;GADO,EAEN,CAAEF,MAAF,EAAUE,IAAV,CAFM,CAAT;EAIAhB,eAAS,CAAC,MAAM;IACdiG,aAAa,CAAC5E,OAAd,CAAsBiC,QAAtB,CAA+BkE,MAAM,CAACb,UAAD,CAArC;GADO,EAEN,CAAEA,UAAF,CAFM,CAAT;EAIA3G,eAAS,CAAC,MAAM;IACdD,KAAK,CAAC4I,cAAN,CAAqB;MACnB7H,MADmB;MAEnBE;KAFF;GADO,EAKN,CAAEF,MAAF,EAAUE,IAAV,CALM,CAAT;EAOA,MAAM4H,cAAc,GAAGC,iBAAW,CAAC,MAAM;IAEvCC,4BAAQ,CAACtH,IAAI,CAACC,SAAL,CAAeX,MAAf,EAAuB,IAAvB,EAA6B,IAA7B,CAAD,EAAqC,WAArC,EAAkD,WAAlD,CAAR;GAFgC,EAG/B,CAAEA,MAAF,CAH+B,CAAlC;EAKA,MAAMiI,cAAc,GAAGF,iBAAW,CAAC,MAAM;IACvCzC,YAAY,CAAC,KAAD,CAAZ;GADgC,EAE/B,EAF+B,CAAlC;EAIA,MAAM4C,cAAc,GAAGH,iBAAW,CAAC,MAAM;IACvCzC,YAAY,CAAC,IAAD,CAAZ;GADgC,EAE/B,EAF+B,CAAlC;EAIA,OACE3F;IAAK,KAAK,EAAGwI,8BAAU,CACrB,eADqB,EAErB,cAFqB,EAGrB;MAAE,+BAA+B3D;KAHZ,CAAvB;IAAA,WAIE5E;MAAK,KAAK,EAAC,gBAAX;MAAA,UACIyF,SAAS,GAAGzF,eAAC,UAAD;QAAY,MAAM,EAAGI,MAArB;QAA8B,IAAI,EAAGE,IAArC;QAA4C,OAAO,EAAG+H;QAAzD,GAA+E;MAL9F,EAOErI;MAAK,KAAK,EAAC,2BAAX;MAAuC,GAAG,EAAG6E;MAP/C,EAQE9E;MAAK,KAAK,EAAC,cAAX;MAAA,WAEEA,gBAAC,OAAD;QAAS,IAAI,EAAC,iBAAd;QAAA,WAGI4E,cAAc,IAAI3E,eAAC,OAAD,CAAS,UAAT;UAAA,UAChBA;YACE,KAAK,EAAC,gBADR;YAEE,KAAK,EAAC,0BAFR;YAGE,OAAO,EAAGkI,cAHZ;YAAA;;UAJN,EAaIvD,cAAc,IAAI3E,eAAC,OAAD,CAAS,UAAT;UAAA,UAChBA;YACE,KAAK,EAAC,gBADR;YAEE,OAAO,EAAGsI,cAFZ;YAAA;;UAdN,EAqBEtI;UAAK,GAAG,EAAG8E,kBAAX;UAAgC,KAAK,EAAC;UArBxC;QAFF,EAyBE9E,eAAC,OAAD;QAAS,IAAI,EAAC,cAAd;QAAA,UACEA;UAAK,GAAG,EAAG+E,gBAAX;UAA8B,KAAK,EAAC;;QA1BxC,EA4BE/E,eAAC,OAAD;QAAS,IAAI,EAAC,mBAAd;QAAA,UACEA;UAAK,GAAG,EAAGgF,gBAAX;UAA8B,KAAK,EAAC;;QA7BxC,EA+BEhF,eAAC,OAAD;QAAS,IAAI,EAAC,oBAAd;QAAA,UACEA;UAAK,GAAG,EAAGiF,kBAAX;UAAgC,KAAK,EAAC;;QAhC1C;MARF,EA2CEjF;MAAK,KAAK,EAAC,8BAAX;MAA0C,GAAG,EAAGkF;MA3ClD;IADF;AA+CD;;AAKD,SAAS4B,MAAT,CAAgBjG,GAAhB,EAAqB;EACnB,OAAOC,IAAI,CAACC,SAAL,CAAeF,GAAf,EAAoB,IAApB,EAA0B,IAA1B,CAAP;AACD;;ACzNc,SAAS2H,UAAT,CAAoBtH,OAApB,EAA6B;EAE1C,MAAM;IACJgC,SAAS,EAAEqE,MADP;IAEJnH,MAFI;IAGJE,IAHI;IAIJ,GAAGmI;MACDvH,OALJ;EAOA,MAAMC,OAAO,GAAGC,wBAAI,EAApB;EAEA,IAAIqB,KAAK,GAAG;IAAEnC,IAAF;IAAQF;GAApB;EACA,IAAIsI,GAAJ;EAEA,MAAMxF,SAAS,GAAGtD,QAAQ,CAAC+I,aAAT,CAAuB,KAAvB,CAAlB;EAEAzF,SAAS,CAAC0F,SAAV,CAAoBC,GAApB,CAAwB,gBAAxB;;EAEA,IAAItB,MAAJ,EAAY;IACVA,MAAM,CAACpE,WAAP,CAAmBD,SAAnB;;;EAGF,MAAM4F,UAAU,GAAGC,4BAAQ,CAAC,kBAAD,EAAqB,UAASC,KAAT,EAAgB;IAC9D,MAAMC,IAAI,GAAGD,KAAK,CAAC,CAAD,CAAlB;;IAEA,IAAIC,IAAJ,EAAU;MACR,IAAI;QACFP,GAAG,CAAC1C,SAAJ,CAAclF,IAAI,CAAC4G,KAAL,CAAWuB,IAAI,CAACC,QAAhB,CAAd;OADF,CAEE,OAAOvB,GAAP,EAAY;;;GANS,CAA3B;;EAaA,MAAMwB,OAAO,GAAG,UAASC,EAAT,EAAa;IAC3B,OAAO,UAAS,GAAGC,IAAZ,EAAkB;MACvB,IAAI,CAACX,GAAL,EAAU;QACR,MAAM,IAAIY,KAAJ,CAAU,gCAAV,CAAN;;;MAGFF,EAAE,CAAC,GAAGC,IAAJ,CAAF;KALF;GADF;;EAUAnG,SAAS,CAACrD,gBAAV,CAA2B,UAA3B,EAAuCiJ,UAAvC;EAEAS,aAAM,CACJvJ,eAAC,cAAD;IACE,MAAM,EAAGI,MADX;IAEE,IAAI,EAAGE,IAFT;IAGE,cAAc,EAAIkJ,MAAD,IAAY/G,KAAK,GAAG+G,MAHvC;IAIE,MAAM,EAAGC,IAAI,IAAIf,GAAG,GAAGe,IAJzB;IAKE,IAAI,EAAGtI,OAAO,CAACmB,IALjB;IAAA,GAMOmG;IAPH,EASJvF,SATI,CAAN;EAYA,KAAKH,EAAL,GAAU5B,OAAO,CAAC4B,EAAlB;EACA,KAAKC,GAAL,GAAW7B,OAAO,CAAC6B,GAAnB;EAEA,KAAKV,IAAL,GAAYnB,OAAO,CAACmB,IAApB;EAEA,KAAKS,EAAL,CAAQ,SAAR,EAAmB,YAAW;IAC5BwG,aAAM,CAAC,IAAD,EAAOrG,SAAP,CAAN;GADF;EAIA,KAAKH,EAAL,CAAQ,SAAR,EAAmB,YAAW;IAC5BwE,MAAM,CAAChE,WAAP,CAAmBL,SAAnB;GADF;;EAIA,KAAKwG,QAAL,GAAgB,YAAW;IACzB,OAAOjH,KAAP;GADF;;EAIA,KAAKuD,SAAL,GAAiB,UAAS5F,MAAT,EAAiB;IAChC,OAAOsI,GAAG,CAAC1C,SAAJ,CAAc5F,MAAd,CAAP;GADF;;EAIA,KAAKuG,GAAL,GAAW,UAAS1G,IAAT,EAAe2G,MAAf,EAAuB;IAChC,OAAO8B,GAAG,CAAC/B,GAAJ,CAAQ1G,IAAR,EAAc2G,MAAd,CAAP;GADF;;EAIA,KAAKvD,OAAL,GAAe,YAAW;IACxB,KAAKf,IAAL,CAAU,SAAV;GADF;;EAIA,KAAKgE,qBAAL,GAA6B6C,OAAO,CAAC,UAAS9C,IAAT,EAAe;IAClD,OAAOqC,GAAG,CAACpC,qBAAJ,CAA0BD,IAA1B,CAAP;GADkC,CAApC;EAIA,KAAKsD,sBAAL,GAA8BR,OAAO,CAAC,UAAS9C,IAAT,EAAe;IACnD,OAAOqC,GAAG,CAACnC,mBAAJ,CAAwBF,IAAxB,CAAP;GADmC,CAArC;EAIA,KAAKD,mBAAL,GAA2B+C,OAAO,CAAC,UAAS9C,IAAT,EAAe;IAChD,OAAOqC,GAAG,CAACtC,mBAAJ,CAAwBC,IAAxB,CAAP;GADgC,CAAlC;EAIA,KAAKK,qBAAL,GAA6ByC,OAAO,CAAC,UAAS9C,IAAT,EAAe;IAClD,OAAOqC,GAAG,CAAChC,qBAAJ,CAA0BL,IAA1B,CAAP;GADkC,CAApC;EAIA,KAAKG,sBAAL,GAA8B2C,OAAO,CAAC,UAAS9C,IAAT,EAAe;IACnD,OAAOqC,GAAG,CAAClC,sBAAJ,CAA2BH,IAA3B,CAAP;GADmC,CAArC;EAIA,KAAKI,8BAAL,GAAsC0C,OAAO,CAAC,UAAS9C,IAAT,EAAe;IAC3D,OAAOqC,GAAG,CAACjC,8BAAJ,CAAmCJ,IAAnC,CAAP;GAD2C,CAA7C;AAGD;;;;"}
package/dist/index.es.js CHANGED
@@ -3,9 +3,12 @@ import fileDrop from 'file-drops';
3
3
  import mitt from 'mitt';
4
4
  import { useEffect, useRef, useState, useCallback } from 'preact/hooks';
5
5
  import download from 'downloadjs';
6
- import { Form, FormEditor } from '@bpmn-io/form-js';
6
+ import classNames from 'classnames';
7
+ import { Form } from '@bpmn-io/form-js-viewer';
8
+ import { FormEditor } from '@bpmn-io/form-js-editor';
7
9
  import { jsxs, jsx } from 'preact/jsx-runtime';
8
- import { EditorView, basicSetup } from '@codemirror/basic-setup';
10
+ import { basicSetup } from 'codemirror';
11
+ import { EditorView } from '@codemirror/view';
9
12
  import { Compartment, EditorState } from '@codemirror/state';
10
13
  import { json } from '@codemirror/lang-json';
11
14
 
@@ -196,23 +199,45 @@ Section.HeaderItem = function (props) {
196
199
  };
197
200
 
198
201
  function PlaygroundRoot(props) {
202
+ const {
203
+ actions: actionsConfig = {},
204
+ editor: editorConfig = {},
205
+ emit
206
+ } = props;
207
+ const {
208
+ display: displayActions = true
209
+ } = actionsConfig;
210
+ const {
211
+ inlinePropertiesPanel = true
212
+ } = editorConfig;
199
213
  const paletteContainerRef = useRef();
200
214
  const editorContainerRef = useRef();
201
215
  const formContainerRef = useRef();
202
216
  const dataContainerRef = useRef();
203
217
  const resultContainerRef = useRef();
218
+ const propertiesPanelContainerRef = useRef();
219
+ const paletteRef = useRef();
204
220
  const formEditorRef = useRef();
205
221
  const formRef = useRef();
206
222
  const dataEditorRef = useRef();
207
223
  const resultViewRef = useRef();
224
+ const propertiesPanelRef = useRef();
208
225
  const [showEmbed, setShowEmbed] = useState(false);
209
226
  const [initialData] = useState(props.data || {});
210
227
  const [initialSchema, setInitialSchema] = useState(props.schema);
211
228
  const [data, setData] = useState(props.data || {});
212
229
  const [schema, setSchema] = useState(props.schema);
213
- const [resultData, setResultData] = useState(props.data || {});
230
+ const [resultData, setResultData] = useState(props.data || {}); // pipe to playground API
231
+
214
232
  useEffect(() => {
215
233
  props.onInit({
234
+ attachDataContainer: node => dataEditorRef.current.attachTo(node),
235
+ attachEditorContainer: node => formEditorRef.current.attachTo(node),
236
+ attachFormContainer: node => formRef.current.attachTo(node),
237
+ attachPaletteContainer: node => paletteRef.current.attachTo(node),
238
+ attachPropertiesPanelContainer: node => propertiesPanelRef.current.attachTo(node),
239
+ attachResultContainer: node => resultViewRef.current.attachTo(node),
240
+ get: (name, strict) => formEditorRef.current.get(name, strict),
216
241
  setSchema: setInitialSchema
217
242
  });
218
243
  });
@@ -234,11 +259,20 @@ function PlaygroundRoot(props) {
234
259
  },
235
260
  palette: {
236
261
  parent: paletteContainerRef.current
262
+ },
263
+ propertiesPanel: {
264
+ parent: !inlinePropertiesPanel && propertiesPanelContainerRef.current
237
265
  }
238
266
  });
267
+ paletteRef.current = formEditor.get('palette');
268
+ propertiesPanelRef.current = formEditor.get('propertiesPanel');
239
269
  formEditor.on('changed', () => {
240
270
  setSchema(formEditor.getSchema());
241
271
  });
272
+ formEditor.on('formEditor.rendered', () => {
273
+ // notifiy interested parties after render
274
+ emit('formPlayground.rendered');
275
+ });
242
276
  form.on('changed', event => {
243
277
  setResultData(event.data);
244
278
  });
@@ -291,7 +325,9 @@ function PlaygroundRoot(props) {
291
325
  setShowEmbed(true);
292
326
  }, []);
293
327
  return jsxs("div", {
294
- class: "fjs-container fjs-pgl-root",
328
+ class: classNames('fjs-container', 'fjs-pgl-root', {
329
+ 'fjs-pgl-inline-editor-panel': inlinePropertiesPanel
330
+ }),
295
331
  children: [jsx("div", {
296
332
  class: "fjs-pgl-modals",
297
333
  children: showEmbed ? jsx(EmbedModal, {
@@ -306,14 +342,14 @@ function PlaygroundRoot(props) {
306
342
  class: "fjs-pgl-main",
307
343
  children: [jsxs(Section, {
308
344
  name: "Form Definition",
309
- children: [jsx(Section.HeaderItem, {
345
+ children: [displayActions && jsx(Section.HeaderItem, {
310
346
  children: jsx("button", {
311
347
  class: "fjs-pgl-button",
312
348
  title: "Download form definition",
313
349
  onClick: handleDownload,
314
350
  children: "Download"
315
351
  })
316
- }), jsx(Section.HeaderItem, {
352
+ }), displayActions && jsx(Section.HeaderItem, {
317
353
  children: jsx("button", {
318
354
  class: "fjs-pgl-button",
319
355
  onClick: showEmbedModal,
@@ -342,6 +378,9 @@ function PlaygroundRoot(props) {
342
378
  class: "fjs-pgl-text-container"
343
379
  })
344
380
  })]
381
+ }), jsx("div", {
382
+ class: "fjs-pgl-properties-container",
383
+ ref: propertiesPanelContainerRef
345
384
  })]
346
385
  });
347
386
  } // helpers ///////////////
@@ -354,7 +393,8 @@ function Playground(options) {
354
393
  const {
355
394
  container: parent,
356
395
  schema,
357
- data
396
+ data,
397
+ ...rest
358
398
  } = options;
359
399
  const emitter = mitt();
360
400
  let state = {
@@ -364,7 +404,11 @@ function Playground(options) {
364
404
  let ref;
365
405
  const container = document.createElement('div');
366
406
  container.classList.add('fjs-pgl-parent');
367
- parent.appendChild(container);
407
+
408
+ if (parent) {
409
+ parent.appendChild(container);
410
+ }
411
+
368
412
  const handleDrop = fileDrop('Drop a form file', function (files) {
369
413
  const file = files[0];
370
414
 
@@ -375,12 +419,25 @@ function Playground(options) {
375
419
  }
376
420
  }
377
421
  });
422
+
423
+ const withRef = function (fn) {
424
+ return function (...args) {
425
+ if (!ref) {
426
+ throw new Error('Playground is not initialized.');
427
+ }
428
+
429
+ fn(...args);
430
+ };
431
+ };
432
+
378
433
  container.addEventListener('dragover', handleDrop);
379
434
  render(jsx(PlaygroundRoot, {
380
435
  schema: schema,
381
436
  data: data,
382
437
  onStateChanged: _state => state = _state,
383
- onInit: _ref => ref = _ref
438
+ onInit: _ref => ref = _ref,
439
+ emit: emitter.emit,
440
+ ...rest
384
441
  }), container);
385
442
  this.on = emitter.on;
386
443
  this.off = emitter.off;
@@ -400,9 +457,32 @@ function Playground(options) {
400
457
  return ref.setSchema(schema);
401
458
  };
402
459
 
460
+ this.get = function (name, strict) {
461
+ return ref.get(name, strict);
462
+ };
463
+
403
464
  this.destroy = function () {
404
465
  this.emit('destroy');
405
466
  };
467
+
468
+ this.attachEditorContainer = withRef(function (node) {
469
+ return ref.attachEditorContainer(node);
470
+ });
471
+ this.attachPreviewContainer = withRef(function (node) {
472
+ return ref.attachFormContainer(node);
473
+ });
474
+ this.attachDataContainer = withRef(function (node) {
475
+ return ref.attachDataContainer(node);
476
+ });
477
+ this.attachResultContainer = withRef(function (node) {
478
+ return ref.attachResultContainer(node);
479
+ });
480
+ this.attachPaletteContainer = withRef(function (node) {
481
+ return ref.attachPaletteContainer(node);
482
+ });
483
+ this.attachPropertiesPanelContainer = withRef(function (node) {
484
+ return ref.attachPropertiesPanelContainer(node);
485
+ });
406
486
  }
407
487
 
408
488
  export { Playground };