@mmlogic/components 0.3.2 → 0.3.4

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 (64) hide show
  1. package/dist/cjs/index.cjs.js +1 -0
  2. package/dist/cjs/loader.cjs.js +1 -1
  3. package/dist/cjs/mosterdcomponents.cjs.js +1 -1
  4. package/dist/cjs/{mrd-boolean-field_19.cjs.entry.js → mrd-boolean-field_20.cjs.entry.js} +594 -67
  5. package/dist/collection/collection-manifest.json +1 -0
  6. package/dist/collection/components/mrd-field/mrd-field.js +142 -27
  7. package/dist/collection/components/mrd-field/mrd-field.scss +118 -0
  8. package/dist/collection/components/mrd-form/mrd-form.js +3 -3
  9. package/dist/collection/components/mrd-hyperlink-field/mrd-hyperlink-field.js +79 -18
  10. package/dist/collection/components/mrd-hyperlink-field/mrd-hyperlink-field.scss +22 -0
  11. package/dist/collection/components/mrd-image-field/mrd-image-field.js +1 -1
  12. package/dist/collection/components/mrd-layout-section/mrd-layout-section.js +54 -15
  13. package/dist/collection/components/mrd-layout-section/mrd-layout-section.scss +76 -0
  14. package/dist/collection/components/mrd-longtext-field/mrd-longtext-field.js +1 -1
  15. package/dist/collection/components/mrd-number-field/mrd-number-field.js +2 -2
  16. package/dist/collection/components/mrd-secret-field/mrd-secret-field.js +229 -0
  17. package/dist/collection/components/mrd-secret-field/mrd-secret-field.scss +73 -0
  18. package/dist/collection/components/mrd-table/mrd-table.js +46 -6
  19. package/dist/collection/components/mrd-table/mrd-table.scss +36 -0
  20. package/dist/collection/components/mrd-text-field/mrd-text-field.js +1 -1
  21. package/dist/collection/components/mrd-textarea-field/mrd-textarea-field.js +1 -1
  22. package/dist/collection/components/mrd-time-field/mrd-time-field.js +1 -1
  23. package/dist/collection/dev/api.js +1 -1
  24. package/dist/collection/dev/app.js +9 -4
  25. package/dist/collection/dev/example-data.js +12 -2
  26. package/dist/collection/types/client-layout.js +1 -0
  27. package/dist/collection/utils/cell-renderer.js +2 -0
  28. package/dist/collection/utils/i18n.js +269 -1
  29. package/dist/collection/utils/validation.js +6 -2
  30. package/dist/components/client-layout.js +1 -1
  31. package/dist/components/format.js +1 -1
  32. package/dist/components/i18n.js +1 -1
  33. package/dist/components/mrd-field2.js +1 -1
  34. package/dist/components/mrd-form.js +1 -1
  35. package/dist/components/mrd-hyperlink-field2.js +1 -1
  36. package/dist/components/mrd-image-field2.js +1 -1
  37. package/dist/components/mrd-layout-section.js +1 -1
  38. package/dist/components/mrd-longtext-field2.js +1 -1
  39. package/dist/components/mrd-number-field2.js +1 -1
  40. package/dist/components/mrd-secret-field.d.ts +11 -0
  41. package/dist/components/mrd-secret-field.js +1 -0
  42. package/dist/components/mrd-secret-field2.js +1 -0
  43. package/dist/components/mrd-table2.js +1 -1
  44. package/dist/components/mrd-text-field2.js +1 -1
  45. package/dist/components/mrd-textarea-field2.js +1 -1
  46. package/dist/components/mrd-time-field2.js +1 -1
  47. package/dist/components/validation.js +1 -1
  48. package/dist/esm/index.js +1 -0
  49. package/dist/esm/loader.js +1 -1
  50. package/dist/esm/mosterdcomponents.js +1 -1
  51. package/dist/esm/{mrd-boolean-field_19.entry.js → mrd-boolean-field_20.entry.js} +594 -68
  52. package/dist/mosterdcomponents/index.esm.js +1 -1
  53. package/dist/mosterdcomponents/mosterdcomponents.esm.js +1 -1
  54. package/dist/mosterdcomponents/p-c9839596.entry.js +1 -0
  55. package/dist/types/components/mrd-field/mrd-field.d.ts +14 -0
  56. package/dist/types/components/mrd-hyperlink-field/mrd-hyperlink-field.d.ts +12 -4
  57. package/dist/types/components/mrd-layout-section/mrd-layout-section.d.ts +5 -0
  58. package/dist/types/components/mrd-secret-field/mrd-secret-field.d.ts +22 -0
  59. package/dist/types/components/mrd-table/mrd-table.d.ts +6 -0
  60. package/dist/types/components.d.ts +109 -13
  61. package/dist/types/types/client-layout.d.ts +14 -1
  62. package/dist/types/utils/cell-renderer.d.ts +1 -0
  63. package/package.json +1 -1
  64. package/dist/mosterdcomponents/p-2a099635.entry.js +0 -1
@@ -21,6 +21,7 @@ export class MrdTable {
21
21
  this.debounceTimer = null;
22
22
  this.outsideClickHandler = null;
23
23
  this.keydownHandler = null;
24
+ this.createPickerClickHandler = null;
24
25
  // ── Props ──────────────────────────────────────────────────────────────────
25
26
  /** The VIEW or RELATED_VIEW layout item. Contains view config, dataClass, fromClass, actions etc. */
26
27
  this.item = null;
@@ -57,6 +58,8 @@ export class MrdTable {
57
58
  this.pendingFilter = null;
58
59
  /** Viewport-relative position for the filter popup. */
59
60
  this.popupPos = { top: 0, left: 0 };
61
+ /** Whether the create-type picker dropdown is open. */
62
+ this.createPickerOpen = false;
60
63
  /** Current scroll offset of the scroll container — drives pagination footer. */
61
64
  this.scrollTop = 0;
62
65
  /** Full text shown in the TEXTBLOCK expand modal (null = closed). */
@@ -193,6 +196,10 @@ export class MrdTable {
193
196
  document.removeEventListener('click', this.outsideClickHandler);
194
197
  this.outsideClickHandler = null;
195
198
  }
199
+ if (this.createPickerClickHandler) {
200
+ document.removeEventListener('click', this.createPickerClickHandler);
201
+ this.createPickerClickHandler = null;
202
+ }
196
203
  if (this.keydownHandler) {
197
204
  document.removeEventListener('keydown', this.keydownHandler);
198
205
  this.keydownHandler = null;
@@ -248,7 +255,7 @@ export class MrdTable {
248
255
  }
249
256
  return `/excel/${(_d = v.dataClass) !== null && _d !== void 0 ? _d : ''}`;
250
257
  }
251
- buildActionDetail(action) {
258
+ buildActionDetail(action, basicType) {
252
259
  var _a, _b, _c;
253
260
  if (action === 'export') {
254
261
  return { action, path: this.buildExcelPath(), qs: this.buildQueryParams(0) };
@@ -258,7 +265,7 @@ export class MrdTable {
258
265
  const parentPath = ((_a = this.item) === null || _a === void 0 ? void 0 : _a.type) === 'RELATED_VIEW'
259
266
  ? `/${(_b = v === null || v === void 0 ? void 0 : v.fromClass) !== null && _b !== void 0 ? _b : ''}/${this.parentId}`
260
267
  : null;
261
- return { action, dataClass: (_c = v === null || v === void 0 ? void 0 : v.dataClass) !== null && _c !== void 0 ? _c : '', parentPath };
268
+ return Object.assign({ action, dataClass: (_c = v === null || v === void 0 ? void 0 : v.dataClass) !== null && _c !== void 0 ? _c : '', parentPath }, (basicType ? { basicType } : {}));
262
269
  }
263
270
  return { action };
264
271
  }
@@ -356,6 +363,29 @@ export class MrdTable {
356
363
  return acc;
357
364
  }, []);
358
365
  }
366
+ toggleCreatePicker() {
367
+ if (this.createPickerOpen) {
368
+ this.closeCreatePicker();
369
+ }
370
+ else {
371
+ this.createPickerOpen = true;
372
+ if (this.createPickerClickHandler)
373
+ document.removeEventListener('click', this.createPickerClickHandler);
374
+ this.createPickerClickHandler = (ev) => {
375
+ const wrap = this.el.querySelector('.mrd-table__create-picker-wrap');
376
+ if (wrap && !wrap.contains(ev.target))
377
+ this.closeCreatePicker();
378
+ };
379
+ document.addEventListener('click', this.createPickerClickHandler);
380
+ }
381
+ }
382
+ closeCreatePicker() {
383
+ this.createPickerOpen = false;
384
+ if (this.createPickerClickHandler) {
385
+ document.removeEventListener('click', this.createPickerClickHandler);
386
+ this.createPickerClickHandler = null;
387
+ }
388
+ }
359
389
  colName(col) {
360
390
  var _a;
361
391
  return (_a = col.name) !== null && _a !== void 0 ? _a : '';
@@ -779,8 +809,17 @@ export class MrdTable {
779
809
  if (!isNaN(idx) && idx !== this.activeViewIdx)
780
810
  this.handleViewSwitch(idx);
781
811
  } }, allViews.map((v, i) => (h("option", { value: String(i), selected: i === this.activeViewIdx }, v.label)))))), hasActions && (h("div", { class: "mrd-table__toolbar-right" }, actions.map(a => {
782
- var _a;
783
- return (h("button", { class: `mrd-table__action mrd-table__action--${(_a = a.variant) !== null && _a !== void 0 ? _a : 'secondary'}`, disabled: a.disabled, onClick: () => this.mrdAction.emit(this.buildActionDetail(a.action)) }, a.icon
812
+ var _a, _b, _c;
813
+ const createTypes = a.action === 'create' ? (_a = this.item) === null || _a === void 0 ? void 0 : _a.createTypes : null;
814
+ if (createTypes === null || createTypes === void 0 ? void 0 : createTypes.length) {
815
+ return (h("div", { class: "mrd-table__create-picker-wrap", key: `action-${a.action}` }, h("button", { class: `mrd-table__action mrd-table__action--${(_b = a.variant) !== null && _b !== void 0 ? _b : 'secondary'}`, onClick: () => this.toggleCreatePicker() }, a.icon
816
+ ? h("svg", { class: "mrd-table__action-icon", "aria-hidden": "true" }, h("use", { href: a.icon }))
817
+ : a.label, h("span", { class: "mrd-table__action-tooltip" }, a.label)), this.createPickerOpen && (h("div", { class: "mrd-table__create-picker" }, createTypes.map(ct => (h("button", { key: ct.type, class: "mrd-table__create-picker-item", onClick: () => {
818
+ this.mrdAction.emit(this.buildActionDetail('create', ct.type));
819
+ this.closeCreatePicker();
820
+ } }, ct.label)))))));
821
+ }
822
+ return (h("button", { key: `action-${a.action}`, class: `mrd-table__action mrd-table__action--${(_c = a.variant) !== null && _c !== void 0 ? _c : 'secondary'}`, disabled: a.disabled, onClick: () => this.mrdAction.emit(this.buildActionDetail(a.action)) }, a.icon
784
823
  ? h("svg", { class: "mrd-table__action-icon", "aria-hidden": "true" }, h("use", { href: a.icon }))
785
824
  : a.label, h("span", { class: "mrd-table__action-tooltip" }, a.label)));
786
825
  })))));
@@ -1222,6 +1261,7 @@ export class MrdTable {
1222
1261
  "openFilterCol": {},
1223
1262
  "pendingFilter": {},
1224
1263
  "popupPos": {},
1264
+ "createPickerOpen": {},
1225
1265
  "scrollTop": {},
1226
1266
  "textblockModal": {},
1227
1267
  "jsonModal": {},
@@ -1277,8 +1317,8 @@ export class MrdTable {
1277
1317
  "text": "Fired when a toolbar action button is clicked.\nFor 'export': includes `path` (relative excel path) and `qs` (current sort+filter params).\nFor 'create': includes `dataClass` (target type) and `parentPath` (e.g. /buyers/123 for RELATED_VIEW)."
1278
1318
  },
1279
1319
  "complexType": {
1280
- "original": "{ action: string; path?: string; qs?: string; dataClass?: string; parentPath?: string | null }",
1281
- "resolved": "{ action: string; path?: string | undefined; qs?: string | undefined; dataClass?: string | undefined; parentPath?: string | null | undefined; }",
1320
+ "original": "{ action: string; path?: string; qs?: string; dataClass?: string; parentPath?: string | null; basicType?: string }",
1321
+ "resolved": "{ action: string; path?: string | undefined; qs?: string | undefined; dataClass?: string | undefined; parentPath?: string | null | undefined; basicType?: string | undefined; }",
1282
1322
  "references": {}
1283
1323
  }
1284
1324
  }, {
@@ -273,6 +273,42 @@
273
273
  display: block;
274
274
  }
275
275
 
276
+ /* ── Create-type picker ──────────────────────────────────────────────────── */
277
+ .mrd-table__create-picker-wrap {
278
+ position: relative;
279
+ }
280
+
281
+ .mrd-table__create-picker {
282
+ position: absolute;
283
+ right: 0;
284
+ top: calc(100% + 4px);
285
+ background: var(--mrd-color-white, #fff);
286
+ border: 1px solid var(--mrd-border-color);
287
+ border-radius: var(--mrd-border-radius);
288
+ box-shadow: var(--mrd-shadow-md, 0 4px 12px rgba(0, 0, 0, 0.12));
289
+ z-index: 10;
290
+ min-width: 10rem;
291
+ padding: var(--mrd-space-1) 0;
292
+ }
293
+
294
+ .mrd-table__create-picker-item {
295
+ display: block;
296
+ width: 100%;
297
+ text-align: left;
298
+ padding: var(--mrd-space-2) var(--mrd-space-3);
299
+ background: none;
300
+ border: none;
301
+ cursor: pointer;
302
+ font-size: var(--mrd-font-size-sm);
303
+ font-family: var(--mrd-font-family);
304
+ color: var(--mrd-color-neutral-800);
305
+ }
306
+
307
+ .mrd-table__create-picker-item:hover {
308
+ background: var(--mrd-color-neutral-50);
309
+ color: var(--mrd-color-neutral-900);
310
+ }
311
+
276
312
  /* ── Filter toggle active state ────────────────────────────────────────── */
277
313
  .mrd-table__filter-toggle--active {
278
314
  background: var(--mrd-color-primary);
@@ -28,7 +28,7 @@ export class MrdTextField {
28
28
  }
29
29
  render() {
30
30
  const hasError = !!this.error;
31
- return (h(Host, { key: 'b1ea3dce848a4ad41b60599804c69a35ccd35570' }, h("div", { key: '2e327824843fe02c5851beae96d52f9eb9ee67ce', class: "mrd-text-field" }, this.label && (h("label", { key: '99026834b30a53d7cf715c59099895211ff6ddb7', class: `mrd-text-field__label${this.required ? ' mrd-text-field__label--required' : ''}` }, this.label)), h("input", { key: '0e56c9115b2016ad3cb3ce8e734297354c70c7e2', class: `mrd-text-field__input${hasError ? ' mrd-text-field__input--error' : ''}`, type: "text", name: this.name, value: this.value, placeholder: this.placeholder, required: this.required, disabled: this.disabled, onInput: this.handleInput, onBlur: this.handleBlur }), hasError && h("span", { key: '0430c32b083484747962147e167b11ed7a1597cc', class: "mrd-text-field__error" }, this.error))));
31
+ return (h(Host, { key: 'fd4e1f389cb452ab80a1e1c7295d884ca935999e' }, h("div", { key: '7b7bde7a18fcd9b8d5779daab88ddabb45dd8692', class: "mrd-text-field" }, this.label && (h("label", { key: '8e2ad4053473cfad4eae4c4634b863ac5ef32fea', class: `mrd-text-field__label${this.required ? ' mrd-text-field__label--required' : ''}` }, this.label)), h("input", { key: 'd32712a6dc2aee4691bc4a580d5ca2ad81e0ff9f', class: `mrd-text-field__input${hasError ? ' mrd-text-field__input--error' : ''}`, type: "text", name: this.name, value: this.value, placeholder: this.placeholder, required: this.required, disabled: this.disabled, onInput: this.handleInput, onBlur: this.handleBlur }), hasError && h("span", { key: '31585dbf82020c81834e1eeada5cd9907a5ead56', class: "mrd-text-field__error" }, this.error))));
32
32
  }
33
33
  static get is() { return "mrd-text-field"; }
34
34
  static get encapsulation() { return "scoped"; }
@@ -66,7 +66,7 @@ export class MrdTextareaField {
66
66
  }
67
67
  }
68
68
  render() {
69
- return (h(Host, { key: '7bc05fae8d48c43b56bde892537930552605727a' }, h("div", { key: '3416e9c5fdf6362602715de8427c5d2ccfa52925', class: "mrd-textarea-field" }, this.label && (h("label", { key: 'c6bd35076738b1a700b53092fb0754250c73e085', class: `mrd-textarea-field__label${this.required ? ' mrd-textarea-field__label--required' : ''}` }, this.label)), h("div", { key: 'ed0483a25a62399d1ac8ee14bc59e3eb44b91814', class: `mrd-textarea-field__container${this.error ? ' mrd-textarea-field__container--error' : ''}` }, h("div", { key: 'd17c6997602b81e8b7f66f1e5cfb12b4836cb892', class: "mrd-textarea-field__editor" })), this.error && h("span", { key: '30a068872e73ca78781c9a5e1fac2c9e3ce30765', class: "mrd-textarea-field__error" }, this.error))));
69
+ return (h(Host, { key: 'e1fd819c598f01e3986946357ec18d608f2c7adc' }, h("div", { key: '20c28e54e61429655b2d4f297bd84e183ad7e971', class: "mrd-textarea-field" }, this.label && (h("label", { key: 'fa46a20badc35c931563600f24a32e0a8c8c07ad', class: `mrd-textarea-field__label${this.required ? ' mrd-textarea-field__label--required' : ''}` }, this.label)), h("div", { key: 'ee928eca0a1b85401b346b7fae8adbe9214a7664', class: `mrd-textarea-field__container${this.error ? ' mrd-textarea-field__container--error' : ''}` }, h("div", { key: '89b00f3c526623c47f0aff7ad862f70dfdc2fe15', class: "mrd-textarea-field__editor" })), this.error && h("span", { key: '458cf8fddee36ddbc384ce4d25765e5aacd3c9d5', class: "mrd-textarea-field__error" }, this.error))));
70
70
  }
71
71
  static get is() { return "mrd-textarea-field"; }
72
72
  static get encapsulation() { return "scoped"; }
@@ -27,7 +27,7 @@ export class MrdTimeField {
27
27
  }
28
28
  render() {
29
29
  const hasError = !!this.error;
30
- return (h(Host, { key: '6a6828d9c5224ddfcc5d17124523037512f4970c' }, h("div", { key: '468d5295170cefc93b1e2d49b7189c8366d306b7', class: "mrd-time-field" }, this.label && (h("label", { key: '52ea233ea0a7e8563145c326c4ef9d27557b6dc8', class: `mrd-time-field__label${this.required ? ' mrd-time-field__label--required' : ''}` }, this.label)), h("input", { key: 'e9f0f75517638bf4e4ead95bf69530b5c395f8bc', class: `mrd-time-field__input${hasError ? ' mrd-time-field__input--error' : ''}`, type: "time", name: this.name, value: this.value, required: this.required, disabled: this.disabled, onChange: this.handleChange, onBlur: this.handleBlur }), hasError && h("span", { key: '4f734c3373444df4f686a7ae6bde84a2ee39d9f4', class: "mrd-time-field__error" }, this.error))));
30
+ return (h(Host, { key: 'c507996709437d8982f9175b286e25598997002d' }, h("div", { key: 'd5f1b7f14d26cae8298cd40491898b39044158f8', class: "mrd-time-field" }, this.label && (h("label", { key: '10976e18df09240e00b045314c4ddd3845d4bfdc', class: `mrd-time-field__label${this.required ? ' mrd-time-field__label--required' : ''}` }, this.label)), h("input", { key: 'bc557333f107a371a7005f9b56dd0395190e63d7', class: `mrd-time-field__input${hasError ? ' mrd-time-field__input--error' : ''}`, type: "time", name: this.name, value: this.value, required: this.required, disabled: this.disabled, onChange: this.handleChange, onBlur: this.handleBlur }), hasError && h("span", { key: 'b5a09c2aa063fa9e2fc3aba411e86b57d879c408', class: "mrd-time-field__error" }, this.error))));
31
31
  }
32
32
  static get is() { return "mrd-time-field"; }
33
33
  static get encapsulation() { return "scoped"; }
@@ -29,7 +29,7 @@ async function apiFetchTenants(token) {
29
29
  }
30
30
 
31
31
  async function apiFetchTypes(token, tenantCode) {
32
- const { ok, status, body } = await apiRequest('GET', `/metadata/${tenantCode}/types?type=BASIC`, token);
32
+ const { ok, status, body } = await apiRequest('GET', `/metadata/${tenantCode}/types`, token);
33
33
  if (!ok) throw new Error(`${status}: ${typeof body === 'string' ? body : JSON.stringify(body)}`);
34
34
  return body; // array of { name, pluralName, type, ... }
35
35
  }
@@ -344,7 +344,7 @@ function renderSectionTabs(layouts) {
344
344
  });
345
345
  }
346
346
 
347
- function renderSection(index) {
347
+ async function renderSection(index) {
348
348
  _activeLayoutIndex = index;
349
349
  const generation = ++_sectionGeneration; // snapshot for stale-fetch detection
350
350
 
@@ -357,6 +357,11 @@ function renderSection(index) {
357
357
  const container = document.getElementById('sections-container');
358
358
  container.innerHTML = '';
359
359
 
360
+ if (_dashboardType === 'form') {
361
+ await renderForm(layout, _dashboardRecord, _dashboardRecord?._links?.self?.href ?? null, container);
362
+ return;
363
+ }
364
+
360
365
  const section = document.createElement('mrd-layout-section');
361
366
  section.items = layout.items;
362
367
  section.data = _dashboardRecord ?? { _links: _dashboardData._links ?? {} };
@@ -581,7 +586,7 @@ async function loadForm() {
581
586
  * @param record - existing record for edit mode (null = new record)
582
587
  * @param selfHref - absolute URL for PATCH; null = POST (new record)
583
588
  */
584
- async function renderForm(layout, record = null, selfHref = null) {
589
+ async function renderForm(layout, record = null, selfHref = null, containerEl = null) {
585
590
  // Build relation metadata map keyed by both relatedClass and mostSignificantClass
586
591
  // so lookups work regardless of which value arrives in events (mrdSearch uses mostSignificantClass).
587
592
  _relationMeta = {};
@@ -623,10 +628,10 @@ async function renderForm(layout, record = null, selfHref = null) {
623
628
  }
624
629
  }
625
630
 
626
- const formPanel = document.getElementById('panel-form');
631
+ const formPanel = containerEl ?? document.getElementById('panel-form');
627
632
  formPanel.innerHTML = `<mrd-form id="live-form" locale="${escHtml(_locale)}"></mrd-form>`;
628
633
 
629
- const form = document.getElementById('live-form');
634
+ const form = formPanel.querySelector('#live-form') ?? document.getElementById('live-form');
630
635
  // Wait for Stencil to fully initialize this specific instance before setting props.
631
636
  // componentOnReady() resolves after componentDidLoad — more reliable than customElements.whenDefined.
632
637
  if (typeof form.componentOnReady === 'function') {
@@ -60,7 +60,8 @@ window.EXAMPLE_LAYOUT = {
60
60
  label: "Settings",
61
61
  items: [
62
62
  { type: "FIELD", name: "isPublic", label: "Public project", dataType: "BOOLEAN", required: false },
63
- { type: "FIELD", name: "isArchived", label: "Archived", dataType: "BOOLEAN", required: false }
63
+ { type: "FIELD", name: "isArchived", label: "Archived", dataType: "BOOLEAN", required: false },
64
+ { type: "FIELD", name: "apiToken", label: "API Token", dataType: "SECRET", required: false, placeholder: "Paste token here" }
64
65
  ]
65
66
  },
66
67
  {
@@ -232,7 +233,14 @@ window.EXAMPLE_COMPANY_METADATA = {
232
233
  label: 'Share classes',
233
234
  tabPage: true,
234
235
  items: [
235
- { type: 'RELATED_VIEW', label: 'Share classes', name: 'view1', relatedClass: 'shareClasses', showTitle: false },
236
+ {
237
+ type: 'RELATED_VIEW', label: 'Share classes', name: 'view1', relatedClass: 'shareClasses', showTitle: false,
238
+ actions: ['NEW', 'EXPORT'],
239
+ createTypes: [
240
+ { type: 'ordinaryShares', label: 'Ordinary shares' },
241
+ { type: 'preferenceShares', label: 'Preference shares' },
242
+ ],
243
+ },
236
244
  ],
237
245
  },
238
246
  ],
@@ -363,6 +371,7 @@ window.EXAMPLE_FIELD_TYPES_ITEMS = [
363
371
  { type: 'FIELD', label: 'Textblock', name: 'fTextblock', dataType: 'TEXTBLOCK', required: false },
364
372
  { type: 'FIELD', label: 'Longtext', name: 'fLongtext', dataType: 'LONGTEXT', required: false },
365
373
  { type: 'FIELD', label: 'JSON', name: 'fJson', dataType: 'JSON', required: false },
374
+ { type: 'FIELD', label: 'Secret', name: 'fSecret', dataType: 'SECRET', required: false },
366
375
  ];
367
376
 
368
377
  window.EXAMPLE_FIELD_TYPES_DATA = {
@@ -387,6 +396,7 @@ window.EXAMPLE_FIELD_TYPES_DATA = {
387
396
  fTextblock: '<p>Dit is een <strong>opgemaakte</strong> tekst met <em>html</em>-inhoud. Geschikt voor langere beschrijvingen met opmaak.</p>',
388
397
  fLongtext: 'Dit is een langere stuk platte tekst zonder opmaak.\nHet kan meerdere regels bevatten en wordt getoond in een pre-blok zodat witruimte bewaard blijft.',
389
398
  fJson: { id: 1, status: 'active', tags: ['alpha', 'beta'], meta: { created: '2024-01-01', valid: true } },
399
+ fSecret: 'sk-live-abc123xyz',
390
400
  _links: {
391
401
  fRelation: { href: '/data/demo/entities/person-1', name: 'A. Jansen' },
392
402
  },
@@ -47,6 +47,7 @@ export var ClientLayoutItemFieldDataType;
47
47
  ClientLayoutItemFieldDataType["IMAGE"] = "IMAGE";
48
48
  ClientLayoutItemFieldDataType["LONGTEXT"] = "LONGTEXT";
49
49
  ClientLayoutItemFieldDataType["JSON"] = "JSON";
50
+ ClientLayoutItemFieldDataType["SECRET"] = "SECRET";
50
51
  })(ClientLayoutItemFieldDataType || (ClientLayoutItemFieldDataType = {}));
51
52
  // ─── Relation display / edit behaviour ───────────────────────────────────────
52
53
  export var ClientLayoutItemRelationDisplayType;
@@ -70,6 +70,8 @@ export class CellRenderer {
70
70
  const str = typeof value === 'object' ? JSON.stringify(value) : String(value);
71
71
  return str.replace(/[\r\n]+/g, ' ').trim();
72
72
  }
73
+ case 'SECRET':
74
+ return value ? '••••••••' : '';
73
75
  default:
74
76
  return String(value);
75
77
  }
@@ -57,6 +57,10 @@ const translations = {
57
57
  // mrd-table textblock
58
58
  textblock_show_more: 'Meer tonen',
59
59
  close: 'Sluiten',
60
+ // history badge
61
+ history_until: 'tot',
62
+ history_badge_tooltip: 'Vorige waarden',
63
+ hyperlink_name: 'Linktekst (optioneel)',
60
64
  },
61
65
  en: {
62
66
  required: 'This field is required',
@@ -116,6 +120,10 @@ const translations = {
116
120
  // mrd-table textblock
117
121
  textblock_show_more: 'Show more',
118
122
  close: 'Close',
123
+ // history badge
124
+ history_until: 'until',
125
+ history_badge_tooltip: 'Previous values',
126
+ hyperlink_name: 'Link text (optional)',
119
127
  },
120
128
  ar: {
121
129
  required: 'هذا الحقل مطلوب',
@@ -175,6 +183,10 @@ const translations = {
175
183
  // mrd-table textblock
176
184
  textblock_show_more: 'عرض المزيد',
177
185
  close: 'إغلاق',
186
+ // history badge
187
+ history_until: 'حتى',
188
+ history_badge_tooltip: 'القيم السابقة',
189
+ hyperlink_name: 'نص الرابط (اختياري)',
178
190
  },
179
191
  fr: {
180
192
  required: 'Ce champ est obligatoire',
@@ -234,11 +246,267 @@ const translations = {
234
246
  // mrd-table textblock
235
247
  textblock_show_more: 'Voir plus',
236
248
  close: 'Fermer',
249
+ // history badge
250
+ history_until: "jusqu'au",
251
+ history_badge_tooltip: 'Valeurs précédentes',
252
+ hyperlink_name: 'Texte du lien (optionnel)',
253
+ },
254
+ de: {
255
+ required: 'Dieses Feld ist erforderlich',
256
+ select_placeholder: 'Option auswählen',
257
+ search_placeholder: 'Suchen...',
258
+ upload_file: 'Datei hochladen',
259
+ choose_file: 'Datei auswählen',
260
+ clear: 'Löschen',
261
+ today: 'Heute',
262
+ invalid_email: 'Bitte geben Sie eine gültige E-Mail-Adresse ein',
263
+ invalid_url: 'Bitte geben Sie eine gültige URL ein',
264
+ invalid_number: 'Bitte geben Sie eine gültige Zahl ein',
265
+ drop_file_here: 'Datei hier ablegen oder',
266
+ browse: 'durchsuchen',
267
+ file_too_large: 'Datei ist zu groß',
268
+ search_results: 'Suchergebnisse',
269
+ no_results: 'Keine Ergebnisse gefunden',
270
+ loading: 'Laden...',
271
+ submit: 'Speichern',
272
+ cancel: 'Abbrechen',
273
+ remove: 'Entfernen',
274
+ add: 'Hinzufügen',
275
+ yes: 'Ja',
276
+ no: 'Nein',
277
+ // mrd-table footer
278
+ table_of: 'von',
279
+ download: 'Herunterladen',
280
+ // mrd-table toolbar
281
+ table_filter: 'Filtern',
282
+ table_filter_hide: 'Filter ausblenden',
283
+ table_filter_active: 'aktiv',
284
+ table_filter_clear_all: 'Alle Filter löschen',
285
+ table_new_record: 'Neuer Eintrag',
286
+ table_export_excel: 'Als Excel exportieren',
287
+ // mrd-table filter popup
288
+ filter_sorting: 'Sortierung',
289
+ filter_ascending: 'Aufsteigend',
290
+ filter_descending: 'Absteigend',
291
+ filter_section: 'Filter',
292
+ filter_apply: 'Anwenden',
293
+ filter_clear: 'Löschen',
294
+ filter_contains: 'Enthält',
295
+ filter_starts_with: 'Beginnt mit',
296
+ filter_equals: 'Gleich',
297
+ filter_has_value: 'Hat Wert',
298
+ filter_is_empty: 'Ist leer',
299
+ filter_is_not_empty: 'Ist nicht leer',
300
+ filter_exact: 'Genau',
301
+ filter_range: 'Bereich',
302
+ filter_from: 'Von',
303
+ filter_to: 'Bis',
304
+ filter_all: 'Alle',
305
+ filter_select_all: 'Alle',
306
+ filter_select_none: 'Keine',
307
+ filter_search_value: 'Suchwert...',
308
+ filter_no_support: 'Filterung ist für diesen Feldtyp nicht verfügbar.',
309
+ // mrd-table textblock
310
+ textblock_show_more: 'Mehr anzeigen',
311
+ close: 'Schließen',
312
+ // history badge
313
+ history_until: 'bis',
314
+ history_badge_tooltip: 'Vorherige Werte',
315
+ hyperlink_name: 'Linktext (optional)',
316
+ },
317
+ es: {
318
+ required: 'Este campo es obligatorio',
319
+ select_placeholder: 'Seleccionar una opción',
320
+ search_placeholder: 'Buscar...',
321
+ upload_file: 'Subir archivo',
322
+ choose_file: 'Elegir archivo',
323
+ clear: 'Borrar',
324
+ today: 'Hoy',
325
+ invalid_email: 'Por favor, introduzca una dirección de correo electrónico válida',
326
+ invalid_url: 'Por favor, introduzca una URL válida',
327
+ invalid_number: 'Por favor, introduzca un número válido',
328
+ drop_file_here: 'Suelte el archivo aquí o',
329
+ browse: 'explorar',
330
+ file_too_large: 'El archivo es demasiado grande',
331
+ search_results: 'Resultados de búsqueda',
332
+ no_results: 'No se encontraron resultados',
333
+ loading: 'Cargando...',
334
+ submit: 'Guardar',
335
+ cancel: 'Cancelar',
336
+ remove: 'Eliminar',
337
+ add: 'Añadir',
338
+ yes: 'Sí',
339
+ no: 'No',
340
+ // mrd-table footer
341
+ table_of: 'de',
342
+ download: 'Descargar',
343
+ // mrd-table toolbar
344
+ table_filter: 'Filtrar',
345
+ table_filter_hide: 'Ocultar filtro',
346
+ table_filter_active: 'activo',
347
+ table_filter_clear_all: 'Borrar todos los filtros',
348
+ table_new_record: 'Nuevo registro',
349
+ table_export_excel: 'Exportar a Excel',
350
+ // mrd-table filter popup
351
+ filter_sorting: 'Ordenación',
352
+ filter_ascending: 'Ascendente',
353
+ filter_descending: 'Descendente',
354
+ filter_section: 'Filtro',
355
+ filter_apply: 'Aplicar',
356
+ filter_clear: 'Borrar',
357
+ filter_contains: 'Contiene',
358
+ filter_starts_with: 'Empieza por',
359
+ filter_equals: 'Igual a',
360
+ filter_has_value: 'Tiene valor',
361
+ filter_is_empty: 'Está vacío',
362
+ filter_is_not_empty: 'No está vacío',
363
+ filter_exact: 'Exacto',
364
+ filter_range: 'Rango',
365
+ filter_from: 'Desde',
366
+ filter_to: 'Hasta',
367
+ filter_all: 'Todos',
368
+ filter_select_all: 'Todos',
369
+ filter_select_none: 'Ninguno',
370
+ filter_search_value: 'Valor de búsqueda...',
371
+ filter_no_support: 'El filtrado no está disponible para este tipo de campo.',
372
+ // mrd-table textblock
373
+ textblock_show_more: 'Mostrar más',
374
+ close: 'Cerrar',
375
+ // history badge
376
+ history_until: 'hasta',
377
+ history_badge_tooltip: 'Valores anteriores',
378
+ hyperlink_name: 'Texto del enlace (opcional)',
379
+ },
380
+ it: {
381
+ required: 'Questo campo è obbligatorio',
382
+ select_placeholder: "Seleziona un'opzione",
383
+ search_placeholder: 'Cerca...',
384
+ upload_file: 'Carica file',
385
+ choose_file: 'Scegli file',
386
+ clear: 'Cancella',
387
+ today: 'Oggi',
388
+ invalid_email: 'Inserisci un indirizzo email valido',
389
+ invalid_url: 'Inserisci un URL valido',
390
+ invalid_number: 'Inserisci un numero valido',
391
+ drop_file_here: 'Trascina il file qui o',
392
+ browse: 'sfoglia',
393
+ file_too_large: 'Il file è troppo grande',
394
+ search_results: 'Risultati della ricerca',
395
+ no_results: 'Nessun risultato trovato',
396
+ loading: 'Caricamento...',
397
+ submit: 'Salva',
398
+ cancel: 'Annulla',
399
+ remove: 'Rimuovi',
400
+ add: 'Aggiungi',
401
+ yes: 'Sì',
402
+ no: 'No',
403
+ // mrd-table footer
404
+ table_of: 'di',
405
+ download: 'Scarica',
406
+ // mrd-table toolbar
407
+ table_filter: 'Filtra',
408
+ table_filter_hide: 'Nascondi filtro',
409
+ table_filter_active: 'attivo',
410
+ table_filter_clear_all: 'Cancella tutti i filtri',
411
+ table_new_record: 'Nuovo record',
412
+ table_export_excel: 'Esporta in Excel',
413
+ // mrd-table filter popup
414
+ filter_sorting: 'Ordinamento',
415
+ filter_ascending: 'Crescente',
416
+ filter_descending: 'Decrescente',
417
+ filter_section: 'Filtro',
418
+ filter_apply: 'Applica',
419
+ filter_clear: 'Cancella',
420
+ filter_contains: 'Contiene',
421
+ filter_starts_with: 'Inizia con',
422
+ filter_equals: 'Uguale a',
423
+ filter_has_value: 'Ha valore',
424
+ filter_is_empty: 'È vuoto',
425
+ filter_is_not_empty: 'Non è vuoto',
426
+ filter_exact: 'Esatto',
427
+ filter_range: 'Intervallo',
428
+ filter_from: 'Da',
429
+ filter_to: 'A',
430
+ filter_all: 'Tutti',
431
+ filter_select_all: 'Tutti',
432
+ filter_select_none: 'Nessuno',
433
+ filter_search_value: 'Valore di ricerca...',
434
+ filter_no_support: 'Il filtro non è disponibile per questo tipo di campo.',
435
+ // mrd-table textblock
436
+ textblock_show_more: 'Mostra altro',
437
+ close: 'Chiudi',
438
+ // history badge
439
+ history_until: 'fino a',
440
+ history_badge_tooltip: 'Valori precedenti',
441
+ hyperlink_name: 'Testo del collegamento (opzionale)',
442
+ },
443
+ uk: {
444
+ required: "Це поле обов'язкове",
445
+ select_placeholder: 'Виберіть варіант',
446
+ search_placeholder: 'Пошук...',
447
+ upload_file: 'Завантажити файл',
448
+ choose_file: 'Вибрати файл',
449
+ clear: 'Очистити',
450
+ today: 'Сьогодні',
451
+ invalid_email: 'Будь ласка, введіть дійсну адресу електронної пошти',
452
+ invalid_url: 'Будь ласка, введіть дійсну URL-адресу',
453
+ invalid_number: 'Будь ласка, введіть дійсне число',
454
+ drop_file_here: 'Перетягніть файл сюди або',
455
+ browse: 'огляд',
456
+ file_too_large: 'Файл занадто великий',
457
+ search_results: 'Результати пошуку',
458
+ no_results: 'Результатів не знайдено',
459
+ loading: 'Завантаження...',
460
+ submit: 'Зберегти',
461
+ cancel: 'Скасувати',
462
+ remove: 'Видалити',
463
+ add: 'Додати',
464
+ yes: 'Так',
465
+ no: 'Ні',
466
+ // mrd-table footer
467
+ table_of: 'з',
468
+ download: 'Завантажити',
469
+ // mrd-table toolbar
470
+ table_filter: 'Фільтрувати',
471
+ table_filter_hide: 'Сховати фільтр',
472
+ table_filter_active: 'активний',
473
+ table_filter_clear_all: 'Очистити всі фільтри',
474
+ table_new_record: 'Новий запис',
475
+ table_export_excel: 'Експортувати до Excel',
476
+ // mrd-table filter popup
477
+ filter_sorting: 'Сортування',
478
+ filter_ascending: 'За зростанням',
479
+ filter_descending: 'За спаданням',
480
+ filter_section: 'Фільтр',
481
+ filter_apply: 'Застосувати',
482
+ filter_clear: 'Очистити',
483
+ filter_contains: 'Містить',
484
+ filter_starts_with: 'Починається з',
485
+ filter_equals: 'Дорівнює',
486
+ filter_has_value: 'Має значення',
487
+ filter_is_empty: 'Порожнє',
488
+ filter_is_not_empty: 'Не порожнє',
489
+ filter_exact: 'Точно',
490
+ filter_range: 'Діапазон',
491
+ filter_from: 'Від',
492
+ filter_to: 'До',
493
+ filter_all: 'Всі',
494
+ filter_select_all: 'Всі',
495
+ filter_select_none: 'Жодного',
496
+ filter_search_value: 'Значення для пошуку...',
497
+ filter_no_support: 'Фільтрування недоступне для цього типу поля.',
498
+ // mrd-table textblock
499
+ textblock_show_more: 'Показати більше',
500
+ close: 'Закрити',
501
+ // history badge
502
+ history_until: 'до',
503
+ history_badge_tooltip: 'Попередні значення',
504
+ hyperlink_name: "Текст посилання (необов'язково)",
237
505
  },
238
506
  };
239
507
  export function t(key, locale) {
240
508
  var _a, _b, _c;
241
- const lang = locale.split('-')[0].toLowerCase();
509
+ const lang = (locale !== null && locale !== void 0 ? locale : 'en').split('-')[0].toLowerCase();
242
510
  const dict = (_a = translations[lang]) !== null && _a !== void 0 ? _a : translations['en'];
243
511
  return (_c = (_b = dict[key]) !== null && _b !== void 0 ? _b : translations['en'][key]) !== null && _c !== void 0 ? _c : key;
244
512
  }
@@ -7,6 +7,10 @@ export function validateRequired(value) {
7
7
  if (Array.isArray(value))
8
8
  return value.length > 0;
9
9
  if (typeof value === 'object') {
10
+ // HyperlinkValue check
11
+ const hv = value;
12
+ if ('href' in hv)
13
+ return typeof hv.href === 'string' && hv.href.trim().length > 0;
10
14
  // CurrencyValue check
11
15
  const cv = value;
12
16
  if ('amount' in cv)
@@ -23,8 +27,8 @@ export function validateUrl(value) {
23
27
  if (!value)
24
28
  return true;
25
29
  try {
26
- new URL(value);
27
- return true;
30
+ const url = new URL(value);
31
+ return url.protocol === 'http:' || url.protocol === 'https:';
28
32
  }
29
33
  catch (_a) {
30
34
  return false;
@@ -1 +1 @@
1
- var E,A,T,O,R;!function(E){E.OBJECT_FORM_DASHBOARD="OBJECT_FORM_DASHBOARD",E.CLASS_DASHBOARD="CLASS_DASHBOARD",E.GENERAL_DASHBOARD="GENERAL_DASHBOARD",E.NAVIGATION_PANE="NAVIGATION_PANE"}(E||(E={})),function(E){E.FIELD="FIELD",E.RELATION="RELATION",E.SECTION="SECTION",E.GROUP="GROUP",E.HEADER="HEADER",E.TEXT="TEXT",E.NAVIGATE="NAVIGATE",E.ACTION="ACTION",E.SEARCH="SEARCH",E.VIEW="VIEW",E.RELATED_VIEW="RELATED_VIEW",E.RELATED_OBJECT="RELATED_OBJECT"}(A||(A={})),function(E){E.TEXT="TEXT",E.TEXTBLOCK="TEXTBLOCK",E.INTEGER="INTEGER",E.DECIMAL="DECIMAL",E.PERCENTAGE="PERCENTAGE",E.CURRENCY="CURRENCY",E.BOOLEAN="BOOLEAN",E.DATE="DATE",E.DATETIME="DATETIME",E.TIME="TIME",E.EMAIL="EMAIL",E.HYPERLINK="HYPERLINK",E.LIST="LIST",E.FILE="FILE",E.IMAGE="IMAGE",E.LONGTEXT="LONGTEXT",E.JSON="JSON"}(T||(T={})),function(E){E.SEARCH="SEARCH",E.DROPDOWN="DROPDOWN",E.CHECKBOX="CHECKBOX"}(O||(O={})),function(E){E.SEARCH="SEARCH",E.DROPDOWN="DROPDOWN",E.CHECKBOX="CHECKBOX"}(R||(R={}));export{E as C,A as a,T as b,O as c,R as d}
1
+ var E,A,T,O,R;!function(E){E.OBJECT_FORM_DASHBOARD="OBJECT_FORM_DASHBOARD",E.CLASS_DASHBOARD="CLASS_DASHBOARD",E.GENERAL_DASHBOARD="GENERAL_DASHBOARD",E.NAVIGATION_PANE="NAVIGATION_PANE"}(E||(E={})),function(E){E.FIELD="FIELD",E.RELATION="RELATION",E.SECTION="SECTION",E.GROUP="GROUP",E.HEADER="HEADER",E.TEXT="TEXT",E.NAVIGATE="NAVIGATE",E.ACTION="ACTION",E.SEARCH="SEARCH",E.VIEW="VIEW",E.RELATED_VIEW="RELATED_VIEW",E.RELATED_OBJECT="RELATED_OBJECT"}(A||(A={})),function(E){E.TEXT="TEXT",E.TEXTBLOCK="TEXTBLOCK",E.INTEGER="INTEGER",E.DECIMAL="DECIMAL",E.PERCENTAGE="PERCENTAGE",E.CURRENCY="CURRENCY",E.BOOLEAN="BOOLEAN",E.DATE="DATE",E.DATETIME="DATETIME",E.TIME="TIME",E.EMAIL="EMAIL",E.HYPERLINK="HYPERLINK",E.LIST="LIST",E.FILE="FILE",E.IMAGE="IMAGE",E.LONGTEXT="LONGTEXT",E.JSON="JSON",E.SECRET="SECRET"}(T||(T={})),function(E){E.SEARCH="SEARCH",E.DROPDOWN="DROPDOWN",E.CHECKBOX="CHECKBOX"}(O||(O={})),function(E){E.SEARCH="SEARCH",E.DROPDOWN="DROPDOWN",E.CHECKBOX="CHECKBOX"}(R||(R={}));export{E as C,A as a,T as b,O as c,R as d}
@@ -1 +1 @@
1
- function n(n,i,t){return null==n||isNaN(n)?"":new Intl.NumberFormat(i,t).format(n)}function i(n,i,t){return null==n||isNaN(n)?"":new Intl.NumberFormat(t,{style:"currency",currency:i,minimumFractionDigits:2,maximumFractionDigits:2}).format(n)}function t(n,i,t=2){return null==n||isNaN(n)?"":new Intl.NumberFormat(i,{style:"percent",minimumFractionDigits:t,maximumFractionDigits:t}).format(n)}function e(n,i){if(!n)return"";const t="string"==typeof n?new Date(n):n;return isNaN(t.getTime())?"":new Intl.DateTimeFormat(i,{year:"numeric",month:"2-digit",day:"2-digit"}).format(t)}function r(n,i){if(!n)return"";const t="string"==typeof n?new Date(n):n;return isNaN(t.getTime())?"":new Intl.DateTimeFormat(i,{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}).format(t)}function u(n,i){if(!n)return"";const[t,e]=n.split(":").map(Number),r=new Date;return r.setHours(t,e,0,0),new Intl.DateTimeFormat(i,{hour:"2-digit",minute:"2-digit"}).format(r)}function a(n,i){var t,e,r,u;if(!n||!n.trim())return null;const a=new Intl.NumberFormat(i).formatToParts(1234567.89),o=null!==(e=null===(t=a.find((n=>"group"===n.type)))||void 0===t?void 0:t.value)&&void 0!==e?e:",",l=null!==(u=null===(r=a.find((n=>"decimal"===n.type)))||void 0===r?void 0:r.value)&&void 0!==u?u:".",s=n.replace(new RegExp(`\\${o}`,"g"),"").replace(new RegExp(`\\${l}`),".").replace("%","").trim(),c=parseFloat(s);return isNaN(c)?null:c}export{u as a,r as b,e as c,i as d,t as e,n as f,a as p}
1
+ function n(n,i,t){return null==n||isNaN(n)?"":new Intl.NumberFormat(i,t).format(n)}function i(n,i,t){return null==n||isNaN(n)?"":new Intl.NumberFormat(t,{style:"currency",currency:i,minimumFractionDigits:2,maximumFractionDigits:2}).format(n)}function t(n,i,t=2){return null==n||isNaN(n)?"":new Intl.NumberFormat(i,{style:"percent",minimumFractionDigits:t,maximumFractionDigits:t}).format(n)}function e(n,i){if(!n)return"";const t="string"==typeof n?new Date(n):n;return isNaN(t.getTime())?"":new Intl.DateTimeFormat(i,{year:"numeric",month:"2-digit",day:"2-digit"}).format(t)}function r(n,i){if(!n)return"";const t="string"==typeof n?new Date(n):n;return isNaN(t.getTime())?"":new Intl.DateTimeFormat(i,{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}).format(t)}function u(n,i){if(!n)return"";const[t,e]=n.split(":").map(Number),r=new Date;return r.setHours(t,e,0,0),new Intl.DateTimeFormat(i,{hour:"2-digit",minute:"2-digit"}).format(r)}function a(n,i){var t,e,r,u;if(!n||!n.trim())return null;const a=new Intl.NumberFormat(i).formatToParts(1234567.89),o=null!==(e=null===(t=a.find((n=>"group"===n.type)))||void 0===t?void 0:t.value)&&void 0!==e?e:",",l=null!==(u=null===(r=a.find((n=>"decimal"===n.type)))||void 0===r?void 0:r.value)&&void 0!==u?u:".",s=n.replace(new RegExp(`\\${o}`,"g"),"").replace(new RegExp(`\\${l}`),".").replace("%","").trim(),c=parseFloat(s);return isNaN(c)?null:c}export{e as a,u as b,r as c,i as d,t as e,n as f,a as p}