@oscarpalmer/oui 0.38.0 → 0.39.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 (187) hide show
  1. package/dist/css/badge.css +11 -8
  2. package/dist/css/button.css +106 -14
  3. package/dist/css/color-picker.css +555 -73
  4. package/dist/css/color.css +86 -86
  5. package/dist/css/combobox.css +98 -4
  6. package/dist/css/content.css +7 -6
  7. package/dist/css/floatable.css +1 -3
  8. package/dist/css/form.css +99 -6
  9. package/dist/css/icon.css +99 -0
  10. package/dist/css/listbox.css +3 -0
  11. package/dist/css/message.css +4 -3
  12. package/dist/css/mixins/button.mixins.css +1 -0
  13. package/dist/css/reset.css +1 -1
  14. package/dist/css/tabs.css +95 -3
  15. package/dist/css/typography.css +90 -0
  16. package/dist/js/color-picker/constants.color-picker.d.mts +2 -0
  17. package/dist/js/color-picker/constants.color-picker.mjs +59 -0
  18. package/dist/js/color-picker/dom.color-picker.d.mts +8 -0
  19. package/dist/js/color-picker/dom.color-picker.mjs +191 -0
  20. package/dist/js/color-picker/event.color-picker.d.mts +9 -0
  21. package/dist/js/color-picker/event.color-picker.mjs +2 -0
  22. package/dist/js/color-picker/form.color-picker.d.mts +5 -0
  23. package/dist/js/color-picker/form.color-picker.mjs +24 -0
  24. package/dist/js/color-picker/index.d.mts +2 -0
  25. package/dist/js/color-picker/index.mjs +303 -0
  26. package/dist/js/color-picker/misc.color-picker.d.mts +2 -0
  27. package/dist/js/color-picker/misc.color-picker.mjs +2 -0
  28. package/dist/js/color-picker/models.color-picker.d.mts +2 -0
  29. package/dist/js/color-picker/models.color-picker.mjs +24 -0
  30. package/dist/js/color-picker/output.color-picker.d.mts +8 -0
  31. package/dist/js/color-picker/output.color-picker.mjs +233 -0
  32. package/dist/js/color-picker/state.color-picker.d.mts +8 -0
  33. package/dist/js/color-picker/state.color-picker.mjs +2 -0
  34. package/dist/js/combobox/constants.combobox.d.mts +1 -1
  35. package/dist/js/combobox/dom.combobox.d.mts +12 -13
  36. package/dist/js/combobox/dom.combobox.mjs +5 -2
  37. package/dist/js/combobox/event.combobox.d.mts +20 -21
  38. package/dist/js/combobox/event.combobox.mjs +1 -1
  39. package/dist/js/combobox/index.d.mts +1 -1
  40. package/dist/js/combobox/index.mjs +2 -2
  41. package/dist/js/combobox/misc.combobox.d.mts +1 -1
  42. package/dist/js/combobox/misc.combobox.mjs +1 -1
  43. package/dist/js/combobox/models.combobox.d.mts +12 -13
  44. package/dist/js/combobox/state.combobox.d.mts +8 -9
  45. package/dist/js/combobox/state.combobox.mjs +1 -1
  46. package/dist/js/constants.color-picker-B-gFjL8m.d.mts +364 -0
  47. package/dist/js/constants.combobox-8EMRmv09.d.mts +18 -0
  48. package/dist/js/constants.listbox-DGnX32kv.d.mts +8 -0
  49. package/dist/js/dialog.d.mts +2 -2
  50. package/dist/js/dialog.mjs +1 -1
  51. package/dist/js/{draggable-a6w0J1OD.d.mts → draggable-B5-70SZm.d.mts} +5 -4
  52. package/dist/js/event.color-picker-BEpq0Adu.mjs +485 -0
  53. package/dist/js/floatable/floatable.embedded.d.mts +1 -1
  54. package/dist/js/floatable/floatable.embedded.mjs +2 -2
  55. package/dist/js/floatable/floatable.standalone.d.mts +1 -1
  56. package/dist/js/{floatable.embedded-Bct4U5Dm.d.mts → floatable.embedded-DQYkXt8X.d.mts} +1 -1
  57. package/dist/js/focus-trap/focus-trap.embedded.d.mts +1 -1
  58. package/dist/js/focus-trap/focus-trap.embedded.mjs +3 -3
  59. package/dist/js/focus-trap/focus-trap.standalone.d.mts +1 -1
  60. package/dist/js/{focus-trap.embedded-DR8NpZfr.d.mts → focus-trap.embedded-CjyFQYow.d.mts} +2 -2
  61. package/dist/js/{index-DJdFlTLm.d.mts → index-C5D3-oiI.d.mts} +2 -2
  62. package/dist/js/index.d.mts +7 -7
  63. package/dist/js/index.mjs +5 -3
  64. package/dist/js/internal/attributable.d.mts +2 -3
  65. package/dist/js/internal/draggable.d.mts +1 -1
  66. package/dist/js/internal/draggable.mjs +5 -5
  67. package/dist/js/internal/listbox/listbox.constants.d.mts +7 -10
  68. package/dist/js/internal/listbox/listbox.constants.mjs +15 -16
  69. package/dist/js/internal/listbox/listbox.data.d.mts +9 -10
  70. package/dist/js/internal/listbox/listbox.data.mjs +1 -1
  71. package/dist/js/internal/listbox/listbox.dom.d.mts +19 -20
  72. package/dist/js/internal/listbox/listbox.dom.mjs +1 -1
  73. package/dist/js/internal/listbox/listbox.event.d.mts +3 -4
  74. package/dist/js/internal/listbox/listbox.event.mjs +4 -4
  75. package/dist/js/internal/listbox/listbox.form.d.mts +4 -5
  76. package/dist/js/internal/listbox/listbox.misc.d.mts +10 -11
  77. package/dist/js/internal/listbox/listbox.misc.mjs +1 -1
  78. package/dist/js/internal/listbox/listbox.model.d.mts +1 -1
  79. package/dist/js/internal/listbox/listbox.state.d.mts +5 -6
  80. package/dist/js/internal/listbox/listbox.state.mjs +1 -1
  81. package/dist/js/internal/misc.d.mts +4 -4
  82. package/dist/js/internal/misc.mjs +9 -1
  83. package/dist/js/internal/navigable.d.mts +9 -10
  84. package/dist/js/internal/navigable.mjs +3 -3
  85. package/dist/js/listbox/constants.listbox.d.mts +1 -1
  86. package/dist/js/listbox/event.listbox.d.mts +6 -7
  87. package/dist/js/listbox/event.listbox.mjs +1 -1
  88. package/dist/js/listbox/index.d.mts +5 -5
  89. package/dist/js/listbox/index.mjs +2 -2
  90. package/dist/js/listbox/misc.listbox.d.mts +1 -1
  91. package/dist/js/listbox/misc.listbox.mjs +1 -1
  92. package/dist/js/listbox/state.listbox.d.mts +7 -8
  93. package/dist/js/listbox/state.listbox.mjs +1 -1
  94. package/dist/js/{listbox.data-C7CRa5Ya.mjs → listbox.data-DQ7-x2uY.mjs} +5 -5
  95. package/dist/js/{listbox.model-CRReGOmu.d.mts → listbox.model-BHPA7GM4.d.mts} +3 -3
  96. package/dist/js/menu.mjs +2 -2
  97. package/dist/js/{misc.listbox-Cyz2CRDy.mjs → misc.listbox-DKB-j0UK.mjs} +4 -4
  98. package/dist/js/{misc.listbox-gnoJhrTr.d.mts → misc.listbox-mZMuYOxg.d.mts} +1 -1
  99. package/dist/js/movable/movable.embedded.d.mts +1 -1
  100. package/dist/js/movable/movable.embedded.mjs +2 -2
  101. package/dist/js/movable/movable.standalone.d.mts +1 -1
  102. package/dist/js/popover.d.mts +2 -2
  103. package/dist/js/popover.mjs +1 -1
  104. package/dist/js/resizable/resizable.embedded.d.mts +1 -1
  105. package/dist/js/resizable/resizable.embedded.mjs +5 -5
  106. package/dist/js/resizable/resizable.standalone.d.mts +1 -1
  107. package/dist/js/{resizable.embedded-3qoR0Bjm.d.mts → resizable.embedded-dvhdfQgt.d.mts} +1 -1
  108. package/dist/js/sortable/sortable.embedded.d.mts +1 -1
  109. package/dist/js/sortable/sortable.embedded.mjs +4 -4
  110. package/dist/js/sortable/sortable.standalone.d.mts +1 -1
  111. package/dist/js/splitter.d.mts +2 -3
  112. package/dist/js/splitter.mjs +7 -7
  113. package/dist/js/{state.combobox-Qm3FWzYW.mjs → state.combobox-BWDFHwoi.mjs} +11 -11
  114. package/dist/js/tabs.d.mts +4 -5
  115. package/dist/js/tooltip.d.mts +1 -1
  116. package/dist/js/tooltip.mjs +3 -3
  117. package/package.json +24 -24
  118. package/dist/js/color-picker.d.mts +0 -213
  119. package/dist/js/color-picker.mjs +0 -924
  120. package/dist/js/constants.combobox-DmRAMC64.d.mts +0 -26
  121. package/dist/js/constants.listbox-DRsXUxd3.d.mts +0 -14
  122. package/src/css/a11y.scss +0 -13
  123. package/src/css/badge.scss +0 -62
  124. package/src/css/button.scss +0 -50
  125. package/src/css/color-picker.scss +0 -344
  126. package/src/css/color.scss +0 -113
  127. package/src/css/combobox.scss +0 -255
  128. package/src/css/content.scss +0 -181
  129. package/src/css/flex.scss +0 -107
  130. package/src/css/floatable.scss +0 -155
  131. package/src/css/form.scss +0 -575
  132. package/src/css/listbox.scss +0 -121
  133. package/src/css/message.scss +0 -74
  134. package/src/css/mixins/badge.mixins.scss +0 -53
  135. package/src/css/mixins/button.mixins.scss +0 -112
  136. package/src/css/mixins/input.mixins.scss +0 -114
  137. package/src/css/mixins/message.mixins.scss +0 -41
  138. package/src/css/mixins/misc.mixins.scss +0 -48
  139. package/src/css/mixins/shadow.mixins.scss +0 -57
  140. package/src/css/reset.scss +0 -392
  141. package/src/css/splitter.scss +0 -89
  142. package/src/css/table.scss +0 -107
  143. package/src/css/tabs.scss +0 -74
  144. package/src/js/color-picker.ts +0 -1653
  145. package/src/js/combobox/constants.combobox.ts +0 -83
  146. package/src/js/combobox/dom.combobox.ts +0 -411
  147. package/src/js/combobox/event.combobox.ts +0 -365
  148. package/src/js/combobox/index.ts +0 -382
  149. package/src/js/combobox/misc.combobox.ts +0 -104
  150. package/src/js/combobox/models.combobox.ts +0 -54
  151. package/src/js/combobox/state.combobox.ts +0 -246
  152. package/src/js/dialog.ts +0 -255
  153. package/src/js/floatable/floatable.embedded.ts +0 -336
  154. package/src/js/floatable/floatable.standalone.ts +0 -6
  155. package/src/js/focus-trap/focus-trap.embedded.ts +0 -411
  156. package/src/js/focus-trap/focus-trap.standalone.ts +0 -1
  157. package/src/js/index.ts +0 -16
  158. package/src/js/internal/attributable.ts +0 -73
  159. package/src/js/internal/draggable.ts +0 -657
  160. package/src/js/internal/listbox/listbox.constants.ts +0 -25
  161. package/src/js/internal/listbox/listbox.data.ts +0 -287
  162. package/src/js/internal/listbox/listbox.dom.ts +0 -446
  163. package/src/js/internal/listbox/listbox.event.ts +0 -129
  164. package/src/js/internal/listbox/listbox.form.ts +0 -125
  165. package/src/js/internal/listbox/listbox.misc.ts +0 -135
  166. package/src/js/internal/listbox/listbox.model.ts +0 -169
  167. package/src/js/internal/listbox/listbox.state.ts +0 -82
  168. package/src/js/internal/misc.ts +0 -27
  169. package/src/js/internal/navigable.ts +0 -317
  170. package/src/js/l10n.ts +0 -192
  171. package/src/js/listbox/constants.listbox.ts +0 -61
  172. package/src/js/listbox/event.listbox.ts +0 -106
  173. package/src/js/listbox/index.ts +0 -364
  174. package/src/js/listbox/misc.listbox.ts +0 -70
  175. package/src/js/listbox/state.listbox.ts +0 -194
  176. package/src/js/menu.ts +0 -348
  177. package/src/js/movable/movable.embedded.ts +0 -318
  178. package/src/js/movable/movable.standalone.ts +0 -2
  179. package/src/js/popover.ts +0 -229
  180. package/src/js/resizable/resizable.embedded.ts +0 -413
  181. package/src/js/resizable/resizable.standalone.ts +0 -5
  182. package/src/js/sortable/sortable.embedded.ts +0 -527
  183. package/src/js/sortable/sortable.standalone.ts +0 -2
  184. package/src/js/splitter.ts +0 -583
  185. package/src/js/tabs.ts +0 -441
  186. package/src/js/toolbar.ts +0 -63
  187. package/src/js/tooltip.ts +0 -367
@@ -1,583 +0,0 @@
1
- import {isNullableOrWhitespace} from '@oscarpalmer/atoms/is';
2
- import {round} from '@oscarpalmer/atoms/math';
3
- import {clamp} from '@oscarpalmer/atoms/number';
4
- import {setAria} from '@oscarpalmer/toretto/aria';
5
- import {getAttribute, setAttribute} from '@oscarpalmer/toretto/attribute';
6
- import {createElement} from '@oscarpalmer/toretto/create';
7
- import {getEventPosition, on} from '@oscarpalmer/toretto/event';
8
- import {findAncestor} from '@oscarpalmer/toretto/find';
9
- import {setStyle, toggleStyles} from '@oscarpalmer/toretto/style';
10
- import supportsTouch from '@oscarpalmer/toretto/touch';
11
-
12
- // #region Special variables
13
-
14
- const ATTRIBUTE_MAX = 'max';
15
-
16
- const ATTRIBUTE_MIN = 'min';
17
-
18
- const ATTRIBUTE_SIZE = 'size';
19
-
20
- const ATTRIBUTE_TYPE = 'type';
21
-
22
- // #endregion
23
-
24
- // #region Types
25
-
26
- declare global {
27
- interface HTMLElementTagNameMap {
28
- [TAGNAME]: OuiSplitterElement;
29
- }
30
- }
31
-
32
- class OuiSplitter {
33
- element: OuiSplitterElement;
34
-
35
- handle: HTMLSpanElement;
36
-
37
- panels: HTMLElement[];
38
-
39
- rectangle: DOMRect;
40
-
41
- separator: HTMLDivElement;
42
-
43
- types!: OuiSplitterTypes;
44
-
45
- values: OuiSplitterValues;
46
-
47
- constructor(element: OuiSplitterElement, panels: HTMLElement[]) {
48
- this.element = element;
49
- this.panels = panels;
50
-
51
- if (isNullableOrWhitespace(element.id)) {
52
- element.id = `oui_splitter_${++index}`;
53
- }
54
-
55
- this.values = getValues(element);
56
-
57
- this.handle = createHandle();
58
- this.rectangle = element.getBoundingClientRect();
59
- this.separator = createSeparator(this);
60
-
61
- this.separator.append(this.handle);
62
-
63
- panels[0].insertAdjacentElement('afterend', this.separator);
64
-
65
- this.updateOrientation();
66
- this.updateValues();
67
- }
68
-
69
- updateConnections(add: 0 | 1): void {
70
- const method = METHODS_CONNECT[add];
71
-
72
- MAPPED_ELEMENTS[method](this.element, this);
73
- MAPPED_ELEMENTS[method](this.handle, this);
74
- MAPPED_ELEMENTS[method](this.separator, this);
75
-
76
- if (this.types.auto) {
77
- RESIZE_OBSERVER[METHODS_OBSERVE[add]](this.element);
78
- }
79
- }
80
-
81
- updateOrientation(): void {
82
- this.types = getTypes(this);
83
-
84
- if (this.types.auto) {
85
- RESIZE_OBSERVER.observe(this.element);
86
- } else {
87
- RESIZE_OBSERVER.unobserve(this.element);
88
- }
89
-
90
- setAttribute(this.element, ATTRIBUTE_HORIZONTAL, this.types.horizontal ? '' : undefined);
91
-
92
- setAriaOrientation(this);
93
- }
94
-
95
- updateValues(): void {
96
- this.values = getValues(this.element);
97
-
98
- requestAnimationFrame(() => {
99
- setSize(this, this.values.now.current);
100
- setAriaValue(this);
101
- });
102
- }
103
- }
104
-
105
- export class OuiSplitterElement extends HTMLElement {
106
- static readonly observedAttributes = [
107
- ATTRIBUTE_MAX,
108
- ATTRIBUTE_MIN,
109
- ATTRIBUTE_SIZE,
110
- ATTRIBUTE_TYPE,
111
- ];
112
-
113
- readonly #splitter: OuiSplitter;
114
-
115
- // Getters and setters
116
-
117
- /**
118
- * Maximum size for the first panel
119
- */
120
- get max(): number {
121
- return this.#splitter.values.max;
122
- }
123
-
124
- /**
125
- * Maximum size for the first panel
126
- */
127
- set max(value: number) {
128
- if (typeof value === 'number') {
129
- setAttribute(this, ATTRIBUTE_MAX, value.toString());
130
- }
131
- }
132
-
133
- /**
134
- * Minimum size for the first panel
135
- */
136
- get min(): number {
137
- return this.#splitter.values.min;
138
- }
139
-
140
- /**
141
- * Minimum size for the first panel
142
- */
143
- set min(value: number) {
144
- if (typeof value === 'number') {
145
- setAttribute(this, ATTRIBUTE_MIN, value.toString());
146
- }
147
- }
148
-
149
- /**
150
- * Current size for the first panel
151
- */
152
- get size(): number {
153
- return this.#splitter.values.now.current;
154
- }
155
-
156
- /**
157
- * Current size for the first panel
158
- */
159
- set size(value: number) {
160
- if (typeof value === 'number') {
161
- setAttribute(this, ATTRIBUTE_SIZE, value.toString());
162
- }
163
- }
164
-
165
- /**
166
- * Orientation of the splitter
167
- */
168
- get type(): string {
169
- return getAttribute(this, ATTRIBUTE_TYPE) ?? 'vertical';
170
- }
171
-
172
- /**
173
- * Orientation of the splitter
174
- */
175
- set type(value: string) {
176
- setAttribute(this, ATTRIBUTE_TYPE, value);
177
- }
178
-
179
- // Constructor
180
-
181
- constructor() {
182
- super();
183
-
184
- const panels = [...this.children].filter(child => child instanceof Element) as HTMLElement[];
185
-
186
- if (panels.length !== 2) {
187
- throw new Error(MESSAGE);
188
- }
189
-
190
- this.#splitter = new OuiSplitter(this, panels);
191
- }
192
-
193
- // Methods
194
-
195
- connectedCallback(): void {
196
- this.#splitter.updateConnections(1);
197
- }
198
-
199
- disconnectedCallback(): void {
200
- this.#splitter.updateConnections(0);
201
- }
202
-
203
- attributeChangedCallback(name: string): void {
204
- switch (name) {
205
- case ATTRIBUTE_MAX:
206
- case ATTRIBUTE_MIN:
207
- case ATTRIBUTE_SIZE:
208
- this.#splitter.updateValues();
209
- break;
210
-
211
- case ATTRIBUTE_TYPE:
212
- this.#splitter.updateOrientation();
213
- break;
214
-
215
- default:
216
- break;
217
- }
218
- }
219
- }
220
-
221
- type OuiSplitterTypes = {
222
- auto: boolean;
223
- horizontal: boolean;
224
- };
225
-
226
- type OuiSplitterValues = {
227
- max: number;
228
- min: number;
229
- now: OuiSplitterValuesNow;
230
- };
231
-
232
- type OuiSplitterValuesNow = {
233
- current: number;
234
- previous: number;
235
- };
236
-
237
- // #endregion
238
-
239
- // #region Functions
240
-
241
- function createHandle(): HTMLSpanElement {
242
- return createElement('span', {
243
- aria: {
244
- hidden: true,
245
- },
246
- attribute: {
247
- [ATTRIBUTE_HANDLE]: '',
248
- },
249
- });
250
- }
251
-
252
- function createSeparator(splitter: OuiSplitter): HTMLDivElement {
253
- return createElement('div', {
254
- aria: {
255
- controls: splitter.element.id,
256
- label: 'Resize panels',
257
- },
258
- attribute: {
259
- [ATTRIBUTE_SEPARATOR]: '',
260
- },
261
- property: {
262
- role: 'separator',
263
- tabIndex: 0,
264
- },
265
- });
266
- }
267
-
268
- function getContained(min: number, value: number, max: number): number {
269
- return round(clamp(value, min, max), VALUE_DECIMALS);
270
- }
271
-
272
- function getSize(splitter: OuiSplitter, value: number): number {
273
- const {height, left, top, width} = splitter.rectangle;
274
-
275
- const offset = value - (splitter.types.horizontal ? top : left);
276
-
277
- const fraction = offset / (splitter.types.horizontal ? height : width);
278
-
279
- return getContained(splitter.values.min, fraction, splitter.values.max);
280
- }
281
-
282
- function getTypes(splitter: OuiSplitter, width?: number, height?: number): OuiSplitterTypes {
283
- const type = getAttribute(splitter.element, 'type');
284
-
285
- if (type === 'horizontal') {
286
- return {
287
- auto: false,
288
- horizontal: true,
289
- };
290
- }
291
-
292
- if (type === 'auto') {
293
- return {
294
- auto: true,
295
- horizontal: (height ?? splitter.rectangle.height) > (width ?? splitter.rectangle.width),
296
- };
297
- }
298
-
299
- return {
300
- auto: false,
301
- horizontal: false,
302
- };
303
- }
304
-
305
- function getValue(element: HTMLElement, name: string, defaultValue: number): number {
306
- const value = getAttribute(element, name);
307
-
308
- if (isNullableOrWhitespace(value)) {
309
- return defaultValue;
310
- }
311
-
312
- const parsed = Number.parseFloat(value);
313
-
314
- if (Number.isNaN(parsed)) {
315
- return defaultValue;
316
- }
317
-
318
- if (parsed < 0) {
319
- return defaultValue;
320
- }
321
-
322
- return parsed > 1 ? parsed / NAVIGATION_MAXIMUM_TOTAL : parsed;
323
- }
324
-
325
- function getValues(element: OuiSplitterElement): OuiSplitterValues {
326
- const values: OuiSplitterValues = {
327
- max: getValue(element, ATTRIBUTE_MAX, NAVIGATION_MAXIMUM_PERCENTAGE),
328
- min: getValue(element, ATTRIBUTE_MIN, NAVIGATION_MINIMUM_PERCENTAGE),
329
- now: {
330
- current: 0.5,
331
- previous: 0.5,
332
- },
333
- };
334
-
335
- const value = getContained(
336
- values.min,
337
- getValue(element, ATTRIBUTE_SIZE, values.now.current),
338
- values.max,
339
- );
340
-
341
- values.now.current = value;
342
- values.now.previous = value;
343
-
344
- return values;
345
- }
346
-
347
- function onEnd(reset: boolean): void {
348
- if (splitter == null) {
349
- return;
350
- }
351
-
352
- splitter.handle.removeAttribute(ATTRIBUTE_ACTIVE);
353
- splitter.separator.removeAttribute(ATTRIBUTE_ACTIVE);
354
-
355
- if (reset) {
356
- setSize(splitter, splitter.values.now.previous);
357
- } else {
358
- splitter.values.now.previous = splitter.values.now.current;
359
- }
360
-
361
- splitter = undefined;
362
-
363
- STYLING_TOGGLER.remove();
364
- }
365
-
366
- function onKeydown(event: KeyboardEvent): void {
367
- switch (true) {
368
- case KEYS_ALL.has(event.key):
369
- onNavigate(event);
370
- break;
371
-
372
- case event.key === 'Escape':
373
- onEnd(true);
374
- break;
375
-
376
- default:
377
- break;
378
- }
379
- }
380
-
381
- function onNavigate(event: KeyboardEvent): void {
382
- const splitter = MAPPED_ELEMENTS.get(
383
- findAncestor(event, '[oui-splitter-separator]') as HTMLSpanElement,
384
- );
385
-
386
- if (splitter == null) {
387
- return;
388
- }
389
-
390
- const {types, values} = splitter;
391
-
392
- if (KEYS_ABSOLUTE.has(event.key)) {
393
- setSize(splitter, event.key === 'End' ? values.max : values.min, true);
394
-
395
- return;
396
- }
397
-
398
- if (
399
- (types.horizontal && !KEYS_HORIZONTAL.has(event.key)) ||
400
- !(types.horizontal || KEYS_VERTICAL.has(event.key))
401
- ) {
402
- return;
403
- }
404
-
405
- const offset = KEYS_NEGATIVE.has(event.key) ? -1 : 1;
406
-
407
- setSize(
408
- splitter,
409
- getContained(values.min, values.now.current + offset * NAVIGATION_MODIFIER, values.max),
410
- true,
411
- );
412
- }
413
-
414
- function onObservation(entries: ResizeObserverEntry[]): void {
415
- if (frame != null) {
416
- cancelAnimationFrame(frame);
417
- }
418
-
419
- frame = requestAnimationFrame(() => {
420
- for (const entry of entries) {
421
- const splitter = MAPPED_ELEMENTS.get(entry.target as HTMLElement);
422
-
423
- if (splitter == null) {
424
- return;
425
- }
426
-
427
- splitter.types = getTypes(splitter, entry.contentRect.width, entry.contentRect.height);
428
-
429
- setAttribute(
430
- splitter.element,
431
- ATTRIBUTE_HORIZONTAL,
432
- splitter.types.horizontal ? '' : undefined,
433
- );
434
-
435
- setAriaOrientation(splitter);
436
- }
437
-
438
- frame = undefined;
439
- });
440
- }
441
-
442
- function onPointerdown(event: Event): void {
443
- if (supportsTouch.value ? event.type === 'mousedown' : event.type === 'touchstart') {
444
- return;
445
- }
446
-
447
- splitter = MAPPED_ELEMENTS.get(findAncestor(event, SELECTOR_HANDLE) as HTMLSpanElement);
448
-
449
- if (splitter == null) {
450
- return;
451
- }
452
-
453
- if (supportsTouch.value) {
454
- event.preventDefault();
455
- }
456
-
457
- setAttribute(splitter.handle, ATTRIBUTE_ACTIVE, '');
458
- setAttribute(splitter.separator, ATTRIBUTE_ACTIVE, '');
459
-
460
- splitter.rectangle = splitter.element.getBoundingClientRect();
461
-
462
- STYLING_TOGGLER.set();
463
- }
464
-
465
- function onPointermove(event: MouseEvent): void {
466
- if (splitter == null) {
467
- return;
468
- }
469
-
470
- const position = getEventPosition(event);
471
-
472
- if (position != null) {
473
- splitter.values.now.current = getSize(
474
- splitter,
475
- splitter.types.horizontal ? position.y : position.x,
476
- );
477
-
478
- setSize(splitter, splitter.values.now.current);
479
- }
480
- }
481
-
482
- function onPointerup(): void {
483
- if (splitter != null) {
484
- onEnd(false);
485
- }
486
- }
487
-
488
- function setAriaOrientation(splitter: OuiSplitter): void {
489
- setAria(splitter.separator, 'orientation', splitter.types.horizontal ? 'horizontal' : 'vertical');
490
- }
491
-
492
- function setAriaValue(splitter: OuiSplitter): void {
493
- setAria(splitter.separator, {
494
- valuemax: splitter.values.max,
495
- valuemin: splitter.values.min,
496
- valuenow: splitter.values.now.current,
497
- });
498
- }
499
-
500
- function setSize(splitter: OuiSplitter, size: number, previous?: boolean): void {
501
- splitter.values.now.current = size;
502
-
503
- if (previous) {
504
- splitter.values.now.previous = size;
505
- }
506
-
507
- setStyle(splitter.element, '--oui-splitter-size', `${size}`);
508
-
509
- setAriaValue(splitter);
510
- }
511
-
512
- // #endregion
513
-
514
- // #region Variables
515
-
516
- const TAGNAME = 'oui-splitter';
517
-
518
- const ATTRIBUTE_ACTIVE = `${TAGNAME}-active`;
519
-
520
- const ATTRIBUTE_HANDLE = `${TAGNAME}-handle`;
521
-
522
- const ATTRIBUTE_HORIZONTAL = `${TAGNAME}-horizontal`;
523
-
524
- const ATTRIBUTE_SEPARATOR = `${TAGNAME}-separator`;
525
-
526
- const KEYS_ABSOLUTE = new Set(['End', 'Home']);
527
-
528
- const KEYS_HORIZONTAL = new Set(['ArrowDown', 'ArrowUp']);
529
-
530
- const KEYS_NEGATIVE = new Set(['ArrowLeft', 'ArrowUp']);
531
-
532
- const KEYS_VERTICAL = new Set(['ArrowLeft', 'ArrowRight']);
533
-
534
- const KEYS_ALL = new Set([...KEYS_ABSOLUTE, ...KEYS_HORIZONTAL, ...KEYS_VERTICAL]);
535
-
536
- const MAPPED_ELEMENTS = new WeakMap<HTMLElement, OuiSplitter>();
537
-
538
- const MESSAGE = `<${TAGNAME}> must have exactly two panels.`;
539
-
540
- const METHODS_CONNECT = ['delete', 'set'] as const;
541
-
542
- const METHODS_OBSERVE = ['unobserve', 'observe'] as const;
543
-
544
- const NAVIGATION_MAXIMUM_PERCENTAGE = 0.9;
545
-
546
- const NAVIGATION_MAXIMUM_TOTAL = 100;
547
-
548
- const NAVIGATION_MINIMUM_PERCENTAGE = 0.1;
549
-
550
- const NAVIGATION_MODIFIER = 0.05;
551
-
552
- const RESIZE_OBSERVER: ResizeObserver = new ResizeObserver(onObservation);
553
-
554
- const SELECTOR_HANDLE = `[${ATTRIBUTE_HANDLE}]`;
555
-
556
- const STYLING_TOGGLER = toggleStyles(document.body, {
557
- touchAction: 'none',
558
- userSelect: 'none',
559
- webkitUserSelect: 'none',
560
- });
561
-
562
- const VALUE_DECIMALS = 6;
563
-
564
- let index = 0;
565
-
566
- let frame: DOMHighResTimeStamp | undefined;
567
-
568
- let splitter: OuiSplitter | undefined;
569
-
570
- // #endregion
571
-
572
- // #region Initialization
573
-
574
- on(document, 'keydown', onKeydown);
575
- on(document, 'mousedown', onPointerdown);
576
- on(document, 'pointermove', onPointermove);
577
- on(document, 'pointerup', onPointerup);
578
- on(document, 'touchcancel', onPointerup);
579
- on(document, 'touchstart', onPointerdown, {passive: false});
580
-
581
- customElements.define(TAGNAME, OuiSplitterElement);
582
-
583
- // #endregion