@multicomma/arkcn 0.1.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.
Files changed (237) hide show
  1. package/README.md +78 -0
  2. package/bin/arkcn.mjs +78 -0
  3. package/cli/commands.mjs +251 -0
  4. package/cli/project.mjs +168 -0
  5. package/cli/registry.mjs +50 -0
  6. package/cli/ui.mjs +46 -0
  7. package/mcp/server.mjs +149 -0
  8. package/package.json +201 -0
  9. package/registry/base.css +680 -0
  10. package/registry/index.json +1833 -0
  11. package/registry/items/accordion.json +18 -0
  12. package/registry/items/activity-feed.json +18 -0
  13. package/registry/items/alert-dialog.json +18 -0
  14. package/registry/items/alert.json +17 -0
  15. package/registry/items/angle-slider.json +17 -0
  16. package/registry/items/app-shell.json +28 -0
  17. package/registry/items/aspect-ratio.json +13 -0
  18. package/registry/items/attachment.json +19 -0
  19. package/registry/items/avatar.json +17 -0
  20. package/registry/items/badge.json +18 -0
  21. package/registry/items/breadcrumb.json +18 -0
  22. package/registry/items/bubble.json +18 -0
  23. package/registry/items/button-group.json +19 -0
  24. package/registry/items/button.json +18 -0
  25. package/registry/items/calendar.json +19 -0
  26. package/registry/items/canvas.json +24 -0
  27. package/registry/items/card.json +15 -0
  28. package/registry/items/carousel.json +19 -0
  29. package/registry/items/cascader.json +23 -0
  30. package/registry/items/chart.json +17 -0
  31. package/registry/items/chat.json +23 -0
  32. package/registry/items/checkbox.json +18 -0
  33. package/registry/items/clipboard.json +19 -0
  34. package/registry/items/collapsible.json +15 -0
  35. package/registry/items/color-picker.json +19 -0
  36. package/registry/items/combobox.json +20 -0
  37. package/registry/items/command.json +21 -0
  38. package/registry/items/comment-thread.json +25 -0
  39. package/registry/items/context-menu.json +18 -0
  40. package/registry/items/controllable.json +14 -0
  41. package/registry/items/data-grid.json +24 -0
  42. package/registry/items/data-table-adapter.json +14 -0
  43. package/registry/items/data-table.json +32 -0
  44. package/registry/items/date-input.json +17 -0
  45. package/registry/items/dialog.json +19 -0
  46. package/registry/items/direction.json +13 -0
  47. package/registry/items/drag-preview.json +16 -0
  48. package/registry/items/drawer.json +18 -0
  49. package/registry/items/dropdown-menu.json +18 -0
  50. package/registry/items/editable.json +17 -0
  51. package/registry/items/empty.json +17 -0
  52. package/registry/items/field.json +19 -0
  53. package/registry/items/file-upload.json +19 -0
  54. package/registry/items/floating-panel.json +19 -0
  55. package/registry/items/floating-toolbar.json +16 -0
  56. package/registry/items/form.json +14 -0
  57. package/registry/items/format.json +15 -0
  58. package/registry/items/gantt.json +22 -0
  59. package/registry/items/history.json +14 -0
  60. package/registry/items/hotkeys.json +18 -0
  61. package/registry/items/hover-card.json +17 -0
  62. package/registry/items/image-cropper.json +17 -0
  63. package/registry/items/input-group.json +20 -0
  64. package/registry/items/input-otp.json +18 -0
  65. package/registry/items/input.json +15 -0
  66. package/registry/items/item.json +19 -0
  67. package/registry/items/json-tree-view.json +17 -0
  68. package/registry/items/kanban.json +26 -0
  69. package/registry/items/kbd.json +15 -0
  70. package/registry/items/label.json +15 -0
  71. package/registry/items/live-region.json +16 -0
  72. package/registry/items/marker.json +18 -0
  73. package/registry/items/marquee.json +17 -0
  74. package/registry/items/menubar.json +19 -0
  75. package/registry/items/message.json +15 -0
  76. package/registry/items/navigation-menu.json +19 -0
  77. package/registry/items/node-graph.json +22 -0
  78. package/registry/items/number-input.json +18 -0
  79. package/registry/items/pagination.json +18 -0
  80. package/registry/items/password-input.json +18 -0
  81. package/registry/items/popconfirm.json +20 -0
  82. package/registry/items/popover.json +18 -0
  83. package/registry/items/progress.json +17 -0
  84. package/registry/items/qr-code.json +17 -0
  85. package/registry/items/query-builder.json +23 -0
  86. package/registry/items/radio-group.json +17 -0
  87. package/registry/items/rating-group.json +18 -0
  88. package/registry/items/resizable.json +17 -0
  89. package/registry/items/rich-text-editor.json +37 -0
  90. package/registry/items/row-layout.json +15 -0
  91. package/registry/items/scheduler.json +23 -0
  92. package/registry/items/scroll-area.json +17 -0
  93. package/registry/items/segment-group.json +17 -0
  94. package/registry/items/select.json +19 -0
  95. package/registry/items/separator.json +15 -0
  96. package/registry/items/sheet.json +19 -0
  97. package/registry/items/sidebar.json +27 -0
  98. package/registry/items/signature-pad.json +19 -0
  99. package/registry/items/skeleton.json +15 -0
  100. package/registry/items/slider.json +17 -0
  101. package/registry/items/sonner.json +17 -0
  102. package/registry/items/spinner.json +17 -0
  103. package/registry/items/steps.json +19 -0
  104. package/registry/items/swap.json +17 -0
  105. package/registry/items/switch.json +17 -0
  106. package/registry/items/table.json +16 -0
  107. package/registry/items/tabs.json +18 -0
  108. package/registry/items/tags-input.json +18 -0
  109. package/registry/items/textarea.json +15 -0
  110. package/registry/items/time.json +14 -0
  111. package/registry/items/timer.json +18 -0
  112. package/registry/items/toc.json +17 -0
  113. package/registry/items/toggle-group.json +19 -0
  114. package/registry/items/toggle.json +18 -0
  115. package/registry/items/tooltip.json +17 -0
  116. package/registry/items/tour.json +19 -0
  117. package/registry/items/transfer-list.json +24 -0
  118. package/registry/items/tree-select.json +24 -0
  119. package/registry/items/tree-view.json +18 -0
  120. package/registry/items/use-mobile.json +13 -0
  121. package/registry/items/utils.json +17 -0
  122. package/registry/items/virtual-list.json +16 -0
  123. package/src/components/ui/accordion.tsx +111 -0
  124. package/src/components/ui/activity-feed.tsx +228 -0
  125. package/src/components/ui/alert-dialog.tsx +204 -0
  126. package/src/components/ui/alert.tsx +55 -0
  127. package/src/components/ui/angle-slider.tsx +117 -0
  128. package/src/components/ui/app-shell.tsx +985 -0
  129. package/src/components/ui/aspect-ratio.tsx +35 -0
  130. package/src/components/ui/attachment.tsx +193 -0
  131. package/src/components/ui/avatar.tsx +94 -0
  132. package/src/components/ui/badge.tsx +45 -0
  133. package/src/components/ui/breadcrumb.tsx +93 -0
  134. package/src/components/ui/bubble.tsx +119 -0
  135. package/src/components/ui/button-group.tsx +79 -0
  136. package/src/components/ui/button.tsx +65 -0
  137. package/src/components/ui/calendar.tsx +172 -0
  138. package/src/components/ui/canvas.tsx +723 -0
  139. package/src/components/ui/card.tsx +69 -0
  140. package/src/components/ui/carousel.tsx +228 -0
  141. package/src/components/ui/cascader.tsx +754 -0
  142. package/src/components/ui/chart.tsx +303 -0
  143. package/src/components/ui/chat.tsx +544 -0
  144. package/src/components/ui/checkbox.tsx +94 -0
  145. package/src/components/ui/clipboard.tsx +94 -0
  146. package/src/components/ui/collapsible.tsx +32 -0
  147. package/src/components/ui/color-picker.tsx +441 -0
  148. package/src/components/ui/combobox.tsx +400 -0
  149. package/src/components/ui/command.tsx +292 -0
  150. package/src/components/ui/comment-thread.tsx +923 -0
  151. package/src/components/ui/context-menu.tsx +331 -0
  152. package/src/components/ui/data-grid.tsx +1227 -0
  153. package/src/components/ui/data-table.tsx +993 -0
  154. package/src/components/ui/date-input.tsx +103 -0
  155. package/src/components/ui/dialog.tsx +159 -0
  156. package/src/components/ui/direction.tsx +32 -0
  157. package/src/components/ui/drawer.tsx +200 -0
  158. package/src/components/ui/dropdown-menu.tsx +329 -0
  159. package/src/components/ui/editable.tsx +90 -0
  160. package/src/components/ui/empty.tsx +86 -0
  161. package/src/components/ui/field.tsx +218 -0
  162. package/src/components/ui/file-upload.tsx +204 -0
  163. package/src/components/ui/floating-panel.tsx +199 -0
  164. package/src/components/ui/floating-toolbar.tsx +79 -0
  165. package/src/components/ui/format.tsx +22 -0
  166. package/src/components/ui/gantt.tsx +950 -0
  167. package/src/components/ui/hotkeys.tsx +340 -0
  168. package/src/components/ui/hover-card.tsx +83 -0
  169. package/src/components/ui/image-cropper.tsx +100 -0
  170. package/src/components/ui/input-group.tsx +133 -0
  171. package/src/components/ui/input-otp.tsx +82 -0
  172. package/src/components/ui/input.tsx +18 -0
  173. package/src/components/ui/item.tsx +174 -0
  174. package/src/components/ui/json-tree-view.tsx +37 -0
  175. package/src/components/ui/kanban.tsx +884 -0
  176. package/src/components/ui/kbd.tsx +20 -0
  177. package/src/components/ui/label.tsx +30 -0
  178. package/src/components/ui/live-region.tsx +54 -0
  179. package/src/components/ui/marker.tsx +66 -0
  180. package/src/components/ui/marquee.tsx +61 -0
  181. package/src/components/ui/menubar.tsx +456 -0
  182. package/src/components/ui/message.tsx +74 -0
  183. package/src/components/ui/navigation-menu.tsx +202 -0
  184. package/src/components/ui/node-graph.tsx +1723 -0
  185. package/src/components/ui/number-input.tsx +148 -0
  186. package/src/components/ui/pagination.tsx +88 -0
  187. package/src/components/ui/password-input.tsx +104 -0
  188. package/src/components/ui/popconfirm.tsx +149 -0
  189. package/src/components/ui/popover.tsx +126 -0
  190. package/src/components/ui/progress.tsx +114 -0
  191. package/src/components/ui/qr-code.tsx +51 -0
  192. package/src/components/ui/query-builder.tsx +938 -0
  193. package/src/components/ui/radio-group.tsx +108 -0
  194. package/src/components/ui/rating-group.tsx +91 -0
  195. package/src/components/ui/resizable.tsx +41 -0
  196. package/src/components/ui/rich-text-editor.tsx +845 -0
  197. package/src/components/ui/scheduler.tsx +1164 -0
  198. package/src/components/ui/scroll-area.tsx +82 -0
  199. package/src/components/ui/segment-group.tsx +95 -0
  200. package/src/components/ui/select.tsx +354 -0
  201. package/src/components/ui/separator.tsx +32 -0
  202. package/src/components/ui/sheet.tsx +130 -0
  203. package/src/components/ui/sidebar.tsx +665 -0
  204. package/src/components/ui/signature-pad.tsx +112 -0
  205. package/src/components/ui/skeleton.tsx +7 -0
  206. package/src/components/ui/slider.tsx +183 -0
  207. package/src/components/ui/sonner.tsx +37 -0
  208. package/src/components/ui/spinner.tsx +16 -0
  209. package/src/components/ui/steps.tsx +152 -0
  210. package/src/components/ui/swap.tsx +33 -0
  211. package/src/components/ui/switch.tsx +83 -0
  212. package/src/components/ui/table.tsx +72 -0
  213. package/src/components/ui/tabs.tsx +100 -0
  214. package/src/components/ui/tags-input.tsx +153 -0
  215. package/src/components/ui/textarea.tsx +17 -0
  216. package/src/components/ui/timer.tsx +67 -0
  217. package/src/components/ui/toc.tsx +64 -0
  218. package/src/components/ui/toggle-group.tsx +89 -0
  219. package/src/components/ui/toggle.tsx +46 -0
  220. package/src/components/ui/tooltip.tsx +113 -0
  221. package/src/components/ui/tour.tsx +168 -0
  222. package/src/components/ui/transfer-list.tsx +700 -0
  223. package/src/components/ui/tree-select.tsx +638 -0
  224. package/src/components/ui/tree-view.tsx +217 -0
  225. package/src/components/ui/virtual-list.tsx +343 -0
  226. package/src/hooks/use-mobile.ts +19 -0
  227. package/src/lib/controllable.ts +31 -0
  228. package/src/lib/data-table-adapter.ts +67 -0
  229. package/src/lib/drag-preview.ts +39 -0
  230. package/src/lib/form.ts +39 -0
  231. package/src/lib/history.ts +55 -0
  232. package/src/lib/row-layout.ts +81 -0
  233. package/src/lib/table.ts +483 -0
  234. package/src/lib/time.ts +37 -0
  235. package/src/lib/utils.ts +6 -0
  236. package/src/styles/arkcn.css +764 -0
  237. package/src/styles/index.css +3 -0
@@ -0,0 +1,764 @@
1
+ /* arkcn styles: tokens, custom variants, utilities, keyframes, and component CSS.
2
+ The CLI merges this into your stylesheet after "tailwindcss"; if you install the package
3
+ directly instead, import it: @import "@multicomma/arkcn/styles.css"; */
4
+ @import "tw-animate-css";
5
+ @plugin "@tailwindcss/typography";
6
+
7
+ @custom-variant dark (&:is(.dark *));
8
+
9
+ @theme inline {
10
+ --font-heading: var(--font-sans);
11
+ --font-sans: "Geist Variable", sans-serif;
12
+ --color-sidebar-ring: var(--sidebar-ring);
13
+ --color-sidebar-border: var(--sidebar-border);
14
+ --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
15
+ --color-sidebar-accent: var(--sidebar-accent);
16
+ --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
17
+ --color-sidebar-primary: var(--sidebar-primary);
18
+ --color-sidebar-foreground: var(--sidebar-foreground);
19
+ --color-sidebar: var(--sidebar);
20
+ --color-chart-5: var(--chart-5);
21
+ --color-chart-4: var(--chart-4);
22
+ --color-chart-3: var(--chart-3);
23
+ --color-chart-2: var(--chart-2);
24
+ --color-chart-1: var(--chart-1);
25
+ --color-ring: var(--ring);
26
+ --color-input: var(--input);
27
+ --color-border: var(--border);
28
+ --color-destructive: var(--destructive);
29
+ --color-accent-foreground: var(--accent-foreground);
30
+ --color-accent: var(--accent);
31
+ --color-muted-foreground: var(--muted-foreground);
32
+ --color-muted: var(--muted);
33
+ --color-secondary-foreground: var(--secondary-foreground);
34
+ --color-secondary: var(--secondary);
35
+ --color-primary-foreground: var(--primary-foreground);
36
+ --color-primary: var(--primary);
37
+ --color-popover-foreground: var(--popover-foreground);
38
+ --color-popover: var(--popover);
39
+ --color-card-foreground: var(--card-foreground);
40
+ --color-card: var(--card);
41
+ --color-foreground: var(--foreground);
42
+ --color-background: var(--background);
43
+ --radius-sm: calc(var(--radius) * 0.6);
44
+ --radius-md: calc(var(--radius) * 0.8);
45
+ --radius-lg: var(--radius);
46
+ --radius-xl: calc(var(--radius) * 1.4);
47
+ --radius-2xl: calc(var(--radius) * 1.8);
48
+ --radius-3xl: calc(var(--radius) * 2.2);
49
+ --radius-4xl: calc(var(--radius) * 2.6);
50
+ --animate-marquee-x: marquee-x var(--marquee-duration) linear var(--marquee-delay) var(--marquee-loop-count);
51
+ --animate-marquee-y: marquee-y var(--marquee-duration) linear var(--marquee-delay) var(--marquee-loop-count);
52
+
53
+ @keyframes marquee-x {
54
+ to {
55
+ transform: translateX(var(--marquee-translate));
56
+ }
57
+ }
58
+ @keyframes marquee-y {
59
+ to {
60
+ transform: translateY(var(--marquee-translate));
61
+ }
62
+ }
63
+
64
+ @keyframes accordion-down {
65
+ from {
66
+ height: 0;
67
+ }
68
+ to {
69
+ height: var(--accordion-panel-height, auto);
70
+ }
71
+ }
72
+
73
+ @keyframes accordion-up {
74
+ from {
75
+ height: var(--accordion-panel-height, auto);
76
+ }
77
+ to {
78
+ height: 0;
79
+ }
80
+ }
81
+
82
+ @keyframes scroll-fade-reveal-t {
83
+ from {
84
+ --scroll-fade-t: 0px;
85
+ }
86
+ to {
87
+ --scroll-fade-t: var(--_scroll-fade-size-t, var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10))));
88
+ }
89
+ }
90
+ @keyframes scroll-fade-reveal-b {
91
+ from {
92
+ --scroll-fade-b: var(--_scroll-fade-size-b, var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10))));
93
+ }
94
+ to {
95
+ --scroll-fade-b: 0px;
96
+ }
97
+ }
98
+ @keyframes scroll-fade-reveal-s {
99
+ from {
100
+ --scroll-fade-s: 0px;
101
+ }
102
+ to {
103
+ --scroll-fade-s: var(--_scroll-fade-size-s, var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10))));
104
+ }
105
+ }
106
+ @keyframes scroll-fade-reveal-e {
107
+ from {
108
+ --scroll-fade-e: var(--_scroll-fade-size-e, var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10))));
109
+ }
110
+ to {
111
+ --scroll-fade-e: 0px;
112
+ }
113
+ }
114
+
115
+ @keyframes tw-shimmer {
116
+ from {
117
+ background-position: 100% 0;
118
+ }
119
+ to {
120
+ background-position: 0 0;
121
+ }
122
+ }
123
+
124
+ --animate-node-graph-flow: node-graph-flow 0.6s linear infinite;
125
+ @keyframes node-graph-flow {
126
+ to {
127
+ stroke-dashoffset: -16;
128
+ }
129
+ }
130
+ --animate-node-graph-wait: node-graph-wait 1s linear forwards;
131
+ @keyframes node-graph-wait {
132
+ from {
133
+ transform: scaleX(0);
134
+ }
135
+ to {
136
+ transform: scaleX(1);
137
+ }
138
+ }
139
+ }
140
+
141
+ /* Custom variants, properties, and utilities used by src/components/ui */
142
+ /* Custom variants */
143
+ @custom-variant data-open {
144
+ &:where([data-state="open"]),
145
+ &:where([data-open]:not([data-open="false"])) {
146
+ @slot;
147
+ }
148
+ }
149
+
150
+ @custom-variant data-closed {
151
+ &:where([data-state="closed"]),
152
+ &:where([data-closed]:not([data-closed="false"])) {
153
+ @slot;
154
+ }
155
+ }
156
+
157
+ @custom-variant data-checked {
158
+ &:where([data-state="checked"]),
159
+ &:where([data-checked]:not([data-checked="false"])) {
160
+ @slot;
161
+ }
162
+ }
163
+
164
+ @custom-variant data-unchecked {
165
+ &:where([data-state="unchecked"]),
166
+ &:where([data-unchecked]:not([data-unchecked="false"])) {
167
+ @slot;
168
+ }
169
+ }
170
+
171
+ @custom-variant data-selected {
172
+ &:where([data-selected="true"]),
173
+ &:where([data-selected]:not([data-selected="false"])) {
174
+ @slot;
175
+ }
176
+ }
177
+
178
+ @custom-variant data-disabled {
179
+ &:where([data-disabled="true"]),
180
+ &:where([data-disabled]:not([data-disabled="false"])) {
181
+ @slot;
182
+ }
183
+ }
184
+
185
+ @custom-variant data-active {
186
+ &:where([data-state="active"]),
187
+ &:where([data-active]:not([data-active="false"])) {
188
+ @slot;
189
+ }
190
+ }
191
+
192
+ @custom-variant data-horizontal {
193
+ &:where([data-orientation="horizontal"]) {
194
+ @slot;
195
+ }
196
+ }
197
+
198
+ @custom-variant data-vertical {
199
+ &:where([data-orientation="vertical"]) {
200
+ @slot;
201
+ }
202
+ }
203
+
204
+ @utility no-scrollbar {
205
+ -ms-overflow-style: none;
206
+ scrollbar-width: none;
207
+
208
+ &::-webkit-scrollbar {
209
+ display: none;
210
+ }
211
+ }
212
+
213
+ /* scroll-fade */
214
+ @property --scroll-fade-t {
215
+ syntax: "<length-percentage>";
216
+ inherits: false;
217
+ initial-value: 0px;
218
+ }
219
+ @property --scroll-fade-b {
220
+ syntax: "<length-percentage>";
221
+ inherits: false;
222
+ initial-value: 0px;
223
+ }
224
+ @property --scroll-fade-s {
225
+ syntax: "<length-percentage>";
226
+ inherits: false;
227
+ initial-value: 0px;
228
+ }
229
+ @property --scroll-fade-e {
230
+ syntax: "<length-percentage>";
231
+ inherits: false;
232
+ initial-value: 0px;
233
+ }
234
+ @property --scroll-fade-mask {
235
+ syntax: "*";
236
+ inherits: false;
237
+ }
238
+
239
+ @utility scroll-fade {
240
+ --_scroll-fade-size-t: var(--scroll-fade-t-size, var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10))));
241
+ --_scroll-fade-size-b: var(--scroll-fade-b-size, var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10))));
242
+ --scroll-fade-block: linear-gradient(
243
+ to bottom,
244
+ transparent 0,
245
+ #000 var(--scroll-fade-t, 0px),
246
+ #000 calc(100% - var(--scroll-fade-b, 0px)),
247
+ transparent 100%
248
+ );
249
+ -webkit-mask-image: var(--scroll-fade-mask, var(--scroll-fade-block));
250
+ mask-image: var(--scroll-fade-mask, var(--scroll-fade-block));
251
+ -webkit-mask-composite: source-in;
252
+ mask-composite: intersect;
253
+ -webkit-mask-repeat: no-repeat;
254
+ mask-repeat: no-repeat;
255
+
256
+ @supports (animation-timeline: scroll()) {
257
+ animation:
258
+ scroll-fade-reveal-t 1ms ease-in-out,
259
+ scroll-fade-reveal-b 1ms ease-in-out;
260
+ animation-timeline: scroll(self y), scroll(self y);
261
+ animation-range:
262
+ 0 var(--scroll-fade-reveal, calc(var(--spacing) * 24)),
263
+ calc(100% - var(--scroll-fade-reveal, calc(var(--spacing) * 24))) 100%;
264
+ animation-fill-mode: both;
265
+ }
266
+
267
+ @supports not (animation-timeline: scroll()) {
268
+ --scroll-fade-t: var(--_scroll-fade-size-t);
269
+ --scroll-fade-b: var(--_scroll-fade-size-b);
270
+ }
271
+ }
272
+
273
+ @utility scroll-fade-y {
274
+ --_scroll-fade-size-t: var(--scroll-fade-t-size, var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10))));
275
+ --_scroll-fade-size-b: var(--scroll-fade-b-size, var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10))));
276
+ --scroll-fade-block: linear-gradient(
277
+ to bottom,
278
+ transparent 0,
279
+ #000 var(--scroll-fade-t, 0px),
280
+ #000 calc(100% - var(--scroll-fade-b, 0px)),
281
+ transparent 100%
282
+ );
283
+ -webkit-mask-image: var(--scroll-fade-mask, var(--scroll-fade-block));
284
+ mask-image: var(--scroll-fade-mask, var(--scroll-fade-block));
285
+ -webkit-mask-composite: source-in;
286
+ mask-composite: intersect;
287
+ -webkit-mask-repeat: no-repeat;
288
+ mask-repeat: no-repeat;
289
+
290
+ @supports (animation-timeline: scroll()) {
291
+ animation:
292
+ scroll-fade-reveal-t 1ms ease-in-out,
293
+ scroll-fade-reveal-b 1ms ease-in-out;
294
+ animation-timeline: scroll(self y), scroll(self y);
295
+ animation-range:
296
+ 0 var(--scroll-fade-reveal, calc(var(--spacing) * 24)),
297
+ calc(100% - var(--scroll-fade-reveal, calc(var(--spacing) * 24))) 100%;
298
+ animation-fill-mode: both;
299
+ }
300
+
301
+ @supports not (animation-timeline: scroll()) {
302
+ --scroll-fade-t: var(--_scroll-fade-size-t);
303
+ --scroll-fade-b: var(--_scroll-fade-size-b);
304
+ }
305
+ }
306
+
307
+ @utility scroll-fade-x {
308
+ --_scroll-fade-size-s: var(--scroll-fade-s-size, var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10))));
309
+ --_scroll-fade-size-e: var(--scroll-fade-e-size, var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10))));
310
+ --scroll-fade-inline: linear-gradient(
311
+ to right,
312
+ transparent 0,
313
+ #000 var(--scroll-fade-s, 0px),
314
+ #000 calc(100% - var(--scroll-fade-e, 0px)),
315
+ transparent 100%
316
+ );
317
+ &:where([dir="rtl"], [dir="rtl"] *) {
318
+ --scroll-fade-inline: linear-gradient(
319
+ to left,
320
+ transparent 0,
321
+ #000 var(--scroll-fade-s, 0px),
322
+ #000 calc(100% - var(--scroll-fade-e, 0px)),
323
+ transparent 100%
324
+ );
325
+ }
326
+ -webkit-mask-image: var(--scroll-fade-mask, var(--scroll-fade-inline));
327
+ mask-image: var(--scroll-fade-mask, var(--scroll-fade-inline));
328
+ -webkit-mask-composite: source-in;
329
+ mask-composite: intersect;
330
+ -webkit-mask-repeat: no-repeat;
331
+ mask-repeat: no-repeat;
332
+
333
+ @supports (animation-timeline: scroll()) {
334
+ animation:
335
+ scroll-fade-reveal-s 1ms ease-in-out,
336
+ scroll-fade-reveal-e 1ms ease-in-out;
337
+ animation-timeline: scroll(self inline), scroll(self inline);
338
+ animation-range:
339
+ 0 var(--scroll-fade-reveal, calc(var(--spacing) * 24)),
340
+ calc(100% - var(--scroll-fade-reveal, calc(var(--spacing) * 24))) 100%;
341
+ animation-fill-mode: both;
342
+ }
343
+
344
+ @supports not (animation-timeline: scroll()) {
345
+ --scroll-fade-s: var(--_scroll-fade-size-s);
346
+ --scroll-fade-e: var(--_scroll-fade-size-e);
347
+ }
348
+ }
349
+
350
+ @utility scroll-fade-t {
351
+ --_scroll-fade-size-t: var(--scroll-fade-t-size, var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10))));
352
+ --scroll-fade-mask: linear-gradient(to bottom, transparent 0, #000 var(--scroll-fade-t, 0px), #000 100%);
353
+ -webkit-mask-image: var(--scroll-fade-mask);
354
+ mask-image: var(--scroll-fade-mask);
355
+ -webkit-mask-composite: source-in;
356
+ mask-composite: intersect;
357
+ -webkit-mask-repeat: no-repeat;
358
+ mask-repeat: no-repeat;
359
+
360
+ @supports (animation-timeline: scroll()) {
361
+ animation: scroll-fade-reveal-t 1ms ease-in-out;
362
+ animation-timeline: scroll(self y);
363
+ animation-range: 0 var(--scroll-fade-reveal, calc(var(--spacing) * 24));
364
+ animation-fill-mode: both;
365
+ }
366
+
367
+ @supports not (animation-timeline: scroll()) {
368
+ --scroll-fade-t: var(--_scroll-fade-size-t);
369
+ }
370
+ }
371
+
372
+ @utility scroll-fade-b {
373
+ --_scroll-fade-size-b: var(--scroll-fade-b-size, var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10))));
374
+ --scroll-fade-mask: linear-gradient(to bottom, #000 0, #000 calc(100% - var(--scroll-fade-b, 0px)), transparent 100%);
375
+ -webkit-mask-image: var(--scroll-fade-mask);
376
+ mask-image: var(--scroll-fade-mask);
377
+ -webkit-mask-composite: source-in;
378
+ mask-composite: intersect;
379
+ -webkit-mask-repeat: no-repeat;
380
+ mask-repeat: no-repeat;
381
+
382
+ @supports (animation-timeline: scroll()) {
383
+ animation: scroll-fade-reveal-b 1ms ease-in-out;
384
+ animation-timeline: scroll(self y);
385
+ animation-range: calc(100% - var(--scroll-fade-reveal, calc(var(--spacing) * 24))) 100%;
386
+ animation-fill-mode: both;
387
+ }
388
+
389
+ @supports not (animation-timeline: scroll()) {
390
+ --scroll-fade-b: var(--_scroll-fade-size-b);
391
+ }
392
+ }
393
+
394
+ @utility scroll-fade-l {
395
+ --_scroll-fade-size-s: var(--scroll-fade-s-size, var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10))));
396
+ --scroll-fade-mask: linear-gradient(to right, transparent 0, #000 var(--scroll-fade-s, 0px), #000 100%);
397
+ -webkit-mask-image: var(--scroll-fade-mask);
398
+ mask-image: var(--scroll-fade-mask);
399
+ -webkit-mask-composite: source-in;
400
+ mask-composite: intersect;
401
+ -webkit-mask-repeat: no-repeat;
402
+ mask-repeat: no-repeat;
403
+
404
+ @supports (animation-timeline: scroll()) {
405
+ animation: scroll-fade-reveal-s 1ms ease-in-out;
406
+ animation-timeline: scroll(self x);
407
+ animation-range: 0 var(--scroll-fade-reveal, calc(var(--spacing) * 24));
408
+ animation-fill-mode: both;
409
+ }
410
+
411
+ @supports not (animation-timeline: scroll()) {
412
+ --scroll-fade-s: var(--_scroll-fade-size-s);
413
+ }
414
+ }
415
+
416
+ @utility scroll-fade-r {
417
+ --_scroll-fade-size-e: var(--scroll-fade-e-size, var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10))));
418
+ --scroll-fade-mask: linear-gradient(to right, #000 0, #000 calc(100% - var(--scroll-fade-e, 0px)), transparent 100%);
419
+ -webkit-mask-image: var(--scroll-fade-mask);
420
+ mask-image: var(--scroll-fade-mask);
421
+ -webkit-mask-composite: source-in;
422
+ mask-composite: intersect;
423
+ -webkit-mask-repeat: no-repeat;
424
+ mask-repeat: no-repeat;
425
+
426
+ @supports (animation-timeline: scroll()) {
427
+ animation: scroll-fade-reveal-e 1ms ease-in-out;
428
+ animation-timeline: scroll(self x);
429
+ animation-range: calc(100% - var(--scroll-fade-reveal, calc(var(--spacing) * 24))) 100%;
430
+ animation-fill-mode: both;
431
+ }
432
+
433
+ @supports not (animation-timeline: scroll()) {
434
+ --scroll-fade-e: var(--_scroll-fade-size-e);
435
+ }
436
+ }
437
+
438
+ @utility scroll-fade-s {
439
+ --_scroll-fade-size-s: var(--scroll-fade-s-size, var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10))));
440
+ --scroll-fade-mask: linear-gradient(to right, transparent 0, #000 var(--scroll-fade-s, 0px), #000 100%);
441
+ &:where([dir="rtl"], [dir="rtl"] *) {
442
+ --scroll-fade-mask: linear-gradient(to left, transparent 0, #000 var(--scroll-fade-s, 0px), #000 100%);
443
+ }
444
+ -webkit-mask-image: var(--scroll-fade-mask);
445
+ mask-image: var(--scroll-fade-mask);
446
+ -webkit-mask-composite: source-in;
447
+ mask-composite: intersect;
448
+ -webkit-mask-repeat: no-repeat;
449
+ mask-repeat: no-repeat;
450
+
451
+ @supports (animation-timeline: scroll()) {
452
+ animation: scroll-fade-reveal-s 1ms ease-in-out;
453
+ animation-timeline: scroll(self inline);
454
+ animation-range: 0 var(--scroll-fade-reveal, calc(var(--spacing) * 24));
455
+ animation-fill-mode: both;
456
+ }
457
+
458
+ @supports not (animation-timeline: scroll()) {
459
+ --scroll-fade-s: var(--_scroll-fade-size-s);
460
+ }
461
+ }
462
+
463
+ @utility scroll-fade-e {
464
+ --_scroll-fade-size-e: var(--scroll-fade-e-size, var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10))));
465
+ --scroll-fade-mask: linear-gradient(to right, #000 0, #000 calc(100% - var(--scroll-fade-e, 0px)), transparent 100%);
466
+ &:where([dir="rtl"], [dir="rtl"] *) {
467
+ --scroll-fade-mask: linear-gradient(to left, #000 0, #000 calc(100% - var(--scroll-fade-e, 0px)), transparent 100%);
468
+ }
469
+ -webkit-mask-image: var(--scroll-fade-mask);
470
+ mask-image: var(--scroll-fade-mask);
471
+ -webkit-mask-composite: source-in;
472
+ mask-composite: intersect;
473
+ -webkit-mask-repeat: no-repeat;
474
+ mask-repeat: no-repeat;
475
+
476
+ @supports (animation-timeline: scroll()) {
477
+ animation: scroll-fade-reveal-e 1ms ease-in-out;
478
+ animation-timeline: scroll(self inline);
479
+ animation-range: calc(100% - var(--scroll-fade-reveal, calc(var(--spacing) * 24))) 100%;
480
+ animation-fill-mode: both;
481
+ }
482
+
483
+ @supports not (animation-timeline: scroll()) {
484
+ --scroll-fade-e: var(--_scroll-fade-size-e);
485
+ }
486
+ }
487
+
488
+ @utility scroll-fade-* {
489
+ --scroll-fade-size: calc(var(--spacing) * --value(integer));
490
+ --scroll-fade-size: --value([length], [percentage]);
491
+ }
492
+
493
+ @utility scroll-fade-t-* {
494
+ --scroll-fade-t-size: calc(var(--spacing) * --value(integer));
495
+ --scroll-fade-t-size: --value([length], [percentage]);
496
+ }
497
+
498
+ @utility scroll-fade-b-* {
499
+ --scroll-fade-b-size: calc(var(--spacing) * --value(integer));
500
+ --scroll-fade-b-size: --value([length], [percentage]);
501
+ }
502
+
503
+ @utility scroll-fade-s-* {
504
+ --scroll-fade-s-size: calc(var(--spacing) * --value(integer));
505
+ --scroll-fade-s-size: --value([length], [percentage]);
506
+ }
507
+
508
+ @utility scroll-fade-e-* {
509
+ --scroll-fade-e-size: calc(var(--spacing) * --value(integer));
510
+ --scroll-fade-e-size: --value([length], [percentage]);
511
+ }
512
+
513
+ @utility scroll-fade-none {
514
+ --scroll-fade-mask: none;
515
+ }
516
+
517
+ /* shimmer */
518
+ @property --shimmer-angle {
519
+ syntax: "<angle>";
520
+ inherits: true;
521
+ initial-value: 20deg;
522
+ }
523
+ @property --shimmer-image {
524
+ syntax: "*";
525
+ inherits: false;
526
+ }
527
+ @property --shimmer-text-fill {
528
+ syntax: "*";
529
+ inherits: false;
530
+ }
531
+
532
+ @utility shimmer {
533
+ --_spread: var(--shimmer-spread, calc(3ch + 40px));
534
+ --_base: currentColor;
535
+ --_highlight: var(--shimmer-color, oklch(from currentColor l c h / calc(alpha* 0.2)));
536
+
537
+ background-image: var(
538
+ --shimmer-image,
539
+ linear-gradient(
540
+ calc(90deg + var(--shimmer-angle)),
541
+ var(--_base) calc(50% - var(--_spread)),
542
+ color-mix(in oklch, var(--_highlight), var(--_base) 50%) calc(50% - var(--_spread) * 0.5),
543
+ var(--_highlight) 50%,
544
+ color-mix(in oklch, var(--_highlight), var(--_base) 50%) calc(50% + var(--_spread) * 0.5),
545
+ var(--_base) calc(50% + var(--_spread))
546
+ )
547
+ );
548
+ background-repeat: no-repeat;
549
+ background-size: calc(200% + var(--_spread) * 2) 100%;
550
+ background-position: 0 0;
551
+ background-clip: text;
552
+ -webkit-background-clip: text;
553
+ -webkit-text-fill-color: var(--shimmer-text-fill, transparent);
554
+ animation: tw-shimmer var(--shimmer-duration, 2s) linear infinite;
555
+
556
+ @variant dark {
557
+ --_highlight: var(--shimmer-color, oklch(from currentColor max(0.8, calc(l + 0.4)) c h / calc(alpha + 0.4)));
558
+ }
559
+
560
+ &:where([dir="rtl"], [dir="rtl"] *) {
561
+ animation-direction: reverse;
562
+ }
563
+ }
564
+
565
+ @utility shimmer-once {
566
+ animation-iteration-count: 1;
567
+ }
568
+
569
+ @utility shimmer-reverse {
570
+ animation-direction: reverse;
571
+ }
572
+
573
+ @utility shimmer-none {
574
+ --shimmer-image: none;
575
+ --shimmer-text-fill: currentColor;
576
+ }
577
+
578
+ @utility shimmer-color-* {
579
+ --shimmer-color: --value(--color, [color]);
580
+ --shimmer-color: color-mix(in oklch, --value(--color, [color]) calc(--modifier(integer) * 1%), transparent);
581
+ }
582
+
583
+ @utility shimmer-duration-* {
584
+ --shimmer-duration: calc(--value(integer) * 1ms);
585
+ }
586
+
587
+ @utility shimmer-spread-* {
588
+ --shimmer-spread: calc(var(--spacing) * --value(integer));
589
+ --shimmer-spread: --value([length], [percentage]);
590
+ }
591
+
592
+ @utility shimmer-angle-* {
593
+ --shimmer-angle: calc(--value(integer) * 1deg);
594
+ }
595
+
596
+ @media (prefers-reduced-motion: reduce) {
597
+ .shimmer {
598
+ animation: none;
599
+ background-image: none;
600
+ -webkit-text-fill-color: currentColor;
601
+ }
602
+ }
603
+
604
+ :root {
605
+ --background: oklch(1 0 0);
606
+ --foreground: oklch(0.145 0 0);
607
+ --card: oklch(1 0 0);
608
+ --card-foreground: oklch(0.145 0 0);
609
+ --popover: oklch(1 0 0);
610
+ --popover-foreground: oklch(0.145 0 0);
611
+ --primary: oklch(0.205 0 0);
612
+ --primary-foreground: oklch(0.985 0 0);
613
+ --secondary: oklch(0.97 0 0);
614
+ --secondary-foreground: oklch(0.205 0 0);
615
+ --muted: oklch(0.97 0 0);
616
+ --muted-foreground: oklch(0.556 0 0);
617
+ --accent: oklch(0.97 0 0);
618
+ --accent-foreground: oklch(0.205 0 0);
619
+ --destructive: oklch(0.577 0.245 27.325);
620
+ --border: oklch(0.922 0 0);
621
+ --input: oklch(0.922 0 0);
622
+ --ring: oklch(0.708 0 0);
623
+ --chart-1: oklch(0.87 0 0);
624
+ --chart-2: oklch(0.556 0 0);
625
+ --chart-3: oklch(0.439 0 0);
626
+ --chart-4: oklch(0.371 0 0);
627
+ --chart-5: oklch(0.269 0 0);
628
+ --radius: 0.625rem;
629
+ --sidebar: oklch(0.985 0 0);
630
+ --sidebar-foreground: oklch(0.145 0 0);
631
+ --sidebar-primary: oklch(0.205 0 0);
632
+ --sidebar-primary-foreground: oklch(0.985 0 0);
633
+ --sidebar-accent: oklch(0.97 0 0);
634
+ --sidebar-accent-foreground: oklch(0.205 0 0);
635
+ --sidebar-border: oklch(0.922 0 0);
636
+ --sidebar-ring: oklch(0.708 0 0);
637
+ }
638
+
639
+ .dark {
640
+ --background: oklch(0.145 0 0);
641
+ --foreground: oklch(0.985 0 0);
642
+ --card: oklch(0.205 0 0);
643
+ --card-foreground: oklch(0.985 0 0);
644
+ --popover: oklch(0.205 0 0);
645
+ --popover-foreground: oklch(0.985 0 0);
646
+ --primary: oklch(0.922 0 0);
647
+ --primary-foreground: oklch(0.205 0 0);
648
+ --secondary: oklch(0.269 0 0);
649
+ --secondary-foreground: oklch(0.985 0 0);
650
+ --muted: oklch(0.269 0 0);
651
+ --muted-foreground: oklch(0.708 0 0);
652
+ --accent: oklch(0.269 0 0);
653
+ --accent-foreground: oklch(0.985 0 0);
654
+ --destructive: oklch(0.704 0.191 22.216);
655
+ --border: oklch(1 0 0 / 10%);
656
+ --input: oklch(1 0 0 / 15%);
657
+ --ring: oklch(0.556 0 0);
658
+ --chart-1: oklch(0.87 0 0);
659
+ --chart-2: oklch(0.556 0 0);
660
+ --chart-3: oklch(0.439 0 0);
661
+ --chart-4: oklch(0.371 0 0);
662
+ --chart-5: oklch(0.269 0 0);
663
+ --sidebar: oklch(0.205 0 0);
664
+ --sidebar-foreground: oklch(0.985 0 0);
665
+ --sidebar-primary: oklch(0.488 0.243 264.376);
666
+ --sidebar-primary-foreground: oklch(0.985 0 0);
667
+ --sidebar-accent: oklch(0.269 0 0);
668
+ --sidebar-accent-foreground: oklch(0.985 0 0);
669
+ --sidebar-border: oklch(1 0 0 / 10%);
670
+ --sidebar-ring: oklch(0.556 0 0);
671
+ }
672
+
673
+ @layer base {
674
+ * {
675
+ @apply border-border outline-ring/50;
676
+ }
677
+ body {
678
+ @apply bg-background text-foreground;
679
+ }
680
+ html {
681
+ @apply font-sans;
682
+ }
683
+ }
684
+
685
+ /* @registry:component rich-text-editor */
686
+ /* Rich text editor (tiptap) */
687
+ [data-slot="rich-text-editor-content"] .tiptap p.is-editor-empty:first-child::before {
688
+ content: attr(data-placeholder);
689
+ float: left;
690
+ height: 0;
691
+ pointer-events: none;
692
+ color: var(--color-muted-foreground);
693
+ }
694
+ [data-slot="rich-text-editor-content"] .tiptap ul[data-type="taskList"] {
695
+ list-style: none;
696
+ padding-inline-start: 0;
697
+ }
698
+ [data-slot="rich-text-editor-content"] .tiptap ul[data-type="taskList"] li {
699
+ display: flex;
700
+ gap: 0.5rem;
701
+ align-items: flex-start;
702
+ }
703
+ [data-slot="rich-text-editor-content"] .tiptap ul[data-type="taskList"] li > label {
704
+ flex: none;
705
+ margin-top: 0.3em;
706
+ user-select: none;
707
+ }
708
+ [data-slot="rich-text-editor-content"] .tiptap ul[data-type="taskList"] li > div {
709
+ flex: 1 1 auto;
710
+ }
711
+ [data-slot="rich-text-editor-content"] .tiptap ul[data-type="taskList"] li > div > p {
712
+ margin: 0;
713
+ }
714
+ [data-slot="rich-text-editor-content"] .tiptap ul[data-type="taskList"] li[data-checked="true"] > div {
715
+ color: var(--color-muted-foreground);
716
+ text-decoration: line-through;
717
+ }
718
+ [data-slot="rich-text-editor-content"] .tiptap ul[data-type="taskList"] input[type="checkbox"] {
719
+ accent-color: var(--color-primary);
720
+ }
721
+ [data-slot="rich-text-editor-content"] .tiptap mark {
722
+ background-color: color-mix(in oklab, var(--color-amber-400) 45%, transparent);
723
+ color: inherit;
724
+ border-radius: 0.2em;
725
+ padding-inline: 0.1em;
726
+ }
727
+ [data-slot="rich-text-editor-content"] .tiptap table {
728
+ table-layout: fixed;
729
+ width: 100%;
730
+ }
731
+ [data-slot="rich-text-editor-content"] .tiptap table td,
732
+ [data-slot="rich-text-editor-content"] .tiptap table th {
733
+ border: 1px solid var(--color-border);
734
+ padding: 0.375rem 0.5rem;
735
+ vertical-align: top;
736
+ position: relative;
737
+ }
738
+ [data-slot="rich-text-editor-content"] .tiptap table th {
739
+ background: color-mix(in oklab, var(--color-muted) 60%, transparent);
740
+ }
741
+ [data-slot="rich-text-editor-content"] .tiptap table .selectedCell::after {
742
+ content: "";
743
+ position: absolute;
744
+ inset: 0;
745
+ background: color-mix(in oklab, var(--color-primary) 12%, transparent);
746
+ pointer-events: none;
747
+ }
748
+ [data-slot="rich-text-editor-content"] .tiptap img {
749
+ border-radius: var(--radius-lg);
750
+ }
751
+ [data-slot="rich-text-editor-content"] .tiptap img.ProseMirror-selectednode,
752
+ [data-slot="rich-text-editor-content"] .tiptap .ProseMirror-selectednode {
753
+ outline: 2px solid var(--color-ring);
754
+ outline-offset: 2px;
755
+ }
756
+ [data-slot="rich-text-editor-content"] .tiptap a {
757
+ color: var(--color-primary);
758
+ text-decoration: underline;
759
+ text-underline-offset: 0.2em;
760
+ }
761
+ [data-slot="rich-text-editor-content"] .tiptap :where(h1, h2, h3):first-child {
762
+ margin-top: 0;
763
+ }
764
+ /* @registry:end */