feat(i18n): Hebrew locale + full RTL support
This commit is contained in:
@@ -155,7 +155,7 @@ export function AccountSwitcher({ variant = "rail", className }: AccountSwitcher
|
||||
"flex items-center gap-2 rounded-md transition-colors",
|
||||
variant === "rail"
|
||||
? "justify-center w-10 h-10 hover:bg-muted"
|
||||
: "w-full px-2 py-1.5 hover:bg-muted text-left min-w-0",
|
||||
: "w-full px-2 py-1.5 hover:bg-muted text-start min-w-0",
|
||||
className
|
||||
)}
|
||||
title={variant === "rail" ? (displayName || displayEmail) : undefined}
|
||||
@@ -214,7 +214,7 @@ export function AccountSwitcher({ variant = "rail", className }: AccountSwitcher
|
||||
<button
|
||||
onClick={() => handleSwitch(account.id)}
|
||||
className={cn(
|
||||
"w-full flex items-start gap-3 px-3 py-2.5 text-left transition-colors",
|
||||
"w-full flex items-start gap-3 px-3 py-2.5 text-start transition-colors",
|
||||
isActive ? "bg-accent/50" : "hover:bg-muted",
|
||||
isDraggable && "pe-7"
|
||||
)}
|
||||
|
||||
@@ -95,7 +95,7 @@ export function IconPicker({ value, onChange, className }: IconPickerProps) {
|
||||
value={search}
|
||||
onChange={(e) => setSearch(e.target.value)}
|
||||
placeholder={t('search_icons')}
|
||||
className="pl-8 h-8 text-xs"
|
||||
className="ps-8 h-8 text-xs"
|
||||
/>
|
||||
{search && (
|
||||
<button
|
||||
|
||||
@@ -154,7 +154,7 @@ function SidebarAppForm({
|
||||
<label className="block text-sm font-medium mb-2">
|
||||
{t('icon_label')} <span className="text-destructive">*</span>
|
||||
{SelectedIcon && (
|
||||
<span className="inline-flex items-center gap-1.5 ml-2 text-muted-foreground font-normal">
|
||||
<span className="inline-flex items-center gap-1.5 ms-2 text-muted-foreground font-normal">
|
||||
- <SelectedIcon className="w-4 h-4" /> {formData.icon}
|
||||
</span>
|
||||
)}
|
||||
@@ -275,7 +275,7 @@ export function SidebarAppsModal({ isOpen, onClose }: SidebarAppsModalProps) {
|
||||
onClick={() => setIsCreating(true)}
|
||||
className="mb-6 w-full sm:w-auto"
|
||||
>
|
||||
<Plus className="w-4 h-4 mr-2" />
|
||||
<Plus className="w-4 h-4 me-2" />
|
||||
{t('add_new')}
|
||||
</Button>
|
||||
)}
|
||||
|
||||
@@ -220,7 +220,8 @@ function SidebarRowCounts({
|
||||
) : null;
|
||||
|
||||
return (
|
||||
<span className="ml-2 flex-shrink-0 flex items-baseline gap-1" title={totalCount > 0 ? `${unreadCount} unread / ${totalCount} total` : `${unreadCount} unread`}>
|
||||
<span className="ms-2 flex-shrink-0 flex items-baseline gap-1" title={totalCount > 0 ? `${unreadCount} unread / ${totalCount} total` : `${unreadCount} unread`}>
|
||||
|
||||
{unreadNode}
|
||||
{unreadCount > 0 && totalCount > 0 && (
|
||||
<span className="text-xs text-muted-foreground/60">/</span>
|
||||
@@ -279,12 +280,12 @@ function SidebarRow({
|
||||
style={{ paddingBlock: 'var(--density-sidebar-py)' }}
|
||||
className={cn(
|
||||
"group w-full flex items-center max-lg:min-h-[44px] text-sm transition-colors duration-150",
|
||||
isCollapsed ? "justify-center px-1" : "pr-2",
|
||||
isCollapsed ? "justify-center px-1" : "pe-2",
|
||||
isVirtual
|
||||
? "text-muted-foreground"
|
||||
: isSelected
|
||||
? "bg-accent text-accent-foreground font-semibold border-l-2 border-primary"
|
||||
: "hover:bg-muted/50 text-foreground border-l-2 border-transparent",
|
||||
? "bg-accent text-accent-foreground font-semibold border-s-2 border-primary"
|
||||
: "hover:bg-muted/50 text-foreground border-s-2 border-transparent",
|
||||
isValidDropTarget && "bg-primary/20 ring-2 ring-primary ring-inset",
|
||||
isInvalidDropTarget && "bg-destructive/10 ring-2 ring-destructive/30 ring-inset opacity-50"
|
||||
)}
|
||||
@@ -321,7 +322,7 @@ function SidebarRow({
|
||||
disabled={isVirtual}
|
||||
className={cn(
|
||||
"flex items-center gap-2 min-w-0 transition-colors",
|
||||
isCollapsed ? "justify-center" : "flex-1 text-left",
|
||||
isCollapsed ? "justify-center" : "flex-1 text-start",
|
||||
isVirtual && "cursor-default select-none"
|
||||
)}
|
||||
title={isCollapsed ? label : undefined}
|
||||
@@ -390,8 +391,8 @@ function SidebarSectionHeader({
|
||||
) : (
|
||||
<ChevronRight className="w-3.5 h-3.5 text-muted-foreground flex-shrink-0" />
|
||||
)}
|
||||
{icon && <span className="ml-1.5 flex-shrink-0">{icon}</span>}
|
||||
<span className={cn(textClass, icon ? "ml-1.5" : "ml-1.5")}>
|
||||
{icon && <span className="ms-1.5 flex-shrink-0">{icon}</span>}
|
||||
<span className={cn(textClass, icon ? "ms-1.5" : "ms-1.5")}>
|
||||
{label}
|
||||
</span>
|
||||
{onSettings && (
|
||||
@@ -409,7 +410,7 @@ function SidebarSectionHeader({
|
||||
onSettings();
|
||||
}
|
||||
}}
|
||||
className="ml-auto p-1 rounded text-muted-foreground/70 hover:text-foreground hover:bg-muted transition-colors cursor-pointer"
|
||||
className="ms-auto p-1 rounded text-muted-foreground/70 hover:text-foreground hover:bg-muted transition-colors cursor-pointer"
|
||||
title={settingsTitle}
|
||||
>
|
||||
<Settings className="w-3.5 h-3.5" />
|
||||
@@ -665,7 +666,7 @@ function VacationBanner() {
|
||||
>
|
||||
<Palmtree className="w-3.5 h-3.5 flex-shrink-0" />
|
||||
<span className="truncate font-medium">{t("vacation_active")}</span>
|
||||
<Settings className="w-3 h-3 ml-auto flex-shrink-0 opacity-60" />
|
||||
<Settings className="w-3 h-3 ms-auto flex-shrink-0 opacity-60" />
|
||||
</button>
|
||||
);
|
||||
}
|
||||
@@ -970,7 +971,7 @@ export function Sidebar({
|
||||
return (
|
||||
<div
|
||||
className={cn(
|
||||
"relative flex flex-col h-full border-r transition-all duration-300 overflow-hidden",
|
||||
"relative flex flex-col h-full border-e transition-all duration-300 overflow-hidden",
|
||||
"bg-secondary border-border",
|
||||
"max-lg:w-full",
|
||||
isCollapsed ? "lg:w-12" : "lg:w-full",
|
||||
|
||||
Reference in New Issue
Block a user