diff --git a/packages/stage-layouts/src/components/Backgrounds/default/index.ts b/packages/stage-layouts/src/components/Backgrounds/default/index.ts
index d393f9ed0..d16385c50 100644
--- a/packages/stage-layouts/src/components/Backgrounds/default/index.ts
+++ b/packages/stage-layouts/src/components/Backgrounds/default/index.ts
@@ -2,3 +2,4 @@ export { default as DefaultBackground } from './index.vue'
export { default as PartAnimatedWave } from './part-animated-wave.vue'
export { default as PatternCross } from './pattern-cross.vue'
export { default as DefaultBackgroundPreview } from './preview.vue'
+export { default as TransparentBackgroundPreview } from './transparent-preview.vue'
diff --git a/packages/stage-layouts/src/components/Backgrounds/default/transparent-preview.vue b/packages/stage-layouts/src/components/Backgrounds/default/transparent-preview.vue
new file mode 100644
index 000000000..53c9561f8
--- /dev/null
+++ b/packages/stage-layouts/src/components/Backgrounds/default/transparent-preview.vue
@@ -0,0 +1,56 @@
+
+
+
+
+
diff --git a/packages/stage-layouts/src/composables/theme-color.ts b/packages/stage-layouts/src/composables/theme-color.ts
index 18db8f6bf..d35f6c3d2 100644
--- a/packages/stage-layouts/src/composables/theme-color.ts
+++ b/packages/stage-layouts/src/composables/theme-color.ts
@@ -79,6 +79,10 @@ export function useBackgroundThemeColor({
return waveThemeColor()
}
+ if (selectedOption.value?.kind === BackgroundKind.Transparent) {
+ return isDark.value ? 'rgb(18 18 18 / 0)' : 'rgb(255 255 255 / 0)'
+ }
+
return sampledColor.value
})
@@ -86,11 +90,11 @@ export function useBackgroundThemeColor({
const { pause, resume } = useIntervalFn(() => {
if (visibility.value !== 'visible')
return
- if (selectedOption.value?.kind === BackgroundKind.Wave && themeColorsHueDynamic)
+ if (selectedOption.value?.kind === BackgroundKind.Wave && themeColorsHueDynamic.value)
void updateThemeColor()
}, 250, { immediate: false })
- watch([() => selectedOption.value?.kind, () => themeColorsHueDynamic], ([kind, dynamic]) => {
+ watch([() => selectedOption.value?.kind, () => themeColorsHueDynamic.value], ([kind, dynamic]) => {
if (kind === BackgroundKind.Wave && dynamic) {
void updateThemeColor()
resume()
@@ -120,6 +124,12 @@ export function useBackgroundThemeColor({
return
}
+ if (selectedOption.value?.kind === BackgroundKind.Transparent) {
+ sampledColor.value = 'transparent'
+ await updateThemeColor()
+ return
+ }
+
const el = backgroundSurface.value?.surfaceEl
if (!el)
return
diff --git a/packages/stage-layouts/src/stores/background.ts b/packages/stage-layouts/src/stores/background.ts
index fe10386ef..7d137cd83 100644
--- a/packages/stage-layouts/src/stores/background.ts
+++ b/packages/stage-layouts/src/stores/background.ts
@@ -7,11 +7,12 @@ import { useLocalStorage, useObjectUrl } from '@vueuse/core'
import { defineStore } from 'pinia'
import { computed, markRaw, onScopeDispose, ref, shallowRef, watch } from 'vue'
-import { DefaultBackgroundPreview } from '../components/Backgrounds/default'
+import { DefaultBackgroundPreview, TransparentBackgroundPreview } from '../components/Backgrounds/default'
export enum BackgroundKind {
Wave = 'wave',
Image = 'image',
+ Transparent = 'transparent',
}
export interface BackgroundItem extends BackgroundOption {
@@ -36,6 +37,13 @@ export const useBackgroundStore = defineStore('background', () => {
kind: BackgroundKind.Wave,
component: markRaw(DefaultBackgroundPreview),
},
+ {
+ id: 'transparent',
+ label: 'Transparent',
+ description: 'Reveal the native background behind the WebView',
+ kind: BackgroundKind.Transparent,
+ component: markRaw(TransparentBackgroundPreview),
+ },
]
const loading = ref(false)
@@ -143,9 +151,11 @@ export const useBackgroundStore = defineStore('background', () => {
async function applyPickerSelection(payload: { option: BackgroundOption, color?: string }) {
const kind = payload.option.kind === BackgroundKind.Wave
? BackgroundKind.Wave
- : payload.option.kind === BackgroundKind.Image
- ? BackgroundKind.Image
- : BackgroundKind.Image
+ : payload.option.kind === BackgroundKind.Transparent
+ ? BackgroundKind.Transparent
+ : payload.option.kind === BackgroundKind.Image
+ ? BackgroundKind.Image
+ : BackgroundKind.Image
const selection: BackgroundItem = {
...payload.option,
diff --git a/packages/stage-ui/src/components/scenarios/dialogs/background-picker/background-picker.vue b/packages/stage-ui/src/components/scenarios/dialogs/background-picker/background-picker.vue
index f83cd1eef..6f09d32bc 100644
--- a/packages/stage-ui/src/components/scenarios/dialogs/background-picker/background-picker.vue
+++ b/packages/stage-ui/src/components/scenarios/dialogs/background-picker/background-picker.vue
@@ -103,6 +103,10 @@ watch(selectedOption, async (option) => {
if (option?.kind === 'wave') {
previewColor.value = themeColorsHue.toString()
}
+ else if (option?.kind === 'transparent') {
+ enableBlur.value = false
+ previewColor.value = 'transparent'
+ }
else if (option) {
await waitForPreviewReady()
const result = await colorFromElement(previewRef.value!, {
@@ -170,10 +174,21 @@ async function applySelection(isImport = false) {
busy.value = true
try {
+ const blur = selectedOption.value.kind === 'image' ? enableBlur.value : false
+
if (selectedOption.value.kind === 'wave') {
const color = themeColorsHue.toString()
- const payload = { option: { ...selectedOption.value, blur: enableBlur.value }, color }
+ const payload = { option: { ...selectedOption.value, blur }, color }
+ if (isImport)
+ (emit as any)('import', payload) // TODO: so ugly, need to fix the typing of emit
+ else
+ (emit as any)('apply', payload)
+ return
+ }
+
+ if (selectedOption.value.kind === 'transparent') {
+ const payload = { option: { ...selectedOption.value, blur }, color: 'transparent' }
if (isImport)
(emit as any)('import', payload)
else
@@ -190,7 +205,7 @@ async function applySelection(isImport = false) {
await new Promise(resolve => setTimeout(resolve, 300))
}
- const payload = { option: { ...selectedOption.value, blur: enableBlur.value }, color: previewColor.value }
+ const payload = { option: { ...selectedOption.value, blur }, color: previewColor.value }
if (isImport)
(emit as any)('import', payload)
else
@@ -267,7 +282,7 @@ async function applySelection(isImport = false) {
Preview