Site pages and AI tasks.
Gitea CI/CD / build (push) Successful in 1m40s

This commit is contained in:
Clive
2026-08-20 14:58:52 +10:00
parent 152a998311
commit e5d1446791
51 changed files with 2876 additions and 30 deletions
+39
View File
@@ -0,0 +1,39 @@
using System.Net.Mail;
using Microsoft.Extensions.Options;
namespace plushealthtech.Mail
{
/// <summary>
/// Sends outbound email through the configured SMTP server (MailPit in local
/// development). No authentication is used.
/// </summary>
public class MailSender
{
private readonly SmtpOptions _options;
private readonly ILogger<MailSender> _logger;
public MailSender(IOptions<SmtpOptions> options, ILogger<MailSender> logger)
{
_options = options.Value;
_logger = logger;
}
public async Task SendAsync(string subject, string body)
{
using var client = new SmtpClient(_options.Host, _options.Port)
{
EnableSsl = false
};
var message = new MailMessage(_options.From, _options.To)
{
Subject = subject,
Body = body,
IsBodyHtml = false
};
await client.SendMailAsync(message);
_logger.LogInformation("Mail sent to {To} (subject: {Subject})", _options.To, subject);
}
}
}
+13
View File
@@ -0,0 +1,13 @@
namespace plushealthtech.Mail
{
/// <summary>
/// SMTP settings bound from the "Smtp" section of appsettings.json.
/// </summary>
public class SmtpOptions
{
public string Host { get; set; } = "localhost";
public int Port { get; set; } = 1025;
public string From { get; set; } = string.Empty;
public string To { get; set; } = string.Empty;
}
}
+154
View File
@@ -0,0 +1,154 @@
@page
@model AboutModel
@{
ViewData["Title"] = "About Us";
}
<!-- Hero Section -->
<section class="relative overflow-hidden pt-16 pb-20 lg:pt-24 lg:pb-24 bg-gradient-to-b from-white via-slate-50 to-brand-light/30">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 relative z-10">
<div class="max-w-3xl mx-auto space-y-4 text-center">
<span class="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-brand-light text-brand text-xs font-bold uppercase tracking-wider">
<i class="fa-solid fa-hospital"></i> About Plus Health Tech
</span>
<h1 class="text-4xl sm:text-5xl font-extrabold text-slate-900 tracking-tight leading-tight">
Clinical software built on <span class="text-brand">trust, precision, and care</span>
</h1>
<p class="text-lg text-slate-600">
Plus Health Tech builds interoperable clinical software for people and the animals they care for — decision support, patient management, and veterinary platforms that stay connected to the systems where care already happens.
</p>
</div>
</div>
</section>
<!-- What We Do -->
<section id="what-we-do" class="py-24 bg-white">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="text-center max-w-3xl mx-auto space-y-4 mb-16">
<h2 class="text-xs font-bold tracking-widest text-brand uppercase">What We Do</h2>
<h3 class="text-3xl font-extrabold text-slate-900 tracking-tight">One platform strategy, three product pillars</h3>
<p class="text-slate-600">Every product we build shares the same foundation: open standards, evidence-based logic, and a deep respect for the people using it at the point of care.</p>
</div>
<div class="grid grid-cols-1 md:grid-cols-3 gap-8">
<!-- Clinical Decision Support -->
<a href="/ClinicalDecisionSupport" class="group bg-slate-50 p-8 rounded-2xl border border-slate-100 hover:shadow-xl hover:border-brand/20 transition-all flex flex-col">
<div class="w-14 h-14 rounded-xl bg-brand-light text-brand flex items-center justify-center text-xl font-bold mb-6 group-hover:bg-brand group-hover:text-white transition-colors">
<i class="fa-solid fa-brain"></i>
</div>
<h4 class="text-xl font-bold text-slate-900 mb-3">Clinical Decision Support</h4>
<p class="text-slate-600 text-sm leading-relaxed flex-1">
Real-time, evidence-based guidance at the point of care — cross-checking orders, doses, and results the moment they enter the chart.
</p>
<span class="inline-flex items-center gap-2 mt-6 text-sm font-semibold text-brand">
Explore CDS <i class="fa-solid fa-arrow-right group-hover:translate-x-1 transition-transform"></i>
</span>
</a>
<!-- Patient Management -->
<a href="/PatientManagement" class="group bg-slate-50 p-8 rounded-2xl border border-slate-100 hover:shadow-xl hover:border-brand-accent/20 transition-all flex flex-col">
<div class="w-14 h-14 rounded-xl bg-sky-50 text-brand-accent flex items-center justify-center text-xl font-bold mb-6 group-hover:bg-brand-accent group-hover:text-white transition-colors">
<i class="fa-solid fa-clipboard-user"></i>
</div>
<h4 class="text-xl font-bold text-slate-900 mb-3">Patient Management</h4>
<p class="text-slate-600 text-sm leading-relaxed flex-1">
A complete medical home for every patient — records, scheduling, and communication that flow together instead of fragmenting care.
</p>
<span class="inline-flex items-center gap-2 mt-6 text-sm font-semibold text-brand-accent">
Explore Patient Management <i class="fa-solid fa-arrow-right group-hover:translate-x-1 transition-transform"></i>
</span>
</a>
<!-- Veterinary Solutions -->
<a href="/Veterinary" class="group bg-slate-50 p-8 rounded-2xl border border-slate-100 hover:shadow-xl hover:border-brand-vet/20 transition-all flex flex-col">
<div class="w-14 h-14 rounded-xl bg-teal-50 text-brand-vet flex items-center justify-center text-xl font-bold mb-6 group-hover:bg-brand-vet group-hover:text-white transition-colors">
<i class="fa-solid fa-paw"></i>
</div>
<h4 class="text-xl font-bold text-slate-900 mb-3">Veterinarian Solutions</h4>
<p class="text-slate-600 text-sm leading-relaxed flex-1">
Purpose-built software for animal clinics — EHR records, imaging, and species-tailored decision tools that keep practice and care moving as one.
</p>
<span class="inline-flex items-center gap-2 mt-6 text-sm font-semibold text-brand-vet">
Explore Veterinary <i class="fa-solid fa-arrow-right group-hover:translate-x-1 transition-transform"></i>
</span>
</a>
</div>
</div>
</section>
<!-- Values -->
<section id="values" class="py-24 bg-slate-50">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="text-center max-w-3xl mx-auto space-y-4 mb-16">
<h2 class="text-xs font-bold tracking-widest text-brand uppercase">Our Values</h2>
<h3 class="text-3xl font-extrabold text-slate-900 tracking-tight">The principles behind every release</h3>
<p class="text-slate-600">These aren't wall posters — they're the constraints we design against, in every product, from the first architecture decision to the last line of a care alert.</p>
</div>
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-8">
<!-- Value 1 -->
<div class="bg-white p-8 rounded-2xl border border-slate-100 shadow-sm hover:shadow-xl transition-all">
<div class="w-12 h-12 rounded-xl bg-brand-light text-brand flex items-center justify-center text-lg mb-5">
<i class="fa-solid fa-circle-nodes"></i>
</div>
<h4 class="text-lg font-bold text-slate-900 mb-2">Interoperability by default</h4>
<p class="text-slate-600 text-sm leading-relaxed">
FHIR® and HL7v2 are our starting point, not an add-on — your data moves between systems without rip-and-replace or parallel records.
</p>
</div>
<!-- Value 2 -->
<div class="bg-white p-8 rounded-2xl border border-slate-100 shadow-sm hover:shadow-xl transition-all">
<div class="w-12 h-12 rounded-xl bg-brand-light text-brand flex items-center justify-center text-lg mb-5">
<i class="fa-solid fa-flask-vial"></i>
</div>
<h4 class="text-lg font-bold text-slate-900 mb-2">Evidence-based</h4>
<p class="text-slate-600 text-sm leading-relaxed">
Every recommendation traces back to current clinical evidence — not guesswork, not vendor opinion, not a black box.
</p>
</div>
<!-- Value 3 -->
<div class="bg-white p-8 rounded-2xl border border-slate-100 shadow-sm hover:shadow-xl transition-all">
<div class="w-12 h-12 rounded-xl bg-brand-light text-brand flex items-center justify-center text-lg mb-5">
<i class="fa-solid fa-hand-holding-heart"></i>
</div>
<h4 class="text-lg font-bold text-slate-900 mb-2">Patient-first</h4>
<p class="text-slate-600 text-sm leading-relaxed">
Human or animal, the patient is who we build for. The software is in service of the care — never the other way around.
</p>
</div>
<!-- Value 4 -->
<div class="bg-white p-8 rounded-2xl border border-slate-100 shadow-sm hover:shadow-xl transition-all">
<div class="w-12 h-12 rounded-xl bg-brand-light text-brand flex items-center justify-center text-lg mb-5">
<i class="fa-solid fa-user-doctor"></i>
</div>
<h4 class="text-lg font-bold text-slate-900 mb-2">Built with clinicians</h4>
<p class="text-slate-600 text-sm leading-relaxed">
Doctors, nurses, and veterinarians shape our roadmaps — tools that respect how care actually works on a busy day.
</p>
</div>
</div>
</div>
</section>
<!-- CTA Section -->
<section class="py-24 bg-slate-50">
<div class="max-w-5xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="bg-gradient-to-br from-brand to-brand-dark text-white rounded-2xl p-10 sm:p-14 shadow-xl shadow-brand/20 text-center space-y-4">
<h2 class="text-3xl font-extrabold tracking-tight">See the platform in action</h2>
<p class="text-slate-200 max-w-2xl mx-auto">
Book a walkthrough with our team and watch decision support, patient management, and interoperability run the way your care setting actually operates.
</p>
<div class="flex flex-col sm:flex-row items-center justify-center gap-4 pt-2">
<a href="/RequestDemo" class="w-full sm:w-auto bg-white text-brand hover:bg-slate-100 font-semibold px-8 py-4 rounded-xl shadow-md transition-all text-center">
Request a demo <i class="fa-solid fa-arrow-right ml-2"></i>
</a>
<a href="/Careers" class="w-full sm:w-auto text-white font-semibold px-8 py-4 rounded-xl border border-white/40 hover:bg-white/10 transition-all text-center">
Build with us
</a>
</div>
</div>
</div>
</section>
+19
View File
@@ -0,0 +1,19 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace plushealthtech.Pages
{
public class AboutModel : PageModel
{
private readonly ILogger<AboutModel> _logger;
public AboutModel(ILogger<AboutModel> logger)
{
_logger = logger;
}
public void OnGet()
{
}
}
}
+102
View File
@@ -0,0 +1,102 @@
@page
@model CareersModel
@{
ViewData["Title"] = "Careers";
}
<!-- Hero Section -->
<section class="relative overflow-hidden pt-16 pb-20 lg:pt-24 lg:pb-24 bg-gradient-to-b from-white via-slate-50 to-brand-light/30">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 relative z-10">
<div class="max-w-3xl mx-auto space-y-4 text-center">
<span class="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-brand-light text-brand text-xs font-bold uppercase tracking-wider">
<i class="fa-solid fa-briefcase"></i> Careers at Plus Health Tech
</span>
<h1 class="text-4xl sm:text-5xl font-extrabold text-slate-900 tracking-tight leading-tight">
Build the future of <span class="text-brand">interoperable clinical software</span>
</h1>
<p class="text-lg text-slate-600">
We're a small, product-focused team building decision support, patient management, and veterinary platforms that keep the systems where care happens connected. If that's the kind of work you want to do, we'd love to hear from you.
</p>
</div>
</div>
</section>
<!-- Why Join Us -->
<section id="why-join-us" class="py-24 bg-white">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="text-center max-w-3xl mx-auto space-y-4 mb-16">
<h2 class="text-xs font-bold tracking-widest text-brand uppercase">Why Join Us</h2>
<h3 class="text-3xl font-extrabold text-slate-900 tracking-tight">Do work that matters, on a team that ships</h3>
<p class="text-slate-600">We build software that sits at the point of care, so the bar for quality is high — and the payoff is seeing it used every day. Here's what working with us looks like.</p>
</div>
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-8">
<!-- Card 1 -->
<div class="bg-slate-50 p-8 rounded-2xl border border-slate-100 shadow-sm hover:shadow-xl transition-all group">
<div class="w-12 h-12 rounded-xl bg-brand-light text-brand flex items-center justify-center text-lg mb-5 group-hover:bg-brand group-hover:text-white transition-colors">
<i class="fa-solid fa-bullseye"></i>
</div>
<h4 class="text-lg font-bold text-slate-900 mb-2">Mission-driven work</h4>
<p class="text-slate-600 text-sm leading-relaxed">
The software we build touches real care, every day. You'll see the line between a well-placed piece of code and better decisions at the point of care.
</p>
</div>
<!-- Card 2 -->
<div class="bg-slate-50 p-8 rounded-2xl border border-slate-100 shadow-sm hover:shadow-xl transition-all group">
<div class="w-12 h-12 rounded-xl bg-brand-light text-brand flex items-center justify-center text-lg mb-5 group-hover:bg-brand group-hover:text-white transition-colors">
<i class="fa-solid fa-user-doctor"></i>
</div>
<h4 class="text-lg font-bold text-slate-900 mb-2">Clinical + technical collaboration</h4>
<p class="text-slate-600 text-sm leading-relaxed">
We build alongside clinicians and veterinarians, not just for them — so the tools we ship respect how care actually works on a busy day.
</p>
</div>
<!-- Card 3 -->
<div class="bg-slate-50 p-8 rounded-2xl border border-slate-100 shadow-sm hover:shadow-xl transition-all group">
<div class="w-12 h-12 rounded-xl bg-brand-light text-brand flex items-center justify-center text-lg mb-5 group-hover:bg-brand group-hover:text-white transition-colors">
<i class="fa-solid fa-code"></i>
</div>
<h4 class="text-lg font-bold text-slate-900 mb-2">Modern .NET stack</h4>
<p class="text-slate-600 text-sm leading-relaxed">
A current, well-supported stack — .NET 10, Razor Pages, and Tailwind CSS — so your energy goes into the product, not into fighting the tooling.
</p>
</div>
<!-- Card 4 -->
<div class="bg-slate-50 p-8 rounded-2xl border border-slate-100 shadow-sm hover:shadow-xl transition-all group">
<div class="w-12 h-12 rounded-xl bg-brand-light text-brand flex items-center justify-center text-lg mb-5 group-hover:bg-brand group-hover:text-white transition-colors">
<i class="fa-solid fa-house-laptop"></i>
</div>
<h4 class="text-lg font-bold text-slate-900 mb-2">Ways of working that fit life</h4>
<p class="text-slate-600 text-sm leading-relaxed">
We're pragmatic about how and where work happens, and we keep the process lean so the team can stay focused on shipping quality software.
</p>
</div>
</div>
</div>
</section>
<!-- How to Apply -->
<section id="how-to-apply" class="py-24 bg-slate-50">
<div class="max-w-5xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="bg-gradient-to-br from-brand to-brand-dark text-white rounded-2xl p-10 sm:p-14 shadow-xl shadow-brand/20 text-center space-y-5">
<span class="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-white/10 text-white text-xs font-bold uppercase tracking-wider">
<i class="fa-solid fa-envelope-open-text"></i> How to Apply
</span>
<h2 class="text-3xl font-extrabold tracking-tight">We're not running a public job board right now</h2>
<p class="text-slate-100 max-w-2xl mx-auto">
Tell us about yourself via the Contact page and we'll be in touch. Whether you have a role in mind or just want to introduce yourself, we read every note.
</p>
<div class="flex flex-col sm:flex-row items-center justify-center gap-4 pt-2">
<a href="/Contact" class="w-full sm:w-auto bg-white text-brand hover:bg-slate-100 font-semibold px-8 py-4 rounded-xl shadow-md transition-all text-center">
Tell us about yourself <i class="fa-solid fa-arrow-right ml-2"></i>
</a>
<a href="/About" class="w-full sm:w-auto text-white font-semibold px-8 py-4 rounded-xl border border-white/40 hover:bg-white/10 transition-all text-center">
Learn about us
</a>
</div>
</div>
</div>
</section>
+19
View File
@@ -0,0 +1,19 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace plushealthtech.Pages
{
public class CareersModel : PageModel
{
private readonly ILogger<CareersModel> _logger;
public CareersModel(ILogger<CareersModel> logger)
{
_logger = logger;
}
public void OnGet()
{
}
}
}
@@ -0,0 +1,150 @@
@page
@model ClinicalDecisionSupportModel
@{
ViewData["Title"] = "Clinical Decision Support";
}
<!-- Hero Section -->
<section class="relative overflow-hidden pt-16 pb-20 lg:pt-24 lg:pb-24 bg-gradient-to-b from-white via-slate-50 to-brand-light/30">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 relative z-10">
<div class="max-w-3xl mx-auto space-y-4 text-center">
<span class="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-brand-light text-brand text-xs font-bold uppercase tracking-wider">
<i class="fa-solid fa-brain"></i> Point-of-Care Intelligence
</span>
<h1 class="text-4xl sm:text-5xl font-extrabold text-slate-900 tracking-tight leading-tight">
Evidence-based guidance <span class="text-brand">at the point of care</span>
</h1>
<p class="text-lg text-slate-600">
Our CDS platform cross-checks every order, dose, and result in real time — surfacing the safest, most effective option exactly where care happens.
</p>
<div class="flex flex-col sm:flex-row items-center justify-center gap-4 pt-4">
<a href="/RequestDemo" class="w-full sm:w-auto bg-brand hover:bg-brand-dark text-white font-semibold px-8 py-4 rounded-xl shadow-lg shadow-brand/25 transition-all text-center">
Request a demo <i class="fa-solid fa-arrow-right ml-2"></i>
</a>
<a href="#interoperability" class="w-full sm:w-auto bg-white hover:bg-slate-50 text-slate-700 font-semibold px-8 py-4 rounded-xl border border-slate-200 transition-all text-center">
See how it connects
</a>
</div>
</div>
</div>
</section>
<!-- Capabilities Section -->
<section id="capabilities" class="py-24 bg-white">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="text-center max-w-3xl mx-auto space-y-4 mb-16">
<h2 class="text-xs font-bold tracking-widest text-brand uppercase">Clinical Intelligence</h2>
<h3 class="text-3xl font-extrabold text-slate-900 tracking-tight">Decision support that works the way clinicians do</h3>
<p class="text-slate-600">Real-time recommendations built on live patient data — engineered to catch risk early and keep every treatment choice aligned with current evidence.</p>
</div>
<div class="grid grid-cols-1 md:grid-cols-2 gap-8">
<!-- Card 1 -->
<div class="bg-slate-50 p-8 rounded-2xl border border-slate-100 hover:shadow-xl transition-all group">
<div class="w-14 h-14 rounded-xl bg-brand-light text-brand flex items-center justify-center text-xl font-bold mb-6 group-hover:bg-brand group-hover:text-white transition-colors">
<i class="fa-solid fa-brain"></i>
</div>
<h4 class="text-xl font-bold text-slate-900 mb-3">Error Reduction by Design</h4>
<p class="text-slate-600 text-sm leading-relaxed">
Every order, dose, and result is cross-checked against intelligent, evidence-based algorithms the moment it enters the chart — flagging unsafe combinations, duplicates, and allergies before they reach the patient.
</p>
</div>
<!-- Card 2 -->
<div class="bg-slate-50 p-8 rounded-2xl border border-slate-100 hover:shadow-xl transition-all group">
<div class="w-14 h-14 rounded-xl bg-brand-light text-brand flex items-center justify-center text-xl font-bold mb-6 group-hover:bg-brand group-hover:text-white transition-colors">
<i class="fa-solid fa-stethoscope"></i>
</div>
<h4 class="text-xl font-bold text-slate-900 mb-3">Optimized Treatment Choices</h4>
<p class="text-slate-600 text-sm leading-relaxed">
Recommendations weigh current guidelines, live lab values, and documented history to surface the therapies most likely to work for the patient in front of you.
</p>
</div>
<!-- Card 3 -->
<div class="bg-slate-50 p-8 rounded-2xl border border-slate-100 hover:shadow-xl transition-all group">
<div class="w-14 h-14 rounded-xl bg-brand-light text-brand flex items-center justify-center text-xl font-bold mb-6 group-hover:bg-brand group-hover:text-white transition-colors">
<i class="fa-solid fa-bell"></i>
</div>
<h4 class="text-xl font-bold text-slate-900 mb-3">Alerts That Fit the Workflow</h4>
<p class="text-slate-600 text-sm leading-relaxed">
Smart, low-noise alerts arrive inside the EHR where care is already happening — no extra tab to switch to, no broken flow, no alert fatigue.
</p>
</div>
<!-- Card 4 -->
<div class="bg-slate-50 p-8 rounded-2xl border border-slate-100 hover:shadow-xl transition-all group">
<div class="w-14 h-14 rounded-xl bg-brand-light text-brand flex items-center justify-center text-xl font-bold mb-6 group-hover:bg-brand group-hover:text-white transition-colors">
<i class="fa-solid fa-circle-nodes"></i>
</div>
<h4 class="text-xl font-bold text-slate-900 mb-3">FHIR® &amp; HL7v2 Native</h4>
<p class="text-slate-600 text-sm leading-relaxed">
Built on open healthcare standards, so guidance is generated from the complete clinical picture — labs, pharmacy, history, and beyond.
</p>
</div>
</div>
</div>
</section>
<!-- Interoperability Section -->
<section id="interoperability" class="py-24 bg-slate-900 text-white relative overflow-hidden">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 relative z-10">
<div class="grid grid-cols-1 lg:grid-cols-2 gap-12 items-center">
<div class="space-y-6">
<span class="text-brand-accent text-xs font-bold uppercase tracking-widest bg-brand-accent/10 px-3 py-1 rounded-full">Standards-Based Exchange</span>
<h2 class="text-3xl lg:text-4xl font-extrabold tracking-tight">Connected to the systems you already run</h2>
<p class="text-slate-300">
Guidance is only as strong as the data behind it. Plus Health Tech exchanges structured messaging with your EHR, labs, pharmacy, and registries through FHIR® and HL7v2 — so every recommendation reflects the complete, current clinical picture.
</p>
<ul class="space-y-3 text-sm text-slate-300">
<li class="flex items-center gap-3">
<i class="fa-solid fa-check text-brand-accent"></i> FHIR® R4 resources &amp; HL7v2 messaging
</li>
<li class="flex items-center gap-3">
<i class="fa-solid fa-check text-brand-accent"></i> Encrypted, enterprise-grade data exchange
</li>
<li class="flex items-center gap-3">
<i class="fa-solid fa-check text-brand-accent"></i> Real-time synchronization across care sites
</li>
</ul>
</div>
<div class="bg-slate-800/80 p-8 rounded-2xl border border-slate-700 backdrop-blur-sm">
<div class="flex items-center justify-between pb-3 border-b border-slate-700 text-xs text-slate-400">
<span>Message Exchange</span>
<span class="text-emerald-400 font-mono">ACK · 200 OK</span>
</div>
<div class="space-y-3">
<div class="font-mono text-xs bg-slate-950 p-4 rounded-xl overflow-x-auto">
<p class="text-slate-500 mb-1"><span class="text-emerald-400 font-bold">IN</span> · HL7v2 lab result</p>
<p class="text-brand-accent">OBR|1|ORD-48213|LAB-88910^LIS||Potassium|Stat</p>
</div>
<div class="font-mono text-xs bg-slate-950 p-4 rounded-xl overflow-x-auto">
<p class="text-slate-500 mb-1"><span class="text-sky-400 font-bold">OUT</span> · FHIR® CDS recommendation</p>
<p class="text-brand-accent">"code": "renal-dosing-review", "status": "active"</p>
</div>
</div>
<p class="pt-4 text-xs text-slate-400 text-center">Structured messaging in both directions — no point-to-point integrations to maintain.</p>
</div>
</div>
</div>
</section>
<!-- CTA Section -->
<section class="py-24 bg-slate-50">
<div class="max-w-5xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="bg-gradient-to-br from-brand to-brand-dark text-white rounded-2xl p-10 sm:p-14 shadow-xl shadow-brand/20 text-center space-y-4">
<h2 class="text-3xl font-extrabold tracking-tight">See CDS working in your workflow</h2>
<p class="text-slate-200 max-w-2xl mx-auto">
Book a walkthrough with our clinical team and watch live decision support run against the way your care setting actually operates.
</p>
<div class="flex flex-col sm:flex-row items-center justify-center gap-4 pt-2">
<a href="/RequestDemo" class="w-full sm:w-auto bg-white text-brand hover:bg-slate-100 font-semibold px-8 py-4 rounded-xl shadow-md transition-all text-center">
Request a demo <i class="fa-solid fa-arrow-right ml-2"></i>
</a>
<a href="/PatientManagement" class="w-full sm:w-auto text-white font-semibold px-8 py-4 rounded-xl border border-white/40 hover:bg-white/10 transition-all text-center">
Explore Patient Management
</a>
</div>
</div>
</div>
</section>
@@ -0,0 +1,19 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace plushealthtech.Pages
{
public class ClinicalDecisionSupportModel : PageModel
{
private readonly ILogger<ClinicalDecisionSupportModel> _logger;
public ClinicalDecisionSupportModel(ILogger<ClinicalDecisionSupportModel> logger)
{
_logger = logger;
}
public void OnGet()
{
}
}
}
+99
View File
@@ -0,0 +1,99 @@
@page
@model ContactModel
@{
ViewData["Title"] = "Contact";
}
<!-- Hero Section -->
<section class="relative overflow-hidden pt-16 pb-16 lg:pt-24 lg:pb-20 bg-gradient-to-b from-white via-slate-50 to-brand-light/30">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 relative z-10">
<div class="max-w-3xl mx-auto space-y-4 text-center">
<span class="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-brand-light text-brand text-xs font-bold uppercase tracking-wider">
<i class="fa-solid fa-circle-nodes"></i> Get in Touch
</span>
<h1 class="text-4xl sm:text-5xl font-extrabold text-slate-900 tracking-tight leading-tight">
Contact <span class="text-[#1c8098]">Plus Health Tech</span>
</h1>
<p class="text-lg text-slate-600">
Questions about interoperability, product fit, or a live demo — send us a note and we'll get back to you.
</p>
</div>
</div>
</section>
<!-- Contact Form -->
<section class="pb-24 bg-slate-50">
<div class="max-w-3xl mx-auto px-4 sm:px-6 lg:px-8">
@if (Model.Error != null)
{
<div class="mb-6 p-4 rounded-xl bg-red-50 border border-red-200 text-red-800 text-sm flex items-start gap-3">
<i class="fa-solid fa-circle-exclamation mt-0.5"></i>
<span>@Model.Error</span>
</div>
}
@if (Model.Success != null)
{
<div class="bg-white p-8 rounded-2xl border border-emerald-200 shadow-sm text-center space-y-4">
<div class="w-14 h-14 mx-auto rounded-full bg-emerald-100 text-emerald-600 flex items-center justify-center text-xl">
<i class="fa-solid fa-check"></i>
</div>
<h2 class="text-xl font-bold text-slate-900">Message sent</h2>
<p class="text-slate-600">@Model.Success</p>
<a href="/" class="inline-flex items-center gap-1 text-brand font-semibold text-sm hover:underline">
<i class="fa-solid fa-arrow-left text-xs"></i> Back to home
</a>
</div>
}
else
{
<div class="bg-white p-8 rounded-2xl border border-slate-100 shadow-sm">
<form asp-page="/Contact" method="post">
<div class="grid grid-cols-1 sm:grid-cols-2 gap-5">
<div>
<label asp-for="Name" class="block text-sm font-semibold text-slate-700 mb-1.5">Name *</label>
<input asp-for="Name" class="w-full px-4 py-3 rounded-xl border border-slate-200 bg-white text-sm text-slate-800 placeholder:text-slate-400 focus:outline-none focus:border-brand focus:ring-2 focus:ring-brand/20" placeholder="Dr. Jane Smith" />
<span asp-validation-for="Name" class="mt-1 block text-xs text-red-600"></span>
</div>
<div>
<label asp-for="Email" class="block text-sm font-semibold text-slate-700 mb-1.5">Work email *</label>
<input asp-for="Email" type="email" class="w-full px-4 py-3 rounded-xl border border-slate-200 bg-white text-sm text-slate-800 placeholder:text-slate-400 focus:outline-none focus:border-brand focus:ring-2 focus:ring-brand/20" placeholder="[email protected]" />
<span asp-validation-for="Email" class="mt-1 block text-xs text-red-600"></span>
</div>
<div>
<label asp-for="Organization" class="block text-sm font-semibold text-slate-700 mb-1.5">Organization</label>
<input asp-for="Organization" class="w-full px-4 py-3 rounded-xl border border-slate-200 bg-white text-sm text-slate-800 placeholder:text-slate-400 focus:outline-none focus:border-brand focus:ring-2 focus:ring-brand/20" placeholder="Acme Health" />
<span asp-validation-for="Organization" class="mt-1 block text-xs text-red-600"></span>
</div>
<div>
<label asp-for="Phone" class="block text-sm font-semibold text-slate-700 mb-1.5">Phone</label>
<input asp-for="Phone" type="tel" class="w-full px-4 py-3 rounded-xl border border-slate-200 bg-white text-sm text-slate-800 placeholder:text-slate-400 focus:outline-none focus:border-brand focus:ring-2 focus:ring-brand/20" placeholder="+1 555 0100" />
<span asp-validation-for="Phone" class="mt-1 block text-xs text-red-600"></span>
</div>
</div>
<div class="mt-5">
<label asp-for="Message" class="block text-sm font-semibold text-slate-700 mb-1.5">Message *</label>
<textarea asp-for="Message" rows="6" class="w-full px-4 py-3 rounded-xl border border-slate-200 bg-white text-sm text-slate-800 placeholder:text-slate-400 focus:outline-none focus:border-brand focus:ring-2 focus:ring-brand/20" placeholder="Tell us what you're trying to solve…"></textarea>
<span asp-validation-for="Message" class="mt-1 block text-xs text-red-600"></span>
</div>
<div class="mt-6 flex flex-col sm:flex-row items-center gap-4">
<button type="submit" class="w-full sm:w-auto bg-[#1c8098] hover:bg-[#145f72] text-white font-semibold px-8 py-3.5 rounded-xl shadow-sm shadow-brand/20 transition-all">
Send message <i class="fa-solid fa-arrow-right ml-2"></i>
</button>
<p class="text-xs text-slate-500 flex items-center gap-2">
<i class="fa-solid fa-shield-halved text-brand"></i>
We reply to the email address you provide — nothing else is stored.
</p>
</div>
</form>
</div>
}
</div>
</section>
@section Scripts {
<partial name="_ValidationScriptsPartial" />
}
+94
View File
@@ -0,0 +1,94 @@
using System.ComponentModel.DataAnnotations;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using plushealthtech.Mail;
namespace plushealthtech.Pages
{
public class ContactModel : PageModel
{
private readonly MailSender _mailSender;
private readonly ILogger<ContactModel> _logger;
public ContactModel(MailSender mailSender, ILogger<ContactModel> logger)
{
_mailSender = mailSender;
_logger = logger;
}
[BindProperty]
[Required]
[StringLength(200)]
public string Name { get; set; } = string.Empty;
[BindProperty]
[Required]
[EmailAddress]
[StringLength(320)]
public string Email { get; set; } = string.Empty;
[BindProperty]
[StringLength(200)]
public string? Organization { get; set; }
[BindProperty]
[StringLength(50)]
public string? Phone { get; set; }
[BindProperty]
[Required]
[StringLength(5000)]
public string Message { get; set; } = string.Empty;
public string? Success { get; set; }
public string? Error { get; set; }
public void OnGet()
{
Success = null;
Error = null;
}
public async Task<IActionResult> OnPostAsync()
{
if (!ModelState.IsValid)
{
return Page();
}
var lines = new List<string>
{
$"Name: {Name}",
$"Email: {Email}"
};
if (!string.IsNullOrWhiteSpace(Organization))
{
lines.Add($"Organization: {Organization}");
}
if (!string.IsNullOrWhiteSpace(Phone))
{
lines.Add($"Phone: {Phone}");
}
lines.Add(string.Empty);
lines.Add(Message);
try
{
await _mailSender.SendAsync($"New contact form message — {Name}", string.Join("\n", lines));
Success = $"Thanks — your message has been sent. We'll reply to {Email}.";
}
catch (Exception ex)
{
// Log the full exception; never surface SMTP details to the user.
_logger.LogError(ex, "Failed to send contact form message from {Email}", Email);
Error = "Your message could not be sent right now. Please try again or email us directly.";
}
return Page();
}
}
}
+4 -4
View File
@@ -20,7 +20,7 @@
Deliver superior healthcare outcomes with our fully interoperable Clinical Decision Support (CDS), advanced Patient Management software, and specialized veterinary platforms.
</p>
<div class="flex flex-col sm:flex-row items-center justify-center lg:justify-start gap-4 pt-4">
<a href="#contact" class="w-full sm:w-auto bg-[#1c8098] hover:bg-[#145f72] text-white font-semibold px-8 py-4 rounded-xl shadow-lg shadow-brand/25 transition-all text-center">
<a href="/RequestDemo" class="w-full sm:w-auto bg-[#1c8098] hover:bg-[#145f72] text-white font-semibold px-8 py-4 rounded-xl shadow-lg shadow-brand/25 transition-all text-center">
Explore Platform <i class="fa-solid fa-arrow-right ml-2"></i>
</a>
<a href="#solutions" class="w-full sm:w-auto bg-white hover:bg-slate-50 text-slate-700 font-semibold px-8 py-4 rounded-xl border border-slate-200 transition-all text-center">
@@ -101,7 +101,7 @@
<p class="text-slate-600 text-sm leading-relaxed mb-6">
Deliver evidence-based guidance at the point of care with intelligent algorithms built to reduce medical errors and optimize treatment choices.
</p>
<a href="#" class="text-brand font-semibold text-sm inline-flex items-center gap-1 hover:gap-2 transition-all">
<a href="/ClinicalDecisionSupport" class="text-brand font-semibold text-sm inline-flex items-center gap-1 hover:gap-2 transition-all">
Learn more <i class="fa-solid fa-arrow-right text-xs"></i>
</a>
</div>
@@ -115,7 +115,7 @@
<p class="text-slate-600 text-sm leading-relaxed mb-6">
End-to-end patient workflow tools from intake to discharge, maximizing clinic efficiency and keeping communication channels transparent.
</p>
<a href="#" class="text-brand font-semibold text-sm inline-flex items-center gap-1 hover:gap-2 transition-all">
<a href="/PatientManagement" class="text-brand font-semibold text-sm inline-flex items-center gap-1 hover:gap-2 transition-all">
Learn more <i class="fa-solid fa-arrow-right text-xs"></i>
</a>
</div>
@@ -129,7 +129,7 @@
<p class="text-slate-600 text-sm leading-relaxed mb-6">
Specialized veterinary software tailored for animal clinics, integrating EHR records, imaging, and tailored diagnostic decision tools.
</p>
<a href="#" class="text-brand-vet font-semibold text-sm inline-flex items-center gap-1 hover:gap-2 transition-all">
<a href="/Veterinary" class="text-brand-vet font-semibold text-sm inline-flex items-center gap-1 hover:gap-2 transition-all">
Explore Vet Tech <i class="fa-solid fa-arrow-right text-xs"></i>
</a>
</div>
@@ -0,0 +1,107 @@
@page
@model PatientManagementModel
@{
ViewData["Title"] = "Patient Management";
}
<!-- Hero Section -->
<section class="relative overflow-hidden pt-16 pb-20 lg:pt-24 lg:pb-24 bg-gradient-to-b from-white via-slate-50 to-brand-light/30">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 relative z-10">
<div class="max-w-3xl mx-auto space-y-4 text-center">
<span class="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-brand-light text-brand text-xs font-bold uppercase tracking-wider">
<i class="fa-solid fa-hospital-user"></i> Patient-Centered Workflow
</span>
<h1 class="text-4xl sm:text-5xl font-extrabold text-slate-900 tracking-tight leading-tight">
End-to-end patient workflow, <span class="text-brand">from intake to discharge</span>
</h1>
<p class="text-lg text-slate-600">
One connected platform for registration, scheduling, and every touchpoint in between — so your team maximizes clinic efficiency and keeps communication channels transparent.
</p>
<div class="flex flex-col sm:flex-row items-center justify-center gap-4 pt-4">
<a href="/RequestDemo" class="w-full sm:w-auto bg-brand hover:bg-brand-dark text-white font-semibold px-8 py-4 rounded-xl shadow-lg shadow-brand/25 transition-all text-center">
Request a demo <i class="fa-solid fa-arrow-right ml-2"></i>
</a>
<a href="/ClinicalDecisionSupport" class="w-full sm:w-auto bg-white hover:bg-slate-50 text-slate-700 font-semibold px-8 py-4 rounded-xl border border-slate-200 transition-all text-center">
Explore Clinical Decision Support
</a>
</div>
</div>
</div>
</section>
<!-- Features Section -->
<section id="features" class="py-24 bg-white">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="text-center max-w-3xl mx-auto space-y-4 mb-16">
<h2 class="text-xs font-bold tracking-widest text-brand uppercase">Patient Management</h2>
<h3 class="text-3xl font-extrabold text-slate-900 tracking-tight">Every step of the patient journey, one connected workflow</h3>
<p class="text-slate-600">From the front desk to final follow-up — purpose-built tools that keep intake, scheduling, communication, and clinical handoffs moving smoothly.</p>
</div>
<div class="grid grid-cols-1 md:grid-cols-2 gap-8">
<!-- Card 1 -->
<div class="bg-slate-50 p-8 rounded-2xl border border-slate-100 hover:shadow-xl transition-all group">
<div class="w-14 h-14 rounded-xl bg-brand-light text-brand flex items-center justify-center text-xl font-bold mb-6 group-hover:bg-brand group-hover:text-white transition-colors">
<i class="fa-solid fa-clipboard-user"></i>
</div>
<h4 class="text-xl font-bold text-slate-900 mb-3">Intake &amp; Registration</h4>
<p class="text-slate-600 text-sm leading-relaxed">
Capture demographics, insurance, and medical history once — then carry it across every visit, so check-in is fast and the chart is complete from the first minute.
</p>
</div>
<!-- Card 2 -->
<div class="bg-slate-50 p-8 rounded-2xl border border-slate-100 hover:shadow-xl transition-all group">
<div class="w-14 h-14 rounded-xl bg-brand-light text-brand flex items-center justify-center text-xl font-bold mb-6 group-hover:bg-brand group-hover:text-white transition-colors">
<i class="fa-solid fa-calendar-check"></i>
</div>
<h4 class="text-xl font-bold text-slate-900 mb-3">Scheduling &amp; Capacity</h4>
<p class="text-slate-600 text-sm leading-relaxed">
Balance provider calendars, room availability, and waitlists in one view — reducing no-shows and keeping appointment flow steady through the busiest days.
</p>
</div>
<!-- Card 3 -->
<div class="bg-slate-50 p-8 rounded-2xl border border-slate-100 hover:shadow-xl transition-all group">
<div class="w-14 h-14 rounded-xl bg-brand-light text-brand flex items-center justify-center text-xl font-bold mb-6 group-hover:bg-brand group-hover:text-white transition-colors">
<i class="fa-solid fa-comment-medical"></i>
</div>
<h4 class="text-xl font-bold text-slate-900 mb-3">Transparent Patient Communication</h4>
<p class="text-slate-600 text-sm leading-relaxed">
Keep patients informed through the channels they already use — reminders, results, and status updates delivered clearly, so unanswered questions never stall care.
</p>
</div>
<!-- Card 4 -->
<div class="bg-slate-50 p-8 rounded-2xl border border-slate-100 hover:shadow-xl transition-all group">
<div class="w-14 h-14 rounded-xl bg-brand-light text-brand flex items-center justify-center text-xl font-bold mb-6 group-hover:bg-brand group-hover:text-white transition-colors">
<i class="fa-solid fa-circle-nodes"></i>
</div>
<h4 class="text-xl font-bold text-slate-900 mb-3">EHR Integration, FHIR®-Ready</h4>
<p class="text-slate-600 text-sm leading-relaxed">
Connects to the EHRs and systems you already run through FHIR®-ready exchange — no rip-and-replace, no parallel charts, no data silos.
</p>
</div>
</div>
</div>
</section>
<!-- CTA Section -->
<section class="py-24 bg-slate-50">
<div class="max-w-5xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="bg-gradient-to-br from-brand to-brand-dark text-white rounded-2xl p-10 sm:p-14 shadow-xl shadow-brand/20 text-center space-y-4">
<h2 class="text-3xl font-extrabold tracking-tight">See patient management working in your workflow</h2>
<p class="text-slate-200 max-w-2xl mx-auto">
Book a walkthrough with our team and watch the full intake-to-discharge flow run against the way your practice actually operates.
</p>
<div class="flex flex-col sm:flex-row items-center justify-center gap-4 pt-2">
<a href="/RequestDemo" class="w-full sm:w-auto bg-white text-brand hover:bg-slate-100 font-semibold px-8 py-4 rounded-xl shadow-md transition-all text-center">
Request a demo <i class="fa-solid fa-arrow-right ml-2"></i>
</a>
<a href="/ClinicalDecisionSupport" class="w-full sm:w-auto text-white font-semibold px-8 py-4 rounded-xl border border-white/40 hover:bg-white/10 transition-all text-center">
Explore Clinical Decision Support
</a>
</div>
</div>
</div>
</section>
@@ -0,0 +1,19 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace plushealthtech.Pages
{
public class PatientManagementModel : PageModel
{
private readonly ILogger<PatientManagementModel> _logger;
public PatientManagementModel(ILogger<PatientManagementModel> logger)
{
_logger = logger;
}
public void OnGet()
{
}
}
}
+116 -3
View File
@@ -1,8 +1,121 @@
@page
@page
@model PrivacyModel
@{
ViewData["Title"] = "Privacy Policy";
}
<h1>@ViewData["Title"]</h1>
<p>Use this page to detail your site's privacy policy.</p>
<!-- Hero Section -->
<section class="relative overflow-hidden pt-16 pb-16 lg:pt-24 lg:pb-20 bg-gradient-to-b from-white via-slate-50 to-brand-light/30">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 relative z-10">
<div class="max-w-3xl mx-auto space-y-4 text-center">
<span class="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-brand-light text-brand text-xs font-bold uppercase tracking-wider">
<i class="fa-solid fa-shield-halved"></i> Privacy
</span>
<h1 class="text-4xl sm:text-5xl font-extrabold text-slate-900 tracking-tight leading-tight">
Privacy, <span class="text-[#1c8098]">handled with care</span>
</h1>
<p class="text-lg text-slate-600">
We keep this site deliberately simple, and our data collection with it. Here's exactly what we collect when you get in touch, what we do with it, and what you can ask us to do.
</p>
</div>
</div>
</section>
<!-- Policy -->
<section class="pb-24 bg-slate-50">
<div class="max-w-3xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="bg-white p-8 sm:p-10 rounded-2xl border border-slate-100 shadow-sm">
<!-- Information we collect -->
<div>
<h2 class="text-lg font-bold text-slate-900 mb-2">Information we collect</h2>
<p class="text-sm leading-relaxed text-slate-600">
Most of this site is read-only — you can browse it without giving us anything. When you send a message through the Contact page or request a demo, we collect only what those forms ask for: your name, work email, and organization; your phone number on the Contact form; and, on the demo form, your practice type, the products you're interested in, and any additional notes. Fields marked <span class="font-semibold text-slate-800">*</span> are the only ones we require. We don't collect patient or animal health information here — this is a company website, not a clinical system.
</p>
</div>
<hr class="my-8 border-slate-100" />
<!-- How we use it -->
<div>
<h2 class="text-lg font-bold text-slate-900 mb-2">How we use it</h2>
<p class="text-sm leading-relaxed text-slate-600">
Your details are used for one purpose: to respond to you. Contact messages and demo requests are delivered to our team mailbox (<span class="font-mono text-xs text-slate-700">[email protected]</span>), and we reply to the email address you provided. We don't sell or rent your information, we don't share it with third parties for their marketing, and we don't use it to build profiles or serve you advertising.
</p>
</div>
<hr class="my-8 border-slate-100" />
<!-- Third-party services -->
<div>
<h2 class="text-lg font-bold text-slate-900 mb-2">Third-party services</h2>
<p class="text-sm leading-relaxed text-slate-600 mb-3">
The site doesn't run much third-party machinery, but a few services help it work:
</p>
<ul class="space-y-2">
<li class="text-sm leading-relaxed text-slate-600">
<span class="font-semibold text-slate-800">Font Awesome (via cdnjs)</span> — the icon set is delivered as a stylesheet from the cdnjs content-delivery network.
</li>
<li class="text-sm leading-relaxed text-slate-600">
<span class="font-semibold text-slate-800">Analytics (analytics.rokoh.com)</span> — a lightweight script that measures aggregate page views across the site.
</li>
<li class="text-sm leading-relaxed text-slate-600">
<span class="font-semibold text-slate-800">Blog (blog.plushealthtech.com)</span> — our blog lives on a separate subdomain; visiting it is subject to whatever terms are stated there.
</li>
</ul>
</div>
<hr class="my-8 border-slate-100" />
<!-- Cookies -->
<div>
<h2 class="text-lg font-bold text-slate-900 mb-2">Cookies</h2>
<p class="text-sm leading-relaxed text-slate-600">
This site sets no session or authentication cookies — there's nothing to log in to. The only cookies you may encounter are the analytics cookies set by the analytics script above, which track aggregate usage rather than building an individual profile. Blocking third-party cookies in your browser will not affect the site's functionality.
</p>
</div>
<hr class="my-8 border-slate-100" />
<!-- Data retention -->
<div>
<h2 class="text-lg font-bold text-slate-900 mb-2">Data retention</h2>
<p class="text-sm leading-relaxed text-slate-600">
Contact and demo messages are kept in our team mailbox while we work on them and for a period afterwards. The exact retention schedule is still being finalized — this section is a placeholder pending legal review and will be updated once our schedule is set.
</p>
<div class="mt-4 p-4 rounded-xl bg-amber-50 border border-amber-200 text-amber-800 text-xs flex items-start gap-3">
<i class="fa-solid fa-triangle-exclamation mt-0.5"></i>
<span>Pending legal review — the wording in this section is provisional.</span>
</div>
</div>
<hr class="my-8 border-slate-100" />
<!-- Your rights -->
<div>
<h2 class="text-lg font-bold text-slate-900 mb-2">Your rights</h2>
<p class="text-sm leading-relaxed text-slate-600">
Under applicable data-protection laws you can ask us to confirm what we hold about you, correct inaccurate details, or delete your information. Send any such request through the <a href="/Contact" class="text-brand font-semibold hover:underline">Contact page</a> and we'll take care of it, responding to the email address you provide.
</p>
</div>
<hr class="my-8 border-slate-100" />
<!-- Contact -->
<div>
<h2 class="text-lg font-bold text-slate-900 mb-2">Contact</h2>
<p class="text-sm leading-relaxed text-slate-600">
Questions about this policy, or a request about your data? The fastest route to a human is the <a href="/Contact" class="text-brand font-semibold hover:underline">Contact page</a> — or request a demo and tell us what you'd like to know.
</p>
</div>
<!-- Last updated -->
<div class="mt-10 pt-6 border-t border-slate-100">
<p class="text-xs text-slate-500">
Last updated: August 2026
</p>
</div>
</div>
</div>
</section>
+122
View File
@@ -0,0 +1,122 @@
@page
@model RequestDemoModel
@{
ViewData["Title"] = "Request Demo";
}
<!-- Hero Section -->
<section class="relative overflow-hidden pt-16 pb-16 lg:pt-24 lg:pb-20 bg-gradient-to-b from-white via-slate-50 to-brand-light/30">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 relative z-10">
<div class="max-w-3xl mx-auto space-y-4 text-center">
<span class="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-brand-light text-brand text-xs font-bold uppercase tracking-wider">
<i class="fa-solid fa-circle-nodes"></i> See It In Action
</span>
<h1 class="text-4xl sm:text-5xl font-extrabold text-slate-900 tracking-tight leading-tight">
Request a <span class="text-[#1c8098]">Live Demo</span>
</h1>
<p class="text-lg text-slate-600">
See how interoperable Clinical Decision Support, Patient Management, and Veterinary platforms fit your practice — in a walkthrough tailored to your team.
</p>
<div class="flex flex-wrap items-center justify-center gap-x-6 gap-y-2 pt-2 text-sm text-slate-600 font-medium">
<span class="inline-flex items-center gap-2"><i class="fa-solid fa-circle-check text-brand"></i> FHIR®-ready interoperability</span>
<span class="inline-flex items-center gap-2"><i class="fa-solid fa-circle-check text-brand"></i> 24/7 clinical support</span>
<span class="inline-flex items-center gap-2"><i class="fa-solid fa-circle-check text-brand"></i> 99.9% system uptime</span>
</div>
</div>
</div>
</section>
<!-- Request Demo Form -->
<section class="pb-24 bg-slate-50">
<div class="max-w-3xl mx-auto px-4 sm:px-6 lg:px-8">
@if (Model.Error != null)
{
<div class="mb-6 p-4 rounded-xl bg-red-50 border border-red-200 text-red-800 text-sm flex items-start gap-3">
<i class="fa-solid fa-circle-exclamation mt-0.5"></i>
<span>@Model.Error</span>
</div>
}
@if (Model.Success != null)
{
<div class="bg-white p-8 rounded-2xl border border-emerald-200 shadow-sm text-center space-y-4">
<div class="w-14 h-14 mx-auto rounded-full bg-emerald-100 text-emerald-600 flex items-center justify-center text-xl">
<i class="fa-solid fa-check"></i>
</div>
<h2 class="text-xl font-bold text-slate-900">Demo request sent</h2>
<p class="text-slate-600">@Model.Success</p>
<div class="flex flex-col sm:flex-row items-center justify-center gap-4 pt-2">
<a href="/" class="inline-flex items-center gap-1 text-brand font-semibold text-sm hover:underline">
<i class="fa-solid fa-arrow-left text-xs"></i> Back to home
</a>
<a href="/Contact" class="inline-flex items-center gap-1 text-slate-600 font-semibold text-sm hover:text-brand hover:underline">
Prefer to talk? Visit the Contact page <i class="fa-solid fa-arrow-right text-xs"></i>
</a>
</div>
</div>
}
else
{
<div class="bg-white p-8 rounded-2xl border border-slate-100 shadow-sm">
<form asp-page="/RequestDemo" method="post">
<div class="grid grid-cols-1 sm:grid-cols-2 gap-5">
<div>
<label asp-for="Name" class="block text-sm font-semibold text-slate-700 mb-1.5">Full name *</label>
<input asp-for="Name" class="w-full px-4 py-3 rounded-xl border border-slate-200 bg-white text-sm text-slate-800 placeholder:text-slate-400 focus:outline-none focus:border-brand focus:ring-2 focus:ring-brand/20" placeholder="Dr. Jane Smith" />
<span asp-validation-for="Name" class="mt-1 block text-xs text-red-600"></span>
</div>
<div>
<label asp-for="Email" class="block text-sm font-semibold text-slate-700 mb-1.5">Work email *</label>
<input asp-for="Email" type="email" class="w-full px-4 py-3 rounded-xl border border-slate-200 bg-white text-sm text-slate-800 placeholder:text-slate-400 focus:outline-none focus:border-brand focus:ring-2 focus:ring-brand/20" placeholder="[email protected]" />
<span asp-validation-for="Email" class="mt-1 block text-xs text-red-600"></span>
</div>
<div>
<label asp-for="Organization" class="block text-sm font-semibold text-slate-700 mb-1.5">Organization *</label>
<input asp-for="Organization" class="w-full px-4 py-3 rounded-xl border border-slate-200 bg-white text-sm text-slate-800 placeholder:text-slate-400 focus:outline-none focus:border-brand focus:ring-2 focus:ring-brand/20" placeholder="Acme Health" />
<span asp-validation-for="Organization" class="mt-1 block text-xs text-red-600"></span>
</div>
<div>
<label asp-for="PracticeType" class="block text-sm font-semibold text-slate-700 mb-1.5">Practice type</label>
<select asp-for="PracticeType" asp-items="Model.PracticeTypeOptions" class="w-full px-4 py-3 rounded-xl border border-slate-200 bg-white text-sm text-slate-800 focus:outline-none focus:border-brand focus:ring-2 focus:ring-brand/20"></select>
<span asp-validation-for="PracticeType" class="mt-1 block text-xs text-red-600"></span>
</div>
<div>
<label asp-for="ProductsOfInterest" class="block text-sm font-semibold text-slate-700 mb-1.5">Products of interest</label>
<select asp-for="ProductsOfInterest" asp-items="Model.ProductsOfInterestOptions" class="w-full px-4 py-3 rounded-xl border border-slate-200 bg-white text-sm text-slate-800 focus:outline-none focus:border-brand focus:ring-2 focus:ring-brand/20"></select>
<span asp-validation-for="ProductsOfInterest" class="mt-1 block text-xs text-red-600"></span>
</div>
</div>
<div class="mt-5">
<label asp-for="Message" class="block text-sm font-semibold text-slate-700 mb-1.5">Anything you'd like us to know?</label>
<textarea asp-for="Message" rows="5" class="w-full px-4 py-3 rounded-xl border border-slate-200 bg-white text-sm text-slate-800 placeholder:text-slate-400 focus:outline-none focus:border-brand focus:ring-2 focus:ring-brand/20" placeholder="Tell us about your setup, go-live timeline, or anything you'd like to see…"></textarea>
<span asp-validation-for="Message" class="mt-1 block text-xs text-red-600"></span>
</div>
<div class="mt-6 flex flex-col sm:flex-row items-center gap-4">
<button type="submit" class="w-full sm:w-auto bg-[#1c8098] hover:bg-[#145f72] text-white font-semibold px-8 py-3.5 rounded-xl shadow-sm shadow-brand/20 transition-all">
Request demo <i class="fa-solid fa-arrow-right ml-2"></i>
</button>
<p class="text-xs text-slate-500 flex items-center gap-2">
<i class="fa-solid fa-shield-halved text-brand"></i>
We'll only use your details to schedule your demo.
</p>
</div>
</form>
</div>
}
<!-- Secondary CTA -->
<div class="mt-8 text-center">
<p class="text-sm text-slate-500">
Prefer to talk?
<a href="/Contact" class="text-brand font-semibold hover:underline">Visit the Contact page</a>
<i class="fa-solid fa-arrow-right text-xs inline-block"></i>
</p>
</div>
</div>
</section>
@section Scripts {
<partial name="_ValidationScriptsPartial" />
}
+120
View File
@@ -0,0 +1,120 @@
using System.ComponentModel.DataAnnotations;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.Mvc.Rendering;
using plushealthtech.Mail;
namespace plushealthtech.Pages
{
public class RequestDemoModel : PageModel
{
private readonly MailSender _mailSender;
private readonly ILogger<RequestDemoModel> _logger;
public RequestDemoModel(MailSender mailSender, ILogger<RequestDemoModel> logger)
{
_mailSender = mailSender;
_logger = logger;
}
[BindProperty]
[Required]
[StringLength(200)]
public string Name { get; set; } = string.Empty;
[BindProperty]
[Required]
[EmailAddress]
[StringLength(320)]
public string Email { get; set; } = string.Empty;
[BindProperty]
[Required]
[StringLength(200)]
public string Organization { get; set; } = string.Empty;
[BindProperty]
public string? PracticeType { get; set; }
[BindProperty]
public string? ProductsOfInterest { get; set; }
[BindProperty]
[StringLength(5000)]
public string? Message { get; set; }
public List<SelectListItem> PracticeTypeOptions { get; } = new()
{
new SelectListItem { Value = string.Empty, Text = "Select a practice type…", Selected = true },
new SelectListItem { Value = "Healthcare system", Text = "Healthcare system" },
new SelectListItem { Value = "Hospital", Text = "Hospital" },
new SelectListItem { Value = "Clinic", Text = "Clinic" },
new SelectListItem { Value = "Veterinary practice", Text = "Veterinary practice" },
new SelectListItem { Value = "Other", Text = "Other" },
};
public List<SelectListItem> ProductsOfInterestOptions { get; } = new()
{
new SelectListItem { Value = string.Empty, Text = "Select a product area…", Selected = true },
new SelectListItem { Value = "Clinical Decision Support", Text = "Clinical Decision Support" },
new SelectListItem { Value = "Patient Management", Text = "Patient Management" },
new SelectListItem { Value = "Veterinary Solutions", Text = "Veterinary Solutions" },
new SelectListItem { Value = "Multiple / not sure", Text = "Multiple / not sure" },
};
public string? Success { get; set; }
public string? Error { get; set; }
public void OnGet()
{
Success = null;
Error = null;
}
public async Task<IActionResult> OnPostAsync()
{
if (!ModelState.IsValid)
{
return Page();
}
var lines = new List<string>
{
$"Name: {Name}",
$"Email: {Email}",
$"Organization: {Organization}"
};
if (!string.IsNullOrWhiteSpace(PracticeType))
{
lines.Add($"Practice type: {PracticeType}");
}
if (!string.IsNullOrWhiteSpace(ProductsOfInterest))
{
lines.Add($"Products of interest: {ProductsOfInterest}");
}
if (!string.IsNullOrWhiteSpace(Message))
{
lines.Add(string.Empty);
lines.Add(Message);
}
try
{
await _mailSender.SendAsync($"New demo request — {Organization}", string.Join("\n", lines));
Success = $"Thanks — your demo request has been sent. We'll reach out to {Email}.";
}
catch (Exception ex)
{
// Log the full exception; never surface SMTP details to the user.
_logger.LogError(ex, "Failed to send demo request from {Email} ({Organization})", Email, Organization);
Error = "Your request could not be sent right now. Please try again or email us directly.";
}
return Page();
}
}
}
+71 -16
View File
@@ -16,39 +16,58 @@
<header class="sticky top-0 z-50 bg-white/90 backdrop-blur-md border-b border-slate-100 shadow-xs">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 h-20 flex items-center justify-between">
<!-- Logo -->
<a href="#" class="flex items-center gap-3">
<a href="/" class="flex items-center gap-3">
<img src="https://www.plushealthtech.com/img/plushealthtech-logo.png" alt="Plus Health Tech Logo" class="h-10 w-auto object-contain">
</a>
<!-- Desktop Nav Links -->
<nav class="hidden md:flex items-center gap-8 font-medium text-sm text-slate-600">
<a href="#solutions" class="hover:text-brand transition-colors">Solutions</a>
<a href="#interoperability" class="hover:text-brand transition-colors">Interoperability</a>
<a href="#veterinary" class="hover:text-brand transition-colors">Veterinary Tech</a>
<a href="#about" class="hover:text-brand transition-colors">About Us</a>
<a href="/ClinicalDecisionSupport" class="hover:text-brand transition-colors">CDS</a>
<a href="/PatientManagement" class="hover:text-brand transition-colors">Patient Management</a>
<a href="/Veterinary" class="hover:text-brand transition-colors">Veterinary</a>
<a href="/About" class="hover:text-brand transition-colors">About</a>
<a href="/Careers" class="hover:text-brand transition-colors">Careers</a>
<a href="/Contact" class="hover:text-brand transition-colors">Contact</a>
<a href="https://blog.plushealthtech.com" class="hover:text-brand transition-colors">Blog</a>
</nav>
<!-- Action Buttons -->
<div class="hidden md:flex items-center gap-4">
<a href="#contact" class="text-sm font-semibold text-slate-700 hover:text-brand px-4 py-2">Sign In</a>
<a href="#contact" class="bg-[#1c8098] hover:bg-[#145f72] text-white text-sm font-semibold px-5 py-2.5 rounded-xl shadow-sm transition-all shadow-brand/20">
<a href="/SignIn" class="text-sm font-semibold text-slate-700 hover:text-brand px-4 py-2">Sign In</a>
<a href="/RequestDemo" class="bg-[#1c8098] hover:bg-[#145f72] text-white text-sm font-semibold px-5 py-2.5 rounded-xl shadow-sm transition-all shadow-brand/20">
Request Demo
</a>
</div>
<!-- Mobile Menu Toggle -->
<button class="md:hidden text-slate-600 focus:outline-none">
<button id="mobile-menu-toggle" class="md:hidden text-slate-600 focus:outline-none" aria-controls="mobile-menu" aria-expanded="false">
<i class="fa-solid fa-bars text-xl"></i>
</button>
</div>
<!-- Mobile Menu -->
<div id="mobile-menu" class="hidden md:hidden border-t border-slate-100 bg-white px-4 sm:px-6 pt-2 pb-6">
<nav class="flex flex-col font-medium text-sm text-slate-600">
<a href="/ClinicalDecisionSupport" class="py-2 hover:text-brand transition-colors">CDS</a>
<a href="/PatientManagement" class="py-2 hover:text-brand transition-colors">Patient Management</a>
<a href="/Veterinary" class="py-2 hover:text-brand transition-colors">Veterinary</a>
<a href="/About" class="py-2 hover:text-brand transition-colors">About</a>
<a href="/Careers" class="py-2 hover:text-brand transition-colors">Careers</a>
<a href="/Contact" class="py-2 hover:text-brand transition-colors">Contact</a>
<a href="https://blog.plushealthtech.com" class="py-2 hover:text-brand transition-colors">Blog</a>
</nav>
<div class="mt-4 flex flex-col gap-2">
<a href="/SignIn" class="text-sm font-semibold text-slate-700 hover:text-brand px-4 py-2.5 text-center border border-slate-200 rounded-xl transition-colors">Sign In</a>
<a href="/RequestDemo" class="bg-[#1c8098] hover:bg-[#145f72] text-white text-sm font-semibold px-5 py-2.5 rounded-xl text-center shadow-sm shadow-brand/20 transition-colors">Request Demo</a>
</div>
</div>
</header>
@RenderBody()
<!-- Footer -->
<footer id="contact" class="bg-slate-950 text-slate-400 py-16 border-t border-slate-900">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 grid grid-cols-1 md:grid-cols-4 gap-10">
<footer class="bg-slate-950 text-slate-400 py-16 border-t border-slate-900">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 grid grid-cols-1 md:grid-cols-5 gap-10">
<div class="space-y-4">
<img src="~/img/plushealthtech-logo.png" alt="Plus Health Tech" class="h-8 w-auto brightness-200">
<p class="text-xs text-slate-500">
@@ -58,17 +77,24 @@
<div>
<h5 class="text-white text-sm font-semibold mb-4">Solutions</h5>
<ul class="space-y-2 text-xs">
<li><a href="#" class="hover:text-white transition-colors">Clinical Decision Support</a></li>
<li><a href="#" class="hover:text-white transition-colors">Patient Management</a></li>
<li><a href="#" class="v-tech hover:text-white transition-colors">Veterinarian Tech</a></li>
<li><a href="/ClinicalDecisionSupport" class="hover:text-white transition-colors">Clinical Decision Support</a></li>
<li><a href="/PatientManagement" class="hover:text-white transition-colors">Patient Management</a></li>
<li><a href="/Veterinary" class="hover:text-white transition-colors">Veterinarian Solutions</a></li>
</ul>
</div>
<div>
<h5 class="text-white text-sm font-semibold mb-4">Company</h5>
<ul class="space-y-2 text-xs">
<li><a href="#" class="hover:text-white transition-colors">About Us</a></li>
<li><a href="#" class="hover:text-white transition-colors">Careers</a></li>
<li><a href="#" class="hover:text-white transition-colors">Contact</a></li>
<li><a href="/About" class="hover:text-white transition-colors">About Us</a></li>
<li><a href="/Careers" class="hover:text-white transition-colors">Careers</a></li>
<li><a href="/Contact" class="hover:text-white transition-colors">Contact</a></li>
</ul>
</div>
<div>
<h5 class="text-white text-sm font-semibold mb-4">Legal</h5>
<ul class="space-y-2 text-xs">
<li><a href="/Privacy" class="hover:text-white transition-colors">Privacy Policy</a></li>
<li><a href="/Terms" class="hover:text-white transition-colors">Terms &amp; Conditions</a></li>
</ul>
</div>
<div>
@@ -85,6 +111,35 @@
</div>
</footer>
<script>
(function () {
var toggle = document.getElementById('mobile-menu-toggle');
var menu = document.getElementById('mobile-menu');
if (!toggle || !menu) return;
var icon = toggle.querySelector('i');
function setIcon(open) {
icon.classList.toggle('fa-bars', !open);
icon.classList.toggle('fa-xmark', open);
}
toggle.addEventListener('click', function () {
var open = menu.classList.toggle('hidden') === false;
setIcon(open);
toggle.setAttribute('aria-expanded', open ? 'true' : 'false');
});
// Close the menu when a link is tapped
menu.querySelectorAll('a').forEach(function (link) {
link.addEventListener('click', function () {
menu.classList.add('hidden');
setIcon(false);
toggle.setAttribute('aria-expanded', 'false');
});
});
})();
</script>
@await RenderSectionAsync("Scripts", required: false)
</body>
</html>
+30
View File
@@ -0,0 +1,30 @@
@page
@model SignInModel
@{
ViewData["Title"] = "Sign In";
}
<!-- Sign In Placeholder -->
<section class="relative overflow-hidden pt-16 pb-24 lg:pt-24 lg:pb-32 bg-gradient-to-b from-white via-slate-50 to-brand-light/30">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 relative z-10">
<div class="max-w-md mx-auto">
<div class="bg-white p-8 rounded-2xl border border-slate-100 shadow-sm text-center space-y-5">
<div class="w-14 h-14 mx-auto rounded-full bg-brand-light text-brand flex items-center justify-center text-xl">
<i class="fa-solid fa-right-to-bracket"></i>
</div>
<div>
<h1 class="text-2xl font-bold text-slate-900">Sign in to your portal</h1>
<p class="mt-2 text-sm text-slate-600">Portal sign-in is coming soon.</p>
</div>
<div class="flex flex-col gap-3 pt-1">
<a href="/RequestDemo" class="inline-flex items-center justify-center gap-2 bg-[#1c8098] hover:bg-[#145f72] text-white font-semibold px-8 py-3.5 rounded-xl shadow-sm shadow-brand/20 transition-all">
Request a demo <i class="fa-solid fa-arrow-right"></i>
</a>
<a href="/Contact" class="inline-flex items-center justify-center gap-2 text-slate-600 hover:text-brand font-semibold px-8 py-3.5 rounded-xl border border-slate-200 hover:border-brand/40 transition-all">
Contact us instead
</a>
</div>
</div>
</div>
</div>
</section>
+11
View File
@@ -0,0 +1,11 @@
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace plushealthtech.Pages
{
public class SignInModel : PageModel
{
public void OnGet()
{
}
}
}
+228
View File
@@ -0,0 +1,228 @@
@page
@model TermsModel
@{
ViewData["Title"] = "Terms & Conditions";
}
<!--
NOTE (legal): Standard corporate boilerplate — flagged for legal review before production
(see plan §3.6 and §8). Placeholders such as the governing jurisdiction below are
intentionally not finalized. Nothing here is legal advice.
-->
<!-- Hero Section -->
<section class="relative overflow-hidden pt-16 pb-16 lg:pt-24 lg:pb-20 bg-gradient-to-b from-white via-slate-50 to-brand-light/30">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 relative z-10">
<div class="max-w-3xl mx-auto space-y-4 text-center">
<span class="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-brand-light text-brand text-xs font-bold uppercase tracking-wider">
<i class="fa-solid fa-scale-balanced"></i> Legal
</span>
<h1 class="text-4xl sm:text-5xl font-extrabold text-slate-900 tracking-tight leading-tight">
Terms <span class="text-brand">&amp; Conditions</span>
</h1>
<p class="text-lg text-slate-600">
The terms that govern your use of the Plus Health Tech website and the services it offers.
</p>
<p class="text-xs text-slate-500 inline-flex items-center gap-2">
<i class="fa-regular fa-calendar"></i> Last updated: 2026
</p>
</div>
</div>
</section>
<!-- Terms Body -->
<section class="pb-24 bg-slate-50">
<div class="max-w-3xl mx-auto px-4 sm:px-6 lg:px-8">
<article class="bg-white rounded-2xl border border-slate-100 shadow-sm p-8 sm:p-12 space-y-10">
<p class="text-slate-600 leading-relaxed">
These Terms &amp; Conditions ("Terms") set out the rules for using the plushealthtech.com website
(the "Site"). Please read them carefully before using the Site.
</p>
<div class="flex items-start gap-3 rounded-xl bg-slate-50 border border-slate-200 p-4 text-sm text-slate-500">
<i class="fa-solid fa-circle-info mt-0.5 text-slate-400"></i>
<p>
These terms are standard boilerplate and will be finalized following legal review.
Certain details — for example, the governing jurisdiction below — are placeholders
pending that review.
</p>
</div>
<!-- 1. Acceptance of terms -->
<section>
<h2 class="text-xl font-bold text-slate-900 mb-3 flex items-center gap-3">
<span class="inline-flex items-center justify-center w-7 h-7 rounded-lg bg-brand-light text-brand text-sm font-bold shrink-0">1</span>
Acceptance of these terms
</h2>
<div class="space-y-3">
<p class="text-slate-600 leading-relaxed">
By accessing or using the Site, you agree to be bound by these Terms and our
<a href="/Privacy" class="text-brand font-semibold hover:underline">Privacy Policy</a>.
If you do not agree to them, please discontinue use of the Site.
</p>
<p class="text-slate-600 leading-relaxed">
These terms apply to everyone who uses the Site, including anyone who submits a
demo request or a message through a contact form.
</p>
</div>
</section>
<!-- 2. Services & product access -->
<section>
<h2 class="text-xl font-bold text-slate-900 mb-3 flex items-center gap-3">
<span class="inline-flex items-center justify-center w-7 h-7 rounded-lg bg-brand-light text-brand text-sm font-bold shrink-0">2</span>
Services and product access
</h2>
<div class="space-y-3">
<p class="text-slate-600 leading-relaxed">
The Site provides information about our products and a way to request a
demonstration or to contact our team. It does not, by itself, grant you any right
to use any Plus Health Tech software or platform.
</p>
<p class="text-slate-600 leading-relaxed">
Access to our Clinical Decision Support, Patient Management, or Veterinary products —
where offered — is governed by a separate agreement, and may be subject to licensing,
eligibility, and data-handling requirements. We may modify, suspend, or discontinue any
feature of the Site at any time.
</p>
</div>
</section>
<!-- 3. Clinical decision support disclaimer -->
<section class="rounded-xl bg-brand-light/40 border border-brand/15 p-6 sm:p-8">
<h2 class="text-xl font-bold text-slate-900 mb-3 flex items-center gap-3">
<span class="inline-flex items-center justify-center w-7 h-7 rounded-lg bg-brand text-white text-sm font-bold shrink-0">3</span>
Clinical decision support disclaimer
</h2>
<div class="space-y-3">
<p class="text-slate-700 leading-relaxed">
Plus Health Tech's products are Clinical Decision Support (CDS) tools. Their output is
decision <em>support</em> only — it is intended to <strong>assist, not replace,</strong>
the professional judgment of qualified clinicians.
</p>
<p class="text-slate-700 leading-relaxed">
CDS output is not a diagnosis, a treatment plan, or medical advice, and it must never be
the sole basis for a clinical decision. Clinicians who rely on any output remain
responsible for exercising independent professional judgment in the diagnosis, treatment,
and care of their patients — human or animal.
</p>
</div>
</section>
<!-- 4. Intellectual property -->
<section>
<h2 class="text-xl font-bold text-slate-900 mb-3 flex items-center gap-3">
<span class="inline-flex items-center justify-center w-7 h-7 rounded-lg bg-brand-light text-brand text-sm font-bold shrink-0">4</span>
Intellectual property
</h2>
<div class="space-y-3">
<p class="text-slate-600 leading-relaxed">
All content on the Site — including text, graphics, logos, icons, and software — is the
property of Plus Health Tech or its licensors and is protected by applicable copyright,
trademark, and other intellectual-property laws. You are granted a limited, non-exclusive
right to view and use the Site for lawful purposes, and nothing transfers ownership to you.
</p>
<p class="text-slate-600 leading-relaxed">
All trademarks, service marks, and product names referenced (including standards such as
FHIR&reg; and HL7&reg;) are the property of their respective owners and are used for
identification only. We reserve all rights not expressly granted.
</p>
</div>
</section>
<!-- 5. Acceptable use -->
<section>
<h2 class="text-xl font-bold text-slate-900 mb-3 flex items-center gap-3">
<span class="inline-flex items-center justify-center w-7 h-7 rounded-lg bg-brand-light text-brand text-sm font-bold shrink-0">5</span>
Acceptable use
</h2>
<div class="space-y-3">
<p class="text-slate-600 leading-relaxed">
You agree to use the Site lawfully and not to:
</p>
<ul class="list-disc pl-5 space-y-1.5 text-slate-600 leading-relaxed">
<li>use the Site in any way that violates an applicable law or regulation;</li>
<li>attempt to access, disrupt, or damage any part of the Site or the systems behind it;</li>
<li>upload or transmit material containing malware or malicious code;</li>
<li>scrape or collect content for commercial purposes without our permission; or</li>
<li>use the Site to send unsolicited or fraudulent communications.</li>
</ul>
<p class="text-slate-600 leading-relaxed">
We may terminate or restrict access for conduct we reasonably believe violates these terms.
</p>
</div>
</section>
<!-- 6. Limitation of liability (LEGAL REVIEW) -->
<section>
<h2 class="text-xl font-bold text-slate-900 mb-3 flex items-center gap-3">
<span class="inline-flex items-center justify-center w-7 h-7 rounded-lg bg-brand-light text-brand text-sm font-bold shrink-0">6</span>
Limitation of liability
</h2>
<div class="space-y-3">
<p class="text-slate-600 leading-relaxed">
The Site and its content are provided on an "as is" and "as available" basis, without
warranties of any kind, whether express or implied, including as to accuracy, completeness,
fitness for a particular purpose, or non-infringement.
</p>
<p class="text-slate-600 leading-relaxed">
To the maximum extent permitted by law, Plus Health Tech and its officers, employees, and
licensors shall not be liable for any indirect, incidental, special, consequential, or
punitive damages, or any loss of profits or data, arising out of or related to your use of
the Site.
</p>
</div>
</section>
<!-- 7. Governing law (LEGAL REVIEW — placeholder jurisdiction) -->
<section>
<h2 class="text-xl font-bold text-slate-900 mb-3 flex items-center gap-3">
<span class="inline-flex items-center justify-center w-7 h-7 rounded-lg bg-brand-light text-brand text-sm font-bold shrink-0">7</span>
Governing law
</h2>
<div class="space-y-3">
<p class="text-slate-600 leading-relaxed">
Except where a separate agreement provides otherwise, these Terms and any dispute arising
from your use of the Site are governed by the laws of
<span class="inline-flex items-center gap-1 align-middle mx-1 px-2 py-0.5 rounded bg-amber-100 text-amber-800 text-xs font-semibold">
<i class="fa-solid fa-flag"></i> [Jurisdiction to be confirmed]
</span>,
without regard to its conflict-of-law principles.
</p>
</div>
</section>
<!-- 8. Changes to these terms -->
<section>
<h2 class="text-xl font-bold text-slate-900 mb-3 flex items-center gap-3">
<span class="inline-flex items-center justify-center w-7 h-7 rounded-lg bg-brand-light text-brand text-sm font-bold shrink-0">8</span>
Changes to these terms
</h2>
<div class="space-y-3">
<p class="text-slate-600 leading-relaxed">
We may revise these Terms from time to time. If we make material changes, we will update
the "Last updated" date at the top of this page and, where appropriate, post a notice on the
Site. Your continued use of the Site after changes take effect constitutes acceptance of
the revised terms.
</p>
</div>
</section>
<!-- 9. Contact -->
<section>
<h2 class="text-xl font-bold text-slate-900 mb-3 flex items-center gap-3">
<span class="inline-flex items-center justify-center w-7 h-7 rounded-lg bg-brand-light text-brand text-sm font-bold shrink-0">9</span>
Contact
</h2>
<div class="space-y-3">
<p class="text-slate-600 leading-relaxed">
Questions about these Terms &amp; Conditions? Reach us through our
<a href="/Contact" class="text-brand font-semibold hover:underline">contact page</a>,
and we'll point you in the right direction.
</p>
</div>
</section>
</article>
</div>
</section>
+19
View File
@@ -0,0 +1,19 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace plushealthtech.Pages
{
public class TermsModel : PageModel
{
private readonly ILogger<TermsModel> _logger;
public TermsModel(ILogger<TermsModel> logger)
{
_logger = logger;
}
public void OnGet()
{
}
}
}
+107
View File
@@ -0,0 +1,107 @@
@page
@model VeterinaryModel
@{
ViewData["Title"] = "Veterinarian Solutions";
}
<!-- Hero Section -->
<section class="relative overflow-hidden pt-16 pb-20 lg:pt-24 lg:pb-24 bg-gradient-to-b from-white via-slate-50 to-teal-50">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 relative z-10">
<div class="max-w-3xl mx-auto space-y-4 text-center">
<span class="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-teal-50 text-brand-vet text-xs font-bold uppercase tracking-wider">
<i class="fa-solid fa-paw"></i> Animal Clinic Platform
</span>
<h1 class="text-4xl sm:text-5xl font-extrabold text-slate-900 tracking-tight leading-tight">
Purpose-built software <span class="text-brand-vet">for animal clinics</span>
</h1>
<p class="text-lg text-slate-600">
One connected platform for veterinary teams — EHR records, imaging, and diagnostic decision tools shaped around the species you care for, every day.
</p>
<div class="flex flex-col sm:flex-row items-center justify-center gap-4 pt-4">
<a href="/RequestDemo" class="w-full sm:w-auto bg-brand-vet hover:bg-teal-700 text-white font-semibold px-8 py-4 rounded-xl shadow-lg shadow-brand-vet/25 transition-all text-center">
Request a demo <i class="fa-solid fa-arrow-right ml-2"></i>
</a>
<a href="/ClinicalDecisionSupport" class="w-full sm:w-auto bg-white hover:bg-slate-50 text-slate-700 font-semibold px-8 py-4 rounded-xl border border-slate-200 transition-all text-center">
Explore Clinical Decision Support
</a>
</div>
</div>
</div>
</section>
<!-- Features Section -->
<section id="features" class="py-24 bg-white">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="text-center max-w-3xl mx-auto space-y-4 mb-16">
<h2 class="text-xs font-bold tracking-widest text-brand-vet uppercase">Veterinarian Solutions</h2>
<h3 class="text-3xl font-extrabold text-slate-900 tracking-tight">Everything an animal clinic needs, in one connected platform</h3>
<p class="text-slate-600">From the front desk to the imaging suite — purpose-built tools that keep practice operations, clinical records, and diagnostic guidance moving as one.</p>
</div>
<div class="grid grid-cols-1 md:grid-cols-2 gap-8">
<!-- Card 1 -->
<div class="bg-slate-50 p-8 rounded-2xl border border-slate-100 hover:shadow-xl transition-all group">
<div class="w-14 h-14 rounded-xl bg-teal-50 text-brand-vet flex items-center justify-center text-xl font-bold mb-6 group-hover:bg-brand-vet group-hover:text-white transition-colors">
<i class="fa-solid fa-user-group"></i>
</div>
<h4 class="text-xl font-bold text-slate-900 mb-3">Practice &amp; Client Management</h4>
<p class="text-slate-600 text-sm leading-relaxed">
Scheduling, check-in, and owner communication built for the pace of a busy veterinary practice — so appointments flow smoothly and clients stay informed between visits.
</p>
</div>
<!-- Card 2 -->
<div class="bg-slate-50 p-8 rounded-2xl border border-slate-100 hover:shadow-xl transition-all group">
<div class="w-14 h-14 rounded-xl bg-teal-50 text-brand-vet flex items-center justify-center text-xl font-bold mb-6 group-hover:bg-brand-vet group-hover:text-white transition-colors">
<i class="fa-solid fa-file-medical"></i>
</div>
<h4 class="text-xl font-bold text-slate-900 mb-3">EHR Records &amp; Imaging</h4>
<p class="text-slate-600 text-sm leading-relaxed">
A complete medical home for every patient — history, labs, radiographs, and ultrasound organized in one chart and ready the moment you open a case.
</p>
</div>
<!-- Card 3 -->
<div class="bg-slate-50 p-8 rounded-2xl border border-slate-100 hover:shadow-xl transition-all group">
<div class="w-14 h-14 rounded-xl bg-teal-50 text-brand-vet flex items-center justify-center text-xl font-bold mb-6 group-hover:bg-brand-vet group-hover:text-white transition-colors">
<i class="fa-solid fa-paw"></i>
</div>
<h4 class="text-xl font-bold text-slate-900 mb-3">Species-Tailored Decision Tools</h4>
<p class="text-slate-600 text-sm leading-relaxed">
Diagnostic guidance tuned to the species and conditions you see — reference ranges, dosing checks, and interpretations built for animal patients, not adapted from human workflows.
</p>
</div>
<!-- Card 4 -->
<div class="bg-slate-50 p-8 rounded-2xl border border-slate-100 hover:shadow-xl transition-all group">
<div class="w-14 h-14 rounded-xl bg-teal-50 text-brand-vet flex items-center justify-center text-xl font-bold mb-6 group-hover:bg-brand-vet group-hover:text-white transition-colors">
<i class="fa-solid fa-circle-nodes"></i>
</div>
<h4 class="text-xl font-bold text-slate-900 mb-3">Interoperability With Hospital Systems</h4>
<p class="text-slate-600 text-sm leading-relaxed">
Connects to the hospital systems you already run through FHIR® and HL7v2 — no rip-and-replace, no parallel records, no data silos.
</p>
</div>
</div>
</div>
</section>
<!-- CTA Section -->
<section class="py-24 bg-slate-50">
<div class="max-w-5xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="bg-gradient-to-br from-brand-vet to-teal-700 text-white rounded-2xl p-10 sm:p-14 shadow-xl shadow-brand-vet/20 text-center space-y-4">
<h2 class="text-3xl font-extrabold tracking-tight">See veterinary solutions working in your practice</h2>
<p class="text-teal-50 max-w-2xl mx-auto">
Book a walkthrough with our team and watch the full clinic workflow — records, imaging, and diagnostic guidance — run the way your practice actually operates.
</p>
<div class="flex flex-col sm:flex-row items-center justify-center gap-4 pt-2">
<a href="/RequestDemo" class="w-full sm:w-auto bg-white text-brand-vet hover:bg-teal-50 font-semibold px-8 py-4 rounded-xl shadow-md transition-all text-center">
Request a demo <i class="fa-solid fa-arrow-right ml-2"></i>
</a>
<a href="/ClinicalDecisionSupport" class="w-full sm:w-auto text-white font-semibold px-8 py-4 rounded-xl border border-white/40 hover:bg-white/10 transition-all text-center">
Explore Clinical Decision Support
</a>
</div>
</div>
</div>
</section>
+19
View File
@@ -0,0 +1,19 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace plushealthtech.Pages
{
public class VeterinaryModel : PageModel
{
private readonly ILogger<VeterinaryModel> _logger;
public VeterinaryModel(ILogger<VeterinaryModel> logger)
{
_logger = logger;
}
public void OnGet()
{
}
}
}
+7
View File
@@ -1,8 +1,15 @@
using plushealthtech.Mail;
using Microsoft.Extensions.Options;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
// Outbound mail (SMTP / MailPit) for the Contact and Request Demo forms.
builder.Services.Configure<SmtpOptions>(builder.Configuration.GetSection("Smtp"));
builder.Services.AddSingleton<MailSender>();
var app = builder.Build();
// Configure the HTTP request pipeline.
+7 -1
View File
@@ -5,5 +5,11 @@
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
"AllowedHosts": "*",
"Smtp": {
"Host": "tools.host.domain",
"Port": 1025,
"From": "[email protected]",
"To": "[email protected]"
}
}