@motor-hero/ui-kit 0.50.0 → 0.51.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,6 +6,10 @@ export interface ComboboxOption {
6
6
  /** Optional leading decoration rendered before the label (icon, colored
7
7
  * dot) — purely visual, doesn't affect filtering/matching. */
8
8
  icon?: React.ReactNode;
9
+ /** Linha secundária abaixo do rótulo na lista (ex.: e-mail de uma pessoa,
10
+ * para separar homônimos). No gatilho vira o `title`. Entra na busca do
11
+ * modo cliente. */
12
+ description?: string;
9
13
  }
10
14
  export interface ComboboxProps {
11
15
  options: ComboboxOption[];
@@ -59,4 +63,9 @@ export interface ComboboxProps {
59
63
  * estado de erro) e fica com a borda vermelha quando inválido.
60
64
  */
61
65
  export declare function Combobox({ options, value, onChange, placeholder, searchPlaceholder, emptyMessage, disabled, id, className, "aria-invalid": ariaInvalid, "aria-describedby": ariaDescribedby, onSearchChange, onLoadMore, loading, hasMore, selectedOption, creatable, formatCreateLabel, deselectable, }: ComboboxProps): React.JSX.Element;
66
+ export declare const filterByKeywords: (_value: string, search: string, keywords?: string[]) => number;
67
+ export declare const optionKeywords: (option: ComboboxOption) => string[];
68
+ export declare function OptionText({ option }: {
69
+ option: ComboboxOption;
70
+ }): React.JSX.Element;
62
71
  //# sourceMappingURL=combobox.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"combobox.d.ts","sourceRoot":"","sources":["../../src/components/combobox.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B,MAAM,WAAW,cAAc;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;kEAC8D;IAC9D,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC7B,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,oDAAoD;IACpD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,+CAA+C;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;IAC5C,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;qEACiE;IACjE,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,0DAA0D;IAC1D,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,uEAAuE;IACvE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yDAAyD;IACzD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;wDACoD;IACpD,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC;;yDAEqD;IACrD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,4DAA4D;IAC5D,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;IAC/C;mFAC+E;IAC/E,YAAY,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,QAAQ,CAAC,EACxB,OAAO,EACP,KAAK,EACL,QAAQ,EACR,WAA4B,EAC5B,iBAA+B,EAC/B,YAA6C,EAC7C,QAAQ,EACR,EAAE,EACF,SAAS,EACT,cAAc,EAAE,WAAW,EAC3B,kBAAkB,EAAE,eAAe,EACnC,cAAc,EACd,UAAU,EACV,OAAO,EACP,OAAO,EACP,cAAc,EACd,SAAS,EACT,iBAAiB,EACjB,YAAY,GACZ,EAAE,aAAa,qBAyLf"}
1
+ {"version":3,"file":"combobox.d.ts","sourceRoot":"","sources":["../../src/components/combobox.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B,MAAM,WAAW,cAAc;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;kEAC8D;IAC9D,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB;;uBAEmB;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC7B,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,oDAAoD;IACpD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,+CAA+C;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;IAC5C,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;qEACiE;IACjE,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,0DAA0D;IAC1D,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,uEAAuE;IACvE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yDAAyD;IACzD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;wDACoD;IACpD,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC;;yDAEqD;IACrD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,4DAA4D;IAC5D,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;IAC/C;mFAC+E;IAC/E,YAAY,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,QAAQ,CAAC,EACxB,OAAO,EACP,KAAK,EACL,QAAQ,EACR,WAA4B,EAC5B,iBAA+B,EAC/B,YAA6C,EAC7C,QAAQ,EACR,EAAE,EACF,SAAS,EACT,cAAc,EAAE,WAAW,EAC3B,kBAAkB,EAAE,eAAe,EACnC,cAAc,EACd,UAAU,EACV,OAAO,EACP,OAAO,EACP,cAAc,EACd,SAAS,EACT,iBAAiB,EACjB,YAAY,GACZ,EAAE,aAAa,qBA8Lf;AAKD,eAAO,MAAM,gBAAgB,GAC5B,QAAQ,MAAM,EACd,QAAQ,MAAM,EACd,WAAU,MAAM,EAAO,WACsB,CAAC;AAE/C,eAAO,MAAM,cAAc,GAAI,QAAQ,cAAc,aACoB,CAAC;AAE1E,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,cAAc,CAAA;CAAE,qBAchE"}
@@ -1,5 +1,5 @@
1
1
  import * as React from "react";
2
- import type { ComboboxOption } from "./combobox";
2
+ import { type ComboboxOption } from "./combobox";
3
3
  export interface MultiComboboxProps {
4
4
  options: ComboboxOption[];
5
5
  value: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"multi-combobox.d.ts","sourceRoot":"","sources":["../../src/components/multi-combobox.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAK9B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAEhD,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,cAAc,EAAE,CAAA;IACzB,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAA;IACnC,oDAAoD;IACpD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,oCAAoC;IACpC,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,+CAA+C;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAA;IAC3C,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B;qEACiE;IACjE,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACzC,0DAA0D;IAC1D,UAAU,CAAC,EAAE,MAAM,IAAI,CAAA;IACvB,uEAAuE;IACvE,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,yDAAyD;IACzD,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB;+DAC2D;IAC3D,eAAe,CAAC,EAAE,cAAc,EAAE,CAAA;CACnC;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CAAC,EAC5B,OAAO,EACP,KAAK,EACL,QAAQ,EACR,WAA4B,EAC5B,iBAA+B,EAC/B,YAA6C,EAC7C,QAAQ,EACR,EAAE,EACF,SAAS,EACT,cAAc,EAAE,WAAW,EAC3B,kBAAkB,EAAE,eAAe,EACnC,cAAc,EACd,UAAU,EACV,OAAO,EACP,OAAO,EACP,eAAe,GAChB,EAAE,kBAAkB,qBAiMpB"}
1
+ {"version":3,"file":"multi-combobox.d.ts","sourceRoot":"","sources":["../../src/components/multi-combobox.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAK9B,OAAO,EACL,KAAK,cAAc,EAIpB,MAAM,YAAY,CAAA;AAEnB,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,cAAc,EAAE,CAAA;IACzB,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAA;IACnC,oDAAoD;IACpD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,oCAAoC;IACpC,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,+CAA+C;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAA;IAC3C,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B;qEACiE;IACjE,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACzC,0DAA0D;IAC1D,UAAU,CAAC,EAAE,MAAM,IAAI,CAAA;IACvB,uEAAuE;IACvE,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,yDAAyD;IACzD,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB;+DAC2D;IAC3D,eAAe,CAAC,EAAE,cAAc,EAAE,CAAA;CACnC;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CAAC,EAC5B,OAAO,EACP,KAAK,EACL,QAAQ,EACR,WAA4B,EAC5B,iBAA+B,EAC/B,YAA6C,EAC7C,QAAQ,EACR,EAAE,EACF,SAAS,EACT,cAAc,EAAE,WAAW,EAC3B,kBAAkB,EAAE,eAAe,EACnC,cAAc,EACd,UAAU,EACV,OAAO,EACP,OAAO,EACP,eAAe,GAChB,EAAE,kBAAkB,qBA6MpB"}
package/dist/index.cjs CHANGED
@@ -879,7 +879,14 @@ function Combobox({
879
879
  className
880
880
  ),
881
881
  children: [
882
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: cn("truncate", !selected && "text-muted-foreground"), children: selected ? selected.label : placeholder }),
882
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
883
+ "span",
884
+ {
885
+ title: selected?.description,
886
+ className: cn("truncate", !selected && "text-muted-foreground"),
887
+ children: selected ? selected.label : placeholder
888
+ }
889
+ ),
883
890
  /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_lucide_react6.ChevronsUpDown, { className: "h-4 w-4 shrink-0 opacity-50" })
884
891
  ]
885
892
  }
@@ -888,6 +895,7 @@ function Combobox({
888
895
  import_cmdk.Command,
889
896
  {
890
897
  shouldFilter: !isServer,
898
+ filter: filterByKeywords,
891
899
  className: "flex h-full w-full flex-col overflow-hidden",
892
900
  children: [
893
901
  /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "flex items-center border-b px-3", children: [
@@ -912,6 +920,7 @@ function Combobox({
912
920
  import_cmdk.Command.Item,
913
921
  {
914
922
  value: trimmedSearch,
923
+ keywords: [trimmedSearch],
915
924
  onSelect: () => handleSelect(trimmedSearch),
916
925
  className: "relative flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-2.5 text-sm outline-none data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground sm:py-1.5",
917
926
  children: [
@@ -925,7 +934,8 @@ function Combobox({
925
934
  options.map((option) => /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
926
935
  import_cmdk.Command.Item,
927
936
  {
928
- value: isServer ? option.value : option.label,
937
+ value: option.value,
938
+ keywords: optionKeywords(option),
929
939
  disabled: option.disabled,
930
940
  onSelect: () => handleSelect(option.value),
931
941
  className: "relative flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-2.5 text-sm outline-none data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 sm:py-1.5",
@@ -940,7 +950,7 @@ function Combobox({
940
950
  }
941
951
  ),
942
952
  option.icon,
943
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: "truncate", children: option.label })
953
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(OptionText, { option })
944
954
  ]
945
955
  },
946
956
  option.value
@@ -981,6 +991,23 @@ function Combobox({
981
991
  ] })
982
992
  ] });
983
993
  }
994
+ var filterByKeywords = (_value, search, keywords = []) => (0, import_cmdk.defaultFilter)(keywords.join(" "), search);
995
+ var optionKeywords = (option) => option.description ? [option.label, option.description] : [option.label];
996
+ function OptionText({ option }) {
997
+ if (!option.description)
998
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: "truncate", children: option.label });
999
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { className: "flex min-w-0 flex-col", children: [
1000
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: "truncate", children: option.label }),
1001
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
1002
+ "span",
1003
+ {
1004
+ title: option.description,
1005
+ className: "truncate text-xs text-muted-foreground",
1006
+ children: option.description
1007
+ }
1008
+ )
1009
+ ] });
1010
+ }
984
1011
 
985
1012
  // src/components/confirm-dialog.tsx
986
1013
  var AlertDialog = __toESM(require("@radix-ui/react-alert-dialog"), 1);
@@ -1898,6 +1925,10 @@ function MultiCombobox({
1898
1925
  for (const [key, option] of byValue) labelCache.current.set(key, option);
1899
1926
  });
1900
1927
  const selected = value.map((v) => byValue.get(v) ?? labelCache.current.get(v)).filter((option) => option !== void 0);
1928
+ const labelCounts = /* @__PURE__ */ new Map();
1929
+ for (const option of selected)
1930
+ labelCounts.set(option.label, (labelCounts.get(option.label) ?? 0) + 1);
1931
+ const chipLabel = (option) => option.description && (labelCounts.get(option.label) ?? 0) > 1 ? `${option.label} \xB7 ${option.description}` : option.label;
1901
1932
  const { listRef, sentinelRef } = useInfiniteScrollSentinel({
1902
1933
  enabled: isServer && !!hasMore,
1903
1934
  loading,
@@ -1936,9 +1967,10 @@ function MultiCombobox({
1936
1967
  selected.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("span", { className: "text-muted-foreground", children: placeholder }) : selected.map((option) => /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(
1937
1968
  "span",
1938
1969
  {
1970
+ title: option.description,
1939
1971
  className: "inline-flex items-center gap-1 rounded bg-secondary px-1.5 py-0.5 text-xs text-secondary-foreground",
1940
1972
  children: [
1941
- option.label,
1973
+ chipLabel(option),
1942
1974
  /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
1943
1975
  "button",
1944
1976
  {
@@ -1966,6 +1998,7 @@ function MultiCombobox({
1966
1998
  import_cmdk2.Command,
1967
1999
  {
1968
2000
  shouldFilter: !isServer,
2001
+ filter: filterByKeywords,
1969
2002
  className: "flex h-full w-full flex-col overflow-hidden",
1970
2003
  children: [
1971
2004
  /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: "flex items-center border-b px-3", children: [
@@ -1989,7 +2022,8 @@ function MultiCombobox({
1989
2022
  options.map((option) => /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(
1990
2023
  import_cmdk2.Command.Item,
1991
2024
  {
1992
- value: isServer ? option.value : option.label,
2025
+ value: option.value,
2026
+ keywords: optionKeywords(option),
1993
2027
  disabled: option.disabled,
1994
2028
  onSelect: () => toggleValue(option.value),
1995
2029
  className: "relative flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-2.5 text-sm outline-none data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 sm:py-1.5",
@@ -2003,7 +2037,7 @@ function MultiCombobox({
2003
2037
  )
2004
2038
  }
2005
2039
  ),
2006
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("span", { className: "truncate", children: option.label })
2040
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(OptionText, { option })
2007
2041
  ]
2008
2042
  },
2009
2043
  option.value