@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.
- package/.opencode/agent/css.md +149 -0
- package/README.md +32 -0
- package/package.json +49 -0
- package/public/apple-touch-icon-v3.png +1 -0
- package/public/apple-touch-icon.png +1 -0
- package/public/email +1 -0
- package/public/favicon-96x96-v3.png +1 -0
- package/public/favicon-96x96.png +1 -0
- package/public/favicon-v3.ico +1 -0
- package/public/favicon-v3.svg +1 -0
- package/public/favicon.ico +1 -0
- package/public/favicon.svg +1 -0
- package/public/opencode-brand-assets.zip +0 -0
- package/public/robots.txt +6 -0
- package/public/site.webmanifest +1 -0
- package/public/social-share-black.png +1 -0
- package/public/social-share-zen.png +1 -0
- package/public/social-share.png +1 -0
- package/public/theme.json +182 -0
- package/public/web-app-manifest-192x192.png +1 -0
- package/public/web-app-manifest-512x512.png +1 -0
- package/script/generate-sitemap.ts +103 -0
- package/src/app.css +1 -0
- package/src/app.tsx +27 -0
- package/src/asset/black/hero.png +0 -0
- package/src/asset/brand/opencode-brand-assets.zip +0 -0
- package/src/asset/brand/opencode-logo-dark.png +0 -0
- package/src/asset/brand/opencode-logo-dark.svg +16 -0
- package/src/asset/brand/opencode-logo-light.png +0 -0
- package/src/asset/brand/opencode-logo-light.svg +16 -0
- package/src/asset/brand/opencode-wordmark-dark.png +0 -0
- package/src/asset/brand/opencode-wordmark-dark.svg +30 -0
- package/src/asset/brand/opencode-wordmark-light.png +0 -0
- package/src/asset/brand/opencode-wordmark-light.svg +30 -0
- package/src/asset/brand/opencode-wordmark-simple-dark.png +0 -0
- package/src/asset/brand/opencode-wordmark-simple-dark.svg +22 -0
- package/src/asset/brand/opencode-wordmark-simple-light.png +0 -0
- package/src/asset/brand/opencode-wordmark-simple-light.svg +22 -0
- package/src/asset/brand/preview-opencode-dark.png +0 -0
- package/src/asset/brand/preview-opencode-logo-dark.png +0 -0
- package/src/asset/brand/preview-opencode-logo-light.png +0 -0
- package/src/asset/brand/preview-opencode-wordmark-dark.png +0 -0
- package/src/asset/brand/preview-opencode-wordmark-light.png +0 -0
- package/src/asset/brand/preview-opencode-wordmark-simple-dark.png +0 -0
- package/src/asset/brand/preview-opencode-wordmark-simple-light.png +0 -0
- package/src/asset/lander/avatar-adam.png +0 -0
- package/src/asset/lander/avatar-david.png +0 -0
- package/src/asset/lander/avatar-dax.png +0 -0
- package/src/asset/lander/avatar-frank.png +0 -0
- package/src/asset/lander/avatar-jay.png +0 -0
- package/src/asset/lander/brand-assets-dark.svg +10 -0
- package/src/asset/lander/brand-assets-light.svg +10 -0
- package/src/asset/lander/brand.png +0 -0
- package/src/asset/lander/check.svg +3 -0
- package/src/asset/lander/copy.svg +3 -0
- package/src/asset/lander/desktop-app-icon.png +0 -0
- package/src/asset/lander/dock.png +0 -0
- package/src/asset/lander/logo-dark.svg +11 -0
- package/src/asset/lander/logo-light.svg +11 -0
- package/src/asset/lander/opencode-comparison-min.mp4 +0 -0
- package/src/asset/lander/opencode-comparison-poster.png +0 -0
- package/src/asset/lander/opencode-desktop-icon.png +0 -0
- package/src/asset/lander/opencode-logo-dark.svg +11 -0
- package/src/asset/lander/opencode-logo-light.svg +11 -0
- package/src/asset/lander/opencode-min.mp4 +0 -0
- package/src/asset/lander/opencode-poster.png +0 -0
- package/src/asset/lander/opencode-wordmark-dark.svg +25 -0
- package/src/asset/lander/opencode-wordmark-light.svg +25 -0
- package/src/asset/lander/screenshot-github.png +0 -0
- package/src/asset/lander/screenshot-splash.png +0 -0
- package/src/asset/lander/screenshot-vscode.png +0 -0
- package/src/asset/lander/screenshot.png +0 -0
- package/src/asset/lander/wordmark-dark.svg +3 -0
- package/src/asset/lander/wordmark-light.svg +3 -0
- package/src/asset/logo-ornate-dark.svg +18 -0
- package/src/asset/logo-ornate-light.svg +18 -0
- package/src/asset/logo.svg +18 -0
- package/src/asset/zen-ornate-dark.svg +8 -0
- package/src/asset/zen-ornate-light.svg +8 -0
- package/src/component/dropdown.css +80 -0
- package/src/component/dropdown.tsx +79 -0
- package/src/component/email-signup.tsx +48 -0
- package/src/component/faq.tsx +33 -0
- package/src/component/footer.tsx +38 -0
- package/src/component/header-context-menu.css +63 -0
- package/src/component/header.tsx +279 -0
- package/src/component/icon.tsx +257 -0
- package/src/component/legal.tsx +20 -0
- package/src/component/modal.css +66 -0
- package/src/component/modal.tsx +24 -0
- package/src/component/spotlight.css +15 -0
- package/src/component/spotlight.tsx +820 -0
- package/src/config.ts +29 -0
- package/src/context/auth.session.ts +0 -0
- package/src/context/auth.ts +116 -0
- package/src/context/auth.withActor.ts +7 -0
- package/src/entry-client.tsx +4 -0
- package/src/entry-server.tsx +30 -0
- package/src/global.d.ts +5 -0
- package/src/lib/github.ts +38 -0
- package/src/middleware.ts +5 -0
- package/src/routes/[...404].css +130 -0
- package/src/routes/[...404].tsx +38 -0
- package/src/routes/api/enterprise.ts +47 -0
- package/src/routes/auth/[...callback].ts +41 -0
- package/src/routes/auth/authorize.ts +10 -0
- package/src/routes/auth/index.ts +12 -0
- package/src/routes/auth/logout.ts +17 -0
- package/src/routes/auth/status.ts +7 -0
- package/src/routes/bench/[id].tsx +365 -0
- package/src/routes/bench/index.tsx +86 -0
- package/src/routes/bench/submission.ts +29 -0
- package/src/routes/black/common.tsx +62 -0
- package/src/routes/black/index.tsx +108 -0
- package/src/routes/black/subscribe/[plan].tsx +449 -0
- package/src/routes/black/workspace.css +214 -0
- package/src/routes/black/workspace.tsx +229 -0
- package/src/routes/black.css +828 -0
- package/src/routes/black.tsx +285 -0
- package/src/routes/brand/index.css +555 -0
- package/src/routes/brand/index.tsx +252 -0
- package/src/routes/changelog/index.css +477 -0
- package/src/routes/changelog/index.tsx +147 -0
- package/src/routes/debug/index.ts +13 -0
- package/src/routes/desktop-feedback.ts +5 -0
- package/src/routes/discord.ts +5 -0
- package/src/routes/docs/[...path].ts +20 -0
- package/src/routes/docs/index.ts +20 -0
- package/src/routes/download/[platform].ts +38 -0
- package/src/routes/download/index.css +750 -0
- package/src/routes/download/index.tsx +482 -0
- package/src/routes/download/types.ts +4 -0
- package/src/routes/enterprise/index.css +578 -0
- package/src/routes/enterprise/index.tsx +251 -0
- package/src/routes/index.css +1251 -0
- package/src/routes/index.tsx +840 -0
- package/src/routes/legal/privacy-policy/index.css +343 -0
- package/src/routes/legal/privacy-policy/index.tsx +1512 -0
- package/src/routes/legal/terms-of-service/index.css +254 -0
- package/src/routes/legal/terms-of-service/index.tsx +512 -0
- package/src/routes/openapi.json.ts +7 -0
- package/src/routes/s/[id].ts +20 -0
- package/src/routes/stripe/webhook.ts +532 -0
- package/src/routes/t/[...path].tsx +20 -0
- package/src/routes/temp.tsx +172 -0
- package/src/routes/user-menu.css +18 -0
- package/src/routes/user-menu.tsx +32 -0
- package/src/routes/workspace/[id]/billing/billing-section.module.css +185 -0
- package/src/routes/workspace/[id]/billing/billing-section.tsx +240 -0
- package/src/routes/workspace/[id]/billing/black-section.module.css +142 -0
- package/src/routes/workspace/[id]/billing/black-section.tsx +269 -0
- package/src/routes/workspace/[id]/billing/black-waitlist-section.module.css +23 -0
- package/src/routes/workspace/[id]/billing/index.tsx +32 -0
- package/src/routes/workspace/[id]/billing/monthly-limit-section.module.css +96 -0
- package/src/routes/workspace/[id]/billing/monthly-limit-section.tsx +133 -0
- package/src/routes/workspace/[id]/billing/payment-section.module.css +93 -0
- package/src/routes/workspace/[id]/billing/payment-section.tsx +122 -0
- package/src/routes/workspace/[id]/billing/reload-section.module.css +261 -0
- package/src/routes/workspace/[id]/billing/reload-section.tsx +213 -0
- package/src/routes/workspace/[id]/graph-section.module.css +145 -0
- package/src/routes/workspace/[id]/graph-section.tsx +475 -0
- package/src/routes/workspace/[id]/index.tsx +81 -0
- package/src/routes/workspace/[id]/keys/index.tsx +11 -0
- package/src/routes/workspace/[id]/keys/key-section.module.css +197 -0
- package/src/routes/workspace/[id]/keys/key-section.tsx +176 -0
- package/src/routes/workspace/[id]/members/index.tsx +11 -0
- package/src/routes/workspace/[id]/members/member-section.module.css +249 -0
- package/src/routes/workspace/[id]/members/member-section.tsx +343 -0
- package/src/routes/workspace/[id]/members/role-dropdown.css +72 -0
- package/src/routes/workspace/[id]/members/role-dropdown.tsx +43 -0
- package/src/routes/workspace/[id]/model-section.module.css +173 -0
- package/src/routes/workspace/[id]/model-section.tsx +174 -0
- package/src/routes/workspace/[id]/new-user-section.module.css +143 -0
- package/src/routes/workspace/[id]/new-user-section.tsx +104 -0
- package/src/routes/workspace/[id]/provider-section.module.css +138 -0
- package/src/routes/workspace/[id]/provider-section.tsx +188 -0
- package/src/routes/workspace/[id]/settings/index.tsx +11 -0
- package/src/routes/workspace/[id]/settings/settings-section.module.css +94 -0
- package/src/routes/workspace/[id]/settings/settings-section.tsx +122 -0
- package/src/routes/workspace/[id]/usage-section.module.css +185 -0
- package/src/routes/workspace/[id]/usage-section.tsx +200 -0
- package/src/routes/workspace/[id].css +308 -0
- package/src/routes/workspace/[id].tsx +62 -0
- package/src/routes/workspace/common.tsx +120 -0
- package/src/routes/workspace-picker.css +74 -0
- package/src/routes/workspace-picker.tsx +122 -0
- package/src/routes/workspace.css +107 -0
- package/src/routes/workspace.tsx +38 -0
- package/src/routes/zen/index.css +866 -0
- package/src/routes/zen/index.tsx +343 -0
- package/src/routes/zen/util/dataDumper.ts +44 -0
- package/src/routes/zen/util/error.ts +13 -0
- package/src/routes/zen/util/handler.ts +784 -0
- package/src/routes/zen/util/logger.ts +12 -0
- package/src/routes/zen/util/provider/anthropic.ts +752 -0
- package/src/routes/zen/util/provider/google.ts +75 -0
- package/src/routes/zen/util/provider/openai-compatible.ts +546 -0
- package/src/routes/zen/util/provider/openai.ts +630 -0
- package/src/routes/zen/util/provider/provider.ts +210 -0
- package/src/routes/zen/util/rateLimiter.ts +41 -0
- package/src/routes/zen/util/stickyProviderTracker.ts +16 -0
- package/src/routes/zen/util/trialLimiter.ts +49 -0
- package/src/routes/zen/v1/chat/completions.ts +11 -0
- package/src/routes/zen/v1/messages.ts +11 -0
- package/src/routes/zen/v1/models/[model].ts +13 -0
- package/src/routes/zen/v1/models.ts +60 -0
- package/src/routes/zen/v1/responses.ts +11 -0
- package/src/style/base.css +21 -0
- package/src/style/component/button.css +102 -0
- package/src/style/index.css +8 -0
- package/src/style/reset.css +76 -0
- package/src/style/token/color.css +91 -0
- package/src/style/token/font.css +21 -0
- package/src/style/token/space.css +46 -0
- package/sst-env.d.ts +9 -0
- package/tsconfig.json +21 -0
- 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 @@
|
|
|
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
|
|
Binary file
|
|
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>
|
|
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_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>
|
|
Binary file
|