From 18a0fe3977175f3f7a945b300524fd2cd37fef28 Mon Sep 17 00:00:00 2001
From: Ariver <shanghai3168@gmail.com>
Date: Sat, 13 Jun 2026 15:15:47 +0800
Subject: [PATCH] Add app grid usage tips

---
 src/Apptag/Localization/fr.json        |   22 +
 src/Apptag/Localization/ru.json        |   22 +
 src/Apptag/AppGridCollectionView.swift |   53 ++
 src/Scripts/usage_tips_qa.sh           |  153 ++++++++
 src/Apptag/Localization/ar.json        |   22 +
 src/Apptag/Localization/ro.json        |   22 +
 src/Apptag/Localization/en.json        |   22 +
 src/Apptag/Localization/sv.json        |   22 +
 src/Apptag/Localization/zh-Hant.json   |   22 +
 src/Apptag/Localization/pl.json        |   22 +
 src/Apptag/Localization/es.json        |   22 +
 src/Apptag/Localization/th.json        |   22 +
 src/Apptag/Localization/nn.json        |   22 +
 src/Apptag/Localization/cs.json        |   22 +
 src/Apptag/Localization/ms.json        |   22 +
 src/Apptag/Localization/it.json        |   22 +
 src/Apptag/Localization/tr.json        |   22 +
 src/Apptag/Localization/da.json        |   22 +
 src/Apptag/Localization/id.json        |   22 +
 src/Apptag/Localization/ja.json        |   22 +
 src/Apptag/PreferencesView.swift       |   10 
 src/Apptag/AppDefaults.swift           |    2 
 src/Apptag/Localization/de.json        |   22 +
 src/Apptag/Localization/pt-BR.json     |   22 +
 src/Apptag/Localization/ar-Najdi.json  |   22 +
 src/Apptag/Localization/nb.json        |   22 +
 src/Apptag/Localization/ko.json        |   22 +
 src/Apptag/Localization/no.json        |   22 +
 src/Apptag/ContentView.swift           |  209 +++++++++-
 src/Apptag/Localization/sr-Cyrl.json   |   22 +
 src/Apptag/Localization/zh-Hans.json   |   22 +
 src/Apptag/Localization/nl.json        |   22 +
 src/Apptag/Localization/uk.json        |   22 +
 src/Apptag/Localization/vi.json        |   22 +
 34 files changed, 991 insertions(+), 74 deletions(-)

diff --git a/src/Apptag/AppDefaults.swift b/src/Apptag/AppDefaults.swift
index 0484a60..db0fb3b 100644
--- a/src/Apptag/AppDefaults.swift
+++ b/src/Apptag/AppDefaults.swift
@@ -12,6 +12,7 @@
     static let showDockIcon = true
     static let launchAtLogin = true
     static let showUncommonAppBubbles = false
+    static let hideUsageTips = false
     static let useAppKitTagNavigation = true
 
     static func register() {
@@ -24,6 +25,7 @@
             "showDockIcon": showDockIcon,
             "launchAtLogin": launchAtLogin,
             "showUncommonAppBubbles": showUncommonAppBubbles,
+            "hideUsageTips": hideUsageTips,
             "useAppKitTagNavigation": useAppKitTagNavigation,
             "skipTagRemovalDropConfirm": false,
             "skipUncategorizedDropConfirm": false,
diff --git a/src/Apptag/AppGridCollectionView.swift b/src/Apptag/AppGridCollectionView.swift
index 5889cd3..cfcd15d 100644
--- a/src/Apptag/AppGridCollectionView.swift
+++ b/src/Apptag/AppGridCollectionView.swift
@@ -38,6 +38,7 @@
     let bubbleDisabled: Bool
     let showUncommonAppBubbles: Bool
     let highlightedGroupName: String?
+    let bottomContentPadding: CGFloat
     let contentRevision: Int
     let scrollTargetID: String?
     let scrollRequestToken: Int
@@ -71,6 +72,7 @@
             bubbleDisabled: bubbleDisabled,
             showUncommonAppBubbles: showUncommonAppBubbles,
             highlightedGroupName: highlightedGroupName,
+            bottomContentPadding: bottomContentPadding,
             contentRevision: contentRevision,
             scrollTargetID: scrollTargetID,
             scrollRequestToken: scrollRequestToken,
@@ -97,6 +99,7 @@
         private var scrollBubbleDisabled = false
         var showUncommonAppBubbles = AppDefaults.showUncommonAppBubbles
         var highlightedGroupName: String?
+        var bottomContentPadding: CGFloat = 0
         var contentRevision = 0
         var scrollTargetID: String?
         var scrollRequestToken = 0
@@ -129,6 +132,7 @@
             bubbleDisabled: Bool,
             showUncommonAppBubbles: Bool,
             highlightedGroupName: String?,
+            bottomContentPadding: CGFloat,
             contentRevision: Int,
             scrollTargetID: String?,
             scrollRequestToken: Int,
@@ -150,6 +154,7 @@
             self.externalBubbleDisabled = bubbleDisabled
             self.showUncommonAppBubbles = showUncommonAppBubbles
             self.highlightedGroupName = highlightedGroupName
+            self.bottomContentPadding = max(0, bottomContentPadding)
             self.contentRevision = contentRevision
             self.scrollTargetID = scrollTargetID
             self.scrollRequestToken = scrollRequestToken
@@ -169,6 +174,7 @@
                 iconSize: iconSize,
                 showNames: showNames,
                 showUncommonAppBubbles: showUncommonAppBubbles,
+                bottomContentPadding: self.bottomContentPadding,
                 contentRevision: contentRevision
             )
             if nextSignature != contentSignature {
@@ -324,6 +330,7 @@
             iconSize: CGFloat,
             showNames: Bool,
             showUncommonAppBubbles: Bool,
+            bottomContentPadding: CGFloat,
             contentRevision: Int
         ) -> String {
             let colorPart = tagColors
@@ -335,6 +342,7 @@
                 "\(Int(iconSize.rounded()))",
                 showNames ? "names" : "nonames",
                 showUncommonAppBubbles ? "uncommon" : "allbubbles",
+                "bottom=\(Int(bottomContentPadding.rounded()))",
                 colorPart,
                 "rev=\(contentRevision)"
             ].joined(separator: "|")
@@ -567,7 +575,8 @@
             groups: visibleGroups,
             contentWidth: collectionView.bounds.width,
             iconSize: iconSize,
-            displayMode: coordinator?.displayMode ?? AppDefaults.displayMode
+            displayMode: coordinator?.displayMode ?? AppDefaults.displayMode,
+            bottomContentPadding: coordinator?.bottomContentPadding ?? 0
         )
 
         var nextAttributes: [IndexPath: NSCollectionViewLayoutAttributes] = [:]
@@ -613,22 +622,39 @@
         groups: [TagGroup],
         contentWidth: CGFloat,
         iconSize: CGFloat,
-        displayMode: String
+        displayMode: String,
+        bottomContentPadding: CGFloat
     ) -> LayoutPlan {
         switch AppGridCollectionDisplayMode(displayMode) {
         case .flat:
-            return makeFlatPlan(groups: groups, contentWidth: contentWidth, iconSize: iconSize)
+            return makeFlatPlan(
+                groups: groups,
+                contentWidth: contentWidth,
+                iconSize: iconSize,
+                bottomContentPadding: bottomContentPadding
+            )
         case .masonryContainer:
-            return makeMasonryPlan(groups: groups, contentWidth: contentWidth, iconSize: iconSize)
+            return makeMasonryPlan(
+                groups: groups,
+                contentWidth: contentWidth,
+                iconSize: iconSize,
+                bottomContentPadding: bottomContentPadding
+            )
         case .gridContainer:
-            return makeGridPlan(groups: groups, contentWidth: contentWidth, iconSize: iconSize)
+            return makeGridPlan(
+                groups: groups,
+                contentWidth: contentWidth,
+                iconSize: iconSize,
+                bottomContentPadding: bottomContentPadding
+            )
         }
     }
 
     private static func makeGridPlan(
         groups: [TagGroup],
         contentWidth: CGFloat,
-        iconSize: CGFloat
+        iconSize: CGFloat,
+        bottomContentPadding: CGFloat
     ) -> LayoutPlan {
         let boundedContentWidth = max(1, contentWidth)
         let outerPadding = AppGridCollectionMetrics.outerPadding
@@ -658,7 +684,8 @@
             y += height + gap
         }
 
-        let contentHeight = rows.isEmpty ? outerPadding * 2 : y - gap + outerPadding
+        let contentHeight = (rows.isEmpty ? outerPadding * 2 : y - gap + outerPadding)
+            + max(0, bottomContentPadding)
         return LayoutPlan(
             items: items,
             contentSize: NSSize(width: boundedContentWidth, height: max(1, contentHeight))
@@ -668,7 +695,8 @@
     private static func makeFlatPlan(
         groups: [TagGroup],
         contentWidth: CGFloat,
-        iconSize: CGFloat
+        iconSize: CGFloat,
+        bottomContentPadding: CGFloat
     ) -> LayoutPlan {
         let boundedContentWidth = max(1, contentWidth)
         let outerPadding = AppGridCollectionMetrics.outerPadding
@@ -691,7 +719,8 @@
             y += height + AppGridCollectionMetrics.flatGroupGap
         }
 
-        let contentHeight = groups.isEmpty ? outerPadding * 2 : y - AppGridCollectionMetrics.flatGroupGap + outerPadding
+        let contentHeight = (groups.isEmpty ? outerPadding * 2 : y - AppGridCollectionMetrics.flatGroupGap + outerPadding)
+            + max(0, bottomContentPadding)
         return LayoutPlan(
             items: items,
             contentSize: NSSize(width: boundedContentWidth, height: max(1, contentHeight))
@@ -701,7 +730,8 @@
     private static func makeMasonryPlan(
         groups: [TagGroup],
         contentWidth: CGFloat,
-        iconSize: CGFloat
+        iconSize: CGFloat,
+        bottomContentPadding: CGFloat
     ) -> LayoutPlan {
         let boundedContentWidth = max(1, contentWidth)
         let outerPadding = AppGridCollectionMetrics.outerPadding
@@ -731,7 +761,8 @@
         }
 
         let tallest = columnHeights.max() ?? outerPadding
-        let contentHeight = groups.isEmpty ? outerPadding * 2 : tallest - gap + outerPadding
+        let contentHeight = (groups.isEmpty ? outerPadding * 2 : tallest - gap + outerPadding)
+            + max(0, bottomContentPadding)
         return LayoutPlan(
             items: items,
             contentSize: NSSize(width: boundedContentWidth, height: max(1, contentHeight))
diff --git a/src/Apptag/ContentView.swift b/src/Apptag/ContentView.swift
index 1afa3e3..122addf 100644
--- a/src/Apptag/ContentView.swift
+++ b/src/Apptag/ContentView.swift
@@ -340,6 +340,120 @@
     let tagName: String
 }
 
+private struct AppGridUsageTip: Identifiable {
+    let id: Int
+    let titleKey: String
+    let detailKey: String
+}
+
+private struct AppGridUsageTipsBar: View {
+    static let reservedHeight: CGFloat = 64
+
+    let tips: [AppGridUsageTip]
+    @Binding var selectedIndex: Int
+    let dragModeActive: Bool
+
+    @State private var textHovered = false
+
+    private var safeIndex: Int {
+        guard tips.indices.contains(selectedIndex) else { return 0 }
+        return selectedIndex
+    }
+
+    private var currentTip: AppGridUsageTip? {
+        guard !tips.isEmpty else { return nil }
+        return tips[safeIndex]
+    }
+
+    var body: some View {
+        if let tip = currentTip {
+            HStack(spacing: 0) {
+                Text(tr(tip.titleKey))
+                    .font(.system(size: 14, weight: .semibold))
+                    .foregroundStyle(Color.primary)
+                    .lineLimit(1)
+                    .minimumScaleFactor(0.82)
+                    .padding(.horizontal, 14)
+                    .frame(width: 174, height: 42, alignment: .leading)
+                    .background(Color(nsColor: .controlBackgroundColor).opacity(0.96))
+
+                tipDetailText(tip)
+                    .frame(height: 42)
+                    .frame(maxWidth: .infinity, alignment: .leading)
+                    .background(Color.black.opacity(0.88))
+
+                tipsControls
+                    .frame(width: 86, height: 42)
+                    .background(Color.black.opacity(0.88))
+            }
+            .clipShape(RoundedRectangle(cornerRadius: 8, style: .continuous))
+            .overlay(
+                RoundedRectangle(cornerRadius: 8, style: .continuous)
+                    .stroke(Color.primary.opacity(0.18), lineWidth: 1)
+            )
+            .shadow(color: .black.opacity(0.20), radius: 14, y: 7)
+            .frame(maxWidth: 980)
+            .padding(.horizontal, 18)
+            .padding(.bottom, 12)
+            .opacity(dragModeActive ? 0.72 : 1.0)
+            .allowsHitTesting(!dragModeActive)
+            .accessibilityElement(children: .combine)
+            .accessibilityLabel("\(tr(tip.titleKey)) \(tr(tip.detailKey))")
+        }
+    }
+
+    private func tipDetailText(_ tip: AppGridUsageTip) -> some View {
+        ScrollView(.horizontal, showsIndicators: textHovered) {
+            Text(tr(tip.detailKey))
+                .font(.system(size: 15, weight: .medium))
+                .foregroundStyle(Color.white.opacity(0.96))
+                .lineLimit(1)
+                .fixedSize(horizontal: true, vertical: false)
+                .padding(.horizontal, 14)
+                .frame(minHeight: 42, alignment: .center)
+        }
+        .onHover { textHovered = $0 }
+        .help(tr(tip.detailKey))
+    }
+
+    private var tipsControls: some View {
+        VStack(spacing: 4) {
+            HStack(spacing: 8) {
+                usageTipNavigationButton(systemImage: "chevron.left", labelKey: "usageTips.previous") {
+                    selectedIndex = (safeIndex - 1 + tips.count) % tips.count
+                }
+                usageTipNavigationButton(systemImage: "chevron.right", labelKey: "usageTips.next") {
+                    selectedIndex = (safeIndex + 1) % tips.count
+                }
+            }
+
+            HStack(spacing: 3) {
+                ForEach(tips.indices, id: \.self) { index in
+                    Circle()
+                        .fill(index == safeIndex ? Color.accentColor : Color.white.opacity(0.58))
+                        .frame(width: 4, height: 4)
+                }
+            }
+        }
+    }
+
+    private func usageTipNavigationButton(
+        systemImage: String,
+        labelKey: String,
+        action: @escaping () -> Void
+    ) -> some View {
+        Button(action: action) {
+            Image(systemName: systemImage)
+                .font(.system(size: 15, weight: .bold))
+                .foregroundStyle(Color.white.opacity(0.96))
+                .frame(width: 24, height: 22)
+                .contentShape(Rectangle())
+        }
+        .buttonStyle(.plain)
+        .accessibilityLabel(tr(labelKey))
+    }
+}
+
 struct ContentView: View {
     let hideOverlay: () -> Void
     private let initialQuickSearchSource: String?
@@ -353,6 +467,7 @@
     @State private var groupLayoutVersion = 0
     @State private var appGridScrollTargetID: String? = nil
     @State private var appGridScrollRequestToken = 0
+    @State private var selectedUsageTipIndex = 0
 
     // Edit mode
     @State private var editPhase: EditPhase = .none
@@ -414,6 +529,7 @@
     @AppStorage("displayMode") private var displayMode = AppDefaults.displayMode
     @AppStorage("hideAppNames") private var hideAppNames = AppDefaults.hideAppNames
     @AppStorage("showUncommonAppBubbles") private var showUncommonAppBubbles = AppDefaults.showUncommonAppBubbles
+    @AppStorage("hideUsageTips") private var hideUsageTips = AppDefaults.hideUsageTips
     @AppStorage("useAppKitTagNavigation") private var useAppKitTagNavigation = AppDefaults.useAppKitTagNavigation
     @AppStorage("skipTagRemovalDropConfirm") private var skipTagRemovalDropConfirm = false
     @AppStorage("skipUncategorizedDropConfirm") private var skipUncategorizedDropConfirm = false
@@ -448,6 +564,23 @@
 
     private var isColorlessContainerMode: Bool {
         displayMode == "container" || displayMode == "gridContainer"
+    }
+
+    private var shouldShowUsageTips: Bool {
+        !hideUsageTips && !allApps.isEmpty && !quickSearchOnlySession
+    }
+
+    private var appGridUsageTips: [AppGridUsageTip] {
+        [
+            AppGridUsageTip(id: 1, titleKey: "usageTips.tip1.title", detailKey: "usageTips.tip1.detail"),
+            AppGridUsageTip(id: 2, titleKey: "usageTips.tip2.title", detailKey: "usageTips.tip2.detail"),
+            AppGridUsageTip(id: 3, titleKey: "usageTips.tip3.title", detailKey: "usageTips.tip3.detail"),
+            AppGridUsageTip(id: 4, titleKey: "usageTips.tip4.title", detailKey: "usageTips.tip4.detail"),
+            AppGridUsageTip(id: 5, titleKey: "usageTips.tip5.title", detailKey: "usageTips.tip5.detail"),
+            AppGridUsageTip(id: 6, titleKey: "usageTips.tip6.title", detailKey: "usageTips.tip6.detail"),
+            AppGridUsageTip(id: 7, titleKey: "usageTips.tip7.title", detailKey: "usageTips.tip7.detail"),
+            AppGridUsageTip(id: 8, titleKey: "usageTips.tip8.title", detailKey: "usageTips.tip8.detail"),
+        ]
     }
 
     private var shouldRenderAppGridBehindQuickSearch: Bool {
@@ -1112,38 +1245,50 @@
                 ProgressView().scaleEffect(0.8)
                 Spacer()
             } else {
-                AppGridCollectionView(
-                    groups: displayGroups,
-                    tagColors: tagColors,
-                    displayMode: displayMode,
-                    iconSize: iconSize,
-                    showNames: !hideAppNames,
-                    bubbleDisabled: appBubbleDisabled,
-                    showUncommonAppBubbles: showUncommonAppBubbles,
-                    highlightedGroupName: appGridHighlightedGroupName,
-                    contentRevision: groupLayoutVersion,
-                    scrollTargetID: appGridScrollTargetID,
-                    scrollRequestToken: appGridScrollRequestToken,
-                    onSelectApp: { app in openApp(app) },
-                    onBubbleHover: handleBubbleHover,
-                    onEditNote: beginEditingBubbleNote,
-                    onDropApp: { path, source, target, copy in
-                        dropApp(path: path, sourceTag: source, targetTag: target, copy: copy)
-                    },
-                    onDropOutsideGroup: { path, source, copy in
-                        dropAppOutsideGroup(path: path, sourceTag: source, copy: copy)
-                    },
-                    onReorderApps: { containerID, orderedPaths in
-                        reorderApps(inContainer: containerID, orderedPaths: orderedPaths)
-                    },
-                    onGroupActivate: { groupName in
-                        if isColorlessContainerMode {
-                            toggleColorlessFill(groupName)
-                        }
-                    },
-                    onScrollActivity: handleAppGridScrollActivity,
-                    onDragModeChange: { setAppDragMode($0) }
-                )
+                ZStack(alignment: .bottom) {
+                    AppGridCollectionView(
+                        groups: displayGroups,
+                        tagColors: tagColors,
+                        displayMode: displayMode,
+                        iconSize: iconSize,
+                        showNames: !hideAppNames,
+                        bubbleDisabled: appBubbleDisabled,
+                        showUncommonAppBubbles: showUncommonAppBubbles,
+                        highlightedGroupName: appGridHighlightedGroupName,
+                        bottomContentPadding: shouldShowUsageTips ? AppGridUsageTipsBar.reservedHeight : 0,
+                        contentRevision: groupLayoutVersion,
+                        scrollTargetID: appGridScrollTargetID,
+                        scrollRequestToken: appGridScrollRequestToken,
+                        onSelectApp: { app in openApp(app) },
+                        onBubbleHover: handleBubbleHover,
+                        onEditNote: beginEditingBubbleNote,
+                        onDropApp: { path, source, target, copy in
+                            dropApp(path: path, sourceTag: source, targetTag: target, copy: copy)
+                        },
+                        onDropOutsideGroup: { path, source, copy in
+                            dropAppOutsideGroup(path: path, sourceTag: source, copy: copy)
+                        },
+                        onReorderApps: { containerID, orderedPaths in
+                            reorderApps(inContainer: containerID, orderedPaths: orderedPaths)
+                        },
+                        onGroupActivate: { groupName in
+                            if isColorlessContainerMode {
+                                toggleColorlessFill(groupName)
+                            }
+                        },
+                        onScrollActivity: handleAppGridScrollActivity,
+                        onDragModeChange: { setAppDragMode($0) }
+                    )
+
+                    if shouldShowUsageTips {
+                        AppGridUsageTipsBar(
+                            tips: appGridUsageTips,
+                            selectedIndex: $selectedUsageTipIndex,
+                            dragModeActive: appGridInteraction.appDragModeActive
+                        )
+                        .zIndex(3)
+                    }
+                }
             }
         }
     }
diff --git a/src/Apptag/Localization/ar-Najdi.json b/src/Apptag/Localization/ar-Najdi.json
index dbbdf8c..db1b761 100644
--- a/src/Apptag/Localization/ar-Najdi.json
+++ b/src/Apptag/Localization/ar-Najdi.json
@@ -207,5 +207,25 @@
   "help.copyLink": "Copy Help PDF link",
   "help.currentLanguage": "Opens the online PDF for the current app language.",
   "settings.language.auto": "تلقائي",
-  "help.downloadPDF": "تنزيل ملف المساعدة PDF"
+  "help.downloadPDF": "تنزيل ملف المساعدة PDF",
+  "settings.hideUsageTips": "إخفاء تلميحات الاستخدام",
+  "settings.hideUsageTipsDesc": "إذا شغّلته، تختفي التلميحات العايمة أسفل شبكة التطبيقات.",
+  "usageTips.previous": "التلميحة السابقة",
+  "usageTips.next": "التلميحة التالية",
+  "usageTips.tip1.title": "تلميحة 1 - إضافة وسوم:",
+  "usageTips.tip1.detail": "افتح الإعدادات > الوسوم لتعديل الوسوم.",
+  "usageTips.tip2.title": "تلميحة 2 - وسم التطبيقات:",
+  "usageTips.tip2.detail": "اضغط مطوّل على أيقونة التطبيق عشان تبدأ السحب > اسحبها على وسم لتعيينه.",
+  "usageTips.tip3.title": "تلميحة 3 - نقل التطبيقات:",
+  "usageTips.tip3.detail": "اضغط مطوّل على أيقونة التطبيق عشان تبدأ السحب > اسحبها مباشرة للحاوية عشان تنقلها.",
+  "usageTips.tip4.title": "تلميحة 4 - نسخ التطبيقات:",
+  "usageTips.tip4.detail": "اضغط مطوّل على أيقونة التطبيق عشان تبدأ السحب > اضغط Alt/Option واسحبها للحاوية عشان تنسخها.",
+  "usageTips.tip5.title": "تلميحة 5 - إزالة الوسوم:",
+  "usageTips.tip5.detail": "اضغط مطوّل على أيقونة التطبيق عشان تبدأ السحب > اسحبها للمساحة الفاضية بين الحاويات.",
+  "usageTips.tip6.title": "تلميحة 6 - ترتيب الوسوم:",
+  "usageTips.tip6.detail": "اضغط مطوّل على وسم عشان تبدأ السحب > انقله للمكان المطلوب ثم اتركه.",
+  "usageTips.tip7.title": "تلميحة 7 - ترتيب التطبيقات:",
+  "usageTips.tip7.detail": "اضغط مطوّل على أيقونة التطبيق عشان تبدأ السحب > انقلها للمكان المطلوب داخل الحاوية ثم اتركها.",
+  "usageTips.tip8.title": "تلميحة 8 - تعديل الملاحظات:",
+  "usageTips.tip8.detail": "انقر يمين على التطبيق > اكتب ملاحظة."
 }
diff --git a/src/Apptag/Localization/ar.json b/src/Apptag/Localization/ar.json
index 65bb0d5..81c6638 100644
--- a/src/Apptag/Localization/ar.json
+++ b/src/Apptag/Localization/ar.json
@@ -207,5 +207,25 @@
   "help.copyLink": "Copy Help PDF link",
   "help.currentLanguage": "Opens the online PDF for the current app language.",
   "settings.language.auto": "تلقائي",
-  "help.downloadPDF": "تنزيل ملف المساعدة PDF"
+  "help.downloadPDF": "تنزيل ملف المساعدة PDF",
+  "settings.hideUsageTips": "إخفاء نصائح الاستخدام",
+  "settings.hideUsageTipsDesc": "عند التفعيل، يتم إخفاء النصائح العائمة أسفل شبكة التطبيقات.",
+  "usageTips.previous": "النصيحة السابقة",
+  "usageTips.next": "النصيحة التالية",
+  "usageTips.tip1.title": "النصيحة 1 - إضافة وسوم:",
+  "usageTips.tip1.detail": "افتح الإعدادات > الوسوم لتحرير الوسوم.",
+  "usageTips.tip2.title": "النصيحة 2 - وسم التطبيقات:",
+  "usageTips.tip2.detail": "اضغط مطولاً على أيقونة تطبيق لبدء السحب > اسحبها إلى وسم لتعيينه.",
+  "usageTips.tip3.title": "النصيحة 3 - نقل التطبيقات:",
+  "usageTips.tip3.detail": "اضغط مطولاً على أيقونة تطبيق لبدء السحب > اسحبها مباشرة إلى حاوية لنقلها.",
+  "usageTips.tip4.title": "النصيحة 4 - نسخ التطبيقات:",
+  "usageTips.tip4.detail": "اضغط مطولاً على أيقونة تطبيق لبدء السحب > اضغط Alt/Option واسحبها إلى حاوية لنسخها.",
+  "usageTips.tip5.title": "النصيحة 5 - إزالة الوسوم:",
+  "usageTips.tip5.detail": "اضغط مطولاً على أيقونة تطبيق لبدء السحب > اسحبها إلى المساحة الفارغة بين الحاويات.",
+  "usageTips.tip6.title": "النصيحة 6 - ترتيب الوسوم:",
+  "usageTips.tip6.detail": "اضغط مطولاً على وسم لبدء السحب > انقله إلى الموضع المطلوب ثم اتركه.",
+  "usageTips.tip7.title": "النصيحة 7 - ترتيب التطبيقات:",
+  "usageTips.tip7.detail": "اضغط مطولاً على أيقونة تطبيق لبدء السحب > انقلها إلى الموضع المطلوب داخل الحاوية ثم اتركها.",
+  "usageTips.tip8.title": "النصيحة 8 - تحرير الملاحظات:",
+  "usageTips.tip8.detail": "انقر بزر الماوس الأيمن على تطبيق > أدخل ملاحظة."
 }
diff --git a/src/Apptag/Localization/cs.json b/src/Apptag/Localization/cs.json
index 3ab3e79..1c8c9ec 100644
--- a/src/Apptag/Localization/cs.json
+++ b/src/Apptag/Localization/cs.json
@@ -207,5 +207,25 @@
   "help.copyLink": "Copy Help PDF link",
   "help.currentLanguage": "Opens the online PDF for the current app language.",
   "settings.language.auto": "Automaticky",
-  "help.downloadPDF": "Stáhnout PDF nápovědy"
+  "help.downloadPDF": "Stáhnout PDF nápovědy",
+  "settings.hideUsageTips": "Skrýt tipy k používání",
+  "settings.hideUsageTipsDesc": "Když je zapnuto, plovoucí tipy dole v mřížce aplikací se skryjí.",
+  "usageTips.previous": "Předchozí tip",
+  "usageTips.next": "Další tip",
+  "usageTips.tip1.title": "Tip 1 - Přidat tagy:",
+  "usageTips.tip1.detail": "Otevřete Nastavení > Tagy a upravte tagy.",
+  "usageTips.tip2.title": "Tip 2 - Označit aplikace:",
+  "usageTips.tip2.detail": "Podržte ikonu aplikace a začněte ji táhnout > přetáhněte ji na tag pro přiřazení.",
+  "usageTips.tip3.title": "Tip 3 - Přesunout aplikace:",
+  "usageTips.tip3.detail": "Podržte ikonu aplikace a začněte ji táhnout > přetáhněte ji přímo do kontejneru pro přesun.",
+  "usageTips.tip4.title": "Tip 4 - Kopírovat aplikace:",
+  "usageTips.tip4.detail": "Podržte ikonu aplikace a začněte ji táhnout > držte Alt/Option a přetáhněte ji do kontejneru pro kopírování.",
+  "usageTips.tip5.title": "Tip 5 - Odebrat tagy:",
+  "usageTips.tip5.detail": "Podržte ikonu aplikace a začněte ji táhnout > přetáhněte ji do prázdného místa mezi kontejnery.",
+  "usageTips.tip6.title": "Tip 6 - Seřadit tagy:",
+  "usageTips.tip6.detail": "Podržte tag a začněte jej táhnout > přesuňte jej na cílovou pozici a pusťte.",
+  "usageTips.tip7.title": "Tip 7 - Seřadit aplikace:",
+  "usageTips.tip7.detail": "Podržte ikonu aplikace a začněte ji táhnout > přesuňte ji na cílovou pozici v kontejneru a pusťte.",
+  "usageTips.tip8.title": "Tip 8 - Upravit poznámky:",
+  "usageTips.tip8.detail": "Klikněte na aplikaci pravým tlačítkem > zadejte poznámku."
 }
diff --git a/src/Apptag/Localization/da.json b/src/Apptag/Localization/da.json
index 3681ff7..12b83e7 100644
--- a/src/Apptag/Localization/da.json
+++ b/src/Apptag/Localization/da.json
@@ -207,5 +207,25 @@
   "help.copyLink": "Copy Help PDF link",
   "help.currentLanguage": "Opens the online PDF for the current app language.",
   "settings.language.auto": "Automatisk",
-  "help.downloadPDF": "Download hjælp-PDF"
+  "help.downloadPDF": "Download hjælp-PDF",
+  "settings.hideUsageTips": "Skjul brugstips",
+  "settings.hideUsageTipsDesc": "Når det er slået til, skjules de flydende tips nederst i appgitteret.",
+  "usageTips.previous": "Forrige tip",
+  "usageTips.next": "Næste tip",
+  "usageTips.tip1.title": "Tip 1 - Tilføj tags:",
+  "usageTips.tip1.detail": "Åbn Indstillinger > Tags for at redigere tags.",
+  "usageTips.tip2.title": "Tip 2 - Tag apps:",
+  "usageTips.tip2.detail": "Hold et appikon nede for at trække > slip det på et tag for at tildele tagget.",
+  "usageTips.tip3.title": "Tip 3 - Flyt apps:",
+  "usageTips.tip3.detail": "Hold et appikon nede for at trække > slip det direkte i en container for at flytte det.",
+  "usageTips.tip4.title": "Tip 4 - Kopiér apps:",
+  "usageTips.tip4.detail": "Hold et appikon nede for at trække > hold Alt/Option nede og slip det i en container for at kopiere det.",
+  "usageTips.tip5.title": "Tip 5 - Fjern tags:",
+  "usageTips.tip5.detail": "Hold et appikon nede for at trække > slip det i det tomme område mellem containere.",
+  "usageTips.tip6.title": "Tip 6 - Sortér tags:",
+  "usageTips.tip6.detail": "Hold et tag nede for at trække > flyt det til målpositionen og slip.",
+  "usageTips.tip7.title": "Tip 7 - Sortér apps:",
+  "usageTips.tip7.detail": "Hold et appikon nede for at trække > flyt det til målpositionen i containeren og slip.",
+  "usageTips.tip8.title": "Tip 8 - Rediger noter:",
+  "usageTips.tip8.detail": "Højreklik på en app > indtast en note."
 }
diff --git a/src/Apptag/Localization/de.json b/src/Apptag/Localization/de.json
index d51b522..bcbb67e 100644
--- a/src/Apptag/Localization/de.json
+++ b/src/Apptag/Localization/de.json
@@ -207,5 +207,25 @@
   "help.copyLink": "Link zum Hilfe-PDF kopieren",
   "help.currentLanguage": "Öffnet das Online-PDF für die aktuelle App-Sprache.",
   "settings.language.auto": "Automatisch",
-  "help.downloadPDF": "Hilfe-PDF herunterladen"
+  "help.downloadPDF": "Hilfe-PDF herunterladen",
+  "settings.hideUsageTips": "Nutzungstipps ausblenden",
+  "settings.hideUsageTipsDesc": "Wenn aktiviert, werden die schwebenden Tipps unten im App-Raster ausgeblendet.",
+  "usageTips.previous": "Vorheriger Tipp",
+  "usageTips.next": "Nächster Tipp",
+  "usageTips.tip1.title": "Tipp 1 - Tags hinzufügen:",
+  "usageTips.tip1.detail": "Öffnen Sie Einstellungen > Tags, um Tags zu bearbeiten.",
+  "usageTips.tip2.title": "Tipp 2 - Apps taggen:",
+  "usageTips.tip2.detail": "App-Symbol gedrückt halten, um es zu ziehen > auf einen Tag ziehen, um ihn zuzuweisen.",
+  "usageTips.tip3.title": "Tipp 3 - Apps verschieben:",
+  "usageTips.tip3.detail": "App-Symbol gedrückt halten, um es zu ziehen > direkt in einen Container ziehen, um es zu verschieben.",
+  "usageTips.tip4.title": "Tipp 4 - Apps kopieren:",
+  "usageTips.tip4.detail": "App-Symbol gedrückt halten, um es zu ziehen > Alt/Option gedrückt halten und in einen Container ziehen, um es zu kopieren.",
+  "usageTips.tip5.title": "Tipp 5 - Tags entfernen:",
+  "usageTips.tip5.detail": "App-Symbol gedrückt halten, um es zu ziehen > in den leeren Bereich zwischen Containern ziehen.",
+  "usageTips.tip6.title": "Tipp 6 - Tags sortieren:",
+  "usageTips.tip6.detail": "Tag gedrückt halten, um ihn zu ziehen > an die Zielposition ziehen und loslassen.",
+  "usageTips.tip7.title": "Tipp 7 - Apps sortieren:",
+  "usageTips.tip7.detail": "App-Symbol gedrückt halten, um es zu ziehen > an die Zielposition im Container ziehen und loslassen.",
+  "usageTips.tip8.title": "Tipp 8 - Notizen bearbeiten:",
+  "usageTips.tip8.detail": "Rechtsklick auf eine App > Notiz eingeben."
 }
diff --git a/src/Apptag/Localization/en.json b/src/Apptag/Localization/en.json
index b2a05a3..0dbcd4a 100644
--- a/src/Apptag/Localization/en.json
+++ b/src/Apptag/Localization/en.json
@@ -207,5 +207,25 @@
   "help.copyLink": "Copy Help PDF link",
   "help.currentLanguage": "Opens the online PDF for the current app language.",
   "settings.language.auto": "Automatic",
-  "help.downloadPDF": "Download Help PDF"
+  "help.downloadPDF": "Download Help PDF",
+  "settings.hideUsageTips": "Hide usage tips",
+  "settings.hideUsageTipsDesc": "When enabled, the floating tips at the bottom of the app grid are hidden.",
+  "usageTips.previous": "Previous tip",
+  "usageTips.next": "Next tip",
+  "usageTips.tip1.title": "Tip 1 - Add tags:",
+  "usageTips.tip1.detail": "Open Settings > Tags to edit tags.",
+  "usageTips.tip2.title": "Tip 2 - Tag apps:",
+  "usageTips.tip2.detail": "Long-press an app icon to start dragging > drag it onto a tag to assign that tag.",
+  "usageTips.tip3.title": "Tip 3 - Move apps:",
+  "usageTips.tip3.detail": "Long-press an app icon to start dragging > drag it directly onto a container to move it.",
+  "usageTips.tip4.title": "Tip 4 - Copy apps:",
+  "usageTips.tip4.detail": "Long-press an app icon to start dragging > hold Alt/Option and drag it onto a container to copy it.",
+  "usageTips.tip5.title": "Tip 5 - Remove tags:",
+  "usageTips.tip5.detail": "Long-press an app icon to start dragging > drag it to the blank area between containers.",
+  "usageTips.tip6.title": "Tip 6 - Reorder tags:",
+  "usageTips.tip6.detail": "Long-press a tag to start dragging > drag it to the target position and release.",
+  "usageTips.tip7.title": "Tip 7 - Reorder apps:",
+  "usageTips.tip7.detail": "Long-press an app icon to start dragging > drag it to the target position inside the container and release.",
+  "usageTips.tip8.title": "Tip 8 - Edit notes:",
+  "usageTips.tip8.detail": "Right-click an app > enter a note."
 }
diff --git a/src/Apptag/Localization/es.json b/src/Apptag/Localization/es.json
index e7e385e..4991f8a 100644
--- a/src/Apptag/Localization/es.json
+++ b/src/Apptag/Localization/es.json
@@ -207,5 +207,25 @@
   "help.copyLink": "Copiar enlace del PDF de ayuda",
   "help.currentLanguage": "Abre el PDF en línea para el idioma actual de la app.",
   "settings.language.auto": "Automático",
-  "help.downloadPDF": "Descargar PDF de ayuda"
+  "help.downloadPDF": "Descargar PDF de ayuda",
+  "settings.hideUsageTips": "Ocultar consejos de uso",
+  "settings.hideUsageTipsDesc": "Si está activado, se ocultan los consejos flotantes de la parte inferior de la cuadrícula de apps.",
+  "usageTips.previous": "Consejo anterior",
+  "usageTips.next": "Consejo siguiente",
+  "usageTips.tip1.title": "Consejo 1 - Añadir etiquetas:",
+  "usageTips.tip1.detail": "Abra Ajustes > Etiquetas para editar etiquetas.",
+  "usageTips.tip2.title": "Consejo 2 - Etiquetar apps:",
+  "usageTips.tip2.detail": "Mantenga pulsado un icono para arrastrarlo > suéltelo sobre una etiqueta para asignarla.",
+  "usageTips.tip3.title": "Consejo 3 - Mover apps:",
+  "usageTips.tip3.detail": "Mantenga pulsado un icono para arrastrarlo > suéltelo directamente en un contenedor para moverlo.",
+  "usageTips.tip4.title": "Consejo 4 - Copiar apps:",
+  "usageTips.tip4.detail": "Mantenga pulsado un icono para arrastrarlo > mantenga Alt/Opción y suéltelo en un contenedor para copiarlo.",
+  "usageTips.tip5.title": "Consejo 5 - Quitar etiquetas:",
+  "usageTips.tip5.detail": "Mantenga pulsado un icono para arrastrarlo > suéltelo en el espacio vacío entre contenedores.",
+  "usageTips.tip6.title": "Consejo 6 - Ordenar etiquetas:",
+  "usageTips.tip6.detail": "Mantenga pulsada una etiqueta para arrastrarla > muévala a la posición deseada y suéltela.",
+  "usageTips.tip7.title": "Consejo 7 - Ordenar apps:",
+  "usageTips.tip7.detail": "Mantenga pulsado un icono para arrastrarlo > muévalo a la posición deseada dentro del contenedor y suéltelo.",
+  "usageTips.tip8.title": "Consejo 8 - Editar notas:",
+  "usageTips.tip8.detail": "Haga clic derecho en una app > escriba una nota."
 }
diff --git a/src/Apptag/Localization/fr.json b/src/Apptag/Localization/fr.json
index 432ca72..b77423a 100644
--- a/src/Apptag/Localization/fr.json
+++ b/src/Apptag/Localization/fr.json
@@ -207,5 +207,25 @@
   "help.copyLink": "Copier le lien du PDF d’aide",
   "help.currentLanguage": "Ouvre le PDF en ligne correspondant à la langue actuelle de l’app.",
   "settings.language.auto": "Automatique",
-  "help.downloadPDF": "Télécharger le PDF d’aide"
+  "help.downloadPDF": "Télécharger le PDF d’aide",
+  "settings.hideUsageTips": "Masquer les astuces",
+  "settings.hideUsageTipsDesc": "Si cette option est activée, les astuces flottantes en bas de la grille des apps sont masquées.",
+  "usageTips.previous": "Astuce précédente",
+  "usageTips.next": "Astuce suivante",
+  "usageTips.tip1.title": "Astuce 1 - Ajouter des tags :",
+  "usageTips.tip1.detail": "Ouvrez Réglages > Tags pour modifier les tags.",
+  "usageTips.tip2.title": "Astuce 2 - Taguer des apps :",
+  "usageTips.tip2.detail": "Appuyez longuement sur une icône pour la faire glisser > déposez-la sur un tag pour l’assigner.",
+  "usageTips.tip3.title": "Astuce 3 - Déplacer des apps :",
+  "usageTips.tip3.detail": "Appuyez longuement sur une icône pour la faire glisser > déposez-la directement dans un conteneur pour la déplacer.",
+  "usageTips.tip4.title": "Astuce 4 - Copier des apps :",
+  "usageTips.tip4.detail": "Appuyez longuement sur une icône pour la faire glisser > maintenez Alt/Option et déposez-la dans un conteneur pour la copier.",
+  "usageTips.tip5.title": "Astuce 5 - Retirer des tags :",
+  "usageTips.tip5.detail": "Appuyez longuement sur une icône pour la faire glisser > déposez-la dans l’espace vide entre les conteneurs.",
+  "usageTips.tip6.title": "Astuce 6 - Trier les tags :",
+  "usageTips.tip6.detail": "Appuyez longuement sur un tag pour le faire glisser > déposez-le à la position voulue.",
+  "usageTips.tip7.title": "Astuce 7 - Trier les apps :",
+  "usageTips.tip7.detail": "Appuyez longuement sur une icône pour la faire glisser > déposez-la à la position voulue dans le conteneur.",
+  "usageTips.tip8.title": "Astuce 8 - Modifier les notes :",
+  "usageTips.tip8.detail": "Cliquez avec le bouton droit sur une app > saisissez une note."
 }
diff --git a/src/Apptag/Localization/id.json b/src/Apptag/Localization/id.json
index 3288d8d..7bd0fed 100644
--- a/src/Apptag/Localization/id.json
+++ b/src/Apptag/Localization/id.json
@@ -207,5 +207,25 @@
   "help.copyLink": "Copy Help PDF link",
   "help.currentLanguage": "Opens the online PDF for the current app language.",
   "settings.language.auto": "Otomatis",
-  "help.downloadPDF": "Unduh PDF bantuan"
+  "help.downloadPDF": "Unduh PDF bantuan",
+  "settings.hideUsageTips": "Sembunyikan tips penggunaan",
+  "settings.hideUsageTipsDesc": "Jika aktif, tips mengambang di bagian bawah grid app akan disembunyikan.",
+  "usageTips.previous": "Tips sebelumnya",
+  "usageTips.next": "Tips berikutnya",
+  "usageTips.tip1.title": "Tips 1 - Tambah tag:",
+  "usageTips.tip1.detail": "Buka Pengaturan > Tag untuk mengedit tag.",
+  "usageTips.tip2.title": "Tips 2 - Beri tag app:",
+  "usageTips.tip2.detail": "Tekan lama ikon app untuk mulai menyeret > jatuhkan ke tag untuk menetapkan tag itu.",
+  "usageTips.tip3.title": "Tips 3 - Pindahkan app:",
+  "usageTips.tip3.detail": "Tekan lama ikon app untuk mulai menyeret > jatuhkan langsung ke kontainer untuk memindahkannya.",
+  "usageTips.tip4.title": "Tips 4 - Salin app:",
+  "usageTips.tip4.detail": "Tekan lama ikon app untuk mulai menyeret > tahan Alt/Option dan jatuhkan ke kontainer untuk menyalinnya.",
+  "usageTips.tip5.title": "Tips 5 - Hapus tag:",
+  "usageTips.tip5.detail": "Tekan lama ikon app untuk mulai menyeret > jatuhkan ke area kosong di antara kontainer.",
+  "usageTips.tip6.title": "Tips 6 - Urutkan tag:",
+  "usageTips.tip6.detail": "Tekan lama tag untuk mulai menyeret > pindahkan ke posisi target lalu lepaskan.",
+  "usageTips.tip7.title": "Tips 7 - Urutkan app:",
+  "usageTips.tip7.detail": "Tekan lama ikon app untuk mulai menyeret > pindahkan ke posisi target di dalam kontainer lalu lepaskan.",
+  "usageTips.tip8.title": "Tips 8 - Edit catatan:",
+  "usageTips.tip8.detail": "Klik kanan app > masukkan catatan."
 }
diff --git a/src/Apptag/Localization/it.json b/src/Apptag/Localization/it.json
index 249a0a8..be035df 100644
--- a/src/Apptag/Localization/it.json
+++ b/src/Apptag/Localization/it.json
@@ -207,5 +207,25 @@
   "help.copyLink": "Copia link del PDF di aiuto",
   "help.currentLanguage": "Apre il PDF online per la lingua attuale dell’app.",
   "settings.language.auto": "Automatico",
-  "help.downloadPDF": "Scarica PDF di aiuto"
+  "help.downloadPDF": "Scarica PDF di aiuto",
+  "settings.hideUsageTips": "Nascondi suggerimenti",
+  "settings.hideUsageTipsDesc": "Se attivo, i suggerimenti flottanti in basso nella griglia delle app vengono nascosti.",
+  "usageTips.previous": "Suggerimento precedente",
+  "usageTips.next": "Suggerimento successivo",
+  "usageTips.tip1.title": "Suggerimento 1 - Aggiungere tag:",
+  "usageTips.tip1.detail": "Apri Impostazioni > Tag per modificare i tag.",
+  "usageTips.tip2.title": "Suggerimento 2 - Taggare app:",
+  "usageTips.tip2.detail": "Tieni premuta un’icona app per trascinarla > rilasciala su un tag per assegnarlo.",
+  "usageTips.tip3.title": "Suggerimento 3 - Spostare app:",
+  "usageTips.tip3.detail": "Tieni premuta un’icona app per trascinarla > rilasciala direttamente in un contenitore per spostarla.",
+  "usageTips.tip4.title": "Suggerimento 4 - Copiare app:",
+  "usageTips.tip4.detail": "Tieni premuta un’icona app per trascinarla > tieni premuto Alt/Opzione e rilasciala in un contenitore per copiarla.",
+  "usageTips.tip5.title": "Suggerimento 5 - Rimuovere tag:",
+  "usageTips.tip5.detail": "Tieni premuta un’icona app per trascinarla > rilasciala nello spazio vuoto tra i contenitori.",
+  "usageTips.tip6.title": "Suggerimento 6 - Riordinare tag:",
+  "usageTips.tip6.detail": "Tieni premuto un tag per trascinarlo > spostalo nella posizione desiderata e rilascialo.",
+  "usageTips.tip7.title": "Suggerimento 7 - Riordinare app:",
+  "usageTips.tip7.detail": "Tieni premuta un’icona app per trascinarla > spostala nella posizione desiderata nel contenitore e rilasciala.",
+  "usageTips.tip8.title": "Suggerimento 8 - Modificare note:",
+  "usageTips.tip8.detail": "Fai clic destro su un’app > inserisci una nota."
 }
diff --git a/src/Apptag/Localization/ja.json b/src/Apptag/Localization/ja.json
index 3ee247c..7d79df7 100644
--- a/src/Apptag/Localization/ja.json
+++ b/src/Apptag/Localization/ja.json
@@ -207,5 +207,25 @@
   "help.copyLink": "ヘルプPDFのリンクをコピー",
   "help.currentLanguage": "現在のアプリ言語に対応するオンラインPDFを開きます。",
   "settings.language.auto": "自動",
-  "help.downloadPDF": "ヘルプPDFをダウンロード"
+  "help.downloadPDF": "ヘルプPDFをダウンロード",
+  "settings.hideUsageTips": "使い方のヒントを非表示",
+  "settings.hideUsageTipsDesc": "オンにすると、アプリグリッド下部のフローティングヒントを表示しません。",
+  "usageTips.previous": "前のヒント",
+  "usageTips.next": "次のヒント",
+  "usageTips.tip1.title": "ヒント1 - タグを追加:",
+  "usageTips.tip1.detail": "設定 > タグを開くとタグを編集できます。",
+  "usageTips.tip2.title": "ヒント2 - アプリにタグ付け:",
+  "usageTips.tip2.detail": "アプリアイコンを長押ししてドラッグを開始 > タグの上にドロップするとタグを割り当てます。",
+  "usageTips.tip3.title": "ヒント3 - アプリを移動:",
+  "usageTips.tip3.detail": "アプリアイコンを長押ししてドラッグを開始 > コンテナへ直接ドロップすると移動します。",
+  "usageTips.tip4.title": "ヒント4 - アプリをコピー:",
+  "usageTips.tip4.detail": "アプリアイコンを長押ししてドラッグを開始 > Alt/Option を押しながらコンテナへドロップするとコピーします。",
+  "usageTips.tip5.title": "ヒント5 - タグを解除:",
+  "usageTips.tip5.detail": "アプリアイコンを長押ししてドラッグを開始 > コンテナ間の空白へドロップします。",
+  "usageTips.tip6.title": "ヒント6 - タグを並べ替え:",
+  "usageTips.tip6.detail": "タグを長押ししてドラッグを開始 > 目的の位置へ移動して放します。",
+  "usageTips.tip7.title": "ヒント7 - アプリを並べ替え:",
+  "usageTips.tip7.detail": "アプリアイコンを長押ししてドラッグを開始 > コンテナ内の目的の位置へ移動して放します。",
+  "usageTips.tip8.title": "ヒント8 - メモを編集:",
+  "usageTips.tip8.detail": "アプリを右クリック > メモを入力します。"
 }
diff --git a/src/Apptag/Localization/ko.json b/src/Apptag/Localization/ko.json
index 5423c60..0be5c3d 100644
--- a/src/Apptag/Localization/ko.json
+++ b/src/Apptag/Localization/ko.json
@@ -207,5 +207,25 @@
   "help.copyLink": "도움말 PDF 링크 복사",
   "help.currentLanguage": "현재 앱 언어에 맞는 온라인 PDF를 엽니다.",
   "settings.language.auto": "자동",
-  "help.downloadPDF": "도움말 PDF 다운로드"
+  "help.downloadPDF": "도움말 PDF 다운로드",
+  "settings.hideUsageTips": "사용 팁 숨기기",
+  "settings.hideUsageTipsDesc": "켜면 앱 그리드 하단의 플로팅 사용 팁이 표시되지 않습니다.",
+  "usageTips.previous": "이전 팁",
+  "usageTips.next": "다음 팁",
+  "usageTips.tip1.title": "팁 1 - 태그 추가:",
+  "usageTips.tip1.detail": "설정 > 태그를 열어 태그를 편집하세요.",
+  "usageTips.tip2.title": "팁 2 - 앱에 태그 지정:",
+  "usageTips.tip2.detail": "앱 아이콘을 길게 눌러 드래그 시작 > 태그 위에 놓으면 태그가 지정됩니다.",
+  "usageTips.tip3.title": "팁 3 - 앱 이동:",
+  "usageTips.tip3.detail": "앱 아이콘을 길게 눌러 드래그 시작 > 컨테이너에 바로 놓으면 이동됩니다.",
+  "usageTips.tip4.title": "팁 4 - 앱 복사:",
+  "usageTips.tip4.detail": "앱 아이콘을 길게 눌러 드래그 시작 > Alt/Option을 누른 채 컨테이너에 놓으면 복사됩니다.",
+  "usageTips.tip5.title": "팁 5 - 태그 제거:",
+  "usageTips.tip5.detail": "앱 아이콘을 길게 눌러 드래그 시작 > 컨테이너 사이의 빈 공간에 놓으세요.",
+  "usageTips.tip6.title": "팁 6 - 태그 정렬:",
+  "usageTips.tip6.detail": "태그를 길게 눌러 드래그 시작 > 원하는 위치로 이동한 뒤 놓으세요.",
+  "usageTips.tip7.title": "팁 7 - 앱 정렬:",
+  "usageTips.tip7.detail": "앱 아이콘을 길게 눌러 드래그 시작 > 컨테이너 안의 원하는 위치로 이동한 뒤 놓으세요.",
+  "usageTips.tip8.title": "팁 8 - 메모 편집:",
+  "usageTips.tip8.detail": "앱을 오른쪽 클릭 > 메모를 입력하세요."
 }
diff --git a/src/Apptag/Localization/ms.json b/src/Apptag/Localization/ms.json
index c20dd39..f883b3a 100644
--- a/src/Apptag/Localization/ms.json
+++ b/src/Apptag/Localization/ms.json
@@ -207,5 +207,25 @@
   "help.copyLink": "Copy Help PDF link",
   "help.currentLanguage": "Opens the online PDF for the current app language.",
   "settings.language.auto": "Automatik",
-  "help.downloadPDF": "Muat turun PDF bantuan"
+  "help.downloadPDF": "Muat turun PDF bantuan",
+  "settings.hideUsageTips": "Sembunyikan petua penggunaan",
+  "settings.hideUsageTipsDesc": "Apabila dihidupkan, petua terapung di bahagian bawah grid app akan disembunyikan.",
+  "usageTips.previous": "Petua sebelumnya",
+  "usageTips.next": "Petua seterusnya",
+  "usageTips.tip1.title": "Petua 1 - Tambah tag:",
+  "usageTips.tip1.detail": "Buka Tetapan > Tag untuk mengedit tag.",
+  "usageTips.tip2.title": "Petua 2 - Tag app:",
+  "usageTips.tip2.detail": "Tekan lama ikon app untuk mula menyeret > lepaskan pada tag untuk menetapkan tag itu.",
+  "usageTips.tip3.title": "Petua 3 - Alih app:",
+  "usageTips.tip3.detail": "Tekan lama ikon app untuk mula menyeret > lepaskan terus ke dalam bekas untuk mengalihkannya.",
+  "usageTips.tip4.title": "Petua 4 - Salin app:",
+  "usageTips.tip4.detail": "Tekan lama ikon app untuk mula menyeret > tahan Alt/Option dan lepaskan ke dalam bekas untuk menyalinnya.",
+  "usageTips.tip5.title": "Petua 5 - Buang tag:",
+  "usageTips.tip5.detail": "Tekan lama ikon app untuk mula menyeret > lepaskan ke ruang kosong antara bekas.",
+  "usageTips.tip6.title": "Petua 6 - Susun tag:",
+  "usageTips.tip6.detail": "Tekan lama tag untuk mula menyeret > alih ke posisi sasaran dan lepaskan.",
+  "usageTips.tip7.title": "Petua 7 - Susun app:",
+  "usageTips.tip7.detail": "Tekan lama ikon app untuk mula menyeret > alih ke posisi sasaran dalam bekas dan lepaskan.",
+  "usageTips.tip8.title": "Petua 8 - Edit nota:",
+  "usageTips.tip8.detail": "Klik kanan app > masukkan nota."
 }
diff --git a/src/Apptag/Localization/nb.json b/src/Apptag/Localization/nb.json
index e0d8edd..574082e 100644
--- a/src/Apptag/Localization/nb.json
+++ b/src/Apptag/Localization/nb.json
@@ -207,5 +207,25 @@
   "help.copyLink": "Copy Help PDF link",
   "help.currentLanguage": "Opens the online PDF for the current app language.",
   "settings.language.auto": "Automatisk",
-  "help.downloadPDF": "Last ned hjelp-PDF"
+  "help.downloadPDF": "Last ned hjelp-PDF",
+  "settings.hideUsageTips": "Skjul brukstips",
+  "settings.hideUsageTipsDesc": "Når dette er slått på, skjules de flytende tipsene nederst i app-rutenettet.",
+  "usageTips.previous": "Forrige tips",
+  "usageTips.next": "Neste tips",
+  "usageTips.tip1.title": "Tips 1 - Legg til tagger:",
+  "usageTips.tip1.detail": "Åpne Innstillinger > Tagger for å redigere tagger.",
+  "usageTips.tip2.title": "Tips 2 - Tagg apper:",
+  "usageTips.tip2.detail": "Hold inne et appikon for å begynne å dra > slipp det på en tagg for å tildele taggen.",
+  "usageTips.tip3.title": "Tips 3 - Flytt apper:",
+  "usageTips.tip3.detail": "Hold inne et appikon for å begynne å dra > slipp det direkte i en beholder for å flytte det.",
+  "usageTips.tip4.title": "Tips 4 - Kopier apper:",
+  "usageTips.tip4.detail": "Hold inne et appikon for å begynne å dra > hold Alt/Option og slipp det i en beholder for å kopiere det.",
+  "usageTips.tip5.title": "Tips 5 - Fjern tagger:",
+  "usageTips.tip5.detail": "Hold inne et appikon for å begynne å dra > slipp det i det tomme området mellom beholdere.",
+  "usageTips.tip6.title": "Tips 6 - Sorter tagger:",
+  "usageTips.tip6.detail": "Hold inne en tagg for å begynne å dra > flytt den til målposisjonen og slipp.",
+  "usageTips.tip7.title": "Tips 7 - Sorter apper:",
+  "usageTips.tip7.detail": "Hold inne et appikon for å begynne å dra > flytt det til målposisjonen i beholderen og slipp.",
+  "usageTips.tip8.title": "Tips 8 - Rediger notater:",
+  "usageTips.tip8.detail": "Høyreklikk på en app > skriv inn et notat."
 }
diff --git a/src/Apptag/Localization/nl.json b/src/Apptag/Localization/nl.json
index ef4971a..86eb5b1 100644
--- a/src/Apptag/Localization/nl.json
+++ b/src/Apptag/Localization/nl.json
@@ -207,5 +207,25 @@
   "help.copyLink": "Copy Help PDF link",
   "help.currentLanguage": "Opens the online PDF for the current app language.",
   "settings.language.auto": "Automatisch",
-  "help.downloadPDF": "Help-PDF downloaden"
+  "help.downloadPDF": "Help-PDF downloaden",
+  "settings.hideUsageTips": "Gebruikstips verbergen",
+  "settings.hideUsageTipsDesc": "Als dit is ingeschakeld, worden de zwevende tips onderaan het app-raster verborgen.",
+  "usageTips.previous": "Vorige tip",
+  "usageTips.next": "Volgende tip",
+  "usageTips.tip1.title": "Tip 1 - Tags toevoegen:",
+  "usageTips.tip1.detail": "Open Instellingen > Tags om tags te bewerken.",
+  "usageTips.tip2.title": "Tip 2 - Apps taggen:",
+  "usageTips.tip2.detail": "Houd een app-icoon ingedrukt om te slepen > sleep het naar een tag om die tag toe te wijzen.",
+  "usageTips.tip3.title": "Tip 3 - Apps verplaatsen:",
+  "usageTips.tip3.detail": "Houd een app-icoon ingedrukt om te slepen > sleep het direct naar een container om het te verplaatsen.",
+  "usageTips.tip4.title": "Tip 4 - Apps kopiëren:",
+  "usageTips.tip4.detail": "Houd een app-icoon ingedrukt om te slepen > houd Alt/Option ingedrukt en sleep het naar een container om te kopiëren.",
+  "usageTips.tip5.title": "Tip 5 - Tags verwijderen:",
+  "usageTips.tip5.detail": "Houd een app-icoon ingedrukt om te slepen > sleep het naar de lege ruimte tussen containers.",
+  "usageTips.tip6.title": "Tip 6 - Tags sorteren:",
+  "usageTips.tip6.detail": "Houd een tag ingedrukt om te slepen > sleep hem naar de doelpositie en laat los.",
+  "usageTips.tip7.title": "Tip 7 - Apps sorteren:",
+  "usageTips.tip7.detail": "Houd een app-icoon ingedrukt om te slepen > sleep het naar de doelpositie in de container en laat los.",
+  "usageTips.tip8.title": "Tip 8 - Notities bewerken:",
+  "usageTips.tip8.detail": "Klik met rechts op een app > voer een notitie in."
 }
diff --git a/src/Apptag/Localization/nn.json b/src/Apptag/Localization/nn.json
index 2744c86..5c15a8c 100644
--- a/src/Apptag/Localization/nn.json
+++ b/src/Apptag/Localization/nn.json
@@ -207,5 +207,25 @@
   "help.copyLink": "Copy Help PDF link",
   "help.currentLanguage": "Opens the online PDF for the current app language.",
   "settings.language.auto": "Automatisk",
-  "help.downloadPDF": "Last ned hjelp-PDF"
+  "help.downloadPDF": "Last ned hjelp-PDF",
+  "settings.hideUsageTips": "Gøym brukstips",
+  "settings.hideUsageTipsDesc": "Når dette er slått på, vert dei flytande tipsa nedst i apprutenettet gøymde.",
+  "usageTips.previous": "Forrige tips",
+  "usageTips.next": "Neste tips",
+  "usageTips.tip1.title": "Tips 1 - Legg til tagger:",
+  "usageTips.tip1.detail": "Opna Innstillingar > Taggar for å redigera taggar.",
+  "usageTips.tip2.title": "Tips 2 - Tagg apper:",
+  "usageTips.tip2.detail": "Hold inne et appikon for å begynne å dra > slipp det på en tagg for å tildele taggen.",
+  "usageTips.tip3.title": "Tips 3 - Flytt apper:",
+  "usageTips.tip3.detail": "Hold inne et appikon for å begynne å dra > slipp det direkte i en beholder for å flytte det.",
+  "usageTips.tip4.title": "Tips 4 - Kopier apper:",
+  "usageTips.tip4.detail": "Hold inne et appikon for å begynne å dra > hold Alt/Option og slipp det i en beholder for å kopiere det.",
+  "usageTips.tip5.title": "Tips 5 - Fjern tagger:",
+  "usageTips.tip5.detail": "Hold inne et appikon for å begynne å dra > slipp det i det tomme området mellom beholdere.",
+  "usageTips.tip6.title": "Tips 6 - Sorter tagger:",
+  "usageTips.tip6.detail": "Hold inne en tagg for å begynne å dra > flytt den til målposisjonen og slipp.",
+  "usageTips.tip7.title": "Tips 7 - Sorter apper:",
+  "usageTips.tip7.detail": "Hold inne et appikon for å begynne å dra > flytt det til målposisjonen i beholderen og slipp.",
+  "usageTips.tip8.title": "Tips 8 - Rediger notater:",
+  "usageTips.tip8.detail": "Høgreklikk på ein app > skriv inn eit notat."
 }
diff --git a/src/Apptag/Localization/no.json b/src/Apptag/Localization/no.json
index e0d8edd..574082e 100644
--- a/src/Apptag/Localization/no.json
+++ b/src/Apptag/Localization/no.json
@@ -207,5 +207,25 @@
   "help.copyLink": "Copy Help PDF link",
   "help.currentLanguage": "Opens the online PDF for the current app language.",
   "settings.language.auto": "Automatisk",
-  "help.downloadPDF": "Last ned hjelp-PDF"
+  "help.downloadPDF": "Last ned hjelp-PDF",
+  "settings.hideUsageTips": "Skjul brukstips",
+  "settings.hideUsageTipsDesc": "Når dette er slått på, skjules de flytende tipsene nederst i app-rutenettet.",
+  "usageTips.previous": "Forrige tips",
+  "usageTips.next": "Neste tips",
+  "usageTips.tip1.title": "Tips 1 - Legg til tagger:",
+  "usageTips.tip1.detail": "Åpne Innstillinger > Tagger for å redigere tagger.",
+  "usageTips.tip2.title": "Tips 2 - Tagg apper:",
+  "usageTips.tip2.detail": "Hold inne et appikon for å begynne å dra > slipp det på en tagg for å tildele taggen.",
+  "usageTips.tip3.title": "Tips 3 - Flytt apper:",
+  "usageTips.tip3.detail": "Hold inne et appikon for å begynne å dra > slipp det direkte i en beholder for å flytte det.",
+  "usageTips.tip4.title": "Tips 4 - Kopier apper:",
+  "usageTips.tip4.detail": "Hold inne et appikon for å begynne å dra > hold Alt/Option og slipp det i en beholder for å kopiere det.",
+  "usageTips.tip5.title": "Tips 5 - Fjern tagger:",
+  "usageTips.tip5.detail": "Hold inne et appikon for å begynne å dra > slipp det i det tomme området mellom beholdere.",
+  "usageTips.tip6.title": "Tips 6 - Sorter tagger:",
+  "usageTips.tip6.detail": "Hold inne en tagg for å begynne å dra > flytt den til målposisjonen og slipp.",
+  "usageTips.tip7.title": "Tips 7 - Sorter apper:",
+  "usageTips.tip7.detail": "Hold inne et appikon for å begynne å dra > flytt det til målposisjonen i beholderen og slipp.",
+  "usageTips.tip8.title": "Tips 8 - Rediger notater:",
+  "usageTips.tip8.detail": "Høyreklikk på en app > skriv inn et notat."
 }
diff --git a/src/Apptag/Localization/pl.json b/src/Apptag/Localization/pl.json
index 1ced486..7786e34 100644
--- a/src/Apptag/Localization/pl.json
+++ b/src/Apptag/Localization/pl.json
@@ -207,5 +207,25 @@
   "help.copyLink": "Copy Help PDF link",
   "help.currentLanguage": "Opens the online PDF for the current app language.",
   "settings.language.auto": "Automatycznie",
-  "help.downloadPDF": "Pobierz PDF pomocy"
+  "help.downloadPDF": "Pobierz PDF pomocy",
+  "settings.hideUsageTips": "Ukryj wskazówki",
+  "settings.hideUsageTipsDesc": "Po włączeniu pływające wskazówki u dołu siatki aplikacji będą ukryte.",
+  "usageTips.previous": "Poprzednia wskazówka",
+  "usageTips.next": "Następna wskazówka",
+  "usageTips.tip1.title": "Wskazówka 1 - Dodaj tagi:",
+  "usageTips.tip1.detail": "Otwórz Ustawienia > Tagi, aby edytować tagi.",
+  "usageTips.tip2.title": "Wskazówka 2 - Otaguj aplikacje:",
+  "usageTips.tip2.detail": "Przytrzymaj ikonę aplikacji, aby zacząć przeciągać > upuść ją na tagu, aby go przypisać.",
+  "usageTips.tip3.title": "Wskazówka 3 - Przenieś aplikacje:",
+  "usageTips.tip3.detail": "Przytrzymaj ikonę aplikacji, aby zacząć przeciągać > upuść ją bezpośrednio w kontenerze, aby przenieść.",
+  "usageTips.tip4.title": "Wskazówka 4 - Skopiuj aplikacje:",
+  "usageTips.tip4.detail": "Przytrzymaj ikonę aplikacji, aby zacząć przeciągać > przytrzymaj Alt/Option i upuść w kontenerze, aby skopiować.",
+  "usageTips.tip5.title": "Wskazówka 5 - Usuń tagi:",
+  "usageTips.tip5.detail": "Przytrzymaj ikonę aplikacji, aby zacząć przeciągać > upuść ją w pustym miejscu między kontenerami.",
+  "usageTips.tip6.title": "Wskazówka 6 - Sortuj tagi:",
+  "usageTips.tip6.detail": "Przytrzymaj tag, aby zacząć przeciągać > przenieś go w docelowe miejsce i puść.",
+  "usageTips.tip7.title": "Wskazówka 7 - Sortuj aplikacje:",
+  "usageTips.tip7.detail": "Przytrzymaj ikonę aplikacji, aby zacząć przeciągać > przenieś ją w docelowe miejsce w kontenerze i puść.",
+  "usageTips.tip8.title": "Wskazówka 8 - Edytuj notatki:",
+  "usageTips.tip8.detail": "Kliknij aplikację prawym przyciskiem > wpisz notatkę."
 }
diff --git a/src/Apptag/Localization/pt-BR.json b/src/Apptag/Localization/pt-BR.json
index 4ffef6a..4bc3455 100644
--- a/src/Apptag/Localization/pt-BR.json
+++ b/src/Apptag/Localization/pt-BR.json
@@ -207,5 +207,25 @@
   "help.copyLink": "Copy Help PDF link",
   "help.currentLanguage": "Opens the online PDF for the current app language.",
   "settings.language.auto": "Automático",
-  "help.downloadPDF": "Baixar PDF de ajuda"
+  "help.downloadPDF": "Baixar PDF de ajuda",
+  "settings.hideUsageTips": "Ocultar dicas de uso",
+  "settings.hideUsageTipsDesc": "Quando ativado, as dicas flutuantes na parte inferior da grade de apps ficam ocultas.",
+  "usageTips.previous": "Dica anterior",
+  "usageTips.next": "Próxima dica",
+  "usageTips.tip1.title": "Dica 1 - Adicionar tags:",
+  "usageTips.tip1.detail": "Abra Ajustes > Tags para editar tags.",
+  "usageTips.tip2.title": "Dica 2 - Marcar apps:",
+  "usageTips.tip2.detail": "Pressione e segure o ícone de um app para arrastar > solte sobre uma tag para atribuí-la.",
+  "usageTips.tip3.title": "Dica 3 - Mover apps:",
+  "usageTips.tip3.detail": "Pressione e segure o ícone de um app para arrastar > solte diretamente em um contêiner para mover.",
+  "usageTips.tip4.title": "Dica 4 - Copiar apps:",
+  "usageTips.tip4.detail": "Pressione e segure o ícone de um app para arrastar > segure Alt/Option e solte em um contêiner para copiar.",
+  "usageTips.tip5.title": "Dica 5 - Remover tags:",
+  "usageTips.tip5.detail": "Pressione e segure o ícone de um app para arrastar > solte no espaço vazio entre contêineres.",
+  "usageTips.tip6.title": "Dica 6 - Reordenar tags:",
+  "usageTips.tip6.detail": "Pressione e segure uma tag para arrastar > mova até a posição desejada e solte.",
+  "usageTips.tip7.title": "Dica 7 - Reordenar apps:",
+  "usageTips.tip7.detail": "Pressione e segure o ícone de um app para arrastar > mova até a posição desejada dentro do contêiner e solte.",
+  "usageTips.tip8.title": "Dica 8 - Editar notas:",
+  "usageTips.tip8.detail": "Clique com o botão direito em um app > digite uma nota."
 }
diff --git a/src/Apptag/Localization/ro.json b/src/Apptag/Localization/ro.json
index b5a4228..7f29444 100644
--- a/src/Apptag/Localization/ro.json
+++ b/src/Apptag/Localization/ro.json
@@ -207,5 +207,25 @@
   "help.copyLink": "Copy Help PDF link",
   "help.currentLanguage": "Opens the online PDF for the current app language.",
   "settings.language.auto": "Automat",
-  "help.downloadPDF": "Descarcă PDF-ul de ajutor"
+  "help.downloadPDF": "Descarcă PDF-ul de ajutor",
+  "settings.hideUsageTips": "Ascunde sfaturile de utilizare",
+  "settings.hideUsageTipsDesc": "Când este activat, sfaturile plutitoare din partea de jos a grilei de aplicații sunt ascunse.",
+  "usageTips.previous": "Sfatul anterior",
+  "usageTips.next": "Sfatul următor",
+  "usageTips.tip1.title": "Sfat 1 - Adaugă etichete:",
+  "usageTips.tip1.detail": "Deschide Setări > Etichete pentru a edita etichetele.",
+  "usageTips.tip2.title": "Sfat 2 - Etichetează aplicații:",
+  "usageTips.tip2.detail": "Ține apăsată pictograma unei aplicații pentru a începe tragerea > plaseaz-o pe o etichetă pentru a o atribui.",
+  "usageTips.tip3.title": "Sfat 3 - Mută aplicații:",
+  "usageTips.tip3.detail": "Ține apăsată pictograma unei aplicații pentru a începe tragerea > plaseaz-o direct într-un container pentru a o muta.",
+  "usageTips.tip4.title": "Sfat 4 - Copiază aplicații:",
+  "usageTips.tip4.detail": "Ține apăsată pictograma unei aplicații pentru a începe tragerea > ține Alt/Option și plaseaz-o într-un container pentru a o copia.",
+  "usageTips.tip5.title": "Sfat 5 - Elimină etichete:",
+  "usageTips.tip5.detail": "Ține apăsată pictograma unei aplicații pentru a începe tragerea > plaseaz-o în spațiul gol dintre containere.",
+  "usageTips.tip6.title": "Sfat 6 - Reordonează etichete:",
+  "usageTips.tip6.detail": "Ține apăsată o etichetă pentru a începe tragerea > mut-o în poziția dorită și eliberează.",
+  "usageTips.tip7.title": "Sfat 7 - Reordonează aplicații:",
+  "usageTips.tip7.detail": "Ține apăsată pictograma unei aplicații pentru a începe tragerea > mut-o în poziția dorită din container și eliberează.",
+  "usageTips.tip8.title": "Sfat 8 - Editează notițe:",
+  "usageTips.tip8.detail": "Click dreapta pe o aplicație > introdu o notiță."
 }
diff --git a/src/Apptag/Localization/ru.json b/src/Apptag/Localization/ru.json
index 811de8a..62a4578 100644
--- a/src/Apptag/Localization/ru.json
+++ b/src/Apptag/Localization/ru.json
@@ -207,5 +207,25 @@
   "help.copyLink": "Скопировать ссылку на PDF справки",
   "help.currentLanguage": "Открывает онлайн-PDF для текущего языка приложения.",
   "settings.language.auto": "Автоматически",
-  "help.downloadPDF": "Скачать PDF справки"
+  "help.downloadPDF": "Скачать PDF справки",
+  "settings.hideUsageTips": "Скрыть советы",
+  "settings.hideUsageTipsDesc": "Если включено, плавающие советы внизу сетки приложений будут скрыты.",
+  "usageTips.previous": "Предыдущий совет",
+  "usageTips.next": "Следующий совет",
+  "usageTips.tip1.title": "Совет 1 — Добавить теги:",
+  "usageTips.tip1.detail": "Откройте Настройки > Теги, чтобы редактировать теги.",
+  "usageTips.tip2.title": "Совет 2 — Назначить теги:",
+  "usageTips.tip2.detail": "Удерживайте значок приложения, чтобы начать перетаскивание > перетащите его на тег, чтобы назначить тег.",
+  "usageTips.tip3.title": "Совет 3 — Переместить приложения:",
+  "usageTips.tip3.detail": "Удерживайте значок приложения, чтобы начать перетаскивание > перетащите его прямо в контейнер для перемещения.",
+  "usageTips.tip4.title": "Совет 4 — Скопировать приложения:",
+  "usageTips.tip4.detail": "Удерживайте значок приложения, чтобы начать перетаскивание > удерживайте Alt/Option и перетащите в контейнер для копирования.",
+  "usageTips.tip5.title": "Совет 5 — Удалить теги:",
+  "usageTips.tip5.detail": "Удерживайте значок приложения, чтобы начать перетаскивание > перетащите его в пустое место между контейнерами.",
+  "usageTips.tip6.title": "Совет 6 — Упорядочить теги:",
+  "usageTips.tip6.detail": "Удерживайте тег, чтобы начать перетаскивание > переместите его в нужное место и отпустите.",
+  "usageTips.tip7.title": "Совет 7 — Упорядочить приложения:",
+  "usageTips.tip7.detail": "Удерживайте значок приложения, чтобы начать перетаскивание > переместите его в нужное место внутри контейнера и отпустите.",
+  "usageTips.tip8.title": "Совет 8 — Редактировать заметки:",
+  "usageTips.tip8.detail": "Щелкните приложение правой кнопкой > введите заметку."
 }
diff --git a/src/Apptag/Localization/sr-Cyrl.json b/src/Apptag/Localization/sr-Cyrl.json
index d372d86..a8e5391 100644
--- a/src/Apptag/Localization/sr-Cyrl.json
+++ b/src/Apptag/Localization/sr-Cyrl.json
@@ -207,5 +207,25 @@
   "help.copyLink": "Copy Help PDF link",
   "help.currentLanguage": "Opens the online PDF for the current app language.",
   "settings.language.auto": "Аутоматски",
-  "help.downloadPDF": "Преузми PDF помоћи"
+  "help.downloadPDF": "Преузми PDF помоћи",
+  "settings.hideUsageTips": "Сакриј савете за коришћење",
+  "settings.hideUsageTipsDesc": "Када је укључено, плутајући савети на дну мреже апликација су сакривени.",
+  "usageTips.previous": "Претходни савет",
+  "usageTips.next": "Следећи савет",
+  "usageTips.tip1.title": "Савет 1 - Додај ознаке:",
+  "usageTips.tip1.detail": "Отворите Подешавања > Ознаке да уредите ознаке.",
+  "usageTips.tip2.title": "Савет 2 - Означи апликације:",
+  "usageTips.tip2.detail": "Дуго притисните икону апликације да почнете превлачење > превуците је на ознаку да је доделите.",
+  "usageTips.tip3.title": "Савет 3 - Премести апликације:",
+  "usageTips.tip3.detail": "Дуго притисните икону апликације да почнете превлачење > превуците је директно у контејнер да је преместите.",
+  "usageTips.tip4.title": "Савет 4 - Копирај апликације:",
+  "usageTips.tip4.detail": "Дуго притисните икону апликације да почнете превлачење > држите Alt/Option и превуците је у контејнер да је копирате.",
+  "usageTips.tip5.title": "Савет 5 - Уклони ознаке:",
+  "usageTips.tip5.detail": "Дуго притисните икону апликације да почнете превлачење > превуците је у празан простор између контејнера.",
+  "usageTips.tip6.title": "Савет 6 - Поређај ознаке:",
+  "usageTips.tip6.detail": "Дуго притисните ознаку да почнете превлачење > преместите је на жељено место и пустите.",
+  "usageTips.tip7.title": "Савет 7 - Поређај апликације:",
+  "usageTips.tip7.detail": "Дуго притисните икону апликације да почнете превлачење > преместите је на жељено место у контејнеру и пустите.",
+  "usageTips.tip8.title": "Савет 8 - Уреди белешке:",
+  "usageTips.tip8.detail": "Кликните десним тастером на апликацију > унесите белешку."
 }
diff --git a/src/Apptag/Localization/sv.json b/src/Apptag/Localization/sv.json
index ea48a56..c68ef7d 100644
--- a/src/Apptag/Localization/sv.json
+++ b/src/Apptag/Localization/sv.json
@@ -207,5 +207,25 @@
   "help.copyLink": "Copy Help PDF link",
   "help.currentLanguage": "Opens the online PDF for the current app language.",
   "settings.language.auto": "Automatiskt",
-  "help.downloadPDF": "Ladda ner hjälp-PDF"
+  "help.downloadPDF": "Ladda ner hjälp-PDF",
+  "settings.hideUsageTips": "Dölj användningstips",
+  "settings.hideUsageTipsDesc": "När detta är aktiverat döljs de flytande tipsen längst ned i apprutnätet.",
+  "usageTips.previous": "Föregående tips",
+  "usageTips.next": "Nästa tips",
+  "usageTips.tip1.title": "Tips 1 - Lägg till taggar:",
+  "usageTips.tip1.detail": "Öppna Inställningar > Taggar för att redigera taggar.",
+  "usageTips.tip2.title": "Tips 2 - Tagga appar:",
+  "usageTips.tip2.detail": "Håll ned en appikon för att börja dra > släpp den på en tagg för att tilldela taggen.",
+  "usageTips.tip3.title": "Tips 3 - Flytta appar:",
+  "usageTips.tip3.detail": "Håll ned en appikon för att börja dra > släpp den direkt i en container för att flytta den.",
+  "usageTips.tip4.title": "Tips 4 - Kopiera appar:",
+  "usageTips.tip4.detail": "Håll ned en appikon för att börja dra > håll Alt/Option och släpp den i en container för att kopiera den.",
+  "usageTips.tip5.title": "Tips 5 - Ta bort taggar:",
+  "usageTips.tip5.detail": "Håll ned en appikon för att börja dra > släpp den i det tomma området mellan containrar.",
+  "usageTips.tip6.title": "Tips 6 - Sortera taggar:",
+  "usageTips.tip6.detail": "Håll ned en tagg för att börja dra > flytta den till målpositionen och släpp.",
+  "usageTips.tip7.title": "Tips 7 - Sortera appar:",
+  "usageTips.tip7.detail": "Håll ned en appikon för att börja dra > flytta den till målpositionen i containern och släpp.",
+  "usageTips.tip8.title": "Tips 8 - Redigera anteckningar:",
+  "usageTips.tip8.detail": "Högerklicka på en app > skriv en anteckning."
 }
diff --git a/src/Apptag/Localization/th.json b/src/Apptag/Localization/th.json
index f9f8fa3..1631971 100644
--- a/src/Apptag/Localization/th.json
+++ b/src/Apptag/Localization/th.json
@@ -207,5 +207,25 @@
   "help.copyLink": "Copy Help PDF link",
   "help.currentLanguage": "Opens the online PDF for the current app language.",
   "settings.language.auto": "อัตโนมัติ",
-  "help.downloadPDF": "ดาวน์โหลด PDF วิธีใช้"
+  "help.downloadPDF": "ดาวน์โหลด PDF วิธีใช้",
+  "settings.hideUsageTips": "ซ่อนเคล็ดลับการใช้งาน",
+  "settings.hideUsageTipsDesc": "เมื่อเปิดใช้ เคล็ดลับแบบลอยที่ด้านล่างของกริดแอปจะถูกซ่อน",
+  "usageTips.previous": "เคล็ดลับก่อนหน้า",
+  "usageTips.next": "เคล็ดลับถัดไป",
+  "usageTips.tip1.title": "เคล็ดลับ 1 - เพิ่มแท็ก:",
+  "usageTips.tip1.detail": "เปิดการตั้งค่า > แท็ก เพื่อแก้ไขแท็ก",
+  "usageTips.tip2.title": "เคล็ดลับ 2 - ติดแท็กแอป:",
+  "usageTips.tip2.detail": "กดไอคอนแอปค้างไว้เพื่อเริ่มลาก > วางบนแท็กเพื่อกำหนดแท็กนั้น",
+  "usageTips.tip3.title": "เคล็ดลับ 3 - ย้ายแอป:",
+  "usageTips.tip3.detail": "กดไอคอนแอปค้างไว้เพื่อเริ่มลาก > วางลงในคอนเทนเนอร์โดยตรงเพื่อย้าย",
+  "usageTips.tip4.title": "เคล็ดลับ 4 - คัดลอกแอป:",
+  "usageTips.tip4.detail": "กดไอคอนแอปค้างไว้เพื่อเริ่มลาก > กด Alt/Option ค้างไว้แล้ววางลงในคอนเทนเนอร์เพื่อคัดลอก",
+  "usageTips.tip5.title": "เคล็ดลับ 5 - ลบแท็ก:",
+  "usageTips.tip5.detail": "กดไอคอนแอปค้างไว้เพื่อเริ่มลาก > วางในพื้นที่ว่างระหว่างคอนเทนเนอร์",
+  "usageTips.tip6.title": "เคล็ดลับ 6 - จัดลำดับแท็ก:",
+  "usageTips.tip6.detail": "กดแท็กค้างไว้เพื่อเริ่มลาก > ลากไปยังตำแหน่งเป้าหมายแล้วปล่อย",
+  "usageTips.tip7.title": "เคล็ดลับ 7 - จัดลำดับแอป:",
+  "usageTips.tip7.detail": "กดไอคอนแอปค้างไว้เพื่อเริ่มลาก > ลากไปยังตำแหน่งเป้าหมายในคอนเทนเนอร์แล้วปล่อย",
+  "usageTips.tip8.title": "เคล็ดลับ 8 - แก้ไขโน้ต:",
+  "usageTips.tip8.detail": "คลิกขวาที่แอป > ป้อนโน้ต"
 }
diff --git a/src/Apptag/Localization/tr.json b/src/Apptag/Localization/tr.json
index 30e5fa2..aa911de 100644
--- a/src/Apptag/Localization/tr.json
+++ b/src/Apptag/Localization/tr.json
@@ -207,5 +207,25 @@
   "help.copyLink": "Copy Help PDF link",
   "help.currentLanguage": "Opens the online PDF for the current app language.",
   "settings.language.auto": "Otomatik",
-  "help.downloadPDF": "Yardım PDF’sini indir"
+  "help.downloadPDF": "Yardım PDF’sini indir",
+  "settings.hideUsageTips": "Kullanım ipuçlarını gizle",
+  "settings.hideUsageTipsDesc": "Etkinleştirildiğinde uygulama ızgarasının altındaki yüzen ipuçları gizlenir.",
+  "usageTips.previous": "Önceki ipucu",
+  "usageTips.next": "Sonraki ipucu",
+  "usageTips.tip1.title": "İpucu 1 - Etiket ekle:",
+  "usageTips.tip1.detail": "Etiketleri düzenlemek için Ayarlar > Etiketler bölümünü açın.",
+  "usageTips.tip2.title": "İpucu 2 - Uygulamaları etiketle:",
+  "usageTips.tip2.detail": "Sürüklemeyi başlatmak için bir uygulama simgesine uzun basın > etiketi atamak için bir etiketin üzerine bırakın.",
+  "usageTips.tip3.title": "İpucu 3 - Uygulamaları taşı:",
+  "usageTips.tip3.detail": "Sürüklemeyi başlatmak için bir uygulama simgesine uzun basın > taşımak için doğrudan bir kapsayıcıya bırakın.",
+  "usageTips.tip4.title": "İpucu 4 - Uygulamaları kopyala:",
+  "usageTips.tip4.detail": "Sürüklemeyi başlatmak için bir uygulama simgesine uzun basın > Alt/Option tuşunu basılı tutup kapsayıcıya bırakarak kopyalayın.",
+  "usageTips.tip5.title": "İpucu 5 - Etiketleri kaldır:",
+  "usageTips.tip5.detail": "Sürüklemeyi başlatmak için bir uygulama simgesine uzun basın > kapsayıcılar arasındaki boş alana bırakın.",
+  "usageTips.tip6.title": "İpucu 6 - Etiketleri sırala:",
+  "usageTips.tip6.detail": "Sürüklemeyi başlatmak için bir etikete uzun basın > hedef konuma taşıyıp bırakın.",
+  "usageTips.tip7.title": "İpucu 7 - Uygulamaları sırala:",
+  "usageTips.tip7.detail": "Sürüklemeyi başlatmak için bir uygulama simgesine uzun basın > kapsayıcı içindeki hedef konuma taşıyıp bırakın.",
+  "usageTips.tip8.title": "İpucu 8 - Notları düzenle:",
+  "usageTips.tip8.detail": "Bir uygulamaya sağ tıklayın > not girin."
 }
diff --git a/src/Apptag/Localization/uk.json b/src/Apptag/Localization/uk.json
index 14190f4..c433649 100644
--- a/src/Apptag/Localization/uk.json
+++ b/src/Apptag/Localization/uk.json
@@ -207,5 +207,25 @@
   "help.copyLink": "Copy Help PDF link",
   "help.currentLanguage": "Opens the online PDF for the current app language.",
   "settings.language.auto": "Автоматично",
-  "help.downloadPDF": "Завантажити PDF довідки"
+  "help.downloadPDF": "Завантажити PDF довідки",
+  "settings.hideUsageTips": "Приховати поради",
+  "settings.hideUsageTipsDesc": "Якщо ввімкнено, плаваючі поради внизу сітки програм буде приховано.",
+  "usageTips.previous": "Попередня порада",
+  "usageTips.next": "Наступна порада",
+  "usageTips.tip1.title": "Порада 1 — Додати теги:",
+  "usageTips.tip1.detail": "Відкрийте Параметри > Теги, щоб редагувати теги.",
+  "usageTips.tip2.title": "Порада 2 — Позначити програми:",
+  "usageTips.tip2.detail": "Утримуйте іконку програми, щоб почати перетягування > перетягніть її на тег, щоб призначити тег.",
+  "usageTips.tip3.title": "Порада 3 — Перемістити програми:",
+  "usageTips.tip3.detail": "Утримуйте іконку програми, щоб почати перетягування > перетягніть її прямо в контейнер для переміщення.",
+  "usageTips.tip4.title": "Порада 4 — Скопіювати програми:",
+  "usageTips.tip4.detail": "Утримуйте іконку програми, щоб почати перетягування > утримуйте Alt/Option і перетягніть у контейнер для копіювання.",
+  "usageTips.tip5.title": "Порада 5 — Видалити теги:",
+  "usageTips.tip5.detail": "Утримуйте іконку програми, щоб почати перетягування > перетягніть її у порожнє місце між контейнерами.",
+  "usageTips.tip6.title": "Порада 6 — Упорядкувати теги:",
+  "usageTips.tip6.detail": "Утримуйте тег, щоб почати перетягування > перемістіть його в потрібне місце й відпустіть.",
+  "usageTips.tip7.title": "Порада 7 — Упорядкувати програми:",
+  "usageTips.tip7.detail": "Утримуйте іконку програми, щоб почати перетягування > перемістіть її в потрібне місце всередині контейнера й відпустіть.",
+  "usageTips.tip8.title": "Порада 8 — Редагувати нотатки:",
+  "usageTips.tip8.detail": "Клацніть програму правою кнопкою > введіть нотатку."
 }
diff --git a/src/Apptag/Localization/vi.json b/src/Apptag/Localization/vi.json
index c053a66..25489a5 100644
--- a/src/Apptag/Localization/vi.json
+++ b/src/Apptag/Localization/vi.json
@@ -207,5 +207,25 @@
   "help.copyLink": "Copy Help PDF link",
   "help.currentLanguage": "Opens the online PDF for the current app language.",
   "settings.language.auto": "Tự động",
-  "help.downloadPDF": "Tải PDF trợ giúp"
+  "help.downloadPDF": "Tải PDF trợ giúp",
+  "settings.hideUsageTips": "Ẩn mẹo sử dụng",
+  "settings.hideUsageTipsDesc": "Khi bật, các mẹo nổi ở cuối lưới ứng dụng sẽ bị ẩn.",
+  "usageTips.previous": "Mẹo trước",
+  "usageTips.next": "Mẹo tiếp theo",
+  "usageTips.tip1.title": "Mẹo 1 - Thêm thẻ:",
+  "usageTips.tip1.detail": "Mở Cài đặt > Thẻ để chỉnh sửa thẻ.",
+  "usageTips.tip2.title": "Mẹo 2 - Gắn thẻ ứng dụng:",
+  "usageTips.tip2.detail": "Nhấn giữ biểu tượng ứng dụng để bắt đầu kéo > thả lên một thẻ để gán thẻ đó.",
+  "usageTips.tip3.title": "Mẹo 3 - Di chuyển ứng dụng:",
+  "usageTips.tip3.detail": "Nhấn giữ biểu tượng ứng dụng để bắt đầu kéo > thả trực tiếp vào một vùng chứa để di chuyển.",
+  "usageTips.tip4.title": "Mẹo 4 - Sao chép ứng dụng:",
+  "usageTips.tip4.detail": "Nhấn giữ biểu tượng ứng dụng để bắt đầu kéo > giữ Alt/Option rồi thả vào vùng chứa để sao chép.",
+  "usageTips.tip5.title": "Mẹo 5 - Gỡ thẻ:",
+  "usageTips.tip5.detail": "Nhấn giữ biểu tượng ứng dụng để bắt đầu kéo > thả vào khoảng trống giữa các vùng chứa.",
+  "usageTips.tip6.title": "Mẹo 6 - Sắp xếp thẻ:",
+  "usageTips.tip6.detail": "Nhấn giữ một thẻ để bắt đầu kéo > kéo đến vị trí mong muốn rồi thả.",
+  "usageTips.tip7.title": "Mẹo 7 - Sắp xếp ứng dụng:",
+  "usageTips.tip7.detail": "Nhấn giữ biểu tượng ứng dụng để bắt đầu kéo > kéo đến vị trí mong muốn trong vùng chứa rồi thả.",
+  "usageTips.tip8.title": "Mẹo 8 - Chỉnh sửa ghi chú:",
+  "usageTips.tip8.detail": "Nhấp chuột phải vào ứng dụng > nhập ghi chú."
 }
diff --git a/src/Apptag/Localization/zh-Hans.json b/src/Apptag/Localization/zh-Hans.json
index 205c2d8..27e243f 100644
--- a/src/Apptag/Localization/zh-Hans.json
+++ b/src/Apptag/Localization/zh-Hans.json
@@ -207,5 +207,25 @@
   "help.copyLink": "复制帮助文档链接",
   "help.currentLanguage": "将按当前应用语言打开对应版本的在线 PDF。",
   "settings.language.auto": "自动",
-  "help.downloadPDF": "下载帮助文档"
+  "help.downloadPDF": "下载帮助文档",
+  "settings.hideUsageTips": "隐藏使用技巧",
+  "settings.hideUsageTipsDesc": "开启后,应用网格底部的悬浮使用技巧将不再显示。",
+  "usageTips.previous": "上一条技巧",
+  "usageTips.next": "下一条技巧",
+  "usageTips.tip1.title": "技巧1-添加标签:",
+  "usageTips.tip1.detail": "在设置 > 切换到“标签”即可编辑",
+  "usageTips.tip2.title": "技巧2-打标签:",
+  "usageTips.tip2.detail": "长按应用图标启动拖动 > 拖动到标签上是打标签",
+  "usageTips.tip3.title": "技巧3-移动应用:",
+  "usageTips.tip3.detail": "长按应用图标启动拖动 > 直接拖动到容器是移动",
+  "usageTips.tip4.title": "技巧4-复制应用:",
+  "usageTips.tip4.detail": "长按应用图标启动拖动 > 按住 Alt/Option 拖动到容器是复制",
+  "usageTips.tip5.title": "技巧5-解除标签:",
+  "usageTips.tip5.detail": "长按应用图标启动拖动 > 把应用拖动到容器间的空白处",
+  "usageTips.tip6.title": "技巧6-标签排序:",
+  "usageTips.tip6.detail": "长按标签启动拖动 > 拖动到目标位置,放手即可",
+  "usageTips.tip7.title": "技巧7-应用排序:",
+  "usageTips.tip7.detail": "长按应用图标启动拖动 > 拖动到容器内的目标位置,放手即可",
+  "usageTips.tip8.title": "技巧8-编辑备注:",
+  "usageTips.tip8.detail": "在应用上点击右键 > 输入内容"
 }
diff --git a/src/Apptag/Localization/zh-Hant.json b/src/Apptag/Localization/zh-Hant.json
index 145f47c..05b30ac 100644
--- a/src/Apptag/Localization/zh-Hant.json
+++ b/src/Apptag/Localization/zh-Hant.json
@@ -207,5 +207,25 @@
   "help.copyLink": "複製說明文件連結",
   "help.currentLanguage": "將依目前應用程式語言開啟對應版本的線上 PDF。",
   "settings.language.auto": "自動",
-  "help.downloadPDF": "下載說明文件"
+  "help.downloadPDF": "下載說明文件",
+  "settings.hideUsageTips": "隱藏使用技巧",
+  "settings.hideUsageTipsDesc": "開啟後,應用程式網格底部的浮動使用技巧將不再顯示。",
+  "usageTips.previous": "上一則技巧",
+  "usageTips.next": "下一則技巧",
+  "usageTips.tip1.title": "技巧1-新增標籤:",
+  "usageTips.tip1.detail": "在設定 > 切換到「標籤」即可編輯",
+  "usageTips.tip2.title": "技巧2-套用標籤:",
+  "usageTips.tip2.detail": "長按應用程式圖示開始拖曳 > 拖到標籤上即可套用標籤",
+  "usageTips.tip3.title": "技巧3-移動應用:",
+  "usageTips.tip3.detail": "長按應用程式圖示開始拖曳 > 直接拖到容器即可移動",
+  "usageTips.tip4.title": "技巧4-複製應用:",
+  "usageTips.tip4.detail": "長按應用程式圖示開始拖曳 > 按住 Alt/Option 拖到容器即可複製",
+  "usageTips.tip5.title": "技巧5-解除標籤:",
+  "usageTips.tip5.detail": "長按應用程式圖示開始拖曳 > 把應用拖到容器之間的空白處",
+  "usageTips.tip6.title": "技巧6-標籤排序:",
+  "usageTips.tip6.detail": "長按標籤開始拖曳 > 拖到目標位置後放開",
+  "usageTips.tip7.title": "技巧7-應用排序:",
+  "usageTips.tip7.detail": "長按應用程式圖示開始拖曳 > 拖到容器內目標位置後放開",
+  "usageTips.tip8.title": "技巧8-編輯備註:",
+  "usageTips.tip8.detail": "在應用程式上按右鍵 > 輸入內容"
 }
diff --git a/src/Apptag/PreferencesView.swift b/src/Apptag/PreferencesView.swift
index b103eae..2dea588 100644
--- a/src/Apptag/PreferencesView.swift
+++ b/src/Apptag/PreferencesView.swift
@@ -62,6 +62,7 @@
     @AppStorage("showDockIcon") private var showDockIcon = AppDefaults.showDockIcon
     @AppStorage("launchAtLogin") private var launchAtLogin = AppDefaults.launchAtLogin
     @AppStorage("showUncommonAppBubbles") private var showUncommonAppBubbles = AppDefaults.showUncommonAppBubbles
+    @AppStorage("hideUsageTips") private var hideUsageTips = AppDefaults.hideUsageTips
     @AppStorage("mainHotkeyRegistrationState") private var mainHotkeyRegistrationState = LauncherHotkeyRegistrationState.active.rawValue
     @AppStorage("quickSearchHotkeyRegistrationState") private var quickSearchHotkeyRegistrationState = LauncherHotkeyRegistrationState.active.rawValue
     @State private var selectedLanguage = L10n.selectedLanguageCode
@@ -760,9 +761,12 @@
                                     AppDelegate.refreshChromeSettings()
                                 }
                             Toggle(tr("settings.hideAppNames"), isOn: $hideAppNames)
+                            Toggle(tr("settings.hideUsageTips"), isOn: $hideUsageTips)
+                                .help(tr("settings.hideUsageTipsDesc"))
                         }
                         .frame(maxWidth: .infinity, alignment: .center)
-                        .padding(.bottom, 16)
+                        .padding(.top, 12)
+                        .padding(.bottom, 18)
 
                         Divider()
                             .padding(.bottom, 16)
@@ -825,7 +829,9 @@
                         }
                     }
                     .frame(maxWidth: generalContentWidth, alignment: .center)
-                    .padding()
+                    .padding(.horizontal)
+                    .padding(.top, 28)
+                    .padding(.bottom)
                 }
 
                     case .hotkeys:
diff --git a/src/Scripts/usage_tips_qa.sh b/src/Scripts/usage_tips_qa.sh
new file mode 100755
index 0000000..474929e
--- /dev/null
+++ b/src/Scripts/usage_tips_qa.sh
@@ -0,0 +1,153 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
+CONTENT_VIEW_SWIFT="$ROOT_DIR/Apptag/ContentView.swift"
+APP_GRID_SWIFT="$ROOT_DIR/Apptag/AppGridCollectionView.swift"
+PREFERENCES_VIEW_SWIFT="$ROOT_DIR/Apptag/PreferencesView.swift"
+APP_DEFAULTS_SWIFT="$ROOT_DIR/Apptag/AppDefaults.swift"
+LOCALIZATION_DIR="$ROOT_DIR/Apptag/Localization"
+
+fail() {
+  printf 'FAIL: %s\n' "$*" >&2
+  exit 1
+}
+
+[[ -f "$CONTENT_VIEW_SWIFT" ]] || fail "missing ContentView.swift"
+[[ -f "$APP_GRID_SWIFT" ]] || fail "missing AppGridCollectionView.swift"
+[[ -f "$PREFERENCES_VIEW_SWIFT" ]] || fail "missing PreferencesView.swift"
+[[ -f "$APP_DEFAULTS_SWIFT" ]] || fail "missing AppDefaults.swift"
+[[ -d "$LOCALIZATION_DIR" ]] || fail "missing Localization directory"
+
+python3 - "$CONTENT_VIEW_SWIFT" "$APP_GRID_SWIFT" "$PREFERENCES_VIEW_SWIFT" "$APP_DEFAULTS_SWIFT" "$LOCALIZATION_DIR" <<'PY'
+import json
+import pathlib
+import re
+import sys
+
+content_view = pathlib.Path(sys.argv[1]).read_text(encoding="utf-8")
+app_grid = pathlib.Path(sys.argv[2]).read_text(encoding="utf-8")
+preferences = pathlib.Path(sys.argv[3]).read_text(encoding="utf-8")
+defaults = pathlib.Path(sys.argv[4]).read_text(encoding="utf-8")
+localization_dir = pathlib.Path(sys.argv[5])
+
+required_keys = [
+    "settings.hideUsageTips",
+    "settings.hideUsageTipsDesc",
+    "usageTips.previous",
+    "usageTips.next",
+]
+for index in range(1, 9):
+    required_keys.append(f"usageTips.tip{index}.title")
+    required_keys.append(f"usageTips.tip{index}.detail")
+
+
+def fail(message: str) -> None:
+    print(f"FAIL: {message}", file=sys.stderr)
+    sys.exit(1)
+
+
+def require(pattern: str, source: str, message: str) -> None:
+    if not re.search(pattern, source, re.S):
+        fail(message)
+
+
+require(
+    r"static\s+let\s+hideUsageTips\s*=\s*false",
+    defaults,
+    "usage tips must default to visible for existing and new users",
+)
+require(
+    r'"hideUsageTips"\s*:\s*hideUsageTips',
+    defaults,
+    "AppDefaults.register must register hideUsageTips",
+)
+require(
+    r'@AppStorage\("hideUsageTips"\)\s+private\s+var\s+hideUsageTips\s*=\s*AppDefaults\.hideUsageTips',
+    content_view,
+    "ContentView must observe hideUsageTips with AppStorage",
+)
+require(
+    r'@AppStorage\("hideUsageTips"\)\s+private\s+var\s+hideUsageTips\s*=\s*AppDefaults\.hideUsageTips',
+    preferences,
+    "PreferencesView must persist hideUsageTips with AppStorage",
+)
+require(
+    r'Toggle\s*\(\s*tr\("settings\.hideUsageTips"\)\s*,\s*isOn\s*:\s*\$hideUsageTips\s*\)',
+    preferences,
+    "General settings must expose a Hide usage tips toggle",
+)
+require(
+    r"\bprivate\s+struct\s+AppGridUsageTipsBar\s*:\s*View\b",
+    content_view,
+    "ContentView must define the app grid usage tips overlay",
+)
+require(
+    r"static\s+let\s+reservedHeight\s*:\s*CGFloat\s*=\s*64",
+    content_view,
+    "Usage tips overlay must reserve stable bottom space",
+)
+require(
+    r"ScrollView\s*\(\s*\.horizontal\s*,\s*showsIndicators\s*:\s*textHovered\s*\)",
+    content_view,
+    "Long localized tip text must be horizontally scrollable on hover",
+)
+require(
+    r"\.onHover\s*\{\s*textHovered\s*=\s*\$0\s*\}",
+    content_view,
+    "Usage tip text must react to hover so long text can be inspected",
+)
+require(
+    r"bottomContentPadding\s*:\s*shouldShowUsageTips\s*\?\s*AppGridUsageTipsBar\.reservedHeight\s*:\s*0",
+    content_view,
+    "AppGrid must reserve bottom content space when tips are visible",
+)
+require(
+    r"\.allowsHitTesting\s*\(\s*!dragModeActive\s*\)",
+    content_view,
+    "Usage tips overlay must stop intercepting drag/drop while app drag mode is active",
+)
+require(
+    r"let\s+bottomContentPadding\s*:\s*CGFloat",
+    app_grid,
+    "AppGridCollectionView must accept bottom content padding",
+)
+if '"bottom=\\(Int(bottomContentPadding.rounded()))"' not in app_grid:
+    fail("AppGrid layout signature must include bottom content padding")
+require(
+    r"\+\s*max\s*\(\s*0\s*,\s*bottomContentPadding\s*\)",
+    app_grid,
+    "AppGrid layout plans must add bottom content padding to content height",
+)
+
+tip_ids = [int(value) for value in re.findall(r"AppGridUsageTip\s*\(\s*id\s*:\s*(\d+)", content_view)]
+if tip_ids != list(range(1, 9)):
+    fail(f"usage tip IDs must be exactly 1 through 8, got {tip_ids}")
+if "usageTips.tip0" in content_view:
+    fail("usage tips must not expose a zero-based tip number")
+
+for source_name, source in {
+    "ContentView.swift": content_view,
+    "AppGridCollectionView.swift": app_grid,
+    "PreferencesView.swift": preferences,
+}.items():
+    if re.search(r"#available\s*\(\s*macOS\s+(?:15|26)", source):
+        fail(f"{source_name} must not rely on macOS 15/26 availability for usage tips")
+    if "scrollClipDisabled" in source:
+        fail(f"{source_name} must avoid newer scrollClipDisabled behavior for macOS 14 compatibility")
+
+json_files = sorted(localization_dir.glob("*.json"))
+if len(json_files) != 29:
+    fail(f"expected 29 localization files, found {len(json_files)}")
+
+for path in json_files:
+    try:
+        data = json.loads(path.read_text(encoding="utf-8"))
+    except Exception as exc:
+        fail(f"{path.name} is not valid JSON: {exc}")
+    missing = [key for key in required_keys if not data.get(key)]
+    if missing:
+        fail(f"{path.name} missing usage tip localization keys: {', '.join(missing)}")
+
+print("PASS usage tips QA: overlay, hide setting, macOS 14-safe implementation, and 29-language localizations are present")
+PY

--
Gitblit v1.9.3