@weni/unnnic-system 3.12.6-alpha-teleports.0 → 3.12.8-alpha.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 (78) hide show
  1. package/.vscode/extensions.json +3 -0
  2. package/CHANGELOG.md +1080 -0
  3. package/README.md +1 -9
  4. package/dist/{es-ebc7770b.mjs → es-52edeb71.mjs} +1 -1
  5. package/dist/{index-f117a889.mjs → index-756fe685.mjs} +9070 -8660
  6. package/dist/index.d.ts +1013 -311
  7. package/dist/{pt-br-b1a08da0.mjs → pt-br-24583c8c.mjs} +1 -1
  8. package/dist/style.css +1 -1
  9. package/dist/unnnic.mjs +181 -177
  10. package/dist/unnnic.umd.js +33 -33
  11. package/package.json +1 -1
  12. package/src/assets/scss/scheme-colors.scss +223 -223
  13. package/src/components/Alert/__tests__/__snapshots__/Alert.spec.js.snap +1 -1
  14. package/src/components/ChartFunnel/DefaultFunnel/ChartDefaultFunnelBase.vue +1 -2
  15. package/src/components/ChartFunnel/SvgFunnel/ChartFunnelTwoRows.vue +60 -61
  16. package/src/components/Checkbox/Checkbox.vue +9 -3
  17. package/src/components/CheckboxGroup/CheckboxGroup.vue +7 -5
  18. package/src/components/Chip/Chip.vue +1 -1
  19. package/src/components/Drawer/Drawer.vue +20 -9
  20. package/src/components/Drawer/__tests__/Drawer.spec.js +11 -9
  21. package/src/components/Drawer/__tests__/__snapshots__/Drawer.spec.js.snap +9 -9
  22. package/src/components/FormElement/FormElement.vue +97 -88
  23. package/src/components/Input/BaseInput.vue +25 -5
  24. package/src/components/Input/Input.scss +2 -3
  25. package/src/components/Input/Input.vue +26 -3
  26. package/src/components/Input/TextInput.vue +64 -25
  27. package/src/components/Input/__test__/TextInput.spec.js +1 -1
  28. package/src/components/Input/__test__/__snapshots__/Input.spec.js.snap +5 -1
  29. package/src/components/Input/__test__/__snapshots__/TextInput.spec.js.snap +7 -1
  30. package/src/components/ModalDialog/ModalDialog.vue +11 -4
  31. package/src/components/MultiSelect/MultSelectOption.vue +49 -0
  32. package/src/components/MultiSelect/__tests__/MultiSelect.spec.js +557 -0
  33. package/src/components/MultiSelect/__tests__/MultiSelectOption.spec.js +229 -0
  34. package/src/components/MultiSelect/__tests__/__snapshots__/MultiSelect.spec.js.snap +87 -0
  35. package/src/components/MultiSelect/__tests__/__snapshots__/MultiSelectOption.spec.js.snap +51 -0
  36. package/src/components/MultiSelect/index.vue +265 -0
  37. package/src/components/Radio/Radio.vue +13 -7
  38. package/src/components/Radio/__test__/Radio.spec.js +3 -1
  39. package/src/components/RadioGroup/RadioGroup.vue +18 -10
  40. package/src/components/Select/__tests__/Select.spec.js +422 -0
  41. package/src/components/Select/__tests__/SelectItem.spec.js +330 -0
  42. package/src/components/Select/__tests__/__snapshots__/Popover.spec.js.snap +8 -0
  43. package/src/components/Select/__tests__/__snapshots__/Select.spec.js.snap +71 -0
  44. package/src/components/Select/__tests__/__snapshots__/SelectItem.spec.js.snap +15 -0
  45. package/src/components/Select/__tests__/__snapshots__/SelectOption.spec.js.snap +25 -0
  46. package/src/components/Select/__tests__/__snapshots__/SelectPopover.spec.js.snap +8 -0
  47. package/src/components/Select/index.vue +308 -0
  48. package/src/components/Switch/Switch.vue +11 -4
  49. package/src/components/TemplatePreview/TemplatePreview.vue +30 -27
  50. package/src/components/TemplatePreview/TemplatePreviewModal.vue +11 -11
  51. package/src/components/TemplatePreview/types.d.ts +3 -3
  52. package/src/components/Toast/Toast.vue +13 -9
  53. package/src/components/Toast/ToastManager.ts +1 -4
  54. package/src/components/Toast/__tests__/ToastManager.spec.js +6 -10
  55. package/src/components/ToolTip/ToolTip.vue +1 -1
  56. package/src/components/index.ts +10 -6
  57. package/src/components/ui/dialog/DialogContent.vue +5 -5
  58. package/src/components/ui/drawer/DrawerContent.vue +2 -4
  59. package/src/components/ui/popover/PopoverContent.vue +29 -13
  60. package/src/components/ui/popover/PopoverOption.vue +5 -1
  61. package/src/components/ui/tooltip/TooltipContent.vue +2 -5
  62. package/src/components/ui/tooltip/TooltipTrigger.vue +4 -2
  63. package/src/index.ts +2 -9
  64. package/src/lib/layer-manager.ts +52 -24
  65. package/src/locales/en.json +3 -1
  66. package/src/locales/es.json +3 -1
  67. package/src/locales/pt_br.json +3 -1
  68. package/src/stories/Input.mdx +3 -0
  69. package/src/stories/LayerManager.docs.mdx +9 -9
  70. package/src/stories/LayerManager.stories.js +11 -54
  71. package/src/stories/MultiSelect.stories.js +143 -45
  72. package/src/stories/Popover.stories.js +5 -0
  73. package/src/stories/Select.stories.js +161 -0
  74. package/src/stories/TemplatePreview.stories.js +27 -27
  75. package/src/stories/TemplatePreviewModal.stories.js +31 -31
  76. package/src/components/MultiSelect/MultiSelect.vue +0 -297
  77. package/src/lib/__tests__/teleport-target.spec.ts +0 -73
  78. package/src/lib/teleport-target.ts +0 -46
@@ -1,297 +0,0 @@
1
- <template>
2
- <div
3
- :class="expand ? 'expand-multiselect' : 'normal-multiselect'"
4
- tabindex="-1"
5
- >
6
- <span
7
- v-if="label"
8
- class="select-permission-label"
9
- >{{ label }}</span
10
- >
11
- <div
12
- class="select-permission"
13
- tabindex="0"
14
- @keypress="handleIsOpenKeyboard"
15
- @click="active = !active"
16
- >
17
- <h6 class="title noselect">{{ inputTitle }}</h6>
18
- <UnnnicIcon
19
- :icon="active ? 'arrow-button-up-1' : 'arrow-button-down-1'"
20
- size="sm"
21
- scheme="neutral-dark"
22
- />
23
- </div>
24
- <div
25
- v-if="active"
26
- v-on-click-outside="onClickOutside"
27
- class="select-content"
28
- tabindex="0"
29
- >
30
- <div>
31
- <template
32
- v-for="(group, indexGroup) in modelValue"
33
- :key="`group-${indexGroup}`"
34
- >
35
- <h6
36
- v-if="!hideGroupTitle"
37
- :key="`title-${indexGroup}`"
38
- class="title"
39
- >
40
- {{ group.title }}
41
- </h6>
42
- <section>
43
- <template
44
- v-for="(item, indexItem) in group.items"
45
- :key="`item-${indexItem}`"
46
- >
47
- <div
48
- v-if="hideRadio"
49
- :key="indexItem + 'input'"
50
- class="unnnic-radio-container unnnic-radio-container--sm"
51
- style="cursor: pointer"
52
- @click="change(indexGroup, indexItem)"
53
- >
54
- <strong>{{ item.title }}</strong>
55
- <span>{{ item.description }}</span>
56
- </div>
57
- <UnnnicRadio
58
- v-else
59
- id=""
60
- :key="'else' + indexItem + 'input'"
61
- name=""
62
- :modelValue="group.selected"
63
- :value="indexItem"
64
- size="sm"
65
- class=""
66
- @update:model-value="change(indexGroup, $event)"
67
- >
68
- <strong>{{ item.title }}</strong>
69
- <span>{{ item.description }}</span>
70
- </UnnnicRadio>
71
- </template>
72
- </section>
73
- </template>
74
- </div>
75
- </div>
76
- </div>
77
- </template>
78
-
79
- <script>
80
- import { vOnClickOutside } from '@vueuse/components';
81
- import UnnnicIcon from '../Icon.vue';
82
- import UnnnicRadio from '../Radio/Radio.vue';
83
-
84
- export default {
85
- name: 'UnnnicMultiSelect',
86
- components: {
87
- UnnnicIcon,
88
- UnnnicRadio,
89
- },
90
- directives: {
91
- onClickOutside: vOnClickOutside,
92
- },
93
- props: {
94
- isOpen: {
95
- default: false,
96
- },
97
- expand: {
98
- default: false,
99
- },
100
- label: {
101
- type: String,
102
- default: '',
103
- },
104
- modelValue: {
105
- type: Array,
106
- default: () => [],
107
- },
108
- inputTitle: {
109
- type: String,
110
- default: 'Teste',
111
- },
112
- hideRadio: {
113
- type: Boolean,
114
- default: false,
115
- },
116
- hideGroupTitle: {
117
- type: Boolean,
118
- default: false,
119
- },
120
- unselectable: {
121
- type: Boolean,
122
- default: false,
123
- },
124
- },
125
-
126
- data() {
127
- return {
128
- active: false,
129
- };
130
- },
131
-
132
- watch: {
133
- isOpen() {
134
- this.active = this.open;
135
- },
136
- },
137
- methods: {
138
- handleIsOpenKeyboard(event) {
139
- if (
140
- document.querySelector('.select-permission:focus-visible') &&
141
- event.keyCode === 32
142
- ) {
143
- this.active = !this.active;
144
- }
145
- },
146
-
147
- onClickOutside() {
148
- if (!this.active) return;
149
- this.active = false;
150
- },
151
-
152
- change(indexGroup, indexSelected) {
153
- this.$emit(
154
- 'update:model-value',
155
- this.modelValue.map((item, index) => {
156
- if (index === indexGroup) {
157
- let selected = indexSelected;
158
- if (this.unselectable && item.selected === indexSelected) {
159
- selected = -1;
160
- }
161
- return { ...item, selected };
162
- }
163
-
164
- return item;
165
- }),
166
- );
167
- },
168
- },
169
- };
170
- </script>
171
-
172
- <style lang="scss" scoped>
173
- @use '@/assets/scss/unnnic' as *;
174
-
175
- .normal-multiselect,
176
- .expand-multiselect {
177
- user-select: none;
178
- }
179
-
180
- .normal-multiselect {
181
- position: relative;
182
- max-width: 319px;
183
-
184
- .select-content {
185
- max-width: 319px;
186
- }
187
- }
188
-
189
- .expand-multiselect {
190
- position: relative;
191
- width: 100%;
192
-
193
- .select-content {
194
- width: 100%;
195
- }
196
- }
197
-
198
- .noselect {
199
- -webkit-touch-callout: none; /* iOS Safari */
200
- -webkit-user-select: none; /* Safari */
201
- -khtml-user-select: none; /* Konqueror HTML */
202
- -moz-user-select: none; /* Old versions of Firefox */
203
- -ms-user-select: none; /* Internet Explorer/Edge */
204
- user-select: none; /* Non-prefixed version, currently
205
- supported by Chrome, Edge, Opera and Firefox */
206
- }
207
-
208
- .select-permission,
209
- .select-content > div {
210
- padding: $unnnic-squish-xs;
211
- background-color: $unnnic-color-neutral-snow;
212
-
213
- border-radius: $unnnic-border-radius-sm;
214
- border: $unnnic-border-width-thinner solid $unnnic-color-neutral-soft;
215
- }
216
- .select-permission {
217
- display: flex;
218
- flex-direction: row;
219
- justify-content: space-between;
220
- align-items: center;
221
- line-height: $unnnic-font-size-body-gt + $unnnic-line-height-medium;
222
-
223
- cursor: pointer;
224
- .icon {
225
- margin-left: $unnnic-spacing-inline-xs;
226
- }
227
- }
228
- .select-permission-label {
229
- display: block;
230
-
231
- color: $unnnic-color-neutral-cloudy;
232
- margin-bottom: $unnnic-spacing-stack-xs;
233
-
234
- font-family: $unnnic-font-family-secondary;
235
- font-size: $unnnic-font-size-body-gt;
236
- line-height: $unnnic-font-size-body-gt + $unnnic-line-height-medium;
237
- }
238
-
239
- .title {
240
- font-family: $unnnic-font-family-secondary;
241
- font-size: $unnnic-font-size-body-gt;
242
- margin: 0;
243
- font-weight: $unnnic-font-weight-regular;
244
- color: $unnnic-color-neutral-dark;
245
- }
246
-
247
- .select-content {
248
- position: absolute;
249
- margin-top: $unnnic-spacing-stack-xs;
250
-
251
- > div {
252
- box-shadow: $unnnic-shadow-level-near;
253
- .title {
254
- margin-bottom: $unnnic-spacing-stack-sm;
255
- }
256
-
257
- & section {
258
- display: flex;
259
- flex-direction: column;
260
-
261
- & + h6 {
262
- margin-top: $unnnic-spacing-stack-sm;
263
- padding-top: $unnnic-spacing-stack-sm;
264
- border-top: $unnnic-border-width-thinner solid
265
- $unnnic-color-neutral-darkest;
266
- }
267
-
268
- strong,
269
- span {
270
- display: block;
271
- font-family: $unnnic-font-family-secondary;
272
- font-size: $unnnic-font-size-body-gt;
273
- }
274
-
275
- strong {
276
- font-weight: $unnnic-font-weight-regular;
277
- }
278
- span {
279
- font-weight: $unnnic-font-weight-light;
280
- }
281
-
282
- .unnnic-radio-container {
283
- & + .unnnic-radio-container {
284
- margin-top: $unnnic-spacing-stack-sm;
285
- padding-top: $unnnic-spacing-stack-sm;
286
- border-top: $unnnic-border-width-thinner solid
287
- $unnnic-color-neutral-lightest;
288
- }
289
-
290
- :deep(.unnnic-icon) {
291
- margin-right: $unnnic-inline-xs;
292
- }
293
- }
294
- }
295
- }
296
- }
297
- </style>
@@ -1,73 +0,0 @@
1
- import { describe, it, expect, beforeEach } from 'vitest';
2
- import { ref } from 'vue';
3
- import {
4
- getTeleportContainer,
5
- getTeleportTarget,
6
- setTeleportTarget,
7
- useTeleportTarget,
8
- } from '@/lib/teleport-target';
9
-
10
- describe('teleport-target helpers', () => {
11
- beforeEach(() => {
12
- setTeleportTarget(null);
13
- document.body.innerHTML = '';
14
- });
15
-
16
- it('stores and returns the raw teleport target', () => {
17
- expect(getTeleportTarget()).toBeUndefined();
18
-
19
- setTeleportTarget('#micro');
20
- expect(getTeleportTarget()).toBe('#micro');
21
-
22
- const element = document.createElement('section');
23
- setTeleportTarget(element);
24
- expect(getTeleportTarget()).toBe(element);
25
- });
26
-
27
- it('keeps the composable value in sync with global updates', () => {
28
- const targetRef = useTeleportTarget();
29
- expect(targetRef.value).toBeUndefined();
30
-
31
- setTeleportTarget('#first');
32
- expect(targetRef.value).toBe('#first');
33
-
34
- setTeleportTarget('#second');
35
- expect(targetRef.value).toBe('#second');
36
- });
37
-
38
- it('prefers local overrides over the shared teleport target', () => {
39
- setTeleportTarget('#global');
40
-
41
- const override = ref('#local-1');
42
- const targetRef = useTeleportTarget(override);
43
- expect(targetRef.value).toBe('#local-1');
44
-
45
- override.value = '#local-2';
46
- expect(targetRef.value).toBe('#local-2');
47
- });
48
-
49
- it('resolves DOM elements for selector targets', () => {
50
- const host = document.createElement('div');
51
- host.id = 'micro-root';
52
- document.body.appendChild(host);
53
-
54
- setTeleportTarget('#micro-root');
55
- expect(getTeleportContainer()).toBe(host);
56
- });
57
-
58
- it('falls back to document.body when selector is missing or unset', () => {
59
- setTeleportTarget('#missing');
60
- expect(getTeleportContainer()).toBe(document.body);
61
-
62
- setTeleportTarget(null);
63
- expect(getTeleportContainer()).toBe(document.body);
64
- });
65
-
66
- it('returns the element itself when the target is an HTMLElement', () => {
67
- const host = document.createElement('section');
68
- document.body.appendChild(host);
69
-
70
- setTeleportTarget(host);
71
- expect(getTeleportContainer()).toBe(host);
72
- });
73
- });
@@ -1,46 +0,0 @@
1
- import { computed, shallowRef, toValue, type MaybeRefOrGetter } from 'vue';
2
-
3
- export type TeleportTarget = string | HTMLElement;
4
-
5
- const teleportTargetRef = shallowRef<TeleportTarget | null>(null);
6
-
7
- export function setTeleportTarget(target?: TeleportTarget | null) {
8
- teleportTargetRef.value = target ?? null;
9
- }
10
-
11
- export function getTeleportTarget() {
12
- return teleportTargetRef.value ?? undefined;
13
- }
14
-
15
- export function useTeleportTarget(
16
- override?: MaybeRefOrGetter<TeleportTarget | null | undefined>,
17
- ) {
18
- // Composable version, ideal for `<Teleport :to="...">` bindings because the
19
- // returned ref stays reactive to both global and local overrides.
20
- return computed(() => {
21
- const localTarget = override ? toValue(override) : undefined;
22
- return localTarget ?? teleportTargetRef.value ?? undefined;
23
- });
24
- }
25
-
26
- function resolveTargetElement(target?: TeleportTarget | null) {
27
- if (typeof document === 'undefined') {
28
- return null;
29
- }
30
-
31
- if (!target) {
32
- return document.body;
33
- }
34
-
35
- if (typeof target === 'string') {
36
- return document.querySelector(target) ?? document.body;
37
- }
38
-
39
- return target;
40
- }
41
-
42
- export function getTeleportContainer() {
43
- // Immediate DOM resolver for imperative consumers (e.g., Toast manager)
44
- // that simply need the concrete HTMLElement to append to right away.
45
- return resolveTargetElement(teleportTargetRef.value);
46
- }