@logosphere-ui/core 0.0.0-alpha.33 → 0.0.0-alpha.38

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 (47) hide show
  1. package/AGENTS.md +7 -2
  2. package/dist/AGENTS.md +7 -2
  3. package/dist/atoms/Button/button.d.ts +5 -3
  4. package/dist/atoms/Checkbox/checkbox.d.ts +2 -1
  5. package/dist/atoms/Slider/index.d.ts +1 -0
  6. package/dist/atoms/Slider/slider.d.ts +54 -0
  7. package/dist/{chatbot-p4CmxSdZ.js → chatbot-Cr6iOO7s.js} +1 -1
  8. package/dist/{chatbot-8etAVHNx.cjs → chatbot-Dl6P98Jq.cjs} +1 -1
  9. package/dist/chatbot.cjs +1 -1
  10. package/dist/chatbot.js +1 -1
  11. package/dist/checkbox-CX0LgsWP.js +148 -0
  12. package/dist/checkbox-DpbKHANK.cjs +53 -0
  13. package/dist/checkbox.cjs +1 -1
  14. package/dist/checkbox.js +1 -1
  15. package/dist/{combobox-CTqEZUg6.js → combobox-CFF30L-n.js} +67 -61
  16. package/dist/{combobox-BV4AKTqp.cjs → combobox-s7NFPAd3.cjs} +3 -2
  17. package/dist/combobox.cjs +1 -1
  18. package/dist/combobox.js +1 -1
  19. package/dist/index.cjs +291 -1
  20. package/dist/index.d.ts +6 -0
  21. package/dist/index.js +906 -49
  22. package/dist/index.umd.js +471 -163
  23. package/dist/molecules/Accordion/accordion.d.ts +42 -0
  24. package/dist/molecules/Accordion/index.d.ts +2 -0
  25. package/dist/molecules/Collapse/collapse.d.ts +42 -0
  26. package/dist/molecules/Collapse/index.d.ts +2 -0
  27. package/dist/molecules/InputGroup/index.d.ts +1 -0
  28. package/dist/molecules/InputGroup/input-group.d.ts +40 -0
  29. package/dist/molecules/SplitButton/index.d.ts +2 -0
  30. package/dist/molecules/SplitButton/split-button.d.ts +53 -0
  31. package/dist/molecules/Stepper/index.d.ts +2 -0
  32. package/dist/molecules/Stepper/stepper.d.ts +34 -0
  33. package/dist/organisms/Tab/tab.d.ts +13 -1
  34. package/dist/{pagination-BLNrwUSO.js → pagination-DG56TV5n.js} +1 -1
  35. package/dist/{pagination-AclB9qi1.cjs → pagination-HyX0EAZr.cjs} +1 -1
  36. package/dist/pagination.cjs +1 -1
  37. package/dist/pagination.js +1 -1
  38. package/dist/shared/types/button.types.d.ts +7 -0
  39. package/dist/tab-CDMcFHvP.cjs +41 -0
  40. package/dist/tab-CuBCFGoO.js +204 -0
  41. package/dist/tab.cjs +1 -1
  42. package/dist/tab.js +1 -1
  43. package/package.json +31 -1
  44. package/dist/checkbox-CdDTRdKV.cjs +0 -37
  45. package/dist/checkbox-g6kl2jGR.js +0 -119
  46. package/dist/tab-BmrITzOL.cjs +0 -40
  47. package/dist/tab-Ca_OyNqQ.js +0 -176
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@logosphere-ui/core",
3
- "version": "0.0.0-alpha.33",
3
+ "version": "0.0.0-alpha.38",
4
4
  "description": "A modern, framework-agnostic UI component library built with Lit and Web Components",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -91,6 +91,36 @@
91
91
  "import": "./dist/combobox.js",
92
92
  "require": "./dist/combobox.cjs"
93
93
  },
94
+ "./slider": {
95
+ "types": "./dist/atoms/Slider/index.d.ts",
96
+ "import": "./dist/slider.js",
97
+ "require": "./dist/slider.cjs"
98
+ },
99
+ "./stepper": {
100
+ "types": "./dist/molecules/Stepper/index.d.ts",
101
+ "import": "./dist/stepper.js",
102
+ "require": "./dist/stepper.cjs"
103
+ },
104
+ "./split-button": {
105
+ "types": "./dist/molecules/SplitButton/index.d.ts",
106
+ "import": "./dist/split-button.js",
107
+ "require": "./dist/split-button.cjs"
108
+ },
109
+ "./collapse": {
110
+ "types": "./dist/molecules/Collapse/index.d.ts",
111
+ "import": "./dist/collapse.js",
112
+ "require": "./dist/collapse.cjs"
113
+ },
114
+ "./input-group": {
115
+ "types": "./dist/molecules/InputGroup/index.d.ts",
116
+ "import": "./dist/input-group.js",
117
+ "require": "./dist/input-group.cjs"
118
+ },
119
+ "./accordion": {
120
+ "types": "./dist/molecules/Accordion/index.d.ts",
121
+ "import": "./dist/accordion.js",
122
+ "require": "./dist/accordion.cjs"
123
+ },
94
124
  "./textarea": {
95
125
  "types": "./dist/molecules/Textarea/index.d.ts",
96
126
  "import": "./dist/textarea.js",
@@ -1,37 +0,0 @@
1
- "use strict";const t=require("lit"),r=require("lit/decorators.js"),h=require("lit/directives/ref.js"),d='.checkbox-wrapper{display:inline-flex;align-items:center;gap:var(--spacing-2);cursor:pointer;-webkit-user-select:none;user-select:none;font-family:var(--font-family-base)}.checkbox-wrapper--disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.checkbox-input{position:absolute;opacity:0;width:0;height:0;pointer-events:none}.checkbox-control{width:16px;height:16px;flex-shrink:0;position:relative;border:1.5px solid var(--color-border);border-radius:var(--radius-sm);background-color:var(--color-body-bg);transition:background-color var(--transition-speed-fast) var(--transition-timing),border-color var(--transition-speed-fast) var(--transition-timing)}.checkbox-control--checked{background-color:var(--color-primary);border-color:var(--color-primary)}.checkbox-control--checked:after{content:"";position:absolute;top:50%;left:50%;width:9px;height:5px;border-left:2px solid #ffffff;border-bottom:2px solid #ffffff;transform:translate(-50%,-65%) rotate(-45deg)}.checkbox-control--indeterminate{background-color:var(--color-primary);border-color:var(--color-primary)}.checkbox-control--indeterminate:after{content:"";position:absolute;top:50%;left:50%;width:8px;height:2px;background-color:#fff;border-radius:1px;transform:translate(-50%,-50%)}.checkbox-label{font-size:var(--font-size-sm);line-height:var(--line-height-normal);color:var(--color-body-text)}.switch-wrapper{display:inline-flex;align-items:center;gap:var(--spacing-2);cursor:pointer;-webkit-user-select:none;user-select:none;font-family:var(--font-family-base)}.switch-wrapper--disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.switch-track{width:36px;height:20px;flex-shrink:0;border-radius:var(--radius-full);background-color:var(--color-border);position:relative;transition:background-color var(--transition-speed-fast) var(--transition-timing)}.switch-track--checked{background-color:var(--color-primary)}.switch-thumb{position:absolute;top:2px;left:2px;width:16px;height:16px;border-radius:var(--radius-full);background-color:#fff;box-shadow:var(--shadow-xs);transition:transform var(--transition-speed-fast) var(--transition-timing)}.switch-track--checked .switch-thumb{transform:translate(16px)}';var p=Object.defineProperty,b=Object.getOwnPropertyDescriptor,i=(a,e,s,n)=>{for(var o=n>1?void 0:n?b(e,s):e,c=a.length-1,l;c>=0;c--)(l=a[c])&&(o=(n?l(e,s,o):l(o))||o);return n&&o&&p(e,s,o),o};exports.Checkbox=class extends t.LitElement{constructor(){super(...arguments),this.label="",this.value="",this.checked=!1,this.type="checkbox",this.disabled=!1,this.indeterminate=!1,this.internalChecked=!1}connectedCallback(){super.connectedCallback(),this.internalChecked=this.checked}firstUpdated(){this.setIndeterminate()}updated(e){e.has("indeterminate")&&this.setIndeterminate(),e.has("checked")&&(this.internalChecked=this.checked)}setIndeterminate(){this.inputElement&&(this.inputElement.indeterminate=this.indeterminate)}toggleChecked(){this.disabled||(this.indeterminate?(this.indeterminate=!1,this.internalChecked=!0):this.internalChecked=!this.internalChecked,this.dispatchEvent(new CustomEvent("lgsChange",{detail:{checked:this.internalChecked,indeterminate:this.indeterminate,value:this.value},bubbles:!0,composed:!0})))}renderCheckbox(){const e=["checkbox-control",this.internalChecked?"checkbox-control--checked":"",this.indeterminate?"checkbox-control--indeterminate":""].filter(Boolean).join(" ");return t.html`
2
- <div
3
- class="checkbox-wrapper ${this.disabled?"checkbox-wrapper--disabled":""}"
4
- @click=${this.toggleChecked}
5
- >
6
- <input
7
- type="checkbox"
8
- class="checkbox-input"
9
- .checked=${this.internalChecked}
10
- ?disabled=${this.disabled}
11
- .value=${this.value}
12
- ${h.ref(s=>this.inputElement=s)}
13
- />
14
- <span class="${e}"></span>
15
- ${this.label?t.html`<span class="checkbox-label">${this.label}</span>`:t.nothing}
16
- </div>
17
- `}renderSwitch(){return t.html`
18
- <div
19
- class="switch-wrapper ${this.disabled?"switch-wrapper--disabled":""}"
20
- @click=${this.toggleChecked}
21
- >
22
- <input
23
- type="checkbox"
24
- class="checkbox-input"
25
- .checked=${this.internalChecked}
26
- ?disabled=${this.disabled}
27
- .value=${this.value}
28
- ${h.ref(e=>this.inputElement=e)}
29
- />
30
- <div class="switch-track ${this.internalChecked?"switch-track--checked":""}">
31
- <div class="switch-thumb"></div>
32
- </div>
33
- ${this.label?t.html`<span class="checkbox-label">${this.label}</span>`:t.nothing}
34
- </div>
35
- `}render(){return this.type==="switch"?this.renderSwitch():this.renderCheckbox()}};exports.Checkbox.styles=[t.css`
36
- ${t.unsafeCSS(d)}
37
- `];i([r.property({type:String})],exports.Checkbox.prototype,"label",2);i([r.property({type:String})],exports.Checkbox.prototype,"value",2);i([r.property({type:Boolean})],exports.Checkbox.prototype,"checked",2);i([r.property({type:String})],exports.Checkbox.prototype,"type",2);i([r.property({type:Boolean})],exports.Checkbox.prototype,"disabled",2);i([r.property({type:Boolean})],exports.Checkbox.prototype,"indeterminate",2);i([r.state()],exports.Checkbox.prototype,"internalChecked",2);exports.Checkbox=i([r.customElement("logosphere-checkbox")],exports.Checkbox);
@@ -1,119 +0,0 @@
1
- import { unsafeCSS as b, css as k, LitElement as f, nothing as d, html as a } from "lit";
2
- import { property as n, state as u, customElement as m } from "lit/decorators.js";
3
- import { ref as p } from "lit/directives/ref.js";
4
- const v = '.checkbox-wrapper{display:inline-flex;align-items:center;gap:var(--spacing-2);cursor:pointer;-webkit-user-select:none;user-select:none;font-family:var(--font-family-base)}.checkbox-wrapper--disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.checkbox-input{position:absolute;opacity:0;width:0;height:0;pointer-events:none}.checkbox-control{width:16px;height:16px;flex-shrink:0;position:relative;border:1.5px solid var(--color-border);border-radius:var(--radius-sm);background-color:var(--color-body-bg);transition:background-color var(--transition-speed-fast) var(--transition-timing),border-color var(--transition-speed-fast) var(--transition-timing)}.checkbox-control--checked{background-color:var(--color-primary);border-color:var(--color-primary)}.checkbox-control--checked:after{content:"";position:absolute;top:50%;left:50%;width:9px;height:5px;border-left:2px solid #ffffff;border-bottom:2px solid #ffffff;transform:translate(-50%,-65%) rotate(-45deg)}.checkbox-control--indeterminate{background-color:var(--color-primary);border-color:var(--color-primary)}.checkbox-control--indeterminate:after{content:"";position:absolute;top:50%;left:50%;width:8px;height:2px;background-color:#fff;border-radius:1px;transform:translate(-50%,-50%)}.checkbox-label{font-size:var(--font-size-sm);line-height:var(--line-height-normal);color:var(--color-body-text)}.switch-wrapper{display:inline-flex;align-items:center;gap:var(--spacing-2);cursor:pointer;-webkit-user-select:none;user-select:none;font-family:var(--font-family-base)}.switch-wrapper--disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.switch-track{width:36px;height:20px;flex-shrink:0;border-radius:var(--radius-full);background-color:var(--color-border);position:relative;transition:background-color var(--transition-speed-fast) var(--transition-timing)}.switch-track--checked{background-color:var(--color-primary)}.switch-thumb{position:absolute;top:2px;left:2px;width:16px;height:16px;border-radius:var(--radius-full);background-color:#fff;box-shadow:var(--shadow-xs);transition:transform var(--transition-speed-fast) var(--transition-timing)}.switch-track--checked .switch-thumb{transform:translate(16px)}';
5
- var x = Object.defineProperty, g = Object.getOwnPropertyDescriptor, r = (t, o, c, s) => {
6
- for (var i = s > 1 ? void 0 : s ? g(o, c) : o, l = t.length - 1, h; l >= 0; l--)
7
- (h = t[l]) && (i = (s ? h(o, c, i) : h(i)) || i);
8
- return s && i && x(o, c, i), i;
9
- };
10
- let e = class extends f {
11
- constructor() {
12
- super(...arguments), this.label = "", this.value = "", this.checked = !1, this.type = "checkbox", this.disabled = !1, this.indeterminate = !1, this.internalChecked = !1;
13
- }
14
- connectedCallback() {
15
- super.connectedCallback(), this.internalChecked = this.checked;
16
- }
17
- firstUpdated() {
18
- this.setIndeterminate();
19
- }
20
- updated(t) {
21
- t.has("indeterminate") && this.setIndeterminate(), t.has("checked") && (this.internalChecked = this.checked);
22
- }
23
- setIndeterminate() {
24
- this.inputElement && (this.inputElement.indeterminate = this.indeterminate);
25
- }
26
- toggleChecked() {
27
- this.disabled || (this.indeterminate ? (this.indeterminate = !1, this.internalChecked = !0) : this.internalChecked = !this.internalChecked, this.dispatchEvent(
28
- new CustomEvent("lgsChange", {
29
- detail: {
30
- checked: this.internalChecked,
31
- indeterminate: this.indeterminate,
32
- value: this.value
33
- },
34
- bubbles: !0,
35
- composed: !0
36
- })
37
- ));
38
- }
39
- renderCheckbox() {
40
- const t = [
41
- "checkbox-control",
42
- this.internalChecked ? "checkbox-control--checked" : "",
43
- this.indeterminate ? "checkbox-control--indeterminate" : ""
44
- ].filter(Boolean).join(" ");
45
- return a`
46
- <div
47
- class="checkbox-wrapper ${this.disabled ? "checkbox-wrapper--disabled" : ""}"
48
- @click=${this.toggleChecked}
49
- >
50
- <input
51
- type="checkbox"
52
- class="checkbox-input"
53
- .checked=${this.internalChecked}
54
- ?disabled=${this.disabled}
55
- .value=${this.value}
56
- ${p((o) => this.inputElement = o)}
57
- />
58
- <span class="${t}"></span>
59
- ${this.label ? a`<span class="checkbox-label">${this.label}</span>` : d}
60
- </div>
61
- `;
62
- }
63
- renderSwitch() {
64
- return a`
65
- <div
66
- class="switch-wrapper ${this.disabled ? "switch-wrapper--disabled" : ""}"
67
- @click=${this.toggleChecked}
68
- >
69
- <input
70
- type="checkbox"
71
- class="checkbox-input"
72
- .checked=${this.internalChecked}
73
- ?disabled=${this.disabled}
74
- .value=${this.value}
75
- ${p((t) => this.inputElement = t)}
76
- />
77
- <div class="switch-track ${this.internalChecked ? "switch-track--checked" : ""}">
78
- <div class="switch-thumb"></div>
79
- </div>
80
- ${this.label ? a`<span class="checkbox-label">${this.label}</span>` : d}
81
- </div>
82
- `;
83
- }
84
- render() {
85
- return this.type === "switch" ? this.renderSwitch() : this.renderCheckbox();
86
- }
87
- };
88
- e.styles = [
89
- k`
90
- ${b(v)}
91
- `
92
- ];
93
- r([
94
- n({ type: String })
95
- ], e.prototype, "label", 2);
96
- r([
97
- n({ type: String })
98
- ], e.prototype, "value", 2);
99
- r([
100
- n({ type: Boolean })
101
- ], e.prototype, "checked", 2);
102
- r([
103
- n({ type: String })
104
- ], e.prototype, "type", 2);
105
- r([
106
- n({ type: Boolean })
107
- ], e.prototype, "disabled", 2);
108
- r([
109
- n({ type: Boolean })
110
- ], e.prototype, "indeterminate", 2);
111
- r([
112
- u()
113
- ], e.prototype, "internalChecked", 2);
114
- e = r([
115
- m("logosphere-checkbox")
116
- ], e);
117
- export {
118
- e as C
119
- };
@@ -1,40 +0,0 @@
1
- "use strict";const s=require("lit"),n=require("lit/decorators.js"),c=".tab{width:100%;font-family:var(--font-family-base)}.tab__list{display:flex;overflow-x:auto;overflow-y:hidden;border-bottom:1px solid var(--color-border);scroll-behavior:smooth;-webkit-overflow-scrolling:touch;scrollbar-width:none;-ms-overflow-style:none}.tab__list::-webkit-scrollbar{display:none}.tab__button{display:inline-flex;flex-direction:row;align-items:center;gap:var(--spacing-2);padding:var(--spacing-3) var(--spacing-4);min-width:120px;position:relative;cursor:pointer;border:none;border-bottom:2px solid transparent;background:transparent;font-family:var(--font-family-base);white-space:nowrap;transition:background-color var(--transition-speed-base) var(--transition-timing),border-color var(--transition-speed-base) var(--transition-timing)}.tab__button:hover:not(.tab__button--disabled):not(.tab__button--active){background-color:var(--color-light)}.tab__button--active{border-bottom-color:var(--color-primary)}.tab__button--disabled{cursor:not-allowed;opacity:.4;pointer-events:none}.tab__icon{font-size:var(--font-size-xl);flex-shrink:0;color:inherit;line-height:1}.tab__content{display:flex;flex-direction:column;align-items:flex-start}.tab__label{font-weight:var(--font-weight-medium);font-size:var(--font-size-sm);color:var(--color-body-text)}.tab__label--inactive{color:var(--color-tertiary)}.tab__description{font-size:var(--font-size-xs);text-align:left;color:var(--color-tertiary)}.tab__description--active{color:var(--color-secondary)}.tab__panel{padding:var(--spacing-4);outline:none}.tab__panel--hidden{display:none}";var h=Object.defineProperty,p=Object.getOwnPropertyDescriptor,r=(d,e,a,t)=>{for(var i=t>1?void 0:t?p(e,a):e,o=d.length-1,l;o>=0;o--)(l=d[o])&&(i=(t?l(e,a,i):l(i))||i);return t&&i&&h(e,a,i),i};exports.LogosphereTab=class extends s.LitElement{constructor(){super(...arguments),this.tabs=[],this.activeTab="",this.lazy=!0,this.variant="default",this._focusedIndex=0,this._renderedTabs=new Set}connectedCallback(){super.connectedCallback(),!this.activeTab&&this.tabs.length>0&&(this.activeTab=this.tabs[0].id)}willUpdate(e){if(super.willUpdate(e),e.has("activeTab")&&this.activeTab){this._renderedTabs.add(this.activeTab);const a=this.tabs.findIndex(t=>t.id===this.activeTab);a!==-1&&(this._focusedIndex=a)}e.has("tabs")&&this.tabs.length>0&&(this.tabs.some(t=>t.id===this.activeTab)||(this.activeTab=this.tabs[0].id),this._focusedIndex=this.tabs.findIndex(t=>t.id===this.activeTab))}handleTabClick(e,a){if(a)return;const t=this.activeTab;this.activeTab=e,this._focusedIndex=this.tabs.findIndex(i=>i.id===e),this.dispatchEvent(new CustomEvent("tab-change",{detail:{oldTab:t,newTab:e},bubbles:!0,composed:!0}))}handleKeyDown(e){const{tabs:a}=this;if(a.filter(o=>!o.disabled).length===0)return;let t=this._focusedIndex;const i=this._focusedIndex;switch(e.key){case"ArrowLeft":e.preventDefault();do t=t>0?t-1:a.length-1;while(a[t]?.disabled&&t!==i);break;case"ArrowRight":e.preventDefault();do t=t<a.length-1?t+1:0;while(a[t]?.disabled&&t!==i);break;case"Home":for(e.preventDefault(),t=0;a[t]?.disabled&&t<a.length-1;)t++;break;case"End":for(e.preventDefault(),t=a.length-1;a[t]?.disabled&&t>0;)t--;break;default:return}if(t!==this._focusedIndex&&!a[t]?.disabled){const o=this.activeTab;this._focusedIndex=t,this.activeTab=a[t].id,this.updateComplete.then(()=>{this.shadowRoot?.querySelector(`[role="tab"][data-tab-id="${a[t].id}"]`)?.focus()}),this.dispatchEvent(new CustomEvent("tab-change",{detail:{oldTab:o,newTab:a[t].id},bubbles:!0,composed:!0}))}}scrollTabIntoView(e){this.updateComplete.then(()=>{const a=this.shadowRoot?.querySelector(`[role="tab"][data-tab-id="${e}"]`);if(a&&this.tablist){const t=this.tablist.getBoundingClientRect(),i=a.getBoundingClientRect();i.left<t.left?this.tablist.scrollLeft-=t.left-i.left+16:i.right>t.right&&(this.tablist.scrollLeft+=i.right-t.right+16)}})}renderTabButton(e,a){const t=this.activeTab===e.id,i=this._focusedIndex===a,o=["tab__button",t?"tab__button--active":"",e.disabled?"tab__button--disabled":""].filter(Boolean).join(" "),l=["tab__label",t?"":"tab__label--inactive"].filter(Boolean).join(" "),b=["tab__description",t?"tab__description--active":""].filter(Boolean).join(" ");return s.html`
2
- <button
3
- role="tab"
4
- class=${o}
5
- data-tab-id=${e.id}
6
- aria-selected=${t?"true":"false"}
7
- aria-controls="panel-${e.id}"
8
- tabindex=${t||i?"0":"-1"}
9
- ?disabled=${e.disabled}
10
- @click=${()=>this.handleTabClick(e.id,e.disabled)}
11
- @focus=${()=>this.scrollTabIntoView(e.id)}
12
- >
13
- ${e.icon?s.html`<i class="${e.icon} tab__icon"></i>`:s.nothing}
14
- <div class="tab__content">
15
- <span class=${l}>${e.label}</span>
16
- ${e.description?s.html`<span class=${b}>${e.description}</span>`:s.nothing}
17
- </div>
18
- </button>
19
- `}renderTabPanel(e){const a=this.activeTab===e.id;if(!(!this.lazy||this._renderedTabs.has(e.id)))return s.nothing;const i=["tab__panel",a?"":"tab__panel--hidden"].filter(Boolean).join(" ");return s.html`
20
- <div
21
- role="tabpanel"
22
- id="panel-${e.id}"
23
- aria-labelledby="tab-${e.id}"
24
- class=${i}
25
- tabindex="0"
26
- >
27
- <slot name=${`panel-${e.id}`}>
28
- ${typeof e.content=="string"?s.html`${e.content}`:s.nothing}
29
- </slot>
30
- </div>
31
- `}render(){return s.html`
32
- <div class="tab">
33
- <div role="tablist" aria-label="Tabs" class="tab__list" @keydown=${this.handleKeyDown}>
34
- ${this.tabs.map((e,a)=>this.renderTabButton(e,a))}
35
- </div>
36
- <div class="tab__panels">${this.tabs.map(e=>this.renderTabPanel(e))}</div>
37
- </div>
38
- `}};exports.LogosphereTab.styles=[s.css`
39
- ${s.unsafeCSS(c)}
40
- `];r([n.property({type:Array})],exports.LogosphereTab.prototype,"tabs",2);r([n.property({type:String})],exports.LogosphereTab.prototype,"activeTab",2);r([n.property({type:Boolean})],exports.LogosphereTab.prototype,"lazy",2);r([n.property({type:String})],exports.LogosphereTab.prototype,"variant",2);r([n.state()],exports.LogosphereTab.prototype,"_focusedIndex",2);r([n.state()],exports.LogosphereTab.prototype,"_renderedTabs",2);r([n.query('[role="tablist"]')],exports.LogosphereTab.prototype,"tablist",2);exports.LogosphereTab=r([n.customElement("logosphere-tab")],exports.LogosphereTab);
@@ -1,176 +0,0 @@
1
- import { unsafeCSS as p, css as f, LitElement as v, nothing as c, html as r } from "lit";
2
- import { property as b, state as h, query as _, customElement as u } from "lit/decorators.js";
3
- const y = ".tab{width:100%;font-family:var(--font-family-base)}.tab__list{display:flex;overflow-x:auto;overflow-y:hidden;border-bottom:1px solid var(--color-border);scroll-behavior:smooth;-webkit-overflow-scrolling:touch;scrollbar-width:none;-ms-overflow-style:none}.tab__list::-webkit-scrollbar{display:none}.tab__button{display:inline-flex;flex-direction:row;align-items:center;gap:var(--spacing-2);padding:var(--spacing-3) var(--spacing-4);min-width:120px;position:relative;cursor:pointer;border:none;border-bottom:2px solid transparent;background:transparent;font-family:var(--font-family-base);white-space:nowrap;transition:background-color var(--transition-speed-base) var(--transition-timing),border-color var(--transition-speed-base) var(--transition-timing)}.tab__button:hover:not(.tab__button--disabled):not(.tab__button--active){background-color:var(--color-light)}.tab__button--active{border-bottom-color:var(--color-primary)}.tab__button--disabled{cursor:not-allowed;opacity:.4;pointer-events:none}.tab__icon{font-size:var(--font-size-xl);flex-shrink:0;color:inherit;line-height:1}.tab__content{display:flex;flex-direction:column;align-items:flex-start}.tab__label{font-weight:var(--font-weight-medium);font-size:var(--font-size-sm);color:var(--color-body-text)}.tab__label--inactive{color:var(--color-tertiary)}.tab__description{font-size:var(--font-size-xs);text-align:left;color:var(--color-tertiary)}.tab__description--active{color:var(--color-secondary)}.tab__panel{padding:var(--spacing-4);outline:none}.tab__panel--hidden{display:none}";
4
- var g = Object.defineProperty, w = Object.getOwnPropertyDescriptor, n = (e, i, t, a) => {
5
- for (var s = a > 1 ? void 0 : a ? w(i, t) : i, l = e.length - 1, d; l >= 0; l--)
6
- (d = e[l]) && (s = (a ? d(i, t, s) : d(s)) || s);
7
- return a && s && g(i, t, s), s;
8
- };
9
- let o = class extends v {
10
- constructor() {
11
- super(...arguments), this.tabs = [], this.activeTab = "", this.lazy = !0, this.variant = "default", this._focusedIndex = 0, this._renderedTabs = /* @__PURE__ */ new Set();
12
- }
13
- connectedCallback() {
14
- super.connectedCallback(), !this.activeTab && this.tabs.length > 0 && (this.activeTab = this.tabs[0].id);
15
- }
16
- willUpdate(e) {
17
- if (super.willUpdate(e), e.has("activeTab") && this.activeTab) {
18
- this._renderedTabs.add(this.activeTab);
19
- const i = this.tabs.findIndex((t) => t.id === this.activeTab);
20
- i !== -1 && (this._focusedIndex = i);
21
- }
22
- e.has("tabs") && this.tabs.length > 0 && (this.tabs.some((t) => t.id === this.activeTab) || (this.activeTab = this.tabs[0].id), this._focusedIndex = this.tabs.findIndex((t) => t.id === this.activeTab));
23
- }
24
- // ==================== EVENTS ====================
25
- handleTabClick(e, i) {
26
- if (i) return;
27
- const t = this.activeTab;
28
- this.activeTab = e, this._focusedIndex = this.tabs.findIndex((a) => a.id === e), this.dispatchEvent(
29
- new CustomEvent("tab-change", {
30
- detail: { oldTab: t, newTab: e },
31
- bubbles: !0,
32
- composed: !0
33
- })
34
- );
35
- }
36
- handleKeyDown(e) {
37
- const { tabs: i } = this;
38
- if (i.filter((s) => !s.disabled).length === 0) return;
39
- let t = this._focusedIndex;
40
- const a = this._focusedIndex;
41
- switch (e.key) {
42
- case "ArrowLeft":
43
- e.preventDefault();
44
- do
45
- t = t > 0 ? t - 1 : i.length - 1;
46
- while (i[t]?.disabled && t !== a);
47
- break;
48
- case "ArrowRight":
49
- e.preventDefault();
50
- do
51
- t = t < i.length - 1 ? t + 1 : 0;
52
- while (i[t]?.disabled && t !== a);
53
- break;
54
- case "Home":
55
- for (e.preventDefault(), t = 0; i[t]?.disabled && t < i.length - 1; ) t++;
56
- break;
57
- case "End":
58
- for (e.preventDefault(), t = i.length - 1; i[t]?.disabled && t > 0; ) t--;
59
- break;
60
- default:
61
- return;
62
- }
63
- if (t !== this._focusedIndex && !i[t]?.disabled) {
64
- const s = this.activeTab;
65
- this._focusedIndex = t, this.activeTab = i[t].id, this.updateComplete.then(() => {
66
- this.shadowRoot?.querySelector(
67
- `[role="tab"][data-tab-id="${i[t].id}"]`
68
- )?.focus();
69
- }), this.dispatchEvent(
70
- new CustomEvent("tab-change", {
71
- detail: { oldTab: s, newTab: i[t].id },
72
- bubbles: !0,
73
- composed: !0
74
- })
75
- );
76
- }
77
- }
78
- scrollTabIntoView(e) {
79
- this.updateComplete.then(() => {
80
- const i = this.shadowRoot?.querySelector(
81
- `[role="tab"][data-tab-id="${e}"]`
82
- );
83
- if (i && this.tablist) {
84
- const t = this.tablist.getBoundingClientRect(), a = i.getBoundingClientRect();
85
- a.left < t.left ? this.tablist.scrollLeft -= t.left - a.left + 16 : a.right > t.right && (this.tablist.scrollLeft += a.right - t.right + 16);
86
- }
87
- });
88
- }
89
- // ==================== RENDER ====================
90
- renderTabButton(e, i) {
91
- const t = this.activeTab === e.id, a = this._focusedIndex === i, s = [
92
- "tab__button",
93
- t ? "tab__button--active" : "",
94
- e.disabled ? "tab__button--disabled" : ""
95
- ].filter(Boolean).join(" "), l = ["tab__label", t ? "" : "tab__label--inactive"].filter(Boolean).join(" "), d = ["tab__description", t ? "tab__description--active" : ""].filter(Boolean).join(" ");
96
- return r`
97
- <button
98
- role="tab"
99
- class=${s}
100
- data-tab-id=${e.id}
101
- aria-selected=${t ? "true" : "false"}
102
- aria-controls="panel-${e.id}"
103
- tabindex=${t || a ? "0" : "-1"}
104
- ?disabled=${e.disabled}
105
- @click=${() => this.handleTabClick(e.id, e.disabled)}
106
- @focus=${() => this.scrollTabIntoView(e.id)}
107
- >
108
- ${e.icon ? r`<i class="${e.icon} tab__icon"></i>` : c}
109
- <div class="tab__content">
110
- <span class=${l}>${e.label}</span>
111
- ${e.description ? r`<span class=${d}>${e.description}</span>` : c}
112
- </div>
113
- </button>
114
- `;
115
- }
116
- renderTabPanel(e) {
117
- const i = this.activeTab === e.id;
118
- if (!(!this.lazy || this._renderedTabs.has(e.id))) return c;
119
- const a = ["tab__panel", i ? "" : "tab__panel--hidden"].filter(Boolean).join(" ");
120
- return r`
121
- <div
122
- role="tabpanel"
123
- id="panel-${e.id}"
124
- aria-labelledby="tab-${e.id}"
125
- class=${a}
126
- tabindex="0"
127
- >
128
- <slot name=${`panel-${e.id}`}>
129
- ${typeof e.content == "string" ? r`${e.content}` : c}
130
- </slot>
131
- </div>
132
- `;
133
- }
134
- render() {
135
- return r`
136
- <div class="tab">
137
- <div role="tablist" aria-label="Tabs" class="tab__list" @keydown=${this.handleKeyDown}>
138
- ${this.tabs.map((e, i) => this.renderTabButton(e, i))}
139
- </div>
140
- <div class="tab__panels">${this.tabs.map((e) => this.renderTabPanel(e))}</div>
141
- </div>
142
- `;
143
- }
144
- };
145
- o.styles = [
146
- f`
147
- ${p(y)}
148
- `
149
- ];
150
- n([
151
- b({ type: Array })
152
- ], o.prototype, "tabs", 2);
153
- n([
154
- b({ type: String })
155
- ], o.prototype, "activeTab", 2);
156
- n([
157
- b({ type: Boolean })
158
- ], o.prototype, "lazy", 2);
159
- n([
160
- b({ type: String })
161
- ], o.prototype, "variant", 2);
162
- n([
163
- h()
164
- ], o.prototype, "_focusedIndex", 2);
165
- n([
166
- h()
167
- ], o.prototype, "_renderedTabs", 2);
168
- n([
169
- _('[role="tablist"]')
170
- ], o.prototype, "tablist", 2);
171
- o = n([
172
- u("logosphere-tab")
173
- ], o);
174
- export {
175
- o as L
176
- };