@ozdao/martyrs 0.2.596 → 0.2.598

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 (54) hide show
  1. package/dist/builder.js +15 -9
  2. package/dist/martyrs/src/components/Feed/Feed.vue.js +1 -1
  3. package/dist/martyrs/src/components/Select/{Select.vue.js → Select.vue2.js} +2 -2
  4. package/dist/martyrs/src/components/Select/Select.vue2.js.map +1 -0
  5. package/dist/martyrs/src/components/Spoiler/{Spoiler.vue2.js → Spoiler.vue.js} +2 -2
  6. package/dist/martyrs/src/components/Spoiler/Spoiler.vue.js.map +1 -0
  7. package/dist/martyrs/src/modules/community/components/layouts/Community.vue.js +1 -1
  8. package/dist/martyrs/src/modules/core/views/components/partials/Header.vue.js +1 -1
  9. package/dist/martyrs/src/modules/core/views/components/partials/Navigation.vue.js +1 -1
  10. package/dist/martyrs/src/modules/core/views/components/sections/{Filters.vue2.js → Filters.vue.js} +2 -2
  11. package/dist/martyrs/src/modules/core/views/components/sections/Filters.vue.js.map +1 -0
  12. package/dist/martyrs/src/modules/events/components/pages/Event.vue.js +1 -1
  13. package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.js +1 -1
  14. package/dist/martyrs/src/modules/inventory/components/forms/AdjustmentForm.vue.js +1 -1
  15. package/dist/martyrs/src/modules/inventory/components/forms/StockAlertsForm.vue.js +1 -1
  16. package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.js +1 -1
  17. package/dist/martyrs/src/modules/landing/components/sections/SectionGuide.vue.js +1 -1
  18. package/dist/martyrs/src/modules/marketplace/views/components/pages/Marketplace.vue.js +1 -1
  19. package/dist/martyrs/src/modules/music/components/forms/AlbumForm.vue.js +1 -1
  20. package/dist/martyrs/src/modules/music/components/forms/ArtistForm.vue.js +1 -1
  21. package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.js +1 -1
  22. package/dist/martyrs/src/modules/orders/components/forms/FormApplicationDetails.vue.js +1 -1
  23. package/dist/martyrs/src/modules/orders/components/forms/FormCustomerDetails.vue.js +1 -1
  24. package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.js +1 -1
  25. package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.js +1 -1
  26. package/dist/martyrs/src/modules/orders/components/sections/FormPayment.vue.js +1 -1
  27. package/dist/martyrs/src/modules/organizations/components/blocks/CardDepartment.vue.js +1 -1
  28. package/dist/martyrs/src/modules/organizations/components/forms/DepartmentForm.vue.js +1 -1
  29. package/dist/martyrs/src/modules/organizations/components/pages/Department.vue.js +1 -1
  30. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js +2 -2
  31. package/dist/martyrs/src/modules/organizations/components/sections/MembersAdd.vue.js +1 -1
  32. package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.js +1 -1
  33. package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js +2 -2
  34. package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.js +1 -1
  35. package/dist/martyrs/src/modules/products/components/pages/Products.vue.js +2 -2
  36. package/dist/martyrs/src/modules/products/components/sections/EditDiscounts.vue.js +1 -1
  37. package/dist/martyrs/src/modules/products/components/sections/EditVariants.vue.js +1 -1
  38. package/dist/martyrs/src/modules/products/components/sections/FilterProducts.vue.js +1 -1
  39. package/dist/martyrs/src/modules/reports/components/sections/FormReport.vue.js +1 -1
  40. package/dist/martyrs/src/modules/spots/components/blocks/SpotMemberModify.vue.js +1 -1
  41. package/dist/martyrs/src/modules/spots/components/layouts/Spots.vue.js +1 -1
  42. package/dist/martyrs/src/modules/spots/components/pages/Spot.vue.js +1 -1
  43. package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.js +1 -1
  44. package/dist/martyrs/src/modules/spots/components/sections/WorktimeEdit.vue.js +1 -1
  45. package/package.json +1 -1
  46. package/src/jit/core.js +17 -6
  47. package/src/jit/plugin.js +1 -1
  48. package/src/jit/variants.js +2 -2
  49. package/src/modules/TASKS.MD +20 -14
  50. package/src/modules/TASKS_FINISHED.MD +16 -0
  51. package/src/styles/config.scss +2 -0
  52. package/dist/martyrs/src/components/Select/Select.vue.js.map +0 -1
  53. package/dist/martyrs/src/components/Spoiler/Spoiler.vue2.js.map +0 -1
  54. package/dist/martyrs/src/modules/core/views/components/sections/Filters.vue2.js.map +0 -1
package/dist/builder.js CHANGED
@@ -764,7 +764,7 @@ class MartyrsJIT {
764
764
  if (!css) continue;
765
765
  const selector = this.escapeSelector(token);
766
766
  if (appliedVariants.length === 0) {
767
- css = `.${selector} { ${css} }`;
767
+ css = `body .${selector} { ${css} }`;
768
768
  } else {
769
769
  const pseudoVariants = appliedVariants.filter(
770
770
  (v) => ["hover", "focus", "active", "disabled", "first", "last", "odd", "even", "group-hover"].includes(v.name)
@@ -790,9 +790,9 @@ class MartyrsJIT {
790
790
  }
791
791
  let result;
792
792
  if (pseudoVariants.some((v) => v.name === "group-hover")) {
793
- result = `.group:hover .${selector}${pseudoSuffix} { ${css} }`;
793
+ result = `body .group:hover .${selector}${pseudoSuffix} { ${css} }`;
794
794
  } else {
795
- result = `.${selector}${pseudoSuffix} { ${css} }`;
795
+ result = `body .${selector}${pseudoSuffix} { ${css} }`;
796
796
  }
797
797
  for (const v of mediaVariants.reverse()) {
798
798
  const mediaMap = {
@@ -806,7 +806,15 @@ class MartyrsJIT {
806
806
  };
807
807
  const media = mediaMap[v.name];
808
808
  if (media) {
809
- result = `${media} { ${result} }`;
809
+ if (v.name === "dark") {
810
+ result = result.replace(/^body/, ':root:not([data-theme="light"]) body');
811
+ result = `${media} { ${result} }`;
812
+ } else if (v.name === "light") {
813
+ result = result.replace(/^body/, ':root:not([data-theme="dark"]) body');
814
+ result = `${media} { ${result} }`;
815
+ } else {
816
+ result = `${media} { ${result} }`;
817
+ }
810
818
  }
811
819
  }
812
820
  css = result;
@@ -1517,11 +1525,11 @@ const variants = [
1517
1525
  // ========================================
1518
1526
  {
1519
1527
  name: "dark",
1520
- wrapper: (selector, css) => `@media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .${selector} { ${css} } }`
1528
+ wrapper: (selector, css) => `@media (prefers-color-scheme: dark) { .${selector} { ${css} } }`
1521
1529
  },
1522
1530
  {
1523
1531
  name: "light",
1524
- wrapper: (selector, css) => `@media (prefers-color-scheme: light) { :root:not([data-theme="dark"]) .${selector} { ${css} } }`
1532
+ wrapper: (selector, css) => `@media (prefers-color-scheme: light) { .${selector} { ${css} } }`
1525
1533
  },
1526
1534
  // ========================================
1527
1535
  // GROUP VARIANTS
@@ -1840,9 +1848,7 @@ class MartyrsJitPlugin {
1840
1848
  const tokens = Array.from(this.tokens);
1841
1849
  const css = this.jit.generate(tokens);
1842
1850
  return `/* Martyrs JIT - ${tokens.length} tokens */
1843
- body {
1844
- ${css}
1845
- }`;
1851
+ ${css}`;
1846
1852
  }
1847
1853
  }
1848
1854
  const baseConfig = (projectRoot) => {
@@ -7,7 +7,7 @@ import _sfc_main$2 from "../Dropdown/Dropdown.vue.js";
7
7
  import Calendar from "../Calendar/Calendar.vue2.js";
8
8
  import _sfc_main$1 from "../../modules/core/views/components/blocks/BlockSearch.vue.js";
9
9
  import _sfc_main$5 from "../../modules/core/views/components/blocks/BlockSorting.vue.js";
10
- import Filters from "../../modules/core/views/components/sections/Filters.vue2.js";
10
+ import Filters from "../../modules/core/views/components/sections/Filters.vue.js";
11
11
  import _sfc_main$4 from "../../modules/core/views/components/elements/ButtonSort.vue.js";
12
12
  import _sfc_main$3 from "../../modules/core/views/components/elements/ButtonDate.vue.js";
13
13
  /* empty css */
@@ -1,6 +1,6 @@
1
1
  import { ref, computed, watch, createElementBlock, openBlock, Fragment, withDirectives, createVNode, normalizeClass, withModifiers, createCommentVNode, createElementVNode, toDisplayString, Transition, withCtx, renderList, vShow, unref, nextTick } from "vue";
2
2
  import clickOutside from "../FieldPhone/click-outside.js";
3
- /* empty css */
3
+ /* empty css */
4
4
  import _export_sfc from "../../../../_virtual/_plugin-vue_export-helper.js";
5
5
  const _hoisted_1 = {
6
6
  key: 0,
@@ -131,4 +131,4 @@ const Select = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-af5
131
131
  export {
132
132
  Select as default
133
133
  };
134
- //# sourceMappingURL=Select.vue.js.map
134
+ //# sourceMappingURL=Select.vue2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Select.vue2.js","sources":["../../../../../src/components/Select/Select.vue"],"sourcesContent":["<template>\n <!-- Input Wrapper -->\n <div \n ref=\"fieldWrapper\"\n tabindex=\"0\"\n @click.stop=\"toggleMenu\" \n v-click-outside=\"clickedOutside\" \n :class=\"$attrs.class\" \n class=\"cursor-pointer field-wrapper flex-v-center flex-nowrap flex pos-relative\"\n >\n <!-- Label -->\n <span v-if=\"label\" class=\"t-transp mn-r-small\">{{label}}</span>\n \n <!-- Input -->\n <span>\n {{ optionsSelected ? (optionsSelected.name || optionsSelected[props.value] || optionsSelected) : placeholder }}\n </span>\n <!-- Dropdown menu -->\n <transition mode=\"out-in\" name=\"TransitionTranslateY\">\n <ul \n v-show=\"showMenu\" \n class=\"bs-black pos-absolute pos-t-100 pos-l-0 z-index-5 pd-small radius-small bg-white mn-t-thin w-100\"\n style=\"min-width: max-content;\"\n >\n <li @click.stop=\"selectOption(option)\" v-for=\"option in optionsListed\" class=\"radius-thin hover:bg-light pd-thin text-box-trim\">\n <span v-if=\"option\" class=\"w-100\">\n {{ option.name || option[props.value] || option }}\n </span>\n </li>\n </ul>\n </transition>\n </div>\n <!-- Validation -->\n <transition mode=\"out-in\" name=\"fade\">\n <div v-if=\"validation\" class=\"mn-t-thin invalid-feedback\">\n * {{validation.message}}\n </div>\n </transition>\n</template>\n<script setup>\nimport { ref, computed, watch, nextTick } from 'vue'\nimport clickOutside from '../FieldPhone/click-outside.js';\nlet vClickOutside = clickOutside\nconst emit = defineEmits([\n 'update:select', \n 'focus', \n 'blur'\n])\nconst props = defineProps({\n label: String,\n placeholder: { type: String, default: 'Please select an item' },\n select: [String, Object],\n property: String,\n value: String,\n options: { type: Array, default: () => [] },\n validation: Boolean,\n})\nconst showMenu = ref(false)\nconst fieldWrapper = ref(null)\nconst optionsSelected = ref(\n props.property \n ? findObjectByValue(props.select, props.property, props.options) \n : props.select\n)\nconst optionsListed = computed(() => {\n return props.select \n ? props.options.filter(option => option !== props.select) \n : props.options\n})\nwatch(() => props.select, (newSelect) => {\n optionsSelected.value = \n props.property \n ? findObjectByValue(props.select, props.property, props.options) \n : props.select;\n});\nconst toggleMenu = async () => {\n showMenu.value = !showMenu.value\n \n if (showMenu.value) {\n await nextTick()\n fieldWrapper.value?.focus()\n emit('focus')\n } else {\n emit('blur')\n }\n}\nfunction clickedOutside () {\n showMenu.value = false\n}\nconst selectOption = option => {\n optionsSelected.value = option\n \n toggleMenu()\n if (props.property) { \n emit('update:select', optionsSelected.value[props.property])\n } else {\n emit('update:select', optionsSelected.value)\n }\n}\nfunction findObjectByValue (value, property, objects) {\n for (const object of objects) {\n if (object[property] === value || object === value) {\n return object;\n }\n }\n return null;\n}\n</script>\n<style lang=\"scss\" scoped>\n li {\n list-style-type: none;\n }\n ul li {\n line-height: 2;\n }\n .field-wrapper:focus {\n outline: none;\n }\n</style>"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CA,QAAI,gBAAgB;AACpB,UAAM,OAAO;AAKb,UAAM,QAAQ;AASd,UAAM,WAAW,IAAI,KAAK;AAC1B,UAAM,eAAe,IAAI,IAAI;AAC7B,UAAM,kBAAkB;AAAA,MACtB,MAAM,WACJ,kBAAkB,MAAM,QAAQ,MAAM,UAAU,MAAM,OAAO,IAC7D,MAAM;AAAA,IACV;AACA,UAAM,gBAAgB,SAAS,MAAM;AACnC,aAAO,MAAM,SACX,MAAM,QAAQ,OAAO,YAAU,WAAW,MAAM,MAAM,IACtD,MAAM;AAAA,IACV,CAAC;AACD,UAAM,MAAM,MAAM,QAAQ,CAAC,cAAc;AACvC,sBAAgB,QAChB,MAAM,WACJ,kBAAkB,MAAM,QAAQ,MAAM,UAAU,MAAM,OAAO,IAC7D,MAAM;AAAA,IACV,CAAC;AACD,UAAM,aAAa,YAAY;AAC7B,eAAS,QAAQ,CAAC,SAAS;AAE3B,UAAI,SAAS,OAAO;AAClB,cAAM,SAAQ;AACd,qBAAa,OAAO,MAAK;AACzB,aAAK,OAAO;AAAA,MACd,OAAO;AACL,aAAK,MAAM;AAAA,MACb;AAAA,IACF;AACA,aAAS,iBAAkB;AACzB,eAAS,QAAQ;AAAA,IACnB;AACA,UAAM,eAAe,YAAU;AAC7B,sBAAgB,QAAQ;AAExB,iBAAU;AACV,UAAI,MAAM,UAAU;AAClB,aAAK,iBAAiB,gBAAgB,MAAM,MAAM,QAAQ,CAAC;AAAA,MAC7D,OAAO;AACL,aAAK,iBAAiB,gBAAgB,KAAK;AAAA,MAC7C;AAAA,IACF;AACA,aAAS,kBAAmB,OAAO,UAAU,SAAS;AACpD,iBAAW,UAAU,SAAS;AAC5B,YAAI,OAAO,QAAQ,MAAM,SAAS,WAAW,OAAO;AAClD,iBAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO;AAAA,IACT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -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.vue2.js.map
73
+ //# sourceMappingURL=Spoiler.vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Spoiler.vue.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,6 +1,6 @@
1
1
  import { ref, resolveComponent, createElementBlock, openBlock, createElementVNode, createCommentVNode, createVNode, unref, createBlock, normalizeClass, createTextVNode, withCtx, Transition, resolveDynamicComponent, Fragment, renderList } from "vue";
2
2
  import { useRoute, useRouter } from "vue-router";
3
- import Select from "../../../../components/Select/Select.vue.js";
3
+ import Select from "../../../../components/Select/Select.vue2.js";
4
4
  import _sfc_main$5 from "../../../../components/Feed/Feed.vue.js";
5
5
  import _sfc_main$6 from "../../../organizations/components/blocks/CardOrganization.vue.js";
6
6
  import _sfc_main$1 from "../../../icons/entities/IconFeatured.vue.js";
@@ -6,7 +6,7 @@ import { actions, getters } from "../../../../orders/store/shopcart.js";
6
6
  import { state } from "../../../../auth/views/store/auth.js";
7
7
  import NotificationBadge from "../../../../notifications/components/elements/NotificationBadge.vue.js";
8
8
  import _sfc_main$2 from "../../../../../components/Button/Button.vue.js";
9
- import Select from "../../../../../components/Select/Select.vue.js";
9
+ import Select from "../../../../../components/Select/Select.vue2.js";
10
10
  import _sfc_main$4 from "../../../../icons/entities/IconShopcart.vue.js";
11
11
  import _sfc_main$5 from "../../../../icons/entities/IconProfile.vue.js";
12
12
  import _sfc_main$3 from "../../../../icons/navigation/IconSearch.vue.js";
@@ -4,7 +4,7 @@ import IconChevronBottom from "../../../../icons/navigation/IconChevronBottom.vu
4
4
  import { useStore } from "../../store/core.store.js";
5
5
  import { state } from "../../../../auth/views/store/auth.js";
6
6
  import _sfc_main$1 from "../../../../../components/Dropdown/Dropdown.vue.js";
7
- /* empty css */
7
+ /* empty css */
8
8
  /* empty css */
9
9
  import _export_sfc from "../../../../../../../_virtual/_plugin-vue_export-helper.js";
10
10
  const _hoisted_1 = ["onClick"];
@@ -10,7 +10,7 @@ import _sfc_main$2 from "../../../../icons/entities/IconCalendar.vue.js";
10
10
  import _export_sfc from "../../../../../../../_virtual/_plugin-vue_export-helper.js";
11
11
  import _sfc_main$6 from "./filters/FilterOptions.vue.js";
12
12
  import _sfc_main$1 from "../../../../icons/navigation/IconFilter.vue.js";
13
- /* empty css */
13
+ /* empty css */
14
14
  const _hoisted_1 = { class: "flex o-x-scroll scroll-hide ws-nowrap gap-thin" };
15
15
  const _hoisted_2 = { key: 0 };
16
16
  const _hoisted_3 = ["onClick"];
@@ -270,4 +270,4 @@ const Filters = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-02
270
270
  export {
271
271
  Filters as default
272
272
  };
273
- //# sourceMappingURL=Filters.vue2.js.map
273
+ //# sourceMappingURL=Filters.vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Filters.vue.js","sources":["../../../../../../../../src/modules/core/views/components/sections/Filters.vue"],"sourcesContent":["<template>\n <div class=\"flex o-x-scroll scroll-hide ws-nowrap gap-thin\">\n <!-- All Filters Button -->\n <button\n @click=\"showAllFilters = true\"\n class=\"pd-small radius-medium bg-light flex-v-center flex gap-micro cursor-pointer\"\n :class=\"{ 'bg-main': activeFiltersCount > 0 }\"\n >\n <IconFilter class=\"i-regular\" />\n <span class=\"h-1r\"></span>\n <span v-if=\"activeFiltersCount\">{{ activeFiltersCount }}</span>\n </button>\n\n <!-- Individual Filter Buttons -->\n <button\n v-for=\"filter in filters\"\n :key=\"filter.value\"\n @click=\"openFilter(filter.value)\"\n class=\"pd-small radius-medium bg-light cursor-pointer flex-v-center flex gap-micro\"\n :class=\"{ 'selected bg-main': isFilterActive(filter) }\"\n >\n <IconCalendar v-if=\"filter.type === 'date'\" class=\"mn-r-micro i-regular\" />\n <span class=\"ws-nowrap\">{{ filter.type === 'date' && getFilterValue(filter) ? formatFilterValue(filter) : filter.title }}</span>\n <span v-if=\"getFilterValue(filter) && filter.type !== 'date'\" class=\"mn-l-micro\">\n {{ formatFilterValue(filter) }}\n </span>\n </button>\n\n <!-- All Filters Popup -->\n <Popup\n :isPopupOpen=\"showAllFilters\"\n @close-popup=\"closeAllFilters\"\n :align=\"isPhone() ? 'bottom center' : 'center center'\"\n class=\"w-min-20r bg-white radius-medium mobile:radius-zero mobile:radius-tr-medium mobile:radius-tl-medium mobile:w-100 pd-medium\"\n >\n <FiltersGroup\n :filters=\"filters\"\n v-model:selected=\"tempSelected\"\n :immediate=\"false\"\n :showHeader=\"true\"\n :showApplyButton=\"true\"\n :showResetButton=\"true\"\n @update:selected=\"applyAllFilters\"\n />\n </Popup>\n\n <!-- Individual Filter Popups -->\n <Popup\n v-for=\"filter in filters\"\n :key=\"`popup-${filter.value}`\"\n :isPopupOpen=\"individualPopups[filter.value]\"\n @close-popup=\"cancelFilter(filter.value)\"\n :align=\"isPhone() ? 'bottom center' : 'center center'\"\n class=\"bg-white radius-medium mobile:radius-zero mobile:radius-tr-medium mobile:radius-tl-medium mobile:w-100 pd-medium\"\n >\n <h4 class=\"mn-b-medium\">{{ filter.title }}</h4>\n\n <!-- Checkbox Filter -->\n <FilterCheckbox\n v-if=\"filter.type === 'checkbox'\"\n v-model=\"tempSelected[filter.value]\"\n :options=\"filter.options\"\n />\n\n <!-- Range Filter -->\n <FilterRange\n v-else-if=\"filter.type === 'range'\"\n v-model=\"tempSelected[filter.value]\"\n :minPlaceholder=\"filter.minPlaceholder || 'Min'\"\n :maxPlaceholder=\"filter.maxPlaceholder || 'Max'\"\n :label=\"filter.label\"\n />\n\n <!-- Date Filter -->\n <div v-else-if=\"filter.type === 'date'\">\n <div class=\"mn-t-small\">\n <Calendar\n v-model:date=\"tempSelected[filter.value]\"\n :allowRange=\"true\"\n :disablePastDates=\"true\"\n class=\"bg-light radius-small\"\n />\n </div>\n </div>\n\n <!-- Radio/Options Filter -->\n <FilterOptions\n v-else-if=\"filter.type === 'radio'\"\n v-model=\"tempSelected[filter.value]\"\n :options=\"filter.options\"\n />\n\n <div class=\"flex gap-thin mn-t-medium\">\n <button\n @click=\"cancelFilter(filter.value)\"\n class=\"bg-light button flex-child-full\"\n >\n Cancel\n </button>\n <button\n @click=\"applyFilter(filter.value)\"\n class=\"bg-main w-100 button flex-child-full\"\n >\n Apply\n </button>\n </div>\n </Popup>\n </div>\n</template>\n\n<script setup>\nimport { ref, computed, reactive, watch } from 'vue'\nimport { useGlobalMixins } from '@martyrs/src/modules/core/views/mixins/mixins.js'\nimport Popup from '@martyrs/src/components/Popup/Popup.vue'\nimport Calendar from '@martyrs/src/components/Calendar/Calendar.vue'\nimport FiltersGroup from './filters/FiltersGroup.vue'\nimport FilterCheckbox from './filters/FilterCheckbox.vue'\nimport FilterRange from './filters/FilterRange.vue'\nimport FilterDateRange from './filters/FilterDateRange.vue'\nimport FilterOptions from './filters/FilterOptions.vue'\nimport IconFilter from '@martyrs/src/modules/icons/navigation/IconFilter.vue'\nimport IconCross from '@martyrs/src/modules/icons/navigation/IconCross.vue'\nimport IconCalendar from '@martyrs/src/modules/icons/entities/IconCalendar.vue'\n\nconst filters = defineModel('filters', {\n type: Array,\n required: true\n})\n\nconst selected = defineModel('selected', {\n type: Object,\n default: () => ({})\n})\n\nconst emit = defineEmits(['select'])\n\nconst { formatDate, returnCurrency } = useGlobalMixins()\n\n// State\nconst showAllFilters = ref(false)\nconst individualPopups = reactive({})\nconst tempSelected = reactive({})\nconst tempDateRange = ref(null)\n\n// Initialize popups and temp values\nwatch(filters, (newFilters) => {\n newFilters.forEach(filter => {\n individualPopups[filter.value] = false\n \n if (!tempSelected[filter.value]) {\n if (filter.type === 'checkbox') {\n tempSelected[filter.value] = [...(selected.value[filter.value] || [])]\n } else if (filter.type === 'range') {\n tempSelected[filter.value] = { ...(selected.value[filter.value] || { min: '', max: '' }) }\n } else if (filter.type === 'date') {\n tempSelected[filter.value] = selected.value[filter.value] || null\n } else {\n tempSelected[filter.value] = selected.value[filter.value] || null\n }\n }\n })\n}, { immediate: true, deep: true })\n\n// Sync selected to tempSelected\nwatch(selected, (newSelected) => {\n Object.keys(newSelected).forEach(key => {\n const filter = filters.value.find(f => f.value === key)\n if (filter) {\n if (filter.type === 'checkbox') {\n tempSelected[key] = [...(newSelected[key] || [])]\n } else if (filter.type === 'range') {\n tempSelected[key] = { ...(newSelected[key] || { min: '', max: '' }) }\n } else {\n tempSelected[key] = newSelected[key]\n }\n }\n })\n}, { deep: true })\n\n// Computed\nconst activeFiltersCount = computed(() => {\n return Object.entries(selected.value).filter(([key, value]) => {\n if (Array.isArray(value)) return value.length > 0\n if (typeof value === 'object' && value !== null) {\n return value.min || value.max\n }\n return value !== null && value !== undefined\n }).length\n})\n\n// Methods\nconst openFilter = (filterValue) => {\n individualPopups[filterValue] = true\n}\n\nconst isFilterActive = (filter) => {\n const value = selected.value[filter.value]\n if (!value) return false\n if (Array.isArray(value)) return value.length > 0\n if (filter.type === 'range') return value.min || value.max\n return true\n}\n\nconst getFilterValue = (filter) => {\n const value = selected.value[filter.value]\n if (!value) return false\n \n if (filter.type === 'range') {\n return value.min || value.max\n }\n \n if (filter.type === 'date') {\n return value && value.start && value.end\n }\n \n if (Array.isArray(value)) {\n return value.length > 0\n }\n \n return value\n}\n\nconst formatFilterValue = (filter) => {\n const value = selected.value[filter.value]\n if (!value) return ''\n \n if (Array.isArray(value)) {\n return `(${value.length})`\n }\n \n if (filter.type === 'range') {\n if (!value.min && !value.max) return ''\n return `${value.min || '0'}-${value.max || '∞'}`\n }\n \n if (filter.type === 'date') {\n if (!value || !value.start || !value.end) return ''\n return `${formatDate(value.start, { dayMonth: true, language: 'en' })} - ${formatDate(value.end, { dayMonth: true, language: 'en' })}`\n }\n \n if (filter.type === 'radio') {\n const option = filter.options.find(o => o.value === value)\n return option ? `(${option.label})` : ''\n }\n \n return ''\n}\n\nconst applyFilter = (filterValue) => {\n selected.value[filterValue] = tempSelected[filterValue]\n individualPopups[filterValue] = false\n emit('select', { filter: filterValue, value: tempSelected[filterValue] })\n}\n\nconst cancelFilter = (filterValue) => {\n const filter = filters.value.find(f => f.value === filterValue)\n if (filter) {\n if (filter.type === 'checkbox') {\n tempSelected[filterValue] = [...(selected.value[filterValue] || [])]\n } else if (filter.type === 'range') {\n tempSelected[filterValue] = { ...(selected.value[filterValue] || { min: '', max: '' }) }\n } else if (filter.type === 'date') {\n tempSelected[filterValue] = selected.value[filterValue] || null\n } else {\n tempSelected[filterValue] = selected.value[filterValue] || null\n }\n }\n individualPopups[filterValue] = false\n}\n\nconst applyAllFilters = (newValues) => {\n Object.entries(newValues).forEach(([key, value]) => {\n if (selected.value[key] !== value) {\n selected.value[key] = value\n emit('select', { filter: key, value })\n }\n })\n showAllFilters.value = false\n}\n\nconst closeAllFilters = () => {\n showAllFilters.value = false\n}\n</script>\n\n<style scoped>\n.filters-content {\n max-height: 60vh;\n overflow-y: auto;\n}\n</style>"],"names":["_useModel"],"mappings":"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"}
@@ -16,7 +16,7 @@ import SkeletonEvent from "../../../icons/skeletons/SkeletonEvent.vue.js";
16
16
  /* empty css */
17
17
  /* empty css */
18
18
  /* empty css */
19
- /* empty css */
19
+ /* empty css */
20
20
  /* empty css */
21
21
  /* empty css */
22
22
  /* empty css */
@@ -2,7 +2,7 @@ import { ref, createElementBlock, openBlock, createVNode, unref, isRef, withCtx,
2
2
  import { useRoute } from "vue-router";
3
3
  /* empty css */
4
4
  import _sfc_main$8 from "../../../../components/Button/Button.vue.js";
5
- /* empty css */
5
+ /* empty css */
6
6
  import _sfc_main$4 from "../../../../components/Chips/Chips.vue.js";
7
7
  /* empty css */
8
8
  import _sfc_main$5 from "../../../../components/Popup/Popup.vue.js";
@@ -1,7 +1,7 @@
1
1
  import { ref, onMounted, createElementBlock, openBlock, createElementVNode, createCommentVNode, createVNode, Fragment, renderList, normalizeClass, createBlock, resolveDynamicComponent, toDisplayString, withCtx, createTextVNode } from "vue";
2
2
  import { useRoute } from "vue-router";
3
3
  import Field from "../../../../components/Field/Field.vue.js";
4
- import Select from "../../../../components/Select/Select.vue.js";
4
+ import Select from "../../../../components/Select/Select.vue2.js";
5
5
  import _sfc_main$2 from "../../../../components/Button/Button.vue.js";
6
6
  import { state } from "../../../auth/views/store/auth.js";
7
7
  import { actions } from "../../../spots/store/spots.js";
@@ -1,7 +1,7 @@
1
1
  import { ref, computed, onMounted, createElementBlock, openBlock, createElementVNode, createVNode, toDisplayString, withCtx, createTextVNode } from "vue";
2
2
  import { useRoute } from "vue-router";
3
3
  import Field from "../../../../components/Field/Field.vue.js";
4
- import Select from "../../../../components/Select/Select.vue.js";
4
+ import Select from "../../../../components/Select/Select.vue2.js";
5
5
  import _sfc_main$1 from "../../../../components/Button/Button.vue.js";
6
6
  import { state } from "../../../auth/views/store/auth.js";
7
7
  import { actions } from "../../../spots/store/spots.js";
@@ -3,7 +3,7 @@ import _sfc_main$4 from "../../../../components/Block/Block.vue.js";
3
3
  import _sfc_main$7 from "../../../../components/Button/Button.vue.js";
4
4
  import Field from "../../../../components/Field/Field.vue.js";
5
5
  import _sfc_main$2 from "../../../../components/Feed/Feed.vue.js";
6
- /* empty css */
6
+ /* empty css */
7
7
  /* empty css */
8
8
  import _sfc_main$1 from "../../../../components/Popup/Popup.vue.js";
9
9
  import _sfc_main$3 from "../../../orders/components/blocks/CardOrderItem.vue.js";
@@ -1,5 +1,5 @@
1
1
  import { createElementBlock, openBlock, createElementVNode, createCommentVNode, toDisplayString, unref, Fragment, renderList, createBlock, withCtx, createVNode, normalizeClass } from "vue";
2
- import _sfc_main$1 from "../../../../components/Spoiler/Spoiler.vue2.js";
2
+ import _sfc_main$1 from "../../../../components/Spoiler/Spoiler.vue.js";
3
3
  import { useI18n } from "vue-i18n";
4
4
  import IconChevronBottom from "../../../icons/navigation/IconChevronBottom.vue.js";
5
5
  const _hoisted_1 = { class: "" };
@@ -2,7 +2,7 @@ import { ref, watch, createElementBlock, openBlock, createElementVNode, unref, c
2
2
  import { useRoute, useRouter } from "vue-router";
3
3
  import { useI18n } from "vue-i18n";
4
4
  import _sfc_main$2 from "../../../../../components/Feed/Feed.vue.js";
5
- import Filters from "../../../../core/views/components/sections/Filters.vue2.js";
5
+ import Filters from "../../../../core/views/components/sections/Filters.vue.js";
6
6
  import _sfc_main$1 from "../../../../core/views/components/sections/filters/FiltersGroup.vue.js";
7
7
  import Field from "../../../../../components/Field/Field.vue.js";
8
8
  import _sfc_main$3 from "../../../../organizations/components/blocks/CardOrganization.vue.js";
@@ -3,7 +3,7 @@ import { useRouter, useRoute } from "vue-router";
3
3
  import Field from "../../../../components/Field/Field.vue.js";
4
4
  import _sfc_main$1 from "../../../../components/Block/Block.vue.js";
5
5
  import _sfc_main$3 from "../../../../components/Button/Button.vue.js";
6
- import Select from "../../../../components/Select/Select.vue.js";
6
+ import Select from "../../../../components/Select/Select.vue2.js";
7
7
  import UploadImage from "../../../../components/UploadImage/UploadImage.vue.js";
8
8
  import _sfc_main$2 from "../../../icons/navigation/IconCross.vue.js";
9
9
  import BlockMultiselect from "../../../core/views/components/blocks/BlockMultiselect.vue.js";
@@ -4,7 +4,7 @@ import Field from "../../../../components/Field/Field.vue.js";
4
4
  import _sfc_main$1 from "../../../../components/Block/Block.vue.js";
5
5
  import _sfc_main$4 from "../../../../components/Button/Button.vue.js";
6
6
  import _sfc_main$3 from "../../../../components/Checkbox/Checkbox.vue.js";
7
- import Select from "../../../../components/Select/Select.vue.js";
7
+ import Select from "../../../../components/Select/Select.vue2.js";
8
8
  import UploadImage from "../../../../components/UploadImage/UploadImage.vue.js";
9
9
  /* empty css */
10
10
  import BlockMultiselect from "../../../core/views/components/blocks/BlockMultiselect.vue.js";
@@ -4,7 +4,7 @@ import Field from "../../../../components/Field/Field.vue.js";
4
4
  import _sfc_main$1 from "../../../../components/Block/Block.vue.js";
5
5
  import _sfc_main$4 from "../../../../components/Button/Button.vue.js";
6
6
  import _sfc_main$3 from "../../../../components/Checkbox/Checkbox.vue.js";
7
- import Select from "../../../../components/Select/Select.vue.js";
7
+ import Select from "../../../../components/Select/Select.vue2.js";
8
8
  import UploadImage from "../../../../components/UploadImage/UploadImage.vue.js";
9
9
  import Upload from "../../../../components/Upload/Upload.vue2.js";
10
10
  import _sfc_main$2 from "../../../icons/navigation/IconCross.vue.js";
@@ -1,7 +1,7 @@
1
1
  import { mergeModels, useModel, ref, watch, createBlock, openBlock, withCtx, createVNode, createElementVNode, unref, isRef, createTextVNode, toDisplayString } from "vue";
2
2
  import _sfc_main$1 from "../../../../components/Block/Block.vue.js";
3
3
  import Field from "../../../../components/Field/Field.vue.js";
4
- import Select from "../../../../components/Select/Select.vue.js";
4
+ import Select from "../../../../components/Select/Select.vue2.js";
5
5
  import _sfc_main$2 from "../../../../components/Button/Button.vue.js";
6
6
  const _hoisted_1 = { class: "gap-thin flex mn-t-small" };
7
7
  const _sfc_main = {
@@ -2,7 +2,7 @@ import { mergeModels, useModel, ref, watch, createBlock, openBlock, withCtx, cre
2
2
  import _sfc_main$1 from "../../../../components/Block/Block.vue.js";
3
3
  import Field from "../../../../components/Field/Field.vue.js";
4
4
  import _sfc_main$2 from "../../../../components/FieldPhone/FieldPhone.vue.js";
5
- import Select from "../../../../components/Select/Select.vue.js";
5
+ import Select from "../../../../components/Select/Select.vue2.js";
6
6
  import _sfc_main$3 from "../../../../components/Button/Button.vue.js";
7
7
  const _hoisted_1 = { class: "gap-thin mn-b-thin flex-justify-between flex-nowrap flex" };
8
8
  const _hoisted_2 = {
@@ -1,7 +1,7 @@
1
1
  import { ref, onMounted, computed, createElementBlock, createCommentVNode, openBlock, createVNode, createElementVNode, createTextVNode, toDisplayString, Fragment, renderList, unref, normalizeClass, withCtx, createBlock } from "vue";
2
2
  import { useRouter, useRoute } from "vue-router";
3
3
  import _sfc_main$2 from "../../../../components/Button/Button.vue.js";
4
- import Select from "../../../../components/Select/Select.vue.js";
4
+ import Select from "../../../../components/Select/Select.vue2.js";
5
5
  import _sfc_main$1 from "../../../../components/Popup/Popup.vue.js";
6
6
  import IconTime from "../../../icons/entities/IconTime.vue.js";
7
7
  import _sfc_main$3 from "../blocks/CardOrderItem.vue.js";
@@ -10,7 +10,7 @@ import _sfc_main$2 from "../../../../components/Radio/Radio.vue.js";
10
10
  /* empty css */
11
11
  /* empty css */
12
12
  /* empty css */
13
- /* empty css */
13
+ /* empty css */
14
14
  /* empty css */
15
15
  import CardSpot from "../../../spots/components/blocks/CardSpot.vue.js";
16
16
  import { useStore } from "../../../core/views/store/core.store.js";
@@ -1,6 +1,6 @@
1
1
  import { computed, createBlock, openBlock, withCtx, createElementVNode, createVNode } from "vue";
2
2
  import _sfc_main$1 from "../../../../components/Block/Block.vue.js";
3
- import Select from "../../../../components/Select/Select.vue.js";
3
+ import Select from "../../../../components/Select/Select.vue2.js";
4
4
  const _hoisted_1 = { class: "mn-b-small flex-nowrap flex" };
5
5
  const _sfc_main = {
6
6
  __name: "FormPayment",
@@ -1,5 +1,5 @@
1
1
  import { createElementBlock, openBlock, createElementVNode, createCommentVNode, Fragment, renderList, createBlock } from "vue";
2
- /* empty css */
2
+ /* empty css */
3
3
  import "../../organizations.client.js";
4
4
  import _sfc_main$1 from "../../../auth/views/components/blocks/CardUser.vue.js";
5
5
  /* empty css */
@@ -7,7 +7,7 @@ import _sfc_main$6 from "../../../../components/Button/Button.vue.js";
7
7
  import _sfc_main$7 from "../../../../components/Popup/Popup.vue.js";
8
8
  import _sfc_main$1 from "../../../../components/Block/Block.vue.js";
9
9
  import _sfc_main$8 from "../../../../components/Feed/Feed.vue.js";
10
- import _sfc_main$5 from "../../../../components/Spoiler/Spoiler.vue2.js";
10
+ import _sfc_main$5 from "../../../../components/Spoiler/Spoiler.vue.js";
11
11
  import _sfc_main$2 from "../../../auth/views/components/blocks/CardUser.vue.js";
12
12
  import _sfc_main$3 from "../../../icons/navigation/IconDelete.vue.js";
13
13
  import { useStore } from "../../../core/views/store/core.store.js";
@@ -1,6 +1,6 @@
1
1
  import { withAsyncContext, resolveComponent, createElementBlock, openBlock, createCommentVNode, unref, createElementVNode, createVNode, toDisplayString, withCtx, Fragment, renderList, createBlock } from "vue";
2
2
  import { useRouter, useRoute } from "vue-router";
3
- /* empty css */
3
+ /* empty css */
4
4
  import "../../organizations.client.js";
5
5
  import _sfc_main$2 from "../../../auth/views/components/blocks/CardUser.vue.js";
6
6
  import _sfc_main$1 from "../../../icons/navigation/IconEdit.vue.js";
@@ -12,7 +12,7 @@ import _sfc_main$3 from "../../../icons/actions/IconShow.vue.js";
12
12
  import Field from "../../../../components/Field/Field.vue.js";
13
13
  /* empty css */
14
14
  /* empty css */
15
- /* empty css */
15
+ /* empty css */
16
16
  /* empty css */
17
17
  /* empty css */
18
18
  /* empty css */
@@ -22,7 +22,7 @@ import "vue-i18n";
22
22
  /* empty css */
23
23
  import _sfc_main$4 from "../../../../components/FieldTags/BlockTags.vue.js";
24
24
  /* empty css */
25
- /* empty css */
25
+ /* empty css */
26
26
  /* empty css */
27
27
  import UploadImage from "../../../../components/UploadImage/UploadImage.vue.js";
28
28
  import _sfc_main$5 from "../../../../components/Button/Button.vue.js";
@@ -1,6 +1,6 @@
1
1
  import { ref, resolveDirective, createElementBlock, openBlock, createElementVNode, createVNode, toDisplayString, withDirectives, createCommentVNode, isRef, unref, withCtx, Fragment, renderList, createBlock } from "vue";
2
2
  import Field from "../../../../components/Field/Field.vue.js";
3
- /* empty css */
3
+ /* empty css */
4
4
  import _sfc_main$6 from "../../../../components/Button/Button.vue.js";
5
5
  import _sfc_main$2 from "../../../../components/Feed/Feed.vue.js";
6
6
  import _sfc_main$1 from "../../../core/views/components/blocks/BlockSearch.vue.js";
@@ -3,7 +3,7 @@ import { useRouter, useRoute } from "vue-router";
3
3
  import "../../../../../../node_modules/.pnpm/js-cookie@3.0.5/node_modules/js-cookie/dist/js.cookie.js";
4
4
  /* empty css */
5
5
  /* empty css */
6
- /* empty css */
6
+ /* empty css */
7
7
  /* empty css */
8
8
  import _sfc_main$2 from "../blocks/CardOrganization.vue.js";
9
9
  import _sfc_main$1 from "../blocks/EmptyState.vue.js";
@@ -2,7 +2,7 @@ import { ref, onMounted, computed, onUnmounted, createElementBlock, createCommen
2
2
  import { useRoute, useRouter } from "vue-router";
3
3
  import _sfc_main$4 from "../../../icons/navigation/IconDelete.vue.js";
4
4
  import _sfc_main$3 from "../../../../components/Button/Button.vue.js";
5
- import Select from "../../../../components/Select/Select.vue.js";
5
+ import Select from "../../../../components/Select/Select.vue2.js";
6
6
  import UploadImage from "../../../../components/UploadImage/UploadImage.vue.js";
7
7
  import Field from "../../../../components/Field/Field.vue.js";
8
8
  import FieldTags from "../../../../components/FieldTags/FieldTags.vue.js";
@@ -15,7 +15,7 @@ import _sfc_main$1 from "../../../icons/navigation/IconCheckmark.vue.js";
15
15
  /* empty css */
16
16
  /* empty css */
17
17
  /* empty css */
18
- /* empty css */
18
+ /* empty css */
19
19
  /* empty css */
20
20
  import _sfc_main$2 from "../../../../components/Block/Block.vue.js";
21
21
  import { useStore } from "../../../core/views/store/core.store.js";
@@ -3,7 +3,7 @@ import { useRoute, useRouter } from "vue-router";
3
3
  import _sfc_main$1 from "../../../../components/Block/Block.vue.js";
4
4
  import _sfc_main$3 from "../../../../components/Tab/Tab.vue2.js";
5
5
  import Field from "../../../../components/Field/Field.vue.js";
6
- import Select from "../../../../components/Select/Select.vue.js";
6
+ import Select from "../../../../components/Select/Select.vue2.js";
7
7
  import _sfc_main$2 from "../../../../components/Button/Button.vue.js";
8
8
  import _sfc_main$4 from "../../../../components/EditImages/EditImages.vue.js";
9
9
  import BlockMultiselect from "../../../core/views/components/blocks/BlockMultiselect.vue.js";
@@ -3,13 +3,13 @@ import { useRoute, useRouter } from "vue-router";
3
3
  import { useGlobalMixins } from "../../../core/views/mixins/mixins.js";
4
4
  /* empty css */
5
5
  import _sfc_main$5 from "../../../../components/Feed/Feed.vue.js";
6
- import _sfc_main$2 from "../../../../components/Spoiler/Spoiler.vue2.js";
6
+ import _sfc_main$2 from "../../../../components/Spoiler/Spoiler.vue.js";
7
7
  import _sfc_main$3 from "../../../../components/Checkbox/Checkbox.vue.js";
8
8
  import "vue-i18n";
9
9
  import { actions as actions$1 } from "../../store/categories.js";
10
10
  /* empty css */
11
11
  import Field from "../../../../components/Field/Field.vue.js";
12
- import Filters from "../../../core/views/components/sections/Filters.vue2.js";
12
+ import Filters from "../../../core/views/components/sections/Filters.vue.js";
13
13
  import Calendar from "../../../../components/Calendar/Calendar.vue2.js";
14
14
  import _sfc_main$7 from "../../../../components/Popup/Popup.vue.js";
15
15
  import _sfc_main$6 from "../blocks/CardProduct.vue.js";
@@ -3,7 +3,7 @@ import _sfc_main$1 from "../../../../components/Block/Block.vue.js";
3
3
  import Field from "../../../../components/Field/Field.vue.js";
4
4
  import _sfc_main$5 from "../../../../components/Button/Button.vue.js";
5
5
  import _sfc_main$4 from "../../../../components/Popup/Popup.vue.js";
6
- import Select from "../../../../components/Select/Select.vue.js";
6
+ import Select from "../../../../components/Select/Select.vue2.js";
7
7
  import _sfc_main$2 from "../../../icons/navigation/IconEdit.vue.js";
8
8
  import _sfc_main$3 from "../../../icons/navigation/IconDelete.vue.js";
9
9
  const _hoisted_1 = {
@@ -7,7 +7,7 @@ import _sfc_main$1 from "../../../../components/Block/Block.vue.js";
7
7
  import Field from "../../../../components/Field/Field.vue.js";
8
8
  import _sfc_main$3 from "../../../../components/Button/Button.vue.js";
9
9
  import _sfc_main$7 from "../../../../components/Popup/Popup.vue.js";
10
- import Select from "../../../../components/Select/Select.vue.js";
10
+ import Select from "../../../../components/Select/Select.vue2.js";
11
11
  import _sfc_main$2 from "../../../../components/Feed/Feed.vue.js";
12
12
  import _sfc_main$9 from "../../../../components/EditImages/EditImages.vue.js";
13
13
  import _sfc_main$8 from "./EditIngredients.vue.js";
@@ -1,5 +1,5 @@
1
1
  import { ref, watch, onMounted, createElementBlock, openBlock, createVNode, createElementVNode, withCtx, Fragment, renderList, createBlock, toDisplayString, unref } from "vue";
2
- import _sfc_main$1 from "../../../../components/Spoiler/Spoiler.vue2.js";
2
+ import _sfc_main$1 from "../../../../components/Spoiler/Spoiler.vue.js";
3
3
  import _sfc_main$2 from "../../../../components/Checkbox/Checkbox.vue.js";
4
4
  import { useI18n } from "vue-i18n";
5
5
  import { useRoute, useRouter } from "vue-router";
@@ -1,7 +1,7 @@
1
1
  import { reactive, ref, createElementBlock, openBlock, renderSlot, createVNode, withCtx, createElementVNode, createTextVNode } from "vue";
2
2
  import _sfc_main$1 from "../../../../components/Popup/Popup.vue.js";
3
3
  import _sfc_main$2 from "../../../../components/Button/Button.vue.js";
4
- import Select from "../../../../components/Select/Select.vue.js";
4
+ import Select from "../../../../components/Select/Select.vue2.js";
5
5
  import { actions } from "../../store/reports.js";
6
6
  const _sfc_main = {
7
7
  __name: "FormReport",
@@ -1,7 +1,7 @@
1
1
  import { ref, computed, resolveComponent, createElementBlock, openBlock, createElementVNode, createCommentVNode, createBlock, toDisplayString } from "vue";
2
2
  /* empty css */
3
3
  import _export_sfc from "../../../../../../_virtual/_plugin-vue_export-helper.js";
4
- /* empty css */
4
+ /* empty css */
5
5
  /* empty css */
6
6
  const _hoisted_1 = { class: "br-grey-transp-25 radius-small mn-b-small" };
7
7
  const _hoisted_2 = {
@@ -1,7 +1,7 @@
1
1
  import { ref, onMounted, watch, resolveComponent, createElementBlock, openBlock, createElementVNode, createVNode, unref, createCommentVNode, toDisplayString, withCtx, Transition, createBlock, resolveDynamicComponent } from "vue";
2
2
  import { useRoute, useRouter } from "vue-router";
3
3
  import { useI18n } from "vue-i18n";
4
- /* empty css */
4
+ /* empty css */
5
5
  /* empty css */
6
6
  /* empty css */
7
7
  /* empty css */
@@ -1,6 +1,6 @@
1
1
  import { computed, onMounted, createElementBlock, createCommentVNode, openBlock, createVNode, createElementVNode, unref, withCtx, Fragment, renderList, createBlock, toDisplayString } from "vue";
2
2
  import { useRoute, useRouter } from "vue-router";
3
- import _sfc_main$1 from "../../../../components/Spoiler/Spoiler.vue2.js";
3
+ import _sfc_main$1 from "../../../../components/Spoiler/Spoiler.vue.js";
4
4
  import Map from "../../../../components/Map/Map.vue.js";
5
5
  import SpotSub from "../blocks/SpotSub.vue.js";
6
6
  import _sfc_main$2 from "../../../auth/views/components/blocks/CardUser.vue.js";
@@ -4,7 +4,7 @@ import _sfc_main$1 from "../../../../components/Block/Block.vue.js";
4
4
  import UploadImage from "../../../../components/UploadImage/UploadImage.vue.js";
5
5
  /* empty css */
6
6
  import Field from "../../../../components/Field/Field.vue.js";
7
- import Select from "../../../../components/Select/Select.vue.js";
7
+ import Select from "../../../../components/Select/Select.vue2.js";
8
8
  import _sfc_main$3 from "../../../../components/Checkbox/Checkbox.vue.js";
9
9
  import _sfc_main$4 from "../../../../components/Address/Address.vue.js";
10
10
  import _sfc_main$5 from "../../../../components/LocationMarker/LocationMarker.vue.js";
@@ -2,7 +2,7 @@ import { mergeModels, useModel, ref, computed, onMounted, createElementBlock, op
2
2
  import { useI18n } from "vue-i18n";
3
3
  import _sfc_main$1 from "../../../../components/Button/Button.vue.js";
4
4
  import Field from "../../../../components/Field/Field.vue.js";
5
- import Select from "../../../../components/Select/Select.vue.js";
5
+ import Select from "../../../../components/Select/Select.vue2.js";
6
6
  import _sfc_main$3 from "../../../../components/Checkbox/Checkbox.vue.js";
7
7
  import _sfc_main$2 from "../../../../components/Popup/Popup.vue.js";
8
8
  /* empty css */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ozdao/martyrs",
3
- "version": "0.2.596",
3
+ "version": "0.2.598",
4
4
  "description": "Fullstack framework focused on user experience and ease of development.",
5
5
  "author": "OZ DAO <hello@ozdao.dev>",
6
6
  "license": "GPL-3.0-or-later",
package/src/jit/core.js CHANGED
@@ -66,8 +66,8 @@ export class MartyrsJIT {
66
66
  const selector = this.escapeSelector(token);
67
67
 
68
68
  if (appliedVariants.length === 0) {
69
- // Без вариантов — просто оборачиваем в селектор
70
- css = `.${selector} { ${css} }`;
69
+ // Без вариантов — просто оборачиваем в селектор (body для специфичности)
70
+ css = `body .${selector} { ${css} }`;
71
71
  } else {
72
72
  // Разделяем варианты на pseudo-классы и media queries
73
73
  const pseudoVariants = appliedVariants.filter(v =>
@@ -94,12 +94,12 @@ export class MartyrsJIT {
94
94
  pseudoSuffix += pseudoMap[v.name] || '';
95
95
  }
96
96
 
97
- // Базовый селектор с псевдо-классами
97
+ // Базовый селектор с псевдо-классами (body для специфичности)
98
98
  let result;
99
99
  if (pseudoVariants.some(v => v.name === 'group-hover')) {
100
- result = `.group:hover .${selector}${pseudoSuffix} { ${css} }`;
100
+ result = `body .group:hover .${selector}${pseudoSuffix} { ${css} }`;
101
101
  } else {
102
- result = `.${selector}${pseudoSuffix} { ${css} }`;
102
+ result = `body .${selector}${pseudoSuffix} { ${css} }`;
103
103
  }
104
104
 
105
105
  // Оборачиваем в media queries (в обратном порядке — внутренние первые)
@@ -115,7 +115,18 @@ export class MartyrsJIT {
115
115
  };
116
116
  const media = mediaMap[v.name];
117
117
  if (media) {
118
- result = `${media} { ${result} }`;
118
+ // Для dark/light добавляем проверку data-theme, чтобы пользовательский выбор имел приоритет
119
+ if (v.name === 'dark') {
120
+ // dark: применяется только если нет явного data-theme="light"
121
+ result = result.replace(/^body/, ':root:not([data-theme="light"]) body');
122
+ result = `${media} { ${result} }`;
123
+ } else if (v.name === 'light') {
124
+ // light: применяется только если нет явного data-theme="dark"
125
+ result = result.replace(/^body/, ':root:not([data-theme="dark"]) body');
126
+ result = `${media} { ${result} }`;
127
+ } else {
128
+ result = `${media} { ${result} }`;
129
+ }
119
130
  }
120
131
  }
121
132
 
package/src/jit/plugin.js CHANGED
@@ -209,7 +209,7 @@ export class MartyrsJitPlugin {
209
209
  generateCSS() {
210
210
  const tokens = Array.from(this.tokens);
211
211
  const css = this.jit.generate(tokens);
212
- return `/* Martyrs JIT - ${tokens.length} tokens */\nbody {\n${css}\n}`;
212
+ return `/* Martyrs JIT - ${tokens.length} tokens */\n${css}`;
213
213
  }
214
214
  }
215
215
 
@@ -95,13 +95,13 @@ export const variants = [
95
95
  {
96
96
  name: 'dark',
97
97
  wrapper: (selector, css) =>
98
- `@media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .${selector} { ${css} } }`
98
+ `@media (prefers-color-scheme: dark) { .${selector} { ${css} } }`
99
99
  },
100
100
 
101
101
  {
102
102
  name: 'light',
103
103
  wrapper: (selector, css) =>
104
- `@media (prefers-color-scheme: light) { :root:not([data-theme="dark"]) .${selector} { ${css} } }`
104
+ `@media (prefers-color-scheme: light) { .${selector} { ${css} } }`
105
105
  },
106
106
 
107
107
  // ========================================
@@ -101,6 +101,26 @@ export default {
101
101
 
102
102
  ---
103
103
 
104
+ ### JIT: дублирование логики dark/light вариантов
105
+
106
+ **Проблема:** variants.js и core.js оба содержат логику для dark/light вариантов.
107
+
108
+ - `variants.js` — определяет wrapper функции для вариантов
109
+ - `core.js` — имеет свой mediaMap который игнорирует variants.js
110
+
111
+ plugin.js регистрирует варианты из variants.js через `jit.addVariant()`, но core.js потом использует свой хардкод в mediaMap вместо зарегистрированных wrapper функций.
112
+
113
+ **Нужно:** Убрать дублирование — либо использовать wrapper из variants.js в core.js, либо удалить variants.js и держать всё в core.js.
114
+
115
+ **Затронутые файлы**:
116
+ - `app/martyrs/src/jit/core.js` (строки 105-124)
117
+ - `app/martyrs/src/jit/variants.js`
118
+ - `app/martyrs/src/jit/plugin.js` (строки 45-47)
119
+
120
+ **Приоритет**: Средний - работает, но архитектурно неправильно
121
+
122
+ ---
123
+
104
124
  ### JIT: Добавить поддержку last:, first:, odd:, even: для сброса стилей
105
125
 
106
126
  **Проблема**: Варианты `last:`, `first:` и т.д. объявлены в variants.js, но не работают для сброса border и padding. Например `last:br-0` не убирает border у последнего элемента.
@@ -124,17 +144,3 @@ export default {
124
144
 
125
145
  ---
126
146
 
127
- ### SSR: Language switcher рендерится при одном языке
128
-
129
- **Проблема**: Компонент переключения языка отображается в SSR даже когда в конфигурации указан только один язык. Проверка `v-if` на количество языков есть, но при SSR она не срабатывает корректно.
130
-
131
- **Симптом**: На сервере свитчер рендерится, хотя язык один. Вероятно, на момент SSR рендера список языков ещё не инициализирован или приходит пустым/дефолтным.
132
-
133
- **Возможные причины**:
134
- - Список языков загружается асинхронно и недоступен при SSR
135
- - Реактивность не работает на сервере как ожидается
136
- - Дефолтное значение в store отличается от реального конфига
137
-
138
- **Приоритет**: Низкий
139
-
140
- ---
@@ -0,0 +1,16 @@
1
+ # Завершённые задачи
2
+
3
+ ---
4
+
5
+ ### SSR: Language switcher рендерится при одном языке
6
+
7
+ **Проблема**: Компонент переключения языка отображается в SSR даже когда в конфигурации указан только один язык. Проверка `v-if` на количество языков есть, но при SSR она не срабатывает корректно.
8
+
9
+ **Симптом**: На сервере свитчер рендерится, хотя язык один. Вероятно, на момент SSR рендера список языков ещё не инициализирован или приходит пустым/дефолтным.
10
+
11
+ **Возможные причины**:
12
+ - Список языков загружается асинхронно и недоступен при SSR
13
+ - Реактивность не работает на сервере как ожидается
14
+ - Дефолтное значение в store отличается от реального конфига
15
+
16
+ ---
@@ -132,6 +132,8 @@ $xxl-desktop-min: 1921px;
132
132
  }
133
133
  }
134
134
 
135
+
136
+
135
137
  :root[data-theme="dark"] {
136
138
  @include dark-theme-colors;
137
139
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"Select.vue.js","sources":["../../../../../src/components/Select/Select.vue"],"sourcesContent":["<template>\n <!-- Input Wrapper -->\n <div \n ref=\"fieldWrapper\"\n tabindex=\"0\"\n @click.stop=\"toggleMenu\" \n v-click-outside=\"clickedOutside\" \n :class=\"$attrs.class\" \n class=\"cursor-pointer field-wrapper flex-v-center flex-nowrap flex pos-relative\"\n >\n <!-- Label -->\n <span v-if=\"label\" class=\"t-transp mn-r-small\">{{label}}</span>\n \n <!-- Input -->\n <span>\n {{ optionsSelected ? (optionsSelected.name || optionsSelected[props.value] || optionsSelected) : placeholder }}\n </span>\n <!-- Dropdown menu -->\n <transition mode=\"out-in\" name=\"TransitionTranslateY\">\n <ul \n v-show=\"showMenu\" \n class=\"bs-black pos-absolute pos-t-100 pos-l-0 z-index-5 pd-small radius-small bg-white mn-t-thin w-100\"\n style=\"min-width: max-content;\"\n >\n <li @click.stop=\"selectOption(option)\" v-for=\"option in optionsListed\" class=\"radius-thin hover:bg-light pd-thin text-box-trim\">\n <span v-if=\"option\" class=\"w-100\">\n {{ option.name || option[props.value] || option }}\n </span>\n </li>\n </ul>\n </transition>\n </div>\n <!-- Validation -->\n <transition mode=\"out-in\" name=\"fade\">\n <div v-if=\"validation\" class=\"mn-t-thin invalid-feedback\">\n * {{validation.message}}\n </div>\n </transition>\n</template>\n<script setup>\nimport { ref, computed, watch, nextTick } from 'vue'\nimport clickOutside from '../FieldPhone/click-outside.js';\nlet vClickOutside = clickOutside\nconst emit = defineEmits([\n 'update:select', \n 'focus', \n 'blur'\n])\nconst props = defineProps({\n label: String,\n placeholder: { type: String, default: 'Please select an item' },\n select: [String, Object],\n property: String,\n value: String,\n options: { type: Array, default: () => [] },\n validation: Boolean,\n})\nconst showMenu = ref(false)\nconst fieldWrapper = ref(null)\nconst optionsSelected = ref(\n props.property \n ? findObjectByValue(props.select, props.property, props.options) \n : props.select\n)\nconst optionsListed = computed(() => {\n return props.select \n ? props.options.filter(option => option !== props.select) \n : props.options\n})\nwatch(() => props.select, (newSelect) => {\n optionsSelected.value = \n props.property \n ? findObjectByValue(props.select, props.property, props.options) \n : props.select;\n});\nconst toggleMenu = async () => {\n showMenu.value = !showMenu.value\n \n if (showMenu.value) {\n await nextTick()\n fieldWrapper.value?.focus()\n emit('focus')\n } else {\n emit('blur')\n }\n}\nfunction clickedOutside () {\n showMenu.value = false\n}\nconst selectOption = option => {\n optionsSelected.value = option\n \n toggleMenu()\n if (props.property) { \n emit('update:select', optionsSelected.value[props.property])\n } else {\n emit('update:select', optionsSelected.value)\n }\n}\nfunction findObjectByValue (value, property, objects) {\n for (const object of objects) {\n if (object[property] === value || object === value) {\n return object;\n }\n }\n return null;\n}\n</script>\n<style lang=\"scss\" scoped>\n li {\n list-style-type: none;\n }\n ul li {\n line-height: 2;\n }\n .field-wrapper:focus {\n outline: none;\n }\n</style>"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CA,QAAI,gBAAgB;AACpB,UAAM,OAAO;AAKb,UAAM,QAAQ;AASd,UAAM,WAAW,IAAI,KAAK;AAC1B,UAAM,eAAe,IAAI,IAAI;AAC7B,UAAM,kBAAkB;AAAA,MACtB,MAAM,WACJ,kBAAkB,MAAM,QAAQ,MAAM,UAAU,MAAM,OAAO,IAC7D,MAAM;AAAA,IACV;AACA,UAAM,gBAAgB,SAAS,MAAM;AACnC,aAAO,MAAM,SACX,MAAM,QAAQ,OAAO,YAAU,WAAW,MAAM,MAAM,IACtD,MAAM;AAAA,IACV,CAAC;AACD,UAAM,MAAM,MAAM,QAAQ,CAAC,cAAc;AACvC,sBAAgB,QAChB,MAAM,WACJ,kBAAkB,MAAM,QAAQ,MAAM,UAAU,MAAM,OAAO,IAC7D,MAAM;AAAA,IACV,CAAC;AACD,UAAM,aAAa,YAAY;AAC7B,eAAS,QAAQ,CAAC,SAAS;AAE3B,UAAI,SAAS,OAAO;AAClB,cAAM,SAAQ;AACd,qBAAa,OAAO,MAAK;AACzB,aAAK,OAAO;AAAA,MACd,OAAO;AACL,aAAK,MAAM;AAAA,MACb;AAAA,IACF;AACA,aAAS,iBAAkB;AACzB,eAAS,QAAQ;AAAA,IACnB;AACA,UAAM,eAAe,YAAU;AAC7B,sBAAgB,QAAQ;AAExB,iBAAU;AACV,UAAI,MAAM,UAAU;AAClB,aAAK,iBAAiB,gBAAgB,MAAM,MAAM,QAAQ,CAAC;AAAA,MAC7D,OAAO;AACL,aAAK,iBAAiB,gBAAgB,KAAK;AAAA,MAC7C;AAAA,IACF;AACA,aAAS,kBAAmB,OAAO,UAAU,SAAS;AACpD,iBAAW,UAAU,SAAS;AAC5B,YAAI,OAAO,QAAQ,MAAM,SAAS,WAAW,OAAO;AAClD,iBAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO;AAAA,IACT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1 +0,0 @@
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 +0,0 @@
1
- {"version":3,"file":"Filters.vue2.js","sources":["../../../../../../../../src/modules/core/views/components/sections/Filters.vue"],"sourcesContent":["<template>\n <div class=\"flex o-x-scroll scroll-hide ws-nowrap gap-thin\">\n <!-- All Filters Button -->\n <button\n @click=\"showAllFilters = true\"\n class=\"pd-small radius-medium bg-light flex-v-center flex gap-micro cursor-pointer\"\n :class=\"{ 'bg-main': activeFiltersCount > 0 }\"\n >\n <IconFilter class=\"i-regular\" />\n <span class=\"h-1r\"></span>\n <span v-if=\"activeFiltersCount\">{{ activeFiltersCount }}</span>\n </button>\n\n <!-- Individual Filter Buttons -->\n <button\n v-for=\"filter in filters\"\n :key=\"filter.value\"\n @click=\"openFilter(filter.value)\"\n class=\"pd-small radius-medium bg-light cursor-pointer flex-v-center flex gap-micro\"\n :class=\"{ 'selected bg-main': isFilterActive(filter) }\"\n >\n <IconCalendar v-if=\"filter.type === 'date'\" class=\"mn-r-micro i-regular\" />\n <span class=\"ws-nowrap\">{{ filter.type === 'date' && getFilterValue(filter) ? formatFilterValue(filter) : filter.title }}</span>\n <span v-if=\"getFilterValue(filter) && filter.type !== 'date'\" class=\"mn-l-micro\">\n {{ formatFilterValue(filter) }}\n </span>\n </button>\n\n <!-- All Filters Popup -->\n <Popup\n :isPopupOpen=\"showAllFilters\"\n @close-popup=\"closeAllFilters\"\n :align=\"isPhone() ? 'bottom center' : 'center center'\"\n class=\"w-min-20r bg-white radius-medium mobile:radius-zero mobile:radius-tr-medium mobile:radius-tl-medium mobile:w-100 pd-medium\"\n >\n <FiltersGroup\n :filters=\"filters\"\n v-model:selected=\"tempSelected\"\n :immediate=\"false\"\n :showHeader=\"true\"\n :showApplyButton=\"true\"\n :showResetButton=\"true\"\n @update:selected=\"applyAllFilters\"\n />\n </Popup>\n\n <!-- Individual Filter Popups -->\n <Popup\n v-for=\"filter in filters\"\n :key=\"`popup-${filter.value}`\"\n :isPopupOpen=\"individualPopups[filter.value]\"\n @close-popup=\"cancelFilter(filter.value)\"\n :align=\"isPhone() ? 'bottom center' : 'center center'\"\n class=\"bg-white radius-medium mobile:radius-zero mobile:radius-tr-medium mobile:radius-tl-medium mobile:w-100 pd-medium\"\n >\n <h4 class=\"mn-b-medium\">{{ filter.title }}</h4>\n\n <!-- Checkbox Filter -->\n <FilterCheckbox\n v-if=\"filter.type === 'checkbox'\"\n v-model=\"tempSelected[filter.value]\"\n :options=\"filter.options\"\n />\n\n <!-- Range Filter -->\n <FilterRange\n v-else-if=\"filter.type === 'range'\"\n v-model=\"tempSelected[filter.value]\"\n :minPlaceholder=\"filter.minPlaceholder || 'Min'\"\n :maxPlaceholder=\"filter.maxPlaceholder || 'Max'\"\n :label=\"filter.label\"\n />\n\n <!-- Date Filter -->\n <div v-else-if=\"filter.type === 'date'\">\n <div class=\"mn-t-small\">\n <Calendar\n v-model:date=\"tempSelected[filter.value]\"\n :allowRange=\"true\"\n :disablePastDates=\"true\"\n class=\"bg-light radius-small\"\n />\n </div>\n </div>\n\n <!-- Radio/Options Filter -->\n <FilterOptions\n v-else-if=\"filter.type === 'radio'\"\n v-model=\"tempSelected[filter.value]\"\n :options=\"filter.options\"\n />\n\n <div class=\"flex gap-thin mn-t-medium\">\n <button\n @click=\"cancelFilter(filter.value)\"\n class=\"bg-light button flex-child-full\"\n >\n Cancel\n </button>\n <button\n @click=\"applyFilter(filter.value)\"\n class=\"bg-main w-100 button flex-child-full\"\n >\n Apply\n </button>\n </div>\n </Popup>\n </div>\n</template>\n\n<script setup>\nimport { ref, computed, reactive, watch } from 'vue'\nimport { useGlobalMixins } from '@martyrs/src/modules/core/views/mixins/mixins.js'\nimport Popup from '@martyrs/src/components/Popup/Popup.vue'\nimport Calendar from '@martyrs/src/components/Calendar/Calendar.vue'\nimport FiltersGroup from './filters/FiltersGroup.vue'\nimport FilterCheckbox from './filters/FilterCheckbox.vue'\nimport FilterRange from './filters/FilterRange.vue'\nimport FilterDateRange from './filters/FilterDateRange.vue'\nimport FilterOptions from './filters/FilterOptions.vue'\nimport IconFilter from '@martyrs/src/modules/icons/navigation/IconFilter.vue'\nimport IconCross from '@martyrs/src/modules/icons/navigation/IconCross.vue'\nimport IconCalendar from '@martyrs/src/modules/icons/entities/IconCalendar.vue'\n\nconst filters = defineModel('filters', {\n type: Array,\n required: true\n})\n\nconst selected = defineModel('selected', {\n type: Object,\n default: () => ({})\n})\n\nconst emit = defineEmits(['select'])\n\nconst { formatDate, returnCurrency } = useGlobalMixins()\n\n// State\nconst showAllFilters = ref(false)\nconst individualPopups = reactive({})\nconst tempSelected = reactive({})\nconst tempDateRange = ref(null)\n\n// Initialize popups and temp values\nwatch(filters, (newFilters) => {\n newFilters.forEach(filter => {\n individualPopups[filter.value] = false\n \n if (!tempSelected[filter.value]) {\n if (filter.type === 'checkbox') {\n tempSelected[filter.value] = [...(selected.value[filter.value] || [])]\n } else if (filter.type === 'range') {\n tempSelected[filter.value] = { ...(selected.value[filter.value] || { min: '', max: '' }) }\n } else if (filter.type === 'date') {\n tempSelected[filter.value] = selected.value[filter.value] || null\n } else {\n tempSelected[filter.value] = selected.value[filter.value] || null\n }\n }\n })\n}, { immediate: true, deep: true })\n\n// Sync selected to tempSelected\nwatch(selected, (newSelected) => {\n Object.keys(newSelected).forEach(key => {\n const filter = filters.value.find(f => f.value === key)\n if (filter) {\n if (filter.type === 'checkbox') {\n tempSelected[key] = [...(newSelected[key] || [])]\n } else if (filter.type === 'range') {\n tempSelected[key] = { ...(newSelected[key] || { min: '', max: '' }) }\n } else {\n tempSelected[key] = newSelected[key]\n }\n }\n })\n}, { deep: true })\n\n// Computed\nconst activeFiltersCount = computed(() => {\n return Object.entries(selected.value).filter(([key, value]) => {\n if (Array.isArray(value)) return value.length > 0\n if (typeof value === 'object' && value !== null) {\n return value.min || value.max\n }\n return value !== null && value !== undefined\n }).length\n})\n\n// Methods\nconst openFilter = (filterValue) => {\n individualPopups[filterValue] = true\n}\n\nconst isFilterActive = (filter) => {\n const value = selected.value[filter.value]\n if (!value) return false\n if (Array.isArray(value)) return value.length > 0\n if (filter.type === 'range') return value.min || value.max\n return true\n}\n\nconst getFilterValue = (filter) => {\n const value = selected.value[filter.value]\n if (!value) return false\n \n if (filter.type === 'range') {\n return value.min || value.max\n }\n \n if (filter.type === 'date') {\n return value && value.start && value.end\n }\n \n if (Array.isArray(value)) {\n return value.length > 0\n }\n \n return value\n}\n\nconst formatFilterValue = (filter) => {\n const value = selected.value[filter.value]\n if (!value) return ''\n \n if (Array.isArray(value)) {\n return `(${value.length})`\n }\n \n if (filter.type === 'range') {\n if (!value.min && !value.max) return ''\n return `${value.min || '0'}-${value.max || '∞'}`\n }\n \n if (filter.type === 'date') {\n if (!value || !value.start || !value.end) return ''\n return `${formatDate(value.start, { dayMonth: true, language: 'en' })} - ${formatDate(value.end, { dayMonth: true, language: 'en' })}`\n }\n \n if (filter.type === 'radio') {\n const option = filter.options.find(o => o.value === value)\n return option ? `(${option.label})` : ''\n }\n \n return ''\n}\n\nconst applyFilter = (filterValue) => {\n selected.value[filterValue] = tempSelected[filterValue]\n individualPopups[filterValue] = false\n emit('select', { filter: filterValue, value: tempSelected[filterValue] })\n}\n\nconst cancelFilter = (filterValue) => {\n const filter = filters.value.find(f => f.value === filterValue)\n if (filter) {\n if (filter.type === 'checkbox') {\n tempSelected[filterValue] = [...(selected.value[filterValue] || [])]\n } else if (filter.type === 'range') {\n tempSelected[filterValue] = { ...(selected.value[filterValue] || { min: '', max: '' }) }\n } else if (filter.type === 'date') {\n tempSelected[filterValue] = selected.value[filterValue] || null\n } else {\n tempSelected[filterValue] = selected.value[filterValue] || null\n }\n }\n individualPopups[filterValue] = false\n}\n\nconst applyAllFilters = (newValues) => {\n Object.entries(newValues).forEach(([key, value]) => {\n if (selected.value[key] !== value) {\n selected.value[key] = value\n emit('select', { filter: key, value })\n }\n })\n showAllFilters.value = false\n}\n\nconst closeAllFilters = () => {\n showAllFilters.value = false\n}\n</script>\n\n<style scoped>\n.filters-content {\n max-height: 60vh;\n overflow-y: auto;\n}\n</style>"],"names":["_useModel"],"mappings":"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"}