@knitli/docs-components 1.3.2 → 1.3.5
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/dist/AllContributors-7n8pafkm.astro +38 -0
- package/dist/Contributors-he0tpj6t.astro +30 -0
- package/dist/DocsBreadcrumb-120137a7.astro +152 -0
- package/dist/Footer-eayrt0r3.astro +269 -0
- package/dist/PageFrame-y7qynxws.astro +187 -0
- package/dist/ProductCard-gebg6mpp.astro +289 -0
- package/dist/ProductGrid-j9rxskvp.astro +54 -0
- package/dist/ProductShowcase-xjwdmd15.astro +22 -0
- package/dist/SeoMeta-h32x587e.astro +53 -0
- package/dist/index.js +197 -18
- package/package.json +31 -23
- package/dist/assets/favicon/index.js +0 -8
- package/dist/assets/logos/index.js +0 -25
- package/dist/assets/styles/index.js +0 -12
- package/dist/data/products.js +0 -23
- package/dist/styles/index.js +0 -7
- package/dist/types/index.js +0 -1
- package/scripts/copy-assets.mjs +0 -42
- package/scripts/copy-dist-assets.mjs +0 -38
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
---
|
|
2
|
+
// SPDX-FileCopyrightText: 2025 Knitli Inc.
|
|
3
|
+
// SPDX-FileContributor: Adam Poulemanos <adam@knit.li>
|
|
4
|
+
//
|
|
5
|
+
// SPDX-License-Identifier: MIT OR Apache-2.0
|
|
6
|
+
//
|
|
7
|
+
// Product card for the documentation homepage. Renders a single product
|
|
8
|
+
// from the product catalog with status-driven behavior (clickable link
|
|
9
|
+
// vs static card with "coming soon" stamp).
|
|
10
|
+
|
|
11
|
+
import { Image } from "astro:assets";
|
|
12
|
+
// @ts-expect-error: 2604
|
|
13
|
+
import { Icon } from "@astrojs/starlight/components";
|
|
14
|
+
import type { StarlightIcon } from "@astrojs/starlight/types";
|
|
15
|
+
import * as logos from "@knitli/shared-layouts";
|
|
16
|
+
import type { ImageMetadata } from "astro";
|
|
17
|
+
import type { Product } from "../data/products.js";
|
|
18
|
+
|
|
19
|
+
interface Props {
|
|
20
|
+
/** Product data from the catalog */
|
|
21
|
+
product: Product;
|
|
22
|
+
/** Optional Starlight icon (overrides logo) */
|
|
23
|
+
icon?: StarlightIcon;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const { product, icon } = Astro.props;
|
|
27
|
+
|
|
28
|
+
/** Resolve a logo key string to an actual ImageMetadata asset from shared-layouts */
|
|
29
|
+
const resolveLogoAsset = (key: string): ImageMetadata | undefined =>
|
|
30
|
+
(logos as Record<string, ImageMetadata>)[key];
|
|
31
|
+
|
|
32
|
+
const logo = product.logo ? resolveLogoAsset(product.logo) : undefined;
|
|
33
|
+
const darkLogo = product.darkLogo
|
|
34
|
+
? resolveLogoAsset(product.darkLogo)
|
|
35
|
+
: undefined;
|
|
36
|
+
const isClickable = product.docsUrl && product.status !== "coming-soon";
|
|
37
|
+
|
|
38
|
+
const imageAttrs = {
|
|
39
|
+
loading: "eager" as const,
|
|
40
|
+
decoding: "async" as const,
|
|
41
|
+
width: 48,
|
|
42
|
+
height: 48,
|
|
43
|
+
alt: `${product.name} logo`,
|
|
44
|
+
};
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
{isClickable ? (
|
|
48
|
+
<a
|
|
49
|
+
href={product.docsUrl}
|
|
50
|
+
target={product.external ? "_blank" : "_self"}
|
|
51
|
+
rel={product.external ? "noopener noreferrer" : undefined}
|
|
52
|
+
>
|
|
53
|
+
<article class="card sl-flex linkcard" aria-label="button" tabindex="0">
|
|
54
|
+
<div class="title-row sl-flex">
|
|
55
|
+
{(logo || darkLogo) && (
|
|
56
|
+
<div class="product-logo">
|
|
57
|
+
{darkLogo && (
|
|
58
|
+
<Image
|
|
59
|
+
src={darkLogo}
|
|
60
|
+
{...imageAttrs}
|
|
61
|
+
class:list={{ "light:sl-hidden": Boolean(logo) }}
|
|
62
|
+
/>
|
|
63
|
+
)}
|
|
64
|
+
{logo && (
|
|
65
|
+
<Image
|
|
66
|
+
src={logo}
|
|
67
|
+
{...imageAttrs}
|
|
68
|
+
class="dark:sl-hidden"
|
|
69
|
+
/>
|
|
70
|
+
)}
|
|
71
|
+
</div>
|
|
72
|
+
)}
|
|
73
|
+
<p class="title sl-flex">
|
|
74
|
+
{icon && <Icon name={icon} class="icon" size="1.333em" />}
|
|
75
|
+
<span>{product.name}</span>
|
|
76
|
+
</p>
|
|
77
|
+
</div>
|
|
78
|
+
<div class="body">
|
|
79
|
+
<p>
|
|
80
|
+
{product.description}
|
|
81
|
+
{product.highlight && (
|
|
82
|
+
<>
|
|
83
|
+
<br /><br />
|
|
84
|
+
<strong>{product.highlight}</strong>
|
|
85
|
+
</>
|
|
86
|
+
)}
|
|
87
|
+
{product.footnote && (
|
|
88
|
+
<>
|
|
89
|
+
<br /><br />
|
|
90
|
+
<em>{product.footnote}</em>
|
|
91
|
+
</>
|
|
92
|
+
)}
|
|
93
|
+
</p>
|
|
94
|
+
<slot />
|
|
95
|
+
</div>
|
|
96
|
+
</article>
|
|
97
|
+
</a>
|
|
98
|
+
) : (
|
|
99
|
+
<article class="card sl-flex">
|
|
100
|
+
<div class="title-row sl-flex">
|
|
101
|
+
{(logo || darkLogo) && (
|
|
102
|
+
<div class="product-logo">
|
|
103
|
+
{darkLogo && (
|
|
104
|
+
<Image
|
|
105
|
+
src={darkLogo}
|
|
106
|
+
{...imageAttrs}
|
|
107
|
+
class:list={{ "light:sl-hidden": Boolean(logo) }}
|
|
108
|
+
/>
|
|
109
|
+
)}
|
|
110
|
+
{logo && (
|
|
111
|
+
<Image
|
|
112
|
+
src={logo}
|
|
113
|
+
{...imageAttrs}
|
|
114
|
+
class="dark:sl-hidden"
|
|
115
|
+
/>
|
|
116
|
+
)}
|
|
117
|
+
</div>
|
|
118
|
+
)}
|
|
119
|
+
<p class="title sl-flex">
|
|
120
|
+
{icon && <Icon name={icon} class="icon" size="1.333em" />}
|
|
121
|
+
<span>{product.name}</span>
|
|
122
|
+
</p>
|
|
123
|
+
</div>
|
|
124
|
+
<div class="body">
|
|
125
|
+
<p>
|
|
126
|
+
{product.description}
|
|
127
|
+
{product.highlight && (
|
|
128
|
+
<>
|
|
129
|
+
<br /><br />
|
|
130
|
+
<strong>{product.highlight}</strong>
|
|
131
|
+
</>
|
|
132
|
+
)}
|
|
133
|
+
{product.footnote && (
|
|
134
|
+
<>
|
|
135
|
+
<br /><br />
|
|
136
|
+
<em>{product.footnote}</em>
|
|
137
|
+
</>
|
|
138
|
+
)}
|
|
139
|
+
</p>
|
|
140
|
+
<slot />
|
|
141
|
+
</div>
|
|
142
|
+
{product.status === "coming-soon" && (
|
|
143
|
+
<span class="status-badge">Docs coming soon</span>
|
|
144
|
+
)}
|
|
145
|
+
</article>
|
|
146
|
+
)}
|
|
147
|
+
|
|
148
|
+
<style>
|
|
149
|
+
@layer starlight.components {
|
|
150
|
+
.card {
|
|
151
|
+
--sl-card-border: var(--knitli-aubergine);
|
|
152
|
+
--sl-card-bg: var(--sl-color-purple-low);
|
|
153
|
+
border: 1px solid var(--sl-color-gray-5);
|
|
154
|
+
background-color: var(--sl-color-black);
|
|
155
|
+
padding: clamp(1rem, calc(0.125rem + 3vw), 2.5rem);
|
|
156
|
+
flex-direction: column;
|
|
157
|
+
gap: clamp(0.5rem, calc(0.125rem + 1vw), 1rem);
|
|
158
|
+
height: 100%;
|
|
159
|
+
position: relative;
|
|
160
|
+
overflow: hidden;
|
|
161
|
+
}
|
|
162
|
+
.title {
|
|
163
|
+
font-weight: 600;
|
|
164
|
+
font-size: var(--sl-text-h4);
|
|
165
|
+
color: var(--sl-color-white);
|
|
166
|
+
line-height: var(--sl-line-height-headings);
|
|
167
|
+
text-decoration: none;
|
|
168
|
+
gap: 1rem;
|
|
169
|
+
align-items: center;
|
|
170
|
+
margin: 0;
|
|
171
|
+
}
|
|
172
|
+
.card .body {
|
|
173
|
+
margin: 0;
|
|
174
|
+
text-decoration: none;
|
|
175
|
+
font-size: clamp(
|
|
176
|
+
var(--sl-text-sm),
|
|
177
|
+
calc(0.5rem + 1vw),
|
|
178
|
+
var(--sl-text-body)
|
|
179
|
+
);
|
|
180
|
+
display: flex;
|
|
181
|
+
flex-direction: column;
|
|
182
|
+
}
|
|
183
|
+
.card .body > p {
|
|
184
|
+
flex: 1;
|
|
185
|
+
line-height: 1.6;
|
|
186
|
+
}
|
|
187
|
+
/* Clickable card styles */
|
|
188
|
+
a {
|
|
189
|
+
text-decoration: none !important;
|
|
190
|
+
color: var(--sl-color-text) !important;
|
|
191
|
+
}
|
|
192
|
+
a:hover {
|
|
193
|
+
text-decoration: none !important;
|
|
194
|
+
color: var(--sl-color-text) !important;
|
|
195
|
+
cursor: pointer;
|
|
196
|
+
}
|
|
197
|
+
a .linkcard {
|
|
198
|
+
transition:
|
|
199
|
+
background-color 0.3s,
|
|
200
|
+
border-color 0.3s;
|
|
201
|
+
cursor: pointer;
|
|
202
|
+
}
|
|
203
|
+
a .linkcard:hover,
|
|
204
|
+
a:hover .linkcard {
|
|
205
|
+
background-color: var(--sl-color-bg-inline-code);
|
|
206
|
+
border: 0.1rem solid var(--knitli-rust);
|
|
207
|
+
scale: 1.02;
|
|
208
|
+
transition: transform 0.3s ease;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/* Remove text decoration from all elements inside linked cards */
|
|
212
|
+
a .linkcard *,
|
|
213
|
+
a .linkcard .title,
|
|
214
|
+
a .linkcard .body,
|
|
215
|
+
a .linkcard .body p {
|
|
216
|
+
text-decoration: none !important;
|
|
217
|
+
color: inherit;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
a .linkcard .title {
|
|
221
|
+
color: var(--sl-color-white);
|
|
222
|
+
}
|
|
223
|
+
.title-row {
|
|
224
|
+
gap: 1rem;
|
|
225
|
+
align-items: center;
|
|
226
|
+
margin-bottom: 1rem;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
.card .icon {
|
|
230
|
+
border: 1px solid var(--sl-card-border);
|
|
231
|
+
background-color: var(--sl-card-bg);
|
|
232
|
+
padding: 0.2em;
|
|
233
|
+
border-radius: 0.25rem;
|
|
234
|
+
flex-shrink: 0;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/* Add padding when stamp is present so description doesn't overlap */
|
|
238
|
+
.card:has(.status-badge) .body {
|
|
239
|
+
padding-bottom: 3rem;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
.product-logo {
|
|
243
|
+
width: 60px;
|
|
244
|
+
height: 60px;
|
|
245
|
+
display: flex;
|
|
246
|
+
align-items: center;
|
|
247
|
+
justify-content: center;
|
|
248
|
+
flex-shrink: 0;
|
|
249
|
+
}
|
|
250
|
+
.product-logo img {
|
|
251
|
+
width: 100%;
|
|
252
|
+
height: 100%;
|
|
253
|
+
object-fit: contain;
|
|
254
|
+
}
|
|
255
|
+
.product-logo img:hover {
|
|
256
|
+
scale: 1.05;
|
|
257
|
+
transition: transform 0.3s ease;
|
|
258
|
+
}
|
|
259
|
+
.status-badge {
|
|
260
|
+
position: absolute;
|
|
261
|
+
bottom: 1.25rem;
|
|
262
|
+
right: 1.75rem;
|
|
263
|
+
transform: rotate(-8deg);
|
|
264
|
+
transform-origin: center;
|
|
265
|
+
|
|
266
|
+
/* Double-border rubber stamp effect */
|
|
267
|
+
border: 2px solid var(--sl-color-accent);
|
|
268
|
+
outline: 1px solid var(--sl-color-accent);
|
|
269
|
+
outline-offset: 3px;
|
|
270
|
+
border-radius: 1px;
|
|
271
|
+
|
|
272
|
+
color: var(--sl-color-accent);
|
|
273
|
+
background: transparent;
|
|
274
|
+
|
|
275
|
+
font-size: 0.6rem;
|
|
276
|
+
font-weight: 800;
|
|
277
|
+
text-transform: uppercase;
|
|
278
|
+
letter-spacing: 0.18em;
|
|
279
|
+
padding: 0.3em 0.75em;
|
|
280
|
+
|
|
281
|
+
/* Worn ink look */
|
|
282
|
+
opacity: 0.75;
|
|
283
|
+
white-space: nowrap;
|
|
284
|
+
z-index: 10;
|
|
285
|
+
pointer-events: none;
|
|
286
|
+
user-select: none;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
</style>
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
---
|
|
2
|
+
// SPDX-FileCopyrightText: 2025 Knitli Inc.
|
|
3
|
+
// SPDX-FileContributor: Adam Poulemanos <adam@knit.li>
|
|
4
|
+
//
|
|
5
|
+
// SPDX-License-Identifier: MIT OR Apache-2.0
|
|
6
|
+
//
|
|
7
|
+
// Product grid layout — 3-column on desktop with optional staggered offset.
|
|
8
|
+
|
|
9
|
+
interface Props {
|
|
10
|
+
staggered?: boolean;
|
|
11
|
+
stagger?: boolean;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const { staggered, stagger = staggered ?? false } = Astro.props;
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
<div class:list={["card-grid", { stagger }]}><slot /></div>
|
|
18
|
+
|
|
19
|
+
<style>
|
|
20
|
+
/** biome-ignore: lint/complexity/noImportantStyles */
|
|
21
|
+
@layer starlight.components {
|
|
22
|
+
.card-grid {
|
|
23
|
+
display: grid;
|
|
24
|
+
grid-template-columns: 100%;
|
|
25
|
+
gap: 1rem;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.card-grid > :global(*) {
|
|
29
|
+
margin-top: 0 !important;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
@media (min-width: 50rem) {
|
|
33
|
+
.card-grid {
|
|
34
|
+
grid-template-columns: 1fr 1fr 1fr;
|
|
35
|
+
gap: 1.5rem;
|
|
36
|
+
}
|
|
37
|
+
.stagger {
|
|
38
|
+
--stagger-height: 2.5rem;
|
|
39
|
+
padding-top: var(--stagger-height);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/* Pattern: Up, Baseline, Up */
|
|
43
|
+
.stagger > :global(*):nth-child(3n + 1) {
|
|
44
|
+
transform: translateY(calc(-1 * var(--stagger-height)));
|
|
45
|
+
}
|
|
46
|
+
.stagger > :global(*):nth-child(3n + 2) {
|
|
47
|
+
transform: translateY(0);
|
|
48
|
+
}
|
|
49
|
+
.stagger > :global(*):nth-child(3n + 3) {
|
|
50
|
+
transform: translateY(calc(-1 * var(--stagger-height)));
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
</style>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
---
|
|
2
|
+
// SPDX-FileCopyrightText: 2025 Knitli Inc.
|
|
3
|
+
// SPDX-FileContributor: Adam Poulemanos <adam@knit.li>
|
|
4
|
+
//
|
|
5
|
+
// SPDX-License-Identifier: MIT OR Apache-2.0
|
|
6
|
+
//
|
|
7
|
+
// Composite component that renders the full product showcase grid
|
|
8
|
+
// from the product catalog. Requires zero configuration — just
|
|
9
|
+
// import and use: <ProductShowcase />
|
|
10
|
+
|
|
11
|
+
import { featuredProducts } from "../data/products.js";
|
|
12
|
+
import ProductCard from "./ProductCard.astro";
|
|
13
|
+
import ProductGrid from "./ProductGrid.astro";
|
|
14
|
+
|
|
15
|
+
const products = featuredProducts();
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
<ProductGrid staggered>
|
|
19
|
+
{products.map((product) => (
|
|
20
|
+
<ProductCard key={product.name} product={product} />
|
|
21
|
+
))}
|
|
22
|
+
</ProductGrid>
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
---
|
|
2
|
+
// SPDX-FileCopyrightText: 2026 Knitli Inc.
|
|
3
|
+
// SPDX-FileContributor: Adam Poulemanos <adam@knit.li>
|
|
4
|
+
//
|
|
5
|
+
// SPDX-License-Identifier: MIT OR Apache-2.0
|
|
6
|
+
//
|
|
7
|
+
// Knitli-branded wrapper around astro-seo-meta Seo component.
|
|
8
|
+
// Pre-applies brand theme color, color scheme, and OG defaults.
|
|
9
|
+
//
|
|
10
|
+
// Usage:
|
|
11
|
+
// <SeoMeta title="Getting Started" description="..." />
|
|
12
|
+
// <SeoMeta title="API Reference" twitter={{ card: "summary" }} />
|
|
13
|
+
|
|
14
|
+
import { Seo } from "astro-seo-meta";
|
|
15
|
+
|
|
16
|
+
type ColorScheme = "normal" | "light dark" | "dark light" | "only light";
|
|
17
|
+
|
|
18
|
+
export interface Props {
|
|
19
|
+
title?: string;
|
|
20
|
+
description?: string;
|
|
21
|
+
keywords?: string[];
|
|
22
|
+
icon?: string;
|
|
23
|
+
/** Theme color for browser chrome. Defaults to Knitli aubergine. */
|
|
24
|
+
themeColor?: string;
|
|
25
|
+
colorScheme?: ColorScheme;
|
|
26
|
+
facebook?: {
|
|
27
|
+
image?: string;
|
|
28
|
+
type?: string;
|
|
29
|
+
url?: string;
|
|
30
|
+
};
|
|
31
|
+
twitter?: {
|
|
32
|
+
image?: string;
|
|
33
|
+
card?: string;
|
|
34
|
+
site?: string;
|
|
35
|
+
};
|
|
36
|
+
robots?: string;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const {
|
|
40
|
+
themeColor = "#1e061b",
|
|
41
|
+
colorScheme = "light dark",
|
|
42
|
+
twitter = {},
|
|
43
|
+
...rest
|
|
44
|
+
} = Astro.props;
|
|
45
|
+
|
|
46
|
+
const mergedTwitter = {
|
|
47
|
+
card: "summary_large_image",
|
|
48
|
+
site: "@knitli_inc",
|
|
49
|
+
...twitter,
|
|
50
|
+
};
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
<Seo themeColor={themeColor} colorScheme={colorScheme} twitter={mergedTwitter} {...rest} />
|
package/dist/index.js
CHANGED
|
@@ -1,10 +1,177 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __toESM = (mod, isNodeMode, target) => {
|
|
7
|
+
target = mod != null ? __create(__getProtoOf(mod)) : {};
|
|
8
|
+
const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
|
|
9
|
+
for (let key of __getOwnPropNames(mod))
|
|
10
|
+
if (!__hasOwnProp.call(to, key))
|
|
11
|
+
__defProp(to, key, {
|
|
12
|
+
get: () => mod[key],
|
|
13
|
+
enumerable: true
|
|
14
|
+
});
|
|
15
|
+
return to;
|
|
16
|
+
};
|
|
17
|
+
var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
|
|
18
|
+
|
|
19
|
+
// src/components/DocsBreadcrumb.astro
|
|
20
|
+
var require_DocsBreadcrumb = __commonJS((exports, module) => {
|
|
21
|
+
module.exports = "./DocsBreadcrumb-120137a7.astro";
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
// src/components/Footer.astro
|
|
25
|
+
var require_Footer = __commonJS((exports, module) => {
|
|
26
|
+
module.exports = "./Footer-eayrt0r3.astro";
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
// src/components/PageFrame.astro
|
|
30
|
+
var require_PageFrame = __commonJS((exports, module) => {
|
|
31
|
+
module.exports = "./PageFrame-y7qynxws.astro";
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
// src/components/Contributors.astro
|
|
35
|
+
var require_Contributors = __commonJS((exports, module) => {
|
|
36
|
+
module.exports = "./Contributors-he0tpj6t.astro";
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
// src/components/AllContributors.astro
|
|
40
|
+
var require_AllContributors = __commonJS((exports, module) => {
|
|
41
|
+
module.exports = "./AllContributors-7n8pafkm.astro";
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
// src/components/SeoMeta.astro
|
|
45
|
+
var require_SeoMeta = __commonJS((exports, module) => {
|
|
46
|
+
module.exports = "./SeoMeta-h32x587e.astro";
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
// src/components/ProductCard.astro
|
|
50
|
+
var require_ProductCard = __commonJS((exports, module) => {
|
|
51
|
+
module.exports = "./ProductCard-gebg6mpp.astro";
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
// src/components/ProductGrid.astro
|
|
55
|
+
var require_ProductGrid = __commonJS((exports, module) => {
|
|
56
|
+
module.exports = "./ProductGrid-j9rxskvp.astro";
|
|
57
|
+
});
|
|
6
58
|
|
|
7
|
-
|
|
59
|
+
// src/components/ProductShowcase.astro
|
|
60
|
+
var require_ProductShowcase = __commonJS((exports, module) => {
|
|
61
|
+
module.exports = "./ProductShowcase-xjwdmd15.astro";
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
// src/data/products.json
|
|
65
|
+
var products_default = [
|
|
66
|
+
{
|
|
67
|
+
slug: "recoco",
|
|
68
|
+
name: "Recoco",
|
|
69
|
+
tagline: "Intelligent data pipelines",
|
|
70
|
+
description: "Build intelligent data pipelines and ETL workflows. Only process changed data.",
|
|
71
|
+
highlight: "Pure Rust, minimal dependencies, maximum efficiency.",
|
|
72
|
+
status: "available",
|
|
73
|
+
docsUrl: "/recoco/",
|
|
74
|
+
external: false,
|
|
75
|
+
logo: "recocoLogoSm",
|
|
76
|
+
darkLogo: "recocoLogoSm",
|
|
77
|
+
order: 1,
|
|
78
|
+
featured: true
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
slug: "codeweaver",
|
|
82
|
+
name: "CodeWeaver",
|
|
83
|
+
tagline: "AI code context engine",
|
|
84
|
+
description: "Your AI code assistants can do better.",
|
|
85
|
+
highlight: "CodeWeaver gives AI agents tailored code context and project understanding, stopping hallucinations, cutting token waste, and supercharging your AI coding workflows.",
|
|
86
|
+
footnote: "Now in Alpha.",
|
|
87
|
+
status: "coming-soon",
|
|
88
|
+
external: false,
|
|
89
|
+
logo: "codeweaverPrimary",
|
|
90
|
+
darkLogo: "codeweaverReverse",
|
|
91
|
+
order: 2,
|
|
92
|
+
featured: true
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
slug: "thread",
|
|
96
|
+
name: "Thread",
|
|
97
|
+
tagline: "Ultra-fast codebase analysis",
|
|
98
|
+
description: "An ultra-fast, Rust-native, codebase analysis platform.",
|
|
99
|
+
highlight: "Real-time code understanding and navigation for the largest codebases. Delivers 50x+ speed improvements over comparable tools with minimal resource usage. Works locally, on the edge, or in the cloud.",
|
|
100
|
+
footnote: "Limited features available now, full release coming soon.",
|
|
101
|
+
status: "available",
|
|
102
|
+
docsUrl: "https://docs.rs/thread",
|
|
103
|
+
external: true,
|
|
104
|
+
logo: "threadLogoLight",
|
|
105
|
+
darkLogo: "threadLogoDark",
|
|
106
|
+
order: 3,
|
|
107
|
+
featured: true
|
|
108
|
+
}
|
|
109
|
+
];
|
|
110
|
+
|
|
111
|
+
// src/data/products.ts
|
|
112
|
+
var products = products_default;
|
|
113
|
+
function featuredProducts() {
|
|
114
|
+
return products.filter((p) => p.featured !== false).sort((a, b) => a.order - b.order);
|
|
115
|
+
}
|
|
116
|
+
function availableProducts() {
|
|
117
|
+
return products.filter((p) => p.status !== "coming-soon");
|
|
118
|
+
}
|
|
119
|
+
function getProduct(slug) {
|
|
120
|
+
return products.find((p) => p.slug === slug);
|
|
121
|
+
}
|
|
122
|
+
function getProductByName(name) {
|
|
123
|
+
return products.find((p) => p.name === name);
|
|
124
|
+
}
|
|
125
|
+
function productNames() {
|
|
126
|
+
return products.map((p) => p.name);
|
|
127
|
+
}
|
|
128
|
+
function getProductSitemaps(baseUrl = "https://docs.knitli.com") {
|
|
129
|
+
return products.filter((p) => p.docsUrl && !p.external && p.status !== "coming-soon").map((p) => `${baseUrl}/${p.slug}/sitemap-index.xml`);
|
|
130
|
+
}
|
|
131
|
+
// src/assets/favicon/index.ts
|
|
132
|
+
import { dirname, join } from "node:path";
|
|
133
|
+
import { fileURLToPath } from "node:url";
|
|
134
|
+
var __dirname2 = dirname(fileURLToPath(import.meta.url));
|
|
135
|
+
var faviconIco = join(__dirname2, "favicon.ico");
|
|
136
|
+
var faviconSvg = join(__dirname2, "favicon.svg");
|
|
137
|
+
|
|
138
|
+
// src/assets/logos/index.ts
|
|
139
|
+
import { dirname as dirname2, join as join2 } from "node:path";
|
|
140
|
+
import { fileURLToPath as fileURLToPath2 } from "node:url";
|
|
141
|
+
var __dirname3 = dirname2(fileURLToPath2(import.meta.url));
|
|
142
|
+
var knitliLogo = join2(__dirname3, "knitli_logo.svg");
|
|
143
|
+
var headlineLogoLight = join2(__dirname3, "headline_logo.webp");
|
|
144
|
+
var headlineLogoDark = join2(__dirname3, "headline_logo_dark.webp");
|
|
145
|
+
var codeweaverPrimary = join2(__dirname3, "codeweaver-primary.svg");
|
|
146
|
+
var codeweaverReverse = join2(__dirname3, "codeweaver-reverse.svg");
|
|
147
|
+
var knitliWordmark = join2(__dirname3, "knitli_wordmark.svg");
|
|
148
|
+
var recocoLogoXl = join2(__dirname3, "recoco-xl.webp");
|
|
149
|
+
var recocoLogoLg = join2(__dirname3, "recoco-lg.webp");
|
|
150
|
+
var recocoLogoMed = join2(__dirname3, "recoco-med.webp");
|
|
151
|
+
var recocoLogoSm = join2(__dirname3, "recoco-sm.webp");
|
|
152
|
+
var recocoLogoXs = join2(__dirname3, "recoco-xs.webp");
|
|
153
|
+
var threadLogoDark = join2(__dirname3, "Thread_vector_mono_parchment.svg");
|
|
154
|
+
var threadLogoLight = join2(__dirname3, "Thread_vector_mono_aubergine.svg");
|
|
155
|
+
|
|
156
|
+
// src/assets/styles/index.ts
|
|
157
|
+
import { dirname as dirname3, join as join3 } from "node:path";
|
|
158
|
+
import { fileURLToPath as fileURLToPath3 } from "node:url";
|
|
159
|
+
var __dirname4 = dirname3(fileURLToPath3(import.meta.url));
|
|
160
|
+
var codeweaverTheme = join3(__dirname4, "codeweaver-theme.css");
|
|
161
|
+
var globalStyles = join3(__dirname4, "global.css");
|
|
162
|
+
var knitliTheme = join3(__dirname4, "knitli-theme.css");
|
|
163
|
+
var textures = join3(__dirname4, "textures.css");
|
|
164
|
+
var typography = join3(__dirname4, "typography.css");
|
|
165
|
+
var variables = join3(__dirname4, "variables.css");
|
|
166
|
+
|
|
167
|
+
// src/styles/index.ts
|
|
168
|
+
import { dirname as dirname4, join as join4 } from "node:path";
|
|
169
|
+
import { fileURLToPath as fileURLToPath4 } from "node:url";
|
|
170
|
+
var __dirname5 = dirname4(fileURLToPath4(import.meta.url));
|
|
171
|
+
var docsStyle = join4(__dirname5, "custom.css");
|
|
172
|
+
|
|
173
|
+
// src/index.ts
|
|
174
|
+
var DocsAssets = {
|
|
8
175
|
knitliLogo,
|
|
9
176
|
recocoLogoMed,
|
|
10
177
|
recocoLogoSm,
|
|
@@ -24,20 +191,32 @@ const DocsAssets = {
|
|
|
24
191
|
faviconSvg,
|
|
25
192
|
docsStyle
|
|
26
193
|
};
|
|
27
|
-
|
|
28
|
-
DocsBreadcrumb: async () => await
|
|
29
|
-
DocsFooter: async () => await
|
|
30
|
-
PageFrame: async () => await
|
|
31
|
-
Contributors: async () => await
|
|
32
|
-
AllContributors: async () => await
|
|
33
|
-
SeoMeta: async () => await
|
|
34
|
-
ProductCard: async () => await
|
|
35
|
-
ProductGrid: async () => await
|
|
36
|
-
ProductShowcase: async () => await
|
|
194
|
+
var components = {
|
|
195
|
+
DocsBreadcrumb: async () => await Promise.resolve().then(() => __toESM(require_DocsBreadcrumb(), 1)),
|
|
196
|
+
DocsFooter: async () => await Promise.resolve().then(() => __toESM(require_Footer(), 1)),
|
|
197
|
+
PageFrame: async () => await Promise.resolve().then(() => __toESM(require_PageFrame(), 1)),
|
|
198
|
+
Contributors: async () => await Promise.resolve().then(() => __toESM(require_Contributors(), 1)),
|
|
199
|
+
AllContributors: async () => await Promise.resolve().then(() => __toESM(require_AllContributors(), 1)),
|
|
200
|
+
SeoMeta: async () => await Promise.resolve().then(() => __toESM(require_SeoMeta(), 1)),
|
|
201
|
+
ProductCard: async () => await Promise.resolve().then(() => __toESM(require_ProductCard(), 1)),
|
|
202
|
+
ProductGrid: async () => await Promise.resolve().then(() => __toESM(require_ProductGrid(), 1)),
|
|
203
|
+
ProductShowcase: async () => await Promise.resolve().then(() => __toESM(require_ProductShowcase(), 1))
|
|
37
204
|
};
|
|
38
|
-
|
|
205
|
+
var src_default = {
|
|
39
206
|
...components,
|
|
40
207
|
DocsAssets
|
|
41
208
|
};
|
|
209
|
+
export {
|
|
210
|
+
products,
|
|
211
|
+
productNames,
|
|
212
|
+
getProductSitemaps,
|
|
213
|
+
getProductByName,
|
|
214
|
+
getProduct,
|
|
215
|
+
featuredProducts,
|
|
216
|
+
src_default as default,
|
|
217
|
+
availableProducts,
|
|
218
|
+
DocsAssets
|
|
219
|
+
};
|
|
42
220
|
|
|
43
|
-
|
|
221
|
+
//# debugId=D99B31DD950B055464756E2164756E21
|
|
222
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2RhdGEvcHJvZHVjdHMudHMiLCAiLi4vc3JjL2Fzc2V0cy9mYXZpY29uL2luZGV4LnRzIiwgIi4uL3NyYy9hc3NldHMvbG9nb3MvaW5kZXgudHMiLCAiLi4vc3JjL2Fzc2V0cy9zdHlsZXMvaW5kZXgudHMiLCAiLi4vc3JjL3N0eWxlcy9pbmRleC50cyIsICIuLi9zcmMvaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiLy8gU1BEWC1GaWxlQ29weXJpZ2h0VGV4dDogMjAyNSBLbml0bGkgSW5jLlxuLy8gU1BEWC1GaWxlQ29udHJpYnV0b3I6IEFkYW0gUG91bGVtYW5vcyA8YWRhbUBrbml0LmxpPlxuLy9cbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVQgT1IgQXBhY2hlLTIuMFxuLy9cbi8vIFByb2R1Y3QgY2F0YWxvZyDigJQgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3IgYWxsIEtuaXRsaSBwcm9kdWN0IG1ldGFkYXRhLlxuLy8gRWRpdCBwcm9kdWN0cy5qc29uIHRvIGFkZCwgcmVtb3ZlLCByZW9yZGVyLCBvciB1cGRhdGUgcHJvZHVjdHMuXG5cbmltcG9ydCBjYXRhbG9nRGF0YSBmcm9tIFwiLi9wcm9kdWN0cy5qc29uXCIgd2l0aCB7IHR5cGU6IFwianNvblwiIH07XG5cbmV4cG9ydCB0eXBlIFByb2R1Y3RTdGF0dXMgPSBcImF2YWlsYWJsZVwiIHwgXCJjb21pbmctc29vblwiIHwgXCJhbHBoYVwiIHwgXCJiZXRhXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvZHVjdCB7XG4gIC8qKiBVUkwgc2x1ZyB1c2VkIGluIGRvY3MgcGF0aHMsIGUuZy4gXCJyZWNvY29cIiAqL1xuICBzbHVnOiBzdHJpbmc7XG4gIC8qKiBEaXNwbGF5IG5hbWUgKi9cbiAgbmFtZTogc3RyaW5nO1xuICAvKiogU2hvcnQgdGFnbGluZSBmb3IgY2FyZHMvbmF2ICovXG4gIHRhZ2xpbmU6IHN0cmluZztcbiAgLyoqIFByaW1hcnkgZGVzY3JpcHRpb24gKi9cbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgLyoqIEJvbGQvZW1waGFzaXplZCBjYWxsb3V0IHRleHQgKi9cbiAgaGlnaGxpZ2h0Pzogc3RyaW5nO1xuICAvKiogSXRhbGljaXplZCBmb290bm90ZSAoZS5nLiBcIk5vdyBpbiBBbHBoYS5cIikgKi9cbiAgZm9vdG5vdGU/OiBzdHJpbmc7XG4gIC8qKiBQcm9kdWN0IHN0YXR1cyDigJQgZHJpdmVzIGNhcmQgcmVuZGVyaW5nIGFuZCBmb290ZXIgbGlua3MgKi9cbiAgc3RhdHVzOiBQcm9kdWN0U3RhdHVzO1xuICAvKiogRG9jcyBVUkwg4oCUIHJlbGF0aXZlIGZvciBob3N0ZWQgZG9jcywgYWJzb2x1dGUgZm9yIGV4dGVybmFsICovXG4gIGRvY3NVcmw/OiBzdHJpbmc7XG4gIC8qKiBXaGV0aGVyIGRvY3MgYXJlIGhvc3RlZCBleHRlcm5hbGx5IChlLmcuIGRvY3MucnMpICovXG4gIGV4dGVybmFsPzogYm9vbGVhbjtcbiAgLyoqIExvZ28gYXNzZXQga2V5IGZyb20gRG9jc0Fzc2V0cyAqL1xuICBsb2dvOiBzdHJpbmc7XG4gIC8qKiBEYXJrLW1vZGUgbG9nbyBhc3NldCBrZXkgZnJvbSBEb2NzQXNzZXRzICovXG4gIGRhcmtMb2dvPzogc3RyaW5nO1xuICAvKiogU29ydCBvcmRlciBmb3IgZGlzcGxheSAqL1xuICBvcmRlcjogbnVtYmVyO1xuICAvKiogU2V0IGZhbHNlIHRvIGhpZGUgZnJvbSBkb2NzLWhvbWUgd2l0aG91dCBkZWxldGluZyAqL1xuICBmZWF0dXJlZD86IGJvb2xlYW47XG59XG5cbi8qKiBBbGwgcHJvZHVjdHMgZnJvbSB0aGUgY2F0YWxvZyAqL1xuZXhwb3J0IGNvbnN0IHByb2R1Y3RzOiBQcm9kdWN0W10gPSBjYXRhbG9nRGF0YSBhcyBQcm9kdWN0W107XG5cbi8qKiBQcm9kdWN0cyBtYXJrZWQgYXMgZmVhdHVyZWQgKG9yIG5vdCBleHBsaWNpdGx5IHVuZmVhdHVyZWQpLCBzb3J0ZWQgYnkgb3JkZXIgKi9cbmV4cG9ydCBmdW5jdGlvbiBmZWF0dXJlZFByb2R1Y3RzKCk6IFByb2R1Y3RbXSB7XG4gIHJldHVybiBwcm9kdWN0c1xuICAgIC5maWx0ZXIoKHApID0+IHAuZmVhdHVyZWQgIT09IGZhbHNlKVxuICAgIC5zb3J0KChhLCBiKSA9PiBhLm9yZGVyIC0gYi5vcmRlcik7XG59XG5cbi8qKiBQcm9kdWN0cyB3aXRoIGF2YWlsYWJsZSBkb2N1bWVudGF0aW9uIChub3QgY29taW5nLXNvb24pICovXG5leHBvcnQgZnVuY3Rpb24gYXZhaWxhYmxlUHJvZHVjdHMoKTogUHJvZHVjdFtdIHtcbiAgcmV0dXJuIHByb2R1Y3RzLmZpbHRlcigocCkgPT4gcC5zdGF0dXMgIT09IFwiY29taW5nLXNvb25cIik7XG59XG5cbi8qKiBMb29rIHVwIGEgc2luZ2xlIHByb2R1Y3QgYnkgc2x1ZyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFByb2R1Y3Qoc2x1Zzogc3RyaW5nKTogUHJvZHVjdCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBwcm9kdWN0cy5maW5kKChwKSA9PiBwLnNsdWcgPT09IHNsdWcpO1xufVxuXG4vKiogTG9vayB1cCBhIHByb2R1Y3QgYnkgZGlzcGxheSBuYW1lICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJvZHVjdEJ5TmFtZShuYW1lOiBzdHJpbmcpOiBQcm9kdWN0IHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHByb2R1Y3RzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gbmFtZSk7XG59XG5cbi8qKiBBbGwgdmFsaWQgcHJvZHVjdCBkaXNwbGF5IG5hbWVzLCBkZXJpdmVkIGZyb20gY2F0YWxvZyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb2R1Y3ROYW1lcygpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBwcm9kdWN0cy5tYXAoKHApID0+IHAubmFtZSk7XG59XG5cbi8qKiBHZW5lcmF0ZSBzaXRlbWFwIFVSTHMgZm9yIHByb2R1Y3RzIHdpdGggaG9zdGVkIChub24tZXh0ZXJuYWwpIGRvY3MgKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcm9kdWN0U2l0ZW1hcHMoXG4gIGJhc2VVcmwgPSBcImh0dHBzOi8vZG9jcy5rbml0bGkuY29tXCIsXG4pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBwcm9kdWN0c1xuICAgIC5maWx0ZXIoKHApID0+IHAuZG9jc1VybCAmJiAhcC5leHRlcm5hbCAmJiBwLnN0YXR1cyAhPT0gXCJjb21pbmctc29vblwiKVxuICAgIC5tYXAoKHApID0+IGAke2Jhc2VVcmx9LyR7cC5zbHVnfS9zaXRlbWFwLWluZGV4LnhtbGApO1xufVxuIiwKICAgICIvLyBTUERYLUZpbGVDb3B5cmlnaHRUZXh0OiAyMDI1IEtuaXRsaSBJbmMuXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUIE9SIEFwYWNoZS0yLjBcbi8vXG4vLyBMb2NhbCBsb2dvIGFzc2V0IGV4cG9ydHMgLSBmaWxlcyBhcmUgY29waWVkIGZyb20gQGtuaXRsaS9zaGFyZWQtbGF5b3V0cyBkdXJpbmcgYnVpbGQuXG4vLyBEbyBub3QgZWRpdCBwYXRocyBoZXJlOyBydW4gYGJ1biBydW4gY29weS1hc3NldHNgIHRvIHJlZnJlc2ggZnJvbSBzb3VyY2UuXG5cbmltcG9ydCB7IGRpcm5hbWUsIGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSBcIm5vZGU6dXJsXCI7XG5cbmNvbnN0IF9fZGlybmFtZSA9IGRpcm5hbWUoZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpKTtcblxuZXhwb3J0IGNvbnN0IGZhdmljb25JY28gPSBqb2luKF9fZGlybmFtZSwgXCJmYXZpY29uLmljb1wiKTtcbmV4cG9ydCBjb25zdCBmYXZpY29uU3ZnID0gam9pbihfX2Rpcm5hbWUsIFwiZmF2aWNvbi5zdmdcIik7XG5cbmV4cG9ydCB0eXBlIEZhdmljb25Bc3NldHMgPSB7XG4gIGZhdmljb25JY286IHN0cmluZztcbiAgZmF2aWNvblN2Zzogc3RyaW5nO1xufTtcbiIsCiAgICAiLy8gU1BEWC1GaWxlQ29weXJpZ2h0VGV4dDogMjAyNSBLbml0bGkgSW5jLlxuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVCBPUiBBcGFjaGUtMi4wXG4vL1xuLy8gTG9jYWwgbG9nbyBhc3NldCBleHBvcnRzIC0gZmlsZXMgYXJlIGNvcGllZCBmcm9tIEBrbml0bGkvc2hhcmVkLWxheW91dHMgZHVyaW5nIGJ1aWxkLlxuLy8gRG8gbm90IGVkaXQgcGF0aHMgaGVyZTsgcnVuIGBidW4gcnVuIGNvcHktYXNzZXRzYCB0byByZWZyZXNoIGZyb20gc291cmNlLlxuXG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gXCJub2RlOnVybFwiO1xuXG5jb25zdCBfX2Rpcm5hbWUgPSBkaXJuYW1lKGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKSk7XG5cbmV4cG9ydCBjb25zdCBrbml0bGlMb2dvID0gam9pbihfX2Rpcm5hbWUsIFwia25pdGxpX2xvZ28uc3ZnXCIpO1xuZXhwb3J0IGNvbnN0IGhlYWRsaW5lTG9nb0xpZ2h0ID0gam9pbihfX2Rpcm5hbWUsIFwiaGVhZGxpbmVfbG9nby53ZWJwXCIpO1xuZXhwb3J0IGNvbnN0IGhlYWRsaW5lTG9nb0RhcmsgPSBqb2luKF9fZGlybmFtZSwgXCJoZWFkbGluZV9sb2dvX2Rhcmsud2VicFwiKTtcbmV4cG9ydCBjb25zdCBjb2Rld2VhdmVyUHJpbWFyeSA9IGpvaW4oX19kaXJuYW1lLCBcImNvZGV3ZWF2ZXItcHJpbWFyeS5zdmdcIik7XG5leHBvcnQgY29uc3QgY29kZXdlYXZlclJldmVyc2UgPSBqb2luKF9fZGlybmFtZSwgXCJjb2Rld2VhdmVyLXJldmVyc2Uuc3ZnXCIpO1xuZXhwb3J0IGNvbnN0IGtuaXRsaVdvcmRtYXJrID0gam9pbihfX2Rpcm5hbWUsIFwia25pdGxpX3dvcmRtYXJrLnN2Z1wiKTtcbmV4cG9ydCBjb25zdCByZWNvY29Mb2dvWGwgPSBqb2luKF9fZGlybmFtZSwgXCJyZWNvY28teGwud2VicFwiKTtcbmV4cG9ydCBjb25zdCByZWNvY29Mb2dvTGcgPSBqb2luKF9fZGlybmFtZSwgXCJyZWNvY28tbGcud2VicFwiKTtcbmV4cG9ydCBjb25zdCByZWNvY29Mb2dvTWVkID0gam9pbihfX2Rpcm5hbWUsIFwicmVjb2NvLW1lZC53ZWJwXCIpO1xuZXhwb3J0IGNvbnN0IHJlY29jb0xvZ29TbSA9IGpvaW4oX19kaXJuYW1lLCBcInJlY29jby1zbS53ZWJwXCIpO1xuZXhwb3J0IGNvbnN0IHJlY29jb0xvZ29YcyA9IGpvaW4oX19kaXJuYW1lLCBcInJlY29jby14cy53ZWJwXCIpO1xuZXhwb3J0IGNvbnN0IHRocmVhZExvZ29EYXJrID0gam9pbihcbiAgX19kaXJuYW1lLFxuICBcIlRocmVhZF92ZWN0b3JfbW9ub19wYXJjaG1lbnQuc3ZnXCIsXG4pO1xuZXhwb3J0IGNvbnN0IHRocmVhZExvZ29MaWdodCA9IGpvaW4oXG4gIF9fZGlybmFtZSxcbiAgXCJUaHJlYWRfdmVjdG9yX21vbm9fYXViZXJnaW5lLnN2Z1wiLFxuKTtcblxuZXhwb3J0IHR5cGUgTG9nb0Fzc2V0cyA9IHtcbiAga25pdGxpTG9nbzogc3RyaW5nO1xuICBoZWFkbGluZUxvZ29EYXJrOiBzdHJpbmc7XG4gIGhlYWRsaW5lTG9nb0xpZ2h0OiBzdHJpbmc7XG4gIGNvZGV3ZWF2ZXJQcmltYXJ5OiBzdHJpbmc7XG4gIGNvZGV3ZWF2ZXJSZXZlcnNlOiBzdHJpbmc7XG4gIGtuaXRsaVdvcmRtYXJrOiBzdHJpbmc7XG4gIHJlY29jb0xvZ29YbDogc3RyaW5nO1xuICByZWNvY29Mb2dvTGc6IHN0cmluZztcbiAgcmVjb2NvTG9nb01lZDogc3RyaW5nO1xuICByZWNvY29Mb2dvU206IHN0cmluZztcbiAgcmVjb2NvTG9nb1hzOiBzdHJpbmc7XG4gIHRocmVhZExvZ29EYXJrOiBzdHJpbmc7XG4gIHRocmVhZExvZ29MaWdodDogc3RyaW5nO1xufTtcbiIsCiAgICAiLy8gU1BEWC1GaWxlQ29weXJpZ2h0VGV4dDogMjAyNSBLbml0bGkgSW5jLlxuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVCBPUiBBcGFjaGUtMi4wXG4vL1xuLy8gTG9jYWwgc3R5bGUgYXNzZXQgcGF0aCBleHBvcnRzIC0gQ1NTIGZpbGVzIGFyZSBjb3BpZWQgZnJvbSBAa25pdGxpL3NoYXJlZC1sYXlvdXRzIGR1cmluZyBidWlsZC5cbi8vIERvIG5vdCBlZGl0OyBydW4gYGJ1biBydW4gY29weS1hc3NldHNgIHRvIHJlZnJlc2ggZnJvbSBzb3VyY2UuXG5cbmltcG9ydCB7IGRpcm5hbWUsIGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSBcIm5vZGU6dXJsXCI7XG5cbmNvbnN0IF9fZGlybmFtZSA9IGRpcm5hbWUoZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpKTtcblxuZXhwb3J0IGNvbnN0IGNvZGV3ZWF2ZXJUaGVtZSA9IGpvaW4oX19kaXJuYW1lLCBcImNvZGV3ZWF2ZXItdGhlbWUuY3NzXCIpO1xuZXhwb3J0IGNvbnN0IGdsb2JhbFN0eWxlcyA9IGpvaW4oX19kaXJuYW1lLCBcImdsb2JhbC5jc3NcIik7XG5leHBvcnQgY29uc3Qga25pdGxpVGhlbWUgPSBqb2luKF9fZGlybmFtZSwgXCJrbml0bGktdGhlbWUuY3NzXCIpO1xuZXhwb3J0IGNvbnN0IHRleHR1cmVzID0gam9pbihfX2Rpcm5hbWUsIFwidGV4dHVyZXMuY3NzXCIpO1xuZXhwb3J0IGNvbnN0IHR5cG9ncmFwaHkgPSBqb2luKF9fZGlybmFtZSwgXCJ0eXBvZ3JhcGh5LmNzc1wiKTtcbmV4cG9ydCBjb25zdCB2YXJpYWJsZXMgPSBqb2luKF9fZGlybmFtZSwgXCJ2YXJpYWJsZXMuY3NzXCIpO1xuXG5leHBvcnQgdHlwZSBTdHlsZUFzc2V0cyA9IHtcbiAgY29kZXdlYXZlclRoZW1lOiBzdHJpbmc7XG4gIGdsb2JhbFN0eWxlczogc3RyaW5nO1xuICBrbml0bGlUaGVtZTogc3RyaW5nO1xuICB0ZXh0dXJlczogc3RyaW5nO1xuICB0eXBvZ3JhcGh5OiBzdHJpbmc7XG4gIHZhcmlhYmxlczogc3RyaW5nO1xufTtcbiIsCiAgICAiaW1wb3J0IHsgZGlybmFtZSwgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tIFwibm9kZTp1cmxcIjtcblxuY29uc3QgX19kaXJuYW1lID0gZGlybmFtZShmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpO1xuXG5leHBvcnQgY29uc3QgZG9jc1N0eWxlID0gam9pbihfX2Rpcm5hbWUsIFwiY3VzdG9tLmNzc1wiKTtcbiIsCiAgICAiLy8gU1BEWC1GaWxlQ29weXJpZ2h0VGV4dDogMjAyNSBLbml0bGkgSW5jLlxuLy8gU1BEWC1GaWxlQ29udHJpYnV0b3I6IEFkYW0gUG91bGVtYW5vcyA8YWRhbUBrbml0LmxpPlxuLy9cbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVQgT1IgQXBhY2hlLTIuMFxuLy9cbi8vIE1haW4gZXhwb3J0cyBmb3IgQGtuaXRsaS9kb2NzLWNvbXBvbmVudHMgcGFja2FnZVxuXG5leHBvcnQgKiBmcm9tIFwiLi9kYXRhL3Byb2R1Y3RzLmpzXCI7XG4vLyBFeHBvcnQgdHlwZSBkZWZpbml0aW9ucyBhbmQgcHJvZHVjdCBjYXRhbG9nXG5leHBvcnQgKiBmcm9tIFwiLi90eXBlcy9pbmRleC5qc1wiO1xuXG5pbXBvcnQgeyBmYXZpY29uSWNvLCBmYXZpY29uU3ZnIH0gZnJvbSBcIi4vYXNzZXRzL2Zhdmljb24vaW5kZXguanNcIjtcbmltcG9ydCB7XG4gIGNvZGV3ZWF2ZXJQcmltYXJ5LFxuICBjb2Rld2VhdmVyUmV2ZXJzZSxcbiAgaGVhZGxpbmVMb2dvRGFyayxcbiAgaGVhZGxpbmVMb2dvTGlnaHQsXG4gIGtuaXRsaUxvZ28sXG4gIGtuaXRsaVdvcmRtYXJrLFxuICByZWNvY29Mb2dvTGcsXG4gIHJlY29jb0xvZ29NZWQsXG4gIHJlY29jb0xvZ29TbSxcbiAgcmVjb2NvTG9nb1hsLFxuICByZWNvY29Mb2dvWHMsXG4gIHRocmVhZExvZ29EYXJrLFxuICB0aHJlYWRMb2dvTGlnaHQsXG59IGZyb20gXCIuL2Fzc2V0cy9sb2dvcy9pbmRleC5qc1wiO1xuXG5pbXBvcnQgeyBjb2Rld2VhdmVyVGhlbWUsIHZhcmlhYmxlcyB9IGZyb20gXCIuL2Fzc2V0cy9zdHlsZXMvaW5kZXguanNcIjtcblxuaW1wb3J0IHsgZG9jc1N0eWxlIH0gZnJvbSBcIi4vc3R5bGVzL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBjb25zdCBEb2NzQXNzZXRzID0ge1xuICBrbml0bGlMb2dvLFxuICByZWNvY29Mb2dvTWVkLFxuICByZWNvY29Mb2dvU20sXG4gIHJlY29jb0xvZ29MZyxcbiAgcmVjb2NvTG9nb1hzLFxuICByZWNvY29Mb2dvWGwsXG4gIGNvZGV3ZWF2ZXJQcmltYXJ5LFxuICBjb2Rld2VhdmVyUmV2ZXJzZSxcbiAgY29kZXdlYXZlclRoZW1lLFxuICB2YXJpYWJsZXMsXG4gIHRocmVhZExvZ29EYXJrLFxuICB0aHJlYWRMb2dvTGlnaHQsXG4gIGhlYWRsaW5lTG9nb0RhcmssXG4gIGhlYWRsaW5lTG9nb0xpZ2h0LFxuICBrbml0bGlXb3JkbWFyayxcbiAgZmF2aWNvbkljbyxcbiAgZmF2aWNvblN2ZyxcbiAgZG9jc1N0eWxlLFxufTtcblxuY29uc3QgY29tcG9uZW50cyA9IHtcbiAgRG9jc0JyZWFkY3J1bWI6IGFzeW5jICgpID0+IGF3YWl0IGltcG9ydChcIi4vY29tcG9uZW50cy9Eb2NzQnJlYWRjcnVtYi5hc3Ryb1wiKSxcbiAgRG9jc0Zvb3RlcjogYXN5bmMgKCkgPT4gYXdhaXQgaW1wb3J0KFwiLi9jb21wb25lbnRzL0Zvb3Rlci5hc3Ryb1wiKSxcbiAgUGFnZUZyYW1lOiBhc3luYyAoKSA9PiBhd2FpdCBpbXBvcnQoXCIuL2NvbXBvbmVudHMvUGFnZUZyYW1lLmFzdHJvXCIpLFxuICBDb250cmlidXRvcnM6IGFzeW5jICgpID0+IGF3YWl0IGltcG9ydChcIi4vY29tcG9uZW50cy9Db250cmlidXRvcnMuYXN0cm9cIiksXG4gIEFsbENvbnRyaWJ1dG9yczogYXN5bmMgKCkgPT5cbiAgICBhd2FpdCBpbXBvcnQoXCIuL2NvbXBvbmVudHMvQWxsQ29udHJpYnV0b3JzLmFzdHJvXCIpLFxuICBTZW9NZXRhOiBhc3luYyAoKSA9PiBhd2FpdCBpbXBvcnQoXCIuL2NvbXBvbmVudHMvU2VvTWV0YS5hc3Ryb1wiKSxcbiAgUHJvZHVjdENhcmQ6IGFzeW5jICgpID0+IGF3YWl0IGltcG9ydChcIi4vY29tcG9uZW50cy9Qcm9kdWN0Q2FyZC5hc3Ryb1wiKSxcbiAgUHJvZHVjdEdyaWQ6IGFzeW5jICgpID0+IGF3YWl0IGltcG9ydChcIi4vY29tcG9uZW50cy9Qcm9kdWN0R3JpZC5hc3Ryb1wiKSxcbiAgUHJvZHVjdFNob3djYXNlOiBhc3luYyAoKSA9PlxuICAgIGF3YWl0IGltcG9ydChcIi4vY29tcG9uZW50cy9Qcm9kdWN0U2hvd2Nhc2UuYXN0cm9cIiksXG59O1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIC4uLmNvbXBvbmVudHMsXG4gIERvY3NBc3NldHMsXG59O1xuIgogIF0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMENPLElBQU0sV0FBc0I7QUFHNUIsU0FBUyxnQkFBZ0IsR0FBYztBQUFBLEVBQzVDLE9BQU8sU0FDSixPQUFPLENBQUMsTUFBTSxFQUFFLGFBQWEsS0FBSyxFQUNsQyxLQUFLLENBQUMsR0FBRyxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUs7QUFBQTtBQUk5QixTQUFTLGlCQUFpQixHQUFjO0FBQUEsRUFDN0MsT0FBTyxTQUFTLE9BQU8sQ0FBQyxNQUFNLEVBQUUsV0FBVyxhQUFhO0FBQUE7QUFJbkQsU0FBUyxVQUFVLENBQUMsTUFBbUM7QUFBQSxFQUM1RCxPQUFPLFNBQVMsS0FBSyxDQUFDLE1BQU0sRUFBRSxTQUFTLElBQUk7QUFBQTtBQUl0QyxTQUFTLGdCQUFnQixDQUFDLE1BQW1DO0FBQUEsRUFDbEUsT0FBTyxTQUFTLEtBQUssQ0FBQyxNQUFNLEVBQUUsU0FBUyxJQUFJO0FBQUE7QUFJdEMsU0FBUyxZQUFZLEdBQWE7QUFBQSxFQUN2QyxPQUFPLFNBQVMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJO0FBQUE7QUFJNUIsU0FBUyxrQkFBa0IsQ0FDaEMsVUFBVSwyQkFDQTtBQUFBLEVBQ1YsT0FBTyxTQUNKLE9BQU8sQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLEVBQUUsWUFBWSxFQUFFLFdBQVcsYUFBYSxFQUNwRSxJQUFJLENBQUMsTUFBTSxHQUFHLFdBQVcsRUFBRSx3QkFBd0I7QUFBQTs7QUN2RXhEO0FBQ0E7QUFFQSxJQUFNLGFBQVksUUFBUSxjQUFjLFlBQVksR0FBRyxDQUFDO0FBRWpELElBQU0sYUFBYSxLQUFLLFlBQVcsYUFBYTtBQUNoRCxJQUFNLGFBQWEsS0FBSyxZQUFXLGFBQWE7OztBQ052RCxvQkFBUyxrQkFBUztBQUNsQiwwQkFBUztBQUVULElBQU0sYUFBWSxTQUFRLGVBQWMsWUFBWSxHQUFHLENBQUM7QUFFakQsSUFBTSxhQUFhLE1BQUssWUFBVyxpQkFBaUI7QUFDcEQsSUFBTSxvQkFBb0IsTUFBSyxZQUFXLG9CQUFvQjtBQUM5RCxJQUFNLG1CQUFtQixNQUFLLFlBQVcseUJBQXlCO0FBQ2xFLElBQU0sb0JBQW9CLE1BQUssWUFBVyx3QkFBd0I7QUFDbEUsSUFBTSxvQkFBb0IsTUFBSyxZQUFXLHdCQUF3QjtBQUNsRSxJQUFNLGlCQUFpQixNQUFLLFlBQVcscUJBQXFCO0FBQzVELElBQU0sZUFBZSxNQUFLLFlBQVcsZ0JBQWdCO0FBQ3JELElBQU0sZUFBZSxNQUFLLFlBQVcsZ0JBQWdCO0FBQ3JELElBQU0sZ0JBQWdCLE1BQUssWUFBVyxpQkFBaUI7QUFDdkQsSUFBTSxlQUFlLE1BQUssWUFBVyxnQkFBZ0I7QUFDckQsSUFBTSxlQUFlLE1BQUssWUFBVyxnQkFBZ0I7QUFDckQsSUFBTSxpQkFBaUIsTUFDNUIsWUFDQSxrQ0FDRjtBQUNPLElBQU0sa0JBQWtCLE1BQzdCLFlBQ0Esa0NBQ0Y7OztBQ3ZCQSxvQkFBUyxrQkFBUztBQUNsQiwwQkFBUztBQUVULElBQU0sYUFBWSxTQUFRLGVBQWMsWUFBWSxHQUFHLENBQUM7QUFFakQsSUFBTSxrQkFBa0IsTUFBSyxZQUFXLHNCQUFzQjtBQUM5RCxJQUFNLGVBQWUsTUFBSyxZQUFXLFlBQVk7QUFDakQsSUFBTSxjQUFjLE1BQUssWUFBVyxrQkFBa0I7QUFDdEQsSUFBTSxXQUFXLE1BQUssWUFBVyxjQUFjO0FBQy9DLElBQU0sYUFBYSxNQUFLLFlBQVcsZ0JBQWdCO0FBQ25ELElBQU0sWUFBWSxNQUFLLFlBQVcsZUFBZTs7O0FDaEJ4RCxvQkFBUyxrQkFBUztBQUNsQiwwQkFBUztBQUVULElBQU0sYUFBWSxTQUFRLGVBQWMsWUFBWSxHQUFHLENBQUM7QUFFakQsSUFBTSxZQUFZLE1BQUssWUFBVyxZQUFZOzs7QUMyQjlDLElBQU0sYUFBYTtBQUFBLEVBQ3hCO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRjtBQUVBLElBQU0sYUFBYTtBQUFBLEVBQ2pCLGdCQUFnQixZQUFZO0FBQUEsRUFDNUIsWUFBWSxZQUFZO0FBQUEsRUFDeEIsV0FBVyxZQUFZO0FBQUEsRUFDdkIsY0FBYyxZQUFZO0FBQUEsRUFDMUIsaUJBQWlCLFlBQ2Y7QUFBQSxFQUNGLFNBQVMsWUFBWTtBQUFBLEVBQ3JCLGFBQWEsWUFBWTtBQUFBLEVBQ3pCLGFBQWEsWUFBWTtBQUFBLEVBQ3pCLGlCQUFpQixZQUNmO0FBQ0o7QUFFQSxJQUFlO0FBQUEsS0FDVjtBQUFBLEVBQ0g7QUFDRjsiLAogICJkZWJ1Z0lkIjogIkQ5OUIzMUREOTUwQjA1NTQ2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
|