diff --git a/public/img/demos/Southwest Airlines_Logo_0.svg b/public/img/demos/Southwest Airlines_Logo_0.svg new file mode 100644 index 00000000..908fd814 --- /dev/null +++ b/public/img/demos/Southwest Airlines_Logo_0.svg @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/img/demos/Southwest Airlines_Symbol_0.svg b/public/img/demos/Southwest Airlines_Symbol_0.svg new file mode 100644 index 00000000..4f8051dd --- /dev/null +++ b/public/img/demos/Southwest Airlines_Symbol_0.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/img/themes/southwest/southwest_logo.svg b/public/img/themes/southwest/southwest_logo.svg new file mode 100644 index 00000000..9a660b6b --- /dev/null +++ b/public/img/themes/southwest/southwest_logo.svg @@ -0,0 +1,14 @@ + + + + + + SOUTHWEST + + + AIRLINES + + + + + diff --git a/src/app/demo/southwest/Home.jsx b/src/app/demo/southwest/Home.jsx new file mode 100644 index 00000000..214d429e --- /dev/null +++ b/src/app/demo/southwest/Home.jsx @@ -0,0 +1,61 @@ +import { + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from "@/components/ui"; + +import { Metrics, TableauEmbed, Transactions, RecentSales } from '@/components'; + +export const description = "Southwest Airlines flight analytics dashboard with real-time flight data, passenger insights, and operational metrics. Features include flight performance tracking, booking trends, customer satisfaction analytics, and AI-powered insights for optimizing airline operations."; + +export const Home = () => { + + return ( +
+
+ +
+
+ + + Flight Operations Dashboard + Real-time flight analytics and operational insights for Southwest Airlines + + + + + +
+
+ + +
+
+
+
+ ) +} diff --git a/src/app/demo/southwest/agent/page.jsx b/src/app/demo/southwest/agent/page.jsx new file mode 100644 index 00000000..123dc1e6 --- /dev/null +++ b/src/app/demo/southwest/agent/page.jsx @@ -0,0 +1,22 @@ +import { Demo, Agent } from '@/components'; + +import { settings } from '../config'; + +const Page = () => { + + // for the most part, only the pageName and child components for should be modified to make new pages + const pageName = 'Agent'; + + return ( + + + + ) +} + +export default Page; diff --git a/src/app/demo/southwest/auth/page.jsx b/src/app/demo/southwest/auth/page.jsx new file mode 100644 index 00000000..387f6d60 --- /dev/null +++ b/src/app/demo/southwest/auth/page.jsx @@ -0,0 +1,15 @@ +import { Auth } from '@/components'; + +import { settings } from '../config'; + + +const AuthPage = () => { + + return ( + + ) +} + +export default AuthPage; diff --git a/src/app/demo/southwest/config.js b/src/app/demo/southwest/config.js new file mode 100644 index 00000000..752ec7ea --- /dev/null +++ b/src/app/demo/southwest/config.js @@ -0,0 +1,56 @@ +import { + Home, + Plane, + Users2, + BarChart3, + BrainCircuit, + Settings +} from "lucide-react"; + +export const settings = { + app_id: 'southwest', + app_name: 'Southwest Airlines Analytics', + app_logo: '/img/demos/Southwest Airlines_Logo_0.svg', + auth_logo: '/img/demos/Southwest Airlines_Symbol_0.svg', + base_path: '/demo/southwest', + auth_hero: 'https://images.unsplash.com/photo-1436491865332-7a61a109cc05?q=80&w=2948&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D', + ai_chat: true, + ai_avatar: '/img/demos/Southwest Airlines_Symbol_0.svg', + sections: [ + { + name: 'Home', + icon: , + path: '', + min_role: 0, + description: 'your southwest airlines dashboard' + }, + { + name: 'Agent', + icon: , + path: '/agent', + min_role: 0, + description: 'AI assistant for flight operations and analytics' + }, + { + name: 'Flights', + icon: , + path: '/flights', + min_role: 0, + description: 'real-time flight tracking and performance analytics' + }, + { + name: 'Passengers', + icon: , + path: '/passengers', + min_role: 1, + description: 'passenger analytics and customer satisfaction insights' + }, + { + name: 'Operations', + icon: , + path: '/operations', + min_role: 2, + description: 'comprehensive operational metrics and strategic insights' + }, + ], +} diff --git a/src/app/demo/southwest/flights/Flights.jsx b/src/app/demo/southwest/flights/Flights.jsx new file mode 100644 index 00000000..41f14ded --- /dev/null +++ b/src/app/demo/southwest/flights/Flights.jsx @@ -0,0 +1,139 @@ +"use client"; + +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "components/ui"; + +import { useMetrics } from 'hooks'; +import { ActionCard, Metric, extractMetrics, TableauEmbed } from 'components'; + +export const description = "A flights dashboard with real-time flight tracking and performance analytics. Features include flight status monitoring, on-time performance metrics, route analysis, and operational insights for Southwest Airlines flight operations." + +export const Flights = (props) => { + const { status, data, error, isError, isSuccess } = useMetrics(); + // define which metrics to store on this page + const metricIds = ["da6f99eb-8cda-418f-8d9a-564a0c35bd1f", "54f85f6b-9c68-4e2c-98b7-b2ee8d2e07a9"]; + let metrics; + + if (isSuccess && data) { + // extract metrics if data is available + metrics = extractMetrics(data, metricIds); + } + + + return ( +
+
+
+ +
+ {isSuccess ? ( + <> + + + + ) : null} +
+
+ + + Flight Performance Dashboard + + Real-time flight tracking and on-time performance analytics + + + + + + +
+
+ + + On-Time Performance + + Track flight punctuality and identify performance trends + + + + + + + + + Route Analysis + + Analyze flight routes and identify optimization opportunities + + + + + + +
+
+ ) +} diff --git a/src/app/demo/southwest/flights/page.jsx b/src/app/demo/southwest/flights/page.jsx new file mode 100644 index 00000000..a8828a25 --- /dev/null +++ b/src/app/demo/southwest/flights/page.jsx @@ -0,0 +1,23 @@ +import { Demo, FloatingAssistant } from '@/components'; + +import { Flights } from './Flights'; +import { settings } from '../config'; + +const Page = () => { + // for the most part, only the pageName and child components for should be modified to make new pages + const pageName = 'Flights'; + + return ( + + + + + ) +} + +export default Page; diff --git a/src/app/demo/southwest/layout.jsx b/src/app/demo/southwest/layout.jsx new file mode 100644 index 00000000..568b8598 --- /dev/null +++ b/src/app/demo/southwest/layout.jsx @@ -0,0 +1,22 @@ +import { ThemeProvider } from 'next-themes'; + +import { AuthGuard, LanggraphAgentRuntimeProvider } from '@/components'; +import { settings } from './config'; + +export default function Layout({ children }) { + return ( + + + + {children} + + + ); +} diff --git a/src/app/demo/southwest/operations/Operations.jsx b/src/app/demo/southwest/operations/Operations.jsx new file mode 100644 index 00000000..cb627081 --- /dev/null +++ b/src/app/demo/southwest/operations/Operations.jsx @@ -0,0 +1,139 @@ +"use client"; + +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "components/ui"; + +import { useMetrics } from 'hooks'; +import { ActionCard, Metric, extractMetrics, TableauEmbed } from 'components'; + +export const description = "A comprehensive operations dashboard with strategic insights and operational metrics. Features include fleet utilization, cost analysis, revenue optimization, maintenance scheduling, and executive-level reporting for Southwest Airlines operations management." + +export const Operations = (props) => { + const { status, data, error, isError, isSuccess } = useMetrics(); + // define which metrics to store on this page + const metricIds = ["da6f99eb-8cda-418f-8d9a-564a0c35bd1f", "54f85f6b-9c68-4e2c-98b7-b2ee8d2e07a9"]; + let metrics; + + if (isSuccess && data) { + // extract metrics if data is available + metrics = extractMetrics(data, metricIds); + } + + + return ( +
+
+
+ +
+ {isSuccess ? ( + <> + + + + ) : null} +
+
+ + + Executive Dashboard + + High-level operational metrics and strategic KPIs + + + + + + +
+
+ + + Fleet Utilization + + Monitor aircraft utilization and efficiency metrics + + + + + + + + + Revenue Analysis + + Track revenue performance and identify growth opportunities + + + + + + +
+
+ ) +} diff --git a/src/app/demo/southwest/operations/page.jsx b/src/app/demo/southwest/operations/page.jsx new file mode 100644 index 00000000..d566a8ed --- /dev/null +++ b/src/app/demo/southwest/operations/page.jsx @@ -0,0 +1,23 @@ +import { Demo, FloatingAssistant } from '@/components'; + +import { Operations } from './Operations'; +import { settings } from '../config'; + +const Page = () => { + // for the most part, only the pageName and child components for should be modified to make new pages + const pageName = 'Operations'; + + return ( + + + + + ) +} + +export default Page; diff --git a/src/app/demo/southwest/page.jsx b/src/app/demo/southwest/page.jsx new file mode 100644 index 00000000..7b11dcb9 --- /dev/null +++ b/src/app/demo/southwest/page.jsx @@ -0,0 +1,23 @@ +import { Demo, FloatingAssistant } from '@/components'; + +import { Home } from './Home'; +import { settings } from './config'; + +const Page = () => { + // for the most part, only the pageName and child components for should be modified to make new pages + const pageName = ''; + + return ( + + + + + ) +} + +export default Page; diff --git a/src/app/demo/southwest/passengers/Passengers.jsx b/src/app/demo/southwest/passengers/Passengers.jsx new file mode 100644 index 00000000..fc857e28 --- /dev/null +++ b/src/app/demo/southwest/passengers/Passengers.jsx @@ -0,0 +1,139 @@ +"use client"; + +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "components/ui"; + +import { useMetrics } from 'hooks'; +import { ActionCard, Metric, extractMetrics, TableauEmbed } from 'components'; + +export const description = "A passenger analytics dashboard with customer satisfaction insights, booking trends, and passenger behavior analysis. Features include customer segmentation, satisfaction scores, loyalty program analytics, and booking pattern analysis for Southwest Airlines." + +export const Passengers = (props) => { + const { status, data, error, isError, isSuccess } = useMetrics(); + // define which metrics to store on this page + const metricIds = ["da6f99eb-8cda-418f-8d9a-564a0c35bd1f", "54f85f6b-9c68-4e2c-98b7-b2ee8d2e07a9"]; + let metrics; + + if (isSuccess && data) { + // extract metrics if data is available + metrics = extractMetrics(data, metricIds); + } + + + return ( +
+
+
+ +
+ {isSuccess ? ( + <> + + + + ) : null} +
+
+ + + Customer Satisfaction Dashboard + + Track passenger satisfaction scores and identify improvement areas + + + + + + +
+
+ + + Booking Trends + + Analyze booking patterns and seasonal trends + + + + + + + + + Loyalty Program + + Track Rapid Rewards member engagement and benefits + + + + + + +
+
+ ) +} diff --git a/src/app/demo/southwest/passengers/page.jsx b/src/app/demo/southwest/passengers/page.jsx new file mode 100644 index 00000000..6512f875 --- /dev/null +++ b/src/app/demo/southwest/passengers/page.jsx @@ -0,0 +1,23 @@ +import { Demo, FloatingAssistant } from '@/components'; + +import { Passengers } from './Passengers'; +import { settings } from '../config'; + +const Page = () => { + // for the most part, only the pageName and child components for should be modified to make new pages + const pageName = 'Passengers'; + + return ( + + + + + ) +} + +export default Page; diff --git a/src/components/Agent/FloatingAssistant.jsx b/src/components/Agent/FloatingAssistant.jsx index 55c51ecd..e1d293c9 100644 --- a/src/components/Agent/FloatingAssistant.jsx +++ b/src/components/Agent/FloatingAssistant.jsx @@ -23,7 +23,7 @@ export const FloatingAssistant = (props) => { return ( ( - + @@ -60,15 +60,15 @@ const FloatingAssistantButton = forwardRef(({ ai_avatar, "data-state": state, .. Assistant -
+
{tooltip} diff --git a/src/components/Agent/Thread.jsx b/src/components/Agent/Thread.jsx index f264825c..d2a48a68 100644 --- a/src/components/Agent/Thread.jsx +++ b/src/components/Agent/Thread.jsx @@ -127,7 +127,7 @@ const MessageAvatar = (props) => { const { src, alt, fallback } = props; return ( - + {fallback} diff --git a/src/components/Agent/ui/MiniThread.jsx b/src/components/Agent/ui/MiniThread.jsx index 33aa527c..c59c1dff 100644 --- a/src/components/Agent/ui/MiniThread.jsx +++ b/src/components/Agent/ui/MiniThread.jsx @@ -176,7 +176,7 @@ const MessageAvatar = (props) => { const { src, alt, fallback } = props; return ( - + {fallback} diff --git a/src/components/Demo/components/Auth/Auth.jsx b/src/components/Demo/components/Auth/Auth.jsx index d35ba262..da8d33f4 100644 --- a/src/components/Demo/components/Auth/Auth.jsx +++ b/src/components/Demo/components/Auth/Auth.jsx @@ -14,7 +14,7 @@ export const description = "A login page with a full-screen background image and export const Auth = (props) => { const { settings } = props; - const { app_id, base_path, app_name, app_logo, auth_hero } = settings; + const { app_id, base_path, app_name, app_logo, auth_logo, auth_hero } = settings; const demoManager = new UserModel(); const users = demoManager.getUsersForDemo(app_id); @@ -39,10 +39,15 @@ export const Auth = (props) => {
- - - APP - +
+ Southwest Airlines +
{app_name} Select a user to login diff --git a/src/components/Demo/components/Navigation/Breadcrumbs.jsx b/src/components/Demo/components/Navigation/Breadcrumbs.jsx index a2519aea..6f5a8256 100644 --- a/src/components/Demo/components/Navigation/Breadcrumbs.jsx +++ b/src/components/Demo/components/Navigation/Breadcrumbs.jsx @@ -6,6 +6,11 @@ import { BreadcrumbLink, BreadcrumbSeparator } from 'components/ui'; +import { + Avatar, + AvatarFallback, + AvatarImage, +} from "components/ui"; import Link from 'next/link'; import { generateBreadcrumbs } from '../../utils'; @@ -13,7 +18,8 @@ import { generateBreadcrumbs } from '../../utils'; export const Breadcrumbs = (props) => { const { base_path, - crumbs + crumbs, + app_logo } = props; const breadcrumbItems = generateBreadcrumbs(base_path, crumbs); @@ -25,8 +31,15 @@ export const Breadcrumbs = (props) => { - - {item.title} + + {index === 0 && app_logo ? ( + + + {item.title.charAt(0)} + + ) : ( + {item.title} + )} diff --git a/src/components/Demo/components/Navigation/Navigation.jsx b/src/components/Demo/components/Navigation/Navigation.jsx index 60c2f99e..5042de31 100644 --- a/src/components/Demo/components/Navigation/Navigation.jsx +++ b/src/components/Demo/components/Navigation/Navigation.jsx @@ -25,6 +25,7 @@ export const Navigation = (props) => {
{ src={item.src} alt={item.alt} fill - className="w-full object-cover" + className={`w-full ${item.id === 'southwest' ? 'object-contain p-4' : 'object-cover'}`} /> diff --git a/src/components/Gallery/galleryItems.js b/src/components/Gallery/galleryItems.js index 637067ad..2095ac6e 100644 --- a/src/components/Gallery/galleryItems.js +++ b/src/components/Gallery/galleryItems.js @@ -2,7 +2,8 @@ import { BriefcaseBusiness, ShoppingCart, HandCoins, - HeartPulse + HeartPulse, + Plane } from 'lucide-react'; // NOTE: the 'id' key is used to map to 'app_id' in each demo config.js file @@ -42,5 +43,14 @@ export const galleryItems = [ vertical: "Financial Services", description: "A wealth management app that empowers users to make informed financial decisions, allowing them to track net worth and analyze portfolio performance", icon: + }, + { + id: 'southwest', + link: "/demo/southwest", + src: "/img/demos/Southwest Airlines_Logo_0.svg", + alt: "Southwest Airlines | Flight Analytics", + vertical: "Airlines & Transportation", + description: "A comprehensive flight analytics platform that provides real-time insights into flight operations, passenger data, and operational performance to optimize airline efficiency", + icon: } ] diff --git a/src/components/Hero/Themes/Southwest/Flights.jsx b/src/components/Hero/Themes/Southwest/Flights.jsx new file mode 100644 index 00000000..9d4cca76 --- /dev/null +++ b/src/components/Hero/Themes/Southwest/Flights.jsx @@ -0,0 +1,39 @@ +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "components/ui"; +import { TabsContent } from "components/ui"; + +import { TableauEmbed } from 'components'; + +export const Flights = () => { + return ( +
+ + + + Flight Performance + + Real-time flight tracking and on-time performance analytics + + + + + + + +
+ ) +} diff --git a/src/components/Hero/Themes/Southwest/Operations.jsx b/src/components/Hero/Themes/Southwest/Operations.jsx new file mode 100644 index 00000000..c3d5588e --- /dev/null +++ b/src/components/Hero/Themes/Southwest/Operations.jsx @@ -0,0 +1,39 @@ +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "components/ui"; +import { TabsContent } from "components/ui"; + +import { TableauEmbed } from 'components'; + +export const Operations = () => { + return ( +
+ + + + Operations Center + + Strategic insights and comprehensive operational metrics + + + + + + + +
+ ) +} diff --git a/src/components/Hero/Themes/Southwest/Overview.jsx b/src/components/Hero/Themes/Southwest/Overview.jsx new file mode 100644 index 00000000..e9ccb78a --- /dev/null +++ b/src/components/Hero/Themes/Southwest/Overview.jsx @@ -0,0 +1,39 @@ +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "components/ui"; +import { TabsContent } from "components/ui"; + +import { TableauEmbed } from 'components'; + +export const Overview = () => { + return ( +
+ + + + Flight Operations Overview + + Real-time flight analytics and operational insights for Southwest Airlines + + + + + + + +
+ ) +} diff --git a/src/components/Hero/Themes/Southwest/Passengers.jsx b/src/components/Hero/Themes/Southwest/Passengers.jsx new file mode 100644 index 00000000..40941569 --- /dev/null +++ b/src/components/Hero/Themes/Southwest/Passengers.jsx @@ -0,0 +1,39 @@ +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "components/ui"; +import { TabsContent } from "components/ui"; + +import { TableauEmbed } from 'components'; + +export const Passengers = () => { + return ( +
+ + + + Passenger Analytics + + Customer satisfaction insights and booking trend analysis + + + + + + + +
+ ) +} diff --git a/src/components/Hero/Themes/Southwest/index.js b/src/components/Hero/Themes/Southwest/index.js new file mode 100644 index 00000000..1b1ba474 --- /dev/null +++ b/src/components/Hero/Themes/Southwest/index.js @@ -0,0 +1,33 @@ +import { Tabs, TabsContent, TabsList, TabsTrigger } from "components/ui"; + +import { Flights } from './Flights'; +import { Overview } from './Overview'; +import { Passengers } from './Passengers'; +import { Operations } from './Operations'; + +export const Southwest = () => { + return ( + + + + Overview + + + Flights + + + Passengers + + + Operations + + +
+ + + + +
+
+ ) +} diff --git a/src/components/Hero/Themes/config.js b/src/components/Hero/Themes/config.js index e8d85fa7..ccddcabf 100644 --- a/src/components/Hero/Themes/config.js +++ b/src/components/Hero/Themes/config.js @@ -2,6 +2,7 @@ import { Superstore } from "components/Hero/Themes/Superstore"; import { Ebikes } from "components/Hero/Themes/Ebikes"; import { NTO } from "components/Hero/Themes/NTO"; import { Pacifica } from "components/Hero/Themes/Pacifica"; +import { Southwest } from "components/Hero/Themes/Southwest"; export const settings = { @@ -21,5 +22,18 @@ export const settings = { data_sources: [] } }, + { + label: "Southwest Airlines Analytics", + name: "southwest", + component: Southwest, + type: "airline", + logo: "/img/themes/southwest/southwest_logo.svg", + styles: "", + project: { + name: "southwest", + workbooks: [], + data_sources: [] + } + }, ] } diff --git a/src/components/TableauEmbed/TableauEmbed.jsx b/src/components/TableauEmbed/TableauEmbed.jsx index 0f2ec2f7..dc979869 100644 --- a/src/components/TableauEmbed/TableauEmbed.jsx +++ b/src/components/TableauEmbed/TableauEmbed.jsx @@ -1,5 +1,5 @@ "use client"; -import { forwardRef, useRef } from 'react'; +import { forwardRef, useRef, useEffect, useId } from 'react'; import { TableauAuth } from 'components'; @@ -23,21 +23,79 @@ export const TableauEmbed = forwardRef(function TableauEmbed(props, ref) { // Use the forwarded ref if provided, otherwise use the local ref const innerRef = ref || localRef; + // Check if this is a Tableau Public URL + const isTableauPublic = src && src.includes('public.tableau.com'); + + // Tableau Public component logic - uses Embedding API v3 with web component + const TableauPublicEmbed = forwardRef(function TableauPublicEmbed(props, ref) { + const { src, className, height = '600px', width = '100%' } = props; + const id = `viz-${useId().replace(/:/g, '')}`; + + useEffect(() => { + // Load Tableau Embedding API v3 for Public + const loadTableauAPI = () => { + return new Promise((resolve, reject) => { + // Check if already loaded + if (document.querySelector('script[src*="tableau.embedding.3.latest.min.js"]')) { + resolve(); + return; + } + + const script = document.createElement('script'); + script.type = 'module'; + script.src = 'https://public.tableau.com/javascripts/api/tableau.embedding.3.latest.min.js'; + script.onload = () => resolve(); + script.onerror = () => reject(new Error('Failed to load Tableau Embedding API')); + document.head.appendChild(script); + }); + }; + + loadTableauAPI().catch(error => { + console.error('Error loading Tableau Embedding API:', error); + }); + }, []); + + return ( +
+ +
+ ); + }); + return (
- + {isTableauPublic ? ( + + ) : ( + + )}
) }); diff --git a/src/components/TableauEmbed/TableauViz.jsx b/src/components/TableauEmbed/TableauViz.jsx index df32b419..058fcf90 100644 --- a/src/components/TableauEmbed/TableauViz.jsx +++ b/src/components/TableauEmbed/TableauViz.jsx @@ -63,7 +63,7 @@ export const TableauViz = forwardRef(function Viz(props, ref) { ref={innerRef} id="tableauViz" src={src} - token={!isPublic ? jwt : null} + token={jwt} height={`${getLayoutProps(layoutSpec, 'xs').height}px`} width={`${getLayoutProps(layoutSpec, 'xs').width}px`} device={getLayoutProps(layoutSpec, 'xs').device} diff --git a/src/global.css b/src/global.css index 4825f36b..b0ac4416 100644 --- a/src/global.css +++ b/src/global.css @@ -193,6 +193,41 @@ --metrics-neutral: 280 70% 75%; --metrics-negative: 280 60% 33% ; } + + /* Define variables for the 'southwest' theme (Southwest Airlines Blue & Yellow) */ + [data-theme="southwest"] { + --background: 0 0% 100%; /* White */ + --foreground: 227 58% 44%; /* Southwest Blue (#304CB2) */ + --demo-background: 0 0% 100%; /* White background for demos */ + --nav-background: 227 58% 44%; /* Southwest Blue for nav */ + --logo-background: 0 0% 100%; /* White for logo background */ + --icon-background: 42 100% 65%; /* Southwest Yellow (#FFCA4F) */ + --login-card-background: 0 0% 100%; /* White for login cards */ + --nav-icons: 0 0% 100%; /* White icons on blue nav */ + --ai-icons: 42 100% 65%; /* Yellow for AI icons */ + --breadcrumbs: 42 100% 65%; /* Yellow for breadcrumbs */ + --card: 0 0% 100%; /* White cards */ + --card-foreground: 227 58% 44%; /* Southwest Blue text */ + --popover: 0 0% 100%; /* White popovers */ + --popover-foreground: 227 58% 44%; /* Southwest Blue text */ + --primary: 227 58% 44%; /* Southwest Blue primary */ + --primary-foreground: 0 0% 100%; /* White text on primary */ + --secondary: 42 100% 95%; /* Very Light Yellow */ + --secondary-foreground: 227 58% 44%; /* Southwest Blue text */ + --muted: 42 100% 98%; /* Almost White Yellow */ + --muted-foreground: 227 30% 60%; /* Muted Southwest Blue */ + --accent: 42 100% 85%; /* Light Yellow accent */ + --accent-foreground: 227 58% 44%; /* Southwest Blue text */ + --destructive: 0 70% 60%; /* Red for destructive actions */ + --destructive-foreground: 0 0% 100%; /* White text */ + --border: 42 100% 90%; /* Light Yellow border */ + --input: 42 100% 95%; /* Very Light Yellow input */ + --ring: 227 58% 44%; /* Southwest Blue ring */ + + --metrics-positive: 42 100% 65%; /* Southwest Yellow for positive metrics */ + --metrics-neutral: 227 30% 60%; /* Muted Southwest Blue for neutral */ + --metrics-negative: 0 70% 60%; /* Red for negative metrics */ + } } /* End of @layer base containing themes */ @layer base { diff --git a/src/models/Users/userStore.ts b/src/models/Users/userStore.ts index bcdde80f..bb304dd9 100644 --- a/src/models/Users/userStore.ts +++ b/src/models/Users/userStore.ts @@ -148,5 +148,42 @@ export const Users = [ uaf: {} }, ] + }, + { + demo: 'southwest', + roles: { + 0: { title: 'Flight Operations', description: 'Basic flight data & analytics'}, + 1: { title: 'Operations Manager', description: 'Advanced analytics & reporting'}, + 2: { title: 'Senior Leadership', description: 'Full strategic analytics & insights'}, + }, + users: [ + { + id: 'a', + name: "Sarah Johnson", + email: "sjohnson@southwest.com", + picture: "/img/users/kim_johnson.png", + role: 0, + vector_store: 'southwest_sjohnson', + uaf: {"Region": ["West", "Central"]} + }, + { + id: 'b', + name: "Michael Rodriguez", + email: "mrodriguez@southwest.com", + picture: "/img/users/richard_bennet.png", + role: 1, + vector_store: 'southwest_mrodriguez', + uaf: {"Region": ["East", "South"]} + }, + { + id: 'c', + name: "Jennifer Martinez", + email: "jmartinez@southwest.com", + picture: "/img/users/rachel_morris.png", + role: 2, + vector_store: 'southwest_jmartinez', + uaf: {"Region": ["West", "East", "Central", "South"]} + }, + ] } ]