@open-press/cli 0.6.0 → 0.7.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 (97) hide show
  1. package/package.json +1 -1
  2. package/template/core/AGENTS.md +126 -0
  3. package/template/core/CHANGELOG.md +87 -1
  4. package/template/core/README.md +9 -5
  5. package/template/core/engine/cli.mjs +2 -5
  6. package/template/core/engine/commands/_shared.mjs +4 -4
  7. package/template/core/engine/commands/deploy.mjs +1 -1
  8. package/template/core/engine/commands/inspect.mjs +3 -3
  9. package/template/core/engine/commands/replace.mjs +1 -1
  10. package/template/core/engine/commands/search.mjs +1 -1
  11. package/template/core/engine/commands/upgrade.mjs +47 -5
  12. package/template/core/engine/commands/validate.mjs +2 -2
  13. package/template/core/engine/document-export.mjs +1 -1
  14. package/template/core/engine/{chrome-pdf.mjs → output/chrome-pdf.mjs} +1 -2
  15. package/template/core/engine/{deploy-sync.mjs → output/deploy-sync.mjs} +2 -2
  16. package/template/core/engine/{fonts.mjs → output/fonts.mjs} +1 -1
  17. package/template/core/engine/{public-assets.mjs → output/public-assets.mjs} +2 -2
  18. package/template/core/engine/{static-server.mjs → output/static-server.mjs} +2 -2
  19. package/template/core/engine/react/caption-numbering.mjs +73 -0
  20. package/template/core/engine/react/comment-marker.mjs +54 -10
  21. package/template/core/engine/react/document-entry.mjs +124 -64
  22. package/template/core/engine/react/document-export.mjs +266 -310
  23. package/template/core/engine/react/mdx-compile.mjs +214 -3
  24. package/template/core/engine/react/measurement-css.mjs +3 -3
  25. package/template/core/engine/react/pagination/allocator.mjs +122 -0
  26. package/template/core/engine/react/pagination/regions.mjs +81 -0
  27. package/template/core/engine/react/pagination.mjs +9 -121
  28. package/template/core/engine/react/pipeline/allocate.mjs +248 -0
  29. package/template/core/engine/react/pipeline/final-render.mjs +94 -0
  30. package/template/core/engine/react/pipeline/frame-measurement.mjs +300 -0
  31. package/template/core/engine/react/pipeline/press-tree.mjs +135 -0
  32. package/template/core/engine/react/project-asset-endpoint.mjs +2 -2
  33. package/template/core/engine/react/{chapter-css.mjs → section-css.mjs} +12 -9
  34. package/template/core/engine/react/sources/heading-numbering.mjs +132 -0
  35. package/template/core/engine/react/sources/mdx-resolver.mjs +441 -0
  36. package/template/core/engine/react/{workspace-discovery.mjs → style-discovery.mjs} +29 -40
  37. package/template/core/engine/{config.mjs → runtime/config.mjs} +15 -0
  38. package/template/core/engine/{file-utils.mjs → runtime/file-utils.mjs} +1 -1
  39. package/template/core/engine/{inspection.mjs → runtime/inspection.mjs} +3 -4
  40. package/template/core/engine/{source-text-tools.mjs → runtime/source-text-tools.mjs} +24 -7
  41. package/template/core/engine/runtime/source-workspace.mjs +186 -0
  42. package/template/core/engine/{validation.mjs → runtime/validation.mjs} +19 -17
  43. package/template/core/package.json +5 -2
  44. package/template/core/src/openpress/anchorMap.ts +27 -0
  45. package/template/core/src/openpress/core/Frame.tsx +80 -0
  46. package/template/core/src/openpress/core/FrameContext.tsx +19 -0
  47. package/template/core/src/openpress/core/MdxArea.tsx +35 -0
  48. package/template/core/src/openpress/core/Press.tsx +34 -0
  49. package/template/core/src/openpress/core/index.tsx +34 -15
  50. package/template/core/src/openpress/core/primitives.tsx +23 -0
  51. package/template/core/src/openpress/core/types.ts +131 -19
  52. package/template/core/src/openpress/core/useSource.ts +28 -0
  53. package/template/core/src/openpress/manuscript/index.tsx +196 -0
  54. package/template/core/src/openpress/mdx/index.ts +88 -0
  55. package/template/core/src/openpress/numbering/index.ts +294 -0
  56. package/template/core/src/openpress/publicPage.tsx +4 -186
  57. package/template/core/src/openpress/reactDocumentMetadata.ts +2 -16
  58. package/template/core/src/openpress/types.ts +0 -16
  59. package/template/core/src/openpress/workbench.tsx +2 -36
  60. package/template/core/src/styles/openpress/responsive.css +0 -14
  61. package/template/core/tsconfig.json +4 -1
  62. package/template/core/vite.config.ts +10 -3
  63. package/template/packs/academic-paper/document/chapters/01-introduction/content/01-introduction.mdx +26 -12
  64. package/template/packs/academic-paper/document/chapters/02-methods/content/01-methods.mdx +37 -17
  65. package/template/packs/academic-paper/document/chapters/03-results-and-discussion/content/01-results.mdx +34 -16
  66. package/template/packs/academic-paper/document/chapters/04-acknowledgment/content/01-acknowledgment.mdx +22 -8
  67. package/template/packs/academic-paper/document/chapters/05-references/content/01-references.mdx +20 -15
  68. package/template/packs/academic-paper/document/components/Page.tsx +48 -15
  69. package/template/packs/academic-paper/document/design.md +2 -2
  70. package/template/packs/academic-paper/document/index.tsx +96 -80
  71. package/template/packs/academic-paper/document/media/figure-placeholder.svg +9 -0
  72. package/template/packs/academic-paper/document/theme/base/page-contract.css +30 -13
  73. package/template/packs/academic-paper/document/theme/base/typography.css +30 -33
  74. package/template/packs/academic-paper/document/theme/page-surfaces/cover.css +74 -47
  75. package/template/packs/academic-paper/document/theme/page-surfaces/toc.css +19 -9
  76. package/template/packs/claude-document/document/components/Page.tsx +24 -14
  77. package/template/packs/claude-document/document/design.md +2 -2
  78. package/template/packs/claude-document/document/index.tsx +67 -62
  79. package/template/packs/claude-document/document/theme/page-surfaces/toc.css +19 -7
  80. package/template/packs/editorial-monograph/document/components/Page.tsx +24 -14
  81. package/template/packs/editorial-monograph/document/design.md +2 -2
  82. package/template/packs/editorial-monograph/document/index.tsx +71 -47
  83. package/template/packs/editorial-monograph/document/theme/page-surfaces/toc.css +19 -9
  84. package/template/core/engine/commands/migrate-to-react.mjs +0 -27
  85. package/template/core/engine/page-renderer.mjs +0 -217
  86. package/template/core/engine/react/migrate-to-react.mjs +0 -355
  87. package/template/core/engine/source-workspace.mjs +0 -76
  88. package/template/core/src/openpress/core/basePages.tsx +0 -87
  89. package/template/core/src/openpress/pagination.ts +0 -845
  90. package/template/packs/claude-document/document/chapters/01-document-shape/chapter.tsx +0 -30
  91. package/template/packs/claude-document/document/chapters/02-review-loop/chapter.tsx +0 -30
  92. /package/template/core/engine/{chrome-pdf.d.mts → output/chrome-pdf.d.mts} +0 -0
  93. /package/template/core/engine/{katex-assets.mjs → output/katex-assets.mjs} +0 -0
  94. /package/template/core/engine/{page-block.mjs → output/page-block.mjs} +0 -0
  95. /package/template/core/engine/{pdf-media.mjs → output/pdf-media.mjs} +0 -0
  96. /package/template/core/engine/{config.d.mts → runtime/config.d.mts} +0 -0
  97. /package/template/core/engine/{issue-report.mjs → runtime/issue-report.mjs} +0 -0
@@ -1,10 +1,13 @@
1
- import type { Manifest } from "@openpress/core";
2
- import { BaseBackCoverPage, BaseCoverPage, BaseTocPage } from "@openpress/core";
1
+ import { Frame, Press } from "@open-press/core";
2
+ import type { Manifest } from "@open-press/core";
3
+ import { mdxSource } from "@open-press/core/mdx";
4
+ import { Sections } from "@open-press/core/manuscript";
5
+ import Page from "./components/Page";
3
6
 
4
7
  export const config: Manifest = {
5
- title: "Paper Title",
6
- subtitle: "An academic-paper draft built with open-press",
7
- organization: "Department · Institution",
8
+ title: "Your article title goes here",
9
+ subtitle: "This is a non-peer reviewed Express letter submitted to J SEDI",
10
+ organization: "open-press · academic-paper",
8
11
  sourceDir: "chapters",
9
12
  mediaDir: "media",
10
13
  themeDir: "theme",
@@ -24,84 +27,97 @@ export const config: Manifest = {
24
27
  },
25
28
  };
26
29
 
27
- /**
28
- * The cover renders the academic title block: paper title, author grid,
29
- * abstract band, and index terms. Replace the placeholders with your own.
30
- */
31
- export const cover = (
32
- <BaseCoverPage data-page-title="Title page" aria-labelledby="paper-title">
33
- <div className="paper-cover">
34
- <h1 id="paper-title" className="paper-title">
35
- Conference Paper Title
36
- </h1>
37
- <p className="paper-subtitle">
38
- Sub-title (optional). Not captured by indexing services like IEEE Xplore.
39
- </p>
40
-
41
- <ol className="paper-authors" aria-label="Authors">
42
- <li className="paper-author">
43
- <p className="paper-author-name">First Author Surname</p>
44
- <p className="paper-author-affiliation">dept. of organization</p>
45
- <p className="paper-author-affiliation">name of organization</p>
46
- <p className="paper-author-location">City, Country</p>
47
- <p className="paper-author-contact">email or ORCID</p>
48
- </li>
49
- <li className="paper-author">
50
- <p className="paper-author-name">Second Author Surname</p>
51
- <p className="paper-author-affiliation">dept. of organization</p>
52
- <p className="paper-author-affiliation">name of organization</p>
53
- <p className="paper-author-location">City, Country</p>
54
- <p className="paper-author-contact">email or ORCID</p>
55
- </li>
56
- <li className="paper-author">
57
- <p className="paper-author-name">Third Author Surname</p>
58
- <p className="paper-author-affiliation">dept. of organization</p>
59
- <p className="paper-author-affiliation">name of organization</p>
60
- <p className="paper-author-location">City, Country</p>
61
- <p className="paper-author-contact">email or ORCID</p>
62
- </li>
63
- </ol>
30
+ export const sources = {
31
+ story: mdxSource({ preset: "section-folders", root: "chapters" }),
32
+ };
64
33
 
65
- <section className="paper-abstract" aria-label="Abstract">
66
- <p>
67
- <span className="paper-abstract-label">Abstract</span>—This document
68
- is a model and starting point for an academic paper drafted in
69
- open-press. Replace this abstract with your own — keep it under
70
- 250 words. Do not use abbreviations, symbols, footnotes, or math
71
- in the abstract.
34
+ function Cover() {
35
+ return (
36
+ <Frame
37
+ frameKey="cover"
38
+ role="manuscript.cover"
39
+ chrome={false}
40
+ className="reader-page--cover"
41
+ data-page-title="Title page"
42
+ aria-labelledby="paper-title"
43
+ >
44
+ <div className="paper-cover">
45
+ <p className="paper-cover-date">May 18, 2026 – This is a non-peer reviewed Express letter submitted to J SEDI</p>
46
+ <p className="paper-cover-lead">This is a non-peer reviewed Express letter submitted to J SEDI</p>
47
+ <p className="paper-cover-short-title">Your short title goes here</p>
48
+ <h1 id="paper-title" className="paper-title">
49
+ Your article title goes here
50
+ <sup>*</sup>
51
+ </h1>
52
+ <p className="paper-author-contact-note">
53
+ <span aria-hidden="true">∗</span> Corresponding author:
54
+ firstauthor@university.jp
72
55
  </p>
73
- </section>
74
56
 
75
- <section className="paper-index-terms" aria-label="Index terms">
76
- <p>
77
- <span className="paper-abstract-label">Index Terms</span>—keyword
78
- one, keyword two, keyword three, keyword four
57
+ <p className="paper-author-line" aria-label="Authors">
58
+ Name Firstauthor<sup>1</sup>, Name Secondauthor<sup>2</sup>, Name
59
+ Thirdauthor<sup>1,3</sup>
79
60
  </p>
80
- </section>
81
- </div>
82
- </BaseCoverPage>
83
- );
84
61
 
85
- export const toc = (
86
- <BaseTocPage data-page-title="Contents" id="toc">
87
- <div className="page-frame">
88
- <header className="page-header" aria-hidden="true"></header>
89
- <main className="page-body">
90
- <h2 id="toc-title" className="toc-heading">Contents</h2>
91
- </main>
92
- </div>
93
- </BaseTocPage>
94
- );
62
+ <ol className="paper-author-affiliations" aria-label="Author affiliations">
63
+ <li className="paper-author">
64
+ <p className="paper-author-affiliation">
65
+ 1 Department of Earth Sciences, A University, City, Country
66
+ </p>
67
+ </li>
68
+ <li className="paper-author">
69
+ <p className="paper-author-affiliation">
70
+ 2 School of Earth Sciences, Another University, City, Country
71
+ </p>
72
+ </li>
73
+ <li className="paper-author">
74
+ <p className="paper-author-affiliation">
75
+ 3 Center for Studying Cool Things, University of X, City, Country
76
+ </p>
77
+ </li>
78
+ </ol>
79
+
80
+ <section className="paper-contributions" aria-label="Author contributions">
81
+ <p>
82
+ <span className="paper-section-label">Author contributions:</span>{" "}
83
+ Conceptualization: Name Firstauthor, Name Thirdauthor. Formal
84
+ Analysis: Name Firstauthor, Name Secondauthor.
85
+ </p>
86
+ <p>
87
+ <span className="paper-section-label">Writing - Original draft:</span>{" "}
88
+ Name Firstauthor.{" "}
89
+ <span className="paper-section-label">
90
+ Writing - Review &amp; Editing:
91
+ </span>{" "}
92
+ Name Firstauthor, Name Secondauthor, Name Thirdauthor.
93
+ </p>
94
+ </section>
95
+
96
+ <section className="paper-abstract" aria-label="Abstract">
97
+ <p>
98
+ <span className="paper-abstract-label">Abstract</span> The text for the
99
+ first abstract goes here. This should be in English, no longer than
100
+ 200 words, and should not include references.
101
+ </p>
102
+ </section>
103
+
104
+ <section className="paper-nontechnical-summary" aria-label="Non-technical summary">
105
+ <p>
106
+ <span className="paper-abstract-label">Non-technical summary</span> The
107
+ text for the non-technical summary goes here. Again, no longer than
108
+ 200 words, no reference.
109
+ </p>
110
+ </section>
111
+ </div>
112
+ </Frame>
113
+ );
114
+ }
95
115
 
96
- export const backCover = (
97
- <BaseBackCoverPage data-page-title="Back cover">
98
- <div className="paper-back-cover">
99
- <p className="paper-back-kicker">open-press · academic-paper</p>
100
- <p className="paper-back-statement">
101
- Draft built with open-press. When the paper is ready for submission,
102
- port the prose into the publisher's LaTeX class (IEEEtran, acmart,
103
- etc.). open-press is the iteration loop, not the camera-ready output.
104
- </p>
105
- </div>
106
- </BaseBackCoverPage>
107
- );
116
+ export default function AcademicPaperPress() {
117
+ return (
118
+ <Press>
119
+ <Cover />
120
+ <Sections source="story" page={Page} />
121
+ </Press>
122
+ );
123
+ }
@@ -0,0 +1,9 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="900" height="540" viewBox="0 0 900 540" role="img" aria-labelledby="title desc">
2
+ <title id="title">Figure placeholder</title>
3
+ <desc id="desc">Simple figure placeholder graphic with gray border and label</desc>
4
+ <rect width="100%" height="100%" fill="#f3f4f6"/>
5
+ <rect x="24" y="24" width="852" height="492" fill="none" stroke="#9ca3af" stroke-width="4" stroke-dasharray="18 12" rx="8" />
6
+ <text x="50%" y="50%" fill="#4b5563" font-size="44" font-family="Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif" text-anchor="middle" dominant-baseline="middle">
7
+ Example Figure Placeholder
8
+ </text>
9
+ </svg>
@@ -383,12 +383,12 @@ button:focus-visible {
383
383
  position: relative;
384
384
  width: var(--reader-page-width, var(--openpress-page-width));
385
385
  height: calc(var(--reader-page-width, var(--openpress-page-width)) * var(--openpress-page-height) / var(--openpress-page-width));
386
- --page-margin-x: clamp(28px, 5cqw, 48px);
387
- --page-margin-top: clamp(28px, 5cqw, 48px);
388
- --page-margin-bottom: clamp(18px, 3cqw, 28px);
389
- --page-header-height: clamp(12px, 1.9cqw, 20px);
390
- --page-footer-height: clamp(18px, 2.6cqw, 26px);
391
- --page-frame-gap: clamp(8px, 1.4cqw, 14px);
386
+ --page-margin-x: clamp(20px, 3.8cqw, 34px);
387
+ --page-margin-top: clamp(18px, 3.5cqw, 30px);
388
+ --page-margin-bottom: clamp(14px, 2.4cqw, 24px);
389
+ --page-header-height: clamp(10px, 1.6cqw, 16px);
390
+ --page-footer-height: clamp(16px, 2.2cqw, 22px);
391
+ --page-frame-gap: clamp(5px, 1.1cqw, 11px);
392
392
  overflow: hidden;
393
393
  color: var(--openpress-color-ink);
394
394
  background: var(--openpress-color-document);
@@ -429,12 +429,29 @@ button:focus-visible {
429
429
 
430
430
  .page-header {
431
431
  display: flex;
432
- align-items: flex-start;
432
+ align-items: baseline;
433
+ justify-content: space-between;
434
+ gap: var(--openpress-space-3);
433
435
  color: var(--openpress-color-muted);
434
- font-size: clamp(7pt, 1.2cqw, 8pt);
435
- letter-spacing: 0.1em;
436
- opacity: 0.62;
436
+ font-family: var(--openpress-font-body);
437
+ font-size: clamp(8px, 1.2cqw, 9px);
438
+ letter-spacing: normal;
439
+ opacity: 0.82;
437
440
  pointer-events: none;
441
+ line-height: 1.2;
442
+ }
443
+
444
+ .running-head-left,
445
+ .running-head-right {
446
+ min-width: 0;
447
+ overflow: hidden;
448
+ text-overflow: ellipsis;
449
+ white-space: nowrap;
450
+ }
451
+
452
+ .running-head-right {
453
+ max-width: 45%;
454
+ text-align: right;
438
455
  }
439
456
 
440
457
  .page-body {
@@ -448,9 +465,9 @@ button:focus-visible {
448
465
  justify-content: space-between;
449
466
  align-items: baseline;
450
467
  gap: 12px;
451
- font-size: clamp(7pt, 1.25cqw, 8pt);
468
+ font-size: clamp(8px, 1.2cqw, 9px);
452
469
  color: var(--openpress-color-muted);
453
- letter-spacing: 0.1em;
470
+ letter-spacing: normal;
454
471
  opacity: 0.7;
455
472
  pointer-events: none;
456
473
  }
@@ -465,7 +482,7 @@ button:focus-visible {
465
482
 
466
483
  .page-footer .footer-right {
467
484
  font-variant-numeric: tabular-nums;
468
- letter-spacing: 0.14em;
485
+ letter-spacing: 0.02em;
469
486
  flex-shrink: 0;
470
487
  }
471
488
 
@@ -14,50 +14,45 @@ h3,
14
14
  h4 {
15
15
  break-after: avoid;
16
16
  color: var(--openpress-color-ink);
17
- letter-spacing: 0.04em;
17
+ letter-spacing: normal;
18
18
  }
19
19
 
20
20
  h2 {
21
- margin: 0 0 var(--openpress-space-4);
21
+ margin: 0 0 var(--openpress-space-3);
22
22
  padding: 0;
23
23
  font-family: var(--openpress-font-serif);
24
- font-size: clamp(5.7pt, 3.4cqw, 17pt);
24
+ font-size: clamp(15px, 2.4cqw, 20px);
25
25
  line-height: 1.45;
26
- font-weight: 300;
26
+ font-weight: 700;
27
27
  border: 0;
28
28
  }
29
29
 
30
30
  h2::before {
31
- content: "";
32
- display: block;
33
- width: 36px;
34
- height: 1px;
35
- background: var(--openpress-color-ink);
36
- margin-bottom: var(--openpress-space-4);
31
+ content: none;
37
32
  }
38
33
 
39
- .reader-page--content .page-body > h2:first-child {
34
+ .reader-page--content .page-body .openpress-mdx-area h2 {
40
35
  display: flex;
41
36
  align-items: baseline;
42
37
  gap: 0.55em;
43
38
  margin: 0 0 var(--openpress-space-4);
44
39
  }
45
40
 
46
- .reader-page--content .page-body > h2:first-child::before {
41
+ .reader-page--content .page-body .openpress-mdx-area h2::before {
47
42
  content: attr(data-chapter);
48
43
  display: inline-block;
49
44
  flex-shrink: 0;
50
45
  font-family: var(--openpress-font-serif);
51
- font-size: 1.55em;
52
- font-weight: 300;
53
- color: var(--openpress-color-muted);
46
+ font-size: 0.88em;
47
+ font-weight: 700;
48
+ color: var(--openpress-color-ink);
54
49
  line-height: 1;
55
- letter-spacing: 0.06em;
50
+ letter-spacing: normal;
56
51
  width: auto;
57
52
  min-width: 0;
58
53
  height: auto;
59
54
  background: transparent;
60
- padding: 0;
55
+ padding-right: 0.22em;
61
56
  margin: 0;
62
57
  border: 0;
63
58
  }
@@ -72,26 +67,26 @@ h2::before {
72
67
  content: attr(data-section);
73
68
  flex-shrink: 0;
74
69
  font-family: var(--openpress-font-serif);
75
- font-size: 0.95em;
76
- font-weight: 300;
77
- color: var(--openpress-color-muted);
78
- letter-spacing: 0.08em;
70
+ font-size: 0.98em;
71
+ font-weight: 500;
72
+ color: var(--openpress-color-ink);
73
+ letter-spacing: normal;
79
74
  line-height: inherit;
80
75
  }
81
76
 
82
77
  h2 + p,
83
78
  h2 + h3 {
84
- margin-top: var(--openpress-space-3);
79
+ margin-top: var(--openpress-space-2);
85
80
  }
86
81
 
87
82
  h3 {
88
83
  margin: var(--openpress-space-3) 0 var(--openpress-space-2);
89
84
  font-family: var(--openpress-font-serif);
90
- font-size: clamp(4.8pt, 2.4cqw, 13pt);
91
- line-height: 1.55;
92
- font-weight: 400;
85
+ font-size: clamp(12px, 2cqw, 16px);
86
+ line-height: 1.5;
87
+ font-weight: 500;
93
88
  color: var(--openpress-color-ink);
94
- letter-spacing: 0.03em;
89
+ letter-spacing: normal;
95
90
  }
96
91
 
97
92
  .reader-page--content .page-body > h3:first-child {
@@ -100,17 +95,19 @@ h3 {
100
95
 
101
96
  h4 {
102
97
  margin: var(--openpress-space-3) 0 var(--openpress-space-1);
103
- font-family: var(--openpress-font-body);
104
- font-size: clamp(4.4pt, 1.9cqw, 11pt);
98
+ font-family: var(--openpress-font-serif);
99
+ font-size: clamp(10px, 1.75cqw, 14px);
105
100
  font-weight: 500;
106
101
  color: var(--openpress-color-muted);
107
- letter-spacing: 0.04em;
102
+ letter-spacing: 0.01em;
108
103
  }
109
104
 
110
105
  p {
111
106
  margin: 0 0 var(--openpress-space-2);
112
- font-size: clamp(4.2pt, 1.85cqw, 10.5pt);
113
- line-height: 1.85;
107
+ font-size: clamp(10px, 1.8cqw, 11px);
108
+ line-height: 1.65;
109
+ text-align: justify;
110
+ text-justify: inter-word;
114
111
  }
115
112
 
116
113
  .reader-page--content p,
@@ -206,8 +203,8 @@ ol,
206
203
  ul {
207
204
  margin: 0 0 var(--openpress-space-3);
208
205
  padding-left: 7mm;
209
- font-size: clamp(4.2pt, 1.85cqw, 10.5pt);
210
- line-height: 1.85;
206
+ font-size: clamp(10px, 1.75cqw, 11px);
207
+ line-height: 1.65;
211
208
  }
212
209
 
213
210
  ol {
@@ -146,99 +146,126 @@
146
146
  color: var(--openpress-color-ink);
147
147
  }
148
148
 
149
- /* ─ academic-paper title block ──────────────────────────────────────────── */
150
- /* IEEE-style title page: large serif title, optional subtitle, 3-column */
151
- /* author grid, abstract band, index terms band. Single-column body picks */
152
- /* up after this surface. Two-column body arrives with the v0.8 paged.js */
153
- /* migration. */
149
+ /* ─ academic-paper title block for the journal-style template ───────────── */
154
150
 
155
151
  .paper-cover {
156
152
  display: flex;
157
153
  flex-direction: column;
158
- gap: clamp(18px, 2.4cqw, 32px);
159
- padding-block: clamp(24px, 3cqw, 40px) 0;
154
+ gap: clamp(11px, 2.2cqw, 20px);
155
+ padding-block: clamp(18px, 2.5cqw, 30px) 0;
160
156
  font-family: var(--openpress-font-serif);
161
157
  color: var(--openpress-color-ink);
162
158
  }
163
159
 
160
+ .paper-cover-lead,
161
+ .paper-cover-short-title {
162
+ margin: 0;
163
+ text-align: center;
164
+ color: var(--openpress-color-muted);
165
+ font-family: var(--openpress-font-body);
166
+ font-size: clamp(8.5pt, 1.55cqw, 9.5pt);
167
+ letter-spacing: 0.01em;
168
+ line-height: 1.3;
169
+ }
170
+
171
+ .paper-cover-date {
172
+ margin: 0;
173
+ text-align: center;
174
+ color: var(--openpress-color-muted);
175
+ font-family: var(--openpress-font-body);
176
+ font-size: clamp(7.8pt, 1.3cqw, 8.7pt);
177
+ letter-spacing: 0;
178
+ line-height: 1.25;
179
+ }
180
+
181
+ .paper-cover-lead {
182
+ margin-top: 2mm;
183
+ }
184
+
185
+ .paper-cover-short-title {
186
+ margin-bottom: clamp(6px, 1.2cqw, 10px);
187
+ }
188
+
164
189
  .paper-title {
165
190
  font-family: var(--openpress-font-serif);
166
- font-size: clamp(28px, 4.4cqw, 36px);
191
+ font-size: clamp(32px, 4.9cqw, 45px);
167
192
  line-height: 1.2;
168
193
  font-weight: 400;
169
194
  text-align: center;
170
195
  margin: 0;
171
- letter-spacing: 0;
196
+ letter-spacing: -0.01em;
172
197
  }
173
198
 
174
- .paper-subtitle {
175
- font-size: clamp(11px, 1.4cqw, 12px);
176
- font-style: italic;
199
+ .paper-author-contact-note {
177
200
  text-align: center;
201
+ margin: 0;
202
+ font-size: clamp(8.5pt, 1.45cqw, 9.5pt);
178
203
  color: var(--openpress-color-muted);
204
+ line-height: 1.35;
205
+ }
206
+
207
+ .paper-author-line {
179
208
  margin: 0;
209
+ text-align: center;
210
+ font-size: clamp(11px, 2cqw, 13px);
211
+ line-height: 1.45;
212
+ font-weight: 500;
180
213
  }
181
214
 
182
- .paper-authors {
215
+ .paper-author-affiliations {
216
+ margin: 0;
183
217
  list-style: none;
184
218
  padding: 0;
185
- margin: clamp(8px, 1.6cqw, 16px) 0 0;
186
- display: grid;
187
- grid-template-columns: repeat(3, 1fr);
188
- gap: clamp(10px, 1.4cqw, 16px) clamp(8px, 1.2cqw, 14px);
189
- }
190
-
191
- .paper-author {
192
219
  display: flex;
193
220
  flex-direction: column;
194
- align-items: center;
221
+ gap: 1mm;
195
222
  text-align: center;
196
- font-size: clamp(10.5px, 1.3cqw, 11.5px);
197
- line-height: 1.35;
198
- gap: 0;
199
223
  }
200
224
 
201
- .paper-author-name {
202
- font-weight: 500;
203
- margin: 0 0 0.25em 0;
225
+ .paper-author {
226
+ display: flex;
227
+ flex-direction: column;
204
228
  }
205
229
 
206
230
  .paper-author-affiliation {
207
- font-style: italic;
208
- margin: 0;
209
- color: var(--openpress-color-ink);
210
- }
211
-
212
- .paper-author-location,
213
- .paper-author-contact {
214
231
  margin: 0;
215
232
  color: var(--openpress-color-ink);
233
+ font-family: var(--openpress-font-body);
234
+ font-size: clamp(9px, 1.6cqw, 10px);
235
+ line-height: 1.42;
216
236
  }
217
237
 
218
238
  .paper-abstract,
219
- .paper-index-terms {
239
+ .paper-nontechnical-summary,
240
+ .paper-contributions,
241
+ .paper-abstract > p,
242
+ .paper-nontechnical-summary > p,
243
+ .paper-contributions > p {
220
244
  margin-top: clamp(8px, 1.6cqw, 14px);
221
- font-size: clamp(10.5px, 1.3cqw, 11.5px);
245
+ font-family: var(--openpress-font-body);
246
+ font-size: clamp(10px, 1.7cqw, 11px);
222
247
  line-height: 1.45;
248
+ text-align: justify;
249
+ text-justify: inter-word;
223
250
  }
224
251
 
225
- .paper-abstract p,
226
- .paper-index-terms p {
252
+ .paper-abstract > p,
253
+ .paper-nontechnical-summary > p,
254
+ .paper-contributions > p {
227
255
  margin: 0;
228
- text-indent: 1.2em;
229
- font-style: italic;
256
+ text-indent: 0.9em;
230
257
  }
231
258
 
232
259
  .paper-abstract-label {
233
- font-style: normal;
234
- font-weight: 700;
260
+ display: inline-block;
261
+ font-weight: 500;
262
+ text-transform: none;
235
263
  }
236
264
 
237
- /* Single-column flush body (v0.6). The v0.8 paged.js migration replaces */
238
- /* this declaration with `column-count: 2; column-gap: 1rem;` and adds */
239
- /* `column-span: all` for the title block + abstract above. */
240
- .reader-page--content .page-body {
241
- max-width: none;
265
+ .paper-section-label {
266
+ font-family: var(--openpress-font-serif);
267
+ font-size: 0.95em;
268
+ font-weight: 500;
242
269
  }
243
270
 
244
271
  /* ─ academic-paper back cover ───────────────────────────────────────────── */
@@ -1,12 +1,26 @@
1
1
  /* page-surfaces / toc
2
- * Table-of-contents page surface routed by `kind: toc` and built by the
3
- * engine's renderToc(). Layout uses a 3-column grid (index / title / page).
2
+ * Table-of-contents page surface rendered by the manuscript <Toc> helper.
3
+ * Entries flow through the generated toc:<sourceId> chain and TocArea.
4
4
  */
5
5
 
6
6
  .reader-page--toc {
7
7
  padding: 0;
8
8
  }
9
9
 
10
+ .reader-page--toc .page-frame {
11
+ grid-template-rows: auto minmax(0, 1fr);
12
+ }
13
+
14
+ .reader-page--toc .toc-header {
15
+ display: block;
16
+ overflow: visible;
17
+ opacity: 1;
18
+ }
19
+
20
+ .reader-page--toc .openpress-toc-area {
21
+ height: 100%;
22
+ }
23
+
10
24
  .reader-page--toc h2 {
11
25
  margin-top: 0;
12
26
  font-family: var(--openpress-font-serif);
@@ -18,13 +32,7 @@
18
32
  }
19
33
 
20
34
  .reader-page--toc h2.toc-heading--continuation {
21
- margin-bottom: 0;
22
- color: var(--openpress-color-muted);
23
- font-family: var(--openpress-font-mono);
24
- font-size: calc(8.5pt - var(--openpress-type-step-down));
25
- font-weight: 400;
26
- letter-spacing: 0.08em;
27
- text-align: right;
35
+ display: none;
28
36
  }
29
37
 
30
38
  .toc-list {
@@ -51,6 +59,7 @@
51
59
  align-items: baseline;
52
60
  color: var(--openpress-color-ink);
53
61
  text-decoration: none;
62
+ font-family: var(--openpress-font-serif);
54
63
  padding: 1.6mm 0;
55
64
  font-weight: 400;
56
65
  line-height: 1.38;
@@ -117,6 +126,7 @@
117
126
  gap: 3mm;
118
127
  align-items: baseline;
119
128
  color: var(--openpress-color-ink);
129
+ font-family: var(--openpress-font-serif);
120
130
  }
121
131
 
122
132
  .toc-title::after {