@hagicode/hagilight-starlight 0.16.2-dev.170.1.abf7fea → 0.17.1-dev.175.1.77872ad

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.
@@ -1,5 +1,4 @@
1
1
  ---
2
- import { Picture } from 'astro:assets';
3
2
  import { gaEventAttributes } from '@hagicode/hagilight-core/analytics-events';
4
3
  import { resolveSiteLinks } from '@hagicode/hagilight-core/links';
5
4
  import { getArticlePromotionCopy } from './dist/article-promotion.js';
@@ -8,13 +7,11 @@ import {
8
7
  resolveMicrosoftStoreBadgeLanguage,
9
8
  resolveMicrosoftStoreProductId,
10
9
  } from './dist/windows-download.js';
10
+ import { Picture } from 'astro:assets';
11
11
  import catHead from './assets/showcase/cat-head.webp';
12
- import heroes from './assets/showcase/heroes.webp';
13
12
  import pillarEfficient from './assets/showcase/pillar-efficient.svg';
14
13
  import pillarFun from './assets/showcase/pillar-fun.svg';
15
14
  import pillarSmart from './assets/showcase/pillar-smart.svg';
16
- import proposalWorkflow from './assets/showcase/proposal-workflow.webp';
17
- import workbench from './assets/showcase/workbench.webp';
18
15
  import showcaseManifest from './assets/showcase/manifest.json';
19
16
  import ArticlePromotionPicker from './ArticlePromotionPicker.astro';
20
17
 
@@ -39,26 +36,19 @@ const badgeLanguage = resolveMicrosoftStoreBadgeLanguage(lang);
39
36
  const showcaseTag = (category: 'download' | 'store' | 'navigation', label: string, url?: string) =>
40
37
  gaEventAttributes({ category, label, location: 'article_promotion', url });
41
38
 
42
- // Keyed by the ids in assets/showcase/manifest.json and in the copy catalog's gallery.
43
- const galleryImages: Record<string, ImageMetadata> = {
44
- workbench,
45
- 'proposal-workflow': proposalWorkflow,
46
- heroes,
47
- 'cat-head': catHead,
48
- };
49
- // The illustration slot is the only gallery image that may change; its pool lives in the showcase manifest. It is dealt as the footer's fan of cat heads.
39
+ // The illustration's pool lives in the showcase manifest. It is dealt as the footer's fan of cat heads.
50
40
  const ILLUSTRATION_ID = 'cat-head';
51
41
  const avatarEntry = showcaseManifest.assets.find(({ id }) => id === ILLUSTRATION_ID);
52
42
  const avatarPool = randomAvatar && avatarEntry && 'pool' in avatarEntry ? randomPoolFromManifest(avatarEntry.pool) : undefined;
43
+ const ctaAvatarAttributes = {
44
+ class: 'hagilight-article-promotion__cta-avatar',
45
+ ...(avatarPool ? { 'data-random-fan': randomPoolAttribute(avatarPool) } : {}),
46
+ };
53
47
  const pillarIcons: Record<string, ImageMetadata> = {
54
48
  smart: pillarSmart,
55
49
  efficient: pillarEfficient,
56
50
  fun: pillarFun,
57
51
  };
58
- const gallery = copy.gallery.flatMap((item) => {
59
- const image = galleryImages[item.id];
60
- return image ? [{ ...item, image }] : [];
61
- });
62
52
  ---
63
53
 
64
54
  <section class="hagilight-article-promotion" aria-labelledby="hagilight-article-promotion-title">
@@ -73,6 +63,17 @@ const gallery = copy.gallery.flatMap((item) => {
73
63
  href={homeHref}
74
64
  {...showcaseTag('navigation', 'home')}
75
65
  >
66
+ <Picture
67
+ src={catHead}
68
+ alt=""
69
+ formats={['avif', 'webp']}
70
+ fallbackFormat="jpeg"
71
+ widths={[96, 192]}
72
+ sizes="52px"
73
+ loading="lazy"
74
+ decoding="async"
75
+ pictureAttributes={ctaAvatarAttributes}
76
+ />
76
77
  <span>{copy.visitLabel}</span>
77
78
  <svg class="hagilight-article-promotion__arrow" aria-hidden="true" focusable="false" viewBox="0 0 20 20" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 10h11M11 5l5 5-5 5" /></svg>
78
79
  </a>
@@ -101,33 +102,6 @@ const gallery = copy.gallery.flatMap((item) => {
101
102
  </ul>
102
103
  </div>
103
104
 
104
- <div class="hagilight-article-promotion__gallery-block">
105
- <h3 id="hagilight-article-promotion-gallery-title">{copy.galleryHeading}</h3>
106
- <ul class="hagilight-article-promotion__gallery" aria-labelledby="hagilight-article-promotion-gallery-title">
107
- {gallery.map((item) => (
108
- <li>
109
- <figure>
110
- <Picture
111
- src={item.image}
112
- alt={item.alt}
113
- width={item.image.width}
114
- height={item.image.height}
115
- formats={['avif', 'webp']}
116
- fallbackFormat="jpeg"
117
- widths={[480, 800, item.image.width]}
118
- sizes="(min-width: 50rem) 560px, 100vw"
119
- loading="lazy"
120
- decoding="async"
121
- fetchpriority="low"
122
- pictureAttributes={item.id === ILLUSTRATION_ID && avatarPool ? { 'data-random-fan': randomPoolAttribute(avatarPool) } : undefined}
123
- />
124
- <figcaption>{item.caption}</figcaption>
125
- </figure>
126
- </li>
127
- ))}
128
- </ul>
129
- </div>
130
-
131
105
  {avatarPool && <ArticlePromotionPicker />}
132
106
 
133
107
  <div class="hagilight-article-promotion__closing">
@@ -171,8 +145,8 @@ const gallery = copy.gallery.flatMap((item) => {
171
145
 
172
146
  <style>
173
147
  /*
174
- * One stage, four beats, top to bottom: pitch (what it is, the way in, the three pillars),
175
- * gallery (proof), closing band (get it, share it). The stage is tinted from the active theme's
148
+ * One stage, three beats, top to bottom: pitch (what it is, the way in, the three pillars),
149
+ * closing band (get it, share it). The stage is tinted from the active theme's
176
150
  * accent so it reads as a deliberate HagiCode moment against the article's neutral page, and the
177
151
  * closing band bleeds to the stage edges so "get it" is the last, heaviest surface. Pillars are
178
152
  * separated by accent rules rather than boxes. The topology follows the section's own width, so
@@ -392,27 +366,6 @@ const gallery = copy.gallery.flatMap((item) => {
392
366
  -webkit-mask: var(--hagilight-pillar-icon) center / contain no-repeat;
393
367
  }
394
368
 
395
- /* Gallery: three audited screenshots, kept in the catalog's narrative order. */
396
- .hagilight-article-promotion__gallery-block {
397
- display: grid;
398
- gap: 1.125rem;
399
- }
400
-
401
- .hagilight-article-promotion__gallery {
402
- display: grid;
403
- gap: 1.5rem 1.25rem;
404
- }
405
-
406
- .hagilight-article-promotion__gallery li {
407
- min-width: 0;
408
- }
409
-
410
- .hagilight-article-promotion figure {
411
- display: grid;
412
- gap: 0.625rem;
413
- margin: 0;
414
- }
415
-
416
369
  .hagilight-article-promotion picture {
417
370
  display: block;
418
371
  }
@@ -424,29 +377,12 @@ const gallery = copy.gallery.flatMap((item) => {
424
377
  border: 1px solid var(--hagilight-promo-edge);
425
378
  border-radius: var(--sl-radius-md, 0.5rem);
426
379
  box-shadow: 0 18px 32px -18px color-mix(in srgb, var(--sl-color-black) 80%, transparent);
427
- transition: transform 0.35s cubic-bezier(0.22, 1, 0.36, 1), border-color 0.35s;
428
- }
429
-
430
- .hagilight-article-promotion figure:hover img {
431
- transform: translateY(-3px);
432
- border-color: var(--sl-color-text-accent);
433
- }
434
-
435
- .hagilight-article-promotion figcaption {
436
- color: var(--sl-color-gray-1);
437
- font-size: var(--sl-text-sm, 0.875rem);
438
- line-height: 1.5;
439
- }
440
-
441
- /* The illustration is a small square with its caption beside it, so it reads as an avatar, not a screenshot. */
442
- .hagilight-article-promotion__gallery li:nth-child(4) picture {
443
- max-width: 12rem;
444
380
  }
445
381
 
446
382
  /*
447
- * The illustration's fan, the footer avatar's fan at the illustration's size: three cards pivot on a point
383
+ * The cat-head fan, the footer avatar's fan at the call to action's size: three cards pivot on a point
448
384
  * below the stack, the vendored default is the first centre card and fades out as the random cards are dealt
449
- * over it. Offsets are percentages of a card, so the fan scales with the 12 rem box.
385
+ * over it. Offsets are percentages of a card, so the fan scales with its box.
450
386
  */
451
387
  .hagilight-article-promotion picture[data-random-fan] {
452
388
  position: relative;
@@ -467,9 +403,25 @@ const gallery = copy.gallery.flatMap((item) => {
467
403
  transition: opacity 320ms ease-out, transform 760ms cubic-bezier(0.16, 1, 0.3, 1);
468
404
  }
469
405
 
470
- .hagilight-article-promotion figure:hover picture[data-random-fan] img,
471
- .hagilight-article-promotion figure:hover picture[data-random-fan] :global(.hagilight-fan__card) {
472
- border: 0;
406
+ /* The avatar leads the primary call to action, so the fan and the button read as one control. */
407
+ .hagilight-article-promotion__cta--primary:has(.hagilight-article-promotion__cta-avatar) {
408
+ padding-inline-start: 0.625rem;
409
+ }
410
+
411
+ .hagilight-article-promotion__cta-avatar {
412
+ flex: none;
413
+ width: 3.25rem;
414
+ }
415
+
416
+ .hagilight-article-promotion__cta-avatar:not([data-random-fan]) {
417
+ width: 2.25rem;
418
+ aspect-ratio: 1;
419
+ }
420
+
421
+ .hagilight-article-promotion__cta-avatar:not([data-random-fan]) img {
422
+ height: 100%;
423
+ border-radius: 50%;
424
+ object-fit: cover;
473
425
  }
474
426
 
475
427
  .hagilight-article-promotion picture[data-random-fan] :global(.hagilight-fan) {
@@ -478,7 +430,6 @@ const gallery = copy.gallery.flatMap((item) => {
478
430
  display: block;
479
431
  }
480
432
 
481
- .hagilight-article-promotion figure:hover picture[data-random-fan] img[data-fan-out],
482
433
  .hagilight-article-promotion picture[data-random-fan] img[data-fan-out] {
483
434
  opacity: 0;
484
435
  transform: scale(0.9);
@@ -490,21 +441,18 @@ const gallery = copy.gallery.flatMap((item) => {
490
441
  transform: scale(0.6);
491
442
  }
492
443
 
493
- .hagilight-article-promotion figure:hover picture[data-random-fan] :global(.hagilight-fan__card[data-slot="0"]),
494
444
  .hagilight-article-promotion picture[data-random-fan] :global(.hagilight-fan__card[data-slot="0"]) {
495
445
  z-index: 1;
496
446
  opacity: 1;
497
447
  transform: translate(-11%, 2%) rotate(-17deg);
498
448
  }
499
449
 
500
- .hagilight-article-promotion figure:hover picture[data-random-fan] :global(.hagilight-fan__card[data-slot="1"]),
501
450
  .hagilight-article-promotion picture[data-random-fan] :global(.hagilight-fan__card[data-slot="1"]) {
502
451
  z-index: 3;
503
452
  opacity: 1;
504
453
  transform: none;
505
454
  }
506
455
 
507
- .hagilight-article-promotion figure:hover picture[data-random-fan] :global(.hagilight-fan__card[data-slot="2"]),
508
456
  .hagilight-article-promotion picture[data-random-fan] :global(.hagilight-fan__card[data-slot="2"]) {
509
457
  z-index: 2;
510
458
  opacity: 1;
@@ -591,51 +539,16 @@ const gallery = copy.gallery.flatMap((item) => {
591
539
  user-select: all;
592
540
  }
593
541
 
594
- /* Medium: pillars become a three-up row, the gallery a mosaic, the closing two columns. */
542
+ /* Medium: pillars become a three-up row, the closing band two columns. */
595
543
  @container (min-width: 36rem) {
596
544
  .hagilight-article-promotion__features {
597
545
  grid-template-columns: repeat(3, minmax(0, 1fr));
598
546
  }
599
547
 
600
- /*
601
- * Mosaic in reading order: the workbench and the proposal strip stack in the left column
602
- * beside the tall Hero Scenario panel. The 1.1fr split lands the image bottoms of both columns within
603
- * a caption's height of each other for the current screenshots; the placement assumes exactly
604
- * three gallery images.
605
- */
606
- .hagilight-article-promotion__gallery {
607
- grid-template-columns: minmax(0, 1.1fr) minmax(0, 1fr);
608
- align-items: start;
609
- }
610
-
611
- .hagilight-article-promotion__gallery li:nth-child(1) {
612
- grid-column: 1;
613
- grid-row: 1;
614
- }
615
-
616
- .hagilight-article-promotion__gallery li:nth-child(2) {
617
- grid-column: 1;
618
- grid-row: 2;
619
- }
620
-
621
- .hagilight-article-promotion__gallery li:nth-child(3) {
622
- grid-column: 2;
623
- grid-row: 1 / span 2;
624
- }
625
-
626
548
  .hagilight-article-promotion__closing {
627
549
  grid-template-columns: repeat(2, minmax(0, 1fr));
628
550
  gap: 2rem;
629
551
  }
630
-
631
- .hagilight-article-promotion__gallery li:nth-child(4) {
632
- grid-column: 1 / -1;
633
- }
634
-
635
- .hagilight-article-promotion__gallery li:nth-child(4) figure {
636
- grid-template-columns: minmax(0, 12rem) minmax(0, 1fr);
637
- align-items: end;
638
- }
639
552
  }
640
553
 
641
554
  /* Wide: the pitch takes the left column and the pillars stack beside it. */
@@ -661,11 +574,9 @@ const gallery = copy.gallery.flatMap((item) => {
661
574
  }
662
575
 
663
576
  /*
664
- * The one authored moment: as the stage scrolls into view its accent rule draws across and the
665
- * screenshots rise into place one after another. Scroll-driven, so there is no JS and nothing
666
- * replays; engines without view timelines, and readers who ask for less motion, get the final
667
- * state. The animations start at 0.35 opacity, so a tall item that never reaches its full entry
668
- * range is still readable.
577
+ * The one authored moment: as the stage scrolls into view its accent rule draws across. Scroll-driven,
578
+ * so there is no JS and nothing replays; engines without view timelines, and readers who ask for less
579
+ * motion, get the final state.
669
580
  */
670
581
  @media (prefers-reduced-motion: no-preference) {
671
582
  @supports (animation-timeline: view()) {
@@ -676,26 +587,6 @@ const gallery = copy.gallery.flatMap((item) => {
676
587
  animation-timeline: view();
677
588
  animation-range: entry 0% entry 80%;
678
589
  }
679
-
680
- .hagilight-article-promotion__gallery li {
681
- animation-name: hagilight-promotion-rise;
682
- animation-timing-function: cubic-bezier(0.22, 1, 0.36, 1);
683
- animation-fill-mode: both;
684
- animation-timeline: view();
685
- animation-range: entry 5% entry 45%;
686
- }
687
-
688
- .hagilight-article-promotion__gallery li:nth-child(2) {
689
- animation-range: entry 12% entry 52%;
690
- }
691
-
692
- .hagilight-article-promotion__gallery li:nth-child(3) {
693
- animation-range: entry 19% entry 59%;
694
- }
695
-
696
- .hagilight-article-promotion__gallery li:nth-child(4) {
697
- animation-range: entry 26% entry 66%;
698
- }
699
590
  }
700
591
  }
701
592
 
@@ -704,12 +595,4 @@ const gallery = copy.gallery.flatMap((item) => {
704
595
  transform: scaleX(0.04);
705
596
  }
706
597
  }
707
-
708
- @keyframes hagilight-promotion-rise {
709
- from {
710
- opacity: 0.35;
711
- translate: 0 1.75rem;
712
- scale: 0.97;
713
- }
714
- }
715
598
  </style>
package/README.md CHANGED
@@ -105,7 +105,7 @@ hagilight({ contentImages: { enabled: false } })
105
105
 
106
106
  ### HagiCode showcase
107
107
 
108
- After the body (and any translation notice) of every documentation article, the plugin renders a static HagiCode showcase: a headline, lead, and tagline with calls to action to the website and the documentation, three pillars (Smart, Efficient, Fun), a gallery with captions (three audited screenshots and one cat-head illustration), and a closing row with the Windows download button beside a selectable, copy-ready share sentence. The layout follows the showcase's own width: one column when narrow, a three-up pillar row, a gallery mosaic, and a two-column closing row from 36rem, and the pillars beside the pitch from 56rem (for example in the wide content mode). 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.
108
+ After the body (and any translation notice) of every documentation article, the plugin renders a static HagiCode showcase: a headline, lead, and tagline with calls to action to the website and the documentation, three pillars (Smart, Efficient, Fun), and a closing row with the Windows download button beside a selectable, copy-ready share sentence. The layout follows the showcase's own width: one column when narrow, a three-up pillar row, and a two-column closing row from 36rem, and the pillars beside the pitch from 56rem (for example in the wide content mode). 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.
109
109
 
110
110
  Turn it off for the whole site, or override it per article:
111
111
 
@@ -143,13 +143,13 @@ This is the only script the showcase loads: `https://get.microsoft.com/badge/ms-
143
143
 
144
144
  #### Assets and image traffic
145
145
 
146
- The gallery images and pillar icons live in `assets/showcase/`. The illustration `cat-head.webp` is the R2 object `cat-head-gallery/g067-pixar-style-3d-02.avif` (1024 px) upscaled to the 1200 px minimum; its manifest entry records the source and this transform, 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.
146
+ The pillar icons and the illustration `cat-head.webp` live in `assets/showcase/`. The three screenshots (`workbench`, `proposal-workflow`, `heroes`) were the footer gallery's images and are no longer rendered, but they remain shipped and in the manifest. The illustration is the R2 object `cat-head-gallery/g067-pixar-style-3d-02.avif` (1024 px) upscaled to the 1200 px minimum; its manifest entry records the source and this transform, 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.
147
147
 
148
148
  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.
149
149
 
150
150
  Budgets for the shipped sources, enforced by `npm test`: 768 KiB for all showcase sources together, 200 KiB per raster source (WebP only), and 8 KiB per SVG. `npm run build:example` also checks the built output: each delivered raster variant at most 200 KiB, the variants of one format at most 768 KiB together, and each AVIF variant smaller than the WebP variant of the same width.
151
151
 
152
- Each gallery image renders as a `<picture>` with an AVIF source, a WebP source, and a JPEG `<img>` fallback, at widths 480, 800, and the native width. The tiers are derived at the consumer's build from the shipped WebP, with the `sharp` service that Astro already bundles, so no conversion runs outside the site's own build and no external service is involved. The chain needs a transforming image service: with the passthrough `astro/assets/services/noop` service the tiers serve the original bytes, and the plugin logs one warning. Opaque images use the JPEG tier. The JPEG tier cannot carry transparency, so an image that needs alpha needs a PNG tier, which the component does not offer yet, and a budget review before it is added.
152
+ The illustration renders as a `<picture>` with an AVIF source, a WebP source, and a JPEG `<img>` fallback, at widths 96 and 192 for the call-to-action avatar. The tiers are derived at the consumer's build from the shipped WebP, with the `sharp` service that Astro already bundles, so no conversion runs outside the site's own build and no external service is involved. The chain needs a transforming image service: with the passthrough `astro/assets/services/noop` service the tiers serve the original bytes, and the plugin logs one warning. Opaque images use the JPEG tier. The JPEG tier cannot carry transparency, so an image that needs alpha needs a PNG tier, which the component does not offer yet, and a budget review before it is added.
153
153
 
154
154
  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.
155
155
 
@@ -165,9 +165,9 @@ To check a deployed site, run `curl -sI https://<site>/_astro/<file>.avif` with
165
165
 
166
166
  The copy and assets mirror `repos/web` and `repos/docs` in the HagiCode monorepo, which this package never edits.
167
167
 
168
- - **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 Scenario`, `Microsoft Store`, and `Windows` are never translated.
169
- - **Images:** audit the candidate, crop and convert it to WebP (the AVIF and JPEG tiers are derived at build time, so an opaque image needs no extra file), 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. The gallery mosaic places the first, second, and third catalog entries as the left top, left bottom, and right tall slot, so keep the three screenshots first. The illustration is the fourth entry: from 36rem it takes a full-width row with a 12 rem square and its caption, and it is the only gallery image that may change. To add a screenshot, revisit the placement in the component's `@container (min-width: 36rem)` block. `npm test` checks that the manifest, the files, the component registry, and the copy agree.
170
- - **Random illustration (R2 pool):** the `cat-head` entry in `assets/showcase/manifest.json` carries `source` (`repo: img-gen`, `album`, `objectKey`), its audit, and `pool` (`album`, `maxBytes` 200 KiB, `entries` with `key` and `bytes`). `ArticlePromotion.astro` builds the pool attribute (`data-random-fan` on the illustration's `<picture>`) at build time and renders `ArticlePromotionPicker.astro` only when the option is on. The picker runs `mountRandomFans`, so the illustration is dealt as the same turning fan of three cat heads as the footer avatar, at the illustration's 12 rem width. Refresh: take keys from the `cat-head-gallery` album `index.json`, keep 12 to 200 unique keys each within `maxBytes`, audit them text-free and current, update `pool.entries`, and keep the footer pool in `repos/hagilight/packages/core/assets/footer/manifest.json` in step. To rebuild the WebP, resize the source to 1200 px (lanczos3) and encode at quality 88. `npm test` (`test/showcase-assets.test.mjs`) checks the entry, the pool, the byte caps and the budgets.
168
+ - **Copy:** edit `src/article-promotion-copy/<locale>.ts` (every locale must keep the same fields and feature 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 Scenario`, `Microsoft Store`, and `Windows` are never translated.
169
+ - **Images:** the article footer shows no image now. To show one again, audit the candidate, crop and convert it to WebP (the AVIF and JPEG tiers are derived at build time, so an opaque image needs no extra file), add its `manifest.json` entry, and import it in `ArticlePromotion.astro`. `npm test` (`test/showcase-assets.test.mjs`) checks that the manifest, the files, and the component imports agree.
170
+ - **Random illustration (R2 pool):** the `cat-head` entry in `assets/showcase/manifest.json` carries `source` (`repo: img-gen`, `album`, `objectKey`), its audit, and `pool` (`album`, `maxBytes` 200 KiB, `entries` with `key` and `bytes`). `ArticlePromotion.astro` leads the primary "visit HagiCode" call to action with the illustration as a decorative, captionless `<picture>`. When the `randomAvatar` option is on it carries `data-random-fan` and renders `ArticlePromotionPicker.astro`, so the button shows the turning fan; when it is off the illustration stays a static round avatar. Refresh: take keys from the `cat-head-gallery` album `index.json`, keep 12 to 200 unique keys each within `maxBytes`, audit them text-free and current, update `pool.entries`, and keep the footer pool in `repos/hagilight/packages/core/assets/footer/manifest.json` in step. To rebuild the WebP, resize the source to 1200 px (lanczos3) and encode at quality 88. `npm test` (`test/showcase-assets.test.mjs`) checks the entry, the pool, the byte caps and the budgets.
171
171
  - **Options:** `hagicodePromotion: { randomAvatar: false }` keeps the default illustration and loads no picker; `footer: { avatar: false }` removes the footer avatar, and `footer: { randomAvatar: false }` keeps its default. A site whose `img-src` policy blocks `https://img-gen.hagicode.com` keeps the defaults.
172
172
  - **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.
173
173
 
@@ -2,7 +2,6 @@ declare const _default: {
2
2
  title: string;
3
3
  lead: string;
4
4
  subheadline: string;
5
- imageAlt: string;
6
5
  features: ({
7
6
  id: "smart";
8
7
  label: string;
@@ -18,12 +17,6 @@ declare const _default: {
18
17
  })[];
19
18
  visitLabel: string;
20
19
  docsLabel: string;
21
- galleryHeading: string;
22
- gallery: {
23
- id: string;
24
- caption: string;
25
- alt: string;
26
- }[];
27
20
  windowsLabel: string;
28
21
  windowsStoreLabel: string;
29
22
  windowsStoreAriaLabel: string;
@@ -1,9 +1,7 @@
1
- const workbenchAlt = 'HagiCode-Werkbank mit einem Kanban-Board der Sitzungen in den Spalten Ausstehend, In Bearbeitung und Archiviert.';
2
1
  export default {
3
2
  title: 'HagiCode',
4
3
  lead: 'HagiCode ist ein agentischer Coding-Arbeitsplatz. Vielseitige, komfortable Interaktionen in der Benutzeroberfläche machen Planung, Agent-Ausführung und Projektarbeit zugänglich und leicht nachvollziehbar – für ein ansprechendes Entwicklungserlebnis.',
5
4
  subheadline: 'Entdecken Sie ein ansprechendes Entwicklungserlebnis mit vielseitigen, komfortablen Interaktionen in der Benutzeroberfläche.',
6
- imageAlt: workbenchAlt,
7
5
  features: [
8
6
  { id: 'smart', label: 'Intelligent', description: 'OpenSpec-Workflows machen aus einer Absicht einen umsetzbaren Weg vom Vorschlag über Design und Aufgaben bis zur Auslieferung.' },
9
7
  { 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.' },
@@ -11,29 +9,6 @@ export default {
11
9
  ],
12
10
  visitLabel: 'HagiCode besuchen',
13
11
  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 Scenario: Helden erledigen die Arbeit, Sie behalten Fortschritt, Level und Geschichte im Blick.',
29
- alt: 'Bereich Hero Scenario von HagiCode namens Ember Keep mit drei laufenden Helden samt Level, Fortschritt und Geschichtstext.',
30
- },
31
- {
32
- id: 'cat-head',
33
- caption: 'Illustration: ein Katzenkopf-Porträt aus dem HagiCode-Illustrationsset, das bei jedem Besuch wechselt.',
34
- alt: 'Stilisierte Katzenkopf-Illustration aus dem HagiCode-Illustrationsset.',
35
- },
36
- ],
37
12
  windowsLabel: 'Für Windows herunterladen',
38
13
  windowsStoreLabel: 'Im Microsoft Store erhalten',
39
14
  windowsStoreAriaLabel: 'HagiCode im Microsoft Store öffnen',
@@ -2,7 +2,6 @@ declare const _default: {
2
2
  title: string;
3
3
  lead: string;
4
4
  subheadline: string;
5
- imageAlt: string;
6
5
  features: ({
7
6
  id: "smart";
8
7
  label: string;
@@ -18,12 +17,6 @@ declare const _default: {
18
17
  })[];
19
18
  visitLabel: string;
20
19
  docsLabel: string;
21
- galleryHeading: string;
22
- gallery: {
23
- id: string;
24
- caption: string;
25
- alt: string;
26
- }[];
27
20
  windowsLabel: string;
28
21
  windowsStoreLabel: string;
29
22
  windowsStoreAriaLabel: string;
@@ -1,9 +1,7 @@
1
- const workbenchAlt = 'HagiCode workbench showing a session kanban board with Pending, In Progress, and Archived columns.';
2
1
  export default {
3
2
  title: 'HagiCode',
4
3
  lead: 'HagiCode is an agentic coding workspace. Rich, convenient UI interactions make planning, agent execution, and project work approachable and easy to navigate, creating an engaging development experience.',
5
4
  subheadline: 'Explore an engaging development experience through rich, convenient UI interactions.',
6
- imageAlt: workbenchAlt,
7
5
  features: [
8
6
  { id: 'smart', label: 'Smart', description: 'OpenSpec workflows turn intent into an executable path, from proposal to design, tasks, and a shipped change.' },
9
7
  { id: 'efficient', label: 'Efficient', description: 'Multi-agent execution keeps research, implementation, and review moving in parallel, across several repositories and the Agent CLIs you already use.' },
@@ -11,29 +9,6 @@ export default {
11
9
  ],
12
10
  visitLabel: 'Visit HagiCode',
13
11
  docsLabel: 'Read the documentation',
14
- galleryHeading: 'HagiCode at a glance',
15
- gallery: [
16
- {
17
- id: 'workbench',
18
- caption: 'The workbench: every session on one kanban board.',
19
- alt: workbenchAlt,
20
- },
21
- {
22
- id: 'proposal-workflow',
23
- caption: 'A proposal moves from created to drafted, reviewed, executed, and archived.',
24
- alt: 'HagiCode proposal stage bar from Created to Archived, with the Execution Completed stage highlighted and an Archive Plan button.',
25
- },
26
- {
27
- id: 'heroes',
28
- caption: 'Hero Scenario: heroes run the work while you follow progress, levels, and story.',
29
- alt: 'HagiCode Hero Scenario panel named Ember Keep, listing three running heroes with their level, progress, and story text.',
30
- },
31
- {
32
- id: 'cat-head',
33
- caption: 'Illustration: a cat-head portrait from the HagiCode illustration set, one of many that change between visits.',
34
- alt: 'Stylized cat-head illustration from the HagiCode illustration set.',
35
- },
36
- ],
37
12
  windowsLabel: 'Download for Windows',
38
13
  windowsStoreLabel: 'Get it from Microsoft Store',
39
14
  windowsStoreAriaLabel: 'Open HagiCode on Microsoft Store',
@@ -2,7 +2,6 @@ declare const _default: {
2
2
  title: string;
3
3
  lead: string;
4
4
  subheadline: string;
5
- imageAlt: string;
6
5
  features: ({
7
6
  id: "smart";
8
7
  label: string;
@@ -18,12 +17,6 @@ declare const _default: {
18
17
  })[];
19
18
  visitLabel: string;
20
19
  docsLabel: string;
21
- galleryHeading: string;
22
- gallery: {
23
- id: string;
24
- caption: string;
25
- alt: string;
26
- }[];
27
20
  windowsLabel: string;
28
21
  windowsStoreLabel: string;
29
22
  windowsStoreAriaLabel: string;
@@ -1,9 +1,7 @@
1
- const workbenchAlt = 'Banco de trabajo de HagiCode con un tablero kanban de sesiones en las columnas Pendiente, En curso y Archivado.';
2
1
  export default {
3
2
  title: 'HagiCode',
4
3
  lead: 'HagiCode es un espacio de programación con agentes. Las interacciones de interfaz, ricas y cómodas, hacen que planificar, ejecutar agentes y trabajar en proyectos sea accesible y fácil de seguir, para una experiencia de desarrollo atractiva.',
5
4
  subheadline: 'Una experiencia de desarrollo atractiva gracias a interacciones de interfaz ricas y cómodas.',
6
- imageAlt: workbenchAlt,
7
5
  features: [
8
6
  { id: 'smart', label: 'Inteligente', description: 'Los flujos de trabajo de OpenSpec convierten la intención en un itinerario ejecutable, de la propuesta al diseño, las tareas y la entrega.' },
9
7
  { id: 'efficient', label: 'Eficiente', description: 'La ejecución multiagente avanza en paralelo con la investigación, la implementación y la revisión, en varios repositorios y con los Agent CLI que ya usas.' },
@@ -11,29 +9,6 @@ export default {
11
9
  ],
12
10
  visitLabel: 'Visitar HagiCode',
13
11
  docsLabel: 'Leer la documentación',
14
- galleryHeading: 'HagiCode de un vistazo',
15
- gallery: [
16
- {
17
- id: 'workbench',
18
- caption: 'El banco de trabajo: todas las sesiones en un solo tablero kanban.',
19
- alt: workbenchAlt,
20
- },
21
- {
22
- id: 'proposal-workflow',
23
- caption: 'Una propuesta pasa de creada a redactada, revisada, ejecutada y archivada.',
24
- alt: 'Barra de etapas de una propuesta de HagiCode, de Creada a Archivada, con la etapa Ejecución completada resaltada y un botón Archivar plan.',
25
- },
26
- {
27
- id: 'heroes',
28
- caption: 'Hero Scenario: los héroes sacan adelante el trabajo mientras sigues el progreso, los niveles y la historia.',
29
- alt: 'Panel Hero Scenario de HagiCode llamado Ember Keep, con tres héroes en ejecución y su nivel, progreso y texto de la historia.',
30
- },
31
- {
32
- id: 'cat-head',
33
- caption: 'Ilustración: un retrato de cabeza de gato del conjunto de ilustraciones de HagiCode, que cambia en cada visita.',
34
- alt: 'Ilustración estilizada de una cabeza de gato del conjunto de ilustraciones de HagiCode.',
35
- },
36
- ],
37
12
  windowsLabel: 'Descargar para Windows',
38
13
  windowsStoreLabel: 'Obtenerlo en Microsoft Store',
39
14
  windowsStoreAriaLabel: 'Abrir HagiCode en Microsoft Store',
@@ -2,7 +2,6 @@ declare const _default: {
2
2
  title: string;
3
3
  lead: string;
4
4
  subheadline: string;
5
- imageAlt: string;
6
5
  features: ({
7
6
  id: "smart";
8
7
  label: string;
@@ -18,12 +17,6 @@ declare const _default: {
18
17
  })[];
19
18
  visitLabel: string;
20
19
  docsLabel: string;
21
- galleryHeading: string;
22
- gallery: {
23
- id: string;
24
- caption: string;
25
- alt: string;
26
- }[];
27
20
  windowsLabel: string;
28
21
  windowsStoreLabel: string;
29
22
  windowsStoreAriaLabel: string;
@@ -1,9 +1,7 @@
1
- const workbenchAlt = 'Établi HagiCode affichant un tableau kanban des sessions avec les colonnes En attente, En cours et Archivé.';
2
1
  export default {
3
2
  title: 'HagiCode',
4
3
  lead: 'HagiCode est un espace de développement agentique. Des interactions d’interface riches et pratiques rendent la planification, l’exécution des agents et le travail sur les projets accessibles et faciles à suivre, pour une expérience de développement engageante.',
5
4
  subheadline: 'Une expérience de développement engageante grâce à des interactions d’interface riches et pratiques.',
6
- imageAlt: workbenchAlt,
7
5
  features: [
8
6
  { id: 'smart', label: 'Intelligent', description: 'Les workflows OpenSpec transforment une intention en parcours exécutable, de la proposition à la livraison en passant par la conception et les tâches.' },
9
7
  { id: 'efficient', label: 'Efficace', description: 'L’exécution multi-agent fait avancer recherche, réalisation et revue en parallèle, sur plusieurs dépôts et avec les Agent CLI que vous utilisez déjà.' },
@@ -11,29 +9,6 @@ export default {
11
9
  ],
12
10
  visitLabel: 'Visiter HagiCode',
13
11
  docsLabel: 'Lire la documentation',
14
- galleryHeading: 'HagiCode en un coup d’œil',
15
- gallery: [
16
- {
17
- id: 'workbench',
18
- caption: 'L’établi : toutes les sessions sur un seul tableau kanban.',
19
- alt: workbenchAlt,
20
- },
21
- {
22
- id: 'proposal-workflow',
23
- caption: 'Une proposition passe de créée à rédigée, revue, exécutée puis archivée.',
24
- alt: 'Barre d’étapes d’une proposition HagiCode, de Créée à Archivée, avec l’étape Exécution terminée mise en évidence et un bouton Archiver le plan.',
25
- },
26
- {
27
- id: 'heroes',
28
- caption: 'Hero Scenario : les héros avancent le travail pendant que vous suivez progression, niveaux et récit.',
29
- alt: 'Panneau Hero Scenario de HagiCode nommé Ember Keep, listant trois héros en cours avec leur niveau, leur progression et le texte du récit.',
30
- },
31
- {
32
- id: 'cat-head',
33
- caption: 'Illustration : un portrait de tête de chat tiré de l’ensemble d’illustrations HagiCode, qui change à chaque visite.',
34
- alt: 'Illustration stylisée d’une tête de chat tirée de l’ensemble d’illustrations HagiCode.',
35
- },
36
- ],
37
12
  windowsLabel: 'Télécharger pour Windows',
38
13
  windowsStoreLabel: 'Obtenir sur le Microsoft Store',
39
14
  windowsStoreAriaLabel: 'Ouvrir HagiCode sur le Microsoft Store',
@@ -2,7 +2,6 @@ declare const _default: {
2
2
  title: string;
3
3
  lead: string;
4
4
  subheadline: string;
5
- imageAlt: string;
6
5
  features: ({
7
6
  id: "smart";
8
7
  label: string;
@@ -18,12 +17,6 @@ declare const _default: {
18
17
  })[];
19
18
  visitLabel: string;
20
19
  docsLabel: string;
21
- galleryHeading: string;
22
- gallery: {
23
- id: string;
24
- caption: string;
25
- alt: string;
26
- }[];
27
20
  windowsLabel: string;
28
21
  windowsStoreLabel: string;
29
22
  windowsStoreAriaLabel: string;
@@ -1,9 +1,7 @@
1
- const workbenchAlt = 'HagiCode のワークベンチ。保留中・進行中・アーカイブ済みの 3 列を持つセッションのカンバンボード。';
2
1
  export default {
3
2
  title: 'HagiCode',
4
3
  lead: 'HagiCode はエージェント型コーディングワークスペースです。豊富で便利な UI インタラクションにより、計画・エージェント実行・プロジェクト作業を始めやすく、進めやすくし、開発をより魅力的な体験にします。',
5
4
  subheadline: '豊富で便利な UI インタラクションで、計画からプロジェクト作業までを分かりやすく進められます。',
6
- imageAlt: workbenchAlt,
7
5
  features: [
8
6
  { id: 'smart', label: 'スマート', description: 'OpenSpec ワークフローが意図を、提案・設計・タスクから変更のリリースまで実行可能な道筋にします。' },
9
7
  { id: 'efficient', label: '効率的', description: 'マルチエージェント実行で調査・実装・レビューを並行して進め、複数リポジトリや使い慣れた Agent CLI にも対応します。' },
@@ -11,29 +9,6 @@ export default {
11
9
  ],
12
10
  visitLabel: 'HagiCode を見る',
13
11
  docsLabel: 'ドキュメントを読む',
14
- galleryHeading: 'HagiCode の概要',
15
- gallery: [
16
- {
17
- id: 'workbench',
18
- caption: 'ワークベンチ:すべてのセッションを 1 つのカンバンボードに集約。',
19
- alt: workbenchAlt,
20
- },
21
- {
22
- id: 'proposal-workflow',
23
- caption: '提案は作成、起草、レビューを経て、実行とアーカイブへ進みます。',
24
- alt: 'HagiCode の提案ステージバー。作成済みからアーカイブ済みまで並び、実行完了のステージが強調され、プランをアーカイブするボタンがある。',
25
- },
26
- {
27
- id: 'heroes',
28
- caption: 'Hero Scenario:ヒーローが作業を進め、進行状況・レベル・物語を見守れます。',
29
- alt: 'HagiCode の Hero Scenario パネル「Ember Keep」。実行中の 3 人のヒーローのレベル、進行状況、物語のテキストが並ぶ。',
30
- },
31
- {
32
- id: 'cat-head',
33
- caption: 'イラスト:HagiCode のイラスト集にある猫の頭部の肖像。訪問するたびに入れ替わります。',
34
- alt: 'HagiCode のイラスト集から。様式化された猫の頭部のイラストです。',
35
- },
36
- ],
37
12
  windowsLabel: 'Windows 版をダウンロード',
38
13
  windowsStoreLabel: 'Microsoft Store で入手',
39
14
  windowsStoreAriaLabel: 'Microsoft Store で HagiCode を開く',
@@ -2,7 +2,6 @@ declare const _default: {
2
2
  title: string;
3
3
  lead: string;
4
4
  subheadline: string;
5
- imageAlt: string;
6
5
  features: ({
7
6
  id: "smart";
8
7
  label: string;
@@ -18,12 +17,6 @@ declare const _default: {
18
17
  })[];
19
18
  visitLabel: string;
20
19
  docsLabel: string;
21
- galleryHeading: string;
22
- gallery: {
23
- id: string;
24
- caption: string;
25
- alt: string;
26
- }[];
27
20
  windowsLabel: string;
28
21
  windowsStoreLabel: string;
29
22
  windowsStoreAriaLabel: string;
@@ -1,9 +1,7 @@
1
- const workbenchAlt = '대기, 진행 중, 보관됨 세 열로 이루어진 세션 칸반 보드가 보이는 HagiCode 작업대 화면.';
2
1
  export default {
3
2
  title: 'HagiCode',
4
3
  lead: 'HagiCode는 에이전트 코딩 작업 공간입니다. 풍부하고 편리한 UI 상호작용으로 계획 수립, 에이전트 실행, 프로젝트 작업을 쉽게 시작하고 따라가며 개발을 더 흥미로운 경험으로 만듭니다.',
5
4
  subheadline: '풍부하고 편리한 UI 상호작용으로 계획부터 프로젝트 작업까지 쉽게 따라갈 수 있습니다.',
6
- imageAlt: workbenchAlt,
7
5
  features: [
8
6
  { id: 'smart', label: '스마트', description: 'OpenSpec 워크플로는 의도를 제안, 설계, 작업을 거쳐 배포까지 이어지는 실행 가능한 경로로 바꿉니다.' },
9
7
  { id: 'efficient', label: '효율적', description: '다중 에이전트 실행으로 조사, 구현, 검토를 병렬로 진행하며 여러 저장소와 익숙한 Agent CLI를 지원합니다.' },
@@ -11,29 +9,6 @@ export default {
11
9
  ],
12
10
  visitLabel: 'HagiCode 방문',
13
11
  docsLabel: '문서 읽기',
14
- galleryHeading: 'HagiCode 한눈에 보기',
15
- gallery: [
16
- {
17
- id: 'workbench',
18
- caption: '작업대: 모든 세션을 하나의 칸반 보드에 모았습니다.',
19
- alt: workbenchAlt,
20
- },
21
- {
22
- id: 'proposal-workflow',
23
- caption: '제안은 생성, 초안 작성, 검토를 거쳐 실행과 보관으로 이어집니다.',
24
- alt: '생성됨부터 보관됨까지의 단계 표시줄에서 실행 완료 단계가 강조되고 계획 보관 버튼이 있는 HagiCode 제안 화면.',
25
- },
26
- {
27
- id: 'heroes',
28
- caption: 'Hero Scenario: 영웅이 작업을 진행하고, 당신은 진행 상황과 레벨, 이야기를 지켜봅니다.',
29
- alt: 'Ember Keep이라는 이름의 HagiCode Hero Scenario 패널. 실행 중인 영웅 세 명의 레벨, 진행률, 이야기 문구가 표시됩니다.',
30
- },
31
- {
32
- id: 'cat-head',
33
- caption: '일러스트: HagiCode 일러스트 세트의 고양이 머리 초상. 방문할 때마다 바뀝니다.',
34
- alt: 'HagiCode 일러스트 세트의 양식화된 고양이 머리 일러스트.',
35
- },
36
- ],
37
12
  windowsLabel: 'Windows용 다운로드',
38
13
  windowsStoreLabel: 'Microsoft Store에서 받기',
39
14
  windowsStoreAriaLabel: 'Microsoft Store에서 HagiCode 열기',
@@ -2,7 +2,6 @@ declare const _default: {
2
2
  title: string;
3
3
  lead: string;
4
4
  subheadline: string;
5
- imageAlt: string;
6
5
  features: ({
7
6
  id: "smart";
8
7
  label: string;
@@ -18,12 +17,6 @@ declare const _default: {
18
17
  })[];
19
18
  visitLabel: string;
20
19
  docsLabel: string;
21
- galleryHeading: string;
22
- gallery: {
23
- id: string;
24
- caption: string;
25
- alt: string;
26
- }[];
27
20
  windowsLabel: string;
28
21
  windowsStoreLabel: string;
29
22
  windowsStoreAriaLabel: string;
@@ -1,9 +1,7 @@
1
- const workbenchAlt = 'Bancada do HagiCode com um quadro kanban de sessões nas colunas Pendente, Em andamento e Arquivado.';
2
1
  export default {
3
2
  title: 'HagiCode',
4
3
  lead: 'O HagiCode é um ambiente de programação com agentes. Interações de interface ricas e práticas tornam o planejamento, a execução de agentes e o trabalho em projetos mais acessíveis e fáceis de acompanhar, criando uma experiência de desenvolvimento envolvente.',
5
4
  subheadline: 'Uma experiência de desenvolvimento envolvente, com interações de interface ricas e práticas.',
6
- imageAlt: workbenchAlt,
7
5
  features: [
8
6
  { id: 'smart', label: 'Inteligente', description: 'Os fluxos de trabalho do OpenSpec transformam a intenção em um caminho executável, da proposta ao design, às tarefas e à entrega.' },
9
7
  { id: 'efficient', label: 'Eficiente', description: 'A execução multiagente mantém pesquisa, implementação e revisão em andamento em paralelo, em vários repositórios e com os Agent CLI que você já usa.' },
@@ -11,29 +9,6 @@ export default {
11
9
  ],
12
10
  visitLabel: 'Acessar HagiCode',
13
11
  docsLabel: 'Ler a documentação',
14
- galleryHeading: 'O HagiCode em resumo',
15
- gallery: [
16
- {
17
- id: 'workbench',
18
- caption: 'A bancada: todas as sessões em um único quadro kanban.',
19
- alt: workbenchAlt,
20
- },
21
- {
22
- id: 'proposal-workflow',
23
- caption: 'Uma proposta passa de criada a redigida, revisada, executada e arquivada.',
24
- alt: 'Barra de etapas de uma proposta do HagiCode, de Criada a Arquivada, com a etapa Execução concluída em destaque e um botão Arquivar plano.',
25
- },
26
- {
27
- id: 'heroes',
28
- caption: 'Hero Scenario: os heróis tocam o trabalho enquanto você acompanha progresso, níveis e história.',
29
- alt: 'Painel Hero Scenario do HagiCode chamado Ember Keep, com três heróis em execução e seu nível, progresso e texto da história.',
30
- },
31
- {
32
- id: 'cat-head',
33
- caption: 'Ilustração: um retrato de cabeça de gato do conjunto de ilustrações do HagiCode, que muda a cada visita.',
34
- alt: 'Ilustração estilizada de uma cabeça de gato do conjunto de ilustrações do HagiCode.',
35
- },
36
- ],
37
12
  windowsLabel: 'Baixar para Windows',
38
13
  windowsStoreLabel: 'Obter na Microsoft Store',
39
14
  windowsStoreAriaLabel: 'Abrir o HagiCode na Microsoft Store',
@@ -2,7 +2,6 @@ declare const _default: {
2
2
  title: string;
3
3
  lead: string;
4
4
  subheadline: string;
5
- imageAlt: string;
6
5
  features: ({
7
6
  id: "smart";
8
7
  label: string;
@@ -18,12 +17,6 @@ declare const _default: {
18
17
  })[];
19
18
  visitLabel: string;
20
19
  docsLabel: string;
21
- galleryHeading: string;
22
- gallery: {
23
- id: string;
24
- caption: string;
25
- alt: string;
26
- }[];
27
20
  windowsLabel: string;
28
21
  windowsStoreLabel: string;
29
22
  windowsStoreAriaLabel: string;
@@ -1,9 +1,7 @@
1
- const workbenchAlt = 'Рабочее место HagiCode: канбан-доска сессий со столбцами «Ожидает», «В работе» и «В архиве».';
2
1
  export default {
3
2
  title: 'HagiCode',
4
3
  lead: 'HagiCode — агентная среда разработки. Насыщенные и удобные взаимодействия с интерфейсом делают планирование, работу агентов и проектные задачи понятными и доступными, превращая разработку в увлекательный процесс.',
5
4
  subheadline: 'Насыщенные и удобные взаимодействия с интерфейсом помогают легче планировать, запускать агентов и вести проектную работу.',
6
- imageAlt: workbenchAlt,
7
5
  features: [
8
6
  { id: 'smart', label: 'Умный', description: 'Рабочие процессы OpenSpec превращают намерение в исполнимый путь от предложения через дизайн и задачи до готового изменения.' },
9
7
  { id: 'efficient', label: 'Эффективный', description: 'Мультиагентное выполнение параллельно продвигает исследование, реализацию и проверку в нескольких репозиториях и с привычными Agent CLI.' },
@@ -11,29 +9,6 @@ export default {
11
9
  ],
12
10
  visitLabel: 'Перейти на HagiCode',
13
11
  docsLabel: 'Читать документацию',
14
- galleryHeading: 'HagiCode вкратце',
15
- gallery: [
16
- {
17
- id: 'workbench',
18
- caption: 'Рабочее место: все сессии на одной канбан-доске.',
19
- alt: workbenchAlt,
20
- },
21
- {
22
- id: 'proposal-workflow',
23
- caption: 'Предложение проходит путь от созданного до составленного, проверенного, выполненного и архивного.',
24
- alt: 'Полоса этапов предложения HagiCode от «Создано» до «В архиве»: выделен этап «Выполнение завершено», рядом кнопка «Архивировать план».',
25
- },
26
- {
27
- id: 'heroes',
28
- caption: 'Hero Scenario: герои ведут работу, а вы следите за прогрессом, уровнями и сюжетом.',
29
- alt: 'Панель Hero Scenario в HagiCode под названием Ember Keep: три работающих героя с уровнем, прогрессом и текстом сюжета.',
30
- },
31
- {
32
- id: 'cat-head',
33
- caption: 'Иллюстрация: портрет головы кота из набора иллюстраций HagiCode, который меняется при каждом визите.',
34
- alt: 'Стилизованная иллюстрация головы кота из набора иллюстраций HagiCode.',
35
- },
36
- ],
37
12
  windowsLabel: 'Скачать для Windows',
38
13
  windowsStoreLabel: 'Получить в Microsoft Store',
39
14
  windowsStoreAriaLabel: 'Открыть HagiCode в Microsoft Store',
@@ -2,7 +2,6 @@ declare const _default: {
2
2
  title: string;
3
3
  lead: string;
4
4
  subheadline: string;
5
- imageAlt: string;
6
5
  features: ({
7
6
  id: "smart";
8
7
  label: string;
@@ -18,12 +17,6 @@ declare const _default: {
18
17
  })[];
19
18
  visitLabel: string;
20
19
  docsLabel: string;
21
- galleryHeading: string;
22
- gallery: {
23
- id: string;
24
- caption: string;
25
- alt: string;
26
- }[];
27
20
  windowsLabel: string;
28
21
  windowsStoreLabel: string;
29
22
  windowsStoreAriaLabel: string;
@@ -1,9 +1,7 @@
1
- const workbenchAlt = 'HagiCode 工作台截图,会话看板分为待处理、进行中与已归档三列。';
2
1
  export default {
3
2
  title: 'HagiCode',
4
3
  lead: 'HagiCode 是面向项目开发的 AI 编码工作台:丰富、便捷的界面交互让规划、Agent 执行与项目工作更容易上手和跟进,带来更投入的开发体验。',
5
4
  subheadline: '丰富、便捷的界面交互,让规划、Agent 执行与项目工作更容易上手和跟进。',
6
- imageAlt: workbenchAlt,
7
5
  features: [
8
6
  { id: 'smart', label: '智能', description: 'OpenSpec 工作流把意图转化为从提案、设计、任务到交付的可执行路径。' },
9
7
  { id: 'efficient', label: '高效', description: '多 Agent 并行推进调研、实现与审阅,并支持多仓库变更和你熟悉的 Agent CLI。' },
@@ -11,29 +9,6 @@ export default {
11
9
  ],
12
10
  visitLabel: '访问 HagiCode',
13
11
  docsLabel: '阅读文档',
14
- galleryHeading: '一览 HagiCode',
15
- gallery: [
16
- {
17
- id: 'workbench',
18
- caption: '工作台:所有会话汇集在同一块看板上。',
19
- alt: workbenchAlt,
20
- },
21
- {
22
- id: 'proposal-workflow',
23
- caption: '提案从创建、起草、审阅一路推进到执行与归档。',
24
- alt: 'HagiCode 提案阶段条截图,从已创建到已归档,当前高亮“执行完成”阶段并带有归档计划按钮。',
25
- },
26
- {
27
- id: 'heroes',
28
- caption: 'Hero Scenario:英雄推进工作,你随时查看进度、等级与剧情。',
29
- alt: 'HagiCode Hero Scenario 面板截图,名为 Ember Keep,列出三位运行中的英雄及其等级、进度与剧情文字。',
30
- },
31
- {
32
- id: 'cat-head',
33
- caption: '插图:HagiCode 插画集中的一幅猫头像,每次访问会换一幅。',
34
- alt: '风格化的猫头插图,来自 HagiCode 插画集。',
35
- },
36
- ],
37
12
  windowsLabel: '下载 Windows 版',
38
13
  windowsStoreLabel: '从 Microsoft Store 获取',
39
14
  windowsStoreAriaLabel: '在 Microsoft Store 中打开 HagiCode',
@@ -2,7 +2,6 @@ declare const _default: {
2
2
  title: string;
3
3
  lead: string;
4
4
  subheadline: string;
5
- imageAlt: string;
6
5
  features: ({
7
6
  id: "smart";
8
7
  label: string;
@@ -18,12 +17,6 @@ declare const _default: {
18
17
  })[];
19
18
  visitLabel: string;
20
19
  docsLabel: string;
21
- galleryHeading: string;
22
- gallery: {
23
- id: string;
24
- caption: string;
25
- alt: string;
26
- }[];
27
20
  windowsLabel: string;
28
21
  windowsStoreLabel: string;
29
22
  windowsStoreAriaLabel: string;
@@ -1,9 +1,7 @@
1
- const workbenchAlt = 'HagiCode 工作台畫面,工作階段看板分為待處理、進行中與已封存三欄。';
2
1
  export default {
3
2
  title: 'HagiCode',
4
3
  lead: 'HagiCode 是面向專案開發的 AI 編碼工作台:豐富、便利的介面互動讓規劃、Agent 執行與專案工作更容易上手和跟進,帶來更投入的開發體驗。',
5
4
  subheadline: '透過豐富、便利的介面互動,讓規劃、Agent 執行與專案工作更容易上手和跟進。',
6
- imageAlt: workbenchAlt,
7
5
  features: [
8
6
  { id: 'smart', label: '智慧', description: 'OpenSpec 工作流程將意圖轉化為從提案、設計、任務到交付的可執行路徑。' },
9
7
  { id: 'efficient', label: '高效', description: '多 Agent 並行推進研究、實作與審查,並支援多儲存庫變更與你熟悉的 Agent CLI。' },
@@ -11,29 +9,6 @@ export default {
11
9
  ],
12
10
  visitLabel: '造訪 HagiCode',
13
11
  docsLabel: '閱讀文件',
14
- galleryHeading: '一覽 HagiCode',
15
- gallery: [
16
- {
17
- id: 'workbench',
18
- caption: '工作台:所有工作階段集中在同一塊看板上。',
19
- alt: workbenchAlt,
20
- },
21
- {
22
- id: 'proposal-workflow',
23
- caption: '提案從建立、起草、審查一路推進到執行與封存。',
24
- alt: 'HagiCode 提案階段列畫面,從已建立到已封存,目前標示「執行完成」階段並附有封存計畫按鈕。',
25
- },
26
- {
27
- id: 'heroes',
28
- caption: 'Hero Scenario:英雄推進工作,你隨時查看進度、等級與劇情。',
29
- alt: 'HagiCode Hero Scenario 面板畫面,名為 Ember Keep,列出三位執行中的英雄及其等級、進度與劇情文字。',
30
- },
31
- {
32
- id: 'cat-head',
33
- caption: '插圖:HagiCode 插畫集中的一幅貓頭像,每次造訪會換一幅。',
34
- alt: '風格化的貓頭插圖,來自 HagiCode 插畫集。',
35
- },
36
- ],
37
12
  windowsLabel: '下載 Windows 版',
38
13
  windowsStoreLabel: '從 Microsoft Store 取得',
39
14
  windowsStoreAriaLabel: '在 Microsoft Store 開啟 HagiCode',
@@ -5,24 +5,14 @@ export interface ArticlePromotionFeature {
5
5
  label: string;
6
6
  description: string;
7
7
  }
8
- export interface ArticlePromotionGalleryItem {
9
- /** Matches an entry in `assets/showcase/manifest.json`. */
10
- id: string;
11
- caption: string;
12
- alt: string;
13
- }
14
8
  export interface ArticlePromotionCopy {
15
9
  title: string;
16
10
  lead: string;
17
11
  subheadline: string;
18
- /** Text alternative of the lead gallery image. */
19
- imageAlt: string;
20
12
  features: readonly ArticlePromotionFeature[];
21
13
  visitLabel: string;
22
14
  /** Secondary call to action. */
23
15
  docsLabel: string;
24
- galleryHeading: string;
25
- gallery: readonly ArticlePromotionGalleryItem[];
26
16
  /** Visible caption beside the Windows download button. */
27
17
  windowsLabel: string;
28
18
  /** Text of the static fallback link to the Microsoft Store listing. */
@@ -1,5 +1,5 @@
1
1
  import { getArticlePromotionCopy } from './article-promotion.js';
2
- export type { ArticlePromotionCopy as ShowcaseCopy, ArticlePromotionFeature as ShowcaseFeature, ArticlePromotionGalleryItem as ShowcaseGalleryItem, } from './article-promotion.js';
2
+ export type { ArticlePromotionCopy as ShowcaseCopy, ArticlePromotionFeature as ShowcaseFeature, } from './article-promotion.js';
3
3
  /** Returns the read-only showcase copy for a locale, or the English copy when the locale has none. */
4
4
  export declare const getShowcaseCopy: typeof getArticlePromotionCopy;
5
5
  /** Locales that have their own showcase copy. */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hagicode/hagilight-starlight",
3
- "version": "0.16.2-dev.170.1.abf7fea",
3
+ "version": "0.17.1-dev.175.1.77872ad",
4
4
  "type": "module",
5
5
  "description": "Starlight plugin and components for HagiCode documentation",
6
6
  "repository": {
@@ -53,7 +53,7 @@
53
53
  "assets/showcase/*"
54
54
  ],
55
55
  "dependencies": {
56
- "@hagicode/hagilight-core": "0.16.2-dev.170.1.abf7fea"
56
+ "@hagicode/hagilight-core": "0.17.1-dev.175.1.77872ad"
57
57
  },
58
58
  "peerDependencies": {
59
59
  "@astrojs/starlight": "^0.42.4",