@wrrdev/fenix-ui 1.2.0 → 1.3.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.
Files changed (43) hide show
  1. package/README.md +33 -3
  2. package/dist/components/datepicker/datepicker.js +4 -4
  3. package/dist/components/datepicker/datepicker.js.map +1 -1
  4. package/dist/components/editor/editor.js +3 -3
  5. package/dist/components/editor/editor.js.map +1 -1
  6. package/dist/components/input/input.d.ts +11 -0
  7. package/dist/components/input/input.d.ts.map +1 -1
  8. package/dist/components/input/input.js +11 -0
  9. package/dist/components/input/input.js.map +1 -1
  10. package/dist/components/multiselect/multiselect.js +1 -1
  11. package/dist/components/multiselect/multiselect.js.map +1 -1
  12. package/dist/components/orderlist/orderlist.js +1 -1
  13. package/dist/components/orderlist/orderlist.js.map +1 -1
  14. package/dist/components/picklist/picklist.js +1 -1
  15. package/dist/components/picklist/picklist.js.map +1 -1
  16. package/dist/components/select/select.js +1 -1
  17. package/dist/components/select/select.js.map +1 -1
  18. package/dist/components/table/table.js +1 -1
  19. package/dist/components/table/table.js.map +1 -1
  20. package/dist/components/textarea/textarea.d.ts +7 -0
  21. package/dist/components/textarea/textarea.d.ts.map +1 -1
  22. package/dist/components/textarea/textarea.js +22 -1
  23. package/dist/components/textarea/textarea.js.map +1 -1
  24. package/dist/core/jsx.d.ts +10 -0
  25. package/dist/core/jsx.d.ts.map +1 -1
  26. package/dist/core/jsx.js.map +1 -1
  27. package/dist/docs/componentes/autocomplete.doc.d.ts.map +1 -1
  28. package/dist/docs/componentes/datepicker.doc.d.ts.map +1 -1
  29. package/dist/docs/componentes/editor.doc.d.ts.map +1 -1
  30. package/dist/docs/componentes/floatlabel.doc.d.ts.map +1 -1
  31. package/dist/docs/componentes/input.doc.d.ts.map +1 -1
  32. package/dist/docs/componentes/multiselect.doc.d.ts.map +1 -1
  33. package/dist/docs/componentes/orderlist.doc.d.ts.map +1 -1
  34. package/dist/docs/componentes/picklist.doc.d.ts.map +1 -1
  35. package/dist/docs/componentes/select.doc.d.ts.map +1 -1
  36. package/dist/docs/componentes/table.doc.d.ts.map +1 -1
  37. package/dist/docs/componentes/textarea.doc.d.ts.map +1 -1
  38. package/dist/docs/shared.d.ts +15 -0
  39. package/dist/docs/shared.d.ts.map +1 -1
  40. package/dist/fenix-ui.umd.min.js +162 -158
  41. package/dist/fenix-ui4.esm.js +45 -13
  42. package/dist/fenix-ui4.esm.js.map +1 -1
  43. package/package.json +1 -1
@@ -1048,7 +1048,7 @@ const _FxSelect = class _FxSelect extends FxFormElement {
1048
1048
  </span>
1049
1049
  </span>
1050
1050
  <div class="panel" part="panel" role="listbox">
1051
- ${this.hasAttr("searchable") ? `<input class="search" part="search" type="text" placeholder="${esc(this.getAttr("search-placeholder", "Pesquisar…"))}">` : ""}
1051
+ ${this.hasAttr("searchable") ? `<input class="search" part="search" type="text" autocomplete="off" placeholder="${esc(this.getAttr("search-placeholder", "Pesquisar…"))}">` : ""}
1052
1052
  ${filtered.map((o) => `
1053
1053
  <button type="button" class="opt" role="option" data-value="${esc(o.value)}"
1054
1054
  aria-selected="${o.value === current}">${esc(o.label)}</button>`).join("")}
@@ -1356,6 +1356,12 @@ const _FxInput = class _FxInput extends FxFormElement {
1356
1356
  "step",
1357
1357
  "clearable",
1358
1358
  "full",
1359
+ // `autocomplete` é observado porque ele vive no campo INTERNO (autofill
1360
+ // do navegador): mudar o atributo no host precisa refletir no <input>.
1361
+ // `name`/`id` idem — os dois descem para o campo interno.
1362
+ "autocomplete",
1363
+ "name",
1364
+ "id",
1359
1365
  "icon",
1360
1366
  "icon-pos",
1361
1367
  "error",
@@ -1419,6 +1425,9 @@ const _FxInput = class _FxInput extends FxFormElement {
1419
1425
  const min = this.getAttr("min");
1420
1426
  const max = this.getAttr("max");
1421
1427
  const step = this.getAttr("step");
1428
+ const autocomplete = this.getAttr("autocomplete", "off");
1429
+ const name = this.getAttr("name");
1430
+ const id = this.getAttr("id");
1422
1431
  const icon = this.getAttr("icon");
1423
1432
  const iconPos = this.getAttr("icon-pos", "left") === "right" ? "right" : "left";
1424
1433
  const slottedIcon = this.querySelector('[slot="icon"]');
@@ -1429,6 +1438,8 @@ const _FxInput = class _FxInput extends FxFormElement {
1429
1438
  ${useIconBox ? `<div class="field-icon icon-${iconPos}">` : ""}
1430
1439
  ${useIconBox && iconPos === "left" ? iconContent : ""}
1431
1440
  <input class="field" part="input" type="${esc(type)}"
1441
+ ${name ? `name="${esc(name)}"` : ""} ${id ? `id="${esc(id)}"` : ""}
1442
+ autocomplete="${esc(autocomplete)}"
1432
1443
  ${placeholder ? `placeholder="${esc(placeholder)}"` : ""}
1433
1444
  ${min ? `min="${esc(min)}"` : ""} ${max ? `max="${esc(max)}"` : ""} ${step ? `step="${esc(step)}"` : ""}
1434
1445
  />
@@ -1974,7 +1985,7 @@ const _FxMultiselect = class _FxMultiselect extends FxFormElement {
1974
1985
  <span class="count">${chips.length} selecionado${chips.length === 1 ? "" : "s"}</span>
1975
1986
  ${this.hasAttr("clearable") && chips.length ? '<button type="button" class="clear-all">Limpar tudo</button>' : ""}
1976
1987
  </div>
1977
- ${this.hasAttr("searchable") ? `<input class="search" part="search" type="text" placeholder="${esc(this.getAttr("search-placeholder", "Pesquisar…"))}">` : ""}
1988
+ ${this.hasAttr("searchable") ? `<input class="search" part="search" type="text" autocomplete="off" placeholder="${esc(this.getAttr("search-placeholder", "Pesquisar…"))}">` : ""}
1978
1989
  <ul class="list">
1979
1990
  ${filtered.map((o) => `
1980
1991
  <li><button type="button" class="opt" role="option" data-value="${esc(o.value)}"
@@ -2931,7 +2942,7 @@ const _FxDatepicker = class _FxDatepicker extends FxFormElement {
2931
2942
  }
2932
2943
  this.setTemplate(`
2933
2944
  <div class="field" part="field">
2934
- <input class="display" part="display" type="text" ${this.hasAttr("free-text") && !disabled ? "" : "readonly"}
2945
+ <input class="display" part="display" type="text" autocomplete="off" ${this.hasAttr("free-text") && !disabled ? "" : "readonly"}
2935
2946
  placeholder="${esc(this.getAttr("placeholder", "dd/mm/aaaa"))}"
2936
2947
  value="${esc(text)}" ${disabled ? "disabled" : ""}>
2937
2948
  <button type="button" class="clear" part="clear" aria-label="Limpar"
@@ -2949,9 +2960,9 @@ const _FxDatepicker = class _FxDatepicker extends FxFormElement {
2949
2960
  <div class="pop" part="popover">
2950
2961
  <fx-calendar ${calAttrs}></fx-calendar>
2951
2962
  ${showTime ? `<div class="time-row" part="time">
2952
- <input class="t-h" type="number" min="0" max="23" value="${this.time.h}" aria-label="Hora"><span class="sep">:</span>
2953
- <input class="t-m" type="number" min="0" max="59" value="${this.time.m}" aria-label="Minuto"><span class="sep">:</span>
2954
- <input class="t-s" type="number" min="0" max="59" value="${this.time.s}" aria-label="Segundo">
2963
+ <input class="t-h" type="number" autocomplete="off" min="0" max="23" value="${this.time.h}" aria-label="Hora"><span class="sep">:</span>
2964
+ <input class="t-m" type="number" autocomplete="off" min="0" max="59" value="${this.time.m}" aria-label="Minuto"><span class="sep">:</span>
2965
+ <input class="t-s" type="number" autocomplete="off" min="0" max="59" value="${this.time.s}" aria-label="Segundo">
2955
2966
  </div>` : ""}
2956
2967
  </div>
2957
2968
  `);
@@ -4387,7 +4398,7 @@ const _FxTable = class _FxTable extends FxElement {
4387
4398
  const activeClass = isSorted ? "active" : "";
4388
4399
  return `<th part="header" class="${c.sortable ? "sortable" : ""}" style="text-align:${c.align}" data-field="${esc(c.field)}">${esc(c.header)}${ind ? `<span class="sort-ind ${activeClass}">${ind}</span>` : ""}</th>`;
4389
4400
  }).join("");
4390
- const filterRow = cols.some((c) => c.filterable) ? `<tr class="filter-row">${cols.map((c) => `<th style="text-align:${c.align}">${c.filterable ? `<input class="filter" data-field="${esc(c.field)}" placeholder="${esc("Filtrar…")}" value="${esc(this.filters[c.field] ?? "")}">` : ""}</th>`).join("")}</tr>` : "";
4401
+ const filterRow = cols.some((c) => c.filterable) ? `<tr class="filter-row">${cols.map((c) => `<th style="text-align:${c.align}">${c.filterable ? `<input class="filter" autocomplete="off" data-field="${esc(c.field)}" placeholder="${esc("Filtrar…")}" value="${esc(this.filters[c.field] ?? "")}">` : ""}</th>`).join("")}</tr>` : "";
4391
4402
  const bodyHtml = rows.length ? rows.map(
4392
4403
  (row, i) => `<tr part="row" data-index="${i}">${cols.map((c) => `<td part="cell" style="text-align:${c.align}">${this.cellHtml(c, row)}</td>`).join("")}</tr>`
4393
4404
  ).join("") : `<tr><td class="empty" colspan="${cols.length || 1}">${esc(this.getAttr("empty-message", "Nenhum registro encontrado"))}</td></tr>`;
@@ -5319,7 +5330,23 @@ function defineFxFloatlabel() {
5319
5330
  defineFxFloatlabel();
5320
5331
  const _FxTextarea = class _FxTextarea extends FxFormElement {
5321
5332
  static get observedAttributes() {
5322
- return ["size", "placeholder", "disabled", "readonly", "full", "rows", "maxlength", "error", "invalid", "success", "valid"];
5333
+ return [
5334
+ "size",
5335
+ "placeholder",
5336
+ "disabled",
5337
+ "readonly",
5338
+ "full",
5339
+ "rows",
5340
+ "maxlength",
5341
+ "error",
5342
+ "invalid",
5343
+ "success",
5344
+ "valid",
5345
+ // Autofill: vivem no campo interno (ver o JSDoc da classe).
5346
+ "autocomplete",
5347
+ "name",
5348
+ "id"
5349
+ ];
5323
5350
  }
5324
5351
  get size() {
5325
5352
  const s = this.getAttr("size", "md");
@@ -5354,7 +5381,12 @@ const _FxTextarea = class _FxTextarea extends FxFormElement {
5354
5381
  const disabled = this.hasAttr("disabled");
5355
5382
  const rows = this.getAttr("rows");
5356
5383
  const maxlength = this.getAttr("maxlength");
5384
+ const autocomplete = this.getAttr("autocomplete", "off");
5385
+ const name = this.getAttr("name");
5386
+ const id = this.getAttr("id");
5357
5387
  this.setTemplate(`<textarea class="field" part="textarea"
5388
+ ${name ? `name="${esc(name)}"` : ""} ${id ? `id="${esc(id)}"` : ""}
5389
+ autocomplete="${esc(autocomplete)}"
5358
5390
  ${placeholder ? `placeholder="${esc(placeholder)}"` : ""}
5359
5391
  ${rows ? `rows="${esc(rows)}"` : ""}
5360
5392
  ${maxlength ? `maxlength="${esc(maxlength)}"` : ""}
@@ -7875,8 +7907,8 @@ renderToolbar_fn = function() {
7875
7907
  button("removeFormat", "format_clear", "Limpar formatação")
7876
7908
  ].join("");
7877
7909
  const color = [
7878
- `<label class="tb-color" title="Cor do texto"><input type="color" data-color="foreColor" value="#111827" aria-label="Cor do texto"></label>`,
7879
- `<label class="tb-color" title="Realçar texto"><input type="color" data-color="hiliteColor" value="#fef08a" aria-label="Realçar texto"></label>`
7910
+ `<label class="tb-color" title="Cor do texto"><input type="color" autocomplete="off" data-color="foreColor" value="#111827" aria-label="Cor do texto"></label>`,
7911
+ `<label class="tb-color" title="Realçar texto"><input type="color" autocomplete="off" data-color="hiliteColor" value="#fef08a" aria-label="Realçar texto"></label>`
7880
7912
  ].join("");
7881
7913
  const alignGroup = [
7882
7914
  button("justifyLeft", "format_align_left", "Alinhar à esquerda"),
@@ -8344,7 +8376,7 @@ fieldHtml_fn = function(field) {
8344
8376
  return `<label class="field"><span>${label}</span><select data-field="${esc(field.name)}">${options}</select></label>`;
8345
8377
  }
8346
8378
  const type = field.type === "url" ? "url" : field.type === "number" ? "number" : "text";
8347
- return `<label class="field"><span>${label}</span><input data-field="${esc(field.name)}" type="${type}" value="${esc(field.value ?? "")}" placeholder="${esc(field.placeholder ?? "")}"></label>`;
8379
+ return `<label class="field"><span>${label}</span><input data-field="${esc(field.name)}" type="${type}" autocomplete="off" value="${esc(field.value ?? "")}" placeholder="${esc(field.placeholder ?? "")}"></label>`;
8348
8380
  };
8349
8381
  submitDialog_fn = function() {
8350
8382
  const body = this.root.querySelector(".dialog-body");
@@ -14761,7 +14793,7 @@ const _FxOrderList = class _FxOrderList extends FxElement {
14761
14793
  <div class="container" part="container">
14762
14794
  ${this.filter ? `
14763
14795
  <div class="filter-wrapper" part="filter-wrapper">
14764
- <input type="text" class="filter-input" part="filter-input"
14796
+ <input type="text" class="filter-input" part="filter-input" autocomplete="off"
14765
14797
  placeholder="${this.filterPlaceholder}"
14766
14798
  value="${esc(this._filterValue)}"
14767
14799
  aria-label="Filtrar lista" />
@@ -15453,7 +15485,7 @@ const _FxPickList = class _FxPickList extends FxElement {
15453
15485
  const tgtItems = dTgt.length === 0 ? `<li class="empty-message">${this.filter ? "Nenhum resultado" : "Nenhum selecionado"}</li>` : dTgt.map((item, i) => `<li class="list-item${this._isTargetSelected(item, i) ? " selected" : ""}" data-index="${i}" data-list="target" tabindex="0">${hasSel ? '<input type="checkbox" class="checkbox"' + (this._isTargetSelected(item, i) ? " checked" : "") + " />" : ""}<span class="item-content">${this._optionTemplate ? this._optionTemplate(item) : esc(this._getItemLabel(item))}</span></li>`).join("");
15454
15486
  const srcAllBar = showAll ? `<div class="select-all-bar" part="select-all-bar"><label><input type="checkbox" class="select-all-checkbox" data-list="source" ${this._sourceSelection.length > 0 && this._sourceSelection.length === this._source.length ? "checked" : ""} aria-label="Selecionar todos da origem" /> Selecionar Todos</label><span class="selection-count">${this._sourceSelection.length} selecionado(s)</span></div>` : "";
15455
15487
  const tgtAllBar = showAll ? `<div class="select-all-bar" part="select-all-bar"><label><input type="checkbox" class="select-all-checkbox" data-list="target" ${this._targetSelection.length > 0 && this._targetSelection.length === this._target.length ? "checked" : ""} aria-label="Selecionar todos do destino" /> Selecionar Todos</label><span class="selection-count">${this._targetSelection.length} selecionado(s)</span></div>` : "";
15456
- this.setTemplate(`<div class="container"><div class="list-container"><div class="list-label">${esc(this.sourceLabel)} (${this._source.length})</div>${this.filter ? '<div class="filter-wrapper"><input type="text" class="filter-input source-filter" placeholder="' + this.filterPlaceholder + '" value="' + esc(this._sourceFilterValue) + '" /></div>' : ""}${srcAllBar}<div class="list-wrapper"><ul class="list source-list" role="listbox" tabindex="0">${srcItems}</ul></div></div><div class="controls"><div class="control-group"><button class="control-btn" data-action="move-all-target" part="control-btn" aria-label="Mover todos para destino"><span class="control-btn-icon">»</span></button><button class="control-btn" data-action="move-target" part="control-btn" aria-label="Mover para destino"><span class="control-btn-icon">→</span></button></div><div class="control-group"><button class="control-btn" data-action="move-source" part="control-btn" aria-label="Mover para origem"><span class="control-btn-icon">←</span></button><button class="control-btn" data-action="move-all-source" part="control-btn" aria-label="Mover todos para origem"><span class="control-btn-icon">«</span></button></div></div><div class="list-container"><div class="list-label">${esc(this.targetLabel)} (${this._target.length})</div>${this.filter ? '<div class="filter-wrapper"><input type="text" class="filter-input target-filter" placeholder="' + this.filterPlaceholder + '" value="' + esc(this._targetFilterValue) + '" /></div>' : ""}${tgtAllBar}<div class="list-wrapper"><ul class="list target-list" role="listbox" tabindex="0">${tgtItems}</ul></div></div></div>`);
15488
+ this.setTemplate(`<div class="container"><div class="list-container"><div class="list-label">${esc(this.sourceLabel)} (${this._source.length})</div>${this.filter ? '<div class="filter-wrapper"><input type="text" autocomplete="off" class="filter-input source-filter" placeholder="' + this.filterPlaceholder + '" value="' + esc(this._sourceFilterValue) + '" /></div>' : ""}${srcAllBar}<div class="list-wrapper"><ul class="list source-list" role="listbox" tabindex="0">${srcItems}</ul></div></div><div class="controls"><div class="control-group"><button class="control-btn" data-action="move-all-target" part="control-btn" aria-label="Mover todos para destino"><span class="control-btn-icon">»</span></button><button class="control-btn" data-action="move-target" part="control-btn" aria-label="Mover para destino"><span class="control-btn-icon">→</span></button></div><div class="control-group"><button class="control-btn" data-action="move-source" part="control-btn" aria-label="Mover para origem"><span class="control-btn-icon">←</span></button><button class="control-btn" data-action="move-all-source" part="control-btn" aria-label="Mover todos para origem"><span class="control-btn-icon">«</span></button></div></div><div class="list-container"><div class="list-label">${esc(this.targetLabel)} (${this._target.length})</div>${this.filter ? '<div class="filter-wrapper"><input type="text" autocomplete="off" class="filter-input target-filter" placeholder="' + this.filterPlaceholder + '" value="' + esc(this._targetFilterValue) + '" /></div>' : ""}${tgtAllBar}<div class="list-wrapper"><ul class="list target-list" role="listbox" tabindex="0">${tgtItems}</ul></div></div></div>`);
15457
15489
  this._attachListeners();
15458
15490
  }
15459
15491
  _attachListeners() {