@oscarpalmer/oui 0.37.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 (183) hide show
  1. package/dist/css/a11y.css +1 -0
  2. package/dist/css/badge.css +12 -8
  3. package/dist/css/button.css +111 -14
  4. package/dist/css/color-picker.css +859 -0
  5. package/dist/css/color.css +86 -87
  6. package/dist/css/combobox.css +105 -4
  7. package/dist/css/content.css +8 -6
  8. package/dist/css/floatable.css +3 -3
  9. package/dist/css/form.css +106 -6
  10. package/dist/css/icon.css +99 -0
  11. package/dist/css/listbox.css +5 -0
  12. package/dist/css/message.css +6 -3
  13. package/dist/css/mixins/badge.mixins.css +2 -0
  14. package/dist/css/mixins/button.mixins.css +3 -0
  15. package/dist/css/mixins/message.mixins.css +1 -0
  16. package/dist/css/mixins/misc.mixins.css +2 -0
  17. package/dist/css/mixins/shadow.mixins.css +1 -0
  18. package/dist/css/reset.css +3 -3
  19. package/dist/css/splitter.css +1 -1
  20. package/dist/css/tabs.css +115 -23
  21. package/dist/css/typography.css +90 -0
  22. package/dist/js/color-picker/constants.color-picker.d.mts +2 -0
  23. package/dist/js/color-picker/constants.color-picker.mjs +59 -0
  24. package/dist/js/color-picker/dom.color-picker.d.mts +8 -0
  25. package/dist/js/color-picker/dom.color-picker.mjs +191 -0
  26. package/dist/js/color-picker/event.color-picker.d.mts +9 -0
  27. package/dist/js/color-picker/event.color-picker.mjs +2 -0
  28. package/dist/js/color-picker/form.color-picker.d.mts +5 -0
  29. package/dist/js/color-picker/form.color-picker.mjs +24 -0
  30. package/dist/js/color-picker/index.d.mts +2 -0
  31. package/dist/js/color-picker/index.mjs +303 -0
  32. package/dist/js/color-picker/misc.color-picker.d.mts +2 -0
  33. package/dist/js/color-picker/misc.color-picker.mjs +2 -0
  34. package/dist/js/color-picker/models.color-picker.d.mts +2 -0
  35. package/dist/js/color-picker/models.color-picker.mjs +24 -0
  36. package/dist/js/color-picker/output.color-picker.d.mts +8 -0
  37. package/dist/js/color-picker/output.color-picker.mjs +233 -0
  38. package/dist/js/color-picker/state.color-picker.d.mts +8 -0
  39. package/dist/js/color-picker/state.color-picker.mjs +2 -0
  40. package/dist/js/combobox/constants.combobox.d.mts +1 -1
  41. package/dist/js/combobox/dom.combobox.d.mts +12 -13
  42. package/dist/js/combobox/dom.combobox.mjs +12 -5
  43. package/dist/js/combobox/event.combobox.d.mts +20 -21
  44. package/dist/js/combobox/event.combobox.mjs +1 -1
  45. package/dist/js/combobox/index.d.mts +1 -1
  46. package/dist/js/combobox/index.mjs +56 -2
  47. package/dist/js/combobox/misc.combobox.d.mts +1 -1
  48. package/dist/js/combobox/misc.combobox.mjs +1 -1
  49. package/dist/js/combobox/models.combobox.d.mts +12 -13
  50. package/dist/js/combobox/state.combobox.d.mts +8 -9
  51. package/dist/js/combobox/state.combobox.mjs +1 -1
  52. package/dist/js/constants.color-picker-B-gFjL8m.d.mts +364 -0
  53. package/dist/js/constants.combobox-8EMRmv09.d.mts +18 -0
  54. package/dist/js/constants.listbox-DGnX32kv.d.mts +8 -0
  55. package/dist/js/dialog.d.mts +2 -2
  56. package/dist/js/dialog.mjs +1 -1
  57. package/dist/js/{draggable-a6w0J1OD.d.mts → draggable-B5-70SZm.d.mts} +5 -4
  58. package/dist/js/event.color-picker-BEpq0Adu.mjs +485 -0
  59. package/dist/js/floatable/floatable.embedded.d.mts +1 -1
  60. package/dist/js/floatable/floatable.embedded.mjs +11 -8
  61. package/dist/js/floatable/floatable.standalone.d.mts +1 -1
  62. package/dist/js/{floatable.embedded-Bct4U5Dm.d.mts → floatable.embedded-DQYkXt8X.d.mts} +1 -1
  63. package/dist/js/focus-trap/focus-trap.embedded.d.mts +1 -1
  64. package/dist/js/focus-trap/focus-trap.standalone.d.mts +1 -1
  65. package/dist/js/{focus-trap.embedded-DR8NpZfr.d.mts → focus-trap.embedded-CjyFQYow.d.mts} +2 -2
  66. package/dist/js/{index-EfkUSals.d.mts → index-C5D3-oiI.d.mts} +41 -3
  67. package/dist/js/index.d.mts +8 -7
  68. package/dist/js/index.mjs +6 -3
  69. package/dist/js/internal/attributable.d.mts +2 -3
  70. package/dist/js/internal/draggable.d.mts +1 -1
  71. package/dist/js/internal/draggable.mjs +1 -1
  72. package/dist/js/internal/listbox/listbox.constants.d.mts +7 -10
  73. package/dist/js/internal/listbox/listbox.constants.mjs +15 -16
  74. package/dist/js/internal/listbox/listbox.data.d.mts +9 -10
  75. package/dist/js/internal/listbox/listbox.data.mjs +1 -1
  76. package/dist/js/internal/listbox/listbox.dom.d.mts +19 -20
  77. package/dist/js/internal/listbox/listbox.dom.mjs +1 -1
  78. package/dist/js/internal/listbox/listbox.event.d.mts +3 -4
  79. package/dist/js/internal/listbox/listbox.event.mjs +4 -4
  80. package/dist/js/internal/listbox/listbox.form.d.mts +4 -5
  81. package/dist/js/internal/listbox/listbox.form.mjs +16 -15
  82. package/dist/js/internal/listbox/listbox.misc.d.mts +10 -11
  83. package/dist/js/internal/listbox/listbox.misc.mjs +1 -1
  84. package/dist/js/internal/listbox/listbox.model.d.mts +1 -1
  85. package/dist/js/internal/listbox/listbox.state.d.mts +5 -6
  86. package/dist/js/internal/listbox/listbox.state.mjs +3 -3
  87. package/dist/js/internal/misc.d.mts +4 -4
  88. package/dist/js/internal/misc.mjs +9 -1
  89. package/dist/js/internal/navigable.d.mts +9 -10
  90. package/dist/js/internal/navigable.mjs +1 -0
  91. package/dist/js/listbox/constants.listbox.d.mts +1 -1
  92. package/dist/js/listbox/event.listbox.d.mts +6 -7
  93. package/dist/js/listbox/event.listbox.mjs +1 -1
  94. package/dist/js/listbox/index.d.mts +43 -5
  95. package/dist/js/listbox/index.mjs +56 -2
  96. package/dist/js/listbox/misc.listbox.d.mts +1 -1
  97. package/dist/js/listbox/misc.listbox.mjs +1 -1
  98. package/dist/js/listbox/state.listbox.d.mts +7 -8
  99. package/dist/js/listbox/state.listbox.mjs +1 -1
  100. package/dist/js/{listbox.data-BWd0PCy7.mjs → listbox.data-DQ7-x2uY.mjs} +8 -7
  101. package/dist/js/{listbox.model-CRReGOmu.d.mts → listbox.model-BHPA7GM4.d.mts} +3 -3
  102. package/dist/js/menu.mjs +1 -1
  103. package/dist/js/{misc.listbox-BI-XsTOf.mjs → misc.listbox-DKB-j0UK.mjs} +4 -5
  104. package/dist/js/{misc.listbox-gnoJhrTr.d.mts → misc.listbox-mZMuYOxg.d.mts} +1 -1
  105. package/dist/js/movable/movable.embedded.d.mts +1 -1
  106. package/dist/js/movable/movable.standalone.d.mts +1 -1
  107. package/dist/js/popover.d.mts +2 -2
  108. package/dist/js/popover.mjs +1 -1
  109. package/dist/js/resizable/resizable.embedded.d.mts +1 -1
  110. package/dist/js/resizable/resizable.embedded.mjs +1 -1
  111. package/dist/js/resizable/resizable.standalone.d.mts +1 -1
  112. package/dist/js/{resizable.embedded-3qoR0Bjm.d.mts → resizable.embedded-dvhdfQgt.d.mts} +1 -1
  113. package/dist/js/sortable/sortable.embedded.d.mts +1 -1
  114. package/dist/js/sortable/sortable.standalone.d.mts +1 -1
  115. package/dist/js/splitter.d.mts +2 -3
  116. package/dist/js/splitter.mjs +2 -2
  117. package/dist/js/{state.combobox-4xq0FPCF.mjs → state.combobox-BWDFHwoi.mjs} +9 -9
  118. package/dist/js/tabs.d.mts +4 -5
  119. package/dist/js/tabs.mjs +4 -7
  120. package/dist/js/tooltip.d.mts +1 -1
  121. package/package.json +24 -22
  122. package/dist/js/constants.combobox-DmRAMC64.d.mts +0 -26
  123. package/dist/js/constants.listbox-DRsXUxd3.d.mts +0 -14
  124. package/src/css/a11y.scss +0 -13
  125. package/src/css/badge.scss +0 -62
  126. package/src/css/button.scss +0 -50
  127. package/src/css/color.scss +0 -115
  128. package/src/css/combobox.scss +0 -252
  129. package/src/css/content.scss +0 -180
  130. package/src/css/flex.scss +0 -107
  131. package/src/css/floatable.scss +0 -152
  132. package/src/css/form.scss +0 -573
  133. package/src/css/listbox.scss +0 -120
  134. package/src/css/message.scss +0 -73
  135. package/src/css/mixins.scss +0 -419
  136. package/src/css/reset.scss +0 -392
  137. package/src/css/splitter.scss +0 -89
  138. package/src/css/table.scss +0 -107
  139. package/src/css/tabs.scss +0 -85
  140. package/src/js/combobox/constants.combobox.ts +0 -83
  141. package/src/js/combobox/dom.combobox.ts +0 -407
  142. package/src/js/combobox/event.combobox.ts +0 -365
  143. package/src/js/combobox/index.ts +0 -320
  144. package/src/js/combobox/misc.combobox.ts +0 -104
  145. package/src/js/combobox/models.combobox.ts +0 -54
  146. package/src/js/combobox/state.combobox.ts +0 -246
  147. package/src/js/dialog.ts +0 -255
  148. package/src/js/floatable/floatable.embedded.ts +0 -332
  149. package/src/js/floatable/floatable.standalone.ts +0 -6
  150. package/src/js/focus-trap/focus-trap.embedded.ts +0 -411
  151. package/src/js/focus-trap/focus-trap.standalone.ts +0 -1
  152. package/src/js/index.ts +0 -15
  153. package/src/js/internal/attributable.ts +0 -73
  154. package/src/js/internal/draggable.ts +0 -657
  155. package/src/js/internal/listbox/listbox.constants.ts +0 -25
  156. package/src/js/internal/listbox/listbox.data.ts +0 -287
  157. package/src/js/internal/listbox/listbox.dom.ts +0 -445
  158. package/src/js/internal/listbox/listbox.event.ts +0 -129
  159. package/src/js/internal/listbox/listbox.form.ts +0 -115
  160. package/src/js/internal/listbox/listbox.misc.ts +0 -135
  161. package/src/js/internal/listbox/listbox.model.ts +0 -169
  162. package/src/js/internal/listbox/listbox.state.ts +0 -82
  163. package/src/js/internal/misc.ts +0 -27
  164. package/src/js/internal/navigable.ts +0 -315
  165. package/src/js/l10n.ts +0 -192
  166. package/src/js/listbox/constants.listbox.ts +0 -61
  167. package/src/js/listbox/event.listbox.ts +0 -106
  168. package/src/js/listbox/index.ts +0 -302
  169. package/src/js/listbox/misc.listbox.ts +0 -70
  170. package/src/js/listbox/state.listbox.ts +0 -196
  171. package/src/js/menu.ts +0 -348
  172. package/src/js/movable/movable.embedded.ts +0 -318
  173. package/src/js/movable/movable.standalone.ts +0 -2
  174. package/src/js/popover.ts +0 -229
  175. package/src/js/resizable/resizable.embedded.ts +0 -413
  176. package/src/js/resizable/resizable.standalone.ts +0 -5
  177. package/src/js/sortable/sortable.embedded.ts +0 -527
  178. package/src/js/sortable/sortable.standalone.ts +0 -2
  179. package/src/js/splitter.ts +0 -583
  180. package/src/js/tabs.ts +0 -447
  181. package/src/js/toolbar.ts +0 -63
  182. package/src/js/tooltip.ts +0 -367
  183. /package/dist/css/{mixins.css → mixins/input.mixins.css} +0 -0
@@ -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