@appcorp/shadcn 2.0.0 → 2.0.2

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 (165) hide show
  1. package/components/app-sidebar.js +1 -34
  2. package/components/audio.js +1 -13
  3. package/components/dashboard.js +1 -29
  4. package/components/drawer-generic.js +1 -39
  5. package/components/enhanced-checkbox.js +1 -39
  6. package/components/enhanced-combobox.js +1 -271
  7. package/components/enhanced-drawer-footer.js +1 -30
  8. package/components/enhanced-drawer-header.js +1 -7
  9. package/components/enhanced-dropzone-impl.js +1 -218
  10. package/components/enhanced-dropzone.js +1 -8
  11. package/components/enhanced-input.js +1 -40
  12. package/components/enhanced-label.js +1 -22
  13. package/components/enhanced-radio.js +1 -15
  14. package/components/enhanced-select.js +1 -33
  15. package/components/enhanced-slider.js +1 -33
  16. package/components/enhanced-switch.js +1 -42
  17. package/components/enhanced-table-footer-action.js +1 -102
  18. package/components/enhanced-table-footer-page.js +1 -124
  19. package/components/enhanced-table-footer-pagination.js +1 -108
  20. package/components/enhanced-table-header-action.js +1 -32
  21. package/components/enhanced-table-header-search.js +1 -10
  22. package/components/enhanced-table.js +1 -301
  23. package/components/enhanced-textarea.js +1 -40
  24. package/components/field.js +1 -96
  25. package/components/image-resize-dialog.js +1 -82
  26. package/components/nav-main.js +1 -40
  27. package/components/nav-projects.js +1 -39
  28. package/components/nav-user.js +1 -52
  29. package/components/show-toast.js +1 -7
  30. package/components/sidebar.js +1 -257
  31. package/components/team-switcher.js +1 -42
  32. package/components/theme-provider.js +1 -112
  33. package/components/timeline.js +1 -13
  34. package/components/tooltip.js +1 -36
  35. package/components/ui/accordion.js +1 -37
  36. package/components/ui/alert-dialog.js +1 -63
  37. package/components/ui/alert.js +1 -41
  38. package/components/ui/area-chart-v1-impl.js +1 -75
  39. package/components/ui/area-chart-v1.js +1 -5
  40. package/components/ui/aspect-ratio.js +1 -4
  41. package/components/ui/avatar.js +1 -31
  42. package/components/ui/badge.d.ts +1 -1
  43. package/components/ui/badge.js +1 -32
  44. package/components/ui/breadcrumb.js +1 -54
  45. package/components/ui/button.d.ts +1 -1
  46. package/components/ui/button.js +1 -44
  47. package/components/ui/calendar-impl.js +1 -55
  48. package/components/ui/calendar.js +1 -6
  49. package/components/ui/card.js +1 -44
  50. package/components/ui/carousel-impl.js +1 -117
  51. package/components/ui/carousel.js +1 -9
  52. package/components/ui/chart-impl.js +6 -161
  53. package/components/ui/chart.js +1 -10
  54. package/components/ui/checkbox.js +1 -24
  55. package/components/ui/collapsible.js +1 -6
  56. package/components/ui/combobox.js +1 -52
  57. package/components/ui/command-impl.js +1 -63
  58. package/components/ui/command.js +1 -13
  59. package/components/ui/context-menu.js +1 -80
  60. package/components/ui/dialog.js +1 -57
  61. package/components/ui/drawer-impl.js +1 -56
  62. package/components/ui/drawer.js +1 -14
  63. package/components/ui/dropdown-menu.js +1 -82
  64. package/components/ui/form.d.ts +1 -1
  65. package/components/ui/form.js +1 -78
  66. package/components/ui/hover-card.js +1 -23
  67. package/components/ui/input-otp-impl.js +1 -43
  68. package/components/ui/input-otp.js +1 -8
  69. package/components/ui/input.js +1 -19
  70. package/components/ui/label.js +1 -23
  71. package/components/ui/language-selector.js +1 -25
  72. package/components/ui/menubar.js +1 -103
  73. package/components/ui/navigation-menu.js +1 -59
  74. package/components/ui/pagination.js +1 -60
  75. package/components/ui/popover.js +1 -25
  76. package/components/ui/progress.js +1 -22
  77. package/components/ui/radio-group.js +1 -29
  78. package/components/ui/resizable-impl.d.ts +1 -1
  79. package/components/ui/resizable-impl.js +1 -27
  80. package/components/ui/resizable.js +1 -7
  81. package/components/ui/scroll-area.js +1 -32
  82. package/components/ui/select.js +1 -71
  83. package/components/ui/separator.js +1 -21
  84. package/components/ui/sheet.js +1 -71
  85. package/components/ui/skeleton.js +1 -18
  86. package/components/ui/slider.js +1 -32
  87. package/components/ui/sonner.js +1 -28
  88. package/components/ui/switch.js +1 -22
  89. package/components/ui/table.js +1 -55
  90. package/components/ui/tabs.js +1 -32
  91. package/components/ui/textarea.js +1 -19
  92. package/components/ui/theme-switcher.js +1 -102
  93. package/components/ui/toggle.js +1 -39
  94. package/data/admin-dashboard.js +1 -301
  95. package/hooks/use-enhanced-combobox.js +1 -73
  96. package/hooks/use-mobile.js +1 -15
  97. package/hooks/use-outside-click.js +1 -19
  98. package/lib/themes.js +1 -147
  99. package/lib/toast-utils.js +1 -170
  100. package/lib/utils.js +1 -5
  101. package/package.json +2 -2
  102. package/templates/appcorp-v1/footer/bottom-bar.d.ts +6 -0
  103. package/templates/appcorp-v1/footer/bottom-bar.js +1 -0
  104. package/templates/appcorp-v1/footer/cta.d.ts +6 -0
  105. package/templates/appcorp-v1/footer/cta.js +1 -0
  106. package/templates/appcorp-v1/footer/footer-grid.d.ts +14 -0
  107. package/templates/appcorp-v1/footer/footer-grid.js +1 -0
  108. package/templates/appcorp-v1/footer/index.d.ts +3 -0
  109. package/templates/appcorp-v1/footer/index.js +1 -0
  110. package/templates/appcorp-v1/footer/newsletter.d.ts +11 -0
  111. package/templates/appcorp-v1/footer/newsletter.js +1 -0
  112. package/templates/appcorp-v1/footer/stats.d.ts +6 -0
  113. package/templates/appcorp-v1/footer/stats.js +1 -0
  114. package/templates/appcorp-v1/header/announcement-bar.d.ts +3 -0
  115. package/templates/appcorp-v1/header/announcement-bar.js +1 -0
  116. package/templates/appcorp-v1/header/dropdown-panel.d.ts +8 -0
  117. package/templates/appcorp-v1/header/dropdown-panel.js +2 -0
  118. package/templates/appcorp-v1/header/index.d.ts +12 -0
  119. package/templates/appcorp-v1/header/index.js +1 -0
  120. package/templates/appcorp-v1/header/mobile-menu.d.ts +14 -0
  121. package/templates/appcorp-v1/header/mobile-menu.js +1 -0
  122. package/templates/appcorp-v1/header/navigation-bar.d.ts +3 -0
  123. package/templates/appcorp-v1/header/navigation-bar.js +4 -0
  124. package/templates/appcorp-v1/header/social-button.d.ts +7 -0
  125. package/templates/appcorp-v1/header/social-button.js +1 -0
  126. package/templates/appcorp-v1/home.d.ts +3 -0
  127. package/templates/appcorp-v1/home.js +1 -0
  128. package/templates/data/appcorp-v1.d.ts +93 -0
  129. package/templates/data/appcorp-v1.js +1 -0
  130. package/templates/data/edupilotpro-v1.d.ts +33 -0
  131. package/templates/data/edupilotpro-v1.js +1 -0
  132. package/templates/data/school-v1.d.ts +328 -0
  133. package/templates/data/school-v1.js +1 -0
  134. package/templates/edupilotpro-v1/feature-card.d.ts +13 -0
  135. package/templates/edupilotpro-v1/feature-card.js +1 -0
  136. package/templates/edupilotpro-v1/mockups/dashboard-mockup.d.ts +3 -0
  137. package/templates/edupilotpro-v1/mockups/dashboard-mockup.js +1 -0
  138. package/templates/school-v1/footer.d.ts +3 -0
  139. package/templates/school-v1/footer.js +1 -0
  140. package/templates/school-v1/index.d.ts +18 -0
  141. package/templates/school-v1/index.js +1 -0
  142. package/templates/school-v1/navigation.d.ts +3 -0
  143. package/templates/school-v1/navigation.js +1 -0
  144. package/templates/school-v1/sections/about.d.ts +3 -0
  145. package/templates/school-v1/sections/about.js +1 -0
  146. package/templates/school-v1/sections/admissions.d.ts +3 -0
  147. package/templates/school-v1/sections/admissions.js +1 -0
  148. package/templates/school-v1/sections/contact.d.ts +3 -0
  149. package/templates/school-v1/sections/contact.js +1 -0
  150. package/templates/school-v1/sections/faqs.d.ts +3 -0
  151. package/templates/school-v1/sections/faqs.js +1 -0
  152. package/templates/school-v1/sections/hero.d.ts +3 -0
  153. package/templates/school-v1/sections/hero.js +1 -0
  154. package/templates/school-v1/sections/management.d.ts +3 -0
  155. package/templates/school-v1/sections/management.js +1 -0
  156. package/templates/school-v1/sections/policies.d.ts +3 -0
  157. package/templates/school-v1/sections/policies.js +1 -0
  158. package/templates/school-v1/sections/programs.d.ts +3 -0
  159. package/templates/school-v1/sections/programs.js +1 -0
  160. package/templates/school-v1/sections/testimonials.d.ts +3 -0
  161. package/templates/school-v1/sections/testimonials.js +1 -0
  162. package/templates/school-v1/sections/why-choose-us.d.ts +3 -0
  163. package/templates/school-v1/sections/why-choose-us.js +1 -0
  164. package/utils/transform-breadcrumbs.js +1 -7
  165. package/utils/transform-navitems.js +1 -18
@@ -1,34 +1 @@
1
- "use client";
2
- var __rest = (this && this.__rest) || function (s, e) {
3
- var t = {};
4
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
5
- t[p] = s[p];
6
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
7
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
8
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
9
- t[p[i]] = s[p[i]];
10
- }
11
- return t;
12
- };
13
- import React from "react";
14
- import { NavMain } from "./nav-main";
15
- import { NavProjects } from "./nav-projects";
16
- import { NavUser } from "./nav-user";
17
- import { TeamSwitcher } from "./team-switcher";
18
- import { Sidebar, SidebarContent, SidebarFooter, SidebarHeader, SidebarRail, } from "./sidebar";
19
- export const AppSidebar = (_a) => {
20
- var props = __rest(_a, []);
21
- return (React.createElement(Sidebar, { collapsible: "icon" },
22
- React.createElement(SidebarHeader, null,
23
- React.createElement(TeamSwitcher, { profiles: props.profiles })),
24
- React.createElement(SidebarContent, null,
25
- React.createElement(NavMain, { items: props.navItems }),
26
- React.createElement(NavProjects, { apps: props.apps, offerUrl: props.offerUrl })),
27
- React.createElement(SidebarFooter, null,
28
- React.createElement(NavUser, { footerNavItems: props.footerNavItems, handleSignOut: props.handleSignOut, user: {
29
- email: props.email,
30
- name: props.username,
31
- avatar: props.avatar,
32
- } })),
33
- React.createElement(SidebarRail, null)));
34
- };
1
+ "use strict";"use client";var l=function(t,e){var n={};for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&e.indexOf(r)<0&&(n[r]=t[r]);if(t!=null&&typeof Object.getOwnPropertySymbols=="function")for(var o=0,r=Object.getOwnPropertySymbols(t);o<r.length;o++)e.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(t,r[o])&&(n[r[o]]=t[r[o]]);return n};import a from"react";import{NavMain as m}from"./nav-main";import{NavProjects as i}from"./nav-projects";import{NavUser as p}from"./nav-user";import{TeamSwitcher as c}from"./team-switcher";import{Sidebar as f,SidebarContent as s,SidebarFooter as u,SidebarHeader as b,SidebarRail as v}from"./sidebar";export const AppSidebar=t=>{var e=l(t,[]);return a.createElement(f,{collapsible:"icon"},a.createElement(b,null,a.createElement(c,{profiles:e.profiles})),a.createElement(s,null,a.createElement(m,{items:e.navItems}),a.createElement(i,{apps:e.apps,offerUrl:e.offerUrl})),a.createElement(u,null,a.createElement(p,{footerNavItems:e.footerNavItems,handleSignOut:e.handleSignOut,user:{email:e.email,name:e.username,avatar:e.avatar}})),a.createElement(v,null))};
@@ -1,13 +1 @@
1
- "use client";
2
- import React from "react";
3
- import { Button } from "./ui/button";
4
- import { EnhancedLabel } from "./enhanced-label";
5
- export const AudioControl = ({ audioUrl, id, label, onDelete, onGenerate, required = false, }) => {
6
- return (React.createElement("div", { className: "space-y-2" },
7
- label && (React.createElement(EnhancedLabel, { htmlFor: id, required: required }, label)),
8
- !audioUrl && (React.createElement("div", { className: "flex gap-2" },
9
- React.createElement(Button, { type: "button", onClick: onGenerate, variant: "outline", className: "flex-1" }, "Generate Audio"),
10
- React.createElement(Button, { type: "button", onClick: onDelete, variant: "destructive", className: "flex-1" }, "Delete Audio"))),
11
- audioUrl && (React.createElement("div", { className: "mt-2 rounded-md border border-gray-200 bg-gray-50 p-3" },
12
- React.createElement("audio", { controls: true, className: "w-full", src: audioUrl }, "Your browser does not support the audio element.")))));
13
- };
1
+ "use strict";"use client";import e from"react";import{Button as a}from"./ui/button";import{EnhancedLabel as m}from"./enhanced-label";export const AudioControl=({audioUrl:t,id:o,label:r,onDelete:n,onGenerate:l,required:c=!1})=>e.createElement("div",{className:"space-y-2"},r&&e.createElement(m,{htmlFor:o,required:c},r),!t&&e.createElement("div",{className:"flex gap-2"},e.createElement(a,{type:"button",onClick:l,variant:"outline",className:"flex-1"},"Generate Audio"),e.createElement(a,{type:"button",onClick:n,variant:"destructive",className:"flex-1"},"Delete Audio")),t&&e.createElement("div",{className:"mt-2 rounded-md border border-gray-200 bg-gray-50 p-3"},e.createElement("audio",{controls:!0,className:"w-full",src:t},"Your browser does not support the audio element.")));
@@ -1,29 +1 @@
1
- import React, { Fragment } from "react";
2
- import { RefreshCw } from "lucide-react";
3
- import { AppSidebar } from "./app-sidebar";
4
- import { Breadcrumb, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbSeparator, } from "./ui/breadcrumb";
5
- import { Separator } from "./ui/separator";
6
- import { SidebarInset, SidebarProvider, SidebarTrigger } from "./sidebar";
7
- import { ThemeSwitcher } from "./ui/theme-switcher";
8
- import { Button } from "./ui/button";
9
- import { LanguageSelector } from "./ui/language-selector";
10
- export const Dashboard = ({ apps, avatar, breadcrumbs, children, clearBrowserCache, email, footerNavItems, handleSignOut, locale, navItems, offerUrl, onLocaleChange, profiles, showLanguageSelector, username, }) => {
11
- return (React.createElement(SidebarProvider, null,
12
- React.createElement(AppSidebar, { apps: apps, avatar: avatar, email: email, footerNavItems: footerNavItems, handleSignOut: handleSignOut, navItems: navItems, offerUrl: offerUrl, profiles: profiles, username: username }),
13
- React.createElement(SidebarInset, null,
14
- React.createElement("header", { className: "flex h-16 shrink-0 items-center justify-between gap-2 border transition-[width,height] ease-linear group-has-data-[collapsible=icon]/sidebar-wrapper:h-12" },
15
- React.createElement("div", { className: "flex items-center gap-2 px-4" },
16
- React.createElement(SidebarTrigger, { className: "-ml-1" }),
17
- React.createElement(Separator, { orientation: "vertical", className: "mr-2 data-[orientation=vertical]:h-4" }),
18
- React.createElement(Breadcrumb, null,
19
- React.createElement(BreadcrumbList, { className: "[&>*:last-child]:hidden" }, breadcrumbs === null || breadcrumbs === void 0 ? void 0 : breadcrumbs.map((breadcrumb) => (React.createElement(Fragment, { key: breadcrumb.label },
20
- React.createElement(BreadcrumbItem, { className: "hidden md:block" },
21
- React.createElement(BreadcrumbLink, { href: breadcrumb.href }, breadcrumb.label)),
22
- React.createElement(BreadcrumbSeparator, { className: "hidden md:block" }))))))),
23
- React.createElement("div", { className: "flex items-center gap-2 px-4" },
24
- showLanguageSelector && (React.createElement(LanguageSelector, { value: locale, onChange: onLocaleChange })),
25
- clearBrowserCache && (React.createElement(Button, { variant: "ghost", size: "icon", "aria-label": "Clear browser cache", title: "Clear browser cache", onClick: clearBrowserCache, "data-slot": "clear-cache-button" },
26
- React.createElement(RefreshCw, { className: "h-4 w-4", "aria-hidden": "true" }))),
27
- React.createElement(ThemeSwitcher, null))),
28
- children)));
29
- };
1
+ "use strict";import e,{Fragment as b}from"react";import{RefreshCw as g}from"lucide-react";import{AppSidebar as v}from"./app-sidebar";import{Breadcrumb as N,BreadcrumbItem as S,BreadcrumbLink as w,BreadcrumbList as k,BreadcrumbSeparator as x}from"./ui/breadcrumb";import{Separator as B}from"./ui/separator";import{SidebarInset as C,SidebarProvider as I,SidebarTrigger as L}from"./sidebar";import{ThemeSwitcher as y}from"./ui/theme-switcher";import{Button as R}from"./ui/button";import{LanguageSelector as T}from"./ui/language-selector";export const Dashboard=({apps:l,avatar:m,breadcrumbs:a,children:n,clearBrowserCache:r,email:i,footerNavItems:o,handleSignOut:c,locale:s,navItems:d,offerUrl:p,onLocaleChange:h,profiles:f,showLanguageSelector:E,username:u})=>e.createElement(I,null,e.createElement(v,{apps:l,avatar:m,email:i,footerNavItems:o,handleSignOut:c,navItems:d,offerUrl:p,profiles:f,username:u}),e.createElement(C,null,e.createElement("header",{className:"flex h-16 shrink-0 items-center justify-between gap-2 border transition-[width,height] ease-linear group-has-data-[collapsible=icon]/sidebar-wrapper:h-12"},e.createElement("div",{className:"flex items-center gap-2 px-4"},e.createElement(L,{className:"-ml-1"}),e.createElement(B,{orientation:"vertical",className:"mr-2 data-[orientation=vertical]:h-4"}),e.createElement(N,null,e.createElement(k,{className:"[&>*:last-child]:hidden"},a?.map(t=>e.createElement(b,{key:t.label},e.createElement(S,{className:"hidden md:block"},e.createElement(w,{href:t.href},t.label)),e.createElement(x,{className:"hidden md:block"})))))),e.createElement("div",{className:"flex items-center gap-2 px-4"},E&&e.createElement(T,{value:s,onChange:h}),r&&e.createElement(R,{variant:"ghost",size:"icon","aria-label":"Clear browser cache",title:"Clear browser cache",onClick:r,"data-slot":"clear-cache-button"},e.createElement(g,{className:"h-4 w-4","aria-hidden":"true"})),e.createElement(y,null))),n));
@@ -1,39 +1 @@
1
- "use client";
2
- import { Drawer as ShadcnDrawer, DrawerClose, DrawerContent, DrawerHeader, DrawerFooter, } from "../components/ui/drawer";
3
- import { X } from "lucide-react";
4
- import { Button } from "../components/ui/button";
5
- import React from "react";
6
- import { Separator } from "../components/ui/separator";
7
- import { cn } from "../lib/utils";
8
- export const DrawerGeneric = ({ direction = "right", filterDrawer, filterDrawerFooter, filterDrawerHeader, formDrawer, formDrawerFooter, formDrawerHeader, moreActionsDrawer, moreActionsDrawerFooter, moreActionsDrawerHeader, onOpenChange, open, viewDrawer, viewDrawerFooter, viewDrawerHeader, width = "small", }) => {
9
- const widthClass = {
10
- small: "w-[400px]",
11
- medium: "w-[700px]",
12
- large: "w-[1000px]",
13
- full: "w-screen",
14
- };
15
- return (React.createElement(React.Fragment, null,
16
- React.createElement(ShadcnDrawer, { direction: direction, onOpenChange: onOpenChange, open: open },
17
- React.createElement(DrawerContent, { className: cn("", widthClass[width]) },
18
- React.createElement(DrawerHeader, { className: "flex flex-row justify-center items-start" },
19
- React.createElement("div", { className: "w-full" },
20
- moreActionsDrawerHeader,
21
- filterDrawerHeader,
22
- formDrawerHeader,
23
- viewDrawerHeader),
24
- React.createElement(DrawerClose, { asChild: true },
25
- React.createElement(Button, { size: "icon", variant: "ghost", className: "h-8 w-8" },
26
- React.createElement(X, { className: "h-4 w-4" })))),
27
- React.createElement(Separator, null),
28
- React.createElement("div", { className: "overflow-y-auto p-4 flex-1" },
29
- moreActionsDrawer,
30
- filterDrawer,
31
- formDrawer,
32
- viewDrawer),
33
- React.createElement(Separator, null),
34
- React.createElement(DrawerFooter, null,
35
- moreActionsDrawerFooter,
36
- filterDrawerFooter,
37
- formDrawerFooter,
38
- viewDrawerFooter)))));
39
- };
1
+ "use strict";"use client";import{Drawer as D,DrawerClose as N,DrawerContent as g,DrawerHeader as C,DrawerFooter as v}from"../components/ui/drawer";import{X as y}from"lucide-react";import{Button as F}from"../components/ui/button";import e from"react";import{Separator as r}from"../components/ui/separator";import{cn as S}from"../lib/utils";export const DrawerGeneric=({direction:t="right",filterDrawer:a,filterDrawerFooter:l,filterDrawerHeader:m,formDrawer:n,formDrawerFooter:o,formDrawerHeader:c,moreActionsDrawer:s,moreActionsDrawerFooter:i,moreActionsDrawerHeader:w,onOpenChange:p,open:f,viewDrawer:u,viewDrawerFooter:E,viewDrawerHeader:d,width:h="small"})=>{const x={small:"w-[400px]",medium:"w-[700px]",large:"w-[1000px]",full:"w-screen"};return e.createElement(e.Fragment,null,e.createElement(D,{direction:t,onOpenChange:p,open:f},e.createElement(g,{className:S("",x[h])},e.createElement(C,{className:"flex flex-row justify-center items-start"},e.createElement("div",{className:"w-full"},w,m,c,d),e.createElement(N,{asChild:!0},e.createElement(F,{size:"icon",variant:"ghost",className:"h-8 w-8"},e.createElement(y,{className:"h-4 w-4"})))),e.createElement(r,null),e.createElement("div",{className:"overflow-y-auto p-4 flex-1"},s,a,n,u),e.createElement(r,null),e.createElement(v,null,i,l,o,E))))};
@@ -1,39 +1 @@
1
- "use client";
2
- var __rest = (this && this.__rest) || function (s, e) {
3
- var t = {};
4
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
5
- t[p] = s[p];
6
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
7
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
8
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
9
- t[p[i]] = s[p[i]];
10
- }
11
- return t;
12
- };
13
- import * as React from "react";
14
- import { cn } from "../lib/utils";
15
- import { Checkbox } from "./ui/checkbox";
16
- import { EnhancedLabel } from "./enhanced-label";
17
- const EnhancedCheckbox = React.forwardRef((_a, ref) => {
18
- var { className, error, info, label, id, testId } = _a, props = __rest(_a, ["className", "error", "info", "label", "id", "testId"]);
19
- // Determine if there's an error (for aria-invalid and styling)
20
- const hasError = Boolean(error);
21
- const checkboxElement = (React.createElement(Checkbox, Object.assign({ ref: ref, id: id, "data-slot": "checkbox", "data-testid": testId, "aria-invalid": hasError, className: cn(
22
- // Error state styling
23
- hasError &&
24
- "data-[state=checked]:bg-destructive data-[state=unchecked]:bg-destructive/20 border-destructive focus-visible:border-destructive focus-visible:ring-destructive/20", className) }, props)));
25
- // If label is provided, render the complete checkbox with label structure
26
- if (label) {
27
- return (React.createElement("div", { className: "w-full space-y-2" },
28
- React.createElement("div", { className: "flex items-center space-x-2" },
29
- checkboxElement,
30
- React.createElement(EnhancedLabel, { htmlFor: id, className: "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70" }, label)),
31
- (error || info) && (React.createElement("div", null, error ? (React.createElement("p", { className: "text-xs text-destructive" }, error)) : info ? (React.createElement("p", { className: "text-xs text-blue-600 dark:text-blue-400" }, info)) : null))));
32
- }
33
- // If no label, render just the checkbox with messages (backward compatibility)
34
- return (React.createElement("div", { className: "w-full" },
35
- checkboxElement,
36
- (error || info) && (React.createElement("div", null, error ? (React.createElement("p", { className: "text-xs text-destructive" }, error)) : info ? (React.createElement("p", { className: "text-xs text-blue-600 dark:text-blue-400" }, info)) : null))));
37
- });
38
- EnhancedCheckbox.displayName = "EnhancedCheckbox";
39
- export { EnhancedCheckbox };
1
+ "use strict";"use client";var b=function(a,c){var l={};for(var e in a)Object.prototype.hasOwnProperty.call(a,e)&&c.indexOf(e)<0&&(l[e]=a[e]);if(a!=null&&typeof Object.getOwnPropertySymbols=="function")for(var t=0,e=Object.getOwnPropertySymbols(a);t<e.length;t++)c.indexOf(e[t])<0&&Object.prototype.propertyIsEnumerable.call(a,e[t])&&(l[e[t]]=a[e[t]]);return l};import*as r from"react";import{cn as f}from"../lib/utils";import{Checkbox as p}from"./ui/checkbox";import{EnhancedLabel as x}from"./enhanced-label";const d=r.forwardRef((a,c)=>{var{className:l,error:e,info:t,label:s,id:n,testId:m}=a,u=b(a,["className","error","info","label","id","testId"]);const o=!!e,i=r.createElement(p,Object.assign({ref:c,id:n,"data-slot":"checkbox","data-testid":m,"aria-invalid":o,className:f(o&&"data-[state=checked]:bg-destructive data-[state=unchecked]:bg-destructive/20 border-destructive focus-visible:border-destructive focus-visible:ring-destructive/20",l)},u));return s?r.createElement("div",{className:"w-full space-y-2"},r.createElement("div",{className:"flex items-center space-x-2"},i,r.createElement(x,{htmlFor:n,className:"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"},s)),(e||t)&&r.createElement("div",null,e?r.createElement("p",{className:"text-xs text-destructive"},e):t?r.createElement("p",{className:"text-xs text-blue-600 dark:text-blue-400"},t):null)):r.createElement("div",{className:"w-full"},i,(e||t)&&r.createElement("div",null,e?r.createElement("p",{className:"text-xs text-destructive"},e):t?r.createElement("p",{className:"text-xs text-blue-600 dark:text-blue-400"},t):null))});d.displayName="EnhancedCheckbox";export{d as EnhancedCheckbox};
@@ -1,271 +1 @@
1
- "use client";
2
- import React, { useState, useRef, useEffect, useCallback } from "react";
3
- import { Check, ChevronsUpDown, ChevronUp, ChevronDown } from "lucide-react";
4
- import { cn } from "../lib/utils";
5
- import { Button } from "./ui/button";
6
- import { EnhancedLabel } from "./enhanced-label";
7
- import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, } from "./ui/command";
8
- import { Popover, PopoverContent, PopoverTrigger } from "./ui/popover";
9
- function VirtualizedList({ options, selectedValue, onSelect, scrollContainer, testIdOptionPrefix, }) {
10
- const [visibleRange, setVisibleRange] = useState({
11
- start: 0,
12
- end: Math.min(options.length, 25), // Increased initial visible items
13
- });
14
- const handleScroll = useCallback(() => {
15
- if (!scrollContainer.current)
16
- return;
17
- const { scrollTop, clientHeight } = scrollContainer.current;
18
- const itemHeight = 32; // Approximate item height
19
- const containerHeight = clientHeight;
20
- // Calculate visible range with proper bounds checking
21
- const start = Math.max(0, Math.floor(scrollTop / itemHeight));
22
- const visibleCount = Math.ceil(containerHeight / itemHeight);
23
- const bufferSize = Math.min(10, Math.ceil(visibleCount * 0.5)); // Dynamic buffer
24
- const end = Math.min(options.length, start + visibleCount + bufferSize);
25
- const newRange = {
26
- start: Math.max(0, start - bufferSize),
27
- end: end,
28
- };
29
- // Only update if the range actually changed to prevent unnecessary re-renders
30
- setVisibleRange((prevRange) => {
31
- if (prevRange.start !== newRange.start ||
32
- prevRange.end !== newRange.end) {
33
- return newRange;
34
- }
35
- return prevRange;
36
- });
37
- }, [options.length, scrollContainer]);
38
- useEffect(() => {
39
- const container = scrollContainer.current;
40
- if (container) {
41
- // Add scroll listener with passive option for better performance
42
- container.addEventListener("scroll", handleScroll, { passive: true });
43
- // Also listen to parent containers that might interfere (like drawer)
44
- let parentContainer = container.parentElement;
45
- const parentScrollHandler = () => handleScroll();
46
- while (parentContainer) {
47
- const hasOverflow = getComputedStyle(parentContainer).overflowY;
48
- if (hasOverflow === "auto" || hasOverflow === "scroll") {
49
- parentContainer.addEventListener("scroll", parentScrollHandler, {
50
- passive: true,
51
- });
52
- break;
53
- }
54
- parentContainer = parentContainer.parentElement;
55
- }
56
- return () => {
57
- container.removeEventListener("scroll", handleScroll);
58
- if (parentContainer) {
59
- parentContainer.removeEventListener("scroll", parentScrollHandler);
60
- }
61
- };
62
- }
63
- }, [handleScroll, scrollContainer]);
64
- // Reset visible range when options change (e.g., due to search filtering)
65
- useEffect(() => {
66
- const newEnd = Math.min(options.length, 25);
67
- setVisibleRange(() => {
68
- // Force update if options changed
69
- return {
70
- start: 0,
71
- end: newEnd,
72
- };
73
- });
74
- // Reset scroll position when options change
75
- if (scrollContainer.current) {
76
- scrollContainer.current.scrollTop = 0;
77
- }
78
- }, [options.length, options, scrollContainer]); // Watch both length and options array
79
- // Ensure we always have valid visible range
80
- const safeStart = Math.max(0, Math.min(visibleRange.start, options.length - 1));
81
- const safeEnd = Math.max(safeStart + 1, Math.min(visibleRange.end, options.length));
82
- const visibleOptions = options.slice(safeStart, safeEnd);
83
- const topSpacer = safeStart * 32; // Approximate item height
84
- const bottomSpacer = Math.max(0, (options.length - safeEnd) * 32);
85
- return (React.createElement(React.Fragment, null,
86
- topSpacer > 0 && React.createElement("div", { style: { height: topSpacer } }),
87
- visibleOptions.map((option, index) => (React.createElement(CommandItem, { key: `${option.value}-${safeStart + index}`, value: option.label, onSelect: () => onSelect(option.value), "data-testid": `${testIdOptionPrefix !== null && testIdOptionPrefix !== void 0 ? testIdOptionPrefix : "combobox-option"}-${option.value}`, className: "cursor-pointer hover:bg-accent hover:text-accent-foreground transition-colors h-8 flex items-center" },
88
- React.createElement(Check, { className: cn("mr-2 h-4 w-4", selectedValue === option.value ? "opacity-100" : "opacity-0") }),
89
- React.createElement("span", { className: "truncate" }, option.label)))),
90
- bottomSpacer > 0 && React.createElement("div", { style: { height: bottomSpacer } })));
91
- }
92
- export function EnhancedCombobox({ className, disabled = false, emptyText = "No options found.", error, id, info, label, loading = false, maxHeight = 256, onSearchChange, onValueChange, options = [], placeholder = "Select option...", required = false, searchPlaceholder = "Search...", showScrollIndicators = true, value, virtualizeThreshold = 50, testIdTrigger, testIdSearchInput, testIdPopoverContent, testIdEmpty, testIdList, testIdOptionPrefix, testIdScrollUp, testIdScrollDown, }) {
93
- const [open, setOpen] = useState(false);
94
- const [searchValue, setSearchValue] = useState("");
95
- const [canScrollUp, setCanScrollUp] = useState(false);
96
- const [canScrollDown, setCanScrollDown] = useState(false);
97
- const scrollContainerRef = useRef(null);
98
- const selectedOption = options.find((option) => option.value === value);
99
- const shouldVirtualize = options.length > virtualizeThreshold;
100
- // Filter options based on search - always handle filtering at this level for virtualization
101
- const filteredOptions = React.useMemo(() => {
102
- if (!searchValue) {
103
- // No search query, return all options
104
- return options;
105
- }
106
- if (onSearchChange && shouldVirtualize) {
107
- // For virtualized lists with external search, let external handler manage it
108
- // but still return all current options as they're already filtered externally
109
- return options;
110
- }
111
- if (onSearchChange && !shouldVirtualize) {
112
- // Non-virtualized with external search - let external handler manage
113
- return options;
114
- }
115
- // Local filtering for non-external search or as fallback
116
- return options.filter((option) => option.label.toLowerCase().includes(searchValue.toLowerCase()));
117
- }, [options, searchValue, onSearchChange, shouldVirtualize]);
118
- const handleSearchChange = (search) => {
119
- setSearchValue(search);
120
- onSearchChange === null || onSearchChange === void 0 ? void 0 : onSearchChange(search);
121
- };
122
- const handleSelect = (selectedValue) => {
123
- if (selectedValue === value) {
124
- onValueChange("");
125
- }
126
- else {
127
- onValueChange(selectedValue);
128
- }
129
- setOpen(false);
130
- setSearchValue("");
131
- };
132
- // Handle scroll indicators
133
- const updateScrollIndicators = () => {
134
- if (!scrollContainerRef.current)
135
- return;
136
- const { scrollTop, scrollHeight, clientHeight } = scrollContainerRef.current;
137
- setCanScrollUp(scrollTop > 0);
138
- setCanScrollDown(scrollTop < scrollHeight - clientHeight - 1);
139
- };
140
- // Update scroll indicators when options change or component opens
141
- useEffect(() => {
142
- if (open) {
143
- // Small delay to ensure DOM is updated
144
- setTimeout(updateScrollIndicators, 10);
145
- }
146
- }, [open, options]);
147
- const scrollToTop = () => {
148
- var _a;
149
- (_a = scrollContainerRef.current) === null || _a === void 0 ? void 0 : _a.scrollTo({ top: 0, behavior: "smooth" });
150
- };
151
- const scrollToBottom = () => {
152
- if (!scrollContainerRef.current)
153
- return;
154
- const { scrollHeight } = scrollContainerRef.current;
155
- scrollContainerRef.current.scrollTo({
156
- top: scrollHeight,
157
- behavior: "smooth",
158
- });
159
- };
160
- const comboboxElement = (React.createElement(Popover, { open: open, onOpenChange: setOpen, modal: true },
161
- React.createElement(PopoverTrigger, { asChild: true },
162
- React.createElement(Button, { id: id, "data-testid": testIdTrigger, variant: "outline", role: "combobox", "aria-expanded": open, disabled: disabled, className: cn("w-full justify-between", !selectedOption && "text-muted-foreground", className) },
163
- (selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.label) || placeholder,
164
- React.createElement(ChevronsUpDown, { className: "ml-2 h-4 w-4 shrink-0 opacity-50" }))),
165
- React.createElement(PopoverContent, { "data-testid": testIdPopoverContent, className: "w-[var(--radix-popover-trigger-width)] p-0", side: "bottom", align: "start", avoidCollisions: true, collisionPadding: 8, style: { zIndex: 1000 }, onOpenAutoFocus: (e) => e.preventDefault() },
166
- React.createElement(Command, { shouldFilter: false },
167
- React.createElement(CommandInput, { "data-slot": "command-input", "data-testid": testIdSearchInput, placeholder: searchPlaceholder, value: searchValue, onValueChange: handleSearchChange }),
168
- React.createElement(CommandEmpty, { "data-slot": "command-empty", "data-testid": testIdEmpty }, loading ? (React.createElement("div", { className: "flex items-center justify-center py-6" },
169
- React.createElement("div", { className: "animate-spin rounded-full h-4 w-4 border-b-2 border-primary" }),
170
- React.createElement("span", { className: "ml-2 text-sm" }, "Searching..."))) : (emptyText)),
171
- React.createElement("div", { className: "relative" },
172
- showScrollIndicators && canScrollUp && (React.createElement("div", { className: "absolute top-0 left-0 right-0 z-10 h-8 bg-gradient-to-b from-background to-transparent pointer-events-none" },
173
- React.createElement("button", { "data-testid": testIdScrollUp, onClick: scrollToTop, className: "absolute top-1 left-1/2 transform -translate-x-1/2 p-1 rounded-full bg-background shadow-sm border pointer-events-auto hover:bg-muted transition-colors", "aria-label": "Scroll to top" },
174
- React.createElement(ChevronUp, { className: "h-3 w-3" })))),
175
- React.createElement(CommandGroup, { "data-testid": testIdList, ref: scrollContainerRef, className: cn("overflow-y-auto smooth-scroll", "scrollbar-thin scrollbar-thumb-muted-foreground/20 scrollbar-track-transparent hover:scrollbar-thumb-muted-foreground/40", "scroll-smooth", filteredOptions.length > 10 && "pb-2" // Extra padding for many options
176
- ), style: { maxHeight: `${maxHeight}px` }, onScroll: updateScrollIndicators }, shouldVirtualize &&
177
- filteredOptions.length > virtualizeThreshold ? (
178
- // Virtualized rendering for large lists
179
- React.createElement(VirtualizedList, { options: filteredOptions, selectedValue: value, onSelect: handleSelect, scrollContainer: scrollContainerRef, testIdOptionPrefix: testIdOptionPrefix })) : (
180
- // Regular rendering for smaller lists or filtered results
181
- filteredOptions.map((option) => (React.createElement(CommandItem, { key: option.value, value: option.label, onSelect: () => handleSelect(option.value), "data-testid": `${testIdOptionPrefix !== null && testIdOptionPrefix !== void 0 ? testIdOptionPrefix : "combobox-option"}-${option.value}`, className: "cursor-pointer hover:bg-accent hover:text-accent-foreground transition-colors" },
182
- React.createElement(Check, { className: cn("mr-2 h-4 w-4", value === option.value ? "opacity-100" : "opacity-0") }),
183
- React.createElement("span", { className: "truncate" }, option.label)))))),
184
- showScrollIndicators && canScrollDown && (React.createElement("div", { className: "absolute bottom-0 left-0 right-0 z-10 h-8 bg-gradient-to-t from-background to-transparent pointer-events-none" },
185
- React.createElement("button", { "data-testid": testIdScrollDown, onClick: scrollToBottom, className: "absolute bottom-1 left-1/2 transform -translate-x-1/2 p-1 rounded-full bg-background shadow-sm border pointer-events-auto hover:bg-muted transition-colors", "aria-label": "Scroll to bottom" },
186
- React.createElement(ChevronDown, { className: "h-3 w-3" })))))))));
187
- // If label is provided, render the complete combobox with label structure
188
- if (label) {
189
- return (React.createElement("div", { className: "w-full space-y-2" },
190
- React.createElement(EnhancedLabel, { htmlFor: id, required: required }, label),
191
- comboboxElement,
192
- error && (React.createElement("p", { className: "text-xs text-destructive dark:text-red-400" }, error)),
193
- info && !error && (React.createElement("p", { className: "text-xs text-blue-600 dark:text-blue-400" }, info))));
194
- }
195
- // If no label, render just the combobox (backward compatibility)
196
- return comboboxElement;
197
- }
198
- export function CompanyCombobox({ companies = [], value, onValueChange, onSearchChange, loading = false, placeholder = "Select company...", className, maxHeight = 320, showScrollIndicators = true, label, required = false, id, info, error, }) {
199
- const options = companies.map((company) => {
200
- var _a, _b;
201
- return ({
202
- value: ((_a = company.id) === null || _a === void 0 ? void 0 : _a.toString()) || "",
203
- label: company.name,
204
- id: (_b = company.id) === null || _b === void 0 ? void 0 : _b.toString(),
205
- });
206
- });
207
- return (React.createElement(EnhancedCombobox, { options: options, value: value, onValueChange: onValueChange, onSearchChange: onSearchChange, placeholder: placeholder, searchPlaceholder: "Search companies...", emptyText: "No companies found.", loading: loading, className: className, maxHeight: maxHeight, showScrollIndicators: showScrollIndicators, virtualizeThreshold: 100, label: label, required: required, id: id, info: info, error: error }));
208
- }
209
- export function CountryCombobox({ countries = [], value, onValueChange, onSearchChange, loading = false, placeholder = "Select country...", className, maxHeight = 280, showScrollIndicators = true, label, required = false, id, info, error, }) {
210
- // Default countries if none provided or if provided list is empty
211
- const defaultCountries = [
212
- { name: "Afghanistan", code: "AF" },
213
- { name: "Albania", code: "AL" },
214
- { name: "Algeria", code: "DZ" },
215
- { name: "Argentina", code: "AR" },
216
- { name: "Australia", code: "AU" },
217
- { name: "Austria", code: "AT" },
218
- { name: "Bangladesh", code: "BD" },
219
- { name: "Belgium", code: "BE" },
220
- { name: "Brazil", code: "BR" },
221
- { name: "Canada", code: "CA" },
222
- { name: "China", code: "CN" },
223
- { name: "Denmark", code: "DK" },
224
- { name: "Egypt", code: "EG" },
225
- { name: "Finland", code: "FI" },
226
- { name: "France", code: "FR" },
227
- { name: "Germany", code: "DE" },
228
- { name: "Greece", code: "GR" },
229
- { name: "India", code: "IN" },
230
- { name: "Indonesia", code: "ID" },
231
- { name: "Iran", code: "IR" },
232
- { name: "Iraq", code: "IQ" },
233
- { name: "Ireland", code: "IE" },
234
- { name: "Israel", code: "IL" },
235
- { name: "Italy", code: "IT" },
236
- { name: "Japan", code: "JP" },
237
- { name: "Jordan", code: "JO" },
238
- { name: "Kenya", code: "KE" },
239
- { name: "Malaysia", code: "MY" },
240
- { name: "Mexico", code: "MX" },
241
- { name: "Netherlands", code: "NL" },
242
- { name: "New Zealand", code: "NZ" },
243
- { name: "Nigeria", code: "NG" },
244
- { name: "Norway", code: "NO" },
245
- { name: "Pakistan", code: "PK" },
246
- { name: "Philippines", code: "PH" },
247
- { name: "Poland", code: "PL" },
248
- { name: "Portugal", code: "PT" },
249
- { name: "Russia", code: "RU" },
250
- { name: "Saudi Arabia", code: "SA" },
251
- { name: "Singapore", code: "SG" },
252
- { name: "South Africa", code: "ZA" },
253
- { name: "South Korea", code: "KR" },
254
- { name: "Spain", code: "ES" },
255
- { name: "Sweden", code: "SE" },
256
- { name: "Switzerland", code: "CH" },
257
- { name: "Thailand", code: "TH" },
258
- { name: "Turkey", code: "TR" },
259
- { name: "Ukraine", code: "UA" },
260
- { name: "United Arab Emirates", code: "AE" },
261
- { name: "United Kingdom", code: "GB" },
262
- { name: "United States", code: "US" },
263
- { name: "Vietnam", code: "VN" },
264
- ];
265
- const countryList = countries.length > 0 ? countries : defaultCountries;
266
- const options = countryList.map((country) => ({
267
- value: country.name,
268
- label: country.name,
269
- }));
270
- return (React.createElement(EnhancedCombobox, { options: options, value: value, onValueChange: onValueChange, onSearchChange: onSearchChange, placeholder: placeholder, searchPlaceholder: "Search countries...", emptyText: "No countries found.", loading: loading, className: className, maxHeight: maxHeight, showScrollIndicators: showScrollIndicators, virtualizeThreshold: 30, label: label, required: required, id: id, info: info, error: error }));
271
- }
1
+ "use strict";"use client";import e,{useState as y,useRef as W,useEffect as U,useCallback as ee}from"react";import{Check as V,ChevronsUpDown as te,ChevronUp as ae,ChevronDown as ne}from"lucide-react";import{cn as H}from"../lib/utils";import{Button as oe}from"./ui/button";import{EnhancedLabel as re}from"./enhanced-label";import{Command as le,CommandEmpty as ce,CommandGroup as se,CommandInput as me,CommandItem as G}from"./ui/command";import{Popover as de,PopoverContent as ie,PopoverTrigger as ue}from"./ui/popover";function he({options:n,selectedValue:E,onSelect:S,scrollContainer:r,testIdOptionPrefix:i}){const[b,f]=y({start:0,end:Math.min(n.length,25)}),u=ee(()=>{if(!r.current)return;const{scrollTop:a,clientHeight:o}=r.current,m=32,c=o,d=Math.max(0,Math.floor(a/m)),w=Math.ceil(c/m),C=Math.min(10,Math.ceil(w*.5)),R=Math.min(n.length,d+w+C),N={start:Math.max(0,d-C),end:R};f(x=>x.start!==N.start||x.end!==N.end?N:x)},[n.length,r]);U(()=>{const a=r.current;if(a){a.addEventListener("scroll",u,{passive:!0});let o=a.parentElement;const m=()=>u();for(;o;){const c=getComputedStyle(o).overflowY;if(c==="auto"||c==="scroll"){o.addEventListener("scroll",m,{passive:!0});break}o=o.parentElement}return()=>{a.removeEventListener("scroll",u),o&&o.removeEventListener("scroll",m)}}},[u,r]),U(()=>{const a=Math.min(n.length,25);f(()=>({start:0,end:a})),r.current&&(r.current.scrollTop=0)},[n.length,n,r]);const h=Math.max(0,Math.min(b.start,n.length-1)),s=Math.max(h+1,Math.min(b.end,n.length)),p=n.slice(h,s),l=h*32,v=Math.max(0,(n.length-s)*32);return e.createElement(e.Fragment,null,l>0&&e.createElement("div",{style:{height:l}}),p.map((a,o)=>e.createElement(G,{key:`${a.value}-${h+o}`,value:a.label,onSelect:()=>S(a.value),"data-testid":`${i??"combobox-option"}-${a.value}`,className:"cursor-pointer hover:bg-accent hover:text-accent-foreground transition-colors h-8 flex items-center"},e.createElement(V,{className:H("mr-2 h-4 w-4",E===a.value?"opacity-100":"opacity-0")}),e.createElement("span",{className:"truncate"},a.label))),v>0&&e.createElement("div",{style:{height:v}}))}export function EnhancedCombobox({className:n,disabled:E=!1,emptyText:S="No options found.",error:r,id:i,info:b,label:f,loading:u=!1,maxHeight:h=256,onSearchChange:s,onValueChange:p,options:l=[],placeholder:v="Select option...",required:a=!1,searchPlaceholder:o="Search...",showScrollIndicators:m=!0,value:c,virtualizeThreshold:d=50,testIdTrigger:w,testIdSearchInput:C,testIdPopoverContent:R,testIdEmpty:N,testIdList:x,testIdOptionPrefix:A,testIdScrollUp:K,testIdScrollDown:$}){const[T,D]=y(!1),[k,P]=y(""),[O,q]=y(!1),[J,Z]=y(!1),g=W(null),M=l.find(t=>t.value===c),I=l.length>d,L=e.useMemo(()=>!k||s&&I||s&&!I?l:l.filter(t=>t.label.toLowerCase().includes(k.toLowerCase())),[l,k,s,I]),_=t=>{P(t),s?.(t)},z=t=>{p(t===c?"":t),D(!1),P("")},B=()=>{if(!g.current)return;const{scrollTop:t,scrollHeight:Q,clientHeight:X}=g.current;q(t>0),Z(t<Q-X-1)};U(()=>{T&&setTimeout(B,10)},[T,l]);const j=()=>{var t;(t=g.current)===null||t===void 0||t.scrollTo({top:0,behavior:"smooth"})},Y=()=>{if(!g.current)return;const{scrollHeight:t}=g.current;g.current.scrollTo({top:t,behavior:"smooth"})},F=e.createElement(de,{open:T,onOpenChange:D,modal:!0},e.createElement(ue,{asChild:!0},e.createElement(oe,{id:i,"data-testid":w,variant:"outline",role:"combobox","aria-expanded":T,disabled:E,className:H("w-full justify-between",!M&&"text-muted-foreground",n)},M?.label||v,e.createElement(te,{className:"ml-2 h-4 w-4 shrink-0 opacity-50"}))),e.createElement(ie,{"data-testid":R,className:"w-[var(--radix-popover-trigger-width)] p-0",side:"bottom",align:"start",avoidCollisions:!0,collisionPadding:8,style:{zIndex:1e3},onOpenAutoFocus:t=>t.preventDefault()},e.createElement(le,{shouldFilter:!1},e.createElement(me,{"data-slot":"command-input","data-testid":C,placeholder:o,value:k,onValueChange:_}),e.createElement(ce,{"data-slot":"command-empty","data-testid":N},u?e.createElement("div",{className:"flex items-center justify-center py-6"},e.createElement("div",{className:"animate-spin rounded-full h-4 w-4 border-b-2 border-primary"}),e.createElement("span",{className:"ml-2 text-sm"},"Searching...")):S),e.createElement("div",{className:"relative"},m&&O&&e.createElement("div",{className:"absolute top-0 left-0 right-0 z-10 h-8 bg-gradient-to-b from-background to-transparent pointer-events-none"},e.createElement("button",{"data-testid":K,onClick:j,className:"absolute top-1 left-1/2 transform -translate-x-1/2 p-1 rounded-full bg-background shadow-sm border pointer-events-auto hover:bg-muted transition-colors","aria-label":"Scroll to top"},e.createElement(ae,{className:"h-3 w-3"}))),e.createElement(se,{"data-testid":x,ref:g,className:H("overflow-y-auto smooth-scroll","scrollbar-thin scrollbar-thumb-muted-foreground/20 scrollbar-track-transparent hover:scrollbar-thumb-muted-foreground/40","scroll-smooth",L.length>10&&"pb-2"),style:{maxHeight:`${h}px`},onScroll:B},I&&L.length>d?e.createElement(he,{options:L,selectedValue:c,onSelect:z,scrollContainer:g,testIdOptionPrefix:A}):L.map(t=>e.createElement(G,{key:t.value,value:t.label,onSelect:()=>z(t.value),"data-testid":`${A??"combobox-option"}-${t.value}`,className:"cursor-pointer hover:bg-accent hover:text-accent-foreground transition-colors"},e.createElement(V,{className:H("mr-2 h-4 w-4",c===t.value?"opacity-100":"opacity-0")}),e.createElement("span",{className:"truncate"},t.label)))),m&&J&&e.createElement("div",{className:"absolute bottom-0 left-0 right-0 z-10 h-8 bg-gradient-to-t from-background to-transparent pointer-events-none"},e.createElement("button",{"data-testid":$,onClick:Y,className:"absolute bottom-1 left-1/2 transform -translate-x-1/2 p-1 rounded-full bg-background shadow-sm border pointer-events-auto hover:bg-muted transition-colors","aria-label":"Scroll to bottom"},e.createElement(ne,{className:"h-3 w-3"})))))));return f?e.createElement("div",{className:"w-full space-y-2"},e.createElement(re,{htmlFor:i,required:a},f),F,r&&e.createElement("p",{className:"text-xs text-destructive dark:text-red-400"},r),b&&!r&&e.createElement("p",{className:"text-xs text-blue-600 dark:text-blue-400"},b)):F}export function CompanyCombobox({companies:n=[],value:E,onValueChange:S,onSearchChange:r,loading:i=!1,placeholder:b="Select company...",className:f,maxHeight:u=320,showScrollIndicators:h=!0,label:s,required:p=!1,id:l,info:v,error:a}){const o=n.map(m=>{var c,d;return{value:((c=m.id)===null||c===void 0?void 0:c.toString())||"",label:m.name,id:(d=m.id)===null||d===void 0?void 0:d.toString()}});return e.createElement(EnhancedCombobox,{options:o,value:E,onValueChange:S,onSearchChange:r,placeholder:b,searchPlaceholder:"Search companies...",emptyText:"No companies found.",loading:i,className:f,maxHeight:u,showScrollIndicators:h,virtualizeThreshold:100,label:s,required:p,id:l,info:v,error:a})}export function CountryCombobox({countries:n=[],value:E,onValueChange:S,onSearchChange:r,loading:i=!1,placeholder:b="Select country...",className:f,maxHeight:u=280,showScrollIndicators:h=!0,label:s,required:p=!1,id:l,info:v,error:a}){const o=[{name:"Afghanistan",code:"AF"},{name:"Albania",code:"AL"},{name:"Algeria",code:"DZ"},{name:"Argentina",code:"AR"},{name:"Australia",code:"AU"},{name:"Austria",code:"AT"},{name:"Bangladesh",code:"BD"},{name:"Belgium",code:"BE"},{name:"Brazil",code:"BR"},{name:"Canada",code:"CA"},{name:"China",code:"CN"},{name:"Denmark",code:"DK"},{name:"Egypt",code:"EG"},{name:"Finland",code:"FI"},{name:"France",code:"FR"},{name:"Germany",code:"DE"},{name:"Greece",code:"GR"},{name:"India",code:"IN"},{name:"Indonesia",code:"ID"},{name:"Iran",code:"IR"},{name:"Iraq",code:"IQ"},{name:"Ireland",code:"IE"},{name:"Israel",code:"IL"},{name:"Italy",code:"IT"},{name:"Japan",code:"JP"},{name:"Jordan",code:"JO"},{name:"Kenya",code:"KE"},{name:"Malaysia",code:"MY"},{name:"Mexico",code:"MX"},{name:"Netherlands",code:"NL"},{name:"New Zealand",code:"NZ"},{name:"Nigeria",code:"NG"},{name:"Norway",code:"NO"},{name:"Pakistan",code:"PK"},{name:"Philippines",code:"PH"},{name:"Poland",code:"PL"},{name:"Portugal",code:"PT"},{name:"Russia",code:"RU"},{name:"Saudi Arabia",code:"SA"},{name:"Singapore",code:"SG"},{name:"South Africa",code:"ZA"},{name:"South Korea",code:"KR"},{name:"Spain",code:"ES"},{name:"Sweden",code:"SE"},{name:"Switzerland",code:"CH"},{name:"Thailand",code:"TH"},{name:"Turkey",code:"TR"},{name:"Ukraine",code:"UA"},{name:"United Arab Emirates",code:"AE"},{name:"United Kingdom",code:"GB"},{name:"United States",code:"US"},{name:"Vietnam",code:"VN"}],c=(n.length>0?n:o).map(d=>({value:d.name,label:d.name}));return e.createElement(EnhancedCombobox,{options:c,value:E,onValueChange:S,onSearchChange:r,placeholder:b,searchPlaceholder:"Search countries...",emptyText:"No countries found.",loading:i,className:f,maxHeight:u,showScrollIndicators:h,virtualizeThreshold:30,label:s,required:p,id:l,info:v,error:a})}
@@ -1,30 +1 @@
1
- import { Button } from "./ui/button";
2
- import React from "react";
3
- export var DRAWER_FOOTER_COMPONENT_TYPE;
4
- (function (DRAWER_FOOTER_COMPONENT_TYPE) {
5
- DRAWER_FOOTER_COMPONENT_TYPE["MORE_ACTIONS_DRAWER"] = "MORE_ACTIONS_DRAWER";
6
- DRAWER_FOOTER_COMPONENT_TYPE["FILTER_DRAWER"] = "FILTER_DRAWER";
7
- DRAWER_FOOTER_COMPONENT_TYPE["FORM_DRAWER"] = "FORM_DRAWER";
8
- DRAWER_FOOTER_COMPONENT_TYPE["VIEW_DRAWER"] = "VIEW_DRAWER";
9
- })(DRAWER_FOOTER_COMPONENT_TYPE || (DRAWER_FOOTER_COMPONENT_TYPE = {}));
10
- export const EnhancedDrawerFooter = ({ applyFilters, clearFilters, closeDrawer, disableSaveButton, drawerType, errors, handleSubmit, updateLoading, }) => {
11
- const componentMap = {
12
- [DRAWER_FOOTER_COMPONENT_TYPE.MORE_ACTIONS_DRAWER]: (React.createElement(React.Fragment, null,
13
- React.createElement("div", { className: "flex gap-2" },
14
- React.createElement(Button, { className: "flex-1", onClick: clearFilters, variant: "outline" }, "Close")))),
15
- [DRAWER_FOOTER_COMPONENT_TYPE.FILTER_DRAWER]: (React.createElement(React.Fragment, null,
16
- React.createElement("div", { className: "flex gap-2" },
17
- React.createElement(Button, { className: "flex-1", onClick: clearFilters, variant: "outline" }, "Clear All"),
18
- React.createElement(Button, { className: "flex-1", onClick: applyFilters }, "Apply Filters")))),
19
- [DRAWER_FOOTER_COMPONENT_TYPE.FORM_DRAWER]: (React.createElement(React.Fragment, null,
20
- React.createElement("div", { className: "flex gap-2" },
21
- React.createElement(Button, { className: "flex-1", onClick: closeDrawer, variant: "outline" }, "Cancel"),
22
- React.createElement(Button, { className: "flex-1", onClick: handleSubmit, variant: "default", disabled: updateLoading ||
23
- disableSaveButton ||
24
- (errors && Object.keys(errors).length > 0) }, "Save")))),
25
- [DRAWER_FOOTER_COMPONENT_TYPE.VIEW_DRAWER]: (React.createElement(React.Fragment, null,
26
- React.createElement("div", { className: "flex gap-2" },
27
- React.createElement(Button, { className: "flex-1", onClick: closeDrawer }, "Close")))),
28
- };
29
- return React.createElement(React.Fragment, null, componentMap[drawerType]);
30
- };
1
+ "use strict";import{Button as a}from"./ui/button";import e from"react";export var DRAWER_FOOTER_COMPONENT_TYPE;(function(l){l.MORE_ACTIONS_DRAWER="MORE_ACTIONS_DRAWER",l.FILTER_DRAWER="FILTER_DRAWER",l.FORM_DRAWER="FORM_DRAWER",l.VIEW_DRAWER="VIEW_DRAWER"})(DRAWER_FOOTER_COMPONENT_TYPE||(DRAWER_FOOTER_COMPONENT_TYPE={}));export const EnhancedDrawerFooter=({applyFilters:l,clearFilters:t,closeDrawer:n,disableSaveButton:m,drawerType:r,errors:c,handleSubmit:E,updateLoading:R})=>{const s={[DRAWER_FOOTER_COMPONENT_TYPE.MORE_ACTIONS_DRAWER]:e.createElement(e.Fragment,null,e.createElement("div",{className:"flex gap-2"},e.createElement(a,{className:"flex-1",onClick:t,variant:"outline"},"Close"))),[DRAWER_FOOTER_COMPONENT_TYPE.FILTER_DRAWER]:e.createElement(e.Fragment,null,e.createElement("div",{className:"flex gap-2"},e.createElement(a,{className:"flex-1",onClick:t,variant:"outline"},"Clear All"),e.createElement(a,{className:"flex-1",onClick:l},"Apply Filters"))),[DRAWER_FOOTER_COMPONENT_TYPE.FORM_DRAWER]:e.createElement(e.Fragment,null,e.createElement("div",{className:"flex gap-2"},e.createElement(a,{className:"flex-1",onClick:n,variant:"outline"},"Cancel"),e.createElement(a,{className:"flex-1",onClick:E,variant:"default",disabled:R||m||c&&Object.keys(c).length>0},"Save"))),[DRAWER_FOOTER_COMPONENT_TYPE.VIEW_DRAWER]:e.createElement(e.Fragment,null,e.createElement("div",{className:"flex gap-2"},e.createElement(a,{className:"flex-1",onClick:n},"Close")))};return e.createElement(e.Fragment,null,s[r])};
@@ -1,7 +1 @@
1
- import { DrawerDescription, DrawerTitle } from "./ui/drawer";
2
- import React from "react";
3
- export const EnhancedDrawerHeader = ({ title, description, }) => {
4
- return (React.createElement(React.Fragment, null,
5
- React.createElement(DrawerTitle, null, title),
6
- React.createElement(DrawerDescription, null, description)));
7
- };
1
+ "use strict";import{DrawerDescription as n,DrawerTitle as a}from"./ui/drawer";import e from"react";export const EnhancedDrawerHeader=({title:r,description:t})=>e.createElement(e.Fragment,null,e.createElement(a,null,r),e.createElement(n,null,t));