Skip to main content
Vuetify0 is now in beta!
Vuetify0 Logo
Theme
Mode
Palettes
Accessibility
Vuetify One
Sign in to Vuetify One

Access premium tools across the Vuetify ecosystem — Bin, Play, Studio, and more.

Not a subscriber? See what's included

useFeatures

Manage feature flags and variations across your application.

Installation

Install the Features plugin in your app’s entry point:

main.ts
import { createApp } from 'vue'
import { createFeaturesPlugin } from '@vuetify/v0'
import App from './App.vue'

const app = createApp(App)

app.use(
  createFeaturesPlugin({
    features: {
      analytics: true,
      debug_mode: false,
      notifications: false,
      search: { $value: true, $variation: 'v2' },
    },
  })
)

app.mount('#app')

Usage

Once the plugin is installed, access feature flags and variations in any component:

UseFeatures
<script setup lang="ts">
  import { useFeatures } from '@vuetify/v0'

  const features = useFeatures()
</script>

<template>
  <div>
    <p>Analytics: {{ features.get('analytics') }}</p>
    <p>Debug Mode: {{ features.get('debug_mode') }}</p>
    <p>Notifications: {{ features.get('notifications') }}</p>
    <p>Search Variation: {{ features.variation('search', 'v1') }}</p>
  </div>
</template>

Optionally register features at runtime:

UseFeatures
<script setup lang="ts">
  import { useFeatures } from '@vuetify/v0'

  const features = useFeatures()

  // Register at runtime
  features.register({ id: 'beta', value: false })

  // Enable/disable via selection helpers
  features.select('beta')
  features.unselect('analytics')
</script>

Adapters

Adapters let you swap the underlying feature flag provider without changing your application code.

AdapterImportDescription
PostHogFeaturesAdapter@vuetify/v0/features/adapters/posthogPostHog↗︎ integration
FlagsmithFeaturesAdapter@vuetify/v0/features/adapters/flagsmithFlagsmith↗︎ integration
LaunchDarklyFeaturesAdapter@vuetify/v0/features/adapters/launchdarklyLaunchDarkly↗︎ integration

Flagsmith

Flagsmith↗︎ is an open-source feature flag platform. Requires the @flagsmith/flagsmith package.

bash
pnpm add @flagsmith/flagsmith
ts
import flagsmith from '@flagsmith/flagsmith'
import { FlagsmithFeaturesAdapter } from '@vuetify/v0/features/adapters/flagsmith'

app.use(createFeaturesPlugin({
  adapter: new FlagsmithFeaturesAdapter(flagsmith, {
    environmentID: '<YOUR_ENV_ID>',
    // ...other flagsmith options
  })
}))

LaunchDarkly

LaunchDarkly↗︎ is a feature management platform. Requires the launchdarkly-js-client-sdk package.

bash
pnpm add launchdarkly-js-client-sdk
ts
import * as LDClient from 'launchdarkly-js-client-sdk'
import { LaunchDarklyFeaturesAdapter } from '@vuetify/v0/features/adapters/launchdarkly'

const client = LDClient.initialize('<YOUR_CLIENT_SIDE_ID>', { key: 'user-key' })

await client.waitForInitialization()

app.use(createFeaturesPlugin({
  adapter: new LaunchDarklyFeaturesAdapter(client)
}))

PostHog

PostHog↗︎ is an open-source product analytics and feature flag platform. Requires the posthog-js package.

bash
pnpm add posthog-js
ts
import posthog from 'posthog-js'
import { PostHogFeaturesAdapter } from '@vuetify/v0/features/adapters/posthog'

posthog.init('<YOUR_PROJECT_API_KEY>', { api_host: 'https://app.posthog.com' })

app.use(createFeaturesPlugin({
  adapter: new PostHogFeaturesAdapter(posthog)
}))

Multiple Adapters

You can combine flags from multiple sources by passing an array of adapters. They are initialized in order, and flags are merged (last one wins for conflicting keys).

ts
import { FlagsmithFeaturesAdapter } from '@vuetify/v0/features/adapters/flagsmith'
import { PostHogFeaturesAdapter } from '@vuetify/v0/features/adapters/posthog'

app.use(createFeaturesPlugin({
  adapter: [
    new FlagsmithFeaturesAdapter(flagsmith, options),
    new PostHogFeaturesAdapter(posthog),
  ]
}))

Custom Adapters

Create custom adapters by extending FeaturesAdapter.

ts
import { FeaturesAdapter } from '@vuetify/v0'
import type { FeaturesAdapterFlags } from '@vuetify/v0'

class WindowFeaturesAdapter extends FeaturesAdapter {
  setup (onUpdate: (flags: FeaturesAdapterFlags) => void): FeaturesAdapterFlags {
    const update = (event: CustomEvent) => {
      onUpdate(event.detail)
    }

    window.addEventListener('v0:update-features', update as EventListener)

    this.disposeFn = () => {
      window.removeEventListener('v0:update-features', update as EventListener)
    }

    // Return initial state if available, or empty object
    return window.__INITIAL_FEATURES__ || {}
  }

  dispose () {
    this.disposeFn()
  }

  private disposeFn = () => {}
}

Adapter Base Class

The adapter pattern decouples feature flags from the underlying provider.

Adapter Data Flow

Use controls to zoom and pan. Click outside or press Escape to close.

Adapter Data Flow
ts
abstract class FeaturesAdapter {
  /**
   * Initialize the adapter and return initial flags.
   *
   * @param onUpdate Callback invoked when flags change.
   * @returns Initial feature flags.
   */
  abstract setup (onUpdate: (flags: FeaturesAdapterFlags) => void): FeaturesAdapterFlags

  /**
   * Cleanup adapter resources.
   */
  dispose? (): void
}

Architecture

useFeatures extends createGroup for multi-selection and createTokens for variations:

Features Hierarchy

Use controls to zoom and pan. Click outside or press Escape to close.

Features Hierarchy

Reactivity

Feature flags inherit reactivity from createGroup. Selection state is reactive, but lookup methods return static values.

PropertyReactiveNotes
selectedIdsSet of enabled feature IDs
selectedItemsComputed array of enabled features
ticket isSelectedtrue when this feature is enabled
variation(id, fallback?)Returns the $variation value for a feature, or fallback if unset

Examples

Feature Flag Panel

Toggle boolean and variation feature flags at runtime, using ticket isSelected, select(), unselect(), and variation() to read and control which features are active.

0 / 1 features enabled

Variation lookup

search:v1layout:listmissing:fallback

API Reference

The following API details are for the useFeatures composable.
Was this page helpful?

Ctrl+/