@oscarpalmer/oui 0.24.0 → 0.26.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 (52) hide show
  1. package/dist/css/{tooltip.css → floatable.css} +59 -24
  2. package/dist/css/reset.css +17 -0
  3. package/dist/js/dialog.d.mts +38 -0
  4. package/dist/js/dialog.mjs +92 -0
  5. package/dist/js/embedded-CHK82Uh5.d.mts +76 -0
  6. package/dist/js/embedded-ai6cqURc.d.mts +68 -0
  7. package/dist/js/floatable/embedded.d.mts +2 -0
  8. package/dist/js/floatable/embedded.mjs +157 -0
  9. package/dist/js/floatable/standalone.d.mts +2 -0
  10. package/dist/js/floatable/standalone.mjs +2 -0
  11. package/dist/js/focus-trap/embedded.d.mts +2 -26
  12. package/dist/js/focus-trap/embedded.mjs +158 -80
  13. package/dist/js/focus-trap/standalone.d.mts +2 -1
  14. package/dist/js/focus-trap/standalone.mjs +3 -3
  15. package/dist/js/index.d.mts +6 -3
  16. package/dist/js/index.mjs +9 -5
  17. package/dist/js/internal/draggable.d.mts +2 -2
  18. package/dist/js/internal/draggable.mjs +3 -3
  19. package/dist/js/{movable-BKFgoaOl.d.mts → movable-dNqBctx3.d.mts} +16 -16
  20. package/dist/js/movable.d.mts +2 -2
  21. package/dist/js/movable.mjs +4 -4
  22. package/dist/js/popover.d.mts +38 -1
  23. package/dist/js/popover.mjs +83 -44
  24. package/dist/js/sortable.d.mts +2 -2
  25. package/dist/js/sortable.mjs +5 -5
  26. package/dist/js/splitter.mjs +49 -48
  27. package/dist/js/toolbar.d.mts +1 -0
  28. package/dist/js/toolbar.mjs +107 -0
  29. package/dist/js/tooltip.d.mts +27 -1
  30. package/dist/js/tooltip.mjs +85 -49
  31. package/package.json +14 -2
  32. package/src/css/{tooltip.scss → floatable.scss} +47 -5
  33. package/src/css/mixins.scss +0 -2
  34. package/src/css/reset.scss +17 -0
  35. package/src/js/dialog.ts +188 -0
  36. package/src/js/floatable/embedded.ts +323 -0
  37. package/src/js/floatable/standalone.ts +1 -0
  38. package/src/js/focus-trap/embedded.ts +219 -93
  39. package/src/js/focus-trap/standalone.ts +4 -2
  40. package/src/js/index.ts +6 -4
  41. package/src/js/internal/draggable.ts +20 -20
  42. package/src/js/movable.ts +17 -17
  43. package/src/js/popover.ts +143 -61
  44. package/src/js/sortable.ts +26 -26
  45. package/src/js/splitter.ts +98 -96
  46. package/src/js/toolbar.ts +214 -0
  47. package/src/js/tooltip.ts +138 -54
  48. package/dist/css/popover.css +0 -30
  49. package/dist/js/floatable.d.mts +0 -59
  50. package/dist/js/floatable.mjs +0 -130
  51. package/src/css/popover.scss +0 -10
  52. package/src/js/floatable.ts +0 -237
package/src/js/movable.ts CHANGED
@@ -3,7 +3,7 @@ import {getPosition, on} from '@oscarpalmer/toretto/event';
3
3
  import {attributable} from './internal/attributable';
4
4
  import {
5
5
  addDraggable,
6
- Draggable,
6
+ OuiDraggable,
7
7
  removeDraggable,
8
8
  type DraggableBound,
9
9
  type DraggableState,
@@ -12,7 +12,7 @@ import {
12
12
 
13
13
  // #region Types
14
14
 
15
- export class Movable extends Draggable {
15
+ export class OuiMovable extends OuiDraggable {
16
16
  inset: string;
17
17
 
18
18
  moved = false;
@@ -73,15 +73,15 @@ export class Movable extends Draggable {
73
73
 
74
74
  // #region Functions
75
75
 
76
- function afterDirection(draggable: Draggable): void {
76
+ function afterDirection(draggable: OuiDraggable): void {
77
77
  const container = draggable.container?.getBoundingClientRect();
78
78
 
79
79
  if (container != null) {
80
- setOffset(draggable as Movable, container);
80
+ setOffset(draggable as OuiMovable, container);
81
81
  }
82
82
  }
83
83
 
84
- function destroyContainer(_: Draggable, container: HTMLElement, empty: boolean): void {
84
+ function destroyContainer(_: OuiDraggable, container: HTMLElement, empty: boolean): void {
85
85
  if (empty) {
86
86
  resizer.unobserve(container);
87
87
  }
@@ -89,7 +89,7 @@ function destroyContainer(_: Draggable, container: HTMLElement, empty: boolean):
89
89
 
90
90
  function getOffsetPosition(
91
91
  state: DraggableState,
92
- _: Draggable,
92
+ _: OuiDraggable,
93
93
  __: HTMLElement,
94
94
  position: EventPosition,
95
95
  ): EventPosition {
@@ -106,14 +106,14 @@ function getOriginalPosition(state: DraggableState): EventPosition {
106
106
  };
107
107
  }
108
108
 
109
- function initializeContainer(draggable: Draggable): void {
109
+ function initializeContainer(draggable: OuiDraggable): void {
110
110
  resizer.observe(draggable.container!);
111
111
  }
112
112
 
113
113
  function onBegin(): void {}
114
114
 
115
- function onCancel(state: DraggableState, draggable: Draggable): void {
116
- const movable = draggable as Movable;
115
+ function onCancel(state: DraggableState, draggable: OuiDraggable): void {
116
+ const movable = draggable as OuiMovable;
117
117
 
118
118
  const {element, inset, moved, position} = movable;
119
119
  const {x, y} = state.original ?? {x: 0, y: 0};
@@ -129,10 +129,10 @@ function onCancel(state: DraggableState, draggable: Draggable): void {
129
129
  function onEnd(
130
130
  event: MouseEvent | TouchEvent,
131
131
  state: DraggableState,
132
- draggable: Draggable,
132
+ draggable: OuiDraggable,
133
133
  reset: () => void,
134
134
  ): void {
135
- const movable = draggable as Movable;
135
+ const movable = draggable as OuiMovable;
136
136
 
137
137
  if (!movable.moved) {
138
138
  movable.moved = true;
@@ -170,7 +170,7 @@ function onEnd(
170
170
  function onMove(
171
171
  _: MouseEvent | TouchEvent,
172
172
  state: DraggableState,
173
- __: Draggable,
173
+ __: OuiDraggable,
174
174
  position: DragMovePosition,
175
175
  ): PlainObject | undefined {
176
176
  return {
@@ -202,7 +202,7 @@ function onScroll(): void {
202
202
  }
203
203
  }
204
204
 
205
- function reposition(movable: Movable): void {
205
+ function reposition(movable: OuiMovable): void {
206
206
  if (!movable.moved || movable.container == null) {
207
207
  return;
208
208
  }
@@ -215,7 +215,7 @@ function reposition(movable: Movable): void {
215
215
  movable.element.style.inset = `${y}px auto auto ${x}px`;
216
216
  }
217
217
 
218
- function setOffset(movable: Movable, container: DOMRect): void {
218
+ function setOffset(movable: OuiMovable, container: DOMRect): void {
219
219
  movable.offset = {};
220
220
 
221
221
  const element = movable.element.getBoundingClientRect();
@@ -234,16 +234,16 @@ const ATTRIBUTE_CONTAINER = `${ATTRIBUTE}-container`;
234
234
 
235
235
  const ATTRIBUTE_DIRECTION = `${ATTRIBUTE}-direction`;
236
236
 
237
- const CONTAINERS = new Map<HTMLElement, Set<Movable>>();
237
+ const CONTAINERS = new Map<HTMLElement, Set<OuiMovable>>();
238
238
 
239
239
  const EVENT_END = 'move:end';
240
240
 
241
- const MOVED = new Set<Movable>();
241
+ const MOVED = new Set<OuiMovable>();
242
242
 
243
243
  const SELECTOR_HANDLE = `[${ATTRIBUTE}-handle]`;
244
244
 
245
245
  const bound: DraggableBound = {
246
- constructor: Movable,
246
+ constructor: OuiMovable,
247
247
  property: 'movable',
248
248
  };
249
249
 
package/src/js/popover.ts CHANGED
@@ -3,110 +3,192 @@ import {isHTMLOrSVGElement} from '@oscarpalmer/toretto/is';
3
3
  import type {RemovableEventListener} from '@oscarpalmer/toretto/models';
4
4
  import {
5
5
  ATTRIBUTE_FLOATABLE,
6
- createFloatable,
7
- removeFloatable,
8
- type Floatable,
9
- type FloatableOptions,
10
- } from './floatable';
11
- import {createFocusTrap, removeFocusTrap, type FocusTrap} from './focus-trap/embedded';
6
+ createEmbeddedFloatable,
7
+ getOnBeforeToggleListener,
8
+ type OuiFloatable,
9
+ type OuiFloatableOptions,
10
+ } from './floatable/embedded';
11
+ import {createFocusTrap, type OuiFocusTrap} from './focus-trap/embedded';
12
12
  import {attributable} from './internal/attributable';
13
13
 
14
- class Popover {
15
- anchor: HTMLElement | null;
16
- floatable?: Floatable;
17
- focusTrap?: FocusTrap;
18
- listener: RemovableEventListener;
14
+ // #region Types
19
15
 
20
- constructor(public element: HTMLElement) {
21
- const anchor = element.ownerDocument.querySelector(`[popovertarget="${element.id}"]`);
16
+ class OuiPopover {
17
+ readonly #state: OuiPopoverState;
22
18
 
23
- if (!isHTMLOrSVGElement(anchor)) {
24
- throw new Error(`No anchor found for popover with id '${element.id}'.`);
25
- }
26
-
27
- if (element.contains(anchor)) {
28
- throw new Error('Popover content cannot contain its anchor.');
29
- }
19
+ /**
20
+ * Is the popover open?
21
+ */
22
+ get open(): boolean {
23
+ return this.#state.content.checkVisibility();
24
+ }
30
25
 
31
- this.anchor = anchor as HTMLElement;
26
+ constructor(state: OuiPopoverState) {
27
+ this.#state = state;
32
28
 
33
- this.floatable = createFloatable(this.anchor, element, options, false);
29
+ this.#state.floatable.update();
30
+ }
34
31
 
35
- this.focusTrap = createFocusTrap(element, {
36
- noescape: true,
37
- });
32
+ /**
33
+ * Closes the popover
34
+ */
35
+ hide(): void {
36
+ this.#state.floatable.hide();
37
+ }
38
38
 
39
- this.listener = on(element, EVENT_TOGGLE, event => {
40
- if (event.newState === STATE_OPEN) {
41
- ignoreFocus = false;
39
+ /**
40
+ * Opens the popover
41
+ */
42
+ show(): void {
43
+ this.#state.floatable.show();
44
+ }
45
+ }
42
46
 
43
- this.floatable?.update();
47
+ type OuiPopoverState = {
48
+ anchor: HTMLElement;
49
+ content: HTMLElement;
50
+ floatable: OuiFloatable;
51
+ focusTrap?: OuiFocusTrap;
52
+ listeners: RemovableEventListener[];
53
+ popover: OuiPopover;
54
+ };
44
55
 
45
- element.focus();
46
- } else if (!ignoreFocus) {
47
- this.anchor?.focus();
48
- }
49
- });
56
+ // #endregion
50
57
 
51
- this.element.setAttribute(ATTRIBUTE_CONTENT, '');
58
+ // #region Functions
52
59
 
53
- this.floatable?.update();
60
+ function addPopover(element: HTMLElement): void {
61
+ if (states.has(element) || element.hasAttribute(ATTRIBUTE_FLOATABLE)) {
62
+ return;
54
63
  }
55
64
 
56
- destroy(): void {
57
- this.focusTrap?.destroy();
65
+ const anchor = element.ownerDocument.querySelector(`[popovertarget="${element.id}"]`);
58
66
 
59
- removeFloatable(this.element);
60
- removeFocusTrap(this.element);
67
+ if (isHTMLOrSVGElement(anchor)) {
68
+ states.set(element, getState(anchor, element));
69
+ }
70
+ }
61
71
 
62
- this.element.removeAttribute(ATTRIBUTE_CONTENT);
72
+ function destroyPopover(state: OuiPopoverState): void {
73
+ state.floatable.destroy();
74
+ state.focusTrap?.destroy();
63
75
 
64
- this.anchor = null;
65
- this.element = null as never;
76
+ for (const listener of state.listeners) {
77
+ listener();
66
78
  }
79
+
80
+ state.anchor = undefined as never;
81
+ state.content = undefined as never;
82
+ state.floatable = undefined as never;
83
+ state.focusTrap = undefined as never;
84
+ state.listeners = undefined as never;
85
+ state.popover = undefined as never;
67
86
  }
68
87
 
69
- function onAdd(element: HTMLElement): void {
70
- if (
71
- !instances.has(element) &&
72
- element.getAttribute(ATTRIBUTE) !== POPOVER_HINT &&
73
- !element.hasAttribute(ATTRIBUTE_FLOATABLE)
74
- ) {
75
- instances.set(element, new Popover(element));
76
- }
88
+ /**
89
+ * Get the _OuiPopover_ for an element
90
+ *
91
+ * @param element Element to get _OuiPopover_ for
92
+ * @returns _OuiPopover_ instance
93
+ */
94
+ function getPopover(element: HTMLElement): OuiPopover | undefined {
95
+ return states.get(element)?.popover;
96
+ }
97
+
98
+ function getState(anchor: HTMLElement, content: HTMLElement): OuiPopoverState {
99
+ const state: OuiPopoverState = {
100
+ anchor,
101
+ content,
102
+ floatable: createEmbeddedFloatable(anchor, content, options),
103
+ focusTrap:
104
+ content.getAttribute(ARIA_MODAL) === TRUE
105
+ ? createFocusTrap(content, {
106
+ noescape: true,
107
+ })
108
+ : undefined,
109
+ listeners: [
110
+ getOnBeforeToggleListener(content),
111
+ on(content, EVENT_TOGGLE, event => {
112
+ if (event.newState === STATE_OPEN) {
113
+ ignoreFocus = false;
114
+
115
+ state.floatable?.update();
116
+
117
+ content.setAttribute(ATTRIBUTE_OPEN, '');
118
+
119
+ content.focus();
120
+ } else {
121
+ content.removeAttribute(ATTRIBUTE_OPEN);
122
+
123
+ if (!ignoreFocus) {
124
+ anchor?.focus();
125
+ }
126
+ }
127
+ }),
128
+ ],
129
+ popover: undefined as never,
130
+ };
131
+
132
+ state.popover = new OuiPopover(state);
133
+
134
+ return state;
77
135
  }
78
136
 
79
137
  function onPointerdown(): void {
80
138
  ignoreFocus = true;
81
139
  }
82
140
 
83
- function onRemove(element: HTMLElement): void {
84
- instances.get(element)?.destroy();
141
+ function removePopover(element: HTMLElement): void {
142
+ const state = states.get(element);
85
143
 
86
- instances.delete(element);
144
+ if (state == null) {
145
+ return;
146
+ }
147
+
148
+ destroyPopover(state);
149
+
150
+ states.delete(element);
87
151
  }
88
152
 
89
- const ATTRIBUTE = 'popover';
153
+ // #endregion
90
154
 
91
- const ATTRIBUTE_CONTENT = 'oui-popover-content';
155
+ // #region Variables
92
156
 
93
- const EVENT_TOGGLE = 'toggle';
157
+ const ATTRIBUTE = 'oui-popover';
158
+
159
+ const ARIA_MODAL = 'aria-modal';
94
160
 
95
- const POPOVER_HINT = 'hint';
161
+ const ATTRIBUTE_OPEN = `${ATTRIBUTE}-open`;
162
+
163
+ const EVENT_TOGGLE = 'toggle';
96
164
 
97
165
  const STATE_OPEN = 'open';
98
166
 
99
- const instances = new WeakMap<HTMLElement, Popover>();
167
+ const TRUE = 'true';
100
168
 
101
- const options: FloatableOptions = {
169
+ const options: OuiFloatableOptions = {
102
170
  attribute: `${ATTRIBUTE}position`,
103
171
  position: 'below-start',
104
172
  };
105
173
 
174
+ const states = new WeakMap<HTMLElement, OuiPopoverState>();
175
+
106
176
  let ignoreFocus = false;
107
177
 
178
+ // #endregion
179
+
180
+ // #region Initialization
181
+
108
182
  on(document, 'pointerdown', onPointerdown, {
109
183
  capture: true,
110
184
  });
111
185
 
112
- attributable(ATTRIBUTE, onAdd, onRemove);
186
+ attributable(ATTRIBUTE, addPopover, removePopover);
187
+
188
+ // #endregion
189
+
190
+ // #region Exports
191
+
192
+ export {getPopover, type OuiPopover};
193
+
194
+ // #endregion
@@ -6,7 +6,7 @@ import {isHTMLOrSVGElement} from '@oscarpalmer/toretto/is';
6
6
  import {attributable} from './internal/attributable';
7
7
  import {
8
8
  addDraggable,
9
- Draggable,
9
+ OuiDraggable,
10
10
  removeDraggable,
11
11
  type DraggableBound,
12
12
  type DraggableState,
@@ -15,7 +15,7 @@ import {
15
15
 
16
16
  // #region Types
17
17
 
18
- export class Sortable extends Draggable {
18
+ export class OuiSortable extends OuiDraggable {
19
19
  connections: string | null;
20
20
 
21
21
  origin: HTMLElement | undefined;
@@ -49,12 +49,12 @@ export class Sortable extends Draggable {
49
49
  }
50
50
  }
51
51
 
52
- type SortablePlaceholder = {
53
- drag: SortablePlaceholderDrag;
52
+ type OuiSortablePlaceholder = {
53
+ drag: OuiSortablePlaceholderDrag;
54
54
  position: HTMLElement | undefined;
55
55
  };
56
56
 
57
- type SortablePlaceholderDrag = {
57
+ type OuiSortablePlaceholderDrag = {
58
58
  custom: HTMLElement | undefined;
59
59
  default: HTMLElement | undefined;
60
60
  };
@@ -65,7 +65,7 @@ type SortablePlaceholderDrag = {
65
65
 
66
66
  function afterEnd(
67
67
  insert: 'append' | 'insert' | 'prepend' | undefined,
68
- from: Sortable,
68
+ from: OuiSortable,
69
69
  events: CustomEvent[],
70
70
  elements: {origin?: HTMLElement; target: HTMLElement},
71
71
  position: EventPosition | undefined,
@@ -114,7 +114,7 @@ function getDragPlaceholder(): HTMLElement {
114
114
 
115
115
  function getOffsetPosition(
116
116
  _: DraggableState,
117
- draggable: Draggable,
117
+ draggable: OuiDraggable,
118
118
  element: HTMLElement,
119
119
  position: EventPosition,
120
120
  ): EventPosition {
@@ -128,13 +128,13 @@ function getOffsetPosition(
128
128
 
129
129
  function getOriginalPosition(
130
130
  _: DraggableState,
131
- __: Draggable,
131
+ __: OuiDraggable,
132
132
  position: EventPosition,
133
133
  ): EventPosition {
134
134
  return position;
135
135
  }
136
136
 
137
- function getPositionPlaceholder(sortable: Sortable): HTMLElement {
137
+ function getPositionPlaceholder(sortable: OuiSortable): HTMLElement {
138
138
  placeholder.position ??= createElement('div');
139
139
 
140
140
  placeholder.position.setAttribute(ATTRIBUTE_PLACEHOLDER_POSITION, '');
@@ -152,10 +152,10 @@ function getPositionPlaceholder(sortable: Sortable): HTMLElement {
152
152
  function onBegin(
153
153
  _: MouseEvent | TouchEvent,
154
154
  state: DraggableState,
155
- draggable: Draggable,
155
+ draggable: OuiDraggable,
156
156
  element: HTMLElement,
157
157
  ): void {
158
- const sortable = draggable as Sortable;
158
+ const sortable = draggable as OuiSortable;
159
159
 
160
160
  sortable.origin = element;
161
161
 
@@ -166,8 +166,8 @@ function onBegin(
166
166
  document.body.setAttribute(ATTRIBUTE_ACTIVE, '');
167
167
  }
168
168
 
169
- function onCancel(_: DraggableState, draggable: Draggable): void {
170
- const sortable = draggable as Sortable;
169
+ function onCancel(_: DraggableState, draggable: OuiDraggable): void {
170
+ const sortable = draggable as OuiSortable;
171
171
 
172
172
  const {origin} = sortable;
173
173
 
@@ -183,10 +183,10 @@ function onCancel(_: DraggableState, draggable: Draggable): void {
183
183
  function onEnd(
184
184
  event: MouseEvent | TouchEvent,
185
185
  state: DraggableState,
186
- draggable: Draggable,
186
+ draggable: OuiDraggable,
187
187
  reset: () => void,
188
188
  ): void {
189
- const from = draggable as Sortable;
189
+ const from = draggable as OuiSortable;
190
190
  const {origin} = from;
191
191
 
192
192
  const position = getPosition(event) ?? {x: 0, y: 0};
@@ -206,7 +206,7 @@ function onEnd(
206
206
  }
207
207
 
208
208
  let insert: 'append' | 'insert' | 'prepend' | undefined = 'insert';
209
- let to: Sortable | undefined;
209
+ let to: OuiSortable | undefined;
210
210
 
211
211
  if (element == null) {
212
212
  element = findAncestor(target, SELECTOR) as HTMLElement;
@@ -258,15 +258,15 @@ function onEnd(
258
258
  function onMove(
259
259
  event: MouseEvent | TouchEvent,
260
260
  state: DraggableState,
261
- draggable: Draggable,
261
+ draggable: OuiDraggable,
262
262
  position: DragMovePosition,
263
263
  ): PlainObject | undefined {
264
- const from = draggable as Sortable;
264
+ const from = draggable as OuiSortable;
265
265
 
266
266
  const fromElement = from.origin;
267
267
  const toElement = findAncestor(event, SELECTOR_ITEM) as HTMLElement;
268
268
 
269
- let to: Sortable | undefined;
269
+ let to: OuiSortable | undefined;
270
270
 
271
271
  if (toElement == null) {
272
272
  to = state.instances.get(findAncestor(event, SELECTOR) as HTMLElement)?.sortable;
@@ -320,7 +320,7 @@ function resetPlaceholders(): void {
320
320
  placeholder.drag.custom = undefined;
321
321
  }
322
322
 
323
- function setPlaceholder(state: DraggableState, sortable: Sortable, origin: HTMLElement): void {
323
+ function setPlaceholder(state: DraggableState, sortable: OuiSortable, origin: HTMLElement): void {
324
324
  const element = getDragPlaceholder();
325
325
 
326
326
  placeholder.drag.default!.innerHTML = '';
@@ -363,7 +363,7 @@ function setPlaceholder(state: DraggableState, sortable: Sortable, origin: HTMLE
363
363
  });
364
364
  }
365
365
 
366
- function updatePlaceholder(sortable: Sortable, element: HTMLElement): void {
366
+ function updatePlaceholder(sortable: OuiSortable, element: HTMLElement): void {
367
367
  element.style.position = 'fixed';
368
368
 
369
369
  element.setAttribute(ATTRIBUTE_PLACEHOLDER_DRAG, '');
@@ -383,8 +383,8 @@ function updatePlaceholder(sortable: Sortable, element: HTMLElement): void {
383
383
 
384
384
  function validatePosition(
385
385
  _: DraggableState,
386
- from: Sortable,
387
- to: Sortable | undefined,
386
+ from: OuiSortable,
387
+ to: OuiSortable | undefined,
388
388
  position: EventPosition,
389
389
  ): boolean {
390
390
  let valid = true;
@@ -434,7 +434,7 @@ const ATTRIBUTE_PLACEHOLDER_POSITION = `${ATTRIBUTE}-placeholder-position`;
434
434
 
435
435
  const ATTRIBUTE_VERTICAL = `${ATTRIBUTE}-vertical`;
436
436
 
437
- const CONTAINERS = new Map<HTMLElement, Set<Sortable>>();
437
+ const CONTAINERS = new Map<HTMLElement, Set<OuiSortable>>();
438
438
 
439
439
  const EVENT_END = 'sort:end';
440
440
 
@@ -449,11 +449,11 @@ const SELECTOR = `[${ATTRIBUTE}]`;
449
449
  const SELECTOR_ITEM = `[${ATTRIBUTE}] > *`;
450
450
 
451
451
  const bound: DraggableBound = {
452
- constructor: Sortable,
452
+ constructor: OuiSortable,
453
453
  property: 'sortable',
454
454
  };
455
455
 
456
- const placeholder: SortablePlaceholder = {
456
+ const placeholder: OuiSortablePlaceholder = {
457
457
  drag: {
458
458
  custom: undefined,
459
459
  default: undefined,