Add control components to Quo
Add new switch component Add all controls components Use controls in list items Delete leftover file Signed-off-by: Gheorghe Pinzaru <feross95@gmail.com>
This commit is contained in:
parent
4541f6d59d
commit
1733d4dc83
|
@ -51,8 +51,9 @@
|
||||||
(def bezier (.-bezier ^js Easing))
|
(def bezier (.-bezier ^js Easing))
|
||||||
(def linear (.-linear ^js Easing))
|
(def linear (.-linear ^js Easing))
|
||||||
|
|
||||||
(def easings {:ease-in (bezier 0.42 0 1 1)
|
(def easings {:ease-in (bezier 0.42 0 1 1)
|
||||||
:ease-out (bezier 0 0 0.58 1)})
|
:ease-out (bezier 0 0 0.58 1)
|
||||||
|
:ease-in-out (bezier 0.42 0 0.58 1)})
|
||||||
|
|
||||||
(defn set-value [anim val]
|
(defn set-value [anim val]
|
||||||
(ocall anim "setValue" val))
|
(ocall anim "setValue" val))
|
||||||
|
@ -143,6 +144,12 @@
|
||||||
(defn with-timing-transition [val config]
|
(defn with-timing-transition [val config]
|
||||||
(.withTimingTransition ^js redash val (clj->js config)))
|
(.withTimingTransition ^js redash val (clj->js config)))
|
||||||
|
|
||||||
|
(defn use-spring-transition [val config]
|
||||||
|
(.withSpringTransition ^js redash val (clj->js config)))
|
||||||
|
|
||||||
|
(defn use-timing-transition [val config]
|
||||||
|
(.withTimingTransition ^js redash val (clj->js config)))
|
||||||
|
|
||||||
(defn re-timing [config]
|
(defn re-timing [config]
|
||||||
(.timing ^js redash (clj->js config)))
|
(.timing ^js redash (clj->js config)))
|
||||||
|
|
||||||
|
@ -160,6 +167,9 @@
|
||||||
(defn mix [anim-value a b]
|
(defn mix [anim-value a b]
|
||||||
(.mix ^js redash anim-value a b))
|
(.mix ^js redash anim-value a b))
|
||||||
|
|
||||||
|
(defn mix-color [anim-value a b]
|
||||||
|
(.mixColor ^js redash anim-value a b))
|
||||||
|
|
||||||
(defn loop* [opts]
|
(defn loop* [opts]
|
||||||
(ocall redash "loop" (clj->js opts)))
|
(ocall redash "loop" (clj->js opts)))
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,61 @@
|
||||||
|
(ns quo.components.controls.styles
|
||||||
|
(:require [quo.animated :as animated]
|
||||||
|
[quo.design-system.colors :as colors]))
|
||||||
|
|
||||||
|
(defn switch-style [state]
|
||||||
|
{:width 52
|
||||||
|
:height 28
|
||||||
|
:border-radius 14
|
||||||
|
:padding 4
|
||||||
|
:background-color (animated/mix-color state
|
||||||
|
(:ui-01 @colors/theme)
|
||||||
|
(:interactive-01 @colors/theme))})
|
||||||
|
|
||||||
|
(defn switch-bullet-style [state hold]
|
||||||
|
{:width 20
|
||||||
|
:height 20
|
||||||
|
:border-radius 10
|
||||||
|
:opacity (animated/mix hold 1 0.6)
|
||||||
|
:transform [{:translateX (animated/mix state 0 24)}]
|
||||||
|
:background-color colors/white
|
||||||
|
:elevation 4
|
||||||
|
:shadow-opacity 1
|
||||||
|
:shadow-radius 16
|
||||||
|
:shadow-color (:shadow-01 @colors/theme)
|
||||||
|
:shadow-offset {:width 0 :height 4}})
|
||||||
|
|
||||||
|
(defn radio-style [state]
|
||||||
|
{:width 20
|
||||||
|
:height 20
|
||||||
|
:border-radius 10
|
||||||
|
:padding 4
|
||||||
|
:background-color (animated/mix-color state
|
||||||
|
(:ui-01 @colors/theme)
|
||||||
|
(:interactive-01 @colors/theme))})
|
||||||
|
|
||||||
|
(defn radio-bullet-style [state hold]
|
||||||
|
{:width 12
|
||||||
|
:height 12
|
||||||
|
:border-radius 6
|
||||||
|
:opacity (animated/mix hold 1 0.6)
|
||||||
|
:transform [{:scale (animated/mix state 0.0001 1)}]
|
||||||
|
:background-color colors/white
|
||||||
|
:elevation 4
|
||||||
|
:shadow-opacity 1
|
||||||
|
:shadow-radius 16
|
||||||
|
:shadow-color (:shadow-01 @colors/theme)
|
||||||
|
:shadow-offset {:width 0 :height 4}})
|
||||||
|
|
||||||
|
(defn checkbox-style [state]
|
||||||
|
{:width 18
|
||||||
|
:height 18
|
||||||
|
:border-radius 4
|
||||||
|
:justify-content :center
|
||||||
|
:align-items :center
|
||||||
|
:background-color (animated/mix-color state
|
||||||
|
(:ui-01 @colors/theme)
|
||||||
|
(:interactive-01 @colors/theme))})
|
||||||
|
|
||||||
|
(defn check-icon-style [state hold]
|
||||||
|
{:opacity (animated/mix hold 1 0.6)
|
||||||
|
:transform [{:scale (animated/mix state 0.0001 1)}]})
|
|
@ -0,0 +1,71 @@
|
||||||
|
(ns quo.components.controls.view
|
||||||
|
(:require [reagent.core :as reagent]
|
||||||
|
[cljs-bean.core :as bean]
|
||||||
|
[quo.react :as react]
|
||||||
|
[quo.animated :as animated]
|
||||||
|
[quo.gesture-handler :as gh]
|
||||||
|
[quo.design-system.colors :as colors]
|
||||||
|
[quo.components.controls.styles :as styles]
|
||||||
|
[status-im.ui.components.icons.vector-icons :as icons]))
|
||||||
|
|
||||||
|
(def spring-config {:damping 50
|
||||||
|
:mass 0.3
|
||||||
|
:stiffness 120
|
||||||
|
:overshootClamping true
|
||||||
|
:bouncyFactor 1})
|
||||||
|
|
||||||
|
(defn control-builder [component]
|
||||||
|
(fn [props]
|
||||||
|
(let [{:keys [value onChange disabled]}
|
||||||
|
(bean/bean props)
|
||||||
|
state (animated/use-value 0)
|
||||||
|
tap-state (animated/use-value (:undetermined gh/states))
|
||||||
|
tap-handler (animated/on-gesture {:state tap-state})
|
||||||
|
hold (react/use-memo
|
||||||
|
(fn []
|
||||||
|
(animated/with-timing-transition
|
||||||
|
(animated/eq tap-state (:began gh/states))
|
||||||
|
{}))
|
||||||
|
[])
|
||||||
|
transition (react/use-memo
|
||||||
|
(fn []
|
||||||
|
(animated/with-spring-transition state spring-config))
|
||||||
|
[])
|
||||||
|
press-end (fn []
|
||||||
|
(when (and (not disabled) onChange)
|
||||||
|
(onChange (not value))))]
|
||||||
|
(animated/code!
|
||||||
|
(fn []
|
||||||
|
(animated/cond* (animated/eq tap-state (:end gh/states))
|
||||||
|
[(animated/set state (animated/not* state))
|
||||||
|
(animated/set tap-state (:undetermined gh/states))
|
||||||
|
(animated/call* [] press-end)]))
|
||||||
|
[press-end])
|
||||||
|
(animated/code!
|
||||||
|
(fn []
|
||||||
|
(animated/set state (if (true? value) 1 0)))
|
||||||
|
[value])
|
||||||
|
(reagent/as-element
|
||||||
|
[gh/tap-gesture-handler (merge tap-handler
|
||||||
|
{:shouldCancelWhenOutside true
|
||||||
|
:enabled (not disabled)})
|
||||||
|
[animated/view
|
||||||
|
[component {:transition transition
|
||||||
|
:hold hold}]]]))))
|
||||||
|
|
||||||
|
(defn switch-view [{:keys [transition hold]}]
|
||||||
|
[animated/view {:style (styles/switch-style transition)}
|
||||||
|
[animated/view {:style (styles/switch-bullet-style transition hold)}]])
|
||||||
|
|
||||||
|
(defn radio-view [{:keys [transition hold]}]
|
||||||
|
[animated/view {:style (styles/radio-style transition)}
|
||||||
|
[animated/view {:style (styles/radio-bullet-style transition hold)}]])
|
||||||
|
|
||||||
|
(defn checkbox-view [{:keys [transition hold]}]
|
||||||
|
[animated/view {:style (styles/checkbox-style transition)}
|
||||||
|
[animated/view {:style (styles/check-icon-style transition hold)}
|
||||||
|
[icons/tiny-icon :tiny-icons/tiny-check {:color colors/white}]]])
|
||||||
|
|
||||||
|
(def switch (reagent/adapt-react-class (control-builder switch-view)))
|
||||||
|
(def radio (reagent/adapt-react-class (control-builder radio-view)))
|
||||||
|
(def checkbox (reagent/adapt-react-class (control-builder checkbox-view)))
|
|
@ -4,9 +4,8 @@
|
||||||
[quo.design-system.spacing :as spacing]
|
[quo.design-system.spacing :as spacing]
|
||||||
[quo.design-system.colors :as colors]
|
[quo.design-system.colors :as colors]
|
||||||
[quo.components.text :as text]
|
[quo.components.text :as text]
|
||||||
|
[quo.components.controls.view :as controls]
|
||||||
;; FIXME:
|
;; FIXME:
|
||||||
[status-im.ui.components.radio :as radio]
|
|
||||||
[status-im.ui.components.checkbox.view :as checkbox]
|
|
||||||
[status-im.ui.components.icons.vector-icons :as icons]
|
[status-im.ui.components.icons.vector-icons :as icons]
|
||||||
[quo.components.animated.pressable :as animated]))
|
[quo.components.animated.pressable :as animated]))
|
||||||
|
|
||||||
|
@ -113,12 +112,12 @@
|
||||||
:flex-direction :row}}
|
:flex-direction :row}}
|
||||||
[rn/view {:style (:tiny spacing/padding-horizontal)}
|
[rn/view {:style (:tiny spacing/padding-horizontal)}
|
||||||
(case accessory
|
(case accessory
|
||||||
:radio [radio/radio active]
|
:radio [controls/radio {:value active
|
||||||
:checkbox [checkbox/checkbox {:checked? active}]
|
:on-change on-press}]
|
||||||
:switch [rn/switch {:value active
|
:checkbox [controls/checkbox {:value active
|
||||||
:track-color #js {:true (:interactive-01 @colors/theme)
|
:on-change on-press}]
|
||||||
:false nil}
|
:switch [controls/switch {:value active
|
||||||
:on-value-change on-press}]
|
:on-change on-press}]
|
||||||
:text [text/text {:color :secondary
|
:text [text/text {:color :secondary
|
||||||
:number-of-lines 1}
|
:number-of-lines 1}
|
||||||
accessory-text]
|
accessory-text]
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
[quo.components.list.header :as list-header]
|
[quo.components.list.header :as list-header]
|
||||||
[quo.components.list.footer :as list-footer]
|
[quo.components.list.footer :as list-footer]
|
||||||
[quo.components.list.item :as list-item]
|
[quo.components.list.item :as list-item]
|
||||||
|
[quo.components.controls.view :as controls]
|
||||||
[quo.components.bottom-sheet.view :as bottom-sheet]))
|
[quo.components.bottom-sheet.view :as bottom-sheet]))
|
||||||
|
|
||||||
(def text text/text)
|
(def text text/text)
|
||||||
|
@ -21,6 +22,9 @@
|
||||||
(def list-footer list-footer/footer)
|
(def list-footer list-footer/footer)
|
||||||
(def list-item list-item/list-item)
|
(def list-item list-item/list-item)
|
||||||
(def bottom-sheet bottom-sheet/bottom-sheet)
|
(def bottom-sheet bottom-sheet/bottom-sheet)
|
||||||
|
(def switch controls/switch)
|
||||||
|
(def radio controls/radio)
|
||||||
|
(def checkbox controls/checkbox)
|
||||||
(def safe-area-provider safe-area/provider)
|
(def safe-area-provider safe-area/provider)
|
||||||
(def safe-area-consumer safe-area/consumer)
|
(def safe-area-consumer safe-area/consumer)
|
||||||
(def safe-area-view safe-area/view)
|
(def safe-area-view safe-area/view)
|
||||||
|
|
|
@ -0,0 +1,44 @@
|
||||||
|
(ns quo.previews.controls
|
||||||
|
(:require [reagent.core :as reagent]
|
||||||
|
[quo.core :as quo]
|
||||||
|
[quo.react-native :as rn]
|
||||||
|
[quo.design-system.colors :as colors]))
|
||||||
|
|
||||||
|
(defn preview []
|
||||||
|
(let [switch-state (reagent/atom true)
|
||||||
|
radio-state (reagent/atom true)
|
||||||
|
checkbox-state (reagent/atom true)]
|
||||||
|
(fn []
|
||||||
|
[rn/view {:background-color (:ui-background @colors/theme)
|
||||||
|
:flex 1}
|
||||||
|
[rn/view {:padding 20
|
||||||
|
:flex-direction :row
|
||||||
|
:align-items :center
|
||||||
|
:justify-content :space-between}
|
||||||
|
[rn/touchable-opacity {:style {:margin-vertical 10
|
||||||
|
:padding 10}
|
||||||
|
:on-press #(swap! switch-state not)}
|
||||||
|
[quo/text (str "Switch state: " @switch-state)]]
|
||||||
|
[quo/switch {:value @switch-state
|
||||||
|
:on-change #(reset! switch-state %)}]]
|
||||||
|
|
||||||
|
[rn/view {:padding 20
|
||||||
|
:flex-direction :row
|
||||||
|
:align-items :center
|
||||||
|
:justify-content :space-between}
|
||||||
|
[rn/touchable-opacity {:style {:margin-vertical 10
|
||||||
|
:padding 10}
|
||||||
|
:on-press #(swap! radio-state not)}
|
||||||
|
[quo/text (str "Radio state: " @radio-state)]]
|
||||||
|
[quo/radio {:value @radio-state
|
||||||
|
:on-change #(reset! radio-state %)}]]
|
||||||
|
[rn/view {:padding 20
|
||||||
|
:flex-direction :row
|
||||||
|
:align-items :center
|
||||||
|
:justify-content :space-between}
|
||||||
|
[rn/touchable-opacity {:style {:margin-vertical 10
|
||||||
|
:padding 10}
|
||||||
|
:on-press #(swap! checkbox-state not)}
|
||||||
|
[quo/text (str "Checkbox state: " @checkbox-state)]]
|
||||||
|
[quo/checkbox {:value @checkbox-state
|
||||||
|
:on-change #(reset! checkbox-state %)}]]])))
|
|
@ -6,6 +6,7 @@
|
||||||
[quo.previews.button :as button]
|
[quo.previews.button :as button]
|
||||||
[quo.previews.lists :as lists]
|
[quo.previews.lists :as lists]
|
||||||
[quo.previews.bottom-sheet :as bottom-sheet]
|
[quo.previews.bottom-sheet :as bottom-sheet]
|
||||||
|
[quo.previews.controls :as controls]
|
||||||
[quo.react-native :as rn]
|
[quo.react-native :as rn]
|
||||||
[quo.core :as quo]
|
[quo.core :as quo]
|
||||||
[reagent.core :as reagent]
|
[reagent.core :as reagent]
|
||||||
|
@ -33,7 +34,10 @@
|
||||||
:component lists/preview}
|
:component lists/preview}
|
||||||
{:name :bottom-sheet
|
{:name :bottom-sheet
|
||||||
:insets {:top false}
|
:insets {:top false}
|
||||||
:component bottom-sheet/preview}])
|
:component bottom-sheet/preview}
|
||||||
|
{:name :controls
|
||||||
|
:insets {:top false}
|
||||||
|
:component controls/preview}])
|
||||||
|
|
||||||
(defn theme-switcher []
|
(defn theme-switcher []
|
||||||
[rn/view {:style {:flex-direction :row
|
[rn/view {:style {:flex-direction :row
|
||||||
|
|
|
@ -112,13 +112,15 @@
|
||||||
(react/useCallback f (maybe-js-deps @prev-deps*))
|
(react/useCallback f (maybe-js-deps @prev-deps*))
|
||||||
deps)))
|
deps)))
|
||||||
|
|
||||||
(defn memo
|
(defn use-memo
|
||||||
([f] (react/useMemo f))
|
([f] (react/useMemo f))
|
||||||
([f deps]
|
([f deps]
|
||||||
(with-deps-check [prev-deps*]
|
(with-deps-check [prev-deps*]
|
||||||
(react/useMemo f (maybe-js-deps @prev-deps*))
|
(react/useMemo f (maybe-js-deps @prev-deps*))
|
||||||
deps)))
|
deps)))
|
||||||
|
|
||||||
|
(def memo react/memo)
|
||||||
|
|
||||||
(defn get-children [^js children]
|
(defn get-children [^js children]
|
||||||
(->> children
|
(->> children
|
||||||
(react/Children.toArray)
|
(react/Children.toArray)
|
||||||
|
|
|
@ -32,8 +32,6 @@
|
||||||
:linear (-> ^js layout-animation .-Presets .-linear)
|
:linear (-> ^js layout-animation .-Presets .-linear)
|
||||||
:spring (-> ^js layout-animation .-Presets .-spring)})
|
:spring (-> ^js layout-animation .-Presets .-spring)})
|
||||||
|
|
||||||
(def switch (reagent/adapt-react-class (.-Switch ^js rn)))
|
|
||||||
|
|
||||||
(def activity-indicator-class (reagent/adapt-react-class (.-ActivityIndicator ^js rn)))
|
(def activity-indicator-class (reagent/adapt-react-class (.-ActivityIndicator ^js rn)))
|
||||||
|
|
||||||
(defn activity-indicator [props]
|
(defn activity-indicator [props]
|
||||||
|
|
Loading…
Reference in New Issue