@morscherlab/mld-sdk 0.7.2 → 0.7.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) 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 +311 -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/collapsible-card.css +7 -0
  47. package/src/styles/components/experiment-code-badge.css +13 -0
  48. package/src/styles/components/experiment-data-viewer.css +131 -0
  49. package/src/styles/components/modal.css +1 -1
  50. package/src/styles/components/select.css +1 -1
  51. package/src/styles/components/slider.css +4 -8
  52. package/src/styles/components/textarea.css +5 -1
  53. package/src/styles/index.css +2 -0
  54. package/src/styles/variables.css +7 -2
  55. package/src/types/components.ts +27 -0
  56. package/src/types/index.ts +4 -0
@@ -12,6 +12,7 @@ interface Props {
12
12
  min?: number;
13
13
  max?: number;
14
14
  step?: number;
15
+ ariaDescribedby?: string;
15
16
  }
16
17
  declare const _default: import('vue').DefineComponent<Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
17
18
  "update:modelValue": (value: string | number | null) => any;
@@ -1,5 +1,5 @@
1
1
  import { defineComponent, openBlock, createElementBlock, normalizeClass } from "vue";
2
- const _hoisted_1 = ["type", "value", "placeholder", "disabled", "readonly", "autocomplete", "autofocus", "min", "max", "step"];
2
+ const _hoisted_1 = ["type", "value", "placeholder", "disabled", "readonly", "autocomplete", "autofocus", "min", "max", "step", "aria-invalid", "aria-describedby"];
3
3
  const _sfc_main = /* @__PURE__ */ defineComponent({
4
4
  __name: "BaseInput",
5
5
  props: {
@@ -14,7 +14,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
14
14
  autofocus: { type: Boolean },
15
15
  min: {},
16
16
  max: {},
17
- step: {}
17
+ step: {},
18
+ ariaDescribedby: {}
18
19
  },
19
20
  emits: ["update:modelValue", "focus", "blur", "keydown"],
20
21
  setup(__props, { emit: __emit }) {
@@ -37,6 +38,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
37
38
  min: __props.min,
38
39
  max: __props.max,
39
40
  step: __props.step,
41
+ "aria-invalid": __props.error || void 0,
42
+ "aria-describedby": __props.ariaDescribedby || void 0,
40
43
  class: normalizeClass([
41
44
  "mld-input",
42
45
  `mld-input--${__props.size}`,
@@ -1 +1 @@
1
- {"version":3,"file":"BaseInput.vue.js","sources":["../../src/components/BaseInput.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { InputType } from '../types'\n\ninterface Props {\n modelValue?: string | number\n type?: InputType\n placeholder?: string\n disabled?: boolean\n readonly?: boolean\n error?: boolean\n size?: 'sm' | 'md' | 'lg'\n autocomplete?: string\n autofocus?: boolean\n min?: number\n max?: number\n step?: number\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n type: 'text',\n disabled: false,\n readonly: false,\n error: false,\n size: 'md',\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string | number | null]\n focus: [event: FocusEvent]\n blur: [event: FocusEvent]\n keydown: [event: KeyboardEvent]\n}>()\n\nfunction handleInput(event: Event) {\n const target = event.target as HTMLInputElement\n const value = props.type === 'number'\n ? (target.value === '' ? null : Number(target.value))\n : target.value\n emit('update:modelValue', value as string | number)\n}\n</script>\n\n<template>\n <input\n :type=\"type\"\n :value=\"modelValue\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :autocomplete=\"autocomplete\"\n :autofocus=\"autofocus\"\n :min=\"min\"\n :max=\"max\"\n :step=\"step\"\n :class=\"[\n 'mld-input',\n `mld-input--${size}`,\n error ? 'mld-input--error' : '',\n disabled ? 'mld-input--disabled' : '',\n ]\"\n @input=\"handleInput\"\n @focus=\"emit('focus', $event)\"\n @blur=\"emit('blur', $event)\"\n @keydown=\"emit('keydown', $event)\"\n />\n</template>\n\n<style>\n@import '../styles/components/input.css';\n</style>\n"],"names":["_createElementBlock","_normalizeClass"],"mappings":";;;;;;;;;;;;;;;;;;;;AAkBA,UAAM,QAAQ;AAQd,UAAM,OAAO;AAOb,aAAS,YAAY,OAAc;AACjC,YAAM,SAAS,MAAM;AACrB,YAAM,QAAQ,MAAM,SAAS,WACxB,OAAO,UAAU,KAAK,OAAO,OAAO,OAAO,KAAK,IACjD,OAAO;AACX,WAAK,qBAAqB,KAAwB;AAAA,IACpD;;0BAIEA,mBAqBE,SAAA;AAAA,QApBC,MAAM,QAAA;AAAA,QACN,OAAO,QAAA;AAAA,QACP,aAAa,QAAA;AAAA,QACb,UAAU,QAAA;AAAA,QACV,UAAU,QAAA;AAAA,QACV,cAAc,QAAA;AAAA,QACd,WAAW,QAAA;AAAA,QACX,KAAK,QAAA;AAAA,QACL,KAAK,QAAA;AAAA,QACL,MAAM,QAAA;AAAA,QACN,OAAKC,eAAA;AAAA;wBAA2C,QAAA,IAAI;AAAA,UAAU,QAAA,QAAK,qBAAA;AAAA,UAAkC,QAAA,WAAQ,wBAAA;AAAA,QAAA;QAM7G,SAAO;AAAA,QACP,SAAK,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAE,KAAI,SAAU,MAAM;AAAA,QAC3B,QAAI,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAE,KAAI,QAAS,MAAM;AAAA,QACzB,WAAO,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAE,KAAI,WAAY,MAAM;AAAA,MAAA;;;;"}
1
+ {"version":3,"file":"BaseInput.vue.js","sources":["../../src/components/BaseInput.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { InputType } from '../types'\n\ninterface Props {\n modelValue?: string | number\n type?: InputType\n placeholder?: string\n disabled?: boolean\n readonly?: boolean\n error?: boolean\n size?: 'sm' | 'md' | 'lg'\n autocomplete?: string\n autofocus?: boolean\n min?: number\n max?: number\n step?: number\n ariaDescribedby?: string\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n type: 'text',\n disabled: false,\n readonly: false,\n error: false,\n size: 'md',\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string | number | null]\n focus: [event: FocusEvent]\n blur: [event: FocusEvent]\n keydown: [event: KeyboardEvent]\n}>()\n\nfunction handleInput(event: Event) {\n const target = event.target as HTMLInputElement\n const value = props.type === 'number'\n ? (target.value === '' ? null : Number(target.value))\n : target.value\n emit('update:modelValue', value as string | number)\n}\n</script>\n\n<template>\n <input\n :type=\"type\"\n :value=\"modelValue\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :autocomplete=\"autocomplete\"\n :autofocus=\"autofocus\"\n :min=\"min\"\n :max=\"max\"\n :step=\"step\"\n :aria-invalid=\"error || undefined\"\n :aria-describedby=\"ariaDescribedby || undefined\"\n :class=\"[\n 'mld-input',\n `mld-input--${size}`,\n error ? 'mld-input--error' : '',\n disabled ? 'mld-input--disabled' : '',\n ]\"\n @input=\"handleInput\"\n @focus=\"emit('focus', $event)\"\n @blur=\"emit('blur', $event)\"\n @keydown=\"emit('keydown', $event)\"\n />\n</template>\n\n<style>\n@import '../styles/components/input.css';\n</style>\n"],"names":["_createElementBlock","_normalizeClass"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAmBA,UAAM,QAAQ;AAQd,UAAM,OAAO;AAOb,aAAS,YAAY,OAAc;AACjC,YAAM,SAAS,MAAM;AACrB,YAAM,QAAQ,MAAM,SAAS,WACxB,OAAO,UAAU,KAAK,OAAO,OAAO,OAAO,KAAK,IACjD,OAAO;AACX,WAAK,qBAAqB,KAAwB;AAAA,IACpD;;0BAIEA,mBAuBE,SAAA;AAAA,QAtBC,MAAM,QAAA;AAAA,QACN,OAAO,QAAA;AAAA,QACP,aAAa,QAAA;AAAA,QACb,UAAU,QAAA;AAAA,QACV,UAAU,QAAA;AAAA,QACV,cAAc,QAAA;AAAA,QACd,WAAW,QAAA;AAAA,QACX,KAAK,QAAA;AAAA,QACL,KAAK,QAAA;AAAA,QACL,MAAM,QAAA;AAAA,QACN,gBAAc,QAAA,SAAS;AAAA,QACvB,oBAAkB,QAAA,mBAAmB;AAAA,QACrC,OAAKC,eAAA;AAAA;wBAA2C,QAAA,IAAI;AAAA,UAAU,QAAA,QAAK,qBAAA;AAAA,UAAkC,QAAA,WAAQ,wBAAA;AAAA,QAAA;QAM7G,SAAO;AAAA,QACP,SAAK,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAE,KAAI,SAAU,MAAM;AAAA,QAC3B,QAAI,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAE,KAAI,QAAS,MAAM;AAAA,QACzB,WAAO,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAE,KAAI,WAAY,MAAM;AAAA,MAAA;;;;"}
@@ -13,7 +13,9 @@ declare function __VLS_template(): {
13
13
  default?(_: {}): any;
14
14
  footer?(_: {}): any;
15
15
  };
16
- refs: {};
16
+ refs: {
17
+ containerRef: HTMLDivElement;
18
+ };
17
19
  rootEl: any;
18
20
  };
19
21
  type __VLS_TemplateResult = ReturnType<typeof __VLS_template>;
@@ -28,7 +30,9 @@ declare const __VLS_component: import('vue').DefineComponent<Props, {}, {}, {},
28
30
  closable: boolean;
29
31
  closeOnOverlay: boolean;
30
32
  closeOnEscape: boolean;
31
- }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
33
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
34
+ containerRef: HTMLDivElement;
35
+ }, any>;
32
36
  declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
33
37
  export default _default;
34
38
  type __VLS_WithTemplateSlots<T, S> = T & {
@@ -1,4 +1,4 @@
1
- import { defineComponent, watch, onMounted, onUnmounted, openBlock, createBlock, Teleport, createVNode, Transition, withCtx, createElementBlock, createElementVNode, normalizeClass, toDisplayString, createCommentVNode, renderSlot } from "vue";
1
+ import { defineComponent, ref, watch, nextTick, onMounted, onUnmounted, openBlock, createBlock, Teleport, createVNode, Transition, withCtx, createElementBlock, createElementVNode, normalizeClass, toDisplayString, createCommentVNode, renderSlot } from "vue";
2
2
  const _hoisted_1 = {
3
3
  key: 0,
4
4
  class: "mld-modal__header"
@@ -26,6 +26,41 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
26
26
  setup(__props, { emit: __emit }) {
27
27
  const props = __props;
28
28
  const emit = __emit;
29
+ const containerRef = ref(null);
30
+ let previouslyFocused = null;
31
+ const FOCUSABLE_SELECTOR = [
32
+ "a[href]",
33
+ "button:not([disabled])",
34
+ "input:not([disabled])",
35
+ "select:not([disabled])",
36
+ "textarea:not([disabled])",
37
+ '[tabindex]:not([tabindex="-1"])'
38
+ ].join(", ");
39
+ function getFocusableElements() {
40
+ if (!containerRef.value) return [];
41
+ return Array.from(containerRef.value.querySelectorAll(FOCUSABLE_SELECTOR));
42
+ }
43
+ function handleKeydown(event) {
44
+ if (event.key === "Escape" && props.closeOnEscape && props.modelValue) {
45
+ close();
46
+ return;
47
+ }
48
+ if (event.key !== "Tab" || !containerRef.value) return;
49
+ const focusable = getFocusableElements();
50
+ if (focusable.length === 0) {
51
+ event.preventDefault();
52
+ return;
53
+ }
54
+ const first = focusable[0];
55
+ const last = focusable[focusable.length - 1];
56
+ if (event.shiftKey && document.activeElement === first) {
57
+ event.preventDefault();
58
+ last.focus();
59
+ } else if (!event.shiftKey && document.activeElement === last) {
60
+ event.preventDefault();
61
+ first.focus();
62
+ }
63
+ }
29
64
  function close() {
30
65
  if (props.closable) {
31
66
  emit("update:modelValue", false);
@@ -37,23 +72,29 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
37
72
  close();
38
73
  }
39
74
  }
40
- function handleEscape(event) {
41
- if (props.closeOnEscape && event.key === "Escape" && props.modelValue) {
42
- close();
43
- }
44
- }
45
- watch(() => props.modelValue, (isOpen) => {
75
+ watch(() => props.modelValue, async (isOpen) => {
76
+ var _a;
46
77
  if (isOpen) {
78
+ previouslyFocused = document.activeElement;
47
79
  document.body.style.overflow = "hidden";
80
+ await nextTick();
81
+ const focusable = getFocusableElements();
82
+ if (focusable.length > 0) {
83
+ focusable[0].focus();
84
+ } else {
85
+ (_a = containerRef.value) == null ? void 0 : _a.focus();
86
+ }
48
87
  } else {
49
88
  document.body.style.overflow = "";
89
+ previouslyFocused == null ? void 0 : previouslyFocused.focus();
90
+ previouslyFocused = null;
50
91
  }
51
92
  });
52
93
  onMounted(() => {
53
- document.addEventListener("keydown", handleEscape);
94
+ document.addEventListener("keydown", handleKeydown);
54
95
  });
55
96
  onUnmounted(() => {
56
- document.removeEventListener("keydown", handleEscape);
97
+ document.removeEventListener("keydown", handleKeydown);
57
98
  document.body.style.overflow = "";
58
99
  });
59
100
  return (_ctx, _cache) => {
@@ -67,12 +108,15 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
67
108
  }, [
68
109
  _cache[1] || (_cache[1] = createElementVNode("div", { class: "mld-modal__overlay" }, null, -1)),
69
110
  createElementVNode("div", {
111
+ ref_key: "containerRef",
112
+ ref: containerRef,
70
113
  class: normalizeClass([
71
114
  "mld-modal__container",
72
115
  `mld-modal__container--${__props.size}`
73
116
  ]),
74
117
  role: "dialog",
75
- "aria-modal": "true"
118
+ "aria-modal": "true",
119
+ tabindex: "-1"
76
120
  }, [
77
121
  __props.title || __props.closable ? (openBlock(), createElementBlock("div", _hoisted_1, [
78
122
  __props.title ? (openBlock(), createElementBlock("h3", _hoisted_2, toDisplayString(__props.title), 1)) : createCommentVNode("", true),
@@ -1 +1 @@
1
- {"version":3,"file":"BaseModal.vue.js","sources":["../../src/components/BaseModal.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { watch, onMounted, onUnmounted } from 'vue'\nimport type { ModalSize } from '../types'\n\ninterface Props {\n modelValue: boolean\n title?: string\n size?: ModalSize\n closable?: boolean\n closeOnOverlay?: boolean\n closeOnEscape?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n size: 'md',\n closable: true,\n closeOnOverlay: true,\n closeOnEscape: true,\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: boolean]\n close: []\n}>()\n\nfunction close() {\n if (props.closable) {\n emit('update:modelValue', false)\n emit('close')\n }\n}\n\nfunction handleOverlayClick(event: MouseEvent) {\n if (props.closeOnOverlay && event.target === event.currentTarget) {\n close()\n }\n}\n\nfunction handleEscape(event: KeyboardEvent) {\n if (props.closeOnEscape && event.key === 'Escape' && props.modelValue) {\n close()\n }\n}\n\nwatch(() => props.modelValue, (isOpen) => {\n if (isOpen) {\n document.body.style.overflow = 'hidden'\n } else {\n document.body.style.overflow = ''\n }\n})\n\nonMounted(() => {\n document.addEventListener('keydown', handleEscape)\n})\n\nonUnmounted(() => {\n document.removeEventListener('keydown', handleEscape)\n document.body.style.overflow = ''\n})\n</script>\n\n<template>\n <Teleport to=\"body\">\n <Transition name=\"modal\">\n <div\n v-if=\"modelValue\"\n class=\"mld-modal\"\n @click=\"handleOverlayClick\"\n >\n <!-- Overlay -->\n <div class=\"mld-modal__overlay\" />\n\n <!-- Modal -->\n <div\n :class=\"[\n 'mld-modal__container',\n `mld-modal__container--${size}`,\n ]\"\n role=\"dialog\"\n aria-modal=\"true\"\n >\n <!-- Header -->\n <div v-if=\"title || closable\" class=\"mld-modal__header\">\n <h3 v-if=\"title\" class=\"mld-modal__title\">\n {{ title }}\n </h3>\n <button\n v-if=\"closable\"\n type=\"button\"\n class=\"mld-modal__close\"\n aria-label=\"Close modal\"\n @click=\"close\"\n >\n <svg class=\"mld-modal__close-icon\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" viewBox=\"0 0 24 24\">\n <path d=\"M18 6 6 18\" /><path d=\"m6 6 12 12\" />\n </svg>\n </button>\n </div>\n\n <!-- Body -->\n <div class=\"mld-modal__body\">\n <slot />\n </div>\n\n <!-- Footer -->\n <div v-if=\"$slots.footer\" class=\"mld-modal__footer\">\n <slot name=\"footer\" />\n </div>\n </div>\n </div>\n </Transition>\n </Teleport>\n</template>\n\n<style>\n@import '../styles/components/modal.css';\n</style>\n"],"names":["_createBlock","_Teleport","_createVNode","_Transition","_createElementBlock","_createElementVNode","_normalizeClass","_openBlock","_toDisplayString","_renderSlot","$slots"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,UAAM,QAAQ;AAOd,UAAM,OAAO;AAKb,aAAS,QAAQ;AACf,UAAI,MAAM,UAAU;AAClB,aAAK,qBAAqB,KAAK;AAC/B,aAAK,OAAO;AAAA,MACd;AAAA,IACF;AAEA,aAAS,mBAAmB,OAAmB;AAC7C,UAAI,MAAM,kBAAkB,MAAM,WAAW,MAAM,eAAe;AAChE,cAAA;AAAA,MACF;AAAA,IACF;AAEA,aAAS,aAAa,OAAsB;AAC1C,UAAI,MAAM,iBAAiB,MAAM,QAAQ,YAAY,MAAM,YAAY;AACrE,cAAA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,MAAM,MAAM,YAAY,CAAC,WAAW;AACxC,UAAI,QAAQ;AACV,iBAAS,KAAK,MAAM,WAAW;AAAA,MACjC,OAAO;AACL,iBAAS,KAAK,MAAM,WAAW;AAAA,MACjC;AAAA,IACF,CAAC;AAED,cAAU,MAAM;AACd,eAAS,iBAAiB,WAAW,YAAY;AAAA,IACnD,CAAC;AAED,gBAAY,MAAM;AAChB,eAAS,oBAAoB,WAAW,YAAY;AACpD,eAAS,KAAK,MAAM,WAAW;AAAA,IACjC,CAAC;;0BAICA,YAiDWC,UAAA,EAjDD,IAAG,UAAM;AAAA,QACjBC,YA+CaC,YAAA,EA/CD,MAAK,WAAO;AAAA,2BACtB,MA6CM;AAAA,YA5CE,QAAA,2BADRC,mBA6CM,OAAA;AAAA;cA3CJ,OAAM;AAAA,cACL,SAAO;AAAA,YAAA;wCAGRC,mBAAkC,OAAA,EAA7B,OAAM,qBAAA,GAAoB,MAAA,EAAA;AAAA,cAG/BA,mBAmCM,OAAA;AAAA,gBAlCH,OAAKC,eAAA;AAAA;2CAA6E,QAAA,IAAI;AAAA,gBAAA;gBAIvF,MAAK;AAAA,gBACL,cAAW;AAAA,cAAA;gBAGA,QAAA,SAAS,QAAA,YAApBC,aAAAH,mBAeM,OAfN,YAeM;AAAA,kBAdM,QAAA,sBAAVA,mBAEK,MAFL,YAEKI,gBADA,QAAA,KAAK,GAAA,CAAA;kBAGF,QAAA,yBADRJ,mBAUS,UAAA;AAAA;oBARP,MAAK;AAAA,oBACL,OAAM;AAAA,oBACN,cAAW;AAAA,oBACV,SAAO;AAAA,kBAAA;oBAERC,mBAEM,OAAA;AAAA,sBAFD,OAAM;AAAA,sBAAwB,MAAK;AAAA,sBAAO,QAAO;AAAA,sBAAe,gBAAa;AAAA,sBAAI,kBAAe;AAAA,sBAAQ,mBAAgB;AAAA,sBAAQ,SAAQ;AAAA,oBAAA;sBAC3IA,mBAAuB,QAAA,EAAjB,GAAE,cAAY;AAAA,sBAAGA,mBAAuB,QAAA,EAAjB,GAAE,cAAY;AAAA,oBAAA;;;gBAMjDA,mBAEM,OAFN,YAEM;AAAA,kBADJI,WAAQ,KAAA,QAAA,SAAA;AAAA,gBAAA;gBAICC,KAAAA,OAAO,UAAlBH,aAAAH,mBAEM,OAFN,YAEM;AAAA,kBADJK,WAAsB,KAAA,QAAA,QAAA;AAAA,gBAAA;;;;;;;;;;"}
1
+ {"version":3,"file":"BaseModal.vue.js","sources":["../../src/components/BaseModal.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, watch, nextTick, onMounted, onUnmounted } from 'vue'\nimport type { ModalSize } from '../types'\n\ninterface Props {\n modelValue: boolean\n title?: string\n size?: ModalSize\n closable?: boolean\n closeOnOverlay?: boolean\n closeOnEscape?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n size: 'md',\n closable: true,\n closeOnOverlay: true,\n closeOnEscape: true,\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: boolean]\n close: []\n}>()\n\nconst containerRef = ref<HTMLElement | null>(null)\nlet previouslyFocused: HTMLElement | null = null\n\nconst FOCUSABLE_SELECTOR = [\n 'a[href]',\n 'button:not([disabled])',\n 'input:not([disabled])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n].join(', ')\n\nfunction getFocusableElements(): HTMLElement[] {\n if (!containerRef.value) return []\n return Array.from(containerRef.value.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR))\n}\n\nfunction handleKeydown(event: KeyboardEvent) {\n if (event.key === 'Escape' && props.closeOnEscape && props.modelValue) {\n close()\n return\n }\n\n if (event.key !== 'Tab' || !containerRef.value) return\n\n const focusable = getFocusableElements()\n if (focusable.length === 0) {\n event.preventDefault()\n return\n }\n\n const first = focusable[0]\n const last = focusable[focusable.length - 1]\n\n if (event.shiftKey && document.activeElement === first) {\n event.preventDefault()\n last.focus()\n } else if (!event.shiftKey && document.activeElement === last) {\n event.preventDefault()\n first.focus()\n }\n}\n\nfunction close() {\n if (props.closable) {\n emit('update:modelValue', false)\n emit('close')\n }\n}\n\nfunction handleOverlayClick(event: MouseEvent) {\n if (props.closeOnOverlay && event.target === event.currentTarget) {\n close()\n }\n}\n\nwatch(() => props.modelValue, async (isOpen) => {\n if (isOpen) {\n previouslyFocused = document.activeElement as HTMLElement | null\n document.body.style.overflow = 'hidden'\n await nextTick()\n const focusable = getFocusableElements()\n if (focusable.length > 0) {\n focusable[0].focus()\n } else {\n containerRef.value?.focus()\n }\n } else {\n document.body.style.overflow = ''\n previouslyFocused?.focus()\n previouslyFocused = null\n }\n})\n\nonMounted(() => {\n document.addEventListener('keydown', handleKeydown)\n})\n\nonUnmounted(() => {\n document.removeEventListener('keydown', handleKeydown)\n document.body.style.overflow = ''\n})\n</script>\n\n<template>\n <Teleport to=\"body\">\n <Transition name=\"modal\">\n <div\n v-if=\"modelValue\"\n class=\"mld-modal\"\n @click=\"handleOverlayClick\"\n >\n <!-- Overlay -->\n <div class=\"mld-modal__overlay\" />\n\n <!-- Modal -->\n <div\n ref=\"containerRef\"\n :class=\"[\n 'mld-modal__container',\n `mld-modal__container--${size}`,\n ]\"\n role=\"dialog\"\n aria-modal=\"true\"\n tabindex=\"-1\"\n >\n <!-- Header -->\n <div v-if=\"title || closable\" class=\"mld-modal__header\">\n <h3 v-if=\"title\" class=\"mld-modal__title\">\n {{ title }}\n </h3>\n <button\n v-if=\"closable\"\n type=\"button\"\n class=\"mld-modal__close\"\n aria-label=\"Close modal\"\n @click=\"close\"\n >\n <svg class=\"mld-modal__close-icon\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" viewBox=\"0 0 24 24\">\n <path d=\"M18 6 6 18\" /><path d=\"m6 6 12 12\" />\n </svg>\n </button>\n </div>\n\n <!-- Body -->\n <div class=\"mld-modal__body\">\n <slot />\n </div>\n\n <!-- Footer -->\n <div v-if=\"$slots.footer\" class=\"mld-modal__footer\">\n <slot name=\"footer\" />\n </div>\n </div>\n </div>\n </Transition>\n </Teleport>\n</template>\n\n<style>\n@import '../styles/components/modal.css';\n</style>\n"],"names":["_createBlock","_Teleport","_createVNode","_Transition","_createElementBlock","_createElementVNode","_normalizeClass","_openBlock","_toDisplayString","_renderSlot","$slots"],"mappings":"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"}
@@ -6,6 +6,7 @@ interface Props {
6
6
  disabled?: boolean;
7
7
  error?: boolean;
8
8
  size?: 'sm' | 'md' | 'lg';
9
+ ariaDescribedby?: string;
9
10
  }
10
11
  declare const _default: import('vue').DefineComponent<Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
11
12
  "update:modelValue": (value: string | number) => any;
@@ -1,6 +1,6 @@
1
1
  import { defineComponent, openBlock, createElementBlock, createElementVNode, normalizeClass, toDisplayString, createCommentVNode, Fragment, renderList } from "vue";
2
2
  const _hoisted_1 = { class: "mld-select" };
3
- const _hoisted_2 = ["value", "disabled"];
3
+ const _hoisted_2 = ["value", "disabled", "aria-invalid", "aria-describedby"];
4
4
  const _hoisted_3 = {
5
5
  key: 0,
6
6
  value: "",
@@ -15,7 +15,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
15
15
  placeholder: {},
16
16
  disabled: { type: Boolean, default: false },
17
17
  error: { type: Boolean, default: false },
18
- size: { default: "md" }
18
+ size: { default: "md" },
19
+ ariaDescribedby: {}
19
20
  },
20
21
  emits: ["update:modelValue"],
21
22
  setup(__props, { emit: __emit }) {
@@ -31,6 +32,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
31
32
  createElementVNode("select", {
32
33
  value: __props.modelValue,
33
34
  disabled: __props.disabled,
35
+ "aria-invalid": __props.error || void 0,
36
+ "aria-describedby": __props.ariaDescribedby || void 0,
34
37
  class: normalizeClass([
35
38
  "mld-select__control",
36
39
  `mld-select__control--${__props.size}`,
@@ -1 +1 @@
1
- {"version":3,"file":"BaseSelect.vue.js","sources":["../../src/components/BaseSelect.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { SelectOption } from '../types'\n\ninterface Props {\n modelValue?: string | number\n options: SelectOption<string | number>[]\n placeholder?: string\n disabled?: boolean\n error?: boolean\n size?: 'sm' | 'md' | 'lg'\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n disabled: false,\n error: false,\n size: 'md',\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string | number]\n}>()\n\nfunction handleChange(event: Event) {\n const target = event.target as HTMLSelectElement\n const value = typeof props.modelValue === 'number'\n ? Number(target.value)\n : target.value\n emit('update:modelValue', value)\n}\n</script>\n\n<template>\n <div class=\"mld-select\">\n <select\n :value=\"modelValue\"\n :disabled=\"disabled\"\n :class=\"[\n 'mld-select__control',\n `mld-select__control--${size}`,\n error ? 'mld-select__control--error' : '',\n disabled ? 'mld-select__control--disabled' : '',\n ]\"\n @change=\"handleChange\"\n >\n <option v-if=\"placeholder\" value=\"\" disabled>\n {{ placeholder }}\n </option>\n <option\n v-for=\"option in options\"\n :key=\"String(option.value)\"\n :value=\"option.value\"\n :disabled=\"option.disabled\"\n >\n {{ option.label }}\n </option>\n </select>\n <div class=\"mld-select__icon\">\n <svg fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" viewBox=\"0 0 24 24\">\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </div>\n </div>\n</template>\n\n<style>\n@import '../styles/components/select.css';\n</style>\n"],"names":["_openBlock","_createElementBlock","_createElementVNode","_normalizeClass","_toDisplayString","_Fragment","_renderList"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAYA,UAAM,QAAQ;AAMd,UAAM,OAAO;AAIb,aAAS,aAAa,OAAc;AAClC,YAAM,SAAS,MAAM;AACrB,YAAM,QAAQ,OAAO,MAAM,eAAe,WACtC,OAAO,OAAO,KAAK,IACnB,OAAO;AACX,WAAK,qBAAqB,KAAK;AAAA,IACjC;;AAIE,aAAAA,UAAA,GAAAC,mBA6BM,OA7BN,YA6BM;AAAA,QA5BJC,mBAsBS,UAAA;AAAA,UArBN,OAAO,QAAA;AAAA,UACP,UAAU,QAAA;AAAA,UACV,OAAKC,eAAA;AAAA;oCAAmE,QAAA,IAAI;AAAA,YAAY,QAAA,QAAK,+BAAA;AAAA,YAA8C,QAAA,WAAQ,kCAAA;AAAA,UAAA;UAMnJ,UAAQ;AAAA,QAAA;UAEK,QAAA,4BAAdF,mBAES,UAFT,YAESG,gBADJ,QAAA,WAAW,GAAA,CAAA;4BAEhBH,mBAOSI,UAAA,MAAAC,WANU,QAAA,SAAO,CAAjB,WAAM;gCADfL,mBAOS,UAAA;AAAA,cALN,KAAK,OAAO,OAAO,KAAK;AAAA,cACxB,OAAO,OAAO;AAAA,cACd,UAAU,OAAO;AAAA,YAAA,GAEfG,gBAAA,OAAO,KAAK,GAAA,GAAA,UAAA;AAAA;;kCAGnBF,mBAIM,OAAA,EAJD,OAAM,sBAAkB;AAAA,UAC3BA,mBAEM,OAAA;AAAA,YAFD,MAAK;AAAA,YAAO,QAAO;AAAA,YAAe,gBAAa;AAAA,YAAI,kBAAe;AAAA,YAAQ,mBAAgB;AAAA,YAAQ,SAAQ;AAAA,UAAA;YAC7GA,mBAAyB,QAAA,EAAnB,GAAE,gBAAc;AAAA,UAAA;;;;;;"}
1
+ {"version":3,"file":"BaseSelect.vue.js","sources":["../../src/components/BaseSelect.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { SelectOption } from '../types'\n\ninterface Props {\n modelValue?: string | number\n options: SelectOption<string | number>[]\n placeholder?: string\n disabled?: boolean\n error?: boolean\n size?: 'sm' | 'md' | 'lg'\n ariaDescribedby?: string\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n disabled: false,\n error: false,\n size: 'md',\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string | number]\n}>()\n\nfunction handleChange(event: Event) {\n const target = event.target as HTMLSelectElement\n const value = typeof props.modelValue === 'number'\n ? Number(target.value)\n : target.value\n emit('update:modelValue', value)\n}\n</script>\n\n<template>\n <div class=\"mld-select\">\n <select\n :value=\"modelValue\"\n :disabled=\"disabled\"\n :aria-invalid=\"error || undefined\"\n :aria-describedby=\"ariaDescribedby || undefined\"\n :class=\"[\n 'mld-select__control',\n `mld-select__control--${size}`,\n error ? 'mld-select__control--error' : '',\n disabled ? 'mld-select__control--disabled' : '',\n ]\"\n @change=\"handleChange\"\n >\n <option v-if=\"placeholder\" value=\"\" disabled>\n {{ placeholder }}\n </option>\n <option\n v-for=\"option in options\"\n :key=\"String(option.value)\"\n :value=\"option.value\"\n :disabled=\"option.disabled\"\n >\n {{ option.label }}\n </option>\n </select>\n <div class=\"mld-select__icon\">\n <svg fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" viewBox=\"0 0 24 24\">\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </div>\n </div>\n</template>\n\n<style>\n@import '../styles/components/select.css';\n</style>\n"],"names":["_openBlock","_createElementBlock","_createElementVNode","_normalizeClass","_toDisplayString","_Fragment","_renderList"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAaA,UAAM,QAAQ;AAMd,UAAM,OAAO;AAIb,aAAS,aAAa,OAAc;AAClC,YAAM,SAAS,MAAM;AACrB,YAAM,QAAQ,OAAO,MAAM,eAAe,WACtC,OAAO,OAAO,KAAK,IACnB,OAAO;AACX,WAAK,qBAAqB,KAAK;AAAA,IACjC;;AAIE,aAAAA,UAAA,GAAAC,mBA+BM,OA/BN,YA+BM;AAAA,QA9BJC,mBAwBS,UAAA;AAAA,UAvBN,OAAO,QAAA;AAAA,UACP,UAAU,QAAA;AAAA,UACV,gBAAc,QAAA,SAAS;AAAA,UACvB,oBAAkB,QAAA,mBAAmB;AAAA,UACrC,OAAKC,eAAA;AAAA;oCAAmE,QAAA,IAAI;AAAA,YAAY,QAAA,QAAK,+BAAA;AAAA,YAA8C,QAAA,WAAQ,kCAAA;AAAA,UAAA;UAMnJ,UAAQ;AAAA,QAAA;UAEK,QAAA,4BAAdF,mBAES,UAFT,YAESG,gBADJ,QAAA,WAAW,GAAA,CAAA;4BAEhBH,mBAOSI,UAAA,MAAAC,WANU,QAAA,SAAO,CAAjB,WAAM;gCADfL,mBAOS,UAAA;AAAA,cALN,KAAK,OAAO,OAAO,KAAK;AAAA,cACxB,OAAO,OAAO;AAAA,cACd,UAAU,OAAO;AAAA,YAAA,GAEfG,gBAAA,OAAO,KAAK,GAAA,GAAA,UAAA;AAAA;;kCAGnBF,mBAIM,OAAA,EAJD,OAAM,sBAAkB;AAAA,UAC3BA,mBAEM,OAAA;AAAA,YAFD,MAAK;AAAA,YAAO,QAAO;AAAA,YAAe,gBAAa;AAAA,YAAI,kBAAe;AAAA,YAAQ,mBAAgB;AAAA,YAAQ,SAAQ;AAAA,UAAA;YAC7GA,mBAAyB,QAAA,EAAnB,GAAE,gBAAc;AAAA,UAAA;;;;;;"}
@@ -8,6 +8,7 @@ interface Props {
8
8
  rows?: number;
9
9
  resize?: 'none' | 'vertical' | 'horizontal' | 'both';
10
10
  maxlength?: number;
11
+ ariaDescribedby?: string;
11
12
  }
12
13
  declare const _default: import('vue').DefineComponent<Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
13
14
  "update:modelValue": (value: string) => any;
@@ -1,5 +1,5 @@
1
1
  import { defineComponent, openBlock, createElementBlock, normalizeClass } from "vue";
2
- const _hoisted_1 = ["value", "placeholder", "disabled", "readonly", "rows", "maxlength"];
2
+ const _hoisted_1 = ["value", "placeholder", "disabled", "readonly", "rows", "maxlength", "aria-invalid", "aria-describedby"];
3
3
  const _sfc_main = /* @__PURE__ */ defineComponent({
4
4
  __name: "BaseTextarea",
5
5
  props: {
@@ -11,7 +11,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
11
11
  size: { default: "md" },
12
12
  rows: { default: 3 },
13
13
  resize: { default: "vertical" },
14
- maxlength: {}
14
+ maxlength: {},
15
+ ariaDescribedby: {}
15
16
  },
16
17
  emits: ["update:modelValue", "focus", "blur"],
17
18
  setup(__props, { emit: __emit }) {
@@ -29,6 +30,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
29
30
  readonly: props.readonly,
30
31
  rows: props.rows,
31
32
  maxlength: props.maxlength,
33
+ "aria-invalid": props.error || void 0,
34
+ "aria-describedby": props.ariaDescribedby || void 0,
32
35
  class: normalizeClass([
33
36
  "mld-textarea",
34
37
  `mld-textarea--${props.size}`,
@@ -1 +1 @@
1
- {"version":3,"file":"BaseTextarea.vue.js","sources":["../../src/components/BaseTextarea.vue"],"sourcesContent":["<script setup lang=\"ts\">\ninterface Props {\n modelValue?: string\n placeholder?: string\n disabled?: boolean\n readonly?: boolean\n error?: boolean\n size?: 'sm' | 'md' | 'lg'\n rows?: number\n resize?: 'none' | 'vertical' | 'horizontal' | 'both'\n maxlength?: number\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n disabled: false,\n readonly: false,\n error: false,\n size: 'md',\n rows: 3,\n resize: 'vertical',\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string]\n focus: [event: FocusEvent]\n blur: [event: FocusEvent]\n}>()\n\nfunction handleInput(event: Event) {\n const target = event.target as HTMLTextAreaElement\n emit('update:modelValue', target.value)\n}\n</script>\n\n<template>\n <textarea\n :value=\"props.modelValue\"\n :placeholder=\"props.placeholder\"\n :disabled=\"props.disabled\"\n :readonly=\"props.readonly\"\n :rows=\"props.rows\"\n :maxlength=\"props.maxlength\"\n :class=\"[\n 'mld-textarea',\n `mld-textarea--${props.size}`,\n `mld-textarea--resize-${props.resize}`,\n props.error ? 'mld-textarea--error' : '',\n props.disabled ? 'mld-textarea--disabled' : '',\n ]\"\n @input=\"handleInput\"\n @focus=\"emit('focus', $event)\"\n @blur=\"emit('blur', $event)\"\n />\n</template>\n\n<style>\n@import '../styles/components/textarea.css';\n</style>\n"],"names":["_createElementBlock","_normalizeClass"],"mappings":";;;;;;;;;;;;;;;;;AAaA,UAAM,QAAQ;AASd,UAAM,OAAO;AAMb,aAAS,YAAY,OAAc;AACjC,YAAM,SAAS,MAAM;AACrB,WAAK,qBAAqB,OAAO,KAAK;AAAA,IACxC;;0BAIEA,mBAiBE,YAAA;AAAA,QAhBC,OAAO,MAAM;AAAA,QACb,aAAa,MAAM;AAAA,QACnB,UAAU,MAAM;AAAA,QAChB,UAAU,MAAM;AAAA,QAChB,MAAM,MAAM;AAAA,QACZ,WAAW,MAAM;AAAA,QACjB,OAAKC,eAAA;AAAA;UAAiD,iBAAA,MAAM,IAAI;AAAA,UAAkC,wBAAA,MAAM,MAAM;AAAA,UAAU,MAAM,QAAK,wBAAA;AAAA,UAAqC,MAAM,WAAQ,2BAAA;AAAA,QAAA;QAOtL,SAAO;AAAA,QACP,SAAK,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAE,KAAI,SAAU,MAAM;AAAA,QAC3B,QAAI,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAE,KAAI,QAAS,MAAM;AAAA,MAAA;;;;"}
1
+ {"version":3,"file":"BaseTextarea.vue.js","sources":["../../src/components/BaseTextarea.vue"],"sourcesContent":["<script setup lang=\"ts\">\ninterface Props {\n modelValue?: string\n placeholder?: string\n disabled?: boolean\n readonly?: boolean\n error?: boolean\n size?: 'sm' | 'md' | 'lg'\n rows?: number\n resize?: 'none' | 'vertical' | 'horizontal' | 'both'\n maxlength?: number\n ariaDescribedby?: string\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n disabled: false,\n readonly: false,\n error: false,\n size: 'md',\n rows: 3,\n resize: 'vertical',\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string]\n focus: [event: FocusEvent]\n blur: [event: FocusEvent]\n}>()\n\nfunction handleInput(event: Event) {\n const target = event.target as HTMLTextAreaElement\n emit('update:modelValue', target.value)\n}\n</script>\n\n<template>\n <textarea\n :value=\"props.modelValue\"\n :placeholder=\"props.placeholder\"\n :disabled=\"props.disabled\"\n :readonly=\"props.readonly\"\n :rows=\"props.rows\"\n :maxlength=\"props.maxlength\"\n :aria-invalid=\"props.error || undefined\"\n :aria-describedby=\"props.ariaDescribedby || undefined\"\n :class=\"[\n 'mld-textarea',\n `mld-textarea--${props.size}`,\n `mld-textarea--resize-${props.resize}`,\n props.error ? 'mld-textarea--error' : '',\n props.disabled ? 'mld-textarea--disabled' : '',\n ]\"\n @input=\"handleInput\"\n @focus=\"emit('focus', $event)\"\n @blur=\"emit('blur', $event)\"\n />\n</template>\n\n<style>\n@import '../styles/components/textarea.css';\n</style>\n"],"names":["_createElementBlock","_normalizeClass"],"mappings":";;;;;;;;;;;;;;;;;;AAcA,UAAM,QAAQ;AASd,UAAM,OAAO;AAMb,aAAS,YAAY,OAAc;AACjC,YAAM,SAAS,MAAM;AACrB,WAAK,qBAAqB,OAAO,KAAK;AAAA,IACxC;;0BAIEA,mBAmBE,YAAA;AAAA,QAlBC,OAAO,MAAM;AAAA,QACb,aAAa,MAAM;AAAA,QACnB,UAAU,MAAM;AAAA,QAChB,UAAU,MAAM;AAAA,QAChB,MAAM,MAAM;AAAA,QACZ,WAAW,MAAM;AAAA,QACjB,gBAAc,MAAM,SAAS;AAAA,QAC7B,oBAAkB,MAAM,mBAAmB;AAAA,QAC3C,OAAKC,eAAA;AAAA;UAAiD,iBAAA,MAAM,IAAI;AAAA,UAAkC,wBAAA,MAAM,MAAM;AAAA,UAAU,MAAM,QAAK,wBAAA;AAAA,UAAqC,MAAM,WAAQ,2BAAA;AAAA,QAAA;QAOtL,SAAO;AAAA,QACP,SAAK,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAE,KAAI,SAAU,MAAM;AAAA,QAC3B,QAAI,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAE,KAAI,QAAS,MAAM;AAAA,MAAA;;;;"}
@@ -0,0 +1,8 @@
1
+ interface Props {
2
+ code: string;
3
+ size?: 'sm' | 'md' | 'lg';
4
+ }
5
+ declare const _default: import('vue').DefineComponent<Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<Props> & Readonly<{}>, {
6
+ size: "sm" | "md" | "lg";
7
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLSpanElement>;
8
+ export default _default;
@@ -0,0 +1,19 @@
1
+ import { defineComponent, openBlock, createElementBlock, normalizeClass, toDisplayString } from "vue";
2
+ const _sfc_main = /* @__PURE__ */ defineComponent({
3
+ __name: "ExperimentCodeBadge",
4
+ props: {
5
+ code: {},
6
+ size: { default: "md" }
7
+ },
8
+ setup(__props) {
9
+ return (_ctx, _cache) => {
10
+ return openBlock(), createElementBlock("span", {
11
+ class: normalizeClass(["mld-exp-code", `mld-exp-code--${__props.size}`])
12
+ }, toDisplayString(__props.code), 3);
13
+ };
14
+ }
15
+ });
16
+ export {
17
+ _sfc_main as default
18
+ };
19
+ //# sourceMappingURL=ExperimentCodeBadge.vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExperimentCodeBadge.vue.js","sources":["../../src/components/ExperimentCodeBadge.vue"],"sourcesContent":["<script setup lang=\"ts\">\ninterface Props {\n code: string\n size?: 'sm' | 'md' | 'lg'\n}\n\nwithDefaults(defineProps<Props>(), {\n size: 'md',\n})\n</script>\n\n<template>\n <span :class=\"['mld-exp-code', `mld-exp-code--${size}`]\">\n {{ code }}\n </span>\n</template>\n\n<style>\n@import '../styles/components/experiment-code-badge.css';\n</style>\n"],"names":["_createElementBlock"],"mappings":";;;;;;;;;0BAYEA,mBAEO,QAAA;AAAA,QAFA,wDAAyC,QAAA,IAAI,EAAA,CAAA;AAAA,MAAA,mBAC/C,QAAA,IAAI,GAAA,CAAA;AAAA;;;"}
@@ -0,0 +1,6 @@
1
+ import _sfc_main from "./ExperimentCodeBadge.vue.js";
2
+ /* empty css */
3
+ export {
4
+ _sfc_main as default
5
+ };
6
+ //# sourceMappingURL=ExperimentCodeBadge.vue3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExperimentCodeBadge.vue3.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
@@ -0,0 +1,29 @@
1
+ import { TreeNode, DataFrameColumn, SummaryData } from '../types';
2
+ interface Props {
3
+ treeData: TreeNode[];
4
+ tableData?: Record<string, unknown>[];
5
+ tableColumns?: DataFrameColumn[] | undefined;
6
+ summaryData?: SummaryData | null;
7
+ defaultView?: 'summary' | 'tree' | 'table';
8
+ title?: string;
9
+ pluginName?: string;
10
+ pluginRoutePrefix?: string;
11
+ experimentId?: number;
12
+ loading?: boolean;
13
+ downloadJsonUrl?: string;
14
+ downloadCsvUrl?: string;
15
+ }
16
+ declare const _default: import('vue').DefineComponent<Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
17
+ "open-plugin": () => any;
18
+ "download-json": () => any;
19
+ "download-csv": () => any;
20
+ }, string, import('vue').PublicProps, Readonly<Props> & Readonly<{
21
+ "onOpen-plugin"?: (() => any) | undefined;
22
+ "onDownload-json"?: (() => any) | undefined;
23
+ "onDownload-csv"?: (() => any) | undefined;
24
+ }>, {
25
+ loading: boolean;
26
+ title: string;
27
+ defaultView: "summary" | "tree" | "table";
28
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
29
+ export default _default;