@sankhyalabs/ezui 2.10.0 → 2.11.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 (144) hide show
  1. package/dist/cjs/ez-actions-button.cjs.entry.js +1 -1
  2. package/dist/cjs/ez-alert.cjs.entry.js +1 -1
  3. package/dist/cjs/ez-application.cjs.entry.js +1 -1
  4. package/dist/cjs/ez-breadcrumb.cjs.entry.js +1 -1
  5. package/dist/cjs/ez-button.cjs.entry.js +1 -1
  6. package/dist/cjs/ez-calendar.cjs.entry.js +1 -1
  7. package/dist/cjs/ez-card-item.cjs.entry.js +1 -1
  8. package/dist/cjs/ez-check.cjs.entry.js +1 -1
  9. package/dist/cjs/ez-chip.cjs.entry.js +1 -1
  10. package/dist/cjs/ez-collapsible-box.cjs.entry.js +1 -1
  11. package/dist/cjs/ez-combo-box.cjs.entry.js +1 -1
  12. package/dist/cjs/ez-date-input.cjs.entry.js +1 -1
  13. package/dist/cjs/ez-date-time-input.cjs.entry.js +1 -1
  14. package/dist/cjs/ez-dialog.cjs.entry.js +1 -1
  15. package/dist/cjs/ez-dropdown.cjs.entry.js +503 -0
  16. package/dist/cjs/ez-file-item.cjs.entry.js +1 -1
  17. package/dist/cjs/ez-filter-input.cjs.entry.js +1 -1
  18. package/dist/cjs/ez-form.cjs.entry.js +1 -1
  19. package/dist/cjs/ez-grid.cjs.entry.js +1 -1
  20. package/dist/cjs/ez-icon.cjs.entry.js +1 -1
  21. package/dist/cjs/ez-list.cjs.entry.js +1 -1
  22. package/dist/cjs/ez-loading-bar.cjs.entry.js +1 -1
  23. package/dist/cjs/ez-modal-container.cjs.entry.js +1 -1
  24. package/dist/cjs/ez-modal.cjs.entry.js +1 -1
  25. package/dist/cjs/ez-number-input.cjs.entry.js +1 -1
  26. package/dist/cjs/ez-popover.cjs.entry.js +1 -1
  27. package/dist/cjs/ez-popup.cjs.entry.js +1 -1
  28. package/dist/cjs/ez-radio-button.cjs.entry.js +1 -1
  29. package/dist/cjs/ez-scroller.cjs.entry.js +1 -1
  30. package/dist/cjs/ez-search.cjs.entry.js +1 -1
  31. package/dist/cjs/ez-sidebar-button.cjs.entry.js +1 -1
  32. package/dist/cjs/ez-tabselector.cjs.entry.js +1 -1
  33. package/dist/cjs/ez-text-area.cjs.entry.js +1 -1
  34. package/dist/cjs/ez-text-edit.cjs.entry.js +1 -1
  35. package/dist/cjs/ez-text-input.cjs.entry.js +1 -1
  36. package/dist/cjs/ez-time-input.cjs.entry.js +1 -1
  37. package/dist/cjs/ez-toast.cjs.entry.js +1 -1
  38. package/dist/cjs/ez-tree.cjs.entry.js +1 -1
  39. package/dist/cjs/ez-upload.cjs.entry.js +1 -1
  40. package/dist/cjs/ez-view-stack.cjs.entry.js +1 -1
  41. package/dist/cjs/ezui.cjs.js +2 -2
  42. package/dist/cjs/{index-8646c40d.js → index-fb179d74.js} +3 -0
  43. package/dist/cjs/loader.cjs.js +2 -2
  44. package/dist/collection/collection-manifest.json +1 -0
  45. package/dist/collection/components/ez-dropdown/ez-dropdown.css +349 -0
  46. package/dist/collection/components/ez-dropdown/ez-dropdown.js +339 -0
  47. package/dist/collection/components/ez-dropdown/structure/DropdownItem.js +33 -0
  48. package/dist/collection/components/ez-dropdown/structure/SubmenuControl.js +241 -0
  49. package/dist/custom-elements/index.d.ts +6 -0
  50. package/dist/custom-elements/index.js +501 -2
  51. package/dist/esm/ez-actions-button.entry.js +1 -1
  52. package/dist/esm/ez-alert.entry.js +1 -1
  53. package/dist/esm/ez-application.entry.js +1 -1
  54. package/dist/esm/ez-breadcrumb.entry.js +1 -1
  55. package/dist/esm/ez-button.entry.js +1 -1
  56. package/dist/esm/ez-calendar.entry.js +1 -1
  57. package/dist/esm/ez-card-item.entry.js +1 -1
  58. package/dist/esm/ez-check.entry.js +1 -1
  59. package/dist/esm/ez-chip.entry.js +1 -1
  60. package/dist/esm/ez-collapsible-box.entry.js +1 -1
  61. package/dist/esm/ez-combo-box.entry.js +1 -1
  62. package/dist/esm/ez-date-input.entry.js +1 -1
  63. package/dist/esm/ez-date-time-input.entry.js +1 -1
  64. package/dist/esm/ez-dialog.entry.js +1 -1
  65. package/dist/esm/ez-dropdown.entry.js +499 -0
  66. package/dist/esm/ez-file-item.entry.js +1 -1
  67. package/dist/esm/ez-filter-input.entry.js +1 -1
  68. package/dist/esm/ez-form.entry.js +1 -1
  69. package/dist/esm/ez-grid.entry.js +1 -1
  70. package/dist/esm/ez-icon.entry.js +1 -1
  71. package/dist/esm/ez-list.entry.js +1 -1
  72. package/dist/esm/ez-loading-bar.entry.js +1 -1
  73. package/dist/esm/ez-modal-container.entry.js +1 -1
  74. package/dist/esm/ez-modal.entry.js +1 -1
  75. package/dist/esm/ez-number-input.entry.js +1 -1
  76. package/dist/esm/ez-popover.entry.js +1 -1
  77. package/dist/esm/ez-popup.entry.js +1 -1
  78. package/dist/esm/ez-radio-button.entry.js +1 -1
  79. package/dist/esm/ez-scroller.entry.js +1 -1
  80. package/dist/esm/ez-search.entry.js +1 -1
  81. package/dist/esm/ez-sidebar-button.entry.js +1 -1
  82. package/dist/esm/ez-tabselector.entry.js +1 -1
  83. package/dist/esm/ez-text-area.entry.js +1 -1
  84. package/dist/esm/ez-text-edit.entry.js +1 -1
  85. package/dist/esm/ez-text-input.entry.js +1 -1
  86. package/dist/esm/ez-time-input.entry.js +1 -1
  87. package/dist/esm/ez-toast.entry.js +1 -1
  88. package/dist/esm/ez-tree.entry.js +1 -1
  89. package/dist/esm/ez-upload.entry.js +1 -1
  90. package/dist/esm/ez-view-stack.entry.js +1 -1
  91. package/dist/esm/ezui.js +2 -2
  92. package/dist/esm/{index-7bc778b3.js → index-b77dcd0d.js} +3 -0
  93. package/dist/esm/loader.js +2 -2
  94. package/dist/ezui/ezui.esm.js +1 -1
  95. package/dist/ezui/{p-cfcc23e6.entry.js → p-07d07b75.entry.js} +1 -1
  96. package/dist/ezui/{p-7c227b86.entry.js → p-21782390.entry.js} +1 -1
  97. package/dist/ezui/{p-739d60d1.entry.js → p-22f06920.entry.js} +1 -1
  98. package/dist/ezui/{p-f6111077.entry.js → p-2686fa5b.entry.js} +1 -1
  99. package/dist/ezui/{p-b60fbad2.entry.js → p-297d4378.entry.js} +1 -1
  100. package/dist/ezui/p-42376b77.entry.js +1 -0
  101. package/dist/ezui/{p-f18f16e0.entry.js → p-42f85e36.entry.js} +1 -1
  102. package/dist/ezui/{p-171c3236.entry.js → p-46c3cd8e.entry.js} +1 -1
  103. package/dist/ezui/{p-32f9f83a.entry.js → p-4b93860c.entry.js} +1 -1
  104. package/dist/ezui/{p-7e496975.entry.js → p-52a18a6c.entry.js} +1 -1
  105. package/dist/ezui/{p-5dc3af60.entry.js → p-5d19cd0d.entry.js} +1 -1
  106. package/dist/ezui/{p-9def6fd0.entry.js → p-5e3079cb.entry.js} +1 -1
  107. package/dist/ezui/{p-ea877274.entry.js → p-620e71e2.entry.js} +1 -1
  108. package/dist/ezui/{p-04fab1e9.entry.js → p-6a53943d.entry.js} +1 -1
  109. package/dist/ezui/{p-1634c851.entry.js → p-6c43b275.entry.js} +1 -1
  110. package/dist/ezui/{p-3c7ea91b.js → p-6ccf5720.js} +1 -1
  111. package/dist/ezui/{p-123a2bd5.entry.js → p-6cdfe0db.entry.js} +1 -1
  112. package/dist/ezui/p-74a3f9d8.entry.js +1 -0
  113. package/dist/ezui/{p-a2e55b33.entry.js → p-7d8e693d.entry.js} +1 -1
  114. package/dist/ezui/{p-93bcc628.entry.js → p-7e9ab877.entry.js} +1 -1
  115. package/dist/ezui/{p-5c9ce8a7.entry.js → p-87dd65ba.entry.js} +1 -1
  116. package/dist/ezui/{p-f2627de5.entry.js → p-8c273b22.entry.js} +1 -1
  117. package/dist/ezui/{p-04a3b457.entry.js → p-9171043f.entry.js} +1 -1
  118. package/dist/ezui/{p-941e9792.entry.js → p-98c78c29.entry.js} +1 -1
  119. package/dist/ezui/{p-ddb1c350.entry.js → p-99e07a6b.entry.js} +1 -1
  120. package/dist/ezui/{p-6fd5e142.entry.js → p-a4405e80.entry.js} +1 -1
  121. package/dist/ezui/{p-f2c4e811.entry.js → p-a7380524.entry.js} +1 -1
  122. package/dist/ezui/{p-79e409c6.entry.js → p-a928ea8d.entry.js} +1 -1
  123. package/dist/ezui/{p-25e83e46.entry.js → p-b5efd273.entry.js} +1 -1
  124. package/dist/ezui/{p-9404f22b.entry.js → p-b7a8708e.entry.js} +1 -1
  125. package/dist/ezui/{p-46113d5a.entry.js → p-b9d91679.entry.js} +1 -1
  126. package/dist/ezui/{p-1a89d3ff.entry.js → p-ba7b2b8f.entry.js} +1 -1
  127. package/dist/ezui/{p-14a04845.entry.js → p-bdb5e325.entry.js} +1 -1
  128. package/dist/ezui/{p-50ae478a.entry.js → p-d04f3bb1.entry.js} +1 -1
  129. package/dist/ezui/{p-e613d9bf.entry.js → p-e3743d12.entry.js} +1 -1
  130. package/dist/ezui/{p-37335c51.entry.js → p-e628c8bd.entry.js} +1 -1
  131. package/dist/ezui/{p-ad5fe50b.entry.js → p-e881ec6d.entry.js} +1 -1
  132. package/dist/ezui/{p-3cfefc57.entry.js → p-e9b4b3bd.entry.js} +1 -1
  133. package/dist/ezui/{p-74c7f960.entry.js → p-f58201e8.entry.js} +1 -1
  134. package/dist/ezui/{p-a86d00b3.entry.js → p-f8f87959.entry.js} +1 -1
  135. package/dist/ezui/{p-9334a724.entry.js → p-fe1f0c92.entry.js} +1 -1
  136. package/dist/types/components/ez-dropdown/ez-dropdown.d.ts +58 -0
  137. package/dist/types/components/ez-dropdown/structure/DropdownItem.d.ts +28 -0
  138. package/dist/types/components/ez-dropdown/structure/SubmenuControl.d.ts +78 -0
  139. package/dist/types/components.d.ts +46 -0
  140. package/package.json +2 -2
  141. package/react/components.d.ts +1 -0
  142. package/react/components.js +1 -0
  143. package/react/components.js.map +1 -1
  144. package/dist/ezui/p-1cc11468.entry.js +0 -1
@@ -0,0 +1,349 @@
1
+ :host {
2
+ /* dropdown */
3
+ /*@doc Define a posição do componente.*/
4
+ --ez-dropdown--z-index: var(--more-visible, 2);
5
+ /*@doc Define o espaçamento interno do componente.*/
6
+ --ez-dropdown--padding: var(--space--small, 6px);
7
+ /*@doc Define a sombra externa do componente.*/
8
+ --ez-dropdown--box-shadow: var(--shadow--medium, 0px 8px 24px rgba(0, 38, 111, 0.1));
9
+ /*@doc Define o raio da borda do componente.*/
10
+ --ez-dropdown--border-radius: var(--border--radius-medium, 12px);
11
+ /*@doc Define cor de fundo do componente.*/
12
+ --ez-dropdown--background-color: var(--background--xlight, #fff);
13
+ /*@doc Define a fonte do componente.*/
14
+ --ez-dropdown--font-family: var(--font-pattern, 'Roboto');
15
+ /*@doc Define a largura máxima do componente.*/
16
+ --ez-dropdown--max-width: 320px;
17
+ /*@doc Define a altura máxima do componente.*/
18
+ --ez-dropdown--max-height: 440px;
19
+
20
+ /* item*/
21
+ /*@doc Define o espaçamento interno de cada item do componente.*/
22
+ --ez-dropdown__item--padding: var(--space--small, 6px);
23
+ /*@doc Define o espaçamento entre os elementos internos do item do componente.*/
24
+ --ez-dropdown__item--gap: var(--space--small, 6px);
25
+ /*@doc Define o raio da borda de cada item do componente.*/
26
+ --ez-dropdown__item--border-radius: var(--border--radius-small, 6px);
27
+ /*@doc Define a cor do texto de cada item do componente.*/
28
+ --ez-dropdown__item--color: var(--title--primary, #2b3a54);
29
+ /*@doc Define o peso do texto de cada item do componente.*/
30
+ --ez-dropdown__item--font-weight: var(--text-weight--medium, 400);
31
+ /*@doc Define o tamanho da fonte de cada item do componente.*/
32
+ --ez-dropdown__item--font-size: var(--text--medium, 14px);
33
+ /*@doc Define a altura do texto de cada item do componente.*/
34
+ --ez-dropdown__item--line-height: calc(var(--ez-dropdown__item--font-size) + 4px);
35
+ /*@doc Define a cor de fundo no hover de cada item do componente.*/
36
+ --ez-dropdown__item--background-color: var(--background--medium, #f0f3f7);
37
+ /*@doc Define o efeito de transição do hover de cada item do componente.*/
38
+ --ez-dropdown__item--transition: var(--transition, .2s linear);
39
+
40
+ /* item-label */
41
+ /*@doc Define o espaçamento direito externo de cada label do componente.*/
42
+ --ez-dropdown__item-label--margin-right: var(--space--medium, 12px);
43
+
44
+ /* icon */
45
+ /*@doc Define o tamanho da área de cada ícone do componente.*/
46
+ --ez-dropdown__icon--size: var(--icon--medium, 18px);
47
+
48
+ /* divider */
49
+ /*@doc Define a cor de fundo do divider do componente.*/
50
+ --ez-dropdown__divider--background-color: var(--color--disable-secondary, #f2f5f8);
51
+ /*@doc Define o espaçamento externo do divider do componente.*/
52
+ --ez-dropdown__divider--margin: var(--space--extra-small, 3px) 0;
53
+
54
+ /* group-label */
55
+ /*@doc Define a cor do título de cada grupo do componente.*/
56
+ --ez-dropdown__group-label--color: var(--text--secondary, #A2ABB9);
57
+ /*@doc Define o peso do texto do título de cada grupo do componente.*/
58
+ --ez-dropdown__group-label--font-weight: var(--text-weight--large, 600);
59
+ /*@doc Define o tamanho da fonte do título de cada grupo do componente.*/
60
+ --ez-dropdown__group-label--font-size: var(--text--small, 12px);
61
+ /*@doc Define a altura do texto do título de cada grupo do componente.*/
62
+ --ez-dropdown__group-label--line-height: var(--text--medium, 14px);
63
+ /*@doc Define o espaçamento interno do título de cada grupo do componente.*/
64
+ --ez-dropdown__group-label--padding: var(--space--small, 6px);
65
+
66
+ /* submenu */
67
+ /*@doc Define a posição do submenu do componente.*/
68
+ --ez-dropdown__submenu--z-index: var(--most-visible, 3);
69
+
70
+ /* link (subAction) */
71
+ /*@doc Define o peso do texto de cada link do componente.*/
72
+ --ez-dropdown__link--font-weight: var(--text-weight--large, 600);
73
+ /*@doc Define a cor utilizada como padrão para ações secundárias.*/
74
+ --ez-dropdown__link--primary--color: var(--color--primary, #008561);
75
+ /*@doc Define a cor utilizada para ações destrutivas como um excluir.*/
76
+ --ez-dropdown__link--critical--color: var(--color-alert--error-800, #BD0025);
77
+
78
+ /* scrollbar */
79
+ /*@doc Define a cor da barra de rolagem do componente.*/
80
+ --ez-dropdown__scrollbar--color-default: var(--scrollbar--default, #626e82);
81
+ /*@doc Define a cor de fundo da barra de rolagem do componente.*/
82
+ --ez-dropdown__scrollbar--color-background: var(--scrollbar--background, #E5EAF0);
83
+ /*@doc Define a cor do hover na barra de rolagem do componente.*/
84
+ --ez-dropdown__scrollbar--color-hover: var(--scrollbar--hover, #2B3A54);
85
+ /*@doc Define a cor do active na barra de rolagem do componente.*/
86
+ --ez-dropdown__scrollbar--color-clicked: var(--scrollbar--clicked, #a2abb9);
87
+ /*@doc Define o raio da borda da barra de rolagem do componente.*/
88
+ --ez-dropdown__scrollbar--border-radius: var(--border--radius-small, 6px);
89
+ /*@doc Define a largura da barra de rolagem do componente.*/
90
+ --ez-dropdown__scrollbar--width: var(--space--small, 6px);
91
+ /*@doc Define o espaçamento interno direito quando houver barra de rolagem.*/
92
+ --ez-dropdown__scrollbar--padding-right: var(--space--extra-small, 3px);
93
+
94
+ /***************
95
+ host style
96
+ ***************/
97
+ /*private*/
98
+ display: flex;
99
+ flex-direction: column;
100
+ height: fit-content;
101
+ user-select: none;
102
+ box-sizing: border-box;
103
+ position: fixed;
104
+
105
+ /*public*/
106
+ z-index: var(--ez-dropdown--z-index);
107
+ }
108
+
109
+ :host * {
110
+ box-sizing: border-box;
111
+ }
112
+
113
+ .ez-dropdown {
114
+ /*private*/
115
+ display: flex;
116
+
117
+ /*public*/
118
+ padding: var(--ez-dropdown--padding);
119
+ box-shadow: var(--ez-dropdown--box-shadow);
120
+ border-radius: var(--ez-dropdown--border-radius);
121
+ background-color: var(--ez-dropdown--background-color);
122
+ max-width: var(--ez-dropdown--max-width);
123
+ max-height: var(--ez-dropdown--max-height);
124
+ }
125
+
126
+ .ez-dropdown * {
127
+ /*public*/
128
+ font-family: var(--ez-dropdown--font-family);
129
+ }
130
+
131
+ .ez-dropdown__container {
132
+ /*private*/
133
+ display: flex;
134
+ flex-direction: column;
135
+ overflow-y: auto;
136
+ scrollbar-width: thin;
137
+ flex: auto;
138
+
139
+ /*public*/
140
+ scrollbar-color: var(--ez-dropdown__scrollbar--color-clicked) var(--ez-dropdown__scrollbar--color-background);
141
+ }
142
+
143
+ .ez-dropdown__container::-webkit-scrollbar {
144
+ /*public*/
145
+ background-color: var(--ez-dropdown__scrollbar--color-background);
146
+ width: var(--ez-dropdown__scrollbar--width);
147
+ max-width: var(--ez-dropdown__scrollbar--width);
148
+ min-width: var(--ez-dropdown__scrollbar--width);
149
+ }
150
+
151
+ .ez-dropdown__container::-webkit-scrollbar-track {
152
+ /*public*/
153
+ background-color: var(--ez-dropdown__scrollbar--color-background);
154
+ border-radius: var(--ez-dropdown__scrollbar--border-radius);
155
+ }
156
+
157
+ .ez-dropdown__container::-webkit-scrollbar-thumb {
158
+ /*public*/
159
+ background-color: var(--ez-dropdown__scrollbar--color-default);
160
+ border-radius: var(--ez-dropdown__scrollbar--border-radius);
161
+ }
162
+
163
+ .ez-dropdown__container::-webkit-scrollbar-thumb:vertical:hover,
164
+ .ez-dropdown__container::-webkit-scrollbar-thumb:horizontal:hover {
165
+ /*public*/
166
+ background-color: var(--ez-dropdown__scrollbar--color-hover);
167
+ }
168
+
169
+ .ez-dropdown__container::-webkit-scrollbar-thumb:vertical:active,
170
+ .ez-dropdown__container::-webkit-scrollbar-thumb:horizontal:active {
171
+ /*public*/
172
+ background-color: var(--ez-dropdown__scrollbar--color-clicked);
173
+ }
174
+
175
+ .ez-dropdown__container--spacer {
176
+ /*public*/
177
+ padding-right: var(--ez-dropdown__scrollbar--padding-right);
178
+ }
179
+
180
+ .ez-dropdown__item {
181
+ /*private*/
182
+ display: flex;
183
+ align-items: center;
184
+ background-color: transparent;
185
+
186
+ /*public*/
187
+ border-radius: var(--ez-dropdown__item--border-radius);
188
+ transition: var(--ez-dropdown__item--transition);
189
+ }
190
+
191
+ .ez-dropdown__item:hover {
192
+ /*public*/
193
+ background-color: var(--ez-dropdown__item--background-color);
194
+ }
195
+
196
+ .ez-dropdown__item-wrapper {
197
+ /*private*/
198
+ display: flex;
199
+ align-items: center;
200
+ position: relative;
201
+ cursor: pointer;
202
+ width: 100%;
203
+ margin: 0;
204
+ white-space: nowrap;
205
+
206
+ /*public*/
207
+ gap: var(--ez-dropdown__item--gap);
208
+ color: var(--ez-dropdown__item--color);
209
+ font-weight: var(--ez-dropdown__item--font-weight);
210
+ font-size: var(--ez-dropdown__item--font-size);
211
+ line-height: var(--ez-dropdown__item--line-height);
212
+ padding: var(--ez-dropdown__item--padding);
213
+ }
214
+
215
+ .ez-dropdown__item-wrapper ez-icon {
216
+ /*private*/
217
+ display: flex;
218
+ justify-content: center;
219
+ align-items: center;
220
+
221
+ /*public*/
222
+ width: var(--ez-dropdown__icon--size);
223
+ height: var(--ez-dropdown__icon--size);
224
+ min-width: var(--ez-dropdown__icon--size);
225
+ min-height: var(--ez-dropdown__icon--size);
226
+ }
227
+
228
+ .ez-dropdown__item-content {
229
+ /*private*/
230
+ display: flex;
231
+ align-items: center;
232
+ flex: auto;
233
+ overflow: hidden;
234
+
235
+ /*public*/
236
+ gap: var(--ez-dropdown__item--gap);
237
+ }
238
+
239
+ .ez-dropdown__item-label {
240
+ /* private */
241
+ text-align: left;
242
+ text-overflow: ellipsis;
243
+ overflow: hidden;
244
+ flex: auto;
245
+ }
246
+
247
+ .ez-dropdown__item-label:not(:last-child) {
248
+ /*public*/
249
+ margin-right: var(--ez-dropdown__item-label--margin-right);
250
+ }
251
+
252
+ .ez-dropdown__item-content + .ez-dropdown__link {
253
+ /*public*/
254
+ margin-left: var(--ez-dropdown__item-label--margin-right);
255
+ margin-right: var(--ez-dropdown__item--padding);
256
+ }
257
+
258
+ .ez-dropdown__item-builder {
259
+ /* private */
260
+ flex: auto;
261
+ }
262
+
263
+ .ez-dropdown__divider {
264
+ /*private*/
265
+ width: 100%;
266
+ height: 2px;
267
+ border-radius: 1px;
268
+ border: none;
269
+ display: block;
270
+
271
+ /*public*/
272
+ background-color: var(--ez-dropdown__divider--background-color);
273
+ margin: var(--ez-dropdown__divider--margin);
274
+ }
275
+
276
+ .ez-dropdown__hidden {
277
+ /*private*/
278
+ visibility: hidden;
279
+ }
280
+
281
+ .ez-dropdown__group {
282
+ /*private*/
283
+ display: flex;
284
+ flex-direction: column;
285
+ }
286
+
287
+ .ez-dropdown__group-label {
288
+ /*private*/
289
+ display: block;
290
+ width: 100%;
291
+ text-align: left;
292
+ overflow: hidden;
293
+ text-overflow: ellipsis;
294
+ white-space: nowrap;
295
+
296
+ /*public*/
297
+ color: var(--ez-dropdown__group-label--color);
298
+ font-weight: var(--ez-dropdown__group-label--font-weight);
299
+ font-size: var(--ez-dropdown__group-label--font-size);
300
+ line-height: var(--ez-dropdown__group-label--line-height);
301
+ padding: var(--ez-dropdown__group-label--padding);
302
+ }
303
+
304
+ .ez-dropdown__icon-right {
305
+ /*private*/
306
+ margin-left: auto;
307
+ }
308
+
309
+ .ez-dropdown__submenu {
310
+ /*private*/
311
+ position: fixed;
312
+
313
+ /*public*/
314
+ z-index: var(--ez-dropdown__submenu--z-index);
315
+ margin-top: calc(var(--ez-dropdown__item--padding) * -1);
316
+ }
317
+
318
+ .ez-dropdown__submenu--hide {
319
+ /*private*/
320
+ display: none;
321
+ }
322
+
323
+ .ez-dropdown__link {
324
+ /*private*/
325
+ display: block;
326
+ margin-left: auto;
327
+ cursor: pointer;
328
+ text-overflow: ellipsis;
329
+ overflow: hidden;
330
+
331
+ /*public*/
332
+ font-weight: var(--ez-dropdown__link--font-weight);
333
+ max-width: calc(var(--ez-dropdown--max-width) * 0.43);
334
+ }
335
+
336
+ .ez-dropdown__link--primary {
337
+ /*public*/
338
+ color: var(--ez-dropdown__link--primary--color);
339
+ }
340
+
341
+ .ez-dropdown__link--critical {
342
+ /*public*/
343
+ color: var(--ez-dropdown__link--critical--color);
344
+ }
345
+
346
+ .ez-dropdown__link:hover {
347
+ /*private*/
348
+ text-decoration: underline;
349
+ }
@@ -0,0 +1,339 @@
1
+ import { ElementIDUtils, ObjectUtils } from '@sankhyalabs/core';
2
+ import { Component, Element, Event, h, Host, Prop } from '@stencil/core';
3
+ import { DropdownItem } from './structure/DropdownItem';
4
+ import { SubmenuControl } from './structure/SubmenuControl';
5
+ export class EzDropdown {
6
+ constructor() {
7
+ this._itemList = {};
8
+ this._submenuList = [];
9
+ this._openedMenuList = {};
10
+ /**
11
+ * Limitador de níveis de menu + submenu.
12
+ * Valor 0, null ou undefined desativa o limitador.
13
+ */
14
+ this._levelLimits = 3;
15
+ /**
16
+ * Lista de itens que vão ser apresentados no dropdown.
17
+ */
18
+ this.items = [];
19
+ }
20
+ //---------------------------------------------
21
+ // Private methods
22
+ //---------------------------------------------
23
+ defaultItemBuilder(item, isLockedLevels, hasIcon, hasChildren) {
24
+ return (h(DropdownItem, { item: item, hasIcon: hasIcon, hasChildren: hasChildren, isLockedLevels: isLockedLevels, onSubActionClick: this.onSubActionClick.bind(this) }));
25
+ }
26
+ getMaxOrder(items) {
27
+ if (items == undefined || items.length === 0) {
28
+ return -1;
29
+ }
30
+ return Math.max(...items.map((item) => {
31
+ var _a;
32
+ const order = (_a = item.group) === null || _a === void 0 ? void 0 : _a["order"];
33
+ return order != undefined && order >= 0 ? order : -1;
34
+ }));
35
+ }
36
+ hasIcon(items) {
37
+ return items === null || items === void 0 ? void 0 : items.some((item) => (item.iconName || "") !== "");
38
+ }
39
+ hasGroup(items) {
40
+ return items === null || items === void 0 ? void 0 : items.some((item) => (item.group || "") !== "");
41
+ }
42
+ hasChildren(items) {
43
+ return items === null || items === void 0 ? void 0 : items.some((item) => (item.children || []).length > 0);
44
+ }
45
+ isLockedLevels(level) {
46
+ if (!this._levelLimits) {
47
+ return false;
48
+ }
49
+ return level === (this._levelLimits + 1);
50
+ }
51
+ getItemsByGroup(items, level) {
52
+ let itemsByGroup = {};
53
+ const maxOrder = this.getMaxOrder(items);
54
+ items.forEach((item) => {
55
+ const label = item.group && item.group["label"] != undefined ? item.group["label"] || "noGroup" : item.group || "noGroup";
56
+ const order = item.group && item.group["order"] != undefined ? item.group["order"] : item.group ? (maxOrder + 1) : (maxOrder + 2);
57
+ let groupObj = itemsByGroup[label];
58
+ if (groupObj == undefined) {
59
+ groupObj = {
60
+ items: [],
61
+ order
62
+ };
63
+ }
64
+ this.validateItem(item, level);
65
+ groupObj.items.push(item);
66
+ itemsByGroup[label] = groupObj;
67
+ });
68
+ return ObjectUtils.sortByProperty(itemsByGroup, "order");
69
+ }
70
+ validateItem(item, level) {
71
+ if (this._itemList == undefined) {
72
+ this._itemList = {};
73
+ }
74
+ if (item.type == undefined) {
75
+ item.type = "item";
76
+ }
77
+ if (item.id == undefined) {
78
+ const itemId = `level_${level}_${item.type}`;
79
+ const counter = Object.keys(this._itemList).filter((key) => key.includes(itemId)).length;
80
+ item.id = `${itemId}_${counter + 1}`;
81
+ }
82
+ if (item.label == undefined) {
83
+ item.label = "";
84
+ }
85
+ if (item.subAction != undefined) {
86
+ if (item.subAction.id == undefined) {
87
+ const subId = `subAction_${item.id}`;
88
+ item.subAction.id = subId;
89
+ }
90
+ if (item.subAction.label == undefined) {
91
+ item.subAction.label = "";
92
+ }
93
+ }
94
+ if (this._itemList[item.id] == undefined) {
95
+ this._itemList[item.id] = {};
96
+ }
97
+ }
98
+ getItemsRender(groupItems, level, hasIcon, hasChildren) {
99
+ if (groupItems == undefined) {
100
+ return;
101
+ }
102
+ let counterLevel = level;
103
+ let isLockedLevels = false;
104
+ if (hasChildren) {
105
+ counterLevel++;
106
+ isLockedLevels = this.isLockedLevels(counterLevel);
107
+ }
108
+ return groupItems.map((item) => {
109
+ var _a;
110
+ return (item.type !== "divider"
111
+ ? h("div", Object.assign({ ref: (ref) => this._itemList[item.id] = ref, class: "ez-dropdown__item", "data-level": level }, { [ElementIDUtils.DATA_ELEMENT_ID_ATTRIBUTE_NAME]: ElementIDUtils.getInternalIDInfo(`${item.id}_ezDropdownItem`) }),
112
+ h("div", { class: "ez-dropdown__item-content", onClick: (evt) => this.onItemClick(evt, item), onMouseOver: (evt) => this.onShowSubmenu(evt, item) }, this.itemBuilder
113
+ ? h("div", { class: "ez-dropdown__item-builder", innerHTML: this.itemBuilder(item, level) })
114
+ : this.defaultItemBuilder(item, isLockedLevels, hasIcon, hasChildren)),
115
+ ((_a = item.children) === null || _a === void 0 ? void 0 : _a.length) > 0 &&
116
+ !isLockedLevels &&
117
+ hasChildren &&
118
+ h("div", { ref: (ref) => this._submenuList.push(ref), class: "ez-dropdown__submenu ez-dropdown__submenu--hide" }, this.renderDropdown(item.children, counterLevel)))
119
+ : h("hr", Object.assign({ class: "ez-dropdown__divider" }, { [ElementIDUtils.DATA_ELEMENT_ID_ATTRIBUTE_NAME]: `${item.id}_ezDropdownDivider` })));
120
+ });
121
+ }
122
+ renderDropdown(branchItems = this.items, level = 1) {
123
+ if (branchItems == undefined || this.isLockedLevels(level)) {
124
+ return;
125
+ }
126
+ const itemsByGroup = this.getItemsByGroup(branchItems, level);
127
+ const hasGroup = this.hasGroup(branchItems);
128
+ const hasIcon = this.hasIcon(branchItems);
129
+ const hasChildren = this.hasChildren(branchItems);
130
+ return (h("div", { class: "ez-dropdown", "data-level": level },
131
+ h("div", { class: "ez-dropdown__container" }, Object.keys(itemsByGroup)
132
+ .map((groupLabel) => {
133
+ return (h("div", Object.assign({ class: "ez-dropdown__group" }, { [ElementIDUtils.DATA_ELEMENT_ID_ATTRIBUTE_NAME]: ElementIDUtils.getInternalIDInfo(`${groupLabel}_ezDropdownGroup`) }),
134
+ groupLabel !== "noGroup" &&
135
+ h("label", { class: "ez-dropdown__group-label", title: groupLabel }, groupLabel),
136
+ hasGroup &&
137
+ groupLabel === "noGroup" &&
138
+ h("hr", { class: "ez-dropdown__divider" }),
139
+ this.getItemsRender(itemsByGroup[groupLabel].items, level, hasIcon, hasChildren)));
140
+ }))));
141
+ }
142
+ hasOpenedSubmenu(level) {
143
+ const openedLevels = Object.keys(this._openedMenuList);
144
+ return openedLevels.includes(level.toString())
145
+ || openedLevels.some((openedLevel) => Number(openedLevel) > level);
146
+ }
147
+ hasSubmenuOpened() {
148
+ var _a;
149
+ return (_a = this._submenuList) === null || _a === void 0 ? void 0 : _a.some((submenu) => !submenu.classList.contains("ez-dropdown__submenu--hide"));
150
+ }
151
+ setEvents() {
152
+ document.removeEventListener('click', this.onHideAllSubmenu.bind(this));
153
+ document.addEventListener('click', this.onHideAllSubmenu.bind(this));
154
+ document.removeEventListener('scroll', this.onSubmenuReposition.bind(this));
155
+ document.addEventListener('scroll', this.onSubmenuReposition.bind(this));
156
+ }
157
+ //---------------------------------------------
158
+ // Event handlers
159
+ //---------------------------------------------
160
+ onShowSubmenu(evt, item) {
161
+ var _a;
162
+ if (evt == undefined) {
163
+ return;
164
+ }
165
+ const menu = this._itemList[item.id];
166
+ if (!(menu === null || menu === void 0 ? void 0 : menu.classList.contains("ez-dropdown__item"))) {
167
+ return;
168
+ }
169
+ const level = Number(menu.dataset.level || "0");
170
+ if (this.hasOpenedSubmenu(level)) {
171
+ this._submenuControl.hide(this._openedMenuList[level]);
172
+ delete this._openedMenuList[level];
173
+ }
174
+ if (!((_a = item.children) === null || _a === void 0 ? void 0 : _a.length)) {
175
+ return;
176
+ }
177
+ this._openedMenuList[menu.dataset.level] = menu;
178
+ this._submenuControl.show(menu);
179
+ }
180
+ onItemClick(evt, item) {
181
+ const target = evt === null || evt === void 0 ? void 0 : evt.target;
182
+ if (target === null || target === void 0 ? void 0 : target.classList.contains("ez-dropdown__link")) {
183
+ return;
184
+ }
185
+ this.value = item;
186
+ this.ezClick.emit(item);
187
+ }
188
+ onSubActionClick(item) {
189
+ this.ezSubActionClick.emit(item.subAction);
190
+ }
191
+ onHideAllSubmenu(evt = undefined) {
192
+ const target = evt === null || evt === void 0 ? void 0 : evt.target;
193
+ if (this.hasSubmenuOpened() && (target == undefined || (!target.closest(".ez-dropdown") && target.tagName !== "EZ-DROPDOWN"))) {
194
+ this._openedMenuList = {};
195
+ this._submenuList.forEach(this._submenuControl.reset.bind(this._submenuControl));
196
+ }
197
+ }
198
+ onSubmenuReposition() {
199
+ if (this._openedMenuList != undefined) {
200
+ Object.keys(this._openedMenuList).forEach((key) => {
201
+ const menu = this._openedMenuList[key];
202
+ this._submenuControl.setPosition(menu);
203
+ });
204
+ }
205
+ }
206
+ //---------------------------------------------
207
+ // Lifecycle web component
208
+ //---------------------------------------------
209
+ componentDidLoad() {
210
+ ElementIDUtils.addIDInfo(this._element);
211
+ this._submenuControl = new SubmenuControl();
212
+ this._submenuControl.setMaxHeight(this._element);
213
+ }
214
+ componentDidUpdate() {
215
+ this._submenuControl.setMaxHeight(this._element);
216
+ }
217
+ componentDidRender() {
218
+ this.setEvents();
219
+ }
220
+ render() {
221
+ return (h(Host, null, this.renderDropdown()));
222
+ }
223
+ static get is() { return "ez-dropdown"; }
224
+ static get encapsulation() { return "shadow"; }
225
+ static get originalStyleUrls() { return {
226
+ "$": ["ez-dropdown.css"]
227
+ }; }
228
+ static get styleUrls() { return {
229
+ "$": ["ez-dropdown.css"]
230
+ }; }
231
+ static get properties() { return {
232
+ "items": {
233
+ "type": "unknown",
234
+ "mutable": true,
235
+ "complexType": {
236
+ "original": "Array<IDropdownItem>",
237
+ "resolved": "IDropdownItem[]",
238
+ "references": {
239
+ "Array": {
240
+ "location": "global"
241
+ },
242
+ "IDropdownItem": {
243
+ "location": "import",
244
+ "path": "./structure/DropdownItem"
245
+ }
246
+ }
247
+ },
248
+ "required": false,
249
+ "optional": false,
250
+ "docs": {
251
+ "tags": [],
252
+ "text": "Lista de itens que v\u00E3o ser apresentados no dropdown."
253
+ },
254
+ "defaultValue": "[]"
255
+ },
256
+ "value": {
257
+ "type": "unknown",
258
+ "mutable": true,
259
+ "complexType": {
260
+ "original": "IDropdownItem",
261
+ "resolved": "IDropdownItem",
262
+ "references": {
263
+ "IDropdownItem": {
264
+ "location": "import",
265
+ "path": "./structure/DropdownItem"
266
+ }
267
+ }
268
+ },
269
+ "required": false,
270
+ "optional": false,
271
+ "docs": {
272
+ "tags": [],
273
+ "text": "\u00DAltimo item que recebeu o click."
274
+ }
275
+ },
276
+ "itemBuilder": {
277
+ "type": "unknown",
278
+ "mutable": false,
279
+ "complexType": {
280
+ "original": "(item: IDropdownItem, level: number) => string",
281
+ "resolved": "(item: IDropdownItem, level: number) => string",
282
+ "references": {
283
+ "IDropdownItem": {
284
+ "location": "import",
285
+ "path": "./structure/DropdownItem"
286
+ }
287
+ }
288
+ },
289
+ "required": false,
290
+ "optional": false,
291
+ "docs": {
292
+ "tags": [],
293
+ "text": "Fun\u00E7\u00E3o builder que possibilita alterar como o item da lista vai ser apresentado."
294
+ }
295
+ }
296
+ }; }
297
+ static get events() { return [{
298
+ "method": "ezClick",
299
+ "name": "ezClick",
300
+ "bubbles": true,
301
+ "cancelable": true,
302
+ "composed": true,
303
+ "docs": {
304
+ "tags": [],
305
+ "text": "Emitido quando ocorrer um click em um item da lista,\no IDropdownItem que recebeu o click deve ser enviado como data do evento."
306
+ },
307
+ "complexType": {
308
+ "original": "IDropdownItem",
309
+ "resolved": "IDropdownItem",
310
+ "references": {
311
+ "IDropdownItem": {
312
+ "location": "import",
313
+ "path": "./structure/DropdownItem"
314
+ }
315
+ }
316
+ }
317
+ }, {
318
+ "method": "ezSubActionClick",
319
+ "name": "ezSubActionClick",
320
+ "bubbles": true,
321
+ "cancelable": true,
322
+ "composed": true,
323
+ "docs": {
324
+ "tags": [],
325
+ "text": "Emitido quando ocorrer um click em uma a\u00E7\u00E3o secundaria do item, \no IDropdownSubAction deve ser enviado como data do evento."
326
+ },
327
+ "complexType": {
328
+ "original": "IDropdownSubAction",
329
+ "resolved": "IDropdownSubAction",
330
+ "references": {
331
+ "IDropdownSubAction": {
332
+ "location": "import",
333
+ "path": "./structure/DropdownItem"
334
+ }
335
+ }
336
+ }
337
+ }]; }
338
+ static get elementRef() { return "_element"; }
339
+ }