@chayns-ui/core 0.5.0 → 0.7.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 (125) hide show
  1. package/README.md +9 -3
  2. package/dist/accordion.css +66 -2
  3. package/dist/badge.css +3 -3
  4. package/dist/banner.css +89 -0
  5. package/dist/button.css +16 -2
  6. package/dist/card.css +29 -2
  7. package/dist/checkbox.css +24 -13
  8. package/dist/combo-box.css +20 -2
  9. package/dist/components/accordion/Accordion.d.ts +10 -2
  10. package/dist/components/accordion/Accordion.d.ts.map +1 -1
  11. package/dist/components/accordion/Accordion.js +120 -46
  12. package/dist/components/accordion/Accordion.js.map +1 -1
  13. package/dist/components/accordion/Accordion.types.d.ts +24 -1
  14. package/dist/components/accordion/Accordion.types.d.ts.map +1 -1
  15. package/dist/components/accordion/Accordion.types.js +6 -0
  16. package/dist/components/accordion/Accordion.types.js.map +1 -0
  17. package/dist/components/accordion/AccordionContext.d.ts +9 -0
  18. package/dist/components/accordion/AccordionContext.d.ts.map +1 -1
  19. package/dist/components/accordion/AccordionContext.js +8 -2
  20. package/dist/components/accordion/AccordionContext.js.map +1 -1
  21. package/dist/components/accordion-group/AccordionGroup.d.ts +1 -1
  22. package/dist/components/accordion-group/AccordionGroup.d.ts.map +1 -1
  23. package/dist/components/accordion-group/AccordionGroup.js +3 -3
  24. package/dist/components/accordion-group/AccordionGroup.js.map +1 -1
  25. package/dist/components/avatar/Avatar.js +1 -1
  26. package/dist/components/avatar-group/AvatarGroup.js +1 -1
  27. package/dist/components/badge/Badge.js +1 -1
  28. package/dist/components/banner/Banner.d.ts +3 -0
  29. package/dist/components/banner/Banner.d.ts.map +1 -0
  30. package/dist/components/banner/Banner.js +46 -0
  31. package/dist/components/banner/Banner.js.map +1 -0
  32. package/dist/components/banner/Banner.types.d.ts +24 -0
  33. package/dist/components/banner/Banner.types.d.ts.map +1 -0
  34. package/dist/components/banner/Banner.types.js +11 -0
  35. package/dist/components/banner/Banner.types.js.map +1 -0
  36. package/dist/components/button/Button.d.ts +1 -1
  37. package/dist/components/button/Button.d.ts.map +1 -1
  38. package/dist/components/button/Button.js +8 -3
  39. package/dist/components/button/Button.js.map +1 -1
  40. package/dist/components/button/Button.types.d.ts +15 -11
  41. package/dist/components/button/Button.types.d.ts.map +1 -1
  42. package/dist/components/button/Button.types.js.map +1 -1
  43. package/dist/components/button/button-icon/ButtonIcon.d.ts.map +1 -1
  44. package/dist/components/button/button-icon/ButtonIcon.js +18 -12
  45. package/dist/components/button/button-icon/ButtonIcon.js.map +1 -1
  46. package/dist/components/card/Card.d.ts +4 -2
  47. package/dist/components/card/Card.d.ts.map +1 -1
  48. package/dist/components/card/Card.js +24 -8
  49. package/dist/components/card/Card.js.map +1 -1
  50. package/dist/components/card/Card.types.d.ts +10 -12
  51. package/dist/components/card/Card.types.d.ts.map +1 -1
  52. package/dist/components/checkbox/Checkbox.d.ts +1 -1
  53. package/dist/components/checkbox/Checkbox.d.ts.map +1 -1
  54. package/dist/components/checkbox/Checkbox.js +15 -6
  55. package/dist/components/checkbox/Checkbox.js.map +1 -1
  56. package/dist/components/checkbox/Checkbox.types.d.ts +2 -0
  57. package/dist/components/checkbox/Checkbox.types.d.ts.map +1 -1
  58. package/dist/components/combo-box/ComboBox.d.ts.map +1 -1
  59. package/dist/components/combo-box/ComboBox.js +19 -2
  60. package/dist/components/combo-box/ComboBox.js.map +1 -1
  61. package/dist/components/date-time-picker/DateTimePicker.d.ts +4 -0
  62. package/dist/components/date-time-picker/DateTimePicker.d.ts.map +1 -0
  63. package/dist/components/date-time-picker/DateTimePicker.js +339 -0
  64. package/dist/components/date-time-picker/DateTimePicker.js.map +1 -0
  65. package/dist/components/date-time-picker/DateTimePicker.types.d.ts +26 -0
  66. package/dist/components/date-time-picker/DateTimePicker.types.d.ts.map +1 -0
  67. package/dist/components/date-time-picker/DateTimePicker.types.js +12 -0
  68. package/dist/components/date-time-picker/DateTimePicker.types.js.map +1 -0
  69. package/dist/components/icon-button/IconButton.d.ts +7 -2
  70. package/dist/components/icon-button/IconButton.d.ts.map +1 -1
  71. package/dist/components/icon-button/IconButton.js +8 -3
  72. package/dist/components/icon-button/IconButton.js.map +1 -1
  73. package/dist/components/icon-button/IconButton.types.d.ts +7 -4
  74. package/dist/components/icon-button/IconButton.types.d.ts.map +1 -1
  75. package/dist/components/list/List.js +1 -1
  76. package/dist/components/popup/Popup.js +1 -1
  77. package/dist/components/popup/PopupList.js +1 -1
  78. package/dist/components/radio-group/RadioGroup.d.ts.map +1 -1
  79. package/dist/components/radio-group/RadioGroup.js +17 -8
  80. package/dist/components/radio-group/RadioGroup.js.map +1 -1
  81. package/dist/components/radio-group/RadioGroup.types.d.ts +5 -3
  82. package/dist/components/radio-group/RadioGroup.types.d.ts.map +1 -1
  83. package/dist/components/segmented-control/SegmentedControl.d.ts.map +1 -1
  84. package/dist/components/segmented-control/SegmentedControl.js +12 -5
  85. package/dist/components/segmented-control/SegmentedControl.js.map +1 -1
  86. package/dist/components/segmented-control/SegmentedControl.types.d.ts +5 -2
  87. package/dist/components/segmented-control/SegmentedControl.types.d.ts.map +1 -1
  88. package/dist/components/split-button/SplitButton.d.ts +1 -1
  89. package/dist/components/split-button/SplitButton.d.ts.map +1 -1
  90. package/dist/components/split-button/SplitButton.js +9 -17
  91. package/dist/components/split-button/SplitButton.js.map +1 -1
  92. package/dist/components/switch/Switch.d.ts +1 -1
  93. package/dist/components/switch/Switch.d.ts.map +1 -1
  94. package/dist/components/switch/Switch.js +13 -5
  95. package/dist/components/switch/Switch.js.map +1 -1
  96. package/dist/components/switch/Switch.types.d.ts +2 -0
  97. package/dist/components/switch/Switch.types.d.ts.map +1 -1
  98. package/dist/components/text-area/TextArea.d.ts +1 -1
  99. package/dist/components/text-area/TextArea.d.ts.map +1 -1
  100. package/dist/components/text-area/TextArea.js +5 -4
  101. package/dist/components/text-area/TextArea.js.map +1 -1
  102. package/dist/components/text-field/TextField.d.ts +1 -1
  103. package/dist/components/text-field/TextField.d.ts.map +1 -1
  104. package/dist/components/text-field/TextField.js +5 -4
  105. package/dist/components/text-field/TextField.js.map +1 -1
  106. package/dist/date-time-picker.css +121 -0
  107. package/dist/index.d.ts +9 -5
  108. package/dist/index.d.ts.map +1 -1
  109. package/dist/index.js +6 -2
  110. package/dist/list.css +4 -4
  111. package/dist/radio-group.css +13 -1
  112. package/dist/segmented-control.css +24 -7
  113. package/dist/split-button.css +1 -1
  114. package/dist/styles.css +2 -1
  115. package/dist/switch.css +18 -5
  116. package/dist/text-area.css +2 -2
  117. package/dist/text-field.css +1 -1
  118. package/package.json +3 -2
  119. package/dist/components/message-box/MessageBox.d.ts +0 -4
  120. package/dist/components/message-box/MessageBox.d.ts.map +0 -1
  121. package/dist/components/message-box/MessageBox.js +0 -19
  122. package/dist/components/message-box/MessageBox.js.map +0 -1
  123. package/dist/components/message-box/MessageBox.types.d.ts +0 -13
  124. package/dist/components/message-box/MessageBox.types.d.ts.map +0 -1
  125. package/dist/message-box.css +0 -26
package/README.md CHANGED
@@ -36,11 +36,11 @@ import '@chayns-ui/core/button.css';
36
36
 
37
37
  | Import | CSS-Export |
38
38
  |---|---|
39
- | `Button`, `IconButton` | `@chayns-ui/core/button.css` |
39
+ | `Button`, `IconButton`, `SplitButton` | `@chayns-ui/core/button.css`, `@chayns-ui/core/split-button.css` |
40
40
  | `Card` | `@chayns-ui/core/card.css` |
41
- | `Avatar`, `AvatarGroup` | `@chayns-ui/core/avatar.css` |
41
+ | `Avatar`, `AvatarGroup`, `Badge`, `Banner` | matching CSS exports |
42
42
  | `List` | `@chayns-ui/core/list.css` |
43
- | `TextField`, `TextArea`, `Checkbox`, `Switch`, `RadioGroup`, `SegmentedControl`, `MessageBox` | their matching CSS export |
43
+ | `TextField`, `TextArea`, `Checkbox`, `Switch`, `RadioGroup`, `SegmentedControl`, `Banner`, `ComboBox` | matching CSS exports |
44
44
  | `Accordion`, `AccordionGroup` | `@chayns-ui/core/accordion.css` |
45
45
  | `Popup`, `PopupList` | `@chayns-ui/core/popup.css` |
46
46
  | `SplitButton` | `@chayns-ui/core/split-button.css` |
@@ -50,6 +50,12 @@ Alternativ lädt `@chayns-ui/core/styles.css` das gebündelte CSS aller Komponen
50
50
  `ListItem` wurde vor 1.0 durch `List.Item` ersetzt. Komponiere Zeilen mit
51
51
  `List.Item.Action`, `List.Item.Body`, `List.Item.Title` und optionalen Slots.
52
52
 
53
+ `ComboBox` unterstützt Single-Select und Multi-Select. `TextField` und
54
+ `TextArea` akzeptieren native `type`- beziehungsweise `autoComplete`-Werte,
55
+ einschließlich `type="password"`; eine Sichtbarkeitsumschaltung ist kein Teil
56
+ des Core-Vertrags. `Badge` ist ein statischer Statusindikator, während
57
+ `Banner` ein optional schließbares Statusmuster ist.
58
+
53
59
  ## Hinweise
54
60
 
55
61
  Die Bibliothek lädt keine Fonts, injiziert kein CSS und kalibriert keine
@@ -45,6 +45,12 @@
45
45
  cursor: pointer;
46
46
  }
47
47
 
48
+ .chayns-accordion--list > .chayns-accordion__header {
49
+ gap: var(--k12);
50
+ padding: var(--k12) var(--k16);
51
+ transition: background 0.16s ease;
52
+ }
53
+
48
54
  .chayns-accordion--wrapped > .chayns-accordion__header {
49
55
  gap: var(--k10);
50
56
  padding: var(--k10) var(--k12);
@@ -80,7 +86,47 @@
80
86
  color: var(--text);
81
87
  }
82
88
 
83
- .chayns-accordion--open > .chayns-accordion__header > .chayns-accordion__title {
89
+ .chayns-accordion__head-content {
90
+ display: flex;
91
+ min-inline-size: 0;
92
+ flex: 1;
93
+ flex-direction: column;
94
+ }
95
+
96
+ .chayns-accordion__subtitle {
97
+ overflow: hidden;
98
+ color: var(--text-3);
99
+ font-size: var(--fs-meta);
100
+ text-overflow: ellipsis;
101
+ white-space: nowrap;
102
+ }
103
+
104
+ .chayns-accordion__leading {
105
+ display: inline-flex;
106
+ inline-size: var(--k32);
107
+ block-size: var(--k32);
108
+ flex: none;
109
+ align-items: center;
110
+ justify-content: center;
111
+ overflow: hidden;
112
+ }
113
+
114
+ .chayns-accordion--list .chayns-accordion__leading {
115
+ inline-size: var(--k38);
116
+ block-size: var(--k38);
117
+ }
118
+
119
+ .chayns-accordion--list .chayns-accordion__leading > .chayns-avatar--small {
120
+ inline-size: var(--k38);
121
+ block-size: var(--k38);
122
+ }
123
+
124
+ .chayns-accordion__leading > * {
125
+ max-inline-size: 100%;
126
+ max-block-size: 100%;
127
+ }
128
+
129
+ .chayns-accordion--open .chayns-accordion__title {
84
130
  font-weight: 600;
85
131
  }
86
132
 
@@ -112,6 +158,18 @@
112
158
  color: var(--text-3);
113
159
  }
114
160
 
161
+ .chayns-accordion--has-leading .chayns-accordion__content {
162
+ padding-inline-start: calc(var(--k16) + var(--k16) + var(--k12) + var(--k32) + var(--k12));
163
+ }
164
+
165
+ .chayns-accordion--list .chayns-accordion__content {
166
+ padding: 0 var(--k16) var(--k14) calc(var(--k16) + var(--k16) + var(--k12));
167
+ }
168
+
169
+ .chayns-accordion--wrapped.chayns-accordion--has-leading .chayns-accordion__content {
170
+ padding-inline-start: calc(var(--k12) + var(--k14) + var(--k10) + var(--k32) + var(--k10));
171
+ }
172
+
115
173
  .chayns-accordion--wrapped
116
174
  > .chayns-accordion__panel
117
175
  > .chayns-accordion__inner
@@ -127,10 +185,16 @@
127
185
  color: var(--muted);
128
186
  }
129
187
 
130
- .chayns-accordion--disabled > .chayns-accordion__header > .chayns-accordion__title {
188
+ .chayns-accordion--disabled .chayns-accordion__title {
131
189
  color: var(--muted);
132
190
  }
133
191
 
192
+ .chayns-accordion--list.chayns-accordion--open
193
+ > .chayns-accordion__header
194
+ .chayns-accordion__title {
195
+ font-weight: 500;
196
+ }
197
+
134
198
  @media (hover: hover) {
135
199
  .chayns-accordion__header:not(:disabled):hover {
136
200
  background: var(--hover);
package/dist/badge.css CHANGED
@@ -31,16 +31,16 @@
31
31
  .chayns-badge--success {
32
32
  /* stylelint-disable-next-line custom-property-pattern */
33
33
  background: var(--success-bg);
34
- color: var(--text);
34
+ color: var(--success);
35
35
  }
36
36
 
37
37
  .chayns-badge--warning {
38
38
  background: var(--warning-bg);
39
- color: var(--text);
39
+ color: var(--warning);
40
40
  }
41
41
 
42
42
  .chayns-badge--danger {
43
43
  background: var(--danger-bg);
44
- color: var(--text);
44
+ color: var(--danger);
45
45
  }
46
46
  }
@@ -0,0 +1,89 @@
1
+ @layer chayns.components {
2
+ .chayns-banner {
3
+ box-sizing: border-box;
4
+ display: flex;
5
+ align-items: center;
6
+ gap: var(--k13);
7
+ inline-size: 100%;
8
+ padding: var(--k13) var(--k16);
9
+ border: 1px solid var(--border);
10
+ border-radius: 12px;
11
+ background: var(--surface-alt);
12
+ color: var(--text);
13
+ }
14
+
15
+ .chayns-banner--success {
16
+ /* stylelint-disable-next-line custom-property-pattern */
17
+ border-color: var(--success);
18
+ /* stylelint-disable-next-line custom-property-pattern */
19
+ background: var(--success-bg);
20
+ }
21
+
22
+ .chayns-banner--neutral {
23
+ border-color: var(--accent-300);
24
+ }
25
+
26
+ .chayns-banner--warning {
27
+ border-color: var(--warning);
28
+ background: var(--warning-bg);
29
+ }
30
+
31
+ .chayns-banner--danger {
32
+ border-color: var(--danger);
33
+ background: var(--danger-bg);
34
+ }
35
+
36
+ .chayns-banner__icon {
37
+ display: inline-flex;
38
+ flex: none;
39
+ align-items: center;
40
+ justify-content: center;
41
+ inline-size: var(--icon-lg);
42
+ block-size: var(--icon-lg);
43
+ color: var(--accent);
44
+ }
45
+
46
+ .chayns-banner--success .chayns-banner__icon {
47
+ /* stylelint-disable-next-line custom-property-pattern */
48
+ color: var(--success);
49
+ }
50
+
51
+ .chayns-banner--warning .chayns-banner__icon {
52
+ color: var(--warning);
53
+ }
54
+
55
+ .chayns-banner--danger .chayns-banner__icon {
56
+ color: var(--danger);
57
+ }
58
+
59
+ .chayns-banner__content {
60
+ min-inline-size: 0;
61
+ flex: 1;
62
+ }
63
+
64
+ .chayns-banner__close {
65
+ display: inline-flex;
66
+ flex: none;
67
+ align-items: center;
68
+ justify-content: center;
69
+ inline-size: var(--k28);
70
+ block-size: var(--k28);
71
+ margin-block-start: 0;
72
+ padding: 0;
73
+ border: 0;
74
+ border-radius: 50%;
75
+ background: transparent;
76
+ color: var(--text-2);
77
+ cursor: pointer;
78
+ }
79
+
80
+ .chayns-banner__close:hover {
81
+ background: var(--hover);
82
+ color: var(--text);
83
+ }
84
+
85
+ .chayns-banner__close:focus-visible {
86
+ outline: var(--focus-ring-size) solid rgb(var(--focus-ring-rgb), var(--focus-ring-alpha-strong));
87
+ outline-offset: 2px;
88
+ }
89
+ }
package/dist/button.css CHANGED
@@ -65,11 +65,11 @@
65
65
  }
66
66
 
67
67
  :where(.chayns-button, .chayns-icon-button):active:not(:disabled) {
68
- transform: scale(0.97);
68
+ transform: scale(0.96);
69
69
  }
70
70
 
71
71
  :where(.chayns-icon-button):active:not(:disabled) {
72
- transform: scale(0.9);
72
+ transform: scale(0.96);
73
73
  }
74
74
 
75
75
  :where(.chayns-button--primary, .chayns-icon-button--primary):active:not(:disabled) {
@@ -135,6 +135,10 @@
135
135
  display: none;
136
136
  }
137
137
 
138
+ :where(.chayns-button--loading, .chayns-icon-button--loading) .chayns-button-icon {
139
+ animation: chayns-button-spin 0.8s linear infinite;
140
+ }
141
+
138
142
  :where(.chayns-button, .chayns-icon-button):active:not(:disabled)
139
143
  .chayns-button-icon__weight:not(.chayns-button-icon__weight--active) {
140
144
  display: none;
@@ -203,5 +207,15 @@
203
207
  :where(.chayns-button, .chayns-icon-button) {
204
208
  transition: none;
205
209
  }
210
+
211
+ :where(.chayns-button--loading, .chayns-icon-button--loading) .chayns-button-icon {
212
+ animation: none;
213
+ }
214
+ }
215
+
216
+ @keyframes chayns-button-spin {
217
+ to {
218
+ transform: rotate(360deg);
219
+ }
206
220
  }
207
221
  }
package/dist/card.css CHANGED
@@ -2,12 +2,39 @@
2
2
  .chayns-card {
3
3
  box-sizing: border-box;
4
4
  display: block;
5
+ padding: var(--k16);
5
6
  background: var(--surface);
6
7
  border: 1px solid var(--border);
7
8
  border-radius: 16px;
8
9
  }
9
10
 
10
- .chayns-card--elevated {
11
- box-shadow: var(--shadow-card);
11
+ .chayns-card__header {
12
+ display: flex;
13
+ align-items: center;
14
+ gap: var(--k12);
15
+ margin-block-end: var(--k12);
16
+ color: var(--text);
17
+ font-size: var(--fs-body);
18
+ font-weight: 600;
19
+ }
20
+
21
+ .chayns-card__header-icon {
22
+ display: inline-grid;
23
+ inline-size: var(--k32);
24
+ block-size: var(--k32);
25
+ flex: none;
26
+ place-items: center;
27
+ border-radius: 8px;
28
+ background: var(--surface-alt);
29
+ }
30
+
31
+ .chayns-card__header-content {
32
+ min-inline-size: 0;
33
+ }
34
+
35
+ @media (hover: hover) {
36
+ .chayns-card:hover {
37
+ box-shadow: var(--shadow-hover);
38
+ }
12
39
  }
13
40
  }
package/dist/checkbox.css CHANGED
@@ -1,7 +1,7 @@
1
1
  @layer chayns.components {
2
2
  .chayns-checkbox {
3
3
  display: inline-flex;
4
- align-items: flex-start;
4
+ align-items: center;
5
5
  gap: var(--k12);
6
6
  margin: 0;
7
7
  color: var(--text);
@@ -20,25 +20,24 @@
20
20
 
21
21
  .chayns-checkbox__control {
22
22
  box-sizing: border-box;
23
- display: inline-grid;
23
+ display: inline-flex;
24
24
  inline-size: var(--k20);
25
25
  block-size: var(--k20);
26
26
  flex: none;
27
- place-items: center;
27
+ align-items: center;
28
+ justify-content: center;
28
29
  margin-block-start: 1px;
29
30
  border: 2px solid var(--input-border);
30
31
  border-radius: 6px;
31
32
  background: transparent;
33
+ color: var(--on-accent);
34
+ font-size: var(--fs-micro);
35
+ transition: all 0.15s ease;
32
36
  }
33
37
 
34
- .chayns-checkbox__control::after {
35
- inline-size: calc(var(--k8) - 2px);
36
- block-size: var(--k12);
37
- border-inline-end: 2px solid var(--on-accent);
38
- border-block-end: 2px solid var(--on-accent);
39
- content: '';
38
+ .chayns-checkbox__control > i {
40
39
  opacity: 0;
41
- transform: rotate(45deg) scale(0.6);
40
+ transform: scale(0.4);
42
41
  transition:
43
42
  opacity 0.12s ease,
44
43
  transform 0.18s cubic-bezier(0.22, 0.61, 0.36, 1);
@@ -49,9 +48,9 @@
49
48
  background: var(--accent);
50
49
  }
51
50
 
52
- .chayns-checkbox__input:checked + .chayns-checkbox__control::after {
51
+ .chayns-checkbox__input:checked + .chayns-checkbox__control > i {
53
52
  opacity: 1;
54
- transform: rotate(45deg) scale(1);
53
+ transform: scale(1);
55
54
  }
56
55
 
57
56
  .chayns-checkbox__input:focus-visible + .chayns-checkbox__control {
@@ -75,8 +74,20 @@
75
74
  line-height: 1.4;
76
75
  }
77
76
 
77
+ .chayns-checkbox__content {
78
+ display: grid;
79
+ gap: var(--k2);
80
+ min-inline-size: 0;
81
+ }
82
+
83
+ .chayns-checkbox__description {
84
+ color: var(--text-3);
85
+ font-size: var(--fs-meta);
86
+ line-height: 1.4;
87
+ }
88
+
78
89
  @media (prefers-reduced-motion: reduce) {
79
- .chayns-checkbox__control::after {
90
+ .chayns-checkbox__control > i {
80
91
  transition: none;
81
92
  }
82
93
  }
@@ -8,7 +8,7 @@
8
8
  box-sizing: border-box;
9
9
  inline-size: 100%;
10
10
  min-block-size: calc(1.2em + 2 * var(--input-py) + 3px);
11
- padding: var(--input-py) var(--input-px);
11
+ padding: var(--input-py) var(--k36) var(--input-py) var(--input-px);
12
12
  border: 1.5px solid var(--input-border);
13
13
  border-radius: 10px;
14
14
  background: var(--surface);
@@ -45,6 +45,23 @@
45
45
  white-space: nowrap;
46
46
  }
47
47
 
48
+ .chayns-combo-box__chevron {
49
+ position: absolute;
50
+ inset-block-start: 50%;
51
+ inset-inline-end: var(--input-px);
52
+ display: inline-flex;
53
+ align-items: center;
54
+ justify-content: center;
55
+ color: var(--muted);
56
+ pointer-events: none;
57
+ transform: translateY(-50%);
58
+ transition: transform 0.18s ease;
59
+ }
60
+
61
+ .chayns-combo-box--open .chayns-combo-box__chevron {
62
+ transform: translateY(-50%) rotate(180deg);
63
+ }
64
+
48
65
  .chayns-combo-box--open .chayns-combo-box__label,
49
66
  .chayns-combo-box__input:not(:placeholder-shown) + .chayns-combo-box__label {
50
67
  color: var(--accent);
@@ -137,7 +154,8 @@
137
154
 
138
155
  @media (prefers-reduced-motion: reduce) {
139
156
  .chayns-combo-box__input,
140
- .chayns-combo-box__label {
157
+ .chayns-combo-box__label,
158
+ .chayns-combo-box__chevron {
141
159
  transition: none;
142
160
  }
143
161
  }
@@ -1,4 +1,12 @@
1
- import type { AccordionProps } from './Accordion.types.js';
2
- declare const Accordion: ({ children, className, defaultOpen, disabled, id, onOpenChange, open, ref, title, ...rootProps }: AccordionProps) => import("react").JSX.Element;
1
+ import type { AccordionContentProps, AccordionHeadContentProps, AccordionHeadProps, AccordionPartProps, AccordionProps } from './Accordion.types.js';
2
+ declare function HeadContent({ className, subtitle, title }: AccordionHeadContentProps): import("react").JSX.Element;
3
+ declare const Accordion: import("react").ForwardRefExoticComponent<Omit<AccordionProps, "ref"> & import("react").RefAttributes<HTMLDivElement>> & {
4
+ Content: import("react").ForwardRefExoticComponent<Omit<AccordionContentProps, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
5
+ Head: import("react").ForwardRefExoticComponent<Omit<AccordionHeadProps, "ref"> & import("react").RefAttributes<HTMLButtonElement>> & {
6
+ Content: typeof HeadContent;
7
+ Leading: (props: AccordionPartProps) => import("react").JSX.Element;
8
+ Trailing: (props: AccordionPartProps) => import("react").JSX.Element;
9
+ };
10
+ };
3
11
  export default Accordion;
4
12
  //# sourceMappingURL=Accordion.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Accordion.d.ts","sourceRoot":"","sources":["../../../src/components/accordion/Accordion.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,QAAA,MAAM,SAAS,GAAI,kGAWhB,cAAc,gCAkFhB,CAAC;AAEF,eAAe,SAAS,CAAC"}
1
+ {"version":3,"file":"Accordion.d.ts","sourceRoot":"","sources":["../../../src/components/accordion/Accordion.tsx"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EACV,qBAAqB,EACrB,yBAAyB,EACzB,kBAAkB,EAClB,kBAAkB,EAClB,cAAc,EACf,MAAM,sBAAsB,CAAC;AAgB9B,iBAAS,WAAW,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,yBAAyB,+BAS7E;AA8JD,QAAA,MAAM,SAAS;;;;yBA1Ka,kBAAkB;0BACjB,kBAAkB;;CAgL7C,CAAC;AAEH,eAAe,SAAS,CAAC"}
@@ -1,8 +1,86 @@
1
- import { AccordionDepthContext, AccordionGroupContext } from "./AccordionContext.js";
1
+ import { AccordionDepthContext, AccordionGroupContext, AccordionItemContext, useAccordionItemContext } from "./AccordionContext.js";
2
+ import { Children, createElement, forwardRef, isValidElement, useContext, useId, useState } from "react";
2
3
  import { jsx, jsxs } from "react/jsx-runtime";
3
- import { useContext, useId, useState } from "react";
4
4
  //#region src/components/accordion/Accordion.tsx
5
- var Accordion = ({ children, className, defaultOpen = false, disabled = false, id, onOpenChange, open, ref, title, ...rootProps }) => {
5
+ function Part({ children, className, name }) {
6
+ useAccordionItemContext(name);
7
+ return /* @__PURE__ */ jsx("span", {
8
+ className: [`chayns-accordion__${name.toLowerCase()}`, className].filter(Boolean).join(" "),
9
+ children
10
+ });
11
+ }
12
+ var HeadLeading = (props) => /* @__PURE__ */ jsx(Part, {
13
+ ...props,
14
+ name: "leading"
15
+ });
16
+ var HeadTrailing = (props) => /* @__PURE__ */ jsx(Part, {
17
+ ...props,
18
+ name: "trailing"
19
+ });
20
+ function HeadContent({ className, subtitle, title }) {
21
+ useAccordionItemContext("Head.Content");
22
+ return /* @__PURE__ */ jsxs("span", {
23
+ className: ["chayns-accordion__head-content", className].filter(Boolean).join(" "),
24
+ children: [/* @__PURE__ */ jsx("span", {
25
+ className: "chayns-accordion__title",
26
+ children: title
27
+ }), subtitle ? /* @__PURE__ */ jsx("span", {
28
+ className: "chayns-accordion__subtitle",
29
+ children: subtitle
30
+ }) : null]
31
+ });
32
+ }
33
+ var AccordionHead = forwardRef(function AccordionHead({ children, className, onClick, ...buttonProps }, ref) {
34
+ const { disabled, headerId, isOpen, onToggle, panelId } = useAccordionItemContext("Head");
35
+ function handleClick(event) {
36
+ onClick?.(event);
37
+ if (!event.defaultPrevented) onToggle();
38
+ }
39
+ return /* @__PURE__ */ jsxs("button", {
40
+ ...buttonProps,
41
+ "aria-controls": panelId,
42
+ "aria-expanded": isOpen,
43
+ className: ["chayns-accordion__header", className].filter(Boolean).join(" "),
44
+ disabled,
45
+ id: headerId,
46
+ onClick: handleClick,
47
+ ref,
48
+ type: "button",
49
+ children: [/* @__PURE__ */ jsx("i", {
50
+ "aria-hidden": "true",
51
+ className: "chayns-accordion__chevron far fa-chevron-right"
52
+ }), children]
53
+ });
54
+ });
55
+ var AccordionContent = forwardRef(function AccordionContent({ children, className, ...panelProps }, ref) {
56
+ const depth = useContext(AccordionDepthContext);
57
+ const { headerId, isOpen, panelId } = useAccordionItemContext("Content");
58
+ return /* @__PURE__ */ jsx("div", {
59
+ ...panelProps,
60
+ "aria-hidden": !isOpen,
61
+ "aria-labelledby": headerId,
62
+ className: ["chayns-accordion__panel", className].filter(Boolean).join(" "),
63
+ id: panelId,
64
+ inert: !isOpen,
65
+ ref,
66
+ role: "region",
67
+ style: {
68
+ ...panelProps.style,
69
+ gridTemplateRows: isOpen ? "1fr" : "0fr"
70
+ },
71
+ children: /* @__PURE__ */ jsx("div", {
72
+ className: "chayns-accordion__inner",
73
+ children: /* @__PURE__ */ jsx("div", {
74
+ className: "chayns-accordion__content",
75
+ children: /* @__PURE__ */ jsx(AccordionDepthContext.Provider, {
76
+ value: depth + 1,
77
+ children
78
+ })
79
+ })
80
+ })
81
+ });
82
+ });
83
+ var AccordionRoot = forwardRef(function Accordion({ appearance = "default", children, className, defaultOpen = false, disabled = false, id, leading, onOpenChange, open, subtitle, title, ...rootProps }, ref) {
6
84
  const depth = useContext(AccordionDepthContext);
7
85
  const group = useContext(AccordionGroupContext);
8
86
  const generatedId = useId();
@@ -11,11 +89,10 @@ var Accordion = ({ children, className, defaultOpen = false, disabled = false, i
11
89
  const panelId = `${baseId}-panel`;
12
90
  const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);
13
91
  const isGrouped = group !== null && depth === 0;
14
- let isOpen;
15
- if (isGrouped) isOpen = group.isOpen(baseId);
16
- else if (open !== void 0) isOpen = open;
17
- else isOpen = uncontrolledOpen;
18
- const handleToggle = () => {
92
+ const isOpen = isGrouped ? group.isOpen(baseId) : open ?? uncontrolledOpen;
93
+ const wrapped = depth > 0;
94
+ const isList = appearance === "list";
95
+ function handleToggle() {
19
96
  if (isGrouped) {
20
97
  group.toggle(baseId);
21
98
  return;
@@ -23,55 +100,52 @@ var Accordion = ({ children, className, defaultOpen = false, disabled = false, i
23
100
  const nextOpen = !isOpen;
24
101
  if (open === void 0) setUncontrolledOpen(nextOpen);
25
102
  onOpenChange?.(nextOpen);
26
- };
103
+ }
104
+ const variantClassName = isGrouped ? "chayns-accordion--grouped" : wrapped ? "chayns-accordion--wrapped" : "chayns-accordion--standalone";
105
+ const directChildren = Children.toArray(children);
106
+ const compoundHead = directChildren.find((child) => isValidElement(child) && child.type === AccordionHead);
107
+ const hasCompoundLeading = isValidElement(compoundHead) && Children.toArray(compoundHead.props.children).some((child) => isValidElement(child) && child.type === HeadLeading);
27
108
  const rootClassName = [
28
109
  "chayns-accordion",
29
- isGrouped ? "chayns-accordion--grouped" : depth > 0 ? "chayns-accordion--wrapped" : "chayns-accordion--standalone",
110
+ variantClassName,
30
111
  isOpen ? "chayns-accordion--open" : null,
31
112
  disabled ? "chayns-accordion--disabled" : null,
113
+ leading || hasCompoundLeading ? "chayns-accordion--has-leading" : null,
114
+ isList ? "chayns-accordion--list" : null,
32
115
  className
33
116
  ].filter(Boolean).join(" ");
34
- return /* @__PURE__ */ jsxs("div", {
117
+ const hasCompoundHead = compoundHead !== void 0;
118
+ const compoundContent = directChildren.find((child) => isValidElement(child) && child.type === AccordionContent);
119
+ const hasCompoundContent = compoundContent !== void 0;
120
+ const panelChildren = children;
121
+ return /* @__PURE__ */ jsx("div", {
35
122
  ...rootProps,
36
123
  className: rootClassName,
37
124
  id,
38
125
  ref,
39
- children: [/* @__PURE__ */ jsxs("button", {
40
- "aria-controls": panelId,
41
- "aria-expanded": isOpen,
42
- className: "chayns-accordion__header",
43
- disabled,
44
- id: headerId,
45
- onClick: handleToggle,
46
- type: "button",
47
- children: [/* @__PURE__ */ jsx("i", {
48
- "aria-hidden": "true",
49
- className: "chayns-accordion__chevron far fa-chevron-right"
50
- }), /* @__PURE__ */ jsx("span", {
51
- className: "chayns-accordion__title",
52
- children: title
53
- })]
54
- }), /* @__PURE__ */ jsx("div", {
55
- "aria-hidden": !isOpen,
56
- "aria-labelledby": headerId,
57
- className: "chayns-accordion__panel",
58
- id: panelId,
59
- inert: !isOpen,
60
- role: "region",
61
- style: { gridTemplateRows: isOpen ? "1fr" : "0fr" },
62
- children: /* @__PURE__ */ jsx("div", {
63
- className: "chayns-accordion__inner",
64
- children: /* @__PURE__ */ jsx("div", {
65
- className: "chayns-accordion__content",
66
- children: /* @__PURE__ */ jsx(AccordionDepthContext.Provider, {
67
- value: depth + 1,
68
- children
69
- })
70
- })
71
- })
72
- })]
126
+ children: /* @__PURE__ */ jsxs(AccordionItemContext.Provider, {
127
+ value: {
128
+ disabled,
129
+ headerId,
130
+ isOpen,
131
+ onToggle: handleToggle,
132
+ panelId
133
+ },
134
+ children: [hasCompoundHead ? compoundHead : /* @__PURE__ */ jsxs(AccordionHead, { children: [leading ? /* @__PURE__ */ jsx(HeadLeading, { children: leading }) : null, /* @__PURE__ */ jsx(HeadContent, {
135
+ title,
136
+ subtitle
137
+ })] }), hasCompoundContent ? createElement(AccordionContent, { ...compoundContent.props }) : /* @__PURE__ */ jsx(AccordionContent, { children: panelChildren })]
138
+ })
73
139
  });
74
- };
140
+ });
141
+ var Accordion = Object.assign(AccordionRoot, {
142
+ Content: AccordionContent,
143
+ Head: Object.assign(AccordionHead, {
144
+ Content: HeadContent,
145
+ Leading: HeadLeading,
146
+ Trailing: HeadTrailing
147
+ })
148
+ });
75
149
  //#endregion
76
150
  export { Accordion as default };
77
151