@bpmn-io/properties-panel 2.2.1 → 3.1.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.
Files changed (116) hide show
  1. package/LICENSE +20 -20
  2. package/README.md +34 -34
  3. package/assets/properties-panel.css +1180 -1114
  4. package/dist/index.esm.js +657 -507
  5. package/dist/index.esm.js.map +1 -1
  6. package/dist/index.js +656 -505
  7. package/dist/index.js.map +1 -1
  8. package/package.json +90 -90
  9. package/preact/README.md +56 -51
  10. package/preact/compat/client.js +19 -0
  11. package/preact/compat/client.mjs +22 -0
  12. package/preact/compat/dist/compat.js +1 -1
  13. package/preact/compat/dist/compat.js.map +1 -1
  14. package/preact/compat/dist/compat.mjs +1 -1
  15. package/preact/compat/dist/compat.module.js +1 -1
  16. package/preact/compat/dist/compat.module.js.map +1 -1
  17. package/preact/compat/dist/compat.umd.js +1 -1
  18. package/preact/compat/dist/compat.umd.js.map +1 -1
  19. package/preact/compat/jsx-dev-runtime.js +2 -0
  20. package/preact/compat/jsx-dev-runtime.mjs +2 -0
  21. package/preact/compat/jsx-runtime.js +2 -0
  22. package/preact/compat/jsx-runtime.mjs +2 -0
  23. package/preact/compat/package.json +31 -0
  24. package/preact/compat/scheduler.js +15 -0
  25. package/preact/compat/{src/scheduler.js → scheduler.mjs} +8 -9
  26. package/preact/compat/server.browser.js +4 -0
  27. package/preact/compat/src/PureComponent.js +1 -1
  28. package/preact/compat/src/forwardRef.js +2 -9
  29. package/preact/compat/src/index.d.ts +58 -4
  30. package/preact/compat/src/index.js +73 -2
  31. package/preact/compat/src/portals.js +4 -2
  32. package/preact/compat/src/render.js +133 -76
  33. package/preact/compat/src/suspense-list.d.ts +2 -2
  34. package/preact/compat/src/suspense-list.js +14 -13
  35. package/preact/compat/src/suspense.d.ts +4 -4
  36. package/preact/compat/src/suspense.js +6 -6
  37. package/preact/compat/src/util.js +10 -0
  38. package/preact/debug/dist/debug.js +1 -1
  39. package/preact/debug/dist/debug.js.map +1 -1
  40. package/preact/debug/dist/debug.mjs +1 -1
  41. package/preact/debug/dist/debug.module.js +1 -1
  42. package/preact/debug/dist/debug.module.js.map +1 -1
  43. package/preact/debug/dist/debug.umd.js +1 -1
  44. package/preact/debug/dist/debug.umd.js.map +1 -1
  45. package/preact/debug/package.json +9 -0
  46. package/preact/debug/src/check-props.js +3 -3
  47. package/preact/debug/src/debug.js +38 -17
  48. package/preact/debug/src/index.d.ts +4 -0
  49. package/preact/debug/src/util.js +4 -0
  50. package/preact/devtools/dist/devtools.js +1 -1
  51. package/preact/devtools/dist/devtools.js.map +1 -1
  52. package/preact/devtools/dist/devtools.mjs +1 -1
  53. package/preact/devtools/dist/devtools.module.js +1 -1
  54. package/preact/devtools/dist/devtools.module.js.map +1 -1
  55. package/preact/devtools/dist/devtools.umd.js +1 -1
  56. package/preact/devtools/dist/devtools.umd.js.map +1 -1
  57. package/preact/devtools/package.json +23 -14
  58. package/preact/devtools/src/devtools.js +1 -1
  59. package/preact/dist/preact.js +1 -1
  60. package/preact/dist/preact.js.map +1 -1
  61. package/preact/dist/preact.min.js +1 -1
  62. package/preact/dist/preact.min.js.map +1 -1
  63. package/preact/dist/preact.min.module.js +2 -0
  64. package/preact/dist/preact.min.module.js.map +1 -0
  65. package/preact/dist/preact.min.umd.js +2 -0
  66. package/preact/dist/preact.min.umd.js.map +1 -0
  67. package/preact/dist/preact.mjs +1 -1
  68. package/preact/dist/preact.module.js +1 -1
  69. package/preact/dist/preact.module.js.map +1 -1
  70. package/preact/dist/preact.umd.js +1 -1
  71. package/preact/dist/preact.umd.js.map +1 -1
  72. package/preact/hooks/dist/hooks.js +1 -1
  73. package/preact/hooks/dist/hooks.js.map +1 -1
  74. package/preact/hooks/dist/hooks.mjs +1 -1
  75. package/preact/hooks/dist/hooks.module.js +1 -1
  76. package/preact/hooks/dist/hooks.module.js.map +1 -1
  77. package/preact/hooks/dist/hooks.umd.js +1 -1
  78. package/preact/hooks/dist/hooks.umd.js.map +1 -1
  79. package/preact/hooks/package.json +9 -0
  80. package/preact/hooks/src/index.d.ts +26 -14
  81. package/preact/hooks/src/index.js +169 -44
  82. package/preact/hooks/src/internal.d.ts +12 -2
  83. package/preact/jsx-runtime/dist/jsxRuntime.js +1 -1
  84. package/preact/jsx-runtime/dist/jsxRuntime.js.map +1 -1
  85. package/preact/jsx-runtime/dist/jsxRuntime.mjs +1 -1
  86. package/preact/jsx-runtime/dist/jsxRuntime.module.js +1 -1
  87. package/preact/jsx-runtime/dist/jsxRuntime.module.js.map +1 -1
  88. package/preact/jsx-runtime/dist/jsxRuntime.umd.js +1 -1
  89. package/preact/jsx-runtime/dist/jsxRuntime.umd.js.map +1 -1
  90. package/preact/jsx-runtime/package.json +26 -17
  91. package/preact/jsx-runtime/src/index.js +19 -13
  92. package/preact/package.json +315 -262
  93. package/preact/src/clone-element.js +16 -10
  94. package/preact/src/component.js +33 -23
  95. package/preact/src/constants.js +2 -1
  96. package/preact/src/create-context.js +8 -3
  97. package/preact/src/create-element.js +9 -11
  98. package/preact/src/diff/catch-error.js +4 -2
  99. package/preact/src/diff/children.js +41 -32
  100. package/preact/src/diff/index.js +81 -34
  101. package/preact/src/diff/props.js +15 -14
  102. package/preact/src/index.d.ts +369 -301
  103. package/preact/src/internal.d.ts +11 -2
  104. package/preact/src/jsx.d.ts +1862 -626
  105. package/preact/src/options.js +1 -2
  106. package/preact/src/render.js +5 -6
  107. package/preact/src/util.js +6 -0
  108. package/preact/test-utils/dist/testUtils.js +1 -1
  109. package/preact/test-utils/dist/testUtils.js.map +1 -1
  110. package/preact/test-utils/dist/testUtils.mjs +1 -1
  111. package/preact/test-utils/dist/testUtils.module.js +1 -1
  112. package/preact/test-utils/dist/testUtils.module.js.map +1 -1
  113. package/preact/test-utils/dist/testUtils.umd.js +1 -1
  114. package/preact/test-utils/dist/testUtils.umd.js.map +1 -1
  115. package/preact/test-utils/package.json +9 -0
  116. package/preact/test-utils/src/index.js +2 -1
package/dist/index.esm.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { useContext, useRef, useEffect, useMemo, useCallback, useState, useLayoutEffect } from '../preact/hooks';
2
2
  import { isFunction, isArray, get, assign, set, sortBy, find, isString, isNumber, debounce } from 'min-dash';
3
- import { forwardRef } from '../preact/compat';
3
+ import { useState as useState$1, useEffect as useEffect$1, forwardRef } from '../preact/compat';
4
4
  import { jsx, jsxs } from '../preact/jsx-runtime';
5
5
  import classnames from 'classnames';
6
6
  import { query } from 'min-dom';
@@ -141,19 +141,19 @@ const ErrorsContext = createContext({
141
141
  errors: {}
142
142
  });
143
143
 
144
- /**
145
- * @typedef {Function} <propertiesPanel.showEntry> callback
146
- *
147
- * @example
148
- *
149
- * useEvent('propertiesPanel.showEntry', ({ focus = false, ...rest }) => {
150
- * // ...
151
- * });
152
- *
153
- * @param {Object} context
154
- * @param {boolean} [context.focus]
155
- *
156
- * @returns void
144
+ /**
145
+ * @typedef {Function} <propertiesPanel.showEntry> callback
146
+ *
147
+ * @example
148
+ *
149
+ * useEvent('propertiesPanel.showEntry', ({ focus = false, ...rest }) => {
150
+ * // ...
151
+ * });
152
+ *
153
+ * @param {Object} context
154
+ * @param {boolean} [context.focus]
155
+ *
156
+ * @returns void
157
157
  */
158
158
  const EventContext = createContext({
159
159
  eventBus: null
@@ -166,20 +166,20 @@ const LayoutContext = createContext({
166
166
  setLayoutForKey: () => {}
167
167
  });
168
168
 
169
- /**
170
- * Accesses the global DescriptionContext and returns a description for a given id and element.
171
- *
172
- * @example
173
- * ```jsx
174
- * function TextField(props) {
175
- * const description = useDescriptionContext('input1', element);
176
- * }
177
- * ```
178
- *
179
- * @param {string} id
180
- * @param {object} element
181
- *
182
- * @returns {string}
169
+ /**
170
+ * Accesses the global DescriptionContext and returns a description for a given id and element.
171
+ *
172
+ * @example
173
+ * ```jsx
174
+ * function TextField(props) {
175
+ * const description = useDescriptionContext('input1', element);
176
+ * }
177
+ * ```
178
+ *
179
+ * @param {string} id
180
+ * @param {object} element
181
+ *
182
+ * @returns {string}
183
183
  */
184
184
  function useDescriptionContext(id, element) {
185
185
  const {
@@ -194,12 +194,18 @@ function useError(id) {
194
194
  } = useContext(ErrorsContext);
195
195
  return errors[id];
196
196
  }
197
+ function useErrors() {
198
+ const {
199
+ errors
200
+ } = useContext(ErrorsContext);
201
+ return errors;
202
+ }
197
203
 
198
- /**
199
- * Subscribe to an event immediately. Update subscription after inputs changed.
200
- *
201
- * @param {string} event
202
- * @param {Function} callback
204
+ /**
205
+ * Subscribe to an event immediately. Update subscription after inputs changed.
206
+ *
207
+ * @param {string} event
208
+ * @param {Function} callback
203
209
  */
204
210
  function useEvent(event, callback, eventBus) {
205
211
  const eventContext = useContext(EventContext);
@@ -231,24 +237,24 @@ function useEvent(event, callback, eventBus) {
231
237
 
232
238
  const KEY_LENGTH = 6;
233
239
 
234
- /**
235
- * Create a persistent key factory for plain objects without id.
236
- *
237
- * @example
238
- * ```jsx
239
- * function List({ objects }) {
240
- * const getKey = useKeyFactory();
241
- * return (<ol>{
242
- * objects.map(obj => {
243
- * const key = getKey(obj);
244
- * return <li key={key}>obj.name</li>
245
- * })
246
- * }</ol>);
247
- * }
248
- * ```
249
- *
250
- * @param {any[]} dependencies
251
- * @returns {(element: object) => string}
240
+ /**
241
+ * Create a persistent key factory for plain objects without id.
242
+ *
243
+ * @example
244
+ * ```jsx
245
+ * function List({ objects }) {
246
+ * const getKey = useKeyFactory();
247
+ * return (<ol>{
248
+ * objects.map(obj => {
249
+ * const key = getKey(obj);
250
+ * return <li key={key}>obj.name</li>
251
+ * })
252
+ * }</ol>);
253
+ * }
254
+ * ```
255
+ *
256
+ * @param {any[]} dependencies
257
+ * @returns {(element: object) => string}
252
258
  */
253
259
  function useKeyFactory(dependencies = []) {
254
260
  const map = useMemo(() => new Map(), dependencies);
@@ -263,20 +269,20 @@ function useKeyFactory(dependencies = []) {
263
269
  return getKey;
264
270
  }
265
271
 
266
- /**
267
- * Creates a state that persists in the global LayoutContext.
268
- *
269
- * @example
270
- * ```jsx
271
- * function Group(props) {
272
- * const [ open, setOpen ] = useLayoutState([ 'groups', 'foo', 'open' ], false);
273
- * }
274
- * ```
275
- *
276
- * @param {(string|number)[]} path
277
- * @param {any} [defaultValue]
278
- *
279
- * @returns {[ any, Function ]}
272
+ /**
273
+ * Creates a state that persists in the global LayoutContext.
274
+ *
275
+ * @example
276
+ * ```jsx
277
+ * function Group(props) {
278
+ * const [ open, setOpen ] = useLayoutState([ 'groups', 'foo', 'open' ], false);
279
+ * }
280
+ * ```
281
+ *
282
+ * @param {(string|number)[]} path
283
+ * @param {any} [defaultValue]
284
+ *
285
+ * @returns {[ any, Function ]}
280
286
  */
281
287
  function useLayoutState(path, defaultValue) {
282
288
  const {
@@ -290,11 +296,11 @@ function useLayoutState(path, defaultValue) {
290
296
  return [layoutForKey, setState];
291
297
  }
292
298
 
293
- /**
294
- * @pinussilvestrus: we need to introduce our own hook to persist the previous
295
- * state on updates.
296
- *
297
- * cf. https://reactjs.org/docs/hooks-faq.html#how-to-get-the-previous-props-or-state
299
+ /**
300
+ * @pinussilvestrus: we need to introduce our own hook to persist the previous
301
+ * state on updates.
302
+ *
303
+ * cf. https://reactjs.org/docs/hooks-faq.html#how-to-get-the-previous-props-or-state
298
304
  */
299
305
 
300
306
  function usePrevious(value) {
@@ -305,12 +311,12 @@ function usePrevious(value) {
305
311
  return ref.current;
306
312
  }
307
313
 
308
- /**
309
- * Subscribe to `propertiesPanel.showEntry`.
310
- *
311
- * @param {string} id
312
- *
313
- * @returns {import('preact').Ref}
314
+ /**
315
+ * Subscribe to `propertiesPanel.showEntry`.
316
+ *
317
+ * @param {string} id
318
+ *
319
+ * @returns {import('preact').Ref}
314
320
  */
315
321
  function useShowEntryEvent(id) {
316
322
  const {
@@ -341,20 +347,20 @@ function useShowEntryEvent(id) {
341
347
  return ref;
342
348
  }
343
349
 
344
- /**
345
- * @callback setSticky
346
- * @param {boolean} value
350
+ /**
351
+ * @callback setSticky
352
+ * @param {boolean} value
347
353
  */
348
354
 
349
- /**
350
- * Use IntersectionObserver to identify when DOM element is in sticky mode.
351
- * If sticky is observered setSticky(true) will be called.
352
- * If sticky mode is left, setSticky(false) will be called.
353
- *
354
- *
355
- * @param {Object} ref
356
- * @param {string} scrollContainerSelector
357
- * @param {setSticky} setSticky
355
+ /**
356
+ * Use IntersectionObserver to identify when DOM element is in sticky mode.
357
+ * If sticky is observered setSticky(true) will be called.
358
+ * If sticky mode is left, setSticky(false) will be called.
359
+ *
360
+ *
361
+ * @param {Object} ref
362
+ * @param {string} scrollContainerSelector
363
+ * @param {setSticky} setSticky
358
364
  */
359
365
  function useStickyIntersectionObserver(ref, scrollContainerSelector, setSticky) {
360
366
  const [scrollContainer, setScrollContainer] = useState(query(scrollContainerSelector));
@@ -408,19 +414,19 @@ function useStickyIntersectionObserver(ref, scrollContainerSelector, setSticky)
408
414
  }, [ref.current, scrollContainer, setSticky]);
409
415
  }
410
416
 
411
- /**
412
- * Creates a static function reference with changing body.
413
- * This is necessary when external libraries require a callback function
414
- * that has references to state variables.
415
- *
416
- * Usage:
417
- * const callback = useStaticCallback((val) => {val === currentState});
418
- *
419
- * The `callback` reference is static and can be safely used in external
420
- * libraries or as a prop that does not cause rerendering of children.
421
- *
422
- * @param {Function} callback function with changing reference
423
- * @returns {Function} static function reference
417
+ /**
418
+ * Creates a static function reference with changing body.
419
+ * This is necessary when external libraries require a callback function
420
+ * that has references to state variables.
421
+ *
422
+ * Usage:
423
+ * const callback = useStaticCallback((val) => {val === currentState});
424
+ *
425
+ * The `callback` reference is static and can be safely used in external
426
+ * libraries or as a prop that does not cause rerendering of children.
427
+ *
428
+ * @param {Function} callback function with changing reference
429
+ * @returns {Function} static function reference
424
430
  */
425
431
  function useStaticCallback(callback) {
426
432
  const callbackRef = useRef(callback);
@@ -460,6 +466,10 @@ function Group(props) {
460
466
  setEdited(hasOneEditedEntry);
461
467
  }, [entries]);
462
468
 
469
+ // set error state depending on all entries
470
+ const allErrors = useErrors();
471
+ const hasErrors = entries.some(entry => allErrors[entry.id]);
472
+
463
473
  // set css class when group is sticky to top
464
474
  useStickyIntersectionObserver(groupRef, 'div.bio-properties-panel-scroll-container', setSticky);
465
475
  const propertiesPanelContext = {
@@ -479,7 +489,10 @@ function Group(props) {
479
489
  children: label
480
490
  }), jsxs("div", {
481
491
  class: "bio-properties-panel-group-header-buttons",
482
- children: [edited && jsx(DataMarker, {}), jsx("button", {
492
+ children: [jsx(DataMarker, {
493
+ edited: edited,
494
+ hasErrors: hasErrors
495
+ }), jsx("button", {
483
496
  title: "Toggle section",
484
497
  class: "bio-properties-panel-group-header-button bio-properties-panel-arrow",
485
498
  children: jsx(ArrowIcon, {
@@ -506,20 +519,33 @@ function Group(props) {
506
519
  })]
507
520
  });
508
521
  }
509
- function DataMarker() {
510
- return jsx("div", {
511
- title: "Section contains data",
512
- class: "bio-properties-panel-dot"
513
- });
522
+ function DataMarker(props) {
523
+ const {
524
+ edited,
525
+ hasErrors
526
+ } = props;
527
+ if (hasErrors) {
528
+ return jsx("div", {
529
+ title: "Section contains an error",
530
+ class: "bio-properties-panel-dot bio-properties-panel-dot--error"
531
+ });
532
+ }
533
+ if (edited) {
534
+ return jsx("div", {
535
+ title: "Section contains data",
536
+ class: "bio-properties-panel-dot"
537
+ });
538
+ }
539
+ return null;
514
540
  }
515
541
 
516
- /**
517
- * @typedef { {
518
- * text: (element: object) => string,
519
- * icon?: (element: Object) => import('preact').Component
520
- * } } PlaceholderDefinition
521
- *
522
- * @param { PlaceholderDefinition } props
542
+ /**
543
+ * @typedef { {
544
+ * text: (element: object) => string,
545
+ * icon?: (element: Object) => import('preact').Component
546
+ * } } PlaceholderDefinition
547
+ *
548
+ * @param { PlaceholderDefinition } props
523
549
  */
524
550
  function Placeholder(props) {
525
551
  const {
@@ -543,72 +569,72 @@ function Placeholder(props) {
543
569
  const DEFAULT_LAYOUT = {};
544
570
  const DEFAULT_DESCRIPTION = {};
545
571
 
546
- /**
547
- * @typedef { {
548
- * component: import('preact').Component,
549
- * id: String,
550
- * isEdited?: Function
551
- * } } EntryDefinition
552
- *
553
- * @typedef { {
554
- * autoFocusEntry: String,
555
- * autoOpen?: Boolean,
556
- * entries: Array<EntryDefinition>,
557
- * id: String,
558
- * label: String,
559
- * remove: (event: MouseEvent) => void
560
- * } } ListItemDefinition
561
- *
562
- * @typedef { {
563
- * add: (event: MouseEvent) => void,
564
- * component: import('preact').Component,
565
- * element: Object,
566
- * id: String,
567
- * items: Array<ListItemDefinition>,
568
- * label: String,
569
- * shouldSort?: Boolean,
570
- * shouldOpen?: Boolean
571
- * } } ListGroupDefinition
572
- *
573
- * @typedef { {
574
- * component?: import('preact').Component,
575
- * entries: Array<EntryDefinition>,
576
- * id: String,
577
- * label: String,
578
- * shouldOpen?: Boolean
579
- * } } GroupDefinition
580
- *
581
- * @typedef { {
582
- * [id: String]: GetDescriptionFunction
583
- * } } DescriptionConfig
584
- *
585
- * @callback { {
586
- * @param {string} id
587
- * @param {Object} element
588
- * @returns {string}
589
- * } } GetDescriptionFunction
590
- *
591
- * @typedef { {
592
- * getEmpty: (element: object) => import('./components/Placeholder').PlaceholderDefinition,
593
- * getMultiple: (element: Object) => import('./components/Placeholder').PlaceholderDefinition
594
- * } } PlaceholderProvider
595
- *
572
+ /**
573
+ * @typedef { {
574
+ * component: import('preact').Component,
575
+ * id: String,
576
+ * isEdited?: Function
577
+ * } } EntryDefinition
578
+ *
579
+ * @typedef { {
580
+ * autoFocusEntry: String,
581
+ * autoOpen?: Boolean,
582
+ * entries: Array<EntryDefinition>,
583
+ * id: String,
584
+ * label: String,
585
+ * remove: (event: MouseEvent) => void
586
+ * } } ListItemDefinition
587
+ *
588
+ * @typedef { {
589
+ * add: (event: MouseEvent) => void,
590
+ * component: import('preact').Component,
591
+ * element: Object,
592
+ * id: String,
593
+ * items: Array<ListItemDefinition>,
594
+ * label: String,
595
+ * shouldSort?: Boolean,
596
+ * shouldOpen?: Boolean
597
+ * } } ListGroupDefinition
598
+ *
599
+ * @typedef { {
600
+ * component?: import('preact').Component,
601
+ * entries: Array<EntryDefinition>,
602
+ * id: String,
603
+ * label: String,
604
+ * shouldOpen?: Boolean
605
+ * } } GroupDefinition
606
+ *
607
+ * @typedef { {
608
+ * [id: String]: GetDescriptionFunction
609
+ * } } DescriptionConfig
610
+ *
611
+ * @callback { {
612
+ * @param {string} id
613
+ * @param {Object} element
614
+ * @returns {string}
615
+ * } } GetDescriptionFunction
616
+ *
617
+ * @typedef { {
618
+ * getEmpty: (element: object) => import('./components/Placeholder').PlaceholderDefinition,
619
+ * getMultiple: (element: Object) => import('./components/Placeholder').PlaceholderDefinition
620
+ * } } PlaceholderProvider
621
+ *
596
622
  */
597
623
 
598
- /**
599
- * A basic properties panel component. Describes *how* content will be rendered, accepts
600
- * data from implementor to describe *what* will be rendered.
601
- *
602
- * @param {Object} props
603
- * @param {Object|Array} props.element
604
- * @param {import('./components/Header').HeaderProvider} props.headerProvider
605
- * @param {PlaceholderProvider} [props.placeholderProvider]
606
- * @param {Array<GroupDefinition|ListGroupDefinition>} props.groups
607
- * @param {Object} [props.layoutConfig]
608
- * @param {Function} [props.layoutChanged]
609
- * @param {DescriptionConfig} [props.descriptionConfig]
610
- * @param {Function} [props.descriptionLoaded]
611
- * @param {Object} [props.eventBus]
624
+ /**
625
+ * A basic properties panel component. Describes *how* content will be rendered, accepts
626
+ * data from implementor to describe *what* will be rendered.
627
+ *
628
+ * @param {Object} props
629
+ * @param {Object|Array} props.element
630
+ * @param {import('./components/Header').HeaderProvider} props.headerProvider
631
+ * @param {PlaceholderProvider} [props.placeholderProvider]
632
+ * @param {Array<GroupDefinition|ListGroupDefinition>} props.groups
633
+ * @param {Object} [props.layoutConfig]
634
+ * @param {Function} [props.layoutChanged]
635
+ * @param {DescriptionConfig} [props.descriptionConfig]
636
+ * @param {Function} [props.descriptionLoaded]
637
+ * @param {Object} [props.eventBus]
612
638
  */
613
639
  function PropertiesPanel(props) {
614
640
  const {
@@ -747,11 +773,11 @@ function createDescriptionContext(overrides = {}) {
747
773
 
748
774
  // hooks //////////////////
749
775
 
750
- /**
751
- * This hook behaves like useLayoutEffect, but does not trigger on the first render.
752
- *
753
- * @param {Function} effect
754
- * @param {Array} deps
776
+ /**
777
+ * This hook behaves like useLayoutEffect, but does not trigger on the first render.
778
+ *
779
+ * @param {Function} effect
780
+ * @param {Array} deps
755
781
  */
756
782
  function useUpdateLayoutEffect(effect, deps) {
757
783
  const isMounted = useRef(false);
@@ -825,15 +851,15 @@ function MenuItem({
825
851
  });
826
852
  }
827
853
 
828
- /**
829
- *
830
- * @param {Array<null | Element>} ignoredElements
831
- * @param {Function} callback
854
+ /**
855
+ *
856
+ * @param {Array<null | Element>} ignoredElements
857
+ * @param {Function} callback
832
858
  */
833
859
  function useGlobalClick(ignoredElements, callback) {
834
860
  useEffect(() => {
835
- /**
836
- * @param {MouseEvent} event
861
+ /**
862
+ * @param {MouseEvent} event
837
863
  */
838
864
  function listener(event) {
839
865
  if (ignoredElements.some(element => element && element.contains(event.target))) {
@@ -964,8 +990,8 @@ function ListItem(props) {
964
990
 
965
991
  const noop$3 = () => {};
966
992
 
967
- /**
968
- * @param {import('../PropertiesPanel').ListGroupDefinition} props
993
+ /**
994
+ * @param {import('../PropertiesPanel').ListGroupDefinition} props
969
995
  */
970
996
  function ListGroup(props) {
971
997
  const {
@@ -1078,6 +1104,18 @@ function ListGroup(props) {
1078
1104
  setAddTriggered(true);
1079
1105
  add(e);
1080
1106
  };
1107
+ const allErrors = useErrors();
1108
+ const hasError = items.some(item => {
1109
+ if (allErrors[item.id]) {
1110
+ return true;
1111
+ }
1112
+ if (!item.entries) {
1113
+ return;
1114
+ }
1115
+
1116
+ // also check if the error is nested, e.g. for name-value entries
1117
+ return item.entries.some(entry => allErrors[entry.id]);
1118
+ });
1081
1119
  return jsxs("div", {
1082
1120
  class: "bio-properties-panel-group",
1083
1121
  "data-group-id": 'group-' + id,
@@ -1101,7 +1139,7 @@ function ListGroup(props) {
1101
1139
  }) : null]
1102
1140
  }) : null, hasItems ? jsx("div", {
1103
1141
  title: `List contains ${items.length} item${items.length != 1 ? 's' : ''}`,
1104
- class: "bio-properties-panel-list-badge",
1142
+ class: classnames('bio-properties-panel-list-badge', hasError ? 'bio-properties-panel-list-badge--error' : ''),
1105
1143
  children: items.length
1106
1144
  }) : null, hasItems ? jsx("button", {
1107
1145
  title: "Toggle section",
@@ -1142,8 +1180,8 @@ function ListGroup(props) {
1142
1180
 
1143
1181
  // helpers ////////////////////
1144
1182
 
1145
- /**
1146
- * Sorts given items alphanumeric by label
1183
+ /**
1184
+ * Sorts given items alphanumeric by label
1147
1185
  */
1148
1186
  function sortItems(items) {
1149
1187
  return sortBy(items, i => i.label.toLowerCase());
@@ -1171,6 +1209,121 @@ function Description(props) {
1171
1209
  }
1172
1210
  }
1173
1211
 
1212
+ function TooltipWrapper(props) {
1213
+ if (!props.value) {
1214
+ return props.children;
1215
+ }
1216
+ return jsx(Tooltip, {
1217
+ ...props
1218
+ });
1219
+ }
1220
+ function Tooltip(props) {
1221
+ const {
1222
+ value,
1223
+ labelId
1224
+ } = props;
1225
+ const [visible, setShow] = useState$1(false);
1226
+ let timeout = null;
1227
+ const wrapperRef = useRef(null);
1228
+ const tooltipRef = useRef(null);
1229
+ const showTooltip = async event => {
1230
+ const show = () => !visible && setShow(true);
1231
+ if (event instanceof MouseEvent) {
1232
+ timeout = setTimeout(show, 200);
1233
+ } else {
1234
+ show();
1235
+ }
1236
+ };
1237
+ const hideTooltip = () => setShow(false);
1238
+ const hideTooltipViaEscape = e => {
1239
+ e.code === 'Escape' && hideTooltip();
1240
+ };
1241
+ const isTooltipHovered = ({
1242
+ x,
1243
+ y
1244
+ }) => {
1245
+ const tooltip = tooltipRef.current;
1246
+ const wrapper = wrapperRef.current;
1247
+ return tooltip && (inBounds(x, y, wrapper.getBoundingClientRect()) || inBounds(x, y, tooltip.getBoundingClientRect()));
1248
+ };
1249
+ useEffect$1(() => {
1250
+ const {
1251
+ current
1252
+ } = wrapperRef;
1253
+ if (!current) {
1254
+ return;
1255
+ }
1256
+ const hideHoveredTooltip = e => {
1257
+ const isFocused = document.activeElement === wrapperRef.current || document.activeElement.closest('.bio-properties-panel-tooltip');
1258
+ if (visible && !isTooltipHovered({
1259
+ x: e.x,
1260
+ y: e.y
1261
+ }) && !isFocused) {
1262
+ hideTooltip();
1263
+ }
1264
+ };
1265
+ const hideFocusedTooltip = e => {
1266
+ const {
1267
+ relatedTarget
1268
+ } = e;
1269
+ const isTooltipChild = el => el && !!el.closest('.bio-properties-panel-tooltip');
1270
+ if (visible && !isHovered(wrapperRef.current) && !isTooltipChild(relatedTarget)) {
1271
+ hideTooltip();
1272
+ }
1273
+ };
1274
+ document.addEventListener('focusout', hideFocusedTooltip);
1275
+ document.addEventListener('mousemove', hideHoveredTooltip);
1276
+ return () => {
1277
+ document.removeEventListener('mousemove', hideHoveredTooltip);
1278
+ document.removeEventListener('focusout', hideFocusedTooltip);
1279
+ };
1280
+ }, [wrapperRef.current, visible]);
1281
+ return jsxs("div", {
1282
+ class: "bio-properties-panel-tooltip-wrapper",
1283
+ tabIndex: "0",
1284
+ ref: wrapperRef,
1285
+ onMouseEnter: showTooltip,
1286
+ onMouseLeave: () => clearTimeout(timeout),
1287
+ onFocus: showTooltip,
1288
+ onKeyDown: hideTooltipViaEscape,
1289
+ children: [props.children, visible ? jsxs("div", {
1290
+ class: "bio-properties-panel-tooltip",
1291
+ role: "tooltip",
1292
+ id: "bio-properties-panel-tooltip",
1293
+ "aria-labelledby": labelId,
1294
+ style: getTooltipPosition(wrapperRef.current),
1295
+ ref: tooltipRef,
1296
+ onClick: e => e.stopPropagation(),
1297
+ children: [jsx("div", {
1298
+ class: "bio-properties-panel-tooltip-content",
1299
+ children: value
1300
+ }), jsx("div", {
1301
+ class: "bio-properties-panel-tooltip-arrow"
1302
+ })]
1303
+ }) : null]
1304
+ });
1305
+ }
1306
+
1307
+ // helper
1308
+ function inBounds(x, y, bounds) {
1309
+ const {
1310
+ top,
1311
+ right,
1312
+ bottom,
1313
+ left
1314
+ } = bounds;
1315
+ return x >= left && x <= right && y >= top && y <= bottom;
1316
+ }
1317
+ function getTooltipPosition(refElement) {
1318
+ const refPosition = refElement.getBoundingClientRect();
1319
+ const right = `calc(100% - ${refPosition.x}px)`;
1320
+ const top = `${refPosition.top - 10}px`;
1321
+ return `right: ${right}; top: ${top};`;
1322
+ }
1323
+ function isHovered(element) {
1324
+ return element.matches(':hover');
1325
+ }
1326
+
1174
1327
  function Checkbox(props) {
1175
1328
  const {
1176
1329
  id,
@@ -1179,7 +1332,8 @@ function Checkbox(props) {
1179
1332
  disabled,
1180
1333
  value = false,
1181
1334
  onFocus,
1182
- onBlur
1335
+ onBlur,
1336
+ tooltip
1183
1337
  } = props;
1184
1338
  const [localValue, setLocalValue] = useState(value);
1185
1339
  const handleChangeCallback = ({
@@ -1214,22 +1368,27 @@ function Checkbox(props) {
1214
1368
  }), jsx("label", {
1215
1369
  for: prefixId$7(id),
1216
1370
  class: "bio-properties-panel-label",
1217
- children: label
1371
+ children: jsx(TooltipWrapper, {
1372
+ value: tooltip,
1373
+ labelId: prefixId$7(id),
1374
+ children: label
1375
+ })
1218
1376
  })]
1219
1377
  });
1220
1378
  }
1221
1379
 
1222
- /**
1223
- * @param {Object} props
1224
- * @param {Object} props.element
1225
- * @param {String} props.id
1226
- * @param {String} props.description
1227
- * @param {String} props.label
1228
- * @param {Function} props.getValue
1229
- * @param {Function} props.setValue
1230
- * @param {Function} props.onFocus
1231
- * @param {Function} props.onBlur
1232
- * @param {boolean} [props.disabled]
1380
+ /**
1381
+ * @param {Object} props
1382
+ * @param {Object} props.element
1383
+ * @param {String} props.id
1384
+ * @param {String} props.description
1385
+ * @param {String} props.label
1386
+ * @param {Function} props.getValue
1387
+ * @param {Function} props.setValue
1388
+ * @param {Function} props.onFocus
1389
+ * @param {Function} props.onBlur
1390
+ * @param {string|import('preact').Component} props.tooltip
1391
+ * @param {boolean} [props.disabled]
1233
1392
  */
1234
1393
  function CheckboxEntry(props) {
1235
1394
  const {
@@ -1241,7 +1400,8 @@ function CheckboxEntry(props) {
1241
1400
  setValue,
1242
1401
  disabled,
1243
1402
  onFocus,
1244
- onBlur
1403
+ onBlur,
1404
+ tooltip
1245
1405
  } = props;
1246
1406
  const value = getValue(element);
1247
1407
  const error = useError(id);
@@ -1255,7 +1415,8 @@ function CheckboxEntry(props) {
1255
1415
  onChange: setValue,
1256
1416
  onFocus: onFocus,
1257
1417
  onBlur: onBlur,
1258
- value: value
1418
+ value: value,
1419
+ tooltip: tooltip
1259
1420
  }, element), error && jsx("div", {
1260
1421
  class: "bio-properties-panel-error",
1261
1422
  children: error
@@ -1400,10 +1561,10 @@ const CodeEditor = forwardRef((props, ref) => {
1400
1561
  useEffect(() => {
1401
1562
  let editor;
1402
1563
 
1403
- /* Trigger FEEL toggle when
1404
- *
1405
- * - `backspace` is pressed
1406
- * - AND the cursor is at the beginning of the input
1564
+ /* Trigger FEEL toggle when
1565
+ *
1566
+ * - `backspace` is pressed
1567
+ * - AND the cursor is at the beginning of the input
1407
1568
  */
1408
1569
  const onKeyDown = e => {
1409
1570
  if (e.key !== 'Backspace' || !editor) {
@@ -1476,10 +1637,10 @@ function FeelIndicator(props) {
1476
1637
 
1477
1638
  const noop$2 = () => {};
1478
1639
 
1479
- /**
1480
- * @param {Object} props
1481
- * @param {Object} props.label
1482
- * @param {String} props.feel
1640
+ /**
1641
+ * @param {Object} props
1642
+ * @param {Object} props.label
1643
+ * @param {String} props.feel
1483
1644
  */
1484
1645
  function FeelIcon(props) {
1485
1646
  const {
@@ -1517,7 +1678,8 @@ function ToggleSwitch(props) {
1517
1678
  inline,
1518
1679
  onFocus,
1519
1680
  onBlur,
1520
- inputRef
1681
+ inputRef,
1682
+ tooltip
1521
1683
  } = props;
1522
1684
  const [localValue, setLocalValue] = useState(value);
1523
1685
  const handleInputCallback = async () => {
@@ -1540,7 +1702,11 @@ function ToggleSwitch(props) {
1540
1702
  children: [jsx("label", {
1541
1703
  class: "bio-properties-panel-label",
1542
1704
  for: prefixId$6(id),
1543
- children: label
1705
+ children: jsx(TooltipWrapper, {
1706
+ value: tooltip,
1707
+ labelId: prefixId$6(id),
1708
+ children: label
1709
+ })
1544
1710
  }), jsxs("div", {
1545
1711
  class: "bio-properties-panel-field-wrapper",
1546
1712
  children: [jsxs("label", {
@@ -1566,18 +1732,19 @@ function ToggleSwitch(props) {
1566
1732
  });
1567
1733
  }
1568
1734
 
1569
- /**
1570
- * @param {Object} props
1571
- * @param {Object} props.element
1572
- * @param {String} props.id
1573
- * @param {String} props.description
1574
- * @param {String} props.label
1575
- * @param {String} props.switcherLabel
1576
- * @param {Boolean} props.inline
1577
- * @param {Function} props.getValue
1578
- * @param {Function} props.setValue
1579
- * @param {Function} props.onFocus
1580
- * @param {Function} props.onBlur
1735
+ /**
1736
+ * @param {Object} props
1737
+ * @param {Object} props.element
1738
+ * @param {String} props.id
1739
+ * @param {String} props.description
1740
+ * @param {String} props.label
1741
+ * @param {String} props.switcherLabel
1742
+ * @param {Boolean} props.inline
1743
+ * @param {Function} props.getValue
1744
+ * @param {Function} props.setValue
1745
+ * @param {Function} props.onFocus
1746
+ * @param {Function} props.onBlur
1747
+ * @param {string|import('preact').Component} props.tooltip
1581
1748
  */
1582
1749
  function ToggleSwitchEntry(props) {
1583
1750
  const {
@@ -1590,7 +1757,8 @@ function ToggleSwitchEntry(props) {
1590
1757
  getValue,
1591
1758
  setValue,
1592
1759
  onFocus,
1593
- onBlur
1760
+ onBlur,
1761
+ tooltip
1594
1762
  } = props;
1595
1763
  const value = getValue(element);
1596
1764
  return jsxs("div", {
@@ -1604,7 +1772,8 @@ function ToggleSwitchEntry(props) {
1604
1772
  onFocus: onFocus,
1605
1773
  onBlur: onBlur,
1606
1774
  switcherLabel: switcherLabel,
1607
- inline: inline
1775
+ inline: inline,
1776
+ tooltip: tooltip
1608
1777
  }), jsx(Description, {
1609
1778
  forId: id,
1610
1779
  element: element,
@@ -1686,22 +1855,22 @@ function NumberField(props) {
1686
1855
  });
1687
1856
  }
1688
1857
 
1689
- /**
1690
- * @param {Object} props
1691
- * @param {Boolean} props.debounce
1692
- * @param {String} props.description
1693
- * @param {Boolean} props.disabled
1694
- * @param {Object} props.element
1695
- * @param {Function} props.getValue
1696
- * @param {String} props.id
1697
- * @param {String} props.label
1698
- * @param {String} props.max
1699
- * @param {String} props.min
1700
- * @param {Function} props.setValue
1701
- * @param {Function} props.onFocus
1702
- * @param {Function} props.onBlur
1703
- * @param {String} props.step
1704
- * @param {Function} props.validate
1858
+ /**
1859
+ * @param {Object} props
1860
+ * @param {Boolean} props.debounce
1861
+ * @param {String} props.description
1862
+ * @param {Boolean} props.disabled
1863
+ * @param {Object} props.element
1864
+ * @param {Function} props.getValue
1865
+ * @param {String} props.id
1866
+ * @param {String} props.label
1867
+ * @param {String} props.max
1868
+ * @param {String} props.min
1869
+ * @param {Function} props.setValue
1870
+ * @param {Function} props.onFocus
1871
+ * @param {Function} props.onBlur
1872
+ * @param {String} props.step
1873
+ * @param {Function} props.validate
1705
1874
  */
1706
1875
  function NumberFieldEntry(props) {
1707
1876
  const {
@@ -1720,11 +1889,9 @@ function NumberFieldEntry(props) {
1720
1889
  onBlur,
1721
1890
  validate
1722
1891
  } = props;
1723
- const [cachedInvalidValue, setCachedInvalidValue] = useState(null);
1724
1892
  const globalError = useError(id);
1725
1893
  const [localError, setLocalError] = useState(null);
1726
1894
  let value = getValue(element);
1727
- const previousValue = usePrevious(value);
1728
1895
  useEffect(() => {
1729
1896
  if (isFunction(validate)) {
1730
1897
  const newValidationError = validate(value) || null;
@@ -1736,16 +1903,9 @@ function NumberFieldEntry(props) {
1736
1903
  if (isFunction(validate)) {
1737
1904
  newValidationError = validate(newValue) || null;
1738
1905
  }
1739
- if (newValidationError) {
1740
- setCachedInvalidValue(newValue);
1741
- } else {
1742
- setValue(newValue);
1743
- }
1906
+ setValue(newValue, newValidationError);
1744
1907
  setLocalError(newValidationError);
1745
1908
  };
1746
- if (previousValue === value && localError) {
1747
- value = cachedInvalidValue;
1748
- }
1749
1909
  const error = globalError || localError;
1750
1910
  return jsxs("div", {
1751
1911
  class: classnames('bio-properties-panel-entry', error ? 'has-error' : ''),
@@ -1795,7 +1955,8 @@ function FeelTextfield(props) {
1795
1955
  disabled = false,
1796
1956
  variables,
1797
1957
  tooltipContainer,
1798
- OptionalComponent = OptionalFeelInput
1958
+ OptionalComponent = OptionalFeelInput,
1959
+ tooltip
1799
1960
  } = props;
1800
1961
  const [localValue, _setLocalValue] = useState(value);
1801
1962
  const editorRef = useShowEntryEvent(id);
@@ -1911,7 +2072,11 @@ function FeelTextfield(props) {
1911
2072
  for: prefixId$4(id),
1912
2073
  class: "bio-properties-panel-label",
1913
2074
  onClick: () => setFocus(),
1914
- children: [label, jsx(FeelIcon, {
2075
+ children: [jsx(TooltipWrapper, {
2076
+ value: tooltip,
2077
+ labelId: prefixId$4(id),
2078
+ children: label
2079
+ }), jsx(FeelIcon, {
1915
2080
  label: label,
1916
2081
  feel: feel,
1917
2082
  onClick: handleFeelToggle,
@@ -2153,24 +2318,25 @@ const OptionalFeelCheckbox = forwardRef((props, ref) => {
2153
2318
  });
2154
2319
  });
2155
2320
 
2156
- /**
2157
- * @param {Object} props
2158
- * @param {Object} props.element
2159
- * @param {String} props.id
2160
- * @param {String} props.description
2161
- * @param {Boolean} props.debounce
2162
- * @param {Boolean} props.disabled
2163
- * @param {Boolean} props.feel
2164
- * @param {String} props.label
2165
- * @param {Function} props.getValue
2166
- * @param {Function} props.setValue
2167
- * @param {Function} props.tooltipContainer
2168
- * @param {Function} props.validate
2169
- * @param {Function} props.show
2170
- * @param {Function} props.example
2171
- * @param {Function} props.variables
2172
- * @param {Function} props.onFocus
2173
- * @param {Function} props.onBlur
2321
+ /**
2322
+ * @param {Object} props
2323
+ * @param {Object} props.element
2324
+ * @param {String} props.id
2325
+ * @param {String} props.description
2326
+ * @param {Boolean} props.debounce
2327
+ * @param {Boolean} props.disabled
2328
+ * @param {Boolean} props.feel
2329
+ * @param {String} props.label
2330
+ * @param {Function} props.getValue
2331
+ * @param {Function} props.setValue
2332
+ * @param {Function} props.tooltipContainer
2333
+ * @param {Function} props.validate
2334
+ * @param {Function} props.show
2335
+ * @param {Function} props.example
2336
+ * @param {Function} props.variables
2337
+ * @param {Function} props.onFocus
2338
+ * @param {Function} props.onBlur
2339
+ * @param {string|import('preact').Component} props.tooltip
2174
2340
  */
2175
2341
  function FeelEntry(props) {
2176
2342
  const {
@@ -2191,13 +2357,12 @@ function FeelEntry(props) {
2191
2357
  example,
2192
2358
  variables,
2193
2359
  onFocus,
2194
- onBlur
2360
+ onBlur,
2361
+ tooltip
2195
2362
  } = props;
2196
- const [cachedInvalidValue, setCachedInvalidValue] = useState(null);
2197
2363
  const [validationError, setValidationError] = useState(null);
2198
2364
  const [localError, setLocalError] = useState(null);
2199
2365
  let value = getValue(element);
2200
- const previousValue = usePrevious(value);
2201
2366
  useEffect(() => {
2202
2367
  if (isFunction(validate)) {
2203
2368
  const newValidationError = validate(value) || null;
@@ -2209,22 +2374,16 @@ function FeelEntry(props) {
2209
2374
  if (isFunction(validate)) {
2210
2375
  newValidationError = validate(newValue) || null;
2211
2376
  }
2212
- if (newValidationError) {
2213
- setCachedInvalidValue(newValue);
2214
- } else {
2215
- // don't create multiple commandStack entries for the same value
2216
- if (newValue !== value) {
2217
- setValue(newValue);
2218
- }
2377
+
2378
+ // don't create multiple commandStack entries for the same value
2379
+ if (newValue !== value) {
2380
+ setValue(newValue, newValidationError);
2219
2381
  }
2220
2382
  setValidationError(newValidationError);
2221
2383
  });
2222
2384
  const onError = useCallback(err => {
2223
2385
  setLocalError(err);
2224
2386
  }, []);
2225
- if (previousValue === value && validationError) {
2226
- value = cachedInvalidValue;
2227
- }
2228
2387
  const temporaryError = useError(id);
2229
2388
  const error = localError || temporaryError || validationError;
2230
2389
  return jsxs("div", {
@@ -2249,7 +2408,8 @@ function FeelEntry(props) {
2249
2408
  value: value,
2250
2409
  variables: variables,
2251
2410
  tooltipContainer: tooltipContainer,
2252
- OptionalComponent: props.OptionalComponent
2411
+ OptionalComponent: props.OptionalComponent,
2412
+ tooltip: tooltip
2253
2413
  }), error && jsx("div", {
2254
2414
  class: "bio-properties-panel-error",
2255
2415
  children: error
@@ -2261,27 +2421,27 @@ function FeelEntry(props) {
2261
2421
  });
2262
2422
  }
2263
2423
 
2264
- /**
2265
- * @param {Object} props
2266
- * @param {Object} props.element
2267
- * @param {String} props.id
2268
- * @param {String} props.description
2269
- * @param {Boolean} props.debounce
2270
- * @param {Boolean} props.disabled
2271
- * @param {String} props.max
2272
- * @param {String} props.min
2273
- * @param {String} props.step
2274
- * @param {Boolean} props.feel
2275
- * @param {String} props.label
2276
- * @param {Function} props.getValue
2277
- * @param {Function} props.setValue
2278
- * @param {Function} props.tooltipContainer
2279
- * @param {Function} props.validate
2280
- * @param {Function} props.show
2281
- * @param {Function} props.example
2282
- * @param {Function} props.variables
2283
- * @param {Function} props.onFocus
2284
- * @param {Function} props.onBlur
2424
+ /**
2425
+ * @param {Object} props
2426
+ * @param {Object} props.element
2427
+ * @param {String} props.id
2428
+ * @param {String} props.description
2429
+ * @param {Boolean} props.debounce
2430
+ * @param {Boolean} props.disabled
2431
+ * @param {String} props.max
2432
+ * @param {String} props.min
2433
+ * @param {String} props.step
2434
+ * @param {Boolean} props.feel
2435
+ * @param {String} props.label
2436
+ * @param {Function} props.getValue
2437
+ * @param {Function} props.setValue
2438
+ * @param {Function} props.tooltipContainer
2439
+ * @param {Function} props.validate
2440
+ * @param {Function} props.show
2441
+ * @param {Function} props.example
2442
+ * @param {Function} props.variables
2443
+ * @param {Function} props.onFocus
2444
+ * @param {Function} props.onBlur
2285
2445
  */
2286
2446
  function FeelNumberEntry(props) {
2287
2447
  return jsx(FeelEntry, {
@@ -2291,24 +2451,24 @@ function FeelNumberEntry(props) {
2291
2451
  });
2292
2452
  }
2293
2453
 
2294
- /**
2295
- * @param {Object} props
2296
- * @param {Object} props.element
2297
- * @param {String} props.id
2298
- * @param {String} props.description
2299
- * @param {Boolean} props.debounce
2300
- * @param {Boolean} props.disabled
2301
- * @param {Boolean} props.feel
2302
- * @param {String} props.label
2303
- * @param {Function} props.getValue
2304
- * @param {Function} props.setValue
2305
- * @param {Function} props.tooltipContainer
2306
- * @param {Function} props.validate
2307
- * @param {Function} props.show
2308
- * @param {Function} props.example
2309
- * @param {Function} props.variables
2310
- * @param {Function} props.onFocus
2311
- * @param {Function} props.onBlur
2454
+ /**
2455
+ * @param {Object} props
2456
+ * @param {Object} props.element
2457
+ * @param {String} props.id
2458
+ * @param {String} props.description
2459
+ * @param {Boolean} props.debounce
2460
+ * @param {Boolean} props.disabled
2461
+ * @param {Boolean} props.feel
2462
+ * @param {String} props.label
2463
+ * @param {Function} props.getValue
2464
+ * @param {Function} props.setValue
2465
+ * @param {Function} props.tooltipContainer
2466
+ * @param {Function} props.validate
2467
+ * @param {Function} props.show
2468
+ * @param {Function} props.example
2469
+ * @param {Function} props.variables
2470
+ * @param {Function} props.onFocus
2471
+ * @param {Function} props.onBlur
2312
2472
  */
2313
2473
  function FeelTextAreaEntry(props) {
2314
2474
  return jsx(FeelEntry, {
@@ -2318,24 +2478,24 @@ function FeelTextAreaEntry(props) {
2318
2478
  });
2319
2479
  }
2320
2480
 
2321
- /**
2322
- * @param {Object} props
2323
- * @param {Object} props.element
2324
- * @param {String} props.id
2325
- * @param {String} props.description
2326
- * @param {Boolean} props.debounce
2327
- * @param {Boolean} props.disabled
2328
- * @param {Boolean} props.feel
2329
- * @param {String} props.label
2330
- * @param {Function} props.getValue
2331
- * @param {Function} props.setValue
2332
- * @param {Function} props.tooltipContainer
2333
- * @param {Function} props.validate
2334
- * @param {Function} props.show
2335
- * @param {Function} props.example
2336
- * @param {Function} props.variables
2337
- * @param {Function} props.onFocus
2338
- * @param {Function} props.onBlur
2481
+ /**
2482
+ * @param {Object} props
2483
+ * @param {Object} props.element
2484
+ * @param {String} props.id
2485
+ * @param {String} props.description
2486
+ * @param {Boolean} props.debounce
2487
+ * @param {Boolean} props.disabled
2488
+ * @param {Boolean} props.feel
2489
+ * @param {String} props.label
2490
+ * @param {Function} props.getValue
2491
+ * @param {Function} props.setValue
2492
+ * @param {Function} props.tooltipContainer
2493
+ * @param {Function} props.validate
2494
+ * @param {Function} props.show
2495
+ * @param {Function} props.example
2496
+ * @param {Function} props.variables
2497
+ * @param {Function} props.onFocus
2498
+ * @param {Function} props.onBlur
2339
2499
  */
2340
2500
  function FeelToggleSwitchEntry(props) {
2341
2501
  return jsx(FeelEntry, {
@@ -2345,24 +2505,24 @@ function FeelToggleSwitchEntry(props) {
2345
2505
  });
2346
2506
  }
2347
2507
 
2348
- /**
2349
- * @param {Object} props
2350
- * @param {Object} props.element
2351
- * @param {String} props.id
2352
- * @param {String} props.description
2353
- * @param {Boolean} props.debounce
2354
- * @param {Boolean} props.disabled
2355
- * @param {Boolean} props.feel
2356
- * @param {String} props.label
2357
- * @param {Function} props.getValue
2358
- * @param {Function} props.setValue
2359
- * @param {Function} props.tooltipContainer
2360
- * @param {Function} props.validate
2361
- * @param {Function} props.show
2362
- * @param {Function} props.example
2363
- * @param {Function} props.variables
2364
- * @param {Function} props.onFocus
2365
- * @param {Function} props.onBlur
2508
+ /**
2509
+ * @param {Object} props
2510
+ * @param {Object} props.element
2511
+ * @param {String} props.id
2512
+ * @param {String} props.description
2513
+ * @param {Boolean} props.debounce
2514
+ * @param {Boolean} props.disabled
2515
+ * @param {Boolean} props.feel
2516
+ * @param {String} props.label
2517
+ * @param {Function} props.getValue
2518
+ * @param {Function} props.setValue
2519
+ * @param {Function} props.tooltipContainer
2520
+ * @param {Function} props.validate
2521
+ * @param {Function} props.show
2522
+ * @param {Function} props.example
2523
+ * @param {Function} props.variables
2524
+ * @param {Function} props.onFocus
2525
+ * @param {Function} props.onBlur
2366
2526
  */
2367
2527
  function FeelCheckboxEntry(props) {
2368
2528
  return jsx(FeelEntry, {
@@ -2372,26 +2532,26 @@ function FeelCheckboxEntry(props) {
2372
2532
  });
2373
2533
  }
2374
2534
 
2375
- /**
2376
- * @param {Object} props
2377
- * @param {Object} props.element
2378
- * @param {String} props.id
2379
- * @param {String} props.description
2380
- * @param {String} props.hostLanguage
2381
- * @param {Boolean} props.singleLine
2382
- * @param {Boolean} props.debounce
2383
- * @param {Boolean} props.disabled
2384
- * @param {Boolean} props.feel
2385
- * @param {String} props.label
2386
- * @param {Function} props.getValue
2387
- * @param {Function} props.setValue
2388
- * @param {Function} props.tooltipContainer
2389
- * @param {Function} props.validate
2390
- * @param {Function} props.show
2391
- * @param {Function} props.example
2392
- * @param {Function} props.variables
2393
- * @param {Function} props.onFocus
2394
- * @param {Function} props.onBlur
2535
+ /**
2536
+ * @param {Object} props
2537
+ * @param {Object} props.element
2538
+ * @param {String} props.id
2539
+ * @param {String} props.description
2540
+ * @param {String} props.hostLanguage
2541
+ * @param {Boolean} props.singleLine
2542
+ * @param {Boolean} props.debounce
2543
+ * @param {Boolean} props.disabled
2544
+ * @param {Boolean} props.feel
2545
+ * @param {String} props.label
2546
+ * @param {Function} props.getValue
2547
+ * @param {Function} props.setValue
2548
+ * @param {Function} props.tooltipContainer
2549
+ * @param {Function} props.validate
2550
+ * @param {Function} props.show
2551
+ * @param {Function} props.example
2552
+ * @param {Function} props.variables
2553
+ * @param {Function} props.onFocus
2554
+ * @param {Function} props.onBlur
2395
2555
  */
2396
2556
  function FeelTemplatingEntry(props) {
2397
2557
  return jsx(FeelEntry, {
@@ -2418,19 +2578,19 @@ function prefixId$4(id) {
2418
2578
 
2419
2579
  const noop = () => {};
2420
2580
 
2421
- /**
2422
- * @param {Object} props
2423
- * @param {Object} props.element
2424
- * @param {String} props.id
2425
- * @param {String} props.description
2426
- * @param {Boolean} props.debounce
2427
- * @param {Boolean} props.disabled
2428
- * @param {String} props.label
2429
- * @param {Function} props.getValue
2430
- * @param {Function} props.setValue
2431
- * @param {Function} props.tooltipContainer
2432
- * @param {Function} props.validate
2433
- * @param {Function} props.show
2581
+ /**
2582
+ * @param {Object} props
2583
+ * @param {Object} props.element
2584
+ * @param {String} props.id
2585
+ * @param {String} props.description
2586
+ * @param {Boolean} props.debounce
2587
+ * @param {Boolean} props.disabled
2588
+ * @param {String} props.label
2589
+ * @param {Function} props.getValue
2590
+ * @param {Function} props.setValue
2591
+ * @param {Function} props.tooltipContainer
2592
+ * @param {Function} props.validate
2593
+ * @param {Function} props.show
2434
2594
  */
2435
2595
  function TemplatingEntry(props) {
2436
2596
  const {
@@ -2446,11 +2606,9 @@ function TemplatingEntry(props) {
2446
2606
  validate,
2447
2607
  show = noop
2448
2608
  } = props;
2449
- const [cachedInvalidValue, setCachedInvalidValue] = useState(null);
2450
2609
  const [validationError, setValidationError] = useState(null);
2451
2610
  const [localError, setLocalError] = useState(null);
2452
2611
  let value = getValue(element);
2453
- const previousValue = usePrevious(value);
2454
2612
  useEffect(() => {
2455
2613
  if (isFunction(validate)) {
2456
2614
  const newValidationError = validate(value) || null;
@@ -2462,22 +2620,16 @@ function TemplatingEntry(props) {
2462
2620
  if (isFunction(validate)) {
2463
2621
  newValidationError = validate(newValue) || null;
2464
2622
  }
2465
- if (newValidationError) {
2466
- setCachedInvalidValue(newValue);
2467
- } else {
2468
- // don't create multiple commandStack entries for the same value
2469
- if (newValue !== value) {
2470
- setValue(newValue);
2471
- }
2623
+
2624
+ // don't create multiple commandStack entries for the same value
2625
+ if (newValue !== value) {
2626
+ setValue(newValue, newValidationError);
2472
2627
  }
2473
2628
  setValidationError(newValidationError);
2474
2629
  });
2475
2630
  const onError = useCallback(err => {
2476
2631
  setLocalError(err);
2477
2632
  }, []);
2478
- if (previousValue === value && validationError) {
2479
- value = cachedInvalidValue;
2480
- }
2481
2633
  const temporaryError = useError(id);
2482
2634
  const error = localError || temporaryError || validationError;
2483
2635
  return jsxs("div", {
@@ -2617,8 +2769,8 @@ function List(props) {
2617
2769
  }
2618
2770
  }, [open, hasItems]);
2619
2771
 
2620
- /**
2621
- * @param {MouseEvent} event
2772
+ /**
2773
+ * @param {MouseEvent} event
2622
2774
  */
2623
2775
  function addItem(event) {
2624
2776
  event.stopPropagation();
@@ -2730,14 +2882,14 @@ function ItemsList(props) {
2730
2882
  });
2731
2883
  }
2732
2884
 
2733
- /**
2734
- * Place new items in the beginning of the list and sort the rest with provided function.
2735
- *
2736
- * @template Item
2737
- * @param {Item[]} currentItems
2738
- * @param {(a: Item, b: Item) => 0 | 1 | -1} [compareFn] function used to sort items
2739
- * @param {boolean} [shouldReset=false] set to `true` to reset state of the hook
2740
- * @returns {Item[]}
2885
+ /**
2886
+ * Place new items in the beginning of the list and sort the rest with provided function.
2887
+ *
2888
+ * @template Item
2889
+ * @param {Item[]} currentItems
2890
+ * @param {(a: Item, b: Item) => 0 | 1 | -1} [compareFn] function used to sort items
2891
+ * @param {boolean} [shouldReset=false] set to `true` to reset state of the hook
2892
+ * @returns {Item[]}
2741
2893
  */
2742
2894
  function useSortedItems(currentItems, compareFn, shouldReset = false) {
2743
2895
  const itemsRef = useRef(currentItems.slice());
@@ -2781,7 +2933,8 @@ function Select(props) {
2781
2933
  value = '',
2782
2934
  disabled,
2783
2935
  onFocus,
2784
- onBlur
2936
+ onBlur,
2937
+ tooltip
2785
2938
  } = props;
2786
2939
  const ref = useShowEntryEvent(id);
2787
2940
  const [localValue, setLocalValue] = useState(value);
@@ -2805,7 +2958,11 @@ function Select(props) {
2805
2958
  children: [jsx("label", {
2806
2959
  for: prefixId$3(id),
2807
2960
  class: "bio-properties-panel-label",
2808
- children: label
2961
+ children: jsx(TooltipWrapper, {
2962
+ value: tooltip,
2963
+ labelId: prefixId$3(id),
2964
+ children: label
2965
+ })
2809
2966
  }), jsx("select", {
2810
2967
  ref: ref,
2811
2968
  id: prefixId$3(id),
@@ -2837,19 +2994,20 @@ function Select(props) {
2837
2994
  });
2838
2995
  }
2839
2996
 
2840
- /**
2841
- * @param {object} props
2842
- * @param {object} props.element
2843
- * @param {string} props.id
2844
- * @param {string} [props.description]
2845
- * @param {string} props.label
2846
- * @param {Function} props.getValue
2847
- * @param {Function} props.setValue
2848
- * @param {Function} props.onFocus
2849
- * @param {Function} props.onBlur
2850
- * @param {Function} props.getOptions
2851
- * @param {boolean} [props.disabled]
2852
- * @param {Function} [props.validate]
2997
+ /**
2998
+ * @param {object} props
2999
+ * @param {object} props.element
3000
+ * @param {string} props.id
3001
+ * @param {string} [props.description]
3002
+ * @param {string} props.label
3003
+ * @param {Function} props.getValue
3004
+ * @param {Function} props.setValue
3005
+ * @param {Function} props.onFocus
3006
+ * @param {Function} props.onBlur
3007
+ * @param {Function} props.getOptions
3008
+ * @param {boolean} [props.disabled]
3009
+ * @param {Function} [props.validate]
3010
+ * @param {string|import('preact').Component} props.tooltip
2853
3011
  */
2854
3012
  function SelectEntry(props) {
2855
3013
  const {
@@ -2863,14 +3021,13 @@ function SelectEntry(props) {
2863
3021
  disabled,
2864
3022
  onFocus,
2865
3023
  onBlur,
2866
- validate
3024
+ validate,
3025
+ tooltip
2867
3026
  } = props;
2868
3027
  const options = getOptions(element);
2869
- const [cachedInvalidValue, setCachedInvalidValue] = useState(null);
2870
3028
  const globalError = useError(id);
2871
3029
  const [localError, setLocalError] = useState(null);
2872
3030
  let value = getValue(element);
2873
- const previousValue = usePrevious(value);
2874
3031
  useEffect(() => {
2875
3032
  if (isFunction(validate)) {
2876
3033
  const newValidationError = validate(value) || null;
@@ -2882,16 +3039,9 @@ function SelectEntry(props) {
2882
3039
  if (isFunction(validate)) {
2883
3040
  newValidationError = validate(newValue) || null;
2884
3041
  }
2885
- if (newValidationError) {
2886
- setCachedInvalidValue(newValue);
2887
- } else {
2888
- setValue(newValue);
2889
- }
3042
+ setValue(newValue, newValidationError);
2890
3043
  setLocalError(newValidationError);
2891
3044
  };
2892
- if (previousValue === value && localError) {
2893
- value = cachedInvalidValue;
2894
- }
2895
3045
  const error = globalError || localError;
2896
3046
  return jsxs("div", {
2897
3047
  class: classnames('bio-properties-panel-entry', error ? 'has-error' : ''),
@@ -2904,7 +3054,8 @@ function SelectEntry(props) {
2904
3054
  onFocus: onFocus,
2905
3055
  onBlur: onBlur,
2906
3056
  options: options,
2907
- disabled: disabled
3057
+ disabled: disabled,
3058
+ tooltip: tooltip
2908
3059
  }, element), error && jsx("div", {
2909
3060
  class: "bio-properties-panel-error",
2910
3061
  children: error
@@ -3000,7 +3151,8 @@ function TextArea(props) {
3000
3151
  onFocus,
3001
3152
  onBlur,
3002
3153
  autoResize,
3003
- rows = autoResize ? 1 : 2
3154
+ rows = autoResize ? 1 : 2,
3155
+ tooltip
3004
3156
  } = props;
3005
3157
  const [localValue, setLocalValue] = useState(value);
3006
3158
  const ref = useShowEntryEvent(id);
@@ -3028,7 +3180,11 @@ function TextArea(props) {
3028
3180
  children: [jsx("label", {
3029
3181
  for: prefixId$1(id),
3030
3182
  class: "bio-properties-panel-label",
3031
- children: label
3183
+ children: jsx(TooltipWrapper, {
3184
+ value: tooltip,
3185
+ labelId: prefixId$1(id),
3186
+ children: label
3187
+ })
3032
3188
  }), jsx("textarea", {
3033
3189
  ref: ref,
3034
3190
  id: prefixId$1(id),
@@ -3046,21 +3202,21 @@ function TextArea(props) {
3046
3202
  });
3047
3203
  }
3048
3204
 
3049
- /**
3050
- * @param {object} props
3051
- * @param {object} props.element
3052
- * @param {string} props.id
3053
- * @param {string} props.description
3054
- * @param {boolean} props.debounce
3055
- * @param {string} props.label
3056
- * @param {Function} props.getValue
3057
- * @param {Function} props.setValue
3058
- * @param {Function} props.onFocus
3059
- * @param {Function} props.onBlur
3060
- * @param {number} props.rows
3061
- * @param {boolean} props.monospace
3062
- * @param {Function} [props.validate]
3063
- * @param {boolean} [props.disabled]
3205
+ /**
3206
+ * @param {object} props
3207
+ * @param {object} props.element
3208
+ * @param {string} props.id
3209
+ * @param {string} props.description
3210
+ * @param {boolean} props.debounce
3211
+ * @param {string} props.label
3212
+ * @param {Function} props.getValue
3213
+ * @param {Function} props.setValue
3214
+ * @param {Function} props.onFocus
3215
+ * @param {Function} props.onBlur
3216
+ * @param {number} props.rows
3217
+ * @param {boolean} props.monospace
3218
+ * @param {Function} [props.validate]
3219
+ * @param {boolean} [props.disabled]
3064
3220
  */
3065
3221
  function TextAreaEntry(props) {
3066
3222
  const {
@@ -3077,13 +3233,12 @@ function TextAreaEntry(props) {
3077
3233
  validate,
3078
3234
  onFocus,
3079
3235
  onBlur,
3080
- autoResize
3236
+ autoResize,
3237
+ tooltip
3081
3238
  } = props;
3082
- const [cachedInvalidValue, setCachedInvalidValue] = useState(null);
3083
3239
  const globalError = useError(id);
3084
3240
  const [localError, setLocalError] = useState(null);
3085
3241
  let value = getValue(element);
3086
- const previousValue = usePrevious(value);
3087
3242
  useEffect(() => {
3088
3243
  if (isFunction(validate)) {
3089
3244
  const newValidationError = validate(value) || null;
@@ -3095,16 +3250,9 @@ function TextAreaEntry(props) {
3095
3250
  if (isFunction(validate)) {
3096
3251
  newValidationError = validate(newValue) || null;
3097
3252
  }
3098
- if (newValidationError) {
3099
- setCachedInvalidValue(newValue);
3100
- } else {
3101
- setValue(newValue);
3102
- }
3253
+ setValue(newValue, newValidationError);
3103
3254
  setLocalError(newValidationError);
3104
3255
  };
3105
- if (previousValue === value && localError) {
3106
- value = cachedInvalidValue;
3107
- }
3108
3256
  const error = globalError || localError;
3109
3257
  return jsxs("div", {
3110
3258
  class: classnames('bio-properties-panel-entry', error ? 'has-error' : ''),
@@ -3120,7 +3268,8 @@ function TextAreaEntry(props) {
3120
3268
  debounce: debounce,
3121
3269
  monospace: monospace,
3122
3270
  disabled: disabled,
3123
- autoResize: autoResize
3271
+ autoResize: autoResize,
3272
+ tooltip: tooltip
3124
3273
  }, element), error && jsx("div", {
3125
3274
  class: "bio-properties-panel-error",
3126
3275
  children: error
@@ -3150,10 +3299,12 @@ function Textfield(props) {
3150
3299
  onInput,
3151
3300
  onFocus,
3152
3301
  onBlur,
3153
- value = ''
3302
+ value = '',
3303
+ tooltip
3154
3304
  } = props;
3155
3305
  const [localValue, setLocalValue] = useState(value || '');
3156
3306
  const ref = useShowEntryEvent(id);
3307
+ const labelRef = useRef(null);
3157
3308
  const handleInputCallback = useMemo(() => {
3158
3309
  return debounce(({
3159
3310
  target
@@ -3174,7 +3325,12 @@ function Textfield(props) {
3174
3325
  children: [jsx("label", {
3175
3326
  for: prefixId(id),
3176
3327
  class: "bio-properties-panel-label",
3177
- children: label
3328
+ children: jsx(TooltipWrapper, {
3329
+ value: tooltip,
3330
+ refElement: labelRef,
3331
+ labelId: prefixId(id),
3332
+ children: label
3333
+ })
3178
3334
  }), jsx("input", {
3179
3335
  ref: ref,
3180
3336
  id: prefixId(id),
@@ -3192,19 +3348,20 @@ function Textfield(props) {
3192
3348
  });
3193
3349
  }
3194
3350
 
3195
- /**
3196
- * @param {Object} props
3197
- * @param {Object} props.element
3198
- * @param {String} props.id
3199
- * @param {String} props.description
3200
- * @param {Boolean} props.debounce
3201
- * @param {Boolean} props.disabled
3202
- * @param {String} props.label
3203
- * @param {Function} props.getValue
3204
- * @param {Function} props.setValue
3205
- * @param {Function} props.onFocus
3206
- * @param {Function} props.onBlur
3207
- * @param {Function} props.validate
3351
+ /**
3352
+ * @param {Object} props
3353
+ * @param {Object} props.element
3354
+ * @param {String} props.id
3355
+ * @param {String} props.description
3356
+ * @param {Boolean} props.debounce
3357
+ * @param {Boolean} props.disabled
3358
+ * @param {String} props.label
3359
+ * @param {Function} props.getValue
3360
+ * @param {Function} props.setValue
3361
+ * @param {Function} props.onFocus
3362
+ * @param {Function} props.onBlur
3363
+ * @param {string|import('preact').Component} props.tooltip
3364
+ * @param {Function} props.validate
3208
3365
  */
3209
3366
  function TextfieldEntry(props) {
3210
3367
  const {
@@ -3218,13 +3375,12 @@ function TextfieldEntry(props) {
3218
3375
  setValue,
3219
3376
  validate,
3220
3377
  onFocus,
3221
- onBlur
3378
+ onBlur,
3379
+ tooltip
3222
3380
  } = props;
3223
- const [cachedInvalidValue, setCachedInvalidValue] = useState(null);
3224
3381
  const globalError = useError(id);
3225
3382
  const [localError, setLocalError] = useState(null);
3226
3383
  let value = getValue(element);
3227
- const previousValue = usePrevious(value);
3228
3384
  useEffect(() => {
3229
3385
  if (isFunction(validate)) {
3230
3386
  const newValidationError = validate(value) || null;
@@ -3236,16 +3392,9 @@ function TextfieldEntry(props) {
3236
3392
  if (isFunction(validate)) {
3237
3393
  newValidationError = validate(newValue) || null;
3238
3394
  }
3239
- if (newValidationError) {
3240
- setCachedInvalidValue(newValue);
3241
- } else {
3242
- setValue(newValue);
3243
- }
3395
+ setValue(newValue, newValidationError);
3244
3396
  setLocalError(newValidationError);
3245
3397
  };
3246
- if (previousValue === value && localError) {
3247
- value = cachedInvalidValue;
3248
- }
3249
3398
  const error = globalError || localError;
3250
3399
  return jsxs("div", {
3251
3400
  class: classnames('bio-properties-panel-entry', error ? 'has-error' : ''),
@@ -3258,7 +3407,8 @@ function TextfieldEntry(props) {
3258
3407
  onInput: onInput,
3259
3408
  onFocus: onFocus,
3260
3409
  onBlur: onBlur,
3261
- value: value
3410
+ value: value,
3411
+ tooltip: tooltip
3262
3412
  }, element), error && jsx("div", {
3263
3413
  class: "bio-properties-panel-error",
3264
3414
  children: error
@@ -3296,5 +3446,5 @@ var index = {
3296
3446
  debounceInput: ['factory', debounceInput]
3297
3447
  };
3298
3448
 
3299
- export { ArrowIcon, CheckboxEntry, CollapsibleEntry, CreateIcon, index as DebounceInputModule, DeleteIcon, DescriptionContext, Description as DescriptionEntry, DropdownButton, ErrorsContext, EventContext, ExternalLinkIcon, FeelCheckboxEntry, FeelEntry, FeelIcon$1 as FeelIcon, FeelNumberEntry, FeelTemplatingEntry, FeelTextAreaEntry, FeelToggleSwitchEntry, Group, Header, HeaderButton, LayoutContext, List as ListEntry, ListGroup, ListItem, NumberFieldEntry, Placeholder, PropertiesPanel, LayoutContext as PropertiesPanelContext, SelectEntry, Simple as SimpleEntry, TemplatingEntry, TextAreaEntry, TextfieldEntry as TextFieldEntry, ToggleSwitchEntry, isEdited$8 as isCheckboxEntryEdited, isEdited$5 as isFeelEntryEdited, isEdited$6 as isNumberFieldEntryEdited, isEdited$3 as isSelectEntryEdited, isEdited$2 as isSimpleEntryEdited, isEdited$4 as isTemplatingEntryEdited, isEdited$1 as isTextAreaEntryEdited, isEdited as isTextFieldEntryEdited, isEdited$7 as isToggleSwitchEntryEdited, useDescriptionContext, useError, useEvent, useKeyFactory, useLayoutState, usePrevious, useShowEntryEvent, useStaticCallback, useStickyIntersectionObserver };
3449
+ export { ArrowIcon, CheckboxEntry, CollapsibleEntry, CreateIcon, index as DebounceInputModule, DeleteIcon, DescriptionContext, Description as DescriptionEntry, DropdownButton, ErrorsContext, EventContext, ExternalLinkIcon, FeelCheckboxEntry, FeelEntry, FeelIcon$1 as FeelIcon, FeelNumberEntry, FeelTemplatingEntry, FeelTextAreaEntry, FeelToggleSwitchEntry, Group, Header, HeaderButton, LayoutContext, List as ListEntry, ListGroup, ListItem, NumberFieldEntry, Placeholder, PropertiesPanel, LayoutContext as PropertiesPanelContext, SelectEntry, Simple as SimpleEntry, TemplatingEntry, TextAreaEntry, TextfieldEntry as TextFieldEntry, ToggleSwitchEntry, isEdited$8 as isCheckboxEntryEdited, isEdited$5 as isFeelEntryEdited, isEdited$6 as isNumberFieldEntryEdited, isEdited$3 as isSelectEntryEdited, isEdited$2 as isSimpleEntryEdited, isEdited$4 as isTemplatingEntryEdited, isEdited$1 as isTextAreaEntryEdited, isEdited as isTextFieldEntryEdited, isEdited$7 as isToggleSwitchEntryEdited, useDescriptionContext, useError, useErrors, useEvent, useKeyFactory, useLayoutState, usePrevious, useShowEntryEvent, useStaticCallback, useStickyIntersectionObserver };
3300
3450
  //# sourceMappingURL=index.esm.js.map