@hagicode/hagilight-starlight 0.5.2 → 0.5.3-dev.69.1.c2ff844

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/ArticlePromotion.astro +264 -38
  2. package/README.md +54 -0
  3. package/assets/showcase/heroes.webp +0 -0
  4. package/assets/showcase/manifest.json +118 -0
  5. package/assets/showcase/pillar-efficient.svg +1 -0
  6. package/assets/showcase/pillar-fun.svg +1 -0
  7. package/assets/showcase/pillar-smart.svg +1 -0
  8. package/assets/showcase/proposal-workflow.webp +0 -0
  9. package/assets/showcase/workbench.webp +0 -0
  10. package/dist/article-promotion-copy/de-DE.d.ts +34 -0
  11. package/dist/article-promotion-copy/de-DE.js +38 -0
  12. package/dist/article-promotion-copy/en-US.d.ts +34 -0
  13. package/dist/article-promotion-copy/en-US.js +38 -0
  14. package/dist/article-promotion-copy/es-ES.d.ts +34 -0
  15. package/dist/article-promotion-copy/es-ES.js +38 -0
  16. package/dist/article-promotion-copy/fr-FR.d.ts +34 -0
  17. package/dist/article-promotion-copy/fr-FR.js +38 -0
  18. package/dist/article-promotion-copy/index.d.ts +30 -0
  19. package/dist/article-promotion-copy/index.js +50 -0
  20. package/dist/article-promotion-copy/ja-JP.d.ts +34 -0
  21. package/dist/article-promotion-copy/ja-JP.js +38 -0
  22. package/dist/article-promotion-copy/ko-KR.d.ts +34 -0
  23. package/dist/article-promotion-copy/ko-KR.js +38 -0
  24. package/dist/article-promotion-copy/pt-BR.d.ts +34 -0
  25. package/dist/article-promotion-copy/pt-BR.js +38 -0
  26. package/dist/article-promotion-copy/ru-RU.d.ts +34 -0
  27. package/dist/article-promotion-copy/ru-RU.js +38 -0
  28. package/dist/article-promotion-copy/zh-CN.d.ts +34 -0
  29. package/dist/article-promotion-copy/zh-CN.js +38 -0
  30. package/dist/article-promotion-copy/zh-Hant.d.ts +34 -0
  31. package/dist/article-promotion-copy/zh-Hant.js +38 -0
  32. package/dist/article-promotion.d.ts +26 -1
  33. package/dist/article-promotion.js +2 -122
  34. package/dist/showcase.d.ts +6 -0
  35. package/dist/showcase.js +5 -0
  36. package/dist/windows-download.d.ts +4 -0
  37. package/dist/windows-download.js +22 -0
  38. package/package.json +7 -3
  39. package/assets/light-main.png +0 -0
@@ -1,50 +1,154 @@
1
1
  ---
2
- import heroImage from './assets/light-main.png';
2
+ import { Image } from 'astro:assets';
3
+ import { resolveSiteLinks } from '@hagicode/hagilight-core/links';
3
4
  import { getArticlePromotionCopy } from './dist/article-promotion.js';
5
+ import {
6
+ resolveMicrosoftStoreBadgeLanguage,
7
+ resolveMicrosoftStoreProductId,
8
+ } from './dist/windows-download.js';
9
+ import heroes from './assets/showcase/heroes.webp';
10
+ import pillarEfficient from './assets/showcase/pillar-efficient.svg';
11
+ import pillarFun from './assets/showcase/pillar-fun.svg';
12
+ import pillarSmart from './assets/showcase/pillar-smart.svg';
13
+ import proposalWorkflow from './assets/showcase/proposal-workflow.webp';
14
+ import workbench from './assets/showcase/workbench.webp';
4
15
 
5
16
  const { lang } = Astro.props;
6
17
  const copy = getArticlePromotionCopy(lang);
18
+ const siteLinks = resolveSiteLinks(lang);
19
+ const linkHref = (id: string, fallback: string) =>
20
+ [...siteLinks.header, ...siteLinks.quick].find((link) => link.id === id)?.href ?? fallback;
21
+ const homeHref = linkHref('home', 'https://www.hagicode.com/');
22
+ const docsHref = linkHref('productDocs', 'https://docs.hagicode.com/');
23
+ const storeHref = linkHref('microsoftStore', 'https://apps.microsoft.com/detail/9N3PM0N3SVDW');
24
+ const downloadsHref = linkHref('downloadClient', 'https://www.hagicode.com/');
25
+ const storeProductId = resolveMicrosoftStoreProductId(storeHref);
26
+ const badgeLanguage = resolveMicrosoftStoreBadgeLanguage(lang);
27
+
28
+ // Keyed by the ids in assets/showcase/manifest.json and in the copy catalog's gallery.
29
+ const galleryImages: Record<string, ImageMetadata> = {
30
+ workbench,
31
+ 'proposal-workflow': proposalWorkflow,
32
+ heroes,
33
+ };
34
+ const pillarIcons: Record<string, ImageMetadata> = {
35
+ smart: pillarSmart,
36
+ efficient: pillarEfficient,
37
+ fun: pillarFun,
38
+ };
39
+ const gallery = copy.gallery.flatMap((item) => {
40
+ const image = galleryImages[item.id];
41
+ return image ? [{ ...item, image }] : [];
42
+ });
7
43
  ---
8
44
 
9
45
  <section class="hagilight-article-promotion" aria-labelledby="hagilight-article-promotion-title">
10
- <div>
46
+ <div class="hagilight-article-promotion__intro">
11
47
  <h2 id="hagilight-article-promotion-title">{copy.title}</h2>
12
48
  <p>{copy.lead}</p>
13
49
  <p>{copy.subheadline}</p>
14
50
  </div>
15
- <img
16
- src={heroImage.src}
17
- alt={copy.imageAlt}
18
- width={heroImage.width}
19
- height={heroImage.height}
20
- loading="lazy"
21
- decoding="async"
22
- />
23
- <ul aria-label={copy.title}>
51
+
52
+ <div class="hagilight-article-promotion__actions">
53
+ <a class="hagilight-article-promotion__cta hagilight-article-promotion__cta--primary" href={homeHref}>
54
+ {copy.visitLabel}
55
+ </a>
56
+ <a class="hagilight-article-promotion__cta hagilight-article-promotion__cta--secondary" href={docsHref}>
57
+ {copy.docsLabel}
58
+ </a>
59
+ <div class="hagilight-article-promotion__windows">
60
+ <div class="hagilight-article-promotion__windows-header">
61
+ <span class="hagilight-article-promotion__windows-label">{copy.windowsLabel}</span>
62
+ <a class="hagilight-article-promotion__downloads" href={downloadsHref}>{copy.allDownloadsLabel}</a>
63
+ </div>
64
+ <ms-store-badge
65
+ productid={storeProductId}
66
+ productname="HagiCode"
67
+ window-mode="direct"
68
+ theme="auto"
69
+ size="large"
70
+ animation="on"
71
+ language={badgeLanguage}
72
+ aria-label={copy.windowsStoreAriaLabel}
73
+ title={copy.windowsStoreAriaLabel}
74
+ >
75
+ <a
76
+ class="hagilight-article-promotion__store-fallback"
77
+ href={storeHref}
78
+ aria-label={copy.windowsStoreAriaLabel}
79
+ title={copy.windowsStoreAriaLabel}
80
+ >{copy.windowsStoreLabel}</a>
81
+ </ms-store-badge>
82
+ </div>
83
+ </div>
84
+
85
+ <div class="hagilight-article-promotion__gallery-block">
86
+ <h3 id="hagilight-article-promotion-gallery-title">{copy.galleryHeading}</h3>
87
+ <ul class="hagilight-article-promotion__gallery" aria-labelledby="hagilight-article-promotion-gallery-title">
88
+ {gallery.map((item) => (
89
+ <li>
90
+ <figure>
91
+ <Image
92
+ src={item.image}
93
+ alt={item.alt}
94
+ width={item.image.width}
95
+ height={item.image.height}
96
+ widths={[480, 800, item.image.width]}
97
+ sizes="(min-width: 50rem) 720px, 100vw"
98
+ loading="lazy"
99
+ decoding="async"
100
+ fetchpriority="low"
101
+ />
102
+ <figcaption>{item.caption}</figcaption>
103
+ </figure>
104
+ </li>
105
+ ))}
106
+ </ul>
107
+ </div>
108
+
109
+ <ul class="hagilight-article-promotion__features" aria-label={copy.title}>
24
110
  {copy.features.map((feature) => (
25
111
  <li>
112
+ <span
113
+ class="hagilight-article-promotion__icon"
114
+ aria-hidden="true"
115
+ style={`--hagilight-pillar-icon: url(${pillarIcons[feature.id]?.src})`}
116
+ ></span>
26
117
  <strong>{feature.label}</strong>
27
118
  <span>{feature.description}</span>
28
119
  </li>
29
120
  ))}
30
121
  </ul>
31
- <a href="https://www.hagicode.com/">{copy.visitLabel}</a>
122
+
123
+ <div class="hagilight-article-promotion__share">
124
+ <h3 id="hagilight-article-promotion-share-title">{copy.shareLabel}</h3>
125
+ <p class="hagilight-article-promotion__share-text">{copy.shareText}</p>
126
+ </div>
32
127
  </section>
128
+ <script type="module" src="https://get.microsoft.com/badge/ms-store-badge.bundled.js" is:inline></script>
33
129
 
34
130
  <style>
35
131
  .hagilight-article-promotion {
36
132
  display: grid;
37
- gap: 1rem;
133
+ grid-template-columns: minmax(0, 1fr);
134
+ gap: 1.5rem;
38
135
  margin: 2rem auto;
39
136
  padding: clamp(1rem, 3vw, 1.75rem);
40
137
  border: 1px solid var(--sl-color-gray-5);
41
- border-radius: var(--sl-radius-lg);
138
+ border-radius: var(--sl-radius-lg, 0.75rem);
42
139
  background: var(--sl-color-bg-nav);
43
140
  color: var(--sl-color-text);
44
141
  }
45
142
 
46
- .hagilight-article-promotion h2 {
143
+ .hagilight-article-promotion h2,
144
+ .hagilight-article-promotion h3 {
47
145
  margin: 0;
146
+ color: var(--sl-color-white);
147
+ line-height: 1.25;
148
+ }
149
+
150
+ .hagilight-article-promotion h3 {
151
+ font-size: var(--sl-text-lg, 1.125rem);
48
152
  }
49
153
 
50
154
  .hagilight-article-promotion p {
@@ -52,57 +156,179 @@ const copy = getArticlePromotionCopy(lang);
52
156
  line-height: 1.6;
53
157
  }
54
158
 
159
+ .hagilight-article-promotion ul {
160
+ margin: 0;
161
+ padding: 0;
162
+ list-style: none;
163
+ }
164
+
165
+ .hagilight-article-promotion a:focus-visible {
166
+ outline: 2px solid var(--sl-color-text-accent);
167
+ outline-offset: 3px;
168
+ }
169
+
170
+ .hagilight-article-promotion__actions {
171
+ display: flex;
172
+ flex-wrap: wrap;
173
+ align-items: center;
174
+ gap: 0.75rem 1rem;
175
+ }
176
+
177
+ .hagilight-article-promotion__cta {
178
+ display: inline-flex;
179
+ align-items: center;
180
+ justify-content: center;
181
+ min-height: 2.75rem;
182
+ padding: 0.5rem 1rem;
183
+ border: 1px solid var(--sl-color-text-accent);
184
+ border-radius: var(--sl-radius-sm, 0.375rem);
185
+ font-weight: 700;
186
+ text-decoration: none;
187
+ }
188
+
189
+ .hagilight-article-promotion__cta--primary {
190
+ background: var(--sl-color-text-accent);
191
+ color: var(--sl-color-bg);
192
+ }
193
+
194
+ .hagilight-article-promotion__cta--secondary {
195
+ background: transparent;
196
+ color: var(--sl-color-text-accent);
197
+ }
198
+
199
+ .hagilight-article-promotion__cta:hover {
200
+ filter: brightness(1.08);
201
+ }
202
+
203
+ .hagilight-article-promotion__windows {
204
+ display: grid;
205
+ gap: 0.25rem;
206
+ width: 100%;
207
+ padding: 0.25rem 0.75rem 0.75rem;
208
+ border: 1px solid var(--sl-color-gray-5);
209
+ border-radius: var(--sl-radius-md, 0.5rem);
210
+ background: var(--sl-color-gray-6);
211
+ }
212
+
213
+ .hagilight-article-promotion__windows-header {
214
+ display: flex;
215
+ flex-wrap: wrap;
216
+ align-items: center;
217
+ justify-content: space-between;
218
+ gap: 0 1rem;
219
+ }
220
+
221
+ .hagilight-article-promotion__windows-label {
222
+ font-weight: 600;
223
+ }
224
+
225
+ /* Reserve the large badge's height (104px) so it replaces the fallback link without a layout jump. */
226
+ .hagilight-article-promotion__windows ms-store-badge {
227
+ display: inline-flex;
228
+ align-items: center;
229
+ justify-self: start;
230
+ max-width: 100%;
231
+ min-height: 6.5rem;
232
+ }
233
+
234
+ /* Keep the badge's fixed height and shrink it to the slot on narrow screens without distortion. */
235
+ .hagilight-article-promotion__windows ms-store-badge::part(img) {
236
+ max-width: 100%;
237
+ object-fit: contain;
238
+ object-position: left center;
239
+ }
240
+
241
+ .hagilight-article-promotion__store-fallback,
242
+ .hagilight-article-promotion__downloads {
243
+ display: inline-flex;
244
+ align-items: center;
245
+ min-height: 2.75rem;
246
+ color: var(--sl-color-text-accent);
247
+ font-weight: 600;
248
+ }
249
+
250
+ .hagilight-article-promotion__gallery-block {
251
+ display: grid;
252
+ gap: 0.75rem;
253
+ }
254
+
255
+ .hagilight-article-promotion__gallery {
256
+ display: grid;
257
+ gap: 1.25rem;
258
+ }
259
+
260
+ .hagilight-article-promotion figure {
261
+ display: grid;
262
+ gap: 0.5rem;
263
+ margin: 0;
264
+ }
265
+
55
266
  .hagilight-article-promotion img {
267
+ display: block;
56
268
  width: 100%;
57
269
  height: auto;
58
- border-radius: var(--sl-radius-md);
270
+ border: 1px solid var(--sl-color-gray-5);
271
+ border-radius: var(--sl-radius-md, 0.5rem);
59
272
  }
60
273
 
61
- .hagilight-article-promotion ul {
274
+ .hagilight-article-promotion figcaption {
275
+ color: var(--sl-color-gray-2);
276
+ font-size: var(--sl-text-sm, 0.875rem);
277
+ line-height: 1.5;
278
+ }
279
+
280
+ .hagilight-article-promotion__features {
62
281
  display: grid;
63
282
  grid-template-columns: repeat(3, minmax(0, 1fr));
64
283
  gap: 0.75rem;
65
- padding: 0;
66
- list-style: none;
67
284
  }
68
285
 
69
- .hagilight-article-promotion li {
286
+ .hagilight-article-promotion__features li {
70
287
  display: grid;
288
+ align-content: start;
71
289
  gap: 0.5rem;
290
+ min-width: 0;
72
291
  padding: 0.75rem;
73
292
  border: 1px solid var(--sl-color-gray-5);
74
- border-radius: var(--sl-radius-md);
293
+ border-radius: var(--sl-radius-md, 0.5rem);
75
294
  }
76
295
 
77
- .hagilight-article-promotion li strong {
296
+ .hagilight-article-promotion__features strong {
78
297
  color: var(--sl-color-text-accent);
79
298
  }
80
299
 
81
- .hagilight-article-promotion > a {
82
- display: inline-flex;
83
- justify-self: start;
84
- align-items: center;
85
- min-height: 2.75rem;
86
- padding: 0.5rem 1rem;
87
- border-radius: var(--sl-radius-sm);
300
+ .hagilight-article-promotion__icon {
301
+ width: 2rem;
302
+ height: 2rem;
88
303
  background: var(--sl-color-text-accent);
89
- color: var(--sl-color-bg);
90
- font-weight: 700;
91
- text-decoration: none;
304
+ mask: var(--hagilight-pillar-icon) center / contain no-repeat;
305
+ -webkit-mask: var(--hagilight-pillar-icon) center / contain no-repeat;
92
306
  }
93
307
 
94
- .hagilight-article-promotion > a:hover {
95
- filter: brightness(1.08);
308
+ .hagilight-article-promotion__share {
309
+ display: grid;
310
+ gap: 0.5rem;
96
311
  }
97
312
 
98
- .hagilight-article-promotion > a:focus-visible {
99
- outline: 2px solid var(--sl-color-text-accent);
100
- outline-offset: 3px;
313
+ .hagilight-article-promotion__share-text {
314
+ margin: 0;
315
+ padding: 0.75rem 1rem;
316
+ border: 1px dashed var(--sl-color-gray-4);
317
+ border-radius: var(--sl-radius-md, 0.5rem);
318
+ background: var(--sl-color-bg);
319
+ overflow-wrap: anywhere;
320
+ user-select: all;
101
321
  }
102
322
 
103
323
  @media (max-width: 30rem) {
104
- .hagilight-article-promotion ul {
324
+ .hagilight-article-promotion__features {
105
325
  grid-template-columns: 1fr;
106
326
  }
327
+
328
+ .hagilight-article-promotion__actions {
329
+ flex-direction: column;
330
+ flex-wrap: nowrap;
331
+ align-items: stretch;
332
+ }
107
333
  }
108
334
  </style>
package/README.md CHANGED
@@ -37,6 +37,60 @@ By default the plugin replaces Starlight's light/dark toggle with a theme picker
37
37
  hagilight({ themes: { enabled: false } })
38
38
  ```
39
39
 
40
+ ### HagiCode showcase
41
+
42
+ After the body (and any translation notice) of every documentation article, the plugin renders a static HagiCode showcase: a headline and lead, calls to action to the website and the documentation, a Windows download button, a three-image gallery with captions, three pillar cards (Smart, Efficient, Fun), and a selectable, copy-ready share sentence. All text is localized for the ten published locales (`en-US`, `zh-CN`, `zh-Hant`, `ja-JP`, `ko-KR`, `de-DE`, `fr-FR`, `es-ES`, `pt-BR`, `ru-RU`) and falls back to English for any other language. Links come from the same locale-aware catalog as the footer.
43
+
44
+ Turn it off for the whole site, or override it per article:
45
+
46
+ ```js
47
+ hagilight({ hagicodePromotion: { enabled: false } })
48
+ ```
49
+
50
+ ```md
51
+ ---
52
+ title: An article without the showcase
53
+ hagicodePromotion: false
54
+ ---
55
+ ```
56
+
57
+ The floating banner is a separate option (`promoto`).
58
+
59
+ #### Reuse the copy
60
+
61
+ `@hagicode/hagilight-starlight/showcase` returns the same read-only copy, including the share sentence, so sibling sites can show identical wording:
62
+
63
+ ```js
64
+ import { getShowcaseCopy, showcaseLocales } from '@hagicode/hagilight-starlight/showcase';
65
+
66
+ const copy = getShowcaseCopy('ja-JP'); // English copy for any unsupported locale
67
+ copy.shareText; // one sentence that ends with https://www.hagicode.com/
68
+ ```
69
+
70
+ The catalog is frozen; changing a returned object throws.
71
+
72
+ #### Windows download button and the Microsoft badge script
73
+
74
+ The Windows button follows the official HagiCode website and documentation: the `<ms-store-badge>` element for product `9N3PM0N3SVDW` (`window-mode="direct"`, `theme="auto"`, `size="large"`, badge language matching the page locale). Inside it sits a plain "Get it from Microsoft Store" link to the Store listing, and next to it an "All downloads" link to the localized downloads page for other platforms. The store URL and the downloads URL come from `@hagicode/hagilight-core` (`microsoftStore`, `downloadClient`).
75
+
76
+ This is the only script the showcase loads: `https://get.microsoft.com/badge/ms-store-badge.bundled.js`, as a module script. It only draws the badge. If your content security policy blocks it, or the reader is offline or blocks third-party scripts, the plain Store link stays visible and works, and nothing else changes. To use the badge, allow `get.microsoft.com` in `script-src`. The loader is emitted once per page, and only when the showcase is enabled. There is no first-party script, no operating-system detection, and no Steam link (the Steam app is retired).
77
+
78
+ #### Assets and image traffic
79
+
80
+ The gallery images and pillar icons live in `assets/showcase/`, with a provenance record in `assets/showcase/manifest.json`. Each entry states its kind (`sourced` from the HagiCode web app or documentation, a hand-authored `svg`, or a `generated` illustration), its source path or generation record (tool, prompt, parameters, date), the crop and conversion applied, its size, and the audit verdict. Nothing is fetched from the product sites at build or read time.
81
+
82
+ Every asset passes the same audit before it is committed: the current `HagiCode` brand, no Steam or other retired-channel content, no third-party promotion, no credentials, private repository names, or personal data, and rasters at least 1200 px wide. A removable offending region may be cropped out, and the crop is recorded. Pick images in this order to keep traffic low: an audited existing image converted to WebP, then a hand-authored SVG, then a newly generated raster only when neither fits. Generated art is an illustration, never a replica of the product UI, contains no text or logos, is captioned as an illustration, is reviewed by a person, and records its prompt and parameters (never credentials). Generation is an authoring step; the package never calls a generator.
83
+
84
+ Budgets, enforced by `npm test`: 768 KiB for all showcase images together, 200 KiB per raster (WebP only), and 8 KiB per SVG. Images are served through Astro's image pipeline as responsive, content-hashed files, load lazily with low priority, and sit after the article body, so a reader who does not reach the end downloads none of them.
85
+
86
+ #### Keep it in sync
87
+
88
+ The copy and assets mirror `repos/web` and `repos/docs` in the HagiCode monorepo, which this package never edits.
89
+
90
+ - **Copy:** edit `src/article-promotion-copy/<locale>.ts` (every locale must keep the same fields, feature ids, and gallery ids). Terminology is pinned in `GLOSSARY` in `src/article-promotion-copy/index.ts`, seeded from the product locale files in `repos/web/src/locales/<locale>/`. `HagiCode`, `OpenSpec`, `Hero Dungeon`, `Microsoft Store`, and `Windows` are never translated.
91
+ - **Images:** audit the candidate, crop and convert it to WebP, add or update its `manifest.json` entry, register it in the `galleryImages` map in `ArticlePromotion.astro`, and add a caption and text alternative in every locale. `npm test` checks that the manifest, the files, the component registry, and the copy agree.
92
+ - **Badge:** the product id is parsed from the Store URL and the badge language map lives in `src/windows-download.ts`. Re-check both against `repos/docs/src/components/MicrosoftStoreBadge.tsx` and the official site when the Store listing or the supported languages change.
93
+
40
94
  The plugin footer and direct `/Footer` and `/PromotoFooter` components append
41
95
  the literal `Powered By hagilight-starlight@<version>`. The version comes from
42
96
  this package's own manifest at build time, not from Astro or Starlight.
Binary file
@@ -0,0 +1,118 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "budgets": {
4
+ "totalKiB": 768,
5
+ "rasterKiB": 200,
6
+ "svgKiB": 8
7
+ },
8
+ "assets": [
9
+ {
10
+ "id": "workbench",
11
+ "kind": "sourced",
12
+ "file": "workbench.webp",
13
+ "width": 1600,
14
+ "height": 845,
15
+ "bytes": 57630,
16
+ "source": {
17
+ "repo": "docs",
18
+ "path": "src/content/docs/img/screenshots/shared/kanban-view/original.png"
19
+ },
20
+ "transforms": [
21
+ "crop 2015x1064+0+0 of the 3839x2159 original (top-left: header, session rail, Pending/In Progress/Archived columns)",
22
+ "resize to 1600 px wide",
23
+ "webp quality 90"
24
+ ],
25
+ "audit": {
26
+ "verdict": "pass-after-crop",
27
+ "checkedOn": "2026-10-08",
28
+ "notes": "Current HagiCode brand, English UI with Chinese session titles. The crop removes the bottom status bar (Steam wishlist strip) and the Pending card whose title mentions Steam. No paths, credentials, or personal data in the kept region. The full original fails the audit (retired Steam channel)."
29
+ }
30
+ },
31
+ {
32
+ "id": "proposal-workflow",
33
+ "kind": "sourced",
34
+ "file": "proposal-workflow.webp",
35
+ "width": 1600,
36
+ "height": 340,
37
+ "bytes": 21666,
38
+ "source": {
39
+ "repo": "docs",
40
+ "path": "src/content/docs/img/screenshots/shared/classic-proposal-view/original.png"
41
+ },
42
+ "transforms": [
43
+ "crop 3128x665+670+215 of the 3839x2159 original (proposal stage stepper and the Execution Completed card)",
44
+ "resize to 1600 px wide",
45
+ "webp quality 90"
46
+ ],
47
+ "audit": {
48
+ "verdict": "pass-after-crop",
49
+ "checkedOn": "2026-10-08",
50
+ "notes": "English UI. The crop drops the session sidebar (Steam in a session title), the status bar (Steam wishlist strip), and the idea folder row, which shows a local user path. The kept region shows only the proposal stage stepper and the Archive Plan action."
51
+ }
52
+ },
53
+ {
54
+ "id": "heroes",
55
+ "kind": "sourced",
56
+ "file": "heroes.webp",
57
+ "width": 1200,
58
+ "height": 1111,
59
+ "bytes": 101748,
60
+ "source": {
61
+ "repo": "docs",
62
+ "path": "src/content/docs/img/screenshots/shared/kanban-view/original.png"
63
+ },
64
+ "transforms": [
65
+ "crop 1302x1205+2035+260 of the 3839x2159 original (Ember Keep hero panel, three hero cards)",
66
+ "resize to 1200 px wide",
67
+ "webp quality 88"
68
+ ],
69
+ "audit": {
70
+ "verdict": "pass-after-crop",
71
+ "checkedOn": "2026-10-08",
72
+ "notes": "Current HagiCode UI, English panel text with two Chinese hero names. Hero portraits are the product's own art; no third-party brand, no private data, no Steam content in the kept region."
73
+ }
74
+ },
75
+ {
76
+ "id": "pillar-smart",
77
+ "kind": "svg",
78
+ "file": "pillar-smart.svg",
79
+ "width": 48,
80
+ "height": 48,
81
+ "bytes": 271,
82
+ "transforms": [],
83
+ "audit": {
84
+ "verdict": "pass",
85
+ "checkedOn": "2026-10-08",
86
+ "notes": "Hand-authored light bulb outline for the Smart card. No text, no logo, no third-party brand. Used as a CSS mask so the Starlight accent color applies."
87
+ }
88
+ },
89
+ {
90
+ "id": "pillar-efficient",
91
+ "kind": "svg",
92
+ "file": "pillar-efficient.svg",
93
+ "width": 48,
94
+ "height": 48,
95
+ "bytes": 281,
96
+ "transforms": [],
97
+ "audit": {
98
+ "verdict": "pass",
99
+ "checkedOn": "2026-10-08",
100
+ "notes": "Hand-authored three parallel arrows for the Efficient card. No text, no logo, no third-party brand. Used as a CSS mask so the Starlight accent color applies."
101
+ }
102
+ },
103
+ {
104
+ "id": "pillar-fun",
105
+ "kind": "svg",
106
+ "file": "pillar-fun.svg",
107
+ "width": 48,
108
+ "height": 48,
109
+ "bytes": 269,
110
+ "transforms": [],
111
+ "audit": {
112
+ "verdict": "pass",
113
+ "checkedOn": "2026-10-08",
114
+ "notes": "Hand-authored star outline for the Fun card. No text, no logo, no third-party brand. Used as a CSS mask so the Starlight accent color applies."
115
+ }
116
+ }
117
+ ]
118
+ }
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="48" height="48" fill="none" stroke="#000" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"><path d="M6 14h30M30 8l6 6-6 6"/><path d="M6 24h36M36 18l6 6-6 6"/><path d="M6 34h24M24 28l6 6-6 6"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="48" height="48" fill="none" stroke="#000" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"><path d="M24 6l5.5 12 13 1.5-9.7 8.8 2.7 12.9L24 34l-11.5 7.2 2.7-12.9-9.7-8.8 13-1.5z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="48" height="48" fill="none" stroke="#000" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"><path d="M17 33c0-3-5-5-5-12a12 12 0 0 1 24 0c0 7-5 9-5 12z"/><path d="M18 39h12M20 44h8"/></svg>
Binary file
@@ -0,0 +1,34 @@
1
+ declare const _default: {
2
+ title: string;
3
+ lead: string;
4
+ subheadline: string;
5
+ imageAlt: string;
6
+ features: ({
7
+ id: "smart";
8
+ label: string;
9
+ description: string;
10
+ } | {
11
+ id: "efficient";
12
+ label: string;
13
+ description: string;
14
+ } | {
15
+ id: "fun";
16
+ label: string;
17
+ description: string;
18
+ })[];
19
+ visitLabel: string;
20
+ docsLabel: string;
21
+ galleryHeading: string;
22
+ gallery: {
23
+ id: string;
24
+ caption: string;
25
+ alt: string;
26
+ }[];
27
+ windowsLabel: string;
28
+ windowsStoreLabel: string;
29
+ windowsStoreAriaLabel: string;
30
+ allDownloadsLabel: string;
31
+ shareLabel: string;
32
+ shareText: string;
33
+ };
34
+ export default _default;
@@ -0,0 +1,38 @@
1
+ const workbenchAlt = 'HagiCode-Werkbank mit einem Kanban-Board der Sitzungen in den Spalten Ausstehend, In Bearbeitung und Archiviert.';
2
+ export default {
3
+ title: 'HagiCode',
4
+ lead: 'HagiCode ist ein agentischer Coding-Arbeitsplatz: OpenSpec-Workflows planen die Änderung, Multi-Agent-Ausführung setzt sie um, und Hero Dungeon macht den langen Weg sichtbar, bis aus der Idee ausgelieferte Software wird.',
5
+ subheadline: 'Mit einem intelligenteren, schnelleren und unterhaltsameren agentischen Workflow wird aus Ideen nutzbare Software.',
6
+ imageAlt: workbenchAlt,
7
+ features: [
8
+ { id: 'smart', label: 'Intelligent', description: 'OpenSpec-Workflows machen aus einer Absicht einen umsetzbaren Weg vom Vorschlag über Design und Aufgaben bis zur Auslieferung.' },
9
+ { id: 'efficient', label: 'Effizient', description: 'Multi-Agent-Ausführung führt Recherche, Umsetzung und Prüfung parallel aus, über mehrere Repositories und die Agent CLIs, die Sie bereits nutzen.' },
10
+ { id: 'fun', label: 'Unterhaltsam', description: 'Hero Dungeon macht lange Coding-Sitzungen zu einem sichtbaren Abenteuer mit Helden, Fortschritt und Erfolgen.' },
11
+ ],
12
+ visitLabel: 'HagiCode besuchen',
13
+ docsLabel: 'Dokumentation lesen',
14
+ galleryHeading: 'HagiCode auf einen Blick',
15
+ gallery: [
16
+ {
17
+ id: 'workbench',
18
+ caption: 'Die Werkbank: alle Sitzungen auf einem Kanban-Board.',
19
+ alt: workbenchAlt,
20
+ },
21
+ {
22
+ id: 'proposal-workflow',
23
+ caption: 'Ein Vorschlag wandert von Erstellt über Entwurf und Prüfung bis zu Ausführung und Archiv.',
24
+ alt: 'Stufenleiste eines HagiCode-Vorschlags von Erstellt bis Archiviert; die Stufe Ausführung abgeschlossen ist hervorgehoben, dazu die Schaltfläche Plan archivieren.',
25
+ },
26
+ {
27
+ id: 'heroes',
28
+ caption: 'Hero Dungeon: Helden erledigen die Arbeit, Sie behalten Fortschritt, Level und Geschichte im Blick.',
29
+ alt: 'Bereich Hero Dungeon von HagiCode namens Ember Keep mit drei laufenden Helden samt Level, Fortschritt und Geschichtstext.',
30
+ },
31
+ ],
32
+ windowsLabel: 'Für Windows herunterladen',
33
+ windowsStoreLabel: 'Im Microsoft Store erhalten',
34
+ windowsStoreAriaLabel: 'HagiCode im Microsoft Store öffnen',
35
+ allDownloadsLabel: 'Alle Downloads',
36
+ shareLabel: 'HagiCode teilen',
37
+ shareText: 'HagiCode ist ein agentischer Coding-Arbeitsplatz mit OpenSpec-Workflows, Multi-Agent-Ausführung und Hero Dungeon: https://www.hagicode.com/',
38
+ };
@@ -0,0 +1,34 @@
1
+ declare const _default: {
2
+ title: string;
3
+ lead: string;
4
+ subheadline: string;
5
+ imageAlt: string;
6
+ features: ({
7
+ id: "smart";
8
+ label: string;
9
+ description: string;
10
+ } | {
11
+ id: "efficient";
12
+ label: string;
13
+ description: string;
14
+ } | {
15
+ id: "fun";
16
+ label: string;
17
+ description: string;
18
+ })[];
19
+ visitLabel: string;
20
+ docsLabel: string;
21
+ galleryHeading: string;
22
+ gallery: {
23
+ id: string;
24
+ caption: string;
25
+ alt: string;
26
+ }[];
27
+ windowsLabel: string;
28
+ windowsStoreLabel: string;
29
+ windowsStoreAriaLabel: string;
30
+ allDownloadsLabel: string;
31
+ shareLabel: string;
32
+ shareText: string;
33
+ };
34
+ export default _default;