monobill-mintui 0.6.521 → 0.6.531

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.
package/dist/index.js CHANGED
@@ -811,7 +811,7 @@ var i = class extends HTMLElement {
811
811
  ];
812
812
  }
813
813
  constructor() {
814
- super(), this._button = null, this._checked = !1, this._hasRenderedThumbOnce = !1;
814
+ super(), this._button = null, this._checked = !1, this._hasUserToggled = !1;
815
815
  }
816
816
  connectedCallback() {
817
817
  this.classList.add("box-border", "m-0", "p-0", "border-0", "align-baseline", "block", "w-full"), this._checked = this.getAttribute("checked") === "true", this.render();
@@ -912,7 +912,7 @@ var i = class extends HTMLElement {
912
912
  "w-4",
913
913
  "shadow-lg",
914
914
  "transform",
915
- this._hasRenderedThumbOnce ? "transition-transform duration-200 ease-in-out" : "",
915
+ this._hasUserToggled ? "transition-transform duration-200 ease-in-out" : "",
916
916
  "pointer-events-none",
917
917
  "overflow-hidden"
918
918
  ], t = this._checked ? "translate-x-5" : "translate-x-0.5";
@@ -936,7 +936,7 @@ var i = class extends HTMLElement {
936
936
  let c = s.querySelector(".mint-switch-label");
937
937
  r ? (c || (c = document.createElement("label"), c.className = "mint-switch-label cursor-pointer text-sm font-medium text-gray-900 dark:text-gray-100 select-none", this._button && this._button.parentElement === s ? s.insertBefore(c, this._button.nextSibling) : s.appendChild(c)), c.textContent = r, c.setAttribute("for", o), this.isDisabled() ? (c.classList.add("opacity-40", "cursor-not-allowed"), c.classList.remove("cursor-pointer")) : (c.classList.remove("opacity-40", "cursor-not-allowed"), c.classList.add("cursor-pointer"))) : c && c.remove(), this._button.className = t, this._button.disabled = this.isDisabled(), this._button.id = o, this._button.setAttribute("aria-checked", String(this._checked)), this._button.setAttribute("aria-label", r || "Toggle switch"), this._button.setAttribute("role", "switch"), this._button.type = "button";
938
938
  let l = this._button.querySelector("span");
939
- l || (l = document.createElement("span"), this._button.appendChild(l)), l.className = n, this._hasRenderedThumbOnce ||= !0;
939
+ l || (l = document.createElement("span"), this._button.appendChild(l)), l.className = n;
940
940
  let u = l.querySelector("span");
941
941
  if (a) {
942
942
  let e = u;
@@ -955,7 +955,7 @@ var i = class extends HTMLElement {
955
955
  }
956
956
  handleToggle(e) {
957
957
  if (!this.isDisabled()) {
958
- this.checked = !this._checked;
958
+ this._hasUserToggled = !0, this.checked = !this._checked;
959
959
  let e = new Event("input", {
960
960
  bubbles: !0,
961
961
  cancelable: !0,
@@ -1972,6 +1972,8 @@ var _ = class extends HTMLElement {
1972
1972
  "direction",
1973
1973
  "open",
1974
1974
  "trigger-id",
1975
+ "trigger-toggle",
1976
+ "trigger-align",
1975
1977
  "padding",
1976
1978
  "hover",
1977
1979
  "distance"
@@ -2008,7 +2010,7 @@ var _ = class extends HTMLElement {
2008
2010
  let e = this._isInsideModal() ? "z-[80]" : "z-[60]";
2009
2011
  this.classList.remove("z-50", "z-[60]", "z-[80]"), this.classList.add(e);
2010
2012
  }
2011
- this.render(), (e === "trigger-id" || e === "hover") && this._setupTrigger(), e === "open" && this.isOpen() && this._closeOtherPopovers();
2013
+ this.render(), (e === "trigger-id" || e === "hover" || e === "trigger-toggle") && this._setupTrigger(), e === "open" && this.isOpen() && this._closeOtherPopovers();
2012
2014
  }
2013
2015
  }
2014
2016
  getId() {
@@ -2060,6 +2062,13 @@ var _ = class extends HTMLElement {
2060
2062
  isHoverEnabled() {
2061
2063
  return this.getAttribute("hover") === "true";
2062
2064
  }
2065
+ getTriggerAlign() {
2066
+ let e = (this.getAttribute("trigger-align") || "center").toLowerCase();
2067
+ return e === "start" || e === "end" ? e : "center";
2068
+ }
2069
+ isTriggerToggleEnabled() {
2070
+ return this.getAttribute("trigger-toggle") !== "false";
2071
+ }
2063
2072
  isOpen() {
2064
2073
  return this.getAttribute("open") === "true";
2065
2074
  }
@@ -2076,7 +2085,7 @@ var _ = class extends HTMLElement {
2076
2085
  }, 10));
2077
2086
  }
2078
2087
  _attachTriggerListener() {
2079
- if (this._triggerElement && !this._triggerClickHandler) {
2088
+ if (this.isTriggerToggleEnabled() && this._triggerElement && !this._triggerClickHandler) {
2080
2089
  let e = this;
2081
2090
  this._triggerClickHandler = function(t) {
2082
2091
  t.stopImmediatePropagation(), t.preventDefault(), e.getAttribute("open") === "true" ? e.removeAttribute("open") : e.setAttribute("open", "true");
@@ -2127,31 +2136,31 @@ var _ = class extends HTMLElement {
2127
2136
  direction: "down"
2128
2137
  };
2129
2138
  this.classList.contains("hidden") && (this.classList.remove("hidden"), this._popover.style.visibility = "hidden");
2130
- let n = t.getBoundingClientRect(), r = window.innerWidth, i = window.innerHeight, a = this._getDistancePx(), o = this.getDirection(), s = 0, c = 0;
2139
+ let n = t.getBoundingClientRect(), r = window.innerWidth, i = window.innerHeight, a = this._getDistancePx(), o = this.getDirection(), s = 0, c = 0, l = this.getTriggerAlign();
2131
2140
  switch (o) {
2132
2141
  case "down":
2133
- if (s = e.bottom + a, c = e.left + e.width / 2 - n.width / 2, s + n.height > i) {
2142
+ if (s = e.bottom + a, c = l === "start" ? e.left : l === "end" ? e.right - n.width : e.left + e.width / 2 - n.width / 2, s + n.height > i) {
2134
2143
  let t = e.top - n.height - a;
2135
2144
  t >= 0 ? (o = "up", s = t) : (s = Math.max(0, i - n.height - a), s + n.height > i && (s = 0));
2136
2145
  }
2137
2146
  c < 0 && (c = a), c + n.width > r && (c = Math.max(a, r - n.width - a), c + n.width > r && (c = r - n.width));
2138
2147
  break;
2139
2148
  case "up":
2140
- if (s = e.top - n.height - a, c = e.left + e.width / 2 - n.width / 2, s < 0) {
2149
+ if (s = e.top - n.height - a, c = l === "start" ? e.left : l === "end" ? e.right - n.width : e.left + e.width / 2 - n.width / 2, s < 0) {
2141
2150
  let t = e.bottom + a;
2142
2151
  t + n.height <= i ? (o = "down", s = t) : (s = Math.min(i - n.height - a, i - n.height), s < 0 && (s = i - n.height));
2143
2152
  }
2144
2153
  c < 0 && (c = a), c + n.width > r && (c = Math.max(a, r - n.width - a), c + n.width > r && (c = r - n.width));
2145
2154
  break;
2146
2155
  case "right":
2147
- if (s = e.top + e.height / 2 - n.height / 2, c = e.right + a, c + n.width > r) {
2156
+ if (s = l === "start" ? e.top : l === "end" ? e.bottom - n.height : e.top + e.height / 2 - n.height / 2, c = e.right + a, c + n.width > r) {
2148
2157
  let t = e.left - n.width - a;
2149
2158
  t >= 0 ? (o = "left", c = t) : (c = Math.max(0, r - n.width - a), c + n.width > r && (c = r - n.width));
2150
2159
  }
2151
2160
  s < 0 && (s = a), s + n.height > i && (s = Math.max(a, i - n.height - a), s + n.height > i && (s = i - n.height));
2152
2161
  break;
2153
2162
  case "left":
2154
- if (s = e.top + e.height / 2 - n.height / 2, c = e.left - n.width - a, c < 0) {
2163
+ if (s = l === "start" ? e.top : l === "end" ? e.bottom - n.height : e.top + e.height / 2 - n.height / 2, c = e.left - n.width - a, c < 0) {
2155
2164
  let t = e.right + a;
2156
2165
  t + n.width <= r ? (o = "right", c = t) : (c = Math.min(r - n.width - a, r - n.width), c < 0 && (c = 0));
2157
2166
  }
@@ -6573,12 +6582,14 @@ customElements.get("mint-chip") || customElements.define("mint-chip", O);
6573
6582
  //#region src/components/tags/Tags.ts
6574
6583
  var k = class extends HTMLElement {
6575
6584
  constructor(...e) {
6576
- super(...e), this._container = null, this._chipsWrap = null, this._input = null, this._tags = [], this._placeholder = "Add tag", this._dragIndex = null, this._dragChip = null, this._isPointerDragging = !1, this._pointerMoveHandler = null, this._pointerUpHandler = null;
6585
+ super(...e), this._container = null, this._chipsWrap = null, this._input = null, this._tags = [], this._predefinedTags = [], this._placeholder = "Add tag", this._predefinedPopoverOpenListenersAttached = !1, this._predefinedBlurCloseTimer = null, this._suppressNextPredefinedBlurClose = !1, this._dragIndex = null, this._dragChip = null, this._isPointerDragging = !1, this._pointerMoveHandler = null, this._pointerUpHandler = null;
6577
6586
  }
6578
6587
  static get observedAttributes() {
6579
6588
  return [
6580
6589
  "tags",
6581
6590
  "placeholder",
6591
+ "predefined-tags",
6592
+ "predefined-only",
6582
6593
  "sortable",
6583
6594
  "label",
6584
6595
  "info",
@@ -6634,15 +6645,36 @@ var k = class extends HTMLElement {
6634
6645
  }
6635
6646
  _parseAttrs() {
6636
6647
  let e = this.getAttribute("tags");
6637
- if (!e) return;
6648
+ e && (this._tags = this._parseTagItems(e, "tags"));
6649
+ let t = this.getAttribute("placeholder");
6650
+ t !== null && (this._placeholder = t);
6651
+ let n = this.getAttribute("predefined-tags");
6652
+ this._predefinedTags = this._parseTagItems(n, "predefined-tags");
6653
+ }
6654
+ _parseTagItems(e, t) {
6655
+ if (!e) return [];
6638
6656
  try {
6639
6657
  let t = JSON.parse(e);
6640
- Array.isArray(t) && (this._tags = t);
6658
+ return Array.isArray(t) ? t.map((e) => {
6659
+ if (typeof e == "string") {
6660
+ let t = e.trim();
6661
+ return t ? {
6662
+ value: t,
6663
+ label: t,
6664
+ dismissable: !0
6665
+ } : null;
6666
+ }
6667
+ if (!e || typeof e != "object") return null;
6668
+ let t = e, n = String(t.value ?? "").trim();
6669
+ return n ? {
6670
+ value: n,
6671
+ label: String(t.label ?? n),
6672
+ dismissable: t.dismissable !== !1
6673
+ } : null;
6674
+ }).filter((e) => e !== null) : [];
6641
6675
  } catch (e) {
6642
- console.warn("mint-tags: failed to parse tags attribute", e);
6676
+ return console.warn(`mint-tags: failed to parse ${t} attribute`, e), [];
6643
6677
  }
6644
- let t = this.getAttribute("placeholder");
6645
- t !== null && (this._placeholder = t);
6646
6678
  }
6647
6679
  _syncAttr() {
6648
6680
  this.setAttribute("tags", JSON.stringify(this._tags));
@@ -6671,6 +6703,9 @@ var k = class extends HTMLElement {
6671
6703
  isLoading() {
6672
6704
  return this.hasAttribute("loading");
6673
6705
  }
6706
+ isPredefinedOnly() {
6707
+ return this.getAttribute("predefined-only") === "true";
6708
+ }
6674
6709
  _render() {
6675
6710
  this.classList.add("box-border", "m-0", "p-0", "border-0", "align-baseline", "block", "w-full");
6676
6711
  let e = this.isLoading(), t = this.getLabel(), n = this.getInfo(), r = this.hasError(), i = this.getId() || `mint-tags-${Math.random().toString(36).substr(2, 9)}`;
@@ -6695,7 +6730,7 @@ var k = class extends HTMLElement {
6695
6730
  "focus-within:ring-offset-1",
6696
6731
  r ? "focus-within:ring-red-400 dark:focus-within:ring-red-500" : "focus-within:ring-gray-400 dark:focus-within:ring-gray-500"
6697
6732
  ];
6698
- this._container.className = e.join(" "), this._chipsWrap = document.createElement("div"), this._chipsWrap.className = "flex flex-wrap items-center gap-2", this._chipsWrap.addEventListener("dragover", (e) => {
6733
+ this._container.className = e.join(" "), this._container.addEventListener("pointerdown", (e) => this._onContainerPointerDown(e)), this._chipsWrap = document.createElement("div"), this._chipsWrap.className = "flex flex-wrap items-center gap-2", this._chipsWrap.addEventListener("dragover", (e) => {
6699
6734
  this.hasAttribute("sortable") && e.preventDefault();
6700
6735
  }), this._chipsWrap.addEventListener("drop", (e) => {
6701
6736
  this.hasAttribute("sortable") && e.preventDefault();
@@ -6715,7 +6750,7 @@ var k = class extends HTMLElement {
6715
6750
  e.key === "Enter" && (e.preventDefault(), this._addFromInput());
6716
6751
  }), this._container.appendChild(this._chipsWrap), this.appendChild(this._container);
6717
6752
  }
6718
- if (this._container) {
6753
+ if (this._input && (this.isPredefinedOnly() && this._predefinedTags.length > 0 ? this._input.setAttribute("readonly", "true") : this._input.removeAttribute("readonly")), this._container) {
6719
6754
  let e = [
6720
6755
  "flex",
6721
6756
  "flex-wrap",
@@ -6745,7 +6780,52 @@ var k = class extends HTMLElement {
6745
6780
  let o = this.querySelector(".mint-tags-info");
6746
6781
  n ? (o || (o = document.createElement("span"), o.className = "mint-tags-info text-xs text-gray-500 dark:text-gray-400 select-none mt-1 block", this._container && this._container.parentElement === this ? this.insertBefore(o, this._container.nextSibling) : this.appendChild(o)), o.textContent = n) : o && o.remove();
6747
6782
  let s = this.getName();
6748
- s ? (this.setAttribute("name", s), this._input && (this._input.name = s, this._input.id = i)) : (this.removeAttribute("name"), this._input && (this._input.removeAttribute("name"), this._input.id = i)), this._wireInputBackspace(), this._renderChips(), this._renderErrorState(), this._renderSkeleton(e);
6783
+ s ? (this.setAttribute("name", s), this._input && (this._input.name = s, this._input.id = i)) : (this.removeAttribute("name"), this._input && (this._input.removeAttribute("name"), this._input.id = i)), this._wireInputBackspace(), this._renderChips(), this._renderPredefinedPopover(), this._renderErrorState(), this._renderSkeleton(e);
6784
+ }
6785
+ _getAvailablePredefinedTags() {
6786
+ let e = new Set(this._tags.map((e) => e.value.toLowerCase()));
6787
+ return this._predefinedTags.filter((t) => !e.has(t.value.toLowerCase()));
6788
+ }
6789
+ _renderPredefinedPopover() {
6790
+ if (!this._container || !this._chipsWrap || (this.querySelectorAll("[data-mint-tags-predefined=\"true\"]").forEach((e) => e.remove()), !this._predefinedTags.length) || !this._input || !this._input.id) return;
6791
+ let e = `${this.getAttribute("id") || this._input.id}-tags-field`;
6792
+ this._container.id = e;
6793
+ let t = document.createElement("mint-popover");
6794
+ t.setAttribute("trigger-id", e), t.setAttribute("trigger-toggle", "false"), t.setAttribute("trigger-align", "start"), t.setAttribute("direction", "down"), t.setAttribute("padding", "0"), t.setAttribute("distance", "6px"), t.dataset.mintTagsPredefined = "true";
6795
+ let n = document.createElement("div"), r = this._container.offsetWidth;
6796
+ n.className = "box-border flex w-full min-w-0 flex-col gap-0.5 bg-white p-1 dark:bg-mint-elevated", r > 0 ? n.style.minWidth = `${Math.max(r, 200)}px` : n.style.minWidth = "12rem", n.addEventListener("mousedown", (e) => {
6797
+ e.preventDefault();
6798
+ });
6799
+ let i = this._getAvailablePredefinedTags();
6800
+ if (i.length) i.forEach((e) => {
6801
+ let r = document.createElement("mint-button");
6802
+ r.setAttribute("type", "button"), r.setAttribute("variant", "ghost"), r.setAttribute("full-width", "true"), r.setAttribute("align", "left"), r.className = "w-full justify-start", r.textContent = e.label || e.value, r.addEventListener("click", () => {
6803
+ this._addTag(e), t.removeAttribute("open");
6804
+ }), n.appendChild(r);
6805
+ });
6806
+ else {
6807
+ let e = document.createElement("div");
6808
+ e.className = "px-2 py-1 text-xs text-gray-500 dark:text-gray-400", e.textContent = "No tags available", n.appendChild(e);
6809
+ }
6810
+ t.appendChild(n), this._container.appendChild(t), this._attachPredefinedPopoverOpenOnInputFocus();
6811
+ }
6812
+ _getPredefinedPopoverEl() {
6813
+ return this.querySelector("mint-popover[data-mint-tags-predefined=\"true\"]");
6814
+ }
6815
+ _attachPredefinedPopoverOpenOnInputFocus() {
6816
+ !this._input || !this._predefinedTags.length || this._predefinedPopoverOpenListenersAttached || (this._predefinedPopoverOpenListenersAttached = !0, this._input.addEventListener("focus", () => {
6817
+ if (this._predefinedBlurCloseTimer !== null && (window.clearTimeout(this._predefinedBlurCloseTimer), this._predefinedBlurCloseTimer = null), this.isLoading()) return;
6818
+ let e = this._getPredefinedPopoverEl();
6819
+ e && e.setAttribute("open", "true");
6820
+ }), this._input.addEventListener("blur", () => {
6821
+ this._predefinedBlurCloseTimer !== null && window.clearTimeout(this._predefinedBlurCloseTimer), this._predefinedBlurCloseTimer = window.setTimeout(() => {
6822
+ if (this._predefinedBlurCloseTimer = null, this._suppressNextPredefinedBlurClose) {
6823
+ this._suppressNextPredefinedBlurClose = !1;
6824
+ return;
6825
+ }
6826
+ this._getPredefinedPopoverEl()?.removeAttribute("open");
6827
+ }, 150);
6828
+ }));
6749
6829
  }
6750
6830
  _renderSkeleton(e) {
6751
6831
  let t = this._container;
@@ -6772,22 +6852,36 @@ var k = class extends HTMLElement {
6772
6852
  _addFromInput() {
6773
6853
  if (!this._input) return;
6774
6854
  let e = this._input.value.trim();
6775
- if (e) {
6776
- if (this._tags.some((t) => t.value.toLowerCase() === e.toLowerCase())) {
6855
+ if (!e) return;
6856
+ if (this._tags.some((t) => t.value.toLowerCase() === e.toLowerCase())) {
6857
+ this._input.value = "";
6858
+ return;
6859
+ }
6860
+ let t = this._predefinedTags.find((t) => t.value.toLowerCase() === e.toLowerCase());
6861
+ if (this.isPredefinedOnly()) {
6862
+ if (!t) {
6777
6863
  this._input.value = "";
6778
6864
  return;
6779
6865
  }
6780
- this._tags.push({
6781
- value: e,
6782
- label: e,
6783
- dismissable: !0
6784
- }), this._syncAttr(), this._renderChips(), this._emitChange(), this._input.value = "", setTimeout(() => {
6785
- this._input?.focus();
6786
- }, 10);
6787
- }
6866
+ this._addTag(t);
6867
+ } else this._addTag(t || {
6868
+ value: e,
6869
+ label: e,
6870
+ dismissable: !0
6871
+ });
6872
+ this._input.value = "", setTimeout(() => {
6873
+ this._input?.focus();
6874
+ }, 10);
6875
+ }
6876
+ _addTag(e) {
6877
+ this._tags.some((t) => t.value.toLowerCase() === e.value.toLowerCase()) || (this._tags.push({
6878
+ value: e.value,
6879
+ label: e.label || e.value,
6880
+ dismissable: e.dismissable !== !1
6881
+ }), this._syncAttr(), this._renderChips(), this._renderPredefinedPopover(), this._emitChange());
6788
6882
  }
6789
6883
  _removeTag(e) {
6790
- this._tags = this._tags.filter((t) => t.value !== e), this._syncAttr(), this._renderChips(), this._emitChange();
6884
+ this._tags = this._tags.filter((t) => t.value !== e), this._syncAttr(), this._renderChips(), this._renderPredefinedPopover(), this._emitChange();
6791
6885
  }
6792
6886
  _emitChange() {
6793
6887
  this.dispatchEvent(new CustomEvent("tags-change", {
@@ -6815,6 +6909,15 @@ var k = class extends HTMLElement {
6815
6909
  (e.key === "Backspace" || e.key === "Delete") && t.dismissable && (e.preventDefault(), this._removeTag(t.value), this._focusInput());
6816
6910
  });
6817
6911
  }
6912
+ _onContainerPointerDown(e) {
6913
+ if (this._input && e.button === 0 && !e.defaultPrevented && !e.composedPath().some((e) => e === this._input)) {
6914
+ this._predefinedBlurCloseTimer !== null && (window.clearTimeout(this._predefinedBlurCloseTimer), this._predefinedBlurCloseTimer = null), this._suppressNextPredefinedBlurClose = !0, e.preventDefault();
6915
+ try {
6916
+ this._input.focus({ preventScroll: !0 });
6917
+ } catch {}
6918
+ this._predefinedTags.length > 0 && this._getPredefinedPopoverEl()?.setAttribute("open", "true");
6919
+ }
6920
+ }
6818
6921
  _onDragStart(e, t) {
6819
6922
  this.hasAttribute("sortable") && (this._dragChip = t, this._dragIndex = Number(t.dataset.index), e.dataTransfer?.setData("text/plain", t.dataset.index || ""), e.dataTransfer && (e.dataTransfer.effectAllowed = "move", e.dataTransfer.dropEffect = "move"), t.classList.add("opacity-60"));
6820
6923
  }