@mmlogic/components 0.1.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 (159) hide show
  1. package/README.md +221 -0
  2. package/dist/cjs/app-globals-V2Kpy_OQ.js +5 -0
  3. package/dist/cjs/format-CDw-zie_.js +82 -0
  4. package/dist/cjs/index-OvnIRO4Y.js +1523 -0
  5. package/dist/cjs/index.cjs.js +32 -0
  6. package/dist/cjs/loader.cjs.js +13 -0
  7. package/dist/cjs/mosterdcomponents.cjs.js +25 -0
  8. package/dist/cjs/mrd-boolean-field_16.cjs.entry.js +1185 -0
  9. package/dist/cjs/mrd-table.cjs.entry.js +322 -0
  10. package/dist/cjs/quill-DmFfnC1f.js +16272 -0
  11. package/dist/collection/collection-manifest.json +29 -0
  12. package/dist/collection/components/mrd-boolean-field/mrd-boolean-field.js +199 -0
  13. package/dist/collection/components/mrd-boolean-field/mrd-boolean-field.scss +77 -0
  14. package/dist/collection/components/mrd-currency-field/mrd-currency-field.js +248 -0
  15. package/dist/collection/components/mrd-currency-field/mrd-currency-field.scss +100 -0
  16. package/dist/collection/components/mrd-date-field/mrd-date-field.js +206 -0
  17. package/dist/collection/components/mrd-date-field/mrd-date-field.scss +66 -0
  18. package/dist/collection/components/mrd-datetime-field/mrd-datetime-field.js +206 -0
  19. package/dist/collection/components/mrd-datetime-field/mrd-datetime-field.scss +66 -0
  20. package/dist/collection/components/mrd-email-field/mrd-email-field.js +230 -0
  21. package/dist/collection/components/mrd-email-field/mrd-email-field.scss +69 -0
  22. package/dist/collection/components/mrd-field/mrd-field.js +187 -0
  23. package/dist/collection/components/mrd-file-field/mrd-file-field.js +273 -0
  24. package/dist/collection/components/mrd-file-field/mrd-file-field.scss +140 -0
  25. package/dist/collection/components/mrd-form/mrd-form.js +245 -0
  26. package/dist/collection/components/mrd-form/mrd-form.scss +116 -0
  27. package/dist/collection/components/mrd-hyperlink-field/mrd-hyperlink-field.js +230 -0
  28. package/dist/collection/components/mrd-hyperlink-field/mrd-hyperlink-field.scss +69 -0
  29. package/dist/collection/components/mrd-image-field/mrd-image-field.js +287 -0
  30. package/dist/collection/components/mrd-image-field/mrd-image-field.scss +166 -0
  31. package/dist/collection/components/mrd-list-field/mrd-list-field.js +311 -0
  32. package/dist/collection/components/mrd-list-field/mrd-list-field.scss +109 -0
  33. package/dist/collection/components/mrd-number-field/mrd-number-field.js +316 -0
  34. package/dist/collection/components/mrd-number-field/mrd-number-field.scss +77 -0
  35. package/dist/collection/components/mrd-relation-field/mrd-relation-field.js +490 -0
  36. package/dist/collection/components/mrd-relation-field/mrd-relation-field.scss +266 -0
  37. package/dist/collection/components/mrd-table/mrd-table.js +522 -0
  38. package/dist/collection/components/mrd-table/mrd-table.scss +158 -0
  39. package/dist/collection/components/mrd-text-field/mrd-text-field.js +227 -0
  40. package/dist/collection/components/mrd-text-field/mrd-text-field.scss +69 -0
  41. package/dist/collection/components/mrd-textarea-field/mrd-textarea-field.js +267 -0
  42. package/dist/collection/components/mrd-textarea-field/mrd-textarea-field.scss +79 -0
  43. package/dist/collection/components/mrd-time-field/mrd-time-field.js +206 -0
  44. package/dist/collection/components/mrd-time-field/mrd-time-field.scss +66 -0
  45. package/dist/collection/index.js +1 -0
  46. package/dist/collection/types/client-layout.js +30 -0
  47. package/dist/collection/types/index.js +1 -0
  48. package/dist/collection/utils/cell-renderer.js +57 -0
  49. package/dist/collection/utils/format.js +72 -0
  50. package/dist/collection/utils/i18n.js +80 -0
  51. package/dist/collection/utils/validation.js +46 -0
  52. package/dist/components/client-layout.js +1 -0
  53. package/dist/components/format.js +1 -0
  54. package/dist/components/i18n.js +1 -0
  55. package/dist/components/index.d.ts +35 -0
  56. package/dist/components/index.js +1 -0
  57. package/dist/components/mrd-boolean-field.d.ts +11 -0
  58. package/dist/components/mrd-boolean-field.js +1 -0
  59. package/dist/components/mrd-boolean-field2.js +1 -0
  60. package/dist/components/mrd-currency-field.d.ts +11 -0
  61. package/dist/components/mrd-currency-field.js +1 -0
  62. package/dist/components/mrd-currency-field2.js +1 -0
  63. package/dist/components/mrd-date-field.d.ts +11 -0
  64. package/dist/components/mrd-date-field.js +1 -0
  65. package/dist/components/mrd-date-field2.js +1 -0
  66. package/dist/components/mrd-datetime-field.d.ts +11 -0
  67. package/dist/components/mrd-datetime-field.js +1 -0
  68. package/dist/components/mrd-datetime-field2.js +1 -0
  69. package/dist/components/mrd-email-field.d.ts +11 -0
  70. package/dist/components/mrd-email-field.js +1 -0
  71. package/dist/components/mrd-email-field2.js +1 -0
  72. package/dist/components/mrd-field.d.ts +11 -0
  73. package/dist/components/mrd-field.js +1 -0
  74. package/dist/components/mrd-field2.js +1 -0
  75. package/dist/components/mrd-file-field.d.ts +11 -0
  76. package/dist/components/mrd-file-field.js +1 -0
  77. package/dist/components/mrd-file-field2.js +1 -0
  78. package/dist/components/mrd-form.d.ts +11 -0
  79. package/dist/components/mrd-form.js +1 -0
  80. package/dist/components/mrd-hyperlink-field.d.ts +11 -0
  81. package/dist/components/mrd-hyperlink-field.js +1 -0
  82. package/dist/components/mrd-hyperlink-field2.js +1 -0
  83. package/dist/components/mrd-image-field.d.ts +11 -0
  84. package/dist/components/mrd-image-field.js +1 -0
  85. package/dist/components/mrd-image-field2.js +1 -0
  86. package/dist/components/mrd-list-field.d.ts +11 -0
  87. package/dist/components/mrd-list-field.js +1 -0
  88. package/dist/components/mrd-list-field2.js +1 -0
  89. package/dist/components/mrd-number-field.d.ts +11 -0
  90. package/dist/components/mrd-number-field.js +1 -0
  91. package/dist/components/mrd-number-field2.js +1 -0
  92. package/dist/components/mrd-relation-field.d.ts +11 -0
  93. package/dist/components/mrd-relation-field.js +1 -0
  94. package/dist/components/mrd-relation-field2.js +1 -0
  95. package/dist/components/mrd-table.d.ts +11 -0
  96. package/dist/components/mrd-table.js +1 -0
  97. package/dist/components/mrd-text-field.d.ts +11 -0
  98. package/dist/components/mrd-text-field.js +1 -0
  99. package/dist/components/mrd-text-field2.js +1 -0
  100. package/dist/components/mrd-textarea-field.d.ts +11 -0
  101. package/dist/components/mrd-textarea-field.js +1 -0
  102. package/dist/components/mrd-textarea-field2.js +1 -0
  103. package/dist/components/mrd-time-field.d.ts +11 -0
  104. package/dist/components/mrd-time-field.js +1 -0
  105. package/dist/components/mrd-time-field2.js +1 -0
  106. package/dist/components/quill.js +1 -0
  107. package/dist/components/validation.js +1 -0
  108. package/dist/esm/app-globals-DQuL1Twl.js +3 -0
  109. package/dist/esm/format-Dt-aHxkM.js +74 -0
  110. package/dist/esm/index-DQ_he8te.js +1514 -0
  111. package/dist/esm/index.js +32 -0
  112. package/dist/esm/loader.js +11 -0
  113. package/dist/esm/mosterdcomponents.js +21 -0
  114. package/dist/esm/mrd-boolean-field_16.entry.js +1168 -0
  115. package/dist/esm/mrd-table.entry.js +320 -0
  116. package/dist/esm/quill-CiuCgGz_.js +16266 -0
  117. package/dist/index.cjs.js +1 -0
  118. package/dist/index.js +1 -0
  119. package/dist/mosterdcomponents/index.esm.js +1 -0
  120. package/dist/mosterdcomponents/mosterdcomponents.css +1 -0
  121. package/dist/mosterdcomponents/mosterdcomponents.esm.js +1 -0
  122. package/dist/mosterdcomponents/p-88cd0930.entry.js +1 -0
  123. package/dist/mosterdcomponents/p-926ed331.entry.js +1 -0
  124. package/dist/mosterdcomponents/p-CiuCgGz_.js +1 -0
  125. package/dist/mosterdcomponents/p-DQ_he8te.js +2 -0
  126. package/dist/mosterdcomponents/p-DQuL1Twl.js +1 -0
  127. package/dist/mosterdcomponents/p-Dt-aHxkM.js +1 -0
  128. package/dist/types/components/mrd-boolean-field/mrd-boolean-field.d.ts +22 -0
  129. package/dist/types/components/mrd-currency-field/mrd-currency-field.d.ts +26 -0
  130. package/dist/types/components/mrd-date-field/mrd-date-field.d.ts +21 -0
  131. package/dist/types/components/mrd-datetime-field/mrd-datetime-field.d.ts +21 -0
  132. package/dist/types/components/mrd-email-field/mrd-email-field.d.ts +22 -0
  133. package/dist/types/components/mrd-field/mrd-field.d.ts +23 -0
  134. package/dist/types/components/mrd-file-field/mrd-file-field.d.ts +30 -0
  135. package/dist/types/components/mrd-form/mrd-form.d.ts +24 -0
  136. package/dist/types/components/mrd-hyperlink-field/mrd-hyperlink-field.d.ts +22 -0
  137. package/dist/types/components/mrd-image-field/mrd-image-field.d.ts +31 -0
  138. package/dist/types/components/mrd-list-field/mrd-list-field.d.ts +28 -0
  139. package/dist/types/components/mrd-number-field/mrd-number-field.d.ts +29 -0
  140. package/dist/types/components/mrd-relation-field/mrd-relation-field.d.ts +44 -0
  141. package/dist/types/components/mrd-table/mrd-table.d.ts +72 -0
  142. package/dist/types/components/mrd-text-field/mrd-text-field.d.ts +22 -0
  143. package/dist/types/components/mrd-textarea-field/mrd-textarea-field.d.ts +25 -0
  144. package/dist/types/components/mrd-time-field/mrd-time-field.d.ts +21 -0
  145. package/dist/types/components.d.ts +1609 -0
  146. package/dist/types/index.d.ts +1 -0
  147. package/dist/types/stencil-public-runtime.d.ts +1860 -0
  148. package/dist/types/types/client-layout.d.ts +76 -0
  149. package/dist/types/types/index.d.ts +1 -0
  150. package/dist/types/utils/cell-renderer.d.ts +14 -0
  151. package/dist/types/utils/format.d.ts +7 -0
  152. package/dist/types/utils/i18n.d.ts +1 -0
  153. package/dist/types/utils/validation.d.ts +5 -0
  154. package/loader/cdn.js +1 -0
  155. package/loader/index.cjs.js +1 -0
  156. package/loader/index.d.ts +24 -0
  157. package/loader/index.es2017.js +1 -0
  158. package/loader/index.js +2 -0
  159. package/package.json +54 -0
package/README.md ADDED
@@ -0,0 +1,221 @@
1
+ # @mmlogic/components
2
+
3
+ A **Stencil.js v4** web component library for rendering dynamic forms and paginated data tables from API descriptors. Components are framework-agnostic and work in any HTML/JS environment. An Angular output target is included.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @mmlogic/components
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ### Vanilla HTML / JS
14
+
15
+ ```html
16
+ <script type="module" src="node_modules/@mmlogic/components/dist/mosterd-components/mosterd-components.esm.js"></script>
17
+
18
+ <mrd-form id="my-form"></mrd-form>
19
+
20
+ <script>
21
+ const form = document.getElementById('my-form');
22
+ form.layout = { /* ClientLayout descriptor */ };
23
+ form.values = { name: 'Alice' };
24
+ form.addEventListener('mrdSubmit', e => console.log(e.detail));
25
+ </script>
26
+ ```
27
+
28
+ ### Via CDN (unpkg)
29
+
30
+ ```html
31
+ <script type="module" src="https://unpkg.com/@mmlogic/components/dist/mosterd-components/mosterd-components.esm.js"></script>
32
+ ```
33
+
34
+ ### Angular
35
+
36
+ ```ts
37
+ // app.module.ts
38
+ import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
39
+ import { defineCustomElements } from '@mmlogic/components/loader';
40
+
41
+ defineCustomElements();
42
+
43
+ @NgModule({ schemas: [CUSTOM_ELEMENTS_SCHEMA] })
44
+ export class AppModule {}
45
+ ```
46
+
47
+ ---
48
+
49
+ ## Components
50
+
51
+ ### `<mrd-form>`
52
+
53
+ Renders a complete form from a layout descriptor. Handles validation, RTL layout (Arabic locale), and emits the submitted values.
54
+
55
+ ```html
56
+ <mrd-form id="form" locale="nl-NL"></mrd-form>
57
+ ```
58
+
59
+ ```js
60
+ form.layout = {
61
+ title: 'New order',
62
+ items: [
63
+ { type: 'FIELD', field: { name: 'name', label: 'Name', dataType: 'TEXT', required: true } },
64
+ { type: 'FIELD', field: { name: 'amount', label: 'Amount', dataType: 'CURRENCY' } },
65
+ ]
66
+ };
67
+ form.addEventListener('mrdSubmit', e => console.log(e.detail.values));
68
+ form.addEventListener('mrdCancel', () => console.log('cancelled'));
69
+ ```
70
+
71
+ **Props**
72
+
73
+ | Prop | Type | Description |
74
+ |---|---|---|
75
+ | `layout` | `ClientLayout` | Form descriptor with title and items |
76
+ | `values` | `Record<string, any>` | Initial field values |
77
+ | `locale` | `string` | BCP 47 locale (default: `navigator.language`) |
78
+ | `disabled` | `boolean` | Disables all inputs |
79
+
80
+ **Events**
81
+
82
+ | Event | Detail | Description |
83
+ |---|---|---|
84
+ | `mrdSubmit` | `{ values: Record<string, any> }` | Form submitted and valid |
85
+ | `mrdCancel` | — | Cancel button clicked |
86
+
87
+ ---
88
+
89
+ ### `<mrd-table>`
90
+
91
+ A virtual-scroll paginated table. Only the visible rows (plus a configurable buffer) are rendered in the DOM. Pages are fetched on demand via an event.
92
+
93
+ ```html
94
+ <mrd-table id="table"></mrd-table>
95
+ ```
96
+
97
+ ```js
98
+ const table = document.getElementById('table');
99
+
100
+ table.columns = view.values; // TableColumn[] from dashboard API
101
+ table.totalElements = page.totalElements;
102
+ table.pageSize = page.size;
103
+ table.tableHeight = 500; // px, fixed container height
104
+ table.locale = 'nl-NL';
105
+ table.defaultSort = view.defaultSort ?? '';
106
+
107
+ table.addEventListener('mrdLoadPage', async (e) => {
108
+ const { page, sort } = e.detail;
109
+ const url = `${dataHref}?page=${page}${sort ? '&sort=' + sort : ''}`;
110
+ const result = await fetch(url, { headers: { Authorization: `Bearer ${token}` } }).then(r => r.json());
111
+ const rows = Object.values(result._embedded ?? {})[0] ?? [];
112
+ await table.setPage(page, rows);
113
+ });
114
+
115
+ await table.init();
116
+ await table.setPage(0, page0Rows); // inject pre-fetched page 0
117
+ ```
118
+
119
+ **Props**
120
+
121
+ | Prop | Type | Default | Description |
122
+ |---|---|---|---|
123
+ | `columns` | `TableColumn[]` | `[]` | Column definitions |
124
+ | `totalElements` | `number` | `0` | Total records (`0` = non-paginated mode using `rows` prop) |
125
+ | `pageSize` | `number` | `20` | Records per page |
126
+ | `rowHeight` | `number` | `36` | Row height in px |
127
+ | `tableHeight` | `number` | `500` | Container height in px |
128
+ | `locale` | `string` | `navigator.language` | Locale for cell formatting |
129
+ | `defaultSort` | `string` | `''` | Initial sort, e.g. `"timestamp,desc"` or `"name"` |
130
+ | `rows` | `Record[]` | `[]` | Rows for non-paginated mode |
131
+
132
+ **Events**
133
+
134
+ | Event | Detail | Description |
135
+ |---|---|---|
136
+ | `mrdLoadPage` | `{ page: number; sort: string }` | Fired when a page needs to be fetched |
137
+
138
+ **Methods**
139
+
140
+ | Method | Description |
141
+ |---|---|
142
+ | `init()` | Reset state and render window; call after props are set and before `setPage(0, …)` |
143
+ | `setPage(page, rows)` | Inject fetched rows for a page number |
144
+
145
+ **Column sorting**
146
+
147
+ Click any column header to sort. Clicking again toggles ASC ↔ DESC. The active column is highlighted and shows ▲ / ▼. The `sort` value in the `mrdLoadPage` event is the raw query-param value (`"fieldname"` or `"fieldname,desc"`).
148
+
149
+ ---
150
+
151
+ ### Field components
152
+
153
+ Individual input components can be used standalone. Each emits `mrdChange` and `mrdBlur`.
154
+
155
+ | Component | DataType | Description |
156
+ |---|---|---|
157
+ | `<mrd-text-field>` | `TEXT` | Single-line text input |
158
+ | `<mrd-textarea-field>` | `TEXTBLOCK` | Rich text editor (Quill, lazy-loaded) |
159
+ | `<mrd-number-field>` | `INTEGER`, `DECIMAL`, `PERCENTAGE` | Numeric input |
160
+ | `<mrd-currency-field>` | `CURRENCY` | Amount + ISO-4217 currency selector |
161
+ | `<mrd-boolean-field>` | `BOOLEAN` | Toggle switch |
162
+ | `<mrd-date-field>` | `DATE` | Date picker |
163
+ | `<mrd-datetime-field>` | `DATETIME` | Date + time picker |
164
+ | `<mrd-time-field>` | `TIME` | Time picker |
165
+ | `<mrd-email-field>` | `EMAIL` | Email input with validation |
166
+ | `<mrd-hyperlink-field>` | `HYPERLINK` | URL input with validation |
167
+ | `<mrd-list-field>` | `LIST` | Single dropdown or multi-checkbox |
168
+ | `<mrd-file-field>` | `FILE` | Drag-and-drop file upload |
169
+ | `<mrd-image-field>` | `IMAGE` | Drag-and-drop image upload with preview |
170
+ | `<mrd-relation-field>` | `RELATION` | Search (event-driven) or dropdown |
171
+
172
+ **Common props for field components**
173
+
174
+ | Prop | Type | Description |
175
+ |---|---|---|
176
+ | `name` | `string` | Field name, included in `mrdChange` detail |
177
+ | `label` | `string` | Visible label |
178
+ | `value` | `any` | Current value |
179
+ | `required` | `boolean` | Shows validation error when empty on blur |
180
+ | `disabled` | `boolean` | Disables the input |
181
+ | `locale` | `string` | BCP 47 locale for formatting |
182
+
183
+ **Events for field components**
184
+
185
+ | Event | Detail |
186
+ |---|---|
187
+ | `mrdChange` | `{ name: string; value: any }` |
188
+ | `mrdBlur` | `{ name: string; value: any }` |
189
+
190
+ ---
191
+
192
+ ## Theming
193
+
194
+ All visual properties are CSS custom properties. Override them on `:root` or any ancestor element:
195
+
196
+ ```css
197
+ :root {
198
+ --mrd-color-primary: #2563eb;
199
+ --mrd-color-neutral-100: #f3f4f6;
200
+ --mrd-border-radius: 0.375rem;
201
+ --mrd-font-size-sm: 0.875rem;
202
+ /* see full list in src/global/variables.scss */
203
+ }
204
+ ```
205
+
206
+ ---
207
+
208
+ ## TypeScript types
209
+
210
+ Types are exported from the package root:
211
+
212
+ ```ts
213
+ import type { TableColumn } from '@mmlogic/components/dist/types/utils/cell-renderer';
214
+ import type { ClientLayout, ClientLayoutItem } from '@mmlogic/components/dist/types/types/client-layout';
215
+ ```
216
+
217
+ ---
218
+
219
+ ## License
220
+
221
+ MIT
@@ -0,0 +1,5 @@
1
+ 'use strict';
2
+
3
+ const globalScripts = () => {};
4
+
5
+ exports.globalScripts = globalScripts;
@@ -0,0 +1,82 @@
1
+ 'use strict';
2
+
3
+ function formatNumber(value, locale, options) {
4
+ if (value === null || value === undefined || isNaN(value))
5
+ return '';
6
+ return new Intl.NumberFormat(locale, options).format(value);
7
+ }
8
+ function formatCurrency(amount, currency, locale) {
9
+ if (amount === null || amount === undefined || isNaN(amount))
10
+ return '';
11
+ return new Intl.NumberFormat(locale, {
12
+ style: 'currency',
13
+ currency,
14
+ minimumFractionDigits: 2,
15
+ maximumFractionDigits: 2,
16
+ }).format(amount);
17
+ }
18
+ function formatPercentage(value, locale, decimalPrecision = 2) {
19
+ if (value === null || value === undefined || isNaN(value))
20
+ return '';
21
+ return new Intl.NumberFormat(locale, {
22
+ style: 'percent',
23
+ minimumFractionDigits: decimalPrecision,
24
+ maximumFractionDigits: decimalPrecision,
25
+ }).format(value / 100);
26
+ }
27
+ function formatDate(value, locale) {
28
+ if (!value)
29
+ return '';
30
+ const date = typeof value === 'string' ? new Date(value) : value;
31
+ if (isNaN(date.getTime()))
32
+ return '';
33
+ return new Intl.DateTimeFormat(locale, { year: 'numeric', month: '2-digit', day: '2-digit' }).format(date);
34
+ }
35
+ function formatDateTime(value, locale) {
36
+ if (!value)
37
+ return '';
38
+ const date = typeof value === 'string' ? new Date(value) : value;
39
+ if (isNaN(date.getTime()))
40
+ return '';
41
+ return new Intl.DateTimeFormat(locale, {
42
+ year: 'numeric',
43
+ month: '2-digit',
44
+ day: '2-digit',
45
+ hour: '2-digit',
46
+ minute: '2-digit',
47
+ }).format(date);
48
+ }
49
+ function formatTime(value, locale) {
50
+ if (!value)
51
+ return '';
52
+ // value is HH:MM or HH:MM:SS
53
+ const [hours, minutes] = value.split(':').map(Number);
54
+ const date = new Date();
55
+ date.setHours(hours, minutes, 0, 0);
56
+ return new Intl.DateTimeFormat(locale, { hour: '2-digit', minute: '2-digit' }).format(date);
57
+ }
58
+ function parseLocalizedNumber(str, locale) {
59
+ var _a, _b, _c, _d;
60
+ if (!str || !str.trim())
61
+ return null;
62
+ // Detect decimal and thousands separators from the locale
63
+ const parts = new Intl.NumberFormat(locale).formatToParts(1234567.89);
64
+ const groupSep = (_b = (_a = parts.find((p) => p.type === 'group')) === null || _a === void 0 ? void 0 : _a.value) !== null && _b !== void 0 ? _b : ',';
65
+ const decimalSep = (_d = (_c = parts.find((p) => p.type === 'decimal')) === null || _c === void 0 ? void 0 : _c.value) !== null && _d !== void 0 ? _d : '.';
66
+ // Remove group separators, replace decimal separator with '.'
67
+ const normalized = str
68
+ .replace(new RegExp(`\\${groupSep}`, 'g'), '')
69
+ .replace(new RegExp(`\\${decimalSep}`), '.')
70
+ .replace('%', '')
71
+ .trim();
72
+ const parsed = parseFloat(normalized);
73
+ return isNaN(parsed) ? null : parsed;
74
+ }
75
+
76
+ exports.formatCurrency = formatCurrency;
77
+ exports.formatDate = formatDate;
78
+ exports.formatDateTime = formatDateTime;
79
+ exports.formatNumber = formatNumber;
80
+ exports.formatPercentage = formatPercentage;
81
+ exports.formatTime = formatTime;
82
+ exports.parseLocalizedNumber = parseLocalizedNumber;