@morscherlab/mld-sdk 0.7.2 → 0.7.3

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 (55) hide show
  1. package/dist/components/BaseInput.vue.d.ts +1 -0
  2. package/dist/components/BaseInput.vue.js +5 -2
  3. package/dist/components/BaseInput.vue.js.map +1 -1
  4. package/dist/components/BaseModal.vue.d.ts +6 -2
  5. package/dist/components/BaseModal.vue.js +54 -10
  6. package/dist/components/BaseModal.vue.js.map +1 -1
  7. package/dist/components/BaseSelect.vue.d.ts +1 -0
  8. package/dist/components/BaseSelect.vue.js +5 -2
  9. package/dist/components/BaseSelect.vue.js.map +1 -1
  10. package/dist/components/BaseTextarea.vue.d.ts +1 -0
  11. package/dist/components/BaseTextarea.vue.js +5 -2
  12. package/dist/components/BaseTextarea.vue.js.map +1 -1
  13. package/dist/components/ExperimentCodeBadge.vue.d.ts +8 -0
  14. package/dist/components/ExperimentCodeBadge.vue.js +19 -0
  15. package/dist/components/ExperimentCodeBadge.vue.js.map +1 -0
  16. package/dist/components/ExperimentCodeBadge.vue3.js +6 -0
  17. package/dist/components/ExperimentCodeBadge.vue3.js.map +1 -0
  18. package/dist/components/ExperimentDataViewer.vue.d.ts +29 -0
  19. package/dist/components/ExperimentDataViewer.vue.js +258 -0
  20. package/dist/components/ExperimentDataViewer.vue.js.map +1 -0
  21. package/dist/components/ExperimentDataViewer.vue3.js +6 -0
  22. package/dist/components/ExperimentDataViewer.vue3.js.map +1 -0
  23. package/dist/components/FormField.vue.d.ts +4 -1
  24. package/dist/components/FormField.vue.js +24 -12
  25. package/dist/components/FormField.vue.js.map +1 -1
  26. package/dist/components/index.d.ts +2 -0
  27. package/dist/components/index.js +14 -8
  28. package/dist/components/index.js.map +1 -1
  29. package/dist/index.d.ts +2 -2
  30. package/dist/index.js +14 -8
  31. package/dist/index.js.map +1 -1
  32. package/dist/styles.css +298 -30
  33. package/dist/types/components.d.ts +23 -0
  34. package/dist/types/index.d.ts +1 -1
  35. package/package.json +1 -1
  36. package/src/components/BaseInput.vue +3 -0
  37. package/src/components/BaseModal.vue +59 -10
  38. package/src/components/BaseSelect.vue +3 -0
  39. package/src/components/BaseTextarea.vue +3 -0
  40. package/src/components/ExperimentCodeBadge.vue +20 -0
  41. package/src/components/ExperimentDataViewer.vue +250 -0
  42. package/src/components/FormField.vue +17 -4
  43. package/src/components/index.ts +4 -0
  44. package/src/index.ts +10 -0
  45. package/src/styles/components/button.css +4 -4
  46. package/src/styles/components/experiment-code-badge.css +13 -0
  47. package/src/styles/components/experiment-data-viewer.css +131 -0
  48. package/src/styles/components/modal.css +1 -1
  49. package/src/styles/components/select.css +1 -1
  50. package/src/styles/components/slider.css +4 -8
  51. package/src/styles/components/textarea.css +5 -1
  52. package/src/styles/index.css +2 -0
  53. package/src/styles/variables.css +7 -2
  54. package/src/types/components.ts +27 -0
  55. package/src/types/index.ts +4 -0
@@ -0,0 +1,258 @@
1
+ import { defineComponent, ref, watch, computed, openBlock, createElementBlock, createElementVNode, createVNode, createBlock, withCtx, createTextVNode, toDisplayString, createCommentVNode, Fragment, renderList } from "vue";
2
+ import _sfc_main$4 from "./SampleHierarchyTree.vue.js";
3
+ /* empty css */
4
+ import _sfc_main$3 from "./DataFrame.vue.js";
5
+ /* empty css */
6
+ import _sfc_main$1 from "./SegmentedControl.vue.js";
7
+ /* empty css */
8
+ import _sfc_main$2 from "./BaseButton.vue.js";
9
+ /* empty css */
10
+ const _hoisted_1 = { class: "mld-data-viewer" };
11
+ const _hoisted_2 = { class: "mld-data-viewer__header" };
12
+ const _hoisted_3 = { class: "mld-data-viewer__controls" };
13
+ const _hoisted_4 = { class: "mld-data-viewer__actions" };
14
+ const _hoisted_5 = { class: "mld-data-viewer__content" };
15
+ const _hoisted_6 = {
16
+ key: 0,
17
+ class: "mld-data-viewer__loading"
18
+ };
19
+ const _hoisted_7 = {
20
+ key: 0,
21
+ class: "mld-summary"
22
+ };
23
+ const _hoisted_8 = {
24
+ key: 0,
25
+ class: "mld-summary__metadata"
26
+ };
27
+ const _hoisted_9 = { class: "mld-summary__pill-key" };
28
+ const _hoisted_10 = { class: "mld-summary__pill-value" };
29
+ const _hoisted_11 = { class: "mld-summary__group-header" };
30
+ const _hoisted_12 = { class: "mld-summary__group-label" };
31
+ const _hoisted_13 = { class: "mld-summary__group-count" };
32
+ const _hoisted_14 = {
33
+ key: 0,
34
+ class: "mld-summary__group-meta"
35
+ };
36
+ const _hoisted_15 = { class: "mld-summary__pill-key" };
37
+ const _hoisted_16 = { class: "mld-summary__pill-value" };
38
+ const _hoisted_17 = { class: "mld-summary__table-header" };
39
+ const _hoisted_18 = { class: "mld-summary__section-label" };
40
+ const _hoisted_19 = { class: "mld-summary__section-count" };
41
+ const _hoisted_20 = {
42
+ key: 3,
43
+ class: "mld-data-viewer__empty"
44
+ };
45
+ const _sfc_main = /* @__PURE__ */ defineComponent({
46
+ __name: "ExperimentDataViewer",
47
+ props: {
48
+ treeData: {},
49
+ tableData: {},
50
+ tableColumns: {},
51
+ summaryData: {},
52
+ defaultView: { default: "summary" },
53
+ title: { default: "Data" },
54
+ pluginName: {},
55
+ pluginRoutePrefix: {},
56
+ experimentId: {},
57
+ loading: { type: Boolean, default: false },
58
+ downloadJsonUrl: {},
59
+ downloadCsvUrl: {}
60
+ },
61
+ emits: ["open-plugin", "download-json", "download-csv"],
62
+ setup(__props, { emit: __emit }) {
63
+ const props = __props;
64
+ const emit = __emit;
65
+ const viewMode = ref(props.defaultView);
66
+ watch(() => props.defaultView, (val) => {
67
+ viewMode.value = val;
68
+ });
69
+ const viewOptions = computed(() => {
70
+ const opts = [];
71
+ if (props.summaryData) {
72
+ opts.push({ value: "summary", label: "Summary" });
73
+ }
74
+ opts.push({ value: "tree", label: "Tree" });
75
+ opts.push({ value: "table", label: "Table" });
76
+ return opts;
77
+ });
78
+ watch(() => props.summaryData, (val) => {
79
+ if (!val && viewMode.value === "summary") {
80
+ viewMode.value = "tree";
81
+ }
82
+ }, { immediate: true });
83
+ const hasTableData = computed(
84
+ () => props.tableData && props.tableData.length > 0
85
+ );
86
+ const metadataEntries = computed(() => {
87
+ var _a;
88
+ if (!((_a = props.summaryData) == null ? void 0 : _a.metadata)) return [];
89
+ return Object.entries(props.summaryData.metadata).filter(([, v]) => v !== null && v !== void 0 && v !== "").map(([key, value]) => ({
90
+ key: key.replace(/_/g, " "),
91
+ value: String(value)
92
+ }));
93
+ });
94
+ function humanizeColumn(col) {
95
+ return col.replace(/_/g, " ").replace(/\b\w/g, (c) => c.toUpperCase());
96
+ }
97
+ function formatCellValue(value) {
98
+ if (value === null || value === void 0) return "";
99
+ if (typeof value === "object") return JSON.stringify(value);
100
+ return String(value);
101
+ }
102
+ function columnsForSection(columns) {
103
+ return columns.map((col) => ({
104
+ key: col,
105
+ label: humanizeColumn(col),
106
+ sortable: true,
107
+ formatter: (value) => formatCellValue(value)
108
+ }));
109
+ }
110
+ function handleDownloadJson() {
111
+ if (props.downloadJsonUrl) {
112
+ window.open(props.downloadJsonUrl, "_blank");
113
+ }
114
+ emit("download-json");
115
+ }
116
+ function handleDownloadCsv() {
117
+ if (props.downloadCsvUrl) {
118
+ window.open(props.downloadCsvUrl, "_blank");
119
+ }
120
+ emit("download-csv");
121
+ }
122
+ return (_ctx, _cache) => {
123
+ return openBlock(), createElementBlock("div", _hoisted_1, [
124
+ createElementVNode("div", _hoisted_2, [
125
+ createElementVNode("div", _hoisted_3, [
126
+ createVNode(_sfc_main$1, {
127
+ modelValue: viewMode.value,
128
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => viewMode.value = $event),
129
+ options: viewOptions.value,
130
+ variant: "card",
131
+ size: "sm",
132
+ "full-width": false
133
+ }, null, 8, ["modelValue", "options"])
134
+ ]),
135
+ createElementVNode("div", _hoisted_4, [
136
+ __props.pluginRoutePrefix && __props.experimentId ? (openBlock(), createBlock(_sfc_main$2, {
137
+ key: 0,
138
+ variant: "secondary",
139
+ size: "sm",
140
+ onClick: _cache[1] || (_cache[1] = ($event) => emit("open-plugin"))
141
+ }, {
142
+ default: withCtx(() => [
143
+ createTextVNode(" Open in " + toDisplayString(__props.pluginName || "Plugin"), 1)
144
+ ]),
145
+ _: 1
146
+ })) : createCommentVNode("", true),
147
+ createVNode(_sfc_main$2, {
148
+ variant: "ghost",
149
+ size: "sm",
150
+ onClick: handleDownloadJson
151
+ }, {
152
+ default: withCtx(() => [..._cache[2] || (_cache[2] = [
153
+ createTextVNode(" JSON ", -1)
154
+ ])]),
155
+ _: 1
156
+ }),
157
+ createVNode(_sfc_main$2, {
158
+ variant: "ghost",
159
+ size: "sm",
160
+ onClick: handleDownloadCsv
161
+ }, {
162
+ default: withCtx(() => [..._cache[3] || (_cache[3] = [
163
+ createTextVNode(" CSV ", -1)
164
+ ])]),
165
+ _: 1
166
+ })
167
+ ])
168
+ ]),
169
+ createElementVNode("div", _hoisted_5, [
170
+ __props.loading ? (openBlock(), createElementBlock("div", _hoisted_6, " Loading... ")) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
171
+ viewMode.value === "summary" && __props.summaryData ? (openBlock(), createElementBlock("div", _hoisted_7, [
172
+ metadataEntries.value.length ? (openBlock(), createElementBlock("div", _hoisted_8, [
173
+ (openBlock(true), createElementBlock(Fragment, null, renderList(metadataEntries.value, (entry) => {
174
+ return openBlock(), createElementBlock("span", {
175
+ key: entry.key,
176
+ class: "mld-summary__pill"
177
+ }, [
178
+ createElementVNode("span", _hoisted_9, toDisplayString(entry.key), 1),
179
+ createElementVNode("span", _hoisted_10, toDisplayString(entry.value), 1)
180
+ ]);
181
+ }), 128))
182
+ ])) : createCommentVNode("", true),
183
+ (openBlock(true), createElementBlock(Fragment, null, renderList(__props.summaryData.sections, (section) => {
184
+ var _a;
185
+ return openBlock(), createElementBlock("div", {
186
+ key: section.key,
187
+ class: "mld-summary__section"
188
+ }, [
189
+ section.type === "group" && section.items ? (openBlock(true), createElementBlock(Fragment, { key: 0 }, renderList(section.items, (item, idx) => {
190
+ return openBlock(), createElementBlock("div", {
191
+ key: idx,
192
+ class: "mld-summary__group-card"
193
+ }, [
194
+ createElementVNode("div", _hoisted_11, [
195
+ createElementVNode("span", _hoisted_12, toDisplayString(item.label), 1),
196
+ createElementVNode("span", _hoisted_13, toDisplayString(item.item_count) + " " + toDisplayString(item.item_key), 1)
197
+ ]),
198
+ item.metadata && Object.keys(item.metadata).length ? (openBlock(), createElementBlock("div", _hoisted_14, [
199
+ (openBlock(true), createElementBlock(Fragment, null, renderList(item.metadata, (val, key) => {
200
+ return openBlock(), createElementBlock("span", {
201
+ key: String(key),
202
+ class: "mld-summary__pill mld-summary__pill--sm"
203
+ }, [
204
+ createElementVNode("span", _hoisted_15, toDisplayString(String(key).replace(/_/g, " ")), 1),
205
+ createElementVNode("span", _hoisted_16, toDisplayString(val), 1)
206
+ ]);
207
+ }), 128))
208
+ ])) : createCommentVNode("", true),
209
+ item.rows.length ? (openBlock(), createBlock(_sfc_main$3, {
210
+ key: 1,
211
+ data: item.rows,
212
+ columns: columnsForSection(item.columns),
213
+ searchable: item.rows.length > 10,
214
+ sortable: true,
215
+ striped: true,
216
+ size: "sm"
217
+ }, null, 8, ["data", "columns", "searchable"])) : createCommentVNode("", true)
218
+ ]);
219
+ }), 128)) : section.type === "table" && section.rows ? (openBlock(), createElementBlock(Fragment, { key: 1 }, [
220
+ createElementVNode("div", _hoisted_17, [
221
+ createElementVNode("span", _hoisted_18, toDisplayString(section.label), 1),
222
+ createElementVNode("span", _hoisted_19, toDisplayString(section.row_count) + " rows", 1)
223
+ ]),
224
+ createVNode(_sfc_main$3, {
225
+ data: section.rows,
226
+ columns: columnsForSection(section.columns || []),
227
+ searchable: (((_a = section.rows) == null ? void 0 : _a.length) || 0) > 10,
228
+ sortable: true,
229
+ striped: true,
230
+ size: "sm"
231
+ }, null, 8, ["data", "columns", "searchable"])
232
+ ], 64)) : createCommentVNode("", true)
233
+ ]);
234
+ }), 128))
235
+ ])) : viewMode.value === "tree" ? (openBlock(), createBlock(_sfc_main$4, {
236
+ key: 1,
237
+ nodes: __props.treeData,
238
+ "expand-all": false,
239
+ "show-icons": true,
240
+ "show-counts": true,
241
+ size: "sm"
242
+ }, null, 8, ["nodes"])) : viewMode.value === "table" && hasTableData.value ? (openBlock(), createBlock(_sfc_main$3, {
243
+ key: 2,
244
+ data: __props.tableData,
245
+ columns: __props.tableColumns ?? [],
246
+ searchable: true,
247
+ sortable: true
248
+ }, null, 8, ["data", "columns"])) : viewMode.value === "table" ? (openBlock(), createElementBlock("div", _hoisted_20, " No tabular data available. Use tree view. ")) : createCommentVNode("", true)
249
+ ], 64))
250
+ ])
251
+ ]);
252
+ };
253
+ }
254
+ });
255
+ export {
256
+ _sfc_main as default
257
+ };
258
+ //# sourceMappingURL=ExperimentDataViewer.vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExperimentDataViewer.vue.js","sources":["../../src/components/ExperimentDataViewer.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, computed, watch } from 'vue'\nimport type { TreeNode, DataFrameColumn, SummaryData } from '../types'\nimport SampleHierarchyTree from './SampleHierarchyTree.vue'\nimport DataFrame from './DataFrame.vue'\nimport SegmentedControl from './SegmentedControl.vue'\nimport BaseButton from './BaseButton.vue'\n\ninterface Props {\n treeData: TreeNode[]\n tableData?: Record<string, unknown>[]\n tableColumns?: DataFrameColumn[] | undefined\n summaryData?: SummaryData | null\n defaultView?: 'summary' | 'tree' | 'table'\n title?: string\n pluginName?: string\n pluginRoutePrefix?: string\n experimentId?: number\n loading?: boolean\n downloadJsonUrl?: string\n downloadCsvUrl?: string\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n title: 'Data',\n defaultView: 'summary',\n loading: false,\n})\n\nconst emit = defineEmits<{\n 'open-plugin': []\n 'download-json': []\n 'download-csv': []\n}>()\n\nconst viewMode = ref<string | number>(props.defaultView)\n\n// Reset view mode when defaultView prop changes\nwatch(() => props.defaultView, (val) => { viewMode.value = val })\n\nconst viewOptions = computed(() => {\n const opts = []\n if (props.summaryData) {\n opts.push({ value: 'summary', label: 'Summary' })\n }\n opts.push({ value: 'tree', label: 'Tree' })\n opts.push({ value: 'table', label: 'Table' })\n return opts\n})\n\n// Fall back to tree if summary is selected but no summary data\nwatch(() => props.summaryData, (val) => {\n if (!val && viewMode.value === 'summary') {\n viewMode.value = 'tree'\n }\n}, { immediate: true })\n\nconst hasTableData = computed(() =>\n props.tableData && props.tableData.length > 0\n)\n\nconst metadataEntries = computed(() => {\n if (!props.summaryData?.metadata) return []\n return Object.entries(props.summaryData.metadata)\n .filter(([, v]) => v !== null && v !== undefined && v !== '')\n .map(([key, value]) => ({\n key: key.replace(/_/g, ' '),\n value: String(value),\n }))\n})\n\nfunction humanizeColumn(col: string): string {\n return col.replace(/_/g, ' ').replace(/\\b\\w/g, (c) => c.toUpperCase())\n}\n\nfunction formatCellValue(value: unknown): string {\n if (value === null || value === undefined) return ''\n if (typeof value === 'object') return JSON.stringify(value)\n return String(value)\n}\n\nfunction columnsForSection(columns: string[]): DataFrameColumn[] {\n return columns.map((col) => ({\n key: col,\n label: humanizeColumn(col),\n sortable: true,\n formatter: (value: unknown) => formatCellValue(value),\n }))\n}\n\nfunction handleDownloadJson() {\n if (props.downloadJsonUrl) {\n window.open(props.downloadJsonUrl, '_blank')\n }\n emit('download-json')\n}\n\nfunction handleDownloadCsv() {\n if (props.downloadCsvUrl) {\n window.open(props.downloadCsvUrl, '_blank')\n }\n emit('download-csv')\n}\n</script>\n\n<template>\n <div class=\"mld-data-viewer\">\n <div class=\"mld-data-viewer__header\">\n <div class=\"mld-data-viewer__controls\">\n <SegmentedControl\n v-model=\"viewMode\"\n :options=\"viewOptions\"\n variant=\"card\"\n size=\"sm\"\n :full-width=\"false\"\n />\n </div>\n <div class=\"mld-data-viewer__actions\">\n <BaseButton\n v-if=\"pluginRoutePrefix && experimentId\"\n variant=\"secondary\"\n size=\"sm\"\n @click=\"emit('open-plugin')\"\n >\n Open in {{ pluginName || 'Plugin' }}\n </BaseButton>\n <BaseButton\n variant=\"ghost\"\n size=\"sm\"\n @click=\"handleDownloadJson\"\n >\n JSON\n </BaseButton>\n <BaseButton\n variant=\"ghost\"\n size=\"sm\"\n @click=\"handleDownloadCsv\"\n >\n CSV\n </BaseButton>\n </div>\n </div>\n\n <div class=\"mld-data-viewer__content\">\n <div v-if=\"loading\" class=\"mld-data-viewer__loading\">\n Loading...\n </div>\n <template v-else>\n <!-- Summary View -->\n <div v-if=\"viewMode === 'summary' && summaryData\" class=\"mld-summary\">\n <!-- Metadata pills -->\n <div v-if=\"metadataEntries.length\" class=\"mld-summary__metadata\">\n <span\n v-for=\"entry in metadataEntries\"\n :key=\"entry.key\"\n class=\"mld-summary__pill\"\n >\n <span class=\"mld-summary__pill-key\">{{ entry.key }}</span>\n <span class=\"mld-summary__pill-value\">{{ entry.value }}</span>\n </span>\n </div>\n\n <!-- Sections -->\n <div\n v-for=\"section in summaryData.sections\"\n :key=\"section.key\"\n class=\"mld-summary__section\"\n >\n <!-- Group section: cards with embedded tables -->\n <template v-if=\"section.type === 'group' && section.items\">\n <div\n v-for=\"(item, idx) in section.items\"\n :key=\"idx\"\n class=\"mld-summary__group-card\"\n >\n <div class=\"mld-summary__group-header\">\n <span class=\"mld-summary__group-label\">{{ item.label }}</span>\n <span class=\"mld-summary__group-count\">\n {{ item.item_count }} {{ item.item_key }}\n </span>\n </div>\n <div v-if=\"item.metadata && Object.keys(item.metadata).length\" class=\"mld-summary__group-meta\">\n <span\n v-for=\"(val, key) in item.metadata\"\n :key=\"String(key)\"\n class=\"mld-summary__pill mld-summary__pill--sm\"\n >\n <span class=\"mld-summary__pill-key\">{{ String(key).replace(/_/g, ' ') }}</span>\n <span class=\"mld-summary__pill-value\">{{ val }}</span>\n </span>\n </div>\n <DataFrame\n v-if=\"item.rows.length\"\n :data=\"item.rows\"\n :columns=\"columnsForSection(item.columns)\"\n :searchable=\"item.rows.length > 10\"\n :sortable=\"true\"\n :striped=\"true\"\n size=\"sm\"\n />\n </div>\n </template>\n\n <!-- Table section: flat table -->\n <template v-else-if=\"section.type === 'table' && section.rows\">\n <div class=\"mld-summary__table-header\">\n <span class=\"mld-summary__section-label\">{{ section.label }}</span>\n <span class=\"mld-summary__section-count\">{{ section.row_count }} rows</span>\n </div>\n <DataFrame\n :data=\"section.rows\"\n :columns=\"columnsForSection(section.columns || [])\"\n :searchable=\"(section.rows?.length || 0) > 10\"\n :sortable=\"true\"\n :striped=\"true\"\n size=\"sm\"\n />\n </template>\n </div>\n </div>\n\n <!-- Tree View -->\n <SampleHierarchyTree\n v-else-if=\"viewMode === 'tree'\"\n :nodes=\"treeData\"\n :expand-all=\"false\"\n :show-icons=\"true\"\n :show-counts=\"true\"\n size=\"sm\"\n />\n\n <!-- Table View -->\n <DataFrame\n v-else-if=\"viewMode === 'table' && hasTableData\"\n :data=\"tableData!\"\n :columns=\"tableColumns ?? []\"\n :searchable=\"true\"\n :sortable=\"true\"\n />\n <div v-else-if=\"viewMode === 'table'\" class=\"mld-data-viewer__empty\">\n No tabular data available. Use tree view.\n </div>\n </template>\n </div>\n </div>\n</template>\n\n<style>\n@import '../styles/components/experiment-data-viewer.css';\n</style>\n"],"names":["_openBlock","_createElementBlock","_createElementVNode","_createVNode","SegmentedControl","_createBlock","BaseButton","_createTextVNode","_Fragment","_renderList","_toDisplayString","DataFrame","SampleHierarchyTree"],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import _sfc_main from "./ExperimentDataViewer.vue.js";
2
+ /* empty css */
3
+ export {
4
+ _sfc_main as default
5
+ };
6
+ //# sourceMappingURL=ExperimentDataViewer.vue3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExperimentDataViewer.vue3.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
@@ -4,11 +4,14 @@ interface Props {
4
4
  hint?: string;
5
5
  required?: boolean;
6
6
  htmlFor?: string;
7
+ fieldId?: string;
7
8
  }
8
9
  declare function __VLS_template(): {
9
10
  attrs: Partial<{}>;
10
11
  slots: {
11
- default?(_: {}): any;
12
+ default?(_: {
13
+ describedBy: string | undefined;
14
+ }): any;
12
15
  };
13
16
  refs: {};
14
17
  rootEl: HTMLDivElement;
@@ -1,18 +1,12 @@
1
- import { defineComponent, openBlock, createElementBlock, createTextVNode, toDisplayString, createCommentVNode, renderSlot } from "vue";
1
+ import { defineComponent, computed, openBlock, createElementBlock, createTextVNode, toDisplayString, createCommentVNode, renderSlot } from "vue";
2
2
  const _hoisted_1 = { class: "mld-form-field" };
3
3
  const _hoisted_2 = ["for"];
4
4
  const _hoisted_3 = {
5
5
  key: 0,
6
6
  class: "mld-form-field__required"
7
7
  };
8
- const _hoisted_4 = {
9
- key: 1,
10
- class: "mld-form-field__error"
11
- };
12
- const _hoisted_5 = {
13
- key: 2,
14
- class: "mld-form-field__hint"
15
- };
8
+ const _hoisted_4 = ["id"];
9
+ const _hoisted_5 = ["id"];
16
10
  const _sfc_main = /* @__PURE__ */ defineComponent({
17
11
  __name: "FormField",
18
12
  props: {
@@ -20,9 +14,18 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
20
14
  error: {},
21
15
  hint: {},
22
16
  required: { type: Boolean },
23
- htmlFor: {}
17
+ htmlFor: {},
18
+ fieldId: {}
24
19
  },
25
20
  setup(__props) {
21
+ const props = __props;
22
+ const errorId = computed(
23
+ () => props.error && props.fieldId ? `${props.fieldId}-error` : void 0
24
+ );
25
+ const hintId = computed(
26
+ () => !props.error && props.hint && props.fieldId ? `${props.fieldId}-hint` : void 0
27
+ );
28
+ const describedBy = computed(() => errorId.value ?? hintId.value);
26
29
  return (_ctx, _cache) => {
27
30
  return openBlock(), createElementBlock("div", _hoisted_1, [
28
31
  __props.label ? (openBlock(), createElementBlock("label", {
@@ -33,8 +36,17 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
33
36
  createTextVNode(toDisplayString(__props.label) + " ", 1),
34
37
  __props.required ? (openBlock(), createElementBlock("span", _hoisted_3, "*")) : createCommentVNode("", true)
35
38
  ], 8, _hoisted_2)) : createCommentVNode("", true),
36
- renderSlot(_ctx.$slots, "default"),
37
- __props.error ? (openBlock(), createElementBlock("p", _hoisted_4, toDisplayString(__props.error), 1)) : __props.hint ? (openBlock(), createElementBlock("p", _hoisted_5, toDisplayString(__props.hint), 1)) : createCommentVNode("", true)
39
+ renderSlot(_ctx.$slots, "default", { describedBy: describedBy.value }),
40
+ __props.error ? (openBlock(), createElementBlock("p", {
41
+ key: 1,
42
+ id: errorId.value,
43
+ class: "mld-form-field__error",
44
+ role: "alert"
45
+ }, toDisplayString(__props.error), 9, _hoisted_4)) : __props.hint ? (openBlock(), createElementBlock("p", {
46
+ key: 2,
47
+ id: hintId.value,
48
+ class: "mld-form-field__hint"
49
+ }, toDisplayString(__props.hint), 9, _hoisted_5)) : createCommentVNode("", true)
38
50
  ]);
39
51
  };
40
52
  }
@@ -1 +1 @@
1
- {"version":3,"file":"FormField.vue.js","sources":["../../src/components/FormField.vue"],"sourcesContent":["<script setup lang=\"ts\">\ninterface Props {\n label?: string\n error?: string\n hint?: string\n required?: boolean\n htmlFor?: string\n}\n\ndefineProps<Props>()\n</script>\n\n<template>\n <div class=\"mld-form-field\">\n <label\n v-if=\"label\"\n :for=\"htmlFor\"\n class=\"mld-form-field__label\"\n >\n {{ label }}\n <span v-if=\"required\" class=\"mld-form-field__required\">*</span>\n </label>\n\n <slot />\n\n <p v-if=\"error\" class=\"mld-form-field__error\">\n {{ error }}\n </p>\n <p v-else-if=\"hint\" class=\"mld-form-field__hint\">\n {{ hint }}\n </p>\n </div>\n</template>\n\n<style>\n@import '../styles/components/form-field.css';\n</style>\n"],"names":["_openBlock","_createElementBlock","_createTextVNode","_toDisplayString","_renderSlot"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAaE,aAAAA,UAAA,GAAAC,mBAkBM,OAlBN,YAkBM;AAAA,QAhBI,QAAA,sBADRA,mBAOQ,SAAA;AAAA;UALL,KAAK,QAAA;AAAA,UACN,OAAM;AAAA,QAAA;UAEHC,gBAAAC,gBAAA,QAAA,KAAK,IAAG,KACX,CAAA;AAAA,UAAY,QAAA,yBAAZF,mBAA+D,QAA/D,YAAuD,GAAC;;QAG1DG,WAAQ,KAAA,QAAA,SAAA;AAAA,QAEC,QAAA,sBAATH,mBAEI,KAFJ,YAEIE,gBADC,QAAA,KAAK,GAAA,CAAA,KAEI,QAAA,qBAAdF,mBAEI,KAFJ,YAEIE,gBADC,QAAA,IAAI,GAAA,CAAA;;;;;"}
1
+ {"version":3,"file":"FormField.vue.js","sources":["../../src/components/FormField.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\ninterface Props {\n label?: string\n error?: string\n hint?: string\n required?: boolean\n htmlFor?: string\n fieldId?: string\n}\n\nconst props = defineProps<Props>()\n\nconst errorId = computed(() =>\n props.error && props.fieldId ? `${props.fieldId}-error` : undefined\n)\n\nconst hintId = computed(() =>\n !props.error && props.hint && props.fieldId ? `${props.fieldId}-hint` : undefined\n)\n\nconst describedBy = computed(() => errorId.value ?? hintId.value)\n</script>\n\n<template>\n <div class=\"mld-form-field\">\n <label\n v-if=\"label\"\n :for=\"htmlFor\"\n class=\"mld-form-field__label\"\n >\n {{ label }}\n <span v-if=\"required\" class=\"mld-form-field__required\">*</span>\n </label>\n\n <slot :described-by=\"describedBy\" />\n\n <p v-if=\"error\" :id=\"errorId\" class=\"mld-form-field__error\" role=\"alert\">\n {{ error }}\n </p>\n <p v-else-if=\"hint\" :id=\"hintId\" class=\"mld-form-field__hint\">\n {{ hint }}\n </p>\n </div>\n</template>\n\n<style>\n@import '../styles/components/form-field.css';\n</style>\n"],"names":["_openBlock","_createElementBlock","_createTextVNode","_toDisplayString","_renderSlot"],"mappings":";;;;;;;;;;;;;;;;;;;;AAYA,UAAM,QAAQ;AAEd,UAAM,UAAU;AAAA,MAAS,MACvB,MAAM,SAAS,MAAM,UAAU,GAAG,MAAM,OAAO,WAAW;AAAA,IAAA;AAG5D,UAAM,SAAS;AAAA,MAAS,MACtB,CAAC,MAAM,SAAS,MAAM,QAAQ,MAAM,UAAU,GAAG,MAAM,OAAO,UAAU;AAAA,IAAA;AAG1E,UAAM,cAAc,SAAS,MAAM,QAAQ,SAAS,OAAO,KAAK;;AAI9D,aAAAA,UAAA,GAAAC,mBAkBM,OAlBN,YAkBM;AAAA,QAhBI,QAAA,sBADRA,mBAOQ,SAAA;AAAA;UALL,KAAK,QAAA;AAAA,UACN,OAAM;AAAA,QAAA;UAEHC,gBAAAC,gBAAA,QAAA,KAAK,IAAG,KACX,CAAA;AAAA,UAAY,QAAA,yBAAZF,mBAA+D,QAA/D,YAAuD,GAAC;;QAG1DG,WAAoC,KAAA,QAAA,WAAA,EAA7B,aAAc,YAAA,OAAW;AAAA,QAEvB,QAAA,sBAATH,mBAEI,KAAA;AAAA;UAFa,IAAI,QAAA;AAAA,UAAS,OAAM;AAAA,UAAwB,MAAK;AAAA,QAAA,mBAC5D,QAAA,KAAK,GAAA,GAAA,UAAA,KAEI,QAAA,qBAAdA,mBAEI,KAAA;AAAA;UAFiB,IAAI,OAAA;AAAA,UAAQ,OAAM;AAAA,QAAA,mBAClC,QAAA,IAAI,GAAA,GAAA,UAAA;;;;;"}
@@ -69,6 +69,8 @@ export { default as FormBuilder } from './FormBuilder.vue';
69
69
  export { default as FormSection } from './FormSection.vue';
70
70
  export { default as FormActions } from './FormActions.vue';
71
71
  export { default as FormFieldRenderer } from './FormFieldRenderer.vue';
72
+ export { default as ExperimentDataViewer } from './ExperimentDataViewer.vue';
73
+ export { default as ExperimentCodeBadge } from './ExperimentCodeBadge.vue';
72
74
  export { default as DateTimePicker } from './DateTimePicker.vue';
73
75
  export { default as TimeRangeInput } from './TimeRangeInput.vue';
74
76
  export { default as ScheduleCalendar } from './ScheduleCalendar.vue';
@@ -138,13 +138,17 @@ import { default as default70 } from "./FormSection.vue.js";
138
138
  import { default as default71 } from "./FormActions.vue.js";
139
139
  /* empty css */
140
140
  import { default as default72 } from "./FormFieldRenderer.vue.js";
141
- import { default as default73 } from "./DateTimePicker.vue.js";
141
+ import { default as default73 } from "./ExperimentDataViewer.vue.js";
142
+ /* empty css */
143
+ import { default as default74 } from "./ExperimentCodeBadge.vue.js";
144
+ /* empty css */
145
+ import { default as default75 } from "./DateTimePicker.vue.js";
142
146
  /* empty css */
143
- import { default as default74 } from "./TimeRangeInput.vue.js";
147
+ import { default as default76 } from "./TimeRangeInput.vue.js";
144
148
  /* empty css */
145
- import { default as default75 } from "./ScheduleCalendar.vue.js";
149
+ import { default as default77 } from "./ScheduleCalendar.vue.js";
146
150
  /* empty css */
147
- import { default as default76 } from "./ResourceCard.vue.js";
151
+ import { default as default78 } from "./ResourceCard.vue.js";
148
152
  /* empty css */
149
153
  export {
150
154
  default25 as AlertBox,
@@ -176,11 +180,13 @@ export {
176
180
  default44 as ConfirmDialog,
177
181
  default18 as DataFrame,
178
182
  default20 as DatePicker,
179
- default73 as DateTimePicker,
183
+ default75 as DateTimePicker,
180
184
  default37 as Divider,
181
185
  default57 as DoseCalculator,
182
186
  default16 as DropdownButton,
183
187
  default41 as EmptyState,
188
+ default74 as ExperimentCodeBadge,
189
+ default73 as ExperimentDataViewer,
184
190
  default51 as ExperimentTimeline,
185
191
  default24 as FileUploader,
186
192
  default71 as FormActions,
@@ -201,11 +207,11 @@ export {
201
207
  default60 as ProtocolStepEditor,
202
208
  default48 as RackEditor,
203
209
  default58 as ReagentList,
204
- default76 as ResourceCard,
210
+ default78 as ResourceCard,
205
211
  default59 as SampleHierarchyTree,
206
212
  default49 as SampleLegend,
207
213
  default52 as SampleSelector,
208
- default75 as ScheduleCalendar,
214
+ default77 as ScheduleCalendar,
209
215
  default61 as ScientificNumber,
210
216
  default13 as SegmentedControl,
211
217
  default64 as SequenceInput,
@@ -217,7 +223,7 @@ export {
217
223
  default22 as TagsInput,
218
224
  default28 as ThemeToggle,
219
225
  default21 as TimePicker,
220
- default74 as TimeRangeInput,
226
+ default76 as TimeRangeInput,
221
227
  default26 as ToastNotification,
222
228
  default43 as Tooltip,
223
229
  default65 as UnitInput,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export { MLDSdk, default } from './install';
2
- export { BaseButton, BaseInput, BaseTextarea, BaseSelect, BaseCheckbox, BaseToggle, BaseRadioGroup, BaseSlider, ColorSlider, BaseTabs, BaseModal, FormField, DatePicker, TimePicker, TagsInput, NumberInput, FileUploader, AlertBox, ToastNotification, IconButton, ThemeToggle, SettingsButton, CollapsibleCard, AppTopBar, AppSidebar, AppLayout, AppContainer, Skeleton, WellPlate, RackEditor, SampleLegend, PlateMapEditor, ExperimentTimeline, SampleSelector, GroupingModal, GroupAssigner, MoleculeInput, ConcentrationInput, DoseCalculator, ReagentList, SampleHierarchyTree, ProtocolStepEditor, SegmentedControl, MultiSelect, BasePill, DropdownButton, Calendar, DataFrame, LoadingSpinner, Divider, StatusIndicator, ProgressBar, Avatar, EmptyState, Breadcrumb, Tooltip, ConfirmDialog, ChartContainer, SettingsModal, ScientificNumber, ChemicalFormula, FormulaInput, SequenceInput, UnitInput, StepWizard, AuditTrail, BatchProgressList, DateTimePicker, TimeRangeInput, ScheduleCalendar, ResourceCard, } from './components';
2
+ export { BaseButton, BaseInput, BaseTextarea, BaseSelect, BaseCheckbox, BaseToggle, BaseRadioGroup, BaseSlider, ColorSlider, BaseTabs, BaseModal, FormField, DatePicker, TimePicker, TagsInput, NumberInput, FileUploader, AlertBox, ToastNotification, IconButton, ThemeToggle, SettingsButton, CollapsibleCard, AppTopBar, AppSidebar, AppLayout, AppContainer, Skeleton, WellPlate, RackEditor, SampleLegend, PlateMapEditor, ExperimentTimeline, SampleSelector, GroupingModal, GroupAssigner, MoleculeInput, ConcentrationInput, DoseCalculator, ReagentList, SampleHierarchyTree, ProtocolStepEditor, SegmentedControl, MultiSelect, BasePill, DropdownButton, Calendar, DataFrame, LoadingSpinner, Divider, StatusIndicator, ProgressBar, Avatar, EmptyState, Breadcrumb, Tooltip, ConfirmDialog, ChartContainer, SettingsModal, ScientificNumber, ChemicalFormula, FormulaInput, SequenceInput, UnitInput, StepWizard, AuditTrail, BatchProgressList, ExperimentDataViewer, ExperimentCodeBadge, DateTimePicker, TimeRangeInput, ScheduleCalendar, ResourceCard, } from './components';
3
3
  export { useApi, useAuth, usePasskey, useTheme, useToast, usePlatformContext, useWellPlateEditor, useConcentrationUnits, useDoseCalculator, useProtocolTemplates, useRackEditor, useChemicalFormula, ATOMIC_WEIGHTS, useSequenceUtils, type ApiClientOptions, type UseWellPlateEditorOptions, type UseWellPlateEditorReturn, type UseRackEditorOptions, type UseRackEditorReturn, type ConcentrationValue, type ConcentrationUnit, type VolumeValue, type VolumeUnit, type StepTemplate, type FormulaParseResult, type FormulaPart, type SequenceType, type SequenceStats, parseTime, formatTime, generateTimeSlots, rangesOverlap, durationMinutes, formatDuration, isTimeInRange, findAvailableSlots, snapToSlot, addMinutes, compareTime, useScheduleDrag, usePluginConfig, type UsePluginConfigReturn, } from './composables';
4
4
  export { useAuthStore, useSettingsStore, colorPalettes, type SettingsState, } from './stores';
5
- export type { ContainerDirection, ButtonVariant, ButtonSize, InputType, ModalSize, AlertType, Toast, TabItem, SelectOption, RadioOption, FormFieldProps, SidebarToolSection, CollapsibleState, TopBarVariant, TopBarPage, TopBarTab, TopBarTabOption, TopBarSettingsConfig, WellPlateFormat, WellState, WellPlateSelectionMode, Well, HeatmapColorScale, HeatmapConfig, SlotPosition, WellExtendedData, WellEditData, WellEditField, WellLegendItem, Rack, SampleType, PlateMap, PlateMapEditorState, ProtocolStepType, ProtocolStepStatus, ProtocolStep, SampleGroup, GroupItem, FileUploaderMode, SegmentedOption, SegmentedControlVariant, SegmentedControlSize, MultiSelectOption, MultiSelectSize, PillVariant, PillSize, CalendarSelectionMode, CalendarMarker, CalendarDayContext, SortDirection, SortState, DataFrameColumn, PaginationState, SpinnerSize, SpinnerVariant, DividerSpacing, StatusType, ProgressVariant, ProgressSize, AvatarSize, EmptyStateColor, EmptyStateSize, BreadcrumbItem, TooltipPosition, ConfirmVariant, SettingsTab, NumberNotation, TimePickerFormat, TimeRange, ScheduleView, ScheduleEventStatus, ScheduleEvent, ScheduleBlockedSlot, ScheduleSlotContext, ScheduleEventCreateContext, ScheduleEventUpdateContext, ResourceStatus, ResourceSpec, UnitOption, WizardStep, WizardStepState, AuditEntryType, AuditEntry, BatchItemStatus, BatchItem, BatchSummary, AuthConfig, UserInfo, LoginResponse, TokenVerifyResponse, RegisterRequest, UpdateProfileRequest, CredentialInfo, PluginInfo, PluginNavItem, PluginSettings, PluginSettingField, PlatformContext, PlatformEventType, PlatformEvent, ThemeMode, ColorPalette, TableDensity, } from './types';
5
+ export type { ContainerDirection, ButtonVariant, ButtonSize, InputType, ModalSize, AlertType, Toast, TabItem, SelectOption, RadioOption, FormFieldProps, SidebarToolSection, CollapsibleState, TopBarVariant, TopBarPage, TopBarTab, TopBarTabOption, TopBarSettingsConfig, WellPlateFormat, WellState, WellPlateSelectionMode, Well, HeatmapColorScale, HeatmapConfig, SlotPosition, WellExtendedData, WellEditData, WellEditField, WellLegendItem, Rack, SampleType, PlateMap, PlateMapEditorState, ProtocolStepType, ProtocolStepStatus, ProtocolStep, SampleGroup, GroupItem, FileUploaderMode, SegmentedOption, SegmentedControlVariant, SegmentedControlSize, MultiSelectOption, MultiSelectSize, PillVariant, PillSize, CalendarSelectionMode, CalendarMarker, CalendarDayContext, SortDirection, SortState, DataFrameColumn, PaginationState, SpinnerSize, SpinnerVariant, DividerSpacing, StatusType, ProgressVariant, ProgressSize, AvatarSize, EmptyStateColor, EmptyStateSize, BreadcrumbItem, TooltipPosition, ConfirmVariant, SettingsTab, NumberNotation, TimePickerFormat, TimeRange, ScheduleView, ScheduleEventStatus, ScheduleEvent, ScheduleBlockedSlot, ScheduleSlotContext, ScheduleEventCreateContext, ScheduleEventUpdateContext, ResourceStatus, ResourceSpec, UnitOption, WizardStep, WizardStepState, AuditEntryType, AuditEntry, BatchItemStatus, BatchItem, BatchSummary, AuthConfig, UserInfo, LoginResponse, TokenVerifyResponse, RegisterRequest, UpdateProfileRequest, CredentialInfo, SummaryData, SummarySection, SummarySectionItem, TreeNode, TreeNodeType, PluginInfo, PluginNavItem, PluginSettings, PluginSettingField, PlatformContext, PlatformEventType, PlatformEvent, ThemeMode, ColorPalette, TableDensity, } from './types';
package/dist/index.js CHANGED
@@ -133,13 +133,17 @@ import { default as default67 } from "./components/AuditTrail.vue.js";
133
133
  /* empty css */
134
134
  import { default as default68 } from "./components/BatchProgressList.vue.js";
135
135
  /* empty css */
136
- import { default as default69 } from "./components/DateTimePicker.vue.js";
136
+ import { default as default69 } from "./components/ExperimentDataViewer.vue.js";
137
+ /* empty css */
138
+ import { default as default70 } from "./components/ExperimentCodeBadge.vue.js";
139
+ /* empty css */
140
+ import { default as default71 } from "./components/DateTimePicker.vue.js";
137
141
  /* empty css */
138
- import { default as default70 } from "./components/TimeRangeInput.vue.js";
142
+ import { default as default72 } from "./components/TimeRangeInput.vue.js";
139
143
  /* empty css */
140
- import { default as default71 } from "./components/ScheduleCalendar.vue.js";
144
+ import { default as default73 } from "./components/ScheduleCalendar.vue.js";
141
145
  /* empty css */
142
- import { default as default72 } from "./components/ResourceCard.vue.js";
146
+ import { default as default74 } from "./components/ResourceCard.vue.js";
143
147
  /* empty css */
144
148
  import { useApi } from "./composables/useApi.js";
145
149
  import { useAuth } from "./composables/useAuth.js";
@@ -190,11 +194,13 @@ export {
190
194
  default44 as ConfirmDialog,
191
195
  default18 as DataFrame,
192
196
  default20 as DatePicker,
193
- default69 as DateTimePicker,
197
+ default71 as DateTimePicker,
194
198
  default37 as Divider,
195
199
  default57 as DoseCalculator,
196
200
  default16 as DropdownButton,
197
201
  default41 as EmptyState,
202
+ default70 as ExperimentCodeBadge,
203
+ default69 as ExperimentDataViewer,
198
204
  default51 as ExperimentTimeline,
199
205
  default24 as FileUploader,
200
206
  default19 as FormField,
@@ -212,11 +218,11 @@ export {
212
218
  default60 as ProtocolStepEditor,
213
219
  default48 as RackEditor,
214
220
  default58 as ReagentList,
215
- default72 as ResourceCard,
221
+ default74 as ResourceCard,
216
222
  default59 as SampleHierarchyTree,
217
223
  default49 as SampleLegend,
218
224
  default52 as SampleSelector,
219
- default71 as ScheduleCalendar,
225
+ default73 as ScheduleCalendar,
220
226
  default61 as ScientificNumber,
221
227
  default13 as SegmentedControl,
222
228
  default64 as SequenceInput,
@@ -228,7 +234,7 @@ export {
228
234
  default22 as TagsInput,
229
235
  default28 as ThemeToggle,
230
236
  default21 as TimePicker,
231
- default70 as TimeRangeInput,
237
+ default72 as TimeRangeInput,
232
238
  default26 as ToastNotification,
233
239
  default43 as Tooltip,
234
240
  default65 as UnitInput,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}