@morscherlab/mint-sdk 1.4.0-beta.2 → 1.4.0-beta.21
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/README.md +14 -3
- package/dist/{ActionMenu-CScINahU.js → AlertBox-DwgNTEqf.js} +40 -209
- package/dist/AlertBox-DwgNTEqf.js.map +1 -0
- package/dist/{AppSidebar-BmiiPfz9.js → AppSidebar-CZZaxni0.js} +1249 -239
- package/dist/AppSidebar-CZZaxni0.js.map +1 -0
- package/dist/{ConfirmDialog-CJ7hqYUP.js → ConfirmDialog-CjWoxAD1.js} +2 -2
- package/dist/{ConfirmDialog-CJ7hqYUP.js.map → ConfirmDialog-CjWoxAD1.js.map} +1 -1
- package/dist/ExperimentPopover-DujiuQIO.js +337 -0
- package/dist/ExperimentPopover-DujiuQIO.js.map +1 -0
- package/dist/{ExperimentSelectorModal-D-9z7cNx.js → ExperimentSelectorModal-B4j4eUOJ.js} +244 -211
- package/dist/ExperimentSelectorModal-B4j4eUOJ.js.map +1 -0
- package/dist/{SegmentedControl-DERBN-Xd.js → SegmentedControl-DyUPH3I5.js} +2 -2
- package/dist/{SegmentedControl-DERBN-Xd.js.map → SegmentedControl-DyUPH3I5.js.map} +1 -1
- package/dist/{SettingsModal-CSLE31yg.js → SettingsModal-D2MOOtuO.js} +28 -27
- package/dist/SettingsModal-D2MOOtuO.js.map +1 -0
- package/dist/__stories__/experiment-helpers.d.ts +10 -0
- package/dist/__tests__/components/AppTopBarOnboarding.test.d.ts +1 -0
- package/dist/__tests__/components/FloatingPanelsInModal.test.d.ts +1 -0
- package/dist/__tests__/composables/useFloatingPanel.test.d.ts +1 -0
- package/dist/__tests__/composables/useOnboarding.test.d.ts +1 -0
- package/dist/__tests__/styles/paletteTokens.test.d.ts +1 -0
- package/dist/__tests__/styles/v2AuditRules.test.d.ts +1 -0
- package/dist/components/AppSidebar.vue.d.ts +1 -1
- package/dist/components/AppTopBar.vue.d.ts +20 -5
- package/dist/components/ArtifactSaveDialog.vue.d.ts +9 -1
- package/dist/components/AuditTrail.vue.d.ts +1 -1
- package/dist/components/BaseButton.vue.d.ts +4 -2
- package/dist/components/BaseSelect.vue.d.ts +2 -2
- package/dist/components/ChartContainer.vue.d.ts +2 -0
- package/dist/components/DatePicker.vue.d.ts +1 -1
- package/dist/components/ExperimentPopover.vue.d.ts +18 -0
- package/dist/components/ExperimentSelectorModal.vue.d.ts +15 -5
- package/dist/components/FilePicker.vue.d.ts +1 -1
- package/dist/components/FileUploader.vue.d.ts +2 -2
- package/dist/components/JobsStatusTray.vue.d.ts +15 -4
- package/dist/components/PluginIcon.vue.d.ts +2 -2
- package/dist/components/PluginWorkspaceView.props.d.ts +3 -0
- package/dist/components/PluginWorkspaceView.vue.d.ts +3 -0
- package/dist/components/SampleSelector.vue.d.ts +6 -6
- package/dist/components/SequenceProgressBar.vue.d.ts +3 -0
- package/dist/components/SmartGroupFieldRecipe.vue.d.ts +3 -3
- package/dist/components/StepWizard.vue.d.ts +3 -0
- package/dist/components/internal/AppTopBarOnboardingInternal.vue.d.ts +7 -0
- package/dist/components/internal/AppTopBarPageSelectorInternal.vue.d.ts +2 -1
- package/dist/components/internal/AutoGroupModalInternal.vue.d.ts +3 -3
- package/dist/components/internal/DatePickerTimeInternal.vue.d.ts +1 -1
- package/dist/components/internal/OnboardingLayerInternal.vue.d.ts +7 -0
- package/dist/components/internal/ResourcePickerListInternal.vue.d.ts +2 -7
- package/dist/components/internal/SelectMultipleInternal.vue.d.ts +4 -0
- package/dist/components/internal/WorkspaceShellInternal.vue.d.ts +8 -0
- package/dist/composables/createClient.d.ts +2 -0
- package/dist/composables/index.d.ts +1 -0
- package/dist/composables/pluginIdentity.d.ts +24 -0
- package/dist/composables/pluginWorkspaceModel.d.ts +2 -2
- package/dist/composables/useAppExperiment.d.ts +8 -0
- package/dist/composables/useCalendarGrid.d.ts +1 -1
- package/dist/composables/useExperimentSelector.d.ts +6 -2
- package/dist/composables/useFileImport.d.ts +7 -0
- package/dist/composables/useFloatingPanel.d.ts +29 -0
- package/dist/composables/useJobCenter.d.ts +41 -3
- package/dist/composables/useOnboarding.d.ts +119 -0
- package/dist/composables/usePlatform.d.ts +1 -0
- package/dist/{controlSchemaModel-CP5-_nAj.js → controlSchemaModel-Bsg0t5Ab.js} +2 -2
- package/dist/{controlSchemaModel-CP5-_nAj.js.map → controlSchemaModel-Bsg0t5Ab.js.map} +1 -1
- package/dist/{data-C2PwI_dn.js → data-Boeh4uPI.js} +180 -125
- package/dist/data-Boeh4uPI.js.map +1 -0
- package/dist/data.d.ts +1 -1
- package/dist/data.js +9 -9
- package/dist/{experiment-43OJtH7R.js → experiment-DyO54FQB.js} +25 -61
- package/dist/experiment-DyO54FQB.js.map +1 -0
- package/dist/{experimentStatus-BZmU4czV.js → experimentStatus-DCn2QKG7.js} +3 -3
- package/dist/{experimentStatus-BZmU4czV.js.map → experimentStatus-DCn2QKG7.js.map} +1 -1
- package/dist/index.js +20 -20
- package/dist/{install-DAID6c2-.js → install-BEHp7Mo-.js} +15 -14
- package/dist/{install-DAID6c2-.js.map → install-BEHp7Mo-.js.map} +1 -1
- package/dist/install.js +1 -1
- package/dist/{lab-DLwRl_Ql.js → lab-D61eaX6f.js} +136 -148
- package/dist/lab-D61eaX6f.js.map +1 -0
- package/dist/lab.js +4 -3
- package/dist/{records-BzTcxekG.js → records-D4aQXyZu.js} +647 -389
- package/dist/records-D4aQXyZu.js.map +1 -0
- package/dist/{runtime-D6gVat6r.js → runtime-q-R0CNLh.js} +417 -54
- package/dist/runtime-q-R0CNLh.js.map +1 -0
- package/dist/runtime.d.ts +1 -1
- package/dist/runtime.js +7 -7
- package/dist/{shell-5ju97nOS.js → shell-6CGFvUUw.js} +10 -5
- package/dist/{shell-5ju97nOS.js.map → shell-6CGFvUUw.js.map} +1 -1
- package/dist/shell.d.ts +1 -0
- package/dist/shell.js +6 -6
- package/dist/stores/index.d.ts +1 -1
- package/dist/stores/index.js +2 -2
- package/dist/stores/settings.d.ts +4 -12
- package/dist/styles.css +2753 -2101
- package/dist/types/componentWorkflowTypes.d.ts +2 -0
- package/dist/types/components.d.ts +2 -0
- package/dist/types/generated/platformContext.d.ts +1 -0
- package/dist/types/generated-ui.d.ts +4 -0
- package/dist/types/index.d.ts +1 -1
- package/dist/types/jobs.d.ts +9 -0
- package/dist/types/platform.d.ts +1 -1
- package/dist/{BaseModal-DfRIuVoj.js → useDropdownState-uFIz6Yv8.js} +75 -5
- package/dist/useDropdownState-uFIz6Yv8.js.map +1 -0
- package/dist/{useExperimentSamples-CxcnxZ8h.js → useExperimentSamples-QEFoq4tf.js} +48 -6
- package/dist/useExperimentSamples-QEFoq4tf.js.map +1 -0
- package/dist/{useListReorder-CcbEYxX-.js → useListReorder-DsuzwWGS.js} +219 -437
- package/dist/useListReorder-DsuzwWGS.js.map +1 -0
- package/dist/{useRackEditor-BD5NIo5s.js → useRackEditor-KpZ4iJ6o.js} +85 -81
- package/dist/useRackEditor-KpZ4iJ6o.js.map +1 -0
- package/dist/useRealtime-B58Lo-Tm.js +508 -0
- package/dist/useRealtime-B58Lo-Tm.js.map +1 -0
- package/dist/useRequest-BuDmW8Jc.js +215 -0
- package/dist/useRequest-BuDmW8Jc.js.map +1 -0
- package/dist/utils/time.d.ts +7 -0
- package/package.json +3 -2
- package/src/__stories__/experiment-helpers.ts +3 -3
- package/src/__tests__/components/ActionMenu.test.ts +2 -2
- package/src/__tests__/components/AppTopBar.test.ts +257 -3
- package/src/__tests__/components/AppTopBarOnboarding.test.ts +160 -0
- package/src/__tests__/components/AppTopBarPageSelector.test.ts +125 -9
- package/src/__tests__/components/AppTopBarPillNav.test.ts +35 -0
- package/src/__tests__/components/ArtifactSaveDialog.test.ts +78 -0
- package/src/__tests__/components/BaseButton.test.ts +19 -0
- package/src/__tests__/components/BaseModal.test.ts +13 -0
- package/src/__tests__/components/BaseSelect.multiple.test.ts +87 -32
- package/src/__tests__/components/BaseSelect.test.ts +2 -1
- package/src/__tests__/components/BatchProgressList.test.ts +16 -0
- package/src/__tests__/components/CalendarGridPanel.test.ts +2 -2
- package/src/__tests__/components/ChartContainer.test.ts +11 -0
- package/src/__tests__/components/ChemicalFormula.test.ts +6 -3
- package/src/__tests__/components/DatePicker.datetime.test.ts +6 -0
- package/src/__tests__/components/DatePicker.test.ts +21 -0
- package/src/__tests__/components/DatePicker.time.test.ts +2 -2
- package/src/__tests__/components/EmptyState.test.ts +1 -1
- package/src/__tests__/components/ExperimentPopover.test.ts +125 -16
- package/src/__tests__/components/ExperimentSelectorModal.test.ts +153 -14
- package/src/__tests__/components/FloatingPanelsInModal.test.ts +94 -0
- package/src/__tests__/components/GeneratedPluginView.test.ts +23 -2
- package/src/__tests__/components/InstrumentStateBadge.test.ts +4 -4
- package/src/__tests__/components/JobsStatusTray.test.ts +373 -71
- package/src/__tests__/components/PluginWorkspaceView.test.ts +63 -1
- package/src/__tests__/components/ResourcePickerListInternal.test.ts +0 -20
- package/src/__tests__/components/SampleSelector.test.ts +33 -8
- package/src/__tests__/components/SequenceProgressBar.test.ts +12 -0
- package/src/__tests__/components/SettingsModal.test.ts +9 -2
- package/src/__tests__/components/StepWizard.test.ts +11 -0
- package/src/__tests__/components/WellPlate.decoration.test.ts +11 -4
- package/src/__tests__/components/deprecationTags.test.ts +1 -1
- package/src/__tests__/composables/useAppExperiment.test.ts +27 -1
- package/src/__tests__/composables/useCalendarGrid.test.ts +4 -2
- package/src/__tests__/composables/useExperimentSelector.test.ts +111 -0
- package/src/__tests__/composables/useFileImport.test.ts +36 -0
- package/src/__tests__/composables/useFloatingPanel.test.ts +68 -0
- package/src/__tests__/composables/useJobCenter.test.ts +262 -3
- package/src/__tests__/composables/useOnboarding.test.ts +317 -0
- package/src/__tests__/docs/frontendDocsCatalog.test.ts +4 -3
- package/src/__tests__/fixtures/table-import/cells.xlsx +0 -0
- package/src/__tests__/fixtures/table-import/samples.xlsx +0 -0
- package/src/__tests__/stores/settings.test.ts +21 -21
- package/src/__tests__/styles/baseControlsRules.test.ts +6 -2
- package/src/__tests__/styles/controlRefreshRules.test.ts +0 -6
- package/src/__tests__/styles/cssTokens.test.ts +6 -3
- package/src/__tests__/styles/menusShellRefresh.test.ts +22 -12
- package/src/__tests__/styles/paletteTokens.test.ts +44 -0
- package/src/__tests__/styles/v2AuditRules.test.ts +104 -0
- package/src/__tests__/utils/plotlyTemplate.test.ts +4 -4
- package/src/__tests__/utils/time.test.ts +18 -1
- package/src/components/ActionMenu.vue +6 -37
- package/src/components/AdductText.story.vue +7 -0
- package/src/components/AdductText.vue +1 -1
- package/src/components/AlertBox.story.vue +2 -2
- package/src/components/AlertBox.vue +18 -16
- package/src/components/AppSidebar.story.vue +0 -28
- package/src/components/AppTopBar.onboarding.story.vue +69 -0
- package/src/components/AppTopBar.story.vue +105 -15
- package/src/components/AppTopBar.vue +248 -122
- package/src/components/ArtifactSaveDialog.story.vue +23 -0
- package/src/components/ArtifactSaveDialog.vue +102 -12
- package/src/components/AuditTrail.story.vue +2 -1
- package/src/components/AuditTrail.vue +2 -21
- package/src/components/Avatar.vue +10 -14
- package/src/components/BaseButton.vue +16 -2
- package/src/components/BaseModal.vue +2 -1
- package/src/components/BaseSelect.multiple.story.vue +13 -2
- package/src/components/BaseSelect.vue +4 -3
- package/src/components/BatchProgressList.vue +35 -25
- package/src/components/ChartContainer.story.vue +2 -1
- package/src/components/ChartContainer.vue +8 -6
- package/src/components/ConfirmDialog.story.vue +1 -1
- package/src/components/EmptyState.vue +1 -1
- package/src/components/ExperimentPopover.story.vue +165 -53
- package/src/components/ExperimentPopover.vue +169 -187
- package/src/components/ExperimentSelectorModal.story.vue +73 -31
- package/src/components/ExperimentSelectorModal.vue +144 -111
- package/src/components/FormField.story.vue +8 -48
- package/src/components/GeneratedPluginView.vue +11 -10
- package/src/components/GeneratedResultRenderer.vue +3 -4
- package/src/components/InstrumentStateBadge.vue +1 -1
- package/src/components/JobsStatusTray.story.vue +97 -43
- package/src/components/JobsStatusTray.vue +287 -290
- package/src/components/LayoutResizeHandle.story.vue +65 -4
- package/src/components/LoadingSpinner.vue +1 -1
- package/src/components/NumberInput.vue +3 -6
- package/src/components/PluginIcon.story.vue +2 -10
- package/src/components/PluginIcon.vue +2 -2
- package/src/components/PluginWorkspaceView.props.ts +3 -0
- package/src/components/PluginWorkspaceView.story.vue +1 -1
- package/src/components/PluginWorkspaceView.vue +17 -0
- package/src/components/RuntimeUpdateNotice.vue +1 -1
- package/src/components/SampleSelector.story.vue +22 -7
- package/src/components/SampleSelector.vue +34 -37
- package/src/components/SampleSelectorGroupNode.vue +1 -1
- package/src/components/SectionCard.story.vue +35 -2
- package/src/components/SequenceProgressBar.story.vue +9 -0
- package/src/components/SequenceProgressBar.vue +6 -1
- package/src/components/SettingsModal.schema.ts +1 -1
- package/src/components/SettingsModal.vue +9 -14
- package/src/components/SmartGroupFieldRecipe.story.vue +1 -1
- package/src/components/SmartGroupManual.story.vue +1 -1
- package/src/components/StepWizard.story.vue +33 -0
- package/src/components/StepWizard.vue +8 -1
- package/src/components/Tooltip.vue +9 -32
- package/src/components/WellPlate.story.vue +3 -1
- package/src/components/WellPlate.vue +7 -0
- package/src/components/internal/AppTopBarOnboardingInternal.vue +172 -0
- package/src/components/internal/AppTopBarPageSelectorInternal.vue +140 -72
- package/src/components/internal/AppTopBarPillNavInternal.vue +33 -2
- package/src/components/internal/DatePickerDateInternal.vue +23 -85
- package/src/components/internal/DatePickerDateTimeInternal.vue +10 -14
- package/src/components/internal/DatePickerTimeInternal.vue +13 -9
- package/src/components/internal/NumberUnitInputInternal.vue +4 -18
- package/src/components/internal/OnboardingLayerInternal.vue +173 -0
- package/src/components/internal/ResourcePickerListInternal.vue +45 -85
- package/src/components/internal/SelectMultipleInternal.vue +187 -65
- package/src/components/internal/SelectSearchableInternal.vue +8 -4
- package/src/components/internal/WellEditPopupInternal.vue +11 -22
- package/src/components/internal/WorkspaceShellInternal.vue +12 -0
- package/src/composables/createClient.ts +2 -0
- package/src/composables/index.ts +1 -0
- package/src/composables/pluginIdentity.ts +31 -0
- package/src/composables/pluginWorkspaceModel.ts +2 -2
- package/src/composables/useAppExperiment.ts +20 -0
- package/src/composables/useCalendarGrid.ts +4 -3
- package/src/composables/useExperimentSelector.ts +77 -31
- package/src/composables/useFileImport.ts +51 -1
- package/src/composables/useFloatingPanel.ts +107 -0
- package/src/composables/useJobCenter.ts +188 -6
- package/src/composables/useOnboarding.ts +465 -0
- package/src/composables/usePluginWorkspace.ts +1 -1
- package/src/data.ts +1 -0
- package/src/runtime.ts +2 -1
- package/src/shell.ts +17 -0
- package/src/stores/index.ts +0 -2
- package/src/stores/settings.ts +20 -50
- package/src/styles/components/action-menu.css +1 -1
- package/src/styles/components/adduct-text.css +13 -5
- package/src/styles/components/alert-box.css +39 -58
- package/src/styles/components/app-layout.css +10 -6
- package/src/styles/components/app-page-selector.css +121 -44
- package/src/styles/components/app-pill-nav.css +11 -12
- package/src/styles/components/app-sidebar.css +9 -18
- package/src/styles/components/app-top-bar.css +219 -55
- package/src/styles/components/artifact-save-dialog.css +153 -2
- package/src/styles/components/audit-trail.css +16 -19
- package/src/styles/components/avatar.css +6 -4
- package/src/styles/components/batch-progress-list.css +38 -36
- package/src/styles/components/button.css +36 -59
- package/src/styles/components/calendar.css +12 -12
- package/src/styles/components/chart-container.css +34 -23
- package/src/styles/components/checkbox.css +2 -12
- package/src/styles/components/collapsible-card.css +27 -29
- package/src/styles/components/confirm-dialog.css +13 -14
- package/src/styles/components/dataframe.css +13 -5
- package/src/styles/components/date-picker.css +84 -94
- package/src/styles/components/datetime-picker.css +35 -47
- package/src/styles/components/divider.css +20 -20
- package/src/styles/components/dose-calculator.css +3 -3
- package/src/styles/components/empty-state.css +20 -17
- package/src/styles/components/experiment-code-badge.css +2 -0
- package/src/styles/components/experiment-popover.css +174 -329
- package/src/styles/components/experiment-selector-modal.css +88 -56
- package/src/styles/components/file-picker.css +3 -3
- package/src/styles/components/file-uploader.css +38 -49
- package/src/styles/components/form-builder.css +3 -3
- package/src/styles/components/formula-input.css +1 -1
- package/src/styles/components/icon-button.css +18 -24
- package/src/styles/components/input.css +5 -4
- package/src/styles/components/instrument-monitor.css +13 -15
- package/src/styles/components/jobs-status-tray.css +140 -296
- package/src/styles/components/layout-resize-handle.css +59 -16
- package/src/styles/components/modal.css +5 -7
- package/src/styles/components/molecule-input.css +2 -2
- package/src/styles/components/multi-select.css +65 -117
- package/src/styles/components/number-input.css +26 -19
- package/src/styles/components/onboarding.css +368 -0
- package/src/styles/components/pill.css +3 -2
- package/src/styles/components/plate-editor.css +0 -1
- package/src/styles/components/plugin-icon.css +26 -23
- package/src/styles/components/popover.css +2 -2
- package/src/styles/components/presence-avatars.css +1 -1
- package/src/styles/components/progress-bar.css +3 -3
- package/src/styles/components/protocol-step-editor.css +1 -3
- package/src/styles/components/resource-card.css +2 -2
- package/src/styles/components/resource-picker-list.css +6 -57
- package/src/styles/components/sample-hierarchy-tree.css +4 -4
- package/src/styles/components/sample-selector.css +138 -79
- package/src/styles/components/schedule-calendar.css +8 -8
- package/src/styles/components/searchable-select.css +15 -19
- package/src/styles/components/section-card.css +54 -49
- package/src/styles/components/segmented-control.css +18 -15
- package/src/styles/components/select.css +3 -3
- package/src/styles/components/sequence-input.css +2 -2
- package/src/styles/components/sequence-progress-bar.css +17 -8
- package/src/styles/components/settings-modal.css +7 -2
- package/src/styles/components/smart-group.css +18 -18
- package/src/styles/components/step-wizard.css +52 -16
- package/src/styles/components/tabs.css +2 -2
- package/src/styles/components/textarea.css +3 -3
- package/src/styles/components/time-picker.css +37 -25
- package/src/styles/components/toast.css +13 -11
- package/src/styles/components/toggle.css +1 -11
- package/src/styles/components/tooltip.css +12 -11
- package/src/styles/components/unit-input.css +9 -8
- package/src/styles/components/well-edit-popup.css +2 -2
- package/src/styles/components/well-plate.css +9 -2
- package/src/styles/index.css +1 -0
- package/src/styles/variables.css +247 -78
- package/src/types/componentWorkflowTypes.ts +2 -0
- package/src/types/components.ts +2 -0
- package/src/types/generated/platformContext.ts +1 -0
- package/src/types/generated-ui.ts +4 -0
- package/src/types/index.ts +1 -0
- package/src/types/jobs.ts +10 -0
- package/src/types/platform.ts +1 -1
- package/src/utils/time.ts +21 -0
- package/dist/ActionMenu-CScINahU.js.map +0 -1
- package/dist/AppSidebar-BmiiPfz9.js.map +0 -1
- package/dist/BaseModal-DfRIuVoj.js.map +0 -1
- package/dist/ExperimentPopover-C4sGw-is.js +0 -359
- package/dist/ExperimentPopover-C4sGw-is.js.map +0 -1
- package/dist/ExperimentSelectorModal-D-9z7cNx.js.map +0 -1
- package/dist/SettingsModal-CSLE31yg.js.map +0 -1
- package/dist/data-C2PwI_dn.js.map +0 -1
- package/dist/experiment-43OJtH7R.js.map +0 -1
- package/dist/lab-DLwRl_Ql.js.map +0 -1
- package/dist/records-BzTcxekG.js.map +0 -1
- package/dist/runtime-D6gVat6r.js.map +0 -1
- package/dist/useExperimentSamples-CxcnxZ8h.js.map +0 -1
- package/dist/useListReorder-CcbEYxX-.js.map +0 -1
- package/dist/useRackEditor-BD5NIo5s.js.map +0 -1
- package/dist/useRealtime-PalKue84.js +0 -696
- package/dist/useRealtime-PalKue84.js.map +0 -1
- package/dist/useRequest-D5JDfsgZ.js +0 -76
- package/dist/useRequest-D5JDfsgZ.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AppSidebar-CZZaxni0.js","names":["$slots","$attrs","$slots","$slots"],"sources":["../src/composables/useTheme.ts","../src/components/ThemeToggle.vue","../src/components/ThemeToggle.vue","../src/components/CollapsibleCard.vue","../src/components/CollapsibleCard.vue","../src/composables/controlSchemaFormFields.ts","../src/composables/controlSchemaLayout.ts","../src/composables/controlSchemaAdapters.ts","../src/composables/controlComponentBindings.ts","../src/composables/useControlSchema.ts","../src/components/PluginWorkspaceView.controls.ts","../src/components/PluginWorkspaceView.navigation.ts","../src/components/PluginWorkspaceView.shell.ts","../src/composables/usePluginWorkspace.ts","../src/components/AppLayout.vue","../src/components/AppLayout.vue","../src/utils/items.ts","../src/utils/pluginIcon.ts","../src/components/internal/ActionItemInternal.vue","../src/components/internal/ActionItemInternal.vue","../src/components/PluginIcon.vue","../src/components/PluginIcon.vue","../src/components/internal/AppTopBarPageSelectorInternal.vue","../src/components/internal/AppTopBarPageSelectorInternal.vue","../src/components/internal/AppTopBarPillNavInternal.vue","../src/components/internal/AppTopBarPillNavInternal.vue","../src/components/internal/OnboardingLayerInternal.vue","../src/components/internal/OnboardingLayerInternal.vue","../src/components/internal/AppTopBarOnboardingInternal.vue","../src/components/internal/AppTopBarOnboardingInternal.vue","../src/composables/useOnboarding.ts","../src/composables/pluginIdentity.ts","../src/components/AppTopBar.toastOffset.ts","../src/components/AppTopBar.vue","../src/components/AppTopBar.vue","../src/composables/useFormValidation.ts","../src/composables/useForm.ts","../src/composables/formBuilderSchema.ts","../src/composables/useFormBuilder.ts","../src/utils/formModelSync.ts","../src/components/internal/FormFieldRendererInternal.vue","../src/components/internal/FormFieldRendererInternal.vue","../src/components/internal/FormSectionRenderer.vue","../src/components/internal/FormSectionRenderer.vue","../src/components/internal/FormActionsInternal.vue","../src/components/internal/FormActionsInternal.vue","../src/components/internal/FormSchemaInternal.vue","../src/components/internal/FormSchemaInternal.vue","../src/components/AppSidebar.vue","../src/components/AppSidebar.vue"],"sourcesContent":["import { computed, type Ref } from 'vue'\nimport { useSettingsStore } from '../stores/settings'\n\nexport interface UseThemeReturn {\n isDark: Ref<boolean>\n toggleTheme: () => void\n setTheme: (theme: 'light' | 'dark') => void\n}\n\n/** Reads and toggles the active theme (light/dark/system) with reactivity to OS preference changes. */\nexport function useTheme(): UseThemeReturn {\n const settings = useSettingsStore()\n\n // Load persisted theme from localStorage (idempotent — safe to call multiple times)\n settings.initialize()\n\n const isDark = computed(() => settings.isDark())\n\n function toggleTheme() {\n settings.theme = isDark.value ? 'light' : 'dark'\n }\n\n function setTheme(theme: 'light' | 'dark') {\n settings.theme = theme\n }\n\n return {\n isDark,\n toggleTheme,\n setTheme,\n }\n}\n","<script setup lang=\"ts\">\n/** Icon button that toggles between light and dark mode, swapping sun/moon icons to reflect the active theme. */\nimport { Moon, Sun } from 'lucide-vue-next'\nimport { useTheme } from '../composables/useTheme'\nimport BaseButton from './BaseButton.vue'\n\ninterface Props {\n size?: 'sm' | 'md' | 'lg'\n}\n\nwithDefaults(defineProps<Props>(), {\n size: 'md',\n})\n\nconst { isDark, toggleTheme } = useTheme()\n</script>\n\n<template>\n <BaseButton\n class=\"mint-theme-toggle\"\n variant=\"ghost\"\n :size=\"size\"\n :icon=\"isDark ? Sun : Moon\"\n :label=\"isDark ? 'Switch to light mode' : 'Switch to dark mode'\"\n @click=\"toggleTheme\"\n />\n</template>\n","<script setup lang=\"ts\">\n/** Icon button that toggles between light and dark mode, swapping sun/moon icons to reflect the active theme. */\nimport { Moon, Sun } from 'lucide-vue-next'\nimport { useTheme } from '../composables/useTheme'\nimport BaseButton from './BaseButton.vue'\n\ninterface Props {\n size?: 'sm' | 'md' | 'lg'\n}\n\nwithDefaults(defineProps<Props>(), {\n size: 'md',\n})\n\nconst { isDark, toggleTheme } = useTheme()\n</script>\n\n<template>\n <BaseButton\n class=\"mint-theme-toggle\"\n variant=\"ghost\"\n :size=\"size\"\n :icon=\"isDark ? Sun : Moon\"\n :label=\"isDark ? 'Switch to light mode' : 'Switch to dark mode'\"\n @click=\"toggleTheme\"\n />\n</template>\n","<script setup lang=\"ts\">\n/** Card whose body collapses with a chevron-rotate animation, with an optional inline toggle switch independent of expand state. */\nimport { ref, computed } from 'vue'\nimport type { SidebarToolSectionAction, Tone } from '../types'\nimport BaseCheckbox from './BaseCheckbox.vue'\n\ninterface Props {\n title: string\n subtitle?: string\n badge?: string | number\n badgeTone?: Tone\n defaultOpen?: boolean\n disabled?: boolean\n dense?: boolean\n icon?: string | string[]\n iconColor?: string\n iconBg?: string\n actions?: SidebarToolSectionAction[]\n showToggle?: boolean\n toggleValue?: boolean\n toggleColor?: string\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n badge: undefined,\n badgeTone: 'cta',\n defaultOpen: false,\n disabled: false,\n dense: false,\n actions: () => [],\n showToggle: false,\n toggleValue: false,\n toggleColor: '',\n})\n\nconst emit = defineEmits<{\n 'update:toggleValue': [value: boolean]\n action: [actionId: string]\n}>()\n\nconst isOpen = ref(props.defaultOpen)\n\nconst toggle = () => {\n if (!props.disabled) {\n isOpen.value = !isOpen.value\n }\n}\n\nconst headerClasses = computed(() => [\n 'mint-collapsible-card__header',\n props.disabled ? 'mint-collapsible-card__header--disabled' : '',\n])\n\nconst iconBgStyle = computed(() => ({\n backgroundColor: props.iconBg || 'var(--color-primary-soft)',\n}))\n\nconst iconColorStyle = computed(() => ({\n color: props.iconColor || 'var(--color-primary)',\n}))\n\nconst isSvgIcon = computed(() => isSvgIconValue(props.icon))\n\nconst toggleColorStyle = computed(() =>\n props.toggleColor ? { '--_cc-toggle-on': props.toggleColor } : undefined,\n)\n\nconst badgeClasses = computed(() => [\n 'mint-collapsible-card__badge',\n `mint-collapsible-card__badge--${props.badgeTone}`,\n])\n\nfunction isSvgIconValue(icon?: string | string[]): boolean {\n if (!icon) return false\n return Array.isArray(icon) || icon.startsWith('M') || icon.startsWith('m')\n}\n\nfunction actionClasses(action: SidebarToolSectionAction): string[] {\n return [\n 'mint-collapsible-card__action',\n action.tone ? `mint-collapsible-card__action--${action.tone}` : '',\n action.disabled ? 'mint-collapsible-card__action--disabled' : '',\n ]\n}\n\nfunction actionStyle(action: SidebarToolSectionAction): Record<string, string> {\n return action.iconColor ? { color: action.iconColor } : {}\n}\n\nfunction handleActionClick(action: SidebarToolSectionAction) {\n if (props.disabled || action.disabled) return\n emit('action', action.id)\n}\n</script>\n\n<template>\n <div :class=\"['mint-collapsible-card', dense ? 'mint-collapsible-card--dense' : '']\">\n <div class=\"mint-collapsible-card__header-shell\">\n <button\n type=\"button\"\n :class=\"headerClasses\"\n :disabled=\"disabled\"\n :aria-expanded=\"isOpen\"\n @click=\"toggle\"\n >\n <div class=\"mint-collapsible-card__title-section\">\n <!-- Icon badge -->\n <div v-if=\"icon\" class=\"mint-collapsible-card__icon-badge\" :style=\"iconBgStyle\">\n <svg\n v-if=\"isSvgIcon\"\n class=\"mint-collapsible-card__icon\"\n :style=\"iconColorStyle\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <template v-if=\"Array.isArray(icon)\">\n <path v-for=\"(d, i) in icon\" :key=\"i\" :d=\"d\" />\n </template>\n <path v-else :d=\"icon\" />\n </svg>\n <span v-else class=\"mint-collapsible-card__icon-text\" :style=\"iconColorStyle\">{{ icon }}</span>\n </div>\n\n <div class=\"mint-collapsible-card__titles\">\n <h3 class=\"mint-collapsible-card__title\">{{ title }}</h3>\n <p v-if=\"subtitle\" class=\"mint-collapsible-card__subtitle\">{{ subtitle }}</p>\n </div>\n </div>\n </button>\n\n <div class=\"mint-collapsible-card__actions\">\n <span v-if=\"badge !== undefined\" :class=\"badgeClasses\">\n {{ badge }}\n </span>\n\n <button\n v-for=\"action in actions\"\n :key=\"action.id\"\n type=\"button\"\n :class=\"actionClasses(action)\"\n :style=\"actionStyle(action)\"\n :disabled=\"disabled || action.disabled\"\n :aria-label=\"action.label\"\n :title=\"action.label\"\n @click=\"handleActionClick(action)\"\n >\n <svg\n v-if=\"action.icon && isSvgIconValue(action.icon)\"\n class=\"mint-collapsible-card__action-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <template v-if=\"Array.isArray(action.icon)\">\n <path v-for=\"(d, i) in action.icon\" :key=\"i\" :d=\"d\" />\n </template>\n <path v-else :d=\"action.icon\" />\n </svg>\n <span v-else-if=\"action.icon\" class=\"mint-collapsible-card__action-text-icon\">\n {{ action.icon }}\n </span>\n </button>\n\n <div\n v-if=\"showToggle\"\n class=\"mint-collapsible-card__toggle\"\n :style=\"toggleColorStyle\"\n @click.stop\n >\n <!-- md = the board's 32x18 header switch (10a) -->\n <BaseCheckbox\n type=\"switch\"\n :model-value=\"toggleValue\"\n :aria-label=\"title\"\n @update:model-value=\"emit('update:toggleValue', $event)\"\n />\n </div>\n\n <button\n type=\"button\"\n class=\"mint-collapsible-card__chevron-button\"\n :disabled=\"disabled\"\n :aria-label=\"isOpen ? 'Collapse section' : 'Expand section'\"\n :aria-expanded=\"isOpen\"\n @click=\"toggle\"\n >\n <svg\n :class=\"[\n 'mint-collapsible-card__chevron',\n isOpen ? 'mint-collapsible-card__chevron--open' : '',\n ]\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </button>\n </div>\n </div>\n\n <Transition name=\"collapse\">\n <div v-show=\"isOpen\" class=\"mint-collapsible-card__body\">\n <div class=\"mint-collapsible-card__content\">\n <slot />\n </div>\n </div>\n </Transition>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** Card whose body collapses with a chevron-rotate animation, with an optional inline toggle switch independent of expand state. */\nimport { ref, computed } from 'vue'\nimport type { SidebarToolSectionAction, Tone } from '../types'\nimport BaseCheckbox from './BaseCheckbox.vue'\n\ninterface Props {\n title: string\n subtitle?: string\n badge?: string | number\n badgeTone?: Tone\n defaultOpen?: boolean\n disabled?: boolean\n dense?: boolean\n icon?: string | string[]\n iconColor?: string\n iconBg?: string\n actions?: SidebarToolSectionAction[]\n showToggle?: boolean\n toggleValue?: boolean\n toggleColor?: string\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n badge: undefined,\n badgeTone: 'cta',\n defaultOpen: false,\n disabled: false,\n dense: false,\n actions: () => [],\n showToggle: false,\n toggleValue: false,\n toggleColor: '',\n})\n\nconst emit = defineEmits<{\n 'update:toggleValue': [value: boolean]\n action: [actionId: string]\n}>()\n\nconst isOpen = ref(props.defaultOpen)\n\nconst toggle = () => {\n if (!props.disabled) {\n isOpen.value = !isOpen.value\n }\n}\n\nconst headerClasses = computed(() => [\n 'mint-collapsible-card__header',\n props.disabled ? 'mint-collapsible-card__header--disabled' : '',\n])\n\nconst iconBgStyle = computed(() => ({\n backgroundColor: props.iconBg || 'var(--color-primary-soft)',\n}))\n\nconst iconColorStyle = computed(() => ({\n color: props.iconColor || 'var(--color-primary)',\n}))\n\nconst isSvgIcon = computed(() => isSvgIconValue(props.icon))\n\nconst toggleColorStyle = computed(() =>\n props.toggleColor ? { '--_cc-toggle-on': props.toggleColor } : undefined,\n)\n\nconst badgeClasses = computed(() => [\n 'mint-collapsible-card__badge',\n `mint-collapsible-card__badge--${props.badgeTone}`,\n])\n\nfunction isSvgIconValue(icon?: string | string[]): boolean {\n if (!icon) return false\n return Array.isArray(icon) || icon.startsWith('M') || icon.startsWith('m')\n}\n\nfunction actionClasses(action: SidebarToolSectionAction): string[] {\n return [\n 'mint-collapsible-card__action',\n action.tone ? `mint-collapsible-card__action--${action.tone}` : '',\n action.disabled ? 'mint-collapsible-card__action--disabled' : '',\n ]\n}\n\nfunction actionStyle(action: SidebarToolSectionAction): Record<string, string> {\n return action.iconColor ? { color: action.iconColor } : {}\n}\n\nfunction handleActionClick(action: SidebarToolSectionAction) {\n if (props.disabled || action.disabled) return\n emit('action', action.id)\n}\n</script>\n\n<template>\n <div :class=\"['mint-collapsible-card', dense ? 'mint-collapsible-card--dense' : '']\">\n <div class=\"mint-collapsible-card__header-shell\">\n <button\n type=\"button\"\n :class=\"headerClasses\"\n :disabled=\"disabled\"\n :aria-expanded=\"isOpen\"\n @click=\"toggle\"\n >\n <div class=\"mint-collapsible-card__title-section\">\n <!-- Icon badge -->\n <div v-if=\"icon\" class=\"mint-collapsible-card__icon-badge\" :style=\"iconBgStyle\">\n <svg\n v-if=\"isSvgIcon\"\n class=\"mint-collapsible-card__icon\"\n :style=\"iconColorStyle\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <template v-if=\"Array.isArray(icon)\">\n <path v-for=\"(d, i) in icon\" :key=\"i\" :d=\"d\" />\n </template>\n <path v-else :d=\"icon\" />\n </svg>\n <span v-else class=\"mint-collapsible-card__icon-text\" :style=\"iconColorStyle\">{{ icon }}</span>\n </div>\n\n <div class=\"mint-collapsible-card__titles\">\n <h3 class=\"mint-collapsible-card__title\">{{ title }}</h3>\n <p v-if=\"subtitle\" class=\"mint-collapsible-card__subtitle\">{{ subtitle }}</p>\n </div>\n </div>\n </button>\n\n <div class=\"mint-collapsible-card__actions\">\n <span v-if=\"badge !== undefined\" :class=\"badgeClasses\">\n {{ badge }}\n </span>\n\n <button\n v-for=\"action in actions\"\n :key=\"action.id\"\n type=\"button\"\n :class=\"actionClasses(action)\"\n :style=\"actionStyle(action)\"\n :disabled=\"disabled || action.disabled\"\n :aria-label=\"action.label\"\n :title=\"action.label\"\n @click=\"handleActionClick(action)\"\n >\n <svg\n v-if=\"action.icon && isSvgIconValue(action.icon)\"\n class=\"mint-collapsible-card__action-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <template v-if=\"Array.isArray(action.icon)\">\n <path v-for=\"(d, i) in action.icon\" :key=\"i\" :d=\"d\" />\n </template>\n <path v-else :d=\"action.icon\" />\n </svg>\n <span v-else-if=\"action.icon\" class=\"mint-collapsible-card__action-text-icon\">\n {{ action.icon }}\n </span>\n </button>\n\n <div\n v-if=\"showToggle\"\n class=\"mint-collapsible-card__toggle\"\n :style=\"toggleColorStyle\"\n @click.stop\n >\n <!-- md = the board's 32x18 header switch (10a) -->\n <BaseCheckbox\n type=\"switch\"\n :model-value=\"toggleValue\"\n :aria-label=\"title\"\n @update:model-value=\"emit('update:toggleValue', $event)\"\n />\n </div>\n\n <button\n type=\"button\"\n class=\"mint-collapsible-card__chevron-button\"\n :disabled=\"disabled\"\n :aria-label=\"isOpen ? 'Collapse section' : 'Expand section'\"\n :aria-expanded=\"isOpen\"\n @click=\"toggle\"\n >\n <svg\n :class=\"[\n 'mint-collapsible-card__chevron',\n isOpen ? 'mint-collapsible-card__chevron--open' : '',\n ]\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </button>\n </div>\n </div>\n\n <Transition name=\"collapse\">\n <div v-show=\"isOpen\" class=\"mint-collapsible-card__body\">\n <div class=\"mint-collapsible-card__content\">\n <slot />\n </div>\n </div>\n </Transition>\n </div>\n</template>\n","import type {\n FieldValidation,\n FormFieldSchema,\n} from '../types/form-builder'\nimport {\n defaultValueForControl,\n normalizeOption,\n type NormalizedControl,\n} from './controlSchemaNormalize'\nimport {\n humanize,\n numericValue,\n} from './controlSchemaUtils'\nimport type {\n ControlDefinition,\n} from './controlSchemaTypes'\n\nexport function controlToFormField(control: NormalizedControl): FormFieldSchema {\n const { name, definition, type } = control\n const props = fieldProps(definition)\n return {\n name,\n label: definition.label ?? humanize(name),\n type,\n defaultValue: defaultValueForControl(definition, type),\n placeholder: definition.placeholder,\n hint: definition.hint,\n icon: definition.icon,\n iconColor: definition.iconColor,\n iconBg: definition.iconBg,\n size: definition.size,\n disabled: definition.disabled,\n readonly: definition.readonly,\n validation: validationForControl(definition),\n condition: definition.condition,\n access: definition.access,\n colSpan: definition.colSpan,\n props,\n }\n}\n\nfunction fieldProps(definition: ControlDefinition): Record<string, unknown> {\n const props: Record<string, unknown> = {}\n if (definition.min !== undefined) props.min = numericValue(definition.min)\n if (definition.max !== undefined) props.max = numericValue(definition.max)\n if (definition.options) props.options = definition.options.map(normalizeOption)\n return { ...props, ...(definition.props ?? {}) }\n}\n\nfunction validationForControl(definition: ControlDefinition): FieldValidation | undefined {\n const validation: FieldValidation = { ...(definition.validation ?? {}) }\n if (definition.required !== undefined) validation.required = definition.required\n if (definition.min !== undefined) validation.min = definition.min\n if (definition.max !== undefined) validation.max = definition.max\n if (definition.minLength !== undefined) validation.minLength = definition.minLength\n if (definition.maxLength !== undefined) validation.maxLength = definition.maxLength\n if (definition.email !== undefined) validation.email = definition.email\n if (definition.pattern !== undefined) validation.pattern = definition.pattern\n return Object.keys(validation).length > 0 ? validation : undefined\n}\n","import type {\n PillNavItem,\n} from '../types'\nimport type {\n NormalizedControl,\n} from './controlSchemaNormalize'\nimport {\n humanize,\n} from './controlSchemaUtils'\nimport type {\n ControlDefinition,\n ControlSchemaOptions,\n ControlSectionConfig,\n ControlSidebarConfig,\n} from './controlSchemaTypes'\n\nexport function sectionConfig(\n sectionId: string,\n controls: NormalizedControl[],\n options: ControlSchemaOptions,\n): ControlSectionConfig {\n const configured = options.sections?.[sectionId]\n const first = controls[0]?.definition\n return {\n ...configured,\n id: sectionId,\n label: configured?.label ?? first?.sectionLabel,\n title: configured?.title ?? first?.sectionLabel,\n description: configured?.description ?? first?.sectionDescription,\n subtitle: configured?.subtitle ?? first?.sectionSubtitle,\n }\n}\n\nexport function firstSidebarConfig(controls: NormalizedControl[]): ControlSidebarConfig | undefined {\n for (const control of controls) {\n const sidebar = control.definition.sidebar\n if (sidebar && typeof sidebar === 'object' && sidebar.enabled !== false) return sidebar\n }\n return undefined\n}\n\nexport function isSidebarEnabled(sidebar: ControlDefinition['sidebar']): boolean {\n if (sidebar === false) return false\n if (sidebar && typeof sidebar === 'object') return sidebar.enabled !== false\n return true\n}\n\nexport function controlViewItem(viewId: string, options: ControlSchemaOptions): PillNavItem {\n const config = options.views?.[viewId]\n return {\n id: viewId,\n label: config?.label ?? humanize(viewId),\n ...(config?.icon !== undefined ? { icon: config.icon } : {}),\n ...(config?.to !== undefined ? { to: config.to } : {}),\n ...(config?.href !== undefined ? { href: config.href } : {}),\n ...(config?.disabled !== undefined ? { disabled: config.disabled } : {}),\n ...(config?.children !== undefined ? { children: config.children } : {}),\n }\n}\n","import type {\n PillNavItem,\n SidebarToolSection,\n SettingsModalSchema,\n TopBarSettingsConfig,\n} from '../types'\nimport type {\n FormSectionSchema,\n} from '../types/form-builder'\nimport {\n controlToFormField,\n} from './controlSchemaFormFields'\nimport {\n controlViewItem,\n firstSidebarConfig,\n isSidebarEnabled,\n sectionConfig,\n} from './controlSchemaLayout'\nimport {\n normalizeControls,\n} from './controlSchemaNormalize'\nimport {\n humanize,\n orderedUnique,\n} from './controlSchemaUtils'\nimport type {\n ControlFormSchema,\n ControlSchema,\n ControlSchemaOptions,\n} from './controlSchemaTypes'\n\n/** Convert a compact control schema into a FormBuilder schema. */\nexport function controlsToFormSchema(\n controls: ControlSchema,\n options: ControlSchemaOptions = {},\n): ControlFormSchema {\n const normalized = normalizeControls(controls, options)\n const sectionIds = orderedUnique(normalized.map(control => control.sectionId))\n const sections = sectionIds.map((sectionId): FormSectionSchema => {\n const sectionControls = normalized.filter(control => control.sectionId === sectionId)\n const config = sectionConfig(sectionId, sectionControls, options)\n return {\n id: sectionId,\n title: config.title ?? config.label ?? humanize(sectionId),\n description: config.description,\n columns: config.columns ?? options.columns ?? 1,\n defaultOpen: config.defaultOpen,\n condition: config.condition,\n fields: sectionControls.map(controlToFormField),\n }\n })\n\n return {\n sections,\n ...controlFormActions(options.actions),\n }\n}\n\nfunction controlFormActions(actions: ControlSchemaOptions['actions']): Omit<ControlFormSchema, 'sections'> {\n if (!actions) return {}\n return { actions: true, ...(actions === true ? {} : actions) }\n}\n\n/** Convert controls into AppSidebar panels grouped by view and section. */\nexport function controlsToSidebarPanels(\n controls: ControlSchema,\n options: ControlSchemaOptions = {},\n): Record<string, SidebarToolSection[]> {\n const normalized = normalizeControls(controls, options)\n .filter(control => isSidebarEnabled(control.definition.sidebar))\n const viewIds = orderedUnique(normalized.map(control => control.viewId))\n const panels: Record<string, SidebarToolSection[]> = {}\n\n for (const viewId of viewIds) {\n const viewControls = normalized.filter(control => control.viewId === viewId)\n const sectionIds = orderedUnique(viewControls.map(control => control.sectionId))\n panels[viewId] = sectionIds.map((sectionId): SidebarToolSection => {\n const sectionControls = viewControls.filter(control => control.sectionId === sectionId)\n const config = sectionConfig(sectionId, sectionControls, options)\n const sidebarConfig = firstSidebarConfig(sectionControls)\n return {\n id: sectionId,\n label: sidebarConfig?.label ?? config.label ?? config.title ?? humanize(sectionId),\n subtitle: sidebarConfig?.subtitle ?? config.subtitle,\n icon: sidebarConfig?.icon ?? config.icon,\n iconColor: sidebarConfig?.iconColor ?? config.iconColor,\n iconBg: sidebarConfig?.iconBg ?? config.iconBg,\n badge: sidebarConfig?.badge ?? config.badge,\n badgeTone: sidebarConfig?.badgeTone ?? config.badgeTone,\n actions: sidebarConfig?.actions ?? config.actions,\n defaultOpen: sidebarConfig?.defaultOpen ?? config.defaultOpen,\n showToggle: sidebarConfig?.showToggle ?? config.showToggle,\n }\n })\n }\n\n return panels\n}\n\n/** Convert controls into a SettingsModal schema grouped by the same sections. */\nexport function controlsToSettingsSchema(\n controls: ControlSchema,\n options: ControlSchemaOptions = {},\n): SettingsModalSchema {\n const normalized = normalizeControls(controls, options)\n const sectionIds = orderedUnique(normalized.map(control => control.sectionId))\n\n return {\n groups: sectionIds.map((sectionId) => {\n const sectionControls = normalized.filter(control => control.sectionId === sectionId)\n const config = sectionConfig(sectionId, sectionControls, options)\n return {\n id: sectionId,\n label: config.label ?? config.title ?? humanize(sectionId),\n description: config.description ?? config.subtitle,\n icon: typeof config.icon === 'string' ? config.icon : undefined,\n fields: sectionControls.map(controlToFormField),\n columns: config.columns ?? options.columns ?? 1,\n condition: config.condition,\n access: config.access,\n }\n }),\n }\n}\n\n/** Convert controls into an AppTopBar settingsConfig object that passes compact controls through to SettingsModal. */\nexport function controlsToTopBarSettingsConfig(\n controls: ControlSchema,\n options: ControlSchemaOptions = {},\n config: Omit<TopBarSettingsConfig, 'spec'> = {},\n): TopBarSettingsConfig {\n return {\n ...config,\n spec: { controls, controlOptions: options },\n }\n}\n\n/** Return generated control view IDs that have at least one sidebar panel. */\nexport function controlsToViewIds(\n controls: ControlSchema,\n options: ControlSchemaOptions = {},\n): string[] {\n return controlsToViewItems(controls, options).map(item => item.id)\n}\n\n/** Return AppTopBar `spec.pills` view items for switching generated control sidebars. */\nexport function controlsToViewItems(\n controls: ControlSchema,\n options: ControlSchemaOptions = {},\n): PillNavItem[] {\n return Object.entries(controlsToSidebarPanels(controls, options))\n .filter(([, sections]) => sections.length > 0)\n .map(([id]) => controlViewItem(id, options))\n}\n\n/** Return the first generated sidebar view ID, or an empty string when controls render no sidebar panels. */\nexport function getDefaultControlView(\n controls: ControlSchema,\n options: ControlSchemaOptions = {},\n): string {\n return controlsToViewIds(controls, options)[0] ?? ''\n}\n\n/** Return a headerless single-section FormBuilder schema for rendering inside an AppSidebar section slot. */\nexport function controlsToSectionFormSchema(\n controls: ControlSchema,\n sectionId: string,\n options: ControlSchemaOptions = {},\n): ControlFormSchema {\n const schema = controlsToFormSchema(controls, options)\n return {\n sections: schema.sections\n .filter(section => section.id === sectionId)\n .map(section => ({ ...section, title: '', description: undefined })),\n actions: schema.actions,\n submitLabel: schema.submitLabel,\n cancelLabel: schema.cancelLabel,\n showCancel: schema.showCancel,\n }\n}\n\n/** Return headerless FormBuilder schemas keyed by section ID for AppSidebar auto-rendering. */\nexport function controlsToSectionFormSchemas(\n controls: ControlSchema,\n options: ControlSchemaOptions = {},\n): Record<string, ControlFormSchema> {\n const schema = controlsToFormSchema(controls, options)\n const schemas: Record<string, ControlFormSchema> = {}\n for (const section of schema.sections) {\n schemas[section.id] = {\n sections: [{ ...section, title: '', description: undefined }],\n actions: schema.actions,\n submitLabel: schema.submitLabel,\n cancelLabel: schema.cancelLabel,\n showCancel: schema.showCancel,\n }\n }\n return schemas\n}\n\nconst CONTROL_TARGETS = {\n form: controlsToFormSchema,\n sectionForm: controlsToSectionFormSchema,\n sectionForms: controlsToSectionFormSchemas,\n settings: controlsToSettingsSchema,\n sidebarPanels: controlsToSidebarPanels,\n topBarSettings: controlsToTopBarSettingsConfig,\n viewIds: controlsToViewIds,\n viewItems: controlsToViewItems,\n} as const\n\n/** What `controlsTo()` can build from a control schema. */\nexport type ControlsTarget = keyof typeof CONTROL_TARGETS\n\n/**\n * Build one target shape from a control schema: a FormBuilder schema (`form`,\n * `sectionForm`, `sectionForms`), a settings modal schema (`settings`), sidebar\n * panels (`sidebarPanels`), a top-bar settings config (`topBarSettings`) or the\n * view list (`viewIds`, `viewItems`).\n *\n * @example\n * ```ts\n * const schema = controlsTo('form', controls)\n * const section = controlsTo('sectionForm', controls, 'analysis')\n * ```\n */\nexport function controlsTo<T extends ControlsTarget>(\n target: T,\n ...args: Parameters<(typeof CONTROL_TARGETS)[T]>\n): ReturnType<(typeof CONTROL_TARGETS)[T]> {\n const build = CONTROL_TARGETS[target] as (...values: unknown[]) => ReturnType<(typeof CONTROL_TARGETS)[T]>\n return build(...args)\n}\n","import type {\n ControlComponentBinding,\n ControlComponentBindingConfig,\n ControlComponentBindingRecordConfig,\n ControlComponentBindingsById,\n ControlComponentBindingsConfig,\n ControlComponentPropsMap,\n ControlComponentPropSource,\n} from './controlSchemaTypes'\n\n/** Map control workspace values into component props for direct `v-bind` usage. */\nexport function controlValuesToComponentProps<TValues extends Record<string, unknown>>(\n values: TValues,\n mapping?: ControlComponentPropsMap<TValues>,\n): Record<string, unknown> {\n if (mapping === undefined) return { ...values }\n\n if (Array.isArray(mapping)) {\n const props: Record<string, unknown> = {}\n for (const key of mapping) {\n props[key] = values[key]\n }\n return props\n }\n\n const props: Record<string, unknown> = {}\n for (const [prop, source] of Object.entries(mapping) as Array<[string, ControlComponentPropSource<TValues>]>) {\n props[prop] = typeof source === 'function' ? source(values) : values[source]\n }\n return props\n}\n\n/** Map control workspace values into named SDK component bindings for direct slot rendering. */\nexport function controlValuesToComponentBindings<TValues extends Record<string, unknown>>(\n values: TValues,\n bindings?: ControlComponentBindingsConfig<TValues>,\n): ControlComponentBinding[] {\n if (bindings === undefined) return []\n\n return normalizeControlComponentBindingConfigs(bindings).map(binding => ({\n id: binding.id,\n component: binding.component,\n props: controlValuesToComponentProps(values, binding.props),\n }))\n}\n\n/** Map control workspace values into SDK component bindings keyed by binding id. */\nexport function controlValuesToComponentBindingsById<TValues extends Record<string, unknown>>(\n values: TValues,\n bindings?: ControlComponentBindingsConfig<TValues>,\n): ControlComponentBindingsById {\n return Object.fromEntries(\n controlValuesToComponentBindings(values, bindings).map(binding => [binding.id, binding]),\n )\n}\n\nfunction normalizeControlComponentBindingConfigs<TValues extends Record<string, unknown>>(\n bindings: ControlComponentBindingsConfig<TValues>,\n): Array<Required<Pick<ControlComponentBindingConfig<TValues>, 'id' | 'component'>> & Pick<ControlComponentBindingConfig<TValues>, 'props'>> {\n if (Array.isArray(bindings)) {\n const usedIds = new Map<string, number>()\n return bindings.map(binding => ({\n id: uniqueComponentBindingId(binding.id ?? binding.component, usedIds),\n component: binding.component,\n props: binding.props,\n }))\n }\n\n return Object.entries(bindings).map(([id, binding]: [string, ControlComponentBindingRecordConfig<TValues>]) => ({\n id,\n component: binding.component,\n props: binding.props,\n }))\n}\n\n/** Map control values onto component props (`props`) and component bindings (`list`, `byId`). */\nexport const controlBindings = {\n props: controlValuesToComponentProps,\n list: controlValuesToComponentBindings,\n byId: controlValuesToComponentBindingsById,\n}\n\nfunction uniqueComponentBindingId(id: string, usedIds: Map<string, number>): string {\n const count = usedIds.get(id) ?? 0\n usedIds.set(id, count + 1)\n return count === 0 ? id : `${id}-${count + 1}`\n}\n","import {\n defaultValueForControl,\n normalizeControls,\n} from './controlSchemaNormalize'\nimport {\n controlToFormField,\n} from './controlSchemaFormFields'\nimport {\n controlsToFormSchema,\n controlsToSectionFormSchema,\n controlsToSectionFormSchemas,\n controlsToSettingsSchema,\n controlsToSidebarPanels,\n controlsToTopBarSettingsConfig,\n controlsToViewItems,\n} from './controlSchemaAdapters'\nimport type {\n ControlComponentBindingsConfig,\n ControlSchema,\n ControlSchemaOptions,\n ControlValues,\n UseControlSchemaReturn,\n} from './controlSchemaTypes'\n\nexport type * from './controlSchemaTypes'\n\nexport {\n mergeControlWorkspaceOptions,\n} from './controlWorkspaceOptions'\n\nexport {\n useControlWorkspace,\n} from './useControlWorkspace'\n\nexport {\n controlValuesToComponentBindings,\n controlValuesToComponentBindingsById,\n controlValuesToComponentProps,\n} from './controlComponentBindings'\n\nexport {\n controlsToFormSchema,\n controlsToSectionFormSchema,\n controlsToSectionFormSchemas,\n controlsToSettingsSchema,\n controlsToSidebarPanels,\n controlsToTopBarSettingsConfig,\n controlsToViewIds,\n controlsToViewItems,\n getDefaultControlView,\n} from './controlSchemaAdapters'\n\nexport {\n defineControlModel,\n isControlModelBinding,\n resolveControlModel,\n} from './controlSchemaModel'\n\nexport {\n defineDoseCalculatorControlProps,\n defineDoseDesignControlModel,\n defineWellPlateControlProps,\n defineWellPlateDoseComponentBindings,\n defineWellPlateDoseControlProps,\n} from './controlSchemaDoseDesign'\n\n/** Preserve literal control keys while marking an object as a MINT control schema. */\nexport function defineControls<TControls extends ControlSchema>(controls: TControls): TControls {\n return controls\n}\n\n/** Preserve literal SDK component binding ids while marking an object as generated workspace component bindings. */\nexport function defineControlComponentBindings<TBindings extends ControlComponentBindingsConfig>(\n bindings: TBindings,\n): TBindings {\n return bindings\n}\n\n/** Build default values for a control schema, matching FormBuilder field defaults. */\nexport function getControlDefaults<TControls extends ControlSchema>(\n controls: TControls,\n): ControlValues<TControls> {\n const values: Record<string, unknown> = {}\n for (const control of normalizeControls(controls)) {\n values[control.name] = defaultValueForControl(control.definition, control.type)\n }\n return values as ControlValues<TControls>\n}\n\n/** Prepare FormBuilder, SettingsModal, AppTopBar settings, AppSidebar, and initial values from one compact control model. */\nexport function useControlSchema<TControls extends ControlSchema>(\n controls: TControls,\n options: ControlSchemaOptions = {},\n): UseControlSchemaReturn<TControls> {\n const formSchema = controlsToFormSchema(controls, options)\n const settingsSchema = controlsToSettingsSchema(controls, options)\n const topBarSettingsConfig = controlsToTopBarSettingsConfig(controls, options)\n const sidebarPanels = controlsToSidebarPanels(controls, options)\n const viewItems = controlsToViewItems(controls, options)\n const viewIds = viewItems.map(item => item.id)\n const defaultView = viewIds[0] ?? ''\n const sectionSchemas = controlsToSectionFormSchemas(controls, options)\n\n return {\n controls,\n fields: normalizeControls(controls, options).map(controlToFormField),\n formSchema,\n form: {\n spec: { controls, controlOptions: options },\n },\n settingsSchema,\n settings: {\n spec: settingsSchema,\n },\n topBarSettingsConfig,\n topBarSettings: {\n spec: { settings: topBarSettingsConfig },\n },\n sidebarPanels,\n viewIds,\n viewItems,\n defaultView,\n sectionSchemas,\n sidebar: {\n spec: { panels: sidebarPanels, forms: sectionSchemas },\n activeView: defaultView,\n },\n initialValues: getControlDefaults(controls),\n sectionSchema: (sectionId: string) => controlsToSectionFormSchema(controls, sectionId, options),\n }\n}\n","import { computed, reactive, watch } from 'vue'\nimport type { ComputedRef } from 'vue'\nimport type { PillNavItem } from '../types'\nimport type {\n ControlComponentBinding,\n ControlComponentBindingsById,\n ControlModelBinding,\n ControlSchema,\n ControlWorkspaceOptions,\n} from '../composables/useControlSchema'\nimport {\n controlValuesToComponentBindings,\n controlValuesToComponentBindingsById,\n controlValuesToComponentProps,\n controlsToViewItems,\n getControlDefaults,\n getDefaultControlView,\n} from '../composables/useControlSchema'\n\nexport interface PluginWorkspaceControlsOptions {\n model: () => ControlModelBinding | undefined\n values: () => Record<string, unknown> | undefined\n emitValues: (values: Record<string, unknown>) => void\n}\n\nexport interface PluginWorkspaceControls {\n resolvedControls: ComputedRef<ControlSchema | undefined>\n resolvedControlOptions: ComputedRef<ControlWorkspaceOptions>\n generatedPillNav: ComputedRef<PillNavItem[]>\n generatedDefaultView: ComputedRef<string>\n internalControlValues: Record<string, unknown>\n resolvedComponentBindings: ComputedRef<ControlComponentBinding[]>\n resolvedComponentBindingsById: ComputedRef<ControlComponentBindingsById>\n resolvedComponentProps: ComputedRef<Record<string, unknown>>\n resolvedComponentPropsById: ComputedRef<Record<string, Record<string, unknown>>>\n handleControlValuesUpdate: (values: Record<string, unknown>) => void\n}\n\nexport function usePluginWorkspaceControls(\n options: PluginWorkspaceControlsOptions,\n): PluginWorkspaceControls {\n const resolvedModel = computed<ControlModelBinding | undefined>(() => options.model())\n\n const resolvedControls = computed<ControlSchema | undefined>(() => resolvedModel.value?.controls)\n\n const resolvedControlOptions = computed<ControlWorkspaceOptions>(() => resolvedModel.value?.controlOptions ?? {})\n\n const externalControlValues = computed(() => options.values())\n const internalControlValues = reactive<Record<string, unknown>>({})\n let syncingControlValues = false\n\n const generatedControlDefaults = computed<Record<string, unknown>>(() => {\n if (!resolvedControls.value) return {}\n return {\n ...getControlDefaults(resolvedControls.value),\n ...(resolvedControlOptions.value.initialValues ?? {}),\n }\n })\n\n function replaceControlValues(values: Record<string, unknown>) {\n for (const key of Object.keys(internalControlValues)) {\n if (!(key in values)) {\n delete internalControlValues[key]\n }\n }\n Object.assign(internalControlValues, values)\n }\n\n function emitControlValues() {\n options.emitValues({ ...internalControlValues })\n }\n\n function syncResolvedControlValues() {\n syncingControlValues = true\n replaceControlValues({\n ...generatedControlDefaults.value,\n ...(externalControlValues.value === undefined ? internalControlValues : externalControlValues.value),\n })\n syncingControlValues = false\n }\n\n function handleControlValuesUpdate(values: Record<string, unknown>) {\n syncingControlValues = true\n replaceControlValues({\n ...generatedControlDefaults.value,\n ...values,\n })\n syncingControlValues = false\n emitControlValues()\n }\n\n const resolvedComponentBindings = computed(() =>\n controlValuesToComponentBindings(\n internalControlValues,\n resolvedModel.value?.componentBindings,\n ),\n )\n\n const resolvedComponentBindingsById = computed(() =>\n controlValuesToComponentBindingsById(\n internalControlValues,\n resolvedModel.value?.componentBindings,\n ),\n )\n\n const resolvedComponentProps = computed(() => {\n const mapping = resolvedModel.value?.componentProps\n return mapping === undefined ? {} : controlValuesToComponentProps(internalControlValues, mapping)\n })\n\n const resolvedComponentPropsById = computed(() => {\n const mappings = resolvedModel.value?.componentPropsById\n if (mappings === undefined) return {}\n\n return Object.fromEntries(\n Object.entries(mappings).map(([id, mapping]) => [\n id,\n controlValuesToComponentProps(internalControlValues, mapping),\n ]),\n )\n })\n\n const generatedPillNav = computed<PillNavItem[]>(() => {\n if (!resolvedControls.value) return []\n return controlsToViewItems(resolvedControls.value, resolvedControlOptions.value)\n })\n\n const generatedDefaultView = computed(() => {\n if (!resolvedControls.value) return ''\n return getDefaultControlView(resolvedControls.value, resolvedControlOptions.value)\n })\n\n syncResolvedControlValues()\n\n watch(\n [generatedControlDefaults, externalControlValues],\n syncResolvedControlValues,\n { deep: true },\n )\n\n watch(\n internalControlValues,\n () => {\n if (syncingControlValues) return\n emitControlValues()\n },\n { deep: true, flush: 'sync' },\n )\n\n return {\n resolvedControls,\n resolvedControlOptions,\n generatedPillNav,\n generatedDefaultView,\n internalControlValues,\n resolvedComponentBindings,\n resolvedComponentBindingsById,\n resolvedComponentProps,\n resolvedComponentPropsById,\n handleControlValuesUpdate,\n }\n}\n","import { computed, ref, type ComputedRef, type Ref, type WritableComputedRef } from 'vue'\nimport type {\n PillNavItem,\n PillNavItemInput,\n} from '../types'\n\ntype ReadableRef<T> = Readonly<Ref<T>>\n\nexport interface PluginWorkspaceNavigationOptions {\n activeView: () => string | undefined\n currentPillId: () => string | undefined\n pillNav: () => PillNavItemInput[] | undefined\n panelIds: () => string[]\n generatedPillNav: ReadableRef<readonly PillNavItem[]>\n generatedDefaultView: ReadableRef<string>\n emitActiveView: (viewId: string) => void\n emitPillSelect: (item: PillNavItem) => void\n}\n\nexport interface PluginWorkspaceNavigation {\n resolvedPillNav: ComputedRef<PillNavItemInput[] | undefined>\n firstConfiguredViewId: ComputedRef<string>\n resolvedActiveView: WritableComputedRef<string>\n resolvedCurrentPillId: ComputedRef<string>\n setActiveView: (viewId: string) => void\n handlePillSelect: (item: PillNavItem) => void\n}\n\nexport function usePluginWorkspaceNavigation(\n options: PluginWorkspaceNavigationOptions,\n): PluginWorkspaceNavigation {\n const internalActiveView = ref<string>()\n\n const resolvedPillNav = computed<PillNavItemInput[] | undefined>(() => {\n if (options.pillNav() !== undefined) return options.pillNav()\n return options.generatedPillNav.value.length > 0\n ? [...options.generatedPillNav.value]\n : undefined\n })\n\n const firstConfiguredViewId = computed(() =>\n firstItemId(options.pillNav())\n ?? options.generatedDefaultView.value\n ?? options.panelIds()[0]\n ?? '',\n )\n\n const resolvedActiveView = computed({\n get: () =>\n options.activeView()\n ?? options.currentPillId()\n ?? internalActiveView.value\n ?? firstConfiguredViewId.value,\n set: (value: string) => {\n internalActiveView.value = value\n options.emitActiveView(value)\n },\n })\n\n const resolvedCurrentPillId = computed(() => options.currentPillId() ?? resolvedActiveView.value)\n\n function setActiveView(viewId: string) {\n resolvedActiveView.value = viewId\n }\n\n function handlePillSelect(item: PillNavItem) {\n setActiveView(item.id)\n options.emitPillSelect(item)\n }\n\n return {\n resolvedPillNav,\n firstConfiguredViewId,\n resolvedActiveView,\n resolvedCurrentPillId,\n setActiveView,\n handlePillSelect,\n }\n}\n\nfunction firstItemId(items?: readonly (string | { id: string })[]): string | undefined {\n const item = items?.[0]\n if (item === undefined) return undefined\n return typeof item === 'string' ? item : item.id\n}\n","import type { PluginWorkspaceSidebarSpec } from '../types'\n\nconst topBarForwardedSlots = new Set([\n 'icon',\n 'logo',\n 'nav',\n 'center',\n 'actions',\n 'settings-appearance',\n])\n\nconst sidebarForwardedSlots = new Set([\n 'header',\n 'collapsed',\n 'collapsed-footer',\n 'footer',\n])\n\ntype SlotKeyMap = Readonly<Record<string, unknown>>\n\nexport interface PluginWorkspaceSidebarSurfaceOptions {\n sidebar: false | PluginWorkspaceSidebarSpec\n hasSidebarSlot: boolean\n sidebarSlotCount: number\n}\n\nexport function getPluginWorkspaceTopBarSlotNames(slots: SlotKeyMap): string[] {\n return Object.keys(slots).filter(name =>\n topBarForwardedSlots.has(name) || name.startsWith('settings-tab-'),\n )\n}\n\nexport function getPluginWorkspaceSidebarSlotNames(slots: SlotKeyMap): string[] {\n return Object.keys(slots).filter(name =>\n sidebarForwardedSlots.has(name) || name.startsWith('section-'),\n )\n}\n\nexport function hasPluginWorkspaceSidebarSurface(\n options: PluginWorkspaceSidebarSurfaceOptions,\n): boolean {\n const { sidebar } = options\n if (sidebar === false) return false\n return (\n Object.keys(sidebar.panels ?? {}).length > 0\n || Object.keys(sidebar.forms ?? {}).length > 0\n || sidebar.controls !== undefined\n || Boolean(sidebar.whenEmpty)\n || sidebar.contentId !== undefined\n || sidebar.title !== undefined\n || sidebar.subtitle !== undefined\n || sidebar.badge !== undefined\n || options.hasSidebarSlot\n || options.sidebarSlotCount > 0\n )\n}\n","import { computed } from 'vue'\nimport type { ComputedRef } from 'vue'\nimport type { PillNavItem, PluginWorkspaceSidebarSpec } from '../types'\nimport type {\n PluginWorkspaceViewEmit,\n PluginWorkspaceViewProps,\n} from '../components/PluginWorkspaceView.props'\nimport { usePluginWorkspaceControls } from '../components/PluginWorkspaceView.controls'\nimport { usePluginWorkspaceNavigation } from '../components/PluginWorkspaceView.navigation'\nimport {\n getPluginWorkspaceSidebarSlotNames,\n getPluginWorkspaceTopBarSlotNames,\n hasPluginWorkspaceSidebarSurface,\n} from '../components/PluginWorkspaceView.shell'\nimport { applySpecDefaults } from './componentSpecs'\nimport type {\n PluginWorkspaceControlsModel,\n PluginWorkspaceShellModel,\n PluginWorkspaceSidebarModel,\n} from './pluginWorkspaceModel'\n\n/**\n * Loosely-typed view of a component's `useSlots()` result: only slot presence and names are\n * read here, so this accepts any `defineSlots()` shape without fighting Vue's `Slot` render\n * function type. Mirrors the `SlotKeyMap` helper type in PluginWorkspaceView.shell.ts.\n */\nexport type PluginWorkspaceSlotsLike = Readonly<Record<string, unknown>>\n\nexport interface UsePluginWorkspaceOptions {\n /** PluginWorkspaceView's own reactive props object (from `defineProps`). */\n props: PluginWorkspaceViewProps\n /** PluginWorkspaceView's own slots (from `useSlots()`), used to detect provided passthrough slots. */\n slots: PluginWorkspaceSlotsLike\n /** PluginWorkspaceView's own typed `emit` function (from `defineEmits<PluginWorkspaceViewEmits>()`). */\n emit: PluginWorkspaceViewEmit\n}\n\nexport interface UsePluginWorkspaceReturn {\n /** Model consumed by WorkspaceShellInternal's `shell` prop. */\n shell: ComputedRef<PluginWorkspaceShellModel>\n /** Model consumed by WorkspaceSidebarInternal's `sidebar` prop. */\n sidebar: ComputedRef<PluginWorkspaceSidebarModel>\n /** Model consumed by WorkspaceControlsInternal's `controls` prop, and by the raw `default` slot. */\n controls: ComputedRef<PluginWorkspaceControlsModel>\n /** Whether AppLayout should render a sidebar surface at all. */\n hasSidebarSurface: ComputedRef<boolean>\n /** Applies an AppSidebar `update:values` payload to the shared control values and emits `update:values`. */\n handleControlValuesUpdate: (values: Record<string, unknown>) => void\n /** Resolves an AppTopBar `pill-select` payload into the active view and emits `update:pill` and `pill-select`. */\n handlePillSelect: (item: PillNavItem) => void\n}\n\n/**\n * Maps PluginWorkspaceView's `spec` and `v-model`s into the three typed model objects\n * (`shell`, `sidebar`, `controls`) rendered by its internal pieces\n * (WorkspaceShellInternal, WorkspaceSidebarInternal, WorkspaceControlsInternal).\n *\n * @example Recommended\n * ```ts\n * const props = defineProps<PluginWorkspaceViewProps>()\n * const emit = defineEmits<PluginWorkspaceViewEmits>()\n * const slots = useSlots()\n * const { shell, sidebar, controls } = usePluginWorkspace({ props, slots, emit })\n * ```\n */\nexport function usePluginWorkspace(options: UsePluginWorkspaceOptions): UsePluginWorkspaceReturn {\n const { props, slots, emit } = options\n\n const sidebarSpec = computed<false | PluginWorkspaceSidebarSpec>(() => props.spec?.sidebar ?? {})\n const topBarSpec = computed(() => props.spec?.topBar === false\n ? false\n : applySpecDefaults({ themeToggle: true, settings: {}, standaloneLabel: false }, props.spec?.topBar))\n\n const controlsState = usePluginWorkspaceControls({\n model: () => sidebarSpec.value === false ? undefined : sidebarSpec.value.controls,\n values: () => props.values,\n emitValues: values => emit('update:values', values),\n })\n\n const navigationState = usePluginWorkspaceNavigation({\n activeView: () => props.view,\n currentPillId: () => props.pill,\n pillNav: () => topBarSpec.value === false ? undefined : topBarSpec.value.pills,\n panelIds: () => Object.keys(sidebarSpec.value === false ? {} : sidebarSpec.value.panels ?? {}),\n generatedPillNav: controlsState.generatedPillNav,\n generatedDefaultView: controlsState.generatedDefaultView,\n emitActiveView: viewId => emit('update:view', viewId),\n emitPillSelect: (item) => {\n emit('update:pill', item.id)\n emit('pill-select', item)\n },\n })\n\n const topBarSlotNames = computed<string[]>(() => getPluginWorkspaceTopBarSlotNames(slots))\n const sidebarSlotNames = computed<string[]>(() => getPluginWorkspaceSidebarSlotNames(slots))\n\n const hasSidebarSurface = computed(() => hasPluginWorkspaceSidebarSurface({\n sidebar: sidebarSpec.value,\n hasSidebarSlot: Boolean(slots.sidebar),\n sidebarSlotCount: sidebarSlotNames.value.length,\n }))\n\n const controls = computed<PluginWorkspaceControlsModel>(() => ({\n activeView: navigationState.resolvedActiveView.value,\n setActiveView: navigationState.setActiveView,\n values: controlsState.internalControlValues,\n componentBindings: controlsState.resolvedComponentBindings.value,\n componentBindingsById: controlsState.resolvedComponentBindingsById.value,\n componentProps: controlsState.resolvedComponentProps.value,\n componentPropsById: controlsState.resolvedComponentPropsById.value,\n }))\n\n const shell = computed<PluginWorkspaceShellModel>(() => {\n const sidebar = sidebarSpec.value === false ? {} : sidebarSpec.value\n return {\n sidebarPosition: sidebar.position ?? 'left',\n sidebarWidth: sidebar.width,\n floating: props.spec?.floating ?? true,\n responsiveSidebar: sidebar.responsive ?? true,\n sidebarToggleLabel: sidebar.toggleLabel ?? 'Open workspace sidebar',\n sidebarCloseLabel: sidebar.closeLabel ?? 'Close workspace sidebar',\n hasSidebarSurface: hasSidebarSurface.value,\n title: props.spec?.title,\n subtitle: props.spec?.subtitle,\n topBar: topBarSpec.value === false\n ? false\n : { ...topBarSpec.value, pills: navigationState.resolvedPillNav.value },\n pill: navigationState.resolvedCurrentPillId.value,\n topBarSlotNames: topBarSlotNames.value,\n controls: controls.value,\n }\n })\n\n const sidebar = computed<PluginWorkspaceSidebarModel>(() => {\n const spec = sidebarSpec.value === false ? {} : sidebarSpec.value\n return {\n spec: {\n ...spec,\n floating: false,\n collapsible: spec.collapsible ?? true,\n whenEmpty: (spec.whenEmpty ?? false) || spec.contentId !== undefined,\n },\n activeView: navigationState.resolvedActiveView.value,\n values: controlsState.internalControlValues,\n collapsed: props.sidebarCollapsed,\n formLoading: props.formLoading ?? false,\n formDisabled: props.formDisabled ?? false,\n formReadonly: props.formReadonly ?? false,\n slotNames: sidebarSlotNames.value,\n }\n })\n\n return {\n shell,\n sidebar,\n controls,\n hasSidebarSurface,\n handleControlValuesUpdate: controlsState.handleControlValuesUpdate,\n handlePillSelect: navigationState.handlePillSelect,\n }\n}\n","<script setup lang=\"ts\">\n/**\n * AppLayout - Page layout shell with topbar, sidebar, and main content slots\n *\n * Provides a responsive application layout structure with optional topbar and sidebar.\n * The sidebar slot is a simple pass-through on desktop. When responsiveSidebar is\n * enabled, AppLayout owns the mobile toggle/backdrop shell around the sidebar.\n *\n * @example\n * ```vue\n * <AppLayout sidebar-position=\"right\" floating>\n * <template #topbar>\n * <AppTopBar title=\"My App\" />\n * </template>\n * <template #sidebar>\n * <AppSidebar :spec=\"{ panels: toolPanels }\" :active-view=\"activeTab\">\n * <template #section-params>...</template>\n * </AppSidebar>\n * </template>\n * <main-content />\n * </AppLayout>\n * ```\n */\nimport { computed, ref } from 'vue'\n\ninterface Props {\n /** Position of sidebar (left or right side of screen) */\n sidebarPosition?: 'left' | 'right'\n /** Width of sidebar (use 'auto' to fit content) */\n sidebarWidth?: string\n /** When true, topbar/sidebar/main render as floating cards with gaps */\n floating?: boolean\n /** Convert the sidebar into a mobile overlay with built-in toggle and backdrop below 1024px. */\n responsiveSidebar?: boolean\n /** Controlled mobile sidebar open state. Desktop sidebar remains visible. */\n sidebarOpen?: boolean\n /** Initial mobile sidebar open state when sidebarOpen is uncontrolled. */\n defaultSidebarOpen?: boolean\n /** Accessible label for the mobile sidebar toggle. */\n sidebarToggleLabel?: string\n /** Accessible label used when the mobile sidebar is open. */\n sidebarCloseLabel?: string\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n sidebarPosition: 'left',\n sidebarWidth: 'auto',\n floating: false,\n responsiveSidebar: false,\n sidebarOpen: undefined,\n defaultSidebarOpen: false,\n sidebarToggleLabel: 'Open sidebar',\n sidebarCloseLabel: 'Close sidebar',\n})\n\nconst emit = defineEmits<{\n 'update:sidebarOpen': [value: boolean]\n}>()\n\nconst internalSidebarOpen = ref(props.defaultSidebarOpen)\nconst sidebarOpenModel = computed({\n get: () => props.sidebarOpen ?? internalSidebarOpen.value,\n set: (value: boolean) => {\n internalSidebarOpen.value = value\n emit('update:sidebarOpen', value)\n },\n})\n\nconst layoutClasses = computed(() => [\n 'mint-layout',\n props.sidebarPosition === 'right' ? 'mint-layout--sidebar-right' : '',\n props.floating ? 'mint-layout--floating' : '',\n props.responsiveSidebar ? 'mint-layout--responsive-sidebar' : '',\n sidebarOpenModel.value ? 'mint-layout--sidebar-open' : '',\n])\n\nconst sidebarStyle = computed(() => {\n return props.sidebarWidth !== 'auto' ? { width: props.sidebarWidth } : undefined\n})\n\nfunction toggleSidebar() {\n sidebarOpenModel.value = !sidebarOpenModel.value\n}\n\nfunction closeSidebar() {\n sidebarOpenModel.value = false\n}\n</script>\n\n<template>\n <div :class=\"layoutClasses\">\n <div v-if=\"$slots.topbar\" class=\"mint-layout__topbar\">\n <slot name=\"topbar\" />\n </div>\n\n <div class=\"mint-layout__body\">\n <button\n v-if=\"responsiveSidebar && $slots.sidebar\"\n type=\"button\"\n class=\"mint-layout__sidebar-toggle\"\n :aria-label=\"sidebarOpenModel ? sidebarCloseLabel : sidebarToggleLabel\"\n :aria-expanded=\"sidebarOpenModel\"\n @click=\"toggleSidebar\"\n >\n <svg\n v-if=\"!sidebarOpenModel\"\n class=\"mint-layout__sidebar-toggle-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M4 6h16M4 12h16M4 18h16\" />\n </svg>\n <svg\n v-else\n class=\"mint-layout__sidebar-toggle-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M6 18 18 6M6 6l12 12\" />\n </svg>\n </button>\n\n <div\n v-if=\"responsiveSidebar && $slots.sidebar && sidebarOpenModel\"\n class=\"mint-layout__sidebar-backdrop\"\n @click=\"closeSidebar\"\n />\n\n <div\n v-if=\"$slots.sidebar\"\n class=\"mint-layout__sidebar\"\n :style=\"sidebarStyle\"\n >\n <slot name=\"sidebar\" />\n </div>\n\n <main class=\"mint-layout__main\">\n <slot />\n </main>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * AppLayout - Page layout shell with topbar, sidebar, and main content slots\n *\n * Provides a responsive application layout structure with optional topbar and sidebar.\n * The sidebar slot is a simple pass-through on desktop. When responsiveSidebar is\n * enabled, AppLayout owns the mobile toggle/backdrop shell around the sidebar.\n *\n * @example\n * ```vue\n * <AppLayout sidebar-position=\"right\" floating>\n * <template #topbar>\n * <AppTopBar title=\"My App\" />\n * </template>\n * <template #sidebar>\n * <AppSidebar :spec=\"{ panels: toolPanels }\" :active-view=\"activeTab\">\n * <template #section-params>...</template>\n * </AppSidebar>\n * </template>\n * <main-content />\n * </AppLayout>\n * ```\n */\nimport { computed, ref } from 'vue'\n\ninterface Props {\n /** Position of sidebar (left or right side of screen) */\n sidebarPosition?: 'left' | 'right'\n /** Width of sidebar (use 'auto' to fit content) */\n sidebarWidth?: string\n /** When true, topbar/sidebar/main render as floating cards with gaps */\n floating?: boolean\n /** Convert the sidebar into a mobile overlay with built-in toggle and backdrop below 1024px. */\n responsiveSidebar?: boolean\n /** Controlled mobile sidebar open state. Desktop sidebar remains visible. */\n sidebarOpen?: boolean\n /** Initial mobile sidebar open state when sidebarOpen is uncontrolled. */\n defaultSidebarOpen?: boolean\n /** Accessible label for the mobile sidebar toggle. */\n sidebarToggleLabel?: string\n /** Accessible label used when the mobile sidebar is open. */\n sidebarCloseLabel?: string\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n sidebarPosition: 'left',\n sidebarWidth: 'auto',\n floating: false,\n responsiveSidebar: false,\n sidebarOpen: undefined,\n defaultSidebarOpen: false,\n sidebarToggleLabel: 'Open sidebar',\n sidebarCloseLabel: 'Close sidebar',\n})\n\nconst emit = defineEmits<{\n 'update:sidebarOpen': [value: boolean]\n}>()\n\nconst internalSidebarOpen = ref(props.defaultSidebarOpen)\nconst sidebarOpenModel = computed({\n get: () => props.sidebarOpen ?? internalSidebarOpen.value,\n set: (value: boolean) => {\n internalSidebarOpen.value = value\n emit('update:sidebarOpen', value)\n },\n})\n\nconst layoutClasses = computed(() => [\n 'mint-layout',\n props.sidebarPosition === 'right' ? 'mint-layout--sidebar-right' : '',\n props.floating ? 'mint-layout--floating' : '',\n props.responsiveSidebar ? 'mint-layout--responsive-sidebar' : '',\n sidebarOpenModel.value ? 'mint-layout--sidebar-open' : '',\n])\n\nconst sidebarStyle = computed(() => {\n return props.sidebarWidth !== 'auto' ? { width: props.sidebarWidth } : undefined\n})\n\nfunction toggleSidebar() {\n sidebarOpenModel.value = !sidebarOpenModel.value\n}\n\nfunction closeSidebar() {\n sidebarOpenModel.value = false\n}\n</script>\n\n<template>\n <div :class=\"layoutClasses\">\n <div v-if=\"$slots.topbar\" class=\"mint-layout__topbar\">\n <slot name=\"topbar\" />\n </div>\n\n <div class=\"mint-layout__body\">\n <button\n v-if=\"responsiveSidebar && $slots.sidebar\"\n type=\"button\"\n class=\"mint-layout__sidebar-toggle\"\n :aria-label=\"sidebarOpenModel ? sidebarCloseLabel : sidebarToggleLabel\"\n :aria-expanded=\"sidebarOpenModel\"\n @click=\"toggleSidebar\"\n >\n <svg\n v-if=\"!sidebarOpenModel\"\n class=\"mint-layout__sidebar-toggle-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M4 6h16M4 12h16M4 18h16\" />\n </svg>\n <svg\n v-else\n class=\"mint-layout__sidebar-toggle-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M6 18 18 6M6 6l12 12\" />\n </svg>\n </button>\n\n <div\n v-if=\"responsiveSidebar && $slots.sidebar && sidebarOpenModel\"\n class=\"mint-layout__sidebar-backdrop\"\n @click=\"closeSidebar\"\n />\n\n <div\n v-if=\"$slots.sidebar\"\n class=\"mint-layout__sidebar\"\n :style=\"sidebarStyle\"\n >\n <slot name=\"sidebar\" />\n </div>\n\n <main class=\"mint-layout__main\">\n <slot />\n </main>\n </div>\n </div>\n</template>\n","export type ItemWithLabel = {\n label: string\n}\n\nexport type ItemWithId = ItemWithLabel & {\n id: string\n}\n\nexport function normalizeItemInput<TItem extends ItemWithId>(\n item: TItem | string,\n): TItem {\n if (typeof item === 'object') return item\n\n return {\n id: item,\n label: item,\n } as TItem\n}\n\nexport function normalizeLabelItemInput<TItem extends ItemWithLabel>(\n item: TItem | string,\n): TItem {\n if (typeof item === 'object') return item\n\n return {\n label: item,\n } as TItem\n}\n","import { isRecord } from './records'\nexport type PluginIconFormat = 'path' | 'data-url' | 'asset-url' | 'structured' | 'fallback'\n\nexport interface StructuredPluginIconStop {\n offset: string\n color: string\n opacity?: number\n}\n\nexport interface StructuredPluginIconBackground {\n fill: string\n radius: number\n}\n\nexport interface StructuredPluginIconPath {\n d: string\n fill?: string\n stroke?: string\n strokeWidth?: number\n opacity?: number\n}\n\nexport interface StructuredPluginIcon {\n type: 'mint-icon'\n viewBox: string\n background?: StructuredPluginIconBackground\n gradient?: {\n type: 'linear'\n angle: number\n stops: StructuredPluginIconStop[]\n }\n paths: StructuredPluginIconPath[]\n}\n\nexport interface DetectedPluginIcon {\n format: PluginIconFormat\n value: string | StructuredPluginIcon\n}\n\n// MINT canonical plugin placeholder — page-with-corner-fold glyph.\nexport const PLUGIN_ICON_FALLBACK_PATH = 'M14 7v4a1 1 0 0 0 1 1h4M5 3h9l5 5v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z'\n\nconst PATH_REGEX = /^[Mm][\\s,\\d\\-.]/\nconst RASTER_DATA_URL_REGEX = /^data:image\\/(png|jpeg|jpg|gif|webp);/\nconst SAME_ORIGIN_ASSET_URL_REGEX = /^\\/(?!\\/)[^\\s?#]+\\.(?:svg|png|jpe?g|gif|webp)(?:[?#].*)?$/i\nconst VIEW_BOX_REGEX = /^-?\\d+(?:\\.\\d+)?\\s+-?\\d+(?:\\.\\d+)?\\s+\\d+(?:\\.\\d+)?\\s+\\d+(?:\\.\\d+)?$/\nconst COLOR_REGEX = /^(#(?:[0-9a-f]{3}|[0-9a-f]{4}|[0-9a-f]{6}|[0-9a-f]{8})|currentColor|white|black|none)$/i\nconst MAX_STRUCTURED_ICON_LENGTH = 8000\nconst MAX_PATHS = 8\nconst MAX_STOPS = 8\n\nexport function normalizePluginIconSource(icon?: string): string {\n return (icon ?? '').replace(/^[\\s]+/, '')\n}\n\nexport function detectPluginIcon(icon?: string): DetectedPluginIcon {\n const raw = normalizePluginIconSource(icon)\n if (!raw) return { format: 'fallback', value: PLUGIN_ICON_FALLBACK_PATH }\n const structured = parseStructuredPluginIcon(raw)\n if (structured) return { format: 'structured', value: structured }\n if (PATH_REGEX.test(raw)) return { format: 'path', value: raw }\n if (RASTER_DATA_URL_REGEX.test(raw)) return { format: 'data-url', value: raw }\n if (raw.startsWith('https://') || SAME_ORIGIN_ASSET_URL_REGEX.test(raw)) {\n return { format: 'asset-url', value: raw }\n }\n return { format: 'fallback', value: PLUGIN_ICON_FALLBACK_PATH }\n}\n\nexport function isPluginIconFormat(icon?: string): boolean {\n const raw = normalizePluginIconSource(icon)\n return !!raw && detectPluginIcon(raw).format !== 'fallback'\n}\n\nfunction parseStructuredPluginIcon(raw: string): StructuredPluginIcon | undefined {\n if (!raw.startsWith('{') || raw.length > MAX_STRUCTURED_ICON_LENGTH) return undefined\n\n let parsed: unknown\n try {\n parsed = JSON.parse(raw)\n } catch {\n return undefined\n }\n\n if (!isRecord(parsed) || parsed.type !== 'mint-icon') return undefined\n\n const viewBox = typeof parsed.viewBox === 'string' && VIEW_BOX_REGEX.test(parsed.viewBox)\n ? parsed.viewBox\n : '0 0 24 24'\n\n const paths = parseStructuredPaths(parsed.paths)\n if (!paths.length) return undefined\n\n const gradient = parseStructuredGradient(parsed.gradient)\n const background = parseStructuredBackground(parsed.background, gradient)\n\n return {\n type: 'mint-icon',\n viewBox,\n ...(background ? { background } : {}),\n ...(gradient ? { gradient } : {}),\n paths,\n }\n}\n\nfunction parseStructuredPaths(value: unknown): StructuredPluginIconPath[] {\n if (!Array.isArray(value)) return []\n\n return value.slice(0, MAX_PATHS).flatMap((item) => {\n if (!isRecord(item) || typeof item.d !== 'string' || !item.d.trim()) return []\n const path: StructuredPluginIconPath = { d: item.d.slice(0, 2000) }\n if (isSafeColor(item.fill)) path.fill = item.fill\n if (isSafeColor(item.stroke)) path.stroke = item.stroke\n if (isFiniteNumber(item.strokeWidth, 0, 24)) path.strokeWidth = item.strokeWidth\n if (isFiniteNumber(item.opacity, 0, 1)) path.opacity = item.opacity\n return [path]\n })\n}\n\nfunction parseStructuredGradient(value: unknown): StructuredPluginIcon['gradient'] | undefined {\n if (!isRecord(value) || value.type !== 'linear') return undefined\n\n const stops = parseStructuredStops(value.stops)\n if (stops.length < 2 && isSafeColor(value.from) && isSafeColor(value.to)) {\n stops.push(\n { offset: '0%', color: value.from },\n { offset: '100%', color: value.to },\n )\n }\n if (stops.length < 2) return undefined\n\n return {\n type: 'linear',\n angle: isFiniteNumber(value.angle, 0, 360) ? value.angle : 135,\n stops,\n }\n}\n\nfunction parseStructuredStops(value: unknown): StructuredPluginIconStop[] {\n if (!Array.isArray(value)) return []\n\n return value.slice(0, MAX_STOPS).flatMap((item) => {\n if (!isRecord(item) || !isSafeColor(item.color)) return []\n\n const offset = parseOffset(item.offset)\n if (!offset) return []\n\n return [{\n offset,\n color: item.color,\n ...(isFiniteNumber(item.opacity, 0, 1) ? { opacity: item.opacity } : {}),\n }]\n })\n}\n\nfunction parseStructuredBackground(\n value: unknown,\n gradient: StructuredPluginIcon['gradient'] | undefined,\n): StructuredPluginIconBackground | undefined {\n if (!isRecord(value)) return undefined\n\n const fill = value.fill === 'gradient' && gradient\n ? 'gradient'\n : isSafeColor(value.fill)\n ? value.fill\n : undefined\n if (!fill) return undefined\n\n return {\n fill,\n radius: isFiniteNumber(value.radius, 0, 12) ? value.radius : 5,\n }\n}\n\nfunction parseOffset(value: unknown): string | undefined {\n if (isFiniteNumber(value, 0, 1)) return String(value)\n if (typeof value !== 'string') return undefined\n if (/^(?:100|(?:[1-9]?\\d)(?:\\.\\d+)?)%$/.test(value)) return value\n return undefined\n}\n\n\nfunction isSafeColor(value: unknown): value is string {\n return typeof value === 'string' && COLOR_REGEX.test(value)\n}\n\nfunction isFiniteNumber(value: unknown, min: number, max: number): value is number {\n return typeof value === 'number' && Number.isFinite(value) && value >= min && value <= max\n}\n","<script setup lang=\"ts\">\n/** Private routable action primitive for SDK nav and menu components. */\ndefineOptions({ inheritAttrs: false })\n\ninterface Props {\n href?: string\n to?: string | Record<string, unknown>\n disabled?: boolean\n type?: 'button' | 'submit' | 'reset'\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n disabled: false,\n type: 'button',\n})\n\nconst emit = defineEmits<{\n click: [event: MouseEvent]\n}>()\n\ntype RouterNavigate = (event?: MouseEvent) => unknown\n\nfunction blockDisabledEvent(event: MouseEvent) {\n event.preventDefault()\n event.stopImmediatePropagation()\n}\n\nfunction handleClick(event: MouseEvent) {\n if (props.disabled) {\n blockDisabledEvent(event)\n return\n }\n emit('click', event)\n}\n\nfunction handleRouterClick(event: MouseEvent, navigate: RouterNavigate) {\n if (props.disabled) {\n blockDisabledEvent(event)\n return\n }\n emit('click', event)\n void navigate(event)\n}\n</script>\n\n<template>\n <a\n v-if=\"href\"\n v-bind=\"$attrs\"\n :href=\"disabled ? undefined : href\"\n :aria-disabled=\"disabled || undefined\"\n :tabindex=\"disabled ? -1 : undefined\"\n @click=\"handleClick\"\n >\n <slot />\n </a>\n <router-link\n v-else-if=\"to\"\n :to=\"to\"\n custom\n v-slot=\"{ href: routerHref, navigate }\"\n >\n <a\n v-bind=\"$attrs\"\n :href=\"disabled ? undefined : routerHref\"\n :aria-disabled=\"disabled || undefined\"\n :tabindex=\"disabled ? -1 : undefined\"\n @click=\"handleRouterClick($event, navigate)\"\n >\n <slot />\n </a>\n </router-link>\n <button\n v-else\n v-bind=\"$attrs\"\n :type=\"type\"\n :disabled=\"disabled\"\n @click=\"handleClick\"\n >\n <slot />\n </button>\n</template>\n","<script setup lang=\"ts\">\n/** Private routable action primitive for SDK nav and menu components. */\ndefineOptions({ inheritAttrs: false })\n\ninterface Props {\n href?: string\n to?: string | Record<string, unknown>\n disabled?: boolean\n type?: 'button' | 'submit' | 'reset'\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n disabled: false,\n type: 'button',\n})\n\nconst emit = defineEmits<{\n click: [event: MouseEvent]\n}>()\n\ntype RouterNavigate = (event?: MouseEvent) => unknown\n\nfunction blockDisabledEvent(event: MouseEvent) {\n event.preventDefault()\n event.stopImmediatePropagation()\n}\n\nfunction handleClick(event: MouseEvent) {\n if (props.disabled) {\n blockDisabledEvent(event)\n return\n }\n emit('click', event)\n}\n\nfunction handleRouterClick(event: MouseEvent, navigate: RouterNavigate) {\n if (props.disabled) {\n blockDisabledEvent(event)\n return\n }\n emit('click', event)\n void navigate(event)\n}\n</script>\n\n<template>\n <a\n v-if=\"href\"\n v-bind=\"$attrs\"\n :href=\"disabled ? undefined : href\"\n :aria-disabled=\"disabled || undefined\"\n :tabindex=\"disabled ? -1 : undefined\"\n @click=\"handleClick\"\n >\n <slot />\n </a>\n <router-link\n v-else-if=\"to\"\n :to=\"to\"\n custom\n v-slot=\"{ href: routerHref, navigate }\"\n >\n <a\n v-bind=\"$attrs\"\n :href=\"disabled ? undefined : routerHref\"\n :aria-disabled=\"disabled || undefined\"\n :tabindex=\"disabled ? -1 : undefined\"\n @click=\"handleRouterClick($event, navigate)\"\n >\n <slot />\n </a>\n </router-link>\n <button\n v-else\n v-bind=\"$attrs\"\n :type=\"type\"\n :disabled=\"disabled\"\n @click=\"handleClick\"\n >\n <slot />\n </button>\n</template>\n","<script setup lang=\"ts\">\n/** Renders a plugin's icon as a sized chip. Auto-detects format:\n * - Structured MINT icon JSON ({\"type\":\"mint-icon\",...}) → controlled multi-color SVG\n * - SVG path data (e.g. \"M13 10V3...\") → inline <svg><path>\n * - Raster data URL (data:image/png|jpeg|jpg|gif|webp;...) → <img>\n * - https:// URL or root-relative static image/SVG asset → <img> with no-referrer + lazy loading\n * - Anything else → MINT canonical plugin placeholder path\n *\n * http://, protocol-relative, and data:image/svg+xml URLs are deliberately rejected\n * (mixed-content + XSS, see spec 2026-05-04-plugin-icon-component-design.md). */\nimport { computed } from 'vue'\nimport type { Tone } from '../types'\nimport { detectPluginIcon, type DetectedPluginIcon, type StructuredPluginIcon } from '../utils/pluginIcon'\n\ndefineOptions({ name: 'PluginIcon' })\n\ninterface Props {\n icon?: string\n size?: 'sm' | 'md' | 'topbar' | 'lg'\n variant?: 'solid' | 'tinted'\n /** @deprecated v2 design: the tile is always the neutral accent-soft tile, so the tone has no visible effect. Removed in 1.5. */\n tone?: Tone\n /** @deprecated v2 design: the tile is always the neutral accent-soft tile, so the color has no visible effect. Removed in 1.5. */\n color?: string\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n size: 'md',\n variant: 'solid',\n})\n\nconst detected = computed<DetectedPluginIcon>(() => detectPluginIcon(props.icon))\nconst structuredIcon = computed<StructuredPluginIcon | undefined>(() =>\n detected.value.format === 'structured' ? detected.value.value as StructuredPluginIcon : undefined,\n)\nconst iconValue = computed<string>(() =>\n typeof detected.value.value === 'string' ? detected.value.value : '',\n)\n\nconst gradientId = computed(() => {\n const source = props.icon ?? ''\n let hash = 0\n for (let index = 0; index < source.length; index += 1) {\n hash = ((hash << 5) - hash + source.charCodeAt(index)) | 0\n }\n return `mint-plugin-icon-gradient-${Math.abs(hash)}`\n})\n\nconst gradientCoords = computed(() => {\n const angle = structuredIcon.value?.gradient?.angle ?? 135\n const radians = (angle - 90) * Math.PI / 180\n const x = Math.cos(radians) * 50\n const y = Math.sin(radians) * 50\n\n return {\n x1: `${50 - x}%`,\n y1: `${50 - y}%`,\n x2: `${50 + x}%`,\n y2: `${50 + y}%`,\n }\n})\n\nconst structuredViewBox = computed(() => {\n const parts = structuredIcon.value?.viewBox.split(/\\s+/).map(Number) ?? [0, 0, 24, 24]\n return {\n x: parts[0],\n y: parts[1],\n width: parts[2],\n height: parts[3],\n }\n})\n\nconst backgroundFill = computed(() =>\n structuredIcon.value?.background?.fill === 'gradient'\n ? `url(#${gradientId.value})`\n : structuredIcon.value?.background?.fill,\n)\n\nconst rootClasses = computed(() => [\n 'mint-plugin-icon',\n `mint-plugin-icon--${props.size}`,\n `mint-plugin-icon--${props.variant}`,\n props.tone ? `mint-plugin-icon--${props.tone}` : '',\n])\n\nconst rootStyle = computed(() =>\n props.color ? { '--mint-plugin-icon-tone': props.color } : undefined,\n)\n</script>\n\n<template>\n <span :class=\"rootClasses\" :style=\"rootStyle\">\n <svg\n v-if=\"structuredIcon\"\n class=\"mint-plugin-icon__svg mint-plugin-icon__svg--structured\"\n :viewBox=\"structuredIcon.viewBox\"\n aria-hidden=\"true\"\n >\n <defs v-if=\"structuredIcon.gradient\">\n <linearGradient\n :id=\"gradientId\"\n :x1=\"gradientCoords.x1\"\n :y1=\"gradientCoords.y1\"\n :x2=\"gradientCoords.x2\"\n :y2=\"gradientCoords.y2\"\n >\n <stop\n v-for=\"stop in structuredIcon.gradient.stops\"\n :key=\"`${stop.offset}-${stop.color}`\"\n :offset=\"stop.offset\"\n :stop-color=\"stop.color\"\n :stop-opacity=\"stop.opacity\"\n />\n </linearGradient>\n </defs>\n <rect\n v-if=\"structuredIcon.background\"\n :x=\"structuredViewBox.x\"\n :y=\"structuredViewBox.y\"\n :width=\"structuredViewBox.width\"\n :height=\"structuredViewBox.height\"\n :rx=\"structuredIcon.background.radius\"\n :fill=\"backgroundFill\"\n />\n <path\n v-for=\"(path, index) in structuredIcon.paths\"\n :key=\"index\"\n :d=\"path.d\"\n :fill=\"path.fill ?? 'none'\"\n :stroke=\"path.stroke\"\n :stroke-width=\"path.strokeWidth\"\n :opacity=\"path.opacity\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n <svg\n v-else-if=\"detected.format === 'path' || detected.format === 'fallback'\"\n class=\"mint-plugin-icon__svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path :d=\"iconValue\" />\n </svg>\n <img\n v-else\n class=\"mint-plugin-icon__img\"\n :src=\"iconValue\"\n alt=\"\"\n referrerpolicy=\"no-referrer\"\n loading=\"lazy\"\n />\n </span>\n</template>\n","<script setup lang=\"ts\">\n/** Renders a plugin's icon as a sized chip. Auto-detects format:\n * - Structured MINT icon JSON ({\"type\":\"mint-icon\",...}) → controlled multi-color SVG\n * - SVG path data (e.g. \"M13 10V3...\") → inline <svg><path>\n * - Raster data URL (data:image/png|jpeg|jpg|gif|webp;...) → <img>\n * - https:// URL or root-relative static image/SVG asset → <img> with no-referrer + lazy loading\n * - Anything else → MINT canonical plugin placeholder path\n *\n * http://, protocol-relative, and data:image/svg+xml URLs are deliberately rejected\n * (mixed-content + XSS, see spec 2026-05-04-plugin-icon-component-design.md). */\nimport { computed } from 'vue'\nimport type { Tone } from '../types'\nimport { detectPluginIcon, type DetectedPluginIcon, type StructuredPluginIcon } from '../utils/pluginIcon'\n\ndefineOptions({ name: 'PluginIcon' })\n\ninterface Props {\n icon?: string\n size?: 'sm' | 'md' | 'topbar' | 'lg'\n variant?: 'solid' | 'tinted'\n /** @deprecated v2 design: the tile is always the neutral accent-soft tile, so the tone has no visible effect. Removed in 1.5. */\n tone?: Tone\n /** @deprecated v2 design: the tile is always the neutral accent-soft tile, so the color has no visible effect. Removed in 1.5. */\n color?: string\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n size: 'md',\n variant: 'solid',\n})\n\nconst detected = computed<DetectedPluginIcon>(() => detectPluginIcon(props.icon))\nconst structuredIcon = computed<StructuredPluginIcon | undefined>(() =>\n detected.value.format === 'structured' ? detected.value.value as StructuredPluginIcon : undefined,\n)\nconst iconValue = computed<string>(() =>\n typeof detected.value.value === 'string' ? detected.value.value : '',\n)\n\nconst gradientId = computed(() => {\n const source = props.icon ?? ''\n let hash = 0\n for (let index = 0; index < source.length; index += 1) {\n hash = ((hash << 5) - hash + source.charCodeAt(index)) | 0\n }\n return `mint-plugin-icon-gradient-${Math.abs(hash)}`\n})\n\nconst gradientCoords = computed(() => {\n const angle = structuredIcon.value?.gradient?.angle ?? 135\n const radians = (angle - 90) * Math.PI / 180\n const x = Math.cos(radians) * 50\n const y = Math.sin(radians) * 50\n\n return {\n x1: `${50 - x}%`,\n y1: `${50 - y}%`,\n x2: `${50 + x}%`,\n y2: `${50 + y}%`,\n }\n})\n\nconst structuredViewBox = computed(() => {\n const parts = structuredIcon.value?.viewBox.split(/\\s+/).map(Number) ?? [0, 0, 24, 24]\n return {\n x: parts[0],\n y: parts[1],\n width: parts[2],\n height: parts[3],\n }\n})\n\nconst backgroundFill = computed(() =>\n structuredIcon.value?.background?.fill === 'gradient'\n ? `url(#${gradientId.value})`\n : structuredIcon.value?.background?.fill,\n)\n\nconst rootClasses = computed(() => [\n 'mint-plugin-icon',\n `mint-plugin-icon--${props.size}`,\n `mint-plugin-icon--${props.variant}`,\n props.tone ? `mint-plugin-icon--${props.tone}` : '',\n])\n\nconst rootStyle = computed(() =>\n props.color ? { '--mint-plugin-icon-tone': props.color } : undefined,\n)\n</script>\n\n<template>\n <span :class=\"rootClasses\" :style=\"rootStyle\">\n <svg\n v-if=\"structuredIcon\"\n class=\"mint-plugin-icon__svg mint-plugin-icon__svg--structured\"\n :viewBox=\"structuredIcon.viewBox\"\n aria-hidden=\"true\"\n >\n <defs v-if=\"structuredIcon.gradient\">\n <linearGradient\n :id=\"gradientId\"\n :x1=\"gradientCoords.x1\"\n :y1=\"gradientCoords.y1\"\n :x2=\"gradientCoords.x2\"\n :y2=\"gradientCoords.y2\"\n >\n <stop\n v-for=\"stop in structuredIcon.gradient.stops\"\n :key=\"`${stop.offset}-${stop.color}`\"\n :offset=\"stop.offset\"\n :stop-color=\"stop.color\"\n :stop-opacity=\"stop.opacity\"\n />\n </linearGradient>\n </defs>\n <rect\n v-if=\"structuredIcon.background\"\n :x=\"structuredViewBox.x\"\n :y=\"structuredViewBox.y\"\n :width=\"structuredViewBox.width\"\n :height=\"structuredViewBox.height\"\n :rx=\"structuredIcon.background.radius\"\n :fill=\"backgroundFill\"\n />\n <path\n v-for=\"(path, index) in structuredIcon.paths\"\n :key=\"index\"\n :d=\"path.d\"\n :fill=\"path.fill ?? 'none'\"\n :stroke=\"path.stroke\"\n :stroke-width=\"path.strokeWidth\"\n :opacity=\"path.opacity\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n <svg\n v-else-if=\"detected.format === 'path' || detected.format === 'fallback'\"\n class=\"mint-plugin-icon__svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path :d=\"iconValue\" />\n </svg>\n <img\n v-else\n class=\"mint-plugin-icon__img\"\n :src=\"iconValue\"\n alt=\"\"\n referrerpolicy=\"no-referrer\"\n loading=\"lazy\"\n />\n </span>\n</template>\n","<script setup lang=\"ts\">\n/** \"Plugin / page\" switcher: the plugin name, then a trigger that opens the page menu (hints, number keys 1-9). */\nimport { computed, nextTick, useTemplateRef } from 'vue'\nimport { useDropdownState } from '../../composables/useDropdownState'\nimport { useMenuKeyboard } from '../../composables/useMenuKeyboard'\nimport type { PageSelectorItem, PageSelectorItemInput } from '../../types/components'\nimport { normalizeItemInput } from '../../utils/items'\nimport { isPluginIconFormat } from '../../utils/pluginIcon'\nimport ActionItemInternal from './ActionItemInternal.vue'\nimport PluginIcon from '../PluginIcon.vue'\n\ninterface Props {\n pages: PageSelectorItemInput[]\n currentPageId?: string\n placeholder?: string\n minWidth?: string\n /** Plugin name shown before the trigger and in the menu title. */\n pluginName?: string\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n placeholder: 'Go to…',\n})\n\nconst emit = defineEmits<{\n select: [page: PageSelectorItem]\n}>()\n\nconst triggerEl = useTemplateRef<HTMLElement>('trigger')\nconst menuEl = useTemplateRef<HTMLElement>('menu')\nconst { isOpen, open, close, toggle } = useDropdownState({\n rootRef: useTemplateRef<HTMLElement>('root'),\n triggerRef: triggerEl,\n})\nconst normalizedPages = computed<PageSelectorItem[]>(() => props.pages.map(normalizeItemInput))\nconst menuTitle = computed(() => (props.pluginName ? `${props.pluginName} pages` : 'Pages'))\n\nconst current = computed<PageSelectorItem | undefined>(() =>\n normalizedPages.value.find((p) => p.id === props.currentPageId) ?? normalizedPages.value[0],\n)\n\nconst rows = () => Array.from(menuEl.value?.querySelectorAll<HTMLElement>('[role=\"menuitem\"]') ?? [])\nconst isEnabled = (row: HTMLElement) => !row.hasAttribute('disabled') && row.getAttribute('aria-disabled') !== 'true'\nconst enabledRows = () => rows().filter(isEnabled)\n\nconst { handlePanelKeydown } = useMenuKeyboard({\n items: enabledRows,\n isOpen: () => isOpen.value,\n open,\n close,\n})\n\nfunction handleTriggerKeydown(event: KeyboardEvent) {\n if (isOpen.value || !['ArrowDown', 'Enter', ' '].includes(event.key)) return\n event.preventDefault()\n open()\n void nextTick(() => {\n const items = enabledRows()\n ;(items.find((row) => row.getAttribute('aria-current') === 'page') ?? items[0])?.focus()\n })\n}\n\n// A click routes through ActionItemInternal, so links, router links and disabled rows act as on a pointer click.\nfunction activate(row: HTMLElement) {\n row.click()\n if (!isOpen.value) triggerEl.value?.focus()\n}\n\nfunction handleMenuKeydown(event: KeyboardEvent) {\n if (/^[1-9]$/.test(event.key)) {\n event.preventDefault()\n const row = rows()[Number(event.key) - 1]\n if (row && isEnabled(row)) activate(row)\n return\n }\n const focused = document.activeElement as HTMLElement | null\n if ((event.key === 'Enter' || event.key === ' ') && focused && enabledRows().includes(focused)) {\n event.preventDefault()\n activate(focused)\n return\n }\n handlePanelKeydown(event)\n}\n\nfunction handleSelect(page: PageSelectorItem) {\n if (page.disabled) return\n if (page.href || page.to) {\n close()\n return\n }\n emit('select', page)\n close()\n}\n</script>\n\n<template>\n <div ref=\"root\" class=\"mint-page-selector__crumb\">\n <template v-if=\"pluginName\">\n <span class=\"mint-page-selector__plugin\">{{ pluginName }}</span>\n <span class=\"mint-page-selector__slash\" aria-hidden=\"true\">/</span>\n </template>\n <div class=\"mint-page-selector\" :style=\"minWidth ? { minWidth } : undefined\">\n <button\n ref=\"trigger\"\n type=\"button\"\n class=\"mint-page-selector__trigger\"\n :class=\"{ 'mint-page-selector__trigger--open': isOpen }\"\n :aria-expanded=\"isOpen\"\n aria-haspopup=\"menu\"\n @click.stop=\"toggle\"\n @keydown=\"handleTriggerKeydown\"\n >\n <span\n v-if=\"current\"\n class=\"mint-page-selector__icon\"\n :class=\"{ 'mint-page-selector__icon--metadata': isPluginIconFormat(current.icon) }\"\n >\n <slot name=\"icon\" :page=\"current\">\n <PluginIcon\n v-if=\"isPluginIconFormat(current.icon)\"\n class=\"mint-page-selector__trigger-metadata-icon\"\n :icon=\"current.icon\"\n size=\"sm\"\n variant=\"solid\"\n />\n <span v-else class=\"mint-page-selector__icon-fallback\">{{ current.label.charAt(0) }}</span>\n </slot>\n </span>\n <span class=\"mint-page-selector__label\">{{ current?.label ?? placeholder }}</span>\n <span class=\"mint-page-selector__chevron-wrap\" aria-hidden=\"true\">\n <svg\n class=\"mint-page-selector__chevron\"\n :class=\"{ 'mint-page-selector__chevron--open': isOpen }\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </span>\n </button>\n\n <div\n v-if=\"isOpen\"\n ref=\"menu\"\n class=\"mint-page-selector__menu\"\n role=\"menu\"\n :aria-label=\"menuTitle\"\n @keydown=\"handleMenuKeydown\"\n >\n <div class=\"mint-page-selector__menu-title\" aria-hidden=\"true\">{{ menuTitle }}</div>\n <ActionItemInternal\n v-for=\"(page, index) in normalizedPages\"\n :key=\"page.id\"\n :href=\"page.href\"\n :to=\"page.to\"\n :disabled=\"page.disabled\"\n :class=\"[\n 'mint-page-selector__item',\n { 'mint-page-selector__item--active': page.id === current?.id },\n { 'mint-page-selector__item--disabled': page.disabled },\n ]\"\n role=\"menuitem\"\n :aria-current=\"page.id === current?.id ? 'page' : undefined\"\n :aria-keyshortcuts=\"index < 9 ? String(index + 1) : undefined\"\n @click=\"handleSelect(page)\"\n >\n <span\n class=\"mint-page-selector__item-icon\"\n :class=\"{ 'mint-page-selector__item-icon--metadata': isPluginIconFormat(page.icon) }\"\n >\n <slot name=\"item-icon\" :page=\"page\">\n <PluginIcon\n v-if=\"isPluginIconFormat(page.icon)\"\n class=\"mint-page-selector__metadata-icon\"\n :icon=\"page.icon\"\n size=\"sm\"\n variant=\"solid\"\n />\n <span v-else class=\"mint-page-selector__icon-fallback\">{{ page.label.charAt(0) }}</span>\n </slot>\n </span>\n <span class=\"mint-page-selector__item-text\">\n <span class=\"mint-page-selector__item-label\">{{ page.label }}</span>\n <span v-if=\"page.hint\" class=\"mint-page-selector__item-hint\">{{ page.hint }}</span>\n </span>\n <span v-if=\"index < 9\" class=\"mint-page-selector__item-key\" aria-hidden=\"true\">{{ index + 1 }}</span>\n </ActionItemInternal>\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** \"Plugin / page\" switcher: the plugin name, then a trigger that opens the page menu (hints, number keys 1-9). */\nimport { computed, nextTick, useTemplateRef } from 'vue'\nimport { useDropdownState } from '../../composables/useDropdownState'\nimport { useMenuKeyboard } from '../../composables/useMenuKeyboard'\nimport type { PageSelectorItem, PageSelectorItemInput } from '../../types/components'\nimport { normalizeItemInput } from '../../utils/items'\nimport { isPluginIconFormat } from '../../utils/pluginIcon'\nimport ActionItemInternal from './ActionItemInternal.vue'\nimport PluginIcon from '../PluginIcon.vue'\n\ninterface Props {\n pages: PageSelectorItemInput[]\n currentPageId?: string\n placeholder?: string\n minWidth?: string\n /** Plugin name shown before the trigger and in the menu title. */\n pluginName?: string\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n placeholder: 'Go to…',\n})\n\nconst emit = defineEmits<{\n select: [page: PageSelectorItem]\n}>()\n\nconst triggerEl = useTemplateRef<HTMLElement>('trigger')\nconst menuEl = useTemplateRef<HTMLElement>('menu')\nconst { isOpen, open, close, toggle } = useDropdownState({\n rootRef: useTemplateRef<HTMLElement>('root'),\n triggerRef: triggerEl,\n})\nconst normalizedPages = computed<PageSelectorItem[]>(() => props.pages.map(normalizeItemInput))\nconst menuTitle = computed(() => (props.pluginName ? `${props.pluginName} pages` : 'Pages'))\n\nconst current = computed<PageSelectorItem | undefined>(() =>\n normalizedPages.value.find((p) => p.id === props.currentPageId) ?? normalizedPages.value[0],\n)\n\nconst rows = () => Array.from(menuEl.value?.querySelectorAll<HTMLElement>('[role=\"menuitem\"]') ?? [])\nconst isEnabled = (row: HTMLElement) => !row.hasAttribute('disabled') && row.getAttribute('aria-disabled') !== 'true'\nconst enabledRows = () => rows().filter(isEnabled)\n\nconst { handlePanelKeydown } = useMenuKeyboard({\n items: enabledRows,\n isOpen: () => isOpen.value,\n open,\n close,\n})\n\nfunction handleTriggerKeydown(event: KeyboardEvent) {\n if (isOpen.value || !['ArrowDown', 'Enter', ' '].includes(event.key)) return\n event.preventDefault()\n open()\n void nextTick(() => {\n const items = enabledRows()\n ;(items.find((row) => row.getAttribute('aria-current') === 'page') ?? items[0])?.focus()\n })\n}\n\n// A click routes through ActionItemInternal, so links, router links and disabled rows act as on a pointer click.\nfunction activate(row: HTMLElement) {\n row.click()\n if (!isOpen.value) triggerEl.value?.focus()\n}\n\nfunction handleMenuKeydown(event: KeyboardEvent) {\n if (/^[1-9]$/.test(event.key)) {\n event.preventDefault()\n const row = rows()[Number(event.key) - 1]\n if (row && isEnabled(row)) activate(row)\n return\n }\n const focused = document.activeElement as HTMLElement | null\n if ((event.key === 'Enter' || event.key === ' ') && focused && enabledRows().includes(focused)) {\n event.preventDefault()\n activate(focused)\n return\n }\n handlePanelKeydown(event)\n}\n\nfunction handleSelect(page: PageSelectorItem) {\n if (page.disabled) return\n if (page.href || page.to) {\n close()\n return\n }\n emit('select', page)\n close()\n}\n</script>\n\n<template>\n <div ref=\"root\" class=\"mint-page-selector__crumb\">\n <template v-if=\"pluginName\">\n <span class=\"mint-page-selector__plugin\">{{ pluginName }}</span>\n <span class=\"mint-page-selector__slash\" aria-hidden=\"true\">/</span>\n </template>\n <div class=\"mint-page-selector\" :style=\"minWidth ? { minWidth } : undefined\">\n <button\n ref=\"trigger\"\n type=\"button\"\n class=\"mint-page-selector__trigger\"\n :class=\"{ 'mint-page-selector__trigger--open': isOpen }\"\n :aria-expanded=\"isOpen\"\n aria-haspopup=\"menu\"\n @click.stop=\"toggle\"\n @keydown=\"handleTriggerKeydown\"\n >\n <span\n v-if=\"current\"\n class=\"mint-page-selector__icon\"\n :class=\"{ 'mint-page-selector__icon--metadata': isPluginIconFormat(current.icon) }\"\n >\n <slot name=\"icon\" :page=\"current\">\n <PluginIcon\n v-if=\"isPluginIconFormat(current.icon)\"\n class=\"mint-page-selector__trigger-metadata-icon\"\n :icon=\"current.icon\"\n size=\"sm\"\n variant=\"solid\"\n />\n <span v-else class=\"mint-page-selector__icon-fallback\">{{ current.label.charAt(0) }}</span>\n </slot>\n </span>\n <span class=\"mint-page-selector__label\">{{ current?.label ?? placeholder }}</span>\n <span class=\"mint-page-selector__chevron-wrap\" aria-hidden=\"true\">\n <svg\n class=\"mint-page-selector__chevron\"\n :class=\"{ 'mint-page-selector__chevron--open': isOpen }\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </span>\n </button>\n\n <div\n v-if=\"isOpen\"\n ref=\"menu\"\n class=\"mint-page-selector__menu\"\n role=\"menu\"\n :aria-label=\"menuTitle\"\n @keydown=\"handleMenuKeydown\"\n >\n <div class=\"mint-page-selector__menu-title\" aria-hidden=\"true\">{{ menuTitle }}</div>\n <ActionItemInternal\n v-for=\"(page, index) in normalizedPages\"\n :key=\"page.id\"\n :href=\"page.href\"\n :to=\"page.to\"\n :disabled=\"page.disabled\"\n :class=\"[\n 'mint-page-selector__item',\n { 'mint-page-selector__item--active': page.id === current?.id },\n { 'mint-page-selector__item--disabled': page.disabled },\n ]\"\n role=\"menuitem\"\n :aria-current=\"page.id === current?.id ? 'page' : undefined\"\n :aria-keyshortcuts=\"index < 9 ? String(index + 1) : undefined\"\n @click=\"handleSelect(page)\"\n >\n <span\n class=\"mint-page-selector__item-icon\"\n :class=\"{ 'mint-page-selector__item-icon--metadata': isPluginIconFormat(page.icon) }\"\n >\n <slot name=\"item-icon\" :page=\"page\">\n <PluginIcon\n v-if=\"isPluginIconFormat(page.icon)\"\n class=\"mint-page-selector__metadata-icon\"\n :icon=\"page.icon\"\n size=\"sm\"\n variant=\"solid\"\n />\n <span v-else class=\"mint-page-selector__icon-fallback\">{{ page.label.charAt(0) }}</span>\n </slot>\n </span>\n <span class=\"mint-page-selector__item-text\">\n <span class=\"mint-page-selector__item-label\">{{ page.label }}</span>\n <span v-if=\"page.hint\" class=\"mint-page-selector__item-hint\">{{ page.hint }}</span>\n </span>\n <span v-if=\"index < 9\" class=\"mint-page-selector__item-key\" aria-hidden=\"true\">{{ index + 1 }}</span>\n </ActionItemInternal>\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** Horizontal pill-style navigation bar that emits select events and supports href, router-link, button, or dropdown items. */\nimport { computed, ref } from 'vue'\nimport type { PillNavItem, PillNavItemInput, PillNavOption, PillNavOptionInput } from '../../types/components'\nimport { normalizeItemInput } from '../../utils/items'\nimport { useEventListener } from '../../composables/useEventListener'\nimport ActionItemInternal from './ActionItemInternal.vue'\n\ninterface Props {\n items: PillNavItemInput[]\n currentItemId?: string\n}\n\nconst props = defineProps<Props>()\n\nconst emit = defineEmits<{\n select: [item: PillNavItem]\n 'option-select': [option: PillNavOption, item: PillNavItem]\n}>()\n\nconst openItemId = ref<string | null>(null)\nconst itemRefs = ref<Map<string, HTMLElement>>(new Map())\n\n/** The bar shows this many items; the rest fold into a More dropdown. */\nconst MAX_VISIBLE_ITEMS = 4\nconst MORE_ITEM_ID = '__mint-pill-nav-more'\n\nconst allItems = computed<PillNavItem[]>(() => props.items.map(normalizePillNavItem))\n\nconst normalizedItems = computed<PillNavItem[]>(() => {\n if (allItems.value.length <= MAX_VISIBLE_ITEMS) return allItems.value\n const folded = allItems.value.slice(MAX_VISIBLE_ITEMS)\n return [\n ...allItems.value.slice(0, MAX_VISIBLE_ITEMS),\n {\n id: MORE_ITEM_ID,\n label: 'More',\n dot: folded.some(item => item.dot),\n // A folded group contributes its options; a plain item becomes one option.\n children: folded.flatMap(item => item.children?.length ? item.children : [item]),\n },\n ]\n})\n\nfunction handleClick(item: PillNavItem) {\n if (item.disabled) return\n if (item.children?.length) {\n toggleDropdown(item.id)\n return\n }\n if (item.href || item.to) return\n emit('select', item)\n}\n\nfunction handleOptionClick(option: PillNavOption, item: PillNavItem) {\n if (option.disabled) return\n openItemId.value = null\n if (option.href || option.to) return\n if (item.id !== MORE_ITEM_ID) {\n emit('option-select', option, item)\n return\n }\n // A folded entry reports as it would from its own pill.\n const folded = allItems.value.find(candidate => candidate.id === option.id && !candidate.children?.length)\n if (folded) {\n emit('select', folded)\n return\n }\n const group = allItems.value.find(candidate => candidate.children?.some(child => child.id === option.id))\n if (group) emit('option-select', option, group)\n}\n\nfunction normalizePillNavItem(item: PillNavItemInput): PillNavItem {\n const normalized = normalizeItemInput<Omit<PillNavItem, 'children'> & { children?: PillNavOptionInput[] }>(item)\n return {\n ...normalized,\n children: normalized.children?.map(normalizeItemInput),\n }\n}\n\nfunction toggleDropdown(itemId: string) {\n openItemId.value = openItemId.value === itemId ? null : itemId\n}\n\nfunction setItemRef(el: HTMLElement | null, itemId: string) {\n if (el) {\n itemRefs.value.set(itemId, el)\n } else {\n itemRefs.value.delete(itemId)\n }\n}\n\nfunction handleClickOutside(event: MouseEvent) {\n const target = event.target as Node\n const clickedInside = Array.from(itemRefs.value.values()).some(el => el.contains(target))\n if (!clickedInside) openItemId.value = null\n}\n\nconst activeChild = (item: PillNavItem) =>\n item.children?.find(child => child.id === props.currentItemId)\n\nfunction isSvgIcon(icon: PillNavItem['icon']): icon is string | string[] {\n if (!icon) return false\n return Array.isArray(icon) || icon.startsWith('M') || icon.startsWith('m')\n}\n\nuseEventListener(() => document, 'click', handleClickOutside)\n</script>\n\n<template>\n <nav class=\"mint-pill-nav\" aria-label=\"Primary\">\n <div\n v-for=\"item in normalizedItems\"\n :key=\"item.id\"\n :ref=\"(el) => setItemRef(el as HTMLElement | null, item.id)\"\n class=\"mint-pill-nav__item-wrap\"\n >\n <button\n v-if=\"item.children?.length\"\n type=\"button\"\n :class=\"[\n 'mint-pill-nav__item',\n { 'mint-pill-nav__item--active': item.id === currentItemId || activeChild(item) !== undefined },\n { 'mint-pill-nav__item--disabled': item.disabled },\n ]\"\n :disabled=\"item.disabled\"\n :aria-expanded=\"openItemId === item.id\"\n aria-haspopup=\"menu\"\n @click.stop=\"handleClick(item)\"\n >\n <svg\n v-if=\"isSvgIcon(item.icon)\"\n class=\"mint-pill-nav__icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <template v-if=\"Array.isArray(item.icon)\">\n <path v-for=\"(d, index) in item.icon\" :key=\"index\" :d=\"d\" />\n </template>\n <path v-else :d=\"item.icon\" />\n </svg>\n {{ activeChild(item)?.label ?? item.label }}\n <span v-if=\"item.dot\" class=\"mint-pill-nav__dot\" role=\"img\" aria-label=\"Needs attention\" />\n <svg\n class=\"mint-pill-nav__chevron\"\n :class=\"{ 'mint-pill-nav__chevron--open': openItemId === item.id }\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </button>\n\n <ActionItemInternal\n v-else\n :href=\"item.href\"\n :to=\"item.to\"\n :disabled=\"item.disabled\"\n :class=\"[\n 'mint-pill-nav__item',\n { 'mint-pill-nav__item--active': item.id === currentItemId },\n { 'mint-pill-nav__item--disabled': item.disabled },\n ]\"\n @click=\"handleClick(item)\"\n >\n <svg\n v-if=\"isSvgIcon(item.icon)\"\n class=\"mint-pill-nav__icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <template v-if=\"Array.isArray(item.icon)\">\n <path v-for=\"(d, index) in item.icon\" :key=\"index\" :d=\"d\" />\n </template>\n <path v-else :d=\"item.icon\" />\n </svg>\n {{ item.label }}\n <span v-if=\"item.dot\" class=\"mint-pill-nav__dot\" role=\"img\" aria-label=\"Needs attention\" />\n </ActionItemInternal>\n\n <div\n v-if=\"item.children?.length && openItemId === item.id\"\n class=\"mint-popover mint-pill-nav__dropdown\"\n role=\"menu\"\n >\n <ActionItemInternal\n v-for=\"option in item.children\"\n :key=\"option.id\"\n :href=\"option.href\"\n :to=\"option.to\"\n :disabled=\"option.disabled\"\n :class=\"[\n 'mint-menu-item mint-pill-nav__dropdown-item',\n { 'mint-menu-item--selected mint-pill-nav__dropdown-item--active': option.id === currentItemId },\n { 'mint-pill-nav__dropdown-item--disabled': option.disabled },\n ]\"\n role=\"menuitem\"\n @click=\"handleOptionClick(option, item)\"\n >\n <span class=\"mint-pill-nav__dropdown-label\">{{ option.label }}</span>\n <span v-if=\"option.description\" class=\"mint-pill-nav__dropdown-description\">\n {{ option.description }}\n </span>\n <svg class=\"mint-menu-item__check\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M3.5 8.5l3 3 6-7\" />\n </svg>\n </ActionItemInternal>\n </div>\n </div>\n </nav>\n</template>\n","<script setup lang=\"ts\">\n/** Horizontal pill-style navigation bar that emits select events and supports href, router-link, button, or dropdown items. */\nimport { computed, ref } from 'vue'\nimport type { PillNavItem, PillNavItemInput, PillNavOption, PillNavOptionInput } from '../../types/components'\nimport { normalizeItemInput } from '../../utils/items'\nimport { useEventListener } from '../../composables/useEventListener'\nimport ActionItemInternal from './ActionItemInternal.vue'\n\ninterface Props {\n items: PillNavItemInput[]\n currentItemId?: string\n}\n\nconst props = defineProps<Props>()\n\nconst emit = defineEmits<{\n select: [item: PillNavItem]\n 'option-select': [option: PillNavOption, item: PillNavItem]\n}>()\n\nconst openItemId = ref<string | null>(null)\nconst itemRefs = ref<Map<string, HTMLElement>>(new Map())\n\n/** The bar shows this many items; the rest fold into a More dropdown. */\nconst MAX_VISIBLE_ITEMS = 4\nconst MORE_ITEM_ID = '__mint-pill-nav-more'\n\nconst allItems = computed<PillNavItem[]>(() => props.items.map(normalizePillNavItem))\n\nconst normalizedItems = computed<PillNavItem[]>(() => {\n if (allItems.value.length <= MAX_VISIBLE_ITEMS) return allItems.value\n const folded = allItems.value.slice(MAX_VISIBLE_ITEMS)\n return [\n ...allItems.value.slice(0, MAX_VISIBLE_ITEMS),\n {\n id: MORE_ITEM_ID,\n label: 'More',\n dot: folded.some(item => item.dot),\n // A folded group contributes its options; a plain item becomes one option.\n children: folded.flatMap(item => item.children?.length ? item.children : [item]),\n },\n ]\n})\n\nfunction handleClick(item: PillNavItem) {\n if (item.disabled) return\n if (item.children?.length) {\n toggleDropdown(item.id)\n return\n }\n if (item.href || item.to) return\n emit('select', item)\n}\n\nfunction handleOptionClick(option: PillNavOption, item: PillNavItem) {\n if (option.disabled) return\n openItemId.value = null\n if (option.href || option.to) return\n if (item.id !== MORE_ITEM_ID) {\n emit('option-select', option, item)\n return\n }\n // A folded entry reports as it would from its own pill.\n const folded = allItems.value.find(candidate => candidate.id === option.id && !candidate.children?.length)\n if (folded) {\n emit('select', folded)\n return\n }\n const group = allItems.value.find(candidate => candidate.children?.some(child => child.id === option.id))\n if (group) emit('option-select', option, group)\n}\n\nfunction normalizePillNavItem(item: PillNavItemInput): PillNavItem {\n const normalized = normalizeItemInput<Omit<PillNavItem, 'children'> & { children?: PillNavOptionInput[] }>(item)\n return {\n ...normalized,\n children: normalized.children?.map(normalizeItemInput),\n }\n}\n\nfunction toggleDropdown(itemId: string) {\n openItemId.value = openItemId.value === itemId ? null : itemId\n}\n\nfunction setItemRef(el: HTMLElement | null, itemId: string) {\n if (el) {\n itemRefs.value.set(itemId, el)\n } else {\n itemRefs.value.delete(itemId)\n }\n}\n\nfunction handleClickOutside(event: MouseEvent) {\n const target = event.target as Node\n const clickedInside = Array.from(itemRefs.value.values()).some(el => el.contains(target))\n if (!clickedInside) openItemId.value = null\n}\n\nconst activeChild = (item: PillNavItem) =>\n item.children?.find(child => child.id === props.currentItemId)\n\nfunction isSvgIcon(icon: PillNavItem['icon']): icon is string | string[] {\n if (!icon) return false\n return Array.isArray(icon) || icon.startsWith('M') || icon.startsWith('m')\n}\n\nuseEventListener(() => document, 'click', handleClickOutside)\n</script>\n\n<template>\n <nav class=\"mint-pill-nav\" aria-label=\"Primary\">\n <div\n v-for=\"item in normalizedItems\"\n :key=\"item.id\"\n :ref=\"(el) => setItemRef(el as HTMLElement | null, item.id)\"\n class=\"mint-pill-nav__item-wrap\"\n >\n <button\n v-if=\"item.children?.length\"\n type=\"button\"\n :class=\"[\n 'mint-pill-nav__item',\n { 'mint-pill-nav__item--active': item.id === currentItemId || activeChild(item) !== undefined },\n { 'mint-pill-nav__item--disabled': item.disabled },\n ]\"\n :disabled=\"item.disabled\"\n :aria-expanded=\"openItemId === item.id\"\n aria-haspopup=\"menu\"\n @click.stop=\"handleClick(item)\"\n >\n <svg\n v-if=\"isSvgIcon(item.icon)\"\n class=\"mint-pill-nav__icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <template v-if=\"Array.isArray(item.icon)\">\n <path v-for=\"(d, index) in item.icon\" :key=\"index\" :d=\"d\" />\n </template>\n <path v-else :d=\"item.icon\" />\n </svg>\n {{ activeChild(item)?.label ?? item.label }}\n <span v-if=\"item.dot\" class=\"mint-pill-nav__dot\" role=\"img\" aria-label=\"Needs attention\" />\n <svg\n class=\"mint-pill-nav__chevron\"\n :class=\"{ 'mint-pill-nav__chevron--open': openItemId === item.id }\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </button>\n\n <ActionItemInternal\n v-else\n :href=\"item.href\"\n :to=\"item.to\"\n :disabled=\"item.disabled\"\n :class=\"[\n 'mint-pill-nav__item',\n { 'mint-pill-nav__item--active': item.id === currentItemId },\n { 'mint-pill-nav__item--disabled': item.disabled },\n ]\"\n @click=\"handleClick(item)\"\n >\n <svg\n v-if=\"isSvgIcon(item.icon)\"\n class=\"mint-pill-nav__icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <template v-if=\"Array.isArray(item.icon)\">\n <path v-for=\"(d, index) in item.icon\" :key=\"index\" :d=\"d\" />\n </template>\n <path v-else :d=\"item.icon\" />\n </svg>\n {{ item.label }}\n <span v-if=\"item.dot\" class=\"mint-pill-nav__dot\" role=\"img\" aria-label=\"Needs attention\" />\n </ActionItemInternal>\n\n <div\n v-if=\"item.children?.length && openItemId === item.id\"\n class=\"mint-popover mint-pill-nav__dropdown\"\n role=\"menu\"\n >\n <ActionItemInternal\n v-for=\"option in item.children\"\n :key=\"option.id\"\n :href=\"option.href\"\n :to=\"option.to\"\n :disabled=\"option.disabled\"\n :class=\"[\n 'mint-menu-item mint-pill-nav__dropdown-item',\n { 'mint-menu-item--selected mint-pill-nav__dropdown-item--active': option.id === currentItemId },\n { 'mint-pill-nav__dropdown-item--disabled': option.disabled },\n ]\"\n role=\"menuitem\"\n @click=\"handleOptionClick(option, item)\"\n >\n <span class=\"mint-pill-nav__dropdown-label\">{{ option.label }}</span>\n <span v-if=\"option.description\" class=\"mint-pill-nav__dropdown-description\">\n {{ option.description }}\n </span>\n <svg class=\"mint-menu-item__check\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M3.5 8.5l3 3 6-7\" />\n </svg>\n </ActionItemInternal>\n </div>\n </div>\n </nav>\n</template>\n","<script setup lang=\"ts\">\n/**\n * The tour layer: a scrim with a hole over the anchor, the step card, and the\n * what's-new dots. AppTopBar renders it when the app provides onboarding.\n */\nimport { computed, nextTick, onBeforeUnmount, ref, useId, watch } from 'vue'\nimport { autoUpdate, computePosition, flip, offset, shift } from '@floating-ui/dom'\nimport { X } from 'lucide-vue-next'\nimport BaseButton from '../BaseButton.vue'\nimport { useEventListener } from '../../composables/useEventListener'\nimport type { OnboardingState } from '../../composables/useOnboarding'\n\nconst props = defineProps<{ state: OnboardingState }>()\n\n// Space between the anchor and the edge of the hole.\nconst HOLE_PAD = 4\n\nconst active = computed(() => props.state.active.value)\nconst card = ref<HTMLElement | null>(null)\nconst hole = ref<DOMRect | null>(null)\nconst cardPosition = ref({ x: 0, y: 0 })\nconst titleId = useId()\nlet stopAutoUpdate: (() => void) | undefined\n\nasync function position() {\n const current = active.value\n if (!current || !card.value) return\n hole.value = current.element.getBoundingClientRect()\n const { x, y } = await computePosition(current.element, card.value, {\n strategy: 'fixed',\n placement: current.step.placement ?? 'bottom',\n middleware: [offset(12), flip(), shift({ padding: 12 })],\n })\n // The step may have changed while the position was computed.\n if (active.value === current) cardPosition.value = { x, y }\n}\n\n// Focus goes back where it was when the run ends.\nlet returnFocus: HTMLElement | null = null\nwatch(active, async (current, previous) => {\n stopAutoUpdate?.()\n stopAutoUpdate = undefined\n hole.value = null\n if (current && !previous) returnFocus = document.activeElement as HTMLElement | null\n if (!current) {\n if (returnFocus?.isConnected) returnFocus.focus()\n returnFocus = null\n return\n }\n await nextTick()\n if (!card.value || active.value !== current) return\n current.element.scrollIntoView({ block: 'nearest', inline: 'nearest' })\n stopAutoUpdate = autoUpdate(current.element, card.value, () => void position())\n // A click step: the keyboard user presses the control itself.\n if (current.step.advanceOn === 'click') current.element.focus()\n // Otherwise the card itself: no focus ring on load, and Tab reaches Back and Next.\n else card.value.focus()\n}, { immediate: true })\nonBeforeUnmount(() => stopAutoUpdate?.())\n\n// The layer is its own focus trap: Tab cycles over the card's buttons (and the\n// anchor on a click step), never the page behind; from the card itself Tab goes\n// to the first stop and Shift+Tab to the last.\nuseEventListener(document, 'keydown', (event) => {\n const current = active.value\n if (!current || !card.value) return\n // Keys belong to the tour only while focus is on its card, its anchor, or nowhere.\n const focused = document.activeElement\n if (focused && focused !== document.body && !card.value.contains(focused) && focused !== current.element) return\n const onCard = focused === card.value\n if (event.key === 'Escape') {\n event.stopPropagation()\n props.state.dismiss()\n } else if (event.key === 'Tab') {\n const buttons = [...card.value.querySelectorAll<HTMLElement>('button')]\n const stops = current.step.advanceOn === 'click' ? [current.element, ...buttons] : buttons\n const at = stops.indexOf(document.activeElement as HTMLElement)\n const target = at === -1 ? (event.shiftKey ? stops.length - 1 : 0) : (at + (event.shiftKey ? -1 : 1) + stops.length) % stops.length\n event.preventDefault()\n stops[target].focus()\n } else if (event.key === 'Enter' && onCard && current.step.advanceOn !== 'click') {\n event.preventDefault()\n props.state.next()\n }\n}, { capture: true })\n\nconst holeStyle = computed(() => hole.value && {\n left: `${hole.value.left - HOLE_PAD}px`,\n top: `${hole.value.top - HOLE_PAD}px`,\n width: `${hole.value.width + 2 * HOLE_PAD}px`,\n height: `${hole.value.height + 2 * HOLE_PAD}px`,\n})\n// advanceOn 'click': cut the hole out of the click blocker, so the anchor takes the click.\nconst blockerStyle = computed(() => {\n const rect = hole.value\n if (!rect || active.value?.step.advanceOn !== 'click') return undefined\n const [x, y, w, h] = [rect.left - HOLE_PAD, rect.top - HOLE_PAD, rect.width + 2 * HOLE_PAD, rect.height + 2 * HOLE_PAD]\n return { clipPath: `path(evenodd, 'M0 0H${window.innerWidth}V${window.innerHeight}H0Z M${x} ${y}h${w}v${h}h${-w}Z')` }\n})\nconst isLast = computed(() => !!active.value && active.value.index === active.value.count - 1)\nconst nextLabel = computed(() => active.value?.news ? 'Got it' : isLast.value ? 'Done' : 'Next')\n\n// What's-new dots: one on each element with unseen news, hidden while a card shows.\nconst dots = ref<Array<{ id: string; title: string; x: number; y: number }>>([])\nlet frame = 0\nfunction placeDots() {\n cancelAnimationFrame(frame)\n frame = requestAnimationFrame(() => {\n dots.value = active.value ? [] : props.state.news.value.flatMap((item) => {\n if (!item.unseen) return []\n const element = document.querySelector(`[data-onboarding=\"${CSS.escape(item.anchor)}\"]`)\n if (!element) return []\n const rect = element.getBoundingClientRect()\n return rect.width ? [{ id: item.id, title: item.title, x: rect.right, y: rect.top }] : []\n })\n })\n}\nconst observer = new MutationObserver(placeDots)\nwatch(() => props.state.unseenNews.value > 0, (watching) => {\n observer.disconnect()\n if (watching) observer.observe(document.body, { childList: true, subtree: true })\n placeDots()\n}, { immediate: true })\nwatch(active, placeDots)\nuseEventListener(window, 'resize', placeDots)\nuseEventListener(window, 'scroll', placeDots, { capture: true, passive: true })\nonBeforeUnmount(() => {\n observer.disconnect()\n cancelAnimationFrame(frame)\n})\n</script>\n\n<template>\n <Teleport to=\"body\">\n <button\n v-for=\"dot in dots\"\n :key=\"dot.id\"\n type=\"button\"\n class=\"mint-onboarding__dot\"\n :style=\"{ left: `${dot.x}px`, top: `${dot.y}px` }\"\n :aria-label=\"`New: ${dot.title}`\"\n @click=\"state.showNews(dot.id)\"\n />\n <div v-if=\"active\" class=\"mint-onboarding\">\n <div class=\"mint-onboarding__blocker\" :style=\"blockerStyle\" />\n <div v-if=\"holeStyle\" class=\"mint-onboarding__hole\" :style=\"holeStyle\" />\n <div\n ref=\"card\"\n class=\"mint-onboarding__card\"\n role=\"dialog\"\n aria-modal=\"true\"\n :aria-labelledby=\"titleId\"\n tabindex=\"-1\"\n :style=\"{ left: `${cardPosition.x}px`, top: `${cardPosition.y}px` }\"\n >\n <button type=\"button\" class=\"mint-onboarding__close\" :aria-label=\"active.news ? 'Close' : 'Close tour'\" @click=\"state.dismiss()\">\n <X :size=\"14\" aria-hidden=\"true\" />\n </button>\n <span v-if=\"active.count > 1\" class=\"mint-onboarding__count\">\n <span aria-hidden=\"true\">{{ active.index + 1 }} / {{ active.count }}</span>\n <span class=\"mint-onboarding__sr\">Step {{ active.index + 1 }} of {{ active.count }}</span>\n </span>\n <p :id=\"titleId\" class=\"mint-onboarding__title\">{{ active.step.title }}</p>\n <p class=\"mint-onboarding__body\">{{ active.step.body }}</p>\n <div class=\"mint-onboarding__footer\">\n <span v-if=\"active.step.advanceOn === 'click'\" class=\"mint-onboarding__hint\">Click the highlighted control.</span>\n <BaseButton v-if=\"active.index > 0\" variant=\"ghost\" size=\"sm\" @click=\"state.back()\">Back</BaseButton>\n <BaseButton v-if=\"active.step.advanceOn !== 'click'\" size=\"sm\" @click=\"state.next()\">{{ nextLabel }}</BaseButton>\n </div>\n </div>\n </div>\n </Teleport>\n</template>\n","<script setup lang=\"ts\">\n/**\n * The tour layer: a scrim with a hole over the anchor, the step card, and the\n * what's-new dots. AppTopBar renders it when the app provides onboarding.\n */\nimport { computed, nextTick, onBeforeUnmount, ref, useId, watch } from 'vue'\nimport { autoUpdate, computePosition, flip, offset, shift } from '@floating-ui/dom'\nimport { X } from 'lucide-vue-next'\nimport BaseButton from '../BaseButton.vue'\nimport { useEventListener } from '../../composables/useEventListener'\nimport type { OnboardingState } from '../../composables/useOnboarding'\n\nconst props = defineProps<{ state: OnboardingState }>()\n\n// Space between the anchor and the edge of the hole.\nconst HOLE_PAD = 4\n\nconst active = computed(() => props.state.active.value)\nconst card = ref<HTMLElement | null>(null)\nconst hole = ref<DOMRect | null>(null)\nconst cardPosition = ref({ x: 0, y: 0 })\nconst titleId = useId()\nlet stopAutoUpdate: (() => void) | undefined\n\nasync function position() {\n const current = active.value\n if (!current || !card.value) return\n hole.value = current.element.getBoundingClientRect()\n const { x, y } = await computePosition(current.element, card.value, {\n strategy: 'fixed',\n placement: current.step.placement ?? 'bottom',\n middleware: [offset(12), flip(), shift({ padding: 12 })],\n })\n // The step may have changed while the position was computed.\n if (active.value === current) cardPosition.value = { x, y }\n}\n\n// Focus goes back where it was when the run ends.\nlet returnFocus: HTMLElement | null = null\nwatch(active, async (current, previous) => {\n stopAutoUpdate?.()\n stopAutoUpdate = undefined\n hole.value = null\n if (current && !previous) returnFocus = document.activeElement as HTMLElement | null\n if (!current) {\n if (returnFocus?.isConnected) returnFocus.focus()\n returnFocus = null\n return\n }\n await nextTick()\n if (!card.value || active.value !== current) return\n current.element.scrollIntoView({ block: 'nearest', inline: 'nearest' })\n stopAutoUpdate = autoUpdate(current.element, card.value, () => void position())\n // A click step: the keyboard user presses the control itself.\n if (current.step.advanceOn === 'click') current.element.focus()\n // Otherwise the card itself: no focus ring on load, and Tab reaches Back and Next.\n else card.value.focus()\n}, { immediate: true })\nonBeforeUnmount(() => stopAutoUpdate?.())\n\n// The layer is its own focus trap: Tab cycles over the card's buttons (and the\n// anchor on a click step), never the page behind; from the card itself Tab goes\n// to the first stop and Shift+Tab to the last.\nuseEventListener(document, 'keydown', (event) => {\n const current = active.value\n if (!current || !card.value) return\n // Keys belong to the tour only while focus is on its card, its anchor, or nowhere.\n const focused = document.activeElement\n if (focused && focused !== document.body && !card.value.contains(focused) && focused !== current.element) return\n const onCard = focused === card.value\n if (event.key === 'Escape') {\n event.stopPropagation()\n props.state.dismiss()\n } else if (event.key === 'Tab') {\n const buttons = [...card.value.querySelectorAll<HTMLElement>('button')]\n const stops = current.step.advanceOn === 'click' ? [current.element, ...buttons] : buttons\n const at = stops.indexOf(document.activeElement as HTMLElement)\n const target = at === -1 ? (event.shiftKey ? stops.length - 1 : 0) : (at + (event.shiftKey ? -1 : 1) + stops.length) % stops.length\n event.preventDefault()\n stops[target].focus()\n } else if (event.key === 'Enter' && onCard && current.step.advanceOn !== 'click') {\n event.preventDefault()\n props.state.next()\n }\n}, { capture: true })\n\nconst holeStyle = computed(() => hole.value && {\n left: `${hole.value.left - HOLE_PAD}px`,\n top: `${hole.value.top - HOLE_PAD}px`,\n width: `${hole.value.width + 2 * HOLE_PAD}px`,\n height: `${hole.value.height + 2 * HOLE_PAD}px`,\n})\n// advanceOn 'click': cut the hole out of the click blocker, so the anchor takes the click.\nconst blockerStyle = computed(() => {\n const rect = hole.value\n if (!rect || active.value?.step.advanceOn !== 'click') return undefined\n const [x, y, w, h] = [rect.left - HOLE_PAD, rect.top - HOLE_PAD, rect.width + 2 * HOLE_PAD, rect.height + 2 * HOLE_PAD]\n return { clipPath: `path(evenodd, 'M0 0H${window.innerWidth}V${window.innerHeight}H0Z M${x} ${y}h${w}v${h}h${-w}Z')` }\n})\nconst isLast = computed(() => !!active.value && active.value.index === active.value.count - 1)\nconst nextLabel = computed(() => active.value?.news ? 'Got it' : isLast.value ? 'Done' : 'Next')\n\n// What's-new dots: one on each element with unseen news, hidden while a card shows.\nconst dots = ref<Array<{ id: string; title: string; x: number; y: number }>>([])\nlet frame = 0\nfunction placeDots() {\n cancelAnimationFrame(frame)\n frame = requestAnimationFrame(() => {\n dots.value = active.value ? [] : props.state.news.value.flatMap((item) => {\n if (!item.unseen) return []\n const element = document.querySelector(`[data-onboarding=\"${CSS.escape(item.anchor)}\"]`)\n if (!element) return []\n const rect = element.getBoundingClientRect()\n return rect.width ? [{ id: item.id, title: item.title, x: rect.right, y: rect.top }] : []\n })\n })\n}\nconst observer = new MutationObserver(placeDots)\nwatch(() => props.state.unseenNews.value > 0, (watching) => {\n observer.disconnect()\n if (watching) observer.observe(document.body, { childList: true, subtree: true })\n placeDots()\n}, { immediate: true })\nwatch(active, placeDots)\nuseEventListener(window, 'resize', placeDots)\nuseEventListener(window, 'scroll', placeDots, { capture: true, passive: true })\nonBeforeUnmount(() => {\n observer.disconnect()\n cancelAnimationFrame(frame)\n})\n</script>\n\n<template>\n <Teleport to=\"body\">\n <button\n v-for=\"dot in dots\"\n :key=\"dot.id\"\n type=\"button\"\n class=\"mint-onboarding__dot\"\n :style=\"{ left: `${dot.x}px`, top: `${dot.y}px` }\"\n :aria-label=\"`New: ${dot.title}`\"\n @click=\"state.showNews(dot.id)\"\n />\n <div v-if=\"active\" class=\"mint-onboarding\">\n <div class=\"mint-onboarding__blocker\" :style=\"blockerStyle\" />\n <div v-if=\"holeStyle\" class=\"mint-onboarding__hole\" :style=\"holeStyle\" />\n <div\n ref=\"card\"\n class=\"mint-onboarding__card\"\n role=\"dialog\"\n aria-modal=\"true\"\n :aria-labelledby=\"titleId\"\n tabindex=\"-1\"\n :style=\"{ left: `${cardPosition.x}px`, top: `${cardPosition.y}px` }\"\n >\n <button type=\"button\" class=\"mint-onboarding__close\" :aria-label=\"active.news ? 'Close' : 'Close tour'\" @click=\"state.dismiss()\">\n <X :size=\"14\" aria-hidden=\"true\" />\n </button>\n <span v-if=\"active.count > 1\" class=\"mint-onboarding__count\">\n <span aria-hidden=\"true\">{{ active.index + 1 }} / {{ active.count }}</span>\n <span class=\"mint-onboarding__sr\">Step {{ active.index + 1 }} of {{ active.count }}</span>\n </span>\n <p :id=\"titleId\" class=\"mint-onboarding__title\">{{ active.step.title }}</p>\n <p class=\"mint-onboarding__body\">{{ active.step.body }}</p>\n <div class=\"mint-onboarding__footer\">\n <span v-if=\"active.step.advanceOn === 'click'\" class=\"mint-onboarding__hint\">Click the highlighted control.</span>\n <BaseButton v-if=\"active.index > 0\" variant=\"ghost\" size=\"sm\" @click=\"state.back()\">Back</BaseButton>\n <BaseButton v-if=\"active.step.advanceOn !== 'click'\" size=\"sm\" @click=\"state.next()\">{{ nextLabel }}</BaseButton>\n </div>\n </div>\n </div>\n </Teleport>\n</template>\n","<script setup lang=\"ts\">\n/**\n * The top-bar onboarding controls: the \"Getting started n/m\" chip while the\n * checklist is open, and the Help button with the checklist, tours and news.\n */\nimport { computed, nextTick, onBeforeUnmount, ref, watch } from 'vue'\nimport { autoUpdate, computePosition, offset, shift } from '@floating-ui/dom'\nimport { Check, CircleHelp, Play } from 'lucide-vue-next'\nimport { useEventListener } from '../../composables/useEventListener'\nimport type { OnboardingState } from '../../composables/useOnboarding'\nimport OnboardingLayerInternal from './OnboardingLayerInternal.vue'\n\nconst props = defineProps<{ state: OnboardingState }>()\n\nconst root = ref<HTMLElement | null>(null)\nconst helpButton = ref<HTMLElement | null>(null)\nconst panel = ref<HTMLElement | null>(null)\nconst panelPosition = ref({ x: 0, y: 0 })\nconst open = ref(false)\nconst hasContent = computed(() =>\n props.state.tasks.value.length > 0 || props.state.tours.value.length > 0 || props.state.news.value.length > 0)\nconst progress = computed(() => {\n const total = props.state.tasks.value.length\n return total ? Math.round((props.state.tasksDone.value / total) * 100) : 0\n})\n\nfunction toggle() {\n open.value = !open.value\n if (open.value) props.state.refresh()\n}\n\n// The panel goes to the body, as the top bar clips its overflow; it follows the button.\nlet stopAutoUpdate: (() => void) | undefined\nwatch(open, async (isOpen) => {\n stopAutoUpdate?.()\n stopAutoUpdate = undefined\n if (!isOpen) return\n await nextTick()\n const button = helpButton.value\n const floating = panel.value\n if (!button || !floating || !open.value) return\n stopAutoUpdate = autoUpdate(button, floating, async () => {\n const { x, y } = await computePosition(button, floating, {\n strategy: 'fixed',\n placement: 'bottom-end',\n middleware: [offset(8), shift({ padding: 8 })],\n })\n panelPosition.value = { x, y }\n })\n})\nonBeforeUnmount(() => stopAutoUpdate?.())\n\nfunction run(action: () => void) {\n open.value = false\n action()\n}\n\nuseEventListener(document, 'pointerdown', (event) => {\n const target = event.target as Node\n if (open.value && !root.value?.contains(target) && !panel.value?.contains(target)) open.value = false\n})\nuseEventListener(document, 'keydown', (event) => {\n if (open.value && event.key === 'Escape') open.value = false\n})\n</script>\n\n<template>\n <div v-if=\"hasContent\" ref=\"root\" class=\"mint-onboarding-help\">\n <button\n v-if=\"state.checklistVisible.value\"\n type=\"button\"\n class=\"mint-onboarding-help__chip\"\n :class=\"{ 'mint-onboarding-help__chip--open': open }\"\n data-onboarding=\"topbar-checklist\"\n :aria-expanded=\"open\"\n @click=\"toggle\"\n >\n Getting started\n <span class=\"mint-onboarding-help__count\">{{ state.tasksDone.value }}/{{ state.tasks.value.length }}</span>\n <span class=\"mint-onboarding-help__bar\" aria-hidden=\"true\"><span :style=\"{ width: `${progress}%` }\" /></span>\n </button>\n <button\n ref=\"helpButton\"\n type=\"button\"\n class=\"mint-topbar__settings-btn\"\n :class=\"{ 'mint-topbar__settings-btn--open': open }\"\n data-onboarding=\"topbar-help\"\n :aria-label=\"state.unseenNews.value ? `Help, ${state.unseenNews.value} new` : 'Help'\"\n :aria-expanded=\"open\"\n @click=\"toggle\"\n >\n <CircleHelp class=\"mint-topbar__settings-icon\" aria-hidden=\"true\" />\n <span v-if=\"state.unseenNews.value\" class=\"mint-onboarding-help__badge\" aria-hidden=\"true\">{{ state.unseenNews.value }}</span>\n </button>\n\n <Teleport to=\"body\">\n <div\n v-if=\"open\"\n ref=\"panel\"\n class=\"mint-popover mint-onboarding-help__panel\"\n role=\"dialog\"\n aria-label=\"Help\"\n :style=\"{ left: `${panelPosition.x}px`, top: `${panelPosition.y}px` }\"\n >\n <template v-if=\"state.tasks.value.length\">\n <div class=\"mint-onboarding-help__header\">\n <span class=\"mint-onboarding-help__heading\">Getting started</span>\n <span class=\"mint-onboarding-help__count\">{{ state.tasksDone.value }}/{{ state.tasks.value.length }}</span>\n </div>\n <div class=\"mint-onboarding-help__progress\" aria-hidden=\"true\"><span :style=\"{ width: `${progress}%` }\" /></div>\n <ul class=\"mint-onboarding-help__todos\">\n <li\n v-for=\"task in state.tasks.value\"\n :key=\"task.id\"\n :class=\"['mint-onboarding-help__todo', { 'mint-onboarding-help__todo--done': task.done }]\"\n >\n <span class=\"mint-onboarding-help__check\" role=\"img\" :aria-label=\"task.done ? 'Done' : 'Not done'\">\n <Check v-if=\"task.done\" :size=\"10\" :stroke-width=\"3\" aria-hidden=\"true\" />\n </span>\n <span class=\"mint-onboarding-help__todo-title\">{{ task.title }}</span>\n <button\n v-if=\"task.action && !task.done\"\n type=\"button\"\n class=\"mint-onboarding-help__link\"\n @click=\"run(task.action.run)\"\n >\n {{ task.action.label }}\n </button>\n </li>\n </ul>\n <button\n v-if=\"state.tasksDone.value < state.tasks.value.length\"\n type=\"button\"\n class=\"mint-onboarding-help__link mint-onboarding-help__hide\"\n @click=\"state.setChecklistHidden(!state.checklistHidden.value)\"\n >\n {{ state.checklistHidden.value ? 'Show checklist in the top bar' : 'Hide checklist from the top bar' }}\n </button>\n </template>\n\n <template v-if=\"state.tours.value.length\">\n <div class=\"mint-onboarding-help__section\">Tours</div>\n <button\n v-for=\"tour in state.tours.value\"\n :key=\"tour.id\"\n type=\"button\"\n class=\"mint-menu-item\"\n @click=\"run(() => state.startTour(tour.id))\"\n >\n <Play class=\"mint-onboarding-help__icon\" aria-hidden=\"true\" />\n {{ tour.title }}\n </button>\n </template>\n\n <template v-if=\"state.news.value.length\">\n <div class=\"mint-onboarding-help__section\">What's new</div>\n <button\n v-for=\"item in state.news.value\"\n :key=\"item.id\"\n type=\"button\"\n class=\"mint-menu-item\"\n @click=\"run(() => state.showNews(item.id))\"\n >\n {{ item.title }}\n <span v-if=\"item.unseen\" class=\"mint-onboarding-help__new\">New</span>\n </button>\n </template>\n </div>\n </Teleport>\n </div>\n <OnboardingLayerInternal :state=\"state\" />\n</template>\n","<script setup lang=\"ts\">\n/**\n * The top-bar onboarding controls: the \"Getting started n/m\" chip while the\n * checklist is open, and the Help button with the checklist, tours and news.\n */\nimport { computed, nextTick, onBeforeUnmount, ref, watch } from 'vue'\nimport { autoUpdate, computePosition, offset, shift } from '@floating-ui/dom'\nimport { Check, CircleHelp, Play } from 'lucide-vue-next'\nimport { useEventListener } from '../../composables/useEventListener'\nimport type { OnboardingState } from '../../composables/useOnboarding'\nimport OnboardingLayerInternal from './OnboardingLayerInternal.vue'\n\nconst props = defineProps<{ state: OnboardingState }>()\n\nconst root = ref<HTMLElement | null>(null)\nconst helpButton = ref<HTMLElement | null>(null)\nconst panel = ref<HTMLElement | null>(null)\nconst panelPosition = ref({ x: 0, y: 0 })\nconst open = ref(false)\nconst hasContent = computed(() =>\n props.state.tasks.value.length > 0 || props.state.tours.value.length > 0 || props.state.news.value.length > 0)\nconst progress = computed(() => {\n const total = props.state.tasks.value.length\n return total ? Math.round((props.state.tasksDone.value / total) * 100) : 0\n})\n\nfunction toggle() {\n open.value = !open.value\n if (open.value) props.state.refresh()\n}\n\n// The panel goes to the body, as the top bar clips its overflow; it follows the button.\nlet stopAutoUpdate: (() => void) | undefined\nwatch(open, async (isOpen) => {\n stopAutoUpdate?.()\n stopAutoUpdate = undefined\n if (!isOpen) return\n await nextTick()\n const button = helpButton.value\n const floating = panel.value\n if (!button || !floating || !open.value) return\n stopAutoUpdate = autoUpdate(button, floating, async () => {\n const { x, y } = await computePosition(button, floating, {\n strategy: 'fixed',\n placement: 'bottom-end',\n middleware: [offset(8), shift({ padding: 8 })],\n })\n panelPosition.value = { x, y }\n })\n})\nonBeforeUnmount(() => stopAutoUpdate?.())\n\nfunction run(action: () => void) {\n open.value = false\n action()\n}\n\nuseEventListener(document, 'pointerdown', (event) => {\n const target = event.target as Node\n if (open.value && !root.value?.contains(target) && !panel.value?.contains(target)) open.value = false\n})\nuseEventListener(document, 'keydown', (event) => {\n if (open.value && event.key === 'Escape') open.value = false\n})\n</script>\n\n<template>\n <div v-if=\"hasContent\" ref=\"root\" class=\"mint-onboarding-help\">\n <button\n v-if=\"state.checklistVisible.value\"\n type=\"button\"\n class=\"mint-onboarding-help__chip\"\n :class=\"{ 'mint-onboarding-help__chip--open': open }\"\n data-onboarding=\"topbar-checklist\"\n :aria-expanded=\"open\"\n @click=\"toggle\"\n >\n Getting started\n <span class=\"mint-onboarding-help__count\">{{ state.tasksDone.value }}/{{ state.tasks.value.length }}</span>\n <span class=\"mint-onboarding-help__bar\" aria-hidden=\"true\"><span :style=\"{ width: `${progress}%` }\" /></span>\n </button>\n <button\n ref=\"helpButton\"\n type=\"button\"\n class=\"mint-topbar__settings-btn\"\n :class=\"{ 'mint-topbar__settings-btn--open': open }\"\n data-onboarding=\"topbar-help\"\n :aria-label=\"state.unseenNews.value ? `Help, ${state.unseenNews.value} new` : 'Help'\"\n :aria-expanded=\"open\"\n @click=\"toggle\"\n >\n <CircleHelp class=\"mint-topbar__settings-icon\" aria-hidden=\"true\" />\n <span v-if=\"state.unseenNews.value\" class=\"mint-onboarding-help__badge\" aria-hidden=\"true\">{{ state.unseenNews.value }}</span>\n </button>\n\n <Teleport to=\"body\">\n <div\n v-if=\"open\"\n ref=\"panel\"\n class=\"mint-popover mint-onboarding-help__panel\"\n role=\"dialog\"\n aria-label=\"Help\"\n :style=\"{ left: `${panelPosition.x}px`, top: `${panelPosition.y}px` }\"\n >\n <template v-if=\"state.tasks.value.length\">\n <div class=\"mint-onboarding-help__header\">\n <span class=\"mint-onboarding-help__heading\">Getting started</span>\n <span class=\"mint-onboarding-help__count\">{{ state.tasksDone.value }}/{{ state.tasks.value.length }}</span>\n </div>\n <div class=\"mint-onboarding-help__progress\" aria-hidden=\"true\"><span :style=\"{ width: `${progress}%` }\" /></div>\n <ul class=\"mint-onboarding-help__todos\">\n <li\n v-for=\"task in state.tasks.value\"\n :key=\"task.id\"\n :class=\"['mint-onboarding-help__todo', { 'mint-onboarding-help__todo--done': task.done }]\"\n >\n <span class=\"mint-onboarding-help__check\" role=\"img\" :aria-label=\"task.done ? 'Done' : 'Not done'\">\n <Check v-if=\"task.done\" :size=\"10\" :stroke-width=\"3\" aria-hidden=\"true\" />\n </span>\n <span class=\"mint-onboarding-help__todo-title\">{{ task.title }}</span>\n <button\n v-if=\"task.action && !task.done\"\n type=\"button\"\n class=\"mint-onboarding-help__link\"\n @click=\"run(task.action.run)\"\n >\n {{ task.action.label }}\n </button>\n </li>\n </ul>\n <button\n v-if=\"state.tasksDone.value < state.tasks.value.length\"\n type=\"button\"\n class=\"mint-onboarding-help__link mint-onboarding-help__hide\"\n @click=\"state.setChecklistHidden(!state.checklistHidden.value)\"\n >\n {{ state.checklistHidden.value ? 'Show checklist in the top bar' : 'Hide checklist from the top bar' }}\n </button>\n </template>\n\n <template v-if=\"state.tours.value.length\">\n <div class=\"mint-onboarding-help__section\">Tours</div>\n <button\n v-for=\"tour in state.tours.value\"\n :key=\"tour.id\"\n type=\"button\"\n class=\"mint-menu-item\"\n @click=\"run(() => state.startTour(tour.id))\"\n >\n <Play class=\"mint-onboarding-help__icon\" aria-hidden=\"true\" />\n {{ tour.title }}\n </button>\n </template>\n\n <template v-if=\"state.news.value.length\">\n <div class=\"mint-onboarding-help__section\">What's new</div>\n <button\n v-for=\"item in state.news.value\"\n :key=\"item.id\"\n type=\"button\"\n class=\"mint-menu-item\"\n @click=\"run(() => state.showNews(item.id))\"\n >\n {{ item.title }}\n <span v-if=\"item.unseen\" class=\"mint-onboarding-help__new\">New</span>\n </button>\n </template>\n </div>\n </Teleport>\n </div>\n <OnboardingLayerInternal :state=\"state\" />\n</template>\n","import {\n computed,\n inject,\n onScopeDispose,\n provide,\n ref,\n shallowRef,\n toValue,\n watch,\n type ComputedRef,\n type InjectionKey,\n type MaybeRefOrGetter,\n type ShallowRef,\n} from 'vue'\nimport type { Placement } from '@floating-ui/dom'\nimport { usePlatform } from './usePlatform'\n\n/** One card of a tour. It points at the element with `data-onboarding=\"<anchor>\"`. */\nexport interface OnboardingStep {\n /** Stable id. A returning user sees only steps whose id is new. */\n id: string\n /** `data-onboarding` value of the element the step points at. */\n anchor: string\n title: string\n body: string\n /** Side of the anchor for the card. Default `bottom`. */\n placement?: Placement\n /** `'click'`: the highlighted element takes clicks, and a click moves the tour to the next step. */\n advanceOn?: 'click'\n /** Leave the step out while this returns false, e.g. without the permission its control needs. */\n available?: () => boolean\n}\n\nexport interface OnboardingTour {\n id: string\n /** Name in the Help menu. */\n title: string\n /** Start only while the app's route is this value. Omit it for elements on every page, such as the top bar. */\n route?: string\n steps: OnboardingStep[]\n}\n\nexport interface OnboardingTask {\n id: string\n title: string\n /** Leave the task out while this returns false, e.g. without the permission it needs. */\n available?: () => boolean\n /** The task is done when this returns true. The coordinator checks it at start, on a route change and when the Help menu opens. */\n done?: () => boolean\n /** The link at the end of the task row. */\n action?: { label: string; run: () => void }\n}\n\n/** A new feature. A dot marks its element until the user opens it. */\nexport interface OnboardingNews {\n id: string\n anchor: string\n title: string\n body: string\n placement?: Placement\n}\n\nexport interface OnboardingDefinition {\n tours?: OnboardingTour[]\n /** The \"Getting started\" checklist. */\n checklist?: OnboardingTask[]\n whatsNew?: OnboardingNews[]\n}\n\nexport interface ProvideOnboardingOptions {\n /** Storage namespace, e.g. `platform` or the plugin name. */\n appId: string\n /** The signed-in user. `null` turns onboarding off (no user yet). Default: the platform user; `local` standalone or with auth off. */\n userId?: MaybeRefOrGetter<string | number | null | undefined>\n /** The current route, matched against `OnboardingTour.route`. */\n route?: MaybeRefOrGetter<string | null | undefined>\n /** Start unseen tours on their own. Default `true`. */\n autoStart?: boolean\n}\n\n/** The step on screen and the element it points at. */\nexport interface OnboardingActiveStep {\n step: OnboardingStep\n element: HTMLElement\n /** Position among the steps of this run, and their count. */\n index: number\n count: number\n /** A what's-new card, not a tour step. */\n news: boolean\n}\n\nexport interface OnboardingState {\n definition: OnboardingDefinition\n /** False until a user is known. */\n enabled: ComputedRef<boolean>\n active: ShallowRef<OnboardingActiveStep | null>\n /** Tours that can run on the current route. */\n tours: ComputedRef<OnboardingTour[]>\n /** The available tasks. */\n tasks: ComputedRef<Array<Omit<OnboardingTask, 'done'> & { done: boolean }>>\n tasksDone: ComputedRef<number>\n /** The checklist chip shows while a task is open and the user did not hide it. */\n checklistVisible: ComputedRef<boolean>\n checklistHidden: ComputedRef<boolean>\n news: ComputedRef<Array<OnboardingNews & { unseen: boolean }>>\n unseenNews: ComputedRef<number>\n startTour: (id: string) => void\n showNews: (id: string) => void\n next: () => void\n back: () => void\n /** End the run (× or Esc). Every step of the tour counts as seen. */\n dismiss: () => void\n complete: (taskId: string) => void\n setChecklistHidden: (hidden: boolean) => void\n /** Run the task predicates again. */\n refresh: () => void\n}\n\nexport const ONBOARDING_KEY: InjectionKey<OnboardingState> = Symbol('mint-onboarding')\n\n/** Wait this long for the missing anchor of a run's first step, or of the step after a click step; then skip it. */\nexport const ANCHOR_WAIT_MS = 2000\n\nconst HIDE_CHECKLIST = 'hide:checklist'\nconst stepKey = (tour: OnboardingTour, step: OnboardingStep) => `step:${tour.id}/${step.id}`\nconst anchorSelector = (anchor: string) => `[data-onboarding=\"${CSS.escape(anchor)}\"]`\n\n/** Types a definition, so it can live in its own file. */\nexport function defineOnboarding(definition: OnboardingDefinition): OnboardingDefinition {\n return definition\n}\n\nfunction readSeen(key: string): string[] | null {\n try {\n const raw = globalThis.localStorage?.getItem(key)\n const parsed: unknown = raw ? JSON.parse(raw) : null\n return Array.isArray(parsed) ? parsed.filter((item): item is string => typeof item === 'string') : null\n } catch {\n return null\n }\n}\n\nfunction writeSeen(key: string, seen: Set<string>) {\n try {\n globalThis.localStorage?.setItem(key, JSON.stringify([...seen]))\n } catch {\n // Private windows and full storage: the state lasts until reload.\n }\n}\n\n/** Resolves with the element once it is in the document, or null after `timeout` or when `signal` aborts. */\nfunction waitForElement(selector: string, timeout: number, signal: AbortSignal): Promise<HTMLElement | null> {\n const found = document.querySelector<HTMLElement>(selector)\n if (found) return Promise.resolve(found)\n return new Promise((resolve) => {\n const observer = new MutationObserver(() => {\n const element = document.querySelector<HTMLElement>(selector)\n if (element) finish(element)\n })\n const timer = setTimeout(() => finish(null), timeout)\n const onAbort = () => finish(null)\n function finish(element: HTMLElement | null) {\n observer.disconnect()\n clearTimeout(timer)\n signal.removeEventListener('abort', onAbort)\n resolve(element)\n }\n signal.addEventListener('abort', onAbort)\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['data-onboarding'] })\n })\n}\n\n// Any open modal except the tour card itself.\nconst MODAL_SELECTOR = '[aria-modal=\"true\"]:not(.mint-onboarding__card)'\n\n/** Resolves true once no modal is open, or false when `signal` aborts first. */\nfunction waitForNoModal(signal: AbortSignal): Promise<boolean> {\n if (!document.querySelector(MODAL_SELECTOR)) return Promise.resolve(true)\n return new Promise((resolve) => {\n const observer = new MutationObserver(() => {\n if (!document.querySelector(MODAL_SELECTOR)) finish(true)\n })\n const onAbort = () => finish(false)\n function finish(closed: boolean) {\n observer.disconnect()\n signal.removeEventListener('abort', onAbort)\n resolve(closed)\n }\n signal.addEventListener('abort', onAbort)\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['aria-modal'] })\n })\n}\n\n/**\n * Creates the app's onboarding coordinator and provides it to `AppTopBar`, which then\n * shows the Help button, the checklist chip and the tour layer. Call it once, in the\n * root component. It shows one item at a time and waits for open modals.\n *\n * ```ts\n * provideOnboarding(onboarding, { appId: 'leaf' })\n * ```\n */\nexport function provideOnboarding(definition: OnboardingDefinition, options: ProvideOnboardingOptions): OnboardingState {\n const { user, isAdmin } = usePlatform()\n const userId = computed(() => {\n // With no user, isAdmin is true only standalone or with auth off.\n const fallback = isAdmin.value ? 'local' : null\n const value = options.userId === undefined ? (user.value?.id ?? fallback) : toValue(options.userId)\n return value == null ? null : String(value)\n })\n const route = computed(() => toValue(options.route) ?? undefined)\n const storageKey = computed(() => userId.value === null ? null : `mint.onboarding.${options.appId}.${userId.value}`)\n const enabled = computed(() => storageKey.value !== null)\n\n const seen = ref(new Set<string>())\n // Bumped by refresh(): the predicates read app state that Vue may not track.\n const tick = ref(0)\n const active = shallowRef<OnboardingActiveStep | null>(null)\n let run: { tour: OnboardingTour | null; steps: OnboardingStep[]; index: number; shown: Set<number> } | null = null\n let runId = 0\n let stepWait: AbortController | undefined\n let detachClick: (() => void) | undefined\n\n /** Applies `update` to the stored state merged with this tab's, so tabs do not drop each other's keys. */\n function persist(update: (keys: Set<string>) => void) {\n const key = storageKey.value\n if (!key) return\n const merged = new Set([...(readSeen(key) ?? []), ...seen.value])\n update(merged)\n seen.value = merged\n writeSeen(key, merged)\n }\n\n function markSeen(...keys: string[]) {\n if (keys.every((key) => seen.value.has(key))) return\n persist((set) => keys.forEach((key) => set.add(key)))\n }\n\n // Another tab changed the state.\n function onStorage(event: StorageEvent) {\n if (event.key && event.key === storageKey.value) seen.value = new Set(readSeen(event.key) ?? [])\n }\n window.addEventListener('storage', onStorage)\n\n watch(storageKey, (key) => {\n stop()\n if (!key) {\n seen.value = new Set()\n return\n }\n const stored = readSeen(key)\n seen.value = new Set(stored ?? [])\n // First run: the tours introduce today's features, so today's news counts as seen.\n if (stored === null) {\n for (const item of definition.whatsNew ?? []) seen.value.add(`news:${item.id}`)\n writeSeen(key, seen.value)\n }\n }, { immediate: true })\n\n const tours = computed(() => (definition.tours ?? []).filter((tour) => !tour.route || tour.route === route.value))\n\n const tasks = computed(() => {\n void tick.value\n return (definition.checklist ?? []).filter((task) => task.available?.() ?? true).map((task) => ({\n ...task,\n done: seen.value.has(`task:${task.id}`) || !!task.done?.(),\n }))\n })\n // Done stays done, also when a predicate later returns false.\n watch(tasks, (list) => markSeen(...list.filter((task) => task.done).map((task) => `task:${task.id}`)), { immediate: true })\n const tasksDone = computed(() => tasks.value.filter((task) => task.done).length)\n const checklistHidden = computed(() => seen.value.has(HIDE_CHECKLIST))\n const checklistVisible = computed(() =>\n enabled.value && tasks.value.length > 0 && tasksDone.value < tasks.value.length && !checklistHidden.value)\n\n const news = computed(() => (definition.whatsNew ?? []).map((item) => ({ ...item, unseen: !seen.value.has(`news:${item.id}`) })))\n const unseenNews = computed(() => enabled.value ? news.value.filter((item) => item.unseen).length : 0)\n\n function stop() {\n runId += 1\n stepWait?.abort()\n run = null\n detachClick?.()\n detachClick = undefined\n active.value = null\n }\n\n /**\n * Shows the first step at or after `from` whose anchor is there. Only the first step of\n * the run and the step after a click step wait for theirs (the page or a menu can still\n * be opening); after Next a missing anchor is skipped at once. Skipped steps stay unseen.\n */\n /**\n * The later steps the page can still show: the anchor is on the page now, or\n * a click step that can show opens it. The count grows if an anchor renders later.\n */\n function laterSteps(steps: OnboardingStep[], from: number) {\n let count = 0\n let previous = true\n for (let at = from + 1; at < steps.length; at += 1) {\n previous = (previous && steps[at - 1].advanceOn === 'click') || !!document.querySelector(anchorSelector(steps[at].anchor))\n if (previous) count += 1\n }\n return count\n }\n\n async function showFrom(from: number) {\n if (!run) return\n const id = ++runId\n stepWait?.abort()\n const wait = new AbortController()\n stepWait = wait\n detachClick?.()\n detachClick = undefined\n const waitFirst = from === 0 || run.steps[from - 1].advanceOn === 'click'\n for (let index = from; index < run.steps.length; index += 1) {\n const step = run.steps[index]\n const timeout = index === from && waitFirst ? ANCHOR_WAIT_MS : 0\n const element = await waitForElement(anchorSelector(step.anchor), timeout, wait.signal)\n if (id !== runId) return\n if (!element) {\n // Debug level: a missing anchor is normal, e.g. an admin-only button for a member.\n console.debug(`[mint-onboarding] No element with data-onboarding=\"${step.anchor}\"; step \"${step.id}\" skipped.`)\n continue\n }\n run.index = index\n markSeen(run.tour ? stepKey(run.tour, step) : `news:${step.id}`)\n if (step.advanceOn === 'click') {\n const onClick = () => next()\n element.addEventListener('click', onClick)\n detachClick = () => element.removeEventListener('click', onClick)\n }\n run.shown.add(index)\n // Earlier steps count as the later ones do: shown, and still on the page.\n const steps = run.steps\n const position = [...run.shown].filter((at) => at < index && !!document.querySelector(anchorSelector(steps[at].anchor))).length\n active.value = { step, element, index: position, count: position + 1 + laterSteps(run.steps, index), news: !run.tour }\n return\n }\n // A finished tour hands over to the next one; × does not (dismiss stops the run first).\n const finished = !!run.tour\n stop()\n if (finished && options.autoStart !== false) void autoStart()\n }\n\n function begin(tour: OnboardingTour | null, steps: OnboardingStep[]) {\n if (!enabled.value || steps.length === 0) return\n stop()\n run = { tour, steps, index: 0, shown: new Set() }\n void showFrom(0)\n }\n\n function startTour(id: string) {\n const tour = tours.value.find((item) => item.id === id)\n if (!tour) return\n autoStartAbort?.abort()\n begin(tour, availableSteps(tour))\n }\n\n function showNews(id: string) {\n const item = definition.whatsNew?.find((entry) => entry.id === id)\n if (!item) return\n autoStartAbort?.abort()\n begin(null, [item])\n }\n\n function next() {\n if (run) void showFrom(run.index + 1)\n }\n\n function back() {\n if (!run) return\n // Back goes only to steps whose element is still on the page; it does not wait.\n for (let index = run.index - 1; index >= 0; index -= 1) {\n if (document.querySelector(anchorSelector(run.steps[index].anchor))) {\n void showFrom(index)\n return\n }\n }\n }\n\n function dismiss() {\n autoStartAbort?.abort()\n const tour = run?.tour\n if (tour) markSeen(...tour.steps.map((step) => stepKey(tour, step)))\n stop()\n }\n\n function complete(taskId: string) {\n markSeen(`task:${taskId}`)\n }\n\n function setChecklistHidden(hidden: boolean) {\n if (!storageKey.value) return\n if (hidden) markSeen(HIDE_CHECKLIST)\n else persist((set) => set.delete(HIDE_CHECKLIST))\n }\n\n function refresh() {\n tick.value += 1\n }\n\n const availableSteps = (tour: OnboardingTour) => tour.steps.filter((step) => step.available?.() ?? true)\n\n // Tours started on this page; a tour with skipped steps does not start again until the page changes.\n const tried = new Set<string>()\n let autoStartAbort: AbortController | undefined\n async function autoStart() {\n autoStartAbort?.abort()\n const controller = new AbortController()\n autoStartAbort = controller\n if (!(await waitForNoModal(controller.signal)) || run || !enabled.value) return\n for (const tour of tours.value) {\n if (tried.has(tour.id)) continue\n const unseen = availableSteps(tour).filter((step) => !seen.value.has(stepKey(tour, step)))\n if (unseen.length) {\n tried.add(tour.id)\n begin(tour, unseen)\n return\n }\n }\n }\n\n // A new page ends the run: its elements are gone. Its unseen steps start again.\n watch([route, storageKey], () => {\n stop()\n tried.clear()\n refresh()\n if (options.autoStart !== false) void autoStart()\n }, { immediate: true })\n\n onScopeDispose(() => {\n autoStartAbort?.abort()\n window.removeEventListener('storage', onStorage)\n stop()\n })\n\n const state: OnboardingState = {\n definition,\n enabled,\n active,\n tours,\n tasks,\n tasksDone,\n checklistVisible,\n checklistHidden,\n news,\n unseenNews,\n startTour,\n showNews,\n next,\n back,\n dismiss,\n complete,\n setChecklistHidden,\n refresh,\n }\n provide(ONBOARDING_KEY, state)\n return state\n}\n\n/** The app's onboarding coordinator, e.g. to call `complete(taskId)`. Null when the app provides none. */\nexport function useOnboarding(): OnboardingState | null {\n return inject(ONBOARDING_KEY, null)\n}\n","import { reactive, readonly } from 'vue'\nimport type { PluginContract } from './createClient'\n\n/** The `plugin` block of the generated contract (`./generated/mint-plugin`) that `providePluginIdentity` reads. */\nexport interface PluginIdentityContract {\n plugin: Pick<PluginContract['plugin'], 'name' | 'displayName' | 'subtitle' | 'description' | 'icon'>\n}\n\nconst identity = reactive<{ name?: string; subtitle?: string; icon?: string }>({})\n\n/** The seeded identity AppTopBar shows in standalone mode. Internal: not exported from the package. */\nexport const pluginIdentity = readonly(identity)\n\n/**\n * Seed the standalone AppTopBar with the plugin name, subtitle and icon. In integrated\n * mode the platform supplies them. Explicit `title`/`subtitle` props and the `#icon` slot still win.\n *\n * @example\n * ```typescript\n * import { providePluginIdentity } from '@morscherlab/mint-sdk'\n * import { contract } from './generated/mint-plugin'\n *\n * providePluginIdentity(contract)\n * ```\n */\nexport function providePluginIdentity(contract: PluginIdentityContract): void {\n const { plugin } = contract\n identity.name = plugin.displayName || plugin.name || undefined\n identity.subtitle = plugin.subtitle || plugin.description || undefined\n identity.icon = plugin.icon || undefined\n}\n","/**\n * Publishes the top-most mounted AppTopBar's bottom edge as `--mint-toast-offset-top`\n * on `<html>`, so the teleported toast container starts below the top bar.\n */\nconst TOAST_OFFSET_PROPERTY = '--mint-toast-offset-top'\nconst LISTENER_OPTIONS = { capture: true, passive: true } as const\nconst topBars = new Set<HTMLElement>()\nlet observer: ResizeObserver | undefined\n\nfunction syncToastOffset(): void {\n const style = document.documentElement.style\n if (topBars.size === 0) {\n style.removeProperty(TOAST_OFFSET_PROPERTY)\n return\n }\n const header = [...topBars]\n .map((el) => el.getBoundingClientRect())\n .reduce((top, rect) => (rect.top < top.top ? rect : top))\n // Clamp so a top bar scrolled out of view leaves toasts at the plain 1rem gap.\n style.setProperty(TOAST_OFFSET_PROPERTY, `calc(${Math.max(0, Math.round(header.bottom))}px + 1rem)`)\n}\n\n/** Track a top bar element; returns the cleanup to call on unmount. */\nexport function trackTopBarForToasts(el: HTMLElement): () => void {\n if (topBars.size === 0) {\n // Capture so scrolling any container that holds the top bar also moves the toasts.\n window.addEventListener('scroll', syncToastOffset, LISTENER_OPTIONS)\n window.addEventListener('resize', syncToastOffset, LISTENER_OPTIONS)\n if (typeof ResizeObserver !== 'undefined') observer = new ResizeObserver(syncToastOffset)\n }\n topBars.add(el)\n observer?.observe(el)\n syncToastOffset()\n return () => {\n topBars.delete(el)\n observer?.unobserve(el)\n if (topBars.size === 0) {\n window.removeEventListener('scroll', syncToastOffset, LISTENER_OPTIONS)\n window.removeEventListener('resize', syncToastOffset, LISTENER_OPTIONS)\n observer?.disconnect()\n observer = undefined\n }\n syncToastOffset()\n }\n}\n","<script setup lang=\"ts\">\n/**\n * Full application top bar with brand logo, static plugin identity, page selector, centered pill nav, experiment popover, and an account slot.\n *\n * The `#icon` slot applies in standalone mode only; integrated branding comes from `Metadata.icon`.\n */\nimport { ref, computed, inject, defineAsyncComponent, onMounted, onBeforeUnmount, toValue, useSlots, watch, type Component } from 'vue'\nimport type {\n PillNavOption,\n PillNavItem,\n PillNavItemInput,\n PageSelectorItem,\n PageSelectorItemInput,\n PluginWorkspaceTopBarSpec,\n SettingsTab,\n} from '../types/components'\nimport { normalizeItemInput } from '../utils/items'\nimport { applySpecDefaults } from '../composables/componentSpecs'\nimport ThemeToggle from './ThemeToggle.vue'\nimport AppTopBarPageSelectorInternal from './internal/AppTopBarPageSelectorInternal.vue'\nimport AppTopBarPillNavInternal from './internal/AppTopBarPillNavInternal.vue'\nimport AppTopBarOnboardingInternal from './internal/AppTopBarOnboardingInternal.vue'\nimport PluginIcon from './PluginIcon.vue'\nimport { usePlatform } from '../composables/usePlatform'\nimport { APP_EXPERIMENT_KEY } from '../composables/useAppExperiment'\nimport { useOnboarding } from '../composables/useOnboarding'\nimport { pluginIdentity } from '../composables/pluginIdentity'\nimport { integrationHost } from '../utils/integrationHost'\nimport { trackTopBarForToasts } from './AppTopBar.toastOffset'\nimport { CircleAlert, CircleCheck, CircleX, ListChecks, LoaderCircle } from 'lucide-vue-next'\nimport type { JobStatus, TopBarJob } from '../types/jobs'\nimport type { Tone } from '../types/components'\n\ninterface Props {\n /** App or plugin title shown in the left title group when no page selector is present. */\n title?: string\n /** Secondary title copy shown under the title in title-group layouts. */\n subtitle?: string\n /** Structure: variant, home link, logo, pills, theme toggle, settings, standalone badge. Optional: every option has a default. */\n spec?: PluginWorkspaceTopBarSpec\n /** Active pill id. Bind with `v-model:pill`. */\n pill?: string\n /** Page selector of a platform page. Plugin pages get theirs from the plugin.nav_items metadata through the platform integration script. */\n pageSelector?: PageSelectorItemInput[]\n /** Active id of the platform page selector. */\n currentPageSelectorId?: string\n /**\n * The viewer's own job, joined to the experiment chip. Omit it for no jobs control;\n * `null` shows the idle Jobs button. Both emit `job-click`.\n */\n job?: TopBarJob | null\n /** Completed jobs, shown as a small count on the idle Jobs button. Hidden when 0. */\n jobsDone?: number\n /** Whether the jobs panel is open; `aria-expanded` of the job control. */\n jobsOpen?: boolean\n /** DOM id of the jobs panel; `aria-controls` of the job control. */\n jobsPanelId?: string\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n spec: () => ({}),\n // No boolean cast: without a jobs panel the control has no aria-expanded.\n jobsOpen: undefined,\n})\n\nconst config = computed(() => applySpecDefaults({\n variant: 'card',\n homePath: '/',\n logo: true,\n themeToggle: false,\n settings: false,\n standaloneLabel: 'Standalone',\n}, props.spec))\nconst settingsConfig = computed(() => toValue(config.value.settings) || undefined)\nconst showSettings = computed(() => settingsConfig.value !== undefined)\n\nconst SettingsModal = defineAsyncComponent(() => import('./SettingsModal.vue'))\nconst ExperimentPopover = defineAsyncComponent(() => import('./ExperimentPopover.vue'))\nconst ExperimentSelectorModal = defineAsyncComponent(() => import('./ExperimentSelectorModal.vue'))\n\nconst emit = defineEmits<{\n 'page-selector-select': [page: PageSelectorItem]\n 'update:pill': [pillId: string]\n 'pill-select': [item: PillNavItem]\n 'pill-option-select': [option: PillNavOption, item: PillNavItem]\n 'settings-values-change': [data: Record<string, unknown>]\n 'job-click': []\n}>()\n\nconst settingsOpen = ref(false)\nconst headerEl = ref<HTMLElement | null>(null)\nlet untrackToastOffset: (() => void) | undefined\nonMounted(() => {\n if (headerEl.value) untrackToastOffset = trackTopBarForToasts(headerEl.value)\n})\nonBeforeUnmount(() => untrackToastOffset?.())\nconst { integrated: isIntegrated, plugin } = usePlatform()\nconst isStandalone = computed(() => !isIntegrated.value)\nconst appExperiment = inject(APP_EXPERIMENT_KEY, null)\nconst onboarding = useOnboarding()\nconst canBindExperiment = computed(() => plugin.value?.plugin_type !== 'static')\nconst showExperiment = computed(() => !!appExperiment && !isStandalone.value && canBindExperiment.value)\n// The border joins only once the job is on screen and stays until it has left,\n// so the name and the job never show at the same time.\nconst runSlotJoined = ref(!!props.job)\nconst JOB_STATUS_TEXT: Record<JobStatus, string> = {\n queued: 'Job queued',\n running: 'Job running',\n awaiting_input: 'Job needs input',\n completed: 'Job completed',\n failed: 'Job failed',\n cancelled: 'Job cancelled',\n}\nconst jobPercent = computed(() =>\n props.job?.percent == null ? null : Math.min(100, Math.max(0, Math.round(props.job.percent))),\n)\nconst jobName = computed(() => props.job\n ? (jobPercent.value != null ? `${props.job.label} ${jobPercent.value}%` : props.job.label)\n : undefined)\nfunction syncRunSlotJoined() {\n runSlotJoined.value = !!props.job\n}\n\nconst JOB_TONES: Record<JobStatus, Tone> = {\n queued: 'primary',\n running: 'primary',\n awaiting_input: 'warning',\n completed: 'success',\n failed: 'error',\n cancelled: 'neutral',\n}\nconst JOB_ICONS: Record<JobStatus, Component> = {\n queued: LoaderCircle,\n running: LoaderCircle,\n awaiting_input: CircleAlert,\n completed: CircleCheck,\n failed: CircleX,\n cancelled: CircleX,\n}\n\nconst slots = useSlots()\n// Standalone: the seeded identity (providePluginIdentity) stands in for a missing icon and title.\nconst pluginIcon = computed(() => plugin.value?.icon || (slots.logo ? undefined : pluginIdentity.icon))\nconst seeded = computed(() => isStandalone.value && !props.title && !props.subtitle)\nconst titleText = computed(() => props.title || (seeded.value ? pluginIdentity.name : undefined))\nconst subtitleText = computed(() => props.subtitle || (seeded.value ? pluginIdentity.subtitle : undefined))\n\nconst hasPlatformPageSelector = computed(() =>\n props.pageSelector === undefined && (plugin.value?.nav_items?.length ?? 0) > 1,\n)\nconst hasPropPageSelector = computed(() => (props.pageSelector?.length ?? 0) > 1)\nconst hasPageSelector = computed(() => hasPropPageSelector.value || hasPlatformPageSelector.value)\nconst platformPageSelectorEl = ref<HTMLElement | null>(null)\n// Sync: the host mounts as soon as the element exists and unmounts with it.\nwatch(platformPageSelectorEl, (element, _previous, onCleanup) => {\n const unmount = element ? integrationHost()?.mountPageSelector(element) : undefined\n if (unmount) onCleanup(unmount)\n}, { flush: 'sync' })\n/** Integrated plugins show their name as a static identity in place of the title; the page selector replaces it. */\n// Platforms before 1.3 send no display_name.\nconst identityName = computed(() =>\n isIntegrated.value && !hasPageSelector.value ? plugin.value?.display_name || plugin.value?.name : undefined,\n)\n/** The page selector crumb reads \"<plugin> / <page>\". */\nconst pageSelectorPluginName = computed(() =>\n isIntegrated.value ? plugin.value?.display_name || plugin.value?.name : props.title || pluginIdentity.name,\n)\n// Platforms before 1.4 send no subtitle; the description fills line 2.\nconst identitySubtitle = computed(() => plugin.value?.subtitle || plugin.value?.description)\nconst hasPillNav = computed(() => !!config.value.pills?.length)\nconst hasTitleGroup = computed(\n () =>\n !hasPageSelector.value &&\n !identityName.value &&\n !!titleText.value &&\n !!subtitleText.value\n)\nconst hasTitleOnly = computed(\n () =>\n !hasPageSelector.value &&\n !identityName.value &&\n !hasTitleGroup.value &&\n !!titleText.value,\n)\nconst normalizedPageSelector = computed<PageSelectorItem[]>(() =>\n props.pageSelector?.map(normalizeItemInput) ?? [],\n)\nconst normalizedPillNav = computed<PillNavItemInput[]>(() => config.value.pills ?? [])\nfunction handlePillSelect(item: PillNavItem) {\n emit('update:pill', item.id)\n emit('pill-select', item)\n}\n\nconst normalizedSettingsTabs = computed<SettingsTab[]>(() =>\n settingsConfig.value?.tabs?.map(normalizeItemInput) ?? [],\n)\n</script>\n\n<template>\n <header\n ref=\"headerEl\"\n :class=\"[\n 'mint-topbar',\n `mint-topbar--${config.variant}`,\n ]\"\n >\n <div class=\"mint-topbar__container\">\n <!-- Left: brand -->\n <div class=\"mint-topbar__start\">\n <div class=\"mint-topbar__brand\">\n <a\n v-if=\"config.homePath && (config.homePath.startsWith('http') || config.homePath.startsWith('/'))\"\n :href=\"config.homePath\"\n class=\"mint-topbar-home-link\"\n >\n <span v-if=\"isIntegrated || $slots.icon || $slots.logo || pluginIcon || config.logo\" class=\"mint-topbar__identity\">\n <PluginIcon\n v-if=\"isIntegrated\"\n class=\"mint-topbar__plugin-icon\"\n :icon=\"plugin?.icon\"\n size=\"topbar\"\n variant=\"solid\"\n />\n <slot v-else name=\"icon\">\n <PluginIcon\n v-if=\"pluginIcon\"\n class=\"mint-topbar__plugin-icon\"\n :icon=\"pluginIcon\"\n size=\"topbar\"\n variant=\"solid\"\n />\n <slot v-else name=\"logo\">\n <div v-if=\"config.logo\" class=\"mint-topbar__logo\">\n <div class=\"mint-topbar__logo-icon\">\n <span class=\"mint-topbar__logo-text\">M</span>\n </div>\n </div>\n </slot>\n </slot>\n </span>\n </a>\n <router-link\n v-else-if=\"config.homePath\"\n :to=\"config.homePath\"\n class=\"mint-topbar-home-link\"\n >\n <span v-if=\"isIntegrated || $slots.icon || $slots.logo || pluginIcon || config.logo\" class=\"mint-topbar__identity\">\n <PluginIcon\n v-if=\"isIntegrated\"\n class=\"mint-topbar__plugin-icon\"\n :icon=\"plugin?.icon\"\n size=\"topbar\"\n variant=\"solid\"\n />\n <slot v-else name=\"icon\">\n <PluginIcon\n v-if=\"pluginIcon\"\n class=\"mint-topbar__plugin-icon\"\n :icon=\"pluginIcon\"\n size=\"topbar\"\n variant=\"solid\"\n />\n <slot v-else name=\"logo\">\n <div v-if=\"config.logo\" class=\"mint-topbar__logo\">\n <div class=\"mint-topbar__logo-icon\">\n <span class=\"mint-topbar__logo-text\">M</span>\n </div>\n </div>\n </slot>\n </slot>\n </span>\n </router-link>\n <template v-else>\n <span v-if=\"isIntegrated || $slots.icon || $slots.logo || pluginIcon || config.logo\" class=\"mint-topbar__identity\">\n <PluginIcon\n v-if=\"isIntegrated\"\n class=\"mint-topbar__plugin-icon\"\n :icon=\"plugin?.icon\"\n size=\"topbar\"\n variant=\"solid\"\n />\n <slot v-else name=\"icon\">\n <PluginIcon\n v-if=\"pluginIcon\"\n class=\"mint-topbar__plugin-icon\"\n :icon=\"pluginIcon\"\n size=\"topbar\"\n variant=\"solid\"\n />\n <slot v-else name=\"logo\">\n <div v-if=\"config.logo\" class=\"mint-topbar__logo\">\n <div class=\"mint-topbar__logo-icon\">\n <span class=\"mint-topbar__logo-text\">M</span>\n </div>\n </div>\n </slot>\n </slot>\n </span>\n </template>\n </div>\n\n <!-- Left: static plugin identity (not a control) -->\n <span v-if=\"identityName\" class=\"mint-topbar__plugin-identity\">\n <span class=\"mint-topbar__plugin-name\">{{ identityName }}</span>\n <span v-if=\"identitySubtitle\" class=\"mint-topbar__plugin-subtitle\">{{ identitySubtitle }}</span>\n </span>\n\n <!-- Left: page selector (the platform integration script renders the nav_items one) -->\n <span v-if=\"hasPlatformPageSelector\" ref=\"platformPageSelectorEl\" class=\"mint-topbar__platform-page-selector\" data-onboarding=\"topbar-page-selector\" />\n <AppTopBarPageSelectorInternal\n v-else-if=\"hasPropPageSelector\"\n data-onboarding=\"topbar-page-selector\"\n :pages=\"normalizedPageSelector\"\n :current-page-id=\"currentPageSelectorId\"\n :plugin-name=\"pageSelectorPluginName\"\n @select=\"emit('page-selector-select', $event)\"\n >\n <template v-if=\"$slots['page-selector-icon']\" #icon=\"slotProps\">\n <slot name=\"page-selector-icon\" v-bind=\"slotProps\" />\n </template>\n <template v-if=\"$slots['page-selector-item-icon']\" #item-icon=\"slotProps\">\n <slot name=\"page-selector-item-icon\" v-bind=\"slotProps\" />\n </template>\n </AppTopBarPageSelectorInternal>\n\n <!-- Left: title -->\n <div v-if=\"hasTitleGroup\" class=\"mint-topbar-title-group\">\n <span class=\"mint-topbar-title\">{{ titleText }}</span>\n <span class=\"mint-topbar-subtitle\">{{ subtitleText }}</span>\n </div>\n\n <span v-else-if=\"hasTitleOnly\" class=\"mint-topbar__title-only\">{{ titleText }}</span>\n\n <!-- Nav slot (inline, after brand/selector) -->\n <slot name=\"nav\" />\n </div>\n\n <!-- Center: pill nav -->\n <div v-if=\"hasPillNav || $slots.center\" class=\"mint-topbar__center\" data-onboarding=\"topbar-pills\">\n <slot name=\"center\">\n <AppTopBarPillNavInternal\n v-if=\"hasPillNav\"\n :items=\"normalizedPillNav\"\n :current-item-id=\"pill\"\n @select=\"handlePillSelect\"\n @option-select=\"(option, item) => emit('pill-option-select', option, item)\"\n />\n </slot>\n </div>\n\n <!-- Right section -->\n <div class=\"mint-topbar__right\">\n <span v-if=\"config.standaloneLabel !== false && isStandalone\" class=\"mint-topbar__standalone-badge\">\n {{ config.standaloneLabel }}\n </span>\n\n <!-- Run slot: while a job shows, its progress takes the place of the experiment name and Save:\n [ EXP-0142 ▾ | job ]. The idle Jobs button stands apart. -->\n <div\n v-if=\"showExperiment || job !== undefined || runSlotJoined\"\n :class=\"['mint-topbar__run-slot', { 'mint-topbar__run-slot--joined': runSlotJoined }]\"\n data-onboarding=\"topbar-run\"\n >\n <ExperimentPopover\n v-if=\"showExperiment && appExperiment\"\n v-bind=\"job ? { ...appExperiment.popover.value, showSave: false } : appExperiment.popover.value\"\n @select=\"appExperiment.openModal()\"\n @save=\"appExperiment.handleSave()\"\n @detach=\"appExperiment.handleDetach()\"\n />\n <!-- Status words only, so a moving percent does not repeat. -->\n <span class=\"mint-topbar__job-status\" aria-live=\"polite\">{{ job ? JOB_STATUS_TEXT[job.status] : '' }}</span>\n <!-- appear: the slot can mount together with its first job; before-enter then joins it. -->\n <Transition\n name=\"mint-topbar-job\"\n mode=\"out-in\"\n appear\n @before-enter=\"syncRunSlotJoined\"\n @after-leave=\"syncRunSlotJoined\"\n >\n <button\n v-if=\"job\"\n key=\"run\"\n type=\"button\"\n :class=\"['mint-topbar__job', `mint-topbar__job--${JOB_TONES[job.status]}`]\"\n :title=\"jobName\"\n :aria-label=\"jobName\"\n :aria-expanded=\"jobsOpen\"\n :aria-controls=\"jobsPanelId\"\n @click=\"emit('job-click')\"\n >\n <component\n :is=\"JOB_ICONS[job.status]\"\n :class=\"['mint-topbar__job-icon', { 'mint-topbar__job-icon--spin': job.status === 'running' || job.status === 'queued' }]\"\n :size=\"14\"\n aria-hidden=\"true\"\n />\n <span v-if=\"jobPercent != null\" class=\"mint-topbar__job-bar\" aria-hidden=\"true\">\n <span :style=\"{ width: `${jobPercent}%` }\" />\n </span>\n </button>\n <button\n v-else-if=\"job === null\"\n key=\"idle\"\n type=\"button\"\n class=\"mint-topbar__job mint-topbar__job--idle\"\n :aria-label=\"jobsDone ? `Jobs, ${jobsDone} completed` : undefined\"\n :aria-expanded=\"jobsOpen\"\n :aria-controls=\"jobsPanelId\"\n @click=\"emit('job-click')\"\n >\n <ListChecks class=\"mint-topbar__job-icon\" :size=\"14\" aria-hidden=\"true\" />\n <span class=\"mint-topbar__job-label\">Jobs</span>\n <span v-if=\"jobsDone\" class=\"mint-topbar__job-count\" aria-hidden=\"true\">{{ jobsDone }}</span>\n </button>\n </Transition>\n </div>\n\n <slot name=\"actions\" />\n\n <!-- Onboarding: checklist chip, Help button and tour layer, when the app provides onboarding -->\n <AppTopBarOnboardingInternal v-if=\"onboarding?.enabled.value\" :state=\"onboarding\" />\n\n <!-- Theme toggle -->\n <ThemeToggle v-if=\"config.themeToggle\" size=\"sm\" />\n\n <!-- Settings -->\n <button\n v-if=\"showSettings\"\n type=\"button\"\n class=\"mint-topbar__settings-btn\"\n aria-label=\"Open settings\"\n data-onboarding=\"topbar-settings\"\n @click=\"settingsOpen = true\"\n >\n <svg class=\"mint-topbar__settings-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915\" /><circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n </button>\n\n <!-- Account: the host application renders its account controls here -->\n <slot name=\"account\" />\n </div>\n </div>\n </header>\n\n <SettingsModal\n v-if=\"showSettings && settingsOpen\"\n v-model:open=\"settingsOpen\"\n :title=\"settingsConfig?.title\"\n :tabs=\"normalizedSettingsTabs\"\n :show-appearance=\"settingsConfig?.showAppearance ?? true\"\n :appearance-first=\"settingsConfig?.appearanceFirst\"\n :size=\"settingsConfig?.size\"\n :layout=\"settingsConfig?.layout\"\n :spec=\"settingsConfig?.spec\"\n :values=\"settingsConfig?.values\"\n :user-type=\"settingsConfig?.userType\"\n @update:values=\"emit('settings-values-change', $event)\"\n >\n <template v-for=\"tab in normalizedSettingsTabs\" :key=\"tab.id\" #[`tab-${tab.id}`]>\n <slot :name=\"`settings-tab-${tab.id}`\" />\n </template>\n <template #appearance>\n <slot name=\"settings-appearance\" />\n </template>\n </SettingsModal>\n\n <ExperimentSelectorModal\n v-if=\"appExperiment && !isStandalone && canBindExperiment && appExperiment.selectorModal.value.open\"\n v-bind=\"appExperiment.selectorModal.value\"\n @update:open=\"$event ? appExperiment.openModal() : appExperiment.closeModal()\"\n />\n</template>\n","<script setup lang=\"ts\">\n/**\n * Full application top bar with brand logo, static plugin identity, page selector, centered pill nav, experiment popover, and an account slot.\n *\n * The `#icon` slot applies in standalone mode only; integrated branding comes from `Metadata.icon`.\n */\nimport { ref, computed, inject, defineAsyncComponent, onMounted, onBeforeUnmount, toValue, useSlots, watch, type Component } from 'vue'\nimport type {\n PillNavOption,\n PillNavItem,\n PillNavItemInput,\n PageSelectorItem,\n PageSelectorItemInput,\n PluginWorkspaceTopBarSpec,\n SettingsTab,\n} from '../types/components'\nimport { normalizeItemInput } from '../utils/items'\nimport { applySpecDefaults } from '../composables/componentSpecs'\nimport ThemeToggle from './ThemeToggle.vue'\nimport AppTopBarPageSelectorInternal from './internal/AppTopBarPageSelectorInternal.vue'\nimport AppTopBarPillNavInternal from './internal/AppTopBarPillNavInternal.vue'\nimport AppTopBarOnboardingInternal from './internal/AppTopBarOnboardingInternal.vue'\nimport PluginIcon from './PluginIcon.vue'\nimport { usePlatform } from '../composables/usePlatform'\nimport { APP_EXPERIMENT_KEY } from '../composables/useAppExperiment'\nimport { useOnboarding } from '../composables/useOnboarding'\nimport { pluginIdentity } from '../composables/pluginIdentity'\nimport { integrationHost } from '../utils/integrationHost'\nimport { trackTopBarForToasts } from './AppTopBar.toastOffset'\nimport { CircleAlert, CircleCheck, CircleX, ListChecks, LoaderCircle } from 'lucide-vue-next'\nimport type { JobStatus, TopBarJob } from '../types/jobs'\nimport type { Tone } from '../types/components'\n\ninterface Props {\n /** App or plugin title shown in the left title group when no page selector is present. */\n title?: string\n /** Secondary title copy shown under the title in title-group layouts. */\n subtitle?: string\n /** Structure: variant, home link, logo, pills, theme toggle, settings, standalone badge. Optional: every option has a default. */\n spec?: PluginWorkspaceTopBarSpec\n /** Active pill id. Bind with `v-model:pill`. */\n pill?: string\n /** Page selector of a platform page. Plugin pages get theirs from the plugin.nav_items metadata through the platform integration script. */\n pageSelector?: PageSelectorItemInput[]\n /** Active id of the platform page selector. */\n currentPageSelectorId?: string\n /**\n * The viewer's own job, joined to the experiment chip. Omit it for no jobs control;\n * `null` shows the idle Jobs button. Both emit `job-click`.\n */\n job?: TopBarJob | null\n /** Completed jobs, shown as a small count on the idle Jobs button. Hidden when 0. */\n jobsDone?: number\n /** Whether the jobs panel is open; `aria-expanded` of the job control. */\n jobsOpen?: boolean\n /** DOM id of the jobs panel; `aria-controls` of the job control. */\n jobsPanelId?: string\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n spec: () => ({}),\n // No boolean cast: without a jobs panel the control has no aria-expanded.\n jobsOpen: undefined,\n})\n\nconst config = computed(() => applySpecDefaults({\n variant: 'card',\n homePath: '/',\n logo: true,\n themeToggle: false,\n settings: false,\n standaloneLabel: 'Standalone',\n}, props.spec))\nconst settingsConfig = computed(() => toValue(config.value.settings) || undefined)\nconst showSettings = computed(() => settingsConfig.value !== undefined)\n\nconst SettingsModal = defineAsyncComponent(() => import('./SettingsModal.vue'))\nconst ExperimentPopover = defineAsyncComponent(() => import('./ExperimentPopover.vue'))\nconst ExperimentSelectorModal = defineAsyncComponent(() => import('./ExperimentSelectorModal.vue'))\n\nconst emit = defineEmits<{\n 'page-selector-select': [page: PageSelectorItem]\n 'update:pill': [pillId: string]\n 'pill-select': [item: PillNavItem]\n 'pill-option-select': [option: PillNavOption, item: PillNavItem]\n 'settings-values-change': [data: Record<string, unknown>]\n 'job-click': []\n}>()\n\nconst settingsOpen = ref(false)\nconst headerEl = ref<HTMLElement | null>(null)\nlet untrackToastOffset: (() => void) | undefined\nonMounted(() => {\n if (headerEl.value) untrackToastOffset = trackTopBarForToasts(headerEl.value)\n})\nonBeforeUnmount(() => untrackToastOffset?.())\nconst { integrated: isIntegrated, plugin } = usePlatform()\nconst isStandalone = computed(() => !isIntegrated.value)\nconst appExperiment = inject(APP_EXPERIMENT_KEY, null)\nconst onboarding = useOnboarding()\nconst canBindExperiment = computed(() => plugin.value?.plugin_type !== 'static')\nconst showExperiment = computed(() => !!appExperiment && !isStandalone.value && canBindExperiment.value)\n// The border joins only once the job is on screen and stays until it has left,\n// so the name and the job never show at the same time.\nconst runSlotJoined = ref(!!props.job)\nconst JOB_STATUS_TEXT: Record<JobStatus, string> = {\n queued: 'Job queued',\n running: 'Job running',\n awaiting_input: 'Job needs input',\n completed: 'Job completed',\n failed: 'Job failed',\n cancelled: 'Job cancelled',\n}\nconst jobPercent = computed(() =>\n props.job?.percent == null ? null : Math.min(100, Math.max(0, Math.round(props.job.percent))),\n)\nconst jobName = computed(() => props.job\n ? (jobPercent.value != null ? `${props.job.label} ${jobPercent.value}%` : props.job.label)\n : undefined)\nfunction syncRunSlotJoined() {\n runSlotJoined.value = !!props.job\n}\n\nconst JOB_TONES: Record<JobStatus, Tone> = {\n queued: 'primary',\n running: 'primary',\n awaiting_input: 'warning',\n completed: 'success',\n failed: 'error',\n cancelled: 'neutral',\n}\nconst JOB_ICONS: Record<JobStatus, Component> = {\n queued: LoaderCircle,\n running: LoaderCircle,\n awaiting_input: CircleAlert,\n completed: CircleCheck,\n failed: CircleX,\n cancelled: CircleX,\n}\n\nconst slots = useSlots()\n// Standalone: the seeded identity (providePluginIdentity) stands in for a missing icon and title.\nconst pluginIcon = computed(() => plugin.value?.icon || (slots.logo ? undefined : pluginIdentity.icon))\nconst seeded = computed(() => isStandalone.value && !props.title && !props.subtitle)\nconst titleText = computed(() => props.title || (seeded.value ? pluginIdentity.name : undefined))\nconst subtitleText = computed(() => props.subtitle || (seeded.value ? pluginIdentity.subtitle : undefined))\n\nconst hasPlatformPageSelector = computed(() =>\n props.pageSelector === undefined && (plugin.value?.nav_items?.length ?? 0) > 1,\n)\nconst hasPropPageSelector = computed(() => (props.pageSelector?.length ?? 0) > 1)\nconst hasPageSelector = computed(() => hasPropPageSelector.value || hasPlatformPageSelector.value)\nconst platformPageSelectorEl = ref<HTMLElement | null>(null)\n// Sync: the host mounts as soon as the element exists and unmounts with it.\nwatch(platformPageSelectorEl, (element, _previous, onCleanup) => {\n const unmount = element ? integrationHost()?.mountPageSelector(element) : undefined\n if (unmount) onCleanup(unmount)\n}, { flush: 'sync' })\n/** Integrated plugins show their name as a static identity in place of the title; the page selector replaces it. */\n// Platforms before 1.3 send no display_name.\nconst identityName = computed(() =>\n isIntegrated.value && !hasPageSelector.value ? plugin.value?.display_name || plugin.value?.name : undefined,\n)\n/** The page selector crumb reads \"<plugin> / <page>\". */\nconst pageSelectorPluginName = computed(() =>\n isIntegrated.value ? plugin.value?.display_name || plugin.value?.name : props.title || pluginIdentity.name,\n)\n// Platforms before 1.4 send no subtitle; the description fills line 2.\nconst identitySubtitle = computed(() => plugin.value?.subtitle || plugin.value?.description)\nconst hasPillNav = computed(() => !!config.value.pills?.length)\nconst hasTitleGroup = computed(\n () =>\n !hasPageSelector.value &&\n !identityName.value &&\n !!titleText.value &&\n !!subtitleText.value\n)\nconst hasTitleOnly = computed(\n () =>\n !hasPageSelector.value &&\n !identityName.value &&\n !hasTitleGroup.value &&\n !!titleText.value,\n)\nconst normalizedPageSelector = computed<PageSelectorItem[]>(() =>\n props.pageSelector?.map(normalizeItemInput) ?? [],\n)\nconst normalizedPillNav = computed<PillNavItemInput[]>(() => config.value.pills ?? [])\nfunction handlePillSelect(item: PillNavItem) {\n emit('update:pill', item.id)\n emit('pill-select', item)\n}\n\nconst normalizedSettingsTabs = computed<SettingsTab[]>(() =>\n settingsConfig.value?.tabs?.map(normalizeItemInput) ?? [],\n)\n</script>\n\n<template>\n <header\n ref=\"headerEl\"\n :class=\"[\n 'mint-topbar',\n `mint-topbar--${config.variant}`,\n ]\"\n >\n <div class=\"mint-topbar__container\">\n <!-- Left: brand -->\n <div class=\"mint-topbar__start\">\n <div class=\"mint-topbar__brand\">\n <a\n v-if=\"config.homePath && (config.homePath.startsWith('http') || config.homePath.startsWith('/'))\"\n :href=\"config.homePath\"\n class=\"mint-topbar-home-link\"\n >\n <span v-if=\"isIntegrated || $slots.icon || $slots.logo || pluginIcon || config.logo\" class=\"mint-topbar__identity\">\n <PluginIcon\n v-if=\"isIntegrated\"\n class=\"mint-topbar__plugin-icon\"\n :icon=\"plugin?.icon\"\n size=\"topbar\"\n variant=\"solid\"\n />\n <slot v-else name=\"icon\">\n <PluginIcon\n v-if=\"pluginIcon\"\n class=\"mint-topbar__plugin-icon\"\n :icon=\"pluginIcon\"\n size=\"topbar\"\n variant=\"solid\"\n />\n <slot v-else name=\"logo\">\n <div v-if=\"config.logo\" class=\"mint-topbar__logo\">\n <div class=\"mint-topbar__logo-icon\">\n <span class=\"mint-topbar__logo-text\">M</span>\n </div>\n </div>\n </slot>\n </slot>\n </span>\n </a>\n <router-link\n v-else-if=\"config.homePath\"\n :to=\"config.homePath\"\n class=\"mint-topbar-home-link\"\n >\n <span v-if=\"isIntegrated || $slots.icon || $slots.logo || pluginIcon || config.logo\" class=\"mint-topbar__identity\">\n <PluginIcon\n v-if=\"isIntegrated\"\n class=\"mint-topbar__plugin-icon\"\n :icon=\"plugin?.icon\"\n size=\"topbar\"\n variant=\"solid\"\n />\n <slot v-else name=\"icon\">\n <PluginIcon\n v-if=\"pluginIcon\"\n class=\"mint-topbar__plugin-icon\"\n :icon=\"pluginIcon\"\n size=\"topbar\"\n variant=\"solid\"\n />\n <slot v-else name=\"logo\">\n <div v-if=\"config.logo\" class=\"mint-topbar__logo\">\n <div class=\"mint-topbar__logo-icon\">\n <span class=\"mint-topbar__logo-text\">M</span>\n </div>\n </div>\n </slot>\n </slot>\n </span>\n </router-link>\n <template v-else>\n <span v-if=\"isIntegrated || $slots.icon || $slots.logo || pluginIcon || config.logo\" class=\"mint-topbar__identity\">\n <PluginIcon\n v-if=\"isIntegrated\"\n class=\"mint-topbar__plugin-icon\"\n :icon=\"plugin?.icon\"\n size=\"topbar\"\n variant=\"solid\"\n />\n <slot v-else name=\"icon\">\n <PluginIcon\n v-if=\"pluginIcon\"\n class=\"mint-topbar__plugin-icon\"\n :icon=\"pluginIcon\"\n size=\"topbar\"\n variant=\"solid\"\n />\n <slot v-else name=\"logo\">\n <div v-if=\"config.logo\" class=\"mint-topbar__logo\">\n <div class=\"mint-topbar__logo-icon\">\n <span class=\"mint-topbar__logo-text\">M</span>\n </div>\n </div>\n </slot>\n </slot>\n </span>\n </template>\n </div>\n\n <!-- Left: static plugin identity (not a control) -->\n <span v-if=\"identityName\" class=\"mint-topbar__plugin-identity\">\n <span class=\"mint-topbar__plugin-name\">{{ identityName }}</span>\n <span v-if=\"identitySubtitle\" class=\"mint-topbar__plugin-subtitle\">{{ identitySubtitle }}</span>\n </span>\n\n <!-- Left: page selector (the platform integration script renders the nav_items one) -->\n <span v-if=\"hasPlatformPageSelector\" ref=\"platformPageSelectorEl\" class=\"mint-topbar__platform-page-selector\" data-onboarding=\"topbar-page-selector\" />\n <AppTopBarPageSelectorInternal\n v-else-if=\"hasPropPageSelector\"\n data-onboarding=\"topbar-page-selector\"\n :pages=\"normalizedPageSelector\"\n :current-page-id=\"currentPageSelectorId\"\n :plugin-name=\"pageSelectorPluginName\"\n @select=\"emit('page-selector-select', $event)\"\n >\n <template v-if=\"$slots['page-selector-icon']\" #icon=\"slotProps\">\n <slot name=\"page-selector-icon\" v-bind=\"slotProps\" />\n </template>\n <template v-if=\"$slots['page-selector-item-icon']\" #item-icon=\"slotProps\">\n <slot name=\"page-selector-item-icon\" v-bind=\"slotProps\" />\n </template>\n </AppTopBarPageSelectorInternal>\n\n <!-- Left: title -->\n <div v-if=\"hasTitleGroup\" class=\"mint-topbar-title-group\">\n <span class=\"mint-topbar-title\">{{ titleText }}</span>\n <span class=\"mint-topbar-subtitle\">{{ subtitleText }}</span>\n </div>\n\n <span v-else-if=\"hasTitleOnly\" class=\"mint-topbar__title-only\">{{ titleText }}</span>\n\n <!-- Nav slot (inline, after brand/selector) -->\n <slot name=\"nav\" />\n </div>\n\n <!-- Center: pill nav -->\n <div v-if=\"hasPillNav || $slots.center\" class=\"mint-topbar__center\" data-onboarding=\"topbar-pills\">\n <slot name=\"center\">\n <AppTopBarPillNavInternal\n v-if=\"hasPillNav\"\n :items=\"normalizedPillNav\"\n :current-item-id=\"pill\"\n @select=\"handlePillSelect\"\n @option-select=\"(option, item) => emit('pill-option-select', option, item)\"\n />\n </slot>\n </div>\n\n <!-- Right section -->\n <div class=\"mint-topbar__right\">\n <span v-if=\"config.standaloneLabel !== false && isStandalone\" class=\"mint-topbar__standalone-badge\">\n {{ config.standaloneLabel }}\n </span>\n\n <!-- Run slot: while a job shows, its progress takes the place of the experiment name and Save:\n [ EXP-0142 ▾ | job ]. The idle Jobs button stands apart. -->\n <div\n v-if=\"showExperiment || job !== undefined || runSlotJoined\"\n :class=\"['mint-topbar__run-slot', { 'mint-topbar__run-slot--joined': runSlotJoined }]\"\n data-onboarding=\"topbar-run\"\n >\n <ExperimentPopover\n v-if=\"showExperiment && appExperiment\"\n v-bind=\"job ? { ...appExperiment.popover.value, showSave: false } : appExperiment.popover.value\"\n @select=\"appExperiment.openModal()\"\n @save=\"appExperiment.handleSave()\"\n @detach=\"appExperiment.handleDetach()\"\n />\n <!-- Status words only, so a moving percent does not repeat. -->\n <span class=\"mint-topbar__job-status\" aria-live=\"polite\">{{ job ? JOB_STATUS_TEXT[job.status] : '' }}</span>\n <!-- appear: the slot can mount together with its first job; before-enter then joins it. -->\n <Transition\n name=\"mint-topbar-job\"\n mode=\"out-in\"\n appear\n @before-enter=\"syncRunSlotJoined\"\n @after-leave=\"syncRunSlotJoined\"\n >\n <button\n v-if=\"job\"\n key=\"run\"\n type=\"button\"\n :class=\"['mint-topbar__job', `mint-topbar__job--${JOB_TONES[job.status]}`]\"\n :title=\"jobName\"\n :aria-label=\"jobName\"\n :aria-expanded=\"jobsOpen\"\n :aria-controls=\"jobsPanelId\"\n @click=\"emit('job-click')\"\n >\n <component\n :is=\"JOB_ICONS[job.status]\"\n :class=\"['mint-topbar__job-icon', { 'mint-topbar__job-icon--spin': job.status === 'running' || job.status === 'queued' }]\"\n :size=\"14\"\n aria-hidden=\"true\"\n />\n <span v-if=\"jobPercent != null\" class=\"mint-topbar__job-bar\" aria-hidden=\"true\">\n <span :style=\"{ width: `${jobPercent}%` }\" />\n </span>\n </button>\n <button\n v-else-if=\"job === null\"\n key=\"idle\"\n type=\"button\"\n class=\"mint-topbar__job mint-topbar__job--idle\"\n :aria-label=\"jobsDone ? `Jobs, ${jobsDone} completed` : undefined\"\n :aria-expanded=\"jobsOpen\"\n :aria-controls=\"jobsPanelId\"\n @click=\"emit('job-click')\"\n >\n <ListChecks class=\"mint-topbar__job-icon\" :size=\"14\" aria-hidden=\"true\" />\n <span class=\"mint-topbar__job-label\">Jobs</span>\n <span v-if=\"jobsDone\" class=\"mint-topbar__job-count\" aria-hidden=\"true\">{{ jobsDone }}</span>\n </button>\n </Transition>\n </div>\n\n <slot name=\"actions\" />\n\n <!-- Onboarding: checklist chip, Help button and tour layer, when the app provides onboarding -->\n <AppTopBarOnboardingInternal v-if=\"onboarding?.enabled.value\" :state=\"onboarding\" />\n\n <!-- Theme toggle -->\n <ThemeToggle v-if=\"config.themeToggle\" size=\"sm\" />\n\n <!-- Settings -->\n <button\n v-if=\"showSettings\"\n type=\"button\"\n class=\"mint-topbar__settings-btn\"\n aria-label=\"Open settings\"\n data-onboarding=\"topbar-settings\"\n @click=\"settingsOpen = true\"\n >\n <svg class=\"mint-topbar__settings-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915\" /><circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n </button>\n\n <!-- Account: the host application renders its account controls here -->\n <slot name=\"account\" />\n </div>\n </div>\n </header>\n\n <SettingsModal\n v-if=\"showSettings && settingsOpen\"\n v-model:open=\"settingsOpen\"\n :title=\"settingsConfig?.title\"\n :tabs=\"normalizedSettingsTabs\"\n :show-appearance=\"settingsConfig?.showAppearance ?? true\"\n :appearance-first=\"settingsConfig?.appearanceFirst\"\n :size=\"settingsConfig?.size\"\n :layout=\"settingsConfig?.layout\"\n :spec=\"settingsConfig?.spec\"\n :values=\"settingsConfig?.values\"\n :user-type=\"settingsConfig?.userType\"\n @update:values=\"emit('settings-values-change', $event)\"\n >\n <template v-for=\"tab in normalizedSettingsTabs\" :key=\"tab.id\" #[`tab-${tab.id}`]>\n <slot :name=\"`settings-tab-${tab.id}`\" />\n </template>\n <template #appearance>\n <slot name=\"settings-appearance\" />\n </template>\n </SettingsModal>\n\n <ExperimentSelectorModal\n v-if=\"appExperiment && !isStandalone && canBindExperiment && appExperiment.selectorModal.value.open\"\n v-bind=\"appExperiment.selectorModal.value\"\n @update:open=\"$event ? appExperiment.openModal() : appExperiment.closeModal()\"\n />\n</template>\n","/**\n * Validation rule function type.\n * Returns error message string if invalid, undefined/null if valid.\n */\nexport type ValidationRule<T = unknown> = (value: T, formData: Record<string, unknown>) => string | undefined | null\n\n/**\n * Field validation rules configuration.\n */\nexport interface FieldRules<T = unknown> {\n required?: boolean | string\n minLength?: number | { value: number; message: string }\n maxLength?: number | { value: number; message: string }\n min?: number | { value: number; message: string }\n max?: number | { value: number; message: string }\n pattern?: RegExp | { value: RegExp; message: string }\n email?: boolean | string\n custom?: ValidationRule<T> | ValidationRule<T>[]\n}\n\nconst validators = {\n required: (value: unknown, message = 'This field is required'): string | null => {\n if (value === null || value === undefined || value === '') {\n return message\n }\n if (Array.isArray(value) && value.length === 0) {\n return message\n }\n return null\n },\n\n minLength: (value: unknown, min: number, message?: string): string | null => {\n if (typeof value !== 'string') return null\n if (value.length < min) {\n return message || `Must be at least ${min} characters`\n }\n return null\n },\n\n maxLength: (value: unknown, max: number, message?: string): string | null => {\n if (typeof value !== 'string') return null\n if (value.length > max) {\n return message || `Must be at most ${max} characters`\n }\n return null\n },\n\n min: (value: unknown, min: number, message?: string): string | null => {\n if (typeof value !== 'number') return null\n if (value < min) {\n return message || `Must be at least ${min}`\n }\n return null\n },\n\n max: (value: unknown, max: number, message?: string): string | null => {\n if (typeof value !== 'number') return null\n if (value > max) {\n return message || `Must be at most ${max}`\n }\n return null\n },\n\n pattern: (value: unknown, pattern: RegExp, message?: string): string | null => {\n if (typeof value !== 'string') return null\n if (!pattern.test(value)) {\n return message || 'Invalid format'\n }\n return null\n },\n\n email: (value: unknown, message = 'Invalid email address'): string | null => {\n if (typeof value !== 'string' || !value) return null\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n if (!emailRegex.test(value)) {\n return message\n }\n return null\n },\n}\n\nexport function validateFieldValue(\n value: unknown,\n fieldRules: FieldRules | undefined,\n formData: Record<string, unknown>,\n): string | null {\n if (!fieldRules) return null\n\n if (fieldRules.required) {\n const message = typeof fieldRules.required === 'string' ? fieldRules.required : undefined\n const error = validators.required(value, message)\n if (error) return error\n }\n\n if (value === null || value === undefined || value === '') {\n return null\n }\n\n if (fieldRules.minLength !== undefined) {\n const config = typeof fieldRules.minLength === 'number'\n ? { value: fieldRules.minLength, message: undefined }\n : fieldRules.minLength\n const error = validators.minLength(value, config.value, config.message)\n if (error) return error\n }\n\n if (fieldRules.maxLength !== undefined) {\n const config = typeof fieldRules.maxLength === 'number'\n ? { value: fieldRules.maxLength, message: undefined }\n : fieldRules.maxLength\n const error = validators.maxLength(value, config.value, config.message)\n if (error) return error\n }\n\n if (fieldRules.min !== undefined) {\n const config = typeof fieldRules.min === 'number'\n ? { value: fieldRules.min, message: undefined }\n : fieldRules.min\n const error = validators.min(value, config.value, config.message)\n if (error) return error\n }\n\n if (fieldRules.max !== undefined) {\n const config = typeof fieldRules.max === 'number'\n ? { value: fieldRules.max, message: undefined }\n : fieldRules.max\n const error = validators.max(value, config.value, config.message)\n if (error) return error\n }\n\n if (fieldRules.pattern !== undefined) {\n const config = fieldRules.pattern instanceof RegExp\n ? { value: fieldRules.pattern, message: undefined }\n : fieldRules.pattern\n const error = validators.pattern(value, config.value, config.message)\n if (error) return error\n }\n\n if (fieldRules.email) {\n const message = typeof fieldRules.email === 'string' ? fieldRules.email : undefined\n const error = validators.email(value, message)\n if (error) return error\n }\n\n if (fieldRules.custom) {\n const customRules = Array.isArray(fieldRules.custom) ? fieldRules.custom : [fieldRules.custom]\n for (const rule of customRules) {\n const error = rule(value, formData)\n if (error) return error\n }\n }\n\n return null\n}\n","import { ref, reactive, computed, toRaw, watch, type Ref } from 'vue'\nimport { validateFieldValue, type FieldRules } from './useFormValidation'\n\nexport type { FieldRules, ValidationRule } from './useFormValidation'\n\n/**\n * Field validation rules configuration.\n */\nexport interface FieldState {\n value: unknown\n error: string | null\n touched: boolean\n dirty: boolean\n}\n\n/**\n * Form state and methods.\n */\nexport interface UseFormReturn<T extends Record<string, unknown>> {\n // Form data (reactive)\n data: T\n\n // Field errors\n errors: Record<string, string | null>\n\n // Field touched state\n touched: Record<string, boolean>\n\n // Field dirty state (value changed from initial)\n dirty: Record<string, boolean>\n\n // Overall form state\n isValid: Ref<boolean>\n isDirty: Ref<boolean>\n isSubmitting: Ref<boolean>\n\n // Methods\n setFieldValue: <K extends keyof T>(field: K, value: T[K]) => void\n setFieldError: (field: string, error: string | null) => void\n setFieldTouched: (field: string, touched?: boolean) => void\n validateField: (field: string) => boolean\n validate: () => boolean\n reset: (values?: Partial<T>) => void\n /** Replace the full form state and treat the provided values as the new clean baseline. */\n replaceState: (values: T) => void\n handleSubmit: (onSubmit: (data: T) => Promise<void> | void) => (e?: Event) => Promise<void>\n getFieldProps: <K extends keyof T>(field: K) => {\n modelValue: T[K]\n 'onUpdate:modelValue': (value: T[K]) => void\n onBlur: () => void\n error: string | null\n }\n}\n\n/**\n * Form state management composable with validation.\n *\n * @param initialValues - Initial form values\n * @param rules - Validation rules for each field\n *\n * @example\n * ```typescript\n * const { data, errors, isValid, handleSubmit, getFieldProps } = useForm(\n * { email: '', password: '' },\n * {\n * email: { required: true, email: true },\n * password: { required: true, minLength: 8 },\n * }\n * )\n *\n * // In template\n * <BaseInput v-bind=\"getFieldProps('email')\" label=\"Email\" />\n * <BaseInput v-bind=\"getFieldProps('password')\" type=\"password\" label=\"Password\" />\n * <BaseButton @click=\"handleSubmit(onSubmit)\" :disabled=\"!isValid\">Submit</BaseButton>\n * ```\n */\n/** Reactive form state with field-level validation, dirty tracking, and submit handling. */\nexport function useForm<T extends Record<string, unknown>>(\n initialValues: T,\n rules: Partial<Record<keyof T, FieldRules>> = {}\n): UseFormReturn<T> {\n const cloneableInitialValues = deepToRaw(initialValues) as T\n\n // Deep copy initial values so nested objects are not shared\n let _initialValues = structuredClone(cloneableInitialValues)\n\n // Reactive form data\n const data = reactive(structuredClone(cloneableInitialValues)) as T\n\n // Field state - use simple Record types for better TS compatibility\n const errors = reactive<Record<string, string | null>>(\n Object.keys(initialValues).reduce((acc, key) => {\n acc[key] = null\n return acc\n }, {} as Record<string, string | null>)\n )\n\n const touched = reactive<Record<string, boolean>>(\n Object.keys(initialValues).reduce((acc, key) => {\n acc[key] = false\n return acc\n }, {} as Record<string, boolean>)\n )\n\n const dirty = reactive<Record<string, boolean>>(\n Object.keys(initialValues).reduce((acc, key) => {\n acc[key] = false\n return acc\n }, {} as Record<string, boolean>)\n )\n\n const isSubmitting = ref(false)\n\n // Watch data changes to track dirty state\n watch(\n () => ({ ...data }),\n (newData) => {\n for (const key of Object.keys(newData)) {\n dirty[key] = newData[key as keyof T] !== _initialValues[key as keyof T]\n }\n },\n { deep: true }\n )\n\n // Validate a single field\n function validateField(field: string): boolean {\n const value = data[field as keyof T]\n const fieldRules = rules[field as keyof T]\n const error = validateFieldValue(value, fieldRules, data as Record<string, unknown>)\n errors[field] = error\n return error === null\n }\n\n // Validate all fields\n function validate(): boolean {\n let isAllValid = true\n for (const field of Object.keys(data)) {\n if (!validateField(field)) {\n isAllValid = false\n }\n }\n return isAllValid\n }\n\n // Computed overall validity\n const isValid = computed(() => {\n return Object.values(errors).every(error => error === null)\n })\n\n // Computed overall dirty state\n const isDirty = computed(() => {\n return Object.values(dirty).some(d => d)\n })\n\n // Set field value\n function setFieldValue<K extends keyof T>(field: K, value: T[K]): void {\n ;(data as Record<string, unknown>)[field as string] = value\n if (touched[field as string]) {\n validateField(field as string)\n }\n }\n\n // Set field error\n function setFieldError(field: string, error: string | null): void {\n errors[field] = error\n }\n\n // Set field touched\n function setFieldTouched(field: string, isTouched = true): void {\n touched[field] = isTouched\n if (isTouched) {\n validateField(field)\n }\n }\n\n // Reset form\n function reset(values?: Partial<T>): void {\n const resetValues = values ? { ..._initialValues, ...values } : _initialValues\n for (const key of Object.keys(data)) {\n ;(data as Record<string, unknown>)[key] = structuredClone(deepToRaw(resetValues[key as keyof T]))\n errors[key] = null\n touched[key] = false\n dirty[key] = false\n }\n }\n\n function replaceState(values: T): void {\n const nextValues = structuredClone(deepToRaw(values)) as T\n _initialValues = structuredClone(nextValues)\n\n for (const key of Object.keys(data)) {\n if (key in nextValues) continue\n delete (data as Record<string, unknown>)[key]\n delete errors[key]\n delete touched[key]\n delete dirty[key]\n }\n\n for (const key of Object.keys(nextValues)) {\n ;(data as Record<string, unknown>)[key] = structuredClone(deepToRaw(nextValues[key as keyof T]))\n errors[key] = null\n touched[key] = false\n dirty[key] = false\n }\n }\n\n // Handle submit\n function handleSubmit(onSubmit: (data: T) => Promise<void> | void) {\n return async (e?: Event): Promise<void> => {\n e?.preventDefault()\n\n // Mark all fields as touched\n for (const field of Object.keys(data)) {\n touched[field] = true\n }\n\n if (!validate()) {\n return\n }\n\n isSubmitting.value = true\n try {\n await onSubmit(data)\n } finally {\n isSubmitting.value = false\n }\n }\n }\n\n // Get props for a field (for v-bind)\n function getFieldProps<K extends keyof T>(field: K) {\n const fieldStr = field as string\n return {\n modelValue: data[field],\n 'onUpdate:modelValue': (value: T[K]) => setFieldValue(field, value),\n onBlur: () => setFieldTouched(fieldStr),\n error: touched[fieldStr] ? errors[fieldStr] : null,\n }\n }\n\n return {\n data,\n errors,\n touched,\n dirty,\n isValid,\n isDirty,\n isSubmitting,\n setFieldValue,\n setFieldError,\n setFieldTouched,\n validateField,\n validate,\n reset,\n replaceState,\n handleSubmit,\n getFieldProps,\n }\n}\n\nfunction deepToRaw(value: unknown): unknown {\n const raw = toRaw(value)\n\n if (Array.isArray(raw)) {\n return raw.map(item => deepToRaw(item))\n }\n\n if (isPlainRecord(raw)) {\n return Object.fromEntries(\n Object.entries(raw).map(([key, item]) => [key, deepToRaw(item)])\n )\n }\n\n return raw\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n return Object.prototype.toString.call(value) === '[object Object]'\n}\n","import { getTypeDefault } from './formBuilderRegistry'\nimport type { FieldRules } from './useForm'\nimport type {\n FieldCondition,\n FieldValidation,\n FormEnhancements,\n FormFieldSchema,\n FormSchema,\n FormSectionSchema,\n} from '../types/form-builder'\n\n/**\n * Evaluate a JSON-serializable field condition against the current form data.\n *\n * Supports logical operators (`and`, `or`, `not`) and comparison operators\n * (`eq`, `neq`, `gt`, `lt`, `gte`, `lte`, `in`, `notIn`, `truthy`, `falsy`,\n * `contains`). Returns `true` if the condition passes.\n */\nexport function evaluateCondition(\n condition: FieldCondition,\n data: Record<string, unknown>,\n): boolean {\n if ('and' in condition) {\n return condition.and.every((c) => evaluateCondition(c, data))\n }\n if ('or' in condition) {\n return condition.or.some((c) => evaluateCondition(c, data))\n }\n if ('not' in condition) {\n return !evaluateCondition(condition.not, data)\n }\n\n const value = data[condition.field]\n\n if ('eq' in condition) return value === condition.eq\n if ('neq' in condition) return value !== condition.neq\n if ('gt' in condition) return typeof value === 'number' && value > condition.gt\n if ('lt' in condition) return typeof value === 'number' && value < condition.lt\n if ('gte' in condition) return typeof value === 'number' && value >= condition.gte\n if ('lte' in condition) return typeof value === 'number' && value <= condition.lte\n if ('in' in condition) return condition.in.includes(value)\n if ('notIn' in condition) return !condition.notIn.includes(value)\n if ('truthy' in condition) return !!value\n if ('falsy' in condition) return !value\n if ('contains' in condition) {\n if (typeof value === 'string') return value.includes(condition.contains)\n if (Array.isArray(value)) return value.includes(condition.contains)\n return false\n }\n\n return true\n}\n\n/** Return all sections across steps (wizard) or directly from a flat schema. */\nexport function collectSections(schema: FormSchema): FormSectionSchema[] {\n return schema.steps ? schema.steps.flatMap((step) => step.sections) : schema.sections\n}\n\n/** Return all field schemas in schema order, flattening sections and steps. */\nexport function flattenFields(schema: FormSchema): FormFieldSchema[] {\n return collectSections(schema).flatMap((section) => section.fields)\n}\n\n/** Convert a JSON-safe `FieldValidation` descriptor to a runtime `FieldRules` object. */\nfunction convertValidation(v: FieldValidation): FieldRules {\n const rules: FieldRules = {}\n\n if (v.required !== undefined) rules.required = v.required\n if (v.minLength !== undefined) rules.minLength = v.minLength\n if (v.maxLength !== undefined) rules.maxLength = v.maxLength\n if (v.min !== undefined) rules.min = v.min\n if (v.max !== undefined) rules.max = v.max\n if (v.email !== undefined) rules.email = v.email\n\n if (v.pattern !== undefined) {\n rules.pattern =\n typeof v.pattern === 'string'\n ? new RegExp(v.pattern)\n : { value: new RegExp(v.pattern.value), message: v.pattern.message }\n }\n\n return rules\n}\n\nexport function buildInitialValues<T extends Record<string, unknown>>(\n fields: readonly FormFieldSchema[],\n initialData?: Partial<T>,\n): Record<string, unknown> {\n const initialValues = {} as Record<string, unknown>\n\n for (const field of fields) {\n const key = field.name\n if (initialData && hasOwnKey(initialData, key)) {\n initialValues[key] = (initialData as Record<string, unknown>)[key]\n } else if (field.defaultValue !== undefined) {\n initialValues[key] = field.defaultValue\n } else {\n initialValues[key] = getTypeDefault(field.type)\n }\n }\n\n return initialValues\n}\n\nexport function buildRules<T extends Record<string, unknown>>(\n fields: readonly FormFieldSchema[],\n enhancements?: FormEnhancements<T>,\n): Partial<Record<string, FieldRules>> {\n const rules: Partial<Record<string, FieldRules>> = {}\n\n for (const field of fields) {\n const base: FieldRules = field.validation ? convertValidation(field.validation) : {}\n const enhancement = enhancements?.fields?.[field.name as keyof T]\n\n const customValidators: Array<(\n value: unknown,\n formData: Record<string, unknown>,\n ) => string | undefined | null> = []\n\n if (enhancement?.validate) {\n const fn = enhancement.validate\n customValidators.push((value, formData) => fn(value, formData as T))\n }\n\n if (customValidators.length > 0) {\n base.custom = customValidators\n }\n\n if (Object.keys(base).length > 0) {\n rules[field.name] = base\n }\n }\n\n return rules\n}\n\nexport function replaceArray<T>(target: T[], values: readonly T[]): void {\n target.splice(0, target.length, ...values)\n}\n\nexport function replaceRecord<TValue>(\n target: Partial<Record<string, TValue>>,\n source: Partial<Record<string, TValue>>,\n): void {\n for (const key of Object.keys(target)) {\n delete target[key]\n }\n Object.assign(target, source)\n}\n\nfunction hasOwnKey(source: object, key: string): boolean {\n return Object.prototype.hasOwnProperty.call(source, key)\n}\n","import { reactive, ref, computed, shallowRef, watch } from 'vue'\nimport { useForm, type FieldRules, type UseFormReturn } from './useForm'\nimport { getFieldRegistryEntry } from './formBuilderRegistry'\nimport {\n buildInitialValues,\n buildRules,\n collectSections,\n evaluateCondition,\n flattenFields,\n replaceArray,\n replaceRecord,\n} from './formBuilderSchema'\nimport type {\n FormSchema,\n FormFieldSchema,\n FormSectionSchema,\n FormOptionInput,\n FormEnhancements,\n UseFormBuilderReturn,\n} from '../types/form-builder'\n\nexport { evaluateCondition } from './formBuilderSchema'\n\n// ---------------------------------------------------------------------------\n// useFormBuilder\n// ---------------------------------------------------------------------------\n\n/**\n * Drive a `FormSchema` as reactive form state.\n *\n * Builds initial values from schema defaults and `initialData`, derives\n * validation rules from `FieldValidation` descriptors and enhancement\n * validators, evaluates `FieldCondition` expressions for field/section\n * visibility, and wires wizard step navigation when `schema.steps` is set.\n *\n * @param schema - Declarative form or wizard schema.\n * @param initialData - Values that override schema defaults.\n * @param enhancements - TypeScript-only callbacks (dynamic options, validators,\n * submit handler, transform, field-change watcher).\n */\n/** Drives a declarative FormSchema as reactive state with conditional fields, wizard steps, and validation. */\nexport function useFormBuilder<T extends Record<string, unknown> = Record<string, unknown>>(\n schema: FormSchema,\n initialData?: Partial<T>,\n enhancements?: FormEnhancements<T>,\n): UseFormBuilderReturn<T> {\n const currentSchema = shallowRef(schema)\n const fields = reactive<FormFieldSchema[]>(flattenFields(schema))\n const sections = reactive<FormSectionSchema[]>(collectSections(schema))\n const rules = reactive<Partial<Record<string, FieldRules>>>(buildRules(fields, enhancements))\n\n // -- Create form -----------------------------------------------------------\n const form = useForm(\n buildInitialValues<T>(fields, initialData) as T,\n rules as Partial<Record<keyof T, FieldRules>>,\n )\n\n // -- Visibility ------------------------------------------------------------\n function isFieldVisible(name: string): boolean {\n const enhancement = enhancements?.fields?.[name as keyof T]\n if (enhancement?.visible) {\n return enhancement.visible(form.data as T)\n }\n\n const field = fields.find((f) => f.name === name)\n if (field?.condition) {\n return evaluateCondition(field.condition, form.data as Record<string, unknown>)\n }\n\n return true\n }\n\n function isSectionVisible(id: string): boolean {\n const section = sections.find((s) => s.id === id)\n if (section?.condition) {\n return evaluateCondition(section.condition, form.data as Record<string, unknown>)\n }\n return true\n }\n\n // -- Resolved field props --------------------------------------------------\n function getResolvedFieldProps(field: FormFieldSchema): Record<string, unknown> {\n const entry = getFieldRegistryEntry(field.type)\n const formProps = form.getFieldProps(field.name as keyof T)\n\n const merged: Record<string, unknown> = {\n ...entry.defaults,\n ...(field.props ?? {}),\n }\n\n // Dynamic enhancement props\n const enhancement = enhancements?.fields?.[field.name as keyof T]\n if (enhancement?.props) {\n Object.assign(merged, enhancement.props(form.data as T))\n }\n\n // Dynamic options\n const options = getFieldOptions(field.name)\n if (options) {\n merged.options = options\n }\n\n // Form field bindings\n if (entry.vModel) {\n merged.modelValue = formProps.modelValue\n merged['onUpdate:modelValue'] = formProps['onUpdate:modelValue']\n }\n merged.onBlur = formProps.onBlur\n\n // A field with an error message renders its control as invalid\n if (formProps.error) {\n merged.invalid = true\n }\n\n // Schema-level props\n if (field.placeholder) merged.placeholder = field.placeholder\n if (field.size) merged.size = field.size\n if (field.disabled) merged.disabled = true\n if (field.readonly) merged.readonly = true\n\n // Radio group needs a name prop\n if (field.type === 'radio' && !merged.name) {\n merged.name = field.name\n }\n\n return merged\n }\n\n function getFieldOptions(name: string): FormOptionInput[] | undefined {\n const enhancement = enhancements?.fields?.[name as keyof T]\n if (enhancement?.options) {\n return enhancement.options(form.data as T)\n }\n\n const field = fields.find((f) => f.name === name)\n if (field?.props?.options) {\n return field.props.options as FormOptionInput[]\n }\n\n return undefined\n }\n\n // -- Wizard state ----------------------------------------------------------\n const currentStep = ref(0)\n\n const isCurrentStepValid = computed(() => {\n if (!currentSchema.value.steps) return form.isValid.value\n\n const step = currentSchema.value.steps[currentStep.value]\n if (!step) return true\n\n for (const section of step.sections) {\n if (!isSectionVisible(section.id)) continue\n for (const field of section.fields) {\n if (!isFieldVisible(field.name)) continue\n if (!form.validateField(field.name)) return false\n }\n }\n return true\n })\n\n function goNext(): boolean {\n if (!currentSchema.value.steps) return false\n\n // Touch and validate all visible fields in current step\n const step = currentSchema.value.steps[currentStep.value]\n if (!step) return false\n\n let valid = true\n for (const section of step.sections) {\n if (!isSectionVisible(section.id)) continue\n for (const field of section.fields) {\n if (!isFieldVisible(field.name)) continue\n form.setFieldTouched(field.name, true)\n if (!form.validateField(field.name)) valid = false\n }\n }\n\n if (!valid) return false\n\n if (currentStep.value < currentSchema.value.steps.length - 1) {\n currentStep.value++\n }\n return true\n }\n\n function goBack(): void {\n if (currentStep.value > 0) {\n currentStep.value--\n }\n }\n\n function goToStep(index: number): void {\n if (!currentSchema.value.steps) return\n if (index >= 0 && index < currentSchema.value.steps.length) {\n currentStep.value = index\n }\n }\n\n // -- Validate (skip hidden fields) -----------------------------------------\n function validate(): boolean {\n let allValid = true\n for (const field of fields) {\n if (!isFieldVisible(field.name)) continue\n form.setFieldTouched(field.name, true)\n if (!form.validateField(field.name)) {\n allValid = false\n }\n }\n return allValid\n }\n\n // -- Submit ----------------------------------------------------------------\n async function submit(): Promise<void> {\n if (!validate()) return\n\n // Build submission data excluding hidden fields\n let submitData = {} as Record<string, unknown>\n for (const field of fields) {\n if (isFieldVisible(field.name)) {\n submitData[field.name] = (form.data as Record<string, unknown>)[field.name]\n }\n }\n\n if (enhancements?.transform) {\n submitData = enhancements.transform(submitData as T) as Record<string, unknown>\n }\n\n if (enhancements?.onSubmit) {\n form.isSubmitting.value = true\n try {\n await enhancements.onSubmit(submitData as T)\n } finally {\n form.isSubmitting.value = false\n }\n }\n }\n\n // -- Reset -----------------------------------------------------------------\n function reset(values?: Partial<T>): void {\n form.reset(values)\n currentStep.value = 0\n }\n\n function updateSchema(nextSchema: FormSchema, nextData?: Partial<T>): void {\n currentSchema.value = nextSchema\n\n const nextFields = flattenFields(nextSchema)\n replaceArray(fields, nextFields)\n replaceArray(sections, collectSections(nextSchema))\n replaceRecord(rules, buildRules(nextFields, enhancements))\n form.replaceState(buildInitialValues<T>(nextFields, nextData) as T)\n currentStep.value = 0\n }\n\n // -- onFieldChange wiring --------------------------------------------------\n if (enhancements?.onFieldChange) {\n const callback = enhancements.onFieldChange\n watch(\n () => ({ ...(form.data as Record<string, unknown>) }),\n (newData, oldData) => {\n if (!oldData) return\n for (const key of Object.keys(newData)) {\n if (newData[key] !== oldData[key]) {\n callback(key as keyof T, newData[key], newData as T)\n }\n }\n },\n { deep: true },\n )\n }\n\n return {\n form: form as UseFormReturn<T>,\n rules: rules as Partial<Record<keyof T, FieldRules>>,\n isFieldVisible,\n isSectionVisible,\n fields,\n getResolvedFieldProps,\n getFieldOptions,\n currentStep,\n isCurrentStepValid,\n goNext,\n goBack,\n goToStep,\n validate,\n reset,\n submit,\n updateSchema,\n }\n}\n","import type { FormSchema } from '../types/form-builder'\nimport { isRecord } from './records'\n\nexport function recordValuesEqualForKeys(\n left: Record<string, unknown>,\n right: Record<string, unknown>,\n keys: readonly string[],\n): boolean {\n for (const key of keys) {\n if (!valuesEqual(left[key], right[key])) return false\n }\n return true\n}\n\nexport function pickRecordKeys(\n source: Record<string, unknown>,\n keys: readonly string[],\n): Record<string, unknown> {\n return Object.fromEntries(keys.map(key => [key, source[key]]))\n}\n\nexport function pickExistingRecordKeys(\n source: Record<string, unknown>,\n keys: readonly string[],\n): Record<string, unknown> {\n return Object.fromEntries(\n keys\n .filter(key => Object.prototype.hasOwnProperty.call(source, key))\n .map(key => [key, source[key]]),\n )\n}\n\nexport function formSchemaFieldNames(schema: FormSchema): string[] {\n const sections = schema.steps\n ? schema.steps.flatMap(step => step.sections)\n : schema.sections\n return sections.flatMap(section => section.fields.map(field => field.name))\n}\n\nexport function valuesEqual(left: unknown, right: unknown): boolean {\n if (Object.is(left, right)) return true\n if (Array.isArray(left) && Array.isArray(right)) {\n return left.length === right.length && left.every((item, index) => valuesEqual(item, right[index]))\n }\n if (isRecord(left) && isRecord(right)) {\n return recordValuesEqualForKeys(left, right, [...new Set([...Object.keys(left), ...Object.keys(right)])])\n }\n return false\n}\n\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { FormFieldSchema } from '../../types/form-builder'\nimport type { UseFormReturn } from '../../composables/useForm'\nimport { getFieldRegistryEntry } from '../../composables/formBuilderRegistry'\nimport FormField from '../FormField.vue'\n\ninterface Props {\n field: FormFieldSchema\n resolvedProps: Record<string, unknown>\n form: UseFormReturn<Record<string, unknown>>\n}\n\nconst props = defineProps<Props>()\n\nconst entry = computed(() => getFieldRegistryEntry(props.field.type))\n\nconst isChoiceField = computed(() =>\n props.field.type === 'checkbox' || props.field.type === 'toggle',\n)\n\nconst componentProps = computed<Record<string, unknown>>(() => {\n if (props.field.type === 'multiselect') {\n const values = Array.isArray(props.resolvedProps.modelValue) ? props.resolvedProps.modelValue : []\n return { ...props.resolvedProps, modelValue: values }\n }\n if (props.field.type === 'tags') {\n const values = Array.isArray(props.resolvedProps.modelValue) ? props.resolvedProps.modelValue : []\n const onUpdate = props.resolvedProps['onUpdate:modelValue'] as ((value: unknown) => void) | undefined\n // TagsInput edits strings; numeric fields are parsed back on the way out so\n // nullable or numeric form data is displayed without being replaced.\n return {\n ...props.resolvedProps,\n modelValue: values.map(String),\n 'onUpdate:modelValue': (next: unknown) => onUpdate?.(\n props.field.itemType === 'number' && Array.isArray(next) ? next.map(Number) : next,\n ),\n }\n }\n if (!isChoiceField.value) return props.resolvedProps\n\n return {\n layout: 'row',\n label: props.field.label,\n description: props.field.hint,\n icon: props.field.icon,\n iconColor: props.field.iconColor,\n iconBg: props.field.iconBg,\n ...props.resolvedProps,\n }\n})\n\nconst errorMessage = computed(() => {\n const name = props.field.name\n return props.form.touched[name] ? props.form.errors[name] : null\n})\n\nfunction handleUpload(files: File[]) {\n props.form.setFieldValue(props.field.name, files)\n}\n</script>\n\n<template>\n <FormField\n :label=\"isChoiceField ? undefined : field.label\"\n :error=\"errorMessage ?? undefined\"\n :hint=\"isChoiceField ? undefined : field.hint\"\n :required=\"!!field.validation?.required\"\n :html-for=\"isChoiceField ? undefined : field.name\"\n >\n <slot :name=\"`field:${field.name}`\" :field=\"field\" :form=\"form\" :field-props=\"form.getFieldProps(field.name)\">\n <component\n :is=\"entry.component\"\n v-if=\"entry.vModel\"\n v-bind=\"componentProps\"\n />\n <component\n :is=\"entry.component\"\n v-else\n v-bind=\"componentProps\"\n @upload=\"handleUpload\"\n />\n </slot>\n </FormField>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { FormFieldSchema } from '../../types/form-builder'\nimport type { UseFormReturn } from '../../composables/useForm'\nimport { getFieldRegistryEntry } from '../../composables/formBuilderRegistry'\nimport FormField from '../FormField.vue'\n\ninterface Props {\n field: FormFieldSchema\n resolvedProps: Record<string, unknown>\n form: UseFormReturn<Record<string, unknown>>\n}\n\nconst props = defineProps<Props>()\n\nconst entry = computed(() => getFieldRegistryEntry(props.field.type))\n\nconst isChoiceField = computed(() =>\n props.field.type === 'checkbox' || props.field.type === 'toggle',\n)\n\nconst componentProps = computed<Record<string, unknown>>(() => {\n if (props.field.type === 'multiselect') {\n const values = Array.isArray(props.resolvedProps.modelValue) ? props.resolvedProps.modelValue : []\n return { ...props.resolvedProps, modelValue: values }\n }\n if (props.field.type === 'tags') {\n const values = Array.isArray(props.resolvedProps.modelValue) ? props.resolvedProps.modelValue : []\n const onUpdate = props.resolvedProps['onUpdate:modelValue'] as ((value: unknown) => void) | undefined\n // TagsInput edits strings; numeric fields are parsed back on the way out so\n // nullable or numeric form data is displayed without being replaced.\n return {\n ...props.resolvedProps,\n modelValue: values.map(String),\n 'onUpdate:modelValue': (next: unknown) => onUpdate?.(\n props.field.itemType === 'number' && Array.isArray(next) ? next.map(Number) : next,\n ),\n }\n }\n if (!isChoiceField.value) return props.resolvedProps\n\n return {\n layout: 'row',\n label: props.field.label,\n description: props.field.hint,\n icon: props.field.icon,\n iconColor: props.field.iconColor,\n iconBg: props.field.iconBg,\n ...props.resolvedProps,\n }\n})\n\nconst errorMessage = computed(() => {\n const name = props.field.name\n return props.form.touched[name] ? props.form.errors[name] : null\n})\n\nfunction handleUpload(files: File[]) {\n props.form.setFieldValue(props.field.name, files)\n}\n</script>\n\n<template>\n <FormField\n :label=\"isChoiceField ? undefined : field.label\"\n :error=\"errorMessage ?? undefined\"\n :hint=\"isChoiceField ? undefined : field.hint\"\n :required=\"!!field.validation?.required\"\n :html-for=\"isChoiceField ? undefined : field.name\"\n >\n <slot :name=\"`field:${field.name}`\" :field=\"field\" :form=\"form\" :field-props=\"form.getFieldProps(field.name)\">\n <component\n :is=\"entry.component\"\n v-if=\"entry.vModel\"\n v-bind=\"componentProps\"\n />\n <component\n :is=\"entry.component\"\n v-else\n v-bind=\"componentProps\"\n @upload=\"handleUpload\"\n />\n </slot>\n </FormField>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { FormSectionSchema, UseFormBuilderReturn } from '../../types/form-builder'\nimport CollapsibleCard from '../CollapsibleCard.vue'\nimport FormFieldRendererInternal from './FormFieldRendererInternal.vue'\n\ninterface Props {\n section: FormSectionSchema\n builder: UseFormBuilderReturn<Record<string, unknown>>\n}\n\nconst props = defineProps<Props>()\n\nconst visibleFields = computed(() =>\n props.section.fields.filter((f) => props.builder.isFieldVisible(f.name)),\n)\n\nconst gridStyle = computed(() => ({\n gridTemplateColumns: `repeat(${props.section.columns ?? 1}, 1fr)`,\n}))\n</script>\n\n<template>\n <div v-if=\"visibleFields.length > 0\" class=\"mint-form-section\">\n <slot :name=\"`section:${section.id}`\" :section=\"section\" :form=\"builder.form\">\n <CollapsibleCard\n v-if=\"section.collapsible\"\n :title=\"section.title\"\n :subtitle=\"section.description\"\n :default-open=\"section.defaultOpen ?? true\"\n >\n <div class=\"mint-form-section__grid\" :style=\"gridStyle\">\n <div\n v-for=\"field in visibleFields\"\n :key=\"field.name\"\n :style=\"field.colSpan ? { gridColumn: `span ${field.colSpan}` } : undefined\"\n >\n <slot :name=\"`field:${field.name}`\" :field=\"field\" :form=\"builder.form\" :field-props=\"builder.form.getFieldProps(field.name)\">\n <FormFieldRendererInternal\n :field=\"field\"\n :resolved-props=\"builder.getResolvedFieldProps(field)\"\n :form=\"builder.form\"\n />\n </slot>\n </div>\n </div>\n </CollapsibleCard>\n\n <div v-else class=\"mint-form-section--static\">\n <div v-if=\"section.title || section.description\" class=\"mint-form-section__header\">\n <h3 v-if=\"section.title\" class=\"mint-form-section__title\">{{ section.title }}</h3>\n <p v-if=\"section.description\" class=\"mint-form-section__description\">{{ section.description }}</p>\n </div>\n <div class=\"mint-form-section__grid\" :style=\"gridStyle\">\n <div\n v-for=\"field in visibleFields\"\n :key=\"field.name\"\n :style=\"field.colSpan ? { gridColumn: `span ${field.colSpan}` } : undefined\"\n >\n <slot :name=\"`field:${field.name}`\" :field=\"field\" :form=\"builder.form\" :field-props=\"builder.form.getFieldProps(field.name)\">\n <FormFieldRendererInternal\n :field=\"field\"\n :resolved-props=\"builder.getResolvedFieldProps(field)\"\n :form=\"builder.form\"\n />\n </slot>\n </div>\n </div>\n </div>\n </slot>\n\n <slot :name=\"`section:${section.id}:after`\" :form=\"builder.form\" />\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { FormSectionSchema, UseFormBuilderReturn } from '../../types/form-builder'\nimport CollapsibleCard from '../CollapsibleCard.vue'\nimport FormFieldRendererInternal from './FormFieldRendererInternal.vue'\n\ninterface Props {\n section: FormSectionSchema\n builder: UseFormBuilderReturn<Record<string, unknown>>\n}\n\nconst props = defineProps<Props>()\n\nconst visibleFields = computed(() =>\n props.section.fields.filter((f) => props.builder.isFieldVisible(f.name)),\n)\n\nconst gridStyle = computed(() => ({\n gridTemplateColumns: `repeat(${props.section.columns ?? 1}, 1fr)`,\n}))\n</script>\n\n<template>\n <div v-if=\"visibleFields.length > 0\" class=\"mint-form-section\">\n <slot :name=\"`section:${section.id}`\" :section=\"section\" :form=\"builder.form\">\n <CollapsibleCard\n v-if=\"section.collapsible\"\n :title=\"section.title\"\n :subtitle=\"section.description\"\n :default-open=\"section.defaultOpen ?? true\"\n >\n <div class=\"mint-form-section__grid\" :style=\"gridStyle\">\n <div\n v-for=\"field in visibleFields\"\n :key=\"field.name\"\n :style=\"field.colSpan ? { gridColumn: `span ${field.colSpan}` } : undefined\"\n >\n <slot :name=\"`field:${field.name}`\" :field=\"field\" :form=\"builder.form\" :field-props=\"builder.form.getFieldProps(field.name)\">\n <FormFieldRendererInternal\n :field=\"field\"\n :resolved-props=\"builder.getResolvedFieldProps(field)\"\n :form=\"builder.form\"\n />\n </slot>\n </div>\n </div>\n </CollapsibleCard>\n\n <div v-else class=\"mint-form-section--static\">\n <div v-if=\"section.title || section.description\" class=\"mint-form-section__header\">\n <h3 v-if=\"section.title\" class=\"mint-form-section__title\">{{ section.title }}</h3>\n <p v-if=\"section.description\" class=\"mint-form-section__description\">{{ section.description }}</p>\n </div>\n <div class=\"mint-form-section__grid\" :style=\"gridStyle\">\n <div\n v-for=\"field in visibleFields\"\n :key=\"field.name\"\n :style=\"field.colSpan ? { gridColumn: `span ${field.colSpan}` } : undefined\"\n >\n <slot :name=\"`field:${field.name}`\" :field=\"field\" :form=\"builder.form\" :field-props=\"builder.form.getFieldProps(field.name)\">\n <FormFieldRendererInternal\n :field=\"field\"\n :resolved-props=\"builder.getResolvedFieldProps(field)\"\n :form=\"builder.form\"\n />\n </slot>\n </div>\n </div>\n </div>\n </slot>\n\n <slot :name=\"`section:${section.id}:after`\" :form=\"builder.form\" />\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * Action bar rendered at the bottom of a FormBuilder (`actions` in the control model).\n *\n * Supports two modes:\n * - Flat form: shows an optional Cancel button and a Submit button.\n * - Wizard (`isWizard=true`): shows Back / Next on intermediate steps and\n * Submit only on the last step. Back is hidden on the first step.\n *\n * The `canProceed` prop gates the primary action (Next or Submit) to prevent\n * advancing when the current step has validation errors.\n */\nimport BaseButton from '../BaseButton.vue'\n\ninterface Props {\n isWizard?: boolean\n isFirst?: boolean\n isLast?: boolean\n canProceed?: boolean\n loading?: boolean\n disabled?: boolean\n submitLabel?: string\n cancelLabel?: string\n showCancel?: boolean\n}\n\nwithDefaults(defineProps<Props>(), {\n isWizard: false,\n isFirst: true,\n isLast: true,\n canProceed: true,\n loading: false,\n disabled: false,\n submitLabel: 'Submit',\n cancelLabel: 'Cancel',\n showCancel: false,\n})\n\nconst emit = defineEmits<{\n submit: []\n cancel: []\n back: []\n next: []\n}>()\n</script>\n\n<template>\n <div class=\"mint-form-actions\">\n <BaseButton\n v-if=\"showCancel\"\n variant=\"ghost\"\n :disabled=\"loading || disabled\"\n @click=\"emit('cancel')\"\n >\n {{ cancelLabel }}\n </BaseButton>\n\n <div style=\"flex: 1\" />\n\n <BaseButton\n v-if=\"isWizard && !isFirst\"\n variant=\"secondary\"\n :disabled=\"loading || disabled\"\n @click=\"emit('back')\"\n >\n Back\n </BaseButton>\n\n <BaseButton\n v-if=\"isWizard && !isLast\"\n variant=\"primary\"\n :disabled=\"!canProceed || loading || disabled\"\n @click=\"emit('next')\"\n >\n Next\n </BaseButton>\n\n <BaseButton\n v-if=\"!isWizard || isLast\"\n variant=\"primary\"\n :loading=\"loading\"\n :disabled=\"!canProceed || loading || disabled\"\n @click=\"emit('submit')\"\n >\n {{ submitLabel }}\n </BaseButton>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * Action bar rendered at the bottom of a FormBuilder (`actions` in the control model).\n *\n * Supports two modes:\n * - Flat form: shows an optional Cancel button and a Submit button.\n * - Wizard (`isWizard=true`): shows Back / Next on intermediate steps and\n * Submit only on the last step. Back is hidden on the first step.\n *\n * The `canProceed` prop gates the primary action (Next or Submit) to prevent\n * advancing when the current step has validation errors.\n */\nimport BaseButton from '../BaseButton.vue'\n\ninterface Props {\n isWizard?: boolean\n isFirst?: boolean\n isLast?: boolean\n canProceed?: boolean\n loading?: boolean\n disabled?: boolean\n submitLabel?: string\n cancelLabel?: string\n showCancel?: boolean\n}\n\nwithDefaults(defineProps<Props>(), {\n isWizard: false,\n isFirst: true,\n isLast: true,\n canProceed: true,\n loading: false,\n disabled: false,\n submitLabel: 'Submit',\n cancelLabel: 'Cancel',\n showCancel: false,\n})\n\nconst emit = defineEmits<{\n submit: []\n cancel: []\n back: []\n next: []\n}>()\n</script>\n\n<template>\n <div class=\"mint-form-actions\">\n <BaseButton\n v-if=\"showCancel\"\n variant=\"ghost\"\n :disabled=\"loading || disabled\"\n @click=\"emit('cancel')\"\n >\n {{ cancelLabel }}\n </BaseButton>\n\n <div style=\"flex: 1\" />\n\n <BaseButton\n v-if=\"isWizard && !isFirst\"\n variant=\"secondary\"\n :disabled=\"loading || disabled\"\n @click=\"emit('back')\"\n >\n Back\n </BaseButton>\n\n <BaseButton\n v-if=\"isWizard && !isLast\"\n variant=\"primary\"\n :disabled=\"!canProceed || loading || disabled\"\n @click=\"emit('next')\"\n >\n Next\n </BaseButton>\n\n <BaseButton\n v-if=\"!isWizard || isLast\"\n variant=\"primary\"\n :loading=\"loading\"\n :disabled=\"!canProceed || loading || disabled\"\n @click=\"emit('submit')\"\n >\n {{ submitLabel }}\n </BaseButton>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * FormSchema renderer behind FormBuilder and the sidebar forms: flat sections\n * or a multi-step wizard, with the action bar when `schema.actions` is set.\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\n */\nimport { ref, computed, watch } from 'vue'\nimport type { FormSchema, FormEnhancements, UseFormBuilderReturn } from '../../types/form-builder'\nimport type { WizardStep } from '../../types'\nimport { useFormBuilder } from '../../composables/useFormBuilder'\nimport {\n formSchemaFieldNames,\n pickExistingRecordKeys,\n recordValuesEqualForKeys,\n} from '../../utils/formModelSync'\nimport StepWizard from '../StepWizard.vue'\nimport FormSectionRenderer from './FormSectionRenderer.vue'\nimport FormActionsInternal from './FormActionsInternal.vue'\n\ninterface Props {\n schema: FormSchema\n /** Values under `modelValue`: control defaults and initial values. */\n defaults?: Record<string, unknown>\n modelValue?: Record<string, unknown>\n enhancements?: FormEnhancements<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 defaults: () => ({}),\n loading: false,\n disabled: false,\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 resolvedSchema = computed<FormSchema>(() => props.schema)\n\nconst resolvedModelValue = computed<Record<string, unknown>>(() => ({\n ...props.defaults,\n ...(props.modelValue ?? {}),\n}))\n\nconst builder = useFormBuilder(\n resolvedSchema.value,\n resolvedModelValue.value,\n props.enhancements,\n)\n\n// Sync schema/control changes into the internal builder so generated forms stay coherent.\nwatch(\n resolvedSchema,\n (schema) => {\n const fieldNames = formSchemaFieldNames(schema)\n const schemaValues = pickExistingRecordKeys(resolvedModelValue.value, fieldNames)\n const existingValues = pickExistingRecordKeys(\n builder.form.data as Record<string, unknown>,\n fieldNames,\n )\n const nextValues = props.modelValue === undefined\n ? { ...schemaValues, ...existingValues }\n : schemaValues\n\n builder.updateSchema(schema, nextValues)\n },\n { deep: true },\n)\n\n// Sync external modelValue changes into the internal form without resetting on no-op echo updates.\nwatch(\n () => props.modelValue,\n () => {\n const data = resolvedModelValue.value\n const fieldNames = builderFieldNames()\n if (recordValuesEqualForKeys(data, builder.form.data as Record<string, unknown>, fieldNames)) return\n builder.reset(pickExistingRecordKeys(data, fieldNames))\n },\n { deep: true },\n)\n\n// Sync modelValue changes back to parent\nwatch(\n () => ({ ...builder.form.data }),\n (data) => emit('update:modelValue', data as Record<string, unknown>),\n { deep: true },\n)\n\n// Wizard support\nconst isWizard = computed(() => !!resolvedSchema.value.steps)\nconst wizardRef = ref<InstanceType<typeof StepWizard> | null>(null)\n\nconst wizardSteps = computed<WizardStep[]>(() => {\n if (!resolvedSchema.value.steps) return []\n return resolvedSchema.value.steps.map((step) => ({\n id: step.id,\n label: step.label,\n description: step.description,\n icon: step.icon,\n optional: step.optional,\n }))\n})\n\n// Sync step validation state with StepWizard\nwatch(\n () => builder.isCurrentStepValid.value,\n (valid) => {\n wizardRef.value?.setStepValid(builder.currentStep.value, valid)\n },\n)\n\nfunction handleNext() {\n const success = builder.goNext()\n if (success) {\n wizardRef.value?.setStepValid(builder.currentStep.value - 1, true)\n }\n}\n\nasync function handleSubmit() {\n await builder.submit()\n const formData = builder.form.data as Record<string, unknown>\n const visibleData = Object.fromEntries(\n builder.fields\n .filter((f) => builder.isFieldVisible(f.name))\n .map((f) => [f.name, formData[f.name]]),\n )\n emit('submit', visibleData)\n}\n\nfunction handleCancel() {\n emit('cancel')\n}\n\nfunction builderFieldNames(): string[] {\n return builder.fields.map(field => field.name)\n}\n\ndefineExpose({\n form: builder.form,\n validate: builder.validate,\n reset: builder.reset,\n updateSchema: builder.updateSchema,\n goNext: builder.goNext,\n goBack: builder.goBack,\n goToStep: builder.goToStep,\n builder,\n})\n</script>\n\n<template>\n <div :class=\"['mint-form-builder', size ? `mint-form-builder--${size}` : '']\">\n <!-- Wizard mode -->\n <template v-if=\"isWizard && resolvedSchema.steps\">\n <StepWizard\n ref=\"wizardRef\"\n :steps=\"wizardSteps\"\n :model-value=\"builder.currentStep.value\"\n @update:model-value=\"builder.goToStep($event)\"\n >\n <template v-for=\"step in resolvedSchema.steps\" :key=\"step.id\" #[`step-${step.id}`]>\n <div class=\"mint-form-builder__step\">\n <template v-for=\"section in step.sections\" :key=\"section.id\">\n <FormSectionRenderer\n v-if=\"builder.isSectionVisible(section.id)\"\n :section=\"section\"\n :builder=\"(builder as UseFormBuilderReturn<Record<string, unknown>>)\"\n >\n <!-- Forward field slots -->\n <template v-for=\"field in section.fields\" :key=\"field.name\" #[`field:${field.name}`]=\"slotProps\">\n <slot :name=\"`field:${field.name}`\" v-bind=\"slotProps\" />\n </template>\n <!-- Forward section slots -->\n <template #[`section:${section.id}`]=\"slotProps\">\n <slot :name=\"`section:${section.id}`\" v-bind=\"slotProps\" />\n </template>\n <template #[`section:${section.id}:after`]=\"slotProps\">\n <slot :name=\"`section:${section.id}:after`\" v-bind=\"slotProps\" />\n </template>\n </FormSectionRenderer>\n </template>\n </div>\n </template>\n\n <template v-if=\"resolvedSchema.actions\" #navigation=\"{ isFirst, isLast }\">\n <slot name=\"actions\" :form=\"builder.form\" :builder=\"builder\">\n <FormActionsInternal\n is-wizard\n :is-first=\"isFirst\"\n :is-last=\"isLast\"\n :can-proceed=\"builder.isCurrentStepValid.value\"\n :loading=\"loading || builder.form.isSubmitting.value\"\n :disabled=\"disabled\"\n :submit-label=\"resolvedSchema.submitLabel ?? 'Submit'\"\n :cancel-label=\"resolvedSchema.cancelLabel ?? 'Cancel'\"\n :show-cancel=\"resolvedSchema.showCancel ?? false\"\n @next=\"handleNext\"\n @back=\"builder.goBack\"\n @submit=\"handleSubmit\"\n @cancel=\"handleCancel\"\n />\n </slot>\n </template>\n </StepWizard>\n </template>\n\n <!-- Flat mode -->\n <template v-else-if=\"resolvedSchema.sections\">\n <template v-for=\"section in resolvedSchema.sections\" :key=\"section.id\">\n <FormSectionRenderer\n v-if=\"builder.isSectionVisible(section.id)\"\n :section=\"section\"\n :builder=\"(builder as UseFormBuilderReturn<Record<string, unknown>>)\"\n >\n <!-- Forward field slots -->\n <template v-for=\"field in section.fields\" :key=\"field.name\" #[`field:${field.name}`]=\"slotProps\">\n <slot :name=\"`field:${field.name}`\" v-bind=\"slotProps\" />\n </template>\n <!-- Forward section slots -->\n <template #[`section:${section.id}`]=\"slotProps\">\n <slot :name=\"`section:${section.id}`\" v-bind=\"slotProps\" />\n </template>\n <template #[`section:${section.id}:after`]=\"slotProps\">\n <slot :name=\"`section:${section.id}:after`\" v-bind=\"slotProps\" />\n </template>\n </FormSectionRenderer>\n </template>\n\n <slot v-if=\"resolvedSchema.actions\" name=\"actions\" :form=\"builder.form\" :builder=\"builder\">\n <FormActionsInternal\n :loading=\"loading || builder.form.isSubmitting.value\"\n :disabled=\"disabled\"\n :submit-label=\"resolvedSchema.submitLabel ?? 'Submit'\"\n :cancel-label=\"resolvedSchema.cancelLabel ?? 'Cancel'\"\n :show-cancel=\"resolvedSchema.showCancel ?? false\"\n @submit=\"handleSubmit\"\n @cancel=\"handleCancel\"\n />\n </slot>\n </template>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * FormSchema renderer behind FormBuilder and the sidebar forms: flat sections\n * or a multi-step wizard, with the action bar when `schema.actions` is set.\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\n */\nimport { ref, computed, watch } from 'vue'\nimport type { FormSchema, FormEnhancements, UseFormBuilderReturn } from '../../types/form-builder'\nimport type { WizardStep } from '../../types'\nimport { useFormBuilder } from '../../composables/useFormBuilder'\nimport {\n formSchemaFieldNames,\n pickExistingRecordKeys,\n recordValuesEqualForKeys,\n} from '../../utils/formModelSync'\nimport StepWizard from '../StepWizard.vue'\nimport FormSectionRenderer from './FormSectionRenderer.vue'\nimport FormActionsInternal from './FormActionsInternal.vue'\n\ninterface Props {\n schema: FormSchema\n /** Values under `modelValue`: control defaults and initial values. */\n defaults?: Record<string, unknown>\n modelValue?: Record<string, unknown>\n enhancements?: FormEnhancements<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 defaults: () => ({}),\n loading: false,\n disabled: false,\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 resolvedSchema = computed<FormSchema>(() => props.schema)\n\nconst resolvedModelValue = computed<Record<string, unknown>>(() => ({\n ...props.defaults,\n ...(props.modelValue ?? {}),\n}))\n\nconst builder = useFormBuilder(\n resolvedSchema.value,\n resolvedModelValue.value,\n props.enhancements,\n)\n\n// Sync schema/control changes into the internal builder so generated forms stay coherent.\nwatch(\n resolvedSchema,\n (schema) => {\n const fieldNames = formSchemaFieldNames(schema)\n const schemaValues = pickExistingRecordKeys(resolvedModelValue.value, fieldNames)\n const existingValues = pickExistingRecordKeys(\n builder.form.data as Record<string, unknown>,\n fieldNames,\n )\n const nextValues = props.modelValue === undefined\n ? { ...schemaValues, ...existingValues }\n : schemaValues\n\n builder.updateSchema(schema, nextValues)\n },\n { deep: true },\n)\n\n// Sync external modelValue changes into the internal form without resetting on no-op echo updates.\nwatch(\n () => props.modelValue,\n () => {\n const data = resolvedModelValue.value\n const fieldNames = builderFieldNames()\n if (recordValuesEqualForKeys(data, builder.form.data as Record<string, unknown>, fieldNames)) return\n builder.reset(pickExistingRecordKeys(data, fieldNames))\n },\n { deep: true },\n)\n\n// Sync modelValue changes back to parent\nwatch(\n () => ({ ...builder.form.data }),\n (data) => emit('update:modelValue', data as Record<string, unknown>),\n { deep: true },\n)\n\n// Wizard support\nconst isWizard = computed(() => !!resolvedSchema.value.steps)\nconst wizardRef = ref<InstanceType<typeof StepWizard> | null>(null)\n\nconst wizardSteps = computed<WizardStep[]>(() => {\n if (!resolvedSchema.value.steps) return []\n return resolvedSchema.value.steps.map((step) => ({\n id: step.id,\n label: step.label,\n description: step.description,\n icon: step.icon,\n optional: step.optional,\n }))\n})\n\n// Sync step validation state with StepWizard\nwatch(\n () => builder.isCurrentStepValid.value,\n (valid) => {\n wizardRef.value?.setStepValid(builder.currentStep.value, valid)\n },\n)\n\nfunction handleNext() {\n const success = builder.goNext()\n if (success) {\n wizardRef.value?.setStepValid(builder.currentStep.value - 1, true)\n }\n}\n\nasync function handleSubmit() {\n await builder.submit()\n const formData = builder.form.data as Record<string, unknown>\n const visibleData = Object.fromEntries(\n builder.fields\n .filter((f) => builder.isFieldVisible(f.name))\n .map((f) => [f.name, formData[f.name]]),\n )\n emit('submit', visibleData)\n}\n\nfunction handleCancel() {\n emit('cancel')\n}\n\nfunction builderFieldNames(): string[] {\n return builder.fields.map(field => field.name)\n}\n\ndefineExpose({\n form: builder.form,\n validate: builder.validate,\n reset: builder.reset,\n updateSchema: builder.updateSchema,\n goNext: builder.goNext,\n goBack: builder.goBack,\n goToStep: builder.goToStep,\n builder,\n})\n</script>\n\n<template>\n <div :class=\"['mint-form-builder', size ? `mint-form-builder--${size}` : '']\">\n <!-- Wizard mode -->\n <template v-if=\"isWizard && resolvedSchema.steps\">\n <StepWizard\n ref=\"wizardRef\"\n :steps=\"wizardSteps\"\n :model-value=\"builder.currentStep.value\"\n @update:model-value=\"builder.goToStep($event)\"\n >\n <template v-for=\"step in resolvedSchema.steps\" :key=\"step.id\" #[`step-${step.id}`]>\n <div class=\"mint-form-builder__step\">\n <template v-for=\"section in step.sections\" :key=\"section.id\">\n <FormSectionRenderer\n v-if=\"builder.isSectionVisible(section.id)\"\n :section=\"section\"\n :builder=\"(builder as UseFormBuilderReturn<Record<string, unknown>>)\"\n >\n <!-- Forward field slots -->\n <template v-for=\"field in section.fields\" :key=\"field.name\" #[`field:${field.name}`]=\"slotProps\">\n <slot :name=\"`field:${field.name}`\" v-bind=\"slotProps\" />\n </template>\n <!-- Forward section slots -->\n <template #[`section:${section.id}`]=\"slotProps\">\n <slot :name=\"`section:${section.id}`\" v-bind=\"slotProps\" />\n </template>\n <template #[`section:${section.id}:after`]=\"slotProps\">\n <slot :name=\"`section:${section.id}:after`\" v-bind=\"slotProps\" />\n </template>\n </FormSectionRenderer>\n </template>\n </div>\n </template>\n\n <template v-if=\"resolvedSchema.actions\" #navigation=\"{ isFirst, isLast }\">\n <slot name=\"actions\" :form=\"builder.form\" :builder=\"builder\">\n <FormActionsInternal\n is-wizard\n :is-first=\"isFirst\"\n :is-last=\"isLast\"\n :can-proceed=\"builder.isCurrentStepValid.value\"\n :loading=\"loading || builder.form.isSubmitting.value\"\n :disabled=\"disabled\"\n :submit-label=\"resolvedSchema.submitLabel ?? 'Submit'\"\n :cancel-label=\"resolvedSchema.cancelLabel ?? 'Cancel'\"\n :show-cancel=\"resolvedSchema.showCancel ?? false\"\n @next=\"handleNext\"\n @back=\"builder.goBack\"\n @submit=\"handleSubmit\"\n @cancel=\"handleCancel\"\n />\n </slot>\n </template>\n </StepWizard>\n </template>\n\n <!-- Flat mode -->\n <template v-else-if=\"resolvedSchema.sections\">\n <template v-for=\"section in resolvedSchema.sections\" :key=\"section.id\">\n <FormSectionRenderer\n v-if=\"builder.isSectionVisible(section.id)\"\n :section=\"section\"\n :builder=\"(builder as UseFormBuilderReturn<Record<string, unknown>>)\"\n >\n <!-- Forward field slots -->\n <template v-for=\"field in section.fields\" :key=\"field.name\" #[`field:${field.name}`]=\"slotProps\">\n <slot :name=\"`field:${field.name}`\" v-bind=\"slotProps\" />\n </template>\n <!-- Forward section slots -->\n <template #[`section:${section.id}`]=\"slotProps\">\n <slot :name=\"`section:${section.id}`\" v-bind=\"slotProps\" />\n </template>\n <template #[`section:${section.id}:after`]=\"slotProps\">\n <slot :name=\"`section:${section.id}:after`\" v-bind=\"slotProps\" />\n </template>\n </FormSectionRenderer>\n </template>\n\n <slot v-if=\"resolvedSchema.actions\" name=\"actions\" :form=\"builder.form\" :builder=\"builder\">\n <FormActionsInternal\n :loading=\"loading || builder.form.isSubmitting.value\"\n :disabled=\"disabled\"\n :submit-label=\"resolvedSchema.submitLabel ?? 'Submit'\"\n :cancel-label=\"resolvedSchema.cancelLabel ?? 'Cancel'\"\n :show-cancel=\"resolvedSchema.showCancel ?? false\"\n @submit=\"handleSubmit\"\n @cancel=\"handleCancel\"\n />\n </slot>\n </template>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * AppSidebar - Context-sensitive toolkit panel\n *\n * Shows tool sections relevant to the active view. Sections come from the\n * spec: a `controls` model built with `defineControlModel()` generates them,\n * and hand-written `panels` are merged over the generated ones. Each section\n * renders as a flat group (header row + hairline, no nested card). Controls\n * can be provided through named slots or auto-rendered from the section forms.\n *\n * When activeView is omitted, the first non-empty panel view is selected.\n * When no view has matching panels, the sidebar hides entirely.\n *\n * @example Recommended\n * ```vue\n * <AppSidebar v-model:values=\"values\" :spec=\"{ title: 'Parameters', controls: sidebarModel }\" />\n * ```\n */\nimport { computed, ref, useSlots, type Slots } from 'vue'\nimport type { PluginWorkspaceSidebarSpec, SidebarToolSection, SidebarToolSectionAction } from '../types'\nimport type { FormSchema } from '../types/form-builder'\nimport {\n controlsToSectionFormSchemas,\n controlsToSidebarPanels,\n getControlDefaults,\n} from '../composables/useControlSchema'\nimport { applySpecDefaults } from '../composables/componentSpecs'\nimport FormSchemaInternal from './internal/FormSchemaInternal.vue'\n\ninterface Props {\n /** Structure: header, sections, forms, width, side, collapse. Optional: every option has a default. */\n spec?: PluginWorkspaceSidebarSpec\n /** Which view's panels to display. Defaults to the first non-empty panel view. */\n activeView?: string\n /** Values of the section forms. Bind with `v-model:values`. */\n values?: Record<string, unknown>\n /** Collapsed state. Bind with `v-model:collapsed`; unbound, the sidebar keeps its own. */\n collapsed?: boolean\n /** On / off state of the section toggles, keyed by section id. */\n toggleState?: Record<string, boolean>\n /** Loading / saving state of the section forms. */\n formLoading?: boolean\n /** Disabled state of the section forms. */\n formDisabled?: boolean\n /** Readonly state of the section forms. */\n formReadonly?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n spec: () => ({}),\n activeView: '',\n values: () => ({}),\n collapsed: undefined,\n toggleState: () => ({}),\n formLoading: false,\n formDisabled: false,\n formReadonly: false,\n})\n\nconst config = computed(() => applySpecDefaults({\n panels: {},\n forms: {},\n floating: true,\n dense: true,\n width: '280px',\n position: 'left',\n whenEmpty: false,\n formSize: 'sm',\n collapsible: false,\n collapsedWidth: '3rem',\n collapseButtonLabel: 'Collapse sidebar',\n expandButtonLabel: 'Expand sidebar',\n}, props.spec))\n\nconst emit = defineEmits<{\n 'update:toggle': [sectionId: string, value: boolean]\n 'update:values': [values: Record<string, unknown>]\n 'update:collapsed': [value: boolean]\n 'section-action': [sectionId: string, actionId: string]\n 'form-submit': [sectionId: string, values: Record<string, unknown>]\n 'form-cancel': [sectionId: string]\n}>()\n\nconst slots: Slots = useSlots()\nconst internalCollapsed = ref(false)\nconst collapsedModel = computed({\n get: () => props.collapsed ?? internalCollapsed.value,\n set: (value: boolean) => {\n internalCollapsed.value = value\n emit('update:collapsed', value)\n },\n})\n\n// Per-section open state; falls back to `defaultOpen` until the user toggles.\nconst openState = ref<Record<string, boolean>>({})\n\nfunction isSectionOpen(section: SidebarToolSection): boolean {\n return openState.value[section.id] ?? section.defaultOpen !== false\n}\n\nfunction toggleSection(section: SidebarToolSection) {\n openState.value[section.id] = !isSectionOpen(section)\n}\n\n// Own computed: a new spec object with the same control model keeps the generated schemas,\n// so the section forms keep their errors, touched and dirty state.\nconst controlModel = computed(() => config.value.controls)\n\nconst generatedPanels = computed<Record<string, SidebarToolSection[]>>(() => {\n const model = controlModel.value\n return model ? controlsToSidebarPanels(model.controls, model.controlOptions) : {}\n})\n\nconst generatedForms = computed<Record<string, FormSchema>>(() => {\n const model = controlModel.value\n return model ? controlsToSectionFormSchemas(model.controls, model.controlOptions) : {}\n})\n\nconst generatedDefaults = computed<Record<string, unknown>>(() => {\n const model = controlModel.value\n if (!model) return {}\n return {\n ...getControlDefaults(model.controls),\n ...(model.controlOptions.initialValues ?? {}),\n }\n})\n\nconst resolvedPanels = computed<Record<string, SidebarToolSection[]>>(() =>\n mergeSidebarPanels(generatedPanels.value, config.value.panels),\n)\n\nconst resolvedForms = computed<Record<string, FormSchema>>(() => ({\n ...generatedForms.value,\n ...config.value.forms,\n}))\n\nconst resolvedValues = computed<Record<string, unknown>>(() => ({\n ...generatedDefaults.value,\n ...props.values,\n}))\n\nconst resolvedActiveView = computed(() => {\n if (props.activeView) return props.activeView\n return firstVisibleViewId(resolvedPanels.value)\n})\n\nconst activeSections = computed<SidebarToolSection[]>(() => {\n if (!resolvedActiveView.value || !resolvedPanels.value[resolvedActiveView.value]) return []\n return resolvedPanels.value[resolvedActiveView.value]\n})\n\nconst isVisible = computed<boolean>(() =>\n activeSections.value.length > 0 || config.value.whenEmpty || Boolean(slots.default),\n)\n\nconst sidebarClasses = computed<string[]>(() => [\n 'mint-sidebar',\n `mint-sidebar--${config.value.position}`,\n config.value.floating ? 'mint-sidebar--floating' : 'mint-sidebar--static',\n config.value.dense ? '' : 'mint-sidebar--comfortable',\n config.value.collapsible ? 'mint-sidebar--collapsible' : '',\n collapsedModel.value ? 'mint-sidebar--collapsed' : '',\n !isVisible.value ? 'mint-sidebar--hidden' : '',\n])\n\nconst sidebarStyle = computed<Record<string, string>>(() => ({\n width: collapsedModel.value ? config.value.collapsedWidth : config.value.width,\n}))\n\nfunction handleFormUpdate(values: Record<string, unknown>) {\n emit('update:values', { ...resolvedValues.value, ...values })\n}\n\nfunction handleFormSubmit(sectionId: string, values: Record<string, unknown>) {\n emit('form-submit', sectionId, values)\n}\n\nfunction handleFormCancel(sectionId: string) {\n emit('form-cancel', sectionId)\n}\n\nfunction toggleCollapsed() {\n collapsedModel.value = !collapsedModel.value\n}\n\nfunction expandCollapsed() {\n collapsedModel.value = false\n}\n\nfunction handleSectionAction(sectionId: string, actionId: string) {\n emit('section-action', sectionId, actionId)\n}\n\nfunction isSvgIcon(icon?: string | string[]): boolean {\n if (!icon) return false\n return Array.isArray(icon) || icon.startsWith('M') || icon.startsWith('m')\n}\n\nfunction sectionInitial(section: SidebarToolSection): string {\n return section.label.trim().charAt(0).toUpperCase() || '?'\n}\n\nfunction railIconStyle(section: SidebarToolSection): Record<string, string> {\n return {\n backgroundColor: section.iconBg ?? 'var(--color-primary-soft)',\n color: section.iconColor ?? 'var(--color-primary)',\n }\n}\n\nfunction badgeToneClass(section: SidebarToolSection): string {\n return `mint-sidebar__rail-badge--${section.badgeTone ?? 'cta'}`\n}\n\nfunction tagToneClass(section: SidebarToolSection): string {\n return `mint-sidebar__tag--${section.badgeTone ?? 'cta'}`\n}\n\nfunction actionClasses(action: SidebarToolSectionAction): string[] {\n return [\n 'mint-sidebar__group-action',\n action.tone ? `mint-sidebar__group-action--${action.tone}` : '',\n ]\n}\n\nfunction mergeSidebarPanels(\n generated: Record<string, SidebarToolSection[]>,\n explicit: Record<string, SidebarToolSection[]>,\n): Record<string, SidebarToolSection[]> {\n const merged: Record<string, SidebarToolSection[]> = {}\n const viewIds = new Set([...Object.keys(generated), ...Object.keys(explicit)])\n\n for (const viewId of viewIds) {\n const sectionsById = new Map<string, SidebarToolSection>()\n for (const section of generated[viewId] ?? []) {\n sectionsById.set(section.id, section)\n }\n for (const section of explicit[viewId] ?? []) {\n sectionsById.set(section.id, section)\n }\n merged[viewId] = [...sectionsById.values()]\n }\n\n return merged\n}\n\nfunction firstVisibleViewId(panels: Record<string, SidebarToolSection[]>): string {\n for (const [viewId, sections] of Object.entries(panels)) {\n if (sections.length > 0) return viewId\n }\n return ''\n}\n\n</script>\n\n<template>\n <aside\n :class=\"sidebarClasses\"\n :style=\"sidebarStyle\"\n >\n <!-- Header slot / built-in chrome -->\n <div\n v-if=\"$slots.header || config.title || config.subtitle || config.badge !== undefined || config.collapsible\"\n class=\"mint-sidebar__header\"\n >\n <slot\n name=\"header\"\n :collapsed=\"collapsedModel\"\n :toggle-collapsed=\"toggleCollapsed\"\n >\n <div v-if=\"!collapsedModel\" class=\"mint-sidebar__heading\">\n <div class=\"mint-sidebar__heading-copy\">\n <h2 v-if=\"config.title\" class=\"mint-sidebar__title\">{{ config.title }}</h2>\n <p v-if=\"config.subtitle\" class=\"mint-sidebar__subtitle\">{{ config.subtitle }}</p>\n </div>\n <span v-if=\"config.badge !== undefined\" class=\"mint-sidebar__badge\">{{ config.badge }}</span>\n </div>\n <button\n v-if=\"config.collapsible\"\n type=\"button\"\n class=\"mint-sidebar__collapse-button\"\n :aria-label=\"collapsedModel ? config.expandButtonLabel : config.collapseButtonLabel\"\n :aria-expanded=\"!collapsedModel\"\n @click=\"toggleCollapsed\"\n >\n <svg\n class=\"mint-sidebar__collapse-icon\"\n :class=\"{ 'mint-sidebar__collapse-icon--collapsed': collapsedModel }\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M11 19l-7-7 7-7m8 14l-7-7 7-7\" />\n </svg>\n </button>\n </slot>\n </div>\n\n <!-- Tool sections -->\n <div\n v-if=\"!collapsedModel\"\n :id=\"config.contentId\"\n class=\"mint-sidebar__sections\"\n >\n <div\n v-for=\"section in activeSections\"\n :key=\"section.id\"\n :class=\"['mint-sidebar__group', isSectionOpen(section) ? 'mint-sidebar__group--open' : 'mint-sidebar__group--closed']\"\n >\n <div class=\"mint-sidebar__group-head\">\n <button\n type=\"button\"\n class=\"mint-sidebar__group-toggle\"\n :aria-expanded=\"isSectionOpen(section)\"\n @click=\"toggleSection(section)\"\n >\n <span\n v-if=\"section.icon\"\n class=\"mint-sidebar__group-icon\"\n :style=\"railIconStyle(section)\"\n >\n <svg\n v-if=\"isSvgIcon(section.icon)\"\n class=\"mint-sidebar__group-svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <template v-if=\"Array.isArray(section.icon)\">\n <path v-for=\"(d, i) in section.icon\" :key=\"i\" :d=\"d\" />\n </template>\n <path v-else :d=\"section.icon\" />\n </svg>\n <span v-else class=\"mint-sidebar__group-text-icon\">{{ section.icon }}</span>\n </span>\n <span class=\"mint-sidebar__group-copy\">\n <span class=\"mint-sidebar__group-label\">{{ section.label }}</span>\n <span v-if=\"section.subtitle\" class=\"mint-sidebar__group-subtitle\">{{ section.subtitle }}</span>\n </span>\n </button>\n\n <div class=\"mint-sidebar__group-tail\">\n <span\n v-if=\"section.badge !== undefined\"\n :class=\"['mint-sidebar__tag', tagToneClass(section)]\"\n >\n {{ section.badge }}\n </span>\n\n <button\n v-for=\"action in section.actions ?? []\"\n :key=\"action.id\"\n type=\"button\"\n :class=\"actionClasses(action)\"\n :style=\"action.iconColor ? { color: action.iconColor } : undefined\"\n :disabled=\"action.disabled\"\n :aria-label=\"action.label\"\n :title=\"action.label\"\n @click=\"handleSectionAction(section.id, action.id)\"\n >\n <svg\n v-if=\"action.icon && isSvgIcon(action.icon)\"\n class=\"mint-sidebar__group-action-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <template v-if=\"Array.isArray(action.icon)\">\n <path v-for=\"(d, i) in action.icon\" :key=\"i\" :d=\"d\" />\n </template>\n <path v-else :d=\"action.icon\" />\n </svg>\n <span v-else-if=\"action.icon\">{{ action.icon }}</span>\n </button>\n\n <button\n v-if=\"section.showToggle\"\n type=\"button\"\n role=\"switch\"\n :aria-checked=\"toggleState[section.id] ?? false\"\n :aria-label=\"`Enable ${section.label}`\"\n :class=\"['mint-sidebar__switch', (toggleState[section.id] ?? false) ? 'mint-sidebar__switch--on' : '']\"\n @click=\"emit('update:toggle', section.id, !(toggleState[section.id] ?? false))\"\n >\n <span class=\"mint-sidebar__switch-knob\" />\n </button>\n\n <button\n type=\"button\"\n class=\"mint-sidebar__chevron-button\"\n :aria-label=\"isSectionOpen(section) ? 'Collapse section' : 'Expand section'\"\n :aria-expanded=\"isSectionOpen(section)\"\n @click=\"toggleSection(section)\"\n >\n <svg\n :class=\"['mint-sidebar__chevron', isSectionOpen(section) ? 'mint-sidebar__chevron--open' : '']\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </button>\n </div>\n </div>\n\n <Transition name=\"collapse\">\n <div v-show=\"isSectionOpen(section)\" class=\"mint-sidebar__group-body\">\n <slot :name=\"`section-${section.id}`\">\n <FormSchemaInternal\n v-if=\"resolvedForms[section.id]\"\n :model-value=\"resolvedValues\"\n :schema=\"resolvedForms[section.id]\"\n :enhancements=\"config.controls?.controlOptions.enhancements\"\n :loading=\"formLoading\"\n :disabled=\"formDisabled\"\n :readonly=\"formReadonly\"\n :size=\"config.formSize\"\n @update:model-value=\"handleFormUpdate\"\n @submit=\"handleFormSubmit(section.id, $event)\"\n @cancel=\"handleFormCancel(section.id)\"\n />\n </slot>\n </div>\n </Transition>\n </div>\n\n <slot\n :sections=\"activeSections\"\n :active-view=\"resolvedActiveView\"\n :values=\"resolvedValues\"\n />\n </div>\n\n <div v-else-if=\"$slots.collapsed\" class=\"mint-sidebar__collapsed\">\n <slot\n name=\"collapsed\"\n :sections=\"activeSections\"\n :expand=\"expandCollapsed\"\n />\n </div>\n\n <div v-else class=\"mint-sidebar__collapsed mint-sidebar__collapsed--default\">\n <button\n v-for=\"section in activeSections\"\n :key=\"section.id\"\n type=\"button\"\n class=\"mint-sidebar__rail-item\"\n :aria-label=\"`Expand ${section.label}`\"\n :title=\"section.label\"\n @click=\"expandCollapsed\"\n >\n <span class=\"mint-sidebar__rail-icon\" :style=\"railIconStyle(section)\">\n <svg\n v-if=\"section.icon && isSvgIcon(section.icon)\"\n class=\"mint-sidebar__rail-svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <template v-if=\"Array.isArray(section.icon)\">\n <path v-for=\"(d, i) in section.icon\" :key=\"i\" :d=\"d\" />\n </template>\n <path v-else :d=\"section.icon\" />\n </svg>\n <span v-else class=\"mint-sidebar__rail-text-icon\">\n {{ section.icon || sectionInitial(section) }}\n </span>\n </span>\n <span\n v-if=\"section.badge !== undefined\"\n :class=\"['mint-sidebar__rail-badge', badgeToneClass(section)]\"\n >\n {{ section.badge }}\n </span>\n </button>\n </div>\n\n <!-- Footer slot -->\n <div v-if=\"!collapsedModel && $slots.footer\" class=\"mint-sidebar__footer\">\n <slot name=\"footer\" />\n </div>\n <div v-else-if=\"collapsedModel && $slots['collapsed-footer']\" class=\"mint-sidebar__footer mint-sidebar__footer--collapsed\">\n <slot name=\"collapsed-footer\" />\n </div>\n </aside>\n</template>\n","<script setup lang=\"ts\">\n/**\n * AppSidebar - Context-sensitive toolkit panel\n *\n * Shows tool sections relevant to the active view. Sections come from the\n * spec: a `controls` model built with `defineControlModel()` generates them,\n * and hand-written `panels` are merged over the generated ones. Each section\n * renders as a flat group (header row + hairline, no nested card). Controls\n * can be provided through named slots or auto-rendered from the section forms.\n *\n * When activeView is omitted, the first non-empty panel view is selected.\n * When no view has matching panels, the sidebar hides entirely.\n *\n * @example Recommended\n * ```vue\n * <AppSidebar v-model:values=\"values\" :spec=\"{ title: 'Parameters', controls: sidebarModel }\" />\n * ```\n */\nimport { computed, ref, useSlots, type Slots } from 'vue'\nimport type { PluginWorkspaceSidebarSpec, SidebarToolSection, SidebarToolSectionAction } from '../types'\nimport type { FormSchema } from '../types/form-builder'\nimport {\n controlsToSectionFormSchemas,\n controlsToSidebarPanels,\n getControlDefaults,\n} from '../composables/useControlSchema'\nimport { applySpecDefaults } from '../composables/componentSpecs'\nimport FormSchemaInternal from './internal/FormSchemaInternal.vue'\n\ninterface Props {\n /** Structure: header, sections, forms, width, side, collapse. Optional: every option has a default. */\n spec?: PluginWorkspaceSidebarSpec\n /** Which view's panels to display. Defaults to the first non-empty panel view. */\n activeView?: string\n /** Values of the section forms. Bind with `v-model:values`. */\n values?: Record<string, unknown>\n /** Collapsed state. Bind with `v-model:collapsed`; unbound, the sidebar keeps its own. */\n collapsed?: boolean\n /** On / off state of the section toggles, keyed by section id. */\n toggleState?: Record<string, boolean>\n /** Loading / saving state of the section forms. */\n formLoading?: boolean\n /** Disabled state of the section forms. */\n formDisabled?: boolean\n /** Readonly state of the section forms. */\n formReadonly?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n spec: () => ({}),\n activeView: '',\n values: () => ({}),\n collapsed: undefined,\n toggleState: () => ({}),\n formLoading: false,\n formDisabled: false,\n formReadonly: false,\n})\n\nconst config = computed(() => applySpecDefaults({\n panels: {},\n forms: {},\n floating: true,\n dense: true,\n width: '280px',\n position: 'left',\n whenEmpty: false,\n formSize: 'sm',\n collapsible: false,\n collapsedWidth: '3rem',\n collapseButtonLabel: 'Collapse sidebar',\n expandButtonLabel: 'Expand sidebar',\n}, props.spec))\n\nconst emit = defineEmits<{\n 'update:toggle': [sectionId: string, value: boolean]\n 'update:values': [values: Record<string, unknown>]\n 'update:collapsed': [value: boolean]\n 'section-action': [sectionId: string, actionId: string]\n 'form-submit': [sectionId: string, values: Record<string, unknown>]\n 'form-cancel': [sectionId: string]\n}>()\n\nconst slots: Slots = useSlots()\nconst internalCollapsed = ref(false)\nconst collapsedModel = computed({\n get: () => props.collapsed ?? internalCollapsed.value,\n set: (value: boolean) => {\n internalCollapsed.value = value\n emit('update:collapsed', value)\n },\n})\n\n// Per-section open state; falls back to `defaultOpen` until the user toggles.\nconst openState = ref<Record<string, boolean>>({})\n\nfunction isSectionOpen(section: SidebarToolSection): boolean {\n return openState.value[section.id] ?? section.defaultOpen !== false\n}\n\nfunction toggleSection(section: SidebarToolSection) {\n openState.value[section.id] = !isSectionOpen(section)\n}\n\n// Own computed: a new spec object with the same control model keeps the generated schemas,\n// so the section forms keep their errors, touched and dirty state.\nconst controlModel = computed(() => config.value.controls)\n\nconst generatedPanels = computed<Record<string, SidebarToolSection[]>>(() => {\n const model = controlModel.value\n return model ? controlsToSidebarPanels(model.controls, model.controlOptions) : {}\n})\n\nconst generatedForms = computed<Record<string, FormSchema>>(() => {\n const model = controlModel.value\n return model ? controlsToSectionFormSchemas(model.controls, model.controlOptions) : {}\n})\n\nconst generatedDefaults = computed<Record<string, unknown>>(() => {\n const model = controlModel.value\n if (!model) return {}\n return {\n ...getControlDefaults(model.controls),\n ...(model.controlOptions.initialValues ?? {}),\n }\n})\n\nconst resolvedPanels = computed<Record<string, SidebarToolSection[]>>(() =>\n mergeSidebarPanels(generatedPanels.value, config.value.panels),\n)\n\nconst resolvedForms = computed<Record<string, FormSchema>>(() => ({\n ...generatedForms.value,\n ...config.value.forms,\n}))\n\nconst resolvedValues = computed<Record<string, unknown>>(() => ({\n ...generatedDefaults.value,\n ...props.values,\n}))\n\nconst resolvedActiveView = computed(() => {\n if (props.activeView) return props.activeView\n return firstVisibleViewId(resolvedPanels.value)\n})\n\nconst activeSections = computed<SidebarToolSection[]>(() => {\n if (!resolvedActiveView.value || !resolvedPanels.value[resolvedActiveView.value]) return []\n return resolvedPanels.value[resolvedActiveView.value]\n})\n\nconst isVisible = computed<boolean>(() =>\n activeSections.value.length > 0 || config.value.whenEmpty || Boolean(slots.default),\n)\n\nconst sidebarClasses = computed<string[]>(() => [\n 'mint-sidebar',\n `mint-sidebar--${config.value.position}`,\n config.value.floating ? 'mint-sidebar--floating' : 'mint-sidebar--static',\n config.value.dense ? '' : 'mint-sidebar--comfortable',\n config.value.collapsible ? 'mint-sidebar--collapsible' : '',\n collapsedModel.value ? 'mint-sidebar--collapsed' : '',\n !isVisible.value ? 'mint-sidebar--hidden' : '',\n])\n\nconst sidebarStyle = computed<Record<string, string>>(() => ({\n width: collapsedModel.value ? config.value.collapsedWidth : config.value.width,\n}))\n\nfunction handleFormUpdate(values: Record<string, unknown>) {\n emit('update:values', { ...resolvedValues.value, ...values })\n}\n\nfunction handleFormSubmit(sectionId: string, values: Record<string, unknown>) {\n emit('form-submit', sectionId, values)\n}\n\nfunction handleFormCancel(sectionId: string) {\n emit('form-cancel', sectionId)\n}\n\nfunction toggleCollapsed() {\n collapsedModel.value = !collapsedModel.value\n}\n\nfunction expandCollapsed() {\n collapsedModel.value = false\n}\n\nfunction handleSectionAction(sectionId: string, actionId: string) {\n emit('section-action', sectionId, actionId)\n}\n\nfunction isSvgIcon(icon?: string | string[]): boolean {\n if (!icon) return false\n return Array.isArray(icon) || icon.startsWith('M') || icon.startsWith('m')\n}\n\nfunction sectionInitial(section: SidebarToolSection): string {\n return section.label.trim().charAt(0).toUpperCase() || '?'\n}\n\nfunction railIconStyle(section: SidebarToolSection): Record<string, string> {\n return {\n backgroundColor: section.iconBg ?? 'var(--color-primary-soft)',\n color: section.iconColor ?? 'var(--color-primary)',\n }\n}\n\nfunction badgeToneClass(section: SidebarToolSection): string {\n return `mint-sidebar__rail-badge--${section.badgeTone ?? 'cta'}`\n}\n\nfunction tagToneClass(section: SidebarToolSection): string {\n return `mint-sidebar__tag--${section.badgeTone ?? 'cta'}`\n}\n\nfunction actionClasses(action: SidebarToolSectionAction): string[] {\n return [\n 'mint-sidebar__group-action',\n action.tone ? `mint-sidebar__group-action--${action.tone}` : '',\n ]\n}\n\nfunction mergeSidebarPanels(\n generated: Record<string, SidebarToolSection[]>,\n explicit: Record<string, SidebarToolSection[]>,\n): Record<string, SidebarToolSection[]> {\n const merged: Record<string, SidebarToolSection[]> = {}\n const viewIds = new Set([...Object.keys(generated), ...Object.keys(explicit)])\n\n for (const viewId of viewIds) {\n const sectionsById = new Map<string, SidebarToolSection>()\n for (const section of generated[viewId] ?? []) {\n sectionsById.set(section.id, section)\n }\n for (const section of explicit[viewId] ?? []) {\n sectionsById.set(section.id, section)\n }\n merged[viewId] = [...sectionsById.values()]\n }\n\n return merged\n}\n\nfunction firstVisibleViewId(panels: Record<string, SidebarToolSection[]>): string {\n for (const [viewId, sections] of Object.entries(panels)) {\n if (sections.length > 0) return viewId\n }\n return ''\n}\n\n</script>\n\n<template>\n <aside\n :class=\"sidebarClasses\"\n :style=\"sidebarStyle\"\n >\n <!-- Header slot / built-in chrome -->\n <div\n v-if=\"$slots.header || config.title || config.subtitle || config.badge !== undefined || config.collapsible\"\n class=\"mint-sidebar__header\"\n >\n <slot\n name=\"header\"\n :collapsed=\"collapsedModel\"\n :toggle-collapsed=\"toggleCollapsed\"\n >\n <div v-if=\"!collapsedModel\" class=\"mint-sidebar__heading\">\n <div class=\"mint-sidebar__heading-copy\">\n <h2 v-if=\"config.title\" class=\"mint-sidebar__title\">{{ config.title }}</h2>\n <p v-if=\"config.subtitle\" class=\"mint-sidebar__subtitle\">{{ config.subtitle }}</p>\n </div>\n <span v-if=\"config.badge !== undefined\" class=\"mint-sidebar__badge\">{{ config.badge }}</span>\n </div>\n <button\n v-if=\"config.collapsible\"\n type=\"button\"\n class=\"mint-sidebar__collapse-button\"\n :aria-label=\"collapsedModel ? config.expandButtonLabel : config.collapseButtonLabel\"\n :aria-expanded=\"!collapsedModel\"\n @click=\"toggleCollapsed\"\n >\n <svg\n class=\"mint-sidebar__collapse-icon\"\n :class=\"{ 'mint-sidebar__collapse-icon--collapsed': collapsedModel }\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M11 19l-7-7 7-7m8 14l-7-7 7-7\" />\n </svg>\n </button>\n </slot>\n </div>\n\n <!-- Tool sections -->\n <div\n v-if=\"!collapsedModel\"\n :id=\"config.contentId\"\n class=\"mint-sidebar__sections\"\n >\n <div\n v-for=\"section in activeSections\"\n :key=\"section.id\"\n :class=\"['mint-sidebar__group', isSectionOpen(section) ? 'mint-sidebar__group--open' : 'mint-sidebar__group--closed']\"\n >\n <div class=\"mint-sidebar__group-head\">\n <button\n type=\"button\"\n class=\"mint-sidebar__group-toggle\"\n :aria-expanded=\"isSectionOpen(section)\"\n @click=\"toggleSection(section)\"\n >\n <span\n v-if=\"section.icon\"\n class=\"mint-sidebar__group-icon\"\n :style=\"railIconStyle(section)\"\n >\n <svg\n v-if=\"isSvgIcon(section.icon)\"\n class=\"mint-sidebar__group-svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <template v-if=\"Array.isArray(section.icon)\">\n <path v-for=\"(d, i) in section.icon\" :key=\"i\" :d=\"d\" />\n </template>\n <path v-else :d=\"section.icon\" />\n </svg>\n <span v-else class=\"mint-sidebar__group-text-icon\">{{ section.icon }}</span>\n </span>\n <span class=\"mint-sidebar__group-copy\">\n <span class=\"mint-sidebar__group-label\">{{ section.label }}</span>\n <span v-if=\"section.subtitle\" class=\"mint-sidebar__group-subtitle\">{{ section.subtitle }}</span>\n </span>\n </button>\n\n <div class=\"mint-sidebar__group-tail\">\n <span\n v-if=\"section.badge !== undefined\"\n :class=\"['mint-sidebar__tag', tagToneClass(section)]\"\n >\n {{ section.badge }}\n </span>\n\n <button\n v-for=\"action in section.actions ?? []\"\n :key=\"action.id\"\n type=\"button\"\n :class=\"actionClasses(action)\"\n :style=\"action.iconColor ? { color: action.iconColor } : undefined\"\n :disabled=\"action.disabled\"\n :aria-label=\"action.label\"\n :title=\"action.label\"\n @click=\"handleSectionAction(section.id, action.id)\"\n >\n <svg\n v-if=\"action.icon && isSvgIcon(action.icon)\"\n class=\"mint-sidebar__group-action-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <template v-if=\"Array.isArray(action.icon)\">\n <path v-for=\"(d, i) in action.icon\" :key=\"i\" :d=\"d\" />\n </template>\n <path v-else :d=\"action.icon\" />\n </svg>\n <span v-else-if=\"action.icon\">{{ action.icon }}</span>\n </button>\n\n <button\n v-if=\"section.showToggle\"\n type=\"button\"\n role=\"switch\"\n :aria-checked=\"toggleState[section.id] ?? false\"\n :aria-label=\"`Enable ${section.label}`\"\n :class=\"['mint-sidebar__switch', (toggleState[section.id] ?? false) ? 'mint-sidebar__switch--on' : '']\"\n @click=\"emit('update:toggle', section.id, !(toggleState[section.id] ?? false))\"\n >\n <span class=\"mint-sidebar__switch-knob\" />\n </button>\n\n <button\n type=\"button\"\n class=\"mint-sidebar__chevron-button\"\n :aria-label=\"isSectionOpen(section) ? 'Collapse section' : 'Expand section'\"\n :aria-expanded=\"isSectionOpen(section)\"\n @click=\"toggleSection(section)\"\n >\n <svg\n :class=\"['mint-sidebar__chevron', isSectionOpen(section) ? 'mint-sidebar__chevron--open' : '']\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </button>\n </div>\n </div>\n\n <Transition name=\"collapse\">\n <div v-show=\"isSectionOpen(section)\" class=\"mint-sidebar__group-body\">\n <slot :name=\"`section-${section.id}`\">\n <FormSchemaInternal\n v-if=\"resolvedForms[section.id]\"\n :model-value=\"resolvedValues\"\n :schema=\"resolvedForms[section.id]\"\n :enhancements=\"config.controls?.controlOptions.enhancements\"\n :loading=\"formLoading\"\n :disabled=\"formDisabled\"\n :readonly=\"formReadonly\"\n :size=\"config.formSize\"\n @update:model-value=\"handleFormUpdate\"\n @submit=\"handleFormSubmit(section.id, $event)\"\n @cancel=\"handleFormCancel(section.id)\"\n />\n </slot>\n </div>\n </Transition>\n </div>\n\n <slot\n :sections=\"activeSections\"\n :active-view=\"resolvedActiveView\"\n :values=\"resolvedValues\"\n />\n </div>\n\n <div v-else-if=\"$slots.collapsed\" class=\"mint-sidebar__collapsed\">\n <slot\n name=\"collapsed\"\n :sections=\"activeSections\"\n :expand=\"expandCollapsed\"\n />\n </div>\n\n <div v-else class=\"mint-sidebar__collapsed mint-sidebar__collapsed--default\">\n <button\n v-for=\"section in activeSections\"\n :key=\"section.id\"\n type=\"button\"\n class=\"mint-sidebar__rail-item\"\n :aria-label=\"`Expand ${section.label}`\"\n :title=\"section.label\"\n @click=\"expandCollapsed\"\n >\n <span class=\"mint-sidebar__rail-icon\" :style=\"railIconStyle(section)\">\n <svg\n v-if=\"section.icon && isSvgIcon(section.icon)\"\n class=\"mint-sidebar__rail-svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <template v-if=\"Array.isArray(section.icon)\">\n <path v-for=\"(d, i) in section.icon\" :key=\"i\" :d=\"d\" />\n </template>\n <path v-else :d=\"section.icon\" />\n </svg>\n <span v-else class=\"mint-sidebar__rail-text-icon\">\n {{ section.icon || sectionInitial(section) }}\n </span>\n </span>\n <span\n v-if=\"section.badge !== undefined\"\n :class=\"['mint-sidebar__rail-badge', badgeToneClass(section)]\"\n >\n {{ section.badge }}\n </span>\n </button>\n </div>\n\n <!-- Footer slot -->\n <div v-if=\"!collapsedModel && $slots.footer\" class=\"mint-sidebar__footer\">\n <slot name=\"footer\" />\n </div>\n <div v-else-if=\"collapsedModel && $slots['collapsed-footer']\" class=\"mint-sidebar__footer mint-sidebar__footer--collapsed\">\n <slot name=\"collapsed-footer\" />\n </div>\n </aside>\n</template>\n"],"mappings":"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"}
|