@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,149 @@
1
+ ---
2
+ description: use whenever you are styling a ui with css
3
+ ---
4
+
5
+ you are very good at writing clean maintainable css using modern techniques
6
+
7
+ css is structured like this
8
+
9
+ ```css
10
+ [data-page="home"] {
11
+ [data-component="header"] {
12
+ [data-slot="logo"] {
13
+ }
14
+ }
15
+ }
16
+ ```
17
+
18
+ top level pages are scoped using `data-page`
19
+
20
+ pages can break down into components using `data-component`
21
+
22
+ components can break down into slots using `data-slot`
23
+
24
+ structure things so that this hierarchy is followed IN YOUR CSS - you should rarely need to
25
+ nest components inside other components. you should NEVER nest components inside
26
+ slots. you should NEVER nest slots inside other slots.
27
+
28
+ **IMPORTANT: This hierarchy rule applies to CSS structure, NOT JSX/DOM structure.**
29
+
30
+ The hierarchy in css file does NOT have to match the hierarchy in the dom - you
31
+ can put components or slots at the same level in CSS even if one goes inside another in the DOM.
32
+
33
+ Your JSX can nest however makes semantic sense - components can be inside slots,
34
+ slots can contain components, etc. The DOM structure should be whatever makes the most
35
+ semantic and functional sense.
36
+
37
+ It is more important to follow the pages -> components -> slots structure IN YOUR CSS,
38
+ while keeping your JSX/DOM structure logical and semantic.
39
+
40
+ use data attributes to represent different states of the component
41
+
42
+ ```css
43
+ [data-component="modal"] {
44
+ opacity: 0;
45
+
46
+ &[data-state="open"] {
47
+ opacity: 1;
48
+ }
49
+ }
50
+ ```
51
+
52
+ this will allow jsx to control the styling
53
+
54
+ avoid selectors that just target an element type like `> span` you should assign
55
+ it a slot name. it's ok to do this sometimes where it makes sense semantically
56
+ like targeting `li` elements in a list
57
+
58
+ in terms of file structure `./src/style/` contains all universal styling rules.
59
+ these should not contain anything specific to a page
60
+
61
+ `./src/style/token` contains all the tokens used in the project
62
+
63
+ `./src/style/component` is for reusable components like buttons or inputs
64
+
65
+ page specific styles should go next to the page they are styling so
66
+ `./src/routes/about.tsx` should have its styles in `./src/routes/about.css`
67
+
68
+ `about.css` should be scoped using `data-page="about"`
69
+
70
+ ## Example of correct implementation
71
+
72
+ JSX can nest however makes sense semantically:
73
+
74
+ ```jsx
75
+ <div data-slot="left">
76
+ <div data-component="title">Section Title</div>
77
+ <div data-slot="content">Content here</div>
78
+ </div>
79
+ ```
80
+
81
+ CSS maintains clean hierarchy regardless of DOM nesting:
82
+
83
+ ```css
84
+ [data-page="home"] {
85
+ [data-component="screenshots"] {
86
+ [data-slot="left"] {
87
+ /* styles */
88
+ }
89
+ [data-slot="content"] {
90
+ /* styles */
91
+ }
92
+ }
93
+
94
+ [data-component="title"] {
95
+ /* can be at same level even though nested in DOM */
96
+ }
97
+ }
98
+ ```
99
+
100
+ ## Reusable Components
101
+
102
+ If a component is reused across multiple sections of the same page, define it at the page level:
103
+
104
+ ```jsx
105
+ <!-- Used in multiple places on the same page -->
106
+ <section data-component="install">
107
+ <div data-component="method">
108
+ <h3 data-component="title">npm</h3>
109
+ </div>
110
+ <div data-component="method">
111
+ <h3 data-component="title">bun</h3>
112
+ </div>
113
+ </section>
114
+
115
+ <section data-component="screenshots">
116
+ <div data-slot="left">
117
+ <div data-component="title">Screenshot Title</div>
118
+ </div>
119
+ </section>
120
+ ```
121
+
122
+ ```css
123
+ [data-page="home"] {
124
+ /* Reusable title component defined at page level since it's used in multiple components */
125
+ [data-component="title"] {
126
+ text-transform: uppercase;
127
+ font-weight: 400;
128
+ }
129
+
130
+ [data-component="install"] {
131
+ /* install-specific styles */
132
+ }
133
+
134
+ [data-component="screenshots"] {
135
+ /* screenshots-specific styles */
136
+ }
137
+ }
138
+ ```
139
+
140
+ This is correct because the `title` component has consistent styling and behavior across the page.
141
+
142
+ ## Key Clarifications
143
+
144
+ 1. **JSX Nesting is Flexible**: Components can be nested inside slots, slots can contain components - whatever makes semantic sense
145
+ 2. **CSS Hierarchy is Strict**: Follow pages → components → slots structure in CSS
146
+ 3. **Reusable Components**: Define at the appropriate level where they're shared (page level if used across the page, component level if only used within that component)
147
+ 4. **DOM vs CSS Structure**: These don't need to match - optimize each for its purpose
148
+
149
+ See ./src/routes/index.css and ./src/routes/index.tsx for a complete example.
package/README.md ADDED
@@ -0,0 +1,32 @@
1
+ # SolidStart
2
+
3
+ Everything you need to build a Solid project, powered by [`solid-start`](https://start.solidjs.com);
4
+
5
+ ## Creating a project
6
+
7
+ ```bash
8
+ # create a new project in the current directory
9
+ npm init solid@latest
10
+
11
+ # create a new project in my-app
12
+ npm init solid@latest my-app
13
+ ```
14
+
15
+ ## Developing
16
+
17
+ Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server:
18
+
19
+ ```bash
20
+ npm run dev
21
+
22
+ # or start the server and open the app in a new browser tab
23
+ npm run dev -- --open
24
+ ```
25
+
26
+ ## Building
27
+
28
+ Solid apps are built with _presets_, which optimise your project for deployment to different environments.
29
+
30
+ By default, `npm run build` will generate a Node app that you can run with `npm start`. To use a different preset, add it to the `devDependencies` in `package.json` and specify in your `app.config.js`.
31
+
32
+ ## This project was created with the [Solid CLI](https://github.com/solidjs-community/solid-cli)
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "@jonsoc/console-app",
3
+ "version": "1.1.34",
4
+ "type": "module",
5
+ "license": "MIT",
6
+ "scripts": {
7
+ "typecheck": "tsgo --noEmit",
8
+ "dev": "vite dev --host 0.0.0.0",
9
+ "dev:remote": "VITE_AUTH_URL=https://auth.dev.jonsoc.com VITE_STRIPE_PUBLISHABLE_KEY=pk_test_51RtuLNE7fOCwHSD4mewwzFejyytjdGoSDK7CAvhbffwaZnPbNb2rwJICw6LTOXCmWO320fSNXvb5NzI08RZVkAxd00syfqrW7t bun sst shell --stage=dev bun dev",
10
+ "build": "./script/generate-sitemap.ts && vite build && ../../jonsoc/script/schema.ts ./.output/public/config.json",
11
+ "start": "vite start"
12
+ },
13
+ "dependencies": {
14
+ "@cloudflare/vite-plugin": "1.15.2",
15
+ "@ibm/plex": "6.4.1",
16
+ "@jsx-email/render": "1.1.1",
17
+ "@kobalte/core": "catalog:",
18
+ "@openauthjs/openauth": "catalog:",
19
+ "@jonsoc/console-core": "workspace:*",
20
+ "@jonsoc/console-mail": "workspace:*",
21
+ "@jonsoc/console-resource": "workspace:*",
22
+ "@jonsoc/ui": "workspace:*",
23
+ "@smithy/eventstream-codec": "4.2.7",
24
+ "@smithy/util-utf8": "4.2.0",
25
+ "@solidjs/meta": "catalog:",
26
+ "@solidjs/router": "catalog:",
27
+ "@solidjs/start": "catalog:",
28
+ "@stripe/stripe-js": "8.6.1",
29
+ "chart.js": "4.5.1",
30
+ "nitro": "3.0.1-alpha.1",
31
+ "solid-js": "catalog:",
32
+ "solid-list": "0.3.0",
33
+ "solid-stripe": "0.8.1",
34
+ "vite": "catalog:",
35
+ "zod": "catalog:"
36
+ },
37
+ "devDependencies": {
38
+ "@typescript/native-preview": "catalog:",
39
+ "@webgpu/types": "0.1.54",
40
+ "typescript": "catalog:",
41
+ "wrangler": "4.50.0"
42
+ },
43
+ "engines": {
44
+ "node": ">=22"
45
+ },
46
+ "publishConfig": {
47
+ "access": "public"
48
+ }
49
+ }
@@ -0,0 +1 @@
1
+ ../../../ui/src/assets/favicon/apple-touch-icon-v3.png
@@ -0,0 +1 @@
1
+ ../../../ui/src/assets/favicon/apple-touch-icon.png
package/public/email ADDED
@@ -0,0 +1 @@
1
+ ../../mail/emails/templates/static
@@ -0,0 +1 @@
1
+ ../../../ui/src/assets/favicon/favicon-96x96-v3.png
@@ -0,0 +1 @@
1
+ ../../../ui/src/assets/favicon/favicon-96x96.png
@@ -0,0 +1 @@
1
+ ../../../ui/src/assets/favicon/favicon-v3.ico
@@ -0,0 +1 @@
1
+ ../../../ui/src/assets/favicon/favicon-v3.svg
@@ -0,0 +1 @@
1
+ ../../../ui/src/assets/favicon/favicon.ico
@@ -0,0 +1 @@
1
+ ../../../ui/src/assets/favicon/favicon.svg
Binary file
@@ -0,0 +1,6 @@
1
+ User-agent: *
2
+ Allow: /
3
+
4
+ # Disallow shared content pages
5
+ Disallow: /s/
6
+ Disallow: /share/
@@ -0,0 +1 @@
1
+ ../../../ui/src/assets/favicon/site.webmanifest
@@ -0,0 +1 @@
1
+ ../../../ui/src/assets/images/social-share-black.png
@@ -0,0 +1 @@
1
+ ../../../ui/src/assets/images/social-share-zen.png
@@ -0,0 +1 @@
1
+ ../../../ui/src/assets/images/social-share.png
@@ -0,0 +1,182 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "type": "object",
4
+ "properties": {
5
+ "$schema": {
6
+ "type": "string",
7
+ "description": "JSON schema reference for configuration validation"
8
+ },
9
+ "defs": {
10
+ "type": "object",
11
+ "description": "Color definitions that can be referenced in the theme",
12
+ "patternProperties": {
13
+ "^[a-zA-Z][a-zA-Z0-9_]*$": {
14
+ "oneOf": [
15
+ {
16
+ "type": "string",
17
+ "pattern": "^#[0-9a-fA-F]{6}$",
18
+ "description": "Hex color value"
19
+ },
20
+ {
21
+ "type": "integer",
22
+ "minimum": 0,
23
+ "maximum": 255,
24
+ "description": "ANSI color code (0-255)"
25
+ },
26
+ {
27
+ "type": "string",
28
+ "enum": ["none"],
29
+ "description": "No color (uses terminal default)"
30
+ }
31
+ ]
32
+ }
33
+ },
34
+ "additionalProperties": false
35
+ },
36
+ "theme": {
37
+ "type": "object",
38
+ "description": "Theme color definitions",
39
+ "properties": {
40
+ "primary": { "$ref": "#/definitions/colorValue" },
41
+ "secondary": { "$ref": "#/definitions/colorValue" },
42
+ "accent": { "$ref": "#/definitions/colorValue" },
43
+ "error": { "$ref": "#/definitions/colorValue" },
44
+ "warning": { "$ref": "#/definitions/colorValue" },
45
+ "success": { "$ref": "#/definitions/colorValue" },
46
+ "info": { "$ref": "#/definitions/colorValue" },
47
+ "text": { "$ref": "#/definitions/colorValue" },
48
+ "textMuted": { "$ref": "#/definitions/colorValue" },
49
+ "background": { "$ref": "#/definitions/colorValue" },
50
+ "backgroundPanel": { "$ref": "#/definitions/colorValue" },
51
+ "backgroundElement": { "$ref": "#/definitions/colorValue" },
52
+ "border": { "$ref": "#/definitions/colorValue" },
53
+ "borderActive": { "$ref": "#/definitions/colorValue" },
54
+ "borderSubtle": { "$ref": "#/definitions/colorValue" },
55
+ "diffAdded": { "$ref": "#/definitions/colorValue" },
56
+ "diffRemoved": { "$ref": "#/definitions/colorValue" },
57
+ "diffContext": { "$ref": "#/definitions/colorValue" },
58
+ "diffHunkHeader": { "$ref": "#/definitions/colorValue" },
59
+ "diffHighlightAdded": { "$ref": "#/definitions/colorValue" },
60
+ "diffHighlightRemoved": { "$ref": "#/definitions/colorValue" },
61
+ "diffAddedBg": { "$ref": "#/definitions/colorValue" },
62
+ "diffRemovedBg": { "$ref": "#/definitions/colorValue" },
63
+ "diffContextBg": { "$ref": "#/definitions/colorValue" },
64
+ "diffLineNumber": { "$ref": "#/definitions/colorValue" },
65
+ "diffAddedLineNumberBg": { "$ref": "#/definitions/colorValue" },
66
+ "diffRemovedLineNumberBg": { "$ref": "#/definitions/colorValue" },
67
+ "markdownText": { "$ref": "#/definitions/colorValue" },
68
+ "markdownHeading": { "$ref": "#/definitions/colorValue" },
69
+ "markdownLink": { "$ref": "#/definitions/colorValue" },
70
+ "markdownLinkText": { "$ref": "#/definitions/colorValue" },
71
+ "markdownCode": { "$ref": "#/definitions/colorValue" },
72
+ "markdownBlockQuote": { "$ref": "#/definitions/colorValue" },
73
+ "markdownEmph": { "$ref": "#/definitions/colorValue" },
74
+ "markdownStrong": { "$ref": "#/definitions/colorValue" },
75
+ "markdownHorizontalRule": { "$ref": "#/definitions/colorValue" },
76
+ "markdownListItem": { "$ref": "#/definitions/colorValue" },
77
+ "markdownListEnumeration": { "$ref": "#/definitions/colorValue" },
78
+ "markdownImage": { "$ref": "#/definitions/colorValue" },
79
+ "markdownImageText": { "$ref": "#/definitions/colorValue" },
80
+ "markdownCodeBlock": { "$ref": "#/definitions/colorValue" },
81
+ "syntaxComment": { "$ref": "#/definitions/colorValue" },
82
+ "syntaxKeyword": { "$ref": "#/definitions/colorValue" },
83
+ "syntaxFunction": { "$ref": "#/definitions/colorValue" },
84
+ "syntaxVariable": { "$ref": "#/definitions/colorValue" },
85
+ "syntaxString": { "$ref": "#/definitions/colorValue" },
86
+ "syntaxNumber": { "$ref": "#/definitions/colorValue" },
87
+ "syntaxType": { "$ref": "#/definitions/colorValue" },
88
+ "syntaxOperator": { "$ref": "#/definitions/colorValue" },
89
+ "syntaxPunctuation": { "$ref": "#/definitions/colorValue" }
90
+ },
91
+ "required": ["primary", "secondary", "accent", "text", "textMuted", "background"],
92
+ "additionalProperties": false
93
+ }
94
+ },
95
+ "required": ["theme"],
96
+ "additionalProperties": false,
97
+ "definitions": {
98
+ "colorValue": {
99
+ "oneOf": [
100
+ {
101
+ "type": "string",
102
+ "pattern": "^#[0-9a-fA-F]{6}$",
103
+ "description": "Hex color value (same for dark and light)"
104
+ },
105
+ {
106
+ "type": "integer",
107
+ "minimum": 0,
108
+ "maximum": 255,
109
+ "description": "ANSI color code (0-255, same for dark and light)"
110
+ },
111
+ {
112
+ "type": "string",
113
+ "enum": ["none"],
114
+ "description": "No color (uses terminal default)"
115
+ },
116
+ {
117
+ "type": "string",
118
+ "pattern": "^[a-zA-Z][a-zA-Z0-9_]*$",
119
+ "description": "Reference to another color in the theme or defs"
120
+ },
121
+ {
122
+ "type": "object",
123
+ "properties": {
124
+ "dark": {
125
+ "oneOf": [
126
+ {
127
+ "type": "string",
128
+ "pattern": "^#[0-9a-fA-F]{6}$",
129
+ "description": "Hex color value for dark mode"
130
+ },
131
+ {
132
+ "type": "integer",
133
+ "minimum": 0,
134
+ "maximum": 255,
135
+ "description": "ANSI color code for dark mode"
136
+ },
137
+ {
138
+ "type": "string",
139
+ "enum": ["none"],
140
+ "description": "No color (uses terminal default)"
141
+ },
142
+ {
143
+ "type": "string",
144
+ "pattern": "^[a-zA-Z][a-zA-Z0-9_]*$",
145
+ "description": "Reference to another color for dark mode"
146
+ }
147
+ ]
148
+ },
149
+ "light": {
150
+ "oneOf": [
151
+ {
152
+ "type": "string",
153
+ "pattern": "^#[0-9a-fA-F]{6}$",
154
+ "description": "Hex color value for light mode"
155
+ },
156
+ {
157
+ "type": "integer",
158
+ "minimum": 0,
159
+ "maximum": 255,
160
+ "description": "ANSI color code for light mode"
161
+ },
162
+ {
163
+ "type": "string",
164
+ "enum": ["none"],
165
+ "description": "No color (uses terminal default)"
166
+ },
167
+ {
168
+ "type": "string",
169
+ "pattern": "^[a-zA-Z][a-zA-Z0-9_]*$",
170
+ "description": "Reference to another color for light mode"
171
+ }
172
+ ]
173
+ }
174
+ },
175
+ "required": ["dark", "light"],
176
+ "additionalProperties": false,
177
+ "description": "Separate colors for dark and light modes"
178
+ }
179
+ ]
180
+ }
181
+ }
182
+ }
@@ -0,0 +1 @@
1
+ ../../../ui/src/assets/favicon/web-app-manifest-192x192.png
@@ -0,0 +1 @@
1
+ ../../../ui/src/assets/favicon/web-app-manifest-512x512.png
@@ -0,0 +1,103 @@
1
+ #!/usr/bin/env bun
2
+ import { readdir, writeFile } from "fs/promises"
3
+ import { join, dirname } from "path"
4
+ import { fileURLToPath } from "url"
5
+ import { config } from "../src/config.js"
6
+
7
+ const __dirname = dirname(fileURLToPath(import.meta.url))
8
+ const BASE_URL = config.baseUrl
9
+ const PUBLIC_DIR = join(__dirname, "../public")
10
+ const ROUTES_DIR = join(__dirname, "../src/routes")
11
+ const DOCS_DIR = join(__dirname, "../../../web/src/content/docs")
12
+
13
+ interface SitemapEntry {
14
+ url: string
15
+ priority: number
16
+ changefreq: string
17
+ }
18
+
19
+ async function getMainRoutes(): Promise<SitemapEntry[]> {
20
+ const routes: SitemapEntry[] = []
21
+
22
+ // Add main static routes
23
+ const staticRoutes = [
24
+ { path: "/", priority: 1.0, changefreq: "daily" },
25
+ { path: "/enterprise", priority: 0.8, changefreq: "weekly" },
26
+ { path: "/brand", priority: 0.6, changefreq: "monthly" },
27
+ { path: "/zen", priority: 0.8, changefreq: "weekly" },
28
+ ]
29
+
30
+ for (const route of staticRoutes) {
31
+ routes.push({
32
+ url: `${BASE_URL}${route.path}`,
33
+ priority: route.priority,
34
+ changefreq: route.changefreq,
35
+ })
36
+ }
37
+
38
+ return routes
39
+ }
40
+
41
+ async function getDocsRoutes(): Promise<SitemapEntry[]> {
42
+ const routes: SitemapEntry[] = []
43
+
44
+ try {
45
+ const files = await readdir(DOCS_DIR)
46
+
47
+ for (const file of files) {
48
+ if (!file.endsWith(".mdx")) continue
49
+
50
+ const slug = file.replace(".mdx", "")
51
+ const path = slug === "index" ? "/docs/" : `/docs/${slug}`
52
+
53
+ routes.push({
54
+ url: `${BASE_URL}${path}`,
55
+ priority: slug === "index" ? 0.9 : 0.7,
56
+ changefreq: "weekly",
57
+ })
58
+ }
59
+ } catch (error) {
60
+ console.error("Error reading docs directory:", error)
61
+ }
62
+
63
+ return routes
64
+ }
65
+
66
+ function generateSitemapXML(entries: SitemapEntry[]): string {
67
+ const urls = entries
68
+ .map(
69
+ (entry) => ` <url>
70
+ <loc>${entry.url}</loc>
71
+ <changefreq>${entry.changefreq}</changefreq>
72
+ <priority>${entry.priority}</priority>
73
+ </url>`,
74
+ )
75
+ .join("\n")
76
+
77
+ return `<?xml version="1.0" encoding="UTF-8"?>
78
+ <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
79
+ ${urls}
80
+ </urlset>`
81
+ }
82
+
83
+ async function main() {
84
+ console.log("Generating sitemap...")
85
+
86
+ const mainRoutes = await getMainRoutes()
87
+ const docsRoutes = await getDocsRoutes()
88
+
89
+ const allRoutes = [...mainRoutes, ...docsRoutes]
90
+
91
+ console.log(`Found ${mainRoutes.length} main routes`)
92
+ console.log(`Found ${docsRoutes.length} docs routes`)
93
+ console.log(`Total: ${allRoutes.length} routes`)
94
+
95
+ const xml = generateSitemapXML(allRoutes)
96
+
97
+ const outputPath = join(PUBLIC_DIR, "sitemap.xml")
98
+ await writeFile(outputPath, xml, "utf-8")
99
+
100
+ console.log(`✓ Sitemap generated at ${outputPath}`)
101
+ }
102
+
103
+ main()
package/src/app.css ADDED
@@ -0,0 +1 @@
1
+ @import "./style/index.css";
package/src/app.tsx ADDED
@@ -0,0 +1,27 @@
1
+ import { MetaProvider, Title, Meta } from "@solidjs/meta"
2
+ import { Router } from "@solidjs/router"
3
+ import { FileRoutes } from "@solidjs/start/router"
4
+ import { Suspense } from "solid-js"
5
+ import { Favicon } from "@jonsoc/ui/favicon"
6
+ import { Font } from "@jonsoc/ui/font"
7
+ import "@ibm/plex/css/ibm-plex.css"
8
+ import "./app.css"
9
+
10
+ export default function App() {
11
+ return (
12
+ <Router
13
+ explicitLinks={true}
14
+ root={(props) => (
15
+ <MetaProvider>
16
+ <Title>jonsoc</Title>
17
+ <Meta name="description" content="JonsOC - The open source coding agent." />
18
+ <Favicon />
19
+ <Font />
20
+ <Suspense>{props.children}</Suspense>
21
+ </MetaProvider>
22
+ )}
23
+ >
24
+ <FileRoutes />
25
+ </Router>
26
+ )
27
+ }
Binary file
@@ -0,0 +1,16 @@
1
+ <svg width="240" height="300" viewBox="0 0 240 300" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <g clip-path="url(#clip0_1401_86283)">
3
+ <mask id="mask0_1401_86283" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0" width="240" height="300">
4
+ <path d="M240 0H0V300H240V0Z" fill="white"/>
5
+ </mask>
6
+ <g mask="url(#mask0_1401_86283)">
7
+ <path d="M180 240H60V120H180V240Z" fill="#4B4646"/>
8
+ <path d="M180 60H60V240H180V60ZM240 300H0V0H240V300Z" fill="#F1ECEC"/>
9
+ </g>
10
+ </g>
11
+ <defs>
12
+ <clipPath id="clip0_1401_86283">
13
+ <rect width="240" height="300" fill="white"/>
14
+ </clipPath>
15
+ </defs>
16
+ </svg>
@@ -0,0 +1,16 @@
1
+ <svg width="240" height="300" viewBox="0 0 240 300" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <g clip-path="url(#clip0_1401_86274)">
3
+ <mask id="mask0_1401_86274" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0" width="240" height="300">
4
+ <path d="M240 0H0V300H240V0Z" fill="white"/>
5
+ </mask>
6
+ <g mask="url(#mask0_1401_86274)">
7
+ <path d="M180 240H60V120H180V240Z" fill="#CFCECD"/>
8
+ <path d="M180 60H60V240H180V60ZM240 300H0V0H240V300Z" fill="#211E1E"/>
9
+ </g>
10
+ </g>
11
+ <defs>
12
+ <clipPath id="clip0_1401_86274">
13
+ <rect width="240" height="300" fill="white"/>
14
+ </clipPath>
15
+ </defs>
16
+ </svg>