fwtoolkit 0.1.0-alpha.5 → 0.1.0-alpha.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.
Files changed (118) hide show
  1. package/README.md +41 -9
  2. package/dist/basic.d.ts +70 -0
  3. package/dist/basic.d.ts.map +1 -0
  4. package/dist/basic.js +447 -0
  5. package/dist/basic.js.map +1 -0
  6. package/dist/blob.d.ts +2 -0
  7. package/dist/blob.d.ts.map +1 -0
  8. package/dist/blob.js +12 -0
  9. package/dist/blob.js.map +1 -0
  10. package/dist/content_menu.d.ts +31 -0
  11. package/dist/content_menu.d.ts.map +1 -0
  12. package/dist/content_menu.js +360 -0
  13. package/dist/content_menu.js.map +1 -0
  14. package/dist/datatable_bulk.d.ts +14 -0
  15. package/dist/datatable_bulk.d.ts.map +1 -0
  16. package/dist/datatable_bulk.js +176 -0
  17. package/dist/datatable_bulk.js.map +1 -0
  18. package/dist/dialog.d.ts +18 -0
  19. package/dist/dialog.d.ts.map +1 -0
  20. package/dist/dialog.js +395 -0
  21. package/dist/dialog.js.map +1 -0
  22. package/dist/events.d.ts +2 -0
  23. package/dist/events.d.ts.map +1 -0
  24. package/dist/events.js +11 -0
  25. package/dist/events.js.map +1 -0
  26. package/dist/faq_dialog.d.ts +8 -0
  27. package/dist/faq_dialog.d.ts.map +1 -0
  28. package/dist/faq_dialog.js +63 -0
  29. package/dist/faq_dialog.js.map +1 -0
  30. package/dist/file/dialog.d.ts +27 -0
  31. package/dist/file/dialog.d.ts.map +1 -0
  32. package/dist/file/dialog.js +125 -0
  33. package/dist/file/dialog.js.map +1 -0
  34. package/dist/file/index.d.ts +5 -0
  35. package/dist/file/index.d.ts.map +1 -0
  36. package/dist/file/index.js +6 -0
  37. package/dist/file/index.js.map +1 -0
  38. package/dist/file/new_folder_dialog.d.ts +5 -0
  39. package/dist/file/new_folder_dialog.d.ts.map +1 -0
  40. package/dist/file/new_folder_dialog.js +34 -0
  41. package/dist/file/new_folder_dialog.js.map +1 -0
  42. package/dist/file/selector.d.ts +22 -0
  43. package/dist/file/selector.d.ts.map +1 -0
  44. package/dist/file/selector.js +239 -0
  45. package/dist/file/selector.js.map +1 -0
  46. package/dist/file/templates.d.ts +5 -0
  47. package/dist/file/templates.d.ts.map +1 -0
  48. package/dist/file/templates.js +9 -0
  49. package/dist/file/templates.js.map +1 -0
  50. package/dist/file/tools.d.ts +5 -0
  51. package/dist/file/tools.d.ts.map +1 -0
  52. package/dist/file/tools.js +51 -0
  53. package/dist/file/tools.js.map +1 -0
  54. package/dist/focus.d.ts +3 -0
  55. package/dist/focus.d.ts.map +1 -0
  56. package/dist/focus.js +12 -0
  57. package/dist/focus.js.map +1 -0
  58. package/dist/index.d.ts +18 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +19 -0
  61. package/dist/index.js.map +1 -0
  62. package/dist/network.d.ts +11 -0
  63. package/dist/network.d.ts.map +1 -0
  64. package/dist/network.js +113 -0
  65. package/dist/network.js.map +1 -0
  66. package/dist/overview_menu.d.ts +27 -0
  67. package/dist/overview_menu.d.ts.map +1 -0
  68. package/dist/overview_menu.js +536 -0
  69. package/dist/overview_menu.js.map +1 -0
  70. package/dist/settings.d.ts +3 -0
  71. package/dist/settings.d.ts.map +1 -0
  72. package/dist/settings.js +16 -0
  73. package/dist/settings.js.map +1 -0
  74. package/dist/templates.d.ts +7 -0
  75. package/dist/templates.d.ts.map +1 -0
  76. package/dist/templates.js +43 -0
  77. package/dist/templates.js.map +1 -0
  78. package/dist/user.d.ts +6 -0
  79. package/dist/user.d.ts.map +1 -0
  80. package/dist/user.js +45 -0
  81. package/dist/user.js.map +1 -0
  82. package/dist/user_util.d.ts +7 -0
  83. package/dist/user_util.d.ts.map +1 -0
  84. package/dist/user_util.js +19 -0
  85. package/dist/user_util.js.map +1 -0
  86. package/dist/worker.d.ts +2 -0
  87. package/dist/worker.d.ts.map +1 -0
  88. package/dist/worker.js +12 -0
  89. package/dist/worker.js.map +1 -0
  90. package/dist/ws.d.ts +46 -0
  91. package/dist/ws.d.ts.map +1 -0
  92. package/dist/ws.js +329 -0
  93. package/dist/ws.js.map +1 -0
  94. package/package.json +25 -4
  95. package/src/{basic.js → basic.ts} +1 -0
  96. package/src/{blob.js → blob.ts} +1 -0
  97. package/src/{content_menu.js → content_menu.ts} +1 -0
  98. package/src/{datatable_bulk.js → datatable_bulk.ts} +1 -0
  99. package/src/{dialog.js → dialog.ts} +1 -0
  100. package/src/{events.js → events.ts} +1 -0
  101. package/src/{faq_dialog.js → faq_dialog.ts} +1 -0
  102. package/src/file/{dialog.js → dialog.ts} +1 -0
  103. package/src/file/{index.js → index.ts} +1 -0
  104. package/src/file/{new_folder_dialog.js → new_folder_dialog.ts} +1 -0
  105. package/src/file/{selector.js → selector.ts} +1 -0
  106. package/src/file/{templates.js → templates.ts} +1 -0
  107. package/src/file/{tools.js → tools.ts} +1 -0
  108. package/src/{focus.js → focus.ts} +1 -0
  109. package/src/global.d.ts +11 -0
  110. package/src/{index.js → index.ts} +1 -0
  111. package/src/{network.js → network.ts} +1 -0
  112. package/src/{overview_menu.js → overview_menu.ts} +1 -0
  113. package/src/{settings.js → settings.ts} +1 -0
  114. package/src/{templates.js → templates.ts} +1 -0
  115. package/src/{user.js → user.ts} +1 -0
  116. package/src/{user_util.js → user_util.ts} +1 -0
  117. package/src/{worker.js → worker.ts} +1 -0
  118. package/src/{ws.js → ws.ts} +1 -0
package/README.md CHANGED
@@ -1,7 +1,8 @@
1
1
  # fwtoolkit
2
2
 
3
- Fidus Writer Toolkit — small, reusable utilities, UI helpers and styles
4
- originally written for Fidus Writer but usable in any browser project.
3
+ Fidus Writer Toolkit — reusable TypeScript utilities, UI helpers and styles
4
+ originally written for [Fidus Writer](https://fiduswriter.org) but usable in any
5
+ browser project.
5
6
 
6
7
  ## JavaScript usage
7
8
 
@@ -10,7 +11,15 @@ import {escapeText, addAlert} from "fwtoolkit"
10
11
  import {convertDataURIToBlob} from "fwtoolkit/blob.js"
11
12
  ```
12
13
 
13
- ## CSS usage
14
+ ## TypeScript
15
+
16
+ The source is written in TypeScript and ships with declaration files:
17
+
18
+ ```typescript
19
+ import {Dialog} from "fwtoolkit/dialog.js"
20
+ ```
21
+
22
+ ## CSS
14
23
 
15
24
  The package ships the styles for its UI components under `fwtoolkit/css/`.
16
25
  Load at least `colors.css` and the component styles you need:
@@ -24,12 +33,35 @@ Load at least `colors.css` and the component styles you need:
24
33
  In Fidus Writer the CSS is copied automatically to the static files directory
25
34
  by the `copy_fwtoolkit_css` postinstall step.
26
35
 
36
+ ## Demos
37
+
38
+ Live demos are published on Codeberg Pages:
39
+
40
+ **https://fiduswriter.codeberg.page/fwtoolkit/**
41
+
42
+ To build and deploy the demos yourself, run:
43
+
44
+ ```bash
45
+ npm run build
46
+ ./scripts/deploy-pages.sh
47
+ ```
48
+
49
+ You will also need to configure a Forgejo webhook in the repository settings
50
+ with the target URL `https://fiduswriter.codeberg.page/fwtoolkit` and branch
51
+ filter `pages`.
52
+
53
+ ## Development
54
+
55
+ ```bash
56
+ npm install
57
+ npm run build
58
+ npm test
59
+ ```
60
+
27
61
  ## Contents
28
62
 
29
- - `src/text.js`text escaping helpers (`escapeText`, `unescapeText`, `noSpaceTmp`)
30
- - `src/blob.js` — `convertDataURIToBlob`
31
- - `src/file/` — file title/path helpers and file dialogs
32
- - `src/network.js` — fetch-based HTTP helpers and `ensureCSS`
33
- - `src/dialog.js`, `src/content_menu.js`, `src/overview_menu.js`, ... — UI components
34
- - `src/index.js` — aggregated exports
63
+ - `src/`TypeScript source
64
+ - `dist/`compiled JavaScript and declaration files (generated by `npm run build`)
35
65
  - `css/` — component styles and a minimal `colors.css`
66
+ - `demo/` — Codeberg Pages demo site
67
+ - `test/` — Jest tests
@@ -0,0 +1,70 @@
1
+ import { Dialog } from "./dialog.js";
2
+ /** Creates a styled select with a contentmenu from a select tag.
3
+ * @param select The select-tag which is to be replaced.
4
+ * @param options
5
+ */
6
+ export declare const dropdownSelect: (selectDOM: any, { onChange, width, value, button }: {
7
+ onChange?: (_newValue: any) => void;
8
+ width?: boolean;
9
+ value?: boolean;
10
+ button?: boolean;
11
+ }) => {
12
+ setValue: () => void;
13
+ getValue: () => boolean;
14
+ enable?: undefined;
15
+ disable?: undefined;
16
+ } | {
17
+ setValue: (newValue: any) => void;
18
+ getValue: () => boolean;
19
+ enable: () => any;
20
+ disable: () => any;
21
+ };
22
+ /** Checks or unchecks a checkable label. This is used for example for bibliography categories when editing bibliography items.
23
+ * @param label The node who's parent has to be checked or unchecked.
24
+ */
25
+ export declare const setCheckableLabel: (labelEl: any) => void;
26
+ /** Cover the page signaling to the user to wait.
27
+ */
28
+ export declare const activateWait: (full?: boolean, message?: string) => void;
29
+ /** Remove the wait cover.
30
+ */
31
+ export declare const deactivateWait: () => void;
32
+ /** Show a message to the user.
33
+ * @param alertType The type of message that is shown (error, warning, info or success).
34
+ * @param alertMsg The message text.
35
+ */
36
+ export declare const addAlert: (alertType: any, alertMsg: any) => void;
37
+ export declare const showSystemMessage: (message: any, buttons?: {
38
+ type: string;
39
+ }[]) => Dialog;
40
+ export declare const localizeDate: (milliseconds: any, type?: string) => any;
41
+ /**
42
+ * Turn string literals into single line, removing spaces at start of line
43
+ */
44
+ export declare const noSpaceTmp: (strings: any, ...values: any[]) => string;
45
+ export declare const escapeText: (text: any) => any;
46
+ /**
47
+ * Return an inline info-icon with a hover tooltip containing the given HTML.
48
+ * Use only with trusted HTML content.
49
+ *
50
+ * @param {string} html - The tooltip content (HTML string)
51
+ * @returns {string} HTML for the info tooltip
52
+ */
53
+ export declare const infoTooltip: (html: any) => string;
54
+ export declare const unescapeText: (text: any) => any;
55
+ /**
56
+ * Return a cancel promise if you need to cancel a promise chain. Import as
57
+ * ES6 promises are not (yet) cancelable.
58
+ */
59
+ export declare const cancelPromise: () => Promise<unknown>;
60
+ export declare const findTarget: (event: any, selector: any, el?: {}) => boolean;
61
+ export declare const whenReady: () => Promise<unknown>;
62
+ export declare const setDocTitle: (title: any, app: any) => void;
63
+ export declare const langName: (code: any) => any;
64
+ /** Enable ISO date picker on a text input by overlaying a native date picker.
65
+ * The text input displays ISO format (YYYY-MM-DD) while using the native picker for selection.
66
+ * @param {HTMLInputElement} inputEl - The text input element to enhance
67
+ * @param {boolean} minToday - If true, sets min date to today (default: false)
68
+ */
69
+ export declare const enableDatePicker: (inputEl: any, minToday?: boolean) => void;
70
+ //# sourceMappingURL=basic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"basic.d.ts","sourceRoot":"","sources":["../src/basic.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,MAAM,EAAC,MAAM,aAAa,CAAA;AAGlC;;;GAGG;AAEH,eAAO,MAAM,cAAc,GACvB,cAAS,EACT;;;;;CAA0E;;;;;;;;;;CAyI7E,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAAG,YAAO,SAMvC,CAAA;AAID;GACG;AACH,eAAO,MAAM,YAAY,GAAI,cAAY,EAAE,gBAAY,SA0BtD,CAAA;AAED;GACG;AACH,eAAO,MAAM,cAAc,YAc1B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,QAAQ,GAAI,cAAS,EAAE,aAAQ,SA6B3C,CAAA;AAGD,eAAO,MAAM,iBAAiB,GAAI,YAAO,EAAE;;GAA2B,WAQrE,CAAA;AAWD,eAAO,MAAM,YAAY,GAAI,iBAAY,EAAE,aAAa,QAiCvD,CAAA;AAED;;GAEG;AAEH,eAAO,MAAM,UAAU,GAAI,YAAO,EAAE,GAAG,aAAM,WAkB5C,CAAA;AAED,eAAO,MAAM,UAAU,GAAG,SAAI,QAQ7B,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,GAAG,SAAI,WACoG,CAAA;AAEnI,eAAO,MAAM,YAAY,GAAG,SAAI,QAKD,CAAA;AAC/B;;;GAGG;AAEH,eAAO,MAAM,aAAa,wBAA8B,CAAA;AAIxD,eAAO,MAAM,UAAU,GAAI,UAAK,EAAE,aAAQ,EAAE,OAAO,YAOlD,CAAA;AAGD,eAAO,MAAM,SAAS,wBAYrB,CAAA;AAED,eAAO,MAAM,WAAW,GAAI,UAAK,EAAE,QAAG,SAKrC,CAAA;AAyBD,eAAO,MAAM,QAAQ,GAAG,SAAI,QAE3B,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,YAAO,EAAE,kBAAgB,SA0EzD,CAAA"}
package/dist/basic.js ADDED
@@ -0,0 +1,447 @@
1
+ import { ContentMenu } from "./content_menu.js";
2
+ import { Dialog } from "./dialog.js";
3
+ import { isActivationEvent } from "./events.js";
4
+ /** Creates a styled select with a contentmenu from a select tag.
5
+ * @param select The select-tag which is to be replaced.
6
+ * @param options
7
+ */
8
+ export const dropdownSelect = (selectDOM, { onChange = _newValue => { }, width = false, value = false, button = false }) => {
9
+ if (!selectDOM.parentElement) {
10
+ return;
11
+ }
12
+ let buttonDOM;
13
+ if (button) {
14
+ buttonDOM = button;
15
+ selectDOM.parentElement.removeChild(selectDOM); // Remove the <select> from the main dom.
16
+ }
17
+ else {
18
+ buttonDOM = document.createElement("div");
19
+ buttonDOM.innerHTML =
20
+ '<label></label>&nbsp;<span class="fa fa-caret-down"></span>';
21
+ buttonDOM.classList.add("fw-button", "fw-light", "fw-large", "fw-dropdown");
22
+ if (width) {
23
+ buttonDOM.style.width = Number.isInteger(width)
24
+ ? `${width}px`
25
+ : width;
26
+ }
27
+ selectDOM.classList.forEach(className => buttonDOM.classList.add(className));
28
+ if (selectDOM.id) {
29
+ buttonDOM.id = selectDOM.id;
30
+ }
31
+ selectDOM.parentElement.replaceChild(buttonDOM, selectDOM); // Remove the <select> from the main dom.
32
+ }
33
+ buttonDOM.setAttribute("role", "button");
34
+ buttonDOM.setAttribute("tabindex", "0");
35
+ buttonDOM.setAttribute("aria-haspopup", "true");
36
+ buttonDOM.setAttribute("aria-expanded", "false");
37
+ const options = Array.from(selectDOM.children);
38
+ if (!options.length) {
39
+ // There are no options, so we only create the button.
40
+ return {
41
+ setValue: () => { },
42
+ getValue: () => false
43
+ };
44
+ }
45
+ let selected;
46
+ const menu = {
47
+ content: options.map((option, order) => {
48
+ if (option.selected || option.value === value) {
49
+ selected = option;
50
+ }
51
+ return {
52
+ title: option.innerHTML,
53
+ type: "action",
54
+ tooltip: option.title || "",
55
+ order,
56
+ action: () => {
57
+ if (!button) {
58
+ buttonDOM.firstElementChild.innerText = option.innerText;
59
+ }
60
+ value = option.value || option.dataset.value;
61
+ onChange(value);
62
+ menu.content.forEach(item => (item.selected = false));
63
+ menu.content[order].selected = true;
64
+ return false;
65
+ },
66
+ selected: !!(option.selected || option.dataset.selected)
67
+ };
68
+ })
69
+ };
70
+ if (!selected && !button) {
71
+ selected = selectDOM.firstElementChild;
72
+ menu.content[0].selected = true;
73
+ }
74
+ if (!button) {
75
+ buttonDOM.firstElementChild.innerText = selected.innerText;
76
+ }
77
+ value = selected ? selected.value : false;
78
+ const openMenu = event => {
79
+ if (!isActivationEvent(event)) {
80
+ return;
81
+ }
82
+ event.preventDefault();
83
+ event.stopPropagation();
84
+ if (buttonDOM.classList.contains("disabled")) {
85
+ return;
86
+ }
87
+ // Determine menu position
88
+ let menuPos;
89
+ if (event.type === "click") {
90
+ menuPos = { X: event.pageX, Y: event.pageY };
91
+ }
92
+ else {
93
+ // Keyboard event
94
+ const rect = buttonDOM.getBoundingClientRect();
95
+ menuPos = {
96
+ X: rect.left + window.pageXOffset,
97
+ Y: rect.top + window.pageYOffset + rect.height
98
+ };
99
+ }
100
+ buttonDOM.setAttribute("aria-expanded", "true");
101
+ const contentMenu = new ContentMenu({
102
+ menu,
103
+ menuPos,
104
+ onClose: () => buttonDOM.setAttribute("aria-expanded", "false")
105
+ });
106
+ contentMenu.open();
107
+ };
108
+ buttonDOM.addEventListener("click", openMenu);
109
+ buttonDOM.addEventListener("keydown", openMenu);
110
+ return {
111
+ setValue: newValue => {
112
+ const optionIndex = options.findIndex(option => option.value === newValue);
113
+ if (optionIndex === undefined) {
114
+ return;
115
+ }
116
+ menu.content.forEach(item => (item.selected = false));
117
+ menu.content[optionIndex].selected = true;
118
+ const option = options[optionIndex];
119
+ if (!button) {
120
+ buttonDOM.firstElementChild.innerText = option.innerText;
121
+ }
122
+ value = newValue;
123
+ },
124
+ getValue: () => value,
125
+ enable: () => buttonDOM.classList.remove("disabled"),
126
+ disable: () => buttonDOM.classList.add("disabled")
127
+ };
128
+ };
129
+ /** Checks or unchecks a checkable label. This is used for example for bibliography categories when editing bibliography items.
130
+ * @param label The node who's parent has to be checked or unchecked.
131
+ */
132
+ export const setCheckableLabel = labelEl => {
133
+ if (labelEl.classList.contains("checked")) {
134
+ labelEl.classList.remove("checked");
135
+ }
136
+ else {
137
+ labelEl.classList.add("checked");
138
+ }
139
+ };
140
+ let messageWaiter = false;
141
+ let waitMessage = "";
142
+ /** Cover the page signaling to the user to wait.
143
+ */
144
+ export const activateWait = (full = false, message = "") => {
145
+ const waitEl = document.getElementById("wait");
146
+ if (message) {
147
+ let messageEl = waitEl.querySelector("span.message");
148
+ if (messageEl) {
149
+ // Another message is already showing. We update directly.
150
+ messageEl.innerText = message;
151
+ }
152
+ else {
153
+ waitMessage = message; // We update the message if there is one waiting already
154
+ if (!messageWaiter) {
155
+ messageWaiter = setTimeout(() => {
156
+ messageEl = document.createElement("span");
157
+ messageEl.classList.add("message");
158
+ messageEl.innerText = waitMessage;
159
+ waitEl.appendChild(messageEl);
160
+ messageWaiter = false;
161
+ }, 2000);
162
+ }
163
+ }
164
+ }
165
+ if (waitEl) {
166
+ waitEl.classList.add("active");
167
+ if (full) {
168
+ waitEl.classList.add("full");
169
+ }
170
+ }
171
+ };
172
+ /** Remove the wait cover.
173
+ */
174
+ export const deactivateWait = () => {
175
+ const waitEl = document.getElementById("wait");
176
+ if (waitEl) {
177
+ waitEl.classList.remove("active");
178
+ waitEl.classList.remove("full");
179
+ }
180
+ const messageEl = waitEl.querySelector("span.message");
181
+ if (messageEl) {
182
+ messageEl.parentElement.removeChild(messageEl);
183
+ }
184
+ if (messageWaiter) {
185
+ clearTimeout(messageWaiter);
186
+ messageWaiter = false;
187
+ }
188
+ };
189
+ /** Show a message to the user.
190
+ * @param alertType The type of message that is shown (error, warning, info or success).
191
+ * @param alertMsg The message text.
192
+ */
193
+ export const addAlert = (alertType, alertMsg) => {
194
+ if (!document.body) {
195
+ return;
196
+ }
197
+ const iconNames = {
198
+ error: "circle-exclamation",
199
+ warning: "circle-exclamation",
200
+ info: "circle-info",
201
+ success: "circle-check"
202
+ };
203
+ if (!document.getElementById("#alerts-outer-wrapper")) {
204
+ document.body.insertAdjacentHTML("beforeend", '<div id="alerts-outer-wrapper"><ul id="alerts-wrapper"></ul></div>');
205
+ }
206
+ const alertsWrapper = document.getElementById("alerts-wrapper");
207
+ alertsWrapper.insertAdjacentHTML("beforeend", `<li class="alerts-${alertType} fa-before fa-${iconNames[alertType]}">${alertMsg}</li>`);
208
+ const alertBox = alertsWrapper.lastElementChild;
209
+ setTimeout(() => {
210
+ alertBox.classList.add("visible");
211
+ setTimeout(() => {
212
+ alertBox.classList.remove("visible");
213
+ setTimeout(() => alertsWrapper.removeChild(alertBox), 2000);
214
+ }, 4000);
215
+ }, 1);
216
+ };
217
+ // Used for system mesages
218
+ export const showSystemMessage = (message, buttons = [{ type: "close" }]) => {
219
+ const dialog = new Dialog({
220
+ title: gettext("System message"),
221
+ body: `<p>${escapeText(message)}</p>`,
222
+ buttons
223
+ });
224
+ dialog.open();
225
+ return dialog;
226
+ };
227
+ /** Turn milliseconds since epoch (UTC) into a local date string.
228
+ * @param {number} milliseconds Number of milliseconds since epoch (1/1/1970 midnight, UTC).
229
+ * @param {boolean} type 'full' for full date (default), 'sortable-date' for sortable date, 'minutes' for minute accuracy
230
+ */
231
+ const CACHED_DATES = {
232
+ "sortable-date": {},
233
+ minutes: {},
234
+ full: {}
235
+ };
236
+ export const localizeDate = (milliseconds, type = "full") => {
237
+ if (milliseconds === 0) {
238
+ return "";
239
+ }
240
+ else if (CACHED_DATES[type][milliseconds]) {
241
+ return CACHED_DATES[type][milliseconds];
242
+ }
243
+ const theDate = new Date(milliseconds);
244
+ let returnValue;
245
+ switch (type) {
246
+ case "sortable-date": {
247
+ const yyyy = theDate.getFullYear();
248
+ const mm = theDate.getMonth() + 1;
249
+ const dd = theDate.getDate();
250
+ returnValue = `${yyyy}-${String(mm).padStart(2, "0")}-${String(dd).padStart(2, "0")}`;
251
+ break;
252
+ }
253
+ case "minutes":
254
+ returnValue = theDate.toLocaleString([], {
255
+ year: "numeric",
256
+ month: "2-digit",
257
+ day: "2-digit",
258
+ hour: "2-digit",
259
+ minute: "2-digit"
260
+ });
261
+ break;
262
+ default:
263
+ returnValue = theDate.toLocaleString();
264
+ }
265
+ if (Object.keys(CACHED_DATES[type]).length > 5000) {
266
+ CACHED_DATES[type] = {};
267
+ }
268
+ CACHED_DATES[type][milliseconds] = returnValue;
269
+ return returnValue;
270
+ };
271
+ /**
272
+ * Turn string literals into single line, removing spaces at start of line
273
+ */
274
+ export const noSpaceTmp = (strings, ...values) => {
275
+ const tmpStrings = Array.from(strings);
276
+ let combined = "";
277
+ while (tmpStrings.length > 0 || values.length > 0) {
278
+ if (tmpStrings.length > 0) {
279
+ combined += tmpStrings.shift();
280
+ }
281
+ if (values.length > 0) {
282
+ combined += values.shift();
283
+ }
284
+ }
285
+ let out = "";
286
+ combined.split("\n").forEach(line => {
287
+ out += line.replace(/^\s*/g, "");
288
+ });
289
+ return out;
290
+ };
291
+ export const escapeText = text => {
292
+ return text
293
+ .replace(/&/g, "&amp;")
294
+ .replace(/</g, "&lt;")
295
+ .replace(/>/g, "&gt;")
296
+ .replace(/"/g, "&quot;")
297
+ .replace(/[^\x09\x0A\x0D\x20-\uD7FF\uE000-\uFFFD\u10000-\u10FFFF]/g, ""); // invalid in XML chars
298
+ };
299
+ /**
300
+ * Return an inline info-icon with a hover tooltip containing the given HTML.
301
+ * Use only with trusted HTML content.
302
+ *
303
+ * @param {string} html - The tooltip content (HTML string)
304
+ * @returns {string} HTML for the info tooltip
305
+ */
306
+ export const infoTooltip = html => `<span class="fw-info-tooltip"><i class="fa-solid fa-info-circle"></i><span class="fw-info-tooltip-text">${html}</span></span>`;
307
+ export const unescapeText = text => text
308
+ .replace(/&lt;/g, "<")
309
+ .replace(/&gt;/g, ">")
310
+ .replace(/&quot;/g, '"')
311
+ .replace(/&amp;/g, "&");
312
+ /**
313
+ * Return a cancel promise if you need to cancel a promise chain. Import as
314
+ * ES6 promises are not (yet) cancelable.
315
+ */
316
+ export const cancelPromise = () => new Promise(() => { });
317
+ // Check if selector matches one of the ancestors of the event target.
318
+ // Used in switch statements of document event listeners.
319
+ export const findTarget = (event, selector, el = {}) => {
320
+ el.target = event.target.closest(selector);
321
+ if (el.target) {
322
+ event.stopPropagation();
323
+ return true;
324
+ }
325
+ return false;
326
+ };
327
+ // Promise when page has been loaded.
328
+ export const whenReady = () => {
329
+ if (document.readyState === "complete") {
330
+ return Promise.resolve();
331
+ }
332
+ else {
333
+ return new Promise(resolve => {
334
+ document.addEventListener("readystatechange", _event => {
335
+ if (document.readyState === "complete") {
336
+ resolve();
337
+ }
338
+ });
339
+ });
340
+ }
341
+ };
342
+ export const setDocTitle = (title, app) => {
343
+ const titleText = `${title} - ${app.name}`;
344
+ if (document.title !== titleText) {
345
+ document.title = titleText;
346
+ }
347
+ };
348
+ const LANGUAGES = {
349
+ ar: "العربية",
350
+ bg: "Български",
351
+ cs: "Čeština",
352
+ da: "Dansk",
353
+ de: "Deutsch",
354
+ en: "English",
355
+ es: "Español",
356
+ fr: "Français",
357
+ it: "Italiano",
358
+ ja: "日本語",
359
+ ko: "한국어",
360
+ nb: "Norsk bokmål",
361
+ nl: "Nederlands",
362
+ pl: "Polski",
363
+ "pt-br": "Português (Brasil)",
364
+ "pt-pt": "Português (Portugal)",
365
+ ru: "Русский",
366
+ sv: "Svenska",
367
+ tr: "Türkçe",
368
+ "zh-hans": "简体中文"
369
+ };
370
+ export const langName = code => {
371
+ return LANGUAGES[code] || code;
372
+ };
373
+ /** Enable ISO date picker on a text input by overlaying a native date picker.
374
+ * The text input displays ISO format (YYYY-MM-DD) while using the native picker for selection.
375
+ * @param {HTMLInputElement} inputEl - The text input element to enhance
376
+ * @param {boolean} minToday - If true, sets min date to today (default: false)
377
+ */
378
+ export const enableDatePicker = (inputEl, minToday = false) => {
379
+ const datePicker = document.createElement("input");
380
+ datePicker.type = "date";
381
+ if (minToday) {
382
+ datePicker.min = new Date().toISOString().split("T")[0];
383
+ }
384
+ datePicker.style.position = "absolute";
385
+ datePicker.style.opacity = "0";
386
+ datePicker.style.pointerEvents = "none";
387
+ const parent = inputEl.parentElement;
388
+ parent.style.position = "relative";
389
+ parent.appendChild(datePicker);
390
+ inputEl.addEventListener("click", () => datePicker.showPicker());
391
+ datePicker.addEventListener("change", () => {
392
+ inputEl.value = datePicker.value;
393
+ });
394
+ // Validate and normalize date on blur or form submission
395
+ const validateDate = () => {
396
+ const value = inputEl.value;
397
+ if (!value) {
398
+ return; // Empty is valid (optional field)
399
+ }
400
+ const date = new Date(value);
401
+ if (isNaN(date.getTime())) {
402
+ inputEl.value = ""; // Invalid date, clear it
403
+ return;
404
+ }
405
+ // Re-format to ensure consistent YYYY-MM-DD format
406
+ const yyyy = date.getFullYear();
407
+ const mm = String(date.getMonth() + 1).padStart(2, "0");
408
+ const dd = String(date.getDate()).padStart(2, "0");
409
+ inputEl.value = `${yyyy}-${mm}-${dd}`;
410
+ };
411
+ inputEl.addEventListener("blur", validateDate);
412
+ inputEl.addEventListener("keydown", event => {
413
+ // Intercept Enter to validate before form submission
414
+ if (event.key === "Enter") {
415
+ validateDate();
416
+ return;
417
+ }
418
+ // Allow typing when date picker is open (it takes focus)
419
+ if (document.activeElement === datePicker) {
420
+ return; // Let datePicker handle all keys
421
+ }
422
+ const key = event.key;
423
+ // Open picker on Enter
424
+ if (key === "Enter") {
425
+ event.preventDefault();
426
+ datePicker.showPicker();
427
+ return;
428
+ }
429
+ // Allow editing: digits, dashes, backspace, delete, arrow keys
430
+ if (/^\d$/.test(key) ||
431
+ key === "-" ||
432
+ key === "Backspace" ||
433
+ key === "Delete" ||
434
+ key === "ArrowLeft" ||
435
+ key === "ArrowRight" ||
436
+ key === "Tab") {
437
+ return; // Allow default behavior
438
+ }
439
+ // Block other keys
440
+ event.preventDefault();
441
+ });
442
+ // Allow typing while date picker is open
443
+ datePicker.addEventListener("keydown", event => {
444
+ event.stopPropagation();
445
+ });
446
+ };
447
+ //# sourceMappingURL=basic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"basic.js","sourceRoot":"","sources":["../src/basic.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,WAAW,EAAC,MAAM,mBAAmB,CAAA;AAC7C,OAAO,EAAC,MAAM,EAAC,MAAM,aAAa,CAAA;AAClC,OAAO,EAAC,iBAAiB,EAAC,MAAM,aAAa,CAAA;AAE7C;;;GAGG;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,CAC1B,SAAS,EACT,EAAC,QAAQ,GAAG,SAAS,CAAC,EAAE,GAAE,CAAC,EAAE,KAAK,GAAG,KAAK,EAAE,KAAK,GAAG,KAAK,EAAE,MAAM,GAAG,KAAK,EAAC,EAC5E,EAAE;IACA,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,CAAC;QAC3B,OAAM;IACV,CAAC;IACD,IAAI,SAAS,CAAA;IACb,IAAI,MAAM,EAAE,CAAC;QACT,SAAS,GAAG,MAAM,CAAA;QAClB,SAAS,CAAC,aAAa,CAAC,WAAW,CAAC,SAAS,CAAC,CAAA,CAAC,yCAAyC;IAC5F,CAAC;SAAM,CAAC;QACJ,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;QACzC,SAAS,CAAC,SAAS;YACf,6DAA6D,CAAA;QACjE,SAAS,CAAC,SAAS,CAAC,GAAG,CACnB,WAAW,EACX,UAAU,EACV,UAAU,EACV,aAAa,CAChB,CAAA;QACD,IAAI,KAAK,EAAE,CAAC;YACR,SAAS,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC;gBAC3C,CAAC,CAAC,GAAG,KAAK,IAAI;gBACd,CAAC,CAAC,KAAK,CAAA;QACf,CAAC;QACD,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CACpC,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CACrC,CAAA;QACD,IAAI,SAAS,CAAC,EAAE,EAAE,CAAC;YACf,SAAS,CAAC,EAAE,GAAG,SAAS,CAAC,EAAE,CAAA;QAC/B,CAAC;QACD,SAAS,CAAC,aAAa,CAAC,YAAY,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA,CAAC,yCAAyC;IACxG,CAAC;IAED,SAAS,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IACxC,SAAS,CAAC,YAAY,CAAC,UAAU,EAAE,GAAG,CAAC,CAAA;IACvC,SAAS,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAA;IAC/C,SAAS,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAA;IAEhD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;IAC9C,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QAClB,sDAAsD;QACtD,OAAO;YACH,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC;YAClB,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK;SACxB,CAAA;IACL,CAAC;IACD,IAAI,QAAQ,CAAA;IACZ,MAAM,IAAI,GAAG;QACT,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YACnC,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;gBAC5C,QAAQ,GAAG,MAAM,CAAA;YACrB,CAAC;YACD,OAAO;gBACH,KAAK,EAAE,MAAM,CAAC,SAAS;gBACvB,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE;gBAC3B,KAAK;gBACL,MAAM,EAAE,GAAG,EAAE;oBACT,IAAI,CAAC,MAAM,EAAE,CAAC;wBACV,SAAS,CAAC,iBAAiB,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAA;oBAC5D,CAAC;oBACD,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAA;oBAC5C,QAAQ,CAAC,KAAK,CAAC,CAAA;oBACf,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAA;oBACrD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAA;oBACnC,OAAO,KAAK,CAAA;gBAChB,CAAC;gBACD,QAAQ,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;aAC3D,CAAA;QACL,CAAC,CAAC;KACL,CAAA;IACD,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,QAAQ,GAAG,SAAS,CAAC,iBAAiB,CAAA;QACtC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAA;IACnC,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,SAAS,CAAC,iBAAiB,CAAC,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAA;IAC9D,CAAC;IAED,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAA;IAEzC,MAAM,QAAQ,GAAG,KAAK,CAAC,EAAE;QACrB,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAM;QACV,CAAC;QAED,KAAK,CAAC,cAAc,EAAE,CAAA;QACtB,KAAK,CAAC,eAAe,EAAE,CAAA;QACvB,IAAI,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3C,OAAM;QACV,CAAC;QACD,0BAA0B;QAC1B,IAAI,OAAO,CAAA;QACX,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACzB,OAAO,GAAG,EAAC,CAAC,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,KAAK,EAAC,CAAA;QAC9C,CAAC;aAAM,CAAC;YACJ,iBAAiB;YACjB,MAAM,IAAI,GAAG,SAAS,CAAC,qBAAqB,EAAE,CAAA;YAC9C,OAAO,GAAG;gBACN,CAAC,EAAE,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,WAAW;gBACjC,CAAC,EAAE,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM;aACjD,CAAA;QACL,CAAC;QAED,SAAS,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAA;QAC/C,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC;YAChC,IAAI;YACJ,OAAO;YACP,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC;SAClE,CAAC,CAAA;QACF,WAAW,CAAC,IAAI,EAAE,CAAA;IACtB,CAAC,CAAA;IAED,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;IAC7C,SAAS,CAAC,gBAAgB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;IAE/C,OAAO;QACH,QAAQ,EAAE,QAAQ,CAAC,EAAE;YACjB,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,CACjC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,QAAQ,CACtC,CAAA;YACD,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;gBAC5B,OAAM;YACV,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAA;YACrD,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAA;YACzC,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;YACnC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACV,SAAS,CAAC,iBAAiB,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAA;YAC5D,CAAC;YACD,KAAK,GAAG,QAAQ,CAAA;QACpB,CAAC;QACD,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK;QACrB,MAAM,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC;QACpD,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC;KACrD,CAAA;AACL,CAAC,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,OAAO,CAAC,EAAE;IACvC,IAAI,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACxC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IACvC,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IACpC,CAAC;AACL,CAAC,CAAA;AAED,IAAI,aAAa,GAAG,KAAK,CAAA;AACzB,IAAI,WAAW,GAAG,EAAE,CAAA;AACpB;GACG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAI,GAAG,KAAK,EAAE,OAAO,GAAG,EAAE,EAAE,EAAE;IACvD,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAA;IAC9C,IAAI,OAAO,EAAE,CAAC;QACV,IAAI,SAAS,GAAG,MAAM,CAAC,aAAa,CAAC,cAAc,CAAC,CAAA;QACpD,IAAI,SAAS,EAAE,CAAC;YACZ,0DAA0D;YAC1D,SAAS,CAAC,SAAS,GAAG,OAAO,CAAA;QACjC,CAAC;aAAM,CAAC;YACJ,WAAW,GAAG,OAAO,CAAA,CAAC,wDAAwD;YAC9E,IAAI,CAAC,aAAa,EAAE,CAAC;gBACjB,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE;oBAC5B,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;oBAC1C,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;oBAClC,SAAS,CAAC,SAAS,GAAG,WAAW,CAAA;oBACjC,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAA;oBAC7B,aAAa,GAAG,KAAK,CAAA;gBACzB,CAAC,EAAE,IAAI,CAAC,CAAA;YACZ,CAAC;QACL,CAAC;IACL,CAAC;IACD,IAAI,MAAM,EAAE,CAAC;QACT,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAC9B,IAAI,IAAI,EAAE,CAAC;YACP,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAChC,CAAC;IACL,CAAC;AACL,CAAC,CAAA;AAED;GACG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,EAAE;IAC/B,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAA;IAC9C,IAAI,MAAM,EAAE,CAAC;QACT,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QACjC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IACnC,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,CAAC,aAAa,CAAC,cAAc,CAAC,CAAA;IACtD,IAAI,SAAS,EAAE,CAAC;QACZ,SAAS,CAAC,aAAa,CAAC,WAAW,CAAC,SAAS,CAAC,CAAA;IAClD,CAAC;IACD,IAAI,aAAa,EAAE,CAAC;QAChB,YAAY,CAAC,aAAa,CAAC,CAAA;QAC3B,aAAa,GAAG,KAAK,CAAA;IACzB,CAAC;AACL,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE;IAC5C,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACjB,OAAM;IACV,CAAC;IACD,MAAM,SAAS,GAAG;QACd,KAAK,EAAE,oBAAoB;QAC3B,OAAO,EAAE,oBAAoB;QAC7B,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,cAAc;KAC1B,CAAA;IACD,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,uBAAuB,CAAC,EAAE,CAAC;QACpD,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAC5B,WAAW,EACX,oEAAoE,CACvE,CAAA;IACL,CAAC;IACD,MAAM,aAAa,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAA;IAC/D,aAAa,CAAC,kBAAkB,CAC5B,WAAW,EACX,qBAAqB,SAAS,iBAAiB,SAAS,CAAC,SAAS,CAAC,KAAK,QAAQ,OAAO,CAC1F,CAAA;IACD,MAAM,QAAQ,GAAG,aAAa,CAAC,gBAAgB,CAAA;IAC/C,UAAU,CAAC,GAAG,EAAE;QACZ,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QACjC,UAAU,CAAC,GAAG,EAAE;YACZ,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;YACpC,UAAU,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAA;QAC/D,CAAC,EAAE,IAAI,CAAC,CAAA;IACZ,CAAC,EAAE,CAAC,CAAC,CAAA;AACT,CAAC,CAAA;AAED,0BAA0B;AAC1B,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,CAAC,EAAC,IAAI,EAAE,OAAO,EAAC,CAAC,EAAE,EAAE;IACtE,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;QACtB,KAAK,EAAE,OAAO,CAAC,gBAAgB,CAAC;QAChC,IAAI,EAAE,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM;QACrC,OAAO;KACV,CAAC,CAAA;IACF,MAAM,CAAC,IAAI,EAAE,CAAA;IACb,OAAO,MAAM,CAAA;AACjB,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,YAAY,GAAG;IACjB,eAAe,EAAE,EAAE;IACnB,OAAO,EAAE,EAAE;IACX,IAAI,EAAE,EAAE;CACX,CAAA;AACD,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,YAAY,EAAE,IAAI,GAAG,MAAM,EAAE,EAAE;IACxD,IAAI,YAAY,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,EAAE,CAAA;IACb,CAAC;SAAM,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC;QAC1C,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,CAAA;IAC3C,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAA;IACtC,IAAI,WAAW,CAAA;IACf,QAAQ,IAAI,EAAE,CAAC;QACX,KAAK,eAAe,CAAC,CAAC,CAAC;YACnB,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,EAAE,CAAA;YAClC,MAAM,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;YACjC,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAA;YAC5B,WAAW,GAAG,GAAG,IAAI,IAAI,MAAM,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAA;YACrF,MAAK;QACT,CAAC;QACD,KAAK,SAAS;YACV,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC,EAAE,EAAE;gBACrC,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE,SAAS;gBAChB,GAAG,EAAE,SAAS;gBACd,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE,SAAS;aACpB,CAAC,CAAA;YACF,MAAK;QACT;YACI,WAAW,GAAG,OAAO,CAAC,cAAc,EAAE,CAAA;IAC9C,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;QAChD,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,CAAA;IAC3B,CAAC;IACD,YAAY,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,GAAG,WAAW,CAAA;IAC9C,OAAO,WAAW,CAAA;AACtB,CAAC,CAAA;AAED;;GAEG;AAEH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,OAAO,EAAE,GAAG,MAAM,EAAE,EAAE;IAC7C,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAEtC,IAAI,QAAQ,GAAG,EAAE,CAAA;IACjB,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,QAAQ,IAAI,UAAU,CAAC,KAAK,EAAE,CAAA;QAClC,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,QAAQ,IAAI,MAAM,CAAC,KAAK,EAAE,CAAA;QAC9B,CAAC;IACL,CAAC;IAED,IAAI,GAAG,GAAG,EAAE,CAAA;IACZ,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QAChC,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;IACpC,CAAC,CAAC,CAAA;IACF,OAAO,GAAG,CAAA;AACd,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAC,EAAE;IAC7B,OAAO,IAAI;SACN,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SAEvB,OAAO,CAAC,0DAA0D,EAAE,EAAE,CAAC,CAAA,CAAC,uBAAuB;AACxG,CAAC,CAAA;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,EAAE,CAC9B,2GAA2G,IAAI,gBAAgB,CAAA;AAEnI,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC,EAAE,CAC/B,IAAI;KACC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;KACrB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;KACrB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;KACvB,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;AAC/B;;;GAGG;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,EAAE,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;AAExD,sEAAsE;AACtE,yDAAyD;AACzD,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE;IACnD,EAAE,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC1C,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC;QACZ,KAAK,CAAC,eAAe,EAAE,CAAA;QACvB,OAAO,IAAI,CAAA;IACf,CAAC;IACD,OAAO,KAAK,CAAA;AAChB,CAAC,CAAA;AAED,qCAAqC;AACrC,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,EAAE;IAC1B,IAAI,QAAQ,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;QACrC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAA;IAC5B,CAAC;SAAM,CAAC;QACJ,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;YACzB,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,MAAM,CAAC,EAAE;gBACnD,IAAI,QAAQ,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;oBACrC,OAAO,EAAE,CAAA;gBACb,CAAC;YACL,CAAC,CAAC,CAAA;QACN,CAAC,CAAC,CAAA;IACN,CAAC;AACL,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;IACtC,MAAM,SAAS,GAAG,GAAG,KAAK,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;IAC1C,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,QAAQ,CAAC,KAAK,GAAG,SAAS,CAAA;IAC9B,CAAC;AACL,CAAC,CAAA;AAED,MAAM,SAAS,GAAG;IACd,EAAE,EAAE,SAAS;IACb,EAAE,EAAE,WAAW;IACf,EAAE,EAAE,SAAS;IACb,EAAE,EAAE,OAAO;IACX,EAAE,EAAE,SAAS;IACb,EAAE,EAAE,SAAS;IACb,EAAE,EAAE,SAAS;IACb,EAAE,EAAE,UAAU;IACd,EAAE,EAAE,UAAU;IACd,EAAE,EAAE,KAAK;IACT,EAAE,EAAE,KAAK;IACT,EAAE,EAAE,cAAc;IAClB,EAAE,EAAE,YAAY;IAChB,EAAE,EAAE,QAAQ;IACZ,OAAO,EAAE,oBAAoB;IAC7B,OAAO,EAAE,sBAAsB;IAC/B,EAAE,EAAE,SAAS;IACb,EAAE,EAAE,SAAS;IACb,EAAE,EAAE,QAAQ;IACZ,SAAS,EAAE,MAAM;CACpB,CAAA;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE;IAC3B,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,CAAA;AAClC,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,OAAO,EAAE,QAAQ,GAAG,KAAK,EAAE,EAAE;IAC1D,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;IAClD,UAAU,CAAC,IAAI,GAAG,MAAM,CAAA;IACxB,IAAI,QAAQ,EAAE,CAAC;QACX,UAAU,CAAC,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IAC3D,CAAC;IACD,UAAU,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU,CAAA;IACtC,UAAU,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAA;IAC9B,UAAU,CAAC,KAAK,CAAC,aAAa,GAAG,MAAM,CAAA;IAEvC,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CAAA;IACpC,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU,CAAA;IAClC,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,CAAA;IAE9B,OAAO,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,CAAA;IAChE,UAAU,CAAC,gBAAgB,CAAC,QAAQ,EAAE,GAAG,EAAE;QACvC,OAAO,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,CAAA;IACpC,CAAC,CAAC,CAAA;IAEF,yDAAyD;IACzD,MAAM,YAAY,GAAG,GAAG,EAAE;QACtB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAA;QAC3B,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,OAAM,CAAC,kCAAkC;QAC7C,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAA;QAC5B,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,KAAK,GAAG,EAAE,CAAA,CAAC,yBAAyB;YAC5C,OAAM;QACV,CAAC;QACD,mDAAmD;QACnD,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAA;QAC/B,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;QACvD,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;QAClD,OAAO,CAAC,KAAK,GAAG,GAAG,IAAI,IAAI,EAAE,IAAI,EAAE,EAAE,CAAA;IACzC,CAAC,CAAA;IAED,OAAO,CAAC,gBAAgB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;IAC9C,OAAO,CAAC,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE;QACxC,qDAAqD;QACrD,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;YACxB,YAAY,EAAE,CAAA;YACd,OAAM;QACV,CAAC;QACD,yDAAyD;QACzD,IAAI,QAAQ,CAAC,aAAa,KAAK,UAAU,EAAE,CAAC;YACxC,OAAM,CAAC,iCAAiC;QAC5C,CAAC;QACD,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAA;QACrB,uBAAuB;QACvB,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YAClB,KAAK,CAAC,cAAc,EAAE,CAAA;YACtB,UAAU,CAAC,UAAU,EAAE,CAAA;YACvB,OAAM;QACV,CAAC;QACD,+DAA+D;QAC/D,IACI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;YAChB,GAAG,KAAK,GAAG;YACX,GAAG,KAAK,WAAW;YACnB,GAAG,KAAK,QAAQ;YAChB,GAAG,KAAK,WAAW;YACnB,GAAG,KAAK,YAAY;YACpB,GAAG,KAAK,KAAK,EACf,CAAC;YACC,OAAM,CAAC,yBAAyB;QACpC,CAAC;QACD,mBAAmB;QACnB,KAAK,CAAC,cAAc,EAAE,CAAA;IAC1B,CAAC,CAAC,CAAA;IACF,yCAAyC;IACzC,UAAU,CAAC,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE;QAC3C,KAAK,CAAC,eAAe,EAAE,CAAA;IAC3B,CAAC,CAAC,CAAA;AACN,CAAC,CAAA"}
package/dist/blob.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export declare function convertDataURIToBlob(dataURI: any): Blob;
2
+ //# sourceMappingURL=blob.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blob.d.ts","sourceRoot":"","sources":["../src/blob.ts"],"names":[],"mappings":"AACA,wBAAgB,oBAAoB,CAAC,OAAO,KAAA,QAS3C"}
package/dist/blob.js ADDED
@@ -0,0 +1,12 @@
1
+ // @ts-nocheck
2
+ export function convertDataURIToBlob(dataURI) {
3
+ const byteString = atob(dataURI.split(",")[1]);
4
+ const mimeString = dataURI.split(",")[0].split(":")[1].split(";")[0];
5
+ const ab = new ArrayBuffer(byteString.length);
6
+ const ia = new Uint8Array(ab);
7
+ for (let i = 0; i < byteString.length; i++) {
8
+ ia[i] = byteString.charCodeAt(i);
9
+ }
10
+ return new Blob([ab], { type: mimeString });
11
+ }
12
+ //# sourceMappingURL=blob.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blob.js","sourceRoot":"","sources":["../src/blob.ts"],"names":[],"mappings":"AAAA,cAAc;AACd,MAAM,UAAU,oBAAoB,CAAC,OAAO;IACxC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC9C,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IACpE,MAAM,EAAE,GAAG,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IAC7C,MAAM,EAAE,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAA;IAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,EAAE,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;IACpC,CAAC;IACD,OAAO,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,EAAC,IAAI,EAAE,UAAU,EAAC,CAAC,CAAA;AAC7C,CAAC"}
@@ -0,0 +1,31 @@
1
+ export declare class ContentMenu {
2
+ constructor({ id, page, classes, menu, height, width, onClose, scroll, dialogEl, backdropEl, menuPos }: {
3
+ id?: boolean;
4
+ page?: boolean;
5
+ classes?: boolean;
6
+ menu?: {
7
+ content: any[];
8
+ };
9
+ height?: boolean;
10
+ width?: boolean;
11
+ onClose?: boolean;
12
+ scroll?: boolean;
13
+ dialogEl?: boolean;
14
+ backdropEl?: boolean;
15
+ menuPos?: boolean;
16
+ });
17
+ open(): void;
18
+ renderColumnsHtml(columns: any): string;
19
+ checkAndAddColumns(): void;
20
+ renderSingleColumnHtml(): any;
21
+ centerDialog(): void;
22
+ positionDialog(): void;
23
+ bind(): void;
24
+ getHighestDialogZIndex(): number;
25
+ close(): void;
26
+ onclick(event: any): void;
27
+ onKeyDown(event: any): void;
28
+ focusFirstMenuItem(): void;
29
+ focusMenuItem(index: any): void;
30
+ }
31
+ //# sourceMappingURL=content_menu.d.ts.map