@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.
- package/assets/.github/workflows/ci.yml +4 -4
- package/assets/.github/workflows/release.yml +10 -7
- package/assets/package.json +2 -1
- package/assets/pnpm-workspace.yaml +2 -9
- package/assets/renovate.json +0 -1
- package/assets-data.mjs +0 -1
- package/dist/cli.mjs +1 -1
- package/dist/index.mjs +1 -1
- package/dist/{prepare-CNCmvco-.mjs → prepare-D7eJqEqy.mjs} +21 -2
- package/package.json +5 -3
- package/templates/cli/package.json +1 -1
- package/templates/client/package.json +1 -1
- package/templates/server/package.json +1 -1
- package/templates/tsdown/package.json +1 -1
- package/templates/vitepress/.vitepress/config.ts +9 -119
- package/templates/vitepress/.vitepress/env.d.ts +1 -0
- package/templates/vitepress/.vitepress/home/content.ts +186 -0
- package/templates/vitepress/.vitepress/home/types.ts +65 -0
- package/templates/vitepress/.vitepress/navigation/routes.ts +138 -0
- package/templates/vitepress/.vitepress/seo.ts +40 -0
- package/templates/vitepress/.vitepress/theme/components/HomePage.vue +134 -0
- package/templates/vitepress/.vitepress/theme/home/foundation.css +180 -0
- package/templates/vitepress/.vitepress/theme/home/index.css +3 -0
- package/templates/vitepress/.vitepress/theme/home/responsive.css +49 -0
- package/templates/vitepress/.vitepress/theme/home/sections.css +153 -0
- package/templates/vitepress/.vitepress/theme/index.ts +9 -1
- package/templates/vitepress/ai/llms-txt.md +2 -2
- package/templates/vitepress/index.md +6 -60
- package/templates/vitepress/package.json +11 -4
- package/templates/vitepress/public/repoctl-doctor.png +0 -0
- package/templates/vitepress/repoctl/workflows.md +35 -0
- package/templates/vitepress/scripts/check-locales.ts +162 -0
- package/templates/vitepress/thinking.md +15 -0
- package/templates/vitepress/tools/changeset.md +17 -12
- package/templates/vitepress/tools/husky.md +41 -3
- package/templates/vitepress/tools/lint-staged.md +32 -5
- package/templates/vitepress/tools/pnpm.md +39 -7
- package/templates/vitepress/tools/renovate.md +27 -3
- package/templates/vitepress/tools/turborepo.md +33 -7
- package/templates/vitepress/tsconfig.json +7 -0
- package/templates/vitepress/why/examples/2.npm-basic-package/README.md +1 -1
- package/templates/vitepress/why/examples/3.npm-basic-package/README.md +1 -1
- package/templates/vitepress/why/how-to-reuse-js-code.md +36 -6
- package/templates/vitepress/why/js-cjs-mjs.md +31 -9
- package/templates/vitepress/why/js-keywords.md +33 -4
- package/templates/vitepress/why/modern/bundlers.md +37 -2
- package/templates/vitepress/why/modern/dts.md +44 -3
- package/templates/vitepress/why/modern/esm-vs-cjs.md +38 -3
- package/templates/vitepress/why/modern/index.md +33 -9
- package/templates/vitepress/why/modern/package-entry-points.md +33 -4
- package/templates/vitepress/why/modern/typescript.md +40 -4
- package/templates/vitepress/why/publish-basic-npm-package.md +37 -13
- package/templates/vitepress/why/what-is-npm-package.md +32 -3
- package/templates/vitepress/wrangler.jsonc +20 -3
- package/templates/vitepress/zh/ai/index.md +1 -1
- package/templates/vitepress/zh/ai/llms-txt.md +1 -1
- package/templates/vitepress/zh/index.md +6 -63
- package/templates/vitepress/zh/repoctl/workflows.md +35 -0
- package/templates/vitepress/zh/thinking.md +9 -6
- package/templates/vitepress/zh/why/examples/2.npm-basic-package/README.md +1 -1
- package/templates/vitepress/zh/why/examples/3.npm-basic-package/README.md +1 -1
- package/templates/vitepress/zh/why/index.md +38 -1
- package/templates/vue-lib/package.json +1 -1
- package/assets/.changeset/ledger.yaml +0 -51
- 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,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
|
+
}
|