frontend: UI fixes + settings/patients features

- Record history: replace fragile COSS Timeline separator math with a
  continuous-rail list so every audited change renders in full (RTL-safe).
- Prescriptions: new reusable COSS DatePicker (Popover + Calendar) replaces
  raw <input type="date"> for Start/End date.
- Update banner: rebuilt with COSS Alert variant="warning"; pinned physical
  bottom-right so it stays bottom-right under Arabic RTL.
- AI setup notice: thin attached warning banner with clearer copy; now shown
  above the input in active chats too, not just the empty state.
- Settings profile: wire the previously dead Specialty (Select) and
  Professional links (editable rows) into the persisted preferences.
- Patients: add a status filter and broaden search to conditions/allergies.
- Sidebar user menu: quick language switch submenu (RTL already wired).
- ai-elements: fix a subset of Base UI type drift (22 -> 12; remainder is
  cmdk->Autocomplete migration drift kept behind ignoreBuildErrors).
- i18n: new keys added across all five locales (en/de/fr/ar/so).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Khalid Abdi
2026-07-12 21:06:38 +03:00
parent bffed5525d
commit 2c239fbd27
20 changed files with 455 additions and 133 deletions
@@ -369,15 +369,18 @@ export const AttachmentRemove = ({
// AttachmentHoverCard - Hover preview
// ============================================================================
export type AttachmentHoverCardProps = ComponentProps<typeof HoverCard>;
export type AttachmentHoverCardProps = ComponentProps<typeof HoverCard> & {
// Base UI moved hover delay to the Trigger (`delay`); kept here for API
// back-compat but no longer forwarded to the Root.
openDelay?: number;
closeDelay?: number;
};
export const AttachmentHoverCard = ({
openDelay = 0,
closeDelay = 0,
openDelay,
closeDelay,
...props
}: AttachmentHoverCardProps) => (
<HoverCard closeDelay={closeDelay} openDelay={openDelay} {...props} />
);
}: AttachmentHoverCardProps) => <HoverCard {...props} />;
export type AttachmentHoverCardTriggerProps = ComponentProps<
typeof HoverCardTrigger
+1 -1
View File
@@ -56,7 +56,7 @@ export const Context = ({
return (
<ContextContext.Provider value={contextValue}>
<HoverCard closeDelay={0} openDelay={0} {...props} />
<HoverCard {...props} />
</ContextContext.Provider>
);
};
@@ -50,7 +50,7 @@ export const InlineCitationText = ({
export type InlineCitationCardProps = ComponentProps<typeof HoverCard>;
export const InlineCitationCard = (props: InlineCitationCardProps) => (
<HoverCard closeDelay={0} openDelay={0} {...props} />
<HoverCard {...props} />
);
export type InlineCitationCardTriggerProps = ComponentProps<typeof Badge> & {
+14 -1
View File
@@ -128,5 +128,18 @@ export const PlanFooter = (props: PlanFooterProps) => (
export type PlanTriggerProps = ComponentProps<typeof CollapsibleTrigger>;
export const PlanTrigger = ({ className, ...props }: PlanTriggerProps) => (
<CollapsibleTrigger render={<Button className={cn("size-8", className)} data-slot="plan-trigger" size="icon" variant="ghost" {...props} />}><ChevronsUpDownIcon className="size-4" /><span className="sr-only">Toggle plan</span></CollapsibleTrigger>
<CollapsibleTrigger
{...props}
render={
<Button
className={cn("size-8", className)}
data-slot="plan-trigger"
size="icon"
variant="ghost"
/>
}
>
<ChevronsUpDownIcon className="size-4" />
<span className="sr-only">Toggle plan</span>
</CollapsibleTrigger>
);
@@ -1311,15 +1311,18 @@ export const PromptInputSelectValue = ({
<SelectValue className={cn(className)} {...props} />
);
export type PromptInputHoverCardProps = ComponentProps<typeof HoverCard>;
export type PromptInputHoverCardProps = ComponentProps<typeof HoverCard> & {
// Base UI moved hover delay to the Trigger (`delay`); kept here for API
// back-compat but no longer forwarded to the Root.
openDelay?: number;
closeDelay?: number;
};
export const PromptInputHoverCard = ({
openDelay = 0,
closeDelay = 0,
openDelay,
closeDelay,
...props
}: PromptInputHoverCardProps) => (
<HoverCard closeDelay={closeDelay} openDelay={openDelay} {...props} />
);
}: PromptInputHoverCardProps) => <HoverCard {...props} />;
export type PromptInputHoverCardTriggerProps = ComponentProps<
typeof HoverCardTrigger
@@ -107,7 +107,9 @@ export const SchemaDisplayPath = ({
<span
className={cn("font-mono text-sm", className)}
// oxlint-disable-next-line eslint-plugin-react(no-danger)
dangerouslySetInnerHTML={{ __html: children ?? highlightedPath }}
dangerouslySetInnerHTML={{
__html: typeof children === "string" ? children : highlightedPath,
}}
{...props}
/>
);