@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 +40 -24
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/app/AppShell.tsx +97 -35
- package/src/marketing/Footer.tsx +5 -1
- package/src/marketing/Navbar.tsx +22 -2
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,
|
|
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)
|
|
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",
|
|
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__ */
|
|
353
|
-
|
|
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
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
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({
|