@icebreakers/monorepo-templates 1.2.0 → 1.3.0

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 (65) hide show
  1. package/assets/.github/workflows/ci.yml +4 -4
  2. package/assets/.github/workflows/release.yml +10 -7
  3. package/assets/package.json +2 -1
  4. package/assets/pnpm-workspace.yaml +2 -9
  5. package/assets/renovate.json +0 -1
  6. package/assets-data.mjs +0 -1
  7. package/dist/cli.mjs +1 -1
  8. package/dist/index.mjs +1 -1
  9. package/dist/{prepare-CNCmvco-.mjs → prepare-D7eJqEqy.mjs} +21 -2
  10. package/package.json +5 -3
  11. package/templates/cli/package.json +1 -1
  12. package/templates/client/package.json +1 -1
  13. package/templates/server/package.json +1 -1
  14. package/templates/tsdown/package.json +1 -1
  15. package/templates/vitepress/.vitepress/config.ts +9 -119
  16. package/templates/vitepress/.vitepress/env.d.ts +1 -0
  17. package/templates/vitepress/.vitepress/home/content.ts +186 -0
  18. package/templates/vitepress/.vitepress/home/types.ts +65 -0
  19. package/templates/vitepress/.vitepress/navigation/routes.ts +138 -0
  20. package/templates/vitepress/.vitepress/seo.ts +40 -0
  21. package/templates/vitepress/.vitepress/theme/components/HomePage.vue +134 -0
  22. package/templates/vitepress/.vitepress/theme/home/foundation.css +180 -0
  23. package/templates/vitepress/.vitepress/theme/home/index.css +3 -0
  24. package/templates/vitepress/.vitepress/theme/home/responsive.css +49 -0
  25. package/templates/vitepress/.vitepress/theme/home/sections.css +153 -0
  26. package/templates/vitepress/.vitepress/theme/index.ts +9 -1
  27. package/templates/vitepress/ai/llms-txt.md +2 -2
  28. package/templates/vitepress/index.md +6 -60
  29. package/templates/vitepress/package.json +11 -4
  30. package/templates/vitepress/public/repoctl-doctor.png +0 -0
  31. package/templates/vitepress/repoctl/workflows.md +35 -0
  32. package/templates/vitepress/scripts/check-locales.ts +162 -0
  33. package/templates/vitepress/thinking.md +15 -0
  34. package/templates/vitepress/tools/changeset.md +17 -12
  35. package/templates/vitepress/tools/husky.md +41 -3
  36. package/templates/vitepress/tools/lint-staged.md +32 -5
  37. package/templates/vitepress/tools/pnpm.md +39 -7
  38. package/templates/vitepress/tools/renovate.md +27 -3
  39. package/templates/vitepress/tools/turborepo.md +33 -7
  40. package/templates/vitepress/tsconfig.json +7 -0
  41. package/templates/vitepress/why/examples/2.npm-basic-package/README.md +1 -1
  42. package/templates/vitepress/why/examples/3.npm-basic-package/README.md +1 -1
  43. package/templates/vitepress/why/how-to-reuse-js-code.md +36 -6
  44. package/templates/vitepress/why/js-cjs-mjs.md +31 -9
  45. package/templates/vitepress/why/js-keywords.md +33 -4
  46. package/templates/vitepress/why/modern/bundlers.md +37 -2
  47. package/templates/vitepress/why/modern/dts.md +44 -3
  48. package/templates/vitepress/why/modern/esm-vs-cjs.md +38 -3
  49. package/templates/vitepress/why/modern/index.md +33 -9
  50. package/templates/vitepress/why/modern/package-entry-points.md +33 -4
  51. package/templates/vitepress/why/modern/typescript.md +40 -4
  52. package/templates/vitepress/why/publish-basic-npm-package.md +37 -13
  53. package/templates/vitepress/why/what-is-npm-package.md +32 -3
  54. package/templates/vitepress/wrangler.jsonc +20 -3
  55. package/templates/vitepress/zh/ai/index.md +1 -1
  56. package/templates/vitepress/zh/ai/llms-txt.md +1 -1
  57. package/templates/vitepress/zh/index.md +6 -63
  58. package/templates/vitepress/zh/repoctl/workflows.md +35 -0
  59. package/templates/vitepress/zh/thinking.md +9 -6
  60. package/templates/vitepress/zh/why/examples/2.npm-basic-package/README.md +1 -1
  61. package/templates/vitepress/zh/why/examples/3.npm-basic-package/README.md +1 -1
  62. package/templates/vitepress/zh/why/index.md +38 -1
  63. package/templates/vue-lib/package.json +1 -1
  64. package/assets/.changeset/ledger.yaml +0 -51
  65. package/assets/netlify.toml +0 -14
@@ -0,0 +1,65 @@
1
+ export interface HomeLink {
2
+ label: string
3
+ href: string
4
+ }
5
+
6
+ export interface HomeStep {
7
+ title: string
8
+ body: string
9
+ command: string
10
+ }
11
+
12
+ export interface HomeContent {
13
+ hero: {
14
+ label: string
15
+ title: string
16
+ description: string
17
+ primary: HomeLink
18
+ secondary: HomeLink
19
+ imageAlt: string
20
+ }
21
+ proof: string[]
22
+ lifecycle: {
23
+ title: string
24
+ description: string
25
+ steps: HomeStep[]
26
+ }
27
+ paths: {
28
+ title: string
29
+ description: string
30
+ items: Array<{
31
+ title: string
32
+ body: string
33
+ commands: string[]
34
+ href: string
35
+ linkLabel: string
36
+ }>
37
+ }
38
+ capabilities: {
39
+ title: string
40
+ description: string
41
+ items: Array<{ title: string, body: string }>
42
+ }
43
+ commands: {
44
+ title: string
45
+ description: string
46
+ items: Array<{ command: string, purpose: string }>
47
+ }
48
+ automation: {
49
+ title: string
50
+ description: string
51
+ formats: string[]
52
+ code: string
53
+ }
54
+ quickstart: {
55
+ title: string
56
+ description: string
57
+ code: string
58
+ link: HomeLink
59
+ }
60
+ docs: {
61
+ title: string
62
+ description: string
63
+ items: Array<HomeLink & { body: string }>
64
+ }
65
+ }
@@ -0,0 +1,138 @@
1
+ import type { DefaultTheme } from 'vitepress'
2
+
3
+ export type DocsLocale = 'en' | 'zh'
4
+
5
+ interface LocalizedText {
6
+ en: string
7
+ zh: string
8
+ }
9
+
10
+ interface RouteItem {
11
+ slug: string
12
+ label: LocalizedText
13
+ }
14
+
15
+ interface RouteSection {
16
+ id: 'repoctl' | 'monorepo' | 'why' | 'ai' | 'tools'
17
+ label: LocalizedText
18
+ items: RouteItem[]
19
+ }
20
+
21
+ const item = (slug: string, en: string, zh: string): RouteItem => ({ slug, label: { en, zh } })
22
+
23
+ export const routeSections = [
24
+ {
25
+ id: 'repoctl',
26
+ label: { en: 'repoctl', zh: 'repoctl' },
27
+ items: [
28
+ item('', 'Overview', '概览'),
29
+ item('getting-started', 'Getting Started', '快速开始'),
30
+ item('adopt-existing', 'Adopt Existing Repos', '接入已有仓库'),
31
+ item('scenarios', 'Choose By Scenario', '按场景选命令'),
32
+ item('execution-model', 'Execution Model', '执行模型'),
33
+ item('commands', 'Command Reference', '命令速查'),
34
+ item('checks', 'Verification', '校验链路'),
35
+ item('doctor', 'Doctor', 'Doctor 诊断'),
36
+ item('config', 'Configuration', '配置文件'),
37
+ item('templates', 'Templates', '模板与创建'),
38
+ item('template-assets', 'Template Assets', '模板资产治理'),
39
+ item('workflows', 'Workflows and CI', '工作流与 CI'),
40
+ item('reports', 'Reports', '报告与自动化输出'),
41
+ item('troubleshooting', 'Troubleshooting', '排障'),
42
+ item('aliases', 'Command Aliases', '命令别名'),
43
+ ],
44
+ },
45
+ {
46
+ id: 'monorepo',
47
+ label: { en: 'Knowledge Base', zh: '知识库' },
48
+ items: [
49
+ item('', 'Why Monorepo', '为什么使用 Monorepo'),
50
+ item('manage', 'Managing A Monorepo', '管理 Monorepo'),
51
+ item('publish', 'Publishing and Changelogs', '发包与变更日志'),
52
+ item('commands', 'Monorepo Commands', 'Monorepo 命令'),
53
+ item('templates', 'Template Systems', '模板体系'),
54
+ item('troubleshooting', 'Troubleshooting', '常见问题排障'),
55
+ ],
56
+ },
57
+ {
58
+ id: 'why',
59
+ label: { en: 'Modern Packages', zh: '现代 npm 包' },
60
+ items: [
61
+ item('how-to-reuse-js-code', 'Reusing JavaScript', '复用 JavaScript'),
62
+ item('js-cjs-mjs', 'Module Extensions', '模块文件后缀'),
63
+ item('js-keywords', 'Runtime Globals', '运行时关键字'),
64
+ item('what-is-npm-package', 'What Is An npm Package?', '什么是 npm 包'),
65
+ item('publish-basic-npm-package', 'Publishing A Package', '发布 npm 包'),
66
+ item('', 'Package Evolution', '包的演进'),
67
+ item('modern/', 'Modern Package Guide', '现代包指南'),
68
+ item('modern/esm-vs-cjs', 'ESM vs CommonJS', 'ESM 与 CommonJS'),
69
+ item('modern/dts', 'Type Declarations', '类型声明'),
70
+ item('modern/package-entry-points', 'Package Entry Points', '包入口'),
71
+ item('modern/bundlers', 'Bundlers', '构建工具'),
72
+ item('modern/typescript', 'TypeScript', 'TypeScript'),
73
+ ],
74
+ },
75
+ {
76
+ id: 'ai',
77
+ label: { en: 'AI', zh: 'AI' },
78
+ items: [item('', 'AI Documentation', 'AI 文档'), item('llms-txt', 'llms.txt', 'llms.txt')],
79
+ },
80
+ {
81
+ id: 'tools',
82
+ label: { en: 'Tool Guides', zh: '工具专题' },
83
+ items: [
84
+ item('', 'Overview', '概览'),
85
+ item('pnpm', 'pnpm', 'pnpm'),
86
+ item('turborepo', 'Turborepo', 'Turborepo'),
87
+ item('changeset', 'pnpm Versioning', 'pnpm Versioning'),
88
+ item('husky', 'Husky', 'Husky'),
89
+ item('lint-staged', 'lint-staged', 'lint-staged'),
90
+ item('renovate', 'Renovate', 'Renovate'),
91
+ item('llms-txt', 'llms.txt', 'llms.txt'),
92
+ ],
93
+ },
94
+ ] as const satisfies readonly RouteSection[]
95
+
96
+ function prefixFor(locale: DocsLocale) {
97
+ return locale === 'zh' ? '/zh' : ''
98
+ }
99
+
100
+ function sectionItems(section: RouteSection, locale: DocsLocale): DefaultTheme.SidebarItem[] {
101
+ const prefix = prefixFor(locale)
102
+ return section.items.map(route => ({
103
+ text: route.label[locale],
104
+ link: `${prefix}/${section.id}/${route.slug}`.replace(/\/+/g, '/'),
105
+ }))
106
+ }
107
+
108
+ export function createSidebars(locale: DocsLocale): DefaultTheme.SidebarMulti {
109
+ const prefix = prefixFor(locale)
110
+ const groups = Object.fromEntries(routeSections.map(section => [
111
+ section.id,
112
+ { text: section.label[locale], items: sectionItems(section, locale) },
113
+ ])) as Record<RouteSection['id'], DefaultTheme.SidebarItem>
114
+ const knowledge = [groups.monorepo, groups.why]
115
+
116
+ return {
117
+ [`${prefix}/repoctl/`]: [groups.repoctl],
118
+ [`${prefix}/knowledge/`]: knowledge,
119
+ [`${prefix}/monorepo/`]: knowledge,
120
+ [`${prefix}/why/`]: knowledge,
121
+ [`${prefix}/ai/`]: [groups.ai],
122
+ [`${prefix}/tools/`]: [groups.tools],
123
+ [`${prefix || ''}/`]: [groups.repoctl],
124
+ }
125
+ }
126
+
127
+ export function createNav(locale: DocsLocale): DefaultTheme.NavItem[] {
128
+ const zh = locale === 'zh'
129
+ const prefix = prefixFor(locale)
130
+ return [
131
+ { text: 'repoctl', link: `${prefix}/repoctl/` },
132
+ { text: zh ? '快速开始' : 'Getting Started', link: `${prefix}/repoctl/getting-started` },
133
+ { text: zh ? '命令' : 'Commands', link: `${prefix}/repoctl/commands` },
134
+ { text: zh ? '知识库' : 'Knowledge Base', link: `${prefix}/knowledge/` },
135
+ { text: zh ? 'AI 文档' : 'AI Docs', link: `${prefix}/ai/` },
136
+ { text: zh ? '工具专题' : 'Tool Guides', link: `${prefix}/tools/` },
137
+ ]
138
+ }
@@ -0,0 +1,40 @@
1
+ import type { HeadConfig, TransformContext } from 'vitepress'
2
+
3
+ export const siteOrigin = 'https://repoctl.icebreaker.top'
4
+
5
+ function routeFromPage(page: string) {
6
+ const withoutExtension = page.replace(/\.md$/, '')
7
+ if (withoutExtension === 'index') {
8
+ return '/'
9
+ }
10
+ if (withoutExtension.endsWith('/index')) {
11
+ return `/${withoutExtension.slice(0, -6)}`
12
+ }
13
+ return `/${withoutExtension}`
14
+ }
15
+
16
+ function localeRoutes(page: string) {
17
+ const sourcePage = page.startsWith('zh/') ? page.slice(3) : page
18
+ const english = routeFromPage(sourcePage)
19
+ const chinese = routeFromPage(`zh/${sourcePage}`)
20
+ return { english, chinese }
21
+ }
22
+
23
+ export function createPageHead({ page, title, description }: TransformContext): HeadConfig[] {
24
+ const { english, chinese } = localeRoutes(page)
25
+ const current = page.startsWith('zh/') ? chinese : english
26
+ const canonical = `${siteOrigin}${current}`
27
+
28
+ return [
29
+ ['link', { rel: 'canonical', href: canonical }],
30
+ ['link', { rel: 'alternate', hreflang: 'en', href: `${siteOrigin}${english}` }],
31
+ ['link', { rel: 'alternate', hreflang: 'zh-CN', href: `${siteOrigin}${chinese}` }],
32
+ ['link', { rel: 'alternate', hreflang: 'x-default', href: `${siteOrigin}${english}` }],
33
+ ['meta', { property: 'og:type', content: 'website' }],
34
+ ['meta', { property: 'og:site_name', content: 'repoctl' }],
35
+ ['meta', { property: 'og:title', content: title }],
36
+ ['meta', { property: 'og:description', content: description }],
37
+ ['meta', { property: 'og:url', content: canonical }],
38
+ ['meta', { property: 'og:locale', content: page.startsWith('zh/') ? 'zh_CN' : 'en_US' }],
39
+ ]
40
+ }
@@ -0,0 +1,134 @@
1
+ <script setup lang="ts">
2
+ import type { DocsLocale } from '../../navigation/routes'
3
+ import { computed } from 'vue'
4
+ import { homeContent } from '../../home/content'
5
+
6
+ const props = defineProps<{ locale: DocsLocale }>()
7
+ const content = computed(() => homeContent[props.locale])
8
+ </script>
9
+
10
+ <template>
11
+ <main class="repoctl-home">
12
+ <section class="repoctl-home__hero">
13
+ <div class="repoctl-home__hero-copy">
14
+ <p class="repoctl-home__eyebrow">
15
+ {{ content.hero.label }}
16
+ </p>
17
+ <h1>{{ content.hero.title }}</h1>
18
+ <p class="repoctl-home__lede">
19
+ {{ content.hero.description }}
20
+ </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 }}
24
+ </a>
25
+ <a class="repoctl-home__button" :href="content.hero.secondary.href">
26
+ {{ content.hero.secondary.label }}
27
+ </a>
28
+ </div>
29
+ </div>
30
+ <figure class="repoctl-home__capture">
31
+ <img src="/repoctl-doctor.png" :alt="content.hero.imageAlt" width="1440" height="990">
32
+ </figure>
33
+ </section>
34
+
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>
37
+ </section>
38
+
39
+ <section class="repoctl-home__section repoctl-home__lifecycle">
40
+ <div class="repoctl-home__section-heading">
41
+ <h2>{{ content.lifecycle.title }}</h2>
42
+ <p>{{ content.lifecycle.description }}</p>
43
+ </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>
49
+ </li>
50
+ </ol>
51
+ </section>
52
+
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>
57
+ </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>
65
+ </div>
66
+ </section>
67
+
68
+ <section class="repoctl-home__section repoctl-home__capabilities">
69
+ <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>
75
+ </div>
76
+ <div class="repoctl-home__capability-grid">
77
+ <article v-for="item in content.capabilities.items" :key="item.title">
78
+ <h3>{{ item.title }}</h3>
79
+ <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>
130
+ </a>
131
+ </div>
132
+ </section>
133
+ </main>
134
+ </template>
@@ -0,0 +1,180 @@
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);
6
+
7
+ max-width: 1180px;
8
+ padding: 32px 24px 96px;
9
+ margin: 0 auto;
10
+ color: var(--vp-c-text-1);
11
+ }
12
+
13
+ .repoctl-home h1,
14
+ .repoctl-home h2,
15
+ .repoctl-home h3,
16
+ .repoctl-home p,
17
+ .repoctl-home figure,
18
+ .repoctl-home pre {
19
+ margin: 0;
20
+ }
21
+
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));
28
+ }
29
+
30
+ .repoctl-home__eyebrow {
31
+ margin-bottom: 14px !important;
32
+ font-size: 12px;
33
+ font-weight: 700;
34
+ color: var(--home-accent);
35
+ letter-spacing: 0;
36
+ }
37
+
38
+ .dark .repoctl-home__eyebrow {
39
+ color: var(--home-accent-dark);
40
+ }
41
+
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;
47
+ }
48
+
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);
55
+ }
56
+
57
+ .repoctl-home__lede {
58
+ max-width: 38rem;
59
+ margin-top: 22px !important;
60
+ font-size: 17px;
61
+ }
62
+
63
+ .repoctl-home__actions {
64
+ display: flex;
65
+ flex-wrap: wrap;
66
+ gap: 12px;
67
+ margin-top: 28px;
68
+ }
69
+
70
+ .repoctl-home__button {
71
+ display: inline-flex;
72
+ align-items: center;
73
+ justify-content: center;
74
+ min-height: 42px;
75
+ padding: 0 17px;
76
+ font-size: 14px;
77
+ font-weight: 650;
78
+ color: var(--vp-c-text-1) !important;
79
+ text-decoration: none !important;
80
+ border: 1px solid var(--home-border);
81
+ border-radius: 6px;
82
+ transition:
83
+ transform 180ms ease,
84
+ border-color 180ms ease,
85
+ background-color 180ms ease;
86
+ }
87
+
88
+ .repoctl-home__button:hover {
89
+ border-color: var(--home-accent);
90
+ transform: translateY(-1px);
91
+ }
92
+
93
+ .repoctl-home__button:active {
94
+ transform: translateY(0);
95
+ }
96
+
97
+ .repoctl-home__button--primary {
98
+ color: #fff !important;
99
+ background: var(--home-accent);
100
+ border-color: var(--home-accent);
101
+ }
102
+
103
+ .repoctl-home__capture {
104
+ 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%);
109
+ }
110
+
111
+ .repoctl-home__capture img {
112
+ display: block;
113
+ width: 100%;
114
+ height: auto;
115
+ }
116
+
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
+ .repoctl-home__section {
130
+ padding-top: 96px;
131
+ }
132
+
133
+ .repoctl-home__section-heading {
134
+ max-width: 680px;
135
+ margin-bottom: 32px;
136
+ }
137
+
138
+ .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;
143
+ }
144
+
145
+ .repoctl-home__section-heading > p,
146
+ .repoctl-home__automation p {
147
+ margin-top: 12px !important;
148
+ }
149
+
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;
156
+ }
157
+
158
+ .repoctl-home__lifecycle li {
159
+ min-height: 184px;
160
+ padding: 18px;
161
+ border: 1px solid var(--home-border);
162
+ border-radius: 6px;
163
+ }
164
+
165
+ .repoctl-home code {
166
+ font-size: 0.86em;
167
+ }
168
+
169
+ .repoctl-home__lifecycle h3,
170
+ .repoctl-home__capability-grid h3 {
171
+ margin-top: 22px;
172
+ font-size: 17px;
173
+ }
174
+
175
+ .repoctl-home__lifecycle p {
176
+ margin-top: 8px !important;
177
+ font-size: 14px;
178
+ line-height: 1.6;
179
+ color: var(--home-muted);
180
+ }
@@ -0,0 +1,3 @@
1
+ @import './foundation.css';
2
+ @import './sections.css';
3
+ @import './responsive.css';
@@ -0,0 +1,49 @@
1
+ @media (max-width: 900px) {
2
+ .repoctl-home__hero,
3
+ .repoctl-home__quickstart {
4
+ grid-template-columns: 1fr;
5
+ min-height: auto;
6
+ padding-top: 42px;
7
+ }
8
+
9
+ .repoctl-home__quickstart .repoctl-home__button {
10
+ grid-column: auto;
11
+ }
12
+
13
+ .repoctl-home__lifecycle ol {
14
+ grid-template-columns: repeat(2, 1fr);
15
+ }
16
+ }
17
+
18
+ @media (max-width: 640px) {
19
+ .repoctl-home {
20
+ padding: 16px 20px 68px;
21
+ }
22
+
23
+ .repoctl-home__hero h1 {
24
+ font-size: 42px;
25
+ }
26
+
27
+ .repoctl-home__section {
28
+ padding-top: 64px;
29
+ }
30
+
31
+ .repoctl-home__lifecycle ol,
32
+ .repoctl-home__path-grid,
33
+ .repoctl-home__automation,
34
+ .repoctl-home__commands dl,
35
+ .repoctl-home__docs > div,
36
+ .repoctl-home__capability-grid {
37
+ grid-template-columns: 1fr;
38
+ }
39
+
40
+ .repoctl-home__automation {
41
+ padding: 24px;
42
+ }
43
+ }
44
+
45
+ @media (prefers-reduced-motion: reduce) {
46
+ .repoctl-home__button {
47
+ transition: none;
48
+ }
49
+ }