@pinfold/css 0.0.0-stage → 0.2.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/README.md CHANGED
@@ -1,3 +1,66 @@
1
- # Temporary Holding Version
1
+ # @pinfold/css
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ All of Pinfold's styling: design tokens, a scoped reset, one stylesheet per component, and
4
+ the Tailwind bridge. Plain CSS in cascade layers (`@layer pinfold.*`), so your own CSS and every
5
+ Tailwind utility override it without `!important`. Framework-free.
6
+
7
+ ```js
8
+ import '@pinfold/css/core.css'; // reset + tokens, once
9
+ import '@pinfold/css/accordion.css'; // per component you use
10
+ // or: import '@pinfold/css/all.css';
11
+ ```
12
+
13
+ Using `unstyled: true` everywhere? Import only `@pinfold/css/tokens.css`, or nothing.
14
+
15
+ ## Style packs
16
+
17
+ ```js
18
+ import '@pinfold/css/packs.css';
19
+ // <PinfoldProvider stylePack="glass">, or data-pinfold-style="glass" on any element
20
+ ```
21
+
22
+ `glass`, `material`, `noise` and `brutalist` are token recipes (shape, depth, borders,
23
+ surfaces, texture), so every component follows them with no extra CSS. They follow your palette
24
+ instead of replacing it: every colour a pack sets is mixed from the palette tokens. Each one yields to
25
+ `prefers-reduced-transparency`, `prefers-contrast: more` and `forced-colors`, and glass surfaces
26
+ are tested to keep body text at WCAG AA over white, black and brand-coloured backdrops.
27
+
28
+ ## shadcn/ui
29
+
30
+ ```css
31
+ @import "@pinfold/css/core.css";
32
+ @import "@pinfold/css/shadcn.css"; /* after shadcn's own variables */
33
+ ```
34
+
35
+ Points shadcn's variables (`--background`, `--primary`, `--ring`, `--radius`, …) at Pinfold's
36
+ tokens, so both libraries share one theme. For dark mode set both `.dark` and
37
+ `data-pinfold-theme`, e.g. next-themes `attribute={['class', 'data-pinfold-theme']}`.
38
+
39
+ ## Design tokens (DTCG)
40
+
41
+ `toDTCG(createTheme({ primary: 'emerald' }))` from `@pinfold/core/palette` returns the theme as
42
+ W3C Design Tokens (2025.10) for Tokens Studio, Style Dictionary and other DTCG tools.
43
+
44
+ ## Tailwind
45
+
46
+ **v4:** import the theme after Tailwind.
47
+
48
+ ```css
49
+ @import "tailwindcss";
50
+ @import "@pinfold/css/core.css";
51
+ @import "@pinfold/css/tailwind.css";
52
+ ```
53
+
54
+ **v3:** add the preset.
55
+
56
+ ```js
57
+ // tailwind.config.js
58
+ module.exports = { presets: [require('@pinfold/css/tailwind')] };
59
+ ```
60
+
61
+ `bg-primary-600`, `text-content-muted`, `border-line`, `rounded-lg`, `shadow-md` and
62
+ `ease-pinfold-out` all resolve to `--pinfold-*` custom properties, so they follow
63
+ `npx pinfold theme`, dark mode and any runtime override. Variants such as `open:`, `closed:` and
64
+ `disabled-row:` map to the `data-*` attributes Pinfold components already set.
65
+
66
+ MIT © Indranil Bhattacharya
@@ -0,0 +1,353 @@
1
+
2
+ @layer pinfold.components {
3
+ .pinfold-accordion {
4
+ --pinfold-acc-pad-x-base: var(--pinfold-space-4);
5
+ --pinfold-acc-pad-y-base: var(--pinfold-space-4);
6
+ --pinfold-acc-font-base: var(--pinfold-text-md);
7
+ --pinfold-acc-radius-unit: 0.75rem;
8
+ --pinfold-acc-radius-base: calc(var(--pinfold-acc-radius-unit) * var(--pinfold-radius-scale, 1));
9
+ --pinfold-acc-gap-base: 0px;
10
+ --pinfold-acc-pad-x: var(--pinfold-accordion-padding-x, var(--pinfold-acc-pad-x-base));
11
+ --pinfold-acc-pad-y: var(--pinfold-accordion-padding-y, var(--pinfold-acc-pad-y-base));
12
+ --pinfold-acc-panel-pad-x: var(--pinfold-accordion-panel-padding-x, var(--pinfold-acc-pad-x));
13
+ --pinfold-acc-panel-pad-y: var(--pinfold-accordion-panel-padding-y, var(--pinfold-acc-pad-y));
14
+ --pinfold-acc-font: var(--pinfold-accordion-font-size, var(--pinfold-acc-font-base));
15
+ --pinfold-acc-title: var(--pinfold-accordion-title-size, inherit);
16
+ --pinfold-acc-desc: var(--pinfold-accordion-description-size, var(--pinfold-text-sm));
17
+ --pinfold-acc-icon: var(--pinfold-accordion-icon-size, 1.5em);
18
+ --pinfold-acc-ind: var(--pinfold-accordion-indicator-size, 1em);
19
+ --pinfold-acc-radius: var(--pinfold-accordion-radius, var(--pinfold-acc-radius-base));
20
+ --pinfold-acc-gap: var(--pinfold-accordion-gap, var(--pinfold-acc-gap-base));
21
+ --pinfold-acc-border: var(--pinfold-accordion-border-width, var(--pinfold-border-width));
22
+ --pinfold-acc-duration: var(--pinfold-accordion-duration, var(--pinfold-duration-md));
23
+ --pinfold-acc-accent: var(--pinfold-color-accent);
24
+ --pinfold-acc-item-radius: var(--pinfold-accordion-item-radius, 0px);
25
+ display: flex;
26
+ flex-direction: column;
27
+ gap: var(--pinfold-acc-gap);
28
+ container: pinfold-accordion / inline-size;
29
+ width: var(--pinfold-accordion-width, 100%);
30
+ min-width: var(--pinfold-accordion-min-width, 0);
31
+ max-width: var(--pinfold-accordion-max-width, none);
32
+ height: var(--pinfold-accordion-height, auto);
33
+ max-height: var(--pinfold-accordion-max-height, none);
34
+ border-radius: var(--pinfold-acc-radius);
35
+ font-size: var(--pinfold-acc-font);
36
+ letter-spacing: var(--pinfold-tracking-tight);
37
+ color: var(--pinfold-color-text);
38
+ }
39
+ .pinfold-accordion[data-clamp] {
40
+ overflow-y: auto;
41
+ overscroll-behavior: contain;
42
+ }
43
+ .pinfold-accordion[data-size='sm'] {
44
+ --pinfold-acc-pad-x-base: var(--pinfold-space-3);
45
+ --pinfold-acc-pad-y-base: var(--pinfold-space-3);
46
+ --pinfold-acc-font-base: var(--pinfold-text-sm);
47
+ --pinfold-acc-radius-unit: 0.5rem;
48
+ }
49
+ .pinfold-accordion[data-size='lg'] {
50
+ --pinfold-acc-pad-x-base: var(--pinfold-space-5);
51
+ --pinfold-acc-pad-y-base: var(--pinfold-space-5);
52
+ --pinfold-acc-font-base: var(--pinfold-text-lg);
53
+ --pinfold-acc-radius-unit: 1rem;
54
+ }
55
+ .pinfold-accordion[data-tone='neutral'] { --pinfold-acc-accent: var(--pinfold-color-text); }
56
+ .pinfold-accordion[data-tone='success'] { --pinfold-acc-accent: var(--pinfold-success-500); }
57
+ .pinfold-accordion[data-tone='warning'] { --pinfold-acc-accent: var(--pinfold-warning-500); }
58
+ .pinfold-accordion[data-tone='danger'] { --pinfold-acc-accent: var(--pinfold-danger-500); }
59
+ .pinfold-accordion[data-tone='info'] { --pinfold-acc-accent: var(--pinfold-info-500); }
60
+ .pinfold-accordion__item {
61
+ position: relative;
62
+ border-radius: var(--pinfold-acc-item-radius);
63
+ }
64
+ .pinfold-accordion__header,
65
+ .pinfold-accordion__trigger {
66
+ border-radius: inherit;
67
+ }
68
+ .pinfold-accordion[data-dividers]:is([data-variant='solid'], [data-variant='outline'], [data-variant='ghost'], [data-joined])
69
+ .pinfold-accordion__item + .pinfold-accordion__item::before {
70
+ content: '';
71
+ position: absolute;
72
+ inset-block-start: calc(var(--pinfold-acc-gap) / -2);
73
+ inset-inline: var(--pinfold-acc-divider-inset, 0);
74
+ border-top: var(--pinfold-acc-border) solid var(--pinfold-accordion-divider-color, var(--pinfold-color-border));
75
+ pointer-events: none;
76
+ }
77
+ .pinfold-accordion:is([data-variant='solid'], [data-variant='outline']) {
78
+ --pinfold-acc-divider-inset: var(--pinfold-acc-pad-x);
79
+ border: var(--pinfold-acc-border) solid var(--pinfold-color-border);
80
+ }
81
+ .pinfold-accordion[data-variant='solid'] {
82
+ background: var(--pinfold-color-surface);
83
+ background-image: var(--pinfold-texture);
84
+ -webkit-backdrop-filter: var(--pinfold-backdrop);
85
+ backdrop-filter: var(--pinfold-backdrop);
86
+ box-shadow: var(--pinfold-shadow-md), var(--pinfold-highlight);
87
+ }
88
+ .pinfold-accordion:is([data-variant='solid'], [data-variant='outline']) .pinfold-accordion__item:first-child .pinfold-accordion__trigger {
89
+ border-start-start-radius: var(--pinfold-acc-radius);
90
+ border-start-end-radius: var(--pinfold-acc-radius);
91
+ }
92
+ .pinfold-accordion:is([data-variant='solid'], [data-variant='outline']) .pinfold-accordion__item:last-child .pinfold-accordion__trigger[data-state='closed'] {
93
+ border-end-start-radius: var(--pinfold-acc-radius);
94
+ border-end-end-radius: var(--pinfold-acc-radius);
95
+ }
96
+ .pinfold-accordion[data-variant='separated'] {
97
+ --pinfold-acc-gap-base: var(--pinfold-space-2);
98
+ }
99
+ .pinfold-accordion[data-variant='separated'] .pinfold-accordion__item {
100
+ --pinfold-acc-item-radius: var(--pinfold-accordion-item-radius, var(--pinfold-acc-radius));
101
+ background: var(--pinfold-color-surface);
102
+ background-image: var(--pinfold-texture);
103
+ -webkit-backdrop-filter: var(--pinfold-backdrop);
104
+ backdrop-filter: var(--pinfold-backdrop);
105
+ border: var(--pinfold-acc-border) solid var(--pinfold-color-border);
106
+ box-shadow: var(--pinfold-shadow-sm), var(--pinfold-highlight);
107
+ }
108
+ .pinfold-accordion[data-variant='filled'] {
109
+ --pinfold-acc-gap-base: var(--pinfold-space-2);
110
+ }
111
+ .pinfold-accordion[data-variant='filled'] .pinfold-accordion__item {
112
+ --pinfold-acc-item-radius: var(--pinfold-accordion-item-radius, var(--pinfold-acc-radius));
113
+ background: var(--pinfold-color-bg-subtle);
114
+ background-image: var(--pinfold-texture);
115
+ -webkit-backdrop-filter: var(--pinfold-backdrop);
116
+ backdrop-filter: var(--pinfold-backdrop);
117
+ }
118
+ .pinfold-accordion[data-joined] {
119
+ --pinfold-acc-divider-inset: var(--pinfold-acc-pad-x);
120
+ }
121
+ .pinfold-accordion[data-joined] .pinfold-accordion__item {
122
+ --pinfold-acc-item-radius: 0px;
123
+ }
124
+ .pinfold-accordion[data-joined] .pinfold-accordion__item:first-child {
125
+ border-start-start-radius: var(--pinfold-acc-radius);
126
+ border-start-end-radius: var(--pinfold-acc-radius);
127
+ }
128
+ .pinfold-accordion[data-joined] .pinfold-accordion__item:last-child {
129
+ border-end-start-radius: var(--pinfold-acc-radius);
130
+ border-end-end-radius: var(--pinfold-acc-radius);
131
+ }
132
+ .pinfold-accordion[data-joined][data-variant='separated'] {
133
+ box-shadow: var(--pinfold-shadow-sm), var(--pinfold-highlight);
134
+ }
135
+ .pinfold-accordion[data-joined][data-variant='separated'] .pinfold-accordion__item {
136
+ box-shadow: none;
137
+ }
138
+ .pinfold-accordion[data-joined][data-variant='separated'] .pinfold-accordion__item:not(:last-child) {
139
+ border-bottom-width: 0;
140
+ }
141
+ .pinfold-accordion[data-joined][data-variant='separated'] .pinfold-accordion__item:not(:first-child) {
142
+ border-top-width: 0;
143
+ }
144
+ .pinfold-accordion[data-variant='ghost'] .pinfold-accordion__item {
145
+ --pinfold-acc-item-radius: var(--pinfold-accordion-item-radius, var(--pinfold-acc-radius));
146
+ }
147
+ .pinfold-accordion__header {
148
+ display: flex;
149
+ margin: 0;
150
+ }
151
+ .pinfold-accordion__trigger {
152
+ display: flex;
153
+ align-items: center;
154
+ gap: var(--pinfold-space-3);
155
+ width: 100%;
156
+ padding: var(--pinfold-acc-pad-y) var(--pinfold-acc-pad-x);
157
+ font-size: inherit;
158
+ font-weight: var(--pinfold-weight-medium);
159
+ line-height: var(--pinfold-leading-tight);
160
+ text-align: start;
161
+ color: var(--pinfold-color-text);
162
+ cursor: pointer;
163
+ }
164
+ .pinfold-accordion__trigger[data-disabled] {
165
+ color: var(--pinfold-color-text-disabled);
166
+ cursor: not-allowed;
167
+ }
168
+ .pinfold-accordion__trigger:focus-visible {
169
+ position: relative;
170
+ z-index: 1;
171
+ }
172
+ .pinfold-accordion[data-indicator-position='start'] .pinfold-accordion__trigger {
173
+ flex-direction: row-reverse;
174
+ }
175
+ .pinfold-accordion__icon {
176
+ display: inline-flex;
177
+ flex: none;
178
+ align-items: center;
179
+ justify-content: center;
180
+ width: var(--pinfold-acc-icon);
181
+ height: var(--pinfold-acc-icon);
182
+ color: var(--pinfold-acc-accent);
183
+ }
184
+ .pinfold-accordion__end-icon {
185
+ display: inline-flex;
186
+ flex: none;
187
+ align-items: center;
188
+ justify-content: center;
189
+ width: var(--pinfold-acc-icon);
190
+ height: var(--pinfold-acc-icon);
191
+ color: var(--pinfold-color-text-muted);
192
+ }
193
+ .pinfold-accordion__label {
194
+ display: flex;
195
+ flex: 1 1 auto;
196
+ flex-direction: column;
197
+ gap: 2px;
198
+ min-width: 0;
199
+ }
200
+ .pinfold-accordion__title {
201
+ font-size: var(--pinfold-acc-title);
202
+ overflow-wrap: anywhere;
203
+ }
204
+ .pinfold-accordion [data-overflow='truncate'] {
205
+ overflow: hidden;
206
+ text-overflow: ellipsis;
207
+ white-space: nowrap;
208
+ }
209
+ .pinfold-accordion [data-overflow='clamp'] {
210
+ display: -webkit-box;
211
+ -webkit-box-orient: vertical;
212
+ -webkit-line-clamp: var(--pinfold-lines, 2);
213
+ line-clamp: var(--pinfold-lines, 2);
214
+ overflow: hidden;
215
+ }
216
+ .pinfold-accordion__description {
217
+ font-size: var(--pinfold-acc-desc);
218
+ font-weight: var(--pinfold-weight-normal);
219
+ letter-spacing: var(--pinfold-tracking-normal);
220
+ color: var(--pinfold-color-text-muted);
221
+ }
222
+ .pinfold-accordion__badge {
223
+ flex: none;
224
+ padding: 2px var(--pinfold-space-2);
225
+ font-size: var(--pinfold-text-xs);
226
+ font-weight: var(--pinfold-weight-semibold);
227
+ letter-spacing: var(--pinfold-tracking-wide);
228
+ color: color-mix(in oklch, var(--pinfold-acc-accent) 55%, var(--pinfold-color-text));
229
+ background: color-mix(in oklch, var(--pinfold-acc-accent) 12%, transparent);
230
+ border-radius: var(--pinfold-radius-full);
231
+ }
232
+ .pinfold-accordion__indicator {
233
+ display: inline-flex;
234
+ flex: none;
235
+ align-items: center;
236
+ justify-content: center;
237
+ font-size: var(--pinfold-acc-ind);
238
+ color: var(--pinfold-color-text-subtle);
239
+ transition: transform var(--pinfold-acc-duration) var(--pinfold-ease-out),
240
+ color var(--pinfold-duration-fast) var(--pinfold-ease);
241
+ }
242
+ .pinfold-accordion__trigger:not([data-disabled]):hover .pinfold-accordion__indicator {
243
+ color: var(--pinfold-color-text);
244
+ }
245
+ .pinfold-accordion__trigger[data-state='open'] .pinfold-accordion__indicator {
246
+ color: var(--pinfold-acc-accent);
247
+ transform: rotate(180deg);
248
+ }
249
+ .pinfold-accordion[data-static-indicator] .pinfold-accordion__trigger .pinfold-accordion__indicator {
250
+ transform: none;
251
+ }
252
+ .pinfold-accordion[data-static-indicator] .pinfold-accordion__indicator-bar {
253
+ transition: none;
254
+ }
255
+ .pinfold-accordion:not([data-animate]) :is(.pinfold-accordion__indicator, .pinfold-accordion__indicator-bar) {
256
+ transition: none;
257
+ }
258
+ .pinfold-accordion__indicator .pinfold-accordion__indicator-bar {
259
+ transform-origin: center;
260
+ transition: opacity var(--pinfold-acc-duration) var(--pinfold-ease),
261
+ transform var(--pinfold-acc-duration) var(--pinfold-ease-out);
262
+ }
263
+ .pinfold-accordion__trigger[data-state='open']
264
+ .pinfold-accordion__indicator:has(.pinfold-accordion__indicator-bar) {
265
+ transform: none;
266
+ }
267
+ .pinfold-accordion__trigger[data-state='open'] .pinfold-accordion__indicator-bar {
268
+ opacity: 0;
269
+ transform: rotate(90deg);
270
+ }
271
+ .pinfold-accordion__panel {
272
+ display: grid;
273
+ grid-template-rows: 1fr;
274
+ color: var(--pinfold-color-text-muted);
275
+ font-size: var(--pinfold-text-sm);
276
+ line-height: var(--pinfold-leading-normal);
277
+ letter-spacing: var(--pinfold-tracking-normal);
278
+ }
279
+ .pinfold-accordion__panel[data-state='closed'] {
280
+ grid-template-rows: 0fr;
281
+ visibility: hidden;
282
+ }
283
+ .pinfold-accordion__panel[data-state='closed']:has(> [hidden='until-found']) {
284
+ visibility: visible;
285
+ }
286
+ .pinfold-accordion[data-animate] .pinfold-accordion__panel {
287
+ transition: grid-template-rows var(--pinfold-acc-duration) var(--pinfold-ease-out),
288
+ visibility 0s linear 0s;
289
+ }
290
+ .pinfold-accordion[data-animate] .pinfold-accordion__panel[data-state='closed'] {
291
+ transition: grid-template-rows var(--pinfold-acc-duration) var(--pinfold-ease),
292
+ visibility 0s linear var(--pinfold-acc-duration);
293
+ }
294
+ .pinfold-accordion__panel-inner {
295
+ min-height: 0;
296
+ overflow: hidden;
297
+ }
298
+ .pinfold-accordion[data-animate] .pinfold-accordion__content {
299
+ opacity: 0;
300
+ transform: translateY(-4px);
301
+ transition: opacity var(--pinfold-acc-duration) var(--pinfold-ease),
302
+ transform var(--pinfold-acc-duration) var(--pinfold-ease-out);
303
+ }
304
+ .pinfold-accordion[data-animate] .pinfold-accordion__panel[data-state='open'] .pinfold-accordion__content {
305
+ opacity: 1;
306
+ transform: none;
307
+ transition-delay: calc(var(--pinfold-acc-duration) * 0.35);
308
+ }
309
+ .pinfold-accordion[data-scroll] .pinfold-accordion__panel[data-state='open'] .pinfold-accordion__panel-inner {
310
+ max-height: var(--pinfold-accordion-panel-max-height);
311
+ overflow-y: auto;
312
+ overscroll-behavior: contain;
313
+ }
314
+ .pinfold-accordion__content {
315
+ padding: 0 var(--pinfold-acc-panel-pad-x) var(--pinfold-acc-panel-pad-y);
316
+ }
317
+ .pinfold-accordion[data-indicator-position='start'] .pinfold-accordion__content {
318
+ padding-inline-start: calc(var(--pinfold-acc-panel-pad-x) + var(--pinfold-acc-icon) + var(--pinfold-space-3));
319
+ }
320
+ @container pinfold-accordion (max-width: 26rem) {
321
+ .pinfold-accordion__trigger {
322
+ flex-wrap: wrap;
323
+ row-gap: var(--pinfold-space-1);
324
+ }
325
+ .pinfold-accordion__label {
326
+ flex-basis: calc(100% - 4.5em);
327
+ }
328
+ .pinfold-accordion__indicator {
329
+ order: 1;
330
+ }
331
+ .pinfold-accordion__badge,
332
+ .pinfold-accordion__end-icon {
333
+ order: 2;
334
+ }
335
+ .pinfold-accordion__badge,
336
+ .pinfold-accordion__trigger:not(:has(.pinfold-accordion__badge)) .pinfold-accordion__end-icon {
337
+ margin-inline-start: calc(var(--pinfold-acc-icon) + var(--pinfold-space-3));
338
+ }
339
+ .pinfold-accordion__trigger:not(:has(.pinfold-accordion__icon)) :is(.pinfold-accordion__badge, .pinfold-accordion__end-icon) {
340
+ margin-inline-start: 0;
341
+ }
342
+ }
343
+ @media (pointer: coarse) {
344
+ .pinfold-accordion__trigger {
345
+ min-height: 44px;
346
+ }
347
+ }
348
+ @supports not (color: color-mix(in oklch, red, blue)) {
349
+ .pinfold-accordion__badge {
350
+ background: var(--pinfold-color-bg-subtle);
351
+ }
352
+ }
353
+ }