@kubex/zinc 1.1.131 → 1.1.132

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.
@@ -23751,19 +23751,6 @@
23751
23751
  "module": "components/panel/panel.js"
23752
23752
  }
23753
23753
  },
23754
- {
23755
- "kind": "field",
23756
- "name": "bodySlot",
23757
- "type": {
23758
- "text": "HTMLSlotElement | null"
23759
- },
23760
- "privacy": "private",
23761
- "readonly": true,
23762
- "inheritedFrom": {
23763
- "name": "ZnPanel",
23764
- "module": "components/panel/panel.js"
23765
- }
23766
- },
23767
23754
  {
23768
23755
  "kind": "method",
23769
23756
  "name": "observeBodyContent",
@@ -31139,15 +31126,6 @@
31139
31126
  "privacy": "private",
31140
31127
  "default": "null"
31141
31128
  },
31142
- {
31143
- "kind": "field",
31144
- "name": "bodySlot",
31145
- "type": {
31146
- "text": "HTMLSlotElement | null"
31147
- },
31148
- "privacy": "private",
31149
- "readonly": true
31150
- },
31151
31129
  {
31152
31130
  "kind": "method",
31153
31131
  "name": "observeBodyContent",
@@ -51559,19 +51537,6 @@
51559
51537
  "module": "components/panel/panel.js"
51560
51538
  }
51561
51539
  },
51562
- {
51563
- "kind": "field",
51564
- "name": "bodySlot",
51565
- "type": {
51566
- "text": "HTMLSlotElement | null"
51567
- },
51568
- "privacy": "private",
51569
- "readonly": true,
51570
- "inheritedFrom": {
51571
- "name": "ZnPanel",
51572
- "module": "components/panel/panel.js"
51573
- }
51574
- },
51575
51540
  {
51576
51541
  "kind": "method",
51577
51542
  "name": "observeBodyContent",
@@ -52861,7 +52826,7 @@
52861
52826
  "package": {
52862
52827
  "name": "@kubex/zinc",
52863
52828
  "description": "A collection of web components for building web applications based off of @shoelace-style/Shoelace",
52864
- "version": "1.1.131",
52829
+ "version": "1.1.132",
52865
52830
  "author": "",
52866
52831
  "license": "MIT"
52867
52832
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://raw.githubusercontent.com/JetBrains/web-types/master/schema/web-types.json",
3
3
  "name": "@kubex/zinc",
4
- "version": "1.1.131",
4
+ "version": "1.1.132",
5
5
  "description-markup": "markdown",
6
6
  "contributions": {
7
7
  "html": {
package/dist/zn.d.ts CHANGED
@@ -3872,7 +3872,6 @@ declare module "components/panel/panel.component" {
3872
3872
  protected firstUpdated(_changedProperties: PropertyValues): void;
3873
3873
  connectedCallback(): void;
3874
3874
  disconnectedCallback(): void;
3875
- private get bodySlot();
3876
3875
  private observeBodyContent;
3877
3876
  private measureBodyContent;
3878
3877
  protected render(): unknown;
package/dist/zn.min.js CHANGED
@@ -1163,7 +1163,7 @@ import{a as Fn,b as h3,c as _r,d as c,e as V}from"./chunks/zn.UBLZO6CI.js";var K
1163
1163
  aria-label="hover-container">
1164
1164
  <slot name="content">${this.content}</slot>
1165
1165
  </div>
1166
- </zn-popup>`}};It.styles=z(_0),c([F("slot:not([name])")],It.prototype,"defaultSlot",2),c([F(".hover-container__body")],It.prototype,"body",2),c([F("zn-popup")],It.prototype,"popup",2),c([d()],It.prototype,"content",2),c([d()],It.prototype,"placement",2),c([d({type:Boolean,reflect:!0})],It.prototype,"disabled",2),c([d({type:Number})],It.prototype,"distance",2),c([d({type:Boolean,reflect:!0})],It.prototype,"open",2),c([d({type:Number})],It.prototype,"skidding",2),c([d()],It.prototype,"trigger",2),c([d({type:Boolean})],It.prototype,"hoist",2),c([K("open",{waitUntilFirstUpdate:!0})],It.prototype,"handleOpenChange",1),c([K(["content","distance","hoist","placement","skidding"])],It.prototype,"handleOptionsChange",1),c([K("disabled")],It.prototype,"handleDisabledChange",1);var Ju=It;It.define("zn-hover-container");var k0=_`@keyframes rotate-gradient{from{--rotate:0deg}to{--rotate:360deg}}:host{text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-transform:none}*,*::before,*::after{box-sizing:border-box;border-width:0;border-style:solid;border-color:rgb(var(--zn-border-color))}[hidden]{display:none !important}.width-container,.form-container,.wide-form-container{height:100%;width:100%;margin:var(--zn-default-margin,0 auto)}.width-container{max-width:var(--zn-container)}.form-container{max-width:var(--zn-container-ph)}.wide-form-container{max-width:var(--zn-container-lg)}:host ::-webkit-scrollbar{width:5px;height:5px}:host{}:host ::-webkit-scrollbar-track{background:transparent}:host{}:host ::-webkit-scrollbar-thumb{background:rgba(var(--inverse-base),0.2);border-radius:5px}:host{}:host ::-webkit-scrollbar-thumb:hover{background:rgba(var(--inverse-base),0.6)}:host{flex-grow:1;overflow:visible;display:flex;max-width:100%;z-index:1;position:relative;min-width:var(--zn-spacing-small-panel);flex-basis:var(--zn-panel-basis);--zn-page-surface-background:var(--zn-panel);--zn-active-nav-background:var(--zn-panel)}.panel{position:relative;border:1px solid rgb(var(--zn-border-color));display:flex;border-radius:var(--zn-border-radius);flex-direction:column;flex-grow:1;flex-basis:var(--zn-spacing-small-panel);width:100%;background-color:rgba(var(--zn-panel),var(--zn-panel-opacity))}.panel__inner{overflow:hidden;display:flex;border-radius:var(--zn-border-radius);flex-direction:column;flex-grow:1}.panel__content{display:flex;flex-grow:1;overflow:hidden;position:relative}.panel__header{padding:var(--zn-panel-header-padding,var(--zn-base-gap))}.panel__header::part(base){border-bottom:0;overflow:visible}.panel__header--inline{border-bottom:0}.panel__header--underline{border-bottom:1px solid rgb(var(--zn-border-color))}.panel__header::part(content){padding:0}.panel__body{display:flex;flex-direction:column;overflow-y:auto;flex-grow:1;padding:var(--zn-base-gap)}.panel__body>:not([hidden])~:not([hidden]){border:1px solid rgb(var(--zn-border-color))}.panel__footer{font-size:var(--zn-font-size-small);display:block;padding:var(--zn-panel-footer-padding,var(--zn-spacing-small) var(--zn-base-gap));background:rgb(var(--zn-body));border-bottom-left-radius:var(--zn-border-radius);border-bottom-right-radius:var(--zn-border-radius)}.panel--tabbed .panel__body{padding:0}.panel--transparent{background-color:transparent;border:none}.panel--transparent:before{display:none}.panel:not(.panel--flush,.panel--flush-x,.panel--flush-y) ::slotted(zn-sp){--zn-sp-padding:0 !important}.panel.panel--borderless-header:not(.panel--flush,.panel--flush-y) .panel__body{padding-top:0}.panel--empty .panel__body{padding:0}.panel--flush .panel__body{padding:0}.panel--flush-x .panel__body{padding-inline:0}.panel--flush-y .panel__body{padding-block:0}.panel--flush-footer .panel__footer{padding:0}.panel--transparent .panel__header{padding-left:0;padding-right:0}.panel--cosmic{border:1px solid transparent}.panel--cosmic:before{content:"";z-index:-1;position:absolute;top:-2px;left:-2px;height:calc(100% + 4px);width:calc(100% + 4px);filter:blur(var(--zn-blur,1px));opacity:0.9;border-radius:var(--zn-border-radius);background-image:conic-gradient(from var(--rotate) at 50% 50%,#71d9ff 0%,#a100ff 22%,#71d9ff 44%,#ff00ce 74%,#71d9ff 94%);animation:rotate-gradient 6s linear infinite}.panel--shadow{box-shadow:0 6px 20px 10px rgba(0,0,0,0.25)}`;var Ze=class extends k{constructor(){super(...arguments);this.hasSlotController=new Y(this,"[default]","actions","footer");this.bodyEmpty=!1;this.resizeObserver=null}firstUpdated(t){if(super.firstUpdated(t),this.observeBodyContent(),this.basis&&this.style.setProperty("--zn-panel-basis",this.basis.toString()+"px"),!this.tabbed){let r=this.querySelector("zn-tabs");if(r){r.setAttribute("flush-x","");let n=this.shadowRoot?.querySelector(".body");n&&n.classList.toggle("ntp",!0)}}}connectedCallback(){if(super.connectedCallback(),this.hasUpdated&&this.observeBodyContent(),window.CSS.registerProperty)try{window.CSS.registerProperty({inherits:!1,initialValue:"0deg",name:"--rotate",syntax:"<angle>"})}catch{}}disconnectedCallback(){super.disconnectedCallback(),this.resizeObserver?.disconnect(),this.resizeObserver=null}get bodySlot(){return this.renderRoot?.querySelector(".panel__body > slot")??null}observeBodyContent(){let t=this.bodySlot;t&&(this.resizeObserver??(this.resizeObserver=new ResizeObserver(()=>this.measureBodyContent())),this.resizeObserver.disconnect(),t.assignedElements({flatten:!0}).forEach(r=>this.resizeObserver.observe(r)),this.measureBodyContent())}measureBodyContent(){let t=this.bodySlot?.assignedNodes({flatten:!0})??[];this.bodyEmpty=!t.some(r=>r.nodeType===Node.TEXT_NODE?r.textContent.trim()!=="":r.getBoundingClientRect().height>0)}render(){let t=this.hasSlotController.test("actions"),r=this.hasSlotController.test("footer"),n=this.caption||t,a=!this.hasSlotController.test("[default]")||this.bodyEmpty,s=this.flush||this.tabbed||this.flushY,l=!this.headerBorderless&&!(this.transparent&&s)&&!a;return u`
1166
+ </zn-popup>`}};It.styles=z(_0),c([F("slot:not([name])")],It.prototype,"defaultSlot",2),c([F(".hover-container__body")],It.prototype,"body",2),c([F("zn-popup")],It.prototype,"popup",2),c([d()],It.prototype,"content",2),c([d()],It.prototype,"placement",2),c([d({type:Boolean,reflect:!0})],It.prototype,"disabled",2),c([d({type:Number})],It.prototype,"distance",2),c([d({type:Boolean,reflect:!0})],It.prototype,"open",2),c([d({type:Number})],It.prototype,"skidding",2),c([d()],It.prototype,"trigger",2),c([d({type:Boolean})],It.prototype,"hoist",2),c([K("open",{waitUntilFirstUpdate:!0})],It.prototype,"handleOpenChange",1),c([K(["content","distance","hoist","placement","skidding"])],It.prototype,"handleOptionsChange",1),c([K("disabled")],It.prototype,"handleDisabledChange",1);var Ju=It;It.define("zn-hover-container");var k0=_`@keyframes rotate-gradient{from{--rotate:0deg}to{--rotate:360deg}}:host{text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-transform:none}*,*::before,*::after{box-sizing:border-box;border-width:0;border-style:solid;border-color:rgb(var(--zn-border-color))}[hidden]{display:none !important}.width-container,.form-container,.wide-form-container{height:100%;width:100%;margin:var(--zn-default-margin,0 auto)}.width-container{max-width:var(--zn-container)}.form-container{max-width:var(--zn-container-ph)}.wide-form-container{max-width:var(--zn-container-lg)}:host ::-webkit-scrollbar{width:5px;height:5px}:host{}:host ::-webkit-scrollbar-track{background:transparent}:host{}:host ::-webkit-scrollbar-thumb{background:rgba(var(--inverse-base),0.2);border-radius:5px}:host{}:host ::-webkit-scrollbar-thumb:hover{background:rgba(var(--inverse-base),0.6)}:host{flex-grow:1;overflow:visible;display:flex;max-width:100%;z-index:1;position:relative;min-width:var(--zn-spacing-small-panel);flex-basis:var(--zn-panel-basis);--zn-page-surface-background:var(--zn-panel);--zn-active-nav-background:var(--zn-panel)}.panel{position:relative;border:1px solid rgb(var(--zn-border-color));display:flex;border-radius:var(--zn-border-radius);flex-direction:column;flex-grow:1;flex-basis:var(--zn-spacing-small-panel);width:100%;background-color:rgba(var(--zn-panel),var(--zn-panel-opacity))}.panel__inner{overflow:hidden;display:flex;border-radius:var(--zn-border-radius);flex-direction:column;flex-grow:1}.panel__content{display:flex;flex-grow:1;overflow:hidden;position:relative}.panel__header{padding:var(--zn-panel-header-padding,var(--zn-base-gap))}.panel__header::part(base){border-bottom:0;overflow:visible}.panel__header--inline{border-bottom:0}.panel__header--underline{border-bottom:1px solid rgb(var(--zn-border-color))}.panel__header::part(content){padding:0}.panel__body{display:flex;flex-direction:column;overflow-y:auto;flex-grow:1;padding:var(--zn-base-gap)}.panel__body>:not([hidden])~:not([hidden]){border:1px solid rgb(var(--zn-border-color))}.panel__footer{font-size:var(--zn-font-size-small);display:block;padding:var(--zn-panel-footer-padding,var(--zn-spacing-small) var(--zn-base-gap));background:rgb(var(--zn-body));border-bottom-left-radius:var(--zn-border-radius);border-bottom-right-radius:var(--zn-border-radius)}.panel--tabbed .panel__body{padding:0}.panel--transparent{background-color:transparent;border:none}.panel--transparent:before{display:none}.panel:not(.panel--flush,.panel--flush-x,.panel--flush-y) ::slotted(zn-sp){--zn-sp-padding:0 !important}.panel.panel--borderless-header:not(.panel--flush,.panel--flush-y) .panel__body{padding-top:0}.panel--empty .panel__body{padding:0}.panel--flush .panel__body{padding:0}.panel--flush-x .panel__body{padding-inline:0}.panel--flush-y .panel__body{padding-block:0}.panel--flush-footer .panel__footer{padding:0}.panel--transparent .panel__header{padding-left:0;padding-right:0}.panel--cosmic{border:1px solid transparent}.panel--cosmic:before{content:"";z-index:-1;position:absolute;top:-2px;left:-2px;height:calc(100% + 4px);width:calc(100% + 4px);filter:blur(var(--zn-blur,1px));opacity:0.9;border-radius:var(--zn-border-radius);background-image:conic-gradient(from var(--rotate) at 50% 50%,#71d9ff 0%,#a100ff 22%,#71d9ff 44%,#ff00ce 74%,#71d9ff 94%);animation:rotate-gradient 6s linear infinite}.panel--shadow{box-shadow:0 6px 20px 10px rgba(0,0,0,0.25)}`;var Ze=class extends k{constructor(){super(...arguments);this.hasSlotController=new Y(this,"[default]","actions","footer");this.bodyEmpty=!1;this.resizeObserver=null}firstUpdated(t){if(super.firstUpdated(t),this.observeBodyContent(),this.basis&&this.style.setProperty("--zn-panel-basis",this.basis.toString()+"px"),!this.tabbed){let r=this.querySelector("zn-tabs");if(r){r.setAttribute("flush-x","");let n=this.shadowRoot?.querySelector(".body");n&&n.classList.toggle("ntp",!0)}}}connectedCallback(){if(super.connectedCallback(),this.hasUpdated&&this.observeBodyContent(),window.CSS.registerProperty)try{window.CSS.registerProperty({inherits:!1,initialValue:"0deg",name:"--rotate",syntax:"<angle>"})}catch{}}disconnectedCallback(){super.disconnectedCallback(),this.resizeObserver?.disconnect(),this.resizeObserver=null}observeBodyContent(){let t=this.renderRoot?.querySelector(".panel__body");t&&(this.resizeObserver??(this.resizeObserver=new ResizeObserver(()=>this.measureBodyContent())),this.resizeObserver.disconnect(),this.resizeObserver.observe(t),this.measureBodyContent())}measureBodyContent(){let t=this.renderRoot?.querySelector(".panel__body");if(!t)return;let r=getComputedStyle(t),n=parseFloat(r.paddingTop)+parseFloat(r.paddingBottom);this.bodyEmpty=t.scrollHeight-n<=0}render(){let t=this.hasSlotController.test("actions"),r=this.hasSlotController.test("footer"),n=this.caption||t,a=!this.hasSlotController.test("[default]")||this.bodyEmpty,s=this.flush||this.tabbed||this.flushY,l=!this.headerBorderless&&!(this.transparent&&s)&&!a;return u`
1167
1167
  <div class="${M({panel:!0,"panel--flush":this.flush||this.tabbed,"panel--flush-x":this.flushX,"panel--flush-y":this.flushY,"panel--flush-footer":this.flushFooter,"panel--tabbed":this.tabbed,"panel--transparent":this.transparent,"panel--has-actions":t,"panel--has-footer":r,"panel--empty":a,"panel--has-header":n,"panel--borderless-header":this.headerBorderless,"panel--cosmic":this.cosmic,"panel--shadow":this.shadow})}">
1168
1168
 
1169
1169
  <div class="panel__inner">
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kubex/zinc",
3
- "version": "1.1.131",
3
+ "version": "1.1.132",
4
4
  "description": "A collection of web components for building web applications based off of @shoelace-style/Shoelace",
5
5
  "keywords": [
6
6
  "web components",
@@ -92,27 +92,25 @@ export default class ZnPanel extends ZincElement {
92
92
  this.resizeObserver = null;
93
93
  }
94
94
 
95
- private get bodySlot(): HTMLSlotElement | null {
96
- return this.renderRoot?.querySelector('.panel__body > slot') ?? null;
97
- }
98
-
99
- // Slotted content can grow without the body's own box changing, so the observers go on the
100
- // slotted elements rather than the body.
101
95
  private observeBodyContent() {
102
- const slot = this.bodySlot;
103
- if (!slot) return;
96
+ const body = this.renderRoot?.querySelector('.panel__body');
97
+ if (!body) return;
104
98
 
105
99
  this.resizeObserver ??= new ResizeObserver(() => this.measureBodyContent());
106
100
  this.resizeObserver.disconnect();
107
- slot.assignedElements({flatten: true}).forEach(el => this.resizeObserver!.observe(el));
101
+ this.resizeObserver.observe(body);
108
102
  this.measureBodyContent();
109
103
  }
110
104
 
105
+ // Measured on the body, not on the slotted elements: `display: contents` hosts such as zn-stat
106
+ // render content but have no box of their own to read or observe.
111
107
  private measureBodyContent() {
112
- const nodes = this.bodySlot?.assignedNodes({flatten: true}) ?? [];
113
- this.bodyEmpty = !nodes.some(node => node.nodeType === Node.TEXT_NODE
114
- ? node.textContent!.trim() !== ''
115
- : (node as Element).getBoundingClientRect().height > 0);
108
+ const body = this.renderRoot?.querySelector('.panel__body');
109
+ if (!body) return;
110
+
111
+ const style = getComputedStyle(body);
112
+ const padding = parseFloat(style.paddingTop) + parseFloat(style.paddingBottom);
113
+ this.bodyEmpty = body.scrollHeight - padding <= 0;
116
114
  }
117
115
 
118
116
  protected render(): unknown {
@@ -1,5 +1,5 @@
1
1
  import '../../../dist/zn.min.js';
2
- import { expect, fixture, html, waitUntil } from '@open-wc/testing';
2
+ import { aTimeout, expect, fixture, html, waitUntil } from '@open-wc/testing';
3
3
 
4
4
  describe('<zn-panel>', () => {
5
5
  it('should render a component', async () => {
@@ -41,6 +41,20 @@ describe('<zn-panel>', () => {
41
41
  expect(el.shadowRoot!.querySelector('.panel')!.classList.contains('panel--empty')).to.be.true;
42
42
  });
43
43
 
44
+ it('keeps the padded body when slotted content has no box of its own', async () => {
45
+ const el = await fixture(html` <zn-panel caption="Example">
46
+ <div style="display: contents">
47
+ <div style="height: 20px"></div>
48
+ </div>
49
+ </zn-panel> `);
50
+ const header = el.shadowRoot!.querySelector('.panel__header')!;
51
+
52
+ await aTimeout(50);
53
+
54
+ expect(header.classList.contains('panel__header--underline')).to.be.true;
55
+ expect(el.shadowRoot!.querySelector('.panel')!.classList.contains('panel--empty')).to.be.false;
56
+ });
57
+
44
58
  it('restores the header underline when slotted content gains height', async () => {
45
59
  const el = await fixture(html` <zn-panel caption="Example">
46
60
  <div id="wrapper"></div>