@icebreakers/monorepo-templates 1.3.0 → 1.3.2

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 (213) hide show
  1. package/README.md +6 -0
  2. package/README.zh-CN.md +6 -0
  3. package/assets/.github/workflows/ci.yml +11 -0
  4. package/assets/.github/workflows/release-intent-check.yml +57 -0
  5. package/assets/CONTRIBUTING.md +3 -1
  6. package/assets/package.json +57 -14
  7. package/assets/pnpm-workspace.yaml +13 -0
  8. package/assets/repoctl.config.ts +6 -1
  9. package/assets/turbo.json +16 -0
  10. package/package.json +4 -4
  11. package/templates/client/eslint.config.js +1 -1
  12. package/templates/client/package.json +13 -13
  13. package/templates/client/worker-configuration.d.ts +763 -217
  14. package/templates/server/package.json +3 -3
  15. package/templates/server/worker-configuration.d.ts +763 -217
  16. package/templates/vitepress/.vitepress/config.ts +17 -7
  17. package/templates/vitepress/.vitepress/home/content.ts +64 -156
  18. package/templates/vitepress/.vitepress/home/types.ts +18 -34
  19. package/templates/vitepress/.vitepress/navigation/routes.ts +89 -81
  20. package/templates/vitepress/.vitepress/seo.ts +16 -2
  21. package/templates/vitepress/.vitepress/theme/Layout.vue +27 -0
  22. package/templates/vitepress/.vitepress/theme/components/HomePage.vue +66 -88
  23. package/templates/vitepress/.vitepress/theme/home/foundation.css +161 -104
  24. package/templates/vitepress/.vitepress/theme/home/responsive.css +113 -20
  25. package/templates/vitepress/.vitepress/theme/home/sections.css +179 -100
  26. package/templates/vitepress/.vitepress/theme/index.ts +2 -0
  27. package/templates/vitepress/learn/index.md +18 -0
  28. package/templates/vitepress/{monorepo → learn/monorepo}/commands.md +1 -1
  29. package/templates/vitepress/{monorepo → learn/monorepo}/index.md +3 -3
  30. package/templates/vitepress/{monorepo → learn/monorepo}/templates.md +1 -1
  31. package/templates/vitepress/{why/what-is-npm-package.md → learn/packages/index.md} +1 -1
  32. package/templates/vitepress/{why → learn/packages}/modern/index.md +2 -2
  33. package/templates/vitepress/{why → learn/packages}/modern/typescript.md +1 -1
  34. package/templates/vitepress/{why/index.md → learn/packages/modern-overview.md} +1 -1
  35. package/templates/vitepress/{why/publish-basic-npm-package.md → learn/packages/publish.md} +1 -1
  36. package/templates/vitepress/{why/how-to-reuse-js-code.md → learn/packages/reuse-javascript.md} +2 -2
  37. package/templates/vitepress/{why/js-keywords.md → learn/packages/runtime-globals.md} +2 -2
  38. package/templates/vitepress/{repoctl/index.md → learn/repoctl-model.md} +8 -8
  39. package/templates/vitepress/{tools → learn/tools}/changeset.md +3 -3
  40. package/templates/vitepress/{tools → learn/tools}/husky.md +2 -2
  41. package/templates/vitepress/{tools → learn/tools}/lint-staged.md +2 -2
  42. package/templates/vitepress/{tools → learn/tools}/llms-txt.md +1 -1
  43. package/templates/vitepress/{tools → learn/tools}/pnpm.md +2 -2
  44. package/templates/vitepress/{tools → learn/tools}/renovate.md +2 -2
  45. package/templates/vitepress/{tools → learn/tools}/turborepo.md +2 -2
  46. package/templates/vitepress/package.json +7 -7
  47. package/templates/vitepress/public/brand/apple-touch-icon.png +0 -0
  48. package/templates/vitepress/public/brand/favicon.ico +0 -0
  49. package/templates/vitepress/public/brand/repoctl-lockup-dark.svg +6 -0
  50. package/templates/vitepress/public/brand/repoctl-lockup.svg +20 -0
  51. package/templates/vitepress/public/brand/repoctl-mark-192.png +0 -0
  52. package/templates/vitepress/public/brand/repoctl-mark-dark.svg +13 -0
  53. package/templates/vitepress/public/brand/repoctl-mark.svg +13 -0
  54. package/templates/vitepress/public/brand/repoctl-social-en.png +0 -0
  55. package/templates/vitepress/public/brand/repoctl-social-en.webp +0 -0
  56. package/templates/vitepress/public/brand/repoctl-social-zh.png +0 -0
  57. package/templates/vitepress/public/brand/repoctl-social-zh.webp +0 -0
  58. package/templates/vitepress/public/favicon.ico +0 -0
  59. package/templates/vitepress/public/logo.jpg +0 -0
  60. package/templates/vitepress/{repoctl → reference}/commands.md +2 -2
  61. package/templates/vitepress/reference/index.md +15 -0
  62. package/templates/vitepress/reference/output.md +37 -0
  63. package/templates/vitepress/{repoctl → reference}/templates.md +2 -2
  64. package/templates/vitepress/scripts/check-locales.ts +35 -1
  65. package/templates/vitepress/start/choose-next.md +14 -0
  66. package/templates/vitepress/start/first-run.md +39 -0
  67. package/templates/vitepress/start/index.md +26 -0
  68. package/templates/vitepress/{repoctl/getting-started.md → start/install.md} +5 -5
  69. package/templates/vitepress/{repoctl → tasks}/adopt-existing.md +30 -4
  70. package/templates/vitepress/{repoctl → tasks}/checks.md +27 -1
  71. package/templates/vitepress/{repoctl/workflows.md → tasks/ci.md} +30 -4
  72. package/templates/vitepress/tasks/create-project.md +37 -0
  73. package/templates/vitepress/{repoctl/scenarios.md → tasks/index.md} +8 -8
  74. package/templates/vitepress/tasks/release.md +31 -0
  75. package/templates/vitepress/{repoctl → tasks}/reports.md +25 -0
  76. package/templates/vitepress/{repoctl → tasks}/troubleshooting.md +30 -4
  77. package/templates/vitepress/zh/ai/llms-txt.md +6 -6
  78. package/templates/vitepress/zh/learn/index.md +18 -0
  79. package/templates/vitepress/zh/{monorepo → learn/monorepo}/commands.md +3 -3
  80. package/templates/vitepress/zh/{monorepo → learn/monorepo}/manage.md +4 -4
  81. package/templates/vitepress/zh/{monorepo → learn/monorepo}/templates.md +2 -2
  82. package/templates/vitepress/zh/{monorepo → learn/monorepo}/troubleshooting.md +2 -2
  83. package/templates/vitepress/zh/{why → learn/packages}/modern/index.md +1 -1
  84. package/templates/vitepress/zh/{why/index.md → learn/packages/modern-overview.md} +2 -2
  85. package/templates/vitepress/zh/{repoctl/index.md → learn/repoctl-model.md} +19 -19
  86. package/templates/vitepress/zh/{tools → learn/tools}/husky.md +1 -1
  87. package/templates/vitepress/zh/{tools → learn/tools}/lint-staged.md +1 -1
  88. package/templates/vitepress/zh/{tools → learn/tools}/llms-txt.md +1 -1
  89. package/templates/vitepress/zh/{tools → learn/tools}/pnpm.md +1 -1
  90. package/templates/vitepress/zh/{tools → learn/tools}/turborepo.md +11 -11
  91. package/templates/vitepress/zh/{repoctl → reference}/commands.md +4 -4
  92. package/templates/vitepress/zh/{repoctl → reference}/config.md +1 -1
  93. package/templates/vitepress/zh/reference/index.md +15 -0
  94. package/templates/vitepress/zh/reference/output.md +37 -0
  95. package/templates/vitepress/zh/{repoctl → reference}/templates.md +4 -4
  96. package/templates/vitepress/zh/start/choose-next.md +14 -0
  97. package/templates/vitepress/zh/{repoctl/doctor.md → start/diagnose.md} +1 -1
  98. package/templates/vitepress/zh/start/first-run.md +39 -0
  99. package/templates/vitepress/zh/start/index.md +26 -0
  100. package/templates/vitepress/zh/{repoctl/getting-started.md → start/install.md} +5 -5
  101. package/templates/vitepress/zh/{repoctl → tasks}/adopt-existing.md +30 -4
  102. package/templates/vitepress/zh/{repoctl → tasks}/checks.md +27 -1
  103. package/templates/vitepress/zh/{repoctl/workflows.md → tasks/ci.md} +38 -12
  104. package/templates/vitepress/zh/tasks/create-project.md +37 -0
  105. package/templates/vitepress/zh/{repoctl/scenarios.md → tasks/index.md} +8 -8
  106. package/templates/vitepress/zh/tasks/release.md +31 -0
  107. package/templates/vitepress/zh/{repoctl → tasks}/reports.md +25 -0
  108. package/templates/vitepress/zh/{repoctl → tasks}/troubleshooting.md +39 -13
  109. package/templates/vue-lib/package.json +5 -5
  110. package/templates/vitepress/getting-started.md +0 -11
  111. package/templates/vitepress/knowledge/index.md +0 -26
  112. package/templates/vitepress/thinking.md +0 -22
  113. package/templates/vitepress/zh/getting-started.md +0 -40
  114. package/templates/vitepress/zh/knowledge/index.md +0 -50
  115. package/templates/vitepress/zh/thinking.md +0 -91
  116. /package/templates/vitepress/{monorepo → learn/monorepo}/manage.md +0 -0
  117. /package/templates/vitepress/{monorepo → learn/monorepo}/publish.md +0 -0
  118. /package/templates/vitepress/{monorepo → learn/monorepo}/troubleshooting.md +0 -0
  119. /package/templates/vitepress/{why → learn/packages}/assets/npm-dt.svg +0 -0
  120. /package/templates/vitepress/{why → learn/packages}/assets/npm-ts.svg +0 -0
  121. /package/templates/vitepress/{why → learn/packages}/examples/0.npm-basic-package/index.js +0 -0
  122. /package/templates/vitepress/{why → learn/packages}/examples/0.npm-basic-package/package.json +0 -0
  123. /package/templates/vitepress/{why → learn/packages}/examples/1.npm-basic-package/index.cjs +0 -0
  124. /package/templates/vitepress/{why → learn/packages}/examples/1.npm-basic-package/index.d.ts +0 -0
  125. /package/templates/vitepress/{why → learn/packages}/examples/1.npm-basic-package/index.js +0 -0
  126. /package/templates/vitepress/{why → learn/packages}/examples/1.npm-basic-package/package.json +0 -0
  127. /package/templates/vitepress/{why → learn/packages}/examples/2.npm-basic-package/README.md +0 -0
  128. /package/templates/vitepress/{why → learn/packages}/examples/2.npm-basic-package/package-lock.json +0 -0
  129. /package/templates/vitepress/{why → learn/packages}/examples/2.npm-basic-package/package.json +0 -0
  130. /package/templates/vitepress/{why → learn/packages}/examples/2.npm-basic-package/rename-ext.js +0 -0
  131. /package/templates/vitepress/{why → learn/packages}/examples/2.npm-basic-package/src/index.ts +0 -0
  132. /package/templates/vitepress/{why → learn/packages}/examples/2.npm-basic-package/tsconfig.cjs.json +0 -0
  133. /package/templates/vitepress/{why → learn/packages}/examples/2.npm-basic-package/tsconfig.esm.json +0 -0
  134. /package/templates/vitepress/{why → learn/packages}/examples/2.npm-basic-package/tsconfig.json +0 -0
  135. /package/templates/vitepress/{why → learn/packages}/examples/3.npm-basic-package/README.md +0 -0
  136. /package/templates/vitepress/{why → learn/packages}/examples/3.npm-basic-package/package-lock.json +0 -0
  137. /package/templates/vitepress/{why → learn/packages}/examples/3.npm-basic-package/package.json +0 -0
  138. /package/templates/vitepress/{why → learn/packages}/examples/3.npm-basic-package/src/index.ts +0 -0
  139. /package/templates/vitepress/{why → learn/packages}/examples/3.npm-basic-package/tsconfig.json +0 -0
  140. /package/templates/vitepress/{why → learn/packages}/examples/3.npm-basic-package/tsdown.config.ts +0 -0
  141. /package/templates/vitepress/{why → learn/packages}/examples/usage-cjs/cjs.cjs +0 -0
  142. /package/templates/vitepress/{why → learn/packages}/examples/usage-cjs/esm.mjs +0 -0
  143. /package/templates/vitepress/{why → learn/packages}/examples/usage-cjs/index.js +0 -0
  144. /package/templates/vitepress/{why → learn/packages}/examples/usage-cjs/package-lock.json +0 -0
  145. /package/templates/vitepress/{why → learn/packages}/examples/usage-cjs/package.json +0 -0
  146. /package/templates/vitepress/{why → learn/packages}/examples/usage-esm/cjs.cjs +0 -0
  147. /package/templates/vitepress/{why → learn/packages}/examples/usage-esm/createRequire.js +0 -0
  148. /package/templates/vitepress/{why → learn/packages}/examples/usage-esm/esm.mjs +0 -0
  149. /package/templates/vitepress/{why → learn/packages}/examples/usage-esm/index.js +0 -0
  150. /package/templates/vitepress/{why → learn/packages}/examples/usage-esm/package-lock.json +0 -0
  151. /package/templates/vitepress/{why → learn/packages}/examples/usage-esm/package.json +0 -0
  152. /package/templates/vitepress/{why → learn/packages}/modern/bundlers.md +0 -0
  153. /package/templates/vitepress/{why → learn/packages}/modern/dts.md +0 -0
  154. /package/templates/vitepress/{why → learn/packages}/modern/esm-vs-cjs.md +0 -0
  155. /package/templates/vitepress/{why → learn/packages}/modern/package-entry-points.md +0 -0
  156. /package/templates/vitepress/{why/js-cjs-mjs.md → learn/packages/module-extensions.md} +0 -0
  157. /package/templates/vitepress/{tools → learn/tools}/index.md +0 -0
  158. /package/templates/vitepress/{repoctl → reference}/aliases.md +0 -0
  159. /package/templates/vitepress/{repoctl → reference}/config.md +0 -0
  160. /package/templates/vitepress/{repoctl → reference}/execution-model.md +0 -0
  161. /package/templates/vitepress/{repoctl → reference}/template-assets.md +0 -0
  162. /package/templates/vitepress/{repoctl/doctor.md → start/diagnose.md} +0 -0
  163. /package/templates/vitepress/zh/{monorepo → learn/monorepo}/index.md +0 -0
  164. /package/templates/vitepress/zh/{monorepo → learn/monorepo}/publish.md +0 -0
  165. /package/templates/vitepress/zh/{why → learn/packages}/assets/npm-dt.svg +0 -0
  166. /package/templates/vitepress/zh/{why → learn/packages}/assets/npm-ts.svg +0 -0
  167. /package/templates/vitepress/zh/{why → learn/packages}/examples/0.npm-basic-package/index.js +0 -0
  168. /package/templates/vitepress/zh/{why → learn/packages}/examples/0.npm-basic-package/package.json +0 -0
  169. /package/templates/vitepress/zh/{why → learn/packages}/examples/1.npm-basic-package/index.cjs +0 -0
  170. /package/templates/vitepress/zh/{why → learn/packages}/examples/1.npm-basic-package/index.d.ts +0 -0
  171. /package/templates/vitepress/zh/{why → learn/packages}/examples/1.npm-basic-package/index.js +0 -0
  172. /package/templates/vitepress/zh/{why → learn/packages}/examples/1.npm-basic-package/package.json +0 -0
  173. /package/templates/vitepress/zh/{why → learn/packages}/examples/2.npm-basic-package/README.md +0 -0
  174. /package/templates/vitepress/zh/{why → learn/packages}/examples/2.npm-basic-package/package-lock.json +0 -0
  175. /package/templates/vitepress/zh/{why → learn/packages}/examples/2.npm-basic-package/package.json +0 -0
  176. /package/templates/vitepress/zh/{why → learn/packages}/examples/2.npm-basic-package/rename-ext.js +0 -0
  177. /package/templates/vitepress/zh/{why → learn/packages}/examples/2.npm-basic-package/src/index.ts +0 -0
  178. /package/templates/vitepress/zh/{why → learn/packages}/examples/2.npm-basic-package/tsconfig.cjs.json +0 -0
  179. /package/templates/vitepress/zh/{why → learn/packages}/examples/2.npm-basic-package/tsconfig.esm.json +0 -0
  180. /package/templates/vitepress/zh/{why → learn/packages}/examples/2.npm-basic-package/tsconfig.json +0 -0
  181. /package/templates/vitepress/zh/{why → learn/packages}/examples/3.npm-basic-package/README.md +0 -0
  182. /package/templates/vitepress/zh/{why → learn/packages}/examples/3.npm-basic-package/package-lock.json +0 -0
  183. /package/templates/vitepress/zh/{why → learn/packages}/examples/3.npm-basic-package/package.json +0 -0
  184. /package/templates/vitepress/zh/{why → learn/packages}/examples/3.npm-basic-package/src/index.ts +0 -0
  185. /package/templates/vitepress/zh/{why → learn/packages}/examples/3.npm-basic-package/tsconfig.json +0 -0
  186. /package/templates/vitepress/zh/{why → learn/packages}/examples/3.npm-basic-package/tsdown.config.ts +0 -0
  187. /package/templates/vitepress/zh/{why → learn/packages}/examples/usage-cjs/cjs.cjs +0 -0
  188. /package/templates/vitepress/zh/{why → learn/packages}/examples/usage-cjs/esm.mjs +0 -0
  189. /package/templates/vitepress/zh/{why → learn/packages}/examples/usage-cjs/index.js +0 -0
  190. /package/templates/vitepress/zh/{why → learn/packages}/examples/usage-cjs/package-lock.json +0 -0
  191. /package/templates/vitepress/zh/{why → learn/packages}/examples/usage-cjs/package.json +0 -0
  192. /package/templates/vitepress/zh/{why → learn/packages}/examples/usage-esm/cjs.cjs +0 -0
  193. /package/templates/vitepress/zh/{why → learn/packages}/examples/usage-esm/createRequire.js +0 -0
  194. /package/templates/vitepress/zh/{why → learn/packages}/examples/usage-esm/esm.mjs +0 -0
  195. /package/templates/vitepress/zh/{why → learn/packages}/examples/usage-esm/index.js +0 -0
  196. /package/templates/vitepress/zh/{why → learn/packages}/examples/usage-esm/package-lock.json +0 -0
  197. /package/templates/vitepress/zh/{why → learn/packages}/examples/usage-esm/package.json +0 -0
  198. /package/templates/vitepress/zh/{why/what-is-npm-package.md → learn/packages/index.md} +0 -0
  199. /package/templates/vitepress/zh/{why → learn/packages}/modern/bundlers.md +0 -0
  200. /package/templates/vitepress/zh/{why → learn/packages}/modern/dts.md +0 -0
  201. /package/templates/vitepress/zh/{why → learn/packages}/modern/esm-vs-cjs.md +0 -0
  202. /package/templates/vitepress/zh/{why → learn/packages}/modern/package-entry-points.md +0 -0
  203. /package/templates/vitepress/zh/{why → learn/packages}/modern/typescript.md +0 -0
  204. /package/templates/vitepress/zh/{why/js-cjs-mjs.md → learn/packages/module-extensions.md} +0 -0
  205. /package/templates/vitepress/zh/{why/publish-basic-npm-package.md → learn/packages/publish.md} +0 -0
  206. /package/templates/vitepress/zh/{why/how-to-reuse-js-code.md → learn/packages/reuse-javascript.md} +0 -0
  207. /package/templates/vitepress/zh/{why/js-keywords.md → learn/packages/runtime-globals.md} +0 -0
  208. /package/templates/vitepress/zh/{tools → learn/tools}/changeset.md +0 -0
  209. /package/templates/vitepress/zh/{tools → learn/tools}/index.md +0 -0
  210. /package/templates/vitepress/zh/{tools → learn/tools}/renovate.md +0 -0
  211. /package/templates/vitepress/zh/{repoctl → reference}/aliases.md +0 -0
  212. /package/templates/vitepress/zh/{repoctl → reference}/execution-model.md +0 -0
  213. /package/templates/vitepress/zh/{repoctl → reference}/template-assets.md +0 -0
@@ -22,8 +22,13 @@ function localeRoutes(page: string) {
22
22
 
23
23
  export function createPageHead({ page, title, description }: TransformContext): HeadConfig[] {
24
24
  const { english, chinese } = localeRoutes(page)
25
- const current = page.startsWith('zh/') ? chinese : english
25
+ const isChinese = page.startsWith('zh/')
26
+ const current = isChinese ? chinese : english
26
27
  const canonical = `${siteOrigin}${current}`
28
+ const socialImage = `${siteOrigin}/brand/repoctl-social-${isChinese ? 'zh' : 'en'}.png`
29
+ const socialImageAlt = isChinese
30
+ ? 'repoctl:面向 pnpm 与 Turborepo monorepo 的任务型 CLI'
31
+ : 'repoctl: task-first CLI for pnpm and Turborepo monorepos'
27
32
 
28
33
  return [
29
34
  ['link', { rel: 'canonical', href: canonical }],
@@ -35,6 +40,15 @@ export function createPageHead({ page, title, description }: TransformContext):
35
40
  ['meta', { property: 'og:title', content: title }],
36
41
  ['meta', { property: 'og:description', content: description }],
37
42
  ['meta', { property: 'og:url', content: canonical }],
38
- ['meta', { property: 'og:locale', content: page.startsWith('zh/') ? 'zh_CN' : 'en_US' }],
43
+ ['meta', { property: 'og:locale', content: isChinese ? 'zh_CN' : 'en_US' }],
44
+ ['meta', { property: 'og:image', content: socialImage }],
45
+ ['meta', { property: 'og:image:width', content: '1200' }],
46
+ ['meta', { property: 'og:image:height', content: '630' }],
47
+ ['meta', { property: 'og:image:alt', content: socialImageAlt }],
48
+ ['meta', { name: 'twitter:card', content: 'summary_large_image' }],
49
+ ['meta', { name: 'twitter:title', content: title }],
50
+ ['meta', { name: 'twitter:description', content: description }],
51
+ ['meta', { name: 'twitter:image', content: socialImage }],
52
+ ['meta', { name: 'twitter:image:alt', content: socialImageAlt }],
39
53
  ]
40
54
  }
@@ -0,0 +1,27 @@
1
+ <script setup lang="ts">
2
+ import { useData } from 'vitepress'
3
+ import DefaultTheme from 'vitepress/theme'
4
+ import { computed } from 'vue'
5
+
6
+ const { Layout } = DefaultTheme
7
+ const { lang } = useData()
8
+ const notFoundTitle = computed(() => lang.value === 'zh-CN' ? '页面不存在' : 'Page not found')
9
+ const notFoundBody = computed(() => lang.value === 'zh-CN'
10
+ ? '这个地址不属于新的文档结构。请从开始、任务或参考章节继续。'
11
+ : 'This address is not part of the new documentation structure. Continue with Start, Tasks, or Reference.')
12
+ </script>
13
+
14
+ <template>
15
+ <Layout>
16
+ <template #not-found>
17
+ <main class="repoctl-not-found">
18
+ <p class="repoctl-not-found__code">
19
+ 404
20
+ </p>
21
+ <h1>{{ notFoundTitle }}</h1>
22
+ <p>{{ notFoundBody }}</p>
23
+ <a href="/start/">{{ lang === 'zh-CN' ? '返回开始' : 'Back to Start' }}</a>
24
+ </main>
25
+ </template>
26
+ </Layout>
27
+ </template>
@@ -9,124 +9,102 @@ const content = computed(() => homeContent[props.locale])
9
9
 
10
10
  <template>
11
11
  <main class="repoctl-home">
12
- <section class="repoctl-home__hero">
12
+ <section class="repoctl-home__hero" aria-labelledby="repoctl-home-title">
13
13
  <div class="repoctl-home__hero-copy">
14
14
  <p class="repoctl-home__eyebrow">
15
15
  {{ content.hero.label }}
16
16
  </p>
17
- <h1>{{ content.hero.title }}</h1>
17
+ <h1 id="repoctl-home-title">
18
+ {{ content.hero.title }}
19
+ </h1>
18
20
  <p class="repoctl-home__lede">
19
21
  {{ content.hero.description }}
20
22
  </p>
21
- <div class="repoctl-home__actions">
22
- <a class="repoctl-home__button repoctl-home__button--primary" :href="content.hero.primary.href">
23
- {{ content.hero.primary.label }}
23
+ <div class="repoctl-home__hero-actions">
24
+ <a class="repoctl-home__button repoctl-home__button--primary" :href="content.hero.primaryAction.href">
25
+ {{ content.hero.primaryAction.label }}
24
26
  </a>
25
- <a class="repoctl-home__button" :href="content.hero.secondary.href">
26
- {{ content.hero.secondary.label }}
27
+ <a class="repoctl-home__button repoctl-home__button--secondary" :href="content.hero.secondaryAction.href">
28
+ {{ content.hero.secondaryAction.label }}
27
29
  </a>
28
30
  </div>
29
31
  </div>
30
- <figure class="repoctl-home__capture">
31
- <img src="/repoctl-doctor.png" :alt="content.hero.imageAlt" width="1440" height="990">
32
+ <figure class="repoctl-home__hero-visual">
33
+ <img
34
+ src="/repoctl-doctor.png"
35
+ :alt="content.hero.imageAlt"
36
+ width="1440"
37
+ height="990"
38
+ decoding="async"
39
+ fetchpriority="high"
40
+ >
32
41
  </figure>
33
42
  </section>
34
43
 
35
- <section class="repoctl-home__proof" :aria-label="locale === 'en' ? 'repoctl capabilities' : 'repoctl 能力'">
36
- <span v-for="item in content.proof" :key="item">{{ item }}</span>
44
+ <section class="repoctl-home__section repoctl-home__tasks" aria-labelledby="repoctl-tasks-title">
45
+ <div class="repoctl-home__section-heading">
46
+ <h2 id="repoctl-tasks-title">
47
+ {{ content.tasks.title }}
48
+ </h2>
49
+ <p>{{ content.tasks.description }}</p>
50
+ </div>
51
+ <div class="repoctl-home__task-list">
52
+ <a v-for="task in content.tasks.items" :key="task.link.href" class="repoctl-home__task" :href="task.link.href">
53
+ <code>{{ task.command }}</code>
54
+ <div class="repoctl-home__task-copy">
55
+ <h3>{{ task.title }}</h3>
56
+ <p>{{ task.body }}</p>
57
+ </div>
58
+ <span class="repoctl-home__task-link">{{ task.link.label }} <span aria-hidden="true">-&gt;</span></span>
59
+ </a>
60
+ </div>
37
61
  </section>
38
62
 
39
- <section class="repoctl-home__section repoctl-home__lifecycle">
63
+ <section class="repoctl-home__section repoctl-home__first-run" aria-labelledby="repoctl-first-run-title">
40
64
  <div class="repoctl-home__section-heading">
41
- <h2>{{ content.lifecycle.title }}</h2>
42
- <p>{{ content.lifecycle.description }}</p>
65
+ <h2 id="repoctl-first-run-title">
66
+ {{ content.firstRun.title }}
67
+ </h2>
68
+ <p>{{ content.firstRun.description }}</p>
43
69
  </div>
44
- <ol>
45
- <li v-for="step in content.lifecycle.steps" :key="step.command">
46
- <code>{{ step.command }}</code>
47
- <h3>{{ step.title }}</h3>
48
- <p>{{ step.body }}</p>
70
+ <ol class="repoctl-home__steps">
71
+ <li v-for="(step, index) in content.firstRun.steps" :key="step.command">
72
+ <span class="repoctl-home__step-number" aria-hidden="true">{{ String(index + 1).padStart(2, '0') }}</span>
73
+ <div>
74
+ <h3>{{ step.title }}</h3>
75
+ <code>{{ step.command }}</code>
76
+ <p>{{ step.body }}</p>
77
+ </div>
49
78
  </li>
50
79
  </ol>
51
80
  </section>
52
81
 
53
- <section class="repoctl-home__section repoctl-home__paths">
54
- <div class="repoctl-home__section-heading">
55
- <h2>{{ content.paths.title }}</h2>
56
- <p>{{ content.paths.description }}</p>
82
+ <section class="repoctl-home__section repoctl-home__evidence" aria-labelledby="repoctl-evidence-title">
83
+ <div class="repoctl-home__evidence-copy">
84
+ <h2 id="repoctl-evidence-title">
85
+ {{ content.evidence.title }}
86
+ </h2>
87
+ <p>{{ content.evidence.description }}</p>
88
+ <a class="repoctl-home__text-link" :href="content.evidence.link.href">{{ content.evidence.link.label }} <span aria-hidden="true">-&gt;</span></a>
57
89
  </div>
58
- <div class="repoctl-home__path-grid">
59
- <article v-for="item in content.paths.items" :key="item.href">
60
- <h3>{{ item.title }}</h3>
61
- <p>{{ item.body }}</p>
62
- <pre><code>{{ item.commands.join('\n') }}</code></pre>
63
- <a :href="item.href">{{ item.linkLabel }}</a>
64
- </article>
90
+ <div class="repoctl-home__workflow">
91
+ <span class="repoctl-home__workflow-prompt" aria-hidden="true">$</span>
92
+ <pre><code>{{ content.evidence.code }}</code></pre>
65
93
  </div>
66
94
  </section>
67
95
 
68
- <section class="repoctl-home__section repoctl-home__capabilities">
96
+ <section class="repoctl-home__section repoctl-home__layers" aria-labelledby="repoctl-layers-title">
69
97
  <div class="repoctl-home__section-heading">
70
- <p class="repoctl-home__eyebrow">
71
- repoctl
72
- </p>
73
- <h2>{{ content.capabilities.title }}</h2>
74
- <p>{{ content.capabilities.description }}</p>
98
+ <h2 id="repoctl-layers-title">
99
+ {{ content.layers.title }}
100
+ </h2>
101
+ <p>{{ content.layers.description }}</p>
75
102
  </div>
76
- <div class="repoctl-home__capability-grid">
77
- <article v-for="item in content.capabilities.items" :key="item.title">
103
+ <div class="repoctl-home__layer-list">
104
+ <a v-for="item in content.layers.items" :key="item.link.href" class="repoctl-home__layer" :href="item.link.href">
78
105
  <h3>{{ item.title }}</h3>
79
106
  <p>{{ item.body }}</p>
80
- </article>
81
- </div>
82
- </section>
83
-
84
- <section class="repoctl-home__section repoctl-home__commands">
85
- <div class="repoctl-home__section-heading">
86
- <h2>{{ content.commands.title }}</h2>
87
- <p>{{ content.commands.description }}</p>
88
- </div>
89
- <dl>
90
- <div v-for="item in content.commands.items" :key="item.command">
91
- <dt><code>{{ item.command }}</code></dt>
92
- <dd>{{ item.purpose }}</dd>
93
- </div>
94
- </dl>
95
- </section>
96
-
97
- <section class="repoctl-home__section repoctl-home__automation">
98
- <div>
99
- <h2>{{ content.automation.title }}</h2>
100
- <p>{{ content.automation.description }}</p>
101
- <ul>
102
- <li v-for="format in content.automation.formats" :key="format">
103
- {{ format }}
104
- </li>
105
- </ul>
106
- </div>
107
- <pre><code>{{ content.automation.code }}</code></pre>
108
- </section>
109
-
110
- <section class="repoctl-home__section repoctl-home__quickstart">
111
- <div class="repoctl-home__section-heading">
112
- <h2>{{ content.quickstart.title }}</h2>
113
- <p>{{ content.quickstart.description }}</p>
114
- </div>
115
- <pre><code>{{ content.quickstart.code }}</code></pre>
116
- <a class="repoctl-home__button repoctl-home__button--primary" :href="content.quickstart.link.href">
117
- {{ content.quickstart.link.label }}
118
- </a>
119
- </section>
120
-
121
- <section class="repoctl-home__section repoctl-home__docs">
122
- <div class="repoctl-home__section-heading">
123
- <h2>{{ content.docs.title }}</h2>
124
- <p>{{ content.docs.description }}</p>
125
- </div>
126
- <div>
127
- <a v-for="item in content.docs.items" :key="item.href" :href="item.href">
128
- <strong>{{ item.label }}</strong>
129
- <span>{{ item.body }}</span>
107
+ <span class="repoctl-home__text-link">{{ item.link.label }} <span aria-hidden="true">-&gt;</span></span>
130
108
  </a>
131
109
  </div>
132
110
  </section>
@@ -1,13 +1,44 @@
1
- .repoctl-home {
2
- --home-border: color-mix(in srgb, var(--vp-c-divider) 82%, transparent);
3
- --home-accent: #1769aa;
4
- --home-accent-dark: #4aa3e0;
5
- --home-muted: var(--vp-c-text-2);
1
+ :root {
2
+ --repoctl-accent: #2457d6;
3
+ --repoctl-accent-hover: #1d48b8;
4
+ --repoctl-accent-contrast: #f8faff;
5
+ --repoctl-graphite: #18202b;
6
+ --repoctl-muted: #596273;
7
+ --repoctl-line: #d8dee8;
8
+ --repoctl-surface: #fff;
9
+ --repoctl-soft: #f4f6f9;
10
+ --repoctl-accent-soft: #edf2ff;
11
+ --repoctl-code: #101821;
12
+ --repoctl-code-text: #edf3fb;
13
+ --repoctl-shadow: 0 24px 64px rgb(24 32 43 / 14%);
14
+ }
15
+
16
+ .dark {
17
+ --repoctl-accent: #8ca7ff;
18
+ --repoctl-accent-hover: #a9bcff;
19
+ --repoctl-accent-contrast: #f8faff;
20
+ --repoctl-graphite: #f0f3f7;
21
+ --repoctl-muted: #b2bbc8;
22
+ --repoctl-line: #343e4d;
23
+ --repoctl-surface: #171e28;
24
+ --repoctl-soft: #1c2531;
25
+ --repoctl-accent-soft: #1b2946;
26
+ --repoctl-code: #0b1119;
27
+ --repoctl-code-text: #edf3fb;
28
+ --repoctl-shadow: 0 24px 64px rgb(0 0 0 / 32%);
29
+ }
6
30
 
7
- max-width: 1180px;
8
- padding: 32px 24px 96px;
31
+ .repoctl-home {
32
+ width: min(100%, 1248px);
33
+ padding: 32px 32px 112px;
9
34
  margin: 0 auto;
10
- color: var(--vp-c-text-1);
35
+ color: var(--repoctl-graphite);
36
+ }
37
+
38
+ .repoctl-home *,
39
+ .repoctl-home *::before,
40
+ .repoctl-home *::after {
41
+ box-sizing: border-box;
11
42
  }
12
43
 
13
44
  .repoctl-home h1,
@@ -19,162 +50,188 @@
19
50
  margin: 0;
20
51
  }
21
52
 
22
- .repoctl-home__hero {
23
- display: grid;
24
- grid-template-columns: minmax(0, 0.88fr) minmax(420px, 1.12fr);
25
- gap: clamp(32px, 5vw, 72px);
26
- align-items: center;
27
- min-height: min(680px, calc(100dvh - 96px));
53
+ .repoctl-home h1,
54
+ .repoctl-home h2,
55
+ .repoctl-home h3 {
56
+ color: var(--repoctl-graphite);
57
+ letter-spacing: 0;
58
+ }
59
+
60
+ .repoctl-home p {
61
+ line-height: 1.65;
62
+ color: var(--repoctl-muted);
63
+ }
64
+
65
+ .repoctl-home code {
66
+ font-size: 0.9em;
67
+ }
68
+
69
+ .repoctl-home a {
70
+ color: inherit;
71
+ }
72
+
73
+ .repoctl-home a:focus-visible {
74
+ outline: 3px solid color-mix(in srgb, var(--repoctl-accent) 62%, transparent);
75
+ outline-offset: 3px;
28
76
  }
29
77
 
30
78
  .repoctl-home__eyebrow {
31
- margin-bottom: 14px !important;
79
+ margin-bottom: 18px !important;
80
+ font-family: var(--vp-font-family-mono);
32
81
  font-size: 12px;
33
82
  font-weight: 700;
34
- color: var(--home-accent);
35
- letter-spacing: 0;
83
+ color: var(--repoctl-accent) !important;
84
+ text-transform: uppercase;
85
+ letter-spacing: 0.04em;
36
86
  }
37
87
 
38
- .dark .repoctl-home__eyebrow {
39
- color: var(--home-accent-dark);
88
+ .repoctl-home__hero {
89
+ display: grid;
90
+ grid-template-columns: minmax(0, 1.06fr) minmax(460px, 0.94fr);
91
+ gap: 64px;
92
+ align-items: center;
93
+ min-height: min(620px, calc(100dvh - 64px));
94
+ padding: 56px 0 72px;
95
+ border-bottom: 1px solid var(--repoctl-line);
40
96
  }
41
97
 
42
- .repoctl-home__hero h1 {
43
- max-width: 13ch;
44
- font-size: clamp(42px, 4.25vw, 60px);
45
- line-height: 1.02;
46
- letter-spacing: 0;
98
+ .repoctl-home__hero-copy {
99
+ position: relative;
100
+ z-index: 1;
47
101
  }
48
102
 
49
- .repoctl-home__lede,
50
- .repoctl-home__section-heading > p,
51
- .repoctl-home article p,
52
- .repoctl-home__automation p {
53
- line-height: 1.7;
54
- color: var(--home-muted);
103
+ .repoctl-home__hero h1 {
104
+ max-width: 680px;
105
+ font-size: clamp(46px, 4.25vw, 58px);
106
+ line-height: 1.04;
55
107
  }
56
108
 
57
109
  .repoctl-home__lede {
58
- max-width: 38rem;
59
- margin-top: 22px !important;
60
- font-size: 17px;
110
+ max-width: 610px;
111
+ margin-top: 24px !important;
112
+ font-size: 18px;
61
113
  }
62
114
 
63
- .repoctl-home__actions {
115
+ .repoctl-home__hero-actions {
64
116
  display: flex;
65
117
  flex-wrap: wrap;
66
118
  gap: 12px;
67
- margin-top: 28px;
119
+ margin-top: 32px;
68
120
  }
69
121
 
70
122
  .repoctl-home__button {
71
123
  display: inline-flex;
72
124
  align-items: center;
73
125
  justify-content: center;
74
- min-height: 42px;
75
- padding: 0 17px;
126
+ min-height: 48px;
127
+ padding: 0 20px;
76
128
  font-size: 14px;
77
- font-weight: 650;
78
- color: var(--vp-c-text-1) !important;
129
+ font-weight: 700;
130
+ line-height: 1;
131
+ white-space: nowrap;
79
132
  text-decoration: none !important;
80
- border: 1px solid var(--home-border);
81
- border-radius: 6px;
133
+ border: 1px solid transparent;
134
+ border-radius: 8px;
82
135
  transition:
83
- transform 180ms ease,
84
- border-color 180ms ease,
85
- background-color 180ms ease;
136
+ color 160ms ease,
137
+ background-color 160ms ease,
138
+ border-color 160ms ease,
139
+ transform 160ms ease;
86
140
  }
87
141
 
88
- .repoctl-home__button:hover {
89
- border-color: var(--home-accent);
90
- transform: translateY(-1px);
142
+ .repoctl-home__button--primary {
143
+ color: var(--repoctl-accent-contrast) !important;
144
+ background: #2457d6;
145
+ border-color: #2457d6;
91
146
  }
92
147
 
93
- .repoctl-home__button:active {
94
- transform: translateY(0);
148
+ .repoctl-home__button--primary:hover {
149
+ background: #1d48b8;
150
+ border-color: #1d48b8;
95
151
  }
96
152
 
97
- .repoctl-home__button--primary {
98
- color: #fff !important;
99
- background: var(--home-accent);
100
- border-color: var(--home-accent);
153
+ .repoctl-home__button--secondary {
154
+ color: var(--repoctl-graphite) !important;
155
+ background: var(--repoctl-surface);
156
+ border-color: var(--repoctl-line);
101
157
  }
102
158
 
103
- .repoctl-home__capture {
159
+ .repoctl-home__button--secondary:hover {
160
+ color: var(--repoctl-accent) !important;
161
+ border-color: var(--repoctl-accent);
162
+ }
163
+
164
+ .repoctl-home__button:active {
165
+ transform: translateY(1px);
166
+ }
167
+
168
+ .repoctl-home__hero-visual {
169
+ aspect-ratio: 1.1;
104
170
  overflow: hidden;
105
- background: #111a23;
106
- border: 1px solid var(--home-border);
107
- border-radius: 6px;
108
- box-shadow: 0 22px 56px rgb(23 105 170 / 16%);
171
+ background: var(--repoctl-code);
172
+ border: 1px solid var(--repoctl-line);
173
+ border-radius: 8px;
174
+ box-shadow: var(--repoctl-shadow);
109
175
  }
110
176
 
111
- .repoctl-home__capture img {
177
+ .repoctl-home__hero-visual img {
112
178
  display: block;
113
- width: 100%;
179
+ width: 142%;
180
+ max-width: none;
114
181
  height: auto;
115
182
  }
116
183
 
117
- .repoctl-home__proof {
118
- display: flex;
119
- flex-wrap: wrap;
120
- gap: 12px 26px;
121
- padding: 20px 0;
122
- font-size: 13px;
123
- font-weight: 600;
124
- color: var(--home-muted);
125
- border-top: 1px solid var(--home-border);
126
- border-bottom: 1px solid var(--home-border);
127
- }
128
-
129
184
  .repoctl-home__section {
130
- padding-top: 96px;
185
+ padding-top: 104px;
131
186
  }
132
187
 
133
188
  .repoctl-home__section-heading {
134
- max-width: 680px;
135
- margin-bottom: 32px;
189
+ max-width: 720px;
190
+ margin-bottom: 36px;
136
191
  }
137
192
 
138
193
  .repoctl-home__section-heading h2,
139
- .repoctl-home__automation h2 {
140
- font-size: clamp(28px, 3vw, 40px);
141
- line-height: 1.12;
142
- letter-spacing: 0;
194
+ .repoctl-home__evidence h2 {
195
+ max-width: 680px;
196
+ font-size: clamp(30px, 3.3vw, 44px);
197
+ line-height: 1.1;
143
198
  }
144
199
 
145
- .repoctl-home__section-heading > p,
146
- .repoctl-home__automation p {
147
- margin-top: 12px !important;
200
+ .repoctl-home__section-heading p,
201
+ .repoctl-home__evidence-copy > p {
202
+ max-width: 620px;
203
+ margin-top: 14px !important;
204
+ font-size: 16px;
148
205
  }
149
206
 
150
- .repoctl-home__lifecycle ol {
151
- display: grid;
152
- grid-template-columns: repeat(5, 1fr);
153
- gap: 16px;
154
- padding: 0;
155
- list-style: none;
207
+ .repoctl-not-found {
208
+ max-width: 680px;
209
+ padding: 96px 32px 160px;
210
+ margin: 0 auto;
156
211
  }
157
212
 
158
- .repoctl-home__lifecycle li {
159
- min-height: 184px;
160
- padding: 18px;
161
- border: 1px solid var(--home-border);
162
- border-radius: 6px;
213
+ .repoctl-not-found__code {
214
+ font-family: var(--vp-font-family-mono);
215
+ font-size: 14px;
216
+ font-weight: 700;
217
+ color: var(--repoctl-accent);
163
218
  }
164
219
 
165
- .repoctl-home code {
166
- font-size: 0.86em;
220
+ .repoctl-not-found h1 {
221
+ margin-top: 12px;
222
+ font-size: 42px;
167
223
  }
168
224
 
169
- .repoctl-home__lifecycle h3,
170
- .repoctl-home__capability-grid h3 {
171
- margin-top: 22px;
172
- font-size: 17px;
225
+ .repoctl-not-found > p:not(.repoctl-not-found__code) {
226
+ max-width: 56ch;
227
+ margin-top: 16px;
228
+ line-height: 1.65;
229
+ color: var(--repoctl-muted);
173
230
  }
174
231
 
175
- .repoctl-home__lifecycle p {
176
- margin-top: 8px !important;
177
- font-size: 14px;
178
- line-height: 1.6;
179
- color: var(--home-muted);
232
+ .repoctl-not-found a {
233
+ display: inline-block;
234
+ margin-top: 24px;
235
+ font-weight: 700;
236
+ color: var(--repoctl-accent);
180
237
  }