From 9b2dada55e6dda9125614405d844c5c41efbde4c Mon Sep 17 00:00:00 2001 From: Jacob Maynard Date: Fri, 16 Jan 2026 19:39:52 -0600 Subject: [PATCH] add resources pages for supported tools --- packages/landing/app.config.js | 14 +- packages/landing/public/sitemap.xml | 16 +- .../landing/src/components/SupportedTools.jsx | 21 +- .../components/resources/ToolResourcePage.jsx | 202 ++++++++++++++++++ packages/landing/src/lib/tool-content.js | 173 +++++++++++++++ packages/landing/src/routes/contact.jsx | 2 +- packages/landing/src/routes/privacy.jsx | 2 +- packages/landing/src/routes/resources.jsx | 190 ---------------- .../landing/src/routes/resources/amstar2.jsx | 7 + .../landing/src/routes/resources/index.jsx | 80 +++++++ .../landing/src/routes/resources/rob2.jsx | 7 + .../landing/src/routes/resources/robins-i.jsx | 7 + packages/landing/src/routes/security.jsx | 2 +- packages/landing/src/routes/terms.jsx | 2 +- packages/web/src/checklist-registry/types.js | 6 +- 15 files changed, 519 insertions(+), 212 deletions(-) create mode 100644 packages/landing/src/components/resources/ToolResourcePage.jsx create mode 100644 packages/landing/src/lib/tool-content.js delete mode 100644 packages/landing/src/routes/resources.jsx create mode 100644 packages/landing/src/routes/resources/amstar2.jsx create mode 100644 packages/landing/src/routes/resources/index.jsx create mode 100644 packages/landing/src/routes/resources/rob2.jsx create mode 100644 packages/landing/src/routes/resources/robins-i.jsx diff --git a/packages/landing/app.config.js b/packages/landing/app.config.js index dffb558c0..9708ccbb5 100644 --- a/packages/landing/app.config.js +++ b/packages/landing/app.config.js @@ -11,7 +11,19 @@ export default defineConfig({ server: { preset: 'static', prerender: { - routes: ['/', '/about', '/contact', '/privacy', '/resources', '/security', '/terms'], + routes: [ + '/', + '/about', + '/contact', + '/pricing', + '/privacy', + '/resources', + '/resources/amstar2', + '/resources/robins-i', + '/resources/rob2', + '/security', + '/terms', + ], crawlLinks: true, }, }, diff --git a/packages/landing/public/sitemap.xml b/packages/landing/public/sitemap.xml index 83ff22b18..731fd3c30 100644 --- a/packages/landing/public/sitemap.xml +++ b/packages/landing/public/sitemap.xml @@ -6,6 +6,12 @@ https://corates.org/about + + https://corates.org/contact + + + https://corates.org/pricing + https://corates.org/privacy @@ -13,12 +19,18 @@ https://corates.org/resources - https://corates.org/terms + https://corates.org/resources/amstar2 - https://corates.org/contact + https://corates.org/resources/robins-i + + + https://corates.org/resources/rob2 https://corates.org/security + + https://corates.org/terms + diff --git a/packages/landing/src/components/SupportedTools.jsx b/packages/landing/src/components/SupportedTools.jsx index 2947d18b8..eadaea305 100644 --- a/packages/landing/src/components/SupportedTools.jsx +++ b/packages/landing/src/components/SupportedTools.jsx @@ -1,23 +1,20 @@ import { For } from 'solid-js'; +import { getAllTools } from '~/lib/tool-content'; export default function SupportedTools() { - const tools = [ - { - name: 'AMSTAR-2', - status: 'available', - description: 'Systematic reviews of interventions', - }, - { name: 'ROBINS-I V2', status: 'available', description: 'Non-randomized studies' }, - { name: 'Cochrane RoB 2', status: 'coming', description: 'Randomized trials' }, - // { name: 'GRADE', status: 'coming', description: 'Certainty of evidence' }, - ]; + const tools = getAllTools().map(tool => ({ + name: tool.name, + status: 'available', + description: tool.bestUsedFor, + href: `/resources/${tool.slug}`, + })); return (

Supported Appraisal tools

- Start with AMSTAR or ROBINS today. More tools are on the way! + Get started with AMSTAR 2, ROBINS-I, or RoB 2 today.

@@ -50,7 +47,7 @@ export default function SupportedTools() { ); return isAvailable ? - + {content} :
{content}
; diff --git a/packages/landing/src/components/resources/ToolResourcePage.jsx b/packages/landing/src/components/resources/ToolResourcePage.jsx new file mode 100644 index 000000000..edcedc1f9 --- /dev/null +++ b/packages/landing/src/components/resources/ToolResourcePage.jsx @@ -0,0 +1,202 @@ +import { Title, Meta, Link } from '@solidjs/meta'; +import { For, Show, createMemo } from 'solid-js'; +import { HiOutlineDocumentText } from 'solid-icons/hi'; +import { AiOutlineCheckCircle } from 'solid-icons/ai'; +import { FiExternalLink, FiAlertCircle, FiAlertTriangle, FiHelpCircle } from 'solid-icons/fi'; +import Navbar from '~/components/Navbar'; +import Footer from '~/components/Footer'; +import { config } from '~/lib/config'; + +const COLOR_CONFIG = { + green: { + border: 'border-green-200', + bg: 'bg-green-50', + iconBg: 'bg-green-100', + iconColor: 'text-green-600', + }, + yellow: { + border: 'border-yellow-200', + bg: 'bg-yellow-50', + iconBg: 'bg-yellow-100', + iconColor: 'text-yellow-600', + }, + orange: { + border: 'border-orange-200', + bg: 'bg-orange-50', + iconBg: 'bg-orange-100', + iconColor: 'text-orange-600', + }, + red: { + border: 'border-red-200', + bg: 'bg-red-50', + iconBg: 'bg-red-100', + iconColor: 'text-red-600', + }, + gray: { + border: 'border-gray-200', + bg: 'bg-gray-50', + iconBg: 'bg-gray-100', + iconColor: 'text-gray-600', + }, +}; + +function getScoreLevelIcon(color) { + switch (color) { + case 'green': + return AiOutlineCheckCircle; + case 'yellow': + return FiAlertCircle; + case 'orange': + return FiAlertTriangle; + case 'red': + return FiAlertCircle; + case 'gray': + return FiHelpCircle; + default: + return FiAlertCircle; + } +} + +function ScoreLevelCard(props) { + const colors = () => COLOR_CONFIG[props.level.color] || COLOR_CONFIG.gray; + const Icon = createMemo(() => getScoreLevelIcon(props.level.color)); + + return ( +
+
+
+ {(() => { + const IconComponent = Icon(); + return ; + })()} +
+
+

{props.level.name}

+

{props.level.description}

+ +

{props.level.note}

+
+
+
+
+ ); +} + +function NotFoundPage() { + return ( +
+ +
+
+

Tool Not Found

+

The requested resource page could not be found.

+ + Back to Resources + +
+
+
+
+ ); +} + +function ToolContent(props) { + const pageUrl = () => `${config.appUrl}/resources/${props.tool.slug}`; + const title = () => `${props.tool.name} Resources - CoRATES`; + const description = () => + `Learn about ${props.tool.name}, including scoring guidance and links to official documentation.`; + + return ( + <> + {title()} + + + + + + + + +
+ + +
+
+

{props.tool.name}

+

Appraisal tool guidance

+ +
+
+

{props.tool.name}

+

{props.tool.description}

+
+ +
+
+
+ +
+
+

Best used for

+

{props.tool.bestUsedFor}

+
+
+
+ +
+
+
+ +
+
+

Reference Documents

+ +
+
+
+ +
+

Scoring

+

{props.tool.scoringDescription}

+ +
+ + {level => } + +
+
+
+
+
+ +
+
+ + ); +} + +export default function ToolResourcePage(props) { + return ( + }> + + + ); +} diff --git a/packages/landing/src/lib/tool-content.js b/packages/landing/src/lib/tool-content.js new file mode 100644 index 000000000..d3ae90abb --- /dev/null +++ b/packages/landing/src/lib/tool-content.js @@ -0,0 +1,173 @@ +/** + * Tool Content Configuration + * + * Centralized content for all appraisal tool resource pages. + * Each tool contains all the data needed to render its resource page. + */ + +export const TOOL_CONTENT = { + amstar2: { + id: 'amstar2', + name: 'AMSTAR 2', + slug: 'amstar2', + description: + "The AMSTAR 2 (A MeaSurement Tool to Assess systematic Reviews) is a critical appraisal tool used to assess the methodological quality and risk of bias of systematic reviews of interventions, including reviews that incorporate randomized and non-randomized studies. It evaluates 16 domains and supports judgments about confidence in a review's findings (high to critically low), helping users determine how much trust to place in review results.", + bestUsedFor: 'Appraising systematic reviews of interventions.', + referenceLinks: [ + { + href: 'https://www.bmj.com/content/358/bmj.j4008', + text: 'AMSTAR 2 paper', + }, + { + href: 'https://www.bmj.com/highwire/filestream/951408/field_highwire_adjunct_files/1/sheb036104.ww1.pdf', + text: 'AMSTAR 2 Guidance document', + }, + ], + scoringDescription: + "CoRATES automatically generates the overall score using decision rules that follow the scoring guidance published in the AMSTAR 2 paper, ensuring consistency with the tool's intended interpretation.", + scoreLevels: [ + { + name: 'High', + description: + 'No or one non-critical weakness: the systematic review provides an accurate and comprehensive summary of the results of the available studies that address the question of interest.', + color: 'green', + }, + { + name: 'Moderate', + description: + 'More than one non-critical weakness*: the systematic review has more than one weakness but no critical flaws. It may provide an accurate summary of the results of the available studies that were included in the review.', + note: '*Multiple non-critical weaknesses may diminish confidence in the review and it may be appropriate to move the overall appraisal down from moderate to low confidence.', + color: 'yellow', + }, + { + name: 'Low', + description: + 'One critical flaw with or without non-critical weaknesses: the review has a critical flaw and may not provide an accurate and comprehensive summary of the available studies that address the question of interest.', + color: 'orange', + }, + { + name: 'Critically Low', + description: + 'More than one critical flaw with or without non-critical weaknesses: the review has more than one critical flaw and should not be relied on to provide an accurate and comprehensive summary of the available studies.', + color: 'red', + }, + ], + }, + + robinsI: { + id: 'robinsI', + name: 'ROBINS-I V2', + slug: 'robins-i', + description: + 'ROBINS-I V2 (Risk Of Bias In Non-randomized Studies - of Interventions, Version 2) is a tool for assessing risk of bias in the results of non-randomized studies that compare the health effects of two or more interventions. It covers seven domains through which bias might be introduced: confounding, selection of participants, classification of interventions, deviations from intended interventions, missing data, measurement of outcomes, and selection of reported results.', + bestUsedFor: 'Assessing risk of bias in non-randomized studies of interventions (NRSI).', + referenceLinks: [ + { + href: 'https://www.riskofbias.info/welcome/robins-i-v2', + text: 'ROBINS-I V2 tool', + }, + { + href: 'https://methods.cochrane.org/bias/risk-bias-non-randomized-studies-interventions', + text: 'Cochrane ROBINS-I guidance', + }, + ], + scoringDescription: + 'CoRATES automatically generates the overall risk of bias judgement using algorithms that map signalling question responses to domain-level and overall assessments, following the ROBINS-I V2 methodology.', + scoreLevels: [ + { + name: 'Low', + description: + 'The study is comparable to a well-performed randomized trial with regard to this domain. Bias is unlikely to alter the results.', + color: 'green', + }, + { + name: 'Moderate', + description: + 'The study is sound for a non-randomized study with regard to this domain but cannot be considered comparable to a well-performed randomized trial. There is some concern that the result may be biased.', + color: 'yellow', + }, + { + name: 'Serious', + description: + 'The study has some important problems in this domain. There is a serious risk that the result is biased.', + color: 'orange', + }, + { + name: 'Critical', + description: + 'The study is too problematic in this domain to provide any useful evidence. The result should not be used in any synthesis or considered further.', + color: 'red', + }, + { + name: 'Incomplete', + description: + 'There is insufficient information to make a judgement about risk of bias for this domain.', + color: 'gray', + }, + ], + }, + + rob2: { + id: 'rob2', + name: 'RoB 2', + slug: 'rob2', + description: + 'RoB 2 (Risk of Bias 2) is the revised Cochrane tool for assessing risk of bias in randomized trials. It addresses five domains through which bias might be introduced into the trial result: the randomization process, deviations from intended interventions, missing outcome data, measurement of the outcome, and selection of the reported result. RoB 2 is structured as a series of signalling questions that lead to domain-level and overall judgements.', + bestUsedFor: 'Assessing risk of bias in randomized controlled trials (RCTs).', + referenceLinks: [ + { + href: 'https://www.riskofbias.info/welcome/rob-2-0-tool/current-version-of-rob-2', + text: 'RoB 2 tool and templates', + }, + { + href: 'https://methods.cochrane.org/bias/resources/rob-2-revised-cochrane-risk-bias-tool-randomized-trials', + text: 'Cochrane RoB 2 guidance', + }, + ], + scoringDescription: + 'CoRATES automatically generates risk of bias judgements based on responses to signalling questions within each domain, following the RoB 2 algorithm for deriving domain-level and overall judgements.', + scoreLevels: [ + { + name: 'Low', + description: + 'The trial is judged to be at low risk of bias for all domains. Any departures from the intended intervention are not expected to affect the result.', + color: 'green', + }, + { + name: 'Some concerns', + description: + 'The trial is judged to raise some concerns in at least one domain, but not to be at high risk of bias for any domain. The result may be affected by bias.', + color: 'yellow', + }, + { + name: 'High', + description: + 'The trial is judged to be at high risk of bias in at least one domain, or there are some concerns for multiple domains in a way that substantially lowers confidence in the result.', + color: 'red', + }, + { + name: 'Incomplete', + description: + 'There is insufficient information to make a judgement about risk of bias for one or more domains.', + color: 'gray', + }, + ], + }, +}; + +/** + * Get tool content by slug + * @param {string} slug - The tool slug (e.g., 'amstar2', 'robins-i', 'rob2') + * @returns {Object|null} Tool content or null if not found + */ +export function getToolBySlug(slug) { + return getAllTools().find(tool => tool.slug === slug) || null; +} + +/** + * Get all tools for listing + * @returns {Array} Array of tool content objects + */ +export function getAllTools() { + return Object.values(TOOL_CONTENT); +} diff --git a/packages/landing/src/routes/contact.jsx b/packages/landing/src/routes/contact.jsx index f29ab800c..b9dfb977b 100644 --- a/packages/landing/src/routes/contact.jsx +++ b/packages/landing/src/routes/contact.jsx @@ -60,7 +60,7 @@ export default function Contact() {
-
+
{/* Hero Section */}
diff --git a/packages/landing/src/routes/privacy.jsx b/packages/landing/src/routes/privacy.jsx index a2b4f98e1..9fae52c06 100644 --- a/packages/landing/src/routes/privacy.jsx +++ b/packages/landing/src/routes/privacy.jsx @@ -23,7 +23,7 @@ export default function PrivacyPolicy() {
-
+

Privacy Policy

Effective date: January 7, 2026

diff --git a/packages/landing/src/routes/resources.jsx b/packages/landing/src/routes/resources.jsx deleted file mode 100644 index c1f225fe8..000000000 --- a/packages/landing/src/routes/resources.jsx +++ /dev/null @@ -1,190 +0,0 @@ -import { Title, Meta, Link } from '@solidjs/meta'; -import { HiOutlineDocumentText } from 'solid-icons/hi'; -import { AiOutlineCheckCircle } from 'solid-icons/ai'; -import { FiExternalLink, FiAlertCircle, FiAlertTriangle } from 'solid-icons/fi'; -import Navbar from '~/components/Navbar'; -import Footer from '~/components/Footer'; -import { config } from '~/lib/config'; - -export default function Resources() { - const pageUrl = `${config.appUrl}/resources`; - const title = 'Resources - CoRATES'; - const description = - 'Learn about AMSTAR 2 and other appraisal tools supported by CoRATES, including scoring guidance and links to official documentation.'; - - return ( - <> - {title} - - - - - - - - -
- - -
-
-

Resources

-

Appraisal tools and guidance

- -
- {/* AMSTAR 2 Section */} -
-

AMSTAR 2

-

- The AMSTAR 2 (A MeaSurement Tool to Assess systematic Reviews) is a critical - appraisal tool used to assess the methodological quality and risk of bias of - systematic reviews of interventions, including reviews that incorporate randomized - and non-randomized studies. It evaluates 16 domains and supports judgments about - confidence in a review's findings (high to critically low), helping users - determine how much trust to place in review results. -

-
- - {/* Best Used For */} -
-
-
- -
-
-

Best used for

-

Appraising systematic reviews of interventions.

-
-
-
- - {/* Links Section */} -
-
-
- -
-
-

Reference Documents

- -
-
-
- - {/* Scoring Section */} -
-

Scoring

-

- CoRATES automatically generates the overall score using decision rules that follow - the scoring guidance published in the AMSTAR 2 paper, ensuring consistency with - the tool's intended interpretation. -

- - {/* Confidence Levels Box */} -
- {/* High */} -
-
-
- -
-
-

High

-

- No or one non-critical weakness: the systematic review provides an - accurate and comprehensive summary of the results of the available studies - that address the question of interest. -

-
-
-
- - {/* Moderate */} -
-
-
- -
-
-

Moderate

-

- More than one non-critical weakness*: the systematic review has more than - one weakness but no critical flaws. It may provide an accurate summary of - the results of the available studies that were included in the review. -

-

- *Multiple non-critical weaknesses may diminish confidence in the review - and it may be appropriate to move the overall appraisal down from moderate - to low confidence. -

-
-
-
- - {/* Low */} -
-
-
- -
-
-

Low

-

- One critical flaw with or without non-critical weaknesses: the review has - a critical flaw and may not provide an accurate and comprehensive summary - of the available studies that address the question of interest. -

-
-
-
- - {/* Critically Low */} -
-
-
- -
-
-

Critically Low

-

- More than one critical flaw with or without non-critical weaknesses: the - review has more than one critical flaw and should not be relied on to - provide an accurate and comprehensive summary of the available studies. -

-
-
-
-
-
-
-
-
- -
-
- - ); -} diff --git a/packages/landing/src/routes/resources/amstar2.jsx b/packages/landing/src/routes/resources/amstar2.jsx new file mode 100644 index 000000000..89cea1382 --- /dev/null +++ b/packages/landing/src/routes/resources/amstar2.jsx @@ -0,0 +1,7 @@ +import ToolResourcePage from '~/components/resources/ToolResourcePage'; +import { getToolBySlug } from '~/lib/tool-content'; + +export default function AMSTAR2ResourcePage() { + const tool = getToolBySlug('amstar2'); + return ; +} diff --git a/packages/landing/src/routes/resources/index.jsx b/packages/landing/src/routes/resources/index.jsx new file mode 100644 index 000000000..18208fff9 --- /dev/null +++ b/packages/landing/src/routes/resources/index.jsx @@ -0,0 +1,80 @@ +import { Title, Meta, Link } from '@solidjs/meta'; +import { For } from 'solid-js'; +import { FiArrowRight } from 'solid-icons/fi'; +import { HiOutlineDocumentText } from 'solid-icons/hi'; +import Navbar from '~/components/Navbar'; +import Footer from '~/components/Footer'; +import { config } from '~/lib/config'; +import { getAllTools } from '~/lib/tool-content'; + +function ToolCard(props) { + return ( + +
+ +
+

{props.tool.name}

+

{props.tool.bestUsedFor}

+
+ Learn more + +
+
+ ); +} + +export default function Resources() { + const pageUrl = `${config.appUrl}/resources`; + const title = 'Resources - CoRATES'; + const description = + 'Learn about AMSTAR 2, ROBINS-I, RoB 2, and other appraisal tools supported by CoRATES, including scoring guidance and links to official documentation.'; + + const tools = getAllTools(); + + return ( + <> + {title} + + + + + + + + +
+ + +
+
+

Resources

+

+ Appraisal tools and guidance for systematic evidence synthesis +

+ +
+ {tool => } +
+ +
+

About these tools

+

+ CoRATES supports multiple evidence appraisal tools used in systematic reviews and + research synthesis. Each tool is designed for specific study types and provides + structured guidance for assessing methodological quality or risk of bias. Select a + tool above to learn more about its purpose, scoring methodology, and access official + documentation. +

+
+
+
+ +
+
+ + ); +} diff --git a/packages/landing/src/routes/resources/rob2.jsx b/packages/landing/src/routes/resources/rob2.jsx new file mode 100644 index 000000000..0ea295de0 --- /dev/null +++ b/packages/landing/src/routes/resources/rob2.jsx @@ -0,0 +1,7 @@ +import ToolResourcePage from '~/components/resources/ToolResourcePage'; +import { getToolBySlug } from '~/lib/tool-content'; + +export default function ROB2ResourcePage() { + const tool = getToolBySlug('rob2'); + return ; +} diff --git a/packages/landing/src/routes/resources/robins-i.jsx b/packages/landing/src/routes/resources/robins-i.jsx new file mode 100644 index 000000000..5b907e5ad --- /dev/null +++ b/packages/landing/src/routes/resources/robins-i.jsx @@ -0,0 +1,7 @@ +import ToolResourcePage from '~/components/resources/ToolResourcePage'; +import { getToolBySlug } from '~/lib/tool-content'; + +export default function ROBINSIResourcePage() { + const tool = getToolBySlug('robins-i'); + return ; +} diff --git a/packages/landing/src/routes/security.jsx b/packages/landing/src/routes/security.jsx index 1f1e3b880..657b71133 100644 --- a/packages/landing/src/routes/security.jsx +++ b/packages/landing/src/routes/security.jsx @@ -24,7 +24,7 @@ export default function Security() {
-
+

Security

How we protect your research data

diff --git a/packages/landing/src/routes/terms.jsx b/packages/landing/src/routes/terms.jsx index 7fc09d59b..d125407d5 100644 --- a/packages/landing/src/routes/terms.jsx +++ b/packages/landing/src/routes/terms.jsx @@ -23,7 +23,7 @@ export default function TermsOfService() {
-
+

Terms of Service

Effective date: January 7, 2026

diff --git a/packages/web/src/checklist-registry/types.js b/packages/web/src/checklist-registry/types.js index b58db517c..2723af069 100644 --- a/packages/web/src/checklist-registry/types.js +++ b/packages/web/src/checklist-registry/types.js @@ -28,7 +28,7 @@ export const CHECKLIST_METADATA = { shortName: 'AMSTAR 2', description: 'Quality assessment of systematic reviews', version: '2017', - url: `${LANDING_URL}/resources`, + url: `${LANDING_URL}/resources/amstar2`, scoreLevels: ['High', 'Moderate', 'Low', 'Critically Low'], scoreColors: { High: { bg: 'bg-green-100', text: 'text-green-800' }, @@ -42,7 +42,7 @@ export const CHECKLIST_METADATA = { shortName: 'ROBINS-I', description: 'Risk of bias in non-randomized studies of interventions', version: 'V2', - url: `${LANDING_URL}/resources`, + url: `${LANDING_URL}/resources/robins-i`, scoreLevels: ['Low', 'Moderate', 'Serious', 'Critical', 'Incomplete'], scoreColors: { Low: { bg: 'bg-green-100', text: 'text-green-800' }, @@ -57,7 +57,7 @@ export const CHECKLIST_METADATA = { shortName: 'RoB 2', description: 'Risk of bias in randomized trials', version: '2.0', - url: 'https://www.riskofbias.info/welcome/rob-2-0-tool', + url: `${LANDING_URL}/resources/rob2`, scoreLevels: ['Low', 'Some concerns', 'High', 'Incomplete'], scoreColors: { Low: { bg: 'bg-green-100', text: 'text-green-800' },