@devfellowship/components 1.3.0 → 1.4.0

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.cjs CHANGED
@@ -112,6 +112,7 @@ __export(src_exports, {
112
112
  ContextMenuSubContent: () => ContextMenuSubContent,
113
113
  ContextMenuSubTrigger: () => ContextMenuSubTrigger,
114
114
  ContextMenuTrigger: () => ContextMenuTrigger,
115
+ DEFAULT_NAME_COL_WIDTH: () => DEFAULT_NAME_COL_WIDTH,
115
116
  DflRemote: () => DflRemote,
116
117
  Dialog: () => Dialog,
117
118
  DialogClose: () => DialogClose,
@@ -311,6 +312,7 @@ __export(src_exports, {
311
312
  memberHueVar: () => memberHueVar,
312
313
  navigationMenuTriggerStyle: () => navigationMenuTriggerStyle,
313
314
  parseTags: () => parseTags,
315
+ resolveNameColWidth: () => resolveNameColWidth,
314
316
  resolveWeekCount: () => resolveWeekCount,
315
317
  resolveWeekLabels: () => resolveWeekLabels,
316
318
  stageProgress: () => stageProgress,
@@ -5074,6 +5076,12 @@ function AppNavbar({
5074
5076
  // src/components/organisms/Gantt.tsx
5075
5077
  var React44 = __toESM(require("react"), 1);
5076
5078
  var import_jsx_runtime63 = require("react/jsx-runtime");
5079
+ var DEFAULT_NAME_COL_WIDTH = 320;
5080
+ function resolveNameColWidth(nameColWidth, labelWidth) {
5081
+ if (typeof nameColWidth === "number" && nameColWidth > 0) return Math.round(nameColWidth);
5082
+ if (typeof labelWidth === "number" && labelWidth > 0) return Math.round(labelWidth);
5083
+ return DEFAULT_NAME_COL_WIDTH;
5084
+ }
5077
5085
  function clampPct(value) {
5078
5086
  if (value == null || Number.isNaN(value)) return 0;
5079
5087
  return Math.max(0, Math.min(100, Math.round(value)));
@@ -5116,7 +5124,8 @@ function Gantt({
5116
5124
  rowsHeader = "Stage / Task",
5117
5125
  stagesOnly = false,
5118
5126
  header,
5119
- labelWidth = 240,
5127
+ labelWidth,
5128
+ nameColWidth,
5120
5129
  weekMinWidth = 64,
5121
5130
  className,
5122
5131
  style,
@@ -5124,6 +5133,7 @@ function Gantt({
5124
5133
  }) {
5125
5134
  const weekCount = resolveWeekCount(stages, weeks);
5126
5135
  const weekLabels = resolveWeekLabels(weekCount, weeks);
5136
+ const nameWidth = resolveNameColWidth(nameColWidth, labelWidth);
5127
5137
  const [collapsed, setCollapsed] = React44.useState(
5128
5138
  () => Object.fromEntries(stages.filter((s) => s.collapsed).map((s) => [s.id, true]))
5129
5139
  );
@@ -5164,7 +5174,8 @@ function Gantt({
5164
5174
  window.addEventListener("resize", handler);
5165
5175
  return () => window.removeEventListener("resize", handler);
5166
5176
  }, [dependencies.length, recomputeEdges]);
5167
- const trackTemplate = `${labelWidth}px repeat(${weekCount}, minmax(${weekMinWidth}px, 1fr))`;
5177
+ const trackTemplate = `${nameWidth}px repeat(${weekCount}, minmax(${weekMinWidth}px, 1fr))`;
5178
+ const stickyCol = "sticky left-0 z-20 after:absolute after:inset-y-0 after:right-0 after:w-px after:bg-[var(--s-border-subtle,#2A2622)]";
5168
5179
  return /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)(
5169
5180
  "div",
5170
5181
  {
@@ -5227,7 +5238,16 @@ function Gantt({
5227
5238
  className: "grid items-center border-b border-[var(--s-border-subtle,#2A2622)] bg-[var(--s-surface-raised,#1A1714)]",
5228
5239
  style: { gridTemplateColumns: trackTemplate },
5229
5240
  children: [
5230
- /* @__PURE__ */ (0, import_jsx_runtime63.jsx)("div", { className: "px-4 py-2.5 font-[var(--s-font-mono,monospace)] text-[10.5px] font-medium uppercase tracking-[0.6px] text-[var(--s-ink-muted,#7D7568)]", children: rowsHeader }),
5241
+ /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
5242
+ "div",
5243
+ {
5244
+ className: cn(
5245
+ stickyCol,
5246
+ "bg-[var(--s-surface-raised,#1A1714)] px-4 py-2.5 font-[var(--s-font-mono,monospace)] text-[10.5px] font-medium uppercase tracking-[0.6px] text-[var(--s-ink-muted,#7D7568)]"
5247
+ ),
5248
+ children: rowsHeader
5249
+ }
5250
+ ),
5231
5251
  weekLabels.map((label, i) => /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
5232
5252
  "div",
5233
5253
  {
@@ -5258,7 +5278,10 @@ function Gantt({
5258
5278
  {
5259
5279
  type: "button",
5260
5280
  onClick: () => toggle(stage.id),
5261
- className: "flex items-center gap-2 px-4 py-3 text-left hover:bg-[var(--s-surface-raised,#1A1714)] transition-colors",
5281
+ className: cn(
5282
+ stickyCol,
5283
+ "flex items-center gap-2 bg-[var(--s-surface-panel,#141210)] px-4 py-3 text-left transition-colors hover:bg-[var(--s-surface-raised,#1A1714)]"
5284
+ ),
5262
5285
  "aria-expanded": !isCollapsed,
5263
5286
  children: [
5264
5287
  /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(Chevron, { open: !isCollapsed }),
@@ -5270,8 +5293,22 @@ function Gantt({
5270
5293
  }
5271
5294
  ),
5272
5295
  /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)("span", { className: "min-w-0", children: [
5273
- /* @__PURE__ */ (0, import_jsx_runtime63.jsx)("span", { className: "block truncate text-[13px] font-semibold text-[var(--s-ink-primary,#F6F1E7)]", children: stage.title }),
5274
- stage.subtitle && /* @__PURE__ */ (0, import_jsx_runtime63.jsx)("span", { className: "block truncate text-[11px] text-[var(--s-ink-muted,#7D7568)]", children: stage.subtitle })
5296
+ /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
5297
+ "span",
5298
+ {
5299
+ className: "block truncate text-[13px] font-semibold text-[var(--s-ink-primary,#F6F1E7)]",
5300
+ title: stage.title,
5301
+ children: stage.title
5302
+ }
5303
+ ),
5304
+ stage.subtitle && /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
5305
+ "span",
5306
+ {
5307
+ className: "block truncate text-[11px] text-[var(--s-ink-muted,#7D7568)]",
5308
+ title: stage.subtitle,
5309
+ children: stage.subtitle
5310
+ }
5311
+ )
5275
5312
  ] }),
5276
5313
  ms.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)("span", { className: "ml-auto shrink-0 rounded-[var(--c-badge-radius,4px)] bg-[var(--s-surface-elevated,#1F1C18)] px-1.5 py-0.5 font-[var(--s-font-mono,monospace)] text-[10px] tabular-nums text-[var(--s-ink-secondary,#C9C0B4)]", children: [
5277
5314
  done,
@@ -5330,20 +5367,30 @@ function Gantt({
5330
5367
  className: "grid items-center border-b border-[var(--s-border-subtle,#2A2622)] bg-[var(--s-surface-page,#0A0908)]",
5331
5368
  style: { gridTemplateColumns: trackTemplate },
5332
5369
  children: [
5333
- /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)("div", { className: "flex items-center gap-2 py-2 pl-10 pr-4", children: [
5334
- /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(StatusDot, { done: m.done, color: dot }),
5335
- /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
5336
- "span",
5337
- {
5338
- className: cn(
5339
- "min-w-0 flex-1 truncate text-[13px]",
5340
- m.done ? "text-[var(--s-ink-muted,#7D7568)] line-through" : "text-[var(--s-ink-secondary,#C9C0B4)]"
5370
+ /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)(
5371
+ "div",
5372
+ {
5373
+ className: cn(
5374
+ stickyCol,
5375
+ "flex items-center gap-2 bg-[var(--s-surface-page,#0A0908)] py-2 pl-10 pr-4"
5376
+ ),
5377
+ children: [
5378
+ /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(StatusDot, { done: m.done, color: dot }),
5379
+ /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
5380
+ "span",
5381
+ {
5382
+ className: cn(
5383
+ "min-w-0 flex-1 truncate text-[13px]",
5384
+ m.done ? "text-[var(--s-ink-muted,#7D7568)] line-through" : "text-[var(--s-ink-secondary,#C9C0B4)]"
5385
+ ),
5386
+ title: m.title,
5387
+ children: m.title
5388
+ }
5341
5389
  ),
5342
- children: m.title
5343
- }
5344
- ),
5345
- m.points != null && /* @__PURE__ */ (0, import_jsx_runtime63.jsx)("span", { className: "shrink-0 font-[var(--s-font-mono,monospace)] text-[10px] tabular-nums text-[var(--s-ink-muted,#7D7568)]", children: m.points })
5346
- ] }),
5390
+ m.points != null && /* @__PURE__ */ (0, import_jsx_runtime63.jsx)("span", { className: "shrink-0 font-[var(--s-font-mono,monospace)] text-[10px] tabular-nums text-[var(--s-ink-muted,#7D7568)]", children: m.points })
5391
+ ]
5392
+ }
5393
+ ),
5347
5394
  /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
5348
5395
  "div",
5349
5396
  {
@@ -5896,6 +5943,7 @@ var useFeatureFlags = () => {
5896
5943
  ContextMenuSubContent,
5897
5944
  ContextMenuSubTrigger,
5898
5945
  ContextMenuTrigger,
5946
+ DEFAULT_NAME_COL_WIDTH,
5899
5947
  DflRemote,
5900
5948
  Dialog,
5901
5949
  DialogClose,
@@ -6095,6 +6143,7 @@ var useFeatureFlags = () => {
6095
6143
  memberHueVar,
6096
6144
  navigationMenuTriggerStyle,
6097
6145
  parseTags,
6146
+ resolveNameColWidth,
6098
6147
  resolveWeekCount,
6099
6148
  resolveWeekLabels,
6100
6149
  stageProgress,
package/dist/index.d.cts CHANGED
@@ -985,11 +985,25 @@ interface GanttProps extends React$1.HTMLAttributes<HTMLDivElement> {
985
985
  stagesOnly?: boolean;
986
986
  /** Optional header strip (e.g. member + per-stage progress pills). */
987
987
  header?: React$1.ReactNode;
988
- /** Px width of the left rows column. Defaults to 240. */
988
+ /**
989
+ * Px width of the left (sticky) name column.
990
+ * @deprecated prefer `nameColWidth` — kept as a fallback for back-compat.
991
+ */
989
992
  labelWidth?: number;
993
+ /**
994
+ * Px width of the left (sticky) STAGE/TASK name column. Takes precedence
995
+ * over `labelWidth`. Defaults to 320 — wide enough that long stage/task
996
+ * titles read in full; overflow ellipsizes with a native tooltip. Bump this
997
+ * higher (e.g. 420) on full-width pages where you have the room.
998
+ */
999
+ nameColWidth?: number;
990
1000
  /** Min px width of a single week column. Defaults to 64. */
991
1001
  weekMinWidth?: number;
992
1002
  }
1003
+ /** Default width of the sticky name column. ~2× the original 240 → readable. */
1004
+ declare const DEFAULT_NAME_COL_WIDTH = 320;
1005
+ /** Resolve the effective name-column width: `nameColWidth` > `labelWidth` > default. */
1006
+ declare function resolveNameColWidth(nameColWidth?: number, labelWidth?: number): number;
993
1007
  /** Clamp a 0..100 percentage to an integer. */
994
1008
  declare function clampPct(value: number | undefined): number;
995
1009
  /** Progress for a stage: explicit `progress`, else done/total of milestones. */
@@ -1006,7 +1020,7 @@ declare function barGridColumn(weekStart: number, weekSpan: number, weekCount: n
1006
1020
  start: number;
1007
1021
  span: number;
1008
1022
  };
1009
- declare function Gantt({ stages, weeks, dependencies, rowsHeader, stagesOnly, header, labelWidth, weekMinWidth, className, style, ...rest }: GanttProps): react_jsx_runtime.JSX.Element;
1023
+ declare function Gantt({ stages, weeks, dependencies, rowsHeader, stagesOnly, header, labelWidth, nameColWidth, weekMinWidth, className, style, ...rest }: GanttProps): react_jsx_runtime.JSX.Element;
1010
1024
 
1011
1025
  /** Minimal subset of `@supabase/supabase-js` SupabaseClient we rely on.
1012
1026
  * Kept structural so the package never hard-depends on supabase-js. */
@@ -1083,4 +1097,4 @@ declare function validatePublishForm(input: {
1083
1097
  }): string | null;
1084
1098
  declare function PublishDrawer({ open, onOpenChange, supabase, videoUrl, transcript, suggestedTitle, suggestedDescription, suggestedThumbnailUrl, thumbnailTemplateId, buId, registerLesson, onPublished, onError, className, }: PublishDrawerProps): react_jsx_runtime.JSX.Element;
1085
1099
 
1086
- export { ALLOWED_ORIGINS, Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AppNavbar, type AppNavbarProps, AppSidebar, type AppSidebarProps, AspectRatio, Avatar, AvatarFallback, AvatarImage, Badge, type BadgeProps, Breadcrumb, BreadcrumbEllipsis, type BreadcrumbEntry, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Button, type ButtonProps, Calendar, type CalendarProps, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Carousel, type CarouselApi, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious, type ChartConfig, ChartContainer, ChartLegend, ChartLegendContent, ChartStyle, ChartTooltip, ChartTooltipContent, 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, type DflIframeMessage, type DflNavigateMessage, type DflReadyMessage, DflRemote, type DflRemoteProps, type DflResizeMessage, type DflSetTokenMessage, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, 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, Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, Gantt, type GanttDependency, type GanttMilestone, type GanttProps, type GanttStage, HoverCard, HoverCardContent, HoverCardTrigger, IconButton, type IconButtonProps, IframeAware, type IframeAwareProps, IframeContext, type IframeContextValue, type IframeMessageType, Input, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, Kbd, type KbdProps, Label, LoginPage, type LoginPageProps, LoginScreen, type LoginScreenProps, MEMBER_PALETTE_SIZE, Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger, type NavGroup, type NavItem, type NavbarUserInfo, NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, NavigationMenuViewport, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, PasswordInput, type PasswordInputProps, Popover, PopoverContent, PopoverTrigger, Progress, ProtectedRoute, type ProtectedRouteProps, PublishDrawer, type PublishDrawerProps, type PublishDrawerSupabase, type PublishResult, type PublishStatus, type PublisherAccount, RadioGroup, RadioGroupItem, ResizableHandle, ResizablePanel, ResizablePanelGroup, ScrollArea, ScrollBar, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, Skeleton, Slider, SonnerToaster, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, type TextareaProps, Toast, ToastAction, type ToastActionElement, ToastClose, type ToastComponentProps, ToastDescription, ToastProvider, ToastTitle, ToastViewport, Toaster, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, UserAvatar, type UserAvatarProps, type UserInfo, UserMenu, type UserMenuItem, type UserMenuProps, badgeVariants, barGridColumn, buttonVariants, clampPct, filterPublishableAccounts, getInitials, iconButtonVariants, isAllowedOrigin, kbdVariants, labelVariants, memberHueIndex, memberHueVar, navigationMenuTriggerStyle, parseTags, resolveWeekCount, resolveWeekLabels, stageProgress, toggleVariants, useFormField, useSidebar, validatePublishForm };
1100
+ export { ALLOWED_ORIGINS, Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AppNavbar, type AppNavbarProps, AppSidebar, type AppSidebarProps, AspectRatio, Avatar, AvatarFallback, AvatarImage, Badge, type BadgeProps, Breadcrumb, BreadcrumbEllipsis, type BreadcrumbEntry, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Button, type ButtonProps, Calendar, type CalendarProps, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Carousel, type CarouselApi, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious, type ChartConfig, ChartContainer, ChartLegend, ChartLegendContent, ChartStyle, ChartTooltip, ChartTooltipContent, 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, DEFAULT_NAME_COL_WIDTH, type DflIframeMessage, type DflNavigateMessage, type DflReadyMessage, DflRemote, type DflRemoteProps, type DflResizeMessage, type DflSetTokenMessage, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, 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, Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, Gantt, type GanttDependency, type GanttMilestone, type GanttProps, type GanttStage, HoverCard, HoverCardContent, HoverCardTrigger, IconButton, type IconButtonProps, IframeAware, type IframeAwareProps, IframeContext, type IframeContextValue, type IframeMessageType, Input, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, Kbd, type KbdProps, Label, LoginPage, type LoginPageProps, LoginScreen, type LoginScreenProps, MEMBER_PALETTE_SIZE, Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger, type NavGroup, type NavItem, type NavbarUserInfo, NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, NavigationMenuViewport, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, PasswordInput, type PasswordInputProps, Popover, PopoverContent, PopoverTrigger, Progress, ProtectedRoute, type ProtectedRouteProps, PublishDrawer, type PublishDrawerProps, type PublishDrawerSupabase, type PublishResult, type PublishStatus, type PublisherAccount, RadioGroup, RadioGroupItem, ResizableHandle, ResizablePanel, ResizablePanelGroup, ScrollArea, ScrollBar, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, Skeleton, Slider, SonnerToaster, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, type TextareaProps, Toast, ToastAction, type ToastActionElement, ToastClose, type ToastComponentProps, ToastDescription, ToastProvider, ToastTitle, ToastViewport, Toaster, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, UserAvatar, type UserAvatarProps, type UserInfo, UserMenu, type UserMenuItem, type UserMenuProps, badgeVariants, barGridColumn, buttonVariants, clampPct, filterPublishableAccounts, getInitials, iconButtonVariants, isAllowedOrigin, kbdVariants, labelVariants, memberHueIndex, memberHueVar, navigationMenuTriggerStyle, parseTags, resolveNameColWidth, resolveWeekCount, resolveWeekLabels, stageProgress, toggleVariants, useFormField, useSidebar, validatePublishForm };
package/dist/index.d.ts CHANGED
@@ -985,11 +985,25 @@ interface GanttProps extends React$1.HTMLAttributes<HTMLDivElement> {
985
985
  stagesOnly?: boolean;
986
986
  /** Optional header strip (e.g. member + per-stage progress pills). */
987
987
  header?: React$1.ReactNode;
988
- /** Px width of the left rows column. Defaults to 240. */
988
+ /**
989
+ * Px width of the left (sticky) name column.
990
+ * @deprecated prefer `nameColWidth` — kept as a fallback for back-compat.
991
+ */
989
992
  labelWidth?: number;
993
+ /**
994
+ * Px width of the left (sticky) STAGE/TASK name column. Takes precedence
995
+ * over `labelWidth`. Defaults to 320 — wide enough that long stage/task
996
+ * titles read in full; overflow ellipsizes with a native tooltip. Bump this
997
+ * higher (e.g. 420) on full-width pages where you have the room.
998
+ */
999
+ nameColWidth?: number;
990
1000
  /** Min px width of a single week column. Defaults to 64. */
991
1001
  weekMinWidth?: number;
992
1002
  }
1003
+ /** Default width of the sticky name column. ~2× the original 240 → readable. */
1004
+ declare const DEFAULT_NAME_COL_WIDTH = 320;
1005
+ /** Resolve the effective name-column width: `nameColWidth` > `labelWidth` > default. */
1006
+ declare function resolveNameColWidth(nameColWidth?: number, labelWidth?: number): number;
993
1007
  /** Clamp a 0..100 percentage to an integer. */
994
1008
  declare function clampPct(value: number | undefined): number;
995
1009
  /** Progress for a stage: explicit `progress`, else done/total of milestones. */
@@ -1006,7 +1020,7 @@ declare function barGridColumn(weekStart: number, weekSpan: number, weekCount: n
1006
1020
  start: number;
1007
1021
  span: number;
1008
1022
  };
1009
- declare function Gantt({ stages, weeks, dependencies, rowsHeader, stagesOnly, header, labelWidth, weekMinWidth, className, style, ...rest }: GanttProps): react_jsx_runtime.JSX.Element;
1023
+ declare function Gantt({ stages, weeks, dependencies, rowsHeader, stagesOnly, header, labelWidth, nameColWidth, weekMinWidth, className, style, ...rest }: GanttProps): react_jsx_runtime.JSX.Element;
1010
1024
 
1011
1025
  /** Minimal subset of `@supabase/supabase-js` SupabaseClient we rely on.
1012
1026
  * Kept structural so the package never hard-depends on supabase-js. */
@@ -1083,4 +1097,4 @@ declare function validatePublishForm(input: {
1083
1097
  }): string | null;
1084
1098
  declare function PublishDrawer({ open, onOpenChange, supabase, videoUrl, transcript, suggestedTitle, suggestedDescription, suggestedThumbnailUrl, thumbnailTemplateId, buId, registerLesson, onPublished, onError, className, }: PublishDrawerProps): react_jsx_runtime.JSX.Element;
1085
1099
 
1086
- export { ALLOWED_ORIGINS, Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AppNavbar, type AppNavbarProps, AppSidebar, type AppSidebarProps, AspectRatio, Avatar, AvatarFallback, AvatarImage, Badge, type BadgeProps, Breadcrumb, BreadcrumbEllipsis, type BreadcrumbEntry, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Button, type ButtonProps, Calendar, type CalendarProps, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Carousel, type CarouselApi, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious, type ChartConfig, ChartContainer, ChartLegend, ChartLegendContent, ChartStyle, ChartTooltip, ChartTooltipContent, 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, type DflIframeMessage, type DflNavigateMessage, type DflReadyMessage, DflRemote, type DflRemoteProps, type DflResizeMessage, type DflSetTokenMessage, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, 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, Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, Gantt, type GanttDependency, type GanttMilestone, type GanttProps, type GanttStage, HoverCard, HoverCardContent, HoverCardTrigger, IconButton, type IconButtonProps, IframeAware, type IframeAwareProps, IframeContext, type IframeContextValue, type IframeMessageType, Input, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, Kbd, type KbdProps, Label, LoginPage, type LoginPageProps, LoginScreen, type LoginScreenProps, MEMBER_PALETTE_SIZE, Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger, type NavGroup, type NavItem, type NavbarUserInfo, NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, NavigationMenuViewport, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, PasswordInput, type PasswordInputProps, Popover, PopoverContent, PopoverTrigger, Progress, ProtectedRoute, type ProtectedRouteProps, PublishDrawer, type PublishDrawerProps, type PublishDrawerSupabase, type PublishResult, type PublishStatus, type PublisherAccount, RadioGroup, RadioGroupItem, ResizableHandle, ResizablePanel, ResizablePanelGroup, ScrollArea, ScrollBar, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, Skeleton, Slider, SonnerToaster, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, type TextareaProps, Toast, ToastAction, type ToastActionElement, ToastClose, type ToastComponentProps, ToastDescription, ToastProvider, ToastTitle, ToastViewport, Toaster, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, UserAvatar, type UserAvatarProps, type UserInfo, UserMenu, type UserMenuItem, type UserMenuProps, badgeVariants, barGridColumn, buttonVariants, clampPct, filterPublishableAccounts, getInitials, iconButtonVariants, isAllowedOrigin, kbdVariants, labelVariants, memberHueIndex, memberHueVar, navigationMenuTriggerStyle, parseTags, resolveWeekCount, resolveWeekLabels, stageProgress, toggleVariants, useFormField, useSidebar, validatePublishForm };
1100
+ export { ALLOWED_ORIGINS, Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AppNavbar, type AppNavbarProps, AppSidebar, type AppSidebarProps, AspectRatio, Avatar, AvatarFallback, AvatarImage, Badge, type BadgeProps, Breadcrumb, BreadcrumbEllipsis, type BreadcrumbEntry, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Button, type ButtonProps, Calendar, type CalendarProps, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Carousel, type CarouselApi, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious, type ChartConfig, ChartContainer, ChartLegend, ChartLegendContent, ChartStyle, ChartTooltip, ChartTooltipContent, 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, DEFAULT_NAME_COL_WIDTH, type DflIframeMessage, type DflNavigateMessage, type DflReadyMessage, DflRemote, type DflRemoteProps, type DflResizeMessage, type DflSetTokenMessage, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, 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, Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, Gantt, type GanttDependency, type GanttMilestone, type GanttProps, type GanttStage, HoverCard, HoverCardContent, HoverCardTrigger, IconButton, type IconButtonProps, IframeAware, type IframeAwareProps, IframeContext, type IframeContextValue, type IframeMessageType, Input, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, Kbd, type KbdProps, Label, LoginPage, type LoginPageProps, LoginScreen, type LoginScreenProps, MEMBER_PALETTE_SIZE, Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger, type NavGroup, type NavItem, type NavbarUserInfo, NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, NavigationMenuViewport, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, PasswordInput, type PasswordInputProps, Popover, PopoverContent, PopoverTrigger, Progress, ProtectedRoute, type ProtectedRouteProps, PublishDrawer, type PublishDrawerProps, type PublishDrawerSupabase, type PublishResult, type PublishStatus, type PublisherAccount, RadioGroup, RadioGroupItem, ResizableHandle, ResizablePanel, ResizablePanelGroup, ScrollArea, ScrollBar, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, Skeleton, Slider, SonnerToaster, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, type TextareaProps, Toast, ToastAction, type ToastActionElement, ToastClose, type ToastComponentProps, ToastDescription, ToastProvider, ToastTitle, ToastViewport, Toaster, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, UserAvatar, type UserAvatarProps, type UserInfo, UserMenu, type UserMenuItem, type UserMenuProps, badgeVariants, barGridColumn, buttonVariants, clampPct, filterPublishableAccounts, getInitials, iconButtonVariants, isAllowedOrigin, kbdVariants, labelVariants, memberHueIndex, memberHueVar, navigationMenuTriggerStyle, parseTags, resolveNameColWidth, resolveWeekCount, resolveWeekLabels, stageProgress, toggleVariants, useFormField, useSidebar, validatePublishForm };
package/dist/index.js CHANGED
@@ -4754,6 +4754,12 @@ function AppNavbar({
4754
4754
  // src/components/organisms/Gantt.tsx
4755
4755
  import * as React44 from "react";
4756
4756
  import { jsx as jsx63, jsxs as jsxs31 } from "react/jsx-runtime";
4757
+ var DEFAULT_NAME_COL_WIDTH = 320;
4758
+ function resolveNameColWidth(nameColWidth, labelWidth) {
4759
+ if (typeof nameColWidth === "number" && nameColWidth > 0) return Math.round(nameColWidth);
4760
+ if (typeof labelWidth === "number" && labelWidth > 0) return Math.round(labelWidth);
4761
+ return DEFAULT_NAME_COL_WIDTH;
4762
+ }
4757
4763
  function clampPct(value) {
4758
4764
  if (value == null || Number.isNaN(value)) return 0;
4759
4765
  return Math.max(0, Math.min(100, Math.round(value)));
@@ -4796,7 +4802,8 @@ function Gantt({
4796
4802
  rowsHeader = "Stage / Task",
4797
4803
  stagesOnly = false,
4798
4804
  header,
4799
- labelWidth = 240,
4805
+ labelWidth,
4806
+ nameColWidth,
4800
4807
  weekMinWidth = 64,
4801
4808
  className,
4802
4809
  style,
@@ -4804,6 +4811,7 @@ function Gantt({
4804
4811
  }) {
4805
4812
  const weekCount = resolveWeekCount(stages, weeks);
4806
4813
  const weekLabels = resolveWeekLabels(weekCount, weeks);
4814
+ const nameWidth = resolveNameColWidth(nameColWidth, labelWidth);
4807
4815
  const [collapsed, setCollapsed] = React44.useState(
4808
4816
  () => Object.fromEntries(stages.filter((s) => s.collapsed).map((s) => [s.id, true]))
4809
4817
  );
@@ -4844,7 +4852,8 @@ function Gantt({
4844
4852
  window.addEventListener("resize", handler);
4845
4853
  return () => window.removeEventListener("resize", handler);
4846
4854
  }, [dependencies.length, recomputeEdges]);
4847
- const trackTemplate = `${labelWidth}px repeat(${weekCount}, minmax(${weekMinWidth}px, 1fr))`;
4855
+ const trackTemplate = `${nameWidth}px repeat(${weekCount}, minmax(${weekMinWidth}px, 1fr))`;
4856
+ const stickyCol = "sticky left-0 z-20 after:absolute after:inset-y-0 after:right-0 after:w-px after:bg-[var(--s-border-subtle,#2A2622)]";
4848
4857
  return /* @__PURE__ */ jsxs31(
4849
4858
  "div",
4850
4859
  {
@@ -4907,7 +4916,16 @@ function Gantt({
4907
4916
  className: "grid items-center border-b border-[var(--s-border-subtle,#2A2622)] bg-[var(--s-surface-raised,#1A1714)]",
4908
4917
  style: { gridTemplateColumns: trackTemplate },
4909
4918
  children: [
4910
- /* @__PURE__ */ jsx63("div", { className: "px-4 py-2.5 font-[var(--s-font-mono,monospace)] text-[10.5px] font-medium uppercase tracking-[0.6px] text-[var(--s-ink-muted,#7D7568)]", children: rowsHeader }),
4919
+ /* @__PURE__ */ jsx63(
4920
+ "div",
4921
+ {
4922
+ className: cn(
4923
+ stickyCol,
4924
+ "bg-[var(--s-surface-raised,#1A1714)] px-4 py-2.5 font-[var(--s-font-mono,monospace)] text-[10.5px] font-medium uppercase tracking-[0.6px] text-[var(--s-ink-muted,#7D7568)]"
4925
+ ),
4926
+ children: rowsHeader
4927
+ }
4928
+ ),
4911
4929
  weekLabels.map((label, i) => /* @__PURE__ */ jsx63(
4912
4930
  "div",
4913
4931
  {
@@ -4938,7 +4956,10 @@ function Gantt({
4938
4956
  {
4939
4957
  type: "button",
4940
4958
  onClick: () => toggle(stage.id),
4941
- className: "flex items-center gap-2 px-4 py-3 text-left hover:bg-[var(--s-surface-raised,#1A1714)] transition-colors",
4959
+ className: cn(
4960
+ stickyCol,
4961
+ "flex items-center gap-2 bg-[var(--s-surface-panel,#141210)] px-4 py-3 text-left transition-colors hover:bg-[var(--s-surface-raised,#1A1714)]"
4962
+ ),
4942
4963
  "aria-expanded": !isCollapsed,
4943
4964
  children: [
4944
4965
  /* @__PURE__ */ jsx63(Chevron, { open: !isCollapsed }),
@@ -4950,8 +4971,22 @@ function Gantt({
4950
4971
  }
4951
4972
  ),
4952
4973
  /* @__PURE__ */ jsxs31("span", { className: "min-w-0", children: [
4953
- /* @__PURE__ */ jsx63("span", { className: "block truncate text-[13px] font-semibold text-[var(--s-ink-primary,#F6F1E7)]", children: stage.title }),
4954
- stage.subtitle && /* @__PURE__ */ jsx63("span", { className: "block truncate text-[11px] text-[var(--s-ink-muted,#7D7568)]", children: stage.subtitle })
4974
+ /* @__PURE__ */ jsx63(
4975
+ "span",
4976
+ {
4977
+ className: "block truncate text-[13px] font-semibold text-[var(--s-ink-primary,#F6F1E7)]",
4978
+ title: stage.title,
4979
+ children: stage.title
4980
+ }
4981
+ ),
4982
+ stage.subtitle && /* @__PURE__ */ jsx63(
4983
+ "span",
4984
+ {
4985
+ className: "block truncate text-[11px] text-[var(--s-ink-muted,#7D7568)]",
4986
+ title: stage.subtitle,
4987
+ children: stage.subtitle
4988
+ }
4989
+ )
4955
4990
  ] }),
4956
4991
  ms.length > 0 && /* @__PURE__ */ jsxs31("span", { className: "ml-auto shrink-0 rounded-[var(--c-badge-radius,4px)] bg-[var(--s-surface-elevated,#1F1C18)] px-1.5 py-0.5 font-[var(--s-font-mono,monospace)] text-[10px] tabular-nums text-[var(--s-ink-secondary,#C9C0B4)]", children: [
4957
4992
  done,
@@ -5010,20 +5045,30 @@ function Gantt({
5010
5045
  className: "grid items-center border-b border-[var(--s-border-subtle,#2A2622)] bg-[var(--s-surface-page,#0A0908)]",
5011
5046
  style: { gridTemplateColumns: trackTemplate },
5012
5047
  children: [
5013
- /* @__PURE__ */ jsxs31("div", { className: "flex items-center gap-2 py-2 pl-10 pr-4", children: [
5014
- /* @__PURE__ */ jsx63(StatusDot, { done: m.done, color: dot }),
5015
- /* @__PURE__ */ jsx63(
5016
- "span",
5017
- {
5018
- className: cn(
5019
- "min-w-0 flex-1 truncate text-[13px]",
5020
- m.done ? "text-[var(--s-ink-muted,#7D7568)] line-through" : "text-[var(--s-ink-secondary,#C9C0B4)]"
5048
+ /* @__PURE__ */ jsxs31(
5049
+ "div",
5050
+ {
5051
+ className: cn(
5052
+ stickyCol,
5053
+ "flex items-center gap-2 bg-[var(--s-surface-page,#0A0908)] py-2 pl-10 pr-4"
5054
+ ),
5055
+ children: [
5056
+ /* @__PURE__ */ jsx63(StatusDot, { done: m.done, color: dot }),
5057
+ /* @__PURE__ */ jsx63(
5058
+ "span",
5059
+ {
5060
+ className: cn(
5061
+ "min-w-0 flex-1 truncate text-[13px]",
5062
+ m.done ? "text-[var(--s-ink-muted,#7D7568)] line-through" : "text-[var(--s-ink-secondary,#C9C0B4)]"
5063
+ ),
5064
+ title: m.title,
5065
+ children: m.title
5066
+ }
5021
5067
  ),
5022
- children: m.title
5023
- }
5024
- ),
5025
- m.points != null && /* @__PURE__ */ jsx63("span", { className: "shrink-0 font-[var(--s-font-mono,monospace)] text-[10px] tabular-nums text-[var(--s-ink-muted,#7D7568)]", children: m.points })
5026
- ] }),
5068
+ m.points != null && /* @__PURE__ */ jsx63("span", { className: "shrink-0 font-[var(--s-font-mono,monospace)] text-[10px] tabular-nums text-[var(--s-ink-muted,#7D7568)]", children: m.points })
5069
+ ]
5070
+ }
5071
+ ),
5027
5072
  /* @__PURE__ */ jsx63(
5028
5073
  "div",
5029
5074
  {
@@ -5579,6 +5624,7 @@ export {
5579
5624
  ContextMenuSubContent,
5580
5625
  ContextMenuSubTrigger,
5581
5626
  ContextMenuTrigger,
5627
+ DEFAULT_NAME_COL_WIDTH,
5582
5628
  DflRemote,
5583
5629
  Dialog,
5584
5630
  DialogClose,
@@ -5778,6 +5824,7 @@ export {
5778
5824
  memberHueVar,
5779
5825
  navigationMenuTriggerStyle,
5780
5826
  parseTags,
5827
+ resolveNameColWidth,
5781
5828
  resolveWeekCount,
5782
5829
  resolveWeekLabels,
5783
5830
  stageProgress,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@devfellowship/components",
3
- "version": "1.3.0",
3
+ "version": "1.4.0",
4
4
  "description": "DFL Design System — UI components, hooks, utils and providers",
5
5
  "type": "module",
6
6
  "sideEffects": [