@melodicdev/components 1.0.3 → 1.0.5

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.
@@ -4571,7 +4571,7 @@ function oa(e) {
4571
4571
  "ml-input--disabled": e.disabled,
4572
4572
  "ml-input--readonly": e.readonly,
4573
4573
  "ml-input--error": !!e.error,
4574
- "ml-input--focused": e._focused
4574
+ "ml-input--focused": e.focused
4575
4575
  })}
4576
4576
  >
4577
4577
  ${d(!!e.label, () => i`
@@ -4739,7 +4739,7 @@ const ia = () => y`
4739
4739
  `;
4740
4740
  var it = class {
4741
4741
  constructor() {
4742
- this.type = "text", this.value = "", this.placeholder = "", this.label = "", this.hint = "", this.error = "", this.size = "md", this.disabled = !1, this.readonly = !1, this.required = !1, this.autocomplete = "off", this._focused = !1, this.handleInput = (t) => {
4742
+ this.type = "text", this.value = "", this.placeholder = "", this.label = "", this.hint = "", this.error = "", this.size = "md", this.disabled = !1, this.readonly = !1, this.required = !1, this.autocomplete = "off", this.focused = !1, this.handleInput = (t) => {
4743
4743
  this.value = t.target.value, this.elementRef.dispatchEvent(new CustomEvent("ml:input", {
4744
4744
  bubbles: !0,
4745
4745
  composed: !0,
@@ -4752,12 +4752,12 @@ var it = class {
4752
4752
  detail: { value: this.value }
4753
4753
  }));
4754
4754
  }, this.handleFocus = () => {
4755
- this._focused = !0, this.elementRef.dispatchEvent(new CustomEvent("ml:focus", {
4755
+ this.focused = !0, this.elementRef.dispatchEvent(new CustomEvent("ml:focus", {
4756
4756
  bubbles: !0,
4757
4757
  composed: !0
4758
4758
  }));
4759
4759
  }, this.handleBlur = () => {
4760
- this._focused = !1, this.elementRef.dispatchEvent(new CustomEvent("ml:blur", {
4760
+ this.focused = !1, this.elementRef.dispatchEvent(new CustomEvent("ml:blur", {
4761
4761
  bubbles: !0,
4762
4762
  composed: !0
4763
4763
  }));
@@ -4794,7 +4794,7 @@ function sa(e) {
4794
4794
  "ml-textarea--disabled": e.disabled,
4795
4795
  "ml-textarea--readonly": e.readonly,
4796
4796
  "ml-textarea--error": !!e.error,
4797
- "ml-textarea--focused": e._focused,
4797
+ "ml-textarea--focused": e.focused,
4798
4798
  "ml-textarea--resize": e.resize
4799
4799
  })}
4800
4800
  >
@@ -4947,7 +4947,7 @@ const na = () => y`
4947
4947
  `;
4948
4948
  var st = class {
4949
4949
  constructor() {
4950
- this.value = "", this.placeholder = "", this.label = "", this.hint = "", this.error = "", this.size = "md", this.rows = 3, this.maxLength = 0, this.disabled = !1, this.readonly = !1, this.required = !1, this.resize = !1, this._focused = !1, this.handleInput = (t) => {
4950
+ this.value = "", this.placeholder = "", this.label = "", this.hint = "", this.error = "", this.size = "md", this.rows = 3, this.maxLength = 0, this.disabled = !1, this.readonly = !1, this.required = !1, this.resize = !1, this.focused = !1, this.handleInput = (t) => {
4951
4951
  this.value = t.target.value, this.elementRef.dispatchEvent(new CustomEvent("ml:input", {
4952
4952
  bubbles: !0,
4953
4953
  composed: !0,
@@ -4960,12 +4960,12 @@ var st = class {
4960
4960
  detail: { value: this.value }
4961
4961
  }));
4962
4962
  }, this.handleFocus = () => {
4963
- this._focused = !0, this.elementRef.dispatchEvent(new CustomEvent("ml:focus", {
4963
+ this.focused = !0, this.elementRef.dispatchEvent(new CustomEvent("ml:focus", {
4964
4964
  bubbles: !0,
4965
4965
  composed: !0
4966
4966
  }));
4967
4967
  }, this.handleBlur = () => {
4968
- this._focused = !1, this.elementRef.dispatchEvent(new CustomEvent("ml:blur", {
4968
+ this.focused = !1, this.elementRef.dispatchEvent(new CustomEvent("ml:blur", {
4969
4969
  bubbles: !0,
4970
4970
  composed: !0
4971
4971
  }));
@@ -10956,6 +10956,7 @@ const Co = () => y`
10956
10956
  display: flex;
10957
10957
  flex-direction: column;
10958
10958
  height: 100%;
10959
+ min-width: 0;
10959
10960
  font-family: var(--ml-font-sans);
10960
10961
  }
10961
10962
 
@@ -11008,6 +11009,7 @@ const Co = () => y`
11008
11009
  overflow: auto;
11009
11010
  position: relative;
11010
11011
  min-height: 0;
11012
+ min-width: 0;
11011
11013
  }
11012
11014
 
11013
11015
  .ml-data-grid__viewport::-webkit-scrollbar {
@@ -14215,7 +14217,7 @@ function hi(e, t) {
14215
14217
  `;
14216
14218
  }
14217
14219
  function Pe(e, t, r) {
14218
- const l = e.active === t.value, a = !!t.children && t.children.length > 0, o = e._expandedItems.has(t.value), s = e.collapsed, n = v({
14220
+ const l = e.active === t.value, a = !!t.children && t.children.length > 0, o = e.expandedItems.has(t.value), s = e.collapsed, n = v({
14219
14221
  "ml-sidebar__item-link": !0,
14220
14222
  "ml-sidebar__item-link--active": l,
14221
14223
  "ml-sidebar__item-link--disabled": !!t.disabled,
@@ -14225,7 +14227,7 @@ function Pe(e, t, r) {
14225
14227
  }), c = (u) => {
14226
14228
  if (!t.disabled) {
14227
14229
  if (a) {
14228
- u.preventDefault(), e.handleConfigToggle(t, e._expandedItems);
14230
+ u.preventDefault(), e.handleConfigToggle(t);
14229
14231
  return;
14230
14232
  }
14231
14233
  e.handleConfigItemClick(t.value, t.href);
@@ -14577,8 +14579,9 @@ var Zt = class {
14577
14579
  this._slottedItems = t.target.assignedElements({ flatten: !0 }), this.updateItemStates();
14578
14580
  }, this.handleConfigItemClick = (t, r) => {
14579
14581
  this.activateItem(t, r);
14580
- }, this.handleConfigToggle = (t, r) => {
14581
- r.has(t.value) ? r.delete(t.value) : r.add(t.value), this.elementRef.dispatchEvent(new Event("ml:internal-update"));
14582
+ }, this.handleConfigToggle = (t) => {
14583
+ const r = new Set(this.expandedItems);
14584
+ r.has(t.value) ? r.delete(t.value) : r.add(t.value), this.expandedItems = r;
14582
14585
  }, this.handleKeyDown = (t) => {
14583
14586
  const r = this.elementRef.shadowRoot?.querySelector(".ml-sidebar__main");
14584
14587
  if (!r) return;
@@ -14601,7 +14604,7 @@ var Zt = class {
14601
14604
  return;
14602
14605
  }
14603
14606
  o !== a && l[o] && l[o].focus();
14604
- }, this._expandedItems = /* @__PURE__ */ new Set();
14607
+ }, this.expandedItems = /* @__PURE__ */ new Set();
14605
14608
  }
14606
14609
  /** Check if search slot has content */
14607
14610
  get hasSearch() {
@@ -17744,7 +17747,7 @@ hr = g([_({
17744
17747
  ]
17745
17748
  })], hr);
17746
17749
  function Zi(e) {
17747
- const t = e["sidebar-position"] === "right", r = e["sidebar-collapsed"], l = e["header-fixed"], a = e._mobileOpen, o = e.isMobile;
17750
+ const t = e["sidebar-position"] === "right", r = e["sidebar-collapsed"], l = e["header-fixed"], a = e.mobileOpen, o = e.mobile;
17748
17751
  return i`
17749
17752
  <div
17750
17753
  class=${v({
@@ -17988,23 +17991,20 @@ const es = () => y`
17988
17991
  `;
17989
17992
  var pr = class {
17990
17993
  constructor() {
17991
- this["sidebar-position"] = "left", this["sidebar-collapsed"] = !1, this["header-fixed"] = !1, this._mobileOpen = !1, this._mediaQuery = null, this._handleMediaChange = this.onMediaChange.bind(this), this.toggleMobileSidebar = () => {
17992
- this._mobileOpen = !this._mobileOpen;
17994
+ this["sidebar-position"] = "left", this["sidebar-collapsed"] = !1, this["header-fixed"] = !1, this.mobile = !1, this.mobileOpen = !1, this._mediaQuery = null, this._handleMediaChange = this.onMediaChange.bind(this), this.toggleMobileSidebar = () => {
17995
+ this.mobileOpen = !this.mobileOpen;
17993
17996
  }, this.closeMobileSidebar = () => {
17994
- this._mobileOpen = !1;
17997
+ this.mobileOpen = !1;
17995
17998
  };
17996
17999
  }
17997
- get isMobile() {
17998
- return this._mediaQuery?.matches === !1;
17999
- }
18000
18000
  onCreate() {
18001
- this._mediaQuery = window.matchMedia("(min-width: 768px)"), this._mediaQuery.addEventListener("change", this._handleMediaChange), this.isMobile || (this._mobileOpen = !1);
18001
+ this._mediaQuery = window.matchMedia("(min-width: 768px)"), this._mediaQuery.addEventListener("change", this._handleMediaChange), this.mobile = !this._mediaQuery.matches;
18002
18002
  }
18003
18003
  onDestroy() {
18004
18004
  this._mediaQuery?.removeEventListener("change", this._handleMediaChange);
18005
18005
  }
18006
18006
  onMediaChange(t) {
18007
- t.matches && (this._mobileOpen = !1);
18007
+ this.mobile = !t.matches, t.matches && (this.mobileOpen = !1);
18008
18008
  }
18009
18009
  };
18010
18010
  pr = g([_({
@@ -1 +1 @@
1
- {"version":3,"file":"data-grid.styles.d.ts","sourceRoot":"","sources":["../../../../src/components/data-display/data-grid/data-grid.styles.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,cAAc,iDAwe1B,CAAC"}
1
+ {"version":3,"file":"data-grid.styles.d.ts","sourceRoot":"","sources":["../../../../src/components/data-display/data-grid/data-grid.styles.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,cAAc,iDA0e1B,CAAC"}
@@ -4,6 +4,7 @@ export const dataGridStyles = () => css `
4
4
  display: flex;
5
5
  flex-direction: column;
6
6
  height: 100%;
7
+ min-width: 0;
7
8
  font-family: var(--ml-font-sans);
8
9
  }
9
10
 
@@ -56,6 +57,7 @@ export const dataGridStyles = () => css `
56
57
  overflow: auto;
57
58
  position: relative;
58
59
  min-height: 0;
60
+ min-width: 0;
59
61
  }
60
62
 
61
63
  .ml-data-grid__viewport::-webkit-scrollbar {
@@ -45,7 +45,7 @@ export declare class InputComponent implements IElementRef, OnInit {
45
45
  /** Autocomplete attribute */
46
46
  autocomplete: string;
47
47
  /** Internal focus state */
48
- _focused: boolean;
48
+ focused: boolean;
49
49
  onInit(): void;
50
50
  handleInput: (event: Event) => void;
51
51
  handleChange: (event: Event) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"input.component.d.ts","sourceRoot":"","sources":["../../../../src/components/forms/input/input.component.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAIlD;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAMa,cAAe,YAAW,WAAW,EAAE,MAAM;IACzD,UAAU,EAAG,WAAW,CAAC;IAEzB,iBAAiB;IACjB,IAAI,EAAE,SAAS,CAAU;IAEzB,oBAAoB;IACpB,KAAK,SAAM;IAEX,uBAAuB;IACvB,WAAW,SAAM;IAEjB,iBAAiB;IACjB,KAAK,SAAM;IAEX,kCAAkC;IAClC,IAAI,SAAM;IAEV,iDAAiD;IACjD,KAAK,SAAM;IAEX,iBAAiB;IACjB,IAAI,EAAE,IAAI,CAAQ;IAElB,wBAAwB;IACxB,QAAQ,UAAS;IAEjB,0BAA0B;IAC1B,QAAQ,UAAS;IAEjB,uBAAuB;IACvB,QAAQ,UAAS;IAEjB,6BAA6B;IAC7B,YAAY,SAAS;IAErB,2BAA2B;IAC3B,QAAQ,UAAS;IAEjB,MAAM,IAAI,IAAI;IAOd,WAAW,GAAI,OAAO,KAAK,KAAG,IAAI,CAWhC;IAEF,YAAY,GAAI,OAAO,KAAK,KAAG,IAAI,CAWjC;IAEF,WAAW,QAAO,IAAI,CAQpB;IAEF,UAAU,QAAO,IAAI,CAQnB;CACF"}
1
+ {"version":3,"file":"input.component.d.ts","sourceRoot":"","sources":["../../../../src/components/forms/input/input.component.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAIlD;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAMa,cAAe,YAAW,WAAW,EAAE,MAAM;IACzD,UAAU,EAAG,WAAW,CAAC;IAEzB,iBAAiB;IACjB,IAAI,EAAE,SAAS,CAAU;IAEzB,oBAAoB;IACpB,KAAK,SAAM;IAEX,uBAAuB;IACvB,WAAW,SAAM;IAEjB,iBAAiB;IACjB,KAAK,SAAM;IAEX,kCAAkC;IAClC,IAAI,SAAM;IAEV,iDAAiD;IACjD,KAAK,SAAM;IAEX,iBAAiB;IACjB,IAAI,EAAE,IAAI,CAAQ;IAElB,wBAAwB;IACxB,QAAQ,UAAS;IAEjB,0BAA0B;IAC1B,QAAQ,UAAS;IAEjB,uBAAuB;IACvB,QAAQ,UAAS;IAEjB,6BAA6B;IAC7B,YAAY,SAAS;IAErB,2BAA2B;IAC3B,OAAO,UAAS;IAEhB,MAAM,IAAI,IAAI;IAOd,WAAW,GAAI,OAAO,KAAK,KAAG,IAAI,CAWhC;IAEF,YAAY,GAAI,OAAO,KAAK,KAAG,IAAI,CAWjC;IAEF,WAAW,QAAO,IAAI,CAQpB;IAEF,UAAU,QAAO,IAAI,CAQnB;CACF"}
@@ -51,7 +51,7 @@ let InputComponent = class InputComponent {
51
51
  /** Autocomplete attribute */
52
52
  this.autocomplete = 'off';
53
53
  /** Internal focus state */
54
- this._focused = false;
54
+ this.focused = false;
55
55
  this.handleInput = (event) => {
56
56
  const target = event.target;
57
57
  this.value = target.value;
@@ -71,14 +71,14 @@ let InputComponent = class InputComponent {
71
71
  }));
72
72
  };
73
73
  this.handleFocus = () => {
74
- this._focused = true;
74
+ this.focused = true;
75
75
  this.elementRef.dispatchEvent(new CustomEvent('ml:focus', {
76
76
  bubbles: true,
77
77
  composed: true
78
78
  }));
79
79
  };
80
80
  this.handleBlur = () => {
81
- this._focused = false;
81
+ this.focused = false;
82
82
  this.elementRef.dispatchEvent(new CustomEvent('ml:blur', {
83
83
  bubbles: true,
84
84
  composed: true
@@ -8,7 +8,7 @@ export function inputTemplate(c) {
8
8
  'ml-input--disabled': c.disabled,
9
9
  'ml-input--readonly': c.readonly,
10
10
  'ml-input--error': !!c.error,
11
- 'ml-input--focused': c._focused
11
+ 'ml-input--focused': c.focused
12
12
  })}
13
13
  >
14
14
  ${when(!!c.label, () => html `
@@ -42,7 +42,7 @@ export declare class TextareaComponent implements IElementRef, OnInit {
42
42
  /** Allow vertical resize */
43
43
  resize: boolean;
44
44
  /** Internal focus state */
45
- _focused: boolean;
45
+ focused: boolean;
46
46
  onInit(): void;
47
47
  handleInput: (event: Event) => void;
48
48
  handleChange: (event: Event) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"textarea.component.d.ts","sourceRoot":"","sources":["../../../../src/components/forms/textarea/textarea.component.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAIpD;;;;;;;;;;;;;;GAcG;AACH,qBAMa,iBAAkB,YAAW,WAAW,EAAE,MAAM;IAC5D,UAAU,EAAG,WAAW,CAAC;IAEzB,oBAAoB;IACpB,KAAK,SAAM;IAEX,uBAAuB;IACvB,WAAW,SAAM;IAEjB,iBAAiB;IACjB,KAAK,SAAM;IAEX,qCAAqC;IACrC,IAAI,SAAM;IAEV,iDAAiD;IACjD,KAAK,SAAM;IAEX,iBAAiB;IACjB,IAAI,EAAE,IAAI,CAAQ;IAElB,mCAAmC;IACnC,IAAI,SAAK;IAET,+BAA+B;IAC/B,SAAS,SAAK;IAEd,2BAA2B;IAC3B,QAAQ,UAAS;IAEjB,6BAA6B;IAC7B,QAAQ,UAAS;IAEjB,uBAAuB;IACvB,QAAQ,UAAS;IAEjB,4BAA4B;IAC5B,MAAM,UAAS;IAEf,2BAA2B;IAC3B,QAAQ,UAAS;IAEjB,MAAM,IAAI,IAAI;IAMd,WAAW,GAAI,OAAO,KAAK,KAAG,IAAI,CAWhC;IAEF,YAAY,GAAI,OAAO,KAAK,KAAG,IAAI,CAWjC;IAEF,WAAW,QAAO,IAAI,CAQpB;IAEF,UAAU,QAAO,IAAI,CAQnB;CACF"}
1
+ {"version":3,"file":"textarea.component.d.ts","sourceRoot":"","sources":["../../../../src/components/forms/textarea/textarea.component.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAIpD;;;;;;;;;;;;;;GAcG;AACH,qBAMa,iBAAkB,YAAW,WAAW,EAAE,MAAM;IAC5D,UAAU,EAAG,WAAW,CAAC;IAEzB,oBAAoB;IACpB,KAAK,SAAM;IAEX,uBAAuB;IACvB,WAAW,SAAM;IAEjB,iBAAiB;IACjB,KAAK,SAAM;IAEX,qCAAqC;IACrC,IAAI,SAAM;IAEV,iDAAiD;IACjD,KAAK,SAAM;IAEX,iBAAiB;IACjB,IAAI,EAAE,IAAI,CAAQ;IAElB,mCAAmC;IACnC,IAAI,SAAK;IAET,+BAA+B;IAC/B,SAAS,SAAK;IAEd,2BAA2B;IAC3B,QAAQ,UAAS;IAEjB,6BAA6B;IAC7B,QAAQ,UAAS;IAEjB,uBAAuB;IACvB,QAAQ,UAAS;IAEjB,4BAA4B;IAC5B,MAAM,UAAS;IAEf,2BAA2B;IAC3B,OAAO,UAAS;IAEhB,MAAM,IAAI,IAAI;IAMd,WAAW,GAAI,OAAO,KAAK,KAAG,IAAI,CAWhC;IAEF,YAAY,GAAI,OAAO,KAAK,KAAG,IAAI,CAWjC;IAEF,WAAW,QAAO,IAAI,CAQpB;IAEF,UAAU,QAAO,IAAI,CAQnB;CACF"}
@@ -49,7 +49,7 @@ let TextareaComponent = class TextareaComponent {
49
49
  /** Allow vertical resize */
50
50
  this.resize = false;
51
51
  /** Internal focus state */
52
- this._focused = false;
52
+ this.focused = false;
53
53
  this.handleInput = (event) => {
54
54
  const target = event.target;
55
55
  this.value = target.value;
@@ -69,14 +69,14 @@ let TextareaComponent = class TextareaComponent {
69
69
  }));
70
70
  };
71
71
  this.handleFocus = () => {
72
- this._focused = true;
72
+ this.focused = true;
73
73
  this.elementRef.dispatchEvent(new CustomEvent('ml:focus', {
74
74
  bubbles: true,
75
75
  composed: true
76
76
  }));
77
77
  };
78
78
  this.handleBlur = () => {
79
- this._focused = false;
79
+ this.focused = false;
80
80
  this.elementRef.dispatchEvent(new CustomEvent('ml:blur', {
81
81
  bubbles: true,
82
82
  composed: true
@@ -8,7 +8,7 @@ export function textareaTemplate(c) {
8
8
  'ml-textarea--disabled': c.disabled,
9
9
  'ml-textarea--readonly': c.readonly,
10
10
  'ml-textarea--error': !!c.error,
11
- 'ml-textarea--focused': c._focused,
11
+ 'ml-textarea--focused': c.focused,
12
12
  'ml-textarea--resize': c.resize
13
13
  })}
14
14
  >
@@ -62,11 +62,11 @@ export declare class SidebarComponent implements IElementRef, OnCreate, OnDestro
62
62
  /** Handle config item click */
63
63
  handleConfigItemClick: (value: string, href?: string) => void;
64
64
  /** Handle config submenu toggle */
65
- handleConfigToggle: (item: SidebarNavItem, expandedItems: Set<string>) => void;
65
+ handleConfigToggle: (item: SidebarNavItem) => void;
66
66
  /** Keyboard navigation */
67
67
  handleKeyDown: (event: KeyboardEvent) => void;
68
68
  /** Track expanded config items */
69
- _expandedItems: Set<string>;
69
+ expandedItems: Set<string>;
70
70
  /** Activate an item */
71
71
  private activateItem;
72
72
  /** Handle item click from slotted children */
@@ -1 +1 @@
1
- {"version":3,"file":"sidebar.component.d.ts","sourceRoot":"","sources":["../../../../src/components/navigation/sidebar/sidebar.component.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACnF,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAI1F;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,qBAMa,gBAAiB,YAAW,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ;IAClF,UAAU,EAAG,WAAW,CAAC;IAEzB,qBAAqB;IACrB,OAAO,EAAE,cAAc,CAAa;IAEpC,kCAAkC;IAClC,MAAM,SAAM;IAEZ,yDAAyD;IACzD,SAAS,UAAS;IAElB,yDAAyD;IACzD,UAAU,EAAE,eAAe,EAAE,CAAM;IAEnC,+BAA+B;IAC/B,gBAAgB,EAAE,cAAc,EAAE,CAAM;IAExC,yCAAyC;IACzC,aAAa,EAAE,WAAW,EAAE,CAAM;IAElC,+BAA+B;IAC/B,OAAO,CAAC,WAAW,CAA8C;IAEjE,2BAA2B;IAC3B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA+B;IAChE,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAgC;IAClE,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAgC;IAElE,uCAAuC;IACvC,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,wCAAwC;IACxC,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,qCAAqC;IACrC,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,QAAQ,IAAI,IAAI;IAgBhB,QAAQ,IAAI,IAAI;IAIhB,SAAS,IAAI,IAAI;IAUjB,kCAAkC;IAClC,uBAAuB,GAAI,OAAO,KAAK,KAAG,IAAI,CAI5C;IAEF,+BAA+B;IAC/B,qBAAqB,GAAI,OAAO,MAAM,EAAE,OAAO,MAAM,KAAG,IAAI,CAE1D;IAEF,mCAAmC;IACnC,kBAAkB,GAAI,MAAM,cAAc,EAAE,eAAe,GAAG,CAAC,MAAM,CAAC,KAAG,IAAI,CAQ3E;IAEF,0BAA0B;IAC1B,aAAa,GAAI,OAAO,aAAa,KAAG,IAAI,CAmC1C;IAEF,kCAAkC;IAClC,cAAc,cAAqB;IAEnC,uBAAuB;IACvB,OAAO,CAAC,YAAY;IAqBpB,8CAA8C;IAC9C,OAAO,CAAC,WAAW;IAKnB,0CAA0C;IAC1C,OAAO,CAAC,YAAY;IASpB,0CAA0C;IAC1C,OAAO,CAAC,YAAY;IASpB,2DAA2D;IAC3D,OAAO,CAAC,gBAAgB;CAexB"}
1
+ {"version":3,"file":"sidebar.component.d.ts","sourceRoot":"","sources":["../../../../src/components/navigation/sidebar/sidebar.component.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACnF,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAI1F;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,qBAMa,gBAAiB,YAAW,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ;IAClF,UAAU,EAAG,WAAW,CAAC;IAEzB,qBAAqB;IACrB,OAAO,EAAE,cAAc,CAAa;IAEpC,kCAAkC;IAClC,MAAM,SAAM;IAEZ,yDAAyD;IACzD,SAAS,UAAS;IAElB,yDAAyD;IACzD,UAAU,EAAE,eAAe,EAAE,CAAM;IAEnC,+BAA+B;IAC/B,gBAAgB,EAAE,cAAc,EAAE,CAAM;IAExC,yCAAyC;IACzC,aAAa,EAAE,WAAW,EAAE,CAAM;IAElC,+BAA+B;IAC/B,OAAO,CAAC,WAAW,CAA8C;IAEjE,2BAA2B;IAC3B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA+B;IAChE,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAgC;IAClE,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAgC;IAElE,uCAAuC;IACvC,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,wCAAwC;IACxC,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,qCAAqC;IACrC,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,QAAQ,IAAI,IAAI;IAgBhB,QAAQ,IAAI,IAAI;IAIhB,SAAS,IAAI,IAAI;IAUjB,kCAAkC;IAClC,uBAAuB,GAAI,OAAO,KAAK,KAAG,IAAI,CAI5C;IAEF,+BAA+B;IAC/B,qBAAqB,GAAI,OAAO,MAAM,EAAE,OAAO,MAAM,KAAG,IAAI,CAE1D;IAEF,mCAAmC;IACnC,kBAAkB,GAAI,MAAM,cAAc,KAAG,IAAI,CAQ/C;IAEF,0BAA0B;IAC1B,aAAa,GAAI,OAAO,aAAa,KAAG,IAAI,CAmC1C;IAEF,kCAAkC;IAClC,aAAa,cAAqB;IAElC,uBAAuB;IACvB,OAAO,CAAC,YAAY;IAqBpB,8CAA8C;IAC9C,OAAO,CAAC,WAAW;IAKnB,0CAA0C;IAC1C,OAAO,CAAC,YAAY;IASpB,0CAA0C;IAC1C,OAAO,CAAC,YAAY;IASpB,2DAA2D;IAC3D,OAAO,CAAC,gBAAgB;CAexB"}
@@ -66,15 +66,15 @@ let SidebarComponent = class SidebarComponent {
66
66
  this.activateItem(value, href);
67
67
  };
68
68
  /** Handle config submenu toggle */
69
- this.handleConfigToggle = (item, expandedItems) => {
70
- if (expandedItems.has(item.value)) {
71
- expandedItems.delete(item.value);
69
+ this.handleConfigToggle = (item) => {
70
+ const next = new Set(this.expandedItems);
71
+ if (next.has(item.value)) {
72
+ next.delete(item.value);
72
73
  }
73
74
  else {
74
- expandedItems.add(item.value);
75
+ next.add(item.value);
75
76
  }
76
- // Trigger re-render
77
- this.elementRef.dispatchEvent(new Event('ml:internal-update'));
77
+ this.expandedItems = next;
78
78
  };
79
79
  /** Keyboard navigation */
80
80
  this.handleKeyDown = (event) => {
@@ -109,7 +109,7 @@ let SidebarComponent = class SidebarComponent {
109
109
  }
110
110
  };
111
111
  /** Track expanded config items */
112
- this._expandedItems = new Set();
112
+ this.expandedItems = new Set();
113
113
  }
114
114
  /** Check if search slot has content */
115
115
  get hasSearch() {
@@ -73,7 +73,7 @@ function renderNavGroup(c, group) {
73
73
  function renderNavItem(c, item, level) {
74
74
  const isActive = c.active === item.value;
75
75
  const hasChildren = !!item.children && item.children.length > 0;
76
- const isExpanded = c._expandedItems.has(item.value);
76
+ const isExpanded = c.expandedItems.has(item.value);
77
77
  const isCollapsed = c.collapsed;
78
78
  const linkClasses = classMap({
79
79
  'ml-sidebar__item-link': true,
@@ -88,7 +88,7 @@ function renderNavItem(c, item, level) {
88
88
  return;
89
89
  if (hasChildren) {
90
90
  event.preventDefault();
91
- c.handleConfigToggle(item, c._expandedItems);
91
+ c.handleConfigToggle(item);
92
92
  return;
93
93
  }
94
94
  c.handleConfigItemClick(item.value, item.href);
@@ -26,12 +26,13 @@ export declare class AppShellComponent implements IElementRef, OnCreate, OnDestr
26
26
  'sidebar-collapsed': boolean;
27
27
  /** Whether the header is fixed/sticky */
28
28
  'header-fixed': boolean;
29
- /** Internal: tracks if mobile drawer is open */
30
- _mobileOpen: boolean;
29
+ /** Whether the viewport is mobile-sized (<768px) */
30
+ mobile: boolean;
31
+ /** Whether the mobile sidebar drawer is open */
32
+ mobileOpen: boolean;
31
33
  /** Media query for responsive behavior */
32
34
  private _mediaQuery;
33
35
  private readonly _handleMediaChange;
34
- get isMobile(): boolean;
35
36
  onCreate(): void;
36
37
  onDestroy(): void;
37
38
  /** Toggle mobile sidebar drawer */
@@ -1 +1 @@
1
- {"version":3,"file":"app-shell.component.d.ts","sourceRoot":"","sources":["../../../../src/components/sections/app-shell/app-shell.component.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAIzE,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,OAAO,CAAC;AAE/C;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAMa,iBAAkB,YAAW,WAAW,EAAE,QAAQ,EAAE,SAAS;IACzE,UAAU,EAAG,WAAW,CAAC;IAEzB,iDAAiD;IACjD,kBAAkB,EAAE,eAAe,CAAU;IAE7C,uCAAuC;IACvC,mBAAmB,UAAS;IAE5B,yCAAyC;IACzC,cAAc,UAAS;IAEvB,gDAAgD;IAChD,WAAW,UAAS;IAEpB,0CAA0C;IAC1C,OAAO,CAAC,WAAW,CAA+B;IAClD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAiC;IAEpE,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,QAAQ,IAAI,IAAI;IAUhB,SAAS,IAAI,IAAI;IAIjB,mCAAmC;IACnC,mBAAmB,QAAO,IAAI,CAE5B;IAEF,2BAA2B;IAC3B,kBAAkB,QAAO,IAAI,CAE3B;IAEF,OAAO,CAAC,aAAa;CAMrB"}
1
+ {"version":3,"file":"app-shell.component.d.ts","sourceRoot":"","sources":["../../../../src/components/sections/app-shell/app-shell.component.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAIzE,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,OAAO,CAAC;AAE/C;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAMa,iBAAkB,YAAW,WAAW,EAAE,QAAQ,EAAE,SAAS;IACzE,UAAU,EAAG,WAAW,CAAC;IAEzB,iDAAiD;IACjD,kBAAkB,EAAE,eAAe,CAAU;IAE7C,uCAAuC;IACvC,mBAAmB,UAAS;IAE5B,yCAAyC;IACzC,cAAc,UAAS;IAEvB,oDAAoD;IACpD,MAAM,UAAS;IAEf,gDAAgD;IAChD,UAAU,UAAS;IAEnB,0CAA0C;IAC1C,OAAO,CAAC,WAAW,CAA+B;IAClD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAiC;IAEpE,QAAQ,IAAI,IAAI;IAMhB,SAAS,IAAI,IAAI;IAIjB,mCAAmC;IACnC,mBAAmB,QAAO,IAAI,CAE5B;IAEF,2BAA2B;IAC3B,kBAAkB,QAAO,IAAI,CAE3B;IAEF,OAAO,CAAC,aAAa;CAOrB"}
@@ -33,38 +33,35 @@ let AppShellComponent = class AppShellComponent {
33
33
  this['sidebar-collapsed'] = false;
34
34
  /** Whether the header is fixed/sticky */
35
35
  this['header-fixed'] = false;
36
- /** Internal: tracks if mobile drawer is open */
37
- this._mobileOpen = false;
36
+ /** Whether the viewport is mobile-sized (<768px) */
37
+ this.mobile = false;
38
+ /** Whether the mobile sidebar drawer is open */
39
+ this.mobileOpen = false;
38
40
  /** Media query for responsive behavior */
39
41
  this._mediaQuery = null;
40
42
  this._handleMediaChange = this.onMediaChange.bind(this);
41
43
  /** Toggle mobile sidebar drawer */
42
44
  this.toggleMobileSidebar = () => {
43
- this._mobileOpen = !this._mobileOpen;
45
+ this.mobileOpen = !this.mobileOpen;
44
46
  };
45
47
  /** Close mobile sidebar */
46
48
  this.closeMobileSidebar = () => {
47
- this._mobileOpen = false;
49
+ this.mobileOpen = false;
48
50
  };
49
51
  }
50
- get isMobile() {
51
- return this._mediaQuery?.matches === false;
52
- }
53
52
  onCreate() {
54
53
  this._mediaQuery = window.matchMedia('(min-width: 768px)');
55
54
  this._mediaQuery.addEventListener('change', this._handleMediaChange);
56
- // Close mobile drawer on initial desktop
57
- if (!this.isMobile) {
58
- this._mobileOpen = false;
59
- }
55
+ this.mobile = !this._mediaQuery.matches;
60
56
  }
61
57
  onDestroy() {
62
58
  this._mediaQuery?.removeEventListener('change', this._handleMediaChange);
63
59
  }
64
60
  onMediaChange(event) {
61
+ this.mobile = !event.matches;
65
62
  if (event.matches) {
66
63
  // Switched to desktop: close mobile drawer
67
- this._mobileOpen = false;
64
+ this.mobileOpen = false;
68
65
  }
69
66
  }
70
67
  };
@@ -3,8 +3,8 @@ export function appShellTemplate(c) {
3
3
  const sidebarRight = c['sidebar-position'] === 'right';
4
4
  const collapsed = c['sidebar-collapsed'];
5
5
  const headerFixed = c['header-fixed'];
6
- const mobileOpen = c._mobileOpen;
7
- const isMobile = c.isMobile;
6
+ const mobileOpen = c.mobileOpen;
7
+ const isMobile = c.mobile;
8
8
  return html `
9
9
  <div
10
10
  class=${classMap({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@melodicdev/components",
3
- "version": "1.0.3",
3
+ "version": "1.0.5",
4
4
  "description": "Themeable UI component library built on the Melodic Framework",
5
5
  "license": "MIT",
6
6
  "author": "Melodic Development",
@@ -242,6 +242,8 @@
242
242
  "build": "tsc -p tsconfig.build.json && node scripts/generate-css.mjs && vite build --config vite.config.bundle.ts --mode development && vite build --config vite.config.bundle.ts --mode production",
243
243
  "build:watch": "tsc -p tsconfig.build.json --watch",
244
244
  "prepublishOnly": "npm run build",
245
+ "test": "vitest run",
246
+ "test:watch": "vitest",
245
247
  "docs": "vite --config vite.config.docs.ts",
246
248
  "docs:build": "vite build --config vite.config.docs.ts"
247
249
  },