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.js CHANGED
@@ -112,8 +112,8 @@ var require_extends = __commonJS({
112
112
  function _extends11() {
113
113
  return module.exports = _extends11 = Object.assign ? Object.assign.bind() : function(n) {
114
114
  for (var e = 1; e < arguments.length; e++) {
115
- var t14 = arguments[e];
116
- for (var r in t14) ({}).hasOwnProperty.call(t14, r) && (n[r] = t14[r]);
115
+ var t35 = arguments[e];
116
+ for (var r in t35) ({}).hasOwnProperty.call(t35, r) && (n[r] = t35[r]);
117
117
  }
118
118
  return n;
119
119
  }, module.exports.__esModule = true, module.exports["default"] = module.exports, _extends11.apply(null, arguments);
@@ -127,12 +127,12 @@ var require_objectWithoutPropertiesLoose = __commonJS({
127
127
  "../node_modules/@babel/runtime/helpers/objectWithoutPropertiesLoose.js"(exports, module) {
128
128
  function _objectWithoutPropertiesLoose10(r, e) {
129
129
  if (null == r) return {};
130
- var t14 = {};
130
+ var t35 = {};
131
131
  for (var n in r) if ({}.hasOwnProperty.call(r, n)) {
132
132
  if (-1 !== e.indexOf(n)) continue;
133
- t14[n] = r[n];
133
+ t35[n] = r[n];
134
134
  }
135
- return t14;
135
+ return t35;
136
136
  }
137
137
  module.exports = _objectWithoutPropertiesLoose10, module.exports.__esModule = true, module.exports["default"] = module.exports;
138
138
  }
@@ -747,7 +747,112 @@ var en_default = {
747
747
  "icon_picker.search_placeholder": "Search icons...",
748
748
  "common.loading": "Loading...",
749
749
  "common.cancel": "Cancel",
750
- "common.search": "Search..."
750
+ "common.search": "Search...",
751
+ "dialog.default_title": "Action required",
752
+ "dialog.cancel": "Cancel",
753
+ "dialog.ok": "OK",
754
+ "dialog.confirm": "Confirm",
755
+ "dialog.close": "Close",
756
+ "kanban.status_label": "Status",
757
+ "kanban.edit_fallback": "Edit {{id}}",
758
+ "kanban.update_description": "Update card details below.",
759
+ "kanban.saving": "Saving\u2026",
760
+ "kanban.save": "Save",
761
+ "kanban.cancel": "Cancel",
762
+ "kanban.select_placeholder": "Select {{label}}\u2026",
763
+ "kanban.select_priority": "Select priority\u2026",
764
+ "kanban.select_status": "Select status\u2026",
765
+ "markdown.placeholder": "Write in Markdown\u2026",
766
+ "markdown.upload_failed": "Upload failed.",
767
+ "markdown.loading_editor": "Loading editor\u2026",
768
+ "markdown.uploading_image": "Uploading image\u2026",
769
+ "cropper.title": "Crop photo",
770
+ "cropper.save": "Save",
771
+ "cropper.cancel": "Cancel",
772
+ "cropper.zoom": "Zoom",
773
+ "memory.search_placeholder": "Search history\u2026",
774
+ "memory.no_history": "No history yet",
775
+ "memory.remove_aria": "Remove {{label}} from history",
776
+ "celebration.close": "Close celebration",
777
+ "celebration.download_png": "Download PNG",
778
+ "celebration.share": "Share",
779
+ "celebration.copy_image": "Copy image",
780
+ "celebration.dismiss": "Dismiss",
781
+ "charts.date_range": "Date range",
782
+ "flex_input.must_be_valid_number": "Must be a valid number",
783
+ "flex_input.max_decimals": "Maximum {{count}} decimal places allowed",
784
+ "flex_input.min_value": "Must be at least {{min}}",
785
+ "flex_input.max_value": "Must be at most {{max}}",
786
+ "flex_input.alpha_only": "Only letters, numbers, and spaces are allowed",
787
+ "flex_input.must_be_valid_email": "Must be a valid email address",
788
+ "flex_input.min_characters": "Must be at least {{min}} characters",
789
+ "flex_input.max_characters": "Must be at most {{max}} characters",
790
+ "flex_input.invalid_format": "Invalid format",
791
+ "flex_input.invalid_input": "Invalid input",
792
+ "textbox.placeholder": "Type here...",
793
+ "textarea.placeholder": "Type here...",
794
+ "common.remove": "Remove",
795
+ "locale_picker.change_language": "Change language",
796
+ "app_logo.alt_fallback": "Logo",
797
+ "app_header.aria_label": "Application header",
798
+ "skeleton.loading_content": "Loading content",
799
+ "spinner.loading": "Loading",
800
+ "spinner.loading_text": "Loading...",
801
+ "rte.update_link": "Update Link",
802
+ "rte.add_link": "Add Link",
803
+ "rte.remove_link": "Remove",
804
+ "rte.select_size": "Select size",
805
+ "rte.custom_size": "Custom size",
806
+ "rte.insert_table": "Insert",
807
+ "rte.search_variables": "Search variables...",
808
+ "rte.no_variables": "No variables found.",
809
+ "rte.table_operations": "Table Operations",
810
+ "rte.add_row_above": "Add row above",
811
+ "rte.add_row_below": "Add row below",
812
+ "rte.add_col_left": "Add col left",
813
+ "rte.add_col_right": "Add col right",
814
+ "rte.delete_row": "Delete row",
815
+ "rte.delete_col": "Delete col",
816
+ "rte.delete_table": "Delete table",
817
+ "rte.insert_table_heading": "Insert Table",
818
+ "rte.placeholder": "Start typing...",
819
+ "sort.asc": "Asc",
820
+ "sort.desc": "Desc",
821
+ "sort.reorder_aria": "Reorder {{field}}",
822
+ "sort.priority_aria": "Sort priority {{n}}",
823
+ "sort.direction_aria": "Sort direction for {{field}}",
824
+ "sort.remove_aria": "Remove {{field}} from sort",
825
+ "sort.active_sorts": "Active sorts",
826
+ "sort.no_active_sorts": "No active sorts",
827
+ "sort.button_label": "Sort",
828
+ "sort.empty_message": "No sort fields yet. Add one below to start ordering rows.",
829
+ "sort.all_fields_added": "All fields added",
830
+ "sort.add_sort_field": "Add sort field",
831
+ "sort.no_fields_available": "No fields available.",
832
+ "kanban.dnd_pickup": "Picked up {{item}}. Currently in {{column}}. Use arrow keys to choose a different column. Press space to drop, escape to cancel.",
833
+ "kanban.dnd_over": "{{item}} over {{column}}.",
834
+ "kanban.dnd_drop": "{{item}} dropped in {{column}}, position {{pos}}.",
835
+ "kanban.dnd_reorder": "{{item}} reordered to position {{pos}} in {{column}}.",
836
+ "kanban.dnd_cancel": "Movement cancelled. {{item}} returned to {{column}}.",
837
+ "kanban.draggable_card": "draggable card",
838
+ "loading.still_loading": "We're still trying to load the {{label}}. The connection may be slow.",
839
+ "loading.try_again": "Try again",
840
+ "loading.gentle_message": "Loading {{label}}\u2026",
841
+ "loading.default_label": "content",
842
+ "loading.firm_message": "Still working on it \u2014 almost there.",
843
+ "icon_picker.emoji_tab": "Emoji",
844
+ "icon_picker.tools_group": "Tools",
845
+ "icon_picker.home_group": "Home",
846
+ "icon_picker.weather_group": "Weather",
847
+ "icon_picker.nature_group": "Nature",
848
+ "icon_picker.symbols_group": "Symbols",
849
+ "icon_picker.no_results": "No icons found",
850
+ "error.correlation_id": "Correlation ID",
851
+ "charts.total": "Total: {{value}}",
852
+ "charts.pct_of_first": "% of first: {{pct}}%",
853
+ "charts.pct_of_prev": "% of prev: {{pct}}%",
854
+ "charts.dropoff": "Drop-off: \u2212{{value}}",
855
+ "toast.missing_prefix": "Missing: {{items}}"
751
856
  };
752
857
  var t = createPackageT("hazo_ui", en_default);
753
858
  function FilterFieldItem({
@@ -1235,7 +1340,7 @@ function SortableSortFieldItem({
1235
1340
  ...attributes,
1236
1341
  ...listeners,
1237
1342
  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",
1238
- "aria-label": `Reorder ${fieldLabel}`,
1343
+ "aria-label": t2("sort.reorder_aria", { field: fieldLabel }),
1239
1344
  children: /* @__PURE__ */ jsx(GripVertical, { className: "cls_drag_icon h-4 w-4" })
1240
1345
  }
1241
1346
  ),
@@ -1243,7 +1348,7 @@ function SortableSortFieldItem({
1243
1348
  "span",
1244
1349
  {
1245
1350
  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",
1246
- "aria-label": `Sort priority ${priority}`,
1351
+ "aria-label": t2("sort.priority_aria", { n: priority }),
1247
1352
  children: priority
1248
1353
  }
1249
1354
  ),
@@ -1252,7 +1357,7 @@ function SortableSortFieldItem({
1252
1357
  "div",
1253
1358
  {
1254
1359
  role: "radiogroup",
1255
- "aria-label": `Sort direction for ${fieldLabel}`,
1360
+ "aria-label": t2("sort.direction_aria", { field: fieldLabel }),
1256
1361
  className: "cls_direction_control inline-flex shrink-0 items-center rounded-md border border-border/70 bg-muted/40 p-0.5",
1257
1362
  children: [
1258
1363
  /* @__PURE__ */ jsxs(
@@ -1266,7 +1371,7 @@ function SortableSortFieldItem({
1266
1371
  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",
1267
1372
  children: [
1268
1373
  /* @__PURE__ */ jsx(ArrowUp, { className: "h-3 w-3" }),
1269
- "Asc"
1374
+ t2("sort.asc")
1270
1375
  ]
1271
1376
  }
1272
1377
  ),
@@ -1281,7 +1386,7 @@ function SortableSortFieldItem({
1281
1386
  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",
1282
1387
  children: [
1283
1388
  /* @__PURE__ */ jsx(ArrowDown, { className: "h-3 w-3" }),
1284
- "Desc"
1389
+ t2("sort.desc")
1285
1390
  ]
1286
1391
  }
1287
1392
  )
@@ -1295,7 +1400,7 @@ function SortableSortFieldItem({
1295
1400
  size: "sm",
1296
1401
  onClick: onDelete,
1297
1402
  className: "cls_delete_btn h-7 w-7 shrink-0 p-0 text-muted-foreground/60 hover:bg-destructive/10 hover:text-destructive",
1298
- "aria-label": `Remove ${fieldLabel} from sort`,
1403
+ "aria-label": t2("sort.remove_aria", { field: fieldLabel }),
1299
1404
  children: /* @__PURE__ */ jsx(X, { className: "cls_delete_icon h-3.5 w-3.5" })
1300
1405
  }
1301
1406
  )
@@ -1408,16 +1513,16 @@ function HazoUiMultiSortDialog({
1408
1513
  };
1409
1514
  const hasActiveSorts = initialSortFields.length > 0;
1410
1515
  const tooltipContent = hasActiveSorts ? /* @__PURE__ */ jsxs("div", { className: "cls_sort_tooltip_content space-y-1", children: [
1411
- /* @__PURE__ */ jsx("div", { className: "cls_tooltip_title text-xs font-semibold mb-1", children: "Active sorts" }),
1516
+ /* @__PURE__ */ jsx("div", { className: "cls_tooltip_title text-xs font-semibold mb-1", children: t2("sort.active_sorts") }),
1412
1517
  initialSortFields.map((sortConfig, index) => /* @__PURE__ */ jsxs("div", { className: "cls_tooltip_item text-xs", children: [
1413
1518
  index + 1,
1414
1519
  ". ",
1415
1520
  getFieldLabel(sortConfig.field),
1416
1521
  " (",
1417
- sortConfig.direction === "asc" ? "Asc" : "Desc",
1522
+ sortConfig.direction === "asc" ? t2("sort.asc") : t2("sort.desc"),
1418
1523
  ")"
1419
1524
  ] }, sortConfig.field))
1420
- ] }) : /* @__PURE__ */ jsx("div", { className: "cls_sort_tooltip_content text-xs", children: "No active sorts" });
1525
+ ] }) : /* @__PURE__ */ jsx("div", { className: "cls_sort_tooltip_content text-xs", children: t2("sort.no_active_sorts") });
1421
1526
  return /* @__PURE__ */ jsxs(Dialog, { open: isOpen, onOpenChange: setIsOpen, children: [
1422
1527
  /* @__PURE__ */ jsx(TooltipProvider, { children: /* @__PURE__ */ jsxs(Tooltip, { children: [
1423
1528
  /* @__PURE__ */ jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx(DialogTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
@@ -1437,7 +1542,7 @@ function HazoUiMultiSortDialog({
1437
1542
  )
1438
1543
  }
1439
1544
  ),
1440
- "Sort",
1545
+ t2("sort.button_label"),
1441
1546
  hasActiveSorts && /* @__PURE__ */ 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 })
1442
1547
  ]
1443
1548
  }
@@ -1482,7 +1587,7 @@ function HazoUiMultiSortDialog({
1482
1587
  }
1483
1588
  )
1484
1589
  }
1485
- ) }) : /* @__PURE__ */ 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." }),
1590
+ ) }) : /* @__PURE__ */ 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") }),
1486
1591
  /* @__PURE__ */ jsx("div", { className: "cls_add_field_section", children: /* @__PURE__ */ jsxs(Popover, { open: isComboboxOpen, onOpenChange: setIsComboboxOpen, children: [
1487
1592
  /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
1488
1593
  Button,
@@ -1494,13 +1599,13 @@ function HazoUiMultiSortDialog({
1494
1599
  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",
1495
1600
  children: [
1496
1601
  /* @__PURE__ */ jsx(Plus, { className: "cls_plus_icon h-4 w-4" }),
1497
- /* @__PURE__ */ jsx("span", { children: availableFieldsToAdd.length === 0 ? "All fields added" : "Add sort field" })
1602
+ /* @__PURE__ */ jsx("span", { children: availableFieldsToAdd.length === 0 ? t2("sort.all_fields_added") : t2("sort.add_sort_field") })
1498
1603
  ]
1499
1604
  }
1500
1605
  ) }),
1501
1606
  /* @__PURE__ */ jsx(PopoverContent, { className: "cls_combobox_popover w-[var(--radix-popover-trigger-width)] p-0", align: "start", children: /* @__PURE__ */ jsxs(Command, { children: [
1502
1607
  /* @__PURE__ */ jsx(CommandInput, { placeholder: t2("sort.search_fields"), className: "cls_command_input" }),
1503
- /* @__PURE__ */ jsx(CommandList, { children: availableFieldsToAdd.length === 0 ? /* @__PURE__ */ jsx(CommandEmpty, { children: "No fields available." }) : /* @__PURE__ */ jsx(CommandGroup, { children: availableFieldsToAdd.map((field) => /* @__PURE__ */ jsx(
1608
+ /* @__PURE__ */ jsx(CommandList, { children: availableFieldsToAdd.length === 0 ? /* @__PURE__ */ jsx(CommandEmpty, { children: t2("sort.no_fields_available") }) : /* @__PURE__ */ jsx(CommandGroup, { children: availableFieldsToAdd.map((field) => /* @__PURE__ */ jsx(
1504
1609
  CommandItem,
1505
1610
  {
1506
1611
  value: field.label,
@@ -2036,11 +2141,11 @@ var SYMBOLS_ICONS = [
2036
2141
  "Wrench"
2037
2142
  ];
2038
2143
  var LUCIDE_GROUPS = [
2039
- { key: "tools", label: "Tools", icons: TOOLS_ICONS },
2040
- { key: "home", label: "Home", icons: HOME_ICONS },
2041
- { key: "weather", label: "Weather", icons: WEATHER_ICONS },
2042
- { key: "nature", label: "Nature", icons: NATURE_ICONS },
2043
- { key: "symbols", label: "Symbols", icons: SYMBOLS_ICONS }
2144
+ { key: "tools", label_key: "icon_picker.tools_group", icons: TOOLS_ICONS },
2145
+ { key: "home", label_key: "icon_picker.home_group", icons: HOME_ICONS },
2146
+ { key: "weather", label_key: "icon_picker.weather_group", icons: WEATHER_ICONS },
2147
+ { key: "nature", label_key: "icon_picker.nature_group", icons: NATURE_ICONS },
2148
+ { key: "symbols", label_key: "icon_picker.symbols_group", icons: SYMBOLS_ICONS }
2044
2149
  ];
2045
2150
  var EMOJI_ITEMS = [
2046
2151
  // Faces
@@ -2253,11 +2358,11 @@ function HazoUiIconPicker({
2253
2358
  name
2254
2359
  );
2255
2360
  }),
2256
- filtered_search_results.length === 0 && /* @__PURE__ */ jsx("p", { className: "col-span-8 py-4 text-center text-sm text-muted-foreground", children: "No icons found" })
2361
+ filtered_search_results.length === 0 && /* @__PURE__ */ jsx("p", { className: "col-span-8 py-4 text-center text-sm text-muted-foreground", children: t3("icon_picker.no_results") })
2257
2362
  ] }) : /* @__PURE__ */ jsxs(Tabs, { defaultValue: "emoji", children: [
2258
2363
  /* @__PURE__ */ jsxs(TabsList, { className: "grid w-full grid-cols-6", children: [
2259
- /* @__PURE__ */ jsx(TabsTrigger, { value: "emoji", children: "Emoji" }),
2260
- LUCIDE_GROUPS.map((group) => /* @__PURE__ */ jsx(TabsTrigger, { value: group.key, children: group.label }, group.key))
2364
+ /* @__PURE__ */ jsx(TabsTrigger, { value: "emoji", children: t3("icon_picker.emoji_tab") }),
2365
+ LUCIDE_GROUPS.map((group) => /* @__PURE__ */ jsx(TabsTrigger, { value: group.key, children: t3(group.label_key) }, group.key))
2261
2366
  ] }),
2262
2367
  /* @__PURE__ */ jsx(TabsContent, { value: "emoji", children: /* @__PURE__ */ jsx("div", { className: "grid max-h-56 grid-cols-8 gap-1 overflow-y-auto", children: EMOJI_ITEMS.map((emoji, index) => /* @__PURE__ */ jsx(
2263
2368
  "button",
@@ -2289,6 +2394,7 @@ function HazoUiIconPicker({
2289
2394
  }
2290
2395
  ) });
2291
2396
  }
2397
+ var t4 = createPackageT("hazo_ui", en_default);
2292
2398
  function validateInput(value, input_type, text_len_min, text_len_max, num_min, num_max, regex, num_decimals) {
2293
2399
  if (value === "") {
2294
2400
  return { isValid: true };
@@ -2297,36 +2403,36 @@ function validateInput(value, input_type, text_len_min, text_len_max, num_min, n
2297
2403
  case "numeric": {
2298
2404
  const numValue = parseFloat(value);
2299
2405
  if (isNaN(numValue)) {
2300
- return { isValid: false, errorMessage: "Must be a valid number" };
2406
+ return { isValid: false, errorMessage: t4("flex_input.must_be_valid_number") };
2301
2407
  }
2302
2408
  if (num_decimals !== void 0) {
2303
2409
  const decimalPlaces = value.split(".")[1]?.length || 0;
2304
2410
  if (decimalPlaces > num_decimals) {
2305
2411
  return {
2306
2412
  isValid: false,
2307
- errorMessage: `Maximum ${num_decimals} decimal place${num_decimals !== 1 ? "s" : ""} allowed`
2413
+ errorMessage: t4("flex_input.max_decimals", { count: num_decimals })
2308
2414
  };
2309
2415
  }
2310
2416
  }
2311
2417
  if (num_min !== void 0 && numValue < num_min) {
2312
- return { isValid: false, errorMessage: `Must be at least ${num_min}` };
2418
+ return { isValid: false, errorMessage: t4("flex_input.min_value", { min: num_min }) };
2313
2419
  }
2314
2420
  if (num_max !== void 0 && numValue > num_max) {
2315
- return { isValid: false, errorMessage: `Must be at most ${num_max}` };
2421
+ return { isValid: false, errorMessage: t4("flex_input.max_value", { max: num_max }) };
2316
2422
  }
2317
2423
  break;
2318
2424
  }
2319
2425
  case "alpha": {
2320
2426
  const alphaRegex = /^[A-Za-z0-9\s]*$/;
2321
2427
  if (!alphaRegex.test(value)) {
2322
- return { isValid: false, errorMessage: "Only letters, numbers, and spaces are allowed" };
2428
+ return { isValid: false, errorMessage: t4("flex_input.alpha_only") };
2323
2429
  }
2324
2430
  break;
2325
2431
  }
2326
2432
  case "email": {
2327
2433
  const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
2328
2434
  if (!emailRegex.test(value)) {
2329
- return { isValid: false, errorMessage: "Must be a valid email address" };
2435
+ return { isValid: false, errorMessage: t4("flex_input.must_be_valid_email") };
2330
2436
  }
2331
2437
  break;
2332
2438
  }
@@ -2334,13 +2440,13 @@ function validateInput(value, input_type, text_len_min, text_len_max, num_min, n
2334
2440
  if (text_len_min !== void 0 && value.length < text_len_min) {
2335
2441
  return {
2336
2442
  isValid: false,
2337
- errorMessage: `Must be at least ${text_len_min} character${text_len_min !== 1 ? "s" : ""}`
2443
+ errorMessage: t4("flex_input.min_characters", { min: text_len_min })
2338
2444
  };
2339
2445
  }
2340
2446
  if (text_len_max !== void 0 && value.length > text_len_max) {
2341
2447
  return {
2342
2448
  isValid: false,
2343
- errorMessage: `Must be at most ${text_len_max} character${text_len_max !== 1 ? "s" : ""}`
2449
+ errorMessage: t4("flex_input.max_characters", { max: text_len_max })
2344
2450
  };
2345
2451
  }
2346
2452
  break;
@@ -2349,7 +2455,7 @@ function validateInput(value, input_type, text_len_min, text_len_max, num_min, n
2349
2455
  if (regex) {
2350
2456
  const regexPattern = typeof regex === "string" ? new RegExp(regex) : regex;
2351
2457
  if (!regexPattern.test(value)) {
2352
- return { isValid: false, errorMessage: "Invalid format" };
2458
+ return { isValid: false, errorMessage: t4("flex_input.invalid_format") };
2353
2459
  }
2354
2460
  }
2355
2461
  return { isValid: true };
@@ -2445,7 +2551,7 @@ var HazoUiFlexInput = React27.forwardRef(
2445
2551
  num_decimals
2446
2552
  );
2447
2553
  if (!validation.isValid) {
2448
- setErrorMessage(validation.errorMessage || format_guide || "Invalid input");
2554
+ setErrorMessage(validation.errorMessage || format_guide || t4("flex_input.invalid_input"));
2449
2555
  } else {
2450
2556
  setErrorMessage(void 0);
2451
2557
  }
@@ -3675,10 +3781,10 @@ var BLOCK_TYPE_LABEL_KEYS = {
3675
3781
  "code-block": "rte.block_type.code_block",
3676
3782
  blockquote: "rte.block_type.blockquote"
3677
3783
  };
3678
- function get_translated_block_types(t14) {
3784
+ function get_translated_block_types(t35) {
3679
3785
  return BLOCK_TYPES.map((type) => ({
3680
3786
  ...type,
3681
- label: t14(BLOCK_TYPE_LABEL_KEYS[type.value])
3787
+ label: t35(BLOCK_TYPE_LABEL_KEYS[type.value])
3682
3788
  }));
3683
3789
  }
3684
3790
 
@@ -3725,7 +3831,7 @@ function get_file_extension(filename) {
3725
3831
  function is_image_file(mime_type) {
3726
3832
  return mime_type.startsWith("image/");
3727
3833
  }
3728
- var t4 = createPackageT("hazo_ui", en_default);
3834
+ var t5 = createPackageT("hazo_ui", en_default);
3729
3835
  var ALL_ON = {
3730
3836
  undo_redo: true,
3731
3837
  block_type: true,
@@ -3780,7 +3886,7 @@ var Toolbar = ({
3780
3886
  }
3781
3887
  const tb = { ...ALL_ON, ...toolbar };
3782
3888
  const font_family_options = font_families && font_families.length > 0 ? font_families : FONT_FAMILIES;
3783
- const block_type_options = get_translated_block_types(t4);
3889
+ const block_type_options = get_translated_block_types(t5);
3784
3890
  const get_current_font_size = () => {
3785
3891
  const attrs = editor.getAttributes("textStyle");
3786
3892
  return attrs.fontSize || FONT_SIZE_CONFIG.default;
@@ -3924,7 +4030,7 @@ var Toolbar = ({
3924
4030
  {
3925
4031
  onClick: () => editor.chain().focus().undo().run(),
3926
4032
  disabled: !editor.can().undo(),
3927
- tooltip: t4("rte.undo"),
4033
+ tooltip: t5("rte.undo"),
3928
4034
  children: /* @__PURE__ */ jsx(LuUndo2, { className: "h-4 w-4" })
3929
4035
  },
3930
4036
  "undo"
@@ -3934,7 +4040,7 @@ var Toolbar = ({
3934
4040
  {
3935
4041
  onClick: () => editor.chain().focus().redo().run(),
3936
4042
  disabled: !editor.can().redo(),
3937
- tooltip: t4("rte.redo"),
4043
+ tooltip: t5("rte.redo"),
3938
4044
  children: /* @__PURE__ */ jsx(LuRedo2, { className: "h-4 w-4" })
3939
4045
  },
3940
4046
  "redo"
@@ -3975,7 +4081,7 @@ var Toolbar = ({
3975
4081
  ToolbarButton,
3976
4082
  {
3977
4083
  onClick: () => handle_font_size_change(-2),
3978
- tooltip: t4("rte.decrease_font_size"),
4084
+ tooltip: t5("rte.decrease_font_size"),
3979
4085
  children: /* @__PURE__ */ jsx(LuMinus, { className: "h-3 w-3" })
3980
4086
  }
3981
4087
  ),
@@ -3984,7 +4090,7 @@ var Toolbar = ({
3984
4090
  ToolbarButton,
3985
4091
  {
3986
4092
  onClick: () => handle_font_size_change(FONT_SIZE_CONFIG.step),
3987
- tooltip: t4("rte.increase_font_size"),
4093
+ tooltip: t5("rte.increase_font_size"),
3988
4094
  children: /* @__PURE__ */ jsx(LuPlus, { className: "h-3 w-3" })
3989
4095
  }
3990
4096
  )
@@ -4002,7 +4108,7 @@ var Toolbar = ({
4002
4108
  {
4003
4109
  onClick: () => editor.chain().focus().toggleBold().run(),
4004
4110
  is_active: editor.isActive("bold"),
4005
- tooltip: t4("rte.bold"),
4111
+ tooltip: t5("rte.bold"),
4006
4112
  children: /* @__PURE__ */ jsx(LuBold, { className: "h-4 w-4" })
4007
4113
  },
4008
4114
  "bold"
@@ -4016,7 +4122,7 @@ var Toolbar = ({
4016
4122
  {
4017
4123
  onClick: () => editor.chain().focus().toggleItalic().run(),
4018
4124
  is_active: editor.isActive("italic"),
4019
- tooltip: t4("rte.italic"),
4125
+ tooltip: t5("rte.italic"),
4020
4126
  children: /* @__PURE__ */ jsx(LuItalic, { className: "h-4 w-4" })
4021
4127
  },
4022
4128
  "italic"
@@ -4030,7 +4136,7 @@ var Toolbar = ({
4030
4136
  {
4031
4137
  onClick: () => editor.chain().focus().toggleUnderline().run(),
4032
4138
  is_active: editor.isActive("underline"),
4033
- tooltip: t4("rte.underline"),
4139
+ tooltip: t5("rte.underline"),
4034
4140
  children: /* @__PURE__ */ jsx(LuUnderline, { className: "h-4 w-4" })
4035
4141
  },
4036
4142
  "underline"
@@ -4044,7 +4150,7 @@ var Toolbar = ({
4044
4150
  {
4045
4151
  onClick: () => editor.chain().focus().toggleStrike().run(),
4046
4152
  is_active: editor.isActive("strike"),
4047
- tooltip: t4("rte.strikethrough"),
4153
+ tooltip: t5("rte.strikethrough"),
4048
4154
  children: /* @__PURE__ */ jsx(LuStrikethrough, { className: "h-4 w-4" })
4049
4155
  },
4050
4156
  "strike"
@@ -4058,7 +4164,7 @@ var Toolbar = ({
4058
4164
  {
4059
4165
  onClick: () => editor.chain().focus().toggleSubscript().run(),
4060
4166
  is_active: editor.isActive("subscript"),
4061
- tooltip: t4("rte.subscript"),
4167
+ tooltip: t5("rte.subscript"),
4062
4168
  children: /* @__PURE__ */ jsx(LuSubscript, { className: "h-4 w-4" })
4063
4169
  },
4064
4170
  "sub"
@@ -4072,7 +4178,7 @@ var Toolbar = ({
4072
4178
  {
4073
4179
  onClick: () => editor.chain().focus().toggleSuperscript().run(),
4074
4180
  is_active: editor.isActive("superscript"),
4075
- tooltip: t4("rte.superscript"),
4181
+ tooltip: t5("rte.superscript"),
4076
4182
  children: /* @__PURE__ */ jsx(LuSuperscript, { className: "h-4 w-4" })
4077
4183
  },
4078
4184
  "super"
@@ -4086,7 +4192,7 @@ var Toolbar = ({
4086
4192
  if (tb.link) {
4087
4193
  items.push(
4088
4194
  /* @__PURE__ */ jsxs(Popover, { open: link_popover_open, onOpenChange: set_link_popover_open, children: [
4089
- /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsx(ToolbarButton, { is_active: editor.isActive("link"), tooltip: t4("rte.link"), children: /* @__PURE__ */ jsx(LuLink, { className: "h-4 w-4" }) }) }),
4195
+ /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsx(ToolbarButton, { is_active: editor.isActive("link"), tooltip: t5("rte.link"), children: /* @__PURE__ */ jsx(LuLink, { className: "h-4 w-4" }) }) }),
4090
4196
  /* @__PURE__ */ jsx(PopoverContent, { className: "w-80 p-3", children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
4091
4197
  /* @__PURE__ */ jsx(
4092
4198
  Input,
@@ -4098,17 +4204,14 @@ var Toolbar = ({
4098
4204
  }
4099
4205
  ),
4100
4206
  /* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
4101
- /* @__PURE__ */ jsxs(Button, { size: "sm", onClick: handle_set_link, className: "flex-1", children: [
4102
- editor.isActive("link") ? "Update" : "Add",
4103
- " Link"
4104
- ] }),
4207
+ /* @__PURE__ */ jsx(Button, { size: "sm", onClick: handle_set_link, className: "flex-1", children: editor.isActive("link") ? t5("rte.update_link") : t5("rte.add_link") }),
4105
4208
  editor.isActive("link") && /* @__PURE__ */ jsx(
4106
4209
  Button,
4107
4210
  {
4108
4211
  size: "sm",
4109
4212
  variant: "destructive",
4110
4213
  onClick: handle_remove_link,
4111
- children: "Remove"
4214
+ children: t5("rte.remove_link")
4112
4215
  }
4113
4216
  )
4114
4217
  ] })
@@ -4122,7 +4225,7 @@ var Toolbar = ({
4122
4225
  ToolbarButton,
4123
4226
  {
4124
4227
  onClick: () => editor.chain().focus().unsetAllMarks().clearNodes().run(),
4125
- tooltip: t4("rte.clear_formatting"),
4228
+ tooltip: t5("rte.clear_formatting"),
4126
4229
  children: /* @__PURE__ */ jsx(LuRemoveFormatting, { className: "h-4 w-4" })
4127
4230
  },
4128
4231
  "clear"
@@ -4136,7 +4239,7 @@ var Toolbar = ({
4136
4239
  if (tb.text_color) {
4137
4240
  items.push(
4138
4241
  /* @__PURE__ */ jsxs(Popover, { open: text_color_open, onOpenChange: set_text_color_open, children: [
4139
- /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsx(ToolbarButton, { tooltip: t4("rte.text_color"), children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center", children: [
4242
+ /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsx(ToolbarButton, { tooltip: t5("rte.text_color"), children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center", children: [
4140
4243
  /* @__PURE__ */ jsx(LuPalette, { className: "h-4 w-4" }),
4141
4244
  /* @__PURE__ */ jsx(
4142
4245
  "div",
@@ -4179,7 +4282,7 @@ var Toolbar = ({
4179
4282
  if (tb.highlight_color) {
4180
4283
  items.push(
4181
4284
  /* @__PURE__ */ jsxs(Popover, { open: highlight_color_open, onOpenChange: set_highlight_color_open, children: [
4182
- /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsx(ToolbarButton, { tooltip: t4("rte.highlight_color"), children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center", children: [
4285
+ /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsx(ToolbarButton, { tooltip: t5("rte.highlight_color"), children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center", children: [
4183
4286
  /* @__PURE__ */ jsx(LuHighlighter, { className: "h-4 w-4" }),
4184
4287
  /* @__PURE__ */ jsx(
4185
4288
  "div",
@@ -4222,7 +4325,7 @@ var Toolbar = ({
4222
4325
  {
4223
4326
  onClick: () => editor.chain().focus().setTextAlign("left").run(),
4224
4327
  is_active: editor.isActive({ textAlign: "left" }),
4225
- tooltip: t4("rte.align_left"),
4328
+ tooltip: t5("rte.align_left"),
4226
4329
  children: /* @__PURE__ */ jsx(LuAlignLeft, { className: "h-4 w-4" })
4227
4330
  },
4228
4331
  "align-left"
@@ -4232,7 +4335,7 @@ var Toolbar = ({
4232
4335
  {
4233
4336
  onClick: () => editor.chain().focus().setTextAlign("center").run(),
4234
4337
  is_active: editor.isActive({ textAlign: "center" }),
4235
- tooltip: t4("rte.align_center"),
4338
+ tooltip: t5("rte.align_center"),
4236
4339
  children: /* @__PURE__ */ jsx(LuAlignCenter, { className: "h-4 w-4" })
4237
4340
  },
4238
4341
  "align-center"
@@ -4242,7 +4345,7 @@ var Toolbar = ({
4242
4345
  {
4243
4346
  onClick: () => editor.chain().focus().setTextAlign("right").run(),
4244
4347
  is_active: editor.isActive({ textAlign: "right" }),
4245
- tooltip: t4("rte.align_right"),
4348
+ tooltip: t5("rte.align_right"),
4246
4349
  children: /* @__PURE__ */ jsx(LuAlignRight, { className: "h-4 w-4" })
4247
4350
  },
4248
4351
  "align-right"
@@ -4252,7 +4355,7 @@ var Toolbar = ({
4252
4355
  {
4253
4356
  onClick: () => editor.chain().focus().setTextAlign("justify").run(),
4254
4357
  is_active: editor.isActive({ textAlign: "justify" }),
4255
- tooltip: t4("rte.justify"),
4358
+ tooltip: t5("rte.justify"),
4256
4359
  children: /* @__PURE__ */ jsx(LuAlignJustify, { className: "h-4 w-4" })
4257
4360
  },
4258
4361
  "align-justify"
@@ -4268,7 +4371,7 @@ var Toolbar = ({
4268
4371
  {
4269
4372
  onClick: () => editor.chain().focus().toggleBulletList().run(),
4270
4373
  is_active: editor.isActive("bulletList"),
4271
- tooltip: t4("rte.bullet_list"),
4374
+ tooltip: t5("rte.bullet_list"),
4272
4375
  children: /* @__PURE__ */ jsx(LuList, { className: "h-4 w-4" })
4273
4376
  },
4274
4377
  "bullet"
@@ -4282,7 +4385,7 @@ var Toolbar = ({
4282
4385
  {
4283
4386
  onClick: () => editor.chain().focus().toggleOrderedList().run(),
4284
4387
  is_active: editor.isActive("orderedList"),
4285
- tooltip: t4("rte.ordered_list"),
4388
+ tooltip: t5("rte.ordered_list"),
4286
4389
  children: /* @__PURE__ */ jsx(LuListOrdered, { className: "h-4 w-4" })
4287
4390
  },
4288
4391
  "ordered"
@@ -4296,7 +4399,7 @@ var Toolbar = ({
4296
4399
  {
4297
4400
  onClick: () => editor.chain().focus().toggleTaskList().run(),
4298
4401
  is_active: editor.isActive("taskList"),
4299
- tooltip: t4("rte.checklist"),
4402
+ tooltip: t5("rte.checklist"),
4300
4403
  children: /* @__PURE__ */ jsx(LuListChecks, { className: "h-4 w-4" })
4301
4404
  },
4302
4405
  "task"
@@ -4318,7 +4421,7 @@ var Toolbar = ({
4318
4421
  }
4319
4422
  },
4320
4423
  disabled: !editor.can().liftListItem("listItem") && !editor.can().liftListItem("taskItem"),
4321
- tooltip: t4("rte.decrease_indent"),
4424
+ tooltip: t5("rte.decrease_indent"),
4322
4425
  children: /* @__PURE__ */ jsx(LuIndentDecrease, { className: "h-4 w-4" })
4323
4426
  },
4324
4427
  "indent-dec"
@@ -4334,7 +4437,7 @@ var Toolbar = ({
4334
4437
  }
4335
4438
  },
4336
4439
  disabled: !editor.can().sinkListItem("listItem") && !editor.can().sinkListItem("taskItem"),
4337
- tooltip: t4("rte.increase_indent"),
4440
+ tooltip: t5("rte.increase_indent"),
4338
4441
  children: /* @__PURE__ */ jsx(LuIndentIncrease, { className: "h-4 w-4" })
4339
4442
  },
4340
4443
  "indent-inc"
@@ -4345,7 +4448,7 @@ var Toolbar = ({
4345
4448
  const items = [];
4346
4449
  if (tb.horizontal_rule) {
4347
4450
  items.push(
4348
- /* @__PURE__ */ jsx(ToolbarButton, { onClick: handle_hr_insert, tooltip: t4("rte.horizontal_rule"), children: /* @__PURE__ */ jsx(RxDividerHorizontal, { className: "h-4 w-4" }) }, "hr")
4451
+ /* @__PURE__ */ jsx(ToolbarButton, { onClick: handle_hr_insert, tooltip: t5("rte.horizontal_rule"), children: /* @__PURE__ */ jsx(RxDividerHorizontal, { className: "h-4 w-4" }) }, "hr")
4349
4452
  );
4350
4453
  }
4351
4454
  if (tb.image) {
@@ -4354,7 +4457,7 @@ var Toolbar = ({
4354
4457
  ToolbarButton,
4355
4458
  {
4356
4459
  onClick: () => image_input_ref.current?.click(),
4357
- tooltip: t4("rte.insert_image"),
4460
+ tooltip: t5("rte.insert_image"),
4358
4461
  children: /* @__PURE__ */ jsx(LuImage, { className: "h-4 w-4" })
4359
4462
  },
4360
4463
  "image"
@@ -4368,14 +4471,14 @@ var Toolbar = ({
4368
4471
  ToolbarButton,
4369
4472
  {
4370
4473
  is_active: editor.isActive("table"),
4371
- tooltip: t4("rte.table"),
4474
+ tooltip: t5("rte.table"),
4372
4475
  children: /* @__PURE__ */ jsx(LuTable, { className: "h-4 w-4" })
4373
4476
  }
4374
4477
  ) }),
4375
4478
  /* @__PURE__ */ jsx(PopoverContent, { className: "w-auto p-3", align: "start", children: editor.isActive("table") ? (
4376
4479
  // Table editing controls when inside a table
4377
4480
  /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
4378
- /* @__PURE__ */ jsx("div", { className: "text-xs font-medium mb-1", children: "Table Operations" }),
4481
+ /* @__PURE__ */ jsx("div", { className: "text-xs font-medium mb-1", children: t5("rte.table_operations") }),
4379
4482
  /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-1", children: [
4380
4483
  /* @__PURE__ */ jsxs(
4381
4484
  Button,
@@ -4386,7 +4489,7 @@ var Toolbar = ({
4386
4489
  onClick: handle_add_row_before,
4387
4490
  children: [
4388
4491
  /* @__PURE__ */ jsx(LuTableRowsSplit, { className: "h-3 w-3 mr-1" }),
4389
- "Add row above"
4492
+ t5("rte.add_row_above")
4390
4493
  ]
4391
4494
  }
4392
4495
  ),
@@ -4399,7 +4502,7 @@ var Toolbar = ({
4399
4502
  onClick: handle_add_row_after,
4400
4503
  children: [
4401
4504
  /* @__PURE__ */ jsx(LuTableRowsSplit, { className: "h-3 w-3 mr-1" }),
4402
- "Add row below"
4505
+ t5("rte.add_row_below")
4403
4506
  ]
4404
4507
  }
4405
4508
  ),
@@ -4412,7 +4515,7 @@ var Toolbar = ({
4412
4515
  onClick: handle_add_col_before,
4413
4516
  children: [
4414
4517
  /* @__PURE__ */ jsx(LuTableColumnsSplit, { className: "h-3 w-3 mr-1" }),
4415
- "Add col left"
4518
+ t5("rte.add_col_left")
4416
4519
  ]
4417
4520
  }
4418
4521
  ),
@@ -4425,7 +4528,7 @@ var Toolbar = ({
4425
4528
  onClick: handle_add_col_after,
4426
4529
  children: [
4427
4530
  /* @__PURE__ */ jsx(LuTableColumnsSplit, { className: "h-3 w-3 mr-1" }),
4428
- "Add col right"
4531
+ t5("rte.add_col_right")
4429
4532
  ]
4430
4533
  }
4431
4534
  ),
@@ -4438,7 +4541,7 @@ var Toolbar = ({
4438
4541
  onClick: handle_delete_row,
4439
4542
  children: [
4440
4543
  /* @__PURE__ */ jsx(LuTrash2, { className: "h-3 w-3 mr-1" }),
4441
- "Delete row"
4544
+ t5("rte.delete_row")
4442
4545
  ]
4443
4546
  }
4444
4547
  ),
@@ -4451,7 +4554,7 @@ var Toolbar = ({
4451
4554
  onClick: handle_delete_col,
4452
4555
  children: [
4453
4556
  /* @__PURE__ */ jsx(LuTrash2, { className: "h-3 w-3 mr-1" }),
4454
- "Delete col"
4557
+ t5("rte.delete_col")
4455
4558
  ]
4456
4559
  }
4457
4560
  )
@@ -4465,7 +4568,7 @@ var Toolbar = ({
4465
4568
  onClick: handle_delete_table,
4466
4569
  children: [
4467
4570
  /* @__PURE__ */ jsx(LuTrash2, { className: "h-3 w-3 mr-1" }),
4468
- "Delete table"
4571
+ t5("rte.delete_table")
4469
4572
  ]
4470
4573
  }
4471
4574
  )
@@ -4473,7 +4576,7 @@ var Toolbar = ({
4473
4576
  ) : (
4474
4577
  // Table size picker when not in a table
4475
4578
  /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
4476
- /* @__PURE__ */ jsx("div", { className: "text-xs font-medium mb-1", children: "Insert Table" }),
4579
+ /* @__PURE__ */ jsx("div", { className: "text-xs font-medium mb-1", children: t5("rte.insert_table_heading") }),
4477
4580
  /* @__PURE__ */ jsx("div", { className: "grid gap-0.5", children: Array.from({ length: 6 }).map((_, row_idx) => /* @__PURE__ */ jsx("div", { className: "flex gap-0.5", children: Array.from({ length: 6 }).map((_2, col_idx) => /* @__PURE__ */ jsx(
4478
4581
  "div",
4479
4582
  {
@@ -4487,9 +4590,9 @@ var Toolbar = ({
4487
4590
  },
4488
4591
  col_idx
4489
4592
  )) }, row_idx)) }),
4490
- /* @__PURE__ */ jsx("div", { className: "text-xs text-center text-muted-foreground", children: hovered_cell ? `${hovered_cell.col} x ${hovered_cell.row}` : "Select size" }),
4593
+ /* @__PURE__ */ jsx("div", { className: "text-xs text-center text-muted-foreground", children: hovered_cell ? `${hovered_cell.col} x ${hovered_cell.row}` : t5("rte.select_size") }),
4491
4594
  /* @__PURE__ */ jsxs("div", { className: "border-t pt-2 mt-1", children: [
4492
- /* @__PURE__ */ jsx("div", { className: "text-xs text-muted-foreground mb-2", children: "Custom size" }),
4595
+ /* @__PURE__ */ jsx("div", { className: "text-xs text-muted-foreground mb-2", children: t5("rte.custom_size") }),
4493
4596
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
4494
4597
  /* @__PURE__ */ jsx(
4495
4598
  Input,
@@ -4522,7 +4625,7 @@ var Toolbar = ({
4522
4625
  onClick: () => handle_table_insert(table_rows, table_cols),
4523
4626
  children: [
4524
4627
  /* @__PURE__ */ jsx(LuGrid3X3, { className: "h-3 w-3 mr-1" }),
4525
- "Insert"
4628
+ t5("rte.insert_table")
4526
4629
  ]
4527
4630
  }
4528
4631
  )
@@ -4540,11 +4643,11 @@ var Toolbar = ({
4540
4643
  if (tb.variables && variables.length > 0) {
4541
4644
  items.push(
4542
4645
  /* @__PURE__ */ jsxs(Popover, { open: variables_menu_open, onOpenChange: set_variables_menu_open, children: [
4543
- /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsx(ToolbarButton, { tooltip: t4("rte.insert_variable"), children: /* @__PURE__ */ jsx(LuVariable, { className: "h-4 w-4" }) }) }),
4646
+ /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsx(ToolbarButton, { tooltip: t5("rte.insert_variable"), children: /* @__PURE__ */ jsx(LuVariable, { className: "h-4 w-4" }) }) }),
4544
4647
  /* @__PURE__ */ jsx(PopoverContent, { className: "w-64 p-0", align: "start", children: /* @__PURE__ */ jsxs(Command, { children: [
4545
- /* @__PURE__ */ jsx(CommandInput, { placeholder: "Search variables...", className: "h-8 text-xs" }),
4648
+ /* @__PURE__ */ jsx(CommandInput, { placeholder: t5("rte.search_variables"), className: "h-8 text-xs" }),
4546
4649
  /* @__PURE__ */ jsxs(CommandList, { children: [
4547
- /* @__PURE__ */ jsx(CommandEmpty, { children: "No variables found." }),
4650
+ /* @__PURE__ */ jsx(CommandEmpty, { children: t5("rte.no_variables") }),
4548
4651
  /* @__PURE__ */ jsx(CommandGroup, { children: variables.map((variable) => /* @__PURE__ */ jsx(
4549
4652
  CommandItem,
4550
4653
  {
@@ -4569,7 +4672,7 @@ var Toolbar = ({
4569
4672
  ToolbarButton,
4570
4673
  {
4571
4674
  onClick: () => file_input_ref.current?.click(),
4572
- tooltip: t4("rte.attach_file"),
4675
+ tooltip: t5("rte.attach_file"),
4573
4676
  children: /* @__PURE__ */ jsx(LuPaperclip, { className: "h-4 w-4" })
4574
4677
  },
4575
4678
  "attach"
@@ -4841,6 +4944,7 @@ var VariableExtension = Node.create({
4841
4944
  };
4842
4945
  }
4843
4946
  });
4947
+ var t6 = createPackageT("hazo_ui", en_default);
4844
4948
  function debounce_fn(func, wait) {
4845
4949
  let timeout_id = null;
4846
4950
  return (output) => {
@@ -4857,7 +4961,7 @@ var HazoUiRte = ({
4857
4961
  attachments: initial_attachments = [],
4858
4962
  variables = [],
4859
4963
  on_change,
4860
- placeholder = "Start typing...",
4964
+ placeholder,
4861
4965
  min_height = "200px",
4862
4966
  max_height = "400px",
4863
4967
  disabled = false,
@@ -4866,6 +4970,7 @@ var HazoUiRte = ({
4866
4970
  toolbar,
4867
4971
  font_families
4868
4972
  }) => {
4973
+ const resolved_placeholder = placeholder ?? t6("rte.placeholder");
4869
4974
  const [attachments, set_attachments] = React27.useState(
4870
4975
  initial_attachments
4871
4976
  );
@@ -4915,7 +5020,7 @@ var HazoUiRte = ({
4915
5020
  }
4916
5021
  }),
4917
5022
  Placeholder.configure({
4918
- placeholder
5023
+ placeholder: resolved_placeholder
4919
5024
  }),
4920
5025
  HorizontalRule,
4921
5026
  Table.configure({
@@ -5090,7 +5195,7 @@ var HazoUiRte = ({
5090
5195
  );
5091
5196
  };
5092
5197
  HazoUiRte.displayName = "HazoUiRte";
5093
- var t5 = createPackageT("hazo_ui", en_default);
5198
+ var t7 = createPackageT("hazo_ui", en_default);
5094
5199
  function CanvasTextToolbar({
5095
5200
  bold,
5096
5201
  italic,
@@ -5121,14 +5226,14 @@ function CanvasTextToolbar({
5121
5226
  ),
5122
5227
  style,
5123
5228
  children: [
5124
- /* @__PURE__ */ jsx(ToolbarButton, { is_active: bold, onClick: onBold, tooltip: t5("canvas_toolbar.bold"), children: /* @__PURE__ */ jsx(LuBold, { className: "h-4 w-4" }) }),
5125
- /* @__PURE__ */ jsx(ToolbarButton, { is_active: italic, onClick: onItalic, tooltip: t5("canvas_toolbar.italic"), children: /* @__PURE__ */ jsx(LuItalic, { className: "h-4 w-4" }) }),
5229
+ /* @__PURE__ */ jsx(ToolbarButton, { is_active: bold, onClick: onBold, tooltip: t7("canvas_toolbar.bold"), children: /* @__PURE__ */ jsx(LuBold, { className: "h-4 w-4" }) }),
5230
+ /* @__PURE__ */ jsx(ToolbarButton, { is_active: italic, onClick: onItalic, tooltip: t7("canvas_toolbar.italic"), children: /* @__PURE__ */ jsx(LuItalic, { className: "h-4 w-4" }) }),
5126
5231
  /* @__PURE__ */ jsx(
5127
5232
  ToolbarButton,
5128
5233
  {
5129
5234
  is_active: underline,
5130
5235
  onClick: onUnderline,
5131
- tooltip: t5("canvas_toolbar.underline"),
5236
+ tooltip: t7("canvas_toolbar.underline"),
5132
5237
  children: /* @__PURE__ */ jsx(LuUnderline, { className: "h-4 w-4" })
5133
5238
  }
5134
5239
  ),
@@ -5138,7 +5243,7 @@ function CanvasTextToolbar({
5138
5243
  {
5139
5244
  is_active: align === "left",
5140
5245
  onClick: () => onAlign?.("left"),
5141
- tooltip: t5("canvas_toolbar.align_left"),
5246
+ tooltip: t7("canvas_toolbar.align_left"),
5142
5247
  children: /* @__PURE__ */ jsx(LuAlignLeft, { className: "h-4 w-4" })
5143
5248
  }
5144
5249
  ),
@@ -5147,7 +5252,7 @@ function CanvasTextToolbar({
5147
5252
  {
5148
5253
  is_active: align === "center",
5149
5254
  onClick: () => onAlign?.("center"),
5150
- tooltip: t5("canvas_toolbar.align_center"),
5255
+ tooltip: t7("canvas_toolbar.align_center"),
5151
5256
  children: /* @__PURE__ */ jsx(LuAlignCenter, { className: "h-4 w-4" })
5152
5257
  }
5153
5258
  ),
@@ -5156,7 +5261,7 @@ function CanvasTextToolbar({
5156
5261
  {
5157
5262
  is_active: align === "right",
5158
5263
  onClick: () => onAlign?.("right"),
5159
- tooltip: t5("canvas_toolbar.align_right"),
5264
+ tooltip: t7("canvas_toolbar.align_right"),
5160
5265
  children: /* @__PURE__ */ jsx(LuAlignRight, { className: "h-4 w-4" })
5161
5266
  }
5162
5267
  ),
@@ -5165,7 +5270,7 @@ function CanvasTextToolbar({
5165
5270
  "label",
5166
5271
  {
5167
5272
  className: "relative flex h-8 w-8 cursor-pointer items-center justify-center rounded-md hover:bg-accent",
5168
- title: t5("canvas_toolbar.text_color"),
5273
+ title: t7("canvas_toolbar.text_color"),
5169
5274
  children: [
5170
5275
  /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center", children: [
5171
5276
  /* @__PURE__ */ jsx("span", { className: "text-xs font-bold text-muted-foreground", children: "A" }),
@@ -5195,7 +5300,7 @@ function CanvasTextToolbar({
5195
5300
  {
5196
5301
  is_active: verticalAlign === "top",
5197
5302
  onClick: () => onVerticalAlign?.("top"),
5198
- tooltip: t5("canvas_toolbar.align_top"),
5303
+ tooltip: t7("canvas_toolbar.align_top"),
5199
5304
  children: /* @__PURE__ */ jsx(LuAlignVerticalJustifyStart, { className: "h-4 w-4" })
5200
5305
  }
5201
5306
  ),
@@ -5204,7 +5309,7 @@ function CanvasTextToolbar({
5204
5309
  {
5205
5310
  is_active: verticalAlign === "middle",
5206
5311
  onClick: () => onVerticalAlign?.("middle"),
5207
- tooltip: t5("canvas_toolbar.align_middle"),
5312
+ tooltip: t7("canvas_toolbar.align_middle"),
5208
5313
  children: /* @__PURE__ */ jsx(LuAlignVerticalJustifyCenter, { className: "h-4 w-4" })
5209
5314
  }
5210
5315
  ),
@@ -5213,7 +5318,7 @@ function CanvasTextToolbar({
5213
5318
  {
5214
5319
  is_active: verticalAlign === "bottom",
5215
5320
  onClick: () => onVerticalAlign?.("bottom"),
5216
- tooltip: t5("canvas_toolbar.align_bottom"),
5321
+ tooltip: t7("canvas_toolbar.align_bottom"),
5217
5322
  children: /* @__PURE__ */ jsx(LuAlignVerticalJustifyEnd, { className: "h-4 w-4" })
5218
5323
  }
5219
5324
  ),
@@ -5224,7 +5329,7 @@ function CanvasTextToolbar({
5224
5329
  value: font,
5225
5330
  onChange: (e) => onFont?.(e.target.value),
5226
5331
  className: "h-8 text-xs rounded-md border border-border bg-background px-1 text-foreground focus:outline-none",
5227
- title: t5("canvas_toolbar.font_family"),
5332
+ title: t7("canvas_toolbar.font_family"),
5228
5333
  children: [
5229
5334
  /* @__PURE__ */ jsx("option", { value: "sans-serif", children: "Sans" }),
5230
5335
  /* @__PURE__ */ jsx("option", { value: "serif", children: "Serif" }),
@@ -5236,18 +5341,19 @@ function CanvasTextToolbar({
5236
5341
  }
5237
5342
  ),
5238
5343
  /* @__PURE__ */ jsx("div", { className: "mx-1 h-6 w-px bg-border" }),
5239
- /* @__PURE__ */ jsx(ToolbarButton, { is_active: bullet, onClick: onBullet, tooltip: t5("canvas_toolbar.bullet_list"), children: /* @__PURE__ */ jsx(LuList, { className: "h-4 w-4" }) })
5344
+ /* @__PURE__ */ jsx(ToolbarButton, { is_active: bullet, onClick: onBullet, tooltip: t7("canvas_toolbar.bullet_list"), children: /* @__PURE__ */ jsx(LuList, { className: "h-4 w-4" }) })
5240
5345
  ]
5241
5346
  }
5242
5347
  ) });
5243
5348
  }
5349
+ var t8 = createPackageT("hazo_ui", en_default);
5244
5350
  var MdEditorLazy = lazy(() => import('@uiw/react-md-editor'));
5245
5351
  var EDITOR_TEXTAREA_SELECTOR = ".w-md-editor-text-input";
5246
5352
  function MarkdownEditor({
5247
5353
  value,
5248
5354
  onChange,
5249
5355
  height = 600,
5250
- placeholder = "Write in Markdown\u2026",
5356
+ placeholder,
5251
5357
  className,
5252
5358
  colorMode = "light",
5253
5359
  preview = "edit",
@@ -5330,13 +5436,13 @@ function MarkdownEditor({
5330
5436
  try {
5331
5437
  const url = await onImageUpload(file);
5332
5438
  if (!url) {
5333
- setError("Upload failed.");
5439
+ setError(t8("markdown.upload_failed"));
5334
5440
  onChange(before + after);
5335
5441
  return;
5336
5442
  }
5337
5443
  onChange(before + `![](${url})` + after);
5338
5444
  } catch {
5339
- setError("Upload failed.");
5445
+ setError(t8("markdown.upload_failed"));
5340
5446
  onChange(before + after);
5341
5447
  } finally {
5342
5448
  setUploading(false);
@@ -5360,7 +5466,7 @@ function MarkdownEditor({
5360
5466
  {
5361
5467
  className: "flex items-center justify-center rounded-md border border-border bg-muted/30 text-sm text-muted-foreground",
5362
5468
  style: { height },
5363
- children: "Loading editor\u2026"
5469
+ children: t8("markdown.loading_editor")
5364
5470
  }
5365
5471
  ),
5366
5472
  children: /* @__PURE__ */ jsx(
@@ -5372,7 +5478,7 @@ function MarkdownEditor({
5372
5478
  preview: effectivePreview,
5373
5479
  visibleDragbar: false,
5374
5480
  commands: editorCommands,
5375
- textareaProps: { placeholder, onPaste: handlePaste }
5481
+ textareaProps: { placeholder: placeholder ?? t8("markdown.placeholder"), onPaste: handlePaste }
5376
5482
  }
5377
5483
  )
5378
5484
  }
@@ -5381,7 +5487,7 @@ function MarkdownEditor({
5381
5487
  {
5382
5488
  className: "flex items-center justify-center rounded-md border border-border bg-muted/30 text-sm text-muted-foreground",
5383
5489
  style: { height },
5384
- children: "Loading editor\u2026"
5490
+ children: t8("markdown.loading_editor")
5385
5491
  }
5386
5492
  ) }),
5387
5493
  useCustomPreview && showPreview && /* @__PURE__ */ jsx(
@@ -5395,7 +5501,7 @@ function MarkdownEditor({
5395
5501
  ]
5396
5502
  }
5397
5503
  ),
5398
- uploading && /* @__PURE__ */ jsx("p", { className: "mt-2 text-xs text-muted-foreground", children: "Uploading image\u2026" }),
5504
+ uploading && /* @__PURE__ */ jsx("p", { className: "mt-2 text-xs text-muted-foreground", children: t8("markdown.uploading_image") }),
5399
5505
  error && /* @__PURE__ */ jsx("p", { className: "mt-2 text-xs text-destructive", children: error })
5400
5506
  ] });
5401
5507
  }
@@ -6094,6 +6200,7 @@ var Text = Node.create({
6094
6200
  renderMarkdown: (node) => node.text || ""
6095
6201
  });
6096
6202
  var index_default3 = Text;
6203
+ var t9 = createPackageT("hazo_ui", en_default);
6097
6204
  var SingleLineDocument = index_default.extend({
6098
6205
  content: "paragraph"
6099
6206
  });
@@ -6131,7 +6238,7 @@ var HazoUiTextbox = ({
6131
6238
  value,
6132
6239
  default_value,
6133
6240
  prefixes,
6134
- placeholder = "Type here...",
6241
+ placeholder,
6135
6242
  disabled = false,
6136
6243
  className,
6137
6244
  pill_variant = "default",
@@ -6142,6 +6249,7 @@ var HazoUiTextbox = ({
6142
6249
  on_command_change,
6143
6250
  on_command_remove
6144
6251
  }) => {
6252
+ const resolved_placeholder = placeholder ?? t9("textbox.placeholder");
6145
6253
  const generated_instance_id = React27.useId();
6146
6254
  const instance_id = provided_instance_id || generated_instance_id;
6147
6255
  const [suggestion_state, set_suggestion_state] = React27.useState(null);
@@ -6174,7 +6282,7 @@ var HazoUiTextbox = ({
6174
6282
  index_default2,
6175
6283
  index_default3,
6176
6284
  Placeholder.configure({
6177
- placeholder
6285
+ placeholder: resolved_placeholder
6178
6286
  }),
6179
6287
  CommandNodeExtension.configure({}),
6180
6288
  ...suggestion_extensions
@@ -6553,7 +6661,7 @@ var HazoUiTextbox = ({
6553
6661
  edit_selected_index === edit_commands.length && "bg-destructive/10"
6554
6662
  ),
6555
6663
  onClick: handle_command_remove,
6556
- children: /* @__PURE__ */ jsx("span", { children: "Remove" })
6664
+ children: /* @__PURE__ */ jsx("span", { children: t9("common.remove") })
6557
6665
  }
6558
6666
  )
6559
6667
  ] })
@@ -6631,6 +6739,7 @@ var HardBreak = Node.create({
6631
6739
  }
6632
6740
  });
6633
6741
  var index_default4 = HardBreak;
6742
+ var t10 = createPackageT("hazo_ui", en_default);
6634
6743
  var get_editor_output2 = (editor) => {
6635
6744
  if (!editor) {
6636
6745
  return { plain_text: "", display_text: "", commands: [] };
@@ -6685,7 +6794,7 @@ var HazoUiTextarea = ({
6685
6794
  value,
6686
6795
  default_value,
6687
6796
  prefixes,
6688
- placeholder = "Type here...",
6797
+ placeholder,
6689
6798
  disabled = false,
6690
6799
  className,
6691
6800
  pill_variant = "default",
@@ -6699,6 +6808,7 @@ var HazoUiTextarea = ({
6699
6808
  on_command_change,
6700
6809
  on_command_remove
6701
6810
  }) => {
6811
+ const resolved_placeholder = placeholder ?? t10("textarea.placeholder");
6702
6812
  const generated_instance_id = React27.useId();
6703
6813
  const instance_id = provided_instance_id || generated_instance_id;
6704
6814
  const [suggestion_state, set_suggestion_state] = React27.useState(null);
@@ -6733,7 +6843,7 @@ var HazoUiTextarea = ({
6733
6843
  index_default3,
6734
6844
  index_default4,
6735
6845
  Placeholder.configure({
6736
- placeholder
6846
+ placeholder: resolved_placeholder
6737
6847
  }),
6738
6848
  CommandNodeExtension.configure({}),
6739
6849
  ...suggestion_extensions
@@ -7123,7 +7233,7 @@ var HazoUiTextarea = ({
7123
7233
  backgroundColor: edit_selected_index === edit_commands.length ? "rgba(239, 68, 68, 0.1)" : "inherit"
7124
7234
  },
7125
7235
  onClick: handle_command_remove,
7126
- children: /* @__PURE__ */ jsx("span", { children: "Remove" })
7236
+ children: /* @__PURE__ */ jsx("span", { children: t10("common.remove") })
7127
7237
  }
7128
7238
  )
7129
7239
  ] })
@@ -7183,6 +7293,7 @@ function resolve_animation_classes(open_anim = "zoom", close_anim = "zoom") {
7183
7293
  const close_classes = close_anim in ANIMATION_PRESETS ? ANIMATION_PRESETS[close_anim].close : close_anim;
7184
7294
  return `${open_classes} ${close_classes}`;
7185
7295
  }
7296
+ var t11 = createPackageT("hazo_ui", en_default);
7186
7297
  var VARIANT_PRESETS = {
7187
7298
  info: {
7188
7299
  header_background_color: "var(--dialog-info-bg)",
@@ -7232,11 +7343,11 @@ function HazoUiDialog({
7232
7343
  children,
7233
7344
  onConfirm,
7234
7345
  onCancel,
7235
- title = "Action required",
7346
+ title,
7236
7347
  description,
7237
7348
  actionButtonText: actionButtonTextProp,
7238
7349
  actionButtonVariant,
7239
- cancelButtonText = "Cancel",
7350
+ cancelButtonText,
7240
7351
  showCancelButton: showCancelButtonProp,
7241
7352
  showActionButton = true,
7242
7353
  closeOnConfirm: closeOnConfirmProp,
@@ -7276,9 +7387,11 @@ function HazoUiDialog({
7276
7387
  const cancel_ref = React27.useRef(null);
7277
7388
  const variant_preset = variant !== "default" ? VARIANT_PRESETS[variant] : is_status_kind || is_confirm_kind ? NEUTRAL_VARIANT_PRESET : void 0;
7278
7389
  const resolved_action_button_variant = actionButtonVariant ?? variant_preset?.action_button_variant ?? "default";
7390
+ const resolved_title = title ?? t11("dialog.default_title");
7391
+ const resolved_cancel_text = cancelButtonText ?? t11("dialog.cancel");
7279
7392
  const showCancelButton = showCancelButtonProp ?? (is_status_kind ? false : true);
7280
7393
  const closeOnConfirm = closeOnConfirmProp ?? (is_status_kind || is_confirm_kind ? true : false);
7281
- const actionButtonText = actionButtonTextProp ?? (is_status_kind ? "OK" : is_confirm_kind ? showCancelButton ? "Confirm" : "OK" : "Confirm");
7394
+ const actionButtonText = actionButtonTextProp ?? (is_status_kind ? t11("dialog.ok") : is_confirm_kind ? showCancelButton ? t11("dialog.confirm") : t11("dialog.ok") : t11("dialog.confirm"));
7282
7395
  const actionButtonLoading = actionButtonLoadingProp ?? (is_confirm_kind ? internal_confirm_loading : false);
7283
7396
  const handleConfirm = () => {
7284
7397
  if (is_confirm_kind) {
@@ -7413,7 +7526,7 @@ function HazoUiDialog({
7413
7526
  },
7414
7527
  children: [
7415
7528
  /* @__PURE__ */ jsxs("div", { className: "cls_confirm_dialog_body px-6 pt-7 pb-5", children: [
7416
- /* @__PURE__ */ jsx(DialogPrimitive.Title, { className: "cls_confirm_dialog_title text-[17px] font-semibold text-foreground mb-2.5", children: title }),
7529
+ /* @__PURE__ */ jsx(DialogPrimitive.Title, { className: "cls_confirm_dialog_title text-[17px] font-semibold text-foreground mb-2.5", children: resolved_title }),
7417
7530
  children ? /* @__PURE__ */ jsx(DialogPrimitive.Description, { asChild: true, children: /* @__PURE__ */ jsx("div", { className: "cls_confirm_dialog_children text-sm text-muted-foreground leading-relaxed", children }) }) : description ? /* @__PURE__ */ jsx(DialogPrimitive.Description, { className: "cls_confirm_dialog_description text-sm text-muted-foreground leading-relaxed", children: description }) : null
7418
7531
  ] }),
7419
7532
  /* @__PURE__ */ jsx("div", { className: "cls_confirm_dialog_separator border-t border-border" }),
@@ -7428,7 +7541,7 @@ function HazoUiDialog({
7428
7541
  onClick: handleCancel,
7429
7542
  disabled: actionButtonLoading,
7430
7543
  style: cancelButtonStyles,
7431
- children: cancelButtonText
7544
+ children: resolved_cancel_text
7432
7545
  }
7433
7546
  ),
7434
7547
  showActionButton && /* @__PURE__ */ jsxs(
@@ -7494,7 +7607,7 @@ function HazoUiDialog({
7494
7607
  ...finalHeaderBackgroundColor && { backgroundColor: finalHeaderBackgroundColor },
7495
7608
  ...finalHeaderTextColor && { color: finalHeaderTextColor }
7496
7609
  },
7497
- children: /* @__PURE__ */ jsx(DialogTitle, { className: titleClassName, children: title })
7610
+ children: /* @__PURE__ */ jsx(DialogTitle, { className: titleClassName, children: resolved_title })
7498
7611
  }
7499
7612
  ),
7500
7613
  /* @__PURE__ */ jsx(
@@ -7525,7 +7638,7 @@ function HazoUiDialog({
7525
7638
  ),
7526
7639
  style: headerStyles,
7527
7640
  children: [
7528
- /* @__PURE__ */ jsx(DialogTitle, { className: titleClassName, children: title }),
7641
+ /* @__PURE__ */ jsx(DialogTitle, { className: titleClassName, children: resolved_title }),
7529
7642
  description && /* @__PURE__ */ jsx(
7530
7643
  DialogDescription,
7531
7644
  {
@@ -7576,7 +7689,7 @@ function HazoUiDialog({
7576
7689
  variant: "outline",
7577
7690
  onClick: handleCancel,
7578
7691
  style: cancelButtonStyles,
7579
- children: cancelButtonText
7692
+ children: resolved_cancel_text
7580
7693
  }
7581
7694
  ),
7582
7695
  showActionButton && /* @__PURE__ */ jsxs(
@@ -7605,7 +7718,7 @@ function HazoUiDialog({
7605
7718
  style: headerBar ? { color: "var(--dialog-header-bar-fg)" } : finalHeaderTextColor ? { color: finalHeaderTextColor } : void 0,
7606
7719
  children: [
7607
7720
  /* @__PURE__ */ jsx(X, { className: "h-4 w-4" }),
7608
- /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Close" })
7721
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: t11("dialog.close") })
7609
7722
  ]
7610
7723
  }
7611
7724
  )
@@ -7614,7 +7727,7 @@ function HazoUiDialog({
7614
7727
  )
7615
7728
  ] }) });
7616
7729
  }
7617
- var t6 = createPackageT("hazo_ui", en_default);
7730
+ var t12 = createPackageT("hazo_ui", en_default);
7618
7731
  function HazoUiConfirmDialog({
7619
7732
  open,
7620
7733
  onOpenChange,
@@ -7623,7 +7736,7 @@ function HazoUiConfirmDialog({
7623
7736
  children,
7624
7737
  variant = "default",
7625
7738
  confirmLabel,
7626
- cancelLabel = t6("confirm.cancel"),
7739
+ cancelLabel = t12("confirm.cancel"),
7627
7740
  showCancelButton = true,
7628
7741
  onConfirm,
7629
7742
  onCancel,
@@ -7672,6 +7785,7 @@ var Slider = React27.forwardRef(({ className, ...props }, ref) => /* @__PURE__ *
7672
7785
  }
7673
7786
  ));
7674
7787
  Slider.displayName = SliderPrimitive.Root.displayName;
7788
+ var t13 = createPackageT("hazo_ui", en_default);
7675
7789
  async function getCroppedImg(imageSrc, areaPixels, outputSize, quality) {
7676
7790
  const img = await new Promise((resolve, reject) => {
7677
7791
  const image = new Image();
@@ -7717,7 +7831,7 @@ var HazoUiImageCropper = React27.forwardRef(function HazoUiImageCropper2({
7717
7831
  onCropped,
7718
7832
  outputSize = 512,
7719
7833
  quality = 0.9,
7720
- zoomLabel = "Zoom",
7834
+ zoomLabel,
7721
7835
  className
7722
7836
  }, ref) {
7723
7837
  const [crop, set_crop] = React27.useState({
@@ -7725,6 +7839,7 @@ var HazoUiImageCropper = React27.forwardRef(function HazoUiImageCropper2({
7725
7839
  y: 0
7726
7840
  });
7727
7841
  const [zoom, set_zoom] = React27.useState(1);
7842
+ const resolved_zoom_label = zoomLabel ?? t13("cropper.zoom");
7728
7843
  const cropped_area_pixels_ref = React27.useRef(null);
7729
7844
  const handle_crop_complete = React27.useCallback(
7730
7845
  (_croppedArea, croppedAreaPixels) => {
@@ -7781,7 +7896,7 @@ var HazoUiImageCropper = React27.forwardRef(function HazoUiImageCropper2({
7781
7896
  {
7782
7897
  className: "cls_zoom_label text-sm font-medium text-foreground",
7783
7898
  id: "hazo-cropper-zoom-label",
7784
- children: zoomLabel
7899
+ children: resolved_zoom_label
7785
7900
  }
7786
7901
  ),
7787
7902
  /* @__PURE__ */ jsx(
@@ -7799,19 +7914,24 @@ var HazoUiImageCropper = React27.forwardRef(function HazoUiImageCropper2({
7799
7914
  ] });
7800
7915
  });
7801
7916
  HazoUiImageCropper.displayName = "HazoUiImageCropper";
7917
+ var t14 = createPackageT("hazo_ui", en_default);
7802
7918
  function HazoUiImageCropperDialog({
7803
7919
  open,
7804
7920
  onOpenChange,
7805
7921
  file,
7806
7922
  onConfirm,
7807
7923
  onCancel,
7808
- title = "Crop photo",
7809
- confirmLabel = "Save",
7810
- cancelLabel = "Cancel",
7811
- zoomLabel = "Zoom",
7924
+ title,
7925
+ confirmLabel,
7926
+ cancelLabel,
7927
+ zoomLabel,
7812
7928
  outputSize = 512,
7813
7929
  quality = 0.9
7814
7930
  }) {
7931
+ const resolved_title = title ?? t14("cropper.title");
7932
+ const resolved_confirm_label = confirmLabel ?? t14("cropper.save");
7933
+ const resolved_cancel_label = cancelLabel ?? t14("cropper.cancel");
7934
+ const resolved_zoom_label = zoomLabel ?? t14("cropper.zoom");
7815
7935
  const cropper_ref = React27.useRef(null);
7816
7936
  const [image_src, set_image_src] = React27.useState(null);
7817
7937
  const [is_confirming, set_is_confirming] = React27.useState(false);
@@ -7842,9 +7962,9 @@ function HazoUiImageCropperDialog({
7842
7962
  {
7843
7963
  open,
7844
7964
  onOpenChange,
7845
- title,
7846
- actionButtonText: confirmLabel,
7847
- cancelButtonText: cancelLabel,
7965
+ title: resolved_title,
7966
+ actionButtonText: resolved_confirm_label,
7967
+ cancelButtonText: resolved_cancel_label,
7848
7968
  onConfirm: handle_confirm,
7849
7969
  onCancel,
7850
7970
  actionButtonLoading: is_confirming,
@@ -7857,7 +7977,7 @@ function HazoUiImageCropperDialog({
7857
7977
  imageSrc: image_src,
7858
7978
  outputSize,
7859
7979
  quality,
7860
- zoomLabel
7980
+ zoomLabel: resolved_zoom_label
7861
7981
  }
7862
7982
  )
7863
7983
  }
@@ -8297,6 +8417,7 @@ var CardFooter = React27.forwardRef(
8297
8417
  ({ className, ...props }, ref) => /* @__PURE__ */ jsx("div", { ref, className: cn("flex items-center p-6 pt-0", className), ...props })
8298
8418
  );
8299
8419
  CardFooter.displayName = "CardFooter";
8420
+ var t15 = createPackageT("hazo_ui", en_default);
8300
8421
  function Spinner({ className, size = "md" }) {
8301
8422
  const sizeClasses = { sm: "h-4 w-4", md: "h-8 w-8", lg: "h-12 w-12" };
8302
8423
  return /* @__PURE__ */ jsx(
@@ -8304,8 +8425,8 @@ function Spinner({ className, size = "md" }) {
8304
8425
  {
8305
8426
  className: cn("animate-spin rounded-full border-2 border-current border-t-transparent text-primary", sizeClasses[size], className),
8306
8427
  role: "status",
8307
- "aria-label": "Loading",
8308
- children: /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Loading..." })
8428
+ "aria-label": t15("spinner.loading"),
8429
+ children: /* @__PURE__ */ jsx("span", { className: "sr-only", children: t15("spinner.loading_text") })
8309
8430
  }
8310
8431
  );
8311
8432
  }
@@ -8441,6 +8562,7 @@ var InputAffix = React27.forwardRef(
8441
8562
  }
8442
8563
  );
8443
8564
  InputAffix.displayName = "InputAffix";
8565
+ var t16 = createPackageT("hazo_ui", en_default);
8444
8566
  var SkeletonBase = React27.forwardRef(
8445
8567
  ({ className, ...rest }, ref) => /* @__PURE__ */ jsx(
8446
8568
  "div",
@@ -8482,18 +8604,19 @@ function SkeletonRect({ width = "100%", height = 96, radius = 6, className }) {
8482
8604
  }
8483
8605
  );
8484
8606
  }
8485
- function SkeletonGroup({ label = "Loading content", children, className, ...rest }) {
8607
+ function SkeletonGroup({ label, children, className, ...rest }) {
8608
+ const resolved_label = label ?? t16("skeleton.loading_content");
8486
8609
  return /* @__PURE__ */ jsxs(
8487
8610
  "div",
8488
8611
  {
8489
8612
  role: "status",
8490
8613
  "aria-busy": "true",
8491
- "aria-label": label,
8614
+ "aria-label": resolved_label,
8492
8615
  className: cn("space-y-2", className),
8493
8616
  ...rest,
8494
8617
  children: [
8495
8618
  children,
8496
- /* @__PURE__ */ jsx("span", { className: "sr-only", children: label })
8619
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: resolved_label })
8497
8620
  ]
8498
8621
  }
8499
8622
  );
@@ -8528,7 +8651,7 @@ function EmptyState({
8528
8651
  }
8529
8652
  );
8530
8653
  }
8531
- var t7 = createPackageT("hazo_ui", en_default);
8654
+ var t17 = createPackageT("hazo_ui", en_default);
8532
8655
  function ErrorBanner({
8533
8656
  severity = "error",
8534
8657
  title,
@@ -8563,7 +8686,7 @@ function ErrorBanner({
8563
8686
  {
8564
8687
  type: "button",
8565
8688
  onClick: onDismiss,
8566
- "aria-label": t7("error.dismiss"),
8689
+ "aria-label": t17("error.dismiss"),
8567
8690
  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",
8568
8691
  children: /* @__PURE__ */ jsx(X, { className: "h-4 w-4", "aria-hidden": "true" })
8569
8692
  }
@@ -8572,9 +8695,9 @@ function ErrorBanner({
8572
8695
  }
8573
8696
  );
8574
8697
  }
8575
- var t8 = createPackageT("hazo_ui", en_default);
8698
+ var t18 = createPackageT("hazo_ui", en_default);
8576
8699
  function ErrorPage({
8577
- title = t8("error.something_went_wrong"),
8700
+ title,
8578
8701
  description,
8579
8702
  errorCode,
8580
8703
  correlationId,
@@ -8582,6 +8705,7 @@ function ErrorPage({
8582
8705
  illustration,
8583
8706
  className
8584
8707
  }) {
8708
+ const resolved_title = title ?? t18("error.something_went_wrong");
8585
8709
  return /* @__PURE__ */ jsxs(
8586
8710
  "div",
8587
8711
  {
@@ -8594,10 +8718,10 @@ function ErrorPage({
8594
8718
  children: [
8595
8719
  /* @__PURE__ */ jsx("div", { className: "text-destructive", children: illustration ?? /* @__PURE__ */ jsx(OctagonAlert, { className: "h-16 w-16", "aria-hidden": "true" }) }),
8596
8720
  errorCode ? /* @__PURE__ */ jsx("div", { className: "rounded-full bg-muted px-3 py-1 text-xs font-mono uppercase tracking-wider text-muted-foreground", children: errorCode }) : null,
8597
- /* @__PURE__ */ jsx("h1", { className: "text-2xl font-semibold text-foreground", children: title }),
8721
+ /* @__PURE__ */ jsx("h1", { className: "text-2xl font-semibold text-foreground", children: resolved_title }),
8598
8722
  description ? /* @__PURE__ */ jsx("div", { className: "text-sm text-muted-foreground", children: description }) : null,
8599
8723
  correlationId ? /* @__PURE__ */ jsxs("div", { className: "w-full rounded-md border bg-muted/40 px-3 py-2 text-left", children: [
8600
- /* @__PURE__ */ jsx("div", { className: "text-[10px] uppercase tracking-wider text-muted-foreground", children: "Correlation ID" }),
8724
+ /* @__PURE__ */ jsx("div", { className: "text-[10px] uppercase tracking-wider text-muted-foreground", children: t18("error.correlation_id") }),
8601
8725
  /* @__PURE__ */ jsx("code", { className: "break-all text-xs", children: correlationId })
8602
8726
  ] }) : null,
8603
8727
  actions ? /* @__PURE__ */ jsx("div", { className: "mt-2 flex flex-wrap items-center justify-center gap-2", children: actions }) : null
@@ -8605,16 +8729,17 @@ function ErrorPage({
8605
8729
  }
8606
8730
  );
8607
8731
  }
8608
- var t9 = createPackageT("hazo_ui", en_default);
8732
+ var t19 = createPackageT("hazo_ui", en_default);
8609
8733
  function LoadingTimeout({
8610
8734
  active,
8611
8735
  children,
8612
8736
  skeleton,
8613
8737
  onRetry,
8614
8738
  thresholds,
8615
- label = "content",
8739
+ label,
8616
8740
  className
8617
8741
  }) {
8742
+ const resolved_label = label ?? t19("loading.default_label");
8618
8743
  const timeouts = {
8619
8744
  gentle: thresholds?.gentle ?? 5e3,
8620
8745
  firm: thresholds?.firm ?? 15e3,
@@ -8644,15 +8769,15 @@ function LoadingTimeout({
8644
8769
  ErrorBanner,
8645
8770
  {
8646
8771
  severity: "error",
8647
- title: t9("loading.taking_longer"),
8648
- message: `We're still trying to load the ${label}. The connection may be slow.`,
8772
+ title: t19("loading.taking_longer"),
8773
+ message: t19("loading.still_loading", { label: resolved_label }),
8649
8774
  action: onRetry ? /* @__PURE__ */ jsx(
8650
8775
  "button",
8651
8776
  {
8652
8777
  type: "button",
8653
8778
  onClick: onRetry,
8654
8779
  className: "rounded bg-foreground/10 px-3 py-1.5 text-sm font-medium hover:bg-foreground/15",
8655
- children: "Try again"
8780
+ children: t19("loading.try_again")
8656
8781
  }
8657
8782
  ) : null
8658
8783
  }
@@ -8660,12 +8785,8 @@ function LoadingTimeout({
8660
8785
  }
8661
8786
  return /* @__PURE__ */ jsxs("div", { className, role: "status", "aria-busy": "true", "aria-live": "polite", children: [
8662
8787
  skeleton,
8663
- phase === "gentle" ? /* @__PURE__ */ jsxs("div", { className: "mt-3 text-center text-sm text-muted-foreground", children: [
8664
- "Loading ",
8665
- label,
8666
- "\u2026"
8667
- ] }) : null,
8668
- phase === "firm" ? /* @__PURE__ */ jsx("div", { className: "mt-3 text-center text-sm text-muted-foreground", children: "Still working on it \u2014 almost there." }) : null
8788
+ phase === "gentle" ? /* @__PURE__ */ jsx("div", { className: "mt-3 text-center text-sm text-muted-foreground", children: t19("loading.gentle_message", { label: resolved_label }) }) : null,
8789
+ phase === "firm" ? /* @__PURE__ */ jsx("div", { className: "mt-3 text-center text-sm text-muted-foreground", children: t19("loading.firm_message") }) : null
8669
8790
  ] });
8670
8791
  }
8671
8792
  function ProgressiveImage({
@@ -8746,7 +8867,7 @@ function NotificationCountBadge({
8746
8867
  }
8747
8868
  );
8748
8869
  }
8749
- var t10 = createPackageT("hazo_ui", en_default);
8870
+ var t20 = createPackageT("hazo_ui", en_default);
8750
8871
  function NotificationItem({
8751
8872
  isRead,
8752
8873
  timestamp,
@@ -8777,7 +8898,7 @@ function NotificationItem({
8777
8898
  /* @__PURE__ */ jsx("div", { className: "cls_notification_item_dot_col flex-shrink-0 pt-1.5", children: !isRead ? /* @__PURE__ */ jsx(
8778
8899
  "span",
8779
8900
  {
8780
- "aria-label": t10("notification.unread"),
8901
+ "aria-label": t20("notification.unread"),
8781
8902
  className: "cls_notification_item_dot block w-2 h-2 rounded-full bg-primary"
8782
8903
  }
8783
8904
  ) : /* @__PURE__ */ jsx("span", { className: "block w-2 h-2", "aria-hidden": "true" }) }),
@@ -8801,13 +8922,13 @@ function NotificationItem({
8801
8922
  }
8802
8923
  );
8803
8924
  }
8804
- var t11 = createPackageT("hazo_ui", en_default);
8925
+ var t21 = createPackageT("hazo_ui", en_default);
8805
8926
  function LoadingSkeletons() {
8806
8927
  return /* @__PURE__ */ jsx(
8807
8928
  "div",
8808
8929
  {
8809
8930
  "aria-busy": "true",
8810
- "aria-label": t11("notification.loading"),
8931
+ "aria-label": t21("notification.loading"),
8811
8932
  className: "cls_notification_panel_loading space-y-0",
8812
8933
  children: [0, 1, 2].map((i) => /* @__PURE__ */ jsxs(
8813
8934
  "div",
@@ -8866,7 +8987,7 @@ function NotificationPanel({
8866
8987
  }
8867
8988
  );
8868
8989
  }
8869
- var t12 = createPackageT("hazo_ui", en_default);
8990
+ var t22 = createPackageT("hazo_ui", en_default);
8870
8991
  function HazoUiToaster({
8871
8992
  position = "bottom-right",
8872
8993
  closeButton = true,
@@ -8912,12 +9033,14 @@ function permissionToast({
8912
9033
  action,
8913
9034
  duration = 5e3
8914
9035
  }) {
8915
- const description = missingPermissions.length === 0 ? t12("toast.permission_denied_message") : `Missing: ${missingPermissions.map((key) => {
8916
- const label = descriptions?.[key];
8917
- return label ? `\`${key}\` \u2014 ${label}` : `\`${key}\``;
8918
- }).join("; ")}`;
9036
+ const description = missingPermissions.length === 0 ? t22("toast.permission_denied_message") : t22("toast.missing_prefix", {
9037
+ items: missingPermissions.map((key) => {
9038
+ const label = descriptions?.[key];
9039
+ return label ? `\`${key}\` \u2014 ${label}` : `\`${key}\``;
9040
+ }).join("; ")
9041
+ });
8919
9042
  return errorToast({
8920
- title: t12("toast.permission_required"),
9043
+ title: t22("toast.permission_required"),
8921
9044
  description,
8922
9045
  action,
8923
9046
  duration
@@ -9175,6 +9298,7 @@ function use_fullscreen() {
9175
9298
  const { isFullscreen, toggle } = useFullscreen(ref);
9176
9299
  return { is_fullscreen: isFullscreen, toggle, ref };
9177
9300
  }
9301
+ var t23 = createPackageT("hazo_ui", en_default);
9178
9302
  function KanbanCard({
9179
9303
  item,
9180
9304
  renderCard,
@@ -9236,7 +9360,7 @@ function KanbanCard({
9236
9360
  ...listeners,
9237
9361
  role: "button",
9238
9362
  tabIndex: 0,
9239
- "aria-roledescription": "draggable card",
9363
+ "aria-roledescription": t23("kanban.draggable_card"),
9240
9364
  "aria-grabbed": isDragging,
9241
9365
  onDoubleClick: () => {
9242
9366
  if (showEdit && onEditRequest && !dragging) onEditRequest(item);
@@ -9561,6 +9685,7 @@ function KanbanLaneStrip({
9561
9685
  }
9562
9686
  );
9563
9687
  }
9688
+ var t24 = createPackageT("hazo_ui", en_default);
9564
9689
  var DEFAULT_PRIORITIES = ["P0", "P1", "P2", "P3"];
9565
9690
  function humanize(key) {
9566
9691
  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(" ");
@@ -9575,7 +9700,7 @@ function auto_detect_fields(item, columns) {
9575
9700
  }
9576
9701
  }
9577
9702
  if (columns.length > 0) {
9578
- out.push({ key: "columnKey", type: "status", label: "Status" });
9703
+ out.push({ key: "columnKey", type: "status", label: t24("kanban.status_label") });
9579
9704
  }
9580
9705
  return out;
9581
9706
  }
@@ -9672,7 +9797,7 @@ function KanbanEditor({
9672
9797
  isDirty: is_dirty
9673
9798
  };
9674
9799
  const open = item !== null;
9675
- const title = item && titleFn ? titleFn(item) : item ? `Edit ${item.id}` : "";
9800
+ const title = item && titleFn ? titleFn(item) : item ? t24("kanban.edit_fallback", { id: item.id }) : "";
9676
9801
  const priority_var = item?.priority ? `--hazo-kanban-priority-${String(item.priority).toLowerCase()}` : null;
9677
9802
  const header_bar_color = priority_var ? `hsl(var(${priority_var}))` : void 0;
9678
9803
  const use_default_footer = !(renderBody && hideFooter);
@@ -9684,18 +9809,18 @@ function KanbanEditor({
9684
9809
  if (!o && !saving) onClose();
9685
9810
  },
9686
9811
  title,
9687
- description: "Update card details below.",
9812
+ description: t24("kanban.update_description"),
9688
9813
  sizeWidth: "min(90vw, 480px)",
9689
9814
  openAnimation: "none",
9690
9815
  closeAnimation: "none",
9691
9816
  headerBar: !!priority_var,
9692
9817
  headerBarColor: header_bar_color,
9693
9818
  contentClassName: cn("cls_hazo_kanban_editor", priority_var && "pt-0"),
9694
- actionButtonText: saving ? "Saving\u2026" : "Save",
9819
+ actionButtonText: saving ? t24("kanban.saving") : t24("kanban.save"),
9695
9820
  actionButtonIcon: saving ? void 0 : /* @__PURE__ */ jsx(Check, { className: "h-4 w-4 mr-2" }),
9696
9821
  actionButtonLoading: saving,
9697
9822
  actionButtonDisabled: !is_dirty || !all_required_filled || saving,
9698
- cancelButtonText: "Cancel",
9823
+ cancelButtonText: t24("kanban.cancel"),
9699
9824
  showCancelButton: true,
9700
9825
  onConfirm: handle_save,
9701
9826
  onCancel: onClose,
@@ -9800,7 +9925,7 @@ function KanbanEditorFieldRow({
9800
9925
  /* @__PURE__ */ jsx(SelectTrigger, { id, children: /* @__PURE__ */ jsx(
9801
9926
  SelectValue,
9802
9927
  {
9803
- placeholder: field.placeholder ?? `Select ${label}\u2026`
9928
+ placeholder: field.placeholder ?? t24("kanban.select_placeholder", { label })
9804
9929
  }
9805
9930
  ) }),
9806
9931
  /* @__PURE__ */ jsx(SelectContent, { children: (field.options ?? []).map((opt) => /* @__PURE__ */ jsx(SelectItem, { value: opt, children: opt }, opt)) })
@@ -9816,7 +9941,7 @@ function KanbanEditorFieldRow({
9816
9941
  /* @__PURE__ */ jsx(SelectTrigger, { id, children: /* @__PURE__ */ jsx(
9817
9942
  SelectValue,
9818
9943
  {
9819
- placeholder: field.placeholder ?? "Select priority\u2026"
9944
+ placeholder: field.placeholder ?? t24("kanban.select_priority")
9820
9945
  }
9821
9946
  ) }),
9822
9947
  /* @__PURE__ */ jsx(SelectContent, { children: priorities.map((p) => /* @__PURE__ */ jsx(SelectItem, { value: p, children: p }, p)) })
@@ -9832,7 +9957,7 @@ function KanbanEditorFieldRow({
9832
9957
  /* @__PURE__ */ jsx(SelectTrigger, { id, children: /* @__PURE__ */ jsx(
9833
9958
  SelectValue,
9834
9959
  {
9835
- placeholder: field.placeholder ?? "Select status\u2026"
9960
+ placeholder: field.placeholder ?? t24("kanban.select_status")
9836
9961
  }
9837
9962
  ) }),
9838
9963
  /* @__PURE__ */ jsx(SelectContent, { children: columns.map((col) => /* @__PURE__ */ jsx(SelectItem, { value: col.key, children: col.title }, col.key)) })
@@ -9841,6 +9966,7 @@ function KanbanEditorFieldRow({
9841
9966
  )
9842
9967
  ] });
9843
9968
  }
9969
+ var t25 = createPackageT("hazo_ui", en_default);
9844
9970
  var EMPTY_FILTER = {
9845
9971
  search: "",
9846
9972
  categories: [],
@@ -9848,7 +9974,7 @@ var EMPTY_FILTER = {
9848
9974
  };
9849
9975
  function HazoUiKanbanFilter({
9850
9976
  search = true,
9851
- searchPlaceholder = "Search...",
9977
+ searchPlaceholder,
9852
9978
  categories,
9853
9979
  priorities,
9854
9980
  value,
@@ -9856,6 +9982,7 @@ function HazoUiKanbanFilter({
9856
9982
  onChange,
9857
9983
  className
9858
9984
  }) {
9985
+ const resolved_search_placeholder = searchPlaceholder ?? t25("common.search");
9859
9986
  const is_controlled = value !== void 0;
9860
9987
  const [internal, set_internal] = React27.useState(
9861
9988
  defaultValue ?? EMPTY_FILTER
@@ -9882,7 +10009,7 @@ function HazoUiKanbanFilter({
9882
10009
  {
9883
10010
  value: current.search,
9884
10011
  onChange: (e) => update({ ...current, search: e.target.value }),
9885
- placeholder: searchPlaceholder,
10012
+ placeholder: resolved_search_placeholder,
9886
10013
  className: "cls_hazo_kanban_filter_search w-full sm:w-64"
9887
10014
  }
9888
10015
  ),
@@ -9967,16 +10094,25 @@ function applyKanbanFilter(items, filter) {
9967
10094
  return true;
9968
10095
  });
9969
10096
  }
10097
+ var t26 = createPackageT("hazo_ui", en_default);
9970
10098
  var UNMATCHED_LANE_KEY = "__hazo_lane_unmatched__";
9971
10099
  function bucket_key(lane_key, column_key) {
9972
10100
  return lane_key == null ? column_key : `${lane_key}\0${column_key}`;
9973
10101
  }
9974
10102
  function default_announcements(itemLabel) {
9975
10103
  return {
9976
- 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.`,
9977
- onDragOver: ({ item, overColumn }) => overColumn ? `${itemLabel(item)} over ${overColumn}.` : "",
9978
- onDragEnd: ({ item, fromColumn, toColumn, newIndex }) => fromColumn === toColumn ? `${itemLabel(item)} reordered to position ${newIndex + 1} in ${toColumn}.` : `${itemLabel(item)} dropped in ${toColumn}, position ${newIndex + 1}.`,
9979
- onDragCancel: ({ item, fromColumn }) => `Movement cancelled. ${itemLabel(item)} returned to ${fromColumn}.`
10104
+ onDragStart: ({ item, fromColumn }) => t26("kanban.dnd_pickup", { item: itemLabel(item), column: fromColumn }),
10105
+ onDragOver: ({ item, overColumn }) => overColumn ? t26("kanban.dnd_over", { item: itemLabel(item), column: overColumn }) : "",
10106
+ onDragEnd: ({ item, fromColumn, toColumn, newIndex }) => fromColumn === toColumn ? t26("kanban.dnd_reorder", {
10107
+ item: itemLabel(item),
10108
+ pos: newIndex + 1,
10109
+ column: toColumn
10110
+ }) : t26("kanban.dnd_drop", {
10111
+ item: itemLabel(item),
10112
+ column: toColumn,
10113
+ pos: newIndex + 1
10114
+ }),
10115
+ onDragCancel: ({ item, fromColumn }) => t26("kanban.dnd_cancel", { item: itemLabel(item), column: fromColumn })
9980
10116
  };
9981
10117
  }
9982
10118
  function group_items_by_column(items, overlay, columns, lanes) {
@@ -10780,7 +10916,7 @@ function serializeFilter(filter) {
10780
10916
  const fields = (filter.fields ?? []).map((f) => `${f.field}:${f.operator ?? ""}:${String(f.value)}`).join(",");
10781
10917
  return `${filter.search ?? ""}|${fields}`;
10782
10918
  }
10783
- var t13 = createPackageT("hazo_ui", en_default);
10919
+ var t27 = createPackageT("hazo_ui", en_default);
10784
10920
  function HazoUiTable(props) {
10785
10921
  const state = useTableState(props);
10786
10922
  const { columns, rows, getRowKey, className, caption } = props;
@@ -10815,12 +10951,12 @@ function HazoUiTable(props) {
10815
10951
  ) }) : state.serverError != null ? /* @__PURE__ */ jsx("div", { className: "cls_hazo_ui_table_mobile_error py-6", children: renderErrorState(props.error, state.serverError) }) : state.displayed.length === 0 ? /* @__PURE__ */ jsx("div", { className: "cls_hazo_ui_table_mobile_empty py-6", children: noActiveFilters(state.filter) && rows.length === 0 ? typeof props.empty === "string" || props.empty === void 0 ? /* @__PURE__ */ jsx(
10816
10952
  EmptyState,
10817
10953
  {
10818
- title: typeof props.empty === "string" && props.empty || t13("table.empty")
10954
+ title: typeof props.empty === "string" && props.empty || t27("table.empty")
10819
10955
  }
10820
10956
  ) : props.empty : typeof props.noResults === "string" || props.noResults === void 0 ? /* @__PURE__ */ jsx(
10821
10957
  EmptyState,
10822
10958
  {
10823
- title: typeof props.noResults === "string" && props.noResults || t13("table.no_results")
10959
+ title: typeof props.noResults === "string" && props.noResults || t27("table.no_results")
10824
10960
  }
10825
10961
  ) : props.noResults }) : /* @__PURE__ */ jsx(
10826
10962
  TableMobileCards,
@@ -10843,7 +10979,7 @@ function HazoUiTable(props) {
10843
10979
  {
10844
10980
  type: "button",
10845
10981
  onClick: (e) => state.cycleHeaderSort(c.key, e.shiftKey),
10846
- title: t13("table.sort_tooltip"),
10982
+ title: t27("table.sort_tooltip"),
10847
10983
  className: "cls_hazo_ui_table_sort_btn inline-flex items-center gap-1 hover:text-foreground",
10848
10984
  children: [
10849
10985
  /* @__PURE__ */ jsx("span", { children: c.label }),
@@ -10875,12 +11011,12 @@ function HazoUiTable(props) {
10875
11011
  children: noActiveFilters(state.filter) && rows.length === 0 ? /* @__PURE__ */ jsx("div", { className: "cls_hazo_ui_table_empty_wrap py-6", children: typeof props.empty === "string" || props.empty === void 0 ? /* @__PURE__ */ jsx(
10876
11012
  EmptyState,
10877
11013
  {
10878
- title: typeof props.empty === "string" && props.empty || t13("table.empty")
11014
+ title: typeof props.empty === "string" && props.empty || t27("table.empty")
10879
11015
  }
10880
11016
  ) : props.empty }) : /* @__PURE__ */ jsx("div", { className: "cls_hazo_ui_table_no_results_wrap py-6", children: typeof props.noResults === "string" || props.noResults === void 0 ? /* @__PURE__ */ jsx(
10881
11017
  EmptyState,
10882
11018
  {
10883
- title: typeof props.noResults === "string" && props.noResults || t13("table.no_results")
11019
+ title: typeof props.noResults === "string" && props.noResults || t27("table.no_results")
10884
11020
  }
10885
11021
  ) : props.noResults })
10886
11022
  }
@@ -10994,7 +11130,7 @@ function PaginationFooter({
10994
11130
  const end = Math.min((page + 1) * pageSize, total);
10995
11131
  const lastPage = Math.max(0, Math.ceil(total / pageSize) - 1);
10996
11132
  return /* @__PURE__ */ jsxs("div", { className: "cls_hazo_ui_table_pagination flex items-center justify-between gap-3 pt-2 text-sm", children: [
10997
- /* @__PURE__ */ jsx("span", { className: "cls_hazo_ui_table_page_counter text-muted-foreground", children: t13("table.showing", {
11133
+ /* @__PURE__ */ jsx("span", { className: "cls_hazo_ui_table_page_counter text-muted-foreground", children: t27("table.showing", {
10998
11134
  start: String(start),
10999
11135
  end: String(end),
11000
11136
  total: String(total)
@@ -11007,8 +11143,8 @@ function PaginationFooter({
11007
11143
  size: "sm",
11008
11144
  onClick: () => onPageChange(Math.max(0, page - 1)),
11009
11145
  disabled: page === 0,
11010
- "aria-label": t13("table.prev_aria"),
11011
- children: t13("table.prev")
11146
+ "aria-label": t27("table.prev_aria"),
11147
+ children: t27("table.prev")
11012
11148
  }
11013
11149
  ),
11014
11150
  /* @__PURE__ */ jsx(
@@ -11018,8 +11154,8 @@ function PaginationFooter({
11018
11154
  size: "sm",
11019
11155
  onClick: () => onPageChange(Math.min(lastPage, page + 1)),
11020
11156
  disabled: page >= lastPage,
11021
- "aria-label": t13("table.next_aria"),
11022
- children: t13("table.next")
11157
+ "aria-label": t27("table.next_aria"),
11158
+ children: t27("table.next")
11023
11159
  }
11024
11160
  )
11025
11161
  ] })
@@ -11063,7 +11199,7 @@ function Toolbar2(props) {
11063
11199
  setSearchValue(v);
11064
11200
  onSearchChange(v);
11065
11201
  },
11066
- placeholder: searchPlaceholder ?? t13("table.search_placeholder"),
11202
+ placeholder: searchPlaceholder ?? t27("table.search_placeholder"),
11067
11203
  className: "cls_hazo_ui_table_search w-full sm:max-w-xs"
11068
11204
  }
11069
11205
  ) : /* @__PURE__ */ jsx("div", {}),
@@ -11111,8 +11247,8 @@ function renderErrorState(error, serverError) {
11111
11247
  return /* @__PURE__ */ jsx(
11112
11248
  EmptyState,
11113
11249
  {
11114
- title: t13("table.error_title"),
11115
- description: msg || t13("table.error_description")
11250
+ title: t27("table.error_title"),
11251
+ description: msg || t27("table.error_description")
11116
11252
  }
11117
11253
  );
11118
11254
  }
@@ -11348,18 +11484,20 @@ function StackedBars({
11348
11484
  }
11349
11485
  );
11350
11486
  }
11487
+ var t28 = createPackageT("hazo_ui", en_default);
11351
11488
  function DateRangeSelector({
11352
11489
  value,
11353
11490
  onChange,
11354
11491
  options,
11355
11492
  className,
11356
- ariaLabel = "Date range"
11493
+ ariaLabel
11357
11494
  }) {
11495
+ const resolved_aria = ariaLabel ?? t28("charts.date_range");
11358
11496
  return /* @__PURE__ */ jsx(
11359
11497
  "div",
11360
11498
  {
11361
11499
  role: "group",
11362
- "aria-label": ariaLabel,
11500
+ "aria-label": resolved_aria,
11363
11501
  className: cn(
11364
11502
  "cls_hazo_date_range_selector inline-flex items-center gap-0 rounded-md border bg-background p-0.5",
11365
11503
  className
@@ -11386,6 +11524,7 @@ function DateRangeSelector({
11386
11524
  }
11387
11525
  );
11388
11526
  }
11527
+ var t29 = createPackageT("hazo_ui", en_default);
11389
11528
  var PAD_LEFT2 = 80;
11390
11529
  var PAD_RIGHT2 = 72;
11391
11530
  var PAD_TOP2 = 12;
@@ -11536,12 +11675,12 @@ function FunnelChart({
11536
11675
  const bubble_anchor_y = bar_y + BAR_H / 2;
11537
11676
  const lines = [
11538
11677
  { text: step.label, accent: true },
11539
- { text: `Total: ${fmt(total)}`, accent: false },
11540
- { text: `% of first: ${pct_first}%`, accent: false }
11678
+ { text: t29("charts.total", { value: fmt(total) }), accent: false },
11679
+ { text: t29("charts.pct_of_first", { pct: pct_first }), accent: false }
11541
11680
  ];
11542
11681
  if (i > 0) {
11543
- lines.push({ text: `% of prev: ${pct_prev}%`, accent: false });
11544
- lines.push({ text: `Drop-off: \u2212${fmt(dropoff)}`, accent: false });
11682
+ lines.push({ text: t29("charts.pct_of_prev", { pct: pct_prev }), accent: false });
11683
+ lines.push({ text: t29("charts.dropoff", { value: fmt(dropoff) }), accent: false });
11545
11684
  }
11546
11685
  if (step.segments) {
11547
11686
  step.segments.forEach((seg) => {
@@ -11602,6 +11741,7 @@ function FunnelChart({
11602
11741
 
11603
11742
  // src/assets/celebration-chime.mp3
11604
11743
  var celebration_chime_default = "data:text/plain;charset=utf-8,";
11744
+ var t30 = createPackageT("hazo_ui", en_default);
11605
11745
  var CELEBRATION_GRADIENT = "linear-gradient(135deg, #667eea 0%, #764ba2 100%)";
11606
11746
  var CARD_SIZE = 1080;
11607
11747
  var PREVIEW_SIZE = 400;
@@ -11799,7 +11939,7 @@ function CelebrationModalInner({
11799
11939
  {
11800
11940
  className: "cls_celebration_close_btn absolute top-3 right-3 z-10 p-1.5 rounded-full hover:bg-black/10 transition-colors",
11801
11941
  onClick: close_modal,
11802
- "aria-label": "Close celebration",
11942
+ "aria-label": t30("celebration.close"),
11803
11943
  children: /* @__PURE__ */ jsx(X, { className: "h-4 w-4 text-gray-600" })
11804
11944
  }
11805
11945
  ),
@@ -11862,21 +12002,21 @@ function CelebrationModalInner({
11862
12002
  disabled: is_downloading,
11863
12003
  children: [
11864
12004
  is_downloading ? /* @__PURE__ */ jsx(Loader2, { className: "h-3.5 w-3.5 mr-1.5 animate-spin" }) : /* @__PURE__ */ jsx(Download, { className: "h-3.5 w-3.5 mr-1.5" }),
11865
- "Download PNG"
12005
+ t30("celebration.download_png")
11866
12006
  ]
11867
12007
  }
11868
12008
  ),
11869
12009
  can_share && /* @__PURE__ */ jsxs(Button, { variant: "outline", size: "sm", onClick: handle_share, children: [
11870
12010
  /* @__PURE__ */ jsx(Share2, { className: "h-3.5 w-3.5 mr-1.5" }),
11871
- "Share"
12011
+ t30("celebration.share")
11872
12012
  ] }),
11873
12013
  /* @__PURE__ */ jsxs(Button, { variant: "outline", size: "sm", onClick: handle_copy, children: [
11874
12014
  /* @__PURE__ */ jsx(Copy, { className: "h-3.5 w-3.5 mr-1.5" }),
11875
- "Copy image"
12015
+ t30("celebration.copy_image")
11876
12016
  ] })
11877
12017
  ] })
11878
12018
  ] }),
11879
- !shareableCard && /* @__PURE__ */ jsx("div", { className: "cls_celebration_footer pb-8", children: /* @__PURE__ */ jsx(Button, { size: "sm", onClick: close_modal, children: "Dismiss" }) })
12019
+ !shareableCard && /* @__PURE__ */ jsx("div", { className: "cls_celebration_footer pb-8", children: /* @__PURE__ */ jsx(Button, { size: "sm", onClick: close_modal, children: t30("celebration.dismiss") }) })
11880
12020
  ]
11881
12021
  }
11882
12022
  )
@@ -11898,8 +12038,8 @@ function computeEta(durationWindow, unitCount, concurrency = 1, fallbackUnitMs =
11898
12038
  }
11899
12039
  function easeToward(elapsed, eta, maxCap = 0.95) {
11900
12040
  if (eta <= 0 || elapsed <= 0) return 0;
11901
- const t14 = elapsed / eta;
11902
- return maxCap * (1 - Math.exp(-1.5 * t14));
12041
+ const t35 = elapsed / eta;
12042
+ return maxCap * (1 - Math.exp(-1.5 * t35));
11903
12043
  }
11904
12044
  function HazoUiProgressBar({
11905
12045
  value,
@@ -12075,13 +12215,16 @@ function upsertEntry(entries, entry) {
12075
12215
  function removeEntry(entries, id) {
12076
12216
  return entries.filter((e) => e.id !== id);
12077
12217
  }
12218
+ var t31 = createPackageT("hazo_ui", en_default);
12078
12219
  function HazoUiMemoryDropdown({
12079
12220
  history_key,
12080
- placeholder = "Search history\u2026",
12221
+ placeholder,
12081
12222
  on_select,
12082
12223
  add_entry,
12083
- empty_label = "No history yet"
12224
+ empty_label
12084
12225
  }) {
12226
+ const resolved_placeholder = placeholder ?? t31("memory.search_placeholder");
12227
+ const resolved_empty_label = empty_label ?? t31("memory.no_history");
12085
12228
  const { value: stored, setValue } = useHazoState(history_key, {
12086
12229
  level: "scope",
12087
12230
  fallback: []
@@ -12119,7 +12262,7 @@ function HazoUiMemoryDropdown({
12119
12262
  type: "text",
12120
12263
  value: query,
12121
12264
  onChange: (e) => setQuery(e.target.value),
12122
- placeholder,
12265
+ placeholder: resolved_placeholder,
12123
12266
  style: {
12124
12267
  width: "100%",
12125
12268
  background: "#FFFFFF",
@@ -12149,7 +12292,7 @@ function HazoUiMemoryDropdown({
12149
12292
  fontStyle: "italic",
12150
12293
  fontSize: 13
12151
12294
  },
12152
- children: empty_label
12295
+ children: resolved_empty_label
12153
12296
  }
12154
12297
  ) : filtered.map((entry) => /* @__PURE__ */ jsx(
12155
12298
  EntryRow,
@@ -12206,7 +12349,7 @@ function EntryRow({ entry, on_select, onDelete }) {
12206
12349
  onClick: (e) => onDelete(entry.id, e),
12207
12350
  onMouseEnter: () => setDeleteHovered(true),
12208
12351
  onMouseLeave: () => setDeleteHovered(false),
12209
- "aria-label": `Remove ${entry.label} from history`,
12352
+ "aria-label": t31("memory.remove_aria", { label: entry.label }),
12210
12353
  style: {
12211
12354
  flexShrink: 0,
12212
12355
  background: "none",
@@ -12225,6 +12368,7 @@ function EntryRow({ entry, on_select, onDelete }) {
12225
12368
  }
12226
12369
  );
12227
12370
  }
12371
+ var t32 = createPackageT("hazo_ui", en_default);
12228
12372
  function Logo({
12229
12373
  logoUrl,
12230
12374
  logoUrlDark,
@@ -12234,7 +12378,7 @@ function Logo({
12234
12378
  className,
12235
12379
  imgClassName
12236
12380
  }) {
12237
- const alt = appTitle ?? "Logo";
12381
+ const alt = appTitle ?? t32("app_logo.alt_fallback");
12238
12382
  let content = null;
12239
12383
  if (logoUrl) {
12240
12384
  content = /* @__PURE__ */ jsxs(Fragment$1, { children: [
@@ -12269,11 +12413,12 @@ function Logo({
12269
12413
  }
12270
12414
  return /* @__PURE__ */ jsx("div", { className: cn("inline-flex items-center gap-2", className), children: content });
12271
12415
  }
12416
+ var t33 = createPackageT("hazo_ui", en_default);
12272
12417
  function AppHeader({ identity, homeHref, navItems, actions, className }) {
12273
12418
  return /* @__PURE__ */ jsxs(
12274
12419
  "header",
12275
12420
  {
12276
- "aria-label": "Application header",
12421
+ "aria-label": t33("app_header.aria_label"),
12277
12422
  className: cn(
12278
12423
  "flex w-full items-center justify-between gap-4 border-b bg-navbar text-navbar-fg border-navbar-border px-4 py-2.5",
12279
12424
  className
@@ -12781,6 +12926,7 @@ function HazoBrowserTab({
12781
12926
  }
12782
12927
  );
12783
12928
  }
12929
+ var t34 = createPackageT("hazo_ui", en_default);
12784
12930
  var native_name_cache = /* @__PURE__ */ new Map();
12785
12931
  function get_native_name(code) {
12786
12932
  const cached = native_name_cache.get(code);
@@ -12852,9 +12998,10 @@ function LocalePicker({
12852
12998
  flags = false,
12853
12999
  alternates,
12854
13000
  activeLocale,
12855
- triggerLabel = "Change language",
13001
+ triggerLabel,
12856
13002
  className
12857
13003
  }) {
13004
+ const resolved_trigger_label = triggerLabel ?? t34("locale_picker.change_language");
12858
13005
  const options = React27.useMemo(() => {
12859
13006
  return Object.entries(alternates ?? {}).map(([code, url]) => {
12860
13007
  const href = safeHref(url);
@@ -12869,7 +13016,7 @@ function LocalePicker({
12869
13016
  return /* @__PURE__ */ jsx(
12870
13017
  "nav",
12871
13018
  {
12872
- "aria-label": triggerLabel,
13019
+ "aria-label": resolved_trigger_label,
12873
13020
  className: cn("cls_locale_picker_inline flex items-center gap-1", className),
12874
13021
  children: options.map((opt) => /* @__PURE__ */ jsxs(
12875
13022
  "a",
@@ -12899,7 +13046,7 @@ function LocalePicker({
12899
13046
  variant: "outline",
12900
13047
  size: "sm",
12901
13048
  lang: activeLocale,
12902
- "aria-label": triggerLabel,
13049
+ "aria-label": resolved_trigger_label,
12903
13050
  className: cn("cls_locale_picker_trigger gap-1.5", className),
12904
13051
  children: [
12905
13052
  flags && /* @__PURE__ */ jsx(FlagIcon, { code: active_option?.code ?? options[0].code }),