initial go
This commit is contained in:
parent
52df969253
commit
8ba679afe2
14 changed files with 2246 additions and 10 deletions
24
.gitignore
vendored
Normal file
24
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
# Logs
|
||||
logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
pnpm-debug.log*
|
||||
lerna-debug.log*
|
||||
|
||||
node_modules
|
||||
dist
|
||||
dist-ssr
|
||||
*.local
|
||||
|
||||
# Editor directories and files
|
||||
.vscode/*
|
||||
!.vscode/extensions.json
|
||||
.idea
|
||||
.DS_Store
|
||||
*.suo
|
||||
*.ntvs*
|
||||
*.njsproj
|
||||
*.sln
|
||||
*.sw?
|
||||
9
LICENSE
9
LICENSE
|
|
@ -1,9 +0,0 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) 2026 uncleLukie
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
49
README.md
49
README.md
|
|
@ -1,2 +1,49 @@
|
|||
# sparklabs-6-presentation
|
||||
# The AI Advantage: Rethinking 'Build vs. Buy' in Government IT
|
||||
This repository contains a Reveal.js presentation designed for 2026 government digital graduates. The presentation challenges the traditional government IT procurement model and argues for **Digital Sovereignty** through open-source foundation software customized using Generative AI.
|
||||
|
||||
## 🚀 Running Locally
|
||||
|
||||
1. **Install Dependencies:**
|
||||
```bash
|
||||
npm install
|
||||
```
|
||||
|
||||
2. **Start the Development Server:**
|
||||
```bash
|
||||
npm run dev
|
||||
```
|
||||
Open your browser and navigate to the address shown in your terminal (usually `http://localhost:5173`).
|
||||
|
||||
3. **Open Speaker Notes:**
|
||||
Press **`S`** on your keyboard while viewing the slides to open the presenter's control window with the timer, slide previews, and the exact speaker script.
|
||||
|
||||
---
|
||||
|
||||
## 🎤 Presenter Script
|
||||
A detailed slide-by-slide word-for-word presenter script is available in the [SPEAKER_SCRIPT.md](file:///home/luke/git/sparklabs-6-presentation/SPEAKER_SCRIPT.md) file. You can read it to practice your timing and pacing for the 30-minute talk.
|
||||
|
||||
---
|
||||
|
||||
## 🏗️ Building for Production & Cloudflare Pages
|
||||
To build a static version of the presentation suitable for hosting on Cloudflare Pages, GitHub Pages, or Netlify:
|
||||
|
||||
1. **Compile the Static Site:**
|
||||
```bash
|
||||
npm run build
|
||||
```
|
||||
This creates a optimized `dist/` directory containing all CSS, JS, and HTML bundles.
|
||||
|
||||
2. **Deploy to Cloudflare Pages:**
|
||||
* Point your Cloudflare Pages project to this repository.
|
||||
* Set the **Build Command** to `npm run build`.
|
||||
* Set the **Output Directory** to `dist`.
|
||||
* Trigger the deploy.
|
||||
|
||||
---
|
||||
|
||||
## 🛠️ Tech Stack & Key Files
|
||||
* **Vite:** High-speed development server and bundler.
|
||||
* **Reveal.js:** The core HTML presentation engine.
|
||||
* [index.html](file:///home/luke/git/sparklabs-6-presentation/index.html) - Structural markup and slide layout.
|
||||
* [src/style.css](file:///home/luke/git/sparklabs-6-presentation/src/style.css) - Custom glassmorphic styles, SVG animations, and color scheme.
|
||||
* [src/main.js](file:///home/luke/git/sparklabs-6-presentation/src/main.js) - Reveal.js plugin load configuration and slide interactivity script.
|
||||
|
|
|
|||
171
SPEAKER_SCRIPT.md
Normal file
171
SPEAKER_SCRIPT.md
Normal file
|
|
@ -0,0 +1,171 @@
|
|||
Presenter Script: The AI Advantage
|
||||
|
||||
Title: The AI Advantage: Rethinking 'Build vs. Buy' in Government IT
|
||||
|
||||
Format: 30-Minute Presentation to 2026 Government Digital Graduates
|
||||
|
||||
Presentation Framework: Reveal.js (HTML5/CSS3/JS)
|
||||
|
||||
Presentation Setup & Key Controls
|
||||
|
||||
Before presenting, make sure you are comfortable with these built-in Reveal.js controls:
|
||||
|
||||
Open Speaker Notes (The Secret Weapon): Press S on your keyboard. This opens a separate presenter window showing:
|
||||
|
||||
A timer/chronometer to keep track of your 30-minute block.
|
||||
|
||||
The current slide and the next slide preview.
|
||||
|
||||
The complete speaker notes script.
|
||||
|
||||
Full-screen Mode: Press F to go full-screen in your browser.
|
||||
|
||||
Help Overlay: Press ? to toggle the shortcut help menu.
|
||||
|
||||
Pacing & Timing Guide
|
||||
|
||||
Slides 1–3 (The Irony & The Bill): 8 minutes (Setting the scene, the Australian context, and the psychology of procurement).
|
||||
|
||||
Slides 4–6 (Global Proof & The AI Shift): 10 minutes (Germany's exit, what sovereignty actually means, and why AI changes the math).
|
||||
|
||||
Slides 7–9 (The Pushback & The Playbook): 8 minutes (Handling the "support" excuse, keeping money in QLD, and how grads can start).
|
||||
|
||||
Slide 10 (Closing & Discussion Q&A): 4 minutes + remaining time (Final remarks and opening the floor).
|
||||
|
||||
Slide-by-Slide Script
|
||||
|
||||
Slide 1: Title Slide
|
||||
|
||||
Slide Elements: Clean, minimalist titles, subtle dark background.
|
||||
|
||||
Transition: Fade out.
|
||||
|
||||
Speaker Script:
|
||||
|
||||
"Good afternoon, everyone. Thanks for coming to SparkLabs. I want to start by acknowledging the massive, glaring irony of this presentation.
|
||||
|
||||
I am about to give a talk on why government needs to stop relying on mega-vendors. And I am delivering it to you right now over a Microsoft Teams call, while most of you are watching on Windows laptops, probably taking notes in Microsoft OneNote.
|
||||
|
||||
We are completely captured. Today, we are going to talk about how much that capture costs the Australian taxpayer, and how you—as the next generation of IT leaders—can actually do something about it."
|
||||
|
||||
Slide 2: The Megavendor Rent (The Australian Context)
|
||||
|
||||
Slide Elements: Large text showing "VSA6" and "$1.6 Billion".
|
||||
|
||||
Transition: Slide in, fade out.
|
||||
|
||||
Speaker Script:
|
||||
|
||||
"Let's talk about the bill. In July 2026—literally this month—the federal government's new Volume Sourcing Agreement, or VSA6, kicks in. This locks the Commonwealth, and by extension sets the standard for states like Queensland, into the Microsoft ecosystem until 2031.
|
||||
|
||||
In the last agreement, the government proudly announced they secured $1.6 billion in discounts. I want you to think about that. If the discount is 1.6 billion dollars, what is the actual baseline cost? We aren't buying software anymore; we are paying rent. And when your landlord knows you can't afford the moving truck, they can raise the rent whenever they want."
|
||||
|
||||
Slide 3: The Psychology of Procurement (Cover Your Ass)
|
||||
|
||||
Slide Elements: A graphic showing the "Safe Choice" vs the "Sovereign Choice".
|
||||
|
||||
Transition: Slide in, fade out.
|
||||
|
||||
Speaker Script:
|
||||
|
||||
"So why do incredibly smart executives keep signing these deals? Because of the oldest rule in government IT: Nobody ever got fired for buying Microsoft.
|
||||
|
||||
It is a culture of ass-covering. Think back to July 2024. CrowdStrike pushes a bad update to Windows machines and takes down Qantas, the Commonwealth Bank, supermarkets, and government networks. It cost the economy billions. Did any government IT director get fired for that? No, it was an 'industry outage.'
|
||||
|
||||
But if a team of internal grads builds a custom app for QLD Health and it goes down for twenty minutes, someone is getting dragged into a Senate estimates hearing. We outsource to vendors because we are outsourcing the blame."
|
||||
|
||||
Slide 4: Real Sovereignty (The Global Rebellion)
|
||||
|
||||
Slide Elements: Map highlighting Schleswig-Holstein (Germany) and France.
|
||||
|
||||
Transition: Slide in, fade out.
|
||||
|
||||
Speaker Script:
|
||||
|
||||
"But other governments are waking up to this trap. If you think ditching Microsoft is a pipe dream, look at Germany.
|
||||
|
||||
Right now, the German state of Schleswig-Holstein is in the middle of migrating 30,000 public servants off Windows and Microsoft Office, entirely over to Linux and LibreOffice. Why? Their minister explicitly stated it was about 'Digital Sovereignty'. They realized that handing their citizens' data and their government's operational capability to a foreign corporation was a massive national security risk.
|
||||
|
||||
France's national police force did the same thing with GendBuntu, saving millions and taking back control of their infrastructure. It is entirely possible to break the habit."
|
||||
|
||||
Slide 5: The AI Multiplier (Why Now?)
|
||||
|
||||
Slide Elements: Graph showing historical cost of custom dev vs modern AI-assisted dev.
|
||||
|
||||
Transition: Slide in, fade out.
|
||||
|
||||
Speaker Script:
|
||||
|
||||
"The pushback has always been: 'We don't have the armies of developers needed to build and maintain our own stuff.' And five years ago, they were right. Building custom government software was a nightmare.
|
||||
|
||||
But that argument is dead now. Generative AI has permanently changed the math. A small, cross-functional team of BAs, designers, and developers using AI coding assistants can spin up, test, and deploy open-source infrastructure in weeks instead of years. We don't have to force Queensland business processes into rigid, off-the-shelf vendor templates anymore. AI makes building sovereign software cheaper than renting proprietary software."
|
||||
|
||||
Slide 6: The Local Economy (Where Does the Money Go?)
|
||||
|
||||
Slide Elements: Taxpayer money flowing to Seattle vs flowing to Brisbane/Fortitude Valley.
|
||||
|
||||
Transition: Slide in, fade out.
|
||||
|
||||
Speaker Script:
|
||||
|
||||
"And this isn't just a technical argument; it is an economic one.
|
||||
|
||||
When we sign a massive SaaS contract, hundreds of millions of Queensland taxpayer dollars go straight to a server farm in Seattle. If we take even a fraction of that licensing budget and redirect it to building open-source sovereign capability, where does that money go?
|
||||
|
||||
It stays in Queensland. It pays for local graduate jobs. It funds local Brisbane tech startups who we can hire to support our open-source infrastructure. We should be using government tech budgets to build the local economy, not pad the margins of a multinational."
|
||||
|
||||
Slide 7: Debunking the Support Myth
|
||||
|
||||
Slide Elements: Side-by-side comparison of "Vendor Support Ticket" vs "Local Open Source Fix".
|
||||
|
||||
Transition: Slide in, fade out.
|
||||
|
||||
Speaker Script:
|
||||
|
||||
"The moment you suggest open source, someone in management will say, 'But who do we call when it breaks? We need a vendor SLA.'
|
||||
|
||||
Let's be real about what a vendor SLA actually is. When a major cloud provider breaches their uptime, they don't pay us back for the economic damage. They give us a service credit on next month's bill. We lose public trust, they lose a fraction of a percent of profit.
|
||||
|
||||
When you own the code, you own the fix. And with AI tools, our internal teams can diagnose and patch issues faster than waiting three weeks for a vendor's Level 1 support desk to escalate a ticket."
|
||||
|
||||
Slide 8: The Choice for 2026 Grads
|
||||
|
||||
Slide Elements: Two text blocks: "License Administrator" vs "Sovereign Builder".
|
||||
|
||||
Transition: Slide in, fade out.
|
||||
|
||||
Speaker Script:
|
||||
|
||||
"You are the 2026 digital graduates. In five years, you are going to be the lead enterprise architects, the senior BAs, and the design directors for the Queensland government.
|
||||
|
||||
You have a choice on what your career looks like. You can be a professional license administrator—spending the next forty years managing vendor lock-in, configuring dropdowns in proprietary software, and apologizing to users for things you can't fix.
|
||||
|
||||
Or, you can be builders. You can champion open standards, use AI to create incredible local systems, and actually own the infrastructure that runs this state."
|
||||
|
||||
Slide 9: The Playbook
|
||||
|
||||
Slide Elements: 3 steps: 1. Audit the lock-in. 2. Assess Open Source. 3. Build a prototype.
|
||||
|
||||
Transition: Slide in, fade out.
|
||||
|
||||
Speaker Script:
|
||||
|
||||
"How do we actually start? You don't walk into work tomorrow and try to unplug the state's payroll system.
|
||||
|
||||
You start at the project level. For your next assignment, when the team defaults to 'Let's just buy a SaaS product for this,' push back. Mandate an open-source viability assessment. Find a terrible, clunky manual process in your department. Use an AI assistant to scaffold a clean, open-source web app to fix it.
|
||||
|
||||
Senior leadership runs on proof. Show theSpend your career configuring enterprise templates,m a working tool built in three weeks with zero licensing fees, and the vendor lock-in arguments start to fall apart."
|
||||
|
||||
Slide 10: Conclusion
|
||||
|
||||
Slide Elements: Large text: "Public Funds. Public Infrastructure."
|
||||
|
||||
Transition: Fade in.
|
||||
|
||||
Speaker Script:
|
||||
|
||||
"Digital infrastructure is exactly like physical infrastructure. We wouldn't let a private foreign company own the M1 motorway and charge Queenslanders a toll every time they drive to work. We shouldn't let them own the digital highways our citizens rely on either.
|
||||
|
||||
Public funds should build public infrastructure. Let's start building it.
|
||||
|
||||
Thanks for listening. I'd love to open the floor up—what proprietary tools are driving you crazy right now, and what could we replace them with?"
|
||||
349
index.html
Normal file
349
index.html
Normal file
|
|
@ -0,0 +1,349 @@
|
|||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>The AI Advantage: Rethinking 'Build vs. Buy' in Government IT</title>
|
||||
|
||||
<!-- SEO and Meta tags -->
|
||||
<meta name="description" content="A provocative and disruptive 30-minute presentation deck arguing for digital sovereignty and AI-powered custom build over vendor lock-in in government IT." />
|
||||
|
||||
<!-- Google Fonts -->
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;600;700;800&family=Space+Grotesk:wght@400;500;600;700&family=Fira+Code:wght@400;500&display=swap" rel="stylesheet">
|
||||
</head>
|
||||
<body>
|
||||
<div class="reveal">
|
||||
<div class="slides">
|
||||
|
||||
<!-- Slide 1: Title Slide -->
|
||||
<section id="slide-title" class="slide-content title-slide" data-transition="fade-out">
|
||||
<div class="glow-orb" id="orb-1"></div>
|
||||
<div class="title-container">
|
||||
<h1 class="main-title">THE <span class="highlight-cyan">AI</span> ADVANTAGE</h1>
|
||||
<p class="main-subtitle text-gradient-purple">Rethinking "Build vs. Buy" in Government IT</p>
|
||||
<div class="divider"></div>
|
||||
<p class="tagline">A Playbook for Digital Sovereignty in the Generative Era</p>
|
||||
<div class="audience-badge">2026 Government Digital Graduates</div>
|
||||
</div>
|
||||
|
||||
<aside class="notes">
|
||||
Good afternoon, graduates. Today, we're going to talk about a trillion-dollar problem. We're going to talk about how government IT became a hostage situation, and how you—armed with generative AI and open-source infrastructure—are going to stage the rescue mission. You're entering public service at the most disruptive moment in the history of technology. Let's make sure you aren't spending it managing vendor licenses.
|
||||
</aside>
|
||||
</section>
|
||||
|
||||
<!-- Slide 2: The Status Quo -->
|
||||
<section id="slide-status-quo" class="slide-content" data-transition="slide-in fade-out">
|
||||
<h2 class="slide-header">The Mega-Vendor Tax</h2>
|
||||
|
||||
<div class="grid-2col">
|
||||
<div class="card glassmorphic shadow-red animate-pulse-border">
|
||||
<div class="card-badge bg-red">THE BUDGET HOLE</div>
|
||||
<h3 class="card-title text-red">Proprietary Licensing</h3>
|
||||
<p class="card-desc">Millions of dollars funneled annually to mega-vendors for generic office utilities and closed-source databases.</p>
|
||||
|
||||
<!-- SVG Visualisation: Tax Drain -->
|
||||
<svg viewBox="0 0 200 100" class="mini-chart" id="svg-tax-drain">
|
||||
<circle cx="50" cy="50" r="35" fill="none" stroke="#ef4444" stroke-width="4" stroke-dasharray="220" />
|
||||
<path d="M 50 15 L 150 50" stroke="#ef4444" stroke-dasharray="5 5" stroke-width="2">
|
||||
<animate attributeName="stroke-dashoffset" values="50;0" dur="2s" repeatCount="indefinite" />
|
||||
</path>
|
||||
<circle cx="150" cy="50" r="25" fill="#ef4444" opacity="0.2" />
|
||||
<text x="50" y="55" fill="#f3f4f6" font-size="12" font-family="Space Grotesk" text-anchor="middle">Public Funds</text>
|
||||
<text x="150" y="55" fill="#ef4444" font-size="12" font-family="Space Grotesk" text-anchor="middle">Vendor</text>
|
||||
</svg>
|
||||
</div>
|
||||
|
||||
<div class="card glassmorphic shadow-cyan">
|
||||
<div class="card-badge bg-cyan">THE STAT</div>
|
||||
<div class="big-metric text-gradient-cyan">80%</div>
|
||||
<p class="metric-label">of typical public IT budgets are locked into maintaining static legacy vendor software with zero active development.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<aside class="notes">
|
||||
Let's start with a hard truth. Government departments spend billions of dollars every single year on software licensing. You will enter departments where millions are spent just to license basic tools like case management databases. Historically, custom building was deemed too risky. So, we bought off-the-shelf software from mega-vendors. But we didn't just buy software; we bought vendor lock-in. We signed up for a subscription tax that drains public funds and leaves us dependent on foreign tech giants.
|
||||
</aside>
|
||||
</section>
|
||||
|
||||
<!-- Slide 3: The Procurement Trap -->
|
||||
<section id="slide-procurement" class="slide-content" data-transition="slide-in fade-out">
|
||||
<h2 class="slide-header">The Procurement Trap</h2>
|
||||
<p class="slide-subtitle text-gradient-purple">The Cover-Your-Ass (CYA) Lifecycle</p>
|
||||
|
||||
<!-- Visual: Waterfall CYA Steps -->
|
||||
<div class="pipeline-container">
|
||||
<div class="pipeline-step">
|
||||
<div class="step-num">01</div>
|
||||
<div class="step-label">CYA Planning</div>
|
||||
<div class="step-duration">12 - 18 Months</div>
|
||||
<p class="step-detail">Writing 300-page specs to shift liability.</p>
|
||||
</div>
|
||||
<div class="arrow-connector">➔</div>
|
||||
<div class="pipeline-step">
|
||||
<div class="step-num">02</div>
|
||||
<div class="step-label">RFP & Legal</div>
|
||||
<div class="step-duration">6 - 12 Months</div>
|
||||
<p class="step-detail">Mega-vendors dominate with dedicated bidding teams.</p>
|
||||
</div>
|
||||
<div class="arrow-connector">➔</div>
|
||||
<div class="pipeline-step warning-glow">
|
||||
<div class="step-num text-red">03</div>
|
||||
<div class="step-label text-red">Outdated Launch</div>
|
||||
<div class="step-duration text-grey">Day 1</div>
|
||||
<p class="step-detail">Delivered system is obsolete before first login.</p>
|
||||
</div>
|
||||
<div class="arrow-connector">➔</div>
|
||||
<div class="pipeline-step highlight-cyan-glow">
|
||||
<div class="step-num text-cyan">04</div>
|
||||
<div class="step-label text-cyan">Locked In</div>
|
||||
<div class="step-duration text-cyan">5+ Year Contract</div>
|
||||
<p class="step-detail">Paying consultants $300/hr for minor edits.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<aside class="notes">
|
||||
Why does this happen? It's driven by a culture of 'Cover Your Ass'. In government, buying from a massive vendor is the ultimate shield. If a project fails and you bought it from Microsoft or Accenture, nobody gets fired. It's the vendor's fault. But if you try to build it internally and it fails, it's on you. This fear has created an 18-month procurement cycle where we write 300-page requirement documents for software that is already obsolete by the time the contract is signed.
|
||||
</aside>
|
||||
</section>
|
||||
|
||||
<!-- Slide 4: The Generative Shift -->
|
||||
<section id="slide-generative-shift" class="slide-content" data-transition="slide-in fade-out">
|
||||
<h2 class="slide-header">The Generative Shift</h2>
|
||||
|
||||
<div class="grid-2col align-center">
|
||||
<div class="chart-container glassmorphic">
|
||||
<!-- SVG Graph: Cost of Custom Build Over Time -->
|
||||
<svg viewBox="0 0 400 200" class="main-svg-chart" id="svg-cost-curve">
|
||||
<!-- Grid Lines -->
|
||||
<line x1="40" y1="20" x2="40" y2="170" stroke="#2e303a" stroke-width="1" />
|
||||
<line x1="40" y1="170" x2="380" y2="170" stroke="#2e303a" stroke-width="1" />
|
||||
|
||||
<!-- Y-Axis labels -->
|
||||
<text x="30" y="25" fill="#9ca3af" font-size="9" text-anchor="end">High Cost</text>
|
||||
<text x="30" y="170" fill="#9ca3af" font-size="9" text-anchor="end">$0</text>
|
||||
|
||||
<!-- X-Axis labels -->
|
||||
<text x="40" y="185" fill="#9ca3af" font-size="9" text-anchor="middle">2020</text>
|
||||
<text x="210" y="185" fill="#9ca3af" font-size="9" text-anchor="middle">2023 (LLM Boom)</text>
|
||||
<text x="360" y="185" fill="#9ca3af" font-size="9" text-anchor="middle">2026</text>
|
||||
|
||||
<!-- COTS cost curve (stays high) -->
|
||||
<path d="M 40 40 Q 210 40 360 35" fill="none" stroke="#ef4444" stroke-width="3" />
|
||||
<text x="350" y="55" fill="#ef4444" font-size="9" text-anchor="end">SaaS Subscription Cost</text>
|
||||
|
||||
<!-- AI-Assisted Build cost curve (drops sharply) -->
|
||||
<path d="M 40 50 Q 150 60 210 120 T 360 160" fill="none" stroke="#06b6d4" stroke-width="3" id="ai-path" />
|
||||
<text x="280" y="145" fill="#06b6d4" font-size="9">AI-Assisted Build Cost</text>
|
||||
</svg>
|
||||
</div>
|
||||
|
||||
<div class="text-block text-left">
|
||||
<h3 class="highlight-cyan font-grotesk">The Death of the Trade-off</h3>
|
||||
<p class="margin-bottom-md">Traditional software required a massive engineering budget. Today, AI-powered coding agents dramatically compress development loops.</p>
|
||||
<ul class="clean-list">
|
||||
<li><span class="text-cyan">➔</span> <strong class="text-white">90% Reduction</strong> in lines of code written by hand.</li>
|
||||
<li><span class="text-cyan">➔</span> <strong class="text-white">Instant Scaffolding</strong> of databases & APIs.</li>
|
||||
<li><span class="text-cyan">➔</span> <strong class="text-white">Sovereign Hosting</strong> on public/internal cloud.</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<aside class="notes">
|
||||
But the calculus has completely changed. In 2026, the old trade-offs of 'Build vs. Buy' are dead. Historically, building custom software required massive engineering teams, multi-million dollar budgets, and years of development. Today, generative AI tools act as massive force multipliers. A single graduate developer, equipped with AI coding agents, can build, document, and test a custom application in weeks. The financial justification for vendor lock-in has crashed.
|
||||
</aside>
|
||||
</section>
|
||||
|
||||
<!-- Slide 5: Digital Sovereignty -->
|
||||
<section id="slide-sovereignty" class="slide-content" data-transition="slide-in fade-out">
|
||||
<h2 class="slide-header">Digital Sovereignty</h2>
|
||||
<p class="slide-subtitle text-gradient-cyan">Choosing Who Controls Your Infrastructure</p>
|
||||
|
||||
<div class="grid-2col margin-top-md">
|
||||
<div class="card glassmorphic hover-red-glow">
|
||||
<div class="card-badge bg-red">PROPRIETARY COLONY</div>
|
||||
<ul class="sovereign-list">
|
||||
<li class="locked-item">Data processed through black-box vendor APIs</li>
|
||||
<li class="locked-item">Codebase owned entirely by the supplier</li>
|
||||
<li class="locked-item">Compulsory SaaS licensing fee increases</li>
|
||||
<li class="locked-item">Dependency on vendor roadmap for updates</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="card glassmorphic highlight-cyan-glow">
|
||||
<div class="card-badge bg-cyan">SOVEREIGN STATE</div>
|
||||
<ul class="sovereign-list">
|
||||
<li class="free-item">Self-hosted, transparent open-source LLMs</li>
|
||||
<li class="free-item">Full ownership and visibility of the codebase</li>
|
||||
<li class="free-item">$0 licensing fees — pay only for compute</li>
|
||||
<li class="free-item">Deploy customizations at the speed of command</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<aside class="notes">
|
||||
The alternative is Digital Sovereignty. It's the simple idea that a sovereign nation should own and control the digital infrastructure it relies on. When we buy proprietary SaaS platforms, we hand over our data, our workflows, and our public capabilities to private entities. If we want to change a form, we have to pay a consultant $300 an hour. Digital sovereignty means we use open-source foundation models, write our own custom wrappers, and host them on our own cloud infrastructure. We control our own destiny.
|
||||
</aside>
|
||||
</section>
|
||||
|
||||
<!-- Slide 6: Case Study -->
|
||||
<section id="slide-case-study" class="slide-content" data-transition="slide-in fade-out">
|
||||
<h2 class="slide-header">Case Management Reimagined</h2>
|
||||
|
||||
<table class="sovereign-table glassmorphic margin-top-md">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Criteria</th>
|
||||
<th class="text-red">Commercial SaaS (COTS)</th>
|
||||
<th class="text-cyan">Sovereign Build (AI-Driven)</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="table-label">Licensing Cost</td>
|
||||
<td class="text-red">$180 per user / month</td>
|
||||
<td class="text-cyan">$0 (Compute only)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="table-label">Customization</td>
|
||||
<td class="text-red">Paid contractor config contracts</td>
|
||||
<td class="text-cyan">AI code updates in minutes</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="table-label">Integration</td>
|
||||
<td class="text-red">Complex proprietary APIs</td>
|
||||
<td class="text-cyan">Standard open-source APIs</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="table-label">Data Privacy</td>
|
||||
<td class="text-red">Stored in vendor cloud tenant</td>
|
||||
<td class="text-cyan">Fully isolated in local gov cloud</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<aside class="notes">
|
||||
Let's look at a concrete example. Imagine a case management system for a public services department. Traditional route: Buy a major SaaS platform, pay $150 per user per month, plus $2 million in customization fees. Under the new model: We use a lightweight open-source template. We use AI to build custom integrations for our specific departmental workflows in two weeks. Total licensing cost: Zero. Total control: Absolute. The money we save is reinvested back into building local capabilities.
|
||||
</aside>
|
||||
</section>
|
||||
|
||||
<!-- Slide 7: Debunking Support -->
|
||||
<section id="slide-support-myth" class="slide-content" data-transition="slide-in fade-out">
|
||||
<h2 class="slide-header">"But Who Will Support It?"</h2>
|
||||
<p class="slide-subtitle text-gradient-purple">The Myth of Vendor Support Liability</p>
|
||||
|
||||
<div class="grid-2col margin-top-md">
|
||||
<div class="card glassmorphic">
|
||||
<h4 class="text-red">The Vendor Support Illusion</h4>
|
||||
<div class="flow-chart">
|
||||
<div class="flow-node border-red">Bug Detected</div>
|
||||
<div class="flow-arrow">▼</div>
|
||||
<div class="flow-node border-red">Open Support Ticket</div>
|
||||
<div class="flow-arrow">▼</div>
|
||||
<div class="flow-node border-red">Wait 3 Weeks for Escalation</div>
|
||||
<div class="flow-arrow">▼</div>
|
||||
<div class="flow-node border-red">"Works as Intended / Paid Request"</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card glassmorphic highlight-cyan-glow">
|
||||
<h4 class="text-cyan">The AI-Powered Sovereign Dev</h4>
|
||||
<div class="flow-chart">
|
||||
<div class="flow-node border-cyan">Bug Detected</div>
|
||||
<div class="flow-arrow">▼</div>
|
||||
<div class="flow-node border-cyan">AI Agent Diagnoses Trace</div>
|
||||
<div class="flow-arrow">▼</div>
|
||||
<div class="flow-node border-cyan">Dev Reviews Generated Patch</div>
|
||||
<div class="flow-arrow">▼</div>
|
||||
<div class="flow-node border-cyan">Test Passed & Deployed (15 mins)</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<aside class="notes">
|
||||
The number one objection you will hear from senior management is: 'But if we build it ourselves, who will support it when it breaks? We need a vendor for liability.' This is an illusion. The reality of vendor support is endless ticket queues, escalating costs, and finger-pointing. With modern AI-assisted engineering, your own team can maintain sovereign code. AI agents can analyze log traces, pinpoint bugs, write unit tests, and suggest patches. You are not just building software; you are building the capability to support it.
|
||||
</aside>
|
||||
</section>
|
||||
|
||||
<!-- Slide 8: The Choice -->
|
||||
<section id="slide-choice" class="slide-content" data-transition="slide-in fade-out">
|
||||
<h2 class="slide-header">The Graduate's Choice</h2>
|
||||
|
||||
<div class="grid-2col margin-top-md">
|
||||
<div class="card glassmorphic choice-card locked-opacity" id="choice-admin">
|
||||
<div class="card-icon text-grey">📋</div>
|
||||
<h3 class="card-title text-grey">License Administrator</h3>
|
||||
<p class="choice-text">Spend your career configuring enterprise templates, filing vendor tickets, and managing access tokens.</p>
|
||||
<div class="choice-footer text-red">Vendor Locked-in Career</div>
|
||||
</div>
|
||||
|
||||
<div class="card glassmorphic choice-card highlight-cyan-glow animate-pulse-border" id="choice-builder">
|
||||
<div class="card-icon text-cyan">⚡</div>
|
||||
<h3 class="card-title text-cyan">Sovereign Builder</h3>
|
||||
<p class="choice-text">Use AI agents to design microservices, customize open-source infrastructure, and deploy real digital products.</p>
|
||||
<div class="choice-footer text-cyan">Future-Proof Architect</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<aside class="notes">
|
||||
As graduates entering the digital stream in 2026, you face a critical choice. You can become professional license administrators—spending your careers configuring proprietary templates and managing vendor relationships. Or, you can become sovereign builders. You can use generative AI to write code, design architectures, and deploy open-source solutions that actually solve problems for citizens. Choose to build. Choose to be sovereign.
|
||||
</aside>
|
||||
</section>
|
||||
|
||||
<!-- Slide 9: The Playbook -->
|
||||
<section id="slide-playbook" class="slide-content" data-transition="slide-in fade-out">
|
||||
<h2 class="slide-header">The Sovereign Playbook</h2>
|
||||
<p class="slide-subtitle text-gradient-cyan">How to Disrupt the Status Quo Tomorrow</p>
|
||||
|
||||
<div class="playbook-steps margin-top-md">
|
||||
<div class="playbook-card glassmorphic">
|
||||
<div class="playbook-num text-cyan">01</div>
|
||||
<h4 class="playbook-title text-white">Find the excel mess</h4>
|
||||
<p class="playbook-body">Identify a slow, manual database-in-a-spreadsheet or a paper-and-form process.</p>
|
||||
</div>
|
||||
<div class="playbook-card glassmorphic">
|
||||
<div class="playbook-num text-cyan">02</div>
|
||||
<h4 class="playbook-title text-white">Scaffold open source</h4>
|
||||
<p class="playbook-body">Use a clean, secure open-source template (Node, Python, Postgres) as your base.</p>
|
||||
</div>
|
||||
<div class="playbook-card glassmorphic">
|
||||
<div class="playbook-num text-cyan">03</div>
|
||||
<h4 class="playbook-title text-white">Code with AI agents</h4>
|
||||
<p class="playbook-body">Let generative agents write custom business rules, API connectors, and unit tests.</p>
|
||||
</div>
|
||||
<div class="playbook-card glassmorphic">
|
||||
<div class="playbook-num text-cyan">04</div>
|
||||
<h4 class="playbook-title text-white">Ship and show</h4>
|
||||
<p class="playbook-body">Deploy internally. Show a working tool to leadership before they even write the RFP.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<aside class="notes">
|
||||
How do you do this without getting crushed by the bureaucracy? Follow the playbook. Don't try to rewrite the core taxation system on day one. Start small. Find a manual Excel process or a clunky form. Scaffold an open-source tool. Use AI to write the custom business logic. Deploy it on internal infrastructure. Show, don't tell. Once senior leadership sees a working tool built in three weeks for zero dollars, the procurement arguments start to crumble.
|
||||
</aside>
|
||||
</section>
|
||||
|
||||
<!-- Slide 10: Conclusion -->
|
||||
<section id="slide-conclusion" class="slide-content title-slide" data-transition="fade-in">
|
||||
<div class="glow-orb" id="orb-2"></div>
|
||||
<div class="title-container">
|
||||
<h1 class="main-title big-bold text-gradient-cyan">PUBLIC FUNDS</h1>
|
||||
<h1 class="main-title big-bold text-gradient-purple">PUBLIC CODE</h1>
|
||||
<div class="divider"></div>
|
||||
<p class="tagline">Let's build a sovereign future.</p>
|
||||
<div class="q-a-badge">Questions & Discussion</div>
|
||||
</div>
|
||||
|
||||
<aside class="notes">
|
||||
Let's build a future where public funds create public code. Let's build a government that is capable, agile, and sovereign. You have the tools, the technology, and the opportunity. Thank you, and let's get to work.
|
||||
</aside>
|
||||
</section>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script type="module" src="/src/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
911
package-lock.json
generated
Normal file
911
package-lock.json
generated
Normal file
|
|
@ -0,0 +1,911 @@
|
|||
{
|
||||
"name": "sparklabs-6-presentation",
|
||||
"version": "0.0.0",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "sparklabs-6-presentation",
|
||||
"version": "0.0.0",
|
||||
"dependencies": {
|
||||
"reveal.js": "^6.0.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"vite": "^8.0.12"
|
||||
}
|
||||
},
|
||||
"node_modules/@emnapi/core": {
|
||||
"version": "1.10.0",
|
||||
"resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz",
|
||||
"integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"@emnapi/wasi-threads": "1.2.1",
|
||||
"tslib": "^2.4.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@emnapi/runtime": {
|
||||
"version": "1.10.0",
|
||||
"resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz",
|
||||
"integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"tslib": "^2.4.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@emnapi/wasi-threads": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz",
|
||||
"integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"tslib": "^2.4.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@napi-rs/wasm-runtime": {
|
||||
"version": "1.1.5",
|
||||
"resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.5.tgz",
|
||||
"integrity": "sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"@tybys/wasm-util": "^0.10.2"
|
||||
},
|
||||
"funding": {
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/Brooooooklyn"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@emnapi/core": "^1.7.1",
|
||||
"@emnapi/runtime": "^1.7.1"
|
||||
}
|
||||
},
|
||||
"node_modules/@oxc-project/types": {
|
||||
"version": "0.133.0",
|
||||
"resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.133.0.tgz",
|
||||
"integrity": "sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/Boshen"
|
||||
}
|
||||
},
|
||||
"node_modules/@rolldown/binding-android-arm64": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.3.tgz",
|
||||
"integrity": "sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"android"
|
||||
],
|
||||
"engines": {
|
||||
"node": "^20.19.0 || >=22.12.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@rolldown/binding-darwin-arm64": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.3.tgz",
|
||||
"integrity": "sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"darwin"
|
||||
],
|
||||
"engines": {
|
||||
"node": "^20.19.0 || >=22.12.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@rolldown/binding-darwin-x64": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.3.tgz",
|
||||
"integrity": "sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"darwin"
|
||||
],
|
||||
"engines": {
|
||||
"node": "^20.19.0 || >=22.12.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@rolldown/binding-freebsd-x64": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.3.tgz",
|
||||
"integrity": "sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"freebsd"
|
||||
],
|
||||
"engines": {
|
||||
"node": "^20.19.0 || >=22.12.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@rolldown/binding-linux-arm-gnueabihf": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.3.tgz",
|
||||
"integrity": "sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": "^20.19.0 || >=22.12.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@rolldown/binding-linux-arm64-gnu": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.3.tgz",
|
||||
"integrity": "sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"glibc"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": "^20.19.0 || >=22.12.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@rolldown/binding-linux-arm64-musl": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.3.tgz",
|
||||
"integrity": "sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"musl"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": "^20.19.0 || >=22.12.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@rolldown/binding-linux-ppc64-gnu": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.3.tgz",
|
||||
"integrity": "sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==",
|
||||
"cpu": [
|
||||
"ppc64"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"glibc"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": "^20.19.0 || >=22.12.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@rolldown/binding-linux-s390x-gnu": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.3.tgz",
|
||||
"integrity": "sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==",
|
||||
"cpu": [
|
||||
"s390x"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"glibc"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": "^20.19.0 || >=22.12.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@rolldown/binding-linux-x64-gnu": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.3.tgz",
|
||||
"integrity": "sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"glibc"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": "^20.19.0 || >=22.12.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@rolldown/binding-linux-x64-musl": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.3.tgz",
|
||||
"integrity": "sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"musl"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": "^20.19.0 || >=22.12.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@rolldown/binding-openharmony-arm64": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.3.tgz",
|
||||
"integrity": "sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"openharmony"
|
||||
],
|
||||
"engines": {
|
||||
"node": "^20.19.0 || >=22.12.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@rolldown/binding-wasm32-wasi": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.3.tgz",
|
||||
"integrity": "sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg==",
|
||||
"cpu": [
|
||||
"wasm32"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"@emnapi/core": "1.10.0",
|
||||
"@emnapi/runtime": "1.10.0",
|
||||
"@napi-rs/wasm-runtime": "^1.1.4"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^20.19.0 || >=22.12.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@rolldown/binding-win32-arm64-msvc": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.3.tgz",
|
||||
"integrity": "sha512-gEdFFEN70A/jxb2svrWsN3aDL7OUtmvlOy+6fa2jxG8K0wQ1ZbdeLGnidov6Yu5/733dI5ySfzFlQ/cb0bSz1g==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"win32"
|
||||
],
|
||||
"engines": {
|
||||
"node": "^20.19.0 || >=22.12.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@rolldown/binding-win32-x64-msvc": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.3.tgz",
|
||||
"integrity": "sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"win32"
|
||||
],
|
||||
"engines": {
|
||||
"node": "^20.19.0 || >=22.12.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@rolldown/pluginutils": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz",
|
||||
"integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@tybys/wasm-util": {
|
||||
"version": "0.10.2",
|
||||
"resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz",
|
||||
"integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"tslib": "^2.4.0"
|
||||
}
|
||||
},
|
||||
"node_modules/detect-libc": {
|
||||
"version": "2.1.2",
|
||||
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
|
||||
"integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/fdir": {
|
||||
"version": "6.5.0",
|
||||
"resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
|
||||
"integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=12.0.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"picomatch": "^3 || ^4"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"picomatch": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/fsevents": {
|
||||
"version": "2.3.3",
|
||||
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
|
||||
"integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
|
||||
"dev": true,
|
||||
"hasInstallScript": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"darwin"
|
||||
],
|
||||
"engines": {
|
||||
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/lightningcss": {
|
||||
"version": "1.32.0",
|
||||
"resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz",
|
||||
"integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==",
|
||||
"dev": true,
|
||||
"license": "MPL-2.0",
|
||||
"dependencies": {
|
||||
"detect-libc": "^2.0.3"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 12.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"lightningcss-android-arm64": "1.32.0",
|
||||
"lightningcss-darwin-arm64": "1.32.0",
|
||||
"lightningcss-darwin-x64": "1.32.0",
|
||||
"lightningcss-freebsd-x64": "1.32.0",
|
||||
"lightningcss-linux-arm-gnueabihf": "1.32.0",
|
||||
"lightningcss-linux-arm64-gnu": "1.32.0",
|
||||
"lightningcss-linux-arm64-musl": "1.32.0",
|
||||
"lightningcss-linux-x64-gnu": "1.32.0",
|
||||
"lightningcss-linux-x64-musl": "1.32.0",
|
||||
"lightningcss-win32-arm64-msvc": "1.32.0",
|
||||
"lightningcss-win32-x64-msvc": "1.32.0"
|
||||
}
|
||||
},
|
||||
"node_modules/lightningcss-android-arm64": {
|
||||
"version": "1.32.0",
|
||||
"resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz",
|
||||
"integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MPL-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"android"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 12.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/lightningcss-darwin-arm64": {
|
||||
"version": "1.32.0",
|
||||
"resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz",
|
||||
"integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MPL-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"darwin"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 12.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/lightningcss-darwin-x64": {
|
||||
"version": "1.32.0",
|
||||
"resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz",
|
||||
"integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MPL-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"darwin"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 12.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/lightningcss-freebsd-x64": {
|
||||
"version": "1.32.0",
|
||||
"resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz",
|
||||
"integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MPL-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"freebsd"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 12.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/lightningcss-linux-arm-gnueabihf": {
|
||||
"version": "1.32.0",
|
||||
"resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz",
|
||||
"integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MPL-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 12.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/lightningcss-linux-arm64-gnu": {
|
||||
"version": "1.32.0",
|
||||
"resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz",
|
||||
"integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"glibc"
|
||||
],
|
||||
"license": "MPL-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 12.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/lightningcss-linux-arm64-musl": {
|
||||
"version": "1.32.0",
|
||||
"resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz",
|
||||
"integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"musl"
|
||||
],
|
||||
"license": "MPL-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 12.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/lightningcss-linux-x64-gnu": {
|
||||
"version": "1.32.0",
|
||||
"resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz",
|
||||
"integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"glibc"
|
||||
],
|
||||
"license": "MPL-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 12.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/lightningcss-linux-x64-musl": {
|
||||
"version": "1.32.0",
|
||||
"resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz",
|
||||
"integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"musl"
|
||||
],
|
||||
"license": "MPL-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 12.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/lightningcss-win32-arm64-msvc": {
|
||||
"version": "1.32.0",
|
||||
"resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz",
|
||||
"integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MPL-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"win32"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 12.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/lightningcss-win32-x64-msvc": {
|
||||
"version": "1.32.0",
|
||||
"resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz",
|
||||
"integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MPL-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"win32"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 12.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/parcel"
|
||||
}
|
||||
},
|
||||
"node_modules/nanoid": {
|
||||
"version": "3.3.15",
|
||||
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz",
|
||||
"integrity": "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==",
|
||||
"dev": true,
|
||||
"funding": [
|
||||
{
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/ai"
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"bin": {
|
||||
"nanoid": "bin/nanoid.cjs"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
|
||||
}
|
||||
},
|
||||
"node_modules/picocolors": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
|
||||
"integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
|
||||
"dev": true,
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/picomatch": {
|
||||
"version": "4.0.4",
|
||||
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
|
||||
"integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/jonschlinkert"
|
||||
}
|
||||
},
|
||||
"node_modules/postcss": {
|
||||
"version": "8.5.15",
|
||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz",
|
||||
"integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==",
|
||||
"dev": true,
|
||||
"funding": [
|
||||
{
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/postcss/"
|
||||
},
|
||||
{
|
||||
"type": "tidelift",
|
||||
"url": "https://tidelift.com/funding/github/npm/postcss"
|
||||
},
|
||||
{
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/ai"
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"nanoid": "^3.3.12",
|
||||
"picocolors": "^1.1.1",
|
||||
"source-map-js": "^1.2.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^10 || ^12 || >=14"
|
||||
}
|
||||
},
|
||||
"node_modules/reveal.js": {
|
||||
"version": "6.0.1",
|
||||
"resolved": "https://registry.npmjs.org/reveal.js/-/reveal.js-6.0.1.tgz",
|
||||
"integrity": "sha512-9eacArNIgqO2HGWOK+93gJNn+gvdGDVbSq+i2u3Ja9kjiHps0XNLpgYTZTYjKRH91uXy3clGimeGiw4umHG/tg==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/rolldown": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.3.tgz",
|
||||
"integrity": "sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@oxc-project/types": "=0.133.0",
|
||||
"@rolldown/pluginutils": "^1.0.0"
|
||||
},
|
||||
"bin": {
|
||||
"rolldown": "bin/cli.mjs"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^20.19.0 || >=22.12.0"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@rolldown/binding-android-arm64": "1.0.3",
|
||||
"@rolldown/binding-darwin-arm64": "1.0.3",
|
||||
"@rolldown/binding-darwin-x64": "1.0.3",
|
||||
"@rolldown/binding-freebsd-x64": "1.0.3",
|
||||
"@rolldown/binding-linux-arm-gnueabihf": "1.0.3",
|
||||
"@rolldown/binding-linux-arm64-gnu": "1.0.3",
|
||||
"@rolldown/binding-linux-arm64-musl": "1.0.3",
|
||||
"@rolldown/binding-linux-ppc64-gnu": "1.0.3",
|
||||
"@rolldown/binding-linux-s390x-gnu": "1.0.3",
|
||||
"@rolldown/binding-linux-x64-gnu": "1.0.3",
|
||||
"@rolldown/binding-linux-x64-musl": "1.0.3",
|
||||
"@rolldown/binding-openharmony-arm64": "1.0.3",
|
||||
"@rolldown/binding-wasm32-wasi": "1.0.3",
|
||||
"@rolldown/binding-win32-arm64-msvc": "1.0.3",
|
||||
"@rolldown/binding-win32-x64-msvc": "1.0.3"
|
||||
}
|
||||
},
|
||||
"node_modules/source-map-js": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
|
||||
"integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
|
||||
"dev": true,
|
||||
"license": "BSD-3-Clause",
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/tinyglobby": {
|
||||
"version": "0.2.17",
|
||||
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz",
|
||||
"integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"fdir": "^6.5.0",
|
||||
"picomatch": "^4.0.4"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=12.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/SuperchupuDev"
|
||||
}
|
||||
},
|
||||
"node_modules/tslib": {
|
||||
"version": "2.8.1",
|
||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
|
||||
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
|
||||
"dev": true,
|
||||
"license": "0BSD",
|
||||
"optional": true
|
||||
},
|
||||
"node_modules/vite": {
|
||||
"version": "8.0.16",
|
||||
"resolved": "https://registry.npmjs.org/vite/-/vite-8.0.16.tgz",
|
||||
"integrity": "sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"lightningcss": "^1.32.0",
|
||||
"picomatch": "^4.0.4",
|
||||
"postcss": "^8.5.15",
|
||||
"rolldown": "1.0.3",
|
||||
"tinyglobby": "^0.2.17"
|
||||
},
|
||||
"bin": {
|
||||
"vite": "bin/vite.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^20.19.0 || >=22.12.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/vitejs/vite?sponsor=1"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"fsevents": "~2.3.3"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@types/node": "^20.19.0 || >=22.12.0",
|
||||
"@vitejs/devtools": "^0.1.18",
|
||||
"esbuild": "^0.27.0 || ^0.28.0",
|
||||
"jiti": ">=1.21.0",
|
||||
"less": "^4.0.0",
|
||||
"sass": "^1.70.0",
|
||||
"sass-embedded": "^1.70.0",
|
||||
"stylus": ">=0.54.8",
|
||||
"sugarss": "^5.0.0",
|
||||
"terser": "^5.16.0",
|
||||
"tsx": "^4.8.1",
|
||||
"yaml": "^2.4.2"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@types/node": {
|
||||
"optional": true
|
||||
},
|
||||
"@vitejs/devtools": {
|
||||
"optional": true
|
||||
},
|
||||
"esbuild": {
|
||||
"optional": true
|
||||
},
|
||||
"jiti": {
|
||||
"optional": true
|
||||
},
|
||||
"less": {
|
||||
"optional": true
|
||||
},
|
||||
"sass": {
|
||||
"optional": true
|
||||
},
|
||||
"sass-embedded": {
|
||||
"optional": true
|
||||
},
|
||||
"stylus": {
|
||||
"optional": true
|
||||
},
|
||||
"sugarss": {
|
||||
"optional": true
|
||||
},
|
||||
"terser": {
|
||||
"optional": true
|
||||
},
|
||||
"tsx": {
|
||||
"optional": true
|
||||
},
|
||||
"yaml": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
17
package.json
Normal file
17
package.json
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
{
|
||||
"name": "sparklabs-6-presentation",
|
||||
"version": "0.0.0",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
"build": "vite build",
|
||||
"preview": "vite preview"
|
||||
},
|
||||
"devDependencies": {
|
||||
"vite": "^8.0.12"
|
||||
},
|
||||
"dependencies": {
|
||||
"reveal.js": "^6.0.1"
|
||||
}
|
||||
}
|
||||
1
public/favicon.svg
Normal file
1
public/favicon.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 9.3 KiB |
24
public/icons.svg
Normal file
24
public/icons.svg
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg">
|
||||
<symbol id="bluesky-icon" viewBox="0 0 16 17">
|
||||
<g clip-path="url(#bluesky-clip)"><path fill="#08060d" d="M7.75 7.735c-.693-1.348-2.58-3.86-4.334-5.097-1.68-1.187-2.32-.981-2.74-.79C.188 2.065.1 2.812.1 3.251s.241 3.602.398 4.13c.52 1.744 2.367 2.333 4.07 2.145-2.495.37-4.71 1.278-1.805 4.512 3.196 3.309 4.38-.71 4.987-2.746.608 2.036 1.307 5.91 4.93 2.746 2.72-2.746.747-4.143-1.747-4.512 1.702.189 3.55-.4 4.07-2.145.156-.528.397-3.691.397-4.13s-.088-1.186-.575-1.406c-.42-.19-1.06-.395-2.741.79-1.755 1.24-3.64 3.752-4.334 5.099"/></g>
|
||||
<defs><clipPath id="bluesky-clip"><path fill="#fff" d="M.1.85h15.3v15.3H.1z"/></clipPath></defs>
|
||||
</symbol>
|
||||
<symbol id="discord-icon" viewBox="0 0 20 19">
|
||||
<path fill="#08060d" d="M16.224 3.768a14.5 14.5 0 0 0-3.67-1.153c-.158.286-.343.67-.47.976a13.5 13.5 0 0 0-4.067 0c-.128-.306-.317-.69-.476-.976A14.4 14.4 0 0 0 3.868 3.77C1.546 7.28.916 10.703 1.231 14.077a14.7 14.7 0 0 0 4.5 2.306q.545-.748.965-1.587a9.5 9.5 0 0 1-1.518-.74q.191-.14.372-.293c2.927 1.369 6.107 1.369 8.999 0q.183.152.372.294-.723.437-1.52.74.418.838.963 1.588a14.6 14.6 0 0 0 4.504-2.308c.37-3.911-.63-7.302-2.644-10.309m-9.13 8.234c-.878 0-1.599-.82-1.599-1.82 0-.998.705-1.82 1.6-1.82.894 0 1.614.82 1.599 1.82.001 1-.705 1.82-1.6 1.82m5.91 0c-.878 0-1.599-.82-1.599-1.82 0-.998.705-1.82 1.6-1.82.893 0 1.614.82 1.599 1.82 0 1-.706 1.82-1.6 1.82"/>
|
||||
</symbol>
|
||||
<symbol id="documentation-icon" viewBox="0 0 21 20">
|
||||
<path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="m15.5 13.333 1.533 1.322c.645.555.967.833.967 1.178s-.322.623-.967 1.179L15.5 18.333m-3.333-5-1.534 1.322c-.644.555-.966.833-.966 1.178s.322.623.966 1.179l1.534 1.321"/>
|
||||
<path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M17.167 10.836v-4.32c0-1.41 0-2.117-.224-2.68-.359-.906-1.118-1.621-2.08-1.96-.599-.21-1.349-.21-2.848-.21-2.623 0-3.935 0-4.983.369-1.684.591-3.013 1.842-3.641 3.428C3 6.449 3 7.684 3 10.154v2.122c0 2.558 0 3.838.706 4.726q.306.383.713.671c.76.536 1.79.64 3.581.66"/>
|
||||
<path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M3 10a2.78 2.78 0 0 1 2.778-2.778c.555 0 1.209.097 1.748-.047.48-.129.854-.503.982-.982.145-.54.048-1.194.048-1.749a2.78 2.78 0 0 1 2.777-2.777"/>
|
||||
</symbol>
|
||||
<symbol id="github-icon" viewBox="0 0 19 19">
|
||||
<path fill="#08060d" fill-rule="evenodd" d="M9.356 1.85C5.05 1.85 1.57 5.356 1.57 9.694a7.84 7.84 0 0 0 5.324 7.44c.387.079.528-.168.528-.376 0-.182-.013-.805-.013-1.454-2.165.467-2.616-.935-2.616-.935-.349-.91-.864-1.143-.864-1.143-.71-.48.051-.48.051-.48.787.051 1.2.805 1.2.805.695 1.194 1.817.857 2.268.649.064-.507.27-.857.49-1.052-1.728-.182-3.545-.857-3.545-3.87 0-.857.31-1.558.8-2.104-.078-.195-.349-1 .077-2.078 0 0 .657-.208 2.14.805a7.5 7.5 0 0 1 1.946-.26c.657 0 1.328.092 1.946.26 1.483-1.013 2.14-.805 2.14-.805.426 1.078.155 1.883.078 2.078.502.546.799 1.247.799 2.104 0 3.013-1.818 3.675-3.558 3.87.284.247.528.714.528 1.454 0 1.052-.012 1.896-.012 2.156 0 .208.142.455.528.377a7.84 7.84 0 0 0 5.324-7.441c.013-4.338-3.48-7.844-7.773-7.844" clip-rule="evenodd"/>
|
||||
</symbol>
|
||||
<symbol id="social-icon" viewBox="0 0 20 20">
|
||||
<path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M12.5 6.667a4.167 4.167 0 1 0-8.334 0 4.167 4.167 0 0 0 8.334 0"/>
|
||||
<path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M2.5 16.667a5.833 5.833 0 0 1 8.75-5.053m3.837.474.513 1.035c.07.144.257.282.414.309l.93.155c.596.1.736.536.307.965l-.723.73a.64.64 0 0 0-.152.531l.207.903c.164.715-.213.991-.84.618l-.872-.52a.63.63 0 0 0-.577 0l-.872.52c-.624.373-1.003.094-.84-.618l.207-.903a.64.64 0 0 0-.152-.532l-.723-.729c-.426-.43-.289-.864.306-.964l.93-.156a.64.64 0 0 0 .412-.31l.513-1.034c.28-.562.735-.562 1.012 0"/>
|
||||
</symbol>
|
||||
<symbol id="x-icon" viewBox="0 0 19 19">
|
||||
<path fill="#08060d" fill-rule="evenodd" d="M1.893 1.98c.052.072 1.245 1.769 2.653 3.77l2.892 4.114c.183.261.333.48.333.486s-.068.089-.152.183l-.522.593-.765.867-3.597 4.087c-.375.426-.734.834-.798.905a1 1 0 0 0-.118.148c0 .01.236.017.664.017h.663l.729-.83c.4-.457.796-.906.879-.999a692 692 0 0 0 1.794-2.038c.034-.037.301-.34.594-.675l.551-.624.345-.392a7 7 0 0 1 .34-.374c.006 0 .93 1.306 2.052 2.903l2.084 2.965.045.063h2.275c1.87 0 2.273-.003 2.266-.021-.008-.02-1.098-1.572-3.894-5.547-2.013-2.862-2.28-3.246-2.273-3.266.008-.019.282-.332 2.085-2.38l2-2.274 1.567-1.782c.022-.028-.016-.03-.65-.03h-.674l-.3.342a871 871 0 0 1-1.782 2.025c-.067.075-.405.458-.75.852a100 100 0 0 1-.803.91c-.148.172-.299.344-.99 1.127-.304.343-.32.358-.345.327-.015-.019-.904-1.282-1.976-2.808L6.365 1.85H1.8zm1.782.91 8.078 11.294c.772 1.08 1.413 1.973 1.425 1.984.016.017.241.02 1.05.017l1.03-.004-2.694-3.766L7.796 5.75 5.722 2.852l-1.039-.004-1.039-.004z" clip-rule="evenodd"/>
|
||||
</symbol>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 4.9 KiB |
BIN
src/assets/hero.png
Normal file
BIN
src/assets/hero.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 13 KiB |
1
src/assets/javascript.svg
Normal file
1
src/assets/javascript.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" width="32" height="32" viewBox="0 0 256 256"><path fill="#F7DF1E" d="M0 0h256v256H0V0Z"/><path d="m67.312 213.932l19.59-11.856c3.78 6.701 7.218 12.371 15.465 12.371c7.905 0 12.89-3.092 12.89-15.12v-81.798h24.057v82.138c0 24.917-14.606 36.259-35.916 36.259c-19.245 0-30.416-9.967-36.087-21.996m85.07-2.576l19.588-11.341c5.157 8.421 11.859 14.607 23.715 14.607c9.969 0 16.325-4.984 16.325-11.858c0-8.248-6.53-11.17-17.528-15.98l-6.013-2.58c-17.357-7.387-28.87-16.667-28.87-36.257c0-18.044 13.747-31.792 35.228-31.792c15.294 0 26.292 5.328 34.196 19.247l-18.732 12.03c-4.125-7.389-8.591-10.31-15.465-10.31c-7.046 0-11.514 4.468-11.514 10.31c0 7.217 4.468 10.14 14.778 14.608l6.014 2.577c20.45 8.765 31.963 17.7 31.963 37.804c0 21.654-17.012 33.51-39.867 33.51c-22.339 0-36.774-10.654-43.819-24.574"/></svg>
|
||||
|
After Width: | Height: | Size: 863 B |
1
src/assets/vite.svg
Normal file
1
src/assets/vite.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 8.5 KiB |
76
src/main.js
Normal file
76
src/main.js
Normal file
|
|
@ -0,0 +1,76 @@
|
|||
import Reveal from 'reveal.js';
|
||||
import Notes from 'reveal.js/plugin/notes';
|
||||
import Markdown from 'reveal.js/plugin/markdown';
|
||||
import Highlight from 'reveal.js/plugin/highlight';
|
||||
|
||||
// Load styles in order: base, default theme, then custom theme overrides
|
||||
import 'reveal.js/reveal.css';
|
||||
import 'reveal.js/theme/black.css';
|
||||
import './style.css';
|
||||
|
||||
// Initialize Reveal.js deck
|
||||
const deck = new Reveal({
|
||||
plugins: [ Notes, Markdown, Highlight ],
|
||||
|
||||
// Slide dimensions and layout configurations
|
||||
width: 1080,
|
||||
height: 720,
|
||||
margin: 0.08,
|
||||
minScale: 0.2,
|
||||
maxScale: 2.0,
|
||||
|
||||
// Navigation & Control Settings
|
||||
controls: true,
|
||||
progress: true,
|
||||
history: true,
|
||||
center: true,
|
||||
hash: true,
|
||||
|
||||
// Transition settings (use subtle slides & fades)
|
||||
transition: 'slide', // none/fade/slide/convex/concave/zoom
|
||||
transitionSpeed: 'default', // default/fast/slow
|
||||
backgroundTransition: 'fade', // none/fade/slide/convex/concave/zoom
|
||||
|
||||
// Keyboard configurations
|
||||
keyboard: true,
|
||||
|
||||
// Help overlay key
|
||||
help: true,
|
||||
|
||||
// Show notes in presenter view (activated by pressing 'S')
|
||||
showNotes: false
|
||||
});
|
||||
|
||||
deck.initialize().then(() => {
|
||||
console.log('Reveal.js presentation initialized successfully with plugins.');
|
||||
setupChoiceCardsInteractivity();
|
||||
});
|
||||
|
||||
// Setup click interactivity for the Choice cards on Slide 8
|
||||
function setupChoiceCardsInteractivity() {
|
||||
document.addEventListener('click', (e) => {
|
||||
const adminCard = document.getElementById('choice-admin');
|
||||
const builderCard = document.getElementById('choice-builder');
|
||||
|
||||
if (adminCard && builderCard) {
|
||||
const clickedCard = e.target.closest('.choice-card');
|
||||
if (clickedCard) {
|
||||
if (clickedCard.id === 'choice-admin') {
|
||||
// Highlight Admin card, dim Builder card
|
||||
adminCard.classList.remove('locked-opacity');
|
||||
adminCard.classList.add('shadow-red', 'animate-pulse-border');
|
||||
|
||||
builderCard.classList.add('locked-opacity');
|
||||
builderCard.classList.remove('highlight-cyan-glow', 'animate-pulse-border');
|
||||
} else if (clickedCard.id === 'choice-builder') {
|
||||
// Highlight Builder card, dim Admin card
|
||||
builderCard.classList.remove('locked-opacity');
|
||||
builderCard.classList.add('highlight-cyan-glow', 'animate-pulse-border');
|
||||
|
||||
adminCard.classList.add('locked-opacity');
|
||||
adminCard.classList.remove('shadow-red', 'animate-pulse-border');
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
623
src/style.css
Normal file
623
src/style.css
Normal file
|
|
@ -0,0 +1,623 @@
|
|||
/* Custom Reveal.js Styles & Theme Overrides */
|
||||
|
||||
:root {
|
||||
/* Reveal overrides */
|
||||
--r-background-color: #05070c;
|
||||
--r-main-font: 'Outfit', sans-serif;
|
||||
--r-heading-font: 'Space Grotesk', sans-serif;
|
||||
--r-heading-color: #f3f4f6;
|
||||
--r-heading-text-transform: none;
|
||||
--r-heading-font-weight: 700;
|
||||
--r-main-font-size: 24px;
|
||||
--r-main-color: #9ca3af;
|
||||
--r-link-color: #06b6d4;
|
||||
--r-link-color-hover: #22d3ee;
|
||||
|
||||
/* Custom theme colors */
|
||||
--color-bg-dark: #05070c;
|
||||
--color-bg-card: rgba(13, 18, 30, 0.45);
|
||||
--color-border: rgba(255, 255, 255, 0.08);
|
||||
|
||||
--cyan-bright: #06b6d4;
|
||||
--cyan-glow: rgba(6, 182, 212, 0.15);
|
||||
--cyan-border: rgba(6, 182, 212, 0.4);
|
||||
|
||||
--purple-bright: #a855f7;
|
||||
--purple-glow: rgba(168, 85, 247, 0.15);
|
||||
|
||||
--red-bright: #ef4444;
|
||||
--red-glow: rgba(239, 68, 68, 0.15);
|
||||
--red-border: rgba(239, 68, 68, 0.4);
|
||||
|
||||
--text-white: #f3f4f6;
|
||||
--text-grey: #6b7280;
|
||||
}
|
||||
|
||||
/* Base slides adjustments */
|
||||
.reveal .slides {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.reveal .slides section {
|
||||
padding: 20px 40px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
/* Headers & Typography */
|
||||
.slide-header {
|
||||
font-family: var(--r-heading-font);
|
||||
font-size: 2.2em !important;
|
||||
font-weight: 700;
|
||||
margin-bottom: 5px !important;
|
||||
color: var(--text-white) !important;
|
||||
letter-spacing: -0.03em;
|
||||
}
|
||||
|
||||
.slide-subtitle {
|
||||
font-family: var(--r-heading-font);
|
||||
font-size: 1.1em;
|
||||
font-weight: 500;
|
||||
margin-top: 0;
|
||||
margin-bottom: 25px;
|
||||
}
|
||||
|
||||
.font-grotesk {
|
||||
font-family: var(--r-heading-font);
|
||||
}
|
||||
|
||||
.text-white {
|
||||
color: var(--text-white) !important;
|
||||
}
|
||||
|
||||
.text-grey {
|
||||
color: var(--text-grey) !important;
|
||||
}
|
||||
|
||||
.highlight-cyan {
|
||||
color: var(--cyan-bright) !important;
|
||||
}
|
||||
|
||||
.text-red {
|
||||
color: var(--red-bright) !important;
|
||||
}
|
||||
|
||||
.text-cyan {
|
||||
color: var(--cyan-bright) !important;
|
||||
}
|
||||
|
||||
/* Gradients */
|
||||
.text-gradient-cyan {
|
||||
background: linear-gradient(135deg, #22d3ee 0%, #06b6d4 50%, #0891b2 100%);
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
}
|
||||
|
||||
.text-gradient-purple {
|
||||
background: linear-gradient(135deg, #c084fc 0%, #a855f7 50%, #7e22ce 100%);
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
}
|
||||
|
||||
/* Glow Orbs */
|
||||
.glow-orb {
|
||||
position: absolute;
|
||||
width: 450px;
|
||||
height: 450px;
|
||||
border-radius: 50%;
|
||||
filter: blur(120px);
|
||||
z-index: -1;
|
||||
opacity: 0.25;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
#orb-1 {
|
||||
background: radial-gradient(circle, var(--cyan-bright) 0%, transparent 70%);
|
||||
top: -10%;
|
||||
left: -10%;
|
||||
animation: float-slow 15s infinite alternate;
|
||||
}
|
||||
|
||||
#orb-2 {
|
||||
background: radial-gradient(circle, var(--purple-bright) 0%, transparent 70%);
|
||||
bottom: -10%;
|
||||
right: -10%;
|
||||
animation: float-slow 12s infinite alternate-reverse;
|
||||
}
|
||||
|
||||
@keyframes float-slow {
|
||||
0% { transform: translate(0, 0) scale(1); }
|
||||
100% { transform: translate(50px, 50px) scale(1.1); }
|
||||
}
|
||||
|
||||
/* Title Slide Design */
|
||||
.title-slide {
|
||||
height: 100%;
|
||||
display: flex !important;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
text-align: center !important;
|
||||
}
|
||||
|
||||
.title-container {
|
||||
max-width: 900px;
|
||||
z-index: 10;
|
||||
}
|
||||
|
||||
.main-title {
|
||||
font-family: var(--r-heading-font);
|
||||
font-size: 3.2em !important;
|
||||
line-height: 1.05 !important;
|
||||
font-weight: 800 !important;
|
||||
letter-spacing: -0.04em !important;
|
||||
margin-bottom: 10px !important;
|
||||
color: var(--text-white);
|
||||
text-shadow: 0 0 40px rgba(255,255,255,0.05);
|
||||
}
|
||||
|
||||
.main-subtitle {
|
||||
font-size: 1.4em;
|
||||
font-weight: 600;
|
||||
margin-bottom: 25px;
|
||||
letter-spacing: -0.02em;
|
||||
}
|
||||
|
||||
.divider {
|
||||
width: 80px;
|
||||
height: 4px;
|
||||
background: linear-gradient(90deg, var(--cyan-bright), var(--purple-bright));
|
||||
margin: 20px auto;
|
||||
border-radius: 2px;
|
||||
}
|
||||
|
||||
.tagline {
|
||||
font-size: 0.9em;
|
||||
color: #9ca3af;
|
||||
margin-bottom: 35px;
|
||||
}
|
||||
|
||||
.audience-badge, .q-a-badge {
|
||||
display: inline-block;
|
||||
padding: 6px 14px;
|
||||
border-radius: 20px;
|
||||
font-size: 0.65em;
|
||||
font-weight: 600;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.05em;
|
||||
background: rgba(255,255,255,0.04);
|
||||
border: 1px solid var(--color-border);
|
||||
color: #9ca3af;
|
||||
}
|
||||
|
||||
.q-a-badge {
|
||||
background: var(--cyan-glow);
|
||||
border-color: var(--cyan-border);
|
||||
color: var(--cyan-bright);
|
||||
}
|
||||
|
||||
/* Glassmorphism Cards Layout */
|
||||
.grid-2col {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap: 30px;
|
||||
margin-top: 20px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.align-center {
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.card {
|
||||
background: var(--color-bg-card);
|
||||
border: 1px solid var(--color-border);
|
||||
border-radius: 12px;
|
||||
padding: 30px;
|
||||
box-sizing: border-box;
|
||||
backdrop-filter: blur(16px);
|
||||
-webkit-backdrop-filter: blur(16px);
|
||||
position: relative;
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
.card-badge {
|
||||
position: absolute;
|
||||
top: 15px;
|
||||
right: 15px;
|
||||
font-size: 0.55em;
|
||||
font-weight: 700;
|
||||
padding: 3px 8px;
|
||||
border-radius: 4px;
|
||||
letter-spacing: 0.05em;
|
||||
}
|
||||
|
||||
.bg-red {
|
||||
background: rgba(239, 68, 68, 0.15);
|
||||
color: var(--red-bright);
|
||||
border: 1px solid rgba(239, 68, 68, 0.3);
|
||||
}
|
||||
|
||||
.bg-cyan {
|
||||
background: var(--cyan-glow);
|
||||
color: var(--cyan-bright);
|
||||
border: 1px solid var(--cyan-border);
|
||||
}
|
||||
|
||||
.card-title {
|
||||
font-size: 1.1em !important;
|
||||
font-weight: 600;
|
||||
margin-top: 10px !important;
|
||||
margin-bottom: 12px !important;
|
||||
}
|
||||
|
||||
.card-desc {
|
||||
font-size: 0.75em;
|
||||
line-height: 1.5;
|
||||
color: #9ca3af;
|
||||
}
|
||||
|
||||
/* Glow Borders */
|
||||
.shadow-red {
|
||||
border-color: rgba(239, 68, 68, 0.2);
|
||||
box-shadow: 0 10px 30px rgba(239, 68, 68, 0.05);
|
||||
}
|
||||
|
||||
.shadow-cyan {
|
||||
border-color: rgba(6, 182, 212, 0.2);
|
||||
box-shadow: 0 10px 30px rgba(6, 182, 212, 0.05);
|
||||
}
|
||||
|
||||
.highlight-cyan-glow {
|
||||
border-color: var(--cyan-border);
|
||||
box-shadow: 0 0 25px rgba(6, 182, 212, 0.1);
|
||||
}
|
||||
|
||||
.hover-red-glow:hover {
|
||||
border-color: var(--red-border);
|
||||
box-shadow: 0 0 25px rgba(239, 68, 68, 0.1);
|
||||
}
|
||||
|
||||
.animate-pulse-border {
|
||||
animation: pulse-border 3s infinite alternate;
|
||||
}
|
||||
|
||||
@keyframes pulse-border {
|
||||
0% { border-color: rgba(255, 255, 255, 0.08); }
|
||||
100% { border-color: var(--cyan-border); }
|
||||
}
|
||||
|
||||
/* Big Metric Card */
|
||||
.big-metric {
|
||||
font-family: var(--r-heading-font);
|
||||
font-size: 3.5em;
|
||||
font-weight: 800;
|
||||
line-height: 1;
|
||||
margin-top: 20px;
|
||||
margin-bottom: 10px;
|
||||
letter-spacing: -0.04em;
|
||||
}
|
||||
|
||||
.metric-label {
|
||||
font-size: 0.75em;
|
||||
line-height: 1.5;
|
||||
color: #9ca3af;
|
||||
}
|
||||
|
||||
/* Pipeline Flowchart (Slide 3) */
|
||||
.pipeline-container {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
width: 100%;
|
||||
margin-top: 40px;
|
||||
}
|
||||
|
||||
.pipeline-step {
|
||||
flex: 1;
|
||||
background: var(--color-bg-card);
|
||||
border: 1px solid var(--color-border);
|
||||
border-radius: 8px;
|
||||
padding: 20px;
|
||||
text-align: center;
|
||||
backdrop-filter: blur(8px);
|
||||
position: relative;
|
||||
min-height: 150px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.step-num {
|
||||
font-family: var(--r-heading-font);
|
||||
font-size: 1.4em;
|
||||
font-weight: 800;
|
||||
color: #4b5563;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
.step-label {
|
||||
font-size: 0.75em;
|
||||
font-weight: 600;
|
||||
color: var(--text-white);
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
.step-duration {
|
||||
font-size: 0.55em;
|
||||
font-weight: 700;
|
||||
text-transform: uppercase;
|
||||
color: #9ca3af;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
.step-detail {
|
||||
font-size: 0.6em;
|
||||
line-height: 1.4;
|
||||
color: #6b7280;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.arrow-connector {
|
||||
font-size: 1.2em;
|
||||
color: #374151;
|
||||
margin: 0 10px;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.warning-glow {
|
||||
border-color: var(--red-border);
|
||||
box-shadow: 0 0 15px rgba(239, 68, 68, 0.08);
|
||||
}
|
||||
|
||||
/* SVG Chart adjustments */
|
||||
.chart-container {
|
||||
padding: 20px;
|
||||
border-radius: 12px;
|
||||
background: rgba(13, 18, 30, 0.6);
|
||||
}
|
||||
|
||||
.main-svg-chart {
|
||||
width: 100%;
|
||||
height: auto;
|
||||
display: block;
|
||||
}
|
||||
|
||||
#svg-cost-curve text {
|
||||
font-family: 'Space Grotesk', sans-serif;
|
||||
}
|
||||
|
||||
#svg-tax-drain text {
|
||||
font-family: 'Space Grotesk', sans-serif;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
/* Lists styling */
|
||||
.text-left {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.margin-bottom-md {
|
||||
margin-bottom: 20px !important;
|
||||
}
|
||||
|
||||
.margin-top-md {
|
||||
margin-top: 30px !important;
|
||||
}
|
||||
|
||||
.clean-list {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.clean-list li {
|
||||
font-size: 0.75em;
|
||||
margin-bottom: 12px;
|
||||
color: #9ca3af;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
/* Sovereign vs Colony Lists (Slide 5) */
|
||||
.sovereign-list {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
margin: 20px 0 0;
|
||||
}
|
||||
|
||||
.sovereign-list li {
|
||||
font-size: 0.75em;
|
||||
margin-bottom: 16px;
|
||||
padding-left: 28px;
|
||||
position: relative;
|
||||
color: var(--text-white);
|
||||
line-height: 1.4;
|
||||
}
|
||||
|
||||
.locked-item::before {
|
||||
content: '✕';
|
||||
color: var(--red-bright);
|
||||
position: absolute;
|
||||
left: 0;
|
||||
font-weight: 800;
|
||||
}
|
||||
|
||||
.free-item::before {
|
||||
content: '✓';
|
||||
color: var(--cyan-bright);
|
||||
position: absolute;
|
||||
left: 0;
|
||||
font-weight: 800;
|
||||
}
|
||||
|
||||
/* Case Study Table */
|
||||
.sovereign-table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
font-size: 0.7em;
|
||||
background: var(--color-bg-card);
|
||||
backdrop-filter: blur(12px);
|
||||
border-radius: 8px;
|
||||
overflow: hidden;
|
||||
border: 1px solid var(--color-border);
|
||||
}
|
||||
|
||||
.sovereign-table th, .sovereign-table td {
|
||||
padding: 15px 20px;
|
||||
text-align: left;
|
||||
border-bottom: 1px solid var(--color-border);
|
||||
}
|
||||
|
||||
.sovereign-table th {
|
||||
font-family: var(--r-heading-font);
|
||||
font-weight: 600;
|
||||
background: rgba(255, 255, 255, 0.02);
|
||||
color: var(--text-white);
|
||||
}
|
||||
|
||||
.sovereign-table tr:last-child td {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
.table-label {
|
||||
font-weight: 600;
|
||||
color: #cbd5e1;
|
||||
}
|
||||
|
||||
/* Flowchart components (Slide 7) */
|
||||
.flow-chart {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
margin-top: 15px;
|
||||
}
|
||||
|
||||
.flow-node {
|
||||
width: 80%;
|
||||
padding: 10px 15px;
|
||||
border-radius: 6px;
|
||||
background: rgba(255, 255, 255, 0.02);
|
||||
border: 1px solid var(--color-border);
|
||||
font-size: 0.65em;
|
||||
font-weight: 500;
|
||||
text-align: center;
|
||||
color: var(--text-white);
|
||||
}
|
||||
|
||||
.border-red {
|
||||
border-color: rgba(239, 68, 68, 0.3);
|
||||
}
|
||||
|
||||
.border-cyan {
|
||||
border-color: var(--cyan-border);
|
||||
}
|
||||
|
||||
.flow-arrow {
|
||||
font-size: 0.7em;
|
||||
color: #4b5563;
|
||||
}
|
||||
|
||||
/* Choice Cards (Slide 8) */
|
||||
.choice-card {
|
||||
padding: 40px 30px;
|
||||
text-align: center;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.choice-card .card-icon {
|
||||
font-size: 2em;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
.choice-text {
|
||||
font-size: 0.7em;
|
||||
line-height: 1.5;
|
||||
color: #9ca3af;
|
||||
margin-bottom: 25px;
|
||||
min-height: 70px;
|
||||
}
|
||||
|
||||
.choice-footer {
|
||||
font-family: var(--r-heading-font);
|
||||
font-size: 0.75em;
|
||||
font-weight: 700;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.05em;
|
||||
}
|
||||
|
||||
.locked-opacity {
|
||||
opacity: 0.45;
|
||||
border-color: #2a2a2a;
|
||||
}
|
||||
|
||||
.locked-opacity:hover {
|
||||
opacity: 0.6;
|
||||
}
|
||||
|
||||
/* Playbook Cards (Slide 9) */
|
||||
.playbook-steps {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap: 20px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.playbook-card {
|
||||
padding: 20px 25px;
|
||||
display: flex;
|
||||
gap: 15px;
|
||||
align-items: flex-start;
|
||||
min-height: 120px;
|
||||
}
|
||||
|
||||
.playbook-num {
|
||||
font-family: var(--r-heading-font);
|
||||
font-size: 1.4em;
|
||||
font-weight: 800;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.playbook-title {
|
||||
font-size: 0.85em !important;
|
||||
font-weight: 600;
|
||||
margin-top: 0 !important;
|
||||
margin-bottom: 5px !important;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.02em;
|
||||
}
|
||||
|
||||
.playbook-body {
|
||||
font-size: 0.65em;
|
||||
line-height: 1.4;
|
||||
color: #9ca3af;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
/* Conclusion slide adjustments */
|
||||
.big-bold {
|
||||
font-size: 4em !important;
|
||||
font-weight: 800 !important;
|
||||
letter-spacing: -0.05em !important;
|
||||
margin: 0 !important;
|
||||
line-height: 0.95 !important;
|
||||
}
|
||||
|
||||
/* Mobile responsive fixes */
|
||||
@media (max-width: 768px) {
|
||||
.grid-2col {
|
||||
grid-template-columns: 1fr;
|
||||
gap: 15px;
|
||||
}
|
||||
.pipeline-container {
|
||||
flex-direction: column;
|
||||
gap: 10px;
|
||||
}
|
||||
.arrow-connector {
|
||||
transform: rotate(90deg);
|
||||
}
|
||||
.playbook-steps {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
}
|
||||
Loading…
Reference in a new issue