@oscarpalmer/oui 0.39.0 → 0.41.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 (227) hide show
  1. package/README.md +1 -1
  2. package/dist/css/color-picker.css +80 -69
  3. package/dist/css/listbox.css +169 -0
  4. package/dist/js/color-picker/color-picker.constants.d.mts +2 -0
  5. package/dist/js/color-picker/{constants.color-picker.mjs → color-picker.constants.mjs} +7 -4
  6. package/dist/js/color-picker/{dom.color-picker.d.mts → color-picker.dom.d.mts} +2 -2
  7. package/dist/js/color-picker/{dom.color-picker.mjs → color-picker.dom.mjs} +33 -16
  8. package/dist/js/color-picker/{event.color-picker.d.mts → color-picker.event.d.mts} +3 -3
  9. package/dist/js/color-picker/color-picker.event.mjs +233 -0
  10. package/dist/js/color-picker/{form.color-picker.d.mts → color-picker.form.d.mts} +2 -2
  11. package/dist/js/color-picker/{form.color-picker.mjs → color-picker.form.mjs} +9 -8
  12. package/dist/js/color-picker/color-picker.misc.d.mts +2 -0
  13. package/dist/js/color-picker/color-picker.misc.mjs +104 -0
  14. package/dist/js/color-picker/color-picker.model.d.mts +2 -0
  15. package/dist/js/color-picker/{models.color-picker.mjs → color-picker.model.mjs} +1 -1
  16. package/dist/js/color-picker/{output.color-picker.d.mts → color-picker.output.d.mts} +2 -2
  17. package/dist/js/color-picker/{output.color-picker.mjs → color-picker.output.mjs} +19 -18
  18. package/dist/js/color-picker/color-picker.state.d.mts +8 -0
  19. package/dist/js/color-picker/color-picker.state.mjs +168 -0
  20. package/dist/js/color-picker/index.d.mts +172 -2
  21. package/dist/js/color-picker/index.mjs +66 -59
  22. package/dist/js/color-picker.constants-BZgXQr5o.d.mts +177 -0
  23. package/dist/js/color-picker.misc-BIS3R6jk.d.mts +31 -0
  24. package/dist/js/combobox/combobox.constants.d.mts +2 -0
  25. package/dist/js/combobox/{constants.combobox.mjs → combobox.constants.mjs} +21 -21
  26. package/dist/js/combobox/combobox.dom.d.mts +25 -0
  27. package/dist/js/combobox/{dom.combobox.mjs → combobox.dom.mjs} +51 -49
  28. package/dist/js/combobox/{event.combobox.d.mts → combobox.event.d.mts} +9 -9
  29. package/dist/js/combobox/{event.combobox.mjs → combobox.event.mjs} +1 -1
  30. package/dist/js/combobox/combobox.misc.d.mts +2 -0
  31. package/dist/js/combobox/combobox.misc.mjs +2 -0
  32. package/dist/js/combobox/combobox.model.d.mts +2 -0
  33. package/dist/js/combobox/combobox.state.d.mts +9 -0
  34. package/dist/js/combobox/combobox.state.mjs +2 -0
  35. package/dist/js/combobox/index.d.mts +152 -2
  36. package/dist/js/combobox/index.mjs +54 -55
  37. package/dist/js/combobox.constants-Hb3bqqQJ.d.mts +19 -0
  38. package/dist/js/combobox.misc-DRDFk6X8.d.mts +26 -0
  39. package/dist/js/combobox.model-gjEI2VqZ.d.mts +46 -0
  40. package/dist/js/{state.combobox-BWDFHwoi.mjs → combobox.state-AstCICiH.mjs} +109 -106
  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-HVzYWoDo.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-ncshL3Sa.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 +117 -138
  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-DpcPkP7c.d.mts +13 -0
  59. package/dist/js/{focus-trap.embedded-CjyFQYow.d.mts → focus-trap.model-CpltX5B5.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.d.mts +1 -1
  63. package/dist/js/internal/attributable.mjs +3 -2
  64. package/dist/js/internal/draggable/draggable.model.d.mts +2 -0
  65. package/dist/js/internal/draggable/draggable.model.mjs +37 -0
  66. package/dist/js/internal/draggable/index.d.mts +13 -0
  67. package/dist/js/internal/draggable/index.mjs +243 -0
  68. package/dist/js/internal/l10n/index.d.mts +5 -0
  69. package/dist/js/internal/l10n/index.mjs +147 -0
  70. package/dist/js/internal/l10n/l10n.model.d.mts +2 -0
  71. package/dist/js/internal/l10n/l10n.model.mjs +12 -0
  72. package/dist/js/internal/misc.d.mts +3 -2
  73. package/dist/js/internal/misc.mjs +4 -6
  74. package/dist/js/internal/navigable/index.d.mts +6 -0
  75. package/dist/js/internal/navigable/index.mjs +125 -0
  76. package/dist/js/internal/navigable/navigable.model.d.mts +2 -0
  77. package/dist/js/internal/navigable/navigable.model.mjs +18 -0
  78. package/dist/js/internal/option-list/option-list.constants.d.mts +8 -0
  79. package/dist/js/internal/option-list/option-list.constants.mjs +22 -0
  80. package/dist/js/internal/option-list/option-list.data.d.mts +21 -0
  81. package/dist/js/internal/option-list/option-list.data.mjs +2 -0
  82. package/dist/js/internal/option-list/option-list.dom.d.mts +18 -0
  83. package/dist/js/internal/option-list/option-list.dom.mjs +2 -0
  84. package/dist/js/internal/option-list/option-list.event.d.mts +6 -0
  85. package/dist/js/internal/option-list/option-list.event.mjs +66 -0
  86. package/dist/js/internal/option-list/option-list.form.d.mts +7 -0
  87. package/dist/js/internal/option-list/option-list.form.mjs +53 -0
  88. package/dist/js/internal/option-list/option-list.misc.d.mts +13 -0
  89. package/dist/js/internal/option-list/option-list.misc.mjs +2 -0
  90. package/dist/js/internal/option-list/option-list.model.d.mts +2 -0
  91. package/dist/js/internal/option-list/option-list.state.d.mts +8 -0
  92. package/dist/js/internal/option-list/option-list.state.mjs +39 -0
  93. package/dist/js/l10n/index.d.mts +3 -0
  94. package/dist/js/l10n/index.mjs +2 -0
  95. package/dist/js/l10n.model-D1E1u35L.d.mts +54 -0
  96. package/dist/js/listbox/index.d.mts +9 -18
  97. package/dist/js/listbox/index.mjs +49 -52
  98. package/dist/js/listbox/listbox.constants.d.mts +2 -0
  99. package/dist/js/listbox/{constants.listbox.mjs → listbox.constants.mjs} +11 -15
  100. package/dist/js/listbox/listbox.dom.d.mts +5 -0
  101. package/dist/js/listbox/listbox.dom.mjs +2 -0
  102. package/dist/js/listbox/listbox.event.d.mts +9 -0
  103. package/dist/js/listbox/listbox.event.mjs +2 -0
  104. package/dist/js/listbox/listbox.misc.d.mts +2 -0
  105. package/dist/js/listbox/listbox.misc.mjs +2 -0
  106. package/dist/js/listbox/listbox.model.d.mts +2 -0
  107. package/dist/js/listbox/listbox.model.mjs +1 -0
  108. package/dist/js/listbox/listbox.state.d.mts +9 -0
  109. package/dist/js/listbox/listbox.state.mjs +2 -0
  110. package/dist/js/listbox.constants-DOBMwKup.d.mts +9 -0
  111. package/dist/js/listbox.misc-DwfB4Mu_.d.mts +24 -0
  112. package/dist/js/listbox.model-C0MYWXZe.d.mts +20 -0
  113. package/dist/js/listbox.state-BrN296BM.mjs +240 -0
  114. package/dist/js/menu/index.mjs +171 -0
  115. package/dist/js/menu/menu.model.d.mts +33 -0
  116. package/dist/js/menu/menu.model.mjs +15 -0
  117. package/dist/js/movable/movable.embedded.d.mts +2 -2
  118. package/dist/js/movable/movable.embedded.mjs +77 -86
  119. package/dist/js/movable/movable.model.d.mts +2 -0
  120. package/dist/js/movable/movable.model.mjs +12 -0
  121. package/dist/js/movable/movable.standalone.d.mts +2 -1
  122. package/dist/js/movable.embedded-C1bDTLGs.d.mts +11 -0
  123. package/dist/js/movable.model-D9nnPWKk.d.mts +186 -0
  124. package/dist/js/navigable.model-BqoR6iBv.d.mts +44 -0
  125. package/dist/js/option-list.data-CgMyUwPc.mjs +441 -0
  126. package/dist/js/option-list.model-CCPUlPeX.d.mts +169 -0
  127. package/dist/js/popover/index.d.mts +12 -0
  128. package/dist/js/{popover.mjs → popover/index.mjs} +41 -51
  129. package/dist/js/popover/popover.model.d.mts +2 -0
  130. package/dist/js/popover/popover.model.mjs +12 -0
  131. package/dist/js/popover.model-DiLdz0Hc.d.mts +38 -0
  132. package/dist/js/resizable/resizable.embedded.d.mts +2 -2
  133. package/dist/js/resizable/resizable.embedded.mjs +43 -58
  134. package/dist/js/resizable/resizable.model.d.mts +2 -0
  135. package/dist/js/resizable/resizable.model.mjs +21 -0
  136. package/dist/js/resizable/resizable.standalone.d.mts +2 -1
  137. package/dist/js/resizable.embedded-BemH-7Re.d.mts +11 -0
  138. package/dist/js/resizable.model-YEtcC9li.d.mts +46 -0
  139. package/dist/js/sortable/sortable.embedded.d.mts +2 -2
  140. package/dist/js/sortable/sortable.embedded.mjs +111 -116
  141. package/dist/js/sortable/sortable.model.d.mts +2 -0
  142. package/dist/js/sortable/sortable.model.mjs +24 -0
  143. package/dist/js/sortable/sortable.standalone.d.mts +2 -1
  144. package/dist/js/sortable.embedded-CrEGff9k.d.mts +11 -0
  145. package/dist/js/{splitter.d.mts → splitter/index.d.mts} +6 -4
  146. package/dist/js/{splitter.mjs → splitter/index.mjs} +90 -128
  147. package/dist/js/splitter/splitter.model.d.mts +2 -0
  148. package/dist/js/splitter/splitter.model.mjs +37 -0
  149. package/dist/js/splitter.model-C24W6eZ7.d.mts +57 -0
  150. package/dist/js/{tabs.d.mts → tabs/index.d.mts} +8 -8
  151. package/dist/js/{tabs.mjs → tabs/index.mjs} +58 -58
  152. package/dist/js/tabs/tabs.model.d.mts +2 -0
  153. package/dist/js/tabs/tabs.model.mjs +18 -0
  154. package/dist/js/tabs.model-BHPy7fPo.d.mts +40 -0
  155. package/dist/js/toolbar/index.mjs +27 -0
  156. package/dist/js/toolbar/toolbar.model.d.mts +11 -0
  157. package/dist/js/toolbar/toolbar.model.mjs +7 -0
  158. package/dist/js/tooltip/index.d.mts +19 -0
  159. package/dist/js/{tooltip.mjs → tooltip/index.mjs} +61 -86
  160. package/dist/js/tooltip/tooltip.model.d.mts +2 -0
  161. package/dist/js/tooltip/tooltip.model.mjs +15 -0
  162. package/dist/js/tooltip.model-BpNStw5z.d.mts +37 -0
  163. package/package.json +30 -24
  164. package/dist/js/color-picker/constants.color-picker.d.mts +0 -2
  165. package/dist/js/color-picker/event.color-picker.mjs +0 -2
  166. package/dist/js/color-picker/misc.color-picker.d.mts +0 -2
  167. package/dist/js/color-picker/misc.color-picker.mjs +0 -2
  168. package/dist/js/color-picker/models.color-picker.d.mts +0 -2
  169. package/dist/js/color-picker/state.color-picker.d.mts +0 -8
  170. package/dist/js/color-picker/state.color-picker.mjs +0 -2
  171. package/dist/js/combobox/constants.combobox.d.mts +0 -2
  172. package/dist/js/combobox/dom.combobox.d.mts +0 -26
  173. package/dist/js/combobox/misc.combobox.d.mts +0 -2
  174. package/dist/js/combobox/misc.combobox.mjs +0 -2
  175. package/dist/js/combobox/models.combobox.d.mts +0 -43
  176. package/dist/js/combobox/state.combobox.d.mts +0 -11
  177. package/dist/js/combobox/state.combobox.mjs +0 -2
  178. package/dist/js/constants.color-picker-B-gFjL8m.d.mts +0 -364
  179. package/dist/js/constants.combobox-8EMRmv09.d.mts +0 -18
  180. package/dist/js/constants.listbox-DGnX32kv.d.mts +0 -8
  181. package/dist/js/dialog.d.mts +0 -47
  182. package/dist/js/dialog.mjs +0 -131
  183. package/dist/js/draggable-B5-70SZm.d.mts +0 -155
  184. package/dist/js/event.color-picker-BEpq0Adu.mjs +0 -485
  185. package/dist/js/index-C5D3-oiI.d.mts +0 -177
  186. package/dist/js/internal/draggable.d.mts +0 -2
  187. package/dist/js/internal/draggable.mjs +0 -265
  188. package/dist/js/internal/listbox/listbox.constants.d.mts +0 -8
  189. package/dist/js/internal/listbox/listbox.constants.mjs +0 -22
  190. package/dist/js/internal/listbox/listbox.data.d.mts +0 -19
  191. package/dist/js/internal/listbox/listbox.data.mjs +0 -2
  192. package/dist/js/internal/listbox/listbox.dom.d.mts +0 -65
  193. package/dist/js/internal/listbox/listbox.dom.mjs +0 -2
  194. package/dist/js/internal/listbox/listbox.event.d.mts +0 -4
  195. package/dist/js/internal/listbox/listbox.event.mjs +0 -63
  196. package/dist/js/internal/listbox/listbox.form.d.mts +0 -5
  197. package/dist/js/internal/listbox/listbox.form.mjs +0 -53
  198. package/dist/js/internal/listbox/listbox.misc.d.mts +0 -11
  199. package/dist/js/internal/listbox/listbox.misc.mjs +0 -2
  200. package/dist/js/internal/listbox/listbox.model.d.mts +0 -2
  201. package/dist/js/internal/listbox/listbox.state.d.mts +0 -6
  202. package/dist/js/internal/listbox/listbox.state.mjs +0 -40
  203. package/dist/js/internal/navigable.d.mts +0 -36
  204. package/dist/js/internal/navigable.mjs +0 -135
  205. package/dist/js/l10n-Bn-7RcwR.d.mts +0 -20
  206. package/dist/js/l10n.d.mts +0 -2
  207. package/dist/js/l10n.mjs +0 -80
  208. package/dist/js/listbox/constants.listbox.d.mts +0 -2
  209. package/dist/js/listbox/event.listbox.d.mts +0 -7
  210. package/dist/js/listbox/event.listbox.mjs +0 -2
  211. package/dist/js/listbox/misc.listbox.d.mts +0 -2
  212. package/dist/js/listbox/misc.listbox.mjs +0 -2
  213. package/dist/js/listbox/state.listbox.d.mts +0 -10
  214. package/dist/js/listbox/state.listbox.mjs +0 -2
  215. package/dist/js/listbox.data-DQ7-x2uY.mjs +0 -425
  216. package/dist/js/listbox.model-BHPA7GM4.d.mts +0 -125
  217. package/dist/js/menu.mjs +0 -172
  218. package/dist/js/misc.listbox-DKB-j0UK.mjs +0 -196
  219. package/dist/js/misc.listbox-mZMuYOxg.d.mts +0 -20
  220. package/dist/js/popover.d.mts +0 -38
  221. package/dist/js/resizable.embedded-dvhdfQgt.d.mts +0 -34
  222. package/dist/js/toolbar.mjs +0 -31
  223. package/dist/js/tooltip.d.mts +0 -45
  224. /package/dist/js/combobox/{models.combobox.mjs → combobox.model.mjs} +0 -0
  225. /package/dist/js/internal/{listbox/listbox.model.mjs → option-list/option-list.model.mjs} +0 -0
  226. /package/dist/js/{menu.d.mts → menu/index.d.mts} +0 -0
  227. /package/dist/js/{toolbar.d.mts → toolbar/index.d.mts} +0 -0
@@ -0,0 +1,441 @@
1
+ import { optionListScrollOptions } from "./internal/option-list/option-list.constants.mjs";
2
+ import { updateOptionListForm, updateOptionListValidity } from "./internal/option-list/option-list.form.mjs";
3
+ import { setAria } from "@oscarpalmer/toretto/aria";
4
+ import { setAttribute } from "@oscarpalmer/toretto/attribute";
5
+ import { dispatch } from "@oscarpalmer/toretto/event";
6
+ import { filter } from "@oscarpalmer/atoms/array/filter";
7
+ import { createElement } from "@oscarpalmer/toretto/create";
8
+ import { getString } from "@oscarpalmer/atoms/string";
9
+ import { getData } from "@oscarpalmer/toretto/data";
10
+ //#region src/js/internal/option-list/option-list.misc.ts
11
+ function generateOptionListIds(prefix, select) {
12
+ const elements = [...select.children].flatMap((child) => child instanceof HTMLOptGroupElement ? [child, ...filter([...child.children], (groupChild) => groupChild instanceof HTMLOptionElement)] : child instanceof HTMLOptionElement ? [child] : []);
13
+ const { length } = elements;
14
+ for (let index = 0; index < length; index += 1) {
15
+ const element = elements[index];
16
+ if (element.id === "") element.id = `${prefix}${element instanceof HTMLOptGroupElement ? "_group_" : "_option_"}${index}`;
17
+ }
18
+ }
19
+ function getOptionListVisibleOptions(state) {
20
+ return state.component.options.all.filter((option) => !option.hidden);
21
+ }
22
+ function setOptionListDisabled(state, value) {
23
+ state.component.filter.element.readOnly = state.component.readonly || value;
24
+ setProperties("disabled", state, value);
25
+ }
26
+ function setOptionListFilter(state, value) {
27
+ if (typeof value !== "string") return;
28
+ const { filter } = state.component;
29
+ const type = value.length < filter.element.value.length ? "deleteContentBackward" : "insertText";
30
+ filter.element.value = value;
31
+ filterOptionList(type, state);
32
+ }
33
+ function setOptionListLimit(type, state, value) {
34
+ const { component } = state;
35
+ let actual = value;
36
+ if (typeof actual === "string") actual = Number.parseInt(actual, 10);
37
+ if (typeof actual === "number" && !Number.isNaN(actual) && actual >= 0 ? actual !== component[type] : actual == null) {
38
+ component[type] = actual;
39
+ setAttribute(component.host, type, actual);
40
+ updateOptionListValidity(state);
41
+ }
42
+ }
43
+ function setOptionListMultiple(element, value) {
44
+ if (value) element.setAttribute("multiple", "");
45
+ else element.removeAttribute("multiple");
46
+ }
47
+ function setProperties(key, state, value) {
48
+ const { component } = state;
49
+ const { elements } = component;
50
+ component[key] = value;
51
+ const { length } = elements;
52
+ for (let index = 0; index < length; index += 1) {
53
+ const element = elements[index];
54
+ if (element == null) continue;
55
+ setAria(element, key, key !== "readonly" || !(element instanceof HTMLButtonElement) ? value : void 0);
56
+ }
57
+ }
58
+ function setOptionListReadonly(state, value) {
59
+ const { disabled, filter } = state.component;
60
+ filter.element.readOnly = disabled || value;
61
+ setProperties("readonly", state, value);
62
+ }
63
+ function setOptionListRequired(state, value) {
64
+ setProperties("required", state, value);
65
+ updateOptionListValidity(state);
66
+ }
67
+ //#endregion
68
+ //#region src/js/internal/option-list/option-list.dom.ts
69
+ function createOptionListContent(parameters) {
70
+ const element = createElement("div", { attribute: { [parameters.attributes.content]: "" } });
71
+ const filter = createOptionListFilter(parameters);
72
+ const list = createOptionListList(parameters);
73
+ const message = createOptionListMessage(parameters.attributes.message);
74
+ const value = createOptionListValueLabel(parameters.id);
75
+ if (filter != null) element.append(filter.container);
76
+ element.append(list.element, message, value);
77
+ return {
78
+ element,
79
+ filter,
80
+ list,
81
+ message,
82
+ value
83
+ };
84
+ }
85
+ function createOptionListFilter(parameters) {
86
+ if (parameters.type === "autocomplete") return;
87
+ const container = createElement("div", { attribute: { [parameters.attributes.filter]: "" } });
88
+ const element = createOptionListInput(parameters, "");
89
+ setAttribute(element, parameters.attributes.input, "");
90
+ container.append(element);
91
+ return {
92
+ container,
93
+ element
94
+ };
95
+ }
96
+ function createOptionListGroup(parameters) {
97
+ const { group, groupOptions, selected, type } = parameters;
98
+ const element = createElement("li", {
99
+ aria: { label: group.label },
100
+ property: { role: "group" }
101
+ });
102
+ const list = createElement("ul", { property: { role: "none" } });
103
+ const header = createOptionListHeader(parameters, group);
104
+ element.append(header, list);
105
+ return {
106
+ element,
107
+ header,
108
+ options: createOptionListOptions({
109
+ list,
110
+ selected,
111
+ type,
112
+ group: header.id,
113
+ options: groupOptions,
114
+ original: parameters.original
115
+ })
116
+ };
117
+ }
118
+ function createOptionListHeader(parameters, group) {
119
+ return createElement("div", {
120
+ aria: { hidden: true },
121
+ attribute: { [parameters.original.attributes.header]: "" },
122
+ property: {
123
+ id: group.id,
124
+ textContent: group.label
125
+ }
126
+ });
127
+ }
128
+ function createOptionListInput(parameters, value) {
129
+ const { autocomplete, id, label, listbox, type } = parameters;
130
+ const isAutocomplete = type === "autocomplete";
131
+ const input = createElement("input", {
132
+ aria: {
133
+ autocomplete: autocomplete.value,
134
+ controls: `${id}_list`,
135
+ haspopup: isAutocomplete ? "listbox" : void 0,
136
+ labelledby: label.id
137
+ },
138
+ attribute: {
139
+ autocorrect: "off",
140
+ autocomplete: "off",
141
+ form: "",
142
+ inputmode: "text",
143
+ spellcheck: "false"
144
+ },
145
+ property: {
146
+ id,
147
+ value,
148
+ role: isAutocomplete || listbox ? "combobox" : "searchbox",
149
+ type: "text"
150
+ }
151
+ });
152
+ if (isAutocomplete || listbox) setAria(input, "expanded", listbox);
153
+ return input;
154
+ }
155
+ function createOptionListList(parameters) {
156
+ const { attributes, id, label, multiple, select, type } = parameters;
157
+ const element = createElement("ul", {
158
+ aria: {
159
+ labelledby: label.id,
160
+ multiselectable: multiple
161
+ },
162
+ attribute: {
163
+ [attributes.list]: "",
164
+ tabindex: -1
165
+ },
166
+ property: {
167
+ id: `${id}_list`,
168
+ role: "listbox"
169
+ }
170
+ });
171
+ const children = [...select.children];
172
+ const childrenLength = children.length;
173
+ const options = [];
174
+ const selected = [];
175
+ let groups;
176
+ for (let childIndex = 0; childIndex < childrenLength; childIndex += 1) {
177
+ const child = children[childIndex];
178
+ if (child instanceof HTMLOptionElement) {
179
+ const option = createOptionListOption({
180
+ type,
181
+ option: child,
182
+ original: parameters,
183
+ index: childIndex
184
+ });
185
+ element.append(option);
186
+ options.push(option);
187
+ if (child.selected) selected.push(option);
188
+ continue;
189
+ }
190
+ if (!(child instanceof HTMLOptGroupElement)) continue;
191
+ const group = createOptionListGroup({
192
+ selected,
193
+ type,
194
+ group: child,
195
+ groupOptions: [...child.children],
196
+ original: parameters
197
+ });
198
+ groups ??= [];
199
+ element.append(group.element);
200
+ groups.push(group);
201
+ options.push(...group.options);
202
+ }
203
+ return {
204
+ element,
205
+ groups,
206
+ options: {
207
+ selected,
208
+ all: options
209
+ }
210
+ };
211
+ }
212
+ function createOptionListMessage(attribute) {
213
+ return createElement("div", {
214
+ aria: { live: "polite" },
215
+ attribute: { [attribute]: "" },
216
+ property: {
217
+ hidden: true,
218
+ role: "status"
219
+ }
220
+ });
221
+ }
222
+ function createOptionListOption(parameters) {
223
+ const { group, option, original } = parameters;
224
+ return createElement("li", {
225
+ aria: { selected: (parameters.type === "select" || !original.autocomplete.none) && option.selected },
226
+ attribute: { [original.attributes.option]: "" },
227
+ data: {
228
+ group,
229
+ value: option.value
230
+ },
231
+ property: {
232
+ id: option.id,
233
+ role: "option",
234
+ textContent: option.textContent
235
+ }
236
+ });
237
+ }
238
+ function createOptionListOptions(parameters) {
239
+ const { group, list, options, original, selected, type } = parameters;
240
+ const items = [];
241
+ for (let index = 0; index < options.length; index += 1) {
242
+ const option = options[index];
243
+ const item = createOptionListOption({
244
+ group,
245
+ index,
246
+ option,
247
+ original,
248
+ type
249
+ });
250
+ items.push(item);
251
+ if (option.selected) selected.push(item);
252
+ list.append(item);
253
+ }
254
+ return items;
255
+ }
256
+ function createOptionListValueLabel(id) {
257
+ return createElement("span", { property: {
258
+ hidden: true,
259
+ id: `${id}_value`
260
+ } });
261
+ }
262
+ function updateOptionListMessage(state) {
263
+ const { attributes, host, localizations, message } = state.component;
264
+ const visible = getOptionListVisibleOptions(state).length;
265
+ setAttribute(message, attributes.hidden, visible > 0 ? "" : void 0);
266
+ let parameters = [];
267
+ let key;
268
+ if (visible === 0) key = "empty";
269
+ else {
270
+ key = "results";
271
+ parameters = [visible];
272
+ }
273
+ message.textContent = localizations.localize(key, {
274
+ arguments: parameters,
275
+ element: host
276
+ });
277
+ message.hidden = false;
278
+ }
279
+ function updateOptionListPreview(preview, state, active, scroll) {
280
+ const { attributes, callbacks, content, filter, options } = state.component;
281
+ const { length } = options.all;
282
+ for (let index = 0; index < length; index += 1) {
283
+ const option = options.all[index];
284
+ setAttribute(option, attributes.active, option === active ? "" : void 0);
285
+ }
286
+ state.component.active = active;
287
+ setAria(filter.element, "activedescendant", content.checkVisibility() ? active?.id : void 0);
288
+ if (scroll ?? true) active?.scrollIntoView(optionListScrollOptions);
289
+ if (preview !== "none") callbacks.data.onPreview(preview, state, active);
290
+ }
291
+ function updateOptionListValueLabel(state) {
292
+ const { autocomplete, filter, listbox, localizations, host, options, multiple, values } = state.component;
293
+ let label;
294
+ if (multiple) label = localizations.localize("selected", {
295
+ arguments: [options.selected.length],
296
+ element: host
297
+ });
298
+ else label = autocomplete.none && !listbox ? filter.element.value : options.selected[0]?.textContent ?? "";
299
+ values.label.textContent = label;
300
+ }
301
+ //#endregion
302
+ //#region src/js/internal/option-list/option-list.data.ts
303
+ function applyOptionListSelection(parameters) {
304
+ const { added, emit, option, scroll, selected, state } = parameters;
305
+ const { component } = state;
306
+ const { autocomplete, callbacks, filter, listbox, options, type } = component;
307
+ const { length } = options.all;
308
+ for (let index = 0; index < length; index += 1) {
309
+ const option = options.all[index];
310
+ setAria(option, "selected", (type === "select" || !autocomplete.none) && (selected ?? options.selected).includes(option));
311
+ }
312
+ const values = parameters.values ?? (autocomplete.none && !listbox ? [filter.element.value] : (selected ?? options.selected).map((option) => getData(option, "value", false) ?? ""));
313
+ if (values.length === 0) values.push("");
314
+ if (selected != null) options.selected = selected;
315
+ if (!(values.length === component.values.current.length ? values.some((value) => !component.values.current.includes(value)) : true)) return;
316
+ updateOptionListForm(state, values, emit);
317
+ updateOptionListMessage(state);
318
+ updateOptionListPreview("set", state, option, scroll);
319
+ updateOptionListValueLabel(state);
320
+ callbacks.data.onApply(state, option, values, added, selected, emit);
321
+ }
322
+ function filterOptionList(type, state) {
323
+ const { callbacks, disabled, filter, host, readonly } = state.component;
324
+ if (disabled || readonly) return;
325
+ const update = filter.element.value !== filter.value;
326
+ const option = filterOptionListOptions(state);
327
+ let preview;
328
+ if (type.includes("delete")) preview = "none";
329
+ else if (type.includes("insert")) preview = "typed";
330
+ if (preview != null) callbacks.data.onFilter(preview, state, update, option);
331
+ if (update) {
332
+ filter.value = filter.element.value;
333
+ dispatch(host, "input");
334
+ }
335
+ }
336
+ function filterOptionListOption(state, value, textContent) {
337
+ const { options } = state.component;
338
+ const filterTextContent = textContent ?? false;
339
+ const filter = getString(value).toLocaleLowerCase();
340
+ filterOptionListOptions(state);
341
+ const { length } = options.all;
342
+ let match;
343
+ for (let index = 0; index < length; index += 1) {
344
+ const option = options.all[index];
345
+ if ((filterTextContent ? option.textContent : getData(option, "value", false) ?? "").toLocaleLowerCase() === filter) {
346
+ match = option;
347
+ break;
348
+ }
349
+ }
350
+ return match;
351
+ }
352
+ function filterOptionListOptions(state) {
353
+ function filterOptions(options) {
354
+ const { length } = options;
355
+ let count = 0;
356
+ for (let index = 0; index < length; index += 1) {
357
+ const option = options[index];
358
+ option.hidden = (type === "select" || !autocomplete.none) && !option.textContent.toLocaleLowerCase().includes(value);
359
+ if (!option.hidden) {
360
+ count += 1;
361
+ visible.push(option);
362
+ }
363
+ }
364
+ return count === 0;
365
+ }
366
+ const { active, attributes, autocomplete, filter, groups, list, options, type } = state.component;
367
+ const value = filter.element.value.toLocaleLowerCase();
368
+ const visible = [];
369
+ if (groups == null) filterOptions(options.all);
370
+ else {
371
+ const groupsLength = groups.length;
372
+ for (let groupIndex = 0; groupIndex < groupsLength; groupIndex += 1) {
373
+ const { element, options } = groups[groupIndex];
374
+ element.hidden = filterOptions(options);
375
+ }
376
+ }
377
+ setAttribute(list, attributes.empty, visible.length === 0 ? "" : void 0);
378
+ updateOptionListMessage(state);
379
+ return active != null && visible.includes(active) ? active : visible[0];
380
+ }
381
+ function setOptionListValue(state, value, emit) {
382
+ const { autocomplete, listbox } = state.component;
383
+ if (autocomplete.none && !listbox) {
384
+ setOptionListFilter(state, getString(value));
385
+ return;
386
+ }
387
+ if (filterOptionListOption(state, value) != null) setOptionListValues(state, [value], emit);
388
+ }
389
+ function setOptionListValues(state, value, emit) {
390
+ if (!Array.isArray(value)) return;
391
+ const { autocomplete, listbox, multiple, options } = state.component;
392
+ const values = (multiple ? value : value.slice(0, 1)).map((value) => getString(value).toLocaleLowerCase());
393
+ if (values.length === 0) values.push("");
394
+ if (autocomplete.none && !listbox) {
395
+ setOptionListValue(state, values[0], emit);
396
+ return;
397
+ }
398
+ const { length } = options.all;
399
+ const selected = [];
400
+ for (let index = 0; index < length; index += 1) {
401
+ const option = options.all[index];
402
+ if (values.includes(getData(option, "value", false)?.toLocaleLowerCase() ?? "")) selected.push(option);
403
+ }
404
+ applyOptionListSelection({
405
+ emit,
406
+ selected,
407
+ state,
408
+ added: true,
409
+ option: selected[0] ?? options.all[0],
410
+ values: autocomplete.none && !listbox ? values : void 0
411
+ });
412
+ }
413
+ function toggleOptionListOption(state, option) {
414
+ const { autocomplete, callbacks, listbox, multiple, options } = state.component;
415
+ if (option == null || !multiple && options.selected.includes(option)) {
416
+ callbacks.data.onToggle(state);
417
+ return;
418
+ }
419
+ const selected = options.selected.slice();
420
+ let added = true;
421
+ if (multiple) {
422
+ const index = selected.indexOf(option);
423
+ if (index === -1) selected.push(option);
424
+ else {
425
+ added = false;
426
+ selected.splice(index, 1);
427
+ }
428
+ } else selected.splice(0, selected.length, option);
429
+ const values = autocomplete.none && !listbox && option != null ? [option.textContent] : void 0;
430
+ applyOptionListSelection({
431
+ added,
432
+ option,
433
+ selected,
434
+ state,
435
+ values,
436
+ scroll: false
437
+ });
438
+ callbacks.data.onToggle(state);
439
+ }
440
+ //#endregion
441
+ export { setOptionListDisabled as C, setOptionListReadonly as D, setOptionListMultiple as E, setOptionListRequired as O, getOptionListVisibleOptions as S, setOptionListLimit as T, createOptionListValueLabel as _, setOptionListValue as a, updateOptionListValueLabel as b, createOptionListContent as c, createOptionListHeader as d, createOptionListInput as f, createOptionListOptions as g, createOptionListOption as h, filterOptionListOptions as i, createOptionListFilter as l, createOptionListMessage as m, filterOptionList as n, setOptionListValues as o, createOptionListList as p, filterOptionListOption as r, toggleOptionListOption as s, applyOptionListSelection as t, createOptionListGroup as u, updateOptionListMessage as v, setOptionListFilter as w, generateOptionListIds as x, updateOptionListPreview as y };
@@ -0,0 +1,169 @@
1
+ import { _ as OuiLocalizationsValues, p as OuiLocalizations } from "./l10n.model-D1E1u35L.mjs";
2
+ import { PlainObject } from "@oscarpalmer/atoms/models";
3
+ import { RemovableEventListener } from "@oscarpalmer/toretto/models";
4
+ //#region src/js/internal/option-list/option-list.model.d.ts
5
+ type CreateOptionListContent = {
6
+ element: HTMLDivElement;
7
+ filter?: CreateOptionListFilter;
8
+ list: CreateOptionListList;
9
+ message: HTMLDivElement;
10
+ value: HTMLSpanElement;
11
+ };
12
+ type CreateOptionListContentParameters = {
13
+ attributes: OptionListAttributes;
14
+ autocomplete: OptionListAutoComplete;
15
+ element: Element;
16
+ id: string;
17
+ label: HTMLLabelElement;
18
+ listbox: boolean;
19
+ multiple: boolean;
20
+ select: HTMLSelectElement;
21
+ type: OptionListType;
22
+ };
23
+ type CreateOptionListFilter = {
24
+ container: Element;
25
+ element: HTMLInputElement;
26
+ };
27
+ type CreateOptionListGroupParameters = {
28
+ group: HTMLOptGroupElement;
29
+ groupOptions: HTMLOptionElement[];
30
+ original: CreateOptionListContentParameters;
31
+ selected: Element[];
32
+ type: OptionListType;
33
+ };
34
+ type CreateOptionListList = {
35
+ element: HTMLUListElement;
36
+ groups?: OptionListGroup[];
37
+ options: OptionListOptions;
38
+ };
39
+ type CreateOptionListOptionParameters = {
40
+ group?: string;
41
+ index: number;
42
+ option: HTMLOptionElement;
43
+ original: CreateOptionListContentParameters;
44
+ type: OptionListType;
45
+ };
46
+ type CreateOptionListOptionsParameters = {
47
+ group?: string;
48
+ list: Element;
49
+ options: HTMLOptionElement[];
50
+ original: CreateOptionListContentParameters;
51
+ selected: Element[];
52
+ type: OptionListType;
53
+ };
54
+ type OptionListAttributes = {
55
+ active: string;
56
+ content: string;
57
+ empty: string;
58
+ filter: string;
59
+ group: string;
60
+ header: string;
61
+ hidden: string;
62
+ input: string;
63
+ list: string;
64
+ message: string;
65
+ option: string;
66
+ };
67
+ type OptionListAutoComplete = Record<OptionListAutoCompleteType, boolean> & {
68
+ value?: OptionListAutoCompleteType;
69
+ };
70
+ type OptionListAutoCompleteType = "both" | "inline" | "list" | "none";
71
+ type OptionListCallbacks<State extends PlainObject, Localizations extends OuiLocalizationsValues> = {
72
+ data: OptionListCallbacksData<State, Localizations>;
73
+ keydown: OptionListCallbacksKeydown<State, Localizations>;
74
+ };
75
+ type OptionListCallbacksData<State extends PlainObject, Localizations extends OuiLocalizationsValues> = {
76
+ onApply: OptionListCallbacksDataOnApply<State, Localizations>;
77
+ onFilter: OptionListCallbacksDataOnFilter<State, Localizations>;
78
+ onForm: (state: OptionListState<State, Localizations>) => void;
79
+ onPreview: OptionListCallbacksDataOnPreview<State, Localizations>;
80
+ onToggle: (state: OptionListState<State, Localizations>) => void;
81
+ };
82
+ type OptionListCallbacksDataOnApply<State extends PlainObject, Localizations extends OuiLocalizationsValues> = (state: OptionListState<State, Localizations>, option: Element | undefined, values: string[], added: boolean, selected?: Element[], emit?: boolean) => void;
83
+ type OptionListCallbacksDataOnFilter<State extends PlainObject, Localizations extends OuiLocalizationsValues> = (preview: OptionListPreview, state: OptionListState<State, Localizations>, update: boolean, active?: Element, emit?: boolean) => void;
84
+ type OptionListCallbacksDataOnPreview<State extends PlainObject, Localizations extends OuiLocalizationsValues> = (preview: OptionListPreview, state: OptionListState<State, Localizations>, active?: Element) => void;
85
+ type OptionListCallbacksKeydown<State extends PlainObject, Localizations extends OuiLocalizationsValues> = {
86
+ onActivation?: (state: OptionListState<State, Localizations>) => void;
87
+ onEnter?: (state: OptionListState<State, Localizations>) => void;
88
+ onEscape?: (state: OptionListState<State, Localizations>) => void;
89
+ onNavigation: OptionListCallbacksDataOnNavigation<State, Localizations>;
90
+ onSelection?: (state: OptionListState<State, Localizations>) => void;
91
+ onTab?: (state: OptionListState<State, Localizations>) => void;
92
+ onToggle?: (state: OptionListState<State, Localizations>) => void;
93
+ preventActivation?: (state: OptionListState<State, Localizations>) => boolean;
94
+ skipNavigation?: (state: OptionListState<State, Localizations>) => boolean;
95
+ };
96
+ type OptionListCallbacksDataOnNavigation<State extends PlainObject, Localizations extends OuiLocalizationsValues> = (preview: OptionListPreview, state: OptionListState<State, Localizations>, active?: HTMLElement) => void;
97
+ type OptionListFilter = {
98
+ element: HTMLInputElement;
99
+ value: string;
100
+ };
101
+ type OptionListGroup = {
102
+ element: HTMLElement;
103
+ header: HTMLElement;
104
+ options: HTMLElement[];
105
+ };
106
+ type OptionListLabel = {
107
+ element: HTMLLabelElement;
108
+ id: string;
109
+ };
110
+ type OptionListLocalizationValues = {
111
+ empty: string | (() => string);
112
+ input: string | (() => string);
113
+ invalid: string | (() => string);
114
+ max: string | ((max: number) => string);
115
+ min: string | ((min: number) => string);
116
+ remove: string | ((label: string, value: string) => string);
117
+ results: string | ((amount: number) => string);
118
+ selected: string | ((amount: number) => string);
119
+ };
120
+ type OptionListOptions = {
121
+ all: HTMLElement[];
122
+ selected: HTMLElement[];
123
+ };
124
+ type OptionListPreview = "none" | "set" | "typed";
125
+ type OptionListState<State extends PlainObject, Localizations extends OuiLocalizationsValues> = {
126
+ component: OptionListStateComponent<State, Localizations>;
127
+ form: OptionListStateForm;
128
+ };
129
+ type OptionListStateComponent<State extends PlainObject, Localizations extends OuiLocalizationsValues> = {
130
+ active?: HTMLElement;
131
+ attributes: OptionListAttributes;
132
+ autocomplete: OptionListAutoComplete;
133
+ callbacks: OptionListCallbacks<State, Localizations>;
134
+ content: HTMLDivElement;
135
+ disabled: boolean;
136
+ elements: Array<Element | undefined>;
137
+ filter: OptionListFilter;
138
+ groups?: OptionListGroup[];
139
+ host: Element;
140
+ id: string;
141
+ label: OptionListLabel;
142
+ list: HTMLUListElement;
143
+ listbox: boolean;
144
+ listeners: RemovableEventListener[];
145
+ localizations: OuiLocalizations<OptionListLocalizationValues & Localizations>;
146
+ max?: number;
147
+ min?: number;
148
+ message: HTMLElement;
149
+ multiple: boolean;
150
+ name: string;
151
+ options: OptionListOptions;
152
+ readonly: boolean;
153
+ required: boolean;
154
+ select: HTMLSelectElement;
155
+ type: OptionListType;
156
+ values: OptionListValues;
157
+ } & State;
158
+ type OptionListStateForm = {
159
+ internals: ElementInternals;
160
+ restored?: unknown[];
161
+ };
162
+ type OptionListType = "autocomplete" | "select";
163
+ type OptionListValues = {
164
+ current: string[];
165
+ initial: string[];
166
+ label: Element;
167
+ };
168
+ //#endregion
169
+ export { OptionListType as _, CreateOptionListList as a, OptionListAttributes as c, OptionListCallbacks as d, OptionListGroup as f, OptionListState as g, OptionListPreview as h, CreateOptionListGroupParameters as i, OptionListAutoComplete as l, OptionListOptions as m, CreateOptionListContentParameters as n, CreateOptionListOptionParameters as o, OptionListLocalizationValues as p, CreateOptionListFilter as r, CreateOptionListOptionsParameters as s, CreateOptionListContent as t, OptionListAutoCompleteType as u };
@@ -0,0 +1,12 @@
1
+ import { n as OuiPopoverState, t as OuiPopover } from "../popover.model-DiLdz0Hc.mjs";
2
+ //#region src/js/popover/index.d.ts
3
+ declare function OuiPopover(this: OuiPopover, state: OuiPopoverState): void;
4
+ /**
5
+ * Get the _OuiPopover_ for an element
6
+ *
7
+ * @param element Element to get _OuiPopover_ for
8
+ * @returns _OuiPopover_ instance
9
+ */
10
+ export declare function getPopover(element: Element): OuiPopover | undefined;
11
+ //#endregion
12
+ export type { OuiPopover };