hazo_ui 6.9.0 → 6.11.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.
package/dist/index.js CHANGED
@@ -4,12 +4,12 @@ import { twMerge } from 'tailwind-merge';
4
4
  import * as React27 from 'react';
5
5
  import React27__default, { lazy, useRef, useState, useCallback, useEffect, useMemo, Fragment, Suspense, useSyncExternalStore } from 'react';
6
6
  import { generateRequestId } from 'hazo_core';
7
- import { withContext, setBrowserCorrelationId } from 'hazo_core/client';
7
+ import { optional_import, withContext, setBrowserCorrelationId } from 'hazo_core/client';
8
8
  import { jsx, jsxs, Fragment as Fragment$1 } from 'react/jsx-runtime';
9
9
  import { Slot } from '@radix-ui/react-slot';
10
10
  import { cva } from 'class-variance-authority';
11
11
  import * as DialogPrimitive from '@radix-ui/react-dialog';
12
- import { X, ChevronDown, ChevronUp, Check, Circle, ChevronRight, ChevronLeft, Filter, Plus, ArrowUpDown, icons, Loader2, AlertTriangle, OctagonAlert, CheckCircle2, ChevronsUpDown, Download, Share2, Copy, GripVertical, ArrowUp, ArrowDown, Pencil, Calendar as Calendar$1 } from 'lucide-react';
12
+ import { X, ChevronDown, ChevronUp, Check, Circle, ChevronRight, ChevronLeft, Filter, Plus, ArrowUpDown, icons, Loader2, AlertTriangle, OctagonAlert, CheckCircle2, ChevronsUpDown, Download, Share2, Copy, GripVertical, ArrowUp, ArrowDown, Pencil, Calendar as Calendar$1, Globe } from 'lucide-react';
13
13
  import * as PopoverPrimitive from '@radix-ui/react-popover';
14
14
  import * as SelectPrimitive from '@radix-ui/react-select';
15
15
  import * as TooltipPrimitive from '@radix-ui/react-tooltip';
@@ -51,7 +51,7 @@ import TableCell from '@tiptap/extension-table-cell';
51
51
  import TableHeader from '@tiptap/extension-table-header';
52
52
  import TaskList from '@tiptap/extension-task-list';
53
53
  import TaskItem from '@tiptap/extension-task-item';
54
- import { LuBold, LuItalic, LuUnderline, LuAlignLeft, LuAlignCenter, LuAlignRight, LuAlignVerticalJustifyStart, LuAlignVerticalJustifyCenter, LuAlignVerticalJustifyEnd, LuList, LuUndo2, LuRedo2, LuMinus, LuPlus, LuStrikethrough, LuSubscript, LuSuperscript, LuLink, LuRemoveFormatting, LuPalette, LuHighlighter, LuAlignJustify, LuListOrdered, LuListChecks, LuIndentDecrease, LuIndentIncrease, LuTable, LuTableRowsSplit, LuTableColumnsSplit, LuTrash2, LuGrid3X3, LuVariable, LuPaperclip, LuX, LuImage, LuFileText, LuFileCode, LuFile } from 'react-icons/lu';
54
+ import { LuBold, LuItalic, LuUnderline, LuAlignLeft, LuAlignCenter, LuAlignRight, LuAlignVerticalJustifyStart, LuAlignVerticalJustifyCenter, LuAlignVerticalJustifyEnd, LuList, LuUndo2, LuRedo2, LuMinus, LuPlus, LuStrikethrough, LuSubscript, LuSuperscript, LuLink, LuRemoveFormatting, LuPalette, LuHighlighter, LuAlignJustify, LuListOrdered, LuListChecks, LuIndentDecrease, LuIndentIncrease, LuImage, LuTable, LuTableRowsSplit, LuTableColumnsSplit, LuTrash2, LuGrid3X3, LuVariable, LuPaperclip, LuX, LuFileText, LuFileCode, LuFile } from 'react-icons/lu';
55
55
  import { RxDividerHorizontal } from 'react-icons/rx';
56
56
  import { Extension, Node, mergeAttributes } from '@tiptap/core';
57
57
  import { commands } from '@uiw/react-md-editor';
@@ -111,8 +111,8 @@ var require_extends = __commonJS({
111
111
  function _extends11() {
112
112
  return module.exports = _extends11 = Object.assign ? Object.assign.bind() : function(n) {
113
113
  for (var e = 1; e < arguments.length; e++) {
114
- var t = arguments[e];
115
- for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);
114
+ var t4 = arguments[e];
115
+ for (var r in t4) ({}).hasOwnProperty.call(t4, r) && (n[r] = t4[r]);
116
116
  }
117
117
  return n;
118
118
  }, module.exports.__esModule = true, module.exports["default"] = module.exports, _extends11.apply(null, arguments);
@@ -126,12 +126,12 @@ var require_objectWithoutPropertiesLoose = __commonJS({
126
126
  "../node_modules/@babel/runtime/helpers/objectWithoutPropertiesLoose.js"(exports, module) {
127
127
  function _objectWithoutPropertiesLoose10(r, e) {
128
128
  if (null == r) return {};
129
- var t = {};
129
+ var t4 = {};
130
130
  for (var n in r) if ({}.hasOwnProperty.call(r, n)) {
131
131
  if (-1 !== e.indexOf(n)) continue;
132
- t[n] = r[n];
132
+ t4[n] = r[n];
133
133
  }
134
- return t;
134
+ return t4;
135
135
  }
136
136
  module.exports = _objectWithoutPropertiesLoose10, module.exports.__esModule = true, module.exports["default"] = module.exports;
137
137
  }
@@ -642,6 +642,122 @@ function Calendar({
642
642
  );
643
643
  }
644
644
  Calendar.displayName = "Calendar";
645
+ var hazo_i18n_module = null;
646
+ void optional_import("hazo_i18n").then((mod) => {
647
+ hazo_i18n_module = mod;
648
+ }).catch(() => {
649
+ hazo_i18n_module = null;
650
+ });
651
+ function interpolate(template, vars) {
652
+ if (!vars) return template;
653
+ return template.replace(
654
+ /\{\{\s*(\w+)\s*\}\}/g,
655
+ (whole, name) => Object.prototype.hasOwnProperty.call(vars, name) ? vars[name] : whole
656
+ );
657
+ }
658
+ function createPackageT(namespace, fallbackCatalog) {
659
+ return function t4(key, vars) {
660
+ const mod = hazo_i18n_module;
661
+ if (mod && typeof mod.t === "function") {
662
+ try {
663
+ const translated = mod.t(`${namespace}.${key}`, vars);
664
+ if (typeof translated === "string" && translated.length > 0) {
665
+ return translated;
666
+ }
667
+ } catch {
668
+ }
669
+ }
670
+ const template = fallbackCatalog[key];
671
+ if (template === void 0) return key;
672
+ return interpolate(template, vars);
673
+ };
674
+ }
675
+ function resolvePackageLocale(defaultLocale) {
676
+ const mod = hazo_i18n_module;
677
+ if (mod && typeof mod.getStaticLocale === "function") {
678
+ try {
679
+ const locale = mod.getStaticLocale();
680
+ if (typeof locale === "string" && locale.length > 0) return locale;
681
+ } catch {
682
+ }
683
+ }
684
+ return defaultLocale;
685
+ }
686
+
687
+ // src/locales/en.json
688
+ var en_default = {
689
+ "table.showing": "Showing {{start}}\u2013{{end}} of {{total}}",
690
+ "table.prev": "\u2039 Prev",
691
+ "table.prev_aria": "Previous page",
692
+ "table.next": "Next \u203A",
693
+ "table.next_aria": "Next page",
694
+ "table.search_placeholder": "Search...",
695
+ "table.sort_tooltip": "Click to sort; shift-click to append a secondary sort",
696
+ "table.empty": "No items",
697
+ "table.no_results": "No matches \u2014 adjust your filters",
698
+ "table.error_title": "Couldn't load data",
699
+ "table.error_description": "The data source rejected the request.",
700
+ "rte.undo": "Undo",
701
+ "rte.redo": "Redo",
702
+ "rte.decrease_font_size": "Decrease font size",
703
+ "rte.increase_font_size": "Increase font size",
704
+ "rte.bold": "Bold",
705
+ "rte.italic": "Italic",
706
+ "rte.underline": "Underline",
707
+ "rte.strikethrough": "Strikethrough",
708
+ "rte.subscript": "Subscript",
709
+ "rte.superscript": "Superscript",
710
+ "rte.link": "Link",
711
+ "rte.clear_formatting": "Clear formatting",
712
+ "rte.text_color": "Text color",
713
+ "rte.highlight_color": "Highlight color",
714
+ "rte.align_left": "Align left",
715
+ "rte.align_center": "Align center",
716
+ "rte.align_right": "Align right",
717
+ "rte.justify": "Justify",
718
+ "rte.bullet_list": "Bullet list",
719
+ "rte.ordered_list": "Numbered list",
720
+ "rte.checklist": "Checklist",
721
+ "rte.decrease_indent": "Decrease indent",
722
+ "rte.increase_indent": "Increase indent",
723
+ "rte.horizontal_rule": "Horizontal rule",
724
+ "rte.insert_image": "Insert image",
725
+ "rte.table": "Table",
726
+ "rte.insert_variable": "Insert variable",
727
+ "rte.attach_file": "Attach file",
728
+ "rte.block_type.paragraph": "Paragraph",
729
+ "rte.block_type.heading_1": "Heading 1",
730
+ "rte.block_type.heading_2": "Heading 2",
731
+ "rte.block_type.heading_3": "Heading 3",
732
+ "rte.block_type.ordered_list": "Numbered List",
733
+ "rte.block_type.bullet_list": "Bulleted List",
734
+ "rte.block_type.task_list": "Check List",
735
+ "rte.block_type.code_block": "Code Block",
736
+ "rte.block_type.blockquote": "Quote",
737
+ "filter.title": "Filter",
738
+ "filter.description": "Add fields to filter by. Select a field and set its value.",
739
+ "filter.text_placeholder": "Enter text...",
740
+ "filter.number_placeholder": "Value",
741
+ "filter.select_option_placeholder": "Select option...",
742
+ "filter.select_placeholder": "Select...",
743
+ "filter.pick_date": "Pick a date",
744
+ "filter.on": "On",
745
+ "filter.off": "Off",
746
+ "filter.remove_field_aria": "Remove {{field}} filter",
747
+ "filter.active_filters": "Active filters",
748
+ "filter.no_active_filters": "No active filters",
749
+ "filter.open_dialog_aria": "Open filter dialog",
750
+ "filter.button_label": "Filter",
751
+ "filter.empty_fields": "No filters yet. Add one below to narrow down the results.",
752
+ "filter.all_fields_added": "All fields added",
753
+ "filter.add_filter_field": "Add filter field",
754
+ "filter.search_fields_placeholder": "Search fields...",
755
+ "filter.no_fields_available": "No fields available.",
756
+ "filter.clear_all": "Clear all",
757
+ "filter.cancel": "Cancel",
758
+ "filter.apply": "Apply"
759
+ };
760
+ var t = createPackageT("hazo_ui", en_default);
645
761
  function FilterFieldItem({
646
762
  filterConfig,
647
763
  fieldConfig,
@@ -665,7 +781,7 @@ function FilterFieldItem({
665
781
  }
666
782
  onValueChange(value);
667
783
  },
668
- placeholder: "Enter text...",
784
+ placeholder: t("filter.text_placeholder"),
669
785
  minLength: fieldConfig.textConfig?.minLength,
670
786
  maxLength: fieldConfig.textConfig?.maxLength,
671
787
  className: "cls_filter_text_input h-8 w-full min-w-0 text-sm"
@@ -717,7 +833,7 @@ function FilterFieldItem({
717
833
  }
718
834
  onValueChange(numValue);
719
835
  },
720
- placeholder: "Value",
836
+ placeholder: t("filter.number_placeholder"),
721
837
  min: fieldConfig.numberConfig?.min,
722
838
  max: fieldConfig.numberConfig?.max,
723
839
  step: fieldConfig.numberConfig?.allowDecimal ? 0.01 : 1,
@@ -733,21 +849,21 @@ function FilterFieldItem({
733
849
  value: filterConfig.value || "",
734
850
  onValueChange: (value) => onValueChange(value),
735
851
  children: [
736
- /* @__PURE__ */ jsx(SelectTrigger, { className: "cls_filter_combobox_select h-8 w-full min-w-0 text-sm", children: /* @__PURE__ */ jsx(SelectValue, { placeholder: "Select option..." }) }),
852
+ /* @__PURE__ */ jsx(SelectTrigger, { className: "cls_filter_combobox_select h-8 w-full min-w-0 text-sm", children: /* @__PURE__ */ jsx(SelectValue, { placeholder: t("filter.select_option_placeholder") }) }),
737
853
  /* @__PURE__ */ jsx(SelectContent, { children: fieldConfig.comboboxOptions?.map((option) => /* @__PURE__ */ jsx(SelectItem, { value: option.value, children: option.label }, option.value)) })
738
854
  ]
739
855
  }
740
856
  );
741
857
  case "boolean": {
742
- const trueLabel = fieldConfig.booleanLabels?.trueLabel || "On";
743
- const falseLabel = fieldConfig.booleanLabels?.falseLabel || "Off";
858
+ const trueLabel = fieldConfig.booleanLabels?.trueLabel || t("filter.on");
859
+ const falseLabel = fieldConfig.booleanLabels?.falseLabel || t("filter.off");
744
860
  return /* @__PURE__ */ jsxs(
745
861
  Select,
746
862
  {
747
863
  value: filterConfig.value !== void 0 && filterConfig.value !== null ? String(filterConfig.value) : "",
748
864
  onValueChange: (value) => onValueChange(value === "true"),
749
865
  children: [
750
- /* @__PURE__ */ jsx(SelectTrigger, { className: "cls_filter_boolean_select h-8 w-full min-w-0 text-sm", children: /* @__PURE__ */ jsx(SelectValue, { placeholder: "Select..." }) }),
866
+ /* @__PURE__ */ jsx(SelectTrigger, { className: "cls_filter_boolean_select h-8 w-full min-w-0 text-sm", children: /* @__PURE__ */ jsx(SelectValue, { placeholder: t("filter.select_placeholder") }) }),
751
867
  /* @__PURE__ */ jsxs(SelectContent, { children: [
752
868
  /* @__PURE__ */ jsx(SelectItem, { value: "true", children: trueLabel }),
753
869
  /* @__PURE__ */ jsx(SelectItem, { value: "false", children: falseLabel })
@@ -789,7 +905,7 @@ function FilterFieldItem({
789
905
  ),
790
906
  children: [
791
907
  /* @__PURE__ */ jsx(Calendar$1, { className: "cls_calendar_icon h-3.5 w-3.5 shrink-0" }),
792
- /* @__PURE__ */ jsx("span", { className: "cls_date_text truncate", children: selectedDate ? format(selectedDate, "MMM d, yyyy") : "Pick a date" })
908
+ /* @__PURE__ */ jsx("span", { className: "cls_date_text truncate", children: selectedDate ? format(selectedDate, "MMM d, yyyy") : t("filter.pick_date") })
793
909
  ]
794
910
  }
795
911
  ) }),
@@ -823,7 +939,7 @@ function FilterFieldItem({
823
939
  size: "sm",
824
940
  onClick: onDelete,
825
941
  className: "cls_delete_btn h-7 w-7 shrink-0 p-0 text-muted-foreground/60 hover:bg-destructive/10 hover:text-destructive",
826
- "aria-label": `Remove ${fieldConfig.label} filter`,
942
+ "aria-label": t("filter.remove_field_aria", { field: fieldConfig.label }),
827
943
  children: /* @__PURE__ */ jsx(X, { className: "cls_delete_icon h-3.5 w-3.5" })
828
944
  }
829
945
  )
@@ -834,8 +950,8 @@ function HazoUiMultiFilterDialog({
834
950
  availableFields,
835
951
  onFilterChange,
836
952
  initialFilters = [],
837
- title = "Filter",
838
- description = "Add fields to filter by. Select a field and set its value.",
953
+ title = t("filter.title"),
954
+ description = t("filter.description"),
839
955
  headerBackgroundColor,
840
956
  headerTextColor,
841
957
  submitButtonBackgroundColor,
@@ -940,13 +1056,13 @@ function HazoUiMultiFilterDialog({
940
1056
  };
941
1057
  const hasActiveFilters = initialFilters.length > 0;
942
1058
  const tooltipContent = hasActiveFilters ? /* @__PURE__ */ jsxs("div", { className: "cls_filter_tooltip_content space-y-1", children: [
943
- /* @__PURE__ */ jsx("div", { className: "cls_tooltip_title text-xs font-semibold mb-1", children: "Active filters" }),
1059
+ /* @__PURE__ */ jsx("div", { className: "cls_tooltip_title text-xs font-semibold mb-1", children: t("filter.active_filters") }),
944
1060
  initialFilters.map((filterConfig) => {
945
1061
  const fieldConfig = getFieldConfig(filterConfig.field);
946
1062
  if (!fieldConfig) return null;
947
1063
  let displayValue = String(filterConfig.value);
948
1064
  if (fieldConfig.type === "boolean") {
949
- displayValue = filterConfig.value ? fieldConfig.booleanLabels?.trueLabel || "On" : fieldConfig.booleanLabels?.falseLabel || "Off";
1065
+ displayValue = filterConfig.value ? fieldConfig.booleanLabels?.trueLabel || t("filter.on") : fieldConfig.booleanLabels?.falseLabel || t("filter.off");
950
1066
  } else if (fieldConfig.type === "combobox") {
951
1067
  const option = fieldConfig.comboboxOptions?.find((opt) => opt.value === filterConfig.value);
952
1068
  displayValue = option?.label || displayValue;
@@ -964,7 +1080,7 @@ function HazoUiMultiFilterDialog({
964
1080
  displayValue
965
1081
  ] }, filterConfig.field);
966
1082
  })
967
- ] }) : /* @__PURE__ */ jsx("div", { className: "cls_filter_tooltip_content text-xs", children: "No active filters" });
1083
+ ] }) : /* @__PURE__ */ jsx("div", { className: "cls_filter_tooltip_content text-xs", children: t("filter.no_active_filters") });
968
1084
  return /* @__PURE__ */ jsxs(Dialog, { open: isOpen, onOpenChange: setIsOpen, children: [
969
1085
  /* @__PURE__ */ jsx(TooltipProvider, { children: /* @__PURE__ */ jsxs(Tooltip, { children: [
970
1086
  /* @__PURE__ */ jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx(DialogTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
@@ -973,7 +1089,7 @@ function HazoUiMultiFilterDialog({
973
1089
  variant: "outline",
974
1090
  size: "sm",
975
1091
  className: "cls_filter_button",
976
- "aria-label": "Open filter dialog",
1092
+ "aria-label": t("filter.open_dialog_aria"),
977
1093
  children: [
978
1094
  /* @__PURE__ */ jsx(
979
1095
  Filter,
@@ -984,7 +1100,7 @@ function HazoUiMultiFilterDialog({
984
1100
  )
985
1101
  }
986
1102
  ),
987
- "Filter",
1103
+ t("filter.button_label"),
988
1104
  hasActiveFilters && /* @__PURE__ */ jsx("span", { className: "cls_filter_count ml-2 inline-flex h-4 min-w-4 items-center justify-center rounded-full bg-blue-600 px-1 text-[10px] font-semibold text-white", children: initialFilters.length })
989
1105
  ]
990
1106
  }
@@ -1018,7 +1134,7 @@ function HazoUiMultiFilterDialog({
1018
1134
  },
1019
1135
  filterConfig.field
1020
1136
  );
1021
- }) }) : /* @__PURE__ */ jsx("div", { className: "cls_empty_filter_fields rounded-lg border border-dashed border-border/70 bg-muted/20 px-4 py-6 text-center text-xs text-muted-foreground", children: "No filters yet. Add one below to narrow down the results." }),
1137
+ }) }) : /* @__PURE__ */ jsx("div", { className: "cls_empty_filter_fields rounded-lg border border-dashed border-border/70 bg-muted/20 px-4 py-6 text-center text-xs text-muted-foreground", children: t("filter.empty_fields") }),
1022
1138
  /* @__PURE__ */ jsx("div", { className: "cls_add_field_section", children: /* @__PURE__ */ jsxs(Popover, { open: isComboboxOpen, onOpenChange: setIsComboboxOpen, children: [
1023
1139
  /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
1024
1140
  Button,
@@ -1030,13 +1146,13 @@ function HazoUiMultiFilterDialog({
1030
1146
  className: "cls_add_field_combobox w-full justify-start gap-2 border border-dashed border-border/70 text-sm font-medium text-muted-foreground hover:border-border hover:bg-muted/40 hover:text-foreground",
1031
1147
  children: [
1032
1148
  /* @__PURE__ */ jsx(Plus, { className: "cls_plus_icon h-4 w-4" }),
1033
- /* @__PURE__ */ jsx("span", { children: availableFieldsToAdd.length === 0 ? "All fields added" : "Add filter field" })
1149
+ /* @__PURE__ */ jsx("span", { children: availableFieldsToAdd.length === 0 ? t("filter.all_fields_added") : t("filter.add_filter_field") })
1034
1150
  ]
1035
1151
  }
1036
1152
  ) }),
1037
1153
  /* @__PURE__ */ jsx(PopoverContent, { className: "cls_combobox_popover w-[var(--radix-popover-trigger-width)] p-0", align: "start", children: /* @__PURE__ */ jsxs(Command, { children: [
1038
- /* @__PURE__ */ jsx(CommandInput, { placeholder: "Search fields...", className: "cls_command_input" }),
1039
- /* @__PURE__ */ jsx(CommandList, { children: availableFieldsToAdd.length === 0 ? /* @__PURE__ */ jsx(CommandEmpty, { children: "No fields available." }) : /* @__PURE__ */ jsx(CommandGroup, { children: availableFieldsToAdd.map((field) => /* @__PURE__ */ jsx(
1154
+ /* @__PURE__ */ jsx(CommandInput, { placeholder: t("filter.search_fields_placeholder"), className: "cls_command_input" }),
1155
+ /* @__PURE__ */ jsx(CommandList, { children: availableFieldsToAdd.length === 0 ? /* @__PURE__ */ jsx(CommandEmpty, { children: t("filter.no_fields_available") }) : /* @__PURE__ */ jsx(CommandGroup, { children: availableFieldsToAdd.map((field) => /* @__PURE__ */ jsx(
1040
1156
  CommandItem,
1041
1157
  {
1042
1158
  value: field.label,
@@ -1058,7 +1174,7 @@ function HazoUiMultiFilterDialog({
1058
1174
  onClick: handleClearAll,
1059
1175
  className: "cls_clear_all_btn text-muted-foreground hover:text-foreground",
1060
1176
  style: clearButtonStyles,
1061
- children: "Clear all"
1177
+ children: t("filter.clear_all")
1062
1178
  }
1063
1179
  ) }),
1064
1180
  /* @__PURE__ */ jsxs("div", { className: "cls_footer_right flex items-center gap-2", children: [
@@ -1070,7 +1186,7 @@ function HazoUiMultiFilterDialog({
1070
1186
  onClick: handleCancel,
1071
1187
  className: "cls_cancel_btn",
1072
1188
  style: cancelButtonStyles,
1073
- children: "Cancel"
1189
+ children: t("filter.cancel")
1074
1190
  }
1075
1191
  ),
1076
1192
  /* @__PURE__ */ jsx(
@@ -1080,7 +1196,7 @@ function HazoUiMultiFilterDialog({
1080
1196
  onClick: handleApply,
1081
1197
  className: "cls_apply_btn",
1082
1198
  style: submitButtonStyles,
1083
- children: "Apply"
1199
+ children: t("filter.apply")
1084
1200
  }
1085
1201
  )
1086
1202
  ] })
@@ -3554,6 +3670,23 @@ var BLOCK_TYPES = [
3554
3670
  { label: "Code Block", value: "code-block", icon: "code" },
3555
3671
  { label: "Quote", value: "blockquote", icon: "quote" }
3556
3672
  ];
3673
+ var BLOCK_TYPE_LABEL_KEYS = {
3674
+ paragraph: "rte.block_type.paragraph",
3675
+ "heading-1": "rte.block_type.heading_1",
3676
+ "heading-2": "rte.block_type.heading_2",
3677
+ "heading-3": "rte.block_type.heading_3",
3678
+ "ordered-list": "rte.block_type.ordered_list",
3679
+ "bullet-list": "rte.block_type.bullet_list",
3680
+ "task-list": "rte.block_type.task_list",
3681
+ "code-block": "rte.block_type.code_block",
3682
+ blockquote: "rte.block_type.blockquote"
3683
+ };
3684
+ function get_translated_block_types(t4) {
3685
+ return BLOCK_TYPES.map((type) => ({
3686
+ ...type,
3687
+ label: t4(BLOCK_TYPE_LABEL_KEYS[type.value])
3688
+ }));
3689
+ }
3557
3690
 
3558
3691
  // src/components/hazo_ui_rte/utils.ts
3559
3692
  function file_to_base64(file) {
@@ -3598,6 +3731,7 @@ function get_file_extension(filename) {
3598
3731
  function is_image_file(mime_type) {
3599
3732
  return mime_type.startsWith("image/");
3600
3733
  }
3734
+ var t2 = createPackageT("hazo_ui", en_default);
3601
3735
  var ALL_ON = {
3602
3736
  undo_redo: true,
3603
3737
  block_type: true,
@@ -3652,6 +3786,7 @@ var Toolbar = ({
3652
3786
  }
3653
3787
  const tb = { ...ALL_ON, ...toolbar };
3654
3788
  const font_family_options = font_families && font_families.length > 0 ? font_families : FONT_FAMILIES;
3789
+ const block_type_options = get_translated_block_types(t2);
3655
3790
  const get_current_font_size = () => {
3656
3791
  const attrs = editor.getAttributes("textStyle");
3657
3792
  return attrs.fontSize || FONT_SIZE_CONFIG.default;
@@ -3795,7 +3930,7 @@ var Toolbar = ({
3795
3930
  {
3796
3931
  onClick: () => editor.chain().focus().undo().run(),
3797
3932
  disabled: !editor.can().undo(),
3798
- tooltip: "Undo",
3933
+ tooltip: t2("rte.undo"),
3799
3934
  children: /* @__PURE__ */ jsx(LuUndo2, { className: "h-4 w-4" })
3800
3935
  },
3801
3936
  "undo"
@@ -3805,7 +3940,7 @@ var Toolbar = ({
3805
3940
  {
3806
3941
  onClick: () => editor.chain().focus().redo().run(),
3807
3942
  disabled: !editor.can().redo(),
3808
- tooltip: "Redo",
3943
+ tooltip: t2("rte.redo"),
3809
3944
  children: /* @__PURE__ */ jsx(LuRedo2, { className: "h-4 w-4" })
3810
3945
  },
3811
3946
  "redo"
@@ -3816,7 +3951,7 @@ var Toolbar = ({
3816
3951
  sections.push([
3817
3952
  /* @__PURE__ */ jsxs(Select, { value: get_current_block_type(), onValueChange: handle_block_type_change, children: [
3818
3953
  /* @__PURE__ */ jsx(SelectTrigger, { className: "h-8 w-[130px] text-xs", children: /* @__PURE__ */ jsx(SelectValue, {}) }),
3819
- /* @__PURE__ */ jsx(SelectContent, { children: BLOCK_TYPES.map((type) => /* @__PURE__ */ jsx(SelectItem, { value: type.value, className: "text-xs", children: type.label }, type.value)) })
3954
+ /* @__PURE__ */ jsx(SelectContent, { children: block_type_options.map((type) => /* @__PURE__ */ jsx(SelectItem, { value: type.value, className: "text-xs", children: type.label }, type.value)) })
3820
3955
  ] }, "block")
3821
3956
  ]);
3822
3957
  }
@@ -3846,7 +3981,7 @@ var Toolbar = ({
3846
3981
  ToolbarButton,
3847
3982
  {
3848
3983
  onClick: () => handle_font_size_change(-2),
3849
- tooltip: "Decrease font size",
3984
+ tooltip: t2("rte.decrease_font_size"),
3850
3985
  children: /* @__PURE__ */ jsx(LuMinus, { className: "h-3 w-3" })
3851
3986
  }
3852
3987
  ),
@@ -3855,7 +3990,7 @@ var Toolbar = ({
3855
3990
  ToolbarButton,
3856
3991
  {
3857
3992
  onClick: () => handle_font_size_change(FONT_SIZE_CONFIG.step),
3858
- tooltip: "Increase font size",
3993
+ tooltip: t2("rte.increase_font_size"),
3859
3994
  children: /* @__PURE__ */ jsx(LuPlus, { className: "h-3 w-3" })
3860
3995
  }
3861
3996
  )
@@ -3873,7 +4008,7 @@ var Toolbar = ({
3873
4008
  {
3874
4009
  onClick: () => editor.chain().focus().toggleBold().run(),
3875
4010
  is_active: editor.isActive("bold"),
3876
- tooltip: "Bold",
4011
+ tooltip: t2("rte.bold"),
3877
4012
  children: /* @__PURE__ */ jsx(LuBold, { className: "h-4 w-4" })
3878
4013
  },
3879
4014
  "bold"
@@ -3887,7 +4022,7 @@ var Toolbar = ({
3887
4022
  {
3888
4023
  onClick: () => editor.chain().focus().toggleItalic().run(),
3889
4024
  is_active: editor.isActive("italic"),
3890
- tooltip: "Italic",
4025
+ tooltip: t2("rte.italic"),
3891
4026
  children: /* @__PURE__ */ jsx(LuItalic, { className: "h-4 w-4" })
3892
4027
  },
3893
4028
  "italic"
@@ -3901,7 +4036,7 @@ var Toolbar = ({
3901
4036
  {
3902
4037
  onClick: () => editor.chain().focus().toggleUnderline().run(),
3903
4038
  is_active: editor.isActive("underline"),
3904
- tooltip: "Underline",
4039
+ tooltip: t2("rte.underline"),
3905
4040
  children: /* @__PURE__ */ jsx(LuUnderline, { className: "h-4 w-4" })
3906
4041
  },
3907
4042
  "underline"
@@ -3915,7 +4050,7 @@ var Toolbar = ({
3915
4050
  {
3916
4051
  onClick: () => editor.chain().focus().toggleStrike().run(),
3917
4052
  is_active: editor.isActive("strike"),
3918
- tooltip: "Strikethrough",
4053
+ tooltip: t2("rte.strikethrough"),
3919
4054
  children: /* @__PURE__ */ jsx(LuStrikethrough, { className: "h-4 w-4" })
3920
4055
  },
3921
4056
  "strike"
@@ -3929,7 +4064,7 @@ var Toolbar = ({
3929
4064
  {
3930
4065
  onClick: () => editor.chain().focus().toggleSubscript().run(),
3931
4066
  is_active: editor.isActive("subscript"),
3932
- tooltip: "Subscript",
4067
+ tooltip: t2("rte.subscript"),
3933
4068
  children: /* @__PURE__ */ jsx(LuSubscript, { className: "h-4 w-4" })
3934
4069
  },
3935
4070
  "sub"
@@ -3943,7 +4078,7 @@ var Toolbar = ({
3943
4078
  {
3944
4079
  onClick: () => editor.chain().focus().toggleSuperscript().run(),
3945
4080
  is_active: editor.isActive("superscript"),
3946
- tooltip: "Superscript",
4081
+ tooltip: t2("rte.superscript"),
3947
4082
  children: /* @__PURE__ */ jsx(LuSuperscript, { className: "h-4 w-4" })
3948
4083
  },
3949
4084
  "super"
@@ -3957,7 +4092,7 @@ var Toolbar = ({
3957
4092
  if (tb.link) {
3958
4093
  items.push(
3959
4094
  /* @__PURE__ */ jsxs(Popover, { open: link_popover_open, onOpenChange: set_link_popover_open, children: [
3960
- /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsx(ToolbarButton, { is_active: editor.isActive("link"), tooltip: "Link", children: /* @__PURE__ */ jsx(LuLink, { className: "h-4 w-4" }) }) }),
4095
+ /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsx(ToolbarButton, { is_active: editor.isActive("link"), tooltip: t2("rte.link"), children: /* @__PURE__ */ jsx(LuLink, { className: "h-4 w-4" }) }) }),
3961
4096
  /* @__PURE__ */ jsx(PopoverContent, { className: "w-80 p-3", children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
3962
4097
  /* @__PURE__ */ jsx(
3963
4098
  Input,
@@ -3993,7 +4128,7 @@ var Toolbar = ({
3993
4128
  ToolbarButton,
3994
4129
  {
3995
4130
  onClick: () => editor.chain().focus().unsetAllMarks().clearNodes().run(),
3996
- tooltip: "Clear formatting",
4131
+ tooltip: t2("rte.clear_formatting"),
3997
4132
  children: /* @__PURE__ */ jsx(LuRemoveFormatting, { className: "h-4 w-4" })
3998
4133
  },
3999
4134
  "clear"
@@ -4007,7 +4142,7 @@ var Toolbar = ({
4007
4142
  if (tb.text_color) {
4008
4143
  items.push(
4009
4144
  /* @__PURE__ */ jsxs(Popover, { open: text_color_open, onOpenChange: set_text_color_open, children: [
4010
- /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsx(ToolbarButton, { tooltip: "Text color", children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center", children: [
4145
+ /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsx(ToolbarButton, { tooltip: t2("rte.text_color"), children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center", children: [
4011
4146
  /* @__PURE__ */ jsx(LuPalette, { className: "h-4 w-4" }),
4012
4147
  /* @__PURE__ */ jsx(
4013
4148
  "div",
@@ -4050,7 +4185,7 @@ var Toolbar = ({
4050
4185
  if (tb.highlight_color) {
4051
4186
  items.push(
4052
4187
  /* @__PURE__ */ jsxs(Popover, { open: highlight_color_open, onOpenChange: set_highlight_color_open, children: [
4053
- /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsx(ToolbarButton, { tooltip: "Highlight color", children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center", children: [
4188
+ /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsx(ToolbarButton, { tooltip: t2("rte.highlight_color"), children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center", children: [
4054
4189
  /* @__PURE__ */ jsx(LuHighlighter, { className: "h-4 w-4" }),
4055
4190
  /* @__PURE__ */ jsx(
4056
4191
  "div",
@@ -4093,7 +4228,7 @@ var Toolbar = ({
4093
4228
  {
4094
4229
  onClick: () => editor.chain().focus().setTextAlign("left").run(),
4095
4230
  is_active: editor.isActive({ textAlign: "left" }),
4096
- tooltip: "Align left",
4231
+ tooltip: t2("rte.align_left"),
4097
4232
  children: /* @__PURE__ */ jsx(LuAlignLeft, { className: "h-4 w-4" })
4098
4233
  },
4099
4234
  "align-left"
@@ -4103,7 +4238,7 @@ var Toolbar = ({
4103
4238
  {
4104
4239
  onClick: () => editor.chain().focus().setTextAlign("center").run(),
4105
4240
  is_active: editor.isActive({ textAlign: "center" }),
4106
- tooltip: "Align center",
4241
+ tooltip: t2("rte.align_center"),
4107
4242
  children: /* @__PURE__ */ jsx(LuAlignCenter, { className: "h-4 w-4" })
4108
4243
  },
4109
4244
  "align-center"
@@ -4113,7 +4248,7 @@ var Toolbar = ({
4113
4248
  {
4114
4249
  onClick: () => editor.chain().focus().setTextAlign("right").run(),
4115
4250
  is_active: editor.isActive({ textAlign: "right" }),
4116
- tooltip: "Align right",
4251
+ tooltip: t2("rte.align_right"),
4117
4252
  children: /* @__PURE__ */ jsx(LuAlignRight, { className: "h-4 w-4" })
4118
4253
  },
4119
4254
  "align-right"
@@ -4123,7 +4258,7 @@ var Toolbar = ({
4123
4258
  {
4124
4259
  onClick: () => editor.chain().focus().setTextAlign("justify").run(),
4125
4260
  is_active: editor.isActive({ textAlign: "justify" }),
4126
- tooltip: "Justify",
4261
+ tooltip: t2("rte.justify"),
4127
4262
  children: /* @__PURE__ */ jsx(LuAlignJustify, { className: "h-4 w-4" })
4128
4263
  },
4129
4264
  "align-justify"
@@ -4139,7 +4274,7 @@ var Toolbar = ({
4139
4274
  {
4140
4275
  onClick: () => editor.chain().focus().toggleBulletList().run(),
4141
4276
  is_active: editor.isActive("bulletList"),
4142
- tooltip: "Bullet list",
4277
+ tooltip: t2("rte.bullet_list"),
4143
4278
  children: /* @__PURE__ */ jsx(LuList, { className: "h-4 w-4" })
4144
4279
  },
4145
4280
  "bullet"
@@ -4153,7 +4288,7 @@ var Toolbar = ({
4153
4288
  {
4154
4289
  onClick: () => editor.chain().focus().toggleOrderedList().run(),
4155
4290
  is_active: editor.isActive("orderedList"),
4156
- tooltip: "Numbered list",
4291
+ tooltip: t2("rte.ordered_list"),
4157
4292
  children: /* @__PURE__ */ jsx(LuListOrdered, { className: "h-4 w-4" })
4158
4293
  },
4159
4294
  "ordered"
@@ -4167,7 +4302,7 @@ var Toolbar = ({
4167
4302
  {
4168
4303
  onClick: () => editor.chain().focus().toggleTaskList().run(),
4169
4304
  is_active: editor.isActive("taskList"),
4170
- tooltip: "Checklist",
4305
+ tooltip: t2("rte.checklist"),
4171
4306
  children: /* @__PURE__ */ jsx(LuListChecks, { className: "h-4 w-4" })
4172
4307
  },
4173
4308
  "task"
@@ -4189,7 +4324,7 @@ var Toolbar = ({
4189
4324
  }
4190
4325
  },
4191
4326
  disabled: !editor.can().liftListItem("listItem") && !editor.can().liftListItem("taskItem"),
4192
- tooltip: "Decrease indent",
4327
+ tooltip: t2("rte.decrease_indent"),
4193
4328
  children: /* @__PURE__ */ jsx(LuIndentDecrease, { className: "h-4 w-4" })
4194
4329
  },
4195
4330
  "indent-dec"
@@ -4205,7 +4340,7 @@ var Toolbar = ({
4205
4340
  }
4206
4341
  },
4207
4342
  disabled: !editor.can().sinkListItem("listItem") && !editor.can().sinkListItem("taskItem"),
4208
- tooltip: "Increase indent",
4343
+ tooltip: t2("rte.increase_indent"),
4209
4344
  children: /* @__PURE__ */ jsx(LuIndentIncrease, { className: "h-4 w-4" })
4210
4345
  },
4211
4346
  "indent-inc"
@@ -4216,7 +4351,7 @@ var Toolbar = ({
4216
4351
  const items = [];
4217
4352
  if (tb.horizontal_rule) {
4218
4353
  items.push(
4219
- /* @__PURE__ */ jsx(ToolbarButton, { onClick: handle_hr_insert, tooltip: "Horizontal rule", children: /* @__PURE__ */ jsx(RxDividerHorizontal, { className: "h-4 w-4" }) }, "hr")
4354
+ /* @__PURE__ */ jsx(ToolbarButton, { onClick: handle_hr_insert, tooltip: t2("rte.horizontal_rule"), children: /* @__PURE__ */ jsx(RxDividerHorizontal, { className: "h-4 w-4" }) }, "hr")
4220
4355
  );
4221
4356
  }
4222
4357
  if (tb.image) {
@@ -4225,7 +4360,7 @@ var Toolbar = ({
4225
4360
  ToolbarButton,
4226
4361
  {
4227
4362
  onClick: () => image_input_ref.current?.click(),
4228
- tooltip: "Insert image",
4363
+ tooltip: t2("rte.insert_image"),
4229
4364
  children: /* @__PURE__ */ jsx(LuImage, { className: "h-4 w-4" })
4230
4365
  },
4231
4366
  "image"
@@ -4239,7 +4374,7 @@ var Toolbar = ({
4239
4374
  ToolbarButton,
4240
4375
  {
4241
4376
  is_active: editor.isActive("table"),
4242
- tooltip: "Table",
4377
+ tooltip: t2("rte.table"),
4243
4378
  children: /* @__PURE__ */ jsx(LuTable, { className: "h-4 w-4" })
4244
4379
  }
4245
4380
  ) }),
@@ -4411,7 +4546,7 @@ var Toolbar = ({
4411
4546
  if (tb.variables && variables.length > 0) {
4412
4547
  items.push(
4413
4548
  /* @__PURE__ */ jsxs(Popover, { open: variables_menu_open, onOpenChange: set_variables_menu_open, children: [
4414
- /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsx(ToolbarButton, { tooltip: "Insert variable", children: /* @__PURE__ */ jsx(LuVariable, { className: "h-4 w-4" }) }) }),
4549
+ /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsx(ToolbarButton, { tooltip: t2("rte.insert_variable"), children: /* @__PURE__ */ jsx(LuVariable, { className: "h-4 w-4" }) }) }),
4415
4550
  /* @__PURE__ */ jsx(PopoverContent, { className: "w-64 p-0", align: "start", children: /* @__PURE__ */ jsxs(Command, { children: [
4416
4551
  /* @__PURE__ */ jsx(CommandInput, { placeholder: "Search variables...", className: "h-8 text-xs" }),
4417
4552
  /* @__PURE__ */ jsxs(CommandList, { children: [
@@ -4440,7 +4575,7 @@ var Toolbar = ({
4440
4575
  ToolbarButton,
4441
4576
  {
4442
4577
  onClick: () => file_input_ref.current?.click(),
4443
- tooltip: "Attach file",
4578
+ tooltip: t2("rte.attach_file"),
4444
4579
  children: /* @__PURE__ */ jsx(LuPaperclip, { className: "h-4 w-4" })
4445
4580
  },
4446
4581
  "attach"
@@ -8481,7 +8616,7 @@ function LoadingTimeout({
8481
8616
  label = "content",
8482
8617
  className
8483
8618
  }) {
8484
- const t = {
8619
+ const t4 = {
8485
8620
  gentle: thresholds?.gentle ?? 5e3,
8486
8621
  firm: thresholds?.firm ?? 15e3,
8487
8622
  expired: thresholds?.expired ?? 3e4
@@ -8493,15 +8628,15 @@ function LoadingTimeout({
8493
8628
  return;
8494
8629
  }
8495
8630
  setPhase("silent");
8496
- const gentleTimer = window.setTimeout(() => setPhase("gentle"), t.gentle);
8497
- const firmTimer = window.setTimeout(() => setPhase("firm"), t.firm);
8498
- const expiredTimer = window.setTimeout(() => setPhase("expired"), t.expired);
8631
+ const gentleTimer = window.setTimeout(() => setPhase("gentle"), t4.gentle);
8632
+ const firmTimer = window.setTimeout(() => setPhase("firm"), t4.firm);
8633
+ const expiredTimer = window.setTimeout(() => setPhase("expired"), t4.expired);
8499
8634
  return () => {
8500
8635
  window.clearTimeout(gentleTimer);
8501
8636
  window.clearTimeout(firmTimer);
8502
8637
  window.clearTimeout(expiredTimer);
8503
8638
  };
8504
- }, [active, t.gentle, t.firm, t.expired]);
8639
+ }, [active, t4.gentle, t4.firm, t4.expired]);
8505
8640
  if (!active) {
8506
8641
  return /* @__PURE__ */ jsx(Fragment$1, { children });
8507
8642
  }
@@ -9147,6 +9282,7 @@ function KanbanColumn({
9147
9282
  renderCard,
9148
9283
  emptyColumn,
9149
9284
  footer,
9285
+ headerExtra,
9150
9286
  cardClassName,
9151
9287
  showEdit,
9152
9288
  onEditRequest,
@@ -9207,7 +9343,8 @@ function KanbanColumn({
9207
9343
  treeKey,
9208
9344
  title: column.title,
9209
9345
  count: items.length,
9210
- droppable: sections != null
9346
+ droppable: sections != null,
9347
+ headerExtra
9211
9348
  }
9212
9349
  ),
9213
9350
  /* @__PURE__ */ jsx(
@@ -9262,7 +9399,8 @@ function KanbanColumnHead({
9262
9399
  treeKey,
9263
9400
  title,
9264
9401
  count,
9265
- droppable
9402
+ droppable,
9403
+ headerExtra
9266
9404
  }) {
9267
9405
  const { setNodeRef, isOver } = useDroppable({
9268
9406
  id: tree_droppable_id("columnhead", treeKey, laneKey, columnKey),
@@ -9276,13 +9414,25 @@ function KanbanColumnHead({
9276
9414
  "data-column-key": columnKey,
9277
9415
  "data-lane-key": laneKey,
9278
9416
  className: cn(
9279
- "cls_hazo_kanban_column_head mb-2 flex items-center justify-between rounded-sm px-1 text-xs uppercase tracking-wider text-muted-foreground",
9417
+ "cls_hazo_kanban_column_head mb-2 flex items-center justify-between gap-2 rounded-sm px-1 text-xs uppercase tracking-wider text-muted-foreground",
9280
9418
  droppable && "py-1",
9281
9419
  isOver && "cls_hazo_kanban_column_head_over bg-accent/30 text-foreground ring-1 ring-ring/40"
9282
9420
  ),
9283
9421
  children: [
9284
- /* @__PURE__ */ jsx("span", { className: "cls_hazo_kanban_column_title", children: title }),
9285
- /* @__PURE__ */ jsx("span", { className: "cls_hazo_kanban_column_count rounded-full bg-muted px-2 py-0.5 text-foreground", children: count })
9422
+ /* @__PURE__ */ jsxs("span", { className: "cls_hazo_kanban_column_head_title_group flex min-w-0 items-center gap-2", children: [
9423
+ /* @__PURE__ */ jsx("span", { className: "cls_hazo_kanban_column_title truncate", children: title }),
9424
+ headerExtra ? /* @__PURE__ */ jsx(
9425
+ "span",
9426
+ {
9427
+ className: "cls_hazo_kanban_column_head_extra shrink-0",
9428
+ onPointerDown: (e) => e.stopPropagation(),
9429
+ onMouseDown: (e) => e.stopPropagation(),
9430
+ onKeyDown: (e) => e.stopPropagation(),
9431
+ children: headerExtra
9432
+ }
9433
+ ) : null
9434
+ ] }),
9435
+ /* @__PURE__ */ jsx("span", { className: "cls_hazo_kanban_column_count shrink-0 rounded-full bg-muted px-2 py-0.5 text-foreground", children: count })
9286
9436
  ]
9287
9437
  }
9288
9438
  );
@@ -9357,6 +9507,7 @@ function KanbanLaneHead({
9357
9507
  "div",
9358
9508
  {
9359
9509
  ref: setNodeRef,
9510
+ "data-lane-key": lane.key,
9360
9511
  className: cn(
9361
9512
  "cls_hazo_kanban_lane_head mb-2 flex items-center gap-3 rounded-sm px-1 py-1",
9362
9513
  isOver && "cls_hazo_kanban_lane_head_over bg-accent/30 ring-1 ring-ring/40"
@@ -9382,6 +9533,7 @@ function KanbanLaneStrip({
9382
9533
  "div",
9383
9534
  {
9384
9535
  ref: setNodeRef,
9536
+ "data-lane-key": lane.key,
9385
9537
  className: cn(
9386
9538
  "cls_hazo_kanban_lane_strip mb-2 flex items-center gap-3 rounded-md border border-dashed border-border px-2 py-1 text-[11px] uppercase tracking-wider text-muted-foreground",
9387
9539
  isOver && "cls_hazo_kanban_lane_strip_over border-solid bg-accent/30 text-foreground ring-1 ring-ring/30"
@@ -9863,6 +10015,7 @@ function HazoUiKanban({
9863
10015
  announcements,
9864
10016
  emptyColumn = "\u2014",
9865
10017
  renderColumnFooter,
10018
+ renderColumnHeaderExtra,
9866
10019
  className,
9867
10020
  cardClassName,
9868
10021
  itemLabel,
@@ -10116,7 +10269,7 @@ function HazoUiKanban({
10116
10269
  total += (grouped.get(bucket_key(lane_key, col.key)) ?? []).length;
10117
10270
  return total;
10118
10271
  }
10119
- function render_column(col, tree_key, lane_key, with_footer = true) {
10272
+ function render_column(col, tree_key, lane_key, with_consumer_callbacks = true) {
10120
10273
  return /* @__PURE__ */ jsx(
10121
10274
  KanbanColumn,
10122
10275
  {
@@ -10126,7 +10279,8 @@ function HazoUiKanban({
10126
10279
  items: grouped.get(bucket_key(lane_key, col.key)) ?? [],
10127
10280
  renderCard,
10128
10281
  emptyColumn,
10129
- footer: with_footer ? renderColumnFooter?.({ columnKey: col.key, laneKey: lane_key }) ?? null : null,
10282
+ footer: with_consumer_callbacks ? renderColumnFooter?.({ columnKey: col.key, laneKey: lane_key }) ?? null : null,
10283
+ headerExtra: with_consumer_callbacks ? renderColumnHeaderExtra?.({ columnKey: col.key, laneKey: lane_key }) ?? null : null,
10130
10284
  cardClassName,
10131
10285
  showEdit: show_edit,
10132
10286
  onEditRequest: handle_edit_request
@@ -10139,7 +10293,7 @@ function HazoUiKanban({
10139
10293
  if (lane.collapseWhenEmpty && count === 0) {
10140
10294
  return /* @__PURE__ */ jsx(KanbanLaneStrip, { lane, treeKey: tree_key }, lane.key);
10141
10295
  }
10142
- return /* @__PURE__ */ jsxs("div", { className: "cls_hazo_kanban_lane", children: [
10296
+ return /* @__PURE__ */ jsxs("div", { "data-lane-key": lane.key, className: "cls_hazo_kanban_lane", children: [
10143
10297
  /* @__PURE__ */ jsx(KanbanLaneHead, { lane, count, treeKey: tree_key }),
10144
10298
  only_column ? render_column(only_column, tree_key, lane.key) : /* @__PURE__ */ jsx("div", { className: "cls_hazo_kanban_lane_grid grid gap-3", style: grid_style, children: columns.map((col) => render_column(col, tree_key, lane.key)) })
10145
10299
  ] }, lane.key);
@@ -10610,6 +10764,7 @@ function serializeFilter(filter) {
10610
10764
  const fields = (filter.fields ?? []).map((f) => `${f.field}:${f.operator ?? ""}:${String(f.value)}`).join(",");
10611
10765
  return `${filter.search ?? ""}|${fields}`;
10612
10766
  }
10767
+ var t3 = createPackageT("hazo_ui", en_default);
10613
10768
  function HazoUiTable(props) {
10614
10769
  const state = useTableState(props);
10615
10770
  const { columns, rows, getRowKey, className, caption } = props;
@@ -10644,12 +10799,12 @@ function HazoUiTable(props) {
10644
10799
  ) }) : state.serverError != null ? /* @__PURE__ */ jsx("div", { className: "cls_hazo_ui_table_mobile_error py-6", children: renderErrorState(props.error, state.serverError) }) : state.displayed.length === 0 ? /* @__PURE__ */ jsx("div", { className: "cls_hazo_ui_table_mobile_empty py-6", children: noActiveFilters(state.filter) && rows.length === 0 ? typeof props.empty === "string" || props.empty === void 0 ? /* @__PURE__ */ jsx(
10645
10800
  EmptyState,
10646
10801
  {
10647
- title: typeof props.empty === "string" && props.empty || "No items"
10802
+ title: typeof props.empty === "string" && props.empty || t3("table.empty")
10648
10803
  }
10649
10804
  ) : props.empty : typeof props.noResults === "string" || props.noResults === void 0 ? /* @__PURE__ */ jsx(
10650
10805
  EmptyState,
10651
10806
  {
10652
- title: typeof props.noResults === "string" && props.noResults || "No matches \u2014 adjust your filters"
10807
+ title: typeof props.noResults === "string" && props.noResults || t3("table.no_results")
10653
10808
  }
10654
10809
  ) : props.noResults }) : /* @__PURE__ */ jsx(
10655
10810
  TableMobileCards,
@@ -10672,7 +10827,7 @@ function HazoUiTable(props) {
10672
10827
  {
10673
10828
  type: "button",
10674
10829
  onClick: (e) => state.cycleHeaderSort(c.key, e.shiftKey),
10675
- title: "Click to sort; shift-click to append a secondary sort",
10830
+ title: t3("table.sort_tooltip"),
10676
10831
  className: "cls_hazo_ui_table_sort_btn inline-flex items-center gap-1 hover:text-foreground",
10677
10832
  children: [
10678
10833
  /* @__PURE__ */ jsx("span", { children: c.label }),
@@ -10704,12 +10859,12 @@ function HazoUiTable(props) {
10704
10859
  children: noActiveFilters(state.filter) && rows.length === 0 ? /* @__PURE__ */ jsx("div", { className: "cls_hazo_ui_table_empty_wrap py-6", children: typeof props.empty === "string" || props.empty === void 0 ? /* @__PURE__ */ jsx(
10705
10860
  EmptyState,
10706
10861
  {
10707
- title: typeof props.empty === "string" && props.empty || "No items"
10862
+ title: typeof props.empty === "string" && props.empty || t3("table.empty")
10708
10863
  }
10709
10864
  ) : props.empty }) : /* @__PURE__ */ jsx("div", { className: "cls_hazo_ui_table_no_results_wrap py-6", children: typeof props.noResults === "string" || props.noResults === void 0 ? /* @__PURE__ */ jsx(
10710
10865
  EmptyState,
10711
10866
  {
10712
- title: typeof props.noResults === "string" && props.noResults || "No matches \u2014 adjust your filters"
10867
+ title: typeof props.noResults === "string" && props.noResults || t3("table.no_results")
10713
10868
  }
10714
10869
  ) : props.noResults })
10715
10870
  }
@@ -10748,7 +10903,7 @@ function renderCell(c, row, i) {
10748
10903
  var DEFAULT_NUMBER_LOCALE = "en-US";
10749
10904
  function formatValue(value, formatter, currency, locale) {
10750
10905
  if (value === null || value === void 0 || value === "") return "\u2014";
10751
- const lc = locale ?? DEFAULT_NUMBER_LOCALE;
10906
+ const lc = locale ?? resolvePackageLocale(DEFAULT_NUMBER_LOCALE);
10752
10907
  switch (formatter) {
10753
10908
  case "date": {
10754
10909
  const d = value instanceof Date ? value : new Date(value);
@@ -10823,14 +10978,11 @@ function PaginationFooter({
10823
10978
  const end = Math.min((page + 1) * pageSize, total);
10824
10979
  const lastPage = Math.max(0, Math.ceil(total / pageSize) - 1);
10825
10980
  return /* @__PURE__ */ jsxs("div", { className: "cls_hazo_ui_table_pagination flex items-center justify-between gap-3 pt-2 text-sm", children: [
10826
- /* @__PURE__ */ jsxs("span", { className: "cls_hazo_ui_table_page_counter text-muted-foreground", children: [
10827
- "Showing ",
10828
- start,
10829
- "\u2013",
10830
- end,
10831
- " of ",
10832
- total
10833
- ] }),
10981
+ /* @__PURE__ */ jsx("span", { className: "cls_hazo_ui_table_page_counter text-muted-foreground", children: t3("table.showing", {
10982
+ start: String(start),
10983
+ end: String(end),
10984
+ total: String(total)
10985
+ }) }),
10834
10986
  /* @__PURE__ */ jsxs("div", { className: "cls_hazo_ui_table_page_buttons flex items-center gap-2", children: [
10835
10987
  /* @__PURE__ */ jsx(
10836
10988
  Button,
@@ -10839,8 +10991,8 @@ function PaginationFooter({
10839
10991
  size: "sm",
10840
10992
  onClick: () => onPageChange(Math.max(0, page - 1)),
10841
10993
  disabled: page === 0,
10842
- "aria-label": "Previous page",
10843
- children: "\u2039 Prev"
10994
+ "aria-label": t3("table.prev_aria"),
10995
+ children: t3("table.prev")
10844
10996
  }
10845
10997
  ),
10846
10998
  /* @__PURE__ */ jsx(
@@ -10850,8 +11002,8 @@ function PaginationFooter({
10850
11002
  size: "sm",
10851
11003
  onClick: () => onPageChange(Math.min(lastPage, page + 1)),
10852
11004
  disabled: page >= lastPage,
10853
- "aria-label": "Next page",
10854
- children: "Next \u203A"
11005
+ "aria-label": t3("table.next_aria"),
11006
+ children: t3("table.next")
10855
11007
  }
10856
11008
  )
10857
11009
  ] })
@@ -10895,7 +11047,7 @@ function Toolbar2(props) {
10895
11047
  setSearchValue(v);
10896
11048
  onSearchChange(v);
10897
11049
  },
10898
- placeholder: searchPlaceholder ?? "Search...",
11050
+ placeholder: searchPlaceholder ?? t3("table.search_placeholder"),
10899
11051
  className: "cls_hazo_ui_table_search w-full sm:max-w-xs"
10900
11052
  }
10901
11053
  ) : /* @__PURE__ */ jsx("div", {}),
@@ -10943,8 +11095,8 @@ function renderErrorState(error, serverError) {
10943
11095
  return /* @__PURE__ */ jsx(
10944
11096
  EmptyState,
10945
11097
  {
10946
- title: "Couldn't load data",
10947
- description: msg || "The data source rejected the request."
11098
+ title: t3("table.error_title"),
11099
+ description: msg || t3("table.error_description")
10948
11100
  }
10949
11101
  );
10950
11102
  }
@@ -11730,8 +11882,8 @@ function computeEta(durationWindow, unitCount, concurrency = 1, fallbackUnitMs =
11730
11882
  }
11731
11883
  function easeToward(elapsed, eta, maxCap = 0.95) {
11732
11884
  if (eta <= 0 || elapsed <= 0) return 0;
11733
- const t = elapsed / eta;
11734
- return maxCap * (1 - Math.exp(-1.5 * t));
11885
+ const t4 = elapsed / eta;
11886
+ return maxCap * (1 - Math.exp(-1.5 * t4));
11735
11887
  }
11736
11888
  function HazoUiProgressBar({
11737
11889
  value,
@@ -12547,7 +12699,212 @@ function makeStatusBadge(statusMap, fallback) {
12547
12699
  Component.displayName = "StatusBadge(bound)";
12548
12700
  return Component;
12549
12701
  }
12702
+ function HazoBrowserTab({
12703
+ tabs,
12704
+ on_select,
12705
+ on_close,
12706
+ add_menu,
12707
+ className
12708
+ }) {
12709
+ const handle_close = (e, id) => {
12710
+ e.stopPropagation();
12711
+ on_close?.(id);
12712
+ };
12713
+ return /* @__PURE__ */ jsxs(
12714
+ "div",
12715
+ {
12716
+ role: "tablist",
12717
+ className: cn(
12718
+ "cls_hazo_browser_tab flex items-end gap-0.5 bg-muted px-1.5 pt-1.5",
12719
+ className
12720
+ ),
12721
+ children: [
12722
+ tabs.map((tab) => {
12723
+ const is_active = !!tab.active;
12724
+ const is_closable = tab.closable !== false;
12725
+ return /* @__PURE__ */ jsxs(
12726
+ "div",
12727
+ {
12728
+ role: "tab",
12729
+ "aria-selected": is_active,
12730
+ tabIndex: 0,
12731
+ onClick: () => on_select?.(tab.id),
12732
+ onKeyDown: (e) => {
12733
+ if (e.key === "Enter" || e.key === " ") {
12734
+ e.preventDefault();
12735
+ on_select?.(tab.id);
12736
+ }
12737
+ },
12738
+ className: cn(
12739
+ "cls_hazo_browser_tab_tab group flex items-center gap-1.5 rounded-t-md border border-b-0 px-3 py-1.5 text-sm cursor-pointer select-none max-w-[200px]",
12740
+ is_active ? "bg-background text-foreground font-semibold border-border" : "bg-transparent text-muted-foreground border-transparent hover:bg-background/60 hover:text-foreground"
12741
+ ),
12742
+ children: [
12743
+ /* @__PURE__ */ jsx("span", { className: "cls_hazo_browser_tab_label truncate", children: tab.label }),
12744
+ is_closable ? /* @__PURE__ */ jsx(
12745
+ "button",
12746
+ {
12747
+ type: "button",
12748
+ "aria-label": `Close ${tab.label}`,
12749
+ onClick: (e) => handle_close(e, tab.id),
12750
+ className: "cls_hazo_browser_tab_close flex-shrink-0 rounded p-0.5 text-muted-foreground opacity-0 group-hover:opacity-100 hover:bg-muted hover:text-foreground focus:opacity-100 focus:outline-none focus-visible:ring-2 focus-visible:ring-primary",
12751
+ children: /* @__PURE__ */ jsx(X, { className: "h-3 w-3" })
12752
+ }
12753
+ ) : null
12754
+ ]
12755
+ },
12756
+ tab.id
12757
+ );
12758
+ }),
12759
+ add_menu ? /* @__PURE__ */ jsx("div", { className: "cls_hazo_browser_tab_add_menu flex items-center pb-1.5 pl-1", children: add_menu }) : null
12760
+ ]
12761
+ }
12762
+ );
12763
+ }
12764
+ var native_name_cache = /* @__PURE__ */ new Map();
12765
+ function get_native_name(code) {
12766
+ const cached = native_name_cache.get(code);
12767
+ if (cached !== void 0) return cached;
12768
+ let name = code;
12769
+ if (typeof Intl !== "undefined" && "DisplayNames" in Intl) {
12770
+ try {
12771
+ const display_names = new Intl.DisplayNames([code], {
12772
+ type: "language",
12773
+ languageDisplay: "standard"
12774
+ });
12775
+ name = display_names.of(code) ?? code;
12776
+ } catch {
12777
+ name = code;
12778
+ }
12779
+ }
12780
+ native_name_cache.set(code, name);
12781
+ return name;
12782
+ }
12783
+ function build_label(code, display) {
12784
+ if (display === "code") return code.toUpperCase();
12785
+ const native = get_native_name(code);
12786
+ if (display === "native+code") return `${native} (${code.toUpperCase()})`;
12787
+ return native;
12788
+ }
12789
+ var STRIPE_FLAGS = {
12790
+ de: { dir: "h", colors: ["#000000", "#DD0000", "#FFCE00"] },
12791
+ fr: { dir: "v", colors: ["#0055A4", "#FFFFFF", "#EF4135"] },
12792
+ it: { dir: "v", colors: ["#009246", "#FFFFFF", "#CE2B37"] },
12793
+ es: { dir: "h", colors: ["#AA151B", "#F1BF00", "#AA151B"] },
12794
+ pt: { dir: "v", colors: ["#046A38", "#FFFFFF", "#DA291C"] },
12795
+ nl: { dir: "h", colors: ["#AE1C28", "#FFFFFF", "#21468B"] }
12796
+ };
12797
+ var NORDIC_CROSS_FLAGS = {
12798
+ sv: { bg: "#006AA7", cross: "#FECC00" },
12799
+ fi: { bg: "#FFFFFF", cross: "#003580" }
12800
+ };
12801
+ function StripeFlag({
12802
+ dir,
12803
+ colors
12804
+ }) {
12805
+ const band = 12 / colors.length;
12806
+ return /* @__PURE__ */ jsx("svg", { viewBox: "0 0 16 12", width: "16", height: "12", "aria-hidden": "true", focusable: "false", children: colors.map(
12807
+ (color2, i) => dir === "h" ? /* @__PURE__ */ jsx("rect", { x: 0, y: i * band, width: 16, height: band, fill: color2 }, i) : /* @__PURE__ */ jsx("rect", { x: i * (16 / colors.length), y: 0, width: 16 / colors.length, height: 12, fill: color2 }, i)
12808
+ ) });
12809
+ }
12810
+ function NordicCrossFlag({ bg, cross }) {
12811
+ return /* @__PURE__ */ jsxs("svg", { viewBox: "0 0 16 12", width: "16", height: "12", "aria-hidden": "true", focusable: "false", children: [
12812
+ /* @__PURE__ */ jsx("rect", { width: "16", height: "12", fill: bg }),
12813
+ /* @__PURE__ */ jsx("rect", { x: "5", width: "2", height: "12", fill: cross }),
12814
+ /* @__PURE__ */ jsx("rect", { y: "5", width: "16", height: "2", fill: cross })
12815
+ ] });
12816
+ }
12817
+ function get_flag_node(code) {
12818
+ const lang = code.toLowerCase().split(/[-_]/)[0];
12819
+ const cross = NORDIC_CROSS_FLAGS[lang];
12820
+ if (cross) return /* @__PURE__ */ jsx(NordicCrossFlag, { ...cross });
12821
+ const stripes = STRIPE_FLAGS[lang];
12822
+ if (stripes) return /* @__PURE__ */ jsx(StripeFlag, { ...stripes });
12823
+ return /* @__PURE__ */ jsx(Globe, { className: "h-3 w-3", "aria-hidden": "true" });
12824
+ }
12825
+ function FlagIcon({ code }) {
12826
+ return /* @__PURE__ */ jsx("span", { className: "cls_locale_picker_flag inline-flex h-3.5 w-4 shrink-0 items-center justify-center overflow-hidden rounded-[2px]", children: get_flag_node(code) });
12827
+ }
12828
+ function LocalePicker({
12829
+ variant = "dropdown",
12830
+ show = "auto",
12831
+ display = "native",
12832
+ flags = false,
12833
+ alternates,
12834
+ activeLocale,
12835
+ triggerLabel = "Change language",
12836
+ className
12837
+ }) {
12838
+ const options = React27.useMemo(() => {
12839
+ return Object.entries(alternates ?? {}).map(([code, url]) => {
12840
+ const href = safeHref(url);
12841
+ if (!href) return null;
12842
+ return { code, href, label: build_label(code, display) };
12843
+ }).filter((o) => o !== null);
12844
+ }, [alternates, display]);
12845
+ if (show === "never") return null;
12846
+ if (options.length === 0) return null;
12847
+ if (show === "auto" && options.length < 2) return null;
12848
+ if (variant === "inline") {
12849
+ return /* @__PURE__ */ jsx(
12850
+ "nav",
12851
+ {
12852
+ "aria-label": triggerLabel,
12853
+ className: cn("cls_locale_picker_inline flex items-center gap-1", className),
12854
+ children: options.map((opt) => /* @__PURE__ */ jsxs(
12855
+ "a",
12856
+ {
12857
+ href: opt.href,
12858
+ lang: opt.code,
12859
+ "aria-current": opt.code === activeLocale ? "true" : void 0,
12860
+ className: cn(
12861
+ "cls_locale_picker_inline_item inline-flex items-center gap-1.5 rounded-md px-2 py-1 text-sm transition-colors hover:bg-accent hover:text-accent-foreground",
12862
+ opt.code === activeLocale && "bg-accent font-medium text-accent-foreground"
12863
+ ),
12864
+ children: [
12865
+ flags && /* @__PURE__ */ jsx(FlagIcon, { code: opt.code }),
12866
+ /* @__PURE__ */ jsx("span", { children: opt.label })
12867
+ ]
12868
+ },
12869
+ opt.code
12870
+ ))
12871
+ }
12872
+ );
12873
+ }
12874
+ const active_option = options.find((o) => o.code === activeLocale);
12875
+ return /* @__PURE__ */ jsxs(DropdownMenu, { children: [
12876
+ /* @__PURE__ */ jsx(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
12877
+ Button,
12878
+ {
12879
+ variant: "outline",
12880
+ size: "sm",
12881
+ lang: activeLocale,
12882
+ "aria-label": triggerLabel,
12883
+ className: cn("cls_locale_picker_trigger gap-1.5", className),
12884
+ children: [
12885
+ flags && /* @__PURE__ */ jsx(FlagIcon, { code: active_option?.code ?? options[0].code }),
12886
+ /* @__PURE__ */ jsx("span", { className: "cls_locale_picker_trigger_label", children: variant === "compact" ? (active_option ?? options[0]).code.toUpperCase() : (active_option ?? options[0]).label }),
12887
+ /* @__PURE__ */ jsx(ChevronDown, { className: "h-3.5 w-3.5 opacity-60", "aria-hidden": "true" })
12888
+ ]
12889
+ }
12890
+ ) }),
12891
+ /* @__PURE__ */ jsx(DropdownMenuContent, { align: "end", className: "cls_locale_picker_content", children: /* @__PURE__ */ jsx(DropdownMenuRadioGroup, { value: activeLocale, children: options.map((opt) => /* @__PURE__ */ jsx(DropdownMenuPrimitive.RadioItem, { value: opt.code, asChild: true, children: /* @__PURE__ */ jsxs(
12892
+ "a",
12893
+ {
12894
+ href: opt.href,
12895
+ lang: opt.code,
12896
+ className: "cls_locale_picker_radio_item relative flex cursor-default select-none items-center gap-2 rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
12897
+ children: [
12898
+ /* @__PURE__ */ jsx("span", { className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center", children: /* @__PURE__ */ jsx(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx(Circle, { className: "h-2 w-2 fill-current" }) }) }),
12899
+ flags && /* @__PURE__ */ jsx(FlagIcon, { code: opt.code }),
12900
+ /* @__PURE__ */ jsx("span", { children: opt.label })
12901
+ ]
12902
+ }
12903
+ ) }, opt.code)) }) })
12904
+ ] });
12905
+ }
12906
+ LocalePicker.displayName = "LocalePicker";
12550
12907
 
12551
- export { ANIMATION_PRESETS, Accordion, AccordionContent, AccordionItem, AccordionTrigger, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AppFooter, AppHeader, Badge, Button, ButtonGroup, ButtonGroupSeparator, ButtonGroupText, CELEBRATION_GRADIENT, Calendar, CanvasTextToolbar, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, CelebrationProvider, Checkbox, Collapsible, CollapsibleContent2 as CollapsibleContent, CollapsibleTrigger2 as CollapsibleTrigger, CommandNodeExtension, CommandPill, CommandPopover, DEFAULT_ANNOUNCE_EVENT, DateRangeSelector, Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, ErrorBanner, ErrorPage, FunnelChart, HazoContextProvider, HazoUiConfirmDialog, HazoUiDialog, DialogClose as HazoUiDialogClose, DialogContent as HazoUiDialogContent, DialogDescription as HazoUiDialogDescription, DialogFooter as HazoUiDialogFooter, DialogHeader as HazoUiDialogHeader, DialogOverlay as HazoUiDialogOverlay, DialogPortal as HazoUiDialogPortal, Dialog as HazoUiDialogRoot, DialogTitle as HazoUiDialogTitle, DialogTrigger as HazoUiDialogTrigger, HazoUiEtaProgress, HazoUiFlexInput, HazoUiFlexRadio, HazoUiIcon, HazoUiIconPicker, HazoUiImageCropper, HazoUiImageCropperDialog, HazoUiKanban, HazoUiKanbanFilter, HazoUiMemoryDropdown, HazoUiMultiFilterDialog, HazoUiMultiSortDialog, HazoUiPillRadio, HazoUiProgressBar, HazoUiRte, HazoUiTable, HazoUiTextarea, HazoUiTextbox, HazoUiToaster, HoverCard, HoverCardContent, HoverCardTrigger, Input, InputAffix, InverseSparkline, Label3 as Label, LiveRegion, LoadingTimeout, Logo, MarkdownEditor, NotificationCountBadge, NotificationItem, NotificationPanel, Popover, PopoverContent, PopoverTrigger, ProgressiveImage, RadioGroup, RadioGroupItem, ScrollArea, ScrollBar, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator3 as Separator, Command as ShadcnCommand, CommandEmpty as ShadcnCommandEmpty, CommandGroup as ShadcnCommandGroup, CommandInput as ShadcnCommandInput, CommandItem as ShadcnCommandItem, CommandList as ShadcnCommandList, Skeleton, SkeletonBar, SkeletonCircle, SkeletonGroup, SkeletonRect, Slider, Sparkline, Spinner, StackedBars, StatusBadge, Switch, Table2 as Table, TableBody, TableCaption, TableCell2 as TableCell, TableFooter, TableHead, TableHeader2 as TableHeader, TableRow2 as TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, announce, applyKanbanFilter, buttonGroupVariants, celebrate, cn, computeEta, create_command_suggestion_extension, easeToward, errorToast, format_num, generateUUID, get_hazo_ui_config, get_logger, hasUrlParam, isLucideValue, makeStatusBadge, median, parse_commands_from_text, permissionToast, pick_x_label_indices, readRememberedState, reset_hazo_ui_config, resolve_animation_classes, safeHref, set_hazo_ui_config, set_logger, successToast, text_to_tiptap_content, toggleVariants, upsertEntry as upsertMemoryEntry, useClickOutside, useCopyToClipboard, useDebounce, useErrorDisplay, useEtaProgress, useFullscreen, useIsMobile, useLoadingState, useLocalStorage, useLongPress, useMediaQuery, useRememberedState, useScrollRestore, useSessionStorage, useViewport, useWakeLock, use_fullscreen, use_wake_lock, writeRememberedState };
12908
+ export { ANIMATION_PRESETS, Accordion, AccordionContent, AccordionItem, AccordionTrigger, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AppFooter, AppHeader, Badge, Button, ButtonGroup, ButtonGroupSeparator, ButtonGroupText, CELEBRATION_GRADIENT, Calendar, CanvasTextToolbar, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, CelebrationProvider, Checkbox, Collapsible, CollapsibleContent2 as CollapsibleContent, CollapsibleTrigger2 as CollapsibleTrigger, CommandNodeExtension, CommandPill, CommandPopover, DEFAULT_ANNOUNCE_EVENT, DateRangeSelector, Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, ErrorBanner, ErrorPage, FunnelChart, HazoBrowserTab, HazoContextProvider, HazoUiConfirmDialog, HazoUiDialog, DialogClose as HazoUiDialogClose, DialogContent as HazoUiDialogContent, DialogDescription as HazoUiDialogDescription, DialogFooter as HazoUiDialogFooter, DialogHeader as HazoUiDialogHeader, DialogOverlay as HazoUiDialogOverlay, DialogPortal as HazoUiDialogPortal, Dialog as HazoUiDialogRoot, DialogTitle as HazoUiDialogTitle, DialogTrigger as HazoUiDialogTrigger, HazoUiEtaProgress, HazoUiFlexInput, HazoUiFlexRadio, HazoUiIcon, HazoUiIconPicker, HazoUiImageCropper, HazoUiImageCropperDialog, HazoUiKanban, HazoUiKanbanFilter, HazoUiMemoryDropdown, HazoUiMultiFilterDialog, HazoUiMultiSortDialog, HazoUiPillRadio, HazoUiProgressBar, HazoUiRte, HazoUiTable, HazoUiTextarea, HazoUiTextbox, HazoUiToaster, HoverCard, HoverCardContent, HoverCardTrigger, Input, InputAffix, InverseSparkline, Label3 as Label, LiveRegion, LoadingTimeout, LocalePicker, Logo, MarkdownEditor, NotificationCountBadge, NotificationItem, NotificationPanel, Popover, PopoverContent, PopoverTrigger, ProgressiveImage, RadioGroup, RadioGroupItem, ScrollArea, ScrollBar, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator3 as Separator, Command as ShadcnCommand, CommandEmpty as ShadcnCommandEmpty, CommandGroup as ShadcnCommandGroup, CommandInput as ShadcnCommandInput, CommandItem as ShadcnCommandItem, CommandList as ShadcnCommandList, Skeleton, SkeletonBar, SkeletonCircle, SkeletonGroup, SkeletonRect, Slider, Sparkline, Spinner, StackedBars, StatusBadge, Switch, Table2 as Table, TableBody, TableCaption, TableCell2 as TableCell, TableFooter, TableHead, TableHeader2 as TableHeader, TableRow2 as TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, announce, applyKanbanFilter, buttonGroupVariants, celebrate, cn, computeEta, create_command_suggestion_extension, easeToward, errorToast, format_num, generateUUID, get_hazo_ui_config, get_logger, hasUrlParam, isLucideValue, makeStatusBadge, median, parse_commands_from_text, permissionToast, pick_x_label_indices, readRememberedState, reset_hazo_ui_config, resolve_animation_classes, safeHref, set_hazo_ui_config, set_logger, successToast, text_to_tiptap_content, toggleVariants, upsertEntry as upsertMemoryEntry, useClickOutside, useCopyToClipboard, useDebounce, useErrorDisplay, useEtaProgress, useFullscreen, useIsMobile, useLoadingState, useLocalStorage, useLongPress, useMediaQuery, useRememberedState, useScrollRestore, useSessionStorage, useViewport, useWakeLock, use_fullscreen, use_wake_lock, writeRememberedState };
12552
12909
  //# sourceMappingURL=index.js.map
12553
12910
  //# sourceMappingURL=index.js.map