@burdenoff/microfe-bigconsole 2026.1103.5 → 2026.1103.6

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.
@@ -179,217 +179,224 @@ var c = [
179
179
  })
180
180
  ]
181
181
  })] }),
182
- /* @__PURE__ */ s("div", { children: [/* @__PURE__ */ s("div", {
183
- className: "flex items-center justify-between mb-2",
184
- children: [/* @__PURE__ */ o("label", {
185
- className: "text-sm font-medium text-text-primary",
186
- children: f("bigconsole.widget.config.table.columns.label", "Columns")
187
- }), /* @__PURE__ */ o("button", {
188
- type: "button",
189
- onClick: S,
190
- className: "\n text-sm text-action-primary-bg\n hover:text-action-primary-bgHover\n ",
191
- children: f("bigconsole.widget.config.table.columns.add", "+ Add Column")
192
- })]
193
- }), /* @__PURE__ */ s("div", {
194
- className: "space-y-3",
195
- children: [p.map((e, t) => /* @__PURE__ */ s("div", {
196
- className: "\n p-3\n bg-bg-sunken\n rounded-md\n space-y-2\n ",
197
- children: [
198
- /* @__PURE__ */ s("div", {
199
- className: "flex items-center justify-between",
200
- children: [/* @__PURE__ */ o("span", {
201
- className: "text-xs text-text-secondary",
202
- children: f("bigconsole.widget.config.table.columns.columnN", "Column {{index}}", { index: t + 1 })
203
- }), /* @__PURE__ */ o("button", {
204
- type: "button",
205
- onClick: () => C(t),
206
- className: "text-status-error-text hover:text-status-error-text/80",
207
- children: /* @__PURE__ */ o("svg", {
208
- className: "w-4 h-4",
209
- fill: "none",
210
- stroke: "currentColor",
211
- viewBox: "0 0 24 24",
212
- children: /* @__PURE__ */ o("path", {
213
- strokeLinecap: "round",
214
- strokeLinejoin: "round",
215
- strokeWidth: 2,
216
- d: "M6 18L18 6M6 6l12 12"
217
- })
218
- })
219
- })]
220
- }),
221
- /* @__PURE__ */ s("div", {
222
- className: "grid grid-cols-1 gap-2 sm:grid-cols-2",
223
- children: [/* @__PURE__ */ o("input", {
224
- type: "text",
225
- value: e.field || "",
226
- onChange: (e) => g(t, "field", e.target.value),
227
- placeholder: f("bigconsole.widget.config.table.column.fieldPlaceholder", "Field name"),
228
- className: "\n px-2 py-1\n text-sm text-text-primary\n bg-bg-surface\n border border-border-default\n rounded-md\n focus:outline-none focus:ring-2 focus:ring-action-primary-bg\n "
229
- }), /* @__PURE__ */ o("input", {
230
- type: "text",
231
- value: e.header || "",
232
- onChange: (e) => g(t, "header", e.target.value),
233
- placeholder: f("bigconsole.widget.config.table.column.headerPlaceholder", "Header label"),
234
- className: "\n px-2 py-1\n text-sm text-text-primary\n bg-bg-surface\n border border-border-default\n rounded-md\n focus:outline-none focus:ring-2 focus:ring-action-primary-bg\n "
235
- })]
236
- }),
237
- /* @__PURE__ */ s("div", {
238
- className: "grid grid-cols-1 gap-2 sm:grid-cols-2",
239
- children: [/* @__PURE__ */ s("select", {
240
- value: e.format || "text",
241
- onChange: (e) => g(t, "format", e.target.value),
242
- className: "\n px-2 py-1\n text-sm text-text-primary\n bg-bg-surface\n border border-border-default\n rounded-md\n focus:outline-none focus:ring-2 focus:ring-action-primary-bg\n ",
243
- children: [
244
- /* @__PURE__ */ o("option", {
245
- value: "text",
246
- children: f("bigconsole.widget.config.table.format.text", "Text")
247
- }),
248
- /* @__PURE__ */ o("option", {
249
- value: "number",
250
- children: f("bigconsole.widget.config.table.format.number", "Number")
251
- }),
252
- /* @__PURE__ */ o("option", {
253
- value: "currency",
254
- children: f("bigconsole.widget.config.table.format.currency", "Currency")
255
- }),
256
- /* @__PURE__ */ o("option", {
257
- value: "percentage",
258
- children: f("bigconsole.widget.config.table.format.percentage", "Percentage")
259
- }),
260
- /* @__PURE__ */ o("option", {
261
- value: "date",
262
- children: f("bigconsole.widget.config.table.format.date", "Date")
263
- }),
264
- /* @__PURE__ */ o("option", {
265
- value: "badge",
266
- children: f("bigconsole.widget.config.table.format.badge", "Badge")
182
+ /* @__PURE__ */ s("div", { children: [
183
+ /* @__PURE__ */ s("div", {
184
+ className: "flex items-center justify-between mb-2",
185
+ children: [/* @__PURE__ */ o("label", {
186
+ className: "text-sm font-medium text-text-primary",
187
+ children: f("bigconsole.widget.config.table.columns.label", "Columns")
188
+ }), /* @__PURE__ */ o("button", {
189
+ type: "button",
190
+ onClick: S,
191
+ className: "\n text-sm text-action-primary-bg\n hover:text-action-primary-bgHover\n ",
192
+ children: f("bigconsole.widget.config.table.columns.add", "+ Add Column")
193
+ })]
194
+ }),
195
+ /* @__PURE__ */ o("p", {
196
+ className: "text-sm text-text-secondary mb-3",
197
+ children: f("bigconsole.widget.config.table.columns.replacementHelp", "Adding columns here replaces auto-generated columns. Only configured columns will be shown, in this order. In edit mode, drag table headers to reorder.")
198
+ }),
199
+ /* @__PURE__ */ s("div", {
200
+ className: "space-y-3",
201
+ children: [p.map((e, t) => /* @__PURE__ */ s("div", {
202
+ className: "\n p-3\n bg-bg-sunken\n rounded-md\n space-y-2\n ",
203
+ children: [
204
+ /* @__PURE__ */ s("div", {
205
+ className: "flex items-center justify-between",
206
+ children: [/* @__PURE__ */ o("span", {
207
+ className: "text-xs text-text-secondary",
208
+ children: f("bigconsole.widget.config.table.columns.columnN", "Column {{index}}", { index: t + 1 })
209
+ }), /* @__PURE__ */ o("button", {
210
+ type: "button",
211
+ onClick: () => C(t),
212
+ className: "text-status-error-text hover:text-status-error-text/80",
213
+ children: /* @__PURE__ */ o("svg", {
214
+ className: "w-4 h-4",
215
+ fill: "none",
216
+ stroke: "currentColor",
217
+ viewBox: "0 0 24 24",
218
+ children: /* @__PURE__ */ o("path", {
219
+ strokeLinecap: "round",
220
+ strokeLinejoin: "round",
221
+ strokeWidth: 2,
222
+ d: "M6 18L18 6M6 6l12 12"
223
+ })
267
224
  })
268
- ]
269
- }), /* @__PURE__ */ s("select", {
270
- value: e.align || "left",
271
- onChange: (e) => g(t, "align", e.target.value),
272
- className: "\n px-2 py-1\n text-sm text-text-primary\n bg-bg-surface\n border border-border-default\n rounded-md\n focus:outline-none focus:ring-2 focus:ring-action-primary-bg\n ",
225
+ })]
226
+ }),
227
+ /* @__PURE__ */ s("div", {
228
+ className: "grid grid-cols-1 gap-2 sm:grid-cols-2",
229
+ children: [/* @__PURE__ */ o("input", {
230
+ type: "text",
231
+ value: e.field || "",
232
+ onChange: (e) => g(t, "field", e.target.value),
233
+ placeholder: f("bigconsole.widget.config.table.column.fieldPlaceholder", "Field name"),
234
+ className: "\n px-2 py-1\n text-sm text-text-primary\n bg-bg-surface\n border border-border-default\n rounded-md\n focus:outline-none focus:ring-2 focus:ring-action-primary-bg\n "
235
+ }), /* @__PURE__ */ o("input", {
236
+ type: "text",
237
+ value: e.header || "",
238
+ onChange: (e) => g(t, "header", e.target.value),
239
+ placeholder: f("bigconsole.widget.config.table.column.headerPlaceholder", "Header label"),
240
+ className: "\n px-2 py-1\n text-sm text-text-primary\n bg-bg-surface\n border border-border-default\n rounded-md\n focus:outline-none focus:ring-2 focus:ring-action-primary-bg\n "
241
+ })]
242
+ }),
243
+ /* @__PURE__ */ s("div", {
244
+ className: "grid grid-cols-1 gap-2 sm:grid-cols-2",
245
+ children: [/* @__PURE__ */ s("select", {
246
+ value: e.format || "text",
247
+ onChange: (e) => g(t, "format", e.target.value),
248
+ className: "\n px-2 py-1\n text-sm text-text-primary\n bg-bg-surface\n border border-border-default\n rounded-md\n focus:outline-none focus:ring-2 focus:ring-action-primary-bg\n ",
249
+ children: [
250
+ /* @__PURE__ */ o("option", {
251
+ value: "text",
252
+ children: f("bigconsole.widget.config.table.format.text", "Text")
253
+ }),
254
+ /* @__PURE__ */ o("option", {
255
+ value: "number",
256
+ children: f("bigconsole.widget.config.table.format.number", "Number")
257
+ }),
258
+ /* @__PURE__ */ o("option", {
259
+ value: "currency",
260
+ children: f("bigconsole.widget.config.table.format.currency", "Currency")
261
+ }),
262
+ /* @__PURE__ */ o("option", {
263
+ value: "percentage",
264
+ children: f("bigconsole.widget.config.table.format.percentage", "Percentage")
265
+ }),
266
+ /* @__PURE__ */ o("option", {
267
+ value: "date",
268
+ children: f("bigconsole.widget.config.table.format.date", "Date")
269
+ }),
270
+ /* @__PURE__ */ o("option", {
271
+ value: "badge",
272
+ children: f("bigconsole.widget.config.table.format.badge", "Badge")
273
+ })
274
+ ]
275
+ }), /* @__PURE__ */ s("select", {
276
+ value: e.align || "left",
277
+ onChange: (e) => g(t, "align", e.target.value),
278
+ className: "\n px-2 py-1\n text-sm text-text-primary\n bg-bg-surface\n border border-border-default\n rounded-md\n focus:outline-none focus:ring-2 focus:ring-action-primary-bg\n ",
279
+ children: [
280
+ /* @__PURE__ */ o("option", {
281
+ value: "left",
282
+ children: f("bigconsole.widget.config.table.align.left", "Left")
283
+ }),
284
+ /* @__PURE__ */ o("option", {
285
+ value: "center",
286
+ children: f("bigconsole.widget.config.table.align.center", "Center")
287
+ }),
288
+ /* @__PURE__ */ o("option", {
289
+ value: "right",
290
+ children: f("bigconsole.widget.config.table.align.right", "Right")
291
+ })
292
+ ]
293
+ })]
294
+ }),
295
+ /* @__PURE__ */ s("div", {
296
+ className: "pt-2 border-t border-border-default/60",
273
297
  children: [
274
- /* @__PURE__ */ o("option", {
275
- value: "left",
276
- children: f("bigconsole.widget.config.table.align.left", "Left")
298
+ /* @__PURE__ */ s("div", {
299
+ className: "flex items-center justify-between mb-1",
300
+ children: [/* @__PURE__ */ o("span", {
301
+ className: "text-xs font-medium text-text-secondary",
302
+ children: f("bigconsole.widget.config.table.conditionalFormatting.title", "Conditional formatting")
303
+ }), /* @__PURE__ */ o("button", {
304
+ type: "button",
305
+ onClick: () => v(t),
306
+ className: "text-xs text-action-primary-bg hover:text-action-primary-bgHover",
307
+ children: f("bigconsole.widget.config.table.conditionalFormatting.addRule", "+ Add rule")
308
+ })]
277
309
  }),
278
- /* @__PURE__ */ o("option", {
279
- value: "center",
280
- children: f("bigconsole.widget.config.table.align.center", "Center")
310
+ (e.conditionalRules?.length ?? 0) === 0 && /* @__PURE__ */ o("p", {
311
+ className: "text-xs text-text-secondary",
312
+ children: f("bigconsole.widget.config.table.conditionalFormatting.noRules", "No rules — cell shows its plain value.")
281
313
  }),
282
- /* @__PURE__ */ o("option", {
283
- value: "right",
284
- children: f("bigconsole.widget.config.table.align.right", "Right")
285
- })
286
- ]
287
- })]
288
- }),
289
- /* @__PURE__ */ s("div", {
290
- className: "pt-2 border-t border-border-default/60",
291
- children: [
292
- /* @__PURE__ */ s("div", {
293
- className: "flex items-center justify-between mb-1",
294
- children: [/* @__PURE__ */ o("span", {
295
- className: "text-xs font-medium text-text-secondary",
296
- children: f("bigconsole.widget.config.table.conditionalFormatting.title", "Conditional formatting")
297
- }), /* @__PURE__ */ o("button", {
298
- type: "button",
299
- onClick: () => v(t),
300
- className: "text-xs text-action-primary-bg hover:text-action-primary-bgHover",
301
- children: f("bigconsole.widget.config.table.conditionalFormatting.addRule", "+ Add rule")
302
- })]
303
- }),
304
- (e.conditionalRules?.length ?? 0) === 0 && /* @__PURE__ */ o("p", {
305
- className: "text-xs text-text-secondary",
306
- children: f("bigconsole.widget.config.table.conditionalFormatting.noRules", "No rules — cell shows its plain value.")
307
- }),
308
- /* @__PURE__ */ o("div", {
309
- className: "space-y-2",
310
- children: (e.conditionalRules ?? []).map((e, n) => {
311
- let r = e.operator === "between" || e.operator === "outside", i = e.style?.bgColor ?? e.style?.textColor ?? "danger";
312
- return /* @__PURE__ */ s("div", {
313
- className: "p-2 bg-bg-surface rounded-md border border-border-default space-y-2",
314
- children: [/* @__PURE__ */ s("div", {
315
- className: "flex items-center gap-2",
316
- children: [
317
- /* @__PURE__ */ o("select", {
318
- value: e.operator,
319
- onChange: (e) => y(t, n, { operator: e.target.value }),
314
+ /* @__PURE__ */ o("div", {
315
+ className: "space-y-2",
316
+ children: (e.conditionalRules ?? []).map((e, n) => {
317
+ let r = e.operator === "between" || e.operator === "outside", i = e.style?.bgColor ?? e.style?.textColor ?? "danger";
318
+ return /* @__PURE__ */ s("div", {
319
+ className: "p-2 bg-bg-surface rounded-md border border-border-default space-y-2",
320
+ children: [/* @__PURE__ */ s("div", {
321
+ className: "flex items-center gap-2",
322
+ children: [
323
+ /* @__PURE__ */ o("select", {
324
+ value: e.operator,
325
+ onChange: (e) => y(t, n, { operator: e.target.value }),
326
+ className: `${u} flex-1`,
327
+ children: c.map((e) => /* @__PURE__ */ o("option", {
328
+ value: e.value,
329
+ children: f(e.labelKey, e.labelDefault)
330
+ }, e.value))
331
+ }),
332
+ /* @__PURE__ */ o("input", {
333
+ type: "text",
334
+ value: e.value ?? "",
335
+ onChange: (e) => y(t, n, { value: e.target.value }),
336
+ placeholder: f("bigconsole.widget.config.table.rule.valuePlaceholder", "value"),
337
+ className: `${u} w-20`
338
+ }),
339
+ r && /* @__PURE__ */ o("input", {
340
+ type: "text",
341
+ value: e.value2 ?? "",
342
+ onChange: (e) => y(t, n, { value2: e.target.value }),
343
+ placeholder: f("bigconsole.widget.config.table.rule.value2Placeholder", "and"),
344
+ className: `${u} w-20`
345
+ }),
346
+ /* @__PURE__ */ o("button", {
347
+ type: "button",
348
+ onClick: () => x(t, n),
349
+ className: "text-status-error-text hover:text-status-error-text/80",
350
+ "aria-label": f("bigconsole.widget.config.table.rule.remove", "Remove rule"),
351
+ children: /* @__PURE__ */ o("svg", {
352
+ className: "w-3.5 h-3.5",
353
+ fill: "none",
354
+ stroke: "currentColor",
355
+ viewBox: "0 0 24 24",
356
+ children: /* @__PURE__ */ o("path", {
357
+ strokeLinecap: "round",
358
+ strokeLinejoin: "round",
359
+ strokeWidth: 2,
360
+ d: "M6 18L18 6M6 6l12 12"
361
+ })
362
+ })
363
+ })
364
+ ]
365
+ }), /* @__PURE__ */ s("div", {
366
+ className: "flex items-center gap-2",
367
+ children: [/* @__PURE__ */ o("select", {
368
+ value: i,
369
+ onChange: (e) => b(t, n, e.target.value),
320
370
  className: `${u} flex-1`,
321
- children: c.map((e) => /* @__PURE__ */ o("option", {
371
+ children: l.map((e) => /* @__PURE__ */ o("option", {
322
372
  value: e.value,
323
373
  children: f(e.labelKey, e.labelDefault)
324
374
  }, e.value))
325
- }),
326
- /* @__PURE__ */ o("input", {
327
- type: "text",
328
- value: e.value ?? "",
329
- onChange: (e) => y(t, n, { value: e.target.value }),
330
- placeholder: f("bigconsole.widget.config.table.rule.valuePlaceholder", "value"),
331
- className: `${u} w-20`
332
- }),
333
- r && /* @__PURE__ */ o("input", {
334
- type: "text",
335
- value: e.value2 ?? "",
336
- onChange: (e) => y(t, n, { value2: e.target.value }),
337
- placeholder: f("bigconsole.widget.config.table.rule.value2Placeholder", "and"),
338
- className: `${u} w-20`
339
- }),
340
- /* @__PURE__ */ o("button", {
341
- type: "button",
342
- onClick: () => x(t, n),
343
- className: "text-status-error-text hover:text-status-error-text/80",
344
- "aria-label": f("bigconsole.widget.config.table.rule.remove", "Remove rule"),
345
- children: /* @__PURE__ */ o("svg", {
346
- className: "w-3.5 h-3.5",
347
- fill: "none",
348
- stroke: "currentColor",
349
- viewBox: "0 0 24 24",
350
- children: /* @__PURE__ */ o("path", {
351
- strokeLinecap: "round",
352
- strokeLinejoin: "round",
353
- strokeWidth: 2,
354
- d: "M6 18L18 6M6 6l12 12"
355
- })
356
- })
357
- })
358
- ]
359
- }), /* @__PURE__ */ s("div", {
360
- className: "flex items-center gap-2",
361
- children: [/* @__PURE__ */ o("select", {
362
- value: i,
363
- onChange: (e) => b(t, n, e.target.value),
364
- className: `${u} flex-1`,
365
- children: l.map((e) => /* @__PURE__ */ o("option", {
366
- value: e.value,
367
- children: f(e.labelKey, e.labelDefault)
368
- }, e.value))
369
- }), /* @__PURE__ */ s("label", {
370
- className: "flex items-center gap-1 text-xs text-text-primary",
371
- children: [/* @__PURE__ */ o("input", {
372
- type: "checkbox",
373
- checked: e.style?.bold === !0,
374
- onChange: (r) => y(t, n, { style: {
375
- ...e.style,
376
- bold: r.target.checked
377
- } }),
378
- className: "w-3.5 h-3.5 text-action-primary-bg bg-bg-surface border-border-default rounded focus:ring-action-primary-bg"
379
- }), f("bigconsole.widget.config.table.rule.bold", "Bold")]
375
+ }), /* @__PURE__ */ s("label", {
376
+ className: "flex items-center gap-1 text-xs text-text-primary",
377
+ children: [/* @__PURE__ */ o("input", {
378
+ type: "checkbox",
379
+ checked: e.style?.bold === !0,
380
+ onChange: (r) => y(t, n, { style: {
381
+ ...e.style,
382
+ bold: r.target.checked
383
+ } }),
384
+ className: "w-3.5 h-3.5 text-action-primary-bg bg-bg-surface border-border-default rounded focus:ring-action-primary-bg"
385
+ }), f("bigconsole.widget.config.table.rule.bold", "Bold")]
386
+ })]
380
387
  })]
381
- })]
382
- }, n);
388
+ }, n);
389
+ })
383
390
  })
384
- })
385
- ]
386
- })
387
- ]
388
- }, t)), p.length === 0 && /* @__PURE__ */ o("p", {
389
- className: "text-sm text-text-secondary text-center py-4",
390
- children: f("bigconsole.widget.config.table.columns.empty", "No columns configured. Columns will be auto-generated from data.")
391
- })]
392
- })] }),
391
+ ]
392
+ })
393
+ ]
394
+ }, t)), p.length === 0 && /* @__PURE__ */ o("p", {
395
+ className: "text-sm text-text-secondary text-center py-4",
396
+ children: f("bigconsole.widget.config.table.columns.empty", "No columns configured. Columns will be auto-generated from data.")
397
+ })]
398
+ })
399
+ ] }),
393
400
  /* @__PURE__ */ s("div", {
394
401
  role: "group",
395
402
  "aria-label": "Display options",
@@ -6,12 +6,13 @@ import r from "../../../hooks/useWidgetConfigPersist.js";
6
6
  import "../../../hooks/index.js";
7
7
  import { resolveRowClassName as i } from "../utils/conditionalFormat.js";
8
8
  import { TableHeader as a } from "./TableHeader.js";
9
- import { TableCell as o } from "./TableCell.js";
10
- import { TablePagination as s } from "./TablePagination.js";
11
- import { memo as c, useCallback as l, useEffect as ee, useMemo as u, useRef as te, useState as d } from "react";
12
- import { jsx as f, jsxs as p } from "react/jsx-runtime";
9
+ import { TableCell as ee } from "./TableCell.js";
10
+ import { TablePagination as te } from "./TablePagination.js";
11
+ import { memo as o, useCallback as s, useEffect as ne, useMemo as c, useRef as re, useState as l } from "react";
12
+ import { useI18n as ie } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
13
+ import { jsx as u, jsxs as d } from "react/jsx-runtime";
13
14
  //#region src/bigconsole/components/widgets/table/TableWidget.tsx
14
- function ne(e, t) {
15
+ function ae(e, t) {
15
16
  return !t.column || !t.direction ? e : [...e].sort((e, n) => {
16
17
  let r = e[t.column], i = n[t.column];
17
18
  if (r == null && i == null) return 0;
@@ -21,7 +22,7 @@ function ne(e, t) {
21
22
  return a = typeof r == "number" && typeof i == "number" ? r - i : String(r).localeCompare(String(i)), t.direction === "asc" ? a : -a;
22
23
  });
23
24
  }
24
- function re(e, t, n) {
25
+ function f(e, t, n) {
25
26
  if (!t.trim()) return e;
26
27
  let r = t.toLowerCase();
27
28
  return e.filter((e) => n.some((t) => {
@@ -29,7 +30,7 @@ function re(e, t, n) {
29
30
  return n != null && String(n).toLowerCase().includes(r);
30
31
  }));
31
32
  }
32
- function m(e, t, n) {
33
+ function oe(e, t, n) {
33
34
  switch (t) {
34
35
  case "currency": return new Intl.NumberFormat("en-US", {
35
36
  style: "currency",
@@ -40,10 +41,10 @@ function m(e, t, n) {
40
41
  default: return Number.isInteger(e) ? String(e) : e.toFixed(2);
41
42
  }
42
43
  }
43
- var h = c(function({ widget: c, data: h = [], onRowClick: g, onDrilldown: _ }) {
44
- let v = c.config, y = u(() => {
45
- if (Array.isArray(h)) return h;
46
- if (h && typeof h == "object") {
44
+ var p = o(function({ widget: o, data: p = [], onRowClick: m, onDrilldown: h }) {
45
+ let { t: g } = ie(), _ = o.config, v = c(() => {
46
+ if (Array.isArray(p)) return p;
47
+ if (p && typeof p == "object") {
47
48
  for (let e of [
48
49
  "data",
49
50
  "items",
@@ -54,20 +55,20 @@ var h = c(function({ widget: c, data: h = [], onRowClick: g, onDrilldown: _ }) {
54
55
  "sales",
55
56
  "entries",
56
57
  "values"
57
- ]) if (Array.isArray(h[e])) return h[e];
58
- let e = Object.values(h);
58
+ ]) if (Array.isArray(p[e])) return p[e];
59
+ let e = Object.values(p);
59
60
  for (let t of e) if (Array.isArray(t)) return t;
60
- return [h];
61
+ return [p];
61
62
  }
62
63
  return [];
63
- }, [h]), { handleDataClick: b, enabled: x } = n(c.id, v?.crossFilterMappings), { clearAllCrossFilters: ie, hasCrossFilters: ae } = t(), [S, C] = d({
64
- column: v?.defaultSortColumn || null,
65
- direction: v?.defaultSortDirection || null
66
- }), [w, oe] = d(""), [T, E] = d({
64
+ }, [p]), { handleDataClick: y, enabled: b } = n(o.id, _?.crossFilterMappings), { clearAllCrossFilters: x, hasCrossFilters: S } = t(), [C, se] = l({
65
+ column: _?.defaultSortColumn || null,
66
+ direction: _?.defaultSortDirection || null
67
+ }), [w, ce] = l(""), [T, E] = l({
67
68
  page: 0,
68
- pageSize: v?.pageSize || 10,
69
+ pageSize: _?.pageSize || 10,
69
70
  totalItems: 0
70
- }), D = e(), { persistConfig: O } = r(c), [k, A] = d({}), [j, se] = d(null), M = u(() => v?.columns?.length ? v.columns.map((e) => {
71
+ }), D = e(), { persistConfig: O } = r(o), [k, A] = l({}), [j, le] = l(null), M = c(() => _?.columns?.length ? _.columns.map((e) => {
71
72
  if (typeof e == "string") return {
72
73
  key: e,
73
74
  header: e.charAt(0).toUpperCase() + e.slice(1).replace(/_/g, " "),
@@ -81,11 +82,11 @@ var h = c(function({ widget: c, data: h = [], onRowClick: g, onDrilldown: _ }) {
81
82
  width: e.width == null ? void 0 : String(e.width),
82
83
  align: e.align
83
84
  };
84
- }) : y.length > 0 ? Object.keys(y[0]).map((e) => ({
85
+ }) : v.length > 0 ? Object.keys(v[0]).map((e) => ({
85
86
  key: e,
86
87
  header: e.charAt(0).toUpperCase() + e.slice(1).replace(/_/g, " "),
87
88
  sortable: !0
88
- })) : [], [v?.columns, y]), N = u(() => {
89
+ })) : [], [_?.columns, v]), N = c(() => {
89
90
  let e = M;
90
91
  if (j) {
91
92
  let t = new Map(M.map((e) => [e.key, e])), n = j.map((e) => t.get(e)).filter((e) => e !== void 0), r = M.filter((e) => !j.includes(e.key));
@@ -99,9 +100,9 @@ var h = c(function({ widget: c, data: h = [], onRowClick: g, onDrilldown: _ }) {
99
100
  M,
100
101
  j,
101
102
  k
102
- ]), P = l((e, t) => {
103
+ ]), P = s((e, t) => {
103
104
  let n = /* @__PURE__ */ new Map();
104
- v?.columns?.forEach((e) => {
105
+ _?.columns?.forEach((e) => {
105
106
  let t = e.key || e.field;
106
107
  t && n.set(t, e);
107
108
  });
@@ -117,14 +118,14 @@ var h = c(function({ widget: c, data: h = [], onRowClick: g, onDrilldown: _ }) {
117
118
  O({ columns: i });
118
119
  }, [
119
120
  M,
120
- v?.columns,
121
+ _?.columns,
121
122
  O
122
- ]), ce = l((e, t) => {
123
+ ]), F = s((e, t) => {
123
124
  A((n) => ({
124
125
  ...n,
125
126
  [e]: t
126
127
  }));
127
- }, []), le = l((e, t) => {
128
+ }, []), ue = s((e, t) => {
128
129
  let n = {
129
130
  ...k,
130
131
  [e]: t
@@ -137,54 +138,54 @@ var h = c(function({ widget: c, data: h = [], onRowClick: g, onDrilldown: _ }) {
137
138
  j,
138
139
  M,
139
140
  P
140
- ]), F = l((e, t) => {
141
+ ]), de = s((e, t) => {
141
142
  let n = j ?? M.map((e) => e.key), r = n.indexOf(e);
142
143
  if (r < 0 || e === t) return;
143
144
  let i = [...n];
144
145
  i.splice(r, 1);
145
146
  let a = i.indexOf(t);
146
- a < 0 || (i.splice(a, 0, e), se(i), P(i, k));
147
+ a < 0 || (i.splice(a, 0, e), le(i), P(i, k));
147
148
  }, [
148
149
  j,
149
150
  M,
150
151
  k,
151
152
  P
152
- ]), I = u(() => {
153
+ ]), I = c(() => {
153
154
  let e = {};
154
- return v?.columns?.forEach((t) => {
155
+ return _?.columns?.forEach((t) => {
155
156
  t.format && (t.key || t.field) && (e[t.key || t.field || ""] = {
156
157
  type: t.format,
157
158
  ...t.linkPattern ? { linkPattern: t.linkPattern } : {}
158
159
  });
159
160
  }), e;
160
- }, [v?.columns]), L = u(() => {
161
+ }, [_?.columns]), L = c(() => {
161
162
  let e = {};
162
- return v?.columns?.forEach((t) => {
163
+ return _?.columns?.forEach((t) => {
163
164
  let n = t.key || t.field;
164
165
  n && t.cellChart && (e[n] = t.cellChart);
165
166
  }), e;
166
- }, [v?.columns]), R = v?.conditionalRules, z = v?.rowRules, B = u(() => {
167
+ }, [_?.columns]), R = _?.conditionalRules, z = _?.rowRules, B = c(() => {
167
168
  let e = {};
168
- return v?.columns?.forEach((t) => {
169
+ return _?.columns?.forEach((t) => {
169
170
  let n = t.key || t.field;
170
171
  n && t.conditionalRules?.length && (e[n] = t.conditionalRules);
171
172
  }), e;
172
- }, [v?.columns]), V = u(() => {
173
+ }, [_?.columns]), V = c(() => {
173
174
  let e = {};
174
- return v?.columns?.forEach((t) => {
175
+ return _?.columns?.forEach((t) => {
175
176
  let n = t.key || t.field;
176
177
  n && t.total && t.total !== "none" && (e[n] = t.total);
177
178
  }), e;
178
- }, [v?.columns]), H = v?.showTotals === !0 || Object.keys(V).length > 0, U = u(() => {
179
- let e = y;
180
- return v?.showSearch !== !1 && (e = re(e, w, N)), e = ne(e, S), e;
179
+ }, [_?.columns]), H = _?.showTotals === !0 || Object.keys(V).length > 0, U = c(() => {
180
+ let e = v;
181
+ return _?.showSearch !== !1 && (e = f(e, w, N)), e = ae(e, C), e;
181
182
  }, [
182
- y,
183
+ v,
183
184
  w,
184
- S,
185
+ C,
185
186
  N,
186
- v?.showSearch
187
- ]), ue = u(() => {
187
+ _?.showSearch
188
+ ]), fe = c(() => {
188
189
  let e = {};
189
190
  for (let t of N) {
190
191
  let n = 0;
@@ -195,7 +196,7 @@ var h = c(function({ widget: c, data: h = [], onRowClick: g, onDrilldown: _ }) {
195
196
  e[t.key] = n;
196
197
  }
197
198
  return e;
198
- }, [N, U]), de = u(() => {
199
+ }, [N, U]), pe = c(() => {
199
200
  if (!H) return {};
200
201
  let e = {};
201
202
  for (let t of N) {
@@ -214,22 +215,22 @@ var h = c(function({ widget: c, data: h = [], onRowClick: g, onDrilldown: _ }) {
214
215
  V,
215
216
  U
216
217
  ]);
217
- u(() => {
218
+ c(() => {
218
219
  E((e) => ({
219
220
  ...e,
220
221
  totalItems: U.length
221
222
  }));
222
223
  }, [U.length]);
223
- let fe = u(() => {
224
- if (v?.showPagination === !1) return U;
224
+ let me = c(() => {
225
+ if (_?.showPagination === !1) return U;
225
226
  let e = T.page * T.pageSize;
226
227
  return U.slice(e, e + T.pageSize);
227
228
  }, [
228
229
  U,
229
230
  T,
230
- v?.showPagination
231
- ]), W = v?.virtualized === !0, G = v?.rowHeight && v.rowHeight > 0 ? v.rowHeight : 44, K = te(null), [q, pe] = d(0), [J, Y] = d(0);
232
- ee(() => {
231
+ _?.showPagination
232
+ ]), W = _?.virtualized === !0, G = _?.rowHeight && _.rowHeight > 0 ? _.rowHeight : 44, K = re(null), [q, he] = l(0), [J, Y] = l(0);
233
+ ne(() => {
233
234
  if (!W) return;
234
235
  let e = K.current;
235
236
  if (!e) return;
@@ -237,7 +238,7 @@ var h = c(function({ widget: c, data: h = [], onRowClick: g, onDrilldown: _ }) {
237
238
  let t = typeof ResizeObserver < "u" ? new ResizeObserver(() => Y(e.clientHeight)) : void 0;
238
239
  return t?.observe(e), () => t?.disconnect();
239
240
  }, [W]);
240
- let X = u(() => {
241
+ let X = c(() => {
241
242
  if (!W) return null;
242
243
  let e = U.length, t = J > 0 ? Math.ceil(J / G) : 20, n = Math.max(0, Math.floor(q / G) - 6), r = Math.min(e, n + t + 12);
243
244
  return {
@@ -252,7 +253,7 @@ var h = c(function({ widget: c, data: h = [], onRowClick: g, onDrilldown: _ }) {
252
253
  J,
253
254
  q,
254
255
  G
255
- ]), me = W && X ? X.rows : fe, he = W && X ? X.startIndex : 0, Z = v?.frozenColumns && v.frozenColumns > 0 ? v.frozenColumns : 0, { displayColumns: Q, frozenLefts: $ } = u(() => {
256
+ ]), ge = W && X ? X.rows : me, _e = W && X ? X.startIndex : 0, Z = _?.frozenColumns && _.frozenColumns > 0 ? _.frozenColumns : 0, { displayColumns: Q, frozenLefts: $ } = c(() => {
256
257
  if (Z <= 0) return {
257
258
  displayColumns: N,
258
259
  frozenLefts: {}
@@ -271,8 +272,8 @@ var h = c(function({ widget: c, data: h = [], onRowClick: g, onDrilldown: _ }) {
271
272
  }),
272
273
  frozenLefts: e
273
274
  };
274
- }, [N, Z]), ge = l((e) => {
275
- C((t) => {
275
+ }, [N, Z]), ve = s((e) => {
276
+ se((t) => {
276
277
  if (t.column !== e) return {
277
278
  column: e,
278
279
  direction: "asc"
@@ -283,63 +284,63 @@ var h = c(function({ widget: c, data: h = [], onRowClick: g, onDrilldown: _ }) {
283
284
  direction: n
284
285
  };
285
286
  });
286
- }, []), _e = l((e) => {
287
+ }, []), ye = s((e) => {
287
288
  E((t) => ({
288
289
  ...t,
289
290
  page: e
290
291
  }));
291
- }, []), ve = l((e) => {
292
+ }, []), be = s((e) => {
292
293
  E((t) => ({
293
294
  ...t,
294
295
  pageSize: e,
295
296
  page: 0
296
297
  }));
297
- }, []), ye = l((e, t) => {
298
- let n = v?.crossFilterMappings?.length || v?.enableCrossFilter;
299
- if (x && n) {
298
+ }, []), xe = s((e, t) => {
299
+ let n = _?.crossFilterMappings?.length || _?.enableCrossFilter;
300
+ if (b && n) {
300
301
  let t = N[0]?.key, n = t ? String(e[t]) : void 0;
301
- b(e, n);
302
+ y(e, n);
302
303
  }
303
- _ ? _(e) : g && c.drilldowns?.length && g(e, t);
304
+ h ? h(e) : m && o.drilldowns?.length && m(e, t);
304
305
  }, [
305
- g,
306
- _,
307
- c.drilldowns,
308
- x,
306
+ m,
307
+ h,
308
+ o.drilldowns,
309
309
  b,
310
+ y,
310
311
  N,
311
- v?.crossFilterMappings,
312
- v?.enableCrossFilter
313
- ]), be = l(() => {
312
+ _?.crossFilterMappings,
313
+ _?.enableCrossFilter
314
+ ]), Se = s(() => {
314
315
  let e = [N.map((e) => e.header).join(","), ...U.map((e) => N.map((t) => {
315
316
  let n = e[t.key];
316
317
  if (n == null) return "";
317
318
  let r = String(n);
318
319
  return r.includes(",") || r.includes("\"") ? `"${r.replace(/"/g, "\"\"")}"` : r;
319
320
  }).join(","))].join("\n"), t = new Blob([e], { type: "text/csv" }), n = URL.createObjectURL(t), r = document.createElement("a");
320
- r.href = n, r.download = `${c.title || "table"}-${(/* @__PURE__ */ new Date()).toISOString().split("T")[0]}.csv`, r.click(), URL.revokeObjectURL(n);
321
+ r.href = n, r.download = `${o.title || "table"}-${(/* @__PURE__ */ new Date()).toISOString().split("T")[0]}.csv`, r.click(), URL.revokeObjectURL(n);
321
322
  }, [
322
323
  N,
323
324
  U,
324
- c.title
325
- ]), xe = v?.crossFilterMappings?.length || v?.enableCrossFilter, Se = !!(_ || g && c.drilldowns?.length || xe);
326
- return /* @__PURE__ */ p("div", {
325
+ o.title
326
+ ]), Ce = _?.crossFilterMappings?.length || _?.enableCrossFilter, we = !!(h || m && o.drilldowns?.length || Ce);
327
+ return /* @__PURE__ */ d("div", {
327
328
  className: "flex flex-col h-full",
328
329
  children: [
329
- ae && /* @__PURE__ */ f("div", {
330
+ S && /* @__PURE__ */ u("div", {
330
331
  className: "flex items-center gap-2 px-3 py-2 border-b border-border-default",
331
- children: /* @__PURE__ */ p("button", {
332
+ children: /* @__PURE__ */ d("button", {
332
333
  type: "button",
333
334
  onClick: (e) => {
334
- e.stopPropagation(), ie();
335
+ e.stopPropagation(), x();
335
336
  },
336
337
  className: "\n inline-flex items-center gap-1.5\n px-2.5 py-1 rounded-md\n text-xs font-medium\n bg-action-primary-bg/10 text-action-primary-text\n hover:bg-action-primary-bg/20\n transition-colors\n ",
337
- children: [/* @__PURE__ */ f("svg", {
338
+ children: [/* @__PURE__ */ u("svg", {
338
339
  className: "w-3.5 h-3.5",
339
340
  fill: "none",
340
341
  stroke: "currentColor",
341
342
  viewBox: "0 0 24 24",
342
- children: /* @__PURE__ */ f("path", {
343
+ children: /* @__PURE__ */ u("path", {
343
344
  strokeLinecap: "round",
344
345
  strokeLinejoin: "round",
345
346
  strokeWidth: 2,
@@ -348,38 +349,39 @@ var h = c(function({ widget: c, data: h = [], onRowClick: g, onDrilldown: _ }) {
348
349
  }), "Clear Filter"]
349
350
  })
350
351
  }),
351
- (v?.showSearch !== !1 || v?.showExport !== !1) && /* @__PURE__ */ p("div", {
352
+ (_?.showSearch !== !1 || _?.showExport !== !1) && /* @__PURE__ */ d("div", {
352
353
  className: "flex items-center justify-between p-3 border-b border-border-default",
353
- children: [v?.showSearch !== !1 && /* @__PURE__ */ p("div", {
354
+ children: [_?.showSearch !== !1 && /* @__PURE__ */ d("div", {
354
355
  className: "relative flex items-center",
355
- children: [/* @__PURE__ */ f("svg", {
356
+ children: [/* @__PURE__ */ u("svg", {
356
357
  className: "absolute left-3 w-4 h-4 text-text-secondary pointer-events-none",
357
358
  fill: "none",
358
359
  stroke: "currentColor",
359
360
  viewBox: "0 0 24 24",
360
- children: /* @__PURE__ */ f("path", {
361
+ children: /* @__PURE__ */ u("path", {
361
362
  strokeLinecap: "round",
362
363
  strokeLinejoin: "round",
363
364
  strokeWidth: 2,
364
365
  d: "M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"
365
366
  })
366
- }), /* @__PURE__ */ f("input", {
367
+ }), /* @__PURE__ */ u("input", {
367
368
  type: "text",
368
- placeholder: "Search products...",
369
+ placeholder: g("bigconsole.widget.table.search", "Search…"),
370
+ "aria-label": g("bigconsole.widget.table.search", "Search…"),
369
371
  value: w,
370
- onChange: (e) => oe(e.target.value),
372
+ onChange: (e) => ce(e.target.value),
371
373
  className: "\n pl-10 pr-4 py-2\n text-sm text-text-primary\n bg-bg-surface\n border border-border-default\n rounded-md\n focus:outline-none focus:ring-2 focus:ring-action-primary-bg focus:border-action-primary-bg\n w-48 sm:w-64\n placeholder:text-text-muted\n "
372
374
  })]
373
- }), v?.showExport !== !1 && /* @__PURE__ */ p("button", {
375
+ }), _?.showExport !== !1 && /* @__PURE__ */ d("button", {
374
376
  type: "button",
375
- onClick: be,
377
+ onClick: Se,
376
378
  className: "\n inline-flex items-center gap-2\n px-3 py-2\n text-sm font-medium\n text-text-primary\n bg-bg-surface\n border border-border-default\n rounded-md\n hover:bg-bg-sunken\n transition-colors\n ",
377
- children: [/* @__PURE__ */ f("svg", {
379
+ children: [/* @__PURE__ */ u("svg", {
378
380
  className: "w-4 h-4",
379
381
  fill: "none",
380
382
  stroke: "currentColor",
381
383
  viewBox: "0 0 24 24",
382
- children: /* @__PURE__ */ f("path", {
384
+ children: /* @__PURE__ */ u("path", {
383
385
  strokeLinecap: "round",
384
386
  strokeLinejoin: "round",
385
387
  strokeWidth: 2,
@@ -388,28 +390,28 @@ var h = c(function({ widget: c, data: h = [], onRowClick: g, onDrilldown: _ }) {
388
390
  }), "Export CSV"]
389
391
  })]
390
392
  }),
391
- /* @__PURE__ */ p("div", {
393
+ /* @__PURE__ */ d("div", {
392
394
  ref: K,
393
395
  className: "flex-1 overflow-auto",
394
- onScroll: W ? (e) => pe(e.target.scrollTop) : void 0,
395
- children: [/* @__PURE__ */ p("table", {
396
+ onScroll: W ? (e) => he(e.target.scrollTop) : void 0,
397
+ children: [/* @__PURE__ */ d("table", {
396
398
  className: "w-full",
397
399
  children: [
398
- /* @__PURE__ */ f(a, {
400
+ /* @__PURE__ */ u(a, {
399
401
  columns: Q,
400
- sortState: S,
401
- onSort: ge,
402
+ sortState: C,
403
+ onSort: ve,
402
404
  frozenLefts: Z > 0 ? $ : void 0,
403
405
  editable: D,
404
- onColumnResize: D ? ce : void 0,
405
- onColumnResizeEnd: D ? le : void 0,
406
- onColumnReorder: D ? F : void 0
406
+ onColumnResize: D ? F : void 0,
407
+ onColumnResizeEnd: D ? ue : void 0,
408
+ onColumnReorder: D ? de : void 0
407
409
  }),
408
- /* @__PURE__ */ p("tbody", { children: [
409
- W && X && X.topSpacer > 0 && /* @__PURE__ */ f("tr", {
410
+ /* @__PURE__ */ d("tbody", { children: [
411
+ W && X && X.topSpacer > 0 && /* @__PURE__ */ u("tr", {
410
412
  "aria-hidden": "true",
411
413
  style: { height: X.topSpacer },
412
- children: /* @__PURE__ */ f("td", {
414
+ children: /* @__PURE__ */ u("td", {
413
415
  colSpan: Q.length,
414
416
  style: {
415
417
  padding: 0,
@@ -417,32 +419,32 @@ var h = c(function({ widget: c, data: h = [], onRowClick: g, onDrilldown: _ }) {
417
419
  }
418
420
  })
419
421
  }),
420
- me.map((e, t) => {
421
- let n = he + t;
422
- return /* @__PURE__ */ f("tr", {
422
+ ge.map((e, t) => {
423
+ let n = _e + t;
424
+ return /* @__PURE__ */ u("tr", {
423
425
  className: `
424
- ${Se ? "cursor-pointer hover:bg-bg-sunken/50" : ""}
426
+ ${we ? "cursor-pointer hover:bg-bg-sunken/50" : ""}
425
427
  ${n % 2 == 0 ? "bg-bg-surface" : "bg-bg-sunken/30"}
426
428
  ${i(e, z)}
427
429
  `,
428
430
  style: W ? { height: G } : void 0,
429
- onClick: () => ye(e, n),
430
- children: Q.map((t) => /* @__PURE__ */ f(o, {
431
+ onClick: () => xe(e, n),
432
+ children: Q.map((t) => /* @__PURE__ */ u(ee, {
431
433
  value: e[t.key],
432
434
  column: t,
433
435
  format: I[t.key],
434
436
  rowData: e,
435
437
  conditionalRules: B[t.key] ?? R,
436
- dataBarMax: ue[t.key],
438
+ dataBarMax: fe[t.key],
437
439
  stickyLeft: $[t.key],
438
440
  cellChart: L[t.key]
439
441
  }, t.key))
440
442
  }, n);
441
443
  }),
442
- W && X && X.bottomSpacer > 0 && /* @__PURE__ */ f("tr", {
444
+ W && X && X.bottomSpacer > 0 && /* @__PURE__ */ u("tr", {
443
445
  "aria-hidden": "true",
444
446
  style: { height: X.bottomSpacer },
445
- children: /* @__PURE__ */ f("td", {
447
+ children: /* @__PURE__ */ u("td", {
446
448
  colSpan: Q.length,
447
449
  style: {
448
450
  padding: 0,
@@ -451,11 +453,11 @@ var h = c(function({ widget: c, data: h = [], onRowClick: g, onDrilldown: _ }) {
451
453
  })
452
454
  })
453
455
  ] }),
454
- H && U.length > 0 && /* @__PURE__ */ f("tfoot", { children: /* @__PURE__ */ f("tr", {
456
+ H && U.length > 0 && /* @__PURE__ */ u("tfoot", { children: /* @__PURE__ */ u("tr", {
455
457
  className: "bg-bg-sunken/50 font-semibold border-t-2 border-border-default",
456
458
  children: Q.map((e, t) => {
457
- let n = de[e.key], r = I[e.key], i = $[e.key];
458
- return /* @__PURE__ */ f("td", {
459
+ let n = pe[e.key], r = I[e.key], i = $[e.key];
460
+ return /* @__PURE__ */ u("td", {
459
461
  className: `
460
462
  px-4 py-3 text-sm text-text-primary
461
463
  ${e.align === "center" ? "text-center" : ""}
@@ -463,26 +465,26 @@ var h = c(function({ widget: c, data: h = [], onRowClick: g, onDrilldown: _ }) {
463
465
  ${i == null ? "" : "sticky z-10 bg-bg-sunken"}
464
466
  `,
465
467
  style: i == null ? void 0 : { left: i },
466
- children: n == null ? t === 0 ? "Total" : "" : m(n, r?.type, r?.currency)
468
+ children: n == null ? t === 0 ? "Total" : "" : oe(n, r?.type, r?.currency)
467
469
  }, e.key);
468
470
  })
469
471
  }) })
470
472
  ]
471
- }), U.length === 0 && /* @__PURE__ */ f("div", {
473
+ }), U.length === 0 && /* @__PURE__ */ u("div", {
472
474
  className: "flex items-center justify-center py-12 text-text-secondary",
473
475
  children: w ? "No matching records found" : "No data available"
474
476
  })]
475
477
  }),
476
- !W && v?.showPagination !== !1 && U.length > 0 && /* @__PURE__ */ f(s, {
478
+ !W && _?.showPagination !== !1 && U.length > 0 && /* @__PURE__ */ u(te, {
477
479
  pagination: {
478
480
  ...T,
479
481
  totalItems: U.length
480
482
  },
481
- onPageChange: _e,
482
- onPageSizeChange: ve
483
+ onPageChange: ye,
484
+ onPageSizeChange: be
483
485
  })
484
486
  ]
485
487
  });
486
488
  });
487
489
  //#endregion
488
- export { h as TableWidget, h as default };
490
+ export { p as TableWidget, p as default };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/microfe-bigconsole",
3
- "version": "2026.1103.5",
3
+ "version": "2026.1103.6",
4
4
  "description": "BigConsole - AI-powered analytics and dashboard platform",
5
5
  "type": "module",
6
6
  "files": [