From f5e217efcda866f3ffa5931e28f99b129eaa839d Mon Sep 17 00:00:00 2001 From: defiQUG Date: Fri, 13 Feb 2026 10:27:01 -0800 Subject: [PATCH] Initial monorepo: shared package and DBIS, ICCC, OMNL, XOM portals Co-authored-by: Cursor --- .eslintrc.cjs | 18 + .gitignore | 34 + .nvmrc | 1 + .prettierignore | 8 + .prettierrc.json | 9 + DBIS/.env.example | 8 + DBIS/.eslintrc.cjs | 5 + DBIS/README.md | 29 + DBIS/app/(auth)/login/page.tsx | 55 + DBIS/app/(auth)/logout/page.tsx | 20 + DBIS/app/(public)/about/page.tsx | 8 + DBIS/app/(public)/accreditation/page.tsx | 8 + DBIS/app/(public)/contact/page.tsx | 8 + DBIS/app/(public)/departments/page.tsx | 8 + DBIS/app/(public)/documents/page.tsx | 8 + DBIS/app/(public)/governance/page.tsx | 8 + DBIS/app/(public)/leadership/page.tsx | 8 + DBIS/app/(public)/membership/page.tsx | 8 + DBIS/app/(public)/news/page.tsx | 8 + DBIS/app/(public)/org-chart/page.tsx | 8 + DBIS/app/(public)/programs/page.tsx | 8 + DBIS/app/(public)/publications/page.tsx | 8 + DBIS/app/(public)/regions/page.tsx | 8 + DBIS/app/(public)/standards/page.tsx | 8 + DBIS/app/api/auth/mock-login/route.ts | 10 + DBIS/app/apply/page.tsx | 8 + DBIS/app/dashboard/layout.tsx | 17 + DBIS/app/dashboard/page.tsx | 8 + DBIS/app/dashboard/requests/page.tsx | 8 + DBIS/app/dashboard/submissions/page.tsx | 8 + .../departments/monetary-operations/page.tsx | 8 + DBIS/app/documents/bulletins/page.tsx | 8 + DBIS/app/globals.css | 3 + DBIS/app/layout.tsx | 34 + DBIS/app/membership/renewals/page.tsx | 8 + DBIS/app/page.tsx | 24 + DBIS/app/report/page.tsx | 8 + DBIS/app/request/page.tsx | 8 + DBIS/app/submit/page.tsx | 8 + DBIS/app/transparency/audit/page.tsx | 8 + .../app/transparency/data-protection/page.tsx | 8 + DBIS/app/transparency/ethics/page.tsx | 8 + DBIS/app/transparency/page.tsx | 8 + DBIS/app/transparency/sanctions/page.tsx | 8 + DBIS/app/transparency/whistleblower/page.tsx | 8 + DBIS/components/layout/Footer.tsx | 48 + DBIS/components/layout/Header.tsx | 58 + DBIS/components/layout/MobileNav.tsx | 57 + DBIS/components/layout/NavDropdown.tsx | 57 + DBIS/lib/auth.ts | 10 + DBIS/lib/nav-config.ts | 4 + DBIS/lib/rbac.ts | 66 + DBIS/middleware.ts | 39 + DBIS/next-env.d.ts | 5 + DBIS/next.config.js | 32 + DBIS/package.json | 32 + DBIS/postcss.config.js | 6 + DBIS/tailwind.config.ts | 15 + DBIS/tsconfig.json | 30 + ICCC/.env.example | 8 + ICCC/.eslintrc.cjs | 5 + ICCC/README.md | 29 + ICCC/app/(auth)/login/page.tsx | 55 + ICCC/app/(auth)/logout/page.tsx | 20 + ICCC/app/(public)/about/page.tsx | 8 + ICCC/app/(public)/accreditation/page.tsx | 8 + ICCC/app/(public)/contact/page.tsx | 8 + ICCC/app/(public)/departments/page.tsx | 8 + ICCC/app/(public)/documents/page.tsx | 8 + ICCC/app/(public)/governance/page.tsx | 8 + ICCC/app/(public)/leadership/page.tsx | 8 + ICCC/app/(public)/membership/page.tsx | 8 + ICCC/app/(public)/news/page.tsx | 8 + ICCC/app/(public)/org-chart/page.tsx | 8 + ICCC/app/(public)/programs/page.tsx | 8 + ICCC/app/(public)/publications/page.tsx | 8 + ICCC/app/(public)/regions/page.tsx | 8 + ICCC/app/(public)/standards/page.tsx | 8 + ICCC/app/api/auth/mock-login/route.ts | 10 + ICCC/app/apply/page.tsx | 8 + ICCC/app/case-law/page.tsx | 8 + ICCC/app/chambers/page.tsx | 8 + ICCC/app/dashboard/layout.tsx | 17 + ICCC/app/dashboard/page.tsx | 8 + ICCC/app/dashboard/requests/page.tsx | 8 + ICCC/app/dashboard/submissions/page.tsx | 8 + ICCC/app/globals.css | 3 + ICCC/app/judgments/page.tsx | 8 + ICCC/app/layout.tsx | 34 + ICCC/app/membership/renewals/page.tsx | 8 + ICCC/app/page.tsx | 24 + ICCC/app/registry/page.tsx | 8 + ICCC/app/report/page.tsx | 8 + ICCC/app/request/page.tsx | 8 + ICCC/app/submit/page.tsx | 8 + ICCC/app/transparency/audit/page.tsx | 8 + .../app/transparency/data-protection/page.tsx | 8 + ICCC/app/transparency/ethics/page.tsx | 8 + ICCC/app/transparency/page.tsx | 8 + ICCC/app/transparency/sanctions/page.tsx | 8 + ICCC/app/transparency/whistleblower/page.tsx | 8 + ICCC/components/layout/Footer.tsx | 48 + ICCC/components/layout/Header.tsx | 58 + ICCC/components/layout/MobileNav.tsx | 57 + ICCC/components/layout/NavDropdown.tsx | 57 + ICCC/lib/auth.ts | 10 + ICCC/lib/nav-config.ts | 4 + ICCC/lib/rbac.ts | 66 + ICCC/middleware.ts | 39 + ICCC/next-env.d.ts | 5 + ICCC/next.config.js | 32 + ICCC/package.json | 32 + ICCC/postcss.config.js | 6 + ICCC/tailwind.config.ts | 15 + ICCC/tsconfig.json | 30 + OMNL/.env.example | 8 + OMNL/.eslintrc.cjs | 5 + OMNL/README.md | 29 + OMNL/app/(auth)/login/page.tsx | 55 + OMNL/app/(auth)/logout/page.tsx | 20 + OMNL/app/(public)/about/page.tsx | 8 + OMNL/app/(public)/accreditation/page.tsx | 8 + OMNL/app/(public)/contact/page.tsx | 8 + OMNL/app/(public)/departments/page.tsx | 8 + OMNL/app/(public)/documents/page.tsx | 8 + OMNL/app/(public)/governance/page.tsx | 8 + OMNL/app/(public)/leadership/page.tsx | 8 + OMNL/app/(public)/membership/page.tsx | 8 + OMNL/app/(public)/news/page.tsx | 8 + OMNL/app/(public)/org-chart/page.tsx | 8 + OMNL/app/(public)/programs/page.tsx | 8 + OMNL/app/(public)/publications/page.tsx | 8 + OMNL/app/(public)/regions/page.tsx | 8 + OMNL/app/(public)/standards/page.tsx | 8 + OMNL/app/api/auth/mock-login/route.ts | 10 + OMNL/app/apply/page.tsx | 8 + OMNL/app/dashboard/layout.tsx | 17 + OMNL/app/dashboard/page.tsx | 8 + OMNL/app/dashboard/requests/page.tsx | 8 + OMNL/app/dashboard/submissions/page.tsx | 8 + .../app/departments/cyber-resilience/page.tsx | 8 + OMNL/app/documents/standards/page.tsx | 8 + OMNL/app/globals.css | 3 + OMNL/app/layout.tsx | 34 + OMNL/app/membership/renewals/page.tsx | 8 + OMNL/app/page.tsx | 24 + OMNL/app/report/page.tsx | 8 + OMNL/app/request/page.tsx | 8 + OMNL/app/submit/page.tsx | 8 + OMNL/app/transparency/audit/page.tsx | 8 + .../app/transparency/data-protection/page.tsx | 8 + OMNL/app/transparency/ethics/page.tsx | 8 + OMNL/app/transparency/page.tsx | 8 + OMNL/app/transparency/sanctions/page.tsx | 8 + OMNL/app/transparency/whistleblower/page.tsx | 8 + OMNL/components/layout/Footer.tsx | 48 + OMNL/components/layout/Header.tsx | 58 + OMNL/components/layout/MobileNav.tsx | 57 + OMNL/components/layout/NavDropdown.tsx | 57 + OMNL/lib/auth.ts | 10 + OMNL/lib/nav-config.ts | 4 + OMNL/lib/rbac.ts | 66 + OMNL/middleware.ts | 39 + OMNL/next-env.d.ts | 5 + OMNL/next.config.js | 32 + OMNL/package.json | 32 + OMNL/postcss.config.js | 6 + OMNL/tailwind.config.ts | 15 + OMNL/tsconfig.json | 30 + ORG_STRUCTURE.md | 150 + PORTAL_CHECKLIST.md | 45 + PORTAL_NAVIGATION.md | 116 + README.md | 102 + TECH_POLICIES.md | 126 + TECH_STACK.md | 104 + XOM/.env.example | 8 + XOM/.eslintrc.cjs | 5 + XOM/README.md | 29 + XOM/app/(auth)/login/page.tsx | 55 + XOM/app/(auth)/logout/page.tsx | 20 + XOM/app/(public)/about/page.tsx | 8 + XOM/app/(public)/accreditation/page.tsx | 8 + XOM/app/(public)/contact/page.tsx | 8 + XOM/app/(public)/departments/page.tsx | 8 + XOM/app/(public)/documents/page.tsx | 8 + XOM/app/(public)/governance/page.tsx | 8 + XOM/app/(public)/leadership/page.tsx | 8 + XOM/app/(public)/membership/page.tsx | 8 + XOM/app/(public)/news/page.tsx | 8 + XOM/app/(public)/org-chart/page.tsx | 8 + XOM/app/(public)/programs/page.tsx | 8 + XOM/app/(public)/publications/page.tsx | 8 + XOM/app/(public)/regions/page.tsx | 8 + XOM/app/(public)/standards/page.tsx | 8 + XOM/app/api/auth/mock-login/route.ts | 10 + XOM/app/apply/page.tsx | 8 + XOM/app/dashboard/layout.tsx | 17 + XOM/app/dashboard/page.tsx | 8 + XOM/app/dashboard/requests/page.tsx | 8 + XOM/app/dashboard/submissions/page.tsx | 8 + .../departments/hospitaller-services/page.tsx | 8 + XOM/app/donors/page.tsx | 8 + XOM/app/get-involved/page.tsx | 8 + XOM/app/globals.css | 3 + XOM/app/layout.tsx | 34 + XOM/app/membership/renewals/page.tsx | 8 + XOM/app/page.tsx | 24 + XOM/app/report/page.tsx | 8 + XOM/app/request/page.tsx | 8 + XOM/app/submit/page.tsx | 8 + XOM/app/transparency/audit/page.tsx | 8 + XOM/app/transparency/data-protection/page.tsx | 8 + XOM/app/transparency/ethics/page.tsx | 8 + XOM/app/transparency/page.tsx | 8 + XOM/app/transparency/sanctions/page.tsx | 8 + XOM/app/transparency/whistleblower/page.tsx | 8 + XOM/components/layout/Footer.tsx | 48 + XOM/components/layout/Header.tsx | 58 + XOM/components/layout/MobileNav.tsx | 57 + XOM/components/layout/NavDropdown.tsx | 57 + XOM/lib/auth.ts | 10 + XOM/lib/nav-config.ts | 4 + XOM/lib/rbac.ts | 66 + XOM/middleware.ts | 39 + XOM/next-env.d.ts | 5 + XOM/next.config.js | 32 + XOM/package.json | 32 + XOM/postcss.config.js | 6 + XOM/tailwind.config.ts | 15 + XOM/tsconfig.json | 30 + package.json | 19 + packages/shared/package.json | 22 + packages/shared/src/design-tokens.ts | 54 + packages/shared/src/index.ts | 8 + packages/shared/src/nav.ts | 133 + packages/shared/src/types.ts | 28 + packages/shared/tsconfig.json | 8 + pnpm-lock.yaml | 3510 +++++++++++++++++ pnpm-workspace.yaml | 6 + tsconfig.base.json | 20 + 240 files changed, 8161 insertions(+) create mode 100644 .eslintrc.cjs create mode 100644 .gitignore create mode 100644 .nvmrc create mode 100644 .prettierignore create mode 100644 .prettierrc.json create mode 100644 DBIS/.env.example create mode 100644 DBIS/.eslintrc.cjs create mode 100644 DBIS/README.md create mode 100644 DBIS/app/(auth)/login/page.tsx create mode 100644 DBIS/app/(auth)/logout/page.tsx create mode 100644 DBIS/app/(public)/about/page.tsx create mode 100644 DBIS/app/(public)/accreditation/page.tsx create mode 100644 DBIS/app/(public)/contact/page.tsx create mode 100644 DBIS/app/(public)/departments/page.tsx create mode 100644 DBIS/app/(public)/documents/page.tsx create mode 100644 DBIS/app/(public)/governance/page.tsx create mode 100644 DBIS/app/(public)/leadership/page.tsx create mode 100644 DBIS/app/(public)/membership/page.tsx create mode 100644 DBIS/app/(public)/news/page.tsx create mode 100644 DBIS/app/(public)/org-chart/page.tsx create mode 100644 DBIS/app/(public)/programs/page.tsx create mode 100644 DBIS/app/(public)/publications/page.tsx create mode 100644 DBIS/app/(public)/regions/page.tsx create mode 100644 DBIS/app/(public)/standards/page.tsx create mode 100644 DBIS/app/api/auth/mock-login/route.ts create mode 100644 DBIS/app/apply/page.tsx create mode 100644 DBIS/app/dashboard/layout.tsx create mode 100644 DBIS/app/dashboard/page.tsx create mode 100644 DBIS/app/dashboard/requests/page.tsx create mode 100644 DBIS/app/dashboard/submissions/page.tsx create mode 100644 DBIS/app/departments/monetary-operations/page.tsx create mode 100644 DBIS/app/documents/bulletins/page.tsx create mode 100644 DBIS/app/globals.css create mode 100644 DBIS/app/layout.tsx create mode 100644 DBIS/app/membership/renewals/page.tsx create mode 100644 DBIS/app/page.tsx create mode 100644 DBIS/app/report/page.tsx create mode 100644 DBIS/app/request/page.tsx create mode 100644 DBIS/app/submit/page.tsx create mode 100644 DBIS/app/transparency/audit/page.tsx create mode 100644 DBIS/app/transparency/data-protection/page.tsx create mode 100644 DBIS/app/transparency/ethics/page.tsx create mode 100644 DBIS/app/transparency/page.tsx create mode 100644 DBIS/app/transparency/sanctions/page.tsx create mode 100644 DBIS/app/transparency/whistleblower/page.tsx create mode 100644 DBIS/components/layout/Footer.tsx create mode 100644 DBIS/components/layout/Header.tsx create mode 100644 DBIS/components/layout/MobileNav.tsx create mode 100644 DBIS/components/layout/NavDropdown.tsx create mode 100644 DBIS/lib/auth.ts create mode 100644 DBIS/lib/nav-config.ts create mode 100644 DBIS/lib/rbac.ts create mode 100644 DBIS/middleware.ts create mode 100644 DBIS/next-env.d.ts create mode 100644 DBIS/next.config.js create mode 100644 DBIS/package.json create mode 100644 DBIS/postcss.config.js create mode 100644 DBIS/tailwind.config.ts create mode 100644 DBIS/tsconfig.json create mode 100644 ICCC/.env.example create mode 100644 ICCC/.eslintrc.cjs create mode 100644 ICCC/README.md create mode 100644 ICCC/app/(auth)/login/page.tsx create mode 100644 ICCC/app/(auth)/logout/page.tsx create mode 100644 ICCC/app/(public)/about/page.tsx create mode 100644 ICCC/app/(public)/accreditation/page.tsx create mode 100644 ICCC/app/(public)/contact/page.tsx create mode 100644 ICCC/app/(public)/departments/page.tsx create mode 100644 ICCC/app/(public)/documents/page.tsx create mode 100644 ICCC/app/(public)/governance/page.tsx create mode 100644 ICCC/app/(public)/leadership/page.tsx create mode 100644 ICCC/app/(public)/membership/page.tsx create mode 100644 ICCC/app/(public)/news/page.tsx create mode 100644 ICCC/app/(public)/org-chart/page.tsx create mode 100644 ICCC/app/(public)/programs/page.tsx create mode 100644 ICCC/app/(public)/publications/page.tsx create mode 100644 ICCC/app/(public)/regions/page.tsx create mode 100644 ICCC/app/(public)/standards/page.tsx create mode 100644 ICCC/app/api/auth/mock-login/route.ts create mode 100644 ICCC/app/apply/page.tsx create mode 100644 ICCC/app/case-law/page.tsx create mode 100644 ICCC/app/chambers/page.tsx create mode 100644 ICCC/app/dashboard/layout.tsx create mode 100644 ICCC/app/dashboard/page.tsx create mode 100644 ICCC/app/dashboard/requests/page.tsx create mode 100644 ICCC/app/dashboard/submissions/page.tsx create mode 100644 ICCC/app/globals.css create mode 100644 ICCC/app/judgments/page.tsx create mode 100644 ICCC/app/layout.tsx create mode 100644 ICCC/app/membership/renewals/page.tsx create mode 100644 ICCC/app/page.tsx create mode 100644 ICCC/app/registry/page.tsx create mode 100644 ICCC/app/report/page.tsx create mode 100644 ICCC/app/request/page.tsx create mode 100644 ICCC/app/submit/page.tsx create mode 100644 ICCC/app/transparency/audit/page.tsx create mode 100644 ICCC/app/transparency/data-protection/page.tsx create mode 100644 ICCC/app/transparency/ethics/page.tsx create mode 100644 ICCC/app/transparency/page.tsx create mode 100644 ICCC/app/transparency/sanctions/page.tsx create mode 100644 ICCC/app/transparency/whistleblower/page.tsx create mode 100644 ICCC/components/layout/Footer.tsx create mode 100644 ICCC/components/layout/Header.tsx create mode 100644 ICCC/components/layout/MobileNav.tsx create mode 100644 ICCC/components/layout/NavDropdown.tsx create mode 100644 ICCC/lib/auth.ts create mode 100644 ICCC/lib/nav-config.ts create mode 100644 ICCC/lib/rbac.ts create mode 100644 ICCC/middleware.ts create mode 100644 ICCC/next-env.d.ts create mode 100644 ICCC/next.config.js create mode 100644 ICCC/package.json create mode 100644 ICCC/postcss.config.js create mode 100644 ICCC/tailwind.config.ts create mode 100644 ICCC/tsconfig.json create mode 100644 OMNL/.env.example create mode 100644 OMNL/.eslintrc.cjs create mode 100644 OMNL/README.md create mode 100644 OMNL/app/(auth)/login/page.tsx create mode 100644 OMNL/app/(auth)/logout/page.tsx create mode 100644 OMNL/app/(public)/about/page.tsx create mode 100644 OMNL/app/(public)/accreditation/page.tsx create mode 100644 OMNL/app/(public)/contact/page.tsx create mode 100644 OMNL/app/(public)/departments/page.tsx create mode 100644 OMNL/app/(public)/documents/page.tsx create mode 100644 OMNL/app/(public)/governance/page.tsx create mode 100644 OMNL/app/(public)/leadership/page.tsx create mode 100644 OMNL/app/(public)/membership/page.tsx create mode 100644 OMNL/app/(public)/news/page.tsx create mode 100644 OMNL/app/(public)/org-chart/page.tsx create mode 100644 OMNL/app/(public)/programs/page.tsx create mode 100644 OMNL/app/(public)/publications/page.tsx create mode 100644 OMNL/app/(public)/regions/page.tsx create mode 100644 OMNL/app/(public)/standards/page.tsx create mode 100644 OMNL/app/api/auth/mock-login/route.ts create mode 100644 OMNL/app/apply/page.tsx create mode 100644 OMNL/app/dashboard/layout.tsx create mode 100644 OMNL/app/dashboard/page.tsx create mode 100644 OMNL/app/dashboard/requests/page.tsx create mode 100644 OMNL/app/dashboard/submissions/page.tsx create mode 100644 OMNL/app/departments/cyber-resilience/page.tsx create mode 100644 OMNL/app/documents/standards/page.tsx create mode 100644 OMNL/app/globals.css create mode 100644 OMNL/app/layout.tsx create mode 100644 OMNL/app/membership/renewals/page.tsx create mode 100644 OMNL/app/page.tsx create mode 100644 OMNL/app/report/page.tsx create mode 100644 OMNL/app/request/page.tsx create mode 100644 OMNL/app/submit/page.tsx create mode 100644 OMNL/app/transparency/audit/page.tsx create mode 100644 OMNL/app/transparency/data-protection/page.tsx create mode 100644 OMNL/app/transparency/ethics/page.tsx create mode 100644 OMNL/app/transparency/page.tsx create mode 100644 OMNL/app/transparency/sanctions/page.tsx create mode 100644 OMNL/app/transparency/whistleblower/page.tsx create mode 100644 OMNL/components/layout/Footer.tsx create mode 100644 OMNL/components/layout/Header.tsx create mode 100644 OMNL/components/layout/MobileNav.tsx create mode 100644 OMNL/components/layout/NavDropdown.tsx create mode 100644 OMNL/lib/auth.ts create mode 100644 OMNL/lib/nav-config.ts create mode 100644 OMNL/lib/rbac.ts create mode 100644 OMNL/middleware.ts create mode 100644 OMNL/next-env.d.ts create mode 100644 OMNL/next.config.js create mode 100644 OMNL/package.json create mode 100644 OMNL/postcss.config.js create mode 100644 OMNL/tailwind.config.ts create mode 100644 OMNL/tsconfig.json create mode 100644 ORG_STRUCTURE.md create mode 100644 PORTAL_CHECKLIST.md create mode 100644 PORTAL_NAVIGATION.md create mode 100644 TECH_POLICIES.md create mode 100644 TECH_STACK.md create mode 100644 XOM/.env.example create mode 100644 XOM/.eslintrc.cjs create mode 100644 XOM/README.md create mode 100644 XOM/app/(auth)/login/page.tsx create mode 100644 XOM/app/(auth)/logout/page.tsx create mode 100644 XOM/app/(public)/about/page.tsx create mode 100644 XOM/app/(public)/accreditation/page.tsx create mode 100644 XOM/app/(public)/contact/page.tsx create mode 100644 XOM/app/(public)/departments/page.tsx create mode 100644 XOM/app/(public)/documents/page.tsx create mode 100644 XOM/app/(public)/governance/page.tsx create mode 100644 XOM/app/(public)/leadership/page.tsx create mode 100644 XOM/app/(public)/membership/page.tsx create mode 100644 XOM/app/(public)/news/page.tsx create mode 100644 XOM/app/(public)/org-chart/page.tsx create mode 100644 XOM/app/(public)/programs/page.tsx create mode 100644 XOM/app/(public)/publications/page.tsx create mode 100644 XOM/app/(public)/regions/page.tsx create mode 100644 XOM/app/(public)/standards/page.tsx create mode 100644 XOM/app/api/auth/mock-login/route.ts create mode 100644 XOM/app/apply/page.tsx create mode 100644 XOM/app/dashboard/layout.tsx create mode 100644 XOM/app/dashboard/page.tsx create mode 100644 XOM/app/dashboard/requests/page.tsx create mode 100644 XOM/app/dashboard/submissions/page.tsx create mode 100644 XOM/app/departments/hospitaller-services/page.tsx create mode 100644 XOM/app/donors/page.tsx create mode 100644 XOM/app/get-involved/page.tsx create mode 100644 XOM/app/globals.css create mode 100644 XOM/app/layout.tsx create mode 100644 XOM/app/membership/renewals/page.tsx create mode 100644 XOM/app/page.tsx create mode 100644 XOM/app/report/page.tsx create mode 100644 XOM/app/request/page.tsx create mode 100644 XOM/app/submit/page.tsx create mode 100644 XOM/app/transparency/audit/page.tsx create mode 100644 XOM/app/transparency/data-protection/page.tsx create mode 100644 XOM/app/transparency/ethics/page.tsx create mode 100644 XOM/app/transparency/page.tsx create mode 100644 XOM/app/transparency/sanctions/page.tsx create mode 100644 XOM/app/transparency/whistleblower/page.tsx create mode 100644 XOM/components/layout/Footer.tsx create mode 100644 XOM/components/layout/Header.tsx create mode 100644 XOM/components/layout/MobileNav.tsx create mode 100644 XOM/components/layout/NavDropdown.tsx create mode 100644 XOM/lib/auth.ts create mode 100644 XOM/lib/nav-config.ts create mode 100644 XOM/lib/rbac.ts create mode 100644 XOM/middleware.ts create mode 100644 XOM/next-env.d.ts create mode 100644 XOM/next.config.js create mode 100644 XOM/package.json create mode 100644 XOM/postcss.config.js create mode 100644 XOM/tailwind.config.ts create mode 100644 XOM/tsconfig.json create mode 100644 package.json create mode 100644 packages/shared/package.json create mode 100644 packages/shared/src/design-tokens.ts create mode 100644 packages/shared/src/index.ts create mode 100644 packages/shared/src/nav.ts create mode 100644 packages/shared/src/types.ts create mode 100644 packages/shared/tsconfig.json create mode 100644 pnpm-lock.yaml create mode 100644 pnpm-workspace.yaml create mode 100644 tsconfig.base.json diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 0000000..0d41776 --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,18 @@ +/** @type { import("eslint").Linter.Config } */ +module.exports = { + root: true, + env: { node: true, es2022: true }, + extends: ["eslint:recommended", "prettier"], + ignorePatterns: [ + "node_modules", + ".next", + "dist", + "build", + "coverage", + "*.config.js", + "*.config.cjs", + "*.config.mjs", + "*.config.ts", + ], +}; + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..adfc278 --- /dev/null +++ b/.gitignore @@ -0,0 +1,34 @@ +# Dependencies +node_modules/ +.pnpm-store/ + +# Build outputs +.next/ +out/ +dist/ +build/ +*.tsbuildinfo + +# Environment +.env +.env.local +.env.*.local + +# IDE / OS +.idea/ +.vscode/ +*.swp +.DS_Store +Thumbs.db + +# Debug / logs +npm-debug.log* +pnpm-debug.log* +*.log + +# Testing +coverage/ +.nyc_output/ + +# Misc +*.pem diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..209e3ef --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +20 diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..8683e95 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,8 @@ +node_modules +.next +dist +build +coverage +*.min.js +pnpm-lock.yaml +package-lock.json diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..3d03824 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,9 @@ +{ + "semi": true, + "singleQuote": false, + "tabWidth": 2, + "trailingComma": "es5", + "printWidth": 100, + "bracketSameLine": false, + "endOfLine": "lf" +} diff --git a/DBIS/.env.example b/DBIS/.env.example new file mode 100644 index 0000000..8e389e0 --- /dev/null +++ b/DBIS/.env.example @@ -0,0 +1,8 @@ +# Next.js +NEXTAUTH_URL=http://localhost:3000 + +# OIDC / OAuth 2.0 (placeholder until identity provider is configured) +# OIDC_ISSUER= +# OIDC_CLIENT_ID= +# OIDC_CLIENT_SECRET= +# OIDC_REDIRECT_URI= diff --git a/DBIS/.eslintrc.cjs b/DBIS/.eslintrc.cjs new file mode 100644 index 0000000..53dff50 --- /dev/null +++ b/DBIS/.eslintrc.cjs @@ -0,0 +1,5 @@ +/** @type { import("eslint").Linter.Config } */ +module.exports = { + root: true, + extends: ["../.eslintrc.cjs", "next/core-web-vitals"], +}; diff --git a/DBIS/README.md b/DBIS/README.md new file mode 100644 index 0000000..2d6b6d2 --- /dev/null +++ b/DBIS/README.md @@ -0,0 +1,29 @@ +# DBIS Portal + +Portal for the **Digital Bank of International Settlements**. + +**Gitea repository:** https://gitea.d-bis.org/Gov_Web_Portals/DBIS.git Next-generation web application following the shared tech stack and policies. + +## Run locally + +```bash +pnpm install +pnpm dev +``` + +Open [http://localhost:3000](http://localhost:3000). + +## Environment + +Copy `.env.example` to `.env.local` and set values. No secrets in repo. + +## Standards + +- [TECH_STACK.md](../TECH_STACK.md) +- [TECH_POLICIES.md](../TECH_POLICIES.md) +- [PORTAL_NAVIGATION.md](../PORTAL_NAVIGATION.md) +- [ORG_STRUCTURE.md](../ORG_STRUCTURE.md) + +## Structure + +Same app structure as other portals: public routes, transparency, workflow (submit/apply/report/request), dashboard, auth. Entity-specific routes: Financial Bulletins, Monetary Operations. diff --git a/DBIS/app/(auth)/login/page.tsx b/DBIS/app/(auth)/login/page.tsx new file mode 100644 index 0000000..48101a9 --- /dev/null +++ b/DBIS/app/(auth)/login/page.tsx @@ -0,0 +1,55 @@ +"use client"; + +import { Suspense } from "react"; +import { useSearchParams } from "next/navigation"; +import Link from "next/link"; + +function LoginForm() { + const searchParams = useSearchParams(); + const returnUrl = searchParams.get("returnUrl") ?? "/dashboard"; + + return ( +
+

Sign in

+

+ Placeholder login. Replace with OIDC/OAuth 2.0 when identity provider is configured. +

+
+ +
+ + +
+ +
+

+ + Return to previous page + +

+
+ ); +} + +export default function LoginPage() { + return ( + Loading...}> + + + ); +} diff --git a/DBIS/app/(auth)/logout/page.tsx b/DBIS/app/(auth)/logout/page.tsx new file mode 100644 index 0000000..fd763a6 --- /dev/null +++ b/DBIS/app/(auth)/logout/page.tsx @@ -0,0 +1,20 @@ +"use client"; + +import { useEffect } from "react"; +import Link from "next/link"; + +export default function LogoutPage() { + useEffect(() => { + document.cookie = "portal-role=; path=/; max-age=0"; + }, []); + + return ( +
+

Signed out

+

You have been signed out.

+ + Return to home + +
+ ); +} diff --git a/DBIS/app/(public)/about/page.tsx b/DBIS/app/(public)/about/page.tsx new file mode 100644 index 0000000..0b87c58 --- /dev/null +++ b/DBIS/app/(public)/about/page.tsx @@ -0,0 +1,8 @@ +export default function AboutPage() { + return ( +
+

Mandate

+

About the Digital Bank of International Settlements.

+
+ ); +} diff --git a/DBIS/app/(public)/accreditation/page.tsx b/DBIS/app/(public)/accreditation/page.tsx new file mode 100644 index 0000000..c5e95d2 --- /dev/null +++ b/DBIS/app/(public)/accreditation/page.tsx @@ -0,0 +1,8 @@ +export default function AccreditationPage() { + return ( +
+

Accreditation

+

Accreditation and credentials.

+
+ ); +} diff --git a/DBIS/app/(public)/contact/page.tsx b/DBIS/app/(public)/contact/page.tsx new file mode 100644 index 0000000..7bb6a85 --- /dev/null +++ b/DBIS/app/(public)/contact/page.tsx @@ -0,0 +1,8 @@ +export default function ContactPage() { + return ( +
+

Contact

+

General contact and enquiries.

+
+ ); +} diff --git a/DBIS/app/(public)/departments/page.tsx b/DBIS/app/(public)/departments/page.tsx new file mode 100644 index 0000000..ed01731 --- /dev/null +++ b/DBIS/app/(public)/departments/page.tsx @@ -0,0 +1,8 @@ +export default function DepartmentsPage() { + return ( +
+

Departments

+

Mission departments and programs.

+
+ ); +} diff --git a/DBIS/app/(public)/documents/page.tsx b/DBIS/app/(public)/documents/page.tsx new file mode 100644 index 0000000..c641e1d --- /dev/null +++ b/DBIS/app/(public)/documents/page.tsx @@ -0,0 +1,8 @@ +export default function DocumentsPage() { + return ( +
+

Documents

+

Library, standards, and directives.

+
+ ); +} diff --git a/DBIS/app/(public)/governance/page.tsx b/DBIS/app/(public)/governance/page.tsx new file mode 100644 index 0000000..8cf0212 --- /dev/null +++ b/DBIS/app/(public)/governance/page.tsx @@ -0,0 +1,8 @@ +export default function GovernancePage() { + return ( +
+

Governance

+

Charters, instruments, and governance.

+
+ ); +} diff --git a/DBIS/app/(public)/leadership/page.tsx b/DBIS/app/(public)/leadership/page.tsx new file mode 100644 index 0000000..ff1f679 --- /dev/null +++ b/DBIS/app/(public)/leadership/page.tsx @@ -0,0 +1,8 @@ +export default function LeadershipPage() { + return ( +
+

Leadership

+

Executive leadership and secretariat.

+
+ ); +} diff --git a/DBIS/app/(public)/membership/page.tsx b/DBIS/app/(public)/membership/page.tsx new file mode 100644 index 0000000..cf191d0 --- /dev/null +++ b/DBIS/app/(public)/membership/page.tsx @@ -0,0 +1,8 @@ +export default function MembershipPage() { + return ( +
+

Membership

+

Member directory and accreditation.

+
+ ); +} diff --git a/DBIS/app/(public)/news/page.tsx b/DBIS/app/(public)/news/page.tsx new file mode 100644 index 0000000..57d0061 --- /dev/null +++ b/DBIS/app/(public)/news/page.tsx @@ -0,0 +1,8 @@ +export default function NewsPage() { + return ( +
+

News

+

News and announcements.

+
+ ); +} diff --git a/DBIS/app/(public)/org-chart/page.tsx b/DBIS/app/(public)/org-chart/page.tsx new file mode 100644 index 0000000..e01d431 --- /dev/null +++ b/DBIS/app/(public)/org-chart/page.tsx @@ -0,0 +1,8 @@ +export default function OrgChartPage() { + return ( +
+

Org Chart

+

Organizational structure.

+
+ ); +} diff --git a/DBIS/app/(public)/programs/page.tsx b/DBIS/app/(public)/programs/page.tsx new file mode 100644 index 0000000..57d0bb0 --- /dev/null +++ b/DBIS/app/(public)/programs/page.tsx @@ -0,0 +1,8 @@ +export default function ProgramsPage() { + return ( +
+

Programs

+

Programs and initiatives.

+
+ ); +} diff --git a/DBIS/app/(public)/publications/page.tsx b/DBIS/app/(public)/publications/page.tsx new file mode 100644 index 0000000..6b329f6 --- /dev/null +++ b/DBIS/app/(public)/publications/page.tsx @@ -0,0 +1,8 @@ +export default function PublicationsPage() { + return ( +
+

Publications

+

Publications and reports.

+
+ ); +} diff --git a/DBIS/app/(public)/regions/page.tsx b/DBIS/app/(public)/regions/page.tsx new file mode 100644 index 0000000..66978cc --- /dev/null +++ b/DBIS/app/(public)/regions/page.tsx @@ -0,0 +1,8 @@ +export default function RegionsPage() { + return ( +
+

Regional Offices

+

Americas, EMEA, APAC delegations and field missions.

+
+ ); +} diff --git a/DBIS/app/(public)/standards/page.tsx b/DBIS/app/(public)/standards/page.tsx new file mode 100644 index 0000000..9327ef0 --- /dev/null +++ b/DBIS/app/(public)/standards/page.tsx @@ -0,0 +1,8 @@ +export default function StandardsPage() { + return ( +
+

Standards

+

Standards and codes.

+
+ ); +} diff --git a/DBIS/app/api/auth/mock-login/route.ts b/DBIS/app/api/auth/mock-login/route.ts new file mode 100644 index 0000000..57f672f --- /dev/null +++ b/DBIS/app/api/auth/mock-login/route.ts @@ -0,0 +1,10 @@ +import { NextRequest, NextResponse } from "next/server"; + +export async function POST(request: NextRequest) { + const form = await request.formData(); + const returnUrl = (form.get("returnUrl") as string) ?? "/dashboard"; + const role = (form.get("role") as string) ?? "member"; + const res = NextResponse.redirect(new URL(returnUrl, request.url)); + res.cookies.set("portal-role", role, { path: "/", httpOnly: true, maxAge: 60 * 60 * 24 }); + return res; +} diff --git a/DBIS/app/apply/page.tsx b/DBIS/app/apply/page.tsx new file mode 100644 index 0000000..7ee15cb --- /dev/null +++ b/DBIS/app/apply/page.tsx @@ -0,0 +1,8 @@ +export default function ApplyPage() { + return ( +
+

Apply

+

Apply for membership or accreditation.

+
+ ); +} diff --git a/DBIS/app/dashboard/layout.tsx b/DBIS/app/dashboard/layout.tsx new file mode 100644 index 0000000..680435b --- /dev/null +++ b/DBIS/app/dashboard/layout.tsx @@ -0,0 +1,17 @@ +import Link from "next/link"; +import type { ReactNode } from "react"; + +export default function DashboardLayout({ children }: { children: ReactNode }) { + return ( +
+ +
{children}
+
+ ); +} diff --git a/DBIS/app/dashboard/page.tsx b/DBIS/app/dashboard/page.tsx new file mode 100644 index 0000000..199cd04 --- /dev/null +++ b/DBIS/app/dashboard/page.tsx @@ -0,0 +1,8 @@ +export default function DashboardPage() { + return ( +
+

Dashboard

+

Role-based dashboard.

+
+ ); +} diff --git a/DBIS/app/dashboard/requests/page.tsx b/DBIS/app/dashboard/requests/page.tsx new file mode 100644 index 0000000..eb94812 --- /dev/null +++ b/DBIS/app/dashboard/requests/page.tsx @@ -0,0 +1,8 @@ +export default function RequestsPage() { + return ( +
+

My requests

+

Track your requests.

+
+ ); +} diff --git a/DBIS/app/dashboard/submissions/page.tsx b/DBIS/app/dashboard/submissions/page.tsx new file mode 100644 index 0000000..dc57c54 --- /dev/null +++ b/DBIS/app/dashboard/submissions/page.tsx @@ -0,0 +1,8 @@ +export default function SubmissionsPage() { + return ( +
+

My submissions

+

Track your submissions and status.

+
+ ); +} diff --git a/DBIS/app/departments/monetary-operations/page.tsx b/DBIS/app/departments/monetary-operations/page.tsx new file mode 100644 index 0000000..b92072a --- /dev/null +++ b/DBIS/app/departments/monetary-operations/page.tsx @@ -0,0 +1,8 @@ +export default function MonetaryOperationsPage() { + return ( +
+

Monetary Operations

+

Digital reserves and monetary operations.

+
+ ); +} diff --git a/DBIS/app/documents/bulletins/page.tsx b/DBIS/app/documents/bulletins/page.tsx new file mode 100644 index 0000000..ce3a40d --- /dev/null +++ b/DBIS/app/documents/bulletins/page.tsx @@ -0,0 +1,8 @@ +export default function BulletinsPage() { + return ( +
+

Financial Bulletins

+

DBIS financial bulletins and reports.

+
+ ); +} diff --git a/DBIS/app/globals.css b/DBIS/app/globals.css new file mode 100644 index 0000000..b5c61c9 --- /dev/null +++ b/DBIS/app/globals.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/DBIS/app/layout.tsx b/DBIS/app/layout.tsx new file mode 100644 index 0000000..b847156 --- /dev/null +++ b/DBIS/app/layout.tsx @@ -0,0 +1,34 @@ +import type { Metadata } from "next"; +import type { ReactNode } from "react"; +import "./globals.css"; +import { Header } from "@/components/layout/Header"; +import { Footer } from "@/components/layout/Footer"; + +export const metadata: Metadata = { + title: "Digital Bank of International Settlements", + description: "Official portal of the Digital Bank of International Settlements", +}; + +export default function RootLayout({ + children, +}: Readonly<{ + children: ReactNode; +}>) { + return ( + + + + Skip to main content + +
+
+ {children} +
+