@placeholderco/placeholder-ui 1.0.3 → 1.0.6

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 (136) hide show
  1. package/LICENSE +26 -26
  2. package/README.md +179 -179
  3. package/dist/display/Alert.svelte +179 -179
  4. package/dist/display/Avatar.svelte +166 -166
  5. package/dist/display/LinkCollection.svelte +161 -161
  6. package/dist/display/Paper.svelte +118 -118
  7. package/dist/form/Autocomplete.svelte +223 -191
  8. package/dist/form/Autocomplete.svelte.d.ts +3 -1
  9. package/dist/form/AutocompleteMulti.svelte +356 -0
  10. package/dist/form/AutocompleteMulti.svelte.d.ts +28 -0
  11. package/dist/form/Checkbox.svelte +201 -201
  12. package/dist/form/Chips.svelte +128 -128
  13. package/dist/form/ComboBox.svelte +158 -158
  14. package/dist/form/ComboBox.svelte.d.ts +1 -1
  15. package/dist/form/ComboBoxItemBuilder.svelte +460 -460
  16. package/dist/form/ComboBoxMulti.svelte +197 -197
  17. package/dist/form/ComboBoxMulti.svelte.d.ts +1 -1
  18. package/dist/form/CronBuilder.svelte +693 -693
  19. package/dist/form/DatePicker.svelte +672 -672
  20. package/dist/form/DateTimePicker.svelte +712 -712
  21. package/dist/form/FileInput.svelte +235 -235
  22. package/dist/form/FormGroup.svelte +68 -68
  23. package/dist/form/Number.svelte +238 -238
  24. package/dist/form/PasswordInput.svelte +252 -252
  25. package/dist/form/RadioGroup.svelte +210 -210
  26. package/dist/form/Rating.svelte +235 -235
  27. package/dist/form/SegmentedControl.svelte +149 -149
  28. package/dist/form/Select.svelte +590 -590
  29. package/dist/form/Select.svelte.d.ts +1 -1
  30. package/dist/form/SelectMulti.svelte +613 -613
  31. package/dist/form/SelectMulti.svelte.d.ts +1 -1
  32. package/dist/form/Slider.svelte +358 -358
  33. package/dist/form/Switch.svelte +147 -147
  34. package/dist/form/TextArea.svelte +148 -148
  35. package/dist/form/Textbox.svelte +228 -228
  36. package/dist/form/TimePicker.svelte +267 -267
  37. package/dist/icon/Icon.svelte +52 -52
  38. package/dist/icon/alert-octagon.svg +5 -5
  39. package/dist/icon/alert-triangle.svg +5 -5
  40. package/dist/icon/archive.svg +1 -1
  41. package/dist/icon/arrow-down.svg +1 -1
  42. package/dist/icon/arrow-left.svg +1 -1
  43. package/dist/icon/arrow-right.svg +1 -1
  44. package/dist/icon/arrow-up.svg +1 -1
  45. package/dist/icon/at.svg +1 -1
  46. package/dist/icon/bell.svg +1 -1
  47. package/dist/icon/bookmark.svg +1 -1
  48. package/dist/icon/calendar.svg +1 -1
  49. package/dist/icon/camera.svg +1 -1
  50. package/dist/icon/chart-bar.svg +1 -1
  51. package/dist/icon/chart-line.svg +1 -1
  52. package/dist/icon/chart-pie.svg +1 -1
  53. package/dist/icon/checkbox.svg +1 -1
  54. package/dist/icon/checklist.svg +1 -1
  55. package/dist/icon/circle-check.svg +1 -1
  56. package/dist/icon/circle-x.svg +1 -1
  57. package/dist/icon/clock.svg +1 -1
  58. package/dist/icon/credit-card.svg +1 -1
  59. package/dist/icon/dots-vertical.svg +1 -1
  60. package/dist/icon/dots.svg +1 -1
  61. package/dist/icon/external-link.svg +1 -1
  62. package/dist/icon/eye-off.svg +1 -1
  63. package/dist/icon/eye.svg +1 -1
  64. package/dist/icon/filter.svg +1 -1
  65. package/dist/icon/fingerprint.svg +1 -1
  66. package/dist/icon/flag.svg +1 -1
  67. package/dist/icon/heart.svg +1 -1
  68. package/dist/icon/home.svg +1 -1
  69. package/dist/icon/key.svg +1 -1
  70. package/dist/icon/list-check.svg +1 -1
  71. package/dist/icon/login.svg +1 -1
  72. package/dist/icon/logout.svg +1 -1
  73. package/dist/icon/map-pin.svg +1 -1
  74. package/dist/icon/maximize.svg +1 -1
  75. package/dist/icon/microphone.svg +1 -1
  76. package/dist/icon/minimize.svg +1 -1
  77. package/dist/icon/note.svg +1 -1
  78. package/dist/icon/player-pause.svg +1 -1
  79. package/dist/icon/printer.svg +1 -1
  80. package/dist/icon/qrcode.svg +1 -1
  81. package/dist/icon/send.svg +1 -1
  82. package/dist/icon/settings.svg +1 -1
  83. package/dist/icon/share.svg +1 -1
  84. package/dist/icon/shopping-cart.svg +1 -1
  85. package/dist/icon/sort-ascending.svg +1 -1
  86. package/dist/icon/sort-descending.svg +1 -1
  87. package/dist/icon/star.svg +1 -1
  88. package/dist/icon/tag.svg +1 -1
  89. package/dist/icon/trending-down.svg +1 -1
  90. package/dist/icon/trending-up.svg +1 -1
  91. package/dist/icon/upload.svg +1 -1
  92. package/dist/icon/volume-off.svg +1 -1
  93. package/dist/icon/volume.svg +1 -1
  94. package/dist/icon/world.svg +1 -1
  95. package/dist/icon/zoom-in.svg +1 -1
  96. package/dist/icon/zoom-out.svg +1 -1
  97. package/dist/index.d.ts +1 -0
  98. package/dist/index.js +1 -0
  99. package/dist/layout/AppShell.svelte +169 -169
  100. package/dist/layout/CustomNavbar.svelte +61 -61
  101. package/dist/layout/Navbar.svelte +206 -206
  102. package/dist/layout/NavbarItemDisplay.svelte +29 -29
  103. package/dist/layout/Sidenav.svelte +712 -712
  104. package/dist/styles/components.css +199 -199
  105. package/dist/styles/dark.css +146 -146
  106. package/dist/styles/index.css +116 -116
  107. package/dist/styles/reset.css +110 -110
  108. package/dist/styles/semantic.css +86 -86
  109. package/dist/styles/tokens.css +203 -197
  110. package/dist/styles/utilities.css +523 -523
  111. package/dist/ui/Accordion.svelte +289 -289
  112. package/dist/ui/ActionIcon.svelte +76 -76
  113. package/dist/ui/Badge.svelte +329 -279
  114. package/dist/ui/Breadcrumbs.svelte +131 -131
  115. package/dist/ui/Button.svelte +432 -370
  116. package/dist/ui/ButtonVariant.d.ts +1 -1
  117. package/dist/ui/Dialog.svelte +307 -307
  118. package/dist/ui/Drawer.svelte +524 -524
  119. package/dist/ui/Dropdown.svelte +97 -97
  120. package/dist/ui/Dropzone.svelte +122 -122
  121. package/dist/ui/Link.svelte +32 -32
  122. package/dist/ui/Loader.svelte +70 -70
  123. package/dist/ui/LoadingOverlay.svelte +53 -53
  124. package/dist/ui/Pagination.svelte +135 -135
  125. package/dist/ui/Popover.svelte +225 -225
  126. package/dist/ui/Progress.svelte +191 -191
  127. package/dist/ui/RingProgress.svelte +141 -141
  128. package/dist/ui/Skeleton.svelte +85 -85
  129. package/dist/ui/Stepper.svelte +355 -355
  130. package/dist/ui/Table.svelte +345 -345
  131. package/dist/ui/Tabs.svelte +146 -146
  132. package/dist/ui/ThemeSwitcher.svelte +39 -39
  133. package/dist/ui/Timeline.svelte +225 -225
  134. package/dist/ui/Toaster.svelte +6 -6
  135. package/dist/ui/Tooltip.svelte +434 -434
  136. package/package.json +14 -14
@@ -1,289 +1,289 @@
1
- <script lang="ts" module>
2
- export interface AccordionItem {
3
- id: string;
4
- title: string;
5
- content?: string;
6
- }
7
- </script>
8
-
9
- <script lang="ts">
10
- import type { Snippet } from 'svelte';
11
- import Icon from '../icon/Icon.svelte';
12
- import { iconChevronDown } from '../icon/index.js';
13
-
14
- interface Props {
15
- items?: AccordionItem[];
16
- multiple?: boolean;
17
- defaultOpen?: string[];
18
- variant?: 'default' | 'contained' | 'filled' | 'separated';
19
- radius?: 'none' | 'sm' | 'md' | 'lg';
20
- chevronPosition?: 'left' | 'right';
21
- disableChevronRotation?: boolean;
22
- class?: string;
23
- itemContent?: Snippet<[AccordionItem]>;
24
- children?: Snippet;
25
- }
26
-
27
- let {
28
- items = [],
29
- multiple = false,
30
- defaultOpen = [],
31
- variant = 'default',
32
- radius = 'md',
33
- chevronPosition = 'right',
34
- disableChevronRotation = false,
35
- class: classes = '',
36
- itemContent,
37
- children
38
- }: Props = $props();
39
-
40
- let openItems = $state<Set<string>>(new Set());
41
-
42
- // Initialize with defaultOpen values
43
- $effect(() => {
44
- if (defaultOpen.length > 0 && openItems.size === 0) {
45
- openItems = new Set(defaultOpen);
46
- }
47
- });
48
-
49
- function toggleItem(id: string) {
50
- if (openItems.has(id)) {
51
- openItems.delete(id);
52
- openItems = new Set(openItems);
53
- } else {
54
- if (multiple) {
55
- openItems.add(id);
56
- openItems = new Set(openItems);
57
- } else {
58
- openItems = new Set([id]);
59
- }
60
- }
61
- }
62
-
63
- function isOpen(id: string): boolean {
64
- return openItems.has(id);
65
- }
66
- </script>
67
-
68
- <div class="accordion variant-{variant} radius-{radius} {classes}">
69
- {#if children}
70
- {@render children()}
71
- {:else}
72
- {#each items as item (item.id)}
73
- {@const open = isOpen(item.id)}
74
- <div class="accordion-item" class:open>
75
- <button
76
- class="accordion-control chevron-{chevronPosition}"
77
- aria-expanded={open}
78
- onclick={() => toggleItem(item.id)}
79
- >
80
- {#if chevronPosition === 'left'}
81
- <span class="accordion-chevron" class:rotated={open && !disableChevronRotation}>
82
- <Icon svg={iconChevronDown} size="18px" />
83
- </span>
84
- {/if}
85
- <span class="accordion-title">{item.title}</span>
86
- {#if chevronPosition === 'right'}
87
- <span class="accordion-chevron" class:rotated={open && !disableChevronRotation}>
88
- <Icon svg={iconChevronDown} size="18px" />
89
- </span>
90
- {/if}
91
- </button>
92
- <div class="accordion-panel" class:open aria-hidden={!open}>
93
- <div class="accordion-content">
94
- {#if itemContent}
95
- {@render itemContent(item)}
96
- {:else if item.content}
97
- {item.content}
98
- {/if}
99
- </div>
100
- </div>
101
- </div>
102
- {/each}
103
- {/if}
104
- </div>
105
-
106
- <style>
107
- .accordion {
108
- width: 100%;
109
- }
110
-
111
- /* Variants */
112
- .variant-default .accordion-item {
113
- border-bottom: 1px solid var(--pui-color-gray-300);
114
- }
115
-
116
- :global(.dark) .variant-default .accordion-item {
117
- border-bottom-color: var(--pui-color-dark-border);
118
- }
119
-
120
- .variant-contained {
121
- border: 1px solid var(--pui-color-gray-300);
122
- }
123
-
124
- :global(.dark) .variant-contained {
125
- border-color: var(--pui-color-dark-border);
126
- }
127
-
128
- .variant-contained .accordion-item:not(:last-child) {
129
- border-bottom: 1px solid var(--pui-color-gray-300);
130
- }
131
-
132
- :global(.dark) .variant-contained .accordion-item:not(:last-child) {
133
- border-bottom-color: var(--pui-color-dark-border);
134
- }
135
-
136
- .variant-filled .accordion-item {
137
- background-color: var(--pui-color-gray-100);
138
- margin-bottom: var(--pui-spacing-2);
139
- }
140
-
141
- :global(.dark) .variant-filled .accordion-item {
142
- background-color: var(--pui-color-dark-200);
143
- }
144
-
145
- .variant-separated .accordion-item {
146
- border: 1px solid var(--pui-color-gray-300);
147
- margin-bottom: var(--pui-spacing-2);
148
- }
149
-
150
- :global(.dark) .variant-separated .accordion-item {
151
- border-color: var(--pui-color-dark-border);
152
- }
153
-
154
- /* Radius */
155
- .radius-none,
156
- .radius-none .accordion-item {
157
- border-radius: 0;
158
- }
159
-
160
- .radius-sm {
161
- border-radius: var(--pui-radius-sm);
162
- }
163
- .radius-sm .accordion-item:first-child {
164
- border-top-left-radius: var(--pui-radius-sm);
165
- border-top-right-radius: var(--pui-radius-sm);
166
- }
167
- .radius-sm .accordion-item:last-child {
168
- border-bottom-left-radius: var(--pui-radius-sm);
169
- border-bottom-right-radius: var(--pui-radius-sm);
170
- }
171
- .radius-sm.variant-filled .accordion-item,
172
- .radius-sm.variant-separated .accordion-item {
173
- border-radius: var(--pui-radius-sm);
174
- }
175
-
176
- .radius-md {
177
- border-radius: var(--pui-radius-md);
178
- }
179
- .radius-md .accordion-item:first-child {
180
- border-top-left-radius: var(--pui-radius-md);
181
- border-top-right-radius: var(--pui-radius-md);
182
- }
183
- .radius-md .accordion-item:last-child {
184
- border-bottom-left-radius: var(--pui-radius-md);
185
- border-bottom-right-radius: var(--pui-radius-md);
186
- }
187
- .radius-md.variant-filled .accordion-item,
188
- .radius-md.variant-separated .accordion-item {
189
- border-radius: var(--pui-radius-md);
190
- }
191
-
192
- .radius-lg {
193
- border-radius: var(--pui-radius-lg);
194
- }
195
- .radius-lg .accordion-item:first-child {
196
- border-top-left-radius: var(--pui-radius-lg);
197
- border-top-right-radius: var(--pui-radius-lg);
198
- }
199
- .radius-lg .accordion-item:last-child {
200
- border-bottom-left-radius: var(--pui-radius-lg);
201
- border-bottom-right-radius: var(--pui-radius-lg);
202
- }
203
- .radius-lg.variant-filled .accordion-item,
204
- .radius-lg.variant-separated .accordion-item {
205
- border-radius: var(--pui-radius-lg);
206
- }
207
-
208
- .accordion-item {
209
- overflow: hidden;
210
- }
211
-
212
- .accordion-control {
213
- width: 100%;
214
- display: flex;
215
- align-items: center;
216
- gap: var(--pui-spacing-2);
217
- padding: var(--pui-spacing-3) var(--pui-spacing-4);
218
- background: none;
219
- border: none;
220
- cursor: pointer;
221
- font-size: var(--pui-font-size-base);
222
- font-weight: var(--pui-font-weight-medium);
223
- color: var(--pui-text-primary);
224
- text-align: left;
225
- transition: background-color var(--pui-transition-fast) var(--pui-ease-in-out);
226
- }
227
-
228
- :global(.dark) .accordion-control {
229
- color: var(--pui-color-gray-100);
230
- }
231
-
232
- .accordion-control:hover {
233
- background-color: var(--pui-color-gray-100);
234
- }
235
-
236
- :global(.dark) .accordion-control:hover {
237
- background-color: var(--pui-color-dark-300);
238
- }
239
-
240
- .accordion-control.chevron-left {
241
- flex-direction: row;
242
- }
243
-
244
- .accordion-control.chevron-right {
245
- flex-direction: row;
246
- }
247
-
248
- .accordion-title {
249
- flex: 1;
250
- }
251
-
252
- .accordion-chevron {
253
- display: flex;
254
- align-items: center;
255
- justify-content: center;
256
- transition: transform var(--pui-transition-fast) var(--pui-ease-in-out);
257
- color: var(--pui-color-gray-500);
258
- }
259
-
260
- .accordion-chevron.rotated {
261
- transform: rotate(180deg);
262
- }
263
-
264
- .accordion-panel {
265
- display: grid;
266
- grid-template-rows: 0fr;
267
- transition: grid-template-rows var(--pui-transition-base) var(--pui-ease-in-out);
268
- }
269
-
270
- .accordion-panel.open {
271
- grid-template-rows: 1fr;
272
- }
273
-
274
- .accordion-content {
275
- overflow: hidden;
276
- padding: 0 var(--pui-spacing-4);
277
- color: var(--pui-text-secondary);
278
- font-size: var(--pui-font-size-sm);
279
- line-height: var(--pui-line-height-relaxed);
280
- }
281
-
282
- :global(.dark) .accordion-content {
283
- color: var(--pui-color-gray-300);
284
- }
285
-
286
- .accordion-panel.open .accordion-content {
287
- padding-bottom: var(--pui-spacing-4);
288
- }
289
- </style>
1
+ <script lang="ts" module>
2
+ export interface AccordionItem {
3
+ id: string;
4
+ title: string;
5
+ content?: string;
6
+ }
7
+ </script>
8
+
9
+ <script lang="ts">
10
+ import type { Snippet } from 'svelte';
11
+ import Icon from '../icon/Icon.svelte';
12
+ import { iconChevronDown } from '../icon/index.js';
13
+
14
+ interface Props {
15
+ items?: AccordionItem[];
16
+ multiple?: boolean;
17
+ defaultOpen?: string[];
18
+ variant?: 'default' | 'contained' | 'filled' | 'separated';
19
+ radius?: 'none' | 'sm' | 'md' | 'lg';
20
+ chevronPosition?: 'left' | 'right';
21
+ disableChevronRotation?: boolean;
22
+ class?: string;
23
+ itemContent?: Snippet<[AccordionItem]>;
24
+ children?: Snippet;
25
+ }
26
+
27
+ let {
28
+ items = [],
29
+ multiple = false,
30
+ defaultOpen = [],
31
+ variant = 'default',
32
+ radius = 'md',
33
+ chevronPosition = 'right',
34
+ disableChevronRotation = false,
35
+ class: classes = '',
36
+ itemContent,
37
+ children
38
+ }: Props = $props();
39
+
40
+ let openItems = $state<Set<string>>(new Set());
41
+
42
+ // Initialize with defaultOpen values
43
+ $effect(() => {
44
+ if (defaultOpen.length > 0 && openItems.size === 0) {
45
+ openItems = new Set(defaultOpen);
46
+ }
47
+ });
48
+
49
+ function toggleItem(id: string) {
50
+ if (openItems.has(id)) {
51
+ openItems.delete(id);
52
+ openItems = new Set(openItems);
53
+ } else {
54
+ if (multiple) {
55
+ openItems.add(id);
56
+ openItems = new Set(openItems);
57
+ } else {
58
+ openItems = new Set([id]);
59
+ }
60
+ }
61
+ }
62
+
63
+ function isOpen(id: string): boolean {
64
+ return openItems.has(id);
65
+ }
66
+ </script>
67
+
68
+ <div class="accordion variant-{variant} radius-{radius} {classes}">
69
+ {#if children}
70
+ {@render children()}
71
+ {:else}
72
+ {#each items as item (item.id)}
73
+ {@const open = isOpen(item.id)}
74
+ <div class="accordion-item" class:open>
75
+ <button
76
+ class="accordion-control chevron-{chevronPosition}"
77
+ aria-expanded={open}
78
+ onclick={() => toggleItem(item.id)}
79
+ >
80
+ {#if chevronPosition === 'left'}
81
+ <span class="accordion-chevron" class:rotated={open && !disableChevronRotation}>
82
+ <Icon svg={iconChevronDown} size="18px" />
83
+ </span>
84
+ {/if}
85
+ <span class="accordion-title">{item.title}</span>
86
+ {#if chevronPosition === 'right'}
87
+ <span class="accordion-chevron" class:rotated={open && !disableChevronRotation}>
88
+ <Icon svg={iconChevronDown} size="18px" />
89
+ </span>
90
+ {/if}
91
+ </button>
92
+ <div class="accordion-panel" class:open aria-hidden={!open}>
93
+ <div class="accordion-content">
94
+ {#if itemContent}
95
+ {@render itemContent(item)}
96
+ {:else if item.content}
97
+ {item.content}
98
+ {/if}
99
+ </div>
100
+ </div>
101
+ </div>
102
+ {/each}
103
+ {/if}
104
+ </div>
105
+
106
+ <style>
107
+ .accordion {
108
+ width: 100%;
109
+ }
110
+
111
+ /* Variants */
112
+ .variant-default .accordion-item {
113
+ border-bottom: 1px solid var(--pui-color-gray-300);
114
+ }
115
+
116
+ :global(.dark) .variant-default .accordion-item {
117
+ border-bottom-color: var(--pui-color-dark-border);
118
+ }
119
+
120
+ .variant-contained {
121
+ border: 1px solid var(--pui-color-gray-300);
122
+ }
123
+
124
+ :global(.dark) .variant-contained {
125
+ border-color: var(--pui-color-dark-border);
126
+ }
127
+
128
+ .variant-contained .accordion-item:not(:last-child) {
129
+ border-bottom: 1px solid var(--pui-color-gray-300);
130
+ }
131
+
132
+ :global(.dark) .variant-contained .accordion-item:not(:last-child) {
133
+ border-bottom-color: var(--pui-color-dark-border);
134
+ }
135
+
136
+ .variant-filled .accordion-item {
137
+ background-color: var(--pui-color-gray-100);
138
+ margin-bottom: var(--pui-spacing-2);
139
+ }
140
+
141
+ :global(.dark) .variant-filled .accordion-item {
142
+ background-color: var(--pui-color-dark-200);
143
+ }
144
+
145
+ .variant-separated .accordion-item {
146
+ border: 1px solid var(--pui-color-gray-300);
147
+ margin-bottom: var(--pui-spacing-2);
148
+ }
149
+
150
+ :global(.dark) .variant-separated .accordion-item {
151
+ border-color: var(--pui-color-dark-border);
152
+ }
153
+
154
+ /* Radius */
155
+ .radius-none,
156
+ .radius-none .accordion-item {
157
+ border-radius: 0;
158
+ }
159
+
160
+ .radius-sm {
161
+ border-radius: var(--pui-radius-sm);
162
+ }
163
+ .radius-sm .accordion-item:first-child {
164
+ border-top-left-radius: var(--pui-radius-sm);
165
+ border-top-right-radius: var(--pui-radius-sm);
166
+ }
167
+ .radius-sm .accordion-item:last-child {
168
+ border-bottom-left-radius: var(--pui-radius-sm);
169
+ border-bottom-right-radius: var(--pui-radius-sm);
170
+ }
171
+ .radius-sm.variant-filled .accordion-item,
172
+ .radius-sm.variant-separated .accordion-item {
173
+ border-radius: var(--pui-radius-sm);
174
+ }
175
+
176
+ .radius-md {
177
+ border-radius: var(--pui-radius-md);
178
+ }
179
+ .radius-md .accordion-item:first-child {
180
+ border-top-left-radius: var(--pui-radius-md);
181
+ border-top-right-radius: var(--pui-radius-md);
182
+ }
183
+ .radius-md .accordion-item:last-child {
184
+ border-bottom-left-radius: var(--pui-radius-md);
185
+ border-bottom-right-radius: var(--pui-radius-md);
186
+ }
187
+ .radius-md.variant-filled .accordion-item,
188
+ .radius-md.variant-separated .accordion-item {
189
+ border-radius: var(--pui-radius-md);
190
+ }
191
+
192
+ .radius-lg {
193
+ border-radius: var(--pui-radius-lg);
194
+ }
195
+ .radius-lg .accordion-item:first-child {
196
+ border-top-left-radius: var(--pui-radius-lg);
197
+ border-top-right-radius: var(--pui-radius-lg);
198
+ }
199
+ .radius-lg .accordion-item:last-child {
200
+ border-bottom-left-radius: var(--pui-radius-lg);
201
+ border-bottom-right-radius: var(--pui-radius-lg);
202
+ }
203
+ .radius-lg.variant-filled .accordion-item,
204
+ .radius-lg.variant-separated .accordion-item {
205
+ border-radius: var(--pui-radius-lg);
206
+ }
207
+
208
+ .accordion-item {
209
+ overflow: hidden;
210
+ }
211
+
212
+ .accordion-control {
213
+ width: 100%;
214
+ display: flex;
215
+ align-items: center;
216
+ gap: var(--pui-spacing-2);
217
+ padding: var(--pui-spacing-3) var(--pui-spacing-4);
218
+ background: none;
219
+ border: none;
220
+ cursor: pointer;
221
+ font-size: var(--pui-font-size-base);
222
+ font-weight: var(--pui-font-weight-medium);
223
+ color: var(--pui-text-primary);
224
+ text-align: left;
225
+ transition: background-color var(--pui-transition-fast) var(--pui-ease-in-out);
226
+ }
227
+
228
+ :global(.dark) .accordion-control {
229
+ color: var(--pui-color-gray-100);
230
+ }
231
+
232
+ .accordion-control:hover {
233
+ background-color: var(--pui-color-gray-100);
234
+ }
235
+
236
+ :global(.dark) .accordion-control:hover {
237
+ background-color: var(--pui-color-dark-300);
238
+ }
239
+
240
+ .accordion-control.chevron-left {
241
+ flex-direction: row;
242
+ }
243
+
244
+ .accordion-control.chevron-right {
245
+ flex-direction: row;
246
+ }
247
+
248
+ .accordion-title {
249
+ flex: 1;
250
+ }
251
+
252
+ .accordion-chevron {
253
+ display: flex;
254
+ align-items: center;
255
+ justify-content: center;
256
+ transition: transform var(--pui-transition-fast) var(--pui-ease-in-out);
257
+ color: var(--pui-color-gray-500);
258
+ }
259
+
260
+ .accordion-chevron.rotated {
261
+ transform: rotate(180deg);
262
+ }
263
+
264
+ .accordion-panel {
265
+ display: grid;
266
+ grid-template-rows: 0fr;
267
+ transition: grid-template-rows var(--pui-transition-base) var(--pui-ease-in-out);
268
+ }
269
+
270
+ .accordion-panel.open {
271
+ grid-template-rows: 1fr;
272
+ }
273
+
274
+ .accordion-content {
275
+ overflow: hidden;
276
+ padding: 0 var(--pui-spacing-4);
277
+ color: var(--pui-text-secondary);
278
+ font-size: var(--pui-font-size-sm);
279
+ line-height: var(--pui-line-height-relaxed);
280
+ }
281
+
282
+ :global(.dark) .accordion-content {
283
+ color: var(--pui-color-gray-300);
284
+ }
285
+
286
+ .accordion-panel.open .accordion-content {
287
+ padding-bottom: var(--pui-spacing-4);
288
+ }
289
+ </style>