pixelkiln 0.77.0 → 0.79.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -15409,7 +15409,12 @@ var AssetPatchSchema = import_zod8.z.object({
15409
15409
  width: import_zod8.z.number().int().nullable().optional(),
15410
15410
  height: import_zod8.z.number().int().nullable().optional(),
15411
15411
  size: import_zod8.z.number().int().nullable().optional(),
15412
- tags: import_zod8.z.array(import_zod8.z.string()).optional()
15412
+ tags: import_zod8.z.array(import_zod8.z.string()).optional(),
15413
+ /**
15414
+ * A loop shorthand's `animation.directions`, replaced whole: each named
15415
+ * direction is drawn, and each one's flip comes free as a mirror.
15416
+ */
15417
+ loopDirections: import_zod8.z.array(CharacterDirectionSchema).min(1).optional()
15413
15418
  }).strict();
15414
15419
  var NewStateSchema = import_zod8.z.object({
15415
15420
  /** Asset id of the parent this states; must already exist. */
@@ -15758,6 +15763,13 @@ function applyEdit(raw, edit) {
15758
15763
  if (patch.tags.length) asset.tags = patch.tags;
15759
15764
  else delete asset.tags;
15760
15765
  }
15766
+ if (patch.loopDirections) {
15767
+ const animation = asset.animation;
15768
+ if (!animation || !Array.isArray(animation.directions)) {
15769
+ throw new ManifestEditError(`asset "${edit.assetId}" is not a loop declared with animation.directions`);
15770
+ }
15771
+ asset.animation = { ...animation, directions: patch.loopDirections };
15772
+ }
15761
15773
  }
15762
15774
  async function withCandidate(manifestPath, edit, use, unchanged) {
15763
15775
  const absolute = import_node_path27.default.resolve(manifestPath);
@@ -16660,6 +16672,7 @@ async function buildGallerySnapshot(opts) {
16660
16672
  styleId: spec.styleId,
16661
16673
  assetId: spec.assetId,
16662
16674
  declared: true,
16675
+ declaredAs: loopShorthandOf(spec.assetId, loaded.loopFamilies) ?? spec.assetId,
16663
16676
  state: planItem.state,
16664
16677
  reason: planItem.reason,
16665
16678
  status: entry?.status ?? null,
@@ -16729,6 +16742,7 @@ async function buildGallerySnapshot(opts) {
16729
16742
  styleId: entry.styleId,
16730
16743
  assetId: entry.assetId,
16731
16744
  declared: false,
16745
+ declaredAs: null,
16732
16746
  state: "undeclared",
16733
16747
  reason: "not declared by the current manifest; `pixelkiln prune` removes the entry",
16734
16748
  status: entry.status,
@@ -17058,9 +17072,11 @@ ${css}</style>
17058
17072
  </select>
17059
17073
  <select id="group" aria-label="Group">
17060
17074
  <option value="style">Group: by style</option>
17075
+ <option value="family">Group: by family</option>
17061
17076
  <option value="none">Group: none</option>
17062
17077
  </select>
17063
17078
  <span id="editing" class="editing" hidden title="This gallery can write the manifest. It never contacts a provider.">editing</span>
17079
+ <button id="select" type="button" title="Pick several records to generate, regenerate, compare, or tag together (or ctrl/\u2318-click a card)">Select</button>
17064
17080
  <button id="studio" type="button" hidden title="Draft a new character: its style, base, loops, and portrait, priced as you go">+ New character</button>
17065
17081
  <button id="refresh" type="button" title="Re-read the manifest, lockfile, and disk">Refresh</button>
17066
17082
  <label class="chip" title="Refresh every 5 seconds while this tab is visible"><input id="auto" type="checkbox"> auto</label>
@@ -17074,6 +17090,7 @@ ${css}</style>
17074
17090
  <div id="tools"></div>
17075
17091
  </header>
17076
17092
  <main id="root"></main>
17093
+ <div id="selbar" class="selbar" hidden></div>
17077
17094
  <footer>
17078
17095
  Click a sprite for its full record; <kbd>shift</kbd>-click adds it to a side-by-side comparison. <kbd>\u2190</kbd>/<kbd>\u2192</kbd> step through the visible set while a record
17079
17096
  is open, <kbd>,</kbd>/<kbd>.</kbd> step a loop's frames and <kbd>space</kbd> plays it, <kbd>Esc</kbd> closes it, and <kbd>/</kbd> jumps to search. This page reads the manifest, lockfile,