@oscarpalmer/oui 0.39.0 → 0.40.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 (182) hide show
  1. package/README.md +1 -1
  2. package/dist/js/color-picker/color-picker.constants.d.mts +2 -0
  3. package/dist/js/color-picker/{constants.color-picker.mjs → color-picker.constants.mjs} +5 -4
  4. package/dist/js/color-picker/{dom.color-picker.d.mts → color-picker.dom.d.mts} +2 -2
  5. package/dist/js/color-picker/{dom.color-picker.mjs → color-picker.dom.mjs} +3 -3
  6. package/dist/js/color-picker/{event.color-picker.d.mts → color-picker.event.d.mts} +2 -2
  7. package/dist/js/color-picker/{event.color-picker.mjs → color-picker.event.mjs} +1 -1
  8. package/dist/js/color-picker/{form.color-picker.d.mts → color-picker.form.d.mts} +2 -2
  9. package/dist/js/color-picker/{form.color-picker.mjs → color-picker.form.mjs} +9 -6
  10. package/dist/js/color-picker/color-picker.misc.d.mts +2 -0
  11. package/dist/js/color-picker/{misc.color-picker.mjs → color-picker.misc.mjs} +1 -1
  12. package/dist/js/color-picker/color-picker.model.d.mts +2 -0
  13. package/dist/js/color-picker/{models.color-picker.mjs → color-picker.model.mjs} +1 -1
  14. package/dist/js/color-picker/{output.color-picker.d.mts → color-picker.output.d.mts} +2 -2
  15. package/dist/js/color-picker/{output.color-picker.mjs → color-picker.output.mjs} +13 -11
  16. package/dist/js/color-picker/color-picker.state.d.mts +8 -0
  17. package/dist/js/color-picker/color-picker.state.mjs +2 -0
  18. package/dist/js/color-picker/index.d.mts +180 -2
  19. package/dist/js/color-picker/index.mjs +59 -57
  20. package/dist/js/color-picker.constants-D1mxw_Le.d.mts +179 -0
  21. package/dist/js/{event.color-picker-BEpq0Adu.mjs → color-picker.event-Cksj5TvS.mjs} +105 -90
  22. package/dist/js/color-picker.misc-CtsXGrOe.d.mts +27 -0
  23. package/dist/js/combobox/combobox.constants.d.mts +2 -0
  24. package/dist/js/combobox/{constants.combobox.mjs → combobox.constants.mjs} +21 -21
  25. package/dist/js/combobox/{dom.combobox.d.mts → combobox.dom.d.mts} +3 -3
  26. package/dist/js/combobox/{dom.combobox.mjs → combobox.dom.mjs} +40 -36
  27. package/dist/js/combobox/{event.combobox.d.mts → combobox.event.d.mts} +3 -3
  28. package/dist/js/combobox/{event.combobox.mjs → combobox.event.mjs} +1 -1
  29. package/dist/js/combobox/combobox.misc.d.mts +2 -0
  30. package/dist/js/combobox/{misc.combobox.mjs → combobox.misc.mjs} +1 -1
  31. package/dist/js/combobox/combobox.model.d.mts +2 -0
  32. package/dist/js/combobox/combobox.state.d.mts +10 -0
  33. package/dist/js/combobox/combobox.state.mjs +2 -0
  34. package/dist/js/combobox/index.d.mts +163 -2
  35. package/dist/js/combobox/index.mjs +53 -52
  36. package/dist/js/combobox.constants-DZVkMP5g.d.mts +19 -0
  37. package/dist/js/combobox.misc-C1tPZZDi.d.mts +22 -0
  38. package/dist/js/combobox.model-oDV06XCN.d.mts +44 -0
  39. package/dist/js/{state.combobox-BWDFHwoi.mjs → combobox.state-BfJ3Hxg8.mjs} +94 -80
  40. package/dist/js/constants.listbox-C5Ap6Ag_.d.mts +9 -0
  41. package/dist/js/dialog/dialog.model.d.mts +2 -0
  42. package/dist/js/dialog/dialog.model.mjs +11 -0
  43. package/dist/js/dialog/index.d.mts +12 -0
  44. package/dist/js/dialog/index.mjs +123 -0
  45. package/dist/js/dialog.model-DX2mndMh.d.mts +45 -0
  46. package/dist/js/floatable/floatable.embedded.d.mts +2 -2
  47. package/dist/js/floatable/floatable.embedded.mjs +64 -92
  48. package/dist/js/floatable/floatable.model.d.mts +2 -0
  49. package/dist/js/floatable/floatable.model.mjs +23 -0
  50. package/dist/js/floatable/floatable.standalone.d.mts +2 -1
  51. package/dist/js/floatable.embedded-MeTyXjFn.d.mts +17 -0
  52. package/dist/js/{floatable.embedded-DQYkXt8X.d.mts → floatable.model-DXsQgoU7.d.mts} +13 -20
  53. package/dist/js/focus-trap/focus-trap.embedded.d.mts +2 -2
  54. package/dist/js/focus-trap/focus-trap.embedded.mjs +113 -135
  55. package/dist/js/focus-trap/focus-trap.model.d.mts +2 -0
  56. package/dist/js/focus-trap/focus-trap.model.mjs +15 -0
  57. package/dist/js/focus-trap/focus-trap.standalone.d.mts +2 -1
  58. package/dist/js/focus-trap.embedded-DIU05m1z.d.mts +13 -0
  59. package/dist/js/{focus-trap.embedded-CjyFQYow.d.mts → focus-trap.model-BeX6UYlw.d.mts} +16 -18
  60. package/dist/js/index.d.mts +26 -14
  61. package/dist/js/index.mjs +18 -17
  62. package/dist/js/internal/attributable.mjs +3 -2
  63. package/dist/js/internal/draggable/draggable.model.d.mts +2 -0
  64. package/dist/js/internal/draggable/draggable.model.mjs +37 -0
  65. package/dist/js/internal/draggable/index.d.mts +13 -0
  66. package/dist/js/internal/{draggable.mjs → draggable/index.mjs} +82 -113
  67. package/dist/js/internal/listbox/listbox.constants.d.mts +1 -1
  68. package/dist/js/internal/listbox/listbox.data.d.mts +1 -1
  69. package/dist/js/internal/listbox/listbox.data.mjs +1 -1
  70. package/dist/js/internal/listbox/listbox.dom.d.mts +1 -1
  71. package/dist/js/internal/listbox/listbox.dom.mjs +1 -1
  72. package/dist/js/internal/listbox/listbox.event.d.mts +1 -1
  73. package/dist/js/internal/listbox/listbox.event.mjs +20 -17
  74. package/dist/js/internal/listbox/listbox.form.d.mts +1 -1
  75. package/dist/js/internal/listbox/listbox.form.mjs +15 -12
  76. package/dist/js/internal/listbox/listbox.misc.d.mts +1 -1
  77. package/dist/js/internal/listbox/listbox.misc.mjs +1 -1
  78. package/dist/js/internal/listbox/listbox.model.d.mts +2 -2
  79. package/dist/js/internal/listbox/listbox.state.d.mts +4 -4
  80. package/dist/js/internal/listbox/listbox.state.mjs +19 -20
  81. package/dist/js/internal/misc.d.mts +1 -0
  82. package/dist/js/internal/misc.mjs +4 -6
  83. package/dist/js/internal/navigable/index.d.mts +6 -0
  84. package/dist/js/internal/navigable/index.mjs +125 -0
  85. package/dist/js/internal/navigable/navigable.model.d.mts +2 -0
  86. package/dist/js/internal/navigable/navigable.model.mjs +18 -0
  87. package/dist/js/l10n/index.d.mts +9 -0
  88. package/dist/js/{l10n.mjs → l10n/index.mjs} +50 -23
  89. package/dist/js/l10n/l10n.model.d.mts +2 -0
  90. package/dist/js/l10n/l10n.model.mjs +9 -0
  91. package/dist/js/l10n.model-D6a9frgl.d.mts +26 -0
  92. package/dist/js/listbox/constants.listbox.d.mts +2 -2
  93. package/dist/js/listbox/constants.listbox.mjs +10 -14
  94. package/dist/js/listbox/event.listbox.d.mts +1 -1
  95. package/dist/js/listbox/event.listbox.mjs +47 -1
  96. package/dist/js/listbox/index.d.mts +6 -4
  97. package/dist/js/listbox/index.mjs +47 -49
  98. package/dist/js/listbox/misc.listbox.d.mts +1 -1
  99. package/dist/js/listbox/misc.listbox.mjs +1 -1
  100. package/dist/js/listbox/state.listbox.d.mts +4 -5
  101. package/dist/js/listbox/state.listbox.mjs +2 -2
  102. package/dist/js/{listbox.data-DQ7-x2uY.mjs → listbox.data-BQyZGKgr.mjs} +87 -70
  103. package/dist/js/{listbox.model-BHPA7GM4.d.mts → listbox.model-CuBOj4qe.d.mts} +12 -8
  104. package/dist/js/menu/index.mjs +167 -0
  105. package/dist/js/menu/menu.model.d.mts +33 -0
  106. package/dist/js/menu/menu.model.mjs +15 -0
  107. package/dist/js/{misc.listbox-DKB-j0UK.mjs → misc.listbox-CjfBUbHD.mjs} +25 -67
  108. package/dist/js/{misc.listbox-mZMuYOxg.d.mts → misc.listbox-CtoGvXQo.d.mts} +2 -2
  109. package/dist/js/movable/movable.embedded.d.mts +2 -2
  110. package/dist/js/movable/movable.embedded.mjs +60 -72
  111. package/dist/js/movable/movable.model.d.mts +2 -0
  112. package/dist/js/movable/movable.model.mjs +12 -0
  113. package/dist/js/movable/movable.standalone.d.mts +2 -1
  114. package/dist/js/movable.embedded-DoyXLegc.d.mts +11 -0
  115. package/dist/js/{draggable-B5-70SZm.d.mts → movable.model-BHaK_mKw.d.mts} +81 -50
  116. package/dist/js/navigable.model-BPOM8DZk.d.mts +44 -0
  117. package/dist/js/popover/index.d.mts +12 -0
  118. package/dist/js/{popover.mjs → popover/index.mjs} +41 -51
  119. package/dist/js/popover/popover.model.d.mts +2 -0
  120. package/dist/js/popover/popover.model.mjs +12 -0
  121. package/dist/js/popover.model-ubKNG612.d.mts +38 -0
  122. package/dist/js/resizable/resizable.embedded.d.mts +2 -2
  123. package/dist/js/resizable/resizable.embedded.mjs +43 -58
  124. package/dist/js/resizable/resizable.model.d.mts +2 -0
  125. package/dist/js/resizable/resizable.model.mjs +21 -0
  126. package/dist/js/resizable/resizable.standalone.d.mts +2 -1
  127. package/dist/js/resizable.embedded-Bf1qBUdt.d.mts +11 -0
  128. package/dist/js/resizable.model-BwzJcTVJ.d.mts +46 -0
  129. package/dist/js/sortable/sortable.embedded.d.mts +2 -2
  130. package/dist/js/sortable/sortable.embedded.mjs +69 -82
  131. package/dist/js/sortable/sortable.model.d.mts +2 -0
  132. package/dist/js/sortable/sortable.model.mjs +24 -0
  133. package/dist/js/sortable/sortable.standalone.d.mts +2 -1
  134. package/dist/js/sortable.embedded-DzBKAwSG.d.mts +11 -0
  135. package/dist/js/{splitter.d.mts → splitter/index.d.mts} +6 -4
  136. package/dist/js/{splitter.mjs → splitter/index.mjs} +90 -128
  137. package/dist/js/splitter/splitter.model.d.mts +2 -0
  138. package/dist/js/splitter/splitter.model.mjs +37 -0
  139. package/dist/js/splitter.model-DOLNjLVS.d.mts +57 -0
  140. package/dist/js/{tabs.d.mts → tabs/index.d.mts} +7 -7
  141. package/dist/js/{tabs.mjs → tabs/index.mjs} +58 -58
  142. package/dist/js/tabs/tabs.model.d.mts +2 -0
  143. package/dist/js/tabs/tabs.model.mjs +18 -0
  144. package/dist/js/tabs.model-DRBX_JtI.d.mts +40 -0
  145. package/dist/js/toolbar/index.mjs +27 -0
  146. package/dist/js/toolbar/toolbar.model.d.mts +11 -0
  147. package/dist/js/toolbar/toolbar.model.mjs +7 -0
  148. package/dist/js/tooltip/index.d.mts +19 -0
  149. package/dist/js/{tooltip.mjs → tooltip/index.mjs} +61 -86
  150. package/dist/js/tooltip/tooltip.model.d.mts +2 -0
  151. package/dist/js/tooltip/tooltip.model.mjs +15 -0
  152. package/dist/js/tooltip.model-DRkY_BsL.d.mts +37 -0
  153. package/package.json +30 -24
  154. package/dist/js/color-picker/constants.color-picker.d.mts +0 -2
  155. package/dist/js/color-picker/misc.color-picker.d.mts +0 -2
  156. package/dist/js/color-picker/models.color-picker.d.mts +0 -2
  157. package/dist/js/color-picker/state.color-picker.d.mts +0 -8
  158. package/dist/js/color-picker/state.color-picker.mjs +0 -2
  159. package/dist/js/combobox/constants.combobox.d.mts +0 -2
  160. package/dist/js/combobox/misc.combobox.d.mts +0 -2
  161. package/dist/js/combobox/models.combobox.d.mts +0 -43
  162. package/dist/js/combobox/state.combobox.d.mts +0 -11
  163. package/dist/js/combobox/state.combobox.mjs +0 -2
  164. package/dist/js/constants.color-picker-B-gFjL8m.d.mts +0 -364
  165. package/dist/js/constants.combobox-8EMRmv09.d.mts +0 -18
  166. package/dist/js/constants.listbox-DGnX32kv.d.mts +0 -8
  167. package/dist/js/dialog.d.mts +0 -47
  168. package/dist/js/dialog.mjs +0 -131
  169. package/dist/js/index-C5D3-oiI.d.mts +0 -177
  170. package/dist/js/internal/draggable.d.mts +0 -2
  171. package/dist/js/internal/navigable.d.mts +0 -36
  172. package/dist/js/internal/navigable.mjs +0 -135
  173. package/dist/js/l10n-Bn-7RcwR.d.mts +0 -20
  174. package/dist/js/l10n.d.mts +0 -2
  175. package/dist/js/menu.mjs +0 -172
  176. package/dist/js/popover.d.mts +0 -38
  177. package/dist/js/resizable.embedded-dvhdfQgt.d.mts +0 -34
  178. package/dist/js/toolbar.mjs +0 -31
  179. package/dist/js/tooltip.d.mts +0 -45
  180. /package/dist/js/combobox/{models.combobox.mjs → combobox.model.mjs} +0 -0
  181. /package/dist/js/{menu.d.mts → menu/index.d.mts} +0 -0
  182. /package/dist/js/{toolbar.d.mts → toolbar/index.d.mts} +0 -0
@@ -1,15 +1,16 @@
1
- import { getLocalization, localize } from "./l10n.mjs";
1
+ import { getLocalization, localize } from "./l10n/index.mjs";
2
2
  import { listboxScrollOptions } from "./internal/listbox/listbox.constants.mjs";
3
3
  import { updateListboxForm, updateListboxValidity } from "./internal/listbox/listbox.form.mjs";
4
4
  import { setAria } from "@oscarpalmer/toretto/aria";
5
- import { dispatch } from "@oscarpalmer/toretto/event";
6
5
  import { setAttribute } from "@oscarpalmer/toretto/attribute";
6
+ import { dispatch } from "@oscarpalmer/toretto/event";
7
+ import { filter } from "@oscarpalmer/atoms/array/filter";
8
+ import { createElement } from "@oscarpalmer/toretto/create";
7
9
  import { getString } from "@oscarpalmer/atoms/string";
8
- import { createElement, setAria as setAria$1, setAttribute as setAttribute$1 } from "@oscarpalmer/toretto";
9
- import { getData as getData$1 } from "@oscarpalmer/toretto/data";
10
+ import { getData } from "@oscarpalmer/toretto/data";
10
11
  //#region src/js/internal/listbox/listbox.misc.ts
11
12
  function generateListboxIds(prefix, select) {
12
- const elements = [...select.children].flatMap((child) => child instanceof HTMLOptGroupElement ? [child, ...[...child.children].filter((groupChild) => groupChild instanceof HTMLOptionElement)] : child instanceof HTMLOptionElement ? [child] : []);
13
+ const elements = [...select.children].flatMap((child) => child instanceof HTMLOptGroupElement ? [child, ...filter([...child.children], (groupChild) => groupChild instanceof HTMLOptionElement)] : child instanceof HTMLOptionElement ? [child] : []);
13
14
  const { length } = elements;
14
15
  for (let index = 0; index < length; index += 1) {
15
16
  const element = elements[index];
@@ -17,24 +18,26 @@ function generateListboxIds(prefix, select) {
17
18
  }
18
19
  }
19
20
  function getListboxVisibleOptions(state) {
20
- return state.options.all.filter((option) => !option.hidden);
21
+ return state.component.options.all.filter((option) => !option.hidden);
21
22
  }
22
23
  function setListboxDisabled(state, value) {
23
- state.filter.element.readOnly = state.readonly || value;
24
+ state.component.filter.element.readOnly = state.component.readonly || value;
24
25
  setProperties("disabled", state, value);
25
26
  }
26
27
  function setListboxFilter(state, value) {
27
28
  if (typeof value !== "string") return;
28
- const type = value.length < state.filter.element.value.length ? "deleteContentBackward" : "insertText";
29
- state.filter.element.value = value;
29
+ const { filter } = state.component;
30
+ const type = value.length < filter.element.value.length ? "deleteContentBackward" : "insertText";
31
+ filter.element.value = value;
30
32
  filterListbox(type, state);
31
33
  }
32
34
  function setListboxLimit(type, state, value) {
35
+ const { component } = state;
33
36
  let actual = value;
34
37
  if (typeof actual === "string") actual = Number.parseInt(actual, 10);
35
- if (typeof actual === "number" && !Number.isNaN(actual) && actual >= 0 ? actual !== state[type] : actual == null) {
36
- state[type] = actual;
37
- setAttribute(state.host, type, actual);
38
+ if (typeof actual === "number" && !Number.isNaN(actual) && actual >= 0 ? actual !== component[type] : actual == null) {
39
+ component[type] = actual;
40
+ setAttribute(component.host, type, actual);
38
41
  updateListboxValidity(state);
39
42
  }
40
43
  }
@@ -43,16 +46,19 @@ function setListboxMultiple(element, value) {
43
46
  else element.removeAttribute("multiple");
44
47
  }
45
48
  function setProperties(key, state, value) {
46
- state[key] = value;
47
- const { length } = state.elements;
49
+ const { component } = state;
50
+ const { elements } = component;
51
+ component[key] = value;
52
+ const { length } = elements;
48
53
  for (let index = 0; index < length; index += 1) {
49
- const element = state.elements[index];
54
+ const element = elements[index];
50
55
  if (element == null) continue;
51
56
  setAria(element, key, key !== "readonly" || !(element instanceof HTMLButtonElement) ? value : void 0);
52
57
  }
53
58
  }
54
59
  function setListboxReadonly(state, value) {
55
- state.filter.element.readOnly = state.disabled || value;
60
+ const { disabled, filter } = state.component;
61
+ filter.element.readOnly = disabled || value;
56
62
  setProperties("readonly", state, value);
57
63
  }
58
64
  function setListboxRequired(state, value) {
@@ -81,7 +87,7 @@ function createListboxFilter(parameters) {
81
87
  if (parameters.type === "autocomplete") return;
82
88
  const container = createElement("div", { attribute: { [parameters.attributes.filter]: "" } });
83
89
  const element = createListboxInput(parameters, "");
84
- setAttribute$1(element, parameters.attributes.input, "");
90
+ setAttribute(element, parameters.attributes.input, "");
85
91
  container.append(element);
86
92
  return {
87
93
  container,
@@ -144,7 +150,7 @@ function createListboxInput(parameters, value) {
144
150
  type: "text"
145
151
  }
146
152
  });
147
- if (isAutocomplete || listbox) setAria$1(input, "expanded", listbox);
153
+ if (isAutocomplete || listbox) setAria(input, "expanded", listbox);
148
154
  return input;
149
155
  }
150
156
  function createListboxList(parameters) {
@@ -255,9 +261,9 @@ function createListboxValueLabel(id) {
255
261
  } });
256
262
  }
257
263
  function updateListboxMessage(state) {
258
- const { attributes, host, localizations, message } = state;
264
+ const { attributes, host, localizations, message } = state.component;
259
265
  const visible = getListboxVisibleOptions(state).length;
260
- setAttribute$1(message, attributes.hidden, visible > 0 ? "" : void 0);
266
+ setAttribute(message, attributes.hidden, visible > 0 ? "" : void 0);
261
267
  let data = {};
262
268
  let parameters = [];
263
269
  let key;
@@ -272,66 +278,72 @@ function updateListboxMessage(state) {
272
278
  message.hidden = false;
273
279
  }
274
280
  function updateListboxPreview(preview, state, active, scroll) {
275
- const { length } = state.options.all;
281
+ const { attributes, callbacks, content, filter, options } = state.component;
282
+ const { length } = options.all;
276
283
  for (let index = 0; index < length; index += 1) {
277
- const option = state.options.all[index];
278
- setAttribute$1(option, state.attributes.active, option === active ? "" : void 0);
284
+ const option = options.all[index];
285
+ setAttribute(option, attributes.active, option === active ? "" : void 0);
279
286
  }
280
- state.active = active;
281
- setAria$1(state.filter.element, "activedescendant", state.content.checkVisibility() ? active?.id : void 0);
287
+ state.component.active = active;
288
+ setAria(filter.element, "activedescendant", content.checkVisibility() ? active?.id : void 0);
282
289
  if (scroll ?? true) active?.scrollIntoView(listboxScrollOptions);
283
- if (preview !== "none") state.callbacks.data.onPreview(preview, state, active);
290
+ if (preview !== "none") callbacks.data.onPreview(preview, state, active);
284
291
  }
285
292
  function updateListboxValueLabel(state) {
293
+ const { autocomplete, filter, listbox, localizations, host, options, multiple, values } = state.component;
286
294
  let label;
287
- if (state.multiple) {
288
- const localization = getLocalization(state.localizations.global, state.host, "selected", state.localizations.component);
289
- const { length } = state.options.selected;
295
+ if (multiple) {
296
+ const localization = getLocalization(localizations.global, host, "selected", localizations.component);
297
+ const { length } = options.selected;
290
298
  label = localize(localization, { amount: length }, [length]);
291
- } else label = state.autocomplete.none && !state.listbox ? state.filter.element.value : state.options.selected[0]?.textContent ?? "";
292
- state.values.label.textContent = label;
299
+ } else label = autocomplete.none && !listbox ? filter.element.value : options.selected[0]?.textContent ?? "";
300
+ values.label.textContent = label;
293
301
  }
294
302
  //#endregion
295
303
  //#region src/js/internal/listbox/listbox.data.ts
296
304
  function applyListboxSelection(parameters) {
297
305
  const { added, emit, option, scroll, selected, state } = parameters;
298
- const { length } = state.options.all;
306
+ const { component } = state;
307
+ const { autocomplete, callbacks, filter, listbox, options, type } = component;
308
+ const { length } = options.all;
299
309
  for (let index = 0; index < length; index += 1) {
300
- const option = state.options.all[index];
301
- setAria(option, "selected", (state.type === "select" || !state.autocomplete.none) && (selected ?? state.options.selected).includes(option));
310
+ const option = options.all[index];
311
+ setAria(option, "selected", (type === "select" || !autocomplete.none) && (selected ?? options.selected).includes(option));
302
312
  }
303
- const values = parameters.values ?? (state.autocomplete.none && !state.listbox ? [state.filter.element.value] : (selected ?? state.options.selected).map((option) => getData$1(option, "value", false) ?? ""));
313
+ const values = parameters.values ?? (autocomplete.none && !listbox ? [filter.element.value] : (selected ?? options.selected).map((option) => getData(option, "value", false) ?? ""));
304
314
  if (values.length === 0) values.push("");
305
- if (selected != null) state.options.selected = selected;
306
- if (!(values.length === state.values.current.length ? values.some((value) => !state.values.current.includes(value)) : true)) return;
315
+ if (selected != null) options.selected = selected;
316
+ if (!(values.length === component.values.current.length ? values.some((value) => !component.values.current.includes(value)) : true)) return;
307
317
  updateListboxForm(state, values, emit);
308
318
  updateListboxMessage(state);
309
319
  updateListboxPreview("set", state, option, scroll);
310
320
  updateListboxValueLabel(state);
311
- state.callbacks.data.onApply(state, option, values, added, selected, emit);
321
+ callbacks.data.onApply(state, option, values, added, selected, emit);
312
322
  }
313
323
  function filterListbox(type, state) {
314
- if (state.disabled || state.readonly) return;
315
- const update = state.filter.element.value !== state.filter.value;
324
+ const { callbacks, disabled, filter, host, readonly } = state.component;
325
+ if (disabled || readonly) return;
326
+ const update = filter.element.value !== filter.value;
316
327
  const option = filterListboxOptions(state);
317
328
  let preview;
318
329
  if (type.includes("delete")) preview = "none";
319
330
  else if (type.includes("insert")) preview = "typed";
320
- if (preview != null) state.callbacks.data.onFilter(preview, state, update, option);
331
+ if (preview != null) callbacks.data.onFilter(preview, state, update, option);
321
332
  if (update) {
322
- state.filter.value = state.filter.element.value;
323
- dispatch(state.host, "input");
333
+ filter.value = filter.element.value;
334
+ dispatch(host, "input");
324
335
  }
325
336
  }
326
337
  function filterListboxOption(state, value, textContent) {
338
+ const { options } = state.component;
327
339
  const filterTextContent = textContent ?? false;
328
340
  const filter = getString(value).toLocaleLowerCase();
329
341
  filterListboxOptions(state);
330
- const { length } = state.options.all;
342
+ const { length } = options.all;
331
343
  let match;
332
344
  for (let index = 0; index < length; index += 1) {
333
- const option = state.options.all[index];
334
- if ((filterTextContent ? option.textContent : getData$1(option, "value", false) ?? "").toLocaleLowerCase() === filter) {
345
+ const option = options.all[index];
346
+ if ((filterTextContent ? option.textContent : getData(option, "value", false) ?? "").toLocaleLowerCase() === filter) {
335
347
  match = option;
336
348
  break;
337
349
  }
@@ -339,12 +351,12 @@ function filterListboxOption(state, value, textContent) {
339
351
  return match;
340
352
  }
341
353
  function filterListboxOptions(state) {
342
- function filter(options) {
354
+ function filterOptions(options) {
343
355
  const { length } = options;
344
356
  let count = 0;
345
357
  for (let index = 0; index < length; index += 1) {
346
358
  const option = options[index];
347
- option.hidden = (state.type === "select" || !state.autocomplete.none) && !option.textContent.toLocaleLowerCase().includes(value);
359
+ option.hidden = (type === "select" || !autocomplete.none) && !option.textContent.toLocaleLowerCase().includes(value);
348
360
  if (!option.hidden) {
349
361
  count += 1;
350
362
  visible.push(option);
@@ -352,22 +364,24 @@ function filterListboxOptions(state) {
352
364
  }
353
365
  return count === 0;
354
366
  }
355
- const value = state.filter.element.value.toLocaleLowerCase();
367
+ const { active, attributes, autocomplete, filter, groups, list, options, type } = state.component;
368
+ const value = filter.element.value.toLocaleLowerCase();
356
369
  const visible = [];
357
- if (state.groups == null) filter(state.options.all);
370
+ if (groups == null) filterOptions(options.all);
358
371
  else {
359
- const groupsLength = state.groups.length;
372
+ const groupsLength = groups.length;
360
373
  for (let groupIndex = 0; groupIndex < groupsLength; groupIndex += 1) {
361
- const { element, options } = state.groups[groupIndex];
362
- element.hidden = filter(options);
374
+ const { element, options } = groups[groupIndex];
375
+ element.hidden = filterOptions(options);
363
376
  }
364
377
  }
365
- setAttribute(state.list, state.attributes.empty, visible.length === 0 ? "" : void 0);
378
+ setAttribute(list, attributes.empty, visible.length === 0 ? "" : void 0);
366
379
  updateListboxMessage(state);
367
- return state.active != null && visible.includes(state.active) ? state.active : visible[0];
380
+ return active != null && visible.includes(active) ? active : visible[0];
368
381
  }
369
382
  function setListboxValue(state, value, emit) {
370
- if (state.autocomplete.none && !state.listbox) {
383
+ const { autocomplete, listbox } = state.component;
384
+ if (autocomplete.none && !listbox) {
371
385
  setListboxFilter(state, getString(value));
372
386
  return;
373
387
  }
@@ -375,35 +389,37 @@ function setListboxValue(state, value, emit) {
375
389
  }
376
390
  function setListboxValues(state, value, emit) {
377
391
  if (!Array.isArray(value)) return;
378
- const values = (state.multiple ? value : value.slice(0, 1)).map((value) => getString(value).toLocaleLowerCase());
392
+ const { autocomplete, listbox, multiple, options } = state.component;
393
+ const values = (multiple ? value : value.slice(0, 1)).map((value) => getString(value).toLocaleLowerCase());
379
394
  if (values.length === 0) values.push("");
380
- if (state.autocomplete.none && !state.listbox) {
395
+ if (autocomplete.none && !listbox) {
381
396
  setListboxValue(state, values[0], emit);
382
397
  return;
383
398
  }
384
- const { length } = state.options.all;
399
+ const { length } = options.all;
385
400
  const selected = [];
386
401
  for (let index = 0; index < length; index += 1) {
387
- const option = state.options.all[index];
388
- if (values.includes(getData$1(option, "value", false)?.toLocaleLowerCase() ?? "")) selected.push(option);
402
+ const option = options.all[index];
403
+ if (values.includes(getData(option, "value", false)?.toLocaleLowerCase() ?? "")) selected.push(option);
389
404
  }
390
405
  applyListboxSelection({
391
406
  emit,
392
407
  selected,
393
408
  state,
394
409
  added: true,
395
- option: selected[0] ?? state.options.all[0],
396
- values: state.autocomplete.none && !state.listbox ? values : void 0
410
+ option: selected[0] ?? options.all[0],
411
+ values: autocomplete.none && !listbox ? values : void 0
397
412
  });
398
413
  }
399
414
  function toggleListboxOption(state, option) {
400
- if (option == null || !state.multiple && state.options.selected.includes(option)) {
401
- state.callbacks.data.onToggle(state);
415
+ const { autocomplete, callbacks, listbox, multiple, options } = state.component;
416
+ if (option == null || !multiple && options.selected.includes(option)) {
417
+ callbacks.data.onToggle(state);
402
418
  return;
403
419
  }
404
- const selected = state.options.selected.slice();
420
+ const selected = options.selected.slice();
405
421
  let added = true;
406
- if (state.multiple) {
422
+ if (multiple) {
407
423
  const index = selected.indexOf(option);
408
424
  if (index === -1) selected.push(option);
409
425
  else {
@@ -411,15 +427,16 @@ function toggleListboxOption(state, option) {
411
427
  selected.splice(index, 1);
412
428
  }
413
429
  } else selected.splice(0, selected.length, option);
430
+ const values = autocomplete.none && !listbox && option != null ? [option.textContent] : void 0;
414
431
  applyListboxSelection({
415
432
  added,
416
433
  option,
417
434
  selected,
418
435
  state,
419
- scroll: false,
420
- values: state.autocomplete.none && !state.listbox && option != null ? [option.textContent] : void 0
436
+ values,
437
+ scroll: false
421
438
  });
422
- state.callbacks.data.onToggle(state);
439
+ callbacks.data.onToggle(state);
423
440
  }
424
441
  //#endregion
425
442
  export { setListboxDisabled as C, setListboxReadonly as D, setListboxMultiple as E, setListboxRequired as O, getListboxVisibleOptions as S, setListboxLimit as T, createListboxValueLabel as _, setListboxValue as a, updateListboxValueLabel as b, createListboxContent as c, createListboxHeader as d, createListboxInput as f, createListboxOptions as g, createListboxOption as h, filterListboxOptions as i, createListboxFilter as l, createListboxMessage as m, filterListbox as n, setListboxValues as o, createListboxList as p, filterListboxOption as r, toggleListboxOption as s, applyListboxSelection as t, createListboxGroup as u, updateListboxMessage as v, setListboxFilter as w, generateListboxIds as x, updateListboxPreview as y };
@@ -1,4 +1,5 @@
1
- import { n as OuiLocalizationsValues, t as OuiLocalizations } from "./l10n-Bn-7RcwR.mjs";
1
+ import { c as OuiLocalizations, u as OuiLocalizationsValues } from "./l10n.model-D6a9frgl.mjs";
2
+ import { PlainObject } from "@oscarpalmer/atoms/models";
2
3
  import { RemovableEventListener } from "@oscarpalmer/toretto/models";
3
4
  //#region src/js/internal/listbox/listbox.model.d.ts
4
5
  type OuiListboxAttributes = {
@@ -80,7 +81,11 @@ type OuiListboxOptions = {
80
81
  selected: HTMLElement[];
81
82
  };
82
83
  type OuiListboxPreview = "none" | "set" | "typed";
83
- type OuiListboxState = {
84
+ type OuiListboxState<State extends PlainObject = PlainObject> = {
85
+ component: OuiListboxStateComponent<State>;
86
+ form: OuiListboxStateForm;
87
+ };
88
+ type OuiListboxStateComponent<State extends PlainObject> = {
84
89
  active?: HTMLElement;
85
90
  attributes: OuiListboxAttributes;
86
91
  autocomplete: OuiListboxAutoComplete;
@@ -93,7 +98,6 @@ type OuiListboxState = {
93
98
  groups?: OuiListboxGroup[];
94
99
  host: HTMLElement;
95
100
  id: string;
96
- internals: ElementInternals;
97
101
  label: OuiListboxLabel;
98
102
  list: HTMLUListElement;
99
103
  listbox: boolean;
@@ -110,10 +114,10 @@ type OuiListboxState = {
110
114
  select: HTMLSelectElement;
111
115
  type: OuiListboxType;
112
116
  values: OuiListboxValues;
113
- };
114
- type OuiListboxStates<State extends OuiListboxState = OuiListboxState> = {
115
- map: WeakMap<HTMLElement, State>;
116
- set: Set<State>;
117
+ } & State;
118
+ type OuiListboxStateForm = {
119
+ internals: ElementInternals;
120
+ restored?: unknown[];
117
121
  };
118
122
  type OuiListboxType = "autocomplete" | "select";
119
123
  type OuiListboxValues = {
@@ -122,4 +126,4 @@ type OuiListboxValues = {
122
126
  label: HTMLElement;
123
127
  };
124
128
  //#endregion
125
- export { OuiListboxGroup as a, OuiListboxPreview as c, OuiListboxType as d, OuiListboxCallbacks as i, OuiListboxState as l, OuiListboxAutoComplete as n, OuiListboxLocalizations as o, OuiListboxAutoCompleteType as r, OuiListboxOptions as s, OuiListboxAttributes as t, OuiListboxStates as u };
129
+ export { OuiListboxGroup as a, OuiListboxPreview as c, OuiListboxStateForm as d, OuiListboxType as f, OuiListboxCallbacks as i, OuiListboxState as l, OuiListboxAutoComplete as n, OuiListboxLocalizations as o, OuiListboxAutoCompleteType as r, OuiListboxOptions as s, OuiListboxAttributes as t, OuiListboxStateComponent as u };
@@ -0,0 +1,167 @@
1
+ import { createEmbeddedFloatable, getOnBeforeToggleListener } from "../floatable/floatable.embedded.mjs";
2
+ import { attributable } from "../internal/attributable.mjs";
3
+ import { NAVIGABLE_KEYS_HORIZONTAL, NAVIGABLE_KEYS_VERTICAL, NAVIGABLE_SYMBOL } from "../internal/navigable/navigable.model.mjs";
4
+ import { getNavigable, updateNavigableFocus } from "../internal/navigable/index.mjs";
5
+ import { MENUBAR_ATTRIBUTE, MENUBAR_SELECTOR_ITEM, MENU_ATTRIBUTE, MENU_ATTRIBUTE_POSITION, MENU_MENUBAR_SELECTORS, MENU_SELECTOR_CONTENT, MENU_SELECTOR_ITEM, MENU_SELECTOR_TOGGLE, menubars, menus } from "./menu.model.mjs";
6
+ import { setAria, setRole } from "@oscarpalmer/toretto/aria";
7
+ import { setAttribute, setAttributes } from "@oscarpalmer/toretto/attribute";
8
+ import { on } from "@oscarpalmer/toretto/event";
9
+ import { findAncestor } from "@oscarpalmer/toretto/find";
10
+ //#region src/js/menu/index.ts
11
+ function OuiMenu(element, navigable) {
12
+ const state = navigable[NAVIGABLE_SYMBOL];
13
+ this.content = state.element;
14
+ this.element = element;
15
+ this.navigable = navigable;
16
+ this.toggle = element.querySelector(MENU_SELECTOR_TOGGLE);
17
+ this.floatable = createEmbeddedFloatable(this.toggle, this.content, {
18
+ attribute: MENU_ATTRIBUTE_POSITION,
19
+ position: findAncestor(element.parentElement, MENU_SELECTOR_CONTENT) == null ? "below-start" : "end-top",
20
+ reusable: false
21
+ });
22
+ state.listeners.push(getOnBeforeToggleListener(this.content), on(this.content, "click", (event) => {
23
+ event.stopPropagation();
24
+ if (findAncestor(event, MENU_SELECTOR_TOGGLE) != null) return;
25
+ const elements = document.querySelectorAll(MENU_SELECTOR_CONTENT);
26
+ for (const element of elements) menus.get(element)?.floatable.hide();
27
+ const menu = menus.get(elements[0]);
28
+ if (menu != null && event.pointerId === -1) updateNavigableFocus(menu.navigable, true);
29
+ }), on(this.content, "toggle", (event) => {
30
+ const expanded = event.newState === "open";
31
+ if (expanded) {
32
+ this.floatable?.update();
33
+ updateNavigableFocus(this.navigable, true);
34
+ }
35
+ setAria(this.toggle, "expanded", expanded);
36
+ }));
37
+ this.floatable.update();
38
+ initializeMenu(this);
39
+ updateNavigableFocus(this.navigable, false);
40
+ }
41
+ OuiMenu.prototype.destroy = destroyMenu;
42
+ Object.defineProperties(OuiMenu.prototype, { open: {
43
+ enumerable: true,
44
+ get: getMenuOpen
45
+ } });
46
+ function OuiMenubar(element, navigable) {
47
+ this.element = element;
48
+ this.navigable = navigable;
49
+ updateNavigableFocus(this.navigable, false);
50
+ }
51
+ OuiMenubar.prototype.destroy = destroyMenubar;
52
+ function addInstance(instances, ctor, element, content, options) {
53
+ if (!instances.has(content)) instances.set(content, new ctor(element, getNavigable(content, {
54
+ ...options,
55
+ onDeactivate,
56
+ onPreventNavigation,
57
+ onShouldActivate,
58
+ onShouldDeactivate
59
+ })));
60
+ }
61
+ function addMenu(element) {
62
+ const content = element.querySelector(MENU_SELECTOR_CONTENT);
63
+ const toggle = element.querySelector(MENU_SELECTOR_TOGGLE);
64
+ if (content != null && toggle != null) addInstance(menus, OuiMenu, element, content, {
65
+ selector: MENU_SELECTOR_ITEM,
66
+ vertical: true
67
+ });
68
+ }
69
+ function addMenubar(element) {
70
+ addInstance(menubars, OuiMenubar, element, element, {
71
+ role: "menubar",
72
+ selector: MENUBAR_SELECTOR_ITEM,
73
+ vertical: false
74
+ });
75
+ }
76
+ function destroyMenu() {
77
+ this.floatable.destroy();
78
+ this.navigable.destroy();
79
+ this.content = void 0;
80
+ this.element = void 0;
81
+ this.floatable = void 0;
82
+ this.navigable = void 0;
83
+ this.toggle = void 0;
84
+ }
85
+ function destroyMenubar() {
86
+ this.navigable.destroy();
87
+ this.element = void 0;
88
+ this.navigable = void 0;
89
+ }
90
+ function getId(element, value) {
91
+ let { id } = element;
92
+ if (id == null || id.trim().length === 0) {
93
+ id = value == null ? `oui_menu_${++index}` : `${value}_toggle`;
94
+ element.id = id;
95
+ }
96
+ return id;
97
+ }
98
+ function getMenuOpen() {
99
+ return this.floatable.open;
100
+ }
101
+ function initializeMenu(menu) {
102
+ const id = getId(menu.content);
103
+ setAttribute(menu.toggle, "popovertarget", id);
104
+ setAria(menu.toggle, {
105
+ controls: id,
106
+ expanded: "false",
107
+ haspopup: "menu"
108
+ });
109
+ setAttributes(menu.content, {
110
+ popover: "",
111
+ tabindex: "-1"
112
+ });
113
+ setRole(menu.content, "menu");
114
+ }
115
+ function onDeactivate(_, navigable) {
116
+ const menu = menus.get(navigable[NAVIGABLE_SYMBOL].element);
117
+ if (menu == null) return;
118
+ menu.floatable.hide();
119
+ const element = findAncestor(menu.element.parentElement, MENU_MENUBAR_SELECTORS);
120
+ if (element == null) return;
121
+ const instance = menubars.get(element) ?? menus.get(element);
122
+ if (instance != null) updateNavigableFocus(instance.navigable, true);
123
+ }
124
+ function onPreventNavigation(_, navigable) {
125
+ const { element } = navigable[NAVIGABLE_SYMBOL];
126
+ const instance = menubars.get(element) ?? menus.get(element);
127
+ return instance == null ? false : findAncestor(instance.element.parentElement, MENU_MENUBAR_SELECTORS) != null;
128
+ }
129
+ function onShouldActivate(event, navigable) {
130
+ const state = navigable[NAVIGABLE_SYMBOL];
131
+ const { element } = state;
132
+ let activate = false;
133
+ if (menubars.has(element)) activate = state.orientation === "horizontal" ? NAVIGABLE_KEYS_VERTICAL.has(event.key) : NAVIGABLE_KEYS_HORIZONTAL.has(event.key);
134
+ else if (menus.has(element)) activate = state.orientation === "horizontal" ? NAVIGABLE_KEYS_VERTICAL.has(event.key) : event.key === "ArrowRight";
135
+ if (activate) {
136
+ const target = event.target instanceof HTMLElement && event.target.matches(MENU_SELECTOR_TOGGLE) ? event.target : void 0;
137
+ if (target == null) activate = false;
138
+ else target.click();
139
+ }
140
+ return activate;
141
+ }
142
+ function onShouldDeactivate(event, navigable) {
143
+ const { element, orientation } = navigable[NAVIGABLE_SYMBOL];
144
+ if (menubars.has(element)) return;
145
+ const menu = menus.get(element);
146
+ if (menu == null) return;
147
+ const horizontal = orientation === "horizontal";
148
+ const altKey = horizontal ? "ArrowDown" : "ArrowRight";
149
+ const baseKey = horizontal ? "ArrowUp" : "ArrowLeft";
150
+ if (event.key === baseKey) return findAncestor(menu.element.parentElement, MENU_SELECTOR_CONTENT) != null;
151
+ if (event.key === altKey && event.target instanceof HTMLElement && !event.target.hasAttribute("popovertarget")) return false;
152
+ }
153
+ function removeInstance(instances, element) {
154
+ instances.get(element)?.destroy();
155
+ instances.delete(element);
156
+ }
157
+ function removeMenu(element) {
158
+ removeInstance(menus, element);
159
+ }
160
+ function removeMenubar(element) {
161
+ removeInstance(menubars, element);
162
+ }
163
+ let index = 0;
164
+ attributable(MENU_ATTRIBUTE, addMenu, removeMenu);
165
+ attributable(MENUBAR_ATTRIBUTE, addMenubar, removeMenubar);
166
+ //#endregion
167
+ export {};
@@ -0,0 +1,33 @@
1
+ import { c as OuiFloatable } from "../floatable.model-DXsQgoU7.mjs";
2
+ import { d as OuiNavigable, m as OuiNavigableOptions } from "../navigable.model-BPOM8DZk.mjs";
3
+ //#region src/js/menu/menu.model.d.ts
4
+ export type OuiBasicMenu = {
5
+ destroy(): void;
6
+ };
7
+ export type OuiBasicMenuOptions = Pick<OuiNavigableOptions, "role" | "selector" | "vertical">;
8
+ export type OuiMenu = {
9
+ content: HTMLElement;
10
+ element: HTMLElement;
11
+ floatable: OuiFloatable;
12
+ navigable: OuiNavigable;
13
+ toggle: HTMLElement;
14
+ get open(): boolean;
15
+ destroy(): void;
16
+ };
17
+ export type OuiMenubar = {
18
+ element: HTMLElement;
19
+ navigable: OuiNavigable;
20
+ destroy(): void;
21
+ };
22
+ export declare const MENU_ATTRIBUTE = "oui-menu";
23
+ export declare const MENU_ATTRIBUTE_POSITION: string;
24
+ export declare const MENUBAR_ATTRIBUTE = "oui-menubar";
25
+ export declare const MENU_SELECTOR_CONTENT: string;
26
+ export declare const MENU_SELECTOR_ITEM: string;
27
+ export declare const MENU_SELECTOR_TOGGLE: string;
28
+ export declare const MENUBAR_SELECTOR: string;
29
+ export declare const MENUBAR_SELECTOR_ITEM: string;
30
+ export declare const MENU_MENUBAR_SELECTORS: string;
31
+ export declare const menubars: WeakMap<HTMLElement, OuiMenubar>;
32
+ export declare const menus: WeakMap<HTMLElement, OuiMenu>;
33
+ //#endregion
@@ -0,0 +1,15 @@
1
+ import "../internal/navigable/navigable.model.mjs";
2
+ //#region src/js/menu/menu.model.ts
3
+ const MENU_ATTRIBUTE = "oui-menu";
4
+ const MENU_ATTRIBUTE_POSITION = `${MENU_ATTRIBUTE}-position`;
5
+ const MENUBAR_ATTRIBUTE = "oui-menubar";
6
+ const MENU_SELECTOR_CONTENT = `[${MENU_ATTRIBUTE}-content]`;
7
+ const MENU_SELECTOR_ITEM = `:scope > [${MENU_ATTRIBUTE}-item], :scope > * > [${MENU_ATTRIBUTE}-item]`;
8
+ const MENU_SELECTOR_TOGGLE = `[${MENU_ATTRIBUTE}-toggle]`;
9
+ const MENUBAR_SELECTOR = `[${MENUBAR_ATTRIBUTE}]`;
10
+ const MENUBAR_SELECTOR_ITEM = `:scope > [${MENUBAR_ATTRIBUTE}-item], :scope > * > [${MENUBAR_ATTRIBUTE}-item]`;
11
+ const MENU_MENUBAR_SELECTORS = `${MENUBAR_SELECTOR}, ${MENU_SELECTOR_CONTENT}`;
12
+ const menubars = /* @__PURE__ */ new WeakMap();
13
+ const menus = /* @__PURE__ */ new WeakMap();
14
+ //#endregion
15
+ export { MENUBAR_ATTRIBUTE, MENUBAR_SELECTOR, MENUBAR_SELECTOR_ITEM, MENU_ATTRIBUTE, MENU_ATTRIBUTE_POSITION, MENU_MENUBAR_SELECTORS, MENU_SELECTOR_CONTENT, MENU_SELECTOR_ITEM, MENU_SELECTOR_TOGGLE, menubars, menus };