@agnos-ui/core 0.2.0 → 0.3.1

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 (143) hide show
  1. package/README.md +3 -3
  2. package/accordion-BaWN0_n-.js +330 -0
  3. package/accordion-BuIgxZ0S.cjs +329 -0
  4. package/alert-C4jCg9Pl.cjs +8 -0
  5. package/alert-Dlf-BV98.js +9 -0
  6. package/common-DRdsw5m8.js +76 -0
  7. package/common-nJRMXbwj.cjs +75 -0
  8. package/components/accordion/accordion.d.ts +38 -49
  9. package/components/accordion/index.cjs +7 -0
  10. package/components/accordion/index.js +7 -1
  11. package/components/alert/alert.d.ts +3 -12
  12. package/components/alert/common.d.ts +4 -13
  13. package/components/alert/index.cjs +10 -0
  14. package/components/alert/index.js +10 -2
  15. package/components/modal/index.cjs +7 -0
  16. package/components/modal/index.js +7 -1
  17. package/components/modal/modal.d.ts +7 -49
  18. package/components/pagination/index.cjs +5 -0
  19. package/components/pagination/index.d.ts +0 -1
  20. package/components/pagination/index.js +5 -2
  21. package/components/pagination/pagination.d.ts +68 -139
  22. package/components/progressbar/index.cjs +5 -0
  23. package/components/progressbar/index.js +5 -1
  24. package/components/progressbar/progressbar.d.ts +6 -22
  25. package/components/rating/index.cjs +5 -0
  26. package/components/rating/index.js +5 -1
  27. package/components/rating/rating.d.ts +16 -11
  28. package/components/select/index.cjs +6 -0
  29. package/components/select/index.js +6 -1
  30. package/components/select/select.d.ts +15 -33
  31. package/components/slider/index.cjs +5 -0
  32. package/components/slider/index.js +5 -1
  33. package/components/slider/slider.d.ts +29 -35
  34. package/components/toast/index.cjs +5 -0
  35. package/components/toast/index.js +5 -1
  36. package/components/toast/toast.d.ts +11 -8
  37. package/config.cjs +38 -0
  38. package/config.d.ts +1 -1
  39. package/config.js +35 -50
  40. package/directive-BTSEYLF3.cjs +404 -0
  41. package/directive-DCYlDznf.js +405 -0
  42. package/func-DR0n-ShK.js +7 -0
  43. package/func-Qd3cD9a3.cjs +6 -0
  44. package/index.cjs +119 -0
  45. package/index.d.ts +1 -1
  46. package/index.js +119 -33
  47. package/modal-BI2qUu1M.js +251 -0
  48. package/modal-rzMpATf5.cjs +250 -0
  49. package/package.json +29 -19
  50. package/pagination--GkwduJn.js +263 -0
  51. package/pagination-EWSWQT1I.cjs +262 -0
  52. package/progressbar-DH7DHYMp.cjs +83 -0
  53. package/progressbar-DuRX7_my.js +84 -0
  54. package/promise-BMJ8qhA8.cjs +118 -0
  55. package/promise-CY2U8bTP.js +119 -0
  56. package/rating-BR5wD7y2.js +173 -0
  57. package/rating-CmuYUSxy.cjs +172 -0
  58. package/select-BCs6HQWn.js +358 -0
  59. package/select-CCIKn8WR.cjs +357 -0
  60. package/services/extendWidget.cjs +32 -0
  61. package/services/extendWidget.d.ts +2 -1
  62. package/services/extendWidget.js +31 -34
  63. package/services/floatingUI.cjs +131 -0
  64. package/services/floatingUI.d.ts +30 -14
  65. package/services/floatingUI.js +128 -102
  66. package/services/focustrack.cjs +47 -0
  67. package/services/focustrack.js +45 -44
  68. package/services/hash.cjs +15 -0
  69. package/services/hash.js +14 -12
  70. package/services/intersection.cjs +53 -0
  71. package/services/intersection.js +48 -50
  72. package/services/matchMedia.cjs +13 -0
  73. package/services/matchMedia.d.ts +7 -0
  74. package/services/matchMedia.js +13 -0
  75. package/services/navManager.cjs +196 -0
  76. package/services/navManager.d.ts +9 -9
  77. package/services/navManager.js +186 -168
  78. package/services/portal.cjs +43 -0
  79. package/services/portal.js +41 -42
  80. package/services/resizeObserver.cjs +32 -0
  81. package/services/resizeObserver.d.ts +1 -1
  82. package/services/resizeObserver.js +31 -28
  83. package/services/siblingsInert.cjs +40 -0
  84. package/services/siblingsInert.js +31 -31
  85. package/services/transitions/baseTransitions.cjs +171 -0
  86. package/services/transitions/baseTransitions.d.ts +16 -16
  87. package/services/transitions/baseTransitions.js +159 -170
  88. package/services/transitions/collapse.cjs +44 -0
  89. package/services/transitions/collapse.js +41 -49
  90. package/services/transitions/cssTransitions.cjs +32 -0
  91. package/services/transitions/cssTransitions.d.ts +2 -1
  92. package/services/transitions/cssTransitions.js +29 -39
  93. package/services/transitions/simpleClassTransition.cjs +31 -0
  94. package/services/transitions/simpleClassTransition.js +30 -41
  95. package/slider-CA_fszn7.js +536 -0
  96. package/slider-DsLvT87U.cjs +535 -0
  97. package/toast-8tWp6x89.js +63 -0
  98. package/toast-Aw8o0Iwe.cjs +62 -0
  99. package/types.cjs +12 -0
  100. package/types.d.ts +21 -1
  101. package/types.js +11 -13
  102. package/utils/directive.cjs +26 -0
  103. package/utils/directive.d.ts +148 -5
  104. package/utils/directive.js +25 -205
  105. package/utils/internal/dom.d.ts +43 -4
  106. package/utils/internal/promise.d.ts +2 -2
  107. package/utils/internal/ssrHTMLElement.d.ts +7 -0
  108. package/utils/stores.cjs +163 -0
  109. package/utils/stores.d.ts +9 -17
  110. package/utils/stores.js +149 -284
  111. package/utils/writables.cjs +13 -0
  112. package/utils/writables.js +12 -71
  113. package/writables-D46sFgGK.cjs +85 -0
  114. package/writables-DoU_XYTX.js +86 -0
  115. package/components/accordion/accordion.js +0 -264
  116. package/components/alert/alert.js +0 -22
  117. package/components/alert/common.js +0 -69
  118. package/components/commonProps.js +0 -1
  119. package/components/modal/modal.js +0 -186
  120. package/components/pagination/bootstrap.d.ts +0 -8
  121. package/components/pagination/bootstrap.js +0 -110
  122. package/components/pagination/pagination.js +0 -195
  123. package/components/progressbar/progressbar.js +0 -78
  124. package/components/rating/rating.js +0 -137
  125. package/components/select/select.js +0 -297
  126. package/components/slider/slider.js +0 -420
  127. package/components/toast/toast.js +0 -43
  128. package/services/transitions/bootstrap/collapse.d.ts +0 -2
  129. package/services/transitions/bootstrap/collapse.js +0 -15
  130. package/services/transitions/bootstrap/fade.d.ts +0 -1
  131. package/services/transitions/bootstrap/fade.js +0 -7
  132. package/services/transitions/bootstrap.d.ts +0 -2
  133. package/services/transitions/bootstrap.js +0 -2
  134. package/utils/internal/checks.js +0 -60
  135. package/utils/internal/dom.js +0 -82
  136. package/utils/internal/func.js +0 -11
  137. package/utils/internal/isFocusable.js +0 -37
  138. package/utils/internal/math.js +0 -13
  139. package/utils/internal/promise.js +0 -169
  140. package/utils/internal/scrollbars.js +0 -33
  141. package/utils/internal/sort.js +0 -28
  142. package/utils/internal/textDirection.js +0 -7
  143. package/utils/internal/traversal.js +0 -105
@@ -0,0 +1,358 @@
1
+ import { computed, writable, asWritable, batch } from "@amadeus-it-group/tansu";
2
+ import { offset, autoPlacement, size } from "@floating-ui/dom";
3
+ import { createFloatingUI } from "./services/floatingUI.js";
4
+ import { createHasFocus } from "./services/focustrack.js";
5
+ import { createNavManager } from "./services/navManager.js";
6
+ import { t as generateId, k as mergeDirectives, a as bindDirective, n as createAttributesDirective } from "./directive-DCYlDznf.js";
7
+ import { n as noop } from "./func-DR0n-ShK.js";
8
+ import { writablesForProps, bindableProp, bindableDerived, stateStores } from "./utils/stores.js";
9
+ const defaultConfig = {
10
+ id: void 0,
11
+ ariaLabel: "Select",
12
+ open: false,
13
+ disabled: false,
14
+ items: [],
15
+ filterText: "",
16
+ loading: false,
17
+ selected: [],
18
+ navSelector: (node) => node.querySelectorAll(".au-select-badge,input"),
19
+ itemIdFn: (item) => "" + item,
20
+ onOpenChange: noop,
21
+ onFilterTextChange: noop,
22
+ onSelectedChange: noop,
23
+ allowedPlacements: ["bottom-start", "top-start", "bottom-end", "top-end"],
24
+ className: "",
25
+ menuClassName: "",
26
+ menuItemClassName: "",
27
+ badgeClassName: ""
28
+ };
29
+ function getSelectDefaultConfig() {
30
+ return { ...defaultConfig };
31
+ }
32
+ function createSelect(config) {
33
+ const [
34
+ {
35
+ id$: _dirtyId$,
36
+ open$: _dirtyOpen$,
37
+ filterText$: _dirtyFilterText$,
38
+ items$,
39
+ itemIdFn$,
40
+ onOpenChange$,
41
+ onFilterTextChange$,
42
+ onSelectedChange$,
43
+ allowedPlacements$,
44
+ navSelector$,
45
+ className$,
46
+ badgeClassName$,
47
+ ariaLabel$,
48
+ menuClassName$,
49
+ ...stateProps
50
+ },
51
+ patch
52
+ ] = writablesForProps(defaultConfig, config);
53
+ const { selected$ } = stateProps;
54
+ const id$ = computed(() => _dirtyId$() ?? generateId());
55
+ const filterText$ = bindableProp(_dirtyFilterText$, onFilterTextChange$);
56
+ const { hasFocus$, directive: hasFocusDirective } = createHasFocus();
57
+ const open$ = bindableDerived(onOpenChange$, [_dirtyOpen$, hasFocus$], ([_dirtyOpen, hasFocus]) => _dirtyOpen && hasFocus);
58
+ const selectedContextsMap$ = computed(() => {
59
+ const selectedItemsContext = /* @__PURE__ */ new Map();
60
+ const itemIdFn = itemIdFn$();
61
+ for (const item of selected$()) {
62
+ const id = itemIdFn(item);
63
+ selectedItemsContext.set(id, {
64
+ item,
65
+ id: itemIdFn(item),
66
+ selected: true
67
+ });
68
+ }
69
+ return selectedItemsContext;
70
+ });
71
+ const selectedContexts$ = computed(() => [...selectedContextsMap$().values()]);
72
+ const highlightedIndex$ = function() {
73
+ const store = writable(0);
74
+ return asWritable(store, (index) => {
75
+ const { length } = visibleItems$();
76
+ if (index != void 0) {
77
+ if (!length) {
78
+ index = void 0;
79
+ } else if (index < 0) {
80
+ index = length - 1;
81
+ } else if (index >= length) {
82
+ index = 0;
83
+ }
84
+ }
85
+ store.set(index);
86
+ });
87
+ }();
88
+ const itemContexts$ = computed(() => {
89
+ const itemContexts = /* @__PURE__ */ new Map();
90
+ if (open$()) {
91
+ const selectedContextsMap = selectedContextsMap$();
92
+ const itemIdFn = itemIdFn$();
93
+ for (const item of items$()) {
94
+ const id = itemIdFn(item);
95
+ itemContexts.set(id, {
96
+ item,
97
+ id,
98
+ selected: selectedContextsMap.has(id)
99
+ });
100
+ }
101
+ }
102
+ return itemContexts;
103
+ });
104
+ const visibleItems$ = computed(() => open$() ? [...itemContexts$().values()] : []);
105
+ const highlighted$ = computed(() => {
106
+ const visibleItems = visibleItems$();
107
+ const highlightedIndex = highlightedIndex$();
108
+ return visibleItems.length && highlightedIndex != void 0 ? visibleItems[highlightedIndex] : void 0;
109
+ });
110
+ const {
111
+ directives: { floatingDirective, referenceDirective },
112
+ stores: { placement$ }
113
+ } = createFloatingUI({
114
+ props: {
115
+ computePositionOptions: asWritable(
116
+ computed(() => ({
117
+ middleware: [
118
+ offset(5),
119
+ autoPlacement({
120
+ allowedPlacements: allowedPlacements$()
121
+ }),
122
+ size()
123
+ ]
124
+ }))
125
+ )
126
+ }
127
+ });
128
+ const { directive: navDirective, refreshElements, focusFirst, focusLast, focusLeft, focusRight } = createNavManager();
129
+ const navManagerConfig$ = computed(
130
+ () => ({
131
+ keys: {
132
+ Home: focusFirst,
133
+ End: focusLast,
134
+ ArrowLeft: focusLeft,
135
+ ArrowRight: focusRight
136
+ },
137
+ selector: navSelector$()
138
+ })
139
+ );
140
+ const onRemoveBadge = (event, item) => {
141
+ const referenceElement = event.target;
142
+ refreshElements();
143
+ widget.api.unselect(item);
144
+ if (referenceElement instanceof HTMLElement) {
145
+ setTimeout(() => {
146
+ focusLeft({ event, referenceElement }) || focusRight({ event, referenceElement });
147
+ });
148
+ }
149
+ event.preventDefault();
150
+ };
151
+ const inputContainerAttributesDirective = createAttributesDirective(() => ({
152
+ attributes: {
153
+ role: "combobox",
154
+ "aria-haspopup": "listbox",
155
+ "aria-expanded": computed(() => `${open$()}`),
156
+ "aria-controls": computed(() => `${id$()}-menu`)
157
+ }
158
+ }));
159
+ const badgeAttributesDirective = createAttributesDirective((itemContext$) => ({
160
+ attributes: {
161
+ tabindex: -1,
162
+ class: badgeClassName$
163
+ },
164
+ classNames: {
165
+ "au-select-badge": true
166
+ },
167
+ events: {
168
+ keydown: (e) => widget.actions.onBadgeKeydown(e, itemContext$().item)
169
+ }
170
+ }));
171
+ const menuAttributesDirective = createAttributesDirective(() => ({
172
+ attributes: {
173
+ role: "listbox",
174
+ id: computed(() => `${id$()}-menu`),
175
+ "data-popper-placement": placement$,
176
+ class: menuClassName$
177
+ },
178
+ events: {
179
+ mousedown: (e) => e.preventDefault()
180
+ }
181
+ }));
182
+ const itemAttributesDirective = createAttributesDirective((itemContext$) => ({
183
+ attributes: {
184
+ role: "option",
185
+ "aria-selected": computed(() => `${itemContext$().selected}`),
186
+ style: "cursor: pointer"
187
+ },
188
+ classNames: {
189
+ "au-select-item": true,
190
+ selected: computed(() => itemContext$().selected)
191
+ },
192
+ events: {
193
+ click: () => widget.api.toggleItem(itemContext$().item)
194
+ }
195
+ }));
196
+ const widget = {
197
+ ...stateStores({
198
+ id$,
199
+ visibleItems$,
200
+ highlighted$,
201
+ open$,
202
+ selectedContexts$,
203
+ filterText$,
204
+ placement$,
205
+ className$,
206
+ badgeClassName$,
207
+ ariaLabel$,
208
+ menuClassName$,
209
+ ...stateProps
210
+ }),
211
+ patch,
212
+ api: {
213
+ clear() {
214
+ selected$.set([]);
215
+ },
216
+ select(item) {
217
+ widget.api.toggleItem(item, true);
218
+ },
219
+ unselect(item) {
220
+ widget.api.toggleItem(item, false);
221
+ },
222
+ toggleItem(item, selected) {
223
+ const itemIdFn = itemIdFn$();
224
+ const itemId = itemIdFn(item);
225
+ const selectedContextsMap = selectedContextsMap$();
226
+ const isInSelected = selectedContextsMap.has(itemId);
227
+ if (selected == null) {
228
+ selected = !isInSelected;
229
+ }
230
+ if (selected && !itemContexts$().has(itemId) || !selected && !isInSelected) {
231
+ return;
232
+ }
233
+ selected$.update((selectedItems) => {
234
+ var _a;
235
+ selectedItems = [...selectedItems];
236
+ if (selected && !isInSelected) {
237
+ selectedItems.push(item);
238
+ } else if (!selected && isInSelected) {
239
+ const index = selectedItems.findIndex((item2) => itemIdFn(item2) === itemId);
240
+ selectedItems.splice(index, 1);
241
+ }
242
+ (_a = onSelectedChange$()) == null ? void 0 : _a(selectedItems);
243
+ return selectedItems;
244
+ });
245
+ },
246
+ clearText() {
247
+ },
248
+ highlight(item) {
249
+ const index = visibleItems$().findIndex((itemCtx) => itemCtx.item === item);
250
+ highlightedIndex$.set(index === -1 ? void 0 : index);
251
+ },
252
+ highlightFirst() {
253
+ highlightedIndex$.set(0);
254
+ },
255
+ highlightPrevious() {
256
+ highlightedIndex$.update((highlightedIndex) => {
257
+ return highlightedIndex != null ? highlightedIndex - 1 : -1;
258
+ });
259
+ },
260
+ highlightNext() {
261
+ highlightedIndex$.update((highlightedIndex) => {
262
+ return highlightedIndex != null ? highlightedIndex + 1 : Infinity;
263
+ });
264
+ },
265
+ highlightLast() {
266
+ highlightedIndex$.set(-1);
267
+ },
268
+ open: () => widget.api.toggle(true),
269
+ close: () => widget.api.toggle(false),
270
+ toggle(isOpen) {
271
+ open$.update((value) => isOpen != null ? isOpen : !value);
272
+ }
273
+ },
274
+ directives: {
275
+ hasFocusDirective,
276
+ floatingDirective,
277
+ referenceDirective,
278
+ inputContainerDirective: mergeDirectives(bindDirective(navDirective, navManagerConfig$), inputContainerAttributesDirective),
279
+ badgeAttributesDirective,
280
+ menuAttributesDirective,
281
+ itemAttributesDirective
282
+ },
283
+ actions: {
284
+ onInput({ target }) {
285
+ const value = target.value;
286
+ batch(() => {
287
+ open$.set(value != null && value !== "");
288
+ filterText$.set(value);
289
+ });
290
+ },
291
+ onRemoveBadgeClick(event, item) {
292
+ onRemoveBadge(event, item);
293
+ },
294
+ onInputKeydown(e) {
295
+ const { ctrlKey, key } = e;
296
+ let keyManaged = true;
297
+ switch (key) {
298
+ case "ArrowDown": {
299
+ const isOpen = open$();
300
+ if (isOpen) {
301
+ if (ctrlKey) {
302
+ widget.api.highlightLast();
303
+ } else {
304
+ widget.api.highlightNext();
305
+ }
306
+ } else {
307
+ widget.api.open();
308
+ widget.api.highlightFirst();
309
+ }
310
+ break;
311
+ }
312
+ case "ArrowUp":
313
+ if (ctrlKey) {
314
+ widget.api.highlightFirst();
315
+ } else {
316
+ widget.api.highlightPrevious();
317
+ }
318
+ break;
319
+ case "Enter": {
320
+ const itemCtx = highlighted$();
321
+ if (itemCtx) {
322
+ widget.api.toggleItem(itemCtx.item);
323
+ }
324
+ break;
325
+ }
326
+ case "Escape":
327
+ open$.set(false);
328
+ break;
329
+ default:
330
+ keyManaged = false;
331
+ }
332
+ if (keyManaged) {
333
+ e.preventDefault();
334
+ }
335
+ },
336
+ onBadgeKeydown(event, item) {
337
+ let keyManaged = false;
338
+ switch (event.key) {
339
+ case "Backspace":
340
+ case "Delete": {
341
+ onRemoveBadge(event, item);
342
+ keyManaged = true;
343
+ break;
344
+ }
345
+ }
346
+ if (keyManaged) {
347
+ event.preventDefault();
348
+ }
349
+ }
350
+ }
351
+ };
352
+ return widget;
353
+ }
354
+ export {
355
+ createSelect as c,
356
+ defaultConfig as d,
357
+ getSelectDefaultConfig as g
358
+ };
@@ -0,0 +1,357 @@
1
+ "use strict";
2
+ const tansu = require("@amadeus-it-group/tansu");
3
+ const dom = require("@floating-ui/dom");
4
+ const services_floatingUI = require("./services/floatingUI.cjs");
5
+ const services_focustrack = require("./services/focustrack.cjs");
6
+ const services_navManager = require("./services/navManager.cjs");
7
+ const utils_directive = require("./directive-BTSEYLF3.cjs");
8
+ const func = require("./func-Qd3cD9a3.cjs");
9
+ const utils_stores = require("./utils/stores.cjs");
10
+ const defaultConfig = {
11
+ id: void 0,
12
+ ariaLabel: "Select",
13
+ open: false,
14
+ disabled: false,
15
+ items: [],
16
+ filterText: "",
17
+ loading: false,
18
+ selected: [],
19
+ navSelector: (node) => node.querySelectorAll(".au-select-badge,input"),
20
+ itemIdFn: (item) => "" + item,
21
+ onOpenChange: func.noop,
22
+ onFilterTextChange: func.noop,
23
+ onSelectedChange: func.noop,
24
+ allowedPlacements: ["bottom-start", "top-start", "bottom-end", "top-end"],
25
+ className: "",
26
+ menuClassName: "",
27
+ menuItemClassName: "",
28
+ badgeClassName: ""
29
+ };
30
+ function getSelectDefaultConfig() {
31
+ return { ...defaultConfig };
32
+ }
33
+ function createSelect(config) {
34
+ const [
35
+ {
36
+ id$: _dirtyId$,
37
+ open$: _dirtyOpen$,
38
+ filterText$: _dirtyFilterText$,
39
+ items$,
40
+ itemIdFn$,
41
+ onOpenChange$,
42
+ onFilterTextChange$,
43
+ onSelectedChange$,
44
+ allowedPlacements$,
45
+ navSelector$,
46
+ className$,
47
+ badgeClassName$,
48
+ ariaLabel$,
49
+ menuClassName$,
50
+ ...stateProps
51
+ },
52
+ patch
53
+ ] = utils_stores.writablesForProps(defaultConfig, config);
54
+ const { selected$ } = stateProps;
55
+ const id$ = tansu.computed(() => _dirtyId$() ?? utils_directive.generateId());
56
+ const filterText$ = utils_stores.bindableProp(_dirtyFilterText$, onFilterTextChange$);
57
+ const { hasFocus$, directive: hasFocusDirective } = services_focustrack.createHasFocus();
58
+ const open$ = utils_stores.bindableDerived(onOpenChange$, [_dirtyOpen$, hasFocus$], ([_dirtyOpen, hasFocus]) => _dirtyOpen && hasFocus);
59
+ const selectedContextsMap$ = tansu.computed(() => {
60
+ const selectedItemsContext = /* @__PURE__ */ new Map();
61
+ const itemIdFn = itemIdFn$();
62
+ for (const item of selected$()) {
63
+ const id = itemIdFn(item);
64
+ selectedItemsContext.set(id, {
65
+ item,
66
+ id: itemIdFn(item),
67
+ selected: true
68
+ });
69
+ }
70
+ return selectedItemsContext;
71
+ });
72
+ const selectedContexts$ = tansu.computed(() => [...selectedContextsMap$().values()]);
73
+ const highlightedIndex$ = function() {
74
+ const store = tansu.writable(0);
75
+ return tansu.asWritable(store, (index) => {
76
+ const { length } = visibleItems$();
77
+ if (index != void 0) {
78
+ if (!length) {
79
+ index = void 0;
80
+ } else if (index < 0) {
81
+ index = length - 1;
82
+ } else if (index >= length) {
83
+ index = 0;
84
+ }
85
+ }
86
+ store.set(index);
87
+ });
88
+ }();
89
+ const itemContexts$ = tansu.computed(() => {
90
+ const itemContexts = /* @__PURE__ */ new Map();
91
+ if (open$()) {
92
+ const selectedContextsMap = selectedContextsMap$();
93
+ const itemIdFn = itemIdFn$();
94
+ for (const item of items$()) {
95
+ const id = itemIdFn(item);
96
+ itemContexts.set(id, {
97
+ item,
98
+ id,
99
+ selected: selectedContextsMap.has(id)
100
+ });
101
+ }
102
+ }
103
+ return itemContexts;
104
+ });
105
+ const visibleItems$ = tansu.computed(() => open$() ? [...itemContexts$().values()] : []);
106
+ const highlighted$ = tansu.computed(() => {
107
+ const visibleItems = visibleItems$();
108
+ const highlightedIndex = highlightedIndex$();
109
+ return visibleItems.length && highlightedIndex != void 0 ? visibleItems[highlightedIndex] : void 0;
110
+ });
111
+ const {
112
+ directives: { floatingDirective, referenceDirective },
113
+ stores: { placement$ }
114
+ } = services_floatingUI.createFloatingUI({
115
+ props: {
116
+ computePositionOptions: tansu.asWritable(
117
+ tansu.computed(() => ({
118
+ middleware: [
119
+ dom.offset(5),
120
+ dom.autoPlacement({
121
+ allowedPlacements: allowedPlacements$()
122
+ }),
123
+ dom.size()
124
+ ]
125
+ }))
126
+ )
127
+ }
128
+ });
129
+ const { directive: navDirective, refreshElements, focusFirst, focusLast, focusLeft, focusRight } = services_navManager.createNavManager();
130
+ const navManagerConfig$ = tansu.computed(
131
+ () => ({
132
+ keys: {
133
+ Home: focusFirst,
134
+ End: focusLast,
135
+ ArrowLeft: focusLeft,
136
+ ArrowRight: focusRight
137
+ },
138
+ selector: navSelector$()
139
+ })
140
+ );
141
+ const onRemoveBadge = (event, item) => {
142
+ const referenceElement = event.target;
143
+ refreshElements();
144
+ widget.api.unselect(item);
145
+ if (referenceElement instanceof HTMLElement) {
146
+ setTimeout(() => {
147
+ focusLeft({ event, referenceElement }) || focusRight({ event, referenceElement });
148
+ });
149
+ }
150
+ event.preventDefault();
151
+ };
152
+ const inputContainerAttributesDirective = utils_directive.createAttributesDirective(() => ({
153
+ attributes: {
154
+ role: "combobox",
155
+ "aria-haspopup": "listbox",
156
+ "aria-expanded": tansu.computed(() => `${open$()}`),
157
+ "aria-controls": tansu.computed(() => `${id$()}-menu`)
158
+ }
159
+ }));
160
+ const badgeAttributesDirective = utils_directive.createAttributesDirective((itemContext$) => ({
161
+ attributes: {
162
+ tabindex: -1,
163
+ class: badgeClassName$
164
+ },
165
+ classNames: {
166
+ "au-select-badge": true
167
+ },
168
+ events: {
169
+ keydown: (e) => widget.actions.onBadgeKeydown(e, itemContext$().item)
170
+ }
171
+ }));
172
+ const menuAttributesDirective = utils_directive.createAttributesDirective(() => ({
173
+ attributes: {
174
+ role: "listbox",
175
+ id: tansu.computed(() => `${id$()}-menu`),
176
+ "data-popper-placement": placement$,
177
+ class: menuClassName$
178
+ },
179
+ events: {
180
+ mousedown: (e) => e.preventDefault()
181
+ }
182
+ }));
183
+ const itemAttributesDirective = utils_directive.createAttributesDirective((itemContext$) => ({
184
+ attributes: {
185
+ role: "option",
186
+ "aria-selected": tansu.computed(() => `${itemContext$().selected}`),
187
+ style: "cursor: pointer"
188
+ },
189
+ classNames: {
190
+ "au-select-item": true,
191
+ selected: tansu.computed(() => itemContext$().selected)
192
+ },
193
+ events: {
194
+ click: () => widget.api.toggleItem(itemContext$().item)
195
+ }
196
+ }));
197
+ const widget = {
198
+ ...utils_stores.stateStores({
199
+ id$,
200
+ visibleItems$,
201
+ highlighted$,
202
+ open$,
203
+ selectedContexts$,
204
+ filterText$,
205
+ placement$,
206
+ className$,
207
+ badgeClassName$,
208
+ ariaLabel$,
209
+ menuClassName$,
210
+ ...stateProps
211
+ }),
212
+ patch,
213
+ api: {
214
+ clear() {
215
+ selected$.set([]);
216
+ },
217
+ select(item) {
218
+ widget.api.toggleItem(item, true);
219
+ },
220
+ unselect(item) {
221
+ widget.api.toggleItem(item, false);
222
+ },
223
+ toggleItem(item, selected) {
224
+ const itemIdFn = itemIdFn$();
225
+ const itemId = itemIdFn(item);
226
+ const selectedContextsMap = selectedContextsMap$();
227
+ const isInSelected = selectedContextsMap.has(itemId);
228
+ if (selected == null) {
229
+ selected = !isInSelected;
230
+ }
231
+ if (selected && !itemContexts$().has(itemId) || !selected && !isInSelected) {
232
+ return;
233
+ }
234
+ selected$.update((selectedItems) => {
235
+ var _a;
236
+ selectedItems = [...selectedItems];
237
+ if (selected && !isInSelected) {
238
+ selectedItems.push(item);
239
+ } else if (!selected && isInSelected) {
240
+ const index = selectedItems.findIndex((item2) => itemIdFn(item2) === itemId);
241
+ selectedItems.splice(index, 1);
242
+ }
243
+ (_a = onSelectedChange$()) == null ? void 0 : _a(selectedItems);
244
+ return selectedItems;
245
+ });
246
+ },
247
+ clearText() {
248
+ },
249
+ highlight(item) {
250
+ const index = visibleItems$().findIndex((itemCtx) => itemCtx.item === item);
251
+ highlightedIndex$.set(index === -1 ? void 0 : index);
252
+ },
253
+ highlightFirst() {
254
+ highlightedIndex$.set(0);
255
+ },
256
+ highlightPrevious() {
257
+ highlightedIndex$.update((highlightedIndex) => {
258
+ return highlightedIndex != null ? highlightedIndex - 1 : -1;
259
+ });
260
+ },
261
+ highlightNext() {
262
+ highlightedIndex$.update((highlightedIndex) => {
263
+ return highlightedIndex != null ? highlightedIndex + 1 : Infinity;
264
+ });
265
+ },
266
+ highlightLast() {
267
+ highlightedIndex$.set(-1);
268
+ },
269
+ open: () => widget.api.toggle(true),
270
+ close: () => widget.api.toggle(false),
271
+ toggle(isOpen) {
272
+ open$.update((value) => isOpen != null ? isOpen : !value);
273
+ }
274
+ },
275
+ directives: {
276
+ hasFocusDirective,
277
+ floatingDirective,
278
+ referenceDirective,
279
+ inputContainerDirective: utils_directive.mergeDirectives(utils_directive.bindDirective(navDirective, navManagerConfig$), inputContainerAttributesDirective),
280
+ badgeAttributesDirective,
281
+ menuAttributesDirective,
282
+ itemAttributesDirective
283
+ },
284
+ actions: {
285
+ onInput({ target }) {
286
+ const value = target.value;
287
+ tansu.batch(() => {
288
+ open$.set(value != null && value !== "");
289
+ filterText$.set(value);
290
+ });
291
+ },
292
+ onRemoveBadgeClick(event, item) {
293
+ onRemoveBadge(event, item);
294
+ },
295
+ onInputKeydown(e) {
296
+ const { ctrlKey, key } = e;
297
+ let keyManaged = true;
298
+ switch (key) {
299
+ case "ArrowDown": {
300
+ const isOpen = open$();
301
+ if (isOpen) {
302
+ if (ctrlKey) {
303
+ widget.api.highlightLast();
304
+ } else {
305
+ widget.api.highlightNext();
306
+ }
307
+ } else {
308
+ widget.api.open();
309
+ widget.api.highlightFirst();
310
+ }
311
+ break;
312
+ }
313
+ case "ArrowUp":
314
+ if (ctrlKey) {
315
+ widget.api.highlightFirst();
316
+ } else {
317
+ widget.api.highlightPrevious();
318
+ }
319
+ break;
320
+ case "Enter": {
321
+ const itemCtx = highlighted$();
322
+ if (itemCtx) {
323
+ widget.api.toggleItem(itemCtx.item);
324
+ }
325
+ break;
326
+ }
327
+ case "Escape":
328
+ open$.set(false);
329
+ break;
330
+ default:
331
+ keyManaged = false;
332
+ }
333
+ if (keyManaged) {
334
+ e.preventDefault();
335
+ }
336
+ },
337
+ onBadgeKeydown(event, item) {
338
+ let keyManaged = false;
339
+ switch (event.key) {
340
+ case "Backspace":
341
+ case "Delete": {
342
+ onRemoveBadge(event, item);
343
+ keyManaged = true;
344
+ break;
345
+ }
346
+ }
347
+ if (keyManaged) {
348
+ event.preventDefault();
349
+ }
350
+ }
351
+ }
352
+ };
353
+ return widget;
354
+ }
355
+ exports.createSelect = createSelect;
356
+ exports.defaultConfig = defaultConfig;
357
+ exports.getSelectDefaultConfig = getSelectDefaultConfig;