@morscherlab/mint-sdk 1.5.0-beta.12 → 1.5.0-beta.13
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.
- package/dist/{AppSidebar-C-Vq5x4I.js → AppSidebar-B1g280Wq.js} +3 -2
- package/dist/AppSidebar-B1g280Wq.js.map +1 -0
- package/dist/{SettingsModal-DwfrD1ER.js → SettingsModal-CeaQHyot.js} +2 -2
- package/dist/{SettingsModal-DwfrD1ER.js.map → SettingsModal-CeaQHyot.js.map} +1 -1
- package/dist/composables/pluginWorkspaceModel.d.ts +2 -0
- package/dist/index.js +4 -4
- package/dist/{install-Bk02tJ5M.js → install-rcT3eXD7.js} +5 -5
- package/dist/{install-Bk02tJ5M.js.map → install-rcT3eXD7.js.map} +1 -1
- package/dist/install.js +1 -1
- package/dist/{runtime-aZPUPxoB.js → runtime-7_LcVjuP.js} +68 -60
- package/dist/runtime-7_LcVjuP.js.map +1 -0
- package/dist/runtime.js +2 -2
- package/dist/{shell-Bk9mD4Lc.js → shell-DnCwE5hq.js} +2 -2
- package/dist/{shell-Bk9mD4Lc.js.map → shell-DnCwE5hq.js.map} +1 -1
- package/dist/shell.js +2 -2
- package/dist/styles.css +20 -8
- package/dist/types/components.d.ts +6 -0
- package/package.json +1 -1
- package/src/__tests__/components/PluginWorkspaceView.test.ts +17 -0
- package/src/components/GeneratedPluginView.vue +29 -38
- package/src/components/PluginWorkspaceView.vue +13 -2
- package/src/composables/pluginWorkspaceModel.ts +2 -0
- package/src/composables/usePluginWorkspace.ts +1 -0
- package/src/styles/components/app-layout.css +17 -0
- package/src/types/components.ts +6 -0
- package/dist/AppSidebar-C-Vq5x4I.js.map +0 -1
- package/dist/runtime-aZPUPxoB.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-Bk02tJ5M.js","names":["$slots"],"sources":["../src/components/Calendar.vue","../src/components/Calendar.vue","../src/components/Divider.vue","../src/components/Divider.vue","../src/components/Breadcrumb.vue","../src/components/Breadcrumb.vue","../src/components/FormBuilder.vue","../src/components/FormBuilder.vue","../src/components/index.ts","../src/install.ts"],"sourcesContent":["<script setup lang=\"ts\">\n/** Month calendar for single date, multi-date, or range selection with markers and navigation. */\nimport { ref, computed, watch } from 'vue'\nimport type { CalendarSelectionMode, CalendarMarker, CalendarDayContext } from '../types'\n\n/**\n * Calendar - Month calendar with date selection, range selection, and custom markers.\n *\n * @example\n * ```vue\n * <!-- Single date selection -->\n * <Calendar v-model=\"selectedDate\" />\n *\n * <!-- Range selection -->\n * <Calendar v-model=\"dateRange\" selection-mode=\"range\" />\n *\n * <!-- With markers -->\n * <Calendar :markers=\"[{ date: '2024-01-15', color: '#ff0000', label: 'Event' }]\" />\n * ```\n */\ninterface Props {\n /** Selected date(s) - type depends on selectionMode */\n modelValue?: Date | Date[] | { start: Date; end: Date } | null\n /** Selection behavior mode */\n selectionMode?: CalendarSelectionMode\n /** Display month (0-11) */\n month?: number\n /** Display year */\n year?: number\n /** Always show 6 weeks (42 days) */\n fixedWeeks?: boolean\n /** First day of week (0=Sunday, 1=Monday, etc.) */\n weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6\n /** Show days from adjacent months */\n showOutsideDays?: boolean\n /** Show month navigation buttons */\n showNavigation?: boolean\n /** Visual markers on specific dates */\n markers?: CalendarMarker[]\n /** Earliest selectable date */\n minDate?: Date | string\n /** Latest selectable date */\n maxDate?: Date | string\n /** Explicitly disabled dates */\n disabledDates?: Array<Date | string>\n /** Custom disabled date logic */\n isDateDisabled?: (date: Date) => boolean\n /** Locale for date formatting */\n locale?: string\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n selectionMode: 'single',\n fixedWeeks: true,\n weekStartsOn: 1,\n showOutsideDays: true,\n showNavigation: true,\n markers: () => [],\n disabledDates: () => [],\n locale: 'en-US',\n})\n\n/**\n * @event update:modelValue - Emitted when date selection changes (v-model support)\n * @event update:month - Emitted when displayed month changes\n * @event update:year - Emitted when displayed year changes\n * @event day-click - Emitted when a day is clicked, includes day context\n * @event navigate - Emitted when month navigation occurs\n */\nconst emit = defineEmits<{\n 'update:modelValue': [value: Date | Date[] | { start: Date; end: Date } | null]\n 'update:month': [month: number]\n 'update:year': [year: number]\n 'day-click': [context: CalendarDayContext]\n navigate: [direction: 'prev' | 'next', month: number, year: number]\n}>()\n\nconst today = new Date()\ntoday.setHours(0, 0, 0, 0)\n\nconst currentMonth = ref(props.month ?? today.getMonth())\nconst currentYear = ref(props.year ?? today.getFullYear())\n\n// Range hover tracking\nconst hoveredDate = ref<Date | null>(null)\n\nwatch(() => props.month, (val) => { if (val !== undefined) currentMonth.value = val })\nwatch(() => props.year, (val) => { if (val !== undefined) currentYear.value = val })\n\nconst monthLabel = computed(() => {\n const date = new Date(currentYear.value, currentMonth.value, 1)\n return date.toLocaleDateString(props.locale, { month: 'long', year: 'numeric' })\n})\n\nconst weekDayLabels = computed(() => {\n const labels: string[] = []\n // Use Jan 7, 2024 (Sunday) as reference, then offset by weekStartsOn\n const base = new Date(2024, 0, 7 + props.weekStartsOn)\n for (let i = 0; i < 7; i++) {\n const d = new Date(base)\n d.setDate(d.getDate() + i)\n labels.push(d.toLocaleDateString(props.locale, { weekday: 'short' }))\n }\n return labels\n})\n\nfunction toDateKey(d: Date): string {\n return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`\n}\n\nfunction parseDate(val: Date | string): Date {\n if (val instanceof Date) return val\n const d = new Date(val + 'T00:00:00')\n return d\n}\n\nfunction isSameDay(a: Date, b: Date): boolean {\n return a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n}\n\nconst disabledDateSet = computed(() => {\n const set = new Set<string>()\n for (const d of props.disabledDates) {\n const parsed = parseDate(d)\n set.add(toDateKey(parsed))\n }\n return set\n})\n\nconst markerMap = computed(() => {\n const map = new Map<string, CalendarMarker[]>()\n for (const marker of props.markers) {\n const date = parseDate(marker.date)\n const key = toDateKey(date)\n const markers = map.get(key)\n if (markers) {\n markers.push(marker)\n } else {\n map.set(key, [marker])\n }\n }\n return map\n})\n\nfunction isDateSelected(date: Date): boolean {\n const val = props.modelValue\n if (!val) return false\n if (val instanceof Date) return isSameDay(date, val)\n if (Array.isArray(val)) return val.some(d => isSameDay(date, d))\n if ('start' in val && 'end' in val) {\n return isSameDay(date, val.start) || isSameDay(date, val.end)\n }\n return false\n}\n\nfunction isInRange(date: Date): boolean {\n if (props.selectionMode !== 'range') return false\n const val = props.modelValue\n if (!val || !('start' in (val as object))) return false\n const range = val as { start: Date; end: Date }\n\n const t = date.getTime()\n const start = range.start?.getTime()\n if (!start) return false\n\n // If hovering during selection (before end is set)\n if (!range.end && hoveredDate.value) {\n const hov = hoveredDate.value.getTime()\n const [lo, hi] = start <= hov ? [start, hov] : [hov, start]\n return t > lo && t < hi\n }\n\n // Complete range\n if (range.end) {\n const end = range.end.getTime()\n return t > start && t < end\n }\n\n return false\n}\n\nfunction isDisabled(date: Date): boolean {\n if (disabledDateSet.value.has(toDateKey(date))) return true\n if (props.isDateDisabled?.(date)) return true\n if (props.minDate) {\n const min = parseDate(props.minDate)\n if (date < min) return true\n }\n if (props.maxDate) {\n const max = parseDate(props.maxDate)\n if (date > max) return true\n }\n return false\n}\n\nconst calendarDays = computed<CalendarDayContext[]>(() => {\n const first = new Date(currentYear.value, currentMonth.value, 1)\n const startDow = first.getDay()\n const offset = (startDow - props.weekStartsOn + 7) % 7\n\n const totalCells = props.fixedWeeks ? 42 : (() => {\n const daysInMonth = new Date(currentYear.value, currentMonth.value + 1, 0).getDate()\n const needed = offset + daysInMonth\n return Math.ceil(needed / 7) * 7\n })()\n\n const days: CalendarDayContext[] = []\n for (let i = 0; i < totalCells; i++) {\n const date = new Date(currentYear.value, currentMonth.value, 1 - offset + i)\n date.setHours(0, 0, 0, 0)\n const key = toDateKey(date)\n days.push({\n date,\n dayOfMonth: date.getDate(),\n isToday: isSameDay(date, today),\n isSelected: isDateSelected(date),\n isInRange: isInRange(date),\n isDisabled: isDisabled(date),\n isOutsideMonth: date.getMonth() !== currentMonth.value,\n markers: markerMap.value.get(key) ?? [],\n })\n }\n return days\n})\n\n// Range selection state\nconst rangeStart = ref<Date | null>(null)\n\nfunction handleDayClick(day: CalendarDayContext) {\n if (day.isDisabled) return\n if (!props.showOutsideDays && day.isOutsideMonth) return\n\n emit('day-click', day)\n\n if (props.selectionMode === 'none') return\n\n if (props.selectionMode === 'single') {\n emit('update:modelValue', day.date)\n } else if (props.selectionMode === 'multiple') {\n const current = (props.modelValue as Date[] | undefined) ?? []\n const idx = current.findIndex(d => isSameDay(d, day.date))\n if (idx >= 0) {\n const next = [...current]\n next.splice(idx, 1)\n emit('update:modelValue', next)\n } else {\n emit('update:modelValue', [...current, day.date])\n }\n } else if (props.selectionMode === 'range') {\n if (!rangeStart.value) {\n rangeStart.value = day.date\n } else {\n const start = rangeStart.value\n const end = day.date\n rangeStart.value = null\n const ordered = start.getTime() <= end.getTime()\n ? { start, end }\n : { start: end, end: start }\n emit('update:modelValue', ordered)\n }\n }\n}\n\nfunction handleDayHover(day: CalendarDayContext) {\n if (props.selectionMode === 'range' && rangeStart.value) {\n hoveredDate.value = day.date\n }\n}\n\nfunction prevMonth() {\n if (currentMonth.value === 0) {\n currentMonth.value = 11\n currentYear.value--\n emit('update:year', currentYear.value)\n } else {\n currentMonth.value--\n }\n emit('update:month', currentMonth.value)\n emit('navigate', 'prev', currentMonth.value, currentYear.value)\n}\n\nfunction nextMonth() {\n if (currentMonth.value === 11) {\n currentMonth.value = 0\n currentYear.value++\n emit('update:year', currentYear.value)\n } else {\n currentMonth.value++\n }\n emit('update:month', currentMonth.value)\n emit('navigate', 'next', currentMonth.value, currentYear.value)\n}\n</script>\n\n<template>\n <div class=\"mint-calendar\">\n <div v-if=\"showNavigation\" class=\"mint-calendar__header\">\n <button type=\"button\" class=\"mint-calendar__nav-btn\" aria-label=\"Previous month\" @click=\"prevMonth\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"m15 18-6-6 6-6\" />\n </svg>\n </button>\n <slot name=\"header\" :month=\"currentMonth\" :year=\"currentYear\" :prev-month=\"prevMonth\" :next-month=\"nextMonth\">\n <span class=\"mint-calendar__title\">{{ monthLabel }}</span>\n </slot>\n <button type=\"button\" class=\"mint-calendar__nav-btn\" aria-label=\"Next month\" @click=\"nextMonth\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n </button>\n </div>\n\n <div class=\"mint-calendar__weekdays\">\n <span\n v-for=\"(label, i) in weekDayLabels\"\n :key=\"i\"\n class=\"mint-calendar__weekday\"\n >\n <slot name=\"week-day\" :day-name=\"label\" :index=\"i\">{{ label }}</slot>\n </span>\n </div>\n\n <div class=\"mint-calendar__grid\">\n <button\n v-for=\"(day, i) in calendarDays\"\n :key=\"i\"\n type=\"button\"\n :disabled=\"day.isDisabled\"\n :class=\"[\n 'mint-calendar__day',\n {\n 'mint-calendar__day--today': day.isToday,\n 'mint-calendar__day--selected': day.isSelected,\n 'mint-calendar__day--in-range': day.isInRange,\n 'mint-calendar__day--disabled': day.isDisabled,\n 'mint-calendar__day--outside': day.isOutsideMonth,\n 'mint-calendar__day--interactive': selectionMode !== 'none' && !day.isDisabled,\n },\n ]\"\n @click=\"handleDayClick(day)\"\n @mouseenter=\"handleDayHover(day)\"\n >\n <slot name=\"day-content\" :day=\"day\">\n <span class=\"mint-calendar__day-number\">{{ day.dayOfMonth }}</span>\n <div v-if=\"day.markers.length > 0\" class=\"mint-calendar__markers\">\n <span\n v-for=\"(marker, mi) in day.markers.slice(0, 3)\"\n :key=\"mi\"\n :class=\"[\n 'mint-calendar__marker',\n `mint-calendar__marker--${marker.type ?? 'dot'}`,\n ]\"\n :style=\"marker.color ? { '--marker-color': marker.color } : {}\"\n :title=\"marker.label\"\n />\n </div>\n </slot>\n </button>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** Month calendar for single date, multi-date, or range selection with markers and navigation. */\nimport { ref, computed, watch } from 'vue'\nimport type { CalendarSelectionMode, CalendarMarker, CalendarDayContext } from '../types'\n\n/**\n * Calendar - Month calendar with date selection, range selection, and custom markers.\n *\n * @example\n * ```vue\n * <!-- Single date selection -->\n * <Calendar v-model=\"selectedDate\" />\n *\n * <!-- Range selection -->\n * <Calendar v-model=\"dateRange\" selection-mode=\"range\" />\n *\n * <!-- With markers -->\n * <Calendar :markers=\"[{ date: '2024-01-15', color: '#ff0000', label: 'Event' }]\" />\n * ```\n */\ninterface Props {\n /** Selected date(s) - type depends on selectionMode */\n modelValue?: Date | Date[] | { start: Date; end: Date } | null\n /** Selection behavior mode */\n selectionMode?: CalendarSelectionMode\n /** Display month (0-11) */\n month?: number\n /** Display year */\n year?: number\n /** Always show 6 weeks (42 days) */\n fixedWeeks?: boolean\n /** First day of week (0=Sunday, 1=Monday, etc.) */\n weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6\n /** Show days from adjacent months */\n showOutsideDays?: boolean\n /** Show month navigation buttons */\n showNavigation?: boolean\n /** Visual markers on specific dates */\n markers?: CalendarMarker[]\n /** Earliest selectable date */\n minDate?: Date | string\n /** Latest selectable date */\n maxDate?: Date | string\n /** Explicitly disabled dates */\n disabledDates?: Array<Date | string>\n /** Custom disabled date logic */\n isDateDisabled?: (date: Date) => boolean\n /** Locale for date formatting */\n locale?: string\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n selectionMode: 'single',\n fixedWeeks: true,\n weekStartsOn: 1,\n showOutsideDays: true,\n showNavigation: true,\n markers: () => [],\n disabledDates: () => [],\n locale: 'en-US',\n})\n\n/**\n * @event update:modelValue - Emitted when date selection changes (v-model support)\n * @event update:month - Emitted when displayed month changes\n * @event update:year - Emitted when displayed year changes\n * @event day-click - Emitted when a day is clicked, includes day context\n * @event navigate - Emitted when month navigation occurs\n */\nconst emit = defineEmits<{\n 'update:modelValue': [value: Date | Date[] | { start: Date; end: Date } | null]\n 'update:month': [month: number]\n 'update:year': [year: number]\n 'day-click': [context: CalendarDayContext]\n navigate: [direction: 'prev' | 'next', month: number, year: number]\n}>()\n\nconst today = new Date()\ntoday.setHours(0, 0, 0, 0)\n\nconst currentMonth = ref(props.month ?? today.getMonth())\nconst currentYear = ref(props.year ?? today.getFullYear())\n\n// Range hover tracking\nconst hoveredDate = ref<Date | null>(null)\n\nwatch(() => props.month, (val) => { if (val !== undefined) currentMonth.value = val })\nwatch(() => props.year, (val) => { if (val !== undefined) currentYear.value = val })\n\nconst monthLabel = computed(() => {\n const date = new Date(currentYear.value, currentMonth.value, 1)\n return date.toLocaleDateString(props.locale, { month: 'long', year: 'numeric' })\n})\n\nconst weekDayLabels = computed(() => {\n const labels: string[] = []\n // Use Jan 7, 2024 (Sunday) as reference, then offset by weekStartsOn\n const base = new Date(2024, 0, 7 + props.weekStartsOn)\n for (let i = 0; i < 7; i++) {\n const d = new Date(base)\n d.setDate(d.getDate() + i)\n labels.push(d.toLocaleDateString(props.locale, { weekday: 'short' }))\n }\n return labels\n})\n\nfunction toDateKey(d: Date): string {\n return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`\n}\n\nfunction parseDate(val: Date | string): Date {\n if (val instanceof Date) return val\n const d = new Date(val + 'T00:00:00')\n return d\n}\n\nfunction isSameDay(a: Date, b: Date): boolean {\n return a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n}\n\nconst disabledDateSet = computed(() => {\n const set = new Set<string>()\n for (const d of props.disabledDates) {\n const parsed = parseDate(d)\n set.add(toDateKey(parsed))\n }\n return set\n})\n\nconst markerMap = computed(() => {\n const map = new Map<string, CalendarMarker[]>()\n for (const marker of props.markers) {\n const date = parseDate(marker.date)\n const key = toDateKey(date)\n const markers = map.get(key)\n if (markers) {\n markers.push(marker)\n } else {\n map.set(key, [marker])\n }\n }\n return map\n})\n\nfunction isDateSelected(date: Date): boolean {\n const val = props.modelValue\n if (!val) return false\n if (val instanceof Date) return isSameDay(date, val)\n if (Array.isArray(val)) return val.some(d => isSameDay(date, d))\n if ('start' in val && 'end' in val) {\n return isSameDay(date, val.start) || isSameDay(date, val.end)\n }\n return false\n}\n\nfunction isInRange(date: Date): boolean {\n if (props.selectionMode !== 'range') return false\n const val = props.modelValue\n if (!val || !('start' in (val as object))) return false\n const range = val as { start: Date; end: Date }\n\n const t = date.getTime()\n const start = range.start?.getTime()\n if (!start) return false\n\n // If hovering during selection (before end is set)\n if (!range.end && hoveredDate.value) {\n const hov = hoveredDate.value.getTime()\n const [lo, hi] = start <= hov ? [start, hov] : [hov, start]\n return t > lo && t < hi\n }\n\n // Complete range\n if (range.end) {\n const end = range.end.getTime()\n return t > start && t < end\n }\n\n return false\n}\n\nfunction isDisabled(date: Date): boolean {\n if (disabledDateSet.value.has(toDateKey(date))) return true\n if (props.isDateDisabled?.(date)) return true\n if (props.minDate) {\n const min = parseDate(props.minDate)\n if (date < min) return true\n }\n if (props.maxDate) {\n const max = parseDate(props.maxDate)\n if (date > max) return true\n }\n return false\n}\n\nconst calendarDays = computed<CalendarDayContext[]>(() => {\n const first = new Date(currentYear.value, currentMonth.value, 1)\n const startDow = first.getDay()\n const offset = (startDow - props.weekStartsOn + 7) % 7\n\n const totalCells = props.fixedWeeks ? 42 : (() => {\n const daysInMonth = new Date(currentYear.value, currentMonth.value + 1, 0).getDate()\n const needed = offset + daysInMonth\n return Math.ceil(needed / 7) * 7\n })()\n\n const days: CalendarDayContext[] = []\n for (let i = 0; i < totalCells; i++) {\n const date = new Date(currentYear.value, currentMonth.value, 1 - offset + i)\n date.setHours(0, 0, 0, 0)\n const key = toDateKey(date)\n days.push({\n date,\n dayOfMonth: date.getDate(),\n isToday: isSameDay(date, today),\n isSelected: isDateSelected(date),\n isInRange: isInRange(date),\n isDisabled: isDisabled(date),\n isOutsideMonth: date.getMonth() !== currentMonth.value,\n markers: markerMap.value.get(key) ?? [],\n })\n }\n return days\n})\n\n// Range selection state\nconst rangeStart = ref<Date | null>(null)\n\nfunction handleDayClick(day: CalendarDayContext) {\n if (day.isDisabled) return\n if (!props.showOutsideDays && day.isOutsideMonth) return\n\n emit('day-click', day)\n\n if (props.selectionMode === 'none') return\n\n if (props.selectionMode === 'single') {\n emit('update:modelValue', day.date)\n } else if (props.selectionMode === 'multiple') {\n const current = (props.modelValue as Date[] | undefined) ?? []\n const idx = current.findIndex(d => isSameDay(d, day.date))\n if (idx >= 0) {\n const next = [...current]\n next.splice(idx, 1)\n emit('update:modelValue', next)\n } else {\n emit('update:modelValue', [...current, day.date])\n }\n } else if (props.selectionMode === 'range') {\n if (!rangeStart.value) {\n rangeStart.value = day.date\n } else {\n const start = rangeStart.value\n const end = day.date\n rangeStart.value = null\n const ordered = start.getTime() <= end.getTime()\n ? { start, end }\n : { start: end, end: start }\n emit('update:modelValue', ordered)\n }\n }\n}\n\nfunction handleDayHover(day: CalendarDayContext) {\n if (props.selectionMode === 'range' && rangeStart.value) {\n hoveredDate.value = day.date\n }\n}\n\nfunction prevMonth() {\n if (currentMonth.value === 0) {\n currentMonth.value = 11\n currentYear.value--\n emit('update:year', currentYear.value)\n } else {\n currentMonth.value--\n }\n emit('update:month', currentMonth.value)\n emit('navigate', 'prev', currentMonth.value, currentYear.value)\n}\n\nfunction nextMonth() {\n if (currentMonth.value === 11) {\n currentMonth.value = 0\n currentYear.value++\n emit('update:year', currentYear.value)\n } else {\n currentMonth.value++\n }\n emit('update:month', currentMonth.value)\n emit('navigate', 'next', currentMonth.value, currentYear.value)\n}\n</script>\n\n<template>\n <div class=\"mint-calendar\">\n <div v-if=\"showNavigation\" class=\"mint-calendar__header\">\n <button type=\"button\" class=\"mint-calendar__nav-btn\" aria-label=\"Previous month\" @click=\"prevMonth\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"m15 18-6-6 6-6\" />\n </svg>\n </button>\n <slot name=\"header\" :month=\"currentMonth\" :year=\"currentYear\" :prev-month=\"prevMonth\" :next-month=\"nextMonth\">\n <span class=\"mint-calendar__title\">{{ monthLabel }}</span>\n </slot>\n <button type=\"button\" class=\"mint-calendar__nav-btn\" aria-label=\"Next month\" @click=\"nextMonth\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n </button>\n </div>\n\n <div class=\"mint-calendar__weekdays\">\n <span\n v-for=\"(label, i) in weekDayLabels\"\n :key=\"i\"\n class=\"mint-calendar__weekday\"\n >\n <slot name=\"week-day\" :day-name=\"label\" :index=\"i\">{{ label }}</slot>\n </span>\n </div>\n\n <div class=\"mint-calendar__grid\">\n <button\n v-for=\"(day, i) in calendarDays\"\n :key=\"i\"\n type=\"button\"\n :disabled=\"day.isDisabled\"\n :class=\"[\n 'mint-calendar__day',\n {\n 'mint-calendar__day--today': day.isToday,\n 'mint-calendar__day--selected': day.isSelected,\n 'mint-calendar__day--in-range': day.isInRange,\n 'mint-calendar__day--disabled': day.isDisabled,\n 'mint-calendar__day--outside': day.isOutsideMonth,\n 'mint-calendar__day--interactive': selectionMode !== 'none' && !day.isDisabled,\n },\n ]\"\n @click=\"handleDayClick(day)\"\n @mouseenter=\"handleDayHover(day)\"\n >\n <slot name=\"day-content\" :day=\"day\">\n <span class=\"mint-calendar__day-number\">{{ day.dayOfMonth }}</span>\n <div v-if=\"day.markers.length > 0\" class=\"mint-calendar__markers\">\n <span\n v-for=\"(marker, mi) in day.markers.slice(0, 3)\"\n :key=\"mi\"\n :class=\"[\n 'mint-calendar__marker',\n `mint-calendar__marker--${marker.type ?? 'dot'}`,\n ]\"\n :style=\"marker.color ? { '--marker-color': marker.color } : {}\"\n :title=\"marker.label\"\n />\n </div>\n </slot>\n </button>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** Horizontal or vertical rule with optional inline text label at center or left. */\ninterface Props {\n vertical?: boolean\n label?: string\n align?: 'center' | 'left'\n spacing?: 'sm' | 'md' | 'lg'\n}\n\nwithDefaults(defineProps<Props>(), {\n vertical: false,\n label: undefined,\n align: 'center',\n spacing: 'md',\n})\n</script>\n\n<template>\n <div\n v-if=\"vertical\"\n :class=\"[\n 'mint-divider',\n 'mint-divider--vertical',\n `mint-divider--${spacing}`,\n ]\"\n role=\"separator\"\n aria-orientation=\"vertical\"\n />\n <div\n v-else\n :class=\"[\n 'mint-divider',\n `mint-divider--${spacing}`,\n label ? `mint-divider--labeled mint-divider--${align}` : '',\n ]\"\n role=\"separator\"\n aria-orientation=\"horizontal\"\n >\n <template v-if=\"label\">\n <span v-if=\"align === 'center'\" class=\"mint-divider__line\" />\n <span class=\"mint-divider__label\">{{ label }}</span>\n <span class=\"mint-divider__line\" />\n </template>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** Horizontal or vertical rule with optional inline text label at center or left. */\ninterface Props {\n vertical?: boolean\n label?: string\n align?: 'center' | 'left'\n spacing?: 'sm' | 'md' | 'lg'\n}\n\nwithDefaults(defineProps<Props>(), {\n vertical: false,\n label: undefined,\n align: 'center',\n spacing: 'md',\n})\n</script>\n\n<template>\n <div\n v-if=\"vertical\"\n :class=\"[\n 'mint-divider',\n 'mint-divider--vertical',\n `mint-divider--${spacing}`,\n ]\"\n role=\"separator\"\n aria-orientation=\"vertical\"\n />\n <div\n v-else\n :class=\"[\n 'mint-divider',\n `mint-divider--${spacing}`,\n label ? `mint-divider--labeled mint-divider--${align}` : '',\n ]\"\n role=\"separator\"\n aria-orientation=\"horizontal\"\n >\n <template v-if=\"label\">\n <span v-if=\"align === 'center'\" class=\"mint-divider__line\" />\n <span class=\"mint-divider__label\">{{ label }}</span>\n <span class=\"mint-divider__line\" />\n </template>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** Renders a breadcrumb trail where ancestors are links or emit-based buttons and the last item is the current page. */\nimport { computed, ref, watch } from 'vue'\nimport type { BreadcrumbItem, BreadcrumbItemInput } from '../types'\nimport { normalizeLabelItemInput } from '../utils/items'\n\ninterface Props {\n items: BreadcrumbItemInput[]\n separator?: string\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n separator: '/',\n})\n\nconst emit = defineEmits<{\n navigate: [item: BreadcrumbItem]\n}>()\n\nconst normalizedItems = computed<BreadcrumbItem[]>(() =>\n props.items.map(normalizeLabelItemInput)\n)\n\n/** Trails longer than this collapse their middle into \"…\" (4e). */\nconst MAX_VISIBLE = 4\n\nconst expanded = ref(false)\n\n// A new trail (navigation) starts collapsed again; keyed on labels so a parent\n// re-render with an equal inline array does not collapse it.\nwatch(() => normalizedItems.value.map(item => item.label).join('\\u0000'), () => {\n expanded.value = false\n})\n\n/** Visible segments with their index in the full trail; `null` marks the collapsed \"…\". */\nconst segments = computed<({ item: BreadcrumbItem; index: number } | null)[]>(() => {\n const all = normalizedItems.value.map((item, index) => ({ item, index }))\n if (expanded.value || all.length <= MAX_VISIBLE) return all\n return [all[0], null, ...all.slice(-2)]\n})\n\nconst hiddenCount = computed(() => normalizedItems.value.length - 3)\n\n/** ID-like segments (EXP-042) render mono. */\nfunction isIdLabel(label: string): boolean {\n return /^[A-Z]+-\\d+$/.test(label)\n}\n\nfunction handleClick(item: BreadcrumbItem) {\n if (!item.href) {\n emit('navigate', item)\n }\n}\n</script>\n\n<template>\n <nav class=\"mint-breadcrumb\" aria-label=\"Breadcrumb\">\n <ol class=\"mint-breadcrumb__list\">\n <li\n v-for=\"(segment, position) in segments\"\n :key=\"segment ? segment.index : 'ellipsis'\"\n class=\"mint-breadcrumb__item\"\n >\n <button\n v-if=\"!segment\"\n type=\"button\"\n class=\"mint-breadcrumb__link mint-breadcrumb__ellipsis\"\n :aria-label=\"`Show ${hiddenCount} hidden levels`\"\n :aria-expanded=\"false\"\n @click=\"expanded = true\"\n >\n …\n </button>\n <slot v-else name=\"item\" :item=\"segment.item\" :index=\"segment.index\" :is-last=\"segment.index === normalizedItems.length - 1\">\n <a\n v-if=\"segment.item.href && segment.index !== normalizedItems.length - 1\"\n :href=\"segment.item.href\"\n :class=\"['mint-breadcrumb__link', { 'mint-breadcrumb__segment--id': isIdLabel(segment.item.label) }]\"\n >\n {{ segment.item.label }}\n </a>\n <button\n v-else-if=\"segment.index !== normalizedItems.length - 1\"\n :class=\"['mint-breadcrumb__link', { 'mint-breadcrumb__segment--id': isIdLabel(segment.item.label) }]\"\n @click=\"handleClick(segment.item)\"\n >\n {{ segment.item.label }}\n </button>\n <span\n v-else\n :class=\"['mint-breadcrumb__current', { 'mint-breadcrumb__segment--id': isIdLabel(segment.item.label) }]\"\n aria-current=\"page\"\n >\n {{ segment.item.label }}\n </span>\n </slot>\n <span\n v-if=\"position !== segments.length - 1\"\n class=\"mint-breadcrumb__separator\"\n aria-hidden=\"true\"\n >\n <slot name=\"separator\">\n <svg v-if=\"separator === '/'\" class=\"mint-breadcrumb__chevron\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n <template v-else>{{ separator }}</template>\n </slot>\n </span>\n </li>\n </ol>\n </nav>\n</template>\n","<script setup lang=\"ts\">\n/** Renders a breadcrumb trail where ancestors are links or emit-based buttons and the last item is the current page. */\nimport { computed, ref, watch } from 'vue'\nimport type { BreadcrumbItem, BreadcrumbItemInput } from '../types'\nimport { normalizeLabelItemInput } from '../utils/items'\n\ninterface Props {\n items: BreadcrumbItemInput[]\n separator?: string\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n separator: '/',\n})\n\nconst emit = defineEmits<{\n navigate: [item: BreadcrumbItem]\n}>()\n\nconst normalizedItems = computed<BreadcrumbItem[]>(() =>\n props.items.map(normalizeLabelItemInput)\n)\n\n/** Trails longer than this collapse their middle into \"…\" (4e). */\nconst MAX_VISIBLE = 4\n\nconst expanded = ref(false)\n\n// A new trail (navigation) starts collapsed again; keyed on labels so a parent\n// re-render with an equal inline array does not collapse it.\nwatch(() => normalizedItems.value.map(item => item.label).join('\\u0000'), () => {\n expanded.value = false\n})\n\n/** Visible segments with their index in the full trail; `null` marks the collapsed \"…\". */\nconst segments = computed<({ item: BreadcrumbItem; index: number } | null)[]>(() => {\n const all = normalizedItems.value.map((item, index) => ({ item, index }))\n if (expanded.value || all.length <= MAX_VISIBLE) return all\n return [all[0], null, ...all.slice(-2)]\n})\n\nconst hiddenCount = computed(() => normalizedItems.value.length - 3)\n\n/** ID-like segments (EXP-042) render mono. */\nfunction isIdLabel(label: string): boolean {\n return /^[A-Z]+-\\d+$/.test(label)\n}\n\nfunction handleClick(item: BreadcrumbItem) {\n if (!item.href) {\n emit('navigate', item)\n }\n}\n</script>\n\n<template>\n <nav class=\"mint-breadcrumb\" aria-label=\"Breadcrumb\">\n <ol class=\"mint-breadcrumb__list\">\n <li\n v-for=\"(segment, position) in segments\"\n :key=\"segment ? segment.index : 'ellipsis'\"\n class=\"mint-breadcrumb__item\"\n >\n <button\n v-if=\"!segment\"\n type=\"button\"\n class=\"mint-breadcrumb__link mint-breadcrumb__ellipsis\"\n :aria-label=\"`Show ${hiddenCount} hidden levels`\"\n :aria-expanded=\"false\"\n @click=\"expanded = true\"\n >\n …\n </button>\n <slot v-else name=\"item\" :item=\"segment.item\" :index=\"segment.index\" :is-last=\"segment.index === normalizedItems.length - 1\">\n <a\n v-if=\"segment.item.href && segment.index !== normalizedItems.length - 1\"\n :href=\"segment.item.href\"\n :class=\"['mint-breadcrumb__link', { 'mint-breadcrumb__segment--id': isIdLabel(segment.item.label) }]\"\n >\n {{ segment.item.label }}\n </a>\n <button\n v-else-if=\"segment.index !== normalizedItems.length - 1\"\n :class=\"['mint-breadcrumb__link', { 'mint-breadcrumb__segment--id': isIdLabel(segment.item.label) }]\"\n @click=\"handleClick(segment.item)\"\n >\n {{ segment.item.label }}\n </button>\n <span\n v-else\n :class=\"['mint-breadcrumb__current', { 'mint-breadcrumb__segment--id': isIdLabel(segment.item.label) }]\"\n aria-current=\"page\"\n >\n {{ segment.item.label }}\n </span>\n </slot>\n <span\n v-if=\"position !== segments.length - 1\"\n class=\"mint-breadcrumb__separator\"\n aria-hidden=\"true\"\n >\n <slot name=\"separator\">\n <svg v-if=\"separator === '/'\" class=\"mint-breadcrumb__chevron\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n <template v-else>{{ separator }}</template>\n </slot>\n </span>\n </li>\n </ol>\n </nav>\n</template>\n","<script setup lang=\"ts\">\n/**\n * Generated form for a control model built with `defineControlModel()`.\n *\n * The control model holds the controls, sections, columns, the submit / cancel\n * bar (`actions`) and `enhancements` (dynamic options, validators, a submit\n * handler and field callbacks). Bind the values with `v-model`; the `submit`\n * event carries only the values of the visible fields.\n *\n * Exposes `form`, `validate`, `reset`, `updateSchema`, `goNext`, `goBack`,\n * `goToStep`, and `builder` for imperative control via template refs.\n *\n * Slots:\n * - `field:<name>` — override a single field's input component\n * - `section:<id>` — replace an entire section body\n * - `section:<id>:after` — inject content after a section\n * - `actions` — replace the default action bar when the model sets `actions`\n *\n * @example Recommended\n * ```vue\n * <FormBuilder v-model=\"values\" :spec=\"formModel\" />\n * ```\n */\nimport { computed, ref } from 'vue'\nimport type { FormSchema } from '../types/form-builder'\nimport {\n controlsToFormSchema,\n getControlDefaults,\n type ControlModelBinding,\n} from '../composables/useControlSchema'\nimport FormSchemaInternal from './internal/FormSchemaInternal.vue'\n\ninterface Props {\n /** Control model built with defineControlModel(). Optional: without it the form is empty. */\n spec?: ControlModelBinding\n modelValue?: Record<string, unknown>\n loading?: boolean\n disabled?: boolean\n size?: 'sm' | 'md' | 'lg'\n readonly?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n spec: undefined,\n modelValue: undefined,\n loading: false,\n disabled: false,\n size: undefined,\n readonly: false,\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [data: Record<string, unknown>]\n submit: [data: Record<string, unknown>]\n cancel: []\n}>()\n\nconst schema = computed<FormSchema>(() =>\n props.spec ? controlsToFormSchema(props.spec.controls, props.spec.controlOptions) : { sections: [] },\n)\n\nconst defaults = computed<Record<string, unknown>>(() => ({\n ...(props.spec ? getControlDefaults(props.spec.controls) : {}),\n ...(props.spec?.controlOptions.initialValues ?? {}),\n}))\n\nconst inner = ref<InstanceType<typeof FormSchemaInternal> | null>(null)\n\ndefineExpose({\n get form() { return inner.value?.form },\n get builder() { return inner.value?.builder },\n validate: () => inner.value?.validate(),\n reset: (...args: Parameters<InstanceType<typeof FormSchemaInternal>['reset']>) => inner.value?.reset(...args),\n updateSchema: (...args: Parameters<InstanceType<typeof FormSchemaInternal>['updateSchema']>) => inner.value?.updateSchema(...args),\n goNext: () => inner.value?.goNext(),\n goBack: () => inner.value?.goBack(),\n goToStep: (step: number) => inner.value?.goToStep(step),\n})\n</script>\n\n<template>\n <FormSchemaInternal\n ref=\"inner\"\n :schema=\"schema\"\n :defaults=\"defaults\"\n :model-value=\"modelValue\"\n :enhancements=\"spec?.controlOptions.enhancements\"\n :loading=\"loading\"\n :disabled=\"disabled\"\n :size=\"size\"\n :readonly=\"readonly\"\n @update:model-value=\"emit('update:modelValue', $event)\"\n @submit=\"emit('submit', $event)\"\n @cancel=\"emit('cancel')\"\n >\n <template v-for=\"(_, name) in $slots\" #[name]=\"slotProps\">\n <slot :name=\"name\" v-bind=\"slotProps ?? {}\" />\n </template>\n </FormSchemaInternal>\n</template>\n","<script setup lang=\"ts\">\n/**\n * Generated form for a control model built with `defineControlModel()`.\n *\n * The control model holds the controls, sections, columns, the submit / cancel\n * bar (`actions`) and `enhancements` (dynamic options, validators, a submit\n * handler and field callbacks). Bind the values with `v-model`; the `submit`\n * event carries only the values of the visible fields.\n *\n * Exposes `form`, `validate`, `reset`, `updateSchema`, `goNext`, `goBack`,\n * `goToStep`, and `builder` for imperative control via template refs.\n *\n * Slots:\n * - `field:<name>` — override a single field's input component\n * - `section:<id>` — replace an entire section body\n * - `section:<id>:after` — inject content after a section\n * - `actions` — replace the default action bar when the model sets `actions`\n *\n * @example Recommended\n * ```vue\n * <FormBuilder v-model=\"values\" :spec=\"formModel\" />\n * ```\n */\nimport { computed, ref } from 'vue'\nimport type { FormSchema } from '../types/form-builder'\nimport {\n controlsToFormSchema,\n getControlDefaults,\n type ControlModelBinding,\n} from '../composables/useControlSchema'\nimport FormSchemaInternal from './internal/FormSchemaInternal.vue'\n\ninterface Props {\n /** Control model built with defineControlModel(). Optional: without it the form is empty. */\n spec?: ControlModelBinding\n modelValue?: Record<string, unknown>\n loading?: boolean\n disabled?: boolean\n size?: 'sm' | 'md' | 'lg'\n readonly?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n spec: undefined,\n modelValue: undefined,\n loading: false,\n disabled: false,\n size: undefined,\n readonly: false,\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [data: Record<string, unknown>]\n submit: [data: Record<string, unknown>]\n cancel: []\n}>()\n\nconst schema = computed<FormSchema>(() =>\n props.spec ? controlsToFormSchema(props.spec.controls, props.spec.controlOptions) : { sections: [] },\n)\n\nconst defaults = computed<Record<string, unknown>>(() => ({\n ...(props.spec ? getControlDefaults(props.spec.controls) : {}),\n ...(props.spec?.controlOptions.initialValues ?? {}),\n}))\n\nconst inner = ref<InstanceType<typeof FormSchemaInternal> | null>(null)\n\ndefineExpose({\n get form() { return inner.value?.form },\n get builder() { return inner.value?.builder },\n validate: () => inner.value?.validate(),\n reset: (...args: Parameters<InstanceType<typeof FormSchemaInternal>['reset']>) => inner.value?.reset(...args),\n updateSchema: (...args: Parameters<InstanceType<typeof FormSchemaInternal>['updateSchema']>) => inner.value?.updateSchema(...args),\n goNext: () => inner.value?.goNext(),\n goBack: () => inner.value?.goBack(),\n goToStep: (step: number) => inner.value?.goToStep(step),\n})\n</script>\n\n<template>\n <FormSchemaInternal\n ref=\"inner\"\n :schema=\"schema\"\n :defaults=\"defaults\"\n :model-value=\"modelValue\"\n :enhancements=\"spec?.controlOptions.enhancements\"\n :loading=\"loading\"\n :disabled=\"disabled\"\n :size=\"size\"\n :readonly=\"readonly\"\n @update:model-value=\"emit('update:modelValue', $event)\"\n @submit=\"emit('submit', $event)\"\n @cancel=\"emit('cancel')\"\n >\n <template v-for=\"(_, name) in $slots\" #[name]=\"slotProps\">\n <slot :name=\"name\" v-bind=\"slotProps ?? {}\" />\n </template>\n </FormSchemaInternal>\n</template>\n","// Components exported from the package root. Lab, shell, data and runtime\n// components are exported from their subpath entries (`src/lab.ts`, ...).\n\n// Base components\nexport { default as BaseButton } from './BaseButton.vue'\nexport { default as BaseInput } from './BaseInput.vue'\nexport { default as BaseSelect } from './BaseSelect.vue'\nexport { default as BaseCheckbox } from './BaseCheckbox.vue'\nexport { default as BaseRadioGroup } from './BaseRadioGroup.vue'\nexport { default as BaseSlider } from './BaseSlider.vue'\nexport { default as BaseTabs } from './BaseTabs.vue'\nexport { default as BaseModal } from './BaseModal.vue'\nexport { default as SegmentedControl } from './SegmentedControl.vue'\nexport { default as BasePill } from './BasePill.vue'\nexport { default as Calendar } from './Calendar.vue'\nexport { default as DataFrame } from './DataFrame.vue'\n\n// Form components\nexport { default as FormField } from './FormField.vue'\nexport { default as DatePicker } from './DatePicker.vue'\nexport { default as NumberInput } from './NumberInput.vue'\nexport { default as FileUploader } from './FileUploader.vue'\n\n// Feedback components\nexport { default as AlertBox } from './AlertBox.vue'\nexport { default as AppToastContainer } from './AppToastContainer.vue'\n\n// Action components\nexport { default as ActionMenu } from './ActionMenu.vue'\nexport { default as ThemeToggle } from './ThemeToggle.vue'\n\n// Layout components\nexport { default as CollapsibleCard } from './CollapsibleCard.vue'\nexport { default as PluginWorkspaceView } from './PluginWorkspaceView.vue'\nexport { default as AppContainer } from './AppContainer.vue'\nexport { default as PluginIcon } from './PluginIcon.vue'\n\n// Utility components\nexport { default as Skeleton } from './Skeleton.vue'\nexport { default as LoadingSpinner } from './LoadingSpinner.vue'\nexport { default as Divider } from './Divider.vue'\nexport { default as ProgressBar } from './ProgressBar.vue'\nexport { default as Avatar } from './Avatar.vue'\nexport { default as EmptyState } from './EmptyState.vue'\nexport { default as Breadcrumb } from './Breadcrumb.vue'\nexport { default as Tooltip } from './Tooltip.vue'\nexport { default as ConfirmDialog } from './ConfirmDialog.vue'\nexport { default as SettingsModal } from './SettingsModal.vue'\n\n// Scientific input components\n\n// Form builder components\nexport { default as FormBuilder } from './FormBuilder.vue'\n\n// Scheduling / booking components\nexport { default as SectionCard } from './SectionCard.vue'\n","import * as rootComponents from './components'\nimport * as dataComponents from './data'\nimport * as labComponents from './lab'\nimport * as runtimeComponents from './runtime'\nimport * as shellComponents from './shell'\n\nconst components = {\n ...rootComponents,\n ...labComponents,\n ...shellComponents,\n ...dataComponents,\n ...runtimeComponents,\n}\n\ntype ComponentRegistryApp = {\n component: (name: string, component: any) => unknown\n}\n\nexport interface MINTSdkPlugin {\n install(app: ComponentRegistryApp): void\n}\n\n/**\n * Vue plugin that registers all MINT SDK components globally, including the\n * components of the `lab`, `shell`, `data` and `runtime` subpaths.\n *\n * @example\n * ```typescript\n * import { createApp } from 'vue'\n * import { MINTSdk } from '@morscherlab/mint-sdk'\n * import '@morscherlab/mint-sdk/styles'\n *\n * const app = createApp(App)\n * app.use(MINTSdk)\n * ```\n */\nexport const MINTSdk: MINTSdkPlugin = {\n install(app) {\n for (const [name, component] of Object.entries(components)) {\n // Check if it's a valid Vue component (has setup, render, or template)\n if (\n component &&\n typeof component === 'object' &&\n ('setup' in component || 'render' in component || '__name' in component)\n ) {\n app.component(name, component)\n }\n }\n },\n}\n\nexport default MINTSdk\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"install-rcT3eXD7.js","names":["$slots"],"sources":["../src/components/Calendar.vue","../src/components/Calendar.vue","../src/components/Divider.vue","../src/components/Divider.vue","../src/components/Breadcrumb.vue","../src/components/Breadcrumb.vue","../src/components/FormBuilder.vue","../src/components/FormBuilder.vue","../src/components/index.ts","../src/install.ts"],"sourcesContent":["<script setup lang=\"ts\">\n/** Month calendar for single date, multi-date, or range selection with markers and navigation. */\nimport { ref, computed, watch } from 'vue'\nimport type { CalendarSelectionMode, CalendarMarker, CalendarDayContext } from '../types'\n\n/**\n * Calendar - Month calendar with date selection, range selection, and custom markers.\n *\n * @example\n * ```vue\n * <!-- Single date selection -->\n * <Calendar v-model=\"selectedDate\" />\n *\n * <!-- Range selection -->\n * <Calendar v-model=\"dateRange\" selection-mode=\"range\" />\n *\n * <!-- With markers -->\n * <Calendar :markers=\"[{ date: '2024-01-15', color: '#ff0000', label: 'Event' }]\" />\n * ```\n */\ninterface Props {\n /** Selected date(s) - type depends on selectionMode */\n modelValue?: Date | Date[] | { start: Date; end: Date } | null\n /** Selection behavior mode */\n selectionMode?: CalendarSelectionMode\n /** Display month (0-11) */\n month?: number\n /** Display year */\n year?: number\n /** Always show 6 weeks (42 days) */\n fixedWeeks?: boolean\n /** First day of week (0=Sunday, 1=Monday, etc.) */\n weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6\n /** Show days from adjacent months */\n showOutsideDays?: boolean\n /** Show month navigation buttons */\n showNavigation?: boolean\n /** Visual markers on specific dates */\n markers?: CalendarMarker[]\n /** Earliest selectable date */\n minDate?: Date | string\n /** Latest selectable date */\n maxDate?: Date | string\n /** Explicitly disabled dates */\n disabledDates?: Array<Date | string>\n /** Custom disabled date logic */\n isDateDisabled?: (date: Date) => boolean\n /** Locale for date formatting */\n locale?: string\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n selectionMode: 'single',\n fixedWeeks: true,\n weekStartsOn: 1,\n showOutsideDays: true,\n showNavigation: true,\n markers: () => [],\n disabledDates: () => [],\n locale: 'en-US',\n})\n\n/**\n * @event update:modelValue - Emitted when date selection changes (v-model support)\n * @event update:month - Emitted when displayed month changes\n * @event update:year - Emitted when displayed year changes\n * @event day-click - Emitted when a day is clicked, includes day context\n * @event navigate - Emitted when month navigation occurs\n */\nconst emit = defineEmits<{\n 'update:modelValue': [value: Date | Date[] | { start: Date; end: Date } | null]\n 'update:month': [month: number]\n 'update:year': [year: number]\n 'day-click': [context: CalendarDayContext]\n navigate: [direction: 'prev' | 'next', month: number, year: number]\n}>()\n\nconst today = new Date()\ntoday.setHours(0, 0, 0, 0)\n\nconst currentMonth = ref(props.month ?? today.getMonth())\nconst currentYear = ref(props.year ?? today.getFullYear())\n\n// Range hover tracking\nconst hoveredDate = ref<Date | null>(null)\n\nwatch(() => props.month, (val) => { if (val !== undefined) currentMonth.value = val })\nwatch(() => props.year, (val) => { if (val !== undefined) currentYear.value = val })\n\nconst monthLabel = computed(() => {\n const date = new Date(currentYear.value, currentMonth.value, 1)\n return date.toLocaleDateString(props.locale, { month: 'long', year: 'numeric' })\n})\n\nconst weekDayLabels = computed(() => {\n const labels: string[] = []\n // Use Jan 7, 2024 (Sunday) as reference, then offset by weekStartsOn\n const base = new Date(2024, 0, 7 + props.weekStartsOn)\n for (let i = 0; i < 7; i++) {\n const d = new Date(base)\n d.setDate(d.getDate() + i)\n labels.push(d.toLocaleDateString(props.locale, { weekday: 'short' }))\n }\n return labels\n})\n\nfunction toDateKey(d: Date): string {\n return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`\n}\n\nfunction parseDate(val: Date | string): Date {\n if (val instanceof Date) return val\n const d = new Date(val + 'T00:00:00')\n return d\n}\n\nfunction isSameDay(a: Date, b: Date): boolean {\n return a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n}\n\nconst disabledDateSet = computed(() => {\n const set = new Set<string>()\n for (const d of props.disabledDates) {\n const parsed = parseDate(d)\n set.add(toDateKey(parsed))\n }\n return set\n})\n\nconst markerMap = computed(() => {\n const map = new Map<string, CalendarMarker[]>()\n for (const marker of props.markers) {\n const date = parseDate(marker.date)\n const key = toDateKey(date)\n const markers = map.get(key)\n if (markers) {\n markers.push(marker)\n } else {\n map.set(key, [marker])\n }\n }\n return map\n})\n\nfunction isDateSelected(date: Date): boolean {\n const val = props.modelValue\n if (!val) return false\n if (val instanceof Date) return isSameDay(date, val)\n if (Array.isArray(val)) return val.some(d => isSameDay(date, d))\n if ('start' in val && 'end' in val) {\n return isSameDay(date, val.start) || isSameDay(date, val.end)\n }\n return false\n}\n\nfunction isInRange(date: Date): boolean {\n if (props.selectionMode !== 'range') return false\n const val = props.modelValue\n if (!val || !('start' in (val as object))) return false\n const range = val as { start: Date; end: Date }\n\n const t = date.getTime()\n const start = range.start?.getTime()\n if (!start) return false\n\n // If hovering during selection (before end is set)\n if (!range.end && hoveredDate.value) {\n const hov = hoveredDate.value.getTime()\n const [lo, hi] = start <= hov ? [start, hov] : [hov, start]\n return t > lo && t < hi\n }\n\n // Complete range\n if (range.end) {\n const end = range.end.getTime()\n return t > start && t < end\n }\n\n return false\n}\n\nfunction isDisabled(date: Date): boolean {\n if (disabledDateSet.value.has(toDateKey(date))) return true\n if (props.isDateDisabled?.(date)) return true\n if (props.minDate) {\n const min = parseDate(props.minDate)\n if (date < min) return true\n }\n if (props.maxDate) {\n const max = parseDate(props.maxDate)\n if (date > max) return true\n }\n return false\n}\n\nconst calendarDays = computed<CalendarDayContext[]>(() => {\n const first = new Date(currentYear.value, currentMonth.value, 1)\n const startDow = first.getDay()\n const offset = (startDow - props.weekStartsOn + 7) % 7\n\n const totalCells = props.fixedWeeks ? 42 : (() => {\n const daysInMonth = new Date(currentYear.value, currentMonth.value + 1, 0).getDate()\n const needed = offset + daysInMonth\n return Math.ceil(needed / 7) * 7\n })()\n\n const days: CalendarDayContext[] = []\n for (let i = 0; i < totalCells; i++) {\n const date = new Date(currentYear.value, currentMonth.value, 1 - offset + i)\n date.setHours(0, 0, 0, 0)\n const key = toDateKey(date)\n days.push({\n date,\n dayOfMonth: date.getDate(),\n isToday: isSameDay(date, today),\n isSelected: isDateSelected(date),\n isInRange: isInRange(date),\n isDisabled: isDisabled(date),\n isOutsideMonth: date.getMonth() !== currentMonth.value,\n markers: markerMap.value.get(key) ?? [],\n })\n }\n return days\n})\n\n// Range selection state\nconst rangeStart = ref<Date | null>(null)\n\nfunction handleDayClick(day: CalendarDayContext) {\n if (day.isDisabled) return\n if (!props.showOutsideDays && day.isOutsideMonth) return\n\n emit('day-click', day)\n\n if (props.selectionMode === 'none') return\n\n if (props.selectionMode === 'single') {\n emit('update:modelValue', day.date)\n } else if (props.selectionMode === 'multiple') {\n const current = (props.modelValue as Date[] | undefined) ?? []\n const idx = current.findIndex(d => isSameDay(d, day.date))\n if (idx >= 0) {\n const next = [...current]\n next.splice(idx, 1)\n emit('update:modelValue', next)\n } else {\n emit('update:modelValue', [...current, day.date])\n }\n } else if (props.selectionMode === 'range') {\n if (!rangeStart.value) {\n rangeStart.value = day.date\n } else {\n const start = rangeStart.value\n const end = day.date\n rangeStart.value = null\n const ordered = start.getTime() <= end.getTime()\n ? { start, end }\n : { start: end, end: start }\n emit('update:modelValue', ordered)\n }\n }\n}\n\nfunction handleDayHover(day: CalendarDayContext) {\n if (props.selectionMode === 'range' && rangeStart.value) {\n hoveredDate.value = day.date\n }\n}\n\nfunction prevMonth() {\n if (currentMonth.value === 0) {\n currentMonth.value = 11\n currentYear.value--\n emit('update:year', currentYear.value)\n } else {\n currentMonth.value--\n }\n emit('update:month', currentMonth.value)\n emit('navigate', 'prev', currentMonth.value, currentYear.value)\n}\n\nfunction nextMonth() {\n if (currentMonth.value === 11) {\n currentMonth.value = 0\n currentYear.value++\n emit('update:year', currentYear.value)\n } else {\n currentMonth.value++\n }\n emit('update:month', currentMonth.value)\n emit('navigate', 'next', currentMonth.value, currentYear.value)\n}\n</script>\n\n<template>\n <div class=\"mint-calendar\">\n <div v-if=\"showNavigation\" class=\"mint-calendar__header\">\n <button type=\"button\" class=\"mint-calendar__nav-btn\" aria-label=\"Previous month\" @click=\"prevMonth\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"m15 18-6-6 6-6\" />\n </svg>\n </button>\n <slot name=\"header\" :month=\"currentMonth\" :year=\"currentYear\" :prev-month=\"prevMonth\" :next-month=\"nextMonth\">\n <span class=\"mint-calendar__title\">{{ monthLabel }}</span>\n </slot>\n <button type=\"button\" class=\"mint-calendar__nav-btn\" aria-label=\"Next month\" @click=\"nextMonth\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n </button>\n </div>\n\n <div class=\"mint-calendar__weekdays\">\n <span\n v-for=\"(label, i) in weekDayLabels\"\n :key=\"i\"\n class=\"mint-calendar__weekday\"\n >\n <slot name=\"week-day\" :day-name=\"label\" :index=\"i\">{{ label }}</slot>\n </span>\n </div>\n\n <div class=\"mint-calendar__grid\">\n <button\n v-for=\"(day, i) in calendarDays\"\n :key=\"i\"\n type=\"button\"\n :disabled=\"day.isDisabled\"\n :class=\"[\n 'mint-calendar__day',\n {\n 'mint-calendar__day--today': day.isToday,\n 'mint-calendar__day--selected': day.isSelected,\n 'mint-calendar__day--in-range': day.isInRange,\n 'mint-calendar__day--disabled': day.isDisabled,\n 'mint-calendar__day--outside': day.isOutsideMonth,\n 'mint-calendar__day--interactive': selectionMode !== 'none' && !day.isDisabled,\n },\n ]\"\n @click=\"handleDayClick(day)\"\n @mouseenter=\"handleDayHover(day)\"\n >\n <slot name=\"day-content\" :day=\"day\">\n <span class=\"mint-calendar__day-number\">{{ day.dayOfMonth }}</span>\n <div v-if=\"day.markers.length > 0\" class=\"mint-calendar__markers\">\n <span\n v-for=\"(marker, mi) in day.markers.slice(0, 3)\"\n :key=\"mi\"\n :class=\"[\n 'mint-calendar__marker',\n `mint-calendar__marker--${marker.type ?? 'dot'}`,\n ]\"\n :style=\"marker.color ? { '--marker-color': marker.color } : {}\"\n :title=\"marker.label\"\n />\n </div>\n </slot>\n </button>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** Month calendar for single date, multi-date, or range selection with markers and navigation. */\nimport { ref, computed, watch } from 'vue'\nimport type { CalendarSelectionMode, CalendarMarker, CalendarDayContext } from '../types'\n\n/**\n * Calendar - Month calendar with date selection, range selection, and custom markers.\n *\n * @example\n * ```vue\n * <!-- Single date selection -->\n * <Calendar v-model=\"selectedDate\" />\n *\n * <!-- Range selection -->\n * <Calendar v-model=\"dateRange\" selection-mode=\"range\" />\n *\n * <!-- With markers -->\n * <Calendar :markers=\"[{ date: '2024-01-15', color: '#ff0000', label: 'Event' }]\" />\n * ```\n */\ninterface Props {\n /** Selected date(s) - type depends on selectionMode */\n modelValue?: Date | Date[] | { start: Date; end: Date } | null\n /** Selection behavior mode */\n selectionMode?: CalendarSelectionMode\n /** Display month (0-11) */\n month?: number\n /** Display year */\n year?: number\n /** Always show 6 weeks (42 days) */\n fixedWeeks?: boolean\n /** First day of week (0=Sunday, 1=Monday, etc.) */\n weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6\n /** Show days from adjacent months */\n showOutsideDays?: boolean\n /** Show month navigation buttons */\n showNavigation?: boolean\n /** Visual markers on specific dates */\n markers?: CalendarMarker[]\n /** Earliest selectable date */\n minDate?: Date | string\n /** Latest selectable date */\n maxDate?: Date | string\n /** Explicitly disabled dates */\n disabledDates?: Array<Date | string>\n /** Custom disabled date logic */\n isDateDisabled?: (date: Date) => boolean\n /** Locale for date formatting */\n locale?: string\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n selectionMode: 'single',\n fixedWeeks: true,\n weekStartsOn: 1,\n showOutsideDays: true,\n showNavigation: true,\n markers: () => [],\n disabledDates: () => [],\n locale: 'en-US',\n})\n\n/**\n * @event update:modelValue - Emitted when date selection changes (v-model support)\n * @event update:month - Emitted when displayed month changes\n * @event update:year - Emitted when displayed year changes\n * @event day-click - Emitted when a day is clicked, includes day context\n * @event navigate - Emitted when month navigation occurs\n */\nconst emit = defineEmits<{\n 'update:modelValue': [value: Date | Date[] | { start: Date; end: Date } | null]\n 'update:month': [month: number]\n 'update:year': [year: number]\n 'day-click': [context: CalendarDayContext]\n navigate: [direction: 'prev' | 'next', month: number, year: number]\n}>()\n\nconst today = new Date()\ntoday.setHours(0, 0, 0, 0)\n\nconst currentMonth = ref(props.month ?? today.getMonth())\nconst currentYear = ref(props.year ?? today.getFullYear())\n\n// Range hover tracking\nconst hoveredDate = ref<Date | null>(null)\n\nwatch(() => props.month, (val) => { if (val !== undefined) currentMonth.value = val })\nwatch(() => props.year, (val) => { if (val !== undefined) currentYear.value = val })\n\nconst monthLabel = computed(() => {\n const date = new Date(currentYear.value, currentMonth.value, 1)\n return date.toLocaleDateString(props.locale, { month: 'long', year: 'numeric' })\n})\n\nconst weekDayLabels = computed(() => {\n const labels: string[] = []\n // Use Jan 7, 2024 (Sunday) as reference, then offset by weekStartsOn\n const base = new Date(2024, 0, 7 + props.weekStartsOn)\n for (let i = 0; i < 7; i++) {\n const d = new Date(base)\n d.setDate(d.getDate() + i)\n labels.push(d.toLocaleDateString(props.locale, { weekday: 'short' }))\n }\n return labels\n})\n\nfunction toDateKey(d: Date): string {\n return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`\n}\n\nfunction parseDate(val: Date | string): Date {\n if (val instanceof Date) return val\n const d = new Date(val + 'T00:00:00')\n return d\n}\n\nfunction isSameDay(a: Date, b: Date): boolean {\n return a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n}\n\nconst disabledDateSet = computed(() => {\n const set = new Set<string>()\n for (const d of props.disabledDates) {\n const parsed = parseDate(d)\n set.add(toDateKey(parsed))\n }\n return set\n})\n\nconst markerMap = computed(() => {\n const map = new Map<string, CalendarMarker[]>()\n for (const marker of props.markers) {\n const date = parseDate(marker.date)\n const key = toDateKey(date)\n const markers = map.get(key)\n if (markers) {\n markers.push(marker)\n } else {\n map.set(key, [marker])\n }\n }\n return map\n})\n\nfunction isDateSelected(date: Date): boolean {\n const val = props.modelValue\n if (!val) return false\n if (val instanceof Date) return isSameDay(date, val)\n if (Array.isArray(val)) return val.some(d => isSameDay(date, d))\n if ('start' in val && 'end' in val) {\n return isSameDay(date, val.start) || isSameDay(date, val.end)\n }\n return false\n}\n\nfunction isInRange(date: Date): boolean {\n if (props.selectionMode !== 'range') return false\n const val = props.modelValue\n if (!val || !('start' in (val as object))) return false\n const range = val as { start: Date; end: Date }\n\n const t = date.getTime()\n const start = range.start?.getTime()\n if (!start) return false\n\n // If hovering during selection (before end is set)\n if (!range.end && hoveredDate.value) {\n const hov = hoveredDate.value.getTime()\n const [lo, hi] = start <= hov ? [start, hov] : [hov, start]\n return t > lo && t < hi\n }\n\n // Complete range\n if (range.end) {\n const end = range.end.getTime()\n return t > start && t < end\n }\n\n return false\n}\n\nfunction isDisabled(date: Date): boolean {\n if (disabledDateSet.value.has(toDateKey(date))) return true\n if (props.isDateDisabled?.(date)) return true\n if (props.minDate) {\n const min = parseDate(props.minDate)\n if (date < min) return true\n }\n if (props.maxDate) {\n const max = parseDate(props.maxDate)\n if (date > max) return true\n }\n return false\n}\n\nconst calendarDays = computed<CalendarDayContext[]>(() => {\n const first = new Date(currentYear.value, currentMonth.value, 1)\n const startDow = first.getDay()\n const offset = (startDow - props.weekStartsOn + 7) % 7\n\n const totalCells = props.fixedWeeks ? 42 : (() => {\n const daysInMonth = new Date(currentYear.value, currentMonth.value + 1, 0).getDate()\n const needed = offset + daysInMonth\n return Math.ceil(needed / 7) * 7\n })()\n\n const days: CalendarDayContext[] = []\n for (let i = 0; i < totalCells; i++) {\n const date = new Date(currentYear.value, currentMonth.value, 1 - offset + i)\n date.setHours(0, 0, 0, 0)\n const key = toDateKey(date)\n days.push({\n date,\n dayOfMonth: date.getDate(),\n isToday: isSameDay(date, today),\n isSelected: isDateSelected(date),\n isInRange: isInRange(date),\n isDisabled: isDisabled(date),\n isOutsideMonth: date.getMonth() !== currentMonth.value,\n markers: markerMap.value.get(key) ?? [],\n })\n }\n return days\n})\n\n// Range selection state\nconst rangeStart = ref<Date | null>(null)\n\nfunction handleDayClick(day: CalendarDayContext) {\n if (day.isDisabled) return\n if (!props.showOutsideDays && day.isOutsideMonth) return\n\n emit('day-click', day)\n\n if (props.selectionMode === 'none') return\n\n if (props.selectionMode === 'single') {\n emit('update:modelValue', day.date)\n } else if (props.selectionMode === 'multiple') {\n const current = (props.modelValue as Date[] | undefined) ?? []\n const idx = current.findIndex(d => isSameDay(d, day.date))\n if (idx >= 0) {\n const next = [...current]\n next.splice(idx, 1)\n emit('update:modelValue', next)\n } else {\n emit('update:modelValue', [...current, day.date])\n }\n } else if (props.selectionMode === 'range') {\n if (!rangeStart.value) {\n rangeStart.value = day.date\n } else {\n const start = rangeStart.value\n const end = day.date\n rangeStart.value = null\n const ordered = start.getTime() <= end.getTime()\n ? { start, end }\n : { start: end, end: start }\n emit('update:modelValue', ordered)\n }\n }\n}\n\nfunction handleDayHover(day: CalendarDayContext) {\n if (props.selectionMode === 'range' && rangeStart.value) {\n hoveredDate.value = day.date\n }\n}\n\nfunction prevMonth() {\n if (currentMonth.value === 0) {\n currentMonth.value = 11\n currentYear.value--\n emit('update:year', currentYear.value)\n } else {\n currentMonth.value--\n }\n emit('update:month', currentMonth.value)\n emit('navigate', 'prev', currentMonth.value, currentYear.value)\n}\n\nfunction nextMonth() {\n if (currentMonth.value === 11) {\n currentMonth.value = 0\n currentYear.value++\n emit('update:year', currentYear.value)\n } else {\n currentMonth.value++\n }\n emit('update:month', currentMonth.value)\n emit('navigate', 'next', currentMonth.value, currentYear.value)\n}\n</script>\n\n<template>\n <div class=\"mint-calendar\">\n <div v-if=\"showNavigation\" class=\"mint-calendar__header\">\n <button type=\"button\" class=\"mint-calendar__nav-btn\" aria-label=\"Previous month\" @click=\"prevMonth\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"m15 18-6-6 6-6\" />\n </svg>\n </button>\n <slot name=\"header\" :month=\"currentMonth\" :year=\"currentYear\" :prev-month=\"prevMonth\" :next-month=\"nextMonth\">\n <span class=\"mint-calendar__title\">{{ monthLabel }}</span>\n </slot>\n <button type=\"button\" class=\"mint-calendar__nav-btn\" aria-label=\"Next month\" @click=\"nextMonth\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n </button>\n </div>\n\n <div class=\"mint-calendar__weekdays\">\n <span\n v-for=\"(label, i) in weekDayLabels\"\n :key=\"i\"\n class=\"mint-calendar__weekday\"\n >\n <slot name=\"week-day\" :day-name=\"label\" :index=\"i\">{{ label }}</slot>\n </span>\n </div>\n\n <div class=\"mint-calendar__grid\">\n <button\n v-for=\"(day, i) in calendarDays\"\n :key=\"i\"\n type=\"button\"\n :disabled=\"day.isDisabled\"\n :class=\"[\n 'mint-calendar__day',\n {\n 'mint-calendar__day--today': day.isToday,\n 'mint-calendar__day--selected': day.isSelected,\n 'mint-calendar__day--in-range': day.isInRange,\n 'mint-calendar__day--disabled': day.isDisabled,\n 'mint-calendar__day--outside': day.isOutsideMonth,\n 'mint-calendar__day--interactive': selectionMode !== 'none' && !day.isDisabled,\n },\n ]\"\n @click=\"handleDayClick(day)\"\n @mouseenter=\"handleDayHover(day)\"\n >\n <slot name=\"day-content\" :day=\"day\">\n <span class=\"mint-calendar__day-number\">{{ day.dayOfMonth }}</span>\n <div v-if=\"day.markers.length > 0\" class=\"mint-calendar__markers\">\n <span\n v-for=\"(marker, mi) in day.markers.slice(0, 3)\"\n :key=\"mi\"\n :class=\"[\n 'mint-calendar__marker',\n `mint-calendar__marker--${marker.type ?? 'dot'}`,\n ]\"\n :style=\"marker.color ? { '--marker-color': marker.color } : {}\"\n :title=\"marker.label\"\n />\n </div>\n </slot>\n </button>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** Horizontal or vertical rule with optional inline text label at center or left. */\ninterface Props {\n vertical?: boolean\n label?: string\n align?: 'center' | 'left'\n spacing?: 'sm' | 'md' | 'lg'\n}\n\nwithDefaults(defineProps<Props>(), {\n vertical: false,\n label: undefined,\n align: 'center',\n spacing: 'md',\n})\n</script>\n\n<template>\n <div\n v-if=\"vertical\"\n :class=\"[\n 'mint-divider',\n 'mint-divider--vertical',\n `mint-divider--${spacing}`,\n ]\"\n role=\"separator\"\n aria-orientation=\"vertical\"\n />\n <div\n v-else\n :class=\"[\n 'mint-divider',\n `mint-divider--${spacing}`,\n label ? `mint-divider--labeled mint-divider--${align}` : '',\n ]\"\n role=\"separator\"\n aria-orientation=\"horizontal\"\n >\n <template v-if=\"label\">\n <span v-if=\"align === 'center'\" class=\"mint-divider__line\" />\n <span class=\"mint-divider__label\">{{ label }}</span>\n <span class=\"mint-divider__line\" />\n </template>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** Horizontal or vertical rule with optional inline text label at center or left. */\ninterface Props {\n vertical?: boolean\n label?: string\n align?: 'center' | 'left'\n spacing?: 'sm' | 'md' | 'lg'\n}\n\nwithDefaults(defineProps<Props>(), {\n vertical: false,\n label: undefined,\n align: 'center',\n spacing: 'md',\n})\n</script>\n\n<template>\n <div\n v-if=\"vertical\"\n :class=\"[\n 'mint-divider',\n 'mint-divider--vertical',\n `mint-divider--${spacing}`,\n ]\"\n role=\"separator\"\n aria-orientation=\"vertical\"\n />\n <div\n v-else\n :class=\"[\n 'mint-divider',\n `mint-divider--${spacing}`,\n label ? `mint-divider--labeled mint-divider--${align}` : '',\n ]\"\n role=\"separator\"\n aria-orientation=\"horizontal\"\n >\n <template v-if=\"label\">\n <span v-if=\"align === 'center'\" class=\"mint-divider__line\" />\n <span class=\"mint-divider__label\">{{ label }}</span>\n <span class=\"mint-divider__line\" />\n </template>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** Renders a breadcrumb trail where ancestors are links or emit-based buttons and the last item is the current page. */\nimport { computed, ref, watch } from 'vue'\nimport type { BreadcrumbItem, BreadcrumbItemInput } from '../types'\nimport { normalizeLabelItemInput } from '../utils/items'\n\ninterface Props {\n items: BreadcrumbItemInput[]\n separator?: string\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n separator: '/',\n})\n\nconst emit = defineEmits<{\n navigate: [item: BreadcrumbItem]\n}>()\n\nconst normalizedItems = computed<BreadcrumbItem[]>(() =>\n props.items.map(normalizeLabelItemInput)\n)\n\n/** Trails longer than this collapse their middle into \"…\" (4e). */\nconst MAX_VISIBLE = 4\n\nconst expanded = ref(false)\n\n// A new trail (navigation) starts collapsed again; keyed on labels so a parent\n// re-render with an equal inline array does not collapse it.\nwatch(() => normalizedItems.value.map(item => item.label).join('\\u0000'), () => {\n expanded.value = false\n})\n\n/** Visible segments with their index in the full trail; `null` marks the collapsed \"…\". */\nconst segments = computed<({ item: BreadcrumbItem; index: number } | null)[]>(() => {\n const all = normalizedItems.value.map((item, index) => ({ item, index }))\n if (expanded.value || all.length <= MAX_VISIBLE) return all\n return [all[0], null, ...all.slice(-2)]\n})\n\nconst hiddenCount = computed(() => normalizedItems.value.length - 3)\n\n/** ID-like segments (EXP-042) render mono. */\nfunction isIdLabel(label: string): boolean {\n return /^[A-Z]+-\\d+$/.test(label)\n}\n\nfunction handleClick(item: BreadcrumbItem) {\n if (!item.href) {\n emit('navigate', item)\n }\n}\n</script>\n\n<template>\n <nav class=\"mint-breadcrumb\" aria-label=\"Breadcrumb\">\n <ol class=\"mint-breadcrumb__list\">\n <li\n v-for=\"(segment, position) in segments\"\n :key=\"segment ? segment.index : 'ellipsis'\"\n class=\"mint-breadcrumb__item\"\n >\n <button\n v-if=\"!segment\"\n type=\"button\"\n class=\"mint-breadcrumb__link mint-breadcrumb__ellipsis\"\n :aria-label=\"`Show ${hiddenCount} hidden levels`\"\n :aria-expanded=\"false\"\n @click=\"expanded = true\"\n >\n …\n </button>\n <slot v-else name=\"item\" :item=\"segment.item\" :index=\"segment.index\" :is-last=\"segment.index === normalizedItems.length - 1\">\n <a\n v-if=\"segment.item.href && segment.index !== normalizedItems.length - 1\"\n :href=\"segment.item.href\"\n :class=\"['mint-breadcrumb__link', { 'mint-breadcrumb__segment--id': isIdLabel(segment.item.label) }]\"\n >\n {{ segment.item.label }}\n </a>\n <button\n v-else-if=\"segment.index !== normalizedItems.length - 1\"\n :class=\"['mint-breadcrumb__link', { 'mint-breadcrumb__segment--id': isIdLabel(segment.item.label) }]\"\n @click=\"handleClick(segment.item)\"\n >\n {{ segment.item.label }}\n </button>\n <span\n v-else\n :class=\"['mint-breadcrumb__current', { 'mint-breadcrumb__segment--id': isIdLabel(segment.item.label) }]\"\n aria-current=\"page\"\n >\n {{ segment.item.label }}\n </span>\n </slot>\n <span\n v-if=\"position !== segments.length - 1\"\n class=\"mint-breadcrumb__separator\"\n aria-hidden=\"true\"\n >\n <slot name=\"separator\">\n <svg v-if=\"separator === '/'\" class=\"mint-breadcrumb__chevron\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n <template v-else>{{ separator }}</template>\n </slot>\n </span>\n </li>\n </ol>\n </nav>\n</template>\n","<script setup lang=\"ts\">\n/** Renders a breadcrumb trail where ancestors are links or emit-based buttons and the last item is the current page. */\nimport { computed, ref, watch } from 'vue'\nimport type { BreadcrumbItem, BreadcrumbItemInput } from '../types'\nimport { normalizeLabelItemInput } from '../utils/items'\n\ninterface Props {\n items: BreadcrumbItemInput[]\n separator?: string\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n separator: '/',\n})\n\nconst emit = defineEmits<{\n navigate: [item: BreadcrumbItem]\n}>()\n\nconst normalizedItems = computed<BreadcrumbItem[]>(() =>\n props.items.map(normalizeLabelItemInput)\n)\n\n/** Trails longer than this collapse their middle into \"…\" (4e). */\nconst MAX_VISIBLE = 4\n\nconst expanded = ref(false)\n\n// A new trail (navigation) starts collapsed again; keyed on labels so a parent\n// re-render with an equal inline array does not collapse it.\nwatch(() => normalizedItems.value.map(item => item.label).join('\\u0000'), () => {\n expanded.value = false\n})\n\n/** Visible segments with their index in the full trail; `null` marks the collapsed \"…\". */\nconst segments = computed<({ item: BreadcrumbItem; index: number } | null)[]>(() => {\n const all = normalizedItems.value.map((item, index) => ({ item, index }))\n if (expanded.value || all.length <= MAX_VISIBLE) return all\n return [all[0], null, ...all.slice(-2)]\n})\n\nconst hiddenCount = computed(() => normalizedItems.value.length - 3)\n\n/** ID-like segments (EXP-042) render mono. */\nfunction isIdLabel(label: string): boolean {\n return /^[A-Z]+-\\d+$/.test(label)\n}\n\nfunction handleClick(item: BreadcrumbItem) {\n if (!item.href) {\n emit('navigate', item)\n }\n}\n</script>\n\n<template>\n <nav class=\"mint-breadcrumb\" aria-label=\"Breadcrumb\">\n <ol class=\"mint-breadcrumb__list\">\n <li\n v-for=\"(segment, position) in segments\"\n :key=\"segment ? segment.index : 'ellipsis'\"\n class=\"mint-breadcrumb__item\"\n >\n <button\n v-if=\"!segment\"\n type=\"button\"\n class=\"mint-breadcrumb__link mint-breadcrumb__ellipsis\"\n :aria-label=\"`Show ${hiddenCount} hidden levels`\"\n :aria-expanded=\"false\"\n @click=\"expanded = true\"\n >\n …\n </button>\n <slot v-else name=\"item\" :item=\"segment.item\" :index=\"segment.index\" :is-last=\"segment.index === normalizedItems.length - 1\">\n <a\n v-if=\"segment.item.href && segment.index !== normalizedItems.length - 1\"\n :href=\"segment.item.href\"\n :class=\"['mint-breadcrumb__link', { 'mint-breadcrumb__segment--id': isIdLabel(segment.item.label) }]\"\n >\n {{ segment.item.label }}\n </a>\n <button\n v-else-if=\"segment.index !== normalizedItems.length - 1\"\n :class=\"['mint-breadcrumb__link', { 'mint-breadcrumb__segment--id': isIdLabel(segment.item.label) }]\"\n @click=\"handleClick(segment.item)\"\n >\n {{ segment.item.label }}\n </button>\n <span\n v-else\n :class=\"['mint-breadcrumb__current', { 'mint-breadcrumb__segment--id': isIdLabel(segment.item.label) }]\"\n aria-current=\"page\"\n >\n {{ segment.item.label }}\n </span>\n </slot>\n <span\n v-if=\"position !== segments.length - 1\"\n class=\"mint-breadcrumb__separator\"\n aria-hidden=\"true\"\n >\n <slot name=\"separator\">\n <svg v-if=\"separator === '/'\" class=\"mint-breadcrumb__chevron\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n <template v-else>{{ separator }}</template>\n </slot>\n </span>\n </li>\n </ol>\n </nav>\n</template>\n","<script setup lang=\"ts\">\n/**\n * Generated form for a control model built with `defineControlModel()`.\n *\n * The control model holds the controls, sections, columns, the submit / cancel\n * bar (`actions`) and `enhancements` (dynamic options, validators, a submit\n * handler and field callbacks). Bind the values with `v-model`; the `submit`\n * event carries only the values of the visible fields.\n *\n * Exposes `form`, `validate`, `reset`, `updateSchema`, `goNext`, `goBack`,\n * `goToStep`, and `builder` for imperative control via template refs.\n *\n * Slots:\n * - `field:<name>` — override a single field's input component\n * - `section:<id>` — replace an entire section body\n * - `section:<id>:after` — inject content after a section\n * - `actions` — replace the default action bar when the model sets `actions`\n *\n * @example Recommended\n * ```vue\n * <FormBuilder v-model=\"values\" :spec=\"formModel\" />\n * ```\n */\nimport { computed, ref } from 'vue'\nimport type { FormSchema } from '../types/form-builder'\nimport {\n controlsToFormSchema,\n getControlDefaults,\n type ControlModelBinding,\n} from '../composables/useControlSchema'\nimport FormSchemaInternal from './internal/FormSchemaInternal.vue'\n\ninterface Props {\n /** Control model built with defineControlModel(). Optional: without it the form is empty. */\n spec?: ControlModelBinding\n modelValue?: Record<string, unknown>\n loading?: boolean\n disabled?: boolean\n size?: 'sm' | 'md' | 'lg'\n readonly?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n spec: undefined,\n modelValue: undefined,\n loading: false,\n disabled: false,\n size: undefined,\n readonly: false,\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [data: Record<string, unknown>]\n submit: [data: Record<string, unknown>]\n cancel: []\n}>()\n\nconst schema = computed<FormSchema>(() =>\n props.spec ? controlsToFormSchema(props.spec.controls, props.spec.controlOptions) : { sections: [] },\n)\n\nconst defaults = computed<Record<string, unknown>>(() => ({\n ...(props.spec ? getControlDefaults(props.spec.controls) : {}),\n ...(props.spec?.controlOptions.initialValues ?? {}),\n}))\n\nconst inner = ref<InstanceType<typeof FormSchemaInternal> | null>(null)\n\ndefineExpose({\n get form() { return inner.value?.form },\n get builder() { return inner.value?.builder },\n validate: () => inner.value?.validate(),\n reset: (...args: Parameters<InstanceType<typeof FormSchemaInternal>['reset']>) => inner.value?.reset(...args),\n updateSchema: (...args: Parameters<InstanceType<typeof FormSchemaInternal>['updateSchema']>) => inner.value?.updateSchema(...args),\n goNext: () => inner.value?.goNext(),\n goBack: () => inner.value?.goBack(),\n goToStep: (step: number) => inner.value?.goToStep(step),\n})\n</script>\n\n<template>\n <FormSchemaInternal\n ref=\"inner\"\n :schema=\"schema\"\n :defaults=\"defaults\"\n :model-value=\"modelValue\"\n :enhancements=\"spec?.controlOptions.enhancements\"\n :loading=\"loading\"\n :disabled=\"disabled\"\n :size=\"size\"\n :readonly=\"readonly\"\n @update:model-value=\"emit('update:modelValue', $event)\"\n @submit=\"emit('submit', $event)\"\n @cancel=\"emit('cancel')\"\n >\n <template v-for=\"(_, name) in $slots\" #[name]=\"slotProps\">\n <slot :name=\"name\" v-bind=\"slotProps ?? {}\" />\n </template>\n </FormSchemaInternal>\n</template>\n","<script setup lang=\"ts\">\n/**\n * Generated form for a control model built with `defineControlModel()`.\n *\n * The control model holds the controls, sections, columns, the submit / cancel\n * bar (`actions`) and `enhancements` (dynamic options, validators, a submit\n * handler and field callbacks). Bind the values with `v-model`; the `submit`\n * event carries only the values of the visible fields.\n *\n * Exposes `form`, `validate`, `reset`, `updateSchema`, `goNext`, `goBack`,\n * `goToStep`, and `builder` for imperative control via template refs.\n *\n * Slots:\n * - `field:<name>` — override a single field's input component\n * - `section:<id>` — replace an entire section body\n * - `section:<id>:after` — inject content after a section\n * - `actions` — replace the default action bar when the model sets `actions`\n *\n * @example Recommended\n * ```vue\n * <FormBuilder v-model=\"values\" :spec=\"formModel\" />\n * ```\n */\nimport { computed, ref } from 'vue'\nimport type { FormSchema } from '../types/form-builder'\nimport {\n controlsToFormSchema,\n getControlDefaults,\n type ControlModelBinding,\n} from '../composables/useControlSchema'\nimport FormSchemaInternal from './internal/FormSchemaInternal.vue'\n\ninterface Props {\n /** Control model built with defineControlModel(). Optional: without it the form is empty. */\n spec?: ControlModelBinding\n modelValue?: Record<string, unknown>\n loading?: boolean\n disabled?: boolean\n size?: 'sm' | 'md' | 'lg'\n readonly?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n spec: undefined,\n modelValue: undefined,\n loading: false,\n disabled: false,\n size: undefined,\n readonly: false,\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [data: Record<string, unknown>]\n submit: [data: Record<string, unknown>]\n cancel: []\n}>()\n\nconst schema = computed<FormSchema>(() =>\n props.spec ? controlsToFormSchema(props.spec.controls, props.spec.controlOptions) : { sections: [] },\n)\n\nconst defaults = computed<Record<string, unknown>>(() => ({\n ...(props.spec ? getControlDefaults(props.spec.controls) : {}),\n ...(props.spec?.controlOptions.initialValues ?? {}),\n}))\n\nconst inner = ref<InstanceType<typeof FormSchemaInternal> | null>(null)\n\ndefineExpose({\n get form() { return inner.value?.form },\n get builder() { return inner.value?.builder },\n validate: () => inner.value?.validate(),\n reset: (...args: Parameters<InstanceType<typeof FormSchemaInternal>['reset']>) => inner.value?.reset(...args),\n updateSchema: (...args: Parameters<InstanceType<typeof FormSchemaInternal>['updateSchema']>) => inner.value?.updateSchema(...args),\n goNext: () => inner.value?.goNext(),\n goBack: () => inner.value?.goBack(),\n goToStep: (step: number) => inner.value?.goToStep(step),\n})\n</script>\n\n<template>\n <FormSchemaInternal\n ref=\"inner\"\n :schema=\"schema\"\n :defaults=\"defaults\"\n :model-value=\"modelValue\"\n :enhancements=\"spec?.controlOptions.enhancements\"\n :loading=\"loading\"\n :disabled=\"disabled\"\n :size=\"size\"\n :readonly=\"readonly\"\n @update:model-value=\"emit('update:modelValue', $event)\"\n @submit=\"emit('submit', $event)\"\n @cancel=\"emit('cancel')\"\n >\n <template v-for=\"(_, name) in $slots\" #[name]=\"slotProps\">\n <slot :name=\"name\" v-bind=\"slotProps ?? {}\" />\n </template>\n </FormSchemaInternal>\n</template>\n","// Components exported from the package root. Lab, shell, data and runtime\n// components are exported from their subpath entries (`src/lab.ts`, ...).\n\n// Base components\nexport { default as BaseButton } from './BaseButton.vue'\nexport { default as BaseInput } from './BaseInput.vue'\nexport { default as BaseSelect } from './BaseSelect.vue'\nexport { default as BaseCheckbox } from './BaseCheckbox.vue'\nexport { default as BaseRadioGroup } from './BaseRadioGroup.vue'\nexport { default as BaseSlider } from './BaseSlider.vue'\nexport { default as BaseTabs } from './BaseTabs.vue'\nexport { default as BaseModal } from './BaseModal.vue'\nexport { default as SegmentedControl } from './SegmentedControl.vue'\nexport { default as BasePill } from './BasePill.vue'\nexport { default as Calendar } from './Calendar.vue'\nexport { default as DataFrame } from './DataFrame.vue'\n\n// Form components\nexport { default as FormField } from './FormField.vue'\nexport { default as DatePicker } from './DatePicker.vue'\nexport { default as NumberInput } from './NumberInput.vue'\nexport { default as FileUploader } from './FileUploader.vue'\n\n// Feedback components\nexport { default as AlertBox } from './AlertBox.vue'\nexport { default as AppToastContainer } from './AppToastContainer.vue'\n\n// Action components\nexport { default as ActionMenu } from './ActionMenu.vue'\nexport { default as ThemeToggle } from './ThemeToggle.vue'\n\n// Layout components\nexport { default as CollapsibleCard } from './CollapsibleCard.vue'\nexport { default as PluginWorkspaceView } from './PluginWorkspaceView.vue'\nexport { default as AppContainer } from './AppContainer.vue'\nexport { default as PluginIcon } from './PluginIcon.vue'\n\n// Utility components\nexport { default as Skeleton } from './Skeleton.vue'\nexport { default as LoadingSpinner } from './LoadingSpinner.vue'\nexport { default as Divider } from './Divider.vue'\nexport { default as ProgressBar } from './ProgressBar.vue'\nexport { default as Avatar } from './Avatar.vue'\nexport { default as EmptyState } from './EmptyState.vue'\nexport { default as Breadcrumb } from './Breadcrumb.vue'\nexport { default as Tooltip } from './Tooltip.vue'\nexport { default as ConfirmDialog } from './ConfirmDialog.vue'\nexport { default as SettingsModal } from './SettingsModal.vue'\n\n// Scientific input components\n\n// Form builder components\nexport { default as FormBuilder } from './FormBuilder.vue'\n\n// Scheduling / booking components\nexport { default as SectionCard } from './SectionCard.vue'\n","import * as rootComponents from './components'\nimport * as dataComponents from './data'\nimport * as labComponents from './lab'\nimport * as runtimeComponents from './runtime'\nimport * as shellComponents from './shell'\n\nconst components = {\n ...rootComponents,\n ...labComponents,\n ...shellComponents,\n ...dataComponents,\n ...runtimeComponents,\n}\n\ntype ComponentRegistryApp = {\n component: (name: string, component: any) => unknown\n}\n\nexport interface MINTSdkPlugin {\n install(app: ComponentRegistryApp): void\n}\n\n/**\n * Vue plugin that registers all MINT SDK components globally, including the\n * components of the `lab`, `shell`, `data` and `runtime` subpaths.\n *\n * @example\n * ```typescript\n * import { createApp } from 'vue'\n * import { MINTSdk } from '@morscherlab/mint-sdk'\n * import '@morscherlab/mint-sdk/styles'\n *\n * const app = createApp(App)\n * app.use(MINTSdk)\n * ```\n */\nexport const MINTSdk: MINTSdkPlugin = {\n install(app) {\n for (const [name, component] of Object.entries(components)) {\n // Check if it's a valid Vue component (has setup, render, or template)\n if (\n component &&\n typeof component === 'object' &&\n ('setup' in component || 'render' in component || '__name' in component)\n ) {\n app.component(name, component)\n }\n }\n },\n}\n\nexport default MINTSdk\n"],"mappings":"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"}
|
package/dist/install.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as MINTSdk } from "./install-
|
|
1
|
+
import { t as MINTSdk } from "./install-rcT3eXD7.js";
|
|
2
2
|
export { MINTSdk, MINTSdk as default };
|
|
@@ -4,7 +4,7 @@ import { R as EmptyState_default, d as isActiveJobStatus, f as isTerminalJobStat
|
|
|
4
4
|
import { A as useJobsEndpoint, D as _plugin_vue_export_helper_default, E as GeneratedPathInput_default, M as usePlatform, O as GENERATED_JOBS_API_KEY, R as definePluginWorkspaceView, _ as getTypeDefault, g as getFieldRegistryEntry, h as replaceRecord, k as createGeneratedAnalysisTransport } from "./useListReorder-Bp4EAI2w.js";
|
|
5
5
|
import { r as LoadingSpinner_default, t as AlertBox_default } from "./AlertBox-Cai0w7gF.js";
|
|
6
6
|
import { D as SectionCard_default, O as DataFrame_default, T as WellPlate_default, a as GeneratedPlotlyResult_default, b as PlateEditor_default, c as downloadEndpoint, d as useEventStream, f as useSettingsEndpoint, i as GeneratedResultRenderer_default, l as pluginFormDataFromPayload, m as resolvePluginBaseUrl, n as ScheduleCalendar_default, o as createClient, p as buildEndpointUrl, t as useRackEditor, u as uploadEndpoint, v as DoseCalculator_default } from "./useRackEditor-i2bdPUFf.js";
|
|
7
|
-
import { A as controlValuesToComponentBindings, C as warnDeprecatedOnce, D as getControlDefaults, E as defineControls, I as getDefaultControlView, M as controlValuesToComponentProps, N as controlsTo, O as useControlSchema, S as AppLayout_default, T as defineControlComponentBindings, d as useForm, f as AppTopBar_default, j as controlValuesToComponentBindingsById, k as controlBindings, l as useFormBuilder, p as providePluginIdentity, t as AppSidebar_default, u as evaluateCondition, w as usePluginWorkspace } from "./AppSidebar-
|
|
7
|
+
import { A as controlValuesToComponentBindings, C as warnDeprecatedOnce, D as getControlDefaults, E as defineControls, I as getDefaultControlView, M as controlValuesToComponentProps, N as controlsTo, O as useControlSchema, S as AppLayout_default, T as defineControlComponentBindings, d as useForm, f as AppTopBar_default, j as controlValuesToComponentBindingsById, k as controlBindings, l as useFormBuilder, p as providePluginIdentity, t as AppSidebar_default, u as evaluateCondition, w as usePluginWorkspace } from "./AppSidebar-B1g280Wq.js";
|
|
8
8
|
import { n as isControlModelBinding } from "./controlSchemaModel-BtFNZj8t.js";
|
|
9
9
|
import { i as JobsStatusTray_default, n as subscribeRealtime, r as useRealtime, t as currentPresence } from "./useRealtime-BLQEjbuq.js";
|
|
10
10
|
import { Fragment, Teleport, TransitionGroup, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createSlots, createTextVNode, createVNode, defineComponent, getCurrentScope, guardReactiveProps, mergeProps, normalizeClass, normalizeProps, normalizeStyle, onMounted, onScopeDispose, onUnmounted, openBlock, provide, reactive, readonly, ref, renderList, renderSlot, resolveDynamicComponent, shallowRef, toDisplayString, toHandlers, toValue, unref, useId, useSlots, useTemplateRef, watch, withCtx, withModifiers } from "vue";
|
|
@@ -721,6 +721,30 @@ function useControlWorkspace(controlsOrModel, options = {}) {
|
|
|
721
721
|
};
|
|
722
722
|
}
|
|
723
723
|
//#endregion
|
|
724
|
+
//#region src/components/AppContainer.vue
|
|
725
|
+
var AppContainer_default = /* @__PURE__ */ defineComponent({
|
|
726
|
+
__name: "AppContainer",
|
|
727
|
+
props: {
|
|
728
|
+
scrollable: {
|
|
729
|
+
type: Boolean,
|
|
730
|
+
default: false
|
|
731
|
+
},
|
|
732
|
+
direction: {},
|
|
733
|
+
gap: { default: "1rem" }
|
|
734
|
+
},
|
|
735
|
+
setup(__props) {
|
|
736
|
+
/** Content card with optional scroll lock, or a transparent flex layout shell with configurable direction and gap. */
|
|
737
|
+
const props = __props;
|
|
738
|
+
const isLayout = computed(() => !!props.direction);
|
|
739
|
+
return (_ctx, _cache) => {
|
|
740
|
+
return openBlock(), createElementBlock("div", {
|
|
741
|
+
class: normalizeClass(["mint-container", isLayout.value ? ["mint-container--layout", __props.direction === "row" ? "mint-container--row" : "mint-container--column"] : ["mint-container--card", __props.scrollable ? "mint-container--scrollable" : ""]]),
|
|
742
|
+
style: normalizeStyle(isLayout.value ? { gap: __props.gap } : void 0)
|
|
743
|
+
}, [renderSlot(_ctx.$slots, "default")], 6);
|
|
744
|
+
};
|
|
745
|
+
}
|
|
746
|
+
});
|
|
747
|
+
//#endregion
|
|
724
748
|
//#region src/components/internal/WorkspaceControlsInternal.vue
|
|
725
749
|
var WorkspaceControlsInternal_default = /* @__PURE__ */ defineComponent({
|
|
726
750
|
__name: "WorkspaceControlsInternal",
|
|
@@ -922,7 +946,9 @@ var PluginWorkspaceView_default = /* @__PURE__ */ defineComponent({
|
|
|
922
946
|
* top bar, sidebar (a `defineControlModel()` result generates its sections),
|
|
923
947
|
* the experiment chip and its save action. The active pill, view, sidebar
|
|
924
948
|
* values and collapse state are `v-model`s. It renders the toast container
|
|
925
|
-
* unless `spec.toasts` is false.
|
|
949
|
+
* unless `spec.toasts` is false. The default slot sits in one scrolling main
|
|
950
|
+
* card that stacks its children (`spec.main`, default `'card'` when floating);
|
|
951
|
+
* views put `SectionCard`s straight into the slot.
|
|
926
952
|
*
|
|
927
953
|
* @example Recommended
|
|
928
954
|
* ```vue
|
|
@@ -977,13 +1003,26 @@ var PluginWorkspaceView_default = /* @__PURE__ */ defineComponent({
|
|
|
977
1003
|
onSettingsValuesChange: _cache[3] || (_cache[3] = ($event) => emit("settings-values-change", $event))
|
|
978
1004
|
}, createSlots({
|
|
979
1005
|
default: withCtx(() => [
|
|
980
|
-
|
|
1006
|
+
unref(shell).mainCard ? (openBlock(), createBlock(AppContainer_default, {
|
|
1007
|
+
key: 0,
|
|
1008
|
+
scrollable: "",
|
|
1009
|
+
class: "mint-workspace-main"
|
|
1010
|
+
}, {
|
|
1011
|
+
default: withCtx(() => [createVNode(WorkspaceControlsInternal_default, { controls: unref(controls) }, {
|
|
1012
|
+
default: withCtx((controlsScope) => [renderSlot(_ctx.$slots, "default", normalizeProps(guardReactiveProps(controlsScope)))]),
|
|
1013
|
+
_: 3
|
|
1014
|
+
}, 8, ["controls"])]),
|
|
1015
|
+
_: 3
|
|
1016
|
+
})) : (openBlock(), createBlock(WorkspaceControlsInternal_default, {
|
|
1017
|
+
key: 1,
|
|
1018
|
+
controls: unref(controls)
|
|
1019
|
+
}, {
|
|
981
1020
|
default: withCtx((controlsScope) => [renderSlot(_ctx.$slots, "default", normalizeProps(guardReactiveProps(controlsScope)))]),
|
|
982
1021
|
_: 3
|
|
983
|
-
}, 8, ["controls"]),
|
|
984
|
-
__props.spec.toasts !== false ? (openBlock(), createBlock(AppToastContainer_default, { key:
|
|
1022
|
+
}, 8, ["controls"])),
|
|
1023
|
+
__props.spec.toasts !== false ? (openBlock(), createBlock(AppToastContainer_default, { key: 2 })) : createCommentVNode("", true),
|
|
985
1024
|
unref(jobCenter) ? (openBlock(), createBlock(JobsStatusTray_default, {
|
|
986
|
-
key:
|
|
1025
|
+
key: 3,
|
|
987
1026
|
center: unref(jobCenter),
|
|
988
1027
|
onSelect: handleJobSelect
|
|
989
1028
|
}, null, 8, ["center"])) : createCommentVNode("", true)
|
|
@@ -1035,30 +1074,6 @@ var PluginWorkspaceView_default = /* @__PURE__ */ defineComponent({
|
|
|
1035
1074
|
}
|
|
1036
1075
|
});
|
|
1037
1076
|
//#endregion
|
|
1038
|
-
//#region src/components/AppContainer.vue
|
|
1039
|
-
var AppContainer_default = /* @__PURE__ */ defineComponent({
|
|
1040
|
-
__name: "AppContainer",
|
|
1041
|
-
props: {
|
|
1042
|
-
scrollable: {
|
|
1043
|
-
type: Boolean,
|
|
1044
|
-
default: false
|
|
1045
|
-
},
|
|
1046
|
-
direction: {},
|
|
1047
|
-
gap: { default: "1rem" }
|
|
1048
|
-
},
|
|
1049
|
-
setup(__props) {
|
|
1050
|
-
/** Content card with optional scroll lock, or a transparent flex layout shell with configurable direction and gap. */
|
|
1051
|
-
const props = __props;
|
|
1052
|
-
const isLayout = computed(() => !!props.direction);
|
|
1053
|
-
return (_ctx, _cache) => {
|
|
1054
|
-
return openBlock(), createElementBlock("div", {
|
|
1055
|
-
class: normalizeClass(["mint-container", isLayout.value ? ["mint-container--layout", __props.direction === "row" ? "mint-container--row" : "mint-container--column"] : ["mint-container--card", __props.scrollable ? "mint-container--scrollable" : ""]]),
|
|
1056
|
-
style: normalizeStyle(isLayout.value ? { gap: __props.gap } : void 0)
|
|
1057
|
-
}, [renderSlot(_ctx.$slots, "default")], 6);
|
|
1058
|
-
};
|
|
1059
|
-
}
|
|
1060
|
-
});
|
|
1061
|
-
//#endregion
|
|
1062
1077
|
//#region src/components/Avatar.vue?vue&type=script&setup=true&lang.ts
|
|
1063
1078
|
var _hoisted_1$4 = ["aria-label"];
|
|
1064
1079
|
var _hoisted_2$3 = ["src", "alt"];
|
|
@@ -1380,35 +1395,28 @@ var GeneratedPluginView_default = /*#__PURE__*/ _plugin_vue_export_helper_defaul
|
|
|
1380
1395
|
onFormSubmit: submitJob,
|
|
1381
1396
|
onJobSelect: selectJob
|
|
1382
1397
|
}, {
|
|
1383
|
-
default: withCtx(() => [createVNode(
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
class: "mint-generated-workspace"
|
|
1398
|
+
default: withCtx(() => [unref(generated).isLoading.value ? (openBlock(), createElementBlock("div", _hoisted_1$3, [createVNode(LoadingSpinner_default, { size: "lg" }), _cache[2] || (_cache[2] = createElementVNode("span", null, "Loading analysis workspace", -1))])) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [unref(generated).error.value ? (openBlock(), createBlock(AlertBox_default, {
|
|
1399
|
+
key: 0,
|
|
1400
|
+
tone: "error"
|
|
1387
1401
|
}, {
|
|
1388
|
-
default: withCtx(() => [unref(generated).
|
|
1389
|
-
key: 0,
|
|
1390
|
-
tone: "error"
|
|
1391
|
-
}, {
|
|
1392
|
-
default: withCtx(() => [createTextVNode(toDisplayString(unref(generated).error.value), 1)]),
|
|
1393
|
-
_: 1
|
|
1394
|
-
})) : createCommentVNode("", true), createVNode(SectionCard_default, { title: activeDefinition.value?.title ?? "Result" }, createSlots({
|
|
1395
|
-
default: withCtx(() => [activeDefinition.value?.description ? (openBlock(), createElementBlock("p", _hoisted_3$2, toDisplayString(activeDefinition.value.description), 1)) : createCommentVNode("", true), currentResult.value ? (openBlock(), createBlock(GeneratedResultRenderer_default, {
|
|
1396
|
-
key: 1,
|
|
1397
|
-
result: currentResult.value
|
|
1398
|
-
}, null, 8, ["result"])) : (openBlock(), createBlock(EmptyState_default, {
|
|
1399
|
-
key: 2,
|
|
1400
|
-
title: "No result yet",
|
|
1401
|
-
description: "Set the parameters and run the analysis. Jobs continue independently if you switch tabs.",
|
|
1402
|
-
size: "md"
|
|
1403
|
-
}))]),
|
|
1404
|
-
_: 2
|
|
1405
|
-
}, [activeDefinition.value ? {
|
|
1406
|
-
name: "actions",
|
|
1407
|
-
fn: withCtx(() => [createElementVNode("span", _hoisted_2$2, toDisplayString(resourceSummary(activeDefinition.value)), 1)]),
|
|
1408
|
-
key: "0"
|
|
1409
|
-
} : void 0]), 1032, ["title"])], 64))]),
|
|
1402
|
+
default: withCtx(() => [createTextVNode(toDisplayString(unref(generated).error.value), 1)]),
|
|
1410
1403
|
_: 1
|
|
1411
|
-
})
|
|
1404
|
+
})) : createCommentVNode("", true), createVNode(SectionCard_default, { title: activeDefinition.value?.title ?? "Result" }, createSlots({
|
|
1405
|
+
default: withCtx(() => [activeDefinition.value?.description ? (openBlock(), createElementBlock("p", _hoisted_3$2, toDisplayString(activeDefinition.value.description), 1)) : createCommentVNode("", true), currentResult.value ? (openBlock(), createBlock(GeneratedResultRenderer_default, {
|
|
1406
|
+
key: 1,
|
|
1407
|
+
result: currentResult.value
|
|
1408
|
+
}, null, 8, ["result"])) : (openBlock(), createBlock(EmptyState_default, {
|
|
1409
|
+
key: 2,
|
|
1410
|
+
title: "No result yet",
|
|
1411
|
+
description: "Set the parameters and run the analysis. Jobs continue independently if you switch tabs.",
|
|
1412
|
+
size: "md"
|
|
1413
|
+
}))]),
|
|
1414
|
+
_: 2
|
|
1415
|
+
}, [activeDefinition.value ? {
|
|
1416
|
+
name: "actions",
|
|
1417
|
+
fn: withCtx(() => [createElementVNode("span", _hoisted_2$2, toDisplayString(resourceSummary(activeDefinition.value)), 1)]),
|
|
1418
|
+
key: "0"
|
|
1419
|
+
} : void 0]), 1032, ["title"])], 64))]),
|
|
1412
1420
|
_: 1
|
|
1413
1421
|
}, 8, [
|
|
1414
1422
|
"view",
|
|
@@ -1420,7 +1428,7 @@ var GeneratedPluginView_default = /*#__PURE__*/ _plugin_vue_export_helper_defaul
|
|
|
1420
1428
|
]);
|
|
1421
1429
|
};
|
|
1422
1430
|
}
|
|
1423
|
-
}), [["__scopeId", "data-v-
|
|
1431
|
+
}), [["__scopeId", "data-v-57d6f544"]]);
|
|
1424
1432
|
//#endregion
|
|
1425
1433
|
//#region src/components/internal/PlateEditorBindingInternal.vue
|
|
1426
1434
|
var PlateEditorBindingInternal_default = /* @__PURE__ */ defineComponent({
|
|
@@ -1911,6 +1919,6 @@ var runtime_exports = /* @__PURE__ */ __exportAll({
|
|
|
1911
1919
|
useSettingsEndpoint: () => useSettingsEndpoint
|
|
1912
1920
|
});
|
|
1913
1921
|
//#endregion
|
|
1914
|
-
export { useToast as _, ComponentBindingRenderer_default as a, generatedJobFormSchema as c,
|
|
1922
|
+
export { useToast as _, ComponentBindingRenderer_default as a, generatedJobFormSchema as c, PluginWorkspaceView_default as d, AppContainer_default as f, AppToastContainer_default as g, useJobCenter as h, RuntimeUpdateNotice_default as i, normalizeGeneratedJobInput as l, combinePluginJobSources as m, PresenceAvatars_default as n, GeneratedPluginView_default as o, useControlWorkspace as p, usePresence as r, generatedJobDefaults as s, runtime_exports as t, Avatar_default as u };
|
|
1915
1923
|
|
|
1916
|
-
//# sourceMappingURL=runtime-
|
|
1924
|
+
//# sourceMappingURL=runtime-7_LcVjuP.js.map
|