@anthusai/papyrus 1.3.0 → 1.4.0-next.10

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 (141) hide show
  1. package/amplify/data/resource.js +134 -3
  2. package/amplify/data/resource.ts +145 -3
  3. package/amplify/data/schema.js +131 -0
  4. package/amplify/data/schema.ts +142 -0
  5. package/amplify/functions/category-action/handler.ts +272 -20
  6. package/amplify/functions/console-chat-responder/src/main.rs +1 -1
  7. package/amplify/functions/content-actions/handler.py +23 -0
  8. package/amplify/functions/content-actions/requirements.txt +1 -1
  9. package/amplify/functions/content-actions/resource.js +1 -1
  10. package/amplify/functions/content-actions/resource.ts +1 -1
  11. package/amplify/functions/model-attachment-upload/handler.ts +1 -0
  12. package/amplify/functions/renditions/requirements.txt +1 -1
  13. package/amplify/functions/shared/curation-delegation-flow.ts +147 -0
  14. package/amplify/functions/shared/curation-delegation.ts +115 -0
  15. package/amplify/functions/shared/python-bundle.js +3 -3
  16. package/amplify/functions/shared/python-bundle.ts +3 -3
  17. package/amplify/functions/shared/reference-curation-metadata.ts +51 -0
  18. package/amplify/functions/shared/slack-events.ts +2 -2
  19. package/amplify/publication/renditions-function.js +1 -1
  20. package/amplify/publication/renditions-function.ts +1 -1
  21. package/app/[year]/[month]/[day]/[articleSlug]/page.tsx +2 -1
  22. package/app/[year]/[month]/[day]/edition-route-page.tsx +2 -1
  23. package/app/[year]/[month]/[day]/page/[pageNumber]/page.tsx +2 -1
  24. package/app/[year]/[month]/[day]/page.tsx +3 -0
  25. package/app/[year]/[month]/[day]/section/[sectionKey]/page.tsx +2 -0
  26. package/app/api/archive/editions/route.ts +2 -0
  27. package/app/api/auth/prospectus/accounts/route.ts +9 -0
  28. package/app/api/local-preview/derive/route.ts +28 -0
  29. package/app/api/local-preview/media/route.ts +25 -0
  30. package/app/archive/page.tsx +3 -0
  31. package/app/globals.css +28 -28
  32. package/app/layout.tsx +8 -5
  33. package/app/newsroom/[section]/[...selection]/page.tsx +0 -1
  34. package/app/newsroom/[section]/page.tsx +8 -1
  35. package/app/newsroom/articles/page.tsx +10 -0
  36. package/app/newsroom/insights/[threadId]/page.tsx +5 -16
  37. package/app/newsroom/insights/page.tsx +4 -12
  38. package/app/newsroom/sections/[sectionId]/page.tsx +3 -0
  39. package/app/page.tsx +30 -1
  40. package/components/administration-delegations-panel.tsx +156 -0
  41. package/components/curation-delegation-client.ts +104 -0
  42. package/components/item-stream-view.tsx +63 -0
  43. package/components/markus-ir-preview.tsx +47 -2
  44. package/components/news-desk-client-provider.tsx +17 -2
  45. package/components/news-desk-page.tsx +0 -1
  46. package/components/news-desk-taxonomy-client.ts +154 -240
  47. package/components/newspaper.tsx +4 -4
  48. package/components/newsroom-article-editor.tsx +138 -40
  49. package/components/newsroom-assignment-detail.tsx +79 -0
  50. package/components/newsroom-assignments-view.tsx +1 -1
  51. package/components/newsroom-board-view.tsx +153 -43
  52. package/components/newsroom-client-shell.tsx +8 -1
  53. package/components/newsroom-newsprint-board.css +5 -46
  54. package/components/newsroom-ops-overview.tsx +27 -5
  55. package/components/newsroom-organizer-shell.tsx +36 -13
  56. package/components/newsroom-organizer.css +269 -13
  57. package/components/newsroom-references-view.tsx +118 -23
  58. package/components/newsroom-topics-view.tsx +1 -1
  59. package/components/priming-proof-page.tsx +17 -8
  60. package/components/prospectus-account-chooser.tsx +131 -0
  61. package/components/reference-cyclotron-priming.tsx +85 -0
  62. package/components/reference-cyclotron-status.tsx +5 -5
  63. package/components/reference-cyclotron-suggestion.tsx +143 -0
  64. package/components/reference-live-agreement.tsx +62 -0
  65. package/components/reference-section-suggestion.tsx +104 -0
  66. package/components/story-reporting-trail-client.ts +91 -0
  67. package/components/story-reporting-trail.tsx +115 -0
  68. package/components/topic-steering-workspace.tsx +280 -679
  69. package/components/ui/sheet.tsx +10 -4
  70. package/components/use-paged-content-item-versions.ts +151 -0
  71. package/components/wiki-concepts-view.tsx +153 -0
  72. package/components/wiki-index-client.ts +51 -0
  73. package/infra/amplify-app-shell.js +17 -3
  74. package/infra/amplify-app-shell.ts +18 -3
  75. package/infra/site-config.js +6 -1
  76. package/infra/site-config.ts +7 -1
  77. package/lib/approved-priming-proof-reports.ts +6 -3
  78. package/lib/approved-priming-proofs/papyrus.json +90 -0
  79. package/lib/article-flow.ts +95 -0
  80. package/lib/article-frame-solver.ts +519 -0
  81. package/lib/blog-feature-solver.ts +1 -109
  82. package/lib/category-repository.ts +1 -1
  83. package/lib/chrome-text.ts +504 -0
  84. package/lib/content-actions-client.ts +3 -0
  85. package/lib/content-actions-demo.ts +55 -0
  86. package/lib/content-item-lifecycle.ts +34 -5
  87. package/lib/content-source-context.ts +9 -1
  88. package/lib/curation-delegation-helpers.ts +69 -0
  89. package/lib/cyclotron-suggestions.ts +263 -0
  90. package/lib/front-matter-fields.ts +42 -0
  91. package/lib/front-mosaic.ts +1133 -0
  92. package/lib/furniture.ts +385 -0
  93. package/lib/graphql-content-repository.ts +42 -7
  94. package/lib/item-stream.ts +47 -0
  95. package/lib/labels.ts +37 -0
  96. package/lib/layout-config.ts +237 -0
  97. package/lib/layout-plan.ts +40 -11
  98. package/lib/layout-scenarios.ts +21 -11
  99. package/lib/layout-types.ts +457 -0
  100. package/lib/layout-warnings.ts +8 -0
  101. package/lib/local-preview-section-fixtures.ts +72 -0
  102. package/lib/local-preview-seed.ts +286 -0
  103. package/lib/local-preview-tenant.ts +27 -0
  104. package/lib/local-preview.ts +3 -0
  105. package/lib/newspaper-layout.ts +17 -3410
  106. package/lib/newsroom-articles.ts +2 -0
  107. package/lib/newsroom-assignments.ts +14 -1
  108. package/lib/newsroom-board.ts +99 -47
  109. package/lib/newsroom-demo-dashboard.ts +1 -1
  110. package/lib/newsroom-forum-routes.ts +2 -43
  111. package/lib/newsroom-index-filters.ts +3 -40
  112. package/lib/newsroom-media-backend.ts +5 -0
  113. package/lib/newsroom-nav.ts +1 -3
  114. package/lib/newsroom-organizer-nav.ts +9 -16
  115. package/lib/newsroom-section-routing.ts +1 -1
  116. package/lib/newsroom-sections.ts +12 -0
  117. package/lib/papyrus-web-locations.ts +3 -24
  118. package/lib/pretext-layout.ts +22 -0
  119. package/lib/priming-proof-report.ts +1 -0
  120. package/lib/prospectus-account-client.ts +90 -0
  121. package/lib/prospectus-sign-in-routes.ts +45 -0
  122. package/lib/prospectus-site-identity.ts +13 -1
  123. package/lib/prospectus-tenant.ts +22 -0
  124. package/lib/reader-static-params.ts +2 -1
  125. package/lib/relevance-decisions.ts +29 -0
  126. package/lib/relevance-status.ts +73 -0
  127. package/lib/reporting-story-budget.ts +2 -2
  128. package/lib/semantic-graph.ts +5 -5
  129. package/lib/site-brand.ts +28 -1
  130. package/lib/site-env.ts +5 -0
  131. package/lib/site-section-suggestions.ts +120 -0
  132. package/lib/site-stack.ts +1 -1
  133. package/lib/story-reporting-trail.ts +106 -0
  134. package/lib/tenant-keys.ts +32 -0
  135. package/lib/text-columns.ts +251 -0
  136. package/lib/wiki.ts +56 -0
  137. package/package.json +46 -3
  138. package/renderers/pretext/presentation-shell.tsx +1 -1
  139. package/renderers/pretext/rhythm-article-page.tsx +1 -18
  140. package/routes.manifest.json +34 -15
  141. package/app/newsroom/work/page.tsx +0 -10
@@ -15,15 +15,16 @@ body:has(.newsroom-organizer)>[data-staging-banner]{flex-shrink:0}
15
15
  .organizer-brand small{display:block;font:400 10px Newsroom UI,system-ui;letter-spacing:.3em;text-transform:uppercase;margin-top:12px}
16
16
  .organizer-destinations{min-height:0;overflow:auto;overscroll-behavior:contain;flex:1;padding-right:1px}
17
17
  .organizer-destinations section+section{margin-top:24px}.organizer-destinations h3{font:600 10px Newsroom UI,system-ui;letter-spacing:.07em;text-transform:uppercase;color:var(--org-muted);margin:16px 0 8px}
18
- .organizer-destinations a{display:flex;flex-direction:column;align-items:start;gap:6px;padding:14px 8px;border-bottom:1px solid var(--org-line);color:var(--org-muted);text-decoration:none;min-height:44px}
19
- .organizer-destinations a strong{font:700 16px Newsroom Display,Georgia,serif}.organizer-destinations a small{font:400 11px/1.5 Newsroom UI,system-ui;white-space:normal;overflow-wrap:anywhere}
20
- .organizer-destinations a[aria-current=page]{border-bottom:2px solid var(--org-ink);color:var(--org-ink)}
18
+ .organizer-destinations a{display:flex;flex-direction:column;align-items:start;gap:6px;padding:14px 8px;border-bottom:1px solid var(--org-line);color:var(--org-ink);text-decoration:none;min-height:44px}
19
+ .organizer-destinations a strong{font:700 16px Newsroom Display,Georgia,serif}.organizer-destinations a small{font:400 11px/1.5 Newsroom UI,system-ui;white-space:normal;overflow-wrap:anywhere;color:var(--org-muted)}
20
+ .organizer-destinations a[aria-current=page]{border-bottom:3px double var(--org-ink);color:var(--org-ink);box-shadow:inset 3px 0 0 var(--org-ink)}
21
21
  .newsroom-organizer :is(a,button):focus-visible,.organizer-menu :is(a,button):focus-visible{outline:2px solid currentColor;outline-offset:-3px}
22
22
  .organizer-workspace{display:flex;flex-direction:column;min-height:0;min-width:0;overflow:hidden;padding:0 16px}
23
- .organizer-topbar{height:57px;min-height:57px;display:flex;align-items:center;gap:16px;border-bottom:1px solid var(--org-ink)}
23
+ .organizer-topbar{height:48px;min-height:48px;display:flex;align-items:center;gap:16px;border-bottom:1px solid var(--org-ink)}
24
24
  .organizer-masthead{font:900 28px Newsroom Display,Georgia,serif;white-space:nowrap;max-width:30vw;overflow:hidden;text-overflow:ellipsis}
25
25
  .organizer-topbar h1{font:400 12px Newsroom UI,system-ui;flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin:0}
26
- .organizer-toggle{display:flex;align-items:center;gap:8px;min-height:36px;padding:8px 12px;border:1px solid var(--org-line);font:400 11px Newsroom UI,system-ui;flex-shrink:0}
26
+ .organizer-toggle{display:flex;align-items:center;justify-content:center;width:36px;min-height:36px;padding:0;border:1px solid var(--org-line);flex-shrink:0}
27
+ .organizer-sidebar-head{display:flex;align-items:flex-start;justify-content:space-between;gap:8px}.organizer-sidebar-head .organizer-brand{flex:1;min-width:0}
27
28
  .organizer-header-actions{display:flex;align-items:center;gap:8px;min-width:0;max-width:45%;overflow-x:auto}
28
29
  .organizer-main{min-width:0;min-height:0;overflow:auto;overscroll-behavior:contain;flex:1;padding:16px 0}
29
30
  .organizer-main>[data-category-steering]{min-height:0}.organizer-demo-notice{font-size:11px;color:var(--org-muted);margin-bottom:12px}
@@ -35,21 +36,22 @@ body:has(.newsroom-organizer)>[data-staging-banner]{flex-shrink:0}
35
36
  .organizer-account-popup [role=menuitem]{min-height:40px;font-size:12px}.organizer-account-popup .reader-auth{display:contents}.organizer-account-popup .reader-auth__error{display:block;white-space:normal;font-size:11px;padding:8px}
36
37
  .organizer-bottom-nav{display:none}
37
38
  .organizer-main:has(.organizer-native-board){display:flex;overflow:hidden}
38
- .organizer-native-board{display:flex;flex-direction:column;flex:1;min-height:0;min-width:0;gap:12px}
39
- .organizer-board-toolbar{display:flex;align-items:center;justify-content:space-between;gap:12px;min-width:0;flex-wrap:wrap}
40
- .organizer-board-toolbar [role=group]{display:flex;gap:8px;flex-wrap:wrap}
41
- .organizer-board-toolbar button{min-height:44px;padding:8px 12px;border:1px solid var(--org-line)}
42
- .organizer-board-toolbar button[aria-pressed=true]{background:var(--org-ink);color:var(--org-paper)}
43
- .organizer-board-note{font-size:11px;line-height:1.5;margin:0;color:var(--org-muted)}
39
+ .organizer-native-board{display:flex;flex-direction:column;flex:1;min-height:0;min-width:0;gap:8px}
40
+ .organizer-board-view-toggle{display:flex;gap:4px;flex-shrink:0}
41
+ .organizer-header-button{display:inline-flex;align-items:center;gap:6px;min-height:36px;padding:4px 12px;border:1px solid var(--org-line);font:inherit;color:inherit;background:transparent;text-decoration:none;white-space:nowrap;cursor:pointer}
42
+ .organizer-header-button[aria-pressed=true]{background:transparent;color:var(--org-ink);font-weight:700;box-shadow:inset 0 -3px 0 var(--org-ink)}
43
+ .organizer-board-note{font-size:11px;line-height:1.5;margin:0;color:var(--org-muted);white-space:nowrap}
44
+ @media(min-width:901px){.newsroom-organizer[data-sidebar-collapsed=false] .organizer-masthead{display:none}}
44
45
  .organizer-board-body{position:relative;display:grid;grid-template-columns:minmax(0,1fr);flex:1;min-width:0;min-height:0;gap:16px}
45
- .organizer-board-body[data-detail-open=true]{grid-template-columns:minmax(0,1fr) minmax(280px,360px)}
46
+ .organizer-board-body[data-detail-open=true]{grid-template-columns:minmax(0,1fr) clamp(320px,34vw,1000px)}
46
47
  .organizer-board-body>.kb-issue-collection{height:100%;min-height:0;overflow:auto}
47
48
  .organizer-board-body>.kb-issue-detail{overflow:auto;min-height:0}
48
- .organizer-board-body .kb-issue-detail a{display:block;min-height:44px;text-decoration:underline;padding:12px 0}
49
+ .organizer-board-body .kb-issue-detail a:not(.organizer-header-button){display:block;min-height:44px;text-decoration:underline;padding:12px 0}
49
50
  .organizer-menu{height:min(85dvh,760px);max-height:85dvh;display:flex;flex-direction:column;padding:16px;border-radius:24px 24px 0 0;gap:20px}
50
51
  .organizer-menu .organizer-destinations{overflow-y:auto}.organizer-menu .organizer-destinations section{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}.organizer-menu .organizer-destinations h3{grid-column:1/-1;font-size:12px;text-transform:none;margin:0 0 4px}
51
52
  .organizer-menu .organizer-destinations a{border:1px solid var(--org-line);padding:12px;color:var(--org-ink)}
52
53
  @media(max-width:900px){
54
+ .organizer-board-note{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)}
53
55
  .newsroom-organizer,.newsroom-organizer[data-sidebar-collapsed=true]{grid-template-columns:minmax(0,1fr);grid-template-rows:minmax(0,1fr) auto}
54
56
  .organizer-sidebar,.organizer-toggle{display:none}.organizer-workspace{padding:0 16px}.organizer-topbar{gap:8px;height:55px;min-height:55px}
55
57
  .organizer-masthead{font-size:24px;max-width:36vw}.organizer-topbar h1{font-size:10px}.organizer-account-header{display:flex}.organizer-header-actions{gap:4px;max-width:35%}
@@ -61,3 +63,257 @@ body:has(.newsroom-organizer)>[data-staging-banner]{flex-shrink:0}
61
63
  .organizer-board-body>.kb-issue-detail{position:absolute;inset:0;z-index:2;overflow:auto}
62
64
  }
63
65
  @media(prefers-reduced-motion:reduce){.newsroom-organizer,.newsroom-organizer *,.organizer-menu,.organizer-menu *,.organizer-account-popup,.organizer-account-popup *{scroll-behavior:auto;animation:none!important;transition:none!important}}
66
+ .newsroom-organizer :is(button,input,select,textarea,[role=button],[role=tab],[role=combobox],[role=option],[role=menuitem],a[class]),.organizer-menu :is(button,a),.organizer-account-popup :is(button,a){border-radius:0 !important}
67
+ .newsroom-assignment-detail,.newsroom-embedded-article{container-type:inline-size;min-width:0}
68
+ .newsroom-assignment-detail{display:grid;gap:16px;padding:12px}
69
+ .newsroom-assignment-detail-title{margin:0;font-size:1.25rem;line-height:1.25;overflow-wrap:anywhere}
70
+ .newsroom-assignment-detail-facts{display:grid;gap:8px 16px;grid-template-columns:minmax(0,1fr);margin:0}
71
+ .newsroom-assignment-detail-facts>div{display:grid;grid-template-columns:minmax(80px,max-content) minmax(0,1fr);gap:8px;border-top:1px solid var(--org-line);padding-top:6px}
72
+ .newsroom-assignment-detail-facts dt{color:var(--org-muted);font-size:12px;text-transform:uppercase;letter-spacing:.04em}
73
+ .newsroom-assignment-detail-facts dd{margin:0;overflow-wrap:anywhere}
74
+ .newsroom-assignment-detail-prose{display:grid;gap:12px}
75
+ .newsroom-assignment-detail-prose h3{margin:0 0 4px;font-size:12px;text-transform:uppercase;letter-spacing:.04em;color:var(--org-muted)}
76
+ .newsroom-assignment-detail-prose p{margin:0;white-space:pre-wrap;overflow-wrap:anywhere;line-height:1.5}
77
+ @container (min-width:560px){.newsroom-assignment-detail-facts{grid-template-columns:repeat(2,minmax(0,1fr))}}
78
+ @container (min-width:900px){.newsroom-assignment-detail{grid-template-columns:minmax(0,2fr) minmax(280px,1fr);align-items:start;column-gap:32px}.newsroom-assignment-detail-title{grid-column:1/-1}.newsroom-assignment-detail-facts{grid-template-columns:minmax(0,1fr)}}
79
+ @container (min-width:1500px){.newsroom-assignment-detail-prose{grid-template-columns:repeat(2,minmax(0,1fr))}}
80
+ .newsroom-embedded-article{padding:0 8px 12px}
81
+ .newsroom-embedded-article :is(textarea,input,select){max-width:100%}
82
+ .newsroom-embedded-article [class*="grid-cols-2"],.newsroom-embedded-article [class*="lg:grid"]{grid-template-columns:minmax(0,1fr) !important}
83
+ @container (min-width:1100px){.newsroom-embedded-article [class*="lg:grid"]{grid-template-columns:repeat(2,minmax(0,1fr)) !important}}
84
+ .newsroom-organizer [class*="rounded"]:not([data-slot=avatar]):not([class*="animate-spin"]):not([role=progressbar]),.organizer-menu,.organizer-account-popup,[data-slot=dialog-content],[data-slot=popover-content],[data-slot=dropdown-menu-content],[data-slot=select-content],[data-slot=tooltip-content]{border-radius:0 !important}
85
+
86
+ :root.light-theme .newsroom-organizer,:root.light-theme .organizer-menu,:root.light-theme .organizer-account-popup{--org-ink:var(--foreground-strong);--org-muted:var(--foreground)}
87
+ .newsroom-organizer [class~="bg-primary"],.newsroom-organizer [class~="bg-secondary"],.newsroom-organizer [data-slot=button][class*="bg-primary"]{background:transparent !important;color:var(--org-ink) !important;border:1px solid var(--org-ink) !important;font-weight:700}
88
+ .newsroom-organizer [class~="text-primary-foreground"],.newsroom-organizer [class~="text-secondary-foreground"]{color:var(--org-ink) !important}
89
+ .newsroom-organizer [data-selected=true],.newsroom-organizer [aria-current=true]{background:transparent !important;color:var(--org-ink) !important;box-shadow:inset 3px 0 0 var(--org-ink);font-weight:600}
90
+ .newsroom-organizer .news-desk-columns--administration{--administration-gap:16px;--administration-quiet:color-mix(in srgb,rgb(var(--ink-solid-rgb)) 64%,var(--org-paper));--administration-strong:rgb(var(--ink-solid-rgb));container-type:inline-size;font-family:Newsroom UI,system-ui,sans-serif;font-size:14px;line-height:1.5;max-width:1280px}
91
+ .news-desk-columns--administration :is(h2,h3,strong){font-family:Newsroom Display,Georgia,serif;color:var(--administration-strong)}
92
+ .news-desk-columns--administration .category-steering-section--lead>.category-steering-section__header{display:none}
93
+ .news-desk-columns--administration .news-desk-settings-shell{display:grid;grid-template-columns:minmax(0,1fr);gap:24px;align-items:start}
94
+ .news-desk-columns--administration .news-desk-settings-nav{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;border-right:0;padding-right:0}
95
+ .news-desk-columns--administration .news-desk-settings-nav a{display:flex;flex-direction:column;gap:4px;padding:12px;border:1px solid var(--org-line);background:transparent;color:inherit;text-decoration:none;min-height:44px;min-width:0}
96
+ .news-desk-columns--administration .news-desk-settings-nav a[data-active=true]{border-color:var(--administration-strong);box-shadow:inset 0 -2px 0 var(--administration-strong);background:transparent}
97
+ .news-desk-columns--administration .news-desk-settings-nav a strong{font-size:16px;font-weight:700;line-height:1.2}
98
+ .news-desk-columns--administration .news-desk-settings-nav a span{display:none;font:400 12px/1.4 Newsroom UI,system-ui,sans-serif;letter-spacing:0;text-transform:none;color:var(--administration-quiet)}
99
+ .news-desk-columns--administration .news-desk-settings-panel{display:grid;gap:24px;min-width:0}
100
+ .news-desk-columns--administration .category-steering-section__header{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;gap:4px 16px;margin:0 0 16px;padding-bottom:8px;border-bottom:2px solid var(--administration-strong)}
101
+ .news-desk-columns--administration .category-steering-section__header h2{margin:0;font-size:22px;font-weight:700;line-height:1.2}
102
+ .news-desk-columns--administration .category-steering-section__header span{font:400 12px/1.4 Newsroom UI,system-ui,sans-serif;letter-spacing:0;text-transform:none;color:var(--administration-quiet)}
103
+ .news-desk-columns--administration .story-label{margin:0;font:600 11px/1.4 Newsroom UI,system-ui,sans-serif;letter-spacing:.07em;text-transform:uppercase;color:var(--administration-quiet)}
104
+ .news-desk-columns--administration .news-desk-doctrine-list{display:grid;gap:24px;min-width:0;max-width:none;width:100%}
105
+ .news-desk-columns--administration .news-desk-doctrine-card{display:grid;gap:16px;min-width:0;padding:0;border:0}
106
+ .news-desk-columns--administration .news-desk-doctrine-card+.news-desk-doctrine-card{padding-top:24px;border-top:1px solid var(--org-line)}
107
+ .news-desk-columns--administration .news-desk-doctrine-card__header,.news-desk-columns--administration .news-desk-doctrine-card__footer,.news-desk-columns--administration .news-desk-doctrine-card__actions{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:8px 12px}
108
+ .news-desk-columns--administration .news-desk-doctrine-card__header>div{display:grid;gap:2px}
109
+ .news-desk-columns--administration .news-desk-doctrine-card h3{margin:0;font-size:20px;font-weight:700;line-height:1.2}
110
+ .news-desk-columns--administration .news-desk-doctrine-card__header>span,.news-desk-columns--administration .news-desk-doctrine-card__footer>span,.news-desk-columns--administration .news-desk-doctrine-card__actions>span{font:600 11px/1.4 Newsroom UI,system-ui,sans-serif;letter-spacing:.07em;text-transform:uppercase;color:var(--administration-quiet)}
111
+ .news-desk-columns--administration .news-desk-doctrine-card__footer{padding-top:0;border-top:0}
112
+ .news-desk-columns--administration .news-desk-doctrine-card__actions{justify-content:flex-end}
113
+ .news-desk-columns--administration .news-desk-doctrine-card__field{display:grid;gap:6px;min-width:0}
114
+ .news-desk-columns--administration .news-desk-doctrine-card__field>span{font:600 11px/1.4 Newsroom UI,system-ui,sans-serif;letter-spacing:.07em;text-transform:uppercase;color:var(--administration-quiet)}
115
+ .news-desk-columns--administration :is(.news-desk-doctrine-card__field,.news-desk-merge-panel) :is(input:not([type=checkbox]),select,textarea){width:100%;max-width:100%;min-height:40px;padding:8px 10px;border:1px solid var(--org-line);background:transparent;color:var(--administration-strong);font:400 14px/1.5 Newsroom UI,system-ui,sans-serif;letter-spacing:0}
116
+ .news-desk-columns--administration .news-desk-doctrine-card__field textarea{min-height:96px;max-height:360px;field-sizing:content;resize:vertical}
117
+ .news-desk-columns--administration .news-desk-doctrine-card__field :is(input,select,textarea):focus-visible{outline:2px solid var(--administration-strong);outline-offset:-1px}
118
+ .news-desk-columns--administration .news-desk-doctrine-card__field:has(input[type=checkbox]){grid-auto-flow:column;justify-content:start;align-items:center;gap:12px}
119
+ .news-desk-columns--administration .news-desk-doctrine-card__field input[type=checkbox]{width:18px;height:18px;margin:0;accent-color:var(--administration-strong)}
120
+ .news-desk-columns--administration details{border-top:1px solid var(--org-line);padding-top:12px}
121
+ .news-desk-columns--administration details[open]{display:grid;gap:16px}
122
+ .news-desk-columns--administration [data-news-desk-admin-panel]{display:grid;gap:24px;align-content:start}
123
+ .news-desk-columns--administration [data-news-desk-admin-panel]>.news-desk-doctrine-card{padding-top:24px;border-top:1px solid var(--org-line)}
124
+ .news-desk-columns--administration summary{cursor:pointer;min-height:32px;display:flex;align-items:center;font:600 12px/1.4 Newsroom UI,system-ui,sans-serif;letter-spacing:.07em;text-transform:uppercase;color:var(--administration-quiet)}
125
+ .news-desk-columns--administration details[open] summary{margin-bottom:0}
126
+ .news-desk-columns--administration :is(.news-desk-doctrine-card__actions button,.news-desk-user-row__actions button,.news-desk-primary-action-button,.news-desk-merge-panel button){display:inline-flex;align-items:center;justify-content:center;gap:6px;min-height:36px;padding:4px 12px;border:1px solid var(--org-line);background:transparent;color:var(--administration-strong);font:600 12px/1.2 Newsroom UI,system-ui,sans-serif;letter-spacing:.05em;text-transform:uppercase;white-space:nowrap;cursor:pointer}
127
+ .news-desk-columns--administration .news-desk-doctrine-card__actions button:last-child:not(:only-child),.news-desk-columns--administration .news-desk-doctrine-card__actions button:only-child,.news-desk-columns--administration .news-desk-primary-action-button,.news-desk-columns--administration [data-news-desk-merge-confirm]{background:transparent;border:2px solid var(--org-ink);color:var(--org-ink);font-weight:700}
128
+ .news-desk-columns--administration :is(.news-desk-doctrine-card__actions,.news-desk-user-row__actions) button:disabled,.news-desk-columns--administration .news-desk-primary-action-button:disabled{background:transparent;border-color:var(--org-line);color:var(--administration-quiet);opacity:.6;cursor:default}
129
+ .news-desk-columns--administration .news-desk-administration-category-layout{display:grid;grid-template-columns:minmax(0,1fr);gap:24px;align-items:start}
130
+ .news-desk-columns--administration .news-desk-administration-category-list{display:grid;gap:0;min-width:0;max-height:min(46dvh,420px);overflow:auto;padding:0;border:1px solid var(--org-line)}
131
+ .news-desk-columns--administration .news-desk-administration-category-list>.story-label{padding:12px 12px 6px;border-top:1px solid var(--org-line)}
132
+ .news-desk-columns--administration .news-desk-administration-category-list>.story-label:first-child{border-top:0}
133
+ .news-desk-columns--administration .news-desk-administration-category-list>.news-desk-primary-action-button{margin:12px}
134
+ .news-desk-columns--administration .news-desk-administration-category-list>.category-steering-empty{padding:12px;border:0}
135
+ .news-desk-columns--administration .news-desk-administration-category-button{display:grid;gap:2px;width:100%;padding:10px 12px;border:0;border-left:3px solid transparent;border-top:1px solid var(--org-line);background:transparent;text-align:left;color:inherit;cursor:pointer;min-height:44px}
136
+ .news-desk-columns--administration .news-desk-administration-category-list>.story-label+.news-desk-administration-category-button{border-top:0}
137
+ .news-desk-columns--administration .news-desk-administration-category-button[data-selected=true]{border-left-color:var(--administration-strong);background:color-mix(in srgb,var(--administration-strong) 7%,transparent)}
138
+ .news-desk-columns--administration .news-desk-administration-category-button span{font:700 15px/1.25 Newsroom Display,Georgia,serif;color:var(--administration-strong)}
139
+ .news-desk-columns--administration .news-desk-administration-category-button small{font:400 12px/1.4 Newsroom UI,system-ui,sans-serif;letter-spacing:0;text-transform:none;color:var(--administration-quiet)}
140
+ .news-desk-columns--administration .news-desk-administration-category-doctrine{display:grid;gap:0;margin-top:16px;padding-top:24px;border-top:1px solid var(--org-line)}
141
+ .news-desk-columns--administration .news-desk-user-list{display:grid;gap:0;max-width:960px}
142
+ .news-desk-columns--administration .news-desk-user-row{display:grid;grid-template-columns:minmax(0,1fr);gap:12px;align-items:start;padding:16px 0;border-top:1px solid var(--org-line)}
143
+ .news-desk-columns--administration .news-desk-user-row:first-child{padding-top:0;border-top:0}
144
+ .news-desk-columns--administration .news-desk-user-row>div:first-child{display:grid;gap:6px;min-width:0}
145
+ .news-desk-columns--administration .news-desk-user-row header{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 12px;justify-content:flex-start}
146
+ .news-desk-columns--administration .news-desk-user-row strong{font-size:18px;font-weight:700;line-height:1.2}
147
+ .news-desk-columns--administration .news-desk-user-row header span{font:600 11px/1.4 Newsroom UI,system-ui,sans-serif;letter-spacing:.07em;text-transform:uppercase;color:var(--administration-quiet)}
148
+ .news-desk-columns--administration .news-desk-user-row p{margin:0;font:400 13px/1.5 Newsroom UI,system-ui,sans-serif;letter-spacing:0;text-transform:none;color:var(--administration-quiet);overflow-wrap:anywhere}
149
+ .news-desk-columns--administration .news-desk-user-row__actions{display:flex;flex-wrap:wrap;gap:8px}
150
+ .news-desk-columns--administration .news-desk-chip-row{display:flex;flex-wrap:wrap;gap:6px}
151
+ .news-desk-columns--administration .news-desk-chip-row span{padding:2px 8px;border:1px solid var(--org-line);font:400 12px/1.5 Newsroom UI,system-ui,sans-serif;letter-spacing:0;text-transform:none;color:var(--administration-quiet);overflow-wrap:anywhere}
152
+ .news-desk-columns--administration .news-desk-merge-panel{display:grid;gap:16px;margin-top:24px;padding:16px;border:1px solid var(--org-line)}
153
+ .news-desk-columns--administration .category-steering-alert{padding:10px 12px;border:1px solid var(--org-line);border-left:3px solid var(--administration-strong);font-size:13px;line-height:1.5;color:var(--administration-strong)}
154
+ .news-desk-columns--administration .category-steering-empty{padding:16px;border:1px dashed var(--org-line);font:400 14px/1.5 Newsroom UI,system-ui,sans-serif;letter-spacing:0;text-transform:none;color:var(--administration-quiet)}
155
+ @container (min-width:600px){
156
+ .news-desk-columns--administration .news-desk-settings-nav{grid-template-columns:repeat(4,minmax(0,1fr))}
157
+ .news-desk-columns--administration .news-desk-settings-nav a span{display:block}
158
+ .news-desk-columns--administration .news-desk-user-row{grid-template-columns:minmax(0,1fr) auto}
159
+ .news-desk-columns--administration .news-desk-user-row__actions{justify-content:flex-end;max-width:260px}
160
+ }
161
+ @container (min-width:900px){
162
+ .news-desk-columns--administration .news-desk-settings-shell{grid-template-columns:240px minmax(0,1fr);gap:32px}
163
+ .news-desk-columns--administration .news-desk-settings-nav{grid-template-columns:minmax(0,1fr);gap:0;position:sticky;top:0}
164
+ .news-desk-columns--administration .news-desk-settings-nav a{border-width:0 0 1px;padding:12px 8px}
165
+ .news-desk-columns--administration .news-desk-settings-nav a[data-active=true]{box-shadow:inset 3px 0 0 var(--administration-strong);border-bottom-color:var(--org-line)}
166
+ .news-desk-columns--administration .news-desk-administration-category-layout{grid-template-columns:minmax(220px,280px) minmax(0,1fr)}
167
+ .news-desk-columns--administration .news-desk-administration-category-list{max-height:none}
168
+ }
169
+ .newsroom-assignment-detail-desk{display:grid;gap:4px;font-size:12px;text-transform:uppercase;letter-spacing:.04em;color:var(--org-muted)}
170
+ .newsroom-assignment-detail-error{margin:0;text-transform:none;letter-spacing:0;color:var(--org-ink);font-weight:700}
171
+ [data-slot=select-content],[data-slot=select-item],[data-slot=dropdown-menu-item],[data-slot=dropdown-menu-content],[role=option],[role=menuitem],[role=listbox],[role=menu]{border-radius:0 !important}
172
+ .newsroom-desk-group-heading{margin:16px 0 8px;font:700 12px Newsroom Display,Georgia,serif;text-transform:uppercase;letter-spacing:.08em;border-bottom:1px solid var(--org-ink);padding-bottom:4px}
173
+ .newsroom-desk-group-heading small{font:400 11px Newsroom UI,system-ui;text-transform:none;letter-spacing:0;color:var(--org-muted);margin-left:8px}
174
+ .newsroom-desk-legacy-value{display:block;font-size:11px;color:var(--org-muted);overflow-wrap:anywhere}
175
+ .newsroom-article-view-toggle{display:inline-flex}
176
+ .newsroom-article-front-matter>summary{cursor:pointer;font-size:14px;font-weight:600;padding:6px 0;list-style-position:inside}
177
+ .newsroom-article-front-matter[open]>summary{margin-bottom:6px}
178
+ .story-trail{container-type:inline-size;display:grid;gap:20px}
179
+ .story-trail-section h3{margin:0 0 8px;font-size:12px;text-transform:uppercase;letter-spacing:.06em;border-bottom:1px solid var(--org-ink);padding-bottom:4px}
180
+ .story-trail-section h3 small{font-weight:400;color:var(--org-muted);margin-left:6px}
181
+ .story-trail-list,.story-trail-events{list-style:none;margin:0;padding:0;display:grid;gap:12px}
182
+ .story-trail-list>li{border-bottom:1px solid var(--org-line);padding-bottom:12px;display:grid;gap:4px}
183
+ .story-trail-list>li:last-child{border-bottom:0}
184
+ .story-trail-events{gap:2px;padding-left:12px;border-left:2px solid var(--org-line);font-size:13px}
185
+ .story-trail-row{display:flex;flex-wrap:wrap;gap:8px;align-items:baseline}
186
+ .story-trail-meta,.story-trail-empty{font-size:12px;color:var(--org-muted);margin:0}
187
+ .story-trail-chip{font-size:11px;border:1px solid var(--org-ink);padding:0 6px;text-transform:uppercase;letter-spacing:.04em}
188
+ .story-trail-message pre{white-space:pre-wrap;overflow-wrap:anywhere;margin:6px 0 0;font-size:12px;max-height:320px;overflow:auto}
189
+ .story-trail-message summary{cursor:pointer;font-size:13px}
190
+ @container (min-width:900px){.story-trail{grid-template-columns:repeat(2,minmax(0,1fr));column-gap:32px;align-items:start}}
191
+ .newsroom-article-older-version{margin:0 0 12px;padding:8px 12px;border:1px solid var(--org-ink);border-left-width:5px;font-weight:600}
192
+ .newsroom-article-link-button{background:none;border:0;padding:0;font:inherit;text-decoration:underline;cursor:pointer;color:inherit}
193
+ .story-trail-list>li[data-story-reference-focused]{border-left:3px solid var(--org-ink);padding-left:10px}
194
+ .story-trail-list>li[data-story-trail-feed-reference]{border-left:1px solid var(--org-line);padding-left:10px}
195
+ .wiki{display:grid;grid-template-columns:minmax(200px,260px) minmax(0,1fr);gap:24px;align-items:start}
196
+ .wiki-sidebar{display:grid;gap:8px;position:sticky;top:0;max-height:100vh;overflow:auto;border-right:1px solid var(--org-line);padding-right:16px}
197
+ .wiki-home{text-align:left;background:none;border:0;border-bottom:1px solid var(--org-ink);padding:4px 0;font:inherit;font-weight:600;cursor:pointer;color:var(--org-ink)}
198
+ .wiki-home[aria-current="page"]{text-decoration:underline;text-underline-offset:4px}
199
+ .wiki-search,.wiki-kind{font:inherit;border:1px solid var(--org-ink);border-radius:0;padding:4px 8px;background:transparent;color:var(--org-ink)}
200
+ .wiki-sidebar-list,.wiki-concept-list{list-style:none;margin:0;padding:0;display:grid;gap:6px}
201
+ .wiki-sidebar-list a{color:var(--org-ink);text-decoration:none}
202
+ .wiki-sidebar-list a[aria-current="page"]{font-weight:700;text-decoration:underline;text-underline-offset:4px}
203
+ .wiki-main{min-width:0;max-width:820px}
204
+ .wiki-page h1{margin:0 0 6px}
205
+ .wiki-page h2{font-size:12px;text-transform:uppercase;letter-spacing:.06em;border-bottom:1px solid var(--org-ink);padding-bottom:4px;margin:24px 0 8px}
206
+ .wiki-page h3{font-size:13px;margin:12px 0 4px}
207
+ .wiki-page-tools{display:flex;justify-content:flex-end;margin-bottom:8px}
208
+ .wiki-tool-link{background:none;border:0;padding:0;font:inherit;color:var(--org-ink);text-decoration:underline;text-underline-offset:3px;cursor:pointer}
209
+ .wiki-link,.wiki-concept-list a{color:var(--org-ink);text-decoration:underline;text-underline-offset:3px}
210
+ .wiki-concept-list li{display:flex;flex-wrap:wrap;gap:8px;align-items:baseline}
211
+ .wiki-chip{font-size:11px;border:1px solid var(--org-ink);padding:0 6px;text-transform:uppercase;letter-spacing:.04em}
212
+ .wiki-meta,.wiki-empty{font-size:12px;color:var(--org-muted);margin:0}
213
+ @media (max-width:760px){.wiki{grid-template-columns:minmax(0,1fr)}.wiki-sidebar{position:static;max-height:240px;border-right:0;padding-right:0}}
214
+ .organizer-board-body .kb-issue-detail [data-markus-preview] a,.organizer-board-body .kb-issue-detail .wiki-link{display:inline;min-height:0;padding:0}
215
+ .newsroom-article-front-matter-fields{display:grid;gap:10px;max-width:640px}
216
+ .newsroom-article-front-matter-fields label{display:grid;gap:4px;font-size:13px;font-weight:600}
217
+ .newsroom-article-summary{border-bottom:1px solid var(--org-line);margin-bottom:12px;padding-bottom:10px}
218
+ .newsroom-article-subtitle{margin:0 0 4px;font-size:18px;font-weight:600;line-height:1.3}
219
+ .newsroom-article-blurb{margin:0;font-size:14px;line-height:1.45}
220
+ .organizer-search{display:flex;align-items:center;gap:6px;border-bottom:1px solid var(--org-ink);padding:2px 0;min-width:140px;max-width:240px}
221
+ .organizer-search input{font:inherit;font-size:13px;border:0;background:transparent;color:var(--org-ink);outline:0;width:100%;padding:2px 0}
222
+ .organizer-search input:focus-visible{text-decoration:underline;text-underline-offset:4px}
223
+ @media (max-width:900px){.organizer-search{min-width:0;max-width:120px}}
224
+ .taxonomy-view-switch{display:flex;gap:20px;border-bottom:1px solid var(--org-line);margin-bottom:12px}
225
+ .taxonomy-view-switch a{color:var(--org-ink);text-decoration:none;padding:4px 0;border-bottom:2px solid transparent}
226
+ .taxonomy-view-switch a[aria-current="page"]{font-weight:700;border-bottom-color:var(--org-ink)}
227
+ .news-desk-settings-shell[data-settings-nav="hidden"]{display:block}
228
+ .news-desk-columns--taxonomy{display:block;margin:0;--administration-quiet:var(--org-muted);--administration-strong:var(--org-ink)}
229
+ .news-desk-columns--taxonomy .category-steering-section--lead>.category-steering-section__header{display:flex}
230
+ .news-desk-columns--taxonomy .news-desk-main-column{display:grid;grid-template-columns:minmax(220px,300px) minmax(0,1fr);gap:0 40px;align-items:start;grid-column:auto;container-type:inline-size}
231
+ .news-desk-columns--taxonomy .news-desk-desk-list{display:grid;grid-template-columns:minmax(0,1fr);gap:0}
232
+ .news-desk-columns--taxonomy .news-desk-desk-card{border-top:0;border-bottom:1px solid var(--org-line);border-left:3px solid transparent;padding:12px 0 12px 12px;gap:2px;background:none}
233
+ .news-desk-columns--taxonomy .news-desk-desk-card[data-selected="true"]{border-left-color:var(--org-ink);background:none;padding:12px 0 12px 12px}
234
+ .news-desk-columns--taxonomy .news-desk-desk-card[data-selected="true"] strong{text-decoration:underline;text-underline-offset:4px}
235
+ .news-desk-columns--taxonomy .news-desk-desk-card>span{font:600 11px/1.4 Newsroom UI,system-ui,sans-serif;letter-spacing:.07em;color:var(--org-muted)}
236
+ .news-desk-columns--taxonomy .news-desk-desk-card strong{font:700 18px/1.2 Newsroom Display,Georgia,serif;color:var(--org-ink)}
237
+ .news-desk-columns--taxonomy .news-desk-desk-card p{font:400 13px/1.4 Newsroom UI,system-ui,sans-serif;color:var(--org-ink);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
238
+ .news-desk-columns--taxonomy .news-desk-desk-card small{font:400 12px/1.4 Newsroom UI,system-ui,sans-serif;letter-spacing:0;text-transform:none;color:var(--org-muted)}
239
+ .news-desk-columns--taxonomy .news-desk-desk-detail{margin:0;display:grid;gap:24px;min-width:0}
240
+ .news-desk-columns--taxonomy .news-desk-topic-detail__header{display:grid;gap:12px;border-bottom:3px double var(--org-ink);padding-bottom:16px}
241
+ .news-desk-columns--taxonomy .news-desk-topic-detail__header h3{margin:0;font:700 30px/1.15 Newsroom Display,Georgia,serif}
242
+ .news-desk-columns--taxonomy .news-desk-topic-detail__header>div>span{font:400 13px/1.4 Newsroom UI,system-ui,sans-serif;color:var(--org-muted)}
243
+ .news-desk-columns--taxonomy .news-desk-topic-detail__header dl{display:flex;flex-wrap:wrap;gap:8px 32px;margin:0}
244
+ .news-desk-columns--taxonomy .news-desk-topic-detail__header dl>div{display:flex;flex-direction:column-reverse;gap:2px}
245
+ .news-desk-columns--taxonomy .news-desk-topic-detail__header dt{font:600 11px/1.4 Newsroom UI,system-ui,sans-serif;letter-spacing:.07em;text-transform:uppercase;color:var(--org-muted)}
246
+ .news-desk-columns--taxonomy .news-desk-topic-detail__header dd{margin:0;font:700 22px/1.1 Newsroom Display,Georgia,serif}
247
+ .news-desk-columns--taxonomy .news-desk-desk-detail__grid{grid-template-columns:minmax(0,1fr);gap:32px}
248
+ @container (min-width:900px){.news-desk-columns--taxonomy .news-desk-desk-detail__grid{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}}
249
+ .news-desk-columns--taxonomy .category-steering-category-card{display:grid;gap:14px;border:0;padding:0;background:none}
250
+ .news-desk-columns--taxonomy .category-steering-category-card>header,.news-desk-columns--taxonomy .category-steering-category-card>footer{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;gap:8px 12px}
251
+ .news-desk-columns--taxonomy .category-steering-category-card label{display:grid;gap:6px}
252
+ .news-desk-columns--taxonomy .category-steering-category-card label>span{font:600 11px/1.4 Newsroom UI,system-ui,sans-serif;letter-spacing:.07em;text-transform:uppercase;color:var(--org-muted)}
253
+ .news-desk-columns--taxonomy .category-steering-category-card :is(input,textarea){width:100%;min-height:40px;padding:8px 10px;border:1px solid var(--org-line);border-radius:0;background:transparent;color:var(--org-ink);font:400 14px/1.5 Newsroom UI,system-ui,sans-serif}
254
+ .news-desk-columns--taxonomy .news-desk-desk-subtopics{border-top:1px solid var(--org-line);padding-top:16px}
255
+ .news-desk-columns--taxonomy .news-desk-chip-row{display:flex;flex-wrap:wrap;gap:8px}
256
+ .news-desk-columns--taxonomy .news-desk-chip-row span{border:1px solid var(--org-ink);padding:2px 8px;font:400 13px/1.4 Newsroom UI,system-ui,sans-serif;border-radius:0}
257
+ .news-desk-columns--taxonomy .news-desk-rail-column{grid-column:auto;padding:0;margin-top:32px;border-top:1px solid var(--org-ink);padding-top:16px}
258
+ .news-desk-columns--taxonomy .news-desk-ledger-list{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:24px}
259
+ .news-desk-columns--taxonomy .news-desk-ledger-item{display:grid;gap:4px;border:0;padding:0}
260
+ .news-desk-columns--taxonomy .news-desk-ledger-item header{display:flex;flex-wrap:wrap;justify-content:space-between;gap:4px 8px}
261
+ .news-desk-columns--taxonomy .news-desk-ledger-item p{margin:0;font:400 13px/1.45 Newsroom UI,system-ui,sans-serif}
262
+ @media (max-width:900px){.news-desk-columns--taxonomy .news-desk-main-column{grid-template-columns:minmax(0,1fr);gap:24px}}
263
+ .news-desk-columns--taxonomy :is(.category-steering-category-card>header span,.category-steering-category-card>footer span,.news-desk-desk-detail__grid span,.category-steering-subcategory-list__label,.news-desk-ledger-item header span){color:var(--org-ink);opacity:1;font:600 11px/1.4 Newsroom UI,system-ui,sans-serif;letter-spacing:.07em;text-transform:uppercase}
264
+ .news-desk-columns--taxonomy .category-steering-category-card>header strong{font:700 12px/1.4 Newsroom UI,system-ui,sans-serif;letter-spacing:.07em;text-transform:uppercase;color:var(--org-ink)}
265
+ .news-desk-columns--taxonomy .category-steering-category-card button{display:inline-flex;align-items:center;justify-content:center;min-height:36px;padding:4px 12px;border:2px solid var(--org-ink);border-radius:0;background:transparent;color:var(--org-ink);font:700 12px/1.2 Newsroom UI,system-ui,sans-serif;letter-spacing:.05em;text-transform:uppercase;cursor:pointer}
266
+ .news-desk-columns--taxonomy .category-steering-category-card button:disabled{border-color:var(--org-line);opacity:.6;cursor:default}
267
+ .news-desk-columns--taxonomy .news-desk-rail-column .category-steering-section__header{border-bottom:0;padding-bottom:4px}
268
+ .organizer-account-chooser{padding:8px 12px;border-bottom:1px solid var(--org-line);display:grid;gap:6px}
269
+ .organizer-account-chooser ul{list-style:none;margin:0;padding:0;display:grid}
270
+ .organizer-account-chooser li button{display:flex;align-items:center;justify-content:space-between;gap:12px;width:100%;text-align:left;background:none;border:0;border-left:3px solid transparent;padding:6px 8px;font:inherit;color:var(--org-ink);cursor:pointer}
271
+ .organizer-account-chooser li button[data-selected]{border-left-color:var(--org-ink);font-weight:700}
272
+ .organizer-account-chooser li button:disabled{opacity:.6;cursor:default}
273
+ .organizer-account-chooser li button span{display:grid;gap:1px}
274
+ .organizer-account-chooser li button small,.organizer-account-chooser-note{font-size:12px;color:var(--org-ink);margin:0}
275
+ .organizer-account-chooser-heading{margin:0;font:600 11px/1.4 Newsroom UI,system-ui,sans-serif;letter-spacing:.07em;text-transform:uppercase}
276
+ .organizer-account-chooser-link{color:var(--org-ink);text-decoration:underline;text-underline-offset:3px}
277
+ .organizer-account-create-start,.organizer-account-create button{background:none;border:1px solid var(--org-ink);border-radius:0;color:var(--org-ink);font:600 12px/1.4 Newsroom UI,system-ui,sans-serif;padding:4px 10px;cursor:pointer;text-underline-offset:3px}
278
+ .organizer-account-create-start:hover,.organizer-account-create button:hover{text-decoration:underline}
279
+ .organizer-account-create-start:focus-visible,.organizer-account-create button:focus-visible,.organizer-account-create input:focus-visible{outline:2px solid var(--org-ink);outline-offset:1px}
280
+ .organizer-account-create button:disabled{cursor:default;text-decoration:line-through}
281
+ .organizer-account-create{display:grid;gap:6px}
282
+ .organizer-account-create label{display:grid;gap:2px;font:600 11px/1.4 Newsroom UI,system-ui,sans-serif;letter-spacing:.07em;text-transform:uppercase}
283
+ .organizer-account-create input{background:transparent;border:0;border-bottom:2px solid var(--org-ink);border-radius:0;color:var(--org-ink);font:400 14px/1.4 Newsroom UI,system-ui,sans-serif;padding:4px 0;text-transform:none;letter-spacing:0}
284
+ .organizer-account-create span{display:flex;gap:8px}
285
+ [data-reference-cyclotron-status] .cyclotron-status[data-variant]{border-radius:0;background:transparent;border-top:1px solid var(--org-ink);border-bottom:1px solid var(--org-ink);padding-left:0;padding-right:0}
286
+ [data-reference-cyclotron-status] :is(.cyclotron-status-note,.cyclotron-status-definition,.cyclotron-status-header p,.cyclotron-status-override){color:var(--org-ink)}
287
+ [data-reference-cyclotron-status] .cyclotron-status[data-variant="strip"]>span+span::before{color:var(--org-ink)}
288
+ [data-reference-cyclotron-status] .cyclotron-status-bar{border-radius:0;background:transparent;border:1px solid var(--org-ink)}
289
+ [data-reference-cyclotron-status] .cyclotron-status-bar>span{opacity:1}
290
+ [data-reference-cyclotron-status] :is(.cyclotron-review-secondary,.cyclotron-review-choice,.cyclotron-review-submit){border-radius:0;opacity:1}
291
+ .news-desk-columns--administration .news-desk-delegation-note{margin:0;color:var(--administration-strong);max-width:68ch}
292
+ .news-desk-columns--administration .news-desk-delegation-form{display:grid;grid-template-columns:minmax(0,2fr) minmax(0,1fr) auto;gap:12px;align-items:end}
293
+ .news-desk-columns--administration .news-desk-delegation-error{margin:0;padding:8px 0 8px 12px;border-left:3px solid var(--org-ink);color:var(--administration-strong);font-weight:600}
294
+ .news-desk-columns--administration .news-desk-delegation-token{display:grid;gap:12px;min-width:0;padding:16px;border:2px solid var(--org-ink)}
295
+ .news-desk-columns--administration .news-desk-delegation-token h3{margin:0;font-size:20px}
296
+ .news-desk-columns--administration .news-desk-delegation-token p{margin:0}
297
+ .news-desk-columns--administration .news-desk-delegation-token__row{display:flex;flex-wrap:wrap;gap:8px;align-items:stretch}
298
+ .news-desk-columns--administration .news-desk-delegation-token__row code{flex:1 1 280px;min-width:0;padding:8px 10px;border:1px solid var(--org-line);font:500 13px/1.5 ui-monospace,Menlo,monospace;overflow-wrap:anywhere;color:var(--administration-strong)}
299
+ .news-desk-columns--administration .news-desk-delegation-token__row button,.news-desk-columns--administration .news-desk-delegation-list button{min-height:36px;padding:4px 12px;border:1px solid var(--org-line);background:transparent;color:var(--administration-strong);font:600 12px/1.2 Newsroom UI,system-ui,sans-serif;letter-spacing:.05em;text-transform:uppercase;cursor:pointer}
300
+ .news-desk-columns--administration .news-desk-delegation-list{list-style:none;margin:0;padding:0;display:grid}
301
+ .news-desk-columns--administration .news-desk-delegation-list li{display:grid;grid-template-columns:minmax(0,1fr) auto auto;gap:8px 16px;align-items:center;padding:12px 0;border-top:1px solid var(--org-line)}
302
+ .news-desk-columns--administration .news-desk-delegation-list li>div{display:grid;gap:2px}
303
+ .news-desk-columns--administration .news-desk-delegation-list li[data-delegation-live=true] .news-desk-delegation-state{font-weight:700;text-decoration:underline;text-underline-offset:4px}
304
+ .news-desk-columns--administration .news-desk-delegation-state{font:600 12px/1.4 Newsroom UI,system-ui,sans-serif;color:var(--administration-strong)}
305
+ .news-desk-columns--administration .news-desk-delegation-confirm{display:flex;flex-wrap:wrap;gap:8px;align-items:center}
306
+ .news-desk-columns--administration .news-desk-delegation-pending-list{list-style:none;margin:0;padding:0;display:grid}
307
+ .news-desk-columns--administration .news-desk-delegation-pending-list li{display:grid;grid-template-columns:minmax(0,1fr) auto auto;gap:12px 24px;align-items:center;padding:16px 0 16px 12px;border-top:1px solid var(--org-line);border-left:3px solid var(--org-ink)}
308
+ .news-desk-columns--administration .news-desk-delegation-pending-list li>div{display:grid;gap:2px}
309
+ .news-desk-columns--administration .news-desk-delegation-pending-list li>div>strong{font:700 18px/1.2 Newsroom Display,Georgia,serif}
310
+ .news-desk-columns--administration .news-desk-delegation-pending-list li>div>span{font:400 13px/1.4 Newsroom UI,system-ui,sans-serif}
311
+ .news-desk-columns--administration .news-desk-delegation-countdown{font-weight:600!important;font-variant-numeric:tabular-nums}
312
+ .news-desk-columns--administration .news-desk-delegation-code{font:700 34px/1.1 ui-monospace,Menlo,monospace;letter-spacing:.14em;color:var(--org-ink);padding:6px 0;border-top:2px solid var(--org-ink);border-bottom:2px solid var(--org-ink)}
313
+ .news-desk-columns--administration .news-desk-delegation-decision{display:flex;gap:8px}
314
+ .news-desk-columns--administration .news-desk-delegation-decision button{min-height:40px;padding:4px 18px;border:1px solid var(--org-ink);border-radius:0;background:transparent;color:var(--org-ink);font:700 12px/1.2 Newsroom UI,system-ui,sans-serif;letter-spacing:.07em;text-transform:uppercase;cursor:pointer}
315
+ .news-desk-columns--administration .news-desk-delegation-decision button:hover:not(:disabled){text-decoration:underline;text-underline-offset:4px}
316
+ .news-desk-columns--administration .news-desk-delegation-decision button:disabled{cursor:default;text-decoration:line-through}
317
+ .news-desk-columns--administration .news-desk-delegation-decision button:focus-visible{outline:2px solid var(--org-ink);outline-offset:2px}
318
+ @container (max-width:640px){.news-desk-columns--administration .news-desk-delegation-pending-list li{grid-template-columns:minmax(0,1fr)}.news-desk-columns--administration .news-desk-delegation-code{font-size:28px}}
319
+ @container (max-width:640px){.news-desk-columns--administration .news-desk-delegation-form{grid-template-columns:minmax(0,1fr)}.news-desk-columns--administration .news-desk-delegation-list li{grid-template-columns:minmax(0,1fr)}}
@@ -49,7 +49,23 @@ import { normalizeReferenceCurationStatus } from "../lib/reference-policy";
49
49
  import { newsroomListRowClassName } from "../lib/newsroom-list-selection";
50
50
  import { ReferenceSourcePreview } from "./reference-source-preview";
51
51
  import { ReferenceRelevanceReview } from "./reference-relevance-review";
52
+ import {
53
+ CountsAsTrainingLabelNote,
54
+ DelegatedCurationNote,
55
+ ReferenceSuggestionBlock,
56
+ ReferenceSuggestionProvenance,
57
+ ReferenceSuggestionRowLine,
58
+ } from "./reference-cyclotron-suggestion";
59
+ import { ReferenceLiveAgreement } from "./reference-live-agreement";
60
+ import { SectionPicker, SectionSuggestionBlock, type SectionChoice } from "./reference-section-suggestion";
61
+ import type { SectionSuggestion, SiteSectionAgreement } from "../lib/site-section-suggestions";
62
+
63
+ /** What an editor adds to an accept: the Section the reference belongs in, which becomes a training label. */
64
+ export type ReferenceReviewOptions = { sectionId?: string | null };
65
+ import type { DelegatedCuration, ShadowAgreement } from "../lib/cyclotron-suggestions";
66
+ import { ReferenceCyclotronPriming, type PrimingFormInput } from "./reference-cyclotron-priming";
52
67
  import { ReferenceCyclotronStatus, type ReviewRateChoice } from "./reference-cyclotron-status";
68
+ import type { PrimingRequestView } from "../lib/relevance-status";
53
69
  import type { CyclotronStatus } from "cyclotron/cyclotron-status";
54
70
  import type { RelevanceCuration, RelevanceDecisionView } from "../lib/relevance-decisions";
55
71
  import {
@@ -62,15 +78,33 @@ type NewsroomReferencesViewProps = {
62
78
  priming?: PrimingPanelProps;
63
79
  /** The relevance cyclotron's status snapshot, shown above the list. */
64
80
  cyclotronStatus?: CyclotronStatus | null;
81
+ /** Present for editors who may prime the running relevance cyclotron with a pasted URL. */
82
+ cyclotronPriming?: {
83
+ labels: readonly string[];
84
+ requests: PrimingRequestView[];
85
+ onRequest: (input: PrimingFormInput) => Promise<void> | void;
86
+ };
65
87
  /** Present for editors who may ask for a manual review rate. */
66
88
  onRequestReviewRate?: (choice: ReviewRateChoice) => Promise<void> | void;
67
89
  demo?: boolean;
68
90
  /** The relevance cyclotron's current decisions, keyed by reference lineage. */
69
91
  decisions?: Map<string, RelevanceDecisionView>;
92
+ /** Reference lineage ids whose latest curation Message was made by a person. */
93
+ humanCuratedReferenceLineageIds?: Set<string>;
94
+ /** Delegated curations by reference lineage. */
95
+ delegatedCurations?: Map<string, DelegatedCuration>;
96
+ /** The live-agreement payload; the strip is hidden without it. */
97
+ shadowAgreement?: ShadowAgreement | null;
70
98
  disabled?: boolean;
99
+ /** The enabled newsroom Sections an accepted reference can be placed in. */
100
+ sections?: SectionChoice[];
101
+ /** The site cyclotron's suggested Section per reference lineage. Advisory. */
102
+ sectionSuggestions?: Map<string, SectionSuggestion>;
103
+ /** How often the Section suggestions matched later editor decisions. */
104
+ sectionAgreement?: SiteSectionAgreement | null;
71
105
  onRelevanceReview?: (reference: ReferenceRecord, curation: RelevanceCuration) => void;
72
106
  initialReferenceLineageId?: string | null;
73
- onReview: (reference: ReferenceRecord, action: ReferenceCurationAction) => void;
107
+ onReview: (reference: ReferenceRecord, action: ReferenceCurationAction, options?: ReferenceReviewOptions) => void;
74
108
  referenceAttachments?: ReferenceAttachmentRecord[];
75
109
  references: ReferenceRecord[];
76
110
  };
@@ -204,17 +238,14 @@ function useReferencePreviewAttachments(
204
238
  return previewAttachments;
205
239
  }
206
240
 
207
- function decisionSummary(decision: RelevanceDecisionView): string {
208
- const sure = decision.confidence == null ? "confidence unknown" : `${Math.round(decision.confidence * 100)}% sure`;
209
- return `${decision.label} · ${sure}${decision.version != null ? ` · version ${decision.version}` : ""}`;
210
- }
211
-
212
241
  function needsReview(reference: ReferenceRecord, decision: RelevanceDecisionView | undefined): boolean {
213
242
  return Boolean(decision?.reviewRecommended)
214
243
  && normalizeReferenceCurationStatus(reference.curationStatus) === "pending";
215
244
  }
216
245
 
217
246
  function ReferenceDetailPanel({
247
+ countsAsTrainingLabel,
248
+ delegated,
218
249
  decision,
219
250
  demo,
220
251
  disabled,
@@ -223,17 +254,27 @@ function ReferenceDetailPanel({
223
254
  previewAttachments,
224
255
  reference,
225
256
  onClose,
257
+ sectionAgreement = null,
258
+ sectionSuggestion,
259
+ sections = [],
226
260
  }: {
261
+ countsAsTrainingLabel?: boolean;
262
+ delegated?: DelegatedCuration;
227
263
  decision?: RelevanceDecisionView;
228
264
  demo?: boolean;
229
265
  disabled?: boolean;
230
266
  onRelevanceReview?: (curation: RelevanceCuration) => void;
231
- onReview: (action: ReferenceCurationAction) => void;
267
+ onReview: (action: ReferenceCurationAction, options?: ReferenceReviewOptions) => void;
268
+ sectionAgreement?: SiteSectionAgreement | null;
269
+ sectionSuggestion?: SectionSuggestion;
270
+ sections?: SectionChoice[];
232
271
  previewAttachments: ReferenceAttachmentRecord[];
233
272
  reference: ReferenceRecord;
234
273
  onClose?: () => void;
235
274
  }) {
236
275
  const lineageId = referenceLineageId(reference);
276
+ const [chosenSectionId, setChosenSectionId] = useState<string | null>(null);
277
+ useEffect(() => { setChosenSectionId(null); }, [lineageId]);
237
278
  const status = normalizeReferenceCurationStatus(reference.curationStatus);
238
279
  const url = referenceUrl(reference);
239
280
  const acceptDisabled = disabled || status === "accepted";
@@ -259,31 +300,59 @@ function ReferenceDetailPanel({
259
300
  ) : null}
260
301
  </div>
261
302
 
262
- {decision && status === "pending" && onRelevanceReview ? (
263
- <ReferenceRelevanceReview
264
- decision={decision}
303
+ {decision ? (
304
+ <div className="space-y-3" data-reference-relevance-decision={lineageId}>
305
+ <ReferenceSuggestionBlock
306
+ decision={decision}
307
+ disabled={disabled}
308
+ onCurate={onRelevanceReview}
309
+ referenceLineageId={lineageId}
310
+ settled={status !== "pending"}
311
+ statusLabel={referenceStatusLabel(status)}
312
+ />
313
+ <ReferenceSuggestionProvenance decision={decision} />
314
+ {status === "pending" && onRelevanceReview ? (
315
+ <details className="text-sm text-foreground">
316
+ <summary className="cursor-pointer font-semibold underline-offset-4 hover:underline">Review with a reason</summary>
317
+ <div className="mt-2">
318
+ <ReferenceRelevanceReview
319
+ decision={decision}
320
+ disabled={disabled}
321
+ onCurate={onRelevanceReview}
322
+ referenceLineageId={lineageId}
323
+ />
324
+ </div>
325
+ </details>
326
+ ) : null}
327
+ </div>
328
+ ) : null}
329
+ {status === "pending" && sectionSuggestion ? (
330
+ <SectionSuggestionBlock agreement={sectionAgreement} referenceLineageId={lineageId} sections={sections} suggestion={sectionSuggestion} />
331
+ ) : null}
332
+ {status === "pending" && sections.length ? (
333
+ <SectionPicker
334
+ agreement={sectionAgreement}
335
+ chosenSectionId={chosenSectionId}
265
336
  disabled={disabled}
266
- onCurate={onRelevanceReview}
337
+ onChoose={setChosenSectionId}
267
338
  referenceLineageId={lineageId}
339
+ sections={sections}
340
+ suggestedSectionId={sectionSuggestion?.sectionId ?? null}
268
341
  />
269
- ) : decision ? (
270
- <p className="text-sm text-muted-foreground" data-reference-relevance-decision={lineageId}>
271
- Cyclotron decision: {decisionSummary(decision)}
272
- </p>
273
342
  ) : null}
343
+ {delegated ? <DelegatedCurationNote delegated={delegated} referenceLineageId={lineageId} /> : countsAsTrainingLabel ? <CountsAsTrainingLabelNote referenceLineageId={lineageId} /> : null}
274
344
 
275
345
  <div
276
346
  className="flex flex-wrap items-center gap-2"
277
347
  data-news-desk-reference-curation-cluster
278
348
  data-reference-curation-status={status}
279
349
  >
280
- {decision && status === "pending" && onRelevanceReview ? null : <>
281
350
  <Button
282
351
  aria-label="Accept reference"
283
352
  aria-pressed={status === "accepted"}
284
353
  data-news-desk-reference-accept
285
354
  disabled={acceptDisabled}
286
- onClick={() => onReview("accept")}
355
+ onClick={() => onReview("accept", chosenSectionId ? { sectionId: chosenSectionId } : undefined)}
287
356
  size="sm"
288
357
  type="button"
289
358
  variant={status === "accepted" ? "default" : "outline"}
@@ -304,7 +373,6 @@ function ReferenceDetailPanel({
304
373
  <ThumbsDownIcon className="size-4" />
305
374
  Reject
306
375
  </Button>
307
- </>}
308
376
  <Button
309
377
  aria-label="Archive reference"
310
378
  disabled={archiveDisabled}
@@ -399,11 +467,18 @@ function ReferenceDetailPanel({
399
467
  export function NewsroomReferencesView({
400
468
  priming,
401
469
  cyclotronStatus,
470
+ cyclotronPriming,
402
471
  decisions,
472
+ humanCuratedReferenceLineageIds,
473
+ delegatedCurations,
474
+ shadowAgreement = null,
403
475
  onRequestReviewRate,
404
476
  demo = false,
405
477
  disabled = false,
406
478
  onRelevanceReview,
479
+ sections = [],
480
+ sectionSuggestions,
481
+ sectionAgreement = null,
407
482
  initialReferenceLineageId = null,
408
483
  onReview,
409
484
  referenceAttachments = [],
@@ -492,9 +567,9 @@ export function NewsroomReferencesView({
492
567
  }
493
568
  };
494
569
 
495
- const runReview = (action: ReferenceCurationAction) => {
570
+ const runReview = (action: ReferenceCurationAction, options?: ReferenceReviewOptions) => {
496
571
  if (!selectedReference) return;
497
- onReview(selectedReference, action);
572
+ onReview(selectedReference, action, options);
498
573
  };
499
574
 
500
575
  const emptyLabel = canonicalReferences.length
@@ -514,8 +589,18 @@ export function NewsroomReferencesView({
514
589
  Review source intake before it becomes accepted evidence.
515
590
  </p>
516
591
  </div>
592
+ <ReferenceLiveAgreement agreement={shadowAgreement} />
517
593
  <ReferenceCurationControls disabled={disabled} />
518
594
  {priming && !disabled ? <ReferencePriming {...priming} /> : null}
595
+ {cyclotronPriming && !disabled ? (
596
+ <div className="shrink-0">
597
+ <ReferenceCyclotronPriming
598
+ labels={cyclotronPriming.labels}
599
+ onRequestPriming={cyclotronPriming.onRequest}
600
+ requests={cyclotronPriming.requests}
601
+ />
602
+ </div>
603
+ ) : null}
519
604
  {cyclotronStatus ? (
520
605
  <div className="shrink-0">
521
606
  <ReferenceCyclotronStatus onRequestRate={disabled ? undefined : onRequestReviewRate} status={cyclotronStatus} />
@@ -577,12 +662,12 @@ export function NewsroomReferencesView({
577
662
  </div>
578
663
  <p className="mt-2 text-xs text-muted-foreground">{formatReferenceListDate(reference)}</p>
579
664
  {decision ? (
580
- <p className="mt-1 flex flex-wrap items-center gap-2 text-xs text-muted-foreground" data-reference-relevance-row={lineageId}>
581
- <span>Decision: {decisionSummary(decision)}</span>
665
+ <div className="flex flex-wrap items-center gap-2" data-reference-relevance-row={lineageId}>
666
+ <ReferenceSuggestionRowLine decision={decision} referenceLineageId={lineageId} />
582
667
  {needsReview(reference, decision) ? (
583
668
  <Badge variant="outline"><span aria-hidden="true">●</span> Needs review</Badge>
584
669
  ) : null}
585
- </p>
670
+ </div>
586
671
  ) : null}
587
672
  </button>
588
673
  );
@@ -632,11 +717,16 @@ export function NewsroomReferencesView({
632
717
  <ScrollArea className="min-h-0 flex-1">
633
718
  {selectedReference ? (
634
719
  <ReferenceDetailPanel
720
+ countsAsTrainingLabel={humanCuratedReferenceLineageIds?.has(referenceLineageId(selectedReference))}
721
+ delegated={delegatedCurations?.get(referenceLineageId(selectedReference))}
635
722
  decision={decisions?.get(referenceLineageId(selectedReference))}
636
723
  demo={demo}
637
724
  disabled={disabled}
638
725
  onRelevanceReview={onRelevanceReview ? (curation) => onRelevanceReview(selectedReference, curation) : undefined}
639
726
  onReview={runReview}
727
+ sectionAgreement={sectionAgreement}
728
+ sectionSuggestion={sectionSuggestions?.get(referenceLineageId(selectedReference))}
729
+ sections={sections}
640
730
  previewAttachments={previewAttachments}
641
731
  reference={selectedReference}
642
732
  />
@@ -663,12 +753,17 @@ export function NewsroomReferencesView({
663
753
  {selectedReference ? (
664
754
  <ScrollArea className="max-h-[75dvh]">
665
755
  <ReferenceDetailPanel
756
+ countsAsTrainingLabel={humanCuratedReferenceLineageIds?.has(referenceLineageId(selectedReference))}
757
+ delegated={delegatedCurations?.get(referenceLineageId(selectedReference))}
666
758
  decision={decisions?.get(referenceLineageId(selectedReference))}
667
759
  demo={demo}
668
760
  disabled={disabled}
669
761
  onClose={closeDetail}
670
762
  onRelevanceReview={onRelevanceReview ? (curation) => onRelevanceReview(selectedReference, curation) : undefined}
671
763
  onReview={runReview}
764
+ sectionAgreement={sectionAgreement}
765
+ sectionSuggestion={sectionSuggestions?.get(referenceLineageId(selectedReference))}
766
+ sections={sections}
672
767
  previewAttachments={previewAttachments}
673
768
  reference={selectedReference}
674
769
  />
@@ -403,7 +403,7 @@ export function NewsroomTopicsView({
403
403
  }}
404
404
  open={mobileDetailOpen && Boolean(selectedProposal)}
405
405
  >
406
- <SheetContent className="gap-0 p-0 md:hidden" side="bottom">
406
+ <SheetContent backdropClassName="md:hidden" className="gap-0 p-0 md:hidden" side="bottom">
407
407
  <SheetHeader className="border-b border-border px-4 py-3">
408
408
  <SheetTitle className="text-left text-base">Topic proposal</SheetTitle>
409
409
  </SheetHeader>