@jonsoc/console-app 1.1.34

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 (217) hide show
  1. package/.opencode/agent/css.md +149 -0
  2. package/README.md +32 -0
  3. package/package.json +49 -0
  4. package/public/apple-touch-icon-v3.png +1 -0
  5. package/public/apple-touch-icon.png +1 -0
  6. package/public/email +1 -0
  7. package/public/favicon-96x96-v3.png +1 -0
  8. package/public/favicon-96x96.png +1 -0
  9. package/public/favicon-v3.ico +1 -0
  10. package/public/favicon-v3.svg +1 -0
  11. package/public/favicon.ico +1 -0
  12. package/public/favicon.svg +1 -0
  13. package/public/opencode-brand-assets.zip +0 -0
  14. package/public/robots.txt +6 -0
  15. package/public/site.webmanifest +1 -0
  16. package/public/social-share-black.png +1 -0
  17. package/public/social-share-zen.png +1 -0
  18. package/public/social-share.png +1 -0
  19. package/public/theme.json +182 -0
  20. package/public/web-app-manifest-192x192.png +1 -0
  21. package/public/web-app-manifest-512x512.png +1 -0
  22. package/script/generate-sitemap.ts +103 -0
  23. package/src/app.css +1 -0
  24. package/src/app.tsx +27 -0
  25. package/src/asset/black/hero.png +0 -0
  26. package/src/asset/brand/opencode-brand-assets.zip +0 -0
  27. package/src/asset/brand/opencode-logo-dark.png +0 -0
  28. package/src/asset/brand/opencode-logo-dark.svg +16 -0
  29. package/src/asset/brand/opencode-logo-light.png +0 -0
  30. package/src/asset/brand/opencode-logo-light.svg +16 -0
  31. package/src/asset/brand/opencode-wordmark-dark.png +0 -0
  32. package/src/asset/brand/opencode-wordmark-dark.svg +30 -0
  33. package/src/asset/brand/opencode-wordmark-light.png +0 -0
  34. package/src/asset/brand/opencode-wordmark-light.svg +30 -0
  35. package/src/asset/brand/opencode-wordmark-simple-dark.png +0 -0
  36. package/src/asset/brand/opencode-wordmark-simple-dark.svg +22 -0
  37. package/src/asset/brand/opencode-wordmark-simple-light.png +0 -0
  38. package/src/asset/brand/opencode-wordmark-simple-light.svg +22 -0
  39. package/src/asset/brand/preview-opencode-dark.png +0 -0
  40. package/src/asset/brand/preview-opencode-logo-dark.png +0 -0
  41. package/src/asset/brand/preview-opencode-logo-light.png +0 -0
  42. package/src/asset/brand/preview-opencode-wordmark-dark.png +0 -0
  43. package/src/asset/brand/preview-opencode-wordmark-light.png +0 -0
  44. package/src/asset/brand/preview-opencode-wordmark-simple-dark.png +0 -0
  45. package/src/asset/brand/preview-opencode-wordmark-simple-light.png +0 -0
  46. package/src/asset/lander/avatar-adam.png +0 -0
  47. package/src/asset/lander/avatar-david.png +0 -0
  48. package/src/asset/lander/avatar-dax.png +0 -0
  49. package/src/asset/lander/avatar-frank.png +0 -0
  50. package/src/asset/lander/avatar-jay.png +0 -0
  51. package/src/asset/lander/brand-assets-dark.svg +10 -0
  52. package/src/asset/lander/brand-assets-light.svg +10 -0
  53. package/src/asset/lander/brand.png +0 -0
  54. package/src/asset/lander/check.svg +3 -0
  55. package/src/asset/lander/copy.svg +3 -0
  56. package/src/asset/lander/desktop-app-icon.png +0 -0
  57. package/src/asset/lander/dock.png +0 -0
  58. package/src/asset/lander/logo-dark.svg +11 -0
  59. package/src/asset/lander/logo-light.svg +11 -0
  60. package/src/asset/lander/opencode-comparison-min.mp4 +0 -0
  61. package/src/asset/lander/opencode-comparison-poster.png +0 -0
  62. package/src/asset/lander/opencode-desktop-icon.png +0 -0
  63. package/src/asset/lander/opencode-logo-dark.svg +11 -0
  64. package/src/asset/lander/opencode-logo-light.svg +11 -0
  65. package/src/asset/lander/opencode-min.mp4 +0 -0
  66. package/src/asset/lander/opencode-poster.png +0 -0
  67. package/src/asset/lander/opencode-wordmark-dark.svg +25 -0
  68. package/src/asset/lander/opencode-wordmark-light.svg +25 -0
  69. package/src/asset/lander/screenshot-github.png +0 -0
  70. package/src/asset/lander/screenshot-splash.png +0 -0
  71. package/src/asset/lander/screenshot-vscode.png +0 -0
  72. package/src/asset/lander/screenshot.png +0 -0
  73. package/src/asset/lander/wordmark-dark.svg +3 -0
  74. package/src/asset/lander/wordmark-light.svg +3 -0
  75. package/src/asset/logo-ornate-dark.svg +18 -0
  76. package/src/asset/logo-ornate-light.svg +18 -0
  77. package/src/asset/logo.svg +18 -0
  78. package/src/asset/zen-ornate-dark.svg +8 -0
  79. package/src/asset/zen-ornate-light.svg +8 -0
  80. package/src/component/dropdown.css +80 -0
  81. package/src/component/dropdown.tsx +79 -0
  82. package/src/component/email-signup.tsx +48 -0
  83. package/src/component/faq.tsx +33 -0
  84. package/src/component/footer.tsx +38 -0
  85. package/src/component/header-context-menu.css +63 -0
  86. package/src/component/header.tsx +279 -0
  87. package/src/component/icon.tsx +257 -0
  88. package/src/component/legal.tsx +20 -0
  89. package/src/component/modal.css +66 -0
  90. package/src/component/modal.tsx +24 -0
  91. package/src/component/spotlight.css +15 -0
  92. package/src/component/spotlight.tsx +820 -0
  93. package/src/config.ts +29 -0
  94. package/src/context/auth.session.ts +0 -0
  95. package/src/context/auth.ts +116 -0
  96. package/src/context/auth.withActor.ts +7 -0
  97. package/src/entry-client.tsx +4 -0
  98. package/src/entry-server.tsx +30 -0
  99. package/src/global.d.ts +5 -0
  100. package/src/lib/github.ts +38 -0
  101. package/src/middleware.ts +5 -0
  102. package/src/routes/[...404].css +130 -0
  103. package/src/routes/[...404].tsx +38 -0
  104. package/src/routes/api/enterprise.ts +47 -0
  105. package/src/routes/auth/[...callback].ts +41 -0
  106. package/src/routes/auth/authorize.ts +10 -0
  107. package/src/routes/auth/index.ts +12 -0
  108. package/src/routes/auth/logout.ts +17 -0
  109. package/src/routes/auth/status.ts +7 -0
  110. package/src/routes/bench/[id].tsx +365 -0
  111. package/src/routes/bench/index.tsx +86 -0
  112. package/src/routes/bench/submission.ts +29 -0
  113. package/src/routes/black/common.tsx +62 -0
  114. package/src/routes/black/index.tsx +108 -0
  115. package/src/routes/black/subscribe/[plan].tsx +449 -0
  116. package/src/routes/black/workspace.css +214 -0
  117. package/src/routes/black/workspace.tsx +229 -0
  118. package/src/routes/black.css +828 -0
  119. package/src/routes/black.tsx +285 -0
  120. package/src/routes/brand/index.css +555 -0
  121. package/src/routes/brand/index.tsx +252 -0
  122. package/src/routes/changelog/index.css +477 -0
  123. package/src/routes/changelog/index.tsx +147 -0
  124. package/src/routes/debug/index.ts +13 -0
  125. package/src/routes/desktop-feedback.ts +5 -0
  126. package/src/routes/discord.ts +5 -0
  127. package/src/routes/docs/[...path].ts +20 -0
  128. package/src/routes/docs/index.ts +20 -0
  129. package/src/routes/download/[platform].ts +38 -0
  130. package/src/routes/download/index.css +750 -0
  131. package/src/routes/download/index.tsx +482 -0
  132. package/src/routes/download/types.ts +4 -0
  133. package/src/routes/enterprise/index.css +578 -0
  134. package/src/routes/enterprise/index.tsx +251 -0
  135. package/src/routes/index.css +1251 -0
  136. package/src/routes/index.tsx +840 -0
  137. package/src/routes/legal/privacy-policy/index.css +343 -0
  138. package/src/routes/legal/privacy-policy/index.tsx +1512 -0
  139. package/src/routes/legal/terms-of-service/index.css +254 -0
  140. package/src/routes/legal/terms-of-service/index.tsx +512 -0
  141. package/src/routes/openapi.json.ts +7 -0
  142. package/src/routes/s/[id].ts +20 -0
  143. package/src/routes/stripe/webhook.ts +532 -0
  144. package/src/routes/t/[...path].tsx +20 -0
  145. package/src/routes/temp.tsx +172 -0
  146. package/src/routes/user-menu.css +18 -0
  147. package/src/routes/user-menu.tsx +32 -0
  148. package/src/routes/workspace/[id]/billing/billing-section.module.css +185 -0
  149. package/src/routes/workspace/[id]/billing/billing-section.tsx +240 -0
  150. package/src/routes/workspace/[id]/billing/black-section.module.css +142 -0
  151. package/src/routes/workspace/[id]/billing/black-section.tsx +269 -0
  152. package/src/routes/workspace/[id]/billing/black-waitlist-section.module.css +23 -0
  153. package/src/routes/workspace/[id]/billing/index.tsx +32 -0
  154. package/src/routes/workspace/[id]/billing/monthly-limit-section.module.css +96 -0
  155. package/src/routes/workspace/[id]/billing/monthly-limit-section.tsx +133 -0
  156. package/src/routes/workspace/[id]/billing/payment-section.module.css +93 -0
  157. package/src/routes/workspace/[id]/billing/payment-section.tsx +122 -0
  158. package/src/routes/workspace/[id]/billing/reload-section.module.css +261 -0
  159. package/src/routes/workspace/[id]/billing/reload-section.tsx +213 -0
  160. package/src/routes/workspace/[id]/graph-section.module.css +145 -0
  161. package/src/routes/workspace/[id]/graph-section.tsx +475 -0
  162. package/src/routes/workspace/[id]/index.tsx +81 -0
  163. package/src/routes/workspace/[id]/keys/index.tsx +11 -0
  164. package/src/routes/workspace/[id]/keys/key-section.module.css +197 -0
  165. package/src/routes/workspace/[id]/keys/key-section.tsx +176 -0
  166. package/src/routes/workspace/[id]/members/index.tsx +11 -0
  167. package/src/routes/workspace/[id]/members/member-section.module.css +249 -0
  168. package/src/routes/workspace/[id]/members/member-section.tsx +343 -0
  169. package/src/routes/workspace/[id]/members/role-dropdown.css +72 -0
  170. package/src/routes/workspace/[id]/members/role-dropdown.tsx +43 -0
  171. package/src/routes/workspace/[id]/model-section.module.css +173 -0
  172. package/src/routes/workspace/[id]/model-section.tsx +174 -0
  173. package/src/routes/workspace/[id]/new-user-section.module.css +143 -0
  174. package/src/routes/workspace/[id]/new-user-section.tsx +104 -0
  175. package/src/routes/workspace/[id]/provider-section.module.css +138 -0
  176. package/src/routes/workspace/[id]/provider-section.tsx +188 -0
  177. package/src/routes/workspace/[id]/settings/index.tsx +11 -0
  178. package/src/routes/workspace/[id]/settings/settings-section.module.css +94 -0
  179. package/src/routes/workspace/[id]/settings/settings-section.tsx +122 -0
  180. package/src/routes/workspace/[id]/usage-section.module.css +185 -0
  181. package/src/routes/workspace/[id]/usage-section.tsx +200 -0
  182. package/src/routes/workspace/[id].css +308 -0
  183. package/src/routes/workspace/[id].tsx +62 -0
  184. package/src/routes/workspace/common.tsx +120 -0
  185. package/src/routes/workspace-picker.css +74 -0
  186. package/src/routes/workspace-picker.tsx +122 -0
  187. package/src/routes/workspace.css +107 -0
  188. package/src/routes/workspace.tsx +38 -0
  189. package/src/routes/zen/index.css +866 -0
  190. package/src/routes/zen/index.tsx +343 -0
  191. package/src/routes/zen/util/dataDumper.ts +44 -0
  192. package/src/routes/zen/util/error.ts +13 -0
  193. package/src/routes/zen/util/handler.ts +784 -0
  194. package/src/routes/zen/util/logger.ts +12 -0
  195. package/src/routes/zen/util/provider/anthropic.ts +752 -0
  196. package/src/routes/zen/util/provider/google.ts +75 -0
  197. package/src/routes/zen/util/provider/openai-compatible.ts +546 -0
  198. package/src/routes/zen/util/provider/openai.ts +630 -0
  199. package/src/routes/zen/util/provider/provider.ts +210 -0
  200. package/src/routes/zen/util/rateLimiter.ts +41 -0
  201. package/src/routes/zen/util/stickyProviderTracker.ts +16 -0
  202. package/src/routes/zen/util/trialLimiter.ts +49 -0
  203. package/src/routes/zen/v1/chat/completions.ts +11 -0
  204. package/src/routes/zen/v1/messages.ts +11 -0
  205. package/src/routes/zen/v1/models/[model].ts +13 -0
  206. package/src/routes/zen/v1/models.ts +60 -0
  207. package/src/routes/zen/v1/responses.ts +11 -0
  208. package/src/style/base.css +21 -0
  209. package/src/style/component/button.css +102 -0
  210. package/src/style/index.css +8 -0
  211. package/src/style/reset.css +76 -0
  212. package/src/style/token/color.css +91 -0
  213. package/src/style/token/font.css +21 -0
  214. package/src/style/token/space.css +46 -0
  215. package/sst-env.d.ts +9 -0
  216. package/tsconfig.json +21 -0
  217. package/vite.config.ts +25 -0
@@ -0,0 +1,828 @@
1
+ ::view-transition-group(*) {
2
+ animation-duration: 250ms;
3
+ animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
4
+ }
5
+
6
+ ::view-transition-old(root),
7
+ ::view-transition-new(root) {
8
+ animation-duration: 250ms;
9
+ animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
10
+ }
11
+
12
+ ::view-transition-image-pair(root) {
13
+ isolation: isolate;
14
+ }
15
+
16
+ ::view-transition-old(root) {
17
+ animation: none;
18
+ mix-blend-mode: normal;
19
+ }
20
+
21
+ ::view-transition-new(root) {
22
+ animation: none;
23
+ mix-blend-mode: normal;
24
+ }
25
+
26
+ @keyframes fade-in {
27
+ from {
28
+ opacity: 0;
29
+ }
30
+ to {
31
+ opacity: 1;
32
+ }
33
+ }
34
+
35
+ @keyframes fade-out {
36
+ from {
37
+ opacity: 1;
38
+ }
39
+ to {
40
+ opacity: 0;
41
+ }
42
+ }
43
+
44
+ @keyframes fade-in-up {
45
+ from {
46
+ opacity: 0;
47
+ transform: translateY(8px);
48
+ }
49
+ to {
50
+ opacity: 1;
51
+ transform: translateY(0);
52
+ }
53
+ }
54
+
55
+ @keyframes reveal-terms {
56
+ from {
57
+ mask-position: 0% 200%;
58
+ }
59
+ to {
60
+ mask-position: 0% 50%;
61
+ }
62
+ }
63
+
64
+ @keyframes hide-terms {
65
+ from {
66
+ mask-position: 0% 50%;
67
+ }
68
+ to {
69
+ mask-position: 0% 200%;
70
+ }
71
+ }
72
+
73
+ ::view-transition-old(terms-20),
74
+ ::view-transition-old(terms-100),
75
+ ::view-transition-old(terms-200) {
76
+ mask-image: linear-gradient(to bottom, transparent, black 25% 75%, transparent);
77
+ mask-repeat: no-repeat;
78
+ mask-size: 100% 200%;
79
+ animation: hide-terms 200ms cubic-bezier(0.25, 0, 0.5, 1) forwards;
80
+ }
81
+
82
+ ::view-transition-new(terms-20),
83
+ ::view-transition-new(terms-100),
84
+ ::view-transition-new(terms-200) {
85
+ mask-image: linear-gradient(to bottom, transparent, black 25% 75%, transparent);
86
+ mask-repeat: no-repeat;
87
+ mask-position: 0% 200%;
88
+ mask-size: 100% 200%;
89
+ animation: reveal-terms 300ms cubic-bezier(0.25, 0, 0.5, 1) 50ms forwards;
90
+ }
91
+
92
+ ::view-transition-old(actions-20),
93
+ ::view-transition-old(actions-100),
94
+ ::view-transition-old(actions-200) {
95
+ animation: fade-out 80ms cubic-bezier(0.4, 0, 0.2, 1) forwards;
96
+ }
97
+
98
+ ::view-transition-new(actions-20),
99
+ ::view-transition-new(actions-100),
100
+ ::view-transition-new(actions-200) {
101
+ animation: fade-in-up 300ms cubic-bezier(0.16, 1, 0.3, 1) 300ms forwards;
102
+ opacity: 0;
103
+ }
104
+
105
+ ::view-transition-group(card-20),
106
+ ::view-transition-group(card-100),
107
+ ::view-transition-group(card-200) {
108
+ animation-duration: 250ms;
109
+ animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
110
+ }
111
+
112
+ [data-page="black"] {
113
+ background: #000;
114
+ min-height: 100vh;
115
+ display: flex;
116
+ flex-direction: column;
117
+ align-items: center;
118
+ justify-content: stretch;
119
+ font-family: var(--font-mono);
120
+ color: #fff;
121
+
122
+ [data-component="header-logo"] {
123
+ filter: drop-shadow(0 8px 24px rgba(0, 0, 0, 0.25)) drop-shadow(0 4px 16px rgba(0, 0, 0, 0.1));
124
+ position: relative;
125
+ z-index: 1;
126
+ }
127
+
128
+ .header-light-rays {
129
+ position: absolute;
130
+ inset: 0 0 auto 0;
131
+ height: 30dvh;
132
+ pointer-events: none;
133
+ z-index: 0;
134
+ }
135
+
136
+ [data-component="header"] {
137
+ display: flex;
138
+ flex-direction: column;
139
+ align-items: center;
140
+ justify-content: center;
141
+ padding-top: 40px;
142
+ flex-shrink: 0;
143
+ }
144
+
145
+ [data-component="content"] {
146
+ display: flex;
147
+ flex-direction: column;
148
+ align-items: center;
149
+ width: 100%;
150
+ flex-grow: 1;
151
+
152
+ [data-slot="hero"] {
153
+ display: flex;
154
+ flex-direction: column;
155
+ align-items: center;
156
+ text-align: center;
157
+ gap: 8px;
158
+ margin-top: 40px;
159
+ padding: 0 20px;
160
+
161
+ @media (min-width: 768px) {
162
+ margin-top: 60px;
163
+ }
164
+
165
+ h1 {
166
+ color: rgba(255, 255, 255, 0.92);
167
+ font-size: 16px;
168
+ font-style: normal;
169
+ font-weight: 400;
170
+ line-height: 1.45;
171
+ margin: 0;
172
+
173
+ @media (min-width: 768px) {
174
+ font-size: 20px;
175
+ }
176
+
177
+ @media (max-width: 480px) {
178
+ font-size: 14px;
179
+ }
180
+ }
181
+
182
+ p {
183
+ color: rgba(255, 255, 255, 0.59);
184
+ font-size: 16px;
185
+ font-style: normal;
186
+ font-weight: 400;
187
+ line-height: 1.45;
188
+ margin: 0;
189
+
190
+ @media (min-width: 768px) {
191
+ font-size: 20px;
192
+ }
193
+
194
+ @media (max-width: 480px) {
195
+ font-size: 14px;
196
+ }
197
+ }
198
+ }
199
+
200
+ [data-slot="hero-black"] {
201
+ margin-top: 40px;
202
+ padding: 0 20px;
203
+ position: relative;
204
+
205
+ @media (min-width: 768px) {
206
+ margin-top: 60px;
207
+ }
208
+
209
+ svg {
210
+ width: 100%;
211
+ max-width: 590px;
212
+ height: auto;
213
+ overflow: visible;
214
+ filter: drop-shadow(0 0 20px rgba(255, 255, 255, calc(0.1 + var(--hero-black-glow-intensity, 0) * 0.15)))
215
+ drop-shadow(0 -5px 30px rgba(255, 255, 255, calc(var(--hero-black-glow-intensity, 0) * 0.2)));
216
+ mask-image: linear-gradient(to bottom, black, transparent);
217
+ stroke-width: 1.5;
218
+
219
+ [data-slot="black-base"] {
220
+ fill: url(#hero-black-fill-gradient);
221
+ stroke: url(#hero-black-stroke-gradient);
222
+ }
223
+
224
+ [data-slot="black-glow"] {
225
+ fill: url(#hero-black-top-glow);
226
+ pointer-events: none;
227
+ }
228
+
229
+ [data-slot="black-shimmer"] {
230
+ fill: url(#hero-black-shimmer-gradient);
231
+ pointer-events: none;
232
+ mix-blend-mode: overlay;
233
+ }
234
+ }
235
+ }
236
+
237
+ [data-slot="cta"] {
238
+ display: flex;
239
+ flex-direction: column;
240
+ gap: 16px;
241
+ align-items: center;
242
+ text-align: center;
243
+ margin-top: -40px;
244
+ width: 100%;
245
+
246
+ @media (min-width: 768px) {
247
+ margin-top: -20px;
248
+ }
249
+
250
+ [data-slot="heading"] {
251
+ color: rgba(255, 255, 255, 0.92);
252
+ text-align: center;
253
+ font-size: 18px;
254
+ font-style: normal;
255
+ font-weight: 400;
256
+ line-height: 160%;
257
+
258
+ span {
259
+ display: inline-block;
260
+ }
261
+ }
262
+ [data-slot="subheading"] {
263
+ color: rgba(255, 255, 255, 0.59);
264
+ font-size: 15px;
265
+ font-style: normal;
266
+ font-weight: 400;
267
+ line-height: 160%;
268
+
269
+ @media (min-width: 768px) {
270
+ font-size: 18px;
271
+ line-height: 160%;
272
+ }
273
+ }
274
+ [data-slot="button"] {
275
+ display: inline-flex;
276
+ height: 40px;
277
+ padding: 0 12px;
278
+ justify-content: center;
279
+ align-items: center;
280
+ gap: 8px;
281
+ border-radius: 4px;
282
+ background: rgba(255, 255, 255, 0.92);
283
+ text-decoration: none;
284
+ color: #000;
285
+ font-family: "JetBrains Mono Nerd Font";
286
+ font-size: 16px;
287
+ font-style: normal;
288
+ font-weight: 500;
289
+ line-height: normal;
290
+
291
+ &:hover {
292
+ background: #e0e0e0;
293
+ }
294
+
295
+ &:active {
296
+ transform: scale(0.98);
297
+ }
298
+ }
299
+ [data-slot="back-soon"] {
300
+ color: rgba(255, 255, 255, 0.59);
301
+ text-align: center;
302
+ font-size: 13px;
303
+ font-style: normal;
304
+ font-weight: 400;
305
+ line-height: 160%; /* 20.8px */
306
+ }
307
+ [data-slot="follow-us"] {
308
+ display: inline-flex;
309
+ height: 40px;
310
+ padding: 0 12px;
311
+ justify-content: center;
312
+ align-items: center;
313
+ gap: 8px;
314
+ border-radius: 4px;
315
+ border: 1px solid rgba(255, 255, 255, 0.17);
316
+ color: rgba(255, 255, 255, 0.59);
317
+ font-family: var(--font-mono);
318
+ font-size: 14px;
319
+ font-style: normal;
320
+ font-weight: 400;
321
+ line-height: normal;
322
+ text-decoration: none;
323
+ }
324
+
325
+ [data-slot="pricing"] {
326
+ display: flex;
327
+ flex-direction: column;
328
+ gap: 16px;
329
+ width: 100%;
330
+ max-width: 660px;
331
+ padding: 0 20px;
332
+
333
+ @media (min-width: 768px) {
334
+ padding: 0;
335
+ }
336
+ }
337
+
338
+ [data-slot="pricing-card"] {
339
+ display: flex;
340
+ flex-direction: column;
341
+ gap: 12px;
342
+ padding: 24px;
343
+ border: 1px solid rgba(255, 255, 255, 0.17);
344
+ background: black;
345
+ background-clip: padding-box;
346
+ border-radius: 4px;
347
+ text-decoration: none;
348
+ transition: border-color 0.15s ease;
349
+ cursor: pointer;
350
+ text-align: left;
351
+
352
+ @media (max-width: 480px) {
353
+ padding: 16px;
354
+ }
355
+
356
+ &:hover:not(:active) {
357
+ border-color: rgba(255, 255, 255, 0.35);
358
+ }
359
+
360
+ [data-slot="icon"] {
361
+ color: rgba(255, 255, 255, 0.59);
362
+ }
363
+
364
+ [data-slot="price"] {
365
+ display: flex;
366
+ flex-wrap: wrap;
367
+ align-items: baseline;
368
+ gap: 8px;
369
+ }
370
+
371
+ [data-slot="amount"] {
372
+ color: rgba(255, 255, 255, 0.92);
373
+ font-size: 24px;
374
+ font-weight: 500;
375
+ }
376
+
377
+ [data-slot="period"] {
378
+ color: rgba(255, 255, 255, 0.59);
379
+ font-size: 14px;
380
+ }
381
+
382
+ [data-slot="multiplier"] {
383
+ color: rgba(255, 255, 255, 0.39);
384
+ font-size: 14px;
385
+
386
+ &::before {
387
+ content: "·";
388
+ margin-right: 8px;
389
+ }
390
+ }
391
+ }
392
+
393
+ [data-slot="selected-plan"] {
394
+ display: flex;
395
+ flex-direction: column;
396
+ gap: 32px;
397
+ width: 100%;
398
+ max-width: 660px;
399
+ margin: 0 auto;
400
+ position: relative;
401
+ background-color: rgba(0, 0, 0, 0.75);
402
+ z-index: 1;
403
+
404
+ @media (max-width: 480px) {
405
+ margin: 0 20px;
406
+ width: calc(100% - 40px);
407
+ }
408
+ }
409
+
410
+ [data-slot="selected-card"] {
411
+ display: flex;
412
+ flex-direction: column;
413
+ gap: 12px;
414
+ padding: 24px;
415
+ border: 1px solid rgba(255, 255, 255, 0.17);
416
+ border-radius: 4px;
417
+ width: 100%;
418
+
419
+ [data-slot="icon"] {
420
+ color: rgba(255, 255, 255, 0.59);
421
+ }
422
+
423
+ [data-slot="price"] {
424
+ display: flex;
425
+ flex-wrap: wrap;
426
+ align-items: baseline;
427
+ gap: 8px;
428
+ }
429
+
430
+ [data-slot="amount"] {
431
+ color: rgba(255, 255, 255, 0.92);
432
+ font-size: 24px;
433
+ font-weight: 500;
434
+ }
435
+
436
+ [data-slot="period"] {
437
+ color: rgba(255, 255, 255, 0.59);
438
+ font-size: 14px;
439
+ }
440
+
441
+ [data-slot="multiplier"] {
442
+ color: rgba(255, 255, 255, 0.39);
443
+ font-size: 14px;
444
+
445
+ &::before {
446
+ content: "·";
447
+ margin-right: 8px;
448
+ }
449
+ }
450
+
451
+ [data-slot="terms"] {
452
+ list-style: none;
453
+ padding: 0;
454
+ margin: 0;
455
+ display: flex;
456
+ flex-direction: column;
457
+ gap: 8px;
458
+ text-align: left;
459
+
460
+ li {
461
+ color: rgba(255, 255, 255, 0.59);
462
+ font-size: 14px;
463
+ line-height: 1.5;
464
+ padding-left: 16px;
465
+ position: relative;
466
+
467
+ &::before {
468
+ content: "▪";
469
+ position: absolute;
470
+ left: 0;
471
+ color: rgba(255, 255, 255, 0.39);
472
+ }
473
+
474
+ @media (max-width: 768px) {
475
+ font-size: 12px;
476
+ }
477
+ }
478
+ }
479
+
480
+ [data-slot="actions"] {
481
+ display: flex;
482
+ gap: 16px;
483
+ margin-top: 8px;
484
+
485
+ button,
486
+ a {
487
+ flex: 1;
488
+ display: inline-flex;
489
+ height: 48px;
490
+ padding: 0 16px;
491
+ justify-content: center;
492
+ align-items: center;
493
+ border-radius: 4px;
494
+ font-family: var(--font-mono);
495
+ font-size: 16px;
496
+ font-weight: 400;
497
+ text-decoration: none;
498
+ cursor: pointer;
499
+ }
500
+
501
+ [data-slot="cancel"] {
502
+ background: rgba(255, 255, 255, 0.05);
503
+ border: 1px solid rgba(255, 255, 255, 0.17);
504
+ color: rgba(255, 255, 255, 0.92);
505
+ transition-property: background-color, border-color;
506
+ transition-duration: 150ms;
507
+ transition-timing-function: cubic-bezier(0.25, 0, 0.5, 1);
508
+
509
+ &:hover {
510
+ background-color: rgba(255, 255, 255, 0.08);
511
+ border-color: rgba(255, 255, 255, 0.25);
512
+ }
513
+ }
514
+
515
+ [data-slot="continue"] {
516
+ background: rgb(255, 255, 255);
517
+ color: rgb(0, 0, 0);
518
+ transition: background-color 150ms cubic-bezier(0.25, 0, 0.5, 1);
519
+
520
+ &:hover {
521
+ background: rgba(255, 255, 255, 0.9);
522
+ }
523
+ }
524
+ }
525
+ }
526
+
527
+ [data-slot="fine-print"] {
528
+ color: rgba(255, 255, 255, 0.39);
529
+ text-align: center;
530
+ font-size: 13px;
531
+ font-style: normal;
532
+ font-weight: 400;
533
+ line-height: 160%; /* 20.8px */
534
+ font-style: italic;
535
+
536
+ a {
537
+ color: rgba(255, 255, 255, 0.39);
538
+ text-decoration: underline;
539
+ }
540
+ }
541
+ }
542
+
543
+ /* Subscribe page styles */
544
+ [data-slot="subscribe-form"] {
545
+ display: flex;
546
+ flex-direction: column;
547
+ gap: 32px;
548
+ align-items: center;
549
+ margin-top: -18px;
550
+ width: 100%;
551
+ max-width: 660px;
552
+ padding: 0 20px;
553
+
554
+ @media (min-width: 768px) {
555
+ margin-top: 40px;
556
+ padding: 0;
557
+ }
558
+
559
+ [data-slot="form-card"] {
560
+ width: 100%;
561
+ border: 1px solid rgba(255, 255, 255, 0.17);
562
+ border-radius: 4px;
563
+ padding: 24px;
564
+ display: flex;
565
+ flex-direction: column;
566
+ gap: 20px;
567
+ }
568
+
569
+ [data-slot="plan-header"] {
570
+ display: flex;
571
+ flex-direction: column;
572
+ gap: 8px;
573
+ }
574
+
575
+ [data-slot="title"] {
576
+ color: rgba(255, 255, 255, 0.92);
577
+ font-size: 16px;
578
+ font-weight: 400;
579
+ margin-bottom: 8px;
580
+ }
581
+
582
+ [data-slot="icon"] {
583
+ color: rgba(255, 255, 255, 0.59);
584
+ isolation: isolate;
585
+ transform: translateZ(0);
586
+ }
587
+
588
+ [data-slot="price"] {
589
+ display: flex;
590
+ flex-wrap: wrap;
591
+ align-items: baseline;
592
+ gap: 8px;
593
+ }
594
+
595
+ [data-slot="amount"] {
596
+ color: rgba(255, 255, 255, 0.92);
597
+ font-size: 24px;
598
+ font-weight: 500;
599
+ }
600
+
601
+ [data-slot="period"] {
602
+ color: rgba(255, 255, 255, 0.59);
603
+ font-size: 14px;
604
+ }
605
+
606
+ [data-slot="multiplier"] {
607
+ color: rgba(255, 255, 255, 0.39);
608
+ font-size: 14px;
609
+
610
+ &::before {
611
+ content: "·";
612
+ margin: 0 8px;
613
+ }
614
+ }
615
+
616
+ [data-slot="divider"] {
617
+ height: 1px;
618
+ background: rgba(255, 255, 255, 0.17);
619
+ }
620
+
621
+ [data-slot="section-title"] {
622
+ color: rgba(255, 255, 255, 0.92);
623
+ font-size: 16px;
624
+ font-weight: 400;
625
+ }
626
+
627
+ [data-slot="checkout-form"] {
628
+ display: flex;
629
+ flex-direction: column;
630
+ gap: 20px;
631
+ }
632
+
633
+ [data-slot="error"] {
634
+ color: #ff6b6b;
635
+ font-size: 14px;
636
+ }
637
+
638
+ [data-slot="submit-button"] {
639
+ width: 100%;
640
+ height: 48px;
641
+ background: rgba(255, 255, 255, 0.92);
642
+ border: none;
643
+ border-radius: 4px;
644
+ color: #000;
645
+ font-family: var(--font-mono);
646
+ font-size: 16px;
647
+ font-weight: 500;
648
+ cursor: pointer;
649
+ transition: background 0.15s ease;
650
+
651
+ &:hover:not(:disabled) {
652
+ background: #e0e0e0;
653
+ }
654
+
655
+ &:disabled {
656
+ opacity: 0.5;
657
+ cursor: not-allowed;
658
+ }
659
+ }
660
+
661
+ [data-slot="charge-notice"] {
662
+ color: #d4a500;
663
+ font-size: 14px;
664
+ text-align: center;
665
+ }
666
+
667
+ [data-slot="loading"] {
668
+ display: flex;
669
+ justify-content: center;
670
+ padding: 40px 0;
671
+
672
+ p {
673
+ color: rgba(255, 255, 255, 0.59);
674
+ font-size: 14px;
675
+ }
676
+ }
677
+
678
+ [data-slot="fine-print"] {
679
+ color: rgba(255, 255, 255, 0.39);
680
+ text-align: center;
681
+ font-size: 13px;
682
+ font-style: italic;
683
+ view-transition-name: fine-print;
684
+
685
+ a {
686
+ color: rgba(255, 255, 255, 0.39);
687
+ text-decoration: underline;
688
+ }
689
+ }
690
+
691
+ [data-slot="workspace-picker"] {
692
+ [data-slot="workspace-list"] {
693
+ width: 100%;
694
+ padding: 0;
695
+ margin: 0;
696
+ list-style: none;
697
+ display: flex;
698
+ flex-direction: column;
699
+ align-items: flex-start;
700
+ gap: 8px;
701
+ align-self: stretch;
702
+ outline: none;
703
+ overflow-y: auto;
704
+ max-height: 240px;
705
+ scrollbar-width: none;
706
+
707
+ &::-webkit-scrollbar {
708
+ display: none;
709
+ }
710
+
711
+ [data-slot="workspace-item"] {
712
+ width: 100%;
713
+ display: flex;
714
+ padding: 8px 12px;
715
+ align-items: center;
716
+ gap: 8px;
717
+ align-self: stretch;
718
+ cursor: pointer;
719
+
720
+ [data-slot="selected-icon"] {
721
+ visibility: hidden;
722
+ color: rgba(255, 255, 255, 0.39);
723
+ font-family: "IBM Plex Mono", monospace;
724
+ font-size: 16px;
725
+ font-style: normal;
726
+ font-weight: 400;
727
+ line-height: 160%;
728
+ }
729
+
730
+ span:last-child {
731
+ color: rgba(255, 255, 255, 0.92);
732
+ font-size: 16px;
733
+ font-style: normal;
734
+ font-weight: 400;
735
+ line-height: 160%;
736
+ }
737
+
738
+ &:hover,
739
+ &[data-active="true"] {
740
+ background: #161616;
741
+
742
+ [data-slot="selected-icon"] {
743
+ visibility: visible;
744
+ }
745
+ }
746
+ }
747
+ }
748
+ }
749
+ }
750
+ }
751
+
752
+ [data-component="footer"] {
753
+ display: flex;
754
+ flex-direction: column;
755
+ width: 100%;
756
+ justify-content: center;
757
+ align-items: center;
758
+ gap: 24px;
759
+ flex-shrink: 0;
760
+
761
+ @media (min-width: 768px) {
762
+ height: 120px;
763
+ }
764
+
765
+ [data-slot="footer-content"] {
766
+ display: flex;
767
+ gap: 24px;
768
+ align-items: center;
769
+ justify-content: center;
770
+
771
+ @media (min-width: 768px) {
772
+ gap: 40px;
773
+ }
774
+
775
+ span,
776
+ a {
777
+ color: rgba(255, 255, 255, 0.39);
778
+ font-family: "JetBrains Mono Nerd Font";
779
+ font-size: 16px;
780
+ font-style: normal;
781
+ font-weight: 400;
782
+ line-height: normal;
783
+ text-decoration: none;
784
+ }
785
+
786
+ [data-slot="github-stars"] {
787
+ color: rgba(255, 255, 255, 0.25);
788
+ font-family: "JetBrains Mono Nerd Font";
789
+ font-size: 16px;
790
+ font-style: normal;
791
+ font-weight: 400;
792
+ line-height: normal;
793
+ }
794
+
795
+ [data-slot="anomaly"] {
796
+ display: none;
797
+
798
+ @media (min-width: 768px) {
799
+ display: block;
800
+ }
801
+ }
802
+ }
803
+ [data-slot="anomaly-alt"] {
804
+ color: rgba(255, 255, 255, 0.39);
805
+ font-family: "JetBrains Mono Nerd Font";
806
+ font-size: 16px;
807
+ font-style: normal;
808
+ font-weight: 400;
809
+ line-height: normal;
810
+ text-decoration: none;
811
+ margin-bottom: 24px;
812
+
813
+ a {
814
+ color: rgba(255, 255, 255, 0.39);
815
+ font-family: "JetBrains Mono Nerd Font";
816
+ font-size: 16px;
817
+ font-style: normal;
818
+ font-weight: 400;
819
+ line-height: normal;
820
+ text-decoration: none;
821
+ }
822
+
823
+ @media (min-width: 768px) {
824
+ display: none;
825
+ }
826
+ }
827
+ }
828
+ }