Browse Source

feat(onboarding): Add onboarding welcome page experiment (#31733)

* adds onboarding welcome page experiment

* temp checkin

* adds tests

* adds onboarding images

* making progress

* adds falling man

* Use browser history

* Hanging man position & viewport height

* Add call to logExperiment

* Falling man text adjustments

* Update static/app/views/onboarding/onboardingController.tsx

Co-authored-by: Evan Purkhiser <evanpurkhiser@gmail.com>

* fixes

* Disable logExperimetn

* fix tests

Co-authored-by: Zhixing Zhang <me@neoto.xin>
Co-authored-by: Evan Purkhiser <evanpurkhiser@gmail.com>
Stephen Cefali 3 years ago
parent
commit
8fd1585fc3

+ 1 - 1
static/app/routes.tsx

@@ -215,7 +215,7 @@ function buildRoutes() {
         <IndexRedirect to="welcome/" />
         <Route
           path=":step/"
-          componentPromise={() => import('sentry/views/onboarding/onboarding')}
+          componentPromise={() => import('sentry/views/onboarding/onboardingController')}
           component={SafeLazyLoad}
         />
       </Route>

+ 1 - 0
static/app/types/hooks.tsx

@@ -195,6 +195,7 @@ export type InterfaceChromeHooks = {
 export type OnboardingHooks = {
   'onboarding-wizard:skip-help': GenericOrganizationComponentHook;
   'onboarding:extra-chrome': GenericComponentHook;
+  'onboarding:targeted-onboarding-header': GenericComponentHook;
 };
 
 /**

+ 7 - 1
static/app/utils/analytics/growthAnalyticsEvents.tsx

@@ -58,9 +58,13 @@ export type GrowthEventParameters = {
   'growth.demo_modal_clicked_signup': {};
   'growth.dismissed_mobile_prompt_banner': MobilePromptBannerParams;
   'growth.issue_open_in_discover_btn_clicked': {};
+  'growth.onboarding_clicked_instrument_app': {source?: string};
+  'growth.onboarding_clicked_skip': {source?: string};
   'growth.onboarding_load_choose_platform': {};
   'growth.onboarding_set_up_your_project': PlatformParam;
-  'growth.onboarding_start_onboarding': {};
+  'growth.onboarding_start_onboarding': {
+    source?: string;
+  };
   'growth.onboarding_take_to_error': {};
   'growth.onboarding_view_full_docs': {};
   'growth.onboarding_view_sample_event': SampleEventParam;
@@ -119,9 +123,11 @@ export const growthEventMap: Record<GrowthAnalyticsKey, string> = {
   'growth.platformpicker_category': 'Growth: Onboarding Platform Category',
   'growth.platformpicker_search': 'Growth: Onboarding Platform Search',
   'growth.onboarding_start_onboarding': 'Growth: Onboarding Start Onboarding',
+  'growth.onboarding_clicked_skip': 'Growth: Onboarding Clicked Skip',
   'growth.onboarding_take_to_error': 'Growth: Onboarding Take to Error',
   'growth.onboarding_view_full_docs': 'Growth: Onboarding View Full Docs',
   'growth.onboarding_view_sample_event': 'Growth: Onboarding View Sample Event',
+  'growth.onboarding_clicked_instrument_app': 'Growth: Onboarding Clicked Instrument App',
   'invite_request.approved': 'Invite Request Approved',
   'invite_request.denied': 'Invite Request Denied',
   'growth.demo_modal_clicked_signup': 'Growth: Demo Modal Clicked Signup',

+ 35 - 0
static/app/views/onboarding/onboardingController.tsx

@@ -0,0 +1,35 @@
+import {ComponentPropsWithoutRef} from 'react';
+
+import withExperiment from 'sentry/utils/withExperiment';
+import withOrganization from 'sentry/utils/withOrganization';
+
+import TargetedOnboarding from './targetedOnboarding/onboarding';
+import Onboarding from './onboarding';
+
+type Props = Omit<ComponentPropsWithoutRef<typeof Onboarding>, 'projects'> & {
+  experimentAssignment: 0 | 1;
+  logExperiment: () => void;
+};
+
+function OnboardingController({experimentAssignment, ...rest}: Props) {
+  /*
+  TODO: enable logExperiment after testing & launch
+  useEffect(() => {
+    logExperiment({
+      key: 'TargetedOnboardingWelcomePageExperiment',
+      organization: rest.organization,
+    });
+  }, []);
+  */
+  if (rest.params.step === 'welcome' && experimentAssignment) {
+    return <TargetedOnboarding />;
+  }
+  return <Onboarding {...rest} />;
+}
+
+export default withOrganization(
+  withExperiment(OnboardingController, {
+    experiment: 'TargetedOnboardingWelcomePageExperiment',
+    injectLogExperiment: true,
+  })
+);

+ 319 - 0
static/app/views/onboarding/targetedOnboarding/components/welcomeBackground.tsx

@@ -0,0 +1,319 @@
+import * as React from 'react';
+import {keyframes} from '@emotion/react';
+import styled from '@emotion/styled';
+import {motion} from 'framer-motion';
+import random from 'lodash/random';
+
+import testableTransition from 'sentry/utils/testableTransition';
+
+const Light = styled(motion.g)`
+  transform-box: fill-box;
+`;
+
+Light.defaultProps = {
+  initial: {
+    originX: '50%',
+    originY: '0',
+  },
+  animate: {
+    rotate: [-5, 8, -5],
+    transition: testableTransition({
+      duration: 3,
+      repeat: Infinity,
+      repeatType: 'loop',
+    }),
+  },
+};
+
+const fallingKeyframes = keyframes`
+  0%,  100% {
+    opacity: 1;
+    transform: translateY(0);
+  }
+  30% {
+    transform: translateY(15px);
+  }
+  40% {
+    opacity: 0;
+  }
+  60% {
+    transform: translateY(0);
+  }
+`;
+
+const StarGroup = styled(motion.g)`
+  > g {
+    animation-name: ${fallingKeyframes};
+  }
+`;
+
+StarGroup.defaultProps = {
+  onAnimationEnd: (e: React.AnimationEvent) => {
+    if (!(e.target instanceof SVGGElement)) {
+      return;
+    }
+    const style = e.target.style;
+    const delay = random(3000, 10000);
+
+    const restart = () => {
+      style.animation = `${fallingKeyframes.name} ${random(3000, 8000)}ms`;
+    };
+
+    style.animation = 'none';
+    setTimeout(restart, delay);
+  },
+};
+
+const WelcomeBackground = () => (
+  <Container>
+    <Compass xmlns="http://www.w3.org/2000/svg" width="150" viewBox="0 0 143.7 123.4">
+      <path
+        d="M141 47c-2-10-18-22-26-26s-21-9-40-8-31 8-31 8l-2-1c7-5 8-11 8-13s-4-6-13-6-22 2-29 9-10 19 0 21 24-4 24-4l4 2-7 11-7 28c-2 17 5 26 12 33 8 8 32 23 68 19 29-3 34-15 37-18s3-10 3-10l1-32c0-6 0-7-2-13ZM39 15s-8 1-9 7l1 1s-10 3-16 2-9-2-6-8S22 7 22 7a49 49 0 0 1 14-2c7-1 9 2 9 3s0 5-4 10Z"
+        fill="#fff"
+      />
+      <path
+        d="m20 79 7-18s7 38 67 38c30 1 44-13 50-27l-1 27s-10 21-44 24c-30 3-72-11-79-44Z"
+        fill="#b29dd2"
+        opacity=".5"
+      />
+      <path d="M31 23a10 10 0 0 1 4-5s6 6 6 6a36 36 0 0 0-5 4Z" fill="#e7e1ec" />
+      <path
+        d="M31 26s-13 3-22 0c-9-4 0-12 5-15a36 36 0 0 1 29-4c2 0 4 2 3 0-1-3-6-5-15-4-7 0-18 5-22 8-7 5-11 11-8 16 2 7 13 6 17 5s11-3 13-6Zm7 29s-4-12 9-24 38-10 55-5c20 6 29 19 30 26 2 6 0 13 0 13s-3-19-21-27c-19-8-33-8-44-6s-20 7-29 23Z"
+        fill="#b29dd2"
+        opacity=".5"
+      />
+      <path fill="#ebb432" d="M62 33v17l21-9-21-8zm35 41 18-9 2 15-20-6z" />
+      <path
+        fill="#e1557a"
+        d="m102 48 5 5 6-1 6-3-1-4-4-4-6 1-5 1-1 5zM52 72l1-5 5-2h7l4 4-1 5-5 3h-5l-6-5z"
+      />
+      <path
+        d="M12 32a17 17 0 0 1-6-1c-3-1-5-3-6-7 0-5 4-12 11-17 10-7 25-8 31-6 6 1 9 4 9 7s-4 8-8 12a1 1 0 0 1-1 0 1 1 0 0 1 0-1c5-4 8-9 8-11 0-3-3-5-8-6-6-2-21 0-30 6C5 12 1 19 1 24c1 3 2 5 5 6 10 4 28-5 29-5a1 1 0 0 1 0 1c-1 0-13 6-23 6Z"
+        fill="#2f1d4a"
+      />
+      <path
+        d="M16 26c-5 0-8-2-9-5a1 1 0 0 1 1 0c0 3 4 4 9 4 11-1 16-3 16-3a3 3 0 0 1 2 0 3 3 0 0 1 1 1 1 1 0 0 1 0 1 2 2 0 0 0-1-1 2 2 0 0 0-1 0l-17 3Zm-7-8H8a1 1 0 0 1 0-1c3-5 10-10 17-11 8-2 18-3 20 1 2 2 0 6-2 9a1 1 0 0 1-1 1v-1c1-2 4-7 2-9-2-3-11-2-18 0-8 1-14 6-17 11Z"
+        fill="#2f1d4a"
+      />
+      <path
+        d="M30 23a1 1 0 0 1-1-1s2-7 10-8l5 7a1 1 0 0 1 0 1 1 1 0 0 1-1 0l-4-7c-8 1-9 7-9 7a1 1 0 0 1 0 1Zm6 6a1 1 0 0 1-1 0l-1-1v-1l2 1a1 1 0 0 1 0 1Z"
+        fill="#2f1d4a"
+      />
+      <path
+        d="M94 98a119 119 0 0 1-22-3c-42-7-46-40-46-40-1-9 3-23 16-33 10-8 28-12 47-9a80 80 0 0 1 11 2 1 1 0 0 1 0 1 1 1 0 0 1-1 0 78 78 0 0 0-10-2c-19-3-36 1-47 9a37 37 0 0 0-15 32s4 32 45 39c35 7 51-2 60-10 13-11 12-31 7-41s-18-19-34-25v-1c16 6 30 16 35 26a36 36 0 0 1 3 25c-2 7-6 13-10 17-7 6-19 13-39 13Z"
+        fill="#2f1d4a"
+      />
+      <path
+        d="M89 90a98 98 0 0 1-11-1c-6-1-23-5-33-17-8-8-10-21-9-26 1-6 5-12 11-17 8-6 19-9 32-9 31 0 49 17 52 23 5 7 10 21-3 35-9 10-27 12-39 12ZM79 21c-14 0-39 5-42 25-1 5 1 18 9 26 10 11 26 15 32 16 0 0 35 5 49-11 13-13 8-26 4-33-4-6-21-23-52-23Z"
+        fill="#2f1d4a"
+      />
+      <path
+        d="M85 58a10 10 0 0 1-2 0 7 7 0 0 1-4-3 4 4 0 0 1-1-3c1-2 5-3 8-2 5 1 4 5 4 5a3 3 0 0 1-1 2 7 7 0 0 1-4 1Zm-1-8-5 2a3 3 0 0 0 1 3 6 6 0 0 0 3 2 7 7 0 0 0 5 0 2 2 0 0 0 1-2c0-1 1-3-3-4a7 7 0 0 0-2-1Zm-5 2Z"
+        fill="#2f1d4a"
+      />
+      <path
+        d="m89 53-3-16-6 15a1 1 0 0 1-1-1l7-16h1l3 18a1 1 0 0 1-1 0Zm26 29-23-8 20-10a1 1 0 0 1 1 1l3 16-1 1Zm-21-8 20 7-2-15ZM60 50l-1-15v-1a1 1 0 0 1 1 0l20 7h1l-1 1-19 8h-1Zm0-15 1 14 18-8Z"
+        fill="#2f1d4a"
+      />
+      <path
+        d="M133 71h-1v-1c1-4 2-9-4-18s-18-17-31-21c-21-5-39 0-48 6-6 5-9 10-10 14a1 1 0 0 1-1 0c1-4 4-10 11-15 9-6 27-11 48-6 14 4 26 12 32 22 6 9 5 14 4 19Zm10 3a1 1 0 0 1-1 0l1-14a1 1 0 1 1 1 0l-1 14Zm-1 11v-4a1 1 0 0 1 1 0v4h-1Z"
+        fill="#2f1d4a"
+      />
+      <path
+        d="M91 121c-17 0-35-4-51-14-12-9-16-19-18-26a33 33 0 0 1-1-13l7-28h1l-7 28s-4 22 19 38c21 15 49 16 67 13 16-3 32-12 33-26v-4a1 1 0 0 1 1-1 1 1 0 0 1 0 1v4c-1 15-18 24-33 27a99 99 0 0 1-18 1Z"
+        fill="#2f1d4a"
+      />
+      <path
+        d="M93 103h-4c-21-1-38-7-51-19a40 40 0 0 1-13-29 1 1 0 0 1 1 0 39 39 0 0 0 13 28c12 12 29 18 50 19 23 1 49-9 53-28a1 1 0 0 1 1-1 1 1 0 0 1 0 1c-2 9-8 16-19 22-9 4-20 7-31 7Z"
+        fill="#2f1d4a"
+      />
+      <path
+        d="M45 59a1 1 0 0 1 0-1h6a1 1 0 0 1 1 0 1 1 0 0 1-1 1h-6Zm7-13-5-2a1 1 0 0 1 1-1l5 2a1 1 0 0 1-1 1Zm30-10a1 1 0 0 1-1 0v-4a1 1 0 0 1 1 0v4Zm15 3h-1a1 1 0 0 1 0-1l3-3a1 1 0 0 1 0 1l-2 3Zm21 17a1 1 0 0 1 0-1l6-1a1 1 0 0 1 0 1l-6 1Zm8 11-6-2a1 1 0 0 1-1-1 1 1 0 0 1 1 0l6 2v1ZM97 84a1 1 0 0 1-1 0l-2-4a1 1 0 0 1 0-1h1l2 4a1 1 0 0 1 0 1Zm-26-3a1 1 0 0 1-1-1l3-4a1 1 0 0 1 1 1l-3 3a1 1 0 0 1 0 1Zm-10-4-6-1a1 1 0 0 1-1 0l-5-4 1-6a1 1 0 0 1 1 0l6-3 6 1 1 1 4 3a1 1 0 0 1 0 1l-1 5h-1l-5 3Zm-6-2 6 1 5-3 1-4-4-4-6-1-6 3-1 5Zm50-23h-1l-5-4a1 1 0 0 1 0-1l1-4 6-3 6 1 5 3v5l-5 3a1 1 0 0 1-1 0h-6Zm-5-5 5 4h6l5-3v-3l-4-3-6-1-5 3Z"
+        fill="#2f1d4a"
+      />
+      <path fill="#2f1d4a" d="m54 71 1 1 4-2-1-1-4 2z" />
+      <ellipse cx="61.4" cy="68.2" rx="1.4" ry="1" fill="#2f1d4a" />
+      <ellipse cx="105.1" cy="47.1" rx="1.4" ry="1" fill="#2f1d4a" />
+      <path fill="#2f1d4a" d="m107 45 5-2 2 1-5 2-2-1zm-41-4-4-3h2l3 3h-1z" />
+      <ellipse cx="68.1" cy="42.6" rx="1.4" ry="1" fill="#2f1d4a" />
+      <path fill="#2f1d4a" d="m107 74 3 4 2-1-4-4-1 1z" />
+      <ellipse cx="105.2" cy="71.4" rx="1.4" ry="1" fill="#2f1d4a" />
+      <path d="M83 58a6 6 0 0 1-4-3l2 24 8-22-6 1Z" fill="#2f1d4a" />
+      <path
+        d="m81 79-2-24a1 1 0 0 1 1 0 6 6 0 0 0 3 2c3 1 5 0 6-1a1 1 0 0 1 1 1l-8 22a1 1 0 0 1-1 0Zm-1-22 2 19 6-18a8 8 0 0 1-5 0 7 7 0 0 1-3-1Z"
+        fill="#2f1d4a"
+      />
+    </Compass>
+    <Log xmlns="http://www.w3.org/2000/svg" width="225" viewBox="0 0 243.3 103.5">
+      <path
+        d="M13 51s-3 6-2 20a45 45 0 0 0 7 24l14 8h154s15-7 15-36a54 54 0 0 0-2-13c-4-19-16-24-16-24h-7a16 16 0 0 0 1-12l-5-4a17 17 0 0 0-8 1l-15 14-116 1s-12 5-20 21Z"
+        fill="#fff"
+      />
+      <path fill="#ebb432" d="m81 19 16 4-4-18-12 14z" />
+      <path fill="#e1557a" d="m121 1-4 16 17-2-13-14z" />
+      <path fill="#f58452" d="m54 20 3-15 14 8-17 7z" />
+      <path
+        d="m52 32 96 1-9 24a2 2 0 0 1-3 0l-4-5-8 17a2 2 0 0 1-4 0l-9-27-10 19a2 2 0 0 1-4 0L85 40 69 55a2 2 0 0 1-3-1c-2-6-5-18-14-22Zm121 12 8 16 7-14 6 7 4-9s-4-8-9-11h-12Z"
+        fill="#b29dd2"
+        opacity=".5"
+      />
+      <path
+        d="M243 104H0a1 1 0 0 1 0-1h243a1 1 0 0 1 1 0 1 1 0 0 1-1 1Z"
+        fill="#2f1d4a"
+      />
+      <path
+        d="M16 104a1 1 0 0 1-1-1 61 61 0 0 0-3-7 29 29 0 0 0-1 5 1 1 0 0 1-1 0l-5-9a48 48 0 0 0 3 9 1 1 0 0 1 0 1H7a74 74 0 0 0-6-6 76 76 0 0 0 5 7 1 1 0 0 1-1 0l-5-8a1 1 0 0 1 0-1l6 5c-2-7-1-8-1-8l5 8 2-4 4 8a1 1 0 0 1 0 1Zm-4-8Zm38 8a1 1 0 0 1 0-1c5-2 10-8 11-11s4-18 3-24-2-23-9-30-22-8-22-8c-2 0-19 13-21 26-2 10-1 19 1 27l5 10 11 7a1 1 0 0 1 0 1c-1 0-10-5-11-7-1-1-11-14-7-38 2-13 19-27 22-27 0 0 15 1 23 8s9 25 10 31-3 22-4 25c-2 2-6 9-12 11Z"
+        fill="#2f1d4a"
+      />
+      <path
+        d="m45 100-14-1-12-8c-2-2-6-21-6-30 0-10 13-27 22-27s18 6 20 8 6 16 6 20v21c-1 6-6 14-10 16a1 1 0 0 1 0-1c4-2 8-10 9-15V62c0-4-5-18-6-20-1-1-11-7-19-7S14 52 14 61s4 27 6 29l11 8 16 1a1 1 0 0 1 0 1h-2Z"
+        fill="#2f1d4a"
+      />
+      <path
+        d="M55 60a1 1 0 0 1 0-1s-2-11-8-16c-6-4-13-1-13-1a1 1 0 0 1 0-1s7-4 13 1c7 5 8 16 9 17a1 1 0 0 1-1 1ZM41 93a17 17 0 0 1-4-1c-6-1-15-9-16-14s-3-13 0-21 9-13 9-14a1 1 0 0 1 1 0v1s-7 6-9 13-1 17 0 21 9 12 15 13h9a4 4 0 0 0 2 0l7-7a52 52 0 0 0 0-5 1 1 0 0 1 1-1 1 1 0 0 1 0 1 52 52 0 0 1 0 5c-1 3-5 6-7 7a5 5 0 0 1-3 1l-5 1Z"
+        fill="#2f1d4a"
+      />
+      <path
+        d="M39 85a5 5 0 0 1-1 0c-4-1-10-8-11-13s3-16 5-19c1-2 5-5 8-5 2 0 6 3 7 7 0 0 4 18 0 27-1 0-5 3-8 3Zm0-36-7 4c-1 4-5 15-4 19 1 5 7 11 10 12s7-2 8-3c4-9 0-26 0-26-1-4-5-6-7-6Zm7 32Z"
+        fill="#2f1d4a"
+      />
+      <path
+        d="M40 72a4 4 0 0 1-2-1 1 1 0 0 1 1 0 3 3 0 0 0 2 0l1-6c0-2-2-4-3-4a5 5 0 0 0-2 2 19 19 0 0 0 0 5 1 1 0 1 1-1 0v-5a6 6 0 0 1 2-3 2 2 0 0 1 2 0l3 5c0 3 0 7-2 7a3 3 0 0 1-1 0Zm32-3H61a1 1 0 0 1 0-1h11a1 1 0 0 1 1 0 1 1 0 0 1-1 1Zm7 10h-4a1 1 0 0 1 0-1h4a1 1 0 0 1 1 0 1 1 0 0 1-1 1Zm14 5h-8a1 1 0 1 1 0-1h8l9-2a1 1 0 0 1 0 1ZM82 96l-9-1h-1a1 1 0 0 1 1-1l9 1h1a1 1 0 0 1-1 1Zm58 1-15-1-6-3-12 4a1 1 0 0 1-1-1l13-4 6 3 15 1a1 1 0 0 1 0 1Zm43-21h-8a1 1 0 0 1 0-1h8a1 1 0 0 1 0 1Zm-37 0h-17a1 1 0 0 1 0-1h17l12-3 8 3h5a1 1 0 0 1 0 1h-5l-8-3-12 3Zm10 9h-16a1 1 0 0 1-1-1 1 1 0 0 1 1 0h16a1 1 0 1 1 0 1Zm19 8v-1l12-1a1 1 0 0 1 0 1l-12 1Zm7-63h-6a1 1 0 0 1 0-1h6a1 1 0 0 1 0 1Zm-37 0H33a1 1 0 0 1 0-1h112a1 1 0 0 1 0 1Z"
+        fill="#2f1d4a"
+      />
+      <path
+        d="M168 51h-1a1 1 0 0 1 0-1l10-23c2-4 1-7 0-8a8 8 0 0 0-6-4 13 13 0 0 0-7 0l-21 21a1 1 0 0 1-1 0v-1l22-21a13 13 0 0 1 7 0 9 9 0 0 1 7 4c1 2 2 5 0 10l-10 23Z"
+        fill="#2f1d4a"
+      />
+      <path
+        d="M172 30a10 10 0 0 1-2 0c-2 0-5-2-7-6-1-4 1-9 1-9a1 1 0 1 1 1 0s-2 5-1 9c2 4 4 5 6 5s6 1 8-4v-1a1 1 0 0 1 1 1 6 6 0 0 1-7 5Z"
+        fill="#2f1d4a"
+      />
+      <path
+        d="M169 27s-4-2-4-7a4 4 0 0 1 3-3 7 7 0 0 1 5 0c2 2 3 5 1 8a1 1 0 0 1 0-1c1-2 0-4-2-6a6 6 0 0 0-4 0 3 3 0 0 0-2 2 5 5 0 0 0 4 6l-1 1Z"
+        fill="#2f1d4a"
+      />
+      <path
+        d="M171 24a2 2 0 0 1-3-2 2 2 0 0 1 1-2 2 2 0 0 1 1 0 1 1 0 0 1 0 1 1 1 0 0 0-1 1 1 1 0 0 0 2 1 1 1 0 0 1 0 1Zm15 80v-1s8-6 11-13a63 63 0 0 0 3-23 74 74 0 0 0-5-23c-3-8-11-13-12-13a1 1 0 0 1 0-1 1 1 0 0 1 1 0s9 6 12 14a75 75 0 0 1 5 23 65 65 0 0 1-3 23c-3 8-11 13-11 13l-1 1Z"
+        fill="#2f1d4a"
+      />
+      <path
+        d="M200 60h-6a1 1 0 0 1 0-1h6a1 1 0 0 1 1 0 1 1 0 0 1-1 1Zm-2 27h-8a1 1 0 0 1 0-1h8a1 1 0 0 1 1 1 1 1 0 0 1-1 0Zm-20-29a2 2 0 0 1-1 0l-6-11a1 1 0 1 1 1 0l6 10a1 1 0 0 0 1 0l6-12h1l5 7 4-9h1l-4 9a1 1 0 0 1-1 1 1 1 0 0 1-1-1l-5-6-5 12a2 2 0 0 1-2 0Zm-59 13a2 2 0 0 1-2-1l-9-28-11 19a2 2 0 0 1-1 1 2 2 0 0 1-1-1L82 40h-1L67 54a1 1 0 1 1-1-1l14-14a2 2 0 0 1 3 0l12 21a1 1 0 0 0 1 1 1 1 0 0 0 1-1l10-18a1 1 0 0 1 1-1 1 1 0 0 1 1 1l9 28a1 1 0 0 0 2 0l11-21a1 1 0 0 1 0-1l5 7v-1l6-16h1l-6 17a1 1 0 0 1-2 0l-4-5-11 20a2 2 0 0 1-1 1Zm33-29v-1l6-7a1 1 0 1 1 1 1l-6 7a1 1 0 0 1-1 0Zm5 4h-1v-1l2-3a1 1 0 0 1 1 0 1 1 0 0 1 0 1l-2 3Zm-92-4a2 2 0 0 1 0-1 4 4 0 0 1-3-2 3 3 0 0 1 1-3 2 2 0 0 1 3 0 3 3 0 0 1 1 3 3 3 0 0 1-1 2 1 1 0 0 1-1 1Zm-2-3a3 3 0 0 0 2 2 2 2 0 0 0 1-2 2 2 0 0 0-1-2 1 1 0 0 0-1 0 2 2 0 0 0-1 2Zm8 5a2 2 0 0 1-1 0l-2-2a1 1 0 0 1 1-1 3 3 0 0 1 2 0c1 0 2 1 1 2a2 2 0 0 1-1 1Zm-1-2a1 1 0 0 0-1 0l2 1h1l-1-1a4 4 0 0 0-1 0Zm30-6-3-1a1 1 0 0 1 0-1l4-2a6 6 0 0 1 3 1 1 1 0 0 1 1 1l-3 2a7 7 0 0 1-2 0Zm-2-1h3a4 4 0 0 0 3-1 5 5 0 0 0-3-1l-3 1v1Z"
+        fill="#2f1d4a"
+      />
+      <path
+        d="M120 50a3 3 0 0 1-2-1 2 2 0 0 1 0-2 2 2 0 0 1 2-1 1 1 0 0 1 0 1 1 1 0 0 0-2 0 1 1 0 0 0 0 1 2 2 0 0 0 2 1 1 1 0 0 0 1 0 1 1 0 0 0 0-1 1 1 0 0 1 1 0 2 2 0 0 1-1 1 2 2 0 0 1-1 1Zm15-11 1 2 1-2h-2Zm1-2a2 2 0 0 1-1-1 1 1 0 0 1 0-1h1l1 1a1 1 0 0 0 1-1 1 1 0 0 0-1-1l-1 1a1 1 0 0 1-1 0v-1a2 2 0 0 1 3-1 2 2 0 0 1 1 2 2 2 0 0 1-2 2 3 3 0 0 1-1 0Zm82 67a1 1 0 0 1-1-1 44 44 0 0 0 5-6 46 46 0 0 0-7 4 1 1 0 0 1 0-1 21 21 0 0 0 2-5 41 41 0 0 0-6 6 1 1 0 0 1-1-1l3-9-6 9a1 1 0 0 1-1 0 45 45 0 0 0-1-8 37 37 0 0 0-1 8 1 1 0 0 1-1 0l1-9a1 1 0 0 1 1 0l2 7 6-8a1 1 0 0 1 1 0l-2 8 6-4a1 1 0 0 1 0 1l-1 4 6-3a1 1 0 0 1 1 1l-6 6v1ZM67 30a1 1 0 0 1-1 0s-1-9-6-14a1 1 0 1 1 1-1c5 6 6 14 6 15Z"
+        fill="#2f1d4a"
+      />
+      <path
+        d="M52 19a1 1 0 0 1 0-1l2-13a1 1 0 0 1 1 0l13 7 1 1a1 1 0 0 1-1 0l-16 6Zm3-13-2 12 14-5Zm40 15-15-4a1 1 0 0 1-1 0L91 4a1 1 0 0 1 1 0l4 17h-1Zm-14-4 14 3-4-15Zm34-1v-1l3-15h1l13 13a1 1 0 0 1 0 1l-17 2Zm4-14-3 13 15-2Z"
+        fill="#2f1d4a"
+      />
+      <path
+        d="M125 30a75 75 0 0 0-2-15 1 1 0 0 1 0-1l1 1a76 76 0 0 1 2 15h-1Zm-40 0a1 1 0 0 1-1 0 59 59 0 0 1 2-12 1 1 0 0 1 1 0v1a60 60 0 0 0-2 11ZM58 11l-2-3h1l2 3h-1z"
+        fill="#2f1d4a"
+      />
+      <ellipse cx="59.2" cy="12.8" rx="1" ry=".8" fill="#2f1d4a" />
+      <path fill="#2f1d4a" d="m88 13 1-4h2l-2 5-1-1z" />
+      <ellipse
+        cx="87.8"
+        cy="15.6"
+        rx="1.2"
+        ry="1.1"
+        transform="rotate(-8 88 16)"
+        fill="#2f1d4a"
+      />
+      <path fill="#2f1d4a" d="m122 9-2-4h1l1 4z" />
+      <ellipse
+        cx="122.9"
+        cy="11.4"
+        rx="1"
+        ry="1.2"
+        transform="rotate(-71 123 11)"
+        fill="#2f1d4a"
+      />
+    </Log>
+  </Container>
+);
+
+export default WelcomeBackground;
+
+const Illustration = styled(motion.svg)`
+  position: absolute;
+  /* Important is needed to override our root SVG rule.
+   * We disable clipping to allow some of the background
+   * to animate outside of the illustration during transitions */
+  overflow: visible !important;
+`;
+
+const Compass = styled(Illustration)`
+  left: -15px;
+  top: 107px;
+`;
+
+Compass.defaultProps = {
+  variants: {
+    initial: {
+      opacity: 0,
+      scale: 0.9,
+    },
+    animate: {
+      opacity: 1,
+      scale: 1,
+      transition: testableTransition({duration: 0.5}),
+    },
+    exit: {y: -120, opacity: 0},
+  },
+  transition: testableTransition({
+    duration: 0.9,
+  }),
+};
+
+const Log = styled(Illustration)`
+  right: -60px;
+  bottom: 0;
+`;
+
+Log.defaultProps = {
+  variants: {
+    initial: {
+      opacity: 0,
+      scale: 0.9,
+    },
+    animate: {
+      opacity: 1,
+      scale: 1,
+      transition: testableTransition({duration: 0.5}),
+    },
+    exit: {y: -200, opacity: 0},
+  },
+  transition: testableTransition({
+    duration: 1.1,
+  }),
+};
+
+const Container = styled(motion.div)`
+  pointer-events: none;
+  width: 100vw;
+  height: 80vh;
+  min-width: 200px;
+  max-width: 1000px;
+  min-height: 800px;
+  max-height: 900px;
+
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  transform: translate(-50%, -50%);
+
+  @media (max-width: ${p => p.theme.breakpoints[0]}) {
+    display: none;
+  }
+`;
+Container.defaultProps = {
+  variants: {
+    animate: {},
+    exit: {},
+  },
+  transition: testableTransition({staggerChildren: 0.2}),
+};

+ 84 - 0
static/app/views/onboarding/targetedOnboarding/onboarding.tsx

@@ -0,0 +1,84 @@
+import * as React from 'react';
+import styled from '@emotion/styled';
+import {AnimatePresence, useAnimation} from 'framer-motion';
+
+import Hook from 'sentry/components/hook';
+import LogoSentry from 'sentry/components/logoSentry';
+import SentryDocumentTitle from 'sentry/components/sentryDocumentTitle';
+import {t} from 'sentry/locale';
+import space from 'sentry/styles/space';
+import PageCorners from 'sentry/views/onboarding/components/pageCorners';
+
+import TargetedOnboardingWelcome from './welcome';
+
+export default function Onboarding() {
+  const cornerVariantControl = useAnimation();
+  const updateCornerVariant = () => {
+    cornerVariantControl.start('top-right');
+  };
+
+  // XXX(epurkhiser): We're using a react hook here becuase there's no other
+  // way to create framer-motion controls than by using the `useAnimation`
+  // hook.
+
+  React.useEffect(updateCornerVariant, []);
+  return (
+    <OnboardingWrapper data-test-id="targeted-onboarding">
+      <SentryDocumentTitle title={t('Welcome')} />
+      <Header>
+        <LogoSvg />
+        <HeaderRight>
+          <Hook name="onboarding:targeted-onboarding-header" />
+        </HeaderRight>
+      </Header>
+      <Container>
+        <AnimatePresence exitBeforeEnter onExitComplete={updateCornerVariant}>
+          <TargetedOnboardingWelcome />
+        </AnimatePresence>
+        <PageCorners animateVariant={cornerVariantControl} />
+      </Container>
+    </OnboardingWrapper>
+  );
+}
+
+const OnboardingWrapper = styled('main')`
+  overflow: hidden;
+  display: flex;
+  flex-direction: column;
+  flex-grow: 1;
+`;
+
+const Container = styled('div')`
+  display: flex;
+  justify-content: center;
+  position: relative;
+  background: ${p => p.theme.background};
+  padding: 120px ${space(3)};
+  padding-top: 12vh;
+  width: 100%;
+  margin: 0 auto;
+  flex-grow: 1;
+`;
+
+const Header = styled('header')`
+  background: ${p => p.theme.background};
+  padding: ${space(4)};
+  position: sticky;
+  top: 0;
+  z-index: 100;
+  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.05);
+  display: flex;
+  justify-content: space-between;
+`;
+
+const LogoSvg = styled(LogoSentry)`
+  width: 130px;
+  height: 30px;
+  color: ${p => p.theme.textColor};
+`;
+const HeaderRight = styled('div')`
+  display: grid;
+  grid-auto-flow: column;
+  grid-auto-columns: max-content;
+  gap: ${space(1)};
+`;

+ 261 - 0
static/app/views/onboarding/targetedOnboarding/welcome.tsx

@@ -0,0 +1,261 @@
+import * as React from 'react';
+import {browserHistory} from 'react-router';
+import styled from '@emotion/styled';
+import {motion, MotionProps} from 'framer-motion';
+
+import OnboardingInstall from 'sentry-images/spot/onboarding-install.svg';
+import OnboardingPreview from 'sentry-images/spot/onboarding-preview.svg';
+import OnboardingSetup from 'sentry-images/spot/onboarding-setup.svg';
+
+import {openInviteMembersModal} from 'sentry/actionCreators/modal';
+import Button from 'sentry/components/button';
+import DemoSandboxButton from 'sentry/components/demoSandboxButton';
+import Link from 'sentry/components/links/link';
+import {t, tct} from 'sentry/locale';
+import space from 'sentry/styles/space';
+import {Organization} from 'sentry/types';
+import trackAdvancedAnalyticsEvent from 'sentry/utils/analytics/trackAdvancedAnalyticsEvent';
+import testableTransition from 'sentry/utils/testableTransition';
+import withOrganization from 'sentry/utils/withOrganization';
+import FallingError from 'sentry/views/onboarding/components/fallingError';
+
+import WelcomeBackground from './components/welcomeBackground';
+
+const easterEggText = [
+  t('Be careful. She’s barely hanging on as it is.'),
+  t("You know this error's not real, right?"),
+  t("It's that big button, right up there."),
+  t('You could do this all day. But you really shouldn’t.'),
+  tct("Ok, really, that's enough. Click [start:Start].", {start: <em />}),
+  tct("Next time you do that, [bold:we're starting].", {bold: <strong />}),
+  t("We weren't kidding, let's get going."),
+];
+
+const fadeAway: MotionProps = {
+  variants: {
+    initial: {opacity: 0},
+    animate: {opacity: 1, filter: 'blur(0px)'},
+    exit: {opacity: 0, filter: 'blur(1px)'},
+  },
+  transition: testableTransition({duration: 0.8}),
+};
+
+type TextWrapperProps = {
+  cta: React.ReactNode;
+  src: string;
+  subText: React.ReactNode;
+  title: React.ReactNode;
+};
+
+function InnerAction({title, subText, cta, src}: TextWrapperProps) {
+  return (
+    <React.Fragment>
+      <ActionImage src={src} />
+      <TextWrapper>
+        <ActionTitle>{title}</ActionTitle>
+        <SubText>{subText}</SubText>
+      </TextWrapper>
+      <ButtonWrapper>{cta}</ButtonWrapper>
+    </React.Fragment>
+  );
+}
+
+type Props = {
+  organization: Organization;
+};
+
+function TargetedOnboardingWelcome({organization}: Props) {
+  const source = 'targeted_onboarding';
+  React.useEffect(() => {
+    trackAdvancedAnalyticsEvent('growth.onboarding_start_onboarding', {
+      organization,
+      source,
+    });
+  });
+
+  const onComplete = () => {
+    trackAdvancedAnalyticsEvent('growth.onboarding_clicked_instrument_app', {
+      organization,
+      source,
+    });
+
+    browserHistory.push(`/onboarding/${organization.slug}/select-platform/`);
+  };
+  return (
+    <FallingError onFall={fallCount => fallCount >= easterEggText.length && onComplete()}>
+      {({fallingError, fallCount}) => (
+        <Wrapper>
+          <WelcomeBackground />
+          <motion.h1 {...fadeAway}>{t('Welcome to Sentry')}</motion.h1>
+          <SubHeaderText {...fadeAway}>
+            {t('Your code is probably broken. Maybe not.')}
+            <br />
+            {t('Find out for sure. Get started below.')}
+          </SubHeaderText>
+          <ActionItem>
+            <InnerAction
+              title={t('Install Sentry')}
+              subText={t(
+                'Select your lanaguages or frameworks and install the SDKs to start tracking issues'
+              )}
+              src={OnboardingInstall}
+              cta={
+                <React.Fragment>
+                  <ButtonWithFill
+                    onClick={() => {
+                      // triggerFall();
+                      onComplete();
+                    }}
+                    priority="primary"
+                  >
+                    {t('Start')}
+                  </ButtonWithFill>
+                  <PositionedFallingError>{fallingError}</PositionedFallingError>
+                </React.Fragment>
+              }
+            />
+          </ActionItem>
+          <ActionItem>
+            <InnerAction
+              title={t('Setup my team')}
+              subText={tct(
+                'Invite [friends] coworkers. You shouldn’t have to fix what you didn’t break',
+                {friends: <Strike>{t('friends')}</Strike>}
+              )}
+              src={OnboardingSetup}
+              cta={
+                <ButtonWithFill
+                  onClick={() => {
+                    openInviteMembersModal({source});
+                  }}
+                  priority="primary"
+                >
+                  {t('Invite Team')}
+                </ButtonWithFill>
+              }
+            />
+          </ActionItem>
+          {!organization.features.includes('sandbox-kill-switch') && (
+            <ActionItem>
+              <InnerAction
+                title={t('Preview before you (git) commit')}
+                subText={t(
+                  'Check out sample issue reports, transactions, and tour all of Sentry '
+                )}
+                src={OnboardingPreview}
+                cta={
+                  <SandboxBtnWithFill
+                    scenario="oneIssue"
+                    priority="primary"
+                    {...{source}}
+                  >
+                    {t('Explore')}
+                  </SandboxBtnWithFill>
+                }
+              />
+            </ActionItem>
+          )}
+          <motion.p style={{margin: 0}}>
+            {[t("Gee, I've used Sentry before."), ...easterEggText][fallCount]}
+            <br />
+            <Link
+              onClick={() =>
+                trackAdvancedAnalyticsEvent('growth.onboarding_clicked_skip', {
+                  organization,
+                  source,
+                })
+              }
+              to={`/organizations/${organization.slug}/issues/`}
+            >
+              {t('Skip onboarding.')}
+            </Link>
+          </motion.p>
+        </Wrapper>
+      )}
+    </FallingError>
+  );
+}
+
+export default withOrganization(TargetedOnboardingWelcome);
+
+const PositionedFallingError = styled('span')`
+  display: block;
+  position: absolute;
+  right: 0px;
+  top: 30px;
+`;
+
+const Wrapper = styled(motion.div)`
+  max-width: 400px;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  text-align: center;
+
+  h1 {
+    font-size: 42px;
+  }
+`;
+
+const ActionItem = styled('div')`
+  min-height: 120px;
+  border-radius: ${space(0.5)};
+  padding: ${space(2)};
+  margin-bottom: ${space(2)};
+  justify-content: space-around;
+  border: 1px solid ${p => p.theme.gray200};
+  @media (min-width: ${p => p.theme.breakpoints[0]}) {
+    display: grid;
+    grid-template-columns: 125px auto 125px;
+    width: 680px;
+    align-items: center;
+  }
+  @media (max-width: ${p => p.theme.breakpoints[0]}) {
+    display: flex;
+    flex-direction: column;
+  }
+`;
+
+const TextWrapper = styled('div')`
+  text-align: left;
+  margin: auto ${space(3)};
+  min-height: 70px;
+`;
+
+const Strike = styled('span')`
+  text-decoration: line-through;
+`;
+
+const ActionTitle = styled('h5')`
+  font-weight: 500;
+  margin: 0 0 ${space(0.5)};
+  color: ${p => p.theme.gray400};
+`;
+
+const SubText = styled('span')`
+  font-weight: 400;
+  color: ${p => p.theme.gray400};
+`;
+
+const SubHeaderText = styled(motion.h6)`
+  color: ${p => p.theme.gray300};
+`;
+
+const ButtonWrapper = styled('div')`
+  margin: ${space(1)};
+  position: relative;
+`;
+
+const ActionImage = styled('img')`
+  height: 100px;
+`;
+
+const ButtonWithFill = styled(Button)`
+  width: 100%;
+  position: relative;
+  z-index: 1;
+`;
+
+const SandboxBtnWithFill = styled(DemoSandboxButton)`
+  width: 100%;
+`;

+ 35 - 0
static/images/spot/onboarding-install.svg

@@ -0,0 +1,35 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="180.5" height="155.5" viewBox="0 0 135.5 116.4">
+  <path fill="#ebb432" d="M96 104h6l-2 11-7 1 3-12z"/>
+  <path fill="#fff" d="m4 32 76 5 18 48H23l-1-1L4 32z"/>
+  <path d="M91 53a4 4 0 0 0 2 5l15-10-3-5Z" fill="#ebb432"/>
+  <path d="m70 85 29 10-2 9h6l2-10a1 1 0 0 0-1-2l-30-7Zm24-26 18 16a1 1 0 0 0 2-1l1-29-5 4-1 1 1 17-14-10-1-1-2 2Zm-5-8 2 2-2 2-1-1 1-3z" fill="#ede9f1"/>
+  <path d="m115 17 5-5 1 13 9 12-8 4-12 9s-5-2-5-6l3-4-2-1 1-2 10-5a148 148 0 0 1-2-15Z" fill="#b29dd2"/>
+  <path d="M104 34a8 8 0 0 1 1-6l9 4-7 3ZM51 64l-3-1 17-30h2L51 64zM21 82l1 2v1h1l-3 9 11 1 15-29 4 1-13 26-2 22H6a16 16 0 0 1 1-5l14-28" fill="#b29dd2"/>
+  <path d="m51 41 4-1-4 4Z" fill="#e1557a"/>
+  <path d="m27 13 6-11h15l2 14h2v-4l12 4c3 2 7 12 7 13s0 4-2 4l-19-4-9-6-13-10ZM7 20l35 5-4-3-11-8-16 2-4 4ZM2 31l3 7s-4 1-5-1 2-6 2-6Z" fill="#ebb432"/>
+  <path d="M13 29c-1 1-3 0-4-1v-4c1-1 2 0 3 1l1 4Z" fill="#e1557a"/>
+  <path d="m23 30-4-1v-4l3 1 1 4Z" fill="#ebb432"/>
+  <path d="m32 31-3-1-1-4 4 1v4Z" fill="#f58452"/>
+  <path d="M93 58a4 4 0 0 1-2-5L51 85h2Z" fill="#ede9f1"/>
+  <path d="M100 34 59 66 12 55l1 1 47 14 33-24 2 2a13 13 0 0 0 3-3l2 4 4-2a1 1 0 0 0 0-1l-1-1 5-5a1 1 0 0 0 0-1h-2l1-3a1 1 0 0 0 0-1c-2 0-6-2-7-1Z" fill="#ede9f1"/>
+  <path d="M70 34c-3 0-20-3-23-5L28 14a4 4 0 0 0-2 0l-10 1a4 4 0 0 0-3 1l-3 3a1 1 0 1 1 0-1l2-3a5 5 0 0 1 4-1l9-2a5 5 0 0 1 4 1c4 4 16 14 19 15 3 2 19 5 22 5a3 3 0 0 0 3-2l-1-5c-2-4-6-10-9-12s-8-2-12-2v-1c4 0 9 1 13 3s7 8 9 11v7a4 4 0 0 1-3 2Z" fill="#2f1d4a"/>
+  <path d="M53 20 50 6a4 4 0 0 1-4 0c-6 0-11-5-11-5V0s6 5 12 5a3 3 0 0 0 2 0 2 2 0 0 0 0-1V3a1 1 0 0 1 1 0l4 16-1 1Z" fill="#2f1d4a"/>
+  <path d="M30 10s8 7 22 5l1 3v2s-5 3-20-3l-5-3Z" fill="#2f1d4a"/>
+  <path d="m48 21-15-3h-1l-4-4 2-4a1 1 0 0 1 1 0s7 6 21 5a1 1 0 0 1 1 0l1 4v1l-6 1Zm-15-4c13 4 18 3 20 2l-1-3c-12 1-20-4-22-5l-1 3Z" fill="#2f1d4a"/>
+  <path d="M29 14a1 1 0 0 1-1 0l6-13a1 1 0 0 1 1-1s8-1 13 1a1 1 0 1 1 0 1c-5-2-11-1-13-1l-6 13Zm22 37a1 1 0 0 1-1 0V40a1 1 0 0 1 1 0v11ZM36 37l11 6m0 1-11-7a1 1 0 0 1 0-1l11 7a1 1 0 0 1 0 1Zm-13-2 11 5m0 0-11-5a1 1 0 0 1 0-1l11 5a1 1 0 0 1 0 1Zm42 10a1 1 0 0 1 0-1l-2-4a1 1 0 0 1 1 0l1 4a1 1 0 0 1 0 1ZM5 40l-4-3a11 11 0 0 1 2-4 10 10 0 0 0-1 4l3 2a1 1 0 0 1 1 0l-1 1Zm96 6-2-2-1 1a1 1 0 1 1-1 0l1-2h1l2 2a1 1 0 0 1 0 1Zm2-1-3-5a1 1 0 0 1 1-1l2 2a1 1 0 0 1 1 0 1 1 0 0 1-1 1l-1-1 2 3a1 1 0 0 1-1 1Zm3-6-5-2a1 1 0 0 1 1-1l4 2a1 1 0 0 1 1 1 1 1 0 0 1-1 0Z" fill="#2f1d4a"/>
+  <path d="M60 71 12 57a1 1 0 0 1 0-1l-1-1 1-1 47 11 41-31c1-1 4 0 7 1a1 1 0 0 1 1 1l-1 2 1 1a1 1 0 0 1 0 1 1 1 0 0 1 0 1l-4 4v1a1 1 0 0 1 0 1l-4 2a1 1 0 0 1-1 0l-1-3-3 2a3 3 0 0 1-2-1L60 71ZM13 56l47 14 33-24h1l1 1 2-2h1l2 3 3-2v-2l4-4-1-1v-1l1-2c-4-1-6-2-7-1L59 66 13 55Zm87-22Z" fill="#2f1d4a"/>
+  <path d="M51 45a1 1 0 0 1-1-1c3-1 5-3 5-4a3 3 0 0 0-2 1 1 1 0 0 1-1-1l3-1a1 1 0 0 1 1 1c0 2-4 4-5 5Zm-15 56a2 2 0 0 1-2-1h1a2 2 0 0 1-1-1 2 2 0 0 1 1-1 2 2 0 0 1 2 0 2 2 0 0 1 0 1 2 2 0 0 1-1 2Zm0-2h-1a1 1 0 0 0 0 1 1 1 0 0 0 1 0 1 1 0 0 0 0-1Zm-19-6a1 1 0 0 1 0-1l3-6a1 1 0 1 1 1 0l-3 7a1 1 0 0 1-1 0Zm5 0a1 1 0 0 1-1-1l2-5a1 1 0 0 1 1 1l-2 5Z" fill="#2f1d4a"/>
+  <path d="M30 103h-1a139 139 0 0 0-19-1v-1l6-9 18 1a1 1 0 0 1 0 1 42 42 0 0 0-4 9Zm-19-2a144 144 0 0 1 18 1 42 42 0 0 1 4-8l-17-1Z" fill="#2f1d4a"/>
+  <path d="M9 114a1 1 0 0 1-1 0 13 13 0 0 1 1-5l4-8 1 1-4 8a13 13 0 0 0-1 4Zm21 0a1 1 0 0 1-1 0l2-11a1 1 0 1 1 1 0l-2 11Zm7 2a1 1 0 0 1-1-1v-11a1 1 0 0 1 1 0v11a1 1 0 0 1 0 1Zm-6-23a1 1 0 0 1 0-1l1-7a1 1 0 0 1 1 0l-2 7v1Zm28 7h-1l-1-7h-6a1 1 0 0 1 0-1l-8-7a1 1 0 1 1 1 0l8 7h6l1 5v-6h1l6-5v-1a1 1 0 0 1 1 0v2l-7 5-1 8Z" fill="#2f1d4a"/>
+  <path d="m73 116-1-1-6-29a1 1 0 0 1 1 0l6 29a1 1 0 0 1 0 1Z" fill="#2f1d4a"/>
+  <path d="m70 103 2-5v-4l-3 2a1 1 0 0 1-1-1l4-2v1l1 4-2 5a1 1 0 0 1-1 0Zm24 13 5-20-30-10v-1a1 1 0 0 1 1 0l29 10a1 1 0 0 1 1 0l-5 21a1 1 0 0 1-1 0Z" fill="#2f1d4a"/>
+  <path d="M101 116a1 1 0 0 1 0-1l4-21a1 1 0 0 0-1-1l-31-7v-1a1 1 0 0 1 1 0l30 7a2 2 0 0 1 1 2l-4 21v1Zm-38-5a1 1 0 0 1-1 0l-1-10 2-8a1 1 0 1 1 1 0l-2 8 1 10Zm4 1a1 1 0 0 1-1 0l-1-12a1 1 0 0 1 0-1h1l1 12a1 1 0 0 1 0 1Zm-12-1a1 1 0 0 1 0-1v-10a1 1 0 0 1 1 0v10a1 1 0 0 1-1 1Zm-7 3a1 1 0 0 1 0-1v-6h1v6l-1 1Zm-3-11a1 1 0 0 1-1 0 1 1 0 0 1 0-1l2-4v-7a1 1 0 0 1 1-1v8a1 1 0 0 1 0 1l-2 4Zm-5 9a1 1 0 0 1 0-1l1-11 2-3h1l-2 3-1 11a1 1 0 0 1-1 1Zm11-11h-1l1-9a1 1 0 0 1 1 0l-1 9Zm7-10-6-1-4-3v-1a1 1 0 0 1 1 0l3 3 5 1 4-3a1 1 0 0 1 1 1l-4 3Zm-5-5h-2a1 1 0 0 1-1-1 1 1 0 0 1 1 0l47-39a1 1 0 0 1 1 1L52 85h1l55-38a1 1 0 1 1 0 1L54 86h-1Z" fill="#2f1d4a"/>
+  <path d="M103 105h-6a1 1 0 0 1 0-1h6a1 1 0 0 1 1 0 1 1 0 0 1-1 1Zm0 2h-6a1 1 0 0 1 0-1h6a1 1 0 0 1 0 1Zm-6 5v-3a1 1 0 0 1 1-1 1 1 0 0 1 0 1v2l-1 1Zm2 3 1-7v-1a1 1 0 0 1 1 1l-1 7a1 1 0 0 1-1 0Zm11-66a1 1 0 0 1-1 0c-4-3-4-6-4-7a1 1 0 1 1 1 0c0 1 0 4 4 6l11-8 10-5 3-3-1-1 1-2-1-1a1 1 0 0 1 0-1l1-1-2-2 1-3-2-1 1-2-2-1h-1l1-3h-2v-3h-2V9a13 13 0 0 0-4 0l-5 5c0 1 0 10 2 15a1 1 0 0 1-1 1l-11 6a1 1 0 1 1 0-1l11-6c-2-6-2-15-2-15a1 1 0 0 1 0-1l5-4a1 1 0 0 1 1-1 15 15 0 0 1 5 0v2h2a1 1 0 0 1 1 1l-1 2h2a1 1 0 0 1 0 1v2l2 1h1a1 1 0 0 1 0 1l-2 2h2a1 1 0 0 1 0 1l-1 3 2 1a1 1 0 0 1 1 1 1 1 0 0 1-1 0l-1 2h1v1l-1 2 1 1a1 1 0 0 1 1 0 1 1 0 0 1-1 1l-3 3-10 4-12 9Z" fill="#2f1d4a"/>
+  <path d="M131 36h-1s-6-8-8-14-1-13-1-13a1 1 0 1 1 1 0s-1 8 1 13l8 13a1 1 0 0 1 0 1Z" fill="#2f1d4a"/>
+  <path d="m124 21 1-2h-2a1 1 0 0 1 0-1l1-1h-1a1 1 0 0 1-1-1 1 1 0 0 1 1 0h2a1 1 0 0 1 1 0v1l-2 1 2 1-1 2a1 1 0 0 1-1 0Zm3 6a1 1 0 0 1-1-1l1-1h-1a1 1 0 0 1-1-1 1 1 0 0 1 1 0h2l-1 2v1Zm2 10c-1-1-7-8-9-13a96 96 0 0 1-1-13 1 1 0 0 1 1 0 96 96 0 0 0 1 12c1 5 8 13 8 13v1Z" fill="#2f1d4a"/>
+  <path d="M122 40a1 1 0 0 1-1 0v-4a2 2 0 0 1 1-1l4-3a1 1 0 0 1 0 1l-3 2a1 1 0 0 0-1 1v4Zm-17-5h-1s-1-4 3-8l9 3a1 1 0 0 1-1 1l-8-3-2 7Zm6 23a1 1 0 0 1 0-1V35a1 1 0 0 1 0-1 1 1 0 0 1 1 1v22a1 1 0 0 1-1 1Zm-3-4h-2v-1l2-5h2a1 1 0 0 1 0 1l-2 5Zm-1-1h1l1-4Zm-14 5a5 5 0 0 1-3-5 1 1 0 0 1 1 0 4 4 0 0 0 2 4 1 1 0 0 1 0 1Zm2-1a4 4 0 0 1-2-6 1 1 0 1 1 1 0 3 3 0 0 0 2 5l-1 1Z" fill="#2f1d4a"/>
+  <path d="m95 52 2-2a1 1 0 1 1 1 1l-2 1a1 1 0 0 1-1 0Zm1 2a1 1 0 0 1-1-1l9-5v1l-8 5ZM66 33l-18-4-6-5-40-5a1 1 0 0 0-1 2l3 11 60 5Zm-53-4c-1 1-3 0-4-1v-4c1-1 2 0 3 1l1 4Zm10 1-4-1v-4l3 1 1 4Zm9 1-3-1-1-4 4 1v4Zm36 2-1 4 13 1-3-8a2 2 0 0 0-1-2h-2c0 3-1 5-4 5a15 15 0 0 1-1 0Zm-1 0Z" fill="#2f1d4a"/>
+  <circle cx="67.3" cy="32.8" r=".5" fill="#2f1d4a"/>
+  <path d="m53 65-4-1v-1l16-31a1 1 0 0 1 1 0h3v1L53 65Zm-3-2 2 1 16-31h-2Zm-12 40-6-1a1 1 0 0 1 0-1l2-9a3 3 0 0 1 0-1l13-25a1 1 0 0 1 1 0l3 1a1 1 0 0 1 0 1L40 91a3 3 0 0 0 0 1l-2 11Zm-5-2 4 1 2-10a4 4 0 0 1 0-2l11-22-2-1-13 24a3 3 0 0 0 0 1Zm80-26a1 1 0 0 1-1 0L94 60a1 1 0 0 1 0-1h1l18 15 2-29v-1a1 1 0 0 1 1 1l-2 29a1 1 0 0 1-1 1ZM89 55a1 1 0 0 1-1 0v-1a1 1 0 0 1-1 0h2a1 1 0 0 1 0 1Zm2-2-3-1a1 1 0 0 1 1-1l2 2Z" fill="#2f1d4a"/>
+  <path d="m110 68-1-1-13-9a1 1 0 0 1 1-1l12 9V50h1v17a1 1 0 0 1 0 1Zm9-29h-1v-1h1l-1-1a3 3 0 0 0-1 1v1l-1-1h-1a5 5 0 0 1 2-3 6 6 0 0 0-2 3h-3v-1l3-5h1l1 1-1 1v-1l-3 4h1a6 6 0 0 1 3-3l1 1v1a4 4 0 0 0-2 2h1a3 3 0 0 1 1-2l2 2v1h-1ZM47 5a1 1 0 0 1-1-1l-1-1h-4a1 1 0 0 1 0-1h5l1 2a1 1 0 0 1 0 1Zm50 81H23a2 2 0 0 1-2-2L4 33 0 21a1 1 0 0 1 0-1 2 2 0 0 1 2-1l40 5 6 4c3 2 19 5 22 5a3 3 0 0 0 2-1 4 4 0 0 0 1-4h3a2 2 0 0 1 1 1l7 18a1 1 0 0 1-1 0l-7-17a1 1 0 0 0-1-1h-1a5 5 0 0 1-1 3 4 4 0 0 1-3 2c-3 0-20-3-23-5l-5-4-40-5H1v1l4 11 17 52a1 1 0 0 0 1 1h74v-1l-8-21a1 1 0 0 1 0-1 1 1 0 0 1 1 0l8 22a1 1 0 0 1 0 1 1 1 0 0 1-1 1Z" fill="#2f1d4a"/>
+</svg>

+ 49 - 0
static/images/spot/onboarding-preview.svg

@@ -0,0 +1,49 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="232.3" height="184.3" viewBox="0 0 174.5 138.2">
+  <path d="M85 59v5l1 4v4a1 1 0 0 0 1 1l36 1a1 1 0 0 0 1-1l-1-6-1-3-2-11v-4l-1-1v-4h-5v-1l-3-1 1-2-30-2v1l2 12Z" fill="#fff"/>
+  <path d="M151 99s-4 0-5-4 5-4 7-2 1 5-2 6Z" fill="#f58452"/>
+  <path d="M86 72H71l-6-29s-2-11 3-19 12-11 17-11l18 1c4 1 6 7 6 7a26 26 0 0 0-7 2l-4-6-3 1-2 9-3 2-3 3-6 1Z" fill="#b29dd2"/>
+  <path fill="#b29dd2" d="m123 67-14 1H86l-1-4h37l1 3zm-7-20 4 7-1-6-2-4h-3l2 3zm-9-15 5 8 1-1h1l-4-7h-3zm-12-1-9 22-2-1 7-21h4z"/>
+  <path d="m119 48 13 5-7-8h-4l-7-1v-1l-3-1 2-3h13l11 16a1 1 0 0 1-1 2l-16-7Zm-35 3v-1 2l4 1v-2l2 2-2 6h-6L68 69a1 1 0 0 1-1-1l16-20Z" fill="#ede9f1"/>
+  <path d="M104 104h4v7l5 3v2h-10Zm-13-1h5l-1 9 4 2v2H89l2-13z" fill="#b29dd2"/>
+  <path fill="#ebb432" d="M94 90h3l-1 12h-3l1-12zm12 0h2v12l-3 1 1-13z"/>
+  <path d="M79 73h33a8 8 0 0 1 4 8c0 6-4 7-4 7H78s-7 0-8-7a9 9 0 0 1 3-7 9 9 0 0 1 6-1Z" fill="#f58452"/>
+  <path fill="#ede9f1" d="M107 90h2V73h-1l-1 17zm-12 0h2l2-17h-2l-2 17z"/>
+  <path d="M107 22a59 59 0 0 0-6 1l-4-5-2 1-2 8a42 42 0 0 0-7 4l24 1s10-13-3-10Z" fill="#ebb432"/>
+  <path d="M86 36a2 2 0 0 1-1-3 2 2 0 0 1 1 3Z" fill="#e1557a"/>
+  <path d="M99 37a2 2 0 1 1 0-2 2 2 0 0 1 0 2Z" fill="#f58452"/>
+  <path d="m66 127 1-6a1 1 0 1 1 1 0 19 19 0 0 0-2 5 24 24 0 0 0 4-3l1-1a1 1 0 0 1 0 1 22 22 0 0 0 0 3 46 46 0 0 0 3-4h1a14 14 0 0 0 0 3 19 19 0 0 0 3-4 1 1 0 0 1 1 0l-4 5-1-2-4 3a5 5 0 0 1 0-2l-4 2Zm0-1Z" fill="#2f1d4a"/>
+  <path d="M115 129v-1a1 1 0 0 1-1 0l2-6a1 1 0 0 1 1 1l-1 4 3-5h1v4l4-5a1 1 0 0 1 1 0v5l3-5a43 43 0 0 0 2 5 33 33 0 0 0 1-4v-1a1 1 0 0 1 1 1l2 4v-4a1 1 0 0 1 0-1 1 1 0 0 1 1 0l3 4-1-5h1a28 28 0 0 0 2 2 22 22 0 0 0-4-5H1a1 1 0 0 1-1-1 1 1 0 0 1 1 0h136c2 1 4 6 4 7s-1 1-3-1l1 4-4-3v4a1 1 0 0 1-1 0l-3-4-1 4a1 1 0 0 1 0 1l-2-5c-2 5-3 5-3 4l-1-4-5 5v-4l-4 5Zm23-3Z" fill="#2f1d4a"/>
+  <path d="m123 138 6-12a1 1 0 0 1 1 0 1 1 0 0 1 0 1l-6 11h-1Zm-72-21a1 1 0 0 1 0-1l6-17-7 4a1 1 0 0 1-1-1l6-18-25 18a1 1 0 0 1-1 0 1 1 0 0 1 0-1l3-23-10 11a1 1 0 0 1-1-1l12-12a1 1 0 0 1 1 1l-4 23 25-18a1 1 0 0 1 1 1l-6 18 8-4 1 1-8 18a1 1 0 0 1 0 1ZM20 87a1 1 0 0 1-1 0l-1-31L2 77a1 1 0 0 1-1 0l17-23a1 1 0 0 1 1 0v1l1 32Z" fill="#2f1d4a"/>
+  <path d="M62 117a1 1 0 0 1 0-1l6-9-7 1a1 1 0 0 1-1 0v-1l10-16-14 5a1 1 0 0 1-1 0l1-1 15-5a1 1 0 0 1 0 1l-9 16 7-1-6 10a1 1 0 0 1-1 1ZM46 86l2-5-7 3a1 1 0 0 1-1 0 1 1 0 0 1 0-1l7-19-13 7a1 1 0 0 1-1 0l1-6-5 4a1 1 0 0 1-1 0 1 1 0 0 1 0-1l-1-7-5 5 5-7h1l1 8 5-4a1 1 0 0 1 1 1l-1 6 14-8 1 1-8 20 8-3-2 6a1 1 0 0 1-1 0ZM23 63a1 1 0 0 1-1-1L21 1a1 1 0 0 1 1-1l1 62a1 1 0 0 1 0 1Z" fill="#2f1d4a"/>
+  <path d="M31 63 27 3h2l3 60Zm15-1a1 1 0 0 1 0-1l4-15 5-43a1 1 0 0 1 1 0l-5 43c0 4-4 15-4 15a1 1 0 0 1-1 1Zm4 23a1 1 0 0 1 0-1l7-38 1-15a1 1 0 0 1 1 0l-2 16-6 37-1 1Zm9-57a1 1 0 0 1-1-1l2-24a1 1 0 0 1 1 0l-2 25Zm90 90h-4v-1l-14-17-5 3a1 1 0 0 1-1 0l-11-13-3 1a1 1 0 0 1 0-1l3-1a1 1 0 0 1 1 0l11 13 5-3h1l13 18h4l3-6h8l14-16-13 17h-9l-3 5a1 1 0 0 1 0 1Zm-49-23a1 1 0 0 1-1-1l5-2a1 1 0 0 1 0 1l-4 2Zm-17 5L67 85l-8 6a1 1 0 0 1-1-1l9-6 17 15 8-3a1 1 0 0 1 0 1l-8 3h-1Z" fill="#2f1d4a"/>
+  <path d="m150 105-6-5-4 3a1 1 0 0 1-1 0l5-4a1 1 0 0 1 1 0l5 5 11-10a1 1 0 0 1 1 0l4 5a1 1 0 0 1 0 1l-5-5-10 10a1 1 0 0 1-1 0Zm-7-11h-4a1 1 0 0 1 0-1h4a1 1 0 0 1 0 1Zm4-7-3-4 3 4Zm7 0h-1l2-7a1 1 0 0 1 1 1l-2 6Zm6 3h-1a1 1 0 0 1 0-1l4-2a1 1 0 0 1 1 0l-4 3Z" fill="#2f1d4a"/>
+  <path d="M148 97a4 4 0 0 1-1-4 5 5 0 0 1 6-3 4 4 0 0 1 2 2 4 4 0 0 1 1 3 1 1 0 0 1-1 1 1 1 0 0 1 0-1 3 3 0 0 0 0-2 3 3 0 0 0-2-2 4 4 0 0 0-5 2 3 3 0 0 0 1 3v1h-1ZM29 29a1 1 0 0 1 0-1s6-5 9-10a1 1 0 0 1 1 0 1 1 0 0 1 0 1l-9 10h-1Z" fill="#2f1d4a"/>
+  <path d="M33 26a1 1 0 0 1 0-1v-2a1 1 0 0 1 0-1 1 1 0 0 1 1 1v2a1 1 0 0 1-1 1Z" fill="#2f1d4a"/>
+  <path d="M35 26h-3a1 1 0 0 1 0-1h3a1 1 0 0 1 0 1Zm0-2a1 1 0 0 1-1-1v-4a1 1 0 1 1 1 0v4a1 1 0 0 1 0 1Z" fill="#2f1d4a"/>
+  <path d="M39 24h-4a1 1 0 0 1 0-1h4v1Zm1-3h-3a1 1 0 0 1-1 0v-3a1 1 0 1 1 1 0v2h3a1 1 0 0 1 1 1 1 1 0 0 1-1 0Zm11 21h-1a77 77 0 0 1-6-7v-3a1 1 0 0 1 1 0v2a78 78 0 0 0 6 8Z" fill="#2f1d4a"/>
+  <path d="M44 35h-1a1 1 0 0 1-1-1 1 1 0 0 1 1 0h1a1 1 0 0 1 1 0 1 1 0 0 1-1 1Zm0 2a1 1 0 0 1-1-1l2-1a1 1 0 0 1 1 0v1l-2 1Z" fill="#2f1d4a"/>
+  <path d="M44 39a1 1 0 0 1 0-1l2-1v-3a1 1 0 0 1 1-1 1 1 0 0 1 0 1v3a1 1 0 0 1 0 1l-2 1h-1Z" fill="#2f1d4a"/>
+  <path d="M45 41a1 1 0 0 1 0-1l3-1v-3a1 1 0 0 1 1 0v4l-3 1Zm15-24a1 1 0 0 1-1-1l6-5a1 1 0 0 1 1 1l-6 5Z" fill="#2f1d4a"/>
+  <path d="m64 16-2-1a1 1 0 1 1 0-1l2 1a1 1 0 0 1 0 1Zm2-2h-1l-1-1a1 1 0 0 1 1-1l1 1a1 1 0 0 1 0 1Z" fill="#2f1d4a"/>
+  <path d="M63 14v-3a1 1 0 1 1 1 0v3h-1Zm37 36v-5a1 1 0 1 1 1 0v4a1 1 0 0 1-1 1Zm4 9-1-1-2-3-3 3 2-5h1l3 5v1Zm5-3a1 1 0 0 1 0-1l-2-5a1 1 0 0 1 0-1l3 6v1h-1Zm-25-3a1 1 0 0 1-1-1l8-21v-1l5 1a1 1 0 0 1 1 0l-4 10a1 1 0 0 1-1 0l3-9-3-1-8 21a1 1 0 0 1 0 1Z" fill="#2f1d4a"/>
+  <path d="M88 52a1 1 0 0 1 0-1l3-8a1 1 0 0 1 1 0l-3 9a1 1 0 0 1-1 0Zm-2 17a1 1 0 0 1-1-1v-4h35a1 1 0 0 1 0 1H86v3l36-1v-2a1 1 0 0 1 0-1h1v4l-37 1Z" fill="#2f1d4a"/>
+  <path fill="#2f1d4a" d="m104 68-1-4h6v4h-5zm2 35a1 1 0 0 1-1 0l2-30a1 1 0 0 1 1 0h2l-1 28h-1l1-27h-1l-2 29Z"/>
+  <path d="M114 117h-10a1 1 0 0 1-1-1l1-13 1-1h5a1 1 0 0 1 0 1v7a30 30 0 0 1 5 3v3a1 1 0 0 1-1 1Zm-10-1h10v-3a29 29 0 0 0-5-2v-8h-4Z" fill="#2f1d4a"/>
+  <path d="M114 115h-10a1 1 0 0 1-1 0 1 1 0 0 1 1-1h10a1 1 0 0 1 1 1 1 1 0 0 1-1 0Zm-18-14a1 1 0 0 1 0-1l2-27-3 27h-1a1 1 0 0 1 0-1l3-26a1 1 0 0 1 0-1h2a1 1 0 0 1 0 1l-2 27-1 1Zm5 16H90a1 1 0 0 1 0-1l2-14h5a1 1 0 0 1 1 0l-1 9a34 34 0 0 1 4 2v3a1 1 0 0 1 0 1Zm-10-1h9v-3a36 36 0 0 0-4-1 1 1 0 0 1 0-1l1-8h-4Z" fill="#2f1d4a"/>
+  <path d="M101 115H90a1 1 0 0 1 0-1h11a1 1 0 0 1 0 1Zm-9-12a1 1 0 0 1 0-1l-2-2a1 1 0 0 1 1-1l2 3a1 1 0 0 1-1 1Zm13 0h-1l-2-3a1 1 0 0 1 1 0l2 2a1 1 0 0 1 0 1ZM82 30a1 1 0 0 0-1 1l1 8h6l3-8Zm4 6a2 2 0 0 1-1-3 2 2 0 0 1 1 3Zm35 9-2-3h-2l-1 1h-2a1 1 0 0 1 0-1h2l1-1h3a1 1 0 0 1 0 1l2 2v1h-1Z" fill="#2f1d4a"/>
+  <path d="M113 43a1 1 0 0 1 0-1l2-3a1 1 0 0 1 1 0l-2 4a1 1 0 0 1-1 0Z" fill="#2f1d4a"/>
+  <path d="M136 58a2 2 0 0 1-1-1l-13-6a1 1 0 1 1 0-1l14 6a1 1 0 0 0 1-1l-11-15-13-1-1 2 2 1 1 1v1h10a1 1 0 0 1 1 0l6 9-13-5a1 1 0 0 1 0-1l11 5-5-7h-11a1 1 0 0 1 0-1v-1l-3-1a1 1 0 0 1-1 0v-1l2-3h1l13 1 12 16a2 2 0 0 1-2 3Z" fill="#2f1d4a"/>
+  <path d="m118 39-1-6a1 1 0 0 0-1 0l-4-1 3 7Zm-6 1-5-8h1l-12-1-3 8 19 1Zm-13-3a2 2 0 1 1 0-2 2 2 0 0 1 0 2Z" fill="#2f1d4a"/>
+  <path d="M112 40a1 1 0 0 1-1 0l-5-8a1 1 0 0 1 1-1l5 1 3 7h-2l-1 1Zm-4-8 4 7v-1h2l-3-5Zm12 22-5-8a1 1 0 0 1 0-1 1 1 0 0 1 1 0l3 6v-4a1 1 0 0 1 0-1l1 1 1 6a1 1 0 0 1 0 1 1 1 0 0 1-1 0Z" fill="#2f1d4a"/>
+  <path d="m123 74-36-1a1 1 0 0 1-1-1l-2-13h1l2 13 36 1-5-28h-4a1 1 0 0 1 0-1v-1l-3-1a1 1 0 0 1-1 0v-1l2-3h5l-1-5-34-2 2 20a1 1 0 0 1-1 0l-2-20a1 1 0 0 1 0-1 1 1 0 0 1 1 0l34 2a1 1 0 0 1 1 1l1 6a1 1 0 0 1 0 1l-5-1-2 2 3 1 1 1v1h4l5 29a1 1 0 0 1-1 1Z" fill="#2f1d4a"/>
+  <path d="M68 70a2 2 0 0 1-2-2l17-20a1 1 0 0 1 1 0v2a1 1 0 0 1 1 0l-1 2 3 1 1-2a1 1 0 0 1 1 0l1 2-2 7h-6L69 70a2 2 0 0 1-1 0Zm15-20L67 68a1 1 0 0 0 0 1 1 1 0 0 0 1 0l14-10h6l1-6v-1l-1 2-4-1a1 1 0 0 1-1-1l1-1a1 1 0 0 1-1 0Z" fill="#2f1d4a"/>
+  <path d="M73 63a1 1 0 0 1 0-1l9-7-1-3 1-1 1-1a1 1 0 0 1 1 1l-2 1 1 3h-1l-8 8h-1Zm39-32v-1l4-6a2 2 0 0 0 0-2h-7c-9 1-20 7-20 7a1 1 0 0 1-1 0c1-1 11-7 21-8h7a3 3 0 0 1 1 3c0 2-3 5-5 6a1 1 0 0 1 0 1Z" fill="#2f1d4a"/>
+  <path d="M93 27h-1l1-2 1-7a1 1 0 0 1 0-1l4-1a1 1 0 0 1 1 0l3 5 1 1a1 1 0 0 1 0 1 1 1 0 0 1-1 0 67 67 0 0 0-9 4Zm1-1a68 68 0 0 1 8-4h-1l-3-5-3 1-1 8Z" fill="#2f1d4a"/>
+  <path d="M102 23a69 69 0 0 0-9 4v-2s3-3 9-3v1ZM72 71h-1v-2a1 1 0 1 1 1 0v1h12a1 1 0 0 1 0 1H72Zm-2-9v-1l-3-16 12-11a1 1 0 0 1 1 0L68 45l3 16a1 1 0 0 1-1 1Z" fill="#2f1d4a"/>
+  <path d="M66 44a1 1 0 0 1-1 0 97 97 0 0 1 0-10l6-13 12-9c3-1 14-2 19 0 6 1 9 7 9 7a1 1 0 0 1 0 1 1 1 0 0 1-1 0s-3-6-8-7c-6-2-16-1-18 0l-12 8-6 13a94 94 0 0 0 0 10Z" fill="#2f1d4a"/>
+  <path d="M88 24c-2-8-5-9-5-9a1 1 0 0 1 0-1s4 1 6 10a1 1 0 0 1-1 0ZM74 56h-2a72 72 0 0 1-1-10c4-6 8-5 8-5l2 8a1 1 0 0 1-1 1 1 1 0 0 1 0-1l-1-7c-1 0-4 0-7 5a73 73 0 0 0 1 8h2a1 1 0 0 1 0 1Z" fill="#2f1d4a"/>
+  <path d="M72 50h-1a1 1 0 0 1 0-1l8-5h1a1 1 0 0 1 0 1l-8 5Zm6 37a8 8 0 0 1-4-1 9 9 0 0 1-4-7c1-4 3-7 7-7s7 3 7 5a8 8 0 0 1-1 5 5 5 0 0 1-4 2 5 5 0 0 1-4-1 5 5 0 0 1-2-3 4 4 0 0 1 7-3 3 3 0 0 1 1 3 3 3 0 0 1-2 2 3 3 0 0 1-3 0 2 2 0 0 1 0-2 2 2 0 0 1 1-1 2 2 0 0 1 1 0 1 1 0 0 1 0 1 1 1 0 0 0-1 0 1 1 0 0 0 0 1 2 2 0 0 0 2 0 2 2 0 0 0 1-1 2 2 0 0 0-1-3 3 3 0 0 0-5 3 4 4 0 0 0 2 3 5 5 0 0 0 6-1 7 7 0 0 0 1-5c0-1 0-4-6-4-5 0-5 4-6 6a8 8 0 0 0 4 6 7 7 0 0 0 6 1 6 6 0 0 0 4-5 1 1 0 0 1 1 0 7 7 0 0 1-5 6 8 8 0 0 1-3 0Zm36 0h-5a1 1 0 0 1 0-1h5c1 0 3-2 3-6a7 7 0 0 0-3-6 1 1 0 0 1-1-1 1 1 0 0 1 1 0 8 8 0 0 1 4 7c0 5-3 7-3 7h-1Zm-7 0h-8a1 1 0 0 1 0-1h8a1 1 0 0 1 0 1Z" fill="#2f1d4a"/>
+  <path d="M94 87H78a1 1 0 0 1 0-1h16a1 1 0 0 1 0 1Z" fill="#2f1d4a"/>
+  <path d="M88 87a1 1 0 0 1-1 0 8 8 0 0 0 3-7 9 9 0 0 0-1-4 1 1 0 1 1 1-1 10 10 0 0 1 1 5 9 9 0 0 1-3 7Z" fill="#2f1d4a"/>
+  <path d="M90 87a9 9 0 0 0 2-6 12 12 0 0 0-1-6 1 1 0 0 1 0-1h1a13 13 0 0 1 2 7l-3 6a1 1 0 0 1-1 0Zm21 0a1 1 0 0 1-1 0 9 9 0 0 0 3-7 7 7 0 0 0-2-5h1a8 8 0 0 1 2 5 9 9 0 0 1-3 7ZM74 39l-3-3v-1a1 1 0 0 1 1 0l2 3v-5a1 1 0 0 1 1 0v6Zm23 51h-2a1 1 0 0 1 0-1h2a1 1 0 0 1 1 1 1 1 0 0 1-1 0Zm12 0h-2a1 1 0 0 1-1 0 1 1 0 0 1 1-1h2a1 1 0 0 1 0 1Z" fill="#2f1d4a"/>
+</svg>

+ 64 - 0
static/images/spot/onboarding-setup.svg

@@ -0,0 +1,64 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="205.4" height="119" viewBox="0 0 153.9 89.6">
+  <path fill="#fff" d="m122 30 6 1h6l8 1 5-23-27-3-1 13 3 11zm-3 37h1l-1-16v-5l-26 4 1 4 4 13h21zM50 20l1-5-25-4-2 5-7 24 28 1 2-12 3-9z"/>
+  <path d="m86 52 8 7-1-3-5-5 4-10h2v-7a13 13 0 0 0-6 2v1l2 1h-2 4v1h1l-3 1Z" fill="#ede9f1"/>
+  <path fill="#f58452" d="m117 79 3-1v3h-3v-2z"/>
+  <path fill="#ede9f1" d="m120 56-6 28-3 2 1 1 2-1 2 3h2v-3l2 2 1-1-4-4 2-17 1-5v-5z"/>
+  <path fill="#f58452" d="M105 81h-3v-2l5-1-2 3zm10 0-4 1v-3h4v2z"/>
+  <path d="M102 78h-2l7-11h-2l-1 2-7 10a1 1 0 0 0 1 2l4-1Zm12-11-5 12 2-1v3l-5 1a1 1 0 0 1-1-1l6-12 1-2Z" fill="#ede9f1"/>
+  <path d="m102 48-4-4 5-1 2 3 5-1 1 2Z" fill="#e1557a"/>
+  <path fill="#ede9f1" d="M134 58V31l-1 1v3l-1 19m-7-24v12l1 3V31l-1-1z"/>
+  <path fill="#ede9f1" d="m119 20 12 11 11-8 3-2-1 2-13 11-11-9-1-5z"/>
+  <path d="m31 12 2-6h7v3h9c2 1-2 5-2 5ZM21 22h-2l5-7-2 8Z" fill="#ebb432"/>
+  <path fill="#ede9f1" d="M27 40v16h2l-1-16h-1z"/>
+  <path d="m54 14 6 34c1 5 20 31 20 31l-33-3Z" fill="#b29dd2"/>
+  <path fill="#ede9f1" d="m46 45 2-1 1 2v-1h1l1-2 4-3-4-5 1-2 5 7v1l-5 4v6h-3v-4l-2 1-1-3z"/>
+  <path d="M11 74s17-15 26-33h8l3-12 2 4-2 11-2 1 1 3-3 23v5Z" fill="#b29dd2"/>
+  <path fill="#ede9f1" d="m35 41 1 15h3l-2-15h-2zm15-8-3-4 1-1 2 2v3z"/>
+  <path fill="#ebb432" d="m35 56 1 7h3l-1-7h-3zm-8 0h1l1 7h-3v-7h1z"/>
+  <path fill="#ede9f1" d="m22 25 15 11 11-11v-3l3-1h2l1 3v4l-2 1v-2l-3 1-11 12-15-12-2-1 1-2z"/>
+  <path d="M29 15a1 1 0 0 1-2 0 1 1 0 0 1 0-2 1 1 0 0 1 2 0 1 1 0 0 1 0 2Z" fill="#e1557a"/>
+  <path d="M33 15a1 1 0 0 1-2 1 1 1 0 0 1 0-2 1 1 0 0 1 2-1 1 1 0 0 1 0 2Z" fill="#ebb432"/>
+  <path d="M37 16a1 1 0 0 1-2 0 1 1 0 0 1 0-2 1 1 0 0 1 2 0 1 1 0 0 1 0 2Z" fill="#f58452"/>
+  <path d="M123 10a1 1 0 0 1-2 1 1 1 0 0 1 0-2 1 1 0 0 1 2-1 1 1 0 0 1 0 2Z" fill="#e1557a"/>
+  <path d="M127 10a1 1 0 0 1-2 1 1 1 0 0 1 0-2 1 1 0 0 1 2-1 1 1 0 0 1 0 2Z" fill="#ebb432"/>
+  <path d="M131 11a1 1 0 0 1-2 0 1 1 0 0 1 0-2 1 1 0 1 1 2 2Z" fill="#f58452"/>
+  <path d="M97 52a1 1 0 1 1 0-1 1 1 0 0 1 0 1Z" fill="#e1557a"/>
+  <path d="M101 52a1 1 0 1 1-1-2 1 1 0 0 1 1 2Z" fill="#ebb432"/>
+  <path d="M104 51a1 1 0 1 1 0-1 1 1 0 0 1 0 1Z" fill="#f58452"/>
+  <path d="M83 85v-1c-1-1-20-27-23-36S52 5 52 4a1 1 0 0 1 0-1l32 4 33-4a1 1 0 0 1 0 1 245 245 0 0 0 8 38c9 17 25 35 25 35a1 1 0 1 1-1 1c0-1-15-18-25-36a241 241 0 0 1-8-38L84 8 53 4c1 5 5 36 8 44 3 9 22 36 22 36v1Z" fill="#2f1d4a"/>
+  <path d="M51 7a1 1 0 0 1 0-1l1-3a1 1 0 0 1 1 1l-1 3a1 1 0 0 1-1 0Zm37 74a1 1 0 0 1-1 0v-1l9-3a1 1 0 0 1 1 0 1 1 0 0 1-1 1l-8 3Zm64-1a1 1 0 0 1-1 0l-2-2-20-2a1 1 0 0 1-1 0 1 1 0 0 1 1-1l21 2 2 2a1 1 0 0 1 0 1ZM2 74a1 1 0 0 1-1-1 1 1 0 0 1 1 0l5-1a1 1 0 0 1 1 1 1 1 0 0 1-1 0l-5 1Zm48-3a1 1 0 0 1 0-1l11-1 1-3 2 2 1-2 2 3h4l-1 1h-4a21 21 0 0 0-1-2v1l-1 1-2-2v2l-12 1Zm-20 1a1 1 0 0 1 0-1h13a1 1 0 0 1 0 1H31ZM9 73a1 1 0 0 1 0-1 147 147 0 0 0 15-16 1 1 0 1 1 1 1 151 151 0 0 1-15 15l13-1a1 1 0 0 1 0 1L9 73ZM55 5a1 1 0 0 1-1-1l1-4h1a1 1 0 0 1 0 1l-1 3v1Zm60-1V1a1 1 0 0 1 0-1 1 1 0 0 1 1 1v3a1 1 0 0 1-1 0ZM85 84l-1-7h3l-1 7h-1z" fill="#2f1d4a"/>
+  <path d="m85 84-1-7a1 1 0 0 1 1 0h2v1l-1 6h-1Zm0-6v4l1-4Zm67 1v-5h1l-1 5z" fill="#2f1d4a"/>
+  <path d="m152 80-1-1v-5a1 1 0 0 1 1-1h1a1 1 0 0 1 1 1l-2 6Zm0-6v2l1-2ZM2 73l-1-5h1v5z" fill="#2f1d4a"/>
+  <path d="M2 74a1 1 0 0 1-1-1l-1-5a1 1 0 0 1 0-1h2a1 1 0 0 1 1 1l-1 5a1 1 0 0 1 0 1Zm-1-6 1 2v-2Zm28 11h-5v-1a5 5 0 0 1 0-2 7 7 0 0 1 2-2V42a1 1 0 0 1 1 0v32a1 1 0 0 1 0 1 6 6 0 0 0-2 2 4 4 0 0 0 0 1h5l-2-38h1l2 38a1 1 0 0 1 0 1h-2Z" fill="#2f1d4a"/>
+  <path d="m31 78-2 1h-5a6 6 0 0 1 1-3 6 6 0 0 1 2-2V63h3Z" fill="#2f1d4a"/>
+  <path d="M29 79h-5v-1a5 5 0 0 1 0-2 7 7 0 0 1 2-2V63a1 1 0 0 1 1 0h3l1 15a1 1 0 0 1 0 1h-2Zm-4-1h5l-1-14h-2v10a1 1 0 0 1 0 1 6 6 0 0 0-2 1 4 4 0 0 0 0 2Zm19-2a1 1 0 0 0-1-1l-2-1-1-11h-3l1 15 5 1Z" fill="#2f1d4a"/>
+  <path d="M43 79h-5a1 1 0 0 1-1-1l-1-15a1 1 0 0 1 1 0h3l2 11 2 1a2 2 0 0 1 0 1v3h-1Zm-5-1h5v-2l-2-1a1 1 0 0 1 0-1l-2-10h-2Z" fill="#2f1d4a"/>
+  <path d="M43 79h-5a1 1 0 0 1-1-1l-2-37v-1h2a1 1 0 0 1 0 1l5 33 2 1a2 2 0 0 1 0 1v3h-1Zm-5-1h5v-2l-2-1a1 1 0 0 1 0-1l-5-33Z" fill="#2f1d4a"/>
+  <path d="M49 83a1 1 0 0 1 0-1 17 17 0 0 0 0-2 23 23 0 0 0-2 2h-1a25 25 0 0 0 1-4 39 39 0 0 0-3 4h-1a7 7 0 0 0-2-1 3 3 0 0 0 1 1 1 1 0 0 1-1 0 3 3 0 0 1-1-2 1 1 0 0 1 1 0l2 1c4-5 4-4 5-4v3l2-1v4a1 1 0 0 1-1 0Zm1-38 2-18a1 1 0 0 1 1 0l-2 18a1 1 0 0 1-1 0Z" fill="#2f1d4a"/>
+  <path d="M44 82h-1a1 1 0 0 1 0-1l4-33 1-1v1l-4 33 2-3 3-28a1 1 0 1 1 1 0l-3 28-3 4Zm4-38a1 1 0 0 1 0-1l2-16a1 1 0 0 1 1 0l-2 17a1 1 0 0 1-1 0Zm5-22V11l-1 10a1 1 0 0 1-1 1 1 1 0 0 1 0-1l1-14a1 1 0 0 1 1 0l1 7v8a1 1 0 0 1-1 0ZM29 56h-2a1 1 0 0 1-1 0 1 1 0 0 1 1-1h2a1 1 0 0 1 1 1 1 1 0 0 1-1 0Zm10 0h-3a1 1 0 0 1 0-1h3a1 1 0 0 1 0 1Zm81 12h-1a1 1 0 0 1-1-1h2l-1-21-26 4 6 17h18a1 1 0 0 1 1 0l-1 1H98v-1l-6-17 27-5h1l1 22v1h-1Z" fill="#2f1d4a"/>
+  <path d="m93 59-8-7 4-12a1 1 0 0 1 1 0l-4 12 8 6a1 1 0 0 1-1 1Z" fill="#2f1d4a"/>
+  <path d="m93 56-5-5h-1l4-10a1 1 0 0 1 1 0h2v-6a13 13 0 0 0-5 1v1a1 1 0 0 1-1 1 1 1 0 0 1 0-1v-1a14 14 0 0 1 6-2 1 1 0 0 1 1 1v6a1 1 0 0 1-1 1h-2l-3 9 4 4v1Z" fill="#2f1d4a"/>
+  <path d="M85 41a1 1 0 0 1-1 0 5 5 0 0 1 0-3 1 1 0 0 1 0-1h4a1 1 0 1 1 0 1h-3a4 4 0 0 0 0 2l6-1a1 1 0 0 1 0 1l-6 1Zm9-1a1 1 0 0 1 0-1l3-1h-3v-1h4a4 4 0 0 1 0 2l-3 1Z" fill="#2f1d4a"/>
+  <path d="M99 41a12 12 0 0 1-3 0v-2a1 1 0 0 1 0-1 1 1 0 0 1 1 1v1a11 11 0 0 0 4 0v-6a7 7 0 0 0-4 0v3a1 1 0 0 1-1 1 1 1 0 0 1 0-1v-3a1 1 0 0 1 0-1 8 8 0 0 1 6 0 1 1 0 0 1 0 1v7h-1a10 10 0 0 1-2 0Zm-6-1-1-1h-1v-2a1 1 0 0 1 1 0h2a1 1 0 0 1 1 1h-3l1 1a1 1 0 0 1 0 1Z" fill="#2f1d4a"/>
+  <path d="M92 39h-2a1 1 0 0 1 0-1h-2a1 1 0 0 1 0-1h2v1h2a1 1 0 0 1 0 1Z" fill="#2f1d4a"/>
+  <path d="M92 38a1 1 0 0 1-1-1v-2a1 1 0 0 1 0-1 1 1 0 0 1 1 1v3Zm1 0a1 1 0 0 1 0-1v-2a1 1 0 0 1 1 0v2a1 1 0 0 1-1 1Zm13 10-4-5c-4-1-5 1-5 1l3 3v1a1 1 0 0 1-1 0l-3-3a1 1 0 0 1 0-1 3 3 0 0 1 1-2h6l4 5a1 1 0 0 1 0 1h-1Z" fill="#2f1d4a"/>
+  <path d="M111 47a3 3 0 0 0-3-3l-3 2a1 1 0 0 1 0-1l2-1v-1a4 4 0 0 1 5 4h-1Zm-7 14a1 1 0 0 1 0-1l3-1a1 1 0 0 1 1 1 1 1 0 0 1-1 0l-2 1Zm3-3h-4a1 1 0 0 1 0-1h4a1 1 0 1 1 0 1Z" fill="#2f1d4a"/>
+  <path d="M109 60a1 1 0 0 1 0-1v-2a1 1 0 0 1 0-1 1 1 0 0 1 1 1v2a1 1 0 0 1-1 1Zm-6 2a1 1 0 0 1-1 0 3 3 0 0 1 0-3 1 1 0 0 1 1 0v1a2 2 0 0 0 0 1 1 1 0 0 1 0 1Zm13 28a1 1 0 0 1-1-1l-1-2h-2a1 1 0 0 1-1 0l-1-1a1 1 0 0 1 0-1l4-2 5-27 1-1a1 1 0 0 1 0 1l-5 28h-1l-2 2h2a1 1 0 0 1 1 0l1 3 2-1v-2l2 1-4-3v-1l3-17a1 1 0 0 1 1 0l-3 17 4 3 1 1a1 1 0 0 1-1 0v1a1 1 0 0 1-1 0l-1-1v2l-3 1Z" fill="#2f1d4a"/>
+  <path d="M117 90v-1l-1-3a1 1 0 0 1 1 0l1 3a1 1 0 0 1-1 0Zm2-44-26 4 1 4 25-3Zm-22 6a1 1 0 1 1 0-1 1 1 0 0 1 0 1Zm4 0a1 1 0 1 1-1-2 1 1 0 0 1 1 2Zm3-1a1 1 0 1 1 0-1 1 1 0 0 1 0 1Zm-4 28a1 1 0 0 1 0-1l6-11a1 1 0 0 1 1 0l-6 10h4a1 1 0 0 1 0 1l-5 1Z" fill="#2f1d4a"/>
+  <path d="M98 81a1 1 0 0 1-1-2l7-11a1 1 0 1 1 0 1l-6 11h7a1 1 0 1 1 0 1h-7Zm11-2a1 1 0 0 1-1-1l5-11a1 1 0 1 1 1 1l-4 10 5-1a1 1 0 0 1 1 0v1l-7 1Zm17 1a12 12 0 0 1-2 0h-6l1-1h5a13 13 0 0 0 2 0 3 3 0 0 0 1 0l-4-5-3 2-2 1a1 1 0 0 1-1 0 1 1 0 0 1 1-1l2-1 2-2a1 1 0 0 1 1 0c3 1 5 6 5 6a1 1 0 0 1 0 1 4 4 0 0 1-2 0Z" fill="#2f1d4a"/>
+  <path d="M106 82a1 1 0 0 1-1 0 1 1 0 0 1 0-2l6-12a1 1 0 0 1 1 0v1l-6 12 9-1v1l-9 1Zm14-6a5 5 0 0 0-2-2v2Z" fill="#2f1d4a"/>
+  <path d="M118 77a1 1 0 0 1-1 0v-1l1-2a6 6 0 0 1 2 2l-2 1Zm0-2v1h1a5 5 0 0 0-1-1Zm-2-2h-1l-2 3h-2a3 3 0 0 1 1 2l3-1Z" fill="#2f1d4a"/>
+  <path d="M112 78a2 2 0 0 0-1-1 1 1 0 0 1 0-1l2-1 2-2h1a1 1 0 0 1 1 1l-1 3a1 1 0 0 1-1 1h-3Zm0-2a3 3 0 0 1 0 1h3v-3l-2 2Zm14 4a5 5 0 0 0 2-1s-2-4-5-5l-3 2h-1a5 5 0 0 1 1 4l4-1a14 14 0 0 0 2 1Z" fill="#2f1d4a"/>
+  <path d="M126 80a12 12 0 0 1-2 0h-4a5 5 0 0 0-2-3 1 1 0 0 1 0-1 1 1 0 0 1 1 0l1-1 2-2a1 1 0 0 1 1 0c3 1 5 6 5 6a4 4 0 0 1-2 1Zm-2-1a13 13 0 0 0 2 0 3 3 0 0 0 1 0l-4-5-3 2v1a6 6 0 0 1 1 2h2Zm-13 3a1 1 0 0 1 0-1l-1-3a1 1 0 0 1 1 0l1 3-1 1Zm-9-1a1 1 0 0 1 0-1v-2a1 1 0 0 1 1 0v2a1 1 0 0 1-1 1ZM45 42l-28-2 8-30a1 1 0 0 1 1 0l25 4a1 1 0 0 1 0 1l-1 5a1 1 0 0 1-1 0l1-5-24-4-8 28 26 2 3-12a1 1 0 1 1 1 1l-3 12ZM21 22a7 7 0 0 1-2-1 1 1 0 0 1-1-1l4-6a1 1 0 0 1 1 0v1a36 36 0 0 0-3 5 5 5 0 0 0 1 1 1 1 0 0 1 0 1Z" fill="#2f1d4a"/>
+  <path d="M46 15v-1l4-4a1 1 0 0 0 0-1c-2-2-12 0-19 2a1 1 0 1 1 0-1c3-1 17-5 20-2a2 2 0 0 1 0 2c-1 3-4 4-5 5Z" fill="#2f1d4a"/>
+  <path d="M39 9a1 1 0 0 1-1-1 11 11 0 0 0-1-3l-4 1-1 2a1 1 0 0 1-1 0l1-3 5-1a1 1 0 0 1 1 0 12 12 0 0 1 1 4 1 1 0 0 1 0 1Z" fill="#2f1d4a"/>
+  <path d="M50 9c-1-1-2-2-11 0a1 1 0 0 1-1-1 1 1 0 0 1 1 0c10-2 11 0 12 0a1 1 0 0 1-1 1Z" fill="#2f1d4a"/>
+  <path d="m39 8-8 2a20 20 0 0 1 8-3 10 10 0 0 1 0 1" fill="#2f1d4a"/>
+  <path d="M31 11a1 1 0 0 1 0-1 20 20 0 0 1 8-3 9 9 0 0 1 0 1 1 1 0 0 1 0 1l-8 2Zm7-3a20 20 0 0 0-3 1l3-1Zm-3 21-6-2v-1l7 2a1 1 0 0 1 0 1 1 1 0 0 1-1 0Zm1-1v-1l-5-3a1 1 0 0 1-1-1h1l6 4a1 1 0 0 1-1 1Zm1 3a1 1 0 0 1 0-1 4 4 0 0 0 2-3 1 1 0 0 1 0-1l1 1a5 5 0 0 1-2 4h-1Z" fill="#2f1d4a"/>
+  <path d="M38 40a1 1 0 0 1-1 0L23 29a1 1 0 0 1 1-1l14 11 11-12h3a1 1 0 0 1 1 0v1-1l1-3-1-2h-2l-2 1-1 2-10 12a1 1 0 0 1-1 0L21 25a1 1 0 0 1 1 0l15 11 10-11 1-3 3-1h3l1 2a1 1 0 0 1 0 1l-1 4-2 1v-1h-3L38 40Zm9 8-1-3a1 1 0 0 1 0-1l2-1a1 1 0 0 1 1 0v4a1 1 0 0 1 0 1h-1Zm0-3 1 2v-3Z" fill="#2f1d4a"/>
+  <path d="M51 51h-2a1 1 0 0 1-1 0 1 1 0 0 1 0-1l1-5a1 1 0 0 1 0-1l3 1a1 1 0 0 1 1 0l-1 6h-1Zm-2-1h2l1-5h-2Z" fill="#2f1d4a"/>
+  <path d="M52 49h-3a1 1 0 0 1-1 0 1 1 0 0 1 1-1h3a1 1 0 0 1 0 1Zm0-2h-3a1 1 0 0 1 0-1h3a1 1 0 0 1 0 1Zm-2-14a1 1 0 0 1-1 0l-1-2a1 1 0 1 1 1 0l1 1a1 1 0 0 1 0 1Zm1 11a1 1 0 0 1-1-1l4-3-3-5a1 1 0 1 1 1 0l3 5-4 4Z" fill="#2f1d4a"/>
+  <path d="m52 45 4-4a1 1 0 0 0 0-1l-3-5a1 1 0 0 1 0-1l4 5a2 2 0 0 1 0 2l-4 4h-1Zm-2-14h-1v-1a1 1 0 0 1 0-1l1 1a1 1 0 0 1 0 1ZM26 11l-2 5 26 4 1-5Zm3 4a1 1 0 0 1-2 0 1 1 0 0 1 0-2 1 1 0 0 1 2 0 1 1 0 0 1 0 2Zm4 0a1 1 0 0 1-2 1 1 1 0 0 1 0-2 1 1 0 0 1 2-1 1 1 0 0 1 0 2Zm4 1a1 1 0 0 1-2 0 1 1 0 0 1 0-2 1 1 0 0 1 2 0 1 1 0 0 1 0 2Zm-8 35 4-8a1 1 0 0 1 1-1 1 1 0 0 1 0 1l-5 8Zm113-18-8-1a1 1 0 0 1 0-1l8 1 5-23-27-2-1-1a1 1 0 0 1 1 0l27 2a1 1 0 0 1 1 1l-5 23a1 1 0 0 1-1 1Zm-14-2h-6a1 1 0 1 1 0-1h6a1 1 0 0 1 0 1Z" fill="#2f1d4a"/>
+  <path d="M129 22v-1l-1-3a1 1 0 0 1 1 0l1 3-1 1Zm3-4a1 1 0 0 1 0-1l7-1a1 1 0 0 1 1 0v1l-8 1Zm1 3a1 1 0 0 1-1-1 1 1 0 0 1 1 0l7-1a1 1 0 0 1 0 1l-7 1Zm-2 13-11-9a1 1 0 0 1 1-1l10 9 13-10a1 1 0 0 1 0 1l-13 10Z" fill="#2f1d4a"/>
+  <path d="m131 31-12-10a1 1 0 0 1 0-1 1 1 0 0 1 1 0l11 10 10-7a1 1 0 0 1 1 0 1 1 0 0 1 0 1l-11 7Zm1 24a1 1 0 0 1 0-1V35a1 1 0 0 1 1-1 1 1 0 0 1 0 1v20a1 1 0 0 1-1 0Zm2 3V33a1 1 0 1 1 1 0v25a1 1 0 0 1-1 0Zm-8-13-2-2V30a1 1 0 0 1 1 0v12l1 1V31a1 1 0 0 1 0-1l1 1v14h-1Zm-6-39-1 6 27 2 1-5Zm3 4a1 1 0 0 1-2 1 1 1 0 0 1 0-2 1 1 0 0 1 2-1 1 1 0 0 1 0 2Zm4 0a1 1 0 0 1-2 1 1 1 0 0 1 0-2 1 1 0 0 1 2-1 1 1 0 0 1 0 2Zm4 1a1 1 0 0 1-2 0 1 1 0 0 1 0-2 1 1 0 1 1 2 2ZM99 35h-1v-1h3v-1a1 1 0 0 1 1 1 1 1 0 0 1-1 1 4 4 0 0 1-2 0Z" fill="#2f1d4a"/>
+</svg>

Some files were not shown because too many files changed in this diff