@flanksource/clicky-ui 0.2.15 → 0.2.17

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 (205) hide show
  1. package/dist/chat.cjs +16 -0
  2. package/dist/chat.cjs.map +1 -1
  3. package/dist/chat.js +17 -1
  4. package/dist/chat.js.map +1 -1
  5. package/dist/components/Combobox.cjs +34 -11
  6. package/dist/components/Combobox.cjs.map +1 -1
  7. package/dist/components/Combobox.d.ts +8 -0
  8. package/dist/components/Combobox.d.ts.map +1 -1
  9. package/dist/components/Combobox.js +34 -11
  10. package/dist/components/Combobox.js.map +1 -1
  11. package/dist/components/DateTimePicker.cjs +3 -0
  12. package/dist/components/DateTimePicker.cjs.map +1 -1
  13. package/dist/components/DateTimePicker.d.ts +6 -2
  14. package/dist/components/DateTimePicker.d.ts.map +1 -1
  15. package/dist/components/DateTimePicker.js +3 -0
  16. package/dist/components/DateTimePicker.js.map +1 -1
  17. package/dist/components/Field.cjs +33 -0
  18. package/dist/components/Field.cjs.map +1 -0
  19. package/dist/components/Field.d.ts +27 -0
  20. package/dist/components/Field.d.ts.map +1 -0
  21. package/dist/components/Field.js +33 -0
  22. package/dist/components/Field.js.map +1 -0
  23. package/dist/components/FilterBar.cjs +81 -20
  24. package/dist/components/FilterBar.cjs.map +1 -1
  25. package/dist/components/FilterBar.d.ts +30 -0
  26. package/dist/components/FilterBar.d.ts.map +1 -1
  27. package/dist/components/FilterBar.js +83 -22
  28. package/dist/components/FilterBar.js.map +1 -1
  29. package/dist/components/JsonSchemaForm.cjs +26 -3
  30. package/dist/components/JsonSchemaForm.cjs.map +1 -1
  31. package/dist/components/JsonSchemaForm.d.ts.map +1 -1
  32. package/dist/components/JsonSchemaForm.js +26 -3
  33. package/dist/components/JsonSchemaForm.js.map +1 -1
  34. package/dist/components/MultiSelect.cjs +2 -1
  35. package/dist/components/MultiSelect.cjs.map +1 -1
  36. package/dist/components/MultiSelect.d.ts +5 -1
  37. package/dist/components/MultiSelect.d.ts.map +1 -1
  38. package/dist/components/MultiSelect.js +2 -1
  39. package/dist/components/MultiSelect.js.map +1 -1
  40. package/dist/components/json-schema-form-fields.cjs +15 -8
  41. package/dist/components/json-schema-form-fields.cjs.map +1 -1
  42. package/dist/components/json-schema-form-fields.d.ts.map +1 -1
  43. package/dist/components/json-schema-form-fields.js +15 -8
  44. package/dist/components/json-schema-form-fields.js.map +1 -1
  45. package/dist/components/json-schema-form-preferences.cjs +4 -0
  46. package/dist/components/json-schema-form-preferences.cjs.map +1 -1
  47. package/dist/components/json-schema-form-preferences.d.ts +2 -0
  48. package/dist/components/json-schema-form-preferences.d.ts.map +1 -1
  49. package/dist/components/json-schema-form-preferences.js +4 -0
  50. package/dist/components/json-schema-form-preferences.js.map +1 -1
  51. package/dist/components/json-schema-form-render.cjs +1 -1
  52. package/dist/components/json-schema-form-render.cjs.map +1 -1
  53. package/dist/components/json-schema-form-render.d.ts.map +1 -1
  54. package/dist/components/json-schema-form-render.js +2 -2
  55. package/dist/components/json-schema-form-render.js.map +1 -1
  56. package/dist/components/json-schema-form-types.d.ts +4 -2
  57. package/dist/components/json-schema-form-types.d.ts.map +1 -1
  58. package/dist/components/json-schema-form-utils.cjs +13 -0
  59. package/dist/components/json-schema-form-utils.cjs.map +1 -1
  60. package/dist/components/json-schema-form-utils.d.ts +2 -0
  61. package/dist/components/json-schema-form-utils.d.ts.map +1 -1
  62. package/dist/components/json-schema-form-utils.js +13 -0
  63. package/dist/components/json-schema-form-utils.js.map +1 -1
  64. package/dist/components/loading.cjs +21 -8
  65. package/dist/components/loading.cjs.map +1 -1
  66. package/dist/components/loading.d.ts +6 -4
  67. package/dist/components/loading.d.ts.map +1 -1
  68. package/dist/components/loading.js +21 -8
  69. package/dist/components/loading.js.map +1 -1
  70. package/dist/components/use-form.cjs +27 -0
  71. package/dist/components/use-form.cjs.map +1 -0
  72. package/dist/components/use-form.d.ts +30 -0
  73. package/dist/components/use-form.d.ts.map +1 -0
  74. package/dist/components/use-form.js +27 -0
  75. package/dist/components/use-form.js.map +1 -0
  76. package/dist/components.cjs +7 -0
  77. package/dist/components.cjs.map +1 -1
  78. package/dist/components.d.ts +4 -1
  79. package/dist/components.d.ts.map +1 -1
  80. package/dist/components.js +8 -1
  81. package/dist/components.js.map +1 -1
  82. package/dist/data/Markdown.cjs +14 -40
  83. package/dist/data/Markdown.cjs.map +1 -1
  84. package/dist/data/Markdown.d.ts +3 -0
  85. package/dist/data/Markdown.d.ts.map +1 -1
  86. package/dist/data/Markdown.js +14 -40
  87. package/dist/data/Markdown.js.map +1 -1
  88. package/dist/data/TaskProgress.cjs +22 -0
  89. package/dist/data/TaskProgress.cjs.map +1 -1
  90. package/dist/data/TaskProgress.js +22 -0
  91. package/dist/data/TaskProgress.js.map +1 -1
  92. package/dist/data/TaskSnapshot.cjs.map +1 -1
  93. package/dist/data/TaskSnapshot.d.ts +5 -0
  94. package/dist/data/TaskSnapshot.d.ts.map +1 -1
  95. package/dist/data/TaskSnapshot.js.map +1 -1
  96. package/dist/data/Tree.cjs +32 -1
  97. package/dist/data/Tree.cjs.map +1 -1
  98. package/dist/data/Tree.d.ts +9 -1
  99. package/dist/data/Tree.d.ts.map +1 -1
  100. package/dist/data/Tree.js +32 -1
  101. package/dist/data/Tree.js.map +1 -1
  102. package/dist/data/chat/Attachment.cjs +79 -0
  103. package/dist/data/chat/Attachment.cjs.map +1 -0
  104. package/dist/data/chat/Attachment.d.ts +18 -0
  105. package/dist/data/chat/Attachment.d.ts.map +1 -0
  106. package/dist/data/chat/Attachment.js +79 -0
  107. package/dist/data/chat/Attachment.js.map +1 -0
  108. package/dist/data/chat/Chat.cjs +71 -14
  109. package/dist/data/chat/Chat.cjs.map +1 -1
  110. package/dist/data/chat/Chat.d.ts +30 -12
  111. package/dist/data/chat/Chat.d.ts.map +1 -1
  112. package/dist/data/chat/Chat.fixtures.d.ts +9 -0
  113. package/dist/data/chat/Chat.fixtures.d.ts.map +1 -1
  114. package/dist/data/chat/Chat.js +73 -16
  115. package/dist/data/chat/Chat.js.map +1 -1
  116. package/dist/data/chat/Conversation.cjs +32 -14
  117. package/dist/data/chat/Conversation.cjs.map +1 -1
  118. package/dist/data/chat/Conversation.d.ts +5 -3
  119. package/dist/data/chat/Conversation.d.ts.map +1 -1
  120. package/dist/data/chat/Conversation.js +34 -16
  121. package/dist/data/chat/Conversation.js.map +1 -1
  122. package/dist/data/chat/Message.cjs +73 -14
  123. package/dist/data/chat/Message.cjs.map +1 -1
  124. package/dist/data/chat/Message.d.ts +11 -4
  125. package/dist/data/chat/Message.d.ts.map +1 -1
  126. package/dist/data/chat/Message.js +75 -16
  127. package/dist/data/chat/Message.js.map +1 -1
  128. package/dist/data/chat/MessageActions.cjs +54 -0
  129. package/dist/data/chat/MessageActions.cjs.map +1 -0
  130. package/dist/data/chat/MessageActions.d.ts +11 -0
  131. package/dist/data/chat/MessageActions.d.ts.map +1 -0
  132. package/dist/data/chat/MessageActions.js +54 -0
  133. package/dist/data/chat/MessageActions.js.map +1 -0
  134. package/dist/data/chat/ModelSelector.cjs +43 -0
  135. package/dist/data/chat/ModelSelector.cjs.map +1 -0
  136. package/dist/data/chat/ModelSelector.d.ts +22 -0
  137. package/dist/data/chat/ModelSelector.d.ts.map +1 -0
  138. package/dist/data/chat/ModelSelector.js +43 -0
  139. package/dist/data/chat/ModelSelector.js.map +1 -0
  140. package/dist/data/chat/PromptInput.cjs +28 -15
  141. package/dist/data/chat/PromptInput.cjs.map +1 -1
  142. package/dist/data/chat/PromptInput.d.ts +14 -8
  143. package/dist/data/chat/PromptInput.d.ts.map +1 -1
  144. package/dist/data/chat/PromptInput.js +28 -15
  145. package/dist/data/chat/PromptInput.js.map +1 -1
  146. package/dist/data/chat/Reasoning.cjs +37 -0
  147. package/dist/data/chat/Reasoning.cjs.map +1 -0
  148. package/dist/data/chat/Reasoning.d.ts +11 -0
  149. package/dist/data/chat/Reasoning.d.ts.map +1 -0
  150. package/dist/data/chat/Reasoning.js +37 -0
  151. package/dist/data/chat/Reasoning.js.map +1 -0
  152. package/dist/data/chat/Suggestion.cjs +20 -0
  153. package/dist/data/chat/Suggestion.cjs.map +1 -0
  154. package/dist/data/chat/Suggestion.d.ts +10 -0
  155. package/dist/data/chat/Suggestion.d.ts.map +1 -0
  156. package/dist/data/chat/Suggestion.js +20 -0
  157. package/dist/data/chat/Suggestion.js.map +1 -0
  158. package/dist/data/chat/ToolCall.cjs +26 -3
  159. package/dist/data/chat/ToolCall.cjs.map +1 -1
  160. package/dist/data/chat/ToolCall.d.ts +5 -1
  161. package/dist/data/chat/ToolCall.d.ts.map +1 -1
  162. package/dist/data/chat/ToolCall.js +26 -3
  163. package/dist/data/chat/ToolCall.js.map +1 -1
  164. package/dist/data/chat/index.d.ts +7 -2
  165. package/dist/data/chat/index.d.ts.map +1 -1
  166. package/dist/data/chat/types.cjs +16 -0
  167. package/dist/data/chat/types.cjs.map +1 -1
  168. package/dist/data/chat/types.d.ts +29 -2
  169. package/dist/data/chat/types.d.ts.map +1 -1
  170. package/dist/data/chat/types.js +16 -0
  171. package/dist/data/chat/types.js.map +1 -1
  172. package/dist/data/version-info.cjs +3 -3
  173. package/dist/data/version-info.js +3 -3
  174. package/dist/hooks/use-task-run.cjs +33 -20
  175. package/dist/hooks/use-task-run.cjs.map +1 -1
  176. package/dist/hooks/use-task-run.d.ts.map +1 -1
  177. package/dist/hooks/use-task-run.js +33 -20
  178. package/dist/hooks/use-task-run.js.map +1 -1
  179. package/dist/index.cjs +7 -0
  180. package/dist/index.cjs.map +1 -1
  181. package/dist/index.js +8 -1
  182. package/dist/index.js.map +1 -1
  183. package/dist/overlay/Modal.cjs +27 -23
  184. package/dist/overlay/Modal.cjs.map +1 -1
  185. package/dist/overlay/Modal.d.ts +7 -1
  186. package/dist/overlay/Modal.d.ts.map +1 -1
  187. package/dist/overlay/Modal.js +27 -23
  188. package/dist/overlay/Modal.js.map +1 -1
  189. package/dist/rpc/FilterForm.cjs +4 -4
  190. package/dist/rpc/FilterForm.cjs.map +1 -1
  191. package/dist/rpc/FilterForm.js +4 -4
  192. package/dist/rpc/FilterForm.js.map +1 -1
  193. package/dist/rpc/OperationCatalog.cjs +17 -21
  194. package/dist/rpc/OperationCatalog.cjs.map +1 -1
  195. package/dist/rpc/OperationCatalog.d.ts +3 -3
  196. package/dist/rpc/OperationCatalog.d.ts.map +1 -1
  197. package/dist/rpc/OperationCatalog.js +18 -22
  198. package/dist/rpc/OperationCatalog.js.map +1 -1
  199. package/dist/rpc/formMetadata.cjs +5 -3
  200. package/dist/rpc/formMetadata.cjs.map +1 -1
  201. package/dist/rpc/formMetadata.d.ts.map +1 -1
  202. package/dist/rpc/formMetadata.js +5 -3
  203. package/dist/rpc/formMetadata.js.map +1 -1
  204. package/dist/styles.css +1 -1
  205. package/package.json +6 -1
@@ -25,6 +25,10 @@ const FILTER_BAR_OVERFLOW_TRIGGER_ESTIMATE_PX = 44;
25
25
  const FilterBarContext = react.createContext({
26
26
  autoSubmit: true
27
27
  });
28
+ function applyFilterExtensions(filter, extensions) {
29
+ if (!extensions || extensions.length === 0) return filter;
30
+ return extensions.reduce((current, ext) => ext(current), filter);
31
+ }
28
32
  function FilterBar({
29
33
  search,
30
34
  filters,
@@ -365,7 +369,13 @@ function OverflowFiltersMenu({
365
369
  className: "flex min-w-0 items-center gap-1 truncate text-[10px] font-medium uppercase tracking-wide text-muted-foreground",
366
370
  title: filter.description ?? filter.label,
367
371
  children: [
368
- /* @__PURE__ */ jsxRuntime.jsx(Icon.LabelIcon, { icon: filter.icon, className: "text-[12px] normal-case" }),
372
+ /* @__PURE__ */ jsxRuntime.jsx(
373
+ Icon.LabelIcon,
374
+ {
375
+ icon: sizedIcon(filter.icon, 12),
376
+ className: "text-[12px] normal-case"
377
+ }
378
+ ),
369
379
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: filter.label })
370
380
  ]
371
381
  }
@@ -476,7 +486,7 @@ function TextFilterValueControl({ filter }) {
476
486
  type: "text",
477
487
  "aria-label": filter.label,
478
488
  className: valueInputClassName(filter.disabled),
479
- placeholder: filter.placeholder ?? "Filter...",
489
+ ...filter.placeholder !== void 0 ? { placeholder: filter.placeholder } : {},
480
490
  value: draft,
481
491
  disabled: filter.disabled,
482
492
  onChange: (event) => setDraft(event.target.value)
@@ -561,7 +571,7 @@ function EnumFilterValueControl({ filter }) {
561
571
  value: filter.value,
562
572
  onChange: filter.onChange,
563
573
  allowCustomValue: false,
564
- placeholder: filter.placeholder ?? `Any ${filter.label.toLowerCase()}`,
574
+ ...filter.placeholder !== void 0 ? { placeholder: filter.placeholder } : {},
565
575
  className: "w-full",
566
576
  ...filter.disabled !== void 0 ? { disabled: filter.disabled } : {}
567
577
  }
@@ -588,7 +598,8 @@ function SelectMultiFilterValueControl({ filter }) {
588
598
  options: filter.options,
589
599
  value: filter.value,
590
600
  onChange: filter.onChange,
591
- placeholder: filter.placeholder ?? `Any ${filter.label.toLowerCase()}`,
601
+ ariaLabel: `${filter.label} filter`,
602
+ ...filter.placeholder !== void 0 ? { placeholder: filter.placeholder } : {},
592
603
  ...filter.disabled !== void 0 ? { disabled: filter.disabled } : {},
593
604
  triggerClassName: "h-8 w-full rounded-md border border-input bg-background px-2 text-sm shadow-none",
594
605
  menuClassName: "left-auto right-0"
@@ -633,12 +644,12 @@ function EnumFilterField({ filter, grow }) {
633
644
  return /* @__PURE__ */ jsxRuntime.jsx(
634
645
  Combobox.Combobox,
635
646
  {
636
- label: filter.label,
647
+ ...comboboxLabelProps(filter),
637
648
  options: enumOptionsToCombobox(filter.options),
638
649
  value: filter.value,
639
650
  onChange: filter.onChange,
640
651
  allowCustomValue: false,
641
- placeholder: filter.placeholder ?? `Any ${filter.label.toLowerCase()}`,
652
+ ...filter.placeholder !== void 0 ? { placeholder: filter.placeholder } : {},
642
653
  className: utils.cn(lookupFieldWidthClass(grow), filter.className),
643
654
  ...filter.disabled !== void 0 ? { disabled: filter.disabled } : {}
644
655
  }
@@ -717,7 +728,7 @@ function TextFilterField({ filter, grow }) {
717
728
  type: "text",
718
729
  "aria-label": filter.label,
719
730
  className: "w-full min-w-0 bg-transparent text-sm text-foreground outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed",
720
- placeholder: filter.placeholder ?? "Filter…",
731
+ ...filter.placeholder !== void 0 ? { placeholder: filter.placeholder } : {},
721
732
  value: draft,
722
733
  disabled: filter.disabled,
723
734
  onChange: (event) => setDraft(event.target.value)
@@ -733,6 +744,20 @@ function FilterFieldLabel({ icon, label }) {
733
744
  label
734
745
  ] });
735
746
  }
747
+ function sizedIcon(icon, px) {
748
+ if (!react.isValidElement(icon)) return icon;
749
+ const el = icon;
750
+ return react.cloneElement(el, {
751
+ style: { width: `${px}px`, height: `${px}px`, ...el.props.style ?? {} }
752
+ });
753
+ }
754
+ function comboboxLabelProps(filter) {
755
+ if (filter.icon == null) return { label: filter.label };
756
+ return {
757
+ label: /* @__PURE__ */ jsxRuntime.jsx("span", { title: filter.label, className: "inline-flex items-center text-[10px]", children: /* @__PURE__ */ jsxRuntime.jsx(Icon.LabelIcon, { icon: sizedIcon(filter.icon, 10), className: "normal-case" }) }),
758
+ ariaLabel: filter.label
759
+ };
760
+ }
736
761
  function lookupFieldWidthClass(grow) {
737
762
  return grow ? "min-w-[12rem] max-w-[18rem] flex-1" : "min-w-[11rem] max-w-[15rem] shrink-0";
738
763
  }
@@ -783,7 +808,7 @@ function LookupFilterField({ filter, grow }) {
783
808
  return /* @__PURE__ */ jsxRuntime.jsx(
784
809
  Combobox.Combobox,
785
810
  {
786
- label: filter.label,
811
+ ...comboboxLabelProps(filter),
787
812
  options: lookupOptionsToCombobox(filter.options),
788
813
  value: filter.value,
789
814
  onChange: filter.onChange,
@@ -802,7 +827,7 @@ function LookupMultiFilterField({
802
827
  Combobox.Combobox,
803
828
  {
804
829
  multiple: true,
805
- label: filter.label,
830
+ ...comboboxLabelProps(filter),
806
831
  options: lookupOptionsToCombobox(filter.options),
807
832
  value: filter.value,
808
833
  onChange: filter.onChange,
@@ -910,7 +935,7 @@ function NumberFilterField({ filter, grow }) {
910
935
  step: bounds.step,
911
936
  "aria-label": `${filter.label} minimum`,
912
937
  className: "h-8 w-full rounded-md border border-input bg-background px-2 text-xs outline-none focus-visible:ring-2 focus-visible:ring-ring",
913
- placeholder: filter.minPlaceholder ?? formatNumberValue(bounds.min, filter),
938
+ ...filter.minPlaceholder !== void 0 ? { placeholder: filter.minPlaceholder } : {},
914
939
  value: draft.min ?? "",
915
940
  onChange: (event) => setDraft(
916
941
  normalizeNumberFilterValue(
@@ -931,7 +956,7 @@ function NumberFilterField({ filter, grow }) {
931
956
  step: bounds.step,
932
957
  "aria-label": `${filter.label} maximum`,
933
958
  className: "h-8 w-full rounded-md border border-input bg-background px-2 text-xs outline-none focus-visible:ring-2 focus-visible:ring-ring",
934
- placeholder: filter.maxPlaceholder ?? formatNumberValue(bounds.max, filter),
959
+ ...filter.maxPlaceholder !== void 0 ? { placeholder: filter.maxPlaceholder } : {},
935
960
  value: draft.max ?? "",
936
961
  onChange: (event) => setDraft(
937
962
  normalizeNumberFilterValue(
@@ -1015,7 +1040,7 @@ function NumberFilterPanel({
1015
1040
  step: bounds.step,
1016
1041
  "aria-label": `${filter.label} minimum`,
1017
1042
  className: "h-8 w-full rounded-md border border-input bg-background px-2 text-xs outline-none focus-visible:ring-2 focus-visible:ring-ring",
1018
- placeholder: filter.minPlaceholder ?? formatNumberValue(bounds.min, filter),
1043
+ ...filter.minPlaceholder !== void 0 ? { placeholder: filter.minPlaceholder } : {},
1019
1044
  value: draft.min ?? "",
1020
1045
  onChange: (event) => setDraft(
1021
1046
  normalizeNumberFilterValue(
@@ -1036,7 +1061,7 @@ function NumberFilterPanel({
1036
1061
  step: bounds.step,
1037
1062
  "aria-label": `${filter.label} maximum`,
1038
1063
  className: "h-8 w-full rounded-md border border-input bg-background px-2 text-xs outline-none focus-visible:ring-2 focus-visible:ring-ring",
1039
- placeholder: filter.maxPlaceholder ?? formatNumberValue(bounds.max, filter),
1064
+ ...filter.maxPlaceholder !== void 0 ? { placeholder: filter.maxPlaceholder } : {},
1040
1065
  value: draft.max ?? "",
1041
1066
  onChange: (event) => setDraft(
1042
1067
  normalizeNumberFilterValue(
@@ -1083,19 +1108,32 @@ function MultiFilterField({ filter, grow }) {
1083
1108
  };
1084
1109
  }, [onSearch, optionQuery]);
1085
1110
  const summary = summarizeMultiFilter(filter.label, draft);
1086
- const showOptionFilter = filter.truncated || Boolean(onSearch) || filter.options.length > 7;
1111
+ const allowCustomValue = Boolean(filter.allowCustomValue);
1112
+ const baseOptions = react.useMemo(() => {
1113
+ if (!allowCustomValue) return filter.options;
1114
+ const known = new Set(filter.options.map((o) => o.value));
1115
+ const pinned = Object.keys(draft).filter((v) => !known.has(v)).map((v) => ({ value: v, label: v }));
1116
+ return mergeMultiSelectOptions(pinned, filter.options);
1117
+ }, [allowCustomValue, filter.options, draft]);
1118
+ const showOptionFilter = filter.truncated || Boolean(onSearch) || allowCustomValue || filter.options.length > 7;
1087
1119
  const visibleOptions = react.useMemo(() => {
1088
1120
  const query = optionQuery.trim();
1089
- if (!query) return filter.options;
1121
+ if (!query) return baseOptions;
1090
1122
  if (onSearch) {
1091
- const selectedHead = filter.options.filter((o) => draft[o.value] !== void 0);
1123
+ const selectedHead = baseOptions.filter((o) => draft[o.value] !== void 0);
1092
1124
  return mergeMultiSelectOptions(selectedHead, searchOptions);
1093
1125
  }
1094
1126
  const lowered = query.toLowerCase();
1095
- return filter.options.filter(
1127
+ return baseOptions.filter(
1096
1128
  (option) => multiSelectOptionText(option).toLowerCase().includes(lowered)
1097
1129
  );
1098
- }, [filter.options, searchOptions, optionQuery, onSearch, draft]);
1130
+ }, [baseOptions, searchOptions, optionQuery, onSearch, draft]);
1131
+ const trimmedQuery = optionQuery.trim();
1132
+ const canAddCustom = allowCustomValue && trimmedQuery !== "" && !visibleOptions.some((o) => o.value === trimmedQuery);
1133
+ const addCustom = () => {
1134
+ setDraft(updateMultiFilterValue(draft, trimmedQuery, "include"));
1135
+ setOptionQuery("");
1136
+ };
1099
1137
  const moreCount = filter.truncated && filter.total ? Math.max(filter.total - filter.options.length, 0) : 0;
1100
1138
  return /* @__PURE__ */ jsxRuntime.jsxs(
1101
1139
  "div",
@@ -1194,7 +1232,28 @@ function MultiFilterField({ filter, grow }) {
1194
1232
  option.value
1195
1233
  );
1196
1234
  }),
1197
- visibleOptions.length === 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-2 py-3 text-sm text-muted-foreground", children: "No options found" })
1235
+ canAddCustom && /* @__PURE__ */ jsxRuntime.jsxs(
1236
+ "div",
1237
+ {
1238
+ role: "button",
1239
+ tabIndex: 0,
1240
+ "data-filter-add-custom": trimmedQuery,
1241
+ className: "rounded-md px-2 py-1 text-sm text-primary hover:bg-accent/50 focus-visible:bg-accent/50 focus-visible:outline-none",
1242
+ onClick: addCustom,
1243
+ onKeyDown: (event) => {
1244
+ if (event.key === "Enter" || event.key === " ") {
1245
+ event.preventDefault();
1246
+ addCustom();
1247
+ }
1248
+ },
1249
+ children: [
1250
+ "Add “",
1251
+ trimmedQuery,
1252
+ "”"
1253
+ ]
1254
+ }
1255
+ ),
1256
+ visibleOptions.length === 0 && !canAddCustom && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-2 py-3 text-sm text-muted-foreground", children: "No options found" })
1198
1257
  ] }),
1199
1258
  moreCount > 0 && !optionQuery.trim() && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-2 px-1.5 text-[11px] text-muted-foreground", children: [
1200
1259
  "… and ",
@@ -1732,7 +1791,8 @@ function SelectMultiFilterField({
1732
1791
  options: filter.options,
1733
1792
  value: filter.value,
1734
1793
  onChange: filter.onChange,
1735
- placeholder: filter.placeholder ?? `Any ${filter.label.toLowerCase()}`,
1794
+ ariaLabel: `${filter.label} filter`,
1795
+ ...filter.placeholder !== void 0 ? { placeholder: filter.placeholder } : {},
1736
1796
  ...filter.disabled !== void 0 ? { disabled: filter.disabled } : {},
1737
1797
  triggerClassName: "h-6 min-w-0 border-0 bg-transparent px-1 text-xs shadow-none focus-visible:ring-0",
1738
1798
  menuClassName: "left-auto right-0"
@@ -2111,4 +2171,5 @@ function estimateFilterWidth(filter) {
2111
2171
  exports.FilterBar = FilterBar;
2112
2172
  exports.FilterBarFilterPanel = FilterBarFilterPanel;
2113
2173
  exports.FilterBarRangePanel = FilterBarRangePanel;
2174
+ exports.applyFilterExtensions = applyFilterExtensions;
2114
2175
  //# sourceMappingURL=FilterBar.cjs.map