diff --git a/packages/apollo-react/src/canvas/components/NodePropertyPanel/NodePropertyPanel.stories.tsx b/packages/apollo-react/src/canvas/components/NodePropertyPanel/NodePropertyPanel.stories.tsx
index b31028287..ae9aba115 100644
--- a/packages/apollo-react/src/canvas/components/NodePropertyPanel/NodePropertyPanel.stories.tsx
+++ b/packages/apollo-react/src/canvas/components/NodePropertyPanel/NodePropertyPanel.stories.tsx
@@ -2,21 +2,40 @@ import type { EditorProps } from '@monaco-editor/react';
import type { Meta, StoryObj } from '@storybook/react-vite';
import type { FormSchema } from '@uipath/apollo-wind';
import {
+ Accordion,
+ AccordionContent,
+ AccordionItem,
+ AccordionTrigger,
+ Alert,
+ AlertDescription,
+ AlertTitle,
Badge,
Button,
+ Checkbox,
cn,
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuSeparator,
DropdownMenuTrigger,
+ Input,
+ Label,
MetadataForm,
+ RadioGroup,
+ RadioGroupItem,
ScrollableTabsList,
+ Select,
+ SelectContent,
+ SelectItem,
+ SelectTrigger,
+ SelectValue,
+ Slider,
Switch,
Tabs,
TabsContent,
TabsList,
TabsTrigger,
+ Textarea,
} from '@uipath/apollo-wind';
import {
apolloCoreDarkHCMonaco,
@@ -28,6 +47,7 @@ import {
} from '@uipath/apollo-wind/editor-themes';
import {
ChevronDown,
+ ChevronsUpDown,
CircleAlert,
CircleCheck,
Code2,
@@ -1732,6 +1752,505 @@ export const InlineEditing: Story = {
render: () => ,
};
+// ============================================================================
+// Panel UI Inventory
+// Interactive reference of common controls and layout patterns used in panels.
+// ============================================================================
+
+function InventoryField({
+ label,
+ description,
+ children,
+}: {
+ label: string;
+ description?: string;
+ children: ReactNode;
+}) {
+ return (
+
+
{label}
+ {children}
+ {description &&
{description}
}
+
+ );
+}
+
+function PatternNote({ title, children }: { title: string; children: ReactNode }) {
+ const [dismissed, setDismissed] = useState(false);
+
+ if (dismissed) return null;
+
+ return (
+
+
+
+ Layout pattern
+
+
setDismissed(true)}
+ aria-label={`Dismiss ${title} note`}
+ title="Dismiss note"
+ className="-mr-1 -mt-1 shrink-0 text-foreground-subtle hover:bg-surface-raised hover:text-foreground"
+ >
+
+
+
+ {title}
+ {children}
+
+ );
+}
+
+function InventorySubContainer({
+ expandedSections,
+ onExpandedSectionsChange,
+}: {
+ expandedSections: string[];
+ onExpandedSectionsChange: (sections: string[]) => void;
+}) {
+ const [enabled, setEnabled] = useState(true);
+ const [checked, setChecked] = useState(true);
+ const toggleSection = (section: string) => {
+ onExpandedSectionsChange(
+ expandedSections.includes(section)
+ ? expandedSections.filter((value) => value !== section)
+ : [...expandedSections, section]
+ );
+ };
+
+ return (
+
+
+
toggleSection('text-fields')}
+ aria-expanded={expandedSections.includes('text-fields')}
+ className="flex w-full items-center gap-2 px-3 py-2.5 text-left transition hover:bg-surface-overlay"
+ >
+
+
+ Text and numeric fields
+
+
+
+ {expandedSections.includes('text-fields') && (
+
+
+
+ )}
+
+
+
+
toggleSection('choices')}
+ aria-expanded={expandedSections.includes('choices')}
+ className="flex w-full items-center gap-2 px-3 py-2.5 text-left transition hover:bg-surface-overlay"
+ >
+
+
+ Selection controls
+
+
+ {expandedSections.includes('choices') && (
+
+
+
+
+
+
+
+ Production
+ Staging
+
+
+
+
+
+
+
+ Automatic
+
+
+
+ Manual review
+
+
+
+
+ setChecked(value === true)}
+ />
+
+ Save output for later steps
+
+
+
+
+ Enabled
+
+
+
+
+
+
+
+ )}
+
+
+
+
toggleSection('advanced')}
+ aria-expanded={expandedSections.includes('advanced')}
+ className="flex w-full items-center gap-2 px-3 py-2.5 text-left transition hover:bg-surface-overlay"
+ >
+
+
+ Advanced options
+
+
+ {expandedSections.includes('advanced') && (
+
+ )}
+
+
+ );
+}
+
+function PanelUIInventoryStory() {
+ const [enabled, setEnabled] = useState(true);
+ const [checked, setChecked] = useState(true);
+ const allInventorySections = ['text-fields', 'choices', 'collapsed'];
+ const allSubContainerSections = ['text-fields', 'choices', 'advanced'];
+ const [expandedSections, setExpandedSections] = useState(allInventorySections);
+ const [expandedSubContainerSections, setExpandedSubContainerSections] = useState(
+ allSubContainerSections
+ );
+ const allSectionsExpanded =
+ expandedSections.length === allInventorySections.length &&
+ expandedSubContainerSections.length === allSubContainerSections.length;
+
+ const toggleAllSections = () => {
+ if (allSectionsExpanded) {
+ setExpandedSections([]);
+ setExpandedSubContainerSections([]);
+ return;
+ }
+
+ setExpandedSections(allInventorySections);
+ setExpandedSubContainerSections(allSubContainerSections);
+ };
+
+ return (
+
+ }
+ nodeLabel="UI element inventory"
+ nodeCategory="Panel reference"
+ action={ }
+ contentInset="0.875rem"
+ onClose={() => {}}
+ className="h-[720px]"
+ >
+
+
+
+
+ Form fields
+
+
+ States
+
+
+ Actions
+
+
+
+
+
+
+
+
+
+
+ Full-width sections that reveal or hide related fields without adding nested
+ container chrome.
+
+
+
+
+ Text and numeric fields
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Selection controls
+
+
+
+
+
+
+
+ Production
+ Staging
+ Development
+
+
+
+
+
+
+
+ Automatic
+
+
+
+ Manual review
+
+
+
+
+
setChecked(value === true)}
+ />
+
+
+ Save output to storage
+
+
+ Makes the result available to later steps.
+
+
+
+
+
+
+ Enabled
+
+
Run this node in the workflow.
+
+
+
+
+
+
+
+
+
+
+ Advanced options
+
+
+
+
+
+
+
+
+
+ Dense, collapsible cards for related configuration when stronger visual grouping is
+ useful.
+
+
+
+
+
+ A simple, always-visible layout for short configurations that do not need
+ collapsible sections or nested containers.
+
+
+
+
+
+
+
+
+
+
+
+ Production
+ Staging
+
+
+
+
+
+
+ Enabled
+
+
+ Run this node in the workflow.
+
+
+
+
+
+
+
+
+
+
+
+ Default
+ Optional
+ Read only
+
+
+
+ Configuration is valid
+ All required fields have been completed.
+
+
+
+ Connection required
+ Select a valid connection before running this node.
+
+
+
+
+
+
+
+
+
+
+
Button hierarchy
+
+ Primary
+ Secondary
+ Tertiary
+ Delete
+
+
+
+
Footer pattern
+
+ Cancel
+ Save changes
+
+
+
+
+
+
+
+ );
+}
+
+export const PanelUIInventory: Story = {
+ name: 'Panel UI Inventory',
+ render: () => ,
+};
+
export const AlertsAndErrors: Story = {
name: 'Alerts and Errors',
render: () => ,