monobill-mintui 0.6.52 → 0.6.53

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;
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,9 +912,7 @@ var i = class extends HTMLElement {
912
912
  "w-4",
913
913
  "shadow-lg",
914
914
  "transform",
915
- "transition-transform",
916
- "duration-200",
917
- "ease-in-out",
915
+ this._hasUserToggled ? "transition-transform duration-200 ease-in-out" : "",
918
916
  "pointer-events-none",
919
917
  "overflow-hidden"
920
918
  ], t = this._checked ? "translate-x-5" : "translate-x-0.5";
@@ -957,7 +955,7 @@ var i = class extends HTMLElement {
957
955
  }
958
956
  handleToggle(e) {
959
957
  if (!this.isDisabled()) {
960
- this.checked = !this._checked;
958
+ this._hasUserToggled = !0, this.checked = !this._checked;
961
959
  let e = new Event("input", {
962
960
  bubbles: !0,
963
961
  cancelable: !0,
@@ -1974,6 +1972,8 @@ var _ = class extends HTMLElement {
1974
1972
  "direction",
1975
1973
  "open",
1976
1974
  "trigger-id",
1975
+ "trigger-toggle",
1976
+ "trigger-align",
1977
1977
  "padding",
1978
1978
  "hover",
1979
1979
  "distance"
@@ -2010,7 +2010,7 @@ var _ = class extends HTMLElement {
2010
2010
  let e = this._isInsideModal() ? "z-[80]" : "z-[60]";
2011
2011
  this.classList.remove("z-50", "z-[60]", "z-[80]"), this.classList.add(e);
2012
2012
  }
2013
- 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();
2014
2014
  }
2015
2015
  }
2016
2016
  getId() {
@@ -2062,6 +2062,13 @@ var _ = class extends HTMLElement {
2062
2062
  isHoverEnabled() {
2063
2063
  return this.getAttribute("hover") === "true";
2064
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
+ }
2065
2072
  isOpen() {
2066
2073
  return this.getAttribute("open") === "true";
2067
2074
  }
@@ -2078,7 +2085,7 @@ var _ = class extends HTMLElement {
2078
2085
  }, 10));
2079
2086
  }
2080
2087
  _attachTriggerListener() {
2081
- if (this._triggerElement && !this._triggerClickHandler) {
2088
+ if (this.isTriggerToggleEnabled() && this._triggerElement && !this._triggerClickHandler) {
2082
2089
  let e = this;
2083
2090
  this._triggerClickHandler = function(t) {
2084
2091
  t.stopImmediatePropagation(), t.preventDefault(), e.getAttribute("open") === "true" ? e.removeAttribute("open") : e.setAttribute("open", "true");
@@ -2129,31 +2136,31 @@ var _ = class extends HTMLElement {
2129
2136
  direction: "down"
2130
2137
  };
2131
2138
  this.classList.contains("hidden") && (this.classList.remove("hidden"), this._popover.style.visibility = "hidden");
2132
- 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();
2133
2140
  switch (o) {
2134
2141
  case "down":
2135
- 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) {
2136
2143
  let t = e.top - n.height - a;
2137
2144
  t >= 0 ? (o = "up", s = t) : (s = Math.max(0, i - n.height - a), s + n.height > i && (s = 0));
2138
2145
  }
2139
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));
2140
2147
  break;
2141
2148
  case "up":
2142
- 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) {
2143
2150
  let t = e.bottom + a;
2144
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));
2145
2152
  }
2146
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));
2147
2154
  break;
2148
2155
  case "right":
2149
- 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) {
2150
2157
  let t = e.left - n.width - a;
2151
2158
  t >= 0 ? (o = "left", c = t) : (c = Math.max(0, r - n.width - a), c + n.width > r && (c = r - n.width));
2152
2159
  }
2153
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));
2154
2161
  break;
2155
2162
  case "left":
2156
- 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) {
2157
2164
  let t = e.right + a;
2158
2165
  t + n.width <= r ? (o = "right", c = t) : (c = Math.min(r - n.width - a, r - n.width), c < 0 && (c = 0));
2159
2166
  }
@@ -6575,12 +6582,14 @@ customElements.get("mint-chip") || customElements.define("mint-chip", O);
6575
6582
  //#region src/components/tags/Tags.ts
6576
6583
  var k = class extends HTMLElement {
6577
6584
  constructor(...e) {
6578
- 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._dragIndex = null, this._dragChip = null, this._isPointerDragging = !1, this._pointerMoveHandler = null, this._pointerUpHandler = null;
6579
6586
  }
6580
6587
  static get observedAttributes() {
6581
6588
  return [
6582
6589
  "tags",
6583
6590
  "placeholder",
6591
+ "predefined-tags",
6592
+ "predefined-only",
6584
6593
  "sortable",
6585
6594
  "label",
6586
6595
  "info",
@@ -6636,15 +6645,36 @@ var k = class extends HTMLElement {
6636
6645
  }
6637
6646
  _parseAttrs() {
6638
6647
  let e = this.getAttribute("tags");
6639
- 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 [];
6640
6656
  try {
6641
6657
  let t = JSON.parse(e);
6642
- 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) : [];
6643
6675
  } catch (e) {
6644
- console.warn("mint-tags: failed to parse tags attribute", e);
6676
+ return console.warn(`mint-tags: failed to parse ${t} attribute`, e), [];
6645
6677
  }
6646
- let t = this.getAttribute("placeholder");
6647
- t !== null && (this._placeholder = t);
6648
6678
  }
6649
6679
  _syncAttr() {
6650
6680
  this.setAttribute("tags", JSON.stringify(this._tags));
@@ -6673,6 +6703,9 @@ var k = class extends HTMLElement {
6673
6703
  isLoading() {
6674
6704
  return this.hasAttribute("loading");
6675
6705
  }
6706
+ isPredefinedOnly() {
6707
+ return this.getAttribute("predefined-only") === "true";
6708
+ }
6676
6709
  _render() {
6677
6710
  this.classList.add("box-border", "m-0", "p-0", "border-0", "align-baseline", "block", "w-full");
6678
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)}`;
@@ -6697,7 +6730,7 @@ var k = class extends HTMLElement {
6697
6730
  "focus-within:ring-offset-1",
6698
6731
  r ? "focus-within:ring-red-400 dark:focus-within:ring-red-500" : "focus-within:ring-gray-400 dark:focus-within:ring-gray-500"
6699
6732
  ];
6700
- 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) => {
6701
6734
  this.hasAttribute("sortable") && e.preventDefault();
6702
6735
  }), this._chipsWrap.addEventListener("drop", (e) => {
6703
6736
  this.hasAttribute("sortable") && e.preventDefault();
@@ -6717,7 +6750,7 @@ var k = class extends HTMLElement {
6717
6750
  e.key === "Enter" && (e.preventDefault(), this._addFromInput());
6718
6751
  }), this._container.appendChild(this._chipsWrap), this.appendChild(this._container);
6719
6752
  }
6720
- if (this._container) {
6753
+ if (this._input && (this.isPredefinedOnly() && this._predefinedTags.length > 0 ? this._input.setAttribute("readonly", "true") : this._input.removeAttribute("readonly")), this._container) {
6721
6754
  let e = [
6722
6755
  "flex",
6723
6756
  "flex-wrap",
@@ -6747,7 +6780,48 @@ var k = class extends HTMLElement {
6747
6780
  let o = this.querySelector(".mint-tags-info");
6748
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();
6749
6782
  let s = this.getName();
6750
- 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
+ this._predefinedBlurCloseTimer = null, this._getPredefinedPopoverEl()?.removeAttribute("open");
6823
+ }, 150);
6824
+ }));
6751
6825
  }
6752
6826
  _renderSkeleton(e) {
6753
6827
  let t = this._container;
@@ -6774,22 +6848,36 @@ var k = class extends HTMLElement {
6774
6848
  _addFromInput() {
6775
6849
  if (!this._input) return;
6776
6850
  let e = this._input.value.trim();
6777
- if (e) {
6778
- if (this._tags.some((t) => t.value.toLowerCase() === e.toLowerCase())) {
6851
+ if (!e) return;
6852
+ if (this._tags.some((t) => t.value.toLowerCase() === e.toLowerCase())) {
6853
+ this._input.value = "";
6854
+ return;
6855
+ }
6856
+ let t = this._predefinedTags.find((t) => t.value.toLowerCase() === e.toLowerCase());
6857
+ if (this.isPredefinedOnly()) {
6858
+ if (!t) {
6779
6859
  this._input.value = "";
6780
6860
  return;
6781
6861
  }
6782
- this._tags.push({
6783
- value: e,
6784
- label: e,
6785
- dismissable: !0
6786
- }), this._syncAttr(), this._renderChips(), this._emitChange(), this._input.value = "", setTimeout(() => {
6787
- this._input?.focus();
6788
- }, 10);
6789
- }
6862
+ this._addTag(t);
6863
+ } else this._addTag(t || {
6864
+ value: e,
6865
+ label: e,
6866
+ dismissable: !0
6867
+ });
6868
+ this._input.value = "", setTimeout(() => {
6869
+ this._input?.focus();
6870
+ }, 10);
6871
+ }
6872
+ _addTag(e) {
6873
+ this._tags.some((t) => t.value.toLowerCase() === e.value.toLowerCase()) || (this._tags.push({
6874
+ value: e.value,
6875
+ label: e.label || e.value,
6876
+ dismissable: e.dismissable !== !1
6877
+ }), this._syncAttr(), this._renderChips(), this._renderPredefinedPopover(), this._emitChange());
6790
6878
  }
6791
6879
  _removeTag(e) {
6792
- this._tags = this._tags.filter((t) => t.value !== e), this._syncAttr(), this._renderChips(), this._emitChange();
6880
+ this._tags = this._tags.filter((t) => t.value !== e), this._syncAttr(), this._renderChips(), this._renderPredefinedPopover(), this._emitChange();
6793
6881
  }
6794
6882
  _emitChange() {
6795
6883
  this.dispatchEvent(new CustomEvent("tags-change", {
@@ -6817,6 +6905,11 @@ var k = class extends HTMLElement {
6817
6905
  (e.key === "Backspace" || e.key === "Delete") && t.dismissable && (e.preventDefault(), this._removeTag(t.value), this._focusInput());
6818
6906
  });
6819
6907
  }
6908
+ _onContainerPointerDown(e) {
6909
+ if (!this._input || this.isLoading() || e.button !== 0 || e.defaultPrevented) return;
6910
+ let t = e.composedPath();
6911
+ t.some((e) => e === this._input) || t.some((e) => e instanceof HTMLElement && e.tagName === "MINT-CHIP") || this._input.focus({ preventScroll: !0 });
6912
+ }
6820
6913
  _onDragStart(e, t) {
6821
6914
  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"));
6822
6915
  }