@almadar/ui 5.163.0 → 5.165.0

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.
@@ -22562,6 +22562,7 @@ var init_DashboardLayout = __esm({
22562
22562
  onNotificationClick,
22563
22563
  showThemeToggle = true,
22564
22564
  sidebarFooter,
22565
+ sidebarContent,
22565
22566
  onSignOut: onSignOutProp,
22566
22567
  currentPath,
22567
22568
  layoutMode = "sidebar",
@@ -22691,7 +22692,11 @@ var init_DashboardLayout = __esm({
22691
22692
  {
22692
22693
  as: "nav",
22693
22694
  gap: "none",
22694
- className: cn("flex-1 py-4 space-y-1 overflow-y-auto", isRail ? "px-2" : "px-3"),
22695
+ className: cn(
22696
+ "py-4 space-y-1 overflow-y-auto",
22697
+ sidebarContent && !isRail ? "shrink-0" : "flex-1",
22698
+ isRail ? "px-2" : "px-3"
22699
+ ),
22695
22700
  children: navItems.map((item) => /* @__PURE__ */ jsx(
22696
22701
  NavLink,
22697
22702
  {
@@ -22703,6 +22708,7 @@ var init_DashboardLayout = __esm({
22703
22708
  ))
22704
22709
  }
22705
22710
  ),
22711
+ sidebarContent && !isRail && /* @__PURE__ */ jsx(Box, { className: "flex-1 overflow-y-auto border-t border-border dark:border-border px-2 py-3", children: sidebarContent }),
22706
22712
  sidebarFooter && /* @__PURE__ */ jsx(Box, { className: "p-4 border-t border-border dark:border-border", children: sidebarFooter })
22707
22713
  ]
22708
22714
  }
@@ -25576,6 +25582,8 @@ function FieldControl({
25576
25582
  control = /* @__PURE__ */ jsx(TextLikeControl, { field: name, numeric: true, value, onCommit: onChange });
25577
25583
  } else if (isSecretConfigType(decl.type)) {
25578
25584
  control = /* @__PURE__ */ jsx(TextLikeControl, { field: name, numeric: false, secret: true, value, onCommit: onChange });
25585
+ } else if (decl.type === "event") {
25586
+ control = /* @__PURE__ */ jsx(TextLikeControl, { field: name, numeric: false, value, onCommit: onChange });
25579
25587
  } else if (decl.type === "string") {
25580
25588
  control = /* @__PURE__ */ jsx(TextLikeControl, { field: name, numeric: false, value, onCommit: onChange });
25581
25589
  } else if (decl.type === "node") {
@@ -25615,7 +25623,7 @@ var init_PropertyInspector = __esm({
25615
25623
  init_JsonTreeEditor();
25616
25624
  init_NodeSlotEditor();
25617
25625
  TIER_ORDER = ["presentation", "domain", "policy", "infra", "internal"];
25618
- SCALAR_TYPES = /* @__PURE__ */ new Set(["string", "number", "boolean", "icon", "asset", "Asset", "secret"]);
25626
+ SCALAR_TYPES = /* @__PURE__ */ new Set(["string", "number", "boolean", "icon", "asset", "Asset", "secret", "event"]);
25619
25627
  PropertyInspector = ({
25620
25628
  config,
25621
25629
  values,
@@ -25773,7 +25781,17 @@ function fileIcon(name) {
25773
25781
  return "file";
25774
25782
  }
25775
25783
  }
25776
- var TreeNodeItem, FlatTreeNodeItem, FileTree;
25784
+ function ancestorsOf(id, byId) {
25785
+ const out = /* @__PURE__ */ new Set();
25786
+ if (!id) return out;
25787
+ let cur = byId.get(id)?.parentId;
25788
+ while (cur && byId.has(cur) && !out.has(cur)) {
25789
+ out.add(cur);
25790
+ cur = byId.get(cur)?.parentId;
25791
+ }
25792
+ return out;
25793
+ }
25794
+ var TreeNodeItem, FlatTreeNodeItem, FlatFileTree, FileTree;
25777
25795
  var init_FileTree = __esm({
25778
25796
  "components/core/molecules/FileTree.tsx"() {
25779
25797
  "use client";
@@ -25864,42 +25882,77 @@ var init_FileTree = __esm({
25864
25882
  indent,
25865
25883
  childrenByParent,
25866
25884
  onNodeSelect,
25867
- defaultExpanded = false
25885
+ onNodeAction,
25886
+ nodeActionIcon,
25887
+ nodeActionLabel,
25888
+ selectedId,
25889
+ look,
25890
+ isExpanded,
25891
+ onToggle
25868
25892
  }) => {
25869
- const [expanded, setExpanded] = useState(defaultExpanded || depth < 1);
25870
25893
  const children = childrenByParent.get(item.id);
25871
25894
  const hasChildren = !!children && children.length > 0;
25895
+ const expanded = hasChildren && isExpanded(item.id, depth);
25896
+ const isSelected = selectedId !== void 0 && selectedId !== "" && item.id === selectedId;
25897
+ const nav = look === "nav";
25872
25898
  const handleClick = useCallback(() => {
25873
- if (hasChildren) setExpanded((prev) => !prev);
25899
+ if (hasChildren && !onNodeSelect) onToggle(item.id, expanded);
25874
25900
  onNodeSelect?.(item.id);
25875
- }, [hasChildren, item.id, onNodeSelect]);
25901
+ }, [hasChildren, expanded, item.id, onNodeSelect, onToggle]);
25902
+ const handleChevron = useCallback((e) => {
25903
+ e.stopPropagation();
25904
+ onToggle(item.id, expanded);
25905
+ }, [item.id, expanded, onToggle]);
25906
+ const handleAction = useCallback((e) => {
25907
+ e.stopPropagation();
25908
+ onNodeAction?.(item.id);
25909
+ }, [item.id, onNodeAction]);
25876
25910
  return /* @__PURE__ */ jsxs(Fragment, { children: [
25877
25911
  /* @__PURE__ */ jsxs(
25878
25912
  Box,
25879
25913
  {
25880
- className: "flex items-center gap-1.5 py-0.5 px-2 cursor-pointer rounded-sm transition-colors hover:bg-muted",
25914
+ className: `group/treerow flex items-center gap-1.5 px-2 cursor-pointer rounded-sm transition-colors ${nav ? "py-1" : "py-0.5"} ${isSelected ? "bg-primary text-primary-foreground" : nav ? "text-foreground hover:bg-muted" : "hover:bg-muted"}`,
25881
25915
  style: { paddingLeft: depth * indent + 8 },
25882
25916
  onClick: handleClick,
25883
25917
  role: "treeitem",
25918
+ "aria-selected": isSelected,
25884
25919
  "aria-expanded": hasChildren ? expanded : void 0,
25885
25920
  children: [
25886
- hasChildren ? /* @__PURE__ */ jsx(
25921
+ hasChildren ? /* @__PURE__ */ jsx(Box, { onClick: handleChevron, className: "flex items-center flex-shrink-0", role: "button", "aria-label": expanded ? "Collapse" : "Expand", children: /* @__PURE__ */ jsx(
25887
25922
  Icon,
25888
25923
  {
25889
25924
  name: expanded ? "chevron-down" : "chevron-right",
25890
25925
  size: "xs",
25891
- className: "text-[var(--color-muted-foreground)] flex-shrink-0"
25926
+ className: isSelected ? "text-inherit" : "text-[var(--color-muted-foreground)]"
25892
25927
  }
25893
- ) : /* @__PURE__ */ jsx(Box, { style: { width: 12, flexShrink: 0 } }),
25928
+ ) }) : /* @__PURE__ */ jsx(Box, { style: { width: 12, flexShrink: 0 } }),
25894
25929
  /* @__PURE__ */ jsx(
25895
25930
  Icon,
25896
25931
  {
25897
- name: item.icon ?? (hasChildren ? expanded ? "folder-open" : "folder" : "file"),
25932
+ name: item.icon || (nav ? "file-text" : hasChildren ? expanded ? "folder-open" : "folder" : "file"),
25898
25933
  size: "xs",
25899
- className: hasChildren ? "text-[var(--color-warning)]" : "text-[var(--color-muted-foreground)]"
25934
+ className: isSelected ? "text-inherit" : nav || !hasChildren ? "text-[var(--color-muted-foreground)]" : "text-[var(--color-warning)]"
25935
+ }
25936
+ ),
25937
+ /* @__PURE__ */ jsx(
25938
+ Typography,
25939
+ {
25940
+ variant: "caption",
25941
+ className: `truncate ${nav ? "text-sm" : "font-mono text-xs"} !text-inherit ${isSelected ? "font-semibold" : ""}`,
25942
+ children: item.label
25900
25943
  }
25901
25944
  ),
25902
- /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "truncate font-mono text-xs", children: item.label })
25945
+ onNodeAction && /* @__PURE__ */ jsx(
25946
+ Box,
25947
+ {
25948
+ onClick: handleAction,
25949
+ role: "button",
25950
+ "aria-label": nodeActionLabel ?? "Node action",
25951
+ title: nodeActionLabel,
25952
+ className: `ml-auto flex-shrink-0 rounded-sm p-0.5 opacity-0 group-hover/treerow:opacity-100 transition-opacity ${isSelected ? "hover:bg-primary-foreground/20" : "hover:bg-border"}`,
25953
+ children: /* @__PURE__ */ jsx(Icon, { name: nodeActionIcon ?? "plus", size: "xs", className: "text-inherit" })
25954
+ }
25955
+ )
25903
25956
  ]
25904
25957
  }
25905
25958
  ),
@@ -25910,47 +25963,116 @@ var init_FileTree = __esm({
25910
25963
  depth: depth + 1,
25911
25964
  indent,
25912
25965
  childrenByParent,
25913
- onNodeSelect
25966
+ onNodeSelect,
25967
+ onNodeAction,
25968
+ nodeActionIcon,
25969
+ nodeActionLabel,
25970
+ selectedId,
25971
+ look,
25972
+ isExpanded,
25973
+ onToggle
25914
25974
  },
25915
25975
  child.id
25916
25976
  )) })
25917
25977
  ] });
25918
25978
  };
25979
+ FlatFileTree = ({
25980
+ items,
25981
+ selectedId,
25982
+ look = "files",
25983
+ onNodeSelect,
25984
+ onNodeAction,
25985
+ nodeActionIcon,
25986
+ nodeActionLabel,
25987
+ className,
25988
+ indent = 16
25989
+ }) => {
25990
+ const [overrides, setOverrides] = useState(() => /* @__PURE__ */ new Map());
25991
+ const byId = React77__default.useMemo(() => new Map(items.map((node) => [node.id, node])), [items]);
25992
+ const selectedAncestors = React77__default.useMemo(() => ancestorsOf(selectedId, byId), [selectedId, byId]);
25993
+ const lastSelectedRef = React77__default.useRef(selectedId);
25994
+ React77__default.useEffect(() => {
25995
+ if (selectedId === lastSelectedRef.current) return;
25996
+ lastSelectedRef.current = selectedId;
25997
+ setOverrides((prev) => {
25998
+ if (![...selectedAncestors].some((a) => prev.get(a) === false)) return prev;
25999
+ const next = new Map(prev);
26000
+ for (const a of selectedAncestors) if (next.get(a) === false) next.delete(a);
26001
+ return next;
26002
+ });
26003
+ }, [selectedId, selectedAncestors]);
26004
+ const isExpanded = useCallback(
26005
+ (id, depth) => overrides.get(id) ?? (depth < 1 || selectedAncestors.has(id)),
26006
+ [overrides, selectedAncestors]
26007
+ );
26008
+ const onToggle = useCallback((id, effective) => {
26009
+ setOverrides((prev) => {
26010
+ const next = new Map(prev);
26011
+ next.set(id, !effective);
26012
+ return next;
26013
+ });
26014
+ }, []);
26015
+ if (items.length === 0) return null;
26016
+ const ids = new Set(items.map((node) => node.id));
26017
+ const childrenByParent = /* @__PURE__ */ new Map();
26018
+ const roots = [];
26019
+ for (const item of items) {
26020
+ if (item.parentId && ids.has(item.parentId)) {
26021
+ const siblings = childrenByParent.get(item.parentId);
26022
+ if (siblings) siblings.push(item);
26023
+ else childrenByParent.set(item.parentId, [item]);
26024
+ } else {
26025
+ roots.push(item);
26026
+ }
26027
+ }
26028
+ return /* @__PURE__ */ jsx(Box, { className: `py-1 overflow-y-auto ${className ?? ""}`, role: "tree", children: roots.map((item) => /* @__PURE__ */ jsx(
26029
+ FlatTreeNodeItem,
26030
+ {
26031
+ item,
26032
+ depth: 0,
26033
+ indent,
26034
+ childrenByParent,
26035
+ onNodeSelect,
26036
+ onNodeAction,
26037
+ nodeActionIcon,
26038
+ nodeActionLabel,
26039
+ selectedId,
26040
+ look,
26041
+ isExpanded,
26042
+ onToggle
26043
+ },
26044
+ item.id
26045
+ )) });
26046
+ };
25919
26047
  FileTree = ({
25920
26048
  tree,
25921
26049
  items,
25922
26050
  selectedPath,
26051
+ selectedId,
26052
+ look = "files",
25923
26053
  onFileSelect,
25924
26054
  onNodeSelect,
26055
+ onNodeAction,
26056
+ nodeActionIcon,
26057
+ nodeActionLabel,
25925
26058
  className,
25926
26059
  indent = 16
25927
26060
  }) => {
25928
26061
  if (items) {
25929
- if (items.length === 0) return null;
25930
- const ids = new Set(items.map((node) => node.id));
25931
- const childrenByParent = /* @__PURE__ */ new Map();
25932
- const roots = [];
25933
- for (const item of items) {
25934
- if (item.parentId && ids.has(item.parentId)) {
25935
- const siblings = childrenByParent.get(item.parentId);
25936
- if (siblings) siblings.push(item);
25937
- else childrenByParent.set(item.parentId, [item]);
25938
- } else {
25939
- roots.push(item);
25940
- }
25941
- }
25942
- return /* @__PURE__ */ jsx(Box, { className: `py-1 overflow-y-auto ${className ?? ""}`, role: "tree", children: roots.map((item) => /* @__PURE__ */ jsx(
25943
- FlatTreeNodeItem,
26062
+ return /* @__PURE__ */ jsx(
26063
+ FlatFileTree,
25944
26064
  {
25945
- item,
25946
- depth: 0,
25947
- indent,
25948
- childrenByParent,
26065
+ items,
26066
+ selectedId,
26067
+ look,
25949
26068
  onNodeSelect,
25950
- defaultExpanded: true
25951
- },
25952
- item.id
25953
- )) });
26069
+ onNodeAction,
26070
+ nodeActionIcon,
26071
+ nodeActionLabel,
26072
+ className,
26073
+ indent
26074
+ }
26075
+ );
25954
26076
  }
25955
26077
  if (!tree || tree.length === 0) return null;
25956
26078
  return /* @__PURE__ */ jsx(Box, { className: `py-1 overflow-y-auto ${className ?? ""}`, role: "tree", children: tree.map((node) => /* @__PURE__ */ jsx(
@@ -38084,13 +38206,35 @@ var init_RichTextEditor = __esm({
38084
38206
  document.execCommand("createLink", false, safe);
38085
38207
  afterEdit();
38086
38208
  }, [afterEdit, t, toolbar.link]);
38209
+ const imageInputRef = useRef(null);
38210
+ const savedRangeRef = useRef(null);
38087
38211
  const execImage = useCallback(() => {
38088
- const url = window.prompt(t("richTextEditor.imagePrompt"));
38089
- if (!url) return;
38090
- const safe = safeUrl(url, ["http://", "https://", "data:image/"]) ?? `https://${url}`;
38091
- document.execCommand("insertImage", false, safe);
38092
- afterEdit();
38093
- }, [afterEdit, t]);
38212
+ const root = ref.current;
38213
+ const sel = window.getSelection();
38214
+ savedRangeRef.current = root && sel && sel.rangeCount > 0 && root.contains(sel.anchorNode) ? sel.getRangeAt(0).cloneRange() : null;
38215
+ imageInputRef.current?.click();
38216
+ }, []);
38217
+ const handleImageFile = useCallback((e) => {
38218
+ const file = e.target.files?.[0];
38219
+ e.target.value = "";
38220
+ if (!file) return;
38221
+ const reader = new FileReader();
38222
+ reader.onload = () => {
38223
+ const url = typeof reader.result === "string" ? reader.result : "";
38224
+ if (!url.startsWith("data:image/")) return;
38225
+ const root = ref.current;
38226
+ if (!root) return;
38227
+ root.focus();
38228
+ const sel = window.getSelection();
38229
+ if (sel && savedRangeRef.current && root.contains(savedRangeRef.current.startContainer)) {
38230
+ sel.removeAllRanges();
38231
+ sel.addRange(savedRangeRef.current);
38232
+ }
38233
+ document.execCommand("insertImage", false, url);
38234
+ afterEdit();
38235
+ };
38236
+ reader.readAsDataURL(file);
38237
+ }, [afterEdit]);
38094
38238
  const execRule = useCallback(() => {
38095
38239
  document.execCommand("insertHorizontalRule", false);
38096
38240
  afterEdit();
@@ -38103,6 +38247,18 @@ var init_RichTextEditor = __esm({
38103
38247
  }
38104
38248
  return /* @__PURE__ */ jsxs(Box, { className: cn("flex flex-col gap-2", className), children: [
38105
38249
  /* @__PURE__ */ jsx(RichTextStyles, {}),
38250
+ /* @__PURE__ */ jsx(
38251
+ "input",
38252
+ {
38253
+ ref: imageInputRef,
38254
+ type: "file",
38255
+ accept: "image/*",
38256
+ className: "hidden",
38257
+ "aria-hidden": "true",
38258
+ tabIndex: -1,
38259
+ onChange: handleImageFile
38260
+ }
38261
+ ),
38106
38262
  showToolbar && /* @__PURE__ */ jsxs(
38107
38263
  Box,
38108
38264
  {
@@ -45229,15 +45385,6 @@ var init_Form = __esm({
45229
45385
  "data-testid": `image-preview-${fieldName2}`
45230
45386
  }
45231
45387
  ) : null,
45232
- /* @__PURE__ */ jsx(
45233
- Input,
45234
- {
45235
- ...commonProps,
45236
- type: "url",
45237
- value: imageUrl,
45238
- onChange: (e) => handleChange(fieldName2, e.target.value)
45239
- }
45240
- ),
45241
45388
  /* @__PURE__ */ jsx(
45242
45389
  UploadDropZone,
45243
45390
  {
@@ -45256,6 +45403,16 @@ var init_Form = __esm({
45256
45403
  reader.readAsDataURL(f3);
45257
45404
  }
45258
45405
  }
45406
+ ),
45407
+ /* @__PURE__ */ jsx(
45408
+ Input,
45409
+ {
45410
+ ...commonProps,
45411
+ type: "url",
45412
+ placeholder: t("form.imageUrlFallback"),
45413
+ value: imageUrl,
45414
+ onChange: (e) => handleChange(fieldName2, e.target.value)
45415
+ }
45259
45416
  )
45260
45417
  ] });
45261
45418
  }
@@ -54027,7 +54184,8 @@ var en_default = {
54027
54184
  "richTextEditor.linkPrompt": "Link address",
54028
54185
  "richTextEditor.image": "Insert image",
54029
54186
  "richTextEditor.imagePrompt": "Image URL",
54030
- "richTextEditor.placeholder": "Start writing\u2026"
54187
+ "richTextEditor.placeholder": "Start writing\u2026",
54188
+ "form.imageUrlFallback": "\u2026or paste an image address"
54031
54189
  };
54032
54190
 
54033
54191
  // hooks/useTranslate.ts
@@ -2214,7 +2214,8 @@ var en_default = {
2214
2214
  "richTextEditor.linkPrompt": "Link address",
2215
2215
  "richTextEditor.image": "Insert image",
2216
2216
  "richTextEditor.imagePrompt": "Image URL",
2217
- "richTextEditor.placeholder": "Start writing\u2026"
2217
+ "richTextEditor.placeholder": "Start writing\u2026",
2218
+ "form.imageUrlFallback": "\u2026or paste an image address"
2218
2219
  };
2219
2220
 
2220
2221
  // hooks/useTranslate.ts
@@ -2209,7 +2209,8 @@ var en_default = {
2209
2209
  "richTextEditor.linkPrompt": "Link address",
2210
2210
  "richTextEditor.image": "Insert image",
2211
2211
  "richTextEditor.imagePrompt": "Image URL",
2212
- "richTextEditor.placeholder": "Start writing\u2026"
2212
+ "richTextEditor.placeholder": "Start writing\u2026",
2213
+ "form.imageUrlFallback": "\u2026or paste an image address"
2213
2214
  };
2214
2215
 
2215
2216
  // hooks/useTranslate.ts
@@ -553,7 +553,8 @@ var en_default = {
553
553
  "richTextEditor.linkPrompt": "Link address",
554
554
  "richTextEditor.image": "Insert image",
555
555
  "richTextEditor.imagePrompt": "Image URL",
556
- "richTextEditor.placeholder": "Start writing\u2026"
556
+ "richTextEditor.placeholder": "Start writing\u2026",
557
+ "form.imageUrlFallback": "\u2026or paste an image address"
557
558
  };
558
559
 
559
560
  // locales/ar.json
@@ -1109,7 +1110,8 @@ var ar_default = {
1109
1110
  "richTextEditor.linkPrompt": "\u0639\u0646\u0648\u0627\u0646 \u0627\u0644\u0631\u0627\u0628\u0637",
1110
1111
  "richTextEditor.image": "\u0625\u062F\u0631\u0627\u062C \u0635\u0648\u0631\u0629",
1111
1112
  "richTextEditor.imagePrompt": "\u0631\u0627\u0628\u0637 \u0627\u0644\u0635\u0648\u0631\u0629",
1112
- "richTextEditor.placeholder": "\u0627\u0628\u062F\u0623 \u0627\u0644\u0643\u062A\u0627\u0628\u0629\u2026"
1113
+ "richTextEditor.placeholder": "\u0627\u0628\u062F\u0623 \u0627\u0644\u0643\u062A\u0627\u0628\u0629\u2026",
1114
+ "form.imageUrlFallback": "\u2026\u0623\u0648 \u0627\u0644\u0635\u0642 \u0631\u0627\u0628\u0637 \u0627\u0644\u0635\u0648\u0631\u0629"
1113
1115
  };
1114
1116
 
1115
1117
  // locales/sl.json
@@ -1665,7 +1667,8 @@ var sl_default = {
1665
1667
  "richTextEditor.linkPrompt": "Naslov povezave",
1666
1668
  "richTextEditor.image": "Vstavi sliko",
1667
1669
  "richTextEditor.imagePrompt": "URL slike",
1668
- "richTextEditor.placeholder": "Za\u010Dnite pisati \u2026"
1670
+ "richTextEditor.placeholder": "Za\u010Dnite pisati \u2026",
1671
+ "form.imageUrlFallback": "\u2026ali prilepite naslov slike"
1669
1672
  };
1670
1673
 
1671
1674
  // locales/index.ts
@@ -551,7 +551,8 @@ var en_default = {
551
551
  "richTextEditor.linkPrompt": "Link address",
552
552
  "richTextEditor.image": "Insert image",
553
553
  "richTextEditor.imagePrompt": "Image URL",
554
- "richTextEditor.placeholder": "Start writing\u2026"
554
+ "richTextEditor.placeholder": "Start writing\u2026",
555
+ "form.imageUrlFallback": "\u2026or paste an image address"
555
556
  };
556
557
 
557
558
  // locales/ar.json
@@ -1107,7 +1108,8 @@ var ar_default = {
1107
1108
  "richTextEditor.linkPrompt": "\u0639\u0646\u0648\u0627\u0646 \u0627\u0644\u0631\u0627\u0628\u0637",
1108
1109
  "richTextEditor.image": "\u0625\u062F\u0631\u0627\u062C \u0635\u0648\u0631\u0629",
1109
1110
  "richTextEditor.imagePrompt": "\u0631\u0627\u0628\u0637 \u0627\u0644\u0635\u0648\u0631\u0629",
1110
- "richTextEditor.placeholder": "\u0627\u0628\u062F\u0623 \u0627\u0644\u0643\u062A\u0627\u0628\u0629\u2026"
1111
+ "richTextEditor.placeholder": "\u0627\u0628\u062F\u0623 \u0627\u0644\u0643\u062A\u0627\u0628\u0629\u2026",
1112
+ "form.imageUrlFallback": "\u2026\u0623\u0648 \u0627\u0644\u0635\u0642 \u0631\u0627\u0628\u0637 \u0627\u0644\u0635\u0648\u0631\u0629"
1111
1113
  };
1112
1114
 
1113
1115
  // locales/sl.json
@@ -1663,7 +1665,8 @@ var sl_default = {
1663
1665
  "richTextEditor.linkPrompt": "Naslov povezave",
1664
1666
  "richTextEditor.image": "Vstavi sliko",
1665
1667
  "richTextEditor.imagePrompt": "URL slike",
1666
- "richTextEditor.placeholder": "Za\u010Dnite pisati \u2026"
1668
+ "richTextEditor.placeholder": "Za\u010Dnite pisati \u2026",
1669
+ "form.imageUrlFallback": "\u2026ali prilepite naslov slike"
1667
1670
  };
1668
1671
 
1669
1672
  // locales/index.ts