@tradalab/lyra 3.5.0 → 3.6.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.
Files changed (51) hide show
  1. package/dist/blocks/index.d.ts +5 -68
  2. package/dist/blocks/index.js +13 -156
  3. package/dist/blocks/index.js.map +1 -1
  4. package/dist/chunk-7MZ73OVI.js +3776 -0
  5. package/dist/chunk-7MZ73OVI.js.map +1 -0
  6. package/dist/chunk-AIULLZYM.js +21 -0
  7. package/dist/chunk-AIULLZYM.js.map +1 -0
  8. package/dist/{chunk-FHM6VOPQ.js → chunk-AM6UJ666.js} +105 -3
  9. package/dist/chunk-AM6UJ666.js.map +1 -0
  10. package/dist/chunk-D7DMRCDY.js +115 -0
  11. package/dist/chunk-D7DMRCDY.js.map +1 -0
  12. package/dist/{chunk-VDO6PQ5L.js → chunk-L4LQCVOF.js} +144 -8
  13. package/dist/chunk-L4LQCVOF.js.map +1 -0
  14. package/dist/{chunk-BTZYRWFX.js → chunk-RNKXFELK.js} +223 -17
  15. package/dist/chunk-RNKXFELK.js.map +1 -0
  16. package/dist/{chunk-2HDU26FC.js → chunk-VXW3K5O5.js} +99 -3
  17. package/dist/chunk-VXW3K5O5.js.map +1 -0
  18. package/dist/data-table/index.js +1 -2
  19. package/dist/data-table/index.js.map +1 -1
  20. package/dist/hooks/index.d.ts +3 -0
  21. package/dist/hooks/index.js +2 -1
  22. package/dist/people/index.js +2 -4
  23. package/dist/people/index.js.map +1 -1
  24. package/dist/plate-BJ19iaVV.d.ts +38 -0
  25. package/dist/plate-picker-CXxUGyNz.d.ts +20 -0
  26. package/dist/preference-script-Dm-LEoYX.d.ts +5 -0
  27. package/dist/shell/index.d.ts +19 -5
  28. package/dist/shell/index.js +39 -13
  29. package/dist/shell/index.js.map +1 -1
  30. package/dist/ui/index.d.ts +5 -2
  31. package/dist/ui/index.js +7 -3176
  32. package/dist/ui/index.js.map +1 -1
  33. package/dist/use-compact-BvI4sJf9.d.ts +15 -0
  34. package/package.json +1 -1
  35. package/dist/chunk-2HDU26FC.js.map +0 -1
  36. package/dist/chunk-BTZYRWFX.js.map +0 -1
  37. package/dist/chunk-CV3UXQBT.js +0 -110
  38. package/dist/chunk-CV3UXQBT.js.map +0 -1
  39. package/dist/chunk-EJP7F42V.js +0 -679
  40. package/dist/chunk-EJP7F42V.js.map +0 -1
  41. package/dist/chunk-F2ET7EL2.js +0 -104
  42. package/dist/chunk-F2ET7EL2.js.map +0 -1
  43. package/dist/chunk-FHM6VOPQ.js.map +0 -1
  44. package/dist/chunk-QYA2HGKW.js +0 -20
  45. package/dist/chunk-QYA2HGKW.js.map +0 -1
  46. package/dist/chunk-VDO6PQ5L.js.map +0 -1
  47. package/dist/chunk-XJJQAQWJ.js +0 -119
  48. package/dist/chunk-XJJQAQWJ.js.map +0 -1
  49. package/dist/chunk-XWGYXLIA.js +0 -147
  50. package/dist/chunk-XWGYXLIA.js.map +0 -1
  51. package/dist/{breadcrumb-CgEcSonR.d.ts → account-menu-D9M_kEzN.d.ts} +12 -12
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ui/primitives/avatar.tsx","../src/ui/primitives/textarea.tsx","../src/ui/primitives/input-group.tsx"],"names":["AvatarPrimitive","jsx"],"mappings":"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","file":"chunk-VXW3K5O5.js","sourcesContent":["import * as React from \"react\"\nimport { Avatar as AvatarPrimitive } from \"radix-ui\"\n\nimport { cn } from \"~/utils/cn.js\"\n\nfunction Avatar({\n className,\n size = \"default\",\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Root> & {\n size?: \"default\" | \"sm\" | \"lg\"\n}) {\n return (\n <AvatarPrimitive.Root\n data-slot=\"avatar\"\n data-size={size}\n className={cn(\n \"group/avatar relative flex size-8 shrink-0 rounded-full select-none after:absolute after:inset-0 after:rounded-full after:border after:border-border after:mix-blend-darken data-[size=lg]:size-10 data-[size=sm]:size-6 dark:after:mix-blend-lighten\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarImage({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Image>) {\n return (\n <AvatarPrimitive.Image\n data-slot=\"avatar-image\"\n className={cn(\n \"aspect-square size-full rounded-full object-cover\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarFallback({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Fallback>) {\n return (\n <AvatarPrimitive.Fallback\n data-slot=\"avatar-fallback\"\n className={cn(\n \"flex size-full items-center justify-center rounded-full bg-muted text-sm text-muted-foreground group-data-[size=sm]/avatar:text-xs\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarBadge({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"avatar-badge\"\n className={cn(\n \"absolute right-0 bottom-0 z-10 inline-flex items-center justify-center rounded-full bg-primary text-primary-foreground bg-blend-color ring-2 ring-background select-none\",\n \"group-data-[size=sm]/avatar:size-2 group-data-[size=sm]/avatar:[&>svg]:hidden\",\n \"group-data-[size=default]/avatar:size-2.5 group-data-[size=default]/avatar:[&>svg]:size-2\",\n \"group-data-[size=lg]/avatar:size-3 group-data-[size=lg]/avatar:[&>svg]:size-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"avatar-group\"\n className={cn(\n \"group/avatar-group flex -space-x-2 *:data-[slot=avatar]:ring-2 *:data-[slot=avatar]:ring-background\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarGroupCount({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"avatar-group-count\"\n className={cn(\n \"relative flex size-8 shrink-0 items-center justify-center rounded-full bg-muted text-xs text-muted-foreground ring-2 ring-background group-has-data-[size=lg]/avatar-group:size-10 group-has-data-[size=sm]/avatar-group:size-6 [&>svg]:size-4 group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 group-has-data-[size=sm]/avatar-group:[&>svg]:size-3\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Avatar,\n AvatarImage,\n AvatarFallback,\n AvatarGroup,\n AvatarGroupCount,\n AvatarBadge,\n}\n","import * as React from \"react\"\n\nimport { cn } from \"~/utils/cn.js\"\n\nfunction Textarea({ className, ...props }: React.ComponentProps<\"textarea\">) {\n return (\n <textarea\n data-slot=\"textarea\"\n className={cn(\n \"flex field-sizing-content min-h-16 w-full rounded-none border border-input bg-transparent px-2.5 py-2 text-xs transition-colors outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-1 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-1 aria-invalid:ring-destructive/20 md:text-xs dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Textarea }\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"~/utils/cn.js\"\nimport { Button } from \"./button.js\"\nimport { Input } from \"./input.js\"\nimport { Textarea } from \"./textarea.js\"\n\nfunction InputGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"input-group\"\n role=\"group\"\n className={cn(\n \"group/input-group relative flex h-8 w-full min-w-0 items-center rounded-none border border-input transition-colors outline-none in-data-[slot=combobox-content]:focus-within:border-inherit in-data-[slot=combobox-content]:focus-within:ring-0 has-disabled:bg-input/50 has-disabled:opacity-50 has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-1 has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot][aria-invalid=true]]:border-destructive has-[[data-slot][aria-invalid=true]]:ring-1 has-[[data-slot][aria-invalid=true]]:ring-destructive/20 has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>textarea]:h-auto dark:bg-input/30 dark:has-disabled:bg-input/80 dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40 has-[>[data-align=block-end]]:[&>input]:pt-3 has-[>[data-align=block-start]]:[&>input]:pb-3 has-[>[data-align=inline-end]]:[&>input]:pr-1.5 has-[>[data-align=inline-start]]:[&>input]:pl-1.5\",\n className\n )}\n {...props}\n />\n )\n}\n\nconst inputGroupAddonVariants = cva(\n \"flex h-auto cursor-text items-center justify-center gap-2 py-1.5 text-xs font-medium text-muted-foreground select-none group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-none [&>svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n align: {\n \"inline-start\":\n \"order-first pl-2 has-[>button]:ml-[-0.3rem] has-[>kbd]:ml-[-0.15rem]\",\n \"inline-end\":\n \"order-last pr-2 has-[>button]:mr-[-0.3rem] has-[>kbd]:mr-[-0.15rem]\",\n \"block-start\":\n \"order-first w-full justify-start px-2.5 pt-2 group-has-[>input]/input-group:pt-2 [.border-b]:pb-2\",\n \"block-end\":\n \"order-last w-full justify-start px-2.5 pb-2 group-has-[>input]/input-group:pb-2 [.border-t]:pt-2\",\n },\n },\n defaultVariants: {\n align: \"inline-start\",\n },\n }\n)\n\nfunction InputGroupAddon({\n className,\n align = \"inline-start\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof inputGroupAddonVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"input-group-addon\"\n data-align={align}\n className={cn(inputGroupAddonVariants({ align }), className)}\n onClick={(e) => {\n if ((e.target as HTMLElement).closest(\"button\")) {\n return\n }\n e.currentTarget.parentElement?.querySelector(\"input\")?.focus()\n }}\n {...props}\n />\n )\n}\n\nconst inputGroupButtonVariants = cva(\n \"flex items-center gap-2 text-xs shadow-none\",\n {\n variants: {\n size: {\n xs: \"h-6 gap-1 rounded-none px-1.5 [&>svg:not([class*='size-'])]:size-3.5\",\n sm: \"gap-1\",\n \"icon-xs\": \"size-6 rounded-none p-0 has-[>svg]:p-0\",\n \"icon-sm\": \"size-7 p-0 has-[>svg]:p-0\",\n },\n },\n defaultVariants: {\n size: \"xs\",\n },\n }\n)\n\nfunction InputGroupButton({\n className,\n type = \"button\",\n variant = \"ghost\",\n size = \"xs\",\n ...props\n}: Omit<React.ComponentProps<typeof Button>, \"size\"> &\n VariantProps<typeof inputGroupButtonVariants>) {\n return (\n <Button\n type={type}\n data-size={size}\n variant={variant}\n className={cn(inputGroupButtonVariants({ size }), className)}\n {...props}\n />\n )\n}\n\nfunction InputGroupText({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n className={cn(\n \"flex items-center gap-2 text-xs text-muted-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction InputGroupInput({\n className,\n ...props\n}: React.ComponentProps<\"input\">) {\n return (\n <Input\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 rounded-none border-0 bg-transparent shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction InputGroupTextarea({\n className,\n ...props\n}: React.ComponentProps<\"textarea\">) {\n return (\n <Textarea\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 resize-none rounded-none border-0 bg-transparent py-2 shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n InputGroup,\n InputGroupAddon,\n InputGroupButton,\n InputGroupText,\n InputGroupInput,\n InputGroupTextarea,\n}\n"]}
@@ -1,6 +1,5 @@
1
1
  "use client";
2
- import { TableHead, Table, TableRow, TableHeader, TableCell, TableBody } from '../chunk-CV3UXQBT.js';
3
- import { NativeSelect, NativeSelectOption } from '../chunk-FHM6VOPQ.js';
2
+ import { TableHead, Table, TableRow, TableHeader, TableCell, TableBody, NativeSelect, NativeSelectOption } from '../chunk-AM6UJ666.js';
4
3
  import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem } from '../chunk-VEWKPOMS.js';
5
4
  import { Button, Input } from '../chunk-VGOGWZCF.js';
6
5
  import { cn } from '../chunk-XH55BHUU.js';
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/data-table/index.tsx"],"names":["TableHead","TableHeader","TableCell","TableRow","TableBody"],"mappings":";;;;;;;;;;AAsBO,IAAM,eAAe,aAAA,CAIzB;AAAA,EACD,MAAM,EAAC;AAAA,EACP,SAAS,EAAC;AAAA,EACV,KAAA,EAAO;AACT,CAAC;AASM,SAAS,cAA6B,EAAE,OAAA,EAAS,IAAA,EAAM,QAAA,EAAU,WAAU,EAAsC;AACtH,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,QAAA,CAAuB,EAAE,CAAA;AACvD,EAAA,MAAM,QAAQ,aAAA,CAAc;AAAA,IAC1B,IAAA;AAAA,IACA,OAAA;AAAA,IACA,iBAAiB,eAAA,EAAgB;AAAA,IACjC,mBAAmB,iBAAA,EAAkB;AAAA;AAAA;AAAA,IAGrC,eAAA,EAAiB,UAAA;AAAA,IACjB,KAAA,EAAO;AAAA,MACL;AAAA;AACF,GACD,CAAA;AAED,EAAA,uBACE,GAAA;AAAA,IAAC,YAAA,CAAa,QAAA;AAAA,IAAb;AAAA,MACC,KAAA,EAAO;AAAA,QACL,IAAA;AAAA,QACA,OAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEA,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAS,SAAA,EAAuB,QAAA,EAAS;AAAA;AAAA,GAC5C;AAEJ;AAOO,IAAMA,UAAAA,GAAY,IAAA,CAAK,CAAC,EAAE,MAAA,EAAQ,WAAU,qBACjD,GAAA,CAAC,SAAA,EAAA,EAAa,SAAA,EACX,QAAA,EAAA,MAAA,CAAO,aAAA,GAAgB,OAAO,UAAA,CAAW,MAAA,CAAO,MAAA,CAAO,SAAA,CAAU,MAAA,EAAQ,MAAA,CAAO,YAAY,CAAA,EAAA,EADtD,MAAA,CAAO,EAEhD,CACD;AAEDA,UAAAA,CAAU,WAAA,GAAc,WAAA;AAOjB,IAAM,mBAAmB,CAAC,EAAE,aAAa,QAAA,EAAS,yBACtD,QAAA,EAAA,EAAkC,QAAA,EAAA,WAAA,CAAY,QAAQ,GAAA,CAAI,CAAA,MAAA,KAAU,SAAS,EAAE,MAAA,EAAQ,CAAC,CAAA,EAAA,EAAvE,YAAY,EAA6D;AAQtF,IAAMC,YAAAA,GAAc,CAAC,EAAE,SAAA,EAAW,UAAS,KAAwB;AACxE,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,UAAA,CAAW,YAAY,CAAA;AAEzC,EAAA,uBAAO,GAAA,CAAC,WAAA,EAAA,EAAe,SAAA,EAAuB,QAAA,EAAA,KAAA,EAAO,eAAA,EAAgB,CAAE,GAAA,CAAI,CAAA,WAAA,KAAe,QAAA,CAAS,EAAE,WAAA,EAAa,CAAC,CAAA,EAAE,CAAA;AACvH;AAOO,SAAS,iBAAA,CAAiC,EAAE,MAAA,EAAQ,KAAA,EAAO,WAAU,EAA0C;AAEpH,EAAA,MAAM,aAAA,GAAgB,YAAY,MAAM;AACtC,IAAA,MAAA,CAAO,cAAc,KAAK,CAAA;AAAA,EAC5B,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,MAAM,cAAA,GAAiB,YAAY,MAAM;AACvC,IAAA,MAAA,CAAO,cAAc,IAAI,CAAA;AAAA,EAC3B,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,IAAI,CAAC,MAAA,CAAO,UAAA,EAAW,EAAG;AACxB,IAAA,2BAAQ,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,SAAS,GAAI,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,EAC/C;AAEA,EAAA,uBACE,GAAA,CAAC,SAAI,SAAA,EAAW,EAAA,CAAG,+BAA+B,SAAS,CAAA,EACzD,+BAAC,YAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,mBAAA,EAAA,EAAoB,OAAA,EAAO,IAAA,EAC1B,QAAA,kBAAA,IAAA,CAAC,MAAA,EAAA,EAAO,WAAU,uCAAA,EAAwC,IAAA,EAAK,IAAA,EAAK,OAAA,EAAQ,OAAA,EAC1E,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,UAAM,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,MACZ,MAAA,CAAO,aAAY,KAAM,MAAA,uBACvB,aAAA,EAAA,EAAc,SAAA,EAAU,gBAAe,CAAA,GACtC,MAAA,CAAO,aAAY,KAAM,KAAA,uBAC1B,WAAA,EAAA,EAAY,SAAA,EAAU,gBAAe,CAAA,mBAEtC,GAAA,CAAC,kBAAA,EAAA,EAAmB,SAAA,EAAU,cAAA,EAAe;AAAA,KAAA,EAEjD,CAAA,EACF,CAAA;AAAA,oBACA,IAAA,CAAC,mBAAA,EAAA,EAAoB,KAAA,EAAM,OAAA,EACzB,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,gBAAA,EAAA,EAAiB,SAAS,aAAA,EACzB,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,WAAA,EAAA,EAAY,WAAU,2CAAA,EAA4C,CAAA;AAAA,QAAE;AAAA,OAAA,EAEvE,CAAA;AAAA,sBACA,IAAA,CAAC,gBAAA,EAAA,EAAiB,OAAA,EAAS,cAAA,EACzB,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,aAAA,EAAA,EAAc,WAAU,2CAAA,EAA4C,CAAA;AAAA,QAAE;AAAA,OAAA,EAEzE;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;AAOO,IAAMC,aAAY,CAAC,EAAE,IAAA,EAAM,SAAA,uBAChC,GAAA,CAAC,SAAA,EAAA,EAAa,SAAA,EAAuB,QAAA,EAAA,UAAA,CAAW,KAAK,MAAA,CAAO,SAAA,CAAU,MAAM,IAAA,CAAK,UAAA,EAAY,CAAA,EAAE;AAS1F,IAAMC,SAAAA,GAAW,CAAC,EAAE,GAAA,EAAK,QAAA,EAAU,SAAA,EAAU,qBAClD,GAAA,CAAC,QAAA,EAAA,EAAY,SAAA,EAAsB,YAAA,EAAY,GAAA,CAAI,aAAA,EAAc,IAAK,UAAA,EACnE,QAAA,EAAA,GAAA,CAAI,eAAA,EAAgB,CAAE,GAAA,CAAI,CAAA,IAAA,KAAQ,QAAA,CAAS,EAAE,IAAA,EAAM,CAAC,CAAA,EAAA,EADgC,GAAA,CAAI,EAE3F;AAQK,IAAMC,UAAAA,GAAY,CAAC,EAAE,QAAA,EAAU,WAAU,KAAsB;AACpE,EAAA,MAAM,EAAE,OAAA,EAAS,KAAA,EAAM,GAAI,WAAW,YAAY,CAAA;AAClD,EAAA,MAAM,IAAA,GAAO,KAAA,EAAO,WAAA,EAAY,CAAE,IAAA;AAElC,EAAA,uBACE,GAAA,CAAC,SAAA,EAAA,EAAa,SAAA,EACX,QAAA,EAAA,IAAA,EAAM,MAAA,GACL,KAAK,GAAA,CAAI,CAAA,GAAA,KAAO,QAAA,CAAS,EAAE,GAAA,EAAK,CAAC,CAAA,mBAEjC,GAAA,CAAC,QAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,SAAA,EAAA,EAAa,SAAA,EAAU,kBAAA,EAAmB,OAAA,EAAS,OAAA,CAAQ,MAAA,EAAQ,QAAA,EAAA,aAAA,EAEpE,CAAA,EACF,CAAA,EAEJ,CAAA;AAEJ;AA4FO,SAAS,UAAA,CAAW,KAAA,EAAe,KAAA,EAAe,MAAA,GAAS,CAAA,EAAsB;AACtF,EAAA,IAAI,KAAA,IAAS,CAAA,EAAG,OAAO,EAAC;AACxB,EAAA,MAAM,uBAAO,IAAI,GAAA,CAAY,CAAC,CAAA,EAAG,KAAA,GAAQ,CAAC,CAAC,CAAA;AAC3C,EAAA,KAAA,IAAS,IAAI,KAAA,GAAQ,MAAA,EAAQ,CAAA,IAAK,KAAA,GAAQ,QAAQ,CAAA,EAAA,EAAK;AACrD,IAAA,IAAI,KAAK,CAAA,IAAK,CAAA,GAAI,KAAA,EAAO,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,EACrC;AACA,EAAA,MAAM,MAAA,GAAS,CAAC,GAAG,IAAI,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAC7C,EAAA,MAAM,MAAyB,EAAC;AAChC,EAAA,IAAI,IAAA,GAAO,EAAA;AACX,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AAGtB,IAAA,IAAI,IAAA,IAAQ,KAAK,CAAA,GAAI,IAAA,KAAS,GAAG,GAAA,CAAI,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,SAAA,IACtC,QAAQ,CAAA,IAAK,CAAA,GAAI,OAAO,CAAA,EAAG,GAAA,CAAI,KAAK,IAAI,CAAA;AACjD,IAAA,GAAA,CAAI,KAAK,CAAC,CAAA;AACV,IAAA,IAAA,GAAO,CAAA;AAAA,EACT;AACA,EAAA,OAAO,GAAA;AACT;AAEO,SAAS,SAAA,CAAyB;AAAA,EACvC,OAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA,GAAY,aAAA;AAAA,EACZ,KAAA;AAAA,EACA,WAAA,GAAc,eAAA;AAAA,EACd,aAAA,GAAgB,UAAA;AAAA,EAChB,SAAA,GAAY,MAAA;AAAA,EACZ,QAAA,GAAW,EAAA;AAAA,EACX,SAAA;AAAA,EACA,UAAA;AAAA,EACA,iBAAA,GAAoB,cAAA;AAAA,EACpB,QAAA;AAAA,EACA,WAAA,GAAc,QAAA;AAAA,EACd,OAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,eAAA,GAAkB,oBAAA;AAAA,EAClB,SAAA,GAAY,CAAA;AAAA,EACZ,SAAA,GAAY,CAAA;AAAA,EACZ,YAAA;AAAA,EACA,eAAA;AAAA,EACA,gBAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,EAAkC;AAChC,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAS,EAAE,CAAA;AACnD,EAAA,MAAM,QAAA,GAAW,QAAQ,UAAU,CAAA;AAEnC,EAAA,MAAM,MAAA,GAAS,CAAC,QAAA,IAAY,OAAA,CAAQ,YAAY,CAAA;AAChD,EAAA,MAAM,QAAQ,aAAA,CAAc;AAAA,IAC1B,IAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA,EAAO,EAAE,YAAA,EAAa;AAAA,IACtB,oBAAA,EAAsB,eAAA;AAAA,IACtB,iBAAiB,eAAA,EAAgB;AAAA,IACjC,qBAAqB,mBAAA,EAAoB;AAAA;AAAA;AAAA,IAGzC,GAAI,QAAA,IAAY,MAAA,GACZ,KACA,EAAE,qBAAA,EAAuB,qBAAA,EAAsB,EAAG,cAAc,EAAE,UAAA,EAAY,EAAE,QAAA,IAAW;AAAE,GAClG,CAAA;AAED,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,WAAA,EAAY,CAAE,IAAA;AACjC,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,UAAA,IAAc,QAAA,IAAY,OAAO,CAAA;AAIzD,EAAA,MAAM,WAAA,GAAc,OAA8B,IAAI,CAAA;AACtD,EAAA,MAAM,aAAA,GAAgB,OAAO,UAAU,CAAA;AACvC,EAAA,aAAA,CAAc,OAAA,GAAU,UAAA;AACxB,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,EAAE,OAAA,EAAS,aAAa,CAAA;AAC7C,EAAA,KAAA,CAAM,OAAA,GAAU,EAAE,OAAA,EAAS,WAAA,EAAY;AACvC,EAAA,MAAM,YAAA,GAAe,OAAO,KAAK,CAAA;AAEjC,EAAA,MAAM,aAAA,GAAgB,YAAY,MAAM;AACtC,IAAA,IAAI,YAAA,CAAa,WAAW,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAC,KAAA,CAAM,QAAQ,WAAA,EAAa;AAC/E,MAAA,aAAA,CAAc,OAAA,IAAU;AAAA,IAC1B;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,QAAA,EAAU;AACf,IAAA,MAAM,KAAK,WAAA,CAAY,OAAA;AACvB,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,MAAM,KAAK,IAAI,oBAAA;AAAA,MACb,CAAA,OAAA,KAAW;AACT,QAAA,YAAA,CAAa,OAAA,GAAU,OAAA,CAAQ,CAAC,CAAA,EAAG,cAAA,IAAkB,KAAA;AACrD,QAAA,aAAA,EAAc;AAAA,MAChB,CAAA;AAAA,MACA,EAAE,YAAY,OAAA;AAAQ,KACxB;AACA,IAAA,EAAA,CAAG,QAAQ,EAAE,CAAA;AACb,IAAA,OAAO,MAAM;AACX,MAAA,EAAA,CAAG,UAAA,EAAW;AAAA,IAChB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,aAAa,CAAC,CAAA;AAI5B,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,UAAU,aAAA,EAAc;AAAA,EAC9B,CAAA,EAAG,CAAC,QAAA,EAAU,IAAA,CAAK,QAAQ,WAAA,EAAa,OAAA,EAAS,aAAa,CAAC,CAAA;AAE/D,EAAA,4BACG,KAAA,EAAA,EACE,QAAA,EAAA;AAAA,IAAA,OAAA,mBACC,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EACZ,QAAA,EAAA;AAAA,MAAA,UAAA,mBACC,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,WAAU,6FAAA,EAA8F,CAAA;AAAA,wBACpH,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,YAAA;AAAA,YACP,UAAU,CAAA,CAAA,KAAK,KAAA,CAAM,eAAA,CAAgB,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YACnD,WAAA,EAAa,iBAAA;AAAA,YACb,SAAA,EAAU;AAAA;AAAA;AACZ,OAAA,EACF,CAAA,GACE,IAAA;AAAA,MACH,QAAA,IAAY,OAAA,mBACX,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,iCAAA,EACZ,QAAA,EAAA;AAAA,QAAA,OAAA;AAAA,QACA,QAAA,mBACC,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAQ,SAAA;AAAA,YACR,IAAA,EAAK,SAAA;AAAA,YACL,OAAA,EAAS,QAAA;AAAA,YACT,QAAA,EAAU,OAAA;AAAA,YACV,YAAA,EAAY,WAAA;AAAA,YACZ,KAAA,EAAO,WAAA;AAAA,YAEP,8BAAC,aAAA,EAAA,EAAc,SAAA,EAAW,GAAG,QAAA,EAAU,OAAA,IAAW,cAAc,CAAA,EAAG;AAAA;AAAA,SACrE,GACE;AAAA,OAAA,EACN,CAAA,GACE;AAAA,KAAA,EACN,CAAA,GACE,IAAA;AAAA,yBACH,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,wBAAA,EAA0B,SAAS,CAAA,EACpD,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,WAAA,EAAA,EACE,QAAA,EAAA,KAAA,CAAM,eAAA,EAAgB,CAAE,IAAI,CAAA,EAAA,qBAC3B,GAAA,CAAC,QAAA,EAAA,EACE,QAAA,EAAA,EAAA,CAAG,OAAA,CAAQ,GAAA,CAAI,CAAA,MAAA,qBACd,GAAA,CAAC,aACE,QAAA,EAAA,MAAA,CAAO,aAAA,GAAgB,IAAA,GAAO,UAAA,CAAW,MAAA,CAAO,MAAA,CAAO,SAAA,CAAU,MAAA,EAAQ,OAAO,UAAA,EAAY,CAAA,EAAA,EAD5E,MAAA,CAAO,EAE1B,CACD,CAAA,EAAA,EALe,EAAA,CAAG,EAMrB,CACD,CAAA,EACH,CAAA;AAAA,wBACA,GAAA,CAAC,SAAA,EAAA,EACE,QAAA,EAAA,OAAA,IAAW,IAAA,CAAK,MAAA,KAAW,CAAA;AAAA;AAAA;AAAA,0BAG1B,GAAA,CAAC,QAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,SAAA,EAAA,EAAa,SAAA,EAAU,oBAAmB,OAAA,EAAS,OAAA,CAAQ,MAAA,EACzD,QAAA,EAAA,WAAA,EACH,CAAA,EACF;AAAA,YACE,IAAA,CAAK,MAAA,GACP,IAAA,CAAK,GAAA,CAAI,yBACP,GAAA,CAAC,QAAA,EAAA,EAAyB,YAAA,EAAY,GAAA,CAAI,eAAc,IAAK,UAAA,EAC1D,QAAA,EAAA,GAAA,CAAI,eAAA,GAAkB,GAAA,CAAI,CAAA,IAAA,qBACzB,GAAA,CAAC,SAAA,EAAA,EAA4B,QAAA,EAAA,UAAA,CAAW,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,MAAM,IAAA,CAAK,UAAA,EAAY,CAAA,EAAA,EAAlE,KAAK,EAA+D,CACxF,CAAA,EAAA,EAHe,GAAA,CAAI,EAItB,CACD,CAAA;AAAA;AAAA;AAAA;AAAA,0BAKD,GAAA,CAAC,QAAA,EAAA,EAAY,SAAA,EAAU,sBAAA,EACrB,QAAA,kBAAA,GAAA;AAAA,YAAC,SAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,QAAQ,KAAA,GAAQ,wCAAA;AAAA,cAC3B,SAAS,OAAA,CAAQ,MAAA;AAAA,cAEhB,QAAA,EAAA,KAAA,IAAS;AAAA;AAAA,WACZ,EACF;AAAA,SAAA,EAEJ;AAAA,OAAA,EACF,CAAA;AAAA,MACC,QAAA,IAAY,WAAA,mBACX,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2EAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,WAAA,EAAA,EAAY,WAAU,qBAAA,EAAsB,CAAA;AAAA,QAC5C;AAAA,OAAA,EACH,CAAA,GACE,IAAA;AAAA,MACH,QAAA,uBAAY,KAAA,EAAA,EAAI,GAAA,EAAK,aAAa,aAAA,EAAW,IAAA,EAAC,SAAA,EAAU,aAAA,EAAc,CAAA,GAAK;AAAA,KAAA,EAC9E,CAAA;AAAA,IACC,MAAA,mBACC,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wDAAA,EACb,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uDAAA,EACZ,QAAA,EAAA;AAAA,QAAA,UAAA;AAAA,QACA,eAAA,IAAmB,eAAA,CAAgB,MAAA,GAAS,CAAA,mBAC3C,GAAA;AAAA,UAAC,YAAA;AAAA,UAAA;AAAA,YACC,YAAA,EAAY,YAAY,IAAA,IAAQ,eAAA;AAAA,YAChC,SAAA,EAAU,YAAA;AAAA,YACV,KAAA,EAAO,OAAO,QAAQ,CAAA;AAAA,YACtB,UAAU,CAAA,CAAA,KAAK,gBAAA,GAAmB,OAAO,CAAA,CAAE,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,YAEvD,QAAA,EAAA,eAAA,CAAgB,GAAA,CAAI,CAAA,CAAA,qBACnB,GAAA,CAAC,kBAAA,EAAA,EAA2B,KAAA,EAAO,MAAA,CAAO,CAAC,CAAA,EACxC,QAAA,EAAA,CAAA,EAAA,EADsB,CAEzB,CACD;AAAA;AAAA,SACH,GACE;AAAA,OAAA,EACN,CAAA;AAAA,sBACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,SAAA;AAAA,YACR,IAAA,EAAK,IAAA;AAAA,YACL,YAAA,EAAY,YAAY,KAAA,IAAS,YAAA;AAAA,YACjC,OAAA,EAAS,MAAM,YAAA,GAAe,CAAC,CAAA;AAAA,YAC/B,UAAU,SAAA,IAAa,CAAA;AAAA,YACxB,QAAA,EAAA;AAAA;AAAA,SAED;AAAA,wBACA,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,SAAA;AAAA,YACR,IAAA,EAAK,IAAA;AAAA,YACL,YAAA,EAAY,YAAY,QAAA,IAAY,aAAA;AAAA,YACpC,OAAA,EAAS,MAAM,YAAA,GAAe,SAAA,GAAY,CAAC,CAAA;AAAA,YAC3C,UAAU,SAAA,IAAa,CAAA;AAAA,YACxB,QAAA,EAAA;AAAA;AAAA,SAED;AAAA,QACC,UAAA,CAAW,SAAA,EAAW,SAAS,CAAA,CAAE,GAAA;AAAA,UAAI,CAAC,CAAA,EAAG,CAAA,KACxC,CAAA,KAAM,IAAA,mBACJ,GAAA,CAAC,MAAA,EAAA,EAAqB,SAAA,EAAU,oCAAA,EAAqC,QAAA,EAAA,QAAA,EAAA,EAA1D,CAAA,GAAA,EAAM,CAAC,EAElB,CAAA,mBAEA,GAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cAEC,OAAA,EAAS,CAAA,KAAM,SAAA,GAAY,SAAA,GAAY,SAAA;AAAA,cACvC,IAAA,EAAK,IAAA;AAAA,cACL,cAAA,EAAc,CAAA,KAAM,SAAA,GAAY,MAAA,GAAS,MAAA;AAAA,cACzC,OAAA,EAAS,MAAM,YAAA,GAAe,CAAC,CAAA;AAAA,cAE9B,QAAA,EAAA,CAAA,GAAI;AAAA,aAAA;AAAA,YANA;AAAA;AAOP,SAEJ;AAAA,wBACA,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,SAAA;AAAA,YACR,IAAA,EAAK,IAAA;AAAA,YACL,YAAA,EAAY,YAAY,IAAA,IAAQ,SAAA;AAAA,YAChC,OAAA,EAAS,MAAM,YAAA,GAAe,SAAA,GAAY,CAAC,CAAA;AAAA,YAC3C,QAAA,EAAU,aAAa,SAAA,GAAY,CAAA;AAAA,YACpC,QAAA,EAAA;AAAA;AAAA,SAED;AAAA,wBACA,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,SAAA;AAAA,YACR,IAAA,EAAK,IAAA;AAAA,YACL,YAAA,EAAY,YAAY,IAAA,IAAQ,WAAA;AAAA,YAChC,OAAA,EAAS,MAAM,YAAA,GAAe,SAAA,GAAY,CAAC,CAAA;AAAA,YAC3C,QAAA,EAAU,aAAa,SAAA,GAAY,CAAA;AAAA,YACpC,QAAA,EAAA;AAAA;AAAA;AAED,OAAA,EACF;AAAA,KAAA,EACF,CAAA,GACE,IAAA;AAAA,IACH,CAAC,QAAA,IAAY,CAAC,MAAA,IAAU,KAAA,CAAM,YAAA,EAAa,GAAI,CAAA,mBAC9C,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0CAAA,EACb,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,MAAA,EAAA,EAAO,OAAA,EAAQ,SAAA,EAAU,IAAA,EAAK,MAAK,OAAA,EAAS,MAAM,KAAA,CAAM,YAAA,IAAgB,QAAA,EAAU,CAAC,KAAA,CAAM,kBAAA,IACvF,QAAA,EAAA,aAAA,EACH,CAAA;AAAA,0BACC,MAAA,EAAA,EAAO,OAAA,EAAQ,SAAA,EAAU,IAAA,EAAK,MAAK,OAAA,EAAS,MAAM,KAAA,CAAM,QAAA,IAAY,QAAA,EAAU,CAAC,KAAA,CAAM,cAAA,IACnF,QAAA,EAAA,SAAA,EACH;AAAA,KAAA,EACF,CAAA,GACE;AAAA,GAAA,EACN,CAAA;AAEJ","file":"index.js","sourcesContent":["import type { Cell, Column, ColumnDef, Header, HeaderGroup, Row, SortingState, Table } from \"@tanstack/react-table\"\nimport { flexRender, getCoreRowModel, getFilteredRowModel, getPaginationRowModel, getSortedRowModel, useReactTable } from \"@tanstack/react-table\"\nimport { ArrowDownIcon, ArrowUpIcon, ChevronsUpDownIcon, Loader2Icon, RefreshCwIcon, SearchIcon } from \"lucide-react\"\nimport type { HTMLAttributes, ReactNode } from \"react\"\nimport { createContext, memo, useCallback, useContext, useEffect, useRef, useState } from \"react\"\nimport { Button } from \"~/ui/primitives/button.js\"\nimport { Input } from \"~/ui/primitives/input.js\"\nimport { NativeSelect, NativeSelectOption } from \"~/ui/primitives/native-select.js\"\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from \"~/ui/primitives/dropdown-menu.js\"\nimport {\n TableBody as TableBodyRaw,\n TableCell as TableCellRaw,\n TableHeader as TableHeaderRaw,\n TableHead as TableHeadRaw,\n Table as TableRaw,\n TableRow as TableRowRaw,\n} from \"~/ui/primitives/table.js\"\nimport { cn } from \"~/utils/cn.js\"\n\nexport type { ColumnDef } from \"@tanstack/react-table\"\n\n\nexport const TableContext = createContext<{\n data: unknown[]\n columns: ColumnDef<unknown, unknown>[]\n table: Table<unknown> | null\n}>({\n data: [],\n columns: [],\n table: null,\n})\n\nexport type TableProviderProps<TData, TValue> = {\n columns: ColumnDef<TData, TValue>[]\n data: TData[]\n children: ReactNode\n className?: string\n}\n\nexport function TableProvider<TData, TValue>({ columns, data, children, className }: TableProviderProps<TData, TValue>) {\n const [sorting, setSorting] = useState<SortingState>([])\n const table = useReactTable({\n data,\n columns,\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: getSortedRowModel(),\n // useState's setter is itself a valid TanStack OnChangeFn (it accepts a\n // value or an updater fn), so it can be wired directly — type-safe, no cast.\n onSortingChange: setSorting,\n state: {\n sorting,\n },\n })\n\n return (\n <TableContext.Provider\n value={{\n data,\n columns: columns as never,\n table: table as never,\n }}\n >\n <TableRaw className={className}>{children}</TableRaw>\n </TableContext.Provider>\n )\n}\n\nexport type TableHeadProps = {\n header: Header<unknown, unknown>\n className?: string\n}\n\nexport const TableHead = memo(({ header, className }: TableHeadProps) => (\n <TableHeadRaw className={className} key={header.id}>\n {header.isPlaceholder ? null : flexRender(header.column.columnDef.header, header.getContext())}\n </TableHeadRaw>\n))\n\nTableHead.displayName = \"TableHead\"\n\nexport type TableHeaderGroupProps = {\n headerGroup: HeaderGroup<unknown>\n children: (props: { header: Header<unknown, unknown> }) => ReactNode\n}\n\nexport const TableHeaderGroup = ({ headerGroup, children }: TableHeaderGroupProps) => (\n <TableRowRaw key={headerGroup.id}>{headerGroup.headers.map(header => children({ header }))}</TableRowRaw>\n)\n\nexport type TableHeaderProps = {\n className?: string\n children: (props: { headerGroup: HeaderGroup<unknown> }) => ReactNode\n}\n\nexport const TableHeader = ({ className, children }: TableHeaderProps) => {\n const { table } = useContext(TableContext)\n\n return <TableHeaderRaw className={className}>{table?.getHeaderGroups().map(headerGroup => children({ headerGroup }))}</TableHeaderRaw>\n}\n\nexport interface TableColumnHeaderProps<TData, TValue> extends HTMLAttributes<HTMLDivElement> {\n column: Column<TData, TValue>\n title: string\n}\n\nexport function TableColumnHeader<TData, TValue>({ column, title, className }: TableColumnHeaderProps<TData, TValue>) {\n // Extract inline event handlers to prevent unnecessary re-renders\n const handleSortAsc = useCallback(() => {\n column.toggleSorting(false)\n }, [column])\n\n const handleSortDesc = useCallback(() => {\n column.toggleSorting(true)\n }, [column])\n\n if (!column.getCanSort()) {\n return <div className={cn(className)}>{title}</div>\n }\n\n return (\n <div className={cn(\"flex items-center space-x-2\", className)}>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button className=\"-ml-3 h-8 data-[state=open]:bg-accent\" size=\"sm\" variant=\"ghost\">\n <span>{title}</span>\n {column.getIsSorted() === \"desc\" ? (\n <ArrowDownIcon className=\"ml-2 h-4 w-4\" />\n ) : column.getIsSorted() === \"asc\" ? (\n <ArrowUpIcon className=\"ml-2 h-4 w-4\" />\n ) : (\n <ChevronsUpDownIcon className=\"ml-2 h-4 w-4\" />\n )}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\">\n <DropdownMenuItem onClick={handleSortAsc}>\n <ArrowUpIcon className=\"mr-2 h-3.5 w-3.5 text-muted-foreground/70\" />\n Asc\n </DropdownMenuItem>\n <DropdownMenuItem onClick={handleSortDesc}>\n <ArrowDownIcon className=\"mr-2 h-3.5 w-3.5 text-muted-foreground/70\" />\n Desc\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n )\n}\n\nexport type TableCellProps = {\n cell: Cell<unknown, unknown>\n className?: string\n}\n\nexport const TableCell = ({ cell, className }: TableCellProps) => (\n <TableCellRaw className={className}>{flexRender(cell.column.columnDef.cell, cell.getContext())}</TableCellRaw>\n)\n\nexport type TableRowProps = {\n row: Row<unknown>\n children: (props: { cell: Cell<unknown, unknown> }) => ReactNode\n className?: string\n}\n\nexport const TableRow = ({ row, children, className }: TableRowProps) => (\n <TableRowRaw className={className} data-state={row.getIsSelected() && \"selected\"} key={row.id}>\n {row.getVisibleCells().map(cell => children({ cell }))}\n </TableRowRaw>\n)\n\nexport type TableBodyProps = {\n children: (props: { row: Row<unknown> }) => ReactNode\n className?: string\n}\n\nexport const TableBody = ({ children, className }: TableBodyProps) => {\n const { columns, table } = useContext(TableContext)\n const rows = table?.getRowModel().rows\n\n return (\n <TableBodyRaw className={className}>\n {rows?.length ? (\n rows.map(row => children({ row }))\n ) : (\n <TableRowRaw>\n <TableCellRaw className=\"h-24 text-center\" colSpan={columns.length}>\n No results.\n </TableCellRaw>\n </TableRowRaw>\n )}\n </TableBodyRaw>\n )\n}\n\n// ---------------------------------------------------------------------------\n// DataTable — a batteries-included, self-contained paginated table. Unlike the\n// composition primitives above (TableProvider + render-prop parts), this is a\n// drop-in: pass `columns` + `data` and get header, body, empty/loading states\n// and Prev/Next pagination. All user-facing labels are props (English\n// defaults) so apps can feed i18n strings; the component itself ships no copy.\n// ---------------------------------------------------------------------------\n\nexport interface DataTableProps<TData, TValue> {\n columns: ColumnDef<TData, TValue>[]\n data: TData[]\n /** Show a single-row loading state instead of the body. */\n loading?: boolean\n /** Row shown when there are no results. */\n emptyText?: string\n /**\n * What fills the body when there are no results, in place of `emptyText`.\n *\n * A centred grey line reads the same as a request that failed, and on a table it is the only\n * thing a reader has to tell \"nobody matched your filter\" from \"this screen is broken\". Takes\n * `EmptyState` from `@tradalab/lyra/ui`, or anything else. `emptyText` stays because most tables\n * want one sentence and nothing more.\n */\n empty?: ReactNode\n /** Row shown while `loading`. */\n loadingText?: string\n /** Previous-page button label. */\n previousLabel?: string\n /** Next-page button label. */\n nextLabel?: string\n /** Rows per page (default 10). Pagination controls appear only when needed. */\n pageSize?: number\n /** Extra classes on the bordered table wrapper. */\n className?: string\n // --- control bar (all optional; the bar renders only when one is set) ---\n /** Show a search box that globally filters rows across all accessor columns. */\n searchable?: boolean\n /** Placeholder for the search box. */\n searchPlaceholder?: string\n /** Show a reload button; called on click. Its icon spins while `loading`. */\n onReload?: () => void\n /** Accessible label / tooltip for the reload button. */\n reloadLabel?: string\n /** Custom controls rendered on the right of the bar (e.g. a \"New\" button). */\n toolbar?: ReactNode\n // --- infinite scroll (opt-in; providing `onLoadMore` switches the table from\n // Prev/Next pagination to rendering every accumulated row and requesting more\n // as a bottom sentinel scrolls into view). Data fetching stays with the caller\n // (e.g. react-query useInfiniteQuery); the table only owns the sentinel. ---\n /** Called when the bottom sentinel becomes visible and more rows can load. */\n onLoadMore?: () => void\n /** Whether another page is available; the sentinel is ignored once false. */\n hasMore?: boolean\n /** True while the next page is loading — shows a spinner row and de-dupes calls. */\n loadingMore?: boolean\n /** Label beside the bottom spinner. */\n loadingMoreText?: string\n // --- server-driven pages (opt-in; providing `onPageChange` switches the table from\n // slicing rows itself to showing exactly the page it was handed, plus a numbered pager).\n //\n // For the screens that get AUDITED rather than skimmed: a timesheet, a punch log at year\n // end. Infinite scroll cannot say \"page 3 of 47\", cannot be sent to a colleague, and cannot\n // reach the end of a long list without dragging through all of it.\n //\n // `onLoadMore` wins if both are given - a table with two pagers is a bug that ships. ---\n /** Zero-based index of the page being shown. */\n pageIndex?: number\n /** How many pages exist. The table cannot work this out: only the server knows the total. */\n pageCount?: number\n /** Called with a zero-based page index. */\n onPageChange?: (index: number) => void\n /** Sizes offered in the selector. Omit to leave the size fixed and hide the control. */\n pageSizeOptions?: number[]\n /** Called with the chosen size. The caller is expected to return to page 1. */\n onPageSizeChange?: (size: number) => void\n /** Free text beside the pager, e.g. \"1-50 of 4,231\". lyra ships no copy and no number\n * formatting, so the caller builds it. */\n rangeLabel?: ReactNode\n /** Accessible labels for the pager buttons. */\n pageLabels?: { first?: string; previous?: string; next?: string; last?: string; size?: string }\n}\n\n/**\n * Which page numbers to show: always the first, the last, and a couple either side of the\n * current one, with `null` where a gap is elided.\n *\n * A pager that renders every page is unusable at forty pages and absurd at four hundred, and\n * one that renders only prev/next hides how long the list is - which is the question the\n * reader opened it with.\n */\nexport function pageWindow(index: number, count: number, radius = 1): (number | null)[] {\n if (count <= 0) return []\n const want = new Set<number>([0, count - 1])\n for (let p = index - radius; p <= index + radius; p++) {\n if (p >= 0 && p < count) want.add(p)\n }\n const sorted = [...want].sort((a, b) => a - b)\n const out: (number | null)[] = []\n let prev = -1\n for (const p of sorted) {\n // A single skipped page is rendered rather than elided: \"1 … 3\" is longer than \"1 2 3\"\n // and tells the reader less.\n if (prev >= 0 && p - prev === 2) out.push(p - 1)\n else if (prev >= 0 && p - prev > 2) out.push(null)\n out.push(p)\n prev = p\n }\n return out\n}\n\nexport function DataTable<TData, TValue>({\n columns,\n data,\n loading,\n emptyText = \"No results.\",\n empty,\n loadingText = \"Loading…\",\n previousLabel = \"Previous\",\n nextLabel = \"Next\",\n pageSize = 10,\n className,\n searchable,\n searchPlaceholder = \"Search…\",\n onReload,\n reloadLabel = \"Reload\",\n toolbar,\n onLoadMore,\n hasMore,\n loadingMore,\n loadingMoreText = \"Loading more…\",\n pageIndex = 0,\n pageCount = 0,\n onPageChange,\n pageSizeOptions,\n onPageSizeChange,\n rangeLabel,\n pageLabels,\n}: DataTableProps<TData, TValue>) {\n const [globalFilter, setGlobalFilter] = useState(\"\")\n const infinite = Boolean(onLoadMore)\n // Server pages: the rows handed in ARE the page, so the table must not slice them again.\n const served = !infinite && Boolean(onPageChange)\n const table = useReactTable({\n data,\n columns,\n state: { globalFilter },\n onGlobalFilterChange: setGlobalFilter,\n getCoreRowModel: getCoreRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n // Infinite mode renders every accumulated row; pagination is only wired for\n // the default finite table.\n ...(infinite || served\n ? {}\n : { getPaginationRowModel: getPaginationRowModel(), initialState: { pagination: { pageSize } } }),\n })\n\n const rows = table.getRowModel().rows\n const showBar = Boolean(searchable || onReload || toolbar)\n\n // --- infinite scroll: observe a bottom sentinel and ask the caller for more.\n // Latest callback/flags are kept in refs so the observer subscribes once. ---\n const sentinelRef = useRef<HTMLDivElement | null>(null)\n const onLoadMoreRef = useRef(onLoadMore)\n onLoadMoreRef.current = onLoadMore\n const flags = useRef({ hasMore, loadingMore })\n flags.current = { hasMore, loadingMore }\n const intersecting = useRef(false)\n\n const maybeLoadMore = useCallback(() => {\n if (intersecting.current && flags.current.hasMore && !flags.current.loadingMore) {\n onLoadMoreRef.current?.()\n }\n }, [])\n\n useEffect(() => {\n if (!infinite) return\n const el = sentinelRef.current\n if (!el) return\n const io = new IntersectionObserver(\n entries => {\n intersecting.current = entries[0]?.isIntersecting ?? false\n maybeLoadMore()\n },\n { rootMargin: \"200px\" },\n )\n io.observe(el)\n return () => {\n io.disconnect()\n }\n }, [infinite, maybeLoadMore])\n\n // A freshly loaded page can leave the sentinel still on-screen; the observer\n // won't re-fire on its own, so re-check whenever the rows or flags change.\n useEffect(() => {\n if (infinite) maybeLoadMore()\n }, [infinite, rows.length, loadingMore, hasMore, maybeLoadMore])\n\n return (\n <div>\n {showBar ? (\n <div className=\"flex items-center gap-2 pb-4\">\n {searchable ? (\n <div className=\"relative w-full max-w-xs\">\n <SearchIcon className=\"text-muted-foreground pointer-events-none absolute top-1/2 left-2.5 size-4 -translate-y-1/2\" />\n <Input\n value={globalFilter}\n onChange={e => table.setGlobalFilter(e.target.value)}\n placeholder={searchPlaceholder}\n className=\"pl-8\"\n />\n </div>\n ) : null}\n {onReload || toolbar ? (\n <div className=\"ml-auto flex items-center gap-2\">\n {toolbar}\n {onReload ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon-sm\"\n onClick={onReload}\n disabled={loading}\n aria-label={reloadLabel}\n title={reloadLabel}\n >\n <RefreshCwIcon className={cn(\"size-4\", loading && \"animate-spin\")} />\n </Button>\n ) : null}\n </div>\n ) : null}\n </div>\n ) : null}\n <div className={cn(\"overflow-hidden border\", className)}>\n <TableRaw>\n <TableHeaderRaw>\n {table.getHeaderGroups().map(hg => (\n <TableRowRaw key={hg.id}>\n {hg.headers.map(header => (\n <TableHeadRaw key={header.id}>\n {header.isPlaceholder ? null : flexRender(header.column.columnDef.header, header.getContext())}\n </TableHeadRaw>\n ))}\n </TableRowRaw>\n ))}\n </TableHeaderRaw>\n <TableBodyRaw>\n {loading && rows.length === 0 ? (\n // Only replace the body with a loading row on the FIRST load; on a\n // refetch keep the (stale) rows visible while the reload icon spins.\n <TableRowRaw>\n <TableCellRaw className=\"h-24 text-center\" colSpan={columns.length}>\n {loadingText}\n </TableCellRaw>\n </TableRowRaw>\n ) : rows.length ? (\n rows.map(row => (\n <TableRowRaw key={row.id} data-state={row.getIsSelected() && \"selected\"}>\n {row.getVisibleCells().map(cell => (\n <TableCellRaw key={cell.id}>{flexRender(cell.column.columnDef.cell, cell.getContext())}</TableCellRaw>\n ))}\n </TableRowRaw>\n ))\n ) : (\n // An empty state is not a record, so the row drops the `hover:bg-muted/50` every\n // other row carries: lighting up under the pointer offers an interaction that is not\n // there, and it gets louder the taller the cell grows.\n <TableRowRaw className=\"hover:bg-transparent\">\n <TableCellRaw\n className={empty ? \"p-0\" : \"text-muted-foreground h-24 text-center\"}\n colSpan={columns.length}\n >\n {empty ?? emptyText}\n </TableCellRaw>\n </TableRowRaw>\n )}\n </TableBodyRaw>\n </TableRaw>\n {infinite && loadingMore ? (\n <div className=\"text-muted-foreground flex items-center justify-center gap-2 py-3 text-sm\">\n <Loader2Icon className=\"size-4 animate-spin\" />\n {loadingMoreText}\n </div>\n ) : null}\n {infinite ? <div ref={sentinelRef} aria-hidden className=\"h-px w-full\" /> : null}\n </div>\n {served ? (\n <div className=\"flex flex-wrap items-center justify-between gap-3 py-4\">\n <div className=\"text-muted-foreground flex items-center gap-3 text-sm\">\n {rangeLabel}\n {pageSizeOptions && pageSizeOptions.length > 0 ? (\n <NativeSelect\n aria-label={pageLabels?.size ?? \"Rows per page\"}\n className=\"h-8 w-auto\"\n value={String(pageSize)}\n onChange={e => onPageSizeChange?.(Number(e.target.value))}\n >\n {pageSizeOptions.map(n => (\n <NativeSelectOption key={n} value={String(n)}>\n {n}\n </NativeSelectOption>\n ))}\n </NativeSelect>\n ) : null}\n </div>\n <div className=\"flex items-center gap-1\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n aria-label={pageLabels?.first ?? \"First page\"}\n onClick={() => onPageChange?.(0)}\n disabled={pageIndex <= 0}\n >\n «\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n aria-label={pageLabels?.previous ?? previousLabel}\n onClick={() => onPageChange?.(pageIndex - 1)}\n disabled={pageIndex <= 0}\n >\n ‹\n </Button>\n {pageWindow(pageIndex, pageCount).map((p, i) =>\n p === null ? (\n <span key={`gap${i}`} className=\"text-muted-foreground px-1 text-sm\">\n …\n </span>\n ) : (\n <Button\n key={p}\n variant={p === pageIndex ? \"default\" : \"outline\"}\n size=\"sm\"\n aria-current={p === pageIndex ? \"page\" : undefined}\n onClick={() => onPageChange?.(p)}\n >\n {p + 1}\n </Button>\n ),\n )}\n <Button\n variant=\"outline\"\n size=\"sm\"\n aria-label={pageLabels?.next ?? nextLabel}\n onClick={() => onPageChange?.(pageIndex + 1)}\n disabled={pageIndex >= pageCount - 1}\n >\n ›\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n aria-label={pageLabels?.last ?? \"Last page\"}\n onClick={() => onPageChange?.(pageCount - 1)}\n disabled={pageIndex >= pageCount - 1}\n >\n »\n </Button>\n </div>\n </div>\n ) : null}\n {!infinite && !served && table.getPageCount() > 1 ? (\n <div className=\"flex items-center justify-end gap-2 py-4\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => table.previousPage()} disabled={!table.getCanPreviousPage()}>\n {previousLabel}\n </Button>\n <Button variant=\"outline\" size=\"sm\" onClick={() => table.nextPage()} disabled={!table.getCanNextPage()}>\n {nextLabel}\n </Button>\n </div>\n ) : null}\n </div>\n )\n}\n"]}
1
+ {"version":3,"sources":["../../src/data-table/index.tsx"],"names":["TableHead","TableHeader","TableCell","TableRow","TableBody"],"mappings":"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","file":"index.js","sourcesContent":["import type { Cell, Column, ColumnDef, Header, HeaderGroup, Row, SortingState, Table } from \"@tanstack/react-table\"\nimport { flexRender, getCoreRowModel, getFilteredRowModel, getPaginationRowModel, getSortedRowModel, useReactTable } from \"@tanstack/react-table\"\nimport { ArrowDownIcon, ArrowUpIcon, ChevronsUpDownIcon, Loader2Icon, RefreshCwIcon, SearchIcon } from \"lucide-react\"\nimport type { HTMLAttributes, ReactNode } from \"react\"\nimport { createContext, memo, useCallback, useContext, useEffect, useRef, useState } from \"react\"\nimport { Button } from \"~/ui/primitives/button.js\"\nimport { Input } from \"~/ui/primitives/input.js\"\nimport { NativeSelect, NativeSelectOption } from \"~/ui/primitives/native-select.js\"\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from \"~/ui/primitives/dropdown-menu.js\"\nimport {\n TableBody as TableBodyRaw,\n TableCell as TableCellRaw,\n TableHeader as TableHeaderRaw,\n TableHead as TableHeadRaw,\n Table as TableRaw,\n TableRow as TableRowRaw,\n} from \"~/ui/primitives/table.js\"\nimport { cn } from \"~/utils/cn.js\"\n\nexport type { ColumnDef } from \"@tanstack/react-table\"\n\n\nexport const TableContext = createContext<{\n data: unknown[]\n columns: ColumnDef<unknown, unknown>[]\n table: Table<unknown> | null\n}>({\n data: [],\n columns: [],\n table: null,\n})\n\nexport type TableProviderProps<TData, TValue> = {\n columns: ColumnDef<TData, TValue>[]\n data: TData[]\n children: ReactNode\n className?: string\n}\n\nexport function TableProvider<TData, TValue>({ columns, data, children, className }: TableProviderProps<TData, TValue>) {\n const [sorting, setSorting] = useState<SortingState>([])\n const table = useReactTable({\n data,\n columns,\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: getSortedRowModel(),\n // useState's setter is itself a valid TanStack OnChangeFn (it accepts a\n // value or an updater fn), so it can be wired directly — type-safe, no cast.\n onSortingChange: setSorting,\n state: {\n sorting,\n },\n })\n\n return (\n <TableContext.Provider\n value={{\n data,\n columns: columns as never,\n table: table as never,\n }}\n >\n <TableRaw className={className}>{children}</TableRaw>\n </TableContext.Provider>\n )\n}\n\nexport type TableHeadProps = {\n header: Header<unknown, unknown>\n className?: string\n}\n\nexport const TableHead = memo(({ header, className }: TableHeadProps) => (\n <TableHeadRaw className={className} key={header.id}>\n {header.isPlaceholder ? null : flexRender(header.column.columnDef.header, header.getContext())}\n </TableHeadRaw>\n))\n\nTableHead.displayName = \"TableHead\"\n\nexport type TableHeaderGroupProps = {\n headerGroup: HeaderGroup<unknown>\n children: (props: { header: Header<unknown, unknown> }) => ReactNode\n}\n\nexport const TableHeaderGroup = ({ headerGroup, children }: TableHeaderGroupProps) => (\n <TableRowRaw key={headerGroup.id}>{headerGroup.headers.map(header => children({ header }))}</TableRowRaw>\n)\n\nexport type TableHeaderProps = {\n className?: string\n children: (props: { headerGroup: HeaderGroup<unknown> }) => ReactNode\n}\n\nexport const TableHeader = ({ className, children }: TableHeaderProps) => {\n const { table } = useContext(TableContext)\n\n return <TableHeaderRaw className={className}>{table?.getHeaderGroups().map(headerGroup => children({ headerGroup }))}</TableHeaderRaw>\n}\n\nexport interface TableColumnHeaderProps<TData, TValue> extends HTMLAttributes<HTMLDivElement> {\n column: Column<TData, TValue>\n title: string\n}\n\nexport function TableColumnHeader<TData, TValue>({ column, title, className }: TableColumnHeaderProps<TData, TValue>) {\n // Extract inline event handlers to prevent unnecessary re-renders\n const handleSortAsc = useCallback(() => {\n column.toggleSorting(false)\n }, [column])\n\n const handleSortDesc = useCallback(() => {\n column.toggleSorting(true)\n }, [column])\n\n if (!column.getCanSort()) {\n return <div className={cn(className)}>{title}</div>\n }\n\n return (\n <div className={cn(\"flex items-center space-x-2\", className)}>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button className=\"-ml-3 h-8 data-[state=open]:bg-accent\" size=\"sm\" variant=\"ghost\">\n <span>{title}</span>\n {column.getIsSorted() === \"desc\" ? (\n <ArrowDownIcon className=\"ml-2 h-4 w-4\" />\n ) : column.getIsSorted() === \"asc\" ? (\n <ArrowUpIcon className=\"ml-2 h-4 w-4\" />\n ) : (\n <ChevronsUpDownIcon className=\"ml-2 h-4 w-4\" />\n )}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\">\n <DropdownMenuItem onClick={handleSortAsc}>\n <ArrowUpIcon className=\"mr-2 h-3.5 w-3.5 text-muted-foreground/70\" />\n Asc\n </DropdownMenuItem>\n <DropdownMenuItem onClick={handleSortDesc}>\n <ArrowDownIcon className=\"mr-2 h-3.5 w-3.5 text-muted-foreground/70\" />\n Desc\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n )\n}\n\nexport type TableCellProps = {\n cell: Cell<unknown, unknown>\n className?: string\n}\n\nexport const TableCell = ({ cell, className }: TableCellProps) => (\n <TableCellRaw className={className}>{flexRender(cell.column.columnDef.cell, cell.getContext())}</TableCellRaw>\n)\n\nexport type TableRowProps = {\n row: Row<unknown>\n children: (props: { cell: Cell<unknown, unknown> }) => ReactNode\n className?: string\n}\n\nexport const TableRow = ({ row, children, className }: TableRowProps) => (\n <TableRowRaw className={className} data-state={row.getIsSelected() && \"selected\"} key={row.id}>\n {row.getVisibleCells().map(cell => children({ cell }))}\n </TableRowRaw>\n)\n\nexport type TableBodyProps = {\n children: (props: { row: Row<unknown> }) => ReactNode\n className?: string\n}\n\nexport const TableBody = ({ children, className }: TableBodyProps) => {\n const { columns, table } = useContext(TableContext)\n const rows = table?.getRowModel().rows\n\n return (\n <TableBodyRaw className={className}>\n {rows?.length ? (\n rows.map(row => children({ row }))\n ) : (\n <TableRowRaw>\n <TableCellRaw className=\"h-24 text-center\" colSpan={columns.length}>\n No results.\n </TableCellRaw>\n </TableRowRaw>\n )}\n </TableBodyRaw>\n )\n}\n\n// ---------------------------------------------------------------------------\n// DataTable — a batteries-included, self-contained paginated table. Unlike the\n// composition primitives above (TableProvider + render-prop parts), this is a\n// drop-in: pass `columns` + `data` and get header, body, empty/loading states\n// and Prev/Next pagination. All user-facing labels are props (English\n// defaults) so apps can feed i18n strings; the component itself ships no copy.\n// ---------------------------------------------------------------------------\n\nexport interface DataTableProps<TData, TValue> {\n columns: ColumnDef<TData, TValue>[]\n data: TData[]\n /** Show a single-row loading state instead of the body. */\n loading?: boolean\n /** Row shown when there are no results. */\n emptyText?: string\n /**\n * What fills the body when there are no results, in place of `emptyText`.\n *\n * A centred grey line reads the same as a request that failed, and on a table it is the only\n * thing a reader has to tell \"nobody matched your filter\" from \"this screen is broken\". Takes\n * `EmptyState` from `@tradalab/lyra/ui`, or anything else. `emptyText` stays because most tables\n * want one sentence and nothing more.\n */\n empty?: ReactNode\n /** Row shown while `loading`. */\n loadingText?: string\n /** Previous-page button label. */\n previousLabel?: string\n /** Next-page button label. */\n nextLabel?: string\n /** Rows per page (default 10). Pagination controls appear only when needed. */\n pageSize?: number\n /** Extra classes on the bordered table wrapper. */\n className?: string\n // --- control bar (all optional; the bar renders only when one is set) ---\n /** Show a search box that globally filters rows across all accessor columns. */\n searchable?: boolean\n /** Placeholder for the search box. */\n searchPlaceholder?: string\n /** Show a reload button; called on click. Its icon spins while `loading`. */\n onReload?: () => void\n /** Accessible label / tooltip for the reload button. */\n reloadLabel?: string\n /** Custom controls rendered on the right of the bar (e.g. a \"New\" button). */\n toolbar?: ReactNode\n // --- infinite scroll (opt-in; providing `onLoadMore` switches the table from\n // Prev/Next pagination to rendering every accumulated row and requesting more\n // as a bottom sentinel scrolls into view). Data fetching stays with the caller\n // (e.g. react-query useInfiniteQuery); the table only owns the sentinel. ---\n /** Called when the bottom sentinel becomes visible and more rows can load. */\n onLoadMore?: () => void\n /** Whether another page is available; the sentinel is ignored once false. */\n hasMore?: boolean\n /** True while the next page is loading — shows a spinner row and de-dupes calls. */\n loadingMore?: boolean\n /** Label beside the bottom spinner. */\n loadingMoreText?: string\n // --- server-driven pages (opt-in; providing `onPageChange` switches the table from\n // slicing rows itself to showing exactly the page it was handed, plus a numbered pager).\n //\n // For the screens that get AUDITED rather than skimmed: a timesheet, a punch log at year\n // end. Infinite scroll cannot say \"page 3 of 47\", cannot be sent to a colleague, and cannot\n // reach the end of a long list without dragging through all of it.\n //\n // `onLoadMore` wins if both are given - a table with two pagers is a bug that ships. ---\n /** Zero-based index of the page being shown. */\n pageIndex?: number\n /** How many pages exist. The table cannot work this out: only the server knows the total. */\n pageCount?: number\n /** Called with a zero-based page index. */\n onPageChange?: (index: number) => void\n /** Sizes offered in the selector. Omit to leave the size fixed and hide the control. */\n pageSizeOptions?: number[]\n /** Called with the chosen size. The caller is expected to return to page 1. */\n onPageSizeChange?: (size: number) => void\n /** Free text beside the pager, e.g. \"1-50 of 4,231\". lyra ships no copy and no number\n * formatting, so the caller builds it. */\n rangeLabel?: ReactNode\n /** Accessible labels for the pager buttons. */\n pageLabels?: { first?: string; previous?: string; next?: string; last?: string; size?: string }\n}\n\n/**\n * Which page numbers to show: always the first, the last, and a couple either side of the\n * current one, with `null` where a gap is elided.\n *\n * A pager that renders every page is unusable at forty pages and absurd at four hundred, and\n * one that renders only prev/next hides how long the list is - which is the question the\n * reader opened it with.\n */\nexport function pageWindow(index: number, count: number, radius = 1): (number | null)[] {\n if (count <= 0) return []\n const want = new Set<number>([0, count - 1])\n for (let p = index - radius; p <= index + radius; p++) {\n if (p >= 0 && p < count) want.add(p)\n }\n const sorted = [...want].sort((a, b) => a - b)\n const out: (number | null)[] = []\n let prev = -1\n for (const p of sorted) {\n // A single skipped page is rendered rather than elided: \"1 … 3\" is longer than \"1 2 3\"\n // and tells the reader less.\n if (prev >= 0 && p - prev === 2) out.push(p - 1)\n else if (prev >= 0 && p - prev > 2) out.push(null)\n out.push(p)\n prev = p\n }\n return out\n}\n\nexport function DataTable<TData, TValue>({\n columns,\n data,\n loading,\n emptyText = \"No results.\",\n empty,\n loadingText = \"Loading…\",\n previousLabel = \"Previous\",\n nextLabel = \"Next\",\n pageSize = 10,\n className,\n searchable,\n searchPlaceholder = \"Search…\",\n onReload,\n reloadLabel = \"Reload\",\n toolbar,\n onLoadMore,\n hasMore,\n loadingMore,\n loadingMoreText = \"Loading more…\",\n pageIndex = 0,\n pageCount = 0,\n onPageChange,\n pageSizeOptions,\n onPageSizeChange,\n rangeLabel,\n pageLabels,\n}: DataTableProps<TData, TValue>) {\n const [globalFilter, setGlobalFilter] = useState(\"\")\n const infinite = Boolean(onLoadMore)\n // Server pages: the rows handed in ARE the page, so the table must not slice them again.\n const served = !infinite && Boolean(onPageChange)\n const table = useReactTable({\n data,\n columns,\n state: { globalFilter },\n onGlobalFilterChange: setGlobalFilter,\n getCoreRowModel: getCoreRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n // Infinite mode renders every accumulated row; pagination is only wired for\n // the default finite table.\n ...(infinite || served\n ? {}\n : { getPaginationRowModel: getPaginationRowModel(), initialState: { pagination: { pageSize } } }),\n })\n\n const rows = table.getRowModel().rows\n const showBar = Boolean(searchable || onReload || toolbar)\n\n // --- infinite scroll: observe a bottom sentinel and ask the caller for more.\n // Latest callback/flags are kept in refs so the observer subscribes once. ---\n const sentinelRef = useRef<HTMLDivElement | null>(null)\n const onLoadMoreRef = useRef(onLoadMore)\n onLoadMoreRef.current = onLoadMore\n const flags = useRef({ hasMore, loadingMore })\n flags.current = { hasMore, loadingMore }\n const intersecting = useRef(false)\n\n const maybeLoadMore = useCallback(() => {\n if (intersecting.current && flags.current.hasMore && !flags.current.loadingMore) {\n onLoadMoreRef.current?.()\n }\n }, [])\n\n useEffect(() => {\n if (!infinite) return\n const el = sentinelRef.current\n if (!el) return\n const io = new IntersectionObserver(\n entries => {\n intersecting.current = entries[0]?.isIntersecting ?? false\n maybeLoadMore()\n },\n { rootMargin: \"200px\" },\n )\n io.observe(el)\n return () => {\n io.disconnect()\n }\n }, [infinite, maybeLoadMore])\n\n // A freshly loaded page can leave the sentinel still on-screen; the observer\n // won't re-fire on its own, so re-check whenever the rows or flags change.\n useEffect(() => {\n if (infinite) maybeLoadMore()\n }, [infinite, rows.length, loadingMore, hasMore, maybeLoadMore])\n\n return (\n <div>\n {showBar ? (\n <div className=\"flex items-center gap-2 pb-4\">\n {searchable ? (\n <div className=\"relative w-full max-w-xs\">\n <SearchIcon className=\"text-muted-foreground pointer-events-none absolute top-1/2 left-2.5 size-4 -translate-y-1/2\" />\n <Input\n value={globalFilter}\n onChange={e => table.setGlobalFilter(e.target.value)}\n placeholder={searchPlaceholder}\n className=\"pl-8\"\n />\n </div>\n ) : null}\n {onReload || toolbar ? (\n <div className=\"ml-auto flex items-center gap-2\">\n {toolbar}\n {onReload ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon-sm\"\n onClick={onReload}\n disabled={loading}\n aria-label={reloadLabel}\n title={reloadLabel}\n >\n <RefreshCwIcon className={cn(\"size-4\", loading && \"animate-spin\")} />\n </Button>\n ) : null}\n </div>\n ) : null}\n </div>\n ) : null}\n <div className={cn(\"overflow-hidden border\", className)}>\n <TableRaw>\n <TableHeaderRaw>\n {table.getHeaderGroups().map(hg => (\n <TableRowRaw key={hg.id}>\n {hg.headers.map(header => (\n <TableHeadRaw key={header.id}>\n {header.isPlaceholder ? null : flexRender(header.column.columnDef.header, header.getContext())}\n </TableHeadRaw>\n ))}\n </TableRowRaw>\n ))}\n </TableHeaderRaw>\n <TableBodyRaw>\n {loading && rows.length === 0 ? (\n // Only replace the body with a loading row on the FIRST load; on a\n // refetch keep the (stale) rows visible while the reload icon spins.\n <TableRowRaw>\n <TableCellRaw className=\"h-24 text-center\" colSpan={columns.length}>\n {loadingText}\n </TableCellRaw>\n </TableRowRaw>\n ) : rows.length ? (\n rows.map(row => (\n <TableRowRaw key={row.id} data-state={row.getIsSelected() && \"selected\"}>\n {row.getVisibleCells().map(cell => (\n <TableCellRaw key={cell.id}>{flexRender(cell.column.columnDef.cell, cell.getContext())}</TableCellRaw>\n ))}\n </TableRowRaw>\n ))\n ) : (\n // An empty state is not a record, so the row drops the `hover:bg-muted/50` every\n // other row carries: lighting up under the pointer offers an interaction that is not\n // there, and it gets louder the taller the cell grows.\n <TableRowRaw className=\"hover:bg-transparent\">\n <TableCellRaw\n className={empty ? \"p-0\" : \"text-muted-foreground h-24 text-center\"}\n colSpan={columns.length}\n >\n {empty ?? emptyText}\n </TableCellRaw>\n </TableRowRaw>\n )}\n </TableBodyRaw>\n </TableRaw>\n {infinite && loadingMore ? (\n <div className=\"text-muted-foreground flex items-center justify-center gap-2 py-3 text-sm\">\n <Loader2Icon className=\"size-4 animate-spin\" />\n {loadingMoreText}\n </div>\n ) : null}\n {infinite ? <div ref={sentinelRef} aria-hidden className=\"h-px w-full\" /> : null}\n </div>\n {served ? (\n <div className=\"flex flex-wrap items-center justify-between gap-3 py-4\">\n <div className=\"text-muted-foreground flex items-center gap-3 text-sm\">\n {rangeLabel}\n {pageSizeOptions && pageSizeOptions.length > 0 ? (\n <NativeSelect\n aria-label={pageLabels?.size ?? \"Rows per page\"}\n className=\"h-8 w-auto\"\n value={String(pageSize)}\n onChange={e => onPageSizeChange?.(Number(e.target.value))}\n >\n {pageSizeOptions.map(n => (\n <NativeSelectOption key={n} value={String(n)}>\n {n}\n </NativeSelectOption>\n ))}\n </NativeSelect>\n ) : null}\n </div>\n <div className=\"flex items-center gap-1\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n aria-label={pageLabels?.first ?? \"First page\"}\n onClick={() => onPageChange?.(0)}\n disabled={pageIndex <= 0}\n >\n «\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n aria-label={pageLabels?.previous ?? previousLabel}\n onClick={() => onPageChange?.(pageIndex - 1)}\n disabled={pageIndex <= 0}\n >\n ‹\n </Button>\n {pageWindow(pageIndex, pageCount).map((p, i) =>\n p === null ? (\n <span key={`gap${i}`} className=\"text-muted-foreground px-1 text-sm\">\n …\n </span>\n ) : (\n <Button\n key={p}\n variant={p === pageIndex ? \"default\" : \"outline\"}\n size=\"sm\"\n aria-current={p === pageIndex ? \"page\" : undefined}\n onClick={() => onPageChange?.(p)}\n >\n {p + 1}\n </Button>\n ),\n )}\n <Button\n variant=\"outline\"\n size=\"sm\"\n aria-label={pageLabels?.next ?? nextLabel}\n onClick={() => onPageChange?.(pageIndex + 1)}\n disabled={pageIndex >= pageCount - 1}\n >\n ›\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n aria-label={pageLabels?.last ?? \"Last page\"}\n onClick={() => onPageChange?.(pageCount - 1)}\n disabled={pageIndex >= pageCount - 1}\n >\n »\n </Button>\n </div>\n </div>\n ) : null}\n {!infinite && !served && table.getPageCount() > 1 ? (\n <div className=\"flex items-center justify-end gap-2 py-4\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => table.previousPage()} disabled={!table.getCanPreviousPage()}>\n {previousLabel}\n </Button>\n <Button variant=\"outline\" size=\"sm\" onClick={() => table.nextPage()} disabled={!table.getCanNextPage()}>\n {nextLabel}\n </Button>\n </div>\n ) : null}\n </div>\n )\n}\n"]}
@@ -1,3 +1,6 @@
1
+ export { B as BEARING_PLATES, a as BearingPlate, P as PLATES, b as Plate, d as derivePlate, i as isPlate } from '../plate-BJ19iaVV.js';
2
+ export { u as useCompact, a as usePlate } from '../use-compact-BvI4sJf9.js';
3
+
1
4
  /**
2
5
  * Returns `true` when viewport width is below the given mobile breakpoint.
3
6
  *
@@ -1,4 +1,5 @@
1
1
  "use client";
2
- export { useMobile } from '../chunk-QYA2HGKW.js';
2
+ export { useCompact, usePlate } from '../chunk-AIULLZYM.js';
3
+ export { BEARING_PLATES, PLATES, derivePlate, isPlate, useMobile } from '../chunk-D7DMRCDY.js';
3
4
  //# sourceMappingURL=index.js.map
4
5
  //# sourceMappingURL=index.js.map
@@ -1,9 +1,7 @@
1
1
  "use client";
2
2
  import '../chunk-PL37KFRJ.js';
3
- import { Popover, PopoverTrigger, PopoverContent, Command, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem } from '../chunk-VDO6PQ5L.js';
4
- import '../chunk-XWGYXLIA.js';
5
- import { Avatar, AvatarImage, AvatarFallback } from '../chunk-F2ET7EL2.js';
6
- import '../chunk-2HDU26FC.js';
3
+ import { Popover, PopoverTrigger, PopoverContent, Command, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem } from '../chunk-L4LQCVOF.js';
4
+ import { Avatar, AvatarImage, AvatarFallback } from '../chunk-VXW3K5O5.js';
7
5
  import { Button, Input } from '../chunk-VGOGWZCF.js';
8
6
  import { cn } from '../chunk-XH55BHUU.js';
9
7
  import { jsxs, jsx } from 'react/jsx-runtime';
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/people/types.ts","../../src/people/person-row.tsx","../../src/people/use-principal-search.ts","../../src/people/people-picker.tsx","../../src/people/people-field.tsx"],"names":["React2","jsxs","jsx","React3"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * The shape the pickers render.\n *\n * Deliberately NOT contact's `Person` type. lyra must not know that a service called\n * contact exists: if it imported that type, every field contact adds would force a\n * lyra release and re-lock every app that consumes it. Each app maps its own DTO onto\n * this in about five lines, and only that app changes when its source changes.\n *\n * It covers people AND groups/orgs because the pickers are used to grant access as\n * often as to address a message, and \"share with the Legal team\" is the same gesture\n * as \"share with Ada\".\n */\nexport interface Principal<T = unknown> {\n /**\n * The caller's own object, handed straight back on select.\n *\n * A picker's job is to answer \"which one\", but the app almost always needs more\n * than what it renders — contact needs the contactId to open the right editor,\n * drive needs the grantee kind. Without this the app has to rebuild a lookup from\n * the key it just handed out, which is a map that exists only because the type\n * threw information away.\n */\n data?: T\n /** Stable id in the caller's world: a uid, a group id, an org id. */\n id?: string\n email?: string\n displayName?: string\n avatarUrl?: string\n /** One line under the name: a title, an org, \"in your contacts\". */\n subtitle?: string\n kind?: \"person\" | \"group\" | \"org\"\n}\n\n/**\n * How the app finds candidates. Injected, never implemented here.\n *\n * An EMPTY query is a legitimate call and should return the caller's recent or\n * frequent people — that is what makes a picker feel like it knows you rather than\n * like a search box you have to feed first.\n *\n * The signal is passed so a fast typist does not race their own requests; the picker\n * aborts the previous lookup on every keystroke.\n */\nexport type PrincipalSearch<T = unknown> = (\n query: string,\n signal?: AbortSignal,\n) => Promise<Principal<T>[]>\n\n/** Labels are injected: lyra ships no copy and no i18n runtime. */\nexport interface PeopleLabels {\n placeholder?: string\n /** Shown while the list is empty and nothing has been typed. */\n hint?: string\n noResults?: string\n /** Offer to use a typed address that matched nothing, e.g. \"Use {email}\". */\n useTyped?: string\n /** Marks an entry the caller excluded, e.g. \"already added\". */\n excluded?: string\n remove?: string\n}\n\n/** A plausible email. Not RFC-complete on purpose — this gates a UI affordance,\n * and the server validates for real. Being strict here only refuses addresses that\n * actually work. */\nexport function looksLikeEmail(s: string): boolean {\n const v = s.trim()\n return v.length >= 3 && !/\\s/.test(v) && /^[^@]+@[^@.]+\\.[^@]+$/.test(v)\n}\n\n/** The key a principal is deduped and excluded by. */\nexport function principalKey(p: Principal<unknown>): string {\n return (p.id || p.email || p.displayName || \"\").toLowerCase()\n}\n","\"use client\"\n\nimport { Avatar, AvatarFallback, AvatarImage } from \"~/ui/primitives/avatar.js\"\nimport { cn } from \"~/utils/index.js\"\nimport type { Principal } from \"./types.js\"\n\n/**\n * Initials for the avatar fallback. Falls back through name → email → \"?\" so a\n * principal that is nothing but a typed address still renders as something.\n */\nexport function initials(p: Principal): string {\n const src = (p.displayName || \"\").trim() || p.email || \"?\"\n const parts = src.split(/\\s+/).filter(Boolean)\n if (parts.length >= 2 && parts[0] && parts[1]) {\n return (parts[0][0]! + parts[1][0]!).toUpperCase()\n }\n return src.slice(0, 2).toUpperCase()\n}\n\nexport function PersonAvatar({\n principal,\n className,\n}: {\n principal: Principal\n className?: string\n}) {\n return (\n <Avatar className={className}>\n {principal.avatarUrl ? (\n <AvatarImage src={principal.avatarUrl} alt={principal.displayName ?? \"\"} />\n ) : null}\n <AvatarFallback className=\"text-xs\">{initials(principal)}</AvatarFallback>\n </Avatar>\n )\n}\n\n/**\n * One line: avatar, name, and whatever the app chose to say underneath.\n *\n * Shared by the picker, the token field and any table that lists people — a person\n * rendered three different ways in three apps is how a suite stops feeling like one\n * product.\n */\nexport function PersonRow({\n principal,\n className,\n trailing,\n}: {\n principal: Principal\n className?: string\n /** Slot for whatever the caller attaches per person: a role select, a remove button. */\n trailing?: React.ReactNode\n}) {\n const name = principal.displayName || principal.email || \"—\"\n // The subtitle is dropped when it would just repeat the name — a row reading\n // \"ada@x.com / ada@x.com\" is noise.\n const sub = principal.subtitle && principal.subtitle !== name ? principal.subtitle : undefined\n\n return (\n <div className={cn(\"flex min-w-0 items-center gap-3\", className)}>\n <PersonAvatar principal={principal} className=\"size-8 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-sm font-medium\">{name}</div>\n {sub ? <div className=\"text-muted-foreground truncate text-xs\">{sub}</div> : null}\n </div>\n {trailing}\n </div>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport type { Principal, PrincipalSearch } from \"./types.js\"\nimport { principalKey } from \"./types.js\"\n\nexport interface UsePrincipalSearchOptions<T = unknown> {\n search: PrincipalSearch<T>\n /** Keys (id or email) to mark as already chosen. */\n exclude?: string[]\n /** Milliseconds to wait after the last keystroke. */\n debounceMs?: number\n limit?: number\n}\n\nexport interface PrincipalSearchState<T = unknown> {\n query: string\n setQuery: (q: string) => void\n results: Principal<T>[]\n loading: boolean\n error: string | null\n /** Excluded keys, lowercased — the UI dims these rather than hiding them. */\n excluded: Set<string>\n}\n\n/**\n * The behaviour both pickers share: debounce, abort the previous request, keep the\n * last results visible while the next ones load.\n *\n * Two decisions worth keeping:\n *\n * - **Results are NOT cleared while loading.** Emptying the list on every keystroke\n * makes a picker flicker between \"here they are\" and \"nothing found\", and users\n * read that flash as a failed search.\n * - **Excluded entries stay in the list, dimmed.** Removing them makes the search\n * look broken to the one person who most expects a hit — \"I know Ada is in here,\n * why can't I find her?\" — when the truth is she is already added.\n */\nexport function usePrincipalSearch<T = unknown>({\n search,\n exclude,\n debounceMs = 200,\n limit,\n}: UsePrincipalSearchOptions<T>): PrincipalSearchState<T> {\n const [query, setQuery] = React.useState(\"\")\n const [results, setResults] = React.useState<Principal<T>[]>([])\n const [loading, setLoading] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n\n const excluded = React.useMemo(\n () => new Set((exclude ?? []).filter(Boolean).map((k) => k.toLowerCase())),\n [exclude],\n )\n\n // Keep the latest search in a ref: a caller that re-creates the function every\n // render must not cancel and refire the request on every render.\n const searchRef = React.useRef(search)\n searchRef.current = search\n\n React.useEffect(() => {\n const controller = new AbortController()\n let cancelled = false\n\n const timer = setTimeout(() => {\n setLoading(true)\n setError(null)\n searchRef\n .current(query, controller.signal)\n .then((found) => {\n if (cancelled) return\n const seen = new Set<string>()\n const deduped = found.filter((p) => {\n const k = principalKey(p)\n if (!k || seen.has(k)) return false\n seen.add(k)\n return true\n })\n setResults(limit ? deduped.slice(0, limit) : deduped)\n })\n .catch((e: unknown) => {\n // An abort is the normal path on every keystroke, not a failure.\n if (cancelled || (e instanceof DOMException && e.name === \"AbortError\")) return\n setError(e instanceof Error ? e.message : String(e))\n })\n .finally(() => {\n if (!cancelled) setLoading(false)\n })\n // An empty query still searches: that is how recents appear before typing.\n }, query ? debounceMs : 0)\n\n return () => {\n cancelled = true\n controller.abort()\n clearTimeout(timer)\n }\n }, [query, debounceMs, limit])\n\n return { query, setQuery, results, loading, error, excluded }\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { ChevronsUpDown } from \"lucide-react\"\nimport { Button } from \"~/ui/primitives/button.js\"\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n} from \"~/ui/primitives/command.js\"\nimport { Popover, PopoverContent, PopoverTrigger } from \"~/ui/primitives/popover.js\"\nimport { cn } from \"~/utils/index.js\"\nimport { PersonRow } from \"./person-row.js\"\nimport type { PeopleLabels, Principal, PrincipalSearch } from \"./types.js\"\nimport { looksLikeEmail, principalKey } from \"./types.js\"\nimport { usePrincipalSearch } from \"./use-principal-search.js\"\n\nexport interface PeoplePickerProps<T = unknown> {\n /** Injected by the app — lyra never knows where people come from. */\n search: PrincipalSearch<T>\n onSelect: (p: Principal<T>) => void\n /** Already-chosen keys (id or email): shown dimmed, not hidden. */\n exclude?: string[]\n /**\n * Offer a typed address that matched nothing. Essential wherever the other party\n * is a stranger by definition (a contract counterparty), and wrong wherever they\n * must already exist (adding somebody to an org).\n */\n allowFreeEntry?: boolean\n labels?: PeopleLabels\n disabled?: boolean\n className?: string\n}\n\n/**\n * Pick one person (or group, or org), from a popover.\n *\n * Filtering is SERVER-side — `shouldFilter={false}` — because ranking is the point:\n * the backend knows who this user actually works with, and cmdk's local fuzzy match\n * would reorder that into alphabetical noise.\n */\nexport function PeoplePicker<T = unknown>({\n search,\n onSelect,\n exclude,\n allowFreeEntry,\n labels,\n disabled,\n className,\n}: PeoplePickerProps<T>) {\n const [open, setOpen] = React.useState(false)\n const { query, setQuery, results, loading, excluded } = usePrincipalSearch({\n search,\n exclude,\n })\n\n const typedEmail = allowFreeEntry && looksLikeEmail(query) ? query.trim() : \"\"\n const alreadyListed = results.some((p) => p.email?.toLowerCase() === typedEmail.toLowerCase())\n const offerTyped = typedEmail !== \"\" && !alreadyListed\n\n function choose(p: Principal<T>) {\n onSelect(p)\n setOpen(false)\n setQuery(\"\")\n }\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n role=\"combobox\"\n aria-expanded={open}\n disabled={disabled}\n className={cn(\"text-muted-foreground w-full justify-between font-normal\", className)}\n >\n {labels?.placeholder ?? \"Search people\"}\n <ChevronsUpDown className=\"size-4 opacity-50\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-[22rem] p-0\" align=\"start\">\n <Command shouldFilter={false}>\n <CommandInput\n value={query}\n onValueChange={setQuery}\n placeholder={labels?.placeholder ?? \"Search people\"}\n />\n <CommandList>\n {results.length === 0 && !offerTyped && !loading ? (\n <CommandEmpty>\n {query ? (labels?.noResults ?? \"No matches\") : (labels?.hint ?? \"Start typing\")}\n </CommandEmpty>\n ) : null}\n\n {offerTyped ? (\n <CommandGroup>\n <CommandItem\n value=\"__typed__\"\n onSelect={() => choose({ email: typedEmail, kind: \"person\" })}\n >\n <PersonRow\n principal={{ email: typedEmail, displayName: typedEmail }}\n // The affordance has to name the address, or it reads as a\n // generic \"add\" and people do not trust it with a contract.\n />\n <span className=\"text-muted-foreground ml-auto shrink-0 text-xs\">\n {labels?.useTyped ?? \"Use this address\"}\n </span>\n </CommandItem>\n </CommandGroup>\n ) : null}\n\n {results.length > 0 ? (\n <CommandGroup>\n {results.map((p, i) => {\n const off = excluded.has(principalKey(p))\n return (\n <CommandItem\n key={principalKey(p) || i}\n value={String(i)}\n disabled={off}\n onSelect={() => !off && choose(p)}\n className={cn(off && \"opacity-50\")}\n >\n <PersonRow principal={p} />\n {off ? (\n <span className=\"text-muted-foreground ml-auto shrink-0 text-xs\">\n {labels?.excluded ?? \"already added\"}\n </span>\n ) : null}\n </CommandItem>\n )\n })}\n </CommandGroup>\n ) : null}\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { X } from \"lucide-react\"\nimport { Input } from \"~/ui/primitives/input.js\"\nimport { cn } from \"~/utils/index.js\"\nimport { PersonAvatar, PersonRow } from \"./person-row.js\"\nimport type { PeopleLabels, Principal, PrincipalSearch } from \"./types.js\"\nimport { looksLikeEmail, principalKey } from \"./types.js\"\nimport { usePrincipalSearch } from \"./use-principal-search.js\"\n\nexport interface PeopleFieldProps<T = unknown> {\n search: PrincipalSearch<T>\n /** Chosen so far — rendered as tokens. */\n value: Principal<T>[]\n onAdd: (p: Principal<T>) => void\n onRemove: (p: Principal<T>) => void\n allowFreeEntry?: boolean\n labels?: PeopleLabels\n disabled?: boolean\n className?: string\n}\n\n/**\n * A To:-style token field: type, pick, repeat.\n *\n * The popover picker and this are NOT the same component with a flag. A \"To\" line is\n * used dozens of times a minute and lives or dies on keyboard flow — type, Enter,\n * type, Enter, Backspace to undo — whereas a share dialog is opened once and clicked\n * through. Forcing one into the other's shape produces something that is bad at both.\n *\n * Paste is handled: a list copied out of a spreadsheet or another mail client arrives\n * as \"a@x.com, b@y.com; c@z.com\" and becomes three tokens, because the alternative is\n * the user hand-splitting it.\n */\nexport function PeopleField<T = unknown>({\n search,\n value,\n onAdd,\n onRemove,\n allowFreeEntry,\n labels,\n disabled,\n className,\n}: PeopleFieldProps<T>) {\n const [focused, setFocused] = React.useState(false)\n const exclude = React.useMemo(() => value.map(principalKey), [value])\n const { query, setQuery, results, excluded } = usePrincipalSearch({ search, exclude, limit: 6 })\n\n const chosen = React.useMemo(() => new Set(exclude), [exclude])\n const typedEmail = allowFreeEntry && looksLikeEmail(query) ? query.trim() : \"\"\n\n function add(p: Principal<T>) {\n const k = principalKey(p)\n if (!k || chosen.has(k)) return\n onAdd(p)\n setQuery(\"\")\n }\n\n function onKeyDown(e: React.KeyboardEvent<HTMLInputElement>) {\n if ((e.key === \"Enter\" || e.key === \"Tab\" || e.key === \",\") && query.trim()) {\n // Enter takes the top-ranked match, or the typed address. Anything else would\n // make the common case — the person you meant is first — need the mouse.\n const pick = results.find((p) => !excluded.has(principalKey(p)))\n if (pick) {\n e.preventDefault()\n add(pick)\n } else if (typedEmail) {\n e.preventDefault()\n add({ email: typedEmail, kind: \"person\" })\n }\n return\n }\n // Backspace on an empty box removes the last token — the universal behaviour of\n // every mail client, and the first thing a user tries.\n if (e.key === \"Backspace\" && query === \"\" && value.length > 0) {\n onRemove(value[value.length - 1]!)\n }\n }\n\n function onPaste(e: React.ClipboardEvent<HTMLInputElement>) {\n const text = e.clipboardData.getData(\"text\")\n const parts = text.split(/[,;\\s]+/).map((s) => s.trim()).filter(Boolean)\n if (parts.length < 2) return // one token: let it type normally\n e.preventDefault()\n for (const part of parts) {\n if (looksLikeEmail(part)) add({ email: part, kind: \"person\" })\n }\n }\n\n return (\n <div className={cn(\"space-y-2\", className)}>\n <div\n className={cn(\n \"border-input focus-within:ring-ring flex min-h-10 flex-wrap items-center gap-1.5 rounded-md border px-2 py-1.5 focus-within:ring-1\",\n disabled && \"opacity-50\",\n )}\n >\n {value.map((p) => (\n <span\n key={principalKey(p)}\n className=\"bg-muted flex items-center gap-1.5 rounded-full py-0.5 pl-0.5 pr-2 text-xs\"\n >\n <PersonAvatar principal={p} className=\"size-5\" />\n <span className=\"max-w-40 truncate\">{p.displayName || p.email}</span>\n <button\n type=\"button\"\n aria-label={labels?.remove ?? \"Remove\"}\n onClick={() => onRemove(p)}\n disabled={disabled}\n className=\"opacity-60 hover:opacity-100\"\n >\n <X className=\"size-3\" />\n </button>\n </span>\n ))}\n <Input\n value={query}\n disabled={disabled}\n placeholder={value.length === 0 ? (labels?.placeholder ?? \"Add people\") : undefined}\n onChange={(e) => setQuery(e.target.value)}\n onKeyDown={onKeyDown}\n onPaste={onPaste}\n onFocus={() => setFocused(true)}\n // Delayed so a click on a suggestion lands before the list unmounts.\n onBlur={() => setTimeout(() => setFocused(false), 150)}\n className=\"h-7 min-w-40 flex-1 border-0 bg-transparent px-1 shadow-none focus-visible:ring-0\"\n />\n </div>\n\n {focused && (results.length > 0 || typedEmail) ? (\n <div className=\"bg-popover max-h-64 overflow-auto rounded-md border p-1 shadow-md\">\n {typedEmail && !results.some((p) => p.email === typedEmail) ? (\n <button\n type=\"button\"\n onClick={() => add({ email: typedEmail, kind: \"person\" })}\n className=\"hover:bg-accent flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-left\"\n >\n <PersonRow principal={{ email: typedEmail, displayName: typedEmail }} />\n <span className=\"text-muted-foreground ml-auto shrink-0 text-xs\">\n {labels?.useTyped ?? \"Use this address\"}\n </span>\n </button>\n ) : null}\n {results.map((p) => {\n const off = excluded.has(principalKey(p))\n return (\n <button\n key={principalKey(p)}\n type=\"button\"\n disabled={off}\n onClick={() => add(p)}\n className={cn(\n \"hover:bg-accent flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-left\",\n off && \"opacity-50\",\n )}\n >\n <PersonRow principal={p} />\n {off ? (\n <span className=\"text-muted-foreground ml-auto shrink-0 text-xs\">\n {labels?.excluded ?? \"already added\"}\n </span>\n ) : null}\n </button>\n )\n })}\n </div>\n ) : null}\n </div>\n )\n}\n"]}
1
+ {"version":3,"sources":["../../src/people/types.ts","../../src/people/person-row.tsx","../../src/people/use-principal-search.ts","../../src/people/people-picker.tsx","../../src/people/people-field.tsx"],"names":["React2","jsxs","jsx","React3"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * The shape the pickers render.\n *\n * Deliberately NOT contact's `Person` type. lyra must not know that a service called\n * contact exists: if it imported that type, every field contact adds would force a\n * lyra release and re-lock every app that consumes it. Each app maps its own DTO onto\n * this in about five lines, and only that app changes when its source changes.\n *\n * It covers people AND groups/orgs because the pickers are used to grant access as\n * often as to address a message, and \"share with the Legal team\" is the same gesture\n * as \"share with Ada\".\n */\nexport interface Principal<T = unknown> {\n /**\n * The caller's own object, handed straight back on select.\n *\n * A picker's job is to answer \"which one\", but the app almost always needs more\n * than what it renders — contact needs the contactId to open the right editor,\n * drive needs the grantee kind. Without this the app has to rebuild a lookup from\n * the key it just handed out, which is a map that exists only because the type\n * threw information away.\n */\n data?: T\n /** Stable id in the caller's world: a uid, a group id, an org id. */\n id?: string\n email?: string\n displayName?: string\n avatarUrl?: string\n /** One line under the name: a title, an org, \"in your contacts\". */\n subtitle?: string\n kind?: \"person\" | \"group\" | \"org\"\n}\n\n/**\n * How the app finds candidates. Injected, never implemented here.\n *\n * An EMPTY query is a legitimate call and should return the caller's recent or\n * frequent people — that is what makes a picker feel like it knows you rather than\n * like a search box you have to feed first.\n *\n * The signal is passed so a fast typist does not race their own requests; the picker\n * aborts the previous lookup on every keystroke.\n */\nexport type PrincipalSearch<T = unknown> = (\n query: string,\n signal?: AbortSignal,\n) => Promise<Principal<T>[]>\n\n/** Labels are injected: lyra ships no copy and no i18n runtime. */\nexport interface PeopleLabels {\n placeholder?: string\n /** Shown while the list is empty and nothing has been typed. */\n hint?: string\n noResults?: string\n /** Offer to use a typed address that matched nothing, e.g. \"Use {email}\". */\n useTyped?: string\n /** Marks an entry the caller excluded, e.g. \"already added\". */\n excluded?: string\n remove?: string\n}\n\n/** A plausible email. Not RFC-complete on purpose — this gates a UI affordance,\n * and the server validates for real. Being strict here only refuses addresses that\n * actually work. */\nexport function looksLikeEmail(s: string): boolean {\n const v = s.trim()\n return v.length >= 3 && !/\\s/.test(v) && /^[^@]+@[^@.]+\\.[^@]+$/.test(v)\n}\n\n/** The key a principal is deduped and excluded by. */\nexport function principalKey(p: Principal<unknown>): string {\n return (p.id || p.email || p.displayName || \"\").toLowerCase()\n}\n","\"use client\"\n\nimport { Avatar, AvatarFallback, AvatarImage } from \"~/ui/primitives/avatar.js\"\nimport { cn } from \"~/utils/index.js\"\nimport type { Principal } from \"./types.js\"\n\n/**\n * Initials for the avatar fallback. Falls back through name → email → \"?\" so a\n * principal that is nothing but a typed address still renders as something.\n */\nexport function initials(p: Principal): string {\n const src = (p.displayName || \"\").trim() || p.email || \"?\"\n const parts = src.split(/\\s+/).filter(Boolean)\n if (parts.length >= 2 && parts[0] && parts[1]) {\n return (parts[0][0]! + parts[1][0]!).toUpperCase()\n }\n return src.slice(0, 2).toUpperCase()\n}\n\nexport function PersonAvatar({\n principal,\n className,\n}: {\n principal: Principal\n className?: string\n}) {\n return (\n <Avatar className={className}>\n {principal.avatarUrl ? (\n <AvatarImage src={principal.avatarUrl} alt={principal.displayName ?? \"\"} />\n ) : null}\n <AvatarFallback className=\"text-xs\">{initials(principal)}</AvatarFallback>\n </Avatar>\n )\n}\n\n/**\n * One line: avatar, name, and whatever the app chose to say underneath.\n *\n * Shared by the picker, the token field and any table that lists people — a person\n * rendered three different ways in three apps is how a suite stops feeling like one\n * product.\n */\nexport function PersonRow({\n principal,\n className,\n trailing,\n}: {\n principal: Principal\n className?: string\n /** Slot for whatever the caller attaches per person: a role select, a remove button. */\n trailing?: React.ReactNode\n}) {\n const name = principal.displayName || principal.email || \"—\"\n // The subtitle is dropped when it would just repeat the name — a row reading\n // \"ada@x.com / ada@x.com\" is noise.\n const sub = principal.subtitle && principal.subtitle !== name ? principal.subtitle : undefined\n\n return (\n <div className={cn(\"flex min-w-0 items-center gap-3\", className)}>\n <PersonAvatar principal={principal} className=\"size-8 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-sm font-medium\">{name}</div>\n {sub ? <div className=\"text-muted-foreground truncate text-xs\">{sub}</div> : null}\n </div>\n {trailing}\n </div>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport type { Principal, PrincipalSearch } from \"./types.js\"\nimport { principalKey } from \"./types.js\"\n\nexport interface UsePrincipalSearchOptions<T = unknown> {\n search: PrincipalSearch<T>\n /** Keys (id or email) to mark as already chosen. */\n exclude?: string[]\n /** Milliseconds to wait after the last keystroke. */\n debounceMs?: number\n limit?: number\n}\n\nexport interface PrincipalSearchState<T = unknown> {\n query: string\n setQuery: (q: string) => void\n results: Principal<T>[]\n loading: boolean\n error: string | null\n /** Excluded keys, lowercased — the UI dims these rather than hiding them. */\n excluded: Set<string>\n}\n\n/**\n * The behaviour both pickers share: debounce, abort the previous request, keep the\n * last results visible while the next ones load.\n *\n * Two decisions worth keeping:\n *\n * - **Results are NOT cleared while loading.** Emptying the list on every keystroke\n * makes a picker flicker between \"here they are\" and \"nothing found\", and users\n * read that flash as a failed search.\n * - **Excluded entries stay in the list, dimmed.** Removing them makes the search\n * look broken to the one person who most expects a hit — \"I know Ada is in here,\n * why can't I find her?\" — when the truth is she is already added.\n */\nexport function usePrincipalSearch<T = unknown>({\n search,\n exclude,\n debounceMs = 200,\n limit,\n}: UsePrincipalSearchOptions<T>): PrincipalSearchState<T> {\n const [query, setQuery] = React.useState(\"\")\n const [results, setResults] = React.useState<Principal<T>[]>([])\n const [loading, setLoading] = React.useState(false)\n const [error, setError] = React.useState<string | null>(null)\n\n const excluded = React.useMemo(\n () => new Set((exclude ?? []).filter(Boolean).map((k) => k.toLowerCase())),\n [exclude],\n )\n\n // Keep the latest search in a ref: a caller that re-creates the function every\n // render must not cancel and refire the request on every render.\n const searchRef = React.useRef(search)\n searchRef.current = search\n\n React.useEffect(() => {\n const controller = new AbortController()\n let cancelled = false\n\n const timer = setTimeout(() => {\n setLoading(true)\n setError(null)\n searchRef\n .current(query, controller.signal)\n .then((found) => {\n if (cancelled) return\n const seen = new Set<string>()\n const deduped = found.filter((p) => {\n const k = principalKey(p)\n if (!k || seen.has(k)) return false\n seen.add(k)\n return true\n })\n setResults(limit ? deduped.slice(0, limit) : deduped)\n })\n .catch((e: unknown) => {\n // An abort is the normal path on every keystroke, not a failure.\n if (cancelled || (e instanceof DOMException && e.name === \"AbortError\")) return\n setError(e instanceof Error ? e.message : String(e))\n })\n .finally(() => {\n if (!cancelled) setLoading(false)\n })\n // An empty query still searches: that is how recents appear before typing.\n }, query ? debounceMs : 0)\n\n return () => {\n cancelled = true\n controller.abort()\n clearTimeout(timer)\n }\n }, [query, debounceMs, limit])\n\n return { query, setQuery, results, loading, error, excluded }\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { ChevronsUpDown } from \"lucide-react\"\nimport { Button } from \"~/ui/primitives/button.js\"\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n} from \"~/ui/primitives/command.js\"\nimport { Popover, PopoverContent, PopoverTrigger } from \"~/ui/primitives/popover.js\"\nimport { cn } from \"~/utils/index.js\"\nimport { PersonRow } from \"./person-row.js\"\nimport type { PeopleLabels, Principal, PrincipalSearch } from \"./types.js\"\nimport { looksLikeEmail, principalKey } from \"./types.js\"\nimport { usePrincipalSearch } from \"./use-principal-search.js\"\n\nexport interface PeoplePickerProps<T = unknown> {\n /** Injected by the app — lyra never knows where people come from. */\n search: PrincipalSearch<T>\n onSelect: (p: Principal<T>) => void\n /** Already-chosen keys (id or email): shown dimmed, not hidden. */\n exclude?: string[]\n /**\n * Offer a typed address that matched nothing. Essential wherever the other party\n * is a stranger by definition (a contract counterparty), and wrong wherever they\n * must already exist (adding somebody to an org).\n */\n allowFreeEntry?: boolean\n labels?: PeopleLabels\n disabled?: boolean\n className?: string\n}\n\n/**\n * Pick one person (or group, or org), from a popover.\n *\n * Filtering is SERVER-side — `shouldFilter={false}` — because ranking is the point:\n * the backend knows who this user actually works with, and cmdk's local fuzzy match\n * would reorder that into alphabetical noise.\n */\nexport function PeoplePicker<T = unknown>({\n search,\n onSelect,\n exclude,\n allowFreeEntry,\n labels,\n disabled,\n className,\n}: PeoplePickerProps<T>) {\n const [open, setOpen] = React.useState(false)\n const { query, setQuery, results, loading, excluded } = usePrincipalSearch({\n search,\n exclude,\n })\n\n const typedEmail = allowFreeEntry && looksLikeEmail(query) ? query.trim() : \"\"\n const alreadyListed = results.some((p) => p.email?.toLowerCase() === typedEmail.toLowerCase())\n const offerTyped = typedEmail !== \"\" && !alreadyListed\n\n function choose(p: Principal<T>) {\n onSelect(p)\n setOpen(false)\n setQuery(\"\")\n }\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n role=\"combobox\"\n aria-expanded={open}\n disabled={disabled}\n className={cn(\"text-muted-foreground w-full justify-between font-normal\", className)}\n >\n {labels?.placeholder ?? \"Search people\"}\n <ChevronsUpDown className=\"size-4 opacity-50\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-[22rem] p-0\" align=\"start\">\n <Command shouldFilter={false}>\n <CommandInput\n value={query}\n onValueChange={setQuery}\n placeholder={labels?.placeholder ?? \"Search people\"}\n />\n <CommandList>\n {results.length === 0 && !offerTyped && !loading ? (\n <CommandEmpty>\n {query ? (labels?.noResults ?? \"No matches\") : (labels?.hint ?? \"Start typing\")}\n </CommandEmpty>\n ) : null}\n\n {offerTyped ? (\n <CommandGroup>\n <CommandItem\n value=\"__typed__\"\n onSelect={() => choose({ email: typedEmail, kind: \"person\" })}\n >\n <PersonRow\n principal={{ email: typedEmail, displayName: typedEmail }}\n // The affordance has to name the address, or it reads as a\n // generic \"add\" and people do not trust it with a contract.\n />\n <span className=\"text-muted-foreground ml-auto shrink-0 text-xs\">\n {labels?.useTyped ?? \"Use this address\"}\n </span>\n </CommandItem>\n </CommandGroup>\n ) : null}\n\n {results.length > 0 ? (\n <CommandGroup>\n {results.map((p, i) => {\n const off = excluded.has(principalKey(p))\n return (\n <CommandItem\n key={principalKey(p) || i}\n value={String(i)}\n disabled={off}\n onSelect={() => !off && choose(p)}\n className={cn(off && \"opacity-50\")}\n >\n <PersonRow principal={p} />\n {off ? (\n <span className=\"text-muted-foreground ml-auto shrink-0 text-xs\">\n {labels?.excluded ?? \"already added\"}\n </span>\n ) : null}\n </CommandItem>\n )\n })}\n </CommandGroup>\n ) : null}\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { X } from \"lucide-react\"\nimport { Input } from \"~/ui/primitives/input.js\"\nimport { cn } from \"~/utils/index.js\"\nimport { PersonAvatar, PersonRow } from \"./person-row.js\"\nimport type { PeopleLabels, Principal, PrincipalSearch } from \"./types.js\"\nimport { looksLikeEmail, principalKey } from \"./types.js\"\nimport { usePrincipalSearch } from \"./use-principal-search.js\"\n\nexport interface PeopleFieldProps<T = unknown> {\n search: PrincipalSearch<T>\n /** Chosen so far — rendered as tokens. */\n value: Principal<T>[]\n onAdd: (p: Principal<T>) => void\n onRemove: (p: Principal<T>) => void\n allowFreeEntry?: boolean\n labels?: PeopleLabels\n disabled?: boolean\n className?: string\n}\n\n/**\n * A To:-style token field: type, pick, repeat.\n *\n * The popover picker and this are NOT the same component with a flag. A \"To\" line is\n * used dozens of times a minute and lives or dies on keyboard flow — type, Enter,\n * type, Enter, Backspace to undo — whereas a share dialog is opened once and clicked\n * through. Forcing one into the other's shape produces something that is bad at both.\n *\n * Paste is handled: a list copied out of a spreadsheet or another mail client arrives\n * as \"a@x.com, b@y.com; c@z.com\" and becomes three tokens, because the alternative is\n * the user hand-splitting it.\n */\nexport function PeopleField<T = unknown>({\n search,\n value,\n onAdd,\n onRemove,\n allowFreeEntry,\n labels,\n disabled,\n className,\n}: PeopleFieldProps<T>) {\n const [focused, setFocused] = React.useState(false)\n const exclude = React.useMemo(() => value.map(principalKey), [value])\n const { query, setQuery, results, excluded } = usePrincipalSearch({ search, exclude, limit: 6 })\n\n const chosen = React.useMemo(() => new Set(exclude), [exclude])\n const typedEmail = allowFreeEntry && looksLikeEmail(query) ? query.trim() : \"\"\n\n function add(p: Principal<T>) {\n const k = principalKey(p)\n if (!k || chosen.has(k)) return\n onAdd(p)\n setQuery(\"\")\n }\n\n function onKeyDown(e: React.KeyboardEvent<HTMLInputElement>) {\n if ((e.key === \"Enter\" || e.key === \"Tab\" || e.key === \",\") && query.trim()) {\n // Enter takes the top-ranked match, or the typed address. Anything else would\n // make the common case — the person you meant is first — need the mouse.\n const pick = results.find((p) => !excluded.has(principalKey(p)))\n if (pick) {\n e.preventDefault()\n add(pick)\n } else if (typedEmail) {\n e.preventDefault()\n add({ email: typedEmail, kind: \"person\" })\n }\n return\n }\n // Backspace on an empty box removes the last token — the universal behaviour of\n // every mail client, and the first thing a user tries.\n if (e.key === \"Backspace\" && query === \"\" && value.length > 0) {\n onRemove(value[value.length - 1]!)\n }\n }\n\n function onPaste(e: React.ClipboardEvent<HTMLInputElement>) {\n const text = e.clipboardData.getData(\"text\")\n const parts = text.split(/[,;\\s]+/).map((s) => s.trim()).filter(Boolean)\n if (parts.length < 2) return // one token: let it type normally\n e.preventDefault()\n for (const part of parts) {\n if (looksLikeEmail(part)) add({ email: part, kind: \"person\" })\n }\n }\n\n return (\n <div className={cn(\"space-y-2\", className)}>\n <div\n className={cn(\n \"border-input focus-within:ring-ring flex min-h-10 flex-wrap items-center gap-1.5 rounded-md border px-2 py-1.5 focus-within:ring-1\",\n disabled && \"opacity-50\",\n )}\n >\n {value.map((p) => (\n <span\n key={principalKey(p)}\n className=\"bg-muted flex items-center gap-1.5 rounded-full py-0.5 pl-0.5 pr-2 text-xs\"\n >\n <PersonAvatar principal={p} className=\"size-5\" />\n <span className=\"max-w-40 truncate\">{p.displayName || p.email}</span>\n <button\n type=\"button\"\n aria-label={labels?.remove ?? \"Remove\"}\n onClick={() => onRemove(p)}\n disabled={disabled}\n className=\"opacity-60 hover:opacity-100\"\n >\n <X className=\"size-3\" />\n </button>\n </span>\n ))}\n <Input\n value={query}\n disabled={disabled}\n placeholder={value.length === 0 ? (labels?.placeholder ?? \"Add people\") : undefined}\n onChange={(e) => setQuery(e.target.value)}\n onKeyDown={onKeyDown}\n onPaste={onPaste}\n onFocus={() => setFocused(true)}\n // Delayed so a click on a suggestion lands before the list unmounts.\n onBlur={() => setTimeout(() => setFocused(false), 150)}\n className=\"h-7 min-w-40 flex-1 border-0 bg-transparent px-1 shadow-none focus-visible:ring-0\"\n />\n </div>\n\n {focused && (results.length > 0 || typedEmail) ? (\n <div className=\"bg-popover max-h-64 overflow-auto rounded-md border p-1 shadow-md\">\n {typedEmail && !results.some((p) => p.email === typedEmail) ? (\n <button\n type=\"button\"\n onClick={() => add({ email: typedEmail, kind: \"person\" })}\n className=\"hover:bg-accent flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-left\"\n >\n <PersonRow principal={{ email: typedEmail, displayName: typedEmail }} />\n <span className=\"text-muted-foreground ml-auto shrink-0 text-xs\">\n {labels?.useTyped ?? \"Use this address\"}\n </span>\n </button>\n ) : null}\n {results.map((p) => {\n const off = excluded.has(principalKey(p))\n return (\n <button\n key={principalKey(p)}\n type=\"button\"\n disabled={off}\n onClick={() => add(p)}\n className={cn(\n \"hover:bg-accent flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-left\",\n off && \"opacity-50\",\n )}\n >\n <PersonRow principal={p} />\n {off ? (\n <span className=\"text-muted-foreground ml-auto shrink-0 text-xs\">\n {labels?.excluded ?? \"already added\"}\n </span>\n ) : null}\n </button>\n )\n })}\n </div>\n ) : null}\n </div>\n )\n}\n"]}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Plates: the palette a reader picks, applied by putting `data-plate` on any element.
3
+ *
4
+ * This module holds NAMES and nothing else. The colours live once, in `styles/globals.css`, and a
5
+ * swatch reads them the same way the rest of the UI does - by sitting inside a `data-plate` scope
6
+ * and using `bg-primary`. Copying the values here would be the second table that drifts.
7
+ *
8
+ * Absent `data-plate`, `--primary` is lyra's neutral. That is the default every app ships with, so
9
+ * adopting plates costs an app nothing until a reader chooses.
10
+ */
11
+ declare const PLATES: readonly ["pink", "rose", "crimson", "rust", "orange", "ochre", "amber", "honey", "gold", "olive", "lime", "green", "teal", "cyan", "azure", "blue", "indigo", "violet", "magenta"];
12
+ type Plate = (typeof PLATES)[number];
13
+ /**
14
+ * The plates certified to be told apart from each other, not merely from the status tokens.
15
+ *
16
+ * Only these may carry MEANING. The distinction is not decorative: a plate a reader picks for
17
+ * pleasure needs no relation to anyone else's, but a plate that says "which space you are typing
18
+ * into" stops working the moment two of them look alike - so that use gets the subset measured at
19
+ * dE76 >= 29.7 pairwise, in both themes.
20
+ */
21
+ declare const BEARING_PLATES: readonly ["pink", "rust", "amber", "olive", "green", "teal", "azure", "blue", "violet"];
22
+ type BearingPlate = (typeof BEARING_PLATES)[number];
23
+ declare function isPlate(s: string): s is Plate;
24
+ /**
25
+ * The plate for an id, from the certified subset.
26
+ *
27
+ * Derived, never chosen, and that is the point when the colour is a fence rather than a preference:
28
+ * if two organisations could both pick blue the signal stops working for both of them. Deriving on
29
+ * the CLIENT is deliberate too - the alternative is every server that shows a coloured surface
30
+ * keeping its own copy of the name list, which is the shape chat ended up in (a Go slice, a CSS
31
+ * block and a TS union, with nothing holding them together).
32
+ *
33
+ * FNV-1a rather than a cryptographic hash: this picks a colour, so spreading matters and secrecy
34
+ * does not, and it stays synchronous - SubtleCrypto would make every call site async for nothing.
35
+ */
36
+ declare function derivePlate(id: string): BearingPlate;
37
+
38
+ export { BEARING_PLATES as B, PLATES as P, type BearingPlate as a, type Plate as b, derivePlate as d, isPlate as i };
@@ -0,0 +1,20 @@
1
+ import * as React from 'react';
2
+ import { b as Plate } from './plate-BJ19iaVV.js';
3
+
4
+ interface PlatePickerProps {
5
+ value: Plate | null;
6
+ onChange: (plate: Plate | null) => void;
7
+ /** Accessible name for the group, e.g. "Accent colour". */
8
+ label: string;
9
+ /** Accessible name for the neutral option, e.g. "Default". */
10
+ resetLabel: string;
11
+ /**
12
+ * Translated name per plate. Falls back to the plate's own key, which is English - fine for a
13
+ * developer tool, wrong for a product, and the reason this is a prop rather than a table in here.
14
+ */
15
+ plateLabels?: Partial<Record<Plate, string>>;
16
+ className?: string;
17
+ }
18
+ declare function PlatePicker({ value, onChange, label, resetLabel, plateLabels, className }: PlatePickerProps): React.JSX.Element;
19
+
20
+ export { PlatePicker as P, type PlatePickerProps as a };
@@ -0,0 +1,5 @@
1
+ import * as React from 'react';
2
+
3
+ declare function PreferenceScript(): React.JSX.Element;
4
+
5
+ export { PreferenceScript as P };
@@ -1,9 +1,11 @@
1
1
  import * as React from 'react';
2
2
  import { ComponentProps, ReactNode } from 'react';
3
- import { S as SidebarProvider, a as SidebarInset, b as Sidebar, A as AccountMenuUser, c as AccountMenuLabels, B as Breadcrumb } from '../breadcrumb-CgEcSonR.js';
3
+ import { S as SidebarProvider, a as SidebarInset, b as Sidebar, A as AccountMenuUser, c as AccountMenuLabels, B as Breadcrumb } from '../account-menu-D9M_kEzN.js';
4
+ import { a as PlatePickerProps } from '../plate-picker-CXxUGyNz.js';
4
5
  import 'class-variance-authority/types';
5
6
  import 'class-variance-authority';
6
7
  import 'radix-ui';
8
+ import '../plate-BJ19iaVV.js';
7
9
 
8
10
  interface AppShellProps extends Omit<ComponentProps<typeof SidebarProvider>, "children"> {
9
11
  children: ReactNode;
@@ -313,8 +315,14 @@ interface NavUserThemeLabels {
313
315
  light: string;
314
316
  dark: string;
315
317
  system: string;
318
+ /** Submenu trigger. It covers theme, accent and density, so it is not called "Theme". */
319
+ appearance: string;
320
+ accent: string;
321
+ /** The neutral option in the accent row. */
322
+ accentDefault: string;
323
+ compact: string;
316
324
  }
317
- /** Default English theme-submenu labels — spread + override for i18n. */
325
+ /** Default English appearance-submenu labels - spread + override for i18n. */
318
326
  declare const defaultNavUserThemeLabels: NavUserThemeLabels;
319
327
  interface NavUserProps {
320
328
  /**
@@ -335,9 +343,15 @@ interface NavUserProps {
335
343
  onSignIn?: () => void;
336
344
  /** Render the light/dark/system theme submenu. Default `true`. */
337
345
  showTheme?: boolean;
338
- /** Theme-submenu labels. */
346
+ /** Appearance-submenu labels. */
339
347
  themeLabels?: Partial<NavUserThemeLabels>;
340
- /** Extra menu content inserted below the theme submenu. */
348
+ /**
349
+ * Translated name per plate, passed through to the accent row. Falls back to the plate's own key,
350
+ * which is English: fine while the swatch is the thing a reader picks by, wrong if an app wants the
351
+ * names read out, and the reason this is a prop rather than 19 strings baked in here.
352
+ */
353
+ plateLabels?: PlatePickerProps["plateLabels"];
354
+ /** Extra menu content inserted below the appearance submenu. */
341
355
  children?: ReactNode;
342
356
  }
343
357
  /**
@@ -368,7 +382,7 @@ interface NavUserProps {
368
382
  * />
369
383
  * </SidebarFooter>
370
384
  */
371
- declare function NavUser({ user, labels, onSwitchAccount, onSignOut, onSignIn, showTheme, themeLabels, children, }: NavUserProps): React.JSX.Element | null;
385
+ declare function NavUser({ user, labels, onSwitchAccount, onSignOut, onSignIn, showTheme, themeLabels, plateLabels, children, }: NavUserProps): React.JSX.Element | null;
372
386
 
373
387
  interface TabItem {
374
388
  id: string;