From 4eb89bd33064efb062b37b74e173a32678584711 Mon Sep 17 00:00:00 2001 From: Juergen Kunz Date: Tue, 23 Dec 2025 00:37:37 +0000 Subject: [PATCH] feat(site): initial about.uptime.link website - Rebrand from idp.global to uptime.link - Add JetBrains Mono as primary font - Update Hero with port detection, network scanning, status widgets - Update Features for uptime monitoring capabilities - Update HowItWorks for CLI-based workflow - Create new docs: CLI, Widgets, Detector - Remove idp.global specific pages (FairUsage, Docker, OIDC, Organizations, Users) - Use emerald green color scheme throughout --- changelog.md | 46 +-- index.html | 17 +- package.json | 4 +- pnpm-lock.yaml | 593 +++++++++++++++---------------- src/App.tsx | 16 +- src/components/Features.tsx | 52 +-- src/components/Footer.tsx | 16 +- src/components/Hero.tsx | 84 +++-- src/components/HowItWorks.tsx | 38 +- src/components/Navbar.tsx | 8 +- src/pages/FairUsagePolicy.tsx | 231 ------------ src/pages/docs/CLI.tsx | 160 +++++++++ src/pages/docs/Configuration.tsx | 242 +++++++------ src/pages/docs/Detector.tsx | 198 +++++++++++ src/pages/docs/Docker.tsx | 227 ------------ src/pages/docs/DocsLayout.tsx | 23 +- src/pages/docs/Introduction.tsx | 115 +++--- src/pages/docs/OIDC.tsx | 224 ------------ src/pages/docs/Organizations.tsx | 233 ------------ src/pages/docs/QuickStart.tsx | 270 ++++++-------- src/pages/docs/SDK.tsx | 321 ++++++++--------- src/pages/docs/Users.tsx | 253 ------------- src/pages/docs/Widgets.tsx | 197 ++++++++++ tailwind.config.ts | 14 +- 24 files changed, 1434 insertions(+), 2148 deletions(-) delete mode 100644 src/pages/FairUsagePolicy.tsx create mode 100644 src/pages/docs/CLI.tsx create mode 100644 src/pages/docs/Detector.tsx delete mode 100644 src/pages/docs/Docker.tsx delete mode 100644 src/pages/docs/OIDC.tsx delete mode 100644 src/pages/docs/Organizations.tsx delete mode 100644 src/pages/docs/Users.tsx create mode 100644 src/pages/docs/Widgets.tsx diff --git a/changelog.md b/changelog.md index 79b58b4..3e8aa45 100644 --- a/changelog.md +++ b/changelog.md @@ -1,40 +1,12 @@ # Changelog -## 2025-12-22 - 0.2.0 - feat(docs) -add in-app documentation pages and Fair Usage Policy +## 2025-12-23 - 0.0.1 - feat(site) +Initial about.uptime.link website -- Add FairUsagePolicy page and route (/fair-usage) with full policy content and a sticky header/footer -- Introduce a docs section with a DocsLayout and nested routes: Introduction, Quick Start, Docker, Configuration, SDK, OIDC, Organizations, Users -- Update App.tsx to register docs routes and the Fair Usage route -- Update UI components (Navbar, Footer, Hero, HowItWorks) to use internal docs routes and add a Fair Usage link -- Refactor DocsLayout to provide independent scrolling for the sidebar and main content and tweak header/sidebar layout -- Include code examples and navigation between docs pages to improve developer onboarding - -## 2025-12-22 - 0.1.0 - feat(site) -revamp landing pages and add documentation layout - -- Add new DocsLayout component with sidebar navigation, header, sign-in CTA and documentation links -- Revise Hero, Features, HowItWorks, Navbar and Footer copy to emphasize organization management, OIDC provider, RBAC, 2FA, deploy/self-host options and TypeScript SDK -- Introduce new feature cards and icons; restructure feature list and feature preview UI -- Update CTAs and links to point to docs, repository, community and sign-in endpoints; wrap buttons with asChild anchors for proper navigation -- Minor UI tweak: reduce feature card animation delay from 150ms to 100ms - -## 2025-04-03 - 0.0.0 - Site UI, theming, content and infra updates -Large update adding dark theme support, UI refactors, content/footer updates, and initial site creation. - -- Add dark theme support across the app (complete dark theme implementation). -- Add a dark theme toggle (using next-themes) and enable dark mode support for UI components. -- Fix dark mode styling specifically for the HowItWorks section. -- Refactor UI for an improved modern look and feel; improve Hero preview to resemble a passport. -- Remove the CTA component and restructure the CTA section for improved layout. -- Add sample passport data (John Doe) and fix the hero passport link to the correct URL. -- Add identity URL mapping: map idp://user.global/identity to https://passport.idp.global/john.doe. -- Add legal and company links to the footer (note: one revert related to this change was recorded and then re-applied). -- Fix a syntax error in HowItWorks.tsx (missing comma). -- Create the about.idp.global website (initial implementation). -- Standardize project tech stack setup: use vite_react_shadcn_ts. - -## 2025-11-30 - 0.0.0 - Miscellaneous housekeeping -Several small/undocumented updates and housekeeping commits were made on this date; no detailed changelog messages were provided. - -- Multiple minor updates / maintenance changes (details not specified in commit messages). \ No newline at end of file +- Create uptime.link landing page with uptime monitoring focus +- Add Hero section with port detection, local network scanning, status widgets features +- Add Features section: Port Detection, Network Scanning, Status Widgets, Alerts, Service Discovery, Self-Host, SDK, Open Source +- Add HowItWorks section: Install CLI, Scan Network, Configure Monitors, Track & Alert +- Add documentation pages: Introduction, Quick Start, CLI, Configuration, SDK, Widgets, Detector +- Configure JetBrains Mono as the primary font +- Use emerald green color scheme for uptime monitoring branding diff --git a/index.html b/index.html index 9f41e86..ab0a1d6 100644 --- a/index.html +++ b/index.html @@ -3,16 +3,21 @@ - idp.global - Free Open Source Identity Platform - - + uptime.link - Open Source Uptime Monitoring + + - - + + - + + + + + + diff --git a/package.json b/package.json index acd9d50..88f14e2 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { - "name": "vite_react_shadcn_ts", + "name": "about.uptime.link", "private": true, - "version": "0.2.0", + "version": "0.0.1", "type": "module", "scripts": { "dev": "vite", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 242f108..242cfb0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,7 +10,7 @@ importers: dependencies: '@hookform/resolvers': specifier: ^3.9.0 - version: 3.10.0(react-hook-form@7.67.0(react@18.3.1)) + version: 3.10.0(react-hook-form@7.69.0(react@18.3.1)) '@radix-ui/react-accordion': specifier: ^1.2.0 version: 1.2.12(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -94,7 +94,7 @@ importers: version: 1.2.8(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/react-query': specifier: ^5.56.2 - version: 5.90.11(react@18.3.1) + version: 5.90.12(react@18.3.1) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -130,7 +130,7 @@ importers: version: 18.3.1(react@18.3.1) react-hook-form: specifier: ^7.53.0 - version: 7.67.0(react@18.3.1) + version: 7.69.0(react@18.3.1) react-resizable-panels: specifier: ^2.1.3 version: 2.1.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -148,7 +148,7 @@ importers: version: 2.6.0 tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.18) + version: 1.0.7(tailwindcss@3.4.19) vaul: specifier: ^0.9.3 version: 0.9.9(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -158,13 +158,13 @@ importers: devDependencies: '@eslint/js': specifier: ^9.9.0 - version: 9.39.1 + version: 9.39.2 '@tailwindcss/typography': specifier: ^0.5.15 - version: 0.5.19(tailwindcss@3.4.18) + version: 0.5.19(tailwindcss@3.4.19) '@types/node': specifier: ^22.5.5 - version: 22.19.1 + version: 22.19.3 '@types/react': specifier: ^18.3.3 version: 18.3.27 @@ -173,19 +173,19 @@ importers: version: 18.3.7(@types/react@18.3.27) '@vitejs/plugin-react-swc': specifier: ^3.5.0 - version: 3.11.0(vite@5.4.21(@types/node@22.19.1)) + version: 3.11.0(vite@5.4.21(@types/node@22.19.3)) autoprefixer: specifier: ^10.4.20 - version: 10.4.22(postcss@8.5.6) + version: 10.4.23(postcss@8.5.6) eslint: specifier: ^9.9.0 - version: 9.39.1(jiti@1.21.7) + version: 9.39.2(jiti@1.21.7) eslint-plugin-react-hooks: specifier: ^5.1.0-rc.0 - version: 5.2.0(eslint@9.39.1(jiti@1.21.7)) + version: 5.2.0(eslint@9.39.2(jiti@1.21.7)) eslint-plugin-react-refresh: specifier: ^0.4.9 - version: 0.4.24(eslint@9.39.1(jiti@1.21.7)) + version: 0.4.26(eslint@9.39.2(jiti@1.21.7)) globals: specifier: ^15.9.0 version: 15.15.0 @@ -194,16 +194,16 @@ importers: version: 8.5.6 tailwindcss: specifier: ^3.4.11 - version: 3.4.18 + version: 3.4.19 typescript: specifier: ^5.5.3 version: 5.9.3 typescript-eslint: specifier: ^8.0.1 - version: 8.48.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) + version: 8.50.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) vite: specifier: ^5.4.1 - version: 5.4.21(@types/node@22.19.1) + version: 5.4.21(@types/node@22.19.3) packages: @@ -379,8 +379,8 @@ packages: resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.39.1': - resolution: {integrity: sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==} + '@eslint/js@9.39.2': + resolution: {integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.7': @@ -1115,178 +1115,178 @@ packages: '@rolldown/pluginutils@1.0.0-beta.27': resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} - '@rollup/rollup-android-arm-eabi@4.53.3': - resolution: {integrity: sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==} + '@rollup/rollup-android-arm-eabi@4.54.0': + resolution: {integrity: sha512-OywsdRHrFvCdvsewAInDKCNyR3laPA2mc9bRYJ6LBp5IyvF3fvXbbNR0bSzHlZVFtn6E0xw2oZlyjg4rKCVcng==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.53.3': - resolution: {integrity: sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==} + '@rollup/rollup-android-arm64@4.54.0': + resolution: {integrity: sha512-Skx39Uv+u7H224Af+bDgNinitlmHyQX1K/atIA32JP3JQw6hVODX5tkbi2zof/E69M1qH2UoN3Xdxgs90mmNYw==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.53.3': - resolution: {integrity: sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==} + '@rollup/rollup-darwin-arm64@4.54.0': + resolution: {integrity: sha512-k43D4qta/+6Fq+nCDhhv9yP2HdeKeP56QrUUTW7E6PhZP1US6NDqpJj4MY0jBHlJivVJD5P8NxrjuobZBJTCRw==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.53.3': - resolution: {integrity: sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==} + '@rollup/rollup-darwin-x64@4.54.0': + resolution: {integrity: sha512-cOo7biqwkpawslEfox5Vs8/qj83M/aZCSSNIWpVzfU2CYHa2G3P1UN5WF01RdTHSgCkri7XOlTdtk17BezlV3A==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.53.3': - resolution: {integrity: sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==} + '@rollup/rollup-freebsd-arm64@4.54.0': + resolution: {integrity: sha512-miSvuFkmvFbgJ1BevMa4CPCFt5MPGw094knM64W9I0giUIMMmRYcGW/JWZDriaw/k1kOBtsWh1z6nIFV1vPNtA==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.53.3': - resolution: {integrity: sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==} + '@rollup/rollup-freebsd-x64@4.54.0': + resolution: {integrity: sha512-KGXIs55+b/ZfZsq9aR026tmr/+7tq6VG6MsnrvF4H8VhwflTIuYh+LFUlIsRdQSgrgmtM3fVATzEAj4hBQlaqQ==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.53.3': - resolution: {integrity: sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==} + '@rollup/rollup-linux-arm-gnueabihf@4.54.0': + resolution: {integrity: sha512-EHMUcDwhtdRGlXZsGSIuXSYwD5kOT9NVnx9sqzYiwAc91wfYOE1g1djOEDseZJKKqtHAHGwnGPQu3kytmfaXLQ==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.53.3': - resolution: {integrity: sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==} + '@rollup/rollup-linux-arm-musleabihf@4.54.0': + resolution: {integrity: sha512-+pBrqEjaakN2ySv5RVrj/qLytYhPKEUwk+e3SFU5jTLHIcAtqh2rLrd/OkbNuHJpsBgxsD8ccJt5ga/SeG0JmA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.53.3': - resolution: {integrity: sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==} + '@rollup/rollup-linux-arm64-gnu@4.54.0': + resolution: {integrity: sha512-NSqc7rE9wuUaRBsBp5ckQ5CVz5aIRKCwsoa6WMF7G01sX3/qHUw/z4pv+D+ahL1EIKy6Enpcnz1RY8pf7bjwng==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.53.3': - resolution: {integrity: sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==} + '@rollup/rollup-linux-arm64-musl@4.54.0': + resolution: {integrity: sha512-gr5vDbg3Bakga5kbdpqx81m2n9IX8M6gIMlQQIXiLTNeQW6CucvuInJ91EuCJ/JYvc+rcLLsDFcfAD1K7fMofg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loong64-gnu@4.53.3': - resolution: {integrity: sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==} + '@rollup/rollup-linux-loong64-gnu@4.54.0': + resolution: {integrity: sha512-gsrtB1NA3ZYj2vq0Rzkylo9ylCtW/PhpLEivlgWe0bpgtX5+9j9EZa0wtZiCjgu6zmSeZWyI/e2YRX1URozpIw==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.53.3': - resolution: {integrity: sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==} + '@rollup/rollup-linux-ppc64-gnu@4.54.0': + resolution: {integrity: sha512-y3qNOfTBStmFNq+t4s7Tmc9hW2ENtPg8FeUD/VShI7rKxNW7O4fFeaYbMsd3tpFlIg1Q8IapFgy7Q9i2BqeBvA==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.53.3': - resolution: {integrity: sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==} + '@rollup/rollup-linux-riscv64-gnu@4.54.0': + resolution: {integrity: sha512-89sepv7h2lIVPsFma8iwmccN7Yjjtgz0Rj/Ou6fEqg3HDhpCa+Et+YSufy27i6b0Wav69Qv4WBNl3Rs6pwhebQ==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.53.3': - resolution: {integrity: sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==} + '@rollup/rollup-linux-riscv64-musl@4.54.0': + resolution: {integrity: sha512-ZcU77ieh0M2Q8Ur7D5X7KvK+UxbXeDHwiOt/CPSBTI1fBmeDMivW0dPkdqkT4rOgDjrDDBUed9x4EgraIKoR2A==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.53.3': - resolution: {integrity: sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==} + '@rollup/rollup-linux-s390x-gnu@4.54.0': + resolution: {integrity: sha512-2AdWy5RdDF5+4YfG/YesGDDtbyJlC9LHmL6rZw6FurBJ5n4vFGupsOBGfwMRjBYH7qRQowT8D/U4LoSvVwOhSQ==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.53.3': - resolution: {integrity: sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==} + '@rollup/rollup-linux-x64-gnu@4.54.0': + resolution: {integrity: sha512-WGt5J8Ij/rvyqpFexxk3ffKqqbLf9AqrTBbWDk7ApGUzaIs6V+s2s84kAxklFwmMF/vBNGrVdYgbblCOFFezMQ==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.53.3': - resolution: {integrity: sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==} + '@rollup/rollup-linux-x64-musl@4.54.0': + resolution: {integrity: sha512-JzQmb38ATzHjxlPHuTH6tE7ojnMKM2kYNzt44LO/jJi8BpceEC8QuXYA908n8r3CNuG/B3BV8VR3Hi1rYtmPiw==} cpu: [x64] os: [linux] - '@rollup/rollup-openharmony-arm64@4.53.3': - resolution: {integrity: sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==} + '@rollup/rollup-openharmony-arm64@4.54.0': + resolution: {integrity: sha512-huT3fd0iC7jigGh7n3q/+lfPcXxBi+om/Rs3yiFxjvSxbSB6aohDFXbWvlspaqjeOh+hx7DDHS+5Es5qRkWkZg==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.53.3': - resolution: {integrity: sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==} + '@rollup/rollup-win32-arm64-msvc@4.54.0': + resolution: {integrity: sha512-c2V0W1bsKIKfbLMBu/WGBz6Yci8nJ/ZJdheE0EwB73N3MvHYKiKGs3mVilX4Gs70eGeDaMqEob25Tw2Gb9Nqyw==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.53.3': - resolution: {integrity: sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==} + '@rollup/rollup-win32-ia32-msvc@4.54.0': + resolution: {integrity: sha512-woEHgqQqDCkAzrDhvDipnSirm5vxUXtSKDYTVpZG3nUdW/VVB5VdCYA2iReSj/u3yCZzXID4kuKG7OynPnB3WQ==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.53.3': - resolution: {integrity: sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==} + '@rollup/rollup-win32-x64-gnu@4.54.0': + resolution: {integrity: sha512-dzAc53LOuFvHwbCEOS0rPbXp6SIhAf2txMP5p6mGyOXXw5mWY8NGGbPMPrs4P1WItkfApDathBj/NzMLUZ9rtQ==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.53.3': - resolution: {integrity: sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==} + '@rollup/rollup-win32-x64-msvc@4.54.0': + resolution: {integrity: sha512-hYT5d3YNdSh3mbCU1gwQyPgQd3T2ne0A3KG8KSBdav5TiBg6eInVmV+TeR5uHufiIgSFg0XsOWGW5/RhNcSvPg==} cpu: [x64] os: [win32] - '@swc/core-darwin-arm64@1.15.3': - resolution: {integrity: sha512-AXfeQn0CvcQ4cndlIshETx6jrAM45oeUrK8YeEY6oUZU/qzz0Id0CyvlEywxkWVC81Ajpd8TQQ1fW5yx6zQWkQ==} + '@swc/core-darwin-arm64@1.15.7': + resolution: {integrity: sha512-+hNVUfezUid7LeSHqnhoC6Gh3BROABxjlDNInuZ/fie1RUxaEX4qzDwdTgozJELgHhvYxyPIg1ro8ibnKtgO4g==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.15.3': - resolution: {integrity: sha512-p68OeCz1ui+MZYG4wmfJGvcsAcFYb6Sl25H9TxWl+GkBgmNimIiRdnypK9nBGlqMZAcxngNPtnG3kEMNnvoJ2A==} + '@swc/core-darwin-x64@1.15.7': + resolution: {integrity: sha512-ZAFuvtSYZTuXPcrhanaD5eyp27H8LlDzx2NAeVyH0FchYcuXf0h5/k3GL9ZU6Jw9eQ63R1E8KBgpXEJlgRwZUQ==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.15.3': - resolution: {integrity: sha512-Nuj5iF4JteFgwrai97mUX+xUOl+rQRHqTvnvHMATL/l9xE6/TJfPBpd3hk/PVpClMXG3Uvk1MxUFOEzM1JrMYg==} + '@swc/core-linux-arm-gnueabihf@1.15.7': + resolution: {integrity: sha512-K3HTYocpqnOw8KcD8SBFxiDHjIma7G/X+bLdfWqf+qzETNBrzOub/IEkq9UaeupaJiZJkPptr/2EhEXXWryS/A==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.15.3': - resolution: {integrity: sha512-2Nc/s8jE6mW2EjXWxO/lyQuLKShcmTrym2LRf5Ayp3ICEMX6HwFqB1EzDhwoMa2DcUgmnZIalesq2lG3krrUNw==} + '@swc/core-linux-arm64-gnu@1.15.7': + resolution: {integrity: sha512-HCnVIlsLnCtQ3uXcXgWrvQ6SAraskLA9QJo9ykTnqTH6TvUYqEta+TdTdGjzngD6TOE7XjlAiUs/RBtU8Z0t+Q==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-arm64-musl@1.15.3': - resolution: {integrity: sha512-j4SJniZ/qaZ5g8op+p1G9K1z22s/EYGg1UXIb3+Cg4nsxEpF5uSIGEE4mHUfA70L0BR9wKT2QF/zv3vkhfpX4g==} + '@swc/core-linux-arm64-musl@1.15.7': + resolution: {integrity: sha512-/OOp9UZBg4v2q9+x/U21Jtld0Wb8ghzBScwhscI7YvoSh4E8RALaJ1msV8V8AKkBkZH7FUAFB7Vbv0oVzZsezA==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-x64-gnu@1.15.3': - resolution: {integrity: sha512-aKttAZnz8YB1VJwPQZtyU8Uk0BfMP63iDMkvjhJzRZVgySmqt/apWSdnoIcZlUoGheBrcqbMC17GGUmur7OT5A==} + '@swc/core-linux-x64-gnu@1.15.7': + resolution: {integrity: sha512-VBbs4gtD4XQxrHuQ2/2+TDZpPQQgrOHYRnS6SyJW+dw0Nj/OomRqH+n5Z4e/TgKRRbieufipeIGvADYC/90PYQ==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-linux-x64-musl@1.15.3': - resolution: {integrity: sha512-oe8FctPu1gnUsdtGJRO2rvOUIkkIIaHqsO9xxN0bTR7dFTlPTGi2Fhk1tnvXeyAvCPxLIcwD8phzKg6wLv9yug==} + '@swc/core-linux-x64-musl@1.15.7': + resolution: {integrity: sha512-kVuy2unodso6p0rMauS2zby8/bhzoGRYxBDyD6i2tls/fEYAE74oP0VPFzxIyHaIjK1SN6u5TgvV9MpyJ5xVug==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-win32-arm64-msvc@1.15.3': - resolution: {integrity: sha512-L9AjzP2ZQ/Xh58e0lTRMLvEDrcJpR7GwZqAtIeNLcTK7JVE+QineSyHp0kLkO1rttCHyCy0U74kDTj0dRz6raA==} + '@swc/core-win32-arm64-msvc@1.15.7': + resolution: {integrity: sha512-uddYoo5Xmo1XKLhAnh4NBIyy5d0xk33x1sX3nIJboFySLNz878ksCFCZ3IBqrt1Za0gaoIWoOSSSk0eNhAc/sw==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.15.3': - resolution: {integrity: sha512-B8UtogMzErUPDWUoKONSVBdsgKYd58rRyv2sHJWKOIMCHfZ22FVXICR4O/VwIYtlnZ7ahERcjayBHDlBZpR0aw==} + '@swc/core-win32-ia32-msvc@1.15.7': + resolution: {integrity: sha512-rqq8JjNMLx3QNlh0aPTtN/4+BGLEHC94rj9mkH1stoNRf3ra6IksNHMHy+V1HUqElEgcZyx+0yeXx3eLOTcoFw==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.15.3': - resolution: {integrity: sha512-SpZKMR9QBTecHeqpzJdYEfgw30Oo8b/Xl6rjSzBt1g0ZsXyy60KLXrp6IagQyfTYqNYE/caDvwtF2FPn7pomog==} + '@swc/core-win32-x64-msvc@1.15.7': + resolution: {integrity: sha512-4BK06EGdPnuplgcNhmSbOIiLdRgHYX3v1nl4HXo5uo4GZMfllXaCyBUes+0ePRfwbn9OFgVhCWPcYYjMT6hycQ==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.15.3': - resolution: {integrity: sha512-Qd8eBPkUFL4eAONgGjycZXj1jFCBW8Fd+xF0PzdTlBCWQIV1xnUT7B93wUANtW3KGjl3TRcOyxwSx/u/jyKw/Q==} + '@swc/core@1.15.7': + resolution: {integrity: sha512-kTGB8XI7P+pTKW83tnUEDVP4zduF951u3UAOn5eTi0vyW6MvL56A3+ggMdfuVFtDI0/DsbSzf5z34HVBbuScWw==} engines: {node: '>=10'} peerDependencies: '@swc/helpers': '>=0.5.17' @@ -1305,11 +1305,11 @@ packages: peerDependencies: tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1' - '@tanstack/query-core@5.90.11': - resolution: {integrity: sha512-f9z/nXhCgWDF4lHqgIE30jxLe4sYv15QodfdPDKYAk7nAEjNcndy4dHz3ezhdUaR23BpWa4I2EH4/DZ0//Uf8A==} + '@tanstack/query-core@5.90.12': + resolution: {integrity: sha512-T1/8t5DhV/SisWjDnaiU2drl6ySvsHj1bHBCWNXd+/T+Hh1cf6JodyEYMd5sgwm+b/mETT4EV3H+zCVczCU5hg==} - '@tanstack/react-query@5.90.11': - resolution: {integrity: sha512-3uyzz01D1fkTLXuxF3JfoJoHQMU2fxsfJwE+6N5hHy0dVNoZOvwKP8Z2k7k1KDeD54N20apcJnG75TBAStIrBA==} + '@tanstack/react-query@5.90.12': + resolution: {integrity: sha512-graRZspg7EoEaw0a8faiUASCyJrqjKPdqJ9EwuDRUF9mEYJ1YPczI9H+/agJ0mOJkPCJDk0lsz5QTrLZ/jQ2rg==} peerDependencies: react: ^18 || ^19 @@ -1346,8 +1346,8 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/node@22.19.1': - resolution: {integrity: sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ==} + '@types/node@22.19.3': + resolution: {integrity: sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==} '@types/prop-types@15.7.15': resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} @@ -1360,63 +1360,63 @@ packages: '@types/react@18.3.27': resolution: {integrity: sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==} - '@typescript-eslint/eslint-plugin@8.48.0': - resolution: {integrity: sha512-XxXP5tL1txl13YFtrECECQYeZjBZad4fyd3cFV4a19LkAY/bIp9fev3US4S5fDVV2JaYFiKAZ/GRTOLer+mbyQ==} + '@typescript-eslint/eslint-plugin@8.50.1': + resolution: {integrity: sha512-PKhLGDq3JAg0Jk/aK890knnqduuI/Qj+udH7wCf0217IGi4gt+acgCyPVe79qoT+qKUvHMDQkwJeKW9fwl8Cyw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.48.0 + '@typescript-eslint/parser': ^8.50.1 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.48.0': - resolution: {integrity: sha512-jCzKdm/QK0Kg4V4IK/oMlRZlY+QOcdjv89U2NgKHZk1CYTj82/RVSx1mV/0gqCVMJ/DA+Zf/S4NBWNF8GQ+eqQ==} + '@typescript-eslint/parser@8.50.1': + resolution: {integrity: sha512-hM5faZwg7aVNa819m/5r7D0h0c9yC4DUlWAOvHAtISdFTc8xB86VmX5Xqabrama3wIPJ/q9RbGS1worb6JfnMg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.48.0': - resolution: {integrity: sha512-Ne4CTZyRh1BecBf84siv42wv5vQvVmgtk8AuiEffKTUo3DrBaGYZueJSxxBZ8fjk/N3DrgChH4TOdIOwOwiqqw==} + '@typescript-eslint/project-service@8.50.1': + resolution: {integrity: sha512-E1ur1MCVf+YiP89+o4Les/oBAVzmSbeRB0MQLfSlYtbWU17HPxZ6Bhs5iYmKZRALvEuBoXIZMOIRRc/P++Ortg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.48.0': - resolution: {integrity: sha512-uGSSsbrtJrLduti0Q1Q9+BF1/iFKaxGoQwjWOIVNJv0o6omrdyR8ct37m4xIl5Zzpkp69Kkmvom7QFTtue89YQ==} + '@typescript-eslint/scope-manager@8.50.1': + resolution: {integrity: sha512-mfRx06Myt3T4vuoHaKi8ZWNTPdzKPNBhiblze5N50//TSHOAQQevl/aolqA/BcqqbJ88GUnLqjjcBc8EWdBcVw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.48.0': - resolution: {integrity: sha512-WNebjBdFdyu10sR1M4OXTt2OkMd5KWIL+LLfeH9KhgP+jzfDV/LI3eXzwJ1s9+Yc0Kzo2fQCdY/OpdusCMmh6w==} + '@typescript-eslint/tsconfig-utils@8.50.1': + resolution: {integrity: sha512-ooHmotT/lCWLXi55G4mvaUF60aJa012QzvLK0Y+Mp4WdSt17QhMhWOaBWeGTFVkb2gDgBe19Cxy1elPXylslDw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.48.0': - resolution: {integrity: sha512-zbeVaVqeXhhab6QNEKfK96Xyc7UQuoFWERhEnj3mLVnUWrQnv15cJNseUni7f3g557gm0e46LZ6IJ4NJVOgOpw==} + '@typescript-eslint/type-utils@8.50.1': + resolution: {integrity: sha512-7J3bf022QZE42tYMO6SL+6lTPKFk/WphhRPe9Tw/el+cEwzLz1Jjz2PX3GtGQVxooLDKeMVmMt7fWpYRdG5Etg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.48.0': - resolution: {integrity: sha512-cQMcGQQH7kwKoVswD1xdOytxQR60MWKM1di26xSUtxehaDs/32Zpqsu5WJlXTtTTqyAVK8R7hvsUnIXRS+bjvA==} + '@typescript-eslint/types@8.50.1': + resolution: {integrity: sha512-v5lFIS2feTkNyMhd7AucE/9j/4V9v5iIbpVRncjk/K0sQ6Sb+Np9fgYS/63n6nwqahHQvbmujeBL7mp07Q9mlA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.48.0': - resolution: {integrity: sha512-ljHab1CSO4rGrQIAyizUS6UGHHCiAYhbfcIZ1zVJr5nMryxlXMVWS3duFPSKvSUbFPwkXMFk1k0EMIjub4sRRQ==} + '@typescript-eslint/typescript-estree@8.50.1': + resolution: {integrity: sha512-woHPdW+0gj53aM+cxchymJCrh0cyS7BTIdcDxWUNsclr9VDkOSbqC13juHzxOmQ22dDkMZEpZB+3X1WpUvzgVQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.48.0': - resolution: {integrity: sha512-yTJO1XuGxCsSfIVt1+1UrLHtue8xz16V8apzPYI06W0HbEbEWHxHXgZaAgavIkoh+GeV6hKKd5jm0sS6OYxWXQ==} + '@typescript-eslint/utils@8.50.1': + resolution: {integrity: sha512-lCLp8H1T9T7gPbEuJSnHwnSuO9mDf8mfK/Nion5mZmiEaQD9sWf9W4dfeFqRyqRjF06/kBuTmAqcs9sewM2NbQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.48.0': - resolution: {integrity: sha512-T0XJMaRPOH3+LBbAfzR2jalckP1MSG/L9eUtY0DEzUyVaXJ/t6zN0nR7co5kz0Jko/nkSYCBRkz1djvjajVTTg==} + '@typescript-eslint/visitor-keys@8.50.1': + resolution: {integrity: sha512-IrDKrw7pCRUR94zeuCSUWQ+w8JEf5ZX5jl/e6AHGSLi1/zIr0lgutfn/7JpfCey+urpgQEdrZVYzCaVVKiTwhQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@vitejs/plugin-react-swc@3.11.0': @@ -1458,8 +1458,8 @@ packages: resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} engines: {node: '>=10'} - autoprefixer@10.4.22: - resolution: {integrity: sha512-ARe0v/t9gO28Bznv6GgqARmVqcWOV3mfgUPn9becPHMiD3o9BwlRgaeccZnwTpZ7Zwqrm+c1sUSsMxIzQzc8Xg==} + autoprefixer@10.4.23: + resolution: {integrity: sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==} engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: @@ -1468,8 +1468,8 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - baseline-browser-mapping@2.8.32: - resolution: {integrity: sha512-OPz5aBThlyLFgxyhdwf/s2+8ab3OvT7AdTNvKHBwpXomIYeXqpUUuT8LrdtxZSsWJ4R4CU1un4XGh5Ez3nlTpw==} + baseline-browser-mapping@2.9.11: + resolution: {integrity: sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==} hasBin: true binary-extensions@2.3.0: @@ -1486,8 +1486,8 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.28.0: - resolution: {integrity: sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==} + browserslist@4.28.1: + resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -1499,8 +1499,8 @@ packages: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} - caniuse-lite@1.0.30001757: - resolution: {integrity: sha512-r0nnL/I28Zi/yjk1el6ilj27tKcdjLsNqAOZr0yVjWPrSQyHgKI2INaEWw21bAQSv2LXRt1XuCS/GomNpWOxsQ==} + caniuse-lite@1.0.30001761: + resolution: {integrity: sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==} chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} @@ -1623,8 +1623,8 @@ packages: dom-helpers@5.2.1: resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} - electron-to-chromium@1.5.262: - resolution: {integrity: sha512-NlAsMteRHek05jRUxUR0a5jpjYq9ykk6+kO0yRaMi5moe7u0fVIOeQ3Y30A8dIiWFBNUoQGi1ljb1i5VtS9WQQ==} + electron-to-chromium@1.5.267: + resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==} embla-carousel-react@8.6.0: resolution: {integrity: sha512-0/PjqU7geVmo6F734pmPqpyHqiM99olvyecY7zdweCw+6tKEXnrE90pBiBbMMU8s5tICemzpQ3hi5EpxzGW+JA==} @@ -1658,8 +1658,8 @@ packages: peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 - eslint-plugin-react-refresh@0.4.24: - resolution: {integrity: sha512-nLHIW7TEq3aLrEYWpVaJ1dRgFR+wLDPN8e8FpYAql/bMV2oBEfC37K0gLEGgv9fy66juNShSMV8OkTqzltcG/w==} + eslint-plugin-react-refresh@0.4.26: + resolution: {integrity: sha512-1RETEylht2O6FM/MvgnyvT+8K21wLqDNg4qD51Zj3guhjt433XbnnkVttHMyaVyAFD03QSV4LPS5iE3VQmO7XQ==} peerDependencies: eslint: '>=8.40' @@ -1675,8 +1675,8 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.39.1: - resolution: {integrity: sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==} + eslint@9.39.2: + resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -1711,8 +1711,8 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-equals@5.3.3: - resolution: {integrity: sha512-/boTcHZeIAQ2r/tL11voclBHDeP9WPxLt+tyAbVSyyXuUFyh0Tne7gJZTqGbxnvj79TjLdCXLOY7UIPhyG5MTw==} + fast-equals@5.4.0: + resolution: {integrity: sha512-jt2DW/aNFNwke7AUd+Z+e6pz39KO5rzdbbFCg2sGafS4mk13MI7Z8O5z9cADNn5lhGODIgLwug6TZO2ctf7kcw==} engines: {node: '>=6.0.0'} fast-glob@3.3.3: @@ -1787,9 +1787,6 @@ packages: resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} engines: {node: '>=18'} - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -1942,10 +1939,6 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - normalize-range@0.1.2: - resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} - engines: {node: '>=0.10.0'} - object-assign@4.1.1: resolution: {integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=} engines: {node: '>=0.10.0'} @@ -2076,8 +2069,8 @@ packages: peerDependencies: react: ^18.3.1 - react-hook-form@7.67.0: - resolution: {integrity: sha512-E55EOwKJHHIT/I6J9DmQbCWToAYSw9nN5R57MZw9rMtjh+YQreMDxRLfdjfxQbiJ3/qbg3Z02wGzBX4M+5fMtQ==} + react-hook-form@7.69.0: + resolution: {integrity: sha512-yt6ZGME9f4F6WHwevrvpAjh42HMvocuSnSIHUGycBqXIJdhqGSPQzTpGF+1NLREk/58IdPxEMfPcFCjlMhclGw==} engines: {node: '>=18.0.0'} peerDependencies: react: ^16.8.0 || ^17 || ^18 || ^19 @@ -2183,8 +2176,8 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rollup@4.53.3: - resolution: {integrity: sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==} + rollup@4.54.0: + resolution: {integrity: sha512-3nk8Y3a9Ea8szgKhinMlGMhGMw89mqule3KWczxhIzqudyHdCIOHw8WJlj/r329fACjKLEh13ZSk7oE22kyeIw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -2242,8 +2235,8 @@ packages: peerDependencies: tailwindcss: '>=3.0.0 || insiders' - tailwindcss@3.4.18: - resolution: {integrity: sha512-6A2rnmW5xZMdw11LYjhcI5846rt9pbLSabY5XPxo+XWdxwZaFEn47Go4NzFiHu9sNNmr/kXivP1vStfvMaK1GQ==} + tailwindcss@3.4.19: + resolution: {integrity: sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==} engines: {node: '>=14.0.0'} hasBin: true @@ -2281,8 +2274,8 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - typescript-eslint@8.48.0: - resolution: {integrity: sha512-fcKOvQD9GUn3Xw63EgiDqhvWJ5jsyZUaekl3KVpGsDJnN46WJTe3jWxtQP9lMZm1LJNkFLlTaWAxK2vUQR+cqw==} + typescript-eslint@8.50.1: + resolution: {integrity: sha512-ytTHO+SoYSbhAH9CrYnMhiLx8To6PSSvqnvXyPUgPETCvB6eBKmTI9w6XMPS3HsBRGkwTVBX+urA8dYQx6bHfQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -2296,8 +2289,8 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - update-browserslist-db@1.1.4: - resolution: {integrity: sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==} + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -2464,9 +2457,9 @@ snapshots: '@esbuild/win32-x64@0.21.5': optional: true - '@eslint-community/eslint-utils@4.9.0(eslint@9.39.1(jiti@1.21.7))': + '@eslint-community/eslint-utils@4.9.0(eslint@9.39.2(jiti@1.21.7))': dependencies: - eslint: 9.39.1(jiti@1.21.7) + eslint: 9.39.2(jiti@1.21.7) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} @@ -2501,7 +2494,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.39.1': {} + '@eslint/js@9.39.2': {} '@eslint/object-schema@2.1.7': {} @@ -2527,9 +2520,9 @@ snapshots: '@floating-ui/utils@0.2.10': {} - '@hookform/resolvers@3.10.0(react-hook-form@7.67.0(react@18.3.1))': + '@hookform/resolvers@3.10.0(react-hook-form@7.69.0(react@18.3.1))': dependencies: - react-hook-form: 7.67.0(react@18.3.1) + react-hook-form: 7.69.0(react@18.3.1) '@humanfs/core@0.19.1': {} @@ -3267,117 +3260,117 @@ snapshots: '@rolldown/pluginutils@1.0.0-beta.27': {} - '@rollup/rollup-android-arm-eabi@4.53.3': + '@rollup/rollup-android-arm-eabi@4.54.0': optional: true - '@rollup/rollup-android-arm64@4.53.3': + '@rollup/rollup-android-arm64@4.54.0': optional: true - '@rollup/rollup-darwin-arm64@4.53.3': + '@rollup/rollup-darwin-arm64@4.54.0': optional: true - '@rollup/rollup-darwin-x64@4.53.3': + '@rollup/rollup-darwin-x64@4.54.0': optional: true - '@rollup/rollup-freebsd-arm64@4.53.3': + '@rollup/rollup-freebsd-arm64@4.54.0': optional: true - '@rollup/rollup-freebsd-x64@4.53.3': + '@rollup/rollup-freebsd-x64@4.54.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.53.3': + '@rollup/rollup-linux-arm-gnueabihf@4.54.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.53.3': + '@rollup/rollup-linux-arm-musleabihf@4.54.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.53.3': + '@rollup/rollup-linux-arm64-gnu@4.54.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.53.3': + '@rollup/rollup-linux-arm64-musl@4.54.0': optional: true - '@rollup/rollup-linux-loong64-gnu@4.53.3': + '@rollup/rollup-linux-loong64-gnu@4.54.0': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.53.3': + '@rollup/rollup-linux-ppc64-gnu@4.54.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.53.3': + '@rollup/rollup-linux-riscv64-gnu@4.54.0': optional: true - '@rollup/rollup-linux-riscv64-musl@4.53.3': + '@rollup/rollup-linux-riscv64-musl@4.54.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.53.3': + '@rollup/rollup-linux-s390x-gnu@4.54.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.53.3': + '@rollup/rollup-linux-x64-gnu@4.54.0': optional: true - '@rollup/rollup-linux-x64-musl@4.53.3': + '@rollup/rollup-linux-x64-musl@4.54.0': optional: true - '@rollup/rollup-openharmony-arm64@4.53.3': + '@rollup/rollup-openharmony-arm64@4.54.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.53.3': + '@rollup/rollup-win32-arm64-msvc@4.54.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.53.3': + '@rollup/rollup-win32-ia32-msvc@4.54.0': optional: true - '@rollup/rollup-win32-x64-gnu@4.53.3': + '@rollup/rollup-win32-x64-gnu@4.54.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.53.3': + '@rollup/rollup-win32-x64-msvc@4.54.0': optional: true - '@swc/core-darwin-arm64@1.15.3': + '@swc/core-darwin-arm64@1.15.7': optional: true - '@swc/core-darwin-x64@1.15.3': + '@swc/core-darwin-x64@1.15.7': optional: true - '@swc/core-linux-arm-gnueabihf@1.15.3': + '@swc/core-linux-arm-gnueabihf@1.15.7': optional: true - '@swc/core-linux-arm64-gnu@1.15.3': + '@swc/core-linux-arm64-gnu@1.15.7': optional: true - '@swc/core-linux-arm64-musl@1.15.3': + '@swc/core-linux-arm64-musl@1.15.7': optional: true - '@swc/core-linux-x64-gnu@1.15.3': + '@swc/core-linux-x64-gnu@1.15.7': optional: true - '@swc/core-linux-x64-musl@1.15.3': + '@swc/core-linux-x64-musl@1.15.7': optional: true - '@swc/core-win32-arm64-msvc@1.15.3': + '@swc/core-win32-arm64-msvc@1.15.7': optional: true - '@swc/core-win32-ia32-msvc@1.15.3': + '@swc/core-win32-ia32-msvc@1.15.7': optional: true - '@swc/core-win32-x64-msvc@1.15.3': + '@swc/core-win32-x64-msvc@1.15.7': optional: true - '@swc/core@1.15.3': + '@swc/core@1.15.7': dependencies: '@swc/counter': 0.1.3 '@swc/types': 0.1.25 optionalDependencies: - '@swc/core-darwin-arm64': 1.15.3 - '@swc/core-darwin-x64': 1.15.3 - '@swc/core-linux-arm-gnueabihf': 1.15.3 - '@swc/core-linux-arm64-gnu': 1.15.3 - '@swc/core-linux-arm64-musl': 1.15.3 - '@swc/core-linux-x64-gnu': 1.15.3 - '@swc/core-linux-x64-musl': 1.15.3 - '@swc/core-win32-arm64-msvc': 1.15.3 - '@swc/core-win32-ia32-msvc': 1.15.3 - '@swc/core-win32-x64-msvc': 1.15.3 + '@swc/core-darwin-arm64': 1.15.7 + '@swc/core-darwin-x64': 1.15.7 + '@swc/core-linux-arm-gnueabihf': 1.15.7 + '@swc/core-linux-arm64-gnu': 1.15.7 + '@swc/core-linux-arm64-musl': 1.15.7 + '@swc/core-linux-x64-gnu': 1.15.7 + '@swc/core-linux-x64-musl': 1.15.7 + '@swc/core-win32-arm64-msvc': 1.15.7 + '@swc/core-win32-ia32-msvc': 1.15.7 + '@swc/core-win32-x64-msvc': 1.15.7 '@swc/counter@0.1.3': {} @@ -3385,16 +3378,16 @@ snapshots: dependencies: '@swc/counter': 0.1.3 - '@tailwindcss/typography@0.5.19(tailwindcss@3.4.18)': + '@tailwindcss/typography@0.5.19(tailwindcss@3.4.19)': dependencies: postcss-selector-parser: 6.0.10 - tailwindcss: 3.4.18 + tailwindcss: 3.4.19 - '@tanstack/query-core@5.90.11': {} + '@tanstack/query-core@5.90.12': {} - '@tanstack/react-query@5.90.11(react@18.3.1)': + '@tanstack/react-query@5.90.12(react@18.3.1)': dependencies: - '@tanstack/query-core': 5.90.11 + '@tanstack/query-core': 5.90.12 react: 18.3.1 '@types/d3-array@3.2.2': {} @@ -3425,7 +3418,7 @@ snapshots: '@types/json-schema@7.0.15': {} - '@types/node@22.19.1': + '@types/node@22.19.3': dependencies: undici-types: 6.21.0 @@ -3440,16 +3433,15 @@ snapshots: '@types/prop-types': 15.7.15 csstype: 3.2.3 - '@typescript-eslint/eslint-plugin@8.48.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.50.1(@typescript-eslint/parser@8.50.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.48.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.48.0 - '@typescript-eslint/type-utils': 8.48.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/utils': 8.48.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.48.0 - eslint: 9.39.1(jiti@1.21.7) - graphemer: 1.4.0 + '@typescript-eslint/parser': 8.50.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.50.1 + '@typescript-eslint/type-utils': 8.50.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/utils': 8.50.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.50.1 + eslint: 9.39.2(jiti@1.21.7) ignore: 7.0.5 natural-compare: 1.4.0 ts-api-utils: 2.1.0(typescript@5.9.3) @@ -3457,56 +3449,56 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.48.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3)': + '@typescript-eslint/parser@8.50.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.48.0 - '@typescript-eslint/types': 8.48.0 - '@typescript-eslint/typescript-estree': 8.48.0(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.48.0 + '@typescript-eslint/scope-manager': 8.50.1 + '@typescript-eslint/types': 8.50.1 + '@typescript-eslint/typescript-estree': 8.50.1(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.50.1 debug: 4.4.3 - eslint: 9.39.1(jiti@1.21.7) + eslint: 9.39.2(jiti@1.21.7) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.48.0(typescript@5.9.3)': + '@typescript-eslint/project-service@8.50.1(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.48.0(typescript@5.9.3) - '@typescript-eslint/types': 8.48.0 + '@typescript-eslint/tsconfig-utils': 8.50.1(typescript@5.9.3) + '@typescript-eslint/types': 8.50.1 debug: 4.4.3 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.48.0': + '@typescript-eslint/scope-manager@8.50.1': dependencies: - '@typescript-eslint/types': 8.48.0 - '@typescript-eslint/visitor-keys': 8.48.0 + '@typescript-eslint/types': 8.50.1 + '@typescript-eslint/visitor-keys': 8.50.1 - '@typescript-eslint/tsconfig-utils@8.48.0(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.50.1(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.48.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.50.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.48.0 - '@typescript-eslint/typescript-estree': 8.48.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.48.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/types': 8.50.1 + '@typescript-eslint/typescript-estree': 8.50.1(typescript@5.9.3) + '@typescript-eslint/utils': 8.50.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) debug: 4.4.3 - eslint: 9.39.1(jiti@1.21.7) + eslint: 9.39.2(jiti@1.21.7) ts-api-utils: 2.1.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.48.0': {} + '@typescript-eslint/types@8.50.1': {} - '@typescript-eslint/typescript-estree@8.48.0(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.50.1(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.48.0(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.48.0(typescript@5.9.3) - '@typescript-eslint/types': 8.48.0 - '@typescript-eslint/visitor-keys': 8.48.0 + '@typescript-eslint/project-service': 8.50.1(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.50.1(typescript@5.9.3) + '@typescript-eslint/types': 8.50.1 + '@typescript-eslint/visitor-keys': 8.50.1 debug: 4.4.3 minimatch: 9.0.5 semver: 7.7.3 @@ -3516,27 +3508,27 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.48.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3)': + '@typescript-eslint/utils@8.50.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@1.21.7)) - '@typescript-eslint/scope-manager': 8.48.0 - '@typescript-eslint/types': 8.48.0 - '@typescript-eslint/typescript-estree': 8.48.0(typescript@5.9.3) - eslint: 9.39.1(jiti@1.21.7) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2(jiti@1.21.7)) + '@typescript-eslint/scope-manager': 8.50.1 + '@typescript-eslint/types': 8.50.1 + '@typescript-eslint/typescript-estree': 8.50.1(typescript@5.9.3) + eslint: 9.39.2(jiti@1.21.7) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.48.0': + '@typescript-eslint/visitor-keys@8.50.1': dependencies: - '@typescript-eslint/types': 8.48.0 + '@typescript-eslint/types': 8.50.1 eslint-visitor-keys: 4.2.1 - '@vitejs/plugin-react-swc@3.11.0(vite@5.4.21(@types/node@22.19.1))': + '@vitejs/plugin-react-swc@3.11.0(vite@5.4.21(@types/node@22.19.3))': dependencies: '@rolldown/pluginutils': 1.0.0-beta.27 - '@swc/core': 1.15.3 - vite: 5.4.21(@types/node@22.19.1) + '@swc/core': 1.15.7 + vite: 5.4.21(@types/node@22.19.3) transitivePeerDependencies: - '@swc/helpers' @@ -3572,19 +3564,18 @@ snapshots: dependencies: tslib: 2.8.1 - autoprefixer@10.4.22(postcss@8.5.6): + autoprefixer@10.4.23(postcss@8.5.6): dependencies: - browserslist: 4.28.0 - caniuse-lite: 1.0.30001757 + browserslist: 4.28.1 + caniuse-lite: 1.0.30001761 fraction.js: 5.3.4 - normalize-range: 0.1.2 picocolors: 1.1.1 postcss: 8.5.6 postcss-value-parser: 4.2.0 balanced-match@1.0.2: {} - baseline-browser-mapping@2.8.32: {} + baseline-browser-mapping@2.9.11: {} binary-extensions@2.3.0: {} @@ -3601,19 +3592,19 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.28.0: + browserslist@4.28.1: dependencies: - baseline-browser-mapping: 2.8.32 - caniuse-lite: 1.0.30001757 - electron-to-chromium: 1.5.262 + baseline-browser-mapping: 2.9.11 + caniuse-lite: 1.0.30001761 + electron-to-chromium: 1.5.267 node-releases: 2.0.27 - update-browserslist-db: 1.1.4(browserslist@4.28.0) + update-browserslist-db: 1.2.3(browserslist@4.28.1) callsites@3.1.0: {} camelcase-css@2.0.1: {} - caniuse-lite@1.0.30001757: {} + caniuse-lite@1.0.30001761: {} chalk@4.1.2: dependencies: @@ -3729,7 +3720,7 @@ snapshots: '@babel/runtime': 7.28.4 csstype: 3.2.3 - electron-to-chromium@1.5.262: {} + electron-to-chromium@1.5.267: {} embla-carousel-react@8.6.0(react@18.3.1): dependencies: @@ -3773,13 +3764,13 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-plugin-react-hooks@5.2.0(eslint@9.39.1(jiti@1.21.7)): + eslint-plugin-react-hooks@5.2.0(eslint@9.39.2(jiti@1.21.7)): dependencies: - eslint: 9.39.1(jiti@1.21.7) + eslint: 9.39.2(jiti@1.21.7) - eslint-plugin-react-refresh@0.4.24(eslint@9.39.1(jiti@1.21.7)): + eslint-plugin-react-refresh@0.4.26(eslint@9.39.2(jiti@1.21.7)): dependencies: - eslint: 9.39.1(jiti@1.21.7) + eslint: 9.39.2(jiti@1.21.7) eslint-scope@8.4.0: dependencies: @@ -3790,15 +3781,15 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.39.1(jiti@1.21.7): + eslint@9.39.2(jiti@1.21.7): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@1.21.7)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2(jiti@1.21.7)) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.21.1 '@eslint/config-helpers': 0.4.2 '@eslint/core': 0.17.0 '@eslint/eslintrc': 3.3.3 - '@eslint/js': 9.39.1 + '@eslint/js': 9.39.2 '@eslint/plugin-kit': 0.4.1 '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 @@ -3853,7 +3844,7 @@ snapshots: fast-deep-equal@3.1.3: {} - fast-equals@5.3.3: {} + fast-equals@5.4.0: {} fast-glob@3.3.3: dependencies: @@ -3916,8 +3907,6 @@ snapshots: globals@15.15.0: {} - graphemer@1.4.0: {} - has-flag@4.0.0: {} hasown@2.0.2: @@ -4039,8 +4028,6 @@ snapshots: normalize-path@3.0.0: {} - normalize-range@0.1.2: {} - object-assign@4.1.1: {} object-hash@3.0.0: {} @@ -4147,7 +4134,7 @@ snapshots: react: 18.3.1 scheduler: 0.23.2 - react-hook-form@7.67.0(react@18.3.1): + react-hook-form@7.69.0(react@18.3.1): dependencies: react: 18.3.1 @@ -4193,7 +4180,7 @@ snapshots: react-smooth@4.0.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - fast-equals: 5.3.3 + fast-equals: 5.4.0 prop-types: 15.8.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -4255,32 +4242,32 @@ snapshots: reusify@1.1.0: {} - rollup@4.53.3: + rollup@4.54.0: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.53.3 - '@rollup/rollup-android-arm64': 4.53.3 - '@rollup/rollup-darwin-arm64': 4.53.3 - '@rollup/rollup-darwin-x64': 4.53.3 - '@rollup/rollup-freebsd-arm64': 4.53.3 - '@rollup/rollup-freebsd-x64': 4.53.3 - '@rollup/rollup-linux-arm-gnueabihf': 4.53.3 - '@rollup/rollup-linux-arm-musleabihf': 4.53.3 - '@rollup/rollup-linux-arm64-gnu': 4.53.3 - '@rollup/rollup-linux-arm64-musl': 4.53.3 - '@rollup/rollup-linux-loong64-gnu': 4.53.3 - '@rollup/rollup-linux-ppc64-gnu': 4.53.3 - '@rollup/rollup-linux-riscv64-gnu': 4.53.3 - '@rollup/rollup-linux-riscv64-musl': 4.53.3 - '@rollup/rollup-linux-s390x-gnu': 4.53.3 - '@rollup/rollup-linux-x64-gnu': 4.53.3 - '@rollup/rollup-linux-x64-musl': 4.53.3 - '@rollup/rollup-openharmony-arm64': 4.53.3 - '@rollup/rollup-win32-arm64-msvc': 4.53.3 - '@rollup/rollup-win32-ia32-msvc': 4.53.3 - '@rollup/rollup-win32-x64-gnu': 4.53.3 - '@rollup/rollup-win32-x64-msvc': 4.53.3 + '@rollup/rollup-android-arm-eabi': 4.54.0 + '@rollup/rollup-android-arm64': 4.54.0 + '@rollup/rollup-darwin-arm64': 4.54.0 + '@rollup/rollup-darwin-x64': 4.54.0 + '@rollup/rollup-freebsd-arm64': 4.54.0 + '@rollup/rollup-freebsd-x64': 4.54.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.54.0 + '@rollup/rollup-linux-arm-musleabihf': 4.54.0 + '@rollup/rollup-linux-arm64-gnu': 4.54.0 + '@rollup/rollup-linux-arm64-musl': 4.54.0 + '@rollup/rollup-linux-loong64-gnu': 4.54.0 + '@rollup/rollup-linux-ppc64-gnu': 4.54.0 + '@rollup/rollup-linux-riscv64-gnu': 4.54.0 + '@rollup/rollup-linux-riscv64-musl': 4.54.0 + '@rollup/rollup-linux-s390x-gnu': 4.54.0 + '@rollup/rollup-linux-x64-gnu': 4.54.0 + '@rollup/rollup-linux-x64-musl': 4.54.0 + '@rollup/rollup-openharmony-arm64': 4.54.0 + '@rollup/rollup-win32-arm64-msvc': 4.54.0 + '@rollup/rollup-win32-ia32-msvc': 4.54.0 + '@rollup/rollup-win32-x64-gnu': 4.54.0 + '@rollup/rollup-win32-x64-msvc': 4.54.0 fsevents: 2.3.3 run-parallel@1.2.0: @@ -4326,11 +4313,11 @@ snapshots: tailwind-merge@2.6.0: {} - tailwindcss-animate@1.0.7(tailwindcss@3.4.18): + tailwindcss-animate@1.0.7(tailwindcss@3.4.19): dependencies: - tailwindcss: 3.4.18 + tailwindcss: 3.4.19 - tailwindcss@3.4.18: + tailwindcss@3.4.19: dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -4389,13 +4376,13 @@ snapshots: dependencies: prelude-ls: 1.2.1 - typescript-eslint@8.48.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3): + typescript-eslint@8.50.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.48.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/parser': 8.48.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.48.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.48.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) - eslint: 9.39.1(jiti@1.21.7) + '@typescript-eslint/eslint-plugin': 8.50.1(@typescript-eslint/parser@8.50.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/parser': 8.50.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.50.1(typescript@5.9.3) + '@typescript-eslint/utils': 8.50.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + eslint: 9.39.2(jiti@1.21.7) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -4404,9 +4391,9 @@ snapshots: undici-types@6.21.0: {} - update-browserslist-db@1.1.4(browserslist@4.28.0): + update-browserslist-db@1.2.3(browserslist@4.28.1): dependencies: - browserslist: 4.28.0 + browserslist: 4.28.1 escalade: 3.2.0 picocolors: 1.1.1 @@ -4461,13 +4448,13 @@ snapshots: d3-time: 3.1.0 d3-timer: 3.0.1 - vite@5.4.21(@types/node@22.19.1): + vite@5.4.21(@types/node@22.19.3): dependencies: esbuild: 0.21.5 postcss: 8.5.6 - rollup: 4.53.3 + rollup: 4.54.0 optionalDependencies: - '@types/node': 22.19.1 + '@types/node': 22.19.3 fsevents: 2.3.3 which@2.0.2: diff --git a/src/App.tsx b/src/App.tsx index d089944..2341da2 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -7,18 +7,16 @@ import { BrowserRouter, Routes, Route } from "react-router-dom"; import { ThemeProvider } from "@/components/ThemeProvider"; import Index from "./pages/Index"; import NotFound from "./pages/NotFound"; -import FairUsagePolicy from "./pages/FairUsagePolicy"; // Docs pages import DocsLayout from "./pages/docs/DocsLayout"; import Introduction from "./pages/docs/Introduction"; import QuickStart from "./pages/docs/QuickStart"; -import Docker from "./pages/docs/Docker"; +import CLI from "./pages/docs/CLI"; import Configuration from "./pages/docs/Configuration"; import SDK from "./pages/docs/SDK"; -import OIDC from "./pages/docs/OIDC"; -import Organizations from "./pages/docs/Organizations"; -import Users from "./pages/docs/Users"; +import Widgets from "./pages/docs/Widgets"; +import Detector from "./pages/docs/Detector"; const queryClient = new QueryClient(); @@ -31,18 +29,16 @@ const App = () => ( } /> - } /> {/* Documentation routes */} }> } /> } /> - } /> + } /> } /> } /> - } /> - } /> - } /> + } /> + } /> {/* ADD ALL CUSTOM ROUTES ABOVE THE CATCH-ALL "*" ROUTE */} diff --git a/src/components/Features.tsx b/src/components/Features.tsx index dc93c33..3da0059 100644 --- a/src/components/Features.tsx +++ b/src/components/Features.tsx @@ -1,48 +1,48 @@ import React from 'react'; -import { Building2, Key, Users, Shield, Fingerprint, Container, Code2, Zap } from 'lucide-react'; +import { Activity, Wifi, Globe, Bell, Server, Code2, Container, Zap } from 'lucide-react'; import { cn } from '@/lib/utils'; const features = [ { - icon: Building2, - title: 'Organization Management', - description: 'Multi-tenant architecture with full organization lifecycle management. Invite members, assign roles, and transfer ownership.' + icon: Activity, + title: 'Port Detection', + description: 'Automatically detect and monitor open ports. Support for HTTP, HTTPS, SSH, FTP, SMTP, MySQL, PostgreSQL, MongoDB, and Redis.' }, { - icon: Key, - title: 'OpenID Connect Provider', - description: 'Full OIDC compliance for third-party app integration. Authorization code flow with PKCE, token refresh, and revocation.' + icon: Wifi, + title: 'Local Network Scanning', + description: 'Scan your local network to discover services. Identify service types automatically based on port signatures and responses.' }, { - icon: Users, - title: 'User Management', - description: 'Complete user lifecycle from registration to profile management. Support for email/password, magic links, and API tokens.' + icon: Globe, + title: 'Status Widgets', + description: 'Embeddable web components for your status page. Display real-time uptime status anywhere with a simple script tag.' }, { - icon: Shield, - title: 'Role-Based Access Control', - description: 'Fine-grained permissions with admin, member, and custom roles. Control access at organization and application level.' + icon: Bell, + title: 'Instant Alerts', + description: 'Get notified immediately when services go down. Configure alert thresholds and notification channels for your team.' }, { - icon: Fingerprint, - title: 'Two-Factor Authentication', - description: 'Enhanced security with 2FA support. JWT-based sessions with automatic refresh and device management.' + icon: Server, + title: 'Service Discovery', + description: 'Automatic service type identification. Detect HTTP servers, databases, mail servers, and more with intelligent probing.' }, { icon: Container, - title: 'Deploy Anywhere', - description: 'Self-host with our Docker image or use idp.global for free. Your digital identity, your choice of infrastructure.' + title: 'Self-Host Ready', + description: 'Deploy with Docker or run the CLI locally. Full control over your monitoring infrastructure with zero dependencies.' }, { icon: Code2, title: 'TypeScript SDK', - description: 'Type-safe client libraries for browser and Node.js. Real-time updates via WebSocket with typed API requests.' + description: 'Type-safe client libraries for Node.js and browser. Programmatic access to all monitoring features and status data.' }, { icon: Zap, title: 'Open Source', - description: 'MIT licensed and fully transparent. Community-driven development hosted on code.foss.global with no vendor lock-in.' + description: 'MIT licensed and fully transparent. Community-driven development with no vendor lock-in or hidden fees.' } ]; @@ -52,12 +52,12 @@ const Features = () => {
{/* Section Header */}
-
Platform Capabilities
+
Monitoring Capabilities

- Enterprise Identity, Open Source Freedom + Complete Uptime Visibility

- Everything you need to manage authentication, users, and organizations for your applications. + Everything you need to monitor your infrastructure and keep your services running.

@@ -72,14 +72,14 @@ const Features = () => { "group p-6 rounded-xl border border-border/50 bg-card", "transition-all duration-300 ease-out", "hover:border-border hover:shadow-lg hover:-translate-y-1", - "dark:hover:shadow-[0_0_30px_rgba(59,130,246,0.1)]", + "dark:hover:shadow-[0_0_30px_rgba(16,185,129,0.1)]", "animate-fade-in-up" )} style={{ animationDelay: `${index * 100}ms` }} > {/* Icon Container */} -
- +
+

{feature.title}

{feature.description}

diff --git a/src/components/Footer.tsx b/src/components/Footer.tsx index 03cf1b9..b8a9d68 100644 --- a/src/components/Footer.tsx +++ b/src/components/Footer.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { Link } from 'react-router-dom'; -import { Globe, Github, Twitter, Linkedin } from 'lucide-react'; +import { Activity, Github, Twitter, Linkedin } from 'lucide-react'; const Footer = () => { return ( @@ -11,15 +11,15 @@ const Footer = () => { {/* Brand Column */}
- - idp.global + + uptime.link

- Open Source Identity Provider for SMEs and enterprises. MIT Licensed. + Open Source uptime monitoring with local network detection. MIT Licensed.

@@ -59,8 +59,8 @@ const Footer = () => {
  • - - Sign In + + Dashboard
  • @@ -88,7 +88,7 @@ const Footer = () => {
  • - + Source Code
  • diff --git a/src/components/Hero.tsx b/src/components/Hero.tsx index bf2c835..ab8c8ff 100644 --- a/src/components/Hero.tsx +++ b/src/components/Hero.tsx @@ -3,14 +3,14 @@ import React from 'react'; import { Link } from 'react-router-dom'; import { Button } from '@/components/ui/button'; import { Card } from '@/components/ui/card'; -import { Building2, Users, Key, Shield, CheckCircle2 } from 'lucide-react'; +import { Activity, Wifi, Globe, Bell, CheckCircle2 } from 'lucide-react'; const Hero = () => { return (
    {/* Subtle background glow */}
    -
    +
    @@ -19,21 +19,18 @@ const Hero = () => { {/* Content */}
    -
    +
    - - + + - Open Source Identity Provider + Open Source Uptime Monitoring

    - Your Digital Identity, Forever Free + Monitor Everything, Miss Nothing

    - Get your free digital passport on idp.global. An Open Source Identity Provider with OIDC, organization management, and RBAC. Self-host or use our free SaaS.* -

    -

    - * Fair Usage Policy applies + Open Source uptime monitoring with local network detection, automatic service discovery, and embeddable status widgets. Self-host or use our free platform.

    @@ -42,7 +39,7 @@ const Hero = () => { className="h-12 px-6 bg-foreground text-background hover:bg-foreground/90 font-medium rounded-lg transition-all duration-200 hover:-translate-y-0.5" asChild > - Get Your Free Identity + Start Monitoring
    - {/* Feature Preview Card */} + {/* Status Preview Card */}
    {/* Glow effect behind card */} -
    +
    {/* Header */}
    - Identity Provider + Status Dashboard - idp.global + uptime.link
    - {/* Features Grid */} + {/* Status Grid */}
    - -
    Organizations
    -
    Multi-tenant support
    + +
    Port Detection
    +
    HTTP, SSH, DB ports
    - -
    User Management
    -
    RBAC & invitations
    + +
    Local Network
    +
    Scan & discover
    - -
    OIDC Provider
    -
    SSO for your apps
    + +
    Status Widgets
    +
    Embed anywhere
    - -
    2FA & Security
    -
    JWT-based auth
    + +
    Alerts
    +
    Instant notifications
    - {/* Code snippet */} -
    -
    Quick Integration
    -
    - - import {'{ IdpClient }'} from '@idp.global/idpclient' - + {/* Service Status */} +
    +
    Live Status
    +
    +
    + api.example.com + + + Operational + +
    +
    + db.internal:5432 + + + Operational + +
    @@ -110,7 +118,7 @@ const Hero = () => { MIT Licensed
    - Self-host or Free SaaS + 99.9% uptime
    diff --git a/src/components/HowItWorks.tsx b/src/components/HowItWorks.tsx index f003551..ef4d750 100644 --- a/src/components/HowItWorks.tsx +++ b/src/components/HowItWorks.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { Link } from 'react-router-dom'; -import { ArrowRight, Container, Building2, Key, Rocket } from 'lucide-react'; +import { ArrowRight, Download, Wifi, Settings, BarChart3 } from 'lucide-react'; import { Card, CardContent } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { cn } from '@/lib/utils'; @@ -9,27 +9,27 @@ import { cn } from '@/lib/utils'; const steps = [ { number: '01', - title: 'Deploy Your Instance', - description: "Pull our Docker image and deploy in minutes. Configure with environment variables for MongoDB and your domain.", - icon: Container + title: 'Install the CLI', + description: "Install the uptime.link CLI via npm or run our Docker container. Get up and running in under a minute.", + icon: Download }, { number: '02', - title: 'Set Up Organizations', - description: "Create organizations for your teams or clients. Invite members and assign roles with granular permissions.", - icon: Building2 + title: 'Scan Your Network', + description: "Run the detector to scan your local network. Automatically discover running services and open ports.", + icon: Wifi }, { number: '03', - title: 'Register Your Apps', - description: 'Add your applications as OIDC clients. Get client IDs and secrets for secure OAuth 2.0 authentication.', - icon: Key + title: 'Configure Monitors', + description: 'Set up monitoring for your endpoints. Define check intervals, timeout thresholds, and alert rules.', + icon: Settings }, { number: '04', - title: 'Integrate & Launch', - description: 'Use our TypeScript SDK or standard OIDC endpoints. Your users can now authenticate across all your services.', - icon: Rocket + title: 'Track & Alert', + description: 'View real-time status dashboards. Embed status widgets on your site and get instant downtime alerts.', + icon: BarChart3 } ]; @@ -41,10 +41,10 @@ const HowItWorks = () => {
    Getting Started

    - From Zero to SSO in Minutes + Start Monitoring in Minutes

    - Deploy your own identity provider and integrate with your applications seamlessly + From installation to full uptime visibility in four simple steps

    @@ -64,8 +64,8 @@ const HowItWorks = () => { {/* Header with icon and step number */}
    -
    - +
    +
    {step.number} @@ -73,7 +73,7 @@ const HowItWorks = () => {
    {/* Content */} -

    +

    {step.title}

    @@ -82,7 +82,7 @@ const HowItWorks = () => { {/* Progress bar */}

    -
    +
    diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index b94f898..9c12d48 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -3,7 +3,7 @@ import React, { useState, useEffect } from 'react'; import { Link } from 'react-router-dom'; import { cn } from '@/lib/utils'; import { Button } from '@/components/ui/button'; -import { Globe, Menu } from 'lucide-react'; +import { Activity, Menu } from 'lucide-react'; import { ThemeToggle } from '@/components/ThemeToggle'; interface NavbarProps extends React.HTMLAttributes {} @@ -31,8 +31,8 @@ const Navbar = ({ className, ...props }: NavbarProps) => {
    {/* Logo */} - - idp.global + + uptime.link {/* Desktop Navigation */} @@ -71,7 +71,7 @@ const Navbar = ({ className, ...props }: NavbarProps) => { className="h-8 px-4 bg-foreground text-background hover:bg-foreground/90 dark:bg-foreground dark:text-background dark:hover:bg-foreground/90 font-medium" asChild > - Sign In + Dashboard
    diff --git a/src/pages/FairUsagePolicy.tsx b/src/pages/FairUsagePolicy.tsx deleted file mode 100644 index 19e9622..0000000 --- a/src/pages/FairUsagePolicy.tsx +++ /dev/null @@ -1,231 +0,0 @@ -import React from 'react'; -import { Link } from 'react-router-dom'; -import { Globe, ArrowLeft } from 'lucide-react'; -import { Button } from '@/components/ui/button'; -import { ThemeToggle } from '@/components/ThemeToggle'; - -const FairUsagePolicy = () => { - return ( -
    - {/* Header */} -
    -
    - - - idp.global - -
    - - -
    -
    -
    - - {/* Content */} -
    - - -
    -

    - Fair Usage Policy -

    -

    - Last updated: December 2024 -

    - -
    -
    -

    Overview

    -

    - idp.global provides a free, Open Source Identity Provider platform for individuals, - developers, and organizations. To ensure the service remains available, performant, - and secure for all users, we have established this Fair Usage Policy. By using - idp.global, you agree to comply with these guidelines. -

    -
    - -
    -

    Acceptable Use

    -

    - You may use idp.global for: -

    -
      -
    • Personal digital identity management
    • -
    • Authentication for your applications and services
    • -
    • Organization and team management
    • -
    • Development, testing, and production workloads
    • -
    • Integration via our OIDC/OAuth 2.0 endpoints
    • -
    -
    - -
    -

    Prohibited Activities

    -

    - The following activities are strictly prohibited: -

    - -

    Illegal Activities

    -
      -
    • Using the service for any unlawful purpose or in violation of any applicable laws
    • -
    • Identity theft, fraud, or impersonation of others
    • -
    • Distribution of malware, phishing, or other malicious content
    • -
    • Money laundering or financing of illegal activities
    • -
    • Violation of intellectual property rights
    • -
    - -

    Service Abuse

    -
      -
    • Denial of Service (DoS) or Distributed Denial of Service (DDoS) attacks
    • -
    • Excessive API requests designed to overload or disrupt the service
    • -
    • Automated account creation (bot registrations), other than explicitly designed for by the platform
    • -
    • Circumventing rate limits or security measures
    • -
    • Scraping, crawling, or harvesting user data
    • -
    • Attempting to gain unauthorized access to other users' accounts or data
    • -
    - -

    Harmful Content & Behavior

    -
      -
    • Harassment, abuse, or threats against other users
    • -
    • Spam or unsolicited bulk communications
    • -
    • Distribution of harmful, offensive, or illegal content
    • -
    • Creating accounts for the purpose of abusing invitations or referrals
    • -
    -
    - -
    -

    Rate Limits

    -

    - To ensure fair access for all users, the following rate limits apply: -

    -
      -
    • API requests are subject to reasonable rate limiting
    • -
    • Authentication attempts are limited to prevent brute-force attacks
    • -
    • Bulk operations (invitations, exports) may be throttled
    • -
    -

    - If you require higher limits for legitimate use cases, please contact us to discuss - enterprise options or self-hosting. -

    -
    - -
    -

    Resource Limits

    -

    - Free accounts on the hosted platform are subject to reasonable resource limits: -

    -
      -
    • Organizations per user: Fair use, no hard limit for legitimate purposes
    • -
    • Members per organization: Fair use, contact us for large teams
    • -
    • API tokens per user: Reasonable limits apply
    • -
    • Storage: Profile data and authentication records only
    • -
    -
    - -
    -

    Our Commitment

    -

    - We believe that digital identity is a fundamental right. We will always try, to the best - of our conscience, to not lock anyone out of the platform. We strive to tolerate different - viewpoints and will not discriminate based on personal beliefs, political opinions, or - other lawful expressions. -

    -

    - That said, in the end, all decisions regarding this platform come down to our own judgment. - We are human, and while we aim to be fair and consistent, we cannot guarantee that our - decisions will align with everyone's expectations. -

    -

    - If you have any concerns about relying on our judgment, or if you simply prefer complete - autonomy over your identity infrastructure, we strongly encourage you to{' '} - - self-host your own instance - . - The software is fully Open Source under the MIT License, and self-hosted instances - operate entirely under your own control with no dependency on our decisions. -

    -
    - -
    -

    Enforcement

    -

    - Violations of this Fair Usage Policy may result in: -

    -
      -
    • Warning notifications
    • -
    • Temporary rate limiting or service restrictions
    • -
    • Suspension of account access
    • -
    • Permanent termination of accounts
    • -
    • Reporting to appropriate authorities for illegal activities
    • -
    -

    - We reserve the right to take action at our discretion to protect the service and its users. -

    -
    - -
    -

    Self-Hosting Alternative

    -

    - idp.global is Open Source (MIT License). If your use case exceeds the fair usage - guidelines of our hosted platform, you are welcome to{' '} - - self-host your own instance - {' '} - without any restrictions. Self-hosted instances are not subject to this policy. -

    -
    - -
    -

    Reporting Violations

    -

    - If you become aware of any violations of this policy, please report them to{' '} - - abuse@idp.global - {' '} - or through our{' '} - - community forum - . -

    -
    - -
    -

    Changes to This Policy

    -

    - We may update this Fair Usage Policy from time to time. Continued use of the service - after changes constitutes acceptance of the updated policy. Significant changes will - be announced through our usual communication channels. -

    -
    - -
    -

    Contact

    -

    - For questions about this policy or to discuss your specific use case, please contact - us at{' '} - - hello@task.vc - . -

    -
    -
    -
    - - {/* Footer */} -
    -

    - © {new Date().getFullYear()} Task Venture Capital GmbH. All rights reserved. -

    -
    -
    -
    - ); -}; - -export default FairUsagePolicy; diff --git a/src/pages/docs/CLI.tsx b/src/pages/docs/CLI.tsx new file mode 100644 index 0000000..e10a172 --- /dev/null +++ b/src/pages/docs/CLI.tsx @@ -0,0 +1,160 @@ +import React from 'react'; +import { Link } from 'react-router-dom'; +import { Button } from '@/components/ui/button'; +import { ArrowRight } from 'lucide-react'; + +const CLI = () => { + return ( +
    +
    +

    CLI

    +

    + The uptime.link command-line interface for managing monitors and scanning networks. +

    +
    + + {/* Installation */} +
    +

    Installation

    +

    + Install the CLI globally: +

    +
    + npm install -g @uptime.link/cli +
    +

    + Verify the installation: +

    +
    + uptime --version +
    +
    + + {/* Commands */} +
    +

    Commands

    + +
    + {/* scan */} +
    +

    uptime scan

    +

    + Scan the local network to discover running services. +

    +
    +
    {`uptime scan [options]
    +
    +Options:
    +  --range       IP range to scan (default: local subnet)
    +  --ports       Comma-separated list of ports to check
    +  --timeout       Connection timeout in milliseconds
    +  --json              Output results as JSON`}
    +
    +
    + + {/* add */} +
    +

    uptime add

    +

    + Add an endpoint to monitor. +

    +
    +
    {`uptime add  [options]
    +
    +Options:
    +  --interval     Check interval in seconds (default: 60)
    +  --timeout       Request timeout in milliseconds
    +  --name      Friendly name for the endpoint
    +  --alert    Webhook URL for alerts`}
    +
    +
    + + {/* remove */} +
    +

    uptime remove

    +

    + Remove an endpoint from monitoring. +

    +
    +
    {`uptime remove `}
    +
    +
    + + {/* status */} +
    +

    uptime status

    +

    + Show status of all monitored endpoints. +

    +
    +
    {`uptime status [options]
    +
    +Options:
    +  --json              Output results as JSON
    +  --watch             Continuously update status`}
    +
    +
    + + {/* check */} +
    +

    uptime check

    +

    + Perform a one-time check on an endpoint. +

    +
    +
    {`uptime check  [options]
    +
    +Options:
    +  --timeout       Request timeout in milliseconds
    +  --verbose           Show detailed response info`}
    +
    +
    +
    +
    + + {/* Configuration */} +
    +

    Configuration File

    +

    + The CLI stores configuration in ~/.uptime.link/config.json: +

    +
    +
    {`{
    +  "endpoints": [
    +    {
    +      "url": "https://api.example.com",
    +      "name": "API Server",
    +      "interval": 60,
    +      "timeout": 5000
    +    }
    +  ],
    +  "alerts": {
    +    "webhook": "https://hooks.slack.com/..."
    +  }
    +}`}
    +
    +
    + + {/* Next steps */} +
    +

    Next Steps

    +
    + + +
    +
    +
    + ); +}; + +export default CLI; diff --git a/src/pages/docs/Configuration.tsx b/src/pages/docs/Configuration.tsx index aa7b9c9..7360d49 100644 --- a/src/pages/docs/Configuration.tsx +++ b/src/pages/docs/Configuration.tsx @@ -1,173 +1,195 @@ import React from 'react'; import { Link } from 'react-router-dom'; import { Button } from '@/components/ui/button'; -import { ArrowRight, ArrowLeft } from 'lucide-react'; - -const CodeBlock = ({ children, title }: { children: string; title?: string }) => ( -
    - {title && ( -
    - {title} -
    - )} -
    -      {children}
    -    
    -
    -); +import { ArrowRight } from 'lucide-react'; const Configuration = () => { return (
    - {/* Header */}
    -

    - Configuration -

    -

    - Configure your idp.global instance for production use. +

    Configuration

    +

    + Configure uptime.link for your monitoring needs.

    - {/* Core Configuration */} + {/* Environment Variables */}
    -

    Core Configuration

    +

    Environment Variables

    - idp.global is configured via environment variables. These are the essential settings: -

    - -

    Database

    - -{`# MongoDB connection string -# Supports replica sets and authentication -MONGODB_URL=mongodb://user:pass@host:27017/idp?authSource=admin - -# For MongoDB Atlas -MONGODB_URL=mongodb+srv://user:pass@cluster.mongodb.net/idp`} - - -

    Server

    - -{`# Public URL of your instance (required for OAuth redirects) -IDP_BASEURL=https://idp.yourdomain.com - -# Instance name shown in UI -INSTANCE_NAME=My Company IDP`} - -
    - - {/* JWT Configuration */} -
    -

    JWT & Security

    -

    - idp.global uses RS256 (RSA) for JWT signing. Keys are automatically generated and rotated. -

    -
    -

    Key Management

    -
      -
    • RSA key pairs are auto-generated on first startup
    • -
    • Public keys are available at /.well-known/jwks.json
    • -
    • Keys are stored in MongoDB for persistence across restarts
    • -
    • Automatic key rotation can be configured
    • -
    -
    -
    - - {/* OIDC Configuration */} -
    -

    OIDC Endpoints

    -

    - The following OIDC endpoints are automatically configured based on your IDP_BASEURL: + Configure the CLI and SDK using environment variables:

    - - + + + - - + + + - - + + + - - + + + - - + + + - - - - - - + + +
    EndpointPathVariableDescriptionDefault
    Discovery/.well-known/openid-configurationUPTIME_API_URLAPI server URLhttps://api.uptime.link
    JWKS/.well-known/jwks.jsonUPTIME_API_KEYAPI authentication key-
    Authorization/oauth/authorizeUPTIME_CHECK_INTERVALDefault check interval (seconds)60
    Token/oauth/tokenUPTIME_TIMEOUTRequest timeout (ms)5000
    UserInfo/oauth/userinfo
    Revocation/oauth/revokeUPTIME_ALERT_WEBHOOKWebhook URL for alerts-
    - {/* Supported Scopes */} + {/* Config File */}
    -

    Supported OAuth Scopes

    +

    Configuration File

    +

    + Create a uptime.config.json file in your project root: +

    +
    +
    {`{
    +  "endpoints": [
    +    {
    +      "url": "https://api.example.com/health",
    +      "name": "API Health",
    +      "interval": 30,
    +      "timeout": 5000,
    +      "expectedStatus": 200
    +    },
    +    {
    +      "url": "https://db.internal:5432",
    +      "name": "Database",
    +      "type": "tcp",
    +      "interval": 60
    +    }
    +  ],
    +  "alerts": {
    +    "webhook": "https://hooks.slack.com/services/...",
    +    "email": "ops@example.com",
    +    "threshold": 3
    +  },
    +  "detector": {
    +    "ports": [80, 443, 22, 3306, 5432, 27017, 6379],
    +    "timeout": 2000
    +  }
    +}`}
    +
    +
    + + {/* Endpoint Configuration */} +
    +

    Endpoint Options

    - + + - - + + + - - + + + - - + + + - - + + + - - + + + + + + + + + + + + +
    ScopeOptionType Description
    openidRequired for OIDC. Returns sub claim.urlstringEndpoint URL (required)
    profileUser's name and profile informationnamestringFriendly display name
    emailUser's email address and verification statustype"http" | "tcp"Check type (default: http)
    organizationsUser's organization membershipsintervalnumberCheck interval in seconds
    rolesUser's roles within organizationstimeoutnumberRequest timeout in milliseconds
    expectedStatusnumberExpected HTTP status code
    headersobjectCustom HTTP headers
    - {/* Navigation */} -
    - - + {/* Alert Configuration */} +
    +

    Alert Configuration

    +

    + Configure how you receive downtime notifications: +

    +
    +
    {`{
    +  "alerts": {
    +    // Webhook URL (Slack, Discord, etc.)
    +    "webhook": "https://hooks.slack.com/services/...",
    +
    +    // Email notifications
    +    "email": "ops@example.com",
    +
    +    // Number of failures before alerting
    +    "threshold": 3,
    +
    +    // Minimum time between alerts (seconds)
    +    "cooldown": 300
    +  }
    +}`}
    +
    +
    + + {/* Next steps */} +
    +

    Next Steps

    +
    + + +
    ); diff --git a/src/pages/docs/Detector.tsx b/src/pages/docs/Detector.tsx new file mode 100644 index 0000000..47c7ea8 --- /dev/null +++ b/src/pages/docs/Detector.tsx @@ -0,0 +1,198 @@ +import React from 'react'; +import { Link } from 'react-router-dom'; +import { Button } from '@/components/ui/button'; +import { ArrowRight } from 'lucide-react'; + +const Detector = () => { + return ( +
    +
    +

    Network Detector

    +

    + Scan your local network to discover services and open ports automatically. +

    +
    + + {/* Overview */} +
    +

    Overview

    +

    + The detector module scans network ranges and identifies running services based on open ports + and protocol responses. It supports automatic identification of common service types. +

    +
    + + {/* Supported Services */} +
    +

    Supported Services

    +

    + The detector can automatically identify these service types: +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ServiceDefault PortDetection Method
    HTTP80HTTP response headers
    HTTPS443TLS handshake + HTTP
    SSH22SSH banner
    FTP21FTP banner
    SMTP25, 587SMTP greeting
    MySQL3306MySQL handshake packet
    PostgreSQL5432PostgreSQL protocol
    MongoDB27017MongoDB wire protocol
    Redis6379Redis PING response
    +
    +
    + + {/* CLI Usage */} +
    +

    CLI Usage

    +
    +
    {`# Scan local network
    +uptime scan
    +
    +# Scan specific IP range
    +uptime scan --range 192.168.1.0/24
    +
    +# Scan specific ports
    +uptime scan --ports 80,443,22,3306,5432
    +
    +# Output as JSON
    +uptime scan --json
    +
    +# With custom timeout
    +uptime scan --timeout 3000`}
    +
    +
    + + {/* SDK Usage */} +
    +

    SDK Usage

    +
    +
    {`import { Detector } from '@uptime.link/sdk';
    +
    +const detector = new Detector();
    +
    +// Scan network
    +const services = await detector.scan({
    +  range: '192.168.1.0/24',
    +  ports: [80, 443, 22, 3306, 5432, 27017, 6379],
    +  timeout: 2000,
    +  concurrent: 100  // Max concurrent connections
    +});
    +
    +// Process results
    +for (const service of services) {
    +  console.log(\`Found \${service.type} at \${service.host}:\${service.port}\`);
    +}
    +
    +// Check a single port
    +const isOpen = await detector.checkPort('192.168.1.1', 22);
    +
    +// Identify service type
    +const type = await detector.identifyService('192.168.1.1', 22);
    +// Returns: 'ssh' | 'http' | 'mysql' | etc.`}
    +
    +
    + + {/* Service Detection */} +
    +

    Service Detection Logic

    +

    + The detector uses multiple methods to identify services: +

    +
      +
    1. Port matching: Common ports are checked first (e.g., 22 = SSH, 80 = HTTP)
    2. +
    3. Banner grabbing: Reads the initial response from the service
    4. +
    5. Protocol probing: Sends protocol-specific requests to confirm service type
    6. +
    7. TLS detection: Attempts TLS handshake for encrypted services
    8. +
    +
    + + {/* Output Format */} +
    +

    Output Format

    +

    + Each discovered service includes: +

    +
    +
    {`{
    +  "host": "192.168.1.10",
    +  "port": 3306,
    +  "open": true,
    +  "type": "mysql",
    +  "version": "8.0.32",
    +  "banner": "5.7.42-log",
    +  "responseTime": 12,
    +  "tls": false
    +}`}
    +
    +
    + + {/* Next steps */} +
    +

    Next Steps

    +
    + + +
    +
    +
    + ); +}; + +export default Detector; diff --git a/src/pages/docs/Docker.tsx b/src/pages/docs/Docker.tsx deleted file mode 100644 index d7f63ee..0000000 --- a/src/pages/docs/Docker.tsx +++ /dev/null @@ -1,227 +0,0 @@ -import React from 'react'; -import { Link } from 'react-router-dom'; -import { Button } from '@/components/ui/button'; -import { ArrowRight, ArrowLeft } from 'lucide-react'; - -const CodeBlock = ({ children, title }: { children: string; title?: string }) => ( -
    - {title && ( -
    - {title} -
    - )} -
    -      {children}
    -    
    -
    -); - -const Docker = () => { - return ( -
    - {/* Header */} -
    -

    - Docker Deployment -

    -

    - Deploy idp.global on your own infrastructure using Docker. Full control over your - data with the same features as the hosted platform. -

    -
    - - {/* Prerequisites */} -
    -

    Prerequisites

    -
      -
    • Docker 20.10 or later
    • -
    • MongoDB 5.0 or later (local or cloud-hosted like MongoDB Atlas)
    • -
    • A domain name with SSL certificate (for production)
    • -
    • Minimum 1GB RAM, 10GB storage
    • -
    -
    - - {/* Quick Start */} -
    -

    Quick Start

    -

    - Pull and run the official Docker image: -

    - -{`# Pull the latest image -docker pull code.foss.global/idp.global/idp.global - -# Run with required environment variables -docker run -d \\ - --name idp-global \\ - -p 2999:2999 \\ - -e MONGODB_URL=mongodb://localhost:27017/idp \\ - -e IDP_BASEURL=https://idp.yourdomain.com \\ - -e INSTANCE_NAME=my-idp \\ - code.foss.global/idp.global/idp.global`} - -
    - - {/* Docker Compose */} -
    -

    Docker Compose

    -

    - For a complete setup including MongoDB, use Docker Compose: -

    - -{`version: '3.8' - -services: - idp: - image: code.foss.global/idp.global/idp.global - container_name: idp-global - restart: unless-stopped - ports: - - "2999:2999" - environment: - MONGODB_URL: mongodb://mongo:27017/idp - IDP_BASEURL: https://idp.yourdomain.com - INSTANCE_NAME: my-idp - depends_on: - - mongo - networks: - - idp-network - - mongo: - image: mongo:7 - container_name: idp-mongo - restart: unless-stopped - volumes: - - mongo-data:/data/db - networks: - - idp-network - -networks: - idp-network: - driver: bridge - -volumes: - mongo-data:`} - - -{`# Start all services -docker-compose up -d - -# View logs -docker-compose logs -f idp - -# Stop services -docker-compose down`} - -
    - - {/* Environment Variables */} -
    -

    Environment Variables

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    VariableRequiredDescription
    - MONGODB_URL - YesMongoDB connection string
    - IDP_BASEURL - YesPublic URL of your instance (with https://)
    - INSTANCE_NAME - NoDisplay name for this instance (default: idp.global)
    - SERVEZONE_PLATFORM_AUTHORIZATION - NoServeZone platform auth token (optional)
    -
    -
    - - {/* Reverse Proxy */} -
    -

    Reverse Proxy Setup

    -

    - For production, configure a reverse proxy with SSL. Here's an example nginx configuration: -

    - -{`server { - listen 443 ssl http2; - server_name idp.yourdomain.com; - - ssl_certificate /path/to/fullchain.pem; - ssl_certificate_key /path/to/privkey.pem; - - location / { - proxy_pass http://localhost:2999; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection 'upgrade'; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_cache_bypass $http_upgrade; - } -}`} - -
    - - {/* Health Check */} -
    -

    Health Check

    -

    - Verify your instance is running correctly: -

    - -{`# Check if the server is responding -curl https://idp.yourdomain.com - -# Check OIDC discovery endpoint -curl https://idp.yourdomain.com/.well-known/openid-configuration`} - -
    - - {/* Navigation */} -
    - - -
    -
    - ); -}; - -export default Docker; diff --git a/src/pages/docs/DocsLayout.tsx b/src/pages/docs/DocsLayout.tsx index 3532505..142e8a1 100644 --- a/src/pages/docs/DocsLayout.tsx +++ b/src/pages/docs/DocsLayout.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { Link, Outlet, useLocation } from 'react-router-dom'; import { cn } from '@/lib/utils'; -import { Globe, BookOpen, Rocket, Container, Code2, Key, Building2, Terminal, Users, ExternalLink } from 'lucide-react'; +import { Activity, BookOpen, Rocket, Terminal, Code2, Globe, Wifi, Settings, ExternalLink } from 'lucide-react'; import { ThemeToggle } from '@/components/ThemeToggle'; import { Button } from '@/components/ui/button'; @@ -14,24 +14,23 @@ const navigation = [ ] }, { - title: 'Deployment', + title: 'Installation', items: [ - { title: 'Docker', href: '/docs/docker', icon: Container }, - { title: 'Configuration', href: '/docs/configuration', icon: Terminal }, + { title: 'CLI', href: '/docs/cli', icon: Terminal }, + { title: 'Configuration', href: '/docs/configuration', icon: Settings }, ] }, { title: 'Integration', items: [ { title: 'TypeScript SDK', href: '/docs/sdk', icon: Code2 }, - { title: 'OIDC / OAuth 2.0', href: '/docs/oidc', icon: Key }, + { title: 'Status Widgets', href: '/docs/widgets', icon: Globe }, ] }, { title: 'Features', items: [ - { title: 'Organizations', href: '/docs/organizations', icon: Building2 }, - { title: 'User Management', href: '/docs/users', icon: Users }, + { title: 'Network Detector', href: '/docs/detector', icon: Wifi }, ] }, ]; @@ -45,8 +44,8 @@ const DocsLayout = () => {
    - - idp.global + + uptime.link
    / @@ -61,7 +60,7 @@ const DocsLayout = () => { Source @@ -69,7 +68,7 @@ const DocsLayout = () => {
    @@ -97,7 +96,7 @@ const DocsLayout = () => { className={cn( "flex items-center gap-2 px-2 py-1.5 text-sm rounded-md transition-colors", isActive - ? "bg-primary/10 text-primary font-medium" + ? "bg-emerald-500/10 text-emerald-600 dark:text-emerald-400 font-medium" : "text-muted-foreground hover:text-foreground hover:bg-muted" )} > diff --git a/src/pages/docs/Introduction.tsx b/src/pages/docs/Introduction.tsx index 47a6716..6fadef0 100644 --- a/src/pages/docs/Introduction.tsx +++ b/src/pages/docs/Introduction.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { Link } from 'react-router-dom'; import { Button } from '@/components/ui/button'; import { Card } from '@/components/ui/card'; -import { ArrowRight, Building2, Key, Users, Shield, Container, Code2 } from 'lucide-react'; +import { ArrowRight, Activity, Wifi, Globe, Bell, Server, Code2 } from 'lucide-react'; const Introduction = () => { return ( @@ -10,35 +10,35 @@ const Introduction = () => { {/* Header */}

    - idp.global Documentation + uptime.link Documentation

    - A modern, Open Source Identity Provider (IdP) for managing user authentication, - organizations, and role-based access control. Built with TypeScript for SMEs and enterprises. + Open Source uptime monitoring with local network detection, automatic service discovery, + and embeddable status widgets. Built with TypeScript.

    {/* Quick links */}
    - +

    Quick Start

    - Get up and running with idp.global in under 5 minutes. + Get up and running with uptime.link in under 5 minutes.

    - - + +
    -

    Docker Deployment

    +

    CLI Installation

    - Deploy your own instance with Docker in minutes. + Install the command-line tool for local monitoring.

    @@ -50,40 +50,40 @@ const Introduction = () => {
    {[ { - icon: Users, - title: 'User Management', - description: 'Email/password, magic links, API tokens, password reset, and device management.' + icon: Activity, + title: 'Port Detection', + description: 'Detect and monitor open ports for HTTP, SSH, databases, and more.' }, { - icon: Building2, - title: 'Organizations', - description: 'Multi-tenant architecture with member invitations and ownership transfer.' + icon: Wifi, + title: 'Network Scanning', + description: 'Scan local networks to discover running services automatically.' }, { - icon: Shield, - title: 'Role-Based Access', - description: 'Fine-grained RBAC with admin, member, and custom roles.' + icon: Globe, + title: 'Status Widgets', + description: 'Embeddable web components for real-time status display.' }, { - icon: Key, - title: 'OIDC Provider', - description: 'Full OpenID Connect compliance for third-party app SSO.' + icon: Bell, + title: 'Instant Alerts', + description: 'Get notified immediately when services go down.' }, { - icon: Container, - title: 'Self-Hostable', - description: 'Deploy anywhere with Docker or use our free hosted platform.' + icon: Server, + title: 'Service Discovery', + description: 'Automatic identification of service types (HTTP, DB, SSH).' }, { icon: Code2, title: 'TypeScript SDK', - description: 'Type-safe client libraries for browser and Node.js.' + description: 'Type-safe client library for programmatic access.' }, ].map((feature) => { const Icon = feature.icon; return (
    - +

    {feature.title}

    {feature.description}

    @@ -96,63 +96,42 @@ const Introduction = () => {

    Architecture

    - idp.global is built as a modular TypeScript monorepo with the following structure: + uptime.link is built as a modular TypeScript monorepo with the following packages:

    -
    -
    {`├── ts/                    # Server-side code (Node.js)
    -│   └── reception/         # Core identity management logic
    -├── ts_interfaces/         # Shared TypeScript interfaces
    -├── ts_idpclient/          # Browser/Node client library
    -├── ts_idpcli/             # Command-line interface tool
    -└── ts_web/                # Web frontend components`}
    +
    +
    {`├── api/              # API server package
    +├── cli/              # Command-line interface
    +├── detector/         # Network and port detection
    +├── interfaces/       # Shared TypeScript interfaces
    +└── webwidget/        # Embeddable status widgets`}
    - {/* Published packages */} + {/* Supported Services */}
    -

    NPM Packages

    -
    - - - - - - - - - - - - - - - - - - - - - -
    PackageDescription
    - @idp.global/interfaces - TypeScript interfaces for API contracts
    - @idp.global/idpclient - Client library for browser and Node.js
    - @idp.global/web - Web UI components
    +

    Supported Services

    +

    + The detector can automatically identify and monitor these service types: +

    +
    + {['HTTP/HTTPS', 'SSH', 'FTP', 'SMTP', 'MySQL', 'PostgreSQL', 'MongoDB', 'Redis'].map((service) => ( +
    + {service} +
    + ))}
    {/* CTA */}
    -
    diff --git a/src/pages/docs/OIDC.tsx b/src/pages/docs/OIDC.tsx deleted file mode 100644 index fc83516..0000000 --- a/src/pages/docs/OIDC.tsx +++ /dev/null @@ -1,224 +0,0 @@ -import React from 'react'; -import { Link } from 'react-router-dom'; -import { Button } from '@/components/ui/button'; -import { ArrowRight, ArrowLeft } from 'lucide-react'; - -const CodeBlock = ({ children, title }: { children: string; title?: string }) => ( -
    - {title && ( -
    - {title} -
    - )} -
    -      {children}
    -    
    -
    -); - -const OIDC = () => { - return ( -
    - {/* Header */} -
    -

    - OIDC / OAuth 2.0 -

    -

    - idp.global implements a full OpenID Connect provider. Use it for SSO across - your applications with standard OAuth 2.0 flows. -

    -
    - - {/* Discovery */} -
    -

    Discovery Document

    -

    - The OIDC discovery endpoint provides all configuration information: -

    - -{`GET https://idp.global/.well-known/openid-configuration`} - - -{`{ - "issuer": "https://idp.global", - "authorization_endpoint": "https://idp.global/oauth/authorize", - "token_endpoint": "https://idp.global/oauth/token", - "userinfo_endpoint": "https://idp.global/oauth/userinfo", - "jwks_uri": "https://idp.global/.well-known/jwks.json", - "revocation_endpoint": "https://idp.global/oauth/revoke", - "scopes_supported": ["openid", "profile", "email", "organizations", "roles"], - "response_types_supported": ["code"], - "grant_types_supported": ["authorization_code", "refresh_token"], - "code_challenge_methods_supported": ["S256"] -}`} - -
    - - {/* Register Your App */} -
    -

    Register Your Application

    -

    - Before integrating, register your application in the idp.global dashboard to get: -

    -
      -
    • Client ID - Your application's public identifier
    • -
    • Client Secret - Keep this secure, used for token exchange
    • -
    • Redirect URIs - Allowed callback URLs after authentication
    • -
    -
    - - {/* Authorization Code Flow */} -
    -

    Authorization Code Flow (with PKCE)

    -

    - The recommended flow for web and mobile applications. -

    - -

    Step 1: Generate PKCE Challenge

    - -{`// Generate code verifier (random string) -function generateCodeVerifier() { - const array = new Uint8Array(32); - crypto.getRandomValues(array); - return btoa(String.fromCharCode(...array)) - .replace(/\+/g, '-') - .replace(/\//g, '_') - .replace(/=/g, ''); -} - -// Generate code challenge from verifier -async function generateCodeChallenge(verifier) { - const encoder = new TextEncoder(); - const data = encoder.encode(verifier); - const hash = await crypto.subtle.digest('SHA-256', data); - return btoa(String.fromCharCode(...new Uint8Array(hash))) - .replace(/\+/g, '-') - .replace(/\//g, '_') - .replace(/=/g, ''); -} - -const codeVerifier = generateCodeVerifier(); -const codeChallenge = await generateCodeChallenge(codeVerifier); -// Store codeVerifier for later use`} - - -

    Step 2: Redirect to Authorization

    - -{`https://idp.global/oauth/authorize? - client_id=your-client-id& - redirect_uri=https://yourapp.com/callback& - response_type=code& - scope=openid profile email organizations& - state=random-state-value& - code_challenge=YOUR_CODE_CHALLENGE& - code_challenge_method=S256`} - - -

    Step 3: Handle Callback

    -

    - After user authenticates, they're redirected to your callback URL with an authorization code: -

    - -{`https://yourapp.com/callback?code=AUTHORIZATION_CODE&state=random-state-value`} - - -

    Step 4: Exchange Code for Tokens

    - -{`POST https://idp.global/oauth/token -Content-Type: application/x-www-form-urlencoded - -grant_type=authorization_code& -code=AUTHORIZATION_CODE& -redirect_uri=https://yourapp.com/callback& -client_id=your-client-id& -client_secret=your-client-secret& -code_verifier=YOUR_CODE_VERIFIER`} - - -{`{ - "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...", - "token_type": "Bearer", - "expires_in": 3600, - "refresh_token": "dGhpcyBpcyBhIHJlZnJlc2ggdG9rZW4...", - "id_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..." -}`} - -
    - - {/* UserInfo */} -
    -

    UserInfo Endpoint

    -

    - Retrieve user information using the access token: -

    - -{`GET https://idp.global/oauth/userinfo -Authorization: Bearer ACCESS_TOKEN`} - - -{`{ - "sub": "user-uuid-here", - "name": "John Doe", - "email": "john@example.com", - "email_verified": true, - "organizations": [ - { - "id": "org-uuid", - "name": "Acme Corp", - "slug": "acme", - "roles": ["admin", "member"] - } - ], - "roles": ["user"] -}`} - -
    - - {/* Token Refresh */} -
    -

    Refresh Tokens

    - -{`POST https://idp.global/oauth/token -Content-Type: application/x-www-form-urlencoded - -grant_type=refresh_token& -refresh_token=YOUR_REFRESH_TOKEN& -client_id=your-client-id& -client_secret=your-client-secret`} - -
    - - {/* Token Revocation */} -
    -

    Token Revocation

    - -{`POST https://idp.global/oauth/revoke -Content-Type: application/x-www-form-urlencoded - -token=TOKEN_TO_REVOKE& -client_id=your-client-id& -client_secret=your-client-secret`} - -
    - - {/* Navigation */} -
    - - -
    -
    - ); -}; - -export default OIDC; diff --git a/src/pages/docs/Organizations.tsx b/src/pages/docs/Organizations.tsx deleted file mode 100644 index 2c2ac6d..0000000 --- a/src/pages/docs/Organizations.tsx +++ /dev/null @@ -1,233 +0,0 @@ -import React from 'react'; -import { Link } from 'react-router-dom'; -import { Button } from '@/components/ui/button'; -import { ArrowRight, ArrowLeft } from 'lucide-react'; - -const CodeBlock = ({ children, title }: { children: string; title?: string }) => ( -
    - {title && ( -
    - {title} -
    - )} -
    -      {children}
    -    
    -
    -); - -const Organizations = () => { - return ( -
    - {/* Header */} -
    -

    - Organizations -

    -

    - idp.global supports multi-tenant architecture with organizations. Users can belong to - multiple organizations with different roles in each. -

    -
    - - {/* Concepts */} -
    -

    Key Concepts

    -
    -
    -

    Organization

    -

    - A container for users, roles, and applications. Typically represents a company, team, or project. -

    -
    -
    -

    Member

    -

    - A user who belongs to an organization. Members can have one or more roles. -

    -
    -
    -

    Role

    -

    - Defines permissions within an organization. Built-in roles include admin and member. -

    -
    -
    -

    Owner

    -

    - The user who created the organization. Has full control and can transfer ownership. -

    -
    -
    -
    - - {/* Creating Organizations */} -
    -

    Creating Organizations

    - -{`import { IdpClient } from '@idp.global/idpclient'; - -const idpClient = new IdpClient('https://idp.global'); - -// Create a new organization -const result = await idpClient.createOrganization( - 'Acme Corporation', // Display name - 'acme-corp', // URL-friendly slug (must be unique) - 'manifest' // Organization type -); - -if (result.resultingOrganization) { - console.log('Created:', result.resultingOrganization.id); - console.log('Slug:', result.resultingOrganization.slug); -}`} - -
    - - {/* Member Management */} -
    -

    Member Management

    - -

    Invite Members

    - -{`// Send invitation email to new member -await idpClient.requests.createInvitation.fire({ - jwt: await idpClient.getJwt(), - organizationId: 'org-uuid', - email: 'newmember@example.com', - roles: ['member'] // Roles to assign -}); - -// Invite as admin -await idpClient.requests.createInvitation.fire({ - jwt: await idpClient.getJwt(), - organizationId: 'org-uuid', - email: 'admin@example.com', - roles: ['admin', 'member'] -});`} - - -

    List Members

    - -{`const members = await idpClient.requests.getOrgMembers.fire({ - jwt: await idpClient.getJwt(), - organizationId: 'org-uuid' -}); - -for (const member of members.members) { - console.log(member.user.email, member.roles); -}`} - - -

    Update Member Roles

    - -{`await idpClient.requests.updateMemberRoles.fire({ - jwt: await idpClient.getJwt(), - organizationId: 'org-uuid', - userId: 'user-uuid', - roles: ['admin', 'member'] -});`} - - -

    Remove Members

    - -{`await idpClient.requests.removeMember.fire({ - jwt: await idpClient.getJwt(), - organizationId: 'org-uuid', - userId: 'user-uuid' -});`} - -
    - - {/* Role-Based Access */} -
    -

    Built-in Roles

    -
    - - - - - - - - - - - - - - - - - -
    RolePermissions
    admin - Full organization management: invite/remove members, manage roles, update settings, register apps -
    member - Basic access: view organization, access approved applications -
    -
    -
    - - {/* Ownership Transfer */} -
    -

    Ownership Transfer

    -

    - Organization owners can transfer ownership to another admin member: -

    - -{`await idpClient.requests.transferOwnership.fire({ - jwt: await idpClient.getJwt(), - organizationId: 'org-uuid', - newOwnerId: 'new-owner-user-uuid' -});`} - -
    - - {/* Organizations in JWT */} -
    -

    Organizations in JWT Claims

    -

    - When requesting the organizations scope, the user's organizations - are included in the ID token and userinfo response: -

    - -{`{ - "sub": "user-uuid", - "email": "user@example.com", - "organizations": [ - { - "id": "org-uuid-1", - "name": "Acme Corp", - "slug": "acme", - "roles": ["admin", "member"] - }, - { - "id": "org-uuid-2", - "name": "Other Org", - "slug": "other", - "roles": ["member"] - } - ] -}`} - -
    - - {/* Navigation */} -
    - - -
    -
    - ); -}; - -export default Organizations; diff --git a/src/pages/docs/QuickStart.tsx b/src/pages/docs/QuickStart.tsx index 6f25c02..377116a 100644 --- a/src/pages/docs/QuickStart.tsx +++ b/src/pages/docs/QuickStart.tsx @@ -1,179 +1,137 @@ import React from 'react'; import { Link } from 'react-router-dom'; import { Button } from '@/components/ui/button'; -import { ArrowRight, ArrowLeft, ExternalLink } from 'lucide-react'; - -const CodeBlock = ({ children, title }: { children: string; title?: string }) => ( -
    - {title && ( -
    - {title} -
    - )} -
    -      {children}
    -    
    -
    -); +import { ArrowRight, CheckCircle2 } from 'lucide-react'; const QuickStart = () => { return (
    - {/* Header */}
    -

    - Quick Start -

    -

    - Get started with idp.global in under 5 minutes. Choose between using our - free hosted platform or self-hosting with Docker. +

    Quick Start

    +

    + Get uptime.link running and monitoring your first endpoint in under 5 minutes.

    - {/* Option 1: Hosted Platform */} + {/* Prerequisites */}
    -

    Option 1: Use Free Hosted Platform

    -

    - The fastest way to get started. Create your free account on idp.global and start using - it immediately. No installation required. -

    -
    -
    - 1 -
    -

    Create your account

    -

    - Visit idp.global and sign up for a free account. -

    -
    -
    -
    - 2 -
    -

    Create an organization

    -

    - Set up your first organization and invite team members. -

    -
    -
    -
    - 3 -
    -

    Register your application

    -

    - Create an OAuth/OIDC client for your app and get your credentials. -

    -
    -
    -
    - -
    - - {/* Option 2: Self-Host */} -
    -

    Option 2: Self-Host with Docker

    -

    - Deploy your own instance for complete control over your data and infrastructure. -

    - -

    Prerequisites

    -
      -
    • Docker installed on your server
    • -
    • MongoDB instance (local or cloud)
    • -
    • A domain name pointing to your server
    • +

      Prerequisites

      +
        + {['Node.js 18+ or Docker', 'npm or pnpm package manager'].map((item) => ( +
      • + + {item} +
      • + ))}
      - -

      1. Pull the Docker image

      - -{`docker pull code.foss.global/idp.global/idp.global`} - - -

      2. Run the container

      - -{`docker run -d \\ - -p 2999:2999 \\ - -e MONGODB_URL=mongodb://your-mongo:27017/idp \\ - -e IDP_BASEURL=https://your-domain.com \\ - -e INSTANCE_NAME=my-idp \\ - code.foss.global/idp.global/idp.global`} - - -

      3. Access your instance

      -

      - Your idp.global instance is now running on port 2999. Configure your reverse proxy - (nginx, traefik, etc.) to handle HTTPS and route traffic to the container. -

      - -
    - {/* Integrate with your app */} + {/* Step 1 */}
    -

    Integrate with Your Application

    +

    1. Install the CLI

    - Once you have access to an idp.global instance, install the TypeScript client: + Install the uptime.link CLI globally using npm or pnpm:

    - - -{`npm install @idp.global/idpclient`} - - -

    Basic Usage

    - -{`import { IdpClient } from '@idp.global/idpclient'; - -// Initialize the client -const idpClient = new IdpClient('https://idp.global'); - -// Enable WebSocket connection for real-time updates -await idpClient.enableTypedSocket(); - -// Check if user is logged in -const isLoggedIn = await idpClient.determineLoginStatus(); - -if (isLoggedIn) { - // Get current user info - const userInfo = await idpClient.whoIs(); - console.log('User:', userInfo.user); - - // Get user's organizations - const orgs = await idpClient.getRolesAndOrganizations(); - console.log('Organizations:', orgs.organizations); -}`} - - - +
    + npm install -g @uptime.link/cli +
    +

    + Or with pnpm: +

    +
    + pnpm add -g @uptime.link/cli +
    - {/* Navigation */} -
    - - + {/* Step 2 */} +
    +

    2. Scan Your Network

    +

    + Run the detector to discover services on your local network: +

    +
    + uptime scan +
    +

    + This will scan common ports and detect running services like HTTP servers, databases, and more. +

    +
    + + {/* Step 3 */} +
    +

    3. Add a Monitor

    +

    + Add an endpoint to monitor: +

    +
    +
    {`uptime add https://api.example.com --interval 60`}
    +
    +

    + This adds the endpoint to your monitoring list with 60-second check intervals. +

    +
    + + {/* Step 4 */} +
    +

    4. View Status

    +

    + Check the status of all monitored endpoints: +

    +
    + uptime status +
    +

    + You'll see a table with the current status, response time, and uptime percentage for each endpoint. +

    +
    + + {/* Using the SDK */} +
    +

    Using the SDK

    +

    + For programmatic access, install the TypeScript SDK: +

    +
    + npm install @uptime.link/sdk +
    +
    +
    {`import { UptimeClient } from '@uptime.link/sdk';
    +
    +const client = new UptimeClient();
    +
    +// Check a single endpoint
    +const result = await client.check('https://api.example.com');
    +console.log(result.status, result.responseTime);
    +
    +// Scan local network
    +const services = await client.scanNetwork();
    +console.log('Found services:', services);`}
    +
    +
    + + {/* Next steps */} +
    +

    Next Steps

    +
    + + + +
    ); diff --git a/src/pages/docs/SDK.tsx b/src/pages/docs/SDK.tsx index 683ce45..02e2684 100644 --- a/src/pages/docs/SDK.tsx +++ b/src/pages/docs/SDK.tsx @@ -1,216 +1,189 @@ import React from 'react'; import { Link } from 'react-router-dom'; import { Button } from '@/components/ui/button'; -import { ArrowRight, ArrowLeft } from 'lucide-react'; - -const CodeBlock = ({ children, title }: { children: string; title?: string }) => ( -
    - {title && ( -
    - {title} -
    - )} -
    -      {children}
    -    
    -
    -); +import { ArrowRight } from 'lucide-react'; const SDK = () => { return (
    - {/* Header */}
    -

    - TypeScript SDK -

    -

    - The official TypeScript client library for idp.global. Works in both browser and Node.js - environments with full type safety. +

    TypeScript SDK

    +

    + Programmatic access to uptime.link monitoring features with full TypeScript support.

    {/* Installation */}

    Installation

    - -{`npm install @idp.global/idpclient - -# or with pnpm -pnpm add @idp.global/idpclient - -# or with yarn -yarn add @idp.global/idpclient`} - +
    + npm install @uptime.link/sdk +
    - {/* Initialization */} + {/* Basic Usage */}
    -

    Initialization

    - -{`import { IdpClient } from '@idp.global/idpclient'; +

    Basic Usage

    +
    +
    {`import { UptimeClient } from '@uptime.link/sdk';
     
    -// Connect to the hosted platform
    -const idpClient = new IdpClient('https://idp.global');
    -
    -// Or connect to your self-hosted instance
    -const idpClient = new IdpClient('https://idp.yourdomain.com');
    -
    -// Enable WebSocket for real-time updates
    -await idpClient.enableTypedSocket();`}
    -        
    -      
    - - {/* Authentication */} -
    -

    Authentication

    - -

    Check Login Status

    - -{`// Check if user is currently logged in -const isLoggedIn = await idpClient.determineLoginStatus(); - -if (isLoggedIn) { - console.log('User is authenticated'); -}`} - - -

    Login with Email & Password

    - -{`const response = await idpClient.requests.loginWithUserNameAndPassword.fire({ - username: 'user@example.com', - password: 'securepassword' +// Initialize the client +const client = new UptimeClient({ + apiKey: process.env.UPTIME_API_KEY, // Optional for cloud sync }); -if (response.refreshToken) { - // Store the refresh token securely - await idpClient.refreshJwt(response.refreshToken); - console.log('Login successful!'); -} else if (response.error) { - console.error('Login failed:', response.error); -}`} - +// Check an endpoint +const result = await client.check('https://api.example.com'); -

    Login with Magic Link

    - -{`// Request magic link email -await idpClient.requests.loginWithEmail.fire({ - email: 'user@example.com' +console.log({ + url: result.url, + status: result.status, // 'up' | 'down' + statusCode: result.statusCode, // 200 + responseTime: result.responseTime, // 123 (ms) + timestamp: result.timestamp +});`} +
    +
    + + {/* Network Scanning */} +
    +

    Network Scanning

    +
    +
    {`import { Detector } from '@uptime.link/sdk';
    +
    +const detector = new Detector();
    +
    +// Scan local network for services
    +const services = await detector.scan({
    +  range: '192.168.1.0/24',
    +  ports: [80, 443, 22, 3306, 5432],
    +  timeout: 2000
     });
     
    -// User clicks link in email, which contains a token
    -// Your callback page handles the token:
    -await idpClient.requests.verifyMagicLink.fire({
    -  token: tokenFromUrl
    -});`}
    -        
    -
    -        

    Get Current User

    - -{`// Get current user information -const userInfo = await idpClient.whoIs(); - -console.log('User ID:', userInfo.user.id); -console.log('Email:', userInfo.user.email); -console.log('Name:', userInfo.user.name);`} - +for (const service of services) { + console.log({ + host: service.host, + port: service.port, + type: service.type, // 'http' | 'ssh' | 'mysql' | etc. + open: service.open + }); +}`}
    +
    - {/* Organizations */} + {/* Continuous Monitoring */}
    -

    Organizations

    +

    Continuous Monitoring

    +
    +
    {`import { Monitor } from '@uptime.link/sdk';
     
    -        

    Get User's Organizations

    - -{`const result = await idpClient.getRolesAndOrganizations(); +const monitor = new Monitor({ + endpoints: [ + { url: 'https://api.example.com', interval: 30 }, + { url: 'https://app.example.com', interval: 60 } + ] +}); -for (const org of result.organizations) { - console.log('Organization:', org.name); - console.log('Slug:', org.slug); - console.log('Your roles:', org.roles); -}`} - +// Listen for status changes +monitor.on('statusChange', (event) => { + console.log(\`\${event.url} is now \${event.status}\`); -

    Create Organization

    - -{`const result = await idpClient.createOrganization( - 'My Company', // Display name - 'my-company', // URL slug - 'manifest' // Type -); - -console.log('Created:', result.resultingOrganization);`} - - -

    Invite Members

    - -{`await idpClient.requests.createInvitation.fire({ - jwt: await idpClient.getJwt(), - organizationId: 'org-id', - email: 'newmember@example.com', - roles: ['member'] -});`} - -
    - - {/* JWT Handling */} -
    -

    JWT Handling

    - -{`// Get current JWT for API calls -const jwt = await idpClient.getJwt(); - -// Use in Authorization header -fetch('/api/protected', { - headers: { - 'Authorization': \`Bearer \${jwt}\` + if (event.status === 'down') { + // Trigger alert + sendAlert(event); } }); -// Refresh JWT with refresh token -await idpClient.refreshJwt(refreshToken); +// Start monitoring +monitor.start(); -// Logout (clears tokens) -await idpClient.logout();`} - +// Stop when done +// monitor.stop();`} +
    - {/* TypeScript Interfaces */} + {/* API Reference */}
    -

    TypeScript Interfaces

    -

    - All API types are available from @idp.global/interfaces: -

    - -{`import type { - IUser, - IOrganization, - IRole, - IJwt, - IApp -} from '@idp.global/interfaces'; +

    API Reference

    -// Use in your application -function handleUser(user: IUser) { - console.log(user.email); -}`} -
    +
    +
    +

    UptimeClient

    +

    Main client for endpoint checks.

    +
    + + + + + + + + + + + + + + + + + + + + + +
    MethodDescription
    check(url)Check a single endpoint
    checkMany(urls)Check multiple endpoints in parallel
    getHistory(url)Get check history for an endpoint
    +
    +
    + +
    +

    Detector

    +

    Network and service detection.

    +
    + + + + + + + + + + + + + + + + + + + + + +
    MethodDescription
    scan(options)Scan network for services
    checkPort(host, port)Check if a port is open
    identifyService(host, port)Identify service type
    +
    +
    +
    - {/* Navigation */} -
    - - + {/* Next steps */} +
    +

    Next Steps

    +
    + + +
    ); diff --git a/src/pages/docs/Users.tsx b/src/pages/docs/Users.tsx deleted file mode 100644 index e134723..0000000 --- a/src/pages/docs/Users.tsx +++ /dev/null @@ -1,253 +0,0 @@ -import React from 'react'; -import { Link } from 'react-router-dom'; -import { Button } from '@/components/ui/button'; -import { ArrowLeft, ExternalLink } from 'lucide-react'; - -const CodeBlock = ({ children, title }: { children: string; title?: string }) => ( -
    - {title && ( -
    - {title} -
    - )} -
    -      {children}
    -    
    -
    -); - -const Users = () => { - return ( -
    - {/* Header */} -
    -

    - User Management -

    -

    - Complete user lifecycle management from registration to profile updates, - with multiple authentication methods and security features. -

    -
    - - {/* Authentication Methods */} -
    -

    Authentication Methods

    -
    -
    -

    Email & Password

    -

    - Traditional authentication with secure password hashing and optional 2FA. -

    -
    -
    -

    Magic Links

    -

    - Passwordless authentication via email. Secure, time-limited tokens. -

    -
    -
    -

    API Tokens

    -

    - Long-lived tokens for programmatic access and CI/CD pipelines. -

    -
    -
    -

    OAuth / OIDC

    -

    - SSO via third-party applications using standard protocols. -

    -
    -
    -
    - - {/* Registration */} -
    -

    User Registration

    - -{`import { IdpClient } from '@idp.global/idpclient'; - -const idpClient = new IdpClient('https://idp.global'); - -// Start registration - sends verification email -const result = await idpClient.requests.firstRegistration.fire({ - email: 'newuser@example.com' -}); - -if (result.success) { - console.log('Verification email sent'); -} - -// User clicks verification link, then completes registration -await idpClient.requests.finishRegistration.fire({ - token: verificationTokenFromEmail, - password: 'securePassword123', - name: 'John Doe' -});`} - -
    - - {/* Profile Management */} -
    -

    Profile Management

    - -

    Get User Data

    - -{`const userData = await idpClient.requests.getUserData.fire({ - jwt: await idpClient.getJwt() -}); - -console.log('Name:', userData.user.name); -console.log('Email:', userData.user.email); -console.log('Created:', userData.user.createdAt);`} - - -

    Update Profile

    - -{`await idpClient.requests.setUserData.fire({ - jwt: await idpClient.getJwt(), - name: 'John Updated', - // Other profile fields as needed -});`} - -
    - - {/* Password Management */} -
    -

    Password Management

    - -

    Change Password

    - -{`await idpClient.requests.changePassword.fire({ - jwt: await idpClient.getJwt(), - currentPassword: 'oldPassword', - newPassword: 'newSecurePassword' -});`} - - -

    Password Reset Flow

    - -{`// Request password reset email -await idpClient.requests.requestPasswordReset.fire({ - email: 'user@example.com' -}); - -// User clicks reset link, then sets new password -await idpClient.requests.resetPassword.fire({ - token: resetTokenFromEmail, - newPassword: 'newSecurePassword' -});`} - -
    - - {/* Session Management */} -
    -

    Session Management

    - -

    List Active Sessions

    - -{`const sessions = await idpClient.requests.getUserSessions.fire({ - jwt: await idpClient.getJwt() -}); - -for (const session of sessions.sessions) { - console.log('Device:', session.userAgent); - console.log('Last active:', session.lastActiveAt); - console.log('IP:', session.ipAddress); -}`} - - -

    Revoke Session

    - -{`// Revoke a specific session -await idpClient.requests.revokeSession.fire({ - jwt: await idpClient.getJwt(), - sessionId: 'session-uuid' -}); - -// Revoke all sessions except current -await idpClient.requests.revokeAllSessions.fire({ - jwt: await idpClient.getJwt() -});`} - -
    - - {/* Two-Factor Authentication */} -
    -

    Two-Factor Authentication

    -

    - Users can enable 2FA for enhanced account security: -

    - -{`// Enable 2FA - returns QR code data for authenticator app -const setup = await idpClient.requests.enable2FA.fire({ - jwt: await idpClient.getJwt() -}); - -console.log('Scan QR code:', setup.qrCodeUrl); -console.log('Or enter manually:', setup.secret); - -// Verify and activate 2FA -await idpClient.requests.verify2FA.fire({ - jwt: await idpClient.getJwt(), - code: '123456' // Code from authenticator app -}); - -// Disable 2FA -await idpClient.requests.disable2FA.fire({ - jwt: await idpClient.getJwt(), - code: '123456' // Requires valid 2FA code -});`} - -
    - - {/* User Data Model */} -
    -

    User Data Model

    - -{`interface IUser { - id: string; - email: string; - emailVerified: boolean; - name: string; - createdAt: string; - updatedAt: string; - twoFactorEnabled: boolean; - // Additional fields based on configuration -}`} - -
    - - {/* Help */} -
    -

    Need Help?

    -

    - Join our community for support, discussions, and feature requests. -

    - -
    - - {/* Navigation */} -
    - - -
    -
    - ); -}; - -export default Users; diff --git a/src/pages/docs/Widgets.tsx b/src/pages/docs/Widgets.tsx new file mode 100644 index 0000000..643be62 --- /dev/null +++ b/src/pages/docs/Widgets.tsx @@ -0,0 +1,197 @@ +import React from 'react'; +import { Link } from 'react-router-dom'; +import { Button } from '@/components/ui/button'; +import { ArrowRight } from 'lucide-react'; + +const Widgets = () => { + return ( +
    +
    +

    Status Widgets

    +

    + Embeddable web components to display real-time uptime status on your website. +

    +
    + + {/* Quick Start */} +
    +

    Quick Start

    +

    + Add the status widget to any HTML page with a single script tag: +

    +
    +
    {`
    +`}
    +
    +
    + + {/* Widget Types */} +
    +

    Widget Types

    + +
    + {/* Status Badge */} +
    +

    Status Badge

    +

    + A compact badge showing current status. +

    +
    +
    {``}
    +
    +
    + + {/* Status Card */} +
    +

    Status Card

    +

    + A card showing status, uptime percentage, and response time. +

    +
    +
    {``}
    +
    +
    + + {/* Status Page */} +
    +

    Status Page

    +

    + A full status page with multiple endpoints. +

    +
    +
    {``}
    +
    +
    +
    +
    + + {/* Customization */} +
    +

    Customization

    +

    + Customize the appearance using CSS variables: +

    +
    +
    {``}
    +
    +
    + + {/* Attributes */} +
    +

    Attributes

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AttributeTypeDescription
    endpointstringURL to monitor
    namestringDisplay name for the endpoint
    refreshnumberRefresh interval in seconds (default: 60)
    show-uptimebooleanShow uptime percentage
    show-response-timebooleanShow response time
    theme"light" | "dark" | "auto"Color theme
    +
    +
    + + {/* React Integration */} +
    +

    React Integration

    +

    + Use the React wrapper for type-safe integration: +

    +
    +
    {`import { StatusCard, StatusPage } from '@uptime.link/react';
    +
    +function MyStatusPage() {
    +  return (
    +    
    +  );
    +}`}
    +
    +
    + + {/* Next steps */} +
    +

    Next Steps

    +
    + + +
    +
    +
    + ); +}; + +export default Widgets; diff --git a/tailwind.config.ts b/tailwind.config.ts index 6b57f62..cc2c613 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -63,13 +63,13 @@ export default { border: 'hsl(var(--sidebar-border))', ring: 'hsl(var(--sidebar-ring))' }, - idp: { - blue: '#0056b3', - teal: '#33C3F0', - darkBlue: '#003366', - lightBlue: '#e6f7ff', + uptime: { + green: '#10b981', + emerald: '#34d399', + darkGreen: '#065f46', + lightGreen: '#d1fae5', gray: '#f5f5f5', - darkGray: '#333333' + darkGray: '#1f2937' } }, borderRadius: { @@ -112,7 +112,7 @@ export default { 'glow-pulse': 'glow-pulse 3s ease-in-out infinite' }, fontFamily: { - sans: ['Inter', 'sans-serif'], + sans: ['JetBrains Mono', 'monospace'], mono: ['JetBrains Mono', 'SF Mono', 'Fira Code', 'monospace'] }, boxShadow: {