@webappwiz/arbor 0.0.28 → 0.0.30

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 (119) hide show
  1. package/AGENTS.md +7 -0
  2. package/README.md +34 -12
  3. package/add.test.ts +125 -0
  4. package/add.ts +192 -0
  5. package/age.ts +11 -0
  6. package/arbor.test.ts +145 -0
  7. package/arbor.ts +429 -0
  8. package/assets.d.ts +9 -0
  9. package/attachments.ts +87 -0
  10. package/build.ts +98 -0
  11. package/claim.test.ts +89 -0
  12. package/claim.ts +73 -0
  13. package/components.json +21 -0
  14. package/config.ts +58 -0
  15. package/dev/api.ts +120 -0
  16. package/dev/app.test.tsx +645 -0
  17. package/dev/app.tsx +80 -0
  18. package/dev/assets.ts +16 -0
  19. package/dev/build/main.txt +68 -0
  20. package/dev/build/shell.txt +21 -0
  21. package/dev/build/styles.txt +2263 -0
  22. package/dev/components/ui/badge.tsx +51 -0
  23. package/dev/components/ui/button.tsx +57 -0
  24. package/dev/components/ui/dialog.tsx +154 -0
  25. package/dev/components/ui/empty.tsx +100 -0
  26. package/dev/components/ui/input-group.tsx +155 -0
  27. package/dev/components/ui/input.tsx +19 -0
  28. package/dev/components/ui/progress.tsx +80 -0
  29. package/dev/components/ui/textarea.tsx +17 -0
  30. package/dev/components/ui/toast.tsx +227 -0
  31. package/dev/feed.ts +69 -0
  32. package/dev/files.tsx +191 -0
  33. package/dev/index.html +21 -0
  34. package/dev/lib/utils.ts +7 -0
  35. package/dev/main.tsx +22 -0
  36. package/dev/markdown.test.tsx +133 -0
  37. package/dev/markdown.tsx +124 -0
  38. package/dev/mentions.tsx +319 -0
  39. package/dev/shadcn.css +649 -0
  40. package/dev/styles.css +107 -0
  41. package/dev/tags.tsx +44 -0
  42. package/dev/tasks.tsx +151 -0
  43. package/dev/todos.tsx +759 -0
  44. package/dev.test.ts +439 -0
  45. package/dev.ts +386 -0
  46. package/e2e.test.ts +256 -0
  47. package/escalate.test.ts +76 -0
  48. package/escalate.ts +112 -0
  49. package/exit.test.ts +71 -0
  50. package/exit.ts +74 -0
  51. package/git.ts +294 -0
  52. package/index.ts +9 -0
  53. package/journal.ts +89 -0
  54. package/list.test.ts +82 -0
  55. package/list.ts +137 -0
  56. package/load-config.test.ts +121 -0
  57. package/load-config.ts +62 -0
  58. package/log.test.ts +65 -0
  59. package/log.ts +40 -0
  60. package/merge.test.ts +332 -0
  61. package/merge.ts +283 -0
  62. package/package.json +32 -15
  63. package/path.test.ts +35 -0
  64. package/path.ts +38 -0
  65. package/plan.test.ts +318 -0
  66. package/plan.ts +302 -0
  67. package/progress.test.ts +54 -0
  68. package/progress.ts +31 -0
  69. package/remove.test.ts +68 -0
  70. package/remove.ts +88 -0
  71. package/repository.ts +83 -0
  72. package/retry.test.ts +43 -0
  73. package/retry.ts +48 -0
  74. package/shell.ts +44 -0
  75. package/show.test.ts +91 -0
  76. package/show.ts +151 -0
  77. package/snapshot.test.ts +33 -0
  78. package/snapshot.ts +84 -0
  79. package/table.ts +20 -0
  80. package/testing.ts +229 -0
  81. package/todo.test.ts +490 -0
  82. package/todo.ts +834 -0
  83. package/wait.test.ts +61 -0
  84. package/wait.ts +77 -0
  85. package/worktree-service.test.ts +158 -0
  86. package/worktree-service.ts +193 -0
  87. package/worktree.ts +239 -0
  88. package/add.d.ts +0 -23
  89. package/age.d.ts +0 -2
  90. package/arbor.d.ts +0 -11
  91. package/attachments.d.ts +0 -36
  92. package/claim.d.ts +0 -11
  93. package/config.d.ts +0 -55
  94. package/config.js +0 -7
  95. package/dev/assets.d.ts +0 -11
  96. package/dev.d.ts +0 -47
  97. package/escalate.d.ts +0 -28
  98. package/exit.d.ts +0 -42
  99. package/git.d.ts +0 -77
  100. package/index.d.ts +0 -2
  101. package/index.js +0 -4669
  102. package/journal.d.ts +0 -29
  103. package/list.d.ts +0 -18
  104. package/load-config.d.ts +0 -15
  105. package/log.d.ts +0 -14
  106. package/merge.d.ts +0 -24
  107. package/path.d.ts +0 -13
  108. package/plan.d.ts +0 -83
  109. package/remove.d.ts +0 -19
  110. package/repository.d.ts +0 -25
  111. package/retry.d.ts +0 -17
  112. package/shell.d.ts +0 -17
  113. package/show.d.ts +0 -53
  114. package/snapshot.d.ts +0 -31
  115. package/table.d.ts +0 -5
  116. package/todo.d.ts +0 -230
  117. package/wait.d.ts +0 -22
  118. package/worktree-service.d.ts +0 -51
  119. package/worktree.d.ts +0 -95
package/dev/shadcn.css ADDED
@@ -0,0 +1,649 @@
1
+ /* Vendored from the shadcn package's dist/tailwind.css (shadcn 4.21.0): the
2
+ custom variants (data-open, data-horizontal, ...) and keyframes the
3
+ components in ./components/ui are written against. The package itself is
4
+ the whole shadcn CLI, too much to install for one stylesheet. */
5
+
6
+ @theme inline {
7
+ @keyframes accordion-down {
8
+ from {
9
+ height: 0;
10
+ }
11
+ to {
12
+ height: var(
13
+ --radix-accordion-content-height,
14
+ var(--accordion-panel-height, auto)
15
+ );
16
+ }
17
+ }
18
+
19
+ @keyframes accordion-up {
20
+ from {
21
+ height: var(
22
+ --radix-accordion-content-height,
23
+ var(--accordion-panel-height, auto)
24
+ );
25
+ }
26
+ to {
27
+ height: 0;
28
+ }
29
+ }
30
+ }
31
+
32
+ /* Custom variants */
33
+ @custom-variant data-open {
34
+ &:where([data-state="open"]),
35
+ &:where([data-open]:not([data-open="false"])) {
36
+ @slot;
37
+ }
38
+ }
39
+
40
+ @custom-variant data-closed {
41
+ &:where([data-state="closed"]),
42
+ &:where([data-closed]:not([data-closed="false"])) {
43
+ @slot;
44
+ }
45
+ }
46
+
47
+ @custom-variant data-checked {
48
+ &:where([data-state="checked"]),
49
+ &:where([data-checked]:not([data-checked="false"])) {
50
+ @slot;
51
+ }
52
+ }
53
+
54
+ @custom-variant data-unchecked {
55
+ &:where([data-state="unchecked"]),
56
+ &:where([data-unchecked]:not([data-unchecked="false"])) {
57
+ @slot;
58
+ }
59
+ }
60
+
61
+ @custom-variant data-selected {
62
+ &:where([data-selected="true"]) {
63
+ @slot;
64
+ }
65
+ }
66
+
67
+ @custom-variant data-disabled {
68
+ &:where([data-disabled="true"]),
69
+ &:where([data-disabled]:not([data-disabled="false"])) {
70
+ @slot;
71
+ }
72
+ }
73
+
74
+ @custom-variant data-active {
75
+ &:where([data-state="active"]),
76
+ &:where([data-active]:not([data-active="false"])) {
77
+ @slot;
78
+ }
79
+ }
80
+
81
+ @custom-variant data-horizontal {
82
+ &:where([data-orientation="horizontal"]) {
83
+ @slot;
84
+ }
85
+ }
86
+
87
+ @custom-variant data-vertical {
88
+ &:where([data-orientation="vertical"]) {
89
+ @slot;
90
+ }
91
+ }
92
+
93
+ @utility no-scrollbar {
94
+ -ms-overflow-style: none;
95
+ scrollbar-width: none;
96
+
97
+ &::-webkit-scrollbar {
98
+ display: none;
99
+ }
100
+ }
101
+
102
+ /* scroll-fade */
103
+ @property --scroll-fade-t {
104
+ syntax: "<length-percentage>";
105
+ inherits: false;
106
+ initial-value: 0px;
107
+ }
108
+ @property --scroll-fade-b {
109
+ syntax: "<length-percentage>";
110
+ inherits: false;
111
+ initial-value: 0px;
112
+ }
113
+ @property --scroll-fade-s {
114
+ syntax: "<length-percentage>";
115
+ inherits: false;
116
+ initial-value: 0px;
117
+ }
118
+ @property --scroll-fade-e {
119
+ syntax: "<length-percentage>";
120
+ inherits: false;
121
+ initial-value: 0px;
122
+ }
123
+ @property --scroll-fade-mask {
124
+ syntax: "*";
125
+ inherits: false;
126
+ }
127
+
128
+ @theme inline {
129
+ @keyframes scroll-fade-reveal-t {
130
+ from {
131
+ --scroll-fade-t: 0px;
132
+ }
133
+ to {
134
+ --scroll-fade-t: var(
135
+ --_scroll-fade-size-t,
136
+ var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10)))
137
+ );
138
+ }
139
+ }
140
+ @keyframes scroll-fade-reveal-b {
141
+ from {
142
+ --scroll-fade-b: var(
143
+ --_scroll-fade-size-b,
144
+ var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10)))
145
+ );
146
+ }
147
+ to {
148
+ --scroll-fade-b: 0px;
149
+ }
150
+ }
151
+ @keyframes scroll-fade-reveal-s {
152
+ from {
153
+ --scroll-fade-s: 0px;
154
+ }
155
+ to {
156
+ --scroll-fade-s: var(
157
+ --_scroll-fade-size-s,
158
+ var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10)))
159
+ );
160
+ }
161
+ }
162
+ @keyframes scroll-fade-reveal-e {
163
+ from {
164
+ --scroll-fade-e: var(
165
+ --_scroll-fade-size-e,
166
+ var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10)))
167
+ );
168
+ }
169
+ to {
170
+ --scroll-fade-e: 0px;
171
+ }
172
+ }
173
+ }
174
+
175
+ @utility scroll-fade {
176
+ --_scroll-fade-size-t: var(
177
+ --scroll-fade-t-size,
178
+ var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10)))
179
+ );
180
+ --_scroll-fade-size-b: var(
181
+ --scroll-fade-b-size,
182
+ var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10)))
183
+ );
184
+ --scroll-fade-block: linear-gradient(
185
+ to bottom,
186
+ transparent 0,
187
+ #000 var(--scroll-fade-t, 0px),
188
+ #000 calc(100% - var(--scroll-fade-b, 0px)),
189
+ transparent 100%
190
+ );
191
+ -webkit-mask-image: var(--scroll-fade-mask, var(--scroll-fade-block));
192
+ mask-image: var(--scroll-fade-mask, var(--scroll-fade-block));
193
+ -webkit-mask-composite: source-in;
194
+ mask-composite: intersect;
195
+ -webkit-mask-repeat: no-repeat;
196
+ mask-repeat: no-repeat;
197
+
198
+ @supports (animation-timeline: scroll()) {
199
+ animation:
200
+ scroll-fade-reveal-t 1ms ease-in-out,
201
+ scroll-fade-reveal-b 1ms ease-in-out;
202
+ animation-timeline: scroll(self y), scroll(self y);
203
+ animation-range:
204
+ 0 var(--scroll-fade-reveal, calc(var(--spacing) * 24)),
205
+ calc(100% - var(--scroll-fade-reveal, calc(var(--spacing) * 24))) 100%;
206
+ animation-fill-mode: both;
207
+ }
208
+
209
+ @supports not (animation-timeline: scroll()) {
210
+ --scroll-fade-t: var(--_scroll-fade-size-t);
211
+ --scroll-fade-b: var(--_scroll-fade-size-b);
212
+ }
213
+ }
214
+
215
+ @utility scroll-fade-y {
216
+ --_scroll-fade-size-t: var(
217
+ --scroll-fade-t-size,
218
+ var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10)))
219
+ );
220
+ --_scroll-fade-size-b: var(
221
+ --scroll-fade-b-size,
222
+ var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10)))
223
+ );
224
+ --scroll-fade-block: linear-gradient(
225
+ to bottom,
226
+ transparent 0,
227
+ #000 var(--scroll-fade-t, 0px),
228
+ #000 calc(100% - var(--scroll-fade-b, 0px)),
229
+ transparent 100%
230
+ );
231
+ -webkit-mask-image: var(--scroll-fade-mask, var(--scroll-fade-block));
232
+ mask-image: var(--scroll-fade-mask, var(--scroll-fade-block));
233
+ -webkit-mask-composite: source-in;
234
+ mask-composite: intersect;
235
+ -webkit-mask-repeat: no-repeat;
236
+ mask-repeat: no-repeat;
237
+
238
+ @supports (animation-timeline: scroll()) {
239
+ animation:
240
+ scroll-fade-reveal-t 1ms ease-in-out,
241
+ scroll-fade-reveal-b 1ms ease-in-out;
242
+ animation-timeline: scroll(self y), scroll(self y);
243
+ animation-range:
244
+ 0 var(--scroll-fade-reveal, calc(var(--spacing) * 24)),
245
+ calc(100% - var(--scroll-fade-reveal, calc(var(--spacing) * 24))) 100%;
246
+ animation-fill-mode: both;
247
+ }
248
+
249
+ @supports not (animation-timeline: scroll()) {
250
+ --scroll-fade-t: var(--_scroll-fade-size-t);
251
+ --scroll-fade-b: var(--_scroll-fade-size-b);
252
+ }
253
+ }
254
+
255
+ @utility scroll-fade-x {
256
+ --_scroll-fade-size-s: var(
257
+ --scroll-fade-s-size,
258
+ var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10)))
259
+ );
260
+ --_scroll-fade-size-e: var(
261
+ --scroll-fade-e-size,
262
+ var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10)))
263
+ );
264
+ --scroll-fade-inline: linear-gradient(
265
+ to right,
266
+ transparent 0,
267
+ #000 var(--scroll-fade-s, 0px),
268
+ #000 calc(100% - var(--scroll-fade-e, 0px)),
269
+ transparent 100%
270
+ );
271
+ &:where([dir="rtl"], [dir="rtl"] *) {
272
+ --scroll-fade-inline: linear-gradient(
273
+ to left,
274
+ transparent 0,
275
+ #000 var(--scroll-fade-s, 0px),
276
+ #000 calc(100% - var(--scroll-fade-e, 0px)),
277
+ transparent 100%
278
+ );
279
+ }
280
+ -webkit-mask-image: var(--scroll-fade-mask, var(--scroll-fade-inline));
281
+ mask-image: var(--scroll-fade-mask, var(--scroll-fade-inline));
282
+ -webkit-mask-composite: source-in;
283
+ mask-composite: intersect;
284
+ -webkit-mask-repeat: no-repeat;
285
+ mask-repeat: no-repeat;
286
+
287
+ @supports (animation-timeline: scroll()) {
288
+ animation:
289
+ scroll-fade-reveal-s 1ms ease-in-out,
290
+ scroll-fade-reveal-e 1ms ease-in-out;
291
+ animation-timeline: scroll(self inline), scroll(self inline);
292
+ animation-range:
293
+ 0 var(--scroll-fade-reveal, calc(var(--spacing) * 24)),
294
+ calc(100% - var(--scroll-fade-reveal, calc(var(--spacing) * 24))) 100%;
295
+ animation-fill-mode: both;
296
+ }
297
+
298
+ @supports not (animation-timeline: scroll()) {
299
+ --scroll-fade-s: var(--_scroll-fade-size-s);
300
+ --scroll-fade-e: var(--_scroll-fade-size-e);
301
+ }
302
+ }
303
+
304
+ @utility scroll-fade-t {
305
+ --_scroll-fade-size-t: var(
306
+ --scroll-fade-t-size,
307
+ var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10)))
308
+ );
309
+ --scroll-fade-mask: linear-gradient(
310
+ to bottom,
311
+ transparent 0,
312
+ #000 var(--scroll-fade-t, 0px),
313
+ #000 100%
314
+ );
315
+ -webkit-mask-image: var(--scroll-fade-mask);
316
+ mask-image: var(--scroll-fade-mask);
317
+ -webkit-mask-composite: source-in;
318
+ mask-composite: intersect;
319
+ -webkit-mask-repeat: no-repeat;
320
+ mask-repeat: no-repeat;
321
+
322
+ @supports (animation-timeline: scroll()) {
323
+ animation: scroll-fade-reveal-t 1ms ease-in-out;
324
+ animation-timeline: scroll(self y);
325
+ animation-range: 0 var(--scroll-fade-reveal, calc(var(--spacing) * 24));
326
+ animation-fill-mode: both;
327
+ }
328
+
329
+ @supports not (animation-timeline: scroll()) {
330
+ --scroll-fade-t: var(--_scroll-fade-size-t);
331
+ }
332
+ }
333
+
334
+ @utility scroll-fade-b {
335
+ --_scroll-fade-size-b: var(
336
+ --scroll-fade-b-size,
337
+ var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10)))
338
+ );
339
+ --scroll-fade-mask: linear-gradient(
340
+ to bottom,
341
+ #000 0,
342
+ #000 calc(100% - var(--scroll-fade-b, 0px)),
343
+ transparent 100%
344
+ );
345
+ -webkit-mask-image: var(--scroll-fade-mask);
346
+ mask-image: var(--scroll-fade-mask);
347
+ -webkit-mask-composite: source-in;
348
+ mask-composite: intersect;
349
+ -webkit-mask-repeat: no-repeat;
350
+ mask-repeat: no-repeat;
351
+
352
+ @supports (animation-timeline: scroll()) {
353
+ animation: scroll-fade-reveal-b 1ms ease-in-out;
354
+ animation-timeline: scroll(self y);
355
+ animation-range: calc(
356
+ 100% -
357
+ var(--scroll-fade-reveal, calc(var(--spacing) * 24))
358
+ )
359
+ 100%;
360
+ animation-fill-mode: both;
361
+ }
362
+
363
+ @supports not (animation-timeline: scroll()) {
364
+ --scroll-fade-b: var(--_scroll-fade-size-b);
365
+ }
366
+ }
367
+
368
+ @utility scroll-fade-l {
369
+ --_scroll-fade-size-s: var(
370
+ --scroll-fade-s-size,
371
+ var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10)))
372
+ );
373
+ --scroll-fade-mask: linear-gradient(
374
+ to right,
375
+ transparent 0,
376
+ #000 var(--scroll-fade-s, 0px),
377
+ #000 100%
378
+ );
379
+ -webkit-mask-image: var(--scroll-fade-mask);
380
+ mask-image: var(--scroll-fade-mask);
381
+ -webkit-mask-composite: source-in;
382
+ mask-composite: intersect;
383
+ -webkit-mask-repeat: no-repeat;
384
+ mask-repeat: no-repeat;
385
+
386
+ @supports (animation-timeline: scroll()) {
387
+ animation: scroll-fade-reveal-s 1ms ease-in-out;
388
+ animation-timeline: scroll(self x);
389
+ animation-range: 0 var(--scroll-fade-reveal, calc(var(--spacing) * 24));
390
+ animation-fill-mode: both;
391
+ }
392
+
393
+ @supports not (animation-timeline: scroll()) {
394
+ --scroll-fade-s: var(--_scroll-fade-size-s);
395
+ }
396
+ }
397
+
398
+ @utility scroll-fade-r {
399
+ --_scroll-fade-size-e: var(
400
+ --scroll-fade-e-size,
401
+ var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10)))
402
+ );
403
+ --scroll-fade-mask: linear-gradient(
404
+ to right,
405
+ #000 0,
406
+ #000 calc(100% - var(--scroll-fade-e, 0px)),
407
+ transparent 100%
408
+ );
409
+ -webkit-mask-image: var(--scroll-fade-mask);
410
+ mask-image: var(--scroll-fade-mask);
411
+ -webkit-mask-composite: source-in;
412
+ mask-composite: intersect;
413
+ -webkit-mask-repeat: no-repeat;
414
+ mask-repeat: no-repeat;
415
+
416
+ @supports (animation-timeline: scroll()) {
417
+ animation: scroll-fade-reveal-e 1ms ease-in-out;
418
+ animation-timeline: scroll(self x);
419
+ animation-range: calc(
420
+ 100% -
421
+ var(--scroll-fade-reveal, calc(var(--spacing) * 24))
422
+ )
423
+ 100%;
424
+ animation-fill-mode: both;
425
+ }
426
+
427
+ @supports not (animation-timeline: scroll()) {
428
+ --scroll-fade-e: var(--_scroll-fade-size-e);
429
+ }
430
+ }
431
+
432
+ @utility scroll-fade-s {
433
+ --_scroll-fade-size-s: var(
434
+ --scroll-fade-s-size,
435
+ var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10)))
436
+ );
437
+ --scroll-fade-mask: linear-gradient(
438
+ to right,
439
+ transparent 0,
440
+ #000 var(--scroll-fade-s, 0px),
441
+ #000 100%
442
+ );
443
+ &:where([dir="rtl"], [dir="rtl"] *) {
444
+ --scroll-fade-mask: linear-gradient(
445
+ to left,
446
+ transparent 0,
447
+ #000 var(--scroll-fade-s, 0px),
448
+ #000 100%
449
+ );
450
+ }
451
+ -webkit-mask-image: var(--scroll-fade-mask);
452
+ mask-image: var(--scroll-fade-mask);
453
+ -webkit-mask-composite: source-in;
454
+ mask-composite: intersect;
455
+ -webkit-mask-repeat: no-repeat;
456
+ mask-repeat: no-repeat;
457
+
458
+ @supports (animation-timeline: scroll()) {
459
+ animation: scroll-fade-reveal-s 1ms ease-in-out;
460
+ animation-timeline: scroll(self inline);
461
+ animation-range: 0 var(--scroll-fade-reveal, calc(var(--spacing) * 24));
462
+ animation-fill-mode: both;
463
+ }
464
+
465
+ @supports not (animation-timeline: scroll()) {
466
+ --scroll-fade-s: var(--_scroll-fade-size-s);
467
+ }
468
+ }
469
+
470
+ @utility scroll-fade-e {
471
+ --_scroll-fade-size-e: var(
472
+ --scroll-fade-e-size,
473
+ var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10)))
474
+ );
475
+ --scroll-fade-mask: linear-gradient(
476
+ to right,
477
+ #000 0,
478
+ #000 calc(100% - var(--scroll-fade-e, 0px)),
479
+ transparent 100%
480
+ );
481
+ &:where([dir="rtl"], [dir="rtl"] *) {
482
+ --scroll-fade-mask: linear-gradient(
483
+ to left,
484
+ #000 0,
485
+ #000 calc(100% - var(--scroll-fade-e, 0px)),
486
+ transparent 100%
487
+ );
488
+ }
489
+ -webkit-mask-image: var(--scroll-fade-mask);
490
+ mask-image: var(--scroll-fade-mask);
491
+ -webkit-mask-composite: source-in;
492
+ mask-composite: intersect;
493
+ -webkit-mask-repeat: no-repeat;
494
+ mask-repeat: no-repeat;
495
+
496
+ @supports (animation-timeline: scroll()) {
497
+ animation: scroll-fade-reveal-e 1ms ease-in-out;
498
+ animation-timeline: scroll(self inline);
499
+ animation-range: calc(
500
+ 100% -
501
+ var(--scroll-fade-reveal, calc(var(--spacing) * 24))
502
+ )
503
+ 100%;
504
+ animation-fill-mode: both;
505
+ }
506
+
507
+ @supports not (animation-timeline: scroll()) {
508
+ --scroll-fade-e: var(--_scroll-fade-size-e);
509
+ }
510
+ }
511
+
512
+ @utility scroll-fade-* {
513
+ --scroll-fade-size: calc(var(--spacing) * --value(integer));
514
+ --scroll-fade-size: --value([length], [percentage]);
515
+ }
516
+
517
+ @utility scroll-fade-t-* {
518
+ --scroll-fade-t-size: calc(var(--spacing) * --value(integer));
519
+ --scroll-fade-t-size: --value([length], [percentage]);
520
+ }
521
+
522
+ @utility scroll-fade-b-* {
523
+ --scroll-fade-b-size: calc(var(--spacing) * --value(integer));
524
+ --scroll-fade-b-size: --value([length], [percentage]);
525
+ }
526
+
527
+ @utility scroll-fade-s-* {
528
+ --scroll-fade-s-size: calc(var(--spacing) * --value(integer));
529
+ --scroll-fade-s-size: --value([length], [percentage]);
530
+ }
531
+
532
+ @utility scroll-fade-e-* {
533
+ --scroll-fade-e-size: calc(var(--spacing) * --value(integer));
534
+ --scroll-fade-e-size: --value([length], [percentage]);
535
+ }
536
+
537
+ @utility scroll-fade-none {
538
+ --scroll-fade-mask: none;
539
+ }
540
+
541
+ /* shimmer */
542
+ @property --shimmer-angle {
543
+ syntax: "<angle>";
544
+ inherits: true;
545
+ initial-value: 20deg;
546
+ }
547
+ @property --shimmer-image {
548
+ syntax: "*";
549
+ inherits: false;
550
+ }
551
+ @property --shimmer-text-fill {
552
+ syntax: "*";
553
+ inherits: false;
554
+ }
555
+
556
+ @theme inline {
557
+ @keyframes tw-shimmer {
558
+ from {
559
+ background-position: 100% 0;
560
+ }
561
+ to {
562
+ background-position: 0 0;
563
+ }
564
+ }
565
+ }
566
+
567
+ @utility shimmer {
568
+ --_spread: var(--shimmer-spread, calc(3ch + 40px));
569
+ --_base: currentColor;
570
+ --_highlight: var(
571
+ --shimmer-color,
572
+ oklch(from currentColor l c h / calc(alpha * 0.2))
573
+ );
574
+
575
+ background-image: var(
576
+ --shimmer-image,
577
+ linear-gradient(
578
+ calc(90deg + var(--shimmer-angle)),
579
+ var(--_base) calc(50% - var(--_spread)),
580
+ color-mix(in oklch, var(--_highlight), var(--_base) 50%)
581
+ calc(50% - var(--_spread) * 0.5),
582
+ var(--_highlight) 50%,
583
+ color-mix(in oklch, var(--_highlight), var(--_base) 50%)
584
+ calc(50% + var(--_spread) * 0.5),
585
+ var(--_base) calc(50% + var(--_spread))
586
+ )
587
+ );
588
+ background-repeat: no-repeat;
589
+ background-size: calc(200% + var(--_spread) * 2) 100%;
590
+ background-position: 0 0;
591
+ background-clip: text;
592
+ -webkit-background-clip: text;
593
+ -webkit-text-fill-color: var(--shimmer-text-fill, transparent);
594
+ animation: tw-shimmer var(--shimmer-duration, 2s) linear infinite;
595
+
596
+ @variant dark {
597
+ --_highlight: var(
598
+ --shimmer-color,
599
+ oklch(from currentColor max(0.8, calc(l + 0.4)) c h / calc(alpha + 0.4))
600
+ );
601
+ }
602
+
603
+ &:where([dir="rtl"], [dir="rtl"] *) {
604
+ animation-direction: reverse;
605
+ }
606
+ }
607
+
608
+ @utility shimmer-once {
609
+ animation-iteration-count: 1;
610
+ }
611
+
612
+ @utility shimmer-reverse {
613
+ animation-direction: reverse;
614
+ }
615
+
616
+ @utility shimmer-none {
617
+ --shimmer-image: none;
618
+ --shimmer-text-fill: currentColor;
619
+ }
620
+
621
+ @utility shimmer-color-* {
622
+ --shimmer-color: --value(--color, [color]);
623
+ --shimmer-color: color-mix(
624
+ in oklch,
625
+ --value(--color, [color]) calc(--modifier(integer) * 1%),
626
+ transparent
627
+ );
628
+ }
629
+
630
+ @utility shimmer-duration-* {
631
+ --shimmer-duration: calc(--value(integer) * 1ms);
632
+ }
633
+
634
+ @utility shimmer-spread-* {
635
+ --shimmer-spread: calc(var(--spacing) * --value(integer));
636
+ --shimmer-spread: --value([length], [percentage]);
637
+ }
638
+
639
+ @utility shimmer-angle-* {
640
+ --shimmer-angle: calc(--value(integer) * 1deg);
641
+ }
642
+
643
+ @media (prefers-reduced-motion: reduce) {
644
+ .shimmer {
645
+ animation: none;
646
+ background-image: none;
647
+ -webkit-text-fill-color: currentColor;
648
+ }
649
+ }