@rettangoli/sites 1.0.0-rc10 → 1.0.0-rc12

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 CHANGED
@@ -140,7 +140,8 @@ Binding order:
140
140
 
141
141
  - Base template: `https://cdn.jsdelivr.net/npm/@rettangoli/sites@<version>/sites/templates/base.yaml`
142
142
  - Docs template: `https://cdn.jsdelivr.net/npm/@rettangoli/sites@<version>/sites/templates/docs.yaml`
143
- - Generic partials: `https://cdn.jsdelivr.net/npm/@rettangoli/sites@<version>/sites/partials/{seo,navbar,mobile-nav,docs-sidebar}.yaml`
143
+ - Landing/blog templates: `https://cdn.jsdelivr.net/npm/@rettangoli/sites@<version>/sites/templates/{landing-features,blog-article-list,blog-article}.yaml`
144
+ - Generic partials: `https://cdn.jsdelivr.net/npm/@rettangoli/sites@<version>/sites/partials/{seo,navbar,mobile-nav,docs-sidebar,top-navbar,footer}.yaml`
144
145
  - Legacy docs partial (compat, flat path): `https://cdn.jsdelivr.net/npm/@rettangoli/sites@<version>/sites/partials/docs-mobile-nav.yaml`
145
146
 
146
147
  See `sites/README.md` for full alias examples and required data contract.
@@ -189,12 +190,14 @@ Available in YAML templates/pages without extra setup:
189
190
  - `formatDate(value, format = "YYYYMMDDHHmmss", useUtc = true)`
190
191
  - `now(format = "YYYYMMDDHHmmss", useUtc = true)`
191
192
  - `sort(list, key, order = "asc")`
193
+ - `chunk(list, size = 1, pad = false, fillValue = null)`
192
194
  - `md(content)`
193
195
  - `toQueryString(object)`
194
196
 
195
- `formatDate` tokens: `YYYY`, `MM`, `DD`, `HH`, `mm`, `ss`.
197
+ `formatDate` tokens: `YYYY`, `MMM`, `MM`, `DD`, `D`, `HH`, `mm`, `ss`.
196
198
  `decodeURI`/`decodeURIComponent` return the original input when decoding fails.
197
199
  `sort` supports `order` as `asc` or `desc` (default: `asc`), accepts dot-path keys (for example `data.date`), and returns a new array.
200
+ `chunk` splits arrays into rows of `size`; with `pad = true`, the last row is padded with `fillValue`.
198
201
  `md` returns raw rendered HTML from Markdown for template insertion.
199
202
 
200
203
  ## Screenshots
@@ -207,6 +210,16 @@ Use VT against your generated site:
207
210
  2. Add `vt` config in `rettangoli.config.yaml`.
208
211
  3. Run `rtgl vt generate`, `rtgl vt report`, and `rtgl vt accept`.
209
212
 
213
+ Docker runtime (recommended for stable Playwright/browser versions):
214
+
215
+ ```bash
216
+ IMAGE="han4wluc/rtgl:playwright-v1.57.0-rtgl-v1.0.0-rc27"
217
+ docker pull "$IMAGE"
218
+ docker run --rm -v "$PWD:/workspace" -w /workspace "$IMAGE" rtgl vt screenshot
219
+ docker run --rm -v "$PWD:/workspace" -w /workspace "$IMAGE" rtgl vt report
220
+ docker run --rm -v "$PWD:/workspace" -w /workspace "$IMAGE" rtgl vt accept
221
+ ```
222
+
210
223
  Example:
211
224
 
212
225
  ```yaml
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rettangoli/sites",
3
- "version": "1.0.0-rc10",
3
+ "version": "1.0.0-rc12",
4
4
  "description": "Generate static sites using Markdown and YAML for docs, blogs, and marketing sites.",
5
5
  "author": {
6
6
  "name": "Luciano Hanyon Wu",
@@ -32,7 +32,8 @@
32
32
  "vitest": "^4.0.15"
33
33
  },
34
34
  "scripts": {
35
- "test": "vitest run --reporter=verbose"
35
+ "test": "vitest run --reporter=verbose",
36
+ "watch:theme-lab": "bunx rtgl sites watch --root-dir ./vt/theme-lab/site --output-path _site --reload-mode full"
36
37
  },
37
38
  "type": "module",
38
39
  "license": "MIT",
package/sites/README.md CHANGED
@@ -9,6 +9,12 @@ These files are distribution assets, not `@rettangoli/sites` runtime source code
9
9
  - `https://cdn.jsdelivr.net/npm/@rettangoli/sites@<version>/sites/templates/base.yaml`
10
10
  - Docs layout template:
11
11
  - `https://cdn.jsdelivr.net/npm/@rettangoli/sites@<version>/sites/templates/docs.yaml`
12
+ - Landing page with features template:
13
+ - `https://cdn.jsdelivr.net/npm/@rettangoli/sites@<version>/sites/templates/landing-features.yaml`
14
+ - Blog article list template:
15
+ - `https://cdn.jsdelivr.net/npm/@rettangoli/sites@<version>/sites/templates/blog-article-list.yaml`
16
+ - Blog article template:
17
+ - `https://cdn.jsdelivr.net/npm/@rettangoli/sites@<version>/sites/templates/blog-article.yaml`
12
18
 
13
19
  ## Published Partials
14
20
 
@@ -17,6 +23,31 @@ These files are distribution assets, not `@rettangoli/sites` runtime source code
17
23
  - `https://cdn.jsdelivr.net/npm/@rettangoli/sites@<version>/sites/partials/mobile-nav.yaml`
18
24
  - `https://cdn.jsdelivr.net/npm/@rettangoli/sites@<version>/sites/partials/docs-sidebar.yaml`
19
25
  - `https://cdn.jsdelivr.net/npm/@rettangoli/sites@<version>/sites/partials/docs-mobile-nav.yaml` (legacy compat partial, flat path)
26
+ - `https://cdn.jsdelivr.net/npm/@rettangoli/sites@<version>/sites/partials/top-navbar.yaml`
27
+ - `https://cdn.jsdelivr.net/npm/@rettangoli/sites@<version>/sites/partials/landing-hero.yaml`
28
+ - `https://cdn.jsdelivr.net/npm/@rettangoli/sites@<version>/sites/partials/landing-features-section.yaml`
29
+ - `https://cdn.jsdelivr.net/npm/@rettangoli/sites@<version>/sites/partials/landing-cta.yaml`
30
+ - `https://cdn.jsdelivr.net/npm/@rettangoli/sites@<version>/sites/partials/footer.yaml`
31
+
32
+ ## Published Theme Bundle
33
+
34
+ - `https://cdn.jsdelivr.net/npm/@rettangoli/sites@<version>/sites/themes/theme-rtgl-themes.css`
35
+
36
+ Apply one class to `body` or `html`, for example:
37
+ - `slate-light`, `slate-dark`
38
+ - `mono-light`, `mono-dark`
39
+ - `catppuccin-latte`, `catppuccin-frappe`, `catppuccin-macchiato`, `catppuccin-mocha`
40
+ - `github-light`, `github-dark`, `nord-light`, `nord-dark`
41
+
42
+ ## Published Theme Bundle
43
+
44
+ - `https://cdn.jsdelivr.net/npm/@rettangoli/sites@<version>/sites/themes/theme-rtgl-themes.css`
45
+
46
+ Apply one class to `body` or `html`, for example:
47
+ - `slate-light`, `slate-dark`
48
+ - `mono-light`, `mono-dark`
49
+ - `catppuccin-latte`, `catppuccin-frappe`, `catppuccin-macchiato`, `catppuccin-mocha`
50
+ - `github-light`, `github-dark`, `nord-light`, `nord-dark`
20
51
 
21
52
  ## Recommended Alias Map
22
53
 
@@ -25,13 +56,36 @@ imports:
25
56
  templates:
26
57
  base: https://cdn.jsdelivr.net/npm/@rettangoli/sites@<version>/sites/templates/base.yaml
27
58
  docs: https://cdn.jsdelivr.net/npm/@rettangoli/sites@<version>/sites/templates/docs.yaml
59
+ landing-features: https://cdn.jsdelivr.net/npm/@rettangoli/sites@<version>/sites/templates/landing-features.yaml
60
+ blog-article-list: https://cdn.jsdelivr.net/npm/@rettangoli/sites@<version>/sites/templates/blog-article-list.yaml
61
+ blog-article: https://cdn.jsdelivr.net/npm/@rettangoli/sites@<version>/sites/templates/blog-article.yaml
28
62
  partials:
29
63
  seo: https://cdn.jsdelivr.net/npm/@rettangoli/sites@<version>/sites/partials/seo.yaml
30
64
  navbar: https://cdn.jsdelivr.net/npm/@rettangoli/sites@<version>/sites/partials/navbar.yaml
31
65
  mobile-nav: https://cdn.jsdelivr.net/npm/@rettangoli/sites@<version>/sites/partials/mobile-nav.yaml
32
66
  docs-sidebar: https://cdn.jsdelivr.net/npm/@rettangoli/sites@<version>/sites/partials/docs-sidebar.yaml
67
+ top-navbar: https://cdn.jsdelivr.net/npm/@rettangoli/sites@<version>/sites/partials/top-navbar.yaml
68
+ landing-hero: https://cdn.jsdelivr.net/npm/@rettangoli/sites@<version>/sites/partials/landing-hero.yaml
69
+ landing-features-section: https://cdn.jsdelivr.net/npm/@rettangoli/sites@<version>/sites/partials/landing-features-section.yaml
70
+ landing-cta: https://cdn.jsdelivr.net/npm/@rettangoli/sites@<version>/sites/partials/landing-cta.yaml
71
+ footer: https://cdn.jsdelivr.net/npm/@rettangoli/sites@<version>/sites/partials/footer.yaml
33
72
  ```
34
73
 
74
+ ## JSON Schemas For Template/Partial Data
75
+
76
+ Canonical schema file in this repo:
77
+
78
+ - `sites/schemas/data-contract.schema.yaml`
79
+
80
+ Published URL format:
81
+
82
+ - `https://cdn.jsdelivr.net/npm/@rettangoli/sites@<version>/sites/schemas/data-contract.schema.yaml`
83
+
84
+ Use `$defs` for individual contracts:
85
+
86
+ - Templates: `template.base`, `template.docs`, `template.landingFeatures`, `template.blogArticleList`, `template.blogArticle`
87
+ - Partials: `partial.seo`, `partial.navbar`, `partial.mobileNav`, `partial.docsSidebar`, `partial.docsMobileNav`, `partial.topNavbar`, `partial.landingHero`, `partial.landingFeaturesSection`, `partial.landingCta`, `partial.footer`
88
+
35
89
  ## Frontmatter Examples
36
90
 
37
91
  Docs page:
@@ -55,6 +109,17 @@ title: Home
55
109
  ---
56
110
  ```
57
111
 
112
+ Landing page:
113
+
114
+ ```yaml
115
+ ---
116
+ template: landing-features
117
+ title: Product Landing
118
+ _bind:
119
+ seo: seo
120
+ ---
121
+ ```
122
+
58
123
  ## Docs Template Data Contract
59
124
 
60
125
  The `docs` template expects:
@@ -65,3 +130,22 @@ The `docs` template expects:
65
130
  - `title`
66
131
 
67
132
  Use `_bind.docs` to map `docs` from a global data file (for example `data/docs.yaml`).
133
+
134
+ ## Shared Data Contract
135
+
136
+ Templates and partials that include a top bar/footer expect:
137
+
138
+ - `site.navbar.brand` with `label` and `href`
139
+ - `site.navbar.items[]` with `label`, `href`, optional `target`
140
+ - `site.navbar.ctas[]` with `label`, `href`, optional `variant`, optional `target`
141
+ - `site.navbar.github.href` (optional)
142
+ - `site.footer.brand` with `label` and `tagline`
143
+ - `site.footer.columns[]` with `title` and `links[]`
144
+ - `site.footer.legalLinks[]` with `label`, `href`, optional `target`
145
+ - `site.footer.copyright`
146
+
147
+ Template-specific data:
148
+
149
+ - `landing-features` uses `landing.title`, `landing.subtitle`, optional `landing.actions[]`, optional `landing.image.{src,alt}`, `landing.featuresTitle`, `landing.featuresSubtitle`, `landing.features[]` (each with `title`, optional `subtitle`, optional `image.{src,alt}`, optional `imageRight`, optional `bullets[]`), and optional `landing.cta` (`title`, optional `subtitle`, optional `svg`, optional `cta.{label,href,variant,newTab}`)
150
+ - `blog-article-list` uses `description` and `posts[]` (`title`, `date`, `excerpt`, `author`, `readingTime`, `href`, optional `imageSrc` and `imageAlt`)
151
+ - `blog-article` uses `category`, `readingTime`, `description`, `author`, `date`, and optional `updatedAt`
@@ -0,0 +1,30 @@
1
+ - rtgl-view w=f h=80:
2
+ - rtgl-view w=f bwt=xs bc=bo ah=c mb=lg:
3
+ - rtgl-view w="1160" xl-w="1024" lg-w=f ph=lg pv=xl g=lg:
4
+ - rtgl-view md-d=v d=h wrap g=xl w=f av=s:
5
+ - rtgl-view w="1fg" md-w=f g=sm:
6
+ - rtgl-text s=lg fw=bold: ${brand.label}
7
+ - rtgl-text c=mu-fg: ${brand.tagline}
8
+ - rtgl-view w="1fg" md-w=f md-d=v d=h wrap g=xl ah=e:
9
+ - $for column in columns:
10
+ - rtgl-view w="1fg" md-w=f md-g=xl g=lg:
11
+ - rtgl-text s=sm c=mu-fg: ${column.title}
12
+ - $for link in column.links:
13
+ - $if link.target:
14
+ - rtgl-view href="${link.href}" target="${link.target}" d=h av=c cur=p:
15
+ - rtgl-text s=sm h-c=fg h-cur=p: ${link.label}
16
+ $else:
17
+ - rtgl-view href="${link.href}" d=h av=c cur=p:
18
+ - rtgl-text s=sm h-c=fg h-cur=p: ${link.label}
19
+ - rtgl-view md-d=v d=h wrap md-g=lg g=md md-av=s av=c w=f:
20
+ - rtgl-view md-w=f ah=s:
21
+ - rtgl-text s=sm c=mu-fg: ${copyright}
22
+ - rtgl-view w=1fg md-hide:
23
+ - rtgl-view md-d=v d=h wrap md-g=lg g=md md-ah=s ah=e md-w=f:
24
+ - $for link in legalLinks:
25
+ - $if link.target:
26
+ - rtgl-view href="${link.href}" target="${link.target}" d=h av=c ah=s md-w=f cur=p:
27
+ - rtgl-text s=sm c=mu-fg h-c=fg h-cur=p: ${link.label}
28
+ $else:
29
+ - rtgl-view href="${link.href}" d=h av=c ah=s md-w=f cur=p:
30
+ - rtgl-text s=sm c=mu-fg h-c=fg h-cur=p: ${link.label}
@@ -0,0 +1,18 @@
1
+ - 'rtgl-view w="f" pv="xl" style="padding-top: 128px; padding-bottom: 128px"':
2
+ - rtgl-view ah="c" p="xl" br="md" bw="sm" w="f":
3
+ - $if svg:
4
+ - rtgl-svg svg="${svg}" wh="48" c="pr" mb="md":
5
+ - rtgl-text s="h2" mb="md" c="pr" ta="c": ${title}
6
+ - $if subtitle:
7
+ - rtgl-text s="lg" c="pr" mb="lg" ta="c": ${subtitle}
8
+ - $if cta:
9
+ - $if cta.newTab:
10
+ - $if cta.variant:
11
+ - rtgl-button v="${cta.variant}" href="${cta.href}" new-tab: ${cta.label}
12
+ $else:
13
+ - rtgl-button href="${cta.href}" new-tab: ${cta.label}
14
+ $else:
15
+ - $if cta.variant:
16
+ - rtgl-button v="${cta.variant}" href="${cta.href}": ${cta.label}
17
+ $else:
18
+ - rtgl-button href="${cta.href}": ${cta.label}
@@ -0,0 +1,53 @@
1
+ - rtgl-view w=f g=xl pv=xl:
2
+ - rtgl-view w=f g=lg ah=c pv=xl:
3
+ - rtgl-text s=h2 ta=c w=f mb=md: ${title}
4
+ - $if subtitle:
5
+ - rtgl-text s=lg c=mu-fg ta=c w=f mt=sm mb=xl: ${subtitle}
6
+
7
+ - $if items:
8
+ - rtgl-view w=f g=xl pt=xl:
9
+ - $for feature in items:
10
+ - $if feature.imageRight:
11
+ - rtgl-view d=h md-d=v g=xl w=f av=c pv=xl:
12
+ - rtgl-view w=1fg md-w=f g=lg:
13
+ - rtgl-text s=h3 mb=sm: ${feature.title}
14
+ - $if feature.subtitle:
15
+ - rtgl-text s=lg c=mu-fg mb=lg: ${feature.subtitle}
16
+ - $if feature.bullets:
17
+ - rtgl-view g=md mt=sm:
18
+ - $for bullet in feature.bullets:
19
+ - rtgl-view d=h g=md av=s:
20
+ - rtgl-text c=mu-fg: •
21
+ - rtgl-text c=mu-fg w=1fg: ${bullet}
22
+ - rtgl-view w=1fg md-w=f:
23
+ - $if feature.image:
24
+ - $if feature.image.src:
25
+ - rtgl-image w=f h=360 md-h=280 of=cov br=md src="${feature.image.src}" alt="${feature.image.alt}":
26
+ $else:
27
+ - rtgl-view w=f h=360 md-h=280 bw=xs bc=bo bgc=se br=md ah=c av=c:
28
+ - rtgl-text c=se-fg: Feature image
29
+ $else:
30
+ - rtgl-view w=f h=360 md-h=280 bw=xs bc=bo bgc=se br=md ah=c av=c:
31
+ - rtgl-text c=se-fg: Feature image
32
+ $else:
33
+ - rtgl-view d=h md-d=v g=xl w=f av=c pv=xl:
34
+ - rtgl-view w=1fg md-w=f:
35
+ - $if feature.image:
36
+ - $if feature.image.src:
37
+ - rtgl-image w=f h=360 md-h=280 of=cov br=md src="${feature.image.src}" alt="${feature.image.alt}":
38
+ $else:
39
+ - rtgl-view w=f h=360 md-h=280 bw=xs bc=bo bgc=se br=md ah=c av=c:
40
+ - rtgl-text c=se-fg: Feature image
41
+ $else:
42
+ - rtgl-view w=f h=360 md-h=280 bw=xs bc=bo bgc=se br=md ah=c av=c:
43
+ - rtgl-text c=se-fg: Feature image
44
+ - rtgl-view w=1fg md-w=f g=lg:
45
+ - rtgl-text s=h3 mb=sm: ${feature.title}
46
+ - $if feature.subtitle:
47
+ - rtgl-text s=lg c=mu-fg mb=lg: ${feature.subtitle}
48
+ - $if feature.bullets:
49
+ - rtgl-view g=md mt=sm:
50
+ - $for bullet in feature.bullets:
51
+ - rtgl-view d=h g=md av=s:
52
+ - rtgl-text c=mu-fg: •
53
+ - rtgl-text c=mu-fg w=1fg: ${bullet}
@@ -0,0 +1,20 @@
1
+ - rtgl-view w=f g=xl pt=xl:
2
+ - rtgl-view w=f g=lg ah=c pv=xl:
3
+ - rtgl-text s=h1 ta=c w=f mb=sm: ${title}
4
+ - $if subtitle:
5
+ - rtgl-text s=lg c=mu-fg ta=c w=f mt=sm mb=lg: ${subtitle}
6
+ - $if actions:
7
+ - rtgl-view d=h wrap g=md w=f ah=c av=c mt=lg mb=xl:
8
+ - $for action in actions:
9
+ - $if action.variant:
10
+ - rtgl-button v="${action.variant}" href="${action.href}": ${action.label}
11
+ $else:
12
+ - rtgl-button href="${action.href}": ${action.label}
13
+
14
+ - $if image:
15
+ - $if image.src:
16
+ - rtgl-image w=f h=520 lg-h=420 md-h=280 of=cov br=md mb=xl src="${image.src}" alt="${image.alt}":
17
+ $else:
18
+ - rtgl-view w=f h=520 lg-h=420 md-h=280 bw=xs bc=bo bgc=se br=md mb=xl ah=c av=c:
19
+ - rtgl-text c=se-fg: Hero image
20
+ - rtgl-view h=xl:
@@ -1,5 +1,5 @@
1
1
  - 'rtgl-view data-mobile-autohide="true" bwb=xs w=f ah=c pos=fix bgc=bg':
2
- - rtgl-view md-w="100vw" lg-w="768" w="1024" d=h av=c h=64 ph=lg:
2
+ - rtgl-view md-w=f lg-w="768" w="1024" d=h av=c h=64 ph=lg:
3
3
  - rtgl-text: ${title}
4
4
  - rtgl-view w=1fg:
5
5
  - rtgl-view d=h av=c:
@@ -0,0 +1,83 @@
1
+ - 'rtgl-view data-mobile-autohide="true" md-hide bwb=xs w=f ah=c pos=fix z=1000 bgc=bg style="top:0;left:0"':
2
+ - rtgl-view w="1160" xl-w="1024" lg-w=f d=h av=c h=64 ph=lg g=lg:
3
+ - rtgl-view d=h wrap g=lg av=c:
4
+ - rtgl-view href="${brand.href}" cur=p:
5
+ - rtgl-text s=lg fw=bold: ${brand.label}
6
+ - rtgl-view d=h wrap g=sm av=c:
7
+ - $for item in items:
8
+ - $if item.target:
9
+ - rtgl-button v=lk href="${item.href}" new-tab rel="noopener noreferrer": ${item.label}
10
+ $else:
11
+ - rtgl-button v=lk href="${item.href}": ${item.label}
12
+ - rtgl-view w=1fg:
13
+ - rtgl-view d=h g=lg av=c:
14
+ - $if github:
15
+ - $if github.href:
16
+ - rtgl-view href="${github.href}" new-tab cur=p:
17
+ - rtgl-svg.svg-icon wh=20 svg=github:
18
+ - $if ctas:
19
+ - rtgl-view d=h g=lg av=c:
20
+ - $for cta in ctas:
21
+ - $if cta:
22
+ - $if cta.label:
23
+ - $if cta.href:
24
+ - $if cta.target:
25
+ - $if cta.variant:
26
+ - rtgl-button v="${cta.variant}" href="${cta.href}" new-tab rel="noopener noreferrer": ${cta.label}
27
+ $else:
28
+ - rtgl-button v=se href="${cta.href}" new-tab rel="noopener noreferrer": ${cta.label}
29
+ $else:
30
+ - $if cta.variant:
31
+ - rtgl-button v="${cta.variant}" href="${cta.href}": ${cta.label}
32
+ $else:
33
+ - rtgl-button v=se href="${cta.href}": ${cta.label}
34
+ $else:
35
+ - $if cta:
36
+ - $if cta.label:
37
+ - $if cta.href:
38
+ - rtgl-button v=se href="${cta.href}": ${cta.label}
39
+
40
+ - 'rtgl-view data-mobile-autohide="true" hide md-show pos=fix w=f h=56 bgc=bg av=c ph=lg d=h bwb=xs z=1000 style="top:0;left:0"':
41
+ - rtgl-view href="${brand.href}" cur=p:
42
+ - rtgl-text s=md fw=bold: ${brand.label}
43
+ - rtgl-view w=1fg:
44
+ - 'rtgl-view id="mobile-menu-btn" data-testid="mobile-menu-btn" cur=pointer aria-label="Open navigation menu" aria-controls="mobile-nav-overlay" aria-expanded="false" data-open-label="Open navigation menu" data-close-label="Close navigation menu"':
45
+ - rtgl-svg id="mobile-menu-icon" data-testid="mobile-menu-icon" wh=24 svg=menu cur=pointer:
46
+
47
+ - 'rtgl-view id="mobile-nav-overlay" pos=fix w=f bgc=bg z=999 d=v hidden style="top:56px;left:0;height:calc(100vh - 56px)"':
48
+ - rtgl-view sv w=f h=f ph=lg pv=lg g=lg:
49
+ - $if items:
50
+ - rtgl-view d=v g=sm w=f:
51
+ - $for item in items:
52
+ - $if item.target:
53
+ - 'rtgl-view data-mobile-nav-close="true" href="${item.href}" new-tab rel="noopener noreferrer" cur=p p=sm':
54
+ - rtgl-text s=lg: ${item.label}
55
+ $else:
56
+ - 'rtgl-view data-mobile-nav-close="true" href="${item.href}" cur=p p=sm':
57
+ - rtgl-text s=lg: ${item.label}
58
+ - $if github:
59
+ - $if github.href:
60
+ - 'rtgl-view data-mobile-nav-close="true" href="${github.href}" new-tab rel="noopener noreferrer" cur=p d=h av=c g=sm p=sm':
61
+ - rtgl-svg.svg-icon wh=20 svg=github:
62
+ - rtgl-text s=md: GitHub
63
+ - $if ctas:
64
+ - rtgl-view d=v g=lg w=f:
65
+ - $for cta in ctas:
66
+ - $if cta:
67
+ - $if cta.label:
68
+ - $if cta.href:
69
+ - $if cta.target:
70
+ - $if cta.variant:
71
+ - 'rtgl-button data-mobile-nav-close="true" v="${cta.variant}" href="${cta.href}" new-tab rel="noopener noreferrer" w=f': ${cta.label}
72
+ $else:
73
+ - 'rtgl-button data-mobile-nav-close="true" v=se href="${cta.href}" new-tab rel="noopener noreferrer" w=f': ${cta.label}
74
+ $else:
75
+ - $if cta.variant:
76
+ - 'rtgl-button data-mobile-nav-close="true" v="${cta.variant}" href="${cta.href}" w=f': ${cta.label}
77
+ $else:
78
+ - 'rtgl-button data-mobile-nav-close="true" v=se href="${cta.href}" w=f': ${cta.label}
79
+ $else:
80
+ - $if cta:
81
+ - $if cta.label:
82
+ - $if cta.href:
83
+ - 'rtgl-button data-mobile-nav-close="true" v=se href="${cta.href}" w=f': ${cta.label}