@mendylanda/ui 0.1.0 → 0.1.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.
package/README.md CHANGED
@@ -47,3 +47,13 @@ Customize with named `classNames`, typed option/editor/summary renderers, `Mendy
47
47
  - [Source and releases](https://github.com/MendyLanda/mendy-ui)
48
48
 
49
49
  Update the dependency and redeploy a project to receive shared fixes. MIT licensed. Shadcn attribution is included in the package.
50
+
51
+ ### Chip and menu presentation
52
+
53
+ Use `chipLabel: false` when the selected values explain themselves. A string such as `chipLabel: "SIM"` shortens the visible label while retaining the field's full accessible name. `renderSummary` supplies custom chip content independently of `renderOption`.
54
+
55
+ `FilterMenuGroup.separatorBefore` separates related categories. Within a group, `menuLayout: "inline"` puts a field's editor beside its label. Custom editors can set `editorPadding: "none"` when they own their spacing. Honor the `autoFocus` value supplied to `renderEditor`: it is false during menu previews, and the menu moves focus on click or keyboard activation.
56
+
57
+ `<MendyUIProvider menuLayout="anchored">` positions desktop editors beside the selected row at their own height. The default remains `connected`. Both use the single-panel mobile layout. A standalone `<FilterMenu anchor={searchRef}>` can align to a custom search field. The menu grows to the available viewport height, capped by `--mendy-filter-menu-max-height`, which defaults to `44rem`; large lists remain virtualized.
58
+
59
+ Chips enter with a short, staggered Motion spring. Reduced-motion preferences disable their movement. Theme radius still controls their corners.
@@ -1 +1 @@
1
- export const originalClassNames = {"mui-33228ff7d583":"pointer-events-none","mui-b75af7ef6c4d":"invisible","mui-d42ef1497900":"visible","mui-32fb090591d9":"sr-only","mui-747355bdc2a2":"absolute","mui-d2d9e1f13413":"relative","mui-ce13093ad8c9":"inset-0","mui-3ba24c062d55":"inset-x-0","mui-cced28c6dc3f":"start","mui-361e48d0308f":"end","mui-98599e4ee250":"top-0","mui-4e45f4841abb":"top-1/2","mui-71fb77dd8ea7":"right-1","mui-5a6edca9f43a":"right-8","mui-5b9fdf1819c4":"left-2","mui-ea31f8b3a958":"left-3","mui-866c339ea145":"left-4","mui-3eef1ce97dba":"z-50","mui-a42d519714d6":"container","mui-abba77319850":"-mx-1","mui-d8747231f142":"my-1","mui-f28fea81a5cd":"mt-2","mui-9b2a4c5f630c":"-ml-2","mui-cc51bda60e7e":"ml-auto","mui-496aca80e4d8":"block","mui-222f930b8752":"flex","mui-0f2a693e93e2":"grid","mui-e564b4081d7a":"hidden","mui-995cf20a9c45":"inline","mui-123306850fe1":"inline-flex","mui-3da89b3ed14b":"field-sizing-content","mui-129d6f9b1e07":"aspect-square","mui-f7d12b41bceb":"size-(--cell-size)","mui-dc797fcc7165":"size-1.5","mui-9e7600197f38":"size-2","mui-61c000c8a98a":"size-3.5","mui-100c22d5776b":"size-4","mui-0712570dcc9f":"size-6","mui-79ede756e761":"size-7","mui-ebd37e04d422":"size-8","mui-3ee10ef4c057":"size-9","mui-d0a383a9c24f":"size-10","mui-9104ce433bba":"size-[15px]","mui-3c7e3f82f336":"size-[17px]","mui-4dad94bd15e3":"size-auto","mui-a5960ac1d283":"h-(--cell-size)","mui-ce1945804664":"h-6","mui-1fb07b38c63b":"h-8","mui-539ae144f076":"h-9","mui-fdd2f85cad6b":"h-10","mui-a66e9985b093":"h-auto","mui-57c930dc1c31":"h-full","mui-ae2c4b060bb9":"h-px","mui-571ea69568d3":"max-h-(--filter-menu-height)","mui-1f061e70178e":"max-h-(--radix-dropdown-menu-content-available-height)","mui-dcd942c18ddc":"max-h-[var(--radix-dropdown-menu-content-available-height)]","mui-410da8dfa8ac":"min-h-0","mui-9974acedf3f7":"min-h-9","mui-8423dc94ee06":"min-h-10","mui-50312c3ce4a3":"min-h-[60px]","mui-d48fe95d4da8":"w-(--cell-size)","mui-8867d85ed290":"w-8","mui-72b37c1a040d":"w-64","mui-37535002f0f7":"w-72","mui-a4cce7869436":"w-[300px]","mui-9958eb2b312a":"w-[var(--mendy-filter-menu-width,512px)]","mui-8cfb5a42ef9f":"w-fit","mui-58d0413dd93c":"w-full","mui-a5c6864f064f":"max-w-[calc(100vw-1.5rem)]","mui-34055e6f8c1b":"max-w-[calc(100vw-2rem)]","mui-81b198a2db84":"max-w-full","mui-1458e495e3ae":"min-w-(--cell-size)","mui-184ddc11e5f9":"min-w-0","mui-e9ab1547c94d":"min-w-[8rem]","mui-7bd5bab6d7f4":"flex-1","mui-66b490dd6005":"shrink","mui-27ead27a81df":"shrink-0","mui-215061302c50":"border-collapse","mui-3a3774477287":"origin-(--radix-dropdown-menu-content-transform-origin)","mui-5dde0fd996f0":"-translate-y-1/2","mui-393df0d154e0":"animate-none!","mui-7b3cd77eb999":"animate-pulse","mui-d343f41ba73e":"cursor-default","mui-acd532d8913e":"resize","mui-50f2bcd37640":"grid-cols-[var(--mendy-filter-list-width,208px)_minmax(0,1fr)]","mui-302c0d124a94":"flex-col","mui-faa8a23c68f6":"flex-wrap","mui-8fd2e2355cbc":"place-content-center","mui-71556df3b421":"items-center","mui-32c92bb1fde4":"justify-between","mui-a503dd374cca":"justify-center","mui-c62ec162662e":"justify-start","mui-19e97f3f40e6":"gap-1","mui-70007b876865":"gap-1.5","mui-074569488cca":"gap-2","mui-90fc3ec35a37":"gap-4","mui-27e6c432192f":"space-y-1","mui-267171770524":"space-y-2","mui-5a3a4ee420c2":"truncate","mui-d5111d0e9f48":"overflow-hidden","mui-3b82279f859f":"overflow-x-hidden","mui-2368e909f3a5":"overflow-y-auto","mui-998780cdef87":"overscroll-contain","mui-b005d61d0953":"rounded-full","mui-3fa8c572949b":"rounded-md","mui-52417259a4f5":"rounded-none","mui-02e603944040":"rounded-sm","mui-10c0bae8cba9":"rounded-l-md","mui-34bbd346e74c":"rounded-r-md","mui-4f1a55de40bc":"border","mui-894c3815a57f":"border-t","mui-baf794b99c10":"border-r","mui-bbe39cfb5cc6":"border-b","mui-8d940fccb093":"border-l","mui-8450eb0f1857":"border-dashed","mui-163a623b3716":"border-border/50","mui-1267095cdeb7":"border-input","mui-9b76f456b8c9":"border-muted-foreground/50","mui-292affc1f780":"bg-accent","mui-5b272f3c5076":"bg-background","mui-a943bea85d66":"bg-border","mui-0cf6c2e8fe7e":"bg-current","mui-965cf6587342":"bg-destructive","mui-e593c38256e0":"bg-popover","mui-0c2864fba576":"bg-primary","mui-d191cb569aac":"bg-secondary","mui-8fca9236d191":"bg-transparent","mui-717b342c2d01":"fill-current","mui-04760bcd507f":"p-0","mui-1dee6e3ec67d":"p-1","mui-b97db4a9f432":"p-2","mui-094f5333853b":"p-3","mui-56b8f5e0fb12":"px-(--cell-size)","mui-1da2e8f173c5":"px-1.5","mui-e7e01cc7f4df":"px-2","mui-0f9e6672913a":"px-3","mui-9513b3968002":"px-4","mui-0194c6e46323":"px-8","mui-1fcf28756bb1":"py-1","mui-a8c1dfb1d4ef":"py-1.5","mui-b5edc3ea7c91":"py-2","mui-0a702d97ed7d":"pt-3","mui-1a52da5bc88c":"pr-1","mui-98a5b6fff1d2":"pr-2","mui-0359a07b64f9":"pr-9","mui-83ffc494bac4":"pr-16","mui-f5d8e661d857":"pl-2","mui-75b27e813dcc":"pl-8","mui-86486d7e416f":"pl-9","mui-05ab12448317":"text-center","mui-1a5d10977b93":"text-left","mui-757071a1d1c4":"text-base","mui-c74ab393b96d":"text-sm","mui-3992de70b033":"text-xs","mui-5f120ad4b50b":"text-[0.8rem]","mui-761cdb81bddb":"leading-none","mui-daaac3fbf55e":"font-medium","mui-52101fc7d8bb":"font-normal","mui-e1683b3c030a":"tracking-widest","mui-393883c1db68":"[overflow-wrap:anywhere]","mui-37cf9655f30a":"break-words","mui-726fca123972":"whitespace-normal","mui-963f6168b7d6":"whitespace-nowrap","mui-cc209238d847":"text-accent-foreground","mui-5eafab9bbefc":"text-current","mui-887b9502d5c7":"text-destructive","mui-8d4bf2704c8d":"text-destructive-foreground","mui-35f35c41d134":"text-muted-foreground","mui-5bd2afe89f0b":"text-popover-foreground","mui-249f14ee5b6b":"text-primary","mui-abd1aaa1f5b2":"text-primary-foreground","mui-80df79ec9bb5":"text-secondary-foreground","mui-944969efb294":"underline","mui-d52f902a57e8":"underline-offset-4","mui-94f91922a10e":"opacity-0","mui-0b5a4d1257ab":"opacity-50","mui-65694092f002":"opacity-100","mui-0d4ca75de41c":"shadow-lg","mui-94ea94fde25f":"shadow-md","mui-7de07d413c13":"shadow-xs","mui-59edd3d33673":"outline-hidden","mui-318678825324":"outline","mui-dfc3376b8266":"filter","mui-eae178841c68":"transition-colors","mui-2cdd01663c76":"transition-opacity","mui-2b48746f4314":"transition-shadow","mui-b4b2fd95f324":"transition-none","mui-b30fc56058b6":"outline-none","mui-78905c9e865c":"select-none","mui-d80b6593dae5":"[--cell-size:--spacing(8)]","mui-981e5fc95664":"[--filter-menu-height:min(480px,var(--radix-dropdown-menu-content-available-height))]","mui-9af9a4182597":"group-data-[disabled=true]:pointer-events-none","mui-ad936fcbed63":"group","mui-272ef88d6a0c":"group-data-[disabled=true]:opacity-50","mui-60052b901494":"group-data-[focused=true]/day:relative","mui-d9c5891363f9":"group/day","mui-3f96bf138f7b":"group-data-[focused=true]/day:z-10","mui-d39eb62b8363":"group-data-[focused=true]/day:border-ring","mui-47cbd20a4dc0":"group-data-[focused=true]/day:ring-[3px]","mui-4eb7d653ae35":"group-data-[focused=true]/day:ring-ring/50","mui-f0ee83167878":"peer-disabled:cursor-not-allowed","mui-2ffc1d06387e":"peer","mui-25d26df52a1d":"peer-disabled:opacity-50","mui-32713fefe32f":"file:border-0","mui-25a74d576c42":"file:bg-transparent","mui-844abccf1fd0":"file:text-sm","mui-dc43de54f42a":"file:font-medium","mui-20315da78444":"placeholder:text-muted-foreground","mui-4fa4c190281c":"first:border-t-0","mui-37ad15a95595":"hover:bg-accent","mui-bb6a4b3e902d":"hover:bg-destructive/90","mui-af9ea085901b":"hover:bg-primary/90","mui-099700a5a311":"hover:bg-secondary/80","mui-71863717995b":"hover:bg-transparent","mui-9f1f77b92dcb":"hover:text-accent-foreground","mui-4d6720d47806":"hover:text-foreground","mui-b56720602554":"hover:underline","mui-8da02faac748":"hover:opacity-100","mui-a8c1861c5d03":"focus:bg-accent","mui-a85c4c5d7465":"focus:text-accent-foreground","mui-b906a32b31ee":"focus-visible:border-ring","mui-39be5a15b766":"focus-visible:ring-1","mui-355efe22aedb":"focus-visible:ring-2","mui-365a4654f7b1":"focus-visible:ring-[3px]","mui-db549d38ff19":"focus-visible:ring-ring","mui-392a26f4c1b0":"focus-visible:ring-ring/50","mui-2e357972fc10":"focus-visible:outline-none","mui-50aafa8694bb":"focus-visible:ring-inset","mui-8d3c1014b967":"disabled:pointer-events-none","mui-db567af109b7":"disabled:cursor-not-allowed","mui-4600b77303d6":"disabled:opacity-50","mui-7eb7501a2ef0":"has-focus:border-ring","mui-d0449753ba7b":"has-focus:ring-[3px]","mui-fc19c8471f34":"has-focus:ring-ring/50","mui-e288cffc2ef4":"has-[>svg]:px-1.5","mui-3b01ee05b16d":"has-[>svg]:px-2.5","mui-9e08353b774f":"has-[>svg]:px-3","mui-2c0115d1c32a":"aria-disabled:opacity-50","mui-1fac1d7d1df3":"aria-invalid:border-destructive","mui-2d91b4cbc3cb":"aria-invalid:ring-destructive","mui-5491fd0b4dc5":"aria-invalid:ring-destructive/20","mui-7d900a71e5ba":"aria-selected:text-muted-foreground","mui-397f5ba426a0":"data-[disabled]:pointer-events-none","mui-9beb654fcb0d":"data-[disabled]:opacity-50","mui-6fa6a8ade7c4":"data-[inset]:pl-8","mui-96308b55e0d6":"data-[range-end=true]:rounded-md","mui-a55dbe6f3eec":"data-[range-end=true]:rounded-r-md","mui-714051e55e8e":"data-[range-end=true]:bg-primary","mui-c764cebcd540":"data-[range-end=true]:text-primary-foreground","mui-05ec0700cd48":"data-[range-middle=true]:rounded-none","mui-5fb598fb06f4":"data-[range-middle=true]:bg-accent","mui-0813905aa141":"data-[range-middle=true]:text-accent-foreground","mui-8020e31bff67":"data-[range-start=true]:rounded-md","mui-ab65911baf1d":"data-[range-start=true]:rounded-l-md","mui-f5460d79341c":"data-[range-start=true]:bg-primary","mui-421a7d3e6631":"data-[range-start=true]:text-primary-foreground","mui-a39af81d518c":"data-[selected-single=true]:bg-primary","mui-b6991ab170de":"data-[selected-single=true]:text-primary-foreground","mui-3cc0d07ef843":"data-[selected=true]:rounded-none","mui-89f6aab7a3f8":"data-[side=bottom]:slide-in-from-top-2","mui-3550f48d66b9":"data-[side=left]:slide-in-from-right-2","mui-7720fe004f5c":"data-[side=right]:slide-in-from-left-2","mui-66b560f839de":"data-[side=top]:slide-in-from-bottom-2","mui-20553d55d224":"data-[state=checked]:border-primary","mui-57d6d6401a2f":"data-[state=checked]:bg-primary","mui-7ca12016214f":"data-[state=checked]:text-primary-foreground","mui-37d8a3f448ff":"data-[state=closed]:animate-none!","mui-0cb4489c3645":"data-[state=closed]:animate-out","mui-bb5869ef903b":"data-[state=closed]:fade-out-0","mui-f4cf4be63707":"data-[state=closed]:zoom-out-95","mui-bae1e782f277":"data-[state=open]:animate-in","mui-4027d9c589b6":"data-[state=open]:bg-accent","mui-1952cd5b00aa":"data-[state=open]:text-accent-foreground","mui-6f73a280432e":"data-[state=open]:text-foreground","mui-790ed041a953":"data-[state=open]:opacity-100","mui-45464a92c1f6":"data-[state=open]:fade-in-0","mui-9ca352480f25":"data-[state=open]:zoom-in-95","mui-f3f7a9c5e1b3":"data-[variant=destructive]:text-destructive","mui-e2bb4ac97190":"data-[variant=destructive]:focus:bg-destructive/10","mui-353a727facfd":"data-[variant=destructive]:focus:text-destructive","mui-5e49f8678d00":"motion-safe:animate-in","mui-b225f0361d28":"motion-safe:duration-200","mui-3bc474178684":"motion-safe:fade-in-0","mui-bc94a66158a3":"motion-safe:fill-mode-backwards","mui-237747164b60":"motion-reduce:animate-none","mui-8c14b4d2e932":"sm:w-[350px]","mui-56760b222da0":"md:flex-row","mui-c05c9b99939d":"md:text-sm","mui-36b12e8339c7":"rtl:rotate-180","mui-9daa2369a41b":"dark:bg-input/30","mui-b2786f463a62":"dark:hover:text-accent-foreground","mui-c88f65aa011e":"dark:aria-invalid:ring-destructive/40","mui-bd73d819941e":"dark:data-[state=checked]:bg-primary","mui-98a28c2293f7":"dark:data-[variant=destructive]:focus:bg-destructive/20","mui-548a450e8e53":"[&_*]:transition-none!","mui-a1c8c43d9be2":"[&_[role^=menuitem]]:min-h-9","mui-bcae9d37090c":"[&_svg]:pointer-events-none","mui-c77732bd3ab4":"[&_svg]:size-3.5","mui-040e748a3fa0":"[&_svg]:shrink-0","mui-be87a4a64d81":"[&_svg:not([class*='size-'])]:size-3","mui-eb5ef2dbc2d4":"[&_svg:not([class*='size-'])]:size-4","mui-8637dfd54fbb":"[&_svg:not([class*='text-'])]:text-muted-foreground","mui-4f05a238500e":"[&::-webkit-search-cancel-button]:appearance-none","mui-74ab31abd804":"[&:first-child[data-selected=true]_button]:rounded-l-md","mui-13858191ca50":"rtl:**:[.rdp-button\\_next>svg]:rotate-180","mui-a324a7f99932":"rtl:**:[.rdp-button\\_previous>svg]:rotate-180","mui-82b114bbff3d":"data-[variant=destructive]:*:[svg]:text-destructive!","mui-6ee0c74de40c":"[&:last-child[data-selected=true]_button]:rounded-r-md","mui-6162ab70efb5":"[&:nth-child(2)[data-selected=true]_button]:rounded-l-md","mui-f157ee6bae99":"[&>div]:w-full","mui-ba417cf466b0":"[&>span]:text-xs","mui-829c8ef4f9c5":"[&>span]:opacity-70","mui-eb740dd32318":"[&>svg]:size-3.5","mui-019fd73c95db":"[&>svg]:text-muted-foreground","mui-b8293c91796c":"[[data-slot=card-content]_&]:bg-transparent","mui-8dd7e6b42262":"[[data-slot=popover-content]_&]:bg-transparent"};
1
+ export const originalClassNames = {"mui-33228ff7d583":"pointer-events-none","mui-b75af7ef6c4d":"invisible","mui-d42ef1497900":"visible","mui-32fb090591d9":"sr-only","mui-747355bdc2a2":"absolute","mui-d2d9e1f13413":"relative","mui-ce13093ad8c9":"inset-0","mui-3ba24c062d55":"inset-x-0","mui-cced28c6dc3f":"start","mui-207bd0b3f259":"start-2","mui-cea70f23972e":"start-3","mui-96a350bd3168":"start-4","mui-361e48d0308f":"end","mui-13422ddc8d83":"end-1","mui-585f4729f611":"end-9","mui-98599e4ee250":"top-0","mui-4e45f4841abb":"top-1/2","mui-866c339ea145":"left-4","mui-3eef1ce97dba":"z-50","mui-a42d519714d6":"container","mui-a2526bc2efa3":"m-0","mui-abba77319850":"-mx-1","mui-1752f11474a6":"mx-auto","mui-d8747231f142":"my-1","mui-958e2cfcf5b6":"-ms-2","mui-8cc46fa87f41":"-me-1.5","mui-f28fea81a5cd":"mt-2","mui-cc51bda60e7e":"ml-auto","mui-496aca80e4d8":"block","mui-222f930b8752":"flex","mui-0f2a693e93e2":"grid","mui-e564b4081d7a":"hidden","mui-995cf20a9c45":"inline","mui-123306850fe1":"inline-flex","mui-3da89b3ed14b":"field-sizing-content","mui-129d6f9b1e07":"aspect-square","mui-f7d12b41bceb":"size-(--cell-size)","mui-dc797fcc7165":"size-1.5","mui-9e7600197f38":"size-2","mui-61c000c8a98a":"size-3.5","mui-100c22d5776b":"size-4","mui-0712570dcc9f":"size-6","mui-79ede756e761":"size-7","mui-ebd37e04d422":"size-8","mui-3ee10ef4c057":"size-9","mui-d0a383a9c24f":"size-10","mui-4dad94bd15e3":"size-auto","mui-a5960ac1d283":"h-(--cell-size)","mui-ce1945804664":"h-6","mui-1fb07b38c63b":"h-8","mui-539ae144f076":"h-9","mui-fdd2f85cad6b":"h-10","mui-a66e9985b093":"h-auto","mui-57c930dc1c31":"h-full","mui-ae2c4b060bb9":"h-px","mui-571ea69568d3":"max-h-(--filter-menu-height)","mui-1f061e70178e":"max-h-(--radix-dropdown-menu-content-available-height)","mui-80baa5d03af7":"max-h-[calc(var(--filter-menu-height)-2px)]","mui-1326520533f0":"max-h-[min(6rem,calc(var(--filter-menu-height)*0.25))]","mui-fb4a3e97b5bd":"max-h-[min(20rem,var(--radix-dropdown-menu-content-available-height,20rem))]","mui-dcd942c18ddc":"max-h-[var(--radix-dropdown-menu-content-available-height)]","mui-410da8dfa8ac":"min-h-0","mui-9974acedf3f7":"min-h-9","mui-8423dc94ee06":"min-h-10","mui-50312c3ce4a3":"min-h-[60px]","mui-d48fe95d4da8":"w-(--cell-size)","mui-8867d85ed290":"w-8","mui-72b37c1a040d":"w-64","mui-37535002f0f7":"w-72","mui-919182384559":"w-[18.75rem]","mui-8dd3eece40db":"w-[var(--mendy-filter-menu-width,32rem)]","mui-8cfb5a42ef9f":"w-fit","mui-58d0413dd93c":"w-full","mui-91f82aa1df0c":"max-w-[60%]","mui-34055e6f8c1b":"max-w-[calc(100vw-2rem)]","mui-81b198a2db84":"max-w-full","mui-1458e495e3ae":"min-w-(--cell-size)","mui-184ddc11e5f9":"min-w-0","mui-e9ab1547c94d":"min-w-[8rem]","mui-7bd5bab6d7f4":"flex-1","mui-66b490dd6005":"shrink","mui-27ead27a81df":"shrink-0","mui-215061302c50":"border-collapse","mui-3a3774477287":"origin-(--radix-dropdown-menu-content-transform-origin)","mui-5dde0fd996f0":"-translate-y-1/2","mui-aa214ea38326":"transform","mui-393df0d154e0":"animate-none!","mui-7b3cd77eb999":"animate-pulse","mui-d343f41ba73e":"cursor-default","mui-acd532d8913e":"resize","mui-ae112c903ef8":"resize-y","mui-da607d0a2538":"grid-cols-[min(var(--mendy-filter-list-width,13rem),50%)_minmax(0,1fr)]","mui-b5985369ee35":"grid-rows-[minmax(0,1fr)]","mui-302c0d124a94":"flex-col","mui-faa8a23c68f6":"flex-wrap","mui-8fd2e2355cbc":"place-content-center","mui-71556df3b421":"items-center","mui-b9677bd1cb66":"items-start","mui-32c92bb1fde4":"justify-between","mui-a503dd374cca":"justify-center","mui-c62ec162662e":"justify-start","mui-19e97f3f40e6":"gap-1","mui-70007b876865":"gap-1.5","mui-074569488cca":"gap-2","mui-d7db3451d154":"gap-3","mui-90fc3ec35a37":"gap-4","mui-27e6c432192f":"space-y-1","mui-267171770524":"space-y-2","mui-5a3a4ee420c2":"truncate","mui-d5111d0e9f48":"overflow-hidden","mui-0fc84a692dad":"overflow-visible","mui-3b82279f859f":"overflow-x-hidden","mui-2368e909f3a5":"overflow-y-auto","mui-998780cdef87":"overscroll-contain","mui-b005d61d0953":"rounded-full","mui-3fa8c572949b":"rounded-md","mui-52417259a4f5":"rounded-none","mui-02e603944040":"rounded-sm","mui-a22ea0ba562a":"rounded-t-none","mui-10c0bae8cba9":"rounded-l-md","mui-34bbd346e74c":"rounded-r-md","mui-4f1a55de40bc":"border","mui-dad556abfe15":"border-0","mui-55860251be20":"border-s","mui-3b6d5fc7b061":"border-e","mui-894c3815a57f":"border-t","mui-bbe39cfb5cc6":"border-b","mui-8450eb0f1857":"border-dashed","mui-163a623b3716":"border-border/50","mui-1267095cdeb7":"border-input","mui-9b76f456b8c9":"border-muted-foreground/50","mui-292affc1f780":"bg-accent","mui-5b272f3c5076":"bg-background","mui-a943bea85d66":"bg-border","mui-0cf6c2e8fe7e":"bg-current","mui-965cf6587342":"bg-destructive","mui-e593c38256e0":"bg-popover","mui-0c2864fba576":"bg-primary","mui-d191cb569aac":"bg-secondary","mui-8fca9236d191":"bg-transparent","mui-717b342c2d01":"fill-current","mui-04760bcd507f":"p-0","mui-1dee6e3ec67d":"p-1","mui-b97db4a9f432":"p-2","mui-094f5333853b":"p-3","mui-56b8f5e0fb12":"px-(--cell-size)","mui-1da2e8f173c5":"px-1.5","mui-e7e01cc7f4df":"px-2","mui-0f9e6672913a":"px-3","mui-9513b3968002":"px-4","mui-0194c6e46323":"px-8","mui-1fcf28756bb1":"py-1","mui-a8c1dfb1d4ef":"py-1.5","mui-b5edc3ea7c91":"py-2","mui-078d945937da":"ps-8","mui-b2100041c585":"ps-9","mui-05d4103bd67f":"pe-2","mui-0e14c365f9e8":"pe-9","mui-559069d2c2e5":"pe-16","mui-0a702d97ed7d":"pt-3","mui-be02e79e6a27":"pt-3!","mui-1a52da5bc88c":"pr-1","mui-f5d8e661d857":"pl-2","mui-75b27e813dcc":"pl-8","mui-05ab12448317":"text-center","mui-e9347b78185f":"text-start","mui-757071a1d1c4":"text-base","mui-c74ab393b96d":"text-sm","mui-3992de70b033":"text-xs","mui-5f120ad4b50b":"text-[0.8rem]","mui-761cdb81bddb":"leading-none","mui-daaac3fbf55e":"font-medium","mui-52101fc7d8bb":"font-normal","mui-e1683b3c030a":"tracking-widest","mui-393883c1db68":"[overflow-wrap:anywhere]","mui-37cf9655f30a":"break-words","mui-726fca123972":"whitespace-normal","mui-963f6168b7d6":"whitespace-nowrap","mui-cc209238d847":"text-accent-foreground","mui-5eafab9bbefc":"text-current","mui-887b9502d5c7":"text-destructive","mui-8d4bf2704c8d":"text-destructive-foreground","mui-957a109f887f":"text-foreground","mui-35f35c41d134":"text-muted-foreground","mui-5bd2afe89f0b":"text-popover-foreground","mui-249f14ee5b6b":"text-primary","mui-abd1aaa1f5b2":"text-primary-foreground","mui-80df79ec9bb5":"text-secondary-foreground","mui-944969efb294":"underline","mui-d52f902a57e8":"underline-offset-4","mui-94f91922a10e":"opacity-0","mui-0b5a4d1257ab":"opacity-50","mui-65694092f002":"opacity-100","mui-0d4ca75de41c":"shadow-lg","mui-94ea94fde25f":"shadow-md","mui-89c3006b2722":"shadow-none","mui-7de07d413c13":"shadow-xs","mui-59edd3d33673":"outline-hidden","mui-318678825324":"outline","mui-dfc3376b8266":"filter","mui-eae178841c68":"transition-colors","mui-2cdd01663c76":"transition-opacity","mui-2b48746f4314":"transition-shadow","mui-b4b2fd95f324":"transition-none","mui-b30fc56058b6":"outline-none","mui-78905c9e865c":"select-none","mui-d80b6593dae5":"[--cell-size:--spacing(8)]","mui-82c2977beb8e":"[--cell-size:min(2rem,calc((100vw-3.5rem)/7))]","mui-971625533e56":"[--filter-menu-height:min(var(--mendy-filter-menu-max-height,44rem),var(--radix-dropdown-menu-content-available-height,44rem))]","mui-cacb19aa9640":"[scrollbar-width:thin]","mui-14bd99410890":"[unicode-bidi:isolate]","mui-9af9a4182597":"group-data-[disabled=true]:pointer-events-none","mui-ad936fcbed63":"group","mui-272ef88d6a0c":"group-data-[disabled=true]:opacity-50","mui-60052b901494":"group-data-[focused=true]/day:relative","mui-d9c5891363f9":"group/day","mui-3f96bf138f7b":"group-data-[focused=true]/day:z-10","mui-d39eb62b8363":"group-data-[focused=true]/day:border-ring","mui-5892a880410a":"group-data-[focused=true]/day:ring-1","mui-31b75c623c06":"group-data-[focused=true]/day:ring-ring","mui-f0ee83167878":"peer-disabled:cursor-not-allowed","mui-2ffc1d06387e":"peer","mui-25d26df52a1d":"peer-disabled:opacity-50","mui-32713fefe32f":"file:border-0","mui-25a74d576c42":"file:bg-transparent","mui-844abccf1fd0":"file:text-sm","mui-dc43de54f42a":"file:font-medium","mui-20315da78444":"placeholder:text-muted-foreground","mui-a267680f9f49":"before:absolute","mui-e22234c7b474":"before:inset-x-0","mui-4d24300d447b":"before:top-0","mui-37a30b916086":"before:border-t","mui-37ad15a95595":"hover:bg-accent","mui-bb6a4b3e902d":"hover:bg-destructive/90","mui-af9ea085901b":"hover:bg-primary/90","mui-099700a5a311":"hover:bg-secondary/80","mui-71863717995b":"hover:bg-transparent","mui-9f1f77b92dcb":"hover:text-accent-foreground","mui-4d6720d47806":"hover:text-foreground","mui-b56720602554":"hover:underline","mui-8da02faac748":"hover:opacity-100","mui-a8c1861c5d03":"focus:bg-accent","mui-a85c4c5d7465":"focus:text-accent-foreground","mui-b906a32b31ee":"focus-visible:border-ring","mui-39be5a15b766":"focus-visible:ring-1","mui-355efe22aedb":"focus-visible:ring-2","mui-365a4654f7b1":"focus-visible:ring-[3px]","mui-db549d38ff19":"focus-visible:ring-ring","mui-392a26f4c1b0":"focus-visible:ring-ring/50","mui-1df9125eebaf":"focus-visible:outline-1","mui-223daa83ed2d":"focus-visible:outline-ring","mui-2e357972fc10":"focus-visible:outline-none","mui-50aafa8694bb":"focus-visible:ring-inset","mui-8d3c1014b967":"disabled:pointer-events-none","mui-db567af109b7":"disabled:cursor-not-allowed","mui-4600b77303d6":"disabled:opacity-50","mui-7eb7501a2ef0":"has-focus:border-ring","mui-d0449753ba7b":"has-focus:ring-[3px]","mui-fc19c8471f34":"has-focus:ring-ring/50","mui-e288cffc2ef4":"has-[>svg]:px-1.5","mui-3b01ee05b16d":"has-[>svg]:px-2.5","mui-9e08353b774f":"has-[>svg]:px-3","mui-2c0115d1c32a":"aria-disabled:opacity-50","mui-1fac1d7d1df3":"aria-invalid:border-destructive","mui-2d91b4cbc3cb":"aria-invalid:ring-destructive","mui-5491fd0b4dc5":"aria-invalid:ring-destructive/20","mui-7d900a71e5ba":"aria-selected:text-muted-foreground","mui-397f5ba426a0":"data-[disabled]:pointer-events-none","mui-9beb654fcb0d":"data-[disabled]:opacity-50","mui-6fa6a8ade7c4":"data-[inset]:pl-8","mui-bbaaa5969856":"data-[more-below=true]:[mask-image:linear-gradient(#000_calc(100%_-_1rem),transparent)]","mui-dfc89afd7885":"data-[navigation=pointer]:focus-visible:ring-0","mui-96308b55e0d6":"data-[range-end=true]:rounded-md","mui-a55dbe6f3eec":"data-[range-end=true]:rounded-r-md","mui-714051e55e8e":"data-[range-end=true]:bg-primary","mui-c764cebcd540":"data-[range-end=true]:text-primary-foreground","mui-05ec0700cd48":"data-[range-middle=true]:rounded-none","mui-5fb598fb06f4":"data-[range-middle=true]:bg-accent","mui-0813905aa141":"data-[range-middle=true]:text-accent-foreground","mui-8020e31bff67":"data-[range-start=true]:rounded-md","mui-ab65911baf1d":"data-[range-start=true]:rounded-l-md","mui-f5460d79341c":"data-[range-start=true]:bg-primary","mui-421a7d3e6631":"data-[range-start=true]:text-primary-foreground","mui-a39af81d518c":"data-[selected-single=true]:bg-primary","mui-b6991ab170de":"data-[selected-single=true]:text-primary-foreground","mui-3cc0d07ef843":"data-[selected=true]:rounded-none","mui-89f6aab7a3f8":"data-[side=bottom]:slide-in-from-top-2","mui-3550f48d66b9":"data-[side=left]:slide-in-from-right-2","mui-7720fe004f5c":"data-[side=right]:slide-in-from-left-2","mui-66b560f839de":"data-[side=top]:slide-in-from-bottom-2","mui-20553d55d224":"data-[state=checked]:border-primary","mui-57d6d6401a2f":"data-[state=checked]:bg-primary","mui-7ca12016214f":"data-[state=checked]:text-primary-foreground","mui-37d8a3f448ff":"data-[state=closed]:animate-none!","mui-0cb4489c3645":"data-[state=closed]:animate-out","mui-bb5869ef903b":"data-[state=closed]:fade-out-0","mui-f4cf4be63707":"data-[state=closed]:zoom-out-95","mui-bae1e782f277":"data-[state=open]:animate-in","mui-4027d9c589b6":"data-[state=open]:bg-accent","mui-1952cd5b00aa":"data-[state=open]:text-accent-foreground","mui-6f73a280432e":"data-[state=open]:text-foreground","mui-790ed041a953":"data-[state=open]:opacity-100","mui-45464a92c1f6":"data-[state=open]:fade-in-0","mui-9ca352480f25":"data-[state=open]:zoom-in-95","mui-f3f7a9c5e1b3":"data-[variant=destructive]:text-destructive","mui-e2bb4ac97190":"data-[variant=destructive]:focus:bg-destructive/10","mui-353a727facfd":"data-[variant=destructive]:focus:text-destructive","mui-237747164b60":"motion-reduce:animate-none","mui-0cc20f4e20c8":"sm:w-[21.875rem]","mui-56760b222da0":"md:flex-row","mui-c05c9b99939d":"md:text-sm","mui-36b12e8339c7":"rtl:rotate-180","mui-9daa2369a41b":"dark:bg-input/30","mui-b2786f463a62":"dark:hover:text-accent-foreground","mui-c88f65aa011e":"dark:aria-invalid:ring-destructive/40","mui-bd73d819941e":"dark:data-[state=checked]:bg-primary","mui-98a28c2293f7":"dark:data-[variant=destructive]:focus:bg-destructive/20","mui-d78a8526410d":"pointer-coarse:[--cell-size:min(2.5rem,calc((100vw-3.5rem)/7))]","mui-b51243872d85":"sm:pointer-fine:h-8","mui-aa0e3c036805":"sm:pointer-fine:min-h-8","mui-0288c4ea71ea":"sm:pointer-fine:py-0.5","mui-41d1475cf71a":"sm:pointer-fine:py-1.5","mui-548a450e8e53":"[&_*]:transition-none!","mui-a1c8c43d9be2":"[&_[role^=menuitem]]:min-h-9","mui-b43343fe71c0":"sm:pointer-fine:[&_[role^=menuitem]]:min-h-8","mui-cc310a330231":"[&_button]:font-semibold","mui-b7ff49878425":"[&_button]:underline","mui-d9bdd2c94504":"[&_button]:underline-offset-4","mui-bcae9d37090c":"[&_svg]:pointer-events-none","mui-c77732bd3ab4":"[&_svg]:size-3.5","mui-040e748a3fa0":"[&_svg]:shrink-0","mui-be87a4a64d81":"[&_svg:not([class*='size-'])]:size-3","mui-eb5ef2dbc2d4":"[&_svg:not([class*='size-'])]:size-4","mui-8637dfd54fbb":"[&_svg:not([class*='text-'])]:text-muted-foreground","mui-4f05a238500e":"[&::-webkit-search-cancel-button]:appearance-none","mui-74ab31abd804":"[&:first-child[data-selected=true]_button]:rounded-l-md","mui-13858191ca50":"rtl:**:[.rdp-button\\_next>svg]:rotate-180","mui-a324a7f99932":"rtl:**:[.rdp-button\\_previous>svg]:rotate-180","mui-82b114bbff3d":"data-[variant=destructive]:*:[svg]:text-destructive!","mui-6ee0c74de40c":"[&:last-child[data-selected=true]_button]:rounded-r-md","mui-6162ab70efb5":"[&:nth-child(2)[data-selected=true]_button]:rounded-l-md","mui-f157ee6bae99":"[&>div]:w-full","mui-ba417cf466b0":"[&>span]:text-xs","mui-829c8ef4f9c5":"[&>span]:opacity-70","mui-bf95f682e553":"[&>span:first-child]:mt-[calc(0.5lh-0.4375rem)]","mui-eb740dd32318":"[&>svg]:size-3.5","mui-019fd73c95db":"[&>svg]:text-muted-foreground","mui-b8293c91796c":"[[data-slot=card-content]_&]:bg-transparent","mui-8dd7e6b42262":"[[data-slot=popover-content]_&]:bg-transparent"};
@@ -14,13 +14,15 @@ export interface MendyUIComponents {
14
14
  export type FilterPart = "root" | "search" | "searchInput" | "menuTrigger" | "menu" | "menuList" | "menuRow" | "menuHeader" | "editor" | "chip" | "chipTrigger" | "chipRemove" | "option" | "clear";
15
15
  export type FilterClassNames = Partial<Record<FilterPart, string>>;
16
16
  export interface MendyUIOptions {
17
+ /** Desktop editor placement. Phones always use one panel with Back. */
18
+ menuLayout?: "connected" | "anchored";
17
19
  components?: Partial<MendyUIComponents>;
18
20
  classNames?: FilterClassNames;
19
21
  /** Mount dropdowns inside a local theme or dialog instead of document.body. */
20
22
  portalContainer?: HTMLElement | null;
21
23
  }
22
24
  /** Nested providers inherit defaults; local settings override matching keys. */
23
- export declare function MendyUIProvider({ children, components, classNames, portalContainer, }: MendyUIOptions & {
25
+ export declare function MendyUIProvider({ children, components, classNames, portalContainer, menuLayout, }: MendyUIOptions & {
24
26
  children: ReactNode;
25
27
  }): import("react/jsx-runtime").JSX.Element;
26
28
  export declare function useMendyUI(): MendyUIOptions;
@@ -8,13 +8,14 @@ import { Label as DefaultLabel } from "./primitives/label.js";
8
8
  import { Calendar as DefaultCalendar } from "./primitives/calendar.js";
9
9
  const Context = createContext({});
10
10
  /** Nested providers inherit defaults; local settings override matching keys. */
11
- export function MendyUIProvider({ children, components, classNames, portalContainer, }) {
11
+ export function MendyUIProvider({ children, components, classNames, portalContainer, menuLayout, }) {
12
12
  const parent = useContext(Context);
13
13
  const value = useMemo(() => ({
14
+ menuLayout: menuLayout ?? parent.menuLayout,
14
15
  components: { ...parent.components, ...components },
15
16
  classNames: { ...parent.classNames, ...classNames },
16
17
  portalContainer: portalContainer === undefined ? parent.portalContainer : portalContainer,
17
- }), [parent, components, classNames, portalContainer]);
18
+ }), [parent, components, classNames, portalContainer, menuLayout]);
18
19
  return _jsx(Context.Provider, { value: value, children: children });
19
20
  }
20
21
  export function useMendyUI() {
@@ -6,6 +6,7 @@ export interface FilterMenuGroup {
6
6
  id: string;
7
7
  label: string;
8
8
  fields: string[];
9
+ separatorBefore?: boolean;
9
10
  icon?: ReactNode;
10
11
  }
11
12
  export interface FilterRootProps {
@@ -30,9 +31,11 @@ export declare function FilterSearch({ label, placeholder, }: {
30
31
  placeholder?: string;
31
32
  }): import("react/jsx-runtime").JSX.Element;
32
33
  /** A standalone menu button for layouts without a search field. */
33
- export declare function FilterMenu({ children, asChild, }: {
34
+ export declare function FilterMenu({ children, asChild, anchor, }: {
34
35
  children?: ReactNode;
35
36
  asChild?: boolean;
37
+ /** Align a standalone trigger to an application-owned search field. */
38
+ anchor?: React.RefObject<HTMLDivElement | null>;
36
39
  }): import("react/jsx-runtime").JSX.Element;
37
40
  export declare function FilterList(): import("react/jsx-runtime").JSX.Element;
38
41
  export declare function FilterField({ id }: {
@@ -1,6 +1,7 @@
1
1
  "use client";
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
- import { createContext, useContext, useEffect, useLayoutEffect, useMemo, useId, useRef, useState, } from "react";
3
+ import { FilterCollection } from "./filter-collection.js";
4
+ import { createContext, useContext, useEffect, useLayoutEffect, useMemo, useId, useRef, useState, useSyncExternalStore, } from "react";
4
5
  import { ListFilter, Search, X, Circle, ListChecks, Type, Hash, CalendarDays, SlidersHorizontal, Layers, } from "lucide-react";
5
6
  import { Button } from "../customization.js";
6
7
  import { Input } from "../customization.js";
@@ -13,10 +14,13 @@ import { FilterOptionCache, useFilterOptions } from "./use-filter-options.js";
13
14
  import { classifyPaste, resolvePasteAmbiguity } from "./filter-state.js";
14
15
  import { cn } from "../utils.js";
15
16
  import { FilterMenuPanel } from "./filter-menu-panel.js";
16
- import { useValueDraft } from "./use-value-draft.js";
17
+ import { FilterDraftCache, useValueDraft } from "./use-value-draft.js";
17
18
  import { MendyUIProvider, useMendyUI } from "../customization.js";
18
19
  const defaultGroups = [];
19
20
  const defaultSummary = { mode: "count", limit: 3 };
21
+ const subscribeHydration = () => () => { };
22
+ const clientHydrated = () => true;
23
+ const serverHydrated = () => false;
20
24
  const Context = createContext(null);
21
25
  function useRoot() {
22
26
  const context = useContext(Context);
@@ -27,12 +31,22 @@ function useRoot() {
27
31
  export function FilterRoot({ classNames, ...props }) {
28
32
  return (_jsx(MendyUIProvider, { classNames: classNames, children: _jsx(FilterRootContent, { ...props }) }));
29
33
  }
30
- function FilterRootContent({ filters, summary = defaultSummary, suggestions = "always", closeMenuOnApply = false, groups = defaultGroups, disabled = false, className, children, }) {
34
+ function FilterRootContent({ filters, summary = defaultSummary, suggestions = "always", closeMenuOnApply = false, groups = defaultGroups, disabled: disabledProp = false, className, children, }) {
31
35
  const { classNames } = useMendyUI();
36
+ // Server HTML must not accept edits that React cannot handle yet. Client-only
37
+ // renders are ready immediately; hydration enables the existing controls.
38
+ const hydrated = useSyncExternalStore(subscribeHydration, clientHydrated, serverHydrated);
39
+ const disabled = disabledProp || !hydrated;
32
40
  const [cache] = useState(() => new Map());
33
41
  const [ambiguous, setAmbiguous] = useState([]);
34
42
  const trigger = useRef(null);
43
+ const [direction, setDirection] = useState("ltr");
44
+ useLayoutEffect(() => {
45
+ if (filters.menuOpen && trigger.current)
46
+ setDirection(getComputedStyle(trigger.current).direction === "rtl" ? "rtl" : "ltr");
47
+ }, [filters.menuOpen]);
35
48
  const context = useMemo(() => ({
49
+ direction,
36
50
  filters,
37
51
  summary,
38
52
  suggestions,
@@ -42,19 +56,19 @@ function FilterRootContent({ filters, summary = defaultSummary, suggestions = "a
42
56
  trigger,
43
57
  ambiguous,
44
58
  setAmbiguous,
45
- }), [filters, summary, suggestions, closeMenuOnApply, groups, disabled, ambiguous]);
46
- return (_jsx(FilterOptionCache.Provider, { value: cache, children: _jsx(Context.Provider, { value: context, children: _jsx("div", { "data-mendy-ui": "", className: cn("mui-222f930b8752 mui-faa8a23c68f6 mui-71556df3b421 mui-074569488cca", classNames?.root, className), children: children }) }) }));
59
+ }), [filters, summary, suggestions, closeMenuOnApply, groups, disabled, ambiguous, direction]);
60
+ return (_jsx(FilterOptionCache.Provider, { value: cache, children: _jsx(Context.Provider, { value: context, children: _jsx("div", { "data-mendy-ui": "", "aria-busy": !hydrated || undefined, className: cn("mui-222f930b8752 mui-faa8a23c68f6 mui-71556df3b421 mui-074569488cca", classNames?.root, className), children: children }) }) }));
47
61
  }
48
62
  export function FilterBar(props) {
49
63
  return (_jsxs(FilterRoot, { ...props, children: [_jsx(FilterSearch, { label: props.searchLabel, placeholder: props.searchPlaceholder }), _jsx(FilterList, {}), _jsx(FilterClear, {}), _jsx(FilterFeedback, {})] }));
50
64
  }
51
65
  export function FilterSearch({ label = "Search", placeholder = "Search or filter", }) {
52
- const { filters, trigger, disabled, setAmbiguous } = useRoot();
66
+ const { filters, trigger, disabled, setAmbiguous, direction } = useRoot();
53
67
  const { classNames } = useMendyUI();
54
68
  const anchor = useRef(null);
55
69
  const input = useRef(null);
56
70
  const shift = useRef(false);
57
- return (_jsxs(DropdownMenu, { modal: false, open: filters.menuOpen, onOpenChange: filters.setMenuOpen, children: [_jsxs("div", { ref: anchor, className: cn("mui-d2d9e1f13413 mui-58d0413dd93c mui-27ead27a81df mui-8c14b4d2e932", classNames?.search), children: [_jsx(Search, { className: "mui-33228ff7d583 mui-747355bdc2a2 mui-ea31f8b3a958 mui-4e45f4841abb mui-3c7e3f82f336 mui-5dde0fd996f0", "aria-hidden": "true" }), _jsx(Input, { ref: input, type: "text", role: "searchbox", disabled: disabled, "aria-label": label, placeholder: placeholder, value: filters.search, autoComplete: "off", autoCapitalize: "none", autoCorrect: "off", spellCheck: false, className: cn("mui-58d0413dd93c mui-86486d7e416f mui-c74ab393b96d mui-4f05a238500e", filters.search ? "mui-83ffc494bac4" : "mui-0359a07b64f9", classNames?.searchInput), onKeyDown: (event) => {
71
+ return (_jsxs(DropdownMenu, { dir: direction, modal: false, open: filters.menuOpen, onOpenChange: filters.setMenuOpen, children: [_jsxs("div", { ref: anchor, className: cn("mui-d2d9e1f13413 mui-58d0413dd93c mui-81b198a2db84 mui-27ead27a81df mui-0cc20f4e20c8", classNames?.search), children: [_jsx(Search, { className: "mui-33228ff7d583 mui-747355bdc2a2 mui-cea70f23972e mui-4e45f4841abb mui-100c22d5776b mui-5dde0fd996f0", "aria-hidden": "true" }), _jsx(Input, { ref: input, type: "text", role: "searchbox", disabled: disabled, "aria-label": label, placeholder: placeholder, value: filters.search, autoComplete: "off", autoCapitalize: "none", autoCorrect: "off", spellCheck: false, className: cn("mui-58d0413dd93c mui-b2100041c585 mui-c74ab393b96d mui-4f05a238500e", filters.search ? "mui-559069d2c2e5" : "mui-0e14c365f9e8", classNames?.searchInput), onKeyDown: (event) => {
58
72
  shift.current = event.shiftKey;
59
73
  if (event.key === "Enter" && !event.nativeEvent.isComposing && !event.shiftKey) {
60
74
  const classified = classifyPaste(event.currentTarget.value, filters.entries);
@@ -90,17 +104,17 @@ export function FilterSearch({ label = "Search", placeholder = "Search or filter
90
104
  after: element.value.slice(end),
91
105
  });
92
106
  setAmbiguous(result.ambiguous);
93
- } }), filters.search && (_jsx(Button, { variant: "ghost", size: "icon", type: "button", disabled: disabled, "aria-label": "Clear search", className: "mui-747355bdc2a2 mui-5a6edca9f43a mui-4e45f4841abb mui-222f930b8752 mui-0712570dcc9f mui-5dde0fd996f0 mui-71556df3b421 mui-a503dd374cca mui-02e603944040 mui-0b5a4d1257ab mui-8da02faac748 mui-2e357972fc10 mui-39be5a15b766 mui-db549d38ff19", onClick: () => {
107
+ } }), filters.search && (_jsx(Button, { variant: "ghost", size: "icon", type: "button", disabled: disabled, "aria-label": "Clear search", className: "mui-747355bdc2a2 mui-585f4729f611 mui-4e45f4841abb mui-222f930b8752 mui-0712570dcc9f mui-5dde0fd996f0 mui-71556df3b421 mui-a503dd374cca mui-02e603944040 mui-0b5a4d1257ab mui-8da02faac748 mui-2e357972fc10 mui-39be5a15b766 mui-db549d38ff19", onClick: () => {
94
108
  setAmbiguous([]);
95
109
  filters.setSearch("");
96
110
  input.current?.focus();
97
- }, children: _jsx(X, { className: "mui-9104ce433bba", "aria-hidden": "true" }) })), _jsx(DropdownMenuTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "icon", ref: trigger, type: "button", disabled: disabled, "aria-label": "Open filters", "aria-haspopup": "dialog", className: cn("mui-747355bdc2a2 mui-71fb77dd8ea7 mui-4e45f4841abb mui-79ede756e761 mui-5dde0fd996f0 mui-2cdd01663c76 mui-8da02faac748 mui-2e357972fc10 mui-39be5a15b766 mui-db549d38ff19 mui-790ed041a953", filters.active.length ? "mui-65694092f002" : "mui-0b5a4d1257ab", classNames?.menuTrigger), children: _jsx(ListFilter, { className: "mui-3c7e3f82f336", "aria-hidden": "true" }) }) })] }), filters.menuOpen && _jsx(FilterMenuContent, { anchor: anchor })] }));
111
+ }, children: _jsx(X, { className: "mui-61c000c8a98a", "aria-hidden": "true" }) })), _jsx(DropdownMenuTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "icon", ref: trigger, type: "button", disabled: disabled, "aria-label": "Open filters", "aria-haspopup": "dialog", className: cn("mui-747355bdc2a2 mui-13422ddc8d83 mui-4e45f4841abb mui-79ede756e761 mui-5dde0fd996f0 mui-2cdd01663c76 mui-8da02faac748 mui-2e357972fc10 mui-39be5a15b766 mui-db549d38ff19 mui-790ed041a953", filters.active.length ? "mui-65694092f002" : "mui-0b5a4d1257ab", classNames?.menuTrigger), children: _jsx(ListFilter, { className: "mui-100c22d5776b", "aria-hidden": "true" }) }) })] }), filters.menuOpen && _jsx(FilterMenuContent, { anchor: anchor })] }));
98
112
  }
99
113
  /** A standalone menu button for layouts without a search field. */
100
- export function FilterMenu({ children = "Add filter", asChild = false, }) {
101
- const { filters, trigger, disabled } = useRoot();
114
+ export function FilterMenu({ children = "Add filter", asChild = false, anchor, }) {
115
+ const { filters, trigger, disabled, direction } = useRoot();
102
116
  const { classNames } = useMendyUI();
103
- return (_jsxs(DropdownMenu, { modal: false, open: filters.menuOpen, onOpenChange: filters.setMenuOpen, children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx(Button, { ref: trigger, asChild: asChild, className: classNames?.menuTrigger, variant: "outline", disabled: disabled, "aria-haspopup": "dialog", children: children }) }), filters.menuOpen && _jsx(FilterMenuContent, {})] }));
117
+ return (_jsxs(DropdownMenu, { dir: direction, modal: false, open: filters.menuOpen, onOpenChange: filters.setMenuOpen, children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx(Button, { ref: trigger, asChild: asChild, className: classNames?.menuTrigger, variant: "outline", disabled: disabled, "aria-haspopup": "dialog", children: children }) }), filters.menuOpen && _jsx(FilterMenuContent, { anchor: anchor })] }));
104
118
  }
105
119
  const fieldIcons = {
106
120
  single: Circle,
@@ -114,6 +128,7 @@ const fieldIcons = {
114
128
  function FilterMenuContent({ anchor }) {
115
129
  const { filters, groups, disabled, trigger } = useRoot();
116
130
  const [clearEpoch, setClearEpoch] = useState(0);
131
+ const [drafts] = useState(() => new Map());
117
132
  const grouped = new Set(groups.flatMap((group) => group.fields));
118
133
  const visible = filters.entries.filter((entry) => !entry.field.hidden && entry.field.menu !== false);
119
134
  const sections = [
@@ -125,6 +140,7 @@ function FilterMenuContent({ anchor }) {
125
140
  label: entry.field.label,
126
141
  icon: entry.field.icon,
127
142
  entries: [entry],
143
+ separatorBefore: false,
128
144
  },
129
145
  ]),
130
146
  ...groups.flatMap((group) => {
@@ -140,6 +156,7 @@ function FilterMenuContent({ anchor }) {
140
156
  entry.field.removable !== false);
141
157
  return {
142
158
  id: section.id,
159
+ separatorBefore: section.separatorBefore,
143
160
  label: section.label,
144
161
  icon: section.icon ?? _jsx(Icon, {}),
145
162
  editorLabel: single?.editorLabel ??
@@ -151,26 +168,38 @@ function FilterMenuContent({ anchor }) {
151
168
  clear: !disabled && clearable.length
152
169
  ? () => {
153
170
  const error = filters.batch(Object.fromEntries(clearable.map((entry) => [entry.id, entry.field.clearValue])), undefined, "remove");
154
- if (!error)
171
+ if (!error) {
172
+ for (const entry of section.entries)
173
+ for (const part of ["value", "text", "error", "date", "query"])
174
+ drafts.delete(`${entry.id}:${part}`);
155
175
  setClearEpoch((epoch) => epoch + 1);
176
+ }
156
177
  }
157
178
  : undefined,
158
- content: section.entries.map((entry) => (_jsxs("div", { className: "mui-f157ee6bae99", children: [!single && (_jsx("p", { className: "mui-894c3815a57f mui-0f9e6672913a mui-0a702d97ed7d mui-3992de70b033 mui-daaac3fbf55e mui-4fa4c190281c", children: entry.field.label })), _jsx(FieldEditor, { entry: entry, active: true, autoFocus: false, showDateLabel: false, disabled: disabled || entry.field.disabled, close: () => filters.setMenuOpen(false), location: "menu" }, `${entry.id}:${clearEpoch}`)] }, entry.id))),
179
+ content: section.entries.map((entry, index) => (_jsxs("div", { className: cn("mui-184ddc11e5f9", entry.field.menuLayout === "inline"
180
+ ? "mui-222f930b8752 mui-71556df3b421 mui-32c92bb1fde4 mui-d7db3451d154 mui-0f9e6672913a mui-b5edc3ea7c91" : "mui-f157ee6bae99", index > 0 && "mui-894c3815a57f"), children: [!single && (index > 0 || entry.field.label !== section.label) && (_jsx("p", { className: cn("mui-c74ab393b96d", entry.field.menuLayout !== "inline" && "mui-0f9e6672913a mui-0a702d97ed7d mui-3992de70b033 mui-daaac3fbf55e"), children: entry.field.label })), _jsx(FieldEditor, { entry: entry, active: true, autoFocus: false, showDateLabel: false, disabled: disabled || entry.field.disabled, close: () => filters.setMenuOpen(false), location: "menu" }, `${entry.id}:${clearEpoch}`)] }, entry.id))),
159
181
  };
160
182
  });
161
- return (_jsx(FilterMenuPanel, { sections: sections, selectedId: filters.openField, onSelect: filters.setOpenField, anchor: anchor, trigger: trigger }));
183
+ return (_jsx(FilterDraftCache.Provider, { value: drafts, children: _jsx(FilterMenuPanel, { sections: sections, selectedId: filters.openField, onSelect: filters.setOpenField, onClose: () => filters.setMenuOpen(false), anchor: anchor, trigger: trigger }) }));
162
184
  }
163
185
  export function FilterList() {
164
- const { filters } = useRoot();
165
- return (_jsx(_Fragment, { children: filters.entries.map((entry) => (_jsx(FieldChip, { entry: entry }, entry.id))) }));
186
+ const { filters, suggestions } = useRoot();
187
+ let entranceIndex = 0;
188
+ return (_jsx(_Fragment, { children: filters.entries.flatMap((entry) => !entry.field.hidden &&
189
+ (entry.field.isActive(entry.value) ||
190
+ showSuggestion(entry, suggestions, filters.active.length))
191
+ ? [
192
+ _jsx(FieldChip, { entry: entry, entranceDelay: Math.min(entranceIndex++ * 0.06, 0.3) }, entry.id),
193
+ ]
194
+ : []) }));
166
195
  }
167
196
  function summarize(field, value, choices) {
168
197
  if (field.kind === "numberRange" && Array.isArray(value))
169
198
  return `${value[0] ?? "Any"} – ${value[1] ?? "Any"}`;
170
- if (Array.isArray(value))
171
- return value
172
- .map((item) => choices.find((choice) => choice.value === item)?.label ?? String(item ?? "Any"))
173
- .join(", ");
199
+ if (Array.isArray(value)) {
200
+ const labels = new Map(choices.map((choice) => [choice.value, choice.label]));
201
+ return value.map((item) => labels.get(item) ?? String(item ?? "Any")).join(", ");
202
+ }
174
203
  if (value && typeof value === "object" && "from" in value && "to" in value)
175
204
  return `${value.from ?? "Any"} – ${value.to ?? "Any"}`;
176
205
  return choices.find((choice) => choice.value === value)?.label ?? String(value ?? "");
@@ -186,7 +215,7 @@ export function FilterFieldEditor({ id, autoFocus = true }) {
186
215
  const entry = filters.entries.find((entry) => entry.id === id);
187
216
  return entry ? (_jsx(FieldEditor, { entry: entry, active: true, autoFocus: autoFocus, disabled: disabled || entry.field.disabled, close: () => filters.edit(null), location: "inline" }, id)) : null;
188
217
  }
189
- function FieldChip({ entry }) {
218
+ function FieldChip({ entry, entranceDelay = 0 }) {
190
219
  const { classNames } = useMendyUI();
191
220
  const { filters, summary, suggestions, disabled, trigger } = useRoot();
192
221
  const { id, field, value } = entry;
@@ -200,7 +229,7 @@ function FieldChip({ entry }) {
200
229
  const options = useFilterOptions(id, field, active ? value : field.suggestion?.value, false);
201
230
  if (field.hidden || (!active && !suggestion))
202
231
  return null;
203
- return (_jsxs(AppliedFilter, { label: field.label, "data-mendy-ui": "", "data-slot": active ? "filter-chip" : "filter-suggestion", "data-state": active ? "applied" : "suggested", className: cn(!active && "mui-4f1a55de40bc mui-8450eb0f1857 mui-9b76f456b8c9 mui-8fca9236d191", (field.summary ?? summary).mode === "all" && "mui-a66e9985b093 mui-9974acedf3f7", classNames?.chip), disabled: chipDisabled(field, active, disabled), removeProps: { className: classNames?.chipRemove }, contentProps: {
232
+ return (_jsxs(AppliedFilter, { entranceDelay: entranceDelay, label: field.label, "data-mendy-ui": "", "data-slot": active ? "filter-chip" : "filter-suggestion", "data-state": active ? "applied" : "suggested", className: cn(!active && "mui-4f1a55de40bc mui-8450eb0f1857 mui-9b76f456b8c9 mui-8fca9236d191", (field.summary ?? summary).mode === "all" && "mui-a66e9985b093 mui-9974acedf3f7", classNames?.chip), disabled: chipDisabled(field, active, disabled), removeProps: { className: classNames?.chipRemove }, contentProps: {
204
233
  className: classNames?.editor,
205
234
  onCloseAutoFocus: (event) => {
206
235
  if (!currentlyActive.current) {
@@ -243,12 +272,19 @@ function summaryText(field, shownValue, choices, policy) {
243
272
  }
244
273
  return text;
245
274
  }
275
+ function ChipLabel({ field, active, hasValue, }) {
276
+ return (_jsxs(_Fragment, { children: [" ", (field.chipLabel !== false || !active) && (_jsxs("span", { className: cn("mui-184ddc11e5f9 mui-66b490dd6005 mui-5a3a4ee420c2 mui-14bd99410890", hasValue && "mui-91f82aa1df0c"), title: field.label, dir: "auto", children: [!active && field.suggestion?.label
277
+ ? field.suggestion.label
278
+ : typeof field.chipLabel === "string"
279
+ ? field.chipLabel
280
+ : field.label, hasValue ? ":" : ""] }))] }));
281
+ }
246
282
  function ChipSummary({ field, value, active, options, summary, }) {
247
283
  const policy = field.summary ?? summary;
248
284
  const shownValue = active ? value : field.suggestion?.value;
249
285
  const full = summarize(field, shownValue, options.selected);
250
286
  const text = summaryText(field, shownValue, options.selected, policy);
251
- return (_jsxs(_Fragment, { children: [_jsxs("span", { children: [!active && field.suggestion?.label ? field.suggestion.label : field.label, full ? ":" : ""] }), field.renderSummary ? (field.renderSummary(shownValue, options.selected)) : (_jsx("span", { title: full, className: cn("mui-184ddc11e5f9", policy.mode === "ellipsis" && "mui-5a3a4ee420c2", policy.mode === "all" && "mui-726fca123972 mui-37cf9655f30a mui-1fcf28756bb1"), style: policy.mode === "ellipsis" ? { maxWidth: policy.maxWidth ?? 180 } : undefined, children: options.resolving ? _jsx("span", { className: "mui-7b3cd77eb999", children: text || "Loading…" }) : text }))] }));
287
+ return (_jsxs(_Fragment, { children: [_jsx(ChipLabel, { field: field, active: active, hasValue: Boolean(full) }), field.renderSummary ? (field.renderSummary(shownValue, options.selected)) : (_jsx("span", { title: full, dir: "auto", className: cn("mui-184ddc11e5f9 mui-957a109f887f mui-393883c1db68 mui-14bd99410890", policy.mode !== "all" && "mui-5a3a4ee420c2", policy.mode === "all" && "mui-726fca123972 mui-37cf9655f30a mui-1fcf28756bb1"), style: policy.mode === "ellipsis" ? { maxWidth: policy.maxWidth ?? 180 } : undefined, children: options.resolving ? _jsx("span", { className: "mui-7b3cd77eb999", children: text || "Loading…" }) : text }))] }));
252
288
  }
253
289
  export function FilterClear({ children = "Clear all" }) {
254
290
  const { classNames } = useMendyUI();
@@ -276,7 +312,7 @@ function FieldEditor({ entry, active, disabled, close, location, autoFocus = tru
276
312
  const { field, value } = entry;
277
313
  const input = useRef(null);
278
314
  const customRoot = useRef(null);
279
- const [draft, updateDraft] = useValueDraft(value, (current) => current);
315
+ const [draft, updateDraft] = useValueDraft(value, (current) => current, `${entry.id}:value`);
280
316
  const draftRef = useRef(value);
281
317
  useLayoutEffect(() => {
282
318
  draftRef.current = draft;
@@ -291,8 +327,8 @@ function FieldEditor({ entry, active, disabled, close, location, autoFocus = tru
291
327
  : ""
292
328
  : typeof value === "string"
293
329
  ? value
294
- : "");
295
- const [error, setError] = useState();
330
+ : "", `${entry.id}:text`);
331
+ const [error, setError] = useValueDraft(value, () => undefined, `${entry.id}:error`);
296
332
  const id = useId();
297
333
  const options = useFilterOptions(entry.id, field, value, active);
298
334
  useEffect(() => {
@@ -319,7 +355,7 @@ function FieldEditor({ entry, active, disabled, close, location, autoFocus = tru
319
355
  requestAnimationFrame(() => trigger.current?.focus());
320
356
  }
321
357
  if (field.renderEditor)
322
- return (_jsxs("div", { "data-mendy-ui": "", ref: customRoot, className: "mui-34055e6f8c1b mui-094f5333853b", onKeyDown: (event) => {
358
+ return (_jsxs("div", { "data-mendy-ui": "", ref: customRoot, className: cn("mui-184ddc11e5f9 mui-81b198a2db84", field.editorPadding !== "none" && "mui-094f5333853b"), onKeyDown: (event) => {
323
359
  if (event.key === "Escape")
324
360
  return;
325
361
  if (event.key === "Tab" ||
@@ -327,6 +363,8 @@ function FieldEditor({ entry, active, disabled, close, location, autoFocus = tru
327
363
  event.target.matches("input, textarea, select, [contenteditable=true]")))
328
364
  event.stopPropagation();
329
365
  }, children: [field.renderEditor({
366
+ autoFocus,
367
+ location,
330
368
  value,
331
369
  draft,
332
370
  setDraft,
@@ -337,30 +375,53 @@ function FieldEditor({ entry, active, disabled, close, location, autoFocus = tru
337
375
  if (field.kind === "single" || field.kind === "multi")
338
376
  return (_jsx(ChoiceEditor, { field: field, value: value, input: input, options: options, error: error, disabled: disabled, apply: apply, location: location }));
339
377
  if (field.kind === "dateRange")
340
- return (_jsx(FilterDateEditor, { autoFocus: autoFocus, showLabel: showDateLabel, field: field, value: value, disabled: disabled, apply: apply, error: error }));
341
- return (_jsx(ValueEditor, { field: field, draft: draft, setDraft: setDraft, text: text, setText: setText, input: input, error: error, id: id, disabled: disabled, apply: apply }));
378
+ return (_jsx(FilterDateEditor, { draftKey: `${entry.id}:date`, autoFocus: autoFocus, showLabel: showDateLabel, showClear: location !== "menu", field: field, value: value, disabled: disabled, apply: apply, error: error }));
379
+ return (_jsx(ValueEditor, { location: location, field: field, draft: draft, setDraft: setDraft, text: text, setText: setText, input: input, error: error, id: id, disabled: disabled, apply: apply }));
380
+ }
381
+ function useChoiceSearch(field, count) {
382
+ const large = (field.source?.items.length ?? 0) > 100 || count > 100;
383
+ const [discovered, setDiscovered] = useState(large);
384
+ if (large && !discovered)
385
+ setDiscovered(true);
386
+ return field.searchable || large || discovered;
342
387
  }
343
388
  function ChoiceEditor({ field, value, input, options, disabled, apply, location, error, }) {
344
- const { classNames } = useMendyUI();
389
+ const searchable = useChoiceSearch(field, options.items.length);
390
+ const collection = useRef(null);
345
391
  const selected = Array.isArray(value) ? value : value === null ? [] : [value];
346
392
  const selectedSet = new Set(selected);
347
393
  const searchLabel = field.searchLabel ?? `Search ${field.label.toLowerCase()}`;
348
- return (_jsxs("div", { "data-mendy-ui": "", className: "mui-72b37c1a040d mui-81b198a2db84", onKeyDown: (event) => {
394
+ return (_jsxs("div", { "data-mendy-ui": "", "data-filter-choices": "", className: "mui-72b37c1a040d mui-81b198a2db84", onKeyDown: (event) => {
349
395
  if (event.key === "Tab")
350
396
  event.stopPropagation();
351
- }, children: [field.searchable && (_jsxs("div", { "data-mendy-ui": "", className: "mui-d2d9e1f13413 mui-bbe39cfb5cc6 mui-b97db4a9f432", children: [_jsx(Search, { className: "mui-33228ff7d583 mui-747355bdc2a2 mui-866c339ea145 mui-4e45f4841abb mui-5dde0fd996f0 mui-100c22d5776b mui-0b5a4d1257ab", strokeWidth: 1.5, "aria-hidden": "true" }), _jsx(Input, { ref: (node) => {
397
+ }, children: [searchable && (_jsxs("div", { "data-mendy-ui": "", className: "mui-d2d9e1f13413 mui-bbe39cfb5cc6 mui-b97db4a9f432", children: [_jsx(Search, { className: "mui-33228ff7d583 mui-747355bdc2a2 mui-96a350bd3168 mui-4e45f4841abb mui-5dde0fd996f0 mui-100c22d5776b mui-35f35c41d134", "aria-hidden": "true" }), _jsx(Input, { ref: (node) => {
352
398
  input.current = node;
353
- }, "aria-label": searchLabel, type: "search", disabled: disabled, placeholder: searchLabel, value: options.query, className: "mui-75b27e813dcc mui-4f05a238500e", onChange: (event) => options.setQuery(event.target.value), onKeyDown: (event) => {
399
+ }, "aria-label": searchLabel, type: "search", disabled: disabled, placeholder: searchLabel, value: options.query, className: "mui-078d945937da mui-b51243872d85 mui-4f05a238500e", onChange: (event) => options.setQuery(event.target.value), onKeyDown: (event) => {
354
400
  if (event.key === "ArrowDown") {
355
401
  event.preventDefault();
356
- event.currentTarget
357
- .closest("[data-radix-menu-content]")
358
- ?.querySelector('[role^="menuitem"]:not([data-disabled])')
359
- ?.focus();
402
+ collection.current?.focusFirst();
360
403
  }
361
404
  if (event.key !== "Escape" && event.key !== "Tab")
362
405
  event.stopPropagation();
363
- } })] })), _jsx("div", { role: location === "inline" ? "group" : "menu", "aria-label": field.label, className: "mui-1dee6e3ec67d", children: location === "inline" ? (options.items.map((choice) => (_jsx(Button, { variant: "ghost", type: "button", "aria-label": choice.label, "aria-pressed": selectedSet.has(choice.value), disabled: disabled || choice.disabled, className: cn("mui-58d0413dd93c mui-c62ec162662e", selectedSet.has(choice.value) && "mui-292affc1f780", classNames?.option), onClick: () => {
406
+ } })] })), _jsx(ChoiceCollection, { field: field, options: options, value: value, selected: selected, selectedSet: selectedSet, disabled: disabled, apply: apply, location: location, collection: collection }), _jsx(OptionFeedback, { options: options, error: error })] }));
407
+ }
408
+ function ChoiceCollection({ field, options, value, selected, selectedSet, disabled, apply, location, collection, }) {
409
+ const { classNames } = useMendyUI();
410
+ const choices = (field.kind === "single" && location === "chip" && field.removable !== false
411
+ ? [{ value: "", label: `Any ${field.label.toLowerCase()}` }, ...options.items]
412
+ : options.items).map((choice) => ({ ...choice, key: choice.value, disabled: disabled || choice.disabled }));
413
+ const list = (_jsx(FilterCollection, { items: choices, role: location === "inline" ? "group" : "menu", label: field.label, collectionRef: collection, initialKey: typeof selected[0] === "string" ? selected[0] : undefined, className: "mui-fb4a3e97b5bd", children: (choice, index, row) => {
414
+ const content = field.renderOption && choice.value !== ""
415
+ ? field.renderOption(choice, { selected: selectedSet.has(choice.value) })
416
+ : choice.label;
417
+ const common = {
418
+ ...row,
419
+ "aria-label": choice.label,
420
+ disabled: choice.disabled,
421
+ className: cn("mui-b9677bd1cb66 mui-b5edc3ea7c91 mui-41d1475cf71a mui-726fca123972 mui-393883c1db68 mui-bf95f682e553", classNames?.option),
422
+ };
423
+ if (location === "inline")
424
+ return (_jsx(Button, { ...common, variant: "ghost", type: "button", "aria-pressed": selectedSet.has(choice.value), className: cn("mui-a66e9985b093 mui-9974acedf3f7 mui-58d0413dd93c mui-c62ec162662e mui-726fca123972 mui-393883c1db68 mui-e9347b78185f", selectedSet.has(choice.value) && "mui-292affc1f780", classNames?.option), onClick: () => {
364
425
  if (field.kind === "single")
365
426
  apply(choice.value, false);
366
427
  else {
@@ -369,23 +430,26 @@ function ChoiceEditor({ field, value, input, options, disabled, apply, location,
369
430
  : [...selected, choice.value];
370
431
  apply(next.length ? next : field.clearValue, false);
371
432
  }
372
- }, children: field.renderOption
373
- ? field.renderOption(choice, { selected: selectedSet.has(choice.value) })
374
- : choice.label }, choice.value)))) : field.kind === "single" ? (_jsxs(DropdownMenuRadioGroup, { value: typeof value === "string" ? value : "", onValueChange: (next) => apply(next || field.clearValue), children: [location === "chip" && field.removable !== false && (_jsxs(DropdownMenuRadioItem, { value: "", disabled: disabled, onSelect: (event) => event.preventDefault(), children: ["Any ", field.label.toLowerCase()] })), options.items.map((choice) => (_jsx(DropdownMenuRadioItem, { "aria-label": choice.label, className: classNames?.option, value: choice.value, onSelect: (event) => event.preventDefault(), disabled: disabled || choice.disabled, children: field.renderOption
375
- ? field.renderOption(choice, { selected: selectedSet.has(choice.value) })
376
- : choice.label }, choice.value)))] })) : (options.items.map((choice) => (_jsx(FilterCheckboxItem, { "aria-label": choice.label, className: classNames?.option, disabled: disabled || choice.disabled, checked: selectedSet.has(choice.value), onCheckedChange: (checked) => {
377
- const next = checked
378
- ? [...new Set([...selected, choice.value])]
379
- : selected.filter((item) => item !== choice.value);
380
- apply(next.length ? next : field.clearValue, false);
381
- }, children: field.renderOption
382
- ? field.renderOption(choice, { selected: selectedSet.has(choice.value) })
383
- : choice.label }, choice.value)))) }), _jsx(OptionFeedback, { options: options, error: error })] }));
433
+ }, children: content }, choice.key));
434
+ const position = choices.length > 100
435
+ ? { "aria-posinset": index + 1, "aria-setsize": choices.length }
436
+ : {};
437
+ if (field.kind === "single")
438
+ return (_jsx(DropdownMenuRadioItem, { ...common, ...position, value: choice.value, onSelect: (event) => event.preventDefault(), children: content }, choice.key));
439
+ return (_jsx(FilterCheckboxItem, { ...common, ...position, checked: selectedSet.has(choice.value), onCheckedChange: (checked) => {
440
+ const next = checked
441
+ ? [...new Set([...selected, choice.value])]
442
+ : selected.filter((item) => item !== choice.value);
443
+ apply(next.length ? next : field.clearValue, false);
444
+ }, children: content }, choice.key));
445
+ } }));
446
+ return field.kind === "single" && location !== "inline" ? (_jsx(DropdownMenuRadioGroup, { value: typeof value === "string" ? value : "", onValueChange: (next) => apply(next || field.clearValue), children: list })) : (list);
384
447
  }
385
448
  function OptionFeedback({ options, error, }) {
386
449
  return (_jsxs(_Fragment, { children: [error && (_jsx("p", { role: "alert", className: "mui-0f9e6672913a mui-b5edc3ea7c91 mui-c74ab393b96d mui-887b9502d5c7", children: error })), options.loading && (_jsx("p", { role: "status", className: "mui-0f9e6672913a mui-b5edc3ea7c91 mui-c74ab393b96d mui-35f35c41d134", children: "Loading options\u2026" })), !options.loading && !options.error && options.items.length === 0 && (_jsx("p", { role: "status", className: "mui-094f5333853b mui-c74ab393b96d mui-35f35c41d134", children: "No options found." })), options.error && (_jsxs("div", { "data-mendy-ui": "", className: "mui-267171770524 mui-094f5333853b", children: [_jsx("p", { role: "alert", className: "mui-c74ab393b96d mui-887b9502d5c7", children: options.error }), _jsx(Button, { size: "sm", variant: "outline", onClick: options.retry, children: "Retry" })] })), options.hasMore && (_jsx(Button, { variant: "ghost", className: "mui-58d0413dd93c", disabled: options.loading, onClick: options.loadMore, children: "Load more" }))] }));
387
450
  }
388
- function ValueEditor({ field, draft, setDraft, text, setText, input, error, id, disabled, apply, }) {
451
+ function ValueEditor({ location, field, draft, setDraft, text, setText, input, error, id, disabled, apply, }) {
452
+ const [attempted, setAttempted] = useState(false);
389
453
  const candidate = field.kind === "tokens"
390
454
  ? text.split(/[\r\n\t,]+/).flatMap((item) => (item.trim() ? [item.trim()] : []))
391
455
  : field.kind === "text"
@@ -398,17 +462,19 @@ function ValueEditor({ field, draft, setDraft, text, setText, input, error, id,
398
462
  catch {
399
463
  validation = "Enter a valid value.";
400
464
  }
465
+ const message = (text.length > 0 || attempted || field.kind === "numberRange" ? validation : undefined) ??
466
+ error;
401
467
  return (_jsxs("div", { "data-mendy-ui": "", className: "mui-37535002f0f7 mui-81b198a2db84 mui-267171770524 mui-094f5333853b", onKeyDown: (event) => {
402
468
  if (event.key === "Tab")
403
469
  event.stopPropagation();
404
- }, children: [field.kind === "numberRange" ? (_jsxs("fieldset", { disabled: disabled, className: "mui-267171770524", children: [_jsx("legend", { className: "mui-c74ab393b96d mui-daaac3fbf55e", children: field.label }), [0, 1].map((index) => {
470
+ }, children: [field.kind === "numberRange" ? (_jsxs("fieldset", { disabled: disabled, className: "mui-a2526bc2efa3 mui-184ddc11e5f9 mui-267171770524 mui-dad556abfe15 mui-04760bcd507f", children: [_jsx("legend", { className: cn("mui-04760bcd507f mui-c74ab393b96d mui-daaac3fbf55e", location === "menu" && "mui-32fb090591d9"), children: field.label }), [0, 1].map((index) => {
405
471
  const key = index === 0 ? "from" : "to";
406
472
  const rangeValue = draft?.[index];
407
473
  return (_jsxs(Label, { className: "mui-496aca80e4d8 mui-27e6c432192f mui-3992de70b033", children: [index === 0 ? "Minimum" : "Maximum", _jsx(Input, { ref: index === 0
408
474
  ? (node) => {
409
475
  input.current = node;
410
476
  }
411
- : undefined, "aria-invalid": Boolean(validation || error), "aria-describedby": validation || error ? `${id}-error` : undefined, type: "number", value: rangeValue ?? "", onKeyDown: (event) => {
477
+ : undefined, "aria-invalid": Boolean(message), "aria-describedby": message ? `${id}-error` : `${id}-hint`, type: "number", value: rangeValue ?? "", onKeyDown: (event) => {
412
478
  if (event.key !== "Escape" && event.key !== "Tab")
413
479
  event.stopPropagation();
414
480
  }, onChange: (event) => {
@@ -421,15 +487,26 @@ function ValueEditor({ field, draft, setDraft, text, setText, input, error, id,
421
487
  setDraft(range);
422
488
  apply(range, false);
423
489
  } })] }, key));
424
- })] })) : (_jsxs(_Fragment, { children: [_jsx(Label, { htmlFor: id, className: "mui-c74ab393b96d mui-daaac3fbf55e", children: field.searchLabel ?? field.label }), _jsx(Textarea, { id: id, ref: (node) => {
490
+ })] })) : (_jsxs(_Fragment, { children: [_jsx(Label, { htmlFor: id, className: cn("mui-c74ab393b96d mui-daaac3fbf55e", location === "menu" && "mui-3992de70b033 mui-52101fc7d8bb mui-35f35c41d134"), children: field.searchLabel ?? field.label }), _jsx(Textarea, { className: "mui-ae112c903ef8", id: id, ref: (node) => {
425
491
  input.current = node;
426
- }, disabled: disabled, placeholder: field.placeholder, value: text, "aria-invalid": Boolean(validation || error), "aria-describedby": validation || error ? `${id}-error` : undefined, onChange: (event) => setText(event.target.value), onKeyDown: (event) => {
492
+ }, disabled: disabled, placeholder: field.placeholder, value: text, "aria-invalid": Boolean(message), "aria-describedby": message ? `${id}-error` : `${id}-hint`, onChange: (event) => {
493
+ setAttempted(false);
494
+ setText(event.target.value);
495
+ }, onKeyDown: (event) => {
427
496
  if (event.key === "Enter" && !event.shiftKey && !event.nativeEvent.isComposing) {
428
497
  event.preventDefault();
498
+ setAttempted(true);
429
499
  if (!validation)
430
500
  apply(candidate);
431
501
  }
432
502
  if (event.key !== "Escape" && event.key !== "Tab")
433
503
  event.stopPropagation();
434
- } })] })), (validation || error) && (_jsx("p", { role: "alert", id: `${id}-error`, className: "mui-c74ab393b96d mui-887b9502d5c7", children: validation ?? error })), field.kind !== "numberRange" && (_jsx("p", { className: "mui-3992de70b033 mui-35f35c41d134", children: "Enter to save. Shift+Enter for a new line." }))] }));
504
+ } })] })), _jsx(ValueEditorFeedback, { message: message, id: id, hasHint: field.kind !== "numberRange" })] }));
505
+ }
506
+ function ValueEditorFeedback({ message, id, hasHint, }) {
507
+ if (message)
508
+ return (_jsx("p", { role: "alert", id: `${id}-error`, className: "mui-3992de70b033 mui-887b9502d5c7", children: message }));
509
+ if (!hasHint)
510
+ return null;
511
+ return (_jsx("p", { id: `${id}-hint`, className: "mui-3992de70b033 mui-35f35c41d134", children: "Enter to save. Shift+Enter for a new line." }));
435
512
  }