lew-ui 2.6.36 → 2.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -21928,7 +21928,9 @@ const _sfc_main$i = /* @__PURE__ */ defineComponent({
21928
21928
  };
21929
21929
  const hasPartialSelection = computed(() => {
21930
21930
  const selectedRowsMap = state.selectedRowsMap;
21931
- return state.dataSource.some((row) => selectedRowsMap[row[props2.rowKey]]);
21931
+ return state.dataSource.some(
21932
+ (row) => selectedRowsMap[row[props2.rowKey]]
21933
+ );
21932
21934
  });
21933
21935
  const updateAllCheckedState = () => {
21934
21936
  const checkedKeys = keys(pickBy(state.selectedRowsMap, Boolean));
@@ -21986,18 +21988,25 @@ const _sfc_main$i = /* @__PURE__ */ defineComponent({
21986
21988
  if (column.sortable) {
21987
21989
  tdClass.push("lew-table-td-sortable");
21988
21990
  }
21991
+ const xMap = {
21992
+ start: "start",
21993
+ left: "start",
21994
+ center: "center",
21995
+ right: "end",
21996
+ end: "end"
21997
+ };
21989
21998
  const tdStyle = {
21990
21999
  display: "flex",
21991
22000
  flexDirection: "column",
21992
22001
  width: any2px(column.width),
21993
22002
  justifyContent: "center",
21994
- alignItems: column.x || "start"
22003
+ alignItems: xMap[column.x] || "start"
21995
22004
  };
21996
22005
  const titleSpanStyle = {
21997
22006
  padding: getPadding.value,
21998
22007
  display: "flex",
21999
22008
  alignItems: "center",
22000
- justifyContent: column.x,
22009
+ justifyContent: xMap[column.x],
22001
22010
  width: any2px(column.width),
22002
22011
  height: "100%",
22003
22012
  boxSizing: "border-box"
@@ -22260,7 +22269,11 @@ const _sfc_main$i = /* @__PURE__ */ defineComponent({
22260
22269
  return h("span", {}, { default: () => String(customContent) });
22261
22270
  } catch (e) {
22262
22271
  console.error("Error in customRender:", e);
22263
- return h("span", {}, { default: () => showTextAndEmpty(row[column.field]) });
22272
+ return h(
22273
+ "span",
22274
+ {},
22275
+ { default: () => showTextAndEmpty(row[column.field]) }
22276
+ );
22264
22277
  }
22265
22278
  };
22266
22279
  const initDragState = () => {
@@ -22356,7 +22369,8 @@ const _sfc_main$i = /* @__PURE__ */ defineComponent({
22356
22369
  };
22357
22370
  const updateDragTarget = (mouseY) => {
22358
22371
  state.lastMouseY = mouseY;
22359
- if (!state.dragRowId || Object.keys(state.trPositionsMap).length === 0) return;
22372
+ if (!state.dragRowId || Object.keys(state.trPositionsMap).length === 0)
22373
+ return;
22360
22374
  const dragDistance = Math.abs(state.initialDragY - mouseY);
22361
22375
  const minDragDistance = 5;
22362
22376
  if (dragDistance < minDragDistance) {
@@ -24884,6 +24898,79 @@ const _sfc_main$8 = /* @__PURE__ */ defineComponent({
24884
24898
  const visible = useModel(__props2, "visible");
24885
24899
  const modalBodyRef = ref(null);
24886
24900
  const modalId = `lew-modal-${getUniqueId()}`;
24901
+ const recomputeTrigger = ref(0);
24902
+ const isTopModal = computed(() => {
24903
+ var _a;
24904
+ recomputeTrigger.value;
24905
+ if (!visible.value) {
24906
+ return false;
24907
+ }
24908
+ const modalEl = document.getElementById(modalId);
24909
+ if (!modalEl) {
24910
+ return false;
24911
+ }
24912
+ const dialogEl = document.getElementById("lew-dialog");
24913
+ const hasDialog = dialogEl && dialogEl.children.length > 0;
24914
+ if (hasDialog) {
24915
+ return false;
24916
+ }
24917
+ const modalContainer = modalEl == null ? void 0 : modalEl.parentElement;
24918
+ if (!modalContainer) {
24919
+ return false;
24920
+ }
24921
+ const openModals = Array.from(modalContainer.childNodes).filter((e) => e instanceof Element).filter((e) => e.children.length > 0).filter((e) => {
24922
+ const modalBody = e.querySelector(".lew-modal");
24923
+ return modalBody && modalBody.style.display !== "none";
24924
+ });
24925
+ return openModals.length > 0 && ((_a = openModals[openModals.length - 1]) == null ? void 0 : _a.id) === modalId;
24926
+ });
24927
+ const forceRecomputeTopModal = () => {
24928
+ recomputeTrigger.value++;
24929
+ };
24930
+ watch(
24931
+ modalBodyRef,
24932
+ async (newVal) => {
24933
+ if (newVal && visible.value) {
24934
+ await nextTick();
24935
+ forceRecomputeTopModal();
24936
+ }
24937
+ },
24938
+ { immediate: true }
24939
+ );
24940
+ watch(visible, async (newVal) => {
24941
+ await nextTick();
24942
+ forceRecomputeTopModal();
24943
+ if (newVal) {
24944
+ startGlobalCheck();
24945
+ } else {
24946
+ stopGlobalCheck();
24947
+ }
24948
+ });
24949
+ let globalCheckTimer = null;
24950
+ const startGlobalCheck = () => {
24951
+ if (globalCheckTimer) {
24952
+ clearInterval(globalCheckTimer);
24953
+ }
24954
+ globalCheckTimer = setInterval(() => {
24955
+ if (visible.value) {
24956
+ forceRecomputeTopModal();
24957
+ }
24958
+ }, 100);
24959
+ };
24960
+ const stopGlobalCheck = () => {
24961
+ if (globalCheckTimer) {
24962
+ clearInterval(globalCheckTimer);
24963
+ globalCheckTimer = null;
24964
+ }
24965
+ };
24966
+ onMounted(() => {
24967
+ if (visible.value) {
24968
+ startGlobalCheck();
24969
+ }
24970
+ });
24971
+ onUnmounted(() => {
24972
+ stopGlobalCheck();
24973
+ });
24887
24974
  onClickOutside(modalBodyRef, (e) => {
24888
24975
  if (visible.value && props2.closeOnClickOverlay) {
24889
24976
  const { parentElement } = e == null ? void 0 : e.target;
@@ -24905,18 +24992,10 @@ const _sfc_main$8 = /* @__PURE__ */ defineComponent({
24905
24992
  };
24906
24993
  if (props2.closeByEsc) {
24907
24994
  watch(Escape, (v) => {
24908
- var _a, _b;
24909
- if (!visible.value || !v) {
24995
+ if (!visible.value || !v || !isTopModal.value) {
24910
24996
  return;
24911
24997
  }
24912
- const dialogEl = document.getElementById("lew-dialog");
24913
- const modalEl = document.getElementById(modalId);
24914
- const hasDialog = dialogEl && dialogEl.children.length > 0;
24915
- const isOpenModal = Array.from(((_a = modalEl == null ? void 0 : modalEl.parentElement) == null ? void 0 : _a.childNodes) ?? []).filter((e) => e instanceof Element).filter((e) => e.children.length > 0);
24916
- const topModal = ((_b = isOpenModal[isOpenModal.length - 1]) == null ? void 0 : _b.id) === modalId && modalEl;
24917
- if (!hasDialog && topModal) {
24918
- visible.value = false;
24919
- }
24998
+ visible.value = false;
24920
24999
  });
24921
25000
  }
24922
25001
  return (_ctx, _cache) => {
@@ -24945,7 +25024,7 @@ const _sfc_main$8 = /* @__PURE__ */ defineComponent({
24945
25024
  createElementVNode("div", {
24946
25025
  ref_key: "modalBodyRef",
24947
25026
  ref: modalBodyRef,
24948
- style: normalizeStyle(unref(getModalStyle)),
25027
+ style: normalizeStyle(getModalStyle.value),
24949
25028
  class: "lew-modal-body"
24950
25029
  }, [
24951
25030
  _ctx.$slots.header ? (openBlock(), createElementBlock("div", _hoisted_1$7, [
@@ -25023,7 +25102,7 @@ const _sfc_main$8 = /* @__PURE__ */ defineComponent({
25023
25102
  };
25024
25103
  }
25025
25104
  });
25026
- const LewModal = /* @__PURE__ */ _export_sfc(_sfc_main$8, [["__scopeId", "data-v-4daf6b01"]]);
25105
+ const LewModal = /* @__PURE__ */ _export_sfc(_sfc_main$8, [["__scopeId", "data-v-2e8c7911"]]);
25027
25106
  const popokButtonProps = {
25028
25107
  type: {
25029
25108
  type: String,
@@ -25580,6 +25659,79 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
25580
25659
  const props2 = __props2;
25581
25660
  const drawerBodyRef = ref(null);
25582
25661
  const drawerId = `lew-drawer-${getUniqueId()}`;
25662
+ const recomputeTrigger = ref(0);
25663
+ const isTopDrawer = computed(() => {
25664
+ var _a;
25665
+ recomputeTrigger.value;
25666
+ if (!visible.value) {
25667
+ return false;
25668
+ }
25669
+ const drawerEl = document.getElementById(drawerId);
25670
+ if (!drawerEl) {
25671
+ return false;
25672
+ }
25673
+ const dialogEl = document.getElementById("lew-dialog");
25674
+ const hasDialog = dialogEl && dialogEl.children.length > 0;
25675
+ if (hasDialog) {
25676
+ return false;
25677
+ }
25678
+ const drawerContainer = drawerEl == null ? void 0 : drawerEl.parentElement;
25679
+ if (!drawerContainer) {
25680
+ return false;
25681
+ }
25682
+ const openDrawers = Array.from(drawerContainer.childNodes).filter((e) => e instanceof Element).filter((e) => e.children.length > 0).filter((e) => {
25683
+ const drawerBody = e.querySelector(".lew-drawer-body");
25684
+ return drawerBody && drawerBody.classList.contains("lew-drawer-body-show");
25685
+ });
25686
+ return openDrawers.length > 0 && ((_a = openDrawers[openDrawers.length - 1]) == null ? void 0 : _a.id) === drawerId;
25687
+ });
25688
+ const forceRecomputeTopDrawer = () => {
25689
+ recomputeTrigger.value++;
25690
+ };
25691
+ watch(
25692
+ drawerBodyRef,
25693
+ async (newVal) => {
25694
+ if (newVal && visible.value) {
25695
+ await nextTick();
25696
+ forceRecomputeTopDrawer();
25697
+ }
25698
+ },
25699
+ { immediate: true }
25700
+ );
25701
+ watch(visible, async (newVal) => {
25702
+ await nextTick();
25703
+ forceRecomputeTopDrawer();
25704
+ if (newVal) {
25705
+ startGlobalCheck();
25706
+ } else {
25707
+ stopGlobalCheck();
25708
+ }
25709
+ });
25710
+ let globalCheckTimer = null;
25711
+ const startGlobalCheck = () => {
25712
+ if (globalCheckTimer) {
25713
+ clearInterval(globalCheckTimer);
25714
+ }
25715
+ globalCheckTimer = setInterval(() => {
25716
+ if (visible.value) {
25717
+ forceRecomputeTopDrawer();
25718
+ }
25719
+ }, 100);
25720
+ };
25721
+ const stopGlobalCheck = () => {
25722
+ if (globalCheckTimer) {
25723
+ clearInterval(globalCheckTimer);
25724
+ globalCheckTimer = null;
25725
+ }
25726
+ };
25727
+ onMounted(() => {
25728
+ if (visible.value) {
25729
+ startGlobalCheck();
25730
+ }
25731
+ });
25732
+ onUnmounted(() => {
25733
+ stopGlobalCheck();
25734
+ });
25583
25735
  onClickOutside(drawerBodyRef, (e) => {
25584
25736
  if (visible.value && props2.closeOnClickOverlay) {
25585
25737
  const { parentElement } = e == null ? void 0 : e.target;
@@ -25590,18 +25742,10 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
25590
25742
  });
25591
25743
  if (props2.closeByEsc) {
25592
25744
  watch(Escape, (v) => {
25593
- var _a, _b;
25594
- if (!visible.value || !v) {
25745
+ if (!visible.value || !v || !isTopDrawer.value) {
25595
25746
  return;
25596
25747
  }
25597
- const dialogEl = document.getElementById("lew-dialog");
25598
- const drawerEl = document.getElementById(drawerId);
25599
- const hasDialog = dialogEl && dialogEl.children.length > 0;
25600
- const isOpenDrawer = Array.from(((_a = drawerEl == null ? void 0 : drawerEl.parentElement) == null ? void 0 : _a.childNodes) ?? []).filter((e) => e instanceof Element).filter((e) => e.children.length > 0);
25601
- const topDrawer = ((_b = isOpenDrawer[isOpenDrawer.length - 1]) == null ? void 0 : _b.id) === drawerId && drawerEl;
25602
- if (!hasDialog && topDrawer) {
25603
- visible.value = false;
25604
- }
25748
+ visible.value = false;
25605
25749
  });
25606
25750
  }
25607
25751
  const getStyle = (position, width, height) => {
@@ -25625,7 +25769,7 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
25625
25769
  return (_ctx, _cache) => {
25626
25770
  return openBlock(), createBlock(Teleport, { to: "#lew-drawer" }, [
25627
25771
  createElementVNode("div", {
25628
- class: "lew-modal-container",
25772
+ class: "lew-drawer-container",
25629
25773
  id: drawerId
25630
25774
  }, [
25631
25775
  createVNode(Transition, { name: "lew-drawer-mask" }, {
@@ -26726,6 +26870,7 @@ const dialogProps = {
26726
26870
  transformOrigin: {
26727
26871
  type: String,
26728
26872
  default: "0 0",
26873
+ hidden: true,
26729
26874
  description: "对话框变换原点(内部使用,无需手动设置)"
26730
26875
  }
26731
26876
  };
@@ -32458,15 +32603,27 @@ const en = {
32458
32603
  duplicate: "Tag already exists, please input a new tag"
32459
32604
  },
32460
32605
  select: {
32461
- placeholder: "Please select"
32606
+ placeholder: "Please select",
32607
+ resultCount: "{num} results",
32608
+ noResult: "No results",
32609
+ searchPlaceholder: "Enter search keywords"
32462
32610
  },
32463
32611
  selectMultiple: {
32464
- placeholder: "Please select"
32612
+ placeholder: "Please select",
32613
+ resultCount: "{num} results",
32614
+ noResult: "No results",
32615
+ searchPlaceholder: "Enter search keywords"
32465
32616
  },
32466
32617
  cascader: {
32467
32618
  placeholder: "Please select",
32468
32619
  closeText: "Close",
32469
- okText: "OK"
32620
+ okText: "OK",
32621
+ noResult: "No results"
32622
+ },
32623
+ tree: {
32624
+ resultCount: "{num} results",
32625
+ noResult: "No results",
32626
+ searchPlaceholder: "Enter search keywords"
32470
32627
  },
32471
32628
  textarea: {
32472
32629
  placeholder: "Please input"
@@ -32650,15 +32807,27 @@ const ja = {
32650
32807
  duplicate: "同じタグが既に存在します。別のタグを入力してください"
32651
32808
  },
32652
32809
  select: {
32653
- placeholder: "選択してください"
32810
+ placeholder: "選択してください",
32811
+ resultCount: "合計{num}件の結果",
32812
+ noResult: "結果なし",
32813
+ searchPlaceholder: "検索キーワードを入力"
32654
32814
  },
32655
32815
  selectMultiple: {
32656
- placeholder: "選択してください"
32816
+ placeholder: "選択してください",
32817
+ resultCount: "合計{num}件の結果",
32818
+ noResult: "結果なし",
32819
+ searchPlaceholder: "検索キーワードを入力"
32657
32820
  },
32658
32821
  cascader: {
32659
32822
  placeholder: "選択してください",
32660
32823
  closeText: "閉じる",
32661
- okText: "確定"
32824
+ okText: "確定",
32825
+ noResult: "結果なし"
32826
+ },
32827
+ tree: {
32828
+ resultCount: "合計{num}件の結果",
32829
+ noResult: "結果なし",
32830
+ searchPlaceholder: "検索キーワードを入力"
32662
32831
  },
32663
32832
  textarea: {
32664
32833
  placeholder: "入力してください"
@@ -32740,15 +32909,27 @@ const ko = {
32740
32909
  duplicate: "동일한 태그가 이미 존재합니다. 다른 태그를 입력해주세요"
32741
32910
  },
32742
32911
  select: {
32743
- placeholder: "선택해주세요"
32912
+ placeholder: "선택해주세요",
32913
+ resultCount: "총 {num}개의 결과",
32914
+ noResult: "결과 없음",
32915
+ searchPlaceholder: "검색 키워드 입력"
32744
32916
  },
32745
32917
  selectMultiple: {
32746
- placeholder: "선택해주세요"
32918
+ placeholder: "선택해주세요",
32919
+ resultCount: "총 {num}개의 결과",
32920
+ noResult: "결과 없음",
32921
+ searchPlaceholder: "검색 키워드 입력"
32747
32922
  },
32748
32923
  cascader: {
32749
32924
  placeholder: "선택해주세요",
32750
32925
  closeText: "닫기",
32751
- okText: "확인"
32926
+ okText: "확인",
32927
+ noResult: "결과 없음"
32928
+ },
32929
+ tree: {
32930
+ resultCount: "총 {num}개의 결과",
32931
+ noResult: "결과 없음",
32932
+ searchPlaceholder: "검색 키워드 입력"
32752
32933
  },
32753
32934
  textarea: {
32754
32935
  placeholder: "입력해주세요"
@@ -32830,15 +33011,27 @@ const fr = {
32830
33011
  duplicate: "Cette étiquette existe déjà, veuillez en saisir une nouvelle"
32831
33012
  },
32832
33013
  select: {
32833
- placeholder: "Veuillez sélectionner"
33014
+ placeholder: "Veuillez sélectionner",
33015
+ resultCount: "{num} résultats",
33016
+ noResult: "Aucun résultat",
33017
+ searchPlaceholder: "Entrez les mots-clés de recherche"
32834
33018
  },
32835
33019
  selectMultiple: {
32836
- placeholder: "Veuillez sélectionner"
33020
+ placeholder: "Veuillez sélectionner",
33021
+ resultCount: "{num} résultats",
33022
+ noResult: "Aucun résultat",
33023
+ searchPlaceholder: "Entrez les mots-clés de recherche"
32837
33024
  },
32838
33025
  cascader: {
32839
33026
  placeholder: "Veuillez sélectionner",
32840
33027
  closeText: "Fermer",
32841
- okText: "OK"
33028
+ okText: "OK",
33029
+ noResult: "Aucun résultat"
33030
+ },
33031
+ tree: {
33032
+ resultCount: "{num} résultats",
33033
+ noResult: "Aucun résultat",
33034
+ searchPlaceholder: "Entrez les mots-clés de recherche"
32842
33035
  },
32843
33036
  textarea: {
32844
33037
  placeholder: "Veuillez saisir"
@@ -32920,15 +33113,27 @@ const it = {
32920
33113
  duplicate: "Questo tag esiste già, inserisci un nuovo tag"
32921
33114
  },
32922
33115
  select: {
32923
- placeholder: "Seleziona"
33116
+ placeholder: "Seleziona",
33117
+ resultCount: "{num} risultati",
33118
+ noResult: "Nessun risultato",
33119
+ searchPlaceholder: "Inserisci parole chiave"
32924
33120
  },
32925
33121
  selectMultiple: {
32926
- placeholder: "Seleziona"
33122
+ placeholder: "Seleziona",
33123
+ resultCount: "{num} risultati",
33124
+ noResult: "Nessun risultato",
33125
+ searchPlaceholder: "Inserisci parole chiave"
32927
33126
  },
32928
33127
  cascader: {
32929
33128
  placeholder: "Seleziona",
32930
33129
  closeText: "Chiudi",
32931
- okText: "OK"
33130
+ okText: "OK",
33131
+ noResult: "Nessun risultato"
33132
+ },
33133
+ tree: {
33134
+ resultCount: "{num} risultati",
33135
+ noResult: "Nessun risultato",
33136
+ searchPlaceholder: "Inserisci parole chiave"
32932
33137
  },
32933
33138
  textarea: {
32934
33139
  placeholder: "Inserisci"
@@ -33010,15 +33215,27 @@ const es = {
33010
33215
  duplicate: "Esta etiqueta ya existe, por favor introduzca una nueva"
33011
33216
  },
33012
33217
  select: {
33013
- placeholder: "Por favor, seleccione"
33218
+ placeholder: "Por favor, seleccione",
33219
+ resultCount: "{num} resultados",
33220
+ noResult: "Sin resultados",
33221
+ searchPlaceholder: "Introduzca palabras clave"
33014
33222
  },
33015
33223
  selectMultiple: {
33016
- placeholder: "Por favor, seleccione"
33224
+ placeholder: "Por favor, seleccione",
33225
+ resultCount: "{num} resultados",
33226
+ noResult: "Sin resultados",
33227
+ searchPlaceholder: "Introduzca palabras clave"
33017
33228
  },
33018
33229
  cascader: {
33019
33230
  placeholder: "Por favor, seleccione",
33020
33231
  closeText: "Cerrar",
33021
- okText: "Aceptar"
33232
+ okText: "Aceptar",
33233
+ noResult: "Sin resultados"
33234
+ },
33235
+ tree: {
33236
+ resultCount: "{num} resultados",
33237
+ noResult: "Sin resultados",
33238
+ searchPlaceholder: "Introduzca palabras clave"
33022
33239
  },
33023
33240
  textarea: {
33024
33241
  placeholder: "Por favor, introduzca"
@@ -33100,15 +33317,27 @@ const de = {
33100
33317
  duplicate: "Dieser Tag existiert bereits, bitte geben Sie einen neuen Tag ein"
33101
33318
  },
33102
33319
  select: {
33103
- placeholder: "Bitte auswählen"
33320
+ placeholder: "Bitte auswählen",
33321
+ resultCount: "{num} Ergebnisse",
33322
+ noResult: "Keine Ergebnisse",
33323
+ searchPlaceholder: "Suchbegriffe eingeben"
33104
33324
  },
33105
33325
  selectMultiple: {
33106
- placeholder: "Bitte auswählen"
33326
+ placeholder: "Bitte auswählen",
33327
+ resultCount: "{num} Ergebnisse",
33328
+ noResult: "Keine Ergebnisse",
33329
+ searchPlaceholder: "Suchbegriffe eingeben"
33107
33330
  },
33108
33331
  cascader: {
33109
33332
  placeholder: "Bitte auswählen",
33110
33333
  closeText: "Schließen",
33111
- okText: "OK"
33334
+ okText: "OK",
33335
+ noResult: "Keine Ergebnisse"
33336
+ },
33337
+ tree: {
33338
+ resultCount: "{num} Ergebnisse",
33339
+ noResult: "Keine Ergebnisse",
33340
+ searchPlaceholder: "Suchbegriffe eingeben"
33112
33341
  },
33113
33342
  textarea: {
33114
33343
  placeholder: "Bitte eingeben"
@@ -33190,15 +33419,27 @@ const pt = {
33190
33419
  duplicate: "Esta tag já existe, por favor digite uma nova tag"
33191
33420
  },
33192
33421
  select: {
33193
- placeholder: "Por favor, selecione"
33422
+ placeholder: "Por favor, selecione",
33423
+ resultCount: "{num} resultados",
33424
+ noResult: "Sem resultados",
33425
+ searchPlaceholder: "Digite os termos de pesquisa"
33194
33426
  },
33195
33427
  selectMultiple: {
33196
- placeholder: "Por favor, selecione"
33428
+ placeholder: "Por favor, selecione",
33429
+ resultCount: "{num} resultados",
33430
+ noResult: "Sem resultados",
33431
+ searchPlaceholder: "Digite os termos de pesquisa"
33197
33432
  },
33198
33433
  cascader: {
33199
33434
  placeholder: "Por favor, selecione",
33200
33435
  closeText: "Fechar",
33201
- okText: "OK"
33436
+ okText: "OK",
33437
+ noResult: "Sem resultados"
33438
+ },
33439
+ tree: {
33440
+ resultCount: "{num} resultados",
33441
+ noResult: "Sem resultados",
33442
+ searchPlaceholder: "Digite os termos de pesquisa"
33202
33443
  },
33203
33444
  textarea: {
33204
33445
  placeholder: "Por favor, digite"