diff --git a/frontend/deps.edn b/frontend/deps.edn index db3000d0c..2f9d014b1 100644 --- a/frontend/deps.edn +++ b/frontend/deps.edn @@ -1,11 +1,7 @@ {:deps {org.clojure/clojurescript {:mvn/version "1.10.520"} org.clojure/clojure {:mvn/version "1.10.1"} - funcool/promesa {:mvn/version "2.0.1"} com.cognitect/transit-cljs {:mvn/version "0.8.256"} - funcool/rumext {:git/url "https://github.com/funcool/rumext.git" - :sha "ed9bf4c9c19110c6494a0571083a62b3b08eb17b"} - cljsjs/react-dom-server {:mvn/version "16.8.6-0"} environ/environ {:mvn/version "1.1.0"} @@ -13,8 +9,10 @@ funcool/beicon {:mvn/version "5.0.0"} funcool/cuerdas {:mvn/version "2.2.0"} - funcool/lentes {:mvn/version "1.2.0"} + funcool/lentes {:mvn/version "1.3.0-SNAPSHOT"} funcool/potok {:mvn/version "2.3.0"} + funcool/promesa {:mvn/version "2.0.1"} + funcool/rumext {:mvn/version "2.0.0-SNAPSHOT"} } :paths ["src" "vendor" "resources"] :aliases diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 744513439..484312831 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -11,9 +11,9 @@ "dev": true }, "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", "dev": true, "requires": { "fast-deep-equal": "^2.0.1", @@ -313,18 +313,18 @@ "dev": true }, "autoprefixer": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.6.0.tgz", - "integrity": "sha512-kuip9YilBqhirhHEGHaBTZKXL//xxGnzvsD0FtBQa6z+A69qZD6s/BAX9VzDF1i9VKDquTJDQaPLSEhOnL6FvQ==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.6.1.tgz", + "integrity": "sha512-aVo5WxR3VyvyJxcJC3h4FKfwCQvQWb1tSI5VHNibddCVWrcD1NvlxEweg3TSgiPztMnWfjpy2FURKA2kvDE+Tw==", "dev": true, "requires": { - "browserslist": "^4.6.1", - "caniuse-lite": "^1.0.30000971", + "browserslist": "^4.6.3", + "caniuse-lite": "^1.0.30000980", "chalk": "^2.4.2", "normalize-range": "^0.1.2", "num2fraction": "^1.2.2", - "postcss": "^7.0.16", - "postcss-value-parser": "^3.3.1" + "postcss": "^7.0.17", + "postcss-value-parser": "^4.0.0" } }, "aws-sign2": { @@ -481,14 +481,14 @@ } }, "browserslist": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.3.tgz", - "integrity": "sha512-CNBqTCq22RKM8wKJNowcqihHJ4SkI8CGeK7KOR9tPboXUuS5Zk5lQgzzTbs4oxD8x+6HUshZUa2OyNI9lR93bQ==", + "version": "4.6.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.6.tgz", + "integrity": "sha512-D2Nk3W9JL9Fp/gIcWei8LrERCS+eXu9AM5cfXA8WEZ84lFks+ARnZ0q/R69m2SV3Wjma83QDDPxsNKXUwdIsyA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30000975", - "electron-to-chromium": "^1.3.164", - "node-releases": "^1.1.23" + "caniuse-lite": "^1.0.30000984", + "electron-to-chromium": "^1.3.191", + "node-releases": "^1.1.25" } }, "buffer-equal": { @@ -550,9 +550,9 @@ } }, "caniuse-lite": { - "version": "1.0.30000979", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000979.tgz", - "integrity": "sha512-gcu45yfq3B7Y+WB05fOMfr0EiSlq+1u+m6rPHyJli/Wy3PVQNGaU7VA4bZE5qw+AU2UVOBR/N5g1bzADUqdvFw==", + "version": "1.0.30000988", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000988.tgz", + "integrity": "sha512-lPj3T8poYrRc/bniW5SQPND3GRtSrQdUM/R4mCYTbZxyi3jQiggLvZH4+BYUuX0t4TXjU+vMM7KFDQg+rSzZUQ==", "dev": true }, "caseless": { @@ -973,9 +973,9 @@ } }, "electron-to-chromium": { - "version": "1.3.183", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.183.tgz", - "integrity": "sha512-WbKCYs7yAFOfpuoa2pK5kbOngriUtlPC+8mcQW5L/686wv04w7hYXfw5ScDrsl9kixFw1SPsALEob5V/gtlDxw==", + "version": "1.3.207", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.207.tgz", + "integrity": "sha512-RIgAnfqbjZNECBLjslfy4cIYvcPl3GAXmnENrcoo0TZ8fGkyEEAealAbO7MoevW4xYUPe+e68cWAj6eP0DmMHw==", "dev": true }, "end-of-stream": { @@ -2198,9 +2198,9 @@ } }, "gulp-match": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/gulp-match/-/gulp-match-1.0.3.tgz", - "integrity": "sha1-kcfA1/Kb7NZgbVfYCn+Hdqh6uo4=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/gulp-match/-/gulp-match-1.1.0.tgz", + "integrity": "sha512-DlyVxa1Gj24DitY2OjEsS+X6tDpretuxD6wTfhXE/Rw2hweqc1f6D/XtsJmoiCwLWfXgR87W9ozEityPCVzGtQ==", "dev": true, "requires": { "minimatch": "^3.0.3" @@ -2874,9 +2874,9 @@ } }, "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, "lodash.clonedeep": { @@ -3164,9 +3164,9 @@ } }, "node-releases": { - "version": "1.1.24", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.24.tgz", - "integrity": "sha512-wym2jptfuKowMmkZsfCSTsn8qAVo8zm+UiQA6l5dNqUcpfChZSnS/vbbpOeXczf+VdPhutxh+99lWHhdd6xKzg==", + "version": "1.1.26", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.26.tgz", + "integrity": "sha512-fZPsuhhUHMTlfkhDLGtfY80DSJTjOcx+qD1j5pqPkuhUHVS7xHZIg9EE4DHK8O3f0zTxXHX5VIkDG8pu98/wfQ==", "dev": true, "requires": { "semver": "^5.3.0" @@ -3612,9 +3612,9 @@ } }, "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.0.tgz", + "integrity": "sha512-ESPktioptiSUchCKgggAkzdmkgzKfmp0EU8jXH+5kbIUB+unr0Y4CY9SRMvibuvYUBjNh1ACLbxqYNpdTQOteQ==", "dev": true }, "pretty-hrtime": { @@ -4140,9 +4140,9 @@ } }, "source-map-support": { - "version": "0.5.12", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", - "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -4187,9 +4187,9 @@ } }, "spdx-license-ids": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", - "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", "dev": true }, "split-string": { @@ -4353,9 +4353,9 @@ } }, "ternary-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ternary-stream/-/ternary-stream-2.0.1.tgz", - "integrity": "sha1-Bk5Im0tb9gumpre8fy9cJ07Pgmk=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ternary-stream/-/ternary-stream-2.1.1.tgz", + "integrity": "sha512-j6ei9hxSoyGlqTmoMjOm+QNvUKDOIY6bNl4Uh1lhBvl6yjPW2iLqxDUYyfDPZknQ4KdRziFl+ec99iT4l7g0cw==", "dev": true, "requires": { "duplexify": "^3.5.0", @@ -4789,9 +4789,9 @@ "dev": true }, "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true }, "y18n": { diff --git a/frontend/resources/index.mustache b/frontend/resources/index.mustache index 38affbc38..8f77c4b9b 100644 --- a/frontend/resources/index.mustache +++ b/frontend/resources/index.mustache @@ -11,6 +11,7 @@
+ diff --git a/frontend/resources/styles/main/partials/color-palette.scss b/frontend/resources/styles/main/partials/color-palette.scss index d870b1a01..69a195ca0 100644 --- a/frontend/resources/styles/main/partials/color-palette.scss +++ b/frontend/resources/styles/main/partials/color-palette.scss @@ -97,7 +97,6 @@ display: flex; transition: all .6s ease; width: 100%; - overflow-x: scroll; scroll-behavior: smooth; } diff --git a/frontend/resources/styles/main/partials/colorpicker.scss b/frontend/resources/styles/main/partials/colorpicker.scss index 6ce8e3f65..94202077c 100644 --- a/frontend/resources/styles/main/partials/colorpicker.scss +++ b/frontend/resources/styles/main/partials/colorpicker.scss @@ -174,7 +174,6 @@ } .colorpicker-tooltip { - background: $primary-ui-bg; border-radius: $br-small; display: flex; flex-direction: column; diff --git a/frontend/src/uxbox/main.cljs b/frontend/src/uxbox/main.cljs index 6f40b262c..b9bdb3ba0 100644 --- a/frontend/src/uxbox/main.cljs +++ b/frontend/src/uxbox/main.cljs @@ -14,6 +14,7 @@ [uxbox.main.store :as st] [uxbox.main.ui :as ui] [uxbox.main.ui.lightbox :refer [lightbox]] + [uxbox.main.ui.modal :refer [modal]] [uxbox.main.ui.loader :refer [loader]] [uxbox.util.dom :as dom] [uxbox.util.html.history :as html-history] @@ -70,6 +71,7 @@ (mf/mount (ui/app) (dom/get-element "app")) (mf/mount (lightbox) (dom/get-element "lightbox")) + (mf/mount (mf/element modal) (dom/get-element "modal")) (mf/mount (loader) (dom/get-element "loader")) (on-navigate router cpath))) diff --git a/frontend/src/uxbox/main/data/colors.cljs b/frontend/src/uxbox/main/data/colors.cljs index 3cbca577b..a564ca2f2 100644 --- a/frontend/src/uxbox/main/data/colors.cljs +++ b/frontend/src/uxbox/main/data/colors.cljs @@ -2,7 +2,7 @@ ;; License, v. 2.0. If a copy of the MPL was not distributed with this ;; file, You can obtain one at http://mozilla.org/MPL/2.0/. ;; -;; Copyright (c) 2015-2016 Andrey Antukh +;; Copyright (c) 2015-2019 Andrey Antukh (ns uxbox.main.data.colors (:require @@ -23,25 +23,14 @@ (declare persist-collections) (declare collections-fetched?) -(defrecord Initialize [type id] +(defrecord Initialize [] ptk/UpdateEvent (update [_ state] - (let [type (or type :own) - data {:type type - :id id - :selected #{}}] - (-> state - (assoc-in [:dashboard :colors] data) - (assoc-in [:dashboard :section] :dashboard/colors)))) - - ptk/WatchEvent - (watch [_ state s] - (rx/of (fetch-collections)))) + (assoc-in state [:dashboard :colors] {:selected #{}}))) (defn initialize - [type id] - (prn "colors$initialize" type id) - (Initialize. type id)) + [] + (Initialize.)) ;; --- Collections Fetched @@ -142,9 +131,7 @@ ptk/WatchEvent (watch [_ state s] - (let [type (get-in state [:dashboard :colors :type])] - (rx/of (persist-collections) - (rt/nav :dashboard/colors nil {:type type}))))) + (rx/of (persist-collections)))) (defn delete-collection [id] @@ -152,20 +139,19 @@ ;; --- Replace Color -(defrecord ReplaceColor [id from to] +(defrecord AddColor [coll-id color] ptk/UpdateEvent (update [_ state] - (let [replacer #(-> (disj % from) (conj to))] - (update-in state [:colors-collections id :colors] (fnil replacer #{})))) + (update-in state [:colors-collections coll-id :colors] set/union #{color})) ptk/WatchEvent (watch [_ state s] (rx/of (persist-collections)))) -(defn replace-color +(defn add-color "Add or replace color in a collection." - [{:keys [id from to] :as params}] - (ReplaceColor. id from to)) + [coll-id color] + (AddColor. coll-id color)) ;; --- Remove Color @@ -247,15 +233,17 @@ (or (uuid? to) (nil? to))]} (MoveSelected. from to)) -;; --- Delete Selected Colors +;; --- Delete Colors + +(defrecord DeleteColors [coll-id colors] + ptk/UpdateEvent + (update [_ state] + (assoc-in state [:dashboard :colors :selected] #{})) -(defrecord DeleteSelectedColors [] ptk/WatchEvent (watch [_ state stream] - (let [{:keys [id selected]} (get-in state [:dashboard :colors])] - (rx/of (remove-colors id selected) - #(assoc-in % [:dashboard :colors :selected] #{}))))) + (rx/of (remove-colors coll-id colors)))) -(defn delete-selected-colors - [] - (DeleteSelectedColors.)) +(defn delete-colors + [coll-id colors] + (DeleteColors. coll-id colors)) diff --git a/frontend/src/uxbox/main/data/pages.cljs b/frontend/src/uxbox/main/data/pages.cljs index 7a1988957..cc017ea88 100644 --- a/frontend/src/uxbox/main/data/pages.cljs +++ b/frontend/src/uxbox/main/data/pages.cljs @@ -22,8 +22,8 @@ (s/def ::grid-x-axis number?) (s/def ::grid-y-axis number?) -(s/def ::grid-color us/color?) -(s/def ::background us/color?) +(s/def ::grid-color string?) +(s/def ::background string?) (s/def ::background-opacity number?) (s/def ::grid-alignment boolean?) (s/def ::width number?) diff --git a/frontend/src/uxbox/main/data/shapes.cljs b/frontend/src/uxbox/main/data/shapes.cljs index e9627096f..2d8620a95 100644 --- a/frontend/src/uxbox/main/data/shapes.cljs +++ b/frontend/src/uxbox/main/data/shapes.cljs @@ -5,7 +5,7 @@ ;; Copyright (c) 2015-2017 Andrey Antukh (ns uxbox.main.data.shapes - (:require [cljs.spec.alpha :as s :include-macros true] + (:require [cljs.spec.alpha :as s] [lentes.core :as l] [beicon.core :as rx] [potok.core :as ptk] @@ -55,6 +55,14 @@ (s/def ::y1 number?) (s/def ::x2 number?) (s/def ::y2 number?) +(s/def ::id uuid?) +(s/def ::page uuid?) +(s/def ::type #{:rect + :group + :path + :circle + :image + :text}) (s/def ::attributes (s/keys :opt-un [::fill-color @@ -80,24 +88,12 @@ ::blocked ::locked])) -(s/def ::id uuid?) -(s/def ::page uuid?) -(s/def ::type #{:rect - :group - :path - :circle - :image - :text}) - (s/def ::shape (s/merge (s/keys ::req-un [::id ::page ::type]) ::attributes)) (s/def ::rect-like-shape (s/keys :req-un [::x1 ::y1 ::x2 ::y2 ::type])) -(s/def ::direction #{:up :down :right :left}) -(s/def ::speed #{:std :fast}) - ;; --- Shapes CRUD (deftype AddShape [data] @@ -105,8 +101,8 @@ ptk/UpdateEvent (update [_ state] (let [shape (geom/setup-proportions data) - page (get-in state [:workspace :page])] - (impl/assoc-shape-to-page state shape page)))) + page-id (get-in state [:workspace :current])] + (impl/assoc-shape-to-page state shape page-id)))) (defn add-shape [data] @@ -141,31 +137,6 @@ {:pre [(uuid? id) (string? name)]} (RenameShape. id name)) -;; --- Shape Transformations - -(def ^:private canvas-coords - (gpt/point c/canvas-start-x - c/canvas-start-y)) - -(declare apply-temporal-displacement) - -(deftype InitialShapeAlign [id] - ptk/WatchEvent - (watch [_ state s] - (let [{:keys [x1 y1] :as shape} (->> (get-in state [:shapes id]) - (geom/shape->rect-shape state)) - point1 (gpt/point x1 y1) - point2 (gpt/add point1 canvas-coords)] - (->> (uwrk/align-point point2) - (rx/map #(gpt/subtract % canvas-coords)) - (rx/map (fn [{:keys [x y] :as pt}] - (apply-temporal-displacement id (gpt/subtract pt point1)))))))) - -(defn initial-shape-align - [id] - {:pre [(uuid? id)]} - (InitialShapeAlign. id)) - ;; --- Update Rotation (deftype UpdateShapeRotation [id rotation] @@ -201,69 +172,6 @@ {:pre [(uuid? id) (us/valid? ::update-dimensions-opts opts)]} (UpdateDimensions. id opts)) -;; --- Apply Temporal Displacement - -(deftype ApplyTemporalDisplacement [id delta] - ptk/UpdateEvent - (update [_ state] - (let [prev (get-in state [:workspace :modifiers id :displacement] (gmt/matrix)) - curr (gmt/translate prev delta)] - (assoc-in state [:workspace :modifiers id :displacement] curr)))) - -(defn apply-temporal-displacement - [id pt] - {:pre [(uuid? id) (gpt/point? pt)]} - (ApplyTemporalDisplacement. id pt)) - -;; --- Apply Displacement - -(deftype ApplyDisplacement [id] - udp/IPageUpdate - ptk/WatchEvent - (watch [_ state stream] - (let [displacement (get-in state [:workspace :modifiers id :displacement])] - (if (gmt/matrix? displacement) - (rx/of #(impl/materialize-xfmt % id displacement) - #(update-in % [:workspace :modifiers id] dissoc :displacement) - ::udp/page-update) - (rx/empty))))) - -(defn apply-displacement - [id] - {:pre [(uuid? id)]} - (ApplyDisplacement. id)) - -;; --- Apply Temporal Resize Matrix - -(deftype ApplyTemporalResize [id xfmt] - ptk/UpdateEvent - (update [_ state] - (assoc-in state [:workspace :modifiers id :resize] xfmt))) - -(defn apply-temporal-resize - "Attach temporal resize transformation to the shape." - [id xfmt] - {:pre [(gmt/matrix? xfmt) (uuid? id)]} - (ApplyTemporalResize. id xfmt)) - -;; --- Apply Resize Matrix - -(deftype ApplyResize [id] - ptk/WatchEvent - (watch [_ state stream] - (let [resize (get-in state [:workspace :modifiers id :resize])] - (if (gmt/matrix? resize) - (rx/of #(impl/materialize-xfmt % id resize) - #(update-in % [:workspace :modifiers id] dissoc :resize) - ::udp/page-update) - (rx/empty))))) - -(defn apply-resize - "Apply definitivelly the resize matrix transformation to the shape." - [id] - {:pre [(uuid? id)]} - (ApplyResize. id)) - ;; --- Update Shape Position (deftype UpdateShapePosition [id point] @@ -294,7 +202,7 @@ ;; --- Update Shape Attrs (declare UpdateAttrs) - +;; TODO: moved (deftype UpdateAttrs [id attrs] ptk/WatchEvent (watch [_ state stream] @@ -496,52 +404,6 @@ (keyword? loc)]} (DropShape. sid tid loc)) -;; --- Select First Shape - -(deftype SelectFirstShape [] - ptk/UpdateEvent - (update [_ state] - (let [page (get-in state [:workspace :page]) - id (first (get-in state [:pages page :shapes]))] - (assoc-in state [:workspace :selected] #{id})))) - -(defn select-first-shape - "Mark a shape selected for drawing in the canvas." - [] - (SelectFirstShape.)) - -;; --- Mark Shape Selected - -(deftype SelectShape [id] - ptk/UpdateEvent - (update [_ state] - (let [selected (get-in state [:workspace :selected]) - state (if (contains? selected id) - (update-in state [:workspace :selected] disj id) - (update-in state [:workspace :selected] conj id))] - (update-in state [:workspace :flags] conj :element-options)))) - -(defn select-shape - "Mark a shape selected for drawing in the canvas." - [id] - {:pre [(uuid? id)]} - (SelectShape. id)) - -;; --- Select Shapes (By selrect) - -(deftype SelectShapesBySelrect [selrect] - ptk/UpdateEvent - (update [_ state] - (let [page (get-in state [:workspace :page]) - shapes (impl/match-by-selrect state page selrect)] - (assoc-in state [:workspace :selected] shapes)))) - -(defn select-shapes-by-selrect - "Select shapes that matches the select rect." - [selrect] - {:pre [(us/valid? ::rect-like-shape selrect)]} - (SelectShapesBySelrect. selrect)) - ;; --- Update Interaction (deftype UpdateInteraction [shape interaction] @@ -583,6 +445,10 @@ {:pre [(uuid? id) (number? index) (gpt/point? delta)]} (UpdatePath. id index delta)) +(def ^:private canvas-coords + (gpt/point c/canvas-start-x + c/canvas-start-y)) + (deftype InitialPathPointAlign [id index] ptk/WatchEvent (watch [_ state s] @@ -624,6 +490,7 @@ ;; --- Events (implicit) (for selected) +;; NOTE: moved to workspace (deftype DeselectAll [] ptk/UpdateEvent (update [_ state] @@ -684,91 +551,4 @@ [] (DuplicateSelected.)) -;; --- Delete Selected -(deftype DeleteSelected [] - ptk/WatchEvent - (watch [_ state stream] - (let [selected (get-in state [:workspace :selected])] - (rx/from-coll - (into [(deselect-all)] (map #(delete-shape %) selected)))))) - -(defn delete-selected - "Deselect all and remove all selected shapes." - [] - (DeleteSelected.)) - -(deftype UpdateSelectedShapesAttrs [attrs] - ptk/WatchEvent - (watch [_ state stream] - (let [xf (map #(update-attrs % attrs))] - (rx/from-coll (sequence xf (get-in state [:workspace :selected])))))) - -(defn update-selected-shapes-attrs - [attrs] - {:pre [(us/valid? ::attributes attrs)]} - (UpdateSelectedShapesAttrs. attrs)) - -;; --- Move Selected Layer - -(deftype MoveSelectedLayer [loc] - udp/IPageUpdate - ptk/UpdateEvent - (update [_ state] - (let [selected (get-in state [:workspace :selected])] - (impl/move-layer state selected loc)))) - -(defn move-selected-layer - [loc] - {:pre [(us/valid? ::direction loc)]} - (MoveSelectedLayer. loc)) - -;; --- Move Selected - -(defn- get-displacement - "Retrieve the correct displacement delta point for the - provided direction speed and distances thresholds." - [direction speed distance] - (case direction - :up (gpt/point 0 (- (get-in distance [speed :y]))) - :down (gpt/point 0 (get-in distance [speed :y])) - :left (gpt/point (- (get-in distance [speed :x])) 0) - :right (gpt/point (get-in distance [speed :x]) 0))) - -(defn- get-displacement-distance - "Retrieve displacement distances thresholds for - defined displacement speeds." - [metadata align?] - (let [gx (:grid-x-axis metadata) - gy (:grid-y-axis metadata)] - {:std (gpt/point (if align? gx 1) - (if align? gy 1)) - :fast (gpt/point (if align? (* 3 gx) 10) - (if align? (* 3 gy) 10))})) - -;; --- Move Selected - -;; Event used for apply displacement transformation -;; to the selected shapes throught the keyboard shortcuts. - -(deftype MoveSelected [direction speed] - ptk/WatchEvent - (watch [_ state stream] - (let [{:keys [page selected]} (:workspace state) - align? (refs/alignment-activated? state) - metadata (merge c/page-metadata (get-in state [:pages page :metadata])) - distance (get-displacement-distance metadata align?) - displacement (get-displacement direction speed distance)] - (rx/concat - (when align? - (rx/concat - (rx/from-coll (map initial-shape-align selected)) - (rx/from-coll (map apply-displacement selected)))) - (rx/from-coll (map #(apply-temporal-displacement % displacement) selected)) - (rx/from-coll (map apply-displacement selected)))))) - -(defn move-selected - [direction speed] - {:pre [(us/valid? ::direction direction) - (us/valid? ::speed speed)]} - (MoveSelected. direction speed)) diff --git a/frontend/src/uxbox/main/data/shapes_impl.cljs b/frontend/src/uxbox/main/data/shapes_impl.cljs index 0ee768861..26f718fef 100644 --- a/frontend/src/uxbox/main/data/shapes_impl.cljs +++ b/frontend/src/uxbox/main/data/shapes_impl.cljs @@ -301,13 +301,13 @@ acc)) (defn match-by-selrect - [state page selrect] + [state page-id selrect] (let [xf (comp (map #(get-in state [:shapes %])) (remove :hidden) (remove :blocked) (map geom/selection-rect)) match (partial try-match-shape xf selrect) - shapes (get-in state [:pages page :shapes])] + shapes (get-in state [:pages page-id :shapes])] (reduce match #{} (sequence xf shapes)))) (defn group-shapes diff --git a/frontend/src/uxbox/main/data/workspace.cljs b/frontend/src/uxbox/main/data/workspace.cljs index 182f8591d..fe94f7e91 100644 --- a/frontend/src/uxbox/main/data/workspace.cljs +++ b/frontend/src/uxbox/main/data/workspace.cljs @@ -7,42 +7,50 @@ (ns uxbox.main.data.workspace (:require [beicon.core :as rx] + [cljs.spec.alpha :as s] [potok.core :as ptk] [uxbox.config :as cfg] - [uxbox.main.store :as st] [uxbox.main.constants :as c] - [uxbox.main.lenses :as ul] - [uxbox.main.workers :as uwrk] - [uxbox.main.data.projects :as dp] - [uxbox.main.data.pages :as udp] - [uxbox.main.data.shapes :as uds] - [uxbox.main.data.icons :as udi] - [uxbox.main.data.shapes-impl :as shimpl] - [uxbox.main.data.lightbox :as udl] [uxbox.main.data.history :as udh] - [uxbox.main.data.workspace.scroll :as wscroll] - [uxbox.main.data.workspace.drawing :as wdrawing] - [uxbox.main.data.workspace.selrect :as wselrect] + [uxbox.main.data.icons :as udi] + [uxbox.main.data.lightbox :as udl] + [uxbox.main.data.pages :as udp] + [uxbox.main.data.projects :as dp] + [uxbox.main.data.shapes :as uds] + [uxbox.main.data.shapes-impl :as simpl] + ;; [uxbox.main.data.workspace.drawing :as wdrawing] [uxbox.main.data.workspace.ruler :as wruler] - [uxbox.util.uuid :as uuid] - [uxbox.util.spec :as us] + [uxbox.main.data.workspace.scroll :as wscroll] + [uxbox.main.lenses :as ul] + [uxbox.main.refs :as refs] + [uxbox.main.store :as st] + [uxbox.main.streams :as streams] + [uxbox.main.user-events :as uev] + [uxbox.main.workers :as uwrk] + [uxbox.util.data :refer [index-of]] [uxbox.util.forms :as sc] + [uxbox.main.geom :as geom] [uxbox.util.geom.point :as gpt] - [uxbox.util.time :as dt] + [uxbox.util.geom.matrix :as gmt] [uxbox.util.math :as mth] - [uxbox.util.data :refer [index-of]])) + [uxbox.util.spec :as us] + [uxbox.util.time :as dt] + [uxbox.util.uuid :as uuid])) ;; --- Expose inner functions (def start-viewport-positioning wscroll/start-viewport-positioning) (def stop-viewport-positioning wscroll/stop-viewport-positioning) -(def start-drawing wdrawing/start-drawing) -(def close-drawing-path wdrawing/close-drawing-path) -(def select-for-drawing wdrawing/select-for-drawing) -(def start-selrect wselrect/start-selrect) +;; (def start-drawing wdrawing/start-drawing) +;; (def close-drawing-path wdrawing/close-drawing-path) +;; (def select-for-drawing wdrawing/select-for-drawing) (def start-ruler wruler/start-ruler) (def clear-ruler wruler/clear-ruler) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; General workspace events +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; --- Initialize Workspace (declare initialize-alignment) @@ -50,24 +58,18 @@ (defrecord Initialize [project-id page-id] ptk/UpdateEvent (update [_ state] - (let [default-flags #{:sitemap :drawtools :layers :element-options :rules}] - (if (:workspace state) - (update state :workspace merge - {:project project-id - :page page-id - :selected #{} - :drawing nil - :drawing-tool nil - :tooltip nil}) - (assoc state :workspace - {:project project-id - :zoom 1 - :page page-id - :flags default-flags - :selected #{} - :drawing nil - :drawing-tool nil - :tooltip nil})))) + (let [default-flags #{:sitemap :drawtools :layers :element-options :rules} + initial-workspace {:project-id project-id + :page-id page-id + :zoom 1 + :flags default-flags + :selected #{} + :drawing nil + :drawing-tool nil + :tooltip nil}] + (-> state + (update-in [:workspace page-id] #(if (nil? %) initial-workspace %)) + (assoc-in [:workspace :current] page-id)))) ptk/WatchEvent (watch [_ state stream] @@ -104,7 +106,8 @@ (defrecord SetTooltip [text] ptk/UpdateEvent (update [_ state] - (assoc-in state [:workspace :tooltip] text))) + (let [page-id (get-in state [:workspace :current])] + (assoc-in state [:workspace page-id :tooltip] text)))) (defn set-tooltip [text] @@ -112,30 +115,33 @@ ;; --- Workspace Flags -(deftype ActivateFlag [flag] +(defrecord ActivateFlag [flag] ptk/UpdateEvent (update [_ state] - (update-in state [:workspace :flags] conj flag))) + (let [page-id (get-in state [:workspace :current])] + (update-in state [:workspace page-id :flags] conj flag)))) (defn activate-flag [flag] {:pre [(keyword? flag)]} (ActivateFlag. flag)) -(deftype DeactivateFlag [flag] +(defrecord DeactivateFlag [flag] ptk/UpdateEvent (update [_ state] - (update-in state [:workspace :flags] disj flag))) + (let [page-id (get-in state [:workspace :current])] + (update-in state [:workspace page-id :flags] disj flag)))) (defn deactivate-flag [flag] {:pre [(keyword? flag)]} (DeactivateFlag. flag)) -(deftype ToggleFlag [flag] +(defrecord ToggleFlag [flag] ptk/WatchEvent (watch [_ state stream] - (let [flags (get-in state [:workspace :flags])] + (let [page-id (get-in state [:workspace :current]) + flags (get-in state [:workspace page-id :flags])] (if (contains? flags flag) (rx/of (deactivate-flag flag)) (rx/of (activate-flag flag)))))) @@ -146,7 +152,7 @@ ;; --- Workspace Ruler -(deftype ActivateRuler [] +(defrecord ActivateRuler [] ptk/WatchEvent (watch [_ state stream] (rx/of (set-tooltip "Drag to use the ruler") @@ -156,7 +162,7 @@ [] (ActivateRuler.)) -(deftype DeactivateRuler [] +(defrecord DeactivateRuler [] ptk/WatchEvent (watch [_ state stream] (rx/of (set-tooltip nil) @@ -166,10 +172,11 @@ [] (DeactivateRuler.)) -(deftype ToggleRuler [] +(defrecord ToggleRuler [] ptk/WatchEvent (watch [_ state stream] - (let [flags (get-in state [:workspace :flags])] + (let [page-id (get-in state [:workspace :current]) + flags (get-in state [:workspace page-id :flags])] (if (contains? flags :ruler) (rx/of (deactivate-ruler)) (rx/of (activate-ruler)))))) @@ -180,10 +187,11 @@ ;; --- Icons Toolbox -(deftype SelectIconsToolboxCollection [id] +(defrecord SelectIconsToolboxCollection [id] ptk/UpdateEvent (update [_ state] - (assoc-in state [:workspace :icons-toolbox] id)) + (let [page-id (get-in state [:workspace :current])] + (assoc-in state [:workspace page-id :icons-toolbox] id))) ptk/WatchEvent (watch [_ state stream] @@ -194,11 +202,7 @@ {:pre [(or (nil? id) (uuid? id))]} (SelectIconsToolboxCollection. id)) -(deftype InitializeIconsToolbox [] - ptk/UpdateEvent - (update [_ state] - state) - +(defrecord InitializeIconsToolbox [] ptk/WatchEvent (watch [_ state stream] (letfn [(get-first-with-icons [colls] @@ -215,7 +219,8 @@ ;; Only perform the autoselection if it is not ;; previously already selected by the user. - (when-not (contains? (:workspace state) :icons-toolbox) + ;; TODO + #_(when-not (contains? (:workspace state) :icons-toolbox) (->> stream (rx/filter udi/collections-fetched?) (rx/take 1) @@ -230,7 +235,8 @@ (defrecord CopyToClipboard [] ptk/UpdateEvent (update [_ state] - (let [selected (get-in state [:workspace :selected]) + (let [page-id (get-in state [:workspace :current]) + selected (get-in state [:workspace page-id :selected]) item {:id (uuid/random) :created-at (dt/now) :items selected} @@ -251,13 +257,13 @@ udp/IPageUpdate ptk/UpdateEvent (update [_ state] - (let [page (get-in state [:workspace :page]) + (let [page-id (get-in state [:workspace :current]) selected (if (nil? id) (first (:clipboard state)) (->> (:clipboard state) (filter #(= id (:id %))) (first)))] - (shimpl/duplicate-shapes state (:items selected) page)))) + (simpl/duplicate-shapes state (:items selected) page-id)))) (defn paste-from-clipboard "Copy selected shapes to clipboard." @@ -266,34 +272,37 @@ ;; --- Zoom Management -(deftype IncreaseZoom [] +(defrecord IncreaseZoom [] ptk/UpdateEvent (update [_ state] (let [increase #(nth c/zoom-levels (+ (index-of c/zoom-levels %) 1) - (last c/zoom-levels))] - (update-in state [:workspace :zoom] (fnil increase 1))))) + (last c/zoom-levels)) + page-id (get-in state [:workspace :current])] + (update-in state [:workspace page-id :zoom] (fnil increase 1))))) (defn increase-zoom [] (IncreaseZoom.)) -(deftype DecreaseZoom [] +(defrecord DecreaseZoom [] ptk/UpdateEvent (update [_ state] (let [decrease #(nth c/zoom-levels (- (index-of c/zoom-levels %) 1) - (first c/zoom-levels))] - (update-in state [:workspace :zoom] (fnil decrease 1))))) + (first c/zoom-levels)) + page-id (get-in state [:workspace :current])] + (update-in state [:workspace page-id :zoom] (fnil decrease 1))))) (defn decrease-zoom [] (DecreaseZoom.)) -(deftype ResetZoom [] +(defrecord ResetZoom [] ptk/UpdateEvent (update [_ state] - (assoc-in state [:workspace :zoom] 1))) + (let [page-id (get-in state [:workspace :current])] + (assoc-in state [:workspace page-id :zoom] 1)))) (defn reset-zoom [] @@ -323,6 +332,434 @@ {:pre [(uuid? id)]} (InitializeAlignment. id)) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Shapes on Workspace events +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defrecord SelectShape [id] + ptk/UpdateEvent + (update [_ state] + (let [page-id (get-in state [:workspace :current]) + selected (get-in state [:workspace page-id :selected])] + (if (contains? selected id) + (update-in state [:workspace page-id :selected] disj id) + (update-in state [:workspace page-id :selected] conj id)))) + + ptk/WatchEvent + (watch [_ state s] + (rx/of (activate-flag :element-options)))) + +(defn select-shape + "Mark a shape selected for drawing in the canvas." + [id] + {:pre [(uuid? id)]} + (SelectShape. id)) + +(defrecord DeselectAll [] + ptk/UpdateEvent + (update [_ state] + (let [page-id (get-in state [:workspace :current])] + (assoc-in state [:workspace page-id :selected] #{}))) + + ptk/WatchEvent + (watch [_ state stream] + (rx/just ::uev/interrupt))) + +(defn deselect-all + "Clear all possible state of drawing, edition + or any similar action taken by the user." + [] + (DeselectAll.)) + +;; --- Select First Shape + +(deftype SelectFirstShape [] + ptk/UpdateEvent + (update [_ state] + (let [pid (get-in state [:workspace :current]) + sid (first (get-in state [:pages pid :shapes]))] + (assoc-in state [:workspace pid :selected] #{sid})))) + +(defn select-first-shape + "Mark a shape selected for drawing in the canvas." + [] + (SelectFirstShape.)) + +;; --- Select Shapes (By selrect) + +(defrecord SelectShapesBySelrect [selrect] + ptk/UpdateEvent + (update [_ state] + (let [page-id (get-in state [:workspace :current]) + shapes (simpl/match-by-selrect state page-id selrect)] + (assoc-in state [:workspace page-id :selected] shapes)))) + +(defn select-shapes-by-selrect + "Select shapes that matches the select rect." + [selrect] + {:pre [(us/valid? ::uds/rect-like-shape selrect)]} + (SelectShapesBySelrect. selrect)) + +;; --- Update Shape Attrs + +(deftype UpdateShapeAttrs [id attrs] + ptk/UpdateEvent + (update [_ state] + (update-in state [:shapes id] merge attrs))) + +(defn update-shape-attrs + [id attrs] + {:pre [(uuid? id) (us/valid? ::uds/attributes attrs)]} + (let [atts (us/extract attrs ::uds/attributes)] + (UpdateShapeAttrs. id attrs))) + +;; --- Update Selected Shapes attrs + + +(deftype UpdateSelectedShapesAttrs [attrs] + ptk/WatchEvent + (watch [_ state stream] + (let [pid (get-in state [:workspace :current]) + selected (get-in state [:workspace pid :selected])] + (rx/from-coll (map #(update-shape-attrs % attrs) selected))))) + +(defn update-selected-shapes-attrs + [attrs] + {:pre [(us/valid? ::uds/attributes attrs)]} + (UpdateSelectedShapesAttrs. attrs)) + + +;; --- Move Selected + +;; Event used for apply displacement transformation +;; to the selected shapes throught the keyboard shortcuts. + +(defn- get-displacement + "Retrieve the correct displacement delta point for the + provided direction speed and distances thresholds." + [direction speed distance] + (case direction + :up (gpt/point 0 (- (get-in distance [speed :y]))) + :down (gpt/point 0 (get-in distance [speed :y])) + :left (gpt/point (- (get-in distance [speed :x])) 0) + :right (gpt/point (get-in distance [speed :x]) 0))) + +(defn- get-displacement-distance + "Retrieve displacement distances thresholds for + defined displacement speeds." + [metadata align?] + (let [gx (:grid-x-axis metadata) + gy (:grid-y-axis metadata)] + {:std (gpt/point (if align? gx 1) + (if align? gy 1)) + :fast (gpt/point (if align? (* 3 gx) 10) + (if align? (* 3 gy) 10))})) + +(declare apply-temporal-displacement) +(declare initial-shape-align) +(declare apply-displacement) + +(defrecord MoveSelected [direction speed] + ptk/WatchEvent + (watch [_ state stream] + (let [page-id (get-in state [:workspace :current]) + workspace (get-in state [:workspace page-id]) + selected (:selected workspace) + flags (:flags workspace) + align? (refs/alignment-activated? flags) + metadata (merge c/page-metadata (get-in state [:pages page-id :metadata])) + distance (get-displacement-distance metadata align?) + displacement (get-displacement direction speed distance)] + (rx/concat + (when align? + (rx/concat + (rx/from-coll (map initial-shape-align selected)) + (rx/from-coll (map apply-displacement selected)))) + (rx/from-coll (map #(apply-temporal-displacement % displacement) selected)) + (rx/from-coll (map apply-displacement selected)))))) + +(s/def ::direction #{:up :down :right :left}) +(s/def ::speed #{:std :fast}) + +(defn move-selected + [direction speed] + {:pre [(us/valid? ::direction direction) + (us/valid? ::speed speed)]} + (MoveSelected. direction speed)) + +;; --- Move Selected Layer + +(defrecord MoveSelectedLayer [loc] + udp/IPageUpdate + ptk/UpdateEvent + (update [_ state] + (let [id (get-in state [:workspace :current]) + selected (get-in state [:workspace id :selected])] + (simpl/move-layer state selected loc)))) + +(defn move-selected-layer + [loc] + {:pre [(us/valid? ::direction loc)]} + (MoveSelectedLayer. loc)) + +;; --- Delete Selected + +(defrecord DeleteSelected [] + ptk/WatchEvent + (watch [_ state stream] + (let [id (get-in state [:workspace :current]) + selected (get-in state [:workspace id :selected])] + (rx/from-coll + (into [(deselect-all)] (map #(uds/delete-shape %) selected)))))) + +(defn delete-selected + "Deselect all and remove all selected shapes." + [] + (DeleteSelected.)) + +;; --- Shape Transformations + +(def ^:private canvas-coords + (gpt/point c/canvas-start-x + c/canvas-start-y)) + +(defrecord InitialShapeAlign [id] + ptk/WatchEvent + (watch [_ state s] + (let [{:keys [x1 y1] :as shape} (->> (get-in state [:shapes id]) + (geom/shape->rect-shape state)) + point1 (gpt/point x1 y1) + point2 (gpt/add point1 canvas-coords)] + (->> (uwrk/align-point point2) + (rx/map #(gpt/subtract % canvas-coords)) + (rx/map (fn [{:keys [x y] :as pt}] + (apply-temporal-displacement id (gpt/subtract pt point1)))))))) + +(defn initial-shape-align + [id] + {:pre [(uuid? id)]} + (InitialShapeAlign. id)) + +;; --- Apply Temporal Displacement + +(defrecord ApplyTemporalDisplacement [id delta] + ptk/UpdateEvent + (update [_ state] + (let [pid (get-in state [:workspace :current]) + prev (get-in state [:workspace pid :modifiers id :displacement] (gmt/matrix)) + curr (gmt/translate prev delta)] + (assoc-in state [:workspace pid :modifiers id :displacement] curr)))) + +(defn apply-temporal-displacement + [id pt] + {:pre [(uuid? id) (gpt/point? pt)]} + (ApplyTemporalDisplacement. id pt)) + +;; --- Apply Displacement + +(defrecord ApplyDisplacement [id] + udp/IPageUpdate + ptk/WatchEvent + (watch [_ state stream] + (let [pid (get-in state [:workspace :current]) + displacement (get-in state [:workspace pid :modifiers id :displacement])] + (if (gmt/matrix? displacement) + (rx/of #(simpl/materialize-xfmt % id displacement) + #(update-in % [:workspace pid :modifiers id] dissoc :displacement) + ::udp/page-update) + (rx/empty))))) + +(defn apply-displacement + [id] + {:pre [(uuid? id)]} + (ApplyDisplacement. id)) + +;; --- Apply Temporal Resize Matrix + +(deftype ApplyTemporalResize [id xfmt] + ptk/UpdateEvent + (update [_ state] + (let [pid (get-in state [:workspace :current])] + (assoc-in state [:workspace pid :modifiers id :resize] xfmt)))) + +(defn apply-temporal-resize + "Attach temporal resize transformation to the shape." + [id xfmt] + {:pre [(gmt/matrix? xfmt) (uuid? id)]} + (ApplyTemporalResize. id xfmt)) + +;; --- Apply Resize Matrix + +(deftype ApplyResize [id] + ptk/WatchEvent + (watch [_ state stream] + (let [pid (get-in state [:workspace :current]) + resize (get-in state [:workspace pid :modifiers id :resize])] + (if (gmt/matrix? resize) + (rx/of #(simpl/materialize-xfmt % id resize) + #(update-in % [:workspace pid :modifiers id] dissoc :resize) + ::udp/page-update) + (rx/empty))))) + +(defn apply-resize + "Apply definitivelly the resize matrix transformation to the shape." + [id] + {:pre [(uuid? id)]} + (ApplyResize. id)) + +;; --- Shape Movement (by mouse) + +(defrecord StartMove [id] + ptk/WatchEvent + (watch [_ state stream] + (let [pid (get-in state [:workspace :current]) + wst (get-in state [:workspace pid]) + stoper (->> streams/events + (rx/filter uev/mouse-up?) + (rx/take 1)) + stream (->> streams/mouse-position-deltas + (rx/take-until stoper))] + (rx/concat + (when (refs/alignment-activated? (:flags wst)) + (rx/of (initial-shape-align id))) + (rx/map #(apply-temporal-displacement id %) stream) + (rx/of (apply-displacement id)))))) + +(defn start-move + [id] + {:pre [(uuid? id)]} + (StartMove. id)) + +(defrecord StartMoveSelected [] + ptk/WatchEvent + (watch [_ state stream] + (let [pid (get-in state [:workspace :current]) + selected (get-in state [:workspace pid :selected])] + (rx/from-coll (map start-move selected))))) + +(defn start-move-selected + [] + (StartMoveSelected.)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Selection Rect Events +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(declare stop-selrect) +(declare update-selrect) +(declare get-selection-stoper) +(declare selection->rect) +(declare translate-to-canvas) + +;; --- Start Selrect + +(defrecord StartSelrect [] + ptk/UpdateEvent + (update [_ state] + (let [id (get-in state [:workspace :current]) + position (get-in state [:workspace :pointer :viewport]) + selection {::start position ::stop position}] + (assoc-in state [:workspace id :selrect] (selection->rect selection)))) + + ptk/WatchEvent + (watch [_ state stream] + (let [stoper (get-selection-stoper stream)] + ;; NOTE: the `viewport-mouse-position` can be derived from `stream` + ;; but it used from `streams/` ns just for convenience + (rx/concat + (->> streams/viewport-mouse-position + (rx/take-until stoper) + (rx/map update-selrect)) + (rx/just (stop-selrect)))))) + +(defn start-selrect + [] + (StartSelrect.)) + +;; --- Update Selrect + +(defrecord UpdateSelrect [position] + ptk/UpdateEvent + (update [_ state] + (let [id (get-in state [:workspace :current])] + (-> state + (assoc-in [:workspace id :selrect ::stop] position) + (update-in [:workspace id :selrect] selection->rect))))) + +(defn update-selrect + [position] + {:pre [(gpt/point? position)]} + (UpdateSelrect. position)) + +;; --- Clear Selrect + +(defrecord ClearSelrect [] + ptk/UpdateEvent + (update [_ state] + (let [id (get-in state [:workspace :current])] + (update-in state [:workspace id] dissoc :selrect)))) + +(defn clear-selrect + [] + (ClearSelrect.)) + +;; --- Stop Selrect + +(defrecord StopSelrect [] + ptk/WatchEvent + (watch [_ state stream] + (let [id (get-in state [:workspace :current]) + zoom (get-in state [:workspace id :zoom]) + rect (-> (get-in state [:workspace id :selrect]) + (translate-to-canvas zoom))] + (rx/of + (clear-selrect) + (deselect-all) + (select-shapes-by-selrect rect))))) + +(defn stop-selrect + [] + (StopSelrect.)) + +;; --- Impl + +(defn- selection->rect + [data] + (let [start (::start data) + stop (::stop data) + start-x (min (:x start) (:x stop)) + start-y (min (:y start) (:y stop)) + end-x (max (:x start) (:x stop)) + end-y (max (:y start) (:y stop))] + (assoc data + :x1 start-x + :y1 start-y + :x2 end-x + :y2 end-y + :type :rect))) + +(defn- get-selection-stoper + [stream] + (->> (rx/merge (rx/filter #(= % ::uev/interrupt) stream) + (rx/filter uev/mouse-up? stream)) + (rx/take 1))) + +(defn- translate-to-canvas + "Translate the given rect to the canvas coordinates system." + [rect zoom] + (let [startx (* c/canvas-start-x zoom) + starty (* c/canvas-start-y zoom)] + (assoc rect + :x1 (/ (- (:x1 rect) startx) zoom) + :y1 (/ (- (:y1 rect) starty) zoom) + :x2 (/ (- (:x2 rect) startx) zoom) + :y2 (/ (- (:y2 rect) starty) zoom)))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Server Interactions +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + ;; --- Update Metadata ;; Is a workspace aware wrapper over uxbox.data.pages/UpdateMetadata event. diff --git a/frontend/src/uxbox/main/data/workspace/ruler.cljs b/frontend/src/uxbox/main/data/workspace/ruler.cljs index 6ca188f62..9fb062c86 100644 --- a/frontend/src/uxbox/main/data/workspace/ruler.cljs +++ b/frontend/src/uxbox/main/data/workspace/ruler.cljs @@ -12,7 +12,6 @@ [uxbox.main.refs :as refs] [uxbox.main.streams :as streams] [uxbox.main.user-events :as uev] - [rumext.core :as mx :include-macros true] [uxbox.util.dom :as dom] [uxbox.util.geom.point :as gpt])) @@ -43,8 +42,9 @@ (deftype StartRuler [] ptk/UpdateEvent (update [_ state] - (let [pos (get-in state [:workspace :pointer :viewport])] - (assoc-in state [:workspace :ruler] [pos pos]))) + (let [pid (get-in state [:workspace :current]) + pos (get-in state [:workspace :pointer :viewport])] + (assoc-in state [:workspace pid :ruler] {:start pos :end pos}))) ptk/WatchEvent (watch [_ state stream] @@ -65,13 +65,15 @@ (deftype UpdateRuler [point ctrl?] ptk/UpdateEvent (update [_ state] - (let [[start end] (get-in state [:workspace :ruler])] + (let [pid (get-in state [:workspace :current]) + ruler (get-in state [:workspace pid :ruler])] (if-not ctrl? - (assoc-in state [:workspace :ruler] [start point]) - (let [end (-> (gpt/subtract point start) + (assoc-in state [:workspace pid :ruler :end] point) + (let [start (get-in state [:workspace pid :ruler :start]) + end (-> (gpt/subtract point start) (align-position) (gpt/add start))] - (assoc-in state [:workspace :ruler] [start end])))))) + (assoc-in state [:workspace pid :ruler :end] end)))))) (defn update-ruler [point ctrl?] @@ -84,7 +86,8 @@ (deftype ClearRuler [] ptk/UpdateEvent (update [_ state] - (update state :workspace dissoc :ruler))) + (let [pid (get-in state [:workspace :current])] + (update-in state [:workspace pid] dissoc :ruler)))) (defn clear-ruler [] diff --git a/frontend/src/uxbox/main/data/workspace/scroll.cljs b/frontend/src/uxbox/main/data/workspace/scroll.cljs index 9930ba6f1..5adf84a46 100644 --- a/frontend/src/uxbox/main/data/workspace/scroll.cljs +++ b/frontend/src/uxbox/main/data/workspace/scroll.cljs @@ -11,7 +11,6 @@ [potok.core :as ptk] [uxbox.main.refs :as refs] [uxbox.main.streams :as streams] - [rumext.core :as mx :include-macros true] [uxbox.util.dom :as dom] [uxbox.util.geom.point :as gpt])) diff --git a/frontend/src/uxbox/main/data/workspace/selrect.cljs b/frontend/src/uxbox/main/data/workspace/selrect.cljs deleted file mode 100644 index 055eac820..000000000 --- a/frontend/src/uxbox/main/data/workspace/selrect.cljs +++ /dev/null @@ -1,131 +0,0 @@ -;; This Source Code Form is subject to the terms of the Mozilla Public -;; License, v. 2.0. If a copy of the MPL was not distributed with this -;; file, You can obtain one at http://mozilla.org/MPL/2.0/. -;; -;; Copyright (c) 2015-2017 Andrey Antukh - -(ns uxbox.main.data.workspace.selrect - "Workspace selection rect." - (:require [beicon.core :as rx] - [potok.core :as ptk] - [uxbox.main.store :as st] - [uxbox.main.constants :as c] - [uxbox.main.refs :as refs] - [uxbox.main.streams :as streams] - [uxbox.main.data.shapes :as uds] - [uxbox.main.user-events :as uev] - [uxbox.util.geom.point :as gpt])) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Data Events -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(declare stop-selrect) -(declare update-selrect) -(declare get-selection-stoper) -(declare selection->rect) -(declare translate-to-canvas) - -;; --- Start Selrect - -(deftype StartSelrect [] - ptk/UpdateEvent - (update [_ state] - (let [position @refs/viewport-mouse-position - selection {::start position - ::stop position}] - (assoc-in state [:workspace :selrect] (selection->rect selection)))) - - ptk/WatchEvent - (watch [_ state stream] - (let [stoper (get-selection-stoper stream)] - ;; NOTE: the `viewport-mouse-position` can be derived from `stream` - ;; but it used from `streams/` ns just for convenience - (rx/concat - (->> streams/viewport-mouse-position - (rx/take-until stoper) - (rx/map update-selrect)) - (rx/just (stop-selrect)))))) - -(defn start-selrect - [] - (StartSelrect.)) - -;; --- Update Selrect - -(deftype UpdateSelrect [position] - ptk/UpdateEvent - (update [_ state] - (-> state - (assoc-in [:workspace :selrect ::stop] position) - (update-in [:workspace :selrect] selection->rect)))) - -(defn update-selrect - [position] - {:pre [(gpt/point? position)]} - (UpdateSelrect. position)) - -;; --- Clear Selrect - -(deftype ClearSelrect [] - ptk/UpdateEvent - (update [_ state] - (update state :workspace dissoc :selrect))) - -(defn clear-selrect - [] - (ClearSelrect.)) - -;; --- Stop Selrect - -(deftype StopSelrect [] - ptk/WatchEvent - (watch [_ state stream] - (let [rect (-> (get-in state [:workspace :selrect]) - (translate-to-canvas))] - (rx/of - (clear-selrect) - (uds/deselect-all) - (uds/select-shapes-by-selrect rect))))) - -(defn stop-selrect - [] - (StopSelrect.)) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Selection Rect Implementation -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(defn- selection->rect - [data] - (let [start (::start data) - stop (::stop data) - start-x (min (:x start) (:x stop)) - start-y (min (:y start) (:y stop)) - end-x (max (:x start) (:x stop)) - end-y (max (:y start) (:y stop))] - (assoc data - :x1 start-x - :y1 start-y - :x2 end-x - :y2 end-y - :type :rect))) - -(defn- get-selection-stoper - [stream] - (->> (rx/merge (rx/filter #(= % ::uev/interrupt) stream) - (rx/filter uev/mouse-up? stream)) - (rx/take 1))) - -(defn- translate-to-canvas - "Translate the given rect to the canvas coordinates system." - [rect] - (let [zoom @refs/selected-zoom - startx (* c/canvas-start-x zoom) - starty (* c/canvas-start-y zoom)] - (assoc rect - :x1 (/ (- (:x1 rect) startx) zoom) - :y1 (/ (- (:y1 rect) starty) zoom) - :x2 (/ (- (:x2 rect) startx) zoom) - :y2 (/ (- (:y2 rect) starty) zoom)))) - diff --git a/frontend/src/uxbox/main/data/workspace/drawing.cljs b/frontend/src/uxbox/main/data/workspace_drawing.cljs similarity index 85% rename from frontend/src/uxbox/main/data/workspace/drawing.cljs rename to frontend/src/uxbox/main/data/workspace_drawing.cljs index 19075344b..1d00bb818 100644 --- a/frontend/src/uxbox/main/data/workspace/drawing.cljs +++ b/frontend/src/uxbox/main/data/workspace_drawing.cljs @@ -4,7 +4,7 @@ ;; ;; Copyright (c) 2015-2017 Andrey Antukh -(ns uxbox.main.data.workspace.drawing +(ns uxbox.main.data.workspace-drawing "Workspace drawing data events and impl." (:require [beicon.core :as rx] [potok.core :as ptk] @@ -14,6 +14,7 @@ [uxbox.main.refs :as refs] [uxbox.main.streams :as streams] [uxbox.main.data.shapes :as uds] + [uxbox.main.data.workspace :as udw] [uxbox.main.geom :as geom] [uxbox.main.workers :as uwrk] [uxbox.main.user-events :as uev] @@ -30,13 +31,14 @@ (deftype SelectForDrawing [shape] ptk/UpdateEvent (update [_ state] - (let [current (l/focus ul/selected-drawing state)] + (let [pid (get-in state [:workspace :current]) + current (l/focus ul/selected-drawing state)] (if (or (nil? shape) (= shape current)) - (update state :workspace dissoc :drawing :drawing-tool) - (update state :workspace assoc - :drawing shape - :drawing-tool shape))))) + (update-in state [:workspace pid] dissoc :drawing :drawing-tool) + (update-in state [:workspace pid] assoc + :drawing shape + :drawing-tool shape))))) (defn select-for-drawing [shape] @@ -48,7 +50,8 @@ (deftype ClearDrawingState [] ptk/UpdateEvent (update [_ state] - (update state :workspace dissoc :drawing-tool :drawing))) + (let [pid (get-in state [:workspace :current])] + (update-in state [:workspace pid] dissoc :drawing-tool :drawing)))) (defn clear-drawing-state [] @@ -89,12 +92,13 @@ (deftype InitializeDrawing [point] ptk/UpdateEvent (update [_ state] - (let [shape (get-in state [:workspace :drawing]) + (let [pid (get-in state [:workspace :current]) + shape (get-in state [:workspace pid :drawing]) shape (geom/setup shape {:x1 (:x point) :y1 (:y point) :x2 (+ (:x point) 2) :y2 (+ (:y point) 2)})] - (assoc-in state [:workspace :drawing] shape)))) + (assoc-in state [:workspace pid :drawing] shape)))) (defn initialize-drawing [point] @@ -106,13 +110,14 @@ (deftype UpdateDrawing [position lock?] ptk/UpdateEvent (update [_ state] - (let [{:keys [id] :as shape} (-> (get-in state [:workspace :drawing]) + (let [pid (get-in state [:workspace :current]) + {:keys [id] :as shape} (-> (get-in state [:workspace pid :drawing]) (geom/shape->rect-shape) (geom/size)) result (geom/resize-shape :bottom-right shape position lock?) scale (geom/calculate-scale-ratio shape result) resize-mtx (geom/generate-resize-matrix :bottom-right shape scale)] - (assoc-in state [:workspace :modifiers id] {:resize resize-mtx})))) + (assoc-in state [:workspace pid :modifiers id] {:resize resize-mtx})))) (defn update-drawing [position lock?] @@ -124,15 +129,17 @@ (deftype FinishDrawing [] ptk/WatchEvent (watch [_ state stream] - (let [{:keys [id] :as shape} (get-in state [:workspace :drawing]) - resize-mtx (get-in state [:workspace :modifiers id :resize]) + (let [pid (get-in state [:workspace :current]) + {:keys [id] :as shape} (get-in state [:workspace pid :drawing]) + resize-mtx (get-in state [:workspace pid :modifiers id :resize]) shape (cond-> shape resize-mtx (geom/transform resize-mtx))] + (prn "finish-drawing" shape) (if-not shape (rx/empty) (rx/of (clear-drawing-state) (uds/add-shape shape) - (uds/select-first-shape) + (udw/select-first-shape) ::uev/interrupt))))) (defn finish-drawing @@ -144,7 +151,8 @@ (deftype FinishPathDrawing [] ptk/UpdateEvent (update [_ state] - (update-in state [:workspace :drawing :segments] #(vec (butlast %))))) + (let [pid (get-in state [:workspace :current])] + (update-in state [:workspace pid :drawing :segments] #(vec (butlast %)))))) (defn finish-path-drawing [] @@ -155,7 +163,8 @@ (deftype InsertDrawingPathPoint [point] ptk/UpdateEvent (update [_ state] - (update-in state [:workspace :drawing :segments] (fnil conj []) point))) + (let [pid (get-in state [:workspace :current])] + (update-in state [:workspace pid :drawing :segments] (fnil conj []) point)))) (defn insert-drawing-path-point [point] @@ -167,10 +176,11 @@ (deftype UpdateDrawingPathPoint [index point] ptk/UpdateEvent (update [_ state] - (let [segments (count (get-in state [:workspace :drawing :segments])) + (let [pid (get-in state [:workspace :current]) + segments (count (get-in state [:workspace pid :drawing :segments])) exists? (< -1 index segments)] (cond-> state - exists? (assoc-in [:workspace :drawing :segments index] point))))) + exists? (assoc-in [:workspace pid :drawing :segments index] point))))) (defn update-drawing-path-point [index point] @@ -182,7 +192,8 @@ (deftype CloseDrawingPath [] ptk/UpdateEvent (update [_ state] - (assoc-in state [:workspace :drawing :close?] true)) + (let [pid (get-in state [:workspace :current])] + (assoc-in state [:workspace pid :drawing :close?] true))) ptk/WatchEvent (watch [_ state stream] @@ -197,7 +208,8 @@ (deftype SimplifyDrawingPath [tolerance] ptk/UpdateEvent (update [_ state] - (update-in state [:workspace :drawing :segments] pth/simplify tolerance))) + (let [pid (get-in state [:workspace :current])] + (update-in state [:workspace pid :drawing :segments] pth/simplify tolerance)))) (defn simplify-drawing-path [tolerance] @@ -282,7 +294,7 @@ :y2 (+ y (/ 200 proportion))} shape (geom/setup shape props)] (st/emit! (uds/add-shape shape) - (uds/select-first-shape) + (udw/select-first-shape) (select-for-drawing nil) ::uev/interrupt))) @@ -298,7 +310,7 @@ :y2 (+ y height)} shape (geom/setup shape props)] (st/emit! (uds/add-shape shape) - (uds/select-first-shape) + (udw/select-first-shape) (select-for-drawing nil) ::uev/interrupt))) @@ -401,5 +413,3 @@ (rx/subscribe points on-point) (rx/subscribe stream on-draw nil on-finish)))) - - diff --git a/frontend/src/uxbox/main/locales/en.cljs b/frontend/src/uxbox/main/locales/en.cljs index 0d27b8629..a16884580 100644 --- a/frontend/src/uxbox/main/locales/en.cljs +++ b/frontend/src/uxbox/main/locales/en.cljs @@ -71,7 +71,6 @@ "ds.your-libraries-title" "YOUR LIBRARIES" "ds.default-library-title" "Unnamed Collection (%s)" - "ds.recent-colors" "Recent colors" "ds.element-options" "Element options" "ds.draw-tools" "Draw tools" "ds.sitemap" "Sitemap" diff --git a/frontend/src/uxbox/main/locales/fr.cljs b/frontend/src/uxbox/main/locales/fr.cljs index 44eb2056f..5b41d2632 100644 --- a/frontend/src/uxbox/main/locales/fr.cljs +++ b/frontend/src/uxbox/main/locales/fr.cljs @@ -71,7 +71,6 @@ "ds.your-libraries-title" "VOS LIBRAIRIES" "ds.default-library-title" "Collection sans nom (%s)" - "ds.recent-colors" "Couleurs récentes" "ds.element-options" "Options d'élément" "ds.draw-tools" "Outils de dessin" "ds.sitemap" "Plan du site" @@ -169,5 +168,5 @@ "errors.network" "Impossible de se connecter au serveur principal." "errors.generic" "Quelque chose c'est mal passé." "errors.conflict" "Conflit sur la sauvegarde des données, actualisez et réessayez." - + }) diff --git a/frontend/src/uxbox/main/refs.cljs b/frontend/src/uxbox/main/refs.cljs index 0d04fae31..58dde791b 100644 --- a/frontend/src/uxbox/main/refs.cljs +++ b/frontend/src/uxbox/main/refs.cljs @@ -2,7 +2,7 @@ ;; License, v. 2.0. If a copy of the MPL was not distributed with this ;; file, You can obtain one at http://mozilla.org/MPL/2.0/. ;; -;; Copyright (c) 2017 Andrey Antukh +;; Copyright (c) 2017-2019 Andrey Antukh (ns uxbox.main.refs "A collection of derived refs." @@ -11,6 +11,8 @@ [uxbox.main.constants :as c] [uxbox.main.store :as st])) +;; TODO: move inside workspaces because this is workspace only refs + ;; --- Helpers (defn resolve-project @@ -32,35 +34,19 @@ (filter #(= project (:project %))) (sort-by get-order)))) -(def workspace - (-> (l/key :workspace) - (l/derive st/state))) - -(def selected-project - "Ref to the current selected project." - (-> (l/lens resolve-project) - (l/derive st/state))) - -(def selected-project-id - "Ref to the current selected project id." - (-> (l/key :project) - (l/derive selected-project))) - -(def selected-project-pages - (-> (l/lens resolve-project-pages) - (l/derive st/state))) - -;; DEPRECATED -(def selected-page +(def ^:deprecated selected-page "Ref to the current selected page." (-> (l/lens resolve-page) (l/derive st/state))) -;; DEPRECATED -(def selected-page-id - "Ref to the current selected page id." - (-> (l/key :id) - (l/derive selected-page))) +;; --- NOT DEPRECATED + +(def workspace + (letfn [(selector [state] + (let [id (get-in state [:workspace :current])] + (get-in state [:workspace id])))] + (-> (l/lens selector) + (l/derive st/state)))) (def selected-shapes (-> (l/key :selected) @@ -74,10 +60,6 @@ (-> (l/key :flags) (l/derive workspace))) -(def shapes-by-id - (-> (l/key :shapes) - (l/derive st/state))) - (def selected-zoom (-> (l/key :zoom) (l/derive workspace))) @@ -109,31 +91,40 @@ (l/derive workspace))) (defn alignment-activated? - [state] - (let [{:keys [flags]} (:workspace state)] - (and (contains? flags :grid-indexed) - (contains? flags :grid-snap)))) + [flags] + (and (contains? flags :grid-indexed) + (contains? flags :grid-snap))) (def selected-alignment - (-> (l/lens alignment-activated?) + (-> (comp (l/key :flags) + (l/lens alignment-activated?)) + (l/derive workspace))) + +;; ... + +(def mouse-position + (-> (l/in [:workspace :pointer]) (l/derive st/state))) (def canvas-mouse-position - (-> (l/in [:pointer :canvas]) - (l/derive workspace))) + (-> (l/key :canvas) + (l/derive mouse-position))) (def viewport-mouse-position - (-> (l/in [:pointer :viewport]) - (l/derive workspace))) + (-> (l/key :viewport) + (l/derive mouse-position))) (def window-mouse-position - (-> (l/in [:pointer :window]) - (l/derive workspace))) + (-> (l/key :window) + (l/derive mouse-position))) (def workspace-scroll - (-> (l/key :scroll) - (l/derive workspace))) - + (-> (l/in [:workspace :scroll]) + (l/derive st/state))) + +(def shapes-by-id + (-> (l/key :shapes) + (l/derive st/state))) diff --git a/frontend/src/uxbox/main/streams.cljs b/frontend/src/uxbox/main/streams.cljs index 209f84203..c7765f090 100644 --- a/frontend/src/uxbox/main/streams.cljs +++ b/frontend/src/uxbox/main/streams.cljs @@ -13,8 +13,6 @@ [uxbox.main.workers :as uwrk] [uxbox.util.geom.point :as gpt])) -(def page-id-ref-s (rx/from-atom refs/selected-page-id)) - ;; --- Events (defn- user-interaction-event? diff --git a/frontend/src/uxbox/main/ui.cljs b/frontend/src/uxbox/main/ui.cljs index 024853316..9e288c09d 100644 --- a/frontend/src/uxbox/main/ui.cljs +++ b/frontend/src/uxbox/main/ui.cljs @@ -19,11 +19,9 @@ [uxbox.main.store :as st] [uxbox.main.ui.auth :as auth] [uxbox.main.ui.dashboard :as dashboard] - [uxbox.main.ui.lightbox :refer [lightbox]] - [uxbox.main.ui.loader :refer [loader]] [uxbox.main.ui.settings :as settings] [uxbox.main.ui.shapes] - [uxbox.main.ui.workspace :refer [workspace]] + [uxbox.main.ui.workspace :refer [workspace-page]] [uxbox.util.data :refer [parse-int uuid-str?]] [uxbox.util.dom :as dom] [uxbox.util.html.history :as html-history] @@ -106,18 +104,20 @@ (:settings/profile :settings/password :settings/notifications) - (mf/element settings/settings {:route route}) + (mf/element settings/settings #js {:route route}) (:dashboard/projects :dashboard/icons :dashboard/images :dashboard/colors) - (mf/element dashboard/dashboard {:route route}) + (mf/element dashboard/dashboard #js {:route route}) :workspace/page - (let [project (uuid (get-in route [:params :path :project])) - page (uuid (get-in route [:params :path :page]))] - [:& workspace {:project project :page page :key page}]) + (let [project-id (uuid (get-in route [:params :path :project])) + page-id (uuid (get-in route [:params :path :page]))] + [:& workspace-page {:project-id project-id + :page-id page-id + :key page-id}]) nil )))) diff --git a/frontend/src/uxbox/main/ui/auth/login.cljs b/frontend/src/uxbox/main/ui/auth/login.cljs index 1d268c305..3990593a4 100644 --- a/frontend/src/uxbox/main/ui/auth/login.cljs +++ b/frontend/src/uxbox/main/ui/auth/login.cljs @@ -57,7 +57,7 @@ " the projects will be periodicaly wiped."]]) (mf/defc login-form - {:wrap [mf/reactive*]} + {:wrap [mf/wrap-reactive]} [] (let [data (mf/react form-data) valid? (fm/valid? ::login-form data)] diff --git a/frontend/src/uxbox/main/ui/colorpicker.cljs b/frontend/src/uxbox/main/ui/colorpicker.cljs index 18ef766f0..57c69a60d 100644 --- a/frontend/src/uxbox/main/ui/colorpicker.cljs +++ b/frontend/src/uxbox/main/ui/colorpicker.cljs @@ -2,202 +2,19 @@ ;; License, v. 2.0. If a copy of the MPL was not distributed with this ;; file, You can obtain one at http://mozilla.org/MPL/2.0/. ;; -;; Copyright (c) 2016 Andrey Antukh +;; Copyright (c) 2019 Andrey Antukh (ns uxbox.main.ui.colorpicker - (:require [lentes.core :as l] - [goog.events :as events] - [uxbox.util.forms :as sc] - [rumext.core :as mx :include-macros true] - [uxbox.util.math :as mth] - [uxbox.util.data :as data] - [uxbox.util.dom :as dom] - [uxbox.util.color :as color]) - (:import goog.events.EventType)) + (:require + [goog.object :as gobj] + [rumext.alpha :as mf] + [vendor.react-color])) -;; --- Picker Box +(mf/defc colorpicker + [{:keys [on-change value colors] :as props}] + (let [on-change-complete #(on-change (gobj/get % "hex"))] + [:> js/SketchPicker {:color value + :disableAlpha true + :presetColors colors + :onChangeComplete on-change-complete}])) -(mx/defc picker-box - [] - [:svg {:width "100%" :height "100%" :version "1.1"} - [:defs - [:linearGradient {:id "gradient-black" - :x1 "0%" :y1 "100%" - :x2 "0%" :y2 "0%"} - [:stop {:offset "0%" :stopColor "#000000" :stopOpacity "1"}] - [:stop {:offset "100%" :stopColor "#CC9A81" :stopOpacity "0"}]] - [:linearGradient {:id "gradient-white" - :x1 "0%" :y1 "100%" - :x2 "100%" :y2 "100%"} - [:stop {:offset "0%" :stopColor "#FFFFFF" :stopOpacity "1"}] - [:stop {:offset "100%" :stopColor "#CC9A81" :stopOpacity "0"}]]] - [:rect {:x "0" :y "0" :width "100%" :height "100%" - :fill "url(#gradient-white)"}] - [:rect {:x "0" :y "0" :width "100%" :height "100%" - :fill "url(#gradient-black)"}]]) - -;; --- Slider Box - -(mx/defc slider-box - [] - [:svg {:width "100%" :height "100%" :version "1.1"} - [:defs - [:linearGradient {:id "gradient-hsv" - :x1 "0%" :y1 "100%" - :x2 "0%" :y2 "0%"} - [:stop {:offset "0%" :stopColor "#FF0000" :stopOpacity "1"}] - [:stop {:offset "13%" :stopColor "#FF00FF" :stopOpacity "1"}] - [:stop {:offset "25%" :stopColor "#8000FF" :stopOpacity "1"}] - [:stop {:offset "38%" :stopColor "#0040FF" :stopOpacity "1"}] - [:stop {:offset "50%" :stopColor "#00FFFF" :stopOpacity "1"}] - [:stop {:offset "63%" :stopColor "#00FF40" :stopOpacity "1"}] - [:stop {:offset "75%" :stopColor "#0BED00" :stopOpacity "1"}] - [:stop {:offset "88%" :stopColor "#FFFF00" :stopOpacity "1"}] - [:stop {:offset "100%" :stopColor "#FF0000" :stopOpacity "1"}]]] - [:rect {:x 0 :y 0 :width "100%" :height "100%" - :fill "url(#gradient-hsv)"}]]) - -(def default-dimensions - {:pi-height 5 - :pi-width 5 - :si-height 10 - :p-height 200 - :p-width 200 - :s-height 200}) - -(def small-dimensions - {:pi-height 5 - :pi-width 5 - :si-height 10 - :p-height 170 - :p-width 170 - :s-height 170}) - -;; --- Color Picker - -(defn- on-picker-click - [local dimensions on-change color event] - (let [event (.-nativeEvent event) - my (.-offsetY event) - height (:p-height dimensions) - width (:p-width dimensions) - mx (.-offsetX event) - my (.-offsetY event) - [h] color - s (/ mx width) - v (/ (- height my) height) - hex (color/hsv->hex [h s (* v 255)])] - (swap! local assoc :color [h s (* v 255)]) - (on-change hex))) - -(defn- on-slide-click - [local dimensions on-change color event] - (let [event (.-nativeEvent event) - my (.-offsetY event) - h (* (/ my (:s-height dimensions)) 360) - hsv [(+ h 15) (second color) (nth color 2)] - hex (color/hsv->hex hsv)] - (swap! local assoc :color hsv) - (on-change hex))) - -(mx/defcs colorpicker - {:mixins [mx/static (mx/local)]} - [{:keys [::mx/local] :as own} & {:keys [value on-change theme] - :or {value "#d4edfb" theme :default}}] - (let [value-rgb (color/hex->rgb value) - classes (case theme - :default "theme-default" - :small "theme-small") - dimensions (case theme - :default default-dimensions - :small small-dimensions - default-dimensions) - [h s v :as color] (or (:color @local) - (color/hex->hsv value)) - bg (color/hsv->hex [h 1 255]) - pit (- (* s (:p-width dimensions)) - (/ (:pi-height dimensions) 2)) - pil (- (- (:p-height dimensions) (* (/ v 255) (:p-height dimensions))) - (/ (:pi-width dimensions) 2)) - - sit (- (/ (* (- h 15) (:s-height dimensions)) 360) - (/ (:si-height dimensions) 2))] - (letfn [(on-mouse-down [event] - (swap! local assoc :mousedown true)) - (on-mouse-up [event] - (swap! local assoc :mousedown false)) - (on-mouse-move-slide [event] - (when (:mousedown @local) - (on-slide-click local dimensions on-change color event))) - (on-mouse-move-picker [event] - (when (:mousedown @local) - (on-picker-click local dimensions on-change color event))) - (on-hex-changed [event] - (let [value (-> (dom/get-target event) - (dom/get-value))] - (when (color/hex? value) - (on-change value)))) - (on-rgb-change [rgb id event] - (let [value (-> (dom/get-target event) - (dom/get-value) - (data/parse-int 0)) - rgb (assoc rgb id value) - hex (color/rgb->hex rgb)] - (when (color/hex? hex) - (on-change hex))))] - [:div.color-picker {:class classes} - [:div.picker-area - #_[:div.tester {:style {:width "100px" :height "100px" - :border "1px solid black" - :position "fixed" :top "50px" :left "50px" - :backgroundColor (color/hsv->hex color)}}] - [:div.picker-wrapper - [:div.picker - {:ref "picker" - :on-click (partial on-picker-click local dimensions on-change color) - :on-mouse-down on-mouse-down - :on-mouse-up on-mouse-up - :on-mouse-move on-mouse-move-picker - :style {:backgroundColor bg}} - (picker-box)] - (when-not (:mousedown @local) - [:div.picker-indicator - {:ref "picker-indicator" - :style {:top (str pil "px") - :left (str pit "px") - :pointerEvents "none"}}])] - [:div.slide-wrapper - [:div.slide - {:ref "slide" - :on-mouse-down on-mouse-down - :on-mouse-up on-mouse-up - :on-mouse-move on-mouse-move-slide - :on-click (partial on-slide-click local dimensions on-change color)} - (slider-box)] - [:div.slide-indicator - {:ref "slide-indicator" - :style {:top (str sit "px") - :pointerEvents "none"}}]]] - - [:div.inputs-area - [:input.input-text - {:placeholder "#" - :type "text" - :value value - :on-change on-hex-changed}] - [:div.row-flex - [:input.input-text - {:placeholder "R" - :on-change (partial on-rgb-change value-rgb 0) - :value (nth value-rgb 0) - :type "number"}] - [:input.input-text - {:placeholder "G" - :on-change (partial on-rgb-change value-rgb 1) - :value (nth value-rgb 1) - :type "number"}] - [:input.input-text - {:placeholder "B" - :on-change (partial on-rgb-change value-rgb 2) - :value (nth value-rgb 2) - :type "number"}]]]]))) diff --git a/frontend/src/uxbox/main/ui/confirm.cljs b/frontend/src/uxbox/main/ui/confirm.cljs index 7cf1fb5f4..d5d8731c7 100644 --- a/frontend/src/uxbox/main/ui/confirm.cljs +++ b/frontend/src/uxbox/main/ui/confirm.cljs @@ -6,22 +6,22 @@ ;; Copyright (c) 2016 Juan de la Cruz (ns uxbox.main.ui.confirm - (:require [uxbox.main.data.lightbox :as udl] - [uxbox.builtins.icons :as i] - [rumext.core :as mx :include-macros true] - [uxbox.util.i18n :refer (tr)] - [uxbox.util.dom :as dom] - [uxbox.main.ui.lightbox :as lbx])) + (:require + [uxbox.builtins.icons :as i] + [rumext.alpha :as mf] + [uxbox.main.ui.modal :as modal] + [uxbox.util.i18n :refer (tr)] + [uxbox.util.dom :as dom])) -(mx/defc confirm-dialog +(mf/defc confirm-dialog [{:keys [on-accept on-cancel hint] :as ctx}] (letfn [(accept [event] (dom/prevent-default event) - (udl/close!) + (modal/hide!) (on-accept (dissoc ctx :on-accept :on-cancel))) (cancel [event] (dom/prevent-default event) - (udl/close!) + (modal/hide!) (when on-cancel (on-cancel (dissoc ctx :on-accept :on-cancel))))] [:div.lightbox-body.confirm-dialog @@ -38,9 +38,7 @@ :value (tr "ds.confirm-cancel") :on-click cancel}]] [:a.close {:href "#" - :on-click #(do (dom/prevent-default %) - (udl/close!))} i/close]])) - -(defmethod lbx/render-lightbox :confirm - [context] - (confirm-dialog context)) + :on-click #(do + (dom/prevent-default %) + (modal/hide!))} + i/close]])) diff --git a/frontend/src/uxbox/main/ui/dashboard.cljs b/frontend/src/uxbox/main/ui/dashboard.cljs index 64aa47806..8d86362ea 100644 --- a/frontend/src/uxbox/main/ui/dashboard.cljs +++ b/frontend/src/uxbox/main/ui/dashboard.cljs @@ -19,19 +19,23 @@ (uuid-str? id) (uuid id) :else nil) type (when (str/alpha? type) (keyword type))] - {:section (:name data) - :type type - :id id})) + [(:name data) type id])) (mf/defc dashboard - {:wrap [mf/memo*]} [{:keys [route] :as props}] - (let [{:keys [section] :as props} (parse-route route)] + (let [[section type id] (parse-route route)] [:main.dashboard-main (messages-widget) - [:& header props] + [:& header {:section section}] (case section - :dashboard/icons (mf/element icons/icons-page props) - :dashboard/images (mf/element images/images-page props) - :dashboard/projects (mf/element projects/projects-page props) - :dashboard/colors (mf/element colors/colors-page props))])) + :dashboard/icons + [:& icons/icons-page {:type type :id id}] + + :dashboard/images + [:& images/images-page {:type type :id id}] + + :dashboard/projects + [:& projects/projects-page] + + :dashboard/colors + [:& colors/colors-page {:type type :id id}])])) diff --git a/frontend/src/uxbox/main/ui/dashboard/colors.cljs b/frontend/src/uxbox/main/ui/dashboard/colors.cljs index aaa9458c5..f2aef36f6 100644 --- a/frontend/src/uxbox/main/ui/dashboard/colors.cljs +++ b/frontend/src/uxbox/main/ui/dashboard/colors.cljs @@ -2,215 +2,208 @@ ;; License, v. 2.0. If a copy of the MPL was not distributed with this ;; file, You can obtain one at http://mozilla.org/MPL/2.0/. ;; -;; Copyright (c) 2015-2017 Andrey Antukh ;; Copyright (c) 2015-2017 Juan de la Cruz +;; Copyright (c) 2015-2019 Andrey Antukh (ns uxbox.main.ui.dashboard.colors (:require [cuerdas.core :as str] [lentes.core :as l] - [rumext.core :as mx] [rumext.alpha :as mf] [uxbox.builtins.icons :as i] [uxbox.main.data.colors :as dc] - [uxbox.main.data.dashboard :as dd] - [uxbox.main.data.lightbox :as udl] [uxbox.main.store :as st] [uxbox.main.ui.colorpicker :refer [colorpicker]] - [uxbox.main.ui.dashboard.header :refer [header]] + [uxbox.main.ui.confirm :refer [confirm-dialog]] [uxbox.main.ui.keyboard :as k] - [uxbox.main.ui.lightbox :as lbx] - [uxbox.main.ui.messages :refer [messages-widget]] + [uxbox.main.ui.modal :as modal] [uxbox.util.color :refer [hex->rgb]] + [uxbox.util.data :refer [seek]] [uxbox.util.dom :as dom] [uxbox.util.i18n :as t :refer [tr]] - [uxbox.util.lens :as ul] [uxbox.util.router :as rt])) ;; --- Refs -(def collections-ref +(def collections-iref (-> (l/key :colors-collections) (l/derive st/state))) -(def opts-ref - (-> (l/in [:dashboard :colors]) +(def selected-colors-iref + (-> (l/in [:dashboard :colors :selected]) (l/derive st/state))) +;; --- Colors Modal (Component) + +(mf/defc color-modal + [{:keys [on-submit value] :as props}] + (let [local (mf/use-ref value)] + [:div.lightbox-body + [:h3 (tr "ds.color-lightbox.title")] + [:form + [:div.row-flex.center + [:& colorpicker {:value (or @local "#00ccff") + :on-change #(reset! local %)}]] + [:input#project-btn.btn-primary + {:value (tr "ds.color-lightbox.add") + :on-click #(on-submit @local) + :type "button"}]]])) ;; --- Page Title -(mf/def page-title - :mixins [(mf/local) mf/memo mf/reactive] +(mf/defc page-title + [{:keys [coll] :as props}] + (let [edit? (mf/use-state false) + input (mf/use-ref* nil) + own? (= :own (:type coll))] + (letfn [(save [] + (let [dom (mf/ref-node input) + name (dom/get-inner-text dom) + id (:id coll)] + (st/emit! (dc/rename-collection id (str/trim name))) + (reset! edit? false))) + (cancel [] + (reset! edit? false)) + (edit [] + (reset! edit? true)) + (on-input-keydown [e] + (cond + (k/esc? e) (cancel) + (k/enter? e) + (do + (dom/prevent-default e) + (dom/stop-propagation e) + (save)))) + (delete [] + (st/emit! (dc/delete-collection (:id coll)) + (rt/nav :dashboard/colors nil {:type (:type coll)}))) - :render - (fn [{:keys [::mf/local] :as own} - {:keys [id] :as coll}] - (let [own? (= :own (:type coll)) - edit? (:edit @local)] - (letfn [(save [] - (let [dom (mx/ref-node own "input") - name (dom/get-inner-text dom)] - (st/emit! (dc/rename-collection id (str/trim name))) - (swap! local assoc :edit false))) - (cancel [] - (swap! local assoc :edit false)) - (edit [] - (swap! local assoc :edit true)) - (on-input-keydown [e] - (cond - (k/esc? e) (cancel) - (k/enter? e) - (do - (dom/prevent-default e) - (dom/stop-propagation e) - (save)))) - (delete [] - (st/emit! (dc/delete-collection id))) - (on-delete [] - (udl/open! :confirm {:on-accept delete}))] - [:div.dashboard-title - [:h2 - (if edit? - [:div.dashboard-title-field - [:span.edit {:content-editable true - :ref "input" - :on-key-down on-input-keydown} - (:name coll)] - [:span.close {:on-click cancel} i/close]] - (if own? - [:span.dashboard-title-field {:on-double-click edit} - (:name coll)] - [:span.dashboard-title-field - (:name coll)]))] - (when (and own? coll) - [:div.edition - (if edit? - [:span {:on-click save} i/save] - [:span {:on-click edit} i/pencil]) - [:span {:on-click on-delete} i/trash]])])))) + (on-delete [] + (modal/show! confirm-dialog {:on-accept delete}))] + [:div.dashboard-title + [:h2 + (if @edit? + [:div.dashboard-title-field + [:span.edit {:content-editable true + :ref input + :on-key-down on-input-keydown + :dangerouslySetInnerHTML {"__html" (:name coll)}}] + [:span.close {:on-click cancel} i/close]] + (if own? + [:span.dashboard-title-field {:on-double-click edit} + (:name coll)] + [:span.dashboard-title-field + (:name coll)]))] + (when (and own? coll) + [:div.edition + (if @edit? + [:span {:on-click save} i/save] + [:span {:on-click edit} i/pencil]) + [:span {:on-click on-delete} i/trash]])]))) ;; --- Nav -(mf/def nav-item - :mixins [(mf/local) mf/memo] - - :render - (fn [{:keys [::mf/local] :as own} - {:keys [id type name ::selected?] :as coll}] - (let [colors (count (:colors coll)) - editable? (= type :own)] - (letfn [(on-click [event] - (let [type (or type :own)] - (st/emit! (rt/navigate :dashboard/colors nil {:type type :id id})))) - (on-input-change [event] +(mf/defc nav-item + [{:keys [coll selected?] :as props}] + (let [local (mf/use-state {}) + {:keys [id type name]} coll + colors (count (:colors coll)) + editable? (= type :own)] + (letfn [(on-click [event] + (let [type (or type :own)] + (st/emit! (rt/nav :dashboard/colors nil {:type type :id id})))) + (on-input-change [event] (let [value (dom/get-target event) value (dom/get-value value)] (swap! local assoc :name value))) - (on-cancel [event] - (swap! local dissoc :name) - (swap! local dissoc :edit)) - (on-double-click [event] - (when editable? - (swap! local assoc :edit true))) - (on-input-keyup [event] - (when (k/enter? event) - (let [value (dom/get-target event) - value (dom/get-value value)] - (st/emit! (dc/rename-collection id (str/trim (:name @local)))) - (swap! local assoc :edit false))))] - [:li {:on-click on-click - :on-double-click on-double-click - :class-name (when selected? "current")} - (if (:edit @local) - [:div - [:input.element-title - {:value (if (:name @local) (:name @local) name) - :on-change on-input-change - :on-key-down on-input-keyup}] - [:span.close {:on-click on-cancel} i/close]] - [:span.element-title name]) - [:span.element-subtitle - (tr "ds.num-elements" (t/c colors))]])))) + (on-cancel [event] + (swap! local dissoc :name) + (swap! local dissoc :edit)) + (on-double-click [event] + (when editable? + (swap! local assoc :edit true))) + (on-input-keyup [event] + (when (k/enter? event) + (let [value (dom/get-target event) + value (dom/get-value value)] + (st/emit! (dc/rename-collection id (str/trim (:name @local)))) + (swap! local assoc :edit false))))] + [:li {:on-click on-click + :on-double-click on-double-click + :class-name (when selected? "current")} + (if (:edit @local) + [:div + [:input.element-title + {:value (if (:name @local) (:name @local) name) + :on-change on-input-change + :on-key-down on-input-keyup}] + [:span.close {:on-click on-cancel} i/close]] + [:span.element-title name]) + [:span.element-subtitle + (tr "ds.num-elements" (t/c colors))]]))) -(mf/def nav - :mixins [mf/memo mf/reactive] - - :render - (fn [own {:keys [id type] :as props}] - (let [own? (= type :own) - builtin? (= type :builtin) - colls (mf/react collections-ref) - select-tab (fn [type] - (if-let [coll (->> (vals colls) - (filter #(= type (:type %))) - (sort-by :created-at) - (first))] - (st/emit! (rt/nav :dashboard/colors nil {:type type :id (:id coll)})) - (st/emit! (rt/nav :dashboard/colors nil {:type type}))))] - - [:div.library-bar - [:div.library-bar-inside - [:ul.library-tabs - [:li {:class-name (when own? "current") - :on-click (partial select-tab :own)} - (tr "ds.your-colors-title")] - [:li {:class-name (when builtin? "current") - :on-click (partial select-tab :builtin)} - (tr "ds.store-colors-title")]] - [:ul.library-elements - (when own? - [:li - [:a.btn-primary {:on-click #(st/emit! (dc/create-collection))} - (tr "ds.colors-collection.new")]]) - (for [coll (cond->> (vals colls) - own? (filter #(= :own (:type %))) - builtin? (filter #(= :builtin (:type %))) - true (sort-by :created-at))] - (let [selected? (= (:id coll) id)] - (nav-item (assoc coll ::selected? selected?))))]]]))) +(mf/defc nav + [{:keys [id type colls selected-coll] :as props}] + (let [own? (= type :own) + builtin? (= type :builtin) + select-tab #(st/emit! (rt/nav :dashboard/colors nil {:type %}))] + [:div.library-bar + [:div.library-bar-inside + [:ul.library-tabs + [:li {:class-name (when own? "current") + :on-click (partial select-tab :own)} + (tr "ds.your-colors-title")] + [:li {:class-name (when builtin? "current") + :on-click (partial select-tab :builtin)} + (tr "ds.store-colors-title")]] + [:ul.library-elements + (when own? + [:li + [:a.btn-primary {:on-click #(st/emit! (dc/create-collection))} + (tr "ds.colors-collection.new")]]) + (for [item colls] + (let [selected? (= (:id item) (:id selected-coll))] + [:& nav-item {:coll item :selected? selected? :key (:id item)}]))]]])) ;; --- Grid -(mx/defc grid-form - [coll-id] - [:div.grid-item.small-item.add-project - {:on-click #(udl/open! :color-form {:coll coll-id})} - [:span (tr "ds.color-new")]]) +(mf/defc grid-form + [{:keys [id] :as props}] + (letfn [(on-submit [val] + (st/emit! (dc/add-color id val)) + (modal/hide!)) + (on-click [event] + (modal/show! color-modal {:on-submit on-submit}))] + [:div.grid-item.small-item.add-project {:on-click on-click} + [:span (tr "ds.color-new")]])) -(mf/def grid-options-tooltip - :mixins [mf/reactive mf/memo] +(mf/defc grid-options-tooltip + [{:keys [selected on-select title] :as props}] + {:pre [(uuid? selected) + (fn? on-select) + (string? title)]} + (let [colls (mf/deref collections-iref) + colls (->> (vals colls) + (filter #(= :own (:type %))) + (remove #(= selected (:id %))) + (sort-by :name colls)) + on-select (fn [event id] + (dom/prevent-default event) + (dom/stop-propagation event) + (on-select id))] + [:ul.move-list + [:li.title title] + (for [{:keys [id name] :as coll} colls] + [:li {:key (str id)} + [:a {:on-click #(on-select % id)} name]])])) - :render - (fn [own {:keys [selected on-select title]}] - {:pre [(uuid? selected) - (fn? on-select) - (string? title)]} - (let [colls (mf/react collections-ref) - colls (->> (vals colls) - (filter #(= :own (:type %))) - (remove #(= selected (:id %))) - (sort-by :name colls)) - on-select (fn [event id] - (dom/prevent-default event) - (dom/stop-propagation event) - (on-select id))] - [:ul.move-list - [:li.title title] - (for [{:keys [id name] :as coll} colls] - [:li {:key (str id)} - [:a {:on-click #(on-select % id)} name]])]))) - -(mf/def grid-options - :mixins [mf/memo (mf/local)] - - :render - (fn [{:keys [::mf/local] :as own} - {:keys [type id] :as coll}] +(mf/defc grid-options + [{:keys [id type coll selected] :as props}] + (let [local (mf/use-state {})] (letfn [(delete [event] - (st/emit! (dc/delete-selected-colors))) + (st/emit! (dc/delete-colors id selected))) (on-delete [event] - (udl/open! :confirm {:on-accept delete})) + (modal/show! confirm-dialog {:on-accept delete})) (on-toggle-copy [event] (swap! local update :show-copy-tooltip not) (swap! local assoc :show-move-tooltip false)) @@ -237,17 +230,17 @@ {:alt (tr "ds.multiselect-bar.copy") :on-click on-toggle-copy} (when (:show-copy-tooltip @local) - (grid-options-tooltip {:selected id - :title (tr "ds.multiselect-bar.copy-to-library") - :on-select on-copy})) + [:& grid-options-tooltip {:selected id + :title (tr "ds.multiselect-bar.copy-to-library") + :on-select on-copy}]) i/copy] [:span.move-item.tooltip.tooltip-top {:alt (tr "ds.multiselect-bar.move") :on-click on-toggle-move} (when (:show-move-tooltip @local) - (grid-options-tooltip {:selected id - :title (tr "ds.multiselect-bar.move-to-library") - :on-select on-move})) + [:& grid-options-tooltip {:selected id + :title (tr "ds.multiselect-bar.move-to-library") + :on-select on-move}]) i/move] [:span.delete.tooltip.tooltip-top {:alt (tr "ds.multiselect-bar.delete") @@ -260,114 +253,76 @@ {:alt (tr "ds.multiselect-bar.copy") :on-click on-toggle-copy} (when (:show-copy-tooltip @local) - (grid-options-tooltip {:selected id - :title (tr "ds.multiselect-bar.copy-to-library") - :on-select on-copy})) + [:& grid-options-tooltip {:selected id + :title (tr "ds.multiselect-bar.copy-to-library") + :on-select on-copy}]) i/organize]])]))) -(mf/def grid-item - :key-fn :color - :mixins [mf/memo] +(mf/defc grid-item + [{:keys [color selected?] :as props}] + (letfn [(toggle-selection [event] + (st/emit! (dc/toggle-color-selection color)))] + [:div.grid-item.small-item.project-th {:on-click toggle-selection} + [:span.color-swatch {:style {:background-color color}}] + [:div.input-checkbox.check-primary + [:input {:type "checkbox" + :id color + :on-change toggle-selection + :checked selected?}] + [:label {:for color}]] + [:span.color-data color] + [:span.color-data (apply str "RGB " (interpose ", " (hex->rgb color)))]])) - :render - (fn [own {:keys [color selected?] :as props}] - (letfn [(toggle-selection [event] - (st/emit! (dc/toggle-color-selection color)))] - [:div.grid-item.small-item.project-th {:on-click toggle-selection} - [:span.color-swatch {:style {:background-color color}}] - [:div.input-checkbox.check-primary - [:input {:type "checkbox" - :id color - :on-change toggle-selection - :checked selected?}] - [:label {:for color}]] - [:span.color-data color] - [:span.color-data (apply str "RGB " (interpose ", " (hex->rgb color)))]]))) +(mf/defc grid + [{:keys [id type coll selected] :as props}] + (let [{:keys [colors]} coll + editable? (= :own type) + colors (->> (remove nil? colors) + (sort-by identity))] + [:div.dashboard-grid-content + [:div.dashboard-grid-row + (when (and editable? id) + [:& grid-form {:id id}]) + (for [color colors] + (let [selected? (contains? selected color)] + [:& grid-item {:color color :selected? selected? :key color}]))]])) -(mf/def grid - :mixins [mf/memo] - - :render - (fn [own {:keys [selected ::coll] :as props}] - (let [{:keys [id type colors]} coll - editable? (or (= :own type) (nil? id)) - colors (->> (remove nil? colors) - (sort-by identity))] - [:div.dashboard-grid-content - [:div.dashboard-grid-row - (when editable? (grid-form props)) - (for [color colors] - (let [selected? (contains? selected color)] - (grid-item {:color color :selected? selected?})))]]))) - -(mf/def content - :mixins [mf/reactive mf/memo] - - :init - (fn [own {:keys [id] :as props}] - (assoc own ::coll-ref (-> (l/in [:colors-collections id]) - (l/derive st/state)))) - - :render - (fn [own props] - (let [opts (mf/react opts-ref) - coll (mf/react (::coll-ref own)) - props (merge opts props)] - [:section.dashboard-grid.library - (page-title coll) - (grid (assoc props ::coll coll)) - (when (seq (:selected opts)) - (grid-options props))]))) +(mf/defc content + [{:keys [id type coll] :as props}] + (let [selected (mf/deref selected-colors-iref)] + [:section.dashboard-grid.library + [:& page-title {:coll coll}] + [:& grid {:coll coll :id id :type type :selected selected}] + (when (seq selected) + [:& grid-options {:id id :type type + :selected selected + :coll coll}])])) ;; --- Colors Page -(mf/def colors-page - :key-fn identity - :mixins #{mf/memo mf/reactive} +(mf/defc colors-page + [{:keys [id type] :as props}] + (let [type (or type :own) - :init - (fn [own props] - (let [{:keys [type id]} (::mf/props own)] - (st/emit! (dc/initialize type id)) - own)) + colls (mf/deref collections-iref) + colls (cond->> (vals colls) + (= type :own) (filter #(= :own (:type %))) + (= type :builtin) (filter #(= :builtin (:type %))) + true (sort-by :created-at)) + selected-coll (if id + (seek #(= id (:id %)) colls) + (first colls)) + id (:id selected-coll)] - :render - (fn [own {:keys [type] :as props}] - (let [type (or type :own) - props (assoc props :type type)] - [:section.dashboard-content - (nav props) - (content props)]))) + (mf/use-effect {:init #(st/emit! (dc/initialize)) :deps #js [id type]}) + (mf/use-effect {:init #(st/emit! (dc/fetch-collections))}) -;; --- Colors Lightbox (Component) + [:section.dashboard-content + [:& nav {:type type + :id id + :colls colls + :selected-coll selected-coll}] + [:& content {:type type + :id id + :coll selected-coll}]])) -(mx/defcs color-lightbox - {:mixins [(mx/local {}) mx/static]} - [{:keys [::mx/local]} {:keys [coll color] :as params}] - (letfn [(on-submit [event] - (let [params {:id coll - :from color - :to (:hex @local)}] - (st/emit! (dc/replace-color params)) - (udl/close!))) - (on-change [event] - (let [value (str/trim (dom/event->value event))] - (swap! local assoc :hex value))) - (on-close [event] - (udl/close!))] - [:div.lightbox-body - [:h3 (tr "ds.color-lightbox.title")] - [:form - [:div.row-flex.center - (colorpicker - :value (or (:hex @local) color "#00ccff") - :on-change #(swap! local assoc :hex %))] - - [:input#project-btn.btn-primary {:value (tr "ds.color-lightbox.add") - :on-click on-submit - :type "button"}]] - [:a.close {:on-click on-close} i/close]])) - -(defmethod lbx/render-lightbox :color-form - [params] - (color-lightbox params)) diff --git a/frontend/src/uxbox/main/ui/dashboard/projects.cljs b/frontend/src/uxbox/main/ui/dashboard/projects.cljs index 1279b3cea..c484319f4 100644 --- a/frontend/src/uxbox/main/ui/dashboard/projects.cljs +++ b/frontend/src/uxbox/main/ui/dashboard/projects.cljs @@ -73,9 +73,9 @@ (l/lens #(-> % vals count))) (l/derive st/state)))) :render - (fn [own props] - (let [ordering (:order props :created) - filtering (:filter props "") + (fn [own {:keys [opts] :as props}] + (let [ordering (:order opts :created) + filtering (:filter opts "") num-projects (mf/react (::num-projects own))] (letfn [(on-term-change [event] (let [term (-> (dom/get-target event) @@ -119,7 +119,7 @@ [{:keys [project] :as props}] (let [url (mf/use-state nil)] (mf/use-effect - {:watch (:page-id project) + {:deps #js [(:page-id project)] :init (fn [] (when-let [page-id (:page-id project)] (let [svg (exports/render-page page-id) @@ -141,6 +141,7 @@ ;; --- Grid Item (mf/defc grid-item + {:wrap [mf/wrap-memo]} [{:keys [project] :as props}] (let [local (mf/use-state {}) on-navigate #(st/emit! (udp/go-to (:id project))) @@ -188,9 +189,11 @@ ;; --- Grid (mf/defc grid - {:wrap [mf/reactive*]} - [{:keys [order filter] :or {order :created filter ""} :as props}] - (let [projects (->> (vals (mf/deref projects-ref)) + [{:keys [opts] :as props}] + (let [order (:order opts :created) + filter (:filter opts "") + projects (mf/deref projects-ref) + projects (->> (vals projects) (filter-projects-by filter) (sort-projects-by order)) on-click #(do @@ -208,13 +211,10 @@ ;; --- Projects Page (mf/defc projects-page - {:wrap [mf/reactive*]} - [props] - (let [opts (mf/deref opts-ref) - props (merge opts props)] - (mf/use-effect - {:init #(st/emit! (udp/initialize))}) + [_] + (mf/use-effect + {:init #(st/emit! (udp/initialize))}) + (let [opts (mf/deref opts-ref)] [:section.dashboard-content - [:& menu props] - [:& grid props]])) - + [:& menu {:opts opts}] + [:& grid {:opts opts}]])) diff --git a/frontend/src/uxbox/main/ui/lightbox.cljs b/frontend/src/uxbox/main/ui/lightbox.cljs index fa6e9da1e..c8c97cbce 100644 --- a/frontend/src/uxbox/main/ui/lightbox.cljs +++ b/frontend/src/uxbox/main/ui/lightbox.cljs @@ -1,4 +1,5 @@ (ns uxbox.main.ui.lightbox + "DEPRECATED: should be replaced by uxbox.main.ui.modal" (:require [goog.events :as events] [lentes.core :as l] diff --git a/frontend/src/uxbox/main/ui/modal.cljs b/frontend/src/uxbox/main/ui/modal.cljs new file mode 100644 index 000000000..5e8406b44 --- /dev/null +++ b/frontend/src/uxbox/main/ui/modal.cljs @@ -0,0 +1,56 @@ +(ns uxbox.main.ui.modal + (:require + [goog.events :as events] + [lentes.core :as l] + [rumext.alpha :as mf] + [uxbox.main.store :as st] + [uxbox.main.ui.keyboard :as k] + [uxbox.util.data :refer [classnames]] + [uxbox.util.dom :as dom]) + (:import goog.events.EventType)) + +(defonce state (atom nil)) + +(defn show! + [component props] + (reset! state {:component component :props props})) + +(defn hide! + [] + (reset! state nil)) + +(defn- on-esc-clicked + [event] + (when (k/esc? event) + (reset! state nil) + (dom/stop-propagation event))) + +(defn- on-parent-clicked + [event parent-ref] + (let [parent (mf/ref-node parent-ref) + current (dom/get-target event)] + (when (dom/equals? parent current) + (reset! state nil) + #_(st/emit! (udl/hide-lightbox))))) + +(mf/defc modal-wrapper + [{:keys [component props]}] + (mf/use-effect + {:init #(events/listen js/document EventType.KEYDOWN on-esc-clicked) + :end #(events/unlistenByKey %)}) + (let [classes (classnames :transparent (:transparent? props)) + parent-ref (mf/use-ref* nil)] + [:div.lightbox {:class classes + :ref parent-ref + :on-click #(on-parent-clicked % parent-ref)} + (mf/element component props)])) + +(mf/defc modal + [_] + (when-let [{:keys [component props]} (mf/deref state)] + [:& modal-wrapper {:component component + :props props + :key (random-uuid)}])) + + + diff --git a/frontend/src/uxbox/main/ui/settings.cljs b/frontend/src/uxbox/main/ui/settings.cljs index a86688c39..3da1a4f6b 100644 --- a/frontend/src/uxbox/main/ui/settings.cljs +++ b/frontend/src/uxbox/main/ui/settings.cljs @@ -18,7 +18,7 @@ [uxbox.main.ui.settings.profile :as profile])) (mf/defc settings - {:wrap [mf/memo*]} + {:wrap [mf/wrap-memo]} [{:keys [route] :as props}] (let [section (get-in route [:data :name])] [:main.dashboard-main diff --git a/frontend/src/uxbox/main/ui/settings/profile.cljs b/frontend/src/uxbox/main/ui/settings/profile.cljs index e2036ff69..8c62a8e84 100644 --- a/frontend/src/uxbox/main/ui/settings/profile.cljs +++ b/frontend/src/uxbox/main/ui/settings/profile.cljs @@ -113,7 +113,7 @@ ;; --- Profile Photo Form (mf/defc profile-photo-form - {:wrap [mf/reactive*]} + {:wrap [mf/wrap-reactive]} [] (letfn [(on-change [event] (let [target (dom/get-target event) diff --git a/frontend/src/uxbox/main/ui/shapes.cljs b/frontend/src/uxbox/main/ui/shapes.cljs index 6a0890fa2..b2163d7b7 100644 --- a/frontend/src/uxbox/main/ui/shapes.cljs +++ b/frontend/src/uxbox/main/ui/shapes.cljs @@ -5,7 +5,55 @@ ;; Copyright (c) 2016-2017 Andrey Antukh (ns uxbox.main.ui.shapes - (:require [uxbox.main.ui.shapes.group :as group])) + (:require + [lentes.core :as l] + [rumext.alpha :as mf] + [rumext.core :as mx] + [uxbox.main.geom :as geom] + [uxbox.main.refs :as refs] + [uxbox.main.store :as st] + [uxbox.main.ui.shapes.attrs :as attrs] + [uxbox.main.ui.shapes.circle :as circle] + [uxbox.main.ui.shapes.common :as common] + [uxbox.main.ui.shapes.icon :as icon] + [uxbox.main.ui.shapes.image :as image] + [uxbox.main.ui.shapes.path :as path] + [uxbox.main.ui.shapes.rect :as rect] + [uxbox.main.ui.shapes.text :as text] + [uxbox.util.data :refer [classnames]] + [uxbox.util.geom.matrix :as gmt])) + +;; (def render-component group/render-component) +;; (def shape group/component-container) + +(defn render-shape + [shape] + (case (:type shape) + ;; :group (group-component shape) + :text (text/text-component shape) + :icon (icon/icon-component shape) + :rect (rect/rect-component shape) + :path (path/path-component shape) + :image (image/image-component shape) + :circle (circle/circle-component shape))) + + +(mf/def shape-container + :mixins [mf/reactive mf/memo] + :init + (fn [own {:keys [id] :as props}] + (assoc own ::shape-ref (-> (l/in [:shapes id]) + (l/derive st/state)))) + + :render + (fn [own {:keys [id] :as props}] + (when-let [shape (mf/react (::shape-ref own))] + (when-not (:hidden shape) + (render-shape shape))))) + +;; NOTE: temporal workaround +(mx/defc shape + [id] + (mf/element shape-container {:id id})) + -(def render-component group/render-component) -(def shape group/component-container) diff --git a/frontend/src/uxbox/main/ui/shapes/common.cljs b/frontend/src/uxbox/main/ui/shapes/common.cljs index 9d28a1247..17deb5adf 100644 --- a/frontend/src/uxbox/main/ui/shapes/common.cljs +++ b/frontend/src/uxbox/main/ui/shapes/common.cljs @@ -2,43 +2,15 @@ ;; License, v. 2.0. If a copy of the MPL was not distributed with this ;; file, You can obtain one at http://mozilla.org/MPL/2.0/. ;; -;; Copyright (c) 2016-2017 Andrey Antukh +;; Copyright (c) 2016-2019 Andrey Antukh (ns uxbox.main.ui.shapes.common - (:require [lentes.core :as l] - [beicon.core :as rx] - [potok.core :as ptk] - [uxbox.main.store :as st] - [uxbox.main.refs :as refs] - [uxbox.main.streams :as streams] - [uxbox.main.geom :as geom] - [uxbox.main.user-events :as uev] - [uxbox.main.data.shapes :as uds] - [uxbox.main.ui.keyboard :as kbd] - [uxbox.util.dom :as dom])) - -;; --- Movement - -;; TODO: implement in the same way as drawing (move under uxbox.main.data.workspace.) - -(defn start-move - [] - (letfn [(on-move [shape delta] - (st/emit! (uds/apply-temporal-displacement shape delta))) - (on-stop [shape] - (st/emit! (uds/apply-displacement shape))) - (on-start [shape] - (let [stoper (->> streams/events - (rx/filter uev/mouse-up?) - (rx/take 1)) - stream (->> streams/mouse-position-deltas - (rx/take-until stoper)) - on-move (partial on-move shape) - on-stop (partial on-stop shape)] - (when @refs/selected-alignment - (st/emit! (uds/initial-shape-align shape))) - (rx/subscribe stream on-move nil on-stop)))] - (run! on-start @refs/selected-shapes))) + (:require + [uxbox.main.data.workspace :as udw] + [uxbox.main.refs :as refs] + [uxbox.main.store :as st] + [uxbox.main.ui.keyboard :as kbd] + [uxbox.util.dom :as dom])) ;; --- Events @@ -48,27 +20,24 @@ drawing? @refs/selected-drawing-tool] (when-not (:blocked shape) (cond - (or drawing? - (and group (:locked (geom/resolve-parent shape)))) + drawing? nil (and (not selected?) (empty? selected)) (do (dom/stop-propagation event) - (st/emit! (uds/select-shape id)) - (start-move)) + (st/emit! (udw/select-shape id) + (udw/start-move-selected))) (and (not selected?) (not (empty? selected))) (do (dom/stop-propagation event) (if (kbd/shift? event) - (st/emit! (uds/select-shape id)) - (do - (st/emit! (uds/deselect-all) - (uds/select-shape id)) - (start-move)))) - + (st/emit! (udw/select-shape id)) + (st/emit! (udw/deselect-all) + (udw/select-shape id) + (udw/start-move-selected)))) :else (do (dom/stop-propagation event) - (start-move)))))) + (st/emit! (udw/start-move-selected))))))) diff --git a/frontend/src/uxbox/main/ui/shapes/group.cljs b/frontend/src/uxbox/main/ui/shapes/group.cljs index f6de9b483..475139c7a 100644 --- a/frontend/src/uxbox/main/ui/shapes/group.cljs +++ b/frontend/src/uxbox/main/ui/shapes/group.cljs @@ -2,24 +2,25 @@ ;; License, v. 2.0. If a copy of the MPL was not distributed with this ;; file, You can obtain one at http://mozilla.org/MPL/2.0/. ;; -;; Copyright (c) 2016-2017 Andrey Antukh +;; Copyright (c) 2016-2019 Andrey Antukh (ns uxbox.main.ui.shapes.group - (:require [lentes.core :as l] - [uxbox.main.store :as st] - [uxbox.main.geom :as geom] - [uxbox.main.refs :as refs] - [uxbox.main.ui.shapes.common :as common] - [uxbox.main.ui.shapes.attrs :as attrs] - [uxbox.main.ui.shapes.icon :as icon] - [uxbox.main.ui.shapes.rect :as rect] - [uxbox.main.ui.shapes.circle :as circle] - [uxbox.main.ui.shapes.text :as text] - [uxbox.main.ui.shapes.path :as path] - [uxbox.main.ui.shapes.image :as image] - [uxbox.util.data :refer [classnames]] - [uxbox.util.geom.matrix :as gmt] - [rumext.core :as mx :include-macros true])) + (:require + [lentes.core :as l] + [rumext.core :as mx] + [uxbox.main.geom :as geom] + [uxbox.main.refs :as refs] + [uxbox.main.store :as st] + [uxbox.main.ui.shapes.attrs :as attrs] + [uxbox.main.ui.shapes.circle :as circle] + [uxbox.main.ui.shapes.common :as common] + [uxbox.main.ui.shapes.icon :as icon] + [uxbox.main.ui.shapes.image :as image] + [uxbox.main.ui.shapes.path :as path] + [uxbox.main.ui.shapes.rect :as rect] + [uxbox.main.ui.shapes.text :as text] + [uxbox.util.data :refer [classnames]] + [uxbox.util.geom.matrix :as gmt])) ;; --- Helpers diff --git a/frontend/src/uxbox/main/ui/shapes/selection.cljs b/frontend/src/uxbox/main/ui/shapes/selection.cljs deleted file mode 100644 index 2abedb2b9..000000000 --- a/frontend/src/uxbox/main/ui/shapes/selection.cljs +++ /dev/null @@ -1,290 +0,0 @@ -;; This Source Code Form is subject to the terms of the Mozilla Public -;; License, v. 2.0. If a copy of the MPL was not distributed with this -;; file, You can obtain one at http://mozilla.org/MPL/2.0/. -;; -;; Copyright (c) 2015-2017 Andrey Antukh -;; Copyright (c) 2015-2017 Juan de la Cruz - -(ns uxbox.main.ui.shapes.selection - "Multiple selection handlers component." - (:require [lentes.core :as l] - [beicon.core :as rx] - [potok.core :as ptk] - [uxbox.main.store :as st] - [uxbox.main.constants :as c] - [uxbox.main.refs :as refs] - [uxbox.main.streams :as streams] - [uxbox.main.workers :as uwrk] - [uxbox.main.user-events :as uev] - [uxbox.main.data.shapes :as uds] - [uxbox.main.ui.shapes.common :as scommon] - [uxbox.main.geom :as geom] - [rumext.core :as mx] - [rumext.alpha :as mf] - [uxbox.util.geom.matrix :as gmt] - [uxbox.util.geom.point :as gpt] - [uxbox.util.dom :as dom])) - -;; --- Refs & Constants - -(def ^:private +circle-props+ - {:r 6 - :style {:fillOpacity "1" - :strokeWidth "1px" - :vectorEffect "non-scaling-stroke"} - :fill "#31e6e0" - :stroke "#28c4d4"}) - -(defn- focus-selected-shapes - [state] - (let [selected (get-in state [:workspace :selected])] - (mapv #(get-in state [:shapes %]) selected))) - -(def ^:private selected-shapes-ref - "A customized version of `refs/selected-shapes` that - additionally resolves the shapes to the real object - instead of just return a set of ids." - (-> (l/lens focus-selected-shapes) - (l/derive st/state))) - -(def ^:private selected-modifers-ref - "A customized version of `refs/selected-modifiers` - that instead of focus to one concrete id, it focuses - on the whole map." - (-> (l/key :modifiers) - (l/derive refs/workspace))) - -;; --- Resize Implementation - -(defn- start-resize - [vid ids shape] - (letfn [(on-resize [shape [point lock?]] - (let [result (geom/resize-shape vid shape point lock?) - scale (geom/calculate-scale-ratio shape result) - mtx (geom/generate-resize-matrix vid shape scale) - xfm (map #(uds/apply-temporal-resize % mtx))] - (apply st/emit! (sequence xfm ids)))) - - (on-end [] - (apply st/emit! (map uds/apply-resize ids))) - - ;; Unifies the instantaneous proportion lock modifier - ;; activated by Ctrl key and the shapes own proportion - ;; lock flag that can be activated on element options. - (normalize-proportion-lock [[point ctrl?]] - (let [proportion-lock? (:proportion-lock shape)] - [point (or proportion-lock? ctrl?)])) - - ;; Applies alginment to point if it is currently - ;; activated on the current workspace - (apply-grid-alignment [point] - (if @refs/selected-alignment - (uwrk/align-point point) - (rx/of point))) - - ;; Apply the current zoom factor to the point. - (apply-zoom [point] - (gpt/divide point @refs/selected-zoom))] - - (let [shape (->> (geom/shape->rect-shape shape) - (geom/size)) - stoper (->> streams/events - (rx/filter uev/mouse-up?) - (rx/take 1)) - stream (->> streams/canvas-mouse-position - (rx/take-until stoper) - (rx/map apply-zoom) - (rx/mapcat apply-grid-alignment) - (rx/with-latest vector streams/mouse-position-ctrl) - (rx/map normalize-proportion-lock))] - (rx/subscribe stream (partial on-resize shape) nil on-end)))) - -;; --- Controls (Component) - -(def ^:private handler-size-threshold - "The size in pixels that shape width or height - should reach in order to increase the handler - control pointer radius from 4 to 6." - 60) - -(mx/defc control-item - [{:keys [class on-mouse-down r cy cx]}] - [:circle {:class-name class - :on-mouse-down on-mouse-down - :r r - :style {:fillOpacity "1" - :strokeWidth "1px" - :vectorEffect "non-scaling-stroke"} - :fill "#31e6e0" - :stroke "#28c4d4" - :cx cx - :cy cy}]) - -(mx/defc controls - [{:keys [x1 y1 width height] :as shape} zoom on-mouse-down] - (let [radius (if (> (max width height) handler-size-threshold) 6.0 4.0)] - [:g.controls - [:rect.main {:x x1 :y y1 - :width width - :height height - :stroke-dasharray (str (/ 5.0 zoom) "," (/ 5 zoom)) - :style {:stroke "#333" :fill "transparent" - :stroke-opacity "1"}}] - - (control-item {:class "top" - :on-mouse-down #(on-mouse-down :top %) - :r (/ radius zoom) - :cx (+ x1 (/ width 2)) - :cy (- y1 2)}) - (control-item {:on-mouse-down #(on-mouse-down :right %) - :r (/ radius zoom) - :cy (+ y1 (/ height 2)) - :cx (+ x1 width 1) - :class "right"}) - - (control-item {:on-mouse-down #(on-mouse-down :bottom %) - :r (/ radius zoom) - :cx (+ x1 (/ width 2)) - :cy (+ y1 height 2) - :class "bottom"}) - - (control-item {:on-mouse-down #(on-mouse-down :left %) - :r (/ radius zoom) - :cy (+ y1 (/ height 2)) - :cx (- x1 3) - :class "left"}) - - (control-item {:on-mouse-down #(on-mouse-down :top-left %) - :r (/ radius zoom) - :cx x1 - :cy y1 - :class "top-left"}) - - (control-item {:on-mouse-down #(on-mouse-down :top-right %) - :r (/ radius zoom) - :cx (+ x1 width) - :cy y1 - :class "top-right"}) - (control-item {:on-mouse-down #(on-mouse-down :bottom-left %) - :r (/ radius zoom) - :cx x1 - :cy (+ y1 height) - :class "bottom-left"}) - (control-item {:on-mouse-down #(on-mouse-down :bottom-right %) - :r (/ radius zoom) - :cx (+ x1 width) - :cy (+ y1 height) - :class "bottom-right"})])) - -;; --- Selection Handlers (Component) - -(defn get-path-edition-stoper - [stream] - (letfn [(stoper-event? [{:keys [type shift] :as event}] - (and (uev/mouse-event? event) (= type :up)))] - (rx/merge - (rx/filter stoper-event? stream) - (->> stream - (rx/filter #(= % ::uev/interrupt)) - (rx/take 1))))) - -(defn start-path-edition - [shape-id index] - (letfn [(on-move [delta] - (st/emit! (uds/update-path shape-id index delta)))] - (let [stoper (get-path-edition-stoper streams/events) - stream (rx/take-until stoper streams/mouse-position-deltas)] - (when @refs/selected-alignment - (st/emit! (uds/initial-path-point-align shape-id index))) - (rx/subscribe stream on-move)))) - -(mx/defc path-edition-selection-handlers - [{:keys [id segments modifiers] :as shape} zoom] - (letfn [(on-mouse-down [index event] - (dom/stop-propagation event) - (start-path-edition id index))] - - (let [{:keys [displacement]} modifiers - segments (if displacement - (map #(gpt/transform % displacement) segments) - segments)] - - [:g.controls - (for [[index {:keys [x y]}] (map-indexed vector segments)] - [:circle {:cx x :cy y - :r (/ 6.0 zoom) - :key index - :on-mouse-down (partial on-mouse-down index) - :fill "#31e6e0" - :stroke "#28c4d4" - :style {:cursor "pointer"}}])]))) - -(mx/defc multiple-selection-handlers - {:mixins [mx/static]} - [[shape & rest :as shapes] modifiers zoom] - (let [selection (->> shapes - (map #(assoc % :modifiers (get modifiers (:id %)))) - (map #(geom/selection-rect %)) - (geom/shapes->rect-shape) - (geom/selection-rect)) - shape (geom/shapes->rect-shape shapes) - on-click #(do (dom/stop-propagation %2) - (start-resize %1 (map :id shapes) shape))] - (controls selection zoom on-click))) - -(mx/defc single-selection-handlers - [{:keys [id] :as shape} zoom] - (let [on-click #(do (dom/stop-propagation %2) - (start-resize %1 #{id} shape)) - shape (geom/selection-rect shape)] - (controls shape zoom on-click))) - -(mx/defc text-edition-selection-handlers - {:mixins [mx/static]} - [{:keys [id] :as shape} zoom] - (let [{:keys [x1 y1 width height] :as shape} (geom/selection-rect shape)] - [:g.controls - [:rect.main {:x x1 :y y1 - :width width - :height height - ;; :stroke-dasharray (str (/ 5.0 zoom) "," (/ 5 zoom)) - :style {:stroke "#333" - :stroke-width "0.5" - :stroke-opacity "0.5" - :fill "transparent"}}]])) - -(mf/def selection-handlers - :mixins [mf/reactive mf/memo] - :render - (fn [own props] - (let [shapes (mf/react selected-shapes-ref) - modifiers (mf/react selected-modifers-ref) - ;; Edition is a workspace global flag - ;; because only one shape can be on - ;; the edition mode. - edition? (mf/react refs/selected-edition) - zoom (mf/react refs/selected-zoom) - num (count shapes) - {:keys [id type] :as shape} (first shapes)] - - (cond - (zero? num) - nil - - (> num 1) - (multiple-selection-handlers shapes modifiers zoom) - - (and (= type :text) edition?) - (-> (assoc shape :modifiers (get modifiers id)) - (text-edition-selection-handlers zoom)) - - (= type :path) - (if (= edition? (:id shape)) - (-> (assoc shape :modifiers (get modifiers id)) - (path-edition-selection-handlers zoom)) - (-> (assoc shape :modifiers (get modifiers id)) - (single-selection-handlers zoom))) - - :else - (-> (assoc shape :modifiers (get modifiers id)) - (single-selection-handlers zoom)))))) diff --git a/frontend/src/uxbox/main/ui/users.cljs b/frontend/src/uxbox/main/ui/users.cljs index 0cca1f47a..0968dbf03 100644 --- a/frontend/src/uxbox/main/ui/users.cljs +++ b/frontend/src/uxbox/main/ui/users.cljs @@ -49,7 +49,7 @@ (l/derive st/state))) (mf/defc user - {:wrap [mf/reactive*]} + {:wrap [mf/wrap-reactive]} [_] (let [open (mf/use-state false) profile (mf/react profile-ref) diff --git a/frontend/src/uxbox/main/ui/workspace.cljs b/frontend/src/uxbox/main/ui/workspace.cljs index f781c2cf4..7db262429 100644 --- a/frontend/src/uxbox/main/ui/workspace.cljs +++ b/frontend/src/uxbox/main/ui/workspace.cljs @@ -22,14 +22,14 @@ [uxbox.main.ui.confirm] [uxbox.main.ui.keyboard :as kbd] [uxbox.main.ui.messages :refer [messages-widget]] - [uxbox.main.ui.workspace.canvas :refer [viewport]] + [uxbox.main.ui.workspace.viewport :refer [viewport]] [uxbox.main.ui.workspace.colorpalette :refer [colorpalette]] [uxbox.main.ui.workspace.download] [uxbox.main.ui.workspace.header :refer [header]] [uxbox.main.ui.workspace.images] [uxbox.main.ui.workspace.rules :refer [horizontal-rule vertical-rule]] [uxbox.main.ui.workspace.scroll :as scroll] - [uxbox.main.ui.workspace.shortcuts :refer [shortcuts-mixin]] + [uxbox.main.ui.workspace.shortcuts :as shortcuts] [uxbox.main.ui.workspace.sidebar :refer [left-sidebar right-sidebar]] [uxbox.main.ui.workspace.sidebar.history :refer [history-dialog]] [uxbox.main.user-events :as uev] @@ -47,10 +47,10 @@ (st/emit! (uev/scroll-event (gpt/point left top))))) (defn- on-wheel - [own event] + [event canvas] (when (kbd/ctrl? event) (let [prev-zoom @refs/selected-zoom - dom (mf/ref-node (::canvas own)) + dom (mf/ref-node canvas) scroll-position (scroll/get-current-position-absolute dom) mouse-point @refs/viewport-mouse-position] (dom/prevent-default event) @@ -60,80 +60,90 @@ (st/emit! (dw/increase-zoom))) (scroll/scroll-to-point dom mouse-point scroll-position)))) -(mf/def workspace - :mixins #{mf/reactive - shortcuts-mixin} +(defn- subscibe + [canvas page] + (let [canvas-dom (mf/ref-node canvas)] + ;; TODO: scroll stuff need to be refactored + (scroll/scroll-to-page-center canvas-dom page) + (st/emit! (udp/watch-page-changes (:id page)) + (udu/watch-page-changes (:id page))) + (shortcuts/init))) + +(defn- unsubscribe + [shortcuts-subscription] + (st/emit! ::udp/stop-page-watcher) + (rx/cancel! shortcuts-subscription)) + +(mf/defc workspace + [{:keys [page wst] :as props}] + (let [flags (:flags wst) + canvas (mf/use-ref* nil) + left-sidebar? (not (empty? (keep flags [:layers :sitemap + :document-history]))) + right-sidebar? (not (empty? (keep flags [:icons :drawtools + :element-options]))) + classes (classnames + :no-tool-bar-right (not right-sidebar?) + :no-tool-bar-left (not left-sidebar?) + :scrolling (:viewport-positionig workspace))] + (mf/use-effect {:deps (:id page) + :init #(subscibe canvas page) + :end unsubscribe}) + [:* + (messages-widget) + [:& header {:page page + :flags flags + :key (:id page)}] + + (when (:colorpalette flags) + [:& colorpalette]) + + [:main.main-content + [:section.workspace-content + {:class classes + :on-scroll on-scroll + :on-wheel #(on-wheel % canvas)} + + (history-dialog) + + ;; Rules + (when (contains? flags :rules) + [:& horizontal-rule {:zoom (:zoom wst)}]) + + (when (contains? flags :rules) + [:& vertical-rule {:zoom (:zoom wst)}]) + + ;; Canvas + [:section.workspace-canvas {:id "workspace-canvas" + :ref canvas} + [:& viewport {:page page + :wst wst + :key (:id page)}]]] + + ;; Aside + (when left-sidebar? + [:& left-sidebar {:wst wst :page page}]) + (when right-sidebar? + [:& right-sidebar {:wst wst :page page}])]])) + + +;; TODO: consider using `derive-state` instead of `key` for +;; performance reasons + +(mf/def workspace-page + :mixins [mf/reactive] :init - (fn [own {:keys [project page] :as props}] - (st/emit! (dw/initialize project page)) + (fn [own {:keys [project-id page-id] :as props}] + (st/emit! (dw/initialize project-id page-id)) (assoc own - ::canvas (mf/create-ref) - ::page-ref (-> (l/in [:pages page]) - (l/derive st/state)))) - - :did-mount - (fn [own] - (let [{:keys [project page]} (::mf/props own) - dom (mf/ref-node (::canvas own)) - scroll-to-page-center #(scroll/scroll-to-page-center dom @refs/selected-page) - sub (rx/subscribe streams/page-id-ref-s scroll-to-page-center)] - (scroll-to-page-center) - (st/emit! (udp/watch-page-changes page) - (udu/watch-page-changes page)) - (assoc own ::sub sub))) - - :will-unmount - (fn [own] - (st/emit! ::udp/stop-page-watcher) - (rx/cancel! (::sub own)) - (dissoc own ::sub)) - + ::page-ref (-> (l/in [:pages page-id]) + (l/derive st/state)) + ::workspace-ref (-> (l/in [:workspace page-id]) + (l/derive st/state)))) :render (fn [own props] - (let [flags (mf/deref refs/flags) - page (mf/deref (::page-ref own)) - ;; project-id (get props :project) - ;; page-id (get props :page) - left-sidebar? (not (empty? (keep flags [:layers :sitemap - :document-history]))) - right-sidebar? (not (empty? (keep flags [:icons :drawtools - :element-options]))) - classes (classnames - :no-tool-bar-right (not right-sidebar?) - :no-tool-bar-left (not left-sidebar?) - :scrolling (:viewport-positionig workspace))] - [:* - (messages-widget) - [:& header {:page page - :flags flags - :key (:id page)}] - (colorpalette) - - [:main.main-content - [:section.workspace-content - {:class classes - :on-scroll on-scroll - :on-wheel (partial on-wheel own)} - - (history-dialog) - - ;; Rules - (when (contains? flags :rules) - [:& horizontal-rule]) - - (when (contains? flags :rules) - [:& vertical-rule]) - - ;; Canvas - [:section.workspace-canvas {:id "workspace-canvas" - :ref (::canvas own)} - [:& viewport {:page page - :flags flags - :key (:id page)}]]] - - ;; Aside - (when left-sidebar? - [:& left-sidebar {:flags flags :page-id (:id page)}]) - (when right-sidebar? - [:& right-sidebar {:flags flags :page-id (:id page)}])]]))) + (let [wst (mf/react (::workspace-ref own)) + page (mf/react (::page-ref own))] + (when page + [:& workspace {:page page :wst wst}])))) diff --git a/frontend/src/uxbox/main/ui/workspace/canvas.cljs b/frontend/src/uxbox/main/ui/workspace/canvas.cljs index 6ce532e66..37be30d41 100644 --- a/frontend/src/uxbox/main/ui/workspace/canvas.cljs +++ b/frontend/src/uxbox/main/ui/workspace/canvas.cljs @@ -7,30 +7,12 @@ (ns uxbox.main.ui.workspace.canvas (:require - [beicon.core :as rx] - [goog.events :as events] - [lentes.core :as l] - [potok.core :as ptk] - [rumext.core :as mx] [rumext.alpha :as mf] [uxbox.main.constants :as c] - [uxbox.main.data.projects :as dp] - [uxbox.main.data.shapes :as uds] - [uxbox.main.data.workspace :as udw] - [uxbox.main.geom :as geom] - [uxbox.main.refs :as refs] [uxbox.main.store :as st] - [uxbox.main.streams :as streams] - [uxbox.main.ui.keyboard :as kbd] [uxbox.main.ui.shapes :as uus] - [uxbox.main.ui.shapes.selection :refer [selection-handlers]] [uxbox.main.ui.workspace.drawarea :refer [draw-area]] - [uxbox.main.ui.workspace.grid :refer [grid]] - [uxbox.main.ui.workspace.ruler :refer [ruler]] - [uxbox.main.ui.workspace.scroll :as scroll] - [uxbox.main.user-events :as uev] - [uxbox.util.data :refer [parse-int]] - [uxbox.util.dom :as dom] + [uxbox.main.ui.workspace.selection :refer [selection-handlers]] [uxbox.util.geom.point :as gpt]) (:import goog.events.EventType)) @@ -46,235 +28,26 @@ :height "100%" :fill (or background "#ffffff")}])) -;; --- Coordinates Widget - -(mf/def coordinates - :mixins [mf/reactive mf/memo] - :render - (fn [own props] - (let [zoom (mf/react refs/selected-zoom) - coords (some-> (mf/react refs/canvas-mouse-position) - (gpt/divide zoom) - (gpt/round 0))] - [:ul.coordinates {} - [:span {:alt "x"} - (str "X: " (:x coords "-"))] - [:span {:alt "y"} - (str "Y: " (:y coords "-"))]]))) - -;; --- Selection Rect - -(def selrect-ref - (-> (l/key :selrect) - (l/derive refs/workspace))) - -(mf/def selrect - :mixins [mf/memo mf/reactive] - :render - (fn [own props] - (when-let [rect (mf/react selrect-ref)] - (let [{:keys [x1 y1 width height]} (geom/size rect)] - [:rect.selection-rect - {:x x1 - :y y1 - :width width - :height height}])))) - -;; --- Cursor tooltip - -(defn- get-shape-tooltip - "Return the shape tooltip text" - [shape] - (case (:type shape) - :icon "Click to place the Icon" - :image "Click to place the Image" - :rect "Drag to draw a Box" - :text "Drag to draw a Text Box" - :path "Click to draw a Path" - :circle "Drag to draw a Circle" - nil)) - -(mf/def cursor-tooltip - :mixins [mf/reactive mf/memo] - :render - (fn [own tooltip] - (let [coords (mf/react refs/window-mouse-position)] - [:span.cursor-tooltip - {:style - {:position "fixed" - :left (str (+ (:x coords) 5) "px") - :top (str (- (:y coords) 25) "px")}} - tooltip]))) - ;; --- Canvas -(mf/def canvas - :mixins [mf/memo mf/reactive] - :render - (fn [own {:keys [page zoom] :as props}] - (let [{:keys [metadata id]} page - width (:width metadata) - height (:height metadata)] - [:svg.page-canvas {:x c/canvas-start-x - :y c/canvas-start-y - :ref (str "canvas" id) - :width width - :height height} - (background metadata) - [:svg.page-layout - [:g.main - (for [item (reverse (:shapes page))] - (-> (uus/shape item) - (mf/with-key (str item)))) - (selection-handlers) - (draw-area zoom)]]]))) - -;; --- Viewport - -(mf/def viewport - :mixins [mf/reactive] - - :init - (fn [own props] - (assoc own ::viewport (mf/create-ref))) - - :did-mount - (fn [own] - (letfn [(translate-point-to-viewport [pt] - (let [viewport (mf/ref-node (::viewport own)) - brect (.getBoundingClientRect viewport) - brect (gpt/point (parse-int (.-left brect)) - (parse-int (.-top brect)))] - (gpt/subtract pt brect))) - - (translate-point-to-canvas [pt] - (let [viewport (mf/ref-node (::viewport own))] - (when-let [canvas (dom/get-element-by-class "page-canvas" viewport)] - (let [brect (.getBoundingClientRect canvas) - bbox (.getBBox canvas) - brect (gpt/point (parse-int (.-left brect)) - (parse-int (.-top brect))) - bbox (gpt/point (.-x bbox) (.-y bbox))] - (-> (gpt/add pt bbox) - (gpt/subtract brect)))))) - - (on-key-down [event] - (let [key (.-keyCode event) - ctrl? (kbd/ctrl? event) - shift? (kbd/shift? event) - opts {:key key - :shift? shift? - :ctrl? ctrl?}] - (st/emit! (uev/keyboard-event :down key ctrl? shift?)) - (when (kbd/space? event) - (st/emit! (udw/start-viewport-positioning))))) - - (on-key-up [event] - (let [key (.-keyCode event) - ctrl? (kbd/ctrl? event) - shift? (kbd/shift? event) - opts {:key key - :shift? shift? - :ctrl? ctrl?}] - (when (kbd/space? event) - (st/emit! (udw/stop-viewport-positioning))) - (st/emit! (uev/keyboard-event :up key ctrl? shift?)))) - - (on-mousemove [event] - (let [wpt (gpt/point (.-clientX event) - (.-clientY event)) - vpt (translate-point-to-viewport wpt) - cpt (translate-point-to-canvas wpt) - ctrl? (kbd/ctrl? event) - shift? (kbd/shift? event) - event {:ctrl ctrl? - :shift shift? - :window-coords wpt - :viewport-coords vpt - :canvas-coords cpt}] - (st/emit! (uev/pointer-event wpt vpt cpt ctrl? shift?))))] - - (let [key1 (events/listen js/document EventType.MOUSEMOVE on-mousemove) - key2 (events/listen js/document EventType.KEYDOWN on-key-down) - key3 (events/listen js/document EventType.KEYUP on-key-up)] - (assoc own - ::key1 key1 - ::key2 key2 - ::key3 key3)))) - - :will-unmount - (fn [own] - (events/unlistenByKey (::key1 own)) - (events/unlistenByKey (::key2 own)) - (events/unlistenByKey (::key3 own)) - (dissoc own ::key1 ::key2 ::key3)) - - - ;; TODO: use an ad-hoc ref for required keys from workspace state - :render - (fn [own {:keys [page flags] :as props}] - (let [drawing (mf/react refs/selected-drawing-tool) - tooltip (or (mf/react refs/selected-tooltip) - (get-shape-tooltip drawing)) - zoom (or (mf/react refs/selected-zoom) 1)] - (letfn [(on-mouse-down [event] - (dom/stop-propagation event) - (let [ctrl? (kbd/ctrl? event) - shift? (kbd/shift? event) - opts {:shift? shift? - :ctrl? ctrl?}] - (st/emit! (uev/mouse-event :down ctrl? shift?))) - (if drawing - (st/emit! (udw/start-drawing drawing)) - (st/emit! ::uev/interrupt (udw/start-selrect)))) - (on-context-menu [event] - (dom/prevent-default event) - (dom/stop-propagation event) - (let [ctrl? (kbd/ctrl? event) - shift? (kbd/shift? event) - opts {:shift? shift? - :ctrl? ctrl?}] - (st/emit! (uev/mouse-event :context-menu ctrl? shift?)))) - (on-mouse-up [event] - (dom/stop-propagation event) - (let [ctrl? (kbd/ctrl? event) - shift? (kbd/shift? event) - opts {:shift? shift? - :ctrl? ctrl?}] - (st/emit! (uev/mouse-event :up ctrl? shift?)))) - (on-click [event] - (dom/stop-propagation event) - (let [ctrl? (kbd/ctrl? event) - shift? (kbd/shift? event) - opts {:shift? shift? - :ctrl? ctrl?}] - (st/emit! (uev/mouse-event :click ctrl? shift?)))) - (on-double-click [event] - (dom/stop-propagation event) - (let [ctrl? (kbd/ctrl? event) - shift? (kbd/shift? event) - opts {:shift? shift? - :ctrl? ctrl?}] - (st/emit! (uev/mouse-event :double-click ctrl? shift?))))] - [:* - (coordinates) - [:div.tooltip-container - (when tooltip - (cursor-tooltip tooltip))] - [:svg.viewport {:width (* c/viewport-width zoom) - :height (* c/viewport-height zoom) - :ref (::viewport own) - :class (when drawing "drawing") - :on-context-menu on-context-menu - :on-click on-click - :on-double-click on-double-click - :on-mouse-down on-mouse-down - :on-mouse-up on-mouse-up} - [:g.zoom {:transform (str "scale(" zoom ", " zoom ")")} - (when page - (canvas {:page page :zoom zoom})) - (if (contains? flags :grid) - (grid))] - (when (contains? flags :ruler) - (ruler zoom)) - (selrect)]])))) +(mf/defc canvas + [{:keys [page wst] :as props}] + (let [{:keys [metadata id]} page + zoom (:zoom wst 1) ;; NOTE: maybe forward wst to draw-area + width (:width metadata) + height (:height metadata)] + [:svg.page-canvas {:x c/canvas-start-x + :y c/canvas-start-y + :width width + :height height} + [:& background metadata] + [:svg.page-layout + [:g.main + (for [item (reverse (:shapes page))] + (-> (uus/shape item) + (mf/with-key (str item)))) + [:& selection-handlers {:wst wst}] + (when-let [dshape (:drawing wst)] + [:& draw-area {:shape dshape + :zoom (:zoom wst) + :modifiers (:modifiers wst)}])]]])) diff --git a/frontend/src/uxbox/main/ui/workspace/colorpalette.cljs b/frontend/src/uxbox/main/ui/workspace/colorpalette.cljs index f568ea40a..d309adab2 100644 --- a/frontend/src/uxbox/main/ui/workspace/colorpalette.cljs +++ b/frontend/src/uxbox/main/ui/workspace/colorpalette.cljs @@ -6,121 +6,115 @@ ;; Copyright (c) 2015-2017 Juan de la Cruz (ns uxbox.main.ui.workspace.colorpalette - (:require [beicon.core :as rx] - [lentes.core :as l] - [potok.core :as ptk] - [uxbox.main.store :as st] - [uxbox.main.refs :as refs] - [uxbox.main.data.workspace :as dw] - [uxbox.main.data.shapes :as uds] - [uxbox.main.data.colors :as dc] - [uxbox.main.ui.dashboard.colors :refer (collections-ref)] - [uxbox.builtins.icons :as i] - [uxbox.main.ui.keyboard :as kbd] - [uxbox.util.lens :as ul] - [uxbox.util.data :refer (read-string)] - [uxbox.util.color :refer (hex->rgb)] - [uxbox.util.dom :as dom] - [rumext.core :as mx :include-macros true])) + (:require + [beicon.core :as rx] + [lentes.core :as l] + [rumext.alpha :as mf] + [uxbox.builtins.icons :as i] + [uxbox.main.data.colors :as udc] + [uxbox.main.data.workspace :as udw] + [uxbox.main.store :as st] + [uxbox.main.ui.keyboard :as kbd] + [uxbox.util.color :refer [hex->rgb]] + [uxbox.util.data :refer [read-string seek]] + [uxbox.util.dom :as dom])) -(defn- get-selected-collection - [local collections] - (if-let [selected (:selected @local)] - (first (filter #(= selected (:id %)) collections)) - (first (filter #(and (:id %) (> (count (:colors %)) 0)) collections)))) +;; --- Refs -(mx/defc palette-item - {:mixins [mx/static]} - [color] +(def collections-iref + (-> (l/key :colors-collections) + (l/derive st/state))) + +;; --- Components + +(mf/defc palette-item + [{:keys [color] :as props}] (letfn [(select-color [event] (let [attrs (if (kbd/shift? event) {:stroke-color color} {:fill-color color})] - (st/emit! (uds/update-selected-shapes-attrs attrs))))] + (st/emit! (udw/update-selected-shapes-attrs attrs))))] (let [rgb-vec (hex->rgb color) rgb-color (apply str "" (interpose ", " rgb-vec))] [:div.color-cell {:key (str color) :on-click select-color} [:span.color {:style {:background color}}] - [:span.color-text {} color] - [:span.color-text {} rgb-color]]))) - -(defn- palette-after-render - [{:keys [::mx/local] :as own}] - (let [dom (mx/ref-node own "container") - width (.-clientWidth dom)] - (when (not= (:width @local) width) - (swap! local assoc :width :width width)) - own)) + [:span.color-text color] + [:span.color-text rgb-color]]))) (defn- document-width [] (.. js/document -documentElement -clientWidth)) -(mx/defcs palette - {:mixins [mx/static mx/reactive (mx/local)] - :after-render palette-after-render} - [{:keys [::mx/local] :as own}] - (let [collections (->> (mx/react collections-ref) - (vals) - (filter :id) - (sort-by :name)) - {:keys [colors] :as selected-coll} (get-selected-collection local collections) +(mf/defc palette + [{:keys [colls] :as props}] + (let [local (mf/use-state {}) + colls (->> colls + (filter :id) + (sort-by :name)) + coll (or (:selected @local) + (first colls)) + width (:width @local (* (document-width) 0.84)) offset (:offset @local 0) visible (/ width 86) - invisible (- (count colors) visible)] - (letfn [(select-collection [event] - (let [value (read-string (dom/event->value event))] - (swap! local assoc :selected value :position 0))) - (close [event] - (st/emit! (dw/toggle-flag :colorpalette)))] + invisible (- (count (:colors coll)) visible) + close #(st/emit! (udw/toggle-flag :colorpalette)) + + container (mf/use-ref* nil) + container-child (mf/use-ref* nil)] + + (letfn [(select-coll [event] + (let [id (read-string (dom/event->value event)) + selected (seek #(= id (:id %)) colls)] + (swap! local assoc :selected selected :position 0))) + (on-left-arrow-click [event] + (when (> offset 0) + (let [element (mf/ref-node container-child)] + (swap! local update :offset dec)))) + (on-right-arrow-click [event] + (when (< offset invisible) + (let [element (mf/ref-node container-child)] + (swap! local update :offset inc)))) + (on-scroll [event] + (if (pos? (.. event -nativeEvent -deltaY)) + (on-right-arrow-click event) + (on-left-arrow-click event))) + (after-render [] + (let [dom (mf/ref-node container) + width (.-clientWidth dom)] + (when (not= (:width @local) width) + (swap! local assoc :width width))))] + + (mf/use-effect {:deps true :init after-render}) + [:div.color-palette [:div.color-palette-actions - [:select.input-select {:on-change select-collection - :value (pr-str (:id selected-coll))} - (for [collection collections] - [:option {:key (str (:id collection)) - :value (pr-str (:id collection))} - (:name collection)])] - [:div.color-palette-buttons - [:div.btn-palette.edit.current i/pencil] - [:div.btn-palette.create i/close]]] + [:select.input-select {:on-change select-coll + :default-value (pr-str (:id coll))} + (for [item colls] + [:option {:key (:id item) :value (pr-str (:id item))} + (:name item)])] - ;; FIXME Scroll on click does not work - [:span.left-arrow {} - (when (> offset 0) - {:on-click #(.scrollBy (dom/get-element "color-palette-inside") (- offset) 0)}) - i/arrow-slide] + #_[:div.color-palette-buttons + [:div.btn-palette.edit.current i/pencil] + [:div.btn-palette.create i/close]]] - [:div.color-palette-content {:ref "container"} - [:div.color-palette-inside {:id "color-palette-inside" - :ref "color-palette-inside" + [:span.left-arrow {:on-click on-left-arrow-click} i/arrow-slide] + + [:div.color-palette-content {:ref container :on-wheel on-scroll} + [:div.color-palette-inside {:ref container-child :style {:position "relative" + :width (str (* 86 (count (:colors coll))) "px") :right (str (* 86 offset) "px")}} - (for [color colors] - (-> (palette-item color) - (mx/with-key color)))]] + (for [color (:colors coll)] + [:& palette-item {:color color :key color}])]] - ;; FIXME Scroll on click does not work - [:span.right-arrow - {:on-click (fn [event] - (when (< offset invisible) - (.scrollBy (dom/get-element "color-palette-inside") offset 0)))} - i/arrow-slide] + [:span.right-arrow {:on-click on-right-arrow-click} i/arrow-slide] + [:span.close-palette {:on-click close} i/close]]))) - [:span.close-palette {:on-click close} - i/close]]))) - -(defn- colorpalette-init - [own] - (st/emit! (dc/fetch-collections)) - own) - -(mx/defc colorpalette - {:mixins [mx/static mx/reactive] - :init colorpalette-init} - [] - (let [flags (mx/react refs/flags)] - (when (contains? flags :colorpalette) - (palette)))) +(mf/defc colorpalette + [props] + (let [colls (mf/deref collections-iref)] + (mf/use-effect {:init #(st/emit! (udc/fetch-collections))}) + [:& palette {:colls (vals colls)}])) diff --git a/frontend/src/uxbox/main/ui/workspace/colorpicker.cljs b/frontend/src/uxbox/main/ui/workspace/colorpicker.cljs index e26adb318..9764221d4 100644 --- a/frontend/src/uxbox/main/ui/workspace/colorpicker.cljs +++ b/frontend/src/uxbox/main/ui/workspace/colorpicker.cljs @@ -2,70 +2,43 @@ ;; License, v. 2.0. If a copy of the MPL was not distributed with this ;; file, You can obtain one at http://mozilla.org/MPL/2.0/. ;; -;; Copyright (c) 2016-2017 Andrey Antukh ;; Copyright (c) 2016-2017 Juan de la Cruz +;; Copyright (c) 2016-2019 Andrey Antukh (ns uxbox.main.ui.workspace.colorpicker - (:require [lentes.core :as l] - [potok.core :as ptk] - [uxbox.main.store :as st] - [uxbox.main.refs :as refs] - [uxbox.main.geom :as geom] - [uxbox.main.data.workspace :as udw] - [uxbox.main.data.pages :as udp] - [uxbox.main.data.shapes :as uds] - [uxbox.builtins.icons :as i] - [uxbox.main.ui.lightbox :as lbx] - [uxbox.main.ui.colorpicker :as cp] - [uxbox.main.ui.workspace.recent-colors :refer [recent-colors]] - [uxbox.util.router :as rt] - [rumext.core :as mx :include-macros true] - [uxbox.util.dom :as dom] - [uxbox.util.data :refer [parse-int parse-float read-string]])) + (:require + [lentes.core :as l] + [rumext.alpha :as mf] + [uxbox.main.store :as st] + [uxbox.main.ui.colorpicker :as cp])) -(defn- focus-shape - [id] - (-> (l/in [:shapes id]) +;; --- Recent Colors Calc. Algorithm + +(defn- lookup-colors + [state] + (as-> {} $ + (reduce (fn [acc shape] + (-> acc + (update (:fill-color shape) (fnil inc 0)) + (update (:stroke-color shape) (fnil inc 0)))) + $ (vals (:shapes state))) + (reverse (sort-by second $)) + (map first $) + (remove nil? $))) + +(def most-used-colors + (-> (l/lens lookup-colors) (l/derive st/state))) -(mx/defcs shape-colorpicker - {:mixins [mx/reactive mx/static]} - [own {:keys [x y shape attr] :as opts}] - (let [{:keys [id] :as shape} (mx/react (focus-shape shape)) - left (- x 260) - top (- y 50)] - (letfn [(change-color [color] - (st/emit! (uds/update-attrs id {attr color})))] - [:div.colorpicker-tooltip - {:style {:left (str left "px") - :top (str top "px")}} +;; --- Color Picker Modal - (cp/colorpicker - :theme :small - :value (get shape attr "#000000") - :on-change change-color) - (recent-colors shape change-color)]))) +(mf/defc colorpicker-modal + [{:keys [x y default value page on-change] :as props}] + [:div.colorpicker-tooltip + {:style {:left (str (- x 260) "px") + :top (str (- y 50) "px")}} + [:& cp/colorpicker {:value (or value default) + :colors (into-array @most-used-colors) + :on-change on-change}]]) -(mx/defcs page-colorpicker - {:mixins [mx/reactive mx/static]} - [own {:keys [x y attr default] :as opts}] - (let [{:keys [id metadata] :as page} (mx/react refs/selected-page)] - (letfn [(change-color [color] - (let [metadata (assoc metadata attr color)] - (st/emit! (udp/update-metadata id metadata))))] - [:div.colorpicker-tooltip - {:style {:left (str (- x 260) "px") - :top (str (- y 50) "px")}} - (cp/colorpicker - :theme :small - :value (get metadata attr default) - :on-change change-color)]))) - -(defmethod lbx/render-lightbox :workspace/shape-colorpicker - [params] - (shape-colorpicker params)) - -(defmethod lbx/render-lightbox :workspace/page-colorpicker - [params] - (page-colorpicker params)) diff --git a/frontend/src/uxbox/main/ui/workspace/download.cljs b/frontend/src/uxbox/main/ui/workspace/download.cljs index 022744dc3..25bdaa623 100644 --- a/frontend/src/uxbox/main/ui/workspace/download.cljs +++ b/frontend/src/uxbox/main/ui/workspace/download.cljs @@ -92,7 +92,7 @@ (mx/defcs download-dialog {:mixins [mx/static mx/reactive]} [own] - (let [project (mx/react refs/selected-project) + #_(let [project (mx/react refs/selected-project) pages (mx/react pages-ref) current (mx/react current-page-ref)] (letfn [(on-close [event] diff --git a/frontend/src/uxbox/main/ui/workspace/drawarea.cljs b/frontend/src/uxbox/main/ui/workspace/drawarea.cljs index c3135b93f..5411f514d 100644 --- a/frontend/src/uxbox/main/ui/workspace/drawarea.cljs +++ b/frontend/src/uxbox/main/ui/workspace/drawarea.cljs @@ -2,47 +2,39 @@ ;; License, v. 2.0. If a copy of the MPL was not distributed with this ;; file, You can obtain one at http://mozilla.org/MPL/2.0/. ;; -;; Copyright (c) 2015-2017 Andrey Antukh +;; Copyright (c) 2015-2019 Andrey Antukh (ns uxbox.main.ui.workspace.drawarea "Draw interaction and component." - (:require [beicon.core :as rx] - [potok.core :as ptk] - [lentes.core :as l] - [rumext.core :as mx :include-macros true] - [uxbox.main.store :as st] - [uxbox.main.constants :as c] - [uxbox.main.refs :as refs] - [uxbox.main.streams :as streams] - [uxbox.main.workers :as uwrk] - [uxbox.main.data.workspace :as udw] - [uxbox.main.data.shapes :as uds] - [uxbox.main.ui.shapes :as shapes] - [uxbox.main.geom :as geom] - [uxbox.util.geom.point :as gpt] - [uxbox.util.geom.path :as path] - [uxbox.util.dom :as dom])) + (:require + [rumext.alpha :as mf] + [uxbox.main.data.workspace :as udw] + [uxbox.main.data.workspace-drawing :as udwd] + [uxbox.main.geom :as geom] + [uxbox.main.store :as st] + [uxbox.main.streams :as streams] + [uxbox.main.ui.shapes :as shapes] + [uxbox.util.dom :as dom] + [uxbox.util.geom.path :as path] + [uxbox.util.geom.point :as gpt])) ;; --- Components (declare generic-draw-area) (declare path-draw-area) -(mx/defc draw-area - {:mixins [mx/static mx/reactive]} - [zoom] - (when-let [{:keys [id] :as shape} (mx/react refs/selected-drawing-shape)] - (let [modifiers (mx/react (refs/selected-modifiers id))] - (if (= (:type shape) :path) - (path-draw-area shape) - (-> (assoc shape :modifiers modifiers) - (generic-draw-area zoom)))))) +(mf/defc draw-area + [{:keys [zoom shape modifiers] :as props}] + (if (= (:type shape) :path) + [:& path-draw-area {:shape shape}] + [:& generic-draw-area {:shape (assoc shape :modifiers modifiers) + :zoom zoom}])) -(mx/defc generic-draw-area - [shape zoom] +(mf/defc generic-draw-area + [{:keys [shape zoom]}] (let [{:keys [x1 y1 width height]} (geom/selection-rect shape)] - [:g {} - (shapes/render-component shape) + [:g + (shapes/render-shape shape) [:rect.main {:x x1 :y y1 :width width :height height @@ -51,23 +43,24 @@ :fill "transparent" :stroke-opacity "1"}}]])) -(mx/defc path-draw-area - [{:keys [segments] :as shape}] +(mf/defc path-draw-area + [{:keys [shape] :as props}] (letfn [(on-click [event] (dom/stop-propagation event) (st/emit! (udw/set-tooltip nil) - (udw/close-drawing-path))) + (udwd/close-drawing-path))) (on-mouse-enter [event] (st/emit! (udw/set-tooltip "Click to close the path"))) (on-mouse-leave [event] (st/emit! (udw/set-tooltip nil)))] - (when-let [{:keys [x y] :as segment} (first segments)] - [:g {} - (shapes/render-component shape) + (when-let [{:keys [x y] :as segment} (first (:segments shape))] + [:g + (shapes/render-shape shape) (when-not (:free shape) - [:circle.close-bezier {:cx x - :cy y - :r 5 - :on-click on-click - :on-mouse-enter on-mouse-enter - :on-mouse-leave on-mouse-leave}])]))) + [:circle.close-bezier + {:cx x + :cy y + :r 5 + :on-click on-click + :on-mouse-enter on-mouse-enter + :on-mouse-leave on-mouse-leave}])]))) diff --git a/frontend/src/uxbox/main/ui/workspace/grid.cljs b/frontend/src/uxbox/main/ui/workspace/grid.cljs index 00b048918..785988afa 100644 --- a/frontend/src/uxbox/main/ui/workspace/grid.cljs +++ b/frontend/src/uxbox/main/ui/workspace/grid.cljs @@ -2,45 +2,17 @@ ;; License, v. 2.0. If a copy of the MPL was not distributed with this ;; file, You can obtain one at http://mozilla.org/MPL/2.0/. ;; -;; Copyright (c) 2015-2017 Andrey Antukh ;; Copyright (c) 2015-2017 Juan de la Cruz +;; Copyright (c) 2015-2019 Andrey Antukh (ns uxbox.main.ui.workspace.grid (:require [cuerdas.core :as str] [rumext.alpha :as mf] - [uxbox.main.constants :as c] - [uxbox.main.refs :as refs])) + [uxbox.main.constants :as c])) ;; --- Grid (Component) -(declare vertical-line) -(declare horizontal-line) - -(mf/def grid - :mixins [mf/memo mf/reactive] - :render - (fn [own props] - (let [options (:metadata (mf/react refs/selected-page)) - color (:grid-color options "#cccccc") - width c/viewport-width - height c/viewport-height - x-ticks (range (- 0 c/canvas-start-x) - (- width c/canvas-start-x) - (:grid-x-axis options 10)) - - y-ticks (range (- 0 c/canvas-start-x) - (- height c/canvas-start-x) - (:grid-y-axis options 10)) - - path (as-> [] $ - (reduce (partial vertical-line height) $ x-ticks) - (reduce (partial horizontal-line width) $ y-ticks))] - [:g.grid {:style {:pointer-events "none"}} - [:path {:d (str/join " " path) :stroke color :opacity "0.3"}]]))) - -;; --- Helpers - (defn- horizontal-line [width acc value] (let [pos (+ value c/canvas-start-y)] @@ -50,3 +22,29 @@ [height acc value] (let [pos (+ value c/canvas-start-y)] (conj acc (str/format "M %s %s L %s %s" pos 0 pos height)))) + +(defn- make-grid-path + [metadata] + (let [width c/viewport-width + height c/viewport-height + + x-ticks (range (- 0 c/canvas-start-x) + (- width c/canvas-start-x) + (:grid-x-axis metadata 10)) + + y-ticks (range (- 0 c/canvas-start-x) + (- height c/canvas-start-x) + (:grid-y-axis metadata 10))] + (as-> [] $ + (reduce (partial vertical-line height) $ x-ticks) + (reduce (partial horizontal-line width) $ y-ticks) + (str/join " " $)))) + +(mf/defc grid + [{:keys [page] :as props}] + (let [metadata (:metadata page) + color (:grid-color metadata "#cccccc") + path (mf/use-memo {:deps #js [metadata] + :init #(make-grid-path metadata)})] + [:g.grid {:style {:pointer-events "none"}} + [:path {:d path :stroke color :opacity "0.3"}]])) diff --git a/frontend/src/uxbox/main/ui/workspace/header.cljs b/frontend/src/uxbox/main/ui/workspace/header.cljs index b0b129b61..d5c89b02d 100644 --- a/frontend/src/uxbox/main/ui/workspace/header.cljs +++ b/frontend/src/uxbox/main/ui/workspace/header.cljs @@ -28,7 +28,7 @@ ;; --- Zoom Widget (mf/defc zoom-widget - {:wrap [mf/reactive*]} + {:wrap [mf/wrap-reactive]} [props] (let [zoom (mf/react refs/selected-zoom) increase #(st/emit! (dw/increase-zoom)) diff --git a/frontend/src/uxbox/main/ui/workspace/images.cljs b/frontend/src/uxbox/main/ui/workspace/images.cljs index fbc7f1b8c..537b12598 100644 --- a/frontend/src/uxbox/main/ui/workspace/images.cljs +++ b/frontend/src/uxbox/main/ui/workspace/images.cljs @@ -15,6 +15,7 @@ [uxbox.main.data.lightbox :as udl] [uxbox.main.data.shapes :as uds] [uxbox.main.data.workspace :as udw] + [uxbox.main.data.workspace-drawing :as udwd] [uxbox.main.store :as st] [uxbox.main.ui.lightbox :as lbx] [uxbox.util.data :refer [read-string jscoll->vec]] @@ -56,7 +57,7 @@ :metadata {:width width :height height} :image id}] - (st/emit! (udw/select-for-drawing shape)) + (st/emit! (udwd/select-for-drawing shape)) (udl/close!))) (on-files-selected [event] (let [files (dom/get-event-files event) @@ -98,7 +99,7 @@ :metadata {:width width :height height} :image id}] - (st/emit! (udw/select-for-drawing shape)) + (st/emit! (udwd/select-for-drawing shape)) (udl/close!)))] [:div.library-item {:key (str id) :on-click on-click} diff --git a/frontend/src/uxbox/main/ui/workspace/recent_colors.cljs b/frontend/src/uxbox/main/ui/workspace/recent_colors.cljs deleted file mode 100644 index a4b038050..000000000 --- a/frontend/src/uxbox/main/ui/workspace/recent_colors.cljs +++ /dev/null @@ -1,56 +0,0 @@ -;; This Source Code Form is subject to the terms of the Mozilla Public -;; License, v. 2.0. If a copy of the MPL was not distributed with this -;; file, You can obtain one at http://mozilla.org/MPL/2.0/. -;; -;; Copyright (c) 2015-2017 Andrey Antukh -;; Copyright (c) 2015-2017 Juan de la Cruz - -(ns uxbox.main.ui.workspace.recent-colors - (:require [lentes.core :as l] - [potok.core :as ptk] - [uxbox.main.store :as st] - [uxbox.main.refs :as refs] - [uxbox.main.data.workspace :as dw] - [uxbox.builtins.icons :as i] - [rumext.core :as mx :include-macros true] - [uxbox.util.dom :as dom] - [uxbox.util.i18n :refer (tr)])) - -;; --- Helpers - -(defn- count-color - [state shape prop] - (let [color (prop shape)] - (if (contains? state color) - (update state color inc) - (assoc state color 1)))) - -(defn- calculate-colors - [shapes] - (as-> {} $ - (reduce #(count-color %1 %2 :fill-color) $ shapes) - (reduce #(count-color %1 %2 :stroke-color) $ shapes) - (remove nil? $) - (sort-by second (into [] $)) - (take 5 (map first $)))) - -;; --- Component - -(mx/defc recent-colors - {:mixins [mx/static mx/reactive]} - [{:keys [page id] :as shape} callback] - (let [shapes-by-id (mx/react refs/shapes-by-id) - shapes (->> (vals shapes-by-id) - (filter #(= (:page %) page))) - colors (calculate-colors shapes)] - [:div {} - [:span {} (tr "ds.recent-colors")] - [:div.row-flex {} - (for [color colors] - [:span.color-th {:style {:background-color color} - :key color - :on-click (partial callback color)}]) - (for [i (range (- 5 (count colors)))] - [:span.color-th {:key (str "empty" i)}]) - [:span.color-th.palette-th {} i/picker]]])) - diff --git a/frontend/src/uxbox/main/ui/workspace/ruler.cljs b/frontend/src/uxbox/main/ui/workspace/ruler.cljs index dbb622b89..40bfa96cc 100644 --- a/frontend/src/uxbox/main/ui/workspace/ruler.cljs +++ b/frontend/src/uxbox/main/ui/workspace/ruler.cljs @@ -2,39 +2,31 @@ ;; License, v. 2.0. If a copy of the MPL was not distributed with this ;; file, You can obtain one at http://mozilla.org/MPL/2.0/. ;; -;; Copyright (c) 2015-2017 Andrey Antukh ;; Copyright (c) 2015-2017 Juan de la Cruz +;; Copyright (c) 2015-2019 Andrey Antukh (ns uxbox.main.ui.workspace.ruler - (:require [lentes.core :as l] - [potok.core :as ptk] - [beicon.core :as rx] - [uxbox.main.constants :as c] - [uxbox.main.data.workspace :as udw] - [uxbox.main.refs :as refs] - [uxbox.main.streams :as streams] - [uxbox.main.store :as st] - [uxbox.main.user-events :as uev] - [uxbox.util.math :as mth] - [rumext.core :as mx :include-macros true] - [uxbox.util.geom.point :as gpt] - [uxbox.util.dom :as dom])) + (:require + [rumext.alpha :as mf] + [uxbox.main.constants :as c] + [uxbox.main.data.workspace :as udw] + [uxbox.main.store :as st] + [uxbox.main.user-events :as uev] + [uxbox.util.dom :as dom] + [uxbox.util.geom.point :as gpt] + [uxbox.util.math :as mth])) -(def ruler-points-ref - (-> (l/key :ruler) - (l/derive refs/workspace))) - -(mx/defc ruler-text - {:mixins [mx/static]} - [zoom [center pt]] - (let [distance (-> (gpt/distance (gpt/divide pt zoom) - (gpt/divide center zoom)) +(mf/defc ruler-text + [{:keys [zoom ruler] :as props}] + (let [{:keys [start end]} ruler + distance (-> (gpt/distance (gpt/divide end zoom) + (gpt/divide start zoom)) (mth/precision 2)) - angle (-> (gpt/angle pt center) + angle (-> (gpt/angle end start) (mth/precision 2)) - transform1 (str "translate(" (+ (:x pt) 35) "," (- (:y pt) 10) ")") - transform2 (str "translate(" (+ (:x pt) 25) "," (- (:y pt) 30) ")")] - [:g {} + transform1 (str "translate(" (+ (:x end) 35) "," (- (:y end) 10) ")") + transform2 (str "translate(" (+ (:x end) 25) "," (- (:y end) 30) ")")] + [:g [:rect {:fill "black" :fill-opacity "0.4" :rx "3" @@ -49,24 +41,19 @@ [:tspan {:x "0" :y "20"} (str angle "°")]]])) -(mx/defc ruler-line - {:mixins [mx/static]} - [zoom [center pt]] - [:line {:x1 (:x center) - :y1 (:y center) - :x2 (:x pt) - :y2 (:y pt) - :style {:cursor "cell"} - :stroke-width "1" - :stroke "red"}]) +(mf/defc ruler-line + [{:keys [zoom ruler] :as props}] + (let [{:keys [start end]} ruler] + [:line {:x1 (:x start) + :y1 (:y start) + :x2 (:x end) + :y2 (:y end) + :style {:cursor "cell"} + :stroke-width "1" + :stroke "red"}])) -(mx/defc ruler - {:mixins [mx/static mx/reactive] - :will-unmount (fn [own] - (st/emit! ::uev/interrupt - (udw/clear-ruler)) - own)} - [zoom] +(mf/defc ruler + [{:keys [ruler zoom] :as props}] (letfn [(on-mouse-down [event] (dom/stop-propagation event) (st/emit! ::uev/interrupt @@ -74,7 +61,11 @@ (udw/start-ruler))) (on-mouse-up [event] (dom/stop-propagation event) - (st/emit! ::uev/interrupt))] + (st/emit! ::uev/interrupt)) + (on-unmount [] + (st/emit! ::uev/interrupt + (udw/clear-ruler)))] + (mf/use-effect {:end on-unmount}) [:svg {:on-mouse-down on-mouse-down :on-mouse-up on-mouse-up} [:rect {:style {:fill "transparent" @@ -82,8 +73,8 @@ :cursor "cell"} :width c/viewport-width :height c/viewport-height}] - (when-let [points (mx/react ruler-points-ref)] - [:g {} - (ruler-line zoom points) - (ruler-text zoom points)])])) + (when ruler + [:g + [:& ruler-line {:ruler ruler}] + [:& ruler-text {:ruler ruler :zoom zoom}]])])) diff --git a/frontend/src/uxbox/main/ui/workspace/rules.cljs b/frontend/src/uxbox/main/ui/workspace/rules.cljs index 419cf2bc5..485ea7e83 100644 --- a/frontend/src/uxbox/main/ui/workspace/rules.cljs +++ b/frontend/src/uxbox/main/ui/workspace/rules.cljs @@ -100,65 +100,57 @@ ;; --- Horizontal Rule Ticks (Component) -(mf/def horizontal-rule-ticks - :mixins #{mf/memo} - :render - (fn [own zoom] - (let [zoom (or zoom 1) - path (reduce (partial make-vertical-tick zoom) [] +ticks+)] - [:g - [:path {:d (str/join " " path)}] - (for [tick +ticks+] - [:& horizontal-text-label {:zoom zoom :value tick :key tick}])]))) +(mf/defc horizontal-rule-ticks + {:wrap [mf/wrap-memo]} + [{:keys [zoom]}] + (let [zoom (or zoom 1) + path (reduce (partial make-vertical-tick zoom) [] +ticks+)] + [:g + [:path {:d (str/join " " path)}] + (for [tick +ticks+] + [:& horizontal-text-label {:zoom zoom :value tick :key tick}])])) ;; --- Vertical Rule Ticks (Component) -(mf/def vertical-rule-ticks - :mixins #{mf/memo} - :render - (fn [own zoom] - (let [zoom (or zoom 1) - path (reduce (partial make-horizontal-tick zoom) [] +ticks+)] - [:g - [:path {:d (str/join " " path)}] - (for [tick +ticks+] - [:& vertical-text-label {:zoom zoom :value tick :key tick}])]))) +(mf/defc vertical-rule-ticks + {:wrap [mf/wrap-memo]} + [{:keys [zoom]}] + (let [zoom (or zoom 1) + path (reduce (partial make-horizontal-tick zoom) [] +ticks+)] + [:g + [:path {:d (str/join " " path)}] + (for [tick +ticks+] + [:& vertical-text-label {:zoom zoom :value tick :key tick}])])) ;; --- Horizontal Rule (Component) -(mf/def horizontal-rule - :mixins #{mf/memo mf/reactive} - :render - (fn [own props] - (let [scroll (mf/react refs/workspace-scroll) - zoom (mf/react refs/selected-zoom) - scroll-x (:x scroll) - translate-x (- (- c/canvas-scroll-padding) (:x scroll))] - [:svg.horizontal-rule - {:width c/viewport-width - :height 20} - [:rect {:height 20 - :width c/viewport-width}] - [:g {:transform (str "translate(" translate-x ", 0)")} - (horizontal-rule-ticks zoom)]]))) +(mf/defc horizontal-rule + [{:keys [zoom] :as props}] + (let [scroll (mf/deref refs/workspace-scroll) + scroll-x (:x scroll) + translate-x (- (- c/canvas-scroll-padding) (:x scroll))] + [:svg.horizontal-rule + {:width c/viewport-width + :height 20} + [:rect {:height 20 + :width c/viewport-width}] + [:g {:transform (str "translate(" translate-x ", 0)")} + [:& horizontal-rule-ticks {:zoom zoom}]]])) ;; --- Vertical Rule (Component) -(mf/def vertical-rule - :mixins #{mf/memo mf/reactive} - :render - (fn [own props] - (let [scroll (mf/react refs/workspace-scroll) - zoom (mf/react refs/selected-zoom) - scroll-y (:y scroll) - translate-y (- (- c/canvas-scroll-padding) (:y scroll))] - [:svg.vertical-rule - {:width 20 - :height c/viewport-height} +(mf/defc vertical-rule + [{:keys [zoom] :as props}] + (let [scroll (mf/deref refs/workspace-scroll) + scroll-y (:y scroll) + translate-y (- (- c/canvas-scroll-padding) (:y scroll))] + [:svg.vertical-rule + {:width 20 + :height c/viewport-height} - [:g {:transform (str "translate(0, " translate-y ")")} - (vertical-rule-ticks zoom)] - [:rect {:x 0 - :y 0 - :height 20 - :width 20}]]))) + [:g {:transform (str "translate(0, " translate-y ")")} + [:& vertical-rule-ticks {:zoom zoom}]] + [:rect {:x 0 + :y 0 + :height 20 + :width 20}]])) diff --git a/frontend/src/uxbox/main/ui/workspace/scroll.cljs b/frontend/src/uxbox/main/ui/workspace/scroll.cljs index ff81b76ab..d16215beb 100644 --- a/frontend/src/uxbox/main/ui/workspace/scroll.cljs +++ b/frontend/src/uxbox/main/ui/workspace/scroll.cljs @@ -15,6 +15,7 @@ [uxbox.util.geom.point :as gpt])) ;; FIXME: revisit this ns in order to find a better location for its functions +;; TODO: this need a good refactor (probably move to events with access to the state) (defn set-scroll-position [dom position] @@ -25,8 +26,8 @@ [dom center] (let [viewport-width (.-offsetWidth dom) viewport-height (.-offsetHeight dom) - position-x (- (* (:x center) @refs/selected-zoom) (/ viewport-width 2)) - position-y (- (* (:y center) @refs/selected-zoom) (/ viewport-height 2)) + position-x (- (* (:x center) 1 #_@refs/selected-zoom) (/ viewport-width 2)) + position-y (- (* (:y center) 1 #_@refs/selected-zoom) (/ viewport-height 2)) position (gpt/point position-x position-y)] (set-scroll-position dom position))) diff --git a/frontend/src/uxbox/main/ui/workspace/selection.cljs b/frontend/src/uxbox/main/ui/workspace/selection.cljs new file mode 100644 index 000000000..2860b7c85 --- /dev/null +++ b/frontend/src/uxbox/main/ui/workspace/selection.cljs @@ -0,0 +1,299 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) 2015-2017 Andrey Antukh +;; Copyright (c) 2015-2017 Juan de la Cruz + +(ns uxbox.main.ui.workspace.selection + "Multiple selection handlers component." + (:require + [beicon.core :as rx] + [lentes.core :as l] + [potok.core :as ptk] + [rumext.alpha :as mf] + [rumext.core :as mx] + [uxbox.main.constants :as c] + [uxbox.main.data.shapes :as uds] + [uxbox.main.data.workspace :as udw] + [uxbox.main.geom :as geom] + [uxbox.main.refs :as refs] + [uxbox.main.store :as st] + [uxbox.main.streams :as streams] + [uxbox.main.user-events :as uev] + [uxbox.main.workers :as uwrk] + [uxbox.util.dom :as dom] + [uxbox.util.geom.matrix :as gmt] + [uxbox.util.geom.point :as gpt])) + +;; --- Refs & Constants + +(def ^:private +circle-props+ + {:r 6 + :style {:fillOpacity "1" + :strokeWidth "1px" + :vectorEffect "non-scaling-stroke"} + :fill "#31e6e0" + :stroke "#28c4d4"}) + +(defn- focus-selected-shapes + [state] + (let [selected (get-in state [:workspace :selected])] + (mapv #(get-in state [:shapes %]) selected))) + +(def ^:private selected-shapes-ref + "A customized version of `refs/selected-shapes` that + additionally resolves the shapes to the real object + instead of just return a set of ids." + (-> (l/lens focus-selected-shapes) + (l/derive st/state))) + +(def ^:private selected-modifers-ref + "A customized version of `refs/selected-modifiers` + that instead of focus to one concrete id, it focuses + on the whole map." + (-> (l/key :modifiers) + (l/derive refs/workspace))) + +;; --- Resize Implementation +;; TODO: this function need to be refactored + +;; (defrecord StartResizeSelected [vid ids shape] +;; ptk/WatchEvent +;; (watch [_ state stream] +;; (let [pid (get-in state [:workspace :current]) +;; wst (get-in state [:workspace pid]) + + +(defn- start-resize + [vid ids shape] + (prn "start-resize" vid ids shape) + (letfn [(on-resize [shape [point lock?]] + (let [result (geom/resize-shape vid shape point lock?) + scale (geom/calculate-scale-ratio shape result) + mtx (geom/generate-resize-matrix vid shape scale) + xfm (map #(udw/apply-temporal-resize % mtx))] + (apply st/emit! (sequence xfm ids)))) + + (on-end [] + (apply st/emit! (map udw/apply-resize ids))) + + ;; Unifies the instantaneous proportion lock modifier + ;; activated by Ctrl key and the shapes own proportion + ;; lock flag that can be activated on element options. + (normalize-proportion-lock [[point ctrl?]] + (let [proportion-lock? (:proportion-lock shape)] + [point (or proportion-lock? ctrl?)])) + + ;; Applies alginment to point if it is currently + ;; activated on the current workspace + (apply-grid-alignment [point] + (if @refs/selected-alignment + (uwrk/align-point point) + (rx/of point))) + + ;; Apply the current zoom factor to the point. + (apply-zoom [point] + (gpt/divide point @refs/selected-zoom))] + + (let [shape (->> (geom/shape->rect-shape shape) + (geom/size)) + stoper (->> streams/events + (rx/filter uev/mouse-up?) + (rx/take 1)) + stream (->> streams/canvas-mouse-position + (rx/take-until stoper) + (rx/map apply-zoom) + (rx/mapcat apply-grid-alignment) + (rx/with-latest vector streams/mouse-position-ctrl) + (rx/map normalize-proportion-lock))] + (rx/subscribe stream (partial on-resize shape) nil on-end)))) + +;; --- Controls (Component) + +(def ^:private handler-size-threshold + "The size in pixels that shape width or height + should reach in order to increase the handler + control pointer radius from 4 to 6." + 60) + +(mf/defc control-item + [{:keys [class on-click r cy cx] :as props}] + [:circle + {:class-name class + :on-mouse-down on-click + :r r + :style {:fillOpacity "1" + :strokeWidth "1px" + :vectorEffect "non-scaling-stroke"} + :fill "#31e6e0" + :stroke "#28c4d4" + :cx cx + :cy cy}]) + +(mf/defc controls + [{:keys [shape zoom on-click] :as props}] + (let [{:keys [x1 y1 width height]} shape + radius (if (> (max width height) handler-size-threshold) 6.0 4.0)] + [:g.controls + [:rect.main {:x x1 :y y1 + :width width + :height height + :stroke-dasharray (str (/ 5.0 zoom) "," (/ 5 zoom)) + :style {:stroke "#333" :fill "transparent" + :stroke-opacity "1"}}] + [:& control-item {:class "top" + :on-click #(on-click :top %) + :r (/ radius zoom) + :cx (+ x1 (/ width 2)) + :cy (- y1 2)}] + [:& control-item {:on-click #(on-click :right %) + :r (/ radius zoom) + :cy (+ y1 (/ height 2)) + :cx (+ x1 width 1) + :class "right"}] + [:& control-item {:on-click #(on-click :bottom %) + :r (/ radius zoom) + :cx (+ x1 (/ width 2)) + :cy (+ y1 height 2) + :class "bottom"}] + [:& control-item {:on-click #(on-click :left %) + :r (/ radius zoom) + :cy (+ y1 (/ height 2)) + :cx (- x1 3) + :class "left"}] + [:& control-item {:on-click #(on-click :top-left %) + :r (/ radius zoom) + :cx x1 + :cy y1 + :class "top-left"}] + [:& control-item {:on-click #(on-click :top-right %) + :r (/ radius zoom) + :cx (+ x1 width) + :cy y1 + :class "top-right"}] + [:& control-item {:on-click #(on-click :bottom-left %) + :r (/ radius zoom) + :cx x1 + :cy (+ y1 height) + :class "bottom-left"}] + [:& control-item {:on-click #(on-click :bottom-right %) + :r (/ radius zoom) + :cx (+ x1 width) + :cy (+ y1 height) + :class "bottom-right"}]])) + +;; --- Selection Handlers (Component) + +;; (defn get-path-edition-stoper +;; [stream] +;; (letfn [(stoper-event? [{:keys [type shift] :as event}] +;; (and (uev/mouse-event? event) (= type :up)))] +;; (rx/merge +;; (rx/filter stoper-event? stream) +;; (->> stream +;; (rx/filter #(= % ::uev/interrupt)) +;; (rx/take 1))))) + +;; (defn start-path-edition +;; [shape-id index] +;; (letfn [(on-move [delta] +;; (st/emit! (uds/update-path shape-id index delta)))] +;; (let [stoper (get-path-edition-stoper streams/events) +;; stream (rx/take-until stoper streams/mouse-position-deltas)] +;; (when @refs/selected-alignment +;; (st/emit! (uds/initial-path-point-align shape-id index))) +;; (rx/subscribe stream on-move)))) + +;; (mx/defc path-edition-selection-handlers +;; [{:keys [id segments modifiers] :as shape} zoom] +;; (letfn [(on-click [index event] +;; (dom/stop-propagation event) +;; (start-path-edition id index))] + +;; (let [{:keys [displacement]} modifiers +;; segments (if displacement +;; (map #(gpt/transform % displacement) segments) +;; segments)] + +;; [:g.controls +;; (for [[index {:keys [x y]}] (map-indexed vector segments)] +;; [:circle {:cx x :cy y +;; :r (/ 6.0 zoom) +;; :key index +;; :on-click (partial on-click index) +;; :fill "#31e6e0" +;; :stroke "#28c4d4" +;; :style {:cursor "pointer"}}])]))) + +(mf/defc multiple-selection-handlers + [{:keys [shapes modifiers zoom] :as props}] + (let [shape (->> shapes + (map #(assoc % :modifiers (get modifiers (:id %)))) + (map #(geom/selection-rect %)) + (geom/shapes->rect-shape) + (geom/selection-rect)) + on-click #(do (dom/stop-propagation %2) + (start-resize %1 (map :id shapes) shape))] + [:& controls {:shape shape + :zoom zoom + :on-click on-click}])) + +(mf/defc single-selection-handlers + [{:keys [shape zoom] :as props}] + (let [on-click #(do (dom/stop-propagation %2) + (start-resize %1 #{(:id shape)} shape)) + shape (geom/selection-rect shape)] + [:& controls {:shape shape :zoom zoom :on-click on-click}])) + +;; (mx/defc text-edition-selection-handlers +;; {:mixins [mx/static]} +;; [{:keys [id] :as shape} zoom] +;; (let [{:keys [x1 y1 width height] :as shape} (geom/selection-rect shape)] +;; [:g.controls +;; [:rect.main {:x x1 :y y1 +;; :width width +;; :height height +;; ;; :stroke-dasharray (str (/ 5.0 zoom) "," (/ 5 zoom)) +;; :style {:stroke "#333" +;; :stroke-width "0.5" +;; :stroke-opacity "0.5" +;; :fill "transparent"}}]])) + +(defn- focus-shapes + [selected] + (mapv #(get-in @st/state [:shapes %]) selected)) + +(mf/defc selection-handlers + [{:keys [wst] :as props}] + (let [shapes (focus-shapes (:selected wst)) + edition? (:edition wst) + modifiers (:modifiers wst) + zoom (:zoom wst 1) + num (count shapes) + {:keys [id type] :as shape} (first shapes)] + + (cond + (zero? num) + nil + + (> num 1) + [:& multiple-selection-handlers {:shapes shapes + :modifiers modifiers + :zoom zoom}] + + ;; (and (= type :text) edition?) + ;; (-> (assoc shape :modifiers (get modifiers id)) + ;; (text-edition-selection-handlers zoom)) + + ;; (= type :path) + ;; (if (= edition? (:id shape)) + ;; (-> (assoc shape :modifiers (get modifiers id)) + ;; (path-edition-selection-handlers zoom)) + ;; (-> (assoc shape :modifiers (get modifiers id)) + ;; (single-selection-handlers zoom))) + + :else + [:& single-selection-handlers + {:shape (assoc shape :modifiers (get modifiers id)) + :zoom zoom}]))) diff --git a/frontend/src/uxbox/main/ui/workspace/shortcuts.cljs b/frontend/src/uxbox/main/ui/workspace/shortcuts.cljs index 232667d36..4cab48ba6 100644 --- a/frontend/src/uxbox/main/ui/workspace/shortcuts.cljs +++ b/frontend/src/uxbox/main/ui/workspace/shortcuts.cljs @@ -11,7 +11,8 @@ [potok.core :as ptk] [uxbox.main.store :as st] [uxbox.main.data.lightbox :as udl] - [uxbox.main.data.workspace :as dw] + [uxbox.main.data.workspace :as udw] + [uxbox.main.data.workspace-drawing :as udwd] [uxbox.main.data.shapes :as uds] [uxbox.main.data.undo :as udu] [uxbox.main.data.history :as udh] @@ -26,39 +27,39 @@ ;; --- Shortcuts (defonce +shortcuts+ - {:shift+g #(st/emit! (dw/toggle-flag :grid)) + {:shift+g #(st/emit! (udw/toggle-flag :grid)) :ctrl+g #(st/emit! (uds/group-selected)) :ctrl+shift+g #(st/emit! (uds/ungroup-selected)) - :ctrl+shift+m #(st/emit! (dw/toggle-flag :sitemap)) - :ctrl+shift+f #(st/emit! (dw/toggle-flag :drawtools)) - :ctrl+shift+i #(st/emit! (dw/toggle-flag :icons)) - :ctrl+shift+l #(st/emit! (dw/toggle-flag :layers)) - :ctrl+0 #(st/emit! (dw/reset-zoom)) - :ctrl+r #(st/emit! (dw/toggle-flag :ruler)) + :ctrl+shift+m #(st/emit! (udw/toggle-flag :sitemap)) + :ctrl+shift+f #(st/emit! (udw/toggle-flag :drawtools)) + :ctrl+shift+i #(st/emit! (udw/toggle-flag :icons)) + :ctrl+shift+l #(st/emit! (udw/toggle-flag :layers)) + :ctrl+0 #(st/emit! (udw/reset-zoom)) + :ctrl+r #(st/emit! (udw/toggle-flag :ruler)) :ctrl+d #(st/emit! (uds/duplicate-selected)) - :ctrl+c #(st/emit! (dw/copy-to-clipboard)) - :ctrl+v #(st/emit! (dw/paste-from-clipboard)) + :ctrl+c #(st/emit! (udw/copy-to-clipboard)) + :ctrl+v #(st/emit! (udw/paste-from-clipboard)) :ctrl+shift+v #(udl/open! :clipboard) :ctrl+z #(st/emit! (udu/undo)) :ctrl+shift+z #(st/emit! (udu/redo)) :ctrl+y #(st/emit! (udu/redo)) - :ctrl+b #(st/emit! (dw/select-for-drawing wsd/+draw-tool-rect+)) - :ctrl+e #(st/emit! (dw/select-for-drawing wsd/+draw-tool-circle+)) - :ctrl+t #(st/emit! (dw/select-for-drawing wsd/+draw-tool-text+)) - :esc #(st/emit! (uds/deselect-all)) - :delete #(st/emit! (uds/delete-selected)) - :ctrl+up #(st/emit! (uds/move-selected-layer :up)) - :ctrl+down #(st/emit! (uds/move-selected-layer :down)) - :ctrl+shift+up #(st/emit! (uds/move-selected-layer :top)) - :ctrl+shift+down #(st/emit! (uds/move-selected-layer :bottom)) - :shift+up #(st/emit! (uds/move-selected :up :fast)) - :shift+down #(st/emit! (uds/move-selected :down :fast)) - :shift+right #(st/emit! (uds/move-selected :right :fast)) - :shift+left #(st/emit! (uds/move-selected :left :fast)) - :up #(st/emit! (uds/move-selected :up :std)) - :down #(st/emit! (uds/move-selected :down :std)) - :right #(st/emit! (uds/move-selected :right :std)) - :left #(st/emit! (uds/move-selected :left :std)) + :ctrl+b #(st/emit! (udwd/select-for-drawing wsd/+draw-tool-rect+)) + :ctrl+e #(st/emit! (udwd/select-for-drawing wsd/+draw-tool-circle+)) + :ctrl+t #(st/emit! (udwd/select-for-drawing wsd/+draw-tool-text+)) + :esc #(st/emit! (udw/deselect-all)) + :delete #(st/emit! (udw/delete-selected)) + :ctrl+up #(st/emit! (udw/move-selected-layer :up)) + :ctrl+down #(st/emit! (udw/move-selected-layer :down)) + :ctrl+shift+up #(st/emit! (udw/move-selected-layer :top)) + :ctrl+shift+down #(st/emit! (udw/move-selected-layer :bottom)) + :shift+up #(st/emit! (udw/move-selected :up :fast)) + :shift+down #(st/emit! (udw/move-selected :down :fast)) + :shift+right #(st/emit! (udw/move-selected :right :fast)) + :shift+left #(st/emit! (udw/move-selected :left :fast)) + :up #(st/emit! (udw/move-selected :up :std)) + :down #(st/emit! (udw/move-selected :down :std)) + :right #(st/emit! (udw/move-selected :right :std)) + :left #(st/emit! (udw/move-selected :left :std)) }) ;; --- Shortcuts Setup Functions @@ -80,33 +81,10 @@ (events/unlistenByKey key) (.clearKeyListener handler))))) -(defn- initialize +(defn init [] (let [stream (->> (rx/create watch-shortcuts) (rx/pr-log "[debug]: shortcut:"))] (rx/on-value stream (fn [event] (when-let [handler (get +shortcuts+ event)] (handler)))))) - -;; --- Helpers - -;; (defn- move-selected -;; [dir speed] -;; (case speed -;; :std (st/emit! (uds/move-selected dir 1)) -;; :fast (st/emit! (uds/move-selected dir 20)))) - -;; --- Mixin - -(defn- init - [own] - (assoc own ::sub (initialize))) - -(defn- will-unmount - [own] - (rx/cancel! (::sub own)) - (dissoc own ::sub)) - -(def shortcuts-mixin - {:init init - :will-unmount will-unmount}) diff --git a/frontend/src/uxbox/main/ui/workspace/sidebar.cljs b/frontend/src/uxbox/main/ui/workspace/sidebar.cljs index c1b22f2ca..0aec4f3de 100644 --- a/frontend/src/uxbox/main/ui/workspace/sidebar.cljs +++ b/frontend/src/uxbox/main/ui/workspace/sidebar.cljs @@ -18,26 +18,31 @@ ;; --- Left Sidebar (Component) (mf/defc left-sidebar - [{:keys [flags page-id] :as props}] - [:aside#settings-bar.settings-bar.settings-bar-left - [:div.settings-bar-inside - (when (contains? flags :sitemap) - (sitemap-toolbox page-id)) - (when (contains? flags :document-history) - (history-toolbox page-id)) - (when (contains? flags :layers) - (layers-toolbox))]]) + [{:keys [wst page] :as props}] + (let [{:keys [flags selected]} wst] + [:aside#settings-bar.settings-bar.settings-bar-left + [:div.settings-bar-inside + (when (contains? flags :sitemap) + [:& sitemap-toolbox {:page page}]) + #_(when (contains? flags :document-history) + (history-toolbox page-id)) + (when (contains? flags :layers) + [:& layers-toolbox {:page page + :selected selected}])]])) ;; --- Right Sidebar (Component) (mf/defc right-sidebar - [{:keys [flags page-id] :as props}] - [:aside#settings-bar.settings-bar - [:div.settings-bar-inside - (when (contains? flags :drawtools) - (draw-toolbox flags)) - (when (contains? flags :element-options) - (options-toolbox)) - (when (contains? flags :icons) - (icons-toolbox))]]) + [{:keys [wst page] :as props}] + (let [flags (:flags wst) + dtool (:drawing-tool wst)] + [:aside#settings-bar.settings-bar + [:div.settings-bar-inside + (when (contains? flags :drawtools) + [:& draw-toolbox {:flags flags :drawing-tool dtool}]) + (when (contains? flags :element-options) + [:& options-toolbox {:page page + :selected (:selected wst)}]) + (when (contains? flags :icons) + #_(icons-toolbox))]])) diff --git a/frontend/src/uxbox/main/ui/workspace/sidebar/drawtools.cljs b/frontend/src/uxbox/main/ui/workspace/sidebar/drawtools.cljs index d18097754..b80ac6898 100644 --- a/frontend/src/uxbox/main/ui/workspace/sidebar/drawtools.cljs +++ b/frontend/src/uxbox/main/ui/workspace/sidebar/drawtools.cljs @@ -2,34 +2,20 @@ ;; License, v. 2.0. If a copy of the MPL was not distributed with this ;; file, You can obtain one at http://mozilla.org/MPL/2.0/. ;; -;; Copyright (c) 2015-2016 Andrey Antukh ;; Copyright (c) 2015-2016 Juan de la Cruz +;; Copyright (c) 2015-2019 Andrey Antukh (ns uxbox.main.ui.workspace.sidebar.drawtools - (:require [lentes.core :as l] - [potok.core :as ptk] - [uxbox.main.store :as st] - [uxbox.main.refs :as refs] - [uxbox.main.data.shapes :as uds] - [uxbox.main.data.workspace :as udw] - [uxbox.main.user-events :as uev] - [uxbox.builtins.icons :as i] - [uxbox.util.uuid :as uuid] - [uxbox.util.i18n :refer (tr)] - [uxbox.util.router :as r] - [uxbox.util.data :refer (read-string)] - [rumext.core :as mx :include-macros true] - [uxbox.util.dom :as dom])) - -;; --- Refs - -(def ^:private drawing-shape-id-ref - "A focused vision of the drawing property - of the workspace status. This avoids - rerender the whole toolbox on each workspace - change." - (-> (l/key :drawing-tool) - (l/derive refs/workspace))) + (:require + [rumext.alpha :as mf] + [uxbox.builtins.icons :as i] + [uxbox.main.data.shapes :as uds] + [uxbox.main.data.workspace :as udw] + [uxbox.main.data.workspace-drawing :as udwd] + [uxbox.main.store :as st] + [uxbox.main.user-events :as uev] + [uxbox.util.i18n :refer (tr)] + [uxbox.util.uuid :as uuid])) ;; --- Constants @@ -91,33 +77,32 @@ ;; --- Draw Toolbox (Component) -(mx/defc draw-toolbox - {:mixins [mx/static mx/reactive]} - [flags] - (let [drawing-tool (mx/react refs/selected-drawing-tool) - close #(st/emit! (udw/toggle-flag :drawtools)) +(mf/defc draw-toolbox + {:wrap [mf/wrap-memo]} + [{:keys [flags drawing-tool] :as props}] + (let [close #(st/emit! (udw/toggle-flag :drawtools)) tools (->> (into [] +draw-tools+) (sort-by (comp :priority second))) select-drawtool #(st/emit! ::uev/interrupt (udw/deactivate-ruler) - (udw/select-for-drawing %)) - toggle-ruler #(st/emit! (udw/select-for-drawing nil) + (udwd/select-for-drawing %)) + toggle-ruler #(st/emit! (udwd/select-for-drawing nil) (uds/deselect-all) (udw/toggle-ruler))] - [:div#form-tools.tool-window.drawing-tools {} - [:div.tool-window-bar {} - [:div.tool-window-icon {} i/window] - [:span {} (tr "ds.draw-tools")] + [:div#form-tools.tool-window.drawing-tools + [:div.tool-window-bar + [:div.tool-window-icon i/window] + [:span (tr "ds.draw-tools")] [:div.tool-window-close {:on-click close} i/close]] - [:div.tool-window-content {} + [:div.tool-window-content (for [[i props] (map-indexed vector tools)] (let [selected? (= drawing-tool (:shape props))] [:div.tool-btn.tooltip.tooltip-hover {:alt (tr (:help props)) :class (when selected? "selected") - :key (str i) + :key i :on-click (partial select-drawtool (:shape props))} (:icon props)])) [:div.tool-btn.tooltip.tooltip-hover diff --git a/frontend/src/uxbox/main/ui/workspace/sidebar/icons.cljs b/frontend/src/uxbox/main/ui/workspace/sidebar/icons.cljs index 46aa11b20..2b8700a7c 100644 --- a/frontend/src/uxbox/main/ui/workspace/sidebar/icons.cljs +++ b/frontend/src/uxbox/main/ui/workspace/sidebar/icons.cljs @@ -12,6 +12,7 @@ [uxbox.main.store :as st] [uxbox.main.lenses :as ul] [uxbox.main.data.workspace :as udw] + [uxbox.main.data.workspace-drawing :as udwd] [uxbox.main.data.icons :as udi] [uxbox.main.ui.shapes.icon :as icon] [uxbox.main.ui.dashboard.icons :as icons] @@ -61,10 +62,10 @@ (letfn [(on-close [event] (st/emit! (udw/toggle-flag :icons))) (on-select [icon event] - (st/emit! (udw/select-for-drawing icon))) + (st/emit! (udwd/select-for-drawing icon))) (on-change [event] (let [value (read-string (dom/event->value event))] - (st/emit! (udw/select-for-drawing nil) + (st/emit! (udwd/select-for-drawing nil) (udw/select-icons-toolbox-collection value))))] [:div#form-figures.tool-window [:div.tool-window-bar diff --git a/frontend/src/uxbox/main/ui/workspace/sidebar/layers.cljs b/frontend/src/uxbox/main/ui/workspace/sidebar/layers.cljs index 71470f4b9..92318e9b0 100644 --- a/frontend/src/uxbox/main/ui/workspace/sidebar/layers.cljs +++ b/frontend/src/uxbox/main/ui/workspace/sidebar/layers.cljs @@ -6,32 +6,28 @@ ;; Copyright (c) 2015-2016 Juan de la Cruz (ns uxbox.main.ui.workspace.sidebar.layers - (:require [lentes.core :as l] - [cuerdas.core :as str] - [goog.events :as events] - [potok.core :as ptk] - [uxbox.main.store :as st] - [uxbox.main.refs :as refs] - [uxbox.main.data.workspace :as udw] - [uxbox.main.data.shapes :as uds] - [uxbox.main.ui.shapes.icon :as icon] - [uxbox.builtins.icons :as i] - [uxbox.main.ui.keyboard :as kbd] - [uxbox.util.data :refer (read-string classnames)] - [uxbox.util.router :as r] - [rumext.core :as mx] - [rumext.alpha :as mf] - [uxbox.util.dom.dnd :as dnd] - [uxbox.util.dom :as dom]) + (:require + [cuerdas.core :as str] + [goog.events :as events] + [lentes.core :as l] + [potok.core :as ptk] + [rumext.alpha :as mf] + [rumext.core :as mx] + [uxbox.builtins.icons :as i] + [uxbox.main.data.shapes :as uds] + [uxbox.main.data.workspace :as udw] + [uxbox.main.refs :as refs] + [uxbox.main.store :as st] + [uxbox.main.ui.keyboard :as kbd] + [uxbox.main.ui.shapes.icon :as icon] + [uxbox.util.data :refer (read-string classnames)] + [uxbox.util.dom :as dom] + [uxbox.util.dom.dnd :as dnd] + [uxbox.util.router :as r]) (:import goog.events.EventType)) ;; --- Helpers -(defn- focus-page - [id] - (-> (l/in [:pages id]) - (l/derive st/state))) - (defn- select-shape [selected item event] (dom/prevent-default event) @@ -42,18 +38,18 @@ nil (.-ctrlKey event) - (st/emit! (uds/select-shape id)) + (st/emit! (udw/select-shape id)) (> (count selected) 1) - (st/emit! (uds/deselect-all) - (uds/select-shape id)) + (st/emit! (udw/deselect-all) + (udw/select-shape id)) (contains? selected id) - (st/emit! (uds/select-shape id)) + (st/emit! (udw/select-shape id)) :else - (st/emit! (uds/deselect-all) - (uds/select-shape id))))) + (st/emit! (udw/deselect-all) + (udw/select-shape id))))) (defn- toggle-visibility [selected item event] @@ -64,7 +60,7 @@ (st/emit! (uds/show-shape id)) (st/emit! (uds/hide-shape id))) (when (contains? selected id) - (st/emit! (uds/select-shape id))))) + (st/emit! (udw/select-shape id))))) (defn- toggle-blocking [item event] @@ -90,46 +86,45 @@ ;; --- Shape Name (Component) -(mf/def shape-name - :mixins [mf/memo (mf/local)] - :render - (fn [{:keys [::mf/local] :as own} {:keys [id] :as shape}] - (letfn [(on-blur [event] - (let [target (dom/event->target event) - parent (.-parentNode target) - name (dom/get-value target)] - (set! (.-draggable parent) true) - (st/emit! (uds/rename-shape id name)) - (swap! local assoc :edition false))) - (on-key-down [event] - (js/console.log event) - (when (kbd/enter? event) - (on-blur event))) - (on-click [event] - (dom/prevent-default event) - (let [parent (.-parentNode (.-target event))] - (set! (.-draggable parent) false)) - (swap! local assoc :edition true))] - (if (:edition @local) - [:input.element-name - {:type "text" - :on-blur on-blur - :on-key-down on-key-down - :auto-focus true - :default-value (:name shape "")}] - [:span.element-name - {:on-double-click on-click} - (:name shape "")])))) +(mf/defc layer-name + [{:keys [shape] :as props}] + (let [local (mf/use-state {}) + on-blur (fn [event] + (let [target (dom/event->target event) + parent (.-parentNode target) + name (dom/get-value target)] + (set! (.-draggable parent) true) + (st/emit! (uds/rename-shape (:id shape) name)) + (swap! local assoc :edition false))) + on-key-down (fn [event] + (js/console.log event) + (when (kbd/enter? event) + (on-blur event))) + on-click (fn [event] + (dom/prevent-default event) + (let [parent (.-parentNode (.-target event))] + (set! (.-draggable parent) false)) + (swap! local assoc :edition true))] + (if (:edition @local) + [:input.element-name + {:type "text" + :on-blur on-blur + :on-key-down on-key-down + :auto-focus true + :default-value (:name shape "")}] + [:span.element-name + {:on-double-click on-click} + (:name shape "")]))) ;; --- Layer Simple (Component) -(mx/defcs layer-simple - {:mixins [mx/static (mx/local)]} - [{:keys [::mx/local]} item selected] - (let [selected? (contains? selected (:id item)) - select #(select-shape selected item %) - toggle-visibility #(toggle-visibility selected item %) - toggle-blocking #(toggle-blocking item %) +(mf/defc layer-item + [{:keys [shape selected] :as props}] + (let [local (mf/use-state {}) + selected? (contains? selected (:id shape)) + select #(select-shape selected shape %) + toggle-visibility #(toggle-visibility selected shape %) + toggle-blocking #(toggle-blocking shape %) li-classes (classnames :selected selected? :hide (:dragging @local)) @@ -142,7 +137,7 @@ (letfn [(on-drag-start [event] (let [target (dom/event->target event)] (dnd/set-allowed-effect! event "move") - (dnd/set-data! event (:id item)) + (dnd/set-data! event (:id shape)) (dnd/set-image! event target 50 10) (swap! local assoc :dragging true))) (on-drag-end [event] @@ -152,8 +147,8 @@ (let [id (dnd/get-data event) over (:over @local)] (case (:over @local) - :top (st/emit! (uds/drop-shape id (:id item) :before)) - :bottom (st/emit! (uds/drop-shape id (:id item) :after))) + :top (st/emit! (uds/drop-shape id (:id shape) :before)) + :bottom (st/emit! (uds/drop-shape id (:id shape) :after))) (swap! local assoc :dragging false :over nil))) (on-drag-over [event] (dom/prevent-default event) @@ -180,21 +175,21 @@ :on-drop on-drop :draggable true} - [:div.element-actions {} + [:div.element-actions [:div.toggle-element - {:class (when-not (:hidden item) "selected") + {:class (when-not (:hidden shape) "selected") :on-click toggle-visibility} i/eye] [:div.block-element - {:class (when (:blocked item) "selected") + {:class (when (:blocked shape) "selected") :on-click toggle-blocking} i/lock]] - [:div.element-icon (element-icon item)] - (shape-name item)]]))) + [:div.element-icon (element-icon shape)] + [:& layer-name {:shape shape}]]]))) ;; --- Layer Group (Component) -(mx/defcs layer-group +#_(mx/defcs layer-group {:mixins [mx/static mx/reactive (mx/local)]} [{:keys [::mx/local]} {:keys [id] :as item} selected] (let [selected? (contains? selected (:id item)) @@ -284,40 +279,44 @@ ;; --- Layers Tools (Buttons Component) -(defn- allow-grouping? - "Check if the current situation allows grouping - of the currently selected shapes." - [selected shapes-map] - (let [xform (comp (map shapes-map) - (map :group)) - groups (into #{} xform selected)] - (= 1 (count groups)))) +;; (defn- allow-grouping? +;; "Check if the current situation allows grouping +;; of the currently selected shapes." +;; [selected shapes-map] +;; (let [xform (comp (map shapes-map) +;; (map :group)) +;; groups (into #{} xform selected)] +;; (= 1 (count groups)))) -(defn- allow-ungrouping? - "Check if the current situation allows ungrouping - of the currently selected shapes." - [selected shapes-map] - (let [shapes (into #{} (map shapes-map) selected) - groups (into #{} (map :group) shapes)] - (or (and (= 1 (count shapes)) - (= :group (:type (first shapes)))) - (and (= 1 (count groups)) - (not (nil? (first groups))))))) +;; (defn- allow-ungrouping? +;; "Check if the current situation allows ungrouping +;; of the currently selected shapes." +;; [selected shapes-map] +;; (let [shapes (into #{} (map shapes-map) selected) +;; groups (into #{} (map :group) shapes)] +;; (or (and (= 1 (count shapes)) +;; (= :group (:type (first shapes)))) +;; (and (= 1 (count groups)) +;; (not (nil? (first groups))))))) -(mx/defc layers-tools +(mf/defc layers-tools "Layers widget options buttons." - [selected shapes-map] - (let [duplicate #(st/emit! (uds/duplicate-selected)) + [{:keys [selected shapes] :as props}] + #_(let [duplicate #(st/emit! (uds/duplicate-selected)) group #(st/emit! (uds/group-selected)) ungroup #(st/emit! (uds/ungroup-selected)) - delete #(st/emit! (uds/delete-selected)) + delete #(st/emit! (udw/delete-selected)) - allow-grouping? (allow-grouping? selected shapes-map) - allow-ungrouping? (allow-ungrouping? selected shapes-map) + ;; allow-grouping? (allow-grouping? selected shapes) + ;; allow-ungrouping? (allow-ungrouping? selected shapes) + ;; NOTE: the grouping functionallity will be removed/replaced + ;; with elements. + allow-ungrouping? false + allow-grouping? false allow-duplicate? (= 1 (count selected)) allow-deletion? (pos? (count selected))] - [:div.layers-tools {} - [:ul.layers-tools-content {} + [:div.layers-tools + [:ul.layers-tools-content [:li.clone-layer.tooltip.tooltip-top {:alt "Duplicate" :class (when-not allow-duplicate? "disable") @@ -341,25 +340,30 @@ ;; --- Layers Toolbox (Component) -(mx/defc layers-toolbox - {:mixins [mx/static mx/reactive]} - [] - (let [selected (mx/react refs/selected-shapes) - page (mx/react refs/selected-page) - shapes-map (mx/react refs/shapes-by-id) - close #(st/emit! (udw/toggle-flag :layers)) - dragel (volatile! nil)] - [:div#layers.tool-window {} - [:div.tool-window-bar {} - [:div.tool-window-icon {} i/layers] - [:span {} "Layers"] - [:div.tool-window-close {:on-click close} i/close]] - [:div.tool-window-content {} - [:ul.element-list {} - (for [{:keys [id] :as shape} (map #(get shapes-map %) (:shapes page))] - (if (= (:type shape) :group) - (-> (layer-group shape selected) - (mx/with-key id)) - (-> (layer-simple shape selected) - (mx/with-key id))))]] - (layers-tools selected shapes-map)])) +(mf/def layers-toolbox + :mixins [mx/static mx/reactive] + + :init + (fn [own {:keys [id]}] + (assoc own ::shapes-ref (-> (l/key :shapes) + (l/derive st/state)))) + + :render + (fn [own {:keys [page selected] :as props}] + (let [shapes (mx/react (::shapes-ref own)) + close #(st/emit! (udw/toggle-flag :layers)) + dragel (volatile! nil)] + [:div#layers.tool-window + [:div.tool-window-bar + [:div.tool-window-icon i/layers] + [:span "Layers"] + [:div.tool-window-close {:on-click close} i/close]] + [:div.tool-window-content + [:ul.element-list + (for [id (:shapes page)] + (let [shape (get shapes id)] + [:& layer-item {:shape shape + :key id + :selected selected}]))]] + [:& layers-tools {:selected selected + :shapes shapes}]]))) diff --git a/frontend/src/uxbox/main/ui/workspace/sidebar/options.cljs b/frontend/src/uxbox/main/ui/workspace/sidebar/options.cljs index 4ecb7b61a..e85f6431a 100644 --- a/frontend/src/uxbox/main/ui/workspace/sidebar/options.cljs +++ b/frontend/src/uxbox/main/ui/workspace/sidebar/options.cljs @@ -8,8 +8,8 @@ (ns uxbox.main.ui.workspace.sidebar.options (:require [lentes.core :as l] - [potok.core :as ptk] - [rumext.core :as mx :include-macros true] + [rumext.alpha :as mf] + [rumext.core :as mx] [uxbox.builtins.icons :as i] [uxbox.main.data.shapes :as uds] [uxbox.main.data.workspace :as udw] @@ -27,20 +27,18 @@ [uxbox.main.ui.workspace.sidebar.options.text :as options-text] [uxbox.util.data :as data] [uxbox.util.dom :as dom] - [uxbox.util.i18n :refer [tr]] - [uxbox.util.router :as r])) + [uxbox.util.i18n :refer [tr]])) ;; --- Constants (def ^:private +menus-map+ - {:icon [::icon-measures ::fill ::stroke ::interactions] - :rect [::rect-measures ::fill ::stroke ::interactions] - :path [::fill ::stroke ::interactions] - :circle [::circle-measures ::fill ::stroke ::interactions] - :text [::fill ::text ::interactions] - :image [::image-measures ::interactions] - :group [::fill ::stroke ::interactions] - ::page [::page-measures ::page-grid-options]}) + {:icon [::icon-measures ::fill ::stroke] + :rect [::rect-measures ::fill ::stroke] + :path [::fill ::stroke ::interactions] + :circle [::circle-measures ::fill ::stroke] + :text [::fill ::text] + :image [::image-measures] + ::page [::page-measures ::page-grid-options]}) (def ^:private +menus+ [{:name "Size, position & rotation" @@ -89,45 +87,37 @@ ;; --- Options -(mx/defcs options - {:mixins [mx/static (mx/local)] - :key-fn #(pr-str (:id %1))} - [{:keys [::mx/local] :as own} shape] - (let [menus (get +menus-map+ (:type shape ::page)) - contained-in? (into #{} menus) - active (:menu @local (first menus))] - [:div {} - (when (> (count menus) 1) - [:ul.element-icons {} - (for [menu-id (get +menus-map+ (:type shape ::page))] - (let [menu (get +menus-by-id+ menu-id) - selected? (= active menu-id)] - [:li#e-info {:on-click #(swap! local assoc :menu menu-id) - :key (str "menu-" (:id menu)) - :class (when selected? "selected")} - (:icon menu)]))]) - (when-let [menu (get +menus-by-id+ active)] - ((:comp menu) menu shape))])) +(mf/defc shape-options + [{:keys [sid] :as props}] + (let [shape-iref (mf/use-memo {:deps sid + :init #(-> (l/in [:shapes sid]) + (l/derive st/state))}) + shape (mf/deref shape-iref) + menus (get +menus-map+ (:type shape))] + [:div + (for [mid menus] + (let [{:keys [comp] :as menu} (get +menus-by-id+ mid)] + [:& comp {:menu menu :shape shape :key mid}]))])) -(def selected-shape-ref - (letfn [(getter [state] - (let [selected (get-in state [:workspace :selected])] - (when (= 1 (count selected)) - (get-in state [:shapes (first selected)]))))] - (-> (l/lens getter) - (l/derive st/state)))) +(mf/defc page-options + [{:keys [page] :as props}] + (let [menus (get +menus-map+ ::page)] + [:div + (for [mid menus] + (let [{:keys [comp] :as menu} (get +menus-by-id+ mid)] + [:& comp {:menu menu :page page :key mid}]))])) -(mx/defc options-toolbox - {:mixins [mx/static mx/reactive]} - [] - (let [shape (->> (mx/react selected-shape-ref) - (merge shape-default-attrs)) - close #(st/emit! (udw/toggle-flag :element-options))] - [:div.elementa-options.tool-window {} - [:div.tool-window-bar {} - [:div.tool-window-icon {} i/options] - [:span {} (tr "ds.element-options")] +(mf/defc options-toolbox + {:wrap [mf/wrap-memo]} + [{:keys [page selected] :as props}] + (let [close #(st/emit! (udw/toggle-flag :element-options))] + [:div.elementa-options.tool-window + [:div.tool-window-bar + [:div.tool-window-icon i/options] + [:span (tr "ds.element-options")] [:div.tool-window-close {:on-click close} i/close]] - [:div.tool-window-content {} - [:div.element-options {} - (options shape)]]])) + [:div.tool-window-content + [:div.element-options + (if (= (count selected) 1) + [:& shape-options {:sid (first selected)}] + [:& page-options {:page page}])]]])) diff --git a/frontend/src/uxbox/main/ui/workspace/sidebar/options/circle_measures.cljs b/frontend/src/uxbox/main/ui/workspace/sidebar/options/circle_measures.cljs index b6737ed9e..2467cf193 100644 --- a/frontend/src/uxbox/main/ui/workspace/sidebar/options/circle_measures.cljs +++ b/frontend/src/uxbox/main/ui/workspace/sidebar/options/circle_measures.cljs @@ -2,107 +2,117 @@ ;; License, v. 2.0. If a copy of the MPL was not distributed with this ;; file, You can obtain one at http://mozilla.org/MPL/2.0/. ;; -;; Copyright (c) 2015-2016 Andrey Antukh ;; Copyright (c) 2015-2016 Juan de la Cruz +;; Copyright (c) 2015-2019 Andrey Antukh (ns uxbox.main.ui.workspace.sidebar.options.circle-measures - (:require [lentes.core :as l] - [potok.core :as ptk] - [rumext.core :as mx :include-macros true] - [uxbox.builtins.icons :as i] - [uxbox.main.data.shapes :as uds] - [uxbox.main.data.workspace :as udw] - [uxbox.main.geom :as geom] - [uxbox.main.store :as st] - [uxbox.util.data :refer (parse-int parse-float read-string)] - [uxbox.util.dom :as dom] - [uxbox.util.geom.point :as gpt] - [uxbox.util.i18n :refer (tr)] - [uxbox.util.math :refer (precision-or-0)] - [uxbox.util.router :as r])) + (:require + [rumext.alpha :as mf] + [uxbox.builtins.icons :as i] + [uxbox.main.data.shapes :as uds] + [uxbox.main.data.workspace :as udw] + [uxbox.main.geom :as geom] + [uxbox.main.store :as st] + [uxbox.util.data :refer (parse-int parse-float read-string)] + [uxbox.util.dom :as dom] + [uxbox.util.geom.point :as gpt] + [uxbox.util.i18n :refer (tr)] + [uxbox.util.math :refer (precision-or-0)])) -(mx/defc circle-measures-menu - {:mixins [mx/static]} - [menu {:keys [id] :as shape}] - (letfn [(on-size-change [attr event] - (let [value (dom/event->value event) - value (parse-int value 0) - sid (:id shape) - props {attr value}] - (st/emit! (uds/update-dimensions sid props)))) - (on-rotation-change [event] - (let [value (dom/event->value event) - value (parse-int value 0) - sid (:id shape)] - (st/emit! (uds/update-rotation sid value)))) - (on-pos-change [attr event] - (let [value (dom/event->value event) - value (parse-int value nil) - sid (:id shape) - point (gpt/point {attr value})] - (st/emit! (uds/update-position sid point)))) - (on-proportion-lock-change [event] - (if (:proportion-lock shape) - (st/emit! (uds/unlock-proportions id)) - (st/emit! (uds/lock-proportions id))))] - [:div.element-set {:key (str (:id menu))} - [:div.element-set-title (:name menu)] - [:div.element-set-content - ;; SLIDEBAR FOR ROTATION AND OPACITY - [:span "Size"] - [:div.row-flex - [:div.input-element.pixels - [:input.input-text - {:placeholder "Width" - :type "number" - :min "0" - :value (precision-or-0 (:rx shape 0) 2) - :on-change (partial on-size-change :rx)}]] - [:div.lock-size - {:class (when (:proportion-lock shape) "selected") - :on-click on-proportion-lock-change} - (if (:proportion-lock shape) i/lock i/unlock)] - [:div.input-element.pixels - [:input.input-text - {:placeholder "Height" - :type "number" - :min "0" - :value (precision-or-0 (:ry shape 0) 2) - :on-change (partial on-size-change :ry)}]]] +(declare on-size-change) +(declare on-rotation-change) +(declare on-position-change) +(declare on-proportion-lock-change) - [:span "Position"] - [:div.row-flex - [:div.input-element.pixels - [:input.input-text - {:placeholder "cx" - :type "number" - :value (precision-or-0 (:cx shape 0) 2) - :on-change (partial on-pos-change :x)}]] - [:div.input-element.pixels - [:input.input-text - {:placeholder "cy" - :type "number" - :value (precision-or-0 (:cy shape 0) 2) - :on-change (partial on-pos-change :y)}]]] +(mf/defc circle-measures-menu + [{:keys [menu shape] :as props}] + [:div.element-set {:key (str (:id menu))} + [:div.element-set-title (:name menu)] + [:div.element-set-content + ;; SLIDEBAR FOR ROTATION AND OPACITY + [:span "Size"] + [:div.row-flex + [:div.input-element.pixels + [:input.input-text + {:placeholder "Width" + :type "number" + :min "0" + :value (precision-or-0 (:rx shape 0) 2) + :on-change #(on-size-change % shape :rx)}]] + [:div.lock-size {:class (when (:proportion-lock shape) "selected") + :on-click #(on-proportion-lock-change % shape)} + (if (:proportion-lock shape) i/lock i/unlock)] - [:span "Rotation"] - [:div.row-flex - [:input.slidebar - {:type "range" - :min 0 - :max 360 - :value (:rotation shape 0) - :on-change on-rotation-change}]] + [:div.input-element.pixels + [:input.input-text + {:placeholder "Height" + :type "number" + :min "0" + :value (precision-or-0 (:ry shape 0) 2) + :on-change #(on-size-change % shape :ry)}]]] + + [:span "Position"] + [:div.row-flex + [:div.input-element.pixels + [:input.input-text + {:placeholder "cx" + :type "number" + :value (precision-or-0 (:cx shape 0) 2) + :on-change #(on-position-change % shape :x)}]] + [:div.input-element.pixels + [:input.input-text + {:placeholder "cy" + :type "number" + :value (precision-or-0 (:cy shape 0) 2) + :on-change #(on-position-change % shape :y)}]]] + + [:span "Rotation"] + [:div.row-flex + [:input.slidebar + {:type "range" + :min 0 + :max 360 + :value (:rotation shape 0) + :on-change #(on-rotation-change % shape)}]] + + [:div.row-flex + [:div.input-element.degrees + [:input.input-text + {:placeholder "" + :type "number" + :min 0 + :max 360 + :value (precision-or-0 (:rotation shape 0) 2) + :on-change #(on-rotation-change % shape)}]] + [:input.input-text + {:style {:visibility "hidden"}}]]]]) + +(defn- on-size-change + [event shape attr] + (let [value (dom/event->value event) + value (parse-int value 0) + sid (:id shape) + props {attr value}] + (st/emit! (uds/update-dimensions sid props)))) + +(defn- on-rotation-change + [event shape] + (let [value (dom/event->value event) + value (parse-int value 0) + sid (:id shape)] + (st/emit! (uds/update-rotation sid value)))) + +(defn- on-position-change + [event shape attr] + (let [value (dom/event->value event) + value (parse-int value nil) + sid (:id shape) + point (gpt/point {attr value})] + (st/emit! (uds/update-position sid point)))) + +(defn- on-proportion-lock-change + [event shape] + (if (:proportion-lock shape) + (st/emit! (uds/unlock-proportions (:id shape))) + (st/emit! (uds/lock-proportions (:id shape))))) - [:div.row-flex - [:div.input-element.degrees - [:input.input-text - {:placeholder "" - :type "number" - :min 0 - :max 360 - :value (precision-or-0 (:rotation shape 0) 2) - :on-change on-rotation-change - }]] - [:input.input-text - {:style {:visibility "hidden"}}]]]])) diff --git a/frontend/src/uxbox/main/ui/workspace/sidebar/options/fill.cljs b/frontend/src/uxbox/main/ui/workspace/sidebar/options/fill.cljs index 20976757d..16836fa82 100644 --- a/frontend/src/uxbox/main/ui/workspace/sidebar/options/fill.cljs +++ b/frontend/src/uxbox/main/ui/workspace/sidebar/options/fill.cljs @@ -2,48 +2,43 @@ ;; License, v. 2.0. If a copy of the MPL was not distributed with this ;; file, You can obtain one at http://mozilla.org/MPL/2.0/. ;; -;; Copyright (c) 2015-2017 Andrey Antukh ;; Copyright (c) 2015-2017 Juan de la Cruz +;; Copyright (c) 2015-2019 Andrey Antukh (ns uxbox.main.ui.workspace.sidebar.options.fill - (:require [lentes.core :as l] - [uxbox.util.i18n :refer (tr)] - [uxbox.util.router :as r] - [potok.core :as ptk] - [uxbox.main.store :as st] - [uxbox.main.data.shapes :as uds] - [uxbox.main.data.lightbox :as udl] - [uxbox.builtins.icons :as i] - [rumext.core :as mx :include-macros true] - [uxbox.util.dom :as dom] - [uxbox.util.data :refer (parse-int parse-float read-string)] - [uxbox.util.spec :refer (color?)])) + (:require + [rumext.alpha :as mf] + [uxbox.builtins.icons :as i] + [uxbox.main.data.workspace :as udw] + [uxbox.main.store :as st] + [uxbox.main.ui.modal :as modal] + [uxbox.main.ui.workspace.colorpicker :refer [colorpicker-modal]] + [uxbox.util.data :refer [parse-float]] + [uxbox.util.dom :as dom] + [uxbox.util.i18n :refer [tr]])) -(mx/defc fill-menu - {:mixins [mx/static]} - [menu {:keys [id] :as shape}] +(mf/defc fill-menu + [{:keys [menu shape]}] (letfn [(change-attrs [attrs] - (st/emit! (uds/update-attrs id attrs))) + (st/emit! (udw/update-shape-attrs (:id shape) attrs))) (on-color-change [event] (let [value (dom/event->value event)] - (when (color? value) - (change-attrs {:fill-color value})))) + (change-attrs {:fill-color value}))) (on-opacity-change [event] (let [value (dom/event->value event) value (parse-float value 1) value (/ value 10000)] (change-attrs {:fill-opacity value}))) - (on-color-picker-event [color] - (change-attrs {:fill-color color})) (show-color-picker [event] (let [x (.-clientX event) y (.-clientY event) - opts {:x x :y y - :shape (:id shape) - :attr :fill-color - :transparent? true}] - (udl/open! :workspace/shape-colorpicker opts)))] - [:div.element-set {:key (str (:id menu))} + props {:x x :y y + :on-change #(change-attrs {:fill-color %}) + :default "#ffffff" + :value (:fill-color shape) + :transparent? true}] + (modal/show! colorpicker-modal props)))] + [:div.element-set [:div.element-set-title (:name menu)] [:div.element-set-content @@ -55,7 +50,7 @@ [:div.color-info [:input {:on-change on-color-change - :value (:fill-color shape)}]]] + :value (:fill-color shape "")}]]] ;; SLIDEBAR FOR ROTATION AND OPACITY [:span "Opacity"] @@ -64,6 +59,6 @@ {:type "range" :min "0" :max "10000" - :value (* 10000 (:fill-opacity shape)) + :value (str (* 10000 (:fill-opacity shape 1))) :step "1" :on-change on-opacity-change}]]]])) diff --git a/frontend/src/uxbox/main/ui/workspace/sidebar/options/icon_measures.cljs b/frontend/src/uxbox/main/ui/workspace/sidebar/options/icon_measures.cljs index e89da9912..7e7306f72 100644 --- a/frontend/src/uxbox/main/ui/workspace/sidebar/options/icon_measures.cljs +++ b/frontend/src/uxbox/main/ui/workspace/sidebar/options/icon_measures.cljs @@ -2,109 +2,114 @@ ;; License, v. 2.0. If a copy of the MPL was not distributed with this ;; file, You can obtain one at http://mozilla.org/MPL/2.0/. ;; -;; Copyright (c) 2015-2016 Andrey Antukh ;; Copyright (c) 2015-2016 Juan de la Cruz +;; Copyright (c) 2015-2019 Andrey Antukh (ns uxbox.main.ui.workspace.sidebar.options.icon-measures - (:require [lentes.core :as l] - [potok.core :as ptk] - [uxbox.builtins.icons :as i] - [uxbox.util.i18n :refer [tr]] - [uxbox.util.router :as r] - [uxbox.main.store :as st] - [uxbox.main.data.workspace :as udw] - [uxbox.main.data.shapes :as uds] - [uxbox.main.geom :as geom] - [rumext.core :as mx :include-macros true] - [uxbox.util.dom :as dom] - [uxbox.util.geom.point :as gpt] - [uxbox.util.data :refer [parse-int parse-float read-string]] - [uxbox.util.math :refer [precision-or-0]])) + (:require + [rumext.alpha :as mf] + [uxbox.builtins.icons :as i] + [uxbox.main.data.shapes :as uds] + [uxbox.main.data.workspace :as udw] + [uxbox.main.geom :as geom] + [uxbox.main.store :as st] + [uxbox.util.data :refer [parse-int parse-float read-string]] + [uxbox.util.dom :as dom] + [uxbox.util.geom.point :as gpt] + [uxbox.util.i18n :refer [tr]] + [uxbox.util.math :refer [precision-or-0]])) -(mx/defc icon-measures-menu - {:mixins [mx/static]} - [menu shape] - (letfn [(on-size-change [attr event] - (let [value (dom/event->value event) - value (parse-int value 0) - sid (:id shape) - props {attr value}] - (st/emit! (uds/update-dimensions sid props)))) - (on-rotation-change [event] - (let [value (dom/event->value event) - value (parse-int value 0) - sid (:id shape)] - (st/emit! (uds/update-rotation sid value)))) - (on-pos-change [attr event] - (let [value (dom/event->value event) - value (parse-int value nil) - sid (:id shape) - point (gpt/point {attr value})] - (st/emit! (uds/update-position sid point)))) - (on-proportion-lock-change [event] - (if (:proportion-lock shape) - (st/emit! (uds/unlock-proportions (:id shape))) - (st/emit! (uds/lock-proportions (:id shape)))))] - (let [size (geom/size shape)] - [:div.element-set {:key (str (:id menu))} - [:div.element-set-title (:name menu)] - [:div.element-set-content - ;; SLIDEBAR FOR ROTATION AND OPACITY - [:span "Size"] - [:div.row-flex - [:div.input-element.pixels - [:input.input-text - {:placeholder "Width" - :type "number" - :min "0" - :value (precision-or-0 (:width size) 2) - :on-change (partial on-size-change :width)}]] - [:div.lock-size - {:class (when (:proportion-lock shape) "selected") - :on-click on-proportion-lock-change} - (if (:proportion-lock shape) i/lock i/unlock)] - [:div.input-element.pixels - [:input.input-text - {:placeholder "Height" - :type "number" - :min "0" - :value (precision-or-0 (:height size) 2) - :on-change (partial on-size-change :height)}]]] +(declare on-size-change) +(declare on-rotation-change) +(declare on-position-change) +(declare on-proportion-lock-change) - [:span "Position"] - [:div.row-flex - [:div.input-element.pixels - [:input.input-text - {:placeholder "X" - :type "number" - :value (precision-or-0 (:x1 shape 0) 2) - :on-change (partial on-pos-change :x)}]] - [:div.input-element.pixels - [:input.input-text - {:placeholder "Y" - :type "number" - :value (precision-or-0 (:y1 shape 0) 2) - :on-change (partial on-pos-change :y)}]]] +(mf/defc icon-measures-menu + [{:keys [menu shape] :as props}] + (let [size (geom/size shape)] + [:div.element-set {:key (str (:id menu))} + [:div.element-set-title (:name menu)] + [:div.element-set-content + ;; SLIDEBAR FOR ROTATION AND OPACITY + [:span "Size"] + [:div.row-flex + [:div.input-element.pixels + [:input.input-text {:placeholder "Width" + :type "number" + :min "0" + :value (precision-or-0 (:width size) 2) + :on-change #(on-size-change % shape :width)}]] + [:div.lock-size {:class (when (:proportion-lock shape) "selected") + :on-click #(on-proportion-lock-change % shape)} + (if (:proportion-lock shape) i/lock i/unlock)] - [:span "Rotation"] - [:div.row-flex - [:input.slidebar - {:type "range" - :min 0 - :max 360 - :value (:rotation shape 0) - :on-change on-rotation-change}]] + [:div.input-element.pixels + [:input.input-text {:placeholder "Height" + :type "number" + :min "0" + :value (precision-or-0 (:height size) 2) + :on-change #(on-size-change % shape :height)}]]] + + [:span "Position"] + [:div.row-flex + [:div.input-element.pixels + [:input.input-text + {:placeholder "X" + :type "number" + :value (precision-or-0 (:x1 shape 0) 2) + :on-change #(on-position-change % shape :x)}]] + [:div.input-element.pixels + [:input.input-text + {:placeholder "Y" + :type "number" + :value (precision-or-0 (:y1 shape 0) 2) + :on-change #(on-position-change % shape :y)}]]] + + [:span "Rotation"] + [:div.row-flex + [:input.slidebar + {:type "range" + :min 0 + :max 360 + :value (:rotation shape 0) + :on-change #(on-rotation-change % shape)}]] + + [:div.row-flex + [:div.input-element.degrees + [:input.input-text {:placeholder "" + :type "number" + :min 0 + :max 360 + :value (precision-or-0 (:rotation shape 0) 2) + :on-change on-rotation-change}]] + [:input.input-text {:style {:visibility "hidden"}}]]]])) + +(defn- on-size-change + [event shape attr] + (let [value (dom/event->value event) + value (parse-int value 0) + sid (:id shape) + props {attr value}] + (st/emit! (uds/update-dimensions sid props)))) + +(defn- on-rotation-change + [event shape] + (let [value (dom/event->value event) + value (parse-int value 0) + sid (:id shape)] + (st/emit! (uds/update-rotation sid value)))) + +(defn- on-position-change + [event shape attr] + (let [value (dom/event->value event) + value (parse-int value nil) + sid (:id shape) + point (gpt/point {attr value})] + (st/emit! (uds/update-position sid point)))) + +(defn- on-proportion-lock-change + [event shape] + (if (:proportion-lock shape) + (st/emit! (uds/unlock-proportions (:id shape))) + (st/emit! (uds/lock-proportions (:id shape))))) - [:div.row-flex - [:div.input-element.degrees - [:input.input-text - {:placeholder "" - :type "number" - :min 0 - :max 360 - :value (precision-or-0 (:rotation shape 0) 2) - :on-change on-rotation-change - }]] - [:input.input-text - {:style {:visibility "hidden"}}] - ]]]))) diff --git a/frontend/src/uxbox/main/ui/workspace/sidebar/options/image_measures.cljs b/frontend/src/uxbox/main/ui/workspace/sidebar/options/image_measures.cljs index 72905b8f7..6116b18d5 100644 --- a/frontend/src/uxbox/main/ui/workspace/sidebar/options/image_measures.cljs +++ b/frontend/src/uxbox/main/ui/workspace/sidebar/options/image_measures.cljs @@ -6,119 +6,130 @@ ;; Copyright (c) 2015-2017 Juan de la Cruz (ns uxbox.main.ui.workspace.sidebar.options.image-measures - (:require [lentes.core :as l] - [uxbox.util.i18n :refer (tr)] - [uxbox.util.router :as r] - [potok.core :as ptk] - [uxbox.main.store :as st] - [uxbox.main.data.workspace :as udw] - [uxbox.main.data.shapes :as uds] - [uxbox.builtins.icons :as i] - [uxbox.main.geom :as geom] - [uxbox.util.dom :as dom] - [uxbox.util.geom.point :as gpt] - [uxbox.util.data :refer (parse-int parse-float read-string)] - [uxbox.util.math :refer (precision-or-0)] - [rumext.core :as mx :include-macros true])) + (:require + [rumext.alpha :as mf] + [uxbox.builtins.icons :as i] + [uxbox.main.data.shapes :as uds] + [uxbox.main.data.workspace :as udw] + [uxbox.main.geom :as geom] + [uxbox.main.store :as st] + [uxbox.util.data :refer (parse-int parse-float read-string)] + [uxbox.util.dom :as dom] + [uxbox.util.geom.point :as gpt] + [uxbox.util.i18n :refer (tr)] + [uxbox.util.math :refer (precision-or-0)])) -(mx/defc image-measures-menu - {:mixins [mx/static]} - [menu {:keys [id] :as shape}] - (letfn [(on-size-change [attr event] - (let [value (dom/event->value event) - value (parse-int value 0) - props {attr value}] - (st/emit! (uds/update-dimensions id props)))) - (on-rotation-change [event] - (let [value (dom/event->value event) - value (parse-int value 0)] - (st/emit! (uds/update-rotation id value)))) - (on-opacity-change [event] - (let [value (dom/event->value event) - value (parse-float value 1) - value (/ value 10000)] - (st/emit! (uds/update-attrs id {:opacity value})))) - (on-pos-change [attr event] - (let [value (dom/event->value event) - value (parse-int value nil) - point (gpt/point {attr value})] - (st/emit! (uds/update-position id point)))) - (on-proportion-lock-change [event] - (if (:proportion-lock shape) - (st/emit! (uds/unlock-proportions id)) - (st/emit! (uds/lock-proportions id))))] - (let [size (geom/size shape)] - [:div.element-set {:key (str (:id menu))} - [:div.element-set-title (:name menu)] - [:div.element-set-content - ;; SLIDEBAR FOR ROTATION AND OPACITY - [:span "Size"] - [:div.row-flex - [:div.input-element.pixels - [:input.input-text - {:placeholder "Width" - :type "number" - :min "0" - :value (precision-or-0 (:width size) 2) - :on-change (partial on-size-change :width)}]] - [:div.lock-size - {:class (when (:proportion-lock shape) "selected") - :on-click on-proportion-lock-change} - (if (:proportion-lock shape) i/lock i/unlock)] - [:div.input-element.pixels - [:input.input-text - {:placeholder "Height" - :type "number" - :min "0" - :value (precision-or-0 (:height size) 2) - :on-change (partial on-size-change :height)}]]] +(declare on-size-change) +(declare on-rotation-change) +(declare on-opacity-change) +(declare on-position-change) +(declare on-proportion-lock-change) - [:span "Position"] - [:div.row-flex - [:div.input-element.pixels - [:input.input-text - {:placeholder "X" - :type "number" - :value (precision-or-0 (:x1 shape 0) 2) - :on-change (partial on-pos-change :x)}]] - [:div.input-element.pixels - [:input.input-text - {:placeholder "Y" - :type "number" - :value (precision-or-0 (:y1 shape 0) 2) - :on-change (partial on-pos-change :y)}]]] +(mf/defc image-measures-menu + [{:keys [menu shape] :as props}] + (let [size (geom/size shape)] + [:div.element-set + [:div.element-set-title (:name menu)] + [:div.element-set-content + ;; SLIDEBAR FOR ROTATION AND OPACITY + [:span "Size"] + [:div.row-flex + [:div.input-element.pixels + [:input.input-text + {:placeholder "Width" + :type "number" + :min "0" + :value (precision-or-0 (:width size) 2) + :on-change #(on-size-change % shape :width)}]] + [:div.lock-size + {:class (when (:proportion-lock shape) "selected") + :on-click #(on-proportion-lock-change % shape)} + (if (:proportion-lock shape) i/lock i/unlock)] + [:div.input-element.pixels + [:input.input-text + {:placeholder "Height" + :type "number" + :min "0" + :value (precision-or-0 (:height size) 2) + :on-change #(on-size-change % shape :height)}]]] - ;; [:span "Rotation"] - ;; [:div.row-flex - ;; [:input.slidebar - ;; {:type "range" - ;; :min 0 - ;; :max 360 - ;; :value (:rotation shape 0) - ;; :on-change on-rotation-change}]] + [:span "Position"] + [:div.row-flex + [:div.input-element.pixels + [:input.input-text + {:placeholder "X" + :type "number" + :value (precision-or-0 (:x1 shape 0) 2) + :on-change #(on-position-change % shape :x)}]] + [:div.input-element.pixels + [:input.input-text + {:placeholder "Y" + :type "number" + :value (precision-or-0 (:y1 shape 0) 2) + :on-change #(on-position-change % shape :y)}]]] - ;; [:div.row-flex - ;; [:div.input-element.degrees - ;; [:input.input-text - ;; {:placeholder "" - ;; :type "number" - ;; :min 0 - ;; :max 360 - ;; :value (precision-or-0 (:rotation shape 0) 2) - ;; :on-change on-rotation-change - ;; }]] - ;; [:input.input-text - ;; {:style {:visibility "hidden"}}]] + ;; [:span "Rotation"] + ;; [:div.row-flex + ;; [:input.slidebar + ;; {:type "range" + ;; :min 0 + ;; :max 360 + ;; :value (:rotation shape 0) + ;; :on-change on-rotation-change}]] + + ;; [:div.row-flex + ;; [:div.input-element.degrees + ;; [:input.input-text + ;; {:placeholder "" + ;; :type "number" + ;; :min 0 + ;; :max 360 + ;; :value (precision-or-0 (:rotation shape 0) 2) + ;; :on-change on-rotation-change + ;; }]] + ;; [:input.input-text + ;; {:style {:visibility "hidden"}}]] - [:span "Opacity"] - [:div.row-flex - [:input.slidebar - {:type "range" - :min "0" - :max "10000" - :value (* 10000 (:opacity shape 1)) - :step "1" - :on-change on-opacity-change}]] + [:span "Opacity"] + [:div.row-flex + [:input.slidebar + {:type "range" + :min "0" + :max "10000" + :value (* 10000 (:opacity shape 1)) + :step "1" + :on-change #(on-opacity-change % shape)}]]]])) - ]]))) +(defn- on-size-change + [event shape attr] + (let [value (dom/event->value event) + value (parse-int value 0) + props {attr value}] + (st/emit! (uds/update-dimensions (:id shape) props)))) + +(defn- on-rotation-change + [event shape] + (let [value (dom/event->value event) + value (parse-int value 0)] + (st/emit! (uds/update-rotation (:id shape) value)))) + +(defn- on-opacity-change + [event shape] + (let [value (dom/event->value event) + value (parse-float value 1) + value (/ value 10000)] + (st/emit! (uds/update-attrs (:id shape) {:opacity value})))) + +(defn- on-position-change + [event shape attr] + (let [value (dom/event->value event) + value (parse-int value nil) + point (gpt/point {attr value})] + (st/emit! (uds/update-position (:id shape) point)))) + +(defn- on-proportion-lock-change + [event shape] + (if (:proportion-lock shape) + (st/emit! (uds/unlock-proportions (:id shape))) + (st/emit! (uds/lock-proportions (:id shape))))) diff --git a/frontend/src/uxbox/main/ui/workspace/sidebar/options/interactions.cljs b/frontend/src/uxbox/main/ui/workspace/sidebar/options/interactions.cljs index 128a7ffeb..674256504 100644 --- a/frontend/src/uxbox/main/ui/workspace/sidebar/options/interactions.cljs +++ b/frontend/src/uxbox/main/ui/workspace/sidebar/options/interactions.cljs @@ -7,8 +7,7 @@ (ns uxbox.main.ui.workspace.sidebar.options.interactions (:require - [lentes.core :as l] - [rumext.core :as mx :include-macros true] + [rumext.alpha :as mf] [uxbox.builtins.icons :as i] [uxbox.main.data.lightbox :as udl] [uxbox.main.data.shapes :as uds] @@ -19,7 +18,6 @@ [uxbox.util.data :refer [read-string]] [uxbox.util.dom :as dom] [uxbox.util.i18n :refer [tr]] - [uxbox.util.router :as r] [uxbox.util.spec :refer [color?]])) ;; --- Helpers @@ -53,11 +51,11 @@ ;; :holdrelease "Hold release" (pr-str trigger))) -(mx/defc interactions-list - [shape form-ref] +(mf/defc interactions-list + [{:keys [shape form] :as props}] (letfn [(on-edit [item event] (dom/prevent-default event) - (reset! form-ref item)) + (reset! form item)) (delete [item] (let [sid (:id shape) id (:id item)] @@ -78,16 +76,17 @@ ;; --- Trigger Input -(mx/defc trigger-input - [form-ref] - (when-not (:trigger @form-ref) - (swap! form-ref assoc :trigger :click)) +(mf/defc trigger-input + [{:keys [form] :as props}] + ;; (mf/use-effect + ;; {:init #(when-not (:trigger @form) (swap! form assoc :trigger :click)) + ;; :deps true}) [:div [:span "Trigger"] [:div.row-flex [:select.input-select {:placeholder "Choose a trigger" - :on-change (partial on-change form-ref :trigger) - :value (pr-str (:trigger @form-ref))} + :on-change (partial on-change form :trigger) + :value (pr-str (:trigger @form))} [:option {:value ":click"} "Click"] [:option {:value ":doubleclick"} "Double-click"] [:option {:value ":rightclick"} "Right-click"] @@ -105,15 +104,15 @@ ;; --- URL Input -(mx/defc url-input - [form-ref] +(mf/defc url-input + [form] [:div [:span "Url"] [:div.row-flex [:input.input-text {:placeholder "http://" - :on-change (partial on-change form-ref :url) - :value (:url @form-ref "") + :on-change (partial on-change form :url) + :value (:url @form "") :type "url"}]]]) ;; --- Elements Input @@ -129,16 +128,16 @@ (conj acc shape))))] (reduce resolve-shape [] shapes)))) -(mx/defc elements-input - [page form-ref] - (let [shapes (collect-shapes @st/state page)] +(mf/defc elements-input + [{:keys [page-id form] :as props}] + (let [shapes (collect-shapes @st/state page-id)] [:div [:span "Element"] [:div.row-flex [:select.input-select {:placeholder "Choose an element" - :on-change (partial on-change form-ref :element) - :value (pr-str (:element @form-ref))} + :on-change (partial on-change form :element) + :value (pr-str (:element @form))} [:option {:value "nil"} "---"] (for [shape shapes :let [key (pr-str (:id shape))]] @@ -146,11 +145,10 @@ ;; --- Page Input -(mx/defc pages-input - {:mixins [mx/reactive]} +(mf/defc pages-input [form-ref path] ;; FIXME: react on ref - (let [pages (mx/react refs/selected-project-pages)] + #_(let [pages (mx/react refs/selected-project-pages)] (when (and (not (:page @form-ref)) (pos? (count pages))) (swap! form-ref assoc :page (:id (first pages)))) @@ -166,124 +164,124 @@ ;; --- Animation -(mx/defc animation-input - [form-ref] - (when-not (:action @form-ref) - (swap! form-ref assoc :animation :none)) +(mf/defc animation-input + [{:keys [form] :as props}] + (when-not (:action @form) + (swap! form assoc :animation :none)) [:div [:span "Animation"] [:div.row-flex [:select.input-select {:placeholder "Animation" - :on-change (partial on-change form-ref :animation) - :value (pr-str (:animation @form-ref))} + :on-change (partial on-change form :animation) + :value (pr-str (:animation @form))} [:option {:value ":none"} "None"] [:option {:value ":fade"} "Fade"] [:option {:value ":slide"} "Slide"]]]]) ;; --- MoveTo Input -(mx/defc moveto-input - [form-ref] - (when-not (:moveto-x @form-ref) - (swap! form-ref assoc :moveto-x 0)) - (when-not (:moveto-y @form-ref) - (swap! form-ref assoc :moveto-y 0)) +(mf/defc moveto-input + [{:keys [form] :as props}] + (when-not (:moveto-x @form) + (swap! form assoc :moveto-x 0)) + (when-not (:moveto-y @form) + (swap! form assoc :moveto-y 0)) [:div [:span "Move to position"] [:div.row-flex [:div.input-element.pixels [:input.input-text {:placeholder "X" - :on-change (partial on-change form-ref :moveto-x) + :on-change (partial on-change form :moveto-x) :type "number" - :value (:moveto-x @form-ref "")}]] + :value (:moveto-x @form "")}]] [:div.input-element.pixels [:input.input-text {:placeholder "Y" - :on-change (partial on-change form-ref :moveto-y) + :on-change (partial on-change form :moveto-y) :type "number" - :value (:moveto-y @form-ref "")}]]]]) + :value (:moveto-y @form "")}]]]]) ;; --- MoveBy Input -(mx/defc moveby-input - [form-ref] - (when-not (:moveby-x @form-ref) - (swap! form-ref assoc :moveby-x 0)) - (when-not (:moveby-y @form-ref) - (swap! form-ref assoc :moveby-y 0)) +(mf/defc moveby-input + [{:keys [form] :as props}] + (when-not (:moveby-x @form) + (swap! form assoc :moveby-x 0)) + (when-not (:moveby-y @form) + (swap! form assoc :moveby-y 0)) [:div [:span "Move to position"] [:div.row-flex [:div.input-element.pixels [:input.input-text {:placeholder "X" - :on-change (partial on-change form-ref :moveby-x) + :on-change (partial on-change form :moveby-x) :type "number" - :value (:moveby-x @form-ref "")}]] + :value (:moveby-x @form "")}]] [:div.input-element.pixels [:input.input-text {:placeholder "Y" - :on-change (partial on-change form-ref :moveby-y) + :on-change (partial on-change form :moveby-y) :type "number" - :value (:moveby-y @form-ref "")}]]]]) + :value (:moveby-y @form "")}]]]]) ;; --- Opacity Input -(mx/defc opacity-input - [form-ref] - (when-not (:opacity @form-ref) - (swap! form-ref assoc :opacity 100)) +(mf/defc opacity-input + [{:keys [form] :as props}] + (when-not (:opacity @form) + (swap! form assoc :opacity 100)) [:div [:span "Opacity"] [:div.row-flex [:div.input-element.percentail [:input.input-text {:placeholder "%" - :on-change (partial on-change form-ref :opacity) + :on-change (partial on-change form :opacity) :min "0" :max "100" :type "number" - :value (:opacity @form-ref "")}]]]]) + :value (:opacity @form "")}]]]]) ;; --- Rotate Input -(mx/defc rotate-input - [form-ref] - [:div - [:span "Rotate (dg)"] - [:div.row-flex - [:div.input-element.degrees - [:input.input-text - {:placeholder "dg" - :on-change (partial on-change form-ref :rotation) - :type "number" - :value (:rotation @form-ref "")}]]]]) +;; (mx/defc rotate-input +;; [form] +;; [:div +;; [:span "Rotate (dg)"] +;; [:div.row-flex +;; [:div.input-element.degrees +;; [:input.input-text +;; {:placeholder "dg" +;; :on-change (partial on-change form :rotation) +;; :type "number" +;; :value (:rotation @form "")}]]]]) ;; --- Resize Input -(mx/defc resize-input - [form-ref] +(mf/defc resize-input + [{:keys [form] :as props}] [:div [:span "Resize"] [:div.row-flex [:div.input-element.pixels [:input.input-text {:placeholder "Width" - :on-change (partial on-change form-ref :resize-width) + :on-change (partial on-change form :resize-width) :type "number" - :value (:resize-width @form-ref "")}]] + :value (:resize-width @form "")}]] [:div.input-element.pixels [:input.input-text {:placeholder "Height" - :on-change (partial on-change form-ref :resize-height) + :on-change (partial on-change form :resize-height) :type "number" - :value (:resize-height @form-ref "")}]]]]) + :value (:resize-height @form "")}]]]]) ;; --- Color Input -(mx/defc colorpicker +(mf/defc colorpicker [{:keys [x y on-change value]}] (let [left (- x 260) top (- y 50)] @@ -300,14 +298,14 @@ [params] (colorpicker params)) -(mx/defc color-input - [form-ref] - (when-not (:fill-color @form-ref) - (swap! form-ref assoc :fill-color "#000000")) - (when-not (:stroke-color @form-ref) - (swap! form-ref assoc :stroke-color "#000000")) +(mf/defc color-input + [{:keys [form] :as props}] + (when-not (:fill-color @form) + (swap! form assoc :fill-color "#000000")) + (when-not (:stroke-color @form) + (swap! form assoc :stroke-color "#000000")) (letfn [(on-change [attr color] - (swap! form-ref assoc attr color)) + (swap! form assoc attr color)) (on-change-fill-color [event] (let [value (dom/event->value event)] (when (color? value) @@ -321,11 +319,11 @@ y (.-clientY event) opts {:x x :y y :on-change (partial on-change attr) - :value (get @form-ref attr) + :value (get @form attr) :transparent? true}] (udl/open! :interactions/colorpicker opts)))] - (let [stroke-color (:stroke-color @form-ref) - fill-color (:fill-color @form-ref)] + (let [stroke-color (:stroke-color @form) + fill-color (:fill-color @form)] [:div [:div.row-flex [:div.column-half @@ -351,17 +349,17 @@ ;; --- Easing Input -(mx/defc easing-input - [form-ref] - (when-not (:easing @form-ref) - (swap! form-ref assoc :easing :linear)) +(mf/defc easing-input + [{:keys [form] :as props}] + (when-not (:easing @form) + (swap! form assoc :easing :linear)) [:div [:span "Easing"] [:div.row-flex [:select.input-select {:placeholder "Easing" - :on-change (partial on-change form-ref :easing) - :value (pr-str (:easing @form-ref))} + :on-change (partial on-change form :easing) + :value (pr-str (:easing @form))} [:option {:value ":linear"} "Linear"] [:option {:value ":easein"} "Ease in"] [:option {:value ":easeout"} "Ease out"] @@ -369,12 +367,12 @@ ;; --- Duration Input -(mx/defc duration-input - [form-ref] - (when-not (:duration @form-ref) - (swap! form-ref assoc :duration 300)) - (when-not (:delay @form-ref) - (swap! form-ref assoc :delay 0)) +(mf/defc duration-input + [{:keys [form] :as props}] + (when-not (:duration @form) + (swap! form assoc :duration 300)) + (when-not (:delay @form) + (swap! form assoc :delay 0)) [:div [:span "Duration | Delay"] [:div.row-flex @@ -382,21 +380,21 @@ [:input.input-text {:placeholder "Duration" :type "number" - :on-change (partial on-change form-ref :duration) - :value (pr-str (:duration @form-ref))}]] + :on-change (partial on-change form :duration) + :value (pr-str (:duration @form))}]] [:div.input-element.miliseconds [:input.input-text {:placeholder "Delay" :type "number" - :on-change (partial on-change form-ref :delay) - :value (pr-str (:delay @form-ref))}]]]]) + :on-change (partial on-change form :delay) + :value (pr-str (:delay @form))}]]]]) ;; --- Action Input -(mx/defc action-input - [page form-ref] - (when-not (:action @form-ref) - (swap! form-ref assoc :action :show)) - (let [form @form-ref +(mf/defc action-input + [{:keys [shape form] :as props}] + ;; (when-not (:action @form) + ;; (swap! form assoc :action :show)) + (let [form-data (deref form) simple? #{:gotourl :gotopage} elements? (complement simple?) animation? #{:show :hide :toggle} @@ -406,8 +404,8 @@ [:div.row-flex [:select.input-select {:placeholder "Choose an action" - :on-change (partial on-change form-ref :action [:trigger]) - :value (pr-str (:action form))} + :on-change (partial on-change form :action [:trigger]) + :value (pr-str (:action form-data))} [:option {:value ":show"} "Show"] [:option {:value ":hide"} "Hide"] [:option {:value ":toggle"} "Toggle"] @@ -422,47 +420,49 @@ #_[:option {:value ":goback"} "Go back"] [:option {:value ":scrolltoelement"} "Scroll to element"]]] - (case (:action form) - :gotourl (url-input form-ref) - :gotopage (pages-input form-ref) - :color (color-input form-ref) - ;; :rotate (rotate-input form-ref) - :size (resize-input form-ref) - :moveto (moveto-input form-ref) - :moveby (moveby-input form-ref) - :opacity (opacity-input form-ref) + (case (:action form-data) + :gotourl [:& url-input {:form form}] + ;; :gotopage (pages-input form) + :color [:& color-input {:form form}] + ;; :rotate (rotate-input form) + :size [:& resize-input {:form form}] + :moveto [:& moveto-input {:form form}] + :moveby [:& moveby-input {:form form}] + :opacity [:& opacity-input {:form form}] nil) - (when (elements? (:action form)) - (elements-input page form-ref)) + (when (elements? (:action form-data)) + [:& elements-input {:page-id (:page shape) + :form form}]) - (when (and (animation? (:action form)) - (:element @form-ref)) - (animation-input form-ref)) + (when (and (animation? (:action form-data)) + (:element form-data)) + [:& animation-input {:form form}]) + + (when (or (not= (:animation form-data :none) :none) + (and (only-easing? (:action form-data)) + (:element form-data))) + [:* + [:& easing-input {:form form}] + [:& duration-input {:form form}]])])) - (when (or (not= (:animation form :none) :none) - (and (only-easing? (:action form)) - (:element form))) - (list (easing-input form-ref) - (duration-input form-ref))) - ])) ;; --- Form -(mx/defc interactions-form - [shape form-ref] +(mf/defc interactions-form + [{:keys [shape form] :as props}] (letfn [(on-submit [event] (dom/prevent-default event) - (let [shape-id (:id shape) - data (deref form-ref)] - (st/emit! (uds/update-interaction shape-id data)) - (reset! form-ref nil))) + (let [sid (:id shape) + data (deref form)] + (st/emit! (uds/update-interaction sid data)) + (reset! form nil))) (on-cancel [event] (dom/prevent-default event) - (reset! form-ref nil))] + (reset! form nil))] [:form {:on-submit on-submit} - (trigger-input form-ref) - (action-input (:page shape) form-ref) + [:& trigger-input {:form form}] + [:& action-input {:shape shape :form form}] [:div.row-flex [:input.btn-primary.btn-small.save-btn {:value "Save" :type "submit"}] @@ -471,23 +471,24 @@ ;; --- Interactions Menu -(mx/defcs interactions-menu - {:mixins [mx/static (mx/local)]} - [own menu shape] - (let [local (::mx/local own) - form-ref (l/derive (l/key :form) local) - interactions (:interactions shape) - create-interaction #(reset! form-ref {})] +(def +initial-form+ + {:trigger :click + :action :show}) + +(mf/defc interactions-menu + [{:keys [menu shape] :as props}] + (let [form (mf/use-state nil) + interactions (:interactions shape)] [:div.element-set {:key (str (:id menu))} [:div.element-set-title (:name menu)] [:div.element-set-content - (if @form-ref - (interactions-form shape form-ref) + (if form + [:& interactions-form {:form form :shape shape}] [:div - (interactions-list shape form-ref) + [:& interactions-list {:form form :shape shape}] [:input.btn-primary.btn-small {:value "New interaction" - :on-click create-interaction + :on-click #(reset! form +initial-form+) :type "button"}]])]])) ;; --- Not implemented stuff diff --git a/frontend/src/uxbox/main/ui/workspace/sidebar/options/page.cljs b/frontend/src/uxbox/main/ui/workspace/sidebar/options/page.cljs index c61ee8028..980a6962f 100644 --- a/frontend/src/uxbox/main/ui/workspace/sidebar/options/page.cljs +++ b/frontend/src/uxbox/main/ui/workspace/sidebar/options/page.cljs @@ -7,57 +7,55 @@ (ns uxbox.main.ui.workspace.sidebar.options.page "Page options menu entries." - (:require [lentes.core :as l] - [potok.core :as ptk] - [cuerdas.core :as str] - [uxbox.main.store :as st] - [uxbox.main.constants :as c] - [uxbox.main.refs :as refs] - [uxbox.main.data.pages :as udp] - [uxbox.main.data.workspace :as udw] - [uxbox.main.data.lightbox :as udl] - [uxbox.builtins.icons :as i] - [uxbox.main.ui.workspace.colorpicker] - [rumext.core :as mx :include-macros true] - [uxbox.util.data :refer [parse-int]] - [uxbox.util.spec :refer [color?]] - [uxbox.util.dom :as dom])) + (:require + [cuerdas.core :as str] + [rumext.alpha :as mf] + [uxbox.builtins.icons :as i] + [uxbox.main.constants :as c] + [uxbox.main.data.pages :as udp] + [uxbox.main.data.workspace :as udw] + [uxbox.main.refs :as refs] + [uxbox.main.store :as st] + [uxbox.main.ui.modal :as modal] + [uxbox.main.ui.workspace.colorpicker :refer [colorpicker-modal]] + [uxbox.util.data :refer [parse-int]] + [uxbox.util.dom :as dom] + [uxbox.util.spec :refer [color?]])) -(mx/defcs measures-menu - {:mixins [mx/static mx/reactive]} - [own menu] - (let [{:keys [id metadata] :as page} (mx/react refs/selected-page) +(mf/defc measures-menu + [{:keys [menu page] :as props}] + (let [metadata (:metadata page) metadata (merge c/page-metadata metadata)] - (letfn [(on-size-change [attr] - (when-let [value (-> (mx/ref-node own (name attr)) - (dom/get-value) - (parse-int nil))] + (letfn [(on-size-change [event attr] + (let [value (-> (dom/event->value event) + (parse-int nil))] (st/emit! (->> (assoc metadata attr value) - (udp/update-metadata id))))) + (udp/update-metadata (:id page)))))) - (on-color-change [] - (when-let [value (-> (mx/ref-node own "color") - (dom/get-value) - (#(if (color? %) % nil)))] - (->> (assoc metadata :background value) - (udp/update-metadata id) - (st/emit!)))) + (change-color [color] + (st/emit! (->> (assoc metadata :background color) + (udp/update-metadata (:id page))))) - (on-name-change [] - (when-let [value (-> (mx/ref-node own "name") - (dom/get-value) - (str/trim))] + (on-color-change [event] + (let [value (dom/event->value event)] + (change-color value))) + + (on-name-change [event] + (let [value (-> (dom/event->value event) + (str/trim))] (st/emit! (->> (assoc page :name value) - (udp/update-page id))))) + (udp/update-page (:id page)))))) (show-color-picker [event] (let [x (.-clientX event) y (.-clientY event) - opts {:x x :y y - :default "#ffffff" - :transparent? true - :attr :background}] - (udl/open! :workspace/page-colorpicker opts)))] + props {:x x :y y + :default "#ffffff" + :value (:background metadata) + :transparent? true + :on-change change-color}] + (modal/show! colorpicker-modal props)))] + [:div.element-set [:div.element-set-title (:name menu)] [:div.element-set-content @@ -66,7 +64,6 @@ [:div.input-element [:input.input-text {:type "text" - :ref "name" :on-change on-name-change :value (str (:name page)) :placeholder "page name"}]]] @@ -76,15 +73,13 @@ [:div.input-element.pixels [:input.input-text {:type "number" - :ref "width" - :on-change #(on-size-change :width) + :on-change #(on-size-change % :width) :value (str (:width metadata)) :placeholder "width"}]] [:div.input-element.pixels [:input.input-text {:type "number" - :ref "height" - :on-change #(on-size-change :height) + :on-change #(on-size-change % :height) :value (str (:height metadata)) :placeholder "height"}]]] @@ -96,43 +91,39 @@ [:div.color-info [:input {:on-change on-color-change - :ref "color" :value (:background metadata)}]]]]]))) -(mx/defcs grid-options-menu - {:mixins [mx/static mx/reactive]} - [own menu] - (let [{:keys [id metadata] :as page} (mx/react refs/selected-page) +(mf/defc grid-options-menu + [{:keys [menu page] :as props}] + (let [metadata (:metadata page) metadata (merge c/page-metadata metadata)] - (letfn [(on-x-change [] - (when-let [value (-> (mx/ref-node own "x-axis") - (dom/get-value) - (parse-int nil))] - (st/emit! - (->> (assoc metadata :grid-x-axis value) - (udw/update-metadata id))))) - (on-y-change [] - (when-let [value (-> (mx/ref-node own "y-axis") - (dom/get-value) - (parse-int nil))] - (st/emit! - (->> (assoc metadata :grid-y-axis value) - (udw/update-metadata id))))) - (on-color-change [] - (when-let [value (-> (mx/ref-node own "color") - (dom/get-value) - (#(if (color? %) % nil)))] - (->> (assoc metadata :grid-color value) - (udp/update-metadata id) - (st/emit!)))) + (letfn [(on-x-change [event] + (let [value (-> (dom/event->value event) + (parse-int nil))] + (st/emit! (->> (assoc metadata :grid-x-axis value) + (udp/update-metadata (:id page)))))) + (on-y-change [event] + (let [value (-> (dom/event->value event) + (parse-int nil))] + (st/emit! (->> (assoc metadata :grid-y-axis value) + (udp/update-metadata (:id page)))))) + + (change-color [color] + (st/emit! (->> (assoc metadata :grid-color color) + (udp/update-metadata (:id page))))) + (on-color-change [event] + (let [value (dom/event->value event)] + (change-color value))) + (show-color-picker [event] (let [x (.-clientX event) y (.-clientY event) - opts {:x x :y y - :transparent? true - :default "#cccccc" - :attr :grid-color}] - (udl/open! :workspace/page-colorpicker opts)))] + props {:x x :y y + :transparent? true + :default "#cccccc" + :attr :grid-color + :on-change change-color}] + (modal/show! colorpicker-modal props)))] [:div.element-set [:div.element-set-title (:name menu)] [:div.element-set-content @@ -141,14 +132,12 @@ [:div.input-element.pixels [:input.input-text {:type "number" - :ref "x-axis" :value (:grid-x-axis metadata) :on-change on-x-change :placeholder "x"}]] [:div.input-element.pixels [:input.input-text {:type "number" - :ref "y-axis" :value (:grid-y-axis metadata) :on-change on-y-change :placeholder "y"}]]] @@ -160,5 +149,4 @@ [:div.color-info [:input {:on-change on-color-change - :ref "color" :value (:grid-color metadata "#cccccc")}]]]]]))) diff --git a/frontend/src/uxbox/main/ui/workspace/sidebar/options/rect_measures.cljs b/frontend/src/uxbox/main/ui/workspace/sidebar/options/rect_measures.cljs index 893813501..711e11b8a 100644 --- a/frontend/src/uxbox/main/ui/workspace/sidebar/options/rect_measures.cljs +++ b/frontend/src/uxbox/main/ui/workspace/sidebar/options/rect_measures.cljs @@ -6,101 +6,104 @@ ;; Copyright (c) 2015-2017 Juan de la Cruz (ns uxbox.main.ui.workspace.sidebar.options.rect-measures - (:require [lentes.core :as l] - [uxbox.util.i18n :refer [tr]] - [uxbox.util.router :as r] - [potok.core :as ptk] - [uxbox.main.store :as st] - [uxbox.main.data.workspace :as udw] - [uxbox.main.data.shapes :as uds] - [uxbox.builtins.icons :as i] - [rumext.core :as mx :include-macros true] - [uxbox.main.geom :as geom] - [uxbox.util.dom :as dom] - [uxbox.util.geom.point :as gpt] - [uxbox.util.data :refer [parse-int parse-float read-string]] - [uxbox.util.math :refer [precision-or-0]])) + (:require + [rumext.alpha :as mf] + [uxbox.builtins.icons :as i] + [uxbox.main.data.shapes :as uds] + [uxbox.main.data.workspace :as udw] + [uxbox.main.geom :as geom] + [uxbox.main.store :as st] + [uxbox.util.data :refer [parse-int parse-float read-string]] + [uxbox.util.dom :as dom] + [uxbox.util.geom.point :as gpt] + [uxbox.util.i18n :refer [tr]] + [uxbox.util.math :refer [precision-or-0]])) -(mx/defc rect-measures-menu - {:mixins [mx/static]} - [menu {:keys [id] :as shape}] - (letfn [(on-size-change [event attr] - (let [value (-> (dom/event->value event) - (parse-int 0))] - (st/emit! (uds/update-dimensions id {attr value})))) - (on-rotation-change [event] - (let [value (-> (dom/event->value event) - (parse-int 0))] - (st/emit! (uds/update-rotation id value)))) - (on-pos-change [event attr] - (let [value (-> (dom/event->value event) - (parse-int nil)) - point (gpt/point {attr value})] - (st/emit! (uds/update-position id point)))) - (on-proportion-lock-change [event] - (if (:proportion-lock shape) - (st/emit! (uds/unlock-proportions id)) - (st/emit! (uds/lock-proportions id))))] - (let [size (geom/size shape)] - [:div.element-set - [:div.element-set-title (:name menu)] - [:div.element-set-content - ;; SLIDEBAR FOR ROTATION AND OPACITY - [:span "Size"] - [:div.row-flex - [:div.input-element.pixels - [:input.input-text - {:placeholder "Width" - :type "number" - :min "0" - :value (precision-or-0 (:width size) 2) - :on-change #(on-size-change % :width)}]] - [:div.lock-size - {:class (when (:proportion-lock shape) "selected") - :on-click on-proportion-lock-change} - (if (:proportion-lock shape) i/lock i/unlock)] - [:div.input-element.pixels - [:input.input-text - {:placeholder "Height" - :type "number" - :min "0" - :value (precision-or-0 (:height size) 2) - :on-change #(on-size-change % :height)}]]] +(declare on-size-change) +(declare on-rotation-change) +(declare on-position-change) +(declare on-proportion-lock-change) - [:span "Position"] - [:div.row-flex - [:div.input-element.pixels - [:input.input-text - {:placeholder "x" - :type "number" - :value (precision-or-0 (:x1 shape 0) 2) - :on-change #(on-pos-change % :x)}]] - [:div.input-element.pixels - [:input.input-text - {:placeholder "y" - :type "number" - :value (precision-or-0 (:y1 shape 0) 2) - :on-change #(on-pos-change % :y)}]]] +(mf/defc rect-measures-menu + [{:keys [menu shape] :as props}] + (let [size (geom/size shape)] + [:div.element-set + [:div.element-set-title (:name menu)] + [:div.element-set-content + ;; SLIDEBAR FOR ROTATION AND OPACITY + [:span "Size"] + [:div.row-flex + [:div.input-element.pixels + [:input.input-text {:placeholder "Width" + :type "number" + :min "0" + :value (precision-or-0 (:width size) 2) + :on-change #(on-size-change % shape :width)}]] - [:span "Rotation"] - [:div.row-flex - [:input.slidebar - {:type "range" - :min 0 - :max 360 - :value (:rotation shape 0) - :on-change on-rotation-change}]] + [:div.lock-size {:class (when (:proportion-lock shape) "selected") + :on-click #(on-proportion-lock-change % shape)} + (if (:proportion-lock shape) i/lock i/unlock)] - [:div.row-flex - [:div.input-element.degrees - [:input.input-text - {:placeholder "" - :type "number" - :min 0 - :max 360 - :value (precision-or-0 (:rotation shape "0") 2) - :on-change on-rotation-change - }]] - [:input.input-text - {:style {:visibility "hidden"}}] - ]]]))) + [:div.input-element.pixels + [:input.input-text {:placeholder "Height" + :type "number" + :min "0" + :value (precision-or-0 (:height size) 2) + :on-change #(on-size-change % shape :height)}]]] + + [:span "Position"] + [:div.row-flex + [:div.input-element.pixels + [:input.input-text {:placeholder "x" + :type "number" + :value (precision-or-0 (:x1 shape 0) 2) + :on-change #(on-position-change % shape :x)}]] + [:div.input-element.pixels + [:input.input-text {:placeholder "y" + :type "number" + :value (precision-or-0 (:y1 shape 0) 2) + :on-change #(on-position-change % shape :y)}]]] + + [:span "Rotation"] + [:div.row-flex + [:input.slidebar {:type "range" + :min 0 + :max 360 + :value (:rotation shape 0) + :on-change #(on-rotation-change % shape)}]] + + [:div.row-flex + [:div.input-element.degrees + [:input.input-text {:placeholder "" + :type "number" + :min 0 + :max 360 + :value (precision-or-0 (:rotation shape "0") 2) + :on-change #(on-rotation-change % shape)}]] + [:input.input-text {:style {:visibility "hidden"}}]]]])) + + +(defn- on-size-change + [event shape attr] + (let [value (-> (dom/event->value event) + (parse-int 0))] + (st/emit! (uds/update-dimensions (:id shape) {attr value})))) + +(defn- on-rotation-change + [event shape] + (let [value (-> (dom/event->value event) + (parse-int 0))] + (st/emit! (uds/update-rotation (:id shape) value)))) + +(defn- on-position-change + [event shape attr] + (let [value (-> (dom/event->value event) + (parse-int nil)) + point (gpt/point {attr value})] + (st/emit! (uds/update-position (:id shape) point)))) + +(defn- on-proportion-lock-change + [event shape] + (if (:proportion-lock shape) + (st/emit! (uds/unlock-proportions (:id shape))) + (st/emit! (uds/lock-proportions (:id shape))))) diff --git a/frontend/src/uxbox/main/ui/workspace/sidebar/options/stroke.cljs b/frontend/src/uxbox/main/ui/workspace/sidebar/options/stroke.cljs index 71c76ad10..6807f0329 100644 --- a/frontend/src/uxbox/main/ui/workspace/sidebar/options/stroke.cljs +++ b/frontend/src/uxbox/main/ui/workspace/sidebar/options/stroke.cljs @@ -2,61 +2,41 @@ ;; License, v. 2.0. If a copy of the MPL was not distributed with this ;; file, You can obtain one at http://mozilla.org/MPL/2.0/. ;; -;; Copyright (c) 2015-2017 Andrey Antukh ;; Copyright (c) 2015-2017 Juan de la Cruz +;; Copyright (c) 2015-2019 Andrey Antukh (ns uxbox.main.ui.workspace.sidebar.options.stroke - (:require [lentes.core :as l] - [uxbox.util.i18n :refer (tr)] - [uxbox.util.router :as r] - [potok.core :as ptk] - [uxbox.main.store :as st] - [uxbox.main.data.shapes :as uds] - [uxbox.main.data.lightbox :as udl] - [uxbox.builtins.icons :as i] - [rumext.core :as mx :include-macros true] - [uxbox.util.dom :as dom] - [uxbox.util.data :refer (parse-int parse-float read-string)] - [uxbox.util.math :refer (precision-or-0)] - [uxbox.util.spec :refer (color?)])) + (:require + [rumext.alpha :as mf] + [uxbox.builtins.icons :as i] + [uxbox.main.data.workspace :as udw] + [uxbox.main.store :as st] + [uxbox.main.ui.modal :as modal] + [uxbox.main.ui.workspace.colorpicker :refer [colorpicker-modal]] + [uxbox.util.data :refer [parse-int parse-float read-string]] + [uxbox.util.dom :as dom] + [uxbox.util.i18n :refer [tr]] + [uxbox.util.math :refer [precision-or-0]])) -(mx/defcs stroke-menu - {:mixins [mx/static (mx/local)]} - [{:keys [::mx/local]} menu {:keys [id] :as shape}] - (letfn [(on-width-change [event] - (let [value (-> (dom/event->value event) - (parse-float 1))] - (st/emit! (uds/update-attrs id {:stroke-width value})))) - (on-opacity-change [event] - (let [value (-> (dom/event->value event) - (parse-float 1) - (/ 10000))] - (st/emit! (uds/update-attrs id {:stroke-opacity value})))) - (on-stroke-style-change [event] - (let [value (-> (dom/event->value event) - (read-string))] - (st/emit! (uds/update-attrs id {:stroke-style value})))) - (on-stroke-color-change [event] - (let [value (dom/event->value event)] - (when (color? value) - (st/emit! (uds/update-attrs id {:stroke-color value}))))) - (on-border-change [event attr] - (let [value (-> (dom/event->value event) - (parse-int nil))] - (if (:border-lock @local) - (st/emit! (uds/update-attrs id {:rx value :ry value})) - (st/emit! (uds/update-attrs id {attr value}))))) - (on-border-proportion-lock [event] - (swap! local update :border-lock not)) - (show-color-picker [event] - (let [x (.-clientX event) - y (.-clientY event) - opts {:x x :y y - :shape (:id shape) - :attr :stroke-color - :transparent? true}] - (udl/open! :workspace/shape-colorpicker opts)))] - [:div.element-set {:key (str (:id menu))} +(declare on-width-change) +(declare on-opacity-change) +(declare on-stroke-style-change) +(declare on-stroke-color-change) +(declare on-border-change) +(declare show-color-picker) + +(mf/defc stroke-menu + [{:keys [menu shape] :as props}] + (let [local (mf/use-state {}) + on-border-lock #(swap! local update :border-lock not) + on-stroke-style-change #(on-stroke-style-change % shape) + on-width-change #(on-width-change % shape) + on-stroke-color-change #(on-stroke-color-change % shape) + on-border-change-rx #(on-border-change % shape local :rx) + on-border-change-ry #(on-border-change % shape local :ry) + on-opacity-change #(on-opacity-change % shape) + show-color-picker #(show-color-picker % shape)] + [:div.element-set [:div.element-set-title (:name menu)] [:div.element-set-content [:span "Style"] @@ -94,17 +74,17 @@ {:placeholder "rx" :type "number" :value (precision-or-0 (:rx shape 0) 2) - :on-change #(on-border-change % :rx)}]] + :on-change on-border-change-rx}]] [:div.lock-size {:class (when (:border-lock @local) "selected") - :on-click on-border-proportion-lock} + :on-click on-border-lock} i/lock] [:div.input-element.pixels [:input.input-text {:placeholder "ry" :type "number" :value (precision-or-0 (:ry shape 0) 2) - :on-change #(on-border-change % :ry)}]]] + :on-change on-border-change-ry}]]] [:span "Opacity"] [:div.row-flex @@ -112,6 +92,50 @@ {:type "range" :min "0" :max "10000" - :value (* 10000 (:stroke-opacity shape)) + :value (* 10000 (:stroke-opacity shape 1)) :step "1" :on-change on-opacity-change}]]]])) + +(defn- on-width-change + [event shape] + (let [value (-> (dom/event->value event) + (parse-float 1))] + (st/emit! (udw/update-shape-attrs (:id shape) {:stroke-width value})))) + +(defn- on-opacity-change + [event shape] + (let [value (-> (dom/event->value event) + (parse-float 1) + (/ 10000))] + (st/emit! (udw/update-shape-attrs (:id shape) {:stroke-opacity value})))) + +(defn- on-stroke-style-change + [event shape] + (let [value (-> (dom/event->value event) + (read-string))] + (st/emit! (udw/update-shape-attrs (:id shape) {:stroke-style value})))) + +(defn- on-stroke-color-change + [event shape] + (let [value (dom/event->value event)] + (st/emit! (udw/update-shape-attrs (:id shape) {:stroke-color value})))) + +(defn- on-border-change + [event shape local attr] + (let [value (-> (dom/event->value event) + (parse-int nil)) + id (:id shape)] + (if (:border-lock @local) + (st/emit! (udw/update-shape-attrs id {:rx value :ry value})) + (st/emit! (udw/update-shape-attrs id {attr value}))))) + +(defn- show-color-picker + [event shape] + (let [x (.-clientX event) + y (.-clientY event) + props {:x x :y y + :default "#ffffff" + :value (:stroke-color shape) + :on-change #(st/emit! (udw/update-shape-attrs (:id shape) {:stroke-color %})) + :transparent? true}] + (modal/show! colorpicker-modal props))) diff --git a/frontend/src/uxbox/main/ui/workspace/sidebar/sitemap.cljs b/frontend/src/uxbox/main/ui/workspace/sidebar/sitemap.cljs index c6a2395e1..1b8fcee7e 100644 --- a/frontend/src/uxbox/main/ui/workspace/sidebar/sitemap.cljs +++ b/frontend/src/uxbox/main/ui/workspace/sidebar/sitemap.cljs @@ -104,13 +104,33 @@ ;; TODO: refactor this to not use global refs +(defn- pages-selector + [project-id] + (let [get-order #(get-in % [:metadata :order])] + (fn [state] + ;; NOTE: this function will be executed on every state change + ;; when we are on workspace page, that is ok but we need to + ;; think in a better approach (maybe materialize the result + ;; after pages fetching...) + (->> (vals (:pages state)) + (filter #(= project-id (:project %))) + (sort-by get-order))))) + (mf/def sitemap-toolbox :mixins [mf/memo mf/reactive] + :init + (fn [own {:keys [page] :as props}] + (assoc own + ::project-ref (-> (l/in [:projects (:project page)]) + (l/derive st/state)) + ::pages-ref (-> (l/lens (pages-selector (:project page))) + (l/derive st/state)))) + :render - (fn [own current-page-id] - (let [project (mf/react refs/selected-project) - pages (mf/react refs/selected-project-pages) + (fn [own {:keys [page] :as props}] + (let [project (mf/react (::project-ref own)) + pages (mf/react (::pages-ref own)) create #(udl/open! :page-form {:page {:project (:id project)}}) close #(st/emit! (dw/toggle-flag :sitemap)) deletable? (> (count pages) 1)] @@ -124,9 +144,9 @@ [:span (:name project)] [:div.add-page {:on-click create} i/close]] [:ul.element-list - (for [page pages] - (let [selected? (= (:id page) current-page-id)] - [:& page-item {:page page + (for [item pages] + (let [selected? (= (:id item) (:id page))] + [:& page-item {:page item :deletable? deletable? :selected? selected? - :key (:id page)}]))]]]))) + :key (:id item)}]))]]]))) diff --git a/frontend/src/uxbox/main/ui/workspace/viewport.cljs b/frontend/src/uxbox/main/ui/workspace/viewport.cljs new file mode 100644 index 000000000..6fbc76174 --- /dev/null +++ b/frontend/src/uxbox/main/ui/workspace/viewport.cljs @@ -0,0 +1,224 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) 2015-2019 Andrey Antukh +;; Copyright (c) 2015-2019 Juan de la Cruz + +(ns uxbox.main.ui.workspace.viewport + (:require + [goog.events :as events] + [rumext.alpha :as mf] + [uxbox.main.constants :as c] + [uxbox.main.data.workspace :as udw] + [uxbox.main.data.workspace-drawing :as udwd] + [uxbox.main.geom :as geom] + [uxbox.main.refs :as refs] + [uxbox.main.store :as st] + [uxbox.main.ui.keyboard :as kbd] + [uxbox.main.ui.workspace.canvas :refer [canvas]] + [uxbox.main.ui.workspace.grid :refer [grid]] + [uxbox.main.ui.workspace.ruler :refer [ruler]] + [uxbox.main.user-events :as uev] + [uxbox.util.data :refer [parse-int]] + [uxbox.util.dom :as dom] + [uxbox.util.geom.point :as gpt]) + (:import goog.events.EventType)) + +;; --- Coordinates Widget + +(mf/def coordinates + :mixins [mf/reactive mf/memo] + :render + (fn [own {:keys [zoom] :as props}] + (let [coords (some-> (mf/react refs/canvas-mouse-position) + (gpt/divide zoom) + (gpt/round 0))] + [:ul.coordinates + [:span {:alt "x"} + (str "X: " (:x coords "-"))] + [:span {:alt "y"} + (str "Y: " (:y coords "-"))]]))) + +;; --- Cursor tooltip + +(defn- get-shape-tooltip + "Return the shape tooltip text" + [shape] + (case (:type shape) + :icon "Click to place the Icon" + :image "Click to place the Image" + :rect "Drag to draw a Box" + :text "Drag to draw a Text Box" + :path "Click to draw a Path" + :circle "Drag to draw a Circle" + nil)) + +(mf/defc cursor-tooltip + {:wrap [mf/wrap-memo]} + [{:keys [tooltip]}] + (let [coords (mf/deref refs/window-mouse-position)] + [:span.cursor-tooltip + {:style + {:position "fixed" + :left (str (+ (:x coords) 5) "px") + :top (str (- (:y coords) 25) "px")}} + tooltip])) + +;; --- Selection Rect + +(mf/defc selrect + {:wrap [mf/wrap-memo]} + [{rect :value}] + (when rect + (let [{:keys [x1 y1 width height]} (geom/size rect)] + [:rect.selection-rect + {:x x1 + :y y1 + :width width + :height height}]))) + +;; --- Viewport + +(mf/def viewport + :init + (fn [own props] + (assoc own ::viewport (mf/create-ref))) + + :did-mount + (fn [own] + (letfn [(translate-point-to-viewport [pt] + (let [viewport (mf/ref-node (::viewport own)) + brect (.getBoundingClientRect viewport) + brect (gpt/point (parse-int (.-left brect)) + (parse-int (.-top brect)))] + (gpt/subtract pt brect))) + + (translate-point-to-canvas [pt] + (let [viewport (mf/ref-node (::viewport own))] + (when-let [canvas (dom/get-element-by-class "page-canvas" viewport)] + (let [brect (.getBoundingClientRect canvas) + bbox (.getBBox canvas) + brect (gpt/point (parse-int (.-left brect)) + (parse-int (.-top brect))) + bbox (gpt/point (.-x bbox) (.-y bbox))] + (-> (gpt/add pt bbox) + (gpt/subtract brect)))))) + + (on-key-down [event] + (let [key (.-keyCode event) + ctrl? (kbd/ctrl? event) + shift? (kbd/shift? event) + opts {:key key + :shift? shift? + :ctrl? ctrl?}] + (st/emit! (uev/keyboard-event :down key ctrl? shift?)) + (when (kbd/space? event) + (st/emit! (udw/start-viewport-positioning))))) + + (on-key-up [event] + (let [key (.-keyCode event) + ctrl? (kbd/ctrl? event) + shift? (kbd/shift? event) + opts {:key key + :shift? shift? + :ctrl? ctrl?}] + (when (kbd/space? event) + (st/emit! (udw/stop-viewport-positioning))) + (st/emit! (uev/keyboard-event :up key ctrl? shift?)))) + + (on-mousemove [event] + (let [wpt (gpt/point (.-clientX event) + (.-clientY event)) + vpt (translate-point-to-viewport wpt) + cpt (translate-point-to-canvas wpt) + ctrl? (kbd/ctrl? event) + shift? (kbd/shift? event) + event {:ctrl ctrl? + :shift shift? + :window-coords wpt + :viewport-coords vpt + :canvas-coords cpt}] + (st/emit! (uev/pointer-event wpt vpt cpt ctrl? shift?))))] + + (let [key1 (events/listen js/document EventType.MOUSEMOVE on-mousemove) + key2 (events/listen js/document EventType.KEYDOWN on-key-down) + key3 (events/listen js/document EventType.KEYUP on-key-up)] + (assoc own + ::key1 key1 + ::key2 key2 + ::key3 key3)))) + + :will-unmount + (fn [own] + (events/unlistenByKey (::key1 own)) + (events/unlistenByKey (::key2 own)) + (events/unlistenByKey (::key3 own)) + (dissoc own ::key1 ::key2 ::key3)) + + :render + (fn [own {:keys [page wst] :as props}] + (let [{:keys [drawing-tool tooltip zoom flags]} wst + tooltip (or tooltip (get-shape-tooltip drawing-tool)) + zoom (or zoom 1)] + (letfn [(on-mouse-down [event] + (dom/stop-propagation event) + (let [ctrl? (kbd/ctrl? event) + shift? (kbd/shift? event) + opts {:shift? shift? + :ctrl? ctrl?}] + (st/emit! (uev/mouse-event :down ctrl? shift?))) + (if drawing-tool + (st/emit! (udwd/start-drawing drawing-tool)) + (st/emit! ::uev/interrupt (udw/start-selrect)))) + (on-context-menu [event] + (dom/prevent-default event) + (dom/stop-propagation event) + (let [ctrl? (kbd/ctrl? event) + shift? (kbd/shift? event) + opts {:shift? shift? + :ctrl? ctrl?}] + (st/emit! (uev/mouse-event :context-menu ctrl? shift?)))) + (on-mouse-up [event] + (dom/stop-propagation event) + (let [ctrl? (kbd/ctrl? event) + shift? (kbd/shift? event) + opts {:shift? shift? + :ctrl? ctrl?}] + (st/emit! (uev/mouse-event :up ctrl? shift?)))) + (on-click [event] + (dom/stop-propagation event) + (let [ctrl? (kbd/ctrl? event) + shift? (kbd/shift? event) + opts {:shift? shift? + :ctrl? ctrl?}] + (st/emit! (uev/mouse-event :click ctrl? shift?)))) + (on-double-click [event] + (dom/stop-propagation event) + (let [ctrl? (kbd/ctrl? event) + shift? (kbd/shift? event) + opts {:shift? shift? + :ctrl? ctrl?}] + (st/emit! (uev/mouse-event :double-click ctrl? shift?))))] + [:* + [:& coordinates {:zoom zoom}] + [:div.tooltip-container + (when tooltip + [:& cursor-tooltip {:tooltip tooltip}])] + [:svg.viewport {:width (* c/viewport-width zoom) + :height (* c/viewport-height zoom) + :ref (::viewport own) + :class (when drawing-tool "drawing") + :on-context-menu on-context-menu + :on-click on-click + :on-double-click on-double-click + :on-mouse-down on-mouse-down + :on-mouse-up on-mouse-up} + [:g.zoom {:transform (str "scale(" zoom ", " zoom ")")} + (when page + [:& canvas {:page page :wst wst}]) + (if (contains? flags :grid) + [:& grid {:page page}])] + (when (contains? flags :ruler) + [:& ruler {:zoom zoom :ruler (:ruler wst)}]) + [:& selrect {:value (:selrect wst)}]]])))) diff --git a/frontend/src/uxbox/util/router.cljs b/frontend/src/uxbox/util/router.cljs index 6f74e02b8..19b523179 100644 --- a/frontend/src/uxbox/util/router.cljs +++ b/frontend/src/uxbox/util/router.cljs @@ -91,7 +91,7 @@ ptk/EffectEvent (effect [_ state stream] (let [router (:router state)] - (prn "Navigate:" id params qparams "| Match:" (resolve-url router id params qparams)) + ;; (prn "Navigate:" id params qparams "| Match:" (resolve-url router id params qparams)) (navigate! router id params qparams)))) (defn nav diff --git a/frontend/src/uxbox/view/ui.cljs b/frontend/src/uxbox/view/ui.cljs index 9973976a7..580719f39 100644 --- a/frontend/src/uxbox/view/ui.cljs +++ b/frontend/src/uxbox/view/ui.cljs @@ -56,9 +56,9 @@ (l/derive st/state))) (mf/defc app - {:wrap [mf/reactive*]} + {:wrap [mf/wrap-reactive]} [] - (let [route (mf/deref route-ref)] + (let [route (mf/react route-ref)] (case (get-in route [:data :name]) :view/notfound (notfound-page) :view/viewer (let [{:keys [token id]} (get-in route [:params :path])] diff --git a/frontend/src/uxbox/view/ui/viewer.cljs b/frontend/src/uxbox/view/ui/viewer.cljs index cb6f01bef..518f5933d 100644 --- a/frontend/src/uxbox/view/ui/viewer.cljs +++ b/frontend/src/uxbox/view/ui/viewer.cljs @@ -34,9 +34,9 @@ ;; --- Component (mf/defc viewer-page - {:wrap [mf/reactive*]} + {:wrap [mf/wrap-reactive]} [{:keys [token id]}] - (let [{:keys [project pages flags]} (mf/deref state-ref)] + (let [{:keys [project pages flags]} (mf/react state-ref)] (mf/use-effect {:init #(st/emit! (dv/initialize token))}) (when (seq pages) diff --git a/frontend/src/uxbox/view/ui/viewer/canvas.cljs b/frontend/src/uxbox/view/ui/viewer/canvas.cljs index 54edb3acd..80f3a93ca 100644 --- a/frontend/src/uxbox/view/ui/viewer/canvas.cljs +++ b/frontend/src/uxbox/view/ui/viewer/canvas.cljs @@ -13,7 +13,7 @@ ;; --- Background (Component) (mf/defc background - {:wrap [mf/memo*]} + {:wrap [mf/wrap-memo]} [{:keys [background] :as metadata}] [:rect {:x 0 :y 0 @@ -26,7 +26,7 @@ (declare shape) (mf/defc canvas - {:wrap [mf/memo*]} + {:wrap [mf/wrap-memo]} [{:keys [page] :as props}] (let [{:keys [metadata id]} page {:keys [width height]} metadata] diff --git a/frontend/vendor/.babelrc b/frontend/vendor/.babelrc new file mode 100644 index 000000000..d1a72ecad --- /dev/null +++ b/frontend/vendor/.babelrc @@ -0,0 +1,8 @@ +{ + "presets": [ + ["@babel/preset-env", {"targets": {"browsers": "last 1 Chrome versions"}, "modules": false}], + ["@babel/preset-react"] + ], + "plugins": ["@babel/plugin-proposal-export-default-from", + "@babel/plugin-proposal-class-properties"] +} diff --git a/frontend/vendor/datefns/LICENSE.md b/frontend/vendor/datefns/LICENSE.md deleted file mode 100644 index e90925b32..000000000 --- a/frontend/vendor/datefns/LICENSE.md +++ /dev/null @@ -1,4 +0,0 @@ -# License - -date-fns is licensed under the [MIT license](http://kossnocorp.mit-license.org). -Read more about MIT at [TLDRLegal](https://tldrlegal.com/license/mit-license). diff --git a/frontend/vendor/datefns/VERSION b/frontend/vendor/datefns/VERSION deleted file mode 100644 index 7f3c3affd..000000000 --- a/frontend/vendor/datefns/VERSION +++ /dev/null @@ -1 +0,0 @@ -1.30.1 diff --git a/frontend/vendor/datefns/datefns.bundle.js b/frontend/vendor/datefns/datefns.bundle.js new file mode 100644 index 000000000..66013ae01 --- /dev/null +++ b/frontend/vendor/datefns/datefns.bundle.js @@ -0,0 +1,1702 @@ +(function(){'use strict';var global$1 = (typeof global !== "undefined" ? global : + typeof self !== "undefined" ? self : + typeof window !== "undefined" ? window : {});var MILLISECONDS_IN_MINUTE = 60000; + +/** + * Google Chrome as of 67.0.3396.87 introduced timezones with offset that includes seconds. + * They usually appear for dates that denote time before the timezones were introduced + * (e.g. for 'Europe/Prague' timezone the offset is GMT+00:57:44 before 1 October 1891 + * and GMT+01:00:00 after that date) + * + * Date#getTimezoneOffset returns the offset in minutes and would return 57 for the example above, + * which would lead to incorrect calculations. + * + * This function returns the timezone offset in milliseconds that takes seconds in account. + */ +var getTimezoneOffsetInMilliseconds = function getTimezoneOffsetInMilliseconds (dirtyDate) { + var date = new Date(dirtyDate.getTime()); + var baseTimezoneOffset = date.getTimezoneOffset(); + date.setSeconds(0, 0); + var millisecondsPartOfTimezoneOffset = date.getTime() % MILLISECONDS_IN_MINUTE; + + return baseTimezoneOffset * MILLISECONDS_IN_MINUTE + millisecondsPartOfTimezoneOffset +};/** + * @category Common Helpers + * @summary Is the given argument an instance of Date? + * + * @description + * Is the given argument an instance of Date? + * + * @param {*} argument - the argument to check + * @returns {Boolean} the given argument is an instance of Date + * + * @example + * // Is 'mayonnaise' a Date? + * var result = isDate('mayonnaise') + * //=> false + */ +function isDate (argument) { + return argument instanceof Date +} + +var is_date = isDate;var MILLISECONDS_IN_HOUR = 3600000; +var MILLISECONDS_IN_MINUTE$1 = 60000; +var DEFAULT_ADDITIONAL_DIGITS = 2; + +var parseTokenDateTimeDelimeter = /[T ]/; +var parseTokenPlainTime = /:/; + +// year tokens +var parseTokenYY = /^(\d{2})$/; +var parseTokensYYY = [ + /^([+-]\d{2})$/, // 0 additional digits + /^([+-]\d{3})$/, // 1 additional digit + /^([+-]\d{4})$/ // 2 additional digits +]; + +var parseTokenYYYY = /^(\d{4})/; +var parseTokensYYYYY = [ + /^([+-]\d{4})/, // 0 additional digits + /^([+-]\d{5})/, // 1 additional digit + /^([+-]\d{6})/ // 2 additional digits +]; + +// date tokens +var parseTokenMM = /^-(\d{2})$/; +var parseTokenDDD = /^-?(\d{3})$/; +var parseTokenMMDD = /^-?(\d{2})-?(\d{2})$/; +var parseTokenWww = /^-?W(\d{2})$/; +var parseTokenWwwD = /^-?W(\d{2})-?(\d{1})$/; + +// time tokens +var parseTokenHH = /^(\d{2}([.,]\d*)?)$/; +var parseTokenHHMM = /^(\d{2}):?(\d{2}([.,]\d*)?)$/; +var parseTokenHHMMSS = /^(\d{2}):?(\d{2}):?(\d{2}([.,]\d*)?)$/; + +// timezone tokens +var parseTokenTimezone = /([Z+-].*)$/; +var parseTokenTimezoneZ = /^(Z)$/; +var parseTokenTimezoneHH = /^([+-])(\d{2})$/; +var parseTokenTimezoneHHMM = /^([+-])(\d{2}):?(\d{2})$/; + +/** + * @category Common Helpers + * @summary Convert the given argument to an instance of Date. + * + * @description + * Convert the given argument to an instance of Date. + * + * If the argument is an instance of Date, the function returns its clone. + * + * If the argument is a number, it is treated as a timestamp. + * + * If an argument is a string, the function tries to parse it. + * Function accepts complete ISO 8601 formats as well as partial implementations. + * ISO 8601: http://en.wikipedia.org/wiki/ISO_8601 + * + * If all above fails, the function passes the given argument to Date constructor. + * + * @param {Date|String|Number} argument - the value to convert + * @param {Object} [options] - the object with options + * @param {0 | 1 | 2} [options.additionalDigits=2] - the additional number of digits in the extended year format + * @returns {Date} the parsed date in the local time zone + * + * @example + * // Convert string '2014-02-11T11:30:30' to date: + * var result = parse('2014-02-11T11:30:30') + * //=> Tue Feb 11 2014 11:30:30 + * + * @example + * // Parse string '+02014101', + * // if the additional number of digits in the extended year format is 1: + * var result = parse('+02014101', {additionalDigits: 1}) + * //=> Fri Apr 11 2014 00:00:00 + */ +function parse (argument, dirtyOptions) { + if (is_date(argument)) { + // Prevent the date to lose the milliseconds when passed to new Date() in IE10 + return new Date(argument.getTime()) + } else if (typeof argument !== 'string') { + return new Date(argument) + } + + var options = dirtyOptions || {}; + var additionalDigits = options.additionalDigits; + if (additionalDigits == null) { + additionalDigits = DEFAULT_ADDITIONAL_DIGITS; + } else { + additionalDigits = Number(additionalDigits); + } + + var dateStrings = splitDateString(argument); + + var parseYearResult = parseYear(dateStrings.date, additionalDigits); + var year = parseYearResult.year; + var restDateString = parseYearResult.restDateString; + + var date = parseDate(restDateString, year); + + if (date) { + var timestamp = date.getTime(); + var time = 0; + var offset; + + if (dateStrings.time) { + time = parseTime(dateStrings.time); + } + + if (dateStrings.timezone) { + offset = parseTimezone(dateStrings.timezone) * MILLISECONDS_IN_MINUTE$1; + } else { + var fullTime = timestamp + time; + var fullTimeDate = new Date(fullTime); + + offset = getTimezoneOffsetInMilliseconds(fullTimeDate); + + // Adjust time when it's coming from DST + var fullTimeDateNextDay = new Date(fullTime); + fullTimeDateNextDay.setDate(fullTimeDate.getDate() + 1); + var offsetDiff = + getTimezoneOffsetInMilliseconds(fullTimeDateNextDay) - + getTimezoneOffsetInMilliseconds(fullTimeDate); + if (offsetDiff > 0) { + offset += offsetDiff; + } + } + + return new Date(timestamp + time + offset) + } else { + return new Date(argument) + } +} + +function splitDateString (dateString) { + var dateStrings = {}; + var array = dateString.split(parseTokenDateTimeDelimeter); + var timeString; + + if (parseTokenPlainTime.test(array[0])) { + dateStrings.date = null; + timeString = array[0]; + } else { + dateStrings.date = array[0]; + timeString = array[1]; + } + + if (timeString) { + var token = parseTokenTimezone.exec(timeString); + if (token) { + dateStrings.time = timeString.replace(token[1], ''); + dateStrings.timezone = token[1]; + } else { + dateStrings.time = timeString; + } + } + + return dateStrings +} + +function parseYear (dateString, additionalDigits) { + var parseTokenYYY = parseTokensYYY[additionalDigits]; + var parseTokenYYYYY = parseTokensYYYYY[additionalDigits]; + + var token; + + // YYYY or ±YYYYY + token = parseTokenYYYY.exec(dateString) || parseTokenYYYYY.exec(dateString); + if (token) { + var yearString = token[1]; + return { + year: parseInt(yearString, 10), + restDateString: dateString.slice(yearString.length) + } + } + + // YY or ±YYY + token = parseTokenYY.exec(dateString) || parseTokenYYY.exec(dateString); + if (token) { + var centuryString = token[1]; + return { + year: parseInt(centuryString, 10) * 100, + restDateString: dateString.slice(centuryString.length) + } + } + + // Invalid ISO-formatted year + return { + year: null + } +} + +function parseDate (dateString, year) { + // Invalid ISO-formatted year + if (year === null) { + return null + } + + var token; + var date; + var month; + var week; + + // YYYY + if (dateString.length === 0) { + date = new Date(0); + date.setUTCFullYear(year); + return date + } + + // YYYY-MM + token = parseTokenMM.exec(dateString); + if (token) { + date = new Date(0); + month = parseInt(token[1], 10) - 1; + date.setUTCFullYear(year, month); + return date + } + + // YYYY-DDD or YYYYDDD + token = parseTokenDDD.exec(dateString); + if (token) { + date = new Date(0); + var dayOfYear = parseInt(token[1], 10); + date.setUTCFullYear(year, 0, dayOfYear); + return date + } + + // YYYY-MM-DD or YYYYMMDD + token = parseTokenMMDD.exec(dateString); + if (token) { + date = new Date(0); + month = parseInt(token[1], 10) - 1; + var day = parseInt(token[2], 10); + date.setUTCFullYear(year, month, day); + return date + } + + // YYYY-Www or YYYYWww + token = parseTokenWww.exec(dateString); + if (token) { + week = parseInt(token[1], 10) - 1; + return dayOfISOYear(year, week) + } + + // YYYY-Www-D or YYYYWwwD + token = parseTokenWwwD.exec(dateString); + if (token) { + week = parseInt(token[1], 10) - 1; + var dayOfWeek = parseInt(token[2], 10) - 1; + return dayOfISOYear(year, week, dayOfWeek) + } + + // Invalid ISO-formatted date + return null +} + +function parseTime (timeString) { + var token; + var hours; + var minutes; + + // hh + token = parseTokenHH.exec(timeString); + if (token) { + hours = parseFloat(token[1].replace(',', '.')); + return (hours % 24) * MILLISECONDS_IN_HOUR + } + + // hh:mm or hhmm + token = parseTokenHHMM.exec(timeString); + if (token) { + hours = parseInt(token[1], 10); + minutes = parseFloat(token[2].replace(',', '.')); + return (hours % 24) * MILLISECONDS_IN_HOUR + + minutes * MILLISECONDS_IN_MINUTE$1 + } + + // hh:mm:ss or hhmmss + token = parseTokenHHMMSS.exec(timeString); + if (token) { + hours = parseInt(token[1], 10); + minutes = parseInt(token[2], 10); + var seconds = parseFloat(token[3].replace(',', '.')); + return (hours % 24) * MILLISECONDS_IN_HOUR + + minutes * MILLISECONDS_IN_MINUTE$1 + + seconds * 1000 + } + + // Invalid ISO-formatted time + return null +} + +function parseTimezone (timezoneString) { + var token; + var absoluteOffset; + + // Z + token = parseTokenTimezoneZ.exec(timezoneString); + if (token) { + return 0 + } + + // ±hh + token = parseTokenTimezoneHH.exec(timezoneString); + if (token) { + absoluteOffset = parseInt(token[2], 10) * 60; + return (token[1] === '+') ? -absoluteOffset : absoluteOffset + } + + // ±hh:mm or ±hhmm + token = parseTokenTimezoneHHMM.exec(timezoneString); + if (token) { + absoluteOffset = parseInt(token[2], 10) * 60 + parseInt(token[3], 10); + return (token[1] === '+') ? -absoluteOffset : absoluteOffset + } + + return 0 +} + +function dayOfISOYear (isoYear, week, day) { + week = week || 0; + day = day || 0; + var date = new Date(0); + date.setUTCFullYear(isoYear, 0, 4); + var fourthOfJanuaryDay = date.getUTCDay() || 7; + var diff = week * 7 + day + 1 - fourthOfJanuaryDay; + date.setUTCDate(date.getUTCDate() + diff); + return date +} + +var parse_1 = parse;/** + * @category Year Helpers + * @summary Return the start of a year for the given date. + * + * @description + * Return the start of a year for the given date. + * The result will be in the local timezone. + * + * @param {Date|String|Number} date - the original date + * @returns {Date} the start of a year + * + * @example + * // The start of a year for 2 September 2014 11:55:00: + * var result = startOfYear(new Date(2014, 8, 2, 11, 55, 00)) + * //=> Wed Jan 01 2014 00:00:00 + */ +function startOfYear (dirtyDate) { + var cleanDate = parse_1(dirtyDate); + var date = new Date(0); + date.setFullYear(cleanDate.getFullYear(), 0, 1); + date.setHours(0, 0, 0, 0); + return date +} + +var start_of_year = startOfYear;/** + * @category Day Helpers + * @summary Return the start of a day for the given date. + * + * @description + * Return the start of a day for the given date. + * The result will be in the local timezone. + * + * @param {Date|String|Number} date - the original date + * @returns {Date} the start of a day + * + * @example + * // The start of a day for 2 September 2014 11:55:00: + * var result = startOfDay(new Date(2014, 8, 2, 11, 55, 0)) + * //=> Tue Sep 02 2014 00:00:00 + */ +function startOfDay (dirtyDate) { + var date = parse_1(dirtyDate); + date.setHours(0, 0, 0, 0); + return date +} + +var start_of_day = startOfDay;var MILLISECONDS_IN_MINUTE$2 = 60000; +var MILLISECONDS_IN_DAY = 86400000; + +/** + * @category Day Helpers + * @summary Get the number of calendar days between the given dates. + * + * @description + * Get the number of calendar days between the given dates. + * + * @param {Date|String|Number} dateLeft - the later date + * @param {Date|String|Number} dateRight - the earlier date + * @returns {Number} the number of calendar days + * + * @example + * // How many calendar days are between + * // 2 July 2011 23:00:00 and 2 July 2012 00:00:00? + * var result = differenceInCalendarDays( + * new Date(2012, 6, 2, 0, 0), + * new Date(2011, 6, 2, 23, 0) + * ) + * //=> 366 + */ +function differenceInCalendarDays (dirtyDateLeft, dirtyDateRight) { + var startOfDayLeft = start_of_day(dirtyDateLeft); + var startOfDayRight = start_of_day(dirtyDateRight); + + var timestampLeft = startOfDayLeft.getTime() - + startOfDayLeft.getTimezoneOffset() * MILLISECONDS_IN_MINUTE$2; + var timestampRight = startOfDayRight.getTime() - + startOfDayRight.getTimezoneOffset() * MILLISECONDS_IN_MINUTE$2; + + // Round the number of days to the nearest integer + // because the number of milliseconds in a day is not constant + // (e.g. it's different in the day of the daylight saving time clock shift) + return Math.round((timestampLeft - timestampRight) / MILLISECONDS_IN_DAY) +} + +var difference_in_calendar_days = differenceInCalendarDays;/** + * @category Day Helpers + * @summary Get the day of the year of the given date. + * + * @description + * Get the day of the year of the given date. + * + * @param {Date|String|Number} date - the given date + * @returns {Number} the day of year + * + * @example + * // Which day of the year is 2 July 2014? + * var result = getDayOfYear(new Date(2014, 6, 2)) + * //=> 183 + */ +function getDayOfYear (dirtyDate) { + var date = parse_1(dirtyDate); + var diff = difference_in_calendar_days(date, start_of_year(date)); + var dayOfYear = diff + 1; + return dayOfYear +} + +var get_day_of_year = getDayOfYear;/** + * @category Week Helpers + * @summary Return the start of a week for the given date. + * + * @description + * Return the start of a week for the given date. + * The result will be in the local timezone. + * + * @param {Date|String|Number} date - the original date + * @param {Object} [options] - the object with options + * @param {Number} [options.weekStartsOn=0] - the index of the first day of the week (0 - Sunday) + * @returns {Date} the start of a week + * + * @example + * // The start of a week for 2 September 2014 11:55:00: + * var result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0)) + * //=> Sun Aug 31 2014 00:00:00 + * + * @example + * // If the week starts on Monday, the start of the week for 2 September 2014 11:55:00: + * var result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0), {weekStartsOn: 1}) + * //=> Mon Sep 01 2014 00:00:00 + */ +function startOfWeek (dirtyDate, dirtyOptions) { + var weekStartsOn = dirtyOptions ? (Number(dirtyOptions.weekStartsOn) || 0) : 0; + + var date = parse_1(dirtyDate); + var day = date.getDay(); + var diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn; + + date.setDate(date.getDate() - diff); + date.setHours(0, 0, 0, 0); + return date +} + +var start_of_week = startOfWeek;/** + * @category ISO Week Helpers + * @summary Return the start of an ISO week for the given date. + * + * @description + * Return the start of an ISO week for the given date. + * The result will be in the local timezone. + * + * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date + * + * @param {Date|String|Number} date - the original date + * @returns {Date} the start of an ISO week + * + * @example + * // The start of an ISO week for 2 September 2014 11:55:00: + * var result = startOfISOWeek(new Date(2014, 8, 2, 11, 55, 0)) + * //=> Mon Sep 01 2014 00:00:00 + */ +function startOfISOWeek (dirtyDate) { + return start_of_week(dirtyDate, {weekStartsOn: 1}) +} + +var start_of_iso_week = startOfISOWeek;/** + * @category ISO Week-Numbering Year Helpers + * @summary Get the ISO week-numbering year of the given date. + * + * @description + * Get the ISO week-numbering year of the given date, + * which always starts 3 days before the year's first Thursday. + * + * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date + * + * @param {Date|String|Number} date - the given date + * @returns {Number} the ISO week-numbering year + * + * @example + * // Which ISO-week numbering year is 2 January 2005? + * var result = getISOYear(new Date(2005, 0, 2)) + * //=> 2004 + */ +function getISOYear (dirtyDate) { + var date = parse_1(dirtyDate); + var year = date.getFullYear(); + + var fourthOfJanuaryOfNextYear = new Date(0); + fourthOfJanuaryOfNextYear.setFullYear(year + 1, 0, 4); + fourthOfJanuaryOfNextYear.setHours(0, 0, 0, 0); + var startOfNextYear = start_of_iso_week(fourthOfJanuaryOfNextYear); + + var fourthOfJanuaryOfThisYear = new Date(0); + fourthOfJanuaryOfThisYear.setFullYear(year, 0, 4); + fourthOfJanuaryOfThisYear.setHours(0, 0, 0, 0); + var startOfThisYear = start_of_iso_week(fourthOfJanuaryOfThisYear); + + if (date.getTime() >= startOfNextYear.getTime()) { + return year + 1 + } else if (date.getTime() >= startOfThisYear.getTime()) { + return year + } else { + return year - 1 + } +} + +var get_iso_year = getISOYear;/** + * @category ISO Week-Numbering Year Helpers + * @summary Return the start of an ISO week-numbering year for the given date. + * + * @description + * Return the start of an ISO week-numbering year, + * which always starts 3 days before the year's first Thursday. + * The result will be in the local timezone. + * + * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date + * + * @param {Date|String|Number} date - the original date + * @returns {Date} the start of an ISO year + * + * @example + * // The start of an ISO week-numbering year for 2 July 2005: + * var result = startOfISOYear(new Date(2005, 6, 2)) + * //=> Mon Jan 03 2005 00:00:00 + */ +function startOfISOYear (dirtyDate) { + var year = get_iso_year(dirtyDate); + var fourthOfJanuary = new Date(0); + fourthOfJanuary.setFullYear(year, 0, 4); + fourthOfJanuary.setHours(0, 0, 0, 0); + var date = start_of_iso_week(fourthOfJanuary); + return date +} + +var start_of_iso_year = startOfISOYear;var MILLISECONDS_IN_WEEK = 604800000; + +/** + * @category ISO Week Helpers + * @summary Get the ISO week of the given date. + * + * @description + * Get the ISO week of the given date. + * + * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date + * + * @param {Date|String|Number} date - the given date + * @returns {Number} the ISO week + * + * @example + * // Which week of the ISO-week numbering year is 2 January 2005? + * var result = getISOWeek(new Date(2005, 0, 2)) + * //=> 53 + */ +function getISOWeek (dirtyDate) { + var date = parse_1(dirtyDate); + var diff = start_of_iso_week(date).getTime() - start_of_iso_year(date).getTime(); + + // Round the number of days to the nearest integer + // because the number of milliseconds in a week is not constant + // (e.g. it's different in the week of the daylight saving time clock shift) + return Math.round(diff / MILLISECONDS_IN_WEEK) + 1 +} + +var get_iso_week = getISOWeek;/** + * @category Common Helpers + * @summary Is the given date valid? + * + * @description + * Returns false if argument is Invalid Date and true otherwise. + * Invalid Date is a Date, whose time value is NaN. + * + * Time value of Date: http://es5.github.io/#x15.9.1.1 + * + * @param {Date} date - the date to check + * @returns {Boolean} the date is valid + * @throws {TypeError} argument must be an instance of Date + * + * @example + * // For the valid date: + * var result = isValid(new Date(2014, 1, 31)) + * //=> true + * + * @example + * // For the invalid date: + * var result = isValid(new Date('')) + * //=> false + */ +function isValid (dirtyDate) { + if (is_date(dirtyDate)) { + return !isNaN(dirtyDate) + } else { + throw new TypeError(toString.call(dirtyDate) + ' is not an instance of Date') + } +} + +var is_valid = isValid;function buildDistanceInWordsLocale () { + var distanceInWordsLocale = { + lessThanXSeconds: { + one: 'less than a second', + other: 'less than {{count}} seconds' + }, + + xSeconds: { + one: '1 second', + other: '{{count}} seconds' + }, + + halfAMinute: 'half a minute', + + lessThanXMinutes: { + one: 'less than a minute', + other: 'less than {{count}} minutes' + }, + + xMinutes: { + one: '1 minute', + other: '{{count}} minutes' + }, + + aboutXHours: { + one: 'about 1 hour', + other: 'about {{count}} hours' + }, + + xHours: { + one: '1 hour', + other: '{{count}} hours' + }, + + xDays: { + one: '1 day', + other: '{{count}} days' + }, + + aboutXMonths: { + one: 'about 1 month', + other: 'about {{count}} months' + }, + + xMonths: { + one: '1 month', + other: '{{count}} months' + }, + + aboutXYears: { + one: 'about 1 year', + other: 'about {{count}} years' + }, + + xYears: { + one: '1 year', + other: '{{count}} years' + }, + + overXYears: { + one: 'over 1 year', + other: 'over {{count}} years' + }, + + almostXYears: { + one: 'almost 1 year', + other: 'almost {{count}} years' + } + }; + + function localize (token, count, options) { + options = options || {}; + + var result; + if (typeof distanceInWordsLocale[token] === 'string') { + result = distanceInWordsLocale[token]; + } else if (count === 1) { + result = distanceInWordsLocale[token].one; + } else { + result = distanceInWordsLocale[token].other.replace('{{count}}', count); + } + + if (options.addSuffix) { + if (options.comparison > 0) { + return 'in ' + result + } else { + return result + ' ago' + } + } + + return result + } + + return { + localize: localize + } +} + +var build_distance_in_words_locale = buildDistanceInWordsLocale;var commonFormatterKeys = [ + 'M', 'MM', 'Q', 'D', 'DD', 'DDD', 'DDDD', 'd', + 'E', 'W', 'WW', 'YY', 'YYYY', 'GG', 'GGGG', + 'H', 'HH', 'h', 'hh', 'm', 'mm', + 's', 'ss', 'S', 'SS', 'SSS', + 'Z', 'ZZ', 'X', 'x' +]; + +function buildFormattingTokensRegExp (formatters) { + var formatterKeys = []; + for (var key in formatters) { + if (formatters.hasOwnProperty(key)) { + formatterKeys.push(key); + } + } + + var formattingTokens = commonFormatterKeys + .concat(formatterKeys) + .sort() + .reverse(); + var formattingTokensRegExp = new RegExp( + '(\\[[^\\[]*\\])|(\\\\)?' + '(' + formattingTokens.join('|') + '|.)', 'g' + ); + + return formattingTokensRegExp +} + +var build_formatting_tokens_reg_exp = buildFormattingTokensRegExp;function buildFormatLocale () { + // Note: in English, the names of days of the week and months are capitalized. + // If you are making a new locale based on this one, check if the same is true for the language you're working on. + // Generally, formatted dates should look like they are in the middle of a sentence, + // e.g. in Spanish language the weekdays and months should be in the lowercase. + var months3char = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; + var monthsFull = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; + var weekdays2char = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']; + var weekdays3char = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']; + var weekdaysFull = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']; + var meridiemUppercase = ['AM', 'PM']; + var meridiemLowercase = ['am', 'pm']; + var meridiemFull = ['a.m.', 'p.m.']; + + var formatters = { + // Month: Jan, Feb, ..., Dec + 'MMM': function (date) { + return months3char[date.getMonth()] + }, + + // Month: January, February, ..., December + 'MMMM': function (date) { + return monthsFull[date.getMonth()] + }, + + // Day of week: Su, Mo, ..., Sa + 'dd': function (date) { + return weekdays2char[date.getDay()] + }, + + // Day of week: Sun, Mon, ..., Sat + 'ddd': function (date) { + return weekdays3char[date.getDay()] + }, + + // Day of week: Sunday, Monday, ..., Saturday + 'dddd': function (date) { + return weekdaysFull[date.getDay()] + }, + + // AM, PM + 'A': function (date) { + return (date.getHours() / 12) >= 1 ? meridiemUppercase[1] : meridiemUppercase[0] + }, + + // am, pm + 'a': function (date) { + return (date.getHours() / 12) >= 1 ? meridiemLowercase[1] : meridiemLowercase[0] + }, + + // a.m., p.m. + 'aa': function (date) { + return (date.getHours() / 12) >= 1 ? meridiemFull[1] : meridiemFull[0] + } + }; + + // Generate ordinal version of formatters: M -> Mo, D -> Do, etc. + var ordinalFormatters = ['M', 'D', 'DDD', 'd', 'Q', 'W']; + ordinalFormatters.forEach(function (formatterToken) { + formatters[formatterToken + 'o'] = function (date, formatters) { + return ordinal(formatters[formatterToken](date)) + }; + }); + + return { + formatters: formatters, + formattingTokensRegExp: build_formatting_tokens_reg_exp(formatters) + } +} + +function ordinal (number) { + var rem100 = number % 100; + if (rem100 > 20 || rem100 < 10) { + switch (rem100 % 10) { + case 1: + return number + 'st' + case 2: + return number + 'nd' + case 3: + return number + 'rd' + } + } + return number + 'th' +} + +var build_format_locale = buildFormatLocale;/** + * @category Locales + * @summary English locale. + */ +var en = { + distanceInWords: build_distance_in_words_locale(), + format: build_format_locale() +};/** + * @category Common Helpers + * @summary Format the date. + * + * @description + * Return the formatted date string in the given format. + * + * Accepted tokens: + * | Unit | Token | Result examples | + * |-------------------------|-------|----------------------------------| + * | Month | M | 1, 2, ..., 12 | + * | | Mo | 1st, 2nd, ..., 12th | + * | | MM | 01, 02, ..., 12 | + * | | MMM | Jan, Feb, ..., Dec | + * | | MMMM | January, February, ..., December | + * | Quarter | Q | 1, 2, 3, 4 | + * | | Qo | 1st, 2nd, 3rd, 4th | + * | Day of month | D | 1, 2, ..., 31 | + * | | Do | 1st, 2nd, ..., 31st | + * | | DD | 01, 02, ..., 31 | + * | Day of year | DDD | 1, 2, ..., 366 | + * | | DDDo | 1st, 2nd, ..., 366th | + * | | DDDD | 001, 002, ..., 366 | + * | Day of week | d | 0, 1, ..., 6 | + * | | do | 0th, 1st, ..., 6th | + * | | dd | Su, Mo, ..., Sa | + * | | ddd | Sun, Mon, ..., Sat | + * | | dddd | Sunday, Monday, ..., Saturday | + * | Day of ISO week | E | 1, 2, ..., 7 | + * | ISO week | W | 1, 2, ..., 53 | + * | | Wo | 1st, 2nd, ..., 53rd | + * | | WW | 01, 02, ..., 53 | + * | Year | YY | 00, 01, ..., 99 | + * | | YYYY | 1900, 1901, ..., 2099 | + * | ISO week-numbering year | GG | 00, 01, ..., 99 | + * | | GGGG | 1900, 1901, ..., 2099 | + * | AM/PM | A | AM, PM | + * | | a | am, pm | + * | | aa | a.m., p.m. | + * | Hour | H | 0, 1, ... 23 | + * | | HH | 00, 01, ... 23 | + * | | h | 1, 2, ..., 12 | + * | | hh | 01, 02, ..., 12 | + * | Minute | m | 0, 1, ..., 59 | + * | | mm | 00, 01, ..., 59 | + * | Second | s | 0, 1, ..., 59 | + * | | ss | 00, 01, ..., 59 | + * | 1/10 of second | S | 0, 1, ..., 9 | + * | 1/100 of second | SS | 00, 01, ..., 99 | + * | Millisecond | SSS | 000, 001, ..., 999 | + * | Timezone | Z | -01:00, +00:00, ... +12:00 | + * | | ZZ | -0100, +0000, ..., +1200 | + * | Seconds timestamp | X | 512969520 | + * | Milliseconds timestamp | x | 512969520900 | + * + * The characters wrapped in square brackets are escaped. + * + * The result may vary by locale. + * + * @param {Date|String|Number} date - the original date + * @param {String} [format='YYYY-MM-DDTHH:mm:ss.SSSZ'] - the string of tokens + * @param {Object} [options] - the object with options + * @param {Object} [options.locale=enLocale] - the locale object + * @returns {String} the formatted date string + * + * @example + * // Represent 11 February 2014 in middle-endian format: + * var result = format( + * new Date(2014, 1, 11), + * 'MM/DD/YYYY' + * ) + * //=> '02/11/2014' + * + * @example + * // Represent 2 July 2014 in Esperanto: + * var eoLocale = require('date-fns/locale/eo') + * var result = format( + * new Date(2014, 6, 2), + * 'Do [de] MMMM YYYY', + * {locale: eoLocale} + * ) + * //=> '2-a de julio 2014' + */ +function format (dirtyDate, dirtyFormatStr, dirtyOptions) { + var formatStr = dirtyFormatStr ? String(dirtyFormatStr) : 'YYYY-MM-DDTHH:mm:ss.SSSZ'; + var options = dirtyOptions || {}; + + var locale = options.locale; + var localeFormatters = en.format.formatters; + var formattingTokensRegExp = en.format.formattingTokensRegExp; + if (locale && locale.format && locale.format.formatters) { + localeFormatters = locale.format.formatters; + + if (locale.format.formattingTokensRegExp) { + formattingTokensRegExp = locale.format.formattingTokensRegExp; + } + } + + var date = parse_1(dirtyDate); + + if (!is_valid(date)) { + return 'Invalid Date' + } + + var formatFn = buildFormatFn(formatStr, localeFormatters, formattingTokensRegExp); + + return formatFn(date) +} + +var formatters = { + // Month: 1, 2, ..., 12 + 'M': function (date) { + return date.getMonth() + 1 + }, + + // Month: 01, 02, ..., 12 + 'MM': function (date) { + return addLeadingZeros(date.getMonth() + 1, 2) + }, + + // Quarter: 1, 2, 3, 4 + 'Q': function (date) { + return Math.ceil((date.getMonth() + 1) / 3) + }, + + // Day of month: 1, 2, ..., 31 + 'D': function (date) { + return date.getDate() + }, + + // Day of month: 01, 02, ..., 31 + 'DD': function (date) { + return addLeadingZeros(date.getDate(), 2) + }, + + // Day of year: 1, 2, ..., 366 + 'DDD': function (date) { + return get_day_of_year(date) + }, + + // Day of year: 001, 002, ..., 366 + 'DDDD': function (date) { + return addLeadingZeros(get_day_of_year(date), 3) + }, + + // Day of week: 0, 1, ..., 6 + 'd': function (date) { + return date.getDay() + }, + + // Day of ISO week: 1, 2, ..., 7 + 'E': function (date) { + return date.getDay() || 7 + }, + + // ISO week: 1, 2, ..., 53 + 'W': function (date) { + return get_iso_week(date) + }, + + // ISO week: 01, 02, ..., 53 + 'WW': function (date) { + return addLeadingZeros(get_iso_week(date), 2) + }, + + // Year: 00, 01, ..., 99 + 'YY': function (date) { + return addLeadingZeros(date.getFullYear(), 4).substr(2) + }, + + // Year: 1900, 1901, ..., 2099 + 'YYYY': function (date) { + return addLeadingZeros(date.getFullYear(), 4) + }, + + // ISO week-numbering year: 00, 01, ..., 99 + 'GG': function (date) { + return String(get_iso_year(date)).substr(2) + }, + + // ISO week-numbering year: 1900, 1901, ..., 2099 + 'GGGG': function (date) { + return get_iso_year(date) + }, + + // Hour: 0, 1, ... 23 + 'H': function (date) { + return date.getHours() + }, + + // Hour: 00, 01, ..., 23 + 'HH': function (date) { + return addLeadingZeros(date.getHours(), 2) + }, + + // Hour: 1, 2, ..., 12 + 'h': function (date) { + var hours = date.getHours(); + if (hours === 0) { + return 12 + } else if (hours > 12) { + return hours % 12 + } else { + return hours + } + }, + + // Hour: 01, 02, ..., 12 + 'hh': function (date) { + return addLeadingZeros(formatters['h'](date), 2) + }, + + // Minute: 0, 1, ..., 59 + 'm': function (date) { + return date.getMinutes() + }, + + // Minute: 00, 01, ..., 59 + 'mm': function (date) { + return addLeadingZeros(date.getMinutes(), 2) + }, + + // Second: 0, 1, ..., 59 + 's': function (date) { + return date.getSeconds() + }, + + // Second: 00, 01, ..., 59 + 'ss': function (date) { + return addLeadingZeros(date.getSeconds(), 2) + }, + + // 1/10 of second: 0, 1, ..., 9 + 'S': function (date) { + return Math.floor(date.getMilliseconds() / 100) + }, + + // 1/100 of second: 00, 01, ..., 99 + 'SS': function (date) { + return addLeadingZeros(Math.floor(date.getMilliseconds() / 10), 2) + }, + + // Millisecond: 000, 001, ..., 999 + 'SSS': function (date) { + return addLeadingZeros(date.getMilliseconds(), 3) + }, + + // Timezone: -01:00, +00:00, ... +12:00 + 'Z': function (date) { + return formatTimezone(date.getTimezoneOffset(), ':') + }, + + // Timezone: -0100, +0000, ... +1200 + 'ZZ': function (date) { + return formatTimezone(date.getTimezoneOffset()) + }, + + // Seconds timestamp: 512969520 + 'X': function (date) { + return Math.floor(date.getTime() / 1000) + }, + + // Milliseconds timestamp: 512969520900 + 'x': function (date) { + return date.getTime() + } +}; + +function buildFormatFn (formatStr, localeFormatters, formattingTokensRegExp) { + var array = formatStr.match(formattingTokensRegExp); + var length = array.length; + + var i; + var formatter; + for (i = 0; i < length; i++) { + formatter = localeFormatters[array[i]] || formatters[array[i]]; + if (formatter) { + array[i] = formatter; + } else { + array[i] = removeFormattingTokens(array[i]); + } + } + + return function (date) { + var output = ''; + for (var i = 0; i < length; i++) { + if (array[i] instanceof Function) { + output += array[i](date, formatters); + } else { + output += array[i]; + } + } + return output + } +} + +function removeFormattingTokens (input) { + if (input.match(/\[[\s\S]/)) { + return input.replace(/^\[|]$/g, '') + } + return input.replace(/\\/g, '') +} + +function formatTimezone (offset, delimeter) { + delimeter = delimeter || ''; + var sign = offset > 0 ? '-' : '+'; + var absOffset = Math.abs(offset); + var hours = Math.floor(absOffset / 60); + var minutes = absOffset % 60; + return sign + addLeadingZeros(hours, 2) + delimeter + addLeadingZeros(minutes, 2) +} + +function addLeadingZeros (number, targetLength) { + var output = Math.abs(number).toString(); + while (output.length < targetLength) { + output = '0' + output; + } + return output +} + +var format_1 = format;/** + * @category Common Helpers + * @summary Compare the two dates reverse chronologically and return -1, 0 or 1. + * + * @description + * Compare the two dates and return -1 if the first date is after the second, + * 1 if the first date is before the second or 0 if dates are equal. + * + * @param {Date|String|Number} dateLeft - the first date to compare + * @param {Date|String|Number} dateRight - the second date to compare + * @returns {Number} the result of the comparison + * + * @example + * // Compare 11 February 1987 and 10 July 1989 reverse chronologically: + * var result = compareDesc( + * new Date(1987, 1, 11), + * new Date(1989, 6, 10) + * ) + * //=> 1 + * + * @example + * // Sort the array of dates in reverse chronological order: + * var result = [ + * new Date(1995, 6, 2), + * new Date(1987, 1, 11), + * new Date(1989, 6, 10) + * ].sort(compareDesc) + * //=> [ + * // Sun Jul 02 1995 00:00:00, + * // Mon Jul 10 1989 00:00:00, + * // Wed Feb 11 1987 00:00:00 + * // ] + */ +function compareDesc (dirtyDateLeft, dirtyDateRight) { + var dateLeft = parse_1(dirtyDateLeft); + var timeLeft = dateLeft.getTime(); + var dateRight = parse_1(dirtyDateRight); + var timeRight = dateRight.getTime(); + + if (timeLeft > timeRight) { + return -1 + } else if (timeLeft < timeRight) { + return 1 + } else { + return 0 + } +} + +var compare_desc = compareDesc;/** + * @category Millisecond Helpers + * @summary Get the number of milliseconds between the given dates. + * + * @description + * Get the number of milliseconds between the given dates. + * + * @param {Date|String|Number} dateLeft - the later date + * @param {Date|String|Number} dateRight - the earlier date + * @returns {Number} the number of milliseconds + * + * @example + * // How many milliseconds are between + * // 2 July 2014 12:30:20.600 and 2 July 2014 12:30:21.700? + * var result = differenceInMilliseconds( + * new Date(2014, 6, 2, 12, 30, 21, 700), + * new Date(2014, 6, 2, 12, 30, 20, 600) + * ) + * //=> 1100 + */ +function differenceInMilliseconds (dirtyDateLeft, dirtyDateRight) { + var dateLeft = parse_1(dirtyDateLeft); + var dateRight = parse_1(dirtyDateRight); + return dateLeft.getTime() - dateRight.getTime() +} + +var difference_in_milliseconds = differenceInMilliseconds;/** + * @category Second Helpers + * @summary Get the number of seconds between the given dates. + * + * @description + * Get the number of seconds between the given dates. + * + * @param {Date|String|Number} dateLeft - the later date + * @param {Date|String|Number} dateRight - the earlier date + * @returns {Number} the number of seconds + * + * @example + * // How many seconds are between + * // 2 July 2014 12:30:07.999 and 2 July 2014 12:30:20.000? + * var result = differenceInSeconds( + * new Date(2014, 6, 2, 12, 30, 20, 0), + * new Date(2014, 6, 2, 12, 30, 7, 999) + * ) + * //=> 12 + */ +function differenceInSeconds (dirtyDateLeft, dirtyDateRight) { + var diff = difference_in_milliseconds(dirtyDateLeft, dirtyDateRight) / 1000; + return diff > 0 ? Math.floor(diff) : Math.ceil(diff) +} + +var difference_in_seconds = differenceInSeconds;/** + * @category Month Helpers + * @summary Get the number of calendar months between the given dates. + * + * @description + * Get the number of calendar months between the given dates. + * + * @param {Date|String|Number} dateLeft - the later date + * @param {Date|String|Number} dateRight - the earlier date + * @returns {Number} the number of calendar months + * + * @example + * // How many calendar months are between 31 January 2014 and 1 September 2014? + * var result = differenceInCalendarMonths( + * new Date(2014, 8, 1), + * new Date(2014, 0, 31) + * ) + * //=> 8 + */ +function differenceInCalendarMonths (dirtyDateLeft, dirtyDateRight) { + var dateLeft = parse_1(dirtyDateLeft); + var dateRight = parse_1(dirtyDateRight); + + var yearDiff = dateLeft.getFullYear() - dateRight.getFullYear(); + var monthDiff = dateLeft.getMonth() - dateRight.getMonth(); + + return yearDiff * 12 + monthDiff +} + +var difference_in_calendar_months = differenceInCalendarMonths;/** + * @category Common Helpers + * @summary Compare the two dates and return -1, 0 or 1. + * + * @description + * Compare the two dates and return 1 if the first date is after the second, + * -1 if the first date is before the second or 0 if dates are equal. + * + * @param {Date|String|Number} dateLeft - the first date to compare + * @param {Date|String|Number} dateRight - the second date to compare + * @returns {Number} the result of the comparison + * + * @example + * // Compare 11 February 1987 and 10 July 1989: + * var result = compareAsc( + * new Date(1987, 1, 11), + * new Date(1989, 6, 10) + * ) + * //=> -1 + * + * @example + * // Sort the array of dates: + * var result = [ + * new Date(1995, 6, 2), + * new Date(1987, 1, 11), + * new Date(1989, 6, 10) + * ].sort(compareAsc) + * //=> [ + * // Wed Feb 11 1987 00:00:00, + * // Mon Jul 10 1989 00:00:00, + * // Sun Jul 02 1995 00:00:00 + * // ] + */ +function compareAsc (dirtyDateLeft, dirtyDateRight) { + var dateLeft = parse_1(dirtyDateLeft); + var timeLeft = dateLeft.getTime(); + var dateRight = parse_1(dirtyDateRight); + var timeRight = dateRight.getTime(); + + if (timeLeft < timeRight) { + return -1 + } else if (timeLeft > timeRight) { + return 1 + } else { + return 0 + } +} + +var compare_asc = compareAsc;/** + * @category Month Helpers + * @summary Get the number of full months between the given dates. + * + * @description + * Get the number of full months between the given dates. + * + * @param {Date|String|Number} dateLeft - the later date + * @param {Date|String|Number} dateRight - the earlier date + * @returns {Number} the number of full months + * + * @example + * // How many full months are between 31 January 2014 and 1 September 2014? + * var result = differenceInMonths( + * new Date(2014, 8, 1), + * new Date(2014, 0, 31) + * ) + * //=> 7 + */ +function differenceInMonths (dirtyDateLeft, dirtyDateRight) { + var dateLeft = parse_1(dirtyDateLeft); + var dateRight = parse_1(dirtyDateRight); + + var sign = compare_asc(dateLeft, dateRight); + var difference = Math.abs(difference_in_calendar_months(dateLeft, dateRight)); + dateLeft.setMonth(dateLeft.getMonth() - sign * difference); + + // Math.abs(diff in full months - diff in calendar months) === 1 if last calendar month is not full + // If so, result must be decreased by 1 in absolute value + var isLastMonthNotFull = compare_asc(dateLeft, dateRight) === -sign; + return sign * (difference - isLastMonthNotFull) +} + +var difference_in_months = differenceInMonths;var MINUTES_IN_DAY = 1440; +var MINUTES_IN_ALMOST_TWO_DAYS = 2520; +var MINUTES_IN_MONTH = 43200; +var MINUTES_IN_TWO_MONTHS = 86400; + +/** + * @category Common Helpers + * @summary Return the distance between the given dates in words. + * + * @description + * Return the distance between the given dates in words. + * + * | Distance between dates | Result | + * |-------------------------------------------------------------------|---------------------| + * | 0 ... 30 secs | less than a minute | + * | 30 secs ... 1 min 30 secs | 1 minute | + * | 1 min 30 secs ... 44 mins 30 secs | [2..44] minutes | + * | 44 mins ... 30 secs ... 89 mins 30 secs | about 1 hour | + * | 89 mins 30 secs ... 23 hrs 59 mins 30 secs | about [2..24] hours | + * | 23 hrs 59 mins 30 secs ... 41 hrs 59 mins 30 secs | 1 day | + * | 41 hrs 59 mins 30 secs ... 29 days 23 hrs 59 mins 30 secs | [2..30] days | + * | 29 days 23 hrs 59 mins 30 secs ... 44 days 23 hrs 59 mins 30 secs | about 1 month | + * | 44 days 23 hrs 59 mins 30 secs ... 59 days 23 hrs 59 mins 30 secs | about 2 months | + * | 59 days 23 hrs 59 mins 30 secs ... 1 yr | [2..12] months | + * | 1 yr ... 1 yr 3 months | about 1 year | + * | 1 yr 3 months ... 1 yr 9 month s | over 1 year | + * | 1 yr 9 months ... 2 yrs | almost 2 years | + * | N yrs ... N yrs 3 months | about N years | + * | N yrs 3 months ... N yrs 9 months | over N years | + * | N yrs 9 months ... N+1 yrs | almost N+1 years | + * + * With `options.includeSeconds == true`: + * | Distance between dates | Result | + * |------------------------|----------------------| + * | 0 secs ... 5 secs | less than 5 seconds | + * | 5 secs ... 10 secs | less than 10 seconds | + * | 10 secs ... 20 secs | less than 20 seconds | + * | 20 secs ... 40 secs | half a minute | + * | 40 secs ... 60 secs | less than a minute | + * | 60 secs ... 90 secs | 1 minute | + * + * @param {Date|String|Number} dateToCompare - the date to compare with + * @param {Date|String|Number} date - the other date + * @param {Object} [options] - the object with options + * @param {Boolean} [options.includeSeconds=false] - distances less than a minute are more detailed + * @param {Boolean} [options.addSuffix=false] - result indicates if the second date is earlier or later than the first + * @param {Object} [options.locale=enLocale] - the locale object + * @returns {String} the distance in words + * + * @example + * // What is the distance between 2 July 2014 and 1 January 2015? + * var result = distanceInWords( + * new Date(2014, 6, 2), + * new Date(2015, 0, 1) + * ) + * //=> '6 months' + * + * @example + * // What is the distance between 1 January 2015 00:00:15 + * // and 1 January 2015 00:00:00, including seconds? + * var result = distanceInWords( + * new Date(2015, 0, 1, 0, 0, 15), + * new Date(2015, 0, 1, 0, 0, 0), + * {includeSeconds: true} + * ) + * //=> 'less than 20 seconds' + * + * @example + * // What is the distance from 1 January 2016 + * // to 1 January 2015, with a suffix? + * var result = distanceInWords( + * new Date(2016, 0, 1), + * new Date(2015, 0, 1), + * {addSuffix: true} + * ) + * //=> 'about 1 year ago' + * + * @example + * // What is the distance between 1 August 2016 and 1 January 2015 in Esperanto? + * var eoLocale = require('date-fns/locale/eo') + * var result = distanceInWords( + * new Date(2016, 7, 1), + * new Date(2015, 0, 1), + * {locale: eoLocale} + * ) + * //=> 'pli ol 1 jaro' + */ +function distanceInWords (dirtyDateToCompare, dirtyDate, dirtyOptions) { + var options = dirtyOptions || {}; + + var comparison = compare_desc(dirtyDateToCompare, dirtyDate); + + var locale = options.locale; + var localize = en.distanceInWords.localize; + if (locale && locale.distanceInWords && locale.distanceInWords.localize) { + localize = locale.distanceInWords.localize; + } + + var localizeOptions = { + addSuffix: Boolean(options.addSuffix), + comparison: comparison + }; + + var dateLeft, dateRight; + if (comparison > 0) { + dateLeft = parse_1(dirtyDateToCompare); + dateRight = parse_1(dirtyDate); + } else { + dateLeft = parse_1(dirtyDate); + dateRight = parse_1(dirtyDateToCompare); + } + + var seconds = difference_in_seconds(dateRight, dateLeft); + var offset = dateRight.getTimezoneOffset() - dateLeft.getTimezoneOffset(); + var minutes = Math.round(seconds / 60) - offset; + var months; + + // 0 up to 2 mins + if (minutes < 2) { + if (options.includeSeconds) { + if (seconds < 5) { + return localize('lessThanXSeconds', 5, localizeOptions) + } else if (seconds < 10) { + return localize('lessThanXSeconds', 10, localizeOptions) + } else if (seconds < 20) { + return localize('lessThanXSeconds', 20, localizeOptions) + } else if (seconds < 40) { + return localize('halfAMinute', null, localizeOptions) + } else if (seconds < 60) { + return localize('lessThanXMinutes', 1, localizeOptions) + } else { + return localize('xMinutes', 1, localizeOptions) + } + } else { + if (minutes === 0) { + return localize('lessThanXMinutes', 1, localizeOptions) + } else { + return localize('xMinutes', minutes, localizeOptions) + } + } + + // 2 mins up to 0.75 hrs + } else if (minutes < 45) { + return localize('xMinutes', minutes, localizeOptions) + + // 0.75 hrs up to 1.5 hrs + } else if (minutes < 90) { + return localize('aboutXHours', 1, localizeOptions) + + // 1.5 hrs up to 24 hrs + } else if (minutes < MINUTES_IN_DAY) { + var hours = Math.round(minutes / 60); + return localize('aboutXHours', hours, localizeOptions) + + // 1 day up to 1.75 days + } else if (minutes < MINUTES_IN_ALMOST_TWO_DAYS) { + return localize('xDays', 1, localizeOptions) + + // 1.75 days up to 30 days + } else if (minutes < MINUTES_IN_MONTH) { + var days = Math.round(minutes / MINUTES_IN_DAY); + return localize('xDays', days, localizeOptions) + + // 1 month up to 2 months + } else if (minutes < MINUTES_IN_TWO_MONTHS) { + months = Math.round(minutes / MINUTES_IN_MONTH); + return localize('aboutXMonths', months, localizeOptions) + } + + months = difference_in_months(dateRight, dateLeft); + + // 2 months up to 12 months + if (months < 12) { + var nearestMonth = Math.round(minutes / MINUTES_IN_MONTH); + return localize('xMonths', nearestMonth, localizeOptions) + + // 1 year up to max Date + } else { + var monthsSinceStartOfYear = months % 12; + var years = Math.floor(months / 12); + + // N years up to 1 years 3 months + if (monthsSinceStartOfYear < 3) { + return localize('aboutXYears', years, localizeOptions) + + // N years 3 months up to N years 9 months + } else if (monthsSinceStartOfYear < 9) { + return localize('overXYears', years, localizeOptions) + + // N years 9 months up to N year 12 months + } else { + return localize('almostXYears', years + 1, localizeOptions) + } + } +} + +var distance_in_words = distanceInWords;/** + * @category Common Helpers + * @summary Return the distance between the given date and now in words. + * + * @description + * Return the distance between the given date and now in words. + * + * | Distance to now | Result | + * |-------------------------------------------------------------------|---------------------| + * | 0 ... 30 secs | less than a minute | + * | 30 secs ... 1 min 30 secs | 1 minute | + * | 1 min 30 secs ... 44 mins 30 secs | [2..44] minutes | + * | 44 mins ... 30 secs ... 89 mins 30 secs | about 1 hour | + * | 89 mins 30 secs ... 23 hrs 59 mins 30 secs | about [2..24] hours | + * | 23 hrs 59 mins 30 secs ... 41 hrs 59 mins 30 secs | 1 day | + * | 41 hrs 59 mins 30 secs ... 29 days 23 hrs 59 mins 30 secs | [2..30] days | + * | 29 days 23 hrs 59 mins 30 secs ... 44 days 23 hrs 59 mins 30 secs | about 1 month | + * | 44 days 23 hrs 59 mins 30 secs ... 59 days 23 hrs 59 mins 30 secs | about 2 months | + * | 59 days 23 hrs 59 mins 30 secs ... 1 yr | [2..12] months | + * | 1 yr ... 1 yr 3 months | about 1 year | + * | 1 yr 3 months ... 1 yr 9 month s | over 1 year | + * | 1 yr 9 months ... 2 yrs | almost 2 years | + * | N yrs ... N yrs 3 months | about N years | + * | N yrs 3 months ... N yrs 9 months | over N years | + * | N yrs 9 months ... N+1 yrs | almost N+1 years | + * + * With `options.includeSeconds == true`: + * | Distance to now | Result | + * |---------------------|----------------------| + * | 0 secs ... 5 secs | less than 5 seconds | + * | 5 secs ... 10 secs | less than 10 seconds | + * | 10 secs ... 20 secs | less than 20 seconds | + * | 20 secs ... 40 secs | half a minute | + * | 40 secs ... 60 secs | less than a minute | + * | 60 secs ... 90 secs | 1 minute | + * + * @param {Date|String|Number} date - the given date + * @param {Object} [options] - the object with options + * @param {Boolean} [options.includeSeconds=false] - distances less than a minute are more detailed + * @param {Boolean} [options.addSuffix=false] - result specifies if the second date is earlier or later than the first + * @param {Object} [options.locale=enLocale] - the locale object + * @returns {String} the distance in words + * + * @example + * // If today is 1 January 2015, what is the distance to 2 July 2014? + * var result = distanceInWordsToNow( + * new Date(2014, 6, 2) + * ) + * //=> '6 months' + * + * @example + * // If now is 1 January 2015 00:00:00, + * // what is the distance to 1 January 2015 00:00:15, including seconds? + * var result = distanceInWordsToNow( + * new Date(2015, 0, 1, 0, 0, 15), + * {includeSeconds: true} + * ) + * //=> 'less than 20 seconds' + * + * @example + * // If today is 1 January 2015, + * // what is the distance to 1 January 2016, with a suffix? + * var result = distanceInWordsToNow( + * new Date(2016, 0, 1), + * {addSuffix: true} + * ) + * //=> 'in about 1 year' + * + * @example + * // If today is 1 January 2015, + * // what is the distance to 1 August 2016 in Esperanto? + * var eoLocale = require('date-fns/locale/eo') + * var result = distanceInWordsToNow( + * new Date(2016, 7, 1), + * {locale: eoLocale} + * ) + * //=> 'pli ol 1 jaro' + */ +function distanceInWordsToNow (dirtyDate, dirtyOptions) { + return distance_in_words(Date.now(), dirtyDate, dirtyOptions) +} + +var distance_in_words_to_now = distanceInWordsToNow;if (typeof self !== "undefined") { + init(self); +} else if (typeof global$1 !== "undefined") { + init(global$1); +} else if (typeof window !== "undefined") { + init(window); +} else { + throw new Error("unsupported execution environment"); +} + +function init(g) { + g.dateFns = { + format: format_1, + distanceInWordsToNow: distance_in_words_to_now + }; +}}()); \ No newline at end of file diff --git a/frontend/vendor/datefns/datefns.bundle.min.js b/frontend/vendor/datefns/datefns.bundle.min.js new file mode 100644 index 000000000..b8a73aedd --- /dev/null +++ b/frontend/vendor/datefns/datefns.bundle.min.js @@ -0,0 +1 @@ +!function(){"use strict";var e="undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},t=function(e){var t=new Date(e.getTime()),n=t.getTimezoneOffset();return t.setSeconds(0,0),6e4*n+t.getTime()%6e4};var n=function(e){return e instanceof Date},r=36e5,a=6e4,o=2,u=/[T ]/,i=/:/,s=/^(\d{2})$/,f=[/^([+-]\d{2})$/,/^([+-]\d{3})$/,/^([+-]\d{4})$/],c=/^(\d{4})/,l=[/^([+-]\d{4})/,/^([+-]\d{5})/,/^([+-]\d{6})/],d=/^-(\d{2})$/,g=/^-?(\d{3})$/,h=/^-?(\d{2})-?(\d{2})$/,v=/^-?W(\d{2})$/,m=/^-?W(\d{2})-?(\d{1})$/,D=/^(\d{2}([.,]\d*)?)$/,M=/^(\d{2}):?(\d{2}([.,]\d*)?)$/,T=/^(\d{2}):?(\d{2}):?(\d{2}([.,]\d*)?)$/,p=/([Z+-].*)$/,y=/^(Z)$/,S=/^([+-])(\d{2})$/,x=/^([+-])(\d{2}):?(\d{2})$/;function Y(e,t,n){t=t||0,n=n||0;var r=new Date(0);r.setUTCFullYear(e,0,4);var a=7*t+n+1-(r.getUTCDay()||7);return r.setUTCDate(r.getUTCDate()+a),r}var w=function(e,w){if(n(e))return new Date(e.getTime());if("string"!=typeof e)return new Date(e);var b=(w||{}).additionalDigits;b=null==b?o:Number(b);var F=function(e){var t,n={},r=e.split(u);if(i.test(r[0])?(n.date=null,t=r[0]):(n.date=r[0],t=r[1]),t){var a=p.exec(t);a?(n.time=t.replace(a[1],""),n.timezone=a[1]):n.time=t}return n}(e),H=function(e,t){var n,r=f[t],a=l[t];if(n=c.exec(e)||a.exec(e)){var o=n[1];return{year:parseInt(o,10),restDateString:e.slice(o.length)}}if(n=s.exec(e)||r.exec(e)){var u=n[1];return{year:100*parseInt(u,10),restDateString:e.slice(u.length)}}return{year:null}}(F.date,b),I=H.year,X=function(e,t){if(null===t)return null;var n,r,a,o;if(0===e.length)return(r=new Date(0)).setUTCFullYear(t),r;if(n=d.exec(e))return r=new Date(0),a=parseInt(n[1],10)-1,r.setUTCFullYear(t,a),r;if(n=g.exec(e)){r=new Date(0);var u=parseInt(n[1],10);return r.setUTCFullYear(t,0,u),r}if(n=h.exec(e)){r=new Date(0),a=parseInt(n[1],10)-1;var i=parseInt(n[2],10);return r.setUTCFullYear(t,a,i),r}if(n=v.exec(e))return o=parseInt(n[1],10)-1,Y(t,o);if(n=m.exec(e)){o=parseInt(n[1],10)-1;var s=parseInt(n[2],10)-1;return Y(t,o,s)}return null}(H.restDateString,I);if(X){var W,$=X.getTime(),z=0;if(F.time&&(z=function(e){var t,n,o;if(t=D.exec(e))return(n=parseFloat(t[1].replace(",",".")))%24*r;if(t=M.exec(e))return n=parseInt(t[1],10),o=parseFloat(t[2].replace(",",".")),n%24*r+o*a;if(t=T.exec(e)){n=parseInt(t[1],10),o=parseInt(t[2],10);var u=parseFloat(t[3].replace(",","."));return n%24*r+o*a+1e3*u}return null}(F.time)),F.timezone)A=F.timezone,W=((C=y.exec(A))?0:(C=S.exec(A))?(U=60*parseInt(C[2],10),"+"===C[1]?-U:U):(C=x.exec(A))?(U=60*parseInt(C[2],10)+parseInt(C[3],10),"+"===C[1]?-U:U):0)*a;else{var G=$+z,O=new Date(G);W=t(O);var E=new Date(G);E.setDate(O.getDate()+1);var Z=t(E)-t(O);Z>0&&(W+=Z)}return new Date($+z+W)}var A,C,U;return new Date(e)};var b=function(e){var t=w(e),n=new Date(0);return n.setFullYear(t.getFullYear(),0,1),n.setHours(0,0,0,0),n};var F=function(e){var t=w(e);return t.setHours(0,0,0,0),t},H=6e4,I=864e5;var X=function(e,t){var n=F(e),r=F(t),a=n.getTime()-n.getTimezoneOffset()*H,o=r.getTime()-r.getTimezoneOffset()*H;return Math.round((a-o)/I)};var W=function(e){var t=w(e);return X(t,b(t))+1};var $=function(e,t){var n=t&&Number(t.weekStartsOn)||0,r=w(e),a=r.getDay(),o=(a=a.getTime()?n+1:t.getTime()>=u.getTime()?n:n-1};var O=function(e){var t=G(e),n=new Date(0);return n.setFullYear(t,0,4),n.setHours(0,0,0,0),z(n)},E=6048e5;var Z=function(e){var t=w(e),n=z(t).getTime()-O(t).getTime();return Math.round(n/E)+1};var A=function(e){if(n(e))return!isNaN(e);throw new TypeError(toString.call(e)+" is not an instance of Date")};var C=["M","MM","Q","D","DD","DDD","DDDD","d","E","W","WW","YY","YYYY","GG","GGGG","H","HH","h","hh","m","mm","s","ss","S","SS","SSS","Z","ZZ","X","x"];var U=function(e){var t=[];for(var n in e)e.hasOwnProperty(n)&&t.push(n);var r=C.concat(t).sort().reverse();return new RegExp("(\\[[^\\[]*\\])|(\\\\)?("+r.join("|")+"|.)","g")};var N=function(){var e=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],t=["January","February","March","April","May","June","July","August","September","October","November","December"],n=["Su","Mo","Tu","We","Th","Fr","Sa"],r=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],a=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],o=["AM","PM"],u=["am","pm"],i=["a.m.","p.m."],s={MMM:function(t){return e[t.getMonth()]},MMMM:function(e){return t[e.getMonth()]},dd:function(e){return n[e.getDay()]},ddd:function(e){return r[e.getDay()]},dddd:function(e){return a[e.getDay()]},A:function(e){return e.getHours()/12>=1?o[1]:o[0]},a:function(e){return e.getHours()/12>=1?u[1]:u[0]},aa:function(e){return e.getHours()/12>=1?i[1]:i[0]}};return["M","D","DDD","d","Q","W"].forEach(function(e){s[e+"o"]=function(t,n){return function(e){var t=e%100;if(t>20||t<10)switch(t%10){case 1:return e+"st";case 2:return e+"nd";case 3:return e+"rd"}return e+"th"}(n[e](t))}}),{formatters:s,formattingTokensRegExp:U(s)}},k={distanceInWords:function(){var e={lessThanXSeconds:{one:"less than a second",other:"less than {{count}} seconds"},xSeconds:{one:"1 second",other:"{{count}} seconds"},halfAMinute:"half a minute",lessThanXMinutes:{one:"less than a minute",other:"less than {{count}} minutes"},xMinutes:{one:"1 minute",other:"{{count}} minutes"},aboutXHours:{one:"about 1 hour",other:"about {{count}} hours"},xHours:{one:"1 hour",other:"{{count}} hours"},xDays:{one:"1 day",other:"{{count}} days"},aboutXMonths:{one:"about 1 month",other:"about {{count}} months"},xMonths:{one:"1 month",other:"{{count}} months"},aboutXYears:{one:"about 1 year",other:"about {{count}} years"},xYears:{one:"1 year",other:"{{count}} years"},overXYears:{one:"over 1 year",other:"over {{count}} years"},almostXYears:{one:"almost 1 year",other:"almost {{count}} years"}};return{localize:function(t,n,r){var a;return r=r||{},a="string"==typeof e[t]?e[t]:1===n?e[t].one:e[t].other.replace("{{count}}",n),r.addSuffix?r.comparison>0?"in "+a:a+" ago":a}}}(),format:N()};var J={M:function(e){return e.getMonth()+1},MM:function(e){return Q(e.getMonth()+1,2)},Q:function(e){return Math.ceil((e.getMonth()+1)/3)},D:function(e){return e.getDate()},DD:function(e){return Q(e.getDate(),2)},DDD:function(e){return W(e)},DDDD:function(e){return Q(W(e),3)},d:function(e){return e.getDay()},E:function(e){return e.getDay()||7},W:function(e){return Z(e)},WW:function(e){return Q(Z(e),2)},YY:function(e){return Q(e.getFullYear(),4).substr(2)},YYYY:function(e){return Q(e.getFullYear(),4)},GG:function(e){return String(G(e)).substr(2)},GGGG:function(e){return G(e)},H:function(e){return e.getHours()},HH:function(e){return Q(e.getHours(),2)},h:function(e){var t=e.getHours();return 0===t?12:t>12?t%12:t},hh:function(e){return Q(J.h(e),2)},m:function(e){return e.getMinutes()},mm:function(e){return Q(e.getMinutes(),2)},s:function(e){return e.getSeconds()},ss:function(e){return Q(e.getSeconds(),2)},S:function(e){return Math.floor(e.getMilliseconds()/100)},SS:function(e){return Q(Math.floor(e.getMilliseconds()/10),2)},SSS:function(e){return Q(e.getMilliseconds(),3)},Z:function(e){return R(e.getTimezoneOffset(),":")},ZZ:function(e){return R(e.getTimezoneOffset())},X:function(e){return Math.floor(e.getTime()/1e3)},x:function(e){return e.getTime()}};function R(e,t){t=t||"";var n=e>0?"-":"+",r=Math.abs(e),a=r%60;return n+Q(Math.floor(r/60),2)+t+Q(a,2)}function Q(e,t){for(var n=Math.abs(e).toString();n.lengthr?-1:n0?Math.floor(n):Math.ceil(n)};var K=function(e,t){var n=w(e),r=w(t);return 12*(n.getFullYear()-r.getFullYear())+(n.getMonth()-r.getMonth())};var L=function(e,t){var n=w(e).getTime(),r=w(t).getTime();return nr?1:0};var V=function(e,t){var n=w(e),r=w(t),a=L(n,r),o=Math.abs(K(n,r));return n.setMonth(n.getMonth()-a*o),a*(o-(L(n,r)===-a))},_=1440,ee=2520,te=43200,ne=86400;var re=function(e,t,n){var r=n||{},a=j(e,t),o=r.locale,u=k.distanceInWords.localize;o&&o.distanceInWords&&o.distanceInWords.localize&&(u=o.distanceInWords.localize);var i,s,f={addSuffix:Boolean(r.addSuffix),comparison:a};a>0?(i=w(e),s=w(t)):(i=w(t),s=w(e));var c,l=q(s,i),d=s.getTimezoneOffset()-i.getTimezoneOffset(),g=Math.round(l/60)-d;if(g<2)return r.includeSeconds?l<5?u("lessThanXSeconds",5,f):l<10?u("lessThanXSeconds",10,f):l<20?u("lessThanXSeconds",20,f):l<40?u("halfAMinute",null,f):u(l<60?"lessThanXMinutes":"xMinutes",1,f):0===g?u("lessThanXMinutes",1,f):u("xMinutes",g,f);if(g<45)return u("xMinutes",g,f);if(g<90)return u("aboutXHours",1,f);if(g<_)return u("aboutXHours",Math.round(g/60),f);if(g 0) { - offset += offsetDiff; - } - } - return new Date(timestamp + time + offset); - } else { - return new Date(argument); - } - } - function splitDateString(dateString) { - var dateStrings = {}; - var array = dateString.split(parseTokenDateTimeDelimeter); - var timeString; - if (parseTokenPlainTime.test(array[0])) { - dateStrings.date = null; - timeString = array[0]; - } else { - dateStrings.date = array[0]; - timeString = array[1]; - } - if (timeString) { - var token = parseTokenTimezone.exec(timeString); - if (token) { - dateStrings.time = timeString.replace(token[1], ''); - dateStrings.timezone = token[1]; - } else { - dateStrings.time = timeString; - } - } - return dateStrings; - } - function parseYear(dateString, additionalDigits) { - var parseTokenYYY = parseTokensYYY[additionalDigits]; - var parseTokenYYYYY = parseTokensYYYYY[additionalDigits]; - var token; - token = parseTokenYYYY.exec(dateString) || parseTokenYYYYY.exec(dateString); - if (token) { - var yearString = token[1]; - return { - year: parseInt(yearString, 10), - restDateString: dateString.slice(yearString.length) - }; - } - token = parseTokenYY.exec(dateString) || parseTokenYYY.exec(dateString); - if (token) { - var centuryString = token[1]; - return { - year: parseInt(centuryString, 10) * 100, - restDateString: dateString.slice(centuryString.length) - }; - } - return { year: null }; - } - function parseDate(dateString, year) { - if (year === null) { - return null; - } - var token; - var date; - var month; - var week; - if (dateString.length === 0) { - date = new Date(0); - date.setUTCFullYear(year); - return date; - } - token = parseTokenMM.exec(dateString); - if (token) { - date = new Date(0); - month = parseInt(token[1], 10) - 1; - date.setUTCFullYear(year, month); - return date; - } - token = parseTokenDDD.exec(dateString); - if (token) { - date = new Date(0); - var dayOfYear = parseInt(token[1], 10); - date.setUTCFullYear(year, 0, dayOfYear); - return date; - } - token = parseTokenMMDD.exec(dateString); - if (token) { - date = new Date(0); - month = parseInt(token[1], 10) - 1; - var day = parseInt(token[2], 10); - date.setUTCFullYear(year, month, day); - return date; - } - token = parseTokenWww.exec(dateString); - if (token) { - week = parseInt(token[1], 10) - 1; - return dayOfISOYear(year, week); - } - token = parseTokenWwwD.exec(dateString); - if (token) { - week = parseInt(token[1], 10) - 1; - var dayOfWeek = parseInt(token[2], 10) - 1; - return dayOfISOYear(year, week, dayOfWeek); - } - return null; - } - function parseTime(timeString) { - var token; - var hours; - var minutes; - token = parseTokenHH.exec(timeString); - if (token) { - hours = parseFloat(token[1].replace(',', '.')); - return hours % 24 * MILLISECONDS_IN_HOUR; - } - token = parseTokenHHMM.exec(timeString); - if (token) { - hours = parseInt(token[1], 10); - minutes = parseFloat(token[2].replace(',', '.')); - return hours % 24 * MILLISECONDS_IN_HOUR + minutes * MILLISECONDS_IN_MINUTE; - } - token = parseTokenHHMMSS.exec(timeString); - if (token) { - hours = parseInt(token[1], 10); - minutes = parseInt(token[2], 10); - var seconds = parseFloat(token[3].replace(',', '.')); - return hours % 24 * MILLISECONDS_IN_HOUR + minutes * MILLISECONDS_IN_MINUTE + seconds * 1000; - } - return null; - } - function parseTimezone(timezoneString) { - var token; - var absoluteOffset; - token = parseTokenTimezoneZ.exec(timezoneString); - if (token) { - return 0; - } - token = parseTokenTimezoneHH.exec(timezoneString); - if (token) { - absoluteOffset = parseInt(token[2], 10) * 60; - return token[1] === '+' ? -absoluteOffset : absoluteOffset; - } - token = parseTokenTimezoneHHMM.exec(timezoneString); - if (token) { - absoluteOffset = parseInt(token[2], 10) * 60 + parseInt(token[3], 10); - return token[1] === '+' ? -absoluteOffset : absoluteOffset; - } - return 0; - } - function dayOfISOYear(isoYear, week, day) { - week = week || 0; - day = day || 0; - var date = new Date(0); - date.setUTCFullYear(isoYear, 0, 4); - var fourthOfJanuaryDay = date.getUTCDay() || 7; - var diff = week * 7 + day + 1 - fourthOfJanuaryDay; - date.setUTCDate(date.getUTCDate() + diff); - return date; - } - module.exports = parse; - - - -/***/ }, -/* 3 */ -/***/ function(module, exports) { - - var MILLISECONDS_IN_MINUTE = 60000; - module.exports = function getTimezoneOffsetInMilliseconds(dirtyDate) { - var date = new Date(dirtyDate.getTime()); - var baseTimezoneOffset = date.getTimezoneOffset(); - date.setSeconds(0, 0); - var millisecondsPartOfTimezoneOffset = date.getTime() % MILLISECONDS_IN_MINUTE; - return baseTimezoneOffset * MILLISECONDS_IN_MINUTE + millisecondsPartOfTimezoneOffset; - }; - - - -/***/ }, -/* 4 */ -/***/ function(module, exports) { - - function isDate(argument) { - return argument instanceof Date; - } - module.exports = isDate; - - - -/***/ }, -/* 5 */ -/***/ function(module, exports, __webpack_require__) { - - var addMilliseconds = __webpack_require__(6); - var MILLISECONDS_IN_HOUR = 3600000; - function addHours(dirtyDate, dirtyAmount) { - var amount = Number(dirtyAmount); - return addMilliseconds(dirtyDate, amount * MILLISECONDS_IN_HOUR); - } - module.exports = addHours; - - - -/***/ }, -/* 6 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function addMilliseconds(dirtyDate, dirtyAmount) { - var timestamp = parse(dirtyDate).getTime(); - var amount = Number(dirtyAmount); - return new Date(timestamp + amount); - } - module.exports = addMilliseconds; - - - -/***/ }, -/* 7 */ -/***/ function(module, exports, __webpack_require__) { - - var getISOYear = __webpack_require__(8); - var setISOYear = __webpack_require__(11); - function addISOYears(dirtyDate, dirtyAmount) { - var amount = Number(dirtyAmount); - return setISOYear(dirtyDate, getISOYear(dirtyDate) + amount); - } - module.exports = addISOYears; - - - -/***/ }, -/* 8 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - var startOfISOWeek = __webpack_require__(9); - function getISOYear(dirtyDate) { - var date = parse(dirtyDate); - var year = date.getFullYear(); - var fourthOfJanuaryOfNextYear = new Date(0); - fourthOfJanuaryOfNextYear.setFullYear(year + 1, 0, 4); - fourthOfJanuaryOfNextYear.setHours(0, 0, 0, 0); - var startOfNextYear = startOfISOWeek(fourthOfJanuaryOfNextYear); - var fourthOfJanuaryOfThisYear = new Date(0); - fourthOfJanuaryOfThisYear.setFullYear(year, 0, 4); - fourthOfJanuaryOfThisYear.setHours(0, 0, 0, 0); - var startOfThisYear = startOfISOWeek(fourthOfJanuaryOfThisYear); - if (date.getTime() >= startOfNextYear.getTime()) { - return year + 1; - } else if (date.getTime() >= startOfThisYear.getTime()) { - return year; - } else { - return year - 1; - } - } - module.exports = getISOYear; - - - -/***/ }, -/* 9 */ -/***/ function(module, exports, __webpack_require__) { - - var startOfWeek = __webpack_require__(10); - function startOfISOWeek(dirtyDate) { - return startOfWeek(dirtyDate, { weekStartsOn: 1 }); - } - module.exports = startOfISOWeek; - - - -/***/ }, -/* 10 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function startOfWeek(dirtyDate, dirtyOptions) { - var weekStartsOn = dirtyOptions ? Number(dirtyOptions.weekStartsOn) || 0 : 0; - var date = parse(dirtyDate); - var day = date.getDay(); - var diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn; - date.setDate(date.getDate() - diff); - date.setHours(0, 0, 0, 0); - return date; - } - module.exports = startOfWeek; - - - -/***/ }, -/* 11 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - var startOfISOYear = __webpack_require__(12); - var differenceInCalendarDays = __webpack_require__(13); - function setISOYear(dirtyDate, dirtyISOYear) { - var date = parse(dirtyDate); - var isoYear = Number(dirtyISOYear); - var diff = differenceInCalendarDays(date, startOfISOYear(date)); - var fourthOfJanuary = new Date(0); - fourthOfJanuary.setFullYear(isoYear, 0, 4); - fourthOfJanuary.setHours(0, 0, 0, 0); - date = startOfISOYear(fourthOfJanuary); - date.setDate(date.getDate() + diff); - return date; - } - module.exports = setISOYear; - - - -/***/ }, -/* 12 */ -/***/ function(module, exports, __webpack_require__) { - - var getISOYear = __webpack_require__(8); - var startOfISOWeek = __webpack_require__(9); - function startOfISOYear(dirtyDate) { - var year = getISOYear(dirtyDate); - var fourthOfJanuary = new Date(0); - fourthOfJanuary.setFullYear(year, 0, 4); - fourthOfJanuary.setHours(0, 0, 0, 0); - var date = startOfISOWeek(fourthOfJanuary); - return date; - } - module.exports = startOfISOYear; - - - -/***/ }, -/* 13 */ -/***/ function(module, exports, __webpack_require__) { - - var startOfDay = __webpack_require__(14); - var MILLISECONDS_IN_MINUTE = 60000; - var MILLISECONDS_IN_DAY = 86400000; - function differenceInCalendarDays(dirtyDateLeft, dirtyDateRight) { - var startOfDayLeft = startOfDay(dirtyDateLeft); - var startOfDayRight = startOfDay(dirtyDateRight); - var timestampLeft = startOfDayLeft.getTime() - startOfDayLeft.getTimezoneOffset() * MILLISECONDS_IN_MINUTE; - var timestampRight = startOfDayRight.getTime() - startOfDayRight.getTimezoneOffset() * MILLISECONDS_IN_MINUTE; - return Math.round((timestampLeft - timestampRight) / MILLISECONDS_IN_DAY); - } - module.exports = differenceInCalendarDays; - - - -/***/ }, -/* 14 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function startOfDay(dirtyDate) { - var date = parse(dirtyDate); - date.setHours(0, 0, 0, 0); - return date; - } - module.exports = startOfDay; - - - -/***/ }, -/* 15 */ -/***/ function(module, exports, __webpack_require__) { - - var addMilliseconds = __webpack_require__(6); - var MILLISECONDS_IN_MINUTE = 60000; - function addMinutes(dirtyDate, dirtyAmount) { - var amount = Number(dirtyAmount); - return addMilliseconds(dirtyDate, amount * MILLISECONDS_IN_MINUTE); - } - module.exports = addMinutes; - - - -/***/ }, -/* 16 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - var getDaysInMonth = __webpack_require__(17); - function addMonths(dirtyDate, dirtyAmount) { - var date = parse(dirtyDate); - var amount = Number(dirtyAmount); - var desiredMonth = date.getMonth() + amount; - var dateWithDesiredMonth = new Date(0); - dateWithDesiredMonth.setFullYear(date.getFullYear(), desiredMonth, 1); - dateWithDesiredMonth.setHours(0, 0, 0, 0); - var daysInMonth = getDaysInMonth(dateWithDesiredMonth); - date.setMonth(desiredMonth, Math.min(daysInMonth, date.getDate())); - return date; - } - module.exports = addMonths; - - - -/***/ }, -/* 17 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function getDaysInMonth(dirtyDate) { - var date = parse(dirtyDate); - var year = date.getFullYear(); - var monthIndex = date.getMonth(); - var lastDayOfMonth = new Date(0); - lastDayOfMonth.setFullYear(year, monthIndex + 1, 0); - lastDayOfMonth.setHours(0, 0, 0, 0); - return lastDayOfMonth.getDate(); - } - module.exports = getDaysInMonth; - - - -/***/ }, -/* 18 */ -/***/ function(module, exports, __webpack_require__) { - - var addMonths = __webpack_require__(16); - function addQuarters(dirtyDate, dirtyAmount) { - var amount = Number(dirtyAmount); - var months = amount * 3; - return addMonths(dirtyDate, months); - } - module.exports = addQuarters; - - - -/***/ }, -/* 19 */ -/***/ function(module, exports, __webpack_require__) { - - var addMilliseconds = __webpack_require__(6); - function addSeconds(dirtyDate, dirtyAmount) { - var amount = Number(dirtyAmount); - return addMilliseconds(dirtyDate, amount * 1000); - } - module.exports = addSeconds; - - - -/***/ }, -/* 20 */ -/***/ function(module, exports, __webpack_require__) { - - var addDays = __webpack_require__(1); - function addWeeks(dirtyDate, dirtyAmount) { - var amount = Number(dirtyAmount); - var days = amount * 7; - return addDays(dirtyDate, days); - } - module.exports = addWeeks; - - - -/***/ }, -/* 21 */ -/***/ function(module, exports, __webpack_require__) { - - var addMonths = __webpack_require__(16); - function addYears(dirtyDate, dirtyAmount) { - var amount = Number(dirtyAmount); - return addMonths(dirtyDate, amount * 12); - } - module.exports = addYears; - - - -/***/ }, -/* 22 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function areRangesOverlapping(dirtyInitialRangeStartDate, dirtyInitialRangeEndDate, dirtyComparedRangeStartDate, dirtyComparedRangeEndDate) { - var initialStartTime = parse(dirtyInitialRangeStartDate).getTime(); - var initialEndTime = parse(dirtyInitialRangeEndDate).getTime(); - var comparedStartTime = parse(dirtyComparedRangeStartDate).getTime(); - var comparedEndTime = parse(dirtyComparedRangeEndDate).getTime(); - if (initialStartTime > initialEndTime || comparedStartTime > comparedEndTime) { - throw new Error('The start of the range cannot be after the end of the range'); - } - return initialStartTime < comparedEndTime && comparedStartTime < initialEndTime; - } - module.exports = areRangesOverlapping; - - - -/***/ }, -/* 23 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function closestIndexTo(dirtyDateToCompare, dirtyDatesArray) { - if (!(dirtyDatesArray instanceof Array)) { - throw new TypeError(toString.call(dirtyDatesArray) + ' is not an instance of Array'); - } - var dateToCompare = parse(dirtyDateToCompare); - var timeToCompare = dateToCompare.getTime(); - var result; - var minDistance; - dirtyDatesArray.forEach(function (dirtyDate, index) { - var currentDate = parse(dirtyDate); - var distance = Math.abs(timeToCompare - currentDate.getTime()); - if (result === undefined || distance < minDistance) { - result = index; - minDistance = distance; - } - }); - return result; - } - module.exports = closestIndexTo; - - - -/***/ }, -/* 24 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function closestTo(dirtyDateToCompare, dirtyDatesArray) { - if (!(dirtyDatesArray instanceof Array)) { - throw new TypeError(toString.call(dirtyDatesArray) + ' is not an instance of Array'); - } - var dateToCompare = parse(dirtyDateToCompare); - var timeToCompare = dateToCompare.getTime(); - var result; - var minDistance; - dirtyDatesArray.forEach(function (dirtyDate) { - var currentDate = parse(dirtyDate); - var distance = Math.abs(timeToCompare - currentDate.getTime()); - if (result === undefined || distance < minDistance) { - result = currentDate; - minDistance = distance; - } - }); - return result; - } - module.exports = closestTo; - - - -/***/ }, -/* 25 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function compareAsc(dirtyDateLeft, dirtyDateRight) { - var dateLeft = parse(dirtyDateLeft); - var timeLeft = dateLeft.getTime(); - var dateRight = parse(dirtyDateRight); - var timeRight = dateRight.getTime(); - if (timeLeft < timeRight) { - return -1; - } else if (timeLeft > timeRight) { - return 1; - } else { - return 0; - } - } - module.exports = compareAsc; - - - -/***/ }, -/* 26 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function compareDesc(dirtyDateLeft, dirtyDateRight) { - var dateLeft = parse(dirtyDateLeft); - var timeLeft = dateLeft.getTime(); - var dateRight = parse(dirtyDateRight); - var timeRight = dateRight.getTime(); - if (timeLeft > timeRight) { - return -1; - } else if (timeLeft < timeRight) { - return 1; - } else { - return 0; - } - } - module.exports = compareDesc; - - - -/***/ }, -/* 27 */ -/***/ function(module, exports, __webpack_require__) { - - var startOfISOWeek = __webpack_require__(9); - var MILLISECONDS_IN_MINUTE = 60000; - var MILLISECONDS_IN_WEEK = 604800000; - function differenceInCalendarISOWeeks(dirtyDateLeft, dirtyDateRight) { - var startOfISOWeekLeft = startOfISOWeek(dirtyDateLeft); - var startOfISOWeekRight = startOfISOWeek(dirtyDateRight); - var timestampLeft = startOfISOWeekLeft.getTime() - startOfISOWeekLeft.getTimezoneOffset() * MILLISECONDS_IN_MINUTE; - var timestampRight = startOfISOWeekRight.getTime() - startOfISOWeekRight.getTimezoneOffset() * MILLISECONDS_IN_MINUTE; - return Math.round((timestampLeft - timestampRight) / MILLISECONDS_IN_WEEK); - } - module.exports = differenceInCalendarISOWeeks; - - - -/***/ }, -/* 28 */ -/***/ function(module, exports, __webpack_require__) { - - var getISOYear = __webpack_require__(8); - function differenceInCalendarISOYears(dirtyDateLeft, dirtyDateRight) { - return getISOYear(dirtyDateLeft) - getISOYear(dirtyDateRight); - } - module.exports = differenceInCalendarISOYears; - - - -/***/ }, -/* 29 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function differenceInCalendarMonths(dirtyDateLeft, dirtyDateRight) { - var dateLeft = parse(dirtyDateLeft); - var dateRight = parse(dirtyDateRight); - var yearDiff = dateLeft.getFullYear() - dateRight.getFullYear(); - var monthDiff = dateLeft.getMonth() - dateRight.getMonth(); - return yearDiff * 12 + monthDiff; - } - module.exports = differenceInCalendarMonths; - - - -/***/ }, -/* 30 */ -/***/ function(module, exports, __webpack_require__) { - - var getQuarter = __webpack_require__(31); - var parse = __webpack_require__(2); - function differenceInCalendarQuarters(dirtyDateLeft, dirtyDateRight) { - var dateLeft = parse(dirtyDateLeft); - var dateRight = parse(dirtyDateRight); - var yearDiff = dateLeft.getFullYear() - dateRight.getFullYear(); - var quarterDiff = getQuarter(dateLeft) - getQuarter(dateRight); - return yearDiff * 4 + quarterDiff; - } - module.exports = differenceInCalendarQuarters; - - - -/***/ }, -/* 31 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function getQuarter(dirtyDate) { - var date = parse(dirtyDate); - var quarter = Math.floor(date.getMonth() / 3) + 1; - return quarter; - } - module.exports = getQuarter; - - - -/***/ }, -/* 32 */ -/***/ function(module, exports, __webpack_require__) { - - var startOfWeek = __webpack_require__(10); - var MILLISECONDS_IN_MINUTE = 60000; - var MILLISECONDS_IN_WEEK = 604800000; - function differenceInCalendarWeeks(dirtyDateLeft, dirtyDateRight, dirtyOptions) { - var startOfWeekLeft = startOfWeek(dirtyDateLeft, dirtyOptions); - var startOfWeekRight = startOfWeek(dirtyDateRight, dirtyOptions); - var timestampLeft = startOfWeekLeft.getTime() - startOfWeekLeft.getTimezoneOffset() * MILLISECONDS_IN_MINUTE; - var timestampRight = startOfWeekRight.getTime() - startOfWeekRight.getTimezoneOffset() * MILLISECONDS_IN_MINUTE; - return Math.round((timestampLeft - timestampRight) / MILLISECONDS_IN_WEEK); - } - module.exports = differenceInCalendarWeeks; - - - -/***/ }, -/* 33 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function differenceInCalendarYears(dirtyDateLeft, dirtyDateRight) { - var dateLeft = parse(dirtyDateLeft); - var dateRight = parse(dirtyDateRight); - return dateLeft.getFullYear() - dateRight.getFullYear(); - } - module.exports = differenceInCalendarYears; - - - -/***/ }, -/* 34 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - var differenceInCalendarDays = __webpack_require__(13); - var compareAsc = __webpack_require__(25); - function differenceInDays(dirtyDateLeft, dirtyDateRight) { - var dateLeft = parse(dirtyDateLeft); - var dateRight = parse(dirtyDateRight); - var sign = compareAsc(dateLeft, dateRight); - var difference = Math.abs(differenceInCalendarDays(dateLeft, dateRight)); - dateLeft.setDate(dateLeft.getDate() - sign * difference); - var isLastDayNotFull = compareAsc(dateLeft, dateRight) === -sign; - return sign * (difference - isLastDayNotFull); - } - module.exports = differenceInDays; - - - -/***/ }, -/* 35 */ -/***/ function(module, exports, __webpack_require__) { - - var differenceInMilliseconds = __webpack_require__(36); - var MILLISECONDS_IN_HOUR = 3600000; - function differenceInHours(dirtyDateLeft, dirtyDateRight) { - var diff = differenceInMilliseconds(dirtyDateLeft, dirtyDateRight) / MILLISECONDS_IN_HOUR; - return diff > 0 ? Math.floor(diff) : Math.ceil(diff); - } - module.exports = differenceInHours; - - - -/***/ }, -/* 36 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function differenceInMilliseconds(dirtyDateLeft, dirtyDateRight) { - var dateLeft = parse(dirtyDateLeft); - var dateRight = parse(dirtyDateRight); - return dateLeft.getTime() - dateRight.getTime(); - } - module.exports = differenceInMilliseconds; - - - -/***/ }, -/* 37 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - var differenceInCalendarISOYears = __webpack_require__(28); - var compareAsc = __webpack_require__(25); - var subISOYears = __webpack_require__(38); - function differenceInISOYears(dirtyDateLeft, dirtyDateRight) { - var dateLeft = parse(dirtyDateLeft); - var dateRight = parse(dirtyDateRight); - var sign = compareAsc(dateLeft, dateRight); - var difference = Math.abs(differenceInCalendarISOYears(dateLeft, dateRight)); - dateLeft = subISOYears(dateLeft, sign * difference); - var isLastISOYearNotFull = compareAsc(dateLeft, dateRight) === -sign; - return sign * (difference - isLastISOYearNotFull); - } - module.exports = differenceInISOYears; - - - -/***/ }, -/* 38 */ -/***/ function(module, exports, __webpack_require__) { - - var addISOYears = __webpack_require__(7); - function subISOYears(dirtyDate, dirtyAmount) { - var amount = Number(dirtyAmount); - return addISOYears(dirtyDate, -amount); - } - module.exports = subISOYears; - - - -/***/ }, -/* 39 */ -/***/ function(module, exports, __webpack_require__) { - - var differenceInMilliseconds = __webpack_require__(36); - var MILLISECONDS_IN_MINUTE = 60000; - function differenceInMinutes(dirtyDateLeft, dirtyDateRight) { - var diff = differenceInMilliseconds(dirtyDateLeft, dirtyDateRight) / MILLISECONDS_IN_MINUTE; - return diff > 0 ? Math.floor(diff) : Math.ceil(diff); - } - module.exports = differenceInMinutes; - - - -/***/ }, -/* 40 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - var differenceInCalendarMonths = __webpack_require__(29); - var compareAsc = __webpack_require__(25); - function differenceInMonths(dirtyDateLeft, dirtyDateRight) { - var dateLeft = parse(dirtyDateLeft); - var dateRight = parse(dirtyDateRight); - var sign = compareAsc(dateLeft, dateRight); - var difference = Math.abs(differenceInCalendarMonths(dateLeft, dateRight)); - dateLeft.setMonth(dateLeft.getMonth() - sign * difference); - var isLastMonthNotFull = compareAsc(dateLeft, dateRight) === -sign; - return sign * (difference - isLastMonthNotFull); - } - module.exports = differenceInMonths; - - - -/***/ }, -/* 41 */ -/***/ function(module, exports, __webpack_require__) { - - var differenceInMonths = __webpack_require__(40); - function differenceInQuarters(dirtyDateLeft, dirtyDateRight) { - var diff = differenceInMonths(dirtyDateLeft, dirtyDateRight) / 3; - return diff > 0 ? Math.floor(diff) : Math.ceil(diff); - } - module.exports = differenceInQuarters; - - - -/***/ }, -/* 42 */ -/***/ function(module, exports, __webpack_require__) { - - var differenceInMilliseconds = __webpack_require__(36); - function differenceInSeconds(dirtyDateLeft, dirtyDateRight) { - var diff = differenceInMilliseconds(dirtyDateLeft, dirtyDateRight) / 1000; - return diff > 0 ? Math.floor(diff) : Math.ceil(diff); - } - module.exports = differenceInSeconds; - - - -/***/ }, -/* 43 */ -/***/ function(module, exports, __webpack_require__) { - - var differenceInDays = __webpack_require__(34); - function differenceInWeeks(dirtyDateLeft, dirtyDateRight) { - var diff = differenceInDays(dirtyDateLeft, dirtyDateRight) / 7; - return diff > 0 ? Math.floor(diff) : Math.ceil(diff); - } - module.exports = differenceInWeeks; - - - -/***/ }, -/* 44 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - var differenceInCalendarYears = __webpack_require__(33); - var compareAsc = __webpack_require__(25); - function differenceInYears(dirtyDateLeft, dirtyDateRight) { - var dateLeft = parse(dirtyDateLeft); - var dateRight = parse(dirtyDateRight); - var sign = compareAsc(dateLeft, dateRight); - var difference = Math.abs(differenceInCalendarYears(dateLeft, dateRight)); - dateLeft.setFullYear(dateLeft.getFullYear() - sign * difference); - var isLastYearNotFull = compareAsc(dateLeft, dateRight) === -sign; - return sign * (difference - isLastYearNotFull); - } - module.exports = differenceInYears; - - - -/***/ }, -/* 45 */ -/***/ function(module, exports, __webpack_require__) { - - var compareDesc = __webpack_require__(26); - var parse = __webpack_require__(2); - var differenceInSeconds = __webpack_require__(42); - var differenceInMonths = __webpack_require__(40); - var enLocale = __webpack_require__(46); - var MINUTES_IN_DAY = 1440; - var MINUTES_IN_ALMOST_TWO_DAYS = 2520; - var MINUTES_IN_MONTH = 43200; - var MINUTES_IN_TWO_MONTHS = 86400; - function distanceInWords(dirtyDateToCompare, dirtyDate, dirtyOptions) { - var options = dirtyOptions || {}; - var comparison = compareDesc(dirtyDateToCompare, dirtyDate); - var locale = options.locale; - var localize = enLocale.distanceInWords.localize; - if (locale && locale.distanceInWords && locale.distanceInWords.localize) { - localize = locale.distanceInWords.localize; - } - var localizeOptions = { - addSuffix: Boolean(options.addSuffix), - comparison: comparison - }; - var dateLeft, dateRight; - if (comparison > 0) { - dateLeft = parse(dirtyDateToCompare); - dateRight = parse(dirtyDate); - } else { - dateLeft = parse(dirtyDate); - dateRight = parse(dirtyDateToCompare); - } - var seconds = differenceInSeconds(dateRight, dateLeft); - var offset = dateRight.getTimezoneOffset() - dateLeft.getTimezoneOffset(); - var minutes = Math.round(seconds / 60) - offset; - var months; - if (minutes < 2) { - if (options.includeSeconds) { - if (seconds < 5) { - return localize('lessThanXSeconds', 5, localizeOptions); - } else if (seconds < 10) { - return localize('lessThanXSeconds', 10, localizeOptions); - } else if (seconds < 20) { - return localize('lessThanXSeconds', 20, localizeOptions); - } else if (seconds < 40) { - return localize('halfAMinute', null, localizeOptions); - } else if (seconds < 60) { - return localize('lessThanXMinutes', 1, localizeOptions); - } else { - return localize('xMinutes', 1, localizeOptions); - } - } else { - if (minutes === 0) { - return localize('lessThanXMinutes', 1, localizeOptions); - } else { - return localize('xMinutes', minutes, localizeOptions); - } - } - } else if (minutes < 45) { - return localize('xMinutes', minutes, localizeOptions); - } else if (minutes < 90) { - return localize('aboutXHours', 1, localizeOptions); - } else if (minutes < MINUTES_IN_DAY) { - var hours = Math.round(minutes / 60); - return localize('aboutXHours', hours, localizeOptions); - } else if (minutes < MINUTES_IN_ALMOST_TWO_DAYS) { - return localize('xDays', 1, localizeOptions); - } else if (minutes < MINUTES_IN_MONTH) { - var days = Math.round(minutes / MINUTES_IN_DAY); - return localize('xDays', days, localizeOptions); - } else if (minutes < MINUTES_IN_TWO_MONTHS) { - months = Math.round(minutes / MINUTES_IN_MONTH); - return localize('aboutXMonths', months, localizeOptions); - } - months = differenceInMonths(dateRight, dateLeft); - if (months < 12) { - var nearestMonth = Math.round(minutes / MINUTES_IN_MONTH); - return localize('xMonths', nearestMonth, localizeOptions); - } else { - var monthsSinceStartOfYear = months % 12; - var years = Math.floor(months / 12); - if (monthsSinceStartOfYear < 3) { - return localize('aboutXYears', years, localizeOptions); - } else if (monthsSinceStartOfYear < 9) { - return localize('overXYears', years, localizeOptions); - } else { - return localize('almostXYears', years + 1, localizeOptions); - } - } - } - module.exports = distanceInWords; - - - -/***/ }, -/* 46 */ -/***/ function(module, exports, __webpack_require__) { - - var buildDistanceInWordsLocale = __webpack_require__(47); - var buildFormatLocale = __webpack_require__(48); - module.exports = { - distanceInWords: buildDistanceInWordsLocale(), - format: buildFormatLocale() - }; - - - -/***/ }, -/* 47 */ -/***/ function(module, exports) { - - function buildDistanceInWordsLocale() { - var distanceInWordsLocale = { - lessThanXSeconds: { - one: 'less than a second', - other: 'less than {{count}} seconds' - }, - xSeconds: { - one: '1 second', - other: '{{count}} seconds' - }, - halfAMinute: 'half a minute', - lessThanXMinutes: { - one: 'less than a minute', - other: 'less than {{count}} minutes' - }, - xMinutes: { - one: '1 minute', - other: '{{count}} minutes' - }, - aboutXHours: { - one: 'about 1 hour', - other: 'about {{count}} hours' - }, - xHours: { - one: '1 hour', - other: '{{count}} hours' - }, - xDays: { - one: '1 day', - other: '{{count}} days' - }, - aboutXMonths: { - one: 'about 1 month', - other: 'about {{count}} months' - }, - xMonths: { - one: '1 month', - other: '{{count}} months' - }, - aboutXYears: { - one: 'about 1 year', - other: 'about {{count}} years' - }, - xYears: { - one: '1 year', - other: '{{count}} years' - }, - overXYears: { - one: 'over 1 year', - other: 'over {{count}} years' - }, - almostXYears: { - one: 'almost 1 year', - other: 'almost {{count}} years' - } - }; - function localize(token, count, options) { - options = options || {}; - var result; - if (typeof distanceInWordsLocale[token] === 'string') { - result = distanceInWordsLocale[token]; - } else if (count === 1) { - result = distanceInWordsLocale[token].one; - } else { - result = distanceInWordsLocale[token].other.replace('{{count}}', count); - } - if (options.addSuffix) { - if (options.comparison > 0) { - return 'in ' + result; - } else { - return result + ' ago'; - } - } - return result; - } - return { localize: localize }; - } - module.exports = buildDistanceInWordsLocale; - - - -/***/ }, -/* 48 */ -/***/ function(module, exports, __webpack_require__) { - - var buildFormattingTokensRegExp = __webpack_require__(49); - function buildFormatLocale() { - var months3char = [ - 'Jan', - 'Feb', - 'Mar', - 'Apr', - 'May', - 'Jun', - 'Jul', - 'Aug', - 'Sep', - 'Oct', - 'Nov', - 'Dec' - ]; - var monthsFull = [ - 'January', - 'February', - 'March', - 'April', - 'May', - 'June', - 'July', - 'August', - 'September', - 'October', - 'November', - 'December' - ]; - var weekdays2char = [ - 'Su', - 'Mo', - 'Tu', - 'We', - 'Th', - 'Fr', - 'Sa' - ]; - var weekdays3char = [ - 'Sun', - 'Mon', - 'Tue', - 'Wed', - 'Thu', - 'Fri', - 'Sat' - ]; - var weekdaysFull = [ - 'Sunday', - 'Monday', - 'Tuesday', - 'Wednesday', - 'Thursday', - 'Friday', - 'Saturday' - ]; - var meridiemUppercase = [ - 'AM', - 'PM' - ]; - var meridiemLowercase = [ - 'am', - 'pm' - ]; - var meridiemFull = [ - 'a.m.', - 'p.m.' - ]; - var formatters = { - 'MMM': function (date) { - return months3char[date.getMonth()]; - }, - 'MMMM': function (date) { - return monthsFull[date.getMonth()]; - }, - 'dd': function (date) { - return weekdays2char[date.getDay()]; - }, - 'ddd': function (date) { - return weekdays3char[date.getDay()]; - }, - 'dddd': function (date) { - return weekdaysFull[date.getDay()]; - }, - 'A': function (date) { - return date.getHours() / 12 >= 1 ? meridiemUppercase[1] : meridiemUppercase[0]; - }, - 'a': function (date) { - return date.getHours() / 12 >= 1 ? meridiemLowercase[1] : meridiemLowercase[0]; - }, - 'aa': function (date) { - return date.getHours() / 12 >= 1 ? meridiemFull[1] : meridiemFull[0]; - } - }; - var ordinalFormatters = [ - 'M', - 'D', - 'DDD', - 'd', - 'Q', - 'W' - ]; - ordinalFormatters.forEach(function (formatterToken) { - formatters[formatterToken + 'o'] = function (date, formatters) { - return ordinal(formatters[formatterToken](date)); - }; - }); - return { - formatters: formatters, - formattingTokensRegExp: buildFormattingTokensRegExp(formatters) - }; - } - function ordinal(number) { - var rem100 = number % 100; - if (rem100 > 20 || rem100 < 10) { - switch (rem100 % 10) { - case 1: - return number + 'st'; - case 2: - return number + 'nd'; - case 3: - return number + 'rd'; - } - } - return number + 'th'; - } - module.exports = buildFormatLocale; - - - -/***/ }, -/* 49 */ -/***/ function(module, exports) { - - var commonFormatterKeys = [ - 'M', - 'MM', - 'Q', - 'D', - 'DD', - 'DDD', - 'DDDD', - 'd', - 'E', - 'W', - 'WW', - 'YY', - 'YYYY', - 'GG', - 'GGGG', - 'H', - 'HH', - 'h', - 'hh', - 'm', - 'mm', - 's', - 'ss', - 'S', - 'SS', - 'SSS', - 'Z', - 'ZZ', - 'X', - 'x' - ]; - function buildFormattingTokensRegExp(formatters) { - var formatterKeys = []; - for (var key in formatters) { - if (formatters.hasOwnProperty(key)) { - formatterKeys.push(key); - } - } - var formattingTokens = commonFormatterKeys.concat(formatterKeys).sort().reverse(); - var formattingTokensRegExp = new RegExp('(\\[[^\\[]*\\])|(\\\\)?' + '(' + formattingTokens.join('|') + '|.)', 'g'); - return formattingTokensRegExp; - } - module.exports = buildFormattingTokensRegExp; - - - -/***/ }, -/* 50 */ -/***/ function(module, exports, __webpack_require__) { - - var compareDesc = __webpack_require__(26); - var parse = __webpack_require__(2); - var differenceInSeconds = __webpack_require__(42); - var enLocale = __webpack_require__(46); - var MINUTES_IN_DAY = 1440; - var MINUTES_IN_MONTH = 43200; - var MINUTES_IN_YEAR = 525600; - function distanceInWordsStrict(dirtyDateToCompare, dirtyDate, dirtyOptions) { - var options = dirtyOptions || {}; - var comparison = compareDesc(dirtyDateToCompare, dirtyDate); - var locale = options.locale; - var localize = enLocale.distanceInWords.localize; - if (locale && locale.distanceInWords && locale.distanceInWords.localize) { - localize = locale.distanceInWords.localize; - } - var localizeOptions = { - addSuffix: Boolean(options.addSuffix), - comparison: comparison - }; - var dateLeft, dateRight; - if (comparison > 0) { - dateLeft = parse(dirtyDateToCompare); - dateRight = parse(dirtyDate); - } else { - dateLeft = parse(dirtyDate); - dateRight = parse(dirtyDateToCompare); - } - var unit; - var mathPartial = Math[options.partialMethod ? String(options.partialMethod) : 'floor']; - var seconds = differenceInSeconds(dateRight, dateLeft); - var offset = dateRight.getTimezoneOffset() - dateLeft.getTimezoneOffset(); - var minutes = mathPartial(seconds / 60) - offset; - var hours, days, months, years; - if (options.unit) { - unit = String(options.unit); - } else { - if (minutes < 1) { - unit = 's'; - } else if (minutes < 60) { - unit = 'm'; - } else if (minutes < MINUTES_IN_DAY) { - unit = 'h'; - } else if (minutes < MINUTES_IN_MONTH) { - unit = 'd'; - } else if (minutes < MINUTES_IN_YEAR) { - unit = 'M'; - } else { - unit = 'Y'; - } - } - if (unit === 's') { - return localize('xSeconds', seconds, localizeOptions); - } else if (unit === 'm') { - return localize('xMinutes', minutes, localizeOptions); - } else if (unit === 'h') { - hours = mathPartial(minutes / 60); - return localize('xHours', hours, localizeOptions); - } else if (unit === 'd') { - days = mathPartial(minutes / MINUTES_IN_DAY); - return localize('xDays', days, localizeOptions); - } else if (unit === 'M') { - months = mathPartial(minutes / MINUTES_IN_MONTH); - return localize('xMonths', months, localizeOptions); - } else if (unit === 'Y') { - years = mathPartial(minutes / MINUTES_IN_YEAR); - return localize('xYears', years, localizeOptions); - } - throw new Error('Unknown unit: ' + unit); - } - module.exports = distanceInWordsStrict; - - - -/***/ }, -/* 51 */ -/***/ function(module, exports, __webpack_require__) { - - var distanceInWords = __webpack_require__(45); - function distanceInWordsToNow(dirtyDate, dirtyOptions) { - return distanceInWords(Date.now(), dirtyDate, dirtyOptions); - } - module.exports = distanceInWordsToNow; - - - -/***/ }, -/* 52 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function eachDay(dirtyStartDate, dirtyEndDate, dirtyStep) { - var startDate = parse(dirtyStartDate); - var endDate = parse(dirtyEndDate); - var step = dirtyStep !== undefined ? dirtyStep : 1; - var endTime = endDate.getTime(); - if (startDate.getTime() > endTime) { - throw new Error('The first date cannot be after the second date'); - } - var dates = []; - var currentDate = startDate; - currentDate.setHours(0, 0, 0, 0); - while (currentDate.getTime() <= endTime) { - dates.push(parse(currentDate)); - currentDate.setDate(currentDate.getDate() + step); - } - return dates; - } - module.exports = eachDay; - - - -/***/ }, -/* 53 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function endOfDay(dirtyDate) { - var date = parse(dirtyDate); - date.setHours(23, 59, 59, 999); - return date; - } - module.exports = endOfDay; - - - -/***/ }, -/* 54 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function endOfHour(dirtyDate) { - var date = parse(dirtyDate); - date.setMinutes(59, 59, 999); - return date; - } - module.exports = endOfHour; - - - -/***/ }, -/* 55 */ -/***/ function(module, exports, __webpack_require__) { - - var endOfWeek = __webpack_require__(56); - function endOfISOWeek(dirtyDate) { - return endOfWeek(dirtyDate, { weekStartsOn: 1 }); - } - module.exports = endOfISOWeek; - - - -/***/ }, -/* 56 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function endOfWeek(dirtyDate, dirtyOptions) { - var weekStartsOn = dirtyOptions ? Number(dirtyOptions.weekStartsOn) || 0 : 0; - var date = parse(dirtyDate); - var day = date.getDay(); - var diff = (day < weekStartsOn ? -7 : 0) + 6 - (day - weekStartsOn); - date.setDate(date.getDate() + diff); - date.setHours(23, 59, 59, 999); - return date; - } - module.exports = endOfWeek; - - - -/***/ }, -/* 57 */ -/***/ function(module, exports, __webpack_require__) { - - var getISOYear = __webpack_require__(8); - var startOfISOWeek = __webpack_require__(9); - function endOfISOYear(dirtyDate) { - var year = getISOYear(dirtyDate); - var fourthOfJanuaryOfNextYear = new Date(0); - fourthOfJanuaryOfNextYear.setFullYear(year + 1, 0, 4); - fourthOfJanuaryOfNextYear.setHours(0, 0, 0, 0); - var date = startOfISOWeek(fourthOfJanuaryOfNextYear); - date.setMilliseconds(date.getMilliseconds() - 1); - return date; - } - module.exports = endOfISOYear; - - - -/***/ }, -/* 58 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function endOfMinute(dirtyDate) { - var date = parse(dirtyDate); - date.setSeconds(59, 999); - return date; - } - module.exports = endOfMinute; - - - -/***/ }, -/* 59 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function endOfMonth(dirtyDate) { - var date = parse(dirtyDate); - var month = date.getMonth(); - date.setFullYear(date.getFullYear(), month + 1, 0); - date.setHours(23, 59, 59, 999); - return date; - } - module.exports = endOfMonth; - - - -/***/ }, -/* 60 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function endOfQuarter(dirtyDate) { - var date = parse(dirtyDate); - var currentMonth = date.getMonth(); - var month = currentMonth - currentMonth % 3 + 3; - date.setMonth(month, 0); - date.setHours(23, 59, 59, 999); - return date; - } - module.exports = endOfQuarter; - - - -/***/ }, -/* 61 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function endOfSecond(dirtyDate) { - var date = parse(dirtyDate); - date.setMilliseconds(999); - return date; - } - module.exports = endOfSecond; - - - -/***/ }, -/* 62 */ -/***/ function(module, exports, __webpack_require__) { - - var endOfDay = __webpack_require__(53); - function endOfToday() { - return endOfDay(new Date()); - } - module.exports = endOfToday; - - - -/***/ }, -/* 63 */ -/***/ function(module, exports) { - - function endOfTomorrow() { - var now = new Date(); - var year = now.getFullYear(); - var month = now.getMonth(); - var day = now.getDate(); - var date = new Date(0); - date.setFullYear(year, month, day + 1); - date.setHours(23, 59, 59, 999); - return date; - } - module.exports = endOfTomorrow; - - - -/***/ }, -/* 64 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function endOfYear(dirtyDate) { - var date = parse(dirtyDate); - var year = date.getFullYear(); - date.setFullYear(year + 1, 0, 0); - date.setHours(23, 59, 59, 999); - return date; - } - module.exports = endOfYear; - - - -/***/ }, -/* 65 */ -/***/ function(module, exports) { - - function endOfYesterday() { - var now = new Date(); - var year = now.getFullYear(); - var month = now.getMonth(); - var day = now.getDate(); - var date = new Date(0); - date.setFullYear(year, month, day - 1); - date.setHours(23, 59, 59, 999); - return date; - } - module.exports = endOfYesterday; - - - -/***/ }, -/* 66 */ -/***/ function(module, exports, __webpack_require__) { - - var getDayOfYear = __webpack_require__(67); - var getISOWeek = __webpack_require__(69); - var getISOYear = __webpack_require__(8); - var parse = __webpack_require__(2); - var isValid = __webpack_require__(70); - var enLocale = __webpack_require__(46); - function format(dirtyDate, dirtyFormatStr, dirtyOptions) { - var formatStr = dirtyFormatStr ? String(dirtyFormatStr) : 'YYYY-MM-DDTHH:mm:ss.SSSZ'; - var options = dirtyOptions || {}; - var locale = options.locale; - var localeFormatters = enLocale.format.formatters; - var formattingTokensRegExp = enLocale.format.formattingTokensRegExp; - if (locale && locale.format && locale.format.formatters) { - localeFormatters = locale.format.formatters; - if (locale.format.formattingTokensRegExp) { - formattingTokensRegExp = locale.format.formattingTokensRegExp; - } - } - var date = parse(dirtyDate); - if (!isValid(date)) { - return 'Invalid Date'; - } - var formatFn = buildFormatFn(formatStr, localeFormatters, formattingTokensRegExp); - return formatFn(date); - } - var formatters = { - 'M': function (date) { - return date.getMonth() + 1; - }, - 'MM': function (date) { - return addLeadingZeros(date.getMonth() + 1, 2); - }, - 'Q': function (date) { - return Math.ceil((date.getMonth() + 1) / 3); - }, - 'D': function (date) { - return date.getDate(); - }, - 'DD': function (date) { - return addLeadingZeros(date.getDate(), 2); - }, - 'DDD': function (date) { - return getDayOfYear(date); - }, - 'DDDD': function (date) { - return addLeadingZeros(getDayOfYear(date), 3); - }, - 'd': function (date) { - return date.getDay(); - }, - 'E': function (date) { - return date.getDay() || 7; - }, - 'W': function (date) { - return getISOWeek(date); - }, - 'WW': function (date) { - return addLeadingZeros(getISOWeek(date), 2); - }, - 'YY': function (date) { - return addLeadingZeros(date.getFullYear(), 4).substr(2); - }, - 'YYYY': function (date) { - return addLeadingZeros(date.getFullYear(), 4); - }, - 'GG': function (date) { - return String(getISOYear(date)).substr(2); - }, - 'GGGG': function (date) { - return getISOYear(date); - }, - 'H': function (date) { - return date.getHours(); - }, - 'HH': function (date) { - return addLeadingZeros(date.getHours(), 2); - }, - 'h': function (date) { - var hours = date.getHours(); - if (hours === 0) { - return 12; - } else if (hours > 12) { - return hours % 12; - } else { - return hours; - } - }, - 'hh': function (date) { - return addLeadingZeros(formatters['h'](date), 2); - }, - 'm': function (date) { - return date.getMinutes(); - }, - 'mm': function (date) { - return addLeadingZeros(date.getMinutes(), 2); - }, - 's': function (date) { - return date.getSeconds(); - }, - 'ss': function (date) { - return addLeadingZeros(date.getSeconds(), 2); - }, - 'S': function (date) { - return Math.floor(date.getMilliseconds() / 100); - }, - 'SS': function (date) { - return addLeadingZeros(Math.floor(date.getMilliseconds() / 10), 2); - }, - 'SSS': function (date) { - return addLeadingZeros(date.getMilliseconds(), 3); - }, - 'Z': function (date) { - return formatTimezone(date.getTimezoneOffset(), ':'); - }, - 'ZZ': function (date) { - return formatTimezone(date.getTimezoneOffset()); - }, - 'X': function (date) { - return Math.floor(date.getTime() / 1000); - }, - 'x': function (date) { - return date.getTime(); - } - }; - function buildFormatFn(formatStr, localeFormatters, formattingTokensRegExp) { - var array = formatStr.match(formattingTokensRegExp); - var length = array.length; - var i; - var formatter; - for (i = 0; i < length; i++) { - formatter = localeFormatters[array[i]] || formatters[array[i]]; - if (formatter) { - array[i] = formatter; - } else { - array[i] = removeFormattingTokens(array[i]); - } - } - return function (date) { - var output = ''; - for (var i = 0; i < length; i++) { - if (array[i] instanceof Function) { - output += array[i](date, formatters); - } else { - output += array[i]; - } - } - return output; - }; - } - function removeFormattingTokens(input) { - if (input.match(/\[[\s\S]/)) { - return input.replace(/^\[|]$/g, ''); - } - return input.replace(/\\/g, ''); - } - function formatTimezone(offset, delimeter) { - delimeter = delimeter || ''; - var sign = offset > 0 ? '-' : '+'; - var absOffset = Math.abs(offset); - var hours = Math.floor(absOffset / 60); - var minutes = absOffset % 60; - return sign + addLeadingZeros(hours, 2) + delimeter + addLeadingZeros(minutes, 2); - } - function addLeadingZeros(number, targetLength) { - var output = Math.abs(number).toString(); - while (output.length < targetLength) { - output = '0' + output; - } - return output; - } - module.exports = format; - - - -/***/ }, -/* 67 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - var startOfYear = __webpack_require__(68); - var differenceInCalendarDays = __webpack_require__(13); - function getDayOfYear(dirtyDate) { - var date = parse(dirtyDate); - var diff = differenceInCalendarDays(date, startOfYear(date)); - var dayOfYear = diff + 1; - return dayOfYear; - } - module.exports = getDayOfYear; - - - -/***/ }, -/* 68 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function startOfYear(dirtyDate) { - var cleanDate = parse(dirtyDate); - var date = new Date(0); - date.setFullYear(cleanDate.getFullYear(), 0, 1); - date.setHours(0, 0, 0, 0); - return date; - } - module.exports = startOfYear; - - - -/***/ }, -/* 69 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - var startOfISOWeek = __webpack_require__(9); - var startOfISOYear = __webpack_require__(12); - var MILLISECONDS_IN_WEEK = 604800000; - function getISOWeek(dirtyDate) { - var date = parse(dirtyDate); - var diff = startOfISOWeek(date).getTime() - startOfISOYear(date).getTime(); - return Math.round(diff / MILLISECONDS_IN_WEEK) + 1; - } - module.exports = getISOWeek; - - - -/***/ }, -/* 70 */ -/***/ function(module, exports, __webpack_require__) { - - var isDate = __webpack_require__(4); - function isValid(dirtyDate) { - if (isDate(dirtyDate)) { - return !isNaN(dirtyDate); - } else { - throw new TypeError(toString.call(dirtyDate) + ' is not an instance of Date'); - } - } - module.exports = isValid; - - - -/***/ }, -/* 71 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function getDate(dirtyDate) { - var date = parse(dirtyDate); - var dayOfMonth = date.getDate(); - return dayOfMonth; - } - module.exports = getDate; - - - -/***/ }, -/* 72 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function getDay(dirtyDate) { - var date = parse(dirtyDate); - var day = date.getDay(); - return day; - } - module.exports = getDay; - - - -/***/ }, -/* 73 */ -/***/ function(module, exports, __webpack_require__) { - - var isLeapYear = __webpack_require__(74); - function getDaysInYear(dirtyDate) { - return isLeapYear(dirtyDate) ? 366 : 365; - } - module.exports = getDaysInYear; - - - -/***/ }, -/* 74 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function isLeapYear(dirtyDate) { - var date = parse(dirtyDate); - var year = date.getFullYear(); - return year % 400 === 0 || year % 4 === 0 && year % 100 !== 0; - } - module.exports = isLeapYear; - - - -/***/ }, -/* 75 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function getHours(dirtyDate) { - var date = parse(dirtyDate); - var hours = date.getHours(); - return hours; - } - module.exports = getHours; - - - -/***/ }, -/* 76 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function getISODay(dirtyDate) { - var date = parse(dirtyDate); - var day = date.getDay(); - if (day === 0) { - day = 7; - } - return day; - } - module.exports = getISODay; - - - -/***/ }, -/* 77 */ -/***/ function(module, exports, __webpack_require__) { - - var startOfISOYear = __webpack_require__(12); - var addWeeks = __webpack_require__(20); - var MILLISECONDS_IN_WEEK = 604800000; - function getISOWeeksInYear(dirtyDate) { - var thisYear = startOfISOYear(dirtyDate); - var nextYear = startOfISOYear(addWeeks(thisYear, 60)); - var diff = nextYear.valueOf() - thisYear.valueOf(); - return Math.round(diff / MILLISECONDS_IN_WEEK); - } - module.exports = getISOWeeksInYear; - - - -/***/ }, -/* 78 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function getMilliseconds(dirtyDate) { - var date = parse(dirtyDate); - var milliseconds = date.getMilliseconds(); - return milliseconds; - } - module.exports = getMilliseconds; - - - -/***/ }, -/* 79 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function getMinutes(dirtyDate) { - var date = parse(dirtyDate); - var minutes = date.getMinutes(); - return minutes; - } - module.exports = getMinutes; - - - -/***/ }, -/* 80 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function getMonth(dirtyDate) { - var date = parse(dirtyDate); - var month = date.getMonth(); - return month; - } - module.exports = getMonth; - - - -/***/ }, -/* 81 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - var MILLISECONDS_IN_DAY = 24 * 60 * 60 * 1000; - function getOverlappingDaysInRanges(dirtyInitialRangeStartDate, dirtyInitialRangeEndDate, dirtyComparedRangeStartDate, dirtyComparedRangeEndDate) { - var initialStartTime = parse(dirtyInitialRangeStartDate).getTime(); - var initialEndTime = parse(dirtyInitialRangeEndDate).getTime(); - var comparedStartTime = parse(dirtyComparedRangeStartDate).getTime(); - var comparedEndTime = parse(dirtyComparedRangeEndDate).getTime(); - if (initialStartTime > initialEndTime || comparedStartTime > comparedEndTime) { - throw new Error('The start of the range cannot be after the end of the range'); - } - var isOverlapping = initialStartTime < comparedEndTime && comparedStartTime < initialEndTime; - if (!isOverlapping) { - return 0; - } - var overlapStartDate = comparedStartTime < initialStartTime ? initialStartTime : comparedStartTime; - var overlapEndDate = comparedEndTime > initialEndTime ? initialEndTime : comparedEndTime; - var differenceInMs = overlapEndDate - overlapStartDate; - return Math.ceil(differenceInMs / MILLISECONDS_IN_DAY); - } - module.exports = getOverlappingDaysInRanges; - - - -/***/ }, -/* 82 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function getSeconds(dirtyDate) { - var date = parse(dirtyDate); - var seconds = date.getSeconds(); - return seconds; - } - module.exports = getSeconds; - - - -/***/ }, -/* 83 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function getTime(dirtyDate) { - var date = parse(dirtyDate); - var timestamp = date.getTime(); - return timestamp; - } - module.exports = getTime; - - - -/***/ }, -/* 84 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function getYear(dirtyDate) { - var date = parse(dirtyDate); - var year = date.getFullYear(); - return year; - } - module.exports = getYear; - - - -/***/ }, -/* 85 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function isAfter(dirtyDate, dirtyDateToCompare) { - var date = parse(dirtyDate); - var dateToCompare = parse(dirtyDateToCompare); - return date.getTime() > dateToCompare.getTime(); - } - module.exports = isAfter; - - - -/***/ }, -/* 86 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function isBefore(dirtyDate, dirtyDateToCompare) { - var date = parse(dirtyDate); - var dateToCompare = parse(dirtyDateToCompare); - return date.getTime() < dateToCompare.getTime(); - } - module.exports = isBefore; - - - -/***/ }, -/* 87 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function isEqual(dirtyLeftDate, dirtyRightDate) { - var dateLeft = parse(dirtyLeftDate); - var dateRight = parse(dirtyRightDate); - return dateLeft.getTime() === dateRight.getTime(); - } - module.exports = isEqual; - - - -/***/ }, -/* 88 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function isFirstDayOfMonth(dirtyDate) { - return parse(dirtyDate).getDate() === 1; - } - module.exports = isFirstDayOfMonth; - - - -/***/ }, -/* 89 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function isFriday(dirtyDate) { - return parse(dirtyDate).getDay() === 5; - } - module.exports = isFriday; - - - -/***/ }, -/* 90 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function isFuture(dirtyDate) { - return parse(dirtyDate).getTime() > new Date().getTime(); - } - module.exports = isFuture; - - - -/***/ }, -/* 91 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - var endOfDay = __webpack_require__(53); - var endOfMonth = __webpack_require__(59); - function isLastDayOfMonth(dirtyDate) { - var date = parse(dirtyDate); - return endOfDay(date).getTime() === endOfMonth(date).getTime(); - } - module.exports = isLastDayOfMonth; - - - -/***/ }, -/* 92 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function isMonday(dirtyDate) { - return parse(dirtyDate).getDay() === 1; - } - module.exports = isMonday; - - - -/***/ }, -/* 93 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function isPast(dirtyDate) { - return parse(dirtyDate).getTime() < new Date().getTime(); - } - module.exports = isPast; - - - -/***/ }, -/* 94 */ -/***/ function(module, exports, __webpack_require__) { - - var startOfDay = __webpack_require__(14); - function isSameDay(dirtyDateLeft, dirtyDateRight) { - var dateLeftStartOfDay = startOfDay(dirtyDateLeft); - var dateRightStartOfDay = startOfDay(dirtyDateRight); - return dateLeftStartOfDay.getTime() === dateRightStartOfDay.getTime(); - } - module.exports = isSameDay; - - - -/***/ }, -/* 95 */ -/***/ function(module, exports, __webpack_require__) { - - var startOfHour = __webpack_require__(96); - function isSameHour(dirtyDateLeft, dirtyDateRight) { - var dateLeftStartOfHour = startOfHour(dirtyDateLeft); - var dateRightStartOfHour = startOfHour(dirtyDateRight); - return dateLeftStartOfHour.getTime() === dateRightStartOfHour.getTime(); - } - module.exports = isSameHour; - - - -/***/ }, -/* 96 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function startOfHour(dirtyDate) { - var date = parse(dirtyDate); - date.setMinutes(0, 0, 0); - return date; - } - module.exports = startOfHour; - - - -/***/ }, -/* 97 */ -/***/ function(module, exports, __webpack_require__) { - - var isSameWeek = __webpack_require__(98); - function isSameISOWeek(dirtyDateLeft, dirtyDateRight) { - return isSameWeek(dirtyDateLeft, dirtyDateRight, { weekStartsOn: 1 }); - } - module.exports = isSameISOWeek; - - - -/***/ }, -/* 98 */ -/***/ function(module, exports, __webpack_require__) { - - var startOfWeek = __webpack_require__(10); - function isSameWeek(dirtyDateLeft, dirtyDateRight, dirtyOptions) { - var dateLeftStartOfWeek = startOfWeek(dirtyDateLeft, dirtyOptions); - var dateRightStartOfWeek = startOfWeek(dirtyDateRight, dirtyOptions); - return dateLeftStartOfWeek.getTime() === dateRightStartOfWeek.getTime(); - } - module.exports = isSameWeek; - - - -/***/ }, -/* 99 */ -/***/ function(module, exports, __webpack_require__) { - - var startOfISOYear = __webpack_require__(12); - function isSameISOYear(dirtyDateLeft, dirtyDateRight) { - var dateLeftStartOfYear = startOfISOYear(dirtyDateLeft); - var dateRightStartOfYear = startOfISOYear(dirtyDateRight); - return dateLeftStartOfYear.getTime() === dateRightStartOfYear.getTime(); - } - module.exports = isSameISOYear; - - - -/***/ }, -/* 100 */ -/***/ function(module, exports, __webpack_require__) { - - var startOfMinute = __webpack_require__(101); - function isSameMinute(dirtyDateLeft, dirtyDateRight) { - var dateLeftStartOfMinute = startOfMinute(dirtyDateLeft); - var dateRightStartOfMinute = startOfMinute(dirtyDateRight); - return dateLeftStartOfMinute.getTime() === dateRightStartOfMinute.getTime(); - } - module.exports = isSameMinute; - - - -/***/ }, -/* 101 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function startOfMinute(dirtyDate) { - var date = parse(dirtyDate); - date.setSeconds(0, 0); - return date; - } - module.exports = startOfMinute; - - - -/***/ }, -/* 102 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function isSameMonth(dirtyDateLeft, dirtyDateRight) { - var dateLeft = parse(dirtyDateLeft); - var dateRight = parse(dirtyDateRight); - return dateLeft.getFullYear() === dateRight.getFullYear() && dateLeft.getMonth() === dateRight.getMonth(); - } - module.exports = isSameMonth; - - - -/***/ }, -/* 103 */ -/***/ function(module, exports, __webpack_require__) { - - var startOfQuarter = __webpack_require__(104); - function isSameQuarter(dirtyDateLeft, dirtyDateRight) { - var dateLeftStartOfQuarter = startOfQuarter(dirtyDateLeft); - var dateRightStartOfQuarter = startOfQuarter(dirtyDateRight); - return dateLeftStartOfQuarter.getTime() === dateRightStartOfQuarter.getTime(); - } - module.exports = isSameQuarter; - - - -/***/ }, -/* 104 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function startOfQuarter(dirtyDate) { - var date = parse(dirtyDate); - var currentMonth = date.getMonth(); - var month = currentMonth - currentMonth % 3; - date.setMonth(month, 1); - date.setHours(0, 0, 0, 0); - return date; - } - module.exports = startOfQuarter; - - - -/***/ }, -/* 105 */ -/***/ function(module, exports, __webpack_require__) { - - var startOfSecond = __webpack_require__(106); - function isSameSecond(dirtyDateLeft, dirtyDateRight) { - var dateLeftStartOfSecond = startOfSecond(dirtyDateLeft); - var dateRightStartOfSecond = startOfSecond(dirtyDateRight); - return dateLeftStartOfSecond.getTime() === dateRightStartOfSecond.getTime(); - } - module.exports = isSameSecond; - - - -/***/ }, -/* 106 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function startOfSecond(dirtyDate) { - var date = parse(dirtyDate); - date.setMilliseconds(0); - return date; - } - module.exports = startOfSecond; - - - -/***/ }, -/* 107 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function isSameYear(dirtyDateLeft, dirtyDateRight) { - var dateLeft = parse(dirtyDateLeft); - var dateRight = parse(dirtyDateRight); - return dateLeft.getFullYear() === dateRight.getFullYear(); - } - module.exports = isSameYear; - - - -/***/ }, -/* 108 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function isSaturday(dirtyDate) { - return parse(dirtyDate).getDay() === 6; - } - module.exports = isSaturday; - - - -/***/ }, -/* 109 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function isSunday(dirtyDate) { - return parse(dirtyDate).getDay() === 0; - } - module.exports = isSunday; - - - -/***/ }, -/* 110 */ -/***/ function(module, exports, __webpack_require__) { - - var isSameHour = __webpack_require__(95); - function isThisHour(dirtyDate) { - return isSameHour(new Date(), dirtyDate); - } - module.exports = isThisHour; - - - -/***/ }, -/* 111 */ -/***/ function(module, exports, __webpack_require__) { - - var isSameISOWeek = __webpack_require__(97); - function isThisISOWeek(dirtyDate) { - return isSameISOWeek(new Date(), dirtyDate); - } - module.exports = isThisISOWeek; - - - -/***/ }, -/* 112 */ -/***/ function(module, exports, __webpack_require__) { - - var isSameISOYear = __webpack_require__(99); - function isThisISOYear(dirtyDate) { - return isSameISOYear(new Date(), dirtyDate); - } - module.exports = isThisISOYear; - - - -/***/ }, -/* 113 */ -/***/ function(module, exports, __webpack_require__) { - - var isSameMinute = __webpack_require__(100); - function isThisMinute(dirtyDate) { - return isSameMinute(new Date(), dirtyDate); - } - module.exports = isThisMinute; - - - -/***/ }, -/* 114 */ -/***/ function(module, exports, __webpack_require__) { - - var isSameMonth = __webpack_require__(102); - function isThisMonth(dirtyDate) { - return isSameMonth(new Date(), dirtyDate); - } - module.exports = isThisMonth; - - - -/***/ }, -/* 115 */ -/***/ function(module, exports, __webpack_require__) { - - var isSameQuarter = __webpack_require__(103); - function isThisQuarter(dirtyDate) { - return isSameQuarter(new Date(), dirtyDate); - } - module.exports = isThisQuarter; - - - -/***/ }, -/* 116 */ -/***/ function(module, exports, __webpack_require__) { - - var isSameSecond = __webpack_require__(105); - function isThisSecond(dirtyDate) { - return isSameSecond(new Date(), dirtyDate); - } - module.exports = isThisSecond; - - - -/***/ }, -/* 117 */ -/***/ function(module, exports, __webpack_require__) { - - var isSameWeek = __webpack_require__(98); - function isThisWeek(dirtyDate, dirtyOptions) { - return isSameWeek(new Date(), dirtyDate, dirtyOptions); - } - module.exports = isThisWeek; - - - -/***/ }, -/* 118 */ -/***/ function(module, exports, __webpack_require__) { - - var isSameYear = __webpack_require__(107); - function isThisYear(dirtyDate) { - return isSameYear(new Date(), dirtyDate); - } - module.exports = isThisYear; - - - -/***/ }, -/* 119 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function isThursday(dirtyDate) { - return parse(dirtyDate).getDay() === 4; - } - module.exports = isThursday; - - - -/***/ }, -/* 120 */ -/***/ function(module, exports, __webpack_require__) { - - var startOfDay = __webpack_require__(14); - function isToday(dirtyDate) { - return startOfDay(dirtyDate).getTime() === startOfDay(new Date()).getTime(); - } - module.exports = isToday; - - - -/***/ }, -/* 121 */ -/***/ function(module, exports, __webpack_require__) { - - var startOfDay = __webpack_require__(14); - function isTomorrow(dirtyDate) { - var tomorrow = new Date(); - tomorrow.setDate(tomorrow.getDate() + 1); - return startOfDay(dirtyDate).getTime() === startOfDay(tomorrow).getTime(); - } - module.exports = isTomorrow; - - - -/***/ }, -/* 122 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function isTuesday(dirtyDate) { - return parse(dirtyDate).getDay() === 2; - } - module.exports = isTuesday; - - - -/***/ }, -/* 123 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function isWednesday(dirtyDate) { - return parse(dirtyDate).getDay() === 3; - } - module.exports = isWednesday; - - - -/***/ }, -/* 124 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function isWeekend(dirtyDate) { - var date = parse(dirtyDate); - var day = date.getDay(); - return day === 0 || day === 6; - } - module.exports = isWeekend; - - - -/***/ }, -/* 125 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function isWithinRange(dirtyDate, dirtyStartDate, dirtyEndDate) { - var time = parse(dirtyDate).getTime(); - var startTime = parse(dirtyStartDate).getTime(); - var endTime = parse(dirtyEndDate).getTime(); - if (startTime > endTime) { - throw new Error('The start of the range cannot be after the end of the range'); - } - return time >= startTime && time <= endTime; - } - module.exports = isWithinRange; - - - -/***/ }, -/* 126 */ -/***/ function(module, exports, __webpack_require__) { - - var startOfDay = __webpack_require__(14); - function isYesterday(dirtyDate) { - var yesterday = new Date(); - yesterday.setDate(yesterday.getDate() - 1); - return startOfDay(dirtyDate).getTime() === startOfDay(yesterday).getTime(); - } - module.exports = isYesterday; - - - -/***/ }, -/* 127 */ -/***/ function(module, exports, __webpack_require__) { - - var lastDayOfWeek = __webpack_require__(128); - function lastDayOfISOWeek(dirtyDate) { - return lastDayOfWeek(dirtyDate, { weekStartsOn: 1 }); - } - module.exports = lastDayOfISOWeek; - - - -/***/ }, -/* 128 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function lastDayOfWeek(dirtyDate, dirtyOptions) { - var weekStartsOn = dirtyOptions ? Number(dirtyOptions.weekStartsOn) || 0 : 0; - var date = parse(dirtyDate); - var day = date.getDay(); - var diff = (day < weekStartsOn ? -7 : 0) + 6 - (day - weekStartsOn); - date.setHours(0, 0, 0, 0); - date.setDate(date.getDate() + diff); - return date; - } - module.exports = lastDayOfWeek; - - - -/***/ }, -/* 129 */ -/***/ function(module, exports, __webpack_require__) { - - var getISOYear = __webpack_require__(8); - var startOfISOWeek = __webpack_require__(9); - function lastDayOfISOYear(dirtyDate) { - var year = getISOYear(dirtyDate); - var fourthOfJanuary = new Date(0); - fourthOfJanuary.setFullYear(year + 1, 0, 4); - fourthOfJanuary.setHours(0, 0, 0, 0); - var date = startOfISOWeek(fourthOfJanuary); - date.setDate(date.getDate() - 1); - return date; - } - module.exports = lastDayOfISOYear; - - - -/***/ }, -/* 130 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function lastDayOfMonth(dirtyDate) { - var date = parse(dirtyDate); - var month = date.getMonth(); - date.setFullYear(date.getFullYear(), month + 1, 0); - date.setHours(0, 0, 0, 0); - return date; - } - module.exports = lastDayOfMonth; - - - -/***/ }, -/* 131 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function lastDayOfQuarter(dirtyDate) { - var date = parse(dirtyDate); - var currentMonth = date.getMonth(); - var month = currentMonth - currentMonth % 3 + 3; - date.setMonth(month, 0); - date.setHours(0, 0, 0, 0); - return date; - } - module.exports = lastDayOfQuarter; - - - -/***/ }, -/* 132 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function lastDayOfYear(dirtyDate) { - var date = parse(dirtyDate); - var year = date.getFullYear(); - date.setFullYear(year + 1, 0, 0); - date.setHours(0, 0, 0, 0); - return date; - } - module.exports = lastDayOfYear; - - - -/***/ }, -/* 133 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function max() { - var dirtyDates = Array.prototype.slice.call(arguments); - var dates = dirtyDates.map(function (dirtyDate) { - return parse(dirtyDate); - }); - var latestTimestamp = Math.max.apply(null, dates); - return new Date(latestTimestamp); - } - module.exports = max; - - - -/***/ }, -/* 134 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function min() { - var dirtyDates = Array.prototype.slice.call(arguments); - var dates = dirtyDates.map(function (dirtyDate) { - return parse(dirtyDate); - }); - var earliestTimestamp = Math.min.apply(null, dates); - return new Date(earliestTimestamp); - } - module.exports = min; - - - -/***/ }, -/* 135 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function setDate(dirtyDate, dirtyDayOfMonth) { - var date = parse(dirtyDate); - var dayOfMonth = Number(dirtyDayOfMonth); - date.setDate(dayOfMonth); - return date; - } - module.exports = setDate; - - - -/***/ }, -/* 136 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - var addDays = __webpack_require__(1); - function setDay(dirtyDate, dirtyDay, dirtyOptions) { - var weekStartsOn = dirtyOptions ? Number(dirtyOptions.weekStartsOn) || 0 : 0; - var date = parse(dirtyDate); - var day = Number(dirtyDay); - var currentDay = date.getDay(); - var remainder = day % 7; - var dayIndex = (remainder + 7) % 7; - var diff = (dayIndex < weekStartsOn ? 7 : 0) + day - currentDay; - return addDays(date, diff); - } - module.exports = setDay; - - - -/***/ }, -/* 137 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function setDayOfYear(dirtyDate, dirtyDayOfYear) { - var date = parse(dirtyDate); - var dayOfYear = Number(dirtyDayOfYear); - date.setMonth(0); - date.setDate(dayOfYear); - return date; - } - module.exports = setDayOfYear; - - - -/***/ }, -/* 138 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function setHours(dirtyDate, dirtyHours) { - var date = parse(dirtyDate); - var hours = Number(dirtyHours); - date.setHours(hours); - return date; - } - module.exports = setHours; - - - -/***/ }, -/* 139 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - var addDays = __webpack_require__(1); - var getISODay = __webpack_require__(76); - function setISODay(dirtyDate, dirtyDay) { - var date = parse(dirtyDate); - var day = Number(dirtyDay); - var currentDay = getISODay(date); - var diff = day - currentDay; - return addDays(date, diff); - } - module.exports = setISODay; - - - -/***/ }, -/* 140 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - var getISOWeek = __webpack_require__(69); - function setISOWeek(dirtyDate, dirtyISOWeek) { - var date = parse(dirtyDate); - var isoWeek = Number(dirtyISOWeek); - var diff = getISOWeek(date) - isoWeek; - date.setDate(date.getDate() - diff * 7); - return date; - } - module.exports = setISOWeek; - - - -/***/ }, -/* 141 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function setMilliseconds(dirtyDate, dirtyMilliseconds) { - var date = parse(dirtyDate); - var milliseconds = Number(dirtyMilliseconds); - date.setMilliseconds(milliseconds); - return date; - } - module.exports = setMilliseconds; - - - -/***/ }, -/* 142 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function setMinutes(dirtyDate, dirtyMinutes) { - var date = parse(dirtyDate); - var minutes = Number(dirtyMinutes); - date.setMinutes(minutes); - return date; - } - module.exports = setMinutes; - - - -/***/ }, -/* 143 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - var getDaysInMonth = __webpack_require__(17); - function setMonth(dirtyDate, dirtyMonth) { - var date = parse(dirtyDate); - var month = Number(dirtyMonth); - var year = date.getFullYear(); - var day = date.getDate(); - var dateWithDesiredMonth = new Date(0); - dateWithDesiredMonth.setFullYear(year, month, 15); - dateWithDesiredMonth.setHours(0, 0, 0, 0); - var daysInMonth = getDaysInMonth(dateWithDesiredMonth); - date.setMonth(month, Math.min(day, daysInMonth)); - return date; - } - module.exports = setMonth; - - - -/***/ }, -/* 144 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - var setMonth = __webpack_require__(143); - function setQuarter(dirtyDate, dirtyQuarter) { - var date = parse(dirtyDate); - var quarter = Number(dirtyQuarter); - var oldQuarter = Math.floor(date.getMonth() / 3) + 1; - var diff = quarter - oldQuarter; - return setMonth(date, date.getMonth() + diff * 3); - } - module.exports = setQuarter; - - - -/***/ }, -/* 145 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function setSeconds(dirtyDate, dirtySeconds) { - var date = parse(dirtyDate); - var seconds = Number(dirtySeconds); - date.setSeconds(seconds); - return date; - } - module.exports = setSeconds; - - - -/***/ }, -/* 146 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function setYear(dirtyDate, dirtyYear) { - var date = parse(dirtyDate); - var year = Number(dirtyYear); - date.setFullYear(year); - return date; - } - module.exports = setYear; - - - -/***/ }, -/* 147 */ -/***/ function(module, exports, __webpack_require__) { - - var parse = __webpack_require__(2); - function startOfMonth(dirtyDate) { - var date = parse(dirtyDate); - date.setDate(1); - date.setHours(0, 0, 0, 0); - return date; - } - module.exports = startOfMonth; - - - -/***/ }, -/* 148 */ -/***/ function(module, exports, __webpack_require__) { - - var startOfDay = __webpack_require__(14); - function startOfToday() { - return startOfDay(new Date()); - } - module.exports = startOfToday; - - - -/***/ }, -/* 149 */ -/***/ function(module, exports) { - - function startOfTomorrow() { - var now = new Date(); - var year = now.getFullYear(); - var month = now.getMonth(); - var day = now.getDate(); - var date = new Date(0); - date.setFullYear(year, month, day + 1); - date.setHours(0, 0, 0, 0); - return date; - } - module.exports = startOfTomorrow; - - - -/***/ }, -/* 150 */ -/***/ function(module, exports) { - - function startOfYesterday() { - var now = new Date(); - var year = now.getFullYear(); - var month = now.getMonth(); - var day = now.getDate(); - var date = new Date(0); - date.setFullYear(year, month, day - 1); - date.setHours(0, 0, 0, 0); - return date; - } - module.exports = startOfYesterday; - - - -/***/ }, -/* 151 */ -/***/ function(module, exports, __webpack_require__) { - - var addDays = __webpack_require__(1); - function subDays(dirtyDate, dirtyAmount) { - var amount = Number(dirtyAmount); - return addDays(dirtyDate, -amount); - } - module.exports = subDays; - - - -/***/ }, -/* 152 */ -/***/ function(module, exports, __webpack_require__) { - - var addHours = __webpack_require__(5); - function subHours(dirtyDate, dirtyAmount) { - var amount = Number(dirtyAmount); - return addHours(dirtyDate, -amount); - } - module.exports = subHours; - - - -/***/ }, -/* 153 */ -/***/ function(module, exports, __webpack_require__) { - - var addMilliseconds = __webpack_require__(6); - function subMilliseconds(dirtyDate, dirtyAmount) { - var amount = Number(dirtyAmount); - return addMilliseconds(dirtyDate, -amount); - } - module.exports = subMilliseconds; - - - -/***/ }, -/* 154 */ -/***/ function(module, exports, __webpack_require__) { - - var addMinutes = __webpack_require__(15); - function subMinutes(dirtyDate, dirtyAmount) { - var amount = Number(dirtyAmount); - return addMinutes(dirtyDate, -amount); - } - module.exports = subMinutes; - - - -/***/ }, -/* 155 */ -/***/ function(module, exports, __webpack_require__) { - - var addMonths = __webpack_require__(16); - function subMonths(dirtyDate, dirtyAmount) { - var amount = Number(dirtyAmount); - return addMonths(dirtyDate, -amount); - } - module.exports = subMonths; - - - -/***/ }, -/* 156 */ -/***/ function(module, exports, __webpack_require__) { - - var addQuarters = __webpack_require__(18); - function subQuarters(dirtyDate, dirtyAmount) { - var amount = Number(dirtyAmount); - return addQuarters(dirtyDate, -amount); - } - module.exports = subQuarters; - - - -/***/ }, -/* 157 */ -/***/ function(module, exports, __webpack_require__) { - - var addSeconds = __webpack_require__(19); - function subSeconds(dirtyDate, dirtyAmount) { - var amount = Number(dirtyAmount); - return addSeconds(dirtyDate, -amount); - } - module.exports = subSeconds; - - - -/***/ }, -/* 158 */ -/***/ function(module, exports, __webpack_require__) { - - var addWeeks = __webpack_require__(20); - function subWeeks(dirtyDate, dirtyAmount) { - var amount = Number(dirtyAmount); - return addWeeks(dirtyDate, -amount); - } - module.exports = subWeeks; - - - -/***/ }, -/* 159 */ -/***/ function(module, exports, __webpack_require__) { - - var addYears = __webpack_require__(21); - function subYears(dirtyDate, dirtyAmount) { - var amount = Number(dirtyAmount); - return addYears(dirtyDate, -amount); - } - module.exports = subYears; - - - -/***/ } -/******/ ]) -}); -; -//# sourceMappingURL=date_fns.js.map \ No newline at end of file +import format from "date-fns/format"; +import distanceInWordsToNow from "date-fns/distance_in_words_to_now"; + +if (typeof self !== "undefined") { init(self); } +else if (typeof global !== "undefined") { init(global); } +else if (typeof window !== "undefined") { init(window); } +else { throw new Error("unsupported execution environment"); } + +function init(g) { + g.dateFns = { + format, + distanceInWordsToNow + }; +} diff --git a/frontend/vendor/datefns/datefns.min.js b/frontend/vendor/datefns/datefns.min.js deleted file mode 100644 index 66c339224..000000000 --- a/frontend/vendor/datefns/datefns.min.js +++ /dev/null @@ -1,4 +0,0 @@ -(function webpackUniversalModuleDefinition(root,factory){if(typeof exports==="object"&&typeof module==="object")module.exports=factory();else if(typeof define==="function"&&define.amd)define([],factory);else if(typeof exports==="object")exports["dateFns"]=factory();else root["dateFns"]=factory()})(this,function(){return function(modules){var installedModules={};function __webpack_require__(moduleId){if(installedModules[moduleId])return installedModules[moduleId].exports;var module=installedModules[moduleId]={exports:{},id:moduleId,loaded:false};modules[moduleId].call(module.exports,module,module.exports,__webpack_require__);module.loaded=true;return module.exports}__webpack_require__.m=modules;__webpack_require__.c=installedModules;__webpack_require__.p="";return __webpack_require__(0)}([function(module,exports,__webpack_require__){module.exports={addDays:__webpack_require__(1),addHours:__webpack_require__(5),addISOYears:__webpack_require__(7),addMilliseconds:__webpack_require__(6),addMinutes:__webpack_require__(15),addMonths:__webpack_require__(16),addQuarters:__webpack_require__(18),addSeconds:__webpack_require__(19),addWeeks:__webpack_require__(20),addYears:__webpack_require__(21),areRangesOverlapping:__webpack_require__(22),closestIndexTo:__webpack_require__(23),closestTo:__webpack_require__(24),compareAsc:__webpack_require__(25),compareDesc:__webpack_require__(26),differenceInCalendarDays:__webpack_require__(13),differenceInCalendarISOWeeks:__webpack_require__(27),differenceInCalendarISOYears:__webpack_require__(28),differenceInCalendarMonths:__webpack_require__(29),differenceInCalendarQuarters:__webpack_require__(30),differenceInCalendarWeeks:__webpack_require__(32),differenceInCalendarYears:__webpack_require__(33),differenceInDays:__webpack_require__(34),differenceInHours:__webpack_require__(35),differenceInISOYears:__webpack_require__(37),differenceInMilliseconds:__webpack_require__(36),differenceInMinutes:__webpack_require__(39),differenceInMonths:__webpack_require__(40),differenceInQuarters:__webpack_require__(41),differenceInSeconds:__webpack_require__(42),differenceInWeeks:__webpack_require__(43),differenceInYears:__webpack_require__(44),distanceInWords:__webpack_require__(45),distanceInWordsStrict:__webpack_require__(50),distanceInWordsToNow:__webpack_require__(51),eachDay:__webpack_require__(52),endOfDay:__webpack_require__(53),endOfHour:__webpack_require__(54),endOfISOWeek:__webpack_require__(55),endOfISOYear:__webpack_require__(57),endOfMinute:__webpack_require__(58),endOfMonth:__webpack_require__(59),endOfQuarter:__webpack_require__(60),endOfSecond:__webpack_require__(61),endOfToday:__webpack_require__(62),endOfTomorrow:__webpack_require__(63),endOfWeek:__webpack_require__(56),endOfYear:__webpack_require__(64),endOfYesterday:__webpack_require__(65),format:__webpack_require__(66),getDate:__webpack_require__(71),getDay:__webpack_require__(72),getDayOfYear:__webpack_require__(67),getDaysInMonth:__webpack_require__(17),getDaysInYear:__webpack_require__(73),getHours:__webpack_require__(75),getISODay:__webpack_require__(76),getISOWeek:__webpack_require__(69),getISOWeeksInYear:__webpack_require__(77),getISOYear:__webpack_require__(8),getMilliseconds:__webpack_require__(78),getMinutes:__webpack_require__(79),getMonth:__webpack_require__(80),getOverlappingDaysInRanges:__webpack_require__(81),getQuarter:__webpack_require__(31),getSeconds:__webpack_require__(82),getTime:__webpack_require__(83),getYear:__webpack_require__(84),isAfter:__webpack_require__(85),isBefore:__webpack_require__(86),isDate:__webpack_require__(4),isEqual:__webpack_require__(87),isFirstDayOfMonth:__webpack_require__(88),isFriday:__webpack_require__(89),isFuture:__webpack_require__(90),isLastDayOfMonth:__webpack_require__(91),isLeapYear:__webpack_require__(74),isMonday:__webpack_require__(92),isPast:__webpack_require__(93),isSameDay:__webpack_require__(94),isSameHour:__webpack_require__(95),isSameISOWeek:__webpack_require__(97),isSameISOYear:__webpack_require__(99),isSameMinute:__webpack_require__(100),isSameMonth:__webpack_require__(102),isSameQuarter:__webpack_require__(103),isSameSecond:__webpack_require__(105),isSameWeek:__webpack_require__(98),isSameYear:__webpack_require__(107),isSaturday:__webpack_require__(108),isSunday:__webpack_require__(109),isThisHour:__webpack_require__(110),isThisISOWeek:__webpack_require__(111),isThisISOYear:__webpack_require__(112),isThisMinute:__webpack_require__(113),isThisMonth:__webpack_require__(114),isThisQuarter:__webpack_require__(115),isThisSecond:__webpack_require__(116),isThisWeek:__webpack_require__(117),isThisYear:__webpack_require__(118),isThursday:__webpack_require__(119),isToday:__webpack_require__(120),isTomorrow:__webpack_require__(121),isTuesday:__webpack_require__(122),isValid:__webpack_require__(70),isWednesday:__webpack_require__(123),isWeekend:__webpack_require__(124),isWithinRange:__webpack_require__(125),isYesterday:__webpack_require__(126),lastDayOfISOWeek:__webpack_require__(127),lastDayOfISOYear:__webpack_require__(129),lastDayOfMonth:__webpack_require__(130),lastDayOfQuarter:__webpack_require__(131),lastDayOfWeek:__webpack_require__(128),lastDayOfYear:__webpack_require__(132),max:__webpack_require__(133),min:__webpack_require__(134),parse:__webpack_require__(2),setDate:__webpack_require__(135),setDay:__webpack_require__(136),setDayOfYear:__webpack_require__(137),setHours:__webpack_require__(138),setISODay:__webpack_require__(139),setISOWeek:__webpack_require__(140),setISOYear:__webpack_require__(11),setMilliseconds:__webpack_require__(141),setMinutes:__webpack_require__(142),setMonth:__webpack_require__(143),setQuarter:__webpack_require__(144),setSeconds:__webpack_require__(145),setYear:__webpack_require__(146),startOfDay:__webpack_require__(14),startOfHour:__webpack_require__(96),startOfISOWeek:__webpack_require__(9),startOfISOYear:__webpack_require__(12),startOfMinute:__webpack_require__(101),startOfMonth:__webpack_require__(147),startOfQuarter:__webpack_require__(104),startOfSecond:__webpack_require__(106),startOfToday:__webpack_require__(148),startOfTomorrow:__webpack_require__(149),startOfWeek:__webpack_require__(10),startOfYear:__webpack_require__(68),startOfYesterday:__webpack_require__(150),subDays:__webpack_require__(151),subHours:__webpack_require__(152),subISOYears:__webpack_require__(38),subMilliseconds:__webpack_require__(153),subMinutes:__webpack_require__(154),subMonths:__webpack_require__(155),subQuarters:__webpack_require__(156),subSeconds:__webpack_require__(157),subWeeks:__webpack_require__(158),subYears:__webpack_require__(159)}},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function addDays(dirtyDate,dirtyAmount){var date=parse(dirtyDate);var amount=Number(dirtyAmount);date.setDate(date.getDate()+amount);return date}module.exports=addDays},function(module,exports,__webpack_require__){var getTimezoneOffsetInMilliseconds=__webpack_require__(3);var isDate=__webpack_require__(4);var MILLISECONDS_IN_HOUR=36e5;var MILLISECONDS_IN_MINUTE=6e4;var DEFAULT_ADDITIONAL_DIGITS=2;var parseTokenDateTimeDelimeter=/[T ]/;var parseTokenPlainTime=/:/;var parseTokenYY=/^(\d{2})$/;var parseTokensYYY=[/^([+-]\d{2})$/,/^([+-]\d{3})$/,/^([+-]\d{4})$/];var parseTokenYYYY=/^(\d{4})/;var parseTokensYYYYY=[/^([+-]\d{4})/,/^([+-]\d{5})/,/^([+-]\d{6})/];var parseTokenMM=/^-(\d{2})$/;var parseTokenDDD=/^-?(\d{3})$/;var parseTokenMMDD=/^-?(\d{2})-?(\d{2})$/;var parseTokenWww=/^-?W(\d{2})$/;var parseTokenWwwD=/^-?W(\d{2})-?(\d{1})$/;var parseTokenHH=/^(\d{2}([.,]\d*)?)$/;var parseTokenHHMM=/^(\d{2}):?(\d{2}([.,]\d*)?)$/;var parseTokenHHMMSS=/^(\d{2}):?(\d{2}):?(\d{2}([.,]\d*)?)$/;var parseTokenTimezone=/([Z+-].*)$/;var parseTokenTimezoneZ=/^(Z)$/;var parseTokenTimezoneHH=/^([+-])(\d{2})$/;var parseTokenTimezoneHHMM=/^([+-])(\d{2}):?(\d{2})$/;function parse(argument,dirtyOptions){if(isDate(argument)){return new Date(argument.getTime())}else if(typeof argument!=="string"){return new Date(argument)}var options=dirtyOptions||{};var additionalDigits=options.additionalDigits;if(additionalDigits==null){additionalDigits=DEFAULT_ADDITIONAL_DIGITS}else{additionalDigits=Number(additionalDigits)}var dateStrings=splitDateString(argument);var parseYearResult=parseYear(dateStrings.date,additionalDigits);var year=parseYearResult.year;var restDateString=parseYearResult.restDateString;var date=parseDate(restDateString,year);if(date){var timestamp=date.getTime();var time=0;var offset;if(dateStrings.time){time=parseTime(dateStrings.time)}if(dateStrings.timezone){offset=parseTimezone(dateStrings.timezone)*MILLISECONDS_IN_MINUTE}else{var fullTime=timestamp+time;var fullTimeDate=new Date(fullTime);offset=getTimezoneOffsetInMilliseconds(fullTimeDate);var fullTimeDateNextDay=new Date(fullTime);fullTimeDateNextDay.setDate(fullTimeDate.getDate()+1);var offsetDiff=getTimezoneOffsetInMilliseconds(fullTimeDateNextDay)-getTimezoneOffsetInMilliseconds(fullTimeDate);if(offsetDiff>0){offset+=offsetDiff}}return new Date(timestamp+time+offset)}else{return new Date(argument)}}function splitDateString(dateString){var dateStrings={};var array=dateString.split(parseTokenDateTimeDelimeter);var timeString;if(parseTokenPlainTime.test(array[0])){dateStrings.date=null;timeString=array[0]}else{dateStrings.date=array[0];timeString=array[1]}if(timeString){var token=parseTokenTimezone.exec(timeString);if(token){dateStrings.time=timeString.replace(token[1],"");dateStrings.timezone=token[1]}else{dateStrings.time=timeString}}return dateStrings}function parseYear(dateString,additionalDigits){var parseTokenYYY=parseTokensYYY[additionalDigits];var parseTokenYYYYY=parseTokensYYYYY[additionalDigits];var token;token=parseTokenYYYY.exec(dateString)||parseTokenYYYYY.exec(dateString);if(token){var yearString=token[1];return{year:parseInt(yearString,10),restDateString:dateString.slice(yearString.length)}}token=parseTokenYY.exec(dateString)||parseTokenYYY.exec(dateString);if(token){var centuryString=token[1];return{year:parseInt(centuryString,10)*100,restDateString:dateString.slice(centuryString.length)}}return{year:null}}function parseDate(dateString,year){if(year===null){return null}var token;var date;var month;var week;if(dateString.length===0){date=new Date(0);date.setUTCFullYear(year);return date}token=parseTokenMM.exec(dateString);if(token){date=new Date(0);month=parseInt(token[1],10)-1;date.setUTCFullYear(year,month);return date}token=parseTokenDDD.exec(dateString);if(token){date=new Date(0);var dayOfYear=parseInt(token[1],10);date.setUTCFullYear(year,0,dayOfYear);return date}token=parseTokenMMDD.exec(dateString);if(token){date=new Date(0);month=parseInt(token[1],10)-1;var day=parseInt(token[2],10);date.setUTCFullYear(year,month,day);return date}token=parseTokenWww.exec(dateString);if(token){week=parseInt(token[1],10)-1;return dayOfISOYear(year,week)}token=parseTokenWwwD.exec(dateString);if(token){week=parseInt(token[1],10)-1;var dayOfWeek=parseInt(token[2],10)-1;return dayOfISOYear(year,week,dayOfWeek)}return null}function parseTime(timeString){var token;var hours;var minutes;token=parseTokenHH.exec(timeString);if(token){hours=parseFloat(token[1].replace(",","."));return hours%24*MILLISECONDS_IN_HOUR}token=parseTokenHHMM.exec(timeString);if(token){hours=parseInt(token[1],10);minutes=parseFloat(token[2].replace(",","."));return hours%24*MILLISECONDS_IN_HOUR+minutes*MILLISECONDS_IN_MINUTE}token=parseTokenHHMMSS.exec(timeString);if(token){hours=parseInt(token[1],10);minutes=parseInt(token[2],10);var seconds=parseFloat(token[3].replace(",","."));return hours%24*MILLISECONDS_IN_HOUR+minutes*MILLISECONDS_IN_MINUTE+seconds*1e3}return null}function parseTimezone(timezoneString){var token;var absoluteOffset;token=parseTokenTimezoneZ.exec(timezoneString);if(token){return 0}token=parseTokenTimezoneHH.exec(timezoneString);if(token){absoluteOffset=parseInt(token[2],10)*60;return token[1]==="+"?-absoluteOffset:absoluteOffset}token=parseTokenTimezoneHHMM.exec(timezoneString);if(token){absoluteOffset=parseInt(token[2],10)*60+parseInt(token[3],10);return token[1]==="+"?-absoluteOffset:absoluteOffset}return 0}function dayOfISOYear(isoYear,week,day){week=week||0;day=day||0;var date=new Date(0);date.setUTCFullYear(isoYear,0,4);var fourthOfJanuaryDay=date.getUTCDay()||7;var diff=week*7+day+1-fourthOfJanuaryDay;date.setUTCDate(date.getUTCDate()+diff);return date}module.exports=parse},function(module,exports){var MILLISECONDS_IN_MINUTE=6e4;module.exports=function getTimezoneOffsetInMilliseconds(dirtyDate){var date=new Date(dirtyDate.getTime());var baseTimezoneOffset=date.getTimezoneOffset();date.setSeconds(0,0);var millisecondsPartOfTimezoneOffset=date.getTime()%MILLISECONDS_IN_MINUTE;return baseTimezoneOffset*MILLISECONDS_IN_MINUTE+millisecondsPartOfTimezoneOffset}},function(module,exports){function isDate(argument){return argument instanceof Date}module.exports=isDate},function(module,exports,__webpack_require__){var addMilliseconds=__webpack_require__(6);var MILLISECONDS_IN_HOUR=36e5;function addHours(dirtyDate,dirtyAmount){var amount=Number(dirtyAmount);return addMilliseconds(dirtyDate,amount*MILLISECONDS_IN_HOUR)}module.exports=addHours},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function addMilliseconds(dirtyDate,dirtyAmount){var timestamp=parse(dirtyDate).getTime();var amount=Number(dirtyAmount);return new Date(timestamp+amount)}module.exports=addMilliseconds},function(module,exports,__webpack_require__){var getISOYear=__webpack_require__(8);var setISOYear=__webpack_require__(11);function addISOYears(dirtyDate,dirtyAmount){var amount=Number(dirtyAmount);return setISOYear(dirtyDate,getISOYear(dirtyDate)+amount)}module.exports=addISOYears},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);var startOfISOWeek=__webpack_require__(9);function getISOYear(dirtyDate){var date=parse(dirtyDate);var year=date.getFullYear();var fourthOfJanuaryOfNextYear=new Date(0);fourthOfJanuaryOfNextYear.setFullYear(year+1,0,4);fourthOfJanuaryOfNextYear.setHours(0,0,0,0);var startOfNextYear=startOfISOWeek(fourthOfJanuaryOfNextYear);var fourthOfJanuaryOfThisYear=new Date(0);fourthOfJanuaryOfThisYear.setFullYear(year,0,4);fourthOfJanuaryOfThisYear.setHours(0,0,0,0);var startOfThisYear=startOfISOWeek(fourthOfJanuaryOfThisYear);if(date.getTime()>=startOfNextYear.getTime()){return year+1}else if(date.getTime()>=startOfThisYear.getTime()){return year}else{return year-1}}module.exports=getISOYear},function(module,exports,__webpack_require__){var startOfWeek=__webpack_require__(10);function startOfISOWeek(dirtyDate){return startOfWeek(dirtyDate,{weekStartsOn:1})}module.exports=startOfISOWeek},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function startOfWeek(dirtyDate,dirtyOptions){var weekStartsOn=dirtyOptions?Number(dirtyOptions.weekStartsOn)||0:0;var date=parse(dirtyDate);var day=date.getDay();var diff=(dayinitialEndTime||comparedStartTime>comparedEndTime){throw new Error("The start of the range cannot be after the end of the range")}return initialStartTimetimeRight){return 1}else{return 0}}module.exports=compareAsc},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function compareDesc(dirtyDateLeft,dirtyDateRight){var dateLeft=parse(dirtyDateLeft);var timeLeft=dateLeft.getTime();var dateRight=parse(dirtyDateRight);var timeRight=dateRight.getTime();if(timeLeft>timeRight){return-1}else if(timeLeft0?Math.floor(diff):Math.ceil(diff)}module.exports=differenceInHours},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function differenceInMilliseconds(dirtyDateLeft,dirtyDateRight){var dateLeft=parse(dirtyDateLeft);var dateRight=parse(dirtyDateRight);return dateLeft.getTime()-dateRight.getTime()}module.exports=differenceInMilliseconds},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);var differenceInCalendarISOYears=__webpack_require__(28);var compareAsc=__webpack_require__(25);var subISOYears=__webpack_require__(38);function differenceInISOYears(dirtyDateLeft,dirtyDateRight){var dateLeft=parse(dirtyDateLeft);var dateRight=parse(dirtyDateRight);var sign=compareAsc(dateLeft,dateRight);var difference=Math.abs(differenceInCalendarISOYears(dateLeft,dateRight));dateLeft=subISOYears(dateLeft,sign*difference);var isLastISOYearNotFull=compareAsc(dateLeft,dateRight)===-sign;return sign*(difference-isLastISOYearNotFull)}module.exports=differenceInISOYears},function(module,exports,__webpack_require__){var addISOYears=__webpack_require__(7);function subISOYears(dirtyDate,dirtyAmount){var amount=Number(dirtyAmount);return addISOYears(dirtyDate,-amount)}module.exports=subISOYears},function(module,exports,__webpack_require__){var differenceInMilliseconds=__webpack_require__(36);var MILLISECONDS_IN_MINUTE=6e4;function differenceInMinutes(dirtyDateLeft,dirtyDateRight){var diff=differenceInMilliseconds(dirtyDateLeft,dirtyDateRight)/MILLISECONDS_IN_MINUTE;return diff>0?Math.floor(diff):Math.ceil(diff)}module.exports=differenceInMinutes},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);var differenceInCalendarMonths=__webpack_require__(29);var compareAsc=__webpack_require__(25);function differenceInMonths(dirtyDateLeft,dirtyDateRight){var dateLeft=parse(dirtyDateLeft);var dateRight=parse(dirtyDateRight);var sign=compareAsc(dateLeft,dateRight);var difference=Math.abs(differenceInCalendarMonths(dateLeft,dateRight));dateLeft.setMonth(dateLeft.getMonth()-sign*difference);var isLastMonthNotFull=compareAsc(dateLeft,dateRight)===-sign;return sign*(difference-isLastMonthNotFull)}module.exports=differenceInMonths},function(module,exports,__webpack_require__){var differenceInMonths=__webpack_require__(40);function differenceInQuarters(dirtyDateLeft,dirtyDateRight){var diff=differenceInMonths(dirtyDateLeft,dirtyDateRight)/3;return diff>0?Math.floor(diff):Math.ceil(diff)}module.exports=differenceInQuarters},function(module,exports,__webpack_require__){var differenceInMilliseconds=__webpack_require__(36);function differenceInSeconds(dirtyDateLeft,dirtyDateRight){var diff=differenceInMilliseconds(dirtyDateLeft,dirtyDateRight)/1e3;return diff>0?Math.floor(diff):Math.ceil(diff)}module.exports=differenceInSeconds},function(module,exports,__webpack_require__){var differenceInDays=__webpack_require__(34);function differenceInWeeks(dirtyDateLeft,dirtyDateRight){var diff=differenceInDays(dirtyDateLeft,dirtyDateRight)/7;return diff>0?Math.floor(diff):Math.ceil(diff)}module.exports=differenceInWeeks},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);var differenceInCalendarYears=__webpack_require__(33);var compareAsc=__webpack_require__(25);function differenceInYears(dirtyDateLeft,dirtyDateRight){var dateLeft=parse(dirtyDateLeft);var dateRight=parse(dirtyDateRight);var sign=compareAsc(dateLeft,dateRight);var difference=Math.abs(differenceInCalendarYears(dateLeft,dateRight));dateLeft.setFullYear(dateLeft.getFullYear()-sign*difference);var isLastYearNotFull=compareAsc(dateLeft,dateRight)===-sign;return sign*(difference-isLastYearNotFull)}module.exports=differenceInYears},function(module,exports,__webpack_require__){var compareDesc=__webpack_require__(26);var parse=__webpack_require__(2);var differenceInSeconds=__webpack_require__(42);var differenceInMonths=__webpack_require__(40);var enLocale=__webpack_require__(46);var MINUTES_IN_DAY=1440;var MINUTES_IN_ALMOST_TWO_DAYS=2520;var MINUTES_IN_MONTH=43200;var MINUTES_IN_TWO_MONTHS=86400;function distanceInWords(dirtyDateToCompare,dirtyDate,dirtyOptions){var options=dirtyOptions||{};var comparison=compareDesc(dirtyDateToCompare,dirtyDate);var locale=options.locale;var localize=enLocale.distanceInWords.localize;if(locale&&locale.distanceInWords&&locale.distanceInWords.localize){localize=locale.distanceInWords.localize}var localizeOptions={addSuffix:Boolean(options.addSuffix),comparison:comparison};var dateLeft,dateRight;if(comparison>0){dateLeft=parse(dirtyDateToCompare);dateRight=parse(dirtyDate)}else{dateLeft=parse(dirtyDate);dateRight=parse(dirtyDateToCompare)}var seconds=differenceInSeconds(dateRight,dateLeft);var offset=dateRight.getTimezoneOffset()-dateLeft.getTimezoneOffset();var minutes=Math.round(seconds/60)-offset;var months;if(minutes<2){if(options.includeSeconds){if(seconds<5){return localize("lessThanXSeconds",5,localizeOptions)}else if(seconds<10){return localize("lessThanXSeconds",10,localizeOptions)}else if(seconds<20){return localize("lessThanXSeconds",20,localizeOptions)}else if(seconds<40){return localize("halfAMinute",null,localizeOptions)}else if(seconds<60){return localize("lessThanXMinutes",1,localizeOptions)}else{return localize("xMinutes",1,localizeOptions)}}else{if(minutes===0){return localize("lessThanXMinutes",1,localizeOptions)}else{return localize("xMinutes",minutes,localizeOptions)}}}else if(minutes<45){return localize("xMinutes",minutes,localizeOptions)}else if(minutes<90){return localize("aboutXHours",1,localizeOptions)}else if(minutes0){return"in "+result}else{return result+" ago"}}return result}return{localize:localize}}module.exports=buildDistanceInWordsLocale},function(module,exports,__webpack_require__){var buildFormattingTokensRegExp=__webpack_require__(49);function buildFormatLocale(){var months3char=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];var monthsFull=["January","February","March","April","May","June","July","August","September","October","November","December"];var weekdays2char=["Su","Mo","Tu","We","Th","Fr","Sa"];var weekdays3char=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];var weekdaysFull=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];var meridiemUppercase=["AM","PM"];var meridiemLowercase=["am","pm"];var meridiemFull=["a.m.","p.m."];var formatters={MMM:function(date){return months3char[date.getMonth()]},MMMM:function(date){return monthsFull[date.getMonth()]},dd:function(date){return weekdays2char[date.getDay()]},ddd:function(date){return weekdays3char[date.getDay()]},dddd:function(date){return weekdaysFull[date.getDay()]},A:function(date){return date.getHours()/12>=1?meridiemUppercase[1]:meridiemUppercase[0]},a:function(date){return date.getHours()/12>=1?meridiemLowercase[1]:meridiemLowercase[0]},aa:function(date){return date.getHours()/12>=1?meridiemFull[1]:meridiemFull[0]}};var ordinalFormatters=["M","D","DDD","d","Q","W"];ordinalFormatters.forEach(function(formatterToken){formatters[formatterToken+"o"]=function(date,formatters){return ordinal(formatters[formatterToken](date))}});return{formatters:formatters,formattingTokensRegExp:buildFormattingTokensRegExp(formatters)}}function ordinal(number){var rem100=number%100;if(rem100>20||rem100<10){switch(rem100%10){case 1:return number+"st";case 2:return number+"nd";case 3:return number+"rd"}}return number+"th"}module.exports=buildFormatLocale},function(module,exports){var commonFormatterKeys=["M","MM","Q","D","DD","DDD","DDDD","d","E","W","WW","YY","YYYY","GG","GGGG","H","HH","h","hh","m","mm","s","ss","S","SS","SSS","Z","ZZ","X","x"];function buildFormattingTokensRegExp(formatters){var formatterKeys=[];for(var key in formatters){if(formatters.hasOwnProperty(key)){formatterKeys.push(key)}}var formattingTokens=commonFormatterKeys.concat(formatterKeys).sort().reverse();var formattingTokensRegExp=new RegExp("(\\[[^\\[]*\\])|(\\\\)?"+"("+formattingTokens.join("|")+"|.)","g");return formattingTokensRegExp}module.exports=buildFormattingTokensRegExp},function(module,exports,__webpack_require__){var compareDesc=__webpack_require__(26);var parse=__webpack_require__(2);var differenceInSeconds=__webpack_require__(42);var enLocale=__webpack_require__(46);var MINUTES_IN_DAY=1440;var MINUTES_IN_MONTH=43200;var MINUTES_IN_YEAR=525600;function distanceInWordsStrict(dirtyDateToCompare,dirtyDate,dirtyOptions){var options=dirtyOptions||{};var comparison=compareDesc(dirtyDateToCompare,dirtyDate);var locale=options.locale;var localize=enLocale.distanceInWords.localize;if(locale&&locale.distanceInWords&&locale.distanceInWords.localize){localize=locale.distanceInWords.localize}var localizeOptions={addSuffix:Boolean(options.addSuffix),comparison:comparison};var dateLeft,dateRight;if(comparison>0){dateLeft=parse(dirtyDateToCompare);dateRight=parse(dirtyDate)}else{dateLeft=parse(dirtyDate);dateRight=parse(dirtyDateToCompare)}var unit;var mathPartial=Math[options.partialMethod?String(options.partialMethod):"floor"];var seconds=differenceInSeconds(dateRight,dateLeft);var offset=dateRight.getTimezoneOffset()-dateLeft.getTimezoneOffset();var minutes=mathPartial(seconds/60)-offset;var hours,days,months,years;if(options.unit){unit=String(options.unit)}else{if(minutes<1){unit="s"}else if(minutes<60){unit="m"}else if(minutesendTime){throw new Error("The first date cannot be after the second date")}var dates=[];var currentDate=startDate;currentDate.setHours(0,0,0,0);while(currentDate.getTime()<=endTime){dates.push(parse(currentDate));currentDate.setDate(currentDate.getDate()+step)}return dates}module.exports=eachDay},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function endOfDay(dirtyDate){var date=parse(dirtyDate);date.setHours(23,59,59,999);return date}module.exports=endOfDay},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function endOfHour(dirtyDate){var date=parse(dirtyDate);date.setMinutes(59,59,999);return date}module.exports=endOfHour},function(module,exports,__webpack_require__){var endOfWeek=__webpack_require__(56);function endOfISOWeek(dirtyDate){return endOfWeek(dirtyDate,{weekStartsOn:1})}module.exports=endOfISOWeek},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function endOfWeek(dirtyDate,dirtyOptions){var weekStartsOn=dirtyOptions?Number(dirtyOptions.weekStartsOn)||0:0;var date=parse(dirtyDate);var day=date.getDay();var diff=(day12){return hours%12}else{return hours}},hh:function(date){return addLeadingZeros(formatters["h"](date),2)},m:function(date){return date.getMinutes()},mm:function(date){return addLeadingZeros(date.getMinutes(),2)},s:function(date){return date.getSeconds()},ss:function(date){return addLeadingZeros(date.getSeconds(),2)},S:function(date){return Math.floor(date.getMilliseconds()/100)},SS:function(date){return addLeadingZeros(Math.floor(date.getMilliseconds()/10),2)},SSS:function(date){return addLeadingZeros(date.getMilliseconds(),3)},Z:function(date){return formatTimezone(date.getTimezoneOffset(),":")},ZZ:function(date){return formatTimezone(date.getTimezoneOffset())},X:function(date){return Math.floor(date.getTime()/1e3)},x:function(date){return date.getTime()}};function buildFormatFn(formatStr,localeFormatters,formattingTokensRegExp){var array=formatStr.match(formattingTokensRegExp);var length=array.length;var i;var formatter;for(i=0;i0?"-":"+";var absOffset=Math.abs(offset);var hours=Math.floor(absOffset/60);var minutes=absOffset%60;return sign+addLeadingZeros(hours,2)+delimeter+addLeadingZeros(minutes,2)}function addLeadingZeros(number,targetLength){var output=Math.abs(number).toString();while(output.lengthinitialEndTime||comparedStartTime>comparedEndTime){throw new Error("The start of the range cannot be after the end of the range")}var isOverlapping=initialStartTimeinitialEndTime?initialEndTime:comparedEndTime;var differenceInMs=overlapEndDate-overlapStartDate;return Math.ceil(differenceInMs/MILLISECONDS_IN_DAY)}module.exports=getOverlappingDaysInRanges},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function getSeconds(dirtyDate){var date=parse(dirtyDate);var seconds=date.getSeconds();return seconds}module.exports=getSeconds},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function getTime(dirtyDate){var date=parse(dirtyDate);var timestamp=date.getTime();return timestamp}module.exports=getTime},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function getYear(dirtyDate){var date=parse(dirtyDate);var year=date.getFullYear();return year}module.exports=getYear},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function isAfter(dirtyDate,dirtyDateToCompare){var date=parse(dirtyDate);var dateToCompare=parse(dirtyDateToCompare);return date.getTime()>dateToCompare.getTime()}module.exports=isAfter},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function isBefore(dirtyDate,dirtyDateToCompare){var date=parse(dirtyDate);var dateToCompare=parse(dirtyDateToCompare);return date.getTime()(new Date).getTime()}module.exports=isFuture},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);var endOfDay=__webpack_require__(53);var endOfMonth=__webpack_require__(59);function isLastDayOfMonth(dirtyDate){var date=parse(dirtyDate);return endOfDay(date).getTime()===endOfMonth(date).getTime()}module.exports=isLastDayOfMonth},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function isMonday(dirtyDate){return parse(dirtyDate).getDay()===1}module.exports=isMonday},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function isPast(dirtyDate){return parse(dirtyDate).getTime()<(new Date).getTime()}module.exports=isPast},function(module,exports,__webpack_require__){var startOfDay=__webpack_require__(14);function isSameDay(dirtyDateLeft,dirtyDateRight){var dateLeftStartOfDay=startOfDay(dirtyDateLeft);var dateRightStartOfDay=startOfDay(dirtyDateRight);return dateLeftStartOfDay.getTime()===dateRightStartOfDay.getTime()}module.exports=isSameDay},function(module,exports,__webpack_require__){var startOfHour=__webpack_require__(96);function isSameHour(dirtyDateLeft,dirtyDateRight){var dateLeftStartOfHour=startOfHour(dirtyDateLeft);var dateRightStartOfHour=startOfHour(dirtyDateRight);return dateLeftStartOfHour.getTime()===dateRightStartOfHour.getTime()}module.exports=isSameHour},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function startOfHour(dirtyDate){var date=parse(dirtyDate);date.setMinutes(0,0,0);return date}module.exports=startOfHour},function(module,exports,__webpack_require__){var isSameWeek=__webpack_require__(98);function isSameISOWeek(dirtyDateLeft,dirtyDateRight){return isSameWeek(dirtyDateLeft,dirtyDateRight,{weekStartsOn:1})}module.exports=isSameISOWeek},function(module,exports,__webpack_require__){var startOfWeek=__webpack_require__(10);function isSameWeek(dirtyDateLeft,dirtyDateRight,dirtyOptions){var dateLeftStartOfWeek=startOfWeek(dirtyDateLeft,dirtyOptions);var dateRightStartOfWeek=startOfWeek(dirtyDateRight,dirtyOptions);return dateLeftStartOfWeek.getTime()===dateRightStartOfWeek.getTime()}module.exports=isSameWeek},function(module,exports,__webpack_require__){var startOfISOYear=__webpack_require__(12);function isSameISOYear(dirtyDateLeft,dirtyDateRight){var dateLeftStartOfYear=startOfISOYear(dirtyDateLeft);var dateRightStartOfYear=startOfISOYear(dirtyDateRight);return dateLeftStartOfYear.getTime()===dateRightStartOfYear.getTime()}module.exports=isSameISOYear},function(module,exports,__webpack_require__){var startOfMinute=__webpack_require__(101);function isSameMinute(dirtyDateLeft,dirtyDateRight){var dateLeftStartOfMinute=startOfMinute(dirtyDateLeft);var dateRightStartOfMinute=startOfMinute(dirtyDateRight);return dateLeftStartOfMinute.getTime()===dateRightStartOfMinute.getTime()}module.exports=isSameMinute},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function startOfMinute(dirtyDate){var date=parse(dirtyDate);date.setSeconds(0,0);return date}module.exports=startOfMinute},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function isSameMonth(dirtyDateLeft,dirtyDateRight){var dateLeft=parse(dirtyDateLeft);var dateRight=parse(dirtyDateRight);return dateLeft.getFullYear()===dateRight.getFullYear()&&dateLeft.getMonth()===dateRight.getMonth()}module.exports=isSameMonth},function(module,exports,__webpack_require__){var startOfQuarter=__webpack_require__(104);function isSameQuarter(dirtyDateLeft,dirtyDateRight){var dateLeftStartOfQuarter=startOfQuarter(dirtyDateLeft);var dateRightStartOfQuarter=startOfQuarter(dirtyDateRight);return dateLeftStartOfQuarter.getTime()===dateRightStartOfQuarter.getTime()}module.exports=isSameQuarter},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function startOfQuarter(dirtyDate){var date=parse(dirtyDate);var currentMonth=date.getMonth();var month=currentMonth-currentMonth%3;date.setMonth(month,1);date.setHours(0,0,0,0);return date}module.exports=startOfQuarter},function(module,exports,__webpack_require__){var startOfSecond=__webpack_require__(106);function isSameSecond(dirtyDateLeft,dirtyDateRight){var dateLeftStartOfSecond=startOfSecond(dirtyDateLeft);var dateRightStartOfSecond=startOfSecond(dirtyDateRight);return dateLeftStartOfSecond.getTime()===dateRightStartOfSecond.getTime()}module.exports=isSameSecond},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function startOfSecond(dirtyDate){var date=parse(dirtyDate);date.setMilliseconds(0);return date}module.exports=startOfSecond},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function isSameYear(dirtyDateLeft,dirtyDateRight){var dateLeft=parse(dirtyDateLeft);var dateRight=parse(dirtyDateRight);return dateLeft.getFullYear()===dateRight.getFullYear()}module.exports=isSameYear},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function isSaturday(dirtyDate){return parse(dirtyDate).getDay()===6}module.exports=isSaturday},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function isSunday(dirtyDate){return parse(dirtyDate).getDay()===0}module.exports=isSunday},function(module,exports,__webpack_require__){var isSameHour=__webpack_require__(95);function isThisHour(dirtyDate){return isSameHour(new Date,dirtyDate)}module.exports=isThisHour},function(module,exports,__webpack_require__){var isSameISOWeek=__webpack_require__(97);function isThisISOWeek(dirtyDate){return isSameISOWeek(new Date,dirtyDate)}module.exports=isThisISOWeek},function(module,exports,__webpack_require__){var isSameISOYear=__webpack_require__(99);function isThisISOYear(dirtyDate){return isSameISOYear(new Date,dirtyDate)}module.exports=isThisISOYear},function(module,exports,__webpack_require__){var isSameMinute=__webpack_require__(100);function isThisMinute(dirtyDate){return isSameMinute(new Date,dirtyDate)}module.exports=isThisMinute},function(module,exports,__webpack_require__){var isSameMonth=__webpack_require__(102);function isThisMonth(dirtyDate){return isSameMonth(new Date,dirtyDate)}module.exports=isThisMonth},function(module,exports,__webpack_require__){var isSameQuarter=__webpack_require__(103);function isThisQuarter(dirtyDate){return isSameQuarter(new Date,dirtyDate)}module.exports=isThisQuarter},function(module,exports,__webpack_require__){var isSameSecond=__webpack_require__(105);function isThisSecond(dirtyDate){return isSameSecond(new Date,dirtyDate)}module.exports=isThisSecond},function(module,exports,__webpack_require__){var isSameWeek=__webpack_require__(98);function isThisWeek(dirtyDate,dirtyOptions){return isSameWeek(new Date,dirtyDate,dirtyOptions)}module.exports=isThisWeek},function(module,exports,__webpack_require__){var isSameYear=__webpack_require__(107);function isThisYear(dirtyDate){return isSameYear(new Date,dirtyDate)}module.exports=isThisYear},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function isThursday(dirtyDate){return parse(dirtyDate).getDay()===4}module.exports=isThursday},function(module,exports,__webpack_require__){var startOfDay=__webpack_require__(14);function isToday(dirtyDate){return startOfDay(dirtyDate).getTime()===startOfDay(new Date).getTime()}module.exports=isToday},function(module,exports,__webpack_require__){var startOfDay=__webpack_require__(14);function isTomorrow(dirtyDate){var tomorrow=new Date;tomorrow.setDate(tomorrow.getDate()+1);return startOfDay(dirtyDate).getTime()===startOfDay(tomorrow).getTime()}module.exports=isTomorrow},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function isTuesday(dirtyDate){return parse(dirtyDate).getDay()===2}module.exports=isTuesday},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function isWednesday(dirtyDate){return parse(dirtyDate).getDay()===3}module.exports=isWednesday},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function isWeekend(dirtyDate){var date=parse(dirtyDate);var day=date.getDay();return day===0||day===6}module.exports=isWeekend},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function isWithinRange(dirtyDate,dirtyStartDate,dirtyEndDate){var time=parse(dirtyDate).getTime();var startTime=parse(dirtyStartDate).getTime();var endTime=parse(dirtyEndDate).getTime();if(startTime>endTime){throw new Error("The start of the range cannot be after the end of the range")}return time>=startTime&&time<=endTime}module.exports=isWithinRange},function(module,exports,__webpack_require__){var startOfDay=__webpack_require__(14);function isYesterday(dirtyDate){var yesterday=new Date;yesterday.setDate(yesterday.getDate()-1);return startOfDay(dirtyDate).getTime()===startOfDay(yesterday).getTime()}module.exports=isYesterday},function(module,exports,__webpack_require__){var lastDayOfWeek=__webpack_require__(128);function lastDayOfISOWeek(dirtyDate){return lastDayOfWeek(dirtyDate,{weekStartsOn:1})}module.exports=lastDayOfISOWeek},function(module,exports,__webpack_require__){var parse=__webpack_require__(2);function lastDayOfWeek(dirtyDate,dirtyOptions){var weekStartsOn=dirtyOptions?Number(dirtyOptions.weekStartsOn)||0:0;var date=parse(dirtyDate);var day=date.getDay();var diff=(day= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "fwd-stream": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fwd-stream/-/fwd-stream-1.0.4.tgz", + "integrity": "sha1-7Sgcq+1G/uz5Ie4y3ExQs3KsfPo=", + "dev": true, + "requires": { + "readable-stream": "~1.0.26-4" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true, + "optional": true + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "optional": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "optional": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", + "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "optional": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "optional": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "optional": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "idb-wrapper": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/idb-wrapper/-/idb-wrapper-1.7.2.tgz", + "integrity": "sha512-zfNREywMuf0NzDo9mVsL0yegjsirJxHpKHvWcyRozIqQy89g0a3U+oBPOCN4cc0oCiOuYgZHimzaW/R46G1Mpg==", + "dev": true + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "is": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/is/-/is-0.2.7.tgz", + "integrity": "sha1-OzSixI81mXLzUEKEkZOucmS2NWI=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "optional": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "optional": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true, + "optional": true + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "optional": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "optional": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "optional": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "optional": true + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "optional": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "optional": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "optional": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "optional": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "optional": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-object": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-0.1.2.tgz", + "integrity": "sha1-AO+8CIFsM8/ErIJR0TLhDcZQmNc=", + "dev": true + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "optional": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-reference": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.1.3.tgz", + "integrity": "sha512-W1iHHv/oyBb2pPxkBxtaewxa1BC58Pn5J0hogyCdefwUIvb6R+TGbAcIa4qPNYLqLhb3EnOgUf2MQkkF76BcKw==", + "dev": true, + "requires": { + "@types/estree": "0.0.39" + } + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "optional": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isbuffer": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/isbuffer/-/isbuffer-0.0.0.tgz", + "integrity": "sha1-OMFG2d9Si4v5sHAcPUPPEt8/w5s=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "optional": true + }, + "js-levenshtein": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", + "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json5": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", + "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true, + "optional": true + }, + "level-blobs": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/level-blobs/-/level-blobs-0.1.7.tgz", + "integrity": "sha1-mrm5e7mfHtv594o0M+Ie1WOGva8=", + "dev": true, + "requires": { + "level-peek": "1.0.6", + "once": "^1.3.0", + "readable-stream": "^1.0.26-4" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "level-filesystem": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/level-filesystem/-/level-filesystem-1.2.0.tgz", + "integrity": "sha1-oArKmRnEpN+v3KaoEI0iWq3/Y7M=", + "dev": true, + "requires": { + "concat-stream": "^1.4.4", + "errno": "^0.1.1", + "fwd-stream": "^1.0.4", + "level-blobs": "^0.1.7", + "level-peek": "^1.0.6", + "level-sublevel": "^5.2.0", + "octal": "^1.0.0", + "once": "^1.3.0", + "xtend": "^2.2.0" + } + }, + "level-fix-range": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/level-fix-range/-/level-fix-range-1.0.2.tgz", + "integrity": "sha1-vxW5Fa422EcMgh6IPd95zRZCCCg=", + "dev": true + }, + "level-hooks": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/level-hooks/-/level-hooks-4.5.0.tgz", + "integrity": "sha1-G5rmGSKTDzMF0aYfxNg8gQLA3ZM=", + "dev": true, + "requires": { + "string-range": "~1.2" + } + }, + "level-js": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/level-js/-/level-js-2.2.4.tgz", + "integrity": "sha1-vAVfQYBjXUSJtWHJSG+jcOjBFpc=", + "dev": true, + "requires": { + "abstract-leveldown": "~0.12.0", + "idb-wrapper": "^1.5.0", + "isbuffer": "~0.0.0", + "ltgt": "^2.1.2", + "typedarray-to-buffer": "~1.0.0", + "xtend": "~2.1.2" + }, + "dependencies": { + "object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", + "dev": true + }, + "xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", + "dev": true, + "requires": { + "object-keys": "~0.4.0" + } + } + } + }, + "level-peek": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/level-peek/-/level-peek-1.0.6.tgz", + "integrity": "sha1-vsUccqgu5GTTNkNMfIdsP8vM538=", + "dev": true, + "requires": { + "level-fix-range": "~1.0.2" + } + }, + "level-sublevel": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/level-sublevel/-/level-sublevel-5.2.3.tgz", + "integrity": "sha1-dEwSxy0ucr543eO5tc2E1iGRQTo=", + "dev": true, + "requires": { + "level-fix-range": "2.0", + "level-hooks": ">=4.4.0 <5", + "string-range": "~1.2.1", + "xtend": "~2.0.4" + }, + "dependencies": { + "level-fix-range": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/level-fix-range/-/level-fix-range-2.0.0.tgz", + "integrity": "sha1-xBfWIVlEIVGhnZojZ4aPFyTC1Ug=", + "dev": true, + "requires": { + "clone": "~0.1.9" + } + }, + "object-keys": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.2.0.tgz", + "integrity": "sha1-zd7AKZiwkb5CvxA1rjLknxy26mc=", + "dev": true, + "requires": { + "foreach": "~2.0.1", + "indexof": "~0.0.1", + "is": "~0.2.6" + } + }, + "xtend": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.0.6.tgz", + "integrity": "sha1-XqZXptukRwacLlnFihE4ywxebO4=", + "dev": true, + "requires": { + "is-object": "~0.1.2", + "object-keys": "~0.2.0" + } + } + } + }, + "levelup": { + "version": "0.18.6", + "resolved": "https://registry.npmjs.org/levelup/-/levelup-0.18.6.tgz", + "integrity": "sha1-5qAcsIlhbI7MApHCqb0/DETj5es=", + "dev": true, + "requires": { + "bl": "~0.8.1", + "deferred-leveldown": "~0.2.0", + "errno": "~0.1.1", + "prr": "~0.0.0", + "readable-stream": "~1.0.26", + "semver": "~2.3.1", + "xtend": "~3.0.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "prr": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", + "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "semver": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz", + "integrity": "sha1-uYSPJdbPNjMwc+ye+IVtQvEjPlI=", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "xtend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", + "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=", + "dev": true + } + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "ltgt": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", + "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=", + "dev": true + }, + "magic-string": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.3.tgz", + "integrity": "sha512-6QK0OpF/phMz0Q2AxILkX2mFhi7m+WMwTRg0LQKq/WBB0cDP4rYH3Wp4/d3OTXlrPLVJT/RFqj8tFeAR4nk8AA==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true, + "optional": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "optional": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "material-colors": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/material-colors/-/material-colors-1.2.6.tgz", + "integrity": "sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg==" + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "optional": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "optional": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "optional": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true, + "optional": true + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "optional": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "node-releases": { + "version": "1.1.26", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.26.tgz", + "integrity": "sha512-fZPsuhhUHMTlfkhDLGtfY80DSJTjOcx+qD1j5pqPkuhUHVS7xHZIg9EE4DHK8O3f0zTxXHX5VIkDG8pu98/wfQ==", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "optional": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "optional": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "optional": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "optional": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "optional": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "octal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/octal/-/octal-1.0.0.tgz", + "integrity": "sha1-Y+cWKmjvvrniE1iNWOmJ0eXEUws=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "output-file-sync": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-2.0.1.tgz", + "integrity": "sha512-mDho4qm7WgIXIGf4eYU1RHN2UU5tPfVYVSRwDJw0uTmj35DQUt/eNp19N7v6T3SrR0ESTEf2up2CGO73qI35zQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "is-plain-obj": "^1.1.0", + "mkdirp": "^0.5.1" + } + }, + "parse-asn1": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", + "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", + "dev": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true, + "optional": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true, + "optional": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true, + "optional": true + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process-es6": { + "version": "0.11.6", + "resolved": "https://registry.npmjs.org/process-es6/-/process-es6-0.11.6.tgz", + "integrity": "sha1-xrs4n5qVH4K9TrFpYAEFvS/5x3g=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "react-color": { + "version": "2.17.3", + "resolved": "https://registry.npmjs.org/react-color/-/react-color-2.17.3.tgz", + "integrity": "sha512-1dtO8LqAVotPIChlmo6kLtFS1FP89ll8/OiA8EcFRDR+ntcK+0ukJgByuIQHRtzvigf26dV5HklnxDIvhON9VQ==", + "requires": { + "@icons/material": "^0.2.4", + "lodash": "^4.17.11", + "material-colors": "^1.2.1", + "prop-types": "^15.5.10", + "reactcss": "^1.2.0", + "tinycolor2": "^1.4.1" + } + }, + "react-is": { + "version": "16.8.6", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", + "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==" + }, + "reactcss": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/reactcss/-/reactcss-1.2.3.tgz", + "integrity": "sha512-KiwVUcFu1RErkI97ywr8nvx8dNOpT03rbnma0SSalTYjkrPYaEajR4a/MRt6DZ46K6arDRbWMNHF+xH7G7n/8A==", + "requires": { + "lodash": "^4.0.1" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz", + "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-transform": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.1.tgz", + "integrity": "sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==", + "dev": true, + "requires": { + "private": "^0.1.6" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "optional": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexp-tree": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.11.tgz", + "integrity": "sha512-7/l/DgapVVDzZobwMCCgMlqiqyLFJ0cduo/j+3BcDJIB+yJdsYCfKuI3l/04NV+H/rfNRdPIDbXNZHM9XvQatg==", + "dev": true + }, + "regexpu-core": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.5.4.tgz", + "integrity": "sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.0.2", + "regjsgen": "^0.5.0", + "regjsparser": "^0.6.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.1.0" + } + }, + "regjsgen": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", + "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==", + "dev": true + }, + "regjsparser": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", + "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true, + "optional": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true, + "optional": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true, + "optional": true + }, + "resolve": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz", + "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true, + "optional": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true, + "optional": true + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "rollup": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.17.0.tgz", + "integrity": "sha512-k/j1m0NIsI4SYgCJR4MWPstGJOWfJyd6gycKoMhyoKPVXxm+L49XtbUwZyFsrSU2YXsOkM4u1ll9CS/ZgJBUpw==", + "dev": true, + "requires": { + "@types/estree": "0.0.39", + "@types/node": "^12.6.2", + "acorn": "^6.2.0" + } + }, + "rollup-plugin-babel": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/rollup-plugin-babel/-/rollup-plugin-babel-4.3.3.tgz", + "integrity": "sha512-tKzWOCmIJD/6aKNz0H1GMM+lW1q9KyFubbWzGiOG540zxPPifnEAHTZwjo0g991Y+DyOZcLqBgqOdqazYE5fkw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "rollup-pluginutils": "^2.8.1" + } + }, + "rollup-plugin-commonjs": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-10.0.1.tgz", + "integrity": "sha512-x0PcCVdEc4J8igv1qe2vttz8JKAKcTs3wfIA3L8xEty3VzxgORLrzZrNWaVMc+pBC4U3aDOb9BnWLAQ8J11vkA==", + "dev": true, + "requires": { + "estree-walker": "^0.6.1", + "is-reference": "^1.1.2", + "magic-string": "^0.25.2", + "resolve": "^1.11.0", + "rollup-pluginutils": "^2.8.1" + } + }, + "rollup-plugin-node-builtins": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-builtins/-/rollup-plugin-node-builtins-2.1.2.tgz", + "integrity": "sha1-JKH+1KQyV7a2Q3HYq8bOGrFFl+k=", + "dev": true, + "requires": { + "browserify-fs": "^1.0.0", + "buffer-es6": "^4.9.2", + "crypto-browserify": "^3.11.0", + "process-es6": "^0.11.2" + } + }, + "rollup-plugin-node-globals": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-globals/-/rollup-plugin-node-globals-1.4.0.tgz", + "integrity": "sha512-xRkB+W/m1KLIzPUmG0ofvR+CPNcvuCuNdjVBVS7ALKSxr3EDhnzNceGkGi1m8MToSli13AzKFYH4ie9w3I5L3g==", + "dev": true, + "requires": { + "acorn": "^5.7.3", + "buffer-es6": "^4.9.3", + "estree-walker": "^0.5.2", + "magic-string": "^0.22.5", + "process-es6": "^0.11.6", + "rollup-pluginutils": "^2.3.1" + }, + "dependencies": { + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true + }, + "estree-walker": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.5.2.tgz", + "integrity": "sha512-XpCnW/AE10ws/kDAs37cngSkvgIR8aN3G0MS85m7dUpuK2EREo9VJ00uvw6Dg/hXEpfsE1I1TvJOJr+Z+TL+ig==", + "dev": true + }, + "magic-string": { + "version": "0.22.5", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", + "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==", + "dev": true, + "requires": { + "vlq": "^0.2.2" + } + } + } + }, + "rollup-plugin-node-resolve": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-5.2.0.tgz", + "integrity": "sha512-jUlyaDXts7TW2CqQ4GaO5VJ4PwwaV8VUGA7+km3n6k6xtOEacf61u0VXwN80phY/evMcaS+9eIeJ9MOyDxt5Zw==", + "dev": true, + "requires": { + "@types/resolve": "0.0.8", + "builtin-modules": "^3.1.0", + "is-module": "^1.0.0", + "resolve": "^1.11.1", + "rollup-pluginutils": "^2.8.1" + } + }, + "rollup-pluginutils": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.1.tgz", + "integrity": "sha512-J5oAoysWar6GuZo0s+3bZ6sVZAC0pfqKz68De7ZgDi5z63jOVZn1uJL/+z1jeKHNbGII8kAyHF5q8LnxSX5lQg==", + "dev": true, + "requires": { + "estree-walker": "^0.6.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "optional": true, + "requires": { + "ret": "~0.1.10" + } + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "optional": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "optional": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "optional": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "optional": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "optional": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "optional": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "optional": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "optional": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "optional": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "optional": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "snapsvg": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/snapsvg/-/snapsvg-0.5.1.tgz", + "integrity": "sha1-DK9Sx5GJopB0b8RGzF6GP2vd3+M=", + "requires": { + "eve": "~0.5.1" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "optional": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true, + "optional": true + }, + "sourcemap-codec": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.6.tgz", + "integrity": "sha512-1ZooVLYFxC448piVLBbtOxFcXwnymH9oUF8nRd3CuYDVvkRBxRl6pB4Mtas5a4drtL+E8LDgFkQNcgIw6tc8Hg==", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "optional": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "optional": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "optional": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "string-range": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/string-range/-/string-range-1.2.2.tgz", + "integrity": "sha1-qJPtNH5yKZvIO++78qaSqNI51d0=", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "terser": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.1.2.tgz", + "integrity": "sha512-jvNoEQSPXJdssFwqPSgWjsOrb+ELoE+ILpHPKXC83tIxOlh2U75F1KuB2luLD/3a6/7K3Vw5pDn+hvu0C4AzSw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "tinycolor2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.1.tgz", + "integrity": "sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g=" + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "optional": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "optional": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "optional": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "optional": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "typedarray-to-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-1.0.4.tgz", + "integrity": "sha1-m7i6DoQfs/TPH+fCRenz+opf6Zw=", + "dev": true + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz", + "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz", + "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "optional": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "optional": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "optional": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "optional": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true, + "optional": true + } + } + }, + "upath": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", + "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", + "dev": true, + "optional": true + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true, + "optional": true + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true, + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "vlq": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", + "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "xtend": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.2.0.tgz", + "integrity": "sha1-7vax8ZjByN6vrYsXZaBNrUoBxak=", + "dev": true + } + } +} diff --git a/frontend/vendor/package.json b/frontend/vendor/package.json new file mode 100644 index 000000000..2a96b47b2 --- /dev/null +++ b/frontend/vendor/package.json @@ -0,0 +1,34 @@ +{ + "name": "uxbox-vendor", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "build": "NODE_ENV=production rollup -c", + "minify:react-color": "terser react-color/react-color.bundle.js -c -m -o react-color/react-color.bundle.min.js", + "minify:datefns": "terser datefns/datefns.bundle.js -c -m -o datefns/datefns.bundle.min.js", + "dist": "npm run build && npm run minify:react-color && npm run minify:datefns" + }, + "author": "", + "license": "MPL2", + "devDependencies": { + "@babel/cli": "^7.4.4", + "@babel/core": "^7.4.4", + "@babel/plugin-proposal-class-properties": "^7.5.5", + "@babel/plugin-proposal-export-default-from": "^7.5.2", + "@babel/preset-env": "^7.4.4", + "@babel/preset-react": "^7.0.0", + "rollup": "^1.12.3", + "rollup-plugin-babel": "^4.3.2", + "rollup-plugin-commonjs": "^10.0.0", + "rollup-plugin-node-builtins": "^2.1.2", + "rollup-plugin-node-globals": "^1.4.0", + "rollup-plugin-node-resolve": "^5.0.0", + "terser": "^4.1.2" + }, + "dependencies": { + "date-fns": "^1.30.1", + "react-color": "^2.17.3", + "snapsvg": "^0.5.1" + } +} diff --git a/frontend/vendor/react-color/externs.js b/frontend/vendor/react-color/externs.js new file mode 100644 index 000000000..fb7b31d4e --- /dev/null +++ b/frontend/vendor/react-color/externs.js @@ -0,0 +1,2 @@ +var ChromePicker = {}; +var SketchPicker = {}; diff --git a/frontend/vendor/react-color/react-color.bundle.js b/frontend/vendor/react-color/react-color.bundle.js new file mode 100644 index 000000000..8c3e2d8d7 --- /dev/null +++ b/frontend/vendor/react-color/react-color.bundle.js @@ -0,0 +1,9179 @@ +(function(react){'use strict';react=react&&react.hasOwnProperty('default')?react['default']:react;var global$1 = (typeof global !== "undefined" ? global : + typeof self !== "undefined" ? self : + typeof window !== "undefined" ? window : {});var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; + +function unwrapExports (x) { + return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x; +} + +function createCommonjsModule(fn, module) { + return module = { exports: {} }, fn(module, module.exports), module.exports; +}if (typeof global$1.setTimeout === 'function') ; +if (typeof global$1.clearTimeout === 'function') ; + +// from https://github.com/kumavis/browser-process-hrtime/blob/master/index.js +var performance = global$1.performance || {}; +var performanceNow = + performance.now || + performance.mozNow || + performance.msNow || + performance.oNow || + performance.webkitNow || + function(){ return (new Date()).getTime() };var reactIs_production_min = createCommonjsModule(function (module, exports) { +Object.defineProperty(exports,"__esModule",{value:!0}); +var b="function"===typeof Symbol&&Symbol.for,c=b?Symbol.for("react.element"):60103,d=b?Symbol.for("react.portal"):60106,e=b?Symbol.for("react.fragment"):60107,f=b?Symbol.for("react.strict_mode"):60108,g=b?Symbol.for("react.profiler"):60114,h=b?Symbol.for("react.provider"):60109,k=b?Symbol.for("react.context"):60110,l=b?Symbol.for("react.async_mode"):60111,m=b?Symbol.for("react.concurrent_mode"):60111,n=b?Symbol.for("react.forward_ref"):60112,p=b?Symbol.for("react.suspense"):60113,q=b?Symbol.for("react.memo"): +60115,r=b?Symbol.for("react.lazy"):60116;function t(a){if("object"===typeof a&&null!==a){var u=a.$$typeof;switch(u){case c:switch(a=a.type,a){case l:case m:case e:case g:case f:case p:return a;default:switch(a=a&&a.$$typeof,a){case k:case n:case h:return a;default:return u}}case r:case q:case d:return u}}}function v(a){return t(a)===m}exports.typeOf=t;exports.AsyncMode=l;exports.ConcurrentMode=m;exports.ContextConsumer=k;exports.ContextProvider=h;exports.Element=c;exports.ForwardRef=n; +exports.Fragment=e;exports.Lazy=r;exports.Memo=q;exports.Portal=d;exports.Profiler=g;exports.StrictMode=f;exports.Suspense=p;exports.isValidElementType=function(a){return "string"===typeof a||"function"===typeof a||a===e||a===m||a===g||a===f||a===p||"object"===typeof a&&null!==a&&(a.$$typeof===r||a.$$typeof===q||a.$$typeof===h||a.$$typeof===k||a.$$typeof===n)};exports.isAsyncMode=function(a){return v(a)||t(a)===l};exports.isConcurrentMode=v;exports.isContextConsumer=function(a){return t(a)===k}; +exports.isContextProvider=function(a){return t(a)===h};exports.isElement=function(a){return "object"===typeof a&&null!==a&&a.$$typeof===c};exports.isForwardRef=function(a){return t(a)===n};exports.isFragment=function(a){return t(a)===e};exports.isLazy=function(a){return t(a)===r};exports.isMemo=function(a){return t(a)===q};exports.isPortal=function(a){return t(a)===d};exports.isProfiler=function(a){return t(a)===g};exports.isStrictMode=function(a){return t(a)===f}; +exports.isSuspense=function(a){return t(a)===p}; +}); + +unwrapExports(reactIs_production_min); +var reactIs_production_min_1 = reactIs_production_min.typeOf; +var reactIs_production_min_2 = reactIs_production_min.AsyncMode; +var reactIs_production_min_3 = reactIs_production_min.ConcurrentMode; +var reactIs_production_min_4 = reactIs_production_min.ContextConsumer; +var reactIs_production_min_5 = reactIs_production_min.ContextProvider; +var reactIs_production_min_6 = reactIs_production_min.Element; +var reactIs_production_min_7 = reactIs_production_min.ForwardRef; +var reactIs_production_min_8 = reactIs_production_min.Fragment; +var reactIs_production_min_9 = reactIs_production_min.Lazy; +var reactIs_production_min_10 = reactIs_production_min.Memo; +var reactIs_production_min_11 = reactIs_production_min.Portal; +var reactIs_production_min_12 = reactIs_production_min.Profiler; +var reactIs_production_min_13 = reactIs_production_min.StrictMode; +var reactIs_production_min_14 = reactIs_production_min.Suspense; +var reactIs_production_min_15 = reactIs_production_min.isValidElementType; +var reactIs_production_min_16 = reactIs_production_min.isAsyncMode; +var reactIs_production_min_17 = reactIs_production_min.isConcurrentMode; +var reactIs_production_min_18 = reactIs_production_min.isContextConsumer; +var reactIs_production_min_19 = reactIs_production_min.isContextProvider; +var reactIs_production_min_20 = reactIs_production_min.isElement; +var reactIs_production_min_21 = reactIs_production_min.isForwardRef; +var reactIs_production_min_22 = reactIs_production_min.isFragment; +var reactIs_production_min_23 = reactIs_production_min.isLazy; +var reactIs_production_min_24 = reactIs_production_min.isMemo; +var reactIs_production_min_25 = reactIs_production_min.isPortal; +var reactIs_production_min_26 = reactIs_production_min.isProfiler; +var reactIs_production_min_27 = reactIs_production_min.isStrictMode; +var reactIs_production_min_28 = reactIs_production_min.isSuspense;var reactIs_development = createCommonjsModule(function (module, exports) { + + + +{ + (function() { + +Object.defineProperty(exports, '__esModule', { value: true }); + +// The Symbol used to tag the ReactElement-like types. If there is no native Symbol +// nor polyfill, then a plain number is used for performance. +var hasSymbol = typeof Symbol === 'function' && Symbol.for; + +var REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7; +var REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca; +var REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb; +var REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc; +var REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2; +var REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd; +var REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace; +var REACT_ASYNC_MODE_TYPE = hasSymbol ? Symbol.for('react.async_mode') : 0xeacf; +var REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf; +var REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0; +var REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1; +var REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3; +var REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4; + +function isValidElementType(type) { + return typeof type === 'string' || typeof type === 'function' || + // Note: its typeof might be other than 'symbol' or 'number' if it's a polyfill. + type === REACT_FRAGMENT_TYPE || type === REACT_CONCURRENT_MODE_TYPE || type === REACT_PROFILER_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || typeof type === 'object' && type !== null && (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE); +} + +/** + * Forked from fbjs/warning: + * https://github.com/facebook/fbjs/blob/e66ba20ad5be433eb54423f2b097d829324d9de6/packages/fbjs/src/__forks__/warning.js + * + * Only change is we use console.warn instead of console.error, + * and do nothing when 'console' is not supported. + * This really simplifies the code. + * --- + * Similar to invariant but only logs a warning if the condition is not met. + * This can be used to log issues in development environments in critical + * paths. Removing the logging code for production environments will keep the + * same logic and follow the same code paths. + */ + +var lowPriorityWarning = function () {}; + +{ + var printWarning = function (format) { + for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + var argIndex = 0; + var message = 'Warning: ' + format.replace(/%s/g, function () { + return args[argIndex++]; + }); + if (typeof console !== 'undefined') { + console.warn(message); + } + try { + // --- Welcome to debugging React --- + // This error was thrown as a convenience so that you can use this stack + // to find the callsite that caused this warning to fire. + throw new Error(message); + } catch (x) {} + }; + + lowPriorityWarning = function (condition, format) { + if (format === undefined) { + throw new Error('`lowPriorityWarning(condition, format, ...args)` requires a warning ' + 'message argument'); + } + if (!condition) { + for (var _len2 = arguments.length, args = Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) { + args[_key2 - 2] = arguments[_key2]; + } + + printWarning.apply(undefined, [format].concat(args)); + } + }; +} + +var lowPriorityWarning$1 = lowPriorityWarning; + +function typeOf(object) { + if (typeof object === 'object' && object !== null) { + var $$typeof = object.$$typeof; + switch ($$typeof) { + case REACT_ELEMENT_TYPE: + var type = object.type; + + switch (type) { + case REACT_ASYNC_MODE_TYPE: + case REACT_CONCURRENT_MODE_TYPE: + case REACT_FRAGMENT_TYPE: + case REACT_PROFILER_TYPE: + case REACT_STRICT_MODE_TYPE: + case REACT_SUSPENSE_TYPE: + return type; + default: + var $$typeofType = type && type.$$typeof; + + switch ($$typeofType) { + case REACT_CONTEXT_TYPE: + case REACT_FORWARD_REF_TYPE: + case REACT_PROVIDER_TYPE: + return $$typeofType; + default: + return $$typeof; + } + } + case REACT_LAZY_TYPE: + case REACT_MEMO_TYPE: + case REACT_PORTAL_TYPE: + return $$typeof; + } + } + + return undefined; +} + +// AsyncMode is deprecated along with isAsyncMode +var AsyncMode = REACT_ASYNC_MODE_TYPE; +var ConcurrentMode = REACT_CONCURRENT_MODE_TYPE; +var ContextConsumer = REACT_CONTEXT_TYPE; +var ContextProvider = REACT_PROVIDER_TYPE; +var Element = REACT_ELEMENT_TYPE; +var ForwardRef = REACT_FORWARD_REF_TYPE; +var Fragment = REACT_FRAGMENT_TYPE; +var Lazy = REACT_LAZY_TYPE; +var Memo = REACT_MEMO_TYPE; +var Portal = REACT_PORTAL_TYPE; +var Profiler = REACT_PROFILER_TYPE; +var StrictMode = REACT_STRICT_MODE_TYPE; +var Suspense = REACT_SUSPENSE_TYPE; + +var hasWarnedAboutDeprecatedIsAsyncMode = false; + +// AsyncMode should be deprecated +function isAsyncMode(object) { + { + if (!hasWarnedAboutDeprecatedIsAsyncMode) { + hasWarnedAboutDeprecatedIsAsyncMode = true; + lowPriorityWarning$1(false, 'The ReactIs.isAsyncMode() alias has been deprecated, ' + 'and will be removed in React 17+. Update your code to use ' + 'ReactIs.isConcurrentMode() instead. It has the exact same API.'); + } + } + return isConcurrentMode(object) || typeOf(object) === REACT_ASYNC_MODE_TYPE; +} +function isConcurrentMode(object) { + return typeOf(object) === REACT_CONCURRENT_MODE_TYPE; +} +function isContextConsumer(object) { + return typeOf(object) === REACT_CONTEXT_TYPE; +} +function isContextProvider(object) { + return typeOf(object) === REACT_PROVIDER_TYPE; +} +function isElement(object) { + return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE; +} +function isForwardRef(object) { + return typeOf(object) === REACT_FORWARD_REF_TYPE; +} +function isFragment(object) { + return typeOf(object) === REACT_FRAGMENT_TYPE; +} +function isLazy(object) { + return typeOf(object) === REACT_LAZY_TYPE; +} +function isMemo(object) { + return typeOf(object) === REACT_MEMO_TYPE; +} +function isPortal(object) { + return typeOf(object) === REACT_PORTAL_TYPE; +} +function isProfiler(object) { + return typeOf(object) === REACT_PROFILER_TYPE; +} +function isStrictMode(object) { + return typeOf(object) === REACT_STRICT_MODE_TYPE; +} +function isSuspense(object) { + return typeOf(object) === REACT_SUSPENSE_TYPE; +} + +exports.typeOf = typeOf; +exports.AsyncMode = AsyncMode; +exports.ConcurrentMode = ConcurrentMode; +exports.ContextConsumer = ContextConsumer; +exports.ContextProvider = ContextProvider; +exports.Element = Element; +exports.ForwardRef = ForwardRef; +exports.Fragment = Fragment; +exports.Lazy = Lazy; +exports.Memo = Memo; +exports.Portal = Portal; +exports.Profiler = Profiler; +exports.StrictMode = StrictMode; +exports.Suspense = Suspense; +exports.isValidElementType = isValidElementType; +exports.isAsyncMode = isAsyncMode; +exports.isConcurrentMode = isConcurrentMode; +exports.isContextConsumer = isContextConsumer; +exports.isContextProvider = isContextProvider; +exports.isElement = isElement; +exports.isForwardRef = isForwardRef; +exports.isFragment = isFragment; +exports.isLazy = isLazy; +exports.isMemo = isMemo; +exports.isPortal = isPortal; +exports.isProfiler = isProfiler; +exports.isStrictMode = isStrictMode; +exports.isSuspense = isSuspense; + })(); +} +}); + +unwrapExports(reactIs_development); +var reactIs_development_1 = reactIs_development.typeOf; +var reactIs_development_2 = reactIs_development.AsyncMode; +var reactIs_development_3 = reactIs_development.ConcurrentMode; +var reactIs_development_4 = reactIs_development.ContextConsumer; +var reactIs_development_5 = reactIs_development.ContextProvider; +var reactIs_development_6 = reactIs_development.Element; +var reactIs_development_7 = reactIs_development.ForwardRef; +var reactIs_development_8 = reactIs_development.Fragment; +var reactIs_development_9 = reactIs_development.Lazy; +var reactIs_development_10 = reactIs_development.Memo; +var reactIs_development_11 = reactIs_development.Portal; +var reactIs_development_12 = reactIs_development.Profiler; +var reactIs_development_13 = reactIs_development.StrictMode; +var reactIs_development_14 = reactIs_development.Suspense; +var reactIs_development_15 = reactIs_development.isValidElementType; +var reactIs_development_16 = reactIs_development.isAsyncMode; +var reactIs_development_17 = reactIs_development.isConcurrentMode; +var reactIs_development_18 = reactIs_development.isContextConsumer; +var reactIs_development_19 = reactIs_development.isContextProvider; +var reactIs_development_20 = reactIs_development.isElement; +var reactIs_development_21 = reactIs_development.isForwardRef; +var reactIs_development_22 = reactIs_development.isFragment; +var reactIs_development_23 = reactIs_development.isLazy; +var reactIs_development_24 = reactIs_development.isMemo; +var reactIs_development_25 = reactIs_development.isPortal; +var reactIs_development_26 = reactIs_development.isProfiler; +var reactIs_development_27 = reactIs_development.isStrictMode; +var reactIs_development_28 = reactIs_development.isSuspense;var reactIs = createCommonjsModule(function (module) { + +{ + module.exports = reactIs_development; +} +});/* +object-assign +(c) Sindre Sorhus +@license MIT +*/ +/* eslint-disable no-unused-vars */ +var getOwnPropertySymbols = Object.getOwnPropertySymbols; +var hasOwnProperty = Object.prototype.hasOwnProperty; +var propIsEnumerable = Object.prototype.propertyIsEnumerable; + +function toObject(val) { + if (val === null || val === undefined) { + throw new TypeError('Object.assign cannot be called with null or undefined'); + } + + return Object(val); +} + +function shouldUseNative() { + try { + if (!Object.assign) { + return false; + } + + // Detect buggy property enumeration order in older V8 versions. + + // https://bugs.chromium.org/p/v8/issues/detail?id=4118 + var test1 = new String('abc'); // eslint-disable-line no-new-wrappers + test1[5] = 'de'; + if (Object.getOwnPropertyNames(test1)[0] === '5') { + return false; + } + + // https://bugs.chromium.org/p/v8/issues/detail?id=3056 + var test2 = {}; + for (var i = 0; i < 10; i++) { + test2['_' + String.fromCharCode(i)] = i; + } + var order2 = Object.getOwnPropertyNames(test2).map(function (n) { + return test2[n]; + }); + if (order2.join('') !== '0123456789') { + return false; + } + + // https://bugs.chromium.org/p/v8/issues/detail?id=3056 + var test3 = {}; + 'abcdefghijklmnopqrst'.split('').forEach(function (letter) { + test3[letter] = letter; + }); + if (Object.keys(Object.assign({}, test3)).join('') !== + 'abcdefghijklmnopqrst') { + return false; + } + + return true; + } catch (err) { + // We don't expect any of the above to throw, but better to be safe. + return false; + } +} + +var objectAssign = shouldUseNative() ? Object.assign : function (target, source) { + var from; + var to = toObject(target); + var symbols; + + for (var s = 1; s < arguments.length; s++) { + from = Object(arguments[s]); + + for (var key in from) { + if (hasOwnProperty.call(from, key)) { + to[key] = from[key]; + } + } + + if (getOwnPropertySymbols) { + symbols = getOwnPropertySymbols(from); + for (var i = 0; i < symbols.length; i++) { + if (propIsEnumerable.call(from, symbols[i])) { + to[symbols[i]] = from[symbols[i]]; + } + } + } + } + + return to; +};/** + * Copyright (c) 2013-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +var ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED'; + +var ReactPropTypesSecret_1 = ReactPropTypesSecret;var printWarning = function() {}; + +{ + var ReactPropTypesSecret$1 = ReactPropTypesSecret_1; + var loggedTypeFailures = {}; + var has = Function.call.bind(Object.prototype.hasOwnProperty); + + printWarning = function(text) { + var message = 'Warning: ' + text; + if (typeof console !== 'undefined') { + console.error(message); + } + try { + // --- Welcome to debugging React --- + // This error was thrown as a convenience so that you can use this stack + // to find the callsite that caused this warning to fire. + throw new Error(message); + } catch (x) {} + }; +} + +/** + * Assert that the values match with the type specs. + * Error messages are memorized and will only be shown once. + * + * @param {object} typeSpecs Map of name to a ReactPropType + * @param {object} values Runtime values that need to be type-checked + * @param {string} location e.g. "prop", "context", "child context" + * @param {string} componentName Name of the component for error messages. + * @param {?Function} getStack Returns the component stack. + * @private + */ +function checkPropTypes(typeSpecs, values, location, componentName, getStack) { + { + for (var typeSpecName in typeSpecs) { + if (has(typeSpecs, typeSpecName)) { + var error; + // Prop type validation may throw. In case they do, we don't want to + // fail the render phase where it didn't fail before. So we log it. + // After these have been cleaned up, we'll let them throw. + try { + // This is intentionally an invariant that gets caught. It's the same + // behavior as without this statement except with a better message. + if (typeof typeSpecs[typeSpecName] !== 'function') { + var err = Error( + (componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' + ); + err.name = 'Invariant Violation'; + throw err; + } + error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret$1); + } catch (ex) { + error = ex; + } + if (error && !(error instanceof Error)) { + printWarning( + (componentName || 'React class') + ': type specification of ' + + location + ' `' + typeSpecName + '` is invalid; the type checker ' + + 'function must return `null` or an `Error` but returned a ' + typeof error + '. ' + + 'You may have forgotten to pass an argument to the type checker ' + + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + + 'shape all require an argument).' + ); + } + if (error instanceof Error && !(error.message in loggedTypeFailures)) { + // Only monitor this failure once because there tends to be a lot of the + // same error. + loggedTypeFailures[error.message] = true; + + var stack = getStack ? getStack() : ''; + + printWarning( + 'Failed ' + location + ' type: ' + error.message + (stack != null ? stack : '') + ); + } + } + } + } +} + +/** + * Resets warning cache when testing. + * + * @private + */ +checkPropTypes.resetWarningCache = function() { + { + loggedTypeFailures = {}; + } +}; + +var checkPropTypes_1 = checkPropTypes;var has$1 = Function.call.bind(Object.prototype.hasOwnProperty); +var printWarning$1 = function() {}; + +{ + printWarning$1 = function(text) { + var message = 'Warning: ' + text; + if (typeof console !== 'undefined') { + console.error(message); + } + try { + // --- Welcome to debugging React --- + // This error was thrown as a convenience so that you can use this stack + // to find the callsite that caused this warning to fire. + throw new Error(message); + } catch (x) {} + }; +} + +function emptyFunctionThatReturnsNull() { + return null; +} + +var factoryWithTypeCheckers = function(isValidElement, throwOnDirectAccess) { + /* global Symbol */ + var ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator; + var FAUX_ITERATOR_SYMBOL = '@@iterator'; // Before Symbol spec. + + /** + * Returns the iterator method function contained on the iterable object. + * + * Be sure to invoke the function with the iterable as context: + * + * var iteratorFn = getIteratorFn(myIterable); + * if (iteratorFn) { + * var iterator = iteratorFn.call(myIterable); + * ... + * } + * + * @param {?object} maybeIterable + * @return {?function} + */ + function getIteratorFn(maybeIterable) { + var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]); + if (typeof iteratorFn === 'function') { + return iteratorFn; + } + } + + /** + * Collection of methods that allow declaration and validation of props that are + * supplied to React components. Example usage: + * + * var Props = require('ReactPropTypes'); + * var MyArticle = React.createClass({ + * propTypes: { + * // An optional string prop named "description". + * description: Props.string, + * + * // A required enum prop named "category". + * category: Props.oneOf(['News','Photos']).isRequired, + * + * // A prop named "dialog" that requires an instance of Dialog. + * dialog: Props.instanceOf(Dialog).isRequired + * }, + * render: function() { ... } + * }); + * + * A more formal specification of how these methods are used: + * + * type := array|bool|func|object|number|string|oneOf([...])|instanceOf(...) + * decl := ReactPropTypes.{type}(.isRequired)? + * + * Each and every declaration produces a function with the same signature. This + * allows the creation of custom validation functions. For example: + * + * var MyLink = React.createClass({ + * propTypes: { + * // An optional string or URI prop named "href". + * href: function(props, propName, componentName) { + * var propValue = props[propName]; + * if (propValue != null && typeof propValue !== 'string' && + * !(propValue instanceof URI)) { + * return new Error( + * 'Expected a string or an URI for ' + propName + ' in ' + + * componentName + * ); + * } + * } + * }, + * render: function() {...} + * }); + * + * @internal + */ + + var ANONYMOUS = '<>'; + + // Important! + // Keep this list in sync with production version in `./factoryWithThrowingShims.js`. + var ReactPropTypes = { + array: createPrimitiveTypeChecker('array'), + bool: createPrimitiveTypeChecker('boolean'), + func: createPrimitiveTypeChecker('function'), + number: createPrimitiveTypeChecker('number'), + object: createPrimitiveTypeChecker('object'), + string: createPrimitiveTypeChecker('string'), + symbol: createPrimitiveTypeChecker('symbol'), + + any: createAnyTypeChecker(), + arrayOf: createArrayOfTypeChecker, + element: createElementTypeChecker(), + elementType: createElementTypeTypeChecker(), + instanceOf: createInstanceTypeChecker, + node: createNodeChecker(), + objectOf: createObjectOfTypeChecker, + oneOf: createEnumTypeChecker, + oneOfType: createUnionTypeChecker, + shape: createShapeTypeChecker, + exact: createStrictShapeTypeChecker, + }; + + /** + * inlined Object.is polyfill to avoid requiring consumers ship their own + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is + */ + /*eslint-disable no-self-compare*/ + function is(x, y) { + // SameValue algorithm + if (x === y) { + // Steps 1-5, 7-10 + // Steps 6.b-6.e: +0 != -0 + return x !== 0 || 1 / x === 1 / y; + } else { + // Step 6.a: NaN == NaN + return x !== x && y !== y; + } + } + /*eslint-enable no-self-compare*/ + + /** + * We use an Error-like object for backward compatibility as people may call + * PropTypes directly and inspect their output. However, we don't use real + * Errors anymore. We don't inspect their stack anyway, and creating them + * is prohibitively expensive if they are created too often, such as what + * happens in oneOfType() for any type before the one that matched. + */ + function PropTypeError(message) { + this.message = message; + this.stack = ''; + } + // Make `instanceof Error` still work for returned errors. + PropTypeError.prototype = Error.prototype; + + function createChainableTypeChecker(validate) { + { + var manualPropTypeCallCache = {}; + var manualPropTypeWarningCount = 0; + } + function checkType(isRequired, props, propName, componentName, location, propFullName, secret) { + componentName = componentName || ANONYMOUS; + propFullName = propFullName || propName; + + if (secret !== ReactPropTypesSecret_1) { + if (throwOnDirectAccess) { + // New behavior only for users of `prop-types` package + var err = new Error( + 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' + + 'Use `PropTypes.checkPropTypes()` to call them. ' + + 'Read more at http://fb.me/use-check-prop-types' + ); + err.name = 'Invariant Violation'; + throw err; + } else if ( typeof console !== 'undefined') { + // Old behavior for people using React.PropTypes + var cacheKey = componentName + ':' + propName; + if ( + !manualPropTypeCallCache[cacheKey] && + // Avoid spamming the console because they are often not actionable except for lib authors + manualPropTypeWarningCount < 3 + ) { + printWarning$1( + 'You are manually calling a React.PropTypes validation ' + + 'function for the `' + propFullName + '` prop on `' + componentName + '`. This is deprecated ' + + 'and will throw in the standalone `prop-types` package. ' + + 'You may be seeing this warning due to a third-party PropTypes ' + + 'library. See https://fb.me/react-warning-dont-call-proptypes ' + 'for details.' + ); + manualPropTypeCallCache[cacheKey] = true; + manualPropTypeWarningCount++; + } + } + } + if (props[propName] == null) { + if (isRequired) { + if (props[propName] === null) { + return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required ' + ('in `' + componentName + '`, but its value is `null`.')); + } + return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required in ' + ('`' + componentName + '`, but its value is `undefined`.')); + } + return null; + } else { + return validate(props, propName, componentName, location, propFullName); + } + } + + var chainedCheckType = checkType.bind(null, false); + chainedCheckType.isRequired = checkType.bind(null, true); + + return chainedCheckType; + } + + function createPrimitiveTypeChecker(expectedType) { + function validate(props, propName, componentName, location, propFullName, secret) { + var propValue = props[propName]; + var propType = getPropType(propValue); + if (propType !== expectedType) { + // `propValue` being instance of, say, date/regexp, pass the 'object' + // check, but we can offer a more precise error message here rather than + // 'of type `object`'. + var preciseType = getPreciseType(propValue); + + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + preciseType + '` supplied to `' + componentName + '`, expected ') + ('`' + expectedType + '`.')); + } + return null; + } + return createChainableTypeChecker(validate); + } + + function createAnyTypeChecker() { + return createChainableTypeChecker(emptyFunctionThatReturnsNull); + } + + function createArrayOfTypeChecker(typeChecker) { + function validate(props, propName, componentName, location, propFullName) { + if (typeof typeChecker !== 'function') { + return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside arrayOf.'); + } + var propValue = props[propName]; + if (!Array.isArray(propValue)) { + var propType = getPropType(propValue); + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an array.')); + } + for (var i = 0; i < propValue.length; i++) { + var error = typeChecker(propValue, i, componentName, location, propFullName + '[' + i + ']', ReactPropTypesSecret_1); + if (error instanceof Error) { + return error; + } + } + return null; + } + return createChainableTypeChecker(validate); + } + + function createElementTypeChecker() { + function validate(props, propName, componentName, location, propFullName) { + var propValue = props[propName]; + if (!isValidElement(propValue)) { + var propType = getPropType(propValue); + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement.')); + } + return null; + } + return createChainableTypeChecker(validate); + } + + function createElementTypeTypeChecker() { + function validate(props, propName, componentName, location, propFullName) { + var propValue = props[propName]; + if (!reactIs.isValidElementType(propValue)) { + var propType = getPropType(propValue); + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement type.')); + } + return null; + } + return createChainableTypeChecker(validate); + } + + function createInstanceTypeChecker(expectedClass) { + function validate(props, propName, componentName, location, propFullName) { + if (!(props[propName] instanceof expectedClass)) { + var expectedClassName = expectedClass.name || ANONYMOUS; + var actualClassName = getClassName(props[propName]); + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + actualClassName + '` supplied to `' + componentName + '`, expected ') + ('instance of `' + expectedClassName + '`.')); + } + return null; + } + return createChainableTypeChecker(validate); + } + + function createEnumTypeChecker(expectedValues) { + if (!Array.isArray(expectedValues)) { + { + if (arguments.length > 1) { + printWarning$1( + 'Invalid arguments supplied to oneOf, expected an array, got ' + arguments.length + ' arguments. ' + + 'A common mistake is to write oneOf(x, y, z) instead of oneOf([x, y, z]).' + ); + } else { + printWarning$1('Invalid argument supplied to oneOf, expected an array.'); + } + } + return emptyFunctionThatReturnsNull; + } + + function validate(props, propName, componentName, location, propFullName) { + var propValue = props[propName]; + for (var i = 0; i < expectedValues.length; i++) { + if (is(propValue, expectedValues[i])) { + return null; + } + } + + var valuesString = JSON.stringify(expectedValues, function replacer(key, value) { + var type = getPreciseType(value); + if (type === 'symbol') { + return String(value); + } + return value; + }); + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of value `' + String(propValue) + '` ' + ('supplied to `' + componentName + '`, expected one of ' + valuesString + '.')); + } + return createChainableTypeChecker(validate); + } + + function createObjectOfTypeChecker(typeChecker) { + function validate(props, propName, componentName, location, propFullName) { + if (typeof typeChecker !== 'function') { + return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside objectOf.'); + } + var propValue = props[propName]; + var propType = getPropType(propValue); + if (propType !== 'object') { + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an object.')); + } + for (var key in propValue) { + if (has$1(propValue, key)) { + var error = typeChecker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret_1); + if (error instanceof Error) { + return error; + } + } + } + return null; + } + return createChainableTypeChecker(validate); + } + + function createUnionTypeChecker(arrayOfTypeCheckers) { + if (!Array.isArray(arrayOfTypeCheckers)) { + printWarning$1('Invalid argument supplied to oneOfType, expected an instance of array.') ; + return emptyFunctionThatReturnsNull; + } + + for (var i = 0; i < arrayOfTypeCheckers.length; i++) { + var checker = arrayOfTypeCheckers[i]; + if (typeof checker !== 'function') { + printWarning$1( + 'Invalid argument supplied to oneOfType. Expected an array of check functions, but ' + + 'received ' + getPostfixForTypeWarning(checker) + ' at index ' + i + '.' + ); + return emptyFunctionThatReturnsNull; + } + } + + function validate(props, propName, componentName, location, propFullName) { + for (var i = 0; i < arrayOfTypeCheckers.length; i++) { + var checker = arrayOfTypeCheckers[i]; + if (checker(props, propName, componentName, location, propFullName, ReactPropTypesSecret_1) == null) { + return null; + } + } + + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`.')); + } + return createChainableTypeChecker(validate); + } + + function createNodeChecker() { + function validate(props, propName, componentName, location, propFullName) { + if (!isNode(props[propName])) { + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`, expected a ReactNode.')); + } + return null; + } + return createChainableTypeChecker(validate); + } + + function createShapeTypeChecker(shapeTypes) { + function validate(props, propName, componentName, location, propFullName) { + var propValue = props[propName]; + var propType = getPropType(propValue); + if (propType !== 'object') { + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.')); + } + for (var key in shapeTypes) { + var checker = shapeTypes[key]; + if (!checker) { + continue; + } + var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret_1); + if (error) { + return error; + } + } + return null; + } + return createChainableTypeChecker(validate); + } + + function createStrictShapeTypeChecker(shapeTypes) { + function validate(props, propName, componentName, location, propFullName) { + var propValue = props[propName]; + var propType = getPropType(propValue); + if (propType !== 'object') { + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.')); + } + // We need to check all keys in case some are required but missing from + // props. + var allKeys = objectAssign({}, props[propName], shapeTypes); + for (var key in allKeys) { + var checker = shapeTypes[key]; + if (!checker) { + return new PropTypeError( + 'Invalid ' + location + ' `' + propFullName + '` key `' + key + '` supplied to `' + componentName + '`.' + + '\nBad object: ' + JSON.stringify(props[propName], null, ' ') + + '\nValid keys: ' + JSON.stringify(Object.keys(shapeTypes), null, ' ') + ); + } + var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret_1); + if (error) { + return error; + } + } + return null; + } + + return createChainableTypeChecker(validate); + } + + function isNode(propValue) { + switch (typeof propValue) { + case 'number': + case 'string': + case 'undefined': + return true; + case 'boolean': + return !propValue; + case 'object': + if (Array.isArray(propValue)) { + return propValue.every(isNode); + } + if (propValue === null || isValidElement(propValue)) { + return true; + } + + var iteratorFn = getIteratorFn(propValue); + if (iteratorFn) { + var iterator = iteratorFn.call(propValue); + var step; + if (iteratorFn !== propValue.entries) { + while (!(step = iterator.next()).done) { + if (!isNode(step.value)) { + return false; + } + } + } else { + // Iterator will provide entry [k,v] tuples rather than values. + while (!(step = iterator.next()).done) { + var entry = step.value; + if (entry) { + if (!isNode(entry[1])) { + return false; + } + } + } + } + } else { + return false; + } + + return true; + default: + return false; + } + } + + function isSymbol(propType, propValue) { + // Native Symbol. + if (propType === 'symbol') { + return true; + } + + // falsy value can't be a Symbol + if (!propValue) { + return false; + } + + // 19.4.3.5 Symbol.prototype[@@toStringTag] === 'Symbol' + if (propValue['@@toStringTag'] === 'Symbol') { + return true; + } + + // Fallback for non-spec compliant Symbols which are polyfilled. + if (typeof Symbol === 'function' && propValue instanceof Symbol) { + return true; + } + + return false; + } + + // Equivalent of `typeof` but with special handling for array and regexp. + function getPropType(propValue) { + var propType = typeof propValue; + if (Array.isArray(propValue)) { + return 'array'; + } + if (propValue instanceof RegExp) { + // Old webkits (at least until Android 4.0) return 'function' rather than + // 'object' for typeof a RegExp. We'll normalize this here so that /bla/ + // passes PropTypes.object. + return 'object'; + } + if (isSymbol(propType, propValue)) { + return 'symbol'; + } + return propType; + } + + // This handles more types than `getPropType`. Only used for error messages. + // See `createPrimitiveTypeChecker`. + function getPreciseType(propValue) { + if (typeof propValue === 'undefined' || propValue === null) { + return '' + propValue; + } + var propType = getPropType(propValue); + if (propType === 'object') { + if (propValue instanceof Date) { + return 'date'; + } else if (propValue instanceof RegExp) { + return 'regexp'; + } + } + return propType; + } + + // Returns a string that is postfixed to a warning about an invalid type. + // For example, "undefined" or "of type array" + function getPostfixForTypeWarning(value) { + var type = getPreciseType(value); + switch (type) { + case 'array': + case 'object': + return 'an ' + type; + case 'boolean': + case 'date': + case 'regexp': + return 'a ' + type; + default: + return type; + } + } + + // Returns class name of the object, if any. + function getClassName(propValue) { + if (!propValue.constructor || !propValue.constructor.name) { + return ANONYMOUS; + } + return propValue.constructor.name; + } + + ReactPropTypes.checkPropTypes = checkPropTypes_1; + ReactPropTypes.resetWarningCache = checkPropTypes_1.resetWarningCache; + ReactPropTypes.PropTypes = ReactPropTypes; + + return ReactPropTypes; +};var propTypes = createCommonjsModule(function (module) { +/** + * Copyright (c) 2013-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +{ + var ReactIs = reactIs; + + // By explicitly using `prop-types` you are opting into new development behavior. + // http://fb.me/prop-types-in-prod + var throwOnDirectAccess = true; + module.exports = factoryWithTypeCheckers(ReactIs.isElement, throwOnDirectAccess); +} +});/** Detect free variable `global` from Node.js. */ +var freeGlobal = typeof commonjsGlobal == 'object' && commonjsGlobal && commonjsGlobal.Object === Object && commonjsGlobal; + +var _freeGlobal = freeGlobal;/** Detect free variable `self`. */ +var freeSelf = typeof self == 'object' && self && self.Object === Object && self; + +/** Used as a reference to the global object. */ +var root = _freeGlobal || freeSelf || Function('return this')(); + +var _root = root;/** Built-in value references. */ +var Symbol$1 = _root.Symbol; + +var _Symbol = Symbol$1;/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty$1 = objectProto.hasOwnProperty; + +/** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ +var nativeObjectToString = objectProto.toString; + +/** Built-in value references. */ +var symToStringTag = _Symbol ? _Symbol.toStringTag : undefined; + +/** + * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the raw `toStringTag`. + */ +function getRawTag(value) { + var isOwn = hasOwnProperty$1.call(value, symToStringTag), + tag = value[symToStringTag]; + + try { + value[symToStringTag] = undefined; + var unmasked = true; + } catch (e) {} + + var result = nativeObjectToString.call(value); + if (unmasked) { + if (isOwn) { + value[symToStringTag] = tag; + } else { + delete value[symToStringTag]; + } + } + return result; +} + +var _getRawTag = getRawTag;/** Used for built-in method references. */ +var objectProto$1 = Object.prototype; + +/** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ +var nativeObjectToString$1 = objectProto$1.toString; + +/** + * Converts `value` to a string using `Object.prototype.toString`. + * + * @private + * @param {*} value The value to convert. + * @returns {string} Returns the converted string. + */ +function objectToString(value) { + return nativeObjectToString$1.call(value); +} + +var _objectToString = objectToString;/** `Object#toString` result references. */ +var nullTag = '[object Null]', + undefinedTag = '[object Undefined]'; + +/** Built-in value references. */ +var symToStringTag$1 = _Symbol ? _Symbol.toStringTag : undefined; + +/** + * The base implementation of `getTag` without fallbacks for buggy environments. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the `toStringTag`. + */ +function baseGetTag(value) { + if (value == null) { + return value === undefined ? undefinedTag : nullTag; + } + return (symToStringTag$1 && symToStringTag$1 in Object(value)) + ? _getRawTag(value) + : _objectToString(value); +} + +var _baseGetTag = baseGetTag;/** + * Checks if `value` is classified as an `Array` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array, else `false`. + * @example + * + * _.isArray([1, 2, 3]); + * // => true + * + * _.isArray(document.body.children); + * // => false + * + * _.isArray('abc'); + * // => false + * + * _.isArray(_.noop); + * // => false + */ +var isArray = Array.isArray; + +var isArray_1 = isArray;/** + * Checks if `value` is object-like. A value is object-like if it's not `null` + * and has a `typeof` result of "object". + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + * @example + * + * _.isObjectLike({}); + * // => true + * + * _.isObjectLike([1, 2, 3]); + * // => true + * + * _.isObjectLike(_.noop); + * // => false + * + * _.isObjectLike(null); + * // => false + */ +function isObjectLike(value) { + return value != null && typeof value == 'object'; +} + +var isObjectLike_1 = isObjectLike;/** `Object#toString` result references. */ +var stringTag = '[object String]'; + +/** + * Checks if `value` is classified as a `String` primitive or object. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a string, else `false`. + * @example + * + * _.isString('abc'); + * // => true + * + * _.isString(1); + * // => false + */ +function isString(value) { + return typeof value == 'string' || + (!isArray_1(value) && isObjectLike_1(value) && _baseGetTag(value) == stringTag); +} + +var isString_1 = isString;/** + * Creates a base function for methods like `_.forIn` and `_.forOwn`. + * + * @private + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new base function. + */ +function createBaseFor(fromRight) { + return function(object, iteratee, keysFunc) { + var index = -1, + iterable = Object(object), + props = keysFunc(object), + length = props.length; + + while (length--) { + var key = props[fromRight ? length : ++index]; + if (iteratee(iterable[key], key, iterable) === false) { + break; + } + } + return object; + }; +} + +var _createBaseFor = createBaseFor;/** + * The base implementation of `baseForOwn` which iterates over `object` + * properties returned by `keysFunc` and invokes `iteratee` for each property. + * Iteratee functions may exit iteration early by explicitly returning `false`. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {Function} keysFunc The function to get the keys of `object`. + * @returns {Object} Returns `object`. + */ +var baseFor = _createBaseFor(); + +var _baseFor = baseFor;/** + * The base implementation of `_.times` without support for iteratee shorthands + * or max array length checks. + * + * @private + * @param {number} n The number of times to invoke `iteratee`. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the array of results. + */ +function baseTimes(n, iteratee) { + var index = -1, + result = Array(n); + + while (++index < n) { + result[index] = iteratee(index); + } + return result; +} + +var _baseTimes = baseTimes;/** `Object#toString` result references. */ +var argsTag = '[object Arguments]'; + +/** + * The base implementation of `_.isArguments`. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an `arguments` object, + */ +function baseIsArguments(value) { + return isObjectLike_1(value) && _baseGetTag(value) == argsTag; +} + +var _baseIsArguments = baseIsArguments;/** Used for built-in method references. */ +var objectProto$2 = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty$2 = objectProto$2.hasOwnProperty; + +/** Built-in value references. */ +var propertyIsEnumerable = objectProto$2.propertyIsEnumerable; + +/** + * Checks if `value` is likely an `arguments` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an `arguments` object, + * else `false`. + * @example + * + * _.isArguments(function() { return arguments; }()); + * // => true + * + * _.isArguments([1, 2, 3]); + * // => false + */ +var isArguments = _baseIsArguments(function() { return arguments; }()) ? _baseIsArguments : function(value) { + return isObjectLike_1(value) && hasOwnProperty$2.call(value, 'callee') && + !propertyIsEnumerable.call(value, 'callee'); +}; + +var isArguments_1 = isArguments;/** + * This method returns `false`. + * + * @static + * @memberOf _ + * @since 4.13.0 + * @category Util + * @returns {boolean} Returns `false`. + * @example + * + * _.times(2, _.stubFalse); + * // => [false, false] + */ +function stubFalse() { + return false; +} + +var stubFalse_1 = stubFalse;var isBuffer_1 = createCommonjsModule(function (module, exports) { +/** Detect free variable `exports`. */ +var freeExports = exports && !exports.nodeType && exports; + +/** Detect free variable `module`. */ +var freeModule = freeExports && 'object' == 'object' && module && !module.nodeType && module; + +/** Detect the popular CommonJS extension `module.exports`. */ +var moduleExports = freeModule && freeModule.exports === freeExports; + +/** Built-in value references. */ +var Buffer = moduleExports ? _root.Buffer : undefined; + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined; + +/** + * Checks if `value` is a buffer. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a buffer, else `false`. + * @example + * + * _.isBuffer(new Buffer(2)); + * // => true + * + * _.isBuffer(new Uint8Array(2)); + * // => false + */ +var isBuffer = nativeIsBuffer || stubFalse_1; + +module.exports = isBuffer; +});/** Used as references for various `Number` constants. */ +var MAX_SAFE_INTEGER = 9007199254740991; + +/** Used to detect unsigned integer values. */ +var reIsUint = /^(?:0|[1-9]\d*)$/; + +/** + * Checks if `value` is a valid array-like index. + * + * @private + * @param {*} value The value to check. + * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. + * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. + */ +function isIndex(value, length) { + var type = typeof value; + length = length == null ? MAX_SAFE_INTEGER : length; + + return !!length && + (type == 'number' || + (type != 'symbol' && reIsUint.test(value))) && + (value > -1 && value % 1 == 0 && value < length); +} + +var _isIndex = isIndex;/** Used as references for various `Number` constants. */ +var MAX_SAFE_INTEGER$1 = 9007199254740991; + +/** + * Checks if `value` is a valid array-like length. + * + * **Note:** This method is loosely based on + * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. + * @example + * + * _.isLength(3); + * // => true + * + * _.isLength(Number.MIN_VALUE); + * // => false + * + * _.isLength(Infinity); + * // => false + * + * _.isLength('3'); + * // => false + */ +function isLength(value) { + return typeof value == 'number' && + value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER$1; +} + +var isLength_1 = isLength;/** `Object#toString` result references. */ +var argsTag$1 = '[object Arguments]', + arrayTag = '[object Array]', + boolTag = '[object Boolean]', + dateTag = '[object Date]', + errorTag = '[object Error]', + funcTag = '[object Function]', + mapTag = '[object Map]', + numberTag = '[object Number]', + objectTag = '[object Object]', + regexpTag = '[object RegExp]', + setTag = '[object Set]', + stringTag$1 = '[object String]', + weakMapTag = '[object WeakMap]'; + +var arrayBufferTag = '[object ArrayBuffer]', + dataViewTag = '[object DataView]', + float32Tag = '[object Float32Array]', + float64Tag = '[object Float64Array]', + int8Tag = '[object Int8Array]', + int16Tag = '[object Int16Array]', + int32Tag = '[object Int32Array]', + uint8Tag = '[object Uint8Array]', + uint8ClampedTag = '[object Uint8ClampedArray]', + uint16Tag = '[object Uint16Array]', + uint32Tag = '[object Uint32Array]'; + +/** Used to identify `toStringTag` values of typed arrays. */ +var typedArrayTags = {}; +typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = +typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = +typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = +typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = +typedArrayTags[uint32Tag] = true; +typedArrayTags[argsTag$1] = typedArrayTags[arrayTag] = +typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = +typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = +typedArrayTags[errorTag] = typedArrayTags[funcTag] = +typedArrayTags[mapTag] = typedArrayTags[numberTag] = +typedArrayTags[objectTag] = typedArrayTags[regexpTag] = +typedArrayTags[setTag] = typedArrayTags[stringTag$1] = +typedArrayTags[weakMapTag] = false; + +/** + * The base implementation of `_.isTypedArray` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. + */ +function baseIsTypedArray(value) { + return isObjectLike_1(value) && + isLength_1(value.length) && !!typedArrayTags[_baseGetTag(value)]; +} + +var _baseIsTypedArray = baseIsTypedArray;/** + * The base implementation of `_.unary` without support for storing metadata. + * + * @private + * @param {Function} func The function to cap arguments for. + * @returns {Function} Returns the new capped function. + */ +function baseUnary(func) { + return function(value) { + return func(value); + }; +} + +var _baseUnary = baseUnary;var _nodeUtil = createCommonjsModule(function (module, exports) { +/** Detect free variable `exports`. */ +var freeExports = exports && !exports.nodeType && exports; + +/** Detect free variable `module`. */ +var freeModule = freeExports && 'object' == 'object' && module && !module.nodeType && module; + +/** Detect the popular CommonJS extension `module.exports`. */ +var moduleExports = freeModule && freeModule.exports === freeExports; + +/** Detect free variable `process` from Node.js. */ +var freeProcess = moduleExports && _freeGlobal.process; + +/** Used to access faster Node.js helpers. */ +var nodeUtil = (function() { + try { + // Use `util.types` for Node.js 10+. + var types = freeModule && freeModule.require && freeModule.require('util').types; + + if (types) { + return types; + } + + // Legacy `process.binding('util')` for Node.js < 10. + return freeProcess && freeProcess.binding && freeProcess.binding('util'); + } catch (e) {} +}()); + +module.exports = nodeUtil; +});/* Node.js helper references. */ +var nodeIsTypedArray = _nodeUtil && _nodeUtil.isTypedArray; + +/** + * Checks if `value` is classified as a typed array. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. + * @example + * + * _.isTypedArray(new Uint8Array); + * // => true + * + * _.isTypedArray([]); + * // => false + */ +var isTypedArray = nodeIsTypedArray ? _baseUnary(nodeIsTypedArray) : _baseIsTypedArray; + +var isTypedArray_1 = isTypedArray;/** Used for built-in method references. */ +var objectProto$3 = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty$3 = objectProto$3.hasOwnProperty; + +/** + * Creates an array of the enumerable property names of the array-like `value`. + * + * @private + * @param {*} value The value to query. + * @param {boolean} inherited Specify returning inherited property names. + * @returns {Array} Returns the array of property names. + */ +function arrayLikeKeys(value, inherited) { + var isArr = isArray_1(value), + isArg = !isArr && isArguments_1(value), + isBuff = !isArr && !isArg && isBuffer_1(value), + isType = !isArr && !isArg && !isBuff && isTypedArray_1(value), + skipIndexes = isArr || isArg || isBuff || isType, + result = skipIndexes ? _baseTimes(value.length, String) : [], + length = result.length; + + for (var key in value) { + if ((inherited || hasOwnProperty$3.call(value, key)) && + !(skipIndexes && ( + // Safari 9 has enumerable `arguments.length` in strict mode. + key == 'length' || + // Node.js 0.10 has enumerable non-index properties on buffers. + (isBuff && (key == 'offset' || key == 'parent')) || + // PhantomJS 2 has enumerable non-index properties on typed arrays. + (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) || + // Skip index properties. + _isIndex(key, length) + ))) { + result.push(key); + } + } + return result; +} + +var _arrayLikeKeys = arrayLikeKeys;/** Used for built-in method references. */ +var objectProto$4 = Object.prototype; + +/** + * Checks if `value` is likely a prototype object. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a prototype, else `false`. + */ +function isPrototype(value) { + var Ctor = value && value.constructor, + proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto$4; + + return value === proto; +} + +var _isPrototype = isPrototype;/** + * Creates a unary function that invokes `func` with its argument transformed. + * + * @private + * @param {Function} func The function to wrap. + * @param {Function} transform The argument transform. + * @returns {Function} Returns the new function. + */ +function overArg(func, transform) { + return function(arg) { + return func(transform(arg)); + }; +} + +var _overArg = overArg;/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeKeys = _overArg(Object.keys, Object); + +var _nativeKeys = nativeKeys;/** Used for built-in method references. */ +var objectProto$5 = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty$4 = objectProto$5.hasOwnProperty; + +/** + * The base implementation of `_.keys` which doesn't treat sparse arrays as dense. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ +function baseKeys(object) { + if (!_isPrototype(object)) { + return _nativeKeys(object); + } + var result = []; + for (var key in Object(object)) { + if (hasOwnProperty$4.call(object, key) && key != 'constructor') { + result.push(key); + } + } + return result; +} + +var _baseKeys = baseKeys;/** + * Checks if `value` is the + * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) + * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(_.noop); + * // => true + * + * _.isObject(null); + * // => false + */ +function isObject(value) { + var type = typeof value; + return value != null && (type == 'object' || type == 'function'); +} + +var isObject_1 = isObject;/** `Object#toString` result references. */ +var asyncTag = '[object AsyncFunction]', + funcTag$1 = '[object Function]', + genTag = '[object GeneratorFunction]', + proxyTag = '[object Proxy]'; + +/** + * Checks if `value` is classified as a `Function` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a function, else `false`. + * @example + * + * _.isFunction(_); + * // => true + * + * _.isFunction(/abc/); + * // => false + */ +function isFunction(value) { + if (!isObject_1(value)) { + return false; + } + // The use of `Object#toString` avoids issues with the `typeof` operator + // in Safari 9 which returns 'object' for typed arrays and other constructors. + var tag = _baseGetTag(value); + return tag == funcTag$1 || tag == genTag || tag == asyncTag || tag == proxyTag; +} + +var isFunction_1 = isFunction;/** + * Checks if `value` is array-like. A value is considered array-like if it's + * not a function and has a `value.length` that's an integer greater than or + * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is array-like, else `false`. + * @example + * + * _.isArrayLike([1, 2, 3]); + * // => true + * + * _.isArrayLike(document.body.children); + * // => true + * + * _.isArrayLike('abc'); + * // => true + * + * _.isArrayLike(_.noop); + * // => false + */ +function isArrayLike(value) { + return value != null && isLength_1(value.length) && !isFunction_1(value); +} + +var isArrayLike_1 = isArrayLike;/** + * Creates an array of the own enumerable property names of `object`. + * + * **Note:** Non-object values are coerced to objects. See the + * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) + * for more details. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.keys(new Foo); + * // => ['a', 'b'] (iteration order is not guaranteed) + * + * _.keys('hi'); + * // => ['0', '1'] + */ +function keys(object) { + return isArrayLike_1(object) ? _arrayLikeKeys(object) : _baseKeys(object); +} + +var keys_1 = keys;/** + * The base implementation of `_.forOwn` without support for iteratee shorthands. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Object} Returns `object`. + */ +function baseForOwn(object, iteratee) { + return object && _baseFor(object, iteratee, keys_1); +} + +var _baseForOwn = baseForOwn;/** + * This method returns the first argument it receives. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Util + * @param {*} value Any value. + * @returns {*} Returns `value`. + * @example + * + * var object = { 'a': 1 }; + * + * console.log(_.identity(object) === object); + * // => true + */ +function identity(value) { + return value; +} + +var identity_1 = identity;/** + * Casts `value` to `identity` if it's not a function. + * + * @private + * @param {*} value The value to inspect. + * @returns {Function} Returns cast function. + */ +function castFunction(value) { + return typeof value == 'function' ? value : identity_1; +} + +var _castFunction = castFunction;/** + * Iterates over own enumerable string keyed properties of an object and + * invokes `iteratee` for each property. The iteratee is invoked with three + * arguments: (value, key, object). Iteratee functions may exit iteration + * early by explicitly returning `false`. + * + * @static + * @memberOf _ + * @since 0.3.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns `object`. + * @see _.forOwnRight + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.forOwn(new Foo, function(value, key) { + * console.log(key); + * }); + * // => Logs 'a' then 'b' (iteration order is not guaranteed). + */ +function forOwn(object, iteratee) { + return object && _baseForOwn(object, _castFunction(iteratee)); +} + +var forOwn_1 = forOwn;/** Built-in value references. */ +var getPrototype = _overArg(Object.getPrototypeOf, Object); + +var _getPrototype = getPrototype;/** `Object#toString` result references. */ +var objectTag$1 = '[object Object]'; + +/** Used for built-in method references. */ +var funcProto = Function.prototype, + objectProto$6 = Object.prototype; + +/** Used to resolve the decompiled source of functions. */ +var funcToString = funcProto.toString; + +/** Used to check objects for own properties. */ +var hasOwnProperty$5 = objectProto$6.hasOwnProperty; + +/** Used to infer the `Object` constructor. */ +var objectCtorString = funcToString.call(Object); + +/** + * Checks if `value` is a plain object, that is, an object created by the + * `Object` constructor or one with a `[[Prototype]]` of `null`. + * + * @static + * @memberOf _ + * @since 0.8.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a plain object, else `false`. + * @example + * + * function Foo() { + * this.a = 1; + * } + * + * _.isPlainObject(new Foo); + * // => false + * + * _.isPlainObject([1, 2, 3]); + * // => false + * + * _.isPlainObject({ 'x': 0, 'y': 0 }); + * // => true + * + * _.isPlainObject(Object.create(null)); + * // => true + */ +function isPlainObject(value) { + if (!isObjectLike_1(value) || _baseGetTag(value) != objectTag$1) { + return false; + } + var proto = _getPrototype(value); + if (proto === null) { + return true; + } + var Ctor = hasOwnProperty$5.call(proto, 'constructor') && proto.constructor; + return typeof Ctor == 'function' && Ctor instanceof Ctor && + funcToString.call(Ctor) == objectCtorString; +} + +var isPlainObject_1 = isPlainObject;/** + * A specialized version of `_.map` for arrays without support for iteratee + * shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the new mapped array. + */ +function arrayMap(array, iteratee) { + var index = -1, + length = array == null ? 0 : array.length, + result = Array(length); + + while (++index < length) { + result[index] = iteratee(array[index], index, array); + } + return result; +} + +var _arrayMap = arrayMap;/** + * Removes all key-value entries from the list cache. + * + * @private + * @name clear + * @memberOf ListCache + */ +function listCacheClear() { + this.__data__ = []; + this.size = 0; +} + +var _listCacheClear = listCacheClear;/** + * Performs a + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * comparison between two values to determine if they are equivalent. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + * @example + * + * var object = { 'a': 1 }; + * var other = { 'a': 1 }; + * + * _.eq(object, object); + * // => true + * + * _.eq(object, other); + * // => false + * + * _.eq('a', 'a'); + * // => true + * + * _.eq('a', Object('a')); + * // => false + * + * _.eq(NaN, NaN); + * // => true + */ +function eq(value, other) { + return value === other || (value !== value && other !== other); +} + +var eq_1 = eq;/** + * Gets the index at which the `key` is found in `array` of key-value pairs. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} key The key to search for. + * @returns {number} Returns the index of the matched value, else `-1`. + */ +function assocIndexOf(array, key) { + var length = array.length; + while (length--) { + if (eq_1(array[length][0], key)) { + return length; + } + } + return -1; +} + +var _assocIndexOf = assocIndexOf;/** Used for built-in method references. */ +var arrayProto = Array.prototype; + +/** Built-in value references. */ +var splice = arrayProto.splice; + +/** + * Removes `key` and its value from the list cache. + * + * @private + * @name delete + * @memberOf ListCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ +function listCacheDelete(key) { + var data = this.__data__, + index = _assocIndexOf(data, key); + + if (index < 0) { + return false; + } + var lastIndex = data.length - 1; + if (index == lastIndex) { + data.pop(); + } else { + splice.call(data, index, 1); + } + --this.size; + return true; +} + +var _listCacheDelete = listCacheDelete;/** + * Gets the list cache value for `key`. + * + * @private + * @name get + * @memberOf ListCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ +function listCacheGet(key) { + var data = this.__data__, + index = _assocIndexOf(data, key); + + return index < 0 ? undefined : data[index][1]; +} + +var _listCacheGet = listCacheGet;/** + * Checks if a list cache value for `key` exists. + * + * @private + * @name has + * @memberOf ListCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ +function listCacheHas(key) { + return _assocIndexOf(this.__data__, key) > -1; +} + +var _listCacheHas = listCacheHas;/** + * Sets the list cache `key` to `value`. + * + * @private + * @name set + * @memberOf ListCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the list cache instance. + */ +function listCacheSet(key, value) { + var data = this.__data__, + index = _assocIndexOf(data, key); + + if (index < 0) { + ++this.size; + data.push([key, value]); + } else { + data[index][1] = value; + } + return this; +} + +var _listCacheSet = listCacheSet;/** + * Creates an list cache object. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ +function ListCache(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } +} + +// Add methods to `ListCache`. +ListCache.prototype.clear = _listCacheClear; +ListCache.prototype['delete'] = _listCacheDelete; +ListCache.prototype.get = _listCacheGet; +ListCache.prototype.has = _listCacheHas; +ListCache.prototype.set = _listCacheSet; + +var _ListCache = ListCache;/** + * Removes all key-value entries from the stack. + * + * @private + * @name clear + * @memberOf Stack + */ +function stackClear() { + this.__data__ = new _ListCache; + this.size = 0; +} + +var _stackClear = stackClear;/** + * Removes `key` and its value from the stack. + * + * @private + * @name delete + * @memberOf Stack + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ +function stackDelete(key) { + var data = this.__data__, + result = data['delete'](key); + + this.size = data.size; + return result; +} + +var _stackDelete = stackDelete;/** + * Gets the stack value for `key`. + * + * @private + * @name get + * @memberOf Stack + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ +function stackGet(key) { + return this.__data__.get(key); +} + +var _stackGet = stackGet;/** + * Checks if a stack value for `key` exists. + * + * @private + * @name has + * @memberOf Stack + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ +function stackHas(key) { + return this.__data__.has(key); +} + +var _stackHas = stackHas;/** Used to detect overreaching core-js shims. */ +var coreJsData = _root['__core-js_shared__']; + +var _coreJsData = coreJsData;/** Used to detect methods masquerading as native. */ +var maskSrcKey = (function() { + var uid = /[^.]+$/.exec(_coreJsData && _coreJsData.keys && _coreJsData.keys.IE_PROTO || ''); + return uid ? ('Symbol(src)_1.' + uid) : ''; +}()); + +/** + * Checks if `func` has its source masked. + * + * @private + * @param {Function} func The function to check. + * @returns {boolean} Returns `true` if `func` is masked, else `false`. + */ +function isMasked(func) { + return !!maskSrcKey && (maskSrcKey in func); +} + +var _isMasked = isMasked;/** Used for built-in method references. */ +var funcProto$1 = Function.prototype; + +/** Used to resolve the decompiled source of functions. */ +var funcToString$1 = funcProto$1.toString; + +/** + * Converts `func` to its source code. + * + * @private + * @param {Function} func The function to convert. + * @returns {string} Returns the source code. + */ +function toSource(func) { + if (func != null) { + try { + return funcToString$1.call(func); + } catch (e) {} + try { + return (func + ''); + } catch (e) {} + } + return ''; +} + +var _toSource = toSource;/** + * Used to match `RegExp` + * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). + */ +var reRegExpChar = /[\\^$.*+?()[\]{}|]/g; + +/** Used to detect host constructors (Safari). */ +var reIsHostCtor = /^\[object .+?Constructor\]$/; + +/** Used for built-in method references. */ +var funcProto$2 = Function.prototype, + objectProto$7 = Object.prototype; + +/** Used to resolve the decompiled source of functions. */ +var funcToString$2 = funcProto$2.toString; + +/** Used to check objects for own properties. */ +var hasOwnProperty$6 = objectProto$7.hasOwnProperty; + +/** Used to detect if a method is native. */ +var reIsNative = RegExp('^' + + funcToString$2.call(hasOwnProperty$6).replace(reRegExpChar, '\\$&') + .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' +); + +/** + * The base implementation of `_.isNative` without bad shim checks. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a native function, + * else `false`. + */ +function baseIsNative(value) { + if (!isObject_1(value) || _isMasked(value)) { + return false; + } + var pattern = isFunction_1(value) ? reIsNative : reIsHostCtor; + return pattern.test(_toSource(value)); +} + +var _baseIsNative = baseIsNative;/** + * Gets the value at `key` of `object`. + * + * @private + * @param {Object} [object] The object to query. + * @param {string} key The key of the property to get. + * @returns {*} Returns the property value. + */ +function getValue(object, key) { + return object == null ? undefined : object[key]; +} + +var _getValue = getValue;/** + * Gets the native function at `key` of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the method to get. + * @returns {*} Returns the function if it's native, else `undefined`. + */ +function getNative(object, key) { + var value = _getValue(object, key); + return _baseIsNative(value) ? value : undefined; +} + +var _getNative = getNative;/* Built-in method references that are verified to be native. */ +var Map = _getNative(_root, 'Map'); + +var _Map = Map;/* Built-in method references that are verified to be native. */ +var nativeCreate = _getNative(Object, 'create'); + +var _nativeCreate = nativeCreate;/** + * Removes all key-value entries from the hash. + * + * @private + * @name clear + * @memberOf Hash + */ +function hashClear() { + this.__data__ = _nativeCreate ? _nativeCreate(null) : {}; + this.size = 0; +} + +var _hashClear = hashClear;/** + * Removes `key` and its value from the hash. + * + * @private + * @name delete + * @memberOf Hash + * @param {Object} hash The hash to modify. + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ +function hashDelete(key) { + var result = this.has(key) && delete this.__data__[key]; + this.size -= result ? 1 : 0; + return result; +} + +var _hashDelete = hashDelete;/** Used to stand-in for `undefined` hash values. */ +var HASH_UNDEFINED = '__lodash_hash_undefined__'; + +/** Used for built-in method references. */ +var objectProto$8 = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty$7 = objectProto$8.hasOwnProperty; + +/** + * Gets the hash value for `key`. + * + * @private + * @name get + * @memberOf Hash + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ +function hashGet(key) { + var data = this.__data__; + if (_nativeCreate) { + var result = data[key]; + return result === HASH_UNDEFINED ? undefined : result; + } + return hasOwnProperty$7.call(data, key) ? data[key] : undefined; +} + +var _hashGet = hashGet;/** Used for built-in method references. */ +var objectProto$9 = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty$8 = objectProto$9.hasOwnProperty; + +/** + * Checks if a hash value for `key` exists. + * + * @private + * @name has + * @memberOf Hash + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ +function hashHas(key) { + var data = this.__data__; + return _nativeCreate ? (data[key] !== undefined) : hasOwnProperty$8.call(data, key); +} + +var _hashHas = hashHas;/** Used to stand-in for `undefined` hash values. */ +var HASH_UNDEFINED$1 = '__lodash_hash_undefined__'; + +/** + * Sets the hash `key` to `value`. + * + * @private + * @name set + * @memberOf Hash + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the hash instance. + */ +function hashSet(key, value) { + var data = this.__data__; + this.size += this.has(key) ? 0 : 1; + data[key] = (_nativeCreate && value === undefined) ? HASH_UNDEFINED$1 : value; + return this; +} + +var _hashSet = hashSet;/** + * Creates a hash object. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ +function Hash(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } +} + +// Add methods to `Hash`. +Hash.prototype.clear = _hashClear; +Hash.prototype['delete'] = _hashDelete; +Hash.prototype.get = _hashGet; +Hash.prototype.has = _hashHas; +Hash.prototype.set = _hashSet; + +var _Hash = Hash;/** + * Removes all key-value entries from the map. + * + * @private + * @name clear + * @memberOf MapCache + */ +function mapCacheClear() { + this.size = 0; + this.__data__ = { + 'hash': new _Hash, + 'map': new (_Map || _ListCache), + 'string': new _Hash + }; +} + +var _mapCacheClear = mapCacheClear;/** + * Checks if `value` is suitable for use as unique object key. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is suitable, else `false`. + */ +function isKeyable(value) { + var type = typeof value; + return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean') + ? (value !== '__proto__') + : (value === null); +} + +var _isKeyable = isKeyable;/** + * Gets the data for `map`. + * + * @private + * @param {Object} map The map to query. + * @param {string} key The reference key. + * @returns {*} Returns the map data. + */ +function getMapData(map, key) { + var data = map.__data__; + return _isKeyable(key) + ? data[typeof key == 'string' ? 'string' : 'hash'] + : data.map; +} + +var _getMapData = getMapData;/** + * Removes `key` and its value from the map. + * + * @private + * @name delete + * @memberOf MapCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ +function mapCacheDelete(key) { + var result = _getMapData(this, key)['delete'](key); + this.size -= result ? 1 : 0; + return result; +} + +var _mapCacheDelete = mapCacheDelete;/** + * Gets the map value for `key`. + * + * @private + * @name get + * @memberOf MapCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ +function mapCacheGet(key) { + return _getMapData(this, key).get(key); +} + +var _mapCacheGet = mapCacheGet;/** + * Checks if a map value for `key` exists. + * + * @private + * @name has + * @memberOf MapCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ +function mapCacheHas(key) { + return _getMapData(this, key).has(key); +} + +var _mapCacheHas = mapCacheHas;/** + * Sets the map `key` to `value`. + * + * @private + * @name set + * @memberOf MapCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the map cache instance. + */ +function mapCacheSet(key, value) { + var data = _getMapData(this, key), + size = data.size; + + data.set(key, value); + this.size += data.size == size ? 0 : 1; + return this; +} + +var _mapCacheSet = mapCacheSet;/** + * Creates a map cache object to store key-value pairs. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ +function MapCache(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } +} + +// Add methods to `MapCache`. +MapCache.prototype.clear = _mapCacheClear; +MapCache.prototype['delete'] = _mapCacheDelete; +MapCache.prototype.get = _mapCacheGet; +MapCache.prototype.has = _mapCacheHas; +MapCache.prototype.set = _mapCacheSet; + +var _MapCache = MapCache;/** Used as the size to enable large array optimizations. */ +var LARGE_ARRAY_SIZE = 200; + +/** + * Sets the stack `key` to `value`. + * + * @private + * @name set + * @memberOf Stack + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the stack cache instance. + */ +function stackSet(key, value) { + var data = this.__data__; + if (data instanceof _ListCache) { + var pairs = data.__data__; + if (!_Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) { + pairs.push([key, value]); + this.size = ++data.size; + return this; + } + data = this.__data__ = new _MapCache(pairs); + } + data.set(key, value); + this.size = data.size; + return this; +} + +var _stackSet = stackSet;/** + * Creates a stack cache object to store key-value pairs. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ +function Stack(entries) { + var data = this.__data__ = new _ListCache(entries); + this.size = data.size; +} + +// Add methods to `Stack`. +Stack.prototype.clear = _stackClear; +Stack.prototype['delete'] = _stackDelete; +Stack.prototype.get = _stackGet; +Stack.prototype.has = _stackHas; +Stack.prototype.set = _stackSet; + +var _Stack = Stack;/** Used to stand-in for `undefined` hash values. */ +var HASH_UNDEFINED$2 = '__lodash_hash_undefined__'; + +/** + * Adds `value` to the array cache. + * + * @private + * @name add + * @memberOf SetCache + * @alias push + * @param {*} value The value to cache. + * @returns {Object} Returns the cache instance. + */ +function setCacheAdd(value) { + this.__data__.set(value, HASH_UNDEFINED$2); + return this; +} + +var _setCacheAdd = setCacheAdd;/** + * Checks if `value` is in the array cache. + * + * @private + * @name has + * @memberOf SetCache + * @param {*} value The value to search for. + * @returns {number} Returns `true` if `value` is found, else `false`. + */ +function setCacheHas(value) { + return this.__data__.has(value); +} + +var _setCacheHas = setCacheHas;/** + * + * Creates an array cache object to store unique values. + * + * @private + * @constructor + * @param {Array} [values] The values to cache. + */ +function SetCache(values) { + var index = -1, + length = values == null ? 0 : values.length; + + this.__data__ = new _MapCache; + while (++index < length) { + this.add(values[index]); + } +} + +// Add methods to `SetCache`. +SetCache.prototype.add = SetCache.prototype.push = _setCacheAdd; +SetCache.prototype.has = _setCacheHas; + +var _SetCache = SetCache;/** + * A specialized version of `_.some` for arrays without support for iteratee + * shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if any element passes the predicate check, + * else `false`. + */ +function arraySome(array, predicate) { + var index = -1, + length = array == null ? 0 : array.length; + + while (++index < length) { + if (predicate(array[index], index, array)) { + return true; + } + } + return false; +} + +var _arraySome = arraySome;/** + * Checks if a `cache` value for `key` exists. + * + * @private + * @param {Object} cache The cache to query. + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ +function cacheHas(cache, key) { + return cache.has(key); +} + +var _cacheHas = cacheHas;/** Used to compose bitmasks for value comparisons. */ +var COMPARE_PARTIAL_FLAG = 1, + COMPARE_UNORDERED_FLAG = 2; + +/** + * A specialized version of `baseIsEqualDeep` for arrays with support for + * partial deep comparisons. + * + * @private + * @param {Array} array The array to compare. + * @param {Array} other The other array to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} stack Tracks traversed `array` and `other` objects. + * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`. + */ +function equalArrays(array, other, bitmask, customizer, equalFunc, stack) { + var isPartial = bitmask & COMPARE_PARTIAL_FLAG, + arrLength = array.length, + othLength = other.length; + + if (arrLength != othLength && !(isPartial && othLength > arrLength)) { + return false; + } + // Assume cyclic values are equal. + var stacked = stack.get(array); + if (stacked && stack.get(other)) { + return stacked == other; + } + var index = -1, + result = true, + seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new _SetCache : undefined; + + stack.set(array, other); + stack.set(other, array); + + // Ignore non-index properties. + while (++index < arrLength) { + var arrValue = array[index], + othValue = other[index]; + + if (customizer) { + var compared = isPartial + ? customizer(othValue, arrValue, index, other, array, stack) + : customizer(arrValue, othValue, index, array, other, stack); + } + if (compared !== undefined) { + if (compared) { + continue; + } + result = false; + break; + } + // Recursively compare arrays (susceptible to call stack limits). + if (seen) { + if (!_arraySome(other, function(othValue, othIndex) { + if (!_cacheHas(seen, othIndex) && + (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) { + return seen.push(othIndex); + } + })) { + result = false; + break; + } + } else if (!( + arrValue === othValue || + equalFunc(arrValue, othValue, bitmask, customizer, stack) + )) { + result = false; + break; + } + } + stack['delete'](array); + stack['delete'](other); + return result; +} + +var _equalArrays = equalArrays;/** Built-in value references. */ +var Uint8Array = _root.Uint8Array; + +var _Uint8Array = Uint8Array;/** + * Converts `map` to its key-value pairs. + * + * @private + * @param {Object} map The map to convert. + * @returns {Array} Returns the key-value pairs. + */ +function mapToArray(map) { + var index = -1, + result = Array(map.size); + + map.forEach(function(value, key) { + result[++index] = [key, value]; + }); + return result; +} + +var _mapToArray = mapToArray;/** + * Converts `set` to an array of its values. + * + * @private + * @param {Object} set The set to convert. + * @returns {Array} Returns the values. + */ +function setToArray(set) { + var index = -1, + result = Array(set.size); + + set.forEach(function(value) { + result[++index] = value; + }); + return result; +} + +var _setToArray = setToArray;/** Used to compose bitmasks for value comparisons. */ +var COMPARE_PARTIAL_FLAG$1 = 1, + COMPARE_UNORDERED_FLAG$1 = 2; + +/** `Object#toString` result references. */ +var boolTag$1 = '[object Boolean]', + dateTag$1 = '[object Date]', + errorTag$1 = '[object Error]', + mapTag$1 = '[object Map]', + numberTag$1 = '[object Number]', + regexpTag$1 = '[object RegExp]', + setTag$1 = '[object Set]', + stringTag$2 = '[object String]', + symbolTag = '[object Symbol]'; + +var arrayBufferTag$1 = '[object ArrayBuffer]', + dataViewTag$1 = '[object DataView]'; + +/** Used to convert symbols to primitives and strings. */ +var symbolProto = _Symbol ? _Symbol.prototype : undefined, + symbolValueOf = symbolProto ? symbolProto.valueOf : undefined; + +/** + * A specialized version of `baseIsEqualDeep` for comparing objects of + * the same `toStringTag`. + * + * **Note:** This function only supports comparing values with tags of + * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {string} tag The `toStringTag` of the objects to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} stack Tracks traversed `object` and `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ +function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) { + switch (tag) { + case dataViewTag$1: + if ((object.byteLength != other.byteLength) || + (object.byteOffset != other.byteOffset)) { + return false; + } + object = object.buffer; + other = other.buffer; + + case arrayBufferTag$1: + if ((object.byteLength != other.byteLength) || + !equalFunc(new _Uint8Array(object), new _Uint8Array(other))) { + return false; + } + return true; + + case boolTag$1: + case dateTag$1: + case numberTag$1: + // Coerce booleans to `1` or `0` and dates to milliseconds. + // Invalid dates are coerced to `NaN`. + return eq_1(+object, +other); + + case errorTag$1: + return object.name == other.name && object.message == other.message; + + case regexpTag$1: + case stringTag$2: + // Coerce regexes to strings and treat strings, primitives and objects, + // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring + // for more details. + return object == (other + ''); + + case mapTag$1: + var convert = _mapToArray; + + case setTag$1: + var isPartial = bitmask & COMPARE_PARTIAL_FLAG$1; + convert || (convert = _setToArray); + + if (object.size != other.size && !isPartial) { + return false; + } + // Assume cyclic values are equal. + var stacked = stack.get(object); + if (stacked) { + return stacked == other; + } + bitmask |= COMPARE_UNORDERED_FLAG$1; + + // Recursively compare objects (susceptible to call stack limits). + stack.set(object, other); + var result = _equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack); + stack['delete'](object); + return result; + + case symbolTag: + if (symbolValueOf) { + return symbolValueOf.call(object) == symbolValueOf.call(other); + } + } + return false; +} + +var _equalByTag = equalByTag;/** + * Appends the elements of `values` to `array`. + * + * @private + * @param {Array} array The array to modify. + * @param {Array} values The values to append. + * @returns {Array} Returns `array`. + */ +function arrayPush(array, values) { + var index = -1, + length = values.length, + offset = array.length; + + while (++index < length) { + array[offset + index] = values[index]; + } + return array; +} + +var _arrayPush = arrayPush;/** + * The base implementation of `getAllKeys` and `getAllKeysIn` which uses + * `keysFunc` and `symbolsFunc` to get the enumerable property names and + * symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {Function} keysFunc The function to get the keys of `object`. + * @param {Function} symbolsFunc The function to get the symbols of `object`. + * @returns {Array} Returns the array of property names and symbols. + */ +function baseGetAllKeys(object, keysFunc, symbolsFunc) { + var result = keysFunc(object); + return isArray_1(object) ? result : _arrayPush(result, symbolsFunc(object)); +} + +var _baseGetAllKeys = baseGetAllKeys;/** + * A specialized version of `_.filter` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {Array} Returns the new filtered array. + */ +function arrayFilter(array, predicate) { + var index = -1, + length = array == null ? 0 : array.length, + resIndex = 0, + result = []; + + while (++index < length) { + var value = array[index]; + if (predicate(value, index, array)) { + result[resIndex++] = value; + } + } + return result; +} + +var _arrayFilter = arrayFilter;/** + * This method returns a new empty array. + * + * @static + * @memberOf _ + * @since 4.13.0 + * @category Util + * @returns {Array} Returns the new empty array. + * @example + * + * var arrays = _.times(2, _.stubArray); + * + * console.log(arrays); + * // => [[], []] + * + * console.log(arrays[0] === arrays[1]); + * // => false + */ +function stubArray() { + return []; +} + +var stubArray_1 = stubArray;/** Used for built-in method references. */ +var objectProto$a = Object.prototype; + +/** Built-in value references. */ +var propertyIsEnumerable$1 = objectProto$a.propertyIsEnumerable; + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeGetSymbols = Object.getOwnPropertySymbols; + +/** + * Creates an array of the own enumerable symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of symbols. + */ +var getSymbols = !nativeGetSymbols ? stubArray_1 : function(object) { + if (object == null) { + return []; + } + object = Object(object); + return _arrayFilter(nativeGetSymbols(object), function(symbol) { + return propertyIsEnumerable$1.call(object, symbol); + }); +}; + +var _getSymbols = getSymbols;/** + * Creates an array of own enumerable property names and symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names and symbols. + */ +function getAllKeys(object) { + return _baseGetAllKeys(object, keys_1, _getSymbols); +} + +var _getAllKeys = getAllKeys;/** Used to compose bitmasks for value comparisons. */ +var COMPARE_PARTIAL_FLAG$2 = 1; + +/** Used for built-in method references. */ +var objectProto$b = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty$9 = objectProto$b.hasOwnProperty; + +/** + * A specialized version of `baseIsEqualDeep` for objects with support for + * partial deep comparisons. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} stack Tracks traversed `object` and `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ +function equalObjects(object, other, bitmask, customizer, equalFunc, stack) { + var isPartial = bitmask & COMPARE_PARTIAL_FLAG$2, + objProps = _getAllKeys(object), + objLength = objProps.length, + othProps = _getAllKeys(other), + othLength = othProps.length; + + if (objLength != othLength && !isPartial) { + return false; + } + var index = objLength; + while (index--) { + var key = objProps[index]; + if (!(isPartial ? key in other : hasOwnProperty$9.call(other, key))) { + return false; + } + } + // Assume cyclic values are equal. + var stacked = stack.get(object); + if (stacked && stack.get(other)) { + return stacked == other; + } + var result = true; + stack.set(object, other); + stack.set(other, object); + + var skipCtor = isPartial; + while (++index < objLength) { + key = objProps[index]; + var objValue = object[key], + othValue = other[key]; + + if (customizer) { + var compared = isPartial + ? customizer(othValue, objValue, key, other, object, stack) + : customizer(objValue, othValue, key, object, other, stack); + } + // Recursively compare objects (susceptible to call stack limits). + if (!(compared === undefined + ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack)) + : compared + )) { + result = false; + break; + } + skipCtor || (skipCtor = key == 'constructor'); + } + if (result && !skipCtor) { + var objCtor = object.constructor, + othCtor = other.constructor; + + // Non `Object` object instances with different constructors are not equal. + if (objCtor != othCtor && + ('constructor' in object && 'constructor' in other) && + !(typeof objCtor == 'function' && objCtor instanceof objCtor && + typeof othCtor == 'function' && othCtor instanceof othCtor)) { + result = false; + } + } + stack['delete'](object); + stack['delete'](other); + return result; +} + +var _equalObjects = equalObjects;/* Built-in method references that are verified to be native. */ +var DataView = _getNative(_root, 'DataView'); + +var _DataView = DataView;/* Built-in method references that are verified to be native. */ +var Promise = _getNative(_root, 'Promise'); + +var _Promise = Promise;/* Built-in method references that are verified to be native. */ +var Set = _getNative(_root, 'Set'); + +var _Set = Set;/* Built-in method references that are verified to be native. */ +var WeakMap = _getNative(_root, 'WeakMap'); + +var _WeakMap = WeakMap;/** `Object#toString` result references. */ +var mapTag$2 = '[object Map]', + objectTag$2 = '[object Object]', + promiseTag = '[object Promise]', + setTag$2 = '[object Set]', + weakMapTag$1 = '[object WeakMap]'; + +var dataViewTag$2 = '[object DataView]'; + +/** Used to detect maps, sets, and weakmaps. */ +var dataViewCtorString = _toSource(_DataView), + mapCtorString = _toSource(_Map), + promiseCtorString = _toSource(_Promise), + setCtorString = _toSource(_Set), + weakMapCtorString = _toSource(_WeakMap); + +/** + * Gets the `toStringTag` of `value`. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the `toStringTag`. + */ +var getTag = _baseGetTag; + +// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6. +if ((_DataView && getTag(new _DataView(new ArrayBuffer(1))) != dataViewTag$2) || + (_Map && getTag(new _Map) != mapTag$2) || + (_Promise && getTag(_Promise.resolve()) != promiseTag) || + (_Set && getTag(new _Set) != setTag$2) || + (_WeakMap && getTag(new _WeakMap) != weakMapTag$1)) { + getTag = function(value) { + var result = _baseGetTag(value), + Ctor = result == objectTag$2 ? value.constructor : undefined, + ctorString = Ctor ? _toSource(Ctor) : ''; + + if (ctorString) { + switch (ctorString) { + case dataViewCtorString: return dataViewTag$2; + case mapCtorString: return mapTag$2; + case promiseCtorString: return promiseTag; + case setCtorString: return setTag$2; + case weakMapCtorString: return weakMapTag$1; + } + } + return result; + }; +} + +var _getTag = getTag;/** Used to compose bitmasks for value comparisons. */ +var COMPARE_PARTIAL_FLAG$3 = 1; + +/** `Object#toString` result references. */ +var argsTag$2 = '[object Arguments]', + arrayTag$1 = '[object Array]', + objectTag$3 = '[object Object]'; + +/** Used for built-in method references. */ +var objectProto$c = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty$a = objectProto$c.hasOwnProperty; + +/** + * A specialized version of `baseIsEqual` for arrays and objects which performs + * deep comparisons and tracks traversed objects enabling objects with circular + * references to be compared. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} [stack] Tracks traversed `object` and `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ +function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) { + var objIsArr = isArray_1(object), + othIsArr = isArray_1(other), + objTag = objIsArr ? arrayTag$1 : _getTag(object), + othTag = othIsArr ? arrayTag$1 : _getTag(other); + + objTag = objTag == argsTag$2 ? objectTag$3 : objTag; + othTag = othTag == argsTag$2 ? objectTag$3 : othTag; + + var objIsObj = objTag == objectTag$3, + othIsObj = othTag == objectTag$3, + isSameTag = objTag == othTag; + + if (isSameTag && isBuffer_1(object)) { + if (!isBuffer_1(other)) { + return false; + } + objIsArr = true; + objIsObj = false; + } + if (isSameTag && !objIsObj) { + stack || (stack = new _Stack); + return (objIsArr || isTypedArray_1(object)) + ? _equalArrays(object, other, bitmask, customizer, equalFunc, stack) + : _equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack); + } + if (!(bitmask & COMPARE_PARTIAL_FLAG$3)) { + var objIsWrapped = objIsObj && hasOwnProperty$a.call(object, '__wrapped__'), + othIsWrapped = othIsObj && hasOwnProperty$a.call(other, '__wrapped__'); + + if (objIsWrapped || othIsWrapped) { + var objUnwrapped = objIsWrapped ? object.value() : object, + othUnwrapped = othIsWrapped ? other.value() : other; + + stack || (stack = new _Stack); + return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack); + } + } + if (!isSameTag) { + return false; + } + stack || (stack = new _Stack); + return _equalObjects(object, other, bitmask, customizer, equalFunc, stack); +} + +var _baseIsEqualDeep = baseIsEqualDeep;/** + * The base implementation of `_.isEqual` which supports partial comparisons + * and tracks traversed objects. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @param {boolean} bitmask The bitmask flags. + * 1 - Unordered comparison + * 2 - Partial comparison + * @param {Function} [customizer] The function to customize comparisons. + * @param {Object} [stack] Tracks traversed `value` and `other` objects. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + */ +function baseIsEqual(value, other, bitmask, customizer, stack) { + if (value === other) { + return true; + } + if (value == null || other == null || (!isObjectLike_1(value) && !isObjectLike_1(other))) { + return value !== value && other !== other; + } + return _baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack); +} + +var _baseIsEqual = baseIsEqual;/** Used to compose bitmasks for value comparisons. */ +var COMPARE_PARTIAL_FLAG$4 = 1, + COMPARE_UNORDERED_FLAG$2 = 2; + +/** + * The base implementation of `_.isMatch` without support for iteratee shorthands. + * + * @private + * @param {Object} object The object to inspect. + * @param {Object} source The object of property values to match. + * @param {Array} matchData The property names, values, and compare flags to match. + * @param {Function} [customizer] The function to customize comparisons. + * @returns {boolean} Returns `true` if `object` is a match, else `false`. + */ +function baseIsMatch(object, source, matchData, customizer) { + var index = matchData.length, + length = index, + noCustomizer = !customizer; + + if (object == null) { + return !length; + } + object = Object(object); + while (index--) { + var data = matchData[index]; + if ((noCustomizer && data[2]) + ? data[1] !== object[data[0]] + : !(data[0] in object) + ) { + return false; + } + } + while (++index < length) { + data = matchData[index]; + var key = data[0], + objValue = object[key], + srcValue = data[1]; + + if (noCustomizer && data[2]) { + if (objValue === undefined && !(key in object)) { + return false; + } + } else { + var stack = new _Stack; + if (customizer) { + var result = customizer(objValue, srcValue, key, object, source, stack); + } + if (!(result === undefined + ? _baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG$4 | COMPARE_UNORDERED_FLAG$2, customizer, stack) + : result + )) { + return false; + } + } + } + return true; +} + +var _baseIsMatch = baseIsMatch;/** + * Checks if `value` is suitable for strict equality comparisons, i.e. `===`. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` if suitable for strict + * equality comparisons, else `false`. + */ +function isStrictComparable(value) { + return value === value && !isObject_1(value); +} + +var _isStrictComparable = isStrictComparable;/** + * Gets the property names, values, and compare flags of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the match data of `object`. + */ +function getMatchData(object) { + var result = keys_1(object), + length = result.length; + + while (length--) { + var key = result[length], + value = object[key]; + + result[length] = [key, value, _isStrictComparable(value)]; + } + return result; +} + +var _getMatchData = getMatchData;/** + * A specialized version of `matchesProperty` for source values suitable + * for strict equality comparisons, i.e. `===`. + * + * @private + * @param {string} key The key of the property to get. + * @param {*} srcValue The value to match. + * @returns {Function} Returns the new spec function. + */ +function matchesStrictComparable(key, srcValue) { + return function(object) { + if (object == null) { + return false; + } + return object[key] === srcValue && + (srcValue !== undefined || (key in Object(object))); + }; +} + +var _matchesStrictComparable = matchesStrictComparable;/** + * The base implementation of `_.matches` which doesn't clone `source`. + * + * @private + * @param {Object} source The object of property values to match. + * @returns {Function} Returns the new spec function. + */ +function baseMatches(source) { + var matchData = _getMatchData(source); + if (matchData.length == 1 && matchData[0][2]) { + return _matchesStrictComparable(matchData[0][0], matchData[0][1]); + } + return function(object) { + return object === source || _baseIsMatch(object, source, matchData); + }; +} + +var _baseMatches = baseMatches;/** `Object#toString` result references. */ +var symbolTag$1 = '[object Symbol]'; + +/** + * Checks if `value` is classified as a `Symbol` primitive or object. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. + * @example + * + * _.isSymbol(Symbol.iterator); + * // => true + * + * _.isSymbol('abc'); + * // => false + */ +function isSymbol(value) { + return typeof value == 'symbol' || + (isObjectLike_1(value) && _baseGetTag(value) == symbolTag$1); +} + +var isSymbol_1 = isSymbol;/** Used to match property names within property paths. */ +var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, + reIsPlainProp = /^\w*$/; + +/** + * Checks if `value` is a property name and not a property path. + * + * @private + * @param {*} value The value to check. + * @param {Object} [object] The object to query keys on. + * @returns {boolean} Returns `true` if `value` is a property name, else `false`. + */ +function isKey(value, object) { + if (isArray_1(value)) { + return false; + } + var type = typeof value; + if (type == 'number' || type == 'symbol' || type == 'boolean' || + value == null || isSymbol_1(value)) { + return true; + } + return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || + (object != null && value in Object(object)); +} + +var _isKey = isKey;/** Error message constants. */ +var FUNC_ERROR_TEXT = 'Expected a function'; + +/** + * Creates a function that memoizes the result of `func`. If `resolver` is + * provided, it determines the cache key for storing the result based on the + * arguments provided to the memoized function. By default, the first argument + * provided to the memoized function is used as the map cache key. The `func` + * is invoked with the `this` binding of the memoized function. + * + * **Note:** The cache is exposed as the `cache` property on the memoized + * function. Its creation may be customized by replacing the `_.memoize.Cache` + * constructor with one whose instances implement the + * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object) + * method interface of `clear`, `delete`, `get`, `has`, and `set`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to have its output memoized. + * @param {Function} [resolver] The function to resolve the cache key. + * @returns {Function} Returns the new memoized function. + * @example + * + * var object = { 'a': 1, 'b': 2 }; + * var other = { 'c': 3, 'd': 4 }; + * + * var values = _.memoize(_.values); + * values(object); + * // => [1, 2] + * + * values(other); + * // => [3, 4] + * + * object.a = 2; + * values(object); + * // => [1, 2] + * + * // Modify the result cache. + * values.cache.set(object, ['a', 'b']); + * values(object); + * // => ['a', 'b'] + * + * // Replace `_.memoize.Cache`. + * _.memoize.Cache = WeakMap; + */ +function memoize(func, resolver) { + if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) { + throw new TypeError(FUNC_ERROR_TEXT); + } + var memoized = function() { + var args = arguments, + key = resolver ? resolver.apply(this, args) : args[0], + cache = memoized.cache; + + if (cache.has(key)) { + return cache.get(key); + } + var result = func.apply(this, args); + memoized.cache = cache.set(key, result) || cache; + return result; + }; + memoized.cache = new (memoize.Cache || _MapCache); + return memoized; +} + +// Expose `MapCache`. +memoize.Cache = _MapCache; + +var memoize_1 = memoize;/** Used as the maximum memoize cache size. */ +var MAX_MEMOIZE_SIZE = 500; + +/** + * A specialized version of `_.memoize` which clears the memoized function's + * cache when it exceeds `MAX_MEMOIZE_SIZE`. + * + * @private + * @param {Function} func The function to have its output memoized. + * @returns {Function} Returns the new memoized function. + */ +function memoizeCapped(func) { + var result = memoize_1(func, function(key) { + if (cache.size === MAX_MEMOIZE_SIZE) { + cache.clear(); + } + return key; + }); + + var cache = result.cache; + return result; +} + +var _memoizeCapped = memoizeCapped;/** Used to match property names within property paths. */ +var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; + +/** Used to match backslashes in property paths. */ +var reEscapeChar = /\\(\\)?/g; + +/** + * Converts `string` to a property path array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the property path array. + */ +var stringToPath = _memoizeCapped(function(string) { + var result = []; + if (string.charCodeAt(0) === 46 /* . */) { + result.push(''); + } + string.replace(rePropName, function(match, number, quote, subString) { + result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match)); + }); + return result; +}); + +var _stringToPath = stringToPath;/** Used as references for various `Number` constants. */ +var INFINITY = 1 / 0; + +/** Used to convert symbols to primitives and strings. */ +var symbolProto$1 = _Symbol ? _Symbol.prototype : undefined, + symbolToString = symbolProto$1 ? symbolProto$1.toString : undefined; + +/** + * The base implementation of `_.toString` which doesn't convert nullish + * values to empty strings. + * + * @private + * @param {*} value The value to process. + * @returns {string} Returns the string. + */ +function baseToString(value) { + // Exit early for strings to avoid a performance hit in some environments. + if (typeof value == 'string') { + return value; + } + if (isArray_1(value)) { + // Recursively convert values (susceptible to call stack limits). + return _arrayMap(value, baseToString) + ''; + } + if (isSymbol_1(value)) { + return symbolToString ? symbolToString.call(value) : ''; + } + var result = (value + ''); + return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; +} + +var _baseToString = baseToString;/** + * Converts `value` to a string. An empty string is returned for `null` + * and `undefined` values. The sign of `-0` is preserved. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {string} Returns the converted string. + * @example + * + * _.toString(null); + * // => '' + * + * _.toString(-0); + * // => '-0' + * + * _.toString([1, 2, 3]); + * // => '1,2,3' + */ +function toString(value) { + return value == null ? '' : _baseToString(value); +} + +var toString_1 = toString;/** + * Casts `value` to a path array if it's not one. + * + * @private + * @param {*} value The value to inspect. + * @param {Object} [object] The object to query keys on. + * @returns {Array} Returns the cast property path array. + */ +function castPath(value, object) { + if (isArray_1(value)) { + return value; + } + return _isKey(value, object) ? [value] : _stringToPath(toString_1(value)); +} + +var _castPath = castPath;/** Used as references for various `Number` constants. */ +var INFINITY$1 = 1 / 0; + +/** + * Converts `value` to a string key if it's not a string or symbol. + * + * @private + * @param {*} value The value to inspect. + * @returns {string|symbol} Returns the key. + */ +function toKey(value) { + if (typeof value == 'string' || isSymbol_1(value)) { + return value; + } + var result = (value + ''); + return (result == '0' && (1 / value) == -INFINITY$1) ? '-0' : result; +} + +var _toKey = toKey;/** + * The base implementation of `_.get` without support for default values. + * + * @private + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to get. + * @returns {*} Returns the resolved value. + */ +function baseGet(object, path) { + path = _castPath(path, object); + + var index = 0, + length = path.length; + + while (object != null && index < length) { + object = object[_toKey(path[index++])]; + } + return (index && index == length) ? object : undefined; +} + +var _baseGet = baseGet;/** + * Gets the value at `path` of `object`. If the resolved value is + * `undefined`, the `defaultValue` is returned in its place. + * + * @static + * @memberOf _ + * @since 3.7.0 + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to get. + * @param {*} [defaultValue] The value returned for `undefined` resolved values. + * @returns {*} Returns the resolved value. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }] }; + * + * _.get(object, 'a[0].b.c'); + * // => 3 + * + * _.get(object, ['a', '0', 'b', 'c']); + * // => 3 + * + * _.get(object, 'a.b.c', 'default'); + * // => 'default' + */ +function get(object, path, defaultValue) { + var result = object == null ? undefined : _baseGet(object, path); + return result === undefined ? defaultValue : result; +} + +var get_1 = get;/** + * The base implementation of `_.hasIn` without support for deep paths. + * + * @private + * @param {Object} [object] The object to query. + * @param {Array|string} key The key to check. + * @returns {boolean} Returns `true` if `key` exists, else `false`. + */ +function baseHasIn(object, key) { + return object != null && key in Object(object); +} + +var _baseHasIn = baseHasIn;/** + * Checks if `path` exists on `object`. + * + * @private + * @param {Object} object The object to query. + * @param {Array|string} path The path to check. + * @param {Function} hasFunc The function to check properties. + * @returns {boolean} Returns `true` if `path` exists, else `false`. + */ +function hasPath(object, path, hasFunc) { + path = _castPath(path, object); + + var index = -1, + length = path.length, + result = false; + + while (++index < length) { + var key = _toKey(path[index]); + if (!(result = object != null && hasFunc(object, key))) { + break; + } + object = object[key]; + } + if (result || ++index != length) { + return result; + } + length = object == null ? 0 : object.length; + return !!length && isLength_1(length) && _isIndex(key, length) && + (isArray_1(object) || isArguments_1(object)); +} + +var _hasPath = hasPath;/** + * Checks if `path` is a direct or inherited property of `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path to check. + * @returns {boolean} Returns `true` if `path` exists, else `false`. + * @example + * + * var object = _.create({ 'a': _.create({ 'b': 2 }) }); + * + * _.hasIn(object, 'a'); + * // => true + * + * _.hasIn(object, 'a.b'); + * // => true + * + * _.hasIn(object, ['a', 'b']); + * // => true + * + * _.hasIn(object, 'b'); + * // => false + */ +function hasIn(object, path) { + return object != null && _hasPath(object, path, _baseHasIn); +} + +var hasIn_1 = hasIn;/** Used to compose bitmasks for value comparisons. */ +var COMPARE_PARTIAL_FLAG$5 = 1, + COMPARE_UNORDERED_FLAG$3 = 2; + +/** + * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`. + * + * @private + * @param {string} path The path of the property to get. + * @param {*} srcValue The value to match. + * @returns {Function} Returns the new spec function. + */ +function baseMatchesProperty(path, srcValue) { + if (_isKey(path) && _isStrictComparable(srcValue)) { + return _matchesStrictComparable(_toKey(path), srcValue); + } + return function(object) { + var objValue = get_1(object, path); + return (objValue === undefined && objValue === srcValue) + ? hasIn_1(object, path) + : _baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG$5 | COMPARE_UNORDERED_FLAG$3); + }; +} + +var _baseMatchesProperty = baseMatchesProperty;/** + * The base implementation of `_.property` without support for deep paths. + * + * @private + * @param {string} key The key of the property to get. + * @returns {Function} Returns the new accessor function. + */ +function baseProperty(key) { + return function(object) { + return object == null ? undefined : object[key]; + }; +} + +var _baseProperty = baseProperty;/** + * A specialized version of `baseProperty` which supports deep paths. + * + * @private + * @param {Array|string} path The path of the property to get. + * @returns {Function} Returns the new accessor function. + */ +function basePropertyDeep(path) { + return function(object) { + return _baseGet(object, path); + }; +} + +var _basePropertyDeep = basePropertyDeep;/** + * Creates a function that returns the value at `path` of a given object. + * + * @static + * @memberOf _ + * @since 2.4.0 + * @category Util + * @param {Array|string} path The path of the property to get. + * @returns {Function} Returns the new accessor function. + * @example + * + * var objects = [ + * { 'a': { 'b': 2 } }, + * { 'a': { 'b': 1 } } + * ]; + * + * _.map(objects, _.property('a.b')); + * // => [2, 1] + * + * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b'); + * // => [1, 2] + */ +function property(path) { + return _isKey(path) ? _baseProperty(_toKey(path)) : _basePropertyDeep(path); +} + +var property_1 = property;/** + * The base implementation of `_.iteratee`. + * + * @private + * @param {*} [value=_.identity] The value to convert to an iteratee. + * @returns {Function} Returns the iteratee. + */ +function baseIteratee(value) { + // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9. + // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details. + if (typeof value == 'function') { + return value; + } + if (value == null) { + return identity_1; + } + if (typeof value == 'object') { + return isArray_1(value) + ? _baseMatchesProperty(value[0], value[1]) + : _baseMatches(value); + } + return property_1(value); +} + +var _baseIteratee = baseIteratee;/** + * Creates a `baseEach` or `baseEachRight` function. + * + * @private + * @param {Function} eachFunc The function to iterate over a collection. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new base function. + */ +function createBaseEach(eachFunc, fromRight) { + return function(collection, iteratee) { + if (collection == null) { + return collection; + } + if (!isArrayLike_1(collection)) { + return eachFunc(collection, iteratee); + } + var length = collection.length, + index = fromRight ? length : -1, + iterable = Object(collection); + + while ((fromRight ? index-- : ++index < length)) { + if (iteratee(iterable[index], index, iterable) === false) { + break; + } + } + return collection; + }; +} + +var _createBaseEach = createBaseEach;/** + * The base implementation of `_.forEach` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array|Object} Returns `collection`. + */ +var baseEach = _createBaseEach(_baseForOwn); + +var _baseEach = baseEach;/** + * The base implementation of `_.map` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the new mapped array. + */ +function baseMap(collection, iteratee) { + var index = -1, + result = isArrayLike_1(collection) ? Array(collection.length) : []; + + _baseEach(collection, function(value, key, collection) { + result[++index] = iteratee(value, key, collection); + }); + return result; +} + +var _baseMap = baseMap;/** + * Creates an array of values by running each element in `collection` thru + * `iteratee`. The iteratee is invoked with three arguments: + * (value, index|key, collection). + * + * Many lodash methods are guarded to work as iteratees for methods like + * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`. + * + * The guarded methods are: + * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`, + * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`, + * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`, + * `template`, `trim`, `trimEnd`, `trimStart`, and `words` + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new mapped array. + * @example + * + * function square(n) { + * return n * n; + * } + * + * _.map([4, 8], square); + * // => [16, 64] + * + * _.map({ 'a': 4, 'b': 8 }, square); + * // => [16, 64] (iteration order is not guaranteed) + * + * var users = [ + * { 'user': 'barney' }, + * { 'user': 'fred' } + * ]; + * + * // The `_.property` iteratee shorthand. + * _.map(users, 'user'); + * // => ['barney', 'fred'] + */ +function map(collection, iteratee) { + var func = isArray_1(collection) ? _arrayMap : _baseMap; + return func(collection, _baseIteratee(iteratee)); +} + +var map_1 = map;var flattenNames_1 = createCommonjsModule(function (module, exports) { + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.flattenNames = undefined; + + + +var _isString3 = _interopRequireDefault(isString_1); + + + +var _forOwn3 = _interopRequireDefault(forOwn_1); + + + +var _isPlainObject3 = _interopRequireDefault(isPlainObject_1); + + + +var _map3 = _interopRequireDefault(map_1); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var flattenNames = exports.flattenNames = function flattenNames() { + var things = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; + + var names = []; + + (0, _map3.default)(things, function (thing) { + if (Array.isArray(thing)) { + flattenNames(thing).map(function (name) { + return names.push(name); + }); + } else if ((0, _isPlainObject3.default)(thing)) { + (0, _forOwn3.default)(thing, function (value, key) { + value === true && names.push(key); + names.push(key + '-' + value); + }); + } else if ((0, _isString3.default)(thing)) { + names.push(thing); + } + }); + + return names; +}; + +exports.default = flattenNames; +}); + +unwrapExports(flattenNames_1); +var flattenNames_2 = flattenNames_1.flattenNames;/** + * A specialized version of `_.forEach` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns `array`. + */ +function arrayEach(array, iteratee) { + var index = -1, + length = array == null ? 0 : array.length; + + while (++index < length) { + if (iteratee(array[index], index, array) === false) { + break; + } + } + return array; +} + +var _arrayEach = arrayEach;var defineProperty = (function() { + try { + var func = _getNative(Object, 'defineProperty'); + func({}, '', {}); + return func; + } catch (e) {} +}()); + +var _defineProperty = defineProperty;/** + * The base implementation of `assignValue` and `assignMergeValue` without + * value checks. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ +function baseAssignValue(object, key, value) { + if (key == '__proto__' && _defineProperty) { + _defineProperty(object, key, { + 'configurable': true, + 'enumerable': true, + 'value': value, + 'writable': true + }); + } else { + object[key] = value; + } +} + +var _baseAssignValue = baseAssignValue;/** Used for built-in method references. */ +var objectProto$d = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty$b = objectProto$d.hasOwnProperty; + +/** + * Assigns `value` to `key` of `object` if the existing value is not equivalent + * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ +function assignValue(object, key, value) { + var objValue = object[key]; + if (!(hasOwnProperty$b.call(object, key) && eq_1(objValue, value)) || + (value === undefined && !(key in object))) { + _baseAssignValue(object, key, value); + } +} + +var _assignValue = assignValue;/** + * Copies properties of `source` to `object`. + * + * @private + * @param {Object} source The object to copy properties from. + * @param {Array} props The property identifiers to copy. + * @param {Object} [object={}] The object to copy properties to. + * @param {Function} [customizer] The function to customize copied values. + * @returns {Object} Returns `object`. + */ +function copyObject(source, props, object, customizer) { + var isNew = !object; + object || (object = {}); + + var index = -1, + length = props.length; + + while (++index < length) { + var key = props[index]; + + var newValue = customizer + ? customizer(object[key], source[key], key, object, source) + : undefined; + + if (newValue === undefined) { + newValue = source[key]; + } + if (isNew) { + _baseAssignValue(object, key, newValue); + } else { + _assignValue(object, key, newValue); + } + } + return object; +} + +var _copyObject = copyObject;/** + * The base implementation of `_.assign` without support for multiple sources + * or `customizer` functions. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @returns {Object} Returns `object`. + */ +function baseAssign(object, source) { + return object && _copyObject(source, keys_1(source), object); +} + +var _baseAssign = baseAssign;/** + * This function is like + * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) + * except that it includes inherited enumerable properties. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ +function nativeKeysIn(object) { + var result = []; + if (object != null) { + for (var key in Object(object)) { + result.push(key); + } + } + return result; +} + +var _nativeKeysIn = nativeKeysIn;/** Used for built-in method references. */ +var objectProto$e = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty$c = objectProto$e.hasOwnProperty; + +/** + * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ +function baseKeysIn(object) { + if (!isObject_1(object)) { + return _nativeKeysIn(object); + } + var isProto = _isPrototype(object), + result = []; + + for (var key in object) { + if (!(key == 'constructor' && (isProto || !hasOwnProperty$c.call(object, key)))) { + result.push(key); + } + } + return result; +} + +var _baseKeysIn = baseKeysIn;/** + * Creates an array of the own and inherited enumerable property names of `object`. + * + * **Note:** Non-object values are coerced to objects. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.keysIn(new Foo); + * // => ['a', 'b', 'c'] (iteration order is not guaranteed) + */ +function keysIn$1(object) { + return isArrayLike_1(object) ? _arrayLikeKeys(object, true) : _baseKeysIn(object); +} + +var keysIn_1 = keysIn$1;/** + * The base implementation of `_.assignIn` without support for multiple sources + * or `customizer` functions. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @returns {Object} Returns `object`. + */ +function baseAssignIn(object, source) { + return object && _copyObject(source, keysIn_1(source), object); +} + +var _baseAssignIn = baseAssignIn;var _cloneBuffer = createCommonjsModule(function (module, exports) { +/** Detect free variable `exports`. */ +var freeExports = exports && !exports.nodeType && exports; + +/** Detect free variable `module`. */ +var freeModule = freeExports && 'object' == 'object' && module && !module.nodeType && module; + +/** Detect the popular CommonJS extension `module.exports`. */ +var moduleExports = freeModule && freeModule.exports === freeExports; + +/** Built-in value references. */ +var Buffer = moduleExports ? _root.Buffer : undefined, + allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined; + +/** + * Creates a clone of `buffer`. + * + * @private + * @param {Buffer} buffer The buffer to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Buffer} Returns the cloned buffer. + */ +function cloneBuffer(buffer, isDeep) { + if (isDeep) { + return buffer.slice(); + } + var length = buffer.length, + result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length); + + buffer.copy(result); + return result; +} + +module.exports = cloneBuffer; +});/** + * Copies the values of `source` to `array`. + * + * @private + * @param {Array} source The array to copy values from. + * @param {Array} [array=[]] The array to copy values to. + * @returns {Array} Returns `array`. + */ +function copyArray(source, array) { + var index = -1, + length = source.length; + + array || (array = Array(length)); + while (++index < length) { + array[index] = source[index]; + } + return array; +} + +var _copyArray = copyArray;/** + * Copies own symbols of `source` to `object`. + * + * @private + * @param {Object} source The object to copy symbols from. + * @param {Object} [object={}] The object to copy symbols to. + * @returns {Object} Returns `object`. + */ +function copySymbols(source, object) { + return _copyObject(source, _getSymbols(source), object); +} + +var _copySymbols = copySymbols;/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeGetSymbols$1 = Object.getOwnPropertySymbols; + +/** + * Creates an array of the own and inherited enumerable symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of symbols. + */ +var getSymbolsIn = !nativeGetSymbols$1 ? stubArray_1 : function(object) { + var result = []; + while (object) { + _arrayPush(result, _getSymbols(object)); + object = _getPrototype(object); + } + return result; +}; + +var _getSymbolsIn = getSymbolsIn;/** + * Copies own and inherited symbols of `source` to `object`. + * + * @private + * @param {Object} source The object to copy symbols from. + * @param {Object} [object={}] The object to copy symbols to. + * @returns {Object} Returns `object`. + */ +function copySymbolsIn(source, object) { + return _copyObject(source, _getSymbolsIn(source), object); +} + +var _copySymbolsIn = copySymbolsIn;/** + * Creates an array of own and inherited enumerable property names and + * symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names and symbols. + */ +function getAllKeysIn(object) { + return _baseGetAllKeys(object, keysIn_1, _getSymbolsIn); +} + +var _getAllKeysIn = getAllKeysIn;/** Used for built-in method references. */ +var objectProto$f = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty$d = objectProto$f.hasOwnProperty; + +/** + * Initializes an array clone. + * + * @private + * @param {Array} array The array to clone. + * @returns {Array} Returns the initialized clone. + */ +function initCloneArray(array) { + var length = array.length, + result = new array.constructor(length); + + // Add properties assigned by `RegExp#exec`. + if (length && typeof array[0] == 'string' && hasOwnProperty$d.call(array, 'index')) { + result.index = array.index; + result.input = array.input; + } + return result; +} + +var _initCloneArray = initCloneArray;/** + * Creates a clone of `arrayBuffer`. + * + * @private + * @param {ArrayBuffer} arrayBuffer The array buffer to clone. + * @returns {ArrayBuffer} Returns the cloned array buffer. + */ +function cloneArrayBuffer(arrayBuffer) { + var result = new arrayBuffer.constructor(arrayBuffer.byteLength); + new _Uint8Array(result).set(new _Uint8Array(arrayBuffer)); + return result; +} + +var _cloneArrayBuffer = cloneArrayBuffer;/** + * Creates a clone of `dataView`. + * + * @private + * @param {Object} dataView The data view to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Object} Returns the cloned data view. + */ +function cloneDataView(dataView, isDeep) { + var buffer = isDeep ? _cloneArrayBuffer(dataView.buffer) : dataView.buffer; + return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength); +} + +var _cloneDataView = cloneDataView;/** Used to match `RegExp` flags from their coerced string values. */ +var reFlags = /\w*$/; + +/** + * Creates a clone of `regexp`. + * + * @private + * @param {Object} regexp The regexp to clone. + * @returns {Object} Returns the cloned regexp. + */ +function cloneRegExp(regexp) { + var result = new regexp.constructor(regexp.source, reFlags.exec(regexp)); + result.lastIndex = regexp.lastIndex; + return result; +} + +var _cloneRegExp = cloneRegExp;/** Used to convert symbols to primitives and strings. */ +var symbolProto$2 = _Symbol ? _Symbol.prototype : undefined, + symbolValueOf$1 = symbolProto$2 ? symbolProto$2.valueOf : undefined; + +/** + * Creates a clone of the `symbol` object. + * + * @private + * @param {Object} symbol The symbol object to clone. + * @returns {Object} Returns the cloned symbol object. + */ +function cloneSymbol(symbol) { + return symbolValueOf$1 ? Object(symbolValueOf$1.call(symbol)) : {}; +} + +var _cloneSymbol = cloneSymbol;/** + * Creates a clone of `typedArray`. + * + * @private + * @param {Object} typedArray The typed array to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Object} Returns the cloned typed array. + */ +function cloneTypedArray(typedArray, isDeep) { + var buffer = isDeep ? _cloneArrayBuffer(typedArray.buffer) : typedArray.buffer; + return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length); +} + +var _cloneTypedArray = cloneTypedArray;/** `Object#toString` result references. */ +var boolTag$2 = '[object Boolean]', + dateTag$2 = '[object Date]', + mapTag$3 = '[object Map]', + numberTag$2 = '[object Number]', + regexpTag$2 = '[object RegExp]', + setTag$3 = '[object Set]', + stringTag$3 = '[object String]', + symbolTag$2 = '[object Symbol]'; + +var arrayBufferTag$2 = '[object ArrayBuffer]', + dataViewTag$3 = '[object DataView]', + float32Tag$1 = '[object Float32Array]', + float64Tag$1 = '[object Float64Array]', + int8Tag$1 = '[object Int8Array]', + int16Tag$1 = '[object Int16Array]', + int32Tag$1 = '[object Int32Array]', + uint8Tag$1 = '[object Uint8Array]', + uint8ClampedTag$1 = '[object Uint8ClampedArray]', + uint16Tag$1 = '[object Uint16Array]', + uint32Tag$1 = '[object Uint32Array]'; + +/** + * Initializes an object clone based on its `toStringTag`. + * + * **Note:** This function only supports cloning values with tags of + * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`. + * + * @private + * @param {Object} object The object to clone. + * @param {string} tag The `toStringTag` of the object to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Object} Returns the initialized clone. + */ +function initCloneByTag(object, tag, isDeep) { + var Ctor = object.constructor; + switch (tag) { + case arrayBufferTag$2: + return _cloneArrayBuffer(object); + + case boolTag$2: + case dateTag$2: + return new Ctor(+object); + + case dataViewTag$3: + return _cloneDataView(object, isDeep); + + case float32Tag$1: case float64Tag$1: + case int8Tag$1: case int16Tag$1: case int32Tag$1: + case uint8Tag$1: case uint8ClampedTag$1: case uint16Tag$1: case uint32Tag$1: + return _cloneTypedArray(object, isDeep); + + case mapTag$3: + return new Ctor; + + case numberTag$2: + case stringTag$3: + return new Ctor(object); + + case regexpTag$2: + return _cloneRegExp(object); + + case setTag$3: + return new Ctor; + + case symbolTag$2: + return _cloneSymbol(object); + } +} + +var _initCloneByTag = initCloneByTag;/** Built-in value references. */ +var objectCreate = Object.create; + +/** + * The base implementation of `_.create` without support for assigning + * properties to the created object. + * + * @private + * @param {Object} proto The object to inherit from. + * @returns {Object} Returns the new object. + */ +var baseCreate = (function() { + function object() {} + return function(proto) { + if (!isObject_1(proto)) { + return {}; + } + if (objectCreate) { + return objectCreate(proto); + } + object.prototype = proto; + var result = new object; + object.prototype = undefined; + return result; + }; +}()); + +var _baseCreate = baseCreate;/** + * Initializes an object clone. + * + * @private + * @param {Object} object The object to clone. + * @returns {Object} Returns the initialized clone. + */ +function initCloneObject(object) { + return (typeof object.constructor == 'function' && !_isPrototype(object)) + ? _baseCreate(_getPrototype(object)) + : {}; +} + +var _initCloneObject = initCloneObject;/** `Object#toString` result references. */ +var mapTag$4 = '[object Map]'; + +/** + * The base implementation of `_.isMap` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a map, else `false`. + */ +function baseIsMap(value) { + return isObjectLike_1(value) && _getTag(value) == mapTag$4; +} + +var _baseIsMap = baseIsMap;/* Node.js helper references. */ +var nodeIsMap = _nodeUtil && _nodeUtil.isMap; + +/** + * Checks if `value` is classified as a `Map` object. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a map, else `false`. + * @example + * + * _.isMap(new Map); + * // => true + * + * _.isMap(new WeakMap); + * // => false + */ +var isMap = nodeIsMap ? _baseUnary(nodeIsMap) : _baseIsMap; + +var isMap_1 = isMap;/** `Object#toString` result references. */ +var setTag$4 = '[object Set]'; + +/** + * The base implementation of `_.isSet` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a set, else `false`. + */ +function baseIsSet(value) { + return isObjectLike_1(value) && _getTag(value) == setTag$4; +} + +var _baseIsSet = baseIsSet;/* Node.js helper references. */ +var nodeIsSet = _nodeUtil && _nodeUtil.isSet; + +/** + * Checks if `value` is classified as a `Set` object. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a set, else `false`. + * @example + * + * _.isSet(new Set); + * // => true + * + * _.isSet(new WeakSet); + * // => false + */ +var isSet = nodeIsSet ? _baseUnary(nodeIsSet) : _baseIsSet; + +var isSet_1 = isSet;/** Used to compose bitmasks for cloning. */ +var CLONE_DEEP_FLAG = 1, + CLONE_FLAT_FLAG = 2, + CLONE_SYMBOLS_FLAG = 4; + +/** `Object#toString` result references. */ +var argsTag$3 = '[object Arguments]', + arrayTag$2 = '[object Array]', + boolTag$3 = '[object Boolean]', + dateTag$3 = '[object Date]', + errorTag$2 = '[object Error]', + funcTag$2 = '[object Function]', + genTag$1 = '[object GeneratorFunction]', + mapTag$5 = '[object Map]', + numberTag$3 = '[object Number]', + objectTag$4 = '[object Object]', + regexpTag$3 = '[object RegExp]', + setTag$5 = '[object Set]', + stringTag$4 = '[object String]', + symbolTag$3 = '[object Symbol]', + weakMapTag$2 = '[object WeakMap]'; + +var arrayBufferTag$3 = '[object ArrayBuffer]', + dataViewTag$4 = '[object DataView]', + float32Tag$2 = '[object Float32Array]', + float64Tag$2 = '[object Float64Array]', + int8Tag$2 = '[object Int8Array]', + int16Tag$2 = '[object Int16Array]', + int32Tag$2 = '[object Int32Array]', + uint8Tag$2 = '[object Uint8Array]', + uint8ClampedTag$2 = '[object Uint8ClampedArray]', + uint16Tag$2 = '[object Uint16Array]', + uint32Tag$2 = '[object Uint32Array]'; + +/** Used to identify `toStringTag` values supported by `_.clone`. */ +var cloneableTags = {}; +cloneableTags[argsTag$3] = cloneableTags[arrayTag$2] = +cloneableTags[arrayBufferTag$3] = cloneableTags[dataViewTag$4] = +cloneableTags[boolTag$3] = cloneableTags[dateTag$3] = +cloneableTags[float32Tag$2] = cloneableTags[float64Tag$2] = +cloneableTags[int8Tag$2] = cloneableTags[int16Tag$2] = +cloneableTags[int32Tag$2] = cloneableTags[mapTag$5] = +cloneableTags[numberTag$3] = cloneableTags[objectTag$4] = +cloneableTags[regexpTag$3] = cloneableTags[setTag$5] = +cloneableTags[stringTag$4] = cloneableTags[symbolTag$3] = +cloneableTags[uint8Tag$2] = cloneableTags[uint8ClampedTag$2] = +cloneableTags[uint16Tag$2] = cloneableTags[uint32Tag$2] = true; +cloneableTags[errorTag$2] = cloneableTags[funcTag$2] = +cloneableTags[weakMapTag$2] = false; + +/** + * The base implementation of `_.clone` and `_.cloneDeep` which tracks + * traversed objects. + * + * @private + * @param {*} value The value to clone. + * @param {boolean} bitmask The bitmask flags. + * 1 - Deep clone + * 2 - Flatten inherited properties + * 4 - Clone symbols + * @param {Function} [customizer] The function to customize cloning. + * @param {string} [key] The key of `value`. + * @param {Object} [object] The parent object of `value`. + * @param {Object} [stack] Tracks traversed objects and their clone counterparts. + * @returns {*} Returns the cloned value. + */ +function baseClone(value, bitmask, customizer, key, object, stack) { + var result, + isDeep = bitmask & CLONE_DEEP_FLAG, + isFlat = bitmask & CLONE_FLAT_FLAG, + isFull = bitmask & CLONE_SYMBOLS_FLAG; + + if (customizer) { + result = object ? customizer(value, key, object, stack) : customizer(value); + } + if (result !== undefined) { + return result; + } + if (!isObject_1(value)) { + return value; + } + var isArr = isArray_1(value); + if (isArr) { + result = _initCloneArray(value); + if (!isDeep) { + return _copyArray(value, result); + } + } else { + var tag = _getTag(value), + isFunc = tag == funcTag$2 || tag == genTag$1; + + if (isBuffer_1(value)) { + return _cloneBuffer(value, isDeep); + } + if (tag == objectTag$4 || tag == argsTag$3 || (isFunc && !object)) { + result = (isFlat || isFunc) ? {} : _initCloneObject(value); + if (!isDeep) { + return isFlat + ? _copySymbolsIn(value, _baseAssignIn(result, value)) + : _copySymbols(value, _baseAssign(result, value)); + } + } else { + if (!cloneableTags[tag]) { + return object ? value : {}; + } + result = _initCloneByTag(value, tag, isDeep); + } + } + // Check for circular references and return its corresponding clone. + stack || (stack = new _Stack); + var stacked = stack.get(value); + if (stacked) { + return stacked; + } + stack.set(value, result); + + if (isSet_1(value)) { + value.forEach(function(subValue) { + result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack)); + }); + } else if (isMap_1(value)) { + value.forEach(function(subValue, key) { + result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack)); + }); + } + + var keysFunc = isFull + ? (isFlat ? _getAllKeysIn : _getAllKeys) + : (isFlat ? keysIn : keys_1); + + var props = isArr ? undefined : keysFunc(value); + _arrayEach(props || value, function(subValue, key) { + if (props) { + key = subValue; + subValue = value[key]; + } + // Recursively populate clone (susceptible to call stack limits). + _assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack)); + }); + return result; +} + +var _baseClone = baseClone;/** Used to compose bitmasks for cloning. */ +var CLONE_DEEP_FLAG$1 = 1, + CLONE_SYMBOLS_FLAG$1 = 4; + +/** + * This method is like `_.clone` except that it recursively clones `value`. + * + * @static + * @memberOf _ + * @since 1.0.0 + * @category Lang + * @param {*} value The value to recursively clone. + * @returns {*} Returns the deep cloned value. + * @see _.clone + * @example + * + * var objects = [{ 'a': 1 }, { 'b': 2 }]; + * + * var deep = _.cloneDeep(objects); + * console.log(deep[0] === objects[0]); + * // => false + */ +function cloneDeep(value) { + return _baseClone(value, CLONE_DEEP_FLAG$1 | CLONE_SYMBOLS_FLAG$1); +} + +var cloneDeep_1 = cloneDeep;var mergeClasses_1 = createCommonjsModule(function (module, exports) { + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.mergeClasses = undefined; + + + +var _forOwn3 = _interopRequireDefault(forOwn_1); + + + +var _cloneDeep3 = _interopRequireDefault(cloneDeep_1); + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var mergeClasses = exports.mergeClasses = function mergeClasses(classes) { + var activeNames = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; + + var styles = classes.default && (0, _cloneDeep3.default)(classes.default) || {}; + activeNames.map(function (name) { + var toMerge = classes[name]; + if (toMerge) { + (0, _forOwn3.default)(toMerge, function (value, key) { + if (!styles[key]) { + styles[key] = {}; + } + + styles[key] = _extends({}, styles[key], toMerge[key]); + }); + } + + return name; + }); + return styles; +}; + +exports.default = mergeClasses; +}); + +unwrapExports(mergeClasses_1); +var mergeClasses_2 = mergeClasses_1.mergeClasses;var autoprefix_1 = createCommonjsModule(function (module, exports) { + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.autoprefix = undefined; + + + +var _forOwn3 = _interopRequireDefault(forOwn_1); + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var transforms = { + borderRadius: function borderRadius(value) { + return { + msBorderRadius: value, + MozBorderRadius: value, + OBorderRadius: value, + WebkitBorderRadius: value, + borderRadius: value + }; + }, + boxShadow: function boxShadow(value) { + return { + msBoxShadow: value, + MozBoxShadow: value, + OBoxShadow: value, + WebkitBoxShadow: value, + boxShadow: value + }; + }, + userSelect: function userSelect(value) { + return { + WebkitTouchCallout: value, + KhtmlUserSelect: value, + MozUserSelect: value, + msUserSelect: value, + WebkitUserSelect: value, + userSelect: value + }; + }, + + flex: function flex(value) { + return { + WebkitBoxFlex: value, + MozBoxFlex: value, + WebkitFlex: value, + msFlex: value, + flex: value + }; + }, + flexBasis: function flexBasis(value) { + return { + WebkitFlexBasis: value, + flexBasis: value + }; + }, + justifyContent: function justifyContent(value) { + return { + WebkitJustifyContent: value, + justifyContent: value + }; + }, + + transition: function transition(value) { + return { + msTransition: value, + MozTransition: value, + OTransition: value, + WebkitTransition: value, + transition: value + }; + }, + + transform: function transform(value) { + return { + msTransform: value, + MozTransform: value, + OTransform: value, + WebkitTransform: value, + transform: value + }; + }, + absolute: function absolute(value) { + var direction = value && value.split(' '); + return { + position: 'absolute', + top: direction && direction[0], + right: direction && direction[1], + bottom: direction && direction[2], + left: direction && direction[3] + }; + }, + extend: function extend(name, otherElementStyles) { + var otherStyle = otherElementStyles[name]; + if (otherStyle) { + return otherStyle; + } + return { + 'extend': name + }; + } +}; + +var autoprefix = exports.autoprefix = function autoprefix(elements) { + var prefixed = {}; + (0, _forOwn3.default)(elements, function (styles, element) { + var expanded = {}; + (0, _forOwn3.default)(styles, function (value, key) { + var transform = transforms[key]; + if (transform) { + expanded = _extends({}, expanded, transform(value)); + } else { + expanded[key] = value; + } + }); + prefixed[element] = expanded; + }); + return prefixed; +}; + +exports.default = autoprefix; +}); + +unwrapExports(autoprefix_1); +var autoprefix_2 = autoprefix_1.autoprefix;var hover_1 = createCommonjsModule(function (module, exports) { + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.hover = undefined; + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + + + +var _react2 = _interopRequireDefault(react); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var hover = exports.hover = function hover(Component) { + var Span = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'span'; + + return function (_React$Component) { + _inherits(Hover, _React$Component); + + function Hover() { + var _ref; + + var _temp, _this, _ret; + + _classCallCheck(this, Hover); + + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = Hover.__proto__ || Object.getPrototypeOf(Hover)).call.apply(_ref, [this].concat(args))), _this), _this.state = { hover: false }, _this.handleMouseOver = function () { + return _this.setState({ hover: true }); + }, _this.handleMouseOut = function () { + return _this.setState({ hover: false }); + }, _this.render = function () { + return _react2.default.createElement( + Span, + { onMouseOver: _this.handleMouseOver, onMouseOut: _this.handleMouseOut }, + _react2.default.createElement(Component, _extends({}, _this.props, _this.state)) + ); + }, _temp), _possibleConstructorReturn(_this, _ret); + } + + return Hover; + }(_react2.default.Component); +}; + +exports.default = hover; +}); + +unwrapExports(hover_1); +var hover_2 = hover_1.hover;var active_1 = createCommonjsModule(function (module, exports) { + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.active = undefined; + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + + + +var _react2 = _interopRequireDefault(react); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var active = exports.active = function active(Component) { + var Span = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'span'; + + return function (_React$Component) { + _inherits(Active, _React$Component); + + function Active() { + var _ref; + + var _temp, _this, _ret; + + _classCallCheck(this, Active); + + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = Active.__proto__ || Object.getPrototypeOf(Active)).call.apply(_ref, [this].concat(args))), _this), _this.state = { active: false }, _this.handleMouseDown = function () { + return _this.setState({ active: true }); + }, _this.handleMouseUp = function () { + return _this.setState({ active: false }); + }, _this.render = function () { + return _react2.default.createElement( + Span, + { onMouseDown: _this.handleMouseDown, onMouseUp: _this.handleMouseUp }, + _react2.default.createElement(Component, _extends({}, _this.props, _this.state)) + ); + }, _temp), _possibleConstructorReturn(_this, _ret); + } + + return Active; + }(_react2.default.Component); +}; + +exports.default = active; +}); + +unwrapExports(active_1); +var active_2 = active_1.active;var loop = createCommonjsModule(function (module, exports) { + +Object.defineProperty(exports, "__esModule", { + value: true +}); +var loopable = function loopable(i, length) { + var props = {}; + var setProp = function setProp(name) { + var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + + props[name] = value; + }; + + i === 0 && setProp('first-child'); + i === length - 1 && setProp('last-child'); + (i === 0 || i % 2 === 0) && setProp('even'); + Math.abs(i % 2) === 1 && setProp('odd'); + setProp('nth-child', i); + + return props; +}; + +exports.default = loopable; +}); + +unwrapExports(loop);var lib = createCommonjsModule(function (module, exports) { + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.ReactCSS = exports.loop = exports.handleActive = exports.handleHover = exports.hover = undefined; + + + +var _flattenNames2 = _interopRequireDefault(flattenNames_1); + + + +var _mergeClasses2 = _interopRequireDefault(mergeClasses_1); + + + +var _autoprefix2 = _interopRequireDefault(autoprefix_1); + + + +var _hover3 = _interopRequireDefault(hover_1); + + + +var _active2 = _interopRequireDefault(active_1); + + + +var _loop3 = _interopRequireDefault(loop); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.hover = _hover3.default; +exports.handleHover = _hover3.default; +exports.handleActive = _active2.default; +exports.loop = _loop3.default; +var ReactCSS = exports.ReactCSS = function ReactCSS(classes) { + for (var _len = arguments.length, activations = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + activations[_key - 1] = arguments[_key]; + } + + var activeNames = (0, _flattenNames2.default)(activations); + var merged = (0, _mergeClasses2.default)(classes, activeNames); + return (0, _autoprefix2.default)(merged); +}; + +exports.default = ReactCSS; +}); + +unwrapExports(lib); +var lib_1 = lib.ReactCSS; +var lib_2 = lib.loop; +var lib_3 = lib.handleActive; +var lib_4 = lib.handleHover; +var lib_5 = lib.hover;/** + * This function is like `assignValue` except that it doesn't assign + * `undefined` values. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ +function assignMergeValue(object, key, value) { + if ((value !== undefined && !eq_1(object[key], value)) || + (value === undefined && !(key in object))) { + _baseAssignValue(object, key, value); + } +} + +var _assignMergeValue = assignMergeValue;/** + * This method is like `_.isArrayLike` except that it also checks if `value` + * is an object. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array-like object, + * else `false`. + * @example + * + * _.isArrayLikeObject([1, 2, 3]); + * // => true + * + * _.isArrayLikeObject(document.body.children); + * // => true + * + * _.isArrayLikeObject('abc'); + * // => false + * + * _.isArrayLikeObject(_.noop); + * // => false + */ +function isArrayLikeObject(value) { + return isObjectLike_1(value) && isArrayLike_1(value); +} + +var isArrayLikeObject_1 = isArrayLikeObject;/** + * Gets the value at `key`, unless `key` is "__proto__" or "constructor". + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the property to get. + * @returns {*} Returns the property value. + */ +function safeGet(object, key) { + if (key === 'constructor' && typeof object[key] === 'function') { + return; + } + + if (key == '__proto__') { + return; + } + + return object[key]; +} + +var _safeGet = safeGet;/** + * Converts `value` to a plain object flattening inherited enumerable string + * keyed properties of `value` to own properties of the plain object. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {Object} Returns the converted plain object. + * @example + * + * function Foo() { + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.assign({ 'a': 1 }, new Foo); + * // => { 'a': 1, 'b': 2 } + * + * _.assign({ 'a': 1 }, _.toPlainObject(new Foo)); + * // => { 'a': 1, 'b': 2, 'c': 3 } + */ +function toPlainObject(value) { + return _copyObject(value, keysIn_1(value)); +} + +var toPlainObject_1 = toPlainObject;/** + * A specialized version of `baseMerge` for arrays and objects which performs + * deep merges and tracks traversed objects enabling objects with circular + * references to be merged. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @param {string} key The key of the value to merge. + * @param {number} srcIndex The index of `source`. + * @param {Function} mergeFunc The function to merge values. + * @param {Function} [customizer] The function to customize assigned values. + * @param {Object} [stack] Tracks traversed source values and their merged + * counterparts. + */ +function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) { + var objValue = _safeGet(object, key), + srcValue = _safeGet(source, key), + stacked = stack.get(srcValue); + + if (stacked) { + _assignMergeValue(object, key, stacked); + return; + } + var newValue = customizer + ? customizer(objValue, srcValue, (key + ''), object, source, stack) + : undefined; + + var isCommon = newValue === undefined; + + if (isCommon) { + var isArr = isArray_1(srcValue), + isBuff = !isArr && isBuffer_1(srcValue), + isTyped = !isArr && !isBuff && isTypedArray_1(srcValue); + + newValue = srcValue; + if (isArr || isBuff || isTyped) { + if (isArray_1(objValue)) { + newValue = objValue; + } + else if (isArrayLikeObject_1(objValue)) { + newValue = _copyArray(objValue); + } + else if (isBuff) { + isCommon = false; + newValue = _cloneBuffer(srcValue, true); + } + else if (isTyped) { + isCommon = false; + newValue = _cloneTypedArray(srcValue, true); + } + else { + newValue = []; + } + } + else if (isPlainObject_1(srcValue) || isArguments_1(srcValue)) { + newValue = objValue; + if (isArguments_1(objValue)) { + newValue = toPlainObject_1(objValue); + } + else if (!isObject_1(objValue) || isFunction_1(objValue)) { + newValue = _initCloneObject(srcValue); + } + } + else { + isCommon = false; + } + } + if (isCommon) { + // Recursively merge objects and arrays (susceptible to call stack limits). + stack.set(srcValue, newValue); + mergeFunc(newValue, srcValue, srcIndex, customizer, stack); + stack['delete'](srcValue); + } + _assignMergeValue(object, key, newValue); +} + +var _baseMergeDeep = baseMergeDeep;/** + * The base implementation of `_.merge` without support for multiple sources. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @param {number} srcIndex The index of `source`. + * @param {Function} [customizer] The function to customize merged values. + * @param {Object} [stack] Tracks traversed source values and their merged + * counterparts. + */ +function baseMerge(object, source, srcIndex, customizer, stack) { + if (object === source) { + return; + } + _baseFor(source, function(srcValue, key) { + stack || (stack = new _Stack); + if (isObject_1(srcValue)) { + _baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack); + } + else { + var newValue = customizer + ? customizer(_safeGet(object, key), srcValue, (key + ''), object, source, stack) + : undefined; + + if (newValue === undefined) { + newValue = srcValue; + } + _assignMergeValue(object, key, newValue); + } + }, keysIn_1); +} + +var _baseMerge = baseMerge;/** + * A faster alternative to `Function#apply`, this function invokes `func` + * with the `this` binding of `thisArg` and the arguments of `args`. + * + * @private + * @param {Function} func The function to invoke. + * @param {*} thisArg The `this` binding of `func`. + * @param {Array} args The arguments to invoke `func` with. + * @returns {*} Returns the result of `func`. + */ +function apply(func, thisArg, args) { + switch (args.length) { + case 0: return func.call(thisArg); + case 1: return func.call(thisArg, args[0]); + case 2: return func.call(thisArg, args[0], args[1]); + case 3: return func.call(thisArg, args[0], args[1], args[2]); + } + return func.apply(thisArg, args); +} + +var _apply = apply;/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeMax = Math.max; + +/** + * A specialized version of `baseRest` which transforms the rest array. + * + * @private + * @param {Function} func The function to apply a rest parameter to. + * @param {number} [start=func.length-1] The start position of the rest parameter. + * @param {Function} transform The rest array transform. + * @returns {Function} Returns the new function. + */ +function overRest(func, start, transform) { + start = nativeMax(start === undefined ? (func.length - 1) : start, 0); + return function() { + var args = arguments, + index = -1, + length = nativeMax(args.length - start, 0), + array = Array(length); + + while (++index < length) { + array[index] = args[start + index]; + } + index = -1; + var otherArgs = Array(start + 1); + while (++index < start) { + otherArgs[index] = args[index]; + } + otherArgs[start] = transform(array); + return _apply(func, this, otherArgs); + }; +} + +var _overRest = overRest;/** + * Creates a function that returns `value`. + * + * @static + * @memberOf _ + * @since 2.4.0 + * @category Util + * @param {*} value The value to return from the new function. + * @returns {Function} Returns the new constant function. + * @example + * + * var objects = _.times(2, _.constant({ 'a': 1 })); + * + * console.log(objects); + * // => [{ 'a': 1 }, { 'a': 1 }] + * + * console.log(objects[0] === objects[1]); + * // => true + */ +function constant(value) { + return function() { + return value; + }; +} + +var constant_1 = constant;/** + * The base implementation of `setToString` without support for hot loop shorting. + * + * @private + * @param {Function} func The function to modify. + * @param {Function} string The `toString` result. + * @returns {Function} Returns `func`. + */ +var baseSetToString = !_defineProperty ? identity_1 : function(func, string) { + return _defineProperty(func, 'toString', { + 'configurable': true, + 'enumerable': false, + 'value': constant_1(string), + 'writable': true + }); +}; + +var _baseSetToString = baseSetToString;/** Used to detect hot functions by number of calls within a span of milliseconds. */ +var HOT_COUNT = 800, + HOT_SPAN = 16; + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeNow = Date.now; + +/** + * Creates a function that'll short out and invoke `identity` instead + * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN` + * milliseconds. + * + * @private + * @param {Function} func The function to restrict. + * @returns {Function} Returns the new shortable function. + */ +function shortOut(func) { + var count = 0, + lastCalled = 0; + + return function() { + var stamp = nativeNow(), + remaining = HOT_SPAN - (stamp - lastCalled); + + lastCalled = stamp; + if (remaining > 0) { + if (++count >= HOT_COUNT) { + return arguments[0]; + } + } else { + count = 0; + } + return func.apply(undefined, arguments); + }; +} + +var _shortOut = shortOut;/** + * Sets the `toString` method of `func` to return `string`. + * + * @private + * @param {Function} func The function to modify. + * @param {Function} string The `toString` result. + * @returns {Function} Returns `func`. + */ +var setToString = _shortOut(_baseSetToString); + +var _setToString = setToString;/** + * The base implementation of `_.rest` which doesn't validate or coerce arguments. + * + * @private + * @param {Function} func The function to apply a rest parameter to. + * @param {number} [start=func.length-1] The start position of the rest parameter. + * @returns {Function} Returns the new function. + */ +function baseRest(func, start) { + return _setToString(_overRest(func, start, identity_1), func + ''); +} + +var _baseRest = baseRest;/** + * Checks if the given arguments are from an iteratee call. + * + * @private + * @param {*} value The potential iteratee value argument. + * @param {*} index The potential iteratee index or key argument. + * @param {*} object The potential iteratee object argument. + * @returns {boolean} Returns `true` if the arguments are from an iteratee call, + * else `false`. + */ +function isIterateeCall(value, index, object) { + if (!isObject_1(object)) { + return false; + } + var type = typeof index; + if (type == 'number' + ? (isArrayLike_1(object) && _isIndex(index, object.length)) + : (type == 'string' && index in object) + ) { + return eq_1(object[index], value); + } + return false; +} + +var _isIterateeCall = isIterateeCall;/** + * Creates a function like `_.assign`. + * + * @private + * @param {Function} assigner The function to assign values. + * @returns {Function} Returns the new assigner function. + */ +function createAssigner(assigner) { + return _baseRest(function(object, sources) { + var index = -1, + length = sources.length, + customizer = length > 1 ? sources[length - 1] : undefined, + guard = length > 2 ? sources[2] : undefined; + + customizer = (assigner.length > 3 && typeof customizer == 'function') + ? (length--, customizer) + : undefined; + + if (guard && _isIterateeCall(sources[0], sources[1], guard)) { + customizer = length < 3 ? undefined : customizer; + length = 1; + } + object = Object(object); + while (++index < length) { + var source = sources[index]; + if (source) { + assigner(object, source, index, customizer); + } + } + return object; + }); +} + +var _createAssigner = createAssigner;/** + * This method is like `_.assign` except that it recursively merges own and + * inherited enumerable string keyed properties of source objects into the + * destination object. Source properties that resolve to `undefined` are + * skipped if a destination value exists. Array and plain object properties + * are merged recursively. Other objects and value types are overridden by + * assignment. Source objects are applied from left to right. Subsequent + * sources overwrite property assignments of previous sources. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 0.5.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @example + * + * var object = { + * 'a': [{ 'b': 2 }, { 'd': 4 }] + * }; + * + * var other = { + * 'a': [{ 'c': 3 }, { 'e': 5 }] + * }; + * + * _.merge(object, other); + * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] } + */ +var merge = _createAssigner(function(object, source, srcIndex) { + _baseMerge(object, source, srcIndex); +}); + +var merge_1 = merge;var alpha = createCommonjsModule(function (module, exports) { + +Object.defineProperty(exports, "__esModule", { + value: true +}); +var calculateChange = exports.calculateChange = function calculateChange(e, hsl, direction, initialA, container) { + var containerWidth = container.clientWidth; + var containerHeight = container.clientHeight; + var x = typeof e.pageX === 'number' ? e.pageX : e.touches[0].pageX; + var y = typeof e.pageY === 'number' ? e.pageY : e.touches[0].pageY; + var left = x - (container.getBoundingClientRect().left + window.pageXOffset); + var top = y - (container.getBoundingClientRect().top + window.pageYOffset); + + if (direction === 'vertical') { + var a = void 0; + if (top < 0) { + a = 0; + } else if (top > containerHeight) { + a = 1; + } else { + a = Math.round(top * 100 / containerHeight) / 100; + } + + if (hsl.a !== a) { + return { + h: hsl.h, + s: hsl.s, + l: hsl.l, + a: a, + source: 'rgb' + }; + } + } else { + var _a = void 0; + if (left < 0) { + _a = 0; + } else if (left > containerWidth) { + _a = 1; + } else { + _a = Math.round(left * 100 / containerWidth) / 100; + } + + if (initialA !== _a) { + return { + h: hsl.h, + s: hsl.s, + l: hsl.l, + a: _a, + source: 'rgb' + }; + } + } + return null; +}; +}); + +unwrapExports(alpha); +var alpha_1 = alpha.calculateChange;var checkboard = createCommonjsModule(function (module, exports) { + +Object.defineProperty(exports, "__esModule", { + value: true +}); +var checkboardCache = {}; + +var render = exports.render = function render(c1, c2, size, serverCanvas) { + if (typeof document === 'undefined' && !serverCanvas) { + return null; + } + var canvas = serverCanvas ? new serverCanvas() : document.createElement('canvas'); + canvas.width = size * 2; + canvas.height = size * 2; + var ctx = canvas.getContext('2d'); + if (!ctx) { + return null; + } // If no context can be found, return early. + ctx.fillStyle = c1; + ctx.fillRect(0, 0, canvas.width, canvas.height); + ctx.fillStyle = c2; + ctx.fillRect(0, 0, size, size); + ctx.translate(size, size); + ctx.fillRect(0, 0, size, size); + return canvas.toDataURL(); +}; + +var get = exports.get = function get(c1, c2, size, serverCanvas) { + var key = c1 + '-' + c2 + '-' + size + (serverCanvas ? '-server' : ''); + + if (checkboardCache[key]) { + return checkboardCache[key]; + } + + var checkboard = render(c1, c2, size, serverCanvas); + checkboardCache[key] = checkboard; + return checkboard; +}; +}); + +unwrapExports(checkboard); +var checkboard_1 = checkboard.render; +var checkboard_2 = checkboard.get;var Checkboard_1 = createCommonjsModule(function (module, exports) { + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.Checkboard = undefined; + + + +var _react2 = _interopRequireDefault(react); + + + +var _reactcss2 = _interopRequireDefault(lib); + + + +var checkboard$1 = _interopRequireWildcard(checkboard); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var Checkboard = exports.Checkboard = function Checkboard(_ref) { + var white = _ref.white, + grey = _ref.grey, + size = _ref.size, + renderers = _ref.renderers, + borderRadius = _ref.borderRadius, + boxShadow = _ref.boxShadow; + + var styles = (0, _reactcss2.default)({ + 'default': { + grid: { + borderRadius: borderRadius, + boxShadow: boxShadow, + absolute: '0px 0px 0px 0px', + background: 'url(' + checkboard$1.get(white, grey, size, renderers.canvas) + ') center left' + } + } + }); + + return _react2.default.createElement('div', { style: styles.grid }); +}; + +Checkboard.defaultProps = { + size: 8, + white: 'transparent', + grey: 'rgba(0,0,0,.08)', + renderers: {} +}; + +exports.default = Checkboard; +}); + +unwrapExports(Checkboard_1); +var Checkboard_2 = Checkboard_1.Checkboard;var Alpha_1 = createCommonjsModule(function (module, exports) { + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.Alpha = undefined; + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + + + +var _react2 = _interopRequireDefault(react); + + + +var _reactcss2 = _interopRequireDefault(lib); + + + +var alpha$1 = _interopRequireWildcard(alpha); + + + +var _Checkboard2 = _interopRequireDefault(Checkboard_1); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var Alpha = exports.Alpha = function (_ref) { + _inherits(Alpha, _ref); + + function Alpha() { + var _ref2; + + var _temp, _this, _ret; + + _classCallCheck(this, Alpha); + + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref2 = Alpha.__proto__ || Object.getPrototypeOf(Alpha)).call.apply(_ref2, [this].concat(args))), _this), _this.handleChange = function (e) { + var change = alpha$1.calculateChange(e, _this.props.hsl, _this.props.direction, _this.props.a, _this.container); + change && typeof _this.props.onChange === 'function' && _this.props.onChange(change, e); + }, _this.handleMouseDown = function (e) { + _this.handleChange(e); + window.addEventListener('mousemove', _this.handleChange); + window.addEventListener('mouseup', _this.handleMouseUp); + }, _this.handleMouseUp = function () { + _this.unbindEventListeners(); + }, _this.unbindEventListeners = function () { + window.removeEventListener('mousemove', _this.handleChange); + window.removeEventListener('mouseup', _this.handleMouseUp); + }, _temp), _possibleConstructorReturn(_this, _ret); + } + + _createClass(Alpha, [{ + key: 'componentWillUnmount', + value: function componentWillUnmount() { + this.unbindEventListeners(); + } + }, { + key: 'render', + value: function render() { + var _this2 = this; + + var rgb = this.props.rgb; + var styles = (0, _reactcss2.default)({ + 'default': { + alpha: { + absolute: '0px 0px 0px 0px', + borderRadius: this.props.radius + }, + checkboard: { + absolute: '0px 0px 0px 0px', + overflow: 'hidden', + borderRadius: this.props.radius + }, + gradient: { + absolute: '0px 0px 0px 0px', + background: 'linear-gradient(to right, rgba(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ', 0) 0%,\n rgba(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ', 1) 100%)', + boxShadow: this.props.shadow, + borderRadius: this.props.radius + }, + container: { + position: 'relative', + height: '100%', + margin: '0 3px' + }, + pointer: { + position: 'absolute', + left: rgb.a * 100 + '%' + }, + slider: { + width: '4px', + borderRadius: '1px', + height: '8px', + boxShadow: '0 0 2px rgba(0, 0, 0, .6)', + background: '#fff', + marginTop: '1px', + transform: 'translateX(-2px)' + } + }, + 'vertical': { + gradient: { + background: 'linear-gradient(to bottom, rgba(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ', 0) 0%,\n rgba(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ', 1) 100%)' + }, + pointer: { + left: 0, + top: rgb.a * 100 + '%' + } + }, + 'overwrite': _extends({}, this.props.style) + }, { + vertical: this.props.direction === 'vertical', + overwrite: true + }); + + return _react2.default.createElement( + 'div', + { style: styles.alpha }, + _react2.default.createElement( + 'div', + { style: styles.checkboard }, + _react2.default.createElement(_Checkboard2.default, { renderers: this.props.renderers }) + ), + _react2.default.createElement('div', { style: styles.gradient }), + _react2.default.createElement( + 'div', + { + style: styles.container, + ref: function ref(container) { + return _this2.container = container; + }, + onMouseDown: this.handleMouseDown, + onTouchMove: this.handleChange, + onTouchStart: this.handleChange + }, + _react2.default.createElement( + 'div', + { style: styles.pointer }, + this.props.pointer ? _react2.default.createElement(this.props.pointer, this.props) : _react2.default.createElement('div', { style: styles.slider }) + ) + ) + ); + } + }]); + + return Alpha; +}(react.PureComponent || react.Component); + +exports.default = Alpha; +}); + +unwrapExports(Alpha_1); +var Alpha_2 = Alpha_1.Alpha;var EditableInput_1 = createCommonjsModule(function (module, exports) { + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.EditableInput = undefined; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + + + +var _react2 = _interopRequireDefault(react); + + + +var _reactcss2 = _interopRequireDefault(lib); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var DEFAULT_ARROW_OFFSET = 1; + +var UP_KEY_CODE = 38; +var DOWN_KEY_CODE = 40; +var VALID_KEY_CODES = [UP_KEY_CODE, DOWN_KEY_CODE]; +var isValidKeyCode = function isValidKeyCode(keyCode) { + return VALID_KEY_CODES.indexOf(keyCode) > -1; +}; + +var getFormattedPercentage = function getFormattedPercentage(number) { + return number + '%'; +}; +var getNumberValue = function getNumberValue(value) { + return Number(String(value).replace(/%/g, '')); +}; +var getIsPercentage = function getIsPercentage(value) { + return String(value).indexOf('%') > -1; +}; + +var EditableInput = exports.EditableInput = function (_ref) { + _inherits(EditableInput, _ref); + + function EditableInput(props) { + _classCallCheck(this, EditableInput); + + var _this = _possibleConstructorReturn(this, (EditableInput.__proto__ || Object.getPrototypeOf(EditableInput)).call(this)); + + _this.handleBlur = function () { + if (_this.state.blurValue) { + _this.setState({ value: _this.state.blurValue, blurValue: null }); + } + }; + + _this.handleChange = function (e) { + _this.setUpdatedValue(e.target.value, e); + }; + + _this.handleKeyDown = function (e) { + // In case `e.target.value` is a percentage remove the `%` character + // and update accordingly with a percentage + // https://github.com/casesandberg/react-color/issues/383 + var value = getNumberValue(e.target.value); + if (!isNaN(value) && isValidKeyCode(e.keyCode)) { + var offset = _this.getArrowOffset(); + var updatedValue = e.keyCode === UP_KEY_CODE ? value + offset : value - offset; + + _this.setUpdatedValue(updatedValue, e); + } + }; + + _this.handleDrag = function (e) { + if (_this.props.dragLabel) { + var newValue = Math.round(_this.props.value + e.movementX); + if (newValue >= 0 && newValue <= _this.props.dragMax) { + _this.props.onChange && _this.props.onChange(_this.getValueObjectWithLabel(newValue), e); + } + } + }; + + _this.handleMouseDown = function (e) { + if (_this.props.dragLabel) { + e.preventDefault(); + _this.handleDrag(e); + window.addEventListener('mousemove', _this.handleDrag); + window.addEventListener('mouseup', _this.handleMouseUp); + } + }; + + _this.handleMouseUp = function () { + _this.unbindEventListeners(); + }; + + _this.unbindEventListeners = function () { + window.removeEventListener('mousemove', _this.handleDrag); + window.removeEventListener('mouseup', _this.handleMouseUp); + }; + + _this.state = { + value: String(props.value).toUpperCase(), + blurValue: String(props.value).toUpperCase() + }; + return _this; + } + + _createClass(EditableInput, [{ + key: 'componentWillReceiveProps', + value: function componentWillReceiveProps(nextProps) { + var input = this.input; + if (nextProps.value !== this.state.value) { + if (input === document.activeElement) { + this.setState({ blurValue: String(nextProps.value).toUpperCase() }); + } else { + this.setState({ value: String(nextProps.value).toUpperCase(), blurValue: !this.state.blurValue && String(nextProps.value).toUpperCase() }); + } + } + } + }, { + key: 'componentWillUnmount', + value: function componentWillUnmount() { + this.unbindEventListeners(); + } + }, { + key: 'getValueObjectWithLabel', + value: function getValueObjectWithLabel(value) { + return _defineProperty({}, this.props.label, value); + } + }, { + key: 'getArrowOffset', + value: function getArrowOffset() { + return this.props.arrowOffset || DEFAULT_ARROW_OFFSET; + } + }, { + key: 'setUpdatedValue', + value: function setUpdatedValue(value, e) { + var onChangeValue = this.props.label !== null ? this.getValueObjectWithLabel(value) : value; + this.props.onChange && this.props.onChange(onChangeValue, e); + + var isPercentage = getIsPercentage(e.target.value); + this.setState({ + value: isPercentage ? getFormattedPercentage(value) : value + }); + } + }, { + key: 'render', + value: function render() { + var _this2 = this; + + var styles = (0, _reactcss2.default)({ + 'default': { + wrap: { + position: 'relative' + } + }, + 'user-override': { + wrap: this.props.style && this.props.style.wrap ? this.props.style.wrap : {}, + input: this.props.style && this.props.style.input ? this.props.style.input : {}, + label: this.props.style && this.props.style.label ? this.props.style.label : {} + }, + 'dragLabel-true': { + label: { + cursor: 'ew-resize' + } + } + }, { + 'user-override': true + }, this.props); + + return _react2.default.createElement( + 'div', + { style: styles.wrap }, + _react2.default.createElement('input', { + style: styles.input, + ref: function ref(input) { + return _this2.input = input; + }, + value: this.state.value, + onKeyDown: this.handleKeyDown, + onChange: this.handleChange, + onBlur: this.handleBlur, + placeholder: this.props.placeholder, + spellCheck: 'false' + }), + this.props.label && !this.props.hideLabel ? _react2.default.createElement( + 'span', + { style: styles.label, onMouseDown: this.handleMouseDown }, + this.props.label + ) : null + ); + } + }]); + + return EditableInput; +}(react.PureComponent || react.Component); + +exports.default = EditableInput; +}); + +unwrapExports(EditableInput_1); +var EditableInput_2 = EditableInput_1.EditableInput;var hue = createCommonjsModule(function (module, exports) { + +Object.defineProperty(exports, "__esModule", { + value: true +}); +var calculateChange = exports.calculateChange = function calculateChange(e, direction, hsl, container) { + var containerWidth = container.clientWidth; + var containerHeight = container.clientHeight; + var x = typeof e.pageX === 'number' ? e.pageX : e.touches[0].pageX; + var y = typeof e.pageY === 'number' ? e.pageY : e.touches[0].pageY; + var left = x - (container.getBoundingClientRect().left + window.pageXOffset); + var top = y - (container.getBoundingClientRect().top + window.pageYOffset); + + if (direction === 'vertical') { + var h = void 0; + if (top < 0) { + h = 359; + } else if (top > containerHeight) { + h = 0; + } else { + var percent = -(top * 100 / containerHeight) + 100; + h = 360 * percent / 100; + } + + if (hsl.h !== h) { + return { + h: h, + s: hsl.s, + l: hsl.l, + a: hsl.a, + source: 'rgb' + }; + } + } else { + var _h = void 0; + if (left < 0) { + _h = 0; + } else if (left > containerWidth) { + _h = 359; + } else { + var _percent = left * 100 / containerWidth; + _h = 360 * _percent / 100; + } + + if (hsl.h !== _h) { + return { + h: _h, + s: hsl.s, + l: hsl.l, + a: hsl.a, + source: 'rgb' + }; + } + } + return null; +}; +}); + +unwrapExports(hue); +var hue_1 = hue.calculateChange;var Hue_1 = createCommonjsModule(function (module, exports) { + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.Hue = undefined; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + + + +var _react2 = _interopRequireDefault(react); + + + +var _reactcss2 = _interopRequireDefault(lib); + + + +var hue$1 = _interopRequireWildcard(hue); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var Hue = exports.Hue = function (_ref) { + _inherits(Hue, _ref); + + function Hue() { + var _ref2; + + var _temp, _this, _ret; + + _classCallCheck(this, Hue); + + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref2 = Hue.__proto__ || Object.getPrototypeOf(Hue)).call.apply(_ref2, [this].concat(args))), _this), _this.handleChange = function (e) { + var change = hue$1.calculateChange(e, _this.props.direction, _this.props.hsl, _this.container); + change && typeof _this.props.onChange === 'function' && _this.props.onChange(change, e); + }, _this.handleMouseDown = function (e) { + _this.handleChange(e); + window.addEventListener('mousemove', _this.handleChange); + window.addEventListener('mouseup', _this.handleMouseUp); + }, _this.handleMouseUp = function () { + _this.unbindEventListeners(); + }, _temp), _possibleConstructorReturn(_this, _ret); + } + + _createClass(Hue, [{ + key: 'componentWillUnmount', + value: function componentWillUnmount() { + this.unbindEventListeners(); + } + }, { + key: 'unbindEventListeners', + value: function unbindEventListeners() { + window.removeEventListener('mousemove', this.handleChange); + window.removeEventListener('mouseup', this.handleMouseUp); + } + }, { + key: 'render', + value: function render() { + var _this2 = this; + + var _props$direction = this.props.direction, + direction = _props$direction === undefined ? 'horizontal' : _props$direction; + + + var styles = (0, _reactcss2.default)({ + 'default': { + hue: { + absolute: '0px 0px 0px 0px', + borderRadius: this.props.radius, + boxShadow: this.props.shadow + }, + container: { + padding: '0 2px', + position: 'relative', + height: '100%', + borderRadius: this.props.radius + }, + pointer: { + position: 'absolute', + left: this.props.hsl.h * 100 / 360 + '%' + }, + slider: { + marginTop: '1px', + width: '4px', + borderRadius: '1px', + height: '8px', + boxShadow: '0 0 2px rgba(0, 0, 0, .6)', + background: '#fff', + transform: 'translateX(-2px)' + } + }, + 'vertical': { + pointer: { + left: '0px', + top: -(this.props.hsl.h * 100 / 360) + 100 + '%' + } + } + }, { vertical: direction === 'vertical' }); + + return _react2.default.createElement( + 'div', + { style: styles.hue }, + _react2.default.createElement( + 'div', + { + className: 'hue-' + direction, + style: styles.container, + ref: function ref(container) { + return _this2.container = container; + }, + onMouseDown: this.handleMouseDown, + onTouchMove: this.handleChange, + onTouchStart: this.handleChange + }, + _react2.default.createElement( + 'style', + null, + '\n .hue-horizontal {\n background: linear-gradient(to right, #f00 0%, #ff0 17%, #0f0\n 33%, #0ff 50%, #00f 67%, #f0f 83%, #f00 100%);\n background: -webkit-linear-gradient(to right, #f00 0%, #ff0\n 17%, #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, #f00 100%);\n }\n\n .hue-vertical {\n background: linear-gradient(to top, #f00 0%, #ff0 17%, #0f0 33%,\n #0ff 50%, #00f 67%, #f0f 83%, #f00 100%);\n background: -webkit-linear-gradient(to top, #f00 0%, #ff0 17%,\n #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, #f00 100%);\n }\n ' + ), + _react2.default.createElement( + 'div', + { style: styles.pointer }, + this.props.pointer ? _react2.default.createElement(this.props.pointer, this.props) : _react2.default.createElement('div', { style: styles.slider }) + ) + ) + ); + } + }]); + + return Hue; +}(react.PureComponent || react.Component); + +exports.default = Hue; +}); + +unwrapExports(Hue_1); +var Hue_2 = Hue_1.Hue;var Raised_1 = createCommonjsModule(function (module, exports) { + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.Raised = undefined; + + + +var _react2 = _interopRequireDefault(react); + + + +var _propTypes2 = _interopRequireDefault(propTypes); + + + +var _reactcss2 = _interopRequireDefault(lib); + + + +var _merge2 = _interopRequireDefault(merge_1); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var Raised = exports.Raised = function Raised(_ref) { + var zDepth = _ref.zDepth, + radius = _ref.radius, + background = _ref.background, + children = _ref.children, + _ref$styles = _ref.styles, + passedStyles = _ref$styles === undefined ? {} : _ref$styles; + + var styles = (0, _reactcss2.default)((0, _merge2.default)({ + 'default': { + wrap: { + position: 'relative', + display: 'inline-block' + }, + content: { + position: 'relative' + }, + bg: { + absolute: '0px 0px 0px 0px', + boxShadow: '0 ' + zDepth + 'px ' + zDepth * 4 + 'px rgba(0,0,0,.24)', + borderRadius: radius, + background: background + } + }, + 'zDepth-0': { + bg: { + boxShadow: 'none' + } + }, + + 'zDepth-1': { + bg: { + boxShadow: '0 2px 10px rgba(0,0,0,.12), 0 2px 5px rgba(0,0,0,.16)' + } + }, + 'zDepth-2': { + bg: { + boxShadow: '0 6px 20px rgba(0,0,0,.19), 0 8px 17px rgba(0,0,0,.2)' + } + }, + 'zDepth-3': { + bg: { + boxShadow: '0 17px 50px rgba(0,0,0,.19), 0 12px 15px rgba(0,0,0,.24)' + } + }, + 'zDepth-4': { + bg: { + boxShadow: '0 25px 55px rgba(0,0,0,.21), 0 16px 28px rgba(0,0,0,.22)' + } + }, + 'zDepth-5': { + bg: { + boxShadow: '0 40px 77px rgba(0,0,0,.22), 0 27px 24px rgba(0,0,0,.2)' + } + }, + 'square': { + bg: { + borderRadius: '0' + } + }, + 'circle': { + bg: { + borderRadius: '50%' + } + } + }, passedStyles), { 'zDepth-1': zDepth === 1 }); + + return _react2.default.createElement( + 'div', + { style: styles.wrap }, + _react2.default.createElement('div', { style: styles.bg }), + _react2.default.createElement( + 'div', + { style: styles.content }, + children + ) + ); +}; + +Raised.propTypes = { + background: _propTypes2.default.string, + zDepth: _propTypes2.default.oneOf([0, 1, 2, 3, 4, 5]), + radius: _propTypes2.default.number, + styles: _propTypes2.default.object +}; + +Raised.defaultProps = { + background: '#fff', + zDepth: 1, + radius: 2, + styles: {} +}; + +exports.default = Raised; +}); + +unwrapExports(Raised_1); +var Raised_2 = Raised_1.Raised;/** + * Gets the timestamp of the number of milliseconds that have elapsed since + * the Unix epoch (1 January 1970 00:00:00 UTC). + * + * @static + * @memberOf _ + * @since 2.4.0 + * @category Date + * @returns {number} Returns the timestamp. + * @example + * + * _.defer(function(stamp) { + * console.log(_.now() - stamp); + * }, _.now()); + * // => Logs the number of milliseconds it took for the deferred invocation. + */ +var now = function() { + return _root.Date.now(); +}; + +var now_1 = now;/** Used as references for various `Number` constants. */ +var NAN = 0 / 0; + +/** Used to match leading and trailing whitespace. */ +var reTrim = /^\s+|\s+$/g; + +/** Used to detect bad signed hexadecimal string values. */ +var reIsBadHex = /^[-+]0x[0-9a-f]+$/i; + +/** Used to detect binary string values. */ +var reIsBinary = /^0b[01]+$/i; + +/** Used to detect octal string values. */ +var reIsOctal = /^0o[0-7]+$/i; + +/** Built-in method references without a dependency on `root`. */ +var freeParseInt = parseInt; + +/** + * Converts `value` to a number. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to process. + * @returns {number} Returns the number. + * @example + * + * _.toNumber(3.2); + * // => 3.2 + * + * _.toNumber(Number.MIN_VALUE); + * // => 5e-324 + * + * _.toNumber(Infinity); + * // => Infinity + * + * _.toNumber('3.2'); + * // => 3.2 + */ +function toNumber(value) { + if (typeof value == 'number') { + return value; + } + if (isSymbol_1(value)) { + return NAN; + } + if (isObject_1(value)) { + var other = typeof value.valueOf == 'function' ? value.valueOf() : value; + value = isObject_1(other) ? (other + '') : other; + } + if (typeof value != 'string') { + return value === 0 ? value : +value; + } + value = value.replace(reTrim, ''); + var isBinary = reIsBinary.test(value); + return (isBinary || reIsOctal.test(value)) + ? freeParseInt(value.slice(2), isBinary ? 2 : 8) + : (reIsBadHex.test(value) ? NAN : +value); +} + +var toNumber_1 = toNumber;/** Error message constants. */ +var FUNC_ERROR_TEXT$1 = 'Expected a function'; + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeMax$1 = Math.max, + nativeMin = Math.min; + +/** + * Creates a debounced function that delays invoking `func` until after `wait` + * milliseconds have elapsed since the last time the debounced function was + * invoked. The debounced function comes with a `cancel` method to cancel + * delayed `func` invocations and a `flush` method to immediately invoke them. + * Provide `options` to indicate whether `func` should be invoked on the + * leading and/or trailing edge of the `wait` timeout. The `func` is invoked + * with the last arguments provided to the debounced function. Subsequent + * calls to the debounced function return the result of the last `func` + * invocation. + * + * **Note:** If `leading` and `trailing` options are `true`, `func` is + * invoked on the trailing edge of the timeout only if the debounced function + * is invoked more than once during the `wait` timeout. + * + * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred + * until to the next tick, similar to `setTimeout` with a timeout of `0`. + * + * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) + * for details over the differences between `_.debounce` and `_.throttle`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to debounce. + * @param {number} [wait=0] The number of milliseconds to delay. + * @param {Object} [options={}] The options object. + * @param {boolean} [options.leading=false] + * Specify invoking on the leading edge of the timeout. + * @param {number} [options.maxWait] + * The maximum time `func` is allowed to be delayed before it's invoked. + * @param {boolean} [options.trailing=true] + * Specify invoking on the trailing edge of the timeout. + * @returns {Function} Returns the new debounced function. + * @example + * + * // Avoid costly calculations while the window size is in flux. + * jQuery(window).on('resize', _.debounce(calculateLayout, 150)); + * + * // Invoke `sendMail` when clicked, debouncing subsequent calls. + * jQuery(element).on('click', _.debounce(sendMail, 300, { + * 'leading': true, + * 'trailing': false + * })); + * + * // Ensure `batchLog` is invoked once after 1 second of debounced calls. + * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 }); + * var source = new EventSource('/stream'); + * jQuery(source).on('message', debounced); + * + * // Cancel the trailing debounced invocation. + * jQuery(window).on('popstate', debounced.cancel); + */ +function debounce(func, wait, options) { + var lastArgs, + lastThis, + maxWait, + result, + timerId, + lastCallTime, + lastInvokeTime = 0, + leading = false, + maxing = false, + trailing = true; + + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT$1); + } + wait = toNumber_1(wait) || 0; + if (isObject_1(options)) { + leading = !!options.leading; + maxing = 'maxWait' in options; + maxWait = maxing ? nativeMax$1(toNumber_1(options.maxWait) || 0, wait) : maxWait; + trailing = 'trailing' in options ? !!options.trailing : trailing; + } + + function invokeFunc(time) { + var args = lastArgs, + thisArg = lastThis; + + lastArgs = lastThis = undefined; + lastInvokeTime = time; + result = func.apply(thisArg, args); + return result; + } + + function leadingEdge(time) { + // Reset any `maxWait` timer. + lastInvokeTime = time; + // Start the timer for the trailing edge. + timerId = setTimeout(timerExpired, wait); + // Invoke the leading edge. + return leading ? invokeFunc(time) : result; + } + + function remainingWait(time) { + var timeSinceLastCall = time - lastCallTime, + timeSinceLastInvoke = time - lastInvokeTime, + timeWaiting = wait - timeSinceLastCall; + + return maxing + ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) + : timeWaiting; + } + + function shouldInvoke(time) { + var timeSinceLastCall = time - lastCallTime, + timeSinceLastInvoke = time - lastInvokeTime; + + // Either this is the first call, activity has stopped and we're at the + // trailing edge, the system time has gone backwards and we're treating + // it as the trailing edge, or we've hit the `maxWait` limit. + return (lastCallTime === undefined || (timeSinceLastCall >= wait) || + (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait)); + } + + function timerExpired() { + var time = now_1(); + if (shouldInvoke(time)) { + return trailingEdge(time); + } + // Restart the timer. + timerId = setTimeout(timerExpired, remainingWait(time)); + } + + function trailingEdge(time) { + timerId = undefined; + + // Only invoke if we have `lastArgs` which means `func` has been + // debounced at least once. + if (trailing && lastArgs) { + return invokeFunc(time); + } + lastArgs = lastThis = undefined; + return result; + } + + function cancel() { + if (timerId !== undefined) { + clearTimeout(timerId); + } + lastInvokeTime = 0; + lastArgs = lastCallTime = lastThis = timerId = undefined; + } + + function flush() { + return timerId === undefined ? result : trailingEdge(now_1()); + } + + function debounced() { + var time = now_1(), + isInvoking = shouldInvoke(time); + + lastArgs = arguments; + lastThis = this; + lastCallTime = time; + + if (isInvoking) { + if (timerId === undefined) { + return leadingEdge(lastCallTime); + } + if (maxing) { + // Handle invocations in a tight loop. + clearTimeout(timerId); + timerId = setTimeout(timerExpired, wait); + return invokeFunc(lastCallTime); + } + } + if (timerId === undefined) { + timerId = setTimeout(timerExpired, wait); + } + return result; + } + debounced.cancel = cancel; + debounced.flush = flush; + return debounced; +} + +var debounce_1 = debounce;/** Error message constants. */ +var FUNC_ERROR_TEXT$2 = 'Expected a function'; + +/** + * Creates a throttled function that only invokes `func` at most once per + * every `wait` milliseconds. The throttled function comes with a `cancel` + * method to cancel delayed `func` invocations and a `flush` method to + * immediately invoke them. Provide `options` to indicate whether `func` + * should be invoked on the leading and/or trailing edge of the `wait` + * timeout. The `func` is invoked with the last arguments provided to the + * throttled function. Subsequent calls to the throttled function return the + * result of the last `func` invocation. + * + * **Note:** If `leading` and `trailing` options are `true`, `func` is + * invoked on the trailing edge of the timeout only if the throttled function + * is invoked more than once during the `wait` timeout. + * + * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred + * until to the next tick, similar to `setTimeout` with a timeout of `0`. + * + * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) + * for details over the differences between `_.throttle` and `_.debounce`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to throttle. + * @param {number} [wait=0] The number of milliseconds to throttle invocations to. + * @param {Object} [options={}] The options object. + * @param {boolean} [options.leading=true] + * Specify invoking on the leading edge of the timeout. + * @param {boolean} [options.trailing=true] + * Specify invoking on the trailing edge of the timeout. + * @returns {Function} Returns the new throttled function. + * @example + * + * // Avoid excessively updating the position while scrolling. + * jQuery(window).on('scroll', _.throttle(updatePosition, 100)); + * + * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes. + * var throttled = _.throttle(renewToken, 300000, { 'trailing': false }); + * jQuery(element).on('click', throttled); + * + * // Cancel the trailing throttled invocation. + * jQuery(window).on('popstate', throttled.cancel); + */ +function throttle(func, wait, options) { + var leading = true, + trailing = true; + + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT$2); + } + if (isObject_1(options)) { + leading = 'leading' in options ? !!options.leading : leading; + trailing = 'trailing' in options ? !!options.trailing : trailing; + } + return debounce_1(func, wait, { + 'leading': leading, + 'maxWait': wait, + 'trailing': trailing + }); +} + +var throttle_1 = throttle;var saturation = createCommonjsModule(function (module, exports) { + +Object.defineProperty(exports, "__esModule", { + value: true +}); +var calculateChange = exports.calculateChange = function calculateChange(e, hsl, container) { + var _container$getBoundin = container.getBoundingClientRect(), + containerWidth = _container$getBoundin.width, + containerHeight = _container$getBoundin.height; + + var x = typeof e.pageX === 'number' ? e.pageX : e.touches[0].pageX; + var y = typeof e.pageY === 'number' ? e.pageY : e.touches[0].pageY; + var left = x - (container.getBoundingClientRect().left + window.pageXOffset); + var top = y - (container.getBoundingClientRect().top + window.pageYOffset); + + if (left < 0) { + left = 0; + } else if (left > containerWidth) { + left = containerWidth; + } else if (top < 0) { + top = 0; + } else if (top > containerHeight) { + top = containerHeight; + } + + var saturation = left * 100 / containerWidth; + var bright = -(top * 100 / containerHeight) + 100; + + return { + h: hsl.h, + s: saturation, + v: bright, + a: hsl.a, + source: 'rgb' + }; +}; +}); + +unwrapExports(saturation); +var saturation_1 = saturation.calculateChange;var Saturation_1 = createCommonjsModule(function (module, exports) { + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.Saturation = undefined; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + + + +var _react2 = _interopRequireDefault(react); + + + +var _reactcss2 = _interopRequireDefault(lib); + + + +var _throttle2 = _interopRequireDefault(throttle_1); + + + +var saturation$1 = _interopRequireWildcard(saturation); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var Saturation = exports.Saturation = function (_ref) { + _inherits(Saturation, _ref); + + function Saturation(props) { + _classCallCheck(this, Saturation); + + var _this = _possibleConstructorReturn(this, (Saturation.__proto__ || Object.getPrototypeOf(Saturation)).call(this, props)); + + _this.handleChange = function (e) { + typeof _this.props.onChange === 'function' && _this.throttle(_this.props.onChange, saturation$1.calculateChange(e, _this.props.hsl, _this.container), e); + }; + + _this.handleMouseDown = function (e) { + _this.handleChange(e); + window.addEventListener('mousemove', _this.handleChange); + window.addEventListener('mouseup', _this.handleMouseUp); + }; + + _this.handleMouseUp = function () { + _this.unbindEventListeners(); + }; + + _this.throttle = (0, _throttle2.default)(function (fn, data, e) { + fn(data, e); + }, 50); + return _this; + } + + _createClass(Saturation, [{ + key: 'componentWillUnmount', + value: function componentWillUnmount() { + this.throttle.cancel(); + this.unbindEventListeners(); + } + }, { + key: 'unbindEventListeners', + value: function unbindEventListeners() { + window.removeEventListener('mousemove', this.handleChange); + window.removeEventListener('mouseup', this.handleMouseUp); + } + }, { + key: 'render', + value: function render() { + var _this2 = this; + + var _ref2 = this.props.style || {}, + color = _ref2.color, + white = _ref2.white, + black = _ref2.black, + pointer = _ref2.pointer, + circle = _ref2.circle; + + var styles = (0, _reactcss2.default)({ + 'default': { + color: { + absolute: '0px 0px 0px 0px', + background: 'hsl(' + this.props.hsl.h + ',100%, 50%)', + borderRadius: this.props.radius + }, + white: { + absolute: '0px 0px 0px 0px', + borderRadius: this.props.radius + }, + black: { + absolute: '0px 0px 0px 0px', + boxShadow: this.props.shadow, + borderRadius: this.props.radius + }, + pointer: { + position: 'absolute', + top: -(this.props.hsv.v * 100) + 100 + '%', + left: this.props.hsv.s * 100 + '%', + cursor: 'default' + }, + circle: { + width: '4px', + height: '4px', + boxShadow: '0 0 0 1.5px #fff, inset 0 0 1px 1px rgba(0,0,0,.3),\n 0 0 1px 2px rgba(0,0,0,.4)', + borderRadius: '50%', + cursor: 'hand', + transform: 'translate(-2px, -2px)' + } + }, + 'custom': { + color: color, + white: white, + black: black, + pointer: pointer, + circle: circle + } + }, { 'custom': !!this.props.style }); + + return _react2.default.createElement( + 'div', + { + style: styles.color, + ref: function ref(container) { + return _this2.container = container; + }, + onMouseDown: this.handleMouseDown, + onTouchMove: this.handleChange, + onTouchStart: this.handleChange + }, + _react2.default.createElement( + 'style', + null, + '\n .saturation-white {\n background: -webkit-linear-gradient(to right, #fff, rgba(255,255,255,0));\n background: linear-gradient(to right, #fff, rgba(255,255,255,0));\n }\n .saturation-black {\n background: -webkit-linear-gradient(to top, #000, rgba(0,0,0,0));\n background: linear-gradient(to top, #000, rgba(0,0,0,0));\n }\n ' + ), + _react2.default.createElement( + 'div', + { style: styles.white, className: 'saturation-white' }, + _react2.default.createElement('div', { style: styles.black, className: 'saturation-black' }), + _react2.default.createElement( + 'div', + { style: styles.pointer }, + this.props.pointer ? _react2.default.createElement(this.props.pointer, this.props) : _react2.default.createElement('div', { style: styles.circle }) + ) + ) + ); + } + }]); + + return Saturation; +}(react.PureComponent || react.Component); + +exports.default = Saturation; +}); + +unwrapExports(Saturation_1); +var Saturation_2 = Saturation_1.Saturation;/** + * Iterates over elements of `collection` and invokes `iteratee` for each element. + * The iteratee is invoked with three arguments: (value, index|key, collection). + * Iteratee functions may exit iteration early by explicitly returning `false`. + * + * **Note:** As with other "Collections" methods, objects with a "length" + * property are iterated like arrays. To avoid this behavior use `_.forIn` + * or `_.forOwn` for object iteration. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @alias each + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array|Object} Returns `collection`. + * @see _.forEachRight + * @example + * + * _.forEach([1, 2], function(value) { + * console.log(value); + * }); + * // => Logs `1` then `2`. + * + * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) { + * console.log(key); + * }); + * // => Logs 'a' then 'b' (iteration order is not guaranteed). + */ +function forEach(collection, iteratee) { + var func = isArray_1(collection) ? _arrayEach : _baseEach; + return func(collection, _castFunction(iteratee)); +} + +var forEach_1 = forEach;var each = forEach_1;var tinycolor = createCommonjsModule(function (module) { +// TinyColor v1.4.1 +// https://github.com/bgrins/TinyColor +// Brian Grinstead, MIT License + +(function(Math) { + +var trimLeft = /^\s+/, + trimRight = /\s+$/, + tinyCounter = 0, + mathRound = Math.round, + mathMin = Math.min, + mathMax = Math.max, + mathRandom = Math.random; + +function tinycolor (color, opts) { + + color = (color) ? color : ''; + opts = opts || { }; + + // If input is already a tinycolor, return itself + if (color instanceof tinycolor) { + return color; + } + // If we are called as a function, call using new instead + if (!(this instanceof tinycolor)) { + return new tinycolor(color, opts); + } + + var rgb = inputToRGB(color); + this._originalInput = color, + this._r = rgb.r, + this._g = rgb.g, + this._b = rgb.b, + this._a = rgb.a, + this._roundA = mathRound(100*this._a) / 100, + this._format = opts.format || rgb.format; + this._gradientType = opts.gradientType; + + // Don't let the range of [0,255] come back in [0,1]. + // Potentially lose a little bit of precision here, but will fix issues where + // .5 gets interpreted as half of the total, instead of half of 1 + // If it was supposed to be 128, this was already taken care of by `inputToRgb` + if (this._r < 1) { this._r = mathRound(this._r); } + if (this._g < 1) { this._g = mathRound(this._g); } + if (this._b < 1) { this._b = mathRound(this._b); } + + this._ok = rgb.ok; + this._tc_id = tinyCounter++; +} + +tinycolor.prototype = { + isDark: function() { + return this.getBrightness() < 128; + }, + isLight: function() { + return !this.isDark(); + }, + isValid: function() { + return this._ok; + }, + getOriginalInput: function() { + return this._originalInput; + }, + getFormat: function() { + return this._format; + }, + getAlpha: function() { + return this._a; + }, + getBrightness: function() { + //http://www.w3.org/TR/AERT#color-contrast + var rgb = this.toRgb(); + return (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1000; + }, + getLuminance: function() { + //http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef + var rgb = this.toRgb(); + var RsRGB, GsRGB, BsRGB, R, G, B; + RsRGB = rgb.r/255; + GsRGB = rgb.g/255; + BsRGB = rgb.b/255; + + if (RsRGB <= 0.03928) {R = RsRGB / 12.92;} else {R = Math.pow(((RsRGB + 0.055) / 1.055), 2.4);} + if (GsRGB <= 0.03928) {G = GsRGB / 12.92;} else {G = Math.pow(((GsRGB + 0.055) / 1.055), 2.4);} + if (BsRGB <= 0.03928) {B = BsRGB / 12.92;} else {B = Math.pow(((BsRGB + 0.055) / 1.055), 2.4);} + return (0.2126 * R) + (0.7152 * G) + (0.0722 * B); + }, + setAlpha: function(value) { + this._a = boundAlpha(value); + this._roundA = mathRound(100*this._a) / 100; + return this; + }, + toHsv: function() { + var hsv = rgbToHsv(this._r, this._g, this._b); + return { h: hsv.h * 360, s: hsv.s, v: hsv.v, a: this._a }; + }, + toHsvString: function() { + var hsv = rgbToHsv(this._r, this._g, this._b); + var h = mathRound(hsv.h * 360), s = mathRound(hsv.s * 100), v = mathRound(hsv.v * 100); + return (this._a == 1) ? + "hsv(" + h + ", " + s + "%, " + v + "%)" : + "hsva(" + h + ", " + s + "%, " + v + "%, "+ this._roundA + ")"; + }, + toHsl: function() { + var hsl = rgbToHsl(this._r, this._g, this._b); + return { h: hsl.h * 360, s: hsl.s, l: hsl.l, a: this._a }; + }, + toHslString: function() { + var hsl = rgbToHsl(this._r, this._g, this._b); + var h = mathRound(hsl.h * 360), s = mathRound(hsl.s * 100), l = mathRound(hsl.l * 100); + return (this._a == 1) ? + "hsl(" + h + ", " + s + "%, " + l + "%)" : + "hsla(" + h + ", " + s + "%, " + l + "%, "+ this._roundA + ")"; + }, + toHex: function(allow3Char) { + return rgbToHex(this._r, this._g, this._b, allow3Char); + }, + toHexString: function(allow3Char) { + return '#' + this.toHex(allow3Char); + }, + toHex8: function(allow4Char) { + return rgbaToHex(this._r, this._g, this._b, this._a, allow4Char); + }, + toHex8String: function(allow4Char) { + return '#' + this.toHex8(allow4Char); + }, + toRgb: function() { + return { r: mathRound(this._r), g: mathRound(this._g), b: mathRound(this._b), a: this._a }; + }, + toRgbString: function() { + return (this._a == 1) ? + "rgb(" + mathRound(this._r) + ", " + mathRound(this._g) + ", " + mathRound(this._b) + ")" : + "rgba(" + mathRound(this._r) + ", " + mathRound(this._g) + ", " + mathRound(this._b) + ", " + this._roundA + ")"; + }, + toPercentageRgb: function() { + return { r: mathRound(bound01(this._r, 255) * 100) + "%", g: mathRound(bound01(this._g, 255) * 100) + "%", b: mathRound(bound01(this._b, 255) * 100) + "%", a: this._a }; + }, + toPercentageRgbString: function() { + return (this._a == 1) ? + "rgb(" + mathRound(bound01(this._r, 255) * 100) + "%, " + mathRound(bound01(this._g, 255) * 100) + "%, " + mathRound(bound01(this._b, 255) * 100) + "%)" : + "rgba(" + mathRound(bound01(this._r, 255) * 100) + "%, " + mathRound(bound01(this._g, 255) * 100) + "%, " + mathRound(bound01(this._b, 255) * 100) + "%, " + this._roundA + ")"; + }, + toName: function() { + if (this._a === 0) { + return "transparent"; + } + + if (this._a < 1) { + return false; + } + + return hexNames[rgbToHex(this._r, this._g, this._b, true)] || false; + }, + toFilter: function(secondColor) { + var hex8String = '#' + rgbaToArgbHex(this._r, this._g, this._b, this._a); + var secondHex8String = hex8String; + var gradientType = this._gradientType ? "GradientType = 1, " : ""; + + if (secondColor) { + var s = tinycolor(secondColor); + secondHex8String = '#' + rgbaToArgbHex(s._r, s._g, s._b, s._a); + } + + return "progid:DXImageTransform.Microsoft.gradient("+gradientType+"startColorstr="+hex8String+",endColorstr="+secondHex8String+")"; + }, + toString: function(format) { + var formatSet = !!format; + format = format || this._format; + + var formattedString = false; + var hasAlpha = this._a < 1 && this._a >= 0; + var needsAlphaFormat = !formatSet && hasAlpha && (format === "hex" || format === "hex6" || format === "hex3" || format === "hex4" || format === "hex8" || format === "name"); + + if (needsAlphaFormat) { + // Special case for "transparent", all other non-alpha formats + // will return rgba when there is transparency. + if (format === "name" && this._a === 0) { + return this.toName(); + } + return this.toRgbString(); + } + if (format === "rgb") { + formattedString = this.toRgbString(); + } + if (format === "prgb") { + formattedString = this.toPercentageRgbString(); + } + if (format === "hex" || format === "hex6") { + formattedString = this.toHexString(); + } + if (format === "hex3") { + formattedString = this.toHexString(true); + } + if (format === "hex4") { + formattedString = this.toHex8String(true); + } + if (format === "hex8") { + formattedString = this.toHex8String(); + } + if (format === "name") { + formattedString = this.toName(); + } + if (format === "hsl") { + formattedString = this.toHslString(); + } + if (format === "hsv") { + formattedString = this.toHsvString(); + } + + return formattedString || this.toHexString(); + }, + clone: function() { + return tinycolor(this.toString()); + }, + + _applyModification: function(fn, args) { + var color = fn.apply(null, [this].concat([].slice.call(args))); + this._r = color._r; + this._g = color._g; + this._b = color._b; + this.setAlpha(color._a); + return this; + }, + lighten: function() { + return this._applyModification(lighten, arguments); + }, + brighten: function() { + return this._applyModification(brighten, arguments); + }, + darken: function() { + return this._applyModification(darken, arguments); + }, + desaturate: function() { + return this._applyModification(desaturate, arguments); + }, + saturate: function() { + return this._applyModification(saturate, arguments); + }, + greyscale: function() { + return this._applyModification(greyscale, arguments); + }, + spin: function() { + return this._applyModification(spin, arguments); + }, + + _applyCombination: function(fn, args) { + return fn.apply(null, [this].concat([].slice.call(args))); + }, + analogous: function() { + return this._applyCombination(analogous, arguments); + }, + complement: function() { + return this._applyCombination(complement, arguments); + }, + monochromatic: function() { + return this._applyCombination(monochromatic, arguments); + }, + splitcomplement: function() { + return this._applyCombination(splitcomplement, arguments); + }, + triad: function() { + return this._applyCombination(triad, arguments); + }, + tetrad: function() { + return this._applyCombination(tetrad, arguments); + } +}; + +// If input is an object, force 1 into "1.0" to handle ratios properly +// String input requires "1.0" as input, so 1 will be treated as 1 +tinycolor.fromRatio = function(color, opts) { + if (typeof color == "object") { + var newColor = {}; + for (var i in color) { + if (color.hasOwnProperty(i)) { + if (i === "a") { + newColor[i] = color[i]; + } + else { + newColor[i] = convertToPercentage(color[i]); + } + } + } + color = newColor; + } + + return tinycolor(color, opts); +}; + +// Given a string or object, convert that input to RGB +// Possible string inputs: +// +// "red" +// "#f00" or "f00" +// "#ff0000" or "ff0000" +// "#ff000000" or "ff000000" +// "rgb 255 0 0" or "rgb (255, 0, 0)" +// "rgb 1.0 0 0" or "rgb (1, 0, 0)" +// "rgba (255, 0, 0, 1)" or "rgba 255, 0, 0, 1" +// "rgba (1.0, 0, 0, 1)" or "rgba 1.0, 0, 0, 1" +// "hsl(0, 100%, 50%)" or "hsl 0 100% 50%" +// "hsla(0, 100%, 50%, 1)" or "hsla 0 100% 50%, 1" +// "hsv(0, 100%, 100%)" or "hsv 0 100% 100%" +// +function inputToRGB(color) { + + var rgb = { r: 0, g: 0, b: 0 }; + var a = 1; + var s = null; + var v = null; + var l = null; + var ok = false; + var format = false; + + if (typeof color == "string") { + color = stringInputToObject(color); + } + + if (typeof color == "object") { + if (isValidCSSUnit(color.r) && isValidCSSUnit(color.g) && isValidCSSUnit(color.b)) { + rgb = rgbToRgb(color.r, color.g, color.b); + ok = true; + format = String(color.r).substr(-1) === "%" ? "prgb" : "rgb"; + } + else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.v)) { + s = convertToPercentage(color.s); + v = convertToPercentage(color.v); + rgb = hsvToRgb(color.h, s, v); + ok = true; + format = "hsv"; + } + else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.l)) { + s = convertToPercentage(color.s); + l = convertToPercentage(color.l); + rgb = hslToRgb(color.h, s, l); + ok = true; + format = "hsl"; + } + + if (color.hasOwnProperty("a")) { + a = color.a; + } + } + + a = boundAlpha(a); + + return { + ok: ok, + format: color.format || format, + r: mathMin(255, mathMax(rgb.r, 0)), + g: mathMin(255, mathMax(rgb.g, 0)), + b: mathMin(255, mathMax(rgb.b, 0)), + a: a + }; +} + + +// Conversion Functions +// -------------------- + +// `rgbToHsl`, `rgbToHsv`, `hslToRgb`, `hsvToRgb` modified from: +// + +// `rgbToRgb` +// Handle bounds / percentage checking to conform to CSS color spec +// +// *Assumes:* r, g, b in [0, 255] or [0, 1] +// *Returns:* { r, g, b } in [0, 255] +function rgbToRgb(r, g, b){ + return { + r: bound01(r, 255) * 255, + g: bound01(g, 255) * 255, + b: bound01(b, 255) * 255 + }; +} + +// `rgbToHsl` +// Converts an RGB color value to HSL. +// *Assumes:* r, g, and b are contained in [0, 255] or [0, 1] +// *Returns:* { h, s, l } in [0,1] +function rgbToHsl(r, g, b) { + + r = bound01(r, 255); + g = bound01(g, 255); + b = bound01(b, 255); + + var max = mathMax(r, g, b), min = mathMin(r, g, b); + var h, s, l = (max + min) / 2; + + if(max == min) { + h = s = 0; // achromatic + } + else { + var d = max - min; + s = l > 0.5 ? d / (2 - max - min) : d / (max + min); + switch(max) { + case r: h = (g - b) / d + (g < b ? 6 : 0); break; + case g: h = (b - r) / d + 2; break; + case b: h = (r - g) / d + 4; break; + } + + h /= 6; + } + + return { h: h, s: s, l: l }; +} + +// `hslToRgb` +// Converts an HSL color value to RGB. +// *Assumes:* h is contained in [0, 1] or [0, 360] and s and l are contained [0, 1] or [0, 100] +// *Returns:* { r, g, b } in the set [0, 255] +function hslToRgb(h, s, l) { + var r, g, b; + + h = bound01(h, 360); + s = bound01(s, 100); + l = bound01(l, 100); + + function hue2rgb(p, q, t) { + if(t < 0) t += 1; + if(t > 1) t -= 1; + if(t < 1/6) return p + (q - p) * 6 * t; + if(t < 1/2) return q; + if(t < 2/3) return p + (q - p) * (2/3 - t) * 6; + return p; + } + + if(s === 0) { + r = g = b = l; // achromatic + } + else { + var q = l < 0.5 ? l * (1 + s) : l + s - l * s; + var p = 2 * l - q; + r = hue2rgb(p, q, h + 1/3); + g = hue2rgb(p, q, h); + b = hue2rgb(p, q, h - 1/3); + } + + return { r: r * 255, g: g * 255, b: b * 255 }; +} + +// `rgbToHsv` +// Converts an RGB color value to HSV +// *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1] +// *Returns:* { h, s, v } in [0,1] +function rgbToHsv(r, g, b) { + + r = bound01(r, 255); + g = bound01(g, 255); + b = bound01(b, 255); + + var max = mathMax(r, g, b), min = mathMin(r, g, b); + var h, s, v = max; + + var d = max - min; + s = max === 0 ? 0 : d / max; + + if(max == min) { + h = 0; // achromatic + } + else { + switch(max) { + case r: h = (g - b) / d + (g < b ? 6 : 0); break; + case g: h = (b - r) / d + 2; break; + case b: h = (r - g) / d + 4; break; + } + h /= 6; + } + return { h: h, s: s, v: v }; +} + +// `hsvToRgb` +// Converts an HSV color value to RGB. +// *Assumes:* h is contained in [0, 1] or [0, 360] and s and v are contained in [0, 1] or [0, 100] +// *Returns:* { r, g, b } in the set [0, 255] + function hsvToRgb(h, s, v) { + + h = bound01(h, 360) * 6; + s = bound01(s, 100); + v = bound01(v, 100); + + var i = Math.floor(h), + f = h - i, + p = v * (1 - s), + q = v * (1 - f * s), + t = v * (1 - (1 - f) * s), + mod = i % 6, + r = [v, q, p, p, t, v][mod], + g = [t, v, v, q, p, p][mod], + b = [p, p, t, v, v, q][mod]; + + return { r: r * 255, g: g * 255, b: b * 255 }; +} + +// `rgbToHex` +// Converts an RGB color to hex +// Assumes r, g, and b are contained in the set [0, 255] +// Returns a 3 or 6 character hex +function rgbToHex(r, g, b, allow3Char) { + + var hex = [ + pad2(mathRound(r).toString(16)), + pad2(mathRound(g).toString(16)), + pad2(mathRound(b).toString(16)) + ]; + + // Return a 3 character hex if possible + if (allow3Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1)) { + return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0); + } + + return hex.join(""); +} + +// `rgbaToHex` +// Converts an RGBA color plus alpha transparency to hex +// Assumes r, g, b are contained in the set [0, 255] and +// a in [0, 1]. Returns a 4 or 8 character rgba hex +function rgbaToHex(r, g, b, a, allow4Char) { + + var hex = [ + pad2(mathRound(r).toString(16)), + pad2(mathRound(g).toString(16)), + pad2(mathRound(b).toString(16)), + pad2(convertDecimalToHex(a)) + ]; + + // Return a 4 character hex if possible + if (allow4Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1) && hex[3].charAt(0) == hex[3].charAt(1)) { + return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0) + hex[3].charAt(0); + } + + return hex.join(""); +} + +// `rgbaToArgbHex` +// Converts an RGBA color to an ARGB Hex8 string +// Rarely used, but required for "toFilter()" +function rgbaToArgbHex(r, g, b, a) { + + var hex = [ + pad2(convertDecimalToHex(a)), + pad2(mathRound(r).toString(16)), + pad2(mathRound(g).toString(16)), + pad2(mathRound(b).toString(16)) + ]; + + return hex.join(""); +} + +// `equals` +// Can be called with any tinycolor input +tinycolor.equals = function (color1, color2) { + if (!color1 || !color2) { return false; } + return tinycolor(color1).toRgbString() == tinycolor(color2).toRgbString(); +}; + +tinycolor.random = function() { + return tinycolor.fromRatio({ + r: mathRandom(), + g: mathRandom(), + b: mathRandom() + }); +}; + + +// Modification Functions +// ---------------------- +// Thanks to less.js for some of the basics here +// + +function desaturate(color, amount) { + amount = (amount === 0) ? 0 : (amount || 10); + var hsl = tinycolor(color).toHsl(); + hsl.s -= amount / 100; + hsl.s = clamp01(hsl.s); + return tinycolor(hsl); +} + +function saturate(color, amount) { + amount = (amount === 0) ? 0 : (amount || 10); + var hsl = tinycolor(color).toHsl(); + hsl.s += amount / 100; + hsl.s = clamp01(hsl.s); + return tinycolor(hsl); +} + +function greyscale(color) { + return tinycolor(color).desaturate(100); +} + +function lighten (color, amount) { + amount = (amount === 0) ? 0 : (amount || 10); + var hsl = tinycolor(color).toHsl(); + hsl.l += amount / 100; + hsl.l = clamp01(hsl.l); + return tinycolor(hsl); +} + +function brighten(color, amount) { + amount = (amount === 0) ? 0 : (amount || 10); + var rgb = tinycolor(color).toRgb(); + rgb.r = mathMax(0, mathMin(255, rgb.r - mathRound(255 * - (amount / 100)))); + rgb.g = mathMax(0, mathMin(255, rgb.g - mathRound(255 * - (amount / 100)))); + rgb.b = mathMax(0, mathMin(255, rgb.b - mathRound(255 * - (amount / 100)))); + return tinycolor(rgb); +} + +function darken (color, amount) { + amount = (amount === 0) ? 0 : (amount || 10); + var hsl = tinycolor(color).toHsl(); + hsl.l -= amount / 100; + hsl.l = clamp01(hsl.l); + return tinycolor(hsl); +} + +// Spin takes a positive or negative amount within [-360, 360] indicating the change of hue. +// Values outside of this range will be wrapped into this range. +function spin(color, amount) { + var hsl = tinycolor(color).toHsl(); + var hue = (hsl.h + amount) % 360; + hsl.h = hue < 0 ? 360 + hue : hue; + return tinycolor(hsl); +} + +// Combination Functions +// --------------------- +// Thanks to jQuery xColor for some of the ideas behind these +// + +function complement(color) { + var hsl = tinycolor(color).toHsl(); + hsl.h = (hsl.h + 180) % 360; + return tinycolor(hsl); +} + +function triad(color) { + var hsl = tinycolor(color).toHsl(); + var h = hsl.h; + return [ + tinycolor(color), + tinycolor({ h: (h + 120) % 360, s: hsl.s, l: hsl.l }), + tinycolor({ h: (h + 240) % 360, s: hsl.s, l: hsl.l }) + ]; +} + +function tetrad(color) { + var hsl = tinycolor(color).toHsl(); + var h = hsl.h; + return [ + tinycolor(color), + tinycolor({ h: (h + 90) % 360, s: hsl.s, l: hsl.l }), + tinycolor({ h: (h + 180) % 360, s: hsl.s, l: hsl.l }), + tinycolor({ h: (h + 270) % 360, s: hsl.s, l: hsl.l }) + ]; +} + +function splitcomplement(color) { + var hsl = tinycolor(color).toHsl(); + var h = hsl.h; + return [ + tinycolor(color), + tinycolor({ h: (h + 72) % 360, s: hsl.s, l: hsl.l}), + tinycolor({ h: (h + 216) % 360, s: hsl.s, l: hsl.l}) + ]; +} + +function analogous(color, results, slices) { + results = results || 6; + slices = slices || 30; + + var hsl = tinycolor(color).toHsl(); + var part = 360 / slices; + var ret = [tinycolor(color)]; + + for (hsl.h = ((hsl.h - (part * results >> 1)) + 720) % 360; --results; ) { + hsl.h = (hsl.h + part) % 360; + ret.push(tinycolor(hsl)); + } + return ret; +} + +function monochromatic(color, results) { + results = results || 6; + var hsv = tinycolor(color).toHsv(); + var h = hsv.h, s = hsv.s, v = hsv.v; + var ret = []; + var modification = 1 / results; + + while (results--) { + ret.push(tinycolor({ h: h, s: s, v: v})); + v = (v + modification) % 1; + } + + return ret; +} + +// Utility Functions +// --------------------- + +tinycolor.mix = function(color1, color2, amount) { + amount = (amount === 0) ? 0 : (amount || 50); + + var rgb1 = tinycolor(color1).toRgb(); + var rgb2 = tinycolor(color2).toRgb(); + + var p = amount / 100; + + var rgba = { + r: ((rgb2.r - rgb1.r) * p) + rgb1.r, + g: ((rgb2.g - rgb1.g) * p) + rgb1.g, + b: ((rgb2.b - rgb1.b) * p) + rgb1.b, + a: ((rgb2.a - rgb1.a) * p) + rgb1.a + }; + + return tinycolor(rgba); +}; + + +// Readability Functions +// --------------------- +// false +// tinycolor.isReadable("#000", "#111",{level:"AA",size:"large"}) => false +tinycolor.isReadable = function(color1, color2, wcag2) { + var readability = tinycolor.readability(color1, color2); + var wcag2Parms, out; + + out = false; + + wcag2Parms = validateWCAG2Parms(wcag2); + switch (wcag2Parms.level + wcag2Parms.size) { + case "AAsmall": + case "AAAlarge": + out = readability >= 4.5; + break; + case "AAlarge": + out = readability >= 3; + break; + case "AAAsmall": + out = readability >= 7; + break; + } + return out; + +}; + +// `mostReadable` +// Given a base color and a list of possible foreground or background +// colors for that base, returns the most readable color. +// Optionally returns Black or White if the most readable color is unreadable. +// *Example* +// tinycolor.mostReadable(tinycolor.mostReadable("#123", ["#124", "#125"],{includeFallbackColors:false}).toHexString(); // "#112255" +// tinycolor.mostReadable(tinycolor.mostReadable("#123", ["#124", "#125"],{includeFallbackColors:true}).toHexString(); // "#ffffff" +// tinycolor.mostReadable("#a8015a", ["#faf3f3"],{includeFallbackColors:true,level:"AAA",size:"large"}).toHexString(); // "#faf3f3" +// tinycolor.mostReadable("#a8015a", ["#faf3f3"],{includeFallbackColors:true,level:"AAA",size:"small"}).toHexString(); // "#ffffff" +tinycolor.mostReadable = function(baseColor, colorList, args) { + var bestColor = null; + var bestScore = 0; + var readability; + var includeFallbackColors, level, size ; + args = args || {}; + includeFallbackColors = args.includeFallbackColors ; + level = args.level; + size = args.size; + + for (var i= 0; i < colorList.length ; i++) { + readability = tinycolor.readability(baseColor, colorList[i]); + if (readability > bestScore) { + bestScore = readability; + bestColor = tinycolor(colorList[i]); + } + } + + if (tinycolor.isReadable(baseColor, bestColor, {"level":level,"size":size}) || !includeFallbackColors) { + return bestColor; + } + else { + args.includeFallbackColors=false; + return tinycolor.mostReadable(baseColor,["#fff", "#000"],args); + } +}; + + +// Big List of Colors +// ------------------ +// +var names = tinycolor.names = { + aliceblue: "f0f8ff", + antiquewhite: "faebd7", + aqua: "0ff", + aquamarine: "7fffd4", + azure: "f0ffff", + beige: "f5f5dc", + bisque: "ffe4c4", + black: "000", + blanchedalmond: "ffebcd", + blue: "00f", + blueviolet: "8a2be2", + brown: "a52a2a", + burlywood: "deb887", + burntsienna: "ea7e5d", + cadetblue: "5f9ea0", + chartreuse: "7fff00", + chocolate: "d2691e", + coral: "ff7f50", + cornflowerblue: "6495ed", + cornsilk: "fff8dc", + crimson: "dc143c", + cyan: "0ff", + darkblue: "00008b", + darkcyan: "008b8b", + darkgoldenrod: "b8860b", + darkgray: "a9a9a9", + darkgreen: "006400", + darkgrey: "a9a9a9", + darkkhaki: "bdb76b", + darkmagenta: "8b008b", + darkolivegreen: "556b2f", + darkorange: "ff8c00", + darkorchid: "9932cc", + darkred: "8b0000", + darksalmon: "e9967a", + darkseagreen: "8fbc8f", + darkslateblue: "483d8b", + darkslategray: "2f4f4f", + darkslategrey: "2f4f4f", + darkturquoise: "00ced1", + darkviolet: "9400d3", + deeppink: "ff1493", + deepskyblue: "00bfff", + dimgray: "696969", + dimgrey: "696969", + dodgerblue: "1e90ff", + firebrick: "b22222", + floralwhite: "fffaf0", + forestgreen: "228b22", + fuchsia: "f0f", + gainsboro: "dcdcdc", + ghostwhite: "f8f8ff", + gold: "ffd700", + goldenrod: "daa520", + gray: "808080", + green: "008000", + greenyellow: "adff2f", + grey: "808080", + honeydew: "f0fff0", + hotpink: "ff69b4", + indianred: "cd5c5c", + indigo: "4b0082", + ivory: "fffff0", + khaki: "f0e68c", + lavender: "e6e6fa", + lavenderblush: "fff0f5", + lawngreen: "7cfc00", + lemonchiffon: "fffacd", + lightblue: "add8e6", + lightcoral: "f08080", + lightcyan: "e0ffff", + lightgoldenrodyellow: "fafad2", + lightgray: "d3d3d3", + lightgreen: "90ee90", + lightgrey: "d3d3d3", + lightpink: "ffb6c1", + lightsalmon: "ffa07a", + lightseagreen: "20b2aa", + lightskyblue: "87cefa", + lightslategray: "789", + lightslategrey: "789", + lightsteelblue: "b0c4de", + lightyellow: "ffffe0", + lime: "0f0", + limegreen: "32cd32", + linen: "faf0e6", + magenta: "f0f", + maroon: "800000", + mediumaquamarine: "66cdaa", + mediumblue: "0000cd", + mediumorchid: "ba55d3", + mediumpurple: "9370db", + mediumseagreen: "3cb371", + mediumslateblue: "7b68ee", + mediumspringgreen: "00fa9a", + mediumturquoise: "48d1cc", + mediumvioletred: "c71585", + midnightblue: "191970", + mintcream: "f5fffa", + mistyrose: "ffe4e1", + moccasin: "ffe4b5", + navajowhite: "ffdead", + navy: "000080", + oldlace: "fdf5e6", + olive: "808000", + olivedrab: "6b8e23", + orange: "ffa500", + orangered: "ff4500", + orchid: "da70d6", + palegoldenrod: "eee8aa", + palegreen: "98fb98", + paleturquoise: "afeeee", + palevioletred: "db7093", + papayawhip: "ffefd5", + peachpuff: "ffdab9", + peru: "cd853f", + pink: "ffc0cb", + plum: "dda0dd", + powderblue: "b0e0e6", + purple: "800080", + rebeccapurple: "663399", + red: "f00", + rosybrown: "bc8f8f", + royalblue: "4169e1", + saddlebrown: "8b4513", + salmon: "fa8072", + sandybrown: "f4a460", + seagreen: "2e8b57", + seashell: "fff5ee", + sienna: "a0522d", + silver: "c0c0c0", + skyblue: "87ceeb", + slateblue: "6a5acd", + slategray: "708090", + slategrey: "708090", + snow: "fffafa", + springgreen: "00ff7f", + steelblue: "4682b4", + tan: "d2b48c", + teal: "008080", + thistle: "d8bfd8", + tomato: "ff6347", + turquoise: "40e0d0", + violet: "ee82ee", + wheat: "f5deb3", + white: "fff", + whitesmoke: "f5f5f5", + yellow: "ff0", + yellowgreen: "9acd32" +}; + +// Make it easy to access colors via `hexNames[hex]` +var hexNames = tinycolor.hexNames = flip(names); + + +// Utilities +// --------- + +// `{ 'name1': 'val1' }` becomes `{ 'val1': 'name1' }` +function flip(o) { + var flipped = { }; + for (var i in o) { + if (o.hasOwnProperty(i)) { + flipped[o[i]] = i; + } + } + return flipped; +} + +// Return a valid alpha value [0,1] with all invalid values being set to 1 +function boundAlpha(a) { + a = parseFloat(a); + + if (isNaN(a) || a < 0 || a > 1) { + a = 1; + } + + return a; +} + +// Take input from [0, n] and return it as [0, 1] +function bound01(n, max) { + if (isOnePointZero(n)) { n = "100%"; } + + var processPercent = isPercentage(n); + n = mathMin(max, mathMax(0, parseFloat(n))); + + // Automatically convert percentage into number + if (processPercent) { + n = parseInt(n * max, 10) / 100; + } + + // Handle floating point rounding errors + if ((Math.abs(n - max) < 0.000001)) { + return 1; + } + + // Convert into [0, 1] range if it isn't already + return (n % max) / parseFloat(max); +} + +// Force a number between 0 and 1 +function clamp01(val) { + return mathMin(1, mathMax(0, val)); +} + +// Parse a base-16 hex value into a base-10 integer +function parseIntFromHex(val) { + return parseInt(val, 16); +} + +// Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1 +// +function isOnePointZero(n) { + return typeof n == "string" && n.indexOf('.') != -1 && parseFloat(n) === 1; +} + +// Check to see if string passed in is a percentage +function isPercentage(n) { + return typeof n === "string" && n.indexOf('%') != -1; +} + +// Force a hex value to have 2 characters +function pad2(c) { + return c.length == 1 ? '0' + c : '' + c; +} + +// Replace a decimal with it's percentage value +function convertToPercentage(n) { + if (n <= 1) { + n = (n * 100) + "%"; + } + + return n; +} + +// Converts a decimal to a hex value +function convertDecimalToHex(d) { + return Math.round(parseFloat(d) * 255).toString(16); +} +// Converts a hex value to a decimal +function convertHexToDecimal(h) { + return (parseIntFromHex(h) / 255); +} + +var matchers = (function() { + + // + var CSS_INTEGER = "[-\\+]?\\d+%?"; + + // + var CSS_NUMBER = "[-\\+]?\\d*\\.\\d+%?"; + + // Allow positive/negative integer/number. Don't capture the either/or, just the entire outcome. + var CSS_UNIT = "(?:" + CSS_NUMBER + ")|(?:" + CSS_INTEGER + ")"; + + // Actual matching. + // Parentheses and commas are optional, but not required. + // Whitespace can take the place of commas or opening paren + var PERMISSIVE_MATCH3 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?"; + var PERMISSIVE_MATCH4 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?"; + + return { + CSS_UNIT: new RegExp(CSS_UNIT), + rgb: new RegExp("rgb" + PERMISSIVE_MATCH3), + rgba: new RegExp("rgba" + PERMISSIVE_MATCH4), + hsl: new RegExp("hsl" + PERMISSIVE_MATCH3), + hsla: new RegExp("hsla" + PERMISSIVE_MATCH4), + hsv: new RegExp("hsv" + PERMISSIVE_MATCH3), + hsva: new RegExp("hsva" + PERMISSIVE_MATCH4), + hex3: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/, + hex6: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/, + hex4: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/, + hex8: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/ + }; +})(); + +// `isValidCSSUnit` +// Take in a single string / number and check to see if it looks like a CSS unit +// (see `matchers` above for definition). +function isValidCSSUnit(color) { + return !!matchers.CSS_UNIT.exec(color); +} + +// `stringInputToObject` +// Permissive string parsing. Take in a number of formats, and output an object +// based on detected format. Returns `{ r, g, b }` or `{ h, s, l }` or `{ h, s, v}` +function stringInputToObject(color) { + + color = color.replace(trimLeft,'').replace(trimRight, '').toLowerCase(); + var named = false; + if (names[color]) { + color = names[color]; + named = true; + } + else if (color == 'transparent') { + return { r: 0, g: 0, b: 0, a: 0, format: "name" }; + } + + // Try to match string input using regular expressions. + // Keep most of the number bounding out of this function - don't worry about [0,1] or [0,100] or [0,360] + // Just return an object and let the conversion functions handle that. + // This way the result will be the same whether the tinycolor is initialized with string or object. + var match; + if ((match = matchers.rgb.exec(color))) { + return { r: match[1], g: match[2], b: match[3] }; + } + if ((match = matchers.rgba.exec(color))) { + return { r: match[1], g: match[2], b: match[3], a: match[4] }; + } + if ((match = matchers.hsl.exec(color))) { + return { h: match[1], s: match[2], l: match[3] }; + } + if ((match = matchers.hsla.exec(color))) { + return { h: match[1], s: match[2], l: match[3], a: match[4] }; + } + if ((match = matchers.hsv.exec(color))) { + return { h: match[1], s: match[2], v: match[3] }; + } + if ((match = matchers.hsva.exec(color))) { + return { h: match[1], s: match[2], v: match[3], a: match[4] }; + } + if ((match = matchers.hex8.exec(color))) { + return { + r: parseIntFromHex(match[1]), + g: parseIntFromHex(match[2]), + b: parseIntFromHex(match[3]), + a: convertHexToDecimal(match[4]), + format: named ? "name" : "hex8" + }; + } + if ((match = matchers.hex6.exec(color))) { + return { + r: parseIntFromHex(match[1]), + g: parseIntFromHex(match[2]), + b: parseIntFromHex(match[3]), + format: named ? "name" : "hex" + }; + } + if ((match = matchers.hex4.exec(color))) { + return { + r: parseIntFromHex(match[1] + '' + match[1]), + g: parseIntFromHex(match[2] + '' + match[2]), + b: parseIntFromHex(match[3] + '' + match[3]), + a: convertHexToDecimal(match[4] + '' + match[4]), + format: named ? "name" : "hex8" + }; + } + if ((match = matchers.hex3.exec(color))) { + return { + r: parseIntFromHex(match[1] + '' + match[1]), + g: parseIntFromHex(match[2] + '' + match[2]), + b: parseIntFromHex(match[3] + '' + match[3]), + format: named ? "name" : "hex" + }; + } + + return false; +} + +function validateWCAG2Parms(parms) { + // return valid WCAG2 parms for isReadable. + // If input parms are invalid, return {"level":"AA", "size":"small"} + var level, size; + parms = parms || {"level":"AA", "size":"small"}; + level = (parms.level || "AA").toUpperCase(); + size = (parms.size || "small").toLowerCase(); + if (level !== "AA" && level !== "AAA") { + level = "AA"; + } + if (size !== "small" && size !== "large") { + size = "small"; + } + return {"level":level, "size":size}; +} + +// Node: Export function +if ( module.exports) { + module.exports = tinycolor; +} +// AMD/requirejs: Define the module +else { + window.tinycolor = tinycolor; +} + +})(Math); +});var color = createCommonjsModule(function (module, exports) { + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.red = exports.getContrastingColor = exports.isValidHex = exports.toState = exports.simpleCheckForValidColor = undefined; + + + +var _each2 = _interopRequireDefault(each); + + + +var _tinycolor2 = _interopRequireDefault(tinycolor); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var simpleCheckForValidColor = exports.simpleCheckForValidColor = function simpleCheckForValidColor(data) { + var keysToCheck = ['r', 'g', 'b', 'a', 'h', 's', 'l', 'v']; + var checked = 0; + var passed = 0; + (0, _each2.default)(keysToCheck, function (letter) { + if (data[letter]) { + checked += 1; + if (!isNaN(data[letter])) { + passed += 1; + } + if (letter === 's' || letter === 'l') { + var percentPatt = /^\d+%$/; + if (percentPatt.test(data[letter])) { + passed += 1; + } + } + } + }); + return checked === passed ? data : false; +}; + +var toState = exports.toState = function toState(data, oldHue) { + var color = data.hex ? (0, _tinycolor2.default)(data.hex) : (0, _tinycolor2.default)(data); + var hsl = color.toHsl(); + var hsv = color.toHsv(); + var rgb = color.toRgb(); + var hex = color.toHex(); + if (hsl.s === 0) { + hsl.h = oldHue || 0; + hsv.h = oldHue || 0; + } + var transparent = hex === '000000' && rgb.a === 0; + + return { + hsl: hsl, + hex: transparent ? 'transparent' : '#' + hex, + rgb: rgb, + hsv: hsv, + oldHue: data.h || oldHue || hsl.h, + source: data.source + }; +}; + +var isValidHex = exports.isValidHex = function isValidHex(hex) { + // disable hex4 and hex8 + var lh = String(hex).charAt(0) === '#' ? 1 : 0; + return hex.length !== 4 + lh && hex.length < 7 + lh && (0, _tinycolor2.default)(hex).isValid(); +}; + +var getContrastingColor = exports.getContrastingColor = function getContrastingColor(data) { + if (!data) { + return '#fff'; + } + var col = toState(data); + if (col.hex === 'transparent') { + return 'rgba(0,0,0,0.4)'; + } + var yiq = (col.rgb.r * 299 + col.rgb.g * 587 + col.rgb.b * 114) / 1000; + return yiq >= 128 ? '#000' : '#fff'; +}; + +var red = exports.red = { + hsl: { a: 1, h: 0, l: 0.5, s: 1 }, + hex: '#ff0000', + rgb: { r: 255, g: 0, b: 0, a: 1 }, + hsv: { h: 0, s: 1, v: 1, a: 1 } +}; + +exports.default = exports; +}); + +unwrapExports(color); +var color_1 = color.red; +var color_2 = color.getContrastingColor; +var color_3 = color.isValidHex; +var color_4 = color.toState; +var color_5 = color.simpleCheckForValidColor;var ColorWrap_1 = createCommonjsModule(function (module, exports) { + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.ColorWrap = undefined; + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + + + +var _react2 = _interopRequireDefault(react); + + + +var _debounce2 = _interopRequireDefault(debounce_1); + + + +var _color2 = _interopRequireDefault(color); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var ColorWrap = exports.ColorWrap = function ColorWrap(Picker) { + var ColorPicker = function (_ref) { + _inherits(ColorPicker, _ref); + + function ColorPicker(props) { + _classCallCheck(this, ColorPicker); + + var _this = _possibleConstructorReturn(this, (ColorPicker.__proto__ || Object.getPrototypeOf(ColorPicker)).call(this)); + + _this.handleChange = function (data, event) { + var isValidColor = _color2.default.simpleCheckForValidColor(data); + if (isValidColor) { + var colors = _color2.default.toState(data, data.h || _this.state.oldHue); + _this.setState(colors); + _this.props.onChangeComplete && _this.debounce(_this.props.onChangeComplete, colors, event); + _this.props.onChange && _this.props.onChange(colors, event); + } + }; + + _this.handleSwatchHover = function (data, event) { + var isValidColor = _color2.default.simpleCheckForValidColor(data); + if (isValidColor) { + var colors = _color2.default.toState(data, data.h || _this.state.oldHue); + _this.props.onSwatchHover && _this.props.onSwatchHover(colors, event); + } + }; + + _this.state = _extends({}, _color2.default.toState(props.color, 0)); + + _this.debounce = (0, _debounce2.default)(function (fn, data, event) { + fn(data, event); + }, 100); + return _this; + } + + _createClass(ColorPicker, [{ + key: 'componentWillReceiveProps', + value: function componentWillReceiveProps(nextProps) { + this.setState(_extends({}, _color2.default.toState(nextProps.color, this.state.oldHue))); + } + }, { + key: 'render', + value: function render() { + var optionalEvents = {}; + if (this.props.onSwatchHover) { + optionalEvents.onSwatchHover = this.handleSwatchHover; + } + + return _react2.default.createElement(Picker, _extends({}, this.props, this.state, { + onChange: this.handleChange + }, optionalEvents)); + } + }]); + + return ColorPicker; + }(react.PureComponent || react.Component); + + ColorPicker.propTypes = _extends({}, Picker.propTypes); + + ColorPicker.defaultProps = _extends({}, Picker.defaultProps, { + color: { + h: 250, + s: 0.50, + l: 0.20, + a: 1 + } + }); + + return ColorPicker; +}; + +exports.default = ColorWrap; +}); + +unwrapExports(ColorWrap_1); +var ColorWrap_2 = ColorWrap_1.ColorWrap;var interaction = createCommonjsModule(function (module, exports) { + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.handleFocus = undefined; + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + + + +var _react2 = _interopRequireDefault(react); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /* eslint-disable no-invalid-this */ + + +var handleFocus = exports.handleFocus = function handleFocus(Component) { + var Span = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'span'; + return function (_React$Component) { + _inherits(Focus, _React$Component); + + function Focus() { + var _ref; + + var _temp, _this, _ret; + + _classCallCheck(this, Focus); + + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = Focus.__proto__ || Object.getPrototypeOf(Focus)).call.apply(_ref, [this].concat(args))), _this), _this.state = { focus: false }, _this.handleFocus = function () { + return _this.setState({ focus: true }); + }, _this.handleBlur = function () { + return _this.setState({ focus: false }); + }, _temp), _possibleConstructorReturn(_this, _ret); + } + + _createClass(Focus, [{ + key: 'render', + value: function render() { + return _react2.default.createElement( + Span, + { onFocus: this.handleFocus, onBlur: this.handleBlur }, + _react2.default.createElement(Component, _extends({}, this.props, this.state)) + ); + } + }]); + + return Focus; + }(_react2.default.Component); +}; +}); + +unwrapExports(interaction); +var interaction_1 = interaction.handleFocus;var Swatch_1 = createCommonjsModule(function (module, exports) { + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.Swatch = undefined; + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + + + +var _react2 = _interopRequireDefault(react); + + + +var _reactcss2 = _interopRequireDefault(lib); + + + + + +var _Checkboard2 = _interopRequireDefault(Checkboard_1); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var ENTER = 13; + +var Swatch = exports.Swatch = function Swatch(_ref) { + var color = _ref.color, + style = _ref.style, + _ref$onClick = _ref.onClick, + onClick = _ref$onClick === undefined ? function () {} : _ref$onClick, + onHover = _ref.onHover, + _ref$title = _ref.title, + title = _ref$title === undefined ? color : _ref$title, + children = _ref.children, + focus = _ref.focus, + _ref$focusStyle = _ref.focusStyle, + focusStyle = _ref$focusStyle === undefined ? {} : _ref$focusStyle; + + var transparent = color === 'transparent'; + var styles = (0, _reactcss2.default)({ + default: { + swatch: _extends({ + background: color, + height: '100%', + width: '100%', + cursor: 'pointer', + position: 'relative', + outline: 'none' + }, style, focus ? focusStyle : {}) + } + }); + + var handleClick = function handleClick(e) { + return onClick(color, e); + }; + var handleKeyDown = function handleKeyDown(e) { + return e.keyCode === ENTER && onClick(color, e); + }; + var handleHover = function handleHover(e) { + return onHover(color, e); + }; + + var optionalEvents = {}; + if (onHover) { + optionalEvents.onMouseOver = handleHover; + } + + return _react2.default.createElement( + 'div', + _extends({ + style: styles.swatch, + onClick: handleClick, + title: title, + tabIndex: 0, + onKeyDown: handleKeyDown + }, optionalEvents), + children, + transparent && _react2.default.createElement(_Checkboard2.default, { + borderRadius: styles.swatch.borderRadius, + boxShadow: 'inset 0 0 0 1px rgba(0,0,0,0.1)' + }) + ); +}; + +exports.default = (0, interaction.handleFocus)(Swatch); +}); + +unwrapExports(Swatch_1); +var Swatch_2 = Swatch_1.Swatch;var common = createCommonjsModule(function (module, exports) { + +Object.defineProperty(exports, "__esModule", { + value: true +}); + + + +Object.defineProperty(exports, 'Alpha', { + enumerable: true, + get: function get() { + return _interopRequireDefault(Alpha_1).default; + } +}); + + + +Object.defineProperty(exports, 'Checkboard', { + enumerable: true, + get: function get() { + return _interopRequireDefault(Checkboard_1).default; + } +}); + + + +Object.defineProperty(exports, 'EditableInput', { + enumerable: true, + get: function get() { + return _interopRequireDefault(EditableInput_1).default; + } +}); + + + +Object.defineProperty(exports, 'Hue', { + enumerable: true, + get: function get() { + return _interopRequireDefault(Hue_1).default; + } +}); + + + +Object.defineProperty(exports, 'Raised', { + enumerable: true, + get: function get() { + return _interopRequireDefault(Raised_1).default; + } +}); + + + +Object.defineProperty(exports, 'Saturation', { + enumerable: true, + get: function get() { + return _interopRequireDefault(Saturation_1).default; + } +}); + + + +Object.defineProperty(exports, 'ColorWrap', { + enumerable: true, + get: function get() { + return _interopRequireDefault(ColorWrap_1).default; + } +}); + + + +Object.defineProperty(exports, 'Swatch', { + enumerable: true, + get: function get() { + return _interopRequireDefault(Swatch_1).default; + } +}); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +}); + +unwrapExports(common);var SketchFields_1 = createCommonjsModule(function (module, exports) { + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.SketchFields = undefined; + + + +var _react2 = _interopRequireDefault(react); + + + +var _reactcss2 = _interopRequireDefault(lib); + + + +var _color2 = _interopRequireDefault(color); + + + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/* eslint-disable no-param-reassign */ + +var SketchFields = exports.SketchFields = function SketchFields(_ref) { + var onChange = _ref.onChange, + rgb = _ref.rgb, + hsl = _ref.hsl, + hex = _ref.hex, + disableAlpha = _ref.disableAlpha; + + var styles = (0, _reactcss2.default)({ + 'default': { + fields: { + display: 'flex', + paddingTop: '4px' + }, + single: { + flex: '1', + paddingLeft: '6px' + }, + alpha: { + flex: '1', + paddingLeft: '6px' + }, + double: { + flex: '2' + }, + input: { + width: '80%', + padding: '4px 10% 3px', + border: 'none', + boxShadow: 'inset 0 0 0 1px #ccc', + fontSize: '11px' + }, + label: { + display: 'block', + textAlign: 'center', + fontSize: '11px', + color: '#222', + paddingTop: '3px', + paddingBottom: '4px', + textTransform: 'capitalize' + } + }, + 'disableAlpha': { + alpha: { + display: 'none' + } + } + }, { disableAlpha: disableAlpha }); + + var handleChange = function handleChange(data, e) { + if (data.hex) { + _color2.default.isValidHex(data.hex) && onChange({ + hex: data.hex, + source: 'hex' + }, e); + } else if (data.r || data.g || data.b) { + onChange({ + r: data.r || rgb.r, + g: data.g || rgb.g, + b: data.b || rgb.b, + a: rgb.a, + source: 'rgb' + }, e); + } else if (data.a) { + if (data.a < 0) { + data.a = 0; + } else if (data.a > 100) { + data.a = 100; + } + + data.a /= 100; + onChange({ + h: hsl.h, + s: hsl.s, + l: hsl.l, + a: data.a, + source: 'rgb' + }, e); + } + }; + + return _react2.default.createElement( + 'div', + { style: styles.fields, className: 'flexbox-fix' }, + _react2.default.createElement( + 'div', + { style: styles.double }, + _react2.default.createElement(common.EditableInput, { + style: { input: styles.input, label: styles.label }, + label: 'hex', + value: hex.replace('#', ''), + onChange: handleChange + }) + ), + _react2.default.createElement( + 'div', + { style: styles.single }, + _react2.default.createElement(common.EditableInput, { + style: { input: styles.input, label: styles.label }, + label: 'r', + value: rgb.r, + onChange: handleChange, + dragLabel: 'true', + dragMax: '255' + }) + ), + _react2.default.createElement( + 'div', + { style: styles.single }, + _react2.default.createElement(common.EditableInput, { + style: { input: styles.input, label: styles.label }, + label: 'g', + value: rgb.g, + onChange: handleChange, + dragLabel: 'true', + dragMax: '255' + }) + ), + _react2.default.createElement( + 'div', + { style: styles.single }, + _react2.default.createElement(common.EditableInput, { + style: { input: styles.input, label: styles.label }, + label: 'b', + value: rgb.b, + onChange: handleChange, + dragLabel: 'true', + dragMax: '255' + }) + ), + _react2.default.createElement( + 'div', + { style: styles.alpha }, + _react2.default.createElement(common.EditableInput, { + style: { input: styles.input, label: styles.label }, + label: 'a', + value: Math.round(rgb.a * 100), + onChange: handleChange, + dragLabel: 'true', + dragMax: '100' + }) + ) + ); +}; + +exports.default = SketchFields; +}); + +unwrapExports(SketchFields_1); +var SketchFields_2 = SketchFields_1.SketchFields;var SketchPresetColors_1 = createCommonjsModule(function (module, exports) { + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.SketchPresetColors = undefined; + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + + + +var _react2 = _interopRequireDefault(react); + + + +var _propTypes2 = _interopRequireDefault(propTypes); + + + +var _reactcss2 = _interopRequireDefault(lib); + + + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var SketchPresetColors = exports.SketchPresetColors = function SketchPresetColors(_ref) { + var colors = _ref.colors, + _ref$onClick = _ref.onClick, + onClick = _ref$onClick === undefined ? function () {} : _ref$onClick, + onSwatchHover = _ref.onSwatchHover; + + var styles = (0, _reactcss2.default)({ + 'default': { + colors: { + margin: '0 -10px', + padding: '10px 0 0 10px', + borderTop: '1px solid #eee', + display: 'flex', + flexWrap: 'wrap', + position: 'relative' + }, + swatchWrap: { + width: '16px', + height: '16px', + margin: '0 10px 10px 0' + }, + swatch: { + borderRadius: '3px', + boxShadow: 'inset 0 0 0 1px rgba(0,0,0,.15)' + } + }, + 'no-presets': { + colors: { + display: 'none' + } + } + }, { + 'no-presets': !colors || !colors.length + }); + + var handleClick = function handleClick(hex, e) { + onClick({ + hex: hex, + source: 'hex' + }, e); + }; + + return _react2.default.createElement( + 'div', + { style: styles.colors, className: 'flexbox-fix' }, + colors.map(function (colorObjOrString) { + var c = typeof colorObjOrString === 'string' ? { color: colorObjOrString } : colorObjOrString; + var key = '' + c.color + (c.title || ''); + return _react2.default.createElement( + 'div', + { key: key, style: styles.swatchWrap }, + _react2.default.createElement(common.Swatch, _extends({}, c, { + style: styles.swatch, + onClick: handleClick, + onHover: onSwatchHover, + focusStyle: { + boxShadow: 'inset 0 0 0 1px rgba(0,0,0,.15), 0 0 4px ' + c.color + } + })) + ); + }) + ); +}; + +SketchPresetColors.propTypes = { + colors: _propTypes2.default.arrayOf(_propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.shape({ + color: _propTypes2.default.string, + title: _propTypes2.default.string + })])).isRequired +}; + +exports.default = SketchPresetColors; +}); + +unwrapExports(SketchPresetColors_1); +var SketchPresetColors_2 = SketchPresetColors_1.SketchPresetColors;var Sketch_1 = createCommonjsModule(function (module, exports) { + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.Sketch = undefined; + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + + + +var _react2 = _interopRequireDefault(react); + + + +var _propTypes2 = _interopRequireDefault(propTypes); + + + +var _reactcss2 = _interopRequireDefault(lib); + + + +var _merge2 = _interopRequireDefault(merge_1); + + + + + +var _SketchFields2 = _interopRequireDefault(SketchFields_1); + + + +var _SketchPresetColors2 = _interopRequireDefault(SketchPresetColors_1); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var Sketch = exports.Sketch = function Sketch(_ref) { + var width = _ref.width, + rgb = _ref.rgb, + hex = _ref.hex, + hsv = _ref.hsv, + hsl = _ref.hsl, + onChange = _ref.onChange, + onSwatchHover = _ref.onSwatchHover, + disableAlpha = _ref.disableAlpha, + presetColors = _ref.presetColors, + renderers = _ref.renderers, + _ref$styles = _ref.styles, + passedStyles = _ref$styles === undefined ? {} : _ref$styles, + _ref$className = _ref.className, + className = _ref$className === undefined ? '' : _ref$className; + + var styles = (0, _reactcss2.default)((0, _merge2.default)({ + 'default': _extends({ + picker: { + width: width, + padding: '10px 10px 0', + boxSizing: 'initial', + background: '#fff', + borderRadius: '4px', + boxShadow: '0 0 0 1px rgba(0,0,0,.15), 0 8px 16px rgba(0,0,0,.15)' + }, + saturation: { + width: '100%', + paddingBottom: '75%', + position: 'relative', + overflow: 'hidden' + }, + Saturation: { + radius: '3px', + shadow: 'inset 0 0 0 1px rgba(0,0,0,.15), inset 0 0 4px rgba(0,0,0,.25)' + }, + controls: { + display: 'flex' + }, + sliders: { + padding: '4px 0', + flex: '1' + }, + color: { + width: '24px', + height: '24px', + position: 'relative', + marginTop: '4px', + marginLeft: '4px', + borderRadius: '3px' + }, + activeColor: { + absolute: '0px 0px 0px 0px', + borderRadius: '2px', + background: 'rgba(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ',' + rgb.a + ')', + boxShadow: 'inset 0 0 0 1px rgba(0,0,0,.15), inset 0 0 4px rgba(0,0,0,.25)' + }, + hue: { + position: 'relative', + height: '10px', + overflow: 'hidden' + }, + Hue: { + radius: '2px', + shadow: 'inset 0 0 0 1px rgba(0,0,0,.15), inset 0 0 4px rgba(0,0,0,.25)' + }, + + alpha: { + position: 'relative', + height: '10px', + marginTop: '4px', + overflow: 'hidden' + }, + Alpha: { + radius: '2px', + shadow: 'inset 0 0 0 1px rgba(0,0,0,.15), inset 0 0 4px rgba(0,0,0,.25)' + } + }, passedStyles), + 'disableAlpha': { + color: { + height: '10px' + }, + hue: { + height: '10px' + }, + alpha: { + display: 'none' + } + } + }, passedStyles), { disableAlpha: disableAlpha }); + + return _react2.default.createElement( + 'div', + { style: styles.picker, className: 'sketch-picker ' + className }, + _react2.default.createElement( + 'div', + { style: styles.saturation }, + _react2.default.createElement(common.Saturation, { + style: styles.Saturation, + hsl: hsl, + hsv: hsv, + onChange: onChange + }) + ), + _react2.default.createElement( + 'div', + { style: styles.controls, className: 'flexbox-fix' }, + _react2.default.createElement( + 'div', + { style: styles.sliders }, + _react2.default.createElement( + 'div', + { style: styles.hue }, + _react2.default.createElement(common.Hue, { + style: styles.Hue, + hsl: hsl, + onChange: onChange + }) + ), + _react2.default.createElement( + 'div', + { style: styles.alpha }, + _react2.default.createElement(common.Alpha, { + style: styles.Alpha, + rgb: rgb, + hsl: hsl, + renderers: renderers, + onChange: onChange + }) + ) + ), + _react2.default.createElement( + 'div', + { style: styles.color }, + _react2.default.createElement(common.Checkboard, null), + _react2.default.createElement('div', { style: styles.activeColor }) + ) + ), + _react2.default.createElement(_SketchFields2.default, { + rgb: rgb, + hsl: hsl, + hex: hex, + onChange: onChange, + disableAlpha: disableAlpha + }), + _react2.default.createElement(_SketchPresetColors2.default, { + colors: presetColors, + onClick: onChange, + onSwatchHover: onSwatchHover + }) + ); +}; + +Sketch.propTypes = { + disableAlpha: _propTypes2.default.bool, + width: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.number]), + styles: _propTypes2.default.object +}; + +Sketch.defaultProps = { + disableAlpha: false, + width: 200, + styles: {}, + presetColors: ['#D0021B', '#F5A623', '#F8E71C', '#8B572A', '#7ED321', '#417505', '#BD10E0', '#9013FE', '#4A90E2', '#50E3C2', '#B8E986', '#000000', '#4A4A4A', '#9B9B9B', '#FFFFFF'] +}; + +exports.default = (0, common.ColorWrap)(Sketch); +}); + +var SketchPicker = unwrapExports(Sketch_1); +var Sketch_2 = Sketch_1.Sketch;if (typeof self !== "undefined") { + init(self); +} else if (typeof global$1 !== "undefined") { + init(global$1); +} else if (typeof window !== "undefined") { + init(window); +} else { + throw new Error("unsupported execution environment"); +} + +function init(g) { + g.SketchPicker = SketchPicker; +}}(React)); \ No newline at end of file diff --git a/frontend/vendor/react-color/react-color.bundle.min.js b/frontend/vendor/react-color/react-color.bundle.min.js new file mode 100644 index 000000000..bb8ef1151 --- /dev/null +++ b/frontend/vendor/react-color/react-color.bundle.min.js @@ -0,0 +1 @@ +!function(e){"use strict";e=e&&e.hasOwnProperty("default")?e.default:e;var t="undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},r="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function n(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function o(e,t){return e(t={exports:{}},t.exports),t.exports}t.setTimeout,t.clearTimeout;var a=t.performance||{},i=(a.now||a.mozNow||a.msNow||a.oNow||a.webkitNow,o(function(e,t){Object.defineProperty(t,"__esModule",{value:!0});var r="function"==typeof Symbol&&Symbol.for,n=r?Symbol.for("react.element"):60103,o=r?Symbol.for("react.portal"):60106,a=r?Symbol.for("react.fragment"):60107,i=r?Symbol.for("react.strict_mode"):60108,u=r?Symbol.for("react.profiler"):60114,l=r?Symbol.for("react.provider"):60109,c=r?Symbol.for("react.context"):60110,s=r?Symbol.for("react.async_mode"):60111,f=r?Symbol.for("react.concurrent_mode"):60111,p=r?Symbol.for("react.forward_ref"):60112,d=r?Symbol.for("react.suspense"):60113,h=r?Symbol.for("react.memo"):60115,v=r?Symbol.for("react.lazy"):60116;function b(e){if("object"==typeof e&&null!==e){var t=e.$$typeof;switch(t){case n:switch(e=e.type){case s:case f:case a:case u:case i:case d:return e;default:switch(e=e&&e.$$typeof){case c:case p:case l:return e;default:return t}}case v:case h:case o:return t}}}function y(e){return b(e)===f}t.typeOf=b,t.AsyncMode=s,t.ConcurrentMode=f,t.ContextConsumer=c,t.ContextProvider=l,t.Element=n,t.ForwardRef=p,t.Fragment=a,t.Lazy=v,t.Memo=h,t.Portal=o,t.Profiler=u,t.StrictMode=i,t.Suspense=d,t.isValidElementType=function(e){return"string"==typeof e||"function"==typeof e||e===a||e===f||e===u||e===i||e===d||"object"==typeof e&&null!==e&&(e.$$typeof===v||e.$$typeof===h||e.$$typeof===l||e.$$typeof===c||e.$$typeof===p)},t.isAsyncMode=function(e){return y(e)||b(e)===s},t.isConcurrentMode=y,t.isContextConsumer=function(e){return b(e)===c},t.isContextProvider=function(e){return b(e)===l},t.isElement=function(e){return"object"==typeof e&&null!==e&&e.$$typeof===n},t.isForwardRef=function(e){return b(e)===p},t.isFragment=function(e){return b(e)===a},t.isLazy=function(e){return b(e)===v},t.isMemo=function(e){return b(e)===h},t.isPortal=function(e){return b(e)===o},t.isProfiler=function(e){return b(e)===u},t.isStrictMode=function(e){return b(e)===i},t.isSuspense=function(e){return b(e)===d}}));n(i);i.typeOf,i.AsyncMode,i.ConcurrentMode,i.ContextConsumer,i.ContextProvider,i.Element,i.ForwardRef,i.Fragment,i.Lazy,i.Memo,i.Portal,i.Profiler,i.StrictMode,i.Suspense,i.isValidElementType,i.isAsyncMode,i.isConcurrentMode,i.isContextConsumer,i.isContextProvider,i.isElement,i.isForwardRef,i.isFragment,i.isLazy,i.isMemo,i.isPortal,i.isProfiler,i.isStrictMode,i.isSuspense;var u=o(function(e,t){!function(){Object.defineProperty(t,"__esModule",{value:!0});var e="function"==typeof Symbol&&Symbol.for,r=e?Symbol.for("react.element"):60103,n=e?Symbol.for("react.portal"):60106,o=e?Symbol.for("react.fragment"):60107,a=e?Symbol.for("react.strict_mode"):60108,i=e?Symbol.for("react.profiler"):60114,u=e?Symbol.for("react.provider"):60109,l=e?Symbol.for("react.context"):60110,c=e?Symbol.for("react.async_mode"):60111,s=e?Symbol.for("react.concurrent_mode"):60111,f=e?Symbol.for("react.forward_ref"):60112,p=e?Symbol.for("react.suspense"):60113,d=e?Symbol.for("react.memo"):60115,h=e?Symbol.for("react.lazy"):60116;var v=function(e){for(var t=arguments.length,r=Array(t>1?t-1:0),n=1;n2?r-2:0),o=2;o1?x("Invalid arguments supplied to oneOf, expected an array, got "+arguments.length+" arguments. A common mistake is to write oneOf(x, y, z) instead of oneOf([x, y, z])."):x("Invalid argument supplied to oneOf, expected an array."),j;return c(function(t,r,n,o,a){for(var l=t[r],c=0;c-1&&e%1==0&&e-1&&e%1==0&&e<=oe},ie={};ie["[object Float32Array]"]=ie["[object Float64Array]"]=ie["[object Int8Array]"]=ie["[object Int16Array]"]=ie["[object Int32Array]"]=ie["[object Uint8Array]"]=ie["[object Uint8ClampedArray]"]=ie["[object Uint16Array]"]=ie["[object Uint32Array]"]=!0,ie["[object Arguments]"]=ie["[object Array]"]=ie["[object ArrayBuffer]"]=ie["[object Boolean]"]=ie["[object DataView]"]=ie["[object Date]"]=ie["[object Error]"]=ie["[object Function]"]=ie["[object Map]"]=ie["[object Number]"]=ie["[object Object]"]=ie["[object RegExp]"]=ie["[object Set]"]=ie["[object String]"]=ie["[object WeakMap]"]=!1;var ue=function(e){return B(e)&&ae(e.length)&&!!ie[U(e)]};var le=function(e){return function(t){return e(t)}},ce=o(function(e,t){var r=t&&!t.nodeType&&t,n=r&&e&&!e.nodeType&&e,o=n&&n.exports===r&&C.process,a=function(){try{var e=n&&n.require&&n.require("util").types;return e||o&&o.binding&&o.binding("util")}catch(e){}}();e.exports=a}),se=ce&&ce.isTypedArray,fe=se?le(se):ue,pe=Object.prototype.hasOwnProperty;var de=function(e,t){var r=$(e),n=!r&&Q(e),o=!r&&!n&&ee(e),a=!r&&!n&&!o&&fe(e),i=r||n||o||a,u=i?q(e.length,String):[],l=u.length;for(var c in e)!t&&!pe.call(e,c)||i&&("length"==c||o&&("offset"==c||"parent"==c)||a&&("buffer"==c||"byteLength"==c||"byteOffset"==c)||ne(c,l))||u.push(c);return u},he=Object.prototype;var ve=function(e){var t=e&&e.constructor;return e===("function"==typeof t&&t.prototype||he)};var be=function(e,t){return function(r){return e(t(r))}},ye=be(Object.keys,Object),ge=Object.prototype.hasOwnProperty;var me=function(e){if(!ve(e))return ye(e);var t=[];for(var r in Object(e))ge.call(e,r)&&"constructor"!=r&&t.push(r);return t};var we=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)},_e="[object AsyncFunction]",xe="[object Function]",je="[object GeneratorFunction]",Oe="[object Proxy]";var Se=function(e){if(!we(e))return!1;var t=U(e);return t==xe||t==je||t==_e||t==Oe};var Ce=function(e){return null!=e&&ae(e.length)&&!Se(e)};var Ee=function(e){return Ce(e)?de(e):me(e)};var ke=function(e,t){return e&&V(e,t,Ee)};var Ae=function(e){return e};var Pe=function(e){return"function"==typeof e?e:Ae};var Me=function(e,t){return e&&ke(e,Pe(t))},Re=be(Object.getPrototypeOf,Object),Te="[object Object]",Fe=Function.prototype,ze=Object.prototype,Le=Fe.toString,He=ze.hasOwnProperty,Ie=Le.call(Object);var De=function(e){if(!B(e)||U(e)!=Te)return!1;var t=Re(e);if(null===t)return!0;var r=He.call(t,"constructor")&&t.constructor;return"function"==typeof r&&r instanceof r&&Le.call(r)==Ie};var Ue=function(e,t){for(var r=-1,n=null==e?0:e.length,o=Array(n);++r-1};var Ye=function(e,t){var r=this.__data__,n=We(r,e);return n<0?(++this.size,r.push([e,t])):r[n][1]=t,this};function Ke(e){var t=-1,r=null==e?0:e.length;for(this.clear();++tu))return!1;var c=a.get(e);if(c&&a.get(t))return c==t;var s=-1,f=!0,p=r&Jt?new qt:void 0;for(a.set(e,t),a.set(t,e);++s0&&void 0!==arguments[0]?arguments[0]:[],i=[];return(0,a.default)(t,function(t){Array.isArray(t)?e(t).map(function(e){return i.push(e)}):(0,o.default)(t)?(0,n.default)(t,function(e,t){!0===e&&i.push(t),i.push(t+"-"+e)}):(0,r.default)(t)&&i.push(t)}),i};t.default=u});n(zn);zn.flattenNames;var Ln=function(e,t){for(var r=-1,n=null==e?0:e.length;++r1&&void 0!==arguments[1]?arguments[1]:[],a=e.default&&(0,n.default)(e.default)||{};return t.map(function(t){var n=e[t];return n&&(0,r.default)(n,function(e,t){a[t]||(a[t]={}),a[t]=o({},a[t],n[t])}),t}),a};t.default=i});n(ea);ea.mergeClasses;var ta=o(function(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.autoprefix=void 0;var r,n=(r=Me)&&r.__esModule?r:{default:r},o=Object.assign||function(e){for(var t=1;t1&&void 0!==arguments[1]?arguments[1]:"span";return function(r){function n(){var r,l,c;i(this,n);for(var s=arguments.length,f=Array(s),p=0;p1&&void 0!==arguments[1]?arguments[1]:"span";return function(r){function n(){var r,l,c;i(this,n);for(var s=arguments.length,f=Array(s),p=0;p1&&void 0!==arguments[1])||arguments[1];r[e]=t};return 0===e&&n("first-child"),e===t-1&&n("last-child"),(0===e||e%2==0)&&n("even"),1===Math.abs(e%2)&&n("odd"),n("nth-child",e),r}});n(oa);var aa=o(function(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.ReactCSS=t.loop=t.handleActive=t.handleHover=t.hover=void 0;var r=l(zn),n=l(ea),o=l(ta),a=l(ra),i=l(na),u=l(oa);function l(e){return e&&e.__esModule?e:{default:e}}t.hover=a.default,t.handleHover=a.default,t.handleActive=i.default,t.loop=u.default;var c=t.ReactCSS=function(e){for(var t=arguments.length,a=Array(t>1?t-1:0),i=1;i0){if(++t>=ya)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}(ba);var _a=function(e,t){return wa(ha(e,t,Ae),e+"")};var xa=function(e,t,r){if(!we(r))return!1;var n=typeof t;return!!("number"==n?Ce(r)&&ne(t,r.length):"string"==n&&t in r)&&Be(r[t],e)};var ja=function(e){return _a(function(t,r){var n=-1,o=r.length,a=o>1?r[o-1]:void 0,i=o>2?r[2]:void 0;for(a=e.length>3&&"function"==typeof a?(o--,a):void 0,i&&xa(r[0],r[1],i)&&(a=o<3?void 0:a,o=1),t=Object(t);++ni?1:Math.round(100*s/i)/100,t.a!==f)return{h:t.h,s:t.s,l:t.l,a:f,source:"rgb"}}else{var p=void 0;if(n!==(p=c<0?0:c>a?1:Math.round(100*c/a)/100))return{h:t.h,s:t.s,l:t.l,a:p,source:"rgb"}}return null}});n(Oa);Oa.calculateChange;var Sa=o(function(e,t){Object.defineProperty(t,"__esModule",{value:!0});var r={},n=t.render=function(e,t,r,n){if("undefined"==typeof document&&!n)return null;var o=n?new n:document.createElement("canvas");o.width=2*r,o.height=2*r;var a=o.getContext("2d");return a?(a.fillStyle=e,a.fillRect(0,0,o.width,o.height),a.fillStyle=t,a.fillRect(0,0,r,r),a.translate(r,r),a.fillRect(0,0,r,r),o.toDataURL()):null};t.get=function(e,t,o,a){var i=e+"-"+t+"-"+o+(a?"-server":"");if(r[i])return r[i];var u=n(e,t,o,a);return r[i]=u,u}});n(Sa);Sa.render,Sa.get;var Ca=o(function(t,r){Object.defineProperty(r,"__esModule",{value:!0}),r.Checkboard=void 0;var n=i(e),o=i(aa),a=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}(Sa);function i(e){return e&&e.__esModule?e:{default:e}}var u=r.Checkboard=function(e){var t=e.white,r=e.grey,i=e.size,u=e.renderers,l=e.borderRadius,c=e.boxShadow,s=(0,o.default)({default:{grid:{borderRadius:l,boxShadow:c,absolute:"0px 0px 0px 0px",background:"url("+a.get(t,r,i,u.canvas)+") center left"}}});return n.default.createElement("div",{style:s.grid})};u.defaultProps={size:8,white:"transparent",grey:"rgba(0,0,0,.08)",renderers:{}},r.default=u});n(Ca);Ca.Checkboard;var Ea=o(function(t,r){Object.defineProperty(r,"__esModule",{value:!0}),r.Alpha=void 0;var n=Object.assign||function(e){for(var t=1;t-1},s=function(e){return Number(String(e).replace(/%/g,""))},f=r.EditableInput=function(t){function r(e){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,r);var t=function(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}(this,(r.__proto__||Object.getPrototypeOf(r)).call(this));return t.handleBlur=function(){t.state.blurValue&&t.setState({value:t.state.blurValue,blurValue:null})},t.handleChange=function(e){t.setUpdatedValue(e.target.value,e)},t.handleKeyDown=function(e){var r=s(e.target.value);if(!isNaN(r)&&c(e.keyCode)){var n=t.getArrowOffset(),o=e.keyCode===u?r+n:r-n;t.setUpdatedValue(o,e)}},t.handleDrag=function(e){if(t.props.dragLabel){var r=Math.round(t.props.value+e.movementX);r>=0&&r<=t.props.dragMax&&t.props.onChange&&t.props.onChange(t.getValueObjectWithLabel(r),e)}},t.handleMouseDown=function(e){t.props.dragLabel&&(e.preventDefault(),t.handleDrag(e),window.addEventListener("mousemove",t.handleDrag),window.addEventListener("mouseup",t.handleMouseUp))},t.handleMouseUp=function(){t.unbindEventListeners()},t.unbindEventListeners=function(){window.removeEventListener("mousemove",t.handleDrag),window.removeEventListener("mouseup",t.handleMouseUp)},t.state={value:String(e.value).toUpperCase(),blurValue:String(e.value).toUpperCase()},t}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(r,e.PureComponent||e.Component),n(r,[{key:"componentWillReceiveProps",value:function(e){var t=this.input;e.value!==this.state.value&&(t===document.activeElement?this.setState({blurValue:String(e.value).toUpperCase()}):this.setState({value:String(e.value).toUpperCase(),blurValue:!this.state.blurValue&&String(e.value).toUpperCase()}))}},{key:"componentWillUnmount",value:function(){this.unbindEventListeners()}},{key:"getValueObjectWithLabel",value:function(e){return function(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}({},this.props.label,e)}},{key:"getArrowOffset",value:function(){return this.props.arrowOffset||1}},{key:"setUpdatedValue",value:function(e,t){var r=null!==this.props.label?this.getValueObjectWithLabel(e):e;this.props.onChange&&this.props.onChange(r,t);var n,o=function(e){return String(e).indexOf("%")>-1}(t.target.value);this.setState({value:o?(n=e,n+"%"):e})}},{key:"render",value:function(){var e=this,t=(0,a.default)({default:{wrap:{position:"relative"}},"user-override":{wrap:this.props.style&&this.props.style.wrap?this.props.style.wrap:{},input:this.props.style&&this.props.style.input?this.props.style.input:{},label:this.props.style&&this.props.style.label?this.props.style.label:{}},"dragLabel-true":{label:{cursor:"ew-resize"}}},{"user-override":!0},this.props);return o.default.createElement("div",{style:t.wrap},o.default.createElement("input",{style:t.input,ref:function(t){return e.input=t},value:this.state.value,onKeyDown:this.handleKeyDown,onChange:this.handleChange,onBlur:this.handleBlur,placeholder:this.props.placeholder,spellCheck:"false"}),this.props.label&&!this.props.hideLabel?o.default.createElement("span",{style:t.label,onMouseDown:this.handleMouseDown},this.props.label):null)}}]),r}();r.default=f});n(ka);ka.EditableInput;var Aa=o(function(e,t){Object.defineProperty(t,"__esModule",{value:!0});t.calculateChange=function(e,t,r,n){var o=n.clientWidth,a=n.clientHeight,i="number"==typeof e.pageX?e.pageX:e.touches[0].pageX,u="number"==typeof e.pageY?e.pageY:e.touches[0].pageY,l=i-(n.getBoundingClientRect().left+window.pageXOffset),c=u-(n.getBoundingClientRect().top+window.pageYOffset);if("vertical"===t){var s=void 0;if(c<0)s=359;else if(c>a)s=0;else{s=360*(-100*c/a+100)/100}if(r.h!==s)return{h:s,s:r.s,l:r.l,a:r.a,source:"rgb"}}else{var f=void 0;if(l<0)f=0;else if(l>o)f=359;else{f=360*(100*l/o)/100}if(r.h!==f)return{h:f,s:r.s,l:r.l,a:r.a,source:"rgb"}}return null}});n(Aa);Aa.calculateChange;var Pa=o(function(t,r){Object.defineProperty(r,"__esModule",{value:!0}),r.Hue=void 0;var n=function(){function e(e,t){for(var r=0;r=t||r<0||f&&e-c>=a}function v(){var e=Ra();if(h(e))return b(e);u=setTimeout(v,function(e){var r=t-(e-l);return f?Ba(r,a-(e-c)):r}(e))}function b(e){return u=void 0,p&&n?d(e):(n=o=void 0,i)}function y(){var e=Ra(),r=h(e);if(n=arguments,o=this,l=e,r){if(void 0===u)return function(e){return c=e,u=setTimeout(v,t),s?d(e):i}(l);if(f)return clearTimeout(u),u=setTimeout(v,t),d(l)}return void 0===u&&(u=setTimeout(v,t)),i}return t=Da(t)||0,we(r)&&(s=!!r.leading,a=(f="maxWait"in r)?$a(Da(r.maxWait)||0,t):a,p="trailing"in r?!!r.trailing:p),y.cancel=function(){void 0!==u&&clearTimeout(u),c=0,n=l=o=u=void 0},y.flush=function(){return void 0===u?i:b(Ra())},y},Na="Expected a function";var Va=function(e,t,r){var n=!0,o=!0;if("function"!=typeof e)throw new TypeError(Na);return we(r)&&(n="leading"in r?!!r.leading:n,o="trailing"in r?!!r.trailing:o),Wa(e,t,{leading:n,maxWait:t,trailing:o})},qa=o(function(e,t){Object.defineProperty(t,"__esModule",{value:!0});t.calculateChange=function(e,t,r){var n=r.getBoundingClientRect(),o=n.width,a=n.height,i="number"==typeof e.pageX?e.pageX:e.touches[0].pageX,u="number"==typeof e.pageY?e.pageY:e.touches[0].pageY,l=i-(r.getBoundingClientRect().left+window.pageXOffset),c=u-(r.getBoundingClientRect().top+window.pageYOffset);l<0?l=0:l>o?l=o:c<0?c=0:c>a&&(c=a);var s=100*l/o,f=-100*c/a+100;return{h:t.h,s:s,v:f,a:t.a,source:"rgb"}}});n(qa);qa.calculateChange;var Xa=o(function(t,r){Object.defineProperty(r,"__esModule",{value:!0}),r.Saturation=void 0;var n=function(){function e(e,t){for(var r=0;r1&&(r-=1),r<1/6?e+6*(t-e)*r:r<.5?t:r<2/3?e+(t-e)*(2/3-r)*6:e}if(e=P(e,360),t=P(t,100),r=P(r,100),0===t)n=o=a=r;else{var u=r<.5?r*(1+t):r+t-r*t,l=2*r-u;n=i(l,u,e+1/3),o=i(l,u,e),a=i(l,u,e-1/3)}return{r:255*n,g:255*o,b:255*a}}(e.h,l,s),f=!0,p="hsl"),e.hasOwnProperty("a")&&(a=e.a));var d,h,v;return a=A(a),{ok:f,format:e.format||p,r:i(255,u(o.r,0)),g:i(255,u(o.g,0)),b:i(255,u(o.b,0)),a:a}}(e);this._originalInput=e,this._r=s.r,this._g=s.g,this._b=s.b,this._a=s.a,this._roundA=a(100*this._a)/100,this._format=l.format||s.format,this._gradientType=l.gradientType,this._r<1&&(this._r=a(this._r)),this._g<1&&(this._g=a(this._g)),this._b<1&&(this._b=a(this._b)),this._ok=s.ok,this._tc_id=o++}function s(e,t,r){e=P(e,255),t=P(t,255),r=P(r,255);var n,o,a=u(e,t,r),l=i(e,t,r),c=(a+l)/2;if(a==l)n=o=0;else{var s=a-l;switch(o=c>.5?s/(2-a-l):s/(a+l),a){case e:n=(t-r)/s+(t>1)+720)%360;--t;)n.h=(n.h+o)%360,a.push(c(n));return a}function C(e,t){t=t||6;for(var r=c(e).toHsv(),n=r.h,o=r.s,a=r.v,i=[],u=1/t;t--;)i.push(c({h:n,s:o,v:a})),a=(a+u)%1;return i}c.prototype={isDark:function(){return this.getBrightness()<128},isLight:function(){return!this.isDark()},isValid:function(){return this._ok},getOriginalInput:function(){return this._originalInput},getFormat:function(){return this._format},getAlpha:function(){return this._a},getBrightness:function(){var e=this.toRgb();return(299*e.r+587*e.g+114*e.b)/1e3},getLuminance:function(){var e,r,n,o=this.toRgb();return e=o.r/255,r=o.g/255,n=o.b/255,.2126*(e<=.03928?e/12.92:t.pow((e+.055)/1.055,2.4))+.7152*(r<=.03928?r/12.92:t.pow((r+.055)/1.055,2.4))+.0722*(n<=.03928?n/12.92:t.pow((n+.055)/1.055,2.4))},setAlpha:function(e){return this._a=A(e),this._roundA=a(100*this._a)/100,this},toHsv:function(){var e=f(this._r,this._g,this._b);return{h:360*e.h,s:e.s,v:e.v,a:this._a}},toHsvString:function(){var e=f(this._r,this._g,this._b),t=a(360*e.h),r=a(100*e.s),n=a(100*e.v);return 1==this._a?"hsv("+t+", "+r+"%, "+n+"%)":"hsva("+t+", "+r+"%, "+n+"%, "+this._roundA+")"},toHsl:function(){var e=s(this._r,this._g,this._b);return{h:360*e.h,s:e.s,l:e.l,a:this._a}},toHslString:function(){var e=s(this._r,this._g,this._b),t=a(360*e.h),r=a(100*e.s),n=a(100*e.l);return 1==this._a?"hsl("+t+", "+r+"%, "+n+"%)":"hsla("+t+", "+r+"%, "+n+"%, "+this._roundA+")"},toHex:function(e){return p(this._r,this._g,this._b,e)},toHexString:function(e){return"#"+this.toHex(e)},toHex8:function(e){return function(e,t,r,n,o){var i=[T(a(e).toString(16)),T(a(t).toString(16)),T(a(r).toString(16)),T(z(n))];if(o&&i[0].charAt(0)==i[0].charAt(1)&&i[1].charAt(0)==i[1].charAt(1)&&i[2].charAt(0)==i[2].charAt(1)&&i[3].charAt(0)==i[3].charAt(1))return i[0].charAt(0)+i[1].charAt(0)+i[2].charAt(0)+i[3].charAt(0);return i.join("")}(this._r,this._g,this._b,this._a,e)},toHex8String:function(e){return"#"+this.toHex8(e)},toRgb:function(){return{r:a(this._r),g:a(this._g),b:a(this._b),a:this._a}},toRgbString:function(){return 1==this._a?"rgb("+a(this._r)+", "+a(this._g)+", "+a(this._b)+")":"rgba("+a(this._r)+", "+a(this._g)+", "+a(this._b)+", "+this._roundA+")"},toPercentageRgb:function(){return{r:a(100*P(this._r,255))+"%",g:a(100*P(this._g,255))+"%",b:a(100*P(this._b,255))+"%",a:this._a}},toPercentageRgbString:function(){return 1==this._a?"rgb("+a(100*P(this._r,255))+"%, "+a(100*P(this._g,255))+"%, "+a(100*P(this._b,255))+"%)":"rgba("+a(100*P(this._r,255))+"%, "+a(100*P(this._g,255))+"%, "+a(100*P(this._b,255))+"%, "+this._roundA+")"},toName:function(){return 0===this._a?"transparent":!(this._a<1)&&(k[p(this._r,this._g,this._b,!0)]||!1)},toFilter:function(e){var t="#"+d(this._r,this._g,this._b,this._a),r=t,n=this._gradientType?"GradientType = 1, ":"";if(e){var o=c(e);r="#"+d(o._r,o._g,o._b,o._a)}return"progid:DXImageTransform.Microsoft.gradient("+n+"startColorstr="+t+",endColorstr="+r+")"},toString:function(e){var t=!!e;e=e||this._format;var r=!1,n=this._a<1&&this._a>=0;return t||!n||"hex"!==e&&"hex6"!==e&&"hex3"!==e&&"hex4"!==e&&"hex8"!==e&&"name"!==e?("rgb"===e&&(r=this.toRgbString()),"prgb"===e&&(r=this.toPercentageRgbString()),"hex"!==e&&"hex6"!==e||(r=this.toHexString()),"hex3"===e&&(r=this.toHexString(!0)),"hex4"===e&&(r=this.toHex8String(!0)),"hex8"===e&&(r=this.toHex8String()),"name"===e&&(r=this.toName()),"hsl"===e&&(r=this.toHslString()),"hsv"===e&&(r=this.toHsvString()),r||this.toHexString()):"name"===e&&0===this._a?this.toName():this.toRgbString()},clone:function(){return c(this.toString())},_applyModification:function(e,t){var r=e.apply(null,[this].concat([].slice.call(t)));return this._r=r._r,this._g=r._g,this._b=r._b,this.setAlpha(r._a),this},lighten:function(){return this._applyModification(y,arguments)},brighten:function(){return this._applyModification(g,arguments)},darken:function(){return this._applyModification(m,arguments)},desaturate:function(){return this._applyModification(h,arguments)},saturate:function(){return this._applyModification(v,arguments)},greyscale:function(){return this._applyModification(b,arguments)},spin:function(){return this._applyModification(w,arguments)},_applyCombination:function(e,t){return e.apply(null,[this].concat([].slice.call(t)))},analogous:function(){return this._applyCombination(S,arguments)},complement:function(){return this._applyCombination(_,arguments)},monochromatic:function(){return this._applyCombination(C,arguments)},splitcomplement:function(){return this._applyCombination(O,arguments)},triad:function(){return this._applyCombination(x,arguments)},tetrad:function(){return this._applyCombination(j,arguments)}},c.fromRatio=function(e,t){if("object"==typeof e){var r={};for(var n in e)e.hasOwnProperty(n)&&(r[n]="a"===n?e[n]:F(e[n]));e=r}return c(e,t)},c.equals=function(e,t){return!(!e||!t)&&c(e).toRgbString()==c(t).toRgbString()},c.random=function(){return c.fromRatio({r:l(),g:l(),b:l()})},c.mix=function(e,t,r){r=0===r?0:r||50;var n=c(e).toRgb(),o=c(t).toRgb(),a=r/100;return c({r:(o.r-n.r)*a+n.r,g:(o.g-n.g)*a+n.g,b:(o.b-n.b)*a+n.b,a:(o.a-n.a)*a+n.a})},c.readability=function(e,r){var n=c(e),o=c(r);return(t.max(n.getLuminance(),o.getLuminance())+.05)/(t.min(n.getLuminance(),o.getLuminance())+.05)},c.isReadable=function(e,t,r){var n,o,a=c.readability(e,t);switch(o=!1,(n=function(e){var t,r;t=((e=e||{level:"AA",size:"small"}).level||"AA").toUpperCase(),r=(e.size||"small").toLowerCase(),"AA"!==t&&"AAA"!==t&&(t="AA");"small"!==r&&"large"!==r&&(r="small");return{level:t,size:r}}(r)).level+n.size){case"AAsmall":case"AAAlarge":o=a>=4.5;break;case"AAlarge":o=a>=3;break;case"AAAsmall":o=a>=7}return o},c.mostReadable=function(e,t,r){var n,o,a,i,u=null,l=0;o=(r=r||{}).includeFallbackColors,a=r.level,i=r.size;for(var s=0;sl&&(l=n,u=c(t[s]));return c.isReadable(e,u,{level:a,size:i})||!o?u:(r.includeFallbackColors=!1,c.mostReadable(e,["#fff","#000"],r))};var E=c.names={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"0ff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000",blanchedalmond:"ffebcd",blue:"00f",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",burntsienna:"ea7e5d",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"0ff",darkblue:"00008b",darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgreen:"006400",darkgrey:"a9a9a9",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkslategrey:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dimgrey:"696969",dodgerblue:"1e90ff",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"f0f",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",green:"008000",greenyellow:"adff2f",grey:"808080",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgray:"d3d3d3",lightgreen:"90ee90",lightgrey:"d3d3d3",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslategray:"789",lightslategrey:"789",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"0f0",limegreen:"32cd32",linen:"faf0e6",magenta:"f0f",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370db",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"db7093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",rebeccapurple:"663399",red:"f00",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",slategray:"708090",slategrey:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",wheat:"f5deb3",white:"fff",whitesmoke:"f5f5f5",yellow:"ff0",yellowgreen:"9acd32"},k=c.hexNames=function(e){var t={};for(var r in e)e.hasOwnProperty(r)&&(t[e[r]]=r);return t}(E);function A(e){return e=parseFloat(e),(isNaN(e)||e<0||e>1)&&(e=1),e}function P(e,r){(function(e){return"string"==typeof e&&-1!=e.indexOf(".")&&1===parseFloat(e)})(e)&&(e="100%");var n=function(e){return"string"==typeof e&&-1!=e.indexOf("%")}(e);return e=i(r,u(0,parseFloat(e))),n&&(e=parseInt(e*r,10)/100),t.abs(e-r)<1e-6?1:e%r/parseFloat(r)}function M(e){return i(1,u(0,e))}function R(e){return parseInt(e,16)}function T(e){return 1==e.length?"0"+e:""+e}function F(e){return e<=1&&(e=100*e+"%"),e}function z(e){return t.round(255*parseFloat(e)).toString(16)}function L(e){return R(e)/255}var H,I,D,U=(I="[\\s|\\(]+("+(H="(?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?)")+")[,|\\s]+("+H+")[,|\\s]+("+H+")\\s*\\)?",D="[\\s|\\(]+("+H+")[,|\\s]+("+H+")[,|\\s]+("+H+")[,|\\s]+("+H+")\\s*\\)?",{CSS_UNIT:new RegExp(H),rgb:new RegExp("rgb"+I),rgba:new RegExp("rgba"+D),hsl:new RegExp("hsl"+I),hsla:new RegExp("hsla"+D),hsv:new RegExp("hsv"+I),hsva:new RegExp("hsva"+D),hex3:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,hex4:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex8:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/});function $(e){return!!U.CSS_UNIT.exec(e)}e.exports?e.exports=c:window.tinycolor=c}(Math)}),Ja=o(function(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.red=t.getContrastingColor=t.isValidHex=t.toState=t.simpleCheckForValidColor=void 0;var r=o(Ya),n=o(Ka);function o(e){return e&&e.__esModule?e:{default:e}}t.simpleCheckForValidColor=function(e){var t=0,n=0;return(0,r.default)(["r","g","b","a","h","s","l","v"],function(r){if(e[r]&&(t+=1,isNaN(e[r])||(n+=1),"s"===r||"l"===r)){/^\d+%$/.test(e[r])&&(n+=1)}}),t===n&&e};var a=t.toState=function(e,t){var r=e.hex?(0,n.default)(e.hex):(0,n.default)(e),o=r.toHsl(),a=r.toHsv(),i=r.toRgb(),u=r.toHex();return 0===o.s&&(o.h=t||0,a.h=t||0),{hsl:o,hex:"000000"===u&&0===i.a?"transparent":"#"+u,rgb:i,hsv:a,oldHue:e.h||t||o.h,source:e.source}};t.isValidHex=function(e){var t="#"===String(e).charAt(0)?1:0;return e.length!==4+t&&e.length<7+t&&(0,n.default)(e).isValid()},t.getContrastingColor=function(e){if(!e)return"#fff";var t=a(e);return"transparent"===t.hex?"rgba(0,0,0,0.4)":(299*t.rgb.r+587*t.rgb.g+114*t.rgb.b)/1e3>=128?"#000":"#fff"},t.red={hsl:{a:1,h:0,l:.5,s:1},hex:"#ff0000",rgb:{r:255,g:0,b:0,a:1},hsv:{h:0,s:1,v:1,a:1}};t.default=t});n(Ja);Ja.red,Ja.getContrastingColor,Ja.isValidHex,Ja.toState,Ja.simpleCheckForValidColor;var Ga=o(function(t,r){Object.defineProperty(r,"__esModule",{value:!0}),r.ColorWrap=void 0;var n=Object.assign||function(e){for(var t=1;t1&&void 0!==arguments[1]?arguments[1]:"span";return function(r){function n(){var e,t,r;u(this,n);for(var o=arguments.length,a=Array(o),i=0;i100&&(e.a=100),e.a/=100,t({h:i.h,s:i.s,l:i.l,a:e.a,source:"rgb"},n))};return n.default.createElement("div",{style:c.fields,className:"flexbox-fix"},n.default.createElement("div",{style:c.double},n.default.createElement(ei.EditableInput,{style:{input:c.input,label:c.label},label:"hex",value:u.replace("#",""),onChange:s})),n.default.createElement("div",{style:c.single},n.default.createElement(ei.EditableInput,{style:{input:c.input,label:c.label},label:"r",value:r.r,onChange:s,dragLabel:"true",dragMax:"255"})),n.default.createElement("div",{style:c.single},n.default.createElement(ei.EditableInput,{style:{input:c.input,label:c.label},label:"g",value:r.g,onChange:s,dragLabel:"true",dragMax:"255"})),n.default.createElement("div",{style:c.single},n.default.createElement(ei.EditableInput,{style:{input:c.input,label:c.label},label:"b",value:r.b,onChange:s,dragLabel:"true",dragMax:"255"})),n.default.createElement("div",{style:c.alpha},n.default.createElement(ei.EditableInput,{style:{input:c.input,label:c.label},label:"a",value:Math.round(100*r.a),onChange:s,dragLabel:"true",dragMax:"100"})))};r.default=u});n(ti);ti.SketchFields;var ri=o(function(t,r){Object.defineProperty(r,"__esModule",{value:!0}),r.SketchPresetColors=void 0;var n=Object.assign||function(e){for(var t=1;t