@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,33 @@
1
+ import { Collapsible } from "@kobalte/core/collapsible"
2
+ import { ParentProps } from "solid-js"
3
+
4
+ export function Faq(props: ParentProps & { question: string }) {
5
+ return (
6
+ <Collapsible data-slot="faq-item">
7
+ <Collapsible.Trigger data-slot="faq-question">
8
+ <svg
9
+ data-slot="faq-icon-plus"
10
+ width="24"
11
+ height="24"
12
+ viewBox="0 0 24 24"
13
+ fill="currentColor"
14
+ xmlns="http://www.w3.org/2000/svg"
15
+ >
16
+ <path d="M12.5 11.5H19V12.5H12.5V19H11.5V12.5H5V11.5H11.5V5H12.5V11.5Z" fill="currentColor" />
17
+ </svg>
18
+ <svg
19
+ data-slot="faq-icon-minus"
20
+ width="24"
21
+ height="24"
22
+ viewBox="0 0 24 24"
23
+ fill="currentColor"
24
+ xmlns="http://www.w3.org/2000/svg"
25
+ >
26
+ <path d="M5 11.5H19V12.5H5Z" fill="currentColor" />
27
+ </svg>
28
+ <div data-slot="faq-question-text">{props.question}</div>
29
+ </Collapsible.Trigger>
30
+ <Collapsible.Content data-slot="faq-answer">{props.children}</Collapsible.Content>
31
+ </Collapsible>
32
+ )
33
+ }
@@ -0,0 +1,38 @@
1
+ import { createAsync } from "@solidjs/router"
2
+ import { createMemo } from "solid-js"
3
+ import { github } from "~/lib/github"
4
+ import { config } from "~/config"
5
+
6
+ export function Footer() {
7
+ const githubData = createAsync(() => github())
8
+ const starCount = createMemo(() =>
9
+ githubData()?.stars
10
+ ? new Intl.NumberFormat("en-US", {
11
+ notation: "compact",
12
+ compactDisplay: "short",
13
+ }).format(githubData()!.stars!)
14
+ : config.github.starsFormatted.compact,
15
+ )
16
+
17
+ return (
18
+ <footer data-component="footer">
19
+ <div data-slot="cell">
20
+ <a href={config.github.repoUrl} target="_blank">
21
+ GitHub <span>[{starCount()}]</span>
22
+ </a>
23
+ </div>
24
+ <div data-slot="cell">
25
+ <a href="/docs">Docs</a>
26
+ </div>
27
+ <div data-slot="cell">
28
+ <a href="/changelog">Changelog</a>
29
+ </div>
30
+ <div data-slot="cell">
31
+ <a href="/discord">Discord</a>
32
+ </div>
33
+ <div data-slot="cell">
34
+ <a href={config.social.twitter}>X</a>
35
+ </div>
36
+ </footer>
37
+ )
38
+ }
@@ -0,0 +1,63 @@
1
+ .context-menu {
2
+ position: fixed;
3
+ z-index: 1000;
4
+ min-width: 160px;
5
+ border-radius: 8px;
6
+ background-color: var(--color-background);
7
+ box-shadow:
8
+ 0 0 0 1px rgba(19, 16, 16, 0.08),
9
+ 0 6px 8px -4px rgba(19, 16, 16, 0.12),
10
+ 0 4px 3px -2px rgba(19, 16, 16, 0.12),
11
+ 0 1px 2px -1px rgba(19, 16, 16, 0.12);
12
+ padding: 6px;
13
+
14
+ @media (prefers-color-scheme: dark) {
15
+ box-shadow: 0 0 0 1px rgba(247, 237, 237, 0.1);
16
+ }
17
+ }
18
+
19
+ .context-menu-item {
20
+ display: flex;
21
+ gap: 12px;
22
+ width: 100%;
23
+ padding: 8px 16px 8px 8px;
24
+ font-weight: 500;
25
+ cursor: pointer;
26
+ background: none;
27
+ border: none;
28
+ align-items: center;
29
+ color: var(--color-text);
30
+ font-size: var(--font-size-sm);
31
+ text-align: left;
32
+ border-radius: 2px;
33
+ transition: background-color 0.2s ease;
34
+
35
+ [data-slot="copy dark"] {
36
+ display: none;
37
+ }
38
+
39
+ @media (prefers-color-scheme: dark) {
40
+ [data-slot="copy light"] {
41
+ display: none;
42
+ }
43
+ [data-slot="copy dark"] {
44
+ display: block;
45
+ }
46
+ }
47
+
48
+ &:hover {
49
+ background-color: var(--color-background-weak-hover);
50
+ color: var(--color-text-strong);
51
+ }
52
+
53
+ img {
54
+ width: 22px;
55
+ height: 26px;
56
+ }
57
+ }
58
+
59
+ .context-menu-divider {
60
+ border: none;
61
+ border-top: 1px solid var(--color-border);
62
+ margin: var(--space-1) 0;
63
+ }
@@ -0,0 +1,279 @@
1
+ import logoLight from "../asset/logo-ornate-light.svg"
2
+ import logoDark from "../asset/logo-ornate-dark.svg"
3
+ import copyLogoLight from "../asset/lander/logo-light.svg"
4
+ import copyLogoDark from "../asset/lander/logo-dark.svg"
5
+ import copyWordmarkLight from "../asset/lander/wordmark-light.svg"
6
+ import copyWordmarkDark from "../asset/lander/wordmark-dark.svg"
7
+ import copyBrandAssetsLight from "../asset/lander/brand-assets-light.svg"
8
+ import copyBrandAssetsDark from "../asset/lander/brand-assets-dark.svg"
9
+
10
+ // SVG files for copying (separate from button icons)
11
+ // Replace these with your actual SVG files for copying
12
+ import copyLogoSvgLight from "../asset/lander/jonsoc-logo-light.svg"
13
+ import copyLogoSvgDark from "../asset/lander/jonsoc-logo-dark.svg"
14
+ import copyWordmarkSvgLight from "../asset/lander/jonsoc-wordmark-light.svg"
15
+ import copyWordmarkSvgDark from "../asset/lander/jonsoc-wordmark-dark.svg"
16
+ import { A, createAsync, useNavigate } from "@solidjs/router"
17
+ import { createMemo, Match, Show, Switch } from "solid-js"
18
+ import { createStore } from "solid-js/store"
19
+ import { github } from "~/lib/github"
20
+ import { createEffect, onCleanup } from "solid-js"
21
+ import { config } from "~/config"
22
+ import "./header-context-menu.css"
23
+
24
+ const isDarkMode = () => window.matchMedia("(prefers-color-scheme: dark)").matches
25
+
26
+ const fetchSvgContent = async (svgPath: string): Promise<string> => {
27
+ try {
28
+ const response = await fetch(svgPath)
29
+ const svgText = await response.text()
30
+ return svgText
31
+ } catch (err) {
32
+ console.error("Failed to fetch SVG content:", err)
33
+ throw err
34
+ }
35
+ }
36
+
37
+ export function Header(props: { zen?: boolean; hideGetStarted?: boolean }) {
38
+ const navigate = useNavigate()
39
+ const githubData = createAsync(() => github())
40
+ const starCount = createMemo(() =>
41
+ githubData()?.stars
42
+ ? new Intl.NumberFormat("en-US", {
43
+ notation: "compact",
44
+ compactDisplay: "short",
45
+ }).format(githubData()?.stars!)
46
+ : config.github.starsFormatted.compact,
47
+ )
48
+
49
+ const [store, setStore] = createStore({
50
+ mobileMenuOpen: false,
51
+ contextMenuOpen: false,
52
+ contextMenuPosition: { x: 0, y: 0 },
53
+ })
54
+
55
+ createEffect(() => {
56
+ const handleClickOutside = () => {
57
+ setStore("contextMenuOpen", false)
58
+ }
59
+
60
+ const handleContextMenu = (event: MouseEvent) => {
61
+ event.preventDefault()
62
+ setStore("contextMenuOpen", false)
63
+ }
64
+
65
+ const handleKeyDown = (event: KeyboardEvent) => {
66
+ if (event.key === "Escape") {
67
+ setStore("contextMenuOpen", false)
68
+ }
69
+ }
70
+
71
+ if (store.contextMenuOpen) {
72
+ document.addEventListener("click", handleClickOutside)
73
+ document.addEventListener("contextmenu", handleContextMenu)
74
+ document.addEventListener("keydown", handleKeyDown)
75
+ onCleanup(() => {
76
+ document.removeEventListener("click", handleClickOutside)
77
+ document.removeEventListener("contextmenu", handleContextMenu)
78
+ document.removeEventListener("keydown", handleKeyDown)
79
+ })
80
+ }
81
+ })
82
+
83
+ const handleLogoContextMenu = (event: MouseEvent) => {
84
+ event.preventDefault()
85
+ const logoElement = (event.currentTarget as HTMLElement).querySelector("a")
86
+ if (logoElement) {
87
+ const rect = logoElement.getBoundingClientRect()
88
+ setStore("contextMenuPosition", {
89
+ x: rect.left - 16,
90
+ y: rect.bottom + 8,
91
+ })
92
+ }
93
+ setStore("contextMenuOpen", true)
94
+ }
95
+
96
+ const copyWordmarkToClipboard = async () => {
97
+ try {
98
+ const isDark = isDarkMode()
99
+ const wordmarkSvgPath = isDark ? copyWordmarkSvgDark : copyWordmarkSvgLight
100
+ const wordmarkSvg = await fetchSvgContent(wordmarkSvgPath)
101
+ await navigator.clipboard.writeText(wordmarkSvg)
102
+ } catch (err) {
103
+ console.error("Failed to copy wordmark to clipboard:", err)
104
+ }
105
+ }
106
+
107
+ const copyLogoToClipboard = async () => {
108
+ try {
109
+ const isDark = isDarkMode()
110
+ const logoSvgPath = isDark ? copyLogoSvgDark : copyLogoSvgLight
111
+ const logoSvg = await fetchSvgContent(logoSvgPath)
112
+ await navigator.clipboard.writeText(logoSvg)
113
+ } catch (err) {
114
+ console.error("Failed to copy logo to clipboard:", err)
115
+ }
116
+ }
117
+
118
+ return (
119
+ <section data-component="top">
120
+ <div onContextMenu={handleLogoContextMenu}>
121
+ <A href="/">
122
+ <img data-slot="logo light" src={logoLight} alt="jonsoc logo light" width="189" height="34" />
123
+ <img data-slot="logo dark" src={logoDark} alt="jonsoc logo dark" width="189" height="34" />
124
+ </A>
125
+ </div>
126
+
127
+ <Show when={store.contextMenuOpen}>
128
+ <div
129
+ class="context-menu"
130
+ style={`left: ${store.contextMenuPosition.x}px; top: ${store.contextMenuPosition.y}px;`}
131
+ >
132
+ <button class="context-menu-item" onClick={copyLogoToClipboard}>
133
+ <img data-slot="copy light" src={copyLogoLight} alt="Logo" />
134
+ <img data-slot="copy dark" src={copyLogoDark} alt="Logo" />
135
+ Copy logo as SVG
136
+ </button>
137
+ <button class="context-menu-item" onClick={copyWordmarkToClipboard}>
138
+ <img data-slot="copy light" src={copyWordmarkLight} alt="Wordmark" />
139
+ <img data-slot="copy dark" src={copyWordmarkDark} alt="Wordmark" />
140
+ Copy wordmark as SVG
141
+ </button>
142
+ <button class="context-menu-item" onClick={() => navigate("/brand")}>
143
+ <img data-slot="copy light" src={copyBrandAssetsLight} alt="Brand Assets" />
144
+ <img data-slot="copy dark" src={copyBrandAssetsDark} alt="Brand Assets" />
145
+ Brand assets
146
+ </button>
147
+ </div>
148
+ </Show>
149
+ <nav data-component="nav-desktop">
150
+ <ul>
151
+ <li>
152
+ <a href={config.github.repoUrl} target="_blank">
153
+ GitHub <span>[{starCount()}]</span>
154
+ </a>
155
+ </li>
156
+ <li>
157
+ <a href="/docs">Docs</a>
158
+ </li>
159
+ <li>
160
+ <A href="/enterprise">Enterprise</A>
161
+ </li>
162
+ <li>
163
+ <Switch>
164
+ <Match when={props.zen}>
165
+ <a href="/auth">Login</a>
166
+ </Match>
167
+ <Match when={!props.zen}>
168
+ <A href="/zen">Zen</A>
169
+ </Match>
170
+ </Switch>
171
+ </li>
172
+ <Show when={!props.hideGetStarted}>
173
+ {" "}
174
+ <li>
175
+ {" "}
176
+ <A href="/download" data-slot="cta-button">
177
+ {" "}
178
+ <svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
179
+ {" "}
180
+ <path
181
+ d="M12.1875 9.75L9.00001 12.9375L5.8125 9.75M9.00001 2.0625L9 12.375M14.4375 15.9375H3.5625"
182
+ stroke="currentColor"
183
+ stroke-width="1.5"
184
+ stroke-linecap="square"
185
+ />{" "}
186
+ </svg>{" "}
187
+ Free{" "}
188
+ </A>{" "}
189
+ </li>
190
+ </Show>
191
+ </ul>
192
+ </nav>
193
+ <nav data-component="nav-mobile">
194
+ <button
195
+ type="button"
196
+ data-component="nav-mobile-toggle"
197
+ aria-expanded="false"
198
+ aria-controls="nav-mobile-menu"
199
+ class="nav-toggle"
200
+ onClick={() => setStore("mobileMenuOpen", !store.mobileMenuOpen)}
201
+ >
202
+ <span class="sr-only">Open menu</span>
203
+ <Switch>
204
+ <Match when={store.mobileMenuOpen}>
205
+ <svg
206
+ class="icon icon-close"
207
+ width="24"
208
+ height="24"
209
+ viewBox="0 0 24 24"
210
+ fill="none"
211
+ aria-hidden="true"
212
+ xmlns="http://www.w3.org/2000/svg"
213
+ >
214
+ <path
215
+ d="M12.7071 11.9993L18.0104 17.3026L17.3033 18.0097L12 12.7064L6.6967 18.0097L5.98959 17.3026L11.2929 11.9993L5.98959 6.69595L6.6967 5.98885L12 11.2921L17.3033 5.98885L18.0104 6.69595L12.7071 11.9993Z"
216
+ fill="currentColor"
217
+ />
218
+ </svg>
219
+ </Match>
220
+ <Match when={!store.mobileMenuOpen}>
221
+ <svg
222
+ class="icon icon-hamburger"
223
+ width="24"
224
+ height="24"
225
+ viewBox="0 0 24 24"
226
+ fill="none"
227
+ aria-hidden="true"
228
+ xmlns="http://www.w3.org/2000/svg"
229
+ >
230
+ <path d="M19 17H5V16H19V17Z" fill="currentColor" />
231
+ <path d="M19 8H5V7H19V8Z" fill="currentColor" />
232
+ </svg>
233
+ </Match>
234
+ </Switch>
235
+ </button>
236
+
237
+ <Show when={store.mobileMenuOpen}>
238
+ <div id="nav-mobile-menu" data-component="nav-mobile">
239
+ <nav data-component="nav-mobile-menu-list">
240
+ <ul>
241
+ <li>
242
+ <A href="/">Home</A>
243
+ </li>
244
+ <li>
245
+ <a href={config.github.repoUrl} target="_blank">
246
+ GitHub <span>[{starCount()}]</span>
247
+ </a>
248
+ </li>
249
+ <li>
250
+ <a href="/docs">Docs</a>
251
+ </li>
252
+ <li>
253
+ <A href="/enterprise">Enterprise</A>
254
+ </li>
255
+ <li>
256
+ <Switch>
257
+ <Match when={props.zen}>
258
+ <a href="/auth">Login</a>
259
+ </Match>
260
+ <Match when={!props.zen}>
261
+ <A href="/zen">Zen</A>
262
+ </Match>
263
+ </Switch>
264
+ </li>
265
+ <Show when={!props.hideGetStarted}>
266
+ <li>
267
+ <A href="/download" data-slot="cta-button">
268
+ Get started for free
269
+ </A>
270
+ </li>
271
+ </Show>
272
+ </ul>
273
+ </nav>
274
+ </div>
275
+ </Show>
276
+ </nav>
277
+ </section>
278
+ )
279
+ }