@keepkit/ui 0.15.0 → 0.17.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.
@@ -66,6 +66,11 @@
66
66
  outline-offset: 2px;
67
67
  }
68
68
 
69
+ :where(.keep-theme, [data-keep-theme]) [data-keepkit="card"]:focus-visible {
70
+ outline: 2px solid var(--keep-ring);
71
+ outline-offset: 3px;
72
+ }
73
+
69
74
  :where(.keep-theme, [data-keep-theme]) :is(button, a) {
70
75
  min-height: var(--keep-button-size);
71
76
  }
@@ -1,5 +1,7 @@
1
1
  :where(.keep-theme, [data-keep-theme]) [data-keepkit="collection"] {
2
2
  display: grid;
3
+ container-name: keepkit-collection;
4
+ container-type: inline-size;
3
5
  gap: calc(var(--keep-card-gap) * 1.5);
4
6
  color: var(--keep-foreground);
5
7
  }
@@ -21,7 +23,12 @@
21
23
  }
22
24
 
23
25
  :where(.keep-theme, [data-keep-theme])
24
- :is([data-keepkit="layout"], [data-keepkit="list"] > ul, [data-keepkit="list"] > [data-layout]) {
26
+ :is(
27
+ [data-keepkit="layout"],
28
+ [data-keepkit="list"] > ul,
29
+ [data-keepkit="list"] > [data-layout],
30
+ [data-keepkit="skeleton-list"]
31
+ ) {
25
32
  display: grid;
26
33
  grid-template-columns: repeat(var(--keep-list-columns), minmax(0, 1fr));
27
34
  gap: var(--keep-list-gap);
@@ -33,6 +40,11 @@
33
40
  list-style: none;
34
41
  }
35
42
 
43
+ :where(.keep-theme, [data-keep-theme]) :is([data-keepkit="layout"], [data-keepkit="list"]) {
44
+ container-name: keepkit-layout;
45
+ container-type: inline-size;
46
+ }
47
+
36
48
  :where(.keep-theme, [data-keep-theme])
37
49
  :is(
38
50
  [data-keepkit="layout"][data-layout="grid"],
@@ -52,6 +64,27 @@
52
64
  --keep-list-gap: 0.5rem;
53
65
  }
54
66
 
67
+ :where(.keep-theme, [data-keep-theme])
68
+ :is(
69
+ [data-keepkit="layout"][data-layout="auto"],
70
+ [data-keepkit="list"] > ul[data-layout="auto"],
71
+ [data-keepkit="list"] > [data-layout="auto"]
72
+ ) {
73
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--keep-auto-column-min, 16rem)), 1fr));
74
+ }
75
+
76
+ @container keepkit-layout (max-width: 31.999rem) {
77
+ :where([data-layout="auto"]) {
78
+ --keep-auto-column-min: 100%;
79
+ }
80
+ }
81
+
82
+ @container keepkit-layout (min-width: 48rem) {
83
+ :where([data-layout="auto"]) {
84
+ --keep-auto-column-min: 15rem;
85
+ }
86
+ }
87
+
55
88
  :where(.keep-theme, [data-keep-theme]) [data-keepkit="card"] {
56
89
  display: grid;
57
90
  position: relative;
@@ -69,6 +102,53 @@
69
102
  transform 160ms ease;
70
103
  }
71
104
 
105
+ :where(.keep-theme, [data-keep-theme]) [data-keepkit="card"]:has(> [data-keep-card-part="media"]) {
106
+ grid-template-columns: var(--keep-thumbnail-size) minmax(0, 1fr);
107
+ }
108
+
109
+ :where(.keep-theme, [data-keep-theme]) [data-keep-card-part="media"] {
110
+ grid-row: 1 / span 2;
111
+ width: var(--keep-thumbnail-size);
112
+ height: var(--keep-thumbnail-size);
113
+ overflow: hidden;
114
+ border-radius: calc(var(--keep-radius) - 2px);
115
+ background: var(--keep-muted);
116
+ }
117
+
118
+ :where(.keep-theme, [data-keep-theme]) [data-keep-card-part="media"] > :is(img, [data-keep-card-fallback]) {
119
+ display: grid;
120
+ place-items: center;
121
+ width: 100%;
122
+ height: 100%;
123
+ object-fit: cover;
124
+ }
125
+
126
+ :where(.keep-theme, [data-keep-theme]) [data-keep-card-fallback] {
127
+ overflow: hidden;
128
+ color: var(--keep-muted-foreground);
129
+ font-weight: 700;
130
+ text-overflow: ellipsis;
131
+ white-space: nowrap;
132
+ }
133
+
134
+ :where(.keep-theme, [data-keep-theme]) [data-keep-card-part="content"],
135
+ :where(.keep-theme, [data-keep-theme]) [data-keep-card-part="actions"] {
136
+ display: grid;
137
+ gap: var(--keep-card-gap);
138
+ min-width: 0;
139
+ }
140
+
141
+ :where(.keep-theme, [data-keep-theme])
142
+ [data-keepkit="card"]:has(> [data-keep-card-part="media"])
143
+ > :is([data-keep-card-part="content"], [data-keep-card-part="actions"]) {
144
+ grid-column: 2;
145
+ }
146
+
147
+ :where(.keep-theme, [data-keep-theme]) [data-keep-card-part="actions"] {
148
+ align-items: center;
149
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, 8rem), max-content));
150
+ }
151
+
72
152
  :where(.keep-theme, [data-keep-theme]) [data-keepkit="card"]:hover {
73
153
  border-color: color-mix(in srgb, var(--keep-primary) 32%, var(--keep-border));
74
154
  box-shadow:
@@ -93,36 +173,39 @@
93
173
  grid-column: 2;
94
174
  }
95
175
 
96
- :where(.keep-theme, [data-keep-theme]) [data-keepkit="card"] h3 {
176
+ :where(.keep-theme, [data-keep-theme]) [data-keepkit="card"] :is(h2, h3, h4, h5, h6)[data-keep-card-part="title"] {
97
177
  margin: 0;
98
178
  padding-inline-end: calc(var(--keep-button-size) + var(--keep-card-gap));
99
179
  font-size: var(--keep-title-size);
100
180
  line-height: 1.35;
101
181
  }
102
182
 
103
- :where(.keep-theme, [data-keep-theme]) [data-keepkit="card"] h3 a {
183
+ :where(.keep-theme, [data-keep-theme]) [data-keepkit="card"] [data-keep-card-part="title"] a {
104
184
  color: inherit;
105
185
  text-decoration-color: color-mix(in srgb, currentColor 25%, transparent);
106
186
  text-underline-offset: 0.2em;
107
187
  }
108
188
 
109
- :where(.keep-theme, [data-keep-theme]) [data-keepkit="card"] h3 a:hover {
189
+ :where(.keep-theme, [data-keep-theme]) [data-keepkit="card"] [data-keep-card-part="title"] a:hover {
110
190
  color: var(--keep-primary);
111
191
  text-decoration-color: currentColor;
112
192
  }
113
193
 
114
- :where(.keep-theme, [data-keep-theme]) [data-keepkit="card"] > [data-keepkit="button"] {
194
+ :where(.keep-theme, [data-keep-theme]) [data-keepkit="card"] [data-keep-card-part="actions"] > [data-keepkit="button"] {
115
195
  position: absolute;
116
196
  top: var(--keep-card-gap);
117
197
  right: var(--keep-card-gap);
118
198
  }
119
199
 
120
- :where(.keep-theme, [data-keep-theme]) [data-keepkit="card"] > [data-card-meta] {
200
+ :where(.keep-theme, [data-keep-theme]) [data-keepkit="card"] [data-card-meta] {
121
201
  color: var(--keep-muted-foreground);
122
202
  font-size: 0.8125rem;
123
203
  }
124
204
 
125
- :where(.keep-theme, [data-keep-theme]) [data-keepkit="card"] > [data-keep-action="remove-item"] {
205
+ :where(.keep-theme, [data-keep-theme])
206
+ [data-keepkit="card"]
207
+ [data-keep-card-part="actions"]
208
+ > [data-keep-action="remove-item"] {
126
209
  justify-self: start;
127
210
  border-color: color-mix(in srgb, var(--keep-destructive) 28%, var(--keep-border));
128
211
  background: transparent;
@@ -130,7 +213,7 @@
130
213
  }
131
214
 
132
215
  :where(.keep-theme, [data-keep-theme])
133
- [data-keepkit="card"]:has(> [data-keepkit="button"])
216
+ [data-keep-card-part="actions"]:has(> [data-keepkit="button"])
134
217
  > [data-keep-action="remove-item"] {
135
218
  display: none;
136
219
  }
@@ -177,6 +260,95 @@
177
260
  box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--keep-border) 70%, transparent);
178
261
  }
179
262
 
263
+ :where(.keep-theme, [data-keep-theme]) [data-keepkit="loading-label"] {
264
+ position: absolute;
265
+ width: 1px;
266
+ height: 1px;
267
+ overflow: hidden;
268
+ clip: rect(0 0 0 0);
269
+ clip-path: inset(50%);
270
+ white-space: nowrap;
271
+ }
272
+
273
+ :where(.keep-theme, [data-keep-theme]) [data-keepkit="card-skeleton"] {
274
+ display: grid;
275
+ grid-template-columns: var(--keep-skeleton-media-size, var(--keep-thumbnail-size)) minmax(0, 1fr);
276
+ grid-template-rows: repeat(3, min-content);
277
+ gap: var(--keep-card-gap);
278
+ min-height: calc(var(--keep-thumbnail-size) + 2 * var(--keep-card-padding));
279
+ border: 1px solid var(--keep-border);
280
+ border-radius: var(--keep-radius);
281
+ padding: var(--keep-card-padding);
282
+ background: var(--keep-card);
283
+ }
284
+
285
+ :where(.keep-theme, [data-keep-theme]) [data-keepkit="card-skeleton"] [data-skeleton-part] {
286
+ height: 0.75rem;
287
+ border-radius: 999px;
288
+ background: color-mix(in srgb, var(--keep-muted) 78%, var(--keep-border));
289
+ animation: keepkit-skeleton-pulse 1.4s ease-in-out infinite;
290
+ }
291
+
292
+ :where(.keep-theme, [data-keep-theme]) [data-keepkit="card-skeleton"] [data-skeleton-part="media"] {
293
+ grid-row: 1 / span 3;
294
+ width: var(--keep-skeleton-media-size, var(--keep-thumbnail-size));
295
+ height: var(--keep-skeleton-media-size, var(--keep-thumbnail-size));
296
+ border-radius: calc(var(--keep-radius) - 2px);
297
+ }
298
+
299
+ :where(.keep-theme, [data-keep-theme]) [data-keepkit="card-skeleton"] [data-skeleton-part="title"] {
300
+ width: var(--keep-skeleton-title-width, 78%);
301
+ height: 1rem;
302
+ }
303
+
304
+ :where(.keep-theme, [data-keep-theme]) [data-keepkit="card-skeleton"] [data-skeleton-part="meta"] {
305
+ width: 48%;
306
+ }
307
+
308
+ :where(.keep-theme, [data-keep-theme]) [data-keepkit="card-skeleton"] [data-skeleton-part="tag"] {
309
+ display: inline-block;
310
+ grid-row: 3;
311
+ width: var(--keep-skeleton-tag-width, 4rem);
312
+ }
313
+
314
+ :where(.keep-theme, [data-keep-theme]) [data-keepkit="card-skeleton"][data-layout="grid"],
315
+ :where(.keep-theme, [data-keep-theme]) [data-keepkit="card-skeleton"][data-layout="auto"] {
316
+ --keep-skeleton-media-size: 100%;
317
+ --keep-skeleton-title-width: 88%;
318
+ grid-template-columns: 1fr 1fr;
319
+ }
320
+
321
+ :where(.keep-theme, [data-keep-theme]) [data-keepkit="card-skeleton"][data-layout="grid"] [data-skeleton-part="media"],
322
+ :where(.keep-theme, [data-keep-theme]) [data-keepkit="card-skeleton"][data-layout="auto"] [data-skeleton-part="media"] {
323
+ grid-column: 1 / -1;
324
+ grid-row: 1;
325
+ height: auto;
326
+ aspect-ratio: 16 / 9;
327
+ }
328
+
329
+ :where(.keep-theme, [data-keep-theme]) [data-keepkit="card-skeleton"][data-layout="compact"] {
330
+ --keep-skeleton-media-size: 2.75rem;
331
+ --keep-skeleton-title-width: 64%;
332
+ --keep-skeleton-tag-width: 3rem;
333
+ }
334
+
335
+ @keyframes keepkit-skeleton-pulse {
336
+ 0%,
337
+ 100% {
338
+ opacity: 0.55;
339
+ }
340
+ 50% {
341
+ opacity: 1;
342
+ }
343
+ }
344
+
345
+ @media (prefers-reduced-motion: reduce) {
346
+ :where(.keep-theme, [data-keep-theme]) [data-keepkit="card-skeleton"] [data-skeleton-part] {
347
+ animation: none;
348
+ background: var(--keep-muted);
349
+ }
350
+ }
351
+
180
352
  :where(.keep-theme, [data-keep-theme]) [data-keepkit="pagination"] {
181
353
  display: flex;
182
354
  flex-wrap: wrap;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@keepkit/ui",
3
- "version": "0.15.0",
3
+ "version": "0.17.0",
4
4
  "description": "Headless, accessible React UI components for KeepKit.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -54,7 +54,7 @@
54
54
  "react": ">=18"
55
55
  },
56
56
  "dependencies": {
57
- "@keepkit/core": "0.15.0"
57
+ "@keepkit/core": "0.17.0"
58
58
  },
59
59
  "devDependencies": {
60
60
  "@testing-library/react": "^16.3.3",