@progressive-development/pd-forms 0.9.1 → 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 +56 -62
- package/dist/base/pd-base-input-element.d.ts +10 -10
- package/dist/base/pd-base-input-element.d.ts.map +1 -1
- package/dist/base/pd-base-input-element.js +8 -1
- package/dist/base/pd-base-ui-input.d.ts +41 -16
- package/dist/base/pd-base-ui-input.d.ts.map +1 -1
- package/dist/base/pd-base-ui-input.js +25 -6
- package/dist/base/pd-base-ui.d.ts.map +1 -1
- package/dist/base/pd-base-ui.js +1 -20
- package/dist/generated/locales/be.d.ts +3 -0
- package/dist/generated/locales/be.d.ts.map +1 -1
- package/dist/generated/locales/de.d.ts +3 -0
- package/dist/generated/locales/de.d.ts.map +1 -1
- package/dist/generated/locales/en.d.ts +3 -0
- package/dist/generated/locales/en.d.ts.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/locales/be.js +4 -1
- package/dist/locales/de.js +4 -1
- package/dist/locales/en.js +4 -1
- package/dist/pd-button/PdButton.d.ts +171 -37
- package/dist/pd-button/PdButton.d.ts.map +1 -1
- package/dist/pd-button/PdButton.js +502 -71
- package/dist/pd-button/pd-button.stories.d.ts +82 -10
- package/dist/pd-button/pd-button.stories.d.ts.map +1 -1
- package/dist/pd-button-group/PdButtonGroup.d.ts +25 -0
- package/dist/pd-button-group/PdButtonGroup.d.ts.map +1 -1
- package/dist/pd-button-group/PdButtonGroup.js +52 -27
- package/dist/pd-button-group/pd-button-group.stories.d.ts +42 -17
- package/dist/pd-button-group/pd-button-group.stories.d.ts.map +1 -1
- package/dist/pd-button-select-group/PdButtonSelectGroup.d.ts +17 -3
- package/dist/pd-button-select-group/PdButtonSelectGroup.d.ts.map +1 -1
- package/dist/pd-button-select-group/PdButtonSelectGroup.js +23 -19
- package/dist/pd-button-select-group/pd-button-select-group.stories.d.ts +43 -18
- package/dist/pd-button-select-group/pd-button-select-group.stories.d.ts.map +1 -1
- package/dist/pd-checkbox/PdCheckbox.d.ts +23 -2
- package/dist/pd-checkbox/PdCheckbox.d.ts.map +1 -1
- package/dist/pd-checkbox/PdCheckbox.js +85 -21
- package/dist/pd-checkbox/pd-checkbox.stories.d.ts +43 -27
- package/dist/pd-checkbox/pd-checkbox.stories.d.ts.map +1 -1
- package/dist/pd-form-container/PdFormContainer.d.ts +30 -9
- package/dist/pd-form-container/PdFormContainer.d.ts.map +1 -1
- package/dist/pd-form-container/PdFormContainer.js +59 -8
- package/dist/pd-form-container/pd-form-container.stories.d.ts +49 -0
- package/dist/pd-form-container/pd-form-container.stories.d.ts.map +1 -0
- package/dist/pd-form-field/PdFormField.d.ts +35 -0
- package/dist/pd-form-field/PdFormField.d.ts.map +1 -0
- package/dist/pd-form-field/PdFormField.js +38 -0
- package/dist/pd-form-field/pd-form-field.d.ts +3 -0
- package/dist/pd-form-field/pd-form-field.d.ts.map +1 -0
- package/dist/pd-form-field/pd-form-field.stories.d.ts +40 -0
- package/dist/pd-form-field/pd-form-field.stories.d.ts.map +1 -0
- package/dist/pd-form-field.d.ts +2 -0
- package/dist/pd-form-field.js +8 -0
- package/dist/pd-form-fieldset/PdFormFieldset.d.ts +144 -0
- package/dist/pd-form-fieldset/PdFormFieldset.d.ts.map +1 -0
- package/dist/pd-form-fieldset/PdFormFieldset.js +364 -0
- package/dist/pd-form-fieldset/index.d.ts +2 -0
- package/dist/pd-form-fieldset/index.d.ts.map +1 -0
- package/dist/pd-form-fieldset/pd-form-fieldset.d.ts +3 -0
- package/dist/pd-form-fieldset/pd-form-fieldset.d.ts.map +1 -0
- package/dist/pd-form-fieldset/pd-form-fieldset.js +8 -0
- package/dist/pd-form-fieldset/pd-form-fieldset.stories.d.ts +38 -0
- package/dist/pd-form-fieldset/pd-form-fieldset.stories.d.ts.map +1 -0
- package/dist/pd-form-row/PdFormRow.d.ts +35 -5
- package/dist/pd-form-row/PdFormRow.d.ts.map +1 -1
- package/dist/pd-form-row/PdFormRow.js +135 -69
- package/dist/pd-form-row/pd-form-row.stories.d.ts +41 -25
- package/dist/pd-form-row/pd-form-row.stories.d.ts.map +1 -1
- package/dist/pd-generic-form/PdGenericForm.d.ts +50 -0
- package/dist/pd-generic-form/PdGenericForm.d.ts.map +1 -0
- package/dist/pd-generic-form/PdGenericForm.js +334 -0
- package/dist/pd-generic-form/pd-generic-form.d.ts +3 -0
- package/dist/pd-generic-form/pd-generic-form.d.ts.map +1 -0
- package/dist/pd-generic-form/pd-generic-form.stories.d.ts +35 -0
- package/dist/pd-generic-form/pd-generic-form.stories.d.ts.map +1 -0
- package/dist/pd-generic-form/pd-generic-form.styles.d.ts +2 -0
- package/dist/pd-generic-form/pd-generic-form.styles.d.ts.map +1 -0
- package/dist/pd-generic-form/pd-generic-form.styles.js +110 -0
- package/dist/pd-generic-form/pd-generic-form.test.d.ts +1 -0
- package/dist/pd-generic-form/pd-generic-form.test.d.ts.map +1 -0
- package/dist/pd-generic-form.d.ts +2 -0
- package/dist/pd-generic-form.js +8 -0
- package/dist/pd-hover-box/PdHoverBox.d.ts +61 -11
- package/dist/pd-hover-box/PdHoverBox.d.ts.map +1 -1
- package/dist/pd-hover-box/PdHoverBox.js +130 -28
- package/dist/pd-hover-box/pd-hover-box.stories.d.ts +28 -5
- package/dist/pd-hover-box/pd-hover-box.stories.d.ts.map +1 -1
- package/dist/pd-input/PdComboboxInput.d.ts +20 -0
- package/dist/pd-input/PdComboboxInput.d.ts.map +1 -0
- package/dist/pd-input/PdComboboxInput.js +67 -0
- package/dist/pd-input/PdInput.d.ts +33 -15
- package/dist/pd-input/PdInput.d.ts.map +1 -1
- package/dist/pd-input/PdInput.js +49 -21
- package/dist/pd-input/pd-input.stories.d.ts +71 -35
- package/dist/pd-input/pd-input.stories.d.ts.map +1 -1
- package/dist/pd-input-area/PdInputArea.d.ts +19 -6
- package/dist/pd-input-area/PdInputArea.d.ts.map +1 -1
- package/dist/pd-input-area/PdInputArea.js +17 -15
- package/dist/pd-input-area/pd-input-area.stories.d.ts +65 -52
- package/dist/pd-input-area/pd-input-area.stories.d.ts.map +1 -1
- package/dist/pd-input-file/PdInputFile.d.ts +24 -0
- package/dist/pd-input-file/PdInputFile.d.ts.map +1 -1
- package/dist/pd-input-file/PdInputFile.js +53 -22
- package/dist/pd-input-file/pd-input-file.stories.d.ts +51 -47
- package/dist/pd-input-file/pd-input-file.stories.d.ts.map +1 -1
- package/dist/pd-input-time/PdInputTime.d.ts +21 -0
- package/dist/pd-input-time/PdInputTime.d.ts.map +1 -1
- package/dist/pd-input-time/PdInputTime.js +48 -22
- package/dist/pd-input-time/pd-input-time.stories.d.ts +94 -0
- package/dist/pd-input-time/pd-input-time.stories.d.ts.map +1 -0
- package/dist/pd-panel-button/PdPanelButton.d.ts +50 -34
- package/dist/pd-panel-button/PdPanelButton.d.ts.map +1 -1
- package/dist/pd-panel-button/PdPanelButton.js +149 -265
- package/dist/pd-panel-button/pd-panel-button.stories.d.ts +55 -25
- package/dist/pd-panel-button/pd-panel-button.stories.d.ts.map +1 -1
- package/dist/pd-radio-group/PdRadioGroup.d.ts +14 -0
- package/dist/pd-radio-group/PdRadioGroup.d.ts.map +1 -1
- package/dist/pd-radio-group/PdRadioGroup.js +48 -11
- package/dist/pd-radio-group/pd-radio-group.stories.d.ts +37 -7
- package/dist/pd-radio-group/pd-radio-group.stories.d.ts.map +1 -1
- package/dist/pd-range/PdRange.d.ts +22 -2
- package/dist/pd-range/PdRange.d.ts.map +1 -1
- package/dist/pd-range/PdRange.js +54 -43
- package/dist/pd-range/pd-range.stories.d.ts +49 -7
- package/dist/pd-range/pd-range.stories.d.ts.map +1 -1
- package/dist/pd-select/PdSelect.d.ts +16 -4
- package/dist/pd-select/PdSelect.d.ts.map +1 -1
- package/dist/pd-select/PdSelect.js +23 -21
- package/dist/pd-select/pd-select.stories.d.ts +56 -35
- package/dist/pd-select/pd-select.stories.d.ts.map +1 -1
- package/dist/pd-suggestion-box/PdSuggestionBox.d.ts +74 -0
- package/dist/pd-suggestion-box/PdSuggestionBox.d.ts.map +1 -0
- package/dist/pd-suggestion-box/PdSuggestionBox.js +277 -0
- package/dist/pd-suggestion-box/PdSuggestionPanel.d.ts +42 -0
- package/dist/pd-suggestion-box/PdSuggestionPanel.d.ts.map +1 -0
- package/dist/pd-suggestion-box/PdSuggestionPanel.js +227 -0
- package/dist/pd-suggestion-box/pd-suggestion-box.d.ts +3 -0
- package/dist/pd-suggestion-box/pd-suggestion-box.d.ts.map +1 -0
- package/dist/pd-suggestion-box/pd-suggestion-box.stories.d.ts +79 -0
- package/dist/pd-suggestion-box/pd-suggestion-box.stories.d.ts.map +1 -0
- package/dist/pd-suggestion-box.d.ts +2 -0
- package/dist/pd-suggestion-box.js +8 -0
- package/dist/pd-utils/dist/position-helper.js +35 -0
- package/dist/stories/pd-forms-overview.stories.d.ts +48 -0
- package/dist/stories/pd-forms-overview.stories.d.ts.map +1 -0
- package/dist/stories/story-helpers.d.ts +10 -0
- package/dist/stories/story-helpers.d.ts.map +1 -0
- package/dist/styles/shared-input-field-styles.d.ts.map +1 -1
- package/dist/styles/shared-input-field-styles.js +13 -19
- package/dist/styles/shared-input-styles.d.ts.map +1 -1
- package/dist/styles/shared-input-styles.js +18 -14
- package/dist/types.d.ts +11 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +12 -5
- package/dist/pd-form-container/form-container.stories.d.ts +0 -28
- package/dist/pd-form-container/form-container.stories.d.ts.map +0 -1
- package/dist/pd-form-container/form-container2.stories.d.ts +0 -8
- package/dist/pd-form-container/form-container2.stories.d.ts.map +0 -1
- package/dist/pd-form-container/form-container3.stories.d.ts +0 -11
- package/dist/pd-form-container/form-container3.stories.d.ts.map +0 -1
- package/dist/stories/01_index.stories.d.ts +0 -58
- package/dist/stories/01_index.stories.d.ts.map +0 -1
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
import { css, html } from 'lit';
|
|
2
|
-
import { property, state } from 'lit/decorators.js';
|
|
3
|
-
import '@progressive-development/pd-icon/pd-icon';
|
|
4
|
-
import { PdBaseUI } from '../base/pd-base-ui.js';
|
|
5
|
-
import { PdColorStyles, PdFontStyles } from '@progressive-development/pd-shared-styles';
|
|
1
|
+
import { css, html, nothing } from 'lit';
|
|
2
|
+
import { property, state, query } from 'lit/decorators.js';
|
|
6
3
|
import { pdIcons } from '@progressive-development/pd-icon';
|
|
4
|
+
import { PdButton } from '../pd-button/PdButton.js';
|
|
7
5
|
|
|
8
6
|
var __defProp = Object.defineProperty;
|
|
9
7
|
var __decorateClass = (decorators, target, key, kind) => {
|
|
@@ -14,174 +12,58 @@ var __decorateClass = (decorators, target, key, kind) => {
|
|
|
14
12
|
if (result) __defProp(target, key, result);
|
|
15
13
|
return result;
|
|
16
14
|
};
|
|
17
|
-
|
|
15
|
+
let panelIdCounter = 0;
|
|
16
|
+
class PdPanelButton extends PdButton {
|
|
18
17
|
constructor() {
|
|
19
18
|
super(...arguments);
|
|
20
|
-
this.buttonText = "Ok";
|
|
21
|
-
this.panelButton = false;
|
|
22
|
-
this.loading = false;
|
|
23
|
-
this.selected = false;
|
|
24
|
-
this.primary = false;
|
|
25
|
-
this.disableOnClickTime = -1;
|
|
26
19
|
this.hideClose = false;
|
|
27
|
-
this.
|
|
20
|
+
this.up = false;
|
|
21
|
+
this.right = false;
|
|
28
22
|
this._panelOpen = false;
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
23
|
+
/** @ignore - Unique ID for aria-controls */
|
|
24
|
+
this._panelId = `pd-panel-${++panelIdCounter}`;
|
|
25
|
+
/** @ignore - Bound method reference for event listener cleanup */
|
|
26
|
+
this._boundClosePanel = this._closePanel.bind(this);
|
|
27
|
+
/** @ignore - Bound method reference for keyboard event listener */
|
|
28
|
+
this._boundHandleKeyDown = this._handlePanelKeyDown.bind(this);
|
|
32
29
|
}
|
|
33
30
|
static {
|
|
31
|
+
// ============================================================================
|
|
32
|
+
// STYLES (Panel-specific only - Button styles inherited from PdButton)
|
|
33
|
+
// ============================================================================
|
|
34
34
|
this.styles = [
|
|
35
|
-
|
|
36
|
-
PdFontStyles,
|
|
35
|
+
PdButton.styles,
|
|
37
36
|
css`
|
|
38
37
|
:host {
|
|
39
|
-
display: inline-block; /* Verhindert, dass :host die volle Breite bekommt */
|
|
40
38
|
position: relative;
|
|
41
39
|
}
|
|
42
40
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
41
|
+
/* Toggle arrow icon styling - inherits color from .button-icon in PdButton */
|
|
42
|
+
.toggle-icon {
|
|
43
|
+
margin-left: calc(0.25rem * var(--pd-button-scale, 1));
|
|
46
44
|
}
|
|
47
45
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
display: inline-flex;
|
|
55
|
-
align-items: center;
|
|
56
|
-
justify-content: var(--pd-icon-button-justify, center);
|
|
57
|
-
gap: var(--pd-icon-button-gap, 0.5rem);
|
|
58
|
-
|
|
59
|
-
height: var(--pd-icon-button-height, auto);
|
|
60
|
-
line-height: var(--pd-icon-button-line-height, 1);
|
|
61
|
-
padding: var(--pd-icon-button-padding, 0 1rem);
|
|
62
|
-
|
|
63
|
-
background: var(
|
|
64
|
-
--pd-icon-button-bg,
|
|
65
|
-
#58a linear-gradient(hsla(0, 0%, 100%, 0.2), transparent)
|
|
66
|
-
);
|
|
67
|
-
background-color: var(--pd-icon-button-bgcol, var(--pd-default-col));
|
|
68
|
-
border: 1px solid
|
|
69
|
-
var(--pd-icon-button-bordercol, var(--pd-default-dark-col));
|
|
70
|
-
border-radius: var(--pd-icon-button-border-radius, 0.2em);
|
|
71
|
-
transition: background-color 0.3s ease;
|
|
72
|
-
|
|
73
|
-
vertical-align: middle;
|
|
74
|
-
text-align: center;
|
|
75
|
-
|
|
76
|
-
color: var(--pd-icon-button-txtcol, var(--pd-secondary-light-col));
|
|
77
|
-
--pd-icon-col: var(
|
|
78
|
-
--pd-icon-button-txtcol,
|
|
79
|
-
var(--pd-secondary-light-col)
|
|
80
|
-
);
|
|
81
|
-
--pd-icon-col-active: var(
|
|
82
|
-
--pd-icon-button-txtcol,
|
|
83
|
-
var(--pd-secondary-light-col)
|
|
84
|
-
);
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
.button-text {
|
|
88
|
-
text-shadow: 0 -0.05em 0.05em rgba(0, 0, 0, 0.5);
|
|
89
|
-
font-size: var(--pd-icon-button-font-size, 1.5rem);
|
|
90
|
-
font-weight: bold;
|
|
91
|
-
font-family: var(--pd-default-font-title-family);
|
|
92
|
-
padding: 0.55rem 0;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
.button-icon {
|
|
96
|
-
padding: 0.3rem 0;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
.toggle-button {
|
|
100
|
-
padding-left: var(--pd-icon-button-gap, 0.5rem);
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
.loader {
|
|
104
|
-
border: 12px solid var(--pd-secondary-col);
|
|
105
|
-
border-top: 12px solid var(--pd-secondary-light-col);
|
|
106
|
-
border-radius: 50%;
|
|
107
|
-
width: 10px;
|
|
108
|
-
height: 10px;
|
|
109
|
-
animation: spin 2s linear infinite;
|
|
110
|
-
|
|
111
|
-
margin: 0.3rem 0.1rem 0.3rem 0;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
:host(:not([disabled]):not([_timerDisabled])) .icon-button-style:hover {
|
|
115
|
-
background-color: var(
|
|
116
|
-
--pd-icon-button-bgcol-hover,
|
|
117
|
-
var(--pd-default-hover-col)
|
|
118
|
-
);
|
|
119
|
-
cursor: pointer;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
:host([disabled]) .icon-button-style,
|
|
123
|
-
:host([_timerDisabled]) .icon-button-style {
|
|
124
|
-
background: linear-gradient(
|
|
125
|
-
to bottom,
|
|
126
|
-
#e0e0e0,
|
|
127
|
-
#c4c4c4
|
|
128
|
-
); /* Matte, deaktivierte Optik */
|
|
129
|
-
color: var(--pd-default-disabled-dark-col);
|
|
130
|
-
--pd-icon-col: var(--pd-default-disabled-dark-col);
|
|
131
|
-
--pd-icon-col-active: var(--pd-default-disabled-dark-col);
|
|
132
|
-
border-color: var(--pd-default-disabled-col);
|
|
133
|
-
cursor: not-allowed;
|
|
134
|
-
opacity: 0.6; /* Leichter "inaktiv"-Effekt */
|
|
135
|
-
text-shadow: none;
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
:host(:not([disabled]):not([_timerDisabled])[primary])
|
|
139
|
-
.icon-button-style {
|
|
140
|
-
background-color: var(
|
|
141
|
-
--pd-icon-button-primary-bgcol,
|
|
142
|
-
var(--pd-secondary-col)
|
|
143
|
-
);
|
|
144
|
-
color: var(--pd-icon-button-primary-txtcol, var(--pd-default-dark-col));
|
|
145
|
-
--pd-icon-col: var(
|
|
146
|
-
--pd-icon-button-primary-txtcol,
|
|
147
|
-
var(--pd-default-dark-col)
|
|
148
|
-
);
|
|
149
|
-
--pd-icon-col-active: var(
|
|
150
|
-
--pd-icon-button-primary-txtcol,
|
|
151
|
-
var(--pd-default-dark-col)
|
|
152
|
-
);
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
:host(:not([disabled]):not([_timerDisabled])[primary])
|
|
156
|
-
.icon-button-style:hover {
|
|
157
|
-
background-color: var(--pd-default-hover-col);
|
|
158
|
-
cursor: pointer;
|
|
46
|
+
/* Icon-only panel button: reduce padding since we have icon + toggle arrow */
|
|
47
|
+
:host([icon-only]) button {
|
|
48
|
+
padding: calc(0.5rem * var(--pd-button-scale, 1));
|
|
49
|
+
aspect-ratio: auto;
|
|
50
|
+
min-width: auto;
|
|
159
51
|
}
|
|
160
52
|
|
|
53
|
+
/* Panel container */
|
|
161
54
|
.panel {
|
|
162
55
|
position: absolute;
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
--pd-icon-button-panel-min-width,
|
|
166
|
-
auto
|
|
167
|
-
); /* Panel wird so breit wie der Button */
|
|
168
|
-
max-width: var(
|
|
169
|
-
--pd-icon-button-panel-max-width,
|
|
170
|
-
300px
|
|
171
|
-
); /* Optional: Maximale Breite */
|
|
172
|
-
|
|
56
|
+
min-width: var(--pd-panel-min-width, auto);
|
|
57
|
+
max-width: var(--pd-panel-max-width, 300px);
|
|
173
58
|
transform: scaleY(0);
|
|
174
|
-
background: var(
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
);
|
|
178
|
-
border-radius: 5px;
|
|
179
|
-
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
|
|
59
|
+
background: var(--pd-panel-bg-col, var(--pd-default-bg-col));
|
|
60
|
+
border-radius: var(--pd-radius-lg);
|
|
61
|
+
box-shadow: var(--pd-shadow-md);
|
|
180
62
|
transition:
|
|
181
63
|
transform 0.2s ease-out,
|
|
182
64
|
opacity 0.2s ease-out;
|
|
183
65
|
opacity: 0;
|
|
184
|
-
z-index:
|
|
66
|
+
z-index: var(--pd-panel-z-index, 100);
|
|
185
67
|
}
|
|
186
68
|
|
|
187
69
|
.panel.open {
|
|
@@ -190,10 +72,11 @@ class PdPanelButton extends PdBaseUI {
|
|
|
190
72
|
}
|
|
191
73
|
|
|
192
74
|
.panel-content {
|
|
193
|
-
padding: var(--pd-panel-
|
|
75
|
+
padding: var(--pd-panel-padding, 1rem);
|
|
194
76
|
min-height: 50px;
|
|
195
77
|
}
|
|
196
78
|
|
|
79
|
+
/* Close button in panel */
|
|
197
80
|
.close-button {
|
|
198
81
|
position: absolute;
|
|
199
82
|
top: 5px;
|
|
@@ -208,103 +91,107 @@ class PdPanelButton extends PdBaseUI {
|
|
|
208
91
|
transition: color 0.2s ease-in-out;
|
|
209
92
|
}
|
|
210
93
|
|
|
211
|
-
.close-button:hover {
|
|
212
|
-
|
|
94
|
+
button.close-button:hover:not(:disabled) {
|
|
95
|
+
background: transparent;
|
|
96
|
+
color: var(--pd-default-hover-col);
|
|
213
97
|
}
|
|
214
98
|
|
|
215
|
-
/*
|
|
99
|
+
/* Panel positioning variants */
|
|
100
|
+
|
|
101
|
+
/* Default: opens downward, left-aligned */
|
|
216
102
|
:host(:not([right]):not([up])) .panel {
|
|
217
|
-
left: 0;
|
|
218
|
-
top: 100%;
|
|
219
|
-
transform-origin: top;
|
|
103
|
+
left: 0;
|
|
104
|
+
top: 100%;
|
|
105
|
+
transform-origin: top;
|
|
220
106
|
}
|
|
221
107
|
|
|
222
|
-
/*
|
|
108
|
+
/* Right-aligned, opens downward */
|
|
223
109
|
:host([right]:not([up])) .panel {
|
|
224
|
-
right: 0;
|
|
110
|
+
right: 0;
|
|
225
111
|
top: 100%;
|
|
226
112
|
transform-origin: top right;
|
|
227
113
|
}
|
|
228
114
|
|
|
229
|
-
/*
|
|
115
|
+
/* Left-aligned, opens upward */
|
|
230
116
|
:host(:not([right])[up]) .panel {
|
|
231
117
|
left: 0;
|
|
232
|
-
bottom: 100%;
|
|
118
|
+
bottom: 100%;
|
|
233
119
|
transform-origin: bottom;
|
|
234
120
|
}
|
|
235
121
|
|
|
236
|
-
/*
|
|
122
|
+
/* Right-aligned, opens upward */
|
|
237
123
|
:host([right][up]) .panel {
|
|
238
124
|
right: 0;
|
|
239
|
-
bottom: 100%;
|
|
125
|
+
bottom: 100%;
|
|
240
126
|
transform-origin: bottom right;
|
|
241
127
|
}
|
|
242
|
-
|
|
243
|
-
:host([selected]:not([disabled]):not([_timerDisabled]))
|
|
244
|
-
.icon-button-style {
|
|
245
|
-
background-color: var(
|
|
246
|
-
--pd-icon-button-selected-bgcol,
|
|
247
|
-
var(--pd-secondary-light-col)
|
|
248
|
-
);
|
|
249
|
-
color: var(--pd-icon-button-selected-txtcol, var(--pd-default-col));
|
|
250
|
-
--pd-icon-col: var(
|
|
251
|
-
--pd-icon-button-selected-txtcol,
|
|
252
|
-
var(--pd-default-col)
|
|
253
|
-
);
|
|
254
|
-
box-shadow: var(
|
|
255
|
-
--pd-icon-button-selected-shadow,
|
|
256
|
-
inset 0 2px 6px rgba(0, 0, 0, 0.4),
|
|
257
|
-
0 0 0 2px rgba(0, 0, 0, 0.1)
|
|
258
|
-
);
|
|
259
|
-
text-shadow: none;
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
@keyframes spin {
|
|
263
|
-
0% {
|
|
264
|
-
transform: rotate(0deg);
|
|
265
|
-
}
|
|
266
|
-
100% {
|
|
267
|
-
transform: rotate(360deg);
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
128
|
`
|
|
271
129
|
];
|
|
272
130
|
}
|
|
131
|
+
// ============================================================================
|
|
132
|
+
// LIFECYCLE
|
|
133
|
+
// ============================================================================
|
|
273
134
|
connectedCallback() {
|
|
274
135
|
super.connectedCallback();
|
|
275
|
-
window.addEventListener("close-button-panel-event", this.
|
|
136
|
+
window.addEventListener("close-button-panel-event", this._boundClosePanel);
|
|
137
|
+
window.addEventListener("keydown", this._boundHandleKeyDown);
|
|
276
138
|
}
|
|
277
139
|
disconnectedCallback() {
|
|
278
|
-
window.removeEventListener(
|
|
140
|
+
window.removeEventListener(
|
|
141
|
+
"close-button-panel-event",
|
|
142
|
+
this._boundClosePanel
|
|
143
|
+
);
|
|
144
|
+
window.removeEventListener("keydown", this._boundHandleKeyDown);
|
|
279
145
|
super.disconnectedCallback();
|
|
280
146
|
}
|
|
281
|
-
//
|
|
282
|
-
|
|
147
|
+
// ============================================================================
|
|
148
|
+
// ARIA ATTRIBUTE OVERRIDES
|
|
149
|
+
// ============================================================================
|
|
150
|
+
get buttonAriaExpanded() {
|
|
151
|
+
return this._panelOpen ? "true" : "false";
|
|
152
|
+
}
|
|
153
|
+
get buttonAriaHasPopup() {
|
|
154
|
+
return "true";
|
|
155
|
+
}
|
|
156
|
+
get buttonAriaControls() {
|
|
157
|
+
return this._panelId;
|
|
158
|
+
}
|
|
159
|
+
// ============================================================================
|
|
160
|
+
// RENDER OVERRIDES
|
|
161
|
+
// ============================================================================
|
|
162
|
+
/**
|
|
163
|
+
* Renders the toggle arrow inside the button (as suffix content).
|
|
164
|
+
* Uses activeIcon to switch between up/down arrow states.
|
|
165
|
+
* activeIcon=true shows arrow up (panel open), activeIcon=false shows arrow down (panel closed).
|
|
166
|
+
*/
|
|
167
|
+
renderSuffixContent() {
|
|
168
|
+
return html`
|
|
169
|
+
<pd-icon
|
|
170
|
+
icon="${pdIcons.ICON_TOOGLE_ARROW}"
|
|
171
|
+
?activeIcon="${!this._panelOpen}"
|
|
172
|
+
class="button-icon toggle-icon"
|
|
173
|
+
></pd-icon>
|
|
174
|
+
`;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Renders the dropdown panel after the button.
|
|
178
|
+
*/
|
|
179
|
+
renderAfterButton() {
|
|
283
180
|
return html`
|
|
284
181
|
<div
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
182
|
+
id="${this._panelId}"
|
|
183
|
+
class="panel ${this._panelOpen ? "open" : ""}"
|
|
184
|
+
role="menu"
|
|
185
|
+
aria-hidden="${!this._panelOpen}"
|
|
186
|
+
?inert="${!this._panelOpen}"
|
|
290
187
|
>
|
|
291
|
-
${this.
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
${this.panelButton ? html` <pd-icon
|
|
299
|
-
icon=${pdIcons.ICON_TOOGLE_ARROW}
|
|
300
|
-
?activeIcon=${!this._panelOpen}
|
|
301
|
-
class="small toggle-button"
|
|
302
|
-
></pd-icon>` : ""}
|
|
303
|
-
</div>
|
|
304
|
-
|
|
305
|
-
<div class="panel ${this._panelOpen ? "open" : ""}">
|
|
306
|
-
${this.hideClose ? "" : html`
|
|
307
|
-
<button class="close-button" @click="${this._togglePanel}">
|
|
188
|
+
${this.hideClose ? nothing : html`
|
|
189
|
+
<button
|
|
190
|
+
class="close-button"
|
|
191
|
+
@click="${this._togglePanel}"
|
|
192
|
+
@keydown="${this._handleCloseButtonKeyDown}"
|
|
193
|
+
aria-label="Close panel"
|
|
194
|
+
>
|
|
308
195
|
×
|
|
309
196
|
</button>
|
|
310
197
|
`}
|
|
@@ -314,72 +201,69 @@ class PdPanelButton extends PdBaseUI {
|
|
|
314
201
|
</div>
|
|
315
202
|
`;
|
|
316
203
|
}
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
if (this.
|
|
204
|
+
// ============================================================================
|
|
205
|
+
// EVENT HANDLERS (Override)
|
|
206
|
+
// ============================================================================
|
|
207
|
+
/**
|
|
208
|
+
* Override: Click toggles the panel instead of emitting button-clicked.
|
|
209
|
+
*/
|
|
210
|
+
handleClick() {
|
|
211
|
+
if (!this.disabled && !this.loading) {
|
|
325
212
|
this._togglePanel();
|
|
326
|
-
} else {
|
|
327
|
-
if (this.disableOnClickTime > 0) {
|
|
328
|
-
this._timerDisabled = true;
|
|
329
|
-
window.setTimeout(() => {
|
|
330
|
-
this._timerDisabled = false;
|
|
331
|
-
}, this.disableOnClickTime);
|
|
332
|
-
}
|
|
333
|
-
this.dispatchEvent(
|
|
334
|
-
new CustomEvent("button-clicked", {
|
|
335
|
-
detail: this.value,
|
|
336
|
-
bubbles: true,
|
|
337
|
-
composed: true
|
|
338
|
-
})
|
|
339
|
-
);
|
|
340
213
|
}
|
|
341
214
|
}
|
|
215
|
+
// ============================================================================
|
|
216
|
+
// PUBLIC METHODS
|
|
217
|
+
// ============================================================================
|
|
218
|
+
/** Focuses the internal button element. */
|
|
219
|
+
focus() {
|
|
220
|
+
this._buttonEl?.focus();
|
|
221
|
+
}
|
|
222
|
+
// ============================================================================
|
|
223
|
+
// PRIVATE METHODS
|
|
224
|
+
// ============================================================================
|
|
225
|
+
_closePanel() {
|
|
226
|
+
this._panelOpen = false;
|
|
227
|
+
}
|
|
342
228
|
_togglePanel() {
|
|
343
229
|
this._panelOpen = !this._panelOpen;
|
|
344
230
|
this.dispatchEvent(
|
|
345
231
|
new CustomEvent("panel-button-toggled", {
|
|
346
|
-
detail: { open: this._panelOpen }
|
|
232
|
+
detail: { open: this._panelOpen },
|
|
233
|
+
bubbles: true,
|
|
234
|
+
composed: true
|
|
347
235
|
})
|
|
348
236
|
);
|
|
349
237
|
}
|
|
238
|
+
/** Handles Escape key to close the panel */
|
|
239
|
+
_handlePanelKeyDown(e) {
|
|
240
|
+
if (e.key === "Escape" && this._panelOpen) {
|
|
241
|
+
this._closePanel();
|
|
242
|
+
this._buttonEl?.focus();
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
/** Handles keyboard events on the close button */
|
|
246
|
+
_handleCloseButtonKeyDown(e) {
|
|
247
|
+
if (e.key === "Enter" || e.key === " ") {
|
|
248
|
+
e.preventDefault();
|
|
249
|
+
this._togglePanel();
|
|
250
|
+
}
|
|
251
|
+
}
|
|
350
252
|
}
|
|
351
253
|
__decorateClass([
|
|
352
|
-
property({ type:
|
|
353
|
-
], PdPanelButton.prototype, "
|
|
354
|
-
__decorateClass([
|
|
355
|
-
property({ type: String })
|
|
356
|
-
], PdPanelButton.prototype, "buttonText");
|
|
357
|
-
__decorateClass([
|
|
358
|
-
property({ type: String })
|
|
359
|
-
], PdPanelButton.prototype, "value");
|
|
360
|
-
__decorateClass([
|
|
361
|
-
property({ type: Boolean })
|
|
362
|
-
], PdPanelButton.prototype, "panelButton");
|
|
363
|
-
__decorateClass([
|
|
364
|
-
property({ type: Boolean, reflect: true })
|
|
365
|
-
], PdPanelButton.prototype, "loading");
|
|
366
|
-
__decorateClass([
|
|
367
|
-
property({ type: Boolean, reflect: true })
|
|
368
|
-
], PdPanelButton.prototype, "selected");
|
|
254
|
+
property({ type: Boolean, attribute: "hide-close" })
|
|
255
|
+
], PdPanelButton.prototype, "hideClose");
|
|
369
256
|
__decorateClass([
|
|
370
257
|
property({ type: Boolean, reflect: true })
|
|
371
|
-
], PdPanelButton.prototype, "
|
|
372
|
-
__decorateClass([
|
|
373
|
-
property({ type: Number })
|
|
374
|
-
], PdPanelButton.prototype, "disableOnClickTime");
|
|
375
|
-
__decorateClass([
|
|
376
|
-
property({ type: Boolean })
|
|
377
|
-
], PdPanelButton.prototype, "hideClose");
|
|
258
|
+
], PdPanelButton.prototype, "up");
|
|
378
259
|
__decorateClass([
|
|
379
260
|
property({ type: Boolean, reflect: true })
|
|
380
|
-
], PdPanelButton.prototype, "
|
|
261
|
+
], PdPanelButton.prototype, "right");
|
|
381
262
|
__decorateClass([
|
|
382
263
|
state()
|
|
383
264
|
], PdPanelButton.prototype, "_panelOpen");
|
|
265
|
+
__decorateClass([
|
|
266
|
+
query("button")
|
|
267
|
+
], PdPanelButton.prototype, "_buttonEl");
|
|
384
268
|
|
|
385
269
|
export { PdPanelButton };
|
|
@@ -1,27 +1,57 @@
|
|
|
1
|
-
import { StoryObj } from '@storybook/web-components';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
import { Meta, StoryObj } from '@storybook/web-components-vite';
|
|
2
|
+
interface PdPanelButtonArgs {
|
|
3
|
+
text: string;
|
|
4
|
+
icon: string;
|
|
5
|
+
primary: boolean;
|
|
6
|
+
disabled: boolean;
|
|
7
|
+
loading: boolean;
|
|
8
|
+
selected: boolean;
|
|
9
|
+
right: boolean;
|
|
10
|
+
up: boolean;
|
|
11
|
+
hideClose: boolean;
|
|
12
|
+
fullWidth: boolean;
|
|
13
|
+
iconPosition: string;
|
|
14
|
+
value: string;
|
|
15
|
+
size: "sm" | "md" | "lg" | "xl";
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* ## pd-panel-button
|
|
19
|
+
*
|
|
20
|
+
* A button with dropdown panel functionality. Extends pd-button with panel support.
|
|
21
|
+
*
|
|
22
|
+
* ### Features
|
|
23
|
+
* - Inherits all pd-button features (icons, states, sizing)
|
|
24
|
+
* - Dropdown panel with configurable position (up/down, left/right)
|
|
25
|
+
* - Toggle arrow indicator
|
|
26
|
+
* - Auto-close via global event
|
|
27
|
+
* - Keyboard accessible (Enter/Space/Escape)
|
|
28
|
+
*
|
|
29
|
+
* ### Accessibility
|
|
30
|
+
* - Inherits all pd-button accessibility features
|
|
31
|
+
* - Panel can be closed via close button, Escape key, or global event
|
|
32
|
+
*
|
|
33
|
+
* ### Usage
|
|
34
|
+
* ```html
|
|
35
|
+
* <pd-panel-button text="Options" icon="settings">
|
|
36
|
+
* <div>Panel content here</div>
|
|
37
|
+
* </pd-panel-button>
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
declare const meta: Meta<PdPanelButtonArgs>;
|
|
8
41
|
export default meta;
|
|
9
|
-
type Story = StoryObj
|
|
10
|
-
|
|
11
|
-
export declare const
|
|
12
|
-
|
|
13
|
-
export declare const
|
|
14
|
-
|
|
15
|
-
export declare const
|
|
16
|
-
|
|
17
|
-
export declare const
|
|
18
|
-
|
|
19
|
-
export declare const
|
|
20
|
-
|
|
21
|
-
export declare const
|
|
22
|
-
|
|
23
|
-
export declare const
|
|
24
|
-
export declare const ButtonSelected: Story;
|
|
25
|
-
export declare const ButtonSelectedWithIcon: Story;
|
|
26
|
-
export declare const ButtonTransparent: Story;
|
|
42
|
+
type Story = StoryObj<PdPanelButtonArgs>;
|
|
43
|
+
/** Default panel button with text. Interactive via Controls panel. */
|
|
44
|
+
export declare const Default: Story;
|
|
45
|
+
/** All panel button variants and states at a glance. */
|
|
46
|
+
export declare const AllVariants: Story;
|
|
47
|
+
/** All size variants displayed together. */
|
|
48
|
+
export declare const AllSizes: Story;
|
|
49
|
+
/** Panel positioning options: right-aligned and upward. */
|
|
50
|
+
export declare const PanelPositions: Story;
|
|
51
|
+
/** Panel with hidden close button. */
|
|
52
|
+
export declare const HiddenCloseButton: Story;
|
|
53
|
+
/** Panel with rich slotted content. */
|
|
54
|
+
export declare const RichContent: Story;
|
|
55
|
+
/** CSS Custom Properties -- Branded and Redesigned variants. */
|
|
56
|
+
export declare const CustomStyling: Story;
|
|
27
57
|
//# sourceMappingURL=pd-panel-button.stories.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pd-panel-button.stories.d.ts","sourceRoot":"","sources":["../../src/pd-panel-button/pd-panel-button.stories.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pd-panel-button.stories.d.ts","sourceRoot":"","sources":["../../src/pd-panel-button/pd-panel-button.stories.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAKrE,OAAO,sBAAsB,CAAC;AAM9B,UAAU,iBAAiB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;IACf,EAAE,EAAE,OAAO,CAAC;IACZ,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;CACjC;AAMD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,iBAAiB,CAyGjC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,iBAAiB,CAAC,CAAC;AAMzC,sEAAsE;AACtE,eAAO,MAAM,OAAO,EAAE,KAIrB,CAAC;AAMF,wDAAwD;AACxD,eAAO,MAAM,WAAW,EAAE,KAuEzB,CAAC;AAMF,4CAA4C;AAC5C,eAAO,MAAM,QAAQ,EAAE,KAqDtB,CAAC;AAMF,2DAA2D;AAC3D,eAAO,MAAM,cAAc,EAAE,KAgD5B,CAAC;AAMF,sCAAsC;AACtC,eAAO,MAAM,iBAAiB,EAAE,KA2B/B,CAAC;AAMF,uCAAuC;AACvC,eAAO,MAAM,WAAW,EAAE,KA4BzB,CAAC;AAMF,gEAAgE;AAChE,eAAO,MAAM,aAAa,EAAE,KAuF3B,CAAC"}
|
|
@@ -1,12 +1,26 @@
|
|
|
1
1
|
import { CSSResultGroup } from 'lit';
|
|
2
2
|
import { PdBaseUIInput } from '../base/pd-base-ui-input.js';
|
|
3
3
|
/**
|
|
4
|
+
* Radio group container for pd-checkbox elements with radio behavior.
|
|
5
|
+
*
|
|
4
6
|
* @tagname pd-radio-group
|
|
7
|
+
*
|
|
8
|
+
* @event validate-form - Fired when selection changes for validation.
|
|
9
|
+
* @event field-change - Fired when selection changes.
|
|
10
|
+
*
|
|
11
|
+
* @slot - pd-checkbox elements to display as radio options.
|
|
12
|
+
*
|
|
13
|
+
* @cssprop --pd-cb-group-gap - Gap between radio options. Default: `20px`.
|
|
14
|
+
* @cssprop --pd-cb-group-direction - Flex direction for layout. Default: `row`.
|
|
15
|
+
* @cssprop --pd-input-label-padding - Label padding. Default: `0`.
|
|
16
|
+
* @cssprop --pd-cb-border-col - Border color for child checkboxes in readonly state. Default: `var(--pd-default-col)`.
|
|
17
|
+
* @cssprop --pd-cb-border-col-readonly - Readonly border color forwarded to child checkboxes. Default: `var(--pd-cb-border-col, var(--pd-default-col))`.
|
|
5
18
|
*/
|
|
6
19
|
export declare class PdRadioGroup extends PdBaseUIInput {
|
|
7
20
|
static styles: CSSResultGroup;
|
|
8
21
|
firstUpdated(): void;
|
|
9
22
|
render(): import('lit').TemplateResult<1>;
|
|
23
|
+
private _onKeyDown;
|
|
10
24
|
private _onInternalBlur;
|
|
11
25
|
private _onInternalFocus;
|
|
12
26
|
private _onInternalChange;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PdRadioGroup.d.ts","sourceRoot":"","sources":["../../src/pd-radio-group/PdRadioGroup.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"PdRadioGroup.d.ts","sourceRoot":"","sources":["../../src/pd-radio-group/PdRadioGroup.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAa,cAAc,EAAE,MAAM,KAAK,CAAC;AAGhD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,YAAa,SAAQ,aAAa;IAC7C,OAAgB,MAAM,EAAE,cAAc,CAmBpC;IAEO,YAAY,IAAI,IAAI;IAyBpB,MAAM;IAwBf,OAAO,CAAC,UAAU;IAkDlB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,iBAAiB;IAqBzB,OAAO,CAAC,mBAAmB;IAS3B,OAAO,CAAC,qBAAqB;CAmB9B"}
|