bromcom-ui 3.0.0-alpha.3 → 3.0.0-alpha.5

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 (156) hide show
  1. package/dist/bromcom-ui/bromcom-ui.css +1 -1
  2. package/dist/bromcom-ui/bromcom-ui.esm.js +1 -1
  3. package/dist/bromcom-ui/p-01eaca9a.entry.js +5 -0
  4. package/dist/bromcom-ui/{p-dc8b7bd5.entry.js → p-0b7de283.entry.js} +1 -1
  5. package/dist/bromcom-ui/{p-ff8adde6.entry.js → p-0e75f6ba.entry.js} +1 -1
  6. package/dist/bromcom-ui/{p-3a6e9576.entry.js → p-112b9a62.entry.js} +1 -1
  7. package/dist/bromcom-ui/{p-be96827e.js → p-1535f9b1.js} +1 -1
  8. package/dist/bromcom-ui/{p-ef839034.entry.js → p-32ce6cf6.entry.js} +1 -1
  9. package/dist/bromcom-ui/{p-33d97b3f.entry.js → p-33b2ed75.entry.js} +1 -1
  10. package/dist/bromcom-ui/p-3ddd3c83.entry.js +5 -0
  11. package/dist/bromcom-ui/{p-e115af8a.entry.js → p-4545a13d.entry.js} +1 -1
  12. package/dist/bromcom-ui/{p-f1de8ed5.entry.js → p-5532696c.entry.js} +1 -1
  13. package/dist/bromcom-ui/{p-f6e710ff.entry.js → p-69adb859.entry.js} +1 -1
  14. package/dist/bromcom-ui/{p-d0647951.js → p-6ce02d0a.js} +1 -1
  15. package/dist/bromcom-ui/p-7c08789d.entry.js +5 -0
  16. package/dist/bromcom-ui/{p-b7f449ff.entry.js → p-803739bc.entry.js} +1 -1
  17. package/dist/bromcom-ui/{p-3b988ad1.entry.js → p-8390dd02.entry.js} +1 -1
  18. package/dist/bromcom-ui/p-91197b04.js +5 -0
  19. package/dist/bromcom-ui/{p-b9b9d753.entry.js → p-a80e6310.entry.js} +1 -1
  20. package/dist/bromcom-ui/p-aa67918a.entry.js +5 -0
  21. package/dist/bromcom-ui/{p-91aa21af.entry.js → p-acab07ec.entry.js} +1 -1
  22. package/dist/bromcom-ui/{p-a53c3682.entry.js → p-b333a3d7.entry.js} +1 -1
  23. package/dist/bromcom-ui/{p-b386e9c9.entry.js → p-b7787c11.entry.js} +1 -1
  24. package/dist/bromcom-ui/{p-2e7ffc5a.entry.js → p-b7c56cbe.entry.js} +1 -1
  25. package/dist/bromcom-ui/{p-221095a9.entry.js → p-c36a7889.entry.js} +1 -1
  26. package/dist/bromcom-ui/p-ce0ab4e3.entry.js +5 -0
  27. package/dist/bromcom-ui/{p-ee75cd00.js → p-d3cf91a9.js} +1 -1
  28. package/dist/bromcom-ui/p-d5464577.entry.js +16 -0
  29. package/dist/bromcom-ui/{p-bd77f532.entry.js → p-d7a619c5.entry.js} +1 -1
  30. package/dist/bromcom-ui/{p-baa4193d.entry.js → p-e36b6b08.entry.js} +1 -1
  31. package/dist/bromcom-ui/{p-6c7fdf95.entry.js → p-f15c1d3d.entry.js} +1 -1
  32. package/dist/bromcom-ui/{p-8001040c.js → p-fc29c94d.js} +1 -1
  33. package/dist/cjs/bcm-accordion_69.cjs.entry.js +722 -66
  34. package/dist/cjs/bcm-attendance-actions-comment.cjs.entry.js +4 -4
  35. package/dist/cjs/bcm-attendance-actions-dropdown.cjs.entry.js +4 -4
  36. package/dist/cjs/bcm-breadcrumb.cjs.entry.js +2 -2
  37. package/dist/cjs/bcm-caption.cjs.entry.js +4 -4
  38. package/dist/cjs/bcm-card.cjs.entry.js +2 -2
  39. package/dist/cjs/bcm-date-picker.cjs.entry.js +2 -2
  40. package/dist/cjs/bcm-datetime-picker.cjs.entry.js +2 -2
  41. package/dist/cjs/bcm-default.cjs.entry.js +2 -2
  42. package/dist/cjs/bcm-file-upload.cjs.entry.js +578 -0
  43. package/dist/cjs/bcm-form-2.cjs.entry.js +3 -2
  44. package/dist/cjs/bcm-input-2.cjs.entry.js +2 -2
  45. package/dist/cjs/bcm-input-custom.cjs.entry.js +2 -2
  46. package/dist/cjs/bcm-input-dropdown.cjs.entry.js +4 -4
  47. package/dist/cjs/bcm-modal-2-footer.cjs.entry.js +4 -4
  48. package/dist/cjs/bcm-modal-2-header.cjs.entry.js +4 -4
  49. package/dist/cjs/bcm-modal-2.cjs.entry.js +4 -4
  50. package/dist/cjs/bcm-number-input.cjs.entry.js +12 -6
  51. package/dist/cjs/bcm-skeleton.cjs.entry.js +4 -4
  52. package/dist/cjs/bcm-table.cjs.entry.js +4 -4
  53. package/dist/cjs/bcm-tag.cjs.entry.js +3 -3
  54. package/dist/cjs/bcm-time-picker.cjs.entry.js +2 -2
  55. package/dist/cjs/bcm-toast.cjs.entry.js +17 -11
  56. package/dist/cjs/bromcom-ui.cjs.js +3 -3
  57. package/dist/cjs/{generate-554f54dc.js → generate-9d1bf6b3.js} +1 -1
  58. package/dist/cjs/{global-90b5dbce.js → global-d69a64ec.js} +1 -1
  59. package/dist/cjs/loader.cjs.js +3 -3
  60. package/dist/cjs/{number-helper-677e9c02.js → number-helper-ae28b255.js} +1 -1
  61. package/dist/cjs/old-bcm-popover-box.cjs.entry.js +3 -3
  62. package/dist/cjs/old-bcm-popover.cjs.entry.js +2 -2
  63. package/dist/cjs/{package-8445ccd4.js → package-6de220be.js} +1 -1
  64. package/dist/cjs/{validators-92f2f1ef.js → validators-3381bee2.js} +1 -1
  65. package/dist/collection/collection-manifest.json +1 -0
  66. package/dist/collection/components/atoms/button/button.js +1 -1
  67. package/dist/collection/components/atoms/button/types.js +7 -0
  68. package/dist/collection/components/molecules/color-input/color-input.js +5 -22
  69. package/dist/collection/components/molecules/color-palette/color-palette.js +4 -4
  70. package/dist/collection/components/molecules/dropdown/dropdown.js +36 -1
  71. package/dist/collection/components/molecules/linked/linked-focus-manager.js +86 -0
  72. package/dist/collection/components/molecules/linked/linked.js +43 -1
  73. package/dist/collection/components/molecules/number-input/number-input.js +8 -2
  74. package/dist/collection/components/molecules/number-input/react-input.js +1 -1
  75. package/dist/collection/components/molecules/upload/file-upload.component.js +1060 -0
  76. package/dist/collection/components/molecules/upload/file-upload.style.js +201 -0
  77. package/dist/collection/components/organism/form/form.js +1 -0
  78. package/dist/collection/components/organism/form-2/bcm-form-components.js +1 -0
  79. package/dist/collection/components/organism/list/list-focus-manager.js +344 -0
  80. package/dist/collection/components/organism/list/list-key-control.js +9 -4
  81. package/dist/collection/components/organism/list/list.css +8 -3
  82. package/dist/collection/components/organism/list/list.js +227 -27
  83. package/dist/collection/components/other/toast/toast.js +15 -9
  84. package/dist/collection/components/other_deprecated/old-tag/old-tag.js +1 -1
  85. package/dist/collection/components/other_deprecated/tag/tag.js +1 -1
  86. package/dist/collection/templates/list-item-template.js +6 -5
  87. package/dist/collection/templates/list-template.js +2 -2
  88. package/dist/components/bcm-color-input.js +5 -22
  89. package/dist/components/bcm-dropdown.js +35 -0
  90. package/dist/components/bcm-file-upload.d.ts +11 -0
  91. package/dist/components/bcm-file-upload.js +625 -0
  92. package/dist/components/bcm-form-2.js +1 -0
  93. package/dist/components/bcm-number-input.js +8 -2
  94. package/dist/components/bcm-toast.js +15 -9
  95. package/dist/components/button.js +7 -0
  96. package/dist/components/color-palette.js +2 -2
  97. package/dist/components/form.js +1 -0
  98. package/dist/components/generate.js +1 -1
  99. package/dist/components/index.d.ts +1 -0
  100. package/dist/components/index.js +1 -0
  101. package/dist/components/linked.js +105 -2
  102. package/dist/components/list.js +567 -39
  103. package/dist/esm/bcm-accordion_69.entry.js +722 -66
  104. package/dist/esm/bcm-attendance-actions-comment.entry.js +4 -4
  105. package/dist/esm/bcm-attendance-actions-dropdown.entry.js +4 -4
  106. package/dist/esm/bcm-breadcrumb.entry.js +2 -2
  107. package/dist/esm/bcm-caption.entry.js +4 -4
  108. package/dist/esm/bcm-card.entry.js +2 -2
  109. package/dist/esm/bcm-date-picker.entry.js +2 -2
  110. package/dist/esm/bcm-datetime-picker.entry.js +2 -2
  111. package/dist/esm/bcm-default.entry.js +2 -2
  112. package/dist/esm/bcm-file-upload.entry.js +574 -0
  113. package/dist/esm/bcm-form-2.entry.js +3 -2
  114. package/dist/esm/bcm-input-2.entry.js +2 -2
  115. package/dist/esm/bcm-input-custom.entry.js +2 -2
  116. package/dist/esm/bcm-input-dropdown.entry.js +4 -4
  117. package/dist/esm/bcm-modal-2-footer.entry.js +4 -4
  118. package/dist/esm/bcm-modal-2-header.entry.js +4 -4
  119. package/dist/esm/bcm-modal-2.entry.js +4 -4
  120. package/dist/esm/bcm-number-input.entry.js +12 -6
  121. package/dist/esm/bcm-skeleton.entry.js +4 -4
  122. package/dist/esm/bcm-table.entry.js +4 -4
  123. package/dist/esm/bcm-tag.entry.js +3 -3
  124. package/dist/esm/bcm-time-picker.entry.js +2 -2
  125. package/dist/esm/bcm-toast.entry.js +17 -11
  126. package/dist/esm/bromcom-ui.js +3 -3
  127. package/dist/esm/{generate-8a394b83.js → generate-56d49b70.js} +1 -1
  128. package/dist/esm/{global-7919f57f.js → global-97c42a5f.js} +1 -1
  129. package/dist/esm/loader.js +3 -3
  130. package/dist/esm/{number-helper-a86adc72.js → number-helper-455ab41e.js} +1 -1
  131. package/dist/esm/old-bcm-popover-box.entry.js +3 -3
  132. package/dist/esm/old-bcm-popover.entry.js +2 -2
  133. package/dist/esm/{package-278e08d9.js → package-edee14d5.js} +1 -1
  134. package/dist/esm/{validators-89e791a1.js → validators-cc882165.js} +1 -1
  135. package/dist/types/components/atoms/button/types.d.ts +8 -1
  136. package/dist/types/components/molecules/color-input/color-input.d.ts +1 -4
  137. package/dist/types/components/molecules/dropdown/dropdown.d.ts +7 -0
  138. package/dist/types/components/molecules/linked/linked-focus-manager.d.ts +13 -0
  139. package/dist/types/components/molecules/linked/linked.d.ts +3 -0
  140. package/dist/types/components/molecules/number-input/number-input.d.ts +1 -0
  141. package/dist/types/components/molecules/upload/file-upload.component.d.ts +233 -0
  142. package/dist/types/components/molecules/upload/file-upload.style.d.ts +548 -0
  143. package/dist/types/components/organism/list/list-focus-manager.d.ts +53 -0
  144. package/dist/types/components/organism/list/list-key-control.d.ts +1 -0
  145. package/dist/types/components/organism/list/list.d.ts +18 -1
  146. package/dist/types/components/other/toast/toast.d.ts +1 -0
  147. package/dist/types/components.d.ts +417 -1
  148. package/dist/types/templates/list-item-template.d.ts +2 -0
  149. package/dist/types/templates/list-template.d.ts +2 -0
  150. package/package.json +1 -1
  151. package/dist/bromcom-ui/p-16b8a312.entry.js +0 -16
  152. package/dist/bromcom-ui/p-839b6fd5.entry.js +0 -5
  153. package/dist/bromcom-ui/p-be8aa3b8.entry.js +0 -5
  154. package/dist/bromcom-ui/p-d0aa71e1.entry.js +0 -5
  155. package/dist/bromcom-ui/p-df92d838.js +0 -5
  156. package/dist/bromcom-ui/p-dfd73f7c.entry.js +0 -5
@@ -0,0 +1,201 @@
1
+ /*!
2
+ * Built with Stencil
3
+ * Copyright (c) Bromcom.
4
+ */
5
+ import { tv } from 'tailwind-variants';
6
+ const zoneDefaultSurface = 'tw-border-dashed tw-border-color tw-bg-color-default';
7
+ const zoneHoverSurface = '!tw-border-solid !tw-border-color-primaryInfo';
8
+ const zoneDragSurface = '!tw-border-solid !tw-border-color-primaryInfo !tw-bg-primary-50';
9
+ export const uploadClasses = tv({
10
+ slots: {
11
+ container: 'bcm-ui-element tw-flex tw-flex-col tw-w-full',
12
+ label: 'tw-text-3 tw-font-medium tw-text-color-label tw-leading-5',
13
+ triggerWrap: 'tw-flex tw-flex-col tw-w-full',
14
+ zone: [
15
+ 'tw-relative tw-rounded tw-border tw-transition-all tw-duration-200 tw-ease-in-out',
16
+ 'tw-select-none tw-flex tw-items-center tw-justify-center',
17
+ zoneDefaultSurface,
18
+ ],
19
+ iconContainer: 'tw-flex tw-shrink-0 tw-items-center tw-justify-center',
20
+ iconSizeClass: 'tw-block tw-text-color-default',
21
+ zoneTextWrapper: 'tw-flex tw-flex-col tw-flex-1 tw-min-w-0',
22
+ zoneTextMain: 'tw-text-3 tw-font-medium tw-text-color-caption tw-leading-tight',
23
+ zoneLink: 'tw-text-color-primary tw-font-medium hover:tw-underline tw-cursor-pointer',
24
+ zoneTextSub: 'tw-text-2 tw-text-color-caption tw-leading-4',
25
+ list: 'tw-flex tw-flex-col tw-gap-2',
26
+ fileRow: [
27
+ 'tw-flex tw-flex-col tw-rounded tw-min-w-0',
28
+ 'tw-bg-color-default tw-px-4 tw-py-2',
29
+ ],
30
+ fileRowHeader: 'tw-flex tw-items-center tw-gap-2 tw-w-full tw-min-w-0',
31
+ fileIcon: 'tw-shrink-0 tw-text-color-primary',
32
+ fileTitle: 'tw-font-medium tw-leading-5 tw-text-color-default tw-truncate tw-flex-1 tw-min-w-0',
33
+ progressWrapper: 'tw-flex tw-items-center tw-gap-2 tw-w-full',
34
+ progressTrack: 'tw-flex-1 tw-h-2 tw-bg-color-default-hover tw-rounded-full tw-overflow-hidden',
35
+ progressBar: 'tw-h-full tw-bg-primary-600 tw-rounded-full tw-transition-all tw-duration-300 tw-ease-out',
36
+ percent: 'tw-text-3 tw-font-medium tw-leading-5 tw-text-color-default tw-min-w-[3ch] tw-text-right tw-shrink-0',
37
+ actions: 'tw-flex tw-items-center tw-shrink-0',
38
+ iconBtn: [
39
+ 'tw-flex tw-items-center tw-justify-center tw-transition-colors tw-cursor-pointer',
40
+ 'tw-appearance-none tw-border-none tw-bg-transparent tw-p-0',
41
+ 'tw-text-color-default hover:tw-text-color-primary',
42
+ ],
43
+ errorArea: [
44
+ 'tw-flex tw-items-center tw-gap-3 tw-py-1.5 tw-px-3 tw-rounded',
45
+ 'tw-bg-red-50 tw-text-color-error tw-text-3 tw-font-medium tw-leading-none',
46
+ ],
47
+ errorIcon: 'tw-flex tw-items-center tw-justify-center tw-shrink-0',
48
+ errorClose: 'tw-ml-auto tw-cursor-pointer hover:tw-opacity-80',
49
+ captionWrap: '[&_.bcm-caption-area]:!tw-mt-0',
50
+ },
51
+ variants: {
52
+ size: {
53
+ medium: {
54
+ container: 'tw-gap-1',
55
+ zone: 'tw-gap-2 tw-px-4 tw-py-4',
56
+ zoneTextWrapper: 'tw-gap-1',
57
+ fileRow: 'tw-gap-1 tw-px-4 tw-py-2',
58
+ fileRowHeader: 'tw-gap-2',
59
+ fileIcon: 'tw-text-4',
60
+ fileTitle: 'tw-text-3',
61
+ iconBtn: 'tw-text-4',
62
+ progressWrapper: 'tw-gap-2',
63
+ progressTrack: 'tw-h-2',
64
+ },
65
+ small: {
66
+ container: 'tw-gap-0.5',
67
+ zone: 'tw-gap-2 tw-px-3 tw-py-3',
68
+ zoneTextWrapper: 'tw-gap-0.5',
69
+ fileRow: 'tw-gap-0.5 tw-px-3 tw-py-1',
70
+ fileRowHeader: 'tw-gap-1',
71
+ fileTitle: 'tw-text-2',
72
+ fileIcon: 'tw-text-3',
73
+ percent: 'tw-text-2',
74
+ iconBtn: 'tw-text-3',
75
+ progressWrapper: 'tw-gap-1',
76
+ progressTrack: 'tw-h-1.5',
77
+ list: 'tw-gap-1.5',
78
+ },
79
+ },
80
+ position: {
81
+ vertical: {
82
+ zone: 'tw-flex-col tw-text-center',
83
+ zoneTextWrapper: 'tw-items-center',
84
+ zoneTextSub: 'tw-text-center',
85
+ },
86
+ horizontal: {
87
+ zone: 'tw-flex-row tw-text-left',
88
+ zoneTextWrapper: 'tw-items-start',
89
+ },
90
+ button: {
91
+ container: 'tw-gap-1',
92
+ },
93
+ },
94
+ disabled: {
95
+ true: '',
96
+ false: '',
97
+ },
98
+ zoneHovered: {
99
+ true: '',
100
+ false: '',
101
+ },
102
+ dragActive: {
103
+ true: '',
104
+ false: '',
105
+ },
106
+ zoneError: {
107
+ true: '',
108
+ false: '',
109
+ },
110
+ fullWidth: {
111
+ true: {
112
+ container: 'tw-max-w-full',
113
+ },
114
+ false: {
115
+ container: 'tw-max-w-64',
116
+ },
117
+ },
118
+ },
119
+ compoundVariants: [
120
+ {
121
+ position: ['vertical', 'horizontal'],
122
+ size: 'medium',
123
+ class: {
124
+ iconContainer: 'tw-h-10',
125
+ iconSizeClass: 'tw-text-[40px] tw-leading-none',
126
+ },
127
+ },
128
+ {
129
+ position: 'vertical',
130
+ size: 'small',
131
+ class: {
132
+ iconContainer: 'tw-size-8',
133
+ iconSizeClass: 'tw-text-[32px] tw-leading-none',
134
+ },
135
+ },
136
+ {
137
+ position: 'horizontal',
138
+ size: 'small',
139
+ class: {
140
+ iconContainer: 'tw-h-8 tw-max-h-8 tw-max-w-9',
141
+ iconSizeClass: '!tw-text-[28px] !tw-leading-none',
142
+ },
143
+ },
144
+ {
145
+ position: ['vertical', 'horizontal'],
146
+ disabled: false,
147
+ class: {
148
+ zone: 'tw-cursor-pointer',
149
+ },
150
+ },
151
+ {
152
+ position: ['vertical', 'horizontal'],
153
+ disabled: false,
154
+ zoneError: false,
155
+ zoneHovered: true,
156
+ dragActive: false,
157
+ class: {
158
+ zone: zoneHoverSurface,
159
+ },
160
+ },
161
+ {
162
+ position: ['vertical', 'horizontal'],
163
+ disabled: false,
164
+ zoneError: false,
165
+ dragActive: true,
166
+ class: {
167
+ zone: zoneDragSurface,
168
+ },
169
+ },
170
+ {
171
+ position: ['vertical', 'horizontal'],
172
+ zoneError: true,
173
+ disabled: false,
174
+ class: {
175
+ zone: '!tw-border-solid tw-border-color-error !tw-bg-red-50',
176
+ },
177
+ },
178
+ {
179
+ disabled: true,
180
+ class: {
181
+ zone: [
182
+ 'tw-cursor-not-allowed',
183
+ 'tw-border-dashed tw-border-color-disabled tw-bg-color-disabled',
184
+ ],
185
+ zoneTextMain: 'tw-text-color-disabled',
186
+ zoneTextSub: 'tw-text-color-disabled',
187
+ zoneLink: 'tw-text-color-disabled tw-cursor-not-allowed tw-no-underline hover:tw-no-underline',
188
+ iconSizeClass: '!tw-text-color-disabled',
189
+ },
190
+ },
191
+ ],
192
+ defaultVariants: {
193
+ size: 'medium',
194
+ position: 'vertical',
195
+ disabled: false,
196
+ zoneHovered: false,
197
+ dragActive: false,
198
+ zoneError: false,
199
+ fullWidth: false,
200
+ },
201
+ });
@@ -39,6 +39,7 @@ export class BcmForm {
39
39
  CHECKBOX: 'checkbox',
40
40
  RADIO_GROUP: 'radio-group',
41
41
  CHECKBOX_GROUP: 'checkbox-group',
42
+ FILE_UPLOAD: 'file-upload',
42
43
  RANGE: 'range',
43
44
  // sadece value fırlatıyor
44
45
  FORM: 'form',
@@ -23,6 +23,7 @@ export const BcmFormComponents = [
23
23
  'BCM-CHIP-GROUP',
24
24
  'BCM-INPUT-DROPDOWN',
25
25
  'BCM-NUMBER-INPUT',
26
+ 'BCM-FILE-UPLOAD',
26
27
  //... to be added to v3
27
28
  ];
28
29
  export const BcmFormGroupComponents = [
@@ -0,0 +1,344 @@
1
+ /*!
2
+ * Built with Stencil
3
+ * Copyright (c) Bromcom.
4
+ */
5
+ export class ListFocusManager {
6
+ constructor() {
7
+ this.focusableSelector = [
8
+ "a[href]",
9
+ "area[href]",
10
+ "button:not([disabled])",
11
+ "input:not([disabled]):not([type='hidden'])",
12
+ "select:not([disabled])",
13
+ "textarea:not([disabled])",
14
+ "[contenteditable='true']",
15
+ "[tabindex]:not([tabindex='-1'])",
16
+ ].join(",");
17
+ }
18
+ getFocusableElements(container) {
19
+ return Array.from(container.querySelectorAll(this.focusableSelector)).filter(item => this.isVisible(item));
20
+ }
21
+ getFirstFocusableElement(container) {
22
+ if (!container)
23
+ return null;
24
+ if (this.canReceiveProgrammaticFocus(container))
25
+ return container;
26
+ return this.getFocusableElements(container)[0] || null;
27
+ }
28
+ getListItems(listElement) {
29
+ if (!listElement)
30
+ return [];
31
+ return Array.from(listElement.querySelectorAll(".bcm-list__item")).filter(item => this.canReceiveProgrammaticFocus(item));
32
+ }
33
+ getItemById(listElement, itemId) {
34
+ return this.getListItems(listElement).find(item => item.id === itemId) || null;
35
+ }
36
+ getCurrentListItem(listElement, activeElement) {
37
+ if (!listElement)
38
+ return null;
39
+ const activeItem = activeElement === null || activeElement === void 0 ? void 0 : activeElement.closest(".bcm-list__item");
40
+ if (activeItem && this.isInsideElement(listElement, activeItem) && this.canReceiveProgrammaticFocus(activeItem)) {
41
+ return activeItem;
42
+ }
43
+ const focusedItem = listElement.querySelector(".bcm-list__item.focused");
44
+ return this.canReceiveProgrammaticFocus(focusedItem) ? focusedItem : null;
45
+ }
46
+ getPreferredListFocusElement(listElement, direction = "first") {
47
+ var _a;
48
+ if (!listElement)
49
+ return null;
50
+ const focusedItem = listElement.querySelector(".bcm-list__item.focused");
51
+ if (focusedItem && this.canReceiveProgrammaticFocus(focusedItem))
52
+ return focusedItem;
53
+ const selectedItem = (_a = listElement.querySelector(".bcm-list__item .selected")) === null || _a === void 0 ? void 0 : _a.closest(".bcm-list__item");
54
+ if (selectedItem && this.canReceiveProgrammaticFocus(selectedItem))
55
+ return selectedItem;
56
+ const listItems = this.getListItems(listElement);
57
+ if (listItems.length > 0) {
58
+ return direction === "last" ? listItems[listItems.length - 1] : listItems[0];
59
+ }
60
+ const focusableElements = this.getFocusableElements(listElement);
61
+ return direction === "last" ? focusableElements[focusableElements.length - 1] || null : focusableElements[0] || null;
62
+ }
63
+ isElementNaturallyFocusable(element) {
64
+ const nodeName = element.tagName;
65
+ if (nodeName === "A")
66
+ return element.hasAttribute("href");
67
+ return ["BUTTON", "INPUT", "SELECT", "TEXTAREA"].includes(nodeName);
68
+ }
69
+ isEditableElement(element) {
70
+ if (!element)
71
+ return false;
72
+ const nodeName = element.tagName;
73
+ return nodeName === "INPUT" || nodeName === "TEXTAREA" || nodeName === "SELECT" || element.isContentEditable;
74
+ }
75
+ isVisible(element) {
76
+ if (!element.isConnected)
77
+ return false;
78
+ const style = window.getComputedStyle(element);
79
+ return style.display !== "none" && style.visibility !== "hidden";
80
+ }
81
+ isInsideElement(parent, child) {
82
+ return !!(parent && child && (parent === child || parent.contains(child)));
83
+ }
84
+ canReceiveProgrammaticFocus(element) {
85
+ if (!element || !this.isVisible(element))
86
+ return false;
87
+ const tabIndexAttr = element.getAttribute("tabindex");
88
+ if (tabIndexAttr != null) {
89
+ return Number(tabIndexAttr) >= 0;
90
+ }
91
+ return this.isElementNaturallyFocusable(element);
92
+ }
93
+ getInteractionContext(params) {
94
+ const { hostElement, targetElement, listElement, openTriggerElement } = params;
95
+ const activeElement = document.activeElement;
96
+ const isFocusInsideTarget = this.isInsideElement(targetElement, activeElement);
97
+ const isFocusInsideOpenTrigger = this.isInsideElement(openTriggerElement || null, activeElement);
98
+ const isFocusInsideHost = this.isInsideElement(hostElement, activeElement);
99
+ const isFocusInsideList = this.isInsideElement(listElement, activeElement);
100
+ const isTriggerFocused = isFocusInsideHost || isFocusInsideTarget || isFocusInsideOpenTrigger;
101
+ return {
102
+ activeElement,
103
+ isFocusInsideHost,
104
+ isFocusInsideList,
105
+ isFocusInsideOpenTrigger,
106
+ isFocusInsideTarget,
107
+ isTriggerFocused,
108
+ };
109
+ }
110
+ isInsideSearch(activeElement) {
111
+ return !!(activeElement === null || activeElement === void 0 ? void 0 : activeElement.closest(".bcm-list__container-search"));
112
+ }
113
+ focusElement(element) {
114
+ var _a;
115
+ if (!element || !this.canReceiveProgrammaticFocus(element))
116
+ return false;
117
+ element.focus();
118
+ (_a = element.scrollIntoView) === null || _a === void 0 ? void 0 : _a.call(element, { block: "nearest" });
119
+ return this.isInsideElement(element, document.activeElement);
120
+ }
121
+ focusListElement(listElement, preferItem = false, direction = "first") {
122
+ const focusTarget = preferItem ? this.getPreferredListFocusElement(listElement, direction) : this.getFirstFocusableElement(listElement);
123
+ return this.focusElement(focusTarget);
124
+ }
125
+ focusListItemByOffset(listElement, activeElement, offset) {
126
+ const items = this.getListItems(listElement);
127
+ if (items.length === 0)
128
+ return false;
129
+ const currentItem = this.getCurrentListItem(listElement, activeElement);
130
+ const currentIndex = currentItem ? items.indexOf(currentItem) : -1;
131
+ const nextIndex = currentIndex === -1 ? (offset > 0 ? 0 : items.length - 1) : (currentIndex + offset + items.length) % items.length;
132
+ return this.focusElement(items[nextIndex]);
133
+ }
134
+ focusListItemWhenReady(listElement, itemId, remainingAttempts = 6) {
135
+ if (this.focusElement(this.getItemById(listElement, itemId)))
136
+ return true;
137
+ if (remainingAttempts <= 0)
138
+ return false;
139
+ requestAnimationFrame(() => {
140
+ this.focusListItemWhenReady(listElement, itemId, remainingAttempts - 1);
141
+ });
142
+ return true;
143
+ }
144
+ focusListElementWhenReady(listElement, preferItem = false, direction = "first", remainingAttempts = 6) {
145
+ if (this.focusListElement(listElement, preferItem, direction))
146
+ return true;
147
+ if (remainingAttempts <= 0)
148
+ return false;
149
+ requestAnimationFrame(() => {
150
+ this.focusListElementWhenReady(listElement, preferItem, direction, remainingAttempts - 1);
151
+ });
152
+ return true;
153
+ }
154
+ getParentListItem(item) {
155
+ if (!item)
156
+ return null;
157
+ const parentId = item.getAttribute("data-parent-id");
158
+ if (!parentId)
159
+ return null;
160
+ return this.getItemById(item.closest(".bcm-list__container"), parentId);
161
+ }
162
+ getFirstChildListItem(item) {
163
+ return (item === null || item === void 0 ? void 0 : item.querySelector(":scope > .bcm-list__item-childs > .bcm-list__item")) || null;
164
+ }
165
+ hasTreeChildren(item) {
166
+ return (item === null || item === void 0 ? void 0 : item.getAttribute("data-has-children")) === "true";
167
+ }
168
+ isTreeItemOpen(item) {
169
+ return (item === null || item === void 0 ? void 0 : item.getAttribute("data-open")) === "true";
170
+ }
171
+ isInsideAnyElement(elements, child) {
172
+ return elements.some(element => this.isInsideElement(element || null, child));
173
+ }
174
+ focusAdjacentOutside(params) {
175
+ const { hostElement, targetElement, listElement, openTriggerElement, direction } = params;
176
+ const relatedElements = [hostElement, targetElement, listElement, openTriggerElement];
177
+ const focusableElements = this.getFocusableElements(document.body).filter(item => !this.isInsideAnyElement(relatedElements, item));
178
+ const documentFocusableElements = this.getFocusableElements(document.body);
179
+ const relatedIndexes = documentFocusableElements
180
+ .map((item, index) => (this.isInsideAnyElement(relatedElements, item) ? index : -1))
181
+ .filter(index => index >= 0);
182
+ if (relatedIndexes.length === 0 || focusableElements.length === 0)
183
+ return false;
184
+ const anchorIndex = direction === "next" ? Math.max(...relatedIndexes) : Math.min(...relatedIndexes);
185
+ const focusTarget = direction === "next"
186
+ ? documentFocusableElements.slice(anchorIndex + 1).find(item => focusableElements.includes(item))
187
+ : documentFocusableElements
188
+ .slice(0, anchorIndex)
189
+ .reverse()
190
+ .find(item => focusableElements.includes(item));
191
+ return this.focusElement(focusTarget || null);
192
+ }
193
+ restoreTriggerFocus(params) {
194
+ const { hostElement, targetElement, autocompleteInput, openTriggerElement, preferOpenTrigger } = params;
195
+ const primaryTarget = preferOpenTrigger ? openTriggerElement : autocompleteInput || targetElement;
196
+ const secondaryTarget = preferOpenTrigger ? autocompleteInput || targetElement : openTriggerElement;
197
+ const focusTarget = this.getFirstFocusableElement(primaryTarget || null) || this.getFirstFocusableElement(secondaryTarget || null) || this.getFirstFocusableElement(hostElement);
198
+ focusTarget === null || focusTarget === void 0 ? void 0 : focusTarget.focus();
199
+ }
200
+ handleKeyDown(params) {
201
+ const { disabled, isOpen, isOverlayType } = params;
202
+ if (disabled || !isOverlayType)
203
+ return false;
204
+ return isOpen ? this.handleOpenOverlayKeyDown(params) : this.handleClosedOverlayKeyDown(params);
205
+ }
206
+ handleClosedOverlayKeyDown(params) {
207
+ const { event, hostElement, targetElement, listElement, openList, openTriggerElement } = params;
208
+ const keyCode = event.keyCode || event.which;
209
+ const isSpaceKey = event.key === " " || event.key === "Spacebar" || keyCode === 32;
210
+ const isArrowDownKey = event.key === "ArrowDown" || keyCode === 40;
211
+ const isArrowUpKey = event.key === "ArrowUp" || keyCode === 38;
212
+ const context = this.getInteractionContext({ hostElement, targetElement, listElement, openTriggerElement });
213
+ if (!context.isTriggerFocused)
214
+ return false;
215
+ if (this.isEditableElement(context.activeElement) && !isArrowDownKey && !isArrowUpKey)
216
+ return false;
217
+ if (!isSpaceKey && !isArrowDownKey && !isArrowUpKey)
218
+ return false;
219
+ event.preventDefault();
220
+ event.stopPropagation();
221
+ event.stopImmediatePropagation();
222
+ openList();
223
+ if (isArrowDownKey || isArrowUpKey) {
224
+ this.focusListElementWhenReady(listElement, true, isArrowUpKey ? "last" : "first");
225
+ }
226
+ return true;
227
+ }
228
+ handleOpenOverlayKeyDown(params) {
229
+ const { event, hostElement, targetElement, listElement, closeList, selectFocusedItem, openGroup, treeview, checkboxes, autocompleteInput, openTriggerElement } = params;
230
+ const keyCode = event.keyCode || event.which;
231
+ const isSpaceKey = event.key === " " || event.key === "Spacebar" || keyCode === 32;
232
+ const isEnterKey = event.key === "Enter" || keyCode === 13;
233
+ const isEscapeKey = event.key === "Escape" || keyCode === 27;
234
+ const isTabKey = event.key === "Tab" || keyCode === 9;
235
+ const isArrowDownKey = event.key === "ArrowDown" || keyCode === 40;
236
+ const isArrowUpKey = event.key === "ArrowUp" || keyCode === 38;
237
+ const isArrowRightKey = event.key === "ArrowRight" || keyCode === 39;
238
+ const isArrowLeftKey = event.key === "ArrowLeft" || keyCode === 37;
239
+ const context = this.getInteractionContext({ hostElement, targetElement, listElement, openTriggerElement });
240
+ const currentItem = this.getCurrentListItem(listElement, context.activeElement);
241
+ const isInsideSearch = this.isInsideSearch(context.activeElement);
242
+ if (isEscapeKey && (context.isTriggerFocused || context.isFocusInsideList || context.isFocusInsideHost)) {
243
+ event.preventDefault();
244
+ event.stopPropagation();
245
+ event.stopImmediatePropagation();
246
+ closeList();
247
+ this.restoreTriggerFocus({ hostElement, targetElement, autocompleteInput, openTriggerElement, preferOpenTrigger: true });
248
+ return true;
249
+ }
250
+ if (isSpaceKey && checkboxes && currentItem && !isInsideSearch) {
251
+ event.preventDefault();
252
+ event.stopPropagation();
253
+ event.stopImmediatePropagation();
254
+ selectFocusedItem(currentItem.id);
255
+ return true;
256
+ }
257
+ if (isSpaceKey && currentItem && !checkboxes && !isInsideSearch) {
258
+ event.preventDefault();
259
+ event.stopPropagation();
260
+ event.stopImmediatePropagation();
261
+ return true;
262
+ }
263
+ if (isSpaceKey && context.isTriggerFocused && !this.isEditableElement(context.activeElement)) {
264
+ event.preventDefault();
265
+ event.stopPropagation();
266
+ event.stopImmediatePropagation();
267
+ closeList();
268
+ this.restoreTriggerFocus({ hostElement, targetElement, autocompleteInput, openTriggerElement, preferOpenTrigger: true });
269
+ return true;
270
+ }
271
+ if ((isArrowDownKey || isArrowUpKey) && listElement && (context.isFocusInsideList || context.isTriggerFocused)) {
272
+ event.preventDefault();
273
+ event.stopPropagation();
274
+ event.stopImmediatePropagation();
275
+ if (context.isFocusInsideList && !isInsideSearch) {
276
+ return this.focusListItemByOffset(listElement, context.activeElement, isArrowUpKey ? -1 : 1);
277
+ }
278
+ return this.focusListElementWhenReady(listElement, true, isArrowUpKey ? "last" : "first");
279
+ }
280
+ if (treeview && (isArrowRightKey || isArrowLeftKey) && currentItem && !isInsideSearch) {
281
+ event.preventDefault();
282
+ event.stopPropagation();
283
+ event.stopImmediatePropagation();
284
+ if (isArrowRightKey) {
285
+ if (this.hasTreeChildren(currentItem) && !this.isTreeItemOpen(currentItem)) {
286
+ openGroup(currentItem.id);
287
+ return this.focusListItemWhenReady(listElement, currentItem.id);
288
+ }
289
+ return this.focusElement(this.getFirstChildListItem(currentItem));
290
+ }
291
+ if (this.hasTreeChildren(currentItem) && this.isTreeItemOpen(currentItem)) {
292
+ openGroup(currentItem.id);
293
+ return this.focusListItemWhenReady(listElement, currentItem.id);
294
+ }
295
+ return this.focusElement(this.getParentListItem(currentItem));
296
+ }
297
+ if (isEnterKey && context.isFocusInsideOpenTrigger && !this.isEditableElement(context.activeElement) && listElement) {
298
+ event.preventDefault();
299
+ event.stopPropagation();
300
+ event.stopImmediatePropagation();
301
+ return this.focusListElementWhenReady(listElement, true, "first");
302
+ }
303
+ if (isEnterKey && listElement && context.isFocusInsideList && !isInsideSearch) {
304
+ const focusedItem = currentItem || listElement.querySelector(".bcm-list__item.focused");
305
+ if (focusedItem === null || focusedItem === void 0 ? void 0 : focusedItem.id) {
306
+ event.preventDefault();
307
+ event.stopPropagation();
308
+ event.stopImmediatePropagation();
309
+ selectFocusedItem(focusedItem.id);
310
+ return true;
311
+ }
312
+ }
313
+ if (!isTabKey || !listElement)
314
+ return false;
315
+ const focusableElements = this.getFocusableElements(listElement);
316
+ const firstFocusableElement = focusableElements[0];
317
+ const lastFocusableElement = focusableElements[focusableElements.length - 1];
318
+ if (!event.shiftKey && context.isTriggerFocused) {
319
+ event.preventDefault();
320
+ return this.focusListElementWhenReady(listElement);
321
+ }
322
+ if (event.shiftKey && context.isFocusInsideList && firstFocusableElement && context.activeElement === firstFocusableElement) {
323
+ event.preventDefault();
324
+ closeList();
325
+ this.restoreTriggerFocus({ hostElement, targetElement, autocompleteInput, openTriggerElement, preferOpenTrigger: true });
326
+ return true;
327
+ }
328
+ if (!event.shiftKey && context.isFocusInsideList && lastFocusableElement && context.activeElement === lastFocusableElement) {
329
+ event.preventDefault();
330
+ closeList();
331
+ requestAnimationFrame(() => {
332
+ this.focusAdjacentOutside({ hostElement, targetElement, listElement, openTriggerElement, direction: "next" });
333
+ });
334
+ return true;
335
+ }
336
+ if (context.isFocusInsideList && focusableElements.length === 0) {
337
+ event.preventDefault();
338
+ closeList();
339
+ this.restoreTriggerFocus({ hostElement, targetElement, autocompleteInput, openTriggerElement, preferOpenTrigger: true });
340
+ return true;
341
+ }
342
+ return false;
343
+ }
344
+ }
@@ -92,13 +92,18 @@ export class ListKeyControl extends KeyControl {
92
92
  }
93
93
  }
94
94
  }
95
- keyEnterControl() { }
96
- keySpaceControl() {
95
+ keyEnterControl() {
96
+ const focused = this.getFocusedElement();
97
+ if (!(focused === null || focused === void 0 ? void 0 : focused.id))
98
+ return;
97
99
  if (this.isCheckBoxes) {
98
- const { id } = this.getFocusedElement();
99
- this.checkedItem(id);
100
+ this.checkedItem(focused.id);
101
+ }
102
+ else {
103
+ this.selectedItem(focused.id);
100
104
  }
101
105
  }
106
+ keySpaceControl() { }
102
107
  keyDown() {
103
108
  switch (this.getKeyCode()) {
104
109
  case Bcm.KeyCode.up:
@@ -568,16 +568,13 @@
568
568
  left: 0;
569
569
  height: 0;
570
570
  width: 0;
571
- transform: translateY(10%);
572
571
  z-index: 10800;
573
572
  }
574
573
  .bcm-list__container.bcm-list__type-linked-component.is-open, .bcm-list__container.bcm-list__type-select.is-open, .bcm-list__container.bcm-list__type-autocomplete.is-open {
575
- transition: transform 50ms;
576
574
  display: flex;
577
575
  }
578
576
  .bcm-list__container.bcm-list__type-linked-component.is-open-animation, .bcm-list__container.bcm-list__type-select.is-open-animation, .bcm-list__container.bcm-list__type-autocomplete.is-open-animation {
579
577
  opacity: 1;
580
- transform: translateY(0);
581
578
  visibility: visible;
582
579
  }
583
580
  .bcm-list__container.bcm-list__type-linked-component {
@@ -953,6 +950,14 @@
953
950
  overflow: hidden;
954
951
  text-overflow: ellipsis;
955
952
  }
953
+ @media (max-width: 768px), (pointer: coarse) {
954
+ .bcm-list__container-search .bcm-input__container, .bcm-list__autocomplete .bcm-input__container {
955
+ font-size: 16px;
956
+ }
957
+ .bcm-list__container-search .bcm-input-element, .bcm-list__autocomplete .bcm-input-element {
958
+ font-size: 16px;
959
+ }
960
+ }
956
961
 
957
962
  .bcm-info-footer {
958
963
  text-align: right;