From b1dde74e4d147f3fe28e300a1bcbfad1ef8a98ae Mon Sep 17 00:00:00 2001 From: bbedward Date: Wed, 7 Oct 2026 19:22:24 -0400 Subject: [PATCH] settings: improve transition behavior --- dank-qml-common | 2 +- flake.lock | 6 +- quickshell/Common/SettingsData.qml | 3 +- .../Common/settings/BarWidgetDefaults.js | 1 - quickshell/Common/settings/SettingsStore.js | 21 +++ .../Modals/Settings/SettingsContent.qml | 141 ++++++++++-------- .../Modals/Settings/SettingsSidebar.qml | 3 + quickshell/Modules/DIsland/IslandBarHost.qml | 2 +- .../Modules/Settings/TypographyMotionTab.qml | 2 +- .../Settings/Widgets/IslandMotionCard.qml | 18 +-- .../Settings/Widgets/SettingsMetrics.qml | 2 + quickshell/Services/SettingsSearchService.qml | 19 ++- .../translations/extract_settings_index.py | 4 + .../translations/settings_search_index.json | 73 ++------- 14 files changed, 150 insertions(+), 147 deletions(-) diff --git a/dank-qml-common b/dank-qml-common index f95f3d8c5..d5786555c 160000 --- a/dank-qml-common +++ b/dank-qml-common @@ -1 +1 @@ -Subproject commit f95f3d8c5344613d7bba2ef9a65d489febe9d52a +Subproject commit d5786555ccd248491017b0cf8d1bfbd9e0892e5b diff --git a/flake.lock b/flake.lock index d47a4a5a3..471409e62 100644 --- a/flake.lock +++ b/flake.lock @@ -3,11 +3,11 @@ "dank-qml-common": { "flake": false, "locked": { - "lastModified": 1791404062, - "narHash": "sha256-Q9wxePvAGGVlYBP1o2cI+JJJ61P3jzb27nthusVv4GE=", + "lastModified": 1791415314, + "narHash": "sha256-7tV9UFCKTOk8EN7gdtFJeI8NFXtopCJFC86KJU4qK44=", "owner": "AvengeMedia", "repo": "dank-qml-common", - "rev": "f95f3d8c5344613d7bba2ef9a65d489febe9d52a", + "rev": "d5786555ccd248491017b0cf8d1bfbd9e0892e5b", "type": "github" }, "original": { diff --git a/quickshell/Common/SettingsData.qml b/quickshell/Common/SettingsData.qml index d2b40052e..9b3a04b03 100644 --- a/quickshell/Common/SettingsData.qml +++ b/quickshell/Common/SettingsData.qml @@ -22,7 +22,7 @@ Singleton { id: root readonly property var log: Log.scoped("SettingsData") - readonly property int settingsConfigVersion: 38 + readonly property int settingsConfigVersion: 39 readonly property bool isGreeterMode: Quickshell.env("DMS_RUN_GREETER") === "1" || Quickshell.env("DMS_RUN_GREETER") === "true" @@ -853,6 +853,7 @@ Singleton { return (barConfigs || []).filter(cfg => isIslandBarConfig(cfg)); } readonly property bool dankIslandEnabled: (barConfigs || []).some(cfg => (cfg.enabled ?? false) && hostsIsland(cfg)) + readonly property var enabledIslandBarConfigs: (barConfigs || []).filter(cfg => cfg?.island === true && (cfg.enabled ?? false)) // Session-only: which bar, island or dot last-used shared shortcuts follow on each screen. property var lastUsedBarByScreen: ({}) // One slot per edge; a dot floats, so it never takes one. diff --git a/quickshell/Common/settings/BarWidgetDefaults.js b/quickshell/Common/settings/BarWidgetDefaults.js index 3cd74c5f4..3cb3213ef 100644 --- a/quickshell/Common/settings/BarWidgetDefaults.js +++ b/quickshell/Common/settings/BarWidgetDefaults.js @@ -51,7 +51,6 @@ var ISLAND_DEFAULTS = { islandSatelliteFollowInterfaceStyle: true, islandSatelliteTransparency: 1, islandSatelliteSwoopRadius: 24, - islandReducedMotion: false, islandSpringStiffness: 560, islandSpringDamping: 37, islandSpringMass: 1 diff --git a/quickshell/Common/settings/SettingsStore.js b/quickshell/Common/settings/SettingsStore.js index e44f6f280..83af52d25 100644 --- a/quickshell/Common/settings/SettingsStore.js +++ b/quickshell/Common/settings/SettingsStore.js @@ -718,9 +718,30 @@ function migrateToVersion(obj, targetVersion) { settings.configVersion = 38; } + if (currentVersion < 39 && targetVersion >= 39) { + migrateIslandReducedMotion(settings); + settings.configVersion = 39; + } + return settings; } +// v39: the per-island toggle folded into the global reduceMotion; any bar that had it on turns the global one on +function migrateIslandReducedMotion(settings) { + for (const bar of Array.isArray(settings.barConfigs) ? settings.barConfigs : []) { + if (!bar || typeof bar !== "object") + continue; + const holders = [bar]; + for (const sectionId of ["leftWidgets", "centerWidgets", "rightWidgets"]) + holders.push(...(Array.isArray(bar[sectionId]) ? bar[sectionId] : []).filter(entry => entry && typeof entry === "object" && entry.id === "island")); + for (const holder of holders) { + if (holder.islandReducedMotion === true) + settings.reduceMotion = true; + delete holder.islandReducedMotion; + } + } +} + var LOCK_WIDGET_MOVED_KEYS = ["lockScreenShowSystemIcons", "lockScreenShowTime", "lockScreenClockStyle", "lockScreenShowDate", "lockScreenShowPasswordField", "lockScreenShowMediaPlayer", "lockScreenNotificationMode"]; var LOCK_WIDGET_GREETER_KEYS = ["lockScreenShowPowerActions", "lockScreenShowProfileImage", "lockScreenShowWeather"]; diff --git a/quickshell/Modals/Settings/SettingsContent.qml b/quickshell/Modals/Settings/SettingsContent.qml index a10b655a0..e5bbc1c47 100644 --- a/quickshell/Modals/Settings/SettingsContent.qml +++ b/quickshell/Modals/Settings/SettingsContent.qml @@ -18,12 +18,11 @@ FocusScope { readonly property list pagePath: (parentModal?.pageHistory ?? []).concat([currentPage]) readonly property Item currentPageItem: pageStack.currentItem?.item ?? null readonly property bool currentPageSettled: pageStack.currentItem?.page === currentPage && pageStack.currentItem.settled - property Item pendingPage: null readonly property bool isPluginPage: SettingsTabs.isPluginPage(currentPage) readonly property bool isCompactMode: parentModal?.isCompactMode ?? false readonly property bool menuHidden: isCompactMode && !(parentModal?.menuVisible ?? true) readonly property bool showBack: (parentModal?.canGoBack ?? false) || isPluginPage || menuHidden - readonly property bool animationsEnabled: Theme.currentAnimationSpeed !== SettingsData.AnimationSpeed.None + readonly property bool animationsEnabled: !SettingsData.reduceMotion && Theme.currentAnimationSpeed !== SettingsData.AnimationSpeed.None // Mouse navigation lands parked; only keyboard navigation highlights a control on the page property bool keyboardNavigation: true @@ -205,13 +204,6 @@ FocusScope { return properties; } - function _discardPendingPage() { - if (!pendingPage) - return; - pendingPage.destroy(); - pendingPage = null; - } - function _createPage(page, index) { return pageComponent.createObject(pageStack, { page, @@ -219,76 +211,104 @@ FocusScope { }); } + // A navigation that lands mid-transition cuts in rather than queueing behind it + function _operation(transition) { + const animate = animationsEnabled && pageStack.depth > 0 && !pageStack.busy && (parentModal?.visible ?? false); + return animate ? transition : StackView.Immediate; + } + function _syncPages() { if (!sessionVisible) { - _discardPendingPage(); pageStack.clear(StackView.Immediate); return; } - if (!currentPage || pageStack.busy) + if (!currentPage) return; - if (pendingPage && (pendingPage.page !== currentPage || pendingPage.pathIndex !== pagePath.length - 1)) - _discardPendingPage(); let shared = 0; while (shared < Math.min(pageStack.depth, pagePath.length) && pageStack.get(shared).page === pagePath[shared]) shared++; if (shared === pagePath.length) { - _discardPendingPage(); if (shared < pageStack.depth) - pageStack.pop(pageStack.get(shared - 1), animationsEnabled ? StackView.PopTransition : StackView.Immediate); + pageStack.pop(pageStack.get(shared - 1), _operation(StackView.PopTransition)); return; } - if (!pendingPage) { - pendingPage = _createPage(currentPage, pagePath.length - 1); - pendingPage.load(parentModal?.visible ?? false); - } - if (!pendingPage.settled) - return; - const animate = animationsEnabled && pageStack.depth > 0 && (parentModal?.visible ?? false); + const deferred = parentModal?.visible ?? false; const pages = []; - for (let index = shared; index < pagePath.length - 1; index++) { + for (let index = shared; index < pagePath.length; index++) { const page = _createPage(pagePath[index], index); - page.load(false); + page.load(deferred && index === pagePath.length - 1); pages.push(page); } - pages.push(pendingPage); - pendingPage = null; if (shared < pageStack.depth) { - pageStack.replace(pageStack.get(shared), pages, animate ? StackView.ReplaceTransition : StackView.Immediate); + pageStack.replace(pageStack.get(shared), pages, _operation(StackView.ReplaceTransition)); return; } - pageStack.push(pages, animate ? StackView.PushTransition : StackView.Immediate); + pageStack.push(pages, _operation(StackView.PushTransition)); } onPagePathChanged: Qt.callLater(_syncPages) onSessionVisibleChanged: Qt.callLater(_syncPages) - component PageTransition: Transition { - id: transition + // Fade through the pane: the leaving page is gone before the next one starts to show, so nothing blends mid-way + component PageExit: Transition { + id: exit - property bool entering: true - property real fromX: 0 property real toX: 0 NumberAnimation { property: "x" - from: transition.fromX - to: transition.toX - duration: SettingsMetrics.transitionDuration + to: exit.toX + duration: SettingsMetrics.exitDuration easing.type: Easing.BezierSpline easing.bezierCurve: Theme.expressiveCurves.standard } NumberAnimation { property: "opacity" - from: transition.entering ? 0 : 1 - to: transition.entering ? 1 : 0 - duration: SettingsMetrics.fadeDuration + to: 0 + duration: SettingsMetrics.exitDuration easing.type: Easing.BezierSpline easing.bezierCurve: Theme.expressiveCurves.expressiveEffects } } + component PageEnter: Transition { + id: enter + + property real fromX: 0 + + SequentialAnimation { + PropertyAction { + property: "opacity" + value: 0 + } + + PauseAnimation { + duration: SettingsMetrics.exitDuration + } + + ParallelAnimation { + NumberAnimation { + property: "x" + from: enter.fromX + to: 0 + duration: SettingsMetrics.transitionDuration + easing.type: Easing.BezierSpline + easing.bezierCurve: Theme.expressiveCurves.standard + } + + NumberAnimation { + property: "opacity" + from: 0 + to: 1 + duration: SettingsMetrics.fadeDuration + easing.type: Easing.BezierSpline + easing.bezierCurve: Theme.expressiveCurves.expressiveEffects + } + } + } + } + function _scrollerOf(item) { if (typeof item.flick === "function") return item; @@ -338,13 +358,13 @@ FocusScope { width: pageStack.width height: pageStack.height - opacity: 0 enabled: pageActive && presented StackView.onRemoved: destroy() - onSettledChanged: { - if (settled && root.pendingPage === host) - Qt.callLater(root._syncPages); + // An immediate operation skips the nested enter animation, so the final pose is written here + StackView.onActivated: { + opacity = 1; + x = 0; } function load(deferred) { @@ -407,8 +427,18 @@ FocusScope { anchors.bottom: parent.bottom anchors.leftMargin: SettingsMetrics.panePadding anchors.rightMargin: SettingsMetrics.panePadding + opacity: host.presented ? 1 : 0 enabled: host.presented + Behavior on opacity { + enabled: root.animationsEnabled + NumberAnimation { + duration: SettingsMetrics.fadeDuration + easing.type: Easing.BezierSpline + easing.bezierCurve: Theme.expressiveCurves.expressiveEffects + } + } + onLoaded: { if (item.pageActive !== undefined) item.pageActive = Qt.binding(() => host.pageActive); @@ -551,36 +581,27 @@ FocusScope { anchors.fill: parent clip: true - readonly property real pageOffset: SettingsData.reduceMotion ? 0 : (I18n.isRtl ? -Theme.spacingXL : Theme.spacingXL) + readonly property real pageOffset: I18n.isRtl ? -Theme.spacingXL : Theme.spacingXL - onBusyChanged: { - if (!busy) - Qt.callLater(root._syncPages); - } - - pushEnter: PageTransition { + pushEnter: PageEnter { fromX: pageStack.pageOffset } - pushExit: PageTransition { - entering: false + pushExit: PageExit { toX: -pageStack.pageOffset } - popEnter: PageTransition { + popEnter: PageEnter { fromX: -pageStack.pageOffset } - popExit: PageTransition { - entering: false + popExit: PageExit { toX: pageStack.pageOffset } - replaceEnter: PageTransition {} - replaceExit: PageTransition { - entering: false - } + replaceEnter: PageEnter {} + replaceExit: PageExit {} DSpinner { id: pageSpinner - readonly property bool loading: root.pendingPage !== null + readonly property bool loading: pageStack.currentItem?.presented === false anchors.centerIn: parent z: pageStack.depth @@ -596,7 +617,7 @@ FocusScope { Timer { id: spinnerDelay - interval: SettingsMetrics.pageSettleDeadline + SettingsMetrics.fadeDuration + interval: SettingsMetrics.pageSpinnerDelay onTriggered: pageSpinner.visible = pageSpinner.loading } } diff --git a/quickshell/Modals/Settings/SettingsSidebar.qml b/quickshell/Modals/Settings/SettingsSidebar.qml index c17883148..32677f1a8 100644 --- a/quickshell/Modals/Settings/SettingsSidebar.qml +++ b/quickshell/Modals/Settings/SettingsSidebar.qml @@ -178,6 +178,9 @@ Item { root.focusAfterNavigation(keyboard); return; } + const islandBar = SettingsSearchService.islandBarFor(result.conditionKey, SettingsUiState.selectedBarId); + if (islandBar) + SettingsUiState.selectedBarId = islandBar.id; if (result.section) SettingsSearchService.navigateToSection(result.section); const page = result.page || SettingsTabs.pageForTabIndex(result.tabIndex); diff --git a/quickshell/Modules/DIsland/IslandBarHost.qml b/quickshell/Modules/DIsland/IslandBarHost.qml index 425eb79c0..c2a65a216 100644 --- a/quickshell/Modules/DIsland/IslandBarHost.qml +++ b/quickshell/Modules/DIsland/IslandBarHost.qml @@ -465,7 +465,7 @@ Item { compactBackground: root.embedded && root.setting("islandWidgetBackground") === true && !(root.barConfig?.noBackground ?? false) compactBackgroundColor: BarMetrics.widgetFill(root.barConfig) opacity: root.freeOpacity - reducedMotion: root.setting("islandReducedMotion") || SettingsData.reduceMotion || SettingsData.animationDuration <= 0 + reducedMotion: SettingsData.reduceMotion || SettingsData.animationDuration <= 0 springStiffness: Math.max(root.springStiffnessRange[0], Math.min(root.springStiffnessRange[1], root.setting("islandSpringStiffness"))) springDamping: Math.max(root.springDampingRange[0], Math.min(root.springDampingRange[1], root.setting("islandSpringDamping"))) springMass: Math.max(root.springMassRange[0], Math.min(root.springMassRange[1], root.setting("islandSpringMass"))) diff --git a/quickshell/Modules/Settings/TypographyMotionTab.qml b/quickshell/Modules/Settings/TypographyMotionTab.qml index 386301d67..13ca6b83f 100644 --- a/quickshell/Modules/Settings/TypographyMotionTab.qml +++ b/quickshell/Modules/Settings/TypographyMotionTab.qml @@ -129,7 +129,7 @@ Item { SettingsCard { tab: "typography" - tags: ["animation", "motion", "speed", "duration", "spring", "physics", "bounce", "accessibility", "reduce", "ripple", "fluid"] + tags: ["animation", "motion", "speed", "duration", "spring", "physics", "bounce", "accessibility", "ripple", "fluid"] title: I18n.tr("Animations", "settings card title") settingKey: "animations" iconName: "auto_awesome_motion" diff --git a/quickshell/Modules/Settings/Widgets/IslandMotionCard.qml b/quickshell/Modules/Settings/Widgets/IslandMotionCard.qml index 18b4409e6..aa19e8a8b 100644 --- a/quickshell/Modules/Settings/Widgets/IslandMotionCard.qml +++ b/quickshell/Modules/Settings/Widgets/IslandMotionCard.qml @@ -10,17 +10,7 @@ SettingsCard { iconName: "animation" title: I18n.tr("Motion", "island settings: spring motion card title") settingKey: root.keyPrefix + "Motion" - tags: ["island", "motion", "spring", "animation", "reduce"] - - SettingsToggleRow { - settingKey: root.keyPrefix + "ReducedMotion" - tags: ["island", "motion", "animation", "reduce", "accessibility", "spring"] - resetStore: root.store - resetKeys: ["islandReducedMotion"] - text: I18n.tr("Reduce motion") - checked: root.store.setting("islandReducedMotion") - onToggled: checked => root.store.apply("islandReducedMotion", checked) - } + tags: ["island", "motion", "spring", "animation"] SettingsSliderRow { settingKey: root.keyPrefix + "SpringStiffness" @@ -33,7 +23,7 @@ SettingsCard { maximum: 1200 step: 10 value: Math.round(root.store.setting("islandSpringStiffness")) - enabled: !root.store.setting("islandReducedMotion") + enabled: !SettingsData.reduceMotion onSliderValueChanged: value => root.store.apply("islandSpringStiffness", value) } @@ -48,7 +38,7 @@ SettingsCard { maximum: 100 step: 1 value: Math.round(root.store.setting("islandSpringDamping")) - enabled: !root.store.setting("islandReducedMotion") + enabled: !SettingsData.reduceMotion onSliderValueChanged: value => root.store.apply("islandSpringDamping", value) } @@ -64,7 +54,7 @@ SettingsCard { unit: "" decimals: 2 value: Math.round(root.store.setting("islandSpringMass") * 100) - enabled: !root.store.setting("islandReducedMotion") + enabled: !SettingsData.reduceMotion onSliderValueChanged: value => root.store.apply("islandSpringMass", value / 100) } } diff --git a/quickshell/Modules/Settings/Widgets/SettingsMetrics.qml b/quickshell/Modules/Settings/Widgets/SettingsMetrics.qml index 5d03dd587..a4d4638da 100644 --- a/quickshell/Modules/Settings/Widgets/SettingsMetrics.qml +++ b/quickshell/Modules/Settings/Widgets/SettingsMetrics.qml @@ -59,6 +59,8 @@ Singleton { readonly property color selectedRowColor: Theme.selectedContainer readonly property int transitionDuration: Theme.expressiveDurations.expressiveFastSpatial readonly property int fadeDuration: Theme.expressiveDurations.expressiveEffects + readonly property int exitDuration: Theme.expressiveDurations.expressiveFastEffects readonly property int pageSettleFrames: 2 readonly property int pageSettleDeadline: 250 + readonly property int pageSpinnerDelay: 500 } diff --git a/quickshell/Services/SettingsSearchService.qml b/quickshell/Services/SettingsSearchService.qml index b3a56898a..8e3b7df41 100644 --- a/quickshell/Services/SettingsSearchService.qml +++ b/quickshell/Services/SettingsSearchService.qml @@ -77,12 +77,29 @@ Singleton { "matugenAvailable": () => Theme.matugenAvailable, "greeterAvailable": () => GreeterService.available, "frameEnabled": () => SettingsData.frameEnabled, - "islandEnabled": () => SettingsData.islandBarConfigs.length > 0, + "islandEnabled": () => root.islandBarFor("islandEnabled") !== null, + "islandFree": () => root.islandBarFor("islandFree") !== null, + "islandDocked": () => root.islandBarFor("islandDocked") !== null, "dotEnabled": () => SettingsData.dotBarConfig?.enabled ?? false, "cellularAvailable": () => NetworkService.cellularAvailable, "dockEnabled": () => (SettingsData.dockConfigs ?? []).some(dock => dock.enabled) }) + readonly property var islandBarFilters: ({ + "islandEnabled": cfg => true, + "islandFree": cfg => SettingsData.islandFreePlacement(cfg), + "islandDocked": cfg => !SettingsData.islandFreePlacement(cfg) + }) + + // The bar pages only show island rows for the selected bar, so a result has to pick one that fits its condition. + function islandBarFor(conditionKey, preferredId) { + const filter = islandBarFilters[conditionKey]; + if (!filter) + return null; + const bars = SettingsData.enabledIslandBarConfigs.filter(filter); + return bars.find(cfg => cfg.id === preferredId) ?? bars[0] ?? null; + } + property var pluginSettingLabels: ({}) Component.onCompleted: indexFile.reload() diff --git a/quickshell/translations/extract_settings_index.py b/quickshell/translations/extract_settings_index.py index 6f937bd26..77819dd08 100644 --- a/quickshell/translations/extract_settings_index.py +++ b/quickshell/translations/extract_settings_index.py @@ -507,6 +507,10 @@ def find_settings_components(content, filename, wrappers, tab_meta, hub_meta): condition_key = "matugenAvailable" elif "dock.config.enabled" in visible_raw: condition_key = "dockEnabled" + elif "selectedIslandDocked" in visible_raw or "!root.selectedIslandFree" in visible_raw: + condition_key = "islandDocked" + elif "selectedIslandFree" in visible_raw and "!dankBarTab.selectedIslandFree" not in visible_raw: + condition_key = "islandFree" if filename in BAR_TAB_FILES and not condition_key: if setting_key.startswith("frame"): condition_key = "frameEnabled" diff --git a/quickshell/translations/settings_search_index.json b/quickshell/translations/settings_search_index.json index 47118275d..fed733565 100644 --- a/quickshell/translations/settings_search_index.json +++ b/quickshell/translations/settings_search_index.json @@ -3468,7 +3468,7 @@ "topbar" ], "parentLabel": "Bar", - "conditionKey": "islandEnabled" + "conditionKey": "islandFree" }, { "section": "barExclusiveZone", @@ -3894,7 +3894,6 @@ "island", "motion", "panel", - "reduce", "spring", "statusbar", "taskbar", @@ -4028,7 +4027,7 @@ "vertical" ], "parentLabel": "Bar", - "conditionKey": "islandEnabled" + "conditionKey": "islandFree" }, { "section": "islandOuterGap", @@ -4050,7 +4049,7 @@ "topbar" ], "parentLabel": "Bar", - "conditionKey": "islandEnabled" + "conditionKey": "islandDocked" }, { "section": "islandPlacement", @@ -4102,28 +4101,6 @@ "parentLabel": "Bar", "icon": "vertical_align_center" }, - { - "section": "islandReducedMotion", - "label": "Reduce motion", - "tabIndex": 3, - "category": "General", - "keywords": [ - "accessibility", - "animation", - "bar", - "general", - "island", - "motion", - "panel", - "reduce", - "spring", - "statusbar", - "taskbar", - "topbar" - ], - "parentLabel": "Bar", - "conditionKey": "islandEnabled" - }, { "section": "islandReserveThickness", "label": "Reserved width", @@ -4146,7 +4123,7 @@ "width" ], "parentLabel": "Bar", - "conditionKey": "islandEnabled" + "conditionKey": "islandDocked" }, { "section": "barRightClickAction", @@ -4504,7 +4481,7 @@ "vertical" ], "parentLabel": "Bar", - "conditionKey": "islandEnabled" + "conditionKey": "islandDocked" }, { "section": "barVisibility", @@ -5141,7 +5118,7 @@ "width" ], "parentLabel": "Bar", - "conditionKey": "islandEnabled" + "conditionKey": "islandDocked" }, { "section": "islandHomeStatusContent", @@ -7730,7 +7707,6 @@ "fonts", "motion", "physics", - "reduce", "ripple", "speed", "spring", @@ -10443,14 +10419,6 @@ "runtimeType": "barWidgetOption", "optionFile": "WorkspaceSwitcherOptions.qml" }, - { - "section": "barWidgetOption:IslandOptions.qml:29", - "label": "Reduce motion", - "tabIndex": 22, - "keywords": [], - "runtimeType": "barWidgetOption", - "optionFile": "IslandOptions.qml" - }, { "section": "barWidgetOption:WorkspaceSwitcherOptions.qml:19", "label": "Reverse scroll direction", @@ -10668,7 +10636,7 @@ "optionFile": "AppsDockOptions.qml" }, { - "section": "barWidgetOption:IslandOptions.qml:31", + "section": "barWidgetOption:IslandOptions.qml:30", "label": "Spring damping", "tabIndex": 22, "keywords": [], @@ -10676,7 +10644,7 @@ "optionFile": "IslandOptions.qml" }, { - "section": "barWidgetOption:IslandOptions.qml:32", + "section": "barWidgetOption:IslandOptions.qml:31", "label": "Spring mass", "tabIndex": 22, "keywords": [], @@ -10684,7 +10652,7 @@ "optionFile": "IslandOptions.qml" }, { - "section": "barWidgetOption:IslandOptions.qml:30", + "section": "barWidgetOption:IslandOptions.qml:29", "label": "Spring stiffness", "tabIndex": 22, "keywords": [], @@ -17484,7 +17452,6 @@ "island", "motion", "panel", - "reduce", "spring", "statusbar", "taskbar", @@ -17617,28 +17584,6 @@ "parentLabel": "Bar", "conditionKey": "dotEnabled" }, - { - "section": "dotReducedMotion", - "label": "Reduce motion", - "tabIndex": 65, - "category": "Dot", - "keywords": [ - "accessibility", - "animation", - "bar", - "dot", - "island", - "motion", - "panel", - "reduce", - "spring", - "statusbar", - "taskbar", - "topbar" - ], - "parentLabel": "Bar", - "conditionKey": "dotEnabled" - }, { "section": "dotSharedRouting", "label": "Shared shortcuts",