@popcraft/kit 0.23.0 → 0.23.1

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 (75) hide show
  1. package/dist/chunks/{agent-BJBUTTSC.js → agent-4LLNDPKT.js} +1 -1
  2. package/dist/chunks/{builtin-CLB5OHKL.js → builtin-MPHCX2R5.js} +3 -3
  3. package/dist/chunks/{check-template-6XTDIBYY.js → check-template-SHZR37PA.js} +2 -2
  4. package/dist/chunks/{chunk-CTNYOI7K.js → chunk-2657F23X.js} +7 -7
  5. package/dist/chunks/{chunk-ELVQX6RI.js → chunk-3NGYOEXU.js} +1 -1
  6. package/dist/chunks/{chunk-RDAMU4OP.js → chunk-3ZAY3GT4.js} +36 -36
  7. package/dist/chunks/{chunk-SGMCUBDF.js → chunk-4QGD7QA4.js} +3 -1
  8. package/dist/chunks/{chunk-TKIMYBHW.js → chunk-6DCAGZ2E.js} +2 -2
  9. package/dist/chunks/{chunk-JWJCNSIJ.js → chunk-AOLURN4M.js} +4 -4
  10. package/dist/chunks/{chunk-DOYHR7LZ.js → chunk-B7WKCDVC.js} +2 -2
  11. package/dist/chunks/{chunk-45GKMBBU.js → chunk-BRFDRFQS.js} +2 -2
  12. package/dist/chunks/{chunk-U6FFZ5W2.js → chunk-CTLYNR44.js} +1 -1
  13. package/dist/chunks/{chunk-V55HSSYV.js → chunk-GCCKB3Z6.js} +14 -14
  14. package/dist/chunks/{chunk-M57KDGIH.js → chunk-GLPSWLOP.js} +1 -1
  15. package/dist/chunks/{chunk-SJHSD7GG.js → chunk-IMRJGGQP.js} +5 -5
  16. package/dist/chunks/{chunk-4JCGRWOD.js → chunk-IUS7V3NP.js} +1 -1
  17. package/dist/chunks/{chunk-VWNEKTT3.js → chunk-MRDE4OOE.js} +11 -11
  18. package/dist/chunks/{chunk-KHK5XLEO.js → chunk-NPRSEJCQ.js} +5 -5
  19. package/dist/chunks/{chunk-I323DRE7.js → chunk-OCOP2CEE.js} +5 -5
  20. package/dist/chunks/{chunk-NCALTIBW.js → chunk-ONACJFBL.js} +1 -1
  21. package/dist/chunks/{chunk-TBGBDPYT.js → chunk-OZV6WRBA.js} +1 -1
  22. package/dist/chunks/{chunk-PXATZ4UZ.js → chunk-QO6RCB54.js} +1 -1
  23. package/dist/chunks/{chunk-7XSGWFUU.js → chunk-R2OWUZAJ.js} +2 -2
  24. package/dist/chunks/{chunk-WI3UXGOB.js → chunk-RW7YO2KM.js} +4 -4
  25. package/dist/chunks/{chunk-LHCHUICU.js → chunk-SGCSBWBQ.js} +2 -2
  26. package/dist/chunks/{chunk-AZU5NJX4.js → chunk-SNAYCSJQ.js} +1 -1
  27. package/dist/chunks/{chunk-2HAVVRLV.js → chunk-SUEY4TWT.js} +1 -1
  28. package/dist/chunks/{chunk-KLFWJGV2.js → chunk-X4AMYXH5.js} +5 -5
  29. package/dist/chunks/{chunk-Y5J5V5U3.js → chunk-X5CV5NH3.js} +3 -3
  30. package/dist/chunks/{chunk-PPBHH7GH.js → chunk-Y2BZGNEC.js} +3 -3
  31. package/dist/chunks/{client-W74T4QJ2.js → client-KWUTPSTP.js} +2 -2
  32. package/dist/chunks/{client-7IOICWAQ.js → client-MBWEDONV.js} +1 -1
  33. package/dist/chunks/{client-6XBHKOQI.js → client-W6EWOEIJ.js} +2 -2
  34. package/dist/chunks/{client-actions-F5KAYWC6.js → client-actions-YXQGAUP6.js} +4 -4
  35. package/dist/chunks/{dangerous-SNCBW4IE.js → dangerous-O276OX7E.js} +3 -3
  36. package/dist/chunks/{editor-seams-GJIWTUEC.js → editor-seams-KWSXIJ6M.js} +9 -9
  37. package/dist/chunks/{editor-store-RJRX5NDT.js → editor-store-FWNCBZKH.js} +1 -1
  38. package/dist/chunks/{export-watermark-BWN23IRO.js → export-watermark-TNGKIW4U.js} +5 -5
  39. package/dist/chunks/{eyedropper-AL5LU2LC.js → eyedropper-WJ6CVJ2X.js} +1 -1
  40. package/dist/chunks/{generate-media-GQ2LGW2K.js → generate-media-3GLD745C.js} +2 -2
  41. package/dist/chunks/{host-QNEIW6XI.js → host-JR2OTWH6.js} +6 -6
  42. package/dist/chunks/{integrations-2MDKW4EY.js → integrations-PCEXPAMC.js} +1 -1
  43. package/dist/chunks/{libraries-HU55RMSB.js → libraries-ED7QA73Y.js} +5 -5
  44. package/dist/chunks/{live-FYSVG45I.js → live-SGMH3365.js} +1 -1
  45. package/dist/chunks/{media-tool-HX2AQWQN.js → media-tool-DL2Q5FVV.js} +1 -1
  46. package/dist/chunks/{new-file-7W7HWEBN.js → new-file-NKCOHO3I.js} +3 -3
  47. package/dist/chunks/{plugin-5XHYBTFQ.js → plugin-LF6PU2TS.js} +2 -2
  48. package/dist/chunks/{plugin-import-XVCJJZWW.js → plugin-import-JLZKU45F.js} +13 -13
  49. package/dist/chunks/{presence-KAKB2N46.js → presence-H2IHOP5C.js} +2 -2
  50. package/dist/chunks/{project-D3I2HSHS.js → project-GV6N7IZG.js} +1 -1
  51. package/dist/chunks/{publish-site-YN2YTC7C.js → publish-site-W4XW2UTB.js} +6 -6
  52. package/dist/chunks/{publish-store-GJYYCXKG.js → publish-store-CT5GERZC.js} +4 -4
  53. package/dist/chunks/{raster-actions-A4DJV5G2.js → raster-actions-UVOUSRCS.js} +1 -1
  54. package/dist/chunks/{runner-B6P6F7Y6.js → runner-YT2NM6N7.js} +16 -16
  55. package/dist/chunks/{store-TGA3GXXW.js → store-QMRWXCRN.js} +5 -5
  56. package/dist/chunks/{sync-BUK3N4AG.js → sync-6MJJNBNR.js} +5 -5
  57. package/dist/chunks/{tabs-K4HQLFPL.js → tabs-KCHJ6S2X.js} +8 -8
  58. package/dist/chunks/{team-U36WZSRZ.js → team-D7TA6MS4.js} +1 -1
  59. package/dist/chunks/{tools-FOMWBG4O.js → tools-ADDMIT53.js} +2 -2
  60. package/dist/chunks/{ui-commands-GEKGZ7LJ.js → ui-commands-GBWFC4GM.js} +11 -11
  61. package/dist/chunks/{versions-YD26QFKO.js → versions-V6QKHBEC.js} +5 -5
  62. package/dist/index.js +1 -1
  63. package/dist/templates/count.js +1 -1
  64. package/dist/templates/index.js +9 -9
  65. package/dist/templates/index.json +1 -1
  66. package/dist/templates/motion/landing-hero/index.js +4 -4
  67. package/dist/templates/motion/launch-trailer/document.js +9 -9
  68. package/dist/templates/motion/launch-trailer/index.js +4 -4
  69. package/dist/templates/motion/launch-trailer/scenes.js +3 -3
  70. package/dist/templates/motion/template-wall.js +2 -2
  71. package/dist/templates/print/studio-portfolio-booklet.js +1 -1
  72. package/dist/templates/themes/index.js +3 -3
  73. package/dist/templates/themes/studio.js +2 -2
  74. package/package.json +1 -1
  75. package/src/templates/print/studio-portfolio-booklet.ts +24 -19
@@ -6,16 +6,16 @@ const __filename = __popcraftPath(import.meta.url);
6
6
  const __dirname = __popcraftDirname(__filename);
7
7
  import {
8
8
  landing_hero_default
9
- } from "../../../chunks/chunk-45GKMBBU.js";
9
+ } from "../../../chunks/chunk-BRFDRFQS.js";
10
10
  import "../../../chunks/chunk-LG5OT27J.js";
11
11
  import "../../../chunks/chunk-HTHZOIBZ.js";
12
- import "../../../chunks/chunk-PXATZ4UZ.js";
13
- import "../../../chunks/chunk-4JCGRWOD.js";
12
+ import "../../../chunks/chunk-QO6RCB54.js";
13
+ import "../../../chunks/chunk-IUS7V3NP.js";
14
14
  import "../../../chunks/chunk-ATOOIPCD.js";
15
15
  import "../../../chunks/chunk-O64SZX6W.js";
16
16
  import "../../../chunks/chunk-UN4I2K2R.js";
17
17
  import "../../../chunks/chunk-3F2YOSTJ.js";
18
- import "../../../chunks/chunk-ELVQX6RI.js";
18
+ import "../../../chunks/chunk-3NGYOEXU.js";
19
19
  import "../../../chunks/chunk-OKJCPQJ4.js";
20
20
  import "../../../chunks/chunk-YKIY7TUZ.js";
21
21
  import "../../../chunks/chunk-RVRHEAZO.js";
@@ -4,7 +4,7 @@ import { dirname as __popcraftDirname } from 'node:path';
4
4
  const require = __popcraftRequire(import.meta.url);
5
5
  const __filename = __popcraftPath(import.meta.url);
6
6
  const __dirname = __popcraftDirname(__filename);
7
- import "../../../chunks/chunk-I323DRE7.js";
7
+ import "../../../chunks/chunk-OCOP2CEE.js";
8
8
  import "../../../chunks/chunk-XXT35K3V.js";
9
9
  import "../../../chunks/chunk-PI2UQW7F.js";
10
10
  import "../../../chunks/chunk-SHL2T7M7.js";
@@ -55,7 +55,7 @@ import "../../../chunks/chunk-SNCMDPM5.js";
55
55
  import "../../../chunks/chunk-ZJ5BIPYM.js";
56
56
  import "../../../chunks/chunk-WRXPBPPI.js";
57
57
  import "../../../chunks/chunk-FFZJ5Z5K.js";
58
- import "../../../chunks/chunk-TBGBDPYT.js";
58
+ import "../../../chunks/chunk-OZV6WRBA.js";
59
59
  import "../../../chunks/chunk-JW7EKYYZ.js";
60
60
  import "../../../chunks/chunk-PGECL4PV.js";
61
61
  import "../../../chunks/chunk-ETFUAR5H.js";
@@ -75,7 +75,7 @@ import "../../../chunks/chunk-N7ED4KMC.js";
75
75
  import "../../../chunks/chunk-CHNPI2JN.js";
76
76
  import "../../../chunks/chunk-DCGTPNQV.js";
77
77
  import "../../../chunks/chunk-UB6GXXVO.js";
78
- import "../../../chunks/chunk-U6FFZ5W2.js";
78
+ import "../../../chunks/chunk-CTLYNR44.js";
79
79
  import "../../../chunks/chunk-SNYK4EXS.js";
80
80
  import "../../../chunks/chunk-T4W4BTNH.js";
81
81
  import "../../../chunks/chunk-K5GRZATW.js";
@@ -304,7 +304,7 @@ import "../../../chunks/chunk-WSYUDEIR.js";
304
304
  import "../../../chunks/chunk-QGP6HYDV.js";
305
305
  import "../../../chunks/chunk-EAUXOBUJ.js";
306
306
  import "../../../chunks/chunk-5KHV2ZK5.js";
307
- import "../../../chunks/chunk-V55HSSYV.js";
307
+ import "../../../chunks/chunk-GCCKB3Z6.js";
308
308
  import "../../../chunks/chunk-YCLJROGO.js";
309
309
  import "../../../chunks/chunk-Y5X227LJ.js";
310
310
  import "../../../chunks/chunk-AE3AIRLP.js";
@@ -534,14 +534,14 @@ import "../../../chunks/chunk-ZQ2GE6FK.js";
534
534
  import "../../../chunks/chunk-FYRBITJT.js";
535
535
  import "../../../chunks/chunk-OW3FMTY5.js";
536
536
  import "../../../chunks/chunk-CMQDGGWL.js";
537
- import "../../../chunks/chunk-45GKMBBU.js";
537
+ import "../../../chunks/chunk-BRFDRFQS.js";
538
538
  import "../../../chunks/chunk-LG5OT27J.js";
539
539
  import "../../../chunks/chunk-HTHZOIBZ.js";
540
540
  import {
541
541
  launch_trailer_default
542
- } from "../../../chunks/chunk-AZU5NJX4.js";
543
- import "../../../chunks/chunk-PXATZ4UZ.js";
544
- import "../../../chunks/chunk-4JCGRWOD.js";
542
+ } from "../../../chunks/chunk-SNAYCSJQ.js";
543
+ import "../../../chunks/chunk-QO6RCB54.js";
544
+ import "../../../chunks/chunk-IUS7V3NP.js";
545
545
  import "../../../chunks/chunk-ATOOIPCD.js";
546
546
  import "../../../chunks/chunk-O64SZX6W.js";
547
547
  import "../../../chunks/chunk-UN4I2K2R.js";
@@ -787,7 +787,7 @@ import "../../../chunks/chunk-7SZQNGXC.js";
787
787
  import "../../../chunks/chunk-Y5TFPTPV.js";
788
788
  import "../../../chunks/chunk-3TPWL2I4.js";
789
789
  import "../../../chunks/chunk-W67GMG55.js";
790
- import "../../../chunks/chunk-ELVQX6RI.js";
790
+ import "../../../chunks/chunk-3NGYOEXU.js";
791
791
  import "../../../chunks/chunk-OKJCPQJ4.js";
792
792
  import "../../../chunks/chunk-YKIY7TUZ.js";
793
793
  import "../../../chunks/chunk-G3SMPCBJ.js";
@@ -6,14 +6,14 @@ const __filename = __popcraftPath(import.meta.url);
6
6
  const __dirname = __popcraftDirname(__filename);
7
7
  import {
8
8
  launch_trailer_default
9
- } from "../../../chunks/chunk-AZU5NJX4.js";
10
- import "../../../chunks/chunk-PXATZ4UZ.js";
11
- import "../../../chunks/chunk-4JCGRWOD.js";
9
+ } from "../../../chunks/chunk-SNAYCSJQ.js";
10
+ import "../../../chunks/chunk-QO6RCB54.js";
11
+ import "../../../chunks/chunk-IUS7V3NP.js";
12
12
  import "../../../chunks/chunk-ATOOIPCD.js";
13
13
  import "../../../chunks/chunk-O64SZX6W.js";
14
14
  import "../../../chunks/chunk-UN4I2K2R.js";
15
15
  import "../../../chunks/chunk-3F2YOSTJ.js";
16
- import "../../../chunks/chunk-ELVQX6RI.js";
16
+ import "../../../chunks/chunk-3NGYOEXU.js";
17
17
  import "../../../chunks/chunk-OKJCPQJ4.js";
18
18
  import "../../../chunks/chunk-YKIY7TUZ.js";
19
19
  import "../../../chunks/chunk-RVRHEAZO.js";
@@ -19,12 +19,12 @@ import {
19
19
  reach,
20
20
  shadow,
21
21
  travel
22
- } from "../../../chunks/chunk-PXATZ4UZ.js";
23
- import "../../../chunks/chunk-4JCGRWOD.js";
22
+ } from "../../../chunks/chunk-QO6RCB54.js";
23
+ import "../../../chunks/chunk-IUS7V3NP.js";
24
24
  import "../../../chunks/chunk-ATOOIPCD.js";
25
25
  import "../../../chunks/chunk-O64SZX6W.js";
26
26
  import "../../../chunks/chunk-3F2YOSTJ.js";
27
- import "../../../chunks/chunk-ELVQX6RI.js";
27
+ import "../../../chunks/chunk-3NGYOEXU.js";
28
28
  import "../../../chunks/chunk-OKJCPQJ4.js";
29
29
  import "../../../chunks/chunk-YKIY7TUZ.js";
30
30
  import "../../../chunks/chunk-RVRHEAZO.js";
@@ -9,9 +9,9 @@ import {
9
9
  PICTURES,
10
10
  buildTemplateWall,
11
11
  template_wall_default
12
- } from "../../chunks/chunk-4JCGRWOD.js";
12
+ } from "../../chunks/chunk-IUS7V3NP.js";
13
13
  import "../../chunks/chunk-ATOOIPCD.js";
14
- import "../../chunks/chunk-ELVQX6RI.js";
14
+ import "../../chunks/chunk-3NGYOEXU.js";
15
15
  import "../../chunks/chunk-OKJCPQJ4.js";
16
16
  import "../../chunks/chunk-YKIY7TUZ.js";
17
17
  import "../../chunks/chunk-RVRHEAZO.js";
@@ -6,7 +6,7 @@ const __filename = __popcraftPath(import.meta.url);
6
6
  const __dirname = __popcraftDirname(__filename);
7
7
  import {
8
8
  studio_portfolio_booklet_default
9
- } from "../../chunks/chunk-V55HSSYV.js";
9
+ } from "../../chunks/chunk-GCCKB3Z6.js";
10
10
  import "../../chunks/chunk-YCLJROGO.js";
11
11
  import "../../chunks/chunk-T2NNHYZI.js";
12
12
  import "../../chunks/chunk-Z2X2HGTO.js";
@@ -6,7 +6,7 @@ const __filename = __popcraftPath(import.meta.url);
6
6
  const __dirname = __popcraftDirname(__filename);
7
7
  import {
8
8
  THEME_PACKS
9
- } from "../../chunks/chunk-TBGBDPYT.js";
9
+ } from "../../chunks/chunk-OZV6WRBA.js";
10
10
  import "../../chunks/chunk-JW7EKYYZ.js";
11
11
  import "../../chunks/chunk-PGECL4PV.js";
12
12
  import "../../chunks/chunk-ETFUAR5H.js";
@@ -26,7 +26,7 @@ import "../../chunks/chunk-N7ED4KMC.js";
26
26
  import "../../chunks/chunk-CHNPI2JN.js";
27
27
  import "../../chunks/chunk-DCGTPNQV.js";
28
28
  import "../../chunks/chunk-UB6GXXVO.js";
29
- import "../../chunks/chunk-U6FFZ5W2.js";
29
+ import "../../chunks/chunk-CTLYNR44.js";
30
30
  import "../../chunks/chunk-SNYK4EXS.js";
31
31
  import "../../chunks/chunk-T4W4BTNH.js";
32
32
  import "../../chunks/chunk-K5GRZATW.js";
@@ -201,7 +201,7 @@ import "../../chunks/chunk-WSYUDEIR.js";
201
201
  import "../../chunks/chunk-QGP6HYDV.js";
202
202
  import "../../chunks/chunk-EAUXOBUJ.js";
203
203
  import "../../chunks/chunk-5KHV2ZK5.js";
204
- import "../../chunks/chunk-V55HSSYV.js";
204
+ import "../../chunks/chunk-GCCKB3Z6.js";
205
205
  import "../../chunks/chunk-YCLJROGO.js";
206
206
  import "../../chunks/chunk-VXM7TRS4.js";
207
207
  import "../../chunks/chunk-T7YYOTRX.js";
@@ -6,7 +6,7 @@ const __filename = __popcraftPath(import.meta.url);
6
6
  const __dirname = __popcraftDirname(__filename);
7
7
  import {
8
8
  studio_default
9
- } from "../../chunks/chunk-U6FFZ5W2.js";
9
+ } from "../../chunks/chunk-CTLYNR44.js";
10
10
  import "../../chunks/chunk-SNYK4EXS.js";
11
11
  import "../../chunks/chunk-T4W4BTNH.js";
12
12
  import "../../chunks/chunk-K5GRZATW.js";
@@ -15,7 +15,7 @@ import "../../chunks/chunk-ZVBJYM4K.js";
15
15
  import "../../chunks/chunk-7KR6EV2B.js";
16
16
  import "../../chunks/chunk-EAUXOBUJ.js";
17
17
  import "../../chunks/chunk-5KHV2ZK5.js";
18
- import "../../chunks/chunk-V55HSSYV.js";
18
+ import "../../chunks/chunk-GCCKB3Z6.js";
19
19
  import "../../chunks/chunk-YCLJROGO.js";
20
20
  import "../../chunks/chunk-T2NNHYZI.js";
21
21
  import "../../chunks/chunk-V5QP26VI.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@popcraft/kit",
3
- "version": "0.23.0",
3
+ "version": "0.23.1",
4
4
  "description": "The PopCraft design kit: everything PopCraft's own templates are made with — the Kit, every helper, style system and theme kit, every official template source to read and remix, the build and every check the official templates pass — plus the design-script runner and .popcraft output.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://popcraft.app/docs/api/design-reference",
@@ -1,6 +1,7 @@
1
1
  // A photographer's printed portfolio: the twelve-page A5 leave-behind left on an art buyer's desk after a meeting.
2
- // A cover, a page about her and who she works for, four projects as spreads (a picture across the left page, the
3
- // story and a second picture on the right), a contact page and a back cover. Twelve pages, a multiple of four, so
2
+ // A cover, four projects as spreads (a picture across the left page, the story and a second picture on the right),
3
+ // a page about her and who she works for facing the contact page, and a back cover. The cover stands alone on the
4
+ // right, so pages 2–3 are the first spread: each project starts on an even, left-hand page. Twelve pages, a multiple of four, so
4
5
  // File › Export › PDF › "Booklet — folded and stapled" imposes it onto three sheets of A4 to fold and staple.
5
6
  // Every picture that meets the trim runs on into the 3 mm bleed (the pages do not clip), and every word stays well
6
7
  // inside it. The pictures are photographs made for these templates; each is an image layer to replace.
@@ -34,7 +35,7 @@ export default defineTemplate({
34
35
  id: 'print-studio-portfolio-booklet',
35
36
  meta: {
36
37
  name: 'Photography portfolio booklet',
37
- description: 'A twelve-page A5 portfolio to leave behind after a meeting: a cover, an about page with clients, four projects as spreads with a full-bleed picture and the story beside it, a contact page and a back cover. Pictures run into the 3 mm bleed, and the page count imposes as a folded and stapled booklet. For photographers, illustrators and designers',
38
+ description: 'A twelve-page A5 portfolio to leave behind after a meeting: a cover, four projects as spreads with a full-bleed picture and the story beside it, an about page with clients facing the contact page, and a back cover. Pictures run into the 3 mm bleed, and the page count imposes as a folded and stapled booklet. For photographers, illustrators and designers',
38
39
  category: 'brochure', tags: ['portfolio', 'booklet', 'zine', 'photography', 'photographer', 'leave-behind', 'a5', 'saddle stitch', 'print', 'creative', 'designer'],
39
40
  platforms: ['print'], formats: ['document'], useCases: ['portfolio', 'brand-intro'],
40
41
  created: '2026-10-10', updated: '2026-10-10',
@@ -83,9 +84,13 @@ export default defineTemplate({
83
84
  return img
84
85
  }
85
86
  const column = (p: string, gap: number, name: string) => k.stack(p, { gap, name })
86
- // The page number: one component, an instance on every numbered page, pushed to the foot of the page.
87
- k.component('Folio', { width: W - M * 2, direction: 'HORIZONTAL', props: { Number: '02' } }, id => { k.propText(id, 'Number', { style: 'Label 10', color: 'onPaper', width: 'FILL' }) })
88
- const folio = (p: string, n: number) => k.instance(p, 'Folio', { Number: String(n).padStart(2, '0') }, { width: 'FILL', name: 'Folio' })
87
+ // The page number: one component, an instance on every numbered page, pushed to the foot of the page. It sits
88
+ // on the outer edge, as in any bound book: a variant for the left of an even, left-hand page and one for the
89
+ // right of an odd, right-hand page.
90
+ k.variantSet('Folio', 'Side', ['Left', 'Right'], { width: W - M * 2, direction: 'HORIZONTAL', props: { Number: '02' } }, (side, id) => {
91
+ k.propText(id, 'Number', { style: 'Label 10', color: 'onPaper', width: 'FILL', align: side === 'Left' ? 'LEFT' : 'RIGHT' })
92
+ })
93
+ const folio = (p: string, n: number) => k.instance(p, n % 2 ? 'Folio/Right' : 'Folio/Left', { Number: String(n).padStart(2, '0') }, { width: 'FILL', name: 'Folio' })
89
94
  const spacer = (p: string) => { const s = k.stack(p, { name: 'Space' }); k.patch(s, { layoutSizingVertical: 'FILL' } as Partial<FrameNode>); return s }
90
95
 
91
96
  // 1 · The cover: the name set like a monograph's, one picture under it, the years at the foot.
@@ -96,19 +101,8 @@ export default defineTemplate({
96
101
  picture(cover, 'photo-06', 290, 'Cover picture')
97
102
  k.text(cover, 'Selected work, 2023 – 2026', { style: 'Lead 20', color: 'text', width: 'FILL', name: 'Subtitle' })
98
103
 
99
- // 2 · About: who she is and who she works for, under a small picture.
100
- const about = page('About', { gap: 16 })
101
- picture(about, 'photo-04', 220, 'About picture')
102
- k.text(about, 'ABOUT', { style: 'Label 10', color: 'text', width: 'FILL', name: 'Kicker' })
103
- k.text(about, 'I photograph work: the people who do it, the places it happens, and the hours nobody else sees.', { style: 'Lead 20', color: 'text', width: 'FILL', name: 'Statement' })
104
- k.text(about, 'I am a documentary and editorial photographer based in Lisbon, working on long projects across Europe, Africa and Asia and on commissions for magazines and brands that want pictures with a story under them. I shoot on location, by available light, and I stay long enough to be forgotten.', { style: 'Body 12.5', color: 'text', width: 'FILL', name: 'About' })
105
- k.text(about, 'SELECTED CLIENTS', { style: 'Label 10', color: 'onPaper', width: 'FILL', name: 'Clients title' })
106
- k.text(about, 'Monocle · Kinfolk · Público · Atlas Review · The Gentlewoman · Aesop · Fundação Gulbenkian · Patagonia', { style: 'Body 12.5', color: 'text', width: 'FILL', name: 'Clients' })
107
- spacer(about)
108
- folio(about, 2)
109
-
110
- // 3–10 · A spread for each project: the picture across the left page, the story and a second picture on the right.
111
- let n = 3
104
+ // 2–9 · A spread for each project: the picture across the left page, the story and a second picture on the right.
105
+ let n = 2
112
106
  for (const p of PROJECTS) {
113
107
  const left = page(`${p.title} — picture`)
114
108
  bleedPicture(left, p.lead, 'Lead picture')
@@ -128,6 +122,17 @@ export default defineTemplate({
128
122
  n += 2
129
123
  }
130
124
 
125
+ // 10 · About: who she is and who she works for, under a small picture, facing the contact page.
126
+ const about = page('About', { gap: 16 })
127
+ picture(about, 'photo-04', 220, 'About picture')
128
+ k.text(about, 'ABOUT', { style: 'Label 10', color: 'text', width: 'FILL', name: 'Kicker' })
129
+ k.text(about, 'I photograph work: the people who do it, the places it happens, and the hours nobody else sees.', { style: 'Lead 20', color: 'text', width: 'FILL', name: 'Statement' })
130
+ k.text(about, 'I am a documentary and editorial photographer based in Lisbon, working on long projects across Europe, Africa and Asia and on commissions for magazines and brands that want pictures with a story under them. I shoot on location, by available light, and I stay long enough to be forgotten.', { style: 'Body 12.5', color: 'text', width: 'FILL', name: 'About' })
131
+ k.text(about, 'SELECTED CLIENTS', { style: 'Label 10', color: 'onPaper', width: 'FILL', name: 'Clients title' })
132
+ k.text(about, 'Monocle · Kinfolk · Público · Atlas Review · The Gentlewoman · Aesop · Fundação Gulbenkian · Patagonia', { style: 'Body 12.5', color: 'text', width: 'FILL', name: 'Clients' })
133
+ spacer(about)
134
+ folio(about, 10)
135
+
131
136
  // 11 · Contact.
132
137
  const contact = page('Contact', { gap: 18 })
133
138
  spacer(contact)