@olwiba/ui 0.2.16 → 0.2.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@ import { cn } from './chunk-AMWLSHD6.js';
2
2
  export { MdxContent, cn } from './chunk-AMWLSHD6.js';
3
3
  import * as React20 from 'react';
4
4
  import { useRef, useEffect, useState, useCallback } from 'react';
5
- import { Button as Button$1, Card as Card$1, Input as Input$1, Textarea as Textarea$1, Checkbox as Checkbox$1, Switch as Switch$1, useIsMobile, UIVariantProvider, Badge as Badge$1, cn as cn$1, Table, TableHeader, TableRow, TableHead, TableBody, TableCell, Avatar, AvatarImage, AvatarFallback, Select, SelectTrigger, SelectValue, SelectContent, SelectItem, DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, Dialog, DialogTrigger, Progress, useUIVariant, Separator, Accordion, AccordionItem, AccordionTrigger, AccordionContent, Label, Sheet, SheetTrigger, SheetContent, StatusIndicator, CommandDialog, CommandInput, CommandList, CommandEmpty, CommandSeparator, CommandGroup, CommandItem, TooltipProvider, Tooltip, TooltipTrigger, TooltipContent, ContextMenu as ContextMenu$1, ContextMenuTrigger, ContextMenuContent, AlertDialog, AlertDialogContent, AlertDialogHeader, AlertDialogTitle, AlertDialogDescription, AlertDialogFooter, AlertDialogCancel, AlertDialogAction, CommandShortcut, Popover, PopoverTrigger, PopoverContent, Spinner, SidebarProvider, SidebarInset, CardHeader, CardTitle, CardDescription, CardContent, InputOTP, InputOTPGroup, InputOTPSlot, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter, DialogClose, ContextMenuSeparator, ContextMenuLabel, ContextMenuSub, ContextMenuSubTrigger, ContextMenuSubContent, ContextMenuItem, ContextMenuShortcut, useSidebar, Sidebar, SidebarHeader, SidebarMenu, SidebarMenuItem, SidebarMenuButton, SidebarContent, SidebarGroup, SidebarGroupContent, SidebarFooter, SidebarTrigger, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuGroup } from '@olwiba/cn';
5
+ import { Button as Button$1, Card as Card$1, Input as Input$1, Textarea as Textarea$1, Checkbox as Checkbox$1, Switch as Switch$1, useIsMobile, UIVariantProvider, Badge as Badge$1, cn as cn$1, Table, TableHeader, TableRow, TableHead, TableBody, TableCell, Avatar, AvatarImage, AvatarFallback, Select, SelectTrigger, SelectValue, SelectContent, SelectItem, DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, Dialog, DialogTrigger, Progress, useUIVariant, Separator, Accordion, AccordionItem, AccordionTrigger, AccordionContent, Label, Sheet, SheetTrigger, SheetContent, StatusIndicator, CommandDialog, CommandInput, CommandList, CommandEmpty, CommandSeparator, CommandGroup, CommandItem, TooltipProvider, Tooltip, TooltipTrigger, TooltipContent, ContextMenu as ContextMenu$1, ContextMenuTrigger, ContextMenuContent, AlertDialog, AlertDialogContent, AlertDialogHeader, AlertDialogTitle, AlertDialogDescription, AlertDialogFooter, AlertDialogCancel, AlertDialogAction, CommandShortcut, Popover, PopoverTrigger, PopoverContent, Spinner, SidebarProvider, SidebarInset, CardHeader, CardTitle, CardDescription, CardContent, InputOTP, InputOTPGroup, InputOTPSlot, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter, DialogClose, ContextMenuSeparator, ContextMenuLabel, ContextMenuSub, ContextMenuSubTrigger, ContextMenuSubContent, ContextMenuItem, ContextMenuShortcut, useSidebar, Sidebar, SidebarHeader, SidebarMenu, SidebarMenuItem, SidebarContent, SidebarGroup, SidebarGroupContent, SidebarMenuButton, SidebarFooter, SidebarTrigger, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuGroup } from '@olwiba/cn';
6
6
  export { CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Enchanted } from '@olwiba/cn';
7
7
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
8
8
  import { Search, ArrowUp, ArrowDown, ArrowUpDown, ChevronLeft, ChevronRight, MoreHorizontal, UserPlus, Download, CreditCard, Check, Loader2, ArrowLeft, ArrowUpRight, X, Sparkles, RefreshCw, ArrowRight, Minus, Quote, Star, Twitter, Github, Linkedin, Mail, MessageSquare, ChevronDown, Send, Menu, UploadCloud, File, CheckCircle2, AlertCircle, Bell, Inbox, Activity, TrendingUp, TrendingDown, LayoutGrid, List, Sun, Moon, Palette, AlertTriangle, Rocket, Info, Layers, ShieldCheck, Building2, MoreVerticalIcon, CreditCardIcon, BellIcon, LogOutIcon } from 'lucide-react';
@@ -262,11 +262,29 @@ function PublicPageFrame({
262
262
  return /* @__PURE__ */ jsx("div", { className: cn("min-h-screen", surfaceMap[surface], className), ...props, children: /* @__PURE__ */ jsx("div", { className: cn("flex flex-col", spacingMap2[spacing], maxWidthMap2[maxWidth]), children }) });
263
263
  }
264
264
  var RAIL_SQUARE = "group-data-[collapsible=icon]:!size-8 group-data-[collapsible=icon]:!min-w-8 group-data-[collapsible=icon]:!max-w-8 group-data-[collapsible=icon]:!p-0 group-data-[collapsible=icon]:transition-[width,height]";
265
+ function initialsOf(source) {
266
+ const base = source.includes("@") ? source.split("@")[0] ?? source : source;
267
+ const words = base.split(/[\s._-]+/).filter(Boolean);
268
+ if (words.length >= 2) return (words[0][0] + words[1][0]).toUpperCase();
269
+ return (words[0] ?? base).slice(0, 2).toUpperCase();
270
+ }
271
+ function identityGradient(seed) {
272
+ let hash = 0;
273
+ for (let i = 0; i < seed.length; i += 1) {
274
+ hash = hash * 31 + seed.charCodeAt(i) | 0;
275
+ }
276
+ const hue = Math.abs(hash) % 360;
277
+ return {
278
+ backgroundImage: `linear-gradient(135deg, oklch(0.62 0.15 ${hue}), oklch(0.52 0.16 ${(hue + 28) % 360}))`,
279
+ color: "oklch(0.98 0 0)"
280
+ };
281
+ }
265
282
  function NavUser({ user }) {
266
283
  const { isMobile } = useSidebar();
267
284
  const uiMode = useUIMode();
268
285
  const avatarMode = uiMode !== "default" ? uiMode : void 0;
269
- const initials = (user.name ?? user.email).slice(0, 2).toUpperCase();
286
+ const initials = initialsOf(user.name ?? user.email);
287
+ const identityTint = identityGradient(user.email);
270
288
  return /* @__PURE__ */ jsx(SidebarMenu, { children: /* @__PURE__ */ jsx(SidebarMenuItem, { children: /* @__PURE__ */ jsxs(DropdownMenu, { children: [
271
289
  /* @__PURE__ */ jsx(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
272
290
  SidebarMenuButton,
@@ -278,9 +296,9 @@ function NavUser({ user }) {
278
296
  RAIL_SQUARE
279
297
  ),
280
298
  children: [
281
- /* @__PURE__ */ jsxs(Avatar, { mode: avatarMode, size: "sm", className: "grayscale", children: [
299
+ /* @__PURE__ */ jsxs(Avatar, { mode: avatarMode, size: "sm", children: [
282
300
  user.avatar && /* @__PURE__ */ jsx(AvatarImage, { src: user.avatar, alt: user.name }),
283
- /* @__PURE__ */ jsx(AvatarFallback, { children: initials })
301
+ /* @__PURE__ */ jsx(AvatarFallback, { className: "font-medium", style: identityTint, children: initials })
284
302
  ] }),
285
303
  /* @__PURE__ */ jsxs("div", { className: "grid flex-1 text-left text-sm leading-tight", children: [
286
304
  /* @__PURE__ */ jsx("span", { className: "truncate font-medium", children: user.name ?? user.email }),
@@ -301,7 +319,7 @@ function NavUser({ user }) {
301
319
  /* @__PURE__ */ jsx(DropdownMenuLabel, { className: "p-0 font-normal", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 px-1 py-1.5 text-left text-sm", children: [
302
320
  /* @__PURE__ */ jsxs(Avatar, { mode: avatarMode, size: "sm", children: [
303
321
  user.avatar && /* @__PURE__ */ jsx(AvatarImage, { src: user.avatar, alt: user.name }),
304
- /* @__PURE__ */ jsx(AvatarFallback, { children: initials })
322
+ /* @__PURE__ */ jsx(AvatarFallback, { className: "font-medium", style: identityTint, children: initials })
305
323
  ] }),
306
324
  /* @__PURE__ */ jsxs("div", { className: "grid flex-1 text-left text-sm leading-tight", children: [
307
325
  /* @__PURE__ */ jsx("span", { className: "truncate font-medium", children: user.name ?? user.email }),
@@ -349,23 +367,21 @@ function ShellSidebar({
349
367
  if (isMobile) setOpenMobile(false);
350
368
  }, [isMobile, setOpenMobile]);
351
369
  return /* @__PURE__ */ jsxs(Sidebar, { side, collapsible, sidebarPosition, children: [
352
- /* @__PURE__ */ jsx(SidebarHeader, { className: "py-3", children: /* @__PURE__ */ jsx(SidebarMenu, { children: /* @__PURE__ */ jsx(SidebarMenuItem, { onClickCapture: closeMobileMenu, children: /* @__PURE__ */ jsx(
353
- SidebarMenuButton,
370
+ /* @__PURE__ */ jsx(SidebarHeader, { className: "py-3", children: /* @__PURE__ */ jsx(SidebarMenu, { children: /* @__PURE__ */ jsx(SidebarMenuItem, { onClickCapture: closeMobileMenu, children: /* @__PURE__ */ jsxs(
371
+ "div",
354
372
  {
355
- asChild: true,
356
- size: "lg",
357
- className: RAIL_SQUARE,
358
- children: renderLink({
359
- href: brand.href ?? "#",
360
- children: /* @__PURE__ */ jsxs(Fragment, { children: [
361
- brand.logo ? (
362
- // Neutral slot: the consumer's logo owns its own chrome
363
- // (background, radius). Sized to fill the collapsed icon rail.
364
- /* @__PURE__ */ jsx("span", { className: "flex size-8 shrink-0 items-center justify-center [&>svg]:size-5", children: brand.logo })
365
- ) : /* @__PURE__ */ jsx("span", { className: "flex size-8 shrink-0 items-center justify-center rounded-lg bg-primary text-sm font-semibold text-primary-foreground", children: fallbackLogo }),
366
- /* @__PURE__ */ jsx("span", { className: "min-w-0 truncate text-base font-semibold group-data-[collapsible=icon]:hidden", children: brand.name })
367
- ] })
368
- })
373
+ className: cn$1(
374
+ "flex items-center gap-2 overflow-hidden rounded-md p-2 text-left",
375
+ RAIL_SQUARE
376
+ ),
377
+ children: [
378
+ brand.logo ? (
379
+ // Neutral slot: the consumer's logo owns its own chrome
380
+ // (background, radius). Sized to fill the collapsed icon rail.
381
+ /* @__PURE__ */ jsx("span", { className: "flex size-8 shrink-0 items-center justify-center [&>svg]:size-5", children: brand.logo })
382
+ ) : /* @__PURE__ */ jsx("span", { className: "flex size-8 shrink-0 items-center justify-center rounded-lg bg-primary text-sm font-semibold text-primary-foreground", children: fallbackLogo }),
383
+ /* @__PURE__ */ jsx("span", { className: "min-w-0 whitespace-nowrap text-base font-semibold leading-none [text-box-edge:ex_alphabetic] [text-box-trim:trim-both] group-data-[collapsible=icon]:hidden", children: brand.name })
384
+ ]
369
385
  }
370
386
  ) }) }) }),
371
387
  /* @__PURE__ */ jsx(SidebarContent, { children: /* @__PURE__ */ jsx(SidebarGroup, { children: /* @__PURE__ */ jsxs(SidebarGroupContent, { className: "flex flex-col gap-2", children: [
@@ -3327,7 +3343,7 @@ function Navbar({
3327
3343
  href: brandHref,
3328
3344
  children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2 font-semibold", children: [
3329
3345
  brand.logo,
3330
- /* @__PURE__ */ jsx("span", { children: brand.name })
3346
+ /* @__PURE__ */ jsx("span", { className: "leading-none [text-box-edge:ex_alphabetic] [text-box-trim:trim-both]", children: brand.name })
3331
3347
  ] })
3332
3348
  }),
3333
3349
  /* @__PURE__ */ jsx("div", { className: `hidden items-center gap-1 md:flex ${!hasRightContent ? "col-span-2 justify-end" : ""}`, children: navLinks.map((link) => /* @__PURE__ */ jsx("span", { children: renderLink({
@@ -3360,7 +3376,7 @@ function Navbar({
3360
3376
  href: brandHref,
3361
3377
  children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2 font-semibold", children: [
3362
3378
  brand.logo,
3363
- /* @__PURE__ */ jsx("span", { children: brand.name })
3379
+ /* @__PURE__ */ jsx("span", { className: "leading-none [text-box-edge:ex_alphabetic] [text-box-trim:trim-both]", children: brand.name })
3364
3380
  ] })
3365
3381
  }) }) }),
3366
3382
  /* @__PURE__ */ jsx(Separator, {}),
@@ -3400,7 +3416,7 @@ function Footer({
3400
3416
  className: "flex items-center gap-2",
3401
3417
  children: /* @__PURE__ */ jsxs(Fragment, { children: [
3402
3418
  brand.logo,
3403
- /* @__PURE__ */ jsx("span", { className: "text-lg font-semibold text-foreground", children: brand.name })
3419
+ /* @__PURE__ */ jsx("span", { className: "text-lg font-semibold leading-none text-foreground [text-box-edge:ex_alphabetic] [text-box-trim:trim-both]", children: brand.name })
3404
3420
  ] })
3405
3421
  }) }),
3406
3422
  navLinks && navLinks.length > 0 && /* @__PURE__ */ jsx("nav", { className: "mt-10 flex flex-wrap justify-center gap-x-12 gap-y-3", "aria-label": "Footer", children: navLinks.map(({ label, href }) => /* @__PURE__ */ jsx("div", { children: renderLink({