Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
5f72495
feat: Experiments V2 — wizard components, results page, and Storybook…
talissoncosta Apr 9, 2026
635f621
fix: Replace all hardcoded values with design tokens in experiments-v2
talissoncosta Apr 9, 2026
4a46bf3
fix: Enrich review step with richer data display and pre-populated mo…
talissoncosta Apr 9, 2026
189e365
fix: Enrich experiment results page with timeline, recommendation, an…
talissoncosta Apr 9, 2026
4c9f2e1
feat: Motion presets + Warehouse Connection Settings UI
talissoncosta Apr 9, 2026
8636856
fix: Strip cosmetic animations, add warehouse route, fix Storybook gl…
talissoncosta Apr 9, 2026
96f5a4f
fix: Scope empty state icon colour to direct child only
talissoncosta Apr 9, 2026
c667f51
chore(experiments): Terminology + drop unused UI
talissoncosta Apr 15, 2026
bc17fda
feat(experiments): Multi-variant flag guard + start/end date fields
talissoncosta Apr 15, 2026
c9baf5d
chore: Remove experiment and warehouse Storybook stories
talissoncosta Apr 16, 2026
253fd1a
feat(experiments): Metrics empty state + search-empty cleanup
talissoncosta Apr 16, 2026
9d0231b
feat(experiments): Clarify control vs experiment split
talissoncosta Apr 16, 2026
9b11e31
feat(experiments): Add empty states to Flag + Segments steps
talissoncosta Apr 16, 2026
2de3a67
feat(experiments): Add experiments list table from Pencil designs
talissoncosta Apr 16, 2026
c22037a
refactor(experiments): Flag first, remove experiment type selector
talissoncosta Apr 16, 2026
188d703
feat(experiments): Empty state when flag has no variations
talissoncosta Apr 16, 2026
751572a
refactor(experiments): Core data model + rename Audience → Segment
talissoncosta Apr 21, 2026
02da5c4
feat(experiments): Metrics UX — tags, inline creation, library tab
talissoncosta Apr 21, 2026
9d81446
feat(experiments): Results page — trend chart and improved comparison
talissoncosta Apr 21, 2026
ec026e1
docs(experiments): Add prototype notes for deferred work
talissoncosta Apr 21, 2026
a3c92a0
feat(experiments): Bucketing unit label on Segment step
talissoncosta Apr 21, 2026
9c2fd2c
feat(experiments): Wizard flow polish — dates, hypothesis hint, launc…
talissoncosta Apr 21, 2026
50cb4c2
feat(experiments): Metric roles — guardrail support + soft primary wa…
talissoncosta Apr 21, 2026
3400c02
docs(experiments): Add design proposal for presentation
talissoncosta Apr 21, 2026
b787ffa
refactor(experiments): Split Metrics into a dedicated sidebar entry
talissoncosta Apr 21, 2026
27e97c1
feat(experiments): Propagate metric roles to the Results page
talissoncosta Apr 21, 2026
ae24f55
refactor(experiments): Stack Table + Trend on the Results page
talissoncosta Apr 21, 2026
99666cd
feat(experiments): Wire metrics to the data warehouse
talissoncosta Apr 21, 2026
a9a9b1c
feat(warehouse): Expose Data Warehouse in the organisation nav
talissoncosta Apr 21, 2026
ce40fec
docs(experiments): Document data-collection story
talissoncosta Apr 21, 2026
15026d3
refactor(experiments): Delete metric uses confirmation popup
talissoncosta Apr 21, 2026
c3f9e89
feat(integrations): Data Warehouse as a first-class integration entry
talissoncosta Apr 21, 2026
d66cc56
feat(integrations): Flag Data Warehouse entry as org + project scope
talissoncosta Apr 21, 2026
d4be89c
refactor(warehouse): Separate Test Connection from Connect
talissoncosta Apr 21, 2026
180ade8
fix(warehouse): Breadcrumb points back to Organisation Integrations
talissoncosta Apr 21, 2026
e02dcac
fix(warehouse): Drop redundant page title — breadcrumb owns the name
talissoncosta Apr 21, 2026
de300b5
feat(warehouse): Demo state switcher + ?state= URL param
talissoncosta Apr 21, 2026
14b5850
docs(experiments): Document demo shortcuts + presentation walkthrough
talissoncosta Apr 21, 2026
5237ac2
docs(experiments): Note the missing "Connected" indicator on warehous…
talissoncosta Apr 21, 2026
6282158
docs(experiments): Note the 1220px rail as design debt, not a target
talissoncosta Apr 21, 2026
2e37448
refactor(warehouse): Drop Test Connection from the config form
talissoncosta Apr 23, 2026
f49567d
refactor(warehouse): Align config flow with backend shape from #7276
talissoncosta Apr 24, 2026
05a1943
feat(warehouse): Add "Show setup script" action to the error state
talissoncosta Apr 24, 2026
7149e9f
refactor(warehouse): Lock immutable fields on Edit
talissoncosta Apr 24, 2026
4f8fe85
fix(warehouse): Replace throwaway card descriptions
talissoncosta Apr 24, 2026
9a336b4
fix(warehouse): "Coming Soon" badge overlapping two-line descriptions
talissoncosta Apr 24, 2026
920bdb6
fix(warehouse): Move "Coming Soon" badge to top-right of the card
talissoncosta Apr 24, 2026
b80d5b6
fix(warehouse): Embed mock public key in the setup script
talissoncosta Apr 24, 2026
efda42d
fix(warehouse): Stale account URL in Connected/Error + Cancel-from-ed…
talissoncosta Apr 24, 2026
f63cb8d
docs(experiments-v2): Forward-design experiment record for Path C
talissoncosta Apr 27, 2026
91ec87f
refactor(experiments-v2): Split audience into targeting, sample, split
talissoncosta Apr 27, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions frontend/common/stores/default-flags.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,18 @@ const defaultFlags = {
'perEnvironment': false,
'title': 'Code References',
},
'data-warehouse': {
'description':
'Connect Snowflake, BigQuery, or Databricks to compute experiment metrics from your event data. Required for experimentation.',
'docs': '/organisation/:organisationId/warehouse',
'external': true,
'image': '/static/images/integrations/data-warehouse.svg',
'organisation': true,
'perEnvironment': false,
'project': true,
'tags': ['analytics'],
'title': 'Data Warehouse',
},
'datadog': {
'description':
'Sends events to Datadog for when flags are created, updated and removed. Logs are tagged with the environment they came from e.g. production.',
Expand Down
143 changes: 143 additions & 0 deletions frontend/common/utils/motion.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
// =============================================================================
// Motion Presets — Reusable animation variants for the motion library
// Import these instead of defining raw values in components.
//
// Usage:
// import { motion, AnimatePresence } from 'motion/react'
// import { fadeIn, staggerContainer } from 'common/utils/motion'
//
// <motion.div variants={fadeIn()} initial="hidden" animate="visible">
// ...
// </motion.div>
// =============================================================================

import type { Variants } from 'motion/react'

// -----------------------------------------------------------------------------
// Fade
// -----------------------------------------------------------------------------

/** Fade in with optional delay. Default 250ms. */
export const fadeIn = (delay = 0): Variants => ({
hidden: { opacity: 0 },
visible: {
opacity: 1,
transition: { delay, duration: 0.25, ease: [0.2, 0, 0.38, 0.9] },
},
})

/** Fade out. Matches --easing-exit. */
export const fadeOut: Variants = {
exit: {
opacity: 0,
transition: { duration: 0.2, ease: [0.2, 0, 1, 0.9] },
},
visible: { opacity: 1 },
}

// -----------------------------------------------------------------------------
// Slide
// -----------------------------------------------------------------------------

/** Slide in from right. 320ms, matches --easing-entrance. */
export const slideInRight: Variants = {
exit: {
opacity: 0,
transition: { duration: 0.2, ease: [0.2, 0, 1, 0.9] },
x: -40,
},
hidden: { opacity: 0, x: 40 },
visible: {
opacity: 1,
transition: { duration: 0.32, ease: [0.0, 0, 0.38, 0.9] },
x: 0,
},
}

/** Slide in from below. Subtler, for inline content. */
export const slideInUp: Variants = {
hidden: { opacity: 0, y: 12 },
visible: {
opacity: 1,
transition: { duration: 0.25, ease: [0.0, 0, 0.38, 0.9] },
y: 0,
},
}

// -----------------------------------------------------------------------------
// Stagger
// -----------------------------------------------------------------------------

/** Container that staggers its children's entrance. */
export const staggerContainer = (staggerDelay = 0.1): Variants => ({
hidden: {},
visible: { transition: { staggerChildren: staggerDelay } },
})

/** Individual child item for use inside a stagger container. */
export const staggerItem: Variants = {
hidden: { opacity: 0, y: 8 },
visible: {
opacity: 1,
transition: { duration: 0.3, ease: [0.0, 0, 0.38, 0.9] },
y: 0,
},
}

// -----------------------------------------------------------------------------
// Spring / Bounce
// -----------------------------------------------------------------------------

/** Spring bounce — success checkmarks, icons appearing. */
export const springBounce: Variants = {
hidden: { opacity: 0, scale: 0 },
visible: {
opacity: 1,
scale: 1,
transition: { damping: 15, stiffness: 300, type: 'spring' },
},
}

// -----------------------------------------------------------------------------
// Shake
// -----------------------------------------------------------------------------

/** Horizontal shake — error states, validation failures. */
export const shakeX: Variants = {
idle: { x: 0 },
shake: {
transition: { duration: 0.4, ease: 'easeInOut' },
x: [0, -8, 8, -4, 4, 0],
},
}

// -----------------------------------------------------------------------------
// Badge / Chip
// -----------------------------------------------------------------------------

/** Badge slides down from above with fade. 250ms with 400ms delay. */
export const badgeEntrance: Variants = {
hidden: { opacity: 0, y: -12 },
visible: {
opacity: 1,
transition: { delay: 0.4, duration: 0.25, ease: [0.0, 0, 0.38, 0.9] },
y: 0,
},
}

// -----------------------------------------------------------------------------
// Page Transition (for AnimatePresence)
// -----------------------------------------------------------------------------

/** Crossfade between pages/states. Use with AnimatePresence mode="wait". */
export const pageCrossfade: Variants = {
exit: {
opacity: 0,
transition: { duration: 0.15, ease: [0.2, 0, 1, 0.9] },
},
hidden: { opacity: 0 },
visible: {
opacity: 1,
transition: { duration: 0.25, ease: [0.2, 0, 0.38, 0.9] },
},
}
Loading
Loading