hazo_ui 6.12.3 → 6.12.5

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.cjs CHANGED
@@ -182,8 +182,8 @@ var require_extends = __commonJS({
182
182
  function _extends11() {
183
183
  return module.exports = _extends11 = Object.assign ? Object.assign.bind() : function(n) {
184
184
  for (var e = 1; e < arguments.length; e++) {
185
- var t14 = arguments[e];
186
- for (var r in t14) ({}).hasOwnProperty.call(t14, r) && (n[r] = t14[r]);
185
+ var t35 = arguments[e];
186
+ for (var r in t35) ({}).hasOwnProperty.call(t35, r) && (n[r] = t35[r]);
187
187
  }
188
188
  return n;
189
189
  }, module.exports.__esModule = true, module.exports["default"] = module.exports, _extends11.apply(null, arguments);
@@ -197,12 +197,12 @@ var require_objectWithoutPropertiesLoose = __commonJS({
197
197
  "../node_modules/@babel/runtime/helpers/objectWithoutPropertiesLoose.js"(exports, module) {
198
198
  function _objectWithoutPropertiesLoose10(r, e) {
199
199
  if (null == r) return {};
200
- var t14 = {};
200
+ var t35 = {};
201
201
  for (var n in r) if ({}.hasOwnProperty.call(r, n)) {
202
202
  if (-1 !== e.indexOf(n)) continue;
203
- t14[n] = r[n];
203
+ t35[n] = r[n];
204
204
  }
205
- return t14;
205
+ return t35;
206
206
  }
207
207
  module.exports = _objectWithoutPropertiesLoose10, module.exports.__esModule = true, module.exports["default"] = module.exports;
208
208
  }
@@ -817,7 +817,112 @@ var en_default = {
817
817
  "icon_picker.search_placeholder": "Search icons...",
818
818
  "common.loading": "Loading...",
819
819
  "common.cancel": "Cancel",
820
- "common.search": "Search..."
820
+ "common.search": "Search...",
821
+ "dialog.default_title": "Action required",
822
+ "dialog.cancel": "Cancel",
823
+ "dialog.ok": "OK",
824
+ "dialog.confirm": "Confirm",
825
+ "dialog.close": "Close",
826
+ "kanban.status_label": "Status",
827
+ "kanban.edit_fallback": "Edit {{id}}",
828
+ "kanban.update_description": "Update card details below.",
829
+ "kanban.saving": "Saving\u2026",
830
+ "kanban.save": "Save",
831
+ "kanban.cancel": "Cancel",
832
+ "kanban.select_placeholder": "Select {{label}}\u2026",
833
+ "kanban.select_priority": "Select priority\u2026",
834
+ "kanban.select_status": "Select status\u2026",
835
+ "markdown.placeholder": "Write in Markdown\u2026",
836
+ "markdown.upload_failed": "Upload failed.",
837
+ "markdown.loading_editor": "Loading editor\u2026",
838
+ "markdown.uploading_image": "Uploading image\u2026",
839
+ "cropper.title": "Crop photo",
840
+ "cropper.save": "Save",
841
+ "cropper.cancel": "Cancel",
842
+ "cropper.zoom": "Zoom",
843
+ "memory.search_placeholder": "Search history\u2026",
844
+ "memory.no_history": "No history yet",
845
+ "memory.remove_aria": "Remove {{label}} from history",
846
+ "celebration.close": "Close celebration",
847
+ "celebration.download_png": "Download PNG",
848
+ "celebration.share": "Share",
849
+ "celebration.copy_image": "Copy image",
850
+ "celebration.dismiss": "Dismiss",
851
+ "charts.date_range": "Date range",
852
+ "flex_input.must_be_valid_number": "Must be a valid number",
853
+ "flex_input.max_decimals": "Maximum {{count}} decimal places allowed",
854
+ "flex_input.min_value": "Must be at least {{min}}",
855
+ "flex_input.max_value": "Must be at most {{max}}",
856
+ "flex_input.alpha_only": "Only letters, numbers, and spaces are allowed",
857
+ "flex_input.must_be_valid_email": "Must be a valid email address",
858
+ "flex_input.min_characters": "Must be at least {{min}} characters",
859
+ "flex_input.max_characters": "Must be at most {{max}} characters",
860
+ "flex_input.invalid_format": "Invalid format",
861
+ "flex_input.invalid_input": "Invalid input",
862
+ "textbox.placeholder": "Type here...",
863
+ "textarea.placeholder": "Type here...",
864
+ "common.remove": "Remove",
865
+ "locale_picker.change_language": "Change language",
866
+ "app_logo.alt_fallback": "Logo",
867
+ "app_header.aria_label": "Application header",
868
+ "skeleton.loading_content": "Loading content",
869
+ "spinner.loading": "Loading",
870
+ "spinner.loading_text": "Loading...",
871
+ "rte.update_link": "Update Link",
872
+ "rte.add_link": "Add Link",
873
+ "rte.remove_link": "Remove",
874
+ "rte.select_size": "Select size",
875
+ "rte.custom_size": "Custom size",
876
+ "rte.insert_table": "Insert",
877
+ "rte.search_variables": "Search variables...",
878
+ "rte.no_variables": "No variables found.",
879
+ "rte.table_operations": "Table Operations",
880
+ "rte.add_row_above": "Add row above",
881
+ "rte.add_row_below": "Add row below",
882
+ "rte.add_col_left": "Add col left",
883
+ "rte.add_col_right": "Add col right",
884
+ "rte.delete_row": "Delete row",
885
+ "rte.delete_col": "Delete col",
886
+ "rte.delete_table": "Delete table",
887
+ "rte.insert_table_heading": "Insert Table",
888
+ "rte.placeholder": "Start typing...",
889
+ "sort.asc": "Asc",
890
+ "sort.desc": "Desc",
891
+ "sort.reorder_aria": "Reorder {{field}}",
892
+ "sort.priority_aria": "Sort priority {{n}}",
893
+ "sort.direction_aria": "Sort direction for {{field}}",
894
+ "sort.remove_aria": "Remove {{field}} from sort",
895
+ "sort.active_sorts": "Active sorts",
896
+ "sort.no_active_sorts": "No active sorts",
897
+ "sort.button_label": "Sort",
898
+ "sort.empty_message": "No sort fields yet. Add one below to start ordering rows.",
899
+ "sort.all_fields_added": "All fields added",
900
+ "sort.add_sort_field": "Add sort field",
901
+ "sort.no_fields_available": "No fields available.",
902
+ "kanban.dnd_pickup": "Picked up {{item}}. Currently in {{column}}. Use arrow keys to choose a different column. Press space to drop, escape to cancel.",
903
+ "kanban.dnd_over": "{{item}} over {{column}}.",
904
+ "kanban.dnd_drop": "{{item}} dropped in {{column}}, position {{pos}}.",
905
+ "kanban.dnd_reorder": "{{item}} reordered to position {{pos}} in {{column}}.",
906
+ "kanban.dnd_cancel": "Movement cancelled. {{item}} returned to {{column}}.",
907
+ "kanban.draggable_card": "draggable card",
908
+ "loading.still_loading": "We're still trying to load the {{label}}. The connection may be slow.",
909
+ "loading.try_again": "Try again",
910
+ "loading.gentle_message": "Loading {{label}}\u2026",
911
+ "loading.default_label": "content",
912
+ "loading.firm_message": "Still working on it \u2014 almost there.",
913
+ "icon_picker.emoji_tab": "Emoji",
914
+ "icon_picker.tools_group": "Tools",
915
+ "icon_picker.home_group": "Home",
916
+ "icon_picker.weather_group": "Weather",
917
+ "icon_picker.nature_group": "Nature",
918
+ "icon_picker.symbols_group": "Symbols",
919
+ "icon_picker.no_results": "No icons found",
920
+ "error.correlation_id": "Correlation ID",
921
+ "charts.total": "Total: {{value}}",
922
+ "charts.pct_of_first": "% of first: {{pct}}%",
923
+ "charts.pct_of_prev": "% of prev: {{pct}}%",
924
+ "charts.dropoff": "Drop-off: \u2212{{value}}",
925
+ "toast.missing_prefix": "Missing: {{items}}"
821
926
  };
822
927
  var t = i18n.createPackageT("hazo_ui", en_default);
823
928
  function FilterFieldItem({
@@ -1305,7 +1410,7 @@ function SortableSortFieldItem({
1305
1410
  ...attributes,
1306
1411
  ...listeners,
1307
1412
  className: "cls_drag_handle flex h-7 w-5 shrink-0 cursor-grab items-center justify-center rounded text-muted-foreground/60 hover:text-foreground active:cursor-grabbing",
1308
- "aria-label": `Reorder ${fieldLabel}`,
1413
+ "aria-label": t2("sort.reorder_aria", { field: fieldLabel }),
1309
1414
  children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.GripVertical, { className: "cls_drag_icon h-4 w-4" })
1310
1415
  }
1311
1416
  ),
@@ -1313,7 +1418,7 @@ function SortableSortFieldItem({
1313
1418
  "span",
1314
1419
  {
1315
1420
  className: "cls_priority_badge inline-flex h-5 w-5 shrink-0 items-center justify-center rounded-full bg-muted text-[10px] font-semibold tabular-nums text-muted-foreground",
1316
- "aria-label": `Sort priority ${priority}`,
1421
+ "aria-label": t2("sort.priority_aria", { n: priority }),
1317
1422
  children: priority
1318
1423
  }
1319
1424
  ),
@@ -1322,7 +1427,7 @@ function SortableSortFieldItem({
1322
1427
  "div",
1323
1428
  {
1324
1429
  role: "radiogroup",
1325
- "aria-label": `Sort direction for ${fieldLabel}`,
1430
+ "aria-label": t2("sort.direction_aria", { field: fieldLabel }),
1326
1431
  className: "cls_direction_control inline-flex shrink-0 items-center rounded-md border border-border/70 bg-muted/40 p-0.5",
1327
1432
  children: [
1328
1433
  /* @__PURE__ */ jsxRuntime.jsxs(
@@ -1336,7 +1441,7 @@ function SortableSortFieldItem({
1336
1441
  className: "cls_dir_asc inline-flex items-center gap-1 rounded px-2 py-1 text-xs font-medium text-muted-foreground transition-colors data-[active=true]:bg-background data-[active=true]:text-foreground data-[active=true]:shadow-sm hover:text-foreground",
1337
1442
  children: [
1338
1443
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowUp, { className: "h-3 w-3" }),
1339
- "Asc"
1444
+ t2("sort.asc")
1340
1445
  ]
1341
1446
  }
1342
1447
  ),
@@ -1351,7 +1456,7 @@ function SortableSortFieldItem({
1351
1456
  className: "cls_dir_desc inline-flex items-center gap-1 rounded px-2 py-1 text-xs font-medium text-muted-foreground transition-colors data-[active=true]:bg-background data-[active=true]:text-foreground data-[active=true]:shadow-sm hover:text-foreground",
1352
1457
  children: [
1353
1458
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowDown, { className: "h-3 w-3" }),
1354
- "Desc"
1459
+ t2("sort.desc")
1355
1460
  ]
1356
1461
  }
1357
1462
  )
@@ -1365,7 +1470,7 @@ function SortableSortFieldItem({
1365
1470
  size: "sm",
1366
1471
  onClick: onDelete,
1367
1472
  className: "cls_delete_btn h-7 w-7 shrink-0 p-0 text-muted-foreground/60 hover:bg-destructive/10 hover:text-destructive",
1368
- "aria-label": `Remove ${fieldLabel} from sort`,
1473
+ "aria-label": t2("sort.remove_aria", { field: fieldLabel }),
1369
1474
  children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "cls_delete_icon h-3.5 w-3.5" })
1370
1475
  }
1371
1476
  )
@@ -1478,16 +1583,16 @@ function HazoUiMultiSortDialog({
1478
1583
  };
1479
1584
  const hasActiveSorts = initialSortFields.length > 0;
1480
1585
  const tooltipContent = hasActiveSorts ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "cls_sort_tooltip_content space-y-1", children: [
1481
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "cls_tooltip_title text-xs font-semibold mb-1", children: "Active sorts" }),
1586
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "cls_tooltip_title text-xs font-semibold mb-1", children: t2("sort.active_sorts") }),
1482
1587
  initialSortFields.map((sortConfig, index) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "cls_tooltip_item text-xs", children: [
1483
1588
  index + 1,
1484
1589
  ". ",
1485
1590
  getFieldLabel(sortConfig.field),
1486
1591
  " (",
1487
- sortConfig.direction === "asc" ? "Asc" : "Desc",
1592
+ sortConfig.direction === "asc" ? t2("sort.asc") : t2("sort.desc"),
1488
1593
  ")"
1489
1594
  ] }, sortConfig.field))
1490
- ] }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "cls_sort_tooltip_content text-xs", children: "No active sorts" });
1595
+ ] }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "cls_sort_tooltip_content text-xs", children: t2("sort.no_active_sorts") });
1491
1596
  return /* @__PURE__ */ jsxRuntime.jsxs(Dialog, { open: isOpen, onOpenChange: setIsOpen, children: [
1492
1597
  /* @__PURE__ */ jsxRuntime.jsx(TooltipProvider, { children: /* @__PURE__ */ jsxRuntime.jsxs(Tooltip, { children: [
1493
1598
  /* @__PURE__ */ jsxRuntime.jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(DialogTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
@@ -1507,7 +1612,7 @@ function HazoUiMultiSortDialog({
1507
1612
  )
1508
1613
  }
1509
1614
  ),
1510
- "Sort",
1615
+ t2("sort.button_label"),
1511
1616
  hasActiveSorts && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "cls_sort_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: initialSortFields.length })
1512
1617
  ]
1513
1618
  }
@@ -1552,7 +1657,7 @@ function HazoUiMultiSortDialog({
1552
1657
  }
1553
1658
  )
1554
1659
  }
1555
- ) }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "cls_empty_sort_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 sort fields yet. Add one below to start ordering rows." }),
1660
+ ) }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "cls_empty_sort_fields rounded-lg border border-dashed border-border/70 bg-muted/20 px-4 py-6 text-center text-xs text-muted-foreground", children: t2("sort.empty_message") }),
1556
1661
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "cls_add_field_section", children: /* @__PURE__ */ jsxRuntime.jsxs(Popover, { open: isComboboxOpen, onOpenChange: setIsComboboxOpen, children: [
1557
1662
  /* @__PURE__ */ jsxRuntime.jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
1558
1663
  Button,
@@ -1564,13 +1669,13 @@ function HazoUiMultiSortDialog({
1564
1669
  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",
1565
1670
  children: [
1566
1671
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Plus, { className: "cls_plus_icon h-4 w-4" }),
1567
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: availableFieldsToAdd.length === 0 ? "All fields added" : "Add sort field" })
1672
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: availableFieldsToAdd.length === 0 ? t2("sort.all_fields_added") : t2("sort.add_sort_field") })
1568
1673
  ]
1569
1674
  }
1570
1675
  ) }),
1571
1676
  /* @__PURE__ */ jsxRuntime.jsx(PopoverContent, { className: "cls_combobox_popover w-[var(--radix-popover-trigger-width)] p-0", align: "start", children: /* @__PURE__ */ jsxRuntime.jsxs(Command, { children: [
1572
1677
  /* @__PURE__ */ jsxRuntime.jsx(CommandInput, { placeholder: t2("sort.search_fields"), className: "cls_command_input" }),
1573
- /* @__PURE__ */ jsxRuntime.jsx(CommandList, { children: availableFieldsToAdd.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(CommandEmpty, { children: "No fields available." }) : /* @__PURE__ */ jsxRuntime.jsx(CommandGroup, { children: availableFieldsToAdd.map((field) => /* @__PURE__ */ jsxRuntime.jsx(
1678
+ /* @__PURE__ */ jsxRuntime.jsx(CommandList, { children: availableFieldsToAdd.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(CommandEmpty, { children: t2("sort.no_fields_available") }) : /* @__PURE__ */ jsxRuntime.jsx(CommandGroup, { children: availableFieldsToAdd.map((field) => /* @__PURE__ */ jsxRuntime.jsx(
1574
1679
  CommandItem,
1575
1680
  {
1576
1681
  value: field.label,
@@ -2106,11 +2211,11 @@ var SYMBOLS_ICONS = [
2106
2211
  "Wrench"
2107
2212
  ];
2108
2213
  var LUCIDE_GROUPS = [
2109
- { key: "tools", label: "Tools", icons: TOOLS_ICONS },
2110
- { key: "home", label: "Home", icons: HOME_ICONS },
2111
- { key: "weather", label: "Weather", icons: WEATHER_ICONS },
2112
- { key: "nature", label: "Nature", icons: NATURE_ICONS },
2113
- { key: "symbols", label: "Symbols", icons: SYMBOLS_ICONS }
2214
+ { key: "tools", label_key: "icon_picker.tools_group", icons: TOOLS_ICONS },
2215
+ { key: "home", label_key: "icon_picker.home_group", icons: HOME_ICONS },
2216
+ { key: "weather", label_key: "icon_picker.weather_group", icons: WEATHER_ICONS },
2217
+ { key: "nature", label_key: "icon_picker.nature_group", icons: NATURE_ICONS },
2218
+ { key: "symbols", label_key: "icon_picker.symbols_group", icons: SYMBOLS_ICONS }
2114
2219
  ];
2115
2220
  var EMOJI_ITEMS = [
2116
2221
  // Faces
@@ -2323,11 +2428,11 @@ function HazoUiIconPicker({
2323
2428
  name
2324
2429
  );
2325
2430
  }),
2326
- filtered_search_results.length === 0 && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "col-span-8 py-4 text-center text-sm text-muted-foreground", children: "No icons found" })
2431
+ filtered_search_results.length === 0 && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "col-span-8 py-4 text-center text-sm text-muted-foreground", children: t3("icon_picker.no_results") })
2327
2432
  ] }) : /* @__PURE__ */ jsxRuntime.jsxs(Tabs, { defaultValue: "emoji", children: [
2328
2433
  /* @__PURE__ */ jsxRuntime.jsxs(TabsList, { className: "grid w-full grid-cols-6", children: [
2329
- /* @__PURE__ */ jsxRuntime.jsx(TabsTrigger, { value: "emoji", children: "Emoji" }),
2330
- LUCIDE_GROUPS.map((group) => /* @__PURE__ */ jsxRuntime.jsx(TabsTrigger, { value: group.key, children: group.label }, group.key))
2434
+ /* @__PURE__ */ jsxRuntime.jsx(TabsTrigger, { value: "emoji", children: t3("icon_picker.emoji_tab") }),
2435
+ LUCIDE_GROUPS.map((group) => /* @__PURE__ */ jsxRuntime.jsx(TabsTrigger, { value: group.key, children: t3(group.label_key) }, group.key))
2331
2436
  ] }),
2332
2437
  /* @__PURE__ */ jsxRuntime.jsx(TabsContent, { value: "emoji", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid max-h-56 grid-cols-8 gap-1 overflow-y-auto", children: EMOJI_ITEMS.map((emoji, index) => /* @__PURE__ */ jsxRuntime.jsx(
2333
2438
  "button",
@@ -2359,6 +2464,7 @@ function HazoUiIconPicker({
2359
2464
  }
2360
2465
  ) });
2361
2466
  }
2467
+ var t4 = i18n.createPackageT("hazo_ui", en_default);
2362
2468
  function validateInput(value, input_type, text_len_min, text_len_max, num_min, num_max, regex, num_decimals) {
2363
2469
  if (value === "") {
2364
2470
  return { isValid: true };
@@ -2367,36 +2473,36 @@ function validateInput(value, input_type, text_len_min, text_len_max, num_min, n
2367
2473
  case "numeric": {
2368
2474
  const numValue = parseFloat(value);
2369
2475
  if (isNaN(numValue)) {
2370
- return { isValid: false, errorMessage: "Must be a valid number" };
2476
+ return { isValid: false, errorMessage: t4("flex_input.must_be_valid_number") };
2371
2477
  }
2372
2478
  if (num_decimals !== void 0) {
2373
2479
  const decimalPlaces = value.split(".")[1]?.length || 0;
2374
2480
  if (decimalPlaces > num_decimals) {
2375
2481
  return {
2376
2482
  isValid: false,
2377
- errorMessage: `Maximum ${num_decimals} decimal place${num_decimals !== 1 ? "s" : ""} allowed`
2483
+ errorMessage: t4("flex_input.max_decimals", { count: num_decimals })
2378
2484
  };
2379
2485
  }
2380
2486
  }
2381
2487
  if (num_min !== void 0 && numValue < num_min) {
2382
- return { isValid: false, errorMessage: `Must be at least ${num_min}` };
2488
+ return { isValid: false, errorMessage: t4("flex_input.min_value", { min: num_min }) };
2383
2489
  }
2384
2490
  if (num_max !== void 0 && numValue > num_max) {
2385
- return { isValid: false, errorMessage: `Must be at most ${num_max}` };
2491
+ return { isValid: false, errorMessage: t4("flex_input.max_value", { max: num_max }) };
2386
2492
  }
2387
2493
  break;
2388
2494
  }
2389
2495
  case "alpha": {
2390
2496
  const alphaRegex = /^[A-Za-z0-9\s]*$/;
2391
2497
  if (!alphaRegex.test(value)) {
2392
- return { isValid: false, errorMessage: "Only letters, numbers, and spaces are allowed" };
2498
+ return { isValid: false, errorMessage: t4("flex_input.alpha_only") };
2393
2499
  }
2394
2500
  break;
2395
2501
  }
2396
2502
  case "email": {
2397
2503
  const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
2398
2504
  if (!emailRegex.test(value)) {
2399
- return { isValid: false, errorMessage: "Must be a valid email address" };
2505
+ return { isValid: false, errorMessage: t4("flex_input.must_be_valid_email") };
2400
2506
  }
2401
2507
  break;
2402
2508
  }
@@ -2404,13 +2510,13 @@ function validateInput(value, input_type, text_len_min, text_len_max, num_min, n
2404
2510
  if (text_len_min !== void 0 && value.length < text_len_min) {
2405
2511
  return {
2406
2512
  isValid: false,
2407
- errorMessage: `Must be at least ${text_len_min} character${text_len_min !== 1 ? "s" : ""}`
2513
+ errorMessage: t4("flex_input.min_characters", { min: text_len_min })
2408
2514
  };
2409
2515
  }
2410
2516
  if (text_len_max !== void 0 && value.length > text_len_max) {
2411
2517
  return {
2412
2518
  isValid: false,
2413
- errorMessage: `Must be at most ${text_len_max} character${text_len_max !== 1 ? "s" : ""}`
2519
+ errorMessage: t4("flex_input.max_characters", { max: text_len_max })
2414
2520
  };
2415
2521
  }
2416
2522
  break;
@@ -2419,7 +2525,7 @@ function validateInput(value, input_type, text_len_min, text_len_max, num_min, n
2419
2525
  if (regex) {
2420
2526
  const regexPattern = typeof regex === "string" ? new RegExp(regex) : regex;
2421
2527
  if (!regexPattern.test(value)) {
2422
- return { isValid: false, errorMessage: "Invalid format" };
2528
+ return { isValid: false, errorMessage: t4("flex_input.invalid_format") };
2423
2529
  }
2424
2530
  }
2425
2531
  return { isValid: true };
@@ -2515,7 +2621,7 @@ var HazoUiFlexInput = React27__namespace.forwardRef(
2515
2621
  num_decimals
2516
2622
  );
2517
2623
  if (!validation.isValid) {
2518
- setErrorMessage(validation.errorMessage || format_guide || "Invalid input");
2624
+ setErrorMessage(validation.errorMessage || format_guide || t4("flex_input.invalid_input"));
2519
2625
  } else {
2520
2626
  setErrorMessage(void 0);
2521
2627
  }
@@ -3745,10 +3851,10 @@ var BLOCK_TYPE_LABEL_KEYS = {
3745
3851
  "code-block": "rte.block_type.code_block",
3746
3852
  blockquote: "rte.block_type.blockquote"
3747
3853
  };
3748
- function get_translated_block_types(t14) {
3854
+ function get_translated_block_types(t35) {
3749
3855
  return BLOCK_TYPES.map((type) => ({
3750
3856
  ...type,
3751
- label: t14(BLOCK_TYPE_LABEL_KEYS[type.value])
3857
+ label: t35(BLOCK_TYPE_LABEL_KEYS[type.value])
3752
3858
  }));
3753
3859
  }
3754
3860
 
@@ -3795,7 +3901,7 @@ function get_file_extension(filename) {
3795
3901
  function is_image_file(mime_type) {
3796
3902
  return mime_type.startsWith("image/");
3797
3903
  }
3798
- var t4 = i18n.createPackageT("hazo_ui", en_default);
3904
+ var t5 = i18n.createPackageT("hazo_ui", en_default);
3799
3905
  var ALL_ON = {
3800
3906
  undo_redo: true,
3801
3907
  block_type: true,
@@ -3850,7 +3956,7 @@ var Toolbar = ({
3850
3956
  }
3851
3957
  const tb = { ...ALL_ON, ...toolbar };
3852
3958
  const font_family_options = font_families && font_families.length > 0 ? font_families : FONT_FAMILIES;
3853
- const block_type_options = get_translated_block_types(t4);
3959
+ const block_type_options = get_translated_block_types(t5);
3854
3960
  const get_current_font_size = () => {
3855
3961
  const attrs = editor.getAttributes("textStyle");
3856
3962
  return attrs.fontSize || FONT_SIZE_CONFIG.default;
@@ -3994,7 +4100,7 @@ var Toolbar = ({
3994
4100
  {
3995
4101
  onClick: () => editor.chain().focus().undo().run(),
3996
4102
  disabled: !editor.can().undo(),
3997
- tooltip: t4("rte.undo"),
4103
+ tooltip: t5("rte.undo"),
3998
4104
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuUndo2, { className: "h-4 w-4" })
3999
4105
  },
4000
4106
  "undo"
@@ -4004,7 +4110,7 @@ var Toolbar = ({
4004
4110
  {
4005
4111
  onClick: () => editor.chain().focus().redo().run(),
4006
4112
  disabled: !editor.can().redo(),
4007
- tooltip: t4("rte.redo"),
4113
+ tooltip: t5("rte.redo"),
4008
4114
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuRedo2, { className: "h-4 w-4" })
4009
4115
  },
4010
4116
  "redo"
@@ -4045,7 +4151,7 @@ var Toolbar = ({
4045
4151
  ToolbarButton,
4046
4152
  {
4047
4153
  onClick: () => handle_font_size_change(-2),
4048
- tooltip: t4("rte.decrease_font_size"),
4154
+ tooltip: t5("rte.decrease_font_size"),
4049
4155
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuMinus, { className: "h-3 w-3" })
4050
4156
  }
4051
4157
  ),
@@ -4054,7 +4160,7 @@ var Toolbar = ({
4054
4160
  ToolbarButton,
4055
4161
  {
4056
4162
  onClick: () => handle_font_size_change(FONT_SIZE_CONFIG.step),
4057
- tooltip: t4("rte.increase_font_size"),
4163
+ tooltip: t5("rte.increase_font_size"),
4058
4164
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuPlus, { className: "h-3 w-3" })
4059
4165
  }
4060
4166
  )
@@ -4072,7 +4178,7 @@ var Toolbar = ({
4072
4178
  {
4073
4179
  onClick: () => editor.chain().focus().toggleBold().run(),
4074
4180
  is_active: editor.isActive("bold"),
4075
- tooltip: t4("rte.bold"),
4181
+ tooltip: t5("rte.bold"),
4076
4182
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuBold, { className: "h-4 w-4" })
4077
4183
  },
4078
4184
  "bold"
@@ -4086,7 +4192,7 @@ var Toolbar = ({
4086
4192
  {
4087
4193
  onClick: () => editor.chain().focus().toggleItalic().run(),
4088
4194
  is_active: editor.isActive("italic"),
4089
- tooltip: t4("rte.italic"),
4195
+ tooltip: t5("rte.italic"),
4090
4196
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuItalic, { className: "h-4 w-4" })
4091
4197
  },
4092
4198
  "italic"
@@ -4100,7 +4206,7 @@ var Toolbar = ({
4100
4206
  {
4101
4207
  onClick: () => editor.chain().focus().toggleUnderline().run(),
4102
4208
  is_active: editor.isActive("underline"),
4103
- tooltip: t4("rte.underline"),
4209
+ tooltip: t5("rte.underline"),
4104
4210
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuUnderline, { className: "h-4 w-4" })
4105
4211
  },
4106
4212
  "underline"
@@ -4114,7 +4220,7 @@ var Toolbar = ({
4114
4220
  {
4115
4221
  onClick: () => editor.chain().focus().toggleStrike().run(),
4116
4222
  is_active: editor.isActive("strike"),
4117
- tooltip: t4("rte.strikethrough"),
4223
+ tooltip: t5("rte.strikethrough"),
4118
4224
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuStrikethrough, { className: "h-4 w-4" })
4119
4225
  },
4120
4226
  "strike"
@@ -4128,7 +4234,7 @@ var Toolbar = ({
4128
4234
  {
4129
4235
  onClick: () => editor.chain().focus().toggleSubscript().run(),
4130
4236
  is_active: editor.isActive("subscript"),
4131
- tooltip: t4("rte.subscript"),
4237
+ tooltip: t5("rte.subscript"),
4132
4238
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuSubscript, { className: "h-4 w-4" })
4133
4239
  },
4134
4240
  "sub"
@@ -4142,7 +4248,7 @@ var Toolbar = ({
4142
4248
  {
4143
4249
  onClick: () => editor.chain().focus().toggleSuperscript().run(),
4144
4250
  is_active: editor.isActive("superscript"),
4145
- tooltip: t4("rte.superscript"),
4251
+ tooltip: t5("rte.superscript"),
4146
4252
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuSuperscript, { className: "h-4 w-4" })
4147
4253
  },
4148
4254
  "super"
@@ -4156,7 +4262,7 @@ var Toolbar = ({
4156
4262
  if (tb.link) {
4157
4263
  items.push(
4158
4264
  /* @__PURE__ */ jsxRuntime.jsxs(Popover, { open: link_popover_open, onOpenChange: set_link_popover_open, children: [
4159
- /* @__PURE__ */ jsxRuntime.jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ToolbarButton, { is_active: editor.isActive("link"), tooltip: t4("rte.link"), children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuLink, { className: "h-4 w-4" }) }) }),
4265
+ /* @__PURE__ */ jsxRuntime.jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ToolbarButton, { is_active: editor.isActive("link"), tooltip: t5("rte.link"), children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuLink, { className: "h-4 w-4" }) }) }),
4160
4266
  /* @__PURE__ */ jsxRuntime.jsx(PopoverContent, { className: "w-80 p-3", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2", children: [
4161
4267
  /* @__PURE__ */ jsxRuntime.jsx(
4162
4268
  Input,
@@ -4168,17 +4274,14 @@ var Toolbar = ({
4168
4274
  }
4169
4275
  ),
4170
4276
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex gap-2", children: [
4171
- /* @__PURE__ */ jsxRuntime.jsxs(Button, { size: "sm", onClick: handle_set_link, className: "flex-1", children: [
4172
- editor.isActive("link") ? "Update" : "Add",
4173
- " Link"
4174
- ] }),
4277
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { size: "sm", onClick: handle_set_link, className: "flex-1", children: editor.isActive("link") ? t5("rte.update_link") : t5("rte.add_link") }),
4175
4278
  editor.isActive("link") && /* @__PURE__ */ jsxRuntime.jsx(
4176
4279
  Button,
4177
4280
  {
4178
4281
  size: "sm",
4179
4282
  variant: "destructive",
4180
4283
  onClick: handle_remove_link,
4181
- children: "Remove"
4284
+ children: t5("rte.remove_link")
4182
4285
  }
4183
4286
  )
4184
4287
  ] })
@@ -4192,7 +4295,7 @@ var Toolbar = ({
4192
4295
  ToolbarButton,
4193
4296
  {
4194
4297
  onClick: () => editor.chain().focus().unsetAllMarks().clearNodes().run(),
4195
- tooltip: t4("rte.clear_formatting"),
4298
+ tooltip: t5("rte.clear_formatting"),
4196
4299
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuRemoveFormatting, { className: "h-4 w-4" })
4197
4300
  },
4198
4301
  "clear"
@@ -4206,7 +4309,7 @@ var Toolbar = ({
4206
4309
  if (tb.text_color) {
4207
4310
  items.push(
4208
4311
  /* @__PURE__ */ jsxRuntime.jsxs(Popover, { open: text_color_open, onOpenChange: set_text_color_open, children: [
4209
- /* @__PURE__ */ jsxRuntime.jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ToolbarButton, { tooltip: t4("rte.text_color"), children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center", children: [
4312
+ /* @__PURE__ */ jsxRuntime.jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ToolbarButton, { tooltip: t5("rte.text_color"), children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center", children: [
4210
4313
  /* @__PURE__ */ jsxRuntime.jsx(lu.LuPalette, { className: "h-4 w-4" }),
4211
4314
  /* @__PURE__ */ jsxRuntime.jsx(
4212
4315
  "div",
@@ -4249,7 +4352,7 @@ var Toolbar = ({
4249
4352
  if (tb.highlight_color) {
4250
4353
  items.push(
4251
4354
  /* @__PURE__ */ jsxRuntime.jsxs(Popover, { open: highlight_color_open, onOpenChange: set_highlight_color_open, children: [
4252
- /* @__PURE__ */ jsxRuntime.jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ToolbarButton, { tooltip: t4("rte.highlight_color"), children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center", children: [
4355
+ /* @__PURE__ */ jsxRuntime.jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ToolbarButton, { tooltip: t5("rte.highlight_color"), children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center", children: [
4253
4356
  /* @__PURE__ */ jsxRuntime.jsx(lu.LuHighlighter, { className: "h-4 w-4" }),
4254
4357
  /* @__PURE__ */ jsxRuntime.jsx(
4255
4358
  "div",
@@ -4292,7 +4395,7 @@ var Toolbar = ({
4292
4395
  {
4293
4396
  onClick: () => editor.chain().focus().setTextAlign("left").run(),
4294
4397
  is_active: editor.isActive({ textAlign: "left" }),
4295
- tooltip: t4("rte.align_left"),
4398
+ tooltip: t5("rte.align_left"),
4296
4399
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuAlignLeft, { className: "h-4 w-4" })
4297
4400
  },
4298
4401
  "align-left"
@@ -4302,7 +4405,7 @@ var Toolbar = ({
4302
4405
  {
4303
4406
  onClick: () => editor.chain().focus().setTextAlign("center").run(),
4304
4407
  is_active: editor.isActive({ textAlign: "center" }),
4305
- tooltip: t4("rte.align_center"),
4408
+ tooltip: t5("rte.align_center"),
4306
4409
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuAlignCenter, { className: "h-4 w-4" })
4307
4410
  },
4308
4411
  "align-center"
@@ -4312,7 +4415,7 @@ var Toolbar = ({
4312
4415
  {
4313
4416
  onClick: () => editor.chain().focus().setTextAlign("right").run(),
4314
4417
  is_active: editor.isActive({ textAlign: "right" }),
4315
- tooltip: t4("rte.align_right"),
4418
+ tooltip: t5("rte.align_right"),
4316
4419
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuAlignRight, { className: "h-4 w-4" })
4317
4420
  },
4318
4421
  "align-right"
@@ -4322,7 +4425,7 @@ var Toolbar = ({
4322
4425
  {
4323
4426
  onClick: () => editor.chain().focus().setTextAlign("justify").run(),
4324
4427
  is_active: editor.isActive({ textAlign: "justify" }),
4325
- tooltip: t4("rte.justify"),
4428
+ tooltip: t5("rte.justify"),
4326
4429
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuAlignJustify, { className: "h-4 w-4" })
4327
4430
  },
4328
4431
  "align-justify"
@@ -4338,7 +4441,7 @@ var Toolbar = ({
4338
4441
  {
4339
4442
  onClick: () => editor.chain().focus().toggleBulletList().run(),
4340
4443
  is_active: editor.isActive("bulletList"),
4341
- tooltip: t4("rte.bullet_list"),
4444
+ tooltip: t5("rte.bullet_list"),
4342
4445
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuList, { className: "h-4 w-4" })
4343
4446
  },
4344
4447
  "bullet"
@@ -4352,7 +4455,7 @@ var Toolbar = ({
4352
4455
  {
4353
4456
  onClick: () => editor.chain().focus().toggleOrderedList().run(),
4354
4457
  is_active: editor.isActive("orderedList"),
4355
- tooltip: t4("rte.ordered_list"),
4458
+ tooltip: t5("rte.ordered_list"),
4356
4459
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuListOrdered, { className: "h-4 w-4" })
4357
4460
  },
4358
4461
  "ordered"
@@ -4366,7 +4469,7 @@ var Toolbar = ({
4366
4469
  {
4367
4470
  onClick: () => editor.chain().focus().toggleTaskList().run(),
4368
4471
  is_active: editor.isActive("taskList"),
4369
- tooltip: t4("rte.checklist"),
4472
+ tooltip: t5("rte.checklist"),
4370
4473
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuListChecks, { className: "h-4 w-4" })
4371
4474
  },
4372
4475
  "task"
@@ -4388,7 +4491,7 @@ var Toolbar = ({
4388
4491
  }
4389
4492
  },
4390
4493
  disabled: !editor.can().liftListItem("listItem") && !editor.can().liftListItem("taskItem"),
4391
- tooltip: t4("rte.decrease_indent"),
4494
+ tooltip: t5("rte.decrease_indent"),
4392
4495
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuIndentDecrease, { className: "h-4 w-4" })
4393
4496
  },
4394
4497
  "indent-dec"
@@ -4404,7 +4507,7 @@ var Toolbar = ({
4404
4507
  }
4405
4508
  },
4406
4509
  disabled: !editor.can().sinkListItem("listItem") && !editor.can().sinkListItem("taskItem"),
4407
- tooltip: t4("rte.increase_indent"),
4510
+ tooltip: t5("rte.increase_indent"),
4408
4511
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuIndentIncrease, { className: "h-4 w-4" })
4409
4512
  },
4410
4513
  "indent-inc"
@@ -4415,7 +4518,7 @@ var Toolbar = ({
4415
4518
  const items = [];
4416
4519
  if (tb.horizontal_rule) {
4417
4520
  items.push(
4418
- /* @__PURE__ */ jsxRuntime.jsx(ToolbarButton, { onClick: handle_hr_insert, tooltip: t4("rte.horizontal_rule"), children: /* @__PURE__ */ jsxRuntime.jsx(rx.RxDividerHorizontal, { className: "h-4 w-4" }) }, "hr")
4521
+ /* @__PURE__ */ jsxRuntime.jsx(ToolbarButton, { onClick: handle_hr_insert, tooltip: t5("rte.horizontal_rule"), children: /* @__PURE__ */ jsxRuntime.jsx(rx.RxDividerHorizontal, { className: "h-4 w-4" }) }, "hr")
4419
4522
  );
4420
4523
  }
4421
4524
  if (tb.image) {
@@ -4424,7 +4527,7 @@ var Toolbar = ({
4424
4527
  ToolbarButton,
4425
4528
  {
4426
4529
  onClick: () => image_input_ref.current?.click(),
4427
- tooltip: t4("rte.insert_image"),
4530
+ tooltip: t5("rte.insert_image"),
4428
4531
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuImage, { className: "h-4 w-4" })
4429
4532
  },
4430
4533
  "image"
@@ -4438,14 +4541,14 @@ var Toolbar = ({
4438
4541
  ToolbarButton,
4439
4542
  {
4440
4543
  is_active: editor.isActive("table"),
4441
- tooltip: t4("rte.table"),
4544
+ tooltip: t5("rte.table"),
4442
4545
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuTable, { className: "h-4 w-4" })
4443
4546
  }
4444
4547
  ) }),
4445
4548
  /* @__PURE__ */ jsxRuntime.jsx(PopoverContent, { className: "w-auto p-3", align: "start", children: editor.isActive("table") ? (
4446
4549
  // Table editing controls when inside a table
4447
4550
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2", children: [
4448
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-xs font-medium mb-1", children: "Table Operations" }),
4551
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-xs font-medium mb-1", children: t5("rte.table_operations") }),
4449
4552
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-1", children: [
4450
4553
  /* @__PURE__ */ jsxRuntime.jsxs(
4451
4554
  Button,
@@ -4456,7 +4559,7 @@ var Toolbar = ({
4456
4559
  onClick: handle_add_row_before,
4457
4560
  children: [
4458
4561
  /* @__PURE__ */ jsxRuntime.jsx(lu.LuTableRowsSplit, { className: "h-3 w-3 mr-1" }),
4459
- "Add row above"
4562
+ t5("rte.add_row_above")
4460
4563
  ]
4461
4564
  }
4462
4565
  ),
@@ -4469,7 +4572,7 @@ var Toolbar = ({
4469
4572
  onClick: handle_add_row_after,
4470
4573
  children: [
4471
4574
  /* @__PURE__ */ jsxRuntime.jsx(lu.LuTableRowsSplit, { className: "h-3 w-3 mr-1" }),
4472
- "Add row below"
4575
+ t5("rte.add_row_below")
4473
4576
  ]
4474
4577
  }
4475
4578
  ),
@@ -4482,7 +4585,7 @@ var Toolbar = ({
4482
4585
  onClick: handle_add_col_before,
4483
4586
  children: [
4484
4587
  /* @__PURE__ */ jsxRuntime.jsx(lu.LuTableColumnsSplit, { className: "h-3 w-3 mr-1" }),
4485
- "Add col left"
4588
+ t5("rte.add_col_left")
4486
4589
  ]
4487
4590
  }
4488
4591
  ),
@@ -4495,7 +4598,7 @@ var Toolbar = ({
4495
4598
  onClick: handle_add_col_after,
4496
4599
  children: [
4497
4600
  /* @__PURE__ */ jsxRuntime.jsx(lu.LuTableColumnsSplit, { className: "h-3 w-3 mr-1" }),
4498
- "Add col right"
4601
+ t5("rte.add_col_right")
4499
4602
  ]
4500
4603
  }
4501
4604
  ),
@@ -4508,7 +4611,7 @@ var Toolbar = ({
4508
4611
  onClick: handle_delete_row,
4509
4612
  children: [
4510
4613
  /* @__PURE__ */ jsxRuntime.jsx(lu.LuTrash2, { className: "h-3 w-3 mr-1" }),
4511
- "Delete row"
4614
+ t5("rte.delete_row")
4512
4615
  ]
4513
4616
  }
4514
4617
  ),
@@ -4521,7 +4624,7 @@ var Toolbar = ({
4521
4624
  onClick: handle_delete_col,
4522
4625
  children: [
4523
4626
  /* @__PURE__ */ jsxRuntime.jsx(lu.LuTrash2, { className: "h-3 w-3 mr-1" }),
4524
- "Delete col"
4627
+ t5("rte.delete_col")
4525
4628
  ]
4526
4629
  }
4527
4630
  )
@@ -4535,7 +4638,7 @@ var Toolbar = ({
4535
4638
  onClick: handle_delete_table,
4536
4639
  children: [
4537
4640
  /* @__PURE__ */ jsxRuntime.jsx(lu.LuTrash2, { className: "h-3 w-3 mr-1" }),
4538
- "Delete table"
4641
+ t5("rte.delete_table")
4539
4642
  ]
4540
4643
  }
4541
4644
  )
@@ -4543,7 +4646,7 @@ var Toolbar = ({
4543
4646
  ) : (
4544
4647
  // Table size picker when not in a table
4545
4648
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2", children: [
4546
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-xs font-medium mb-1", children: "Insert Table" }),
4649
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-xs font-medium mb-1", children: t5("rte.insert_table_heading") }),
4547
4650
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid gap-0.5", children: Array.from({ length: 6 }).map((_, row_idx) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex gap-0.5", children: Array.from({ length: 6 }).map((_2, col_idx) => /* @__PURE__ */ jsxRuntime.jsx(
4548
4651
  "div",
4549
4652
  {
@@ -4557,9 +4660,9 @@ var Toolbar = ({
4557
4660
  },
4558
4661
  col_idx
4559
4662
  )) }, row_idx)) }),
4560
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-xs text-center text-muted-foreground", children: hovered_cell ? `${hovered_cell.col} x ${hovered_cell.row}` : "Select size" }),
4663
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-xs text-center text-muted-foreground", children: hovered_cell ? `${hovered_cell.col} x ${hovered_cell.row}` : t5("rte.select_size") }),
4561
4664
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "border-t pt-2 mt-1", children: [
4562
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-xs text-muted-foreground mb-2", children: "Custom size" }),
4665
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-xs text-muted-foreground mb-2", children: t5("rte.custom_size") }),
4563
4666
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
4564
4667
  /* @__PURE__ */ jsxRuntime.jsx(
4565
4668
  Input,
@@ -4592,7 +4695,7 @@ var Toolbar = ({
4592
4695
  onClick: () => handle_table_insert(table_rows, table_cols),
4593
4696
  children: [
4594
4697
  /* @__PURE__ */ jsxRuntime.jsx(lu.LuGrid3X3, { className: "h-3 w-3 mr-1" }),
4595
- "Insert"
4698
+ t5("rte.insert_table")
4596
4699
  ]
4597
4700
  }
4598
4701
  )
@@ -4610,11 +4713,11 @@ var Toolbar = ({
4610
4713
  if (tb.variables && variables.length > 0) {
4611
4714
  items.push(
4612
4715
  /* @__PURE__ */ jsxRuntime.jsxs(Popover, { open: variables_menu_open, onOpenChange: set_variables_menu_open, children: [
4613
- /* @__PURE__ */ jsxRuntime.jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ToolbarButton, { tooltip: t4("rte.insert_variable"), children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuVariable, { className: "h-4 w-4" }) }) }),
4716
+ /* @__PURE__ */ jsxRuntime.jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ToolbarButton, { tooltip: t5("rte.insert_variable"), children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuVariable, { className: "h-4 w-4" }) }) }),
4614
4717
  /* @__PURE__ */ jsxRuntime.jsx(PopoverContent, { className: "w-64 p-0", align: "start", children: /* @__PURE__ */ jsxRuntime.jsxs(Command, { children: [
4615
- /* @__PURE__ */ jsxRuntime.jsx(CommandInput, { placeholder: "Search variables...", className: "h-8 text-xs" }),
4718
+ /* @__PURE__ */ jsxRuntime.jsx(CommandInput, { placeholder: t5("rte.search_variables"), className: "h-8 text-xs" }),
4616
4719
  /* @__PURE__ */ jsxRuntime.jsxs(CommandList, { children: [
4617
- /* @__PURE__ */ jsxRuntime.jsx(CommandEmpty, { children: "No variables found." }),
4720
+ /* @__PURE__ */ jsxRuntime.jsx(CommandEmpty, { children: t5("rte.no_variables") }),
4618
4721
  /* @__PURE__ */ jsxRuntime.jsx(CommandGroup, { children: variables.map((variable) => /* @__PURE__ */ jsxRuntime.jsx(
4619
4722
  CommandItem,
4620
4723
  {
@@ -4639,7 +4742,7 @@ var Toolbar = ({
4639
4742
  ToolbarButton,
4640
4743
  {
4641
4744
  onClick: () => file_input_ref.current?.click(),
4642
- tooltip: t4("rte.attach_file"),
4745
+ tooltip: t5("rte.attach_file"),
4643
4746
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuPaperclip, { className: "h-4 w-4" })
4644
4747
  },
4645
4748
  "attach"
@@ -4911,6 +5014,7 @@ var VariableExtension = core.Node.create({
4911
5014
  };
4912
5015
  }
4913
5016
  });
5017
+ var t6 = i18n.createPackageT("hazo_ui", en_default);
4914
5018
  function debounce_fn(func, wait) {
4915
5019
  let timeout_id = null;
4916
5020
  return (output) => {
@@ -4927,7 +5031,7 @@ var HazoUiRte = ({
4927
5031
  attachments: initial_attachments = [],
4928
5032
  variables = [],
4929
5033
  on_change,
4930
- placeholder = "Start typing...",
5034
+ placeholder,
4931
5035
  min_height = "200px",
4932
5036
  max_height = "400px",
4933
5037
  disabled = false,
@@ -4936,6 +5040,7 @@ var HazoUiRte = ({
4936
5040
  toolbar,
4937
5041
  font_families
4938
5042
  }) => {
5043
+ const resolved_placeholder = placeholder ?? t6("rte.placeholder");
4939
5044
  const [attachments, set_attachments] = React27__namespace.useState(
4940
5045
  initial_attachments
4941
5046
  );
@@ -4985,7 +5090,7 @@ var HazoUiRte = ({
4985
5090
  }
4986
5091
  }),
4987
5092
  Placeholder__default.default.configure({
4988
- placeholder
5093
+ placeholder: resolved_placeholder
4989
5094
  }),
4990
5095
  HorizontalRule__default.default,
4991
5096
  extensionTable.Table.configure({
@@ -5160,7 +5265,7 @@ var HazoUiRte = ({
5160
5265
  );
5161
5266
  };
5162
5267
  HazoUiRte.displayName = "HazoUiRte";
5163
- var t5 = i18n.createPackageT("hazo_ui", en_default);
5268
+ var t7 = i18n.createPackageT("hazo_ui", en_default);
5164
5269
  function CanvasTextToolbar({
5165
5270
  bold,
5166
5271
  italic,
@@ -5191,14 +5296,14 @@ function CanvasTextToolbar({
5191
5296
  ),
5192
5297
  style,
5193
5298
  children: [
5194
- /* @__PURE__ */ jsxRuntime.jsx(ToolbarButton, { is_active: bold, onClick: onBold, tooltip: t5("canvas_toolbar.bold"), children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuBold, { className: "h-4 w-4" }) }),
5195
- /* @__PURE__ */ jsxRuntime.jsx(ToolbarButton, { is_active: italic, onClick: onItalic, tooltip: t5("canvas_toolbar.italic"), children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuItalic, { className: "h-4 w-4" }) }),
5299
+ /* @__PURE__ */ jsxRuntime.jsx(ToolbarButton, { is_active: bold, onClick: onBold, tooltip: t7("canvas_toolbar.bold"), children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuBold, { className: "h-4 w-4" }) }),
5300
+ /* @__PURE__ */ jsxRuntime.jsx(ToolbarButton, { is_active: italic, onClick: onItalic, tooltip: t7("canvas_toolbar.italic"), children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuItalic, { className: "h-4 w-4" }) }),
5196
5301
  /* @__PURE__ */ jsxRuntime.jsx(
5197
5302
  ToolbarButton,
5198
5303
  {
5199
5304
  is_active: underline,
5200
5305
  onClick: onUnderline,
5201
- tooltip: t5("canvas_toolbar.underline"),
5306
+ tooltip: t7("canvas_toolbar.underline"),
5202
5307
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuUnderline, { className: "h-4 w-4" })
5203
5308
  }
5204
5309
  ),
@@ -5208,7 +5313,7 @@ function CanvasTextToolbar({
5208
5313
  {
5209
5314
  is_active: align === "left",
5210
5315
  onClick: () => onAlign?.("left"),
5211
- tooltip: t5("canvas_toolbar.align_left"),
5316
+ tooltip: t7("canvas_toolbar.align_left"),
5212
5317
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuAlignLeft, { className: "h-4 w-4" })
5213
5318
  }
5214
5319
  ),
@@ -5217,7 +5322,7 @@ function CanvasTextToolbar({
5217
5322
  {
5218
5323
  is_active: align === "center",
5219
5324
  onClick: () => onAlign?.("center"),
5220
- tooltip: t5("canvas_toolbar.align_center"),
5325
+ tooltip: t7("canvas_toolbar.align_center"),
5221
5326
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuAlignCenter, { className: "h-4 w-4" })
5222
5327
  }
5223
5328
  ),
@@ -5226,7 +5331,7 @@ function CanvasTextToolbar({
5226
5331
  {
5227
5332
  is_active: align === "right",
5228
5333
  onClick: () => onAlign?.("right"),
5229
- tooltip: t5("canvas_toolbar.align_right"),
5334
+ tooltip: t7("canvas_toolbar.align_right"),
5230
5335
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuAlignRight, { className: "h-4 w-4" })
5231
5336
  }
5232
5337
  ),
@@ -5235,7 +5340,7 @@ function CanvasTextToolbar({
5235
5340
  "label",
5236
5341
  {
5237
5342
  className: "relative flex h-8 w-8 cursor-pointer items-center justify-center rounded-md hover:bg-accent",
5238
- title: t5("canvas_toolbar.text_color"),
5343
+ title: t7("canvas_toolbar.text_color"),
5239
5344
  children: [
5240
5345
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center", children: [
5241
5346
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs font-bold text-muted-foreground", children: "A" }),
@@ -5265,7 +5370,7 @@ function CanvasTextToolbar({
5265
5370
  {
5266
5371
  is_active: verticalAlign === "top",
5267
5372
  onClick: () => onVerticalAlign?.("top"),
5268
- tooltip: t5("canvas_toolbar.align_top"),
5373
+ tooltip: t7("canvas_toolbar.align_top"),
5269
5374
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuAlignVerticalJustifyStart, { className: "h-4 w-4" })
5270
5375
  }
5271
5376
  ),
@@ -5274,7 +5379,7 @@ function CanvasTextToolbar({
5274
5379
  {
5275
5380
  is_active: verticalAlign === "middle",
5276
5381
  onClick: () => onVerticalAlign?.("middle"),
5277
- tooltip: t5("canvas_toolbar.align_middle"),
5382
+ tooltip: t7("canvas_toolbar.align_middle"),
5278
5383
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuAlignVerticalJustifyCenter, { className: "h-4 w-4" })
5279
5384
  }
5280
5385
  ),
@@ -5283,7 +5388,7 @@ function CanvasTextToolbar({
5283
5388
  {
5284
5389
  is_active: verticalAlign === "bottom",
5285
5390
  onClick: () => onVerticalAlign?.("bottom"),
5286
- tooltip: t5("canvas_toolbar.align_bottom"),
5391
+ tooltip: t7("canvas_toolbar.align_bottom"),
5287
5392
  children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuAlignVerticalJustifyEnd, { className: "h-4 w-4" })
5288
5393
  }
5289
5394
  ),
@@ -5294,7 +5399,7 @@ function CanvasTextToolbar({
5294
5399
  value: font,
5295
5400
  onChange: (e) => onFont?.(e.target.value),
5296
5401
  className: "h-8 text-xs rounded-md border border-border bg-background px-1 text-foreground focus:outline-none",
5297
- title: t5("canvas_toolbar.font_family"),
5402
+ title: t7("canvas_toolbar.font_family"),
5298
5403
  children: [
5299
5404
  /* @__PURE__ */ jsxRuntime.jsx("option", { value: "sans-serif", children: "Sans" }),
5300
5405
  /* @__PURE__ */ jsxRuntime.jsx("option", { value: "serif", children: "Serif" }),
@@ -5306,18 +5411,19 @@ function CanvasTextToolbar({
5306
5411
  }
5307
5412
  ),
5308
5413
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-1 h-6 w-px bg-border" }),
5309
- /* @__PURE__ */ jsxRuntime.jsx(ToolbarButton, { is_active: bullet, onClick: onBullet, tooltip: t5("canvas_toolbar.bullet_list"), children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuList, { className: "h-4 w-4" }) })
5414
+ /* @__PURE__ */ jsxRuntime.jsx(ToolbarButton, { is_active: bullet, onClick: onBullet, tooltip: t7("canvas_toolbar.bullet_list"), children: /* @__PURE__ */ jsxRuntime.jsx(lu.LuList, { className: "h-4 w-4" }) })
5310
5415
  ]
5311
5416
  }
5312
5417
  ) });
5313
5418
  }
5419
+ var t8 = i18n.createPackageT("hazo_ui", en_default);
5314
5420
  var MdEditorLazy = React27.lazy(() => import('@uiw/react-md-editor'));
5315
5421
  var EDITOR_TEXTAREA_SELECTOR = ".w-md-editor-text-input";
5316
5422
  function MarkdownEditor({
5317
5423
  value,
5318
5424
  onChange,
5319
5425
  height = 600,
5320
- placeholder = "Write in Markdown\u2026",
5426
+ placeholder,
5321
5427
  className,
5322
5428
  colorMode = "light",
5323
5429
  preview = "edit",
@@ -5400,13 +5506,13 @@ function MarkdownEditor({
5400
5506
  try {
5401
5507
  const url = await onImageUpload(file);
5402
5508
  if (!url) {
5403
- setError("Upload failed.");
5509
+ setError(t8("markdown.upload_failed"));
5404
5510
  onChange(before + after);
5405
5511
  return;
5406
5512
  }
5407
5513
  onChange(before + `![](${url})` + after);
5408
5514
  } catch {
5409
- setError("Upload failed.");
5515
+ setError(t8("markdown.upload_failed"));
5410
5516
  onChange(before + after);
5411
5517
  } finally {
5412
5518
  setUploading(false);
@@ -5430,7 +5536,7 @@ function MarkdownEditor({
5430
5536
  {
5431
5537
  className: "flex items-center justify-center rounded-md border border-border bg-muted/30 text-sm text-muted-foreground",
5432
5538
  style: { height },
5433
- children: "Loading editor\u2026"
5539
+ children: t8("markdown.loading_editor")
5434
5540
  }
5435
5541
  ),
5436
5542
  children: /* @__PURE__ */ jsxRuntime.jsx(
@@ -5442,7 +5548,7 @@ function MarkdownEditor({
5442
5548
  preview: effectivePreview,
5443
5549
  visibleDragbar: false,
5444
5550
  commands: editorCommands,
5445
- textareaProps: { placeholder, onPaste: handlePaste }
5551
+ textareaProps: { placeholder: placeholder ?? t8("markdown.placeholder"), onPaste: handlePaste }
5446
5552
  }
5447
5553
  )
5448
5554
  }
@@ -5451,7 +5557,7 @@ function MarkdownEditor({
5451
5557
  {
5452
5558
  className: "flex items-center justify-center rounded-md border border-border bg-muted/30 text-sm text-muted-foreground",
5453
5559
  style: { height },
5454
- children: "Loading editor\u2026"
5560
+ children: t8("markdown.loading_editor")
5455
5561
  }
5456
5562
  ) }),
5457
5563
  useCustomPreview && showPreview && /* @__PURE__ */ jsxRuntime.jsx(
@@ -5465,7 +5571,7 @@ function MarkdownEditor({
5465
5571
  ]
5466
5572
  }
5467
5573
  ),
5468
- uploading && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-2 text-xs text-muted-foreground", children: "Uploading image\u2026" }),
5574
+ uploading && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-2 text-xs text-muted-foreground", children: t8("markdown.uploading_image") }),
5469
5575
  error && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-2 text-xs text-destructive", children: error })
5470
5576
  ] });
5471
5577
  }
@@ -6164,6 +6270,7 @@ var Text = core.Node.create({
6164
6270
  renderMarkdown: (node) => node.text || ""
6165
6271
  });
6166
6272
  var index_default3 = Text;
6273
+ var t9 = i18n.createPackageT("hazo_ui", en_default);
6167
6274
  var SingleLineDocument = index_default.extend({
6168
6275
  content: "paragraph"
6169
6276
  });
@@ -6201,7 +6308,7 @@ var HazoUiTextbox = ({
6201
6308
  value,
6202
6309
  default_value,
6203
6310
  prefixes,
6204
- placeholder = "Type here...",
6311
+ placeholder,
6205
6312
  disabled = false,
6206
6313
  className,
6207
6314
  pill_variant = "default",
@@ -6212,6 +6319,7 @@ var HazoUiTextbox = ({
6212
6319
  on_command_change,
6213
6320
  on_command_remove
6214
6321
  }) => {
6322
+ const resolved_placeholder = placeholder ?? t9("textbox.placeholder");
6215
6323
  const generated_instance_id = React27__namespace.useId();
6216
6324
  const instance_id = provided_instance_id || generated_instance_id;
6217
6325
  const [suggestion_state, set_suggestion_state] = React27__namespace.useState(null);
@@ -6244,7 +6352,7 @@ var HazoUiTextbox = ({
6244
6352
  index_default2,
6245
6353
  index_default3,
6246
6354
  Placeholder__default.default.configure({
6247
- placeholder
6355
+ placeholder: resolved_placeholder
6248
6356
  }),
6249
6357
  CommandNodeExtension.configure({}),
6250
6358
  ...suggestion_extensions
@@ -6623,7 +6731,7 @@ var HazoUiTextbox = ({
6623
6731
  edit_selected_index === edit_commands.length && "bg-destructive/10"
6624
6732
  ),
6625
6733
  onClick: handle_command_remove,
6626
- children: /* @__PURE__ */ jsxRuntime.jsx("span", { children: "Remove" })
6734
+ children: /* @__PURE__ */ jsxRuntime.jsx("span", { children: t9("common.remove") })
6627
6735
  }
6628
6736
  )
6629
6737
  ] })
@@ -6701,6 +6809,7 @@ var HardBreak = core.Node.create({
6701
6809
  }
6702
6810
  });
6703
6811
  var index_default4 = HardBreak;
6812
+ var t10 = i18n.createPackageT("hazo_ui", en_default);
6704
6813
  var get_editor_output2 = (editor) => {
6705
6814
  if (!editor) {
6706
6815
  return { plain_text: "", display_text: "", commands: [] };
@@ -6755,7 +6864,7 @@ var HazoUiTextarea = ({
6755
6864
  value,
6756
6865
  default_value,
6757
6866
  prefixes,
6758
- placeholder = "Type here...",
6867
+ placeholder,
6759
6868
  disabled = false,
6760
6869
  className,
6761
6870
  pill_variant = "default",
@@ -6769,6 +6878,7 @@ var HazoUiTextarea = ({
6769
6878
  on_command_change,
6770
6879
  on_command_remove
6771
6880
  }) => {
6881
+ const resolved_placeholder = placeholder ?? t10("textarea.placeholder");
6772
6882
  const generated_instance_id = React27__namespace.useId();
6773
6883
  const instance_id = provided_instance_id || generated_instance_id;
6774
6884
  const [suggestion_state, set_suggestion_state] = React27__namespace.useState(null);
@@ -6803,7 +6913,7 @@ var HazoUiTextarea = ({
6803
6913
  index_default3,
6804
6914
  index_default4,
6805
6915
  Placeholder__default.default.configure({
6806
- placeholder
6916
+ placeholder: resolved_placeholder
6807
6917
  }),
6808
6918
  CommandNodeExtension.configure({}),
6809
6919
  ...suggestion_extensions
@@ -7193,7 +7303,7 @@ var HazoUiTextarea = ({
7193
7303
  backgroundColor: edit_selected_index === edit_commands.length ? "rgba(239, 68, 68, 0.1)" : "inherit"
7194
7304
  },
7195
7305
  onClick: handle_command_remove,
7196
- children: /* @__PURE__ */ jsxRuntime.jsx("span", { children: "Remove" })
7306
+ children: /* @__PURE__ */ jsxRuntime.jsx("span", { children: t10("common.remove") })
7197
7307
  }
7198
7308
  )
7199
7309
  ] })
@@ -7253,6 +7363,7 @@ function resolve_animation_classes(open_anim = "zoom", close_anim = "zoom") {
7253
7363
  const close_classes = close_anim in ANIMATION_PRESETS ? ANIMATION_PRESETS[close_anim].close : close_anim;
7254
7364
  return `${open_classes} ${close_classes}`;
7255
7365
  }
7366
+ var t11 = i18n.createPackageT("hazo_ui", en_default);
7256
7367
  var VARIANT_PRESETS = {
7257
7368
  info: {
7258
7369
  header_background_color: "var(--dialog-info-bg)",
@@ -7302,11 +7413,11 @@ function HazoUiDialog({
7302
7413
  children,
7303
7414
  onConfirm,
7304
7415
  onCancel,
7305
- title = "Action required",
7416
+ title,
7306
7417
  description,
7307
7418
  actionButtonText: actionButtonTextProp,
7308
7419
  actionButtonVariant,
7309
- cancelButtonText = "Cancel",
7420
+ cancelButtonText,
7310
7421
  showCancelButton: showCancelButtonProp,
7311
7422
  showActionButton = true,
7312
7423
  closeOnConfirm: closeOnConfirmProp,
@@ -7346,9 +7457,11 @@ function HazoUiDialog({
7346
7457
  const cancel_ref = React27__namespace.useRef(null);
7347
7458
  const variant_preset = variant !== "default" ? VARIANT_PRESETS[variant] : is_status_kind || is_confirm_kind ? NEUTRAL_VARIANT_PRESET : void 0;
7348
7459
  const resolved_action_button_variant = actionButtonVariant ?? variant_preset?.action_button_variant ?? "default";
7460
+ const resolved_title = title ?? t11("dialog.default_title");
7461
+ const resolved_cancel_text = cancelButtonText ?? t11("dialog.cancel");
7349
7462
  const showCancelButton = showCancelButtonProp ?? (is_status_kind ? false : true);
7350
7463
  const closeOnConfirm = closeOnConfirmProp ?? (is_status_kind || is_confirm_kind ? true : false);
7351
- const actionButtonText = actionButtonTextProp ?? (is_status_kind ? "OK" : is_confirm_kind ? showCancelButton ? "Confirm" : "OK" : "Confirm");
7464
+ const actionButtonText = actionButtonTextProp ?? (is_status_kind ? t11("dialog.ok") : is_confirm_kind ? showCancelButton ? t11("dialog.confirm") : t11("dialog.ok") : t11("dialog.confirm"));
7352
7465
  const actionButtonLoading = actionButtonLoadingProp ?? (is_confirm_kind ? internal_confirm_loading : false);
7353
7466
  const handleConfirm = () => {
7354
7467
  if (is_confirm_kind) {
@@ -7483,7 +7596,7 @@ function HazoUiDialog({
7483
7596
  },
7484
7597
  children: [
7485
7598
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "cls_confirm_dialog_body px-6 pt-7 pb-5", children: [
7486
- /* @__PURE__ */ jsxRuntime.jsx(DialogPrimitive__namespace.Title, { className: "cls_confirm_dialog_title text-[17px] font-semibold text-foreground mb-2.5", children: title }),
7599
+ /* @__PURE__ */ jsxRuntime.jsx(DialogPrimitive__namespace.Title, { className: "cls_confirm_dialog_title text-[17px] font-semibold text-foreground mb-2.5", children: resolved_title }),
7487
7600
  children ? /* @__PURE__ */ jsxRuntime.jsx(DialogPrimitive__namespace.Description, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "cls_confirm_dialog_children text-sm text-muted-foreground leading-relaxed", children }) }) : description ? /* @__PURE__ */ jsxRuntime.jsx(DialogPrimitive__namespace.Description, { className: "cls_confirm_dialog_description text-sm text-muted-foreground leading-relaxed", children: description }) : null
7488
7601
  ] }),
7489
7602
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "cls_confirm_dialog_separator border-t border-border" }),
@@ -7498,7 +7611,7 @@ function HazoUiDialog({
7498
7611
  onClick: handleCancel,
7499
7612
  disabled: actionButtonLoading,
7500
7613
  style: cancelButtonStyles,
7501
- children: cancelButtonText
7614
+ children: resolved_cancel_text
7502
7615
  }
7503
7616
  ),
7504
7617
  showActionButton && /* @__PURE__ */ jsxRuntime.jsxs(
@@ -7564,7 +7677,7 @@ function HazoUiDialog({
7564
7677
  ...finalHeaderBackgroundColor && { backgroundColor: finalHeaderBackgroundColor },
7565
7678
  ...finalHeaderTextColor && { color: finalHeaderTextColor }
7566
7679
  },
7567
- children: /* @__PURE__ */ jsxRuntime.jsx(DialogTitle, { className: titleClassName, children: title })
7680
+ children: /* @__PURE__ */ jsxRuntime.jsx(DialogTitle, { className: titleClassName, children: resolved_title })
7568
7681
  }
7569
7682
  ),
7570
7683
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -7595,7 +7708,7 @@ function HazoUiDialog({
7595
7708
  ),
7596
7709
  style: headerStyles,
7597
7710
  children: [
7598
- /* @__PURE__ */ jsxRuntime.jsx(DialogTitle, { className: titleClassName, children: title }),
7711
+ /* @__PURE__ */ jsxRuntime.jsx(DialogTitle, { className: titleClassName, children: resolved_title }),
7599
7712
  description && /* @__PURE__ */ jsxRuntime.jsx(
7600
7713
  DialogDescription,
7601
7714
  {
@@ -7646,7 +7759,7 @@ function HazoUiDialog({
7646
7759
  variant: "outline",
7647
7760
  onClick: handleCancel,
7648
7761
  style: cancelButtonStyles,
7649
- children: cancelButtonText
7762
+ children: resolved_cancel_text
7650
7763
  }
7651
7764
  ),
7652
7765
  showActionButton && /* @__PURE__ */ jsxRuntime.jsxs(
@@ -7675,7 +7788,7 @@ function HazoUiDialog({
7675
7788
  style: headerBar ? { color: "var(--dialog-header-bar-fg)" } : finalHeaderTextColor ? { color: finalHeaderTextColor } : void 0,
7676
7789
  children: [
7677
7790
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "h-4 w-4" }),
7678
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "Close" })
7791
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: t11("dialog.close") })
7679
7792
  ]
7680
7793
  }
7681
7794
  )
@@ -7684,7 +7797,7 @@ function HazoUiDialog({
7684
7797
  )
7685
7798
  ] }) });
7686
7799
  }
7687
- var t6 = i18n.createPackageT("hazo_ui", en_default);
7800
+ var t12 = i18n.createPackageT("hazo_ui", en_default);
7688
7801
  function HazoUiConfirmDialog({
7689
7802
  open,
7690
7803
  onOpenChange,
@@ -7693,7 +7806,7 @@ function HazoUiConfirmDialog({
7693
7806
  children,
7694
7807
  variant = "default",
7695
7808
  confirmLabel,
7696
- cancelLabel = t6("confirm.cancel"),
7809
+ cancelLabel = t12("confirm.cancel"),
7697
7810
  showCancelButton = true,
7698
7811
  onConfirm,
7699
7812
  onCancel,
@@ -7742,6 +7855,7 @@ var Slider = React27__namespace.forwardRef(({ className, ...props }, ref) => /*
7742
7855
  }
7743
7856
  ));
7744
7857
  Slider.displayName = SliderPrimitive__namespace.Root.displayName;
7858
+ var t13 = i18n.createPackageT("hazo_ui", en_default);
7745
7859
  async function getCroppedImg(imageSrc, areaPixels, outputSize, quality) {
7746
7860
  const img = await new Promise((resolve, reject) => {
7747
7861
  const image = new Image();
@@ -7787,7 +7901,7 @@ var HazoUiImageCropper = React27__namespace.forwardRef(function HazoUiImageCropp
7787
7901
  onCropped,
7788
7902
  outputSize = 512,
7789
7903
  quality = 0.9,
7790
- zoomLabel = "Zoom",
7904
+ zoomLabel,
7791
7905
  className
7792
7906
  }, ref) {
7793
7907
  const [crop, set_crop] = React27__namespace.useState({
@@ -7795,6 +7909,7 @@ var HazoUiImageCropper = React27__namespace.forwardRef(function HazoUiImageCropp
7795
7909
  y: 0
7796
7910
  });
7797
7911
  const [zoom, set_zoom] = React27__namespace.useState(1);
7912
+ const resolved_zoom_label = zoomLabel ?? t13("cropper.zoom");
7798
7913
  const cropped_area_pixels_ref = React27__namespace.useRef(null);
7799
7914
  const handle_crop_complete = React27__namespace.useCallback(
7800
7915
  (_croppedArea, croppedAreaPixels) => {
@@ -7851,7 +7966,7 @@ var HazoUiImageCropper = React27__namespace.forwardRef(function HazoUiImageCropp
7851
7966
  {
7852
7967
  className: "cls_zoom_label text-sm font-medium text-foreground",
7853
7968
  id: "hazo-cropper-zoom-label",
7854
- children: zoomLabel
7969
+ children: resolved_zoom_label
7855
7970
  }
7856
7971
  ),
7857
7972
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -7869,19 +7984,24 @@ var HazoUiImageCropper = React27__namespace.forwardRef(function HazoUiImageCropp
7869
7984
  ] });
7870
7985
  });
7871
7986
  HazoUiImageCropper.displayName = "HazoUiImageCropper";
7987
+ var t14 = i18n.createPackageT("hazo_ui", en_default);
7872
7988
  function HazoUiImageCropperDialog({
7873
7989
  open,
7874
7990
  onOpenChange,
7875
7991
  file,
7876
7992
  onConfirm,
7877
7993
  onCancel,
7878
- title = "Crop photo",
7879
- confirmLabel = "Save",
7880
- cancelLabel = "Cancel",
7881
- zoomLabel = "Zoom",
7994
+ title,
7995
+ confirmLabel,
7996
+ cancelLabel,
7997
+ zoomLabel,
7882
7998
  outputSize = 512,
7883
7999
  quality = 0.9
7884
8000
  }) {
8001
+ const resolved_title = title ?? t14("cropper.title");
8002
+ const resolved_confirm_label = confirmLabel ?? t14("cropper.save");
8003
+ const resolved_cancel_label = cancelLabel ?? t14("cropper.cancel");
8004
+ const resolved_zoom_label = zoomLabel ?? t14("cropper.zoom");
7885
8005
  const cropper_ref = React27__namespace.useRef(null);
7886
8006
  const [image_src, set_image_src] = React27__namespace.useState(null);
7887
8007
  const [is_confirming, set_is_confirming] = React27__namespace.useState(false);
@@ -7912,9 +8032,9 @@ function HazoUiImageCropperDialog({
7912
8032
  {
7913
8033
  open,
7914
8034
  onOpenChange,
7915
- title,
7916
- actionButtonText: confirmLabel,
7917
- cancelButtonText: cancelLabel,
8035
+ title: resolved_title,
8036
+ actionButtonText: resolved_confirm_label,
8037
+ cancelButtonText: resolved_cancel_label,
7918
8038
  onConfirm: handle_confirm,
7919
8039
  onCancel,
7920
8040
  actionButtonLoading: is_confirming,
@@ -7927,7 +8047,7 @@ function HazoUiImageCropperDialog({
7927
8047
  imageSrc: image_src,
7928
8048
  outputSize,
7929
8049
  quality,
7930
- zoomLabel
8050
+ zoomLabel: resolved_zoom_label
7931
8051
  }
7932
8052
  )
7933
8053
  }
@@ -8367,6 +8487,7 @@ var CardFooter = React27__namespace.forwardRef(
8367
8487
  ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: cn("flex items-center p-6 pt-0", className), ...props })
8368
8488
  );
8369
8489
  CardFooter.displayName = "CardFooter";
8490
+ var t15 = i18n.createPackageT("hazo_ui", en_default);
8370
8491
  function Spinner({ className, size = "md" }) {
8371
8492
  const sizeClasses = { sm: "h-4 w-4", md: "h-8 w-8", lg: "h-12 w-12" };
8372
8493
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -8374,8 +8495,8 @@ function Spinner({ className, size = "md" }) {
8374
8495
  {
8375
8496
  className: cn("animate-spin rounded-full border-2 border-current border-t-transparent text-primary", sizeClasses[size], className),
8376
8497
  role: "status",
8377
- "aria-label": "Loading",
8378
- children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "Loading..." })
8498
+ "aria-label": t15("spinner.loading"),
8499
+ children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: t15("spinner.loading_text") })
8379
8500
  }
8380
8501
  );
8381
8502
  }
@@ -8511,6 +8632,7 @@ var InputAffix = React27__namespace.forwardRef(
8511
8632
  }
8512
8633
  );
8513
8634
  InputAffix.displayName = "InputAffix";
8635
+ var t16 = i18n.createPackageT("hazo_ui", en_default);
8514
8636
  var SkeletonBase = React27__namespace.forwardRef(
8515
8637
  ({ className, ...rest }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
8516
8638
  "div",
@@ -8552,18 +8674,19 @@ function SkeletonRect({ width = "100%", height = 96, radius = 6, className }) {
8552
8674
  }
8553
8675
  );
8554
8676
  }
8555
- function SkeletonGroup({ label = "Loading content", children, className, ...rest }) {
8677
+ function SkeletonGroup({ label, children, className, ...rest }) {
8678
+ const resolved_label = label ?? t16("skeleton.loading_content");
8556
8679
  return /* @__PURE__ */ jsxRuntime.jsxs(
8557
8680
  "div",
8558
8681
  {
8559
8682
  role: "status",
8560
8683
  "aria-busy": "true",
8561
- "aria-label": label,
8684
+ "aria-label": resolved_label,
8562
8685
  className: cn("space-y-2", className),
8563
8686
  ...rest,
8564
8687
  children: [
8565
8688
  children,
8566
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: label })
8689
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: resolved_label })
8567
8690
  ]
8568
8691
  }
8569
8692
  );
@@ -8598,7 +8721,7 @@ function EmptyState({
8598
8721
  }
8599
8722
  );
8600
8723
  }
8601
- var t7 = i18n.createPackageT("hazo_ui", en_default);
8724
+ var t17 = i18n.createPackageT("hazo_ui", en_default);
8602
8725
  function ErrorBanner({
8603
8726
  severity = "error",
8604
8727
  title,
@@ -8633,7 +8756,7 @@ function ErrorBanner({
8633
8756
  {
8634
8757
  type: "button",
8635
8758
  onClick: onDismiss,
8636
- "aria-label": t7("error.dismiss"),
8759
+ "aria-label": t17("error.dismiss"),
8637
8760
  className: "flex-shrink-0 rounded p-1 hover:bg-black/5 focus:outline-none focus:ring-2 focus:ring-offset-2 dark:hover:bg-white/5",
8638
8761
  children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "h-4 w-4", "aria-hidden": "true" })
8639
8762
  }
@@ -8642,9 +8765,9 @@ function ErrorBanner({
8642
8765
  }
8643
8766
  );
8644
8767
  }
8645
- var t8 = i18n.createPackageT("hazo_ui", en_default);
8768
+ var t18 = i18n.createPackageT("hazo_ui", en_default);
8646
8769
  function ErrorPage({
8647
- title = t8("error.something_went_wrong"),
8770
+ title,
8648
8771
  description,
8649
8772
  errorCode,
8650
8773
  correlationId,
@@ -8652,6 +8775,7 @@ function ErrorPage({
8652
8775
  illustration,
8653
8776
  className
8654
8777
  }) {
8778
+ const resolved_title = title ?? t18("error.something_went_wrong");
8655
8779
  return /* @__PURE__ */ jsxRuntime.jsxs(
8656
8780
  "div",
8657
8781
  {
@@ -8664,10 +8788,10 @@ function ErrorPage({
8664
8788
  children: [
8665
8789
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-destructive", children: illustration ?? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.OctagonAlert, { className: "h-16 w-16", "aria-hidden": "true" }) }),
8666
8790
  errorCode ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-full bg-muted px-3 py-1 text-xs font-mono uppercase tracking-wider text-muted-foreground", children: errorCode }) : null,
8667
- /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-2xl font-semibold text-foreground", children: title }),
8791
+ /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-2xl font-semibold text-foreground", children: resolved_title }),
8668
8792
  description ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm text-muted-foreground", children: description }) : null,
8669
8793
  correlationId ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "w-full rounded-md border bg-muted/40 px-3 py-2 text-left", children: [
8670
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-[10px] uppercase tracking-wider text-muted-foreground", children: "Correlation ID" }),
8794
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-[10px] uppercase tracking-wider text-muted-foreground", children: t18("error.correlation_id") }),
8671
8795
  /* @__PURE__ */ jsxRuntime.jsx("code", { className: "break-all text-xs", children: correlationId })
8672
8796
  ] }) : null,
8673
8797
  actions ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-2 flex flex-wrap items-center justify-center gap-2", children: actions }) : null
@@ -8675,16 +8799,17 @@ function ErrorPage({
8675
8799
  }
8676
8800
  );
8677
8801
  }
8678
- var t9 = i18n.createPackageT("hazo_ui", en_default);
8802
+ var t19 = i18n.createPackageT("hazo_ui", en_default);
8679
8803
  function LoadingTimeout({
8680
8804
  active,
8681
8805
  children,
8682
8806
  skeleton,
8683
8807
  onRetry,
8684
8808
  thresholds,
8685
- label = "content",
8809
+ label,
8686
8810
  className
8687
8811
  }) {
8812
+ const resolved_label = label ?? t19("loading.default_label");
8688
8813
  const timeouts = {
8689
8814
  gentle: thresholds?.gentle ?? 5e3,
8690
8815
  firm: thresholds?.firm ?? 15e3,
@@ -8714,15 +8839,15 @@ function LoadingTimeout({
8714
8839
  ErrorBanner,
8715
8840
  {
8716
8841
  severity: "error",
8717
- title: t9("loading.taking_longer"),
8718
- message: `We're still trying to load the ${label}. The connection may be slow.`,
8842
+ title: t19("loading.taking_longer"),
8843
+ message: t19("loading.still_loading", { label: resolved_label }),
8719
8844
  action: onRetry ? /* @__PURE__ */ jsxRuntime.jsx(
8720
8845
  "button",
8721
8846
  {
8722
8847
  type: "button",
8723
8848
  onClick: onRetry,
8724
8849
  className: "rounded bg-foreground/10 px-3 py-1.5 text-sm font-medium hover:bg-foreground/15",
8725
- children: "Try again"
8850
+ children: t19("loading.try_again")
8726
8851
  }
8727
8852
  ) : null
8728
8853
  }
@@ -8730,12 +8855,8 @@ function LoadingTimeout({
8730
8855
  }
8731
8856
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className, role: "status", "aria-busy": "true", "aria-live": "polite", children: [
8732
8857
  skeleton,
8733
- phase === "gentle" ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-3 text-center text-sm text-muted-foreground", children: [
8734
- "Loading ",
8735
- label,
8736
- "\u2026"
8737
- ] }) : null,
8738
- phase === "firm" ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-3 text-center text-sm text-muted-foreground", children: "Still working on it \u2014 almost there." }) : null
8858
+ phase === "gentle" ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-3 text-center text-sm text-muted-foreground", children: t19("loading.gentle_message", { label: resolved_label }) }) : null,
8859
+ phase === "firm" ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-3 text-center text-sm text-muted-foreground", children: t19("loading.firm_message") }) : null
8739
8860
  ] });
8740
8861
  }
8741
8862
  function ProgressiveImage({
@@ -8816,7 +8937,7 @@ function NotificationCountBadge({
8816
8937
  }
8817
8938
  );
8818
8939
  }
8819
- var t10 = i18n.createPackageT("hazo_ui", en_default);
8940
+ var t20 = i18n.createPackageT("hazo_ui", en_default);
8820
8941
  function NotificationItem({
8821
8942
  isRead,
8822
8943
  timestamp,
@@ -8847,7 +8968,7 @@ function NotificationItem({
8847
8968
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "cls_notification_item_dot_col flex-shrink-0 pt-1.5", children: !isRead ? /* @__PURE__ */ jsxRuntime.jsx(
8848
8969
  "span",
8849
8970
  {
8850
- "aria-label": t10("notification.unread"),
8971
+ "aria-label": t20("notification.unread"),
8851
8972
  className: "cls_notification_item_dot block w-2 h-2 rounded-full bg-primary"
8852
8973
  }
8853
8974
  ) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "block w-2 h-2", "aria-hidden": "true" }) }),
@@ -8871,13 +8992,13 @@ function NotificationItem({
8871
8992
  }
8872
8993
  );
8873
8994
  }
8874
- var t11 = i18n.createPackageT("hazo_ui", en_default);
8995
+ var t21 = i18n.createPackageT("hazo_ui", en_default);
8875
8996
  function LoadingSkeletons() {
8876
8997
  return /* @__PURE__ */ jsxRuntime.jsx(
8877
8998
  "div",
8878
8999
  {
8879
9000
  "aria-busy": "true",
8880
- "aria-label": t11("notification.loading"),
9001
+ "aria-label": t21("notification.loading"),
8881
9002
  className: "cls_notification_panel_loading space-y-0",
8882
9003
  children: [0, 1, 2].map((i) => /* @__PURE__ */ jsxRuntime.jsxs(
8883
9004
  "div",
@@ -8936,7 +9057,7 @@ function NotificationPanel({
8936
9057
  }
8937
9058
  );
8938
9059
  }
8939
- var t12 = i18n.createPackageT("hazo_ui", en_default);
9060
+ var t22 = i18n.createPackageT("hazo_ui", en_default);
8940
9061
  function HazoUiToaster({
8941
9062
  position = "bottom-right",
8942
9063
  closeButton = true,
@@ -8982,12 +9103,14 @@ function permissionToast({
8982
9103
  action,
8983
9104
  duration = 5e3
8984
9105
  }) {
8985
- const description = missingPermissions.length === 0 ? t12("toast.permission_denied_message") : `Missing: ${missingPermissions.map((key) => {
8986
- const label = descriptions?.[key];
8987
- return label ? `\`${key}\` \u2014 ${label}` : `\`${key}\``;
8988
- }).join("; ")}`;
9106
+ const description = missingPermissions.length === 0 ? t22("toast.permission_denied_message") : t22("toast.missing_prefix", {
9107
+ items: missingPermissions.map((key) => {
9108
+ const label = descriptions?.[key];
9109
+ return label ? `\`${key}\` \u2014 ${label}` : `\`${key}\``;
9110
+ }).join("; ")
9111
+ });
8989
9112
  return errorToast({
8990
- title: t12("toast.permission_required"),
9113
+ title: t22("toast.permission_required"),
8991
9114
  description,
8992
9115
  action,
8993
9116
  duration
@@ -9245,6 +9368,7 @@ function use_fullscreen() {
9245
9368
  const { isFullscreen, toggle } = useFullscreen(ref);
9246
9369
  return { is_fullscreen: isFullscreen, toggle, ref };
9247
9370
  }
9371
+ var t23 = i18n.createPackageT("hazo_ui", en_default);
9248
9372
  function KanbanCard({
9249
9373
  item,
9250
9374
  renderCard,
@@ -9306,7 +9430,7 @@ function KanbanCard({
9306
9430
  ...listeners,
9307
9431
  role: "button",
9308
9432
  tabIndex: 0,
9309
- "aria-roledescription": "draggable card",
9433
+ "aria-roledescription": t23("kanban.draggable_card"),
9310
9434
  "aria-grabbed": isDragging,
9311
9435
  onDoubleClick: () => {
9312
9436
  if (showEdit && onEditRequest && !dragging) onEditRequest(item);
@@ -9631,6 +9755,7 @@ function KanbanLaneStrip({
9631
9755
  }
9632
9756
  );
9633
9757
  }
9758
+ var t24 = i18n.createPackageT("hazo_ui", en_default);
9634
9759
  var DEFAULT_PRIORITIES = ["P0", "P1", "P2", "P3"];
9635
9760
  function humanize(key) {
9636
9761
  return key.replace(/[_\-]+/g, " ").replace(/([a-z])([A-Z])/g, "$1 $2").replace(/\s+/g, " ").trim().split(" ").map((w) => w ? w[0].toUpperCase() + w.slice(1) : w).join(" ");
@@ -9645,7 +9770,7 @@ function auto_detect_fields(item, columns) {
9645
9770
  }
9646
9771
  }
9647
9772
  if (columns.length > 0) {
9648
- out.push({ key: "columnKey", type: "status", label: "Status" });
9773
+ out.push({ key: "columnKey", type: "status", label: t24("kanban.status_label") });
9649
9774
  }
9650
9775
  return out;
9651
9776
  }
@@ -9742,7 +9867,7 @@ function KanbanEditor({
9742
9867
  isDirty: is_dirty
9743
9868
  };
9744
9869
  const open = item !== null;
9745
- const title = item && titleFn ? titleFn(item) : item ? `Edit ${item.id}` : "";
9870
+ const title = item && titleFn ? titleFn(item) : item ? t24("kanban.edit_fallback", { id: item.id }) : "";
9746
9871
  const priority_var = item?.priority ? `--hazo-kanban-priority-${String(item.priority).toLowerCase()}` : null;
9747
9872
  const header_bar_color = priority_var ? `hsl(var(${priority_var}))` : void 0;
9748
9873
  const use_default_footer = !(renderBody && hideFooter);
@@ -9754,18 +9879,18 @@ function KanbanEditor({
9754
9879
  if (!o && !saving) onClose();
9755
9880
  },
9756
9881
  title,
9757
- description: "Update card details below.",
9882
+ description: t24("kanban.update_description"),
9758
9883
  sizeWidth: "min(90vw, 480px)",
9759
9884
  openAnimation: "none",
9760
9885
  closeAnimation: "none",
9761
9886
  headerBar: !!priority_var,
9762
9887
  headerBarColor: header_bar_color,
9763
9888
  contentClassName: cn("cls_hazo_kanban_editor", priority_var && "pt-0"),
9764
- actionButtonText: saving ? "Saving\u2026" : "Save",
9889
+ actionButtonText: saving ? t24("kanban.saving") : t24("kanban.save"),
9765
9890
  actionButtonIcon: saving ? void 0 : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: "h-4 w-4 mr-2" }),
9766
9891
  actionButtonLoading: saving,
9767
9892
  actionButtonDisabled: !is_dirty || !all_required_filled || saving,
9768
- cancelButtonText: "Cancel",
9893
+ cancelButtonText: t24("kanban.cancel"),
9769
9894
  showCancelButton: true,
9770
9895
  onConfirm: handle_save,
9771
9896
  onCancel: onClose,
@@ -9870,7 +9995,7 @@ function KanbanEditorFieldRow({
9870
9995
  /* @__PURE__ */ jsxRuntime.jsx(SelectTrigger, { id, children: /* @__PURE__ */ jsxRuntime.jsx(
9871
9996
  SelectValue,
9872
9997
  {
9873
- placeholder: field.placeholder ?? `Select ${label}\u2026`
9998
+ placeholder: field.placeholder ?? t24("kanban.select_placeholder", { label })
9874
9999
  }
9875
10000
  ) }),
9876
10001
  /* @__PURE__ */ jsxRuntime.jsx(SelectContent, { children: (field.options ?? []).map((opt) => /* @__PURE__ */ jsxRuntime.jsx(SelectItem, { value: opt, children: opt }, opt)) })
@@ -9886,7 +10011,7 @@ function KanbanEditorFieldRow({
9886
10011
  /* @__PURE__ */ jsxRuntime.jsx(SelectTrigger, { id, children: /* @__PURE__ */ jsxRuntime.jsx(
9887
10012
  SelectValue,
9888
10013
  {
9889
- placeholder: field.placeholder ?? "Select priority\u2026"
10014
+ placeholder: field.placeholder ?? t24("kanban.select_priority")
9890
10015
  }
9891
10016
  ) }),
9892
10017
  /* @__PURE__ */ jsxRuntime.jsx(SelectContent, { children: priorities.map((p) => /* @__PURE__ */ jsxRuntime.jsx(SelectItem, { value: p, children: p }, p)) })
@@ -9902,7 +10027,7 @@ function KanbanEditorFieldRow({
9902
10027
  /* @__PURE__ */ jsxRuntime.jsx(SelectTrigger, { id, children: /* @__PURE__ */ jsxRuntime.jsx(
9903
10028
  SelectValue,
9904
10029
  {
9905
- placeholder: field.placeholder ?? "Select status\u2026"
10030
+ placeholder: field.placeholder ?? t24("kanban.select_status")
9906
10031
  }
9907
10032
  ) }),
9908
10033
  /* @__PURE__ */ jsxRuntime.jsx(SelectContent, { children: columns.map((col) => /* @__PURE__ */ jsxRuntime.jsx(SelectItem, { value: col.key, children: col.title }, col.key)) })
@@ -9911,6 +10036,7 @@ function KanbanEditorFieldRow({
9911
10036
  )
9912
10037
  ] });
9913
10038
  }
10039
+ var t25 = i18n.createPackageT("hazo_ui", en_default);
9914
10040
  var EMPTY_FILTER = {
9915
10041
  search: "",
9916
10042
  categories: [],
@@ -9918,7 +10044,7 @@ var EMPTY_FILTER = {
9918
10044
  };
9919
10045
  function HazoUiKanbanFilter({
9920
10046
  search = true,
9921
- searchPlaceholder = "Search...",
10047
+ searchPlaceholder,
9922
10048
  categories,
9923
10049
  priorities,
9924
10050
  value,
@@ -9926,6 +10052,7 @@ function HazoUiKanbanFilter({
9926
10052
  onChange,
9927
10053
  className
9928
10054
  }) {
10055
+ const resolved_search_placeholder = searchPlaceholder ?? t25("common.search");
9929
10056
  const is_controlled = value !== void 0;
9930
10057
  const [internal, set_internal] = React27__namespace.useState(
9931
10058
  defaultValue ?? EMPTY_FILTER
@@ -9952,7 +10079,7 @@ function HazoUiKanbanFilter({
9952
10079
  {
9953
10080
  value: current.search,
9954
10081
  onChange: (e) => update({ ...current, search: e.target.value }),
9955
- placeholder: searchPlaceholder,
10082
+ placeholder: resolved_search_placeholder,
9956
10083
  className: "cls_hazo_kanban_filter_search w-full sm:w-64"
9957
10084
  }
9958
10085
  ),
@@ -10037,16 +10164,25 @@ function applyKanbanFilter(items, filter) {
10037
10164
  return true;
10038
10165
  });
10039
10166
  }
10167
+ var t26 = i18n.createPackageT("hazo_ui", en_default);
10040
10168
  var UNMATCHED_LANE_KEY = "__hazo_lane_unmatched__";
10041
10169
  function bucket_key(lane_key, column_key) {
10042
10170
  return lane_key == null ? column_key : `${lane_key}\0${column_key}`;
10043
10171
  }
10044
10172
  function default_announcements(itemLabel) {
10045
10173
  return {
10046
- onDragStart: ({ item, fromColumn }) => `Picked up ${itemLabel(item)}. Currently in ${fromColumn}. Use arrow keys to choose a different column. Press space to drop, escape to cancel.`,
10047
- onDragOver: ({ item, overColumn }) => overColumn ? `${itemLabel(item)} over ${overColumn}.` : "",
10048
- onDragEnd: ({ item, fromColumn, toColumn, newIndex }) => fromColumn === toColumn ? `${itemLabel(item)} reordered to position ${newIndex + 1} in ${toColumn}.` : `${itemLabel(item)} dropped in ${toColumn}, position ${newIndex + 1}.`,
10049
- onDragCancel: ({ item, fromColumn }) => `Movement cancelled. ${itemLabel(item)} returned to ${fromColumn}.`
10174
+ onDragStart: ({ item, fromColumn }) => t26("kanban.dnd_pickup", { item: itemLabel(item), column: fromColumn }),
10175
+ onDragOver: ({ item, overColumn }) => overColumn ? t26("kanban.dnd_over", { item: itemLabel(item), column: overColumn }) : "",
10176
+ onDragEnd: ({ item, fromColumn, toColumn, newIndex }) => fromColumn === toColumn ? t26("kanban.dnd_reorder", {
10177
+ item: itemLabel(item),
10178
+ pos: newIndex + 1,
10179
+ column: toColumn
10180
+ }) : t26("kanban.dnd_drop", {
10181
+ item: itemLabel(item),
10182
+ column: toColumn,
10183
+ pos: newIndex + 1
10184
+ }),
10185
+ onDragCancel: ({ item, fromColumn }) => t26("kanban.dnd_cancel", { item: itemLabel(item), column: fromColumn })
10050
10186
  };
10051
10187
  }
10052
10188
  function group_items_by_column(items, overlay, columns, lanes) {
@@ -10850,7 +10986,7 @@ function serializeFilter(filter) {
10850
10986
  const fields = (filter.fields ?? []).map((f) => `${f.field}:${f.operator ?? ""}:${String(f.value)}`).join(",");
10851
10987
  return `${filter.search ?? ""}|${fields}`;
10852
10988
  }
10853
- var t13 = i18n.createPackageT("hazo_ui", en_default);
10989
+ var t27 = i18n.createPackageT("hazo_ui", en_default);
10854
10990
  function HazoUiTable(props) {
10855
10991
  const state = useTableState(props);
10856
10992
  const { columns, rows, getRowKey, className, caption } = props;
@@ -10885,12 +11021,12 @@ function HazoUiTable(props) {
10885
11021
  ) }) : state.serverError != null ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "cls_hazo_ui_table_mobile_error py-6", children: renderErrorState(props.error, state.serverError) }) : state.displayed.length === 0 ? /* @__PURE__ */ jsxRuntime.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__ */ jsxRuntime.jsx(
10886
11022
  EmptyState,
10887
11023
  {
10888
- title: typeof props.empty === "string" && props.empty || t13("table.empty")
11024
+ title: typeof props.empty === "string" && props.empty || t27("table.empty")
10889
11025
  }
10890
11026
  ) : props.empty : typeof props.noResults === "string" || props.noResults === void 0 ? /* @__PURE__ */ jsxRuntime.jsx(
10891
11027
  EmptyState,
10892
11028
  {
10893
- title: typeof props.noResults === "string" && props.noResults || t13("table.no_results")
11029
+ title: typeof props.noResults === "string" && props.noResults || t27("table.no_results")
10894
11030
  }
10895
11031
  ) : props.noResults }) : /* @__PURE__ */ jsxRuntime.jsx(
10896
11032
  TableMobileCards,
@@ -10913,7 +11049,7 @@ function HazoUiTable(props) {
10913
11049
  {
10914
11050
  type: "button",
10915
11051
  onClick: (e) => state.cycleHeaderSort(c.key, e.shiftKey),
10916
- title: t13("table.sort_tooltip"),
11052
+ title: t27("table.sort_tooltip"),
10917
11053
  className: "cls_hazo_ui_table_sort_btn inline-flex items-center gap-1 hover:text-foreground",
10918
11054
  children: [
10919
11055
  /* @__PURE__ */ jsxRuntime.jsx("span", { children: c.label }),
@@ -10945,12 +11081,12 @@ function HazoUiTable(props) {
10945
11081
  children: noActiveFilters(state.filter) && rows.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "cls_hazo_ui_table_empty_wrap py-6", children: typeof props.empty === "string" || props.empty === void 0 ? /* @__PURE__ */ jsxRuntime.jsx(
10946
11082
  EmptyState,
10947
11083
  {
10948
- title: typeof props.empty === "string" && props.empty || t13("table.empty")
11084
+ title: typeof props.empty === "string" && props.empty || t27("table.empty")
10949
11085
  }
10950
11086
  ) : props.empty }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "cls_hazo_ui_table_no_results_wrap py-6", children: typeof props.noResults === "string" || props.noResults === void 0 ? /* @__PURE__ */ jsxRuntime.jsx(
10951
11087
  EmptyState,
10952
11088
  {
10953
- title: typeof props.noResults === "string" && props.noResults || t13("table.no_results")
11089
+ title: typeof props.noResults === "string" && props.noResults || t27("table.no_results")
10954
11090
  }
10955
11091
  ) : props.noResults })
10956
11092
  }
@@ -11064,7 +11200,7 @@ function PaginationFooter({
11064
11200
  const end = Math.min((page + 1) * pageSize, total);
11065
11201
  const lastPage = Math.max(0, Math.ceil(total / pageSize) - 1);
11066
11202
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "cls_hazo_ui_table_pagination flex items-center justify-between gap-3 pt-2 text-sm", children: [
11067
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "cls_hazo_ui_table_page_counter text-muted-foreground", children: t13("table.showing", {
11203
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "cls_hazo_ui_table_page_counter text-muted-foreground", children: t27("table.showing", {
11068
11204
  start: String(start),
11069
11205
  end: String(end),
11070
11206
  total: String(total)
@@ -11077,8 +11213,8 @@ function PaginationFooter({
11077
11213
  size: "sm",
11078
11214
  onClick: () => onPageChange(Math.max(0, page - 1)),
11079
11215
  disabled: page === 0,
11080
- "aria-label": t13("table.prev_aria"),
11081
- children: t13("table.prev")
11216
+ "aria-label": t27("table.prev_aria"),
11217
+ children: t27("table.prev")
11082
11218
  }
11083
11219
  ),
11084
11220
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -11088,8 +11224,8 @@ function PaginationFooter({
11088
11224
  size: "sm",
11089
11225
  onClick: () => onPageChange(Math.min(lastPage, page + 1)),
11090
11226
  disabled: page >= lastPage,
11091
- "aria-label": t13("table.next_aria"),
11092
- children: t13("table.next")
11227
+ "aria-label": t27("table.next_aria"),
11228
+ children: t27("table.next")
11093
11229
  }
11094
11230
  )
11095
11231
  ] })
@@ -11133,7 +11269,7 @@ function Toolbar2(props) {
11133
11269
  setSearchValue(v);
11134
11270
  onSearchChange(v);
11135
11271
  },
11136
- placeholder: searchPlaceholder ?? t13("table.search_placeholder"),
11272
+ placeholder: searchPlaceholder ?? t27("table.search_placeholder"),
11137
11273
  className: "cls_hazo_ui_table_search w-full sm:max-w-xs"
11138
11274
  }
11139
11275
  ) : /* @__PURE__ */ jsxRuntime.jsx("div", {}),
@@ -11181,8 +11317,8 @@ function renderErrorState(error, serverError) {
11181
11317
  return /* @__PURE__ */ jsxRuntime.jsx(
11182
11318
  EmptyState,
11183
11319
  {
11184
- title: t13("table.error_title"),
11185
- description: msg || t13("table.error_description")
11320
+ title: t27("table.error_title"),
11321
+ description: msg || t27("table.error_description")
11186
11322
  }
11187
11323
  );
11188
11324
  }
@@ -11418,18 +11554,20 @@ function StackedBars({
11418
11554
  }
11419
11555
  );
11420
11556
  }
11557
+ var t28 = i18n.createPackageT("hazo_ui", en_default);
11421
11558
  function DateRangeSelector({
11422
11559
  value,
11423
11560
  onChange,
11424
11561
  options,
11425
11562
  className,
11426
- ariaLabel = "Date range"
11563
+ ariaLabel
11427
11564
  }) {
11565
+ const resolved_aria = ariaLabel ?? t28("charts.date_range");
11428
11566
  return /* @__PURE__ */ jsxRuntime.jsx(
11429
11567
  "div",
11430
11568
  {
11431
11569
  role: "group",
11432
- "aria-label": ariaLabel,
11570
+ "aria-label": resolved_aria,
11433
11571
  className: cn(
11434
11572
  "cls_hazo_date_range_selector inline-flex items-center gap-0 rounded-md border bg-background p-0.5",
11435
11573
  className
@@ -11456,6 +11594,7 @@ function DateRangeSelector({
11456
11594
  }
11457
11595
  );
11458
11596
  }
11597
+ var t29 = i18n.createPackageT("hazo_ui", en_default);
11459
11598
  var PAD_LEFT2 = 80;
11460
11599
  var PAD_RIGHT2 = 72;
11461
11600
  var PAD_TOP2 = 12;
@@ -11606,12 +11745,12 @@ function FunnelChart({
11606
11745
  const bubble_anchor_y = bar_y + BAR_H / 2;
11607
11746
  const lines = [
11608
11747
  { text: step.label, accent: true },
11609
- { text: `Total: ${fmt(total)}`, accent: false },
11610
- { text: `% of first: ${pct_first}%`, accent: false }
11748
+ { text: t29("charts.total", { value: fmt(total) }), accent: false },
11749
+ { text: t29("charts.pct_of_first", { pct: pct_first }), accent: false }
11611
11750
  ];
11612
11751
  if (i > 0) {
11613
- lines.push({ text: `% of prev: ${pct_prev}%`, accent: false });
11614
- lines.push({ text: `Drop-off: \u2212${fmt(dropoff)}`, accent: false });
11752
+ lines.push({ text: t29("charts.pct_of_prev", { pct: pct_prev }), accent: false });
11753
+ lines.push({ text: t29("charts.dropoff", { value: fmt(dropoff) }), accent: false });
11615
11754
  }
11616
11755
  if (step.segments) {
11617
11756
  step.segments.forEach((seg) => {
@@ -11672,6 +11811,7 @@ function FunnelChart({
11672
11811
 
11673
11812
  // src/assets/celebration-chime.mp3
11674
11813
  var celebration_chime_default = "data:text/plain;charset=utf-8,";
11814
+ var t30 = i18n.createPackageT("hazo_ui", en_default);
11675
11815
  var CELEBRATION_GRADIENT = "linear-gradient(135deg, #667eea 0%, #764ba2 100%)";
11676
11816
  var CARD_SIZE = 1080;
11677
11817
  var PREVIEW_SIZE = 400;
@@ -11869,7 +12009,7 @@ function CelebrationModalInner({
11869
12009
  {
11870
12010
  className: "cls_celebration_close_btn absolute top-3 right-3 z-10 p-1.5 rounded-full hover:bg-black/10 transition-colors",
11871
12011
  onClick: close_modal,
11872
- "aria-label": "Close celebration",
12012
+ "aria-label": t30("celebration.close"),
11873
12013
  children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "h-4 w-4 text-gray-600" })
11874
12014
  }
11875
12015
  ),
@@ -11932,21 +12072,21 @@ function CelebrationModalInner({
11932
12072
  disabled: is_downloading,
11933
12073
  children: [
11934
12074
  is_downloading ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "h-3.5 w-3.5 mr-1.5 animate-spin" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Download, { className: "h-3.5 w-3.5 mr-1.5" }),
11935
- "Download PNG"
12075
+ t30("celebration.download_png")
11936
12076
  ]
11937
12077
  }
11938
12078
  ),
11939
12079
  can_share && /* @__PURE__ */ jsxRuntime.jsxs(Button, { variant: "outline", size: "sm", onClick: handle_share, children: [
11940
12080
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Share2, { className: "h-3.5 w-3.5 mr-1.5" }),
11941
- "Share"
12081
+ t30("celebration.share")
11942
12082
  ] }),
11943
12083
  /* @__PURE__ */ jsxRuntime.jsxs(Button, { variant: "outline", size: "sm", onClick: handle_copy, children: [
11944
12084
  /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Copy, { className: "h-3.5 w-3.5 mr-1.5" }),
11945
- "Copy image"
12085
+ t30("celebration.copy_image")
11946
12086
  ] })
11947
12087
  ] })
11948
12088
  ] }),
11949
- !shareableCard && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "cls_celebration_footer pb-8", children: /* @__PURE__ */ jsxRuntime.jsx(Button, { size: "sm", onClick: close_modal, children: "Dismiss" }) })
12089
+ !shareableCard && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "cls_celebration_footer pb-8", children: /* @__PURE__ */ jsxRuntime.jsx(Button, { size: "sm", onClick: close_modal, children: t30("celebration.dismiss") }) })
11950
12090
  ]
11951
12091
  }
11952
12092
  )
@@ -11968,8 +12108,8 @@ function computeEta(durationWindow, unitCount, concurrency = 1, fallbackUnitMs =
11968
12108
  }
11969
12109
  function easeToward(elapsed, eta, maxCap = 0.95) {
11970
12110
  if (eta <= 0 || elapsed <= 0) return 0;
11971
- const t14 = elapsed / eta;
11972
- return maxCap * (1 - Math.exp(-1.5 * t14));
12111
+ const t35 = elapsed / eta;
12112
+ return maxCap * (1 - Math.exp(-1.5 * t35));
11973
12113
  }
11974
12114
  function HazoUiProgressBar({
11975
12115
  value,
@@ -12145,13 +12285,16 @@ function upsertEntry(entries, entry) {
12145
12285
  function removeEntry(entries, id) {
12146
12286
  return entries.filter((e) => e.id !== id);
12147
12287
  }
12288
+ var t31 = i18n.createPackageT("hazo_ui", en_default);
12148
12289
  function HazoUiMemoryDropdown({
12149
12290
  history_key,
12150
- placeholder = "Search history\u2026",
12291
+ placeholder,
12151
12292
  on_select,
12152
12293
  add_entry,
12153
- empty_label = "No history yet"
12294
+ empty_label
12154
12295
  }) {
12296
+ const resolved_placeholder = placeholder ?? t31("memory.search_placeholder");
12297
+ const resolved_empty_label = empty_label ?? t31("memory.no_history");
12155
12298
  const { value: stored, setValue } = client$2.useHazoState(history_key, {
12156
12299
  level: "scope",
12157
12300
  fallback: []
@@ -12189,7 +12332,7 @@ function HazoUiMemoryDropdown({
12189
12332
  type: "text",
12190
12333
  value: query,
12191
12334
  onChange: (e) => setQuery(e.target.value),
12192
- placeholder,
12335
+ placeholder: resolved_placeholder,
12193
12336
  style: {
12194
12337
  width: "100%",
12195
12338
  background: "#FFFFFF",
@@ -12219,7 +12362,7 @@ function HazoUiMemoryDropdown({
12219
12362
  fontStyle: "italic",
12220
12363
  fontSize: 13
12221
12364
  },
12222
- children: empty_label
12365
+ children: resolved_empty_label
12223
12366
  }
12224
12367
  ) : filtered.map((entry) => /* @__PURE__ */ jsxRuntime.jsx(
12225
12368
  EntryRow,
@@ -12276,7 +12419,7 @@ function EntryRow({ entry, on_select, onDelete }) {
12276
12419
  onClick: (e) => onDelete(entry.id, e),
12277
12420
  onMouseEnter: () => setDeleteHovered(true),
12278
12421
  onMouseLeave: () => setDeleteHovered(false),
12279
- "aria-label": `Remove ${entry.label} from history`,
12422
+ "aria-label": t31("memory.remove_aria", { label: entry.label }),
12280
12423
  style: {
12281
12424
  flexShrink: 0,
12282
12425
  background: "none",
@@ -12295,6 +12438,7 @@ function EntryRow({ entry, on_select, onDelete }) {
12295
12438
  }
12296
12439
  );
12297
12440
  }
12441
+ var t32 = i18n.createPackageT("hazo_ui", en_default);
12298
12442
  function Logo({
12299
12443
  logoUrl,
12300
12444
  logoUrlDark,
@@ -12304,7 +12448,7 @@ function Logo({
12304
12448
  className,
12305
12449
  imgClassName
12306
12450
  }) {
12307
- const alt = appTitle ?? "Logo";
12451
+ const alt = appTitle ?? t32("app_logo.alt_fallback");
12308
12452
  let content = null;
12309
12453
  if (logoUrl) {
12310
12454
  content = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
@@ -12339,11 +12483,12 @@ function Logo({
12339
12483
  }
12340
12484
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("inline-flex items-center gap-2", className), children: content });
12341
12485
  }
12486
+ var t33 = i18n.createPackageT("hazo_ui", en_default);
12342
12487
  function AppHeader({ identity, homeHref, navItems, actions, className }) {
12343
12488
  return /* @__PURE__ */ jsxRuntime.jsxs(
12344
12489
  "header",
12345
12490
  {
12346
- "aria-label": "Application header",
12491
+ "aria-label": t33("app_header.aria_label"),
12347
12492
  className: cn(
12348
12493
  "flex w-full items-center justify-between gap-4 border-b bg-navbar text-navbar-fg border-navbar-border px-4 py-2.5",
12349
12494
  className
@@ -12851,6 +12996,7 @@ function HazoBrowserTab({
12851
12996
  }
12852
12997
  );
12853
12998
  }
12999
+ var t34 = i18n.createPackageT("hazo_ui", en_default);
12854
13000
  var native_name_cache = /* @__PURE__ */ new Map();
12855
13001
  function get_native_name(code) {
12856
13002
  const cached = native_name_cache.get(code);
@@ -12922,9 +13068,10 @@ function LocalePicker({
12922
13068
  flags = false,
12923
13069
  alternates,
12924
13070
  activeLocale,
12925
- triggerLabel = "Change language",
13071
+ triggerLabel,
12926
13072
  className
12927
13073
  }) {
13074
+ const resolved_trigger_label = triggerLabel ?? t34("locale_picker.change_language");
12928
13075
  const options = React27__namespace.useMemo(() => {
12929
13076
  return Object.entries(alternates ?? {}).map(([code, url]) => {
12930
13077
  const href = safeHref(url);
@@ -12939,7 +13086,7 @@ function LocalePicker({
12939
13086
  return /* @__PURE__ */ jsxRuntime.jsx(
12940
13087
  "nav",
12941
13088
  {
12942
- "aria-label": triggerLabel,
13089
+ "aria-label": resolved_trigger_label,
12943
13090
  className: cn("cls_locale_picker_inline flex items-center gap-1", className),
12944
13091
  children: options.map((opt) => /* @__PURE__ */ jsxRuntime.jsxs(
12945
13092
  "a",
@@ -12969,7 +13116,7 @@ function LocalePicker({
12969
13116
  variant: "outline",
12970
13117
  size: "sm",
12971
13118
  lang: activeLocale,
12972
- "aria-label": triggerLabel,
13119
+ "aria-label": resolved_trigger_label,
12973
13120
  className: cn("cls_locale_picker_trigger gap-1.5", className),
12974
13121
  children: [
12975
13122
  flags && /* @__PURE__ */ jsxRuntime.jsx(FlagIcon, { code: active_option?.code ?? options[0].code }),