openWidget  
      :: forall a u m r.  ()
      => ( Enum (Zone u a), Bounded (Zone u a),  Bargain a ~ [Char])
      => (MonadReader (DS r) m, In Bool r, HasIcons m (Zone u a), HasInput m (Slot a), MS m)        
      => Part u a -- who I am
      -> ((Bargain a,Slot a, Zone u a) -> World a)
      -> m (Cable (EitherG () (Slot a, World a)))
openWidget u step = el "ul" $ do
  -- zone <-  el "li" $ valueInput "where" readMaybe
  time <- el "li" $ do
    elAttr "span" [("class","field")] $ text "when"
    divClass "timeshow"  $ getInput
  zone <- el "li" $ do
      elAttr "span" [("class","field")] $ text "where"
      divClass "placeshow" $ divClass "radiochecks" $ radioChecks $ [minBound .. maxBound]
  -- time :: DS (Maybe (Slot a)) <-  el "li" $ valueInput "when" readMaybe
  -- camera
  bargain <- el "li" $ do
    elAttr "span" [("class","field")] $ text "what"
    divClass "bargainshow" $ valueInput "10 chars, minimum" validWhat

  (sub,close) <- el "li" . floater $ do
    sub <- submit (fmap (all id) . sequence $ (isJust <$> time): (isJust <$> zone): [isJust <$> bargain])
    close <- icon ["close","3x"] "abandon"
    return (sub,close)
  let f b t z = (t, step (b,t,z))
  return $ merge [
    RightG :=> ((f <$> (fromJust <$> bargain) <*> (fromJust <$> time) <*> (fromJust <$> zone)) `tagPromptlyDyn` sub),
    LeftG :=> close
    ]
openWidget  
      :: forall a u m r.  ()
      => ( Enum (Zone u a), Bounded (Zone u a),  Bargain a ~ [Char])
      => (MonadReader (DS r) m, In Bool r, HasIcons m (Zone u a), HasInput m (Slot a), MS m)        
      => Part u a -- who I am
      -> ((Bargain a,Slot a, Zone u a) -> World a)
      -> m (Cable (EitherG () (Slot a, World a)))
openWidget u step = el "ul" $ do
  -- zone <-  el "li" $ valueInput "where" readMaybe
  time <- el "li" $ do
    elAttr "span" [("class","field")] $ text "when"
    divClass "timeshow"  $ getInput
  zone <- el "li" $ do
      elAttr "span" [("class","field")] $ text "where"
      divClass "placeshow" $ divClass "radiochecks" $ radioChecks $ [minBound .. maxBound]
  -- time :: DS (Maybe (Slot a)) <-  el "li" $ valueInput "when" readMaybe
  -- camera
  bargain <- el "li" $ do
    elAttr "span" [("class","field")] $ text "what"
    divClass "bargainshow" $ valueInput "10 chars, minimum" validWhat

  (sub,close) <- el "li" . floater $ do
    sub <- submit (fmap (all id) . sequence $ (isJust <$> time): (isJust <$> zone): [isJust <$> bargain])
    close <- icon ["close","3x"] "abandon"
    return (sub,close)
  let f b t z = (t, step (b,t,z))
  return $ merge [
    RightG :=> ((f <$> (fromJust <$> bargain) <*> (fromJust <$> time) <*> (fromJust <$> zone)) `tagPromptlyDyn` sub),
    LeftG :=> close
    ]
openWidget u step = el "ul" $ do
  -- zone <-  el "li" $ valueInput "where" readMaybe
  time <- el "li" $ do
    elAttr "span" [("class","field")] $ text "when"
    divClass "timeshow"  $ getInput
  zone <- el "li" $ do
      elAttr "span" [("class","field")] $ text "where"
      divClass "placeshow" $ divClass "radiochecks" $ radioChecks $ [minBound .. maxBound]
  -- time :: DS (Maybe (Slot a)) <-  el "li" $ valueInput "when" readMaybe
  -- camera
  bargain <- el "li" $ do
    elAttr "span" [("class","field")] $ text "what"
    divClass "bargainshow" $ valueInput "10 chars, minimum" validWhat

  (sub,close) <- el "li" . floater $ do
    sub <- submit (fmap (all id) . sequence $ (isJust <$> time): (isJust <$> zone): [isJust <$> bargain])
    close <- icon ["close","3x"] "abandon"
    return (sub,close)
  let f b t z = (t, step (b,t,z))
  return $ merge [
    RightG :=> ((f <$> (fromJust <$> bargain) <*> (fromJust <$> time) <*> (fromJust <$> zone)) `tagPromptlyDyn` sub),
    LeftG :=> close
    ]