@erplora/outfitkit 0.1.10 → 0.1.12

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.
@@ -167,6 +167,10 @@ class OkDataTable extends LitElement {
167
167
  :host([fill]) .card { flex: 1 1 auto; min-height: 0; }
168
168
  :host([fill]) .bar, :host([fill]) .panel, :host([fill]) .pager { flex: 0 0 auto; }
169
169
  :host([fill]) .scroll, :host([fill]) .cards-grid { flex: 1 1 auto; min-height: 0; overflow: auto; }
170
+ /* Sin filas, renderTable/renderCards devuelven SOLO el bloque .empty (sin .scroll). En modo
171
+ fill hay que estirarlo para que ocupe el hueco entre toolbar y pager y centre su contenido
172
+ (icono + mensaje) en vertical; si no, queda pegado arriba con el pager a media altura. */
173
+ :host([fill]) .empty { flex: 1 1 auto; min-height: 0; }
170
174
 
171
175
  /* ── Topbar / cabecera (relieve) ─────────────────────────────────────────────────────── */
172
176
  .bar { display: flex; flex-direction: column; gap: 0.6rem; padding: 0.65rem 1rem; border-bottom: 1px solid var(--border-color); background: var(--header-background); }
@@ -137,11 +137,12 @@ class OkWidgetBoard extends LitElement {
137
137
  const modal = make("ion-modal");
138
138
  modal.initialBreakpoint = 0.9;
139
139
  modal.breakpoints = [0, 0.9, 1];
140
- const header = make("ion-header");
141
- const tb = make("ion-toolbar");
140
+ const header = make("ion-header", { attrs: { class: "okwb-header ion-no-border" } });
141
+ const tb = make("ion-toolbar", { attrs: { class: "okwb-toolbar ion-padding" } });
142
142
  tb.appendChild(make("ion-title", { text: t.customize }));
143
143
  const endBtns = make("ion-buttons", { attrs: { slot: "end" } });
144
- const closeBtn = make("ion-button", { text: t.close });
144
+ const closeBtn = make("ion-button", { attrs: { fill: "clear", "aria-label": t.close } });
145
+ closeBtn.appendChild(make("ion-icon", { attrs: { slot: "icon-only", name: "close" } }));
145
146
  closeBtn.addEventListener("click", () => modal.dismiss?.());
146
147
  endBtns.appendChild(closeBtn);
147
148
  tb.appendChild(endBtns);
@@ -175,7 +176,7 @@ class OkWidgetBoard extends LitElement {
175
176
  content.appendChild(make("div", { attrs: { class: "okwb-sub" }, text: t.available }));
176
177
  const availList = make("ion-list");
177
178
  content.appendChild(availList);
178
- const style = make("style", { text: `.okwb-sub{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--ion-color-medium);padding:12px 16px 4px}.okwb-presets{display:flex;gap:8px;flex-wrap:wrap;padding:12px 16px}` });
179
+ const style = make("style", { text: `.okwb-header{box-shadow:none}.okwb-header::after{display:none}.okwb-toolbar{--border-width:0;--border-color:transparent;box-shadow:none}.okwb-sub{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--ion-color-medium);padding:12px 16px 4px}.okwb-presets{display:flex;gap:8px;flex-wrap:wrap;padding:12px 16px}` });
179
180
  modal.appendChild(style);
180
181
  modal.appendChild(content);
181
182
  document.body.appendChild(modal);
@@ -1092,6 +1092,10 @@ class _ extends g {
1092
1092
  :host([fill]) .card { flex: 1 1 auto; min-height: 0; }
1093
1093
  :host([fill]) .bar, :host([fill]) .panel, :host([fill]) .pager { flex: 0 0 auto; }
1094
1094
  :host([fill]) .scroll, :host([fill]) .cards-grid { flex: 1 1 auto; min-height: 0; overflow: auto; }
1095
+ /* Sin filas, renderTable/renderCards devuelven SOLO el bloque .empty (sin .scroll). En modo
1096
+ fill hay que estirarlo para que ocupe el hueco entre toolbar y pager y centre su contenido
1097
+ (icono + mensaje) en vertical; si no, queda pegado arriba con el pager a media altura. */
1098
+ :host([fill]) .empty { flex: 1 1 auto; min-height: 0; }
1095
1099
 
1096
1100
  /* ── Topbar / cabecera (relieve) ─────────────────────────────────────────────────────── */
1097
1101
  .bar { display: flex; flex-direction: column; gap: 0.6rem; padding: 0.65rem 1rem; border-bottom: 1px solid var(--border-color); background: var(--header-background); }
@@ -3849,10 +3853,10 @@ class He extends g {
3849
3853
  return k.text != null && ($.textContent = k.text), $;
3850
3854
  }, r = t("ion-modal");
3851
3855
  r.initialBreakpoint = 0.9, r.breakpoints = [0, 0.9, 1];
3852
- const o = t("ion-header"), a = t("ion-toolbar");
3856
+ const o = t("ion-header", { attrs: { class: "okwb-header ion-no-border" } }), a = t("ion-toolbar", { attrs: { class: "okwb-toolbar ion-padding" } });
3853
3857
  a.appendChild(t("ion-title", { text: e.customize }));
3854
- const i = t("ion-buttons", { attrs: { slot: "end" } }), c = t("ion-button", { text: e.close });
3855
- c.addEventListener("click", () => r.dismiss?.()), i.appendChild(c), a.appendChild(i), o.appendChild(a), r.appendChild(o);
3858
+ const i = t("ion-buttons", { attrs: { slot: "end" } }), c = t("ion-button", { attrs: { fill: "clear", "aria-label": e.close } });
3859
+ c.appendChild(t("ion-icon", { attrs: { slot: "icon-only", name: "close" } })), c.addEventListener("click", () => r.dismiss?.()), i.appendChild(c), a.appendChild(i), o.appendChild(a), r.appendChild(o);
3856
3860
  const d = t("ion-content");
3857
3861
  if (this.presets.length) {
3858
3862
  d.appendChild(t("div", { attrs: { class: "okwb-sub" }, text: e.presets }));
@@ -3871,7 +3875,7 @@ class He extends g {
3871
3875
  }), u.appendChild(h), d.appendChild(u), d.appendChild(t("div", { attrs: { class: "okwb-sub" }, text: e.available }));
3872
3876
  const p = t("ion-list");
3873
3877
  d.appendChild(p);
3874
- const b = t("style", { text: ".okwb-sub{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--ion-color-medium);padding:12px 16px 4px}.okwb-presets{display:flex;gap:8px;flex-wrap:wrap;padding:12px 16px}" });
3878
+ const b = t("style", { text: ".okwb-header{box-shadow:none}.okwb-header::after{display:none}.okwb-toolbar{--border-width:0;--border-color:transparent;box-shadow:none}.okwb-sub{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--ion-color-medium);padding:12px 16px 4px}.okwb-presets{display:flex;gap:8px;flex-wrap:wrap;padding:12px 16px}" });
3875
3879
  r.appendChild(b), r.appendChild(d), document.body.appendChild(r), this.modal = r, this.reorderEl = h, this.availEl = p, this.refreshModal();
3876
3880
  }
3877
3881
  /** Repinta las listas de activos/disponibles del modal según `value`. */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@erplora/outfitkit",
3
- "version": "0.1.10",
3
+ "version": "0.1.12",
4
4
  "description": "OutfitKit — librería de Web Components (Lit) que CONSTRUYE lo que Ionic no tiene (tree, data-table rica, inline-feedback, kpi/stat, stepper/wizard, calendar, kanban…) sobre primitivos de Ionic. Ionic es la base; OutfitKit cubre los huecos. npm + CDN, imports individuales, CSP-safe. Tema vía tokens --ok-* (fallback a --ion-*).",
5
5
  "type": "module",
6
6
  "license": "MIT",