Add files using upload-large-folder tool
Browse filesThis view is limited to 50 files because it contains too many changes. See raw diff
- packages/console/app/.opencode/agent/css.md +149 -0
- packages/console/app/src/asset/black/hero.png +0 -0
- packages/console/app/src/asset/brand/opencode-logo-dark-square.png +0 -0
- packages/console/app/src/asset/brand/opencode-logo-dark-square.svg +18 -0
- packages/console/app/src/asset/brand/opencode-logo-dark.png +0 -0
- packages/console/app/src/asset/brand/opencode-logo-dark.svg +16 -0
- packages/console/app/src/asset/brand/opencode-logo-light-square.png +0 -0
- packages/console/app/src/asset/brand/opencode-logo-light-square.svg +18 -0
- packages/console/app/src/asset/brand/opencode-logo-light.png +0 -0
- packages/console/app/src/asset/brand/opencode-logo-light.svg +16 -0
- packages/console/app/src/asset/brand/opencode-wordmark-dark.png +0 -0
- packages/console/app/src/asset/brand/opencode-wordmark-dark.svg +30 -0
- packages/console/app/src/asset/brand/opencode-wordmark-light.png +0 -0
- packages/console/app/src/asset/brand/opencode-wordmark-light.svg +30 -0
- packages/console/app/src/asset/brand/opencode-wordmark-simple-dark.png +0 -0
- packages/console/app/src/asset/brand/opencode-wordmark-simple-dark.svg +22 -0
- packages/console/app/src/asset/brand/opencode-wordmark-simple-light.png +0 -0
- packages/console/app/src/asset/brand/opencode-wordmark-simple-light.svg +22 -0
- packages/console/app/src/asset/brand/preview-opencode-dark.png +0 -0
- packages/console/app/src/asset/brand/preview-opencode-logo-dark.png +0 -0
- packages/console/app/src/asset/brand/preview-opencode-logo-light-square.png +0 -0
- packages/console/app/src/asset/brand/preview-opencode-logo-light.png +0 -0
- packages/console/app/src/asset/brand/preview-opencode-wordmark-dark.png +0 -0
- packages/console/app/src/asset/brand/preview-opencode-wordmark-light.png +0 -0
- packages/console/app/src/asset/brand/preview-opencode-wordmark-simple-dark.png +0 -0
- packages/console/app/src/asset/brand/preview-opencode-wordmark-simple-light.png +0 -0
- packages/console/app/src/asset/lander/avatar-adam.png +0 -0
- packages/console/app/src/asset/lander/avatar-david.png +0 -0
- packages/console/app/src/asset/lander/avatar-dax.png +0 -0
- packages/console/app/src/asset/lander/avatar-frank.png +0 -0
- packages/console/app/src/asset/lander/avatar-jay.png +0 -0
- packages/console/app/src/asset/lander/brand-assets-dark.svg +10 -0
- packages/console/app/src/asset/lander/brand-assets-light.svg +10 -0
- packages/console/app/src/asset/lander/brand.png +0 -0
- packages/console/app/src/asset/lander/check.svg +3 -0
- packages/console/app/src/asset/lander/copy.svg +3 -0
- packages/console/app/src/asset/lander/desktop-app-icon.png +0 -0
- packages/console/app/src/asset/lander/dock.png +0 -0
- packages/console/app/src/asset/lander/logo-dark.svg +11 -0
- packages/console/app/src/asset/lander/logo-light.svg +11 -0
- packages/console/app/src/asset/lander/opencode-comparison-poster.png +0 -0
- packages/console/app/src/asset/lander/opencode-desktop-icon.png +0 -0
- packages/console/app/src/asset/lander/opencode-logo-dark.svg +11 -0
- packages/console/app/src/asset/lander/opencode-logo-light.svg +11 -0
- packages/console/app/src/asset/lander/opencode-poster.png +0 -0
- packages/console/app/src/asset/lander/opencode-wordmark-dark.svg +25 -0
- packages/console/app/src/asset/lander/opencode-wordmark-light.svg +25 -0
- packages/console/app/src/asset/lander/wordmark-dark.svg +3 -0
- packages/console/app/src/asset/lander/wordmark-light.svg +3 -0
- packages/console/app/src/routes/oauth/opencode/client.json.ts +38 -0
packages/console/app/.opencode/agent/css.md
ADDED
|
@@ -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.
|
packages/console/app/src/asset/black/hero.png
ADDED
|
packages/console/app/src/asset/brand/opencode-logo-dark-square.png
ADDED
|
packages/console/app/src/asset/brand/opencode-logo-dark-square.svg
ADDED
|
|
packages/console/app/src/asset/brand/opencode-logo-dark.png
ADDED
|
packages/console/app/src/asset/brand/opencode-logo-dark.svg
ADDED
|
|
packages/console/app/src/asset/brand/opencode-logo-light-square.png
ADDED
|
packages/console/app/src/asset/brand/opencode-logo-light-square.svg
ADDED
|
|
packages/console/app/src/asset/brand/opencode-logo-light.png
ADDED
|
packages/console/app/src/asset/brand/opencode-logo-light.svg
ADDED
|
|
packages/console/app/src/asset/brand/opencode-wordmark-dark.png
ADDED
|
packages/console/app/src/asset/brand/opencode-wordmark-dark.svg
ADDED
|
|
packages/console/app/src/asset/brand/opencode-wordmark-light.png
ADDED
|
packages/console/app/src/asset/brand/opencode-wordmark-light.svg
ADDED
|
|
packages/console/app/src/asset/brand/opencode-wordmark-simple-dark.png
ADDED
|
packages/console/app/src/asset/brand/opencode-wordmark-simple-dark.svg
ADDED
|
|
packages/console/app/src/asset/brand/opencode-wordmark-simple-light.png
ADDED
|
packages/console/app/src/asset/brand/opencode-wordmark-simple-light.svg
ADDED
|
|
packages/console/app/src/asset/brand/preview-opencode-dark.png
ADDED
|
packages/console/app/src/asset/brand/preview-opencode-logo-dark.png
ADDED
|
packages/console/app/src/asset/brand/preview-opencode-logo-light-square.png
ADDED
|
packages/console/app/src/asset/brand/preview-opencode-logo-light.png
ADDED
|
packages/console/app/src/asset/brand/preview-opencode-wordmark-dark.png
ADDED
|
packages/console/app/src/asset/brand/preview-opencode-wordmark-light.png
ADDED
|
packages/console/app/src/asset/brand/preview-opencode-wordmark-simple-dark.png
ADDED
|
packages/console/app/src/asset/brand/preview-opencode-wordmark-simple-light.png
ADDED
|
packages/console/app/src/asset/lander/avatar-adam.png
ADDED
|
|
packages/console/app/src/asset/lander/avatar-david.png
ADDED
|
|
packages/console/app/src/asset/lander/avatar-dax.png
ADDED
|
|
packages/console/app/src/asset/lander/avatar-frank.png
ADDED
|
|
packages/console/app/src/asset/lander/avatar-jay.png
ADDED
|
|
packages/console/app/src/asset/lander/brand-assets-dark.svg
ADDED
|
|
packages/console/app/src/asset/lander/brand-assets-light.svg
ADDED
|
|
packages/console/app/src/asset/lander/brand.png
ADDED
|
packages/console/app/src/asset/lander/check.svg
ADDED
|
|
packages/console/app/src/asset/lander/copy.svg
ADDED
|
|
packages/console/app/src/asset/lander/desktop-app-icon.png
ADDED
|
|
packages/console/app/src/asset/lander/dock.png
ADDED
|
packages/console/app/src/asset/lander/logo-dark.svg
ADDED
|
|
packages/console/app/src/asset/lander/logo-light.svg
ADDED
|
|
packages/console/app/src/asset/lander/opencode-comparison-poster.png
ADDED
|
packages/console/app/src/asset/lander/opencode-desktop-icon.png
ADDED
|
|
packages/console/app/src/asset/lander/opencode-logo-dark.svg
ADDED
|
|
packages/console/app/src/asset/lander/opencode-logo-light.svg
ADDED
|
|
packages/console/app/src/asset/lander/opencode-poster.png
ADDED
|
packages/console/app/src/asset/lander/opencode-wordmark-dark.svg
ADDED
|
|
packages/console/app/src/asset/lander/opencode-wordmark-light.svg
ADDED
|
|
packages/console/app/src/asset/lander/wordmark-dark.svg
ADDED
|
|
packages/console/app/src/asset/lander/wordmark-light.svg
ADDED
|
|
packages/console/app/src/routes/oauth/opencode/client.json.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import type { APIEvent } from "@solidjs/start/server"
|
| 2 |
+
|
| 3 |
+
// OAuth Client ID Metadata Document for the opencode client.
|
| 4 |
+
// Spec: https://datatracker.ietf.org/doc/draft-ietf-oauth-client-id-metadata-document/
|
| 5 |
+
//
|
| 6 |
+
// When an MCP server's authorization server supports this, opencode sends this URL as its OAuth client_id
|
| 7 |
+
// instead of registering a new client. The authorization server fetches the document to learn our name and
|
| 8 |
+
// allowed redirect URIs. The client_id field must equal the exact URL the document was fetched from, so it is
|
| 9 |
+
// built from the request origin and stays valid on dev.opencode.ai as well as production.
|
| 10 |
+
//
|
| 11 |
+
// redirect_uris have no port because opencode binds an ephemeral port per login. RFC 8252 section 7.3 has
|
| 12 |
+
// authorization servers ignore the port when matching loopback redirects for native apps.
|
| 13 |
+
const PATH = "/oauth/opencode/client.json"
|
| 14 |
+
|
| 15 |
+
const cache = "public, max-age=300"
|
| 16 |
+
|
| 17 |
+
export function GET(event: APIEvent) {
|
| 18 |
+
const origin = new URL(event.request.url).origin
|
| 19 |
+
const document = {
|
| 20 |
+
client_id: origin + PATH,
|
| 21 |
+
client_name: "opencode",
|
| 22 |
+
client_uri: origin,
|
| 23 |
+
logo_uri: origin + "/web-app-manifest-512x512.png",
|
| 24 |
+
application_type: "native",
|
| 25 |
+
redirect_uris: ["http://127.0.0.1/callback", "http://localhost/callback"],
|
| 26 |
+
grant_types: ["authorization_code", "refresh_token"],
|
| 27 |
+
response_types: ["code"],
|
| 28 |
+
token_endpoint_auth_method: "none",
|
| 29 |
+
token_endpoint_auth_methods_supported: ["none"],
|
| 30 |
+
}
|
| 31 |
+
return new Response(JSON.stringify(document, null, 2), {
|
| 32 |
+
headers: {
|
| 33 |
+
"Content-Type": "application/json",
|
| 34 |
+
"Cache-Control": cache,
|
| 35 |
+
"Access-Control-Allow-Origin": "*",
|
| 36 |
+
},
|
| 37 |
+
})
|
| 38 |
+
}
|