@nordwerk/scroll-carousel 0.1.2 → 0.1.4
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/AGENTS.md +16 -1
- package/CHANGELOG.md +17 -0
- package/README.md +19 -1
- package/dist/carousel.css +1 -1
- package/dist/carousel.layer.css +263 -0
- package/package.json +23 -7
package/AGENTS.md
CHANGED
|
@@ -45,6 +45,12 @@ JavaScript, never move slides with transforms, never clone slides.
|
|
|
45
45
|
`aria-disabled:opacity-30`). Copyable example: the `#tailwind` section of the docs site.
|
|
46
46
|
12. Next.js App Router: import `<Carousel>` from `@nordwerk/scroll-carousel/react` in a Server
|
|
47
47
|
Component as is; the entry carries `'use client'`.
|
|
48
|
+
13. shadcn/ui projects: `npx shadcn@latest add studio-nordwerk/scroll-carousel/scroll-carousel`, or a
|
|
49
|
+
block (`product-row`, `brand-teasers`, `hero-autoplay`, `image-gallery`, `logo-belt`). Compose
|
|
50
|
+
`ScrollCarousel` > `ScrollCarouselContent` > `ScrollCarouselItem`, with `ScrollCarouselPrevious`,
|
|
51
|
+
`ScrollCarouselNext`, `ScrollCarouselDots` and `ScrollCarouselPlay` inside `ScrollCarousel`;
|
|
52
|
+
layout as custom properties on the content. Pass plugins made outside the component, and mark
|
|
53
|
+
the file `"use client"` when it creates them.
|
|
48
54
|
|
|
49
55
|
### Recipes (CSS on the root or track, options in attach)
|
|
50
56
|
|
|
@@ -83,7 +89,13 @@ JavaScript, never move slides with transforms, never clone slides.
|
|
|
83
89
|
- `src/adapter.ts`: the React and Preact adapter, written once against a small `Framework`
|
|
84
90
|
interface; `src/react.ts` and `src/preact.ts` only bind it.
|
|
85
91
|
- `src/astro/Carousel.astro`: shipped as source.
|
|
86
|
-
- `src/carousel.css`: all layout and the default controls.
|
|
92
|
+
- `src/carousel.css`: all layout and the default controls. The build also writes
|
|
93
|
+
`carousel.layer.css`, the same rules inside Tailwind's components layer.
|
|
94
|
+
- `registry.json` and `registry/`: the shadcn registry, read by the shadcn CLI straight from this
|
|
95
|
+
public repository (`studio-nordwerk/scroll-carousel/<item>`). `registry/ui` is the component,
|
|
96
|
+
`registry/blocks` the blocks, `registry/shims` stand-ins that only exist for the type check.
|
|
97
|
+
`node scripts/shadcn-smoke.mjs` installs everything into a fresh shadcn project, builds and
|
|
98
|
+
renders it; CI runs it on every push.
|
|
87
99
|
- `site/`: the documentation site (`generate.mjs` writes `_site/`), including the wireframe
|
|
88
100
|
patterns in `wireframes.mjs`. Content there is fictional. CI publishes it to GitHub Pages;
|
|
89
101
|
www.nordwerk.studio/oss/scroll-carousel serves the same files through a proxy that rewrites
|
|
@@ -99,12 +111,15 @@ JavaScript, never move slides with transforms, never clone slides.
|
|
|
99
111
|
|
|
100
112
|
### Commands
|
|
101
113
|
|
|
114
|
+
Working on the repository needs Node 22 or later and the pnpm version in `packageManager`.
|
|
115
|
+
|
|
102
116
|
```sh
|
|
103
117
|
pnpm install
|
|
104
118
|
pnpm typecheck
|
|
105
119
|
pnpm test # unit tests, no build needed
|
|
106
120
|
pnpm build # dist/: esbuild modules plus tsc declarations
|
|
107
121
|
pnpm size # fails when an entry exceeds its gzip budget
|
|
122
|
+
pnpm lint:package # publint and arethetypeswrong on the packed tarball, after a build
|
|
108
123
|
pnpm site # build, then _site/
|
|
109
124
|
node scripts/fixtures.mjs # React, Preact and Astro fixtures into _site/fixtures/
|
|
110
125
|
pnpm test:e2e # Chromium, WebKit and Firefox
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.1.4 (2026-09-22)
|
|
4
|
+
|
|
5
|
+
- Types resolve in TypeScript projects still on `moduleResolution: "node"`, which ignores
|
|
6
|
+
`exports`: `main`, `types` and `typesVersions` point at the same files.
|
|
7
|
+
- No `engines` field any more: it asked consumers for Node 22 although the package runs in the
|
|
8
|
+
browser.
|
|
9
|
+
- Released from GitHub Actions through npm trusted publishing, with provenance.
|
|
10
|
+
|
|
11
|
+
## 0.1.3 (2026-09-22)
|
|
12
|
+
|
|
13
|
+
- `carousel.layer.css`: the stylesheet inside Tailwind's components layer, with Tailwind's layer
|
|
14
|
+
order declared, so utilities override it and preflight never does, whatever the load order.
|
|
15
|
+
- shadcn/ui registry in the repository: the `scroll-carousel` component (the structure of shadcn's
|
|
16
|
+
Carousel, on native scrolling) and five blocks, `product-row`, `brand-teasers`,
|
|
17
|
+
`hero-autoplay`, `image-gallery` and `logo-belt`. Install with
|
|
18
|
+
`npx shadcn@latest add studio-nordwerk/scroll-carousel/<item>`.
|
|
19
|
+
|
|
3
20
|
## 0.1.2 (2026-09-22)
|
|
4
21
|
|
|
5
22
|
- React entry marked `'use client'`: `<Carousel>` now works in Next.js App Router Server
|
package/README.md
CHANGED
|
@@ -126,6 +126,24 @@ set the layout with arbitrary properties and container-query variants:
|
|
|
126
126
|
The complete example to copy, with a live preview compiled by Tailwind, is on the
|
|
127
127
|
[documentation site](https://www.nordwerk.studio/oss/scroll-carousel#tailwind).
|
|
128
128
|
|
|
129
|
+
### shadcn/ui
|
|
130
|
+
|
|
131
|
+
A component with the structure of shadcn's Carousel, on native scrolling, and five blocks
|
|
132
|
+
(product row, brand teasers, hero with autoplay, image gallery, logo belt), straight from this
|
|
133
|
+
repository:
|
|
134
|
+
|
|
135
|
+
```sh
|
|
136
|
+
npx shadcn@latest add studio-nordwerk/scroll-carousel/scroll-carousel
|
|
137
|
+
npx shadcn@latest add studio-nordwerk/scroll-carousel/product-row
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
`ScrollCarousel`, `ScrollCarouselContent`, `ScrollCarouselItem`, `ScrollCarouselPrevious` and
|
|
141
|
+
`ScrollCarouselNext` match shadcn's names with the `Scroll` prefix, plus `ScrollCarouselDots`,
|
|
142
|
+
`ScrollCarouselPlay` and `useScrollCarousel()`. Size slides with `[--sc-per-view:3]` on the content
|
|
143
|
+
(or `basis-*` on items); spacing comes from `--sc-gap`, so the `-ml-4`/`pl-4` pair of the Embla
|
|
144
|
+
version is not needed. The component imports `@nordwerk/scroll-carousel/carousel.layer.css`, the
|
|
145
|
+
stylesheet inside Tailwind's components layer.
|
|
146
|
+
|
|
129
147
|
### Next.js
|
|
130
148
|
|
|
131
149
|
The React entry is marked `'use client'`, so `<Carousel>` can be used directly in Server
|
|
@@ -243,7 +261,7 @@ not supported (true infinite loop, vertical, effects, virtual slides, synced thu
|
|
|
243
261
|
|
|
244
262
|
```sh
|
|
245
263
|
pnpm install
|
|
246
|
-
pnpm check # typecheck, unit tests, build, size budget, site, fixtures, browser tests
|
|
264
|
+
pnpm check # typecheck, unit tests, build, size budget, package lint, site, fixtures, browser tests
|
|
247
265
|
pnpm serve # the site on http://localhost:4173 after pnpm site
|
|
248
266
|
```
|
|
249
267
|
|
package/dist/carousel.css
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* scroll-carousel
|
|
2
|
+
* scroll-carousel stylesheet.
|
|
3
3
|
*
|
|
4
4
|
* The layout is complete without JavaScript: the server-rendered markup is already the final
|
|
5
5
|
* layout, and the script only adds controls. Everything is configured with custom properties,
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
@layer theme, base, components, utilities;
|
|
2
|
+
|
|
3
|
+
@layer components {
|
|
4
|
+
/*
|
|
5
|
+
* scroll-carousel stylesheet.
|
|
6
|
+
*
|
|
7
|
+
* The layout is complete without JavaScript: the server-rendered markup is already the final
|
|
8
|
+
* layout, and the script only adds controls. Everything is configured with custom properties,
|
|
9
|
+
* which can be set anywhere above the track and changed in media or container queries. The root
|
|
10
|
+
* is the query container, so inside `@container sc (...)` set them on .sc-track.
|
|
11
|
+
*
|
|
12
|
+
* --sc-per-view slides per view; a fraction shows part of the next slide. Default 1.
|
|
13
|
+
* --sc-slide-size a fixed slide size, or auto for the content width. Wins over per-view.
|
|
14
|
+
* --sc-gap space between slides. Default 1rem.
|
|
15
|
+
* --sc-offset-before space before the first slide; snapped slides line up with it. Default 0.
|
|
16
|
+
* --sc-offset-after space after the last slide. Default 0.
|
|
17
|
+
* --sc-snap mandatory, proximity or none. Default mandatory.
|
|
18
|
+
* --sc-align start or center. Default start.
|
|
19
|
+
* --sc-centered 1 pads both ends so the first and last slide can reach the centre.
|
|
20
|
+
* Derived from --sc-per-view, so it does not combine with --sc-slide-size.
|
|
21
|
+
* --sc-count the number of slides, when known; per-view never exceeds it.
|
|
22
|
+
* --sc-group slides per step of next and previous: a number, or page. Read by the script.
|
|
23
|
+
* --sc-controls none hides the arrows, dots and play button, e.g. for free mode on phones.
|
|
24
|
+
*
|
|
25
|
+
* Theme, all optional: --sc-control-bg, --sc-control-fg, --sc-control-border,
|
|
26
|
+
* --sc-control-size, --sc-control-radius, --sc-control-shadow, --sc-nav-top, --sc-nav-inset,
|
|
27
|
+
* --sc-dot, --sc-dot-size, --sc-dot-height, --sc-dot-active-size, --sc-dot-radius, --sc-dot-idle,
|
|
28
|
+
* --sc-focus.
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
.sc {
|
|
32
|
+
container: sc / inline-size;
|
|
33
|
+
position: relative;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.sc-track {
|
|
37
|
+
--_n: min(var(--sc-per-view, 1), var(--sc-count, 1000));
|
|
38
|
+
--_gap: var(--sc-gap, 1rem);
|
|
39
|
+
--_size: calc(
|
|
40
|
+
(100cqi - var(--sc-offset-before, 0px) - var(--sc-offset-after, 0px) - (var(--_n) - 1) * var(--_gap)) /
|
|
41
|
+
var(--_n)
|
|
42
|
+
);
|
|
43
|
+
--_edge: calc((100cqi - var(--_size)) / 2 * var(--sc-centered, 0));
|
|
44
|
+
/* Also the containing block for anything absolutely positioned inside the slides, which the
|
|
45
|
+
scroller then clips instead of letting it widen the page. */
|
|
46
|
+
position: relative;
|
|
47
|
+
display: flex;
|
|
48
|
+
gap: var(--_gap);
|
|
49
|
+
margin: 0;
|
|
50
|
+
padding-block: 0;
|
|
51
|
+
padding-inline: calc(var(--sc-offset-before, 0px) + var(--_edge)) calc(var(--sc-offset-after, 0px) + var(--_edge));
|
|
52
|
+
list-style: none;
|
|
53
|
+
overflow-x: auto;
|
|
54
|
+
overflow-y: hidden;
|
|
55
|
+
overscroll-behavior-x: contain;
|
|
56
|
+
/* `x none` is invalid, which makes the property fall back to its initial value, none. */
|
|
57
|
+
scroll-snap-type: x var(--sc-snap, mandatory);
|
|
58
|
+
scroll-padding-inline: var(--sc-offset-before, 0px) var(--sc-offset-after, 0px);
|
|
59
|
+
scrollbar-width: none;
|
|
60
|
+
transition: opacity 0.16s ease;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.sc-track::-webkit-scrollbar {
|
|
64
|
+
display: none;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/* Zero specificity, so a host can size its own slides without a fight. */
|
|
68
|
+
:where(.sc-track > *) {
|
|
69
|
+
flex: 0 0 var(--sc-slide-size, var(--_size));
|
|
70
|
+
min-width: 0;
|
|
71
|
+
scroll-snap-align: var(--sc-align, start);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
:where(.sc-track > [data-sc-snap-off]) {
|
|
75
|
+
scroll-snap-align: none;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/* A row too short to scroll sits in the middle; auto margins collapse to 0 once it overflows. */
|
|
79
|
+
.sc--center-few :where(.sc-track > :first-child) {
|
|
80
|
+
margin-inline-start: auto;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.sc--center-few :where(.sc-track > :last-child) {
|
|
84
|
+
margin-inline-end: auto;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.sc-track:focus-visible {
|
|
88
|
+
outline: 2px solid var(--sc-focus, Highlight);
|
|
89
|
+
outline-offset: -2px;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
.sc[data-sc-drag][data-sc-overflow] .sc-track {
|
|
93
|
+
cursor: grab;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
.sc[data-sc-drag] .sc-track :is(img, a) {
|
|
97
|
+
-webkit-user-drag: none;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
.sc-track[data-sc-dragging] {
|
|
101
|
+
cursor: grabbing;
|
|
102
|
+
scroll-snap-type: none;
|
|
103
|
+
-webkit-user-select: none;
|
|
104
|
+
user-select: none;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
.sc-track[data-sc-fading] {
|
|
108
|
+
opacity: 0;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/* Default controls. All optional: a host can bring its own and bind them to the API. */
|
|
112
|
+
|
|
113
|
+
.sc-nav,
|
|
114
|
+
.sc-play {
|
|
115
|
+
display: var(--sc-controls, grid);
|
|
116
|
+
place-items: center;
|
|
117
|
+
box-sizing: border-box;
|
|
118
|
+
inline-size: var(--sc-control-size, 2.75rem);
|
|
119
|
+
block-size: var(--sc-control-size, 2.75rem);
|
|
120
|
+
padding: 0;
|
|
121
|
+
border: 1px solid var(--sc-control-border, color-mix(in srgb, currentColor 22%, transparent));
|
|
122
|
+
border-radius: var(--sc-control-radius, 50%);
|
|
123
|
+
background: var(--sc-control-bg, Canvas);
|
|
124
|
+
box-shadow: var(--sc-control-shadow, none);
|
|
125
|
+
color: var(--sc-control-fg, CanvasText);
|
|
126
|
+
font: inherit;
|
|
127
|
+
cursor: pointer;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
.sc-nav {
|
|
131
|
+
position: absolute;
|
|
132
|
+
z-index: 1;
|
|
133
|
+
inset-block-start: var(--sc-nav-top, 50%);
|
|
134
|
+
translate: 0 -50%;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
.sc-prev {
|
|
138
|
+
inset-inline-start: var(--sc-nav-inset, 0.5rem);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
.sc-next {
|
|
142
|
+
inset-inline-end: var(--sc-nav-inset, 0.5rem);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
.sc-nav svg,
|
|
146
|
+
.sc-play svg {
|
|
147
|
+
inline-size: 1.25rem;
|
|
148
|
+
block-size: 1.25rem;
|
|
149
|
+
fill: none;
|
|
150
|
+
stroke: currentColor;
|
|
151
|
+
stroke-width: 2;
|
|
152
|
+
stroke-linecap: round;
|
|
153
|
+
stroke-linejoin: round;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
.sc-nav:dir(rtl) svg {
|
|
157
|
+
scale: -1 1;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
.sc-nav[aria-disabled='true'] {
|
|
161
|
+
opacity: 0.35;
|
|
162
|
+
cursor: default;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
.sc-play .sc-icon-pause,
|
|
166
|
+
.sc[data-sc-playing] .sc-play .sc-icon-play {
|
|
167
|
+
display: none;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
.sc[data-sc-playing] .sc-play .sc-icon-pause {
|
|
171
|
+
display: block;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
.sc-dots {
|
|
175
|
+
display: var(--sc-controls, flex);
|
|
176
|
+
flex-wrap: wrap;
|
|
177
|
+
justify-content: center;
|
|
178
|
+
min-block-size: 1.5rem;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
.sc-dot {
|
|
182
|
+
display: grid;
|
|
183
|
+
place-items: center;
|
|
184
|
+
inline-size: 1.5rem;
|
|
185
|
+
block-size: 1.5rem;
|
|
186
|
+
padding: 0;
|
|
187
|
+
border: 0;
|
|
188
|
+
background: none;
|
|
189
|
+
color: var(--sc-dot, currentColor);
|
|
190
|
+
cursor: pointer;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
.sc-dot::before {
|
|
194
|
+
content: '';
|
|
195
|
+
inline-size: var(--sc-dot-size, 0.5rem);
|
|
196
|
+
block-size: var(--sc-dot-height, var(--sc-dot-size, 0.5rem));
|
|
197
|
+
border-radius: var(--sc-dot-radius, 1rem);
|
|
198
|
+
background: currentColor;
|
|
199
|
+
opacity: var(--sc-dot-idle, 0.35);
|
|
200
|
+
transition: inline-size 0.2s ease, opacity 0.2s ease;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
.sc-dot[aria-current]::before {
|
|
204
|
+
inline-size: var(--sc-dot-active-size, 1.25rem);
|
|
205
|
+
opacity: 1;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/* While autoplay runs, the current dot fills up until the next move. */
|
|
209
|
+
.sc[data-sc-playing] .sc-dot[aria-current]::before {
|
|
210
|
+
background:
|
|
211
|
+
linear-gradient(currentColor, currentColor) 0 0 / 0 100% no-repeat,
|
|
212
|
+
color-mix(in srgb, currentColor 35%, transparent);
|
|
213
|
+
animation: sc-progress var(--sc-autoplay-delay, 5s) linear forwards;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
.sc[data-sc-playing] .sc-dot[aria-current]:dir(rtl)::before {
|
|
217
|
+
background-position: 100% 0;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
.sc[data-sc-paused] .sc-dot::before {
|
|
221
|
+
animation-play-state: paused;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
@keyframes sc-progress {
|
|
225
|
+
to {
|
|
226
|
+
background-size: 100% 100%;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
:is(.sc-nav, .sc-play, .sc-dot):focus-visible {
|
|
231
|
+
outline: 2px solid var(--sc-focus, Highlight);
|
|
232
|
+
outline-offset: 2px;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/* Without the script, or without overflow, controls are absent: never focusable and dead.
|
|
236
|
+
Arrows float over the track and can simply go; dots and the play button keep their space,
|
|
237
|
+
so attaching the script cannot shift the layout around them. */
|
|
238
|
+
.sc:not([data-sc-ready][data-sc-overflow]) .sc-nav {
|
|
239
|
+
display: none;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
.sc:not([data-sc-ready][data-sc-overflow]) :is(.sc-dots, .sc-play) {
|
|
243
|
+
visibility: hidden;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
.sc-status,
|
|
247
|
+
.sc-skip:not(:focus) {
|
|
248
|
+
position: absolute;
|
|
249
|
+
inline-size: 1px;
|
|
250
|
+
block-size: 1px;
|
|
251
|
+
overflow: hidden;
|
|
252
|
+
clip-path: inset(50%);
|
|
253
|
+
white-space: nowrap;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
@media (prefers-reduced-motion: reduce) {
|
|
257
|
+
.sc-track,
|
|
258
|
+
.sc-dot::before {
|
|
259
|
+
transition: none;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nordwerk/scroll-carousel",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
4
4
|
"description": "A dependency-free carousel on native scrolling: CSS scroll snap first, arrows, dots, paging and an API as progressive enhancement.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -22,6 +22,8 @@
|
|
|
22
22
|
"sideEffects": [
|
|
23
23
|
"*.css"
|
|
24
24
|
],
|
|
25
|
+
"main": "./dist/index.js",
|
|
26
|
+
"types": "./dist/index.d.ts",
|
|
25
27
|
"exports": {
|
|
26
28
|
".": {
|
|
27
29
|
"types": "./dist/index.d.ts",
|
|
@@ -49,8 +51,18 @@
|
|
|
49
51
|
},
|
|
50
52
|
"./astro": "./src/astro/Carousel.astro",
|
|
51
53
|
"./carousel.css": "./dist/carousel.css",
|
|
54
|
+
"./carousel.layer.css": "./dist/carousel.layer.css",
|
|
52
55
|
"./package.json": "./package.json"
|
|
53
56
|
},
|
|
57
|
+
"typesVersions": {
|
|
58
|
+
"*": {
|
|
59
|
+
"drag": ["./dist/drag.d.ts"],
|
|
60
|
+
"autoplay": ["./dist/autoplay.d.ts"],
|
|
61
|
+
"markup": ["./dist/markup.d.ts"],
|
|
62
|
+
"react": ["./dist/react.d.ts"],
|
|
63
|
+
"preact": ["./dist/preact.d.ts"]
|
|
64
|
+
}
|
|
65
|
+
},
|
|
54
66
|
"files": [
|
|
55
67
|
"dist",
|
|
56
68
|
"src/astro",
|
|
@@ -63,15 +75,16 @@
|
|
|
63
75
|
},
|
|
64
76
|
"scripts": {
|
|
65
77
|
"build": "node scripts/build.mjs",
|
|
66
|
-
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
78
|
+
"typecheck": "tsc -p tsconfig.json --noEmit && tsc -p registry/tsconfig.json",
|
|
67
79
|
"test": "node --test \"test/unit/*.test.ts\"",
|
|
68
80
|
"size": "node scripts/size.mjs",
|
|
69
81
|
"site": "node scripts/build.mjs && node site/generate.mjs",
|
|
70
82
|
"fixtures": "node scripts/fixtures.mjs",
|
|
71
83
|
"test:e2e": "playwright test",
|
|
72
84
|
"serve": "node scripts/serve.mjs",
|
|
73
|
-
"check": "pnpm typecheck && pnpm test && pnpm site && pnpm size && pnpm fixtures && pnpm test:e2e",
|
|
74
|
-
"prepublishOnly": "node scripts/build.mjs"
|
|
85
|
+
"check": "pnpm typecheck && pnpm test && pnpm site && pnpm size && pnpm lint:package && pnpm fixtures && pnpm test:e2e",
|
|
86
|
+
"prepublishOnly": "node scripts/build.mjs",
|
|
87
|
+
"lint:package": "publint --strict && attw --pack . --exclude-entrypoints astro carousel.css carousel.layer.css --ignore-rules cjs-resolves-to-esm"
|
|
75
88
|
},
|
|
76
89
|
"peerDependencies": {
|
|
77
90
|
"preact": ">=10",
|
|
@@ -86,7 +99,9 @@
|
|
|
86
99
|
}
|
|
87
100
|
},
|
|
88
101
|
"devDependencies": {
|
|
102
|
+
"@arethetypeswrong/cli": "0.18.5",
|
|
89
103
|
"@axe-core/playwright": "4.13.0",
|
|
104
|
+
"@base-ui/react": "^1.8.0",
|
|
90
105
|
"@fontsource-variable/geist": "^5.3.0",
|
|
91
106
|
"@playwright/test": "1.61.1",
|
|
92
107
|
"@tailwindcss/cli": "4.3.3",
|
|
@@ -94,16 +109,17 @@
|
|
|
94
109
|
"@types/react": "^19.3.0",
|
|
95
110
|
"@types/react-dom": "^19.3.0",
|
|
96
111
|
"astro": "^7.3.3",
|
|
112
|
+
"class-variance-authority": "^0.7.1",
|
|
113
|
+
"cn": "^0.3.2",
|
|
97
114
|
"esbuild": "0.28.2",
|
|
98
115
|
"preact": "^10.29.8",
|
|
99
116
|
"preact-render-to-string": "6.7.0",
|
|
117
|
+
"publint": "0.3.24",
|
|
100
118
|
"react": "^19.3.0",
|
|
101
119
|
"react-dom": "^19.3.0",
|
|
120
|
+
"shadcn": "4.21.0",
|
|
102
121
|
"tailwindcss": "4.3.3",
|
|
103
122
|
"typescript": "^7.0.2"
|
|
104
123
|
},
|
|
105
|
-
"engines": {
|
|
106
|
-
"node": ">=22"
|
|
107
|
-
},
|
|
108
124
|
"packageManager": "pnpm@12.5.1"
|
|
109
125
|
}
|