diff --git a/app/pub_page/ATTRIBUTIONS.md b/app/pub_page/ATTRIBUTIONS.md
new file mode 100644
index 0000000..5df5c40
--- /dev/null
+++ b/app/pub_page/ATTRIBUTIONS.md
@@ -0,0 +1,3 @@
+This Figma Make file includes components from [shadcn/ui](https://ui.shadcn.com/) used under [MIT license](https://github.com/shadcn-ui/ui/blob/main/LICENSE.md).
+
+This Figma Make file includes photos from [Unsplash](https://unsplash.com) used under [license](https://unsplash.com/license).
diff --git a/app/pub_page/README.md b/app/pub_page/README.md
new file mode 100644
index 0000000..a9f0f29
--- /dev/null
+++ b/app/pub_page/README.md
@@ -0,0 +1,11 @@
+
+ # Style Links with CSS
+
+ This is a code bundle for Style Links with CSS. The original project is available at https://www.figma.com/design/F1lMQY0EnORWSz1eNdnd96/Style-Links-with-CSS.
+
+ ## Running the code
+
+ Run `npm i` to install the dependencies.
+
+ Run `npm run dev` to start the development server.
+
\ No newline at end of file
diff --git a/app/pub_page/index.html b/app/pub_page/index.html
new file mode 100644
index 0000000..0cea716
--- /dev/null
+++ b/app/pub_page/index.html
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+ Style Links with CSS
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/pub_page/package.json b/app/pub_page/package.json
new file mode 100644
index 0000000..c36df6f
--- /dev/null
+++ b/app/pub_page/package.json
@@ -0,0 +1,89 @@
+{
+ "name": "@figma/my-make-file",
+ "private": true,
+ "version": "0.0.1",
+ "type": "module",
+ "scripts": {
+ "build": "vite build",
+ "dev": "vite"
+ },
+ "dependencies": {
+ "@emotion/react": "11.14.0",
+ "@emotion/styled": "11.14.1",
+ "@mui/icons-material": "7.3.5",
+ "@mui/material": "7.3.5",
+ "@popperjs/core": "2.11.8",
+ "@radix-ui/react-accordion": "1.2.3",
+ "@radix-ui/react-alert-dialog": "1.1.6",
+ "@radix-ui/react-aspect-ratio": "1.1.2",
+ "@radix-ui/react-avatar": "1.1.3",
+ "@radix-ui/react-checkbox": "1.1.4",
+ "@radix-ui/react-collapsible": "1.1.3",
+ "@radix-ui/react-context-menu": "2.2.6",
+ "@radix-ui/react-dialog": "1.1.6",
+ "@radix-ui/react-dropdown-menu": "2.1.6",
+ "@radix-ui/react-hover-card": "1.1.6",
+ "@radix-ui/react-label": "2.1.2",
+ "@radix-ui/react-menubar": "1.1.6",
+ "@radix-ui/react-navigation-menu": "1.2.5",
+ "@radix-ui/react-popover": "1.1.6",
+ "@radix-ui/react-progress": "1.1.2",
+ "@radix-ui/react-radio-group": "1.2.3",
+ "@radix-ui/react-scroll-area": "1.2.3",
+ "@radix-ui/react-select": "2.1.6",
+ "@radix-ui/react-separator": "1.1.2",
+ "@radix-ui/react-slider": "1.2.3",
+ "@radix-ui/react-slot": "1.1.2",
+ "@radix-ui/react-switch": "1.1.3",
+ "@radix-ui/react-tabs": "1.1.3",
+ "@radix-ui/react-toggle-group": "1.1.2",
+ "@radix-ui/react-toggle": "1.1.2",
+ "@radix-ui/react-tooltip": "1.1.8",
+ "class-variance-authority": "0.7.1",
+ "clsx": "2.1.1",
+ "cmdk": "1.1.1",
+ "date-fns": "3.6.0",
+ "embla-carousel-react": "8.6.0",
+ "input-otp": "1.4.2",
+ "lucide-react": "0.487.0",
+ "motion": "12.23.24",
+ "next-themes": "0.4.6",
+ "react-day-picker": "8.10.1",
+ "react-dnd": "16.0.1",
+ "react-dnd-html5-backend": "16.0.1",
+ "react-hook-form": "7.55.0",
+ "react-popper": "2.3.0",
+ "react-resizable-panels": "2.1.7",
+ "react-responsive-masonry": "2.7.1",
+ "react-router": "7.13.0",
+ "react-slick": "0.31.0",
+ "recharts": "2.15.2",
+ "sonner": "2.0.3",
+ "tailwind-merge": "3.2.0",
+ "tw-animate-css": "1.3.8",
+ "vaul": "1.1.2"
+ },
+ "devDependencies": {
+ "@tailwindcss/vite": "4.1.12",
+ "@vitejs/plugin-react": "4.7.0",
+ "tailwindcss": "4.1.12",
+ "vite": "6.3.5"
+ },
+ "peerDependencies": {
+ "react": "18.3.1",
+ "react-dom": "18.3.1"
+ },
+ "peerDependenciesMeta": {
+ "react": {
+ "optional": true
+ },
+ "react-dom": {
+ "optional": true
+ }
+ },
+ "pnpm": {
+ "overrides": {
+ "vite": "6.3.5"
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/pub_page/postcss.config.mjs b/app/pub_page/postcss.config.mjs
new file mode 100644
index 0000000..531dbec
--- /dev/null
+++ b/app/pub_page/postcss.config.mjs
@@ -0,0 +1,15 @@
+/**
+ * PostCSS Configuration
+ *
+ * Tailwind CSS v4 (via @tailwindcss/vite) automatically sets up all required
+ * PostCSS plugins — you do NOT need to include `tailwindcss` or `autoprefixer` here.
+ *
+ * This file only exists for adding additional PostCSS plugins, if needed.
+ * For example:
+ *
+ * import postcssNested from 'postcss-nested'
+ * export default { plugins: [postcssNested()] }
+ *
+ * Otherwise, you can leave this file empty.
+ */
+export default {}
diff --git a/app/pub_page/src/app/App.tsx b/app/pub_page/src/app/App.tsx
new file mode 100644
index 0000000..caf8bd7
--- /dev/null
+++ b/app/pub_page/src/app/App.tsx
@@ -0,0 +1,5 @@
+import PublicationsPage from "./components/Publications";
+
+export default function App() {
+ return ;
+}
diff --git a/app/pub_page/src/app/components/Publications.tsx b/app/pub_page/src/app/components/Publications.tsx
new file mode 100644
index 0000000..594d9fb
--- /dev/null
+++ b/app/pub_page/src/app/components/Publications.tsx
@@ -0,0 +1,1112 @@
+import svgPaths from "../../imports/svg-0wmwxk3hom";
+import imgImage1 from "figma:asset/aa0ba0b0f9f26ebda60d30bd5f8141b43b8eeae1.png";
+import imgLogoFooter from "figma:asset/58fd56f75ebe98b6835b2040fdd2bab0f7350eaa.png";
+
+// ─── Types ────────────────────────────────────────────────────────────────────
+
+interface PublicationEntry {
+ number: number;
+ content: React.ReactNode;
+}
+
+// ─── Helpers ──────────────────────────────────────────────────────────────────
+
+function B({ children }: { children: React.ReactNode }) {
+ return {children} ;
+}
+
+function PubLink({ href, children }: { href: string; children: React.ReactNode }) {
+ return (
+
+ {children}
+
+ );
+}
+
+// ─── Year header ──────────────────────────────────────────────────────────────
+
+function YearHeading({ year }: { year: string }) {
+ return (
+
+ );
+}
+
+// ─── Single publication row ────────────────────────────────────────────────────
+
+function PubItem({ number, content }: PublicationEntry) {
+ return (
+
+
+ {number}.
+
+
+ {content}
+
+
+ );
+}
+
+// ─── Publications data ────────────────────────────────────────────────────────
+
+const pubs2025: PublicationEntry[] = [
+ {
+ number: 1,
+ content: (
+ <>
+ Lin EPY, Hsu CY, Mishra S , […], Warner JL *, Shyr Y*, on behalf of the COVID-19 and Cancer Consortium.{" "}
+
+ Associations of COVID-19 vaccination with risks for post-infectious cardiovascular complications: an international cohort study in cancer patients with SARS-CoV-2 infection
+
+ . Lancet Reg Health Am. 2025 Mar 6;44:101038. doi: 10.1016/j.lana.2025.101038. PMID: 40124588; PMCID: PMC11930098.
+ >
+ ),
+ },
+ {
+ number: 2,
+ content: (
+ <>
+ Ahn B, Chou C, Chou C, Chen J, Zug A, Baykara Y, Claus J, Hacking SM, Uzun A, Gamsiz Uzun ED .
+
+ {" "}The Atlas of Protein-Protein Interactions in Cancer (APPIC)-a webtool to visualize and analyze cancer subtypes
+
+ . NAR Cancer. 2025 Jan 15;7(1):zcae047. doi: 10.1093/narcan/zcae047. PMID: 39822275; PMCID: PMC11734624.
+ >
+ ),
+ },
+ {
+ number: 3,
+ content: (
+ <>
+ El-Deiry WS, Bresson C, Wunder F, Carneiro BA, Dizon DS, Warner JL , et al.{" "}
+
+ Worldwide Innovative Network (WIN) Consortium in Personalized Cancer Medicine: Bringing next-generation precision oncology to patients
+
+ . Oncotarget. 2025 Mar 12;16:140-162. doi: 10.18632/oncotarget.28703. PMID: 40073368; PMCID: PMC11907938.
+ >
+ ),
+ },
+ {
+ number: 4,
+ content: (
+ <>
+ Warner JL "Lessons From the COVID-19 and Cancer Consortium" in National Cancer Policy Forum, Board on Health Care Services, Health and Medicine Division, & National Academies of Sciences, Engineering, and Medicine. (2025).{" "}
+
+ Enabling 21st Century Applications for Cancer Surveillance Through Enhanced Registries and Beyond: Proceedings of a Workshop
+
+ {" "}(F. Amankwah, T. Wizemann, & S. Nass, Eds). National Academies Press.{" "}
+ https://doi.org/10.17226/28676
+ >
+ ),
+ },
+ {
+ number: 5,
+ content: (
+ <>
+ Menville JE, Shinde N, Collins S, Jiao Z , Persad-Paisley EM, Baranwal N, Woo AS. Craniosynostosis: Quantifying Differences in Skull Architecture. Cleft Palate Craniofac J. 2025 Jan 19:10556656241297526. doi: 10.1177/10556656241297526. Epub ahead of print. PMID: 39828920.
+ >
+ ),
+ },
+ {
+ number: 6,
+ content: (
+ <>
+ Crawford JM, Penberthy L, Pinto LA, Althoff KN, Assimon MM, Cohen O, Gillim L, Hammonds TL, Kapur S, Kaufman HW, Kwasny D, Liew JW, Meyer WA 3rd, Reynolds SL, Schleicher CB, Subbiah S, Theruviparampil C, Wallace ZS, Warner JL , Yoon S, Ziemba YC.{" "}
+
+ Coronavirus Disease 2019 (COVID-19) Real World Data Infrastructure: A Big-Data Resource for Study of the Impact of COVID-19 in Patient Populations With Immunocompromising Conditions
+
+ . Open Forum Infect Dis. 2025 Jan 23;12(1):ofaf021. doi: 10.1093/ofid/ofaf021. eCollection 2025 Jan. PMID: 39850579.
+ >
+ ),
+ },
+ {
+ number: 7,
+ content: (
+ <>
+ Naqvi SAA, Riaz IB, Bibi A, Khan MA, Imran M, Khakwani KZR, Raina A, Anjum MU, Cobran EK, Warner JL , Hussain SA, Singh P, Childs DS, Baca SC, Orme JJ, Mateo J, Agarwal N, Gillessen S, Murad MH, Sartor O, Bryce AH.{" "}
+
+ Heterogeneity of the Treatment Effect with PARP Inhibitors in Metastatic Castration-resistant Prostate Cancer: A Living Interactive Systematic Review and Meta-analysis.
+
+ {" "}Eur Urol. 2025 Jan 22:S0302-2838(24)02760-X. doi: 10.1016/j.eururo.2024.12.007. Online ahead of print. PMID: 39848867.
+ >
+ ),
+ },
+ {
+ number: 8,
+ content: (
+ <>
+ Khan MA, Ayub U, Naqvi SAA, Khakwani KZR, Sipra ZBR, Raina A, Zhou S, He H, Saeidi A, Hasan B, Rumble RB, Bitterman DS, Warner JL , Zou J, Tevaarwerk AJ, Leventakos K, Kehl KL, Palmer JM, Murad MH, Baral C, Riaz IB.{" "}
+
+ Collaborative large language models for automated data extraction in living systematic reviews.
+
+ {" "}J Am Med Inform Assoc. 2025 Jan 21:ocae325. doi: 10.1093/jamia/ocae325. Online ahead of print. PMID: 39836495
+ >
+ ),
+ },
+ {
+ number: 9,
+ content: (
+ <>
+ Hong YD, Enewold L, Sharon E, Warner JL , Davidoff AJ, Zeruto C, Mariotto AB.{" "}
+
+ Evolving patterns in systemic treatment utilization and survival among older patients with advanced cutaneous melanoma.
+
+ {" "}Cancer Med. 2024 Aug;13(16):e70131. doi: 10.1002/cam4.70131. PMID: 39194340
+ >
+ ),
+ },
+ {
+ number: 10,
+ content: (
+ <>
+ Ahn B, Chou C, Chou C, Chen J, Zug A, Baykara Y, Claus J, Hacking SM, Uzun A, Gamsiz Uzun ED .
+
+ {" "}The Atlas of Protein-Protein Interactions in Cancer (APPIC)-a webtool to visualize and analyze cancer subtypes
+
+ . NAR Cancer. 2025 Jan 15;7(1):zcae047. doi: 10.1093/narcan/zcae047. eCollection 2025 Mar. PMID: 39822275
+ >
+ ),
+ },
+ {
+ number: 11,
+ content: (
+ <>
+ Hilty EC, Vilski V, Mishra S , Condon P, Gracia SM.{" "}
+
+ Building an Inclusive Data Literacy Community.
+
+ {" "}Harvard Data Science Review 2025 Jan 30;7(1). doi: 10.1162/99608f92.d622eaff
+ >
+ ),
+ },
+ {
+ number: 12,
+ content: (
+ <>
+ Li Y, Imami MR, Zhao L, Amindarolzarbi A, Mena E, Leal J, Chen J, Gafita A, Voter AF, Li X, Du Y, Zhu C, Choyke PL, Zou B, Jiao Z , Rowe SP, Pomper MG, Bai HX.{" "}
+ An Automated Deep Learning-Based Framework for Uptake Segmentation and Classification on PSMA PET/CT Imaging of Patients with Prostate Cancer
+ . J Imaging Inform Med. 2024 Oct;37(5):2206-2215. doi: 10.1007/s10278-024-01104-y. Epub 2024 Apr 8. PMID: 38587770; PMCID: PMC11522269.
+ >
+ ),
+ },
+];
+
+const pubs2024: PublicationEntry[] = [
+ {
+ number: 1,
+ content: (
+ <>
+ Gomez F, Danos AM, Del Fiol G, Madabhushi A, Tiwari P, McMichael JF, Bakas S, Bian J, Davatzikos C, Fertig EJ, Kalpathy-Cramer J, Kenney J, Savova GK, Yetisgen M, Van Allen EM, Warner JL , Prior F, Griffith M, Griffith OL.{" "}
+
+ A New Era of Data-Driven Cancer Research and Care: Opportunities and Challenges
+
+ . Cancer Discov. 2024 Oct 4;14(10):1774-1778. doi: 10.1158/2159-8290.CD-24-1130. PMID: 39363742; PMCID: PMC11463721.
+ >
+ ),
+ },
+ {
+ number: 2,
+ content: (
+ <>
+ Guermazi D, Arvanitis P, Vieira K, Warner JL , Farmakiotis D.{" "}
+
+ Oral antivirals for COVID-19 among patients with cancer
+
+ . Supportive Care in Cancer. 2024 Jul 9;32(8):496. PMID: 38980433.
+ >
+ ),
+ },
+ {
+ number: 3,
+ content: (
+ <>
+ Lee K, Paek H, Huang LC, Hilton CB, Datta S, Higashi J, Ofoegbu N, Wang J, Rubinstein SM, Cowan AJ, Kwok M, Warner JL , Xu H, Wang X.{" "}
+
+ SEETrials: Leveraging Large Language Models for Safety and Efficacy Extraction in Oncology Clinical Trials
+
+ . Informatics in Medicine Unlocked. 2024 Oct 11;50:101589. PMCID: PMC11530223.
+ >
+ ),
+ },
+ {
+ number: 4,
+ content: (
+ <>
+ Munoz E, VanHelene AD , Yang NT, Ramirez AG (2024).{" "}
+
+ CancerClarity app: Enhancing cancer data visualization with AI-generated narratives
+
+ . Preventive Oncology & Epidemiology, 3(1). doi:10.1080/28322134.2024.2431501
+ >
+ ),
+ },
+ {
+ number: 5,
+ content: (
+ <>
+ Song Q, Ni C, Warner JL , Chen Q, Song L, Rosenbloom ST, Malin BA, Yin Z.{" "}
+
+ Optimizing word embeddings for small dataset: a case study on patient portal messages from breast cancer patients
+
+ . Scientific Reports. 2024 Jul 12;14(1):16117. PMID: 38997332; PMCID: PMC11245534.
+ >
+ ),
+ },
+ {
+ number: 6,
+ content: (
+ <>
+ VanHelene AD*, Hadfield MJ* , Trapani D, Warner JL#, Lythgoe MP# . "
+
+ As bleak as it sounds? Analysing trends in oncology clinical trial initiation in the UK from 2010 to 2022
+
+ " BMJ Oncol. 2024 Aug 14;3(1):e000410. doi: 10.1136/bmjonc-2024-000410. eCollection 2024. PMID: 39886121 (VanHelene and Hadfield co-first authors.; Warner and Lythgoe co-last authors)
+ >
+ ),
+ },
+ {
+ number: 7,
+ content: (
+ <>
+ VanHelene AD , Khatri I, Hilton CB, Mishra S, Gamsiz Uzun ED, Warner JL .{" "}
+
+ Inferring gender from first names: Comparing the accuracy of Genderize, Gender API, and the gender R package on authors of diverse nationality
+
+ . PLOS Digit Health. 2024 Oct 29;3(10):e0000456. doi: 0.1371/journal.pdig.0000456. PMID: 39471154; PMCID: PMC11521266.
+ >
+ ),
+ },
+ {
+ number: 8,
+ content: (
+ <>
+ Wu Q, Morrow EM, Gamsiz Uzun ED .{" "}
+
+ A deep learning model for prediction of autism status using whole-exome sequencing data
+
+ . PLoS Comput Biol. 2024 Nov 8;20(11):e1012468. doi: 10.1371/journal.pcbi.1012468. PMID: 39514604; PMCID: PMC11578481.
+ >
+ ),
+ },
+ {
+ number: 9,
+ content: (
+ <>
+ Hadfield MJ, Benjamin DJ, Krell J, Warner J, Lythgoe MP.{" "}
+
+ The evolving posology and administration of immune checkpoint inhibitors: subcutaneous formulations
+
+ . Trends in Cancer. 2024 Apr 6. Epub ahead of print. PMID: 38584070.
+ >
+ ),
+ },
+ {
+ number: 10,
+ content: (
+ <>
+ Burus T*, VanHelene AD*, Rooney MK, Lang Kuhs KA, Christian WJ, McNair C, Mishra S, Paulino AC, Smith GL, Frank SJ, Warner JL.{" "}
+
+ Travel-Time Disparities in Access to Proton Beam Therapy for Cancer Treatment
+
+ . JAMA Network Open. 2024 May 1;7(5):e2410670. PMID: 38758559.
+ >
+ ),
+ },
+ {
+ number: 11,
+ content: (
+ <>
+ Zuo X, Kumar A, Shen S, Li J, Cong G, Jin E, Chen Q, Warner JL, Yang P, Xu H.{" "}
+
+ Extracting Systemic Anticancer Therapy and Response Information from Clinical Notes Following the RECIST Definition
+
+ . JCO Clinical Cancer Informatics. 2024 Jun;8:e2300166. PMID: 38885475.
+ >
+ ),
+ },
+ {
+ number: 12,
+ content: (
+ <>
+ Bishay S, Robb WH, Schwartz TM, Smith DS, Lee LH, Lynn CJ, Clark TL, Jefferson AL, Warner JL , Rosenthal EL, Murphy BA, Hohman TJ, Koran MEI.{" "}
+
+ Frontal and anterior temporal hypometabolism post chemoradiation in head and neck cancer: A real-world PET study
+
+ . Journal of Neuroimaging. Mar-Apr;34(2):211-216. doi: 10.1111/jon.13181. Epub 2023 Dec 26. PMID: 38148283.
+ >
+ ),
+ },
+ {
+ number: 13,
+ content: (
+ <>
+ Guermazi D, Arvanitis P, Vieira K, Warner JL , Farmakiotis D.{" "}
+
+ Oral antivirals for COVID-19 among patients with cancer
+
+ . Res Sq [Preprint]. 2024 Jan 24:rs.3.rs-3876022. PMID: 38343793; PMCID: PMC10854279.
+ >
+ ),
+ },
+ {
+ number: 14,
+ content: (
+ <>
+ Zack T, Warner JL .{" "}
+
+ Introducing a Comprehensive Score of Systemic Anticancer Treatment Relevance
+
+ . Studies in Health Technology & Informatics. 2024 Jan 25;310:464-468. PMID: 38269846; PMCID: PMC10909246.
+ >
+ ),
+ },
+];
+
+const pubs2023: PublicationEntry[] = [
+ {
+ number: 1,
+ content: (
+ <>
+ Egan PC, Jani C, Singh H, Mishra S , Warner JL .{" "}
+
+ The Importance of Recency of Cancer Diagnosis in Patients Hospitalized with COVID-19-Glimpses from an EHR-based Study
+
+ . Cancer Epidemiology, Biomarkers & Prevention. 2023 Jan 9;32(1):3-5.
+ >
+ ),
+ },
+ {
+ number: 2,
+ content: (
+ <>
+ De Souza A, Charissa C , Mega AE, Douglass J, Olszewski A, Gamsiz Uzun ED , Uzun A , Duan F, Wang J, Amin A, Golijanin D, Holder S, Lagos G, Safran H, El-Deiry WS, Carneiro BA.{" "}
+
+ Clinical features of patients with MTAP-deleted bladder cancer
+
+ . American Journal of Cancer Research. 2023 Jan 15;13(1):326-339.
+ >
+ ),
+ },
+ {
+ number: 3,
+ content: (
+ <>
+ Riaz IB, Islam M, Ikram W, Naqvi SAA, Maqsood H, Saleem Y, Riaz A, Ravi P, Wang Z, Hussain SA, Warner JL , Odedina FT, Duma N, Singh P, Kehl KL, Kamran SC, Murad MH, Landman A, Van Allen E, Bryce AH.{" "}
+
+ Disparities in the Inclusion of Racial and Ethnic Minority Groups and Older Adults in Prostate Cancer Clinical Trials: A Meta-analysis
+
+ . JAMA Oncology. 2023 Feb 1;9(2):180-187.
+ >
+ ),
+ },
+ {
+ number: 4,
+ content: (
+ <>
+ Hacking S, Chou C, Baykara Y, Wang Y, Uzun A , Gamsiz Uzun ED .{" "}
+
+ MMR Deficiency Defines Distinct Molecular Subtype of Breast Cancer with Histone Proteomic Networks
+
+ . International Journal of Molecular Science. 2023 Mar 10;24(6):5327.
+ >
+ ),
+ },
+ {
+ number: 5,
+ content: (
+ <>
+ Choueiri TK*, Labaki C*, Bakouny Z*, Hsu C-Y, Schmidt AL, de Lima Lopes G, Hwang C, Singh SRK, Jani C, Weissmann LB, Griffiths EA, Halabi S, Wu U, Berg S, O'Connor TE, Wise-Draper TM, Panagiotou OA, Klein EJ, Joshi M, Yared F, Santos Dutra M, Gatson NTN, Blau S, Singh H, Nanchal R, McKay RR, Nonato TK, Quinn R, Rubinstein SM, Puc M, Mavromatis BH, Vikas P, Faller B, Zaren HA, Del Prete S, Russell K, Reuben DY, Accordino MK, Singh H, Friese CR, Mishra S , Rivera DR*, Shyr Y*, Farmakiotis D*, Warner JL *.{" "}
+
+ Breakthrough SARS-CoV-2 infections among patients with cancer following two and three doses of COVID-19 mRNA vaccines: a retrospective observational study from the COVID-19 and Cancer Consortium
+
+ . The Lancet Regional Health – Americas. 2023 Mar;19:100445.
+ >
+ ),
+ },
+ {
+ number: 6,
+ content: (
+ <>
+ Johnson DB, Atkins MB, Hennessy C, Wise-Draper T, Heilman H, Awosika J, Bakouny Z, Labaki C, Saliby RM, Hwang C, Singh SRK, Balanchivadze N, Friese CR, Fecher LA, Yoon JJ, Hayes-Lattin B, Bilen MA, Castellano CA, Lyman GH, Tachiki L, Shah SA, Glover MJ, Flora DB, Wulff-Burchfield E, Kasi A, Abbasi SH, Farmakiotis D, Viera K, Klein EJ, Weissman LB, Jani C, Puc M, Fahey CC, Reuben DY, Mishra S , Beeghly-Fadiel A, French B, Warner JL ; COVID-19 and Cancer Consortium.{" "}
+
+ Impact of COVID-19 in patients on active melanoma therapy and with history of melanoma
+
+ . BMC Cancer. 2023 Mar 23;23(1):265.
+ >
+ ),
+ },
+ {
+ number: 7,
+ content: (
+ <>
+ Best AF, Bowman M, Li J, Mishkin GE, Denicoff A, Shekfeh M, Rubinstein L, Warner JL , Rini B, Korde LA.{" "}
+
+ COVID-19 severity by vaccination status in the NCI COVID-19 and Cancer Patients Study (NCCAPS)
+
+ . Journal of the National Cancer Institute. 2023 May 8;115(5):597-600.
+ >
+ ),
+ },
+ {
+ number: 8,
+ content: (
+ <>
+ Leung CS, Rosenzweig SJ, Yoon B, Marinelli NA, Hollingsworth EW, Maguire AM, Cowen MH, Schmidt M, Imitola J, Gamsiz Uzun ED *, Lizarraga SB*.{" "}
+
+ Dysregulation of the chromatin environment leads to differential alternative splicing as a mechanism of disease in a human model of autism spectrum disorder
+
+ . Human Molecular Genetics. 2023 May 5;32(10):1634-1646. This study was featured in a Spectrum News article ("
+
+ Chromatin remodeling tied to altered splicing in autism model
+
+ .")
+ >
+ ),
+ },
+ {
+ number: 9,
+ content: (
+ <>
+ Hacking SM, Karam J , Singh K, Gamsiz Uzun ED , Brickman A , Yakirevich E, Taliano R, Wang Y.{" "}
+
+ Whole slide image features predict pathologic complete response and poor clinical outcomes in triple-negative breast cancer
+
+ . Pathology-Research and Practice. 2023 Jun;246:154476.
+ >
+ ),
+ },
+ {
+ number: 10,
+ content: (
+ <>
+ Chen S, Guevara M, Ramirez N, Murray A, Warner JL , Aerts HJWL, Miller TA, Savova GK, Mak RH, Bitterman DS.{" "}
+
+ Natural Language Processing to Automatically Extract the Presence and Severity of Esophagitis in Notes of Patients Undergoing Radiotherapy
+
+ . JCO Clinical Cancer Informatics. 2023 Jul;7:e2300048.
+ >
+ ),
+ },
+ {
+ number: 11,
+ content: (
+ <>
+ Jain S , Li X, Warner J . Graphical presentations in systemic anticancer treatment network meta-analyses: A systematic review. Proceedings of MEDINFO 2023. In press.
+ >
+ ),
+ },
+ {
+ number: 12,
+ content: (
+ <>
+ Zack T, Warner JL . Introducing a comprehensive score of systemic anticancer treatment relevance. Proceedings of MEDINFO 2023. In press.
+ >
+ ),
+ },
+ {
+ number: 13,
+ content: (
+ <>
+ Moey MYY, Hennessy C, French B, Warner JL , Tucker MD, Hausrath DJ, Shah DP, DeCara JM, Bakouny Z, Labaki C, Choueiri TK, Dent S, Akhter N, Ismail-Khan R, Tachiki L, Slosky D, Polonsky TS, Awosika JA, Crago A, Wise-Draper T, Balanchivadze N, Hwang C, Fecher LA, Gomez CG, Hayes-Lattin B, Glover MJ, Shah SA, Gopalakrishnan D, Griffiths EA, Kwon DH, Koshkin VS, Mahmood S, Bashir B, Nonato T, Razavi P, McKay RR, Nagaraj G, Oligino E, Puc M, Tregubenko P, Wulff-Burchfield EM, Xie Z, Halfdanarson TR, Farmakiotis D, Klein EJ, Robilotti EV, Riely GJ, Durand JB, Hayek SS, Kondapalli L, Berg S, O'Connor TE, Bilen MA, Castellano C, Accordino MK, Sibel B, Weissmann LB, Jani C, Flora DB, Rudski L, Dutra MS, Nathaniel B, Ruíz-García E, Vilar-Compte D, Gupta S, Morgans A, Nohria A; COVID-19 and Cancer Consortium.{" "}
+
+ COVID-19 severity and cardiovascular outcomes in SARS-CoV-2-infected patients with cancer and cardiovascular disease
+
+ . Translational Oncology. 2023 Aug;34:101709.
+ >
+ ),
+ },
+ {
+ number: 14,
+ content: (
+ <>
+ Rooney MK, Sharifi B, Ludmir EB, Fuller CD, Warner JL .{" "}
+
+ Factors Associated With Altmetric Attention Scores for Randomized Phase III Cancer Clinical Trials
+
+ . JCO Clinical Cancer Informatics. 2023 Aug;7:e2300082.
+ >
+ ),
+ },
+ {
+ number: 15,
+ content: (
+ <>
+ Castelo-Branco L, Lee R, Brandao M, Cortellini A, Freitaa A, Garassino M, Geukens T, Grivas P, Halabi S, Oliveria J, Pinato DJ, Ribeiro J, Peters S, Pentheroudakis G, Warner JL , Romano E.{" "}
+
+ Learning Lessons from the COVID-19 pandemic for Real World Evidence research in Oncology – shared perspectives from an international consortia
+
+ . ESMO Open. 2023 Aug;8(4):101596.
+ >
+ ),
+ },
+ {
+ number: 16,
+ content: (
+ <>
+ Choudhury NJ, Lavery JA, Brown S, de Bruijn I, Jee J, Tran TN, Rizvi H, Arbour KC, Whiting K, Shen R, Hellmann M, Bedard PL, Yu C, Leighl N, LeNoue-Newton M, Micheel C, Warner JL , Ginsberg MS, Plodkowski A, Girshman J, Sawan P, Pillai S, Sweeney SM, Kehl KL, Panageas KS, Schultz N, Schrag D, Riely GJ;{" "}
+
+ AACR GENIE BPC Core Team. The GENIE BPC NSCLC Cohort: A Real-World Repository Integrating Standardized Clinical and Genomic Data for 1,846 Patients with Non-Small Cell Lung Cancer
+
+ . Clinical Cancer Research. 2023 Sep 1;29(17):3418-3428.
+ >
+ ),
+ },
+ {
+ number: 17,
+ content: (
+ <>
+ Bitterman DS, Goldner E, Finan S, Harris D, Durbin EB, Hochheiser H, Warner JL , Mak RH, Miller T, Savova GK.{" "}
+
+ An end-to-end natural language processing system for automatically extracting radiotherapy events from clinical texts: NLP to extract radiotherapy events from text
+
+ . International Journal of Radiation Oncology Biology & Physics. 2023 Sep 1;117(1):262-273.
+ >
+ ),
+ },
+ {
+ number: 18,
+ content: (
+ <>
+ Baykara Y , Gamsiz Uzun ED , Jackson C, Kurt H.{" "}
+
+ Exon 19 Deletion in EGFR in a Patient with a High-Grade Glioma: A Case Report
+
+ . Annals of Clinical & Laboratory Science. 2023 Sep;53(5):789-791.
+ >
+ ),
+ },
+ {
+ number: 19,
+ content: (
+ <>
+ Hochheiser H, Finan S, Yuan Z, Durbin EB, Jeong JC, Hands I, Rust D, Kavuluru R, Wu XC, Warner JL , Savova G.{" "}
+
+ DeepPhe-CR: Natural Language Processing Software Services for Cancer Registrar Case Abstraction
+
+ . JCO Clinical Cancer Informatics. 2023 Sep;7:e2300156.
+ >
+ ),
+ },
+ {
+ number: 20,
+ content: (
+ <>
+ Gulati S, Hsu CY, Shah S, Shah PK, Zon R, Alsamarai S, Awosika J, El-Bakouny Z, Bashir B, Beeghly A, Berg S, de-la-Rosa-Martinez D, Doroshow DB, Egan PC, Fein J, Flora DB, Friese CR, Fromowitz A, Griffiths EA, Hwang C, Jani C, Joshi M, Khan H, Klein EJ, Heater NK, Koshkin VS, Kwon DH, Labaki C, Latif T, McKay RR, Nagaraj G, Nakasone ES, Nonato T, Polimera HV, Puc M, Razavi P, Ruiz-Garcia E, Saliby RM, Shastri A, Singh SRK, Tagalakis V, Vilar-Compte D, Weissmann LB, Wilkins CR, Wise-Draper TM, Wotman MT, Yoon JJ, Mishra S , Grivas P, Shyr Y, Warner JL , Connors JM, Shah DP*, Rosovsky RP*;{" "}
+
+ COVID-19 and Cancer Consortium. Systemic Anticancer Therapy and Thromboembolic Outcomes in Hospitalized Patients With Cancer and COVID-19
+
+ . JAMA Oncology. 2023 Oct 1;9(10):1390-1400.
+ >
+ ),
+ },
+ {
+ number: 21,
+ content: (
+ <>
+ Nagaraj G*, Vinayak S*, Khaki AR*, Sun T, Kuderer NM, Aboulafia DM, Acoba JD, Awosika J, Bakouny Z, Balmaceda NB, Bao T, Bashir B, Berg S, Bilen MA, Bindal P, Blau S, Bodin BE, Borno HT, Castellano C, Choi H, Deeken J, Desai A, Edwin N, Feldman LE, Flora DB, Friese CR, Galsky MD, Gonzalez CJ, Grivas P, Gupta S, Haynam M, Heilman H, Hershman DL, Hwang C, Jani C, Jhawar SR, Joshi M, Kaklamani V, Klein EJ, Knox N, Koshkin VS, Kulkarni AA, Kwon DH, Labaki C, Lammers PE, Lathrop KI, Lewis MA, Li X, Lopes GL, Lyman GH, Makower DF, Mansoor AH, Markham MJ, Mashru SH, McKay RR, Messing I, Mico V, Nadkarni R, Namburi S, Nguyen RH, Nonato TK, O'Connor TL, Panagiotou OA, Park K, Patel JM, Patel KG, Peppercorn J, Polimera H, Puc M, Rao YJ, Razavi P, Reid SA, Riess JW, Rivera DR, Robson M, Rose SJ, Russ AD, Schapira L, Shah PK, Shanahan MK, Shapiro LC, Smits M, Stover DG, Streckfuss M, Tachiki L, Thompson MA, Tolaney SM, Weissmann LB, Wilson G, Wotman MT, Wulff-Burchfield EM, Mishra S , French B, Warner JL , Lustberg MB*, Accordino MK*, Shah DP*; COVID-19 and Cancer Consortium.{" "}
+
+ Clinical characteristics, racial inequities, and outcomes in patients with breast cancer and COVID-19: a COVID-19 and cancer consortium (CCC19) cohort study
+
+ . eLife. 2023 Oct 17:12:e82618.
+ >
+ ),
+ },
+ {
+ number: 22,
+ content: (
+ <>
+ Shuey MM, Stead WW, Aka I, Barnado AL, Bastarache JA, Brokamp E, Campbell M, Carroll RJ, Goldstein JA, Lewis A, Malow BA, Mosley JD, Osterman T, Padovani-Claudio DA, Ramirez A, Roden DM, Schuler BA, Siew E, Sucre J, Thomsen I, Tinker RJ, Van Driest S, Walsh C, Warner JL , Wells QS, Wheless L, Bastarache L.{" "}
+
+ Next-generation phenotyping: introducing phecodeX for enhanced discovery research in medical phenomics
+
+ . Bioinformatics. 2023 Nov 1;39(11):btad655.
+ >
+ ),
+ },
+ {
+ number: 23,
+ content: (
+ <>
+ Cannon M, Stevenson J, Kuzma K, Kiwala S, Warner JL , Griffith OL, Griffith M, Wagner AH.{" "}
+
+ Normalization of drug and therapeutic concepts with Thera-Py
+
+ . JAMIA Open. 2023 Nov 8;6(4):ooad093.
+ >
+ ),
+ },
+ {
+ number: 24,
+ content: (
+ <>
+ Wu Q , Ma L, Joesch-Cohen L , Schmidt M, Gamsiz Uzun ED *, Morrow EM*.{" "}
+
+ Targeting NHE6 gene expression identifies lysosome and neurodevelopmental mechanisms in a haploid in vitro cell model
+
+ . Biology Open. 2023 Nov 15;12(11):bio059778.
+ >
+ ),
+ },
+ {
+ number: 25,
+ content: (
+ <>
+ Jani CT*, Ahmed A*, Singh H, Mouchati C, Al Omari O, Bhatt PS, Sharma R, Farooq M, Liu W, Shalhoub J, Marshall D, Salciccioli JD*, Warner JL *, Lam P*.{" "}
+
+ Burden of AML, 1990-2019: Estimates From the Global Burden of Disease Study
+
+ . JCO Global Oncology. 2023 Nov 22;9:e2300229.
+ >
+ ),
+ },
+ {
+ number: 26,
+ content: (
+ <>
+ Walton NA, Nagarajan R, Wang C, Sincan M, Freimuth RR, Everman DB, Walton DC, McGrath SP, Lemas DJ, Benos PV, Alekseyenko AV, Song Q, Gamsiz Uzun ED , Taylor CO, Uzun A , Person TN, Rappoport N, Zhao Z, Williams MS.{" "}
+
+ Enabling the clinical application of artificial intelligence in genomics: a perspective of the AMIA Genomics and Translational Bioinformatics Workgroup
+
+ . Journal of the American Medical Informatics Association, 2023 Nov30:ocad211.
+ >
+ ),
+ },
+ {
+ number: 27,
+ content: (
+ <>
+ de Bruijn I, Kundra R, Mastrogiacomo B, Tran TN, Sikina L, Mazor T, Li X, Ochoa A, Zhao G, Lai B, Abeshouse A, Baiceanu D, Ciftci E, Dogrusoz U, Dufilie A, Erkoc Z, Garcia Lara E, Fu Z, Gross B, Haynes C, Heath A, Higgins D, Jagannathan P, Kalletla K, Kumari P, Lindsay J, Lisman A, Leenknegt B, Lukasse P, Madela D, Madupuri R, van Nierop P, Plantalech O, Quach J, Resnick AC, Rodenburg SYA, Satravada BA, Schaeffer F, Sheridan R, Singh J, Sirohi R, Sumer SO, van Hagen S, Wang A, Wilson M, Zhang H, Zhu K, Rusk N, Brown S, Lavery JA, Panageas KS, Rudolph JE, LeNoue-Newton ML, Warner JL , Guo X, Hunter-Zinck H, Yu TV, Pilai S, Nichols C, Gardos SM, Philip J; AACR Project GENIE BPC Core Team, AACR Project GENIE Consortium; Kehl KL, Riely GJ, Schrag D, Lee J, Fiandalo MV, Sweeney SM, Pugh TJ, Sander C, Cerami E, Gao J, Schultz N.{" "}
+
+ Analysis and Visualization of Longitudinal Genomic and Clinical Data from the AACR Project GENIE Biopharma Collaborative in cBioPortal
+
+ . Cancer Research. 2023 Dec 1;83(23):3861-3867.
+ >
+ ),
+ },
+ {
+ number: 28,
+ content: (
+ <>
+ EA Sigworth, SM Rubinstein, JL Warner , Y Chen, Q Chen.{" "}
+
+ Building a dose toxo-equivalence model from a Bayesian meta-analysis of published clinical trials
+
+ . The Annals of Applied Statistics. 2023 Dec;17(4):2993-3012.
+ >
+ ),
+ },
+ {
+ number: 29,
+ content: (
+ <>
+ Brickman A , Baykara Y, Carabaño M, Hacking SM.{" "}
+
+ Whole slide images as non-fungible tokens: A decentralized approach to secure, scalable data storage and access
+
+ . J Pathol Inform. 2023 Nov 9;15:100350. doi: 10.1016/j.jpi.2023.100350. PMID: 38162951; PMCID: PMC10757022.
+ >
+ ),
+ },
+];
+
+// ─── Social Icons SVG ─────────────────────────────────────────────────────────
+
+function SocialIconsSVG() {
+ return (
+
+ );
+}
+
+// ─── Main component ───────────────────────────────────────────────────────────
+
+export default function PublicationsPage() {
+ const baseFont = "'Source Sans 3', 'Source Sans Pro', sans-serif";
+
+ return (
+
+ {/* ── NAV BAR ── */}
+
+
+
+
+
+
+ {[
+ { label: "Home", href: "https://sites.brown.edu/ccids/" },
+ { label: "Members", href: "https://sites.brown.edu/ccids/members/" },
+ { label: "Events", href: "https://sites.brown.edu/ccids/events/" },
+ { label: "Contact", href: "https://sites.brown.edu/ccids/contact/" },
+ { label: "Publications", href: "https://sites.brown.edu/ccids/publications/" },
+ ].map(({ label, href }) => (
+
+ {label}
+
+ ))}
+
+ Newsletter
+
+
+
+
+ {/* ── HERO / TITLE ── */}
+
+
+ Selected Publications
+
+
+ These are selected publications by the CCIDS members. Member names are in bold.
+
+
+
+ {/* ── PUBLICATIONS BODY ── */}
+
+ {/* 2025 */}
+
+
+
+ {pubs2025.map((p) => (
+
+ ))}
+
+
+
+ {/* 2024 */}
+
+
+
+ {pubs2024.map((p) => (
+
+ ))}
+
+
+
+ {/* 2023 */}
+
+
+
+ {pubs2023.map((p) => (
+
+ ))}
+
+
+
+
+ {/* ── FOOTER ── */}
+
+
+ );
+}
diff --git a/app/pub_page/src/app/components/figma/ImageWithFallback.tsx b/app/pub_page/src/app/components/figma/ImageWithFallback.tsx
new file mode 100644
index 0000000..0e26139
--- /dev/null
+++ b/app/pub_page/src/app/components/figma/ImageWithFallback.tsx
@@ -0,0 +1,27 @@
+import React, { useState } from 'react'
+
+const ERROR_IMG_SRC =
+ 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODgiIGhlaWdodD0iODgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBvcGFjaXR5PSIuMyIgZmlsbD0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIzLjciPjxyZWN0IHg9IjE2IiB5PSIxNiIgd2lkdGg9IjU2IiBoZWlnaHQ9IjU2IiByeD0iNiIvPjxwYXRoIGQ9Im0xNiA1OCAxNi0xOCAzMiAzMiIvPjxjaXJjbGUgY3g9IjUzIiBjeT0iMzUiIHI9IjciLz48L3N2Zz4KCg=='
+
+export function ImageWithFallback(props: React.ImgHTMLAttributes) {
+ const [didError, setDidError] = useState(false)
+
+ const handleError = () => {
+ setDidError(true)
+ }
+
+ const { src, alt, style, className, ...rest } = props
+
+ return didError ? (
+
+
+
+
+
+ ) : (
+
+ )
+}
diff --git a/app/pub_page/src/app/components/ui/accordion.tsx b/app/pub_page/src/app/components/ui/accordion.tsx
new file mode 100644
index 0000000..bd6b1e3
--- /dev/null
+++ b/app/pub_page/src/app/components/ui/accordion.tsx
@@ -0,0 +1,66 @@
+"use client";
+
+import * as React from "react";
+import * as AccordionPrimitive from "@radix-ui/react-accordion";
+import { ChevronDownIcon } from "lucide-react";
+
+import { cn } from "./utils";
+
+function Accordion({
+ ...props
+}: React.ComponentProps) {
+ return ;
+}
+
+function AccordionItem({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ );
+}
+
+function AccordionTrigger({
+ className,
+ children,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ svg]:rotate-180",
+ className,
+ )}
+ {...props}
+ >
+ {children}
+
+
+
+ );
+}
+
+function AccordionContent({
+ className,
+ children,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ {children}
+
+ );
+}
+
+export { Accordion, AccordionItem, AccordionTrigger, AccordionContent };
diff --git a/app/pub_page/src/app/components/ui/alert-dialog.tsx b/app/pub_page/src/app/components/ui/alert-dialog.tsx
new file mode 100644
index 0000000..875b8df
--- /dev/null
+++ b/app/pub_page/src/app/components/ui/alert-dialog.tsx
@@ -0,0 +1,157 @@
+"use client";
+
+import * as React from "react";
+import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog";
+
+import { cn } from "./utils";
+import { buttonVariants } from "./button";
+
+function AlertDialog({
+ ...props
+}: React.ComponentProps) {
+ return ;
+}
+
+function AlertDialogTrigger({
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ );
+}
+
+function AlertDialogPortal({
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ );
+}
+
+function AlertDialogOverlay({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ );
+}
+
+function AlertDialogContent({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+
+
+
+ );
+}
+
+function AlertDialogHeader({
+ className,
+ ...props
+}: React.ComponentProps<"div">) {
+ return (
+
+ );
+}
+
+function AlertDialogFooter({
+ className,
+ ...props
+}: React.ComponentProps<"div">) {
+ return (
+
+ );
+}
+
+function AlertDialogTitle({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ );
+}
+
+function AlertDialogDescription({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ );
+}
+
+function AlertDialogAction({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ );
+}
+
+function AlertDialogCancel({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ );
+}
+
+export {
+ AlertDialog,
+ AlertDialogPortal,
+ AlertDialogOverlay,
+ AlertDialogTrigger,
+ AlertDialogContent,
+ AlertDialogHeader,
+ AlertDialogFooter,
+ AlertDialogTitle,
+ AlertDialogDescription,
+ AlertDialogAction,
+ AlertDialogCancel,
+};
diff --git a/app/pub_page/src/app/components/ui/alert.tsx b/app/pub_page/src/app/components/ui/alert.tsx
new file mode 100644
index 0000000..9c35976
--- /dev/null
+++ b/app/pub_page/src/app/components/ui/alert.tsx
@@ -0,0 +1,66 @@
+import * as React from "react";
+import { cva, type VariantProps } from "class-variance-authority";
+
+import { cn } from "./utils";
+
+const alertVariants = cva(
+ "relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current",
+ {
+ variants: {
+ variant: {
+ default: "bg-card text-card-foreground",
+ destructive:
+ "text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90",
+ },
+ },
+ defaultVariants: {
+ variant: "default",
+ },
+ },
+);
+
+function Alert({
+ className,
+ variant,
+ ...props
+}: React.ComponentProps<"div"> & VariantProps) {
+ return (
+
+ );
+}
+
+function AlertTitle({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+
+ );
+}
+
+function AlertDescription({
+ className,
+ ...props
+}: React.ComponentProps<"div">) {
+ return (
+
+ );
+}
+
+export { Alert, AlertTitle, AlertDescription };
diff --git a/app/pub_page/src/app/components/ui/aspect-ratio.tsx b/app/pub_page/src/app/components/ui/aspect-ratio.tsx
new file mode 100644
index 0000000..c16d6bc
--- /dev/null
+++ b/app/pub_page/src/app/components/ui/aspect-ratio.tsx
@@ -0,0 +1,11 @@
+"use client";
+
+import * as AspectRatioPrimitive from "@radix-ui/react-aspect-ratio";
+
+function AspectRatio({
+ ...props
+}: React.ComponentProps) {
+ return ;
+}
+
+export { AspectRatio };
diff --git a/app/pub_page/src/app/components/ui/avatar.tsx b/app/pub_page/src/app/components/ui/avatar.tsx
new file mode 100644
index 0000000..c990451
--- /dev/null
+++ b/app/pub_page/src/app/components/ui/avatar.tsx
@@ -0,0 +1,53 @@
+"use client";
+
+import * as React from "react";
+import * as AvatarPrimitive from "@radix-ui/react-avatar";
+
+import { cn } from "./utils";
+
+function Avatar({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ );
+}
+
+function AvatarImage({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ );
+}
+
+function AvatarFallback({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ );
+}
+
+export { Avatar, AvatarImage, AvatarFallback };
diff --git a/app/pub_page/src/app/components/ui/badge.tsx b/app/pub_page/src/app/components/ui/badge.tsx
new file mode 100644
index 0000000..2ccc2c4
--- /dev/null
+++ b/app/pub_page/src/app/components/ui/badge.tsx
@@ -0,0 +1,46 @@
+import * as React from "react";
+import { Slot } from "@radix-ui/react-slot";
+import { cva, type VariantProps } from "class-variance-authority";
+
+import { cn } from "./utils";
+
+const badgeVariants = cva(
+ "inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden",
+ {
+ variants: {
+ variant: {
+ default:
+ "border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90",
+ secondary:
+ "border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90",
+ destructive:
+ "border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
+ outline:
+ "text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground",
+ },
+ },
+ defaultVariants: {
+ variant: "default",
+ },
+ },
+);
+
+function Badge({
+ className,
+ variant,
+ asChild = false,
+ ...props
+}: React.ComponentProps<"span"> &
+ VariantProps & { asChild?: boolean }) {
+ const Comp = asChild ? Slot : "span";
+
+ return (
+
+ );
+}
+
+export { Badge, badgeVariants };
diff --git a/app/pub_page/src/app/components/ui/breadcrumb.tsx b/app/pub_page/src/app/components/ui/breadcrumb.tsx
new file mode 100644
index 0000000..8f84d7e
--- /dev/null
+++ b/app/pub_page/src/app/components/ui/breadcrumb.tsx
@@ -0,0 +1,109 @@
+import * as React from "react";
+import { Slot } from "@radix-ui/react-slot";
+import { ChevronRight, MoreHorizontal } from "lucide-react";
+
+import { cn } from "./utils";
+
+function Breadcrumb({ ...props }: React.ComponentProps<"nav">) {
+ return ;
+}
+
+function BreadcrumbList({ className, ...props }: React.ComponentProps<"ol">) {
+ return (
+
+ );
+}
+
+function BreadcrumbItem({ className, ...props }: React.ComponentProps<"li">) {
+ return (
+
+ );
+}
+
+function BreadcrumbLink({
+ asChild,
+ className,
+ ...props
+}: React.ComponentProps<"a"> & {
+ asChild?: boolean;
+}) {
+ const Comp = asChild ? Slot : "a";
+
+ return (
+
+ );
+}
+
+function BreadcrumbPage({ className, ...props }: React.ComponentProps<"span">) {
+ return (
+
+ );
+}
+
+function BreadcrumbSeparator({
+ children,
+ className,
+ ...props
+}: React.ComponentProps<"li">) {
+ return (
+ svg]:size-3.5", className)}
+ {...props}
+ >
+ {children ?? }
+
+ );
+}
+
+function BreadcrumbEllipsis({
+ className,
+ ...props
+}: React.ComponentProps<"span">) {
+ return (
+
+
+ More
+
+ );
+}
+
+export {
+ Breadcrumb,
+ BreadcrumbList,
+ BreadcrumbItem,
+ BreadcrumbLink,
+ BreadcrumbPage,
+ BreadcrumbSeparator,
+ BreadcrumbEllipsis,
+};
diff --git a/app/pub_page/src/app/components/ui/button.tsx b/app/pub_page/src/app/components/ui/button.tsx
new file mode 100644
index 0000000..40ef7aa
--- /dev/null
+++ b/app/pub_page/src/app/components/ui/button.tsx
@@ -0,0 +1,58 @@
+import * as React from "react";
+import { Slot } from "@radix-ui/react-slot";
+import { cva, type VariantProps } from "class-variance-authority";
+
+import { cn } from "./utils";
+
+const buttonVariants = cva(
+ "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
+ {
+ variants: {
+ variant: {
+ default: "bg-primary text-primary-foreground hover:bg-primary/90",
+ destructive:
+ "bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
+ outline:
+ "border bg-background text-foreground hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
+ secondary:
+ "bg-secondary text-secondary-foreground hover:bg-secondary/80",
+ ghost:
+ "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
+ link: "text-primary underline-offset-4 hover:underline",
+ },
+ size: {
+ default: "h-9 px-4 py-2 has-[>svg]:px-3",
+ sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",
+ lg: "h-10 rounded-md px-6 has-[>svg]:px-4",
+ icon: "size-9 rounded-md",
+ },
+ },
+ defaultVariants: {
+ variant: "default",
+ size: "default",
+ },
+ },
+);
+
+function Button({
+ className,
+ variant,
+ size,
+ asChild = false,
+ ...props
+}: React.ComponentProps<"button"> &
+ VariantProps & {
+ asChild?: boolean;
+ }) {
+ const Comp = asChild ? Slot : "button";
+
+ return (
+
+ );
+}
+
+export { Button, buttonVariants };
diff --git a/app/pub_page/src/app/components/ui/calendar.tsx b/app/pub_page/src/app/components/ui/calendar.tsx
new file mode 100644
index 0000000..ee7b73f
--- /dev/null
+++ b/app/pub_page/src/app/components/ui/calendar.tsx
@@ -0,0 +1,75 @@
+"use client";
+
+import * as React from "react";
+import { ChevronLeft, ChevronRight } from "lucide-react";
+import { DayPicker } from "react-day-picker";
+
+import { cn } from "./utils";
+import { buttonVariants } from "./button";
+
+function Calendar({
+ className,
+ classNames,
+ showOutsideDays = true,
+ ...props
+}: React.ComponentProps) {
+ return (
+ .day-range-end)]:rounded-r-md [&:has(>.day-range-start)]:rounded-l-md first:[&:has([aria-selected])]:rounded-l-md last:[&:has([aria-selected])]:rounded-r-md"
+ : "[&:has([aria-selected])]:rounded-md",
+ ),
+ day: cn(
+ buttonVariants({ variant: "ghost" }),
+ "size-8 p-0 font-normal aria-selected:opacity-100",
+ ),
+ day_range_start:
+ "day-range-start aria-selected:bg-primary aria-selected:text-primary-foreground",
+ day_range_end:
+ "day-range-end aria-selected:bg-primary aria-selected:text-primary-foreground",
+ day_selected:
+ "bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground focus:bg-primary focus:text-primary-foreground",
+ day_today: "bg-accent text-accent-foreground",
+ day_outside:
+ "day-outside text-muted-foreground aria-selected:text-muted-foreground",
+ day_disabled: "text-muted-foreground opacity-50",
+ day_range_middle:
+ "aria-selected:bg-accent aria-selected:text-accent-foreground",
+ day_hidden: "invisible",
+ ...classNames,
+ }}
+ components={{
+ IconLeft: ({ className, ...props }) => (
+
+ ),
+ IconRight: ({ className, ...props }) => (
+
+ ),
+ }}
+ {...props}
+ />
+ );
+}
+
+export { Calendar };
diff --git a/app/pub_page/src/app/components/ui/card.tsx b/app/pub_page/src/app/components/ui/card.tsx
new file mode 100644
index 0000000..5f9d58a
--- /dev/null
+++ b/app/pub_page/src/app/components/ui/card.tsx
@@ -0,0 +1,92 @@
+import * as React from "react";
+
+import { cn } from "./utils";
+
+function Card({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+
+ );
+}
+
+function CardHeader({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+
+ );
+}
+
+function CardTitle({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+
+ );
+}
+
+function CardDescription({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+
+ );
+}
+
+function CardAction({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+
+ );
+}
+
+function CardContent({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+
+ );
+}
+
+function CardFooter({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+
+ );
+}
+
+export {
+ Card,
+ CardHeader,
+ CardFooter,
+ CardTitle,
+ CardAction,
+ CardDescription,
+ CardContent,
+};
diff --git a/app/pub_page/src/app/components/ui/carousel.tsx b/app/pub_page/src/app/components/ui/carousel.tsx
new file mode 100644
index 0000000..bb5ab13
--- /dev/null
+++ b/app/pub_page/src/app/components/ui/carousel.tsx
@@ -0,0 +1,241 @@
+"use client";
+
+import * as React from "react";
+import useEmblaCarousel, {
+ type UseEmblaCarouselType,
+} from "embla-carousel-react";
+import { ArrowLeft, ArrowRight } from "lucide-react";
+
+import { cn } from "./utils";
+import { Button } from "./button";
+
+type CarouselApi = UseEmblaCarouselType[1];
+type UseCarouselParameters = Parameters;
+type CarouselOptions = UseCarouselParameters[0];
+type CarouselPlugin = UseCarouselParameters[1];
+
+type CarouselProps = {
+ opts?: CarouselOptions;
+ plugins?: CarouselPlugin;
+ orientation?: "horizontal" | "vertical";
+ setApi?: (api: CarouselApi) => void;
+};
+
+type CarouselContextProps = {
+ carouselRef: ReturnType[0];
+ api: ReturnType[1];
+ scrollPrev: () => void;
+ scrollNext: () => void;
+ canScrollPrev: boolean;
+ canScrollNext: boolean;
+} & CarouselProps;
+
+const CarouselContext = React.createContext(null);
+
+function useCarousel() {
+ const context = React.useContext(CarouselContext);
+
+ if (!context) {
+ throw new Error("useCarousel must be used within a ");
+ }
+
+ return context;
+}
+
+function Carousel({
+ orientation = "horizontal",
+ opts,
+ setApi,
+ plugins,
+ className,
+ children,
+ ...props
+}: React.ComponentProps<"div"> & CarouselProps) {
+ const [carouselRef, api] = useEmblaCarousel(
+ {
+ ...opts,
+ axis: orientation === "horizontal" ? "x" : "y",
+ },
+ plugins,
+ );
+ const [canScrollPrev, setCanScrollPrev] = React.useState(false);
+ const [canScrollNext, setCanScrollNext] = React.useState(false);
+
+ const onSelect = React.useCallback((api: CarouselApi) => {
+ if (!api) return;
+ setCanScrollPrev(api.canScrollPrev());
+ setCanScrollNext(api.canScrollNext());
+ }, []);
+
+ const scrollPrev = React.useCallback(() => {
+ api?.scrollPrev();
+ }, [api]);
+
+ const scrollNext = React.useCallback(() => {
+ api?.scrollNext();
+ }, [api]);
+
+ const handleKeyDown = React.useCallback(
+ (event: React.KeyboardEvent) => {
+ if (event.key === "ArrowLeft") {
+ event.preventDefault();
+ scrollPrev();
+ } else if (event.key === "ArrowRight") {
+ event.preventDefault();
+ scrollNext();
+ }
+ },
+ [scrollPrev, scrollNext],
+ );
+
+ React.useEffect(() => {
+ if (!api || !setApi) return;
+ setApi(api);
+ }, [api, setApi]);
+
+ React.useEffect(() => {
+ if (!api) return;
+ onSelect(api);
+ api.on("reInit", onSelect);
+ api.on("select", onSelect);
+
+ return () => {
+ api?.off("select", onSelect);
+ };
+ }, [api, onSelect]);
+
+ return (
+
+
+ {children}
+
+
+ );
+}
+
+function CarouselContent({ className, ...props }: React.ComponentProps<"div">) {
+ const { carouselRef, orientation } = useCarousel();
+
+ return (
+
+ );
+}
+
+function CarouselItem({ className, ...props }: React.ComponentProps<"div">) {
+ const { orientation } = useCarousel();
+
+ return (
+
+ );
+}
+
+function CarouselPrevious({
+ className,
+ variant = "outline",
+ size = "icon",
+ ...props
+}: React.ComponentProps) {
+ const { orientation, scrollPrev, canScrollPrev } = useCarousel();
+
+ return (
+
+
+ Previous slide
+
+ );
+}
+
+function CarouselNext({
+ className,
+ variant = "outline",
+ size = "icon",
+ ...props
+}: React.ComponentProps) {
+ const { orientation, scrollNext, canScrollNext } = useCarousel();
+
+ return (
+
+
+ Next slide
+
+ );
+}
+
+export {
+ type CarouselApi,
+ Carousel,
+ CarouselContent,
+ CarouselItem,
+ CarouselPrevious,
+ CarouselNext,
+};
diff --git a/app/pub_page/src/app/components/ui/chart.tsx b/app/pub_page/src/app/components/ui/chart.tsx
new file mode 100644
index 0000000..b49bc36
--- /dev/null
+++ b/app/pub_page/src/app/components/ui/chart.tsx
@@ -0,0 +1,353 @@
+"use client";
+
+import * as React from "react";
+import * as RechartsPrimitive from "recharts";
+
+import { cn } from "./utils";
+
+// Format: { THEME_NAME: CSS_SELECTOR }
+const THEMES = { light: "", dark: ".dark" } as const;
+
+export type ChartConfig = {
+ [k in string]: {
+ label?: React.ReactNode;
+ icon?: React.ComponentType;
+ } & (
+ | { color?: string; theme?: never }
+ | { color?: never; theme: Record }
+ );
+};
+
+type ChartContextProps = {
+ config: ChartConfig;
+};
+
+const ChartContext = React.createContext(null);
+
+function useChart() {
+ const context = React.useContext(ChartContext);
+
+ if (!context) {
+ throw new Error("useChart must be used within a ");
+ }
+
+ return context;
+}
+
+function ChartContainer({
+ id,
+ className,
+ children,
+ config,
+ ...props
+}: React.ComponentProps<"div"> & {
+ config: ChartConfig;
+ children: React.ComponentProps<
+ typeof RechartsPrimitive.ResponsiveContainer
+ >["children"];
+}) {
+ const uniqueId = React.useId();
+ const chartId = `chart-${id || uniqueId.replace(/:/g, "")}`;
+
+ return (
+
+
+
+
+ {children}
+
+
+
+ );
+}
+
+const ChartStyle = ({ id, config }: { id: string; config: ChartConfig }) => {
+ const colorConfig = Object.entries(config).filter(
+ ([, config]) => config.theme || config.color,
+ );
+
+ if (!colorConfig.length) {
+ return null;
+ }
+
+ return (
+