@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.
Files changed (165) hide show
  1. package/LICENSE +21 -2
  2. package/README.md +56 -62
  3. package/dist/base/pd-base-input-element.d.ts +10 -10
  4. package/dist/base/pd-base-input-element.d.ts.map +1 -1
  5. package/dist/base/pd-base-input-element.js +8 -1
  6. package/dist/base/pd-base-ui-input.d.ts +41 -16
  7. package/dist/base/pd-base-ui-input.d.ts.map +1 -1
  8. package/dist/base/pd-base-ui-input.js +25 -6
  9. package/dist/base/pd-base-ui.d.ts.map +1 -1
  10. package/dist/base/pd-base-ui.js +1 -20
  11. package/dist/generated/locales/be.d.ts +3 -0
  12. package/dist/generated/locales/be.d.ts.map +1 -1
  13. package/dist/generated/locales/de.d.ts +3 -0
  14. package/dist/generated/locales/de.d.ts.map +1 -1
  15. package/dist/generated/locales/en.d.ts +3 -0
  16. package/dist/generated/locales/en.d.ts.map +1 -1
  17. package/dist/index.d.ts +4 -1
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +6 -0
  20. package/dist/locales/be.js +4 -1
  21. package/dist/locales/de.js +4 -1
  22. package/dist/locales/en.js +4 -1
  23. package/dist/pd-button/PdButton.d.ts +171 -37
  24. package/dist/pd-button/PdButton.d.ts.map +1 -1
  25. package/dist/pd-button/PdButton.js +502 -71
  26. package/dist/pd-button/pd-button.stories.d.ts +82 -10
  27. package/dist/pd-button/pd-button.stories.d.ts.map +1 -1
  28. package/dist/pd-button-group/PdButtonGroup.d.ts +25 -0
  29. package/dist/pd-button-group/PdButtonGroup.d.ts.map +1 -1
  30. package/dist/pd-button-group/PdButtonGroup.js +52 -27
  31. package/dist/pd-button-group/pd-button-group.stories.d.ts +42 -17
  32. package/dist/pd-button-group/pd-button-group.stories.d.ts.map +1 -1
  33. package/dist/pd-button-select-group/PdButtonSelectGroup.d.ts +17 -3
  34. package/dist/pd-button-select-group/PdButtonSelectGroup.d.ts.map +1 -1
  35. package/dist/pd-button-select-group/PdButtonSelectGroup.js +23 -19
  36. package/dist/pd-button-select-group/pd-button-select-group.stories.d.ts +43 -18
  37. package/dist/pd-button-select-group/pd-button-select-group.stories.d.ts.map +1 -1
  38. package/dist/pd-checkbox/PdCheckbox.d.ts +23 -2
  39. package/dist/pd-checkbox/PdCheckbox.d.ts.map +1 -1
  40. package/dist/pd-checkbox/PdCheckbox.js +85 -21
  41. package/dist/pd-checkbox/pd-checkbox.stories.d.ts +43 -27
  42. package/dist/pd-checkbox/pd-checkbox.stories.d.ts.map +1 -1
  43. package/dist/pd-form-container/PdFormContainer.d.ts +30 -9
  44. package/dist/pd-form-container/PdFormContainer.d.ts.map +1 -1
  45. package/dist/pd-form-container/PdFormContainer.js +59 -8
  46. package/dist/pd-form-container/pd-form-container.stories.d.ts +49 -0
  47. package/dist/pd-form-container/pd-form-container.stories.d.ts.map +1 -0
  48. package/dist/pd-form-field/PdFormField.d.ts +35 -0
  49. package/dist/pd-form-field/PdFormField.d.ts.map +1 -0
  50. package/dist/pd-form-field/PdFormField.js +38 -0
  51. package/dist/pd-form-field/pd-form-field.d.ts +3 -0
  52. package/dist/pd-form-field/pd-form-field.d.ts.map +1 -0
  53. package/dist/pd-form-field/pd-form-field.stories.d.ts +40 -0
  54. package/dist/pd-form-field/pd-form-field.stories.d.ts.map +1 -0
  55. package/dist/pd-form-field.d.ts +2 -0
  56. package/dist/pd-form-field.js +8 -0
  57. package/dist/pd-form-fieldset/PdFormFieldset.d.ts +144 -0
  58. package/dist/pd-form-fieldset/PdFormFieldset.d.ts.map +1 -0
  59. package/dist/pd-form-fieldset/PdFormFieldset.js +364 -0
  60. package/dist/pd-form-fieldset/index.d.ts +2 -0
  61. package/dist/pd-form-fieldset/index.d.ts.map +1 -0
  62. package/dist/pd-form-fieldset/pd-form-fieldset.d.ts +3 -0
  63. package/dist/pd-form-fieldset/pd-form-fieldset.d.ts.map +1 -0
  64. package/dist/pd-form-fieldset/pd-form-fieldset.js +8 -0
  65. package/dist/pd-form-fieldset/pd-form-fieldset.stories.d.ts +38 -0
  66. package/dist/pd-form-fieldset/pd-form-fieldset.stories.d.ts.map +1 -0
  67. package/dist/pd-form-row/PdFormRow.d.ts +35 -5
  68. package/dist/pd-form-row/PdFormRow.d.ts.map +1 -1
  69. package/dist/pd-form-row/PdFormRow.js +135 -69
  70. package/dist/pd-form-row/pd-form-row.stories.d.ts +41 -25
  71. package/dist/pd-form-row/pd-form-row.stories.d.ts.map +1 -1
  72. package/dist/pd-generic-form/PdGenericForm.d.ts +50 -0
  73. package/dist/pd-generic-form/PdGenericForm.d.ts.map +1 -0
  74. package/dist/pd-generic-form/PdGenericForm.js +334 -0
  75. package/dist/pd-generic-form/pd-generic-form.d.ts +3 -0
  76. package/dist/pd-generic-form/pd-generic-form.d.ts.map +1 -0
  77. package/dist/pd-generic-form/pd-generic-form.stories.d.ts +35 -0
  78. package/dist/pd-generic-form/pd-generic-form.stories.d.ts.map +1 -0
  79. package/dist/pd-generic-form/pd-generic-form.styles.d.ts +2 -0
  80. package/dist/pd-generic-form/pd-generic-form.styles.d.ts.map +1 -0
  81. package/dist/pd-generic-form/pd-generic-form.styles.js +110 -0
  82. package/dist/pd-generic-form/pd-generic-form.test.d.ts +1 -0
  83. package/dist/pd-generic-form/pd-generic-form.test.d.ts.map +1 -0
  84. package/dist/pd-generic-form.d.ts +2 -0
  85. package/dist/pd-generic-form.js +8 -0
  86. package/dist/pd-hover-box/PdHoverBox.d.ts +61 -11
  87. package/dist/pd-hover-box/PdHoverBox.d.ts.map +1 -1
  88. package/dist/pd-hover-box/PdHoverBox.js +130 -28
  89. package/dist/pd-hover-box/pd-hover-box.stories.d.ts +28 -5
  90. package/dist/pd-hover-box/pd-hover-box.stories.d.ts.map +1 -1
  91. package/dist/pd-input/PdComboboxInput.d.ts +20 -0
  92. package/dist/pd-input/PdComboboxInput.d.ts.map +1 -0
  93. package/dist/pd-input/PdComboboxInput.js +67 -0
  94. package/dist/pd-input/PdInput.d.ts +33 -15
  95. package/dist/pd-input/PdInput.d.ts.map +1 -1
  96. package/dist/pd-input/PdInput.js +49 -21
  97. package/dist/pd-input/pd-input.stories.d.ts +71 -35
  98. package/dist/pd-input/pd-input.stories.d.ts.map +1 -1
  99. package/dist/pd-input-area/PdInputArea.d.ts +19 -6
  100. package/dist/pd-input-area/PdInputArea.d.ts.map +1 -1
  101. package/dist/pd-input-area/PdInputArea.js +17 -15
  102. package/dist/pd-input-area/pd-input-area.stories.d.ts +65 -52
  103. package/dist/pd-input-area/pd-input-area.stories.d.ts.map +1 -1
  104. package/dist/pd-input-file/PdInputFile.d.ts +24 -0
  105. package/dist/pd-input-file/PdInputFile.d.ts.map +1 -1
  106. package/dist/pd-input-file/PdInputFile.js +53 -22
  107. package/dist/pd-input-file/pd-input-file.stories.d.ts +51 -47
  108. package/dist/pd-input-file/pd-input-file.stories.d.ts.map +1 -1
  109. package/dist/pd-input-time/PdInputTime.d.ts +21 -0
  110. package/dist/pd-input-time/PdInputTime.d.ts.map +1 -1
  111. package/dist/pd-input-time/PdInputTime.js +48 -22
  112. package/dist/pd-input-time/pd-input-time.stories.d.ts +94 -0
  113. package/dist/pd-input-time/pd-input-time.stories.d.ts.map +1 -0
  114. package/dist/pd-panel-button/PdPanelButton.d.ts +50 -34
  115. package/dist/pd-panel-button/PdPanelButton.d.ts.map +1 -1
  116. package/dist/pd-panel-button/PdPanelButton.js +149 -265
  117. package/dist/pd-panel-button/pd-panel-button.stories.d.ts +55 -25
  118. package/dist/pd-panel-button/pd-panel-button.stories.d.ts.map +1 -1
  119. package/dist/pd-radio-group/PdRadioGroup.d.ts +14 -0
  120. package/dist/pd-radio-group/PdRadioGroup.d.ts.map +1 -1
  121. package/dist/pd-radio-group/PdRadioGroup.js +48 -11
  122. package/dist/pd-radio-group/pd-radio-group.stories.d.ts +37 -7
  123. package/dist/pd-radio-group/pd-radio-group.stories.d.ts.map +1 -1
  124. package/dist/pd-range/PdRange.d.ts +22 -2
  125. package/dist/pd-range/PdRange.d.ts.map +1 -1
  126. package/dist/pd-range/PdRange.js +54 -43
  127. package/dist/pd-range/pd-range.stories.d.ts +49 -7
  128. package/dist/pd-range/pd-range.stories.d.ts.map +1 -1
  129. package/dist/pd-select/PdSelect.d.ts +16 -4
  130. package/dist/pd-select/PdSelect.d.ts.map +1 -1
  131. package/dist/pd-select/PdSelect.js +23 -21
  132. package/dist/pd-select/pd-select.stories.d.ts +56 -35
  133. package/dist/pd-select/pd-select.stories.d.ts.map +1 -1
  134. package/dist/pd-suggestion-box/PdSuggestionBox.d.ts +74 -0
  135. package/dist/pd-suggestion-box/PdSuggestionBox.d.ts.map +1 -0
  136. package/dist/pd-suggestion-box/PdSuggestionBox.js +277 -0
  137. package/dist/pd-suggestion-box/PdSuggestionPanel.d.ts +42 -0
  138. package/dist/pd-suggestion-box/PdSuggestionPanel.d.ts.map +1 -0
  139. package/dist/pd-suggestion-box/PdSuggestionPanel.js +227 -0
  140. package/dist/pd-suggestion-box/pd-suggestion-box.d.ts +3 -0
  141. package/dist/pd-suggestion-box/pd-suggestion-box.d.ts.map +1 -0
  142. package/dist/pd-suggestion-box/pd-suggestion-box.stories.d.ts +79 -0
  143. package/dist/pd-suggestion-box/pd-suggestion-box.stories.d.ts.map +1 -0
  144. package/dist/pd-suggestion-box.d.ts +2 -0
  145. package/dist/pd-suggestion-box.js +8 -0
  146. package/dist/pd-utils/dist/position-helper.js +35 -0
  147. package/dist/stories/pd-forms-overview.stories.d.ts +48 -0
  148. package/dist/stories/pd-forms-overview.stories.d.ts.map +1 -0
  149. package/dist/stories/story-helpers.d.ts +10 -0
  150. package/dist/stories/story-helpers.d.ts.map +1 -0
  151. package/dist/styles/shared-input-field-styles.d.ts.map +1 -1
  152. package/dist/styles/shared-input-field-styles.js +13 -19
  153. package/dist/styles/shared-input-styles.d.ts.map +1 -1
  154. package/dist/styles/shared-input-styles.js +18 -14
  155. package/dist/types.d.ts +11 -0
  156. package/dist/types.d.ts.map +1 -1
  157. package/package.json +12 -5
  158. package/dist/pd-form-container/form-container.stories.d.ts +0 -28
  159. package/dist/pd-form-container/form-container.stories.d.ts.map +0 -1
  160. package/dist/pd-form-container/form-container2.stories.d.ts +0 -8
  161. package/dist/pd-form-container/form-container2.stories.d.ts.map +0 -1
  162. package/dist/pd-form-container/form-container3.stories.d.ts +0 -11
  163. package/dist/pd-form-container/form-container3.stories.d.ts.map +0 -1
  164. package/dist/stories/01_index.stories.d.ts +0 -58
  165. 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
- class PdPanelButton extends PdBaseUI {
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._timerDisabled = false;
20
+ this.up = false;
21
+ this.right = false;
28
22
  this._panelOpen = false;
29
- this._closePanel = () => {
30
- this._panelOpen = false;
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
- PdColorStyles,
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
- :host([disabled]),
44
- :host([_timerDisabled]) {
45
- pointer-events: none;
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
- .icon-button-style {
49
- --pd-icon-size: var(--pd-icon-button-size, 32px);
50
- box-sizing: border-box;
51
- width: var(--pd-icon-button-width, auto);
52
- z-index: 6;
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
- min-width: var(
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
- --pd-icon-button-panel-bg-col,
176
- var(--pd-default-bg-col)
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: 5;
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-button-panel-padding, 1rem);
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
- color: var(--pd-default-darkest-col);
94
+ button.close-button:hover:not(:disabled) {
95
+ background: transparent;
96
+ color: var(--pd-default-hover-col);
213
97
  }
214
98
 
215
- /* Standard (nach unten öffnend, linksbündig) */
99
+ /* Panel positioning variants */
100
+
101
+ /* Default: opens downward, left-aligned */
216
102
  :host(:not([right]):not([up])) .panel {
217
- left: 0; /* Panel beginnt exakt unter dem Button */
218
- top: 100%; /* Panel öffnet sich nach unten */
219
- transform-origin: top; /* Wächst nach unten */
103
+ left: 0;
104
+ top: 100%;
105
+ transform-origin: top;
220
106
  }
221
107
 
222
- /* Standard (nach unten öffnend, rechtsbündig) */
108
+ /* Right-aligned, opens downward */
223
109
  :host([right]:not([up])) .panel {
224
- right: 0; /* Panel beginnt rechtsbündig am Button */
110
+ right: 0;
225
111
  top: 100%;
226
112
  transform-origin: top right;
227
113
  }
228
114
 
229
- /* Panel öffnet sich nach OBEN (links ausgerichtet) */
115
+ /* Left-aligned, opens upward */
230
116
  :host(:not([right])[up]) .panel {
231
117
  left: 0;
232
- bottom: 100%; /* Panel öffnet sich nach oben */
118
+ bottom: 100%;
233
119
  transform-origin: bottom;
234
120
  }
235
121
 
236
- /* Panel öffnet sich nach OBEN (rechts ausgerichtet) */
122
+ /* Right-aligned, opens upward */
237
123
  :host([right][up]) .panel {
238
124
  right: 0;
239
- bottom: 100%; /* Panel öffnet sich nach oben */
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._closePanel);
136
+ window.addEventListener("close-button-panel-event", this._boundClosePanel);
137
+ window.addEventListener("keydown", this._boundHandleKeyDown);
276
138
  }
277
139
  disconnectedCallback() {
278
- window.removeEventListener("close-button-panel-event", this._closePanel);
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
- // ${this._daySyncDisabled ? "element-hint" : ""} => for div class
282
- render() {
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
- class="icon-button-style"
286
- role="button"
287
- tabindex="0"
288
- @click="${this._buttonClicked}"
289
- @keydown="${this._onKeyDown}"
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.loading ? html`<div class="loader"></div>` : this.pdButtonIcon ? html`
292
- <pd-icon
293
- class="button-icon action-icon-color"
294
- icon="${this.pdButtonIcon}"
295
- ></pd-icon>
296
- ` : ""}
297
- ${this.buttonText ? html`<span class="button-text">${this.buttonText}</span>` : ""}
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
  &times;
309
196
  </button>
310
197
  `}
@@ -314,72 +201,69 @@ class PdPanelButton extends PdBaseUI {
314
201
  </div>
315
202
  `;
316
203
  }
317
- _onKeyDown(event) {
318
- if (event.key === "Enter" || event.key === " ") {
319
- event.preventDefault();
320
- this._buttonClicked();
321
- }
322
- }
323
- _buttonClicked() {
324
- if (this.panelButton) {
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: String })
353
- ], PdPanelButton.prototype, "pdButtonIcon");
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, "primary");
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, "_timerDisabled");
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
- declare const meta: {
3
- title: string;
4
- component: string;
5
- render: (args: import('@storybook/web-components').Args) => import('lit').TemplateResult<1>;
6
- tags: string[];
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
- export declare const DefaultButton: Story;
11
- export declare const DefaulIcontButton: Story;
12
- export declare const DefaulIcontButtonDisabled: Story;
13
- export declare const DefaulIcontButtonTimerDisabled: Story;
14
- export declare const DefaulIcontButtonLoading: Story;
15
- export declare const DefaulIcontButtonPrimary: Story;
16
- export declare const DefaulIcontButtonPrimaryWithPanel: Story;
17
- export declare const DefaulIcontButtonPrimaryDisabled: Story;
18
- export declare const DefaulTextIcontButton: Story;
19
- export declare const PanelButton: Story;
20
- export declare const PanelButtonWithContent: Story;
21
- export declare const PanelButtonWithContentRight: Story;
22
- export declare const PanelButtonWithContentUp: Story;
23
- export declare const PanelButtonWithContentRightUp: Story;
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":"AACA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAEhE,OAAO,sBAAsB,CAAC;AAI9B,QAAA,MAAM,IAAI;;;;;CAoBM,CAAC;AAEjB,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC;AAGtB,eAAO,MAAM,aAAa,EAAE,KAK3B,CAAC;AAGF,eAAO,MAAM,iBAAiB,EAAE,KAO/B,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,KAQvC,CAAC;AAEF,eAAO,MAAM,8BAA8B,EAAE,KAQ5C,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,KAQtC,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,KAQtC,CAAC;AAEF,eAAO,MAAM,iCAAiC,EAAE,KAQ/C,CAAC;AAEF,eAAO,MAAM,gCAAgC,EAAE,KAS9C,CAAC;AAGF,eAAO,MAAM,qBAAqB,EAAE,KAMnC,CAAC;AAGF,eAAO,MAAM,WAAW,EAAE,KAOzB,CAAC;AAGF,eAAO,MAAM,sBAAsB,EAAE,KAgBpC,CAAC;AAGF,eAAO,MAAM,2BAA2B,EAAE,KAiBzC,CAAC;AAGF,eAAO,MAAM,wBAAwB,EAAE,KAiBtC,CAAC;AAGF,eAAO,MAAM,6BAA6B,EAAE,KAkB3C,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KAuB5B,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,KAwBpC,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,KAgH/B,CAAC"}
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;;;;;;;;;GASG;AAEH,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;IAmBf,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,iBAAiB;IAqBzB,OAAO,CAAC,mBAAmB;IAS3B,OAAO,CAAC,qBAAqB;CAmB9B"}
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"}