@ozdao/martyrs 0.2.541 → 0.2.542

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 (171) hide show
  1. package/dist/_virtual/index.cjs +4 -4
  2. package/dist/_virtual/index.js +4 -4
  3. package/dist/_virtual/index2.cjs +3 -6
  4. package/dist/_virtual/index2.cjs.map +1 -1
  5. package/dist/_virtual/index2.js +2 -5
  6. package/dist/_virtual/index2.js.map +1 -1
  7. package/dist/{main-BpBtIUcJ.js → main-ByKkD9qa.js} +2724 -3143
  8. package/dist/main-Czyu-VcC.cjs +11 -0
  9. package/dist/martyrs/src/components/FieldTags/BlockTags.vue.cjs +30 -21
  10. package/dist/martyrs/src/components/FieldTags/BlockTags.vue.cjs.map +1 -1
  11. package/dist/martyrs/src/components/FieldTags/BlockTags.vue.js +32 -23
  12. package/dist/martyrs/src/components/FieldTags/BlockTags.vue.js.map +1 -1
  13. package/dist/martyrs/src/components/FieldTags/FieldTags.vue2.cjs +235 -0
  14. package/dist/martyrs/src/components/FieldTags/FieldTags.vue2.cjs.map +1 -0
  15. package/dist/martyrs/src/components/FieldTags/FieldTags.vue2.js +235 -0
  16. package/dist/martyrs/src/components/FieldTags/FieldTags.vue2.js.map +1 -0
  17. package/dist/martyrs/src/components/Marquee/Marquee.vue.cjs +17 -8
  18. package/dist/martyrs/src/components/Marquee/Marquee.vue.cjs.map +1 -1
  19. package/dist/martyrs/src/components/Marquee/Marquee.vue.js +17 -8
  20. package/dist/martyrs/src/components/Marquee/Marquee.vue.js.map +1 -1
  21. package/dist/martyrs/src/components/Spoiler/{Spoiler.vue.cjs → Spoiler.vue2.cjs} +2 -2
  22. package/dist/martyrs/src/components/Spoiler/Spoiler.vue2.cjs.map +1 -0
  23. package/dist/martyrs/src/components/Spoiler/{Spoiler.vue.js → Spoiler.vue2.js} +2 -2
  24. package/dist/martyrs/src/components/Spoiler/{Spoiler.vue.cjs.map → Spoiler.vue2.js.map} +1 -1
  25. package/dist/martyrs/src/components/Tab/{Tab.vue.cjs → Tab.vue2.cjs} +2 -2
  26. package/dist/martyrs/src/components/Tab/Tab.vue2.cjs.map +1 -0
  27. package/dist/martyrs/src/components/Tab/{Tab.vue.js → Tab.vue2.js} +2 -2
  28. package/dist/martyrs/src/components/Tab/{Tab.vue.cjs.map → Tab.vue2.js.map} +1 -1
  29. package/dist/martyrs/src/components/UploadImage/UploadImage.vue.cjs +161 -42
  30. package/dist/martyrs/src/components/UploadImage/UploadImage.vue.cjs.map +1 -1
  31. package/dist/martyrs/src/components/UploadImage/UploadImage.vue.js +162 -43
  32. package/dist/martyrs/src/components/UploadImage/UploadImage.vue.js.map +1 -1
  33. package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.cjs +1 -1
  34. package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.js +1 -1
  35. package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.cjs +1 -1
  36. package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.js +1 -1
  37. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileBlogposts.vue.cjs +1 -1
  38. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileBlogposts.vue.js +1 -1
  39. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditProfile.vue.js +4 -4
  40. package/dist/martyrs/src/modules/auth/views/components/pages/ResetPassword.vue.cjs +1 -1
  41. package/dist/martyrs/src/modules/auth/views/components/pages/ResetPassword.vue.js +1 -1
  42. package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.cjs +1 -1
  43. package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.js +1 -1
  44. package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.cjs +1 -1
  45. package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.js +1 -1
  46. package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.cjs +0 -3
  47. package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.cjs.map +1 -1
  48. package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.js +0 -3
  49. package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.js.map +1 -1
  50. package/dist/martyrs/src/modules/constructor/components/elements/Card.vue.js +2 -2
  51. package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.js +21 -21
  52. package/dist/martyrs/src/modules/events/components/pages/EventsBackoffice.vue.cjs +1 -1
  53. package/dist/martyrs/src/modules/events/components/pages/EventsBackoffice.vue.js +1 -1
  54. package/dist/martyrs/src/modules/globals/views/classes/globals.i18n.cjs +1 -1
  55. package/dist/martyrs/src/modules/globals/views/classes/globals.i18n.js +1 -1
  56. package/dist/martyrs/src/modules/globals/views/components/partials/Navigation.vue.cjs +1 -1
  57. package/dist/martyrs/src/modules/globals/views/components/partials/Navigation.vue.js +1 -1
  58. package/dist/martyrs/src/modules/globals/views/components/sections/SectionPageTitle.vue.cjs +1 -1
  59. package/dist/martyrs/src/modules/globals/views/components/sections/SectionPageTitle.vue.js +1 -1
  60. package/dist/martyrs/src/modules/globals/views/components/sections/Walkthrough.vue.cjs +1 -1
  61. package/dist/martyrs/src/modules/globals/views/components/sections/Walkthrough.vue.js +1 -1
  62. package/dist/martyrs/src/modules/landing/components/sections/SectionGuide.vue.cjs +1 -1
  63. package/dist/martyrs/src/modules/landing/components/sections/SectionGuide.vue.js +1 -1
  64. package/dist/martyrs/src/modules/marketplace/views/components/layouts/Marketplace.vue.cjs +1 -1
  65. package/dist/martyrs/src/modules/marketplace/views/components/layouts/Marketplace.vue.js +1 -1
  66. package/dist/martyrs/src/modules/music/components/forms/AlbumForm.vue.js +11 -11
  67. package/dist/martyrs/src/modules/music/components/forms/ArtistForm.vue.js +12 -12
  68. package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.js +16 -16
  69. package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.js +16 -16
  70. package/dist/martyrs/src/modules/notifications/components/pages/Notifications.vue.cjs +1 -1
  71. package/dist/martyrs/src/modules/notifications/components/pages/Notifications.vue.js +1 -1
  72. package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.cjs +1 -1
  73. package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.js +1 -1
  74. package/dist/martyrs/src/modules/orders/components/pages/Orders.vue.cjs +1 -1
  75. package/dist/martyrs/src/modules/orders/components/pages/Orders.vue.js +1 -1
  76. package/dist/martyrs/src/modules/organizations/components/blocks/CardDepartment.vue.cjs +3 -4
  77. package/dist/martyrs/src/modules/organizations/components/blocks/CardDepartment.vue.cjs.map +1 -1
  78. package/dist/martyrs/src/modules/organizations/components/blocks/CardDepartment.vue.js +3 -4
  79. package/dist/martyrs/src/modules/organizations/components/blocks/CardDepartment.vue.js.map +1 -1
  80. package/dist/martyrs/src/modules/organizations/components/forms/DepartmentForm.vue.cjs +1 -1
  81. package/dist/martyrs/src/modules/organizations/components/forms/DepartmentForm.vue.js +20 -20
  82. package/dist/martyrs/src/modules/organizations/components/pages/Department.vue.cjs +3 -4
  83. package/dist/martyrs/src/modules/organizations/components/pages/Department.vue.cjs.map +1 -1
  84. package/dist/martyrs/src/modules/organizations/components/pages/Department.vue.js +3 -4
  85. package/dist/martyrs/src/modules/organizations/components/pages/Department.vue.js.map +1 -1
  86. package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.cjs +4 -5
  87. package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.cjs.map +1 -1
  88. package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.js +4 -5
  89. package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.js.map +1 -1
  90. package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.cjs +3 -4
  91. package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.cjs.map +1 -1
  92. package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.js +3 -4
  93. package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.js.map +1 -1
  94. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.cjs +1 -1
  95. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js +7 -7
  96. package/dist/martyrs/src/modules/organizations/components/pages/Organizations.vue.cjs +1 -1
  97. package/dist/martyrs/src/modules/organizations/components/pages/Organizations.vue.js +1 -1
  98. package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.cjs +1 -1
  99. package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.js +1 -1
  100. package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.cjs +46 -38
  101. package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.cjs.map +1 -1
  102. package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js +52 -44
  103. package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js.map +1 -1
  104. package/dist/martyrs/src/modules/products/components/pages/Product.vue.cjs +1 -1
  105. package/dist/martyrs/src/modules/products/components/pages/Product.vue.js +1 -1
  106. package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.cjs +1 -1
  107. package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.js +1 -1
  108. package/dist/martyrs/src/modules/products/components/pages/Products.vue.cjs +2 -2
  109. package/dist/martyrs/src/modules/products/components/pages/Products.vue.js +2 -2
  110. package/dist/martyrs/src/modules/products/components/sections/FilterProducts.vue.cjs +1 -1
  111. package/dist/martyrs/src/modules/products/components/sections/FilterProducts.vue.js +1 -1
  112. package/dist/martyrs/src/modules/products/components/sections/SectionProduct.vue.cjs +1 -1
  113. package/dist/martyrs/src/modules/products/components/sections/SectionProduct.vue.js +1 -1
  114. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.cjs +1 -1
  115. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.js +1 -1
  116. package/dist/martyrs/src/modules/rents/views/components/pages/Rents.vue.cjs +1 -1
  117. package/dist/martyrs/src/modules/rents/views/components/pages/Rents.vue.js +1 -1
  118. package/dist/martyrs/src/modules/spots/components/layouts/Spots.vue.cjs +1 -1
  119. package/dist/martyrs/src/modules/spots/components/layouts/Spots.vue.js +1 -1
  120. package/dist/martyrs/src/modules/spots/components/pages/Spot.vue.cjs +1 -1
  121. package/dist/martyrs/src/modules/spots/components/pages/Spot.vue.js +1 -1
  122. package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.cjs +1 -1
  123. package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.js +11 -11
  124. package/dist/martyrs.cjs.js +1 -1
  125. package/dist/martyrs.css +1 -1
  126. package/dist/martyrs.es.js +1 -1
  127. package/dist/node_modules/.pnpm/lodash.merge@4.6.2/node_modules/lodash.merge/index.cjs +1 -1
  128. package/dist/node_modules/.pnpm/lodash.merge@4.6.2/node_modules/lodash.merge/index.js +1 -1
  129. package/dist/style.css +129 -129
  130. package/dist/{web-DsdyXC8n.js → web-BklgIiYr.js} +1 -1
  131. package/dist/{web-C9bVm6Nw.cjs → web-CQBm7C6L.cjs} +1 -1
  132. package/package.json +1 -1
  133. package/src/components/FieldTags/BlockTags.vue +28 -16
  134. package/src/components/FieldTags/FieldTags.vue +327 -508
  135. package/src/components/Marquee/Marquee.vue +25 -14
  136. package/src/components/UploadImage/UploadImage.vue +192 -18
  137. package/src/modules/community/components/pages/CreateBlogPost.vue +0 -1
  138. package/src/modules/products/components/pages/CategoryEdit.vue +53 -39
  139. package/dist/_virtual/index3.cjs +0 -5
  140. package/dist/_virtual/index3.cjs.map +0 -1
  141. package/dist/_virtual/index3.js +0 -5
  142. package/dist/_virtual/index3.js.map +0 -1
  143. package/dist/main-7IA3UHca.cjs +0 -11
  144. package/dist/martyrs/src/components/FieldTags/FieldTags.vue.cjs +0 -480
  145. package/dist/martyrs/src/components/FieldTags/FieldTags.vue.cjs.map +0 -1
  146. package/dist/martyrs/src/components/FieldTags/FieldTags.vue.js +0 -480
  147. package/dist/martyrs/src/components/FieldTags/FieldTags.vue.js.map +0 -1
  148. package/dist/martyrs/src/components/FieldTags/create-tags.cjs +0 -52
  149. package/dist/martyrs/src/components/FieldTags/create-tags.cjs.map +0 -1
  150. package/dist/martyrs/src/components/FieldTags/create-tags.js +0 -52
  151. package/dist/martyrs/src/components/FieldTags/create-tags.js.map +0 -1
  152. package/dist/martyrs/src/components/FieldTags/tag-input.vue2.cjs +0 -32
  153. package/dist/martyrs/src/components/FieldTags/tag-input.vue2.cjs.map +0 -1
  154. package/dist/martyrs/src/components/FieldTags/tag-input.vue2.js +0 -32
  155. package/dist/martyrs/src/components/FieldTags/tag-input.vue2.js.map +0 -1
  156. package/dist/martyrs/src/components/FieldTags/vue-tags-input.props.cjs +0 -329
  157. package/dist/martyrs/src/components/FieldTags/vue-tags-input.props.cjs.map +0 -1
  158. package/dist/martyrs/src/components/FieldTags/vue-tags-input.props.js +0 -329
  159. package/dist/martyrs/src/components/FieldTags/vue-tags-input.props.js.map +0 -1
  160. package/dist/martyrs/src/components/Spoiler/Spoiler.vue.js.map +0 -1
  161. package/dist/martyrs/src/components/Tab/Tab.vue.js.map +0 -1
  162. package/dist/node_modules/.pnpm/fast-deep-equal@3.1.3/node_modules/fast-deep-equal/index.cjs +0 -39
  163. package/dist/node_modules/.pnpm/fast-deep-equal@3.1.3/node_modules/fast-deep-equal/index.cjs.map +0 -1
  164. package/dist/node_modules/.pnpm/fast-deep-equal@3.1.3/node_modules/fast-deep-equal/index.js +0 -39
  165. package/dist/node_modules/.pnpm/fast-deep-equal@3.1.3/node_modules/fast-deep-equal/index.js.map +0 -1
  166. package/src/components/FieldTags/FieldTagsNew.vue +0 -366
  167. package/src/components/FieldTags/README.md +0 -513
  168. package/src/components/FieldTags/create-tags.js +0 -97
  169. package/src/components/FieldTags/tag-input.vue +0 -55
  170. package/src/components/FieldTags/vue-tags-input.props.js +0 -342
  171. package/src/components/FieldTags/vue-tags-input.scss +0 -149
@@ -0,0 +1,235 @@
1
+ import { ref, computed, watch, createElementBlock, openBlock, createElementVNode, createCommentVNode, withDirectives, Fragment, renderList, createTextVNode, toDisplayString, vModelText, normalizeClass } from "vue";
2
+ /* empty css */
3
+ import _export_sfc from "../../../../_virtual/_plugin-vue_export-helper.js";
4
+ const _hoisted_1 = { class: "field-tags-new" };
5
+ const _hoisted_2 = { class: "tags-container" };
6
+ const _hoisted_3 = ["onClick"];
7
+ const _hoisted_4 = ["placeholder", "maxlength", "disabled"];
8
+ const _hoisted_5 = {
9
+ key: 0,
10
+ class: "autocomplete"
11
+ };
12
+ const _hoisted_6 = ["onClick", "onMouseenter"];
13
+ const _sfc_main = {
14
+ __name: "FieldTags",
15
+ props: {
16
+ modelValue: Array,
17
+ textField: {
18
+ type: String,
19
+ default: "text"
20
+ },
21
+ autocompleteItems: Array,
22
+ separators: {
23
+ type: Array,
24
+ default: () => [",", ";"]
25
+ },
26
+ addOnKey: {
27
+ type: Array,
28
+ default: () => [13]
29
+ // Enter key
30
+ },
31
+ maxTags: {
32
+ type: Number,
33
+ default: 20
34
+ },
35
+ maxlength: {
36
+ type: Number,
37
+ default: 50
38
+ },
39
+ placeholder: String,
40
+ disabled: Boolean,
41
+ addOnBlur: {
42
+ type: Boolean,
43
+ default: true
44
+ },
45
+ autocompleteMinLength: {
46
+ type: Number,
47
+ default: 1
48
+ }
49
+ },
50
+ emits: ["update:modelValue", "tags-changed"],
51
+ setup(__props, { emit: __emit }) {
52
+ const props = __props;
53
+ const emit = __emit;
54
+ const newTag = ref("");
55
+ const focused = ref(false);
56
+ const selectedIndex = ref(-1);
57
+ const inputRef = ref(null);
58
+ const tags = computed({
59
+ get: () => props.modelValue || [],
60
+ set: (value) => {
61
+ emit("update:modelValue", value);
62
+ emit("tags-changed", value);
63
+ }
64
+ });
65
+ const showAutocomplete = computed(() => {
66
+ return focused.value && props.autocompleteItems?.length > 0 && newTag.value.length >= props.autocompleteMinLength;
67
+ });
68
+ const filteredAutocomplete = computed(() => {
69
+ if (!props.autocompleteItems) return [];
70
+ const searchText = newTag.value.toLowerCase();
71
+ return props.autocompleteItems.filter((item) => {
72
+ const itemText = getTagText(item).toLowerCase();
73
+ if (!itemText.includes(searchText)) return false;
74
+ return !isDuplicate(itemText);
75
+ });
76
+ });
77
+ function getTagText(tag) {
78
+ if (tag === null || tag === void 0) return "";
79
+ if (typeof tag === "string") return tag;
80
+ return tag[props.textField] || "";
81
+ }
82
+ function createTag(text) {
83
+ if (tags.value.length > 0) {
84
+ if (typeof tags.value[0] === "string") {
85
+ return text;
86
+ }
87
+ }
88
+ return { [props.textField]: text };
89
+ }
90
+ function isDuplicate(text) {
91
+ const searchText = text.toLowerCase().trim();
92
+ return tags.value.some(
93
+ (tag) => getTagText(tag).toLowerCase().trim() === searchText
94
+ );
95
+ }
96
+ function addTag(input) {
97
+ let text = "";
98
+ if (typeof input === "string") {
99
+ text = input.trim();
100
+ } else if (typeof input === "object") {
101
+ if (props.autocompleteItems?.includes(input)) {
102
+ if (!isDuplicate(getTagText(input))) {
103
+ tags.value = [...tags.value, input];
104
+ }
105
+ newTag.value = "";
106
+ selectedIndex.value = -1;
107
+ return;
108
+ }
109
+ text = getTagText(input).trim();
110
+ }
111
+ if (!text || tags.value.length >= props.maxTags) return;
112
+ if (isDuplicate(text)) return;
113
+ const tag = createTag(text);
114
+ tags.value = [...tags.value, tag];
115
+ newTag.value = "";
116
+ selectedIndex.value = -1;
117
+ }
118
+ function removeTag(index) {
119
+ if (props.disabled) return;
120
+ const newTags = [...tags.value];
121
+ newTags.splice(index, 1);
122
+ tags.value = newTags;
123
+ }
124
+ function handleKeyDown(event) {
125
+ if (showAutocomplete.value) {
126
+ if (event.key === "ArrowDown") {
127
+ event.preventDefault();
128
+ selectedIndex.value = Math.min(
129
+ selectedIndex.value + 1,
130
+ filteredAutocomplete.value.length - 1
131
+ );
132
+ return;
133
+ }
134
+ if (event.key === "ArrowUp") {
135
+ event.preventDefault();
136
+ selectedIndex.value = Math.max(selectedIndex.value - 1, -1);
137
+ return;
138
+ }
139
+ if (event.key === "Enter" && selectedIndex.value >= 0) {
140
+ event.preventDefault();
141
+ addTag(filteredAutocomplete.value[selectedIndex.value]);
142
+ return;
143
+ }
144
+ }
145
+ const shouldAdd = props.addOnKey.some((key) => {
146
+ if (typeof key === "number") {
147
+ return event.keyCode === key;
148
+ }
149
+ return event.key === key;
150
+ });
151
+ if (shouldAdd) {
152
+ event.preventDefault();
153
+ addTag(newTag.value);
154
+ return;
155
+ }
156
+ if (event.key === "Backspace" && newTag.value === "" && tags.value.length > 0) {
157
+ removeTag(tags.value.length - 1);
158
+ }
159
+ }
160
+ function handlePaste(event) {
161
+ event.preventDefault();
162
+ const text = event.clipboardData.getData("text");
163
+ if (!text) return;
164
+ const separatorRegex = new RegExp(
165
+ props.separators.map((s) => s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")).join("|")
166
+ );
167
+ const parts = text.split(separatorRegex);
168
+ parts.forEach((part) => {
169
+ if (tags.value.length >= props.maxTags) return;
170
+ addTag(part);
171
+ });
172
+ }
173
+ function handleBlur() {
174
+ setTimeout(() => {
175
+ focused.value = false;
176
+ selectedIndex.value = -1;
177
+ if (props.addOnBlur && newTag.value) {
178
+ addTag(newTag.value);
179
+ }
180
+ }, 200);
181
+ }
182
+ watch(filteredAutocomplete, () => {
183
+ selectedIndex.value = -1;
184
+ });
185
+ return (_ctx, _cache) => {
186
+ return openBlock(), createElementBlock("div", _hoisted_1, [
187
+ createElementVNode("div", _hoisted_2, [
188
+ (openBlock(true), createElementBlock(Fragment, null, renderList(tags.value, (tag, index) => {
189
+ return openBlock(), createElementBlock("span", {
190
+ key: index,
191
+ class: "tag"
192
+ }, [
193
+ createTextVNode(toDisplayString(getTagText(tag)) + " ", 1),
194
+ createElementVNode("button", {
195
+ onClick: ($event) => removeTag(index),
196
+ class: "tag-remove",
197
+ type: "button"
198
+ }, " × ", 8, _hoisted_3)
199
+ ]);
200
+ }), 128)),
201
+ withDirectives(createElementVNode("input", {
202
+ ref_key: "inputRef",
203
+ ref: inputRef,
204
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => newTag.value = $event),
205
+ onKeydown: handleKeyDown,
206
+ onPaste: handlePaste,
207
+ onFocus: _cache[1] || (_cache[1] = ($event) => focused.value = true),
208
+ onBlur: handleBlur,
209
+ placeholder: __props.placeholder || "Add tags",
210
+ maxlength: __props.maxlength,
211
+ disabled: __props.disabled,
212
+ class: "tag-input"
213
+ }, null, 40, _hoisted_4), [
214
+ [vModelText, newTag.value]
215
+ ])
216
+ ]),
217
+ showAutocomplete.value && filteredAutocomplete.value.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_5, [
218
+ (openBlock(true), createElementBlock(Fragment, null, renderList(filteredAutocomplete.value, (item, index) => {
219
+ return openBlock(), createElementBlock("div", {
220
+ key: getTagText(item),
221
+ onClick: ($event) => addTag(item),
222
+ onMouseenter: ($event) => selectedIndex.value = index,
223
+ class: normalizeClass(["autocomplete-item", { selected: selectedIndex.value === index }])
224
+ }, toDisplayString(getTagText(item)), 43, _hoisted_6);
225
+ }), 128))
226
+ ])) : createCommentVNode("", true)
227
+ ]);
228
+ };
229
+ }
230
+ };
231
+ const FieldTags = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-1b76c0f9"]]);
232
+ export {
233
+ FieldTags as default
234
+ };
235
+ //# sourceMappingURL=FieldTags.vue2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FieldTags.vue2.js","sources":["../../../../../src/components/FieldTags/FieldTags.vue"],"sourcesContent":["<template>\n <div class=\"field-tags-new\">\n <!-- Tags container -->\n <div class=\"tags-container\">\n <span \n v-for=\"(tag, index) in tags\" \n :key=\"index\"\n class=\"tag\"\n >\n {{ getTagText(tag) }}\n <button \n @click=\"removeTag(index)\" \n class=\"tag-remove\"\n type=\"button\"\n >\n ×\n </button>\n </span>\n \n <input\n ref=\"inputRef\"\n v-model=\"newTag\"\n @keydown=\"handleKeyDown\"\n @paste=\"handlePaste\"\n @focus=\"focused = true\"\n @blur=\"handleBlur\"\n :placeholder=\"placeholder || 'Add tags'\"\n :maxlength=\"maxlength\"\n :disabled=\"disabled\"\n class=\"tag-input\"\n />\n </div>\n \n <!-- Autocomplete dropdown -->\n <div \n v-if=\"showAutocomplete && filteredAutocomplete.length > 0\"\n class=\"autocomplete\"\n >\n <div \n v-for=\"(item, index) in filteredAutocomplete\"\n :key=\"getTagText(item)\"\n @click=\"addTag(item)\"\n @mouseenter=\"selectedIndex = index\"\n :class=\"['autocomplete-item', { selected: selectedIndex === index }]\"\n >\n {{ getTagText(item) }}\n </div>\n </div>\n </div>\n</template>\n\n<script setup>\nimport { ref, computed, watch } from 'vue'\n\nconst props = defineProps({\n modelValue: Array,\n textField: {\n type: String,\n default: 'text'\n },\n autocompleteItems: Array,\n separators: {\n type: Array,\n default: () => [',', ';']\n },\n addOnKey: {\n type: Array,\n default: () => [13] // Enter key\n },\n maxTags: {\n type: Number,\n default: 20\n },\n maxlength: {\n type: Number,\n default: 50\n },\n placeholder: String,\n disabled: Boolean,\n addOnBlur: {\n type: Boolean,\n default: true\n },\n autocompleteMinLength: {\n type: Number,\n default: 1\n }\n})\n\nconst emit = defineEmits(['update:modelValue', 'tags-changed'])\n\n// State\nconst newTag = ref('')\nconst focused = ref(false)\nconst selectedIndex = ref(-1)\nconst inputRef = ref(null)\n\n// Computed\nconst tags = computed({\n get: () => props.modelValue || [],\n set: (value) => {\n emit('update:modelValue', value)\n emit('tags-changed', value)\n }\n})\n\nconst showAutocomplete = computed(() => {\n return focused.value && \n props.autocompleteItems?.length > 0 &&\n newTag.value.length >= props.autocompleteMinLength\n})\n\nconst filteredAutocomplete = computed(() => {\n if (!props.autocompleteItems) return []\n \n const searchText = newTag.value.toLowerCase()\n \n return props.autocompleteItems.filter(item => {\n const itemText = getTagText(item).toLowerCase()\n \n // Filter by search text\n if (!itemText.includes(searchText)) return false\n \n // Filter out duplicates\n return !isDuplicate(itemText)\n })\n})\n\n// Methods\nfunction getTagText(tag) {\n if (tag === null || tag === undefined) return ''\n if (typeof tag === 'string') return tag\n return tag[props.textField] || ''\n}\n\nfunction createTag(text) {\n // Preserve format based on existing data\n if (tags.value.length > 0) {\n if (typeof tags.value[0] === 'string') {\n return text\n }\n }\n \n // Default to object with custom field\n return { [props.textField]: text }\n}\n\nfunction isDuplicate(text) {\n const searchText = text.toLowerCase().trim()\n return tags.value.some(tag => \n getTagText(tag).toLowerCase().trim() === searchText\n )\n}\n\nfunction addTag(input) {\n let text = ''\n \n if (typeof input === 'string') {\n text = input.trim()\n } else if (typeof input === 'object') {\n // If it's an autocomplete item, preserve the whole object\n if (props.autocompleteItems?.includes(input)) {\n if (!isDuplicate(getTagText(input))) {\n tags.value = [...tags.value, input]\n }\n newTag.value = ''\n selectedIndex.value = -1\n return\n }\n text = getTagText(input).trim()\n }\n \n if (!text || tags.value.length >= props.maxTags) return\n \n if (isDuplicate(text)) return\n \n const tag = createTag(text)\n tags.value = [...tags.value, tag]\n newTag.value = ''\n selectedIndex.value = -1\n}\n\nfunction removeTag(index) {\n if (props.disabled) return\n \n const newTags = [...tags.value]\n newTags.splice(index, 1)\n tags.value = newTags\n}\n\nfunction handleKeyDown(event) {\n // Handle arrow keys for autocomplete navigation\n if (showAutocomplete.value) {\n if (event.key === 'ArrowDown') {\n event.preventDefault()\n selectedIndex.value = Math.min(\n selectedIndex.value + 1, \n filteredAutocomplete.value.length - 1\n )\n return\n }\n \n if (event.key === 'ArrowUp') {\n event.preventDefault()\n selectedIndex.value = Math.max(selectedIndex.value - 1, -1)\n return\n }\n \n // Add selected autocomplete item on Enter\n if (event.key === 'Enter' && selectedIndex.value >= 0) {\n event.preventDefault()\n addTag(filteredAutocomplete.value[selectedIndex.value])\n return\n }\n }\n \n // Check for add triggers\n const shouldAdd = props.addOnKey.some(key => {\n if (typeof key === 'number') {\n return event.keyCode === key\n }\n return event.key === key\n })\n \n if (shouldAdd) {\n event.preventDefault()\n addTag(newTag.value)\n return\n }\n \n // Handle backspace to delete last tag\n if (event.key === 'Backspace' && newTag.value === '' && tags.value.length > 0) {\n removeTag(tags.value.length - 1)\n }\n}\n\nfunction handlePaste(event) {\n event.preventDefault()\n \n const text = event.clipboardData.getData('text')\n if (!text) return\n \n // Create regex from separators\n const separatorRegex = new RegExp(\n props.separators.map(s => s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')).join('|')\n )\n \n // Split by separators and add each tag\n const parts = text.split(separatorRegex)\n \n parts.forEach(part => {\n if (tags.value.length >= props.maxTags) return\n addTag(part)\n })\n}\n\nfunction handleBlur() {\n // Small delay to allow click on autocomplete items\n setTimeout(() => {\n focused.value = false\n selectedIndex.value = -1\n \n if (props.addOnBlur && newTag.value) {\n addTag(newTag.value)\n }\n }, 200)\n}\n\n// Reset selected index when autocomplete items change\nwatch(filteredAutocomplete, () => {\n selectedIndex.value = -1\n})\n</script>\n\n<style scoped>\n.field-tags-new {\n position: relative;\n}\n\n.tags-container {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 0.5rem;\n}\n\n.tag {\n display: inline-flex;\n align-items: center;\n background: rgb(var(--main, 255, 215, 0));\n color: rgb(var(--black, 0, 0, 0));\n padding: 0.25rem 0.5rem;\n border-radius: 2rem;\n font-size: 0.875rem;\n}\n\n.tag-remove {\n margin-left: 0.25rem;\n background: none;\n border: none;\n color: inherit;\n font-size: 1.25rem;\n cursor: pointer;\n padding: 0;\n line-height: 1;\n opacity: 0.7;\n}\n\n.tag-remove:hover {\n opacity: 1;\n}\n\n.tag-input {\n flex: 1;\n border: none;\n background: none;\n outline: none;\n min-width: 150px;\n padding: 0.25rem;\n font-size: inherit;\n font-family: inherit;\n}\n\n.tag-input:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n.autocomplete {\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n margin-top: 0.25rem;\n background: white;\n border: 1px solid rgb(var(--gray, 224, 224, 224));\n border-radius: 0.5rem;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n max-height: 200px;\n overflow-y: auto;\n z-index: 100;\n}\n\n.autocomplete-item {\n padding: 0.5rem 0.75rem;\n cursor: pointer;\n transition: background-color 0.2s;\n}\n\n.autocomplete-item:hover,\n.autocomplete-item.selected {\n background: rgb(var(--gray-light, 248, 248, 248));\n}\n\n.autocomplete-item:first-child {\n border-radius: 0.5rem 0.5rem 0 0;\n}\n\n.autocomplete-item:last-child {\n border-radius: 0 0 0.5rem 0.5rem;\n}\n</style>"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsDA,UAAM,QAAQ;AAmCd,UAAM,OAAO;AAGb,UAAM,SAAS,IAAI,EAAE;AACrB,UAAM,UAAU,IAAI,KAAK;AACzB,UAAM,gBAAgB,IAAI,EAAE;AAC5B,UAAM,WAAW,IAAI,IAAI;AAGzB,UAAM,OAAO,SAAS;AAAA,MACpB,KAAK,MAAM,MAAM,cAAc,CAAA;AAAA,MAC/B,KAAK,CAAC,UAAU;AACd,aAAK,qBAAqB,KAAK;AAC/B,aAAK,gBAAgB,KAAK;AAAA,MAC5B;AAAA,IACF,CAAC;AAED,UAAM,mBAAmB,SAAS,MAAM;AACtC,aAAO,QAAQ,SACR,MAAM,mBAAmB,SAAS,KAClC,OAAO,MAAM,UAAU,MAAM;AAAA,IACtC,CAAC;AAED,UAAM,uBAAuB,SAAS,MAAM;AAC1C,UAAI,CAAC,MAAM,kBAAmB,QAAO,CAAA;AAErC,YAAM,aAAa,OAAO,MAAM,YAAW;AAE3C,aAAO,MAAM,kBAAkB,OAAO,UAAQ;AAC5C,cAAM,WAAW,WAAW,IAAI,EAAE,YAAW;AAG7C,YAAI,CAAC,SAAS,SAAS,UAAU,EAAG,QAAO;AAG3C,eAAO,CAAC,YAAY,QAAQ;AAAA,MAC9B,CAAC;AAAA,IACH,CAAC;AAGD,aAAS,WAAW,KAAK;AACvB,UAAI,QAAQ,QAAQ,QAAQ,OAAW,QAAO;AAC9C,UAAI,OAAO,QAAQ,SAAU,QAAO;AACpC,aAAO,IAAI,MAAM,SAAS,KAAK;AAAA,IACjC;AAEA,aAAS,UAAU,MAAM;AAEvB,UAAI,KAAK,MAAM,SAAS,GAAG;AACzB,YAAI,OAAO,KAAK,MAAM,CAAC,MAAM,UAAU;AACrC,iBAAO;AAAA,QACT;AAAA,MACF;AAGA,aAAO,EAAE,CAAC,MAAM,SAAS,GAAG,KAAI;AAAA,IAClC;AAEA,aAAS,YAAY,MAAM;AACzB,YAAM,aAAa,KAAK,YAAW,EAAG,KAAI;AAC1C,aAAO,KAAK,MAAM;AAAA,QAAK,SACrB,WAAW,GAAG,EAAE,YAAW,EAAG,KAAI,MAAO;AAAA,MAC7C;AAAA,IACA;AAEA,aAAS,OAAO,OAAO;AACrB,UAAI,OAAO;AAEX,UAAI,OAAO,UAAU,UAAU;AAC7B,eAAO,MAAM,KAAI;AAAA,MACnB,WAAW,OAAO,UAAU,UAAU;AAEpC,YAAI,MAAM,mBAAmB,SAAS,KAAK,GAAG;AAC5C,cAAI,CAAC,YAAY,WAAW,KAAK,CAAC,GAAG;AACnC,iBAAK,QAAQ,CAAC,GAAG,KAAK,OAAO,KAAK;AAAA,UACpC;AACA,iBAAO,QAAQ;AACf,wBAAc,QAAQ;AACtB;AAAA,QACF;AACA,eAAO,WAAW,KAAK,EAAE,KAAI;AAAA,MAC/B;AAEA,UAAI,CAAC,QAAQ,KAAK,MAAM,UAAU,MAAM,QAAS;AAEjD,UAAI,YAAY,IAAI,EAAG;AAEvB,YAAM,MAAM,UAAU,IAAI;AAC1B,WAAK,QAAQ,CAAC,GAAG,KAAK,OAAO,GAAG;AAChC,aAAO,QAAQ;AACf,oBAAc,QAAQ;AAAA,IACxB;AAEA,aAAS,UAAU,OAAO;AACxB,UAAI,MAAM,SAAU;AAEpB,YAAM,UAAU,CAAC,GAAG,KAAK,KAAK;AAC9B,cAAQ,OAAO,OAAO,CAAC;AACvB,WAAK,QAAQ;AAAA,IACf;AAEA,aAAS,cAAc,OAAO;AAE5B,UAAI,iBAAiB,OAAO;AAC1B,YAAI,MAAM,QAAQ,aAAa;AAC7B,gBAAM,eAAc;AACpB,wBAAc,QAAQ,KAAK;AAAA,YACzB,cAAc,QAAQ;AAAA,YACtB,qBAAqB,MAAM,SAAS;AAAA,UAC5C;AACM;AAAA,QACF;AAEA,YAAI,MAAM,QAAQ,WAAW;AAC3B,gBAAM,eAAc;AACpB,wBAAc,QAAQ,KAAK,IAAI,cAAc,QAAQ,GAAG,EAAE;AAC1D;AAAA,QACF;AAGA,YAAI,MAAM,QAAQ,WAAW,cAAc,SAAS,GAAG;AACrD,gBAAM,eAAc;AACpB,iBAAO,qBAAqB,MAAM,cAAc,KAAK,CAAC;AACtD;AAAA,QACF;AAAA,MACF;AAGA,YAAM,YAAY,MAAM,SAAS,KAAK,SAAO;AAC3C,YAAI,OAAO,QAAQ,UAAU;AAC3B,iBAAO,MAAM,YAAY;AAAA,QAC3B;AACA,eAAO,MAAM,QAAQ;AAAA,MACvB,CAAC;AAED,UAAI,WAAW;AACb,cAAM,eAAc;AACpB,eAAO,OAAO,KAAK;AACnB;AAAA,MACF;AAGA,UAAI,MAAM,QAAQ,eAAe,OAAO,UAAU,MAAM,KAAK,MAAM,SAAS,GAAG;AAC7E,kBAAU,KAAK,MAAM,SAAS,CAAC;AAAA,MACjC;AAAA,IACF;AAEA,aAAS,YAAY,OAAO;AAC1B,YAAM,eAAc;AAEpB,YAAM,OAAO,MAAM,cAAc,QAAQ,MAAM;AAC/C,UAAI,CAAC,KAAM;AAGX,YAAM,iBAAiB,IAAI;AAAA,QACzB,MAAM,WAAW,IAAI,OAAK,EAAE,QAAQ,uBAAuB,MAAM,CAAC,EAAE,KAAK,GAAG;AAAA,MAChF;AAGE,YAAM,QAAQ,KAAK,MAAM,cAAc;AAEvC,YAAM,QAAQ,UAAQ;AACpB,YAAI,KAAK,MAAM,UAAU,MAAM,QAAS;AACxC,eAAO,IAAI;AAAA,MACb,CAAC;AAAA,IACH;AAEA,aAAS,aAAa;AAEpB,iBAAW,MAAM;AACf,gBAAQ,QAAQ;AAChB,sBAAc,QAAQ;AAEtB,YAAI,MAAM,aAAa,OAAO,OAAO;AACnC,iBAAO,OAAO,KAAK;AAAA,QACrB;AAAA,MACF,GAAG,GAAG;AAAA,IACR;AAGA,UAAM,sBAAsB,MAAM;AAChC,oBAAc,QAAQ;AAAA,IACxB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -33,6 +33,7 @@ const _sfc_main = {
33
33
  const resizeObserver = vue.ref(null);
34
34
  const checkInterval = vue.ref(null);
35
35
  const resizeTimeout = vue.ref(null);
36
+ const previousSize = vue.ref({ width: 0, height: 0 });
36
37
  const widthMin = vue.ref("100%");
37
38
  const widthContainer = vue.ref(0);
38
39
  const widthContent = vue.ref(0);
@@ -87,11 +88,19 @@ const _sfc_main = {
87
88
  if (resizeObserver.value) {
88
89
  resizeObserver.value.disconnect();
89
90
  }
90
- resizeObserver.value = new ResizeObserver(() => {
91
- clearTimeout(resizeTimeout.value);
92
- resizeTimeout.value = setTimeout(() => {
93
- calculateClones();
94
- }, 150);
91
+ resizeObserver.value = new ResizeObserver((entries) => {
92
+ const entry = entries[0];
93
+ const newWidth = entry.contentRect.width;
94
+ const newHeight = entry.contentRect.height;
95
+ const widthChanged = Math.abs(newWidth - previousSize.value.width) > 1;
96
+ const heightChanged = Math.abs(newHeight - previousSize.value.height) > 1;
97
+ if (widthChanged || heightChanged) {
98
+ previousSize.value = { width: newWidth, height: newHeight };
99
+ clearTimeout(resizeTimeout.value);
100
+ resizeTimeout.value = setTimeout(() => {
101
+ calculateClones();
102
+ }, 300);
103
+ }
95
104
  });
96
105
  resizeObserver.value.observe(marqueeOverlayContainer.value);
97
106
  } else {
@@ -125,7 +134,7 @@ const _sfc_main = {
125
134
  "--pauseOnHover": `${props.pauseOnHover ? "paused" : "running"}`,
126
135
  "--pauseOnClick": `${props.pauseOnClick ? "paused" : "running"}`,
127
136
  "--pauseAnimation": `${props.vertical && verticalAnimationPause.value || props.pause ? "paused" : "running"}`,
128
- "--gradient-color": `rgba(${props.gradientColor}, 1), rgba(${props.gradientColor}, 0)`,
137
+ "--gradient-color": props.gradientColor,
129
138
  "--gradient-length": `${gradientLength.value}`,
130
139
  "--min-width": `${widthMin.value}`,
131
140
  "--min-height": `${heightMin.value}`,
@@ -181,9 +190,9 @@ const _sfc_main = {
181
190
  (newVal, oldVal) => {
182
191
  if (newVal !== oldVal) {
183
192
  if (newVal) {
184
- emits("onResume");
185
- } else {
186
193
  emits("onPause");
194
+ } else {
195
+ emits("onResume");
187
196
  }
188
197
  }
189
198
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Marquee.vue.cjs","sources":["../../../../../src/components/Marquee/Marquee.vue"],"sourcesContent":["<template>\n <div\n v-if=\"ready\"\n class=\"vue3-marquee\"\n :class=\"{ vertical: vertical, horizontal: !vertical }\"\n :style=\"getCurrentStyle\"\n @mouseenter=\"hoverStarted\"\n @mouseleave=\"hoverEnded\"\n @mousedown=\"mouseDown\"\n @mouseup=\"mouseUp\"\n >\n <div\n class=\"transparent-overlay\"\n ref=\"marqueeOverlayContainer\"\n :aria-hidden=\"true\"\n :class=\"{ vertical: vertical, horizontal: !vertical, overlay: gradient }\"\n />\n\n <div \n class=\"marquee\"\n ref=\"marqueeContent\">\n <slot></slot>\n </div>\n\n <div \n class=\"marquee\" \n :aria-hidden=\"true\"\n >\n <slot></slot>\n </div>\n\n <div\n v-for=\"num in cloneAmount\"\n :key=\"num\"\n :aria-hidden=\"true\"\n class=\"marquee cloned\"\n >\n <slot></slot>\n </div\n >\n </div>\n</template>\n\n<script setup>\nimport { ref, onMounted, onBeforeUnmount, computed, watch, nextTick } from 'vue'\n\nconst props = defineProps({\n vertical: { type: Boolean, default: false },\n direction: { type: String, default: 'normal' },\n duration: { type: Number, default: 20 },\n delay: { type: Number, default: 0 },\n loop: { type: Number, default: 0 },\n clone: { type: Boolean, default: false },\n gradient: { type: Boolean, default: false },\n gradientColor: { type: [Array,String], default: () => [255, 255, 255] },\n gradientLength: { type: String },\n pauseOnHover: { type: Boolean, default: false },\n pauseOnClick: { type: Boolean, default: false },\n pause: { type: Boolean, default: false }\n})\n\nconst emits = defineEmits(['onComplete', 'onLoopComplete', 'onPause', 'onResume'])\n\nconst ready = ref(false)\n\nconst cloneAmount = ref(0)\nconst loopCounter = ref(0)\nconst loopInterval = ref(null)\nconst resizeObserver = ref(null)\nconst checkInterval = ref(null)\nconst resizeTimeout = ref(null)\n\nconst widthMin = ref('100%')\nconst widthContainer = ref(0)\nconst widthContent = ref(0)\nconst heightMin = ref('100%')\nconst heightContainer = ref(0)\nconst heightContent = ref(0)\n\nconst gradientLength = ref('200px')\n\nconst verticalAnimationPause = ref(false)\nconst marqueeContent = ref(null)\nconst marqueeOverlayContainer = ref(null)\n\n// Removed ForcesUpdate - no longer needed\n\nconst checkForClone = async () => {\n if (props.vertical) {\n verticalAnimationPause.value = true\n }\n\n await nextTick()\n \n const calculateClones = () => {\n widthMin.value = '0%'\n heightMin.value = '0%'\n\n if (marqueeContent.value !== null && marqueeOverlayContainer.value !== null) {\n if (marqueeContent.value && marqueeOverlayContainer.value) {\n if (\n props.vertical &&\n 'clientHeight' in marqueeContent.value &&\n 'clientHeight' in marqueeOverlayContainer.value\n ) {\n heightContent.value = marqueeContent.value.clientHeight\n heightContainer.value = marqueeOverlayContainer.value.clientHeight\n\n const localCloneAmount = Math.ceil(heightContainer.value / heightContent.value)\n\n cloneAmount.value = isFinite(localCloneAmount) ? localCloneAmount : 0\n\n verticalAnimationPause.value = false\n\n return cloneAmount.value\n } else if (\n !props.vertical &&\n 'clientWidth' in marqueeContent.value &&\n 'clientWidth' in marqueeOverlayContainer.value\n ) {\n widthContent.value = marqueeContent.value.clientWidth\n widthContainer.value = marqueeOverlayContainer.value.clientWidth\n\n const localCloneAmount = Math.ceil(widthContainer.value / widthContent.value)\n\n cloneAmount.value = isFinite(localCloneAmount) ? localCloneAmount : 0\n\n return cloneAmount.value\n } else {\n widthMin.value = '100%'\n heightMin.value = '100%'\n return 0\n }\n } else {\n widthMin.value = '100%'\n heightMin.value = '100%'\n return 0\n }\n } else {\n widthMin.value = '100%'\n heightMin.value = '100%'\n return 0\n }\n }\n \n // Run once immediately\n calculateClones()\n \n // Setup ResizeObserver for efficient resize detection\n if (typeof ResizeObserver !== 'undefined' && marqueeOverlayContainer.value) {\n if (resizeObserver.value) {\n resizeObserver.value.disconnect()\n }\n \n resizeObserver.value = new ResizeObserver(() => {\n clearTimeout(resizeTimeout.value)\n resizeTimeout.value = setTimeout(() => {\n calculateClones()\n }, 150)\n })\n \n resizeObserver.value.observe(marqueeOverlayContainer.value)\n } else {\n // Fallback for browsers without ResizeObserver\n // Only check once after a delay for initial setup\n if (checkInterval.value) {\n clearInterval(checkInterval.value)\n }\n \n checkInterval.value = setTimeout(() => {\n calculateClones()\n checkInterval.value = null\n }, 500)\n }\n}\n\nconst hoverStarted = () => { if (props.pauseOnHover) emits('onPause') }\nconst hoverEnded = () => { if (props.pauseOnHover) emits('onResume') }\nconst mouseDown = () => { if (props.pauseOnClick) emits('onPause') }\nconst mouseUp = () => { if (props.pauseOnClick) emits('onResume') }\n\nconst getCurrentStyle = computed(() => {\n return {\n '--loops': `${props.loop === 0 ? 'infinite' : props.loop}`,\n '--duration': `${props.duration}s`,\n '--delay': `${props.delay}s`,\n '--direction': `${props.direction}`,\n '--pauseOnHover': `${props.pauseOnHover ? 'paused' : 'running'}`,\n '--pauseOnClick': `${props.pauseOnClick ? 'paused' : 'running'}`,\n '--pauseAnimation': `${(props.vertical && verticalAnimationPause.value) || props.pause ? 'paused' : 'running'}`,\n '--gradient-color': `rgba(${props.gradientColor}, 1), rgba(${props.gradientColor}, 0)`,\n '--gradient-length': `${gradientLength.value}`,\n '--min-width': `${widthMin.value}`,\n '--min-height': `${heightMin.value}`,\n '--orientation': props.vertical ? 'scrollY' : 'scrollX'\n }\n})\n\nconst setupMarquee = async () => {\n if (props.vertical) {\n heightMin.value = '100%'\n widthMin.value = 'auto'\n } else {\n heightMin.value = 'auto'\n widthMin.value = '100%'\n }\n\n if (props.gradient && props.gradientLength) {\n gradientLength.value = props.gradientLength\n }\n\n if (props.clone) {\n await checkForClone()\n ready.value = true\n } else {\n ready.value = true\n }\n}\n\nonMounted(async () => {\n setupMarquee()\n\n loopInterval.value = setInterval(() => {\n loopCounter.value++\n\n if (props.loop !== 0 && loopCounter.value === props.loop) {\n emits('onComplete')\n clearInterval(loopInterval.value)\n }\n\n emits('onLoopComplete')\n }, props.duration * 1000)\n})\n\nonBeforeUnmount(() => {\n clearInterval(loopInterval.value)\n \n if (resizeObserver.value) {\n resizeObserver.value.disconnect()\n resizeObserver.value = null\n }\n \n if (checkInterval.value) {\n clearInterval(checkInterval.value)\n checkInterval.value = null\n }\n \n if (resizeTimeout.value) {\n clearTimeout(resizeTimeout.value)\n resizeTimeout.value = null\n }\n})\n\n// Removed inefficient watchers - ResizeObserver handles this now\n\nwatch(\n () => props.pause,\n (newVal, oldVal) => {\n if (newVal !== oldVal) {\n if (newVal) {\n emits('onResume')\n } else {\n emits('onPause')\n }\n }\n }\n)\n</script>\n\n<style lang=\"scss\">\n.vue3-marquee {\n display: flex !important;\n position: relative;\n\n .marquee {\n flex: 0 0 auto;\n min-width: var(--min-width);\n min-height: var(--min-height);\n z-index: 1;\n will-change: transform;\n transform: translateZ(0);\n backface-visibility: hidden;\n\n animation: var(--orientation) var(--duration) linear var(--delay) var(--loops);\n animation-play-state: var(--pauseAnimation);\n animation-direction: var(--direction);\n contain: layout style paint;\n }\n\n .overlay {\n position: absolute;\n width: 100%;\n height: 100%;\n\n &:before {\n left: 0;\n top: 0;\n }\n\n &:before, &:after {\n content: '';\n position: absolute;\n z-index: 2;\n }\n }\n\n .transparent-overlay {\n position: absolute;\n width: 100.5%;\n height: 100.5%;\n }\n\n\n &.horizontal {\n overflow-x: hidden !important;\n overflow-y: hidden !important;\n flex-direction: row !important;\n width: 100%;\n height: max-content;\n\n .marquee {\n display: flex;\n flex-direction: row;\n align-items: center;\n }\n\n .overlay::before,.overlay::after {\n background: linear-gradient(to right, var(--gradient-color));\n height: 100%;\n width: var(--gradient-length);\n }\n\n .overlay::after {\n transform: rotateZ(180deg);\n right: 0;\n top: 0;\n }\n }\n\n &.vertical {\n overflow-y: hidden !important;\n overflow-x: hidden !important;\n flex-direction: column !important;\n height: 100%;\n width: max-content;\n\n .marquee {\n display: flex;\n flex-direction: column;\n align-items: center;\n }\n\n .overlay::before, .overlay::after {\n background: linear-gradient(to bottom, var(--gradient-color));\n height: var(--gradient-length);\n width: 100%;\n }\n\n .overlay::after {\n transform: rotateZ(-180deg);\n left: 0;\n bottom: 0;\n }\n }\n\n &:hover {\n div {\n animation-play-state: var(--pauseOnHover);\n }\n }\n\n &:active {\n div {\n animation-play-state: var(--pauseOnClick);\n } \n }\n}\n\n@keyframes scrollX {\n 0% {\n transform: translate3d(0, 0, 0);\n }\n 100% {\n transform: translate3d(-100%, 0, 0);\n }\n}\n\n@keyframes scrollY {\n 0% {\n transform: translate3d(0, 0, 0);\n }\n 100% {\n transform: translate3d(0, -100%, 0);\n }\n}\n</style>"],"names":["ref","nextTick","computed","onMounted","onBeforeUnmount","watch"],"mappings":"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"}
1
+ {"version":3,"file":"Marquee.vue.cjs","sources":["../../../../../src/components/Marquee/Marquee.vue"],"sourcesContent":["<template>\n <div\n v-if=\"ready\"\n class=\"vue3-marquee\"\n :class=\"{ vertical: vertical, horizontal: !vertical }\"\n :style=\"getCurrentStyle\"\n @mouseenter=\"hoverStarted\"\n @mouseleave=\"hoverEnded\"\n @mousedown=\"mouseDown\"\n @mouseup=\"mouseUp\"\n >\n <div\n class=\"transparent-overlay\"\n ref=\"marqueeOverlayContainer\"\n :aria-hidden=\"true\"\n :class=\"{ vertical: vertical, horizontal: !vertical, overlay: gradient }\"\n />\n\n <div \n class=\"marquee\"\n ref=\"marqueeContent\">\n <slot></slot>\n </div>\n\n <div \n class=\"marquee\" \n :aria-hidden=\"true\"\n >\n <slot></slot>\n </div>\n\n <div\n v-for=\"num in cloneAmount\"\n :key=\"num\"\n :aria-hidden=\"true\"\n class=\"marquee cloned\"\n >\n <slot></slot>\n </div\n >\n </div>\n</template>\n\n<script setup>\nimport { ref, onMounted, onBeforeUnmount, computed, watch, nextTick } from 'vue'\n\nconst props = defineProps({\n vertical: { type: Boolean, default: false },\n direction: { type: String, default: 'normal' },\n duration: { type: Number, default: 20 },\n delay: { type: Number, default: 0 },\n loop: { type: Number, default: 0 },\n clone: { type: Boolean, default: false },\n gradient: { type: Boolean, default: false },\n gradientColor: { type: [Array,String], default: () => [255, 255, 255] },\n gradientLength: { type: String },\n pauseOnHover: { type: Boolean, default: false },\n pauseOnClick: { type: Boolean, default: false },\n pause: { type: Boolean, default: false }\n})\n\nconst emits = defineEmits(['onComplete', 'onLoopComplete', 'onPause', 'onResume'])\n\nconst ready = ref(false)\n\nconst cloneAmount = ref(0)\nconst loopCounter = ref(0)\nconst loopInterval = ref(null)\nconst resizeObserver = ref(null)\nconst checkInterval = ref(null)\nconst resizeTimeout = ref(null)\nconst previousSize = ref({ width: 0, height: 0 })\n\nconst widthMin = ref('100%')\nconst widthContainer = ref(0)\nconst widthContent = ref(0)\nconst heightMin = ref('100%')\nconst heightContainer = ref(0)\nconst heightContent = ref(0)\n\nconst gradientLength = ref('200px')\n\nconst verticalAnimationPause = ref(false)\nconst marqueeContent = ref(null)\nconst marqueeOverlayContainer = ref(null)\n\n// Removed ForcesUpdate - no longer needed\n\nconst checkForClone = async () => {\n if (props.vertical) {\n verticalAnimationPause.value = true\n }\n\n await nextTick()\n \n const calculateClones = () => {\n widthMin.value = '0%'\n heightMin.value = '0%'\n\n if (marqueeContent.value !== null && marqueeOverlayContainer.value !== null) {\n if (marqueeContent.value && marqueeOverlayContainer.value) {\n if (\n props.vertical &&\n 'clientHeight' in marqueeContent.value &&\n 'clientHeight' in marqueeOverlayContainer.value\n ) {\n heightContent.value = marqueeContent.value.clientHeight\n heightContainer.value = marqueeOverlayContainer.value.clientHeight\n\n const localCloneAmount = Math.ceil(heightContainer.value / heightContent.value)\n\n cloneAmount.value = isFinite(localCloneAmount) ? localCloneAmount : 0\n\n verticalAnimationPause.value = false\n\n return cloneAmount.value\n } else if (\n !props.vertical &&\n 'clientWidth' in marqueeContent.value &&\n 'clientWidth' in marqueeOverlayContainer.value\n ) {\n widthContent.value = marqueeContent.value.clientWidth\n widthContainer.value = marqueeOverlayContainer.value.clientWidth\n\n const localCloneAmount = Math.ceil(widthContainer.value / widthContent.value)\n\n cloneAmount.value = isFinite(localCloneAmount) ? localCloneAmount : 0\n\n return cloneAmount.value\n } else {\n widthMin.value = '100%'\n heightMin.value = '100%'\n return 0\n }\n } else {\n widthMin.value = '100%'\n heightMin.value = '100%'\n return 0\n }\n } else {\n widthMin.value = '100%'\n heightMin.value = '100%'\n return 0\n }\n }\n \n // Run once immediately\n calculateClones()\n \n // Setup ResizeObserver for efficient resize detection\n if (typeof ResizeObserver !== 'undefined' && marqueeOverlayContainer.value) {\n if (resizeObserver.value) {\n resizeObserver.value.disconnect()\n }\n \n resizeObserver.value = new ResizeObserver((entries) => {\n const entry = entries[0]\n const newWidth = entry.contentRect.width\n const newHeight = entry.contentRect.height\n \n // Only recalculate if size changed significantly (more than 1px)\n const widthChanged = Math.abs(newWidth - previousSize.value.width) > 1\n const heightChanged = Math.abs(newHeight - previousSize.value.height) > 1\n \n if (widthChanged || heightChanged) {\n previousSize.value = { width: newWidth, height: newHeight }\n clearTimeout(resizeTimeout.value)\n resizeTimeout.value = setTimeout(() => {\n calculateClones()\n }, 300)\n }\n })\n \n resizeObserver.value.observe(marqueeOverlayContainer.value)\n } else {\n // Fallback for browsers without ResizeObserver\n // Only check once after a delay for initial setup\n if (checkInterval.value) {\n clearInterval(checkInterval.value)\n }\n \n checkInterval.value = setTimeout(() => {\n calculateClones()\n checkInterval.value = null\n }, 500)\n }\n}\n\nconst hoverStarted = () => { if (props.pauseOnHover) emits('onPause') }\nconst hoverEnded = () => { if (props.pauseOnHover) emits('onResume') }\nconst mouseDown = () => { if (props.pauseOnClick) emits('onPause') }\nconst mouseUp = () => { if (props.pauseOnClick) emits('onResume') }\n\nconst getCurrentStyle = computed(() => {\n return {\n '--loops': `${props.loop === 0 ? 'infinite' : props.loop}`,\n '--duration': `${props.duration}s`,\n '--delay': `${props.delay}s`,\n '--direction': `${props.direction}`,\n '--pauseOnHover': `${props.pauseOnHover ? 'paused' : 'running'}`,\n '--pauseOnClick': `${props.pauseOnClick ? 'paused' : 'running'}`,\n '--pauseAnimation': `${(props.vertical && verticalAnimationPause.value) || props.pause ? 'paused' : 'running'}`,\n '--gradient-color': props.gradientColor,\n '--gradient-length': `${gradientLength.value}`,\n '--min-width': `${widthMin.value}`,\n '--min-height': `${heightMin.value}`,\n '--orientation': props.vertical ? 'scrollY' : 'scrollX'\n }\n})\n\nconst setupMarquee = async () => {\n if (props.vertical) {\n heightMin.value = '100%'\n widthMin.value = 'auto'\n } else {\n heightMin.value = 'auto'\n widthMin.value = '100%'\n }\n\n if (props.gradient && props.gradientLength) {\n gradientLength.value = props.gradientLength\n }\n\n if (props.clone) {\n await checkForClone()\n ready.value = true\n } else {\n ready.value = true\n }\n}\n\nonMounted(async () => {\n setupMarquee()\n\n loopInterval.value = setInterval(() => {\n loopCounter.value++\n\n if (props.loop !== 0 && loopCounter.value === props.loop) {\n emits('onComplete')\n clearInterval(loopInterval.value)\n }\n\n emits('onLoopComplete')\n }, props.duration * 1000)\n})\n\nonBeforeUnmount(() => {\n clearInterval(loopInterval.value)\n \n if (resizeObserver.value) {\n resizeObserver.value.disconnect()\n resizeObserver.value = null\n }\n \n if (checkInterval.value) {\n clearInterval(checkInterval.value)\n checkInterval.value = null\n }\n \n if (resizeTimeout.value) {\n clearTimeout(resizeTimeout.value)\n resizeTimeout.value = null\n }\n})\n\n// Removed inefficient watchers - ResizeObserver handles this now\n\nwatch(\n () => props.pause,\n (newVal, oldVal) => {\n if (newVal !== oldVal) {\n if (newVal) {\n emits('onPause')\n } else {\n emits('onResume')\n }\n }\n }\n)\n</script>\n\n<style lang=\"scss\">\n.vue3-marquee {\n display: flex !important;\n position: relative;\n will-change: transform;\n transform: translateZ(0);\n backface-visibility: hidden;\n\n .marquee {\n flex: 0 0 auto;\n min-width: var(--min-width);\n min-height: var(--min-height);\n z-index: 1;\n\n animation: var(--orientation) var(--duration) linear var(--delay) var(--loops);\n animation-play-state: var(--pauseAnimation);\n animation-direction: var(--direction);\n }\n\n .overlay {\n position: absolute;\n width: 100%;\n height: 100%;\n\n &:before {\n left: 0;\n top: 0;\n }\n\n &:before, &:after {\n content: '';\n position: absolute;\n z-index: 2;\n }\n }\n\n .transparent-overlay {\n position: absolute;\n width: 100.5%;\n height: 100.5%;\n }\n\n\n &.horizontal {\n overflow-x: hidden !important;\n overflow-y: hidden !important;\n flex-direction: row !important;\n width: 100%;\n height: max-content;\n\n .marquee {\n display: flex;\n flex-direction: row;\n align-items: center;\n }\n\n .overlay::before,.overlay::after {\n background: linear-gradient(to right, var(--gradient-color), transparent);\n height: 100%;\n width: var(--gradient-length);\n }\n\n .overlay::after {\n transform: rotateZ(180deg);\n right: 0;\n top: 0;\n }\n }\n\n &.vertical {\n overflow-y: hidden !important;\n overflow-x: hidden !important;\n flex-direction: column !important;\n height: 100%;\n width: max-content;\n\n .marquee {\n display: flex;\n flex-direction: column;\n align-items: center;\n }\n\n .overlay::before, .overlay::after {\n background: linear-gradient(to bottom, var(--gradient-color), transparent);\n height: var(--gradient-length);\n width: 100%;\n }\n\n .overlay::after {\n transform: rotateZ(-180deg);\n left: 0;\n bottom: 0;\n }\n }\n\n &:hover {\n div {\n animation-play-state: var(--pauseOnHover);\n }\n }\n\n &:active {\n div {\n animation-play-state: var(--pauseOnClick);\n } \n }\n}\n\n@keyframes scrollX {\n 0% {\n transform: translate3d(0, 0, 0);\n }\n 100% {\n transform: translate3d(-100%, 0, 0);\n }\n}\n\n@keyframes scrollY {\n 0% {\n transform: translate3d(0, 0, 0);\n }\n 100% {\n transform: translate3d(0, -100%, 0);\n }\n}\n</style>"],"names":["ref","nextTick","computed","onMounted","onBeforeUnmount","watch"],"mappings":"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"}
@@ -31,6 +31,7 @@ const _sfc_main = {
31
31
  const resizeObserver = ref(null);
32
32
  const checkInterval = ref(null);
33
33
  const resizeTimeout = ref(null);
34
+ const previousSize = ref({ width: 0, height: 0 });
34
35
  const widthMin = ref("100%");
35
36
  const widthContainer = ref(0);
36
37
  const widthContent = ref(0);
@@ -85,11 +86,19 @@ const _sfc_main = {
85
86
  if (resizeObserver.value) {
86
87
  resizeObserver.value.disconnect();
87
88
  }
88
- resizeObserver.value = new ResizeObserver(() => {
89
- clearTimeout(resizeTimeout.value);
90
- resizeTimeout.value = setTimeout(() => {
91
- calculateClones();
92
- }, 150);
89
+ resizeObserver.value = new ResizeObserver((entries) => {
90
+ const entry = entries[0];
91
+ const newWidth = entry.contentRect.width;
92
+ const newHeight = entry.contentRect.height;
93
+ const widthChanged = Math.abs(newWidth - previousSize.value.width) > 1;
94
+ const heightChanged = Math.abs(newHeight - previousSize.value.height) > 1;
95
+ if (widthChanged || heightChanged) {
96
+ previousSize.value = { width: newWidth, height: newHeight };
97
+ clearTimeout(resizeTimeout.value);
98
+ resizeTimeout.value = setTimeout(() => {
99
+ calculateClones();
100
+ }, 300);
101
+ }
93
102
  });
94
103
  resizeObserver.value.observe(marqueeOverlayContainer.value);
95
104
  } else {
@@ -123,7 +132,7 @@ const _sfc_main = {
123
132
  "--pauseOnHover": `${props.pauseOnHover ? "paused" : "running"}`,
124
133
  "--pauseOnClick": `${props.pauseOnClick ? "paused" : "running"}`,
125
134
  "--pauseAnimation": `${props.vertical && verticalAnimationPause.value || props.pause ? "paused" : "running"}`,
126
- "--gradient-color": `rgba(${props.gradientColor}, 1), rgba(${props.gradientColor}, 0)`,
135
+ "--gradient-color": props.gradientColor,
127
136
  "--gradient-length": `${gradientLength.value}`,
128
137
  "--min-width": `${widthMin.value}`,
129
138
  "--min-height": `${heightMin.value}`,
@@ -179,9 +188,9 @@ const _sfc_main = {
179
188
  (newVal, oldVal) => {
180
189
  if (newVal !== oldVal) {
181
190
  if (newVal) {
182
- emits("onResume");
183
- } else {
184
191
  emits("onPause");
192
+ } else {
193
+ emits("onResume");
185
194
  }
186
195
  }
187
196
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Marquee.vue.js","sources":["../../../../../src/components/Marquee/Marquee.vue"],"sourcesContent":["<template>\n <div\n v-if=\"ready\"\n class=\"vue3-marquee\"\n :class=\"{ vertical: vertical, horizontal: !vertical }\"\n :style=\"getCurrentStyle\"\n @mouseenter=\"hoverStarted\"\n @mouseleave=\"hoverEnded\"\n @mousedown=\"mouseDown\"\n @mouseup=\"mouseUp\"\n >\n <div\n class=\"transparent-overlay\"\n ref=\"marqueeOverlayContainer\"\n :aria-hidden=\"true\"\n :class=\"{ vertical: vertical, horizontal: !vertical, overlay: gradient }\"\n />\n\n <div \n class=\"marquee\"\n ref=\"marqueeContent\">\n <slot></slot>\n </div>\n\n <div \n class=\"marquee\" \n :aria-hidden=\"true\"\n >\n <slot></slot>\n </div>\n\n <div\n v-for=\"num in cloneAmount\"\n :key=\"num\"\n :aria-hidden=\"true\"\n class=\"marquee cloned\"\n >\n <slot></slot>\n </div\n >\n </div>\n</template>\n\n<script setup>\nimport { ref, onMounted, onBeforeUnmount, computed, watch, nextTick } from 'vue'\n\nconst props = defineProps({\n vertical: { type: Boolean, default: false },\n direction: { type: String, default: 'normal' },\n duration: { type: Number, default: 20 },\n delay: { type: Number, default: 0 },\n loop: { type: Number, default: 0 },\n clone: { type: Boolean, default: false },\n gradient: { type: Boolean, default: false },\n gradientColor: { type: [Array,String], default: () => [255, 255, 255] },\n gradientLength: { type: String },\n pauseOnHover: { type: Boolean, default: false },\n pauseOnClick: { type: Boolean, default: false },\n pause: { type: Boolean, default: false }\n})\n\nconst emits = defineEmits(['onComplete', 'onLoopComplete', 'onPause', 'onResume'])\n\nconst ready = ref(false)\n\nconst cloneAmount = ref(0)\nconst loopCounter = ref(0)\nconst loopInterval = ref(null)\nconst resizeObserver = ref(null)\nconst checkInterval = ref(null)\nconst resizeTimeout = ref(null)\n\nconst widthMin = ref('100%')\nconst widthContainer = ref(0)\nconst widthContent = ref(0)\nconst heightMin = ref('100%')\nconst heightContainer = ref(0)\nconst heightContent = ref(0)\n\nconst gradientLength = ref('200px')\n\nconst verticalAnimationPause = ref(false)\nconst marqueeContent = ref(null)\nconst marqueeOverlayContainer = ref(null)\n\n// Removed ForcesUpdate - no longer needed\n\nconst checkForClone = async () => {\n if (props.vertical) {\n verticalAnimationPause.value = true\n }\n\n await nextTick()\n \n const calculateClones = () => {\n widthMin.value = '0%'\n heightMin.value = '0%'\n\n if (marqueeContent.value !== null && marqueeOverlayContainer.value !== null) {\n if (marqueeContent.value && marqueeOverlayContainer.value) {\n if (\n props.vertical &&\n 'clientHeight' in marqueeContent.value &&\n 'clientHeight' in marqueeOverlayContainer.value\n ) {\n heightContent.value = marqueeContent.value.clientHeight\n heightContainer.value = marqueeOverlayContainer.value.clientHeight\n\n const localCloneAmount = Math.ceil(heightContainer.value / heightContent.value)\n\n cloneAmount.value = isFinite(localCloneAmount) ? localCloneAmount : 0\n\n verticalAnimationPause.value = false\n\n return cloneAmount.value\n } else if (\n !props.vertical &&\n 'clientWidth' in marqueeContent.value &&\n 'clientWidth' in marqueeOverlayContainer.value\n ) {\n widthContent.value = marqueeContent.value.clientWidth\n widthContainer.value = marqueeOverlayContainer.value.clientWidth\n\n const localCloneAmount = Math.ceil(widthContainer.value / widthContent.value)\n\n cloneAmount.value = isFinite(localCloneAmount) ? localCloneAmount : 0\n\n return cloneAmount.value\n } else {\n widthMin.value = '100%'\n heightMin.value = '100%'\n return 0\n }\n } else {\n widthMin.value = '100%'\n heightMin.value = '100%'\n return 0\n }\n } else {\n widthMin.value = '100%'\n heightMin.value = '100%'\n return 0\n }\n }\n \n // Run once immediately\n calculateClones()\n \n // Setup ResizeObserver for efficient resize detection\n if (typeof ResizeObserver !== 'undefined' && marqueeOverlayContainer.value) {\n if (resizeObserver.value) {\n resizeObserver.value.disconnect()\n }\n \n resizeObserver.value = new ResizeObserver(() => {\n clearTimeout(resizeTimeout.value)\n resizeTimeout.value = setTimeout(() => {\n calculateClones()\n }, 150)\n })\n \n resizeObserver.value.observe(marqueeOverlayContainer.value)\n } else {\n // Fallback for browsers without ResizeObserver\n // Only check once after a delay for initial setup\n if (checkInterval.value) {\n clearInterval(checkInterval.value)\n }\n \n checkInterval.value = setTimeout(() => {\n calculateClones()\n checkInterval.value = null\n }, 500)\n }\n}\n\nconst hoverStarted = () => { if (props.pauseOnHover) emits('onPause') }\nconst hoverEnded = () => { if (props.pauseOnHover) emits('onResume') }\nconst mouseDown = () => { if (props.pauseOnClick) emits('onPause') }\nconst mouseUp = () => { if (props.pauseOnClick) emits('onResume') }\n\nconst getCurrentStyle = computed(() => {\n return {\n '--loops': `${props.loop === 0 ? 'infinite' : props.loop}`,\n '--duration': `${props.duration}s`,\n '--delay': `${props.delay}s`,\n '--direction': `${props.direction}`,\n '--pauseOnHover': `${props.pauseOnHover ? 'paused' : 'running'}`,\n '--pauseOnClick': `${props.pauseOnClick ? 'paused' : 'running'}`,\n '--pauseAnimation': `${(props.vertical && verticalAnimationPause.value) || props.pause ? 'paused' : 'running'}`,\n '--gradient-color': `rgba(${props.gradientColor}, 1), rgba(${props.gradientColor}, 0)`,\n '--gradient-length': `${gradientLength.value}`,\n '--min-width': `${widthMin.value}`,\n '--min-height': `${heightMin.value}`,\n '--orientation': props.vertical ? 'scrollY' : 'scrollX'\n }\n})\n\nconst setupMarquee = async () => {\n if (props.vertical) {\n heightMin.value = '100%'\n widthMin.value = 'auto'\n } else {\n heightMin.value = 'auto'\n widthMin.value = '100%'\n }\n\n if (props.gradient && props.gradientLength) {\n gradientLength.value = props.gradientLength\n }\n\n if (props.clone) {\n await checkForClone()\n ready.value = true\n } else {\n ready.value = true\n }\n}\n\nonMounted(async () => {\n setupMarquee()\n\n loopInterval.value = setInterval(() => {\n loopCounter.value++\n\n if (props.loop !== 0 && loopCounter.value === props.loop) {\n emits('onComplete')\n clearInterval(loopInterval.value)\n }\n\n emits('onLoopComplete')\n }, props.duration * 1000)\n})\n\nonBeforeUnmount(() => {\n clearInterval(loopInterval.value)\n \n if (resizeObserver.value) {\n resizeObserver.value.disconnect()\n resizeObserver.value = null\n }\n \n if (checkInterval.value) {\n clearInterval(checkInterval.value)\n checkInterval.value = null\n }\n \n if (resizeTimeout.value) {\n clearTimeout(resizeTimeout.value)\n resizeTimeout.value = null\n }\n})\n\n// Removed inefficient watchers - ResizeObserver handles this now\n\nwatch(\n () => props.pause,\n (newVal, oldVal) => {\n if (newVal !== oldVal) {\n if (newVal) {\n emits('onResume')\n } else {\n emits('onPause')\n }\n }\n }\n)\n</script>\n\n<style lang=\"scss\">\n.vue3-marquee {\n display: flex !important;\n position: relative;\n\n .marquee {\n flex: 0 0 auto;\n min-width: var(--min-width);\n min-height: var(--min-height);\n z-index: 1;\n will-change: transform;\n transform: translateZ(0);\n backface-visibility: hidden;\n\n animation: var(--orientation) var(--duration) linear var(--delay) var(--loops);\n animation-play-state: var(--pauseAnimation);\n animation-direction: var(--direction);\n contain: layout style paint;\n }\n\n .overlay {\n position: absolute;\n width: 100%;\n height: 100%;\n\n &:before {\n left: 0;\n top: 0;\n }\n\n &:before, &:after {\n content: '';\n position: absolute;\n z-index: 2;\n }\n }\n\n .transparent-overlay {\n position: absolute;\n width: 100.5%;\n height: 100.5%;\n }\n\n\n &.horizontal {\n overflow-x: hidden !important;\n overflow-y: hidden !important;\n flex-direction: row !important;\n width: 100%;\n height: max-content;\n\n .marquee {\n display: flex;\n flex-direction: row;\n align-items: center;\n }\n\n .overlay::before,.overlay::after {\n background: linear-gradient(to right, var(--gradient-color));\n height: 100%;\n width: var(--gradient-length);\n }\n\n .overlay::after {\n transform: rotateZ(180deg);\n right: 0;\n top: 0;\n }\n }\n\n &.vertical {\n overflow-y: hidden !important;\n overflow-x: hidden !important;\n flex-direction: column !important;\n height: 100%;\n width: max-content;\n\n .marquee {\n display: flex;\n flex-direction: column;\n align-items: center;\n }\n\n .overlay::before, .overlay::after {\n background: linear-gradient(to bottom, var(--gradient-color));\n height: var(--gradient-length);\n width: 100%;\n }\n\n .overlay::after {\n transform: rotateZ(-180deg);\n left: 0;\n bottom: 0;\n }\n }\n\n &:hover {\n div {\n animation-play-state: var(--pauseOnHover);\n }\n }\n\n &:active {\n div {\n animation-play-state: var(--pauseOnClick);\n } \n }\n}\n\n@keyframes scrollX {\n 0% {\n transform: translate3d(0, 0, 0);\n }\n 100% {\n transform: translate3d(-100%, 0, 0);\n }\n}\n\n@keyframes scrollY {\n 0% {\n transform: translate3d(0, 0, 0);\n }\n 100% {\n transform: translate3d(0, -100%, 0);\n }\n}\n</style>"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Marquee.vue.js","sources":["../../../../../src/components/Marquee/Marquee.vue"],"sourcesContent":["<template>\n <div\n v-if=\"ready\"\n class=\"vue3-marquee\"\n :class=\"{ vertical: vertical, horizontal: !vertical }\"\n :style=\"getCurrentStyle\"\n @mouseenter=\"hoverStarted\"\n @mouseleave=\"hoverEnded\"\n @mousedown=\"mouseDown\"\n @mouseup=\"mouseUp\"\n >\n <div\n class=\"transparent-overlay\"\n ref=\"marqueeOverlayContainer\"\n :aria-hidden=\"true\"\n :class=\"{ vertical: vertical, horizontal: !vertical, overlay: gradient }\"\n />\n\n <div \n class=\"marquee\"\n ref=\"marqueeContent\">\n <slot></slot>\n </div>\n\n <div \n class=\"marquee\" \n :aria-hidden=\"true\"\n >\n <slot></slot>\n </div>\n\n <div\n v-for=\"num in cloneAmount\"\n :key=\"num\"\n :aria-hidden=\"true\"\n class=\"marquee cloned\"\n >\n <slot></slot>\n </div\n >\n </div>\n</template>\n\n<script setup>\nimport { ref, onMounted, onBeforeUnmount, computed, watch, nextTick } from 'vue'\n\nconst props = defineProps({\n vertical: { type: Boolean, default: false },\n direction: { type: String, default: 'normal' },\n duration: { type: Number, default: 20 },\n delay: { type: Number, default: 0 },\n loop: { type: Number, default: 0 },\n clone: { type: Boolean, default: false },\n gradient: { type: Boolean, default: false },\n gradientColor: { type: [Array,String], default: () => [255, 255, 255] },\n gradientLength: { type: String },\n pauseOnHover: { type: Boolean, default: false },\n pauseOnClick: { type: Boolean, default: false },\n pause: { type: Boolean, default: false }\n})\n\nconst emits = defineEmits(['onComplete', 'onLoopComplete', 'onPause', 'onResume'])\n\nconst ready = ref(false)\n\nconst cloneAmount = ref(0)\nconst loopCounter = ref(0)\nconst loopInterval = ref(null)\nconst resizeObserver = ref(null)\nconst checkInterval = ref(null)\nconst resizeTimeout = ref(null)\nconst previousSize = ref({ width: 0, height: 0 })\n\nconst widthMin = ref('100%')\nconst widthContainer = ref(0)\nconst widthContent = ref(0)\nconst heightMin = ref('100%')\nconst heightContainer = ref(0)\nconst heightContent = ref(0)\n\nconst gradientLength = ref('200px')\n\nconst verticalAnimationPause = ref(false)\nconst marqueeContent = ref(null)\nconst marqueeOverlayContainer = ref(null)\n\n// Removed ForcesUpdate - no longer needed\n\nconst checkForClone = async () => {\n if (props.vertical) {\n verticalAnimationPause.value = true\n }\n\n await nextTick()\n \n const calculateClones = () => {\n widthMin.value = '0%'\n heightMin.value = '0%'\n\n if (marqueeContent.value !== null && marqueeOverlayContainer.value !== null) {\n if (marqueeContent.value && marqueeOverlayContainer.value) {\n if (\n props.vertical &&\n 'clientHeight' in marqueeContent.value &&\n 'clientHeight' in marqueeOverlayContainer.value\n ) {\n heightContent.value = marqueeContent.value.clientHeight\n heightContainer.value = marqueeOverlayContainer.value.clientHeight\n\n const localCloneAmount = Math.ceil(heightContainer.value / heightContent.value)\n\n cloneAmount.value = isFinite(localCloneAmount) ? localCloneAmount : 0\n\n verticalAnimationPause.value = false\n\n return cloneAmount.value\n } else if (\n !props.vertical &&\n 'clientWidth' in marqueeContent.value &&\n 'clientWidth' in marqueeOverlayContainer.value\n ) {\n widthContent.value = marqueeContent.value.clientWidth\n widthContainer.value = marqueeOverlayContainer.value.clientWidth\n\n const localCloneAmount = Math.ceil(widthContainer.value / widthContent.value)\n\n cloneAmount.value = isFinite(localCloneAmount) ? localCloneAmount : 0\n\n return cloneAmount.value\n } else {\n widthMin.value = '100%'\n heightMin.value = '100%'\n return 0\n }\n } else {\n widthMin.value = '100%'\n heightMin.value = '100%'\n return 0\n }\n } else {\n widthMin.value = '100%'\n heightMin.value = '100%'\n return 0\n }\n }\n \n // Run once immediately\n calculateClones()\n \n // Setup ResizeObserver for efficient resize detection\n if (typeof ResizeObserver !== 'undefined' && marqueeOverlayContainer.value) {\n if (resizeObserver.value) {\n resizeObserver.value.disconnect()\n }\n \n resizeObserver.value = new ResizeObserver((entries) => {\n const entry = entries[0]\n const newWidth = entry.contentRect.width\n const newHeight = entry.contentRect.height\n \n // Only recalculate if size changed significantly (more than 1px)\n const widthChanged = Math.abs(newWidth - previousSize.value.width) > 1\n const heightChanged = Math.abs(newHeight - previousSize.value.height) > 1\n \n if (widthChanged || heightChanged) {\n previousSize.value = { width: newWidth, height: newHeight }\n clearTimeout(resizeTimeout.value)\n resizeTimeout.value = setTimeout(() => {\n calculateClones()\n }, 300)\n }\n })\n \n resizeObserver.value.observe(marqueeOverlayContainer.value)\n } else {\n // Fallback for browsers without ResizeObserver\n // Only check once after a delay for initial setup\n if (checkInterval.value) {\n clearInterval(checkInterval.value)\n }\n \n checkInterval.value = setTimeout(() => {\n calculateClones()\n checkInterval.value = null\n }, 500)\n }\n}\n\nconst hoverStarted = () => { if (props.pauseOnHover) emits('onPause') }\nconst hoverEnded = () => { if (props.pauseOnHover) emits('onResume') }\nconst mouseDown = () => { if (props.pauseOnClick) emits('onPause') }\nconst mouseUp = () => { if (props.pauseOnClick) emits('onResume') }\n\nconst getCurrentStyle = computed(() => {\n return {\n '--loops': `${props.loop === 0 ? 'infinite' : props.loop}`,\n '--duration': `${props.duration}s`,\n '--delay': `${props.delay}s`,\n '--direction': `${props.direction}`,\n '--pauseOnHover': `${props.pauseOnHover ? 'paused' : 'running'}`,\n '--pauseOnClick': `${props.pauseOnClick ? 'paused' : 'running'}`,\n '--pauseAnimation': `${(props.vertical && verticalAnimationPause.value) || props.pause ? 'paused' : 'running'}`,\n '--gradient-color': props.gradientColor,\n '--gradient-length': `${gradientLength.value}`,\n '--min-width': `${widthMin.value}`,\n '--min-height': `${heightMin.value}`,\n '--orientation': props.vertical ? 'scrollY' : 'scrollX'\n }\n})\n\nconst setupMarquee = async () => {\n if (props.vertical) {\n heightMin.value = '100%'\n widthMin.value = 'auto'\n } else {\n heightMin.value = 'auto'\n widthMin.value = '100%'\n }\n\n if (props.gradient && props.gradientLength) {\n gradientLength.value = props.gradientLength\n }\n\n if (props.clone) {\n await checkForClone()\n ready.value = true\n } else {\n ready.value = true\n }\n}\n\nonMounted(async () => {\n setupMarquee()\n\n loopInterval.value = setInterval(() => {\n loopCounter.value++\n\n if (props.loop !== 0 && loopCounter.value === props.loop) {\n emits('onComplete')\n clearInterval(loopInterval.value)\n }\n\n emits('onLoopComplete')\n }, props.duration * 1000)\n})\n\nonBeforeUnmount(() => {\n clearInterval(loopInterval.value)\n \n if (resizeObserver.value) {\n resizeObserver.value.disconnect()\n resizeObserver.value = null\n }\n \n if (checkInterval.value) {\n clearInterval(checkInterval.value)\n checkInterval.value = null\n }\n \n if (resizeTimeout.value) {\n clearTimeout(resizeTimeout.value)\n resizeTimeout.value = null\n }\n})\n\n// Removed inefficient watchers - ResizeObserver handles this now\n\nwatch(\n () => props.pause,\n (newVal, oldVal) => {\n if (newVal !== oldVal) {\n if (newVal) {\n emits('onPause')\n } else {\n emits('onResume')\n }\n }\n }\n)\n</script>\n\n<style lang=\"scss\">\n.vue3-marquee {\n display: flex !important;\n position: relative;\n will-change: transform;\n transform: translateZ(0);\n backface-visibility: hidden;\n\n .marquee {\n flex: 0 0 auto;\n min-width: var(--min-width);\n min-height: var(--min-height);\n z-index: 1;\n\n animation: var(--orientation) var(--duration) linear var(--delay) var(--loops);\n animation-play-state: var(--pauseAnimation);\n animation-direction: var(--direction);\n }\n\n .overlay {\n position: absolute;\n width: 100%;\n height: 100%;\n\n &:before {\n left: 0;\n top: 0;\n }\n\n &:before, &:after {\n content: '';\n position: absolute;\n z-index: 2;\n }\n }\n\n .transparent-overlay {\n position: absolute;\n width: 100.5%;\n height: 100.5%;\n }\n\n\n &.horizontal {\n overflow-x: hidden !important;\n overflow-y: hidden !important;\n flex-direction: row !important;\n width: 100%;\n height: max-content;\n\n .marquee {\n display: flex;\n flex-direction: row;\n align-items: center;\n }\n\n .overlay::before,.overlay::after {\n background: linear-gradient(to right, var(--gradient-color), transparent);\n height: 100%;\n width: var(--gradient-length);\n }\n\n .overlay::after {\n transform: rotateZ(180deg);\n right: 0;\n top: 0;\n }\n }\n\n &.vertical {\n overflow-y: hidden !important;\n overflow-x: hidden !important;\n flex-direction: column !important;\n height: 100%;\n width: max-content;\n\n .marquee {\n display: flex;\n flex-direction: column;\n align-items: center;\n }\n\n .overlay::before, .overlay::after {\n background: linear-gradient(to bottom, var(--gradient-color), transparent);\n height: var(--gradient-length);\n width: 100%;\n }\n\n .overlay::after {\n transform: rotateZ(-180deg);\n left: 0;\n bottom: 0;\n }\n }\n\n &:hover {\n div {\n animation-play-state: var(--pauseOnHover);\n }\n }\n\n &:active {\n div {\n animation-play-state: var(--pauseOnClick);\n } \n }\n}\n\n@keyframes scrollX {\n 0% {\n transform: translate3d(0, 0, 0);\n }\n 100% {\n transform: translate3d(-100%, 0, 0);\n }\n}\n\n@keyframes scrollY {\n 0% {\n transform: translate3d(0, 0, 0);\n }\n 100% {\n transform: translate3d(0, -100%, 0);\n }\n}\n</style>"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
3
  const vue = require("vue");
4
- ;/* empty css */
4
+ ;/* empty css */
5
5
  const _sfc_main = {
6
6
  __name: "Spoiler",
7
7
  props: {
@@ -70,4 +70,4 @@ const _sfc_main = {
70
70
  }
71
71
  };
72
72
  exports.default = _sfc_main;
73
- //# sourceMappingURL=Spoiler.vue.cjs.map
73
+ //# sourceMappingURL=Spoiler.vue2.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Spoiler.vue2.cjs","sources":["../../../../../src/components/Spoiler/Spoiler.vue"],"sourcesContent":["<template>\n <div>\n <div @click=\"toggleSpoiler\" class=\"flex-v-center flex-nowrap flex\">\n <slot name=\"header\" :isOpen=\"showSpoiler\"></slot>\n </div>\n <transition\n name=\"collapse\"\n @enter=\"onEnter\"\n @after-enter=\"onAfterEnter\"\n @leave=\"onLeave\"\n >\n <div v-show=\"showSpoiler\" class=\"spoiler\" ref=\"spoilerContent\">\n <slot name=\"content\"></slot>\n </div>\n </transition>\n </div>\n</template>\n<script setup>\nimport { ref, onMounted } from 'vue';\n\nconst props = defineProps({\n status: {\n type: Boolean,\n default: false\n }\n});\n\nconst showSpoiler = ref(false);\nconst spoilerContent = ref(null);\n\nonMounted(() => {\n if (props.status) {\n showSpoiler.value = props.status;\n }\n});\n\nconst toggleSpoiler = () => {\n showSpoiler.value = !showSpoiler.value;\n};\n\n// Анимация открытия\nconst onEnter = (el) => {\n el.style.height = '0';\n void el.offsetHeight; // force reflow\n el.style.height = el.scrollHeight + 'px';\n};\n\nconst onAfterEnter = (el) => {\n el.style.height = 'auto';\n};\n\n// Анимация закрытия\nconst onLeave = (el) => {\n el.style.height = el.scrollHeight + 'px';\n void el.offsetHeight; // force reflow\n el.style.height = '0';\n};\n\ndefineExpose({\n showSpoiler\n});\n</script>\n<style lang=\"scss\">\n.spoiler {\n overflow: hidden;\n transition: height 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n</style>"],"names":["ref","onMounted"],"mappings":";;;;;;;;;;;;;AAoBA,UAAM,QAAQ;AAOd,UAAM,cAAcA,IAAAA,IAAI,KAAK;AAC7B,UAAM,iBAAiBA,IAAAA,IAAI,IAAI;AAE/BC,QAAAA,UAAU,MAAM;AACd,UAAI,MAAM,QAAQ;AAChB,oBAAY,QAAQ,MAAM;AAAA,MAC5B;AAAA,IACF,CAAC;AAED,UAAM,gBAAgB,MAAM;AAC1B,kBAAY,QAAQ,CAAC,YAAY;AAAA,IACnC;AAGA,UAAM,UAAU,CAAC,OAAO;AACtB,SAAG,MAAM,SAAS;AAClB,WAAK,GAAG;AACR,SAAG,MAAM,SAAS,GAAG,eAAe;AAAA,IACtC;AAEA,UAAM,eAAe,CAAC,OAAO;AAC3B,SAAG,MAAM,SAAS;AAAA,IACpB;AAGA,UAAM,UAAU,CAAC,OAAO;AACtB,SAAG,MAAM,SAAS,GAAG,eAAe;AACpC,WAAK,GAAG;AACR,SAAG,MAAM,SAAS;AAAA,IACpB;AAEA,aAAa;AAAA,MACX;AAAA,IACF,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,5 +1,5 @@
1
1
  import { ref, onMounted, createElementBlock, openBlock, createElementVNode, createVNode, renderSlot, Transition, withCtx, withDirectives, vShow } from "vue";
2
- /* empty css */
2
+ /* empty css */
3
3
  const _sfc_main = {
4
4
  __name: "Spoiler",
5
5
  props: {
@@ -70,4 +70,4 @@ const _sfc_main = {
70
70
  export {
71
71
  _sfc_main as default
72
72
  };
73
- //# sourceMappingURL=Spoiler.vue.js.map
73
+ //# sourceMappingURL=Spoiler.vue2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Spoiler.vue.cjs","sources":["../../../../../src/components/Spoiler/Spoiler.vue"],"sourcesContent":["<template>\n <div>\n <div @click=\"toggleSpoiler\" class=\"flex-v-center flex-nowrap flex\">\n <slot name=\"header\" :isOpen=\"showSpoiler\"></slot>\n </div>\n <transition\n name=\"collapse\"\n @enter=\"onEnter\"\n @after-enter=\"onAfterEnter\"\n @leave=\"onLeave\"\n >\n <div v-show=\"showSpoiler\" class=\"spoiler\" ref=\"spoilerContent\">\n <slot name=\"content\"></slot>\n </div>\n </transition>\n </div>\n</template>\n<script setup>\nimport { ref, onMounted } from 'vue';\n\nconst props = defineProps({\n status: {\n type: Boolean,\n default: false\n }\n});\n\nconst showSpoiler = ref(false);\nconst spoilerContent = ref(null);\n\nonMounted(() => {\n if (props.status) {\n showSpoiler.value = props.status;\n }\n});\n\nconst toggleSpoiler = () => {\n showSpoiler.value = !showSpoiler.value;\n};\n\n// Анимация открытия\nconst onEnter = (el) => {\n el.style.height = '0';\n void el.offsetHeight; // force reflow\n el.style.height = el.scrollHeight + 'px';\n};\n\nconst onAfterEnter = (el) => {\n el.style.height = 'auto';\n};\n\n// Анимация закрытия\nconst onLeave = (el) => {\n el.style.height = el.scrollHeight + 'px';\n void el.offsetHeight; // force reflow\n el.style.height = '0';\n};\n\ndefineExpose({\n showSpoiler\n});\n</script>\n<style lang=\"scss\">\n.spoiler {\n overflow: hidden;\n transition: height 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n</style>"],"names":["ref","onMounted"],"mappings":";;;;;;;;;;;;;AAoBA,UAAM,QAAQ;AAOd,UAAM,cAAcA,IAAAA,IAAI,KAAK;AAC7B,UAAM,iBAAiBA,IAAAA,IAAI,IAAI;AAE/BC,QAAAA,UAAU,MAAM;AACd,UAAI,MAAM,QAAQ;AAChB,oBAAY,QAAQ,MAAM;AAAA,MAC5B;AAAA,IACF,CAAC;AAED,UAAM,gBAAgB,MAAM;AAC1B,kBAAY,QAAQ,CAAC,YAAY;AAAA,IACnC;AAGA,UAAM,UAAU,CAAC,OAAO;AACtB,SAAG,MAAM,SAAS;AAClB,WAAK,GAAG;AACR,SAAG,MAAM,SAAS,GAAG,eAAe;AAAA,IACtC;AAEA,UAAM,eAAe,CAAC,OAAO;AAC3B,SAAG,MAAM,SAAS;AAAA,IACpB;AAGA,UAAM,UAAU,CAAC,OAAO;AACtB,SAAG,MAAM,SAAS,GAAG,eAAe;AACpC,WAAK,GAAG;AACR,SAAG,MAAM,SAAS;AAAA,IACpB;AAEA,aAAa;AAAA,MACX;AAAA,IACF,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"Spoiler.vue2.js","sources":["../../../../../src/components/Spoiler/Spoiler.vue"],"sourcesContent":["<template>\n <div>\n <div @click=\"toggleSpoiler\" class=\"flex-v-center flex-nowrap flex\">\n <slot name=\"header\" :isOpen=\"showSpoiler\"></slot>\n </div>\n <transition\n name=\"collapse\"\n @enter=\"onEnter\"\n @after-enter=\"onAfterEnter\"\n @leave=\"onLeave\"\n >\n <div v-show=\"showSpoiler\" class=\"spoiler\" ref=\"spoilerContent\">\n <slot name=\"content\"></slot>\n </div>\n </transition>\n </div>\n</template>\n<script setup>\nimport { ref, onMounted } from 'vue';\n\nconst props = defineProps({\n status: {\n type: Boolean,\n default: false\n }\n});\n\nconst showSpoiler = ref(false);\nconst spoilerContent = ref(null);\n\nonMounted(() => {\n if (props.status) {\n showSpoiler.value = props.status;\n }\n});\n\nconst toggleSpoiler = () => {\n showSpoiler.value = !showSpoiler.value;\n};\n\n// Анимация открытия\nconst onEnter = (el) => {\n el.style.height = '0';\n void el.offsetHeight; // force reflow\n el.style.height = el.scrollHeight + 'px';\n};\n\nconst onAfterEnter = (el) => {\n el.style.height = 'auto';\n};\n\n// Анимация закрытия\nconst onLeave = (el) => {\n el.style.height = el.scrollHeight + 'px';\n void el.offsetHeight; // force reflow\n el.style.height = '0';\n};\n\ndefineExpose({\n showSpoiler\n});\n</script>\n<style lang=\"scss\">\n.spoiler {\n overflow: hidden;\n transition: height 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n</style>"],"names":[],"mappings":";;;;;;;;;;;AAoBA,UAAM,QAAQ;AAOd,UAAM,cAAc,IAAI,KAAK;AAC7B,UAAM,iBAAiB,IAAI,IAAI;AAE/B,cAAU,MAAM;AACd,UAAI,MAAM,QAAQ;AAChB,oBAAY,QAAQ,MAAM;AAAA,MAC5B;AAAA,IACF,CAAC;AAED,UAAM,gBAAgB,MAAM;AAC1B,kBAAY,QAAQ,CAAC,YAAY;AAAA,IACnC;AAGA,UAAM,UAAU,CAAC,OAAO;AACtB,SAAG,MAAM,SAAS;AAClB,WAAK,GAAG;AACR,SAAG,MAAM,SAAS,GAAG,eAAe;AAAA,IACtC;AAEA,UAAM,eAAe,CAAC,OAAO;AAC3B,SAAG,MAAM,SAAS;AAAA,IACpB;AAGA,UAAM,UAAU,CAAC,OAAO;AACtB,SAAG,MAAM,SAAS,GAAG,eAAe;AACpC,WAAK,GAAG;AACR,SAAG,MAAM,SAAS;AAAA,IACpB;AAEA,aAAa;AAAA,MACX;AAAA,IACF,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
3
  const vue = require("vue");
4
- ;/* empty css */
4
+ ;/* empty css */
5
5
  const _hoisted_1 = { class: "flex-nowrap flex-v-center flex pos-relative" };
6
6
  const _hoisted_2 = ["onClick"];
7
7
  const _sfc_main = {
@@ -69,4 +69,4 @@ const _sfc_main = {
69
69
  }
70
70
  };
71
71
  exports.default = _sfc_main;
72
- //# sourceMappingURL=Tab.vue.cjs.map
72
+ //# sourceMappingURL=Tab.vue2.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tab.vue2.cjs","sources":["../../../../../src/components/Tab/Tab.vue"],"sourcesContent":["<template>\n <div class=\"flex-nowrap flex-v-center flex pos-relative\">\n <button \n v-for=\"(tab, index) in tabs\" \n :key=\"index\" \n @click=\"handleTabClick(index, tab)\" \n class=\"z-index-1 t-center cursor-pointer\"\n :style=\"isSelected(index, tab) ? 'background: rgb(var(--main)) !important' : ''\"\n :class=\"[\n isSelected(index, tab) ? 'bg-main' : '',\n replaceClasses('pd-small pd-r-medium pd-l-medium w-max pd-small radius-small', classTab)\n ]\"\n >\n {{tab.name || tab.label}}\n </button>\n </div>\n</template>\n\n<script setup>\nimport { ref, computed, watch } from 'vue'\n\nconst emit = defineEmits(['update:selected', 'tab-click']);\n\nconst props = defineProps({\n tabs: Array,\n classTab: String,\n selected: [String, Number],\n modelValue: [String, Number],\n callback: Function\n})\n\nconst selectedTab = ref(0)\n\n// Handle both v-model and selected prop for backward compatibility\nconst updateSelectedIndex = () => {\n if (props.modelValue !== undefined) {\n const selectedIndex = props.tabs.findIndex(tab => tab.value === props.modelValue)\n if (selectedIndex !== -1) {\n selectedTab.value = selectedIndex\n }\n } else if (props.selected !== undefined) {\n const selectedIndex = props.tabs.findIndex(tab => tab.value === props.selected)\n if (selectedIndex !== -1) {\n selectedTab.value = selectedIndex\n }\n }\n}\n\n// Initial setup\nupdateSelectedIndex()\n\n// Watch for changes in selected or modelValue props\nwatch(() => props.selected, updateSelectedIndex)\nwatch(() => props.modelValue, updateSelectedIndex)\n\n// Check if tab is selected\nconst isSelected = (index, tab) => {\n if (props.modelValue !== undefined) {\n return tab.value === props.modelValue\n } else if (props.selected !== undefined) {\n return tab.value === props.selected\n }\n return index === selectedTab.value\n}\n\n// Handle tab click\nfunction handleTabClick(index, tab) {\n selectedTab.value = index\n \n // Emit both events for flexibility\n emit('update:selected', tab.value)\n emit('tab-click', { index, tab })\n \n // For v-model support\n if (props.modelValue !== undefined) {\n emit('update:modelValue', tab.value)\n }\n \n // Call callback if provided\n if (props.callback) props.callback(tab)\n}\n</script>\n\n<style lang=\"scss\">\n.tab-selector {\n position: absolute;\n width: 50%;\n height: 100%;\n left: 0;\n top: 0;\n z-index: 0;\n transition: left 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n</style>"],"names":["ref","watch"],"mappings":";;;;;;;;;;;;;;;;;AAqBA,UAAM,OAAO;AAEb,UAAM,QAAQ;AAQd,UAAM,cAAcA,IAAAA,IAAI,CAAC;AAGzB,UAAM,sBAAsB,MAAM;AAChC,UAAI,MAAM,eAAe,QAAW;AAClC,cAAM,gBAAgB,MAAM,KAAK,UAAU,SAAO,IAAI,UAAU,MAAM,UAAU;AAChF,YAAI,kBAAkB,IAAI;AACxB,sBAAY,QAAQ;AAAA,QACtB;AAAA,MACF,WAAW,MAAM,aAAa,QAAW;AACvC,cAAM,gBAAgB,MAAM,KAAK,UAAU,SAAO,IAAI,UAAU,MAAM,QAAQ;AAC9E,YAAI,kBAAkB,IAAI;AACxB,sBAAY,QAAQ;AAAA,QACtB;AAAA,MACF;AAAA,IACF;AAGA,wBAAmB;AAGnBC,QAAAA,MAAM,MAAM,MAAM,UAAU,mBAAmB;AAC/CA,QAAAA,MAAM,MAAM,MAAM,YAAY,mBAAmB;AAGjD,UAAM,aAAa,CAAC,OAAO,QAAQ;AACjC,UAAI,MAAM,eAAe,QAAW;AAClC,eAAO,IAAI,UAAU,MAAM;AAAA,MAC7B,WAAW,MAAM,aAAa,QAAW;AACvC,eAAO,IAAI,UAAU,MAAM;AAAA,MAC7B;AACA,aAAO,UAAU,YAAY;AAAA,IAC/B;AAGA,aAAS,eAAe,OAAO,KAAK;AAClC,kBAAY,QAAQ;AAGpB,WAAK,mBAAmB,IAAI,KAAK;AACjC,WAAK,aAAa,EAAE,OAAO,IAAG,CAAE;AAGhC,UAAI,MAAM,eAAe,QAAW;AAClC,aAAK,qBAAqB,IAAI,KAAK;AAAA,MACrC;AAGA,UAAI,MAAM,SAAU,OAAM,SAAS,GAAG;AAAA,IACxC;;;;;;;;;;;;;;;;;;;"}
@@ -1,5 +1,5 @@
1
1
  import { ref, watch, createElementBlock, openBlock, Fragment, renderList, normalizeStyle, normalizeClass, toDisplayString } from "vue";
2
- /* empty css */
2
+ /* empty css */
3
3
  const _hoisted_1 = { class: "flex-nowrap flex-v-center flex pos-relative" };
4
4
  const _hoisted_2 = ["onClick"];
5
5
  const _sfc_main = {
@@ -69,4 +69,4 @@ const _sfc_main = {
69
69
  export {
70
70
  _sfc_main as default
71
71
  };
72
- //# sourceMappingURL=Tab.vue.js.map
72
+ //# sourceMappingURL=Tab.vue2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Tab.vue.cjs","sources":["../../../../../src/components/Tab/Tab.vue"],"sourcesContent":["<template>\n <div class=\"flex-nowrap flex-v-center flex pos-relative\">\n <button \n v-for=\"(tab, index) in tabs\" \n :key=\"index\" \n @click=\"handleTabClick(index, tab)\" \n class=\"z-index-1 t-center cursor-pointer\"\n :style=\"isSelected(index, tab) ? 'background: rgb(var(--main)) !important' : ''\"\n :class=\"[\n isSelected(index, tab) ? 'bg-main' : '',\n replaceClasses('pd-small pd-r-medium pd-l-medium w-max pd-small radius-small', classTab)\n ]\"\n >\n {{tab.name || tab.label}}\n </button>\n </div>\n</template>\n\n<script setup>\nimport { ref, computed, watch } from 'vue'\n\nconst emit = defineEmits(['update:selected', 'tab-click']);\n\nconst props = defineProps({\n tabs: Array,\n classTab: String,\n selected: [String, Number],\n modelValue: [String, Number],\n callback: Function\n})\n\nconst selectedTab = ref(0)\n\n// Handle both v-model and selected prop for backward compatibility\nconst updateSelectedIndex = () => {\n if (props.modelValue !== undefined) {\n const selectedIndex = props.tabs.findIndex(tab => tab.value === props.modelValue)\n if (selectedIndex !== -1) {\n selectedTab.value = selectedIndex\n }\n } else if (props.selected !== undefined) {\n const selectedIndex = props.tabs.findIndex(tab => tab.value === props.selected)\n if (selectedIndex !== -1) {\n selectedTab.value = selectedIndex\n }\n }\n}\n\n// Initial setup\nupdateSelectedIndex()\n\n// Watch for changes in selected or modelValue props\nwatch(() => props.selected, updateSelectedIndex)\nwatch(() => props.modelValue, updateSelectedIndex)\n\n// Check if tab is selected\nconst isSelected = (index, tab) => {\n if (props.modelValue !== undefined) {\n return tab.value === props.modelValue\n } else if (props.selected !== undefined) {\n return tab.value === props.selected\n }\n return index === selectedTab.value\n}\n\n// Handle tab click\nfunction handleTabClick(index, tab) {\n selectedTab.value = index\n \n // Emit both events for flexibility\n emit('update:selected', tab.value)\n emit('tab-click', { index, tab })\n \n // For v-model support\n if (props.modelValue !== undefined) {\n emit('update:modelValue', tab.value)\n }\n \n // Call callback if provided\n if (props.callback) props.callback(tab)\n}\n</script>\n\n<style lang=\"scss\">\n.tab-selector {\n position: absolute;\n width: 50%;\n height: 100%;\n left: 0;\n top: 0;\n z-index: 0;\n transition: left 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n</style>"],"names":["ref","watch"],"mappings":";;;;;;;;;;;;;;;;;AAqBA,UAAM,OAAO;AAEb,UAAM,QAAQ;AAQd,UAAM,cAAcA,IAAAA,IAAI,CAAC;AAGzB,UAAM,sBAAsB,MAAM;AAChC,UAAI,MAAM,eAAe,QAAW;AAClC,cAAM,gBAAgB,MAAM,KAAK,UAAU,SAAO,IAAI,UAAU,MAAM,UAAU;AAChF,YAAI,kBAAkB,IAAI;AACxB,sBAAY,QAAQ;AAAA,QACtB;AAAA,MACF,WAAW,MAAM,aAAa,QAAW;AACvC,cAAM,gBAAgB,MAAM,KAAK,UAAU,SAAO,IAAI,UAAU,MAAM,QAAQ;AAC9E,YAAI,kBAAkB,IAAI;AACxB,sBAAY,QAAQ;AAAA,QACtB;AAAA,MACF;AAAA,IACF;AAGA,wBAAmB;AAGnBC,QAAAA,MAAM,MAAM,MAAM,UAAU,mBAAmB;AAC/CA,QAAAA,MAAM,MAAM,MAAM,YAAY,mBAAmB;AAGjD,UAAM,aAAa,CAAC,OAAO,QAAQ;AACjC,UAAI,MAAM,eAAe,QAAW;AAClC,eAAO,IAAI,UAAU,MAAM;AAAA,MAC7B,WAAW,MAAM,aAAa,QAAW;AACvC,eAAO,IAAI,UAAU,MAAM;AAAA,MAC7B;AACA,aAAO,UAAU,YAAY;AAAA,IAC/B;AAGA,aAAS,eAAe,OAAO,KAAK;AAClC,kBAAY,QAAQ;AAGpB,WAAK,mBAAmB,IAAI,KAAK;AACjC,WAAK,aAAa,EAAE,OAAO,IAAG,CAAE;AAGhC,UAAI,MAAM,eAAe,QAAW;AAClC,aAAK,qBAAqB,IAAI,KAAK;AAAA,MACrC;AAGA,UAAI,MAAM,SAAU,OAAM,SAAS,GAAG;AAAA,IACxC;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"Tab.vue2.js","sources":["../../../../../src/components/Tab/Tab.vue"],"sourcesContent":["<template>\n <div class=\"flex-nowrap flex-v-center flex pos-relative\">\n <button \n v-for=\"(tab, index) in tabs\" \n :key=\"index\" \n @click=\"handleTabClick(index, tab)\" \n class=\"z-index-1 t-center cursor-pointer\"\n :style=\"isSelected(index, tab) ? 'background: rgb(var(--main)) !important' : ''\"\n :class=\"[\n isSelected(index, tab) ? 'bg-main' : '',\n replaceClasses('pd-small pd-r-medium pd-l-medium w-max pd-small radius-small', classTab)\n ]\"\n >\n {{tab.name || tab.label}}\n </button>\n </div>\n</template>\n\n<script setup>\nimport { ref, computed, watch } from 'vue'\n\nconst emit = defineEmits(['update:selected', 'tab-click']);\n\nconst props = defineProps({\n tabs: Array,\n classTab: String,\n selected: [String, Number],\n modelValue: [String, Number],\n callback: Function\n})\n\nconst selectedTab = ref(0)\n\n// Handle both v-model and selected prop for backward compatibility\nconst updateSelectedIndex = () => {\n if (props.modelValue !== undefined) {\n const selectedIndex = props.tabs.findIndex(tab => tab.value === props.modelValue)\n if (selectedIndex !== -1) {\n selectedTab.value = selectedIndex\n }\n } else if (props.selected !== undefined) {\n const selectedIndex = props.tabs.findIndex(tab => tab.value === props.selected)\n if (selectedIndex !== -1) {\n selectedTab.value = selectedIndex\n }\n }\n}\n\n// Initial setup\nupdateSelectedIndex()\n\n// Watch for changes in selected or modelValue props\nwatch(() => props.selected, updateSelectedIndex)\nwatch(() => props.modelValue, updateSelectedIndex)\n\n// Check if tab is selected\nconst isSelected = (index, tab) => {\n if (props.modelValue !== undefined) {\n return tab.value === props.modelValue\n } else if (props.selected !== undefined) {\n return tab.value === props.selected\n }\n return index === selectedTab.value\n}\n\n// Handle tab click\nfunction handleTabClick(index, tab) {\n selectedTab.value = index\n \n // Emit both events for flexibility\n emit('update:selected', tab.value)\n emit('tab-click', { index, tab })\n \n // For v-model support\n if (props.modelValue !== undefined) {\n emit('update:modelValue', tab.value)\n }\n \n // Call callback if provided\n if (props.callback) props.callback(tab)\n}\n</script>\n\n<style lang=\"scss\">\n.tab-selector {\n position: absolute;\n width: 50%;\n height: 100%;\n left: 0;\n top: 0;\n z-index: 0;\n transition: left 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n</style>"],"names":[],"mappings":";;;;;;;;;;;;;;;AAqBA,UAAM,OAAO;AAEb,UAAM,QAAQ;AAQd,UAAM,cAAc,IAAI,CAAC;AAGzB,UAAM,sBAAsB,MAAM;AAChC,UAAI,MAAM,eAAe,QAAW;AAClC,cAAM,gBAAgB,MAAM,KAAK,UAAU,SAAO,IAAI,UAAU,MAAM,UAAU;AAChF,YAAI,kBAAkB,IAAI;AACxB,sBAAY,QAAQ;AAAA,QACtB;AAAA,MACF,WAAW,MAAM,aAAa,QAAW;AACvC,cAAM,gBAAgB,MAAM,KAAK,UAAU,SAAO,IAAI,UAAU,MAAM,QAAQ;AAC9E,YAAI,kBAAkB,IAAI;AACxB,sBAAY,QAAQ;AAAA,QACtB;AAAA,MACF;AAAA,IACF;AAGA,wBAAmB;AAGnB,UAAM,MAAM,MAAM,UAAU,mBAAmB;AAC/C,UAAM,MAAM,MAAM,YAAY,mBAAmB;AAGjD,UAAM,aAAa,CAAC,OAAO,QAAQ;AACjC,UAAI,MAAM,eAAe,QAAW;AAClC,eAAO,IAAI,UAAU,MAAM;AAAA,MAC7B,WAAW,MAAM,aAAa,QAAW;AACvC,eAAO,IAAI,UAAU,MAAM;AAAA,MAC7B;AACA,aAAO,UAAU,YAAY;AAAA,IAC/B;AAGA,aAAS,eAAe,OAAO,KAAK;AAClC,kBAAY,QAAQ;AAGpB,WAAK,mBAAmB,IAAI,KAAK;AACjC,WAAK,aAAa,EAAE,OAAO,IAAG,CAAE;AAGhC,UAAI,MAAM,eAAe,QAAW;AAClC,aAAK,qBAAqB,IAAI,KAAK;AAAA,MACrC;AAGA,UAAI,MAAM,SAAU,OAAM,SAAS,GAAG;AAAA,IACxC;;;;;;;;;;;;;;;;;;"}