Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
27c42ce
feat: Experiments V2 — wizard components, results page, and Storybook…
talissoncosta Apr 9, 2026
092788f
fix: Replace all hardcoded values with design tokens in experiments-v2
talissoncosta Apr 9, 2026
22e1f1b
fix: Enrich review step with richer data display and pre-populated mo…
talissoncosta Apr 9, 2026
f650110
fix: Enrich experiment results page with timeline, recommendation, an…
talissoncosta Apr 9, 2026
da05fac
feat: Motion presets + Warehouse Connection Settings UI
talissoncosta Apr 9, 2026
1ed5435
fix: Strip cosmetic animations, add warehouse route, fix Storybook gl…
talissoncosta Apr 9, 2026
a6d5cbe
fix: Scope empty state icon colour to direct child only
talissoncosta Apr 9, 2026
fd87c03
chore(experiments): Terminology + drop unused UI
talissoncosta Apr 15, 2026
7b1e088
feat(experiments): Multi-variant flag guard + start/end date fields
talissoncosta Apr 15, 2026
989ccd3
chore: Remove experiment and warehouse Storybook stories
talissoncosta Apr 16, 2026
09fcc95
feat(experiments): Metrics empty state + search-empty cleanup
talissoncosta Apr 16, 2026
0fe8140
feat(experiments): Clarify control vs experiment split
talissoncosta Apr 16, 2026
014a8f2
feat(experiments): Add empty states to Flag + Segments steps
talissoncosta Apr 16, 2026
a667f64
feat(experiments): Add experiments list table from Pencil designs
talissoncosta Apr 16, 2026
b97d181
refactor(experiments): Flag first, remove experiment type selector
talissoncosta Apr 16, 2026
e53dc90
feat(experiments): Empty state when flag has no variations
talissoncosta Apr 16, 2026
7d12ff9
refactor(experiments): Core data model + rename Audience → Segment
talissoncosta Apr 21, 2026
14dc1f7
feat(experiments): Metrics UX — tags, inline creation, library tab
talissoncosta Apr 21, 2026
3929f2b
feat(experiments): Results page — trend chart and improved comparison
talissoncosta Apr 21, 2026
2fb5370
docs(experiments): Add prototype notes for deferred work
talissoncosta Apr 21, 2026
16ae74f
feat(experiments): Bucketing unit label on Segment step
talissoncosta Apr 21, 2026
f6d1556
feat(experiments): Wizard flow polish — dates, hypothesis hint, launc…
talissoncosta Apr 21, 2026
e7b6303
feat(experiments): Metric roles — guardrail support + soft primary wa…
talissoncosta Apr 21, 2026
343e297
docs(experiments): Add design proposal for presentation
talissoncosta Apr 21, 2026
16f9f2d
refactor(experiments): Split Metrics into a dedicated sidebar entry
talissoncosta Apr 21, 2026
7e8afbb
feat(experiments): Propagate metric roles to the Results page
talissoncosta Apr 21, 2026
69d7467
refactor(experiments): Stack Table + Trend on the Results page
talissoncosta Apr 21, 2026
af0a441
feat(experiments): Wire metrics to the data warehouse
talissoncosta Apr 21, 2026
ee33721
feat(warehouse): Expose Data Warehouse in the organisation nav
talissoncosta Apr 21, 2026
ece22a0
docs(experiments): Document data-collection story
talissoncosta Apr 21, 2026
7e32e20
refactor(experiments): Delete metric uses confirmation popup
talissoncosta Apr 21, 2026
06fb444
feat(integrations): Data Warehouse as a first-class integration entry
talissoncosta Apr 21, 2026
30a7d80
feat(integrations): Flag Data Warehouse entry as org + project scope
talissoncosta Apr 21, 2026
0b725ac
refactor(warehouse): Separate Test Connection from Connect
talissoncosta Apr 21, 2026
6e28932
fix(warehouse): Breadcrumb points back to Organisation Integrations
talissoncosta Apr 21, 2026
c3fb958
fix(warehouse): Drop redundant page title — breadcrumb owns the name
talissoncosta Apr 21, 2026
f0878c7
feat(warehouse): Demo state switcher + ?state= URL param
talissoncosta Apr 21, 2026
603d4e3
docs(experiments): Document demo shortcuts + presentation walkthrough
talissoncosta Apr 21, 2026
91a44b0
docs(experiments): Note the missing "Connected" indicator on warehous…
talissoncosta Apr 21, 2026
80fa468
docs(experiments): Note the 1220px rail as design debt, not a target
talissoncosta Apr 21, 2026
7d52bbd
refactor(warehouse): Drop Test Connection from the config form
talissoncosta Apr 23, 2026
31b2d48
refactor(warehouse): Align config flow with backend shape from #7276
talissoncosta Apr 24, 2026
69c9791
feat(warehouse): Add "Show setup script" action to the error state
talissoncosta Apr 24, 2026
1459254
refactor(warehouse): Lock immutable fields on Edit
talissoncosta Apr 24, 2026
d7515e8
fix(warehouse): Replace throwaway card descriptions
talissoncosta Apr 24, 2026
e1ae080
fix(warehouse): "Coming Soon" badge overlapping two-line descriptions
talissoncosta Apr 24, 2026
01aa433
fix(warehouse): Move "Coming Soon" badge to top-right of the card
talissoncosta Apr 24, 2026
ad3f8d5
fix(warehouse): Embed mock public key in the setup script
talissoncosta Apr 24, 2026
fd0feaa
fix(warehouse): Stale account URL in Connected/Error + Cancel-from-ed…
talissoncosta Apr 24, 2026
b359378
docs(experiments-v2): Forward-design experiment record for Path C
talissoncosta Apr 27, 2026
233d593
refactor(experiments-v2): Split audience into targeting, sample, split
talissoncosta Apr 27, 2026
1d66d48
refactor(experiments-v2): Restructure wizard from 5 to 4 steps
talissoncosta May 8, 2026
abd2fec
refactor(experiments-v2): Replace segment selector with inline audien…
talissoncosta May 8, 2026
dc7f3fc
feat(experiments-v2): Surface Layers, randomisation unit, persist-acr…
talissoncosta May 8, 2026
0325d30
feat(experiments-v2): Add live preview panel mirroring eval hierarchy
talissoncosta May 8, 2026
f83de7d
feat(experiments-v2): Surface eval-hierarchy banners and effective po…
talissoncosta May 8, 2026
c4e7e95
feat(experiments-v2): Add inclusion criteria and stats engine controls
talissoncosta May 8, 2026
083980e
feat(experiments-v2): Warn when a variation collides with control value
talissoncosta May 8, 2026
610d5bc
chore(deps): Restore motion after rebasing onto main
talissoncosta May 8, 2026
a0ae508
fix(experiments-v2): Replace removed Banner with WarningMessage
talissoncosta May 8, 2026
46dfe52
refactor(experiments-v2): Drop bucketing & exclusion section from wizard
talissoncosta May 8, 2026
5444a1d
refactor(experiments-v2): Use SearchableSelect in audience condition …
talissoncosta May 8, 2026
11eda30
refactor(experiments-v2): Drop measurement controls from wizard
talissoncosta May 8, 2026
4d2e16e
refactor(experiments-v2): Drop guardrail role, compress to primary/se…
talissoncosta May 8, 2026
fa312be
refactor(experiments-v2): Drop start/end date fields
talissoncosta May 8, 2026
f3ac5dd
docs(experiments-v2): Align design doc + notes with V1
talissoncosta May 12, 2026
c2af3d7
refactor(experiments-v2): Align results page with V1 wizard model
talissoncosta May 12, 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