@progressive-development/pd-content 0.9.2 → 1.0.0
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/LICENSE +21 -2
- package/README.md +42 -57
- package/dist/_virtual/_commonjsHelpers.js +7 -0
- package/dist/_virtual/prism-java.js +3 -0
- package/dist/_virtual/prism-java2.js +3 -0
- package/dist/_virtual/prism-python.js +3 -0
- package/dist/_virtual/prism-python2.js +3 -0
- package/dist/_virtual/prism-typescript.js +3 -0
- package/dist/_virtual/prism-typescript2.js +3 -0
- package/dist/_virtual/prism.js +7 -0
- package/dist/_virtual/prism2.js +3 -0
- package/dist/generated/locales/be.d.ts +10 -0
- package/dist/generated/locales/be.d.ts.map +1 -1
- package/dist/generated/locales/de.d.ts +10 -0
- package/dist/generated/locales/de.d.ts.map +1 -1
- package/dist/generated/locales/en.d.ts +10 -0
- package/dist/generated/locales/en.d.ts.map +1 -1
- package/dist/index.d.ts +8 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -0
- package/dist/locales/be.js +11 -1
- package/dist/locales/de.js +11 -1
- package/dist/locales/en.js +11 -1
- package/dist/node_modules/.pnpm/prismjs@1.30.0/node_modules/prismjs/components/prism-bash.js +235 -0
- package/dist/node_modules/.pnpm/prismjs@1.30.0/node_modules/prismjs/components/prism-java.js +135 -0
- package/dist/node_modules/.pnpm/prismjs@1.30.0/node_modules/prismjs/components/prism-json.js +27 -0
- package/dist/node_modules/.pnpm/prismjs@1.30.0/node_modules/prismjs/components/prism-markdown.js +415 -0
- package/dist/node_modules/.pnpm/prismjs@1.30.0/node_modules/prismjs/components/prism-python.js +76 -0
- package/dist/node_modules/.pnpm/prismjs@1.30.0/node_modules/prismjs/components/prism-sql.js +32 -0
- package/dist/node_modules/.pnpm/prismjs@1.30.0/node_modules/prismjs/components/prism-typescript.js +71 -0
- package/dist/node_modules/.pnpm/prismjs@1.30.0/node_modules/prismjs/components/prism-yaml.js +83 -0
- package/dist/node_modules/.pnpm/prismjs@1.30.0/node_modules/prismjs/prism.js +1959 -0
- package/dist/pd-box-view/PdBoxView.d.ts +9 -0
- package/dist/pd-box-view/PdBoxView.d.ts.map +1 -1
- package/dist/pd-box-view/pd-box-view.stories.d.ts +41 -8
- package/dist/pd-box-view/pd-box-view.stories.d.ts.map +1 -1
- package/dist/pd-code-snippet/PdCodeSnippet.d.ts +105 -0
- package/dist/pd-code-snippet/PdCodeSnippet.d.ts.map +1 -0
- package/dist/pd-code-snippet/PdCodeSnippet.js +504 -0
- package/dist/pd-code-snippet/pd-code-snippet.d.ts +4 -0
- package/dist/pd-code-snippet/pd-code-snippet.d.ts.map +1 -0
- package/dist/pd-code-snippet/pd-code-snippet.js +5 -0
- package/dist/pd-code-snippet/pd-code-snippet.stories.d.ts +55 -0
- package/dist/pd-code-snippet/pd-code-snippet.stories.d.ts.map +1 -0
- package/dist/pd-collapse/PdCollapse.d.ts +31 -7
- package/dist/pd-collapse/PdCollapse.d.ts.map +1 -1
- package/dist/pd-collapse/PdCollapse.js +73 -15
- package/dist/pd-collapse/pd-collapse.stories.d.ts +49 -21
- package/dist/pd-collapse/pd-collapse.stories.d.ts.map +1 -1
- package/dist/pd-collapse-group/PdCollapseGroup.d.ts +8 -7
- package/dist/pd-collapse-group/PdCollapseGroup.d.ts.map +1 -1
- package/dist/pd-collapse-group/PdCollapseGroup.js +7 -6
- package/dist/pd-collapse-group/pd-collapse-group.stories.d.ts +39 -4
- package/dist/pd-collapse-group/pd-collapse-group.stories.d.ts.map +1 -1
- package/dist/pd-edit-content/PdEditContent.d.ts +13 -0
- package/dist/pd-edit-content/PdEditContent.d.ts.map +1 -1
- package/dist/pd-edit-content/PdEditContent.js +33 -7
- package/dist/pd-edit-content/pd-edit-content.stories.d.ts +54 -10
- package/dist/pd-edit-content/pd-edit-content.stories.d.ts.map +1 -1
- package/dist/pd-loading-state/PdLoadingState.d.ts +64 -0
- package/dist/pd-loading-state/PdLoadingState.d.ts.map +1 -0
- package/dist/pd-loading-state/PdLoadingState.js +219 -0
- package/dist/pd-loading-state/pd-loading-state.d.ts +6 -0
- package/dist/pd-loading-state/pd-loading-state.d.ts.map +1 -0
- package/dist/pd-loading-state/pd-loading-state.stories.d.ts +48 -0
- package/dist/pd-loading-state/pd-loading-state.stories.d.ts.map +1 -0
- package/dist/pd-loading-state.d.ts +2 -0
- package/dist/pd-loading-state.js +1 -0
- package/dist/pd-more-info/PdMoreInfo.d.ts +6 -2
- package/dist/pd-more-info/PdMoreInfo.d.ts.map +1 -1
- package/dist/pd-more-info/PdMoreInfo.js +30 -2
- package/dist/pd-more-info/pd-more-info.stories.d.ts +41 -5
- package/dist/pd-more-info/pd-more-info.stories.d.ts.map +1 -1
- package/dist/pd-notice-box/PdNoticeBox.d.ts +88 -0
- package/dist/pd-notice-box/PdNoticeBox.d.ts.map +1 -0
- package/dist/pd-notice-box/PdNoticeBox.js +224 -0
- package/dist/pd-notice-box/pd-notice-box.d.ts +3 -0
- package/dist/pd-notice-box/pd-notice-box.d.ts.map +1 -0
- package/dist/pd-notice-box/pd-notice-box.js +8 -0
- package/dist/pd-notice-box/pd-notice-box.stories.d.ts +58 -0
- package/dist/pd-notice-box/pd-notice-box.stories.d.ts.map +1 -0
- package/dist/pd-panel-viewer/PdPanel.d.ts +5 -0
- package/dist/pd-panel-viewer/PdPanel.d.ts.map +1 -1
- package/dist/pd-panel-viewer/PdPanelViewer.d.ts +53 -2
- package/dist/pd-panel-viewer/PdPanelViewer.d.ts.map +1 -1
- package/dist/pd-panel-viewer/PdPanelViewer.js +188 -33
- package/dist/pd-panel-viewer/pd-panel-viewer.stories.d.ts +46 -0
- package/dist/pd-panel-viewer/pd-panel-viewer.stories.d.ts.map +1 -0
- package/dist/pd-resize-content/PdResizeContent.d.ts +12 -10
- package/dist/pd-resize-content/PdResizeContent.d.ts.map +1 -1
- package/dist/pd-resize-content/PdResizeContent.js +19 -9
- package/dist/pd-resize-content/pd-resize-content.stories.d.ts +36 -4
- package/dist/pd-resize-content/pd-resize-content.stories.d.ts.map +1 -1
- package/dist/pd-tab/PdTab.d.ts +35 -2
- package/dist/pd-tab/PdTab.d.ts.map +1 -1
- package/dist/pd-tab/PdTab.js +181 -68
- package/dist/pd-tab/pd-tab.stories.d.ts +51 -21
- package/dist/pd-tab/pd-tab.stories.d.ts.map +1 -1
- package/dist/pd-timeline/PdTimeline.d.ts +50 -0
- package/dist/pd-timeline/PdTimeline.d.ts.map +1 -0
- package/dist/pd-timeline/PdTimeline.js +315 -0
- package/dist/pd-timeline/pd-timeline.d.ts +3 -0
- package/dist/pd-timeline/pd-timeline.d.ts.map +1 -0
- package/dist/pd-timeline/pd-timeline.stories.d.ts +56 -0
- package/dist/pd-timeline/pd-timeline.stories.d.ts.map +1 -0
- package/dist/pd-timeline-wizard/PdTimelineWizard.d.ts +39 -0
- package/dist/pd-timeline-wizard/PdTimelineWizard.d.ts.map +1 -0
- package/dist/pd-timeline-wizard/PdTimelineWizard.js +150 -0
- package/dist/pd-timeline-wizard/pd-timeline-wizard.d.ts +3 -0
- package/dist/pd-timeline-wizard/pd-timeline-wizard.d.ts.map +1 -0
- package/dist/pd-timeline-wizard/pd-timeline-wizard.stories.d.ts +54 -0
- package/dist/pd-timeline-wizard/pd-timeline-wizard.stories.d.ts.map +1 -0
- package/dist/pd-timeline-wizard.d.ts +2 -0
- package/dist/pd-timeline-wizard.js +8 -0
- package/dist/pd-timeline.d.ts +2 -0
- package/dist/pd-timeline.js +8 -0
- package/dist/types.d.ts +25 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +16 -7
package/dist/pd-tab/PdTab.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { LitElement, css, html } from 'lit';
|
|
2
|
-
import { property } from 'lit/decorators.js';
|
|
1
|
+
import { LitElement, css, nothing, html } from 'lit';
|
|
2
|
+
import { property, state, query } from 'lit/decorators.js';
|
|
3
3
|
import '@progressive-development/pd-icon/pd-icon';
|
|
4
4
|
|
|
5
5
|
var __defProp = Object.defineProperty;
|
|
@@ -15,91 +15,108 @@ class PdTab extends LitElement {
|
|
|
15
15
|
constructor() {
|
|
16
16
|
super(...arguments);
|
|
17
17
|
this.tabs = [];
|
|
18
|
+
this._resizeObserver = null;
|
|
18
19
|
}
|
|
19
20
|
static {
|
|
20
21
|
this.styles = [
|
|
21
22
|
css`
|
|
22
23
|
:host {
|
|
23
24
|
display: block;
|
|
25
|
+
--_font-size: var(--pd-tab-font-size, 0.875rem);
|
|
26
|
+
--_font-size-compact: var(--pd-tab-font-size-compact, 0.8rem);
|
|
27
|
+
--_active-col: var(
|
|
28
|
+
--pd-tab-active-indicator-col,
|
|
29
|
+
var(--pd-default-col)
|
|
30
|
+
);
|
|
31
|
+
--_active-height: var(--pd-tab-active-indicator-height, 2px);
|
|
32
|
+
--_icon-size: var(--pd-tab-icon-size, 1.125em);
|
|
24
33
|
}
|
|
25
34
|
|
|
26
35
|
.header-container {
|
|
27
36
|
display: flex;
|
|
37
|
+
flex-wrap: nowrap;
|
|
38
|
+
border-bottom: 1px solid var(--pd-default-disabled-light-col, #e5e7eb);
|
|
39
|
+
font-size: var(--_font-size);
|
|
28
40
|
}
|
|
29
41
|
|
|
42
|
+
/* --- Tab header --- */
|
|
30
43
|
.tab-header {
|
|
31
|
-
padding: var(--pd-tab-header-padding, 0.
|
|
32
|
-
background-color: var(--pd-tab-bg-col, var(--pd-default-light-col));
|
|
44
|
+
padding: var(--pd-tab-header-padding, 0.5em 1em);
|
|
33
45
|
font-family: var(--pd-default-font-title-family);
|
|
34
46
|
color: var(--pd-tab-text-col, var(--pd-default-font-title-col));
|
|
35
47
|
cursor: pointer;
|
|
36
|
-
|
|
37
|
-
border
|
|
38
|
-
border-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
box-shadow: var(
|
|
42
|
-
--pd-tab-shadow,
|
|
43
|
-
0 2px 4px rgba(0, 0, 0, 0.1)
|
|
44
|
-
); /* Leichter Schatten für Tiefe */
|
|
48
|
+
background: transparent;
|
|
49
|
+
border: none;
|
|
50
|
+
border-bottom: var(--_active-height) solid transparent;
|
|
51
|
+
margin-bottom: calc(-1 * var(--_active-height) + 1px);
|
|
52
|
+
white-space: nowrap;
|
|
45
53
|
transition:
|
|
46
|
-
|
|
47
|
-
|
|
54
|
+
color 0.2s,
|
|
55
|
+
border-color 0.2s,
|
|
56
|
+
background-color 0.2s;
|
|
57
|
+
display: inline-flex;
|
|
58
|
+
align-items: center;
|
|
59
|
+
gap: var(--pd-tab-icon-gap, 0.35em);
|
|
60
|
+
flex-shrink: 0;
|
|
48
61
|
}
|
|
49
62
|
|
|
50
63
|
.tab-header:hover {
|
|
51
|
-
background-color: var(
|
|
52
|
-
--pd-tab-bg-hover-col,
|
|
53
|
-
var(--pd-default-hover-col)
|
|
54
|
-
);
|
|
55
|
-
box-shadow: var(
|
|
56
|
-
--pd-tab-shadow-hover,
|
|
57
|
-
0 4px 8px rgba(0, 0, 0, 0.2)
|
|
58
|
-
); /* Schattenintensität bei Hover erhöhen */
|
|
64
|
+
background-color: var(--pd-tab-hover-bg-col, rgba(0, 0, 0, 0.04));
|
|
59
65
|
}
|
|
60
66
|
|
|
61
67
|
.tab-header.active-header {
|
|
62
|
-
|
|
63
|
-
border-bottom:
|
|
64
|
-
|
|
65
|
-
color: var(
|
|
66
|
-
--pd-tab-active-text-col,
|
|
67
|
-
var(--pd-default-bg-col)
|
|
68
|
-
); /* Textfarbe für aktiven Tab */
|
|
69
|
-
box-shadow: none; /* Schatten entfernen, wenn Tab aktiv ist */
|
|
68
|
+
color: var(--pd-tab-active-text-col, var(--_active-col));
|
|
69
|
+
border-bottom-color: var(--_active-col);
|
|
70
|
+
font-weight: 500;
|
|
70
71
|
}
|
|
71
72
|
|
|
72
73
|
.tab-header.disabled-header {
|
|
73
|
-
|
|
74
|
-
border-bottom: 2px solid
|
|
75
|
-
var(--pd-tab-border-active-col, var(--pd-default-col));
|
|
74
|
+
pointer-events: none;
|
|
76
75
|
color: var(
|
|
77
|
-
--pd-tab-
|
|
78
|
-
var(--pd-default-
|
|
79
|
-
);
|
|
80
|
-
|
|
76
|
+
--pd-tab-disabled-text-col,
|
|
77
|
+
var(--pd-default-disabled-text-col)
|
|
78
|
+
);
|
|
79
|
+
opacity: 0.5;
|
|
80
|
+
cursor: not-allowed;
|
|
81
81
|
}
|
|
82
82
|
|
|
83
|
-
.tab-header
|
|
84
|
-
|
|
85
|
-
background-color: var(
|
|
86
|
-
--pd-tab-disabled-bg-col,
|
|
87
|
-
#f0f0f0
|
|
88
|
-
); /* Hellere Farbe für deaktivierte Tabs */
|
|
89
|
-
color: var(--pd-tab-disabled-text-col, #999); /* Hellere Textfarbe */
|
|
90
|
-
border-color: var(
|
|
91
|
-
--pd-tab-disabled-border-col,
|
|
92
|
-
#ddd
|
|
93
|
-
); /* Angepasste Rahmenfarbe */
|
|
94
|
-
cursor: not-allowed; /* Zeigt an, dass der Tab nicht interaktiv ist */
|
|
95
|
-
opacity: 0.6; /* Reduziert die Sichtbarkeit für einen "deaktivierten" Look */
|
|
83
|
+
.tab-header:focus {
|
|
84
|
+
outline: none;
|
|
96
85
|
}
|
|
97
86
|
|
|
98
|
-
.tab-header:focus {
|
|
99
|
-
outline:
|
|
100
|
-
|
|
87
|
+
.tab-header:focus-visible {
|
|
88
|
+
outline: 2px solid var(--pd-focus-ring-col);
|
|
89
|
+
outline-offset: -2px;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/* --- Compact mode (short labels) --- */
|
|
93
|
+
:host([data-compact]) .header-container {
|
|
94
|
+
font-size: var(--_font-size-compact);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
.full-label {
|
|
98
|
+
display: inline;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
.short-label {
|
|
102
|
+
display: none;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
:host([data-compact]) .full-label {
|
|
106
|
+
display: none;
|
|
101
107
|
}
|
|
102
108
|
|
|
109
|
+
:host([data-compact]) .short-label {
|
|
110
|
+
display: inline;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/* --- Icon --- */
|
|
114
|
+
.tab-icon {
|
|
115
|
+
--pd-icon-size: var(--_icon-size);
|
|
116
|
+
flex-shrink: 0;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/* --- Content panels --- */
|
|
103
120
|
.slot-container {
|
|
104
121
|
display: none;
|
|
105
122
|
}
|
|
@@ -107,33 +124,60 @@ class PdTab extends LitElement {
|
|
|
107
124
|
.active-slot {
|
|
108
125
|
padding: var(--pd-tab-content-padding, 1em);
|
|
109
126
|
display: block;
|
|
110
|
-
border: var(
|
|
111
|
-
|
|
112
|
-
--pd-
|
|
113
|
-
3px solid var(--pd-default-col)
|
|
127
|
+
border: var(
|
|
128
|
+
--pd-tab-content-border,
|
|
129
|
+
1px solid var(--pd-default-disabled-light-col, #e5e7eb)
|
|
114
130
|
);
|
|
131
|
+
border-top: none;
|
|
115
132
|
}
|
|
116
133
|
`
|
|
117
134
|
];
|
|
118
135
|
}
|
|
119
|
-
|
|
136
|
+
willUpdate(changedProperties) {
|
|
120
137
|
if (changedProperties.has("defaultTab") && this.defaultTab) {
|
|
121
|
-
console.log("PdTab: Set active from default selection", this.defaultTab);
|
|
122
138
|
this._activeTab = this.defaultTab;
|
|
123
139
|
}
|
|
124
|
-
|
|
140
|
+
}
|
|
141
|
+
updated(changedProperties) {
|
|
142
|
+
if (changedProperties.has("tabs")) {
|
|
143
|
+
this._checkOverflow();
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
firstUpdated() {
|
|
147
|
+
this._resizeObserver = new ResizeObserver(() => this._checkOverflow());
|
|
148
|
+
this._resizeObserver.observe(this._headerContainer);
|
|
149
|
+
}
|
|
150
|
+
disconnectedCallback() {
|
|
151
|
+
super.disconnectedCallback();
|
|
152
|
+
if (this._resizeObserver) {
|
|
153
|
+
this._resizeObserver.disconnect();
|
|
154
|
+
this._resizeObserver = null;
|
|
155
|
+
}
|
|
125
156
|
}
|
|
126
157
|
render() {
|
|
127
158
|
return html`
|
|
128
|
-
<div
|
|
159
|
+
<div
|
|
160
|
+
id="hc"
|
|
161
|
+
class="header-container"
|
|
162
|
+
role="tablist"
|
|
163
|
+
@keydown=${this._onKeyDown}
|
|
164
|
+
>
|
|
129
165
|
${this.tabs.map(
|
|
130
166
|
(t) => html`
|
|
131
167
|
<div
|
|
132
168
|
class="tab-header ${this._activeTab === t.key ? "active-header" : ""} ${t.disabled ? "disabled-header" : ""}"
|
|
133
169
|
data-key="${t.key}"
|
|
134
170
|
@click="${this._tabSelected}"
|
|
171
|
+
role="tab"
|
|
172
|
+
id="${`tab-${t.key}`}"
|
|
173
|
+
aria-selected="${this._activeTab === t.key}"
|
|
174
|
+
aria-controls="${`panel-${t.key}`}"
|
|
175
|
+
aria-disabled="${t.disabled || false}"
|
|
176
|
+
tabindex="${this._activeTab === t.key && !t.disabled ? 0 : -1}"
|
|
135
177
|
>
|
|
136
|
-
${t.
|
|
178
|
+
${t.pdIcon ? html`<pd-icon class="tab-icon" .icon="${t.pdIcon}"></pd-icon>` : nothing}
|
|
179
|
+
<span class="full-label">${t.name}</span>
|
|
180
|
+
<span class="short-label">${t.shortLabel ?? t.name}</span>
|
|
137
181
|
</div>
|
|
138
182
|
`
|
|
139
183
|
)}
|
|
@@ -141,7 +185,9 @@ class PdTab extends LitElement {
|
|
|
141
185
|
${this.tabs.map(
|
|
142
186
|
(t) => html`
|
|
143
187
|
<div
|
|
144
|
-
id="${`
|
|
188
|
+
id="${`panel-${t.key}`}"
|
|
189
|
+
role="tabpanel"
|
|
190
|
+
aria-labelledby="${`tab-${t.key}`}"
|
|
145
191
|
class="slot-container ${this._activeTab === t.key ? "active-slot" : ""}"
|
|
146
192
|
>
|
|
147
193
|
<slot name="${t.key}"></slot>
|
|
@@ -153,12 +199,76 @@ class PdTab extends LitElement {
|
|
|
153
199
|
reset() {
|
|
154
200
|
this._activeTab = this.defaultTab;
|
|
155
201
|
}
|
|
156
|
-
//
|
|
202
|
+
// ---------------------------------------------------------------------------
|
|
203
|
+
// Overflow detection (compact mode)
|
|
204
|
+
// ---------------------------------------------------------------------------
|
|
205
|
+
_checkOverflow() {
|
|
206
|
+
this.removeAttribute("data-compact");
|
|
207
|
+
const c = this._headerContainer;
|
|
208
|
+
if (c.scrollWidth > c.clientWidth + 1 && this.tabs.some((t) => t.shortLabel)) {
|
|
209
|
+
this.setAttribute("data-compact", "");
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
// ---------------------------------------------------------------------------
|
|
213
|
+
// Tab selection & keyboard navigation
|
|
214
|
+
// ---------------------------------------------------------------------------
|
|
215
|
+
_onKeyDown(event) {
|
|
216
|
+
const enabledTabs = this.tabs.filter((t) => !t.disabled);
|
|
217
|
+
if (enabledTabs.length === 0) return;
|
|
218
|
+
const currentIndex = enabledTabs.findIndex(
|
|
219
|
+
(t) => t.key === this._activeTab
|
|
220
|
+
);
|
|
221
|
+
let nextIndex = -1;
|
|
222
|
+
switch (event.key) {
|
|
223
|
+
case "ArrowRight":
|
|
224
|
+
case "ArrowDown":
|
|
225
|
+
event.preventDefault();
|
|
226
|
+
nextIndex = currentIndex < enabledTabs.length - 1 ? currentIndex + 1 : 0;
|
|
227
|
+
break;
|
|
228
|
+
case "ArrowLeft":
|
|
229
|
+
case "ArrowUp":
|
|
230
|
+
event.preventDefault();
|
|
231
|
+
nextIndex = currentIndex > 0 ? currentIndex - 1 : enabledTabs.length - 1;
|
|
232
|
+
break;
|
|
233
|
+
case "Home":
|
|
234
|
+
event.preventDefault();
|
|
235
|
+
nextIndex = 0;
|
|
236
|
+
break;
|
|
237
|
+
case "End":
|
|
238
|
+
event.preventDefault();
|
|
239
|
+
nextIndex = enabledTabs.length - 1;
|
|
240
|
+
break;
|
|
241
|
+
default:
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
if (nextIndex >= 0 && nextIndex < enabledTabs.length) {
|
|
245
|
+
const nextTab = enabledTabs[nextIndex];
|
|
246
|
+
this._activeTab = nextTab.key;
|
|
247
|
+
this.dispatchEvent(
|
|
248
|
+
new CustomEvent("tab-selected", {
|
|
249
|
+
detail: this._activeTab,
|
|
250
|
+
bubbles: true,
|
|
251
|
+
composed: true
|
|
252
|
+
})
|
|
253
|
+
);
|
|
254
|
+
this.updateComplete.then(() => {
|
|
255
|
+
const tabElement = this.shadowRoot?.querySelector(
|
|
256
|
+
`[data-key="${nextTab.key}"]`
|
|
257
|
+
);
|
|
258
|
+
tabElement?.focus();
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
}
|
|
157
262
|
_tabSelected(e) {
|
|
158
|
-
|
|
263
|
+
const target = e.target;
|
|
264
|
+
const key = target.closest("[data-key]")?.dataset?.key;
|
|
265
|
+
if (!key) return;
|
|
266
|
+
this._activeTab = key;
|
|
159
267
|
this.dispatchEvent(
|
|
160
268
|
new CustomEvent("tab-selected", {
|
|
161
|
-
detail: this._activeTab
|
|
269
|
+
detail: this._activeTab,
|
|
270
|
+
bubbles: true,
|
|
271
|
+
composed: true
|
|
162
272
|
})
|
|
163
273
|
);
|
|
164
274
|
}
|
|
@@ -170,7 +280,10 @@ __decorateClass([
|
|
|
170
280
|
property({ type: String })
|
|
171
281
|
], PdTab.prototype, "defaultTab");
|
|
172
282
|
__decorateClass([
|
|
173
|
-
|
|
283
|
+
state()
|
|
174
284
|
], PdTab.prototype, "_activeTab");
|
|
285
|
+
__decorateClass([
|
|
286
|
+
query("#hc")
|
|
287
|
+
], PdTab.prototype, "_headerContainer");
|
|
175
288
|
|
|
176
289
|
export { PdTab };
|
|
@@ -1,23 +1,53 @@
|
|
|
1
|
-
import { StoryObj } from '@storybook/web-components';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
1
|
+
import { Meta, StoryObj } from '@storybook/web-components-vite';
|
|
2
|
+
import { TabHeader } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Story arguments interface for pd-tab component.
|
|
5
|
+
* Maps to the component's public API.
|
|
6
|
+
*/
|
|
7
|
+
interface PdTabArgs {
|
|
8
|
+
/** Array of tab header definitions */
|
|
9
|
+
tabs: TabHeader[];
|
|
10
|
+
/** Key of the initially active tab */
|
|
11
|
+
defaultTab: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* ## pd-tab
|
|
15
|
+
*
|
|
16
|
+
* A tab navigation component with header tabs and named content slots.
|
|
17
|
+
*
|
|
18
|
+
* ### Features
|
|
19
|
+
* - Dynamic tabs configured via the `tabs` property (array of TabHeader)
|
|
20
|
+
* - Responsive label switching: full label -> short label when space is limited
|
|
21
|
+
* - Optional icon per tab header via `pdIcon`
|
|
22
|
+
* - Disabled state for individual tabs
|
|
23
|
+
* - Named slots for each tab's content, matched by tab key
|
|
24
|
+
* - Full WAI-ARIA tabs pattern with keyboard navigation
|
|
25
|
+
*
|
|
26
|
+
* ### Accessibility
|
|
27
|
+
* - Tab container uses `role="tablist"`
|
|
28
|
+
* - Tab headers use `role="tab"` with `aria-selected` and `aria-controls`
|
|
29
|
+
* - Tab panels use `role="tabpanel"` with `aria-labelledby`
|
|
30
|
+
* - `aria-disabled` on disabled tabs
|
|
31
|
+
* - Arrow keys (horizontal + vertical), Home, and End for tab navigation
|
|
32
|
+
* - Disabled tabs are skipped during keyboard navigation
|
|
33
|
+
* - Visible focus indicator via `:focus-visible`
|
|
34
|
+
*/
|
|
35
|
+
declare const meta: Meta<PdTabArgs>;
|
|
20
36
|
export default meta;
|
|
21
|
-
type Story = StoryObj
|
|
22
|
-
|
|
37
|
+
type Story = StoryObj<PdTabArgs>;
|
|
38
|
+
/** Default tab component with three tabs. Interactive via Controls panel. */
|
|
39
|
+
export declare const Default: Story;
|
|
40
|
+
/** Overview of different tab configurations: default, disabled, short labels, and minimal. */
|
|
41
|
+
export declare const AllStates: Story;
|
|
42
|
+
/**
|
|
43
|
+
* Resizable container to test responsive label switching.
|
|
44
|
+
* Drag the right edge to resize and watch: Full Label -> Short Label.
|
|
45
|
+
*/
|
|
46
|
+
export declare const ResponsiveCascade: Story;
|
|
47
|
+
/** Behavior with six tabs in the navigation bar. */
|
|
48
|
+
export declare const ManyTabs: Story;
|
|
49
|
+
/** Tabs with rich content including lists and tables. */
|
|
50
|
+
export declare const WithRichContent: Story;
|
|
51
|
+
/** CSS Custom Properties -- Branded and Redesigned variants. */
|
|
52
|
+
export declare const CustomStyling: Story;
|
|
23
53
|
//# sourceMappingURL=pd-tab.stories.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pd-tab.stories.d.ts","sourceRoot":"","sources":["../../src/pd-tab/pd-tab.stories.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pd-tab.stories.d.ts","sourceRoot":"","sources":["../../src/pd-tab/pd-tab.stories.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAGrE,OAAO,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAM7C;;;GAGG;AACH,UAAU,SAAS;IACjB,sCAAsC;IACtC,IAAI,EAAE,SAAS,EAAE,CAAC;IAClB,sCAAsC;IACtC,UAAU,EAAE,MAAM,CAAC;CACpB;AAqCD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,SAAS,CA4DzB,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;AAMjC,6EAA6E;AAC7E,eAAO,MAAM,OAAO,EAAE,KAiBrB,CAAC;AAMF,8FAA8F;AAC9F,eAAO,MAAM,SAAS,EAAE,KAkDvB,CAAC;AAMF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,KA0B/B,CAAC;AAMF,oDAAoD;AACpD,eAAO,MAAM,QAAQ,EAAE,KAuBtB,CAAC;AAMF,yDAAyD;AACzD,eAAO,MAAM,eAAe,EAAE,KAyE7B,CAAC;AAMF,gEAAgE;AAChE,eAAO,MAAM,aAAa,EAAE,KAkF3B,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { LitElement } from 'lit';
|
|
2
|
+
import { Orientation, PointItem } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Timeline/stepper component for displaying sequential steps or progress.
|
|
5
|
+
*
|
|
6
|
+
* @tagname pd-timeline
|
|
7
|
+
* @summary Timeline stepper for sequential steps or progress display.
|
|
8
|
+
*
|
|
9
|
+
* @event step-click - Fired when a clickable point is clicked. Emits `{index, id}`.
|
|
10
|
+
*
|
|
11
|
+
* @slot label-[index] - Named slots for custom label content at each point.
|
|
12
|
+
*
|
|
13
|
+
* @csspart label - The label container element for each timeline point.
|
|
14
|
+
*
|
|
15
|
+
* @cssprop --pd-timeline-line-color - Connecting line color.
|
|
16
|
+
* @cssprop --pd-timeline-line-width - Connecting line width.
|
|
17
|
+
* @cssprop --pd-timeline-line-style - Connecting line style.
|
|
18
|
+
* @cssprop --pd-timeline-point-size - Point circle size.
|
|
19
|
+
* @cssprop --pd-timeline-point-bg - Point background color.
|
|
20
|
+
* @cssprop --pd-timeline-point-color - Point text color.
|
|
21
|
+
* @cssprop --pd-timeline-point-border-color - Point border color.
|
|
22
|
+
* @cssprop --pd-timeline-point-border-width - Point border width.
|
|
23
|
+
* @cssprop --pd-timeline-point-font-size - Point text size.
|
|
24
|
+
* @cssprop --pd-timeline-label-gap - Gap between point and label.
|
|
25
|
+
* @cssprop --pd-timeline-label-max-width - Maximum label width.
|
|
26
|
+
* @cssprop --pd-timeline-vertical-row-gap - Vertical layout row gap.
|
|
27
|
+
* @cssprop --pd-timeline-vertical-block-size - Vertical layout height.
|
|
28
|
+
* @cssprop --pd-timeline-color-active - Active state color.
|
|
29
|
+
* @cssprop --pd-timeline-color-done - Done state color.
|
|
30
|
+
* @cssprop --pd-timeline-color-error - Error state color.
|
|
31
|
+
*/
|
|
32
|
+
export declare class PdTimeline extends LitElement {
|
|
33
|
+
/** Layout direction: 'horizontal' or 'vertical'. */
|
|
34
|
+
orientation: Orientation;
|
|
35
|
+
/** Array of point definitions for the timeline. */
|
|
36
|
+
points: PointItem[];
|
|
37
|
+
/** Index of the currently active step. */
|
|
38
|
+
activeIndex?: number;
|
|
39
|
+
/** Whether points are clickable. */
|
|
40
|
+
clickable: boolean;
|
|
41
|
+
static styles: import('lit').CSSResult;
|
|
42
|
+
protected updated(): void;
|
|
43
|
+
private _labelClass;
|
|
44
|
+
private _stateClass;
|
|
45
|
+
private _onClick;
|
|
46
|
+
private _onKeyDown;
|
|
47
|
+
private _renderDotContent;
|
|
48
|
+
protected render(): import('lit').TemplateResult<1>;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=PdTimeline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PdTimeline.d.ts","sourceRoot":"","sources":["../../src/pd-timeline/PdTimeline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAsB,MAAM,KAAK,CAAC;AAIrD,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAyB,MAAM,UAAU,CAAC;AAE9E;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,qBAAa,UAAW,SAAQ,UAAU;IACxC,oDAAoD;IAEpD,WAAW,EAAE,WAAW,CAAgB;IAExC,mDAAmD;IAEnD,MAAM,EAAE,SAAS,EAAE,CAAM;IAEzB,0CAA0C;IAE1C,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,oCAAoC;IAEpC,SAAS,UAAS;IAElB,MAAM,CAAC,MAAM,0BA+LX;IAEF,SAAS,CAAC,OAAO,IAAI,IAAI;IAKzB,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,QAAQ;IAWhB,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,iBAAiB;IAWzB,SAAS,CAAC,MAAM;CAoDjB"}
|