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 @@
+
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, ..
-
+
{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_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"]}
+ },
+ ]
}
]