@beforesemicolon/builder 1.8.24 → 2.0.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/README.md +40 -915
- package/dist/cjs/build-modules.js +1 -1
- package/dist/cjs/index.js +1 -1
- package/dist/esm/build-modules.js +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/types/build-modules.d.ts +2 -21
- package/dist/types/index.d.ts +0 -1
- package/package.json +5 -25
- package/dist/cjs/.declarations.d.js +0 -1
- package/dist/cjs/docs/markdown-layout/index.js +0 -1
- package/dist/cjs/docs/markdown-layout/marked-extension.js +0 -1
- package/dist/cjs/docs/markdown-layout/parser.js +0 -7
- package/dist/cjs/docs/markdown-layout/renderer.js +0 -1
- package/dist/cjs/docs/markdown-layout/types.js +0 -1
- package/dist/cjs/docs/renderer/code.js +0 -11
- package/dist/cjs/docs/renderer/heading.js +0 -1
- package/dist/cjs/docs/renderer/index.js +0 -1
- package/dist/cjs/docs/renderer/link.js +0 -1
- package/dist/cjs/docs/run.js +0 -78
- package/dist/cjs/docs/templates/default.template.js +0 -17
- package/dist/cjs/docs/templates/fading-citrus/README.md +0 -822
- package/dist/cjs/docs/templates/fading-citrus/assets/facebook.svg +0 -8
- package/dist/cjs/docs/templates/fading-citrus/assets/favicon/android-chrome-192x192.png +0 -0
- package/dist/cjs/docs/templates/fading-citrus/assets/favicon/android-chrome-512x512.png +0 -0
- package/dist/cjs/docs/templates/fading-citrus/assets/favicon/apple-touch-icon.png +0 -0
- package/dist/cjs/docs/templates/fading-citrus/assets/favicon/favicon-16x16.png +0 -0
- package/dist/cjs/docs/templates/fading-citrus/assets/favicon/favicon-32x32.png +0 -0
- package/dist/cjs/docs/templates/fading-citrus/assets/favicon/favicon.ico +0 -0
- package/dist/cjs/docs/templates/fading-citrus/assets/favicon/site.webmanifest +0 -19
- package/dist/cjs/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-Black.otf +0 -0
- package/dist/cjs/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-BlackItalic.otf +0 -0
- package/dist/cjs/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-Bold.otf +0 -0
- package/dist/cjs/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-BoldItalic.otf +0 -0
- package/dist/cjs/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-ExtraBold.otf +0 -0
- package/dist/cjs/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-ExtraBoldItalic.otf +0 -0
- package/dist/cjs/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-ExtraLight.otf +0 -0
- package/dist/cjs/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-ExtraLightItalic.otf +0 -0
- package/dist/cjs/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-Italic.otf +0 -0
- package/dist/cjs/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-Light.otf +0 -0
- package/dist/cjs/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-LightItalic.otf +0 -0
- package/dist/cjs/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-Medium.otf +0 -0
- package/dist/cjs/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-MediumItalic.otf +0 -0
- package/dist/cjs/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-Regular.otf +0 -0
- package/dist/cjs/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-SemiBold.otf +0 -0
- package/dist/cjs/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-SemiBoldItalic.otf +0 -0
- package/dist/cjs/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-Thin.otf +0 -0
- package/dist/cjs/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-ThinItalic.otf +0 -0
- package/dist/cjs/docs/templates/fading-citrus/assets/fonts/exo-2/SIL Open Font License.txt +0 -43
- package/dist/cjs/docs/templates/fading-citrus/assets/fonts/open-sans/Apache License.txt +0 -201
- package/dist/cjs/docs/templates/fading-citrus/assets/fonts/open-sans/OpenSans-Bold.ttf +0 -0
- package/dist/cjs/docs/templates/fading-citrus/assets/fonts/open-sans/OpenSans-BoldItalic.ttf +0 -0
- package/dist/cjs/docs/templates/fading-citrus/assets/fonts/open-sans/OpenSans-ExtraBold.ttf +0 -0
- package/dist/cjs/docs/templates/fading-citrus/assets/fonts/open-sans/OpenSans-ExtraBoldItalic.ttf +0 -0
- package/dist/cjs/docs/templates/fading-citrus/assets/fonts/open-sans/OpenSans-Italic.ttf +0 -0
- package/dist/cjs/docs/templates/fading-citrus/assets/fonts/open-sans/OpenSans-Light.ttf +0 -0
- package/dist/cjs/docs/templates/fading-citrus/assets/fonts/open-sans/OpenSans-LightItalic.ttf +0 -0
- package/dist/cjs/docs/templates/fading-citrus/assets/fonts/open-sans/OpenSans-Regular.ttf +0 -0
- package/dist/cjs/docs/templates/fading-citrus/assets/fonts/open-sans/OpenSans-Semibold.ttf +0 -0
- package/dist/cjs/docs/templates/fading-citrus/assets/fonts/open-sans/OpenSans-SemiboldItalic.ttf +0 -0
- package/dist/cjs/docs/templates/fading-citrus/assets/instagram.svg +0 -28
- package/dist/cjs/docs/templates/fading-citrus/assets/logo.dark.svg +0 -8
- package/dist/cjs/docs/templates/fading-citrus/assets/logo.light.svg +0 -8
- package/dist/cjs/docs/templates/fading-citrus/assets/logo.svg +0 -8
- package/dist/cjs/docs/templates/fading-citrus/assets/medium2.svg +0 -18
- package/dist/cjs/docs/templates/fading-citrus/assets/reddit.svg +0 -16
- package/dist/cjs/docs/templates/fading-citrus/assets/twitter.svg +0 -11
- package/dist/cjs/docs/templates/fading-citrus/assets/youtube.svg +0 -10
- package/dist/cjs/docs/templates/fading-citrus/layouts/_code-snippet.js +0 -128
- package/dist/cjs/docs/templates/fading-citrus/layouts/_footer.js +0 -72
- package/dist/cjs/docs/templates/fading-citrus/layouts/_head-meta.js +0 -235
- package/dist/cjs/docs/templates/fading-citrus/layouts/_header.js +0 -91
- package/dist/cjs/docs/templates/fading-citrus/layouts/_layout-utils.js +0 -109
- package/dist/cjs/docs/templates/fading-citrus/layouts/document.js +0 -100
- package/dist/cjs/docs/templates/fading-citrus/layouts/landing-cta.js +0 -30
- package/dist/cjs/docs/templates/fading-citrus/layouts/landing-ecosystem.js +0 -51
- package/dist/cjs/docs/templates/fading-citrus/layouts/landing-features.js +0 -25
- package/dist/cjs/docs/templates/fading-citrus/layouts/landing-hero.js +0 -89
- package/dist/cjs/docs/templates/fading-citrus/layouts/landing-install.js +0 -116
- package/dist/cjs/docs/templates/fading-citrus/layouts/landing-showcase.js +0 -133
- package/dist/cjs/docs/templates/fading-citrus/layouts/landing.js +0 -29
- package/dist/cjs/docs/templates/fading-citrus/stylesheets/common.css +0 -900
- package/dist/cjs/docs/templates/fading-citrus/stylesheets/documentation.css +0 -562
- package/dist/cjs/docs/templates/fading-citrus/stylesheets/fonts.css +0 -1
- package/dist/cjs/docs/templates/fading-citrus/stylesheets/github-dark.hightlighter.css +0 -107
- package/dist/cjs/docs/templates/fading-citrus/stylesheets/github-light.hightlighter.css +0 -107
- package/dist/cjs/docs/templates/fading-citrus/stylesheets/hybrid.hightlighter.css +0 -102
- package/dist/cjs/docs/templates/fading-citrus/stylesheets/landing.css +0 -1563
- package/dist/cjs/docs/templates/fading-citrus/stylesheets/normalize.css +0 -351
- package/dist/cjs/docs/templates/fading-citrus/template.config.js +0 -233
- package/dist/cjs/docs/types.js +0 -1
- package/dist/esm/.declarations.d.js +0 -0
- package/dist/esm/docs/markdown-layout/index.js +0 -1
- package/dist/esm/docs/markdown-layout/marked-extension.js +0 -1
- package/dist/esm/docs/markdown-layout/parser.js +0 -7
- package/dist/esm/docs/markdown-layout/renderer.js +0 -1
- package/dist/esm/docs/markdown-layout/types.js +0 -0
- package/dist/esm/docs/renderer/code.js +0 -11
- package/dist/esm/docs/renderer/heading.js +0 -1
- package/dist/esm/docs/renderer/index.js +0 -1
- package/dist/esm/docs/renderer/link.js +0 -1
- package/dist/esm/docs/run.js +0 -78
- package/dist/esm/docs/templates/default.template.js +0 -17
- package/dist/esm/docs/templates/fading-citrus/README.md +0 -822
- package/dist/esm/docs/templates/fading-citrus/assets/facebook.svg +0 -8
- package/dist/esm/docs/templates/fading-citrus/assets/favicon/android-chrome-192x192.png +0 -0
- package/dist/esm/docs/templates/fading-citrus/assets/favicon/android-chrome-512x512.png +0 -0
- package/dist/esm/docs/templates/fading-citrus/assets/favicon/apple-touch-icon.png +0 -0
- package/dist/esm/docs/templates/fading-citrus/assets/favicon/favicon-16x16.png +0 -0
- package/dist/esm/docs/templates/fading-citrus/assets/favicon/favicon-32x32.png +0 -0
- package/dist/esm/docs/templates/fading-citrus/assets/favicon/favicon.ico +0 -0
- package/dist/esm/docs/templates/fading-citrus/assets/favicon/site.webmanifest +0 -19
- package/dist/esm/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-Black.otf +0 -0
- package/dist/esm/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-BlackItalic.otf +0 -0
- package/dist/esm/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-Bold.otf +0 -0
- package/dist/esm/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-BoldItalic.otf +0 -0
- package/dist/esm/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-ExtraBold.otf +0 -0
- package/dist/esm/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-ExtraBoldItalic.otf +0 -0
- package/dist/esm/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-ExtraLight.otf +0 -0
- package/dist/esm/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-ExtraLightItalic.otf +0 -0
- package/dist/esm/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-Italic.otf +0 -0
- package/dist/esm/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-Light.otf +0 -0
- package/dist/esm/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-LightItalic.otf +0 -0
- package/dist/esm/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-Medium.otf +0 -0
- package/dist/esm/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-MediumItalic.otf +0 -0
- package/dist/esm/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-Regular.otf +0 -0
- package/dist/esm/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-SemiBold.otf +0 -0
- package/dist/esm/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-SemiBoldItalic.otf +0 -0
- package/dist/esm/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-Thin.otf +0 -0
- package/dist/esm/docs/templates/fading-citrus/assets/fonts/exo-2/Exo2.0-ThinItalic.otf +0 -0
- package/dist/esm/docs/templates/fading-citrus/assets/fonts/exo-2/SIL Open Font License.txt +0 -43
- package/dist/esm/docs/templates/fading-citrus/assets/fonts/open-sans/Apache License.txt +0 -201
- package/dist/esm/docs/templates/fading-citrus/assets/fonts/open-sans/OpenSans-Bold.ttf +0 -0
- package/dist/esm/docs/templates/fading-citrus/assets/fonts/open-sans/OpenSans-BoldItalic.ttf +0 -0
- package/dist/esm/docs/templates/fading-citrus/assets/fonts/open-sans/OpenSans-ExtraBold.ttf +0 -0
- package/dist/esm/docs/templates/fading-citrus/assets/fonts/open-sans/OpenSans-ExtraBoldItalic.ttf +0 -0
- package/dist/esm/docs/templates/fading-citrus/assets/fonts/open-sans/OpenSans-Italic.ttf +0 -0
- package/dist/esm/docs/templates/fading-citrus/assets/fonts/open-sans/OpenSans-Light.ttf +0 -0
- package/dist/esm/docs/templates/fading-citrus/assets/fonts/open-sans/OpenSans-LightItalic.ttf +0 -0
- package/dist/esm/docs/templates/fading-citrus/assets/fonts/open-sans/OpenSans-Regular.ttf +0 -0
- package/dist/esm/docs/templates/fading-citrus/assets/fonts/open-sans/OpenSans-Semibold.ttf +0 -0
- package/dist/esm/docs/templates/fading-citrus/assets/fonts/open-sans/OpenSans-SemiboldItalic.ttf +0 -0
- package/dist/esm/docs/templates/fading-citrus/assets/instagram.svg +0 -28
- package/dist/esm/docs/templates/fading-citrus/assets/logo.dark.svg +0 -8
- package/dist/esm/docs/templates/fading-citrus/assets/logo.light.svg +0 -8
- package/dist/esm/docs/templates/fading-citrus/assets/logo.svg +0 -8
- package/dist/esm/docs/templates/fading-citrus/assets/medium2.svg +0 -18
- package/dist/esm/docs/templates/fading-citrus/assets/reddit.svg +0 -16
- package/dist/esm/docs/templates/fading-citrus/assets/twitter.svg +0 -11
- package/dist/esm/docs/templates/fading-citrus/assets/youtube.svg +0 -10
- package/dist/esm/docs/templates/fading-citrus/layouts/_code-snippet.js +0 -128
- package/dist/esm/docs/templates/fading-citrus/layouts/_footer.js +0 -72
- package/dist/esm/docs/templates/fading-citrus/layouts/_head-meta.js +0 -235
- package/dist/esm/docs/templates/fading-citrus/layouts/_header.js +0 -91
- package/dist/esm/docs/templates/fading-citrus/layouts/_layout-utils.js +0 -109
- package/dist/esm/docs/templates/fading-citrus/layouts/document.js +0 -100
- package/dist/esm/docs/templates/fading-citrus/layouts/landing-cta.js +0 -30
- package/dist/esm/docs/templates/fading-citrus/layouts/landing-ecosystem.js +0 -51
- package/dist/esm/docs/templates/fading-citrus/layouts/landing-features.js +0 -25
- package/dist/esm/docs/templates/fading-citrus/layouts/landing-hero.js +0 -89
- package/dist/esm/docs/templates/fading-citrus/layouts/landing-install.js +0 -116
- package/dist/esm/docs/templates/fading-citrus/layouts/landing-showcase.js +0 -133
- package/dist/esm/docs/templates/fading-citrus/layouts/landing.js +0 -29
- package/dist/esm/docs/templates/fading-citrus/stylesheets/common.css +0 -900
- package/dist/esm/docs/templates/fading-citrus/stylesheets/documentation.css +0 -562
- package/dist/esm/docs/templates/fading-citrus/stylesheets/fonts.css +0 -1
- package/dist/esm/docs/templates/fading-citrus/stylesheets/github-dark.hightlighter.css +0 -107
- package/dist/esm/docs/templates/fading-citrus/stylesheets/github-light.hightlighter.css +0 -107
- package/dist/esm/docs/templates/fading-citrus/stylesheets/hybrid.hightlighter.css +0 -102
- package/dist/esm/docs/templates/fading-citrus/stylesheets/landing.css +0 -1563
- package/dist/esm/docs/templates/fading-citrus/stylesheets/normalize.css +0 -351
- package/dist/esm/docs/templates/fading-citrus/template.config.js +0 -233
- package/dist/esm/docs/types.js +0 -0
- package/dist/types/docs/markdown-layout/index.d.ts +0 -4
- package/dist/types/docs/markdown-layout/marked-extension.d.ts +0 -9
- package/dist/types/docs/markdown-layout/parser.d.ts +0 -12
- package/dist/types/docs/markdown-layout/renderer.d.ts +0 -3
- package/dist/types/docs/markdown-layout/types.d.ts +0 -36
- package/dist/types/docs/renderer/code.d.ts +0 -2
- package/dist/types/docs/renderer/heading.d.ts +0 -2
- package/dist/types/docs/renderer/index.d.ts +0 -3
- package/dist/types/docs/renderer/link.d.ts +0 -2
- package/dist/types/docs/run.d.ts +0 -19
- package/dist/types/docs/templates/default.template.d.ts +0 -3
- package/dist/types/docs/types.d.ts +0 -107
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
groupedSectionHeader,
|
|
3
|
-
icon,
|
|
4
|
-
option,
|
|
5
|
-
partByName,
|
|
6
|
-
} from './_layout-utils.js'
|
|
7
|
-
|
|
8
|
-
const tone = (value) =>
|
|
9
|
-
({
|
|
10
|
-
orange: 'primary',
|
|
11
|
-
cyan: 'accent',
|
|
12
|
-
})[value] ||
|
|
13
|
-
value ||
|
|
14
|
-
'primary'
|
|
15
|
-
|
|
16
|
-
export default ({ parts }) => {
|
|
17
|
-
const header = partByName(parts, 'header') || parts[0]
|
|
18
|
-
const cards = parts.filter((part) => part.name === 'product')
|
|
19
|
-
|
|
20
|
-
return `
|
|
21
|
-
<section class="products-section wrapper">
|
|
22
|
-
<div class="section-header">${groupedSectionHeader(header?.html || '')}</div>
|
|
23
|
-
<div class="products-grid">
|
|
24
|
-
${cards
|
|
25
|
-
.map(
|
|
26
|
-
(card) => `
|
|
27
|
-
<div class="product-card card-${tone(option(card.options.color, 'primary'))}">
|
|
28
|
-
<div class="product-glow"></div>
|
|
29
|
-
<a href="${option(card.options.href, '#')}" target="_blank" rel="noreferrer" class="product-head">
|
|
30
|
-
<div class="product-title-row">
|
|
31
|
-
<div class="icon-container">${icon(option(card.options.icon, 'webComponents'))}</div>
|
|
32
|
-
<div>
|
|
33
|
-
<h3>${option(card.options.title, card.name || '')}</h3>
|
|
34
|
-
<span class="package-name font-mono">${option(card.options.package, '')}</span>
|
|
35
|
-
</div>
|
|
36
|
-
</div>
|
|
37
|
-
<span class="product-arrow">${icon('arrowUpRight')}</span>
|
|
38
|
-
</a>
|
|
39
|
-
${card.html}
|
|
40
|
-
<a href="${option(card.options.href, '#')}" target="_blank" rel="noreferrer" class="product-link">
|
|
41
|
-
<span>Read the docs</span>
|
|
42
|
-
${icon('arrowUpRight')}
|
|
43
|
-
</a>
|
|
44
|
-
</div>
|
|
45
|
-
`
|
|
46
|
-
)
|
|
47
|
-
.join('')}
|
|
48
|
-
</div>
|
|
49
|
-
</section>
|
|
50
|
-
`
|
|
51
|
-
}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { icon, option, partByName, sectionHeader } from './_layout-utils.js'
|
|
2
|
-
|
|
3
|
-
export default ({ parts }) => {
|
|
4
|
-
const header = partByName(parts, 'header') || parts[0]
|
|
5
|
-
const features = parts.filter((part) => part.name === 'feature')
|
|
6
|
-
|
|
7
|
-
return `
|
|
8
|
-
<section id="features" class="features-section wrapper">
|
|
9
|
-
<div class="section-header">${sectionHeader(header?.html || '')}</div>
|
|
10
|
-
<div class="features-grid">
|
|
11
|
-
${features
|
|
12
|
-
.map(
|
|
13
|
-
(feature) => `
|
|
14
|
-
<div class="feature-card">
|
|
15
|
-
<div class="feature-border"></div>
|
|
16
|
-
<div class="icon-box">${icon(option(feature.options.icon, 'reactive'))}</div>
|
|
17
|
-
${feature.html}
|
|
18
|
-
</div>
|
|
19
|
-
`
|
|
20
|
-
)
|
|
21
|
-
.join('')}
|
|
22
|
-
</div>
|
|
23
|
-
</section>
|
|
24
|
-
`
|
|
25
|
-
}
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
import { renderCodeBlock } from './_code-snippet.js'
|
|
2
|
-
import {
|
|
3
|
-
codeFromPart,
|
|
4
|
-
escapeAttribute,
|
|
5
|
-
icon,
|
|
6
|
-
option,
|
|
7
|
-
partByName,
|
|
8
|
-
siteConfig,
|
|
9
|
-
statContent,
|
|
10
|
-
withFirstParagraphClass,
|
|
11
|
-
} from './_layout-utils.js'
|
|
12
|
-
|
|
13
|
-
export default ({ parts, options }, context = {}) => {
|
|
14
|
-
const site = siteConfig(context)
|
|
15
|
-
const copy = partByName(parts, 'copy') || parts[0]
|
|
16
|
-
const code = partByName(parts, 'code') || parts[1]
|
|
17
|
-
const stats = parts.filter((part) => part.name === 'stat')
|
|
18
|
-
const version = option(options.version)
|
|
19
|
-
const title = option(options.title, '')
|
|
20
|
-
const title2 = option(options.title2, '')
|
|
21
|
-
const primaryHref = option(
|
|
22
|
-
options.primaryHref,
|
|
23
|
-
'/documentation/get-started'
|
|
24
|
-
)
|
|
25
|
-
const primaryLabel = option(options.primaryLabel, 'Get Started')
|
|
26
|
-
const secondaryLabel = option(
|
|
27
|
-
options.secondaryLabel,
|
|
28
|
-
site.landingHeroSecondaryLabel ||
|
|
29
|
-
(site.packageName ? `npm i ${site.packageName}` : 'Install')
|
|
30
|
-
)
|
|
31
|
-
const versionHref =
|
|
32
|
-
option(options.versionHref) ||
|
|
33
|
-
site.landingHeroVersionHref ||
|
|
34
|
-
site.repositoryUrl
|
|
35
|
-
|
|
36
|
-
return `
|
|
37
|
-
<section class="hero-section relative overflow-hidden">
|
|
38
|
-
<div class="absolute inset-0 bg-grid pointer-events-none"></div>
|
|
39
|
-
<div class="absolute inset-0 hero-glow pointer-events-none animate-pulse-glow"></div>
|
|
40
|
-
<div class="wrapper hero-container animate-float-up">
|
|
41
|
-
<div class="hero-content">
|
|
42
|
-
${
|
|
43
|
-
version
|
|
44
|
-
? `<a href="${escapeAttribute(versionHref || '#')}"${versionHref ? ' target="_blank" rel="noopener"' : ''} class="version-badge">
|
|
45
|
-
${icon('sparkles')}
|
|
46
|
-
<span>${version}</span>
|
|
47
|
-
${icon('arrowRight')}
|
|
48
|
-
</a>`
|
|
49
|
-
: ''
|
|
50
|
-
}
|
|
51
|
-
<h1 class="hero-title">
|
|
52
|
-
<span class="text-gradient">${title}</span><br/>
|
|
53
|
-
<span class="text-gradient-primary">${title2}</span>
|
|
54
|
-
</h1>
|
|
55
|
-
${withFirstParagraphClass(copy?.html || '', 'hero-subtitle')}
|
|
56
|
-
<div class="hero-actions">
|
|
57
|
-
<a href="${primaryHref}" class="btn-primary">
|
|
58
|
-
<span>${primaryLabel}</span>
|
|
59
|
-
${icon('arrowRight')}
|
|
60
|
-
</a>
|
|
61
|
-
<a href="#install" class="btn-secondary font-mono">${secondaryLabel}</a>
|
|
62
|
-
</div>
|
|
63
|
-
${
|
|
64
|
-
stats.length
|
|
65
|
-
? `<div class="hero-stats">${stats
|
|
66
|
-
.map(
|
|
67
|
-
(stat, index) => `
|
|
68
|
-
${index ? '<div class="stat-divider"></div>' : ''}
|
|
69
|
-
<div class="stat-item">${statContent(stat.html)}</div>
|
|
70
|
-
`
|
|
71
|
-
)
|
|
72
|
-
.join('')}</div>`
|
|
73
|
-
: ''
|
|
74
|
-
}
|
|
75
|
-
</div>
|
|
76
|
-
${
|
|
77
|
-
code
|
|
78
|
-
? `<div class="hero-code-panel">
|
|
79
|
-
<div class="glow-container">
|
|
80
|
-
<div class="absolute inset-0 bg-gradient-to-br from-primary/20 to-accent/20 blur-3xl rounded-full"></div>
|
|
81
|
-
</div>
|
|
82
|
-
${renderCodeBlock(option(code.options.filename, ''), codeFromPart(code), option(code.options.lang, 'javascript'))}
|
|
83
|
-
</div>`
|
|
84
|
-
: ''
|
|
85
|
-
}
|
|
86
|
-
</div>
|
|
87
|
-
</section>
|
|
88
|
-
`
|
|
89
|
-
}
|
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
escapeHTML,
|
|
3
|
-
icon,
|
|
4
|
-
option,
|
|
5
|
-
optionText,
|
|
6
|
-
partByName,
|
|
7
|
-
sectionHeader,
|
|
8
|
-
} from './_layout-utils.js'
|
|
9
|
-
|
|
10
|
-
export const renderInstallScript = () => `
|
|
11
|
-
<script type="application/javascript">
|
|
12
|
-
(() => {
|
|
13
|
-
if (window.__fadingCitrusInstallReady) return
|
|
14
|
-
window.__fadingCitrusInstallReady = true
|
|
15
|
-
|
|
16
|
-
document.querySelectorAll('[data-fading-citrus-install]').forEach((install) => {
|
|
17
|
-
const tabTriggers = install.querySelectorAll('.tab-trigger')
|
|
18
|
-
const tabContents = install.querySelectorAll('.tab-content')
|
|
19
|
-
const copyButtons = install.querySelectorAll('.install-copy-btn')
|
|
20
|
-
|
|
21
|
-
tabTriggers.forEach((trigger) => {
|
|
22
|
-
trigger.addEventListener('click', () => {
|
|
23
|
-
const targetTab = trigger.getAttribute('data-tab')
|
|
24
|
-
|
|
25
|
-
tabTriggers.forEach((tab) => {
|
|
26
|
-
tab.classList.remove('active')
|
|
27
|
-
tab.setAttribute('aria-selected', 'false')
|
|
28
|
-
})
|
|
29
|
-
tabContents.forEach((content) => content.classList.remove('active'))
|
|
30
|
-
|
|
31
|
-
trigger.classList.add('active')
|
|
32
|
-
trigger.setAttribute('aria-selected', 'true')
|
|
33
|
-
|
|
34
|
-
const activeContent = install.querySelector('#tab-' + targetTab)
|
|
35
|
-
if (activeContent) activeContent.classList.add('active')
|
|
36
|
-
})
|
|
37
|
-
})
|
|
38
|
-
|
|
39
|
-
copyButtons.forEach((button) => {
|
|
40
|
-
const originalLabel = button.getAttribute('aria-label') || ''
|
|
41
|
-
|
|
42
|
-
button.addEventListener('click', async () => {
|
|
43
|
-
const row = button.closest('.install-code-row')
|
|
44
|
-
const value = row ? row.getAttribute('data-code') : ''
|
|
45
|
-
|
|
46
|
-
try {
|
|
47
|
-
await navigator.clipboard.writeText(value)
|
|
48
|
-
button.classList.add('copied')
|
|
49
|
-
button.querySelector('span').textContent = 'Copied'
|
|
50
|
-
button.setAttribute('aria-label', 'Command copied')
|
|
51
|
-
setTimeout(() => {
|
|
52
|
-
button.classList.remove('copied')
|
|
53
|
-
button.querySelector('span').textContent = 'Copy'
|
|
54
|
-
button.setAttribute('aria-label', originalLabel)
|
|
55
|
-
}, 1500)
|
|
56
|
-
} catch {}
|
|
57
|
-
})
|
|
58
|
-
})
|
|
59
|
-
})
|
|
60
|
-
})()
|
|
61
|
-
</script>
|
|
62
|
-
`
|
|
63
|
-
|
|
64
|
-
export default ({ parts }) => {
|
|
65
|
-
const header = partByName(parts, 'header') || parts[0]
|
|
66
|
-
const tabs = parts.filter((part) => part.name === 'tab')
|
|
67
|
-
|
|
68
|
-
return `
|
|
69
|
-
<section id="install" class="install-section wrapper" data-fading-citrus-install>
|
|
70
|
-
<div class="install-container">
|
|
71
|
-
<div class="section-header center">${sectionHeader(header?.html || '')}</div>
|
|
72
|
-
<div class="tabs-container">
|
|
73
|
-
<div class="tabs-list" role="tablist" aria-label="Installation package manager">
|
|
74
|
-
${tabs
|
|
75
|
-
.map(
|
|
76
|
-
(tab, index) => `
|
|
77
|
-
<button class="tab-trigger${index === 1 ? ' active' : ''}" role="tab" aria-selected="${index === 1}" aria-controls="tab-${option(tab.options.key, tab.options.label)}" id="tab-trigger-${option(tab.options.key, tab.options.label)}" data-tab="${option(tab.options.key, tab.options.label)}">${option(tab.options.label, tab.options.key)}</button>
|
|
78
|
-
`
|
|
79
|
-
)
|
|
80
|
-
.join('')}
|
|
81
|
-
</div>
|
|
82
|
-
<div class="tabs-content-wrapper">
|
|
83
|
-
${tabs
|
|
84
|
-
.map((tab, index) => {
|
|
85
|
-
const key = option(
|
|
86
|
-
tab.options.key,
|
|
87
|
-
tab.options.label
|
|
88
|
-
)
|
|
89
|
-
const command = optionText(
|
|
90
|
-
tab.options.command,
|
|
91
|
-
tab.html.replace(/<[^>]+>/g, '').trim()
|
|
92
|
-
)
|
|
93
|
-
|
|
94
|
-
return `
|
|
95
|
-
<div class="tab-content${index === 1 ? ' active' : ''}" id="tab-${key}" role="tabpanel" tabindex="0" aria-labelledby="tab-trigger-${key}">
|
|
96
|
-
<div class="install-code-row" data-code="${escapeHTML(command)}">
|
|
97
|
-
<div class="install-command">
|
|
98
|
-
${icon('terminal')}
|
|
99
|
-
<code class="font-mono">${escapeHTML(command)}</code>
|
|
100
|
-
</div>
|
|
101
|
-
<button class="install-copy-btn" aria-label="Copy ${option(tab.options.label, key)} install command">
|
|
102
|
-
<svg aria-hidden="true" class="copy-icon" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="14" height="14" x="8" y="8" rx="2" ry="2"/><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"/></svg>
|
|
103
|
-
<svg aria-hidden="true" class="check-icon" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20 6 9 17l-5-5"/></svg>
|
|
104
|
-
<span>Copy</span>
|
|
105
|
-
</button>
|
|
106
|
-
</div>
|
|
107
|
-
</div>
|
|
108
|
-
`
|
|
109
|
-
})
|
|
110
|
-
.join('')}
|
|
111
|
-
</div>
|
|
112
|
-
</div>
|
|
113
|
-
</div>
|
|
114
|
-
</section>
|
|
115
|
-
`
|
|
116
|
-
}
|
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
import { renderCodeBlock } from './_code-snippet.js'
|
|
2
|
-
import {
|
|
3
|
-
codeFromPart,
|
|
4
|
-
icon,
|
|
5
|
-
option,
|
|
6
|
-
partByName,
|
|
7
|
-
sectionHeader,
|
|
8
|
-
} from './_layout-utils.js'
|
|
9
|
-
|
|
10
|
-
const previousIcon =
|
|
11
|
-
'<svg aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m12 19-7-7 7-7"/><path d="M19 12H5"/></svg>'
|
|
12
|
-
|
|
13
|
-
const tone = (value) =>
|
|
14
|
-
({
|
|
15
|
-
orange: 'primary',
|
|
16
|
-
cyan: 'accent',
|
|
17
|
-
})[value] ||
|
|
18
|
-
value ||
|
|
19
|
-
'accent'
|
|
20
|
-
|
|
21
|
-
export const renderShowcaseScript = () => `
|
|
22
|
-
<script type="application/javascript">
|
|
23
|
-
(() => {
|
|
24
|
-
if (window.__fadingCitrusShowcaseReady) return
|
|
25
|
-
window.__fadingCitrusShowcaseReady = true
|
|
26
|
-
|
|
27
|
-
document.querySelectorAll('[data-fading-citrus-showcase]').forEach((showcase) => {
|
|
28
|
-
const track = showcase.querySelector('.slider-track')
|
|
29
|
-
const originalSlides = Array.from(showcase.querySelectorAll('.slider-slide'))
|
|
30
|
-
const dots = showcase.querySelectorAll('.slider-dot')
|
|
31
|
-
const btnPrev = showcase.querySelector('[data-slider-prev]')
|
|
32
|
-
const btnNext = showcase.querySelector('[data-slider-next]')
|
|
33
|
-
const slideCount = originalSlides.length
|
|
34
|
-
let currentIndex = 1
|
|
35
|
-
|
|
36
|
-
if (!track || !btnPrev || !btnNext || slideCount < 1) return
|
|
37
|
-
|
|
38
|
-
if (slideCount > 1) {
|
|
39
|
-
const firstClone = originalSlides[0].cloneNode(true)
|
|
40
|
-
const lastClone = originalSlides[slideCount - 1].cloneNode(true)
|
|
41
|
-
firstClone.setAttribute('aria-hidden', 'true')
|
|
42
|
-
lastClone.setAttribute('aria-hidden', 'true')
|
|
43
|
-
track.insertBefore(lastClone, originalSlides[0])
|
|
44
|
-
track.appendChild(firstClone)
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
const slides = Array.from(showcase.querySelectorAll('.slider-slide'))
|
|
48
|
-
|
|
49
|
-
const setTrack = (index, animate = true) => {
|
|
50
|
-
const slide = slides[index]
|
|
51
|
-
const offset = slide ? slide.offsetLeft : 0
|
|
52
|
-
track.style.transition = animate
|
|
53
|
-
? 'transform 0.5s cubic-bezier(0.22, 1, 0.36, 1)'
|
|
54
|
-
: 'none'
|
|
55
|
-
track.style.transform = 'translateX(-' + offset + 'px)'
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
const updateDots = (index) => {
|
|
59
|
-
const logicalIndex = ((index % slideCount) + slideCount) % slideCount
|
|
60
|
-
dots.forEach((dot, idx) => dot.classList.toggle('active', idx === logicalIndex))
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
const updateSlider = (index, animate = true) => {
|
|
64
|
-
currentIndex = index
|
|
65
|
-
setTrack(currentIndex, animate)
|
|
66
|
-
updateDots(currentIndex - 1)
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
btnPrev.addEventListener('click', () => updateSlider(currentIndex - 1))
|
|
70
|
-
btnNext.addEventListener('click', () => updateSlider(currentIndex + 1))
|
|
71
|
-
track.addEventListener('transitionend', () => {
|
|
72
|
-
if (currentIndex === 0) {
|
|
73
|
-
currentIndex = slideCount
|
|
74
|
-
setTrack(currentIndex, false)
|
|
75
|
-
} else if (currentIndex === slideCount + 1) {
|
|
76
|
-
currentIndex = 1
|
|
77
|
-
setTrack(currentIndex, false)
|
|
78
|
-
}
|
|
79
|
-
})
|
|
80
|
-
dots.forEach((dot, idx) => dot.addEventListener('click', () => updateSlider(idx + 1)))
|
|
81
|
-
|
|
82
|
-
updateSlider(currentIndex, false)
|
|
83
|
-
window.addEventListener('resize', () => updateSlider(currentIndex, false))
|
|
84
|
-
})
|
|
85
|
-
})()
|
|
86
|
-
</script>
|
|
87
|
-
`
|
|
88
|
-
|
|
89
|
-
export default ({ parts }) => {
|
|
90
|
-
const header = partByName(parts, 'header') || parts[0]
|
|
91
|
-
const examples = parts.filter((part) => part.name === 'example')
|
|
92
|
-
|
|
93
|
-
return `
|
|
94
|
-
<section id="code" class="showcase-section relative overflow-hidden" data-fading-citrus-showcase>
|
|
95
|
-
<div class="absolute inset-0 showcase-glow pointer-events-none"></div>
|
|
96
|
-
<div class="wrapper relative">
|
|
97
|
-
<div class="showcase-header">
|
|
98
|
-
<div class="showcase-header-text">${sectionHeader(header?.html || '')}</div>
|
|
99
|
-
<div class="slider-controls">
|
|
100
|
-
<button id="slider-prev" data-slider-prev aria-label="Previous example" class="ctrl-btn btn-prev">${previousIcon}</button>
|
|
101
|
-
<button id="slider-next" data-slider-next aria-label="Next example" class="ctrl-btn btn-next">${icon('arrowRight')}</button>
|
|
102
|
-
</div>
|
|
103
|
-
</div>
|
|
104
|
-
<div class="slider-viewport">
|
|
105
|
-
<div class="slider-track">
|
|
106
|
-
${examples
|
|
107
|
-
.map(
|
|
108
|
-
(example, index) => `
|
|
109
|
-
<div class="slider-slide">
|
|
110
|
-
<div class="slide-meta">
|
|
111
|
-
<span class="slide-num font-mono">EXAMPLE ${String(index + 1).padStart(2, '0')}</span>
|
|
112
|
-
<div class="slide-line"></div>
|
|
113
|
-
<span class="slide-label font-mono color-${tone(option(example.options.color, 'accent'))}">${option(example.options.label, '')}</span>
|
|
114
|
-
</div>
|
|
115
|
-
${renderCodeBlock(option(example.options.filename, ''), codeFromPart(example), option(example.options.lang, 'javascript'))}
|
|
116
|
-
</div>
|
|
117
|
-
`
|
|
118
|
-
)
|
|
119
|
-
.join('')}
|
|
120
|
-
</div>
|
|
121
|
-
</div>
|
|
122
|
-
<div class="slider-dots-container">
|
|
123
|
-
${examples
|
|
124
|
-
.map(
|
|
125
|
-
(_, index) =>
|
|
126
|
-
`<button class="slider-dot${index === 0 ? ' active' : ''}" aria-label="Go to slide ${index + 1}"></button>`
|
|
127
|
-
)
|
|
128
|
-
.join('')}
|
|
129
|
-
</div>
|
|
130
|
-
</div>
|
|
131
|
-
</section>
|
|
132
|
-
`
|
|
133
|
-
}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import meta from './_head-meta.js'
|
|
2
|
-
import header from './_header.js'
|
|
3
|
-
import footer from './_footer.js'
|
|
4
|
-
|
|
5
|
-
export default (props) => {
|
|
6
|
-
const cacheKey = props.cacheKey ? `?v=${props.cacheKey}` : ''
|
|
7
|
-
|
|
8
|
-
return `
|
|
9
|
-
<!doctype html>
|
|
10
|
-
<html lang="en">
|
|
11
|
-
<head>
|
|
12
|
-
${meta(props)}
|
|
13
|
-
${props.headScripts?.join('') || ''}
|
|
14
|
-
<link rel="stylesheet" href="/stylesheets/landing.css${cacheKey}">
|
|
15
|
-
${
|
|
16
|
-
props.themeStylesheet
|
|
17
|
-
? `<link rel="stylesheet" href="${props.themeStylesheet}">`
|
|
18
|
-
: ''
|
|
19
|
-
}
|
|
20
|
-
</head>
|
|
21
|
-
<body>
|
|
22
|
-
${header(props)}
|
|
23
|
-
${props.content}
|
|
24
|
-
${footer(props)}
|
|
25
|
-
${props.scripts?.join('') || ''}
|
|
26
|
-
</body>
|
|
27
|
-
</html>
|
|
28
|
-
`
|
|
29
|
-
}
|