diff --git a/apps/desktop/src/components/layout/AppTabBar.vue b/apps/desktop/src/components/layout/AppTabBar.vue
index 41ebc895a..a88599985 100644
--- a/apps/desktop/src/components/layout/AppTabBar.vue
+++ b/apps/desktop/src/components/layout/AppTabBar.vue
@@ -141,6 +141,29 @@ function cancelRenameTab() {
editingTabId.value = null;
}
+function isDirtyTab(tab: QueryTab) {
+ return queryStore.isTabDirty(tab);
+}
+
+function tabTitleLabel(tab: QueryTab) {
+ const title = tabDisplayTitle(tab, t);
+ return isDirtyTab(tab) ? `* ${title}` : title;
+}
+
+function tabTitleText(tab: QueryTab) {
+ return tabDisplayTitle(tab, t);
+}
+
+function tabTitleStyle(tab: QueryTab): CSSProperties | undefined {
+ if (!isDirtyTab(tab)) return undefined;
+ return {
+ fontStyle: "italic",
+ fontWeight: 700,
+ transform: "skewX(-8deg)",
+ transformOrigin: "left center",
+ };
+}
+
type SpecialRegularSurface = "driverStore" | "settings";
function closeSpecialRegularSurfaces(keep?: SpecialRegularSurface) {
@@ -554,7 +577,10 @@ function onOverflowItemKeydown(event: KeyboardEvent, tabId: string, kind: "regul
@keydown.escape.prevent="cancelRenameTab"
@blur="commitRenameTab(tab)"
/>
- {{ tabDisplayTitle(tab, t) }}
+
+ *
+ {{ tabTitleText(tab) }}
+
@@ -645,7 +671,7 @@ function onOverflowItemKeydown(event: KeyboardEvent, tabId: string, kind: "regul
-
{{ tabDisplayTitle(tab, t) }}
+
+ *
+ {{ tabTitleText(tab) }}
+
@@ -727,7 +756,10 @@ function onOverflowItemKeydown(event: KeyboardEvent, tabId: string, kind: "regul
@keydown.escape.prevent="cancelRenameTab"
@blur="commitRenameTab(tab)"
/>
- {{ tabDisplayTitle(tab, t) }}
+
+ *
+ {{ tabTitleText(tab) }}
+
@@ -766,7 +798,7 @@ function onOverflowItemKeydown(event: KeyboardEvent, tabId: string, kind: "regul
-
{{ tabDisplayTitle(tab, t) }}
+
+ *
+ {{ tabTitleText(tab) }}
+
@@ -850,6 +885,21 @@ function onOverflowItemKeydown(event: KeyboardEvent, tabId: string, kind: "regul