-
-
Components
+ {/* Navigation cards */}
+
-
+
+
Components
+
+
+
+
+
+
+
+
+
+
@@ -47,7 +120,7 @@ export default function ComponentsList() {
-
+
diff --git a/platform/docs/src/pages/components/AllinOneMenuShowcase.tsx b/platform/docs/src/pages/components/AllinOneMenuShowcase.tsx
new file mode 100644
index 000000000..f479b5d9d
--- /dev/null
+++ b/platform/docs/src/pages/components/AllinOneMenuShowcase.tsx
@@ -0,0 +1,142 @@
+import React from 'react';
+import AllInOneMenu, {
+ IconMenu,
+ SubMenu,
+ ItemPanel,
+ Item,
+ DividerItem,
+ HorizontalDirection,
+ VerticalDirection,
+} from '../../../../ui-next/src/components/AllInOneMenu';
+import { Switch } from '../../../../ui-next/src/components/Switch';
+import ShowcaseRow from './ShowcaseRow';
+
+/**
+ * Pure‑UI mock of the in‑app Window/Level menu.
+ * Clickable, but all actions are inert.
+ */
+export default function AllinOneMenuShowcase() {
+ /* Helpers to build common static items so the JSX stays concise */
+ const renderColorLUTItems = () =>
+ [
+ 'Grayscale',
+ 'X Ray',
+ 'HSV',
+ 'Hot Iron',
+ 'Red Hot',
+ 'S PET',
+ 'Perfusion',
+ 'Rainbow',
+ 'SUV',
+ 'GE 256',
+ 'GE',
+ 'Siemens',
+ ].map(name =>
);
+
+ const renderWindowPresetItems = () =>
+ [
+ { desc: 'Soft tissue', wl: '400 / 40' },
+ { desc: 'Lung', wl: '1500 / -600' },
+ { desc: 'Liver', wl: '150 / 90' },
+ { desc: 'Bone', wl: '2500 / 480' },
+ { desc: 'Brain', wl: '80 / 40' },
+ ].map(p => (
+
+ ));
+
+ return (
+
+
+ } />
+
+
+
+ } />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+`}
+ >
+
+
+
+
+ }
+ useIconSpace={false}
+ />
+
+
+
+
+ }
+ />
+
+ {renderColorLUTItems()}
+
+
+
+ {renderWindowPresetItems()}
+
+
+
+
+
+ Click the icon to explore an example
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/platform/docs/src/pages/components/CinePlayerShowcase.tsx b/platform/docs/src/pages/components/CinePlayerShowcase.tsx
new file mode 100644
index 000000000..dc07be265
--- /dev/null
+++ b/platform/docs/src/pages/components/CinePlayerShowcase.tsx
@@ -0,0 +1,37 @@
+import React, { useState } from 'react';
+import CinePlayer from '../../../../ui-next/src/components/CinePlayer/CinePlayer';
+import ShowcaseRow from './ShowcaseRow';
+
+/**
+ * CinePlayerShowcase displays a playable/pausable cine player with FPS control.
+ */
+export default function CinePlayerShowcase() {
+ const [isPlaying, setIsPlaying] = useState(false);
+ const [fps, setFps] = useState(24);
+
+ return (
+
console.log('close clicked')}
+/>
+ `}
+ >
+ console.log('close clicked')}
+ />
+
+ );
+}
diff --git a/platform/docs/src/pages/components/ComboboxShowcase.tsx b/platform/docs/src/pages/components/ComboboxShowcase.tsx
new file mode 100644
index 000000000..812d9131c
--- /dev/null
+++ b/platform/docs/src/pages/components/ComboboxShowcase.tsx
@@ -0,0 +1,105 @@
+import React from 'react';
+import { Combobox } from '../../../../ui-next/src/components/Combobox/Combobox';
+import ShowcaseRow from './ShowcaseRow';
+
+/**
+ * ComboboxShowcase demonstrates the searchable Combobox component with a
+ * comprehensive “Modality” list.
+ */
+export default function ComboboxShowcase() {
+ const modalities = [
+ 'AR',
+ 'ASMT',
+ 'AU',
+ 'BDUS',
+ 'BI',
+ 'BMD',
+ 'CR',
+ 'CT',
+ 'CTPROTOCOL',
+ 'DG',
+ 'DOC',
+ 'DX',
+ 'ECG',
+ 'EPS',
+ 'ES',
+ 'FID',
+ 'GM',
+ 'HC',
+ 'HD',
+ 'IO',
+ 'IOL',
+ 'IVOCT',
+ 'IVUS',
+ 'KER',
+ 'KO',
+ 'LEN',
+ 'LS',
+ 'MG',
+ 'MR',
+ 'M3D',
+ 'NM',
+ 'OAM',
+ 'OCT',
+ 'OP',
+ 'OPM',
+ 'OPT',
+ 'OPTBSV',
+ 'OPTENF',
+ 'OPV',
+ 'OSS',
+ 'OT',
+ 'PLAN',
+ 'PR',
+ 'PT',
+ 'PX',
+ 'REG',
+ 'RESP',
+ 'RF',
+ 'RG',
+ 'RTDOSE',
+ 'RTIMAGE',
+ 'RTINTENT',
+ 'RTPLAN',
+ 'RTRAD',
+ 'RTRECORD',
+ 'RTSEGANN',
+ 'RTSTRUCT',
+ 'RWV',
+ 'SEG',
+ 'SM',
+ 'SMR',
+ 'SR',
+ 'SRF',
+ 'STAIN',
+ 'TEXTUREMAP',
+ 'TG',
+ 'US',
+ 'VA',
+ 'XA',
+ 'XC',
+ ].map(m => ({ value: m, label: m }));
+
+ return (
+
({ value: m, label: m }));
+
+
+ `}
+ >
+
+
+ );
+}
diff --git a/platform/docs/src/pages/components/DialogShowcase.tsx b/platform/docs/src/pages/components/DialogShowcase.tsx
new file mode 100644
index 000000000..cb5d29b95
--- /dev/null
+++ b/platform/docs/src/pages/components/DialogShowcase.tsx
@@ -0,0 +1,82 @@
+import React from 'react';
+import {
+ Dialog,
+ DialogTrigger,
+ DialogContent,
+ DialogHeader,
+ DialogFooter,
+ DialogTitle,
+ DialogDescription,
+ DialogClose,
+} from '../../../../ui-next/src/components/Dialog/Dialog';
+import { Button } from '../../../../ui-next/src/components/Button';
+import ShowcaseRow from './ShowcaseRow';
+
+/**
+ * DialogShowcase demonstrates a simple Radix‑based dialog.
+ */
+export default function DialogShowcase() {
+ return (
+
+
+ Open Dialog
+
+
+
+ Example Dialog
+
+
+ This is a short message inside the dialog.
+
+
+
+ Cancel
+
+
+ OK
+
+
+
+
+ `}
+ >
+
+
+ Open Dialog
+
+
+
+
+ Example Dialog
+
+
+ This is a short message inside the dialog.
+
+
+
+
+ Cancel
+
+
+
+
+
+ OK
+
+
+
+
+
+
+ );
+}
diff --git a/platform/docs/src/pages/components/HoverCardShowcase.tsx b/platform/docs/src/pages/components/HoverCardShowcase.tsx
new file mode 100644
index 000000000..8dbf713f2
--- /dev/null
+++ b/platform/docs/src/pages/components/HoverCardShowcase.tsx
@@ -0,0 +1,39 @@
+import React from 'react';
+import {
+ HoverCard,
+ HoverCardTrigger,
+ HoverCardContent,
+} from '../../../../ui-next/src/components/HoverCard/HoverCard';
+import { Button } from '../../../../ui-next/src/components/Button';
+import ShowcaseRow from './ShowcaseRow';
+
+/**
+ * HoverCardShowcase demonstrates a Hover Card that appears on pointer hover.
+ */
+export default function HoverCardShowcase() {
+ return (
+
+
+ Hover me
+
+
+ Hello there! I'm a hover card.
+
+
+ `}
+ >
+
+
+ Hover me
+
+
+ Hello there! I'm a hover card.
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/platform/docs/src/pages/components/LabelShowcase.tsx b/platform/docs/src/pages/components/LabelShowcase.tsx
new file mode 100644
index 000000000..7b764b943
--- /dev/null
+++ b/platform/docs/src/pages/components/LabelShowcase.tsx
@@ -0,0 +1,27 @@
+import React from 'react';
+import { Label } from '../../../../ui-next/src/components/Label/Label';
+import { Switch } from '../../../../ui-next/src/components/Switch';
+import ShowcaseRow from './ShowcaseRow';
+
+/**
+ * LabelShowcase pairs a Label with a Switch inline.
+ */
+export default function LabelShowcase() {
+ return (
+
+
+ Preview edits before creating
+
+ `}
+ >
+
+
+ Preview edits before creating
+
+
+ );
+}
\ No newline at end of file
diff --git a/platform/docs/src/pages/components/NumericMetaShowcase.tsx b/platform/docs/src/pages/components/NumericMetaShowcase.tsx
index 3ee19cf42..ba2bf180c 100644
--- a/platform/docs/src/pages/components/NumericMetaShowcase.tsx
+++ b/platform/docs/src/pages/components/NumericMetaShowcase.tsx
@@ -45,7 +45,7 @@ export default function NumericShowcase() {
`}
>
-
+
`}
>
-
+
`}
>
-
+
([0, 1
`}
>
-
+
([0, 1
`}
>
-
+
+ Series Information
+
+
+
Images: 120
+
Modality: MR
+
Body Part: Brain
+
Load another series
+
+
+
+ `}
+ >
+
+ Series Information
+
+
+
+
Images: 120
+
Modality: MR
+
Body Part: Brain
+
+
+ Load more information
+
+
+
+
+
+ );
+}
diff --git a/platform/docs/src/pages/components/PopoverShowcase.tsx b/platform/docs/src/pages/components/PopoverShowcase.tsx
new file mode 100644
index 000000000..eb86c0901
--- /dev/null
+++ b/platform/docs/src/pages/components/PopoverShowcase.tsx
@@ -0,0 +1,43 @@
+import React from 'react';
+import {
+ Popover,
+ PopoverTrigger,
+ PopoverContent,
+} from '../../../../ui-next/src/components/Popover/Popover';
+import { Button } from '../../../../ui-next/src/components/Button';
+import ShowcaseRow from './ShowcaseRow';
+
+/**
+ * PopoverShowcase presents a simple Popover that appears after clicking a button.
+ */
+export default function PopoverShowcase() {
+ return (
+
+
+ Open Popover
+
+
+
+ Hello! I’m a Popover. Click outside or press Esc to close me.
+
+
+
+ `}
+ >
+
+
+ Open Popover
+
+
+
+ Hello! I’m a Popover. Click outside or press Esc to close me.
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/platform/docs/src/pages/components/TabsShowcase.tsx b/platform/docs/src/pages/components/TabsShowcase.tsx
index e88750339..82b775c3e 100644
--- a/platform/docs/src/pages/components/TabsShowcase.tsx
+++ b/platform/docs/src/pages/components/TabsShowcase.tsx
@@ -12,7 +12,7 @@ export default function TabsShowcase() {
title="Tabs"
description="Tabs (or segmented controls) can be used to provide navigation options or allow users to switch between multiple options (e.g., tool settings) "
code={`
- console.log(newValue)}>
+ console.log(newValue)}>
Circle
@@ -24,6 +24,7 @@ export default function TabsShowcase() {
`}
>
console.log(newValue)}
>
@@ -37,4 +38,4 @@ export default function TabsShowcase() {
);
-}
+}
\ No newline at end of file
diff --git a/platform/docs/src/pages/components/TooltipShowcase.tsx b/platform/docs/src/pages/components/TooltipShowcase.tsx
new file mode 100644
index 000000000..c9ad13651
--- /dev/null
+++ b/platform/docs/src/pages/components/TooltipShowcase.tsx
@@ -0,0 +1,35 @@
+import React from 'react';
+import { Tooltip, TooltipTrigger, TooltipContent } from '../../../../ui-next/src/components/Tooltip';
+import { Button } from '../../../../ui-next/src/components/Button';
+import ShowcaseRow from './ShowcaseRow';
+
+/**
+ * TooltipShowcase component displays Tooltip variants and examples
+ */
+export default function TooltipShowcase() {
+ return (
+
+
+ ?
+
+
+ Tooltip content
+
+
+ `}
+ >
+
+
+ ?
+
+
+ Tooltip content
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/platform/docs/src/pages/patterns.tsx b/platform/docs/src/pages/patterns.tsx
index 309995764..12d5f2836 100644
--- a/platform/docs/src/pages/patterns.tsx
+++ b/platform/docs/src/pages/patterns.tsx
@@ -27,8 +27,9 @@ export default function ComponentShowcase() {
description="Patterns and example layouts"
>
-
-
+
+ {/* Navigation cards */}
+
-
-
Patterns
{
return (
);
};
diff --git a/platform/ui-next/src/components/Icons/Sources/Clear.tsx b/platform/ui-next/src/components/Icons/Sources/Clear.tsx
index bceffb901..fea7ec869 100644
--- a/platform/ui-next/src/components/Icons/Sources/Clear.tsx
+++ b/platform/ui-next/src/components/Icons/Sources/Clear.tsx
@@ -14,7 +14,7 @@ export const Clear = (props: IconProps) => (
fillRule="evenodd"
>