@lessly/ui 0.3.2 → 0.4.1

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.d.ts CHANGED
@@ -848,4 +848,75 @@ declare function AppShell({ sidebar, topBar, children, className }: AppShellProp
848
848
  /** Alias of AppShell — reads better in app router files. */
849
849
  declare const AuthenticatedLayout: typeof AppShell;
850
850
 
851
- export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AppShell, type AppShellProps, AppSidebar, type AppSidebarProps, AspectRatio, AuthenticatedLayout, Avatar, AvatarFallback, AvatarImage, Badge, type BadgeProps, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Button, type ButtonProps, Calendar, type CalendarProps, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Carousel, type CarouselApi, CarouselContent, type CarouselContextProps, CarouselItem, CarouselNext, type CarouselOptions, type CarouselPlugin, CarouselPrevious, type CarouselProps, Checkbox, Collapsible, CollapsibleContent, CollapsibleTrigger, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, ConfirmDialog, type ConfirmDialogProps, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, CopyButton, type CopyButtonProps, DatePicker, type DatePickerProps, type DeltaDirection, type DeltaTone, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DocsLink, type DocsLinkProps, Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, type EmptyStateProps, ExtensionIcon, type ExtensionIconProps, ExtensionLink, type ExtensionLinkProps, type ExtensionLinkUiMode, Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, HoverCard, HoverCardContent, HoverCardTrigger, InlineError, type InlineErrorProps, Input, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, type InputProps, Label, MenuDivider, MenuPopup, type MenuPopupProps, Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger, type NavItem, type NavLinkComponent, NavRow, type NavRowProps, type NavRowVariant, NavSectionLabel, type NavSectionLabelProps, NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, NavigationMenuViewport, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, type PaginationLinkProps, PaginationNext, PaginationPrevious, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, Progress, RadioGroup, RadioGroupItem, type ResolvedTheme, ScrollArea, ScrollBar, SectionIntro, type SectionIntroProps, Select, type SelectOption, type SelectProps, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, SidebarNav, SidebarNavLink, type SidebarNavLinkProps, type SidebarNavProps, Skeleton, Slider, StatCard, type StatCardProps, StatusDot, type StatusDotProps, Switch, type SwitchProps, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, type TextareaProps, type Theme, ThemeToggle, Toaster, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, type UseSidebarOptions, type UseSidebarResult, UserMenu, type UserMenuItem, type UserMenuProps, type UserMenuUser, alertVariants, badgeVariants, buttonVariants, cn, isKnownExtensionIcon, navigationMenuTriggerStyle, statusDotVariants, toggleVariants, useCarousel, useFormField, useIsMobile, useSidebar, useTheme };
851
+ declare const segmentChipVariants: (props?: ({
852
+ kind?: "granted" | "own" | "pending" | "available" | null | undefined;
853
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
854
+ interface SegmentChipProps extends Omit<React$1.HTMLAttributes<HTMLSpanElement>, 'children' | 'resource'>, VariantProps<typeof segmentChipVariants> {
855
+ /** The resource this segment points at, e.g. "a GitHub repo", "Ads account 123-456". */
856
+ resource: React$1.ReactNode;
857
+ /** Override the leading icon; defaults to a glyph derived from `kind`. */
858
+ icon?: LucideIcon;
859
+ /** Hide the leading icon entirely. */
860
+ hideIcon?: boolean;
861
+ }
862
+ declare const SegmentChip: React$1.ForwardRefExoticComponent<SegmentChipProps & React$1.RefAttributes<HTMLSpanElement>>;
863
+
864
+ type ConnectionScope = 'org' | 'org/product' | 'product';
865
+ type ConnectionAuth = 'app' | 'oauth' | 'token';
866
+ type ConnectionStatus = 'connected' | 'error' | 'disconnected';
867
+ interface ConnectionCardProps extends React$1.HTMLAttributes<HTMLDivElement> {
868
+ /** Display name, e.g. "GitHub — apliteni". */
869
+ name: string;
870
+ scope: ConnectionScope;
871
+ auth: ConnectionAuth;
872
+ status: ConnectionStatus;
873
+ /** Provider mark; falls back to a monogram box derived from `name`. */
874
+ glyph?: React$1.ReactNode;
875
+ /** Override the default status label (e.g. "Token expired" for `error`). */
876
+ statusLabel?: string;
877
+ /** How many products hold a segment of this connection. */
878
+ grantedCount?: number;
879
+ /** Footer action — typically a <Button> ("Manage", "Reconnect", "Connect"). */
880
+ action?: React$1.ReactNode;
881
+ /**
882
+ * Blast-radius disclosure. Some providers (GitHub, ClickUp) grant all-or-nothing
883
+ * access to the whole external org — there is no per-repo/per-space permission, so
884
+ * a product's segment is enforced by Lessly's gateway, not the provider. When set,
885
+ * a warning notice is shown, e.g. "Full org access — all repositories."
886
+ */
887
+ access?: React$1.ReactNode;
888
+ /**
889
+ * Drawer content rendered below the card body — the org surface's accordion
890
+ * drawer in the integration prototype (the per-product grants roster, inline
891
+ * requests, "+ Grant to a product"). The caller owns expand/collapse: pass
892
+ * children only while open. Omitted = the flat card, unchanged.
893
+ */
894
+ children?: React$1.ReactNode;
895
+ }
896
+ declare const ConnectionCard: React$1.ForwardRefExoticComponent<ConnectionCardProps & React$1.RefAttributes<HTMLDivElement>>;
897
+
898
+ type RequestSurface = 'org' | 'product';
899
+ type RequestState = 'available' | 'pending' | 'granted';
900
+ interface RequestRowProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, 'children'> {
901
+ surface: RequestSurface;
902
+ /** Provider display name, e.g. "Google Ads". */
903
+ name: string;
904
+ state: RequestState;
905
+ /** Provider mark; falls back to a monogram box derived from `name`. */
906
+ glyph?: React$1.ReactNode;
907
+ /** Secondary line — requester + resource (org), or availability (product). */
908
+ subtitle?: React$1.ReactNode;
909
+ /** The granted resource label; renders a <SegmentChip> when `state` is `granted`. */
910
+ grantedResource?: React$1.ReactNode;
911
+ /** Approve an org-side request. */
912
+ onApprove?: () => void;
913
+ /** Deny an org-side request. */
914
+ onDeny?: () => void;
915
+ /** Request an available connection from the product side. */
916
+ onRequest?: () => void;
917
+ /** Override the trailing controls entirely. */
918
+ action?: React$1.ReactNode;
919
+ }
920
+ declare const RequestRow: React$1.ForwardRefExoticComponent<RequestRowProps & React$1.RefAttributes<HTMLDivElement>>;
921
+
922
+ export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AppShell, type AppShellProps, AppSidebar, type AppSidebarProps, AspectRatio, AuthenticatedLayout, Avatar, AvatarFallback, AvatarImage, Badge, type BadgeProps, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Button, type ButtonProps, Calendar, type CalendarProps, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Carousel, type CarouselApi, CarouselContent, type CarouselContextProps, CarouselItem, CarouselNext, type CarouselOptions, type CarouselPlugin, CarouselPrevious, type CarouselProps, Checkbox, Collapsible, CollapsibleContent, CollapsibleTrigger, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, ConfirmDialog, type ConfirmDialogProps, type ConnectionAuth, ConnectionCard, type ConnectionCardProps, type ConnectionScope, type ConnectionStatus, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, CopyButton, type CopyButtonProps, DatePicker, type DatePickerProps, type DeltaDirection, type DeltaTone, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DocsLink, type DocsLinkProps, Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, type EmptyStateProps, ExtensionIcon, type ExtensionIconProps, ExtensionLink, type ExtensionLinkProps, type ExtensionLinkUiMode, Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, HoverCard, HoverCardContent, HoverCardTrigger, InlineError, type InlineErrorProps, Input, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, type InputProps, Label, MenuDivider, MenuPopup, type MenuPopupProps, Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger, type NavItem, type NavLinkComponent, NavRow, type NavRowProps, type NavRowVariant, NavSectionLabel, type NavSectionLabelProps, NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, NavigationMenuViewport, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, type PaginationLinkProps, PaginationNext, PaginationPrevious, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, Progress, RadioGroup, RadioGroupItem, RequestRow, type RequestRowProps, type RequestState, type RequestSurface, type ResolvedTheme, ScrollArea, ScrollBar, SectionIntro, type SectionIntroProps, SegmentChip, type SegmentChipProps, Select, type SelectOption, type SelectProps, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, SidebarNav, SidebarNavLink, type SidebarNavLinkProps, type SidebarNavProps, Skeleton, Slider, StatCard, type StatCardProps, StatusDot, type StatusDotProps, Switch, type SwitchProps, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, type TextareaProps, type Theme, ThemeToggle, Toaster, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, type UseSidebarOptions, type UseSidebarResult, UserMenu, type UserMenuItem, type UserMenuProps, type UserMenuUser, alertVariants, badgeVariants, buttonVariants, cn, isKnownExtensionIcon, navigationMenuTriggerStyle, segmentChipVariants, statusDotVariants, toggleVariants, useCarousel, useFormField, useIsMobile, useSidebar, useTheme };
package/dist/index.js CHANGED
@@ -3068,6 +3068,163 @@ function AppShell({ sidebar, topBar, children, className }) {
3068
3068
  ] }) });
3069
3069
  }
3070
3070
  var AuthenticatedLayout = AppShell;
3071
+
3072
+ // src/components/segment-chip.tsx
3073
+ import * as React51 from "react";
3074
+ import { cva as cva9 } from "class-variance-authority";
3075
+ import { Link2 as Link22, KeyRound, Clock, Plus } from "lucide-react";
3076
+ import { jsx as jsx61, jsxs as jsxs31 } from "react/jsx-runtime";
3077
+ var segmentChipVariants = cva9(
3078
+ "inline-flex items-center gap-1.5 rounded-lg border px-2.5 py-1 text-sm font-medium leading-tight",
3079
+ {
3080
+ variants: {
3081
+ kind: {
3082
+ granted: "border-dashed border-text-teal/40 bg-bg-teal-subtle text-text-teal",
3083
+ own: "border-border-warning bg-bg-warning-subtle text-text-warning",
3084
+ pending: "border-dashed border-border-default bg-bg-secondary text-text-tertiary",
3085
+ available: "border-border-subtle bg-transparent text-text-secondary"
3086
+ }
3087
+ },
3088
+ defaultVariants: { kind: "granted" }
3089
+ }
3090
+ );
3091
+ var kindIcons = {
3092
+ granted: Link22,
3093
+ own: KeyRound,
3094
+ pending: Clock,
3095
+ available: Plus
3096
+ };
3097
+ var SegmentChip = React51.forwardRef(
3098
+ ({ kind, resource, icon, hideIcon = false, className, ...props }, ref) => {
3099
+ const Icon = icon ?? kindIcons[kind ?? "granted"];
3100
+ return /* @__PURE__ */ jsxs31("span", { ref, className: cn(segmentChipVariants({ kind }), className), ...props, children: [
3101
+ !hideIcon && /* @__PURE__ */ jsx61(Icon, { className: "size-3.5 shrink-0 opacity-90", "aria-hidden": "true" }),
3102
+ resource
3103
+ ] });
3104
+ }
3105
+ );
3106
+ SegmentChip.displayName = "SegmentChip";
3107
+
3108
+ // src/components/connection-card.tsx
3109
+ import * as React52 from "react";
3110
+ import { AlertTriangle } from "lucide-react";
3111
+ import { Fragment as Fragment3, jsx as jsx62, jsxs as jsxs32 } from "react/jsx-runtime";
3112
+ var authLabels = { app: "App", oauth: "OAuth", token: "token" };
3113
+ var statusMeta = {
3114
+ connected: { label: "Connected", badge: "success", dot: "success" },
3115
+ error: { label: "Needs attention", badge: "destructive", dot: "danger" },
3116
+ disconnected: { label: "Not connected", badge: "secondary", dot: "neutral" }
3117
+ };
3118
+ function monogram(name) {
3119
+ return name.replace(/[^a-zA-Z0-9 ]/g, " ").split(/\s+/).filter(Boolean).slice(0, 2).map((w) => w[0].toUpperCase()).join("");
3120
+ }
3121
+ var ConnectionCard = React52.forwardRef(
3122
+ ({ name, scope, auth, status, glyph, statusLabel, grantedCount, action, access, children, className, ...props }, ref) => {
3123
+ const meta = statusMeta[status];
3124
+ const connected = status !== "disconnected";
3125
+ return /* @__PURE__ */ jsxs32(Card, { ref, className: cn(status === "disconnected" && "border-dashed border-border-default", className), ...props, children: [
3126
+ /* @__PURE__ */ jsxs32("div", { className: "flex items-center gap-3 p-4", children: [
3127
+ /* @__PURE__ */ jsx62(
3128
+ "div",
3129
+ {
3130
+ "aria-hidden": "true",
3131
+ className: "flex size-8 shrink-0 items-center justify-center rounded-lg border border-border-subtle bg-bg-elevated text-sm font-bold text-text-secondary",
3132
+ children: glyph ?? monogram(name)
3133
+ }
3134
+ ),
3135
+ /* @__PURE__ */ jsxs32("div", { className: "min-w-0", children: [
3136
+ /* @__PURE__ */ jsx62("p", { className: "truncate text-sm font-semibold text-text-primary", children: name }),
3137
+ /* @__PURE__ */ jsxs32("div", { className: "mt-0.5 flex flex-wrap gap-1", children: [
3138
+ /* @__PURE__ */ jsx62(Badge, { variant: "secondary", children: scope }),
3139
+ /* @__PURE__ */ jsx62(Badge, { variant: "secondary", children: authLabels[auth] })
3140
+ ] })
3141
+ ] }),
3142
+ /* @__PURE__ */ jsx62("div", { className: "ml-auto shrink-0", children: connected ? /* @__PURE__ */ jsxs32(Badge, { variant: meta.badge, className: "gap-1.5", children: [
3143
+ /* @__PURE__ */ jsx62(StatusDot, { status: meta.dot, size: "sm" }),
3144
+ statusLabel ?? meta.label
3145
+ ] }) : action })
3146
+ ] }),
3147
+ access && /* @__PURE__ */ jsxs32(
3148
+ "div",
3149
+ {
3150
+ role: "note",
3151
+ className: "flex items-start gap-2 border-t border-border-subtle bg-bg-warning-subtle px-4 py-2.5 text-xs font-medium text-text-warning",
3152
+ children: [
3153
+ /* @__PURE__ */ jsx62(AlertTriangle, { className: "mt-0.5 size-3.5 shrink-0", "aria-hidden": "true" }),
3154
+ /* @__PURE__ */ jsx62("span", { children: access })
3155
+ ]
3156
+ }
3157
+ ),
3158
+ (grantedCount !== void 0 || connected && action) && /* @__PURE__ */ jsxs32("div", { className: "flex items-center justify-between border-t border-border-subtle px-4 py-3", children: [
3159
+ /* @__PURE__ */ jsx62("span", { className: "text-sm text-text-secondary", children: grantedCount !== void 0 ? /* @__PURE__ */ jsxs32(Fragment3, { children: [
3160
+ "Granted to ",
3161
+ /* @__PURE__ */ jsx62("span", { className: "font-semibold text-text-primary", children: grantedCount }),
3162
+ " ",
3163
+ grantedCount === 1 ? "product" : "products"
3164
+ ] }) : /* @__PURE__ */ jsx62("span", { className: "text-text-tertiary", children: "Not granted to any product yet" }) }),
3165
+ connected && action
3166
+ ] }),
3167
+ children && /* @__PURE__ */ jsx62("div", { "data-slot": "drawer", className: "border-t border-border-subtle", children })
3168
+ ] });
3169
+ }
3170
+ );
3171
+ ConnectionCard.displayName = "ConnectionCard";
3172
+
3173
+ // src/components/request-row.tsx
3174
+ import * as React53 from "react";
3175
+ import { Fragment as Fragment4, jsx as jsx63, jsxs as jsxs33 } from "react/jsx-runtime";
3176
+ function monogram2(name) {
3177
+ return name.replace(/[^a-zA-Z0-9 ]/g, " ").split(/\s+/).filter(Boolean).slice(0, 2).map((w) => w[0].toUpperCase()).join("");
3178
+ }
3179
+ var RequestRow = React53.forwardRef(
3180
+ ({ surface, name, state: state2, glyph, subtitle, grantedResource, onApprove, onDeny, onRequest, action, className, ...props }, ref) => {
3181
+ let controls = action;
3182
+ if (controls === void 0) {
3183
+ if (surface === "org" && state2 === "pending") {
3184
+ controls = /* @__PURE__ */ jsxs33(Fragment4, { children: [
3185
+ /* @__PURE__ */ jsx63(Button, { variant: "outline", size: "sm", onClick: onDeny, children: "Deny" }),
3186
+ /* @__PURE__ */ jsx63(Button, { size: "sm", onClick: onApprove, children: "Approve" })
3187
+ ] });
3188
+ } else if (state2 === "available") {
3189
+ controls = /* @__PURE__ */ jsx63(Button, { size: "sm", onClick: onRequest, children: "Request" });
3190
+ } else if (state2 === "pending") {
3191
+ controls = /* @__PURE__ */ jsxs33(Badge, { variant: "secondary", className: "gap-1.5", children: [
3192
+ /* @__PURE__ */ jsx63(StatusDot, { status: "neutral", size: "sm" }),
3193
+ "Pending"
3194
+ ] });
3195
+ } else if (state2 === "granted") {
3196
+ controls = /* @__PURE__ */ jsx63(SegmentChip, { kind: "granted", resource: grantedResource ?? "a segment" });
3197
+ }
3198
+ }
3199
+ return /* @__PURE__ */ jsxs33(
3200
+ "div",
3201
+ {
3202
+ ref,
3203
+ className: cn(
3204
+ "flex items-center gap-3 border-b border-border-subtle px-4 py-3 last:border-b-0",
3205
+ className
3206
+ ),
3207
+ ...props,
3208
+ children: [
3209
+ /* @__PURE__ */ jsx63(
3210
+ "div",
3211
+ {
3212
+ "aria-hidden": "true",
3213
+ className: "flex size-8 shrink-0 items-center justify-center rounded-lg border border-border-subtle bg-bg-elevated text-sm font-bold text-text-secondary",
3214
+ children: glyph ?? monogram2(name)
3215
+ }
3216
+ ),
3217
+ /* @__PURE__ */ jsxs33("div", { className: "min-w-0", children: [
3218
+ /* @__PURE__ */ jsx63("p", { className: "truncate text-sm font-semibold text-text-primary", children: name }),
3219
+ subtitle && /* @__PURE__ */ jsx63("p", { className: "truncate text-xs text-text-tertiary", children: subtitle })
3220
+ ] }),
3221
+ /* @__PURE__ */ jsx63("div", { className: "ml-auto flex shrink-0 items-center gap-2", children: controls })
3222
+ ]
3223
+ }
3224
+ );
3225
+ }
3226
+ );
3227
+ RequestRow.displayName = "RequestRow";
3071
3228
  export {
3072
3229
  Accordion,
3073
3230
  AccordionContent,
@@ -3129,6 +3286,7 @@ export {
3129
3286
  CommandSeparator,
3130
3287
  CommandShortcut,
3131
3288
  ConfirmDialog,
3289
+ ConnectionCard,
3132
3290
  ContextMenu,
3133
3291
  ContextMenuCheckboxItem,
3134
3292
  ContextMenuContent,
@@ -3244,9 +3402,11 @@ export {
3244
3402
  Progress,
3245
3403
  RadioGroup2 as RadioGroup,
3246
3404
  RadioGroupItem,
3405
+ RequestRow,
3247
3406
  ScrollArea,
3248
3407
  ScrollBar,
3249
3408
  SectionIntro,
3409
+ SegmentChip,
3250
3410
  Select,
3251
3411
  Separator4 as Separator,
3252
3412
  Sheet,
@@ -3295,6 +3455,7 @@ export {
3295
3455
  cn,
3296
3456
  isKnownExtensionIcon,
3297
3457
  navigationMenuTriggerStyle,
3458
+ segmentChipVariants,
3298
3459
  statusDotVariants,
3299
3460
  toast,
3300
3461
  toggleVariants,
package/dist/styles.css CHANGED
@@ -77,6 +77,9 @@
77
77
  --color-bg-teal-subtle: #091918;
78
78
  --color-bg-violet-subtle: #12091a;
79
79
  --color-bg-rose-subtle: #1a090b;
80
+ /* Vendored from design-system semantic `text.teal` (teal.300 dark / teal.600 light) —
81
+ the themed counterpart of the raw teal-* scale; used by SegmentChip `granted`. */
82
+ --color-text-teal: #70eada;
80
83
  --color-text-primary: #eeeff0;
81
84
  --color-text-secondary: #a5a9b5;
82
85
  --color-text-tertiary: #8a93a8;
@@ -136,6 +139,7 @@
136
139
  --color-bg-teal-subtle: #ebf3f2;
137
140
  --color-bg-violet-subtle: #efebf3;
138
141
  --color-bg-rose-subtle: #f4ebed;
142
+ --color-text-teal: #107469;
139
143
  --color-text-primary: #0e1015;
140
144
  --color-text-secondary: #393d4b;
141
145
  --color-text-tertiary: #535a6e;
@@ -171,6 +171,7 @@ declare const lesslyPreset: {
171
171
  "bg-danger": string;
172
172
  "bg-danger-subtle": string;
173
173
  "bg-teal-subtle": string;
174
+ "text-teal": string;
174
175
  "bg-violet-subtle": string;
175
176
  "bg-rose-subtle": string;
176
177
  "text-primary": string;
@@ -372,6 +372,7 @@ var lesslyPreset = {
372
372
  "bg-danger": "var(--color-bg-danger)",
373
373
  "bg-danger-subtle": "var(--color-bg-danger-subtle)",
374
374
  "bg-teal-subtle": "var(--color-bg-teal-subtle)",
375
+ "text-teal": "var(--color-text-teal)",
375
376
  "bg-violet-subtle": "var(--color-bg-violet-subtle)",
376
377
  "bg-rose-subtle": "var(--color-bg-rose-subtle)",
377
378
  "text-primary": "var(--color-text-primary)",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lessly/ui",
3
- "version": "0.3.2",
3
+ "version": "0.4.1",
4
4
  "description": "Lessly design system — shared UI primitives, tokens, and theme",
5
5
  "type": "module",
6
6
  "packageManager": "pnpm@10.30.3",