ui styling
This commit is contained in:
parent
f29658fee8
commit
af16879dd6
|
|
@ -2,6 +2,7 @@ export * from './button';
|
||||||
export * from './card';
|
export * from './card';
|
||||||
export * from './collapsible';
|
export * from './collapsible';
|
||||||
export * from './input';
|
export * from './input';
|
||||||
|
export * from './layout';
|
||||||
export * from './sheet';
|
export * from './sheet';
|
||||||
export * from './switch';
|
export * from './switch';
|
||||||
export * from './scroll-area';
|
export * from './scroll-area';
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ export * from './button';
|
||||||
export * from './card';
|
export * from './card';
|
||||||
export * from './collapsible';
|
export * from './collapsible';
|
||||||
export * from './input';
|
export * from './input';
|
||||||
|
export * from './layout';
|
||||||
export * from './sheet';
|
export * from './sheet';
|
||||||
export * from './switch';
|
export * from './switch';
|
||||||
export * from './scroll-area';
|
export * from './scroll-area';
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
import './styles/global.css';
|
import './styles/global.css';
|
||||||
|
export * from './utils/types';
|
||||||
export * from './utils';
|
export * from './utils';
|
||||||
export * from './components/ui';
|
export * from './components/ui';
|
||||||
export * from './components/TimelineStep';
|
export * from './components/TimelineStep';
|
||||||
|
|
@ -6,4 +7,4 @@ export * from './components/TimelineFeed';
|
||||||
export * from './components/SessionDrawer';
|
export * from './components/SessionDrawer';
|
||||||
export * from './components/SessionSidebar';
|
export * from './components/SessionSidebar';
|
||||||
export declare const hello: () => void;
|
export declare const hello: () => void;
|
||||||
export { getSampleAgentSteps, getSampleAgentSessions, type AgentStep, type AgentSession } from './utils/sample-data';
|
export { getSampleAgentSteps, getSampleAgentSessions } from './utils/sample-data';
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,8 @@
|
||||||
// Entry point for @ra-aid/common package
|
// Entry point for @ra-aid/common package
|
||||||
import './styles/global.css';
|
import './styles/global.css';
|
||||||
// Export utility functions (excluding sample data to avoid circular references)
|
// Export types first to avoid circular references
|
||||||
|
export * from './utils/types';
|
||||||
|
// Export utility functions
|
||||||
export * from './utils';
|
export * from './utils';
|
||||||
// Export all UI components
|
// Export all UI components
|
||||||
export * from './components/ui';
|
export * from './components/ui';
|
||||||
|
|
@ -14,5 +16,5 @@ export * from './components/SessionSidebar';
|
||||||
export const hello = () => {
|
export const hello = () => {
|
||||||
console.log("Hello from @ra-aid/common");
|
console.log("Hello from @ra-aid/common");
|
||||||
};
|
};
|
||||||
// Directly export sample data functions and types to avoid circular references
|
// Directly export sample data functions
|
||||||
export { getSampleAgentSteps, getSampleAgentSessions } from './utils/sample-data';
|
export { getSampleAgentSteps, getSampleAgentSessions } from './utils/sample-data';
|
||||||
|
|
|
||||||
|
|
@ -585,6 +585,9 @@ video {
|
||||||
.pointer-events-none {
|
.pointer-events-none {
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
}
|
}
|
||||||
|
.visible {
|
||||||
|
visibility: visible;
|
||||||
|
}
|
||||||
.fixed {
|
.fixed {
|
||||||
position: fixed;
|
position: fixed;
|
||||||
}
|
}
|
||||||
|
|
@ -594,6 +597,9 @@ video {
|
||||||
.relative {
|
.relative {
|
||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
|
.sticky {
|
||||||
|
position: sticky;
|
||||||
|
}
|
||||||
.inset-0 {
|
.inset-0 {
|
||||||
inset: 0px;
|
inset: 0px;
|
||||||
}
|
}
|
||||||
|
|
@ -620,14 +626,26 @@ video {
|
||||||
.top-0 {
|
.top-0 {
|
||||||
top: 0px;
|
top: 0px;
|
||||||
}
|
}
|
||||||
|
.top-16 {
|
||||||
|
top: 4rem;
|
||||||
|
}
|
||||||
.top-4 {
|
.top-4 {
|
||||||
top: 1rem;
|
top: 1rem;
|
||||||
}
|
}
|
||||||
.z-40 {
|
.z-20 {
|
||||||
z-index: 40;
|
z-index: 20;
|
||||||
}
|
}
|
||||||
.z-50 {
|
.z-30 {
|
||||||
z-index: 50;
|
z-index: 30;
|
||||||
|
}
|
||||||
|
.col-span-full {
|
||||||
|
grid-column: 1 / -1;
|
||||||
|
}
|
||||||
|
.col-start-1 {
|
||||||
|
grid-column-start: 1;
|
||||||
|
}
|
||||||
|
.row-start-2 {
|
||||||
|
grid-row-start: 2;
|
||||||
}
|
}
|
||||||
.mx-auto {
|
.mx-auto {
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
|
|
@ -666,9 +684,18 @@ video {
|
||||||
.inline-flex {
|
.inline-flex {
|
||||||
display: inline-flex;
|
display: inline-flex;
|
||||||
}
|
}
|
||||||
|
.grid {
|
||||||
|
display: grid;
|
||||||
|
}
|
||||||
|
.hidden {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
.h-10 {
|
.h-10 {
|
||||||
height: 2.5rem;
|
height: 2.5rem;
|
||||||
}
|
}
|
||||||
|
.h-16 {
|
||||||
|
height: 4rem;
|
||||||
|
}
|
||||||
.h-2\.5 {
|
.h-2\.5 {
|
||||||
height: 0.625rem;
|
height: 0.625rem;
|
||||||
}
|
}
|
||||||
|
|
@ -690,12 +717,18 @@ video {
|
||||||
.h-9 {
|
.h-9 {
|
||||||
height: 2.25rem;
|
height: 2.25rem;
|
||||||
}
|
}
|
||||||
.h-\[calc\(100vh-5rem\)\] {
|
.h-\[calc\(100vh-64px\)\] {
|
||||||
height: calc(100vh - 5rem);
|
height: calc(100vh - 64px);
|
||||||
|
}
|
||||||
|
.h-\[calc\(100vh-9rem\)\] {
|
||||||
|
height: calc(100vh - 9rem);
|
||||||
}
|
}
|
||||||
.h-full {
|
.h-full {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
}
|
}
|
||||||
|
.min-h-screen {
|
||||||
|
min-height: 100vh;
|
||||||
|
}
|
||||||
.w-2\.5 {
|
.w-2\.5 {
|
||||||
width: 0.625rem;
|
width: 0.625rem;
|
||||||
}
|
}
|
||||||
|
|
@ -749,6 +782,12 @@ video {
|
||||||
-moz-user-select: none;
|
-moz-user-select: none;
|
||||||
user-select: none;
|
user-select: none;
|
||||||
}
|
}
|
||||||
|
.grid-cols-1 {
|
||||||
|
grid-template-columns: repeat(1, minmax(0, 1fr));
|
||||||
|
}
|
||||||
|
.grid-rows-\[64px_1fr\] {
|
||||||
|
grid-template-rows: 64px 1fr;
|
||||||
|
}
|
||||||
.flex-col {
|
.flex-col {
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
}
|
}
|
||||||
|
|
@ -804,6 +843,9 @@ video {
|
||||||
.overflow-hidden {
|
.overflow-hidden {
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
.overflow-y-auto {
|
||||||
|
overflow-y: auto;
|
||||||
|
}
|
||||||
.truncate {
|
.truncate {
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
|
|
@ -919,6 +961,9 @@ video {
|
||||||
--tw-bg-opacity: 1;
|
--tw-bg-opacity: 1;
|
||||||
background-color: rgb(234 179 8 / var(--tw-bg-opacity, 1));
|
background-color: rgb(234 179 8 / var(--tw-bg-opacity, 1));
|
||||||
}
|
}
|
||||||
|
.p-2 {
|
||||||
|
padding: 0.5rem;
|
||||||
|
}
|
||||||
.p-3 {
|
.p-3 {
|
||||||
padding: 0.75rem;
|
padding: 0.75rem;
|
||||||
}
|
}
|
||||||
|
|
@ -1364,3 +1409,23 @@ video {
|
||||||
text-align: left;
|
text-align: left;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@media (min-width: 768px) {
|
||||||
|
|
||||||
|
.md\:col-start-2 {
|
||||||
|
grid-column-start: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.md\:block {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.md\:grid-cols-\[250px_1fr\] {
|
||||||
|
grid-template-columns: 250px 1fr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@media (min-width: 1024px) {
|
||||||
|
|
||||||
|
.lg\:grid-cols-\[300px_1fr\] {
|
||||||
|
grid-template-columns: 300px 1fr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -7,7 +7,8 @@ import {
|
||||||
SheetClose
|
SheetClose
|
||||||
} from './ui/sheet';
|
} from './ui/sheet';
|
||||||
import { ScrollArea } from './ui/scroll-area';
|
import { ScrollArea } from './ui/scroll-area';
|
||||||
import { AgentSession, getSampleAgentSessions } from '../utils/sample-data';
|
import { AgentSession } from '../utils/types';
|
||||||
|
import { getSampleAgentSessions } from '../utils/sample-data';
|
||||||
|
|
||||||
interface SessionDrawerProps {
|
interface SessionDrawerProps {
|
||||||
onSelectSession?: (sessionId: string) => void;
|
onSelectSession?: (sessionId: string) => void;
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { ScrollArea } from './ui/scroll-area';
|
import { ScrollArea } from './ui/scroll-area';
|
||||||
import { AgentSession, getSampleAgentSessions } from '../utils/sample-data';
|
import { AgentSession } from '../utils/types';
|
||||||
|
import { getSampleAgentSessions } from '../utils/sample-data';
|
||||||
|
|
||||||
interface SessionSidebarProps {
|
interface SessionSidebarProps {
|
||||||
onSelectSession?: (sessionId: string) => void;
|
onSelectSession?: (sessionId: string) => void;
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import React, { useMemo } from 'react';
|
import React, { useMemo } from 'react';
|
||||||
import { TimelineStep } from './TimelineStep';
|
import { TimelineStep } from './TimelineStep';
|
||||||
import { AgentStep } from '../utils/sample-data';
|
import { AgentStep } from '../utils/types';
|
||||||
|
|
||||||
interface TimelineFeedProps {
|
interface TimelineFeedProps {
|
||||||
steps: AgentStep[];
|
steps: AgentStep[];
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { Collapsible, CollapsibleContent, CollapsibleTrigger } from './ui/collapsible';
|
import { Collapsible, CollapsibleContent, CollapsibleTrigger } from './ui/collapsible';
|
||||||
import { AgentStep } from '../utils/sample-data';
|
import { AgentStep } from '../utils/types';
|
||||||
|
|
||||||
interface TimelineStepProps {
|
interface TimelineStepProps {
|
||||||
step: AgentStep;
|
step: AgentStep;
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ export * from './button';
|
||||||
export * from './card';
|
export * from './card';
|
||||||
export * from './collapsible';
|
export * from './collapsible';
|
||||||
export * from './input';
|
export * from './input';
|
||||||
|
export * from './layout';
|
||||||
export * from './sheet';
|
export * from './sheet';
|
||||||
export * from './switch';
|
export * from './switch';
|
||||||
export * from './scroll-area';
|
export * from './scroll-area';
|
||||||
|
|
@ -0,0 +1,41 @@
|
||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Layout component using Tailwind Grid utilities
|
||||||
|
* This component creates a responsive layout with:
|
||||||
|
* - Sticky header at the top (z-index 30)
|
||||||
|
* - Sidebar on desktop (hidden on mobile)
|
||||||
|
* - Main content area with proper positioning
|
||||||
|
*/
|
||||||
|
export interface LayoutProps {
|
||||||
|
header: React.ReactNode;
|
||||||
|
sidebar?: React.ReactNode;
|
||||||
|
drawer?: React.ReactNode;
|
||||||
|
children: React.ReactNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const Layout: React.FC<LayoutProps> = ({ header, sidebar, drawer, children }) => {
|
||||||
|
return (
|
||||||
|
<div className="grid min-h-screen grid-cols-1 grid-rows-[64px_1fr] md:grid-cols-[250px_1fr] lg:grid-cols-[300px_1fr] bg-background text-foreground">
|
||||||
|
{/* Header - always visible, spans full width */}
|
||||||
|
<header className="sticky top-0 z-30 h-16 flex items-center bg-background border-b border-border col-span-full">
|
||||||
|
{header}
|
||||||
|
</header>
|
||||||
|
|
||||||
|
{/* Sidebar - hidden on mobile, visible on tablet/desktop */}
|
||||||
|
{sidebar && (
|
||||||
|
<aside className="hidden md:block sticky top-16 h-[calc(100vh-64px)] overflow-y-auto z-20 bg-background border-r border-border row-start-2 col-start-1">
|
||||||
|
{sidebar}
|
||||||
|
</aside>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{/* Main content area */}
|
||||||
|
<main className="overflow-y-auto p-4 row-start-2 col-start-1 md:col-start-2">
|
||||||
|
{children}
|
||||||
|
</main>
|
||||||
|
|
||||||
|
{/* Mobile drawer - rendered outside grid */}
|
||||||
|
{drawer}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
@ -1,7 +1,10 @@
|
||||||
// Entry point for @ra-aid/common package
|
// Entry point for @ra-aid/common package
|
||||||
import './styles/global.css';
|
import './styles/global.css';
|
||||||
|
|
||||||
// Export utility functions (excluding sample data to avoid circular references)
|
// Export types first to avoid circular references
|
||||||
|
export * from './utils/types';
|
||||||
|
|
||||||
|
// Export utility functions
|
||||||
export * from './utils';
|
export * from './utils';
|
||||||
|
|
||||||
// Export all UI components
|
// Export all UI components
|
||||||
|
|
@ -20,10 +23,8 @@ export const hello = (): void => {
|
||||||
console.log("Hello from @ra-aid/common");
|
console.log("Hello from @ra-aid/common");
|
||||||
};
|
};
|
||||||
|
|
||||||
// Directly export sample data functions and types to avoid circular references
|
// Directly export sample data functions
|
||||||
export {
|
export {
|
||||||
getSampleAgentSteps,
|
getSampleAgentSteps,
|
||||||
getSampleAgentSessions,
|
getSampleAgentSessions
|
||||||
type AgentStep,
|
|
||||||
type AgentSession
|
|
||||||
} from './utils/sample-data';
|
} from './utils/sample-data';
|
||||||
|
|
@ -2,30 +2,7 @@
|
||||||
* Sample data utility for agent UI components demonstration
|
* Sample data utility for agent UI components demonstration
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
import { AgentStep, AgentSession } from './types';
|
||||||
* Represents a single step in the agent process
|
|
||||||
*/
|
|
||||||
export interface AgentStep {
|
|
||||||
id: string;
|
|
||||||
timestamp: Date;
|
|
||||||
status: 'completed' | 'in-progress' | 'error' | 'pending';
|
|
||||||
type: 'tool-execution' | 'thinking' | 'planning' | 'implementation' | 'user-input';
|
|
||||||
title: string;
|
|
||||||
content: string;
|
|
||||||
duration?: number; // in milliseconds
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents a session with multiple steps
|
|
||||||
*/
|
|
||||||
export interface AgentSession {
|
|
||||||
id: string;
|
|
||||||
name: string;
|
|
||||||
created: Date;
|
|
||||||
updated: Date;
|
|
||||||
status: 'active' | 'completed' | 'error';
|
|
||||||
steps: AgentStep[];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns an array of sample agent steps
|
* Returns an array of sample agent steps
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,28 @@
|
||||||
|
/**
|
||||||
|
* Common types for agent UI components
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents a single step in the agent process
|
||||||
|
*/
|
||||||
|
export interface AgentStep {
|
||||||
|
id: string;
|
||||||
|
timestamp: Date;
|
||||||
|
status: 'completed' | 'in-progress' | 'error' | 'pending';
|
||||||
|
type: 'tool-execution' | 'thinking' | 'planning' | 'implementation' | 'user-input';
|
||||||
|
title: string;
|
||||||
|
content: string;
|
||||||
|
duration?: number; // in milliseconds
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents a session with multiple steps
|
||||||
|
*/
|
||||||
|
export interface AgentSession {
|
||||||
|
id: string;
|
||||||
|
name: string;
|
||||||
|
created: Date;
|
||||||
|
updated: Date;
|
||||||
|
status: 'active' | 'completed' | 'error';
|
||||||
|
steps: AgentStep[];
|
||||||
|
}
|
||||||
|
|
@ -1,99 +0,0 @@
|
||||||
import React, { ReactNode } from 'react';
|
|
||||||
|
|
||||||
interface LayoutProps {
|
|
||||||
header: ReactNode;
|
|
||||||
sidebar?: ReactNode;
|
|
||||||
drawer?: ReactNode;
|
|
||||||
children: ReactNode;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Layout component using CSS Grid with named areas
|
|
||||||
* This component creates a responsive layout with:
|
|
||||||
* - Sticky header at the top (z-index 30)
|
|
||||||
* - Sidebar on desktop (hidden on mobile)
|
|
||||||
* - Main content area with proper positioning
|
|
||||||
*/
|
|
||||||
export const Layout: React.FC<LayoutProps> = ({ header, sidebar, drawer, children }) => {
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
<style>{`
|
|
||||||
.layout-grid {
|
|
||||||
display: grid;
|
|
||||||
min-height: 100vh;
|
|
||||||
grid-template-areas:
|
|
||||||
"header"
|
|
||||||
"main";
|
|
||||||
grid-template-rows: 64px 1fr;
|
|
||||||
grid-template-columns: 1fr;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (min-width: 768px) {
|
|
||||||
.layout-grid {
|
|
||||||
grid-template-areas:
|
|
||||||
"header header"
|
|
||||||
"sidebar main";
|
|
||||||
grid-template-columns: 250px 1fr;
|
|
||||||
grid-template-rows: 64px 1fr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (min-width: 1024px) {
|
|
||||||
.layout-grid {
|
|
||||||
grid-template-columns: 300px 1fr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.layout-header {
|
|
||||||
grid-area: header;
|
|
||||||
position: sticky;
|
|
||||||
top: 0;
|
|
||||||
z-index: 30;
|
|
||||||
height: 64px;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.layout-sidebar {
|
|
||||||
grid-area: sidebar;
|
|
||||||
position: sticky;
|
|
||||||
top: 64px;
|
|
||||||
height: calc(100vh - 64px);
|
|
||||||
overflow-y: auto;
|
|
||||||
z-index: 20;
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (min-width: 768px) {
|
|
||||||
.layout-sidebar {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.layout-main {
|
|
||||||
grid-area: main;
|
|
||||||
overflow-y: auto;
|
|
||||||
}
|
|
||||||
`}</style>
|
|
||||||
|
|
||||||
<div className="layout-grid bg-background text-foreground">
|
|
||||||
<header className="layout-header bg-background border-b border-border">
|
|
||||||
{header}
|
|
||||||
</header>
|
|
||||||
|
|
||||||
{sidebar && (
|
|
||||||
<aside className="layout-sidebar bg-background border-r border-border">
|
|
||||||
{sidebar}
|
|
||||||
</aside>
|
|
||||||
)}
|
|
||||||
|
|
||||||
{/* Mobile drawer - rendered outside grid */}
|
|
||||||
{drawer}
|
|
||||||
|
|
||||||
<main className="layout-main p-4">
|
|
||||||
{children}
|
|
||||||
</main>
|
|
||||||
</div>
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
@ -2,13 +2,13 @@ import React, { useState, useEffect } from 'react';
|
||||||
import ReactDOM from 'react-dom/client';
|
import ReactDOM from 'react-dom/client';
|
||||||
import {
|
import {
|
||||||
Button,
|
Button,
|
||||||
|
Layout,
|
||||||
SessionDrawer,
|
SessionDrawer,
|
||||||
SessionSidebar,
|
SessionSidebar,
|
||||||
TimelineFeed,
|
TimelineFeed,
|
||||||
getSampleAgentSessions,
|
getSampleAgentSessions,
|
||||||
getSampleAgentSteps
|
getSampleAgentSteps
|
||||||
} from '@ra-aid/common';
|
} from '@ra-aid/common';
|
||||||
import { Layout } from './components/Layout';
|
|
||||||
// The CSS import happens through the common package's index.ts
|
// The CSS import happens through the common package's index.ts
|
||||||
|
|
||||||
// Theme management helper function
|
// Theme management helper function
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue